From b6a95f9970305c8883a27f6bd4e3ed85f43ee519 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 14:08:06 -0400 Subject: [PATCH 001/212] PoC Smart Escrows (#5340) * wasmedge in unittest * add WashVM.h and cpp * accountID comparison (vector) working * json decode tx and ledger object with two buffers working * wasm return a buffer working * add a failure test case to P2P3 * host function return ledger sqn * instruction gas and host function gas * basics * add scaffold * add amendment check * working PoC * get test working * fix clang-format * prototype #2 * p2p3 * [WIP] P4 * P5 * add calculateBaseFee * add FinishFunction preflight checks (+ tests) * additional reserve for sfFinishFunction * higher fees for EscrowFinish * rename amendment to SmartEscrow * make fee voting changes, add basic tests * clean up * clean up * clean up * more cleanup * add subscribe tests * add more tests * undo formatting * undo formatting * remove bad comment * more debugging statements * fix clang-format * fix rebase issues * fix more rebase issues * more rebase fixes * add source code for wasm * respond to comments * add const --------- Co-authored-by: Peng Wang --- CMakeLists.txt | 1 + cfg/rippled-example.cfg | 24 + cmake/RippledCore.cmake | 1 + conanfile.py | 3 + include/xrpl/protocol/Feature.h | 2 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/Indexes.h | 6 + include/xrpl/protocol/TER.h | 1 + include/xrpl/protocol/detail/features.macro | 2 +- .../xrpl/protocol/detail/ledger_entries.macro | 7 + include/xrpl/protocol/detail/sfields.macro | 5 +- .../xrpl/protocol/detail/transactions.macro | 8 +- include/xrpl/protocol/jss.h | 2 + src/libxrpl/protocol/STValidation.cpp | 3 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/Escrow_test.cpp | 368 +- src/test/app/FeeVote_test.cpp | 41 +- src/test/app/PseudoTx_test.cpp | 8 +- src/test/app/Wasm_test.cpp | 4752 +++++++++++++++++ src/test/jtx/TestHelpers.h | 27 + src/test/jtx/impl/envconfig.cpp | 2 + src/test/rpc/Subscribe_test.cpp | 20 +- src/xrpld/app/ledger/Ledger.cpp | 42 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 78 +- src/xrpld/app/misc/NetworkOPs.cpp | 37 + src/xrpld/app/misc/WasmVM.cpp | 592 ++ src/xrpld/app/misc/WasmVM.h | 97 + src/xrpld/app/tx/detail/Change.cpp | 17 + src/xrpld/app/tx/detail/Escrow.cpp | 177 +- src/xrpld/app/tx/detail/Escrow.h | 3 + src/xrpld/app/tx/detail/Transactor.cpp | 37 +- src/xrpld/core/Config.h | 6 + src/xrpld/core/detail/Config.cpp | 4 + 33 files changed, 6338 insertions(+), 39 deletions(-) create mode 100644 src/test/app/Wasm_test.cpp create mode 100644 src/xrpld/app/misc/WasmVM.cpp create mode 100644 src/xrpld/app/misc/WasmVM.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 03dba51d0c5..28cfd2322a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,6 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) +find_package(wasmedge REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index ee9fdbd2744..d465994a6b9 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1248,6 +1248,30 @@ # Example: # owner_reserve = 2000000 # 2 XRP # +# extension_compute_limit = +# +# The extension compute limit is the maximum amount of gas that can be +# consumed by a single transaction. The gas limit is used to prevent +# transactions from consuming too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# +# extension_size_limit = +# +# The extension size limit is the maximum size of a WASM extension in +# bytes. The size limit is used to prevent extensions from consuming +# too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 2000000 # 2 million gas +# #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index fc0576872a5..d4ff75434ea 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,6 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> + wasmedge::wasmedge ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d4513068fb5..ec39608d3fd 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout import re + class Xrpl(ConanFile): name = 'xrpl' @@ -32,6 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', + 'wasmedge/0.14.1', ] tool_requires = [ @@ -125,6 +127,7 @@ def layout(self): self.folders.generators = 'build/generators' generators = 'CMakeDeps' + def generate(self): tc = CMakeToolchain(self) tc.variables['tests'] = self.options.tests diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index 1c476df617f..b6477baa02d 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -80,7 +80,7 @@ namespace detail { // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 88; +static constexpr std::size_t numFeatures = 89; /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index 4393f1a1d9c..a89bd4e4863 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -34,6 +34,9 @@ struct Fees XRPAmount base{0}; // Reference tx cost (drops) XRPAmount reserve{0}; // Reserve base (drops) XRPAmount increment{0}; // Reserve increment (drops) + std::uint32_t extensionComputeLimit{ + 0}; // Extension compute limit (instructions) + std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/Indexes.h b/include/xrpl/protocol/Indexes.h index bbed5395927..a7c184e81c7 100644 --- a/include/xrpl/protocol/Indexes.h +++ b/include/xrpl/protocol/Indexes.h @@ -230,6 +230,12 @@ page(Keylet const& root, std::uint64_t index = 0) noexcept Keylet escrow(AccountID const& src, std::uint32_t seq) noexcept; +inline Keylet +escrow(uint256 const& key) noexcept +{ + return {ltESCROW, key}; +} + /** A PaymentChannel */ Keylet payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 317e9c2c978..01bf4669aa7 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -344,6 +344,7 @@ enum TECcodes : TERUnderlyingType { tecARRAY_TOO_LARGE = 191, tecLOCKED = 192, tecBAD_CREDENTIALS = 193, + tecWASM_REJECTED = 194, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 7b120c0b8d2..103dc34243f 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -29,7 +29,7 @@ // If you add an amendment here, then do not forget to increment `numFeatures` // in include/xrpl/protocol/Feature.h. -// Check flags in Credential transactions +XRPL_FEATURE(SmartEscrow, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo) XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo) XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 5a652baf4f7..2d4a3453eaa 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -315,6 +315,11 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + + // New fields + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, })) @@ -344,6 +349,8 @@ LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({ {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, {sfSourceTag, soeOPTIONAL}, {sfDestinationTag, soeOPTIONAL}, {sfOwnerNode, soeREQUIRED}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 3217bab9134..42a706c4de1 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -112,6 +112,8 @@ TYPED_SFIELD(sfEmitGeneration, UINT32, 46) TYPED_SFIELD(sfVoteWeight, UINT32, 48) TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) +TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) +TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) @@ -223,7 +225,7 @@ TYPED_SFIELD(sfBaseFeeDrops, AMOUNT, 22) TYPED_SFIELD(sfReserveBaseDrops, AMOUNT, 23) TYPED_SFIELD(sfReserveIncrementDrops, AMOUNT, 24) -// currency amount (AMM) +// currency amount (more) TYPED_SFIELD(sfLPTokenOut, AMOUNT, 25) TYPED_SFIELD(sfLPTokenIn, AMOUNT, 26) TYPED_SFIELD(sfEPrice, AMOUNT, 27) @@ -265,6 +267,7 @@ TYPED_SFIELD(sfAssetClass, VL, 28) TYPED_SFIELD(sfProvider, VL, 29) TYPED_SFIELD(sfMPTokenMetadata, VL, 30) TYPED_SFIELD(sfCredentialType, VL, 31) +TYPED_SFIELD(sfFinishFunction, VL, 32) // account (common) TYPED_SFIELD(sfAccount, ACCOUNT, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index dd3ac42325d..19c31d439b5 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -42,12 +42,14 @@ TRANSACTION(ttPAYMENT, 0, Payment, ({ /** This transaction type creates an escrow object. */ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, ({ - {sfDestination, soeREQUIRED}, {sfAmount, soeREQUIRED}, + {sfDestination, soeREQUIRED}, + {sfDestinationTag, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCancelAfter, soeOPTIONAL}, {sfFinishAfter, soeOPTIONAL}, - {sfDestinationTag, soeOPTIONAL}, + {sfFinishFunction, soeOPTIONAL}, + {sfData, soeOPTIONAL}, })) /** This transaction type completes an existing escrow. */ @@ -488,6 +490,8 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 483b69a962f..fa34cf800b7 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -265,6 +265,8 @@ JSS(expected_date_UTC); // out: any (warnings) JSS(expected_ledger_size); // out: TxQ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info +JSS(extension_compute); // out: NetworkOps +JSS(extension_size); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 16f0c288796..f14fce43219 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -66,6 +66,9 @@ STValidation::validationFormat() {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // featureSmartEscrow + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 815b27c0018..dc0bdb4a591 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -117,6 +117,7 @@ transResults() MAKE_ERROR(tecARRAY_TOO_LARGE, "Array is too large."), MAKE_ERROR(tecLOCKED, "Fund is locked."), MAKE_ERROR(tecBAD_CREDENTIALS, "Bad credentials."), + MAKE_ERROR(tecWASM_REJECTED, "The custom WASM code that was run rejected your transaction."), MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."), MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 714fc7734d9..123b6548358 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1519,7 +1519,7 @@ struct Escrow_test : public beast::unit_test::suite Account const alice{"alice"}; Account const bob{"bob"}; Account const carol{"carol"}; - Account const dillon{"dillon "}; + Account const dillon{"dillon"}; Account const zelda{"zelda"}; const char credType[] = "abcde"; @@ -1656,6 +1656,370 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testFinishFunctionPreflight() + { + testcase("Test preflight checks involving FinishFunction"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + auto escrowCreate = escrow(alice, carol, XRP(1000)); + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temDISABLED)); + env.close(); + } + + Env env(*this); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(1000)); + + // Success situations + { + // FinishFunction + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + CancelAfter + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + + // Failure situations (i.e. all other combinations) + { + // only FinishFunction + env(escrowCreate, + finish_function(wasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction 0 length + env(escrowCreate, + finish_function(""), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + // { + // // FinishFunction > max length + // std::string longWasmHex = "00"; + // // TODO: fix to use the config setting + // // TODO: make this test more efficient + // // uncomment when that's done + // for (int i = 0; i < 4294967295; i++) + // { + // longWasmHex += "11"; + // } + // env(escrowCreate, + // finish_function(longWasmHex), + // cancel_time(env.now() + 100s), + // fee(txnFees), + // ter(temMALFORMED)); + // env.close(); + // } + } + + void + testFinishFunction() + { + testcase("PoC escrow function"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::get_ledger_sqn() >= 5} + // } + static auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + Condition + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + condition(cb1), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // no fulfillment provided, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function fails + env(finish(carol, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // no fulfillment provided, function succeeds + env(finish(alice, alice, seq), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // wrong fulfillment provided, function succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb2), + fee(txnFees), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function succeeds, tx succeeds + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb1), + fee(txnFees), + ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + auto const ts = env.now() + 97s; + env(escrowCreate, + finish_function(wasmHex), + finish_time(ts), + cancel_time(env.now() + 1000s), + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tecNO_PERMISSION)); + env.close(); + // finish time hasn't passed, function succeeds + for (; env.now() < ts; env.close()) + env(finish(carol, alice, seq), + fee(txnFees + 2), + ter(tecNO_PERMISSION)); + + env(finish(carol, alice, seq), + fee(txnFees + 1), + ter(tesSUCCESS)); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + + { + // FinishFunction + FinishAfter #2 + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 2s), + cancel_time(env.now() + 100s), + fee(txnFees)); + // Don't close the ledger here + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // finish time has passed, function fails + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + // finish time has passed, function succeeds, tx succeeds + env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -1671,6 +2035,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); + testFinishFunctionPreflight(); + testFinishFunction(); } }; diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 289ce2a713e..a49dbb0bcaf 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -37,36 +37,56 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = 50", "account_reserve = 1234567", - "owner_reserve = 1234"}); + "owner_reserve = 1234", + "extension_compute_limit = 100", + "extension_size_limit = 200"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); + BEAST_EXPECT(setup.extension_compute_limit == 100); + BEAST_EXPECT(setup.extension_size_limit == 200); } { Section config; config.append( {"reference_fee = blah", "account_reserve = yada", - "owner_reserve = foo"}); + "owner_reserve = foo", + "extension_compute_limit = bar", + "extension_size_limit = baz"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } { Section config; config.append( {"reference_fee = -50", "account_reserve = -1234567", - "owner_reserve = -1234"}); + "owner_reserve = -1234", + "extension_compute_limit = -100", + "extension_size_limit = -200"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -74,6 +94,11 @@ class FeeVote_test : public beast::unit_test::suite setup.account_reserve == static_cast(-1234567)); BEAST_EXPECT( setup.owner_reserve == static_cast(-1234)); + BEAST_EXPECT( + setup.extension_compute_limit == + static_cast(-100)); + BEAST_EXPECT( + setup.extension_size_limit == static_cast(-200)); } { const auto big64 = std::to_string( @@ -84,12 +109,20 @@ class FeeVote_test : public beast::unit_test::suite config.append( {"reference_fee = " + big64, "account_reserve = " + big64, - "owner_reserve = " + big64}); + "owner_reserve = " + big64, + "extension_compute_limit = " + big64, + "extension_size_limit = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index a04316cbd7b..55622e49237 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -48,6 +48,11 @@ struct PseudoTx_test : public beast::unit_test::suite obj[sfReserveIncrement] = 0; obj[sfReferenceFeeUnits] = 0; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = 0; + obj[sfExtensionSizeLimit] = 0; + } })); res.emplace_back(STTx(ttAMENDMENT, [&](auto& obj) { @@ -114,9 +119,10 @@ struct PseudoTx_test : public beast::unit_test::suite { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; + testPrevented(all - featureXRPFees - featureSmartEscrow); testPrevented(all - featureXRPFees); + testPrevented(all - featureSmartEscrow); testPrevented(all); testAllowed(); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp new file mode 100644 index 00000000000..31e8007c72c --- /dev/null +++ b/src/test/app/Wasm_test.cpp @@ -0,0 +1,4752 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +#include + +#include + +namespace ripple { +namespace test { + +/* Host function body definition. */ +WasmEdge_Result +Add(void* Data, + const WasmEdge_CallingFrameContext* CallFrameCxt, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + int32_t Val1 = WasmEdge_ValueGetI32(In[0]); + int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + // printf("Host function \"Add\": %d + %d\n", Val1, Val2); + Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); + return WasmEdge_Result_Success; +} + +void +invokeAdd() +{ + /* Create the VM context. */ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + // clang-format off + /* The WASM module buffer. */ + uint8_t WASM[] = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + + /* Create the module instance. */ + WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); + WasmEdge_ModuleInstanceContext* HostModCxt = + WasmEdge_ModuleInstanceCreate(ExportName); + WasmEdge_ValType ParamList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); + WasmEdge_FunctionTypeDelete(HostFType); + WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); + WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); + + /* The parameters and returns arrays. */ + WasmEdge_Value Params[2] = { + WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; + WasmEdge_Value Returns[1]; + /* Function name. */ + WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); + /* Run the WASM function from buffer. */ + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); + + if (WasmEdge_ResultOK(Res)) + { + // printf("invokeAdd get the result: %d\n", + // WasmEdge_ValueGetI32(Returns[0])); + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + /* Resources deallocations. */ + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + WasmEdge_ModuleInstanceDelete(HostModCxt); +} + +struct Wasm_test : public beast::unit_test::suite +{ + void + testWasmtimeLib() + { + testcase("wasmtime lib test"); + invokeAdd(); + BEAST_EXPECT(true); + } + + void + testEscrowWasmP0() + { + testcase("escrow wasm P0 test"); + auto wasmHex = + "0061736d0100000001090260017f017f6000000305040001010004050170010101" + "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" + "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" + "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" + "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" + "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" + "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" + "c0010970726f64756365727302086c616e67756167650204527573740003433131" + "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" + "746c79202863326637346333663920323032342d30392d30392905636c616e675f" + "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" + "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" + "376139366634333031643064383634376235613432373630616530632900560f74" + "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" + "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" + "63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + + re = runEscrowWasm(wasm, funcName, 11); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + + void + testBadWasm() + { + testcase("bad wasm test"); + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + auto re = runEscrowWasm(wasm, funcName, 15); + BEAST_EXPECT(re.error()); + } + + void + testEscrowWasmP1() + { + testcase("escrow wasm P1 test"); + auto wasmHex = + "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" + "00030c0b01010200000000000003000405017001030305030100110619037f0141" + "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" + "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" + "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" + "200010012200450d0120000f0b230041206b220024002000410036021820004101" + "36020c200041b480c00036020820004204370210200041086a41d080c000100500" + "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" + "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" + "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" + "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" + "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" + "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" + "0245044041002100410021010c040b4100210020054100411920074101766b2007" + "411f461b7421044100210103400240200228020441787122062005490d00200620" + "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" + "021422062000200620022004411d764104716a41106a2802002202471b20002006" + "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" + "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" + "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" + "000b20012000410372360204200020016a220020002802044101723602040c060b" + "024041022000742203410020036b72200120007471682206410374220041a483c0" + "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" + "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" + "360204200120056a2206200020056b2204410172360204200020016a2004360200" + "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" + "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" + "200220057236020020000c010b20002802080b2102200020033602082002200336" + "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" + "043602000c050b200068410274419482c0006a280200220128020441787120056b" + "2103200121020240034002400240200128021022000d00200128021422000d0020" + "022802182107024002402002200228020c22004604402002411441102002280214" + "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" + "013602080c010b200241146a200241106a20001b21040340200421062001220041" + "146a200041106a200028021422011b210420004114411020011b6a28020022010d" + "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" + "28020047044020074110411420072802102002461b6a20003602002000450d040c" + "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" + "77713602000c030b200028020441787120056b22012003200120034922011b2103" + "2000200220011b2102200021010c010b0b20002007360218200228021022010440" + "20002001360210200120003602180b20022802142201450d002000200136021420" + "0120003602180b02400240200341104f044020022005410372360204200220056a" + "22062003410172360204200320066a200336020041b485c0002802002204450d01" + "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" + "2205410120044103767422047145044041ac85c000200420057236020020000c01" + "0b20002802080b2104200020013602082004200136020c2001200036020c200120" + "043602080c010b2002200320056a2200410372360204200020026a220020002802" + "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" + "41086a0f0b20002001724504404100210141022007742200410020006b72200871" + "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" + "20012000280204417871220420056b220620034922071b21082000280210220245" + "0440200028021421020b20012008200420054922001b210120032006200320071b" + "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" + "200020056b4f710d0020012802182107024002402001200128020c220046044020" + "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" + "2202200036020c200020023602080c010b200141146a200141106a20001b210403" + "40200421062002220041146a200041106a200028021422021b2104200041144110" + "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" + "28021c410274419482c0006a220228020047044020074110411420072802102001" + "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" + "b085c000280200417e200128021c77713602000c010b2000200736021820012802" + "102202044020002002360210200220003602180b20012802142202450d00200020" + "02360214200220003602180b0240200341104f0440200120054103723602042001" + "20056a22022003410172360204200220036a200336020020034180024f04402002" + "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" + "410120034103767422037145044041ac85c000200320047236020020000c010b20" + "002802080b2103200020023602082003200236020c2002200036020c2002200336" + "02080c010b2001200320056a2200410372360204200020016a2200200028020441" + "01723602040b0c010b024002400240024002400240200541b485c0002802002201" + "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" + "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" + "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" + "02002201200020002001491b3602000240024041c085c000280200220304404194" + "83c0002100034020002802002201200028020422066a2002460d02200028020822" + "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" + "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" + "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" + "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" + "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" + "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" + "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" + "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" + "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" + "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" + "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" + "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" + "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" + "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" + "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" + "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" + "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" + "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" + "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" + "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" + "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" + "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" + "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" + "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" + "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" + "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" + "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" + "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" + "85c000200441286b220036020020022000410172360204200020026a4128360204" + "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" + "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" + "20046a2101419483c0002100024002400340200120002802002206470440200028" + "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" + "0028020022014f04402003200120002802046a2206490d010b200028020821000c" + "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" + "0172360204200020026a412836020441cc85c00041808080013602002003200641" + "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" + "002109200141106a419c83c00029020037020020012009370208419883c0002004" + "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" + "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" + "012003460d0720012001280204417e713602042003200120036b22004101723602" + "042001200036020020004180024f04402003200010070c080b200041f8017141a4" + "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" + "ac85c000200020027236020020010c010b20012802080b21002001200336020820" + "00200336020c2003200136020c200320003602080c070b20002002360200200020" + "0028020420046a360204200220054103723602042006410f6a41787141086b2201" + "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" + "460d04200128020422054103714101460440200120054178712200100820002001" + "6a22012802042105200020036a21030b20012005417e7136020420042003410172" + "360204200320046a200336020020034180024f04402004200310070c060b200341" + "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" + "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" + "043602082003200436020c2004200036020c200420033602080c050b41b885c000" + "200020056b220136020041c085c00041c085c000280200220020056a2202360200" + "2002200141017236020420002005410372360204200041086a21000c060b41bc85" + "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" + "85c000410036020020002001410372360204200020016a22012001280204410172" + "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" + "2002410172360204200020016a2002360200200020054103723602040b20004108" + "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" + "71220141086b220236020041b885c00041b885c00028020020046a220320002001" + "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" + "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" + "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" + "0041b485c00041b485c00028020020036a22003602002004200041017236020420" + "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" + "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" + "20056a22023602002002200141017236020420002005410372360204200041086a" + "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" + "402007410020076b41037122026a21062002044020072103418080c00021050340" + "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" + "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" + "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" + "6b411871210820052802002105034020062005200c762004280200220520087472" + "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" + "20022104034020062004280200360200200441046a2104200641046a2206200349" + "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" + "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" + "4122460440200021032007210241002105412221080240034020032d0000220920" + "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" + "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" + "0b000bd20601047f0240200041046b280200220241787122034104410820024103" + "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" + "0041046b280200220341787122006a21020240024020034101710d002003410271" + "450d012001280200220320006a2100200120036b220141bc85c000280200460440" + "20022802044103714103470d0141b485c000200036020020022002280204417e71" + "36020420012000410172360204200220003602000c020b2001200310080b024002" + "4002400240024020022802042203410271450440200241c085c000280200460d02" + "200241bc85c000280200460d0320022003417871220210082001200020026a2200" + "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" + "0020003602000c060b20022003417e713602042001200041017236020420002001" + "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" + "c00028020041016b220036020020000d04419c83c0002802002200044003402001" + "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" + "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" + "003602002001200041017236020441bc85c000280200200146044041b485c00041" + "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" + "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" + "00210103402002200128020022054f04402002200520012802046a490d040b2001" + "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" + "20006a220036020020012000410172360204200020016a20003602000c020b2000" + "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" + "007145044041ac85c000200020037236020020020c010b20022802080b21002002" + "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" + "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" + "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" + "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" + "7f230041206b220224002002410036021020024101360204200242043702082002" + "412e36021c200220003602182002200241186a360200200220011005000ba40201" + "037f230041206b22022400200241106a2203200041106a29020037030020024108" + "6a2204200041086a290200370300200241013b011c200220013602182002200029" + "0200370300230041206b2200240020022802182101200041106a20032902003703" + "00200041086a20042902003703002000200236021c200020013602182000200229" + "020037030041002102230041106b22012400200028020c21030240024002400240" + "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" + "2802042102200328020021030c010b20014180808080783602002001200036020c" + "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" + "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" + "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" + "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" + "2002410274419482c0006a21044101200274220341b085c0002802007145044020" + "042000360200200020043602182000200036020c2000200036020841b085c00041" + "b085c0002802002003723602000f0b024002402001200428020022032802044178" + "71460440200321020c010b20014100411920024101766b2002411f461b74210503" + "4020032005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c200220" + "00360208200041003602182000200236020c200020013602080f0b200420003602" + "00200020033602182000200036020c200020003602080bf10201047f200028020c" + "21020240024020014180024f044020002802182103024002402000200246044020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" + "2201200236020c200220013602080c010b200041146a200041106a20021b210403" + "40200421052001220241146a200241106a200228021422011b2104200241144110" + "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" + "0274419482c0006a220128020047044020034110411420032802102000461b6a20" + "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" + "280200417e200028021c77713602000c020b200028020822002002470440200020" + "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" + "77713602000f0b2002200336021820002802102201044020022001360210200120" + "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" + "017f230041106b22032400419082c000419082c000280200220441016a36020002" + "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" + "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" + "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" + "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" + "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" + "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" + "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" + "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" + "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" + "64006000100029000000a804000009000000617373657274696f6e206661696c65" + "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d62790105727573746325312e38" + "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" + "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("check_accountID"); + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; + std::vector data(str.begin(), str.end()); + auto re = runEscrowWasm(wasm, funcName, data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP2P3() + { + testcase("escrow wasm P2 & P3 test"); + auto wasmHex = + "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" + "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" + "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" + "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" + "616004030305060001070808080809040702000000040403030304030500020306" + "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" + "0903020201020200000405000203030402020205100b0303000005030101010104" + "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" + "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" + "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" + "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" + "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" + "360228200320023602242003200136022020034180013a002c2003410036021c20" + "03428080808010370214200341c8006a200341146a108180808000024002400240" + "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" + "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" + "2903483703300240024020032802282202200328022422064f0d00200328022021" + "070340200720026a2d000041776a220141174b0d02410120017441938080047145" + "0d022006200241016a2202470d000b200320063602280b20002003290330370300" + "200041106a2004290300370300200041086a200529030037030020032802142202" + "450d04200328021820021082808080000c040b20032002360228200341086a2007" + "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" + "200328020c21012003280208210641141084808080002202450d01200220063602" + "0c2002411636020020002002360204200041063a00002002200136021020034130" + "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" + "032802142202450d00200328021820021082808080000b200341e0006a24808080" + "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" + "210302400240024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f0006a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" + "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" + "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241386a200320052005200441016a220420052004491b" + "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" + "84808080002207450d1f2007200836020c20074105360200200720043602100c08" + "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" + "c080001a200228024c21042002280248210841141084808080002207450d1e2007" + "200836020c20074107360200200720043602100c070b20022902dc02210e200228" + "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228024421042002280240210841141084808080002207450d1c2007200836020c" + "20074115360200200720043602100c050b200241b0016a20011081808080000240" + "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" + "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" + "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" + "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" + "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" + "000120042007360204200441106a2003290300370300200441036a20052d00003a" + "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" + "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" + "0000200420083602100c180b200628020021030b200241306a2003200520052004" + "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" + "042002280230210841141084808080002207450d172007200836020c2007410236" + "0200200720043602100b200241d8026a109180808000024020022802d802220445" + "0d002009200441186c1082808080000b200128020c210320012802142104200128" + "0210210541062106410121090b200120012d001841016a3a001802400240200420" + "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" + "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" + "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28021421082002280210210541141084808080002204450d1d200441163602000c" + "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" + "41776a220841174b0d024101200874419380800471450d022001200441016a2204" + "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" + "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" + "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" + "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" + "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" + "210541141084808080002204450d1a200441153602000c040b200241206a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228022421082002280220210541141084808080002204450d1920044116360200" + "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" + "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" + "001a200228021c21082002280218210541141084808080002204450d1620044102" + "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" + "01200220073602b401200220063a00b001024020090d00200241063a0078200220" + "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" + "200241c8016a1092808080000c110b200241086a20032005200520042005200449" + "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" + "1084808080002204450d142004200136020c200441183602002000200436020420" + "0041063a0000200420083602100c130b200141003602082001200441016a360214" + "200241b0016a2006200110938080800020022802b40121080240024020022802b0" + "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" + "948080800020022d00784106460d1320002002290378370300200041106a200241" + "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" + "150b41002101024020044100480d00024020040d0041012101410021050c030b41" + "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" + "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" + "086a220320012008200410df808080003602002002200536027c200241033a0078" + "2002200436028401200041106a200241f8006a41106a290300370300200041086a" + "2003290300370300200020022903783703000c120b2001200441016a3602142002" + "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" + "20024190016a109680808000024020022d00784106460d00200020022903783703" + "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" + "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" + "200020043602040c120b2000200228029801360204200041063a00000c110b0240" + "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" + "14200141bb80c0800041031086808080002204450d02200041063a000020002004" + "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" + "0a490d042002200320052005200441016a220420052004491b1083808080004100" + "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" + "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" + "200241003a007820002002290378370300200041086a200241f8006a41086a2903" + "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" + "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" + "00200020043602040c0e0b20024181023b01782000200229037837030020004108" + "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" + "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" + "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" + "02290378370300200041086a200241f8006a41086a290300370300200041106a20" + "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" + "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" + "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" + "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" + "21070c070b20022802d401220441003602082004200428021441016a3602142002" + "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" + "460d06200241d8026a200720022802b801109880808000024020022802d8022204" + "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" + "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" + "41003602dc01200220053602e002200220083602dc02200220043602d802200241" + "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" + "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" + "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" + "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" + "024020022d00b101450d0020022802d40122044100360208200420042802144101" + "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" + "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" + "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" + "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" + "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" + "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" + "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" + "290300220f370300200220022903b00122103703d802200541106a200e37020020" + "0541086a200f3702002005201037020020024180026a41086a200c290200370300" + "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" + "186a280200360200200220022902b00137038002200220033602a4022002200736" + "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" + "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" + "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" + "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" + "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" + "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" + "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" + "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" + "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" + "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" + "200820041082808080000b200241dc016a109b808080000b41062106410121090b" + "200120012d001841016a3a0018200128020c210302400240024020012802142204" + "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" + "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" + "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" + "21040c050b200241e8006a200320052005200441016a220420052004491b108380" + "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" + "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" + "200441016a220436021420052004470d000b200521040b200241e0006a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28026421082002280260210541141084808080002204450d072004200536020c20" + "044103360200200420083602100c010b200241d8006a200320052005200441016a" + "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" + "280258210541141084808080002204450d062004200536020c2004411636020020" + "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" + "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" + "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" + "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" + "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" + "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" + "80000c010b200241d0006a200320052005200420052004491b1083808080004100" + "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" + "0d042004200136020c2004411836020020002004360204200041063a0000200420" + "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" + "200041063a0000200020043602040c010b20002002290378370300200041106a20" + "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" + "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" + "002202417871220341044108200241037122021b20016a490d0002402002450d00" + "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" + "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" + "0301057f02400240024002400240024020022003490d0041012104410021052003" + "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" + "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" + "418a94a8d000736b20077241808182847871418081828478460d00034020062001" + "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" + "034109490d0103400240024020074108480d004180828408200120076a22064178" + "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" + "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" + "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" + "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" + "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" + "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" + "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" + "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" + "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" + "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" + "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" + "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" + "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" + "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" + "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" + "0041002100410021060c040b4100210020024100411920054101766b2005411f46" + "1b74210741002106034002402001220128020441787122082002490d0020082002" + "6b220820034f0d00200821032001210620080d004100210320012106200121000c" + "060b200128021422082000200820012007411d764104716a41106a280200220147" + "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" + "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" + "0022032802082206460d002006200236020c200220063602080c010b4100200141" + "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" + "0204410172360204200341086a0f0b024002402000200374410220037422004100" + "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" + "0022002802082207460d002007200636020c200620073602080c010b4100200141" + "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" + "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" + "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" + "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" + "d2c08000200621010c010b200628020821010b200620033602082001200336020c" + "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" + "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" + "787120026b2103200621010240024003400240200628021022000d002006280214" + "22000d0020012802182105024002400240200128020c22002001470d0020014114" + "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" + "0036020c200020063602080c010b200141146a200141106a20001b210703402007" + "21082006220041146a200041106a200028021422061b210720004114411020061b" + "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" + "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" + "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" + "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" + "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" + "360218024020012802102206450d0020002006360210200620003602180b200128" + "02142206450d0020002006360214200620003602180b0240024002402003411049" + "0d0020012002410372360204200120026a22022003410172360204200220036a20" + "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" + "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" + "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" + "0b200620003602082007200036020c2000200636020c200020073602080c010b20" + "01200320026a2200410372360204200120006a220020002802044101723602040c" + "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" + "4020002006720d004100210641022005742200410020006b722004712200450d03" + "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" + "280204417871220120026b220820034922051b2104200120024921072008200320" + "051b21080240200028021022010d00200028021421010b2006200420071b210620" + "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" + "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" + "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" + "410021000c020b20062802082201200036020c200020013602080c010b20064114" + "6a200641106a20001b21070340200721082001220041146a200041106a20002802" + "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" + "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" + "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" + "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" + "c080000c010b20002005360218024020062802102201450d002000200136021020" + "0120003602180b20062802142201450d0020002001360214200120003602180b02" + "40024020034110490d0020062002410372360204200620026a2200200341017236" + "0204200020036a200336020002402003418002490d002000200310d7808080000c" + "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" + "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" + "200228020821030b200220003602082003200036020c2000200236020c20002003" + "3602080c010b2006200320026a2200410372360204200620006a22002000280204" + "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" + "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" + "200241af80046a220641107640002203417f4622070d0720034110742201450d07" + "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" + "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" + "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" + "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" + "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" + "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" + "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" + "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" + "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" + "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" + "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" + "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" + "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" + "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" + "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" + "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" + "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" + "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" + "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" + "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" + "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" + "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" + "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" + "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" + "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" + "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" + "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" + "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" + "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" + "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" + "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" + "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" + "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" + "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" + "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" + "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" + "003602f0d2c0800020012000410172360204200120006a41283602044100418080" + "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" + "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" + "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" + "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" + "02402000280200220620034b0d002003200620002802046a2206490d020b200028" + "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" + "800020012000410172360204200120006a412836020441004180808001360284d3" + "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" + "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" + "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" + "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" + "200041046a22002006490d000b20072003460d0720072007280204417e71360204" + "2003200720036b22004101723602042007200036020002402000418002490d0020" + "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" + "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" + "c08000200621000c010b200628020821000b200620033602082000200336020c20" + "03200636020c200320003602080c070b200020013602002000200028020420086a" + "360204200120024103723602042007410f6a41787141786a2206200120026a2200" + "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" + "200628020422024103714101470d0020062002417871220210a880808000200220" + "036a2103200620026a220628020421020b20062002417e71360204200020034101" + "72360204200020036a200336020002402003418002490d002000200310d7808080" + "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" + "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" + "010b200228020821030b200220003602082003200036020c2000200236020c2000" + "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" + "8000220020026a22063602f8d2c080002006200341017236020420002002410372" + "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" + "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" + "410372360204200320006a220020002802044101723602040c010b410020063602" + "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" + "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" + "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" + "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" + "d2c0800020062001410172360204200020036a4128360204410041808080013602" + "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" + "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" + "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" + "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" + "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" + "0020026a22063602f8d2c080002006200341017236020420002002410372360204" + "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" + "02000b200041046a109b808080000c020b20002802042201450d01200028020820" + "011082808080000f0b200041046a10918080800020002802042201450d00200028" + "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" + "80808080002000280214220420002802102205200420054b1b2106200028020c21" + "0702400240024002400340024020020d00410021040c050b20062004460d012000" + "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" + "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" + "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" + "8080002204450d01200441093602000c020b200320072005200610838080800041" + "002d00c0cfc080001a200328020421012003280200210241141084808080002204" + "450d00200441053602000c010b000b2004200236020c200420013602100b200341" + "106a24808080800020040b970202027f027e23808080800041106b220424808080" + "8000024002400240024002400240024002402001280214220520012802104f0d00" + "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" + "020b2002450d02420121060c050b20042001200220034100108880808000200428" + "02000d020c030b200420012002200341001089808080002004280200450d022000" + "2004280204360208200042033703000c040b420021060240420020037d22074200" + "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" + "020b20002004280204360208200042033703000c020b2004290308210342002106" + "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" + "23808080800041106b220524808080800020012001280214220641016a22073602" + "140240024002402007200128021022084f0d00200720086b2109200128020c210a" + "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" + "410a490d00024020060d002005200a20082008200741016a220720082007491b10" + "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" + "808080002207450d072007200c36020c2007410d36020020002007360204200041" + "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" + "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" + "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" + "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" + "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" + "20002001200220032007108b808080000c010b200541086a200128020c20082008" + "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" + "0c21062005280208210c41141084808080002207450d012007200c36020c200741" + "053602002000200736020420004101360200200720063602100b200541106a2480" + "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" + "0620012001280214220741016a220836021402402008200128021022094f0d0041" + "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" + "2001200741026a22083602140b200128020c210a02400240024002400240024002" + "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" + "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" + "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" + "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" + "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" + "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" + "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" + "042007200836020c20074105360200200020073602042000410136020020072001" + "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" + "020421012005280200210841141084808080002207450d032007200836020c2007" + "410d3602002000200736020420004101360200200720013602100c040b20042008" + "6a2207411f7541808080807873200720084100482007200448731b21070b200020" + "01200220032007108b808080000c020b2000200120022003502006108c80808000" + "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" + "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" + "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" + "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" + "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" + "22052480808080002003ba2106024002400240024002400240024020042004411f" + "7522077320076b220741b502490d0003402006440000000000000000610d062004" + "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" + "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" + "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" + "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" + "84808080002204450d022004200136020c2004410e360200200020043602042004" + "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" + "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" + "28020c21072005280208210141141084808080002204450d012004200136020c20" + "04410e36020020002004360204200420073602100b410121040c020b000b200020" + "0620069a20021b390308410021040b20002004360200200541106a248080808000" + "0b840201027f23808080800041106b220524808080800002400240024002402004" + "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" + "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" + "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" + "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" + "1084808080002204450d002004200336020c2004410e3602002000200436020420" + "042001360210410121040c020b000b200044000000000000000044000000000000" + "008020021b390308410021040b20002004360200200541106a2480808080000b95" + "0502067f017e23808080800041306b2203248080808000200128020c2104024002" + "40024002400240024020012802142205200128021022064f0d002001200541016a" + "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" + "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" + "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" + "21072003280218210441141084808080002201450d022001200436020c20014105" + "3602002000200136020820004203370300200120073602100c040b200341086a20" + "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" + "1a200328020c21072003280208210441141084808080002201450d012001200436" + "020c2001410d3602002000200136020820004203370300200120073602100c030b" + "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" + "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" + "01450d012001200436020c2001410d360200200020013602082000420337030020" + "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" + "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" + "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" + "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" + "0b0b200341206a200120022009108e808080000240024020032802200d00200020" + "032b0328390308420021090c010b20002003280224360208420321090b20002009" + "3703000c020b000b20002001200220091087808080000b200341306a2480808080" + "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" + "0641016a2107200520066b2108200128020c20066a210541002104034002402005" + "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" + "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" + "200720046a3602142008200441016a2204470d000b200821040b20002001200220" + "032004108b808080000f0b200020012002200320041088808080000bc80101047f" + "23808080800041206b2202248080808000024002400240200028020c450d002000" + "21010c010b200241106a41086a2203200041086a28020036020020022000290200" + "370310200241086a200128020c2001280210200128021410838080800041002d00" + "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" + "200120022903103702002001200536020c20012004360210200141086a20032802" + "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "014108411810d480808000024020012802082200418180808078460d0020002001" + "28020c109580808000000b200141106a2480808080000b950101027f0240200028" + "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" + "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" + "0041046a28020020021082808080000c010b200010918080800020002802002202" + "450d00200041046a280200200241186c1082808080000b200041186a2100200141" + "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" + "01020b20002802082201450d01200028020420011082808080000c010b20002d00" + "044103470d00200028020822012802002102024020012802042203280200220445" + "0d002002200411808080800080808080000b024020032802042203450d00200220" + "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" + "097f017e23808080800041306b2203248080808000024002400240024002400240" + "0240024002400340024002402001280208220420012802042205460d0002400240" + "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" + "00460d0120074120490d012006200441016a22086a21094100200520086b417871" + "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" + "800020012802042105200128020821070c040b200741086a2107200b41086a2109" + "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" + "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" + "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" + "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" + "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" + "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" + "1084808080002207450d052007200936020c200741043602002000200736020420" + "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" + "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" + "024020094122470d002002280208450d0520072004490d072002200b20046a2007" + "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" + "0204200228020810ca8080800020032802282207450d032000200328022c360208" + "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" + "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" + "450d052007200936020c2007411036020020002007360204200041023602002007" + "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" + "80002001200741016a2209360208024020092005490d00200341206a200b200520" + "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" + "1084808080002207450d06200741043602000c090b2001200741026a2204360208" + "02400240024002400240024002400240024002400240200b20096a2d0000220741" + "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" + "00470d020240200228020822072002280200470d00200210cb808080000b200220" + "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" + "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" + "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" + "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" + "22072002280200470d00200210cb808080000b2002200741016a36020820022802" + "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" + "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" + "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" + "02200741016a360208200228020420076a41083a0000410021070c050b02402002" + "28020822072002280200470d00200210cb808080000b2002200741016a36020820" + "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" + "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" + "0000410021070c030b0240200228020822072002280200470d00200210cb808080" + "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" + "40200228020822072002280200470d00200210cb808080000b2002200741016a36" + "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" + "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" + "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" + "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" + "40024020032802282207450d002000200328022c3602084100210b0c010b410221" + "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" + "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" + "200936020c2007200b3602100b20004102360200200020073602040b200341306a" + "2480808080000b7901027f410021030240024020024100480d00024020020d0041" + "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" + "040d01410121030b20032002109580808000000b20042001200210df8080800021" + "012000200236020c2000200136020820002003360204200041033a00000b100002" + "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" + "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" + "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" + "370308200041023a0000200020012903083703100f0b200041023a000020002001" + "290308220337031020002003423f883703080bb40701077f23808080800041306b" + "22022480808080002001280200220328020c210402400240024002402003280214" + "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" + "174b0d024101200874419380800471450d022003200541016a2205360214200620" + "05470d000b200621050b41012108200241286a200420062006200541016a220520" + "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" + "210341141084808080002205450d022005200336020c2005410336020020002005" + "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" + "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" + "20053602140240200520064f0d00034002400240024002400240200420056a2d00" + "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" + "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" + "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" + "0c21062002280208210341141084808080002205450d092005200336020c200541" + "1136020020002005360204200520063602100c080b200041013a0001410021080c" + "070b41012108200241186a200420062006200541016a220520062005491b108380" + "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" + "80002205450d072005200336020c20054115360200200020053602042005200636" + "02100c060b2003200541016a220536021420062005470d000b200621050b410121" + "08200241106a200420062006200541016a220520062005491b1083808080004100" + "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" + "0d042005200336020c2005410536020020002005360204200520063602100c030b" + "41002108200141003a0004024020074122460d002002200420062006200541016a" + "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" + "280200210641141084808080002205450d042005200636020c2005411136020020" + "002005360204200520083602100c020b200041013a00010c020b200241206a2004" + "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" + "21082002280220210641141084808080002205450d022005200636020c20054108" + "36020020002005360204200520083602100b410121080b200020083a0000200241" + "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" + "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" + "8080800022040d01410121030b20032002109580808000000b20042001200210df" + "8080800021012000200236020820002001360204200020033602000bdc0201067f" + "23808080800041106b22022480808080002001280200220328020c210402400240" + "02400240024020032802142201200341106a28020022054f0d000340200420016a" + "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" + "41016a220136021420052001470d000b200521010b200241086a20042005200520" + "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" + "21072002280208210541141084808080002201450d03200141033602000c010b02" + "402006413a470d002003200141016a360214200020031081808080000c020b2002" + "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" + "001a200228020421072002280200210541141084808080002201450d0220014106" + "3602000b2001200536020c20002001360204200041063a0000200120073602100b" + "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" + "042480808080000240024002400240024002400240024002400240024002400240" + "20012802002205450d002002280208210620022802042107200128020421080240" + "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" + "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" + "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" + "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" + "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" + "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" + "2002290204220fa721092002280200220b418080808078470d03200921050c010b" + "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" + "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" + "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" + "028c02200142808080801037020420012009360200200920032903003703002009" + "41086a200341086a290300370300200941106a200341106a2903003703000c010b" + "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" + "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" + "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" + "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" + "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" + "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" + "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" + "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" + "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" + "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" + "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" + "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" + "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" + "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" + "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" + "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" + "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" + "200420042903880137026020042005360208200420063602782008280200220d41" + "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" + "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" + "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" + "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" + "370300200b2003290300370300200b41086a200341086a290300370300200d200e" + "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" + "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" + "246a200441dc006a41186a28020036020020042010370234200420073602302004" + "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" + "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" + "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" + "210d200b2f019203410b490d02200641016a210602400240024002400240024002" + "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" + "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" + "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" + "36027820044188016a200441f8006a10c18080800020042802b001410520044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" + "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" + "2105200d418080808078460d032004200d3602302008200441086a412410df8080" + "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" + "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" + "41003b019203200d410036028802200b41003b019003200b200d36028802200120" + "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" + "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" + "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" + "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" + "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" + "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" + "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" + "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" + "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" + "6a200941106a220d290300370300200041086a200941086a220b29030037030020" + "092003290300370300200b200341086a290300370300200d200341106a29030037" + "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" + "80808080004100210241002103024020002802002204450d002001200436021820" + "014100360214200120043602082001410036020420012000280204220336021c20" + "01200336020c20002802082103410121020b200120033602202001200236021020" + "01200236020002400240024003400240024002400240024020030d002001280200" + "450d0820012802082104200128020422030d0141002100200128020c2203450d06" + "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" + "024020024101712203450d0020012802040d0020012802082103200128020c2200" + "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" + "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" + "3702082001200336020441012102200141013602000b2001280208210002402001" + "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" + "20012802242203450d0120012802282100200128022c220520032f019203490d02" + "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" + "2001200436020c20014100360208200120033602040c010b200320044102746a41" + "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" + "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" + "2802002204450d00200028020420041082808080000b0240024002400240200320" + "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" + "20032802042200450d01200328020820001082808080000c010b200341046a1091" + "8080800020032802042200450d002003280208200041186c1082808080000b2001" + "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" + "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" + "03037f017e037f23808080800041f0006b22022480808080004100210302402000" + "2d0000220420012d0000470d00410121030240024002400240024020040e060500" + "01020304050b20002d000120012d00014621030c040b4100210320002903082205" + "2001290308520d030240024002402005a70e03000102000b200029031020012903" + "105121030c050b200029031020012903105121030c040b20002b031020012b0310" + "6121030c030b41002103200028020c2204200128020c470d022000280208200128" + "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" + "0d012001280208210420002802082100200641016a210103402001417f6a220145" + "21032001450d0220002004109c808080002106200441186a2104200041186a2100" + "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" + "6c2002420037026420024100360254200241003602442002410036023020024100" + "36022020022001280208220636025c200220012802042203360258200220063602" + "4c2002200336024820022000280208220636023820022000280204220136023420" + "0220063602282002200136022420022004410020031b3602602002200341004722" + "033602502002200336024020022004410020011b36023c20022001410047220336" + "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" + "80004101210320022802102201450d0120022802142104200241086a2007109d80" + "80800020022802082200450d0141002103200128020822062000280208470d0120" + "0228020c210820012802042000280204200610dc808080000d0120042008109c80" + "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" + "200128022022020d00410021020c010b20012002417f6a36022002400240024020" + "012802004101470d0020012802040d01200128020821030240200128020c220245" + "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" + "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" + "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" + "050c010b03402003280288022205450d03200241016a210220032f019003210420" + "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" + "21060c010b200520034102746a4198036a21030340200328020022064198036a21" + "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" + "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" + "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" + "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" + "001a200010848080800022010d01410121010b20012000109580808000000b2001" + "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" + "108080808000024002400240024020042d00384106460d00200441086a41106a20" + "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" + "29030037030020042004290338370308200441386a200220031080808080002004" + "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" + "0629030037030020042004290338370320200441086a10a0808080002205450d02" + "200441206a10a0808080002206450d0320052006109c808080002105200441206a" + "108580808000200441086a10858080800002402003450d00200220031082808080" + "000b02402001450d00200020011082808080000b200441d0006a24808080800020" + "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" + "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" + "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" + "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" + "004105470d0020002802042202450d002000280208210303402002418c026a2100" + "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" + "0c020b2000280208210120002802042107200641016a2106200541746a21052000" + "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" + "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" + "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" + "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" + "0041c0006b22052480808080002005200136020c20052000360208200520033602" + "14200520023602102005410236021c200541dc82c0800036021820054202370224" + "2005418180808000ad422086200541106aad843703382005418280808000ad4220" + "86200541086aad843703302005200541306a360220200541186a200410a4808080" + "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" + "41206b2200248080808000200041003602182000410136020c200041ac81c08000" + "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" + "23808080800041206b2202248080808000200241106a200041106a290200370300" + "200241086a200041086a290200370300200241013b011c20022001360218200220" + "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" + "6a280200220241787122006a21030240024020024101710d002002410271450d01" + "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" + "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" + "7136020420012000410172360204200320003602000f0b2001200210a880808000" + "0b024002400240024002400240200328020422024102710d00200341002802f8d2" + "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" + "80002001200220006a2200410172360204200120006a2000360200200141002802" + "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" + "2000410172360204200120006a20003602000b2000418002490d022001200010d7" + "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" + "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" + "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" + "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" + "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" + "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" + "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" + "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" + "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" + "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" + "00220241012000410376742200710d00410020022000723602e4d2c08000200321" + "000c010b200328020821000b200320013602082000200136020c2001200336020c" + "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" + "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" + "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" + "0041206b2203248080808000200341003602102003410136020420034204370208" + "2003200136021c200320003602182003200341186a3602002003200210a4808080" + "00000b840601057f0240024002402000417c6a2203280200220441787122054104" + "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" + "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" + "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" + "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" + "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" + "7871220420056a22052001490d042006200410a880808000200520016b22024110" + "490d0120032001200328020041017172410272360200200720016a220120024103" + "72360204200720056a220520052802044101723602042001200210a98080800020" + "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" + "20016a22052002410372360204200620062802044101723602042005200210a980" + "80800020000f0b20032005200328020041017172410272360200200720056a2202" + "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" + "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" + "200720056a2202200228020441017236020441002102410021010c010b20032001" + "200441017172410272360200200720016a22012002410172360204200720056a22" + "05200236020020052005280204417e713602040b410020013602f4d2c080004100" + "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" + "0240200210848080800022050d0041000f0b20052000417c417820032802002201" + "4103711b20014178716a2201200220012002491b10df808080002102200010a580" + "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" + "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" + "410272360200200720016a2202200520016b2205410172360204410020053602f0" + "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" + "4002402001418002490d002000280218210302400240024020022000470d002000" + "41144110200028021422021b6a28020022010d01410021020c020b200028020822" + "01200236020c200220013602080c010b200041146a200041106a20021b21040340" + "200421052001220241146a200241106a200228021422011b210420024114411020" + "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" + "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" + "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" + "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" + "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" + "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d0020022001360214" + "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" + "4101710d002003410271450d012000280200220320016a21010240200020036b22" + "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" + "d2c0800020022002280204417e7136020420002001410172360204200220013602" + "000c020b2000200310a8808080000b024002400240024020022802042203410271" + "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" + "03417871220310a8808080002000200320016a2201410172360204200020016a20" + "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" + "2003417e7136020420002001410172360204200020016a20013602000b02402001" + "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" + "0240024041002802e4d2c08000220341012001410376742201710d004100200320" + "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" + "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" + "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" + "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" + "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" + "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" + "7e23808080800041306b2203248080808000200320003602002003200136020420" + "03410236020c200341c485c08000360208200342023702142003418380808000ad" + "4220862204200341046aad84370328200320042003ad843703202003200341206a" + "360210200341086a200210a480808000000b110020003502004101200110ad8080" + "80000b7902017f017e23808080800041306b220324808080800020032001360204" + "200320003602002003410236020c200341c882c080003602082003420237021420" + "03418380808000ad42208622042003ad8437032820032004200341046aad843703" + "202003200341206a360210200341086a200210a480808000000bec0203027f017e" + "037f23808080800041306b2203248080808000412721040240024020004290ce00" + "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" + "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" + "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" + "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" + "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" + "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" + "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" + "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" + "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" + "23808080800041206b220124808080800020002802182102200141106a20004110" + "6a290200370300200141086a200041086a2902003703002001200036021c200120" + "0236021820012000290200370300200110d880808000000bcb0501077f02400240" + "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" + "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" + "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" + "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" + "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" + "28021422012000280218220920082002200310b080808000450d0041010f0b2001" + "20042005200928020c11818080800080808080000f0b0240024002400240200028" + "0204220120064b0d00200028021422012000280218220920082002200310b08080" + "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" + "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" + "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" + "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" + "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" + "00202000200736021041000f0b200120042005200928020c118180808000808080" + "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" + "020b20072101410021070c010b20074101762101200741016a41017621070b2001" + "41016a210120002802102106200028021821092000280214210a02400340200141" + "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" + "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" + "020c11818080800080808080000d00410021010340024020072001470d00200720" + "07490f0b200141016a2101200a200620092802101182808080008080808000450d" + "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" + "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" + "200020032004200128020c11818080800080808080000b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c200341e485c08000360208200342023702142003418380808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" + "200028020022040d002003410171450d010b02402003410171450d00200120026a" + "210502400240200028020c22060d0041002107200121080c010b41002107410021" + "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" + "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" + "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" + "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" + "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" + "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" + "2007200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a02402002" + "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" + "0641002103024020012007460d004100210302402009417c4b0d00410021034100" + "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" + "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" + "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" + "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" + "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" + "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" + "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" + "41002108024020054104490d002004200d41f007716a2109410021082004210303" + "40200328020c2207417f7341077620074106767241818284087120032802082207" + "417f7341077620074106767241818284087120032802042207417f734107762007" + "4106767241818284087120032802002207417f7341077620074106767241818284" + "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" + "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" + "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" + "4107762003410676724181828408712103200c4101460d0220082802042207417f" + "7341077620074106767241818284087120036a2103200c4102460d022008280208" + "2208417f7341077620084106767241818284087120036a21030c020b024020020d" + "00410021060c030b2002410371210802400240200241044f0d0041002106410021" + "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" + "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" + "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" + "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" + "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" + "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" + "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" + "024020002d00200e0402000102020b20052103410021050c010b20054101762103" + "200541016a41017621050b200341016a2103200028021021092000280218210820" + "00280214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c118180" + "80800080808080000f0b0240200720012002200828020c11818080800080808080" + "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" + "016a21032007200920082802101182808080008080808000450d000b2003417f6a" + "2005490b140020012000280200200028020410b2808080000b1c00200028020020" + "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" + "306b2203248080808000200341033a002c2003412036021c410021042003410036" + "02282003200136022420032000360220200341003602142003410036020c024002" + "40024002400240200228021022050d00200228020c2200450d0120022802082101" + "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" + "0240200041046a2802002207450d00200328022020002802002007200328022428" + "020c11818080800080808080000d040b20012802002003410c6a20012802041182" + "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" + "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" + "41016a210420022802082109200228020021004100210603400240200041046a28" + "02002201450d00200328022020002802002001200328022428020c118180808000" + "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" + "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" + "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" + "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" + "02102003200b36020c200141046a280200210702400240024020012802000e0301" + "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" + "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" + "2802002003410c6a200128020411828080800080808080000d02200041086a2100" + "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" + "0020044103746a22012802002001280204200328022428020c1181808080008080" + "808000450d010b410121010c010b410021010b200341306a24808080800020010b" + "d70201057f2380808080004180016b220224808080800002400240024002402001" + "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" + "030b41ff00210303402002200322046a22052000410f712203413072200341d700" + "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" + "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" + "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" + "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" + "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" + "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" + "20024180016a24808080800020000b7902017f017e23808080800041306b220324" + "808080800020032000360200200320013602042003410236020c2003419886c080" + "00360208200342023702142003418380808000ad4220862204200341046aad8437" + "0328200320042003ad843703202003200341206a360210200341086a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" + "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" + "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" + "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" + "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" + "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" + "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" + "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" + "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" + "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" + "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" + "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" + "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" + "0010a280808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641a888c0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541b089c080003602302005420537023c20054182" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418480808000ad422086200541286aad843703582005418580808000ad42" + "2086200541246aad843703502005418380808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541f089c080003602302005420337023c2005" + "418280808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418380808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541d088c080003602302005420437023c2005418280" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" + "000d00200128021441d881c080004102200128021828020c118180808000808080" + "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111828080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111828080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11818080800080808080000d010b2004412720011182808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410de808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" + "400240024041c8031084808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" + "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "df80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" + "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" + "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" + "00200028020021002002410036022c2002428080808010370224200241033a0050" + "200241203602402002410036024c200241c0a0c080003602482002410036023820" + "0241003602302002200241246a3602440240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002400240" + "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" + "1314151617180b024002400240024020002d00040e0400010203000b2002200028" + "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" + "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" + "2900e4ccc08000370000200241143602602002200336025c200241143602582002" + "410336026c200241ccccc08000360268200242023702742002418680808000ad42" + "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" + "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" + "8080002103024020022802582204450d00200228025c20041082808080000b2003" + "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" + "013702742002418280808000ad422086200241086aad8437035820022003410274" + "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" + "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" + "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" + "0c190b20002802082203280200200241306a200328020428021011828080800080" + "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" + "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" + "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" + "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" + "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" + "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" + "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" + "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" + "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" + "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" + "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" + "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" + "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" + "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" + "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" + "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" + "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" + "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" + "6a200241246a41086a280200360200200220022902243703582002418380808000" + "36027c2002418380808000360274200241888080800036026c2002410436020c20" + "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" + "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" + "280218200241086a10b5808080002100024020022802582201450d00200228025c" + "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" + "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" + "00280204200028020810b2808080000b4b01017f02402000280200200028020822" + "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" + "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" + "8080800041106b2202248080808000200028020821032000280204210441012105" + "024020012802142206412220012802182207280210220811828080800080808080" + "000d000240024020030d0041002103410021000c010b410021094100210a200421" + "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" + "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" + "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" + "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" + "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" + "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" + "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" + "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" + "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" + "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" + "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" + "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" + "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" + "0d010240024020022d0004418001470d0020062002280208200811828080800080" + "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" + "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" + "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" + "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" + "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" + "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" + "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" + "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" + "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" + "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" + "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" + "200728020c11818080800080808080000d00200641222008118280808000808080" + "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" + "05200128021828020c11818080800080808080000b1e01017f0240200028020022" + "01450d00200028020420011082808080000b0b5301047f02402000280208220120" + "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" + "200441dc00460d0120044120490d012000200141016a220136020820022001470d" + "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" + "0210cf80808000200028020821030b200028020420036a2001200210df80808000" + "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" + "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" + "20026b21074100210503400240024002400240200220056a2d00002208c0220941" + "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" + "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" + "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" + "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" + "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" + "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" + "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" + "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" + "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" + "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" + "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" + "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" + "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" + "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" + "0520042802082108024041141084808080002203450d002003200836020c200341" + "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" + "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" + "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" + "41106a2480808080000b5901017f23808080800041106b22012480808080002001" + "41086a2000200028020041014101410110d4808080000240200128020822004181" + "80808078460d002000200128020c109580808000000b200141106a248080808000" + "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" + "8080000240024020022f01140d0002400240024002400240024020022f01162203" + "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" + "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" + "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" + "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" + "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" + "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" + "2205418080046a210302402001280200200128020822006b41034b0d0020012000" + "410410cf80808000200128020821000b2001200041046a36020820012802042000" + "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" + "002005410676413f71418001723a000220002003410c76413f71418001723a0001" + "410021000c070b200220002802002000280204200028020810838080800041002d" + "00c0cfc080001a200228020421012002280200210341141084808080002200450d" + "042000200336020c20004114360200200020013602100c060b200241086a200028" + "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" + "21012002280208210341141084808080002200450d032000200336020c20004114" + "360200200020013602100c050b200241173602142000200241146a10d080808000" + "21000c040b200241173602142000200241146a10d08080800021000c030b024002" + "4002402003418001490d0002402001280200200128020822046b41034b0d002001" + "2004410410cf80808000200128020821040b200128020420046a21002003418010" + "4f0d0120034106764140722106410221050c020b02402001280208220020012802" + "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" + "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" + "60722106410321050b200020063a00002001200420056a360208200020056a417f" + "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" + "206a24808080800020000b910301057f23808080800041106b2202248080808000" + "02400240024002402001280204220320012802082204490d000240200320046b41" + "034b0d0020012003360208200241086a2001280200200320031083808080004100" + "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" + "0d022001200436020c2001410436020020002001360204200120033602100c030b" + "2001200441046a220536020802402001280200220620046a22012d000141017441" + "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" + "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" + "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" + "001a200228020421032002280200210441141084808080002201450d0220012004" + "36020c2001410c36020020002001360204200120033602100c030b200020013b01" + "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" + "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" + "022480808080000240024002402001280208220320012802042204490d00200241" + "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" + "032002280208210441141084808080002201450d022001200436020c2001410436" + "02002000200136020420012003360210410121010c010b2000200128020020036a" + "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" + "5601017f23808080800041106b2203248080808000200341086a20002001200241" + "01410110d480808000024020032802082202418180808078460d00200220032802" + "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" + "106b2202248080808000200241086a200028020020002802042000280208108380" + "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" + "8080800022000d00000b2000200436020c20002001290200370200200020033602" + "10200041086a200141086a280200360200200241106a24808080800020000b1f00" + "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" + "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" + "00200320016a3602080b200241106a24808080800041000b820101017f02400240" + "024002402003280204450d000240200328020822040d002002450d0341002d00c0" + "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" + "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" + "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" + "8080800041206b2206248080808000024002400240200220036a220320024f0d00" + "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" + "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" + "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" + "20080d00410021020c010b2006200820056c36021c200620012802043602142004" + "21020b20062002360218200641086a20042009200641146a10d380808000024020" + "062802080d00200628020c21022001200736020020012002360204418180808078" + "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" + "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" + "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" + "017120024101746b413e6a21020b200042003702102000200236021c2002410274" + "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" + "00360200200020033602182000200036020c20002000360208410041002802e8d2" + "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" + "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" + "03034020042003411d764104716a41106a22052802002202450d02200341017421" + "032002210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b20052000" + "360200200020043602182000200036020c200020003602080b0b00200010d98080" + "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" + "024002400240024020002802040e020001020b20020d0141012102410021030c02" + "0b20020d00200028020022022802042103200228020021020c010b200141808080" + "80783602002001200036020c2001418980808000200028021c22002d001c20002d" + "001d10da80808000000b20012003360204200120023602002001418a8080800020" + "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" + "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" + "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" + "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" + "086a200020011183808080008080808000000b410041003a0094d3c08000200245" + "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" + "02402002450d000240034020002d0000220420012d00002205470d01200041016a" + "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" + "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" + "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" + "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" + "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" + "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" + "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" + "280200210803402005417c6a220520082003742001280200220820027672360200" + "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" + "210103402005417c6a220520012802003602002001417c6a210120042005490d00" + "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" + "036a210502402003450d0020002104200121080340200420082d00003a00002008" + "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" + "6a210402400240200120036a2206410371450d0020074101480d01200641037422" + "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" + "21080340200520082002762001280200220820037472360200200141046a210120" + "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" + "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" + "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" + "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" + "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" + "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" + "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" + "00410020006b41037122046a210502402004450d00200021032001210603402003" + "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" + "01480d012009410374220641187121022009417c71220a41046a2101410020066b" + "4118712104200a2802002106034020052006200276200128020022062004747236" + "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" + "092101034020052001280200360200200141046a2101200541046a22052003490d" + "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" + "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" + "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" + "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" + "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" + "0a000000150000004b000000450010000a000000160000004b0000004163636f75" + "6e7400450010000a0000001700000033000000450010000a000000180000003300" + "00006361706163697479206f766572666c6f770000009800100011000000616c6c" + "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" + "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" + "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" + "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" + "686520696e6465782069732000150110002000000035011000120000003a200000" + "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" + "7273006c0110001300000066000000170000003078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230323132" + "323233323432353236323732383239333033313332333333343335333633373338" + "333934303431343234333434343534363437343834393530353135323533353435" + "353536353735383539363036313632363336343635363636373638363937303731" + "373237333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939636f72652f7372632f66" + "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" + "000000a40900001a00000072616e676520737461727420696e64657820206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" + "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" + "10000000a202100022000000736c69636520696e64657820737461727473206174" + "202062757420656e64732061742000f4021000160000000a0310000d0000000101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000020202020202" + "020202020202020202020202020202020202020202020202030303030303030303" + "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" + "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" + "000e0000003b041000040000003f041000100000004f0410000100000062797465" + "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" + "7420697320696e7369646520202862797465732029206f66206000700410000b00" + "00007b04100026000000a104100008000000a9041000060000004f041000010000" + "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" + "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" + "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" + "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" + "002c0510001d0000000a0000002b00000000060101030104020507070208080902" + "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" + "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" + "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" + "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" + "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" + "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" + "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" + "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" + "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" + "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" + "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" + "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" + "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" + "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" + "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" + "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" + "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" + "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" + "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" + "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" + "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" + "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" + "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" + "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" + "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" + "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" + "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" + "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" + "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" + "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" + "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" + "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" + "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" + "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" + "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" + "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" + "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" + "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" + "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" + "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" + "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" + "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" + "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" + "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" + "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" + "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" + "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" + "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" + "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" + "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" + "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" + "0239010405010204011402160601013a0101020104080107030a021e013b010101" + "0c01090128010301370101030503010407020b021d013a01020102010301050207" + "020b021c02390201010204080109010a021d014801040102030101080151010207" + "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" + "0202021902040310040d01020206010f01000300031d021e021e02400201070801" + "020b09012d030101750222017603040209010603db0202013a0101070101010102" + "08060a0201301f310430070101050128090c022004020201033801010203010103" + "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" + "04010a200250020001030104011902050197021a120d012608190b2e0330010204" + "020227014306020202020c0108012f01330101030202050201012a020801ee0102" + "01040100010010101000020001e201950500030102050428030401a50200040002" + "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" + "090a0402015f0302010102060102019d010308150239020101010116010e070305" + "c308020301011701510102060101020101020102eb010204060201021b02550802" + "0101026a0101010206010165030204010500090102f5010a020101040190040202" + "0401200a280602040801090602032e0d010200070106010152160207010201027a" + "06030101020107010148020301010100020b023405050101010001060f00053b07" + "00013f0451010002002e0217000101030405080802071e0494030037043208010e" + "011605010f000701110207010201056401a00700013d04000400076d07006080f0" + "002f72757374632f63326637346333663932386165623530336631356234653965" + "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" + "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" + "0e10006000000071010000360000002f72757374632f6332663734633366393238" + "61656235303366313562346539656635373738653737663330353862382f6c6962" + "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" + "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" + "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" + "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" + "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" + "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" + "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" + "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" + "00181d10005f00000058020000300000000d0000000c000000040000000e000000" + "0f00000010000000000000000000000001000000110000006120446973706c6179" + "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" + "20756e65787065637465646c792f72757374632f63326637346333663932386165" + "6235303366313562346539656635373738653737663330353862382f6c69627261" + "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" + "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" + "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" + "207768696c652070617273696e67206120737472696e67454f46207768696c6520" + "70617273696e6720612076616c7565657870656374656420603a60657870656374" + "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" + "78706563746564206964656e7465787065637465642076616c7565657870656374" + "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" + "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" + "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" + "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" + "206120737472696e676b6579206d757374206265206120737472696e67696e7661" + "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" + "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" + "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" + "6164696e6720737572726f6761746520696e206865782065736361706574726169" + "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" + "70656374656420656e64206f662068657820657363617065726563757273696f6e" + "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" + "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" + "4826100001000000000000000000f03f0000000000002440000000000000594000" + "00000000408f40000000000088c34000000000006af8400000000080842e410000" + "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" + "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" + "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" + "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" + "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" + "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" + "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" + "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" + "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" + "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" + "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" + "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" + "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" + "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" + "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" + "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" + "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" + "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" + "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" + "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" + "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" + "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" + "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" + "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" + "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" + "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" + "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" + "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" + "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" + "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" + "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" + "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" + "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" + "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" + "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" + "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" + "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" + "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" + "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" + "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" + "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" + "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" + "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" + "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" + "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" + "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" + "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" + "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" + "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" + "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" + "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" + "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" + "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" + "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" + "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" + "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" + "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" + "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" + "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" + "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" + "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" + "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" + "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" + "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" + "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" + "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" + "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" + "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" + "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" + "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" + "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" + "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" + "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" + "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" + "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" + "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" + "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" + "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" + "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" + "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" + "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" + "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" + "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" + "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" + "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" + "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" + "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" + "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" + "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" + "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" + "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" + "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" + "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" + "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" + "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" + "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" + "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" + "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" + "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" + "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" + "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" + "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" + "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" + "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" + "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" + "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" + "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" + "64656466696c6520746f6f206c617267657265736f757263652062757379657865" + "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" + "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" + "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" + "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" + "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" + "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" + "0048261000010000006f7065726174696f6e207375636365737366756c10000000" + "1100000012000000100000001000000013000000120000000d0000000e00000015" + "0000000c0000000b00000015000000150000000f0000000e000000130000002600" + "00003800000019000000170000000c000000090000000a00000010000000170000" + "00190000000e0000000d00000014000000080000001b0000000e00000010000000" + "16000000150000000b000000160000000d0000000b000000130000005023100060" + "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" + "1000f8231000042410000f24100024241000392410004824100056241000692410" + "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" + "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" + "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" + "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" + "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" + "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" + "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" + "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" + "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" + "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" + "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" + "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" + "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" + "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" + "243137683533326265333033376461316237656445064a5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" + "70617273655f6964656e743137683663353964643731393635353139313045074b" + "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" + "4c54245224475424313270617273655f6e756d6265723137683738336134316134" + "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" + "73657269616c697a6572244c54245224475424313370617273655f646563696d61" + "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" + "70617273655f6578706f6e656e7431376833366464376462643233653461346562" + "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" + "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" + "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" + "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" + "346636345f66726f6d5f7061727473313768633863316239626161613836666637" + "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" + "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" + "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" + "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" + "24313670617273655f616e795f6e756d6265723137683931643533303465356139" + "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" + "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" + "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" + "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" + "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" + "61775f7665633139526177566563244c54245424432441244754243867726f775f" + "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" + "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" + "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" + "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" + "62653863353535633862636433353545143c5f5a4e357365726465326465375669" + "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" + "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" + "68616e646c655f6572726f72313768393762376462643066373264643738384516" + "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" + "35766973697431376838366238393638313662613130613765451781015f5a4e37" + "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" + "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" + "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" + "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" + "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" + "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" + "244754243976697369745f73747231376835356436653830653061376366383938" + "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" + "6363657373244c5424522447542424753230246173247532302473657264652e2e" + "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" + "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" + "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" + "4c54244b24432456244324412447542436696e7365727431376834643164623464" + "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" + "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" + "244b244324562443244124475424247532302461732475323024636f72652e2e6f" + "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" + "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" + "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" + "702e2e5061727469616c4571244754243265713137683162323138393234373831" + "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" + "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" + "475424247532302461732475323024636f72652e2e697465722e2e747261697473" + "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" + "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" + "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" + "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" + "6e646578244754243130696e6465785f696e746f31376864333238633634636161" + "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" + "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" + "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" + "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" + "63617061636974795f6f766572666c6f7731376834393964343832613965643537" + "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" + "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" + "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" + "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" + "70616e69636b696e673570616e6963313768303465656239313764643933633232" + "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" + "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" + "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" + "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "244754243133646973706f73655f6368756e6b3137683665306363636434353836" + "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" + "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" + "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" + "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" + "2475323024666f7224753230247533322447542433666d74313768626633653032" + "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" + "70616e69635f626f756e64735f636865636b313768336436623861613463383034" + "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" + "363431376864353231666136656636613036373261452e11727573745f62656769" + "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" + "327061645f696e74656772616c3137686334656130376130626331333536633445" + "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" + "656772616c313277726974655f7072656669783137686139613433323830623630" + "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" + "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" + "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" + "706164313768343736396165333839333734636335314533495f5a4e34345f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" + "706c61792447542433666d74313768376666346430623836303963323437324534" + "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" + "2e666d742e2e44656275672447542433666d743137683361366261613162623437" + "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" + "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" + "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" + "3024666f7224753230247533322447542433666d74313768353533393862313635" + "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" + "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" + "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" + "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" + "6275675f657874313768656366613566303431373437393039384539345f5a4e34" + "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" + "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" + "6963655f6572726f725f6661696c31376862303364323439386438646362363433" + "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" + "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" + "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" + "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" + "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" + "656275672447542433666d7431376865613566643964626339343936626665453e" + "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" + "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" + "30246933322447542433666d743137686365643930633761363339633031646445" + "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" + "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" + "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" + "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" + "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" + "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" + "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" + "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" + "3130696e736572745f666974313768633861306366353339656666303131314541" + "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" + "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" + "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" + "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" + "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" + "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" + "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768343032353764366634326532" + "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" + "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" + "61792447542433666d74313768636534323236616131663732366331634544615f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" + "74655f73747231376835393964396535373839343664643938452e31393245575f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768623637326562313939633335643138364546555f5a4e35335f244c542463" + "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768663761653238353562323439" + "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" + "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" + "313768376236353738393966393837353963624548475f5a4e313073657264655f" + "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" + "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" + "616c6c6f63337665633136566563244c5424542443244124475424313765787465" + "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" + "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" + "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" + "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" + "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" + "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" + "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" + "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" + "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" + "6f64655f6865785f65736361706531376834376265353936383535663830346461" + "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" + "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" + "63377261775f7665633230526177566563496e6e6572244c542441244754243772" + "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" + "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" + "3472656164356572726f7231376865663535323764333333633963323666455130" + "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" + "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" + "666d742e2e577269746524475424313077726974655f6368617231376832313433" + "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" + "766563313166696e6973685f67726f773137683533383539626133383962373164" + "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" + "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" + "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" + "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" + "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" + "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" + "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" + "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" + "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" + "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" + "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" + "75376424247537642431376865313761333937376638396331313738455a3b5f5a" + "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" + "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" + "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" + "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" + "61735f73747231376865623366373232643232346534326638455c066d656d636d" + "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" + "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" + "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" + "2e726f6461746100550970726f64756365727302086c616e677561676501045275" + "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" + "6768746c79202863326637346333663920323032342d30392d30392900490f7461" + "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasm( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + } + } + + void + testEscrowWasmP4() + { + testcase("escrow wasm P4 test"); + auto wasmHex = + "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" + "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" + "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" + "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" + "7c7b01010301040506010202020202010102050001000103010007070303080500" + "090201020a03020500030305020b05050101010001010a0505050c090901010105" + "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" + "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" + "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" + "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" + "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" + "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" + "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" + "800041106b220224808080800002400240200028020c450d00200021010c010b20" + "0241086a200041086a280200360200200220002902003703002001200210818080" + "80002101200041141082808080000b200241106a24808080800020010b8c010103" + "7f23808080800041106b2202248080808000200241086a200028020c2000280210" + "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" + "21040240411410998080800022000d00000b2000200436020c2000200129020037" + "020020002003360210200041086a200141086a280200360200200241106a248080" + "80800020000b7001027f024002402000417c6a2802002202417871220341044108" + "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" + "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" + "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" + "016b22022480808080000240024002400240200128021c22034110710d00200341" + "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" + "00210303402002200322046a22052000410f712203413072200341d7006a200341" + "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" + "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" + "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" + "4104762100200641104f0d000b02402004418101490d002004418001419887c080" + "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" + "868080800021000c010b02402004418101490d002004418001419887c080001085" + "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" + "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" + "800041306b2203248080808000412721040240024020004290ce005a0d00200021" + "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" + "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" + "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" + "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" + "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" + "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" + "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" + "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" + "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" + "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" + "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" + "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" + "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" + "0b200920066a21060b024020002802000d00024020002802142201200028021822" + "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" + "8080800080808080000f0b02400240024002402000280204220120064b0d002000" + "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" + "410871450d01200028021021072000413036021020002d0020210b4101210c2000" + "41013a0020200028021422092000280218220a20082002200310ac808080000d02" + "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" + "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" + "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" + "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" + "6b210702400240024020002d002022010e0402000100020b20072101410021070c" + "010b20074101762101200741016a41017621070b200141016a2101200028021021" + "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" + "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" + "082002200310ac808080000d00200a20042005200928020c118080808000808080" + "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" + "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" + "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" + "0240200128021c22034110710d0020034120710d01200035020041012001108480" + "80800021000c030b2000280200210041ff00210303402002200322046a22052000" + "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" + "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" + "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" + "002004417f6a210320004110492106200041047621002006450d000b0240200441" + "8101490d002004418001419887c08000108580808000000b2001410141a887c080" + "0041022005418101200441016a6b10868080800021000c010b0240200441810149" + "0d002004418001419887c08000108580808000000b2001410141a887c080004102" + "2005418101200441016a6b10868080800021000b20024180016a24808080800020" + "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" + "970101047f024002400240200028020022002802000e020001020b200028020822" + "01450d01200028020420011082808080000c010b20002d00044103470d00200028" + "0208220128020021020240200128020422032802002204450d0020022004118280" + "80800080808080000b024020032802042203450d00200220031082808080000b20" + "01410c1082808080000b200041141082808080000b6801017f0240024002400240" + "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" + "2201450d01200028020820011082808080000f0b200041046a108c808080002000" + "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" + "808080800041306b22012480808080004100210241002103024020002802002204" + "450d00200120043602182001410036021420012004360208200141003602042001" + "2000280204220336021c2001200336020c20002802082103410121020b20012003" + "360220200120023602102001200236020002400240024003400240024002400240" + "024020030d002001280200450d0820012802082104200128020422030d01410021" + "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" + "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" + "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" + "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" + "a080808000000b200142003702082001200336020441012102200141013602000b" + "200128020821000240200128020c220520032f019203490d000240034020014124" + "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" + "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" + "6a21040240024020000d002001200436020c20014100360208200120033602040c" + "010b200320044102746a4198036a21040340200428020022064198036a21042000" + "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" + "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" + "02400240024002402003200541186c6a22032d00000e050303030102000b200341" + "046a108b808080000c020b20032802042200450d01200328020820001082808080" + "000c010b200341046a108c8080800020032802042200450d002003280208200041" + "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" + "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" + "306a2480808080000b950101027f024020002802082201450d0020002802044104" + "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" + "8b808080000c020b20002802002202450d01200041046a28020020021082808080" + "000c010b2000108c8080800020002802002202450d00200041046a280200200241" + "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" + "021441d4a6c080004105200128021828020c11808080800080808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "002000108f808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110908080" + "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" + "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" + "0041106b2201248080808000200141086a2000200028020041014101410110d280" + "808000024020012802082200418180808078460d002000200128020c109a808080" + "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" + "808000200341086a2000200120024101410110d280808000024020032802082202" + "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109080808000200028020821030b200028020420036a2001200210fa808080001a" + "2000200320026a36020841000b1400200120002802042000280208109380808000" + "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" + "0171450d010b02402003410171450d00200120026a210502400240200028020c22" + "060d0041002107200121080c010b41002107410021092001210803402008220320" + "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" + "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" + "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" + "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" + "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" + "0120031b21010b024020040d00200028021420012002200028021828020c118080" + "80800080808080000f0b2000280204210a024020024110490d0020022001200141" + "036a417c7122076b22096a220b4103712104410021064100210302402001200746" + "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" + "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" + "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" + "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" + "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" + "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" + "21060b200b4102762105200620036a21060340200721042005450d04200541c001" + "200541c001491b220b410371210c200b410274210d41002108024020054104490d" + "002004200d41f007716a210941002108200421030340200328020c2207417f7341" + "077620074106767241818284087120032802082207417f73410776200741067672" + "41818284087120032802042207417f734107762007410676724181828408712003" + "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" + "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" + "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" + "04200b41fc01714102746a22082802002203417f73410776200341067672418182" + "8408712103200c4101460d0220082802042207417f734107762007410676724181" + "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" + "767241818284087120036a21030c020b024020020d00410021060c030b20024103" + "71210802400240200241044f0d0041002106410021090c010b4100210620012103" + "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" + "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" + "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" + "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11808080800080808080000f0b2003410876" + "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" + "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" + "02020b20052103410021050c010b20054101762103200541016a41017621050b20" + "0341016a210320002802102109200028021821082000280214210703402003417f" + "6a2203450d022007200920082802101181808080008080808000450d000b41010f" + "0b200028021420012002200028021828020c11808080800080808080000f0b0240" + "200720012002200828020c1180808080008080808000450d0041010f0b41002103" + "0340024020052003470d0020052005490f0b200341016a21032007200920082802" + "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" + "7f23808080800041f0006b220224808080800041002103024020002d0000220420" + "012d0000470d00410121030240024002400240024020040e06050001020304050b" + "20002d000120012d00014621030c040b4100210320002903082205200129030852" + "0d030240024002402005a70e03000102000b200029031020012903105121030c05" + "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" + "41002103200028020c2204200128020c470d0220002802082001280208200410f7" + "808080004521030c020b41002103200028020c2206200128020c470d0120012802" + "08210420002802082100200641016a210103402001417f6a22014521032001450d" + "02200020041094808080002106200441186a2104200041186a210020060d000c02" + "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" + "026420024100360254200241003602442002410036023020024100360220200220" + "01280208220636025c2002200128020422033602582002200636024c2002200336" + "024820022000280208220636023820022000280204220136023420022006360228" + "2002200136022420022004410020031b3602602002200341004722033602502002" + "200336024020022004410020011b36023c20022001410047220336022c20022003" + "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" + "20022802102201450d0120022802142104200241086a2007109580808000200228" + "02082200450d0141002103200128020822062000280208470d01200228020c2108" + "20012802042000280204200610f7808080000d01200420081094808080000d000b" + "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" + "020d00410021020c010b20012002417f6a36022002400240024020012802004101" + "470d0020012802040d01200128020821030240200128020c2202450d0003402003" + "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" + "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" + "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" + "2003280288022205450d03200241016a210220032f019003210420052103200420" + "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" + "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" + "22020d000b410021030b2001200336020c20014100360208200120063602042005" + "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" + "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" + "6b220224808080800041012103024020012802142204419f81c08000410d200128" + "0218220528020c220611808080800080808080000d00024020012d001c4104710d" + "00200441f886c080004103200611808080800080808080000d01200441ac81c080" + "004104200611808080800080808080000d012004418bc2c0800041022006118080" + "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" + "0141c883c080006a280200200611808080800080808080000d012004418187c080" + "0041022006118080808000808080800021030c010b200441fb86c0800041032006" + "11808080800080808080000d002002200536020420022004360200410121032002" + "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" + "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" + "c080006a280200200141c883c080006a2802001097808080000d00410121032002" + "41fe86c0800041021097808080000d002004418087c08000410120061180808080" + "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" + "210320002802042104200028020021052000280208210641002107410021084100" + "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" + "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" + "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" + "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" + "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" + "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" + "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" + "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" + "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" + "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" + "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" + "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" + "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" + "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" + "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" + "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" + "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" + "070b20070b4901017f410021010240024020004100480d00024020000d00410121" + "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" + "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" + "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" + "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" + "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" + "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b742107410021060340" + "02402005220528020441787122082002490d00200820026b220820014f0d002008" + "21012005210620080d004100210120052106200521000c040b2005280214220820" + "00200820052007411d764104716a41106a2802002205471b200020081b21002007" + "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" + "6a41f803712000410b491b22024103762201762200410371450d00024002402000" + "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" + "6a28020022022802082206460d002006200136020c200120063602080c010b4100" + "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" + "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" + "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" + "80006a280200220628020441787120026b21012006210503400240200628021022" + "000d00200628021422000d0020052802182104024002400240200528020c220020" + "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" + "20052802082206200036020c200020063602080c010b200541146a200541106a20" + "001b21070340200721082006220041146a200041106a200028021422061b210720" + "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" + "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" + "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" + "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" + "41787120026b22062001200620014922061b21012000200520061b210520002106" + "0c000b0b02400240200020017441022001742200410020006b7271682208410374" + "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" + "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" + "000b20002002410372360204200020026a2207200120026b220641017236020420" + "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" + "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" + "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" + "200128020821050b200120023602082005200236020c2002200136020c20022005" + "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" + "20002004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b02400240024020" + "014110490d0020052002410372360204200520026a220220014101723602042002" + "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" + "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" + "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" + "020821070b200620003602082007200036020c2000200636020c20002007360208" + "0c010b2005200120026a2200410372360204200520006a22002000280204410172" + "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" + "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" + "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" + "20062000280204417871220520026b220820014922041b21032005200249210720" + "08200120041b21080240200028021022050d00200028021421050b200620032007" + "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" + "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" + "400240200628020c22002006470d00200641144110200628021422001b6a280200" + "22050d01410021000c020b20062802082205200036020c200020053602080c010b" + "200641146a200641106a20001b21070340200721082005220041146a200041106a" + "200028021422051b210720004114411020051b6a28020022050d000b2008410036" + "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" + "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" + "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" + "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" + "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" + "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" + "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" + "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" + "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" + "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" + "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" + "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" + "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" + "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" + "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" + "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" + "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" + "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" + "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" + "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" + "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" + "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" + "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" + "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" + "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" + "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" + "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" + "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" + "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" + "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" + "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" + "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" + "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" + "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" + "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" + "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" + "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" + "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" + "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" + "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" + "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" + "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" + "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" + "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" + "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" + "21000240024002400340200028020022072006460d01200028020822000d000c02" + "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" + "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" + "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" + "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" + "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" + "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" + "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" + "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" + "0d000b20072001460d0720072007280204417e713602042001200720016b220041" + "01723602042007200036020002402000418002490d002001200010e3808080000c" + "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" + "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" + "200628020821000b200620013602082000200136020c2001200636020c20012000" + "3602080c070b200020053602002000200028020420086a36020420052002410372" + "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" + "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" + "4101470d0020012006417871220610a880808000200620026a2102200120066a22" + "0128020421060b20012006417e7136020420002002410172360204200020026a20" + "0236020002402002418002490d002000200210e3808080000c060b200241f80171" + "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" + "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" + "200120003602082002200036020c2000200136020c200020023602080c050b4100" + "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" + "02d4dfc080002006200141017236020420002002410372360204200041086a2101" + "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" + "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" + "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" + "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" + "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" + "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" + "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" + "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" + "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" + "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" + "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" + "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" + "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" + "c080002006200141017236020420002002410372360204200041086a0f0b20010f" + "0b20002004360218024020062802102205450d0020002005360210200520003602" + "180b20062802142205450d0020002005360214200520003602180b024002402001" + "4110490d0020062002410372360204200620026a22002001410172360204200020" + "016a200136020002402001418002490d002000200110e3808080000c020b200141" + "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" + "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" + "21010b200220003602082001200036020c2000200236020c200020013602080c01" + "0b2006200120026a2200410372360204200620006a220020002802044101723602" + "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" + "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" + "04248080808000200441e8006a20002001109d8080800002400240024002400240" + "024002400240024002400240024020042d00684106460d00200441106a200441e8" + "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" + "030020042004290368370300200441e8006a20022003109d8080800020042d0068" + "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" + "003703002004200429036837031841dc81c0800041072004109e80808000220745" + "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" + "04200441186a109e808080002206450d0420062d00004103462205450d05410021" + "092006280208410020051b210502400240200628020c220a0e020c00010b410121" + "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" + "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" + "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" + "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" + "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" + "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" + "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" + "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" + "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" + "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" + "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" + "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" + "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" + "220536023002402005450d00200441003a00370c010b200441013a00370b200441" + "0336026c200441d482c08000360268200442023702742004418180808000360258" + "20044182808080003602502004200441cc006a3602702004200441306a36025420" + "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" + "02400240024041091099808080002205450d00200520042d00373a000020044100" + "360254200442808080801037024c200441033a0088012004412036027820044100" + "360284012004418080c08000360280012004410036027020044100360268200420" + "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" + "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" + "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" + "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" + "3602444104109980808000220b450d032005200a360005200b200a360000200441" + "05360250200441a083c0800036024c200442043702582004418180808000360284" + "01200441818080800036027c200441838080800036027420044184808080003602" + "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" + "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" + "cc006a10a280808000200b41041082808080002009410410828080800020044118" + "6a108a808080002004108a8080800002402003450d00200220031082808080000b" + "02402001450d00200020011082808080000b20044190016a24808080800020050f" + "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" + "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" + "808000000bea0301057f23808080800041e0006b22032480808080002003410036" + "0228200320023602242003200136022020034180013a002c2003410036021c2003" + "428080808010370214200341c8006a200341146a10e88080800002400240024002" + "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" + "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" + "03483703300240024020032802282202200328022422064f0d0020032802202107" + "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" + "022006200241016a2202470d000b200320063602280b2000200329033037030020" + "0041106a2004290300370300200041086a20052903003703002003280214220245" + "0d04200328021820021082808080000c040b20032002360228200341086a200720" + "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" + "0328020c21012003280208210641141099808080002202450d012002200636020c" + "2002411636020020002002360204200041063a000020022001360210200341306a" + "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" + "2802142202450d00200328021820021082808080000b200341e0006a2480808080" + "000be60101077f41002103024020022d00004105470d0020022802042204450d00" + "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" + "08024002400340024020070d00200621080c020b20022802082103200228020421" + "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" + "012003491b10f7808080002209200120036b20091b220341004720034100481b22" + "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" + "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" + "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" + "2005200036020820052003360214200520023602102005410236021c200541e486" + "c08000360218200542023702242005418580808000ad422086200541106aad8437" + "03382005418680808000ad422086200541086aad843703302005200541306a3602" + "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" + "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" + "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" + "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" + "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" + "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" + "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" + "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" + "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" + "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" + "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" + "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" + "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" + "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" + "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" + "420021024117200441ff0171764101710d01200128021c22032802002100024020" + "0341046a28020022042802002205450d002000200511828080800080808080000b" + "024020042802042204450d00200020041082808080000b2003410c108280808000" + "410421030c010b200441ff01714104460d032001290318220642807e8321022006" + "a721030b200128021022002000280208417f6a2204360208024020040d00200041" + "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" + "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" + "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" + "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" + "36022c20014190c2c08000360228200142023702342001418780808000ad422086" + "200141106aad843703202001418680808000ad422086200141086aad8437031820" + "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" + "808080800041206b2200248080808000200041003602182000410136020c200041" + "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" + "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" + "0200370300200241086a200041086a290200370300200241013b011c2002200136" + "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" + "012000417c6a280200220241787122006a21030240024020024101710d00200241" + "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" + "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" + "280204417e7136020420012000410172360204200320003602000f0b2001200210" + "a8808080000b024002400240024002400240200328020422024102710d00200341" + "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a200036020020" + "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" + "36020420012000410172360204200120006a20003602000b2000418002490d0220" + "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" + "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" + "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" + "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" + "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" + "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" + "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" + "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" + "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" + "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" + "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" + "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" + "8000200321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" + "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" + "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" + "23808080800041206b220324808080800020034100360210200341013602042003" + "42043702082003200136021c200320003602182003200341186a36020020032002" + "10a480808000000b840601057f0240024002402000417c6a220328020022044178" + "71220541044108200441037122061b20016a490d0002402006450d002005200141" + "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" + "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" + "0b200041786a220720056a21060240024002400240200520014f0d002006410028" + "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" + "0d042004417871220420056a22052001490d042006200410a88080800020052001" + "6b22024110490d0120032001200328020041017172410272360200200720016a22" + "012002410372360204200720056a220520052802044101723602042001200210a9" + "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" + "360200200720016a22052002410372360204200620062802044101723602042005" + "200210a98080800020000f0b200320052003280200410171724102723602002007" + "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" + "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" + "0272360200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236020420" + "0720056a2205200236020020052005280204417e713602040b410020013602d0df" + "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" + "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" + "28020022014103711b20014178716a2201200220012002491b10fa808080002102" + "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" + "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" + "0441017172410272360200200720016a2202200520016b22054101723602044100" + "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" + "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" + "20013602c8dfc0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a8808080000b02400240024002402002280204" + "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" + "0d0320022003417871220310a8808080002000200320016a220141017236020420" + "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" + "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" + "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" + "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" + "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" + "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" + "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" + "7902017f017e23808080800041306b220324808080800020032001360204200320" + "003602002003410236020c200341cc85c080003602082003420237021420034181" + "80808000ad42208622042003ad8437032820032004200341046aad843703202003" + "200341206a360210200341086a200210a480808000000b5d01027f238080808000" + "41206b220124808080800020002802182102200141106a200041106a2902003703" + "00200141086a200041086a2902003703002001200036021c200120023602182001" + "2000290200370300200110e480808000000b490002402002418080c400460d0020" + "00200220012802101181808080008080808000450d0041010f0b024020030d0041" + "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" + "808080800041306b22032480808080002003200036020020032001360204200341" + "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" + "862204200341046aad84370328200320042003ad843703202003200341206a3602" + "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" + "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" + "00360214200320013602102003410236021c200341dc85c0800036021802402002" + "2802000d002003410336025c2003419086c0800036025820034203370264200341" + "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" + "03402003418680808000ad422086200341186aad843703382003200341386a3602" + "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" + "6a290200370300200341206a41086a200241086a29020037030020032002290200" + "3703202003410436025c200341c486c08000360258200342043702642003418580" + "808000ad4220862204200341106aad8437035020032004200341086aad84370348" + "2003418880808000ad422086200341206aad843703402003418680808000ad4220" + "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" + "10a480808000000b1c0020002802002001200028020428020c1181808080008080" + "8080000b14002001200028020020002802041093808080000b1400200128021420" + "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" + "8000200341033a002c2003412036021c4100210420034100360228200320013602" + "2420032000360220200341003602142003410036020c0240024002400240024020" + "0228021022050d00200228020c2200450d01200228020821012000410374210620" + "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" + "02002207450d00200328022020002802002007200328022428020c118080808000" + "80808080000d040b20012802002003410c6a200128020411818080800080808080" + "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" + "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" + "02082109200228020021004100210603400240200041046a2802002201450d0020" + "0328022020002802002001200328022428020c11808080800080808080000d030b" + "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" + "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" + "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" + "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" + "0c200141046a280200210702400240024020012802000e03010002010b20074103" + "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" + "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" + "200128020411818080800080808080000d02200041086a21002008200641206a22" + "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" + "012802002001280204200328022428020c1180808080008080808000450d010b41" + "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" + "8080004180016b22022480808080000240024002400240200128021c2203411071" + "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" + "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" + "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" + "ff00210303402002200322046a22052000410f712203413072200341376a200341" + "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" + "02402004418101490d002004418001419887c08000108580808000000b20014101" + "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" + "04418101490d002004418001419887c08000108580808000000b2001410141a887" + "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" + "8080800020000b2200200128021441c284c08000410e200128021828020c118080" + "80800080808080000b6001017f23808080800041306b2200248080808000200041" + "0136020c200041e484c08000360208200042013702142000418980808000ad4220" + "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" + "a480808000000b7902017f017e23808080800041306b2203248080808000200320" + "00360200200320013602042003410236020c200341f08ac0800036020820034202" + "3702142003418180808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" + "7f23808080800041306b22032480808080002003200136020c2003200036020820" + "034101360214200341f0bac080003602102003420137021c2003418680808000ad" + "422086200341086aad843703282003200341286a360218200341106a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" + "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" + "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" + "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241849cc080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" + "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" + "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" + "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" + "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" + "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" + "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" + "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" + "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" + "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" + "0010a080808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641808dc0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541888ec080003602302005420537023c20054186" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" + "2086200541246aad843703502005418180808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541c88ec080003602302005420337023c2005" + "418680808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418180808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541a88dc080003602302005420437023c2005418680" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" + "000d00200128021441b084c080004102200128021828020c118080808000808080" + "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111818080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111818080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11808080800080808080000d010b2004412720011181808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" + "400240024041c8031099808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" + "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "fa80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" + "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" + "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" + "0020002802002100200241003602482002428080808010370240200241033a006c" + "2002412036025c2002410036026820024198a5c080003602642002410036025420" + "02410036024c2002200241c0006a36026002400240024002400240024002400240" + "024002400240024002400240024002400240024002400240024002400240024002" + "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" + "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" + "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" + "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" + "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" + "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" + "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" + "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" + "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" + "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" + "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" + "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" + "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" + "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" + "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" + "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" + "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" + "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" + "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" + "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" + "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" + "0330200241818080800036022c20024181808080003602242002418c8080800036" + "021c20024104360204200241a8abc080003602002002420337020c200220004110" + "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" + "0820012802142001280218200210b2808080002100024020022802302201450d00" + "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" + "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" + "017f23808080800041c0006b220224808080800002400240024002400240024020" + "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" + "141099808080002200450d04200041106a410028009cc5c0800036000020004108" + "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" + "102002200036020c200241143602082002410336022c200241bcc1c08000360228" + "200242023702342002418d80808000ad422086200241046aad843703202002418e" + "80808000ad422086200241086aad843703182002200241186a3602302001280214" + "2001280218200241286a10b280808000210020022802082201450d03200228020c" + "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" + "360228200242013702342002418680808000ad422086200241186aad8437030820" + "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" + "02003602182002200241086a36023020012802142001280218200241286a10b280" + "80800021000c020b20012000280204220028020020002802041093808080002100" + "0c010b200028020422002802002001200028020428021011818080800080808080" + "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" + "41106b220224808080800020002802082103200028020421044101210502402001" + "2802142206412220012802182207280210220811818080800080808080000d0002" + "40024020030d0041002103410021000c010b410021094100210a2004210b200321" + "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" + "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" + "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" + "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" + "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" + "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" + "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" + "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" + "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" + "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" + "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" + "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" + "06200420096a200020096b200728020c220e11808080800080808080000d010240" + "024020022d0004418001470d002006200228020820081181808080008080808000" + "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" + "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" + "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" + "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" + "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" + "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" + "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" + "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" + "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" + "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" + "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" + "0c11808080800080808080000d0020064122200811818080800080808080002105" + "0b200241106a24808080800020050b870102017c017e0240024002402001280200" + "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" + "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" + "00370308200041023a0000200020012903083703100f0b200041023a0000200020" + "01290308220337031020002003423f883703080be411020b7f027e238080808000" + "41c0016b2204248080808000024002400240024002400240024002400240024002" + "400240024020012802002205450d00200228020821062002280204210720012802" + "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" + "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" + "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" + "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" + "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" + "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" + "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" + "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" + "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" + "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" + "2009200d36028c0220014280808080103702042001200936020020092003290300" + "370300200941086a200341086a290300370300200941106a200341106a29030037" + "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" + "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" + "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" + "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" + "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" + "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" + "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" + "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" + "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" + "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" + "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" + "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" + "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" + "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" + "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" + "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" + "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" + "030037020020042004290388013702602004200536020820042006360278200828" + "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" + "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" + "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" + "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" + "106a290300370300200b2003290300370300200b41086a200341086a2903003703" + "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" + "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" + "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" + "3602302004200429025c37023c024002400240200528028802220b0d004100210c" + "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" + "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" + "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" + "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" + "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" + "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" + "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" + "05200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" + "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" + "0d200441306a200e200910c080808000200428028801210d200441086a20074124" + "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" + "042802b0012105200d418080808078460d032004200d3602302008200441086a41" + "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" + "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" + "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" + "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" + "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" + "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" + "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" + "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" + "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" + "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" + "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" + "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" + "00200041106a200941106a220d290300370300200041086a200941086a220b2903" + "0037030020092003290300370300200b200341086a290300370300200d20034110" + "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" + "400240024020022003490d00410121044100210520034101480d04200120036a21" + "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" + "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" + "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" + "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" + "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" + "00736b20087241808182847871418081828478460d010b200120076a21060c040b" + "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" + "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" + "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" + "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" + "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" + "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" + "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" + "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" + "808080800002400240024002400240024002400240024003400240024020012802" + "08220420012802042205460d00024002400240200420054f0d0020012802002206" + "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" + "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" + "002001200a20086a360208200110c9808080002001280204210520012802082107" + "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" + "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" + "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" + "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" + "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" + "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" + "1a200328020c210b2003280208210941141099808080002207450d052007200936" + "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" + "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" + "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" + "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" + "0741016a360208200341286a20012002280204200228020810cb80808000200328" + "02282207450d032000200328022c3602080c040b2001200741016a220736020820" + "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" + "2003280210210941141099808080002207450d052007200936020c200741103602" + "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" + "002002200b20046a200720046b10ca808080002001200741016a22093602080240" + "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" + "1a2003280224210b2003280220210941141099808080002207450d062007410436" + "02000c090b2001200741026a220436020802400240024002400240024002400240" + "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" + "074122460d032007412f460d04200741dc00470d02024020022802082207200228" + "0200470d002002108f808080000b2002200741016a360208200228020420076a41" + "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" + "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" + "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" + "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" + "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" + "0240200228020822072002280200470d002002108f808080000b2002200741016a" + "360208200228020420076a412f3a0000410021070c060b02402002280208220720" + "02280200470d002002108f808080000b2002200741016a36020820022802042007" + "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" + "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" + "0c040b0240200228020822072002280200470d002002108f808080000b20022007" + "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" + "22072002280200470d002002108f808080000b2002200741016a36020820022802" + "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" + "2002108f808080000b2002200741016a360208200228020420076a41093a000041" + "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" + "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" + "0020073602040c060b20072004490d022001200741016a360208200341286a2001" + "200b20046a200720046b10cb808080000240024020032802282207450d00200020" + "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" + "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" + "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" + "02360200200020073602040b200341306a2480808080000b5301047f0240200028" + "02082201200028020422024f0d00200028020021030340200320016a2d00002204" + "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" + "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" + "200020032002109080808000200028020821030b200028020420036a2001200210" + "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" + "24808080800002402003450d004100200341796a2205200520034b1b2106200241" + "036a417c7120026b21074100210503400240024002400240200220056a2d000022" + "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" + "2208280204200828020072418081828478710d03200541086a22052006490d000c" + "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" + "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" + "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" + "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" + "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" + "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" + "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" + "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" + "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" + "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" + "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" + "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" + "0428020c210520042802082108024041141099808080002203450d002003200836" + "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" + "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" + "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" + "360204200441106a2480808080000be20601057f23808080800041206b22022480" + "80808000200241146a200010cd808080000240024020022f01140d000240024002" + "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" + "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" + "022d0015210420002000280208220541016a360208200441dc00470d0320024114" + "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" + "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" + "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" + "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" + "020822006b41034b0d00200120004104109080808000200128020821000b200120" + "0041046a360208200128020420006a2200200341127641f001723a000020004103" + "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" + "03410c76413f71418001723a0001410021000c070b200220002802002000280204" + "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" + "210341141099808080002200450d042000200336020c2000411436020020002001" + "3602100c060b200241086a20002802002000280204200028020810c78080800041" + "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" + "450d032000200336020c20004114360200200020013602100c050b200241173602" + "142000200241146a10cf8080800021000c040b200241173602142000200241146a" + "10cf8080800021000c030b0240024002402003418001490d000240200128020020" + "0128020822046b41034b0d00200120044104109080808000200128020821040b20" + "0128020420046a210020034180104f0d0120034106764140722106410221050c02" + "0b0240200128020822002001280200470d002001108f808080000b200120004101" + "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" + "71418001723a00012003410c764160722106410321050b200020063a0000200120" + "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" + "0b000b200228021821000b200241206a24808080800020000b910301057f238080" + "80800041106b220224808080800002400240024002402001280204220320012802" + "082204490d000240200320046b41034b0d0020012003360208200241086a200128" + "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" + "08210441141099808080002201450d022001200436020c20014104360200200020" + "01360204200120033602100c030b2001200441046a220536020802402001280200" + "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" + "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" + "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" + "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" + "99808080002201450d022001200436020c2001410c360200200020013602042001" + "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" + "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" + "0101037f23808080800041106b2202248080808000024002400240200128020822" + "0320012802042204490d00200241086a20012802002004200310c7808080004100" + "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" + "0d022001200436020c200141043602002000200136020420012003360210410121" + "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" + "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" + "808000200241086a20002802002000280204200028020810c78080800041002d00" + "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" + "00000b2000200436020c2000200129020037020020002003360210200041086a20" + "0141086a280200360200200241106a24808080800020000b1f0002402001280204" + "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" + "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" + "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" + "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" + "020820002003200120031b36020420002003453602000b9f0202047f017e238080" + "80800041206b2206248080808000024002400240200220036a220320024f0d0041" + "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" + "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" + "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" + "080d00410021020c010b2006200820056c36021c20062001280204360214200421" + "020b20062002360218200641086a20042009200641146a10d18080800002402006" + "2802080d00200628020c2102200120073602002001200236020441818080807821" + "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" + "360200200641206a2480808080000b5901017f23808080800041106b2201248080" + "808000200141086a2000200028020041014108411810d280808000024020012802" + "082200418180808078460d002000200128020c109a80808000000b200141106a24" + "80808080000b4701017f23808080800041206b2200248080808000200041003602" + "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" + "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" + "0020014102360210200142818080801037030041002903a0dcc080002102034020" + "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" + "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" + "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" + "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" + "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" + "01027f024020002802104101470d002000280214220141003a0000200028021822" + "02450d00200120021082808080000b02402000417f460d00200020002802042201" + "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" + "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" + "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" + "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" + "0b14002001200028020420002802081093808080000b7001037f20002802042101" + "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" + "200141046a28020022022802002203450d00200020031182808080008080808000" + "0b024020022802042202450d00200020021082808080000b2001410c1082808080" + "000b0bf10101027f23808080800041206b22002480808080000240024002400240" + "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" + "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" + "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" + "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" + "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" + "003602182000410136020c200041d8c5c080003602082000420437021020004108" + "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" + "808080000240024002400240024020012802100d002001417f3602102003410020" + "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" + "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" + "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" + "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" + "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" + "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" + "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" + "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" + "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" + "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" + "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" + "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" + "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" + "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" + "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" + "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" + "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" + "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" + "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" + "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" + "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" + "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" + "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" + "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" + "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" + "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" + "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" + "200220066a210502402001280214200320066b22064b0d002000200141146a2005" + "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" + "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" + "2480808080000b7101027f20012802002104024020012802082205450d00200420" + "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" + "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" + "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" + "8080800041106b2203248080808000200341086a20002802082802002001200210" + "dc80808000024020032d000822024104460d002000280204210420032903082105" + "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" + "200441046a28020022062802002207450d00200120071182808080008080808000" + "0b024020062802042206450d00200120061082808080000b2004410c1082808080" + "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" + "7e037f23808080800041106b220224808080800020024100360204024002400240" + "02402001418001490d002001418010490d012001418080044f0d0220022001413f" + "71418001723a000620022001410c7641e001723a000420022001410676413f7141" + "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" + "71418001723a00052002200141067641c001723a0004410221010c010b20022001" + "413f71418001723a00072002200141127641f001723a000420022001410676413f" + "71418001723a000620022001410c76413f71418001723a0005410421010b200241" + "086a2000280208280200200241046a200110dc80808000024020022d0008220141" + "04460d0020002802042103200229030821040240024020002d0000220541044b0d" + "0020054103470d010b200328020021050240200341046a28020022062802002207" + "450d002005200711828080800080808080000b024020062802042206450d002005" + "20061082808080000b2003410c1082808080000b200020043702000b200241106a" + "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" + "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" + "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" + "800041012002742204710d0020032000360200200020033602182000200036020c" + "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" + "400240200328020022042802044178712001470d00200421020c010b2001410041" + "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" + "052802002202450d02200341017421032002210420022802044178712001470d00" + "0b0b20022802082203200036020c20022000360208200041003602182000200236" + "020c200020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" + "2201248080808000200028020c2102024002400240024020002802040e02000102" + "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" + "0228020021020c010b20014180808080783602002001200036020c2001418f8080" + "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" + "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" + "8000000b990101027f23808080800041106b22042480808080004100410028029c" + "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" + "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" + "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" + "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" + "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" + "0128020c2103024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f8006a200320052005200441016a220420" + "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" + "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" + "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241c0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" + "1099808080002206450d1d2006200836020c20064105360200200620043602100c" + "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" + "dbc080001a200228025421042002280250210841141099808080002206450d1c20" + "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" + "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" + "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" + "200228024c21042002280248210841141099808080002206450d1a200620083602" + "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" + "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" + "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" + "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" + "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" + "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" + "3b000120042007360204200441106a2003290300370300200441036a20052d0000" + "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" + "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" + "3a0000200420083602100c160b200628020021030b200241386a20032005200520" + "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" + "21042002280238210841141099808080002206450d152006200836020c20064102" + "360200200620043602100b200241a8026a108c80808000024020022802a8022204" + "450d002009200441186c1082808080000b200128020c2103200128021421042001" + "280210210541062107410121090b200120012d001841016a3a0018024002402004" + "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" + "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" + "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" + "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" + "0228021c21082002280218210541141099808080002204450d1b20044116360200" + "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" + "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" + "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" + "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" + "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" + "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" + "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228023421082002280230210541141099808080002204450d18200441" + "153602000c040b200241286a200320052005200441016a220420052004491b10c7" + "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" + "8080002204450d17200441163602000c030b2001200441016a2204360214200520" + "04470d000b200521040b200241206a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" + "1099808080002204450d14200441023602000b2004200536020c20042008360210" + "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" + "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" + "808080000c100b41062107200241063a0080012002200636028401200410e98080" + "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" + "00e0dbc080001a200228021421082002280210210141141099808080002204450d" + "122004200136020c2004411836020020002004360204200041063a000020042008" + "3602100c110b200141003602082001200441016a360214200241b8016a20062001" + "10c88080800020022802bc0121080240024020022802b80122054102460d002002" + "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" + "014106460d112000200229038001370300200041106a20024180016a41106a2903" + "00370300200041086a20024180016a41086a2903003703000c130b410021010240" + "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" + "1a20042105200410998080800022010d02410121010b20012004109a8080800000" + "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" + "200410fa808080003602002002200536028401200241033a008001200220043602" + "8c01200041106a20024180016a41106a290300370300200041086a200329030037" + "030020002002290380013703000c100b2001200441016a36021420024198016a20" + "01410010eb8080800002402002290398014203510d0020024180016a2002419801" + "6a10c580808000024020022d0080014106460d0020002002290380013703002000" + "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" + "03003703000c110b20022802840120011080808080002104200041063a00002000" + "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" + "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" + "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" + "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" + "0d04200241086a200320052005200441016a220420052004491b10c78080800041" + "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" + "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" + "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" + "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" + "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" + "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" + "0300200041086a20024180016a41086a290300370300200041106a20024180016a" + "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" + "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" + "3b0180012000200229038001370300200041086a20024180016a41086a29030037" + "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" + "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" + "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" + "210d410021064100210c024002400240024020022802f80122044180808080786a" + "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" + "20024100360284022002200e3702ac02200220043602a80220024190026a200241" + "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" + "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" + "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" + "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" + "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" + "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" + "2005450d07200320051082808080000c070b200820022903f80237020020084110" + "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" + "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" + "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" + "41186a280200360200200220022902b8013703a802200220053602c4022002200e" + "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" + "0300200241d0026a41086a200441086a290200370300200220042902003703d002" + "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" + "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" + "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" + "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" + "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" + "038001370300200041106a20024180016a41106a290300370300200041086a2002" + "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" + "0041063a0000200020043602040c090b200020022802b001360204200041063a00" + "000c080b20022802940221062004450d00200ea720041082808080000b20024184" + "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" + "28020c21030240024020012802142204200128021022054f0d0003400240024002" + "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" + "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" + "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" + "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" + "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" + "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" + "7421082002280270210541141099808080002204450d0a200441153602000c040b" + "2001200441016a3602140240200d450d0041062107200241063a00800120022006" + "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" + "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" + "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" + "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" + "80001a200228026c21082002280268210541141099808080002204450d06200441" + "033602000b2004200536020c20042008360210200220073a00b801200220022f00" + "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" + "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" + "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" + "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" + "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" + "5c21082002280258210141141099808080002204450d042004200136020c200441" + "1836020020002004360204200041063a0000200420083602100c030b200741ff01" + "714106470d010b20022802840120011080808080002104200041063a0000200020" + "043602040c010b2000200229038001370300200041106a20024180016a41106a29" + "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" + "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" + "2802082201450d01200028020420011082808080000c010b20002d00044103470d" + "002000280208220128020021020240200128020422032802002204450d00200220" + "0411828080800080808080000b024020032802042203450d002002200310828080" + "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" + "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" + "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" + "808000000b20042001200210fa8080800021012000200236020c20002001360208" + "20002003360204200041033a00000b950502067f017e23808080800041306b2203" + "248080808000200128020c21040240024002400240024002402001280214220520" + "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" + "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" + "200020012002420010ef808080000c050b200341186a20042006200510c7808080" + "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" + "2201450d022001200436020c200141053602002000200136020820004203370300" + "200120073602100c040b200341086a200420062006200541026a22012006200149" + "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" + "1099808080002201450d012001200436020c2001410d3602002000200136020820" + "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" + "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" + "2003280210210441141099808080002201450d012001200436020c2001410d3602" + "002000200136020820004203370300200120073602100c030b200841506aad42ff" + "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" + "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" + "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" + "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" + "80000240024020032802200d00200020032b0328390308420021090c010b200020" + "03280224360208420321090b200020093703000c020b000b200020012002200910" + "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" + "032480808080002000280214220420002802102205200420054b1b210620002802" + "0c210702400240024002400340024020020d00410021040c050b20062004460d01" + "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" + "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" + "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" + "99808080002204450d01200441093602000c020b200320072005200610c7808080" + "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" + "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" + "0341106a24808080800020040bae0201047f23808080800041106b220224808080" + "8000200241046a200110f680808000024002400240024020022d00040d00024020" + "022d00050d0020004180808080783602000c040b41002103200128020022014100" + "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" + "002002280208210420022802044102460d010240200228020c22014100480d0002" + "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" + "998080800022030d03410121030b20032001109a80808000000b20002002280208" + "36020420004181808080783602000c020b20004181808080783602002000200436" + "02040c010b20032004200110fa8080800021042000200136020820002004360204" + "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" + "6b22022480808080002001280200220328020c2104024002400240024002402003" + "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" + "220741174b0d024101200774419380800471450d022003200141016a2201360214" + "20052001470d000b200521010b200241086a200420052005200141016a22012005" + "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" + "0541141099808080002201450d03200141033602000c010b02402006413a470d00" + "2003200141016a3602142000200310e8808080000c020b20022004200520052001" + "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" + "072002280200210541141099808080002201450d02200141063602000b20012005" + "36020c20002001360204200041063a0000200120073602100b200241106a248080" + "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" + "02400240024002400240024002402001280214220520012802104f0d0020012802" + "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" + "450d02420121060c050b2004200120022003410010f18080800020042802000d02" + "0c030b2004200120022003410010f2808080002004280200450d02200020042802" + "04360208200042033703000c040b420021060240420020037d22074200590d0042" + "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" + "2004280204360208200042033703000c020b20042903082103420021060b200020" + "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" + "0240024020012802102205200128021422064d0d00200641016a2107200520066b" + "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" + "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" + "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" + "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" + "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" + "24808080800020012001280214220641016a220736021402400240024020072001" + "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" + "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" + "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" + "c080001a200528020421062005280200210c41141099808080002207450d072007" + "200c36020c2007410d360200200020073602042000410136020020072006360210" + "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" + "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" + "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" + "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" + "2000200120022003200620046a10f4808080000c020b2000200120022003200710" + "f3808080000c010b200541086a200128020c20082008200641026a220720082007" + "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" + "141099808080002207450d012007200c36020c2007410536020020002007360204" + "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" + "077f23808080800041106b22052480808080004101210620012001280214220741" + "016a220836021402402008200128021022094f0d00410121060240024020012802" + "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" + "140b200128020c210a0240024002400240024002400240200820094f0d00200120" + "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" + "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" + "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" + "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" + "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" + "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" + "0c21012005280208210841141099808080002207450d042007200836020c200741" + "053602002000200736020420004101360200200720013602100c050b2005200a20" + "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" + "41141099808080002207450d032007200836020c2007410d360200200020073602" + "0420004101360200200720013602100c040b200420086a2207411f754180808080" + "7873200720084100482007200448731b21070b2000200120022003200710f38080" + "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" + "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" + "002003ba2106024002400240024002400240024020042004411f7522077320076b" + "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" + "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" + "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" + "062008a321060c040b2005200128020c2001280210200128021410c78080800041" + "002d00e0dbc080001a200528020421072005280200210141141099808080002204" + "450d022004200136020c2004410e36020020002004360204200420073602100c01" + "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" + "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" + "280208210141141099808080002204450d012004200136020c2004410e36020020" + "002004360204200420073602100b410121040c020b000b2000200620069a20021b" + "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" + "024020012802142205200128021022064f0d00200128020c210702400340200720" + "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" + "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" + "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" + "0041106b220524808080800002400240024002402004450d002003450d010b2001" + "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" + "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" + "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" + "c080001a200528020c210120052802082103024041141099808080002204450d00" + "2004200336020c2004410e3602002000200436020420042001360210410121040c" + "020b000b200044000000000000000044000000000000008020021b390308410021" + "040b20002004360200200541106a2480808080000bb40701077f23808080800041" + "306b22022480808080002001280200220328020c21040240024002400240200328" + "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" + "0841174b0d024101200874419380800471450d022003200541016a220536021420" + "062005470d000b200621050b41012108200241286a200420062006200541016a22" + "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" + "0228210341141099808080002205450d022005200336020c200541033602002000" + "2005360204200520063602100c010b0240200741fd00470d004100210820004100" + "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" + "200320053602140240200520064f0d00034002400240024002400240200420056a" + "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" + "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" + "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" + "28020c21062002280208210341141099808080002205450d092005200336020c20" + "05411136020020002005360204200520063602100c080b200041013a0001410021" + "080c070b41012108200241186a200420062006200541016a220520062005491b10" + "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" + "808080002205450d072005200336020c2005411536020020002005360204200520" + "063602100c060b2003200541016a220536021420062005470d000b200621050b41" + "012108200241106a200420062006200541016a220520062005491b10c780808000" + "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" + "05450d042005200336020c2005410536020020002005360204200520063602100c" + "030b41002108200141003a0004024020074122460d002002200420062006200541" + "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" + "2002280200210641141099808080002205450d042005200636020c200541113602" + "0020002005360204200520083602100c020b200041013a00010c020b200241206a" + "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" + "022421082002280220210641141099808080002205450d022005200636020c2005" + "410836020020002005360204200520083602100b410121080b200020083a000020" + "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" + "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" + "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" + "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" + "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" + "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" + "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" + "0320076a2207410371450d0020064101480d022007410374220841187121022007" + "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" + "6a2205200820037420012802002208200276723602002001417c6a210120042005" + "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" + "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" + "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" + "20002104200121080340200420082d00003a0000200841016a2108200441016a22" + "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" + "6a2206410371450d0020074101480d012006410374220841187121022006417c71" + "220a41046a2101410020086b4118712103200a2802002108034020052008200276" + "2001280200220820037472360200200141046a2101200541046a22052004490d00" + "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" + "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" + "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" + "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" + "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" + "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" + "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" + "6a210502402004450d0020002103200121060340200320062d00003a0000200641" + "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" + "210302400240200120046a2209410371450d0020084101480d0120094103742206" + "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" + "060340200520062002762001280200220620047472360200200141046a21012005" + "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" + "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" + "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" + "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" + "000bda5b110000000c000000040000001200000013000000140000000000000000" + "00000001000000150000000000000001000000010000001600000063616c6c6564" + "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" + "616c75650017000000040000000400000018000000456d707479496e76616c6964" + "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" + "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" + "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" + "00b00010000a0000002200000033000000b00010000a0000002300000033000000" + "44617461b00010000a0000002500000030000000b00010000a0000002600000024" + "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" + "636f756e746572203d200a000000380110000c000000440110000c000000500110" + "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" + "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" + "0110000c0000008201100014000000960110000800000050011000010000000500" + "00000c0000000b0000000b00000004000000740010007900100085001000900010" + "009b0010006361706163697479206f766572666c6f77000000f001100011000000" + "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" + "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" + "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" + "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" + "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" + "656e20697320206275742074686520696e64657820697320000000970210002000" + "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" + "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" + "10000000ee02100017000000050310000900000020726967687460206661696c65" + "643a200a20206c6566743a20000000de0210001000000028031000100000003803" + "100009000000050310000900000001000000000000000b21100002000000202020" + "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" + "830310001300000066000000170000003078303030313032303330343035303630" + "373038303931303131313231333134313531363137313831393230323132323233" + "323432353236323732383239333033313332333333343335333633373338333934" + "303431343234333434343534363437343834393530353135323533353435353536" + "353735383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738383839" + "3930393139323933393439353936393739383939636f72652f7372632f666d742f" + "6d6f642e727366616c736574727565000072041000130000009b09000026000000" + "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" + "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" + "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" + "04100022000000736c69636520696e646578207374617274732061742020627574" + "20656e647320617420004c05100016000000620510000d00000001010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000202020202020202020202" + "020202020202020202020202020202020202020303030303030303030303030303" + "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" + "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" + "93061000040000009706100010000000a7061000010000006279746520696e6465" + "7820206973206e6f742061206368617220626f756e646172793b20697420697320" + "696e7369646520202862797465732029206f66206000c80610000b000000d30610" + "0026000000f9061000080000000107100006000000a70610000100000020697320" + "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" + "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" + "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" + "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" + "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" + "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" + "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" + "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" + "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" + "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" + "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" + "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" + "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" + "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" + "240424042808340b4e43813709160a08183b45390363080930160521031b050140" + "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" + "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" + "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" + "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" + "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" + "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" + "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" + "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" + "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" + "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" + "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" + "540c1d03090736080e040907090780cb250a840600010305050606020706080709" + "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" + "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" + "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" + "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" + "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" + "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" + "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" + "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" + "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" + "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" + "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" + "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" + "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" + "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" + "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" + "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" + "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" + "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" + "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" + "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" + "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" + "2000000050000000280000003f0d1000200000005c000000160000000003000083" + "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" + "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" + "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" + "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" + "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" + "18040109010301052b033c082a180120370101010408040103070a021d013a0101" + "010204080109010a021a010202390104020402020303011e0203010b0239010405" + "010204011402160601013a0101020104080107030a021e013b0101010c01090128" + "010301370101030503010407020b021d013a01020102010301050207020b021c02" + "390201010204080109010a021d0148010401020301010801510102070c08620102" + "090b0749021b0101010101370e01050102050b0124090166040106010202021902" + "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" + "030101750222017603040209010603db0202013a010107010101010208060a0201" + "301f310430070101050128090c0220040202010338010102030101033a08020298" + "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" + "50020001030104011902050197021a120d012608190b2e03300102040202270143" + "06020202020c0108012f01330101030202050201012a020801ee01020104010001" + "0010101000020001e201950500030102050428030401a502000400025003460b31" + "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" + "5f0302010102060102019d010308150239020101010116010e070305c308020301" + "011701510102060101020101020102eb010204060201021b025508020101026a01" + "01010206010165030204010500090102f5010a0201010401900402020401200a28" + "0602040801090602032e0d010200070106010152160207010201027a0603010102" + "0107010148020301010100020b023405050101010001060f00053b0700013f0451" + "010002002e0217000101030405080802071e0494030037043208010e011605010f" + "000701110207010201056401a00700013d04000400076d07006080f0002f727573" + "74632f633266373463336639323861656235303366313562346539656635373738" + "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" + "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" + "000071010000360000002f72757374632f63326637346333663932386165623530" + "3366313562346539656635373738653737663330353862382f6c6962726172792f" + "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" + "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" + "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" + "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" + "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" + "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" + "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" + "686569676874202d20310000004c1110005b000000f003000009000000c8151000" + "5f0000005802000030000000110000000c00000004000000120000001300000014" + "000000000000000000000001000000150000006120446973706c617920696d706c" + "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" + "7065637465646c792f72757374632f633266373463336639323861656235303366" + "313562346539656635373738653737663330353862382f6c6962726172792f616c" + "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" + "00004572726f72454f46207768696c652070617273696e672061206c697374454f" + "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" + "652070617273696e67206120737472696e67454f46207768696c65207061727369" + "6e6720612076616c7565657870656374656420603a60657870656374656420602c" + "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" + "6564206964656e7465787065637465642076616c75656578706563746564206022" + "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" + "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" + "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" + "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" + "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" + "616c75653a206578706563746564206b657920746f2062652061206e756d626572" + "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" + "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" + "20737572726f6761746520696e2068657820657363617065747261696c696e6720" + "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" + "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" + "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" + "200000008d1510000600000093151000080000009b1510000a000000b820100001" + "0000002f72757374632f6332663734633366393238616562353033663135623465" + "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" + "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" + "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" + "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" + "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" + "7372632f726561642e727300581610005f000000a001000045000000581610005f" + "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" + "0000fa01000013000000581610005f000000030200003e000000581610005f0000" + "00ff01000033000000581610005f000000090200003a000000581610005f000000" + "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" + "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffff110000000c00000004000000120000001300000014000000" + "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" + "663734633366393238616562353033663135623465396566353737386537376633" + "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" + "7273000000681b10004d0000002301000042000000000000000000000004000000" + "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" + "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" + "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" + "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" + "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" + "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" + "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" + "73206e6f7420706f737369626c6520616674657220746865207468726561642773" + "206c6f63616c206461746120686173206265656e2064657374726f796564737464" + "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" + "00006661696c656420746f2067656e657261746520756e69717565207468726561" + "642049443a2062697473706163652065786861757374656400201d100037000000" + "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" + "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" + "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" + "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" + "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" + "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" + "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" + "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" + "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" + "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" + "6f742061206469726563746f727969732061206469726563746f72796469726563" + "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" + "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" + "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" + "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" + "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" + "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" + "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" + "657265736f75726365206275737965786563757461626c652066696c6520627573" + "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" + "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" + "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" + "6e746572727570746564756e737570706f72746564756e65787065637465642065" + "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" + "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" + "00000100000000000000ad2010000b000000b8201000010000007374642f737263" + "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" + "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" + "000000d4201000130000005d040000090000007374646f75747374642f7372632f" + "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" + "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" + "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" + "211000560000003621100011000000280700001500000063616e6e6f7420726563" + "7572736976656c792061637175697265206d75746578b821100020000000737464" + "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" + "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" + "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" + "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" + "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" + "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" + "6564207265637572736976656c79a0221000380000001000000011000000120000" + "00100000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e00000013000000260000003800000019" + "000000170000000c000000090000000a0000001000000017000000190000000e00" + "00000d00000014000000080000001b0000000e0000001000000016000000150000" + "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" + "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" + "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" + "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" + "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" + "612010006c201000822010008f2010009a201000000000000000f03f0000000000" + "00244000000000000059400000000000408f40000000000088c34000000000006a" + "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" + "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" + "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" + "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" + "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" + "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" + "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" + "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" + "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" + "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" + "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" + "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" + "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" + "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" + "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" + "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" + "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" + "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" + "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" + "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" + "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" + "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" + "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" + "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" + "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" + "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" + "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" + "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" + "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" + "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" + "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" + "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" + "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" + "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" + "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" + "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" + "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" + "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" + "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" + "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" + "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" + "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" + "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" + "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" + "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" + "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" + "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" + "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" + "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" + "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" + "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" + "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" + "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" + "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" + "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" + "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" + "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" + "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" + "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" + "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" + "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" + "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" + "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" + "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" + "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" + "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" + "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" + "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" + "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" + "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" + "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" + "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" + "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" + "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" + "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" + "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" + "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" + "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" + "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" + "302475382447542433666d74313768346234323333323664643863616231354504" + "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" + "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" + "313768663931613361666538376231643434334506385f5a4e34636f726533666d" + "7439466f726d617474657231327061645f696e74656772616c3137686334656130" + "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" + "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" + "24666f7224753230247533322447542433666d7431376835353339386231363535" + "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" + "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" + "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" + "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" + "726f722e2e4572726f722447542431376866383763386436646339616234626335" + "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" + "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" + "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" + "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" + "4d6170244c54244b24432456244324412447542424753230246173247532302463" + "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" + "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" + "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" + "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" + "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" + "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866376165323835356232343964" + "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "475424313077726974655f63686172313768323134333931636238656231353263" + "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" + "5424432441244754243867726f775f6f6e65313768363666383634616630346265" + "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" + "5f616e645f68616e646c653137683766656665376563326164336435616245115d" + "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" + "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" + "6974655f737472313768353939643965353738393436646439384512595f5a4e36" + "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" + "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" + "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" + "39466f726d61747465723370616431376834373639616533383933373463633531" + "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" + "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" + "6c4571244754243265713137683162323138393234373831393663383045158b01" + "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" + "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" + "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" + "722e2e4974657261746f7224475424346e65787431376835363664323036316535" + "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" + "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" + "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" + "6c646572732e2e50616441646170746572247532302461732475323024636f7265" + "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" + "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" + "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" + "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" + "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" + "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" + "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" + "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" + "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" + "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" + "726536726573756c743133756e777261705f6661696c6564313768663839396364" + "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" + "7261705f6661696c6564313768333535313964653938613737363134664521625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "7533322447542433666d743137686266336530323238343833653337356145222b" + "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" + "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" + "7061636974795f6f766572666c6f77313768343939643438326139656435373135" + "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" + "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" + "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" + "6e69636b696e673570616e69633137683034656562393137646439336332323945" + "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" + "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" + "54243133646973706f73655f6368756e6b31376836653063636364343538363537" + "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" + "6f756e64735f636865636b31376833643662386161346338303439363632452b11" + "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" + "6f726d617474657231327061645f696e74656772616c313277726974655f707265" + "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" + "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" + "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" + "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" + "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" + "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768336136626161316262343761643230344530495f5a4e34" + "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" + "2e446973706c61792447542433666d743137683766663464306238363039633234" + "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" + "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363861336538653530396361666336344532265f5a4e34" + "636f726533666d7435777269746531376839333535346534626537316632633761" + "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" + "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" + "322447542433666d7431376835353339386231363535306435323765452e323534" + "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" + "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" + "47542433666d74313768313564336433343334626464636363384535395f5a4e34" + "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" + "313768333134623532613162633436626665344536405f5a4e34636f726535736c" + "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" + "74696f6e31336578706563745f6661696c65643137686630386139396532643733" + "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" + "4c5424696d706c2475323024636861722447542431366573636170655f64656275" + "675f657874313768656366613566303431373437393039384539345f5a4e34636f" + "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" + "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" + "655f6572726f725f6661696c31376862303364323439386438646362363433453b" + "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" + "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" + "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" + "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" + "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" + "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376865613566643964626339343936626665453e625f" + "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" + "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" + "6933322447542433666d7431376863656439306337613633396330316464453fce" + "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" + "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" + "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" + "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" + "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" + "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" + "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" + "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" + "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" + "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" + "696e736572745f6669743137686338613063663533396566663031313145419202" + "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" + "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" + "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" + "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" + "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" + "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" + "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" + "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" + "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" + "742e2e44656275672447542433666d743137683430323537643666343265323962" + "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" + "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" + "2447542433666d74313768393032373163376232613663653833394544575f5a4e" + "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" + "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" + "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" + "6f6e32646531325061727365724e756d6265723576697369743137683836623839" + "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" + "4324412447542436696e7365727431376834643164623464613838343264346665" + "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" + "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" + "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" + "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" + "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" + "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" + "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" + "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" + "7665633136566563244c54245424432441244754243137657874656e645f66726f" + "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" + "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" + "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" + "3070617273655f756e69636f64655f657363617065313768393634306663636162" + "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" + "736361706531376834376265353936383535663830346461454e355f5a4e313073" + "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" + "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" + "656164356572726f72313768656635353237643333336339633236664550305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376861333165" + "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" + "3166696e6973685f67726f77313768353338353962613338396237316433354552" + "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" + "54244124475424313467726f775f616d6f7274697a656431376839386333363466" + "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" + "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" + "3137633566643665626336364554395f5a4e337374643674687265616438546872" + "6561644964336e6577396578686175737465643137683333366266376131343838" + "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" + "656c6c244c54245424475424387472795f696e6974313768636536336266323238" + "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" + "5424432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" + "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" + "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" + "2e2e44656275672447542433666d74313768653138373433383865303762666532" + "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" + "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d7431376863653432323661613166373236633163452e3238335a7a" + "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" + "47542431376831363664633631616230333334633165455b495f5a4e3373746434" + "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" + "3130696e697469616c697a6531376837663563353038646139653162303962455c" + "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" + "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" + "243977726974655f616c6c31376832346238323631303436316432353666455d55" + "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" + "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" + "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" + "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" + "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" + "697465244754243977726974655f73747231376837666163663562633065666364" + "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" + "686172313768663062336265316563313964653565374560305f5a4e34636f7265" + "33666d743557726974653977726974655f666d7431376866383830386630646630" + "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" + "6963313250616e69635061796c6f61643661735f73747231376836313439663134" + "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" + "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" + "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" + "745f6261636b747261636531376834646333646534376432323032316239456558" + "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" + "6e646c657232385f24753762242475376224636c6f737572652475376424247537" + "64243137686531376133393737663839633131373845663b5f5a4e337374643970" + "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" + "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" + "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" + "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" + "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638456888015f5a4e313073657264655f" + "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" + "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" + "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" + "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" + "72313876697369745f626f72726f7765645f737472313768343564373131633837" + "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" + "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" + "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" + "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" + "313170617273655f6964656e743137683663353964643731393635353139313045" + "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" + "63657373244c5424522447542424753230246173247532302473657264652e2e64" + "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" + "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" + "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" + "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" + "2431356e6578745f76616c75655f73656564313768656338353637376538303165" + "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" + "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" + "3264653231446573657269616c697a6572244c5424522447542431387061727365" + "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" + "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" + "72244c54245224475424313370617273655f646563696d616c3137683661306333" + "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" + "31446573657269616c697a6572244c54245224475424313470617273655f657870" + "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" + "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" + "542431346636345f66726f6d5f7061727473313768633863316239626161613836" + "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" + "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" + "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" + "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" + "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" + "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" + "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" + "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" + "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" + "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" + "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" + "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" + "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" + "726f64756365727302086c616e6775616765010452757374000c70726f63657373" + "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" + "346333663920323032342d30392d30392900490f7461726765745f666561747572" + "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" + "0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::string escrow_tx_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; + + std::vector escrow_tx_json_data( + escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "02" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(!reValue.first); + BEAST_EXPECT(reValue.second == "1"); + } + } + + { + std::string escrow_lo_json_str = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", + "Data" : "1" + })"; + + std::vector escrow_lo_json_data( + escrow_lo_json_str.begin(), escrow_lo_json_str.end()); + auto re = runEscrowWasmP4( + wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); + if (BEAST_EXPECT(re.has_value())) + { + auto reValue = re.value(); + // std::cout << reValue.first << " " << + // reValue.second + // << std::endl; + BEAST_EXPECT(reValue.first); + BEAST_EXPECT(reValue.second == "0"); + } + } + } + + void + testEscrowWasmP5() + { + testcase("escrow wasm P5 test"); + auto wasmHex = + "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" + "65646765725f73716e0000030201000405017001010105030100100619037f0141" + "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" + "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" + "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" + "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" + "31346765745f6c65646765725f73716e3137686663383539386237646539633036" + "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" + "37346333663920323032342d30392d30392900490f7461726765745f6665617475" + "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" + "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + struct TestLedgerDataProvider : public LedgerDataProvider + { + Env* env; + + public: + TestLedgerDataProvider(Env* env) : env(env) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)env->current()->seq(); + } + }; + Env env{*this}; + TestLedgerDataProvider ledgerDataProvider(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value()); + + env.close(); + env.close(); + env.close(); + env.close(); + + re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value()); + } + + void + testEscrowWasmP6() + { + testcase("escrow wasm P6 test"); + auto wasmHex = + "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" + "6f6e7374496e74000003030201010405017001010105030100100619037f014180" + "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" + "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" + "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" + "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" + "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" + "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" + "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" + "657200550970726f64756365727302086c616e6775616765010452757374000c70" + "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" + "202863326637346333663920323032342d30392d30392900490f7461726765745f" + "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + { + std::string funcName("looping"); + auto re = runEscrowWasm(wasm, funcName, 1000, 500); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re.value().result); + std::cout << re.value().cost << std::endl; + } + } + { + std::string funcName("looping_host"); + auto re = runEscrowWasm(wasm, funcName, 1000, 50); + BEAST_EXPECT(!re.has_value()); + } + } + + void + run() override + { + using namespace test::jtx; + + testWasmtimeLib(); + testEscrowWasmP0(); + testBadWasm(); + testEscrowWasmP1(); + testEscrowWasmP2P3(); + testEscrowWasmP4(); + testEscrowWasmP5(); + testEscrowWasmP6(); + } +}; + +BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index d81551aa840..262c6ebeb8f 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -343,6 +343,33 @@ struct fulfillment } }; +struct finish_function +{ +private: + std::string value_; + +public: + explicit finish_function(std::string func) : value_(func) + { + } + + explicit finish_function(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit finish_function(std::array const& f) + : finish_function(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfFinishFunction.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index 1309a523934..fd4949d5a44 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -36,6 +36,8 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); + cfg.FEES.extension_compute_limit = 4294967295; + cfg.FEES.extension_size_limit = 4294967295; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 3f804adda64..662442676f0 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -515,6 +515,22 @@ class Subscribe_test : public beast::unit_test::suite if (jv.isMember(jss::reserve_inc) != isFlagLedger) return false; + if (env.closed()->rules().enabled(featureSmartEscrow)) + { + if (jv.isMember(jss::extension_compute) != isFlagLedger) + return false; + + if (jv.isMember(jss::extension_size) != isFlagLedger) + return false; + } + else + { + if (jv.isMember(jss::extension_compute)) + return false; + + if (jv.isMember(jss::extension_size)) + return false; + } return true; }; @@ -1298,14 +1314,14 @@ class Subscribe_test : public beast::unit_test::suite { using namespace test::jtx; FeatureBitset const all{supported_amendments()}; - FeatureBitset const xrpFees{featureXRPFees}; testServer(); testLedger(); testTransactions_APIv1(); testTransactions_APIv2(); testManifests(); - testValidations(all - xrpFees); + testValidations(all - featureXRPFees - featureSmartEscrow); + testValidations(all - featureSmartEscrow); testValidations(all); testSubErrors(true); testSubErrors(false); diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 90e77c1e3d0..852f73cde14 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -230,6 +230,14 @@ Ledger::Ledger( sle->at(sfReserveIncrement) = *f; sle->at(sfReferenceFeeUnits) = Config::FEE_UNITS_DEPRECATED; } + if (std::find( + amendments.begin(), amendments.end(), featureSmartEscrow) != + amendments.end()) + { + sle->at(sfExtensionComputeLimit) = + config.FEES.extension_compute_limit; + sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + } rawInsert(sle); } @@ -621,6 +629,7 @@ Ledger::setup() { bool oldFees = false; bool newFees = false; + bool extensionFees = false; { auto const baseFee = sle->at(~sfBaseFee); auto const reserveBase = sle->at(~sfReserveBase); @@ -638,6 +647,7 @@ Ledger::setup() auto const reserveBaseXRP = sle->at(~sfReserveBaseDrops); auto const reserveIncrementXRP = sle->at(~sfReserveIncrementDrops); + auto assign = [&ret]( XRPAmount& dest, std::optional const& src) { @@ -654,12 +664,32 @@ Ledger::setup() assign(fees_.increment, reserveIncrementXRP); newFees = baseFeeXRP || reserveBaseXRP || reserveIncrementXRP; } + { + auto const extensionComputeLimit = + sle->at(~sfExtensionComputeLimit); + auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + + auto assign = [](std::uint32_t& dest, + std::optional const& src) { + if (src) + { + dest = src.value(); + } + }; + assign(fees_.extensionComputeLimit, extensionComputeLimit); + assign(fees_.extensionSizeLimit, extensionSizeLimit); + extensionFees = extensionComputeLimit || extensionSizeLimit; + } if (oldFees && newFees) // Should be all of one or the other, but not both ret = false; if (!rules_.enabled(featureXRPFees) && newFees) // Can't populate the new fees before the amendment is enabled ret = false; + if (!rules_.enabled(featureSmartEscrow) && extensionFees) + // Can't populate the extension fees before the amendment is + // enabled + ret = false; } } catch (SHAMapMissingNode const&) @@ -678,15 +708,17 @@ Ledger::setup() void Ledger::defaultFees(Config const& config) { - XRPL_ASSERT( - fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0, - "ripple::Ledger::defaultFees : zero fees"); + assert( + fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) fees_.reserve = config.FEES.account_reserve; - if (fees_.increment == 0) - fees_.increment = config.FEES.owner_reserve; + if (fees_.extensionComputeLimit == 0) + fees_.extensionComputeLimit = config.FEES.extension_compute_limit; + if (fees_.extensionSizeLimit == 0) + fees_.extensionSizeLimit = config.FEES.extension_size_limit; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 95160f398a1..5583b688621 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -29,10 +29,10 @@ namespace ripple { namespace detail { +template class VotableValue { private: - using value_type = XRPAmount; value_type const current_; // The current setting value_type const target_; // The setting we want std::map voteMap_; @@ -67,8 +67,9 @@ class VotableValue getVotes() const; }; -auto -VotableValue::getVotes() const -> std::pair +template +std::pair +VotableValue::getVotes() const { value_type ourVote = current_; int weight = 0; @@ -191,6 +192,32 @@ FeeVoteImpl::doValidation( "reserve increment", sfReserveIncrement); } + if (rules.enabled(featureSmartEscrow)) + { + auto vote = [&v, this]( + auto const current, + std::uint32_t target, + const char* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) + << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; + vote( + lastFees.extensionComputeLimit, + target_.extension_compute_limit, + "extension compute limit", + sfExtensionComputeLimit); + vote( + lastFees.extensionSizeLimit, + target_.extension_size_limit, + "extension size limit", + sfExtensionSizeLimit); + } } void @@ -213,11 +240,19 @@ FeeVoteImpl::doVoting( detail::VotableValue incReserveVote( lastClosedLedger->fees().increment, target_.owner_reserve); + detail::VotableValue extensionComputeVote( + lastClosedLedger->fees().extensionComputeLimit, + target_.extension_compute_limit); + + detail::VotableValue extensionSizeVote( + lastClosedLedger->fees().extensionSizeLimit, + target_.extension_size_limit); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, SF_AMOUNT const& xrpField) { if (auto const field = ~val->at(~xrpField); field && field->native()) @@ -246,7 +281,7 @@ FeeVoteImpl::doVoting( else { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, auto const& valueField) { if (auto const field = val->at(~valueField)) { @@ -277,6 +312,29 @@ FeeVoteImpl::doVoting( doVote(val, incReserveVote, sfReserveIncrement); } } + if (rules.enabled(featureSmartEscrow)) + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + SF_UINT32 const& extensionField) { + if (auto const field = ~val->at(~extensionField); field) + { + value.addVote(field.value()); + } + else + { + value.noVote(); + } + }; + + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, extensionComputeVote, sfExtensionComputeLimit); + doVote(val, extensionSizeVote, sfExtensionSizeLimit); + } + } // choose our positions // TODO: Use structured binding once LLVM 16 is the minimum supported @@ -285,11 +343,14 @@ FeeVoteImpl::doVoting( auto const baseFee = baseFeeVote.getVotes(); auto const baseReserve = baseReserveVote.getVotes(); auto const incReserve = incReserveVote.getVotes(); + auto const extensionCompute = extensionComputeVote.getVotes(); + auto const extensionSize = extensionSizeVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position - if (baseFee.second || baseReserve.second || incReserve.second) + if (baseFee.second || baseReserve.second || incReserve.second || + extensionCompute.second || extensionSize.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -317,6 +378,11 @@ FeeVoteImpl::doVoting( incReserveVote.current()); obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = extensionCompute.first; + obj[sfExtensionSizeLimit] = extensionSize.first; + } }); uint256 txID = feeTx.getTransactionID(); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index d46bfa74db6..2b3c38eea4c 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2262,6 +2262,15 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) reserveIncXRP && reserveIncXRP->native()) jvObj[jss::reserve_inc] = reserveIncXRP->xrp().jsonClipped(); + if (auto const extensionComputeLimit = + ~val->at(~sfExtensionComputeLimit); + extensionComputeLimit) + jvObj[jss::extension_compute] = *extensionComputeLimit; + + if (auto const extensionSizeLimit = ~val->at(~sfExtensionSizeLimit); + extensionSizeLimit) + jvObj[jss::extension_size] = *extensionSizeLimit; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2711,12 +2720,21 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::seq] = Json::UInt(lpClosed->info().seq); l[jss::hash] = to_string(lpClosed->info().hash); + bool const smartEscrowEnabled = + m_ledgerMaster.getValidatedLedger()->rules().enabled( + featureSmartEscrow); if (!human) { l[jss::base_fee] = baseFee.jsonClipped(); l[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); } @@ -2726,6 +2744,12 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::reserve_base_xrp] = lpClosed->fees().accountReserve(0).decimalXRP(); l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } if (auto const closeOffset = app_.timeKeeper().closeOffset(); std::abs(closeOffset.count()) >= 60) @@ -2911,6 +2935,13 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().accountReserve(0).jsonClipped(); jvObj[jss::reserve_inc] = lpAccepted->fees().increment.jsonClipped(); + if (lpAccepted->rules().enabled(featureSmartEscrow)) + { + jvObj[jss::extension_compute] = + lpAccepted->fees().extensionComputeLimit; + jvObj[jss::extension_size] = + lpAccepted->fees().extensionSizeLimit; + } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -3947,6 +3978,12 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (lpClosed->rules().enabled(featureSmartEscrow)) + { + jvResult[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + } } if ((mMode >= OperatingMode::SYNCING) && !isNeedNetworkLedger()) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp new file mode 100644 index 00000000000..d94135646b0 --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -0,0 +1,592 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +// WasmVM::WasmVM(beast::Journal j) +// : j_(j) +//{ +// } + +namespace ripple { +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Value Returns[1]; + WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + FuncName, + Params, + 1, + Returns, + 1); + + bool ok = WasmEdge_ResultOK(Res); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(Returns[0]); + // printf("Get the result: %d\n", result); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(FuncName); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID) +{ + auto dataLen = (int32_t)accountID.size(); + // printf("accountID size: %d\n", dataLen); + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( + VMCxt, + wasmCode.data(), + wasmCode.size(), + allocFunc, + allocParams, + 1, + allocReturns, + 1); + + bool ok = WasmEdge_ResultOK(allocRes); + bool re = false; + if (ok) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("Alloc pointer: %d\n", pointer); + + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, accountID.data(), pointer, dataLen); + + ok = WasmEdge_ResultOK(setRes); + if (ok) + { + // printf("Set data ok\n"); + + WasmEdge_Value params[2] = { + WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = + WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); + + ok = WasmEdge_ResultOK(funcRes); + if (ok) + { + // printf("func ok\n"); + re = (WasmEdge_ValueGetI32(returns[0]) == 1); + } + else + { + printf( + "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + } + else + { + printf( + "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); + } + } + else + { + printf( + "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); + } + + WasmEdge_VMDelete(VMCxt); + // TODO free everything + // WasmEdge_StringDelete(FuncName); + if (ok) + { + // printf("runEscrowWasm ok, result %d\n", re); + return re; + } + else + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + // printf("func ok\n"); + return WasmEdge_ValueGetI32(returns[0]) == 1; + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { + auto dataLen = (int32_t)data.size(); + WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; + WasmEdge_Value allocReturns[1]; + WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); + + WasmEdge_Result allocRes = WasmEdge_VMExecute( + VMCxt, allocFunc, allocParams, 1, allocReturns, 1); + + if (WasmEdge_ResultOK(allocRes)) + { + auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); + // printf("alloc ptr %d, len %d\n", pointer, dataLen); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( + mi, data.data(), pointer, dataLen); + if (WasmEdge_ResultOK(setRes)) + { + return pointer; + } + } + + return 0; + }; + + auto tx_ptr = wasmAlloc(escrow_tx_json_data); + auto lo_ptr = wasmAlloc(escrow_lo_json_data); + if (tx_ptr == 0 || lo_ptr == 0) + { + printf("data error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + auto txLen = (int32_t)escrow_tx_json_data.size(); + auto loLen = (int32_t)escrow_lo_json_data.size(); + + WasmEdge_Value params[4] = { + WasmEdge_ValueGenI32(tx_ptr), + WasmEdge_ValueGenI32(txLen), + WasmEdge_ValueGenI32(lo_ptr), + WasmEdge_ValueGenI32(loLen)}; + WasmEdge_Value returns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); + + if (WasmEdge_ResultOK(funcRes)) + { + auto pointer = WasmEdge_ValueGetI32(returns[0]); + const WasmEdge_ModuleInstanceContext* m = + WasmEdge_VMGetActiveModule(VMCxt); + WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); + WasmEdge_MemoryInstanceContext* mi = + WasmEdge_ModuleInstanceFindMemory(m, mName); + uint8_t buff[9]; + WasmEdge_Result getRes = + WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + auto flag = buff[0]; + + auto leToInt32 = [](const uint8_t* d) -> uint32_t { + uint32_t r = 0; + for (int i = 0; i < 4; ++i) + { + r |= static_cast(d[i]) << (i * 8); + // printf("leToInt32 %d\n", r); + } + return r; + }; + auto ret_pointer = + leToInt32(reinterpret_cast(&buff[1])); + auto ret_len = leToInt32(reinterpret_cast(&buff[5])); + // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, + // ret_len); + + std::vector buff2(ret_len); + getRes = WasmEdge_MemoryInstanceGetData( + mi, buff2.data(), ret_pointer, ret_len); + if (!WasmEdge_ResultOK(getRes)) + { + printf( + "re 2 mem get message: %s\n", + WasmEdge_ResultGetMessage(getRes)); + return Unexpected(tecFAILED_PROCESSING); + } + + std::string newData(buff2.begin(), buff2.end()); + + // free + WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); + WasmEdge_Value freeParams[2] = { + WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; + WasmEdge_Value freeReturns[0]; + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + // free pointer too, with len = 9 too + freeParams[0] = WasmEdge_ValueGenI32(pointer); + freeParams[1] = WasmEdge_ValueGenI32(9); + WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + + return std::pair(flag == 1, newData); + } + else + { + printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + return Unexpected(tecFAILED_PROCESSING); + } +} + +WasmEdge_Result +get_ledger_sqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = + WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider) +{ + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate( + HostFType, get_ledger_sqn, ledgerDataProvider, 0); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("get_ledger_sqn"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_Value funcReturns[1]; + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); + + bool ok = WasmEdge_ResultOK(funcRes); + bool re = false; + if (ok) + { + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +WasmEdge_Result +constInt( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value* In, + WasmEdge_Value* Out) +{ + Out[0] = WasmEdge_ValueGenI32(5); + return WasmEdge_Result_Success; +} + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input) +{ + WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); + WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); + WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + + WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); + WasmEdge_StatisticsContext* StatCxt = + WasmEdge_VMGetStatisticsContext(VMCxt); + WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); + + { // register host function + WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* HostFType = + WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); + WasmEdge_FunctionInstanceContext* HostFunc = + WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); + WasmEdge_FunctionTypeDelete(HostFType); + + WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* HostMod = + WasmEdge_ModuleInstanceCreate(HostName); + WasmEdge_StringDelete(HostName); + + WasmEdge_String HostFuncName = + WasmEdge_StringCreateByCString("constInt"); + WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); + WasmEdge_StringDelete(HostFuncName); + + WasmEdge_Result regRe = + WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + if (!WasmEdge_ResultOK(regRe)) + { + printf("host func reg error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + } + WasmEdge_Result loadRes = + WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); + if (!WasmEdge_ResultOK(loadRes)) + { + printf("load error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); + if (!WasmEdge_ResultOK(validateRes)) + { + printf("validate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); + if (!WasmEdge_ResultOK(instantiateRes)) + { + printf("instantiate error\n"); + return Unexpected(tecFAILED_PROCESSING); + } + + WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; + WasmEdge_Result funcRes = + WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + + bool ok = WasmEdge_ResultOK(funcRes); + EscrowResultP6 re; + if (ok) + { + auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); + re.cost = WasmEdge_StatisticsGetTotalCost(sc); + // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount + re.result = true; + } + else + { + printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); + } + + WasmEdge_VMDelete(VMCxt); + WasmEdge_StringDelete(func); + // delete other obj allocated + if (ok) + return re; + else + return Unexpected(tecFAILED_PROCESSING); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h new file mode 100644 index 00000000000..37988a97e3a --- /dev/null +++ b/src/xrpld/app/misc/WasmVM.h @@ -0,0 +1,97 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +#include +// #include +#include + +#include + +namespace ripple { + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t input); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& accountID); + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +Expected, TER> +runEscrowWasmP4( + std::vector const& wasmCode, + std::string const& funcName, + std::vector const& escrow_tx_json_data, + std::vector const& escrow_lo_json_data); + +struct LedgerDataProvider +{ + virtual int32_t + get_ledger_sqn() + { + return 1; + } + + virtual ~LedgerDataProvider() = default; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + LedgerDataProvider* ledgerDataProvider); + +struct EscrowResultP6 +{ + bool result; + int32_t cost; +}; + +Expected +runEscrowWasm( + std::vector const& wasmCode, + std::string const& funcName, + int32_t gasLimit, + int32_t input); + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED + +// class WasmVM final +//{ +// public: +// explicit WasmVM(beast::Journal j); +// ~WasmVM() = default; +// +// private: +// beast::Journal j_; +// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 45834742c8e..2f5d1c6e317 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -128,6 +128,18 @@ Change::preclaim(PreclaimContext const& ctx) ctx.tx.isFieldPresent(sfReserveIncrementDrops)) return temDISABLED; } + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temMALFORMED; + } + else + { + if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + return temDISABLED; + } return tesSUCCESS; case ttAMENDMENT: case ttUNL_MODIFY: @@ -375,6 +387,11 @@ Change::applyFee() set(feeObject, ctx_.tx, sfReserveBase); set(feeObject, ctx_.tx, sfReserveIncrement); } + if (view().rules().enabled(featureSmartEscrow)) + { + set(feeObject, ctx_.tx, sfExtensionComputeLimit); + set(feeObject, ctx_.tx, sfExtensionSizeLimit); + } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 48b9867d3a0..41b51b295f5 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -97,9 +98,28 @@ EscrowCreate::makeTxConsequences(PreflightContext const& ctx) return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; } +XRPAmount +EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount txnFees{Transactor::calculateBaseFee(view, tx)}; + if (tx.isFieldPresent(sfFinishFunction)) + { + // TODO: make this fee increase based on the extra compute run + txnFees += 1000; + } + return txnFees; +} + NotTEC EscrowCreate::preflight(PreflightContext const& ctx) { + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (ctx.rules.enabled(fix1543) && ctx.tx.getFlags() & tfUniversalMask) return temINVALID_FLAG; @@ -122,14 +142,23 @@ EscrowCreate::preflight(PreflightContext const& ctx) ctx.tx[sfCancelAfter] <= ctx.tx[sfFinishAfter]) return temBAD_EXPIRATION; + if (ctx.tx.isFieldPresent(sfFinishFunction) && + !ctx.tx.isFieldPresent(sfCancelAfter)) + return temBAD_EXPIRATION; + if (ctx.rules.enabled(fix1571)) { // In the absence of a FinishAfter, the escrow can be finished // immediately, which can be confusing. When creating an escrow, // we want to ensure that either a FinishAfter time is explicitly // specified or a completion condition is attached. - if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition]) + if (!ctx.tx[~sfFinishAfter] && !ctx.tx[~sfCondition] && + !ctx.tx[~sfFinishFunction]) + { + JLOG(ctx.j.debug()) << "Must have at least one of FinishAfter, " + "Condition, or FinishFunction."; return temMALFORMED; + } } if (auto const cb = ctx.tx[~sfCondition]) @@ -154,6 +183,19 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temDISABLED; } + if (ctx.tx.isFieldPresent(sfFinishFunction)) + { + auto const code = ctx.tx.getFieldVL(sfFinishFunction); + if (code.size() == 0 || + code.size() > ctx.app.config().FEES.extension_size_limit) + { + JLOG(ctx.j.debug()) + << "EscrowCreate.FinishFunction bad size " << code.size(); + return temMALFORMED; + } + // TODO: add check to ensure this is valid WASM code + } + return preflight2(ctx); } @@ -254,6 +296,8 @@ EscrowCreate::doApply() (*slep)[~sfCancelAfter] = ctx_.tx[~sfCancelAfter]; (*slep)[~sfFinishAfter] = ctx_.tx[~sfFinishAfter]; (*slep)[~sfDestinationTag] = ctx_.tx[~sfDestinationTag]; + (*slep)[~sfFinishFunction] = ctx_.tx[~sfFinishFunction]; + (*slep)[~sfData] = ctx_.tx[~sfData]; ctx_.view().insert(slep); @@ -277,8 +321,13 @@ EscrowCreate::doApply() } // Deduct owner's balance, increment owner count + // TODO: determine actual reserve based on FinishFunction size (*sle)[sfBalance] = (*sle)[sfBalance] - ctx_.tx[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, 1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + ctx_.tx.isFieldPresent(sfFinishFunction) ? 2 : 1, + ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; @@ -323,7 +372,10 @@ EscrowFinish::preflight(PreflightContext const& ctx) // If you specify a condition, then you must also specify // a fulfillment. if (static_cast(cb) != static_cast(fb)) + { + JLOG(ctx.j.debug()) << "Condition != Fulfillment"; return temMALFORMED; + } // Verify the transaction signature. If it doesn't work // then don't do any more work. @@ -367,6 +419,7 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } + // TODO: make this fee increase based on the extra compute run return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -384,6 +437,22 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } +struct EscrowLedgerDataProvider : public LedgerDataProvider +{ + ApplyView& view_; + +public: + EscrowLedgerDataProvider(ApplyView& view) : view_(view) + { + } + + int32_t + get_ledger_sqn() override + { + return (int32_t)view_.seq(); + } +}; + TER EscrowFinish::doApply() { @@ -392,6 +461,13 @@ EscrowFinish::doApply() if (!slep) return tecNO_TARGET; + // Order of processing the release conditions (in order of performance): + // FinishAfter/CancelAfter + // Destination validity (after SmartEscrow is enabled) + // Condition/Fulfillment + // Destination validity (before SmartEscrow is enabled) + // FinishFunction + // If a cancel time is present, a finish operation should only succeed prior // to that time. fix1571 corrects a logic error in the check that would make // a finish only succeed strictly after the cancel time. @@ -401,11 +477,17 @@ EscrowFinish::doApply() // Too soon: can't execute before the finish time if ((*slep)[~sfFinishAfter] && !after(now, (*slep)[sfFinishAfter])) + { + JLOG(j_.debug()) << "Too soon"; return tecNO_PERMISSION; + } // Too late: can't execute after the cancel time if ((*slep)[~sfCancelAfter] && after(now, (*slep)[sfCancelAfter])) + { + JLOG(j_.debug()) << "Too late"; return tecNO_PERMISSION; + } } else { @@ -413,13 +495,35 @@ EscrowFinish::doApply() if ((*slep)[~sfFinishAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfFinishAfter]) + { + JLOG(j_.debug()) << "Too soon?"; return tecNO_PERMISSION; + } // Too late? if ((*slep)[~sfCancelAfter] && ctx_.view().info().parentCloseTime.time_since_epoch().count() <= (*slep)[sfCancelAfter]) + { + JLOG(j_.debug()) << "Too late?"; return tecNO_PERMISSION; + } + } + + AccountID const destID = (*slep)[sfDestination]; + auto const sled = ctx_.view().peek(keylet::account(destID)); + if (ctx_.view().rules().enabled(featureSmartEscrow)) + { + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; + + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } } // Check cryptocondition fulfillment @@ -469,17 +573,56 @@ EscrowFinish::doApply() return tecCRYPTOCONDITION_ERROR; } - // NOTE: Escrow payments cannot be used to fund accounts. - AccountID const destID = (*slep)[sfDestination]; - auto const sled = ctx_.view().peek(keylet::account(destID)); - if (!sled) - return tecNO_DST; + if (!ctx_.view().rules().enabled(featureSmartEscrow)) + { + // NOTE: Escrow payments cannot be used to fund accounts. + if (!sled) + return tecNO_DST; - if (ctx_.view().rules().enabled(featureDepositAuth)) + if (ctx_.view().rules().enabled(featureDepositAuth)) + { + if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + !isTesSuccess(err)) + return err; + } + } + + // Execute custom release function + if ((*slep)[~sfFinishFunction]) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); - !isTesSuccess(err)) - return err; + JLOG(j_.trace()) + << "The escrow has a finish function, running WASM code..."; + // WASM execution + auto const wasmStr = slep->getFieldVL(sfFinishFunction); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("ready"); + + auto const escrowTx = + ctx_.tx.getJson(JsonOptions::none).toStyledString(); + auto const escrowObj = + slep->getJson(JsonOptions::none).toStyledString(); + std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); + std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); + + EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + JLOG(j_.trace()) << "Escrow WASM ran"; + if (re.has_value()) + { + auto reValue = re.value(); + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + if (!reValue) + { + // ctx_.view().update(slep); + return tecWASM_REJECTED; + } + } + else + { + JLOG(j_.debug()) << "WASM Failure: " + transHuman(re.error()); + return re.error(); + } } AccountID const account = (*slep)[sfAccount]; @@ -512,7 +655,11 @@ EscrowFinish::doApply() // Adjust source owner count auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger @@ -594,7 +741,11 @@ EscrowCancel::doApply() // Transfer amount back to owner, decrement owner count auto const sle = ctx_.view().peek(keylet::account(account)); (*sle)[sfBalance] = (*sle)[sfBalance] + (*slep)[sfAmount]; - adjustOwnerCount(ctx_.view(), sle, -1, ctx_.journal); + adjustOwnerCount( + ctx_.view(), + sle, + slep->isFieldPresent(sfFinishFunction) ? -2 : -1, + ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger diff --git a/src/xrpld/app/tx/detail/Escrow.h b/src/xrpld/app/tx/detail/Escrow.h index 78acdbee00c..0a74f31b3a4 100644 --- a/src/xrpld/app/tx/detail/Escrow.h +++ b/src/xrpld/app/tx/detail/Escrow.h @@ -36,6 +36,9 @@ class EscrowCreate : public Transactor static TxConsequences makeTxConsequences(PreflightContext const& ctx); + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + static NotTEC preflight(PreflightContext const& ctx); diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index 9d3e9e39460..f192126387d 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -831,6 +831,22 @@ removeExpiredCredentials( } } +static void +modifyWasmDataFields( + ApplyView& view, + std::vector> const& wasmObjects, + beast::Journal viewJ) +{ + for (auto const& [index, data] : wasmObjects) + { + if (auto const sle = view.peek(keylet::escrow(index))) + { + sle->setFieldVL(sfData, data); + view.update(sle); + } + } +} + static void removeDeletedTrustLines( ApplyView& view, @@ -973,6 +989,7 @@ Transactor::operator()() else if ( (result == tecOVERSIZE) || (result == tecKILLED) || (result == tecINCOMPLETE) || (result == tecEXPIRED) || + (result == tecWASM_REJECTED) || (isTecClaimHardFail(result, view().flags()))) { JLOG(j_.trace()) << "reapplying because of " << transToken(result); @@ -985,13 +1002,16 @@ Transactor::operator()() std::vector removedTrustLines; std::vector expiredNFTokenOffers; std::vector expiredCredentials; + std::vector> modifiedWasmObjects; bool const doOffers = ((result == tecOVERSIZE) || (result == tecKILLED)); bool const doLines = (result == tecINCOMPLETE); bool const doNFTokenOffers = (result == tecEXPIRED); bool const doCredentials = (result == tecEXPIRED); - if (doOffers || doLines || doNFTokenOffers || doCredentials) + bool const doWasmData = (result == tecWASM_REJECTED); + if (doOffers || doLines || doNFTokenOffers || doCredentials || + doWasmData) { ctx_.visit([doOffers, &removedOffers, @@ -1000,7 +1020,9 @@ Transactor::operator()() doNFTokenOffers, &expiredNFTokenOffers, doCredentials, - &expiredCredentials]( + &expiredCredentials, + doWasmData, + &modifiedWasmObjects]( uint256 const& index, bool isDelete, std::shared_ptr const& before, @@ -1035,6 +1057,13 @@ Transactor::operator()() (before->getType() == ltCREDENTIAL)) expiredCredentials.push_back(index); } + + if (doWasmData && before && after && + (before->getType() == ltESCROW)) + { + modifiedWasmObjects.push_back( + std::make_pair(index, after->getFieldVL(sfData))); + } }); } @@ -1064,6 +1093,10 @@ Transactor::operator()() removeExpiredCredentials( view(), expiredCredentials, ctx_.app.journal("View")); + if (result == tecWASM_REJECTED) + modifyWasmDataFields( + view(), modifiedWasmObjects, ctx_.app.journal("View")); + applied = isTecClaim(result); } diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4329632b2e2..c0cedcc1a47 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -80,6 +80,12 @@ struct FeeSetup /** The per-owned item reserve requirement in drops. */ XRPAmount owner_reserve{2 * DROPS_PER_XRP}; + /** The compute limit for Feature Extensions. */ + std::uint32_t extension_compute_limit{4294967295}; + + /** The WASM size limit for Feature Extensions. */ + std::uint32_t extension_size_limit{4294967295}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index b6375f1a9b5..6a34b1db91f 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1102,6 +1102,10 @@ setup_FeeVote(Section const& section) setup.account_reserve = temp; if (set(temp, "owner_reserve", section)) setup.owner_reserve = temp; + if (set(temp, "extension_compute_limit", section)) + setup.extension_compute_limit = temp; + if (set(temp, "extension_size_limit", section)) + setup.extension_size_limit = temp; } return setup; } From 911c0466c0d6500830652046ded798a7d1ffcb60 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 20 Mar 2025 16:47:14 -0400 Subject: [PATCH 002/212] Merge develop into ripple/smart-escrow (#5357) * Set version to 2.4.0 * refactor: Remove unused and add missing includes (#5293) The codebase is filled with includes that are unused, and which thus can be removed. At the same time, the files often do not include all headers that contain the definitions used in those files. This change uses clang-format and clang-tidy to clean up the includes, with minor manual intervention to ensure the code compiles on all platforms. * refactor: Calculate numFeatures automatically (#5324) Requiring manual updates of numFeatures is an annoying manual process that is easily forgotten, and leads to frequent merge conflicts. This change takes advantage of the `XRPL_FEATURE` and `XRPL_FIX` macros, and adds a new `XRPL_RETIRE` macro to automatically set `numFeatures`. * refactor: Improve ordering of headers with clang-format (#5343) Removes all manual header groupings from source and header files by leveraging clang-format options. * Rename "deadlock" to "stall" in `LoadManager` (#5341) What the LoadManager class does is stall detection, which is not the same as deadlock detection. In the condition of severe CPU starvation, LoadManager will currently intentionally crash rippled reporting `LogicError: Deadlock detected`. This error message is misleading as the condition being detected is not a deadlock. This change fixes and refactors the code in response. * Adds hub.xrpl-commons.org as a new Bootstrap Cluster (#5263) * fix: Error message for ledger_entry rpc (#5344) Changes the error to `malformedAddress` for `permissioned_domain` in the `ledger_entry` rpc, when the account is not a string. This change makes it more clear to a user what is wrong with their request. * fix: Handle invalid marker parameter in grpc call (#5317) The `end_marker` is used to limit the range of ledger entries to fetch. If `end_marker` is less than `marker`, a crash can occur. This change adds an additional check. * fix: trust line RPC no ripple flag (#5345) The Trustline RPC `no_ripple` flag gets set depending on `lsfDefaultRipple` flag, which is not a flag of a trustline but of the account root. The `lsfDefaultRipple` flag does not provide any insight if this particular trust line has `lsfLowNoRipple` or `lsfHighNoRipple` flag set, so it should not be used here at all. This change simplifies the logic. * refactor: Updates Conan dependencies: RocksDB (#5335) Updates RocksDB to version 9.7.3, the latest version supported in Conan 1.x. A patch for 9.7.4 that fixes a memory leak is included. * fix: Remove null pointer deref, just do abort (#5338) This change removes the existing undefined behavior from `LogicError`, so we can be certain that there will be always a stacktrace. De-referencing a null pointer is an old trick to generate `SIGSEGV`, which would typically also create a stacktrace. However it is also an undefined behaviour and compilers can do something else. A more robust way to create a stacktrace while crashing the program is to use `std::abort`, which we have also used in this location for a long time. If we combine the two, we might not get the expected behaviour - namely, the nullpointer deref followed by `std::abort`, as handled in certain compiler versions may not immediately cause a crash. We have observed stacktrace being wiped instead, and thread put in indeterminate state, then stacktrace created without any useful information. * chore: Add PR number to payload (#5310) This PR adds one more payload field to the libXRPL compatibility check workflow - the PR number itself. * chore: Update link to ripple-binary-codec (#5355) The link to ripple-binary-codec's definitions.json appears to be outdated. The updated link is also documented here: https://xrpl.org/docs/references/protocol/binary-format#definitions-file * Prevent consensus from getting stuck in the establish phase (#5277) - Detects if the consensus process is "stalled". If it is, then we can declare a consensus and end successfully even if we do not have 80% agreement on our proposal. - "Stalled" is defined as: - We have a close time consensus - Each disputed transaction is individually stalled: - It has been in the final "stuck" 95% requirement for at least 2 (avMIN_ROUNDS) "inner rounds" of phaseEstablish, - and either all of the other trusted proposers or this validator, if proposing, have had the same vote(s) for at least 4 (avSTALLED_ROUNDS) "inner rounds", and at least 80% of the validators (including this one, if appropriate) agree about the vote (whether yes or no). - If we have been in the establish phase for more than 10x the previous consensus establish phase's time, then consensus is considered "expired", and we will leave the round, which sends a partial validation (indicating that the node is moving on without validating). Two restrictions avoid prematurely exiting, or having an extended exit in extreme situations. - The 10x time is clamped to be within a range of 15s (ledgerMAX_CONSENSUS) to 120s (ledgerABANDON_CONSENSUS). - If consensus has not had an opportunity to walk through all avalanche states (defined as not going through 8 "inner rounds" of phaseEstablish), then ConsensusState::Expired is treated as ConsensusState::No. - When enough nodes leave the round, any remaining nodes will see they've fallen behind, and move on, too, generally before hitting the timeout. Any validations or partial validations sent during this time will help the consensus process bring the nodes back together. --------- Co-authored-by: Michael Legleux Co-authored-by: Bart Co-authored-by: Ed Hennis Co-authored-by: Bronek Kozicki Co-authored-by: Darius Tumas Co-authored-by: Sergey Kuznetsov Co-authored-by: cyan317 <120398799+cindyyan317@users.noreply.github.com> Co-authored-by: Vlad <129996061+vvysokikh1@users.noreply.github.com> Co-authored-by: Alex Kremer --- .clang-format | 7 +- .github/actions/dependencies/action.yml | 6 +- .github/workflows/libxrpl.yml | 3 +- .github/workflows/macos.yml | 1 - BUILD.md | 4 +- Builds/levelization/results/loops.txt | 4 +- Builds/levelization/results/ordering.txt | 5 +- RELEASENOTES.md | 102 +++++ cfg/rippled-example.cfg | 1 + conanfile.py | 2 +- docs/consensus.md | 2 +- examples/example/src/example.cpp | 4 +- external/rocksdb/conandata.yml | 29 +- external/rocksdb/conanfile.py | 24 +- ...-0001-add-include-cstdint-for-gcc-13.patch | 30 -- .../6.29.5-0002-exclude-thirdparty.patch | 16 - .../patches/9.7.3-0001-memory-leak.patch | 319 ++++++++++++++ .../9.x.x-0001-exclude-thirdparty.patch | 30 ++ include/xrpl/basics/BasicConfig.h | 1 - include/xrpl/basics/Buffer.h | 3 +- include/xrpl/basics/CompressionAlgorithms.h | 4 +- include/xrpl/basics/CountedObject.h | 1 + include/xrpl/basics/Expected.h | 2 - include/xrpl/basics/LocalValue.h | 1 + include/xrpl/basics/Log.h | 2 + include/xrpl/basics/Resolver.h | 4 +- include/xrpl/basics/ResolverAsio.h | 1 + include/xrpl/basics/Slice.h | 1 + include/xrpl/basics/TaggedCache.h | 1 + include/xrpl/basics/UnorderedContainers.h | 1 + include/xrpl/basics/base_uint.h | 3 +- include/xrpl/basics/chrono.h | 5 +- include/xrpl/basics/contract.h | 2 +- include/xrpl/basics/make_SSLContext.h | 1 + .../xrpl/basics/partitioned_unordered_map.h | 1 + include/xrpl/basics/random.h | 2 +- include/xrpl/basics/spinlock.h | 1 + include/xrpl/basics/tagged_integer.h | 2 + include/xrpl/beast/asio/io_latency_probe.h | 1 + .../container/detail/aged_ordered_container.h | 2 + .../detail/aged_unordered_container.h | 2 + .../detail/empty_base_optimization.h | 1 + include/xrpl/beast/core/LexicalCast.h | 1 + include/xrpl/beast/core/List.h | 1 - include/xrpl/beast/hash/hash_append.h | 1 + include/xrpl/beast/hash/xxhasher.h | 1 + include/xrpl/beast/insight/Meter.h | 4 +- include/xrpl/beast/insight/StatsDCollector.h | 1 - include/xrpl/beast/net/IPAddress.h | 2 + include/xrpl/beast/net/IPAddressConversion.h | 2 - include/xrpl/beast/net/IPAddressV4.h | 2 + include/xrpl/beast/net/IPAddressV6.h | 2 + include/xrpl/beast/rfc2616.h | 5 +- include/xrpl/beast/test/yield_to.h | 1 + include/xrpl/beast/unit_test/match.h | 1 + include/xrpl/beast/unit_test/reporter.h | 2 + include/xrpl/beast/unit_test/runner.h | 2 + include/xrpl/beast/unit_test/suite.h | 2 + include/xrpl/beast/unit_test/suite_list.h | 2 + include/xrpl/beast/unit_test/thread.h | 1 + include/xrpl/beast/utility/Journal.h | 1 + include/xrpl/beast/utility/PropertyStream.h | 2 - include/xrpl/beast/utility/rngfill.h | 1 + include/xrpl/beast/utility/temp_dir.h | 1 + include/xrpl/crypto/csprng.h | 2 - include/xrpl/json/Object.h | 1 + include/xrpl/json/Output.h | 1 + include/xrpl/json/Writer.h | 1 + include/xrpl/json/detail/json_assert.h | 1 + include/xrpl/json/json_reader.h | 2 + include/xrpl/json/json_value.h | 1 + include/xrpl/json/json_writer.h | 1 + include/xrpl/protocol/Book.h | 1 + include/xrpl/protocol/Feature.h | 84 ++-- include/xrpl/protocol/FeeUnits.h | 1 + include/xrpl/protocol/HashPrefix.h | 1 + include/xrpl/protocol/IOUAmount.h | 2 + include/xrpl/protocol/KnownFormats.h | 2 + include/xrpl/protocol/MultiApiJson.h | 2 +- include/xrpl/protocol/Protocol.h | 1 + include/xrpl/protocol/Rate.h | 2 + include/xrpl/protocol/SOTemplate.h | 1 + include/xrpl/protocol/STBase.h | 2 + include/xrpl/protocol/STExchange.h | 1 + include/xrpl/protocol/STLedgerEntry.h | 2 +- include/xrpl/protocol/STObject.h | 2 + include/xrpl/protocol/STParsedJSON.h | 1 + include/xrpl/protocol/STPathSet.h | 1 + include/xrpl/protocol/STTx.h | 1 + include/xrpl/protocol/STValidation.h | 4 +- include/xrpl/protocol/SecretKey.h | 1 + include/xrpl/protocol/Seed.h | 1 + include/xrpl/protocol/Serializer.h | 1 + include/xrpl/protocol/Sign.h | 1 + include/xrpl/protocol/SystemParameters.h | 1 + include/xrpl/protocol/TER.h | 8 +- include/xrpl/protocol/TxFlags.h | 4 +- include/xrpl/protocol/TxMeta.h | 2 + include/xrpl/protocol/detail/STVar.h | 5 +- include/xrpl/protocol/detail/features.macro | 22 + include/xrpl/protocol/digest.h | 2 + include/xrpl/protocol/nftPageMask.h | 1 + include/xrpl/resource/ResourceManager.h | 1 + include/xrpl/resource/detail/Logic.h | 1 + include/xrpl/server/Handoff.h | 2 + include/xrpl/server/Port.h | 3 +- include/xrpl/server/Server.h | 1 + include/xrpl/server/Session.h | 2 + include/xrpl/server/SimpleWriter.h | 2 + include/xrpl/server/Writer.h | 1 + include/xrpl/server/detail/BaseHTTPPeer.h | 2 + include/xrpl/server/detail/BasePeer.h | 2 + include/xrpl/server/detail/Door.h | 2 + include/xrpl/server/detail/JSONRPCUtil.h | 1 + include/xrpl/server/detail/PlainHTTPPeer.h | 2 + include/xrpl/server/detail/PlainWSPeer.h | 2 + include/xrpl/server/detail/SSLHTTPPeer.h | 2 + include/xrpl/server/detail/SSLWSPeer.h | 2 + include/xrpl/server/detail/io_list.h | 1 + src/libxrpl/basics/Archive.cpp | 5 + src/libxrpl/basics/BasicConfig.cpp | 13 +- src/libxrpl/basics/CountedObject.cpp | 2 +- src/libxrpl/basics/FileUtilities.cpp | 14 + src/libxrpl/basics/Log.cpp | 12 +- src/libxrpl/basics/Number.cpp | 7 +- src/libxrpl/basics/ResolverAsio.cpp | 16 +- src/libxrpl/basics/StringUtilities.cpp | 21 +- src/libxrpl/basics/UptimeClock.cpp | 4 + src/libxrpl/basics/base64.cpp | 5 +- src/libxrpl/basics/contract.cpp | 17 +- src/libxrpl/basics/make_SSLContext.cpp | 23 +- src/libxrpl/basics/mulDiv.cpp | 5 + src/libxrpl/beast/core/CurrentThreadName.cpp | 4 + src/libxrpl/beast/core/SemanticVersion.cpp | 4 + src/libxrpl/beast/insight/Groups.cpp | 10 + src/libxrpl/beast/insight/Hook.cpp | 1 + src/libxrpl/beast/insight/NullCollector.cpp | 14 + src/libxrpl/beast/insight/StatsDCollector.cpp | 23 +- src/libxrpl/beast/net/IPAddressConversion.cpp | 4 + src/libxrpl/beast/net/IPAddressV4.cpp | 3 - src/libxrpl/beast/net/IPEndpoint.cpp | 12 +- .../beast/utility/{src => }/beast_Journal.cpp | 5 +- .../{src => }/beast_PropertyStream.cpp | 5 +- src/libxrpl/crypto/RFC1751.cpp | 11 +- src/libxrpl/crypto/csprng.cpp | 8 +- src/libxrpl/crypto/secure_erase.cpp | 3 + src/libxrpl/json/JsonPropertyStream.cpp | 2 + src/libxrpl/json/Object.cpp | 6 + src/libxrpl/json/Output.cpp | 3 + src/libxrpl/json/Writer.cpp | 8 + src/libxrpl/json/json_reader.cpp | 5 + src/libxrpl/json/json_value.cpp | 10 +- src/libxrpl/json/json_valueiterator.cpp | 1 + src/libxrpl/json/json_writer.cpp | 7 + src/libxrpl/json/to_string.cpp | 2 + src/libxrpl/protocol/AMMCore.cpp | 13 + src/libxrpl/protocol/AccountID.cpp | 10 +- src/libxrpl/protocol/Asset.cpp | 10 +- src/libxrpl/protocol/Book.cpp | 4 + src/libxrpl/protocol/BuildInfo.cpp | 7 +- src/libxrpl/protocol/ErrorCodes.cpp | 4 + src/libxrpl/protocol/Feature.cpp | 55 +-- src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/libxrpl/protocol/Indexes.cpp | 15 + src/libxrpl/protocol/Issue.cpp | 9 +- src/libxrpl/protocol/Keylet.cpp | 2 + src/libxrpl/protocol/LedgerFormats.cpp | 5 +- src/libxrpl/protocol/LedgerHeader.cpp | 3 + src/libxrpl/protocol/MPTIssue.cpp | 9 + .../protocol/NFTSyntheticSerializer.cpp | 5 + src/libxrpl/protocol/NFTokenID.cpp | 16 + src/libxrpl/protocol/NFTokenOfferID.cpp | 12 + src/libxrpl/protocol/PublicKey.cpp | 18 +- src/libxrpl/protocol/Quality.cpp | 5 + src/libxrpl/protocol/QualityFunction.cpp | 7 +- src/libxrpl/protocol/RPCErr.cpp | 2 + src/libxrpl/protocol/Rate2.cpp | 6 + src/libxrpl/protocol/Rules.cpp | 8 + src/libxrpl/protocol/SField.cpp | 5 +- src/libxrpl/protocol/SOTemplate.cpp | 6 + src/libxrpl/protocol/STAccount.cpp | 12 + src/libxrpl/protocol/STAmount.cpp | 38 +- src/libxrpl/protocol/STArray.cpp | 9 + src/libxrpl/protocol/STBase.cpp | 9 +- src/libxrpl/protocol/STBlob.cpp | 10 +- src/libxrpl/protocol/STCurrency.cpp | 15 +- src/libxrpl/protocol/STInteger.cpp | 12 +- src/libxrpl/protocol/STIssue.cpp | 30 +- src/libxrpl/protocol/STLedgerEntry.cpp | 21 +- src/libxrpl/protocol/STNumber.cpp | 11 +- src/libxrpl/protocol/STObject.cpp | 30 ++ src/libxrpl/protocol/STParsedJSON.cpp | 19 +- src/libxrpl/protocol/STPathSet.cpp | 14 +- src/libxrpl/protocol/STTx.cpp | 37 +- src/libxrpl/protocol/STValidation.cpp | 18 +- src/libxrpl/protocol/STVar.cpp | 12 +- src/libxrpl/protocol/STVector256.cpp | 15 +- src/libxrpl/protocol/STXChainBridge.cpp | 19 +- src/libxrpl/protocol/SecretKey.cpp | 20 +- src/libxrpl/protocol/Seed.cpp | 9 +- src/libxrpl/protocol/Serializer.cpp | 15 +- src/libxrpl/protocol/Sign.cpp | 9 + src/libxrpl/protocol/TER.cpp | 8 +- src/libxrpl/protocol/TxFormats.cpp | 5 +- src/libxrpl/protocol/TxMeta.cpp | 17 +- src/libxrpl/protocol/UintTypes.cpp | 6 +- src/libxrpl/protocol/XChainAttestations.cpp | 17 +- src/libxrpl/protocol/digest.cpp | 4 +- src/libxrpl/protocol/tokens.cpp | 14 +- src/libxrpl/resource/Charge.cpp | 4 + src/libxrpl/resource/Consumer.cpp | 7 + src/libxrpl/resource/Fees.cpp | 1 + src/libxrpl/resource/ResourceManager.cpp | 19 +- src/libxrpl/server/JSONRPCUtil.cpp | 8 +- src/libxrpl/server/Port.cpp | 14 + src/test/app/AMMCalc_test.cpp | 2 + src/test/app/AMMClawback_test.cpp | 8 +- src/test/app/AMMExtended_test.cpp | 9 +- src/test/app/AMM_test.cpp | 14 +- src/test/app/AccountDelete_test.cpp | 1 + src/test/app/AccountTxPaging_test.cpp | 9 +- src/test/app/AmendmentTable_test.cpp | 2 + src/test/app/Check_test.cpp | 1 + src/test/app/Clawback_test.cpp | 6 +- src/test/app/Credentials_test.cpp | 3 +- src/test/app/CrossingLimits_test.cpp | 1 + src/test/app/DID_test.cpp | 5 +- src/test/app/DNS_test.cpp | 2 + src/test/app/DeliverMin_test.cpp | 1 + src/test/app/DepositAuth_test.cpp | 1 + src/test/app/Discrepancy_test.cpp | 1 + src/test/app/Escrow_test.cpp | 2 + src/test/app/FeeVote_test.cpp | 2 +- src/test/app/FixNFTokenPageLinks_test.cpp | 2 + src/test/app/Flow_test.cpp | 4 +- src/test/app/Freeze_test.cpp | 2 + src/test/app/HashRouter_test.cpp | 1 + src/test/app/LedgerHistory_test.cpp | 4 +- src/test/app/LedgerLoad_test.cpp | 2 + src/test/app/LedgerMaster_test.cpp | 2 +- src/test/app/LedgerReplay_test.cpp | 2 + src/test/app/LoadFeeTrack_test.cpp | 1 + src/test/app/MPToken_test.cpp | 1 + src/test/app/Manifest_test.cpp | 4 +- src/test/app/MultiSign_test.cpp | 2 + src/test/app/NFTokenBurn_test.cpp | 2 + src/test/app/NFTokenDir_test.cpp | 2 + src/test/app/NFToken_test.cpp | 2 + src/test/app/NetworkID_test.cpp | 3 +- src/test/app/OfferStream_test.cpp | 1 + src/test/app/Offer_test.cpp | 1 + src/test/app/Oracle_test.cpp | 1 + src/test/app/OversizeMeta_test.cpp | 2 +- src/test/app/Path_test.cpp | 8 +- src/test/app/PayChan_test.cpp | 3 +- src/test/app/PayStrand_test.cpp | 6 +- src/test/app/PermissionedDomains_test.cpp | 6 +- src/test/app/PseudoTx_test.cpp | 4 +- src/test/app/RCLCensorshipDetector_test.cpp | 2 + src/test/app/RCLValidations_test.cpp | 5 +- src/test/app/ReducedOffer_test.cpp | 1 + src/test/app/Regression_test.cpp | 3 +- src/test/app/SHAMapStore_test.cpp | 2 + src/test/app/SetAuth_test.cpp | 1 + src/test/app/SetRegularKey_test.cpp | 2 +- src/test/app/SetTrust_test.cpp | 2 + src/test/app/Taker_test.cpp | 3 +- src/test/app/TheoreticalQuality_test.cpp | 5 +- src/test/app/Ticket_test.cpp | 2 + src/test/app/Transaction_ordering_test.cpp | 2 +- src/test/app/TrustAndBalance_test.cpp | 1 + src/test/app/TxQ_test.cpp | 3 +- src/test/app/ValidatorKeys_test.cpp | 2 + src/test/app/ValidatorList_test.cpp | 2 + src/test/app/ValidatorSite_test.cpp | 13 +- src/test/app/XChain_test.cpp | 15 +- src/test/app/tx/apply_test.cpp | 2 + src/test/basics/Buffer_test.cpp | 1 + src/test/basics/Expected_test.cpp | 1 + src/test/basics/FeeUnits_test.cpp | 1 - src/test/basics/FileUtilities_test.cpp | 1 + src/test/basics/KeyCache_test.cpp | 2 +- src/test/basics/Number_test.cpp | 1 + src/test/basics/PerfLog_test.cpp | 3 +- src/test/basics/Slice_test.cpp | 1 + src/test/basics/TaggedCache_test.cpp | 1 + src/test/basics/base_uint_test.cpp | 3 +- src/test/basics/contract_test.cpp | 1 + src/test/basics/hardened_hash_test.cpp | 3 +- src/test/basics/tagged_integer_test.cpp | 1 + src/test/beast/IPEndpoint_test.cpp | 3 +- src/test/beast/SemanticVersion_test.cpp | 4 +- .../beast/aged_associative_container_test.cpp | 3 +- .../beast/beast_CurrentThreadName_test.cpp | 2 +- src/test/beast/beast_PropertyStream_test.cpp | 4 +- src/test/beast/beast_Zero_test.cpp | 3 +- src/test/beast/beast_abstract_clock_test.cpp | 1 + .../beast/beast_basic_seconds_clock_test.cpp | 3 +- .../beast/beast_io_latency_probe_test.cpp | 6 +- src/test/beast/define_print.cpp | 1 + src/test/conditions/PreimageSha256_test.cpp | 2 + .../consensus/ByzantineFailureSim_test.cpp | 4 +- src/test/consensus/Consensus_test.cpp | 389 +++++++++++++++++- .../DistributedValidatorsSim_test.cpp | 6 +- src/test/consensus/LedgerTiming_test.cpp | 2 + src/test/consensus/LedgerTrie_test.cpp | 5 +- src/test/consensus/NegativeUNL_test.cpp | 3 +- src/test/consensus/ScaleFreeSim_test.cpp | 4 +- src/test/consensus/Validations_test.cpp | 6 +- src/test/core/ClosureCounter_test.cpp | 2 + src/test/core/Config_test.cpp | 4 +- src/test/core/Coroutine_test.cpp | 3 +- src/test/core/CryptoPRNG_test.cpp | 4 +- src/test/core/JobQueue_test.cpp | 2 + src/test/core/SociDB_test.cpp | 4 +- src/test/core/Workers_test.cpp | 4 +- src/test/csf/BasicNetwork_test.cpp | 2 + src/test/csf/CollectorRef.h | 1 + src/test/csf/Digraph_test.cpp | 2 + src/test/csf/Histogram.h | 1 + src/test/csf/Histogram_test.cpp | 1 + src/test/csf/Peer.h | 5 + src/test/csf/PeerGroup.h | 2 + src/test/csf/Proposal.h | 4 +- src/test/csf/Scheduler_test.cpp | 2 +- src/test/csf/SimTime.h | 1 + src/test/csf/TrustGraph.h | 1 + src/test/csf/Tx.h | 6 +- src/test/csf/Validation.h | 2 + src/test/csf/collectors.h | 2 + src/test/csf/events.h | 2 + src/test/csf/impl/Sim.cpp | 1 + src/test/csf/impl/ledgers.cpp | 4 +- src/test/csf/ledgers.h | 5 + src/test/csf/submitters.h | 3 + src/test/csf/timers.h | 2 + src/test/json/Object_test.cpp | 1 + src/test/json/Output_test.cpp | 1 + src/test/json/TestOutputSuite.h | 1 + src/test/json/Writer_test.cpp | 2 +- src/test/json/json_value_test.cpp | 1 - src/test/jtx.h | 1 + src/test/jtx/AMM.h | 2 + src/test/jtx/AMMTest.h | 2 + src/test/jtx/Account.h | 1 + src/test/jtx/CaptureLogs.h | 5 + src/test/jtx/CheckMessageLogs.h | 5 + src/test/jtx/Env.h | 3 + src/test/jtx/Env_test.cpp | 4 +- src/test/jtx/JSONRPCClient.h | 2 + src/test/jtx/JTx.h | 1 + src/test/jtx/ManualTimeKeeper.h | 1 + src/test/jtx/Oracle.h | 1 + src/test/jtx/PathSet.h | 1 + src/test/jtx/TestHelpers.h | 2 + src/test/jtx/TestSuite.h | 1 + src/test/jtx/TrustedPublisherServer.h | 3 + src/test/jtx/WSClient.h | 1 + src/test/jtx/WSClient_test.cpp | 1 + src/test/jtx/amount.h | 2 + src/test/jtx/credentials.h | 7 +- src/test/jtx/delivermin.h | 1 + src/test/jtx/fee.h | 1 + src/test/jtx/flags.h | 1 + src/test/jtx/impl/AMM.cpp | 3 +- src/test/jtx/impl/AMMTest.cpp | 5 +- src/test/jtx/impl/Account.cpp | 1 + src/test/jtx/impl/Env.cpp | 10 +- src/test/jtx/impl/JSONRPCClient.cpp | 4 + src/test/jtx/impl/Oracle.cpp | 4 +- src/test/jtx/impl/TestHelpers.cpp | 2 +- src/test/jtx/impl/WSClient.cpp | 8 +- src/test/jtx/impl/acctdelete.cpp | 1 + src/test/jtx/impl/amount.cpp | 3 +- src/test/jtx/impl/attester.cpp | 1 - src/test/jtx/impl/check.cpp | 1 + src/test/jtx/impl/credentials.cpp | 1 + src/test/jtx/impl/delivermin.cpp | 1 + src/test/jtx/impl/deposit.cpp | 1 + src/test/jtx/impl/did.cpp | 1 + src/test/jtx/impl/envconfig.cpp | 2 +- src/test/jtx/impl/fee.cpp | 1 + src/test/jtx/impl/flags.cpp | 1 + src/test/jtx/impl/jtx_json.cpp | 1 + src/test/jtx/impl/last_ledger_sequence.cpp | 1 - src/test/jtx/impl/ledgerStateFix.cpp | 1 + src/test/jtx/impl/memo.cpp | 2 - src/test/jtx/impl/multisign.cpp | 5 +- src/test/jtx/impl/offer.cpp | 1 + src/test/jtx/impl/paths.cpp | 2 + src/test/jtx/impl/pay.cpp | 1 + src/test/jtx/impl/permissioned_domains.cpp | 1 - src/test/jtx/impl/quality2.cpp | 1 + src/test/jtx/impl/rate.cpp | 2 + src/test/jtx/impl/regkey.cpp | 1 + src/test/jtx/impl/sendmax.cpp | 1 + src/test/jtx/impl/seq.cpp | 1 + src/test/jtx/impl/tag.cpp | 1 - src/test/jtx/impl/ticket.cpp | 1 + src/test/jtx/impl/token.cpp | 1 + src/test/jtx/impl/trust.cpp | 2 + src/test/jtx/impl/txflags.cpp | 1 + src/test/jtx/impl/utility.cpp | 3 +- src/test/jtx/impl/xchain_bridge.cpp | 4 +- src/test/jtx/jtx_json.h | 1 + src/test/jtx/multisign.h | 1 + src/test/jtx/offer.h | 1 + src/test/jtx/owners.h | 3 + src/test/jtx/paths.h | 2 + src/test/jtx/pay.h | 1 + src/test/jtx/permissioned_domains.h | 5 +- src/test/jtx/prop.h | 1 + src/test/jtx/rate.h | 1 + src/test/jtx/regkey.h | 1 + src/test/jtx/require.h | 1 + src/test/jtx/rpc.h | 1 + src/test/jtx/sendmax.h | 1 + src/test/jtx/ter.h | 1 + src/test/jtx/trust.h | 1 + src/test/jtx/utility.h | 3 + src/test/jtx/xchain_bridge.h | 1 + src/test/ledger/BookDirs_test.cpp | 2 + src/test/ledger/Directory_test.cpp | 3 + src/test/ledger/Invariants_test.cpp | 3 +- src/test/ledger/PaymentSandbox_test.cpp | 2 + src/test/ledger/PendingSaves_test.cpp | 1 + src/test/ledger/SkipList_test.cpp | 5 +- src/test/ledger/View_test.cpp | 4 +- src/test/nodestore/Backend_test.cpp | 4 + src/test/nodestore/Basics_test.cpp | 3 +- src/test/nodestore/Database_test.cpp | 2 + src/test/nodestore/TestBase.h | 3 + src/test/nodestore/Timing_test.cpp | 7 +- src/test/nodestore/import_test.cpp | 13 +- src/test/nodestore/varint_test.cpp | 2 + src/test/overlay/ProtocolVersion_test.cpp | 1 + src/test/overlay/cluster_test.cpp | 3 +- src/test/overlay/compression_test.cpp | 5 +- src/test/overlay/handshake_test.cpp | 3 +- src/test/overlay/reduce_relay_test.cpp | 4 + src/test/overlay/short_read_test.cpp | 3 +- src/test/overlay/tx_reduce_relay_test.cpp | 5 +- src/test/peerfinder/Livecache_test.cpp | 4 +- src/test/peerfinder/PeerFinder_test.cpp | 4 +- src/test/protocol/ApiVersion_test.cpp | 1 - src/test/protocol/Hooks_test.cpp | 3 +- src/test/protocol/InnerObjectFormats_test.cpp | 6 +- src/test/protocol/Issue_test.cpp | 1 + src/test/protocol/Memo_test.cpp | 2 +- src/test/protocol/PublicKey_test.cpp | 1 + src/test/protocol/Quality_test.cpp | 1 + src/test/protocol/STAmount_test.cpp | 1 - src/test/protocol/STIssue_test.cpp | 3 +- src/test/protocol/STObject_test.cpp | 1 + src/test/protocol/STTx_test.cpp | 3 +- src/test/protocol/STValidation_test.cpp | 6 +- src/test/protocol/SecretKey_test.cpp | 1 + src/test/protocol/Seed_test.cpp | 2 +- src/test/protocol/SeqProxy_test.cpp | 1 + src/test/resource/Logic_test.cpp | 2 + src/test/rpc/AMMInfo_test.cpp | 2 +- src/test/rpc/AccountCurrencies_test.cpp | 1 + src/test/rpc/AccountInfo_test.cpp | 9 +- src/test/rpc/AccountLines_test.cpp | 6 +- src/test/rpc/AccountObjects_test.cpp | 2 + src/test/rpc/AccountOffers_test.cpp | 1 + src/test/rpc/AccountSet_test.cpp | 2 +- src/test/rpc/AccountTx_test.cpp | 1 + src/test/rpc/AmendmentBlocked_test.cpp | 3 +- src/test/rpc/Book_test.cpp | 2 + src/test/rpc/Connect_test.cpp | 1 + src/test/rpc/DeliveredAmount_test.cpp | 2 +- src/test/rpc/DepositAuthorized_test.cpp | 1 + src/test/rpc/Feature_test.cpp | 2 + src/test/rpc/GRPCTestClientBase.h | 2 + src/test/rpc/GatewayBalances_test.cpp | 2 + src/test/rpc/GetAggregatePrice_test.cpp | 2 + src/test/rpc/GetCounts_test.cpp | 1 + src/test/rpc/Handler_test.cpp | 3 +- src/test/rpc/JSONRPC_test.cpp | 3 +- src/test/rpc/KeyGeneration_test.cpp | 3 + src/test/rpc/LedgerClosed_test.cpp | 1 + src/test/rpc/LedgerData_test.cpp | 1 + src/test/rpc/LedgerHeader_test.cpp | 1 + src/test/rpc/LedgerRPC_test.cpp | 18 +- src/test/rpc/LedgerRequestRPC_test.cpp | 2 + src/test/rpc/ManifestRPC_test.cpp | 2 + src/test/rpc/NoRippleCheck_test.cpp | 4 +- src/test/rpc/NoRipple_test.cpp | 2 + src/test/rpc/OwnerInfo_test.cpp | 1 + src/test/rpc/Peers_test.cpp | 3 + src/test/rpc/RPCCall_test.cpp | 2 + src/test/rpc/RPCHelpers_test.cpp | 1 + src/test/rpc/RPCOverload_test.cpp | 2 + src/test/rpc/RobustTransaction_test.cpp | 2 + src/test/rpc/Roles_test.cpp | 5 +- src/test/rpc/ServerInfo_test.cpp | 2 + src/test/rpc/Simulate_test.cpp | 2 + src/test/rpc/Status_test.cpp | 2 +- src/test/rpc/Subscribe_test.cpp | 3 + src/test/rpc/TransactionEntry_test.cpp | 2 + src/test/rpc/TransactionHistory_test.cpp | 3 + src/test/rpc/Transaction_test.cpp | 2 + src/test/rpc/ValidatorInfo_test.cpp | 2 + src/test/rpc/ValidatorRPC_test.cpp | 4 +- src/test/rpc/Version_test.cpp | 2 + src/test/server/ServerStatus_test.cpp | 4 + src/test/server/Server_test.cpp | 11 +- src/test/shamap/FetchPack_test.cpp | 4 +- src/test/shamap/SHAMapSync_test.cpp | 3 +- src/test/shamap/SHAMap_test.cpp | 2 + src/test/shamap/common.h | 1 + src/test/unit_test/FileDirGuard.h | 2 + src/test/unit_test/multi_runner.h | 2 +- .../app/consensus/RCLCensorshipDetector.h | 2 + src/xrpld/app/consensus/RCLConsensus.cpp | 1 + src/xrpld/app/consensus/RCLConsensus.h | 6 +- src/xrpld/app/consensus/RCLCxLedger.h | 2 +- src/xrpld/app/consensus/RCLCxPeerPos.cpp | 4 +- src/xrpld/app/consensus/RCLCxPeerPos.h | 6 +- src/xrpld/app/consensus/RCLCxTx.h | 3 - src/xrpld/app/consensus/RCLValidations.cpp | 7 +- src/xrpld/app/consensus/RCLValidations.h | 3 +- .../app/ledger/AbstractFetchPackContainer.h | 1 + src/xrpld/app/ledger/AcceptedLedger.cpp | 2 +- src/xrpld/app/ledger/AcceptedLedger.h | 1 - src/xrpld/app/ledger/AcceptedLedgerTx.cpp | 1 + src/xrpld/app/ledger/AcceptedLedgerTx.h | 2 + src/xrpld/app/ledger/BookListeners.cpp | 2 - src/xrpld/app/ledger/BookListeners.h | 1 + src/xrpld/app/ledger/BuildLedger.h | 3 +- src/xrpld/app/ledger/ConsensusTransSetSF.cpp | 2 +- src/xrpld/app/ledger/ConsensusTransSetSF.h | 1 + src/xrpld/app/ledger/InboundLedger.h | 2 + src/xrpld/app/ledger/InboundLedgers.h | 3 +- src/xrpld/app/ledger/InboundTransactions.h | 2 + src/xrpld/app/ledger/Ledger.cpp | 15 +- src/xrpld/app/ledger/Ledger.h | 4 +- src/xrpld/app/ledger/LedgerCleaner.h | 2 +- src/xrpld/app/ledger/LedgerHistory.cpp | 1 + src/xrpld/app/ledger/LedgerHistory.h | 2 +- src/xrpld/app/ledger/LedgerHolder.h | 1 + src/xrpld/app/ledger/LedgerMaster.h | 5 +- src/xrpld/app/ledger/LedgerReplay.h | 2 +- src/xrpld/app/ledger/LedgerReplayTask.h | 1 - src/xrpld/app/ledger/LedgerReplayer.h | 2 +- src/xrpld/app/ledger/LedgerToJson.h | 4 +- src/xrpld/app/ledger/LocalTxs.h | 1 + src/xrpld/app/ledger/OpenLedger.h | 2 + src/xrpld/app/ledger/OrderBookDB.cpp | 1 + src/xrpld/app/ledger/OrderBookDB.h | 1 + src/xrpld/app/ledger/PendingSaves.h | 1 + src/xrpld/app/ledger/TransactionMaster.h | 2 + src/xrpld/app/ledger/detail/BuildLedger.cpp | 2 +- src/xrpld/app/ledger/detail/InboundLedger.cpp | 2 +- .../app/ledger/detail/InboundLedgers.cpp | 2 +- .../app/ledger/detail/InboundTransactions.cpp | 2 + src/xrpld/app/ledger/detail/LedgerCleaner.cpp | 1 + .../app/ledger/detail/LedgerDeltaAcquire.h | 2 +- src/xrpld/app/ledger/detail/LedgerMaster.cpp | 1 + .../ledger/detail/LedgerReplayMsgHandler.cpp | 1 + .../app/ledger/detail/LedgerReplayTask.cpp | 1 - .../app/ledger/detail/LedgerReplayer.cpp | 1 - src/xrpld/app/ledger/detail/LedgerToJson.cpp | 4 +- src/xrpld/app/ledger/detail/LocalTxs.cpp | 2 +- src/xrpld/app/ledger/detail/OpenLedger.cpp | 3 +- .../app/ledger/detail/SkipListAcquire.cpp | 1 - src/xrpld/app/ledger/detail/SkipListAcquire.h | 1 - .../app/ledger/detail/TimeoutCounter.cpp | 2 - src/xrpld/app/ledger/detail/TimeoutCounter.h | 4 +- .../app/ledger/detail/TransactionAcquire.cpp | 2 - .../app/ledger/detail/TransactionAcquire.h | 1 - .../app/ledger/detail/TransactionMaster.cpp | 1 + src/xrpld/app/main/Application.cpp | 8 +- src/xrpld/app/main/Application.h | 5 +- src/xrpld/app/main/BasicApp.cpp | 1 + src/xrpld/app/main/BasicApp.h | 1 + src/xrpld/app/main/CollectorManager.cpp | 1 + src/xrpld/app/main/GRPCServer.cpp | 10 +- src/xrpld/app/main/GRPCServer.h | 5 +- src/xrpld/app/main/LoadManager.cpp | 64 +-- src/xrpld/app/main/LoadManager.h | 26 +- src/xrpld/app/main/Main.cpp | 16 +- src/xrpld/app/main/NodeIdentity.cpp | 1 - src/xrpld/app/main/NodeIdentity.h | 3 +- src/xrpld/app/main/NodeStoreScheduler.cpp | 1 - src/xrpld/app/main/NodeStoreScheduler.h | 1 - src/xrpld/app/misc/AMMHelpers.h | 3 - src/xrpld/app/misc/AMMUtils.h | 2 + src/xrpld/app/misc/AmendmentTable.h | 1 + src/xrpld/app/misc/CredentialHelpers.cpp | 1 + src/xrpld/app/misc/CredentialHelpers.h | 5 +- src/xrpld/app/misc/DeliverMax.h | 3 - src/xrpld/app/misc/FeeVote.h | 3 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 3 +- src/xrpld/app/misc/LoadFeeTrack.h | 3 +- src/xrpld/app/misc/NegativeUNLVote.h | 1 + src/xrpld/app/misc/NetworkOPs.cpp | 34 +- src/xrpld/app/misc/NetworkOPs.h | 5 +- src/xrpld/app/misc/SHAMapStore.h | 2 +- src/xrpld/app/misc/SHAMapStoreImp.cpp | 4 +- src/xrpld/app/misc/SHAMapStoreImp.h | 4 +- src/xrpld/app/misc/TxQ.h | 3 + src/xrpld/app/misc/ValidatorKeys.h | 1 + src/xrpld/app/misc/ValidatorList.h | 6 +- src/xrpld/app/misc/ValidatorSite.h | 3 +- src/xrpld/app/misc/detail/AMMUtils.cpp | 7 +- src/xrpld/app/misc/detail/AccountTxPaging.cpp | 5 +- src/xrpld/app/misc/detail/AccountTxPaging.h | 3 +- src/xrpld/app/misc/detail/AmendmentTable.cpp | 2 + src/xrpld/app/misc/detail/LoadFeeTrack.cpp | 6 +- src/xrpld/app/misc/detail/Manifest.cpp | 1 + src/xrpld/app/misc/detail/Transaction.cpp | 5 +- src/xrpld/app/misc/detail/TxQ.cpp | 3 +- src/xrpld/app/misc/detail/ValidatorKeys.cpp | 4 +- src/xrpld/app/misc/detail/ValidatorList.cpp | 2 + src/xrpld/app/misc/detail/ValidatorSite.cpp | 4 +- src/xrpld/app/misc/detail/Work.h | 4 - src/xrpld/app/misc/detail/WorkBase.h | 3 +- src/xrpld/app/misc/detail/WorkFile.h | 2 +- .../app/misc/detail/{detail => }/WorkSSL.cpp | 0 src/xrpld/app/misc/detail/WorkSSL.h | 2 + src/xrpld/app/paths/AMMLiquidity.h | 2 +- src/xrpld/app/paths/AMMOffer.h | 1 + src/xrpld/app/paths/AccountCurrencies.h | 1 + src/xrpld/app/paths/Credit.cpp | 1 + src/xrpld/app/paths/Credit.h | 1 + src/xrpld/app/paths/Flow.cpp | 6 +- src/xrpld/app/paths/Flow.h | 1 + src/xrpld/app/paths/PathRequest.cpp | 4 +- src/xrpld/app/paths/PathRequest.h | 3 +- src/xrpld/app/paths/PathRequests.cpp | 3 +- src/xrpld/app/paths/PathRequests.h | 2 +- src/xrpld/app/paths/Pathfinder.cpp | 2 +- src/xrpld/app/paths/Pathfinder.h | 1 + src/xrpld/app/paths/RippleCalc.cpp | 1 + src/xrpld/app/paths/RippleCalc.h | 1 + src/xrpld/app/paths/RippleLineCache.cpp | 1 - src/xrpld/app/paths/RippleLineCache.h | 2 +- src/xrpld/app/paths/TrustLine.cpp | 4 +- src/xrpld/app/paths/TrustLine.h | 7 +- src/xrpld/app/paths/detail/AMMLiquidity.cpp | 2 +- src/xrpld/app/paths/detail/AMMOffer.cpp | 5 +- src/xrpld/app/paths/detail/BookStep.cpp | 1 + src/xrpld/app/paths/detail/DirectStep.cpp | 4 +- src/xrpld/app/paths/detail/FlowDebugInfo.h | 1 + src/xrpld/app/paths/detail/PaySteps.cpp | 5 +- src/xrpld/app/paths/detail/StepChecks.h | 1 + src/xrpld/app/paths/detail/Steps.h | 2 + src/xrpld/app/paths/detail/StrandFlow.h | 3 +- .../app/paths/detail/XRPEndpointStep.cpp | 2 +- src/xrpld/app/rdb/RelationalDatabase.h | 4 +- src/xrpld/app/rdb/State.h | 1 + src/xrpld/app/rdb/Wallet.h | 2 - src/xrpld/app/rdb/backend/detail/Node.cpp | 5 +- src/xrpld/app/rdb/backend/detail/Node.h | 4 - .../app/rdb/backend/detail/SQLiteDatabase.cpp | 7 +- src/xrpld/app/rdb/detail/Vacuum.cpp | 1 + src/xrpld/app/rdb/detail/Wallet.cpp | 1 + src/xrpld/app/tx/apply.h | 4 +- src/xrpld/app/tx/applySteps.h | 1 + src/xrpld/app/tx/detail/AMMBid.cpp | 5 +- src/xrpld/app/tx/detail/AMMClawback.cpp | 4 +- src/xrpld/app/tx/detail/AMMCreate.cpp | 5 +- src/xrpld/app/tx/detail/AMMDelete.cpp | 6 +- src/xrpld/app/tx/detail/AMMDeposit.cpp | 7 +- src/xrpld/app/tx/detail/AMMVote.cpp | 6 +- src/xrpld/app/tx/detail/AMMWithdraw.cpp | 7 +- src/xrpld/app/tx/detail/ApplyContext.cpp | 4 +- src/xrpld/app/tx/detail/ApplyContext.h | 3 +- src/xrpld/app/tx/detail/BookTip.cpp | 1 - src/xrpld/app/tx/detail/BookTip.h | 3 +- src/xrpld/app/tx/detail/CancelCheck.cpp | 5 +- src/xrpld/app/tx/detail/CancelOffer.cpp | 1 + src/xrpld/app/tx/detail/CancelOffer.h | 3 +- src/xrpld/app/tx/detail/CashCheck.cpp | 2 +- src/xrpld/app/tx/detail/Change.cpp | 2 + src/xrpld/app/tx/detail/Change.h | 5 - src/xrpld/app/tx/detail/Clawback.cpp | 2 +- src/xrpld/app/tx/detail/CreateCheck.cpp | 4 +- src/xrpld/app/tx/detail/CreateOffer.cpp | 2 +- src/xrpld/app/tx/detail/CreateOffer.h | 1 - src/xrpld/app/tx/detail/CreateTicket.cpp | 3 +- src/xrpld/app/tx/detail/CreateTicket.h | 2 - src/xrpld/app/tx/detail/Credentials.cpp | 4 +- src/xrpld/app/tx/detail/Credentials.h | 5 +- src/xrpld/app/tx/detail/DID.cpp | 3 +- src/xrpld/app/tx/detail/DeleteAccount.cpp | 2 +- src/xrpld/app/tx/detail/DeleteAccount.h | 2 - src/xrpld/app/tx/detail/DeleteOracle.cpp | 2 +- src/xrpld/app/tx/detail/DepositPreauth.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 7 +- src/xrpld/app/tx/detail/InvariantCheck.cpp | 4 +- src/xrpld/app/tx/detail/LedgerStateFix.cpp | 3 +- src/xrpld/app/tx/detail/LedgerStateFix.h | 2 - src/xrpld/app/tx/detail/MPTokenAuthorize.cpp | 1 + .../app/tx/detail/MPTokenIssuanceCreate.cpp | 2 +- .../app/tx/detail/MPTokenIssuanceDestroy.cpp | 3 +- .../app/tx/detail/MPTokenIssuanceSet.cpp | 3 +- .../app/tx/detail/NFTokenAcceptOffer.cpp | 2 +- src/xrpld/app/tx/detail/NFTokenBurn.cpp | 5 +- .../app/tx/detail/NFTokenCancelOffer.cpp | 3 +- .../app/tx/detail/NFTokenCreateOffer.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenMint.cpp | 5 +- src/xrpld/app/tx/detail/NFTokenMint.h | 1 + src/xrpld/app/tx/detail/NFTokenModify.cpp | 4 +- src/xrpld/app/tx/detail/NFTokenUtils.cpp | 3 +- src/xrpld/app/tx/detail/NFTokenUtils.h | 2 +- src/xrpld/app/tx/detail/Offer.h | 3 +- src/xrpld/app/tx/detail/OfferStream.cpp | 1 + src/xrpld/app/tx/detail/OfferStream.h | 2 +- src/xrpld/app/tx/detail/PayChan.cpp | 2 +- src/xrpld/app/tx/detail/Payment.cpp | 2 +- src/xrpld/app/tx/detail/Payment.h | 3 - .../tx/detail/PermissionedDomainDelete.cpp | 1 + .../app/tx/detail/PermissionedDomainDelete.h | 5 +- .../app/tx/detail/PermissionedDomainSet.cpp | 1 + .../app/tx/detail/PermissionedDomainSet.h | 6 +- src/xrpld/app/tx/detail/SetAccount.cpp | 1 + src/xrpld/app/tx/detail/SetAccount.h | 5 +- src/xrpld/app/tx/detail/SetOracle.cpp | 2 +- src/xrpld/app/tx/detail/SetRegularKey.cpp | 1 + src/xrpld/app/tx/detail/SetRegularKey.h | 3 - src/xrpld/app/tx/detail/SetSignerList.cpp | 4 +- src/xrpld/app/tx/detail/SetSignerList.h | 8 +- src/xrpld/app/tx/detail/SetTrust.cpp | 2 +- src/xrpld/app/tx/detail/SetTrust.h | 4 +- src/xrpld/app/tx/detail/SignerEntries.cpp | 2 + src/xrpld/app/tx/detail/SignerEntries.h | 11 +- src/xrpld/app/tx/detail/Taker.cpp | 1 + src/xrpld/app/tx/detail/Taker.h | 3 +- src/xrpld/app/tx/detail/Transactor.cpp | 2 +- src/xrpld/app/tx/detail/Transactor.h | 1 + src/xrpld/app/tx/detail/XChainBridge.cpp | 4 +- src/xrpld/app/tx/detail/XChainBridge.h | 2 +- src/xrpld/app/tx/detail/apply.cpp | 1 + src/xrpld/app/tx/detail/applySteps.cpp | 1 + src/xrpld/conditions/Condition.h | 6 +- src/xrpld/conditions/Fulfillment.h | 2 +- src/xrpld/conditions/detail/Condition.cpp | 4 - src/xrpld/conditions/detail/Fulfillment.cpp | 3 +- src/xrpld/conditions/detail/PreimageSha256.h | 2 + src/xrpld/conditions/detail/error.cpp | 4 +- src/xrpld/conditions/detail/error.h | 1 - src/xrpld/conditions/detail/utils.h | 10 +- src/xrpld/consensus/Consensus.cpp | 37 +- src/xrpld/consensus/Consensus.h | 94 ++++- src/xrpld/consensus/ConsensusParms.h | 127 ++++-- src/xrpld/consensus/ConsensusProposal.h | 3 + src/xrpld/consensus/ConsensusTypes.h | 5 +- src/xrpld/consensus/DisputedTx.h | 103 ++++- src/xrpld/consensus/LedgerTiming.h | 2 +- src/xrpld/consensus/Validations.h | 1 + src/xrpld/core/ClosureCounter.h | 2 +- src/xrpld/core/Config.h | 7 - src/xrpld/core/DatabaseCon.h | 2 + src/xrpld/core/Job.h | 2 +- src/xrpld/core/JobQueue.h | 4 +- src/xrpld/core/JobTypeData.h | 1 + src/xrpld/core/JobTypes.h | 3 +- src/xrpld/core/LoadEvent.h | 1 - src/xrpld/core/LoadMonitor.h | 2 + src/xrpld/core/SociDB.h | 5 +- src/xrpld/core/detail/Config.cpp | 4 +- src/xrpld/core/detail/DatabaseCon.cpp | 1 + src/xrpld/core/detail/Job.cpp | 2 +- src/xrpld/core/detail/JobQueue.cpp | 2 + src/xrpld/core/detail/LoadEvent.cpp | 2 +- src/xrpld/core/detail/LoadMonitor.cpp | 1 + src/xrpld/core/detail/SociDB.cpp | 7 +- src/xrpld/core/detail/Workers.cpp | 1 + src/xrpld/core/detail/Workers.h | 2 + src/xrpld/ledger/ApplyView.h | 1 + src/xrpld/ledger/ApplyViewImpl.h | 1 + src/xrpld/ledger/BookDirs.h | 2 + src/xrpld/ledger/CachedView.h | 4 +- src/xrpld/ledger/Dir.h | 1 + src/xrpld/ledger/OpenView.h | 1 + src/xrpld/ledger/PaymentSandbox.h | 2 + src/xrpld/ledger/RawView.h | 4 +- src/xrpld/ledger/ReadView.h | 7 +- src/xrpld/ledger/View.h | 8 +- src/xrpld/ledger/detail/ApplyStateTable.cpp | 1 + src/xrpld/ledger/detail/ApplyStateTable.h | 2 + src/xrpld/ledger/detail/ApplyView.cpp | 1 + src/xrpld/ledger/detail/ApplyViewBase.cpp | 1 - src/xrpld/ledger/detail/ApplyViewBase.h | 2 +- src/xrpld/ledger/detail/ApplyViewImpl.cpp | 2 - src/xrpld/ledger/detail/BookDirs.cpp | 1 + src/xrpld/ledger/detail/CachedView.cpp | 2 - src/xrpld/ledger/detail/OpenView.cpp | 1 + src/xrpld/ledger/detail/PaymentSandbox.cpp | 3 +- src/xrpld/ledger/detail/RawStateTable.cpp | 1 + src/xrpld/ledger/detail/ReadViewFwdRange.h | 1 - src/xrpld/ledger/detail/View.cpp | 6 +- src/xrpld/net/AutoSocket.h | 1 + src/xrpld/net/HTTPClient.h | 2 + src/xrpld/net/HTTPClientSSLContext.h | 2 + src/xrpld/net/InfoSub.h | 2 +- src/xrpld/net/RPCCall.h | 4 +- src/xrpld/net/RPCSub.h | 1 + src/xrpld/net/RegisterSSLCerts.h | 1 + src/xrpld/net/detail/HTTPClient.cpp | 5 +- src/xrpld/net/detail/InfoSub.cpp | 1 - src/xrpld/net/detail/RPCCall.cpp | 4 +- src/xrpld/net/detail/RPCSub.cpp | 2 + src/xrpld/net/detail/RegisterSSLCerts.cpp | 7 +- src/xrpld/nodestore/Backend.h | 2 +- src/xrpld/nodestore/Database.h | 5 +- src/xrpld/nodestore/Factory.h | 3 + src/xrpld/nodestore/NodeObject.h | 2 +- src/xrpld/nodestore/Scheduler.h | 1 + src/xrpld/nodestore/Types.h | 2 +- src/xrpld/nodestore/backend/MemoryFactory.cpp | 3 + src/xrpld/nodestore/backend/NuDBFactory.cpp | 6 +- src/xrpld/nodestore/backend/NullFactory.cpp | 2 +- .../nodestore/backend/RocksDBFactory.cpp | 8 +- src/xrpld/nodestore/detail/BatchWriter.h | 1 + src/xrpld/nodestore/detail/Database.cpp | 2 + .../nodestore/detail/DatabaseNodeImp.cpp | 1 - src/xrpld/nodestore/detail/DatabaseNodeImp.h | 1 + .../nodestore/detail/DatabaseRotatingImp.cpp | 1 - src/xrpld/nodestore/detail/DecodedBlob.cpp | 2 + src/xrpld/nodestore/detail/EncodedBlob.h | 4 +- src/xrpld/nodestore/detail/NodeObject.cpp | 1 + src/xrpld/nodestore/detail/codec.h | 9 +- src/xrpld/nodestore/detail/varint.h | 3 +- src/xrpld/overlay/Cluster.h | 6 +- src/xrpld/overlay/ClusterNode.h | 1 + src/xrpld/overlay/Compression.h | 1 - src/xrpld/overlay/Message.h | 8 +- src/xrpld/overlay/Overlay.h | 9 +- src/xrpld/overlay/Peer.h | 1 + src/xrpld/overlay/PeerReservationTable.h | 1 - src/xrpld/overlay/PeerSet.h | 5 - src/xrpld/overlay/ReduceRelayCommon.h | 2 +- src/xrpld/overlay/Slot.h | 3 +- src/xrpld/overlay/Squelch.h | 2 +- src/xrpld/overlay/detail/Cluster.cpp | 3 +- src/xrpld/overlay/detail/ConnectAttempt.cpp | 1 + src/xrpld/overlay/detail/ConnectAttempt.h | 1 - src/xrpld/overlay/detail/Handshake.cpp | 3 + src/xrpld/overlay/detail/Handshake.h | 9 +- src/xrpld/overlay/detail/Message.cpp | 1 + src/xrpld/overlay/detail/OverlayImpl.cpp | 6 +- src/xrpld/overlay/detail/OverlayImpl.h | 3 + src/xrpld/overlay/detail/PeerImp.cpp | 1 + src/xrpld/overlay/detail/PeerImp.h | 4 +- .../overlay/detail/PeerReservationTable.cpp | 7 +- src/xrpld/overlay/detail/ProtocolMessage.h | 6 +- src/xrpld/overlay/detail/ProtocolVersion.cpp | 3 + src/xrpld/overlay/detail/ProtocolVersion.h | 1 + src/xrpld/overlay/detail/TrafficCount.h | 1 - src/xrpld/overlay/detail/TxMetrics.cpp | 1 + src/xrpld/overlay/detail/TxMetrics.h | 2 +- src/xrpld/overlay/detail/ZeroCopyStream.h | 2 +- src/xrpld/overlay/make_Overlay.h | 4 +- src/xrpld/peerfinder/PeerfinderManager.h | 2 + src/xrpld/peerfinder/Slot.h | 2 +- src/xrpld/peerfinder/detail/Bootcache.cpp | 1 + src/xrpld/peerfinder/detail/Bootcache.h | 2 + src/xrpld/peerfinder/detail/Checker.h | 5 +- src/xrpld/peerfinder/detail/Counts.h | 3 +- src/xrpld/peerfinder/detail/Handouts.h | 3 +- src/xrpld/peerfinder/detail/Livecache.h | 2 + src/xrpld/peerfinder/detail/Logic.h | 2 +- .../peerfinder/detail/PeerfinderManager.cpp | 4 +- src/xrpld/peerfinder/detail/SlotImp.h | 3 +- src/xrpld/peerfinder/detail/Source.h | 1 + src/xrpld/peerfinder/detail/SourceStrings.h | 1 + src/xrpld/peerfinder/detail/Store.h | 1 + src/xrpld/peerfinder/detail/StoreSqdb.h | 2 - src/xrpld/peerfinder/make_Manager.h | 2 + src/xrpld/perflog/PerfLog.h | 3 + src/xrpld/perflog/detail/PerfLogImp.cpp | 5 +- src/xrpld/perflog/detail/PerfLogImp.h | 8 +- src/xrpld/rpc/CTID.h | 2 +- src/xrpld/rpc/Context.h | 1 - src/xrpld/rpc/GRPCHandlers.h | 2 + src/xrpld/rpc/RPCHandler.h | 2 - src/xrpld/rpc/Role.h | 3 +- src/xrpld/rpc/ServerHandler.h | 3 +- src/xrpld/rpc/detail/DeliveredAmount.cpp | 8 +- src/xrpld/rpc/detail/Handler.cpp | 1 + src/xrpld/rpc/detail/Handler.h | 2 - src/xrpld/rpc/detail/MPTokenIssuanceID.cpp | 5 - src/xrpld/rpc/detail/RPCHandler.cpp | 6 +- src/xrpld/rpc/detail/RPCHelpers.cpp | 2 +- src/xrpld/rpc/detail/RPCHelpers.h | 9 +- src/xrpld/rpc/detail/Role.cpp | 3 +- src/xrpld/rpc/detail/ServerHandler.cpp | 5 +- src/xrpld/rpc/detail/Status.cpp | 1 + src/xrpld/rpc/detail/TransactionSign.cpp | 5 +- src/xrpld/rpc/detail/TransactionSign.h | 1 - src/xrpld/rpc/detail/WSInfoSub.h | 3 +- src/xrpld/rpc/handlers/AMMInfo.cpp | 4 +- src/xrpld/rpc/handlers/AccountChannels.cpp | 4 +- .../rpc/handlers/AccountCurrenciesHandler.cpp | 2 +- src/xrpld/rpc/handlers/AccountInfo.cpp | 3 +- src/xrpld/rpc/handlers/AccountLines.cpp | 10 +- src/xrpld/rpc/handlers/AccountObjects.cpp | 3 +- src/xrpld/rpc/handlers/AccountOffers.cpp | 2 +- src/xrpld/rpc/handlers/AccountTx.cpp | 5 +- src/xrpld/rpc/handlers/BlackList.cpp | 1 + src/xrpld/rpc/handlers/BookOffers.cpp | 1 + src/xrpld/rpc/handlers/CanDelete.cpp | 4 +- src/xrpld/rpc/handlers/Connect.cpp | 1 + src/xrpld/rpc/handlers/ConsensusInfo.cpp | 3 +- src/xrpld/rpc/handlers/DepositAuthorized.cpp | 1 + src/xrpld/rpc/handlers/Feature1.cpp | 2 +- src/xrpld/rpc/handlers/Fee1.cpp | 2 +- src/xrpld/rpc/handlers/FetchInfo.cpp | 3 +- src/xrpld/rpc/handlers/GatewayBalances.cpp | 2 +- src/xrpld/rpc/handlers/GetAggregatePrice.cpp | 1 + src/xrpld/rpc/handlers/GetCounts.cpp | 3 +- src/xrpld/rpc/handlers/GetCounts.h | 3 +- src/xrpld/rpc/handlers/LedgerAccept.cpp | 3 +- .../rpc/handlers/LedgerCleanerHandler.cpp | 1 + src/xrpld/rpc/handlers/LedgerClosed.cpp | 1 + src/xrpld/rpc/handlers/LedgerCurrent.cpp | 2 +- src/xrpld/rpc/handlers/LedgerData.cpp | 22 +- src/xrpld/rpc/handlers/LedgerEntry.cpp | 11 +- src/xrpld/rpc/handlers/LedgerHandler.cpp | 2 +- src/xrpld/rpc/handlers/LedgerHandler.h | 1 + src/xrpld/rpc/handlers/LedgerHeader.cpp | 1 + src/xrpld/rpc/handlers/LedgerRequest.cpp | 8 +- src/xrpld/rpc/handlers/LogLevel.cpp | 2 + src/xrpld/rpc/handlers/LogRotate.cpp | 1 + src/xrpld/rpc/handlers/Manifest.cpp | 2 +- src/xrpld/rpc/handlers/NFTOffers.cpp | 2 +- src/xrpld/rpc/handlers/NoRippleCheck.cpp | 1 + src/xrpld/rpc/handlers/OwnerInfo.cpp | 2 +- src/xrpld/rpc/handlers/PathFind.cpp | 2 +- src/xrpld/rpc/handlers/PayChanClaim.cpp | 5 +- src/xrpld/rpc/handlers/Peers.cpp | 3 +- src/xrpld/rpc/handlers/Ping.cpp | 1 + src/xrpld/rpc/handlers/Print.cpp | 1 + src/xrpld/rpc/handlers/Reservations.cpp | 1 + src/xrpld/rpc/handlers/RipplePathFind.cpp | 1 + src/xrpld/rpc/handlers/ServerInfo.cpp | 3 +- src/xrpld/rpc/handlers/ServerState.cpp | 3 +- src/xrpld/rpc/handlers/SignFor.cpp | 2 +- src/xrpld/rpc/handlers/SignHandler.cpp | 1 + src/xrpld/rpc/handlers/Simulate.cpp | 3 +- src/xrpld/rpc/handlers/Stop.cpp | 3 +- src/xrpld/rpc/handlers/Submit.cpp | 4 +- src/xrpld/rpc/handlers/SubmitMultiSigned.cpp | 2 +- src/xrpld/rpc/handlers/Subscribe.cpp | 1 + src/xrpld/rpc/handlers/TransactionEntry.cpp | 2 +- src/xrpld/rpc/handlers/Tx.cpp | 2 +- src/xrpld/rpc/handlers/TxHistory.cpp | 5 +- src/xrpld/rpc/handlers/TxReduceRelay.cpp | 1 + src/xrpld/rpc/handlers/UnlList.cpp | 2 +- src/xrpld/rpc/handlers/Unsubscribe.cpp | 1 + src/xrpld/rpc/handlers/ValidationCreate.cpp | 2 +- src/xrpld/rpc/handlers/ValidatorInfo.cpp | 1 + src/xrpld/rpc/handlers/ValidatorListSites.cpp | 2 +- src/xrpld/rpc/handlers/Validators.cpp | 2 +- src/xrpld/rpc/handlers/WalletPropose.cpp | 3 +- src/xrpld/shamap/Family.h | 3 +- src/xrpld/shamap/FullBelowCache.h | 1 + src/xrpld/shamap/SHAMap.h | 5 +- src/xrpld/shamap/SHAMapAccountStateLeafNode.h | 2 +- src/xrpld/shamap/SHAMapInnerNode.h | 8 - src/xrpld/shamap/SHAMapItem.h | 1 + src/xrpld/shamap/SHAMapLeafNode.h | 1 - src/xrpld/shamap/SHAMapMissingNode.h | 2 + src/xrpld/shamap/SHAMapNodeID.h | 2 +- src/xrpld/shamap/SHAMapSyncFilter.h | 2 +- src/xrpld/shamap/SHAMapTreeNode.h | 6 +- src/xrpld/shamap/SHAMapTxLeafNode.h | 2 +- src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h | 2 +- src/xrpld/shamap/TreeNodeCache.h | 2 + src/xrpld/shamap/detail/NodeFamily.cpp | 1 + src/xrpld/shamap/detail/SHAMap.cpp | 1 + src/xrpld/shamap/detail/SHAMapDelta.cpp | 1 + src/xrpld/shamap/detail/SHAMapInnerNode.cpp | 5 +- src/xrpld/shamap/detail/SHAMapLeafNode.cpp | 2 - src/xrpld/shamap/detail/SHAMapNodeID.cpp | 2 +- src/xrpld/shamap/detail/SHAMapSync.cpp | 1 + src/xrpld/shamap/detail/SHAMapTreeNode.cpp | 4 +- src/xrpld/shamap/detail/TaggedPointer.h | 1 - src/xrpld/shamap/detail/TaggedPointer.ipp | 6 +- 983 files changed, 3537 insertions(+), 1392 deletions(-) delete mode 100644 external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch delete mode 100644 external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch create mode 100644 external/rocksdb/patches/9.7.3-0001-memory-leak.patch create mode 100644 external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch rename src/libxrpl/beast/utility/{src => }/beast_Journal.cpp (98%) rename src/libxrpl/beast/utility/{src => }/beast_PropertyStream.cpp (99%) rename src/xrpld/app/misc/detail/{detail => }/WorkSSL.cpp (100%) diff --git a/.clang-format b/.clang-format index 1d0f396dd8f..91003968851 100644 --- a/.clang-format +++ b/.clang-format @@ -44,6 +44,7 @@ DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false ForEachMacros: [ Q_FOREACH, BOOST_FOREACH ] +IncludeBlocks: Regroup IncludeCategories: - Regex: '^<(test)/' Priority: 0 @@ -53,8 +54,12 @@ IncludeCategories: Priority: 2 - Regex: '^<(boost)/' Priority: 3 - - Regex: '.*' + - Regex: '^.*/' Priority: 4 + - Regex: '^.*\.h' + Priority: 5 + - Regex: '.*' + Priority: 6 IncludeIsMainRegex: '$' IndentCaseLabels: true IndentFunctionDeclarationAfterType: false diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index d3c67e86685..afce1557d3b 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -14,7 +14,7 @@ runs: run: | conan config set general.revisions_enabled=1 conan export external/snappy snappy/1.1.10@ - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ - name: add Ripple Conan remote @@ -55,7 +55,3 @@ runs: --options xrpld=True \ --settings build_type=${{ inputs.configuration }} \ .. - - name: upload dependencies to remote - if: (steps.binaries.outputs.missing != '[]') && (steps.remote.outputs.outcome == 'success') - shell: bash - run: conan upload --remote ripple '*' --all --parallel --confirm diff --git a/.github/workflows/libxrpl.yml b/.github/workflows/libxrpl.yml index fe4a2c3e220..2834595e3a2 100644 --- a/.github/workflows/libxrpl.yml +++ b/.github/workflows/libxrpl.yml @@ -85,4 +85,5 @@ jobs: run: | gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \ /repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \ - -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" + -F "client_payload[version]=${{ needs.publish.outputs.version }}@${{ needs.publish.outputs.channel }}" \ + -F "client_payload[pr]=${{ github.event.pull_request.number }}" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 36d9f0225a9..566e3550e07 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -73,7 +73,6 @@ jobs: run : | conan profile new default --detect || true conan profile update settings.compiler.cppstd=20 default - conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default - name: build dependencies uses: ./.github/actions/dependencies env: diff --git a/BUILD.md b/BUILD.md index 310c538584d..fd985dce817 100644 --- a/BUILD.md +++ b/BUILD.md @@ -178,9 +178,9 @@ It does not override paths to dependencies when building with Visual Studio. ``` # Conan 1.x - conan export external/rocksdb rocksdb/6.29.5@ + conan export external/rocksdb rocksdb/9.7.3@ # Conan 2.x - conan export --version 6.29.5 external/rocksdb + conan export --version 9.7.3 external/rocksdb ``` Export our [Conan recipe for SOCI](./external/soci). diff --git a/Builds/levelization/results/loops.txt b/Builds/levelization/results/loops.txt index 7c132f5429e..df1d273f93b 100644 --- a/Builds/levelization/results/loops.txt +++ b/Builds/levelization/results/loops.txt @@ -14,10 +14,10 @@ Loop: xrpld.app xrpld.net xrpld.app > xrpld.net Loop: xrpld.app xrpld.overlay - xrpld.overlay == xrpld.app + xrpld.overlay > xrpld.app Loop: xrpld.app xrpld.peerfinder - xrpld.app > xrpld.peerfinder + xrpld.peerfinder ~= xrpld.app Loop: xrpld.app xrpld.rpc xrpld.rpc > xrpld.app diff --git a/Builds/levelization/results/ordering.txt b/Builds/levelization/results/ordering.txt index 681f76dd5db..eca7fc6dc29 100644 --- a/Builds/levelization/results/ordering.txt +++ b/Builds/levelization/results/ordering.txt @@ -6,6 +6,7 @@ libxrpl.protocol > xrpl.basics libxrpl.protocol > xrpl.json libxrpl.protocol > xrpl.protocol libxrpl.resource > xrpl.basics +libxrpl.resource > xrpl.json libxrpl.resource > xrpl.resource libxrpl.server > xrpl.basics libxrpl.server > xrpl.json @@ -42,6 +43,7 @@ test.consensus > xrpl.basics test.consensus > xrpld.app test.consensus > xrpld.consensus test.consensus > xrpld.ledger +test.consensus > xrpl.json test.core > test.jtx test.core > test.toplevel test.core > test.unit_test @@ -58,7 +60,6 @@ test.json > test.jtx test.json > xrpl.json test.jtx > xrpl.basics test.jtx > xrpld.app -test.jtx > xrpld.consensus test.jtx > xrpld.core test.jtx > xrpld.ledger test.jtx > xrpld.net @@ -158,7 +159,6 @@ xrpld.core > xrpl.basics xrpld.core > xrpl.json xrpld.core > xrpl.protocol xrpld.ledger > xrpl.basics -xrpld.ledger > xrpld.core xrpld.ledger > xrpl.json xrpld.ledger > xrpl.protocol xrpld.net > xrpl.basics @@ -183,7 +183,6 @@ xrpld.peerfinder > xrpld.core xrpld.peerfinder > xrpl.protocol xrpld.perflog > xrpl.basics xrpld.perflog > xrpl.json -xrpld.perflog > xrpl.protocol xrpld.rpc > xrpl.basics xrpld.rpc > xrpld.core xrpld.rpc > xrpld.ledger diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5d4d14d503c..6bc7beccc7b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,108 @@ This document contains the release notes for `rippled`, the reference server implementation of the XRP Ledger protocol. To learn more about how to build, run or update a `rippled` server, visit https://xrpl.org/install-rippled.html Have new ideas? Need help with setting up your node? [Please open an issue here](https://github.com/xrplf/rippled/issues/new/choose). +## Full Changelog + +### Amendments + +The following amendments are open for voting with this release: + +- **DynamicNFT (XLS-46)** - Adds the ability to mint mutable `NFToken` objects whose URI can be changed. ([#5048](https://github.com/XRPLF/rippled/pull/5048)) +- **PermissionedDomains (XLS-80)** - Adds Permissioned Domains, which act as part of broader systems on the XRP Ledger to restrict access to satisfy compliance rules. ([#5161](https://github.com/XRPLF/rippled/pull/5161)) +- **DeepFreeze (XLS-77)** - Adds the ability to deep freeze trust lines, enabling token issuers to block the transfer of assets for holders who have been deep frozen. ([#5187](https://github.com/XRPLF/rippled/pull/5187)) +- **fixFrozenLPTokenTransfer** - Prohibits the transfer of LP tokens when the associated liquidity pool contains at least one frozen asset. ([#5227](https://github.com/XRPLF/rippled/pull/5227)) +- **fixInvalidTxFlags** - Adds transaction flag checking for `CredentialCreate`, `CredentialAccept`, and `CredentialDelete` transactions. ([#5250](https://github.com/XRPLF/rippled/pull/5250)) + + +### New Features + +- Added a new `simulate` API method to execute dry runs of transactions and see the simulated metadata. ([#5069](https://github.com/XRPLF/rippled/pull/5069), [#5265](https://github.com/XRPLF/rippled/pull/5265)) +- Added the ability to specify MPTs when defining assets in transactions. ([#5200](https://github.com/XRPLF/rippled/pull/5200)) +- Added a `state` alias for `ripple_state` in the `ledger_entry` API method. Also refactored `LedgerEntry.cpp` to make it easier to read. ([#5199](https://github.com/XRPLF/rippled/pull/5199)) +- Improved UNL security by enabling validators to set a minimum number of UNL publishers to agree on validators. ([#5112](https://github.com/XRPLF/rippled/pull/5112)) +- Updated the XRPL Foundation UNL keys. ([#5289](https://github.com/XRPLF/rippled/pull/5289)) +- Added a new XRPL Foundation subdomain to enable a staged migration without modifying the key for the current UNL list. ([#5326](https://github.com/XRPLF/rippled/pull/5326)) +- Added support to filter ledger entry types by their canonical names in the `ledger`, `ledger_data`, and `account_objects` API methods. ([#5271](https://github.com/XRPLF/rippled/pull/5271)) +- Added detailed logging for each validation and proposal received from the network. ([#5291](https://github.com/XRPLF/rippled/pull/5291)) +- Improved git commit hash lookups when checking the version of a `rippled` debug build. Also added git commit hash info when using the `server_info` API method on an admin connection. ([#5225](https://github.com/XRPLF/rippled/pull/5225)) + + +### Bug fixes + +- Fixed an issue with overlapping data types in the `Expected` class. ([#5218](https://github.com/XRPLF/rippled/pull/5218)) +- Fixed an issue that prevented `rippled` from building on Windows with VS2022. ([#5197](https://github.com/XRPLF/rippled/pull/5197)) +- Fixed `server_definitions` prefixes. ([#5231](https://github.com/XRPLF/rippled/pull/5231)) +- Added missing dependency installations for generic MasOS runners. ([#5233](https://github.com/XRPLF/rippled/pull/5233)) +- Updated deprecated Github actions. ([#5241](https://github.com/XRPLF/rippled/pull/5241)) +- Fixed a failing assert scenario when submitting the `connect` admin RPC. ([#5235](https://github.com/XRPLF/rippled/pull/5235)) +- Fixed the levelization script to ignore single-line comments during dependency analysis. ([#5194](https://github.com/XRPLF/rippled/pull/5194)) +- Fixed the assert name used in `PermissionedDomainDelete`. ([#5245](https://github.com/XRPLF/rippled/pull/5245)) +- Fixed macOS unit tests. ([#5196](https://github.com/XRPLF/rippled/pull/5196)) +- Fixed an issue with validators not accurately reflecting amendment votes. Also added debug logging of amendment votes. ([#5173](https://github.com/XRPLF/rippled/pull/5173), [#5312](https://github.com/XRPLF/rippled/pull/5312)) +- Fixed a potential issue with double-charging fees. ([#5269](https://github.com/XRPLF/rippled/pull/5269)) +- Removed the `new parent hash` assert and replaced it with a log message. ([#5313](https://github.com/XRPLF/rippled/pull/5313)) +- Fixed an issue that prevented previously-failed inbound ledgers to not be acquired if a new trusted proposal arrived. ([#5318](https://github.com/XRPLF/rippled/pull/5318)) + + +### Other Improvements + +- Added unit tests for `AccountID` handling. ([#5174](https://github.com/XRPLF/rippled/pull/5174)) +- Added enforced levelization in `libxrpl` with CMake. ([#5199](https://github.com/XRPLF/rippled/pull/5111)) +- Updated `libxrpl` and all submodules to use the same compiler options. ([#5228](https://github.com/XRPLF/rippled/pull/5228)) +- Added Antithesis instrumentation. ([#5042](https://github.com/XRPLF/rippled/pull/5042), [#5213](https://github.com/XRPLF/rippled/pull/5213)) +- Added `rpcName` to the `LEDGER_ENTRY` macro to help prevent future bugs. ([#5202](https://github.com/XRPLF/rippled/pull/5202)) +- Updated the contribution guidelines to introduce a new workflow that avoids code freezes. Also added scripts that can be used by maintainers in branch management, and a CI job to check that code is consistent across the three main branches: `master`, `release`, and `develop`. ([#5215](https://github.com/XRPLF/rippled/pull/5215)) +- Added unit tests to check for caching issues fixed in `rippled 2.3.0`. ([#5242](https://github.com/XRPLF/rippled/pull/5242)) +- Cleaned up the API changelog. ([#5207](https://github.com/XRPLF/rippled/pull/5207)) +- Improved logs readability. ([#5251](https://github.com/XRPLF/rippled/pull/5251)) +- Updated Visual Studio CI to VS 2022, and added VS Debug builds. ([#5240](https://github.com/XRPLF/rippled/pull/5240)) +- Updated the `secp256k1` library to version 0.6.0. ([#5254](https://github.com/XRPLF/rippled/pull/5254)) +- Changed the `[port_peer]` parameter in `rippled` example config back to `51235`; also added the recommendation to use the default port of `2459` for new deployments. ([#5290](https://github.com/XRPLF/rippled/pull/5290), [#5299](https://github.com/XRPLF/rippled/pull/5299)) +- Improved CI management. ([#5268](https://github.com/XRPLF/rippled/pull/5268)) +- Updated the git commit message rules for contributors. ([#5283](https://github.com/XRPLF/rippled/pull/5283)) +- Fixed unnecessary `setCurrentThreadName` calls. ([#5280](https://github.com/XRPLF/rippled/pull/5280)) +- Added a check to prevent permissioned domains from being created in the event the Permissioned Domains amendement is enabled before the Credentials amendement. ([#5275](https://github.com/XRPLF/rippled/pull/5275)) +- Updated Conan dependencies. ([#5256](https://github.com/XRPLF/rippled/pull/5256)) +- Fixed minor typos in code comments. ([#5279](https://github.com/XRPLF/rippled/pull/5279)) +- Fixed incorrect build instructions. ([#5274](https://github.com/XRPLF/rippled/pull/5274)) +- Refactored `rotateWithLock()` to not hold a lock during callbacks. ([#5276](https://github.com/XRPLF/rippled/pull/5276)) +- Cleaned up debug logging by combining multiple data points into a single message. ([#5302](https://github.com/XRPLF/rippled/pull/5302)) +- Updated build flags to fix performance regressions. ([#5325](https://github.com/XRPLF/rippled/pull/5325)) + + +## Credits + +The following people contributed directly to this release: + +- Aanchal Malhotra +- Bart Thomee <11445373+bthomee@users.noreply.github.com> +- Bronek Kozicki +- code0xff +- Darius Tumas +- David Fuelling +- Donovan Hide +- Ed Hennis +- Elliot Lee +- Javier Romero +- Kenny Lei +- Mark Travis <7728157+mtrippled@users.noreply.github.com> +- Mayukha Vadari +- Michael Legleux +- Oleksandr <115580134+oleks-rip@users.noreply.github.com> +- Qi Zhao +- Ramkumar Srirengaram Gunasegharan +- Shae Wang +- Shawn Xie +- Sophia Xie +- Vijay Khanna Raviraj +- Vladislav Vysokikh +- Xun Zhao + +## Bug Bounties and Responsible Disclosures + +We welcome reviews of the `rippled` code and urge researchers to responsibly disclose any issues they may find. + +To report a bug, please send a detailed report to: # Version 2.3.1 diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index d465994a6b9..7affa212ab9 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -420,6 +420,7 @@ # - r.ripple.com 51235 # - sahyadri.isrdc.in 51235 # - hubs.xrpkuwait.com 51235 +# - hub.xrpl-commons.org 51235 # # Examples: # diff --git a/conanfile.py b/conanfile.py index ec39608d3fd..d49f45903e0 100644 --- a/conanfile.py +++ b/conanfile.py @@ -108,7 +108,7 @@ def requirements(self): if self.options.jemalloc: self.requires('jemalloc/5.3.0') if self.options.rocksdb: - self.requires('rocksdb/6.29.5') + self.requires('rocksdb/9.7.3') exports_sources = ( 'CMakeLists.txt', diff --git a/docs/consensus.md b/docs/consensus.md index 1b0063663a2..4ee5aa70dca 100644 --- a/docs/consensus.md +++ b/docs/consensus.md @@ -558,7 +558,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; }; diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 7ff07f6ea4d..8c3acdee075 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -1,7 +1,7 @@ -#include - #include +#include + int main(int argc, char const** argv) { std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; diff --git a/external/rocksdb/conandata.yml b/external/rocksdb/conandata.yml index 86b42f79f0f..7d7a575d980 100644 --- a/external/rocksdb/conandata.yml +++ b/external/rocksdb/conandata.yml @@ -1,27 +1,12 @@ sources: - "6.29.5": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.29.5.tar.gz" - sha256: "ddbf84791f0980c0bbce3902feb93a2c7006f6f53bfd798926143e31d4d756f0" - "6.27.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.27.3.tar.gz" - sha256: "ee29901749b9132692b26f0a6c1d693f47d1a9ed8e3771e60556afe80282bf58" - "6.20.3": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v6.20.3.tar.gz" - sha256: "c6502c7aae641b7e20fafa6c2b92273d935d2b7b2707135ebd9a67b092169dca" - "8.8.1": - url: "https://github.com/facebook/rocksdb/archive/refs/tags/v8.8.1.tar.gz" - sha256: "056c7e21ad8ae36b026ac3b94b9d6e0fcc60e1d937fc80330921e4181be5c36e" + "9.7.3": + url: "https://github.com/facebook/rocksdb/archive/refs/tags/v9.7.3.tar.gz" + sha256: "acfabb989cbfb5b5c4d23214819b059638193ec33dad2d88373c46448d16d38b" patches: - "6.29.5": - - patch_file: "patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" - patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" - - patch_file: "patches/6.29.5-0002-exclude-thirdparty.patch" + "9.7.3": + - patch_file: "patches/9.x.x-0001-exclude-thirdparty.patch" patch_description: "Do not include thirdparty.inc" patch_type: "portability" - "6.27.3": - - patch_file: "patches/6.27.3-0001-add-include-cstdint-for-gcc-13.patch" - patch_description: "Fix build with gcc 13 by including cstdint" + - patch_file: "patches/9.7.3-0001-memory-leak.patch" + patch_description: "Fix a leak of obsolete blob files left open until DB::Close()" patch_type: "portability" - patch_source: "https://github.com/facebook/rocksdb/pull/11118" diff --git a/external/rocksdb/conanfile.py b/external/rocksdb/conanfile.py index 1c7853d8140..8b85ce1540d 100644 --- a/external/rocksdb/conanfile.py +++ b/external/rocksdb/conanfile.py @@ -15,10 +15,10 @@ class RocksDBConan(ConanFile): name = "rocksdb" - homepage = "https://github.com/facebook/rocksdb" + description = "A library that provides an embeddable, persistent key-value store for fast storage" license = ("GPL-2.0-only", "Apache-2.0") url = "https://github.com/conan-io/conan-center-index" - description = "A library that provides an embeddable, persistent key-value store for fast storage" + homepage = "https://github.com/facebook/rocksdb" topics = ("database", "leveldb", "facebook", "key-value") package_type = "library" settings = "os", "arch", "compiler", "build_type" @@ -58,12 +58,12 @@ def _min_cppstd(self): @property def _compilers_minimum_version(self): return {} if self._min_cppstd == "11" else { - "apple-clang": "10", - "clang": "7", - "gcc": "7", - "msvc": "191", - "Visual Studio": "15", - } + "apple-clang": "10", + "clang": "7", + "gcc": "7", + "msvc": "191", + "Visual Studio": "15", + } def export_sources(self): export_conandata_patches(self) @@ -115,9 +115,9 @@ def validate(self): check_min_vs(self, "191") if self.version == "6.20.3" and \ - self.settings.os == "Linux" and \ - self.settings.compiler == "gcc" and \ - Version(self.settings.compiler.version) < "5": + self.settings.os == "Linux" and \ + self.settings.compiler == "gcc" and \ + Version(self.settings.compiler.version) < "5": raise ConanInvalidConfiguration("Rocksdb 6.20.3 is not compilable with gcc <5.") # See https://github.com/facebook/rocksdb/issues/3522 def source(self): @@ -163,6 +163,8 @@ def generate(self): if self.options.with_jemalloc: deps.set_property("jemalloc", "cmake_file_name", "JeMalloc") deps.set_property("jemalloc", "cmake_target_name", "JeMalloc::JeMalloc") + if self.options.with_zstd: + deps.set_property("zstd", "cmake_target_name", "zstd::zstd") deps.generate() def build(self): diff --git a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch b/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch deleted file mode 100644 index 05725bf2c9a..00000000000 --- a/external/rocksdb/patches/6.29.5-0001-add-include-cstdint-for-gcc-13.patch +++ /dev/null @@ -1,30 +0,0 @@ ---- a/include/rocksdb/utilities/checkpoint.h -+++ b/include/rocksdb/utilities/checkpoint.h -@@ -8,6 +8,7 @@ - #pragma once - #ifndef ROCKSDB_LITE - -+#include - #include - #include - #include "rocksdb/status.h" ---- a/table/block_based/data_block_hash_index.h -+++ b/table/block_based/data_block_hash_index.h -@@ -5,6 +5,7 @@ - - #pragma once - -+#include - #include - #include - ---- a/util/string_util.h -+++ b/util/string_util.h -@@ -6,6 +6,7 @@ - - #pragma once - -+#include - #include - #include - #include diff --git a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch b/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch deleted file mode 100644 index fb0dd0c46b4..00000000000 --- a/external/rocksdb/patches/6.29.5-0002-exclude-thirdparty.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index ec59d4491..35577c998 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -101 +100,0 @@ if(MSVC) -- option(WITH_GFLAGS "build with GFlags" OFF) -@@ -103,2 +102,2 @@ if(MSVC) -- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) --else() -+endif() -+ -@@ -117 +116 @@ else() -- if(MINGW) -+ if(MINGW OR MSVC) -@@ -183 +181,0 @@ else() --endif() diff --git a/external/rocksdb/patches/9.7.3-0001-memory-leak.patch b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch new file mode 100644 index 00000000000..bb086e6cb21 --- /dev/null +++ b/external/rocksdb/patches/9.7.3-0001-memory-leak.patch @@ -0,0 +1,319 @@ +diff --git a/HISTORY.md b/HISTORY.md +index 36d472229..05ad1a202 100644 +--- a/HISTORY.md ++++ b/HISTORY.md +@@ -1,6 +1,10 @@ + # Rocksdb Change Log + > NOTE: Entries for next release do not go here. Follow instructions in `unreleased_history/README.txt` + ++## 9.7.4 (10/31/2024) ++### Bug Fixes ++* Fix a leak of obsolete blob files left open until DB::Close(). This bug was introduced in version 9.4.0. ++ + ## 9.7.3 (10/16/2024) + ### Behavior Changes + * OPTIONS file to be loaded by remote worker is now preserved so that it does not get purged by the primary host. A similar technique as how we are preserving new SST files from getting purged is used for this. min_options_file_numbers_ is tracked like pending_outputs_ is tracked. +diff --git a/db/blob/blob_file_cache.cc b/db/blob/blob_file_cache.cc +index 5f340aadf..1b9faa238 100644 +--- a/db/blob/blob_file_cache.cc ++++ b/db/blob/blob_file_cache.cc +@@ -42,6 +42,7 @@ Status BlobFileCache::GetBlobFileReader( + assert(blob_file_reader); + assert(blob_file_reader->IsEmpty()); + ++ // NOTE: sharing same Cache with table_cache + const Slice key = GetSliceForKey(&blob_file_number); + + assert(cache_); +@@ -98,4 +99,13 @@ Status BlobFileCache::GetBlobFileReader( + return Status::OK(); + } + ++void BlobFileCache::Evict(uint64_t blob_file_number) { ++ // NOTE: sharing same Cache with table_cache ++ const Slice key = GetSliceForKey(&blob_file_number); ++ ++ assert(cache_); ++ ++ cache_.get()->Erase(key); ++} ++ + } // namespace ROCKSDB_NAMESPACE +diff --git a/db/blob/blob_file_cache.h b/db/blob/blob_file_cache.h +index 740e67ada..6858d012b 100644 +--- a/db/blob/blob_file_cache.h ++++ b/db/blob/blob_file_cache.h +@@ -36,6 +36,15 @@ class BlobFileCache { + uint64_t blob_file_number, + CacheHandleGuard* blob_file_reader); + ++ // Called when a blob file is obsolete to ensure it is removed from the cache ++ // to avoid effectively leaking the open file and assicated memory ++ void Evict(uint64_t blob_file_number); ++ ++ // Used to identify cache entries for blob files (not normally useful) ++ static const Cache::CacheItemHelper* GetHelper() { ++ return CacheInterface::GetBasicHelper(); ++ } ++ + private: + using CacheInterface = + BasicTypedCacheInterface; +diff --git a/db/column_family.h b/db/column_family.h +index e4b7adde8..86637736a 100644 +--- a/db/column_family.h ++++ b/db/column_family.h +@@ -401,6 +401,7 @@ class ColumnFamilyData { + SequenceNumber earliest_seq); + + TableCache* table_cache() const { return table_cache_.get(); } ++ BlobFileCache* blob_file_cache() const { return blob_file_cache_.get(); } + BlobSource* blob_source() const { return blob_source_.get(); } + + // See documentation in compaction_picker.h +diff --git a/db/db_impl/db_impl.cc b/db/db_impl/db_impl.cc +index 261593423..06573ac2e 100644 +--- a/db/db_impl/db_impl.cc ++++ b/db/db_impl/db_impl.cc +@@ -659,8 +659,9 @@ Status DBImpl::CloseHelper() { + // We need to release them before the block cache is destroyed. The block + // cache may be destroyed inside versions_.reset(), when column family data + // list is destroyed, so leaving handles in table cache after +- // versions_.reset() may cause issues. +- // Here we clean all unreferenced handles in table cache. ++ // versions_.reset() may cause issues. Here we clean all unreferenced handles ++ // in table cache, and (for certain builds/conditions) assert that no obsolete ++ // files are hanging around unreferenced (leak) in the table/blob file cache. + // Now we assume all user queries have finished, so only version set itself + // can possibly hold the blocks from block cache. After releasing unreferenced + // handles here, only handles held by version set left and inside +@@ -668,6 +669,9 @@ Status DBImpl::CloseHelper() { + // time a handle is released, we erase it from the cache too. By doing that, + // we can guarantee that after versions_.reset(), table cache is empty + // so the cache can be safely destroyed. ++#ifndef NDEBUG ++ TEST_VerifyNoObsoleteFilesCached(/*db_mutex_already_held=*/true); ++#endif // !NDEBUG + table_cache_->EraseUnRefEntries(); + + for (auto& txn_entry : recovered_transactions_) { +@@ -3227,6 +3231,8 @@ Status DBImpl::MultiGetImpl( + s = Status::Aborted(); + break; + } ++ // This could be a long-running operation ++ ROCKSDB_THREAD_YIELD_HOOK(); + } + + // Post processing (decrement reference counts and record statistics) +diff --git a/db/db_impl/db_impl.h b/db/db_impl/db_impl.h +index 5e4fa310b..ccc0abfa7 100644 +--- a/db/db_impl/db_impl.h ++++ b/db/db_impl/db_impl.h +@@ -1241,9 +1241,14 @@ class DBImpl : public DB { + static Status TEST_ValidateOptions(const DBOptions& db_options) { + return ValidateOptions(db_options); + } +- + #endif // NDEBUG + ++ // In certain configurations, verify that the table/blob file cache only ++ // contains entries for live files, to check for effective leaks of open ++ // files. This can only be called when purging of obsolete files has ++ // "settled," such as during parts of DB Close(). ++ void TEST_VerifyNoObsoleteFilesCached(bool db_mutex_already_held) const; ++ + // persist stats to column family "_persistent_stats" + void PersistStats(); + +diff --git a/db/db_impl/db_impl_debug.cc b/db/db_impl/db_impl_debug.cc +index 790a50d7a..67f5b4aaf 100644 +--- a/db/db_impl/db_impl_debug.cc ++++ b/db/db_impl/db_impl_debug.cc +@@ -9,6 +9,7 @@ + + #ifndef NDEBUG + ++#include "db/blob/blob_file_cache.h" + #include "db/column_family.h" + #include "db/db_impl/db_impl.h" + #include "db/error_handler.h" +@@ -328,5 +329,49 @@ size_t DBImpl::TEST_EstimateInMemoryStatsHistorySize() const { + InstrumentedMutexLock l(&const_cast(this)->stats_history_mutex_); + return EstimateInMemoryStatsHistorySize(); + } ++ ++void DBImpl::TEST_VerifyNoObsoleteFilesCached( ++ bool db_mutex_already_held) const { ++ // This check is somewhat expensive and obscure to make a part of every ++ // unit test in every build variety. Thus, we only enable it for ASAN builds. ++ if (!kMustFreeHeapAllocations) { ++ return; ++ } ++ ++ std::optional l; ++ if (db_mutex_already_held) { ++ mutex_.AssertHeld(); ++ } else { ++ l.emplace(&mutex_); ++ } ++ ++ std::vector live_files; ++ for (auto cfd : *versions_->GetColumnFamilySet()) { ++ if (cfd->IsDropped()) { ++ continue; ++ } ++ // Sneakily add both SST and blob files to the same list ++ cfd->current()->AddLiveFiles(&live_files, &live_files); ++ } ++ std::sort(live_files.begin(), live_files.end()); ++ ++ auto fn = [&live_files](const Slice& key, Cache::ObjectPtr, size_t, ++ const Cache::CacheItemHelper* helper) { ++ if (helper != BlobFileCache::GetHelper()) { ++ // Skip non-blob files for now ++ // FIXME: diagnose and fix the leaks of obsolete SST files revealed in ++ // unit tests. ++ return; ++ } ++ // See TableCache and BlobFileCache ++ assert(key.size() == sizeof(uint64_t)); ++ uint64_t file_number; ++ GetUnaligned(reinterpret_cast(key.data()), &file_number); ++ // Assert file is in sorted live_files ++ assert( ++ std::binary_search(live_files.begin(), live_files.end(), file_number)); ++ }; ++ table_cache_->ApplyToAllEntries(fn, {}); ++} + } // namespace ROCKSDB_NAMESPACE + #endif // NDEBUG +diff --git a/db/db_iter.cc b/db/db_iter.cc +index e02586377..bf4749eb9 100644 +--- a/db/db_iter.cc ++++ b/db/db_iter.cc +@@ -540,6 +540,8 @@ bool DBIter::FindNextUserEntryInternal(bool skipping_saved_key, + } else { + iter_.Next(); + } ++ // This could be a long-running operation due to tombstones, etc. ++ ROCKSDB_THREAD_YIELD_HOOK(); + } while (iter_.Valid()); + + valid_ = false; +diff --git a/db/table_cache.cc b/db/table_cache.cc +index 71fc29c32..8a5be75e8 100644 +--- a/db/table_cache.cc ++++ b/db/table_cache.cc +@@ -164,6 +164,7 @@ Status TableCache::GetTableReader( + } + + Cache::Handle* TableCache::Lookup(Cache* cache, uint64_t file_number) { ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&file_number); + return cache->Lookup(key); + } +@@ -179,6 +180,7 @@ Status TableCache::FindTable( + size_t max_file_size_for_l0_meta_pin, Temperature file_temperature) { + PERF_TIMER_GUARD_WITH_CLOCK(find_table_nanos, ioptions_.clock); + uint64_t number = file_meta.fd.GetNumber(); ++ // NOTE: sharing same Cache with BlobFileCache + Slice key = GetSliceForFileNumber(&number); + *handle = cache_.Lookup(key); + TEST_SYNC_POINT_CALLBACK("TableCache::FindTable:0", +diff --git a/db/version_builder.cc b/db/version_builder.cc +index ed8ab8214..c98f53f42 100644 +--- a/db/version_builder.cc ++++ b/db/version_builder.cc +@@ -24,6 +24,7 @@ + #include + + #include "cache/cache_reservation_manager.h" ++#include "db/blob/blob_file_cache.h" + #include "db/blob/blob_file_meta.h" + #include "db/dbformat.h" + #include "db/internal_stats.h" +@@ -744,12 +745,9 @@ class VersionBuilder::Rep { + return Status::Corruption("VersionBuilder", oss.str()); + } + +- // Note: we use C++11 for now but in C++14, this could be done in a more +- // elegant way using generalized lambda capture. +- VersionSet* const vs = version_set_; +- const ImmutableCFOptions* const ioptions = ioptions_; +- +- auto deleter = [vs, ioptions](SharedBlobFileMetaData* shared_meta) { ++ auto deleter = [vs = version_set_, ioptions = ioptions_, ++ bc = cfd_ ? cfd_->blob_file_cache() ++ : nullptr](SharedBlobFileMetaData* shared_meta) { + if (vs) { + assert(ioptions); + assert(!ioptions->cf_paths.empty()); +@@ -758,6 +756,9 @@ class VersionBuilder::Rep { + vs->AddObsoleteBlobFile(shared_meta->GetBlobFileNumber(), + ioptions->cf_paths.front().path); + } ++ if (bc) { ++ bc->Evict(shared_meta->GetBlobFileNumber()); ++ } + + delete shared_meta; + }; +@@ -766,7 +767,7 @@ class VersionBuilder::Rep { + blob_file_number, blob_file_addition.GetTotalBlobCount(), + blob_file_addition.GetTotalBlobBytes(), + blob_file_addition.GetChecksumMethod(), +- blob_file_addition.GetChecksumValue(), deleter); ++ blob_file_addition.GetChecksumValue(), std::move(deleter)); + + mutable_blob_file_metas_.emplace( + blob_file_number, MutableBlobFileMetaData(std::move(shared_meta))); +diff --git a/db/version_set.h b/db/version_set.h +index 9336782b1..024f869e7 100644 +--- a/db/version_set.h ++++ b/db/version_set.h +@@ -1514,7 +1514,6 @@ class VersionSet { + void GetLiveFilesMetaData(std::vector* metadata); + + void AddObsoleteBlobFile(uint64_t blob_file_number, std::string path) { +- // TODO: Erase file from BlobFileCache? + obsolete_blob_files_.emplace_back(blob_file_number, std::move(path)); + } + +diff --git a/include/rocksdb/version.h b/include/rocksdb/version.h +index 2a19796b8..0afa2cab1 100644 +--- a/include/rocksdb/version.h ++++ b/include/rocksdb/version.h +@@ -13,7 +13,7 @@ + // minor or major version number planned for release. + #define ROCKSDB_MAJOR 9 + #define ROCKSDB_MINOR 7 +-#define ROCKSDB_PATCH 3 ++#define ROCKSDB_PATCH 4 + + // Do not use these. We made the mistake of declaring macros starting with + // double underscore. Now we have to live with our choice. We'll deprecate these +diff --git a/port/port.h b/port/port.h +index 13aa56d47..141716e5b 100644 +--- a/port/port.h ++++ b/port/port.h +@@ -19,3 +19,19 @@ + #elif defined(OS_WIN) + #include "port/win/port_win.h" + #endif ++ ++#ifdef OS_LINUX ++// A temporary hook into long-running RocksDB threads to support modifying their ++// priority etc. This should become a public API hook once the requirements ++// are better understood. ++extern "C" void RocksDbThreadYield() __attribute__((__weak__)); ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ { \ ++ if (RocksDbThreadYield) { \ ++ RocksDbThreadYield(); \ ++ } \ ++ } ++#else ++#define ROCKSDB_THREAD_YIELD_HOOK() \ ++ {} ++#endif diff --git a/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch new file mode 100644 index 00000000000..7b5858bc1e9 --- /dev/null +++ b/external/rocksdb/patches/9.x.x-0001-exclude-thirdparty.patch @@ -0,0 +1,30 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 93b884d..b715cb6 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -106,14 +106,9 @@ endif() + include(CMakeDependentOption) + + if(MSVC) +- option(WITH_GFLAGS "build with GFlags" OFF) + option(WITH_XPRESS "build with windows built in compression" OFF) +- option(ROCKSDB_SKIP_THIRDPARTY "skip thirdparty.inc" OFF) +- +- if(NOT ROCKSDB_SKIP_THIRDPARTY) +- include(${CMAKE_CURRENT_SOURCE_DIR}/thirdparty.inc) +- endif() +-else() ++endif() ++if(TRUE) + if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD" AND NOT CMAKE_SYSTEM_NAME MATCHES "kFreeBSD") + # FreeBSD has jemalloc as default malloc + # but it does not have all the jemalloc files in include/... +@@ -126,7 +121,7 @@ else() + endif() + endif() + +- if(MINGW) ++ if(MSVC OR MINGW) + option(WITH_GFLAGS "build with GFlags" OFF) + else() + option(WITH_GFLAGS "build with GFlags" ON) diff --git a/include/xrpl/basics/BasicConfig.h b/include/xrpl/basics/BasicConfig.h index f7e90c7c9a4..2e3478644e2 100644 --- a/include/xrpl/basics/BasicConfig.h +++ b/include/xrpl/basics/BasicConfig.h @@ -27,7 +27,6 @@ #include #include -#include #include #include #include diff --git a/include/xrpl/basics/Buffer.h b/include/xrpl/basics/Buffer.h index eb7a4571981..b2f11634525 100644 --- a/include/xrpl/basics/Buffer.h +++ b/include/xrpl/basics/Buffer.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/include/xrpl/basics/CompressionAlgorithms.h b/include/xrpl/basics/CompressionAlgorithms.h index 4defd5a4904..19db3568d6b 100644 --- a/include/xrpl/basics/CompressionAlgorithms.h +++ b/include/xrpl/basics/CompressionAlgorithms.h @@ -21,9 +21,11 @@ #define RIPPLED_COMPRESSIONALGORITHMS_H_INCLUDED #include + +#include + #include #include -#include #include #include diff --git a/include/xrpl/basics/CountedObject.h b/include/xrpl/basics/CountedObject.h index 9ea76aa3bd0..ef4b6544d20 100644 --- a/include/xrpl/basics/CountedObject.h +++ b/include/xrpl/basics/CountedObject.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_COUNTEDOBJECT_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/Expected.h b/include/xrpl/basics/Expected.h index ced41b13caa..9abc7c8432b 100644 --- a/include/xrpl/basics/Expected.h +++ b/include/xrpl/basics/Expected.h @@ -24,9 +24,7 @@ #include -#include #include -#include namespace ripple { diff --git a/include/xrpl/basics/LocalValue.h b/include/xrpl/basics/LocalValue.h index 41556f34f29..1f53fab2468 100644 --- a/include/xrpl/basics/LocalValue.h +++ b/include/xrpl/basics/LocalValue.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_LOCALVALUE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/basics/Log.h b/include/xrpl/basics/Log.h index 442270546e6..2506b8ea8dd 100644 --- a/include/xrpl/basics/Log.h +++ b/include/xrpl/basics/Log.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/basics/Resolver.h b/include/xrpl/basics/Resolver.h index 6cba352e0a0..2ed32f39bd0 100644 --- a/include/xrpl/basics/Resolver.h +++ b/include/xrpl/basics/Resolver.h @@ -20,11 +20,11 @@ #ifndef RIPPLE_BASICS_RESOLVER_H_INCLUDED #define RIPPLE_BASICS_RESOLVER_H_INCLUDED +#include + #include #include -#include - namespace ripple { class Resolver diff --git a/include/xrpl/basics/ResolverAsio.h b/include/xrpl/basics/ResolverAsio.h index 51fcbdfb0d8..49700d2b243 100644 --- a/include/xrpl/basics/ResolverAsio.h +++ b/include/xrpl/basics/ResolverAsio.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/basics/Slice.h b/include/xrpl/basics/Slice.h index 9e9991f0dd2..65d7acfd94e 100644 --- a/include/xrpl/basics/Slice.h +++ b/include/xrpl/basics/Slice.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/TaggedCache.h b/include/xrpl/basics/TaggedCache.h index 1fcdc3707b6..dcc7c0def96 100644 --- a/include/xrpl/basics/TaggedCache.h +++ b/include/xrpl/basics/TaggedCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/basics/UnorderedContainers.h b/include/xrpl/basics/UnorderedContainers.h index b689a1b6ac8..4f6e1093b13 100644 --- a/include/xrpl/basics/UnorderedContainers.h +++ b/include/xrpl/basics/UnorderedContainers.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/basics/base_uint.h b/include/xrpl/basics/base_uint.h index 05d83b3bb0a..4b93330ef22 100644 --- a/include/xrpl/basics/base_uint.h +++ b/include/xrpl/basics/base_uint.h @@ -33,12 +33,13 @@ #include #include #include + #include #include + #include #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/chrono.h b/include/xrpl/basics/chrono.h index d739b6bf44b..2ed1a960470 100644 --- a/include/xrpl/basics/chrono.h +++ b/include/xrpl/basics/chrono.h @@ -20,17 +20,16 @@ #ifndef RIPPLE_BASICS_CHRONO_H_INCLUDED #define RIPPLE_BASICS_CHRONO_H_INCLUDED -#include - #include #include #include +#include + #include #include #include #include -#include namespace ripple { diff --git a/include/xrpl/basics/contract.h b/include/xrpl/basics/contract.h index bdfc8aac362..bf98964b9eb 100644 --- a/include/xrpl/basics/contract.h +++ b/include/xrpl/basics/contract.h @@ -21,9 +21,9 @@ #define RIPPLE_BASICS_CONTRACT_H_INCLUDED #include + #include #include -#include #include namespace ripple { diff --git a/include/xrpl/basics/make_SSLContext.h b/include/xrpl/basics/make_SSLContext.h index c752a075859..aba797ce31e 100644 --- a/include/xrpl/basics/make_SSLContext.h +++ b/include/xrpl/basics/make_SSLContext.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_MAKE_SSLCONTEXT_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/basics/partitioned_unordered_map.h b/include/xrpl/basics/partitioned_unordered_map.h index 4619ca1f4ce..a378011520f 100644 --- a/include/xrpl/basics/partitioned_unordered_map.h +++ b/include/xrpl/basics/partitioned_unordered_map.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/basics/random.h b/include/xrpl/basics/random.h index ca65b581d2e..4b8bc81759b 100644 --- a/include/xrpl/basics/random.h +++ b/include/xrpl/basics/random.h @@ -22,9 +22,9 @@ #include #include + #include #include -#include #include #include #include diff --git a/include/xrpl/basics/spinlock.h b/include/xrpl/basics/spinlock.h index 14a063e27a6..5d5097bd2df 100644 --- a/include/xrpl/basics/spinlock.h +++ b/include/xrpl/basics/spinlock.h @@ -19,6 +19,7 @@ #define RIPPLE_BASICS_SPINLOCK_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/basics/tagged_integer.h b/include/xrpl/basics/tagged_integer.h index 4629e830916..b826b87db15 100644 --- a/include/xrpl/basics/tagged_integer.h +++ b/include/xrpl/basics/tagged_integer.h @@ -21,7 +21,9 @@ #define BEAST_UTILITY_TAGGED_INTEGER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/asio/io_latency_probe.h b/include/xrpl/beast/asio/io_latency_probe.h index ca3efcdb3f1..966b4686aea 100644 --- a/include/xrpl/beast/asio/io_latency_probe.h +++ b/include/xrpl/beast/asio/io_latency_probe.h @@ -21,6 +21,7 @@ #define BEAST_ASIO_IO_LATENCY_PROBE_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/container/detail/aged_ordered_container.h b/include/xrpl/beast/container/detail/aged_ordered_container.h index ad807e92cfe..8c978d05173 100644 --- a/include/xrpl/beast/container/detail/aged_ordered_container.h +++ b/include/xrpl/beast/container/detail/aged_ordered_container.h @@ -25,9 +25,11 @@ #include #include #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/aged_unordered_container.h b/include/xrpl/beast/container/detail/aged_unordered_container.h index abafc6b2c4c..3b9c83a0149 100644 --- a/include/xrpl/beast/container/detail/aged_unordered_container.h +++ b/include/xrpl/beast/container/detail/aged_unordered_container.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/container/detail/empty_base_optimization.h b/include/xrpl/beast/container/detail/empty_base_optimization.h index 4cdc3a0e162..350046d5940 100644 --- a/include/xrpl/beast/container/detail/empty_base_optimization.h +++ b/include/xrpl/beast/container/detail/empty_base_optimization.h @@ -11,6 +11,7 @@ #define BEAST_CONTAINER_DETAIL_EMPTY_BASE_OPTIMIZATION_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/core/LexicalCast.h b/include/xrpl/beast/core/LexicalCast.h index b01fd8ae140..aa67bcad50f 100644 --- a/include/xrpl/beast/core/LexicalCast.h +++ b/include/xrpl/beast/core/LexicalCast.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/core/List.h b/include/xrpl/beast/core/List.h index 9b3c889d6ac..d95f92d1c8e 100644 --- a/include/xrpl/beast/core/List.h +++ b/include/xrpl/beast/core/List.h @@ -21,7 +21,6 @@ #define BEAST_INTRUSIVE_LIST_H_INCLUDED #include -#include namespace beast { diff --git a/include/xrpl/beast/hash/hash_append.h b/include/xrpl/beast/hash/hash_append.h index 2cbcd9ae3d0..6b11fe1eb32 100644 --- a/include/xrpl/beast/hash/hash_append.h +++ b/include/xrpl/beast/hash/hash_append.h @@ -23,6 +23,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/beast/hash/xxhasher.h b/include/xrpl/beast/hash/xxhasher.h index 30af05ef0a1..381980902ac 100644 --- a/include/xrpl/beast/hash/xxhasher.h +++ b/include/xrpl/beast/hash/xxhasher.h @@ -21,6 +21,7 @@ #define BEAST_HASH_XXHASHER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/beast/insight/Meter.h b/include/xrpl/beast/insight/Meter.h index febd5cb3dc4..7ef71988a13 100644 --- a/include/xrpl/beast/insight/Meter.h +++ b/include/xrpl/beast/insight/Meter.h @@ -20,10 +20,10 @@ #ifndef BEAST_INSIGHT_METER_H_INCLUDED #define BEAST_INSIGHT_METER_H_INCLUDED -#include - #include +#include + namespace beast { namespace insight { diff --git a/include/xrpl/beast/insight/StatsDCollector.h b/include/xrpl/beast/insight/StatsDCollector.h index 78195048d7f..fb47eeb7fc3 100644 --- a/include/xrpl/beast/insight/StatsDCollector.h +++ b/include/xrpl/beast/insight/StatsDCollector.h @@ -21,7 +21,6 @@ #define BEAST_INSIGHT_STATSDCOLLECTOR_H_INCLUDED #include - #include #include diff --git a/include/xrpl/beast/net/IPAddress.h b/include/xrpl/beast/net/IPAddress.h index cdac4abbd9c..62469cfda1b 100644 --- a/include/xrpl/beast/net/IPAddress.h +++ b/include/xrpl/beast/net/IPAddress.h @@ -25,8 +25,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressConversion.h b/include/xrpl/beast/net/IPAddressConversion.h index 982a8e50f26..0dfbe3197d1 100644 --- a/include/xrpl/beast/net/IPAddressConversion.h +++ b/include/xrpl/beast/net/IPAddressConversion.h @@ -22,8 +22,6 @@ #include -#include - #include namespace beast { diff --git a/include/xrpl/beast/net/IPAddressV4.h b/include/xrpl/beast/net/IPAddressV4.h index 7711a970dec..98a92dba207 100644 --- a/include/xrpl/beast/net/IPAddressV4.h +++ b/include/xrpl/beast/net/IPAddressV4.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV4_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/net/IPAddressV6.h b/include/xrpl/beast/net/IPAddressV6.h index 83e4d6f8a32..4a4ef73b86e 100644 --- a/include/xrpl/beast/net/IPAddressV6.h +++ b/include/xrpl/beast/net/IPAddressV6.h @@ -21,7 +21,9 @@ #define BEAST_NET_IPADDRESSV6_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/rfc2616.h b/include/xrpl/beast/rfc2616.h index 7f96e924eb5..648fbc22e2f 100644 --- a/include/xrpl/beast/rfc2616.h +++ b/include/xrpl/beast/rfc2616.h @@ -20,10 +20,6 @@ #ifndef BEAST_RFC2616_HPP #define BEAST_RFC2616_HPP -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include #include @@ -32,6 +28,7 @@ #include #include +#include #include #include #include diff --git a/include/xrpl/beast/test/yield_to.h b/include/xrpl/beast/test/yield_to.h index 9d0f50eebff..9e9f83b8974 100644 --- a/include/xrpl/beast/test/yield_to.h +++ b/include/xrpl/beast/test/yield_to.h @@ -11,6 +11,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/match.h b/include/xrpl/beast/unit_test/match.h index e8e12bd5568..641787e8146 100644 --- a/include/xrpl/beast/unit_test/match.h +++ b/include/xrpl/beast/unit_test/match.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_MATCH_HPP #include + #include namespace beast { diff --git a/include/xrpl/beast/unit_test/reporter.h b/include/xrpl/beast/unit_test/reporter.h index 956def1c30d..e7a7d4b3adf 100644 --- a/include/xrpl/beast/unit_test/reporter.h +++ b/include/xrpl/beast/unit_test/reporter.h @@ -10,8 +10,10 @@ #include #include + #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/runner.h b/include/xrpl/beast/unit_test/runner.h index 6330f2c8c81..283f7c87238 100644 --- a/include/xrpl/beast/unit_test/runner.h +++ b/include/xrpl/beast/unit_test/runner.h @@ -9,7 +9,9 @@ #define BEAST_UNIT_TEST_RUNNER_H_INCLUDED #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite.h b/include/xrpl/beast/unit_test/suite.h index d49730d4d5f..51cd3e17ea1 100644 --- a/include/xrpl/beast/unit_test/suite.h +++ b/include/xrpl/beast/unit_test/suite.h @@ -9,9 +9,11 @@ #define BEAST_UNIT_TEST_SUITE_HPP #include + #include #include #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/suite_list.h b/include/xrpl/beast/unit_test/suite_list.h index 5856b4c7dba..0095290eaca 100644 --- a/include/xrpl/beast/unit_test/suite_list.h +++ b/include/xrpl/beast/unit_test/suite_list.h @@ -10,7 +10,9 @@ #include #include + #include + #include #include #include diff --git a/include/xrpl/beast/unit_test/thread.h b/include/xrpl/beast/unit_test/thread.h index e94108f7879..99572a549d9 100644 --- a/include/xrpl/beast/unit_test/thread.h +++ b/include/xrpl/beast/unit_test/thread.h @@ -9,6 +9,7 @@ #define BEAST_UNIT_TEST_THREAD_HPP #include + #include #include #include diff --git a/include/xrpl/beast/utility/Journal.h b/include/xrpl/beast/utility/Journal.h index 41cea2a3a0b..91ddf33d271 100644 --- a/include/xrpl/beast/utility/Journal.h +++ b/include/xrpl/beast/utility/Journal.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_JOURNAL_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/beast/utility/PropertyStream.h b/include/xrpl/beast/utility/PropertyStream.h index 5eaf70453e8..18895e2410a 100644 --- a/include/xrpl/beast/utility/PropertyStream.h +++ b/include/xrpl/beast/utility/PropertyStream.h @@ -22,11 +22,9 @@ #include -#include #include #include #include -#include namespace beast { diff --git a/include/xrpl/beast/utility/rngfill.h b/include/xrpl/beast/utility/rngfill.h index 93f11559cf8..0188e5c5294 100644 --- a/include/xrpl/beast/utility/rngfill.h +++ b/include/xrpl/beast/utility/rngfill.h @@ -21,6 +21,7 @@ #define BEAST_RANDOM_RNGFILL_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/beast/utility/temp_dir.h b/include/xrpl/beast/utility/temp_dir.h index 689b2d1efbf..bbb7afc7b43 100644 --- a/include/xrpl/beast/utility/temp_dir.h +++ b/include/xrpl/beast/utility/temp_dir.h @@ -21,6 +21,7 @@ #define BEAST_UTILITY_TEMP_DIR_H_INCLUDED #include + #include namespace beast { diff --git a/include/xrpl/crypto/csprng.h b/include/xrpl/crypto/csprng.h index 3ad5d700046..9a4e933a2e7 100644 --- a/include/xrpl/crypto/csprng.h +++ b/include/xrpl/crypto/csprng.h @@ -21,8 +21,6 @@ #define RIPPLE_CRYPTO_RANDOM_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/include/xrpl/json/Object.h b/include/xrpl/json/Object.h index ec60e562028..87ef8ea4f28 100644 --- a/include/xrpl/json/Object.h +++ b/include/xrpl/json/Object.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OBJECT_H_INCLUDED #include + #include namespace Json { diff --git a/include/xrpl/json/Output.h b/include/xrpl/json/Output.h index 96905c20ba9..ef5f68e5180 100644 --- a/include/xrpl/json/Output.h +++ b/include/xrpl/json/Output.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_OUTPUT_H_INCLUDED #include + #include #include diff --git a/include/xrpl/json/Writer.h b/include/xrpl/json/Writer.h index 882e944093e..f4c37c33162 100644 --- a/include/xrpl/json/Writer.h +++ b/include/xrpl/json/Writer.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace Json { diff --git a/include/xrpl/json/detail/json_assert.h b/include/xrpl/json/detail/json_assert.h index 264bcd90f3d..5d680e6e34d 100644 --- a/include/xrpl/json/detail/json_assert.h +++ b/include/xrpl/json/detail/json_assert.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_JSON_JSON_ASSERT_H_INCLUDED #define RIPPLE_JSON_JSON_ASSERT_H_INCLUDED +#include #include #define JSON_ASSERT_MESSAGE(condition, message) \ diff --git a/include/xrpl/json/json_reader.h b/include/xrpl/json/json_reader.h index 6fb07c318d8..27d608f8504 100644 --- a/include/xrpl/json/json_reader.h +++ b/include/xrpl/json/json_reader.h @@ -24,7 +24,9 @@ #include #include + #include + #include namespace Json { diff --git a/include/xrpl/json/json_value.h b/include/xrpl/json/json_value.h index e419940171e..91d29c28d68 100644 --- a/include/xrpl/json/json_value.h +++ b/include/xrpl/json/json_value.h @@ -21,6 +21,7 @@ #define RIPPLE_JSON_JSON_VALUE_H_INCLUDED #include + #include #include #include diff --git a/include/xrpl/json/json_writer.h b/include/xrpl/json/json_writer.h index 86a5ecd984a..1b4ff155083 100644 --- a/include/xrpl/json/json_writer.h +++ b/include/xrpl/json/json_writer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/Book.h b/include/xrpl/protocol/Book.h index 164a5ccfa99..0a04deb2771 100644 --- a/include/xrpl/protocol/Book.h +++ b/include/xrpl/protocol/Book.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Feature.h b/include/xrpl/protocol/Feature.h index b6477baa02d..a2eb7d8e50a 100644 --- a/include/xrpl/protocol/Feature.h +++ b/include/xrpl/protocol/Feature.h @@ -21,7 +21,9 @@ #define RIPPLE_PROTOCOL_FEATURE_H_INCLUDED #include + #include + #include #include #include @@ -33,35 +35,39 @@ * * Steps required to add new features to the code: * - * 1) In this file, increment `numFeatures` and add a uint256 declaration - * for the feature at the bottom - * 2) Add a uint256 definition for the feature to the corresponding source - * file (Feature.cpp). Use `registerFeature` to create the feature with - * the feature's name, `Supported::no`, and `VoteBehavior::DefaultNo`. This - * should be the only place the feature's name appears in code as a string. - * 3) Use the uint256 as the parameter to `view.rules.enabled()` to - * control flow into new code that this feature limits. - * 4) If the feature development is COMPLETE, and the feature is ready to be - * SUPPORTED, change the `registerFeature` parameter to Supported::yes. - * 5) When the feature is ready to be ENABLED, change the `registerFeature` - * parameter to `VoteBehavior::DefaultYes`. - * In general, any newly supported amendments (`Supported::yes`) should have - * a `VoteBehavior::DefaultNo` for at least one full release cycle. High - * priority bug fixes can be an exception to this rule of thumb. + * 1) Add the appropriate XRPL_FEATURE or XRPL_FIX macro definition for the + * feature to features.macro with the feature's name, `Supported::no`, and + * `VoteBehavior::DefaultNo`. + * + * 2) Use the generated variable name as the parameter to `view.rules.enabled()` + * to control flow into new code that this feature limits. (featureName or + * fixName) + * + * 3) If the feature development is COMPLETE, and the feature is ready to be + * SUPPORTED, change the macro parameter in features.macro to Supported::yes. + * + * 4) In general, any newly supported amendments (`Supported::yes`) should have + * a `VoteBehavior::DefaultNo` indefinitely so that external governance can + * make the decision on when to activate it. High priority bug fixes can be + * an exception to this rule. In such cases, ensure the fix has been + * clearly communicated to the community using appropriate channels, + * then change the macro parameter in features.macro to + * `VoteBehavior::DefaultYes`. The communication process is beyond + * the scope of these instructions. + * * * When a feature has been enabled for several years, the conditional code * may be removed, and the feature "retired". To retire a feature: - * 1) Remove the uint256 declaration from this file. - * 2) MOVE the uint256 definition in Feature.cpp to the "retired features" - * section at the end of the file. - * 3) CHANGE the name of the variable to start with "retired". - * 4) CHANGE the parameters of the `registerFeature` call to `Supported::yes` - * and `VoteBehavior::DefaultNo`. + * + * 1) MOVE the macro definition in features.macro to the "retired features" + * section at the end of the file, and change the macro to XRPL_RETIRE. + * * The feature must remain registered and supported indefinitely because it - * still exists in the ledger, but there is no need to vote for it because - * there's nothing to vote for. If it is removed completely from the code, any - * instances running that code will get amendment blocked. Removing the - * feature from the ledger is beyond the scope of these instructions. + * may exist in the Amendments object on ledger. There is no need to vote + * for it because there's nothing to vote for. If the feature definition is + * removed completely from the code, any instances running that code will get + * amendment blocked. Removing the feature from the ledger is beyond the scope + * of these instructions. * */ @@ -76,11 +82,32 @@ allAmendments(); namespace detail { +#pragma push_macro("XRPL_FEATURE") +#undef XRPL_FEATURE +#pragma push_macro("XRPL_FIX") +#undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE + +#define XRPL_FEATURE(name, supported, vote) +1 +#define XRPL_FIX(name, supported, vote) +1 +#define XRPL_RETIRE(name) +1 + // This value SHOULD be equal to the number of amendments registered in // Feature.cpp. Because it's only used to reserve storage, and determine how // large to make the FeatureBitset, it MAY be larger. It MUST NOT be less than // the actual number of amendments. A LogicError on startup will verify this. -static constexpr std::size_t numFeatures = 89; +static constexpr std::size_t numFeatures = + (0 + +#include + ); + +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") +#undef XRPL_FIX +#pragma pop_macro("XRPL_FIX") +#undef XRPL_FEATURE +#pragma pop_macro("XRPL_FEATURE") /** Amendments that this server supports and the default voting behavior. Whether they are enabled depends on the Rules defined in the validated @@ -320,12 +347,17 @@ foreachFeature(FeatureBitset bs, F&& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) extern uint256 const feature##name; #define XRPL_FIX(name, supported, vote) extern uint256 const fix##name; +#define XRPL_RETIRE(name) #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 640635c3fcb..0cbf1b608a2 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/HashPrefix.h b/include/xrpl/protocol/HashPrefix.h index 0b6ddda4921..ab825658e82 100644 --- a/include/xrpl/protocol/HashPrefix.h +++ b/include/xrpl/protocol/HashPrefix.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_HASHPREFIX_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index e89feb123d0..6895ed08aed 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/KnownFormats.h b/include/xrpl/protocol/KnownFormats.h index 5f5a04be1b3..db2042eadea 100644 --- a/include/xrpl/protocol/KnownFormats.h +++ b/include/xrpl/protocol/KnownFormats.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/include/xrpl/protocol/MultiApiJson.h b/include/xrpl/protocol/MultiApiJson.h index 03bab9b32ea..15743e856b6 100644 --- a/include/xrpl/protocol/MultiApiJson.h +++ b/include/xrpl/protocol/MultiApiJson.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED #define RIPPLE_JSON_MULTIAPIJSON_H_INCLUDED +#include #include #include -#include #include #include #include diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 81a45c383fb..1e8c76dbd8b 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/Rate.h b/include/xrpl/protocol/Rate.h index 2872a5809de..548a7af6f99 100644 --- a/include/xrpl/protocol/Rate.h +++ b/include/xrpl/protocol/Rate.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/SOTemplate.h b/include/xrpl/protocol/SOTemplate.h index b86fb63b858..9fd4cbf19d5 100644 --- a/include/xrpl/protocol/SOTemplate.h +++ b/include/xrpl/protocol/SOTemplate.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/include/xrpl/protocol/STBase.h b/include/xrpl/protocol/STBase.h index 097341384f3..e0f28e03dea 100644 --- a/include/xrpl/protocol/STBase.h +++ b/include/xrpl/protocol/STBase.h @@ -23,12 +23,14 @@ #include #include #include + #include #include #include #include #include #include + namespace ripple { /// Note, should be treated as flags that can be | and & diff --git a/include/xrpl/protocol/STExchange.h b/include/xrpl/protocol/STExchange.h index e1a1215dbdd..dd7c4834a6b 100644 --- a/include/xrpl/protocol/STExchange.h +++ b/include/xrpl/protocol/STExchange.h @@ -28,6 +28,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/STLedgerEntry.h b/include/xrpl/protocol/STLedgerEntry.h index 6a57b32451a..96b37af0b9a 100644 --- a/include/xrpl/protocol/STLedgerEntry.h +++ b/include/xrpl/protocol/STLedgerEntry.h @@ -124,4 +124,4 @@ STLedgerEntry::getType() const } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 4c8db2e01e4..b89a415ebe3 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -35,7 +35,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/protocol/STParsedJSON.h b/include/xrpl/protocol/STParsedJSON.h index d2052bf1f4c..d6559690302 100644 --- a/include/xrpl/protocol/STParsedJSON.h +++ b/include/xrpl/protocol/STParsedJSON.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_STPARSEDJSON_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/protocol/STPathSet.h b/include/xrpl/protocol/STPathSet.h index 953a209c150..7605a2283c7 100644 --- a/include/xrpl/protocol/STPathSet.h +++ b/include/xrpl/protocol/STPathSet.h @@ -26,6 +26,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STTx.h b/include/xrpl/protocol/STTx.h index 08b9a1bad10..8de2c8cc313 100644 --- a/include/xrpl/protocol/STTx.h +++ b/include/xrpl/protocol/STTx.h @@ -28,6 +28,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/STValidation.h b/include/xrpl/protocol/STValidation.h index 4f3e18de326..11ec733c01b 100644 --- a/include/xrpl/protocol/STValidation.h +++ b/include/xrpl/protocol/STValidation.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include @@ -146,8 +147,7 @@ class STValidation final : public STObject, public CountedObject render() const { std::stringstream ss; - ss << "validation: " - << " ledger_hash: " << getLedgerHash() + ss << "validation: " << " ledger_hash: " << getLedgerHash() << " consensus_hash: " << getConsensusHash() << " sign_time: " << to_string(getSignTime()) << " seen_time: " << to_string(getSeenTime()) diff --git a/include/xrpl/protocol/SecretKey.h b/include/xrpl/protocol/SecretKey.h index 67dc9c4ca59..1a13cd17c98 100644 --- a/include/xrpl/protocol/SecretKey.h +++ b/include/xrpl/protocol/SecretKey.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Seed.h b/include/xrpl/protocol/Seed.h index 1d0a736db8a..8a43d597a5c 100644 --- a/include/xrpl/protocol/Seed.h +++ b/include/xrpl/protocol/Seed.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/include/xrpl/protocol/Serializer.h b/include/xrpl/protocol/Serializer.h index 80829c80003..5724a19f575 100644 --- a/include/xrpl/protocol/Serializer.h +++ b/include/xrpl/protocol/Serializer.h @@ -30,6 +30,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/protocol/Sign.h b/include/xrpl/protocol/Sign.h index dcbe5dfd0db..7e1156ceda7 100644 --- a/include/xrpl/protocol/Sign.h +++ b/include/xrpl/protocol/Sign.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/protocol/SystemParameters.h b/include/xrpl/protocol/SystemParameters.h index af492340545..121435dd92f 100644 --- a/include/xrpl/protocol/SystemParameters.h +++ b/include/xrpl/protocol/SystemParameters.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 01bf4669aa7..4f544963f03 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -42,7 +42,7 @@ using TERUnderlyingType = int; enum TELcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -399 .. -300: L Local error (transaction fee inadequate, exceeds local @@ -73,7 +73,7 @@ enum TELcodes : TERUnderlyingType { enum TEMcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -299 .. -200: M Malformed (bad signature) @@ -148,7 +148,7 @@ enum TEMcodes : TERUnderlyingType { enum TEFcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -199 .. -100: F @@ -192,7 +192,7 @@ enum TEFcodes : TERUnderlyingType { enum TERcodes : TERUnderlyingType { // Note: Range is stable. // Exact numbers are used in ripple-binary-codec: - // https://github.com/ripple/ripple-binary-codec/blob/master/src/enums/definitions.json + // https://github.com/XRPLF/xrpl.js/blob/main/packages/ripple-binary-codec/src/enums/definitions.json // Use tokens. // -99 .. -1: R Retry diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index f0f6c7f223c..e94e79aee5e 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -20,10 +20,10 @@ #ifndef RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED #define RIPPLE_PROTOCOL_TXFLAGS_H_INCLUDED -#include - #include +#include + namespace ripple { /** Transaction flags. diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 44ec8ae93fd..9422d697caa 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/protocol/detail/STVar.h b/include/xrpl/protocol/detail/STVar.h index 4a830cf8d7c..6ff7e5ebc1e 100644 --- a/include/xrpl/protocol/detail/STVar.h +++ b/include/xrpl/protocol/detail/STVar.h @@ -23,12 +23,9 @@ #include #include #include -#include + #include -#include #include -#include -#include namespace ripple { namespace detail { diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 103dc34243f..0bcc268ca7c 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -23,6 +23,9 @@ #if !defined(XRPL_FIX) #error "undefined macro: XRPL_FIX" #endif +#if !defined(XRPL_RETIRE) +#error "undefined macro: XRPL_RETIRE" +#endif // Add new amendments to the top of this list. // Keep it sorted in reverse chronological order. @@ -121,3 +124,22 @@ XRPL_FIX (NFTokenDirV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(NonFungibleTokensV1, Supported::yes, VoteBehavior::Obsolete) XRPL_FEATURE(CryptoConditionsSuite, Supported::yes, VoteBehavior::Obsolete) +// The following amendments have been active for at least two years. Their +// pre-amendment code has been removed and the identifiers are deprecated. +// All known amendments and amendments that may appear in a validated +// ledger must be registered either here or above with the "active" amendments +XRPL_RETIRE(MultiSign) +XRPL_RETIRE(TrustSetAuth) +XRPL_RETIRE(FeeEscalation) +XRPL_RETIRE(PayChan) +XRPL_RETIRE(CryptoConditions) +XRPL_RETIRE(TickSize) +XRPL_RETIRE(fix1368) +XRPL_RETIRE(Escrow) +XRPL_RETIRE(fix1373) +XRPL_RETIRE(EnforceInvariants) +XRPL_RETIRE(SortedDirectories) +XRPL_RETIRE(fix1201) +XRPL_RETIRE(fix1512) +XRPL_RETIRE(fix1523) +XRPL_RETIRE(fix1528) diff --git a/include/xrpl/protocol/digest.h b/include/xrpl/protocol/digest.h index b3c7a014100..efec616a0c8 100644 --- a/include/xrpl/protocol/digest.h +++ b/include/xrpl/protocol/digest.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include diff --git a/include/xrpl/protocol/nftPageMask.h b/include/xrpl/protocol/nftPageMask.h index 1f8c39aa138..90fff10d958 100644 --- a/include/xrpl/protocol/nftPageMask.h +++ b/include/xrpl/protocol/nftPageMask.h @@ -21,6 +21,7 @@ #define RIPPLE_PROTOCOL_NFT_PAGE_MASK_H_INCLUDED #include + #include namespace ripple { diff --git a/include/xrpl/resource/ResourceManager.h b/include/xrpl/resource/ResourceManager.h index b33b141ee05..22697d12eb0 100644 --- a/include/xrpl/resource/ResourceManager.h +++ b/include/xrpl/resource/ResourceManager.h @@ -27,6 +27,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/resource/detail/Logic.h b/include/xrpl/resource/detail/Logic.h index 226dea3aef8..b07ee00e73a 100644 --- a/include/xrpl/resource/detail/Logic.h +++ b/include/xrpl/resource/detail/Logic.h @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Handoff.h b/include/xrpl/server/Handoff.h index f57c9ef57ec..d33e8a7eddf 100644 --- a/include/xrpl/server/Handoff.h +++ b/include/xrpl/server/Handoff.h @@ -21,8 +21,10 @@ #define RIPPLE_SERVER_HANDOFF_H_INCLUDED #include + #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Port.h b/include/xrpl/server/Port.h index 4ab56efb459..88f824d19f4 100644 --- a/include/xrpl/server/Port.h +++ b/include/xrpl/server/Port.h @@ -22,17 +22,18 @@ #include #include + #include #include #include #include #include + #include #include #include #include #include -#include namespace boost { namespace asio { diff --git a/include/xrpl/server/Server.h b/include/xrpl/server/Server.h index e8157c03c6c..232d1c381be 100644 --- a/include/xrpl/server/Server.h +++ b/include/xrpl/server/Server.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Session.h b/include/xrpl/server/Session.h index 25cf1ad747d..196f8c78c23 100644 --- a/include/xrpl/server/Session.h +++ b/include/xrpl/server/Session.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/SimpleWriter.h b/include/xrpl/server/SimpleWriter.h index 0e3f63b0d9d..371d6cbf974 100644 --- a/include/xrpl/server/SimpleWriter.h +++ b/include/xrpl/server/SimpleWriter.h @@ -21,10 +21,12 @@ #define RIPPLE_SERVER_SIMPLEWRITER_H_INCLUDED #include + #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/Writer.h b/include/xrpl/server/Writer.h index 18cbb35b6fd..b63a1e89e49 100644 --- a/include/xrpl/server/Writer.h +++ b/include/xrpl/server/Writer.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_WRITER_H_INCLUDED #include + #include #include diff --git a/include/xrpl/server/detail/BaseHTTPPeer.h b/include/xrpl/server/detail/BaseHTTPPeer.h index bcdddcc711d..51ac866e1e7 100644 --- a/include/xrpl/server/detail/BaseHTTPPeer.h +++ b/include/xrpl/server/detail/BaseHTTPPeer.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/BasePeer.h b/include/xrpl/server/detail/BasePeer.h index 97ad77f7f22..35975efafb7 100644 --- a/include/xrpl/server/detail/BasePeer.h +++ b/include/xrpl/server/detail/BasePeer.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/include/xrpl/server/detail/Door.h b/include/xrpl/server/detail/Door.h index 20bdf421e38..90de885579d 100644 --- a/include/xrpl/server/detail/Door.h +++ b/include/xrpl/server/detail/Door.h @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -34,6 +35,7 @@ #include #include #include + #include #include #include diff --git a/include/xrpl/server/detail/JSONRPCUtil.h b/include/xrpl/server/detail/JSONRPCUtil.h index 7eb00096263..88efc077d8c 100644 --- a/include/xrpl/server/detail/JSONRPCUtil.h +++ b/include/xrpl/server/detail/JSONRPCUtil.h @@ -20,6 +20,7 @@ #ifndef RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED #define RIPPLE_SERVER_JSONRPCUTIL_H_INCLUDED +#include #include #include diff --git a/include/xrpl/server/detail/PlainHTTPPeer.h b/include/xrpl/server/detail/PlainHTTPPeer.h index d4b24c01313..ee31c78cad1 100644 --- a/include/xrpl/server/detail/PlainHTTPPeer.h +++ b/include/xrpl/server/detail/PlainHTTPPeer.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/PlainWSPeer.h b/include/xrpl/server/detail/PlainWSPeer.h index 8bcddee7e77..4fdc1f6f494 100644 --- a/include/xrpl/server/detail/PlainWSPeer.h +++ b/include/xrpl/server/detail/PlainWSPeer.h @@ -21,7 +21,9 @@ #define RIPPLE_SERVER_PLAINWSPEER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLHTTPPeer.h b/include/xrpl/server/detail/SSLHTTPPeer.h index db6af46b5b3..fac4b866d30 100644 --- a/include/xrpl/server/detail/SSLHTTPPeer.h +++ b/include/xrpl/server/detail/SSLHTTPPeer.h @@ -22,11 +22,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/SSLWSPeer.h b/include/xrpl/server/detail/SSLWSPeer.h index 9c88b275397..d7cc0395c79 100644 --- a/include/xrpl/server/detail/SSLWSPeer.h +++ b/include/xrpl/server/detail/SSLWSPeer.h @@ -22,12 +22,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/include/xrpl/server/detail/io_list.h b/include/xrpl/server/detail/io_list.h index 4475f59ab75..fbf60c9a7fc 100644 --- a/include/xrpl/server/detail/io_list.h +++ b/include/xrpl/server/detail/io_list.h @@ -21,6 +21,7 @@ #define RIPPLE_SERVER_IO_LIST_H_INCLUDED #include + #include #include #include diff --git a/src/libxrpl/basics/Archive.cpp b/src/libxrpl/basics/Archive.cpp index e5672bd953f..2ddbc8200cb 100644 --- a/src/libxrpl/basics/Archive.cpp +++ b/src/libxrpl/basics/Archive.cpp @@ -20,10 +20,15 @@ #include #include +#include +#include + #include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/basics/BasicConfig.cpp b/src/libxrpl/basics/BasicConfig.cpp index 2ad47ab7ee5..7d6f09b391c 100644 --- a/src/libxrpl/basics/BasicConfig.cpp +++ b/src/libxrpl/basics/BasicConfig.cpp @@ -19,8 +19,17 @@ #include #include -#include -#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/CountedObject.cpp b/src/libxrpl/basics/CountedObject.cpp index c18152938a9..d3b94554805 100644 --- a/src/libxrpl/basics/CountedObject.cpp +++ b/src/libxrpl/basics/CountedObject.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/libxrpl/basics/FileUtilities.cpp b/src/libxrpl/basics/FileUtilities.cpp index e1331433553..c0456b05569 100644 --- a/src/libxrpl/basics/FileUtilities.cpp +++ b/src/libxrpl/basics/FileUtilities.cpp @@ -19,6 +19,20 @@ #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/basics/Log.cpp b/src/libxrpl/basics/Log.cpp index ac42aa9ec43..14873a3fd79 100644 --- a/src/libxrpl/basics/Log.cpp +++ b/src/libxrpl/basics/Log.cpp @@ -19,14 +19,22 @@ #include #include -#include +#include #include -#include + +#include +#include + +#include +#include #include #include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 3bc58970ef7..1515177ab94 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -19,10 +19,15 @@ #include #include -#include + #include +#include +#include +#include +#include #include #include +#include #include #include diff --git a/src/libxrpl/basics/ResolverAsio.cpp b/src/libxrpl/basics/ResolverAsio.cpp index 8951d809dec..fde27189e73 100644 --- a/src/libxrpl/basics/ResolverAsio.cpp +++ b/src/libxrpl/basics/ResolverAsio.cpp @@ -18,17 +18,31 @@ //============================================================================== #include +#include #include #include #include +#include #include -#include + +#include +#include +#include +#include + +#include #include +#include #include #include +#include +#include #include #include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/StringUtilities.cpp b/src/libxrpl/basics/StringUtilities.cpp index cd9bdfbd030..50087307181 100644 --- a/src/libxrpl/basics/StringUtilities.cpp +++ b/src/libxrpl/basics/StringUtilities.cpp @@ -17,15 +17,24 @@ */ //============================================================================== -#include +#include #include -#include -#include #include #include -#include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/basics/UptimeClock.cpp b/src/libxrpl/basics/UptimeClock.cpp index 4394d02f783..42ba479fae8 100644 --- a/src/libxrpl/basics/UptimeClock.cpp +++ b/src/libxrpl/basics/UptimeClock.cpp @@ -19,6 +19,10 @@ #include +#include +#include +#include + namespace ripple { std::atomic UptimeClock::now_{0}; // seconds since start diff --git a/src/libxrpl/basics/base64.cpp b/src/libxrpl/basics/base64.cpp index a8b4e352992..741d978aa09 100644 --- a/src/libxrpl/basics/base64.cpp +++ b/src/libxrpl/basics/base64.cpp @@ -56,7 +56,10 @@ #include -#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/basics/contract.cpp b/src/libxrpl/basics/contract.cpp index 4f0a74644af..b5a7b3f3684 100644 --- a/src/libxrpl/basics/contract.cpp +++ b/src/libxrpl/basics/contract.cpp @@ -20,24 +20,13 @@ #include #include #include + #include #include +#include namespace ripple { -namespace detail { - -[[noreturn]] void -accessViolation() noexcept -{ - // dereference memory location zero - int volatile* j = 0; - (void)*j; - std::abort(); -} - -} // namespace detail - void LogThrow(std::string const& title) { @@ -55,7 +44,7 @@ LogicError(std::string const& s) noexcept // here. // For the above reasons, we want this contract to stand out. UNREACHABLE("LogicError", {{"message", s}}); - detail::accessViolation(); + std::abort(); } } // namespace ripple diff --git a/src/libxrpl/basics/make_SSLContext.cpp b/src/libxrpl/basics/make_SSLContext.cpp index 4a9ea321d54..980f2d48a69 100644 --- a/src/libxrpl/basics/make_SSLContext.cpp +++ b/src/libxrpl/basics/make_SSLContext.cpp @@ -19,8 +19,29 @@ #include #include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include -#include +#include +#include +#include namespace ripple { namespace openssl { diff --git a/src/libxrpl/basics/mulDiv.cpp b/src/libxrpl/basics/mulDiv.cpp index 7f9ffa45267..882878ebec9 100644 --- a/src/libxrpl/basics/mulDiv.cpp +++ b/src/libxrpl/basics/mulDiv.cpp @@ -18,7 +18,12 @@ //============================================================================== #include + #include +#include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/beast/core/CurrentThreadName.cpp b/src/libxrpl/beast/core/CurrentThreadName.cpp index 71b5d21fec3..b3938449722 100644 --- a/src/libxrpl/beast/core/CurrentThreadName.cpp +++ b/src/libxrpl/beast/core/CurrentThreadName.cpp @@ -22,8 +22,12 @@ //============================================================================== #include + #include +#include +#include + //------------------------------------------------------------------------------ #if BOOST_OS_WINDOWS diff --git a/src/libxrpl/beast/core/SemanticVersion.cpp b/src/libxrpl/beast/core/SemanticVersion.cpp index dfe699848d5..e659d63570b 100644 --- a/src/libxrpl/beast/core/SemanticVersion.cpp +++ b/src/libxrpl/beast/core/SemanticVersion.cpp @@ -22,7 +22,11 @@ #include #include +#include +#include #include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/insight/Groups.cpp b/src/libxrpl/beast/insight/Groups.cpp index fcf7e65787e..c846ceff3b6 100644 --- a/src/libxrpl/beast/insight/Groups.cpp +++ b/src/libxrpl/beast/insight/Groups.cpp @@ -18,10 +18,20 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include +#include + #include +#include #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/Hook.cpp b/src/libxrpl/beast/insight/Hook.cpp index 62538846349..d15e001ace6 100644 --- a/src/libxrpl/beast/insight/Hook.cpp +++ b/src/libxrpl/beast/insight/Hook.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/NullCollector.cpp b/src/libxrpl/beast/insight/NullCollector.cpp index 12ea817014e..4801bcecab3 100644 --- a/src/libxrpl/beast/insight/NullCollector.cpp +++ b/src/libxrpl/beast/insight/NullCollector.cpp @@ -17,8 +17,22 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace beast { namespace insight { diff --git a/src/libxrpl/beast/insight/StatsDCollector.cpp b/src/libxrpl/beast/insight/StatsDCollector.cpp index a9febbb3070..b0e00c3cfde 100644 --- a/src/libxrpl/beast/insight/StatsDCollector.cpp +++ b/src/libxrpl/beast/insight/StatsDCollector.cpp @@ -21,20 +21,35 @@ #include #include #include +#include #include #include #include -#include +#include +#include #include -#include -#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include #include #include +#include +#include #include #include -#include #include +#include #include +#include +#include #ifndef BEAST_STATSDCOLLECTOR_TRACING_ENABLED #define BEAST_STATSDCOLLECTOR_TRACING_ENABLED 0 diff --git a/src/libxrpl/beast/net/IPAddressConversion.cpp b/src/libxrpl/beast/net/IPAddressConversion.cpp index 2ab84c37015..abaf1bb7b82 100644 --- a/src/libxrpl/beast/net/IPAddressConversion.cpp +++ b/src/libxrpl/beast/net/IPAddressConversion.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPAddressV4.cpp b/src/libxrpl/beast/net/IPAddressV4.cpp index 83541479878..29455024f67 100644 --- a/src/libxrpl/beast/net/IPAddressV4.cpp +++ b/src/libxrpl/beast/net/IPAddressV4.cpp @@ -19,9 +19,6 @@ #include -#include -#include - namespace beast { namespace IP { diff --git a/src/libxrpl/beast/net/IPEndpoint.cpp b/src/libxrpl/beast/net/IPEndpoint.cpp index 490777111bd..ffe664498c2 100644 --- a/src/libxrpl/beast/net/IPEndpoint.cpp +++ b/src/libxrpl/beast/net/IPEndpoint.cpp @@ -17,8 +17,18 @@ */ //============================================================================== +#include #include -#include + +#include +#include + +#include +#include +#include +#include +#include +#include namespace beast { namespace IP { diff --git a/src/libxrpl/beast/utility/src/beast_Journal.cpp b/src/libxrpl/beast/utility/beast_Journal.cpp similarity index 98% rename from src/libxrpl/beast/utility/src/beast_Journal.cpp rename to src/libxrpl/beast/utility/beast_Journal.cpp index dd160a58708..828f2fa619e 100644 --- a/src/libxrpl/beast/utility/src/beast_Journal.cpp +++ b/src/libxrpl/beast/utility/beast_Journal.cpp @@ -18,7 +18,10 @@ //============================================================================== #include -#include + +#include +#include +#include namespace beast { diff --git a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp b/src/libxrpl/beast/utility/beast_PropertyStream.cpp similarity index 99% rename from src/libxrpl/beast/utility/src/beast_PropertyStream.cpp rename to src/libxrpl/beast/utility/beast_PropertyStream.cpp index 3d68ea30cff..22d1f898d64 100644 --- a/src/libxrpl/beast/utility/src/beast_PropertyStream.cpp +++ b/src/libxrpl/beast/utility/beast_PropertyStream.cpp @@ -19,9 +19,12 @@ #include #include + #include #include -#include +#include +#include +#include namespace beast { diff --git a/src/libxrpl/crypto/RFC1751.cpp b/src/libxrpl/crypto/RFC1751.cpp index 952e246f5f8..48bd8dc0f88 100644 --- a/src/libxrpl/crypto/RFC1751.cpp +++ b/src/libxrpl/crypto/RFC1751.cpp @@ -19,10 +19,19 @@ #include #include -#include + +#include +#include +#include +#include #include + +#include +#include #include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/crypto/csprng.cpp b/src/libxrpl/crypto/csprng.cpp index 948500734c0..986c30d8fd8 100644 --- a/src/libxrpl/crypto/csprng.cpp +++ b/src/libxrpl/crypto/csprng.cpp @@ -18,10 +18,14 @@ //============================================================================== #include -#include #include -#include + #include +#include + +#include +#include +#include #include #include diff --git a/src/libxrpl/crypto/secure_erase.cpp b/src/libxrpl/crypto/secure_erase.cpp index 93f189d519c..d5f2e250596 100644 --- a/src/libxrpl/crypto/secure_erase.cpp +++ b/src/libxrpl/crypto/secure_erase.cpp @@ -18,8 +18,11 @@ //============================================================================== #include + #include +#include + namespace ripple { void diff --git a/src/libxrpl/json/JsonPropertyStream.cpp b/src/libxrpl/json/JsonPropertyStream.cpp index 19387013b58..a8441f39ecc 100644 --- a/src/libxrpl/json/JsonPropertyStream.cpp +++ b/src/libxrpl/json/JsonPropertyStream.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace ripple { JsonPropertyStream::JsonPropertyStream() : m_top(Json::objectValue) diff --git a/src/libxrpl/json/Object.cpp b/src/libxrpl/json/Object.cpp index f1f30af9a21..62f686e228a 100644 --- a/src/libxrpl/json/Object.cpp +++ b/src/libxrpl/json/Object.cpp @@ -20,6 +20,12 @@ #include #include #include +#include +#include +#include + +#include +#include namespace Json { diff --git a/src/libxrpl/json/Output.cpp b/src/libxrpl/json/Output.cpp index c24c75b32dd..84388884da8 100644 --- a/src/libxrpl/json/Output.cpp +++ b/src/libxrpl/json/Output.cpp @@ -19,6 +19,9 @@ #include #include +#include + +#include namespace Json { diff --git a/src/libxrpl/json/Writer.cpp b/src/libxrpl/json/Writer.cpp index 2f7c0b523c6..94c73447885 100644 --- a/src/libxrpl/json/Writer.cpp +++ b/src/libxrpl/json/Writer.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include #include #include + +#include +#include +#include #include #include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_reader.cpp b/src/libxrpl/json/json_reader.cpp index 5f027e5189d..6818d73ded9 100644 --- a/src/libxrpl/json/json_reader.cpp +++ b/src/libxrpl/json/json_reader.cpp @@ -19,10 +19,15 @@ #include #include +#include #include #include +#include +#include +#include #include +#include #include namespace Json { diff --git a/src/libxrpl/json/json_value.cpp b/src/libxrpl/json/json_value.cpp index 90926afc6c4..709b425d636 100644 --- a/src/libxrpl/json/json_value.cpp +++ b/src/libxrpl/json/json_value.cpp @@ -17,11 +17,17 @@ */ //============================================================================== -#include #include +#include #include +#include +#include #include -#include + +#include +#include +#include +#include namespace Json { diff --git a/src/libxrpl/json/json_valueiterator.cpp b/src/libxrpl/json/json_valueiterator.cpp index c1a1bcc56a0..20dedf2bb29 100644 --- a/src/libxrpl/json/json_valueiterator.cpp +++ b/src/libxrpl/json/json_valueiterator.cpp @@ -19,6 +19,7 @@ // included by json_value.cpp +#include #include namespace Json { diff --git a/src/libxrpl/json/json_writer.cpp b/src/libxrpl/json/json_writer.cpp index de0ed5848af..a830f2855fb 100644 --- a/src/libxrpl/json/json_writer.cpp +++ b/src/libxrpl/json/json_writer.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include + +#include +#include #include +#include +#include #include #include #include diff --git a/src/libxrpl/json/to_string.cpp b/src/libxrpl/json/to_string.cpp index 7bf58241201..f6fb65d10a6 100644 --- a/src/libxrpl/json/to_string.cpp +++ b/src/libxrpl/json/to_string.cpp @@ -20,6 +20,8 @@ #include #include +#include + namespace Json { std::string diff --git a/src/libxrpl/protocol/AMMCore.cpp b/src/libxrpl/protocol/AMMCore.cpp index 3bebfc4659a..aa488271957 100644 --- a/src/libxrpl/protocol/AMMCore.cpp +++ b/src/libxrpl/protocol/AMMCore.cpp @@ -17,13 +17,26 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include +#include #include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { AccountID diff --git a/src/libxrpl/protocol/AccountID.cpp b/src/libxrpl/protocol/AccountID.cpp index f271882158b..109ac3d0283 100644 --- a/src/libxrpl/protocol/AccountID.cpp +++ b/src/libxrpl/protocol/AccountID.cpp @@ -19,13 +19,21 @@ #include #include +#include +#include #include #include #include #include -#include + +#include +#include #include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Asset.cpp b/src/libxrpl/protocol/Asset.cpp index 5a496352840..d4a2fccb4ac 100644 --- a/src/libxrpl/protocol/Asset.cpp +++ b/src/libxrpl/protocol/Asset.cpp @@ -17,10 +17,18 @@ */ //============================================================================== +#include +#include +#include #include -#include +#include +#include #include +#include +#include +#include + namespace ripple { AccountID const& diff --git a/src/libxrpl/protocol/Book.cpp b/src/libxrpl/protocol/Book.cpp index c096dba2b4e..cfd1fc61dc9 100644 --- a/src/libxrpl/protocol/Book.cpp +++ b/src/libxrpl/protocol/Book.cpp @@ -18,6 +18,10 @@ //============================================================================== #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/BuildInfo.cpp b/src/libxrpl/protocol/BuildInfo.cpp index 151f8f570c9..39d34c43e75 100644 --- a/src/libxrpl/protocol/BuildInfo.cpp +++ b/src/libxrpl/protocol/BuildInfo.cpp @@ -21,8 +21,11 @@ #include #include #include -#include + #include +#include +#include +#include namespace ripple { @@ -33,7 +36,7 @@ namespace BuildInfo { // and follow the format described at http://semver.org/ //------------------------------------------------------------------------------ // clang-format off -char const* const versionString = "2.4.0-rc4" +char const* const versionString = "2.4.0" // clang-format on #if defined(DEBUG) || defined(SANITIZER) diff --git a/src/libxrpl/protocol/ErrorCodes.cpp b/src/libxrpl/protocol/ErrorCodes.cpp index 4cb2a874ae1..ca853c690ea 100644 --- a/src/libxrpl/protocol/ErrorCodes.cpp +++ b/src/libxrpl/protocol/ErrorCodes.cpp @@ -18,9 +18,13 @@ //============================================================================== #include +#include #include +#include + #include #include +#include namespace ripple { namespace RPC { diff --git a/src/libxrpl/protocol/Feature.cpp b/src/libxrpl/protocol/Feature.cpp index 05164489ec7..3065bdf41c1 100644 --- a/src/libxrpl/protocol/Feature.cpp +++ b/src/libxrpl/protocol/Feature.cpp @@ -17,17 +17,26 @@ */ //============================================================================== -#include - #include +#include #include +#include +#include #include + #include #include -#include +#include +#include #include +#include #include -#include + +#include +#include +#include +#include +#include namespace ripple { @@ -250,12 +259,9 @@ FeatureCollections::registerFeature( Feature const* i = getByName(name); if (!i) { - // If this check fails, and you just added a feature, increase the - // numFeatures value in Feature.h check( features.size() < detail::numFeatures, - "More features defined than allocated. Adjust numFeatures in " - "Feature.h."); + "More features defined than allocated."); auto const f = sha512Half(Slice(name.data(), name.size())); @@ -424,45 +430,26 @@ featureToName(uint256 const& f) #undef XRPL_FEATURE #pragma push_macro("XRPL_FIX") #undef XRPL_FIX +#pragma push_macro("XRPL_RETIRE") +#undef XRPL_RETIRE #define XRPL_FEATURE(name, supported, vote) \ uint256 const feature##name = registerFeature(#name, supported, vote); #define XRPL_FIX(name, supported, vote) \ uint256 const fix##name = registerFeature("fix" #name, supported, vote); +#define XRPL_RETIRE(name) \ + [[deprecated("The referenced amendment has been retired"), maybe_unused]] \ + uint256 const retired##name = retireFeature(#name); #include +#undef XRPL_RETIRE +#pragma pop_macro("XRPL_RETIRE") #undef XRPL_FIX #pragma pop_macro("XRPL_FIX") #undef XRPL_FEATURE #pragma pop_macro("XRPL_FEATURE") -// clang-format off - -// The following amendments have been active for at least two years. Their -// pre-amendment code has been removed and the identifiers are deprecated. -// All known amendments and amendments that may appear in a validated -// ledger must be registered either here or above with the "active" amendments -[[deprecated("The referenced amendment has been retired"), maybe_unused]] -uint256 const - retiredMultiSign = retireFeature("MultiSign"), - retiredTrustSetAuth = retireFeature("TrustSetAuth"), - retiredFeeEscalation = retireFeature("FeeEscalation"), - retiredPayChan = retireFeature("PayChan"), - retiredCryptoConditions = retireFeature("CryptoConditions"), - retiredTickSize = retireFeature("TickSize"), - retiredFix1368 = retireFeature("fix1368"), - retiredEscrow = retireFeature("Escrow"), - retiredFix1373 = retireFeature("fix1373"), - retiredEnforceInvariants = retireFeature("EnforceInvariants"), - retiredSortedDirectories = retireFeature("SortedDirectories"), - retiredFix1201 = retireFeature("fix1201"), - retiredFix1512 = retireFeature("fix1512"), - retiredFix1523 = retireFeature("fix1523"), - retiredFix1528 = retireFeature("fix1528"); - -// clang-format on - // All of the features should now be registered, since variables in a cpp file // are initialized from top to bottom. // diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 7fc879609ed..9bd1ceb5eb3 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -17,13 +17,21 @@ */ //============================================================================== +#include +#include #include +#include #include + #include + #include +#include #include -#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Indexes.cpp b/src/libxrpl/protocol/Indexes.cpp index 046be444224..fe8f0c4778d 100644 --- a/src/libxrpl/protocol/Indexes.cpp +++ b/src/libxrpl/protocol/Indexes.cpp @@ -17,17 +17,32 @@ */ //============================================================================== +#include +#include +#include #include +#include #include +#include #include #include +#include #include #include #include +#include #include #include +#include + #include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Issue.cpp b/src/libxrpl/protocol/Issue.cpp index 179cb1eb14a..b6edf77b2ac 100644 --- a/src/libxrpl/protocol/Issue.cpp +++ b/src/libxrpl/protocol/Issue.cpp @@ -17,13 +17,18 @@ */ //============================================================================== -#include - +#include #include +#include #include +#include #include #include +#include +#include +#include + namespace ripple { std::string diff --git a/src/libxrpl/protocol/Keylet.cpp b/src/libxrpl/protocol/Keylet.cpp index 846c3bc07b3..8deb2d735ae 100644 --- a/src/libxrpl/protocol/Keylet.cpp +++ b/src/libxrpl/protocol/Keylet.cpp @@ -17,7 +17,9 @@ */ //============================================================================== +#include #include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerFormats.cpp b/src/libxrpl/protocol/LedgerFormats.cpp index 518c3771d62..9755eedf3b5 100644 --- a/src/libxrpl/protocol/LedgerFormats.cpp +++ b/src/libxrpl/protocol/LedgerFormats.cpp @@ -18,8 +18,11 @@ //============================================================================== #include +#include +#include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/LedgerHeader.cpp b/src/libxrpl/protocol/LedgerHeader.cpp index 284c4dc0557..9984a971c80 100644 --- a/src/libxrpl/protocol/LedgerHeader.cpp +++ b/src/libxrpl/protocol/LedgerHeader.cpp @@ -17,7 +17,10 @@ */ //============================================================================== +#include +#include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/MPTIssue.cpp b/src/libxrpl/protocol/MPTIssue.cpp index 38022a0ed3a..c8decb2b3f8 100644 --- a/src/libxrpl/protocol/MPTIssue.cpp +++ b/src/libxrpl/protocol/MPTIssue.cpp @@ -17,10 +17,19 @@ */ //============================================================================== +#include +#include #include +#include +#include #include +#include #include +#include +#include +#include + namespace ripple { MPTIssue::MPTIssue(MPTID const& issuanceID) : mptID_(issuanceID) diff --git a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp index 03c9e79e265..0c0a657512d 100644 --- a/src/libxrpl/protocol/NFTSyntheticSerializer.cpp +++ b/src/libxrpl/protocol/NFTSyntheticSerializer.cpp @@ -17,11 +17,16 @@ */ //============================================================================== +#include #include #include #include +#include +#include #include +#include + namespace ripple { void diff --git a/src/libxrpl/protocol/NFTokenID.cpp b/src/libxrpl/protocol/NFTokenID.cpp index 72fb8b87bbe..55b03b10a5d 100644 --- a/src/libxrpl/protocol/NFTokenID.cpp +++ b/src/libxrpl/protocol/NFTokenID.cpp @@ -17,9 +17,25 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/NFTokenOfferID.cpp b/src/libxrpl/protocol/NFTokenOfferID.cpp index 3d761e6b939..921ba4e1d15 100644 --- a/src/libxrpl/protocol/NFTokenOfferID.cpp +++ b/src/libxrpl/protocol/NFTokenOfferID.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include +#include + namespace ripple { bool diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index fdab288cea0..cdf646e0f86 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -17,13 +17,29 @@ */ //============================================================================== +#include +#include #include #include +#include #include +#include #include #include -#include +#include + +#include +#include + #include +#include + +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Quality.cpp b/src/libxrpl/protocol/Quality.cpp index ba669d9bd1f..f7a970a3b9c 100644 --- a/src/libxrpl/protocol/Quality.cpp +++ b/src/libxrpl/protocol/Quality.cpp @@ -17,8 +17,13 @@ */ //============================================================================== +#include #include +#include #include +#include + +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/QualityFunction.cpp b/src/libxrpl/protocol/QualityFunction.cpp index 64e5a36989c..9f898dca250 100644 --- a/src/libxrpl/protocol/QualityFunction.cpp +++ b/src/libxrpl/protocol/QualityFunction.cpp @@ -17,9 +17,14 @@ */ //============================================================================== +#include +#include +#include +#include #include -#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/RPCErr.cpp b/src/libxrpl/protocol/RPCErr.cpp index e9ca3c3c1e6..2fc9ba173b5 100644 --- a/src/libxrpl/protocol/RPCErr.cpp +++ b/src/libxrpl/protocol/RPCErr.cpp @@ -17,8 +17,10 @@ */ //============================================================================== +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rate2.cpp b/src/libxrpl/protocol/Rate2.cpp index 64ac6c46315..dfdf60f02e3 100644 --- a/src/libxrpl/protocol/Rate2.cpp +++ b/src/libxrpl/protocol/Rate2.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include +#include #include #include +#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/Rules.cpp b/src/libxrpl/protocol/Rules.cpp index 7043acff96d..3d1c718e65a 100644 --- a/src/libxrpl/protocol/Rules.cpp +++ b/src/libxrpl/protocol/Rules.cpp @@ -18,10 +18,18 @@ //============================================================================== #include +#include +#include +#include +#include #include #include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SField.cpp b/src/libxrpl/protocol/SField.cpp index 20e1e112655..b59e2a2b69f 100644 --- a/src/libxrpl/protocol/SField.cpp +++ b/src/libxrpl/protocol/SField.cpp @@ -17,11 +17,10 @@ */ //============================================================================== -#include #include + +#include #include -#include -#include namespace ripple { diff --git a/src/libxrpl/protocol/SOTemplate.cpp b/src/libxrpl/protocol/SOTemplate.cpp index d75261c0a64..0b6e321bf48 100644 --- a/src/libxrpl/protocol/SOTemplate.cpp +++ b/src/libxrpl/protocol/SOTemplate.cpp @@ -17,8 +17,14 @@ */ //============================================================================== +#include +#include #include +#include +#include +#include + namespace ripple { SOTemplate::SOTemplate( diff --git a/src/libxrpl/protocol/STAccount.cpp b/src/libxrpl/protocol/STAccount.cpp index c033e4cb580..ba9a2d19194 100644 --- a/src/libxrpl/protocol/STAccount.cpp +++ b/src/libxrpl/protocol/STAccount.cpp @@ -17,9 +17,21 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STAmount.cpp b/src/libxrpl/protocol/STAmount.cpp index 37830830ade..e0815fbef31 100644 --- a/src/libxrpl/protocol/STAmount.cpp +++ b/src/libxrpl/protocol/STAmount.cpp @@ -17,21 +17,53 @@ */ //============================================================================== +#include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include #include +#include +#include #include #include +#include #include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include #include +#include #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STArray.cpp b/src/libxrpl/protocol/STArray.cpp index 0dea9c7665e..0c5b4e198c7 100644 --- a/src/libxrpl/protocol/STArray.cpp +++ b/src/libxrpl/protocol/STArray.cpp @@ -19,8 +19,17 @@ #include #include +#include +#include #include #include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBase.cpp b/src/libxrpl/protocol/STBase.cpp index 6986957b61e..86e52a1f73f 100644 --- a/src/libxrpl/protocol/STBase.cpp +++ b/src/libxrpl/protocol/STBase.cpp @@ -18,8 +18,15 @@ //============================================================================== #include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STBlob.cpp b/src/libxrpl/protocol/STBlob.cpp index 34e759b4c37..33245a1e160 100644 --- a/src/libxrpl/protocol/STBlob.cpp +++ b/src/libxrpl/protocol/STBlob.cpp @@ -17,8 +17,16 @@ */ //============================================================================== -#include +#include +#include +#include +#include #include +#include + +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STCurrency.cpp b/src/libxrpl/protocol/STCurrency.cpp index 56ac19da114..a17ed2e0d2c 100644 --- a/src/libxrpl/protocol/STCurrency.cpp +++ b/src/libxrpl/protocol/STCurrency.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include - #include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index 9525a47c462..bc5b7e855e2 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -18,14 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include #include +#include +#include #include +#include #include #include + #include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STIssue.cpp b/src/libxrpl/protocol/STIssue.cpp index 5a2008cb178..8483b8cfe33 100644 --- a/src/libxrpl/protocol/STIssue.cpp +++ b/src/libxrpl/protocol/STIssue.cpp @@ -17,20 +17,24 @@ */ //============================================================================== -#include - -#include #include -#include -#include - -#include -#include -#include - -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STLedgerEntry.cpp b/src/libxrpl/protocol/STLedgerEntry.cpp index 0350dd883b8..ae80abb69f6 100644 --- a/src/libxrpl/protocol/STLedgerEntry.cpp +++ b/src/libxrpl/protocol/STLedgerEntry.cpp @@ -17,20 +17,33 @@ */ //============================================================================== -#include - #include +#include #include #include +#include #include #include #include +#include +#include #include +#include +#include +#include +#include +#include #include -#include + +#include + #include #include -#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STNumber.cpp b/src/libxrpl/protocol/STNumber.cpp index 74961bfbcab..c0cdcccd6e9 100644 --- a/src/libxrpl/protocol/STNumber.cpp +++ b/src/libxrpl/protocol/STNumber.cpp @@ -17,10 +17,17 @@ */ //============================================================================== -#include - +#include #include #include +#include +#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 821f8f05c96..d0873561e31 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -17,16 +17,46 @@ */ //============================================================================== +#include #include +#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include #include +#include #include +#include +#include #include #include +#include +#include #include #include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index 7d08993a8ba..0488189a667 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -18,10 +18,13 @@ //============================================================================== #include +#include #include #include #include -#include +#include +#include +#include #include #include #include @@ -30,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -39,11 +43,20 @@ #include #include #include -#include #include #include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STPathSet.cpp b/src/libxrpl/protocol/STPathSet.cpp index 57bcaca6b2c..d2bd20cfe89 100644 --- a/src/libxrpl/protocol/STPathSet.cpp +++ b/src/libxrpl/protocol/STPathSet.cpp @@ -18,12 +18,22 @@ //============================================================================== #include -#include #include -#include +#include +#include +#include +#include +#include #include +#include +#include #include +#include +#include +#include +#include + namespace ripple { std::size_t diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index bd1c461c8c7..a60f7325f03 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -17,26 +17,53 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include #include #include -#include -#include +#include +#include +#include +#include +#include #include +#include #include #include +#include +#include +#include #include +#include #include +#include +#include #include +#include +#include +#include #include #include -#include +#include #include -#include + +#include +#include +#include #include +#include +#include +#include +#include #include +#include +#include +#include +#include #include #include diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index f14fce43219..948a47f0ac9 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -17,11 +17,23 @@ */ //============================================================================== -#include -#include -#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include +#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index c5d3102bfa7..3af0345c4e6 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include - #include +#include +#include #include #include #include @@ -29,12 +29,16 @@ #include #include #include -#include #include #include #include #include -#include +#include +#include + +#include +#include +#include namespace ripple { namespace detail { diff --git a/src/libxrpl/protocol/STVector256.cpp b/src/libxrpl/protocol/STVector256.cpp index 6f70a3849c1..50b022d294f 100644 --- a/src/libxrpl/protocol/STVector256.cpp +++ b/src/libxrpl/protocol/STVector256.cpp @@ -17,10 +17,19 @@ */ //============================================================================== -#include -#include +#include +#include +#include +#include +#include +#include #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/STXChainBridge.cpp b/src/libxrpl/protocol/STXChainBridge.cpp index 2347e63379a..1499d790cb7 100644 --- a/src/libxrpl/protocol/STXChainBridge.cpp +++ b/src/libxrpl/protocol/STXChainBridge.cpp @@ -17,21 +17,24 @@ */ //============================================================================== -#include - -#include +#include +#include +#include #include -#include #include #include +#include #include #include #include -#include -#include -#include -#include +#include + +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/SecretKey.cpp b/src/libxrpl/protocol/SecretKey.cpp index 474c37ac802..06b1061c1e8 100644 --- a/src/libxrpl/protocol/SecretKey.cpp +++ b/src/libxrpl/protocol/SecretKey.cpp @@ -17,16 +17,34 @@ */ //============================================================================== +#include +#include +#include #include #include #include #include #include +#include +#include #include +#include #include #include -#include +#include + +#include + #include +#include + +#include +#include +#include +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Seed.cpp b/src/libxrpl/protocol/Seed.cpp index 453b4593bfb..095c09e7c09 100644 --- a/src/libxrpl/protocol/Seed.cpp +++ b/src/libxrpl/protocol/Seed.cpp @@ -17,7 +17,9 @@ */ //============================================================================== -#include +#include +#include +#include #include #include #include @@ -28,9 +30,14 @@ #include #include #include +#include + #include +#include +#include #include #include +#include namespace ripple { diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index f46104f6382..339e25db1d3 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include +#include #include +#include +#include +#include #include #include + +#include + +#include +#include #include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/Sign.cpp b/src/libxrpl/protocol/Sign.cpp index 32645c3762c..27c2b0435c4 100644 --- a/src/libxrpl/protocol/Sign.cpp +++ b/src/libxrpl/protocol/Sign.cpp @@ -17,6 +17,15 @@ */ //============================================================================== +#include +#include +#include +#include +#include +#include +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index dc0bdb4a591..3766f33c548 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -18,8 +18,14 @@ //============================================================================== #include + #include -#include +#include + +#include +#include +#include +#include namespace ripple { diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 76b1ae8ad4f..b2dd3a656f5 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -17,12 +17,13 @@ */ //============================================================================== -#include - #include #include +#include #include +#include + namespace ripple { TxFormats::TxFormats() diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index dad67c13349..d9a9f0db878 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -17,11 +17,24 @@ */ //============================================================================== -#include +#include +#include #include -#include +#include +#include +#include #include +#include +#include +#include +#include +#include #include + +#include + +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/UintTypes.cpp b/src/libxrpl/protocol/UintTypes.cpp index c57bcc153a3..dadfccfa9f4 100644 --- a/src/libxrpl/protocol/UintTypes.cpp +++ b/src/libxrpl/protocol/UintTypes.cpp @@ -17,10 +17,14 @@ */ //============================================================================== +#include #include -#include #include #include + +#include +#include +#include #include namespace ripple { diff --git a/src/libxrpl/protocol/XChainAttestations.cpp b/src/libxrpl/protocol/XChainAttestations.cpp index 82e73445693..e61224b570c 100644 --- a/src/libxrpl/protocol/XChainAttestations.cpp +++ b/src/libxrpl/protocol/XChainAttestations.cpp @@ -17,26 +17,29 @@ */ //============================================================================== -#include - -#include -#include -#include +#include +#include +#include +#include #include -#include #include #include #include #include #include #include +#include #include #include #include #include -#include +#include #include +#include +#include +#include +#include namespace ripple { namespace Attestations { diff --git a/src/libxrpl/protocol/digest.cpp b/src/libxrpl/protocol/digest.cpp index 237e7aa49f0..2626ec09685 100644 --- a/src/libxrpl/protocol/digest.cpp +++ b/src/libxrpl/protocol/digest.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include -#include + +#include namespace ripple { diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index 49ec926a775..a822b1937fb 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -25,21 +25,25 @@ * file COPYING or http://www.opensource.org/licenses/mit-license.php. */ -#include - +#include #include #include #include +#include #include +#include #include -#include #include +#include +#include +#include #include -#include +#include +#include +#include #include -#include #include /* diff --git a/src/libxrpl/resource/Charge.cpp b/src/libxrpl/resource/Charge.cpp index 53df4e592dc..8c96e3696fd 100644 --- a/src/libxrpl/resource/Charge.cpp +++ b/src/libxrpl/resource/Charge.cpp @@ -18,7 +18,11 @@ //============================================================================== #include + +#include +#include #include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Consumer.cpp b/src/libxrpl/resource/Consumer.cpp index 6f0d6dcc49b..71a84340cd8 100644 --- a/src/libxrpl/resource/Consumer.cpp +++ b/src/libxrpl/resource/Consumer.cpp @@ -17,11 +17,18 @@ */ //============================================================================== +#include +#include #include +#include #include +#include #include #include +#include +#include + namespace ripple { namespace Resource { diff --git a/src/libxrpl/resource/Fees.cpp b/src/libxrpl/resource/Fees.cpp index 17fb475394c..6d81cbbd250 100644 --- a/src/libxrpl/resource/Fees.cpp +++ b/src/libxrpl/resource/Fees.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include namespace ripple { diff --git a/src/libxrpl/resource/ResourceManager.cpp b/src/libxrpl/resource/ResourceManager.cpp index d73ca090024..08e0bcd408f 100644 --- a/src/libxrpl/resource/ResourceManager.cpp +++ b/src/libxrpl/resource/ResourceManager.cpp @@ -17,18 +17,29 @@ */ //============================================================================== -#include #include #include +#include #include +#include +#include +#include +#include +#include +#include #include #include -#include -#include -#include + +#include +#include + +#include #include #include #include +#include +#include +#include namespace ripple { namespace Resource { diff --git a/src/libxrpl/server/JSONRPCUtil.cpp b/src/libxrpl/server/JSONRPCUtil.cpp index ce173b1e9eb..69adb235ee7 100644 --- a/src/libxrpl/server/JSONRPCUtil.cpp +++ b/src/libxrpl/server/JSONRPCUtil.cpp @@ -18,12 +18,14 @@ //============================================================================== #include -#include +#include +#include #include #include -#include #include -#include + +#include +#include namespace ripple { diff --git a/src/libxrpl/server/Port.cpp b/src/libxrpl/server/Port.cpp index 9c1f16cda03..95709fc298b 100644 --- a/src/libxrpl/server/Port.cpp +++ b/src/libxrpl/server/Port.cpp @@ -17,13 +17,27 @@ */ //============================================================================== +#include +#include #include #include +#include #include #include + #include #include +#include +#include +#include +#include + +#include +#include +#include #include +#include +#include namespace ripple { diff --git a/src/test/app/AMMCalc_test.cpp b/src/test/app/AMMCalc_test.cpp index 058cdfd1d2d..bebf2844b62 100644 --- a/src/test/app/AMMCalc_test.cpp +++ b/src/test/app/AMMCalc_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/AMMClawback_test.cpp b/src/test/app/AMMClawback_test.cpp index c547a537bfb..878c570a121 100644 --- a/src/test/app/AMMClawback_test.cpp +++ b/src/test/app/AMMClawback_test.cpp @@ -14,16 +14,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include -#include -#include -#include + #include -#include + #include + namespace ripple { namespace test { class AMMClawback_test : public jtx::AMMTest diff --git a/src/test/app/AMMExtended_test.cpp b/src/test/app/AMMExtended_test.cpp index 96053b93b44..ed9fa0f1f8c 100644 --- a/src/test/app/AMMExtended_test.cpp +++ b/src/test/app/AMMExtended_test.cpp @@ -16,27 +16,24 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include #include -#include + #include #include #include #include #include #include -#include -#include -#include + #include #include -#include -#include #include #include diff --git a/src/test/app/AMM_test.cpp b/src/test/app/AMM_test.cpp index f1e81132c5e..9eee2b88050 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -16,30 +16,26 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include -#include -#include #include -#include -#include + #include #include #include -#include -#include -#include +#include + #include #include -#include - namespace ripple { namespace test { diff --git a/src/test/app/AccountDelete_test.cpp b/src/test/app/AccountDelete_test.cpp index f8d3cf4692a..c903f95f77e 100644 --- a/src/test/app/AccountDelete_test.cpp +++ b/src/test/app/AccountDelete_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/AccountTxPaging_test.cpp b/src/test/app/AccountTxPaging_test.cpp index 680e006a74f..46a56f58e33 100644 --- a/src/test/app/AccountTxPaging_test.cpp +++ b/src/test/app/AccountTxPaging_test.cpp @@ -16,15 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include +#include + #include -#include #include -#include -#include -#include -#include +#include namespace ripple { diff --git a/src/test/app/AmendmentTable_test.cpp b/src/test/app/AmendmentTable_test.cpp index 2f95fc0280b..5ba820da951 100644 --- a/src/test/app/AmendmentTable_test.cpp +++ b/src/test/app/AmendmentTable_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/app/Check_test.cpp b/src/test/app/Check_test.cpp index 2c4f44ce79f..d27df464681 100644 --- a/src/test/app/Check_test.cpp +++ b/src/test/app/Check_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Clawback_test.cpp b/src/test/app/Clawback_test.cpp index c000433d2af..d41f6de5561 100644 --- a/src/test/app/Clawback_test.cpp +++ b/src/test/app/Clawback_test.cpp @@ -19,12 +19,8 @@ #include #include -#include -#include -#include + #include -#include -#include namespace ripple { diff --git a/src/test/app/Credentials_test.cpp b/src/test/app/Credentials_test.cpp index 481850562fd..24e656672d4 100644 --- a/src/test/app/Credentials_test.cpp +++ b/src/test/app/Credentials_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include @@ -27,7 +29,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/app/CrossingLimits_test.cpp b/src/test/app/CrossingLimits_test.cpp index 6f6a7eb3e7f..1e19a178c26 100644 --- a/src/test/app/CrossingLimits_test.cpp +++ b/src/test/app/CrossingLimits_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DID_test.cpp b/src/test/app/DID_test.cpp index 3f9cce1d33e..3a2ed260c64 100644 --- a/src/test/app/DID_test.cpp +++ b/src/test/app/DID_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include + #include #include -#include -#include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/DNS_test.cpp b/src/test/app/DNS_test.cpp index 7a39c5f0790..7e209deb1c0 100644 --- a/src/test/app/DNS_test.cpp +++ b/src/test/app/DNS_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/DeliverMin_test.cpp b/src/test/app/DeliverMin_test.cpp index 3c62a47a4a4..3c5fd43c18c 100644 --- a/src/test/app/DeliverMin_test.cpp +++ b/src/test/app/DeliverMin_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/DepositAuth_test.cpp b/src/test/app/DepositAuth_test.cpp index 463c606dc61..9e04c5e496a 100644 --- a/src/test/app/DepositAuth_test.cpp +++ b/src/test/app/DepositAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/Discrepancy_test.cpp b/src/test/app/Discrepancy_test.cpp index 1eaa1ad86dd..8e306282a73 100644 --- a/src/test/app/Discrepancy_test.cpp +++ b/src/test/app/Discrepancy_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 123b6548358..1f872d2bdc7 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index a49dbb0bcaf..73bb539a222 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/test/app/FixNFTokenPageLinks_test.cpp b/src/test/app/FixNFTokenPageLinks_test.cpp index f8db4df4f92..f87d70aacf7 100644 --- a/src/test/app/FixNFTokenPageLinks_test.cpp +++ b/src/test/app/FixNFTokenPageLinks_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/app/Flow_test.cpp b/src/test/app/Flow_test.cpp index 4d1397eab83..aa7e819e071 100644 --- a/src/test/app/Flow_test.cpp +++ b/src/test/app/Flow_test.cpp @@ -19,15 +19,15 @@ #include #include + #include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Freeze_test.cpp b/src/test/app/Freeze_test.cpp index 99696c11f6e..36578cbc6b3 100644 --- a/src/test/app/Freeze_test.cpp +++ b/src/test/app/Freeze_test.cpp @@ -16,8 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include diff --git a/src/test/app/HashRouter_test.cpp b/src/test/app/HashRouter_test.cpp index 1234bc5b9cb..d8d7ca68511 100644 --- a/src/test/app/HashRouter_test.cpp +++ b/src/test/app/HashRouter_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/LedgerHistory_test.cpp b/src/test/app/LedgerHistory_test.cpp index e1a837a9cb2..7b1910bd4dc 100644 --- a/src/test/app/LedgerHistory_test.cpp +++ b/src/test/app/LedgerHistory_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include #include #include + #include #include + #include -#include #include namespace ripple { diff --git a/src/test/app/LedgerLoad_test.cpp b/src/test/app/LedgerLoad_test.cpp index 5b6df353d81..c151bc7b4a4 100644 --- a/src/test/app/LedgerLoad_test.cpp +++ b/src/test/app/LedgerLoad_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/app/LedgerMaster_test.cpp b/src/test/app/LedgerMaster_test.cpp index d53d27b3185..a5517ccceeb 100644 --- a/src/test/app/LedgerMaster_test.cpp +++ b/src/test/app/LedgerMaster_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/LedgerReplay_test.cpp b/src/test/app/LedgerReplay_test.cpp index 883aca7bced..15f51889bbb 100644 --- a/src/test/app/LedgerReplay_test.cpp +++ b/src/test/app/LedgerReplay_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include @@ -29,6 +30,7 @@ #include #include #include + #include #include diff --git a/src/test/app/LoadFeeTrack_test.cpp b/src/test/app/LoadFeeTrack_test.cpp index fa7489bf1bb..9b0cf2fa2db 100644 --- a/src/test/app/LoadFeeTrack_test.cpp +++ b/src/test/app/LoadFeeTrack_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/app/MPToken_test.cpp b/src/test/app/MPToken_test.cpp index 9fd4927d5eb..31e5368691d 100644 --- a/src/test/app/MPToken_test.cpp +++ b/src/test/app/MPToken_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/test/app/Manifest_test.cpp b/src/test/app/Manifest_test.cpp index 0e25300417c..deaa2adbad3 100644 --- a/src/test/app/Manifest_test.cpp +++ b/src/test/app/Manifest_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include #include #include -#include + #include #include #include #include #include + #include #include #include diff --git a/src/test/app/MultiSign_test.cpp b/src/test/app/MultiSign_test.cpp index 9648bed886f..ecac8ac67b4 100644 --- a/src/test/app/MultiSign_test.cpp +++ b/src/test/app/MultiSign_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenBurn_test.cpp b/src/test/app/NFTokenBurn_test.cpp index a56f0a45674..a970b11789d 100644 --- a/src/test/app/NFTokenBurn_test.cpp +++ b/src/test/app/NFTokenBurn_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/NFTokenDir_test.cpp b/src/test/app/NFTokenDir_test.cpp index 23e4c671526..fe21e027393 100644 --- a/src/test/app/NFTokenDir_test.cpp +++ b/src/test/app/NFTokenDir_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index ec1ee5111e4..62a7b00da9b 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include diff --git a/src/test/app/NetworkID_test.cpp b/src/test/app/NetworkID_test.cpp index 2f02a1fd7d2..07a4641c0e1 100644 --- a/src/test/app/NetworkID_test.cpp +++ b/src/test/app/NetworkID_test.cpp @@ -19,8 +19,7 @@ #include #include -#include -#include + #include namespace ripple { diff --git a/src/test/app/OfferStream_test.cpp b/src/test/app/OfferStream_test.cpp index bf712503687..691d327cd82 100644 --- a/src/test/app/OfferStream_test.cpp +++ b/src/test/app/OfferStream_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/Offer_test.cpp b/src/test/app/Offer_test.cpp index 2b4245a1ae4..8ba4113341d 100644 --- a/src/test/app/Offer_test.cpp +++ b/src/test/app/Offer_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/test/app/Oracle_test.cpp b/src/test/app/Oracle_test.cpp index 44eeb1c9f98..291349309a7 100644 --- a/src/test/app/Oracle_test.cpp +++ b/src/test/app/Oracle_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/app/OversizeMeta_test.cpp b/src/test/app/OversizeMeta_test.cpp index 0a7f42e1801..f6e4466bab3 100644 --- a/src/test/app/OversizeMeta_test.cpp +++ b/src/test/app/OversizeMeta_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/Path_test.cpp b/src/test/app/Path_test.cpp index 1db15388ff0..b500014578d 100644 --- a/src/test/app/Path_test.cpp +++ b/src/test/app/Path_test.cpp @@ -19,24 +19,22 @@ #include #include + #include #include #include #include #include #include -#include + #include #include -#include #include #include #include #include -#include -#include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayChan_test.cpp b/src/test/app/PayChan_test.cpp index bc1cbba69c0..dc839f89ec5 100644 --- a/src/test/app/PayChan_test.cpp +++ b/src/test/app/PayChan_test.cpp @@ -18,15 +18,16 @@ //============================================================================== #include + #include #include + #include #include #include #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PayStrand_test.cpp b/src/test/app/PayStrand_test.cpp index f00a7361292..4d743d9d7c8 100644 --- a/src/test/app/PayStrand_test.cpp +++ b/src/test/app/PayStrand_test.cpp @@ -17,18 +17,16 @@ #include #include + #include -#include #include #include #include -#include #include -#include + #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/app/PermissionedDomains_test.cpp b/src/test/app/PermissionedDomains_test.cpp index 7d78652b287..65f75897ae5 100644 --- a/src/test/app/PermissionedDomains_test.cpp +++ b/src/test/app/PermissionedDomains_test.cpp @@ -18,12 +18,10 @@ //============================================================================== #include + #include -#include -#include -#include + #include -#include #include #include diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 55622e49237..1101f56c699 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -16,9 +16,11 @@ //============================================================================== #include + #include + #include -#include + #include #include diff --git a/src/test/app/RCLCensorshipDetector_test.cpp b/src/test/app/RCLCensorshipDetector_test.cpp index b5440b90903..85ba0ab78d7 100644 --- a/src/test/app/RCLCensorshipDetector_test.cpp +++ b/src/test/app/RCLCensorshipDetector_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/RCLValidations_test.cpp b/src/test/app/RCLValidations_test.cpp index 540d98bc1f1..31c38f23b1c 100644 --- a/src/test/app/RCLValidations_test.cpp +++ b/src/test/app/RCLValidations_test.cpp @@ -18,11 +18,10 @@ //============================================================================== #include + #include #include -#include -#include -#include + #include #include diff --git a/src/test/app/ReducedOffer_test.cpp b/src/test/app/ReducedOffer_test.cpp index a070051e435..5af06d594df 100644 --- a/src/test/app/ReducedOffer_test.cpp +++ b/src/test/app/ReducedOffer_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/app/Regression_test.cpp b/src/test/app/Regression_test.cpp index ec52d603ebe..ca8dcdf5e2b 100644 --- a/src/test/app/Regression_test.cpp +++ b/src/test/app/Regression_test.cpp @@ -18,12 +18,13 @@ #include #include #include + #include #include + #include #include #include -#include #include #include diff --git a/src/test/app/SHAMapStore_test.cpp b/src/test/app/SHAMapStore_test.cpp index 5fd3f79c9f5..d3b5917434b 100644 --- a/src/test/app/SHAMapStore_test.cpp +++ b/src/test/app/SHAMapStore_test.cpp @@ -19,12 +19,14 @@ #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/app/SetAuth_test.cpp b/src/test/app/SetAuth_test.cpp index 3dd8ab590a4..c531de2d75f 100644 --- a/src/test/app/SetAuth_test.cpp +++ b/src/test/app/SetAuth_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/app/SetRegularKey_test.cpp b/src/test/app/SetRegularKey_test.cpp index 024d8de137b..6a3a5ff2a95 100644 --- a/src/test/app/SetRegularKey_test.cpp +++ b/src/test/app/SetRegularKey_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/app/SetTrust_test.cpp b/src/test/app/SetTrust_test.cpp index 57e18d712f8..c99a1dafa12 100644 --- a/src/test/app/SetTrust_test.cpp +++ b/src/test/app/SetTrust_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include diff --git a/src/test/app/Taker_test.cpp b/src/test/app/Taker_test.cpp index 89e44b2b98b..3b3f338625c 100644 --- a/src/test/app/Taker_test.cpp +++ b/src/test/app/Taker_test.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include + #include -#include namespace ripple { diff --git a/src/test/app/TheoreticalQuality_test.cpp b/src/test/app/TheoreticalQuality_test.cpp index 917d23377bf..0269d206ccc 100644 --- a/src/test/app/TheoreticalQuality_test.cpp +++ b/src/test/app/TheoreticalQuality_test.cpp @@ -19,14 +19,13 @@ #include #include + #include #include #include #include -#include -#include #include -#include + #include #include #include diff --git a/src/test/app/Ticket_test.cpp b/src/test/app/Ticket_test.cpp index 9467390502c..dd83e3036ee 100644 --- a/src/test/app/Ticket_test.cpp +++ b/src/test/app/Ticket_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/app/Transaction_ordering_test.cpp b/src/test/app/Transaction_ordering_test.cpp index 928fcdb8389..472d4e2ab87 100644 --- a/src/test/app/Transaction_ordering_test.cpp +++ b/src/test/app/Transaction_ordering_test.cpp @@ -16,8 +16,8 @@ //============================================================================== #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/app/TrustAndBalance_test.cpp b/src/test/app/TrustAndBalance_test.cpp index b438d797276..037a7e0d895 100644 --- a/src/test/app/TrustAndBalance_test.cpp +++ b/src/test/app/TrustAndBalance_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/test/app/TxQ_test.cpp b/src/test/app/TxQ_test.cpp index 5201cb601e6..2bedee17ca9 100644 --- a/src/test/app/TxQ_test.cpp +++ b/src/test/app/TxQ_test.cpp @@ -22,11 +22,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/test/app/ValidatorKeys_test.cpp b/src/test/app/ValidatorKeys_test.cpp index 9281ec4bd77..7c8584698e5 100644 --- a/src/test/app/ValidatorKeys_test.cpp +++ b/src/test/app/ValidatorKeys_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include + #include #include #include #include + #include #include diff --git a/src/test/app/ValidatorList_test.cpp b/src/test/app/ValidatorList_test.cpp index 465723b1a70..819340bfa4d 100644 --- a/src/test/app/ValidatorList_test.cpp +++ b/src/test/app/ValidatorList_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/app/ValidatorSite_test.cpp b/src/test/app/ValidatorSite_test.cpp index 1ec302efef8..f7db0463c11 100644 --- a/src/test/app/ValidatorSite_test.cpp +++ b/src/test/app/ValidatorSite_test.cpp @@ -20,23 +20,22 @@ #include #include #include + #include -#include -#include + #include -#include #include -#include -#include -#include #include + #include #include #include #include -#include + #include +#include + namespace ripple { namespace test { namespace detail { diff --git a/src/test/app/XChain_test.cpp b/src/test/app/XChain_test.cpp index 3d25e9e989a..777cd5a68fb 100644 --- a/src/test/app/XChain_test.cpp +++ b/src/test/app/XChain_test.cpp @@ -17,6 +17,12 @@ */ //============================================================================== +#include +#include +#include +#include +#include + #include #include #include @@ -27,12 +33,6 @@ #include #include -#include -#include -#include -#include -#include - #include #include #include @@ -42,9 +42,6 @@ #include #include -#include -#include - namespace ripple::test { // SEnv class - encapsulate jtx::Env to make it more user-friendly, diff --git a/src/test/app/tx/apply_test.cpp b/src/test/app/tx/apply_test.cpp index df76e839a71..63fecde65fe 100644 --- a/src/test/app/tx/apply_test.cpp +++ b/src/test/app/tx/apply_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/basics/Buffer_test.cpp b/src/test/basics/Buffer_test.cpp index da8bcc8f12c..43ca048d7f4 100644 --- a/src/test/basics/Buffer_test.cpp +++ b/src/test/basics/Buffer_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/Expected_test.cpp b/src/test/basics/Expected_test.cpp index 2f8b92eb916..d022d074616 100644 --- a/src/test/basics/Expected_test.cpp +++ b/src/test/basics/Expected_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #if BOOST_VERSION >= 107500 #include // Not part of boost before version 1.75 #endif // BOOST_VERSION diff --git a/src/test/basics/FeeUnits_test.cpp b/src/test/basics/FeeUnits_test.cpp index c32f98f1929..62662888960 100644 --- a/src/test/basics/FeeUnits_test.cpp +++ b/src/test/basics/FeeUnits_test.cpp @@ -19,7 +19,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/basics/FileUtilities_test.cpp b/src/test/basics/FileUtilities_test.cpp index 2b84998da7c..b78173f35fc 100644 --- a/src/test/basics/FileUtilities_test.cpp +++ b/src/test/basics/FileUtilities_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/KeyCache_test.cpp b/src/test/basics/KeyCache_test.cpp index eab0e87d0a7..d39fd4a7162 100644 --- a/src/test/basics/KeyCache_test.cpp +++ b/src/test/basics/KeyCache_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include #include #include -#include #include namespace ripple { diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 8a0a6702a63..13d8b259d1d 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/test/basics/PerfLog_test.cpp b/src/test/basics/PerfLog_test.cpp index 756988cbdac..7ec62a17017 100644 --- a/src/test/basics/PerfLog_test.cpp +++ b/src/test/basics/PerfLog_test.cpp @@ -19,8 +19,10 @@ #include #include + #include #include + #include #include #include @@ -30,7 +32,6 @@ #include #include #include -#include #include #include diff --git a/src/test/basics/Slice_test.cpp b/src/test/basics/Slice_test.cpp index a169de98539..3d474def792 100644 --- a/src/test/basics/Slice_test.cpp +++ b/src/test/basics/Slice_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/basics/TaggedCache_test.cpp b/src/test/basics/TaggedCache_test.cpp index 6fbba1a4795..519bc235cda 100644 --- a/src/test/basics/TaggedCache_test.cpp +++ b/src/test/basics/TaggedCache_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/basics/base_uint_test.cpp b/src/test/basics/base_uint_test.cpp index 9f3194f4fbc..8058e0d6f05 100644 --- a/src/test/basics/base_uint_test.cpp +++ b/src/test/basics/base_uint_test.cpp @@ -21,9 +21,10 @@ #include #include #include + #include -#include +#include #include namespace ripple { diff --git a/src/test/basics/contract_test.cpp b/src/test/basics/contract_test.cpp index 99f118794ee..9595dbabcce 100644 --- a/src/test/basics/contract_test.cpp +++ b/src/test/basics/contract_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/basics/hardened_hash_test.cpp b/src/test/basics/hardened_hash_test.cpp index 343894e52b0..248e8070351 100644 --- a/src/test/basics/hardened_hash_test.cpp +++ b/src/test/basics/hardened_hash_test.cpp @@ -19,10 +19,9 @@ #include #include -#include + #include #include -#include #include #include #include diff --git a/src/test/basics/tagged_integer_test.cpp b/src/test/basics/tagged_integer_test.cpp index 22cdc5ad53f..cb15d246a6e 100644 --- a/src/test/basics/tagged_integer_test.cpp +++ b/src/test/basics/tagged_integer_test.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/beast/IPEndpoint_test.cpp b/src/test/beast/IPEndpoint_test.cpp index 1ad49443dc3..7b3eba55f18 100644 --- a/src/test/beast/IPEndpoint_test.cpp +++ b/src/test/beast/IPEndpoint_test.cpp @@ -21,13 +21,14 @@ // ../impl/IPAddressV6.cpp #include + #include #include #include + #include #include #include -#include namespace beast { namespace IP { diff --git a/src/test/beast/SemanticVersion_test.cpp b/src/test/beast/SemanticVersion_test.cpp index 2f24a0c8926..fb7a3e3e4fb 100644 --- a/src/test/beast/SemanticVersion_test.cpp +++ b/src/test/beast/SemanticVersion_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class SemanticVersion_test : public unit_test::suite @@ -279,4 +281,4 @@ class SemanticVersion_test : public unit_test::suite }; BEAST_DEFINE_TESTSUITE(SemanticVersion, beast_core, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/aged_associative_container_test.cpp b/src/test/beast/aged_associative_container_test.cpp index e5736764e06..f88d5acc277 100644 --- a/src/test/beast/aged_associative_container_test.cpp +++ b/src/test/beast/aged_associative_container_test.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include - #include #include #include @@ -28,6 +26,7 @@ #include #include #include +#include #include #include diff --git a/src/test/beast/beast_CurrentThreadName_test.cpp b/src/test/beast/beast_CurrentThreadName_test.cpp index 653b0a89618..839aaaef0ac 100644 --- a/src/test/beast/beast_CurrentThreadName_test.cpp +++ b/src/test/beast/beast_CurrentThreadName_test.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/test/beast/beast_PropertyStream_test.cpp b/src/test/beast/beast_PropertyStream_test.cpp index e91f527d3c9..bbbc2fc0e0d 100644 --- a/src/test/beast/beast_PropertyStream_test.cpp +++ b/src/test/beast/beast_PropertyStream_test.cpp @@ -16,8 +16,10 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + namespace beast { class PropertyStream_test : public unit_test::suite @@ -237,4 +239,4 @@ class PropertyStream_test : public unit_test::suite }; BEAST_DEFINE_TESTSUITE(PropertyStream, utility, beast); -} // namespace beast \ No newline at end of file +} // namespace beast diff --git a/src/test/beast/beast_Zero_test.cpp b/src/test/beast/beast_Zero_test.cpp index 8fd16a4d51f..9a645334ab2 100644 --- a/src/test/beast/beast_Zero_test.cpp +++ b/src/test/beast/beast_Zero_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_abstract_clock_test.cpp b/src/test/beast/beast_abstract_clock_test.cpp index a026df26376..b86afdb1391 100644 --- a/src/test/beast/beast_abstract_clock_test.cpp +++ b/src/test/beast/beast_abstract_clock_test.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/test/beast/beast_basic_seconds_clock_test.cpp b/src/test/beast/beast_basic_seconds_clock_test.cpp index f3926634dc4..c769cde07ac 100644 --- a/src/test/beast/beast_basic_seconds_clock_test.cpp +++ b/src/test/beast/beast_basic_seconds_clock_test.cpp @@ -17,9 +17,8 @@ */ //============================================================================== -#include - #include +#include namespace beast { diff --git a/src/test/beast/beast_io_latency_probe_test.cpp b/src/test/beast/beast_io_latency_probe_test.cpp index 96228194304..de3c5d1d208 100644 --- a/src/test/beast/beast_io_latency_probe_test.cpp +++ b/src/test/beast/beast_io_latency_probe_test.cpp @@ -16,21 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include -#include +#include #include +#include #include #include #include #include -#include #include #include #include -#include #include using namespace std::chrono_literals; diff --git a/src/test/beast/define_print.cpp b/src/test/beast/define_print.cpp index 0d36cd76982..ec86d5d7d78 100644 --- a/src/test/beast/define_print.cpp +++ b/src/test/beast/define_print.cpp @@ -8,6 +8,7 @@ #include #include #include + #include // Include this .cpp in your project to gain access to the printing suite diff --git a/src/test/conditions/PreimageSha256_test.cpp b/src/test/conditions/PreimageSha256_test.cpp index 9a6840b11c3..820b005a3fe 100644 --- a/src/test/conditions/PreimageSha256_test.cpp +++ b/src/test/conditions/PreimageSha256_test.cpp @@ -20,11 +20,13 @@ #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/consensus/ByzantineFailureSim_test.cpp b/src/test/consensus/ByzantineFailureSim_test.cpp index 92dbfc0174d..b9799434776 100644 --- a/src/test/consensus/ByzantineFailureSim_test.cpp +++ b/src/test/consensus/ByzantineFailureSim_test.cpp @@ -16,9 +16,11 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Consensus_test.cpp b/src/test/consensus/Consensus_test.cpp index 88280994c10..db56ab58c69 100644 --- a/src/test/consensus/Consensus_test.cpp +++ b/src/test/consensus/Consensus_test.cpp @@ -16,13 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include -#include -#include + #include -#include +#include namespace ripple { namespace test { @@ -40,6 +41,7 @@ class Consensus_test : public beast::unit_test::suite testShouldCloseLedger() { using namespace std::chrono_literals; + testcase("should close ledger"); // Use default parameters ConsensusParms const p{}; @@ -78,46 +80,102 @@ class Consensus_test : public beast::unit_test::suite testCheckConsensus() { using namespace std::chrono_literals; + testcase("check consensus"); // Use default parameterss ConsensusParms const p{}; + /////////////// + // Disputes still in doubt + // // Not enough time has elapsed BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 2s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 2s, false, p, true, journal_)); // If not enough peers have propsed, ensure // more time for proposals BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 2, 0, 3s, 4s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 4s, false, p, true, journal_)); // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(10, 2, 2, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 2, 0, 3s, 10s, false, p, true, journal_)); // Enough time has elapsed and we don't yet agree BEAST_EXPECT( ConsensusState::No == - checkConsensus(10, 2, 1, 0, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 0, 3s, 10s, false, p, true, journal_)); // Our peers have moved on // Enough time has elapsed and we all agree BEAST_EXPECT( ConsensusState::MovedOn == - checkConsensus(10, 2, 1, 8, 3s, 10s, p, true, journal_)); + checkConsensus(10, 2, 1, 8, 3s, 10s, false, p, true, journal_)); + + // If no peers, don't agree until time has passed. + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(0, 0, 0, 0, 3s, 10s, false, p, true, journal_)); + + // Agree if no peers and enough time has passed. + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(0, 0, 0, 0, 3s, 16s, false, p, true, journal_)); + + // Expire if too much time has passed without agreement + BEAST_EXPECT( + ConsensusState::Expired == + checkConsensus(10, 8, 1, 0, 1s, 19s, false, p, true, journal_)); + + /////////////// + // Stalled + // + // Not enough time has elapsed + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 2s, true, p, true, journal_)); + + // If not enough peers have propsed, ensure + // more time for proposals + BEAST_EXPECT( + ConsensusState::No == + checkConsensus(10, 2, 2, 0, 3s, 4s, true, p, true, journal_)); + + // Enough time has elapsed and we all agree + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 2, 0, 3s, 10s, true, p, true, journal_)); + + // Enough time has elapsed and we don't yet agree, but there's nothing + // left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 0, 3s, 10s, true, p, true, journal_)); + + // Our peers have moved on + // Enough time has elapsed and we all agree, nothing left to dispute + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 2, 1, 8, 3s, 10s, true, p, true, journal_)); // If no peers, don't agree until time has passed. BEAST_EXPECT( ConsensusState::No == - checkConsensus(0, 0, 0, 0, 3s, 10s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 10s, true, p, true, journal_)); // Agree if no peers and enough time has passed. BEAST_EXPECT( ConsensusState::Yes == - checkConsensus(0, 0, 0, 0, 3s, 16s, p, true, journal_)); + checkConsensus(0, 0, 0, 0, 3s, 16s, true, p, true, journal_)); + + // We are done if there's nothing left to dispute, no matter how much + // time has passed + BEAST_EXPECT( + ConsensusState::Yes == + checkConsensus(10, 8, 1, 0, 1s, 19s, true, p, true, journal_)); } void @@ -125,6 +183,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace std::chrono_literals; using namespace csf; + testcase("standalone"); Sim s; PeerGroup peers = s.createGroup(1); @@ -149,6 +208,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("peers agree"); ConsensusParms const parms{}; Sim sim; @@ -186,6 +246,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("slow peers"); // Several tests of a complete trust graph with a subset of peers // that have significantly longer network delays to the rest of the @@ -351,6 +412,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("close time disagree"); // This is a very specialized test to get ledgers to disagree on // the close time. It unfortunately assumes knowledge about current @@ -417,6 +479,8 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("wrong LCL"); + // Specialized test to exercise a temporary fork in which some peers // are working on an incorrect prior ledger. @@ -589,6 +653,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("consensus close time rounding"); // This is a specialized test engineered to yield ledgers with different // close times even though the peers believe they had close time @@ -604,9 +669,6 @@ class Consensus_test : public beast::unit_test::suite PeerGroup fast = sim.createGroup(4); PeerGroup network = fast + slow; - for (Peer* peer : network) - peer->consensusParms = parms; - // Connected trust graph network.trust(network); @@ -692,6 +754,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("fork"); std::uint32_t numPeers = 10; // Vary overlap between two UNLs @@ -748,6 +811,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("hub network"); // Simulate a set of 5 validators that aren't directly connected but // rely on a single hub node for communication @@ -835,6 +899,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("preferred by branch"); // Simulate network splits that are prevented from forking when using // preferred ledger by trie. This is a contrived example that involves @@ -967,6 +1032,7 @@ class Consensus_test : public beast::unit_test::suite { using namespace csf; using namespace std::chrono; + testcase("pause for laggards"); // Test that validators that jump ahead of the network slow // down. @@ -1052,6 +1118,302 @@ class Consensus_test : public beast::unit_test::suite BEAST_EXPECT(sim.synchronized()); } + void + testDisputes() + { + testcase("disputes"); + + using namespace csf; + + // Test dispute objects directly + using Dispute = DisputedTx; + + Tx const txTrue{99}; + Tx const txFalse{98}; + Tx const txFollowingTrue{97}; + Tx const txFollowingFalse{96}; + int const numPeers = 100; + ConsensusParms p; + std::size_t peersUnchanged = 0; + + // Three cases: + // 1 proposing, initial vote yes + // 2 proposing, initial vote no + // 3 not proposing, initial vote doesn't matter after the first update, + // use yes + { + Dispute proposingTrue{txTrue.id(), true, numPeers, journal_}; + Dispute proposingFalse{txFalse.id(), false, numPeers, journal_}; + Dispute followingTrue{ + txFollowingTrue.id(), true, numPeers, journal_}; + Dispute followingFalse{ + txFollowingFalse.id(), false, numPeers, journal_}; + BEAST_EXPECT(proposingTrue.ID() == 99); + BEAST_EXPECT(proposingFalse.ID() == 98); + BEAST_EXPECT(followingTrue.ID() == 97); + BEAST_EXPECT(followingFalse.ID() == 96); + + // Create an even split in the peer votes + for (int i = 0; i < numPeers; ++i) + { + BEAST_EXPECT(proposingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingTrue.setVote(PeerID(i), i < 50)); + BEAST_EXPECT(followingFalse.setVote(PeerID(i), i < 50)); + } + // Switch the middle vote to match mine + BEAST_EXPECT(proposingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(proposingFalse.setVote(PeerID(49), false)); + BEAST_EXPECT(followingTrue.setVote(PeerID(50), true)); + BEAST_EXPECT(followingFalse.setVote(PeerID(49), false)); + + // no changes yet + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // I'm in the majority, my vote should not change + BEAST_EXPECT(!proposingTrue.updateVote(5, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(5, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(5, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(5, false, p)); + + BEAST_EXPECT(!proposingTrue.updateVote(10, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(10, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(10, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(10, false, p)); + + peersUnchanged = 2; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Right now, the vote is 51%. The requirement is about to jump to + // 65% + BEAST_EXPECT(proposingTrue.updateVote(55, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(55, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(55, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(55, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + // 16 validators change their vote to match my original vote + for (int i = 0; i < 16; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + // The vote should now be 66%, threshold is 65% + BEAST_EXPECT(proposingTrue.updateVote(60, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(60, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(60, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(60, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // Threshold jumps to 70% + BEAST_EXPECT(proposingTrue.updateVote(86, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(86, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(86, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(86, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 5 more validators change their vote to match my original vote + for (int i = 16; i < 21; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(proposingTrue.updateVote(90, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(90, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(90, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(90, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(150, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(150, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(150, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(150, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // The vote should now be 71%, threshold is 70% + BEAST_EXPECT(!proposingTrue.updateVote(190, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(190, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(190, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(190, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + peersUnchanged = 3; + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + + // Threshold jumps to 95% + BEAST_EXPECT(proposingTrue.updateVote(220, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(220, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(220, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(220, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == false); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // 25 more validators change their vote to match my original vote + for (int i = 21; i < 46; ++i) + { + auto pTrue = PeerID(numPeers - i - 1); + auto pFalse = PeerID(i); + BEAST_EXPECT(proposingTrue.setVote(pTrue, true)); + BEAST_EXPECT(proposingFalse.setVote(pFalse, false)); + BEAST_EXPECT(followingTrue.setVote(pTrue, true)); + BEAST_EXPECT(followingFalse.setVote(pFalse, false)); + } + + // The vote should now be 96%, threshold is 95% + BEAST_EXPECT(proposingTrue.updateVote(250, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250, false, p)); + BEAST_EXPECT(!followingFalse.updateVote(250, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + for (peersUnchanged = 0; peersUnchanged < 6; ++peersUnchanged) + { + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(!followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(!followingFalse.stalled(p, false, peersUnchanged)); + } + + for (int i = 0; i < 1; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote has changed recently, so not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, peersUnchanged)); + // remaining votes have been unchanged in so long that we only + // need to hit the second round at 95% to be stalled, regardless + // of peers + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 1; i < 3; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + // true vote changed 2 rounds ago, and peers are changing, so + // not stalled + BEAST_EXPECT(!proposingTrue.stalled(p, true, 0)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + // true vote changed 2 rounds ago, and peers are NOT changing, + // so stalled + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + // still stalled + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + for (int i = 3; i < 5; ++i) + { + BEAST_EXPECT(!proposingTrue.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!proposingFalse.updateVote(250 + 10 * i, true, p)); + BEAST_EXPECT(!followingTrue.updateVote(250 + 10 * i, false, p)); + BEAST_EXPECT( + !followingFalse.updateVote(250 + 10 * i, false, p)); + + BEAST_EXPECT(proposingTrue.getOurVote() == true); + BEAST_EXPECT(proposingFalse.getOurVote() == false); + BEAST_EXPECT(followingTrue.getOurVote() == true); + BEAST_EXPECT(followingFalse.getOurVote() == false); + + BEAST_EXPECT(proposingTrue.stalled(p, true, 0)); + BEAST_EXPECT(proposingFalse.stalled(p, true, 0)); + BEAST_EXPECT(followingTrue.stalled(p, false, 0)); + BEAST_EXPECT(followingFalse.stalled(p, false, 0)); + + BEAST_EXPECT(proposingTrue.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(proposingFalse.stalled(p, true, peersUnchanged)); + BEAST_EXPECT(followingTrue.stalled(p, false, peersUnchanged)); + BEAST_EXPECT(followingFalse.stalled(p, false, peersUnchanged)); + } + } + } + void run() override { @@ -1068,6 +1430,7 @@ class Consensus_test : public beast::unit_test::suite testHubNetwork(); testPreferredByBranch(); testPauseForLaggards(); + testDisputes(); } }; diff --git a/src/test/consensus/DistributedValidatorsSim_test.cpp b/src/test/consensus/DistributedValidatorsSim_test.cpp index 3abac36b4f1..2f6ed74c237 100644 --- a/src/test/consensus/DistributedValidatorsSim_test.cpp +++ b/src/test/consensus/DistributedValidatorsSim_test.cpp @@ -16,17 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include + #include -#include #include #include + #include #include #include #include +#include namespace ripple { namespace test { diff --git a/src/test/consensus/LedgerTiming_test.cpp b/src/test/consensus/LedgerTiming_test.cpp index 95e27f5c854..79c0f3f8842 100644 --- a/src/test/consensus/LedgerTiming_test.cpp +++ b/src/test/consensus/LedgerTiming_test.cpp @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include namespace ripple { diff --git a/src/test/consensus/LedgerTrie_test.cpp b/src/test/consensus/LedgerTrie_test.cpp index 6f13db43be2..f46fea8e6e0 100644 --- a/src/test/consensus/LedgerTrie_test.cpp +++ b/src/test/consensus/LedgerTrie_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include + #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/consensus/NegativeUNL_test.cpp b/src/test/consensus/NegativeUNL_test.cpp index 4993f679e1a..7eb05e68bb0 100644 --- a/src/test/consensus/NegativeUNL_test.cpp +++ b/src/test/consensus/NegativeUNL_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/test/consensus/ScaleFreeSim_test.cpp b/src/test/consensus/ScaleFreeSim_test.cpp index 3e3cec97618..226cf5bfed3 100644 --- a/src/test/consensus/ScaleFreeSim_test.cpp +++ b/src/test/consensus/ScaleFreeSim_test.cpp @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include -#include + #include + #include namespace ripple { diff --git a/src/test/consensus/Validations_test.cpp b/src/test/consensus/Validations_test.cpp index 0279d6330cc..4424d7619d2 100644 --- a/src/test/consensus/Validations_test.cpp +++ b/src/test/consensus/Validations_test.cpp @@ -19,13 +19,13 @@ #include #include + #include + #include #include #include -#include -#include -#include + #include namespace ripple { diff --git a/src/test/core/ClosureCounter_test.cpp b/src/test/core/ClosureCounter_test.cpp index 83d2fdb6e4a..a426a4aea49 100644 --- a/src/test/core/ClosureCounter_test.cpp +++ b/src/test/core/ClosureCounter_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/core/Config_test.cpp b/src/test/core/Config_test.cpp index 2bf398c9a95..8b0fce1e204 100644 --- a/src/test/core/Config_test.cpp +++ b/src/test/core/Config_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include @@ -29,7 +30,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/core/Coroutine_test.cpp b/src/test/core/Coroutine_test.cpp index 0fdc5a4f49a..8458da647d4 100644 --- a/src/test/core/Coroutine_test.cpp +++ b/src/test/core/Coroutine_test.cpp @@ -18,9 +18,10 @@ //============================================================================== #include + #include + #include -#include #include namespace ripple { diff --git a/src/test/core/CryptoPRNG_test.cpp b/src/test/core/CryptoPRNG_test.cpp index 303a2176315..21924e582c0 100644 --- a/src/test/core/CryptoPRNG_test.cpp +++ b/src/test/core/CryptoPRNG_test.cpp @@ -18,11 +18,9 @@ //============================================================================== #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/test/core/JobQueue_test.cpp b/src/test/core/JobQueue_test.cpp index 42338063db3..66f110be9c3 100644 --- a/src/test/core/JobQueue_test.cpp +++ b/src/test/core/JobQueue_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/core/SociDB_test.cpp b/src/test/core/SociDB_test.cpp index 82d0cbe9035..8f2a3c66465 100644 --- a/src/test/core/SociDB_test.cpp +++ b/src/test/core/SociDB_test.cpp @@ -18,10 +18,12 @@ //============================================================================== #include -#include + #include + #include #include + #include #include diff --git a/src/test/core/Workers_test.cpp b/src/test/core/Workers_test.cpp index 3fac4808f9f..e37f7a71f88 100644 --- a/src/test/core/Workers_test.cpp +++ b/src/test/core/Workers_test.cpp @@ -17,13 +17,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include #include #include + #include #include + #include -#include #include #include #include diff --git a/src/test/csf/BasicNetwork_test.cpp b/src/test/csf/BasicNetwork_test.cpp index 61660ae4c4e..4173db65022 100644 --- a/src/test/csf/BasicNetwork_test.cpp +++ b/src/test/csf/BasicNetwork_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/csf/CollectorRef.h b/src/test/csf/CollectorRef.h index 72d1e9545d8..309b48af1f0 100644 --- a/src/test/csf/CollectorRef.h +++ b/src/test/csf/CollectorRef.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTOREF_H_INCLUDED diff --git a/src/test/csf/Digraph_test.cpp b/src/test/csf/Digraph_test.cpp index 80319445caf..0cc4be19762 100644 --- a/src/test/csf/Digraph_test.cpp +++ b/src/test/csf/Digraph_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/csf/Histogram.h b/src/test/csf/Histogram.h index 2df1844a21d..fb0f5323966 100644 --- a/src/test/csf/Histogram.h +++ b/src/test/csf/Histogram.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED #define RIPPLE_TEST_CSF_HISTOGRAM_H_INCLUDED diff --git a/src/test/csf/Histogram_test.cpp b/src/test/csf/Histogram_test.cpp index ea8b864780a..40274c9046d 100644 --- a/src/test/csf/Histogram_test.cpp +++ b/src/test/csf/Histogram_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/csf/Peer.h b/src/test/csf/Peer.h index dceafb96482..678924112ed 100644 --- a/src/test/csf/Peer.h +++ b/src/test/csf/Peer.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEER_H_INCLUDED #define RIPPLE_TEST_CSF_PEER_H_INCLUDED @@ -26,12 +27,16 @@ #include #include #include + #include #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/csf/PeerGroup.h b/src/test/csf/PeerGroup.h index b59bfa6763c..0da1ef69c9c 100644 --- a/src/test/csf/PeerGroup.h +++ b/src/test/csf/PeerGroup.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #define RIPPLE_TEST_CSF_PEERGROUP_H_INCLUDED #include #include + #include #include diff --git a/src/test/csf/Proposal.h b/src/test/csf/Proposal.h index 1d70464bab5..eae258a251e 100644 --- a/src/test/csf/Proposal.h +++ b/src/test/csf/Proposal.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #define RIPPLE_TEST_CSF_PROPOSAL_H_INCLUDED #include #include #include + #include namespace ripple { @@ -36,4 +38,4 @@ using Proposal = ConsensusProposal; } // namespace test } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/test/csf/Scheduler_test.cpp b/src/test/csf/Scheduler_test.cpp index 931150bbeb2..1935e40236e 100644 --- a/src/test/csf/Scheduler_test.cpp +++ b/src/test/csf/Scheduler_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include diff --git a/src/test/csf/SimTime.h b/src/test/csf/SimTime.h index 930338108e1..32d657b6251 100644 --- a/src/test/csf/SimTime.h +++ b/src/test/csf/SimTime.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_SIMTIME_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/csf/TrustGraph.h b/src/test/csf/TrustGraph.h index 649f210646f..5770c792bc2 100644 --- a/src/test/csf/TrustGraph.h +++ b/src/test/csf/TrustGraph.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_CSF_UNL_H_INCLUDED #include + #include #include diff --git a/src/test/csf/Tx.h b/src/test/csf/Tx.h index f87f382167d..066aee22688 100644 --- a/src/test/csf/Tx.h +++ b/src/test/csf/Tx.h @@ -16,12 +16,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TX_H_INCLUDED #define RIPPLE_TEST_CSF_TX_H_INCLUDED + #include #include + #include #include + #include #include #include @@ -48,7 +52,7 @@ class Tx { } - ID + ID const& id() const { return id_; diff --git a/src/test/csf/Validation.h b/src/test/csf/Validation.h index 57c2bc66681..e79222c84f3 100644 --- a/src/test/csf/Validation.h +++ b/src/test/csf/Validation.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #define RIPPLE_TEST_CSF_VALIDATION_H_INCLUDED #include + #include #include diff --git a/src/test/csf/collectors.h b/src/test/csf/collectors.h index 8dcaa035314..0494178ae9d 100644 --- a/src/test/csf/collectors.h +++ b/src/test/csf/collectors.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #define RIPPLE_TEST_CSF_COLLECTORS_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/csf/events.h b/src/test/csf/events.h index 37d1b4b0bd7..2209a10f60c 100644 --- a/src/test/csf/events.h +++ b/src/test/csf/events.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_EVENTS_H_INCLUDED #define RIPPLE_TEST_CSF_EVENTS_H_INCLUDED @@ -23,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/csf/impl/Sim.cpp b/src/test/csf/impl/Sim.cpp index 8f78ad92331..6cc950180cd 100644 --- a/src/test/csf/impl/Sim.cpp +++ b/src/test/csf/impl/Sim.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include namespace ripple { diff --git a/src/test/csf/impl/ledgers.cpp b/src/test/csf/impl/ledgers.cpp index 775ec2e58b1..74be491b39d 100644 --- a/src/test/csf/impl/ledgers.cpp +++ b/src/test/csf/impl/ledgers.cpp @@ -16,10 +16,10 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include -#include +#include namespace ripple { namespace test { diff --git a/src/test/csf/ledgers.h b/src/test/csf/ledgers.h index 1c8d4eb54c6..a02adb9c879 100644 --- a/src/test/csf/ledgers.h +++ b/src/test/csf/ledgers.h @@ -16,17 +16,22 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #define RIPPLE_TEST_CSF_LEDGERS_H_INCLUDED #include + #include + #include #include #include #include #include + #include + #include #include diff --git a/src/test/csf/submitters.h b/src/test/csf/submitters.h index 35752de89bd..2680c097121 100644 --- a/src/test/csf/submitters.h +++ b/src/test/csf/submitters.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED #define RIPPLE_TEST_CSF_SUBMITTERS_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include + #include + namespace ripple { namespace test { namespace csf { diff --git a/src/test/csf/timers.h b/src/test/csf/timers.h index 7e5d88c6696..94b421e4b4d 100644 --- a/src/test/csf/timers.h +++ b/src/test/csf/timers.h @@ -16,11 +16,13 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #define RIPPLE_TEST_CSF_TIMERS_H_INCLUDED #include #include + #include #include diff --git a/src/test/json/Object_test.cpp b/src/test/json/Object_test.cpp index 4a64d6538a3..94a9e96cf68 100644 --- a/src/test/json/Object_test.cpp +++ b/src/test/json/Object_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/Output_test.cpp b/src/test/json/Output_test.cpp index ddc5f08992b..2343843fe3d 100644 --- a/src/test/json/Output_test.cpp +++ b/src/test/json/Output_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/json/TestOutputSuite.h b/src/test/json/TestOutputSuite.h index a4f36dac4ee..44992df64bb 100644 --- a/src/test/json/TestOutputSuite.h +++ b/src/test/json/TestOutputSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_TESTOUTPUTSUITE_H_INCLUDED #include + #include #include diff --git a/src/test/json/Writer_test.cpp b/src/test/json/Writer_test.cpp index 97d4297c926..c5305876ffb 100644 --- a/src/test/json/Writer_test.cpp +++ b/src/test/json/Writer_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace Json { diff --git a/src/test/json/json_value_test.cpp b/src/test/json/json_value_test.cpp index dacc22cc014..0858786f047 100644 --- a/src/test/json/json_value_test.cpp +++ b/src/test/json/json_value_test.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include #include #include #include diff --git a/src/test/jtx.h b/src/test/jtx.h index f3c69ce33c3..6b73ca63eca 100644 --- a/src/test/jtx.h +++ b/src/test/jtx.h @@ -69,6 +69,7 @@ #include #include #include + #include #endif diff --git a/src/test/jtx/AMM.h b/src/test/jtx/AMM.h index 52039f74aea..71e2e5f34cb 100644 --- a/src/test/jtx/AMM.h +++ b/src/test/jtx/AMM.h @@ -25,7 +25,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/jtx/AMMTest.h b/src/test/jtx/AMMTest.h index 0481dc98a49..5ff2d21a192 100644 --- a/src/test/jtx/AMMTest.h +++ b/src/test/jtx/AMMTest.h @@ -16,12 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #define RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED #include #include #include + #include #include diff --git a/src/test/jtx/Account.h b/src/test/jtx/Account.h index f49070dff03..d91bb4a383e 100644 --- a/src/test/jtx/Account.h +++ b/src/test/jtx/Account.h @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/test/jtx/CaptureLogs.h b/src/test/jtx/CaptureLogs.h index ddb04cb3ff7..a8afb521c38 100644 --- a/src/test/jtx/CaptureLogs.h +++ b/src/test/jtx/CaptureLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CAPTURELOGS_H_INCLUDED + #include namespace ripple { @@ -92,3 +95,5 @@ class CaptureLogs : public Logs } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/CheckMessageLogs.h b/src/test/jtx/CheckMessageLogs.h index e51b84b1c04..fd3915440e1 100644 --- a/src/test/jtx/CheckMessageLogs.h +++ b/src/test/jtx/CheckMessageLogs.h @@ -17,6 +17,9 @@ */ //============================================================================== +#ifndef RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED +#define RIPPLE_TEST_JTX_CHECKMESSAGELOGS_H_INCLUDED + #include namespace ripple { @@ -80,3 +83,5 @@ class CheckMessageLogs : public Logs } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/Env.h b/src/test/jtx/Env.h index 66845ae91dc..4e8bb64f59c 100644 --- a/src/test/jtx/Env.h +++ b/src/test/jtx/Env.h @@ -29,12 +29,14 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include @@ -46,6 +48,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/Env_test.cpp b/src/test/jtx/Env_test.cpp index 691f96c2591..622efe297d0 100644 --- a/src/test/jtx/Env_test.cpp +++ b/src/test/jtx/Env_test.cpp @@ -18,16 +18,18 @@ //============================================================================== #include + #include #include + #include #include -#include #include #include #include #include + #include #include diff --git a/src/test/jtx/JSONRPCClient.h b/src/test/jtx/JSONRPCClient.h index bbffc726694..3765893eb7f 100644 --- a/src/test/jtx/JSONRPCClient.h +++ b/src/test/jtx/JSONRPCClient.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_HTTPCLIENT_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/JTx.h b/src/test/jtx/JTx.h index 81ba1b406a0..198839dd28b 100644 --- a/src/test/jtx/JTx.h +++ b/src/test/jtx/JTx.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/test/jtx/ManualTimeKeeper.h b/src/test/jtx/ManualTimeKeeper.h index 86477bf99f6..c9bf4d4763a 100644 --- a/src/test/jtx/ManualTimeKeeper.h +++ b/src/test/jtx/ManualTimeKeeper.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_MANUALTIMEKEEPER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/Oracle.h b/src/test/jtx/Oracle.h index 32ec0b2e859..9d2554c18f6 100644 --- a/src/test/jtx/Oracle.h +++ b/src/test/jtx/Oracle.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_ORACLE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/PathSet.h b/src/test/jtx/PathSet.h index 0f4c4ddd3dd..df9de540a12 100644 --- a/src/test/jtx/PathSet.h +++ b/src/test/jtx/PathSet.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_TESTS_PATHSET_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 262c6ebeb8f..16bb966317d 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #define RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/TestSuite.h b/src/test/jtx/TestSuite.h index 22b8fb7e53b..d54439d846d 100644 --- a/src/test/jtx/TestSuite.h +++ b/src/test/jtx/TestSuite.h @@ -21,6 +21,7 @@ #define RIPPLE_BASICS_TESTSUITE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/TrustedPublisherServer.h b/src/test/jtx/TrustedPublisherServer.h index b786cae2846..61386734841 100644 --- a/src/test/jtx/TrustedPublisherServer.h +++ b/src/test/jtx/TrustedPublisherServer.h @@ -16,16 +16,19 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #define RIPPLE_TEST_TRUSTED_PUBLISHER_SERVER_H_INCLUDED #include + #include #include #include #include #include #include + #include #include #include diff --git a/src/test/jtx/WSClient.h b/src/test/jtx/WSClient.h index d0356dbcbf7..8a479f97c3f 100644 --- a/src/test/jtx/WSClient.h +++ b/src/test/jtx/WSClient.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_WSCLIENT_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/WSClient_test.cpp b/src/test/jtx/WSClient_test.cpp index 18dadb0bf9a..471e6ff31be 100644 --- a/src/test/jtx/WSClient_test.cpp +++ b/src/test/jtx/WSClient_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/amount.h b/src/test/jtx/amount.h index 9990c77c38c..589347b12c4 100644 --- a/src/test/jtx/amount.h +++ b/src/test/jtx/amount.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include #include diff --git a/src/test/jtx/credentials.h b/src/test/jtx/credentials.h index 2f5c63dccb8..9161b7241d0 100644 --- a/src/test/jtx/credentials.h +++ b/src/test/jtx/credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TEST_JTX_CREDENTIALS_H_INCLUDED #include #include @@ -97,8 +98,8 @@ Json::Value ledgerEntry(jtx::Env& env, std::string const& credIdx); } // namespace credentials - } // namespace jtx - } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/delivermin.h b/src/test/jtx/delivermin.h index 46e633dab20..f8b0da2c192 100644 --- a/src/test/jtx/delivermin.h +++ b/src/test/jtx/delivermin.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_DELIVERMIN_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/fee.h b/src/test/jtx/fee.h index 4e29fad1521..7d54804f87f 100644 --- a/src/test/jtx/fee.h +++ b/src/test/jtx/fee.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/test/jtx/flags.h b/src/test/jtx/flags.h index c8887cdee4b..b5e82078034 100644 --- a/src/test/jtx/flags.h +++ b/src/test/jtx/flags.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_FLAGS_H_INCLUDED #include + #include #include #include diff --git a/src/test/jtx/impl/AMM.cpp b/src/test/jtx/impl/AMM.cpp index 089d3508d70..3482e7e8671 100644 --- a/src/test/jtx/impl/AMM.cpp +++ b/src/test/jtx/impl/AMM.cpp @@ -18,10 +18,11 @@ //============================================================================== #include - #include + #include #include + #include #include #include diff --git a/src/test/jtx/impl/AMMTest.cpp b/src/test/jtx/impl/AMMTest.cpp index 575e2e1d889..8555be01a9b 100644 --- a/src/test/jtx/impl/AMMTest.cpp +++ b/src/test/jtx/impl/AMMTest.cpp @@ -17,13 +17,14 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include + #include #include diff --git a/src/test/jtx/impl/Account.cpp b/src/test/jtx/impl/Account.cpp index 9d41456ef75..b61048e66f2 100644 --- a/src/test/jtx/impl/Account.cpp +++ b/src/test/jtx/impl/Account.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Env.cpp b/src/test/jtx/impl/Env.cpp index 43286ab7824..e006f268cf8 100644 --- a/src/test/jtx/impl/Env.cpp +++ b/src/test/jtx/impl/Env.cpp @@ -23,31 +23,27 @@ #include #include #include -#include #include #include #include #include + #include #include -#include -#include #include #include + #include #include #include #include -#include -#include #include -#include #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/JSONRPCClient.cpp b/src/test/jtx/impl/JSONRPCClient.cpp index 19c20b5babe..4db13c95fdf 100644 --- a/src/test/jtx/impl/JSONRPCClient.cpp +++ b/src/test/jtx/impl/JSONRPCClient.cpp @@ -16,17 +16,21 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include #include + #include #include #include #include #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/Oracle.cpp b/src/test/jtx/impl/Oracle.cpp index df9483cbaae..721a1c299db 100644 --- a/src/test/jtx/impl/Oracle.cpp +++ b/src/test/jtx/impl/Oracle.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include @@ -377,4 +377,4 @@ validDocumentID(AnyValue const& v) } // namespace oracle } // namespace jtx } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/jtx/impl/TestHelpers.cpp b/src/test/jtx/impl/TestHelpers.cpp index 3bf69729ab0..e5b136e9c08 100644 --- a/src/test/jtx/impl/TestHelpers.cpp +++ b/src/test/jtx/impl/TestHelpers.cpp @@ -18,9 +18,9 @@ //============================================================================== #include - #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/WSClient.cpp b/src/test/jtx/impl/WSClient.cpp index 03e2b2d6086..20cca3179ad 100644 --- a/src/test/jtx/impl/WSClient.cpp +++ b/src/test/jtx/impl/WSClient.cpp @@ -19,21 +19,19 @@ #include #include + #include #include #include #include + #include #include -#include +#include #include #include -#include - -#include - namespace ripple { namespace test { diff --git a/src/test/jtx/impl/acctdelete.cpp b/src/test/jtx/impl/acctdelete.cpp index d7f8f10e04d..842eea7fc2e 100644 --- a/src/test/jtx/impl/acctdelete.cpp +++ b/src/test/jtx/impl/acctdelete.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/amount.cpp b/src/test/jtx/impl/amount.cpp index 5be53dc0a95..9134122da91 100644 --- a/src/test/jtx/impl/amount.cpp +++ b/src/test/jtx/impl/amount.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/jtx/impl/attester.cpp b/src/test/jtx/impl/attester.cpp index 66be9da83b3..91abfc459ba 100644 --- a/src/test/jtx/impl/attester.cpp +++ b/src/test/jtx/impl/attester.cpp @@ -21,7 +21,6 @@ #include #include -#include #include #include diff --git a/src/test/jtx/impl/check.cpp b/src/test/jtx/impl/check.cpp index 21af6c9cc3f..f5aa76658c3 100644 --- a/src/test/jtx/impl/check.cpp +++ b/src/test/jtx/impl/check.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/credentials.cpp b/src/test/jtx/impl/credentials.cpp index bc7ccf93cd4..f29bc45e208 100644 --- a/src/test/jtx/impl/credentials.cpp +++ b/src/test/jtx/impl/credentials.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/delivermin.cpp b/src/test/jtx/impl/delivermin.cpp index 6e4838c7c0a..fe9f4e8fe65 100644 --- a/src/test/jtx/impl/delivermin.cpp +++ b/src/test/jtx/impl/delivermin.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/deposit.cpp b/src/test/jtx/impl/deposit.cpp index d91607c9906..5f4ae6bdb39 100644 --- a/src/test/jtx/impl/deposit.cpp +++ b/src/test/jtx/impl/deposit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/did.cpp b/src/test/jtx/impl/did.cpp index a9a6e974ef4..67a523403c9 100644 --- a/src/test/jtx/impl/did.cpp +++ b/src/test/jtx/impl/did.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index fd4949d5a44..b94c79ccb85 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -17,9 +17,9 @@ */ //============================================================================== +#include #include -#include #include namespace ripple { diff --git a/src/test/jtx/impl/fee.cpp b/src/test/jtx/impl/fee.cpp index e390136a3c0..71e3dd089a6 100644 --- a/src/test/jtx/impl/fee.cpp +++ b/src/test/jtx/impl/fee.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/flags.cpp b/src/test/jtx/impl/flags.cpp index 6658d3eba9b..a6ddfc1d717 100644 --- a/src/test/jtx/impl/flags.cpp +++ b/src/test/jtx/impl/flags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/jtx_json.cpp b/src/test/jtx/impl/jtx_json.cpp index c9cf6636cf9..b76ad2ef0c6 100644 --- a/src/test/jtx/impl/jtx_json.cpp +++ b/src/test/jtx/impl/jtx_json.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/last_ledger_sequence.cpp b/src/test/jtx/impl/last_ledger_sequence.cpp index 57742bab2a1..4b4368429f9 100644 --- a/src/test/jtx/impl/last_ledger_sequence.cpp +++ b/src/test/jtx/impl/last_ledger_sequence.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ledgerStateFix.cpp b/src/test/jtx/impl/ledgerStateFix.cpp index 2f121dc2671..8c780691913 100644 --- a/src/test/jtx/impl/ledgerStateFix.cpp +++ b/src/test/jtx/impl/ledgerStateFix.cpp @@ -20,6 +20,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/memo.cpp b/src/test/jtx/impl/memo.cpp index 6469748b4f9..1214ec2a2c9 100644 --- a/src/test/jtx/impl/memo.cpp +++ b/src/test/jtx/impl/memo.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/multisign.cpp b/src/test/jtx/impl/multisign.cpp index 42c3bfc78bf..a802528247e 100644 --- a/src/test/jtx/impl/multisign.cpp +++ b/src/test/jtx/impl/multisign.cpp @@ -19,13 +19,12 @@ #include #include + #include -#include #include -#include #include + #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/offer.cpp b/src/test/jtx/impl/offer.cpp index 55a1af4beab..f48c0f2d21d 100644 --- a/src/test/jtx/impl/offer.cpp +++ b/src/test/jtx/impl/offer.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/paths.cpp b/src/test/jtx/impl/paths.cpp index 393e36e9d61..2a45909eb91 100644 --- a/src/test/jtx/impl/paths.cpp +++ b/src/test/jtx/impl/paths.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/jtx/impl/pay.cpp b/src/test/jtx/impl/pay.cpp index 2a627223fdd..82fe910e9b9 100644 --- a/src/test/jtx/impl/pay.cpp +++ b/src/test/jtx/impl/pay.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/permissioned_domains.cpp b/src/test/jtx/impl/permissioned_domains.cpp index 9cdf7c664f2..866ca3bb7e7 100644 --- a/src/test/jtx/impl/permissioned_domains.cpp +++ b/src/test/jtx/impl/permissioned_domains.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/quality2.cpp b/src/test/jtx/impl/quality2.cpp index dd10b3c6117..46f36cb6d63 100644 --- a/src/test/jtx/impl/quality2.cpp +++ b/src/test/jtx/impl/quality2.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/jtx/impl/rate.cpp b/src/test/jtx/impl/rate.cpp index f95170537f3..0526cdc28fc 100644 --- a/src/test/jtx/impl/rate.cpp +++ b/src/test/jtx/impl/rate.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/regkey.cpp b/src/test/jtx/impl/regkey.cpp index 9fc260d2d03..cff2de3e8ed 100644 --- a/src/test/jtx/impl/regkey.cpp +++ b/src/test/jtx/impl/regkey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/sendmax.cpp b/src/test/jtx/impl/sendmax.cpp index 9514b923166..168ce4659d9 100644 --- a/src/test/jtx/impl/sendmax.cpp +++ b/src/test/jtx/impl/sendmax.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/seq.cpp b/src/test/jtx/impl/seq.cpp index 3a3de002db6..82f0e98b4c9 100644 --- a/src/test/jtx/impl/seq.cpp +++ b/src/test/jtx/impl/seq.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/tag.cpp b/src/test/jtx/impl/tag.cpp index be456a1e0e8..9a8c491da23 100644 --- a/src/test/jtx/impl/tag.cpp +++ b/src/test/jtx/impl/tag.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/ticket.cpp b/src/test/jtx/impl/ticket.cpp index 69bcab4d9f1..ef1ffd416bc 100644 --- a/src/test/jtx/impl/ticket.cpp +++ b/src/test/jtx/impl/ticket.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/token.cpp b/src/test/jtx/impl/token.cpp index 49f473fcd82..bea974a016d 100644 --- a/src/test/jtx/impl/token.cpp +++ b/src/test/jtx/impl/token.cpp @@ -21,6 +21,7 @@ #include #include + #include #include diff --git a/src/test/jtx/impl/trust.cpp b/src/test/jtx/impl/trust.cpp index dee4b282367..5e9eadca8de 100644 --- a/src/test/jtx/impl/trust.cpp +++ b/src/test/jtx/impl/trust.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/impl/txflags.cpp b/src/test/jtx/impl/txflags.cpp index 7bc59876a99..77c46f35b38 100644 --- a/src/test/jtx/impl/txflags.cpp +++ b/src/test/jtx/impl/txflags.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/jtx/impl/utility.cpp b/src/test/jtx/impl/utility.cpp index c10fb918540..afa7ee8f352 100644 --- a/src/test/jtx/impl/utility.cpp +++ b/src/test/jtx/impl/utility.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include #include @@ -27,7 +29,6 @@ #include #include #include -#include namespace ripple { namespace test { diff --git a/src/test/jtx/impl/xchain_bridge.cpp b/src/test/jtx/impl/xchain_bridge.cpp index 43b0e7c2f96..c63734ee8f9 100644 --- a/src/test/jtx/impl/xchain_bridge.cpp +++ b/src/test/jtx/impl/xchain_bridge.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include #include +#include + #include #include #include diff --git a/src/test/jtx/jtx_json.h b/src/test/jtx/jtx_json.h index 837d6524766..47f5a3c223c 100644 --- a/src/test/jtx/jtx_json.h +++ b/src/test/jtx/jtx_json.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_JSON_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/multisign.h b/src/test/jtx/multisign.h index 44cee17b7bf..6bcb1a671c1 100644 --- a/src/test/jtx/multisign.h +++ b/src/test/jtx/multisign.h @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/test/jtx/offer.h b/src/test/jtx/offer.h index 3951f4f934a..260b734ddd2 100644 --- a/src/test/jtx/offer.h +++ b/src/test/jtx/offer.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_OFFER_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/owners.h b/src/test/jtx/owners.h index 2299af2d7f3..fc904f9e870 100644 --- a/src/test/jtx/owners.h +++ b/src/test/jtx/owners.h @@ -21,9 +21,12 @@ #define RIPPLE_TEST_JTX_OWNERS_H_INCLUDED #include + #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/paths.h b/src/test/jtx/paths.h index cc9caf3af72..d1d5f5849af 100644 --- a/src/test/jtx/paths.h +++ b/src/test/jtx/paths.h @@ -21,7 +21,9 @@ #define RIPPLE_TEST_JTX_PATHS_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/test/jtx/pay.h b/src/test/jtx/pay.h index 6294b5b3082..f9d8822f533 100644 --- a/src/test/jtx/pay.h +++ b/src/test/jtx/pay.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/permissioned_domains.h b/src/test/jtx/permissioned_domains.h index 49b420d3d20..ee80c6a69f5 100644 --- a/src/test/jtx/permissioned_domains.h +++ b/src/test/jtx/permissioned_domains.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED +#define RIPPLE_TEST_JTX_PERMISSIONED_DOMAINS_H_INCLUDED #include #include @@ -69,3 +70,5 @@ getNewDomain(std::shared_ptr const& meta); } // namespace jtx } // namespace test } // namespace ripple + +#endif diff --git a/src/test/jtx/prop.h b/src/test/jtx/prop.h index 8dc5f21917d..70498074d6d 100644 --- a/src/test/jtx/prop.h +++ b/src/test/jtx/prop.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_PROP_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/rate.h b/src/test/jtx/rate.h index 0f8186accfc..6fb8c9a8e9d 100644 --- a/src/test/jtx/rate.h +++ b/src/test/jtx/rate.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RATE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/regkey.h b/src/test/jtx/regkey.h index 7d021e4f277..ce87c9b2598 100644 --- a/src/test/jtx/regkey.h +++ b/src/test/jtx/regkey.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/jtx/require.h b/src/test/jtx/require.h index 271419e51b9..bec21235a62 100644 --- a/src/test/jtx/require.h +++ b/src/test/jtx/require.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_REQUIRE_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/rpc.h b/src/test/jtx/rpc.h index f9962849698..be9ce22bf71 100644 --- a/src/test/jtx/rpc.h +++ b/src/test/jtx/rpc.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_RPC_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/sendmax.h b/src/test/jtx/sendmax.h index 495c61c33b8..54a1c25e2fb 100644 --- a/src/test/jtx/sendmax.h +++ b/src/test/jtx/sendmax.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_SENDMAX_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/ter.h b/src/test/jtx/ter.h index d75d9f09d06..ab37275badf 100644 --- a/src/test/jtx/ter.h +++ b/src/test/jtx/ter.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/test/jtx/trust.h b/src/test/jtx/trust.h index 0d02c6e76c4..5f0cebcbeff 100644 --- a/src/test/jtx/trust.h +++ b/src/test/jtx/trust.h @@ -21,6 +21,7 @@ #define RIPPLE_TEST_JTX_TRUST_H_INCLUDED #include + #include #include diff --git a/src/test/jtx/utility.h b/src/test/jtx/utility.h index 6d34452cdf8..2c21fbd3ff9 100644 --- a/src/test/jtx/utility.h +++ b/src/test/jtx/utility.h @@ -21,10 +21,13 @@ #define RIPPLE_TEST_JTX_UTILITY_H_INCLUDED #include + #include #include + #include #include + #include namespace ripple { diff --git a/src/test/jtx/xchain_bridge.h b/src/test/jtx/xchain_bridge.h index 9968317c8de..8ff19bd508d 100644 --- a/src/test/jtx/xchain_bridge.h +++ b/src/test/jtx/xchain_bridge.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/ledger/BookDirs_test.cpp b/src/test/ledger/BookDirs_test.cpp index b50f4381f48..19a1b5d2725 100644 --- a/src/test/ledger/BookDirs_test.cpp +++ b/src/test/ledger/BookDirs_test.cpp @@ -16,7 +16,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/ledger/Directory_test.cpp b/src/test/ledger/Directory_test.cpp index bea394f2f36..825d7ff340f 100644 --- a/src/test/ledger/Directory_test.cpp +++ b/src/test/ledger/Directory_test.cpp @@ -16,12 +16,15 @@ //============================================================================== #include + #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/ledger/Invariants_test.cpp b/src/test/ledger/Invariants_test.cpp index ecf1c8e3979..18b037cbbe0 100644 --- a/src/test/ledger/Invariants_test.cpp +++ b/src/test/ledger/Invariants_test.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include #include #include diff --git a/src/test/ledger/PaymentSandbox_test.cpp b/src/test/ledger/PaymentSandbox_test.cpp index dd9b5c5d88b..303e700f404 100644 --- a/src/test/ledger/PaymentSandbox_test.cpp +++ b/src/test/ledger/PaymentSandbox_test.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/test/ledger/PendingSaves_test.cpp b/src/test/ledger/PendingSaves_test.cpp index 1bd42a64a60..e2a43eb5852 100644 --- a/src/test/ledger/PendingSaves_test.cpp +++ b/src/test/ledger/PendingSaves_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/ledger/SkipList_test.cpp b/src/test/ledger/SkipList_test.cpp index 3e8987a806a..c2088d77cf7 100644 --- a/src/test/ledger/SkipList_test.cpp +++ b/src/test/ledger/SkipList_test.cpp @@ -17,10 +17,11 @@ */ //============================================================================== -#include +#include + #include #include -#include + #include namespace ripple { diff --git a/src/test/ledger/View_test.cpp b/src/test/ledger/View_test.cpp index fc9dce7de79..a9af8e2a403 100644 --- a/src/test/ledger/View_test.cpp +++ b/src/test/ledger/View_test.cpp @@ -18,14 +18,16 @@ //============================================================================== #include + #include #include #include #include #include #include + #include -#include + #include namespace ripple { diff --git a/src/test/nodestore/Backend_test.cpp b/src/test/nodestore/Backend_test.cpp index dc1fe8c7fe2..488370fbe97 100644 --- a/src/test/nodestore/Backend_test.cpp +++ b/src/test/nodestore/Backend_test.cpp @@ -19,10 +19,14 @@ #include #include + #include #include #include + +#include #include + #include namespace ripple { diff --git a/src/test/nodestore/Basics_test.cpp b/src/test/nodestore/Basics_test.cpp index aa423e7dc03..62a66c9dce0 100644 --- a/src/test/nodestore/Basics_test.cpp +++ b/src/test/nodestore/Basics_test.cpp @@ -18,8 +18,7 @@ //============================================================================== #include -#include -#include + #include #include diff --git a/src/test/nodestore/Database_test.cpp b/src/test/nodestore/Database_test.cpp index 59557f3c79f..bbf6381ee50 100644 --- a/src/test/nodestore/Database_test.cpp +++ b/src/test/nodestore/Database_test.cpp @@ -22,9 +22,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/nodestore/TestBase.h b/src/test/nodestore/TestBase.h index 98608c5fb11..634f2bf0051 100644 --- a/src/test/nodestore/TestBase.h +++ b/src/test/nodestore/TestBase.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include #include + #include + #include namespace ripple { diff --git a/src/test/nodestore/Timing_test.cpp b/src/test/nodestore/Timing_test.cpp index 73789c02449..3df18eee66a 100644 --- a/src/test/nodestore/Timing_test.cpp +++ b/src/test/nodestore/Timing_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include @@ -29,16 +30,16 @@ #include #include #include + #include + #include #include #include #include -#include #include #include #include -#include #include #include diff --git a/src/test/nodestore/import_test.cpp b/src/test/nodestore/import_test.cpp index e13fe9c0c8d..d7865a20fc0 100644 --- a/src/test/nodestore/import_test.cpp +++ b/src/test/nodestore/import_test.cpp @@ -18,24 +18,27 @@ //============================================================================== #include +#include + #include #include #include #include #include + #include #include + +#include +#include +#include + #include #include #include #include -#include -#include -#include #include -#include - /* Math: diff --git a/src/test/nodestore/varint_test.cpp b/src/test/nodestore/varint_test.cpp index da7ae9d2858..4f6d3c141cc 100644 --- a/src/test/nodestore/varint_test.cpp +++ b/src/test/nodestore/varint_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/overlay/ProtocolVersion_test.cpp b/src/test/overlay/ProtocolVersion_test.cpp index dfc0ee70b8e..da976f89011 100644 --- a/src/test/overlay/ProtocolVersion_test.cpp +++ b/src/test/overlay/ProtocolVersion_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/overlay/cluster_test.cpp b/src/test/overlay/cluster_test.cpp index d22674d28c6..76bbc9d4e32 100644 --- a/src/test/overlay/cluster_test.cpp +++ b/src/test/overlay/cluster_test.cpp @@ -19,8 +19,9 @@ #include #include + #include -#include + #include #include diff --git a/src/test/overlay/compression_test.cpp b/src/test/overlay/compression_test.cpp index 19669efc23f..76c38fd59b2 100644 --- a/src/test/overlay/compression_test.cpp +++ b/src/test/overlay/compression_test.cpp @@ -22,15 +22,16 @@ #include #include #include + #include #include -#include #include #include #include #include #include #include + #include #include #include @@ -41,9 +42,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/test/overlay/handshake_test.cpp b/src/test/overlay/handshake_test.cpp index 93038e522a4..2d5155aaee6 100644 --- a/src/test/overlay/handshake_test.cpp +++ b/src/test/overlay/handshake_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -61,4 +62,4 @@ class handshake_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(handshake, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index e0edae54897..9fc105262b4 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -16,11 +16,15 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include #include +#include #include + #include #include #include diff --git a/src/test/overlay/short_read_test.cpp b/src/test/overlay/short_read_test.cpp index 0efc49b84e3..739d7ea954d 100644 --- a/src/test/overlay/short_read_test.cpp +++ b/src/test/overlay/short_read_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,9 +27,7 @@ #include #include -#include #include -#include #include #include #include diff --git a/src/test/overlay/tx_reduce_relay_test.cpp b/src/test/overlay/tx_reduce_relay_test.cpp index 3d6c2a4d1ef..07ff2bb14ad 100644 --- a/src/test/overlay/tx_reduce_relay_test.cpp +++ b/src/test/overlay/tx_reduce_relay_test.cpp @@ -16,11 +16,14 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include #include + #include #include @@ -283,4 +286,4 @@ class tx_reduce_relay_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(tx_reduce_relay, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/peerfinder/Livecache_test.cpp b/src/test/peerfinder/Livecache_test.cpp index 7fb9f02f42a..a150f02f05d 100644 --- a/src/test/peerfinder/Livecache_test.cpp +++ b/src/test/peerfinder/Livecache_test.cpp @@ -19,11 +19,13 @@ #include #include + #include + #include -#include #include #include + #include namespace ripple { diff --git a/src/test/peerfinder/PeerFinder_test.cpp b/src/test/peerfinder/PeerFinder_test.cpp index a1cb8d7408d..9006b8c1c7f 100644 --- a/src/test/peerfinder/PeerFinder_test.cpp +++ b/src/test/peerfinder/PeerFinder_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/test/protocol/ApiVersion_test.cpp b/src/test/protocol/ApiVersion_test.cpp index 7d634dc569d..2dc4f4d6bb0 100644 --- a/src/test/protocol/ApiVersion_test.cpp +++ b/src/test/protocol/ApiVersion_test.cpp @@ -19,7 +19,6 @@ #include #include -#include #include #include diff --git a/src/test/protocol/Hooks_test.cpp b/src/test/protocol/Hooks_test.cpp index fb61d10a739..0637b52efab 100644 --- a/src/test/protocol/Hooks_test.cpp +++ b/src/test/protocol/Hooks_test.cpp @@ -18,8 +18,9 @@ //============================================================================== #include + #include -#include + #include #include diff --git a/src/test/protocol/InnerObjectFormats_test.cpp b/src/test/protocol/InnerObjectFormats_test.cpp index cfc8d123c22..f4d9722392c 100644 --- a/src/test/protocol/InnerObjectFormats_test.cpp +++ b/src/test/protocol/InnerObjectFormats_test.cpp @@ -18,11 +18,11 @@ //============================================================================== #include + #include #include -#include // Json::Reader -#include // RPC::containsError -#include +#include // Json::Reader +#include // RPC::containsError #include // STParsedJSONObject namespace ripple { diff --git a/src/test/protocol/Issue_test.cpp b/src/test/protocol/Issue_test.cpp index 7ec1507e04b..53ebf5be245 100644 --- a/src/test/protocol/Issue_test.cpp +++ b/src/test/protocol/Issue_test.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Memo_test.cpp b/src/test/protocol/Memo_test.cpp index bd63e7003ad..a7fa846a4d2 100644 --- a/src/test/protocol/Memo_test.cpp +++ b/src/test/protocol/Memo_test.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/test/protocol/PublicKey_test.cpp b/src/test/protocol/PublicKey_test.cpp index 7fa798d1483..0f5aef261af 100644 --- a/src/test/protocol/PublicKey_test.cpp +++ b/src/test/protocol/PublicKey_test.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/Quality_test.cpp b/src/test/protocol/Quality_test.cpp index 64cf0c71b3a..aa9918a0642 100644 --- a/src/test/protocol/Quality_test.cpp +++ b/src/test/protocol/Quality_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/protocol/STAmount_test.cpp b/src/test/protocol/STAmount_test.cpp index b512c42a643..1836fa85951 100644 --- a/src/test/protocol/STAmount_test.cpp +++ b/src/test/protocol/STAmount_test.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include diff --git a/src/test/protocol/STIssue_test.cpp b/src/test/protocol/STIssue_test.cpp index 4c9eeb0ba1b..6e8d37331b1 100644 --- a/src/test/protocol/STIssue_test.cpp +++ b/src/test/protocol/STIssue_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include @@ -161,4 +162,4 @@ class STIssue_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(STIssue, ripple_data, ripple); } // namespace test -} // namespace ripple \ No newline at end of file +} // namespace ripple diff --git a/src/test/protocol/STObject_test.cpp b/src/test/protocol/STObject_test.cpp index 071a5f4f63c..e02cfeeea40 100644 --- a/src/test/protocol/STObject_test.cpp +++ b/src/test/protocol/STObject_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/protocol/STTx_test.cpp b/src/test/protocol/STTx_test.cpp index 54037eaa5ba..f48bea11aa0 100644 --- a/src/test/protocol/STTx_test.cpp +++ b/src/test/protocol/STTx_test.cpp @@ -26,9 +26,8 @@ #include #include #include -#include #include -#include + #include namespace ripple { diff --git a/src/test/protocol/STValidation_test.cpp b/src/test/protocol/STValidation_test.cpp index 8efb5847488..784fc43c24a 100644 --- a/src/test/protocol/STValidation_test.cpp +++ b/src/test/protocol/STValidation_test.cpp @@ -18,14 +18,10 @@ //============================================================================== #include -#include + #include #include #include -#include -#include -#include -#include #include #include diff --git a/src/test/protocol/SecretKey_test.cpp b/src/test/protocol/SecretKey_test.cpp index bce89bce734..248be5a0da0 100644 --- a/src/test/protocol/SecretKey_test.cpp +++ b/src/test/protocol/SecretKey_test.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/test/protocol/Seed_test.cpp b/src/test/protocol/Seed_test.cpp index 3619e84541e..0b89eb22a76 100644 --- a/src/test/protocol/Seed_test.cpp +++ b/src/test/protocol/Seed_test.cpp @@ -20,10 +20,10 @@ #include #include #include -#include #include #include #include + #include namespace ripple { diff --git a/src/test/protocol/SeqProxy_test.cpp b/src/test/protocol/SeqProxy_test.cpp index 5e44bca5b40..7a660c10d23 100644 --- a/src/test/protocol/SeqProxy_test.cpp +++ b/src/test/protocol/SeqProxy_test.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/test/resource/Logic_test.cpp b/src/test/resource/Logic_test.cpp index b445890c326..49326e7dc5b 100644 --- a/src/test/resource/Logic_test.cpp +++ b/src/test/resource/Logic_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include @@ -26,6 +27,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/AMMInfo_test.cpp b/src/test/rpc/AMMInfo_test.cpp index c1e059a3ead..a0985ea1044 100644 --- a/src/test/rpc/AMMInfo_test.cpp +++ b/src/test/rpc/AMMInfo_test.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include diff --git a/src/test/rpc/AccountCurrencies_test.cpp b/src/test/rpc/AccountCurrencies_test.cpp index 7d16ca48a93..3ccb89c471f 100644 --- a/src/test/rpc/AccountCurrencies_test.cpp +++ b/src/test/rpc/AccountCurrencies_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/AccountInfo_test.cpp b/src/test/rpc/AccountInfo_test.cpp index cb9712aef56..238b7396118 100644 --- a/src/test/rpc/AccountInfo_test.cpp +++ b/src/test/rpc/AccountInfo_test.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include -#include - #include #include -#include -#include -#include + +#include +#include namespace ripple { namespace test { diff --git a/src/test/rpc/AccountLines_test.cpp b/src/test/rpc/AccountLines_test.cpp index bae00d7a769..6e6f0def199 100644 --- a/src/test/rpc/AccountLines_test.cpp +++ b/src/test/rpc/AccountLines_test.cpp @@ -18,13 +18,13 @@ //============================================================================== #include + #include #include #include #include namespace ripple { - namespace RPC { class AccountLines_test : public beast::unit_test::suite @@ -250,6 +250,10 @@ class AccountLines_test : public beast::unit_test::suite gw1.human() + R"("})"); BEAST_EXPECT(lines[jss::result][jss::lines].isArray()); BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26); + + // Check no ripple is not set for trustlines between alice and gw1 + auto const& line = lines[jss::result][jss::lines][0u]; + BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple)); } { // Use a malformed peer. diff --git a/src/test/rpc/AccountObjects_test.cpp b/src/test/rpc/AccountObjects_test.cpp index 232a091114c..b723095aeb5 100644 --- a/src/test/rpc/AccountObjects_test.cpp +++ b/src/test/rpc/AccountObjects_test.cpp @@ -20,7 +20,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/test/rpc/AccountOffers_test.cpp b/src/test/rpc/AccountOffers_test.cpp index da6acc97e98..2aa85ac9b99 100644 --- a/src/test/rpc/AccountOffers_test.cpp +++ b/src/test/rpc/AccountOffers_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/AccountSet_test.cpp b/src/test/rpc/AccountSet_test.cpp index 3c6cad00e28..7bca51ae96f 100644 --- a/src/test/rpc/AccountSet_test.cpp +++ b/src/test/rpc/AccountSet_test.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index f6a9225ec48..f10b5b83870 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/AmendmentBlocked_test.cpp b/src/test/rpc/AmendmentBlocked_test.cpp index 196ce0e463d..bea9cdf57d1 100644 --- a/src/test/rpc/AmendmentBlocked_test.cpp +++ b/src/test/rpc/AmendmentBlocked_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/test/rpc/Book_test.cpp b/src/test/rpc/Book_test.cpp index 6bcc0c20809..79e3f940f82 100644 --- a/src/test/rpc/Book_test.cpp +++ b/src/test/rpc/Book_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/Connect_test.cpp b/src/test/rpc/Connect_test.cpp index 8f3fe26adbf..cc021ba08fb 100644 --- a/src/test/rpc/Connect_test.cpp +++ b/src/test/rpc/Connect_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/DeliveredAmount_test.cpp b/src/test/rpc/DeliveredAmount_test.cpp index 9ed858e2a33..9a63f248423 100644 --- a/src/test/rpc/DeliveredAmount_test.cpp +++ b/src/test/rpc/DeliveredAmount_test.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include #include namespace ripple { diff --git a/src/test/rpc/DepositAuthorized_test.cpp b/src/test/rpc/DepositAuthorized_test.cpp index 46637d421e1..2ccad9d7799 100644 --- a/src/test/rpc/DepositAuthorized_test.cpp +++ b/src/test/rpc/DepositAuthorized_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/test/rpc/Feature_test.cpp b/src/test/rpc/Feature_test.cpp index 12d4b27745c..bc789f9a748 100644 --- a/src/test/rpc/Feature_test.cpp +++ b/src/test/rpc/Feature_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/GRPCTestClientBase.h b/src/test/rpc/GRPCTestClientBase.h index f8b74ed6d5c..06531ef5522 100644 --- a/src/test/rpc/GRPCTestClientBase.h +++ b/src/test/rpc/GRPCTestClientBase.h @@ -21,7 +21,9 @@ #define RIPPLED_GRPCTESTCLIENTBASE_H #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GatewayBalances_test.cpp b/src/test/rpc/GatewayBalances_test.cpp index 4e847c8dbdd..730d58bcca1 100644 --- a/src/test/rpc/GatewayBalances_test.cpp +++ b/src/test/rpc/GatewayBalances_test.cpp @@ -17,7 +17,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/GetAggregatePrice_test.cpp b/src/test/rpc/GetAggregatePrice_test.cpp index aad3c9be99f..1e09219f57f 100644 --- a/src/test/rpc/GetAggregatePrice_test.cpp +++ b/src/test/rpc/GetAggregatePrice_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/GetCounts_test.cpp b/src/test/rpc/GetCounts_test.cpp index 132ed93d7be..d0b3404781c 100644 --- a/src/test/rpc/GetCounts_test.cpp +++ b/src/test/rpc/GetCounts_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/test/rpc/Handler_test.cpp b/src/test/rpc/Handler_test.cpp index 2c3bfd30d4c..4883cf664f7 100644 --- a/src/test/rpc/Handler_test.cpp +++ b/src/test/rpc/Handler_test.cpp @@ -18,13 +18,14 @@ //============================================================================== #include + #include + #include #include #include #include -#include #include namespace ripple::test { diff --git a/src/test/rpc/JSONRPC_test.cpp b/src/test/rpc/JSONRPC_test.cpp index 6e97301fc3e..03f206707b2 100644 --- a/src/test/rpc/JSONRPC_test.cpp +++ b/src/test/rpc/JSONRPC_test.cpp @@ -19,15 +19,16 @@ #include #include + #include #include #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/test/rpc/KeyGeneration_test.cpp b/src/test/rpc/KeyGeneration_test.cpp index e136bb04beb..07ebd93dd36 100644 --- a/src/test/rpc/KeyGeneration_test.cpp +++ b/src/test/rpc/KeyGeneration_test.cpp @@ -16,9 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include + #include #include + #include #include #include diff --git a/src/test/rpc/LedgerClosed_test.cpp b/src/test/rpc/LedgerClosed_test.cpp index c3f7f900e3c..b0a2216b1f3 100644 --- a/src/test/rpc/LedgerClosed_test.cpp +++ b/src/test/rpc/LedgerClosed_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerData_test.cpp b/src/test/rpc/LedgerData_test.cpp index 1e4f97a935f..b56cb241dd0 100644 --- a/src/test/rpc/LedgerData_test.cpp +++ b/src/test/rpc/LedgerData_test.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/LedgerHeader_test.cpp b/src/test/rpc/LedgerHeader_test.cpp index d8fe738b888..a80f706b6f0 100644 --- a/src/test/rpc/LedgerHeader_test.cpp +++ b/src/test/rpc/LedgerHeader_test.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/test/rpc/LedgerRPC_test.cpp b/src/test/rpc/LedgerRPC_test.cpp index ebc6297fe41..d4fd2fd3920 100644 --- a/src/test/rpc/LedgerRPC_test.cpp +++ b/src/test/rpc/LedgerRPC_test.cpp @@ -22,14 +22,13 @@ #include #include #include -#include + #include -#include + #include #include #include #include -#include #include namespace ripple { @@ -3190,7 +3189,18 @@ class LedgerRPC_test : public beast::unit_test::suite params[jss::permissioned_domain][jss::account] = 1; params[jss::permissioned_domain][jss::seq] = seq; auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); - checkErrorValue(jrr[jss::result], "malformedRequest", ""); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); + } + + { + // Fail, account is an object + Json::Value params; + params[jss::ledger_index] = jss::validated; + params[jss::permissioned_domain][jss::account] = + Json::Value{Json::ValueType::objectValue}; + params[jss::permissioned_domain][jss::seq] = seq; + auto const jrr = env.rpc("json", "ledger_entry", to_string(params)); + checkErrorValue(jrr[jss::result], "malformedAddress", ""); } { diff --git a/src/test/rpc/LedgerRequestRPC_test.cpp b/src/test/rpc/LedgerRequestRPC_test.cpp index 61905c99c18..221f639819e 100644 --- a/src/test/rpc/LedgerRequestRPC_test.cpp +++ b/src/test/rpc/LedgerRequestRPC_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include #include diff --git a/src/test/rpc/ManifestRPC_test.cpp b/src/test/rpc/ManifestRPC_test.cpp index fcf47a5745d..d040ed56325 100644 --- a/src/test/rpc/ManifestRPC_test.cpp +++ b/src/test/rpc/ManifestRPC_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/NoRippleCheck_test.cpp b/src/test/rpc/NoRippleCheck_test.cpp index 4551365029f..6cd566e144a 100644 --- a/src/test/rpc/NoRippleCheck_test.cpp +++ b/src/test/rpc/NoRippleCheck_test.cpp @@ -19,14 +19,16 @@ #include #include + #include #include + #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/NoRipple_test.cpp b/src/test/rpc/NoRipple_test.cpp index aa5e6e1efef..5c41f25128d 100644 --- a/src/test/rpc/NoRipple_test.cpp +++ b/src/test/rpc/NoRipple_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/OwnerInfo_test.cpp b/src/test/rpc/OwnerInfo_test.cpp index 606f2274b88..8d9f9c401f0 100644 --- a/src/test/rpc/OwnerInfo_test.cpp +++ b/src/test/rpc/OwnerInfo_test.cpp @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include diff --git a/src/test/rpc/Peers_test.cpp b/src/test/rpc/Peers_test.cpp index ab9b17b2593..d325da12c32 100644 --- a/src/test/rpc/Peers_test.cpp +++ b/src/test/rpc/Peers_test.cpp @@ -19,9 +19,12 @@ #include #include + #include #include + #include + #include namespace ripple { diff --git a/src/test/rpc/RPCCall_test.cpp b/src/test/rpc/RPCCall_test.cpp index b812740fb3f..8438ef533de 100644 --- a/src/test/rpc/RPCCall_test.cpp +++ b/src/test/rpc/RPCCall_test.cpp @@ -17,8 +17,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/RPCHelpers_test.cpp b/src/test/rpc/RPCHelpers_test.cpp index 11a0ef787d1..531649b8afe 100644 --- a/src/test/rpc/RPCHelpers_test.cpp +++ b/src/test/rpc/RPCHelpers_test.cpp @@ -16,6 +16,7 @@ //============================================================================== #include + #include #include diff --git a/src/test/rpc/RPCOverload_test.cpp b/src/test/rpc/RPCOverload_test.cpp index c3328fb0b28..efe69496fbf 100644 --- a/src/test/rpc/RPCOverload_test.cpp +++ b/src/test/rpc/RPCOverload_test.cpp @@ -18,7 +18,9 @@ #include #include #include + #include + #include #include diff --git a/src/test/rpc/RobustTransaction_test.cpp b/src/test/rpc/RobustTransaction_test.cpp index b0506224f79..ccef6e297e2 100644 --- a/src/test/rpc/RobustTransaction_test.cpp +++ b/src/test/rpc/RobustTransaction_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include diff --git a/src/test/rpc/Roles_test.cpp b/src/test/rpc/Roles_test.cpp index 8cef5dcbc61..5ac86543304 100644 --- a/src/test/rpc/Roles_test.cpp +++ b/src/test/rpc/Roles_test.cpp @@ -19,11 +19,8 @@ #include #include -#include -#include -#include -#include +#include #include #include diff --git a/src/test/rpc/ServerInfo_test.cpp b/src/test/rpc/ServerInfo_test.cpp index 5e202f275ae..21312ef8fff 100644 --- a/src/test/rpc/ServerInfo_test.cpp +++ b/src/test/rpc/ServerInfo_test.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include #include diff --git a/src/test/rpc/Simulate_test.cpp b/src/test/rpc/Simulate_test.cpp index 656e5f0577e..089c444e116 100644 --- a/src/test/rpc/Simulate_test.cpp +++ b/src/test/rpc/Simulate_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/Status_test.cpp b/src/test/rpc/Status_test.cpp index c68131e8131..e37fe2dabde 100644 --- a/src/test/rpc/Status_test.cpp +++ b/src/test/rpc/Status_test.cpp @@ -18,9 +18,9 @@ //============================================================================== #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 662442676f0..1546f2c8597 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -18,14 +18,17 @@ #include #include #include + #include #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/test/rpc/TransactionEntry_test.cpp b/src/test/rpc/TransactionEntry_test.cpp index 09423ed25d5..bafb01f5ffc 100644 --- a/src/test/rpc/TransactionEntry_test.cpp +++ b/src/test/rpc/TransactionEntry_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/rpc/TransactionHistory_test.cpp b/src/test/rpc/TransactionHistory_test.cpp index 63151bdaeb6..d5b1b27a358 100644 --- a/src/test/rpc/TransactionHistory_test.cpp +++ b/src/test/rpc/TransactionHistory_test.cpp @@ -20,8 +20,11 @@ #include #include #include + #include + #include + #include namespace ripple { diff --git a/src/test/rpc/Transaction_test.cpp b/src/test/rpc/Transaction_test.cpp index 2bd20eb3707..6aef32dbf30 100644 --- a/src/test/rpc/Transaction_test.cpp +++ b/src/test/rpc/Transaction_test.cpp @@ -20,8 +20,10 @@ #include #include #include + #include #include + #include #include #include diff --git a/src/test/rpc/ValidatorInfo_test.cpp b/src/test/rpc/ValidatorInfo_test.cpp index 5ca1af7a3c3..4904923e0b4 100644 --- a/src/test/rpc/ValidatorInfo_test.cpp +++ b/src/test/rpc/ValidatorInfo_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include #include diff --git a/src/test/rpc/ValidatorRPC_test.cpp b/src/test/rpc/ValidatorRPC_test.cpp index b53b8d1f82f..d03cbbf8410 100644 --- a/src/test/rpc/ValidatorRPC_test.cpp +++ b/src/test/rpc/ValidatorRPC_test.cpp @@ -19,13 +19,13 @@ #include #include + #include #include #include -#include + #include #include -#include #include #include diff --git a/src/test/rpc/Version_test.cpp b/src/test/rpc/Version_test.cpp index b66e502b9f3..c0bc5d450b0 100644 --- a/src/test/rpc/Version_test.cpp +++ b/src/test/rpc/Version_test.cpp @@ -18,7 +18,9 @@ //============================================================================== #include + #include + #include namespace ripple { diff --git a/src/test/server/ServerStatus_test.cpp b/src/test/server/ServerStatus_test.cpp index f15085d6efa..bcd355e301d 100644 --- a/src/test/server/ServerStatus_test.cpp +++ b/src/test/server/ServerStatus_test.cpp @@ -21,18 +21,22 @@ #include #include #include + #include #include #include #include + #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/test/server/Server_test.cpp b/src/test/server/Server_test.cpp index c17c752ff12..f8895ae7e9b 100644 --- a/src/test/server/Server_test.cpp +++ b/src/test/server/Server_test.cpp @@ -17,18 +17,19 @@ */ //============================================================================== +#include +#include +#include +#include + #include + #include #include #include #include #include -#include -#include -#include -#include - #include #include #include diff --git a/src/test/shamap/FetchPack_test.cpp b/src/test/shamap/FetchPack_test.cpp index ac2d16ecc99..04385f94418 100644 --- a/src/test/shamap/FetchPack_test.cpp +++ b/src/test/shamap/FetchPack_test.cpp @@ -19,15 +19,17 @@ #include #include + #include #include -#include + #include #include #include #include #include #include + #include #include diff --git a/src/test/shamap/SHAMapSync_test.cpp b/src/test/shamap/SHAMapSync_test.cpp index 627e97e152c..c3af07f0369 100644 --- a/src/test/shamap/SHAMapSync_test.cpp +++ b/src/test/shamap/SHAMapSync_test.cpp @@ -19,9 +19,10 @@ #include #include + #include #include -#include + #include #include #include diff --git a/src/test/shamap/SHAMap_test.cpp b/src/test/shamap/SHAMap_test.cpp index c8c877935f5..3197e0944d3 100644 --- a/src/test/shamap/SHAMap_test.cpp +++ b/src/test/shamap/SHAMap_test.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include #include #include diff --git a/src/test/shamap/common.h b/src/test/shamap/common.h index db5a2c40acf..47308a82f84 100644 --- a/src/test/shamap/common.h +++ b/src/test/shamap/common.h @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/test/unit_test/FileDirGuard.h b/src/test/unit_test/FileDirGuard.h index 246ac262378..d247ae30157 100644 --- a/src/test/unit_test/FileDirGuard.h +++ b/src/test/unit_test/FileDirGuard.h @@ -21,7 +21,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define TEST_UNIT_TEST_DIRGUARD_H #include + #include + #include namespace ripple { diff --git a/src/test/unit_test/multi_runner.h b/src/test/unit_test/multi_runner.h index a4435dd1af7..653bbead066 100644 --- a/src/test/unit_test/multi_runner.h +++ b/src/test/unit_test/multi_runner.h @@ -22,8 +22,8 @@ #include #include -#include +#include #include #include #include diff --git a/src/xrpld/app/consensus/RCLCensorshipDetector.h b/src/xrpld/app/consensus/RCLCensorshipDetector.h index 12a768ca4c8..7cdf15949d4 100644 --- a/src/xrpld/app/consensus/RCLCensorshipDetector.h +++ b/src/xrpld/app/consensus/RCLCensorshipDetector.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_CONSENSUS_RCLCENSORSHIPDETECTOR_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.cpp b/src/xrpld/app/consensus/RCLConsensus.cpp index fe368a69a67..0a5cee41212 100644 --- a/src/xrpld/app/consensus/RCLConsensus.cpp +++ b/src/xrpld/app/consensus/RCLConsensus.cpp @@ -37,6 +37,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLConsensus.h b/src/xrpld/app/consensus/RCLConsensus.h index 6519b90e4cb..735c67fd01e 100644 --- a/src/xrpld/app/consensus/RCLConsensus.h +++ b/src/xrpld/app/consensus/RCLConsensus.h @@ -28,13 +28,11 @@ #include #include #include -#include #include -#include -#include + #include #include -#include + #include #include #include diff --git a/src/xrpld/app/consensus/RCLCxLedger.h b/src/xrpld/app/consensus/RCLCxLedger.h index ed7ad9faeb7..cd14c30a94d 100644 --- a/src/xrpld/app/consensus/RCLCxLedger.h +++ b/src/xrpld/app/consensus/RCLCxLedger.h @@ -23,8 +23,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.cpp b/src/xrpld/app/consensus/RCLCxPeerPos.cpp index 37f61a8c2d5..83847b2e9ee 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.cpp +++ b/src/xrpld/app/consensus/RCLCxPeerPos.cpp @@ -18,10 +18,8 @@ //============================================================================== #include -#include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLCxPeerPos.h b/src/xrpld/app/consensus/RCLCxPeerPos.h index b5d3d152cb2..63cfde87000 100644 --- a/src/xrpld/app/consensus/RCLCxPeerPos.h +++ b/src/xrpld/app/consensus/RCLCxPeerPos.h @@ -21,15 +21,15 @@ #define RIPPLE_APP_CONSENSUS_RCLCXPEERPOS_H_INCLUDED #include -#include + #include #include #include #include #include -#include + #include -#include + #include #include diff --git a/src/xrpld/app/consensus/RCLCxTx.h b/src/xrpld/app/consensus/RCLCxTx.h index bbf3797887c..baa0899f020 100644 --- a/src/xrpld/app/consensus/RCLCxTx.h +++ b/src/xrpld/app/consensus/RCLCxTx.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED #define RIPPLE_APP_CONSENSUS_RCLCXTX_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.cpp b/src/xrpld/app/consensus/RCLValidations.cpp index c4d9389e896..a04047c78a1 100644 --- a/src/xrpld/app/consensus/RCLValidations.cpp +++ b/src/xrpld/app/consensus/RCLValidations.cpp @@ -22,18 +22,15 @@ #include #include #include -#include #include -#include #include #include #include + #include -#include #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/consensus/RCLValidations.h b/src/xrpld/app/consensus/RCLValidations.h index 7b1559fba43..a9f872bee9d 100644 --- a/src/xrpld/app/consensus/RCLValidations.h +++ b/src/xrpld/app/consensus/RCLValidations.h @@ -22,11 +22,12 @@ #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/AbstractFetchPackContainer.h b/src/xrpld/app/ledger/AbstractFetchPackContainer.h index 2b27471c64a..a93169800ef 100644 --- a/src/xrpld/app/ledger/AbstractFetchPackContainer.h +++ b/src/xrpld/app/ledger/AbstractFetchPackContainer.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.cpp b/src/xrpld/app/ledger/AcceptedLedger.cpp index a82323f6286..21efc4983f9 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.cpp +++ b/src/xrpld/app/ledger/AcceptedLedger.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedger.h b/src/xrpld/app/ledger/AcceptedLedger.h index 65a782aef70..6b17d93c9d1 100644 --- a/src/xrpld/app/ledger/AcceptedLedger.h +++ b/src/xrpld/app/ledger/AcceptedLedger.h @@ -21,7 +21,6 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGER_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp index 6bdb602fd83..7944578f77e 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.cpp +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/ledger/AcceptedLedgerTx.h b/src/xrpld/app/ledger/AcceptedLedgerTx.h index 725057aa02c..efa16371a79 100644 --- a/src/xrpld/app/ledger/AcceptedLedgerTx.h +++ b/src/xrpld/app/ledger/AcceptedLedgerTx.h @@ -21,7 +21,9 @@ #define RIPPLE_APP_LEDGER_ACCEPTEDLEDGERTX_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.cpp b/src/xrpld/app/ledger/BookListeners.cpp index 2379807a91a..fa5fa65059b 100644 --- a/src/xrpld/app/ledger/BookListeners.cpp +++ b/src/xrpld/app/ledger/BookListeners.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/BookListeners.h b/src/xrpld/app/ledger/BookListeners.h index 6ac52de28ee..ca58bf30589 100644 --- a/src/xrpld/app/ledger/BookListeners.h +++ b/src/xrpld/app/ledger/BookListeners.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_LEDGER_BOOKLISTENERS_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/ledger/BuildLedger.h b/src/xrpld/app/ledger/BuildLedger.h index 409fa3529c4..0805db6c8df 100644 --- a/src/xrpld/app/ledger/BuildLedger.h +++ b/src/xrpld/app/ledger/BuildLedger.h @@ -21,10 +21,9 @@ #define RIPPLE_APP_LEDGER_BUILD_LEDGER_H_INCLUDED #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp index 77a0370f7d9..e62426b7201 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.cpp +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.cpp @@ -19,11 +19,11 @@ #include #include -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/ConsensusTransSetSF.h b/src/xrpld/app/ledger/ConsensusTransSetSF.h index 857f2b8eae2..4a68f577ada 100644 --- a/src/xrpld/app/ledger/ConsensusTransSetSF.h +++ b/src/xrpld/app/ledger/ConsensusTransSetSF.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundLedger.h b/src/xrpld/app/ledger/InboundLedger.h index 13f603e79d0..e8f244bfc03 100644 --- a/src/xrpld/app/ledger/InboundLedger.h +++ b/src/xrpld/app/ledger/InboundLedger.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/app/ledger/InboundLedgers.h b/src/xrpld/app/ledger/InboundLedgers.h index 937a1515890..037897392f2 100644 --- a/src/xrpld/app/ledger/InboundLedgers.h +++ b/src/xrpld/app/ledger/InboundLedgers.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_LEDGER_INBOUNDLEDGERS_H_INCLUDED #include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/InboundTransactions.h b/src/xrpld/app/ledger/InboundTransactions.h index 368375c07c5..6feee440041 100644 --- a/src/xrpld/app/ledger/InboundTransactions.h +++ b/src/xrpld/app/ledger/InboundTransactions.h @@ -22,7 +22,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 852f73cde14..d3c59fbeb69 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -17,28 +17,22 @@ */ //============================================================================== -#include #include #include -#include #include -#include #include -#include #include #include -#include -#include #include #include #include #include #include #include +#include + #include -#include #include -#include #include #include #include @@ -46,15 +40,12 @@ #include #include #include -#include #include #include -#include + #include #include -#include - namespace ripple { create_genesis_t const create_genesis{}; diff --git a/src/xrpld/app/ledger/Ledger.h b/src/xrpld/app/ledger/Ledger.h index 0eb102eb518..81c26526e5e 100644 --- a/src/xrpld/app/ledger/Ledger.h +++ b/src/xrpld/app/ledger/Ledger.h @@ -20,18 +20,18 @@ #ifndef RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED #define RIPPLE_APP_LEDGER_LEDGER_H_INCLUDED +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerCleaner.h b/src/xrpld/app/ledger/LedgerCleaner.h index 251e8d51281..b086e021345 100644 --- a/src/xrpld/app/ledger/LedgerCleaner.h +++ b/src/xrpld/app/ledger/LedgerCleaner.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_LEDGER_LEDGERCLEANER_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerHistory.cpp b/src/xrpld/app/ledger/LedgerHistory.cpp index ed0b11723b0..bf866abf3f0 100644 --- a/src/xrpld/app/ledger/LedgerHistory.cpp +++ b/src/xrpld/app/ledger/LedgerHistory.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/LedgerHistory.h b/src/xrpld/app/ledger/LedgerHistory.h index 9d414e4aad3..33f8bf1d961 100644 --- a/src/xrpld/app/ledger/LedgerHistory.h +++ b/src/xrpld/app/ledger/LedgerHistory.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerHolder.h b/src/xrpld/app/ledger/LedgerHolder.h index 5636a8ca20d..c0c9d74f463 100644 --- a/src/xrpld/app/ledger/LedgerHolder.h +++ b/src/xrpld/app/ledger/LedgerHolder.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerMaster.h b/src/xrpld/app/ledger/LedgerMaster.h index dd7f0b6a614..f8d726ec8e1 100644 --- a/src/xrpld/app/ledger/LedgerMaster.h +++ b/src/xrpld/app/ledger/LedgerMaster.h @@ -28,18 +28,17 @@ #include #include #include + #include -#include #include #include #include #include #include -#include #include -#include #include +#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplay.h b/src/xrpld/app/ledger/LedgerReplay.h index 8e52c8d5d5d..a3bdedf8218 100644 --- a/src/xrpld/app/ledger/LedgerReplay.h +++ b/src/xrpld/app/ledger/LedgerReplay.h @@ -21,9 +21,9 @@ #define RIPPLE_APP_LEDGER_LEDGERREPLAY_H_INCLUDED #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayTask.h b/src/xrpld/app/ledger/LedgerReplayTask.h index 54863e70956..03110d8442f 100644 --- a/src/xrpld/app/ledger/LedgerReplayTask.h +++ b/src/xrpld/app/ledger/LedgerReplayTask.h @@ -24,7 +24,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LedgerReplayer.h b/src/xrpld/app/ledger/LedgerReplayer.h index 4ce4b20b221..b00430303a1 100644 --- a/src/xrpld/app/ledger/LedgerReplayer.h +++ b/src/xrpld/app/ledger/LedgerReplayer.h @@ -23,9 +23,9 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/app/ledger/LedgerToJson.h b/src/xrpld/app/ledger/LedgerToJson.h index 8f9316cbc66..40be57fc9c4 100644 --- a/src/xrpld/app/ledger/LedgerToJson.h +++ b/src/xrpld/app/ledger/LedgerToJson.h @@ -24,11 +24,9 @@ #include #include #include -#include + #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/LocalTxs.h b/src/xrpld/app/ledger/LocalTxs.h index 638e070f444..bf86992a693 100644 --- a/src/xrpld/app/ledger/LocalTxs.h +++ b/src/xrpld/app/ledger/LocalTxs.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OpenLedger.h b/src/xrpld/app/ledger/OpenLedger.h index 95d4a7cb234..9fe56ff4889 100644 --- a/src/xrpld/app/ledger/OpenLedger.h +++ b/src/xrpld/app/ledger/OpenLedger.h @@ -25,10 +25,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/OrderBookDB.cpp b/src/xrpld/app/ledger/OrderBookDB.cpp index 265e0b62905..5d3616ce20e 100644 --- a/src/xrpld/app/ledger/OrderBookDB.cpp +++ b/src/xrpld/app/ledger/OrderBookDB.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/OrderBookDB.h b/src/xrpld/app/ledger/OrderBookDB.h index ce0d9f0fafe..d120f43aea4 100644 --- a/src/xrpld/app/ledger/OrderBookDB.h +++ b/src/xrpld/app/ledger/OrderBookDB.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/PendingSaves.h b/src/xrpld/app/ledger/PendingSaves.h index d296fcacc96..20263fd1f3b 100644 --- a/src/xrpld/app/ledger/PendingSaves.h +++ b/src/xrpld/app/ledger/PendingSaves.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PENDINGSAVES_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/ledger/TransactionMaster.h b/src/xrpld/app/ledger/TransactionMaster.h index 65f27af6021..ffbbe4ae090 100644 --- a/src/xrpld/app/ledger/TransactionMaster.h +++ b/src/xrpld/app/ledger/TransactionMaster.h @@ -23,7 +23,9 @@ #include #include #include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/BuildLedger.cpp b/src/xrpld/app/ledger/detail/BuildLedger.cpp index 5d0f4966a4e..3f099cd2ea7 100644 --- a/src/xrpld/app/ledger/detail/BuildLedger.cpp +++ b/src/xrpld/app/ledger/detail/BuildLedger.cpp @@ -21,9 +21,9 @@ #include #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/InboundLedger.cpp b/src/xrpld/app/ledger/detail/InboundLedger.cpp index 32fdff76ab3..c1eed3a9f32 100644 --- a/src/xrpld/app/ledger/detail/InboundLedger.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedger.cpp @@ -23,10 +23,10 @@ #include #include #include -#include #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundLedgers.cpp b/src/xrpld/app/ledger/detail/InboundLedgers.cpp index 99a26ce8f9f..b05268f65b8 100644 --- a/src/xrpld/app/ledger/detail/InboundLedgers.cpp +++ b/src/xrpld/app/ledger/detail/InboundLedgers.cpp @@ -23,11 +23,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/ledger/detail/InboundTransactions.cpp b/src/xrpld/app/ledger/detail/InboundTransactions.cpp index b8f327ff8a3..54477ccaedb 100644 --- a/src/xrpld/app/ledger/detail/InboundTransactions.cpp +++ b/src/xrpld/app/ledger/detail/InboundTransactions.cpp @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp index 27322e302cc..7c0dccfb9b4 100644 --- a/src/xrpld/app/ledger/detail/LedgerCleaner.cpp +++ b/src/xrpld/app/ledger/detail/LedgerCleaner.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h index b0b2c76c245..24359647660 100644 --- a/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h +++ b/src/xrpld/app/ledger/detail/LedgerDeltaAcquire.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerMaster.cpp b/src/xrpld/app/ledger/detail/LedgerMaster.cpp index 6bc894da487..0c6a5e786cb 100644 --- a/src/xrpld/app/ledger/detail/LedgerMaster.cpp +++ b/src/xrpld/app/ledger/detail/LedgerMaster.cpp @@ -40,6 +40,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp index 7b9d881d544..5bfad61bf4a 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayMsgHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp index 164fbf8cc5a..a9d2657f9b6 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayTask.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp index 3ef3201567a..6de717be4fe 100644 --- a/src/xrpld/app/ledger/detail/LedgerReplayer.cpp +++ b/src/xrpld/app/ledger/detail/LedgerReplayer.cpp @@ -20,7 +20,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LedgerToJson.cpp b/src/xrpld/app/ledger/detail/LedgerToJson.cpp index 3f6869df1d8..5f1e47e8b37 100644 --- a/src/xrpld/app/ledger/detail/LedgerToJson.cpp +++ b/src/xrpld/app/ledger/detail/LedgerToJson.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include #include #include #include -#include + #include +#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/LocalTxs.cpp b/src/xrpld/app/ledger/detail/LocalTxs.cpp index a6eb7721a3e..b6bfc8f8500 100644 --- a/src/xrpld/app/ledger/detail/LocalTxs.cpp +++ b/src/xrpld/app/ledger/detail/LocalTxs.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include /* diff --git a/src/xrpld/app/ledger/detail/OpenLedger.cpp b/src/xrpld/app/ledger/detail/OpenLedger.cpp index a6b93b46949..86a3b4b8400 100644 --- a/src/xrpld/app/ledger/detail/OpenLedger.cpp +++ b/src/xrpld/app/ledger/detail/OpenLedger.cpp @@ -25,8 +25,7 @@ #include #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp index 912c29a9f67..fc7e4d140ce 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.cpp +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/SkipListAcquire.h b/src/xrpld/app/ledger/detail/SkipListAcquire.h index 03c8181df68..0e979451744 100644 --- a/src/xrpld/app/ledger/detail/SkipListAcquire.h +++ b/src/xrpld/app/ledger/detail/SkipListAcquire.h @@ -25,7 +25,6 @@ #include #include #include -#include namespace ripple { class InboundLedgers; diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index 35d8f1fffb1..09614886917 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -18,9 +18,7 @@ //============================================================================== #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.h b/src/xrpld/app/ledger/detail/TimeoutCounter.h index 228e879d4de..85ce6fc3b43 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.h +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.h @@ -22,9 +22,11 @@ #include #include -#include + #include + #include + #include namespace ripple { diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp index fa4758ebcc5..23694b3cb6e 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.cpp +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.cpp @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include diff --git a/src/xrpld/app/ledger/detail/TransactionAcquire.h b/src/xrpld/app/ledger/detail/TransactionAcquire.h index 230bce2fc94..f0d9b40928f 100644 --- a/src/xrpld/app/ledger/detail/TransactionAcquire.h +++ b/src/xrpld/app/ledger/detail/TransactionAcquire.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED #define RIPPLE_APP_LEDGER_TRANSACTIONACQUIRE_H_INCLUDED -#include #include #include diff --git a/src/xrpld/app/ledger/detail/TransactionMaster.cpp b/src/xrpld/app/ledger/detail/TransactionMaster.cpp index e2e1213a37e..7acc3579b0b 100644 --- a/src/xrpld/app/ledger/detail/TransactionMaster.cpp +++ b/src/xrpld/app/ledger/detail/TransactionMaster.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 3953b56d672..aa502b41438 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -57,10 +56,10 @@ #include #include #include + #include #include #include -#include #include #include #include @@ -86,7 +85,6 @@ #include #include #include -#include namespace ripple { @@ -1557,10 +1555,10 @@ ApplicationImp::run() if (!config_->standalone()) { // VFALCO NOTE This seems unnecessary. If we properly refactor the load - // manager then the deadlock detector can just always be + // manager then the stall detector can just always be // "armed" // - getLoadManager().activateDeadlockDetector(); + getLoadManager().activateStallDetector(); } { diff --git a/src/xrpld/app/main/Application.h b/src/xrpld/app/main/Application.h index 8f2dd606ded..27d18407666 100644 --- a/src/xrpld/app/main/Application.h +++ b/src/xrpld/app/main/Application.h @@ -22,14 +22,15 @@ #include #include -#include #include + #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/main/BasicApp.cpp b/src/xrpld/app/main/BasicApp.cpp index 504309d0838..a4b1a74685e 100644 --- a/src/xrpld/app/main/BasicApp.cpp +++ b/src/xrpld/app/main/BasicApp.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include BasicApp::BasicApp(std::size_t numberOfThreads) diff --git a/src/xrpld/app/main/BasicApp.h b/src/xrpld/app/main/BasicApp.h index 1c42a3d3330..cd1e8c1a717 100644 --- a/src/xrpld/app/main/BasicApp.h +++ b/src/xrpld/app/main/BasicApp.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_BASICAPP_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/main/CollectorManager.cpp b/src/xrpld/app/main/CollectorManager.cpp index ae7ff965f5c..81f59d8e2b4 100644 --- a/src/xrpld/app/main/CollectorManager.cpp +++ b/src/xrpld/app/main/CollectorManager.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index 7dc4d03b2c2..2ee811dc19e 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include -#include - #include + +#include #include +#include namespace ripple { @@ -447,8 +447,8 @@ GRPCServerImpl::handleRpcs() if (!ok) { - JLOG(journal_.debug()) << "Request listener cancelled. " - << "Destroying object"; + JLOG(journal_.debug()) + << "Request listener cancelled. " << "Destroying object"; erase(ptr); } else diff --git a/src/xrpld/app/main/GRPCServer.h b/src/xrpld/app/main/GRPCServer.h index 0298a40493c..2ecbd5e7daa 100644 --- a/src/xrpld/app/main/GRPCServer.h +++ b/src/xrpld/app/main/GRPCServer.h @@ -28,11 +28,10 @@ #include #include #include -#include -#include -#include #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/main/LoadManager.cpp b/src/xrpld/app/main/LoadManager.cpp index 01b96a3d26c..9ae9e44a3a5 100644 --- a/src/xrpld/app/main/LoadManager.cpp +++ b/src/xrpld/app/main/LoadManager.cpp @@ -21,9 +21,10 @@ #include #include #include -#include + #include #include + #include #include #include @@ -31,7 +32,7 @@ namespace ripple { LoadManager::LoadManager(Application& app, beast::Journal journal) - : app_(app), journal_(journal), deadLock_(), armed_(false) + : app_(app), journal_(journal), lastHeartbeat_(), armed_(false) { } @@ -52,19 +53,19 @@ LoadManager::~LoadManager() //------------------------------------------------------------------------------ void -LoadManager::activateDeadlockDetector() +LoadManager::activateStallDetector() { std::lock_guard sl(mutex_); armed_ = true; - deadLock_ = std::chrono::steady_clock::now(); + lastHeartbeat_ = std::chrono::steady_clock::now(); } void -LoadManager::resetDeadlockDetector() +LoadManager::heartbeat() { - auto const detector_start = std::chrono::steady_clock::now(); + auto const heartbeat = std::chrono::steady_clock::now(); std::lock_guard sl(mutex_); - deadLock_ = detector_start; + lastHeartbeat_ = heartbeat; } //------------------------------------------------------------------------------ @@ -117,63 +118,62 @@ LoadManager::run() break; // Copy out shared data under a lock. Use copies outside lock. - auto const deadLock = deadLock_; + auto const lastHeartbeat = lastHeartbeat_; auto const armed = armed_; sl.unlock(); - // Measure the amount of time we have been deadlocked, in seconds. + // Measure the amount of time we have been stalled, in seconds. using namespace std::chrono; - auto const timeSpentDeadlocked = - duration_cast(steady_clock::now() - deadLock); + auto const timeSpentStalled = + duration_cast(steady_clock::now() - lastHeartbeat); constexpr auto reportingIntervalSeconds = 10s; - constexpr auto deadlockFatalLogMessageTimeLimit = 90s; - constexpr auto deadlockLogicErrorTimeLimit = 600s; + constexpr auto stallFatalLogMessageTimeLimit = 90s; + constexpr auto stallLogicErrorTimeLimit = 600s; - if (armed && (timeSpentDeadlocked >= reportingIntervalSeconds)) + if (armed && (timeSpentStalled >= reportingIntervalSeconds)) { - // Report the deadlocked condition every - // reportingIntervalSeconds - if ((timeSpentDeadlocked % reportingIntervalSeconds) == 0s) + // Report the stalled condition every reportingIntervalSeconds + if ((timeSpentStalled % reportingIntervalSeconds) == 0s) { - if (timeSpentDeadlocked < deadlockFatalLogMessageTimeLimit) + if (timeSpentStalled < stallFatalLogMessageTimeLimit) { JLOG(journal_.warn()) - << "Server stalled for " << timeSpentDeadlocked.count() + << "Server stalled for " << timeSpentStalled.count() << " seconds."; + if (app_.getJobQueue().isOverloaded()) { - JLOG(journal_.warn()) << app_.getJobQueue().getJson(0); + JLOG(journal_.warn()) + << "JobQueue: " << app_.getJobQueue().getJson(0); } } else { JLOG(journal_.fatal()) - << "Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "Server stalled for " << timeSpentStalled.count() + << " seconds."; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); } } - // If we go over the deadlockTimeLimit spent deadlocked, it - // means that the deadlock resolution code has failed, which - // qualifies as undefined behavior. - // - if (timeSpentDeadlocked >= deadlockLogicErrorTimeLimit) + // If we go over the stallLogicErrorTimeLimit spent stalled, it + // means that the stall resolution code has failed, which qualifies + // as a LogicError + if (timeSpentStalled >= stallLogicErrorTimeLimit) { JLOG(journal_.fatal()) - << "LogicError: Deadlock detected. Deadlocked time: " - << timeSpentDeadlocked.count() << "s"; + << "LogicError: Fatal server stall detected. Stalled time: " + << timeSpentStalled.count() << "s"; JLOG(journal_.fatal()) << "JobQueue: " << app_.getJobQueue().getJson(0); - LogicError("Deadlock detected"); + LogicError("Fatal server stall detected"); } } } - bool change; - + bool change = false; if (app_.getJobQueue().isOverloaded()) { JLOG(journal_.info()) << "Raising local fee (JQ overload): " diff --git a/src/xrpld/app/main/LoadManager.h b/src/xrpld/app/main/LoadManager.h index f818068dcfa..166c40538ca 100644 --- a/src/xrpld/app/main/LoadManager.h +++ b/src/xrpld/app/main/LoadManager.h @@ -21,8 +21,8 @@ #define RIPPLE_APP_MAIN_LOADMANAGER_H_INCLUDED #include + #include -#include #include #include #include @@ -58,28 +58,28 @@ class LoadManager */ ~LoadManager(); - /** Turn on deadlock detection. + /** Turn on stall detection. - The deadlock detector begins in a disabled state. After this function - is called, it will report deadlocks using a separate thread whenever + The stall detector begins in a disabled state. After this function + is called, it will report stalls using a separate thread whenever the reset function is not called at least once per 10 seconds. - @see resetDeadlockDetector + @see resetStallDetector */ - // VFALCO NOTE it seems that the deadlock detector has an "armed" state + // VFALCO NOTE it seems that the stall detector has an "armed" state // to prevent it from going off during program startup if // there's a lengthy initialization operation taking place? // void - activateDeadlockDetector(); + activateStallDetector(); - /** Reset the deadlock detection timer. + /** Reset the stall detection timer. - A dedicated thread monitors the deadlock timer, and if too much + A dedicated thread monitors the stall timer, and if too much time passes it will produce log warnings. */ void - resetDeadlockDetector(); + heartbeat(); //-------------------------------------------------------------------------- @@ -98,12 +98,12 @@ class LoadManager beast::Journal const journal_; std::thread thread_; - std::mutex mutex_; // Guards deadLock_, armed_, cv_ + std::mutex mutex_; // Guards lastHeartbeat_, armed_, cv_ std::condition_variable cv_; bool stop_ = false; - std::chrono::steady_clock::time_point - deadLock_; // Detect server deadlocks. + // Detect server stalls + std::chrono::steady_clock::time_point lastHeartbeat_; bool armed_; friend std::unique_ptr diff --git a/src/xrpld/app/main/Main.cpp b/src/xrpld/app/main/Main.cpp index 6e92c2e83a7..2fa0f68df47 100644 --- a/src/xrpld/app/main/Main.cpp +++ b/src/xrpld/app/main/Main.cpp @@ -18,34 +18,26 @@ //============================================================================== #include -#include #include #include #include #include #include -#include + #include -#include -#include -#include #include -#include #include -#include #ifdef ENABLE_TESTS #include + #include #endif // ENABLE_TESTS - -#include - -#include -#include #include #include +#include + #include #include #include diff --git a/src/xrpld/app/main/NodeIdentity.cpp b/src/xrpld/app/main/NodeIdentity.cpp index e0b83d54c8d..a1da64a0f93 100644 --- a/src/xrpld/app/main/NodeIdentity.cpp +++ b/src/xrpld/app/main/NodeIdentity.cpp @@ -22,7 +22,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeIdentity.h b/src/xrpld/app/main/NodeIdentity.h index b4da8651949..3616255c13e 100644 --- a/src/xrpld/app/main/NodeIdentity.h +++ b/src/xrpld/app/main/NodeIdentity.h @@ -21,10 +21,11 @@ #define RIPPLE_APP_MAIN_NODEIDENTITY_H_INCLUDED #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.cpp b/src/xrpld/app/main/NodeStoreScheduler.cpp index f2dce5421f0..6ef2ff3ca66 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.cpp +++ b/src/xrpld/app/main/NodeStoreScheduler.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/main/NodeStoreScheduler.h b/src/xrpld/app/main/NodeStoreScheduler.h index b16142b2613..c21cc939347 100644 --- a/src/xrpld/app/main/NodeStoreScheduler.h +++ b/src/xrpld/app/main/NodeStoreScheduler.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index c6c0c808bfe..f27d542e32b 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -30,11 +30,8 @@ #include #include #include -#include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index 52fe819a28e..ebc28341097 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -16,10 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/AmendmentTable.h b/src/xrpld/app/misc/AmendmentTable.h index d6193adca2c..deb0386236c 100644 --- a/src/xrpld/app/misc/AmendmentTable.h +++ b/src/xrpld/app/misc/AmendmentTable.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.cpp b/src/xrpld/app/misc/CredentialHelpers.cpp index a18cd40336b..dcc5975b347 100644 --- a/src/xrpld/app/misc/CredentialHelpers.cpp +++ b/src/xrpld/app/misc/CredentialHelpers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/misc/CredentialHelpers.h b/src/xrpld/app/misc/CredentialHelpers.h index acc4f2621db..8b52acf54e0 100644 --- a/src/xrpld/app/misc/CredentialHelpers.h +++ b/src/xrpld/app/misc/CredentialHelpers.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED +#define RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED #include @@ -78,3 +79,5 @@ verifyDepositPreauth( std::shared_ptr const& sleDst); } // namespace ripple + +#endif diff --git a/src/xrpld/app/misc/DeliverMax.h b/src/xrpld/app/misc/DeliverMax.h index 3bc875ee4ba..815bf521895 100644 --- a/src/xrpld/app/misc/DeliverMax.h +++ b/src/xrpld/app/misc/DeliverMax.h @@ -22,9 +22,6 @@ #include -#include -#include - namespace Json { class Value; } diff --git a/src/xrpld/app/misc/FeeVote.h b/src/xrpld/app/misc/FeeVote.h index 47769e21e4d..35f723aa024 100644 --- a/src/xrpld/app/misc/FeeVote.h +++ b/src/xrpld/app/misc/FeeVote.h @@ -22,9 +22,8 @@ #include #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 5583b688621..e312ab042f8 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -18,9 +18,8 @@ //============================================================================== #include -#include #include -#include + #include #include #include diff --git a/src/xrpld/app/misc/LoadFeeTrack.h b/src/xrpld/app/misc/LoadFeeTrack.h index 875a7bb7dfa..0064359c762 100644 --- a/src/xrpld/app/misc/LoadFeeTrack.h +++ b/src/xrpld/app/misc/LoadFeeTrack.h @@ -22,9 +22,8 @@ #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/app/misc/NegativeUNLVote.h b/src/xrpld/app/misc/NegativeUNLVote.h index f0284f267a8..72ed9657178 100644 --- a/src/xrpld/app/misc/NegativeUNLVote.h +++ b/src/xrpld/app/misc/NegativeUNLVote.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_NEGATIVEUNLVOTE_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 2b3c38eea4c..b721c80bfde 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -50,23 +50,22 @@ #include #include #include + #include #include #include #include -#include #include #include #include -#include #include #include #include #include -#include #include #include #include + #include #include @@ -79,7 +78,6 @@ #include #include #include -#include namespace ripple { @@ -252,6 +250,12 @@ class NetworkOPsImp final : public NetworkOPs beast::get_abstract_clock(), validatorKeys, app_.logs().journal("LedgerConsensus")) + , validatorPK_( + validatorKeys.keys ? validatorKeys.keys->publicKey + : decltype(validatorPK_){}) + , validatorMasterPK_( + validatorKeys.keys ? validatorKeys.keys->masterPublicKey + : decltype(validatorMasterPK_){}) , m_ledgerMaster(ledgerMaster) , m_job_queue(job_queue) , m_standalone(standalone) @@ -735,6 +739,9 @@ class NetworkOPsImp final : public NetworkOPs RCLConsensus mConsensus; + std::optional const validatorPK_; + std::optional const validatorMasterPK_; + ConsensusPhase mLastConsensusPhase; LedgerMaster& m_ledgerMaster; @@ -1018,7 +1025,7 @@ NetworkOPsImp::processHeartbeatTimer() // VFALCO NOTE This is for diagnosing a crash on exit LoadManager& mgr(app_.getLoadManager()); - mgr.resetDeadlockDetector(); + mgr.heartbeat(); std::size_t const numPeers = app_.overlay().size(); @@ -1920,6 +1927,23 @@ NetworkOPsImp::beginConsensus( bool NetworkOPsImp::processTrustedProposal(RCLCxPeerPos peerPos) { + auto const& peerKey = peerPos.publicKey(); + if (validatorPK_ == peerKey || validatorMasterPK_ == peerKey) + { + // Could indicate a operator misconfiguration where two nodes are + // running with the same validator key configured, so this isn't fatal, + // and it doesn't necessarily indicate peer misbehavior. But since this + // is a trusted message, it could be a very big deal. Either way, we + // don't want to relay the proposal. Note that the byzantine behavior + // detection in handleNewValidation will notify other peers. + UNREACHABLE( + "ripple::NetworkOPsImp::processTrustedProposal : received own " + "proposal"); + JLOG(m_journal.error()) + << "Received a TRUSTED proposal signed with my key from a peer"; + return false; + } + return mConsensus.peerProposal(app_.timeKeeper().closeTime(), peerPos); } diff --git a/src/xrpld/app/misc/NetworkOPs.h b/src/xrpld/app/misc/NetworkOPs.h index be849531e2b..e3535522139 100644 --- a/src/xrpld/app/misc/NetworkOPs.h +++ b/src/xrpld/app/misc/NetworkOPs.h @@ -25,12 +25,13 @@ #include #include #include + #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStore.h b/src/xrpld/app/misc/SHAMapStore.h index d8415713a76..d2836be2874 100644 --- a/src/xrpld/app/misc/SHAMapStore.h +++ b/src/xrpld/app/misc/SHAMapStore.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/misc/SHAMapStoreImp.cpp b/src/xrpld/app/misc/SHAMapStoreImp.cpp index e2e0e3b9c46..52ea40cf94d 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.cpp +++ b/src/xrpld/app/misc/SHAMapStoreImp.cpp @@ -17,16 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include #include #include #include #include + #include #include diff --git a/src/xrpld/app/misc/SHAMapStoreImp.h b/src/xrpld/app/misc/SHAMapStoreImp.h index 7d36f092be8..2b618f65388 100644 --- a/src/xrpld/app/misc/SHAMapStoreImp.h +++ b/src/xrpld/app/misc/SHAMapStoreImp.h @@ -22,15 +22,13 @@ #include #include -#include #include #include #include - #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/TxQ.h b/src/xrpld/app/misc/TxQ.h index db5af4509f2..6fc61055f13 100644 --- a/src/xrpld/app/misc/TxQ.h +++ b/src/xrpld/app/misc/TxQ.h @@ -23,12 +23,15 @@ #include #include #include + #include #include #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorKeys.h b/src/xrpld/app/misc/ValidatorKeys.h index f5b9e5735a6..d29d6cdc6dd 100644 --- a/src/xrpld/app/misc/ValidatorKeys.h +++ b/src/xrpld/app/misc/ValidatorKeys.h @@ -24,6 +24,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/ValidatorList.h b/src/xrpld/app/misc/ValidatorList.h index 7576455798a..4e18aa5db3f 100644 --- a/src/xrpld/app/misc/ValidatorList.h +++ b/src/xrpld/app/misc/ValidatorList.h @@ -23,16 +23,16 @@ #include #include #include + #include #include #include #include #include -#include -#include + #include + #include -#include #include namespace protocol { diff --git a/src/xrpld/app/misc/ValidatorSite.h b/src/xrpld/app/misc/ValidatorSite.h index 39bf895807f..88e30e28ab0 100644 --- a/src/xrpld/app/misc/ValidatorSite.h +++ b/src/xrpld/app/misc/ValidatorSite.h @@ -23,14 +23,13 @@ #include #include #include -#include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/misc/detail/AMMUtils.cpp b/src/xrpld/app/misc/detail/AMMUtils.cpp index 0b83afc6d39..5078049a4a8 100644 --- a/src/xrpld/app/misc/detail/AMMUtils.cpp +++ b/src/xrpld/app/misc/detail/AMMUtils.cpp @@ -16,11 +16,12 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include + #include #include -#include #include namespace ripple { @@ -149,8 +150,8 @@ ammLPHolds( } amount.setIssuer(ammAccount); - JLOG(j.trace()) << "ammLPHolds:" - << " lpAccount=" << to_string(lpAccount) + JLOG(j.trace()) << "ammLPHolds:" << " lpAccount=" + << to_string(lpAccount) << " amount=" << amount.getFullText(); } diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.cpp b/src/xrpld/app/misc/detail/AccountTxPaging.cpp index 898c41b40c4..278680581e5 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.cpp +++ b/src/xrpld/app/misc/detail/AccountTxPaging.cpp @@ -18,14 +18,11 @@ //============================================================================== #include -#include #include #include #include + #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/AccountTxPaging.h b/src/xrpld/app/misc/detail/AccountTxPaging.h index 23a5cbd9c23..062c3e867d0 100644 --- a/src/xrpld/app/misc/detail/AccountTxPaging.h +++ b/src/xrpld/app/misc/detail/AccountTxPaging.h @@ -21,9 +21,8 @@ #define RIPPLE_APP_MISC_IMPL_ACCOUNTTXPAGING_H_INCLUDED #include + #include -#include -#include //------------------------------------------------------------------------------ diff --git a/src/xrpld/app/misc/detail/AmendmentTable.cpp b/src/xrpld/app/misc/detail/AmendmentTable.cpp index d7a5ae82474..ae41a2aa7e6 100644 --- a/src/xrpld/app/misc/detail/AmendmentTable.cpp +++ b/src/xrpld/app/misc/detail/AmendmentTable.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,6 +31,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp index 50fb0ac14db..96e75554013 100644 --- a/src/xrpld/app/misc/detail/LoadFeeTrack.cpp +++ b/src/xrpld/app/misc/detail/LoadFeeTrack.cpp @@ -18,18 +18,14 @@ //============================================================================== #include -#include #include + #include #include #include #include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Manifest.cpp b/src/xrpld/app/misc/detail/Manifest.cpp index 04c8523aece..c42256495ef 100644 --- a/src/xrpld/app/misc/detail/Manifest.cpp +++ b/src/xrpld/app/misc/detail/Manifest.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/Transaction.cpp b/src/xrpld/app/misc/detail/Transaction.cpp index 30af6b773d0..89bf1a7202e 100644 --- a/src/xrpld/app/misc/detail/Transaction.cpp +++ b/src/xrpld/app/misc/detail/Transaction.cpp @@ -23,12 +23,9 @@ #include #include #include -#include -#include + #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index 6e7a2139081..11d81fb8aef 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -19,13 +19,14 @@ #include #include -#include #include #include + #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorKeys.cpp b/src/xrpld/app/misc/detail/ValidatorKeys.cpp index 2b36848c882..8227c5bcdb9 100644 --- a/src/xrpld/app/misc/detail/ValidatorKeys.cpp +++ b/src/xrpld/app/misc/detail/ValidatorKeys.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include - #include +#include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorList.cpp b/src/xrpld/app/misc/detail/ValidatorList.cpp index 3a81443db6b..282c3c9e193 100644 --- a/src/xrpld/app/misc/detail/ValidatorList.cpp +++ b/src/xrpld/app/misc/detail/ValidatorList.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -31,6 +32,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/misc/detail/ValidatorSite.cpp b/src/xrpld/app/misc/detail/ValidatorSite.cpp index 1994f498614..799689ef250 100644 --- a/src/xrpld/app/misc/detail/ValidatorSite.cpp +++ b/src/xrpld/app/misc/detail/ValidatorSite.cpp @@ -22,11 +22,11 @@ #include #include #include -#include -#include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/misc/detail/Work.h b/src/xrpld/app/misc/detail/Work.h index afd49adf326..15be569566e 100644 --- a/src/xrpld/app/misc/detail/Work.h +++ b/src/xrpld/app/misc/detail/Work.h @@ -20,10 +20,6 @@ #ifndef RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED #define RIPPLE_APP_MISC_DETAIL_WORK_H_INCLUDED -// TODO: This include is a workaround for beast compilation bug. -// Remove when fix https://github.com/boostorg/beast/pull/2682/ is available. -#include - #include #include diff --git a/src/xrpld/app/misc/detail/WorkBase.h b/src/xrpld/app/misc/detail/WorkBase.h index cd909265115..a2b852edfd3 100644 --- a/src/xrpld/app/misc/detail/WorkBase.h +++ b/src/xrpld/app/misc/detail/WorkBase.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_MISC_DETAIL_WORKBASE_H_INCLUDED #include + #include #include @@ -30,8 +31,6 @@ #include #include -#include - namespace ripple { namespace detail { diff --git a/src/xrpld/app/misc/detail/WorkFile.h b/src/xrpld/app/misc/detail/WorkFile.h index 9b8d86f5e16..51fd6db78c5 100644 --- a/src/xrpld/app/misc/detail/WorkFile.h +++ b/src/xrpld/app/misc/detail/WorkFile.h @@ -21,10 +21,10 @@ #define RIPPLE_APP_MISC_DETAIL_WORKFILE_H_INCLUDED #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/misc/detail/detail/WorkSSL.cpp b/src/xrpld/app/misc/detail/WorkSSL.cpp similarity index 100% rename from src/xrpld/app/misc/detail/detail/WorkSSL.cpp rename to src/xrpld/app/misc/detail/WorkSSL.cpp diff --git a/src/xrpld/app/misc/detail/WorkSSL.h b/src/xrpld/app/misc/detail/WorkSSL.h index d48f0b5fdff..2d423a9e50e 100644 --- a/src/xrpld/app/misc/detail/WorkSSL.h +++ b/src/xrpld/app/misc/detail/WorkSSL.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/app/paths/AMMLiquidity.h b/src/xrpld/app/paths/AMMLiquidity.h index fe60d39262f..b41e26ac842 100644 --- a/src/xrpld/app/paths/AMMLiquidity.h +++ b/src/xrpld/app/paths/AMMLiquidity.h @@ -25,9 +25,9 @@ #include #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/AMMOffer.h b/src/xrpld/app/paths/AMMOffer.h index e90a5b8611f..9241ba2057c 100644 --- a/src/xrpld/app/paths/AMMOffer.h +++ b/src/xrpld/app/paths/AMMOffer.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/AccountCurrencies.h b/src/xrpld/app/paths/AccountCurrencies.h index 26282e742c3..566fad91047 100644 --- a/src/xrpld/app/paths/AccountCurrencies.h +++ b/src/xrpld/app/paths/AccountCurrencies.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_ACCOUNTCURRENCIES_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/Credit.cpp b/src/xrpld/app/paths/Credit.cpp index e027949e761..ca721e4edf2 100644 --- a/src/xrpld/app/paths/Credit.cpp +++ b/src/xrpld/app/paths/Credit.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/paths/Credit.h b/src/xrpld/app/paths/Credit.h index b71ec057ae1..0ea2d687ddf 100644 --- a/src/xrpld/app/paths/Credit.h +++ b/src/xrpld/app/paths/Credit.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_CREDIT_H_INCLUDED #include + #include #include diff --git a/src/xrpld/app/paths/Flow.cpp b/src/xrpld/app/paths/Flow.cpp index 3df8f6f9992..66793fc74c4 100644 --- a/src/xrpld/app/paths/Flow.cpp +++ b/src/xrpld/app/paths/Flow.cpp @@ -23,15 +23,11 @@ #include #include #include + #include #include #include -#include - -#include -#include - namespace ripple { template diff --git a/src/xrpld/app/paths/Flow.h b/src/xrpld/app/paths/Flow.h index 5390394b7f0..048b8785f18 100644 --- a/src/xrpld/app/paths/Flow.h +++ b/src/xrpld/app/paths/Flow.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.cpp b/src/xrpld/app/paths/PathRequest.cpp index 643923320a2..dc2868eaf20 100644 --- a/src/xrpld/app/paths/PathRequest.cpp +++ b/src/xrpld/app/paths/PathRequest.cpp @@ -26,15 +26,15 @@ #include #include #include +#include + #include #include #include #include #include -#include #include - #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequest.h b/src/xrpld/app/paths/PathRequest.h index 21f10d066ba..3fdbecf7edc 100644 --- a/src/xrpld/app/paths/PathRequest.h +++ b/src/xrpld/app/paths/PathRequest.h @@ -24,13 +24,14 @@ #include #include #include + #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.cpp b/src/xrpld/app/paths/PathRequests.cpp index 86560445ec7..9ada5267515 100644 --- a/src/xrpld/app/paths/PathRequests.cpp +++ b/src/xrpld/app/paths/PathRequests.cpp @@ -21,11 +21,12 @@ #include #include #include + #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/PathRequests.h b/src/xrpld/app/paths/PathRequests.h index 670790518a1..fadf6b7b7c4 100644 --- a/src/xrpld/app/paths/PathRequests.h +++ b/src/xrpld/app/paths/PathRequests.h @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.cpp b/src/xrpld/app/paths/Pathfinder.cpp index 5864357aec4..379bb07e4b5 100644 --- a/src/xrpld/app/paths/Pathfinder.cpp +++ b/src/xrpld/app/paths/Pathfinder.cpp @@ -23,9 +23,9 @@ #include #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/Pathfinder.h b/src/xrpld/app/paths/Pathfinder.h index 01556a3c63f..973fda88551 100644 --- a/src/xrpld/app/paths/Pathfinder.h +++ b/src/xrpld/app/paths/Pathfinder.h @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleCalc.cpp b/src/xrpld/app/paths/RippleCalc.cpp index c7b2e1f01e0..c783bb8e9f3 100644 --- a/src/xrpld/app/paths/RippleCalc.cpp +++ b/src/xrpld/app/paths/RippleCalc.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/paths/RippleCalc.h b/src/xrpld/app/paths/RippleCalc.h index 9e03da9c906..45f68725ccb 100644 --- a/src/xrpld/app/paths/RippleCalc.h +++ b/src/xrpld/app/paths/RippleCalc.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLECALC_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/app/paths/RippleLineCache.cpp b/src/xrpld/app/paths/RippleLineCache.cpp index 38b630eeb7e..f047dc9500b 100644 --- a/src/xrpld/app/paths/RippleLineCache.cpp +++ b/src/xrpld/app/paths/RippleLineCache.cpp @@ -19,7 +19,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/RippleLineCache.h b/src/xrpld/app/paths/RippleLineCache.h index cde1d589f92..5a3188c8102 100644 --- a/src/xrpld/app/paths/RippleLineCache.h +++ b/src/xrpld/app/paths/RippleLineCache.h @@ -22,11 +22,11 @@ #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/paths/TrustLine.cpp b/src/xrpld/app/paths/TrustLine.cpp index 6390c8d2117..28572b899ee 100644 --- a/src/xrpld/app/paths/TrustLine.cpp +++ b/src/xrpld/app/paths/TrustLine.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include #include + #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/TrustLine.h b/src/xrpld/app/paths/TrustLine.h index 4189f7ff481..efbe281f5e1 100644 --- a/src/xrpld/app/paths/TrustLine.h +++ b/src/xrpld/app/paths/TrustLine.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_RIPPLESTATE_H_INCLUDED #include + #include #include #include @@ -100,12 +101,6 @@ class TrustLineBase return mFlags & (!mViewLowest ? lsfLowAuth : lsfHighAuth); } - bool - getDefaultRipple() const - { - return mFlags & lsfDefaultRipple; - } - bool getNoRipple() const { diff --git a/src/xrpld/app/paths/detail/AMMLiquidity.cpp b/src/xrpld/app/paths/detail/AMMLiquidity.cpp index 813554ba7ff..83894b2e76a 100644 --- a/src/xrpld/app/paths/detail/AMMLiquidity.cpp +++ b/src/xrpld/app/paths/detail/AMMLiquidity.cpp @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#include +#include #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/AMMOffer.cpp b/src/xrpld/app/paths/detail/AMMOffer.cpp index 16ea8628f3b..c719c0a92d6 100644 --- a/src/xrpld/app/paths/detail/AMMOffer.cpp +++ b/src/xrpld/app/paths/detail/AMMOffer.cpp @@ -15,10 +15,11 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -//==============================================================================/ -#include +//============================================================================== #include +#include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index 1d35f80b183..5e650230fe4 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 46aa129ac71..4e5ccea3f11 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -204,8 +205,7 @@ class DirectStepI : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " - << "\nSrc: " << src_ << "\nDst: " << dst_; + ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; return ostr.str(); } diff --git a/src/xrpld/app/paths/detail/FlowDebugInfo.h b/src/xrpld/app/paths/detail/FlowDebugInfo.h index 4c3ea5faf1b..e28b34f5d17 100644 --- a/src/xrpld/app/paths/detail/FlowDebugInfo.h +++ b/src/xrpld/app/paths/detail/FlowDebugInfo.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/paths/detail/PaySteps.cpp b/src/xrpld/app/paths/detail/PaySteps.cpp index b73b1ac8acc..99f212d5481 100644 --- a/src/xrpld/app/paths/detail/PaySteps.cpp +++ b/src/xrpld/app/paths/detail/PaySteps.cpp @@ -19,16 +19,13 @@ #include #include + #include -#include #include -#include #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StepChecks.h b/src/xrpld/app/paths/detail/StepChecks.h index d4fda2bfe62..4acafd1b9aa 100644 --- a/src/xrpld/app/paths/detail/StepChecks.h +++ b/src/xrpld/app/paths/detail/StepChecks.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/paths/detail/Steps.h b/src/xrpld/app/paths/detail/Steps.h index dee90f617a5..bb9abf6545b 100644 --- a/src/xrpld/app/paths/detail/Steps.h +++ b/src/xrpld/app/paths/detail/Steps.h @@ -21,6 +21,7 @@ #define RIPPLE_APP_PATHS_IMPL_PAYSTEPS_H_INCLUDED #include + #include #include #include @@ -28,6 +29,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/paths/detail/StrandFlow.h b/src/xrpld/app/paths/detail/StrandFlow.h index 0e168b73cce..47037c5f5e7 100644 --- a/src/xrpld/app/paths/detail/StrandFlow.h +++ b/src/xrpld/app/paths/detail/StrandFlow.h @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include @@ -39,7 +39,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index ab211a7c856..4f38a7b422e 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/RelationalDatabase.h b/src/xrpld/app/rdb/RelationalDatabase.h index a7528e2370d..927b08d3853 100644 --- a/src/xrpld/app/rdb/RelationalDatabase.h +++ b/src/xrpld/app/rdb/RelationalDatabase.h @@ -25,11 +25,11 @@ #include #include #include -#include #include + #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/app/rdb/State.h b/src/xrpld/app/rdb/State.h index e65e9d4d57a..595e749f187 100644 --- a/src/xrpld/app/rdb/State.h +++ b/src/xrpld/app/rdb/State.h @@ -25,6 +25,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/Wallet.h b/src/xrpld/app/rdb/Wallet.h index 6130c9fc263..5cbb3565209 100644 --- a/src/xrpld/app/rdb/Wallet.h +++ b/src/xrpld/app/rdb/Wallet.h @@ -20,12 +20,10 @@ #ifndef RIPPLE_APP_RDB_WALLET_H_INCLUDED #define RIPPLE_APP_RDB_WALLET_H_INCLUDED -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.cpp b/src/xrpld/app/rdb/backend/detail/Node.cpp index 493e277bfcd..a230eac6e3d 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.cpp +++ b/src/xrpld/app/rdb/backend/detail/Node.cpp @@ -22,16 +22,17 @@ #include #include #include -#include #include #include #include #include + #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/backend/detail/Node.h b/src/xrpld/app/rdb/backend/detail/Node.h index 59c484d2063..0e8c678be5e 100644 --- a/src/xrpld/app/rdb/backend/detail/Node.h +++ b/src/xrpld/app/rdb/backend/detail/Node.h @@ -21,12 +21,8 @@ #define RIPPLE_APP_RDB_BACKEND_DETAIL_NODE_H_INCLUDED #include -#include #include #include -#include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp index 95836a85bbf..edd1fb2174e 100644 --- a/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp +++ b/src/xrpld/app/rdb/backend/detail/SQLiteDatabase.cpp @@ -17,20 +17,15 @@ */ //============================================================================== -#include #include -#include #include -#include #include #include #include #include #include -#include + #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Vacuum.cpp b/src/xrpld/app/rdb/detail/Vacuum.cpp index 3c61fb5790a..4231f090a30 100644 --- a/src/xrpld/app/rdb/detail/Vacuum.cpp +++ b/src/xrpld/app/rdb/detail/Vacuum.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/rdb/detail/Wallet.cpp b/src/xrpld/app/rdb/detail/Wallet.cpp index ffb28596918..0a329f2ccb3 100644 --- a/src/xrpld/app/rdb/detail/Wallet.cpp +++ b/src/xrpld/app/rdb/detail/Wallet.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/apply.h b/src/xrpld/app/tx/apply.h index 38325252c99..101f9a946d5 100644 --- a/src/xrpld/app/tx/apply.h +++ b/src/xrpld/app/tx/apply.h @@ -23,10 +23,10 @@ #include #include #include + #include #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/applySteps.h b/src/xrpld/app/tx/applySteps.h index c1eb17c9920..2a5557ff4b0 100644 --- a/src/xrpld/app/tx/applySteps.h +++ b/src/xrpld/app/tx/applySteps.h @@ -21,6 +21,7 @@ #define RIPPLE_TX_APPLYSTEPS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMBid.cpp b/src/xrpld/app/tx/detail/AMMBid.cpp index e8a14c14922..6fec46be903 100644 --- a/src/xrpld/app/tx/detail/AMMBid.cpp +++ b/src/xrpld/app/tx/detail/AMMBid.cpp @@ -17,15 +17,14 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMClawback.cpp b/src/xrpld/app/tx/detail/AMMClawback.cpp index 162224ff913..64a42374ec5 100644 --- a/src/xrpld/app/tx/detail/AMMClawback.cpp +++ b/src/xrpld/app/tx/detail/AMMClawback.cpp @@ -23,12 +23,12 @@ #include #include #include -#include + #include #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMCreate.cpp b/src/xrpld/app/tx/detail/AMMCreate.cpp index 31773166d4a..deafa6f27a9 100644 --- a/src/xrpld/app/tx/detail/AMMCreate.cpp +++ b/src/xrpld/app/tx/detail/AMMCreate.cpp @@ -17,16 +17,15 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include + #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDelete.cpp b/src/xrpld/app/tx/detail/AMMDelete.cpp index 430ac17e87b..28d56eab989 100644 --- a/src/xrpld/app/tx/detail/AMMDelete.cpp +++ b/src/xrpld/app/tx/detail/AMMDelete.cpp @@ -17,13 +17,11 @@ */ //============================================================================== -#include - #include +#include #include + #include -#include -#include #include #include diff --git a/src/xrpld/app/tx/detail/AMMDeposit.cpp b/src/xrpld/app/tx/detail/AMMDeposit.cpp index 675f560098c..6a718a3f04d 100644 --- a/src/xrpld/app/tx/detail/AMMDeposit.cpp +++ b/src/xrpld/app/tx/detail/AMMDeposit.cpp @@ -17,19 +17,16 @@ */ //============================================================================== -#include - #include #include +#include #include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/AMMVote.cpp b/src/xrpld/app/tx/detail/AMMVote.cpp index 1b8b91e518a..84d0905a221 100644 --- a/src/xrpld/app/tx/detail/AMMVote.cpp +++ b/src/xrpld/app/tx/detail/AMMVote.cpp @@ -17,14 +17,12 @@ */ //============================================================================== -#include - -#include #include +#include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/AMMWithdraw.cpp b/src/xrpld/app/tx/detail/AMMWithdraw.cpp index 23e8529cfc9..586f453c6f9 100644 --- a/src/xrpld/app/tx/detail/AMMWithdraw.cpp +++ b/src/xrpld/app/tx/detail/AMMWithdraw.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include - #include #include +#include #include + #include #include -#include #include -#include - namespace ripple { NotTEC diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index 5a37f74b2f0..71fe246f157 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -19,12 +19,10 @@ #include #include -#include + #include #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 1ddcff55065..715d4ea471a 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -23,11 +23,12 @@ #include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.cpp b/src/xrpld/app/tx/detail/BookTip.cpp index 011d992dd72..a766efbde19 100644 --- a/src/xrpld/app/tx/detail/BookTip.cpp +++ b/src/xrpld/app/tx/detail/BookTip.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/BookTip.h b/src/xrpld/app/tx/detail/BookTip.h index 4de6b785b90..f215cdb6208 100644 --- a/src/xrpld/app/tx/detail/BookTip.h +++ b/src/xrpld/app/tx/detail/BookTip.h @@ -21,11 +21,10 @@ #define RIPPLE_APP_BOOK_BOOKTIP_H_INCLUDED #include + #include #include -#include - namespace ripple { class Logs; diff --git a/src/xrpld/app/tx/detail/CancelCheck.cpp b/src/xrpld/app/tx/detail/CancelCheck.cpp index 7954e86cf3b..cfa3bd10e2d 100644 --- a/src/xrpld/app/tx/detail/CancelCheck.cpp +++ b/src/xrpld/app/tx/detail/CancelCheck.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.cpp b/src/xrpld/app/tx/detail/CancelOffer.cpp index 30e955a8282..6d8c077a621 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.cpp +++ b/src/xrpld/app/tx/detail/CancelOffer.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/CancelOffer.h b/src/xrpld/app/tx/detail/CancelOffer.h index 0942e61282b..0813dd0aef6 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.h +++ b/src/xrpld/app/tx/detail/CancelOffer.h @@ -21,8 +21,7 @@ #define RIPPLE_TX_CANCELOFFER_H_INCLUDED #include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CashCheck.cpp b/src/xrpld/app/tx/detail/CashCheck.cpp index f6e5f6f3e3f..468adbd209b 100644 --- a/src/xrpld/app/tx/detail/CashCheck.cpp +++ b/src/xrpld/app/tx/detail/CashCheck.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index 2f5d1c6e317..e40e61ff94e 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Change.h b/src/xrpld/app/tx/detail/Change.h index b0780a75c04..d710827dd63 100644 --- a/src/xrpld/app/tx/detail/Change.h +++ b/src/xrpld/app/tx/detail/Change.h @@ -20,12 +20,7 @@ #ifndef RIPPLE_TX_CHANGE_H_INCLUDED #define RIPPLE_TX_CHANGE_H_INCLUDED -#include -#include -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Clawback.cpp b/src/xrpld/app/tx/detail/Clawback.cpp index d60acf9fd73..e58faf2286b 100644 --- a/src/xrpld/app/tx/detail/Clawback.cpp +++ b/src/xrpld/app/tx/detail/Clawback.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateCheck.cpp b/src/xrpld/app/tx/detail/CreateCheck.cpp index 3a278eed738..19ef28b8438 100644 --- a/src/xrpld/app/tx/detail/CreateCheck.cpp +++ b/src/xrpld/app/tx/detail/CreateCheck.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include +#include + #include #include #include -#include #include #include diff --git a/src/xrpld/app/tx/detail/CreateOffer.cpp b/src/xrpld/app/tx/detail/CreateOffer.cpp index f1b66468840..92ba54f0774 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.cpp +++ b/src/xrpld/app/tx/detail/CreateOffer.cpp @@ -21,10 +21,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateOffer.h b/src/xrpld/app/tx/detail/CreateOffer.h index 234267804c9..35808c78fed 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.h +++ b/src/xrpld/app/tx/detail/CreateOffer.h @@ -23,7 +23,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.cpp b/src/xrpld/app/tx/detail/CreateTicket.cpp index b04f4af1d30..594335f4897 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.cpp +++ b/src/xrpld/app/tx/detail/CreateTicket.cpp @@ -17,13 +17,12 @@ */ //============================================================================== -#include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/CreateTicket.h b/src/xrpld/app/tx/detail/CreateTicket.h index 099dcde9347..86cf91bb5af 100644 --- a/src/xrpld/app/tx/detail/CreateTicket.h +++ b/src/xrpld/app/tx/detail/CreateTicket.h @@ -22,8 +22,6 @@ #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Credentials.cpp b/src/xrpld/app/tx/detail/Credentials.cpp index ca80bc159e3..73c397cf371 100644 --- a/src/xrpld/app/tx/detail/Credentials.cpp +++ b/src/xrpld/app/tx/detail/Credentials.cpp @@ -19,15 +19,13 @@ #include #include - -#include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Credentials.h b/src/xrpld/app/tx/detail/Credentials.h index 7e7522d82c1..5b4acb39981 100644 --- a/src/xrpld/app/tx/detail/Credentials.h +++ b/src/xrpld/app/tx/detail/Credentials.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_CREDENTIALS_H_INCLUDED +#define RIPPLE_TX_CREDENTIALS_H_INCLUDED #include @@ -85,3 +86,5 @@ class CredentialAccept : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/DID.cpp b/src/xrpld/app/tx/detail/DID.cpp index 6e5a3108c72..31ce7c8770b 100644 --- a/src/xrpld/app/tx/detail/DID.cpp +++ b/src/xrpld/app/tx/detail/DID.cpp @@ -18,14 +18,13 @@ //============================================================================== #include - #include #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.cpp b/src/xrpld/app/tx/detail/DeleteAccount.cpp index 18ddf01a8d7..d5620694604 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.cpp +++ b/src/xrpld/app/tx/detail/DeleteAccount.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include @@ -33,7 +34,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteAccount.h b/src/xrpld/app/tx/detail/DeleteAccount.h index 5f88a9ba718..c9d3305562c 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.h +++ b/src/xrpld/app/tx/detail/DeleteAccount.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_DELETEACCOUNT_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/DeleteOracle.cpp b/src/xrpld/app/tx/detail/DeleteOracle.cpp index 807e52ee6b4..78e3d552303 100644 --- a/src/xrpld/app/tx/detail/DeleteOracle.cpp +++ b/src/xrpld/app/tx/detail/DeleteOracle.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/DepositPreauth.cpp b/src/xrpld/app/tx/detail/DepositPreauth.cpp index 599fcd60526..f10f09b38fe 100644 --- a/src/xrpld/app/tx/detail/DepositPreauth.cpp +++ b/src/xrpld/app/tx/detail/DepositPreauth.cpp @@ -20,11 +20,11 @@ #include #include #include + #include #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 41b51b295f5..165a6df5f43 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -17,24 +17,21 @@ */ //============================================================================== -#include - #include #include #include +#include #include #include #include #include + #include #include -#include #include #include #include #include -#include -#include // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that diff --git a/src/xrpld/app/tx/detail/InvariantCheck.cpp b/src/xrpld/app/tx/detail/InvariantCheck.cpp index d39492c1085..b97a0c02eea 100644 --- a/src/xrpld/app/tx/detail/InvariantCheck.cpp +++ b/src/xrpld/app/tx/detail/InvariantCheck.cpp @@ -17,13 +17,13 @@ */ //============================================================================== -#include - #include +#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.cpp b/src/xrpld/app/tx/detail/LedgerStateFix.cpp index 568ed49304a..008d9b6ae7b 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.cpp +++ b/src/xrpld/app/tx/detail/LedgerStateFix.cpp @@ -18,12 +18,11 @@ //============================================================================== #include - #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/LedgerStateFix.h b/src/xrpld/app/tx/detail/LedgerStateFix.h index b480d239291..bff51a723c2 100644 --- a/src/xrpld/app/tx/detail/LedgerStateFix.h +++ b/src/xrpld/app/tx/detail/LedgerStateFix.h @@ -21,8 +21,6 @@ #define RIPPLE_TX_LEDGER_STATE_FIX_H_INCLUDED #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp index 8042c9c6982..cfc098ab0fa 100644 --- a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp +++ b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp index 1297a918e1d..1bd3fcadd74 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceCreate.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp index a0f0b9d8602..ed5d3c4f965 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceDestroy.cpp @@ -18,11 +18,10 @@ //============================================================================== #include - #include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp index 4e395c30be6..12208dba1b6 100644 --- a/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp +++ b/src/xrpld/app/tx/detail/MPTokenIssuanceSet.cpp @@ -18,10 +18,9 @@ //============================================================================== #include -#include + #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp index 9ae6616e382..4c5fdb7683d 100644 --- a/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenAcceptOffer.cpp @@ -20,10 +20,10 @@ #include #include #include + #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenBurn.cpp b/src/xrpld/app/tx/detail/NFTokenBurn.cpp index 725e35791f9..947a663f920 100644 --- a/src/xrpld/app/tx/detail/NFTokenBurn.cpp +++ b/src/xrpld/app/tx/detail/NFTokenBurn.cpp @@ -19,13 +19,10 @@ #include #include -#include + #include #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp index ef66ceecd0c..f6072bc9534 100644 --- a/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCancelOffer.cpp @@ -20,9 +20,10 @@ #include #include #include + #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp index 43178d31b4a..8e1a026415b 100644 --- a/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp +++ b/src/xrpld/app/tx/detail/NFTokenCreateOffer.cpp @@ -20,10 +20,9 @@ #include #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.cpp b/src/xrpld/app/tx/detail/NFTokenMint.cpp index 76e561cfc3f..42b551b3a4d 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.cpp +++ b/src/xrpld/app/tx/detail/NFTokenMint.cpp @@ -19,14 +19,15 @@ #include #include + #include -#include #include #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenMint.h b/src/xrpld/app/tx/detail/NFTokenMint.h index c95fd5944e4..f606120c545 100644 --- a/src/xrpld/app/tx/detail/NFTokenMint.h +++ b/src/xrpld/app/tx/detail/NFTokenMint.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenModify.cpp b/src/xrpld/app/tx/detail/NFTokenModify.cpp index 7e616ea6ca0..a3803c423b6 100644 --- a/src/xrpld/app/tx/detail/NFTokenModify.cpp +++ b/src/xrpld/app/tx/detail/NFTokenModify.cpp @@ -19,11 +19,9 @@ #include #include -#include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.cpp b/src/xrpld/app/tx/detail/NFTokenUtils.cpp index 04eb53ae764..9c9754aa95a 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.cpp +++ b/src/xrpld/app/tx/detail/NFTokenUtils.cpp @@ -20,12 +20,13 @@ #include #include #include + #include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/NFTokenUtils.h b/src/xrpld/app/tx/detail/NFTokenUtils.h index f5232630eef..38ced59e9c9 100644 --- a/src/xrpld/app/tx/detail/NFTokenUtils.h +++ b/src/xrpld/app/tx/detail/NFTokenUtils.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include #include diff --git a/src/xrpld/app/tx/detail/Offer.h b/src/xrpld/app/tx/detail/Offer.h index 23129952c3d..abc0212335d 100644 --- a/src/xrpld/app/tx/detail/Offer.h +++ b/src/xrpld/app/tx/detail/Offer.h @@ -21,12 +21,13 @@ #define RIPPLE_APP_BOOK_OFFER_H_INCLUDED #include + #include #include #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/OfferStream.cpp b/src/xrpld/app/tx/detail/OfferStream.cpp index 4e1cdd9b238..7640cca206b 100644 --- a/src/xrpld/app/tx/detail/OfferStream.cpp +++ b/src/xrpld/app/tx/detail/OfferStream.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/OfferStream.h b/src/xrpld/app/tx/detail/OfferStream.h index be224a67b4e..cf6c1c3d2d3 100644 --- a/src/xrpld/app/tx/detail/OfferStream.h +++ b/src/xrpld/app/tx/detail/OfferStream.h @@ -23,10 +23,10 @@ #include #include #include + #include #include #include -#include #include diff --git a/src/xrpld/app/tx/detail/PayChan.cpp b/src/xrpld/app/tx/detail/PayChan.cpp index aa248075d56..fa5d44fb000 100644 --- a/src/xrpld/app/tx/detail/PayChan.cpp +++ b/src/xrpld/app/tx/detail/PayChan.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include @@ -30,7 +31,6 @@ #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.cpp b/src/xrpld/app/tx/detail/Payment.cpp index 1ed3bacbbd8..c2b7b23a6a5 100644 --- a/src/xrpld/app/tx/detail/Payment.cpp +++ b/src/xrpld/app/tx/detail/Payment.cpp @@ -21,12 +21,12 @@ #include #include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Payment.h b/src/xrpld/app/tx/detail/Payment.h index 3176ae1c0d3..775d4e8d46b 100644 --- a/src/xrpld/app/tx/detail/Payment.h +++ b/src/xrpld/app/tx/detail/Payment.h @@ -20,10 +20,7 @@ #ifndef RIPPLE_TX_PAYMENT_H_INCLUDED #define RIPPLE_TX_PAYMENT_H_INCLUDED -#include #include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp index 4c2bd6f8d85..64c498b68b1 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h index ce0d1f14d86..8b5fa68e59d 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainDelete.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainDelete.h @@ -17,7 +17,8 @@ */ //============================================================================== -#pragma once +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINDELETE_H_INCLUDED #include @@ -44,3 +45,5 @@ class PermissionedDomainDelete : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp index a5141523b3c..6e2df2a0829 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/PermissionedDomainSet.h b/src/xrpld/app/tx/detail/PermissionedDomainSet.h index 7419770946f..502d576e329 100644 --- a/src/xrpld/app/tx/detail/PermissionedDomainSet.h +++ b/src/xrpld/app/tx/detail/PermissionedDomainSet.h @@ -16,7 +16,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#pragma once + +#ifndef RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED +#define RIPPLE_TX_PERMISSIONEDDOMAINSET_H_INCLUDED #include @@ -43,3 +45,5 @@ class PermissionedDomainSet : public Transactor }; } // namespace ripple + +#endif diff --git a/src/xrpld/app/tx/detail/SetAccount.cpp b/src/xrpld/app/tx/detail/SetAccount.cpp index c0e115c2497..d871cc32800 100644 --- a/src/xrpld/app/tx/detail/SetAccount.cpp +++ b/src/xrpld/app/tx/detail/SetAccount.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetAccount.h b/src/xrpld/app/tx/detail/SetAccount.h index 62cae28e51c..4604a11a6c6 100644 --- a/src/xrpld/app/tx/detail/SetAccount.h +++ b/src/xrpld/app/tx/detail/SetAccount.h @@ -21,10 +21,7 @@ #define RIPPLE_TX_SETACCOUNT_H_INCLUDED #include -#include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetOracle.cpp b/src/xrpld/app/tx/detail/SetOracle.cpp index 055143cc6fd..8559c3e7b9e 100644 --- a/src/xrpld/app/tx/detail/SetOracle.cpp +++ b/src/xrpld/app/tx/detail/SetOracle.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.cpp b/src/xrpld/app/tx/detail/SetRegularKey.cpp index 9f165612f3a..92d130a15ae 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.cpp +++ b/src/xrpld/app/tx/detail/SetRegularKey.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetRegularKey.h b/src/xrpld/app/tx/detail/SetRegularKey.h index 89a714342ff..055748aa250 100644 --- a/src/xrpld/app/tx/detail/SetRegularKey.h +++ b/src/xrpld/app/tx/detail/SetRegularKey.h @@ -21,9 +21,6 @@ #define RIPPLE_TX_SETREGULARKEY_H_INCLUDED #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SetSignerList.cpp b/src/xrpld/app/tx/detail/SetSignerList.cpp index 173107e02ae..4a1ee703a07 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.cpp +++ b/src/xrpld/app/tx/detail/SetSignerList.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include - #include +#include #include + #include #include #include diff --git a/src/xrpld/app/tx/detail/SetSignerList.h b/src/xrpld/app/tx/detail/SetSignerList.h index 35951645c21..1827aca9756 100644 --- a/src/xrpld/app/tx/detail/SetSignerList.h +++ b/src/xrpld/app/tx/detail/SetSignerList.h @@ -20,16 +20,12 @@ #ifndef RIPPLE_TX_SETSIGNERLIST_H_INCLUDED #define RIPPLE_TX_SETSIGNERLIST_H_INCLUDED -#include #include #include -#include -#include + #include -#include -#include #include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/SetTrust.cpp b/src/xrpld/app/tx/detail/SetTrust.cpp index b1e0494ba46..93abcdc4c4d 100644 --- a/src/xrpld/app/tx/detail/SetTrust.cpp +++ b/src/xrpld/app/tx/detail/SetTrust.cpp @@ -19,12 +19,12 @@ #include #include + #include #include #include #include #include -#include namespace { diff --git a/src/xrpld/app/tx/detail/SetTrust.h b/src/xrpld/app/tx/detail/SetTrust.h index 6e5a72b3062..7a5394c6841 100644 --- a/src/xrpld/app/tx/detail/SetTrust.h +++ b/src/xrpld/app/tx/detail/SetTrust.h @@ -21,9 +21,7 @@ #define RIPPLE_TX_SETTRUST_H_INCLUDED #include -#include -#include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/SignerEntries.cpp b/src/xrpld/app/tx/detail/SignerEntries.cpp index cab362a8e3b..e5e159862af 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.cpp +++ b/src/xrpld/app/tx/detail/SignerEntries.cpp @@ -18,9 +18,11 @@ //============================================================================== #include + #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/SignerEntries.h b/src/xrpld/app/tx/detail/SignerEntries.h index 2227aa98109..bd16398f561 100644 --- a/src/xrpld/app/tx/detail/SignerEntries.h +++ b/src/xrpld/app/tx/detail/SignerEntries.h @@ -21,12 +21,11 @@ #define RIPPLE_TX_IMPL_SIGNER_ENTRIES_H_INCLUDED #include // NotTEC -#include // -#include // beast::Journal -#include // Rules -#include // STTx::maxMultiSigners -#include // temMALFORMED -#include // AccountID + +#include // +#include // beast::Journal +#include // temMALFORMED +#include // AccountID #include #include diff --git a/src/xrpld/app/tx/detail/Taker.cpp b/src/xrpld/app/tx/detail/Taker.cpp index e98d65fd114..9bfd6dc1d3d 100644 --- a/src/xrpld/app/tx/detail/Taker.cpp +++ b/src/xrpld/app/tx/detail/Taker.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/app/tx/detail/Taker.h b/src/xrpld/app/tx/detail/Taker.h index 3e64c59b542..3702a30deb7 100644 --- a/src/xrpld/app/tx/detail/Taker.h +++ b/src/xrpld/app/tx/detail/Taker.h @@ -21,14 +21,13 @@ #define RIPPLE_APP_BOOK_TAKER_H_INCLUDED #include -#include #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.cpp b/src/xrpld/app/tx/detail/Transactor.cpp index f192126387d..d11c20c610d 100644 --- a/src/xrpld/app/tx/detail/Transactor.cpp +++ b/src/xrpld/app/tx/detail/Transactor.cpp @@ -26,13 +26,13 @@ #include #include #include + #include #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/Transactor.h b/src/xrpld/app/tx/detail/Transactor.h index a4ba3bfed25..e98269c38a0 100644 --- a/src/xrpld/app/tx/detail/Transactor.h +++ b/src/xrpld/app/tx/detail/Transactor.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.cpp b/src/xrpld/app/tx/detail/XChainBridge.cpp index 0c6be61040c..5fa03557e5a 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.cpp +++ b/src/xrpld/app/tx/detail/XChainBridge.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -41,8 +42,7 @@ #include #include #include -#include -#include + #include #include diff --git a/src/xrpld/app/tx/detail/XChainBridge.h b/src/xrpld/app/tx/detail/XChainBridge.h index 2e5e927d120..82b64cc0e35 100644 --- a/src/xrpld/app/tx/detail/XChainBridge.h +++ b/src/xrpld/app/tx/detail/XChainBridge.h @@ -21,7 +21,7 @@ #define RIPPLE_TX_XCHAINBRIDGE_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/app/tx/detail/apply.cpp b/src/xrpld/app/tx/detail/apply.cpp index 03b0c3d74d6..615fd6a92d3 100644 --- a/src/xrpld/app/tx/detail/apply.cpp +++ b/src/xrpld/app/tx/detail/apply.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/app/tx/detail/applySteps.cpp b/src/xrpld/app/tx/detail/applySteps.cpp index 95cc3521a91..4cb505db50c 100644 --- a/src/xrpld/app/tx/detail/applySteps.cpp +++ b/src/xrpld/app/tx/detail/applySteps.cpp @@ -61,6 +61,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/conditions/Condition.h b/src/xrpld/conditions/Condition.h index a3120f1b3ca..52408127ec2 100644 --- a/src/xrpld/conditions/Condition.h +++ b/src/xrpld/conditions/Condition.h @@ -21,14 +21,12 @@ #define RIPPLE_CONDITIONS_CONDITION_H #include + #include #include -#include + #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/Fulfillment.h b/src/xrpld/conditions/Fulfillment.h index e70bcf54d41..8e770352a9d 100644 --- a/src/xrpld/conditions/Fulfillment.h +++ b/src/xrpld/conditions/Fulfillment.h @@ -21,7 +21,7 @@ #define RIPPLE_CONDITIONS_FULFILLMENT_H #include -#include + #include #include diff --git a/src/xrpld/conditions/detail/Condition.cpp b/src/xrpld/conditions/detail/Condition.cpp index 3085ace0a31..84c0e4b01a4 100644 --- a/src/xrpld/conditions/detail/Condition.cpp +++ b/src/xrpld/conditions/detail/Condition.cpp @@ -18,12 +18,8 @@ //============================================================================== #include -#include #include #include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/Fulfillment.cpp b/src/xrpld/conditions/detail/Fulfillment.cpp index 285113ebfb2..47fde969a35 100644 --- a/src/xrpld/conditions/detail/Fulfillment.cpp +++ b/src/xrpld/conditions/detail/Fulfillment.cpp @@ -21,9 +21,8 @@ #include #include #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/PreimageSha256.h b/src/xrpld/conditions/detail/PreimageSha256.h index 5185ded7a67..273a29d653d 100644 --- a/src/xrpld/conditions/detail/PreimageSha256.h +++ b/src/xrpld/conditions/detail/PreimageSha256.h @@ -23,9 +23,11 @@ #include #include #include + #include #include #include + #include namespace ripple { diff --git a/src/xrpld/conditions/detail/error.cpp b/src/xrpld/conditions/detail/error.cpp index 3594c9e14da..10a3a43921c 100644 --- a/src/xrpld/conditions/detail/error.cpp +++ b/src/xrpld/conditions/detail/error.cpp @@ -18,10 +18,10 @@ //============================================================================== #include + #include + #include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/conditions/detail/error.h b/src/xrpld/conditions/detail/error.h index 8e8f8cc842d..a701ba88599 100644 --- a/src/xrpld/conditions/detail/error.h +++ b/src/xrpld/conditions/detail/error.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_CONDITIONS_ERROR_H #define RIPPLE_CONDITIONS_ERROR_H -#include #include namespace ripple { diff --git a/src/xrpld/conditions/detail/utils.h b/src/xrpld/conditions/detail/utils.h index 35d9c7dea51..28943bd6403 100644 --- a/src/xrpld/conditions/detail/utils.h +++ b/src/xrpld/conditions/detail/utils.h @@ -21,17 +21,13 @@ #define RIPPLE_CONDITIONS_UTILS_H #include + #include #include -#include + #include -#include + #include -#include -#include -#include -#include -#include namespace ripple { namespace cryptoconditions { diff --git a/src/xrpld/consensus/Consensus.cpp b/src/xrpld/consensus/Consensus.cpp index 3720062fdb5..fb57687df08 100644 --- a/src/xrpld/consensus/Consensus.cpp +++ b/src/xrpld/consensus/Consensus.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { @@ -108,6 +109,7 @@ checkConsensusReached( bool count_self, std::size_t minConsensusPct, bool reachedMax, + bool stalled, std::unique_ptr const& clog) { CLOG(clog) << "checkConsensusReached params: agreeing: " << agreeing @@ -137,6 +139,17 @@ checkConsensusReached( return false; } + // We only get stalled when every disputed transaction unequivocally has 80% + // (minConsensusPct) agreement, either for or against. That is: either under + // 20% or over 80% consensus (repectively "nay" or "yay"). This prevents + // manipulation by a minority of byzantine peers of which transactions make + // the cut to get into the ledger. + if (stalled) + { + CLOG(clog) << "consensus stalled. "; + return true; + } + if (count_self) { ++agreeing; @@ -146,6 +159,7 @@ checkConsensusReached( } std::size_t currentPercentage = (agreeing * 100) / total; + CLOG(clog) << "currentPercentage: " << currentPercentage; bool const ret = currentPercentage >= minConsensusPct; if (ret) @@ -167,6 +181,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -180,7 +195,7 @@ checkConsensus( << " minimum duration to reach consensus: " << parms.ledgerMIN_CONSENSUS.count() << "ms" << " max consensus time " << parms.ledgerMAX_CONSENSUS.count() - << "s" + << "ms" << " minimum consensus percentage: " << parms.minCONSENSUS_PCT << ". "; @@ -210,10 +225,12 @@ checkConsensus( proposing, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + stalled, clog)) { - JLOG(j.debug()) << "normal consensus"; - CLOG(clog) << "reached. "; + JLOG((stalled ? j.warn() : j.debug())) + << "normal consensus" << (stalled ? ", but stalled" : ""); + CLOG(clog) << "reached" << (stalled ? ", but stalled." : "."); return ConsensusState::Yes; } @@ -225,6 +242,7 @@ checkConsensus( false, parms.minCONSENSUS_PCT, currentAgreeTime > parms.ledgerMAX_CONSENSUS, + false, clog)) { JLOG(j.warn()) << "We see no consensus, but 80% of nodes have moved on"; @@ -232,6 +250,19 @@ checkConsensus( return ConsensusState::MovedOn; } + std::chrono::milliseconds const maxAgreeTime = + previousAgreeTime * parms.ledgerABANDON_CONSENSUS_FACTOR; + if (currentAgreeTime > std::clamp( + maxAgreeTime, + parms.ledgerMAX_CONSENSUS, + parms.ledgerABANDON_CONSENSUS)) + { + JLOG(j.warn()) << "consensus taken too long"; + CLOG(clog) << "Consensus taken too long. "; + // Note the Expired result may be overridden by the caller. + return ConsensusState::Expired; + } + // no consensus yet JLOG(j.trace()) << "no consensus"; CLOG(clog) << "No consensus. "; diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index dd53c74b311..948c00a8b26 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -25,12 +25,13 @@ #include #include #include + #include #include #include #include -#include +#include #include #include #include @@ -81,6 +82,10 @@ shouldCloseLedger( last ledger @param currentAgreeTime how long, in milliseconds, we've been trying to agree + @param stalled the network appears to be stalled, where + neither we nor our peers have changed their vote on any disputes in a + while. This is undesirable, and will cause us to end consensus + without 80% agreement. @param parms Consensus constant parameters @param proposing whether we should count ourselves @param j journal for logging @@ -94,6 +99,7 @@ checkConsensus( std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, + bool stalled, ConsensusParms const& parms, bool proposing, beast::Journal j, @@ -574,6 +580,9 @@ class Consensus NetClock::duration closeResolution_ = ledgerDefaultTimeResolution; + ConsensusParms::AvalancheState closeTimeAvalancheState_ = + ConsensusParms::init; + // Time it took for the last consensus round to converge std::chrono::milliseconds prevRoundTime_; @@ -599,6 +608,13 @@ class Consensus std::optional result_; ConsensusCloseTimes rawCloseTimes_; + // The number of calls to phaseEstablish where none of our peers + // have changed any votes on disputed transactions. + std::size_t peerUnchangedCounter_ = 0; + + // The total number of times we have called phaseEstablish + std::size_t establishCounter_ = 0; + //------------------------------------------------------------------------- // Peer related consensus data @@ -696,6 +712,7 @@ Consensus::startRoundInternal( previousLedger_ = prevLedger; result_.reset(); convergePercent_ = 0; + closeTimeAvalancheState_ = ConsensusParms::init; haveCloseTimeConsensus_ = false; openTime_.reset(clock_.now()); currPeerPositions_.clear(); @@ -1196,8 +1213,7 @@ Consensus::phaseOpen(std::unique_ptr const& clog) adaptor_.parms().ledgerIDLE_INTERVAL, 2 * previousLedger_.closeTimeResolution()); CLOG(clog) << "idle interval set to " << idleInterval.count() - << "ms based on " - << "ledgerIDLE_INTERVAL: " + << "ms based on " << "ledgerIDLE_INTERVAL: " << adaptor_.parms().ledgerIDLE_INTERVAL.count() << ", previous ledger close time resolution: " << previousLedger_.closeTimeResolution().count() << "ms. "; @@ -1352,6 +1368,9 @@ Consensus::phaseEstablish( // can only establish consensus if we already took a stance XRPL_ASSERT(result_, "ripple::Consensus::phaseEstablish : result is set"); + ++peerUnchangedCounter_; + ++establishCounter_; + using namespace std::chrono; ConsensusParms const& parms = adaptor_.parms(); @@ -1418,6 +1437,8 @@ Consensus::closeLedger(std::unique_ptr const& clog) phase_ = ConsensusPhase::establish; JLOG(j_.debug()) << "transitioned to ConsensusPhase::establish"; rawCloseTimes_.self = now_; + peerUnchangedCounter_ = 0; + establishCounter_ = 0; result_.emplace(adaptor_.onClose(previousLedger_, now_, mode_.get())); result_->roundTime.reset(clock_.now()); @@ -1551,16 +1572,11 @@ Consensus::updateOurPositions( } else { - int neededWeight; - - if (convergePercent_ < parms.avMID_CONSENSUS_TIME) - neededWeight = parms.avINIT_CONSENSUS_PCT; - else if (convergePercent_ < parms.avLATE_CONSENSUS_TIME) - neededWeight = parms.avMID_CONSENSUS_PCT; - else if (convergePercent_ < parms.avSTUCK_CONSENSUS_TIME) - neededWeight = parms.avLATE_CONSENSUS_PCT; - else - neededWeight = parms.avSTUCK_CONSENSUS_PCT; + // We don't track rounds for close time, so just pass 0s + auto const [neededWeight, newState] = getNeededWeight( + parms, closeTimeAvalancheState_, convergePercent_, 0, 0); + if (newState) + closeTimeAvalancheState_ = *newState; CLOG(clog) << "neededWeight " << neededWeight << ". "; int participants = currPeerPositions_.size(); @@ -1682,7 +1698,8 @@ Consensus::haveConsensus( } else { - JLOG(j_.debug()) << nodeId << " has " << peerProp.position(); + JLOG(j_.debug()) << "Proposal disagreement: Peer " << nodeId + << " has " << peerProp.position(); ++disagree; } } @@ -1692,6 +1709,17 @@ Consensus::haveConsensus( JLOG(j_.debug()) << "Checking for TX consensus: agree=" << agree << ", disagree=" << disagree; + ConsensusParms const& parms = adaptor_.parms(); + // Stalling is BAD + bool const stalled = haveCloseTimeConsensus_ && + std::ranges::all_of(result_->disputes, + [this, &parms](auto const& dispute) { + return dispute.second.stalled( + parms, + mode_.get() == ConsensusMode::proposing, + peerUnchangedCounter_); + }); + // Determine if we actually have consensus or not result_->state = checkConsensus( prevProposers_, @@ -1700,7 +1728,8 @@ Consensus::haveConsensus( currentFinished, prevRoundTime_, result_->roundTime.read(), - adaptor_.parms(), + stalled, + parms, mode_.get() == ConsensusMode::proposing, j_, clog); @@ -1711,6 +1740,33 @@ Consensus::haveConsensus( return false; } + // Consensus has taken far too long. Drop out of the round. + if (result_->state == ConsensusState::Expired) + { + static auto const minimumCounter = + parms.avalancheCutoffs.size() * parms.avMIN_ROUNDS; + std::stringstream ss; + if (establishCounter_ < minimumCounter) + { + // If each round of phaseEstablish takes a very long time, we may + // "expire" before we've given consensus enough time at each + // avalanche level to actually come to a consensus. In that case, + // keep trying. This should only happen if there are an extremely + // large number of disputes such that each round takes an inordinate + // amount of time. + + ss << "Consensus time has expired in round " << establishCounter_ + << "; continue until round " << minimumCounter << ". " + << Json::Compact{getJson(false)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + return false; + } + ss << "Consensus expired. " << Json::Compact{getJson(true)}; + JLOG(j_.error()) << ss.str(); + CLOG(clog) << ss.str() << ". "; + leaveConsensus(clog); + } // There is consensus, but we need to track if the network moved on // without us. if (result_->state == ConsensusState::MovedOn) @@ -1803,8 +1859,9 @@ Consensus::createDisputes( { Proposal_t const& peerProp = peerPos.proposal(); auto const cit = acquired_.find(peerProp.position()); - if (cit != acquired_.end()) - dtx.setVote(nodeId, cit->second.exists(txID)); + if (cit != acquired_.end() && + dtx.setVote(nodeId, cit->second.exists(txID))) + peerUnchangedCounter_ = 0; } adaptor_.share(dtx.tx()); @@ -1829,7 +1886,8 @@ Consensus::updateDisputes(NodeID_t const& node, TxSet_t const& other) for (auto& it : result_->disputes) { auto& d = it.second; - d.setVote(node, other.exists(d.tx().id())); + if (d.setVote(node, other.exists(d.tx().id()))) + peerUnchangedCounter_ = 0; } } diff --git a/src/xrpld/consensus/ConsensusParms.h b/src/xrpld/consensus/ConsensusParms.h index a0b6c6be8d4..9bfacfb8d6f 100644 --- a/src/xrpld/consensus/ConsensusParms.h +++ b/src/xrpld/consensus/ConsensusParms.h @@ -20,8 +20,13 @@ #ifndef RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUS_PARMS_H_INCLUDED +#include + #include #include +#include +#include +#include namespace ripple { @@ -43,7 +48,7 @@ struct ConsensusParms This is a safety to protect against very old validations and the time it takes to adjust the close time accuracy window. */ - std::chrono::seconds validationVALID_WALL = std::chrono::minutes{5}; + std::chrono::seconds const validationVALID_WALL = std::chrono::minutes{5}; /** Duration a validation remains current after first observed. @@ -51,33 +56,34 @@ struct ConsensusParms first saw it. This provides faster recovery in very rare cases where the number of validations produced by the network is lower than normal */ - std::chrono::seconds validationVALID_LOCAL = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_LOCAL = std::chrono::minutes{3}; /** Duration pre-close in which validations are acceptable. The number of seconds before a close time that we consider a validation acceptable. This protects against extreme clock errors */ - std::chrono::seconds validationVALID_EARLY = std::chrono::minutes{3}; + std::chrono::seconds const validationVALID_EARLY = std::chrono::minutes{3}; //! How long we consider a proposal fresh - std::chrono::seconds proposeFRESHNESS = std::chrono::seconds{20}; + std::chrono::seconds const proposeFRESHNESS = std::chrono::seconds{20}; //! How often we force generating a new proposal to keep ours fresh - std::chrono::seconds proposeINTERVAL = std::chrono::seconds{12}; + std::chrono::seconds const proposeINTERVAL = std::chrono::seconds{12}; //------------------------------------------------------------------------- // Consensus durations are relative to the internal Consensus clock and use // millisecond resolution. //! The percentage threshold above which we can declare consensus. - std::size_t minCONSENSUS_PCT = 80; + std::size_t const minCONSENSUS_PCT = 80; //! The duration a ledger may remain idle before closing - std::chrono::milliseconds ledgerIDLE_INTERVAL = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerIDLE_INTERVAL = + std::chrono::seconds{15}; //! The number of seconds we wait minimum to ensure participation - std::chrono::milliseconds ledgerMIN_CONSENSUS = + std::chrono::milliseconds const ledgerMIN_CONSENSUS = std::chrono::milliseconds{1950}; /** The maximum amount of time to spend pausing for laggards. @@ -86,13 +92,26 @@ struct ConsensusParms * validators don't appear to be offline that are merely waiting for * laggards. */ - std::chrono::milliseconds ledgerMAX_CONSENSUS = std::chrono::seconds{15}; + std::chrono::milliseconds const ledgerMAX_CONSENSUS = + std::chrono::seconds{15}; //! Minimum number of seconds to wait to ensure others have computed the LCL - std::chrono::milliseconds ledgerMIN_CLOSE = std::chrono::seconds{2}; + std::chrono::milliseconds const ledgerMIN_CLOSE = std::chrono::seconds{2}; //! How often we check state or change positions - std::chrono::milliseconds ledgerGRANULARITY = std::chrono::seconds{1}; + std::chrono::milliseconds const ledgerGRANULARITY = std::chrono::seconds{1}; + + //! How long to wait before completely abandoning consensus + std::size_t const ledgerABANDON_CONSENSUS_FACTOR = 10; + + /** + * Maximum amount of time to give a consensus round + * + * Does not include the time to build the LCL, so there is no reason for a + * round to go this long, regardless of how big the ledger is. + */ + std::chrono::milliseconds const ledgerABANDON_CONSENSUS = + std::chrono::seconds{120}; /** The minimum amount of time to consider the previous round to have taken. @@ -104,38 +123,80 @@ struct ConsensusParms twice the interval between proposals (0.7s) divided by the interval between mid and late consensus ([85-50]/100). */ - std::chrono::milliseconds avMIN_CONSENSUS_TIME = std::chrono::seconds{5}; + std::chrono::milliseconds const avMIN_CONSENSUS_TIME = + std::chrono::seconds{5}; //------------------------------------------------------------------------------ // Avalanche tuning // As a function of the percent this round's duration is of the prior round, // we increase the threshold for yes votes to add a transaction to our // position. + enum AvalancheState { init, mid, late, stuck }; + struct AvalancheCutoff + { + int const consensusTime; + std::size_t const consensusPct; + AvalancheState const next; + }; + //! Map the consensus requirement avalanche state to the amount of time that + //! must pass before moving to that state, the agreement percentage required + //! at that state, and the next state. "stuck" loops back on itself because + //! once we're stuck, we're stuck. + //! This structure allows for "looping" of states if needed. + std::map const avalancheCutoffs{ + // {state, {time, percent, nextState}}, + // Initial state: 50% of nodes must vote yes + {init, {0, 50, mid}}, + // mid-consensus starts after 50% of the previous round time, and + // requires 65% yes + {mid, {50, 65, late}}, + // late consensus starts after 85% time, and requires 70% yes + {late, {85, 70, stuck}}, + // we're stuck after 2x time, requires 95% yes votes + {stuck, {200, 95, stuck}}, + }; - //! Percentage of nodes on our UNL that must vote yes - std::size_t avINIT_CONSENSUS_PCT = 50; - - //! Percentage of previous round duration before we advance - std::size_t avMID_CONSENSUS_TIME = 50; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avMID_CONSENSUS_PCT = 65; - - //! Percentage of previous round duration before we advance - std::size_t avLATE_CONSENSUS_TIME = 85; - - //! Percentage of nodes that most vote yes after advancing - std::size_t avLATE_CONSENSUS_PCT = 70; - - //! Percentage of previous round duration before we are stuck - std::size_t avSTUCK_CONSENSUS_TIME = 200; + //! Percentage of nodes required to reach agreement on ledger close time + std::size_t const avCT_CONSENSUS_PCT = 75; - //! Percentage of nodes that must vote yes after we are stuck - std::size_t avSTUCK_CONSENSUS_PCT = 95; + //! Number of rounds before certain actions can happen. + // (Moving to the next avalanche level, considering that votes are stalled + // without consensus.) + std::size_t const avMIN_ROUNDS = 2; - //! Percentage of nodes required to reach agreement on ledger close time - std::size_t avCT_CONSENSUS_PCT = 75; + //! Number of rounds before a stuck vote is considered unlikely to change + //! because voting stalled + std::size_t const avSTALLED_ROUNDS = 4; }; +inline std::pair> +getNeededWeight( + ConsensusParms const& p, + ConsensusParms::AvalancheState currentState, + int percentTime, + std::size_t currentRounds, + std::size_t minimumRounds) +{ + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(currentState); + // Should we consider moving to the next state? + if (currentCutoff.next != currentState && currentRounds >= minimumRounds) + { + // at() can throw, but the map is built by hand to ensure all + // valid values are available. + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + // See if enough time has passed to move on to the next. + XRPL_ASSERT( + nextCutoff.consensusTime >= currentCutoff.consensusTime, + "ripple::getNeededWeight : next state valid"); + if (percentTime >= nextCutoff.consensusTime) + { + return {nextCutoff.consensusPct, currentCutoff.next}; + } + } + return {currentCutoff.consensusPct, {}}; +} + } // namespace ripple #endif diff --git a/src/xrpld/consensus/ConsensusProposal.h b/src/xrpld/consensus/ConsensusProposal.h index 18dcf60006b..6734d59205a 100644 --- a/src/xrpld/consensus/ConsensusProposal.h +++ b/src/xrpld/consensus/ConsensusProposal.h @@ -16,6 +16,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #ifndef RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED #define RIPPLE_CONSENSUS_CONSENSUSPROPOSAL_H_INCLUDED @@ -23,7 +24,9 @@ #include #include #include +#include #include + #include #include #include diff --git a/src/xrpld/consensus/ConsensusTypes.h b/src/xrpld/consensus/ConsensusTypes.h index ba8e0a8b1ac..ccb421abed0 100644 --- a/src/xrpld/consensus/ConsensusTypes.h +++ b/src/xrpld/consensus/ConsensusTypes.h @@ -22,7 +22,9 @@ #include #include + #include + #include #include @@ -186,6 +188,7 @@ struct ConsensusCloseTimes enum class ConsensusState { No, //!< We do not have consensus MovedOn, //!< The network has consensus without us + Expired, //!< Consensus time limit has hard-expired Yes //!< We have consensus along with the network }; @@ -235,7 +238,7 @@ struct ConsensusResult ConsensusTimer roundTime; // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn + // will be either Yes or MovedOn or Expired ConsensusState state = ConsensusState::No; // The number of peers proposing during the round diff --git a/src/xrpld/consensus/DisputedTx.h b/src/xrpld/consensus/DisputedTx.h index bffb1009323..513f2408294 100644 --- a/src/xrpld/consensus/DisputedTx.h +++ b/src/xrpld/consensus/DisputedTx.h @@ -21,14 +21,12 @@ #define RIPPLE_APP_CONSENSUS_IMPL_DISPUTEDTX_H_INCLUDED #include + #include -#include #include #include -#include -#include + #include -#include namespace ripple { @@ -84,6 +82,51 @@ class DisputedTx return ourVote_; } + //! Are we and our peers "stalled" where we probably won't change + //! our vote? + bool + stalled(ConsensusParms const& p, bool proposing, int peersUnchanged) const + { + // at() can throw, but the map is built by hand to ensure all valid + // values are available. + auto const& currentCutoff = p.avalancheCutoffs.at(avalancheState_); + auto const& nextCutoff = p.avalancheCutoffs.at(currentCutoff.next); + + // We're have not reached the final avalanche state, or been there long + // enough, so there's room for change. Check the times in case the state + // machine is altered to allow states to loop. + if (nextCutoff.consensusTime > currentCutoff.consensusTime || + avalancheCounter_ < p.avMIN_ROUNDS) + return false; + + // We've haven't had this vote for minimum rounds yet. Things could + // change. + if (proposing && currentVoteCounter_ < p.avMIN_ROUNDS) + return false; + + // If we or any peers have changed a vote in several rounds, then + // things could still change. But if _either_ has not changed in that + // long, we're unlikely to change our vote any time soon. (This prevents + // a malicious peer from flip-flopping a vote to prevent consensus.) + if (peersUnchanged < p.avSTALLED_ROUNDS && + (proposing && currentVoteCounter_ < p.avSTALLED_ROUNDS)) + return false; + + // Does this transaction have more than 80% agreement + + // Compute the percentage of nodes voting 'yes' (possibly including us) + int const support = (yays_ + (proposing && ourVote_ ? 1 : 0)) * 100; + int total = nays_ + yays_ + (proposing ? 1 : 0); + if (!total) + // There are no votes, so we know nothing + return false; + int const weight = support / total; + // Returns true if the tx has more than minCONSENSUS_PCT (80) percent + // agreement. Either voting for _or_ voting against the tx. + return weight > p.minCONSENSUS_PCT || + weight < (100 - p.minCONSENSUS_PCT); + } + //! The disputed transaction. Tx_t const& tx() const @@ -102,8 +145,12 @@ class DisputedTx @param peer Identifier of peer. @param votesYes Whether peer votes to include the disputed transaction. + + @return bool Whether the peer changed its vote. (A new vote counts as a + change.) */ - void + [[nodiscard]] + bool setVote(NodeID_t const& peer, bool votesYes); /** Remove a peer's vote @@ -137,12 +184,18 @@ class DisputedTx bool ourVote_; //< Our vote (true is yes) Tx_t tx_; //< Transaction under dispute Map_t votes_; //< Map from NodeID to vote + //! The number of rounds we've gone without changing our vote + std::size_t currentVoteCounter_ = 0; + //! Which minimum acceptance percentage phase we are currently in + ConsensusParms::AvalancheState avalancheState_ = ConsensusParms::init; + //! How long we have been in the current acceptance phase + std::size_t avalancheCounter_ = 0; beast::Journal const j_; }; // Track a peer's yes/no vote on a particular disputed tx_ template -void +bool DisputedTx::setVote(NodeID_t const& peer, bool votesYes) { auto const [it, inserted] = votes_.insert(std::make_pair(peer, votesYes)); @@ -160,6 +213,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) JLOG(j_.debug()) << "Peer " << peer << " votes NO on " << tx_.id(); ++nays_; } + return true; } // changes vote to yes else if (votesYes && !it->second) @@ -168,6 +222,7 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) --nays_; ++yays_; it->second = true; + return true; } // changes vote to no else if (!votesYes && it->second) @@ -176,7 +231,9 @@ DisputedTx::setVote(NodeID_t const& peer, bool votesYes) ++nays_; --yays_; it->second = false; + return true; } + return false; } // Remove a peer's vote on this disputed transaction @@ -213,21 +270,26 @@ DisputedTx::updateVote( bool newPosition; int weight; + // When proposing, to prevent avalanche stalls, we increase the needed + // weight slightly over time. We also need to ensure that the consensus has + // made a minimum number of attempts at each "state" before moving + // to the next. + // Proposing or not, we need to keep track of which state we've reached so + // we can determine if the vote has stalled. + auto const [requiredPct, newState] = getNeededWeight( + p, avalancheState_, percentTime, ++avalancheCounter_, p.avMIN_ROUNDS); + if (newState) + { + avalancheState_ = *newState; + avalancheCounter_ = 0; + } + if (proposing) // give ourselves full weight { // This is basically the percentage of nodes voting 'yes' (including us) weight = (yays_ * 100 + (ourVote_ ? 100 : 0)) / (nays_ + yays_ + 1); - // To prevent avalanche stalls, we increase the needed weight slightly - // over time. - if (percentTime < p.avMID_CONSENSUS_TIME) - newPosition = weight > p.avINIT_CONSENSUS_PCT; - else if (percentTime < p.avLATE_CONSENSUS_TIME) - newPosition = weight > p.avMID_CONSENSUS_PCT; - else if (percentTime < p.avSTUCK_CONSENSUS_TIME) - newPosition = weight > p.avLATE_CONSENSUS_PCT; - else - newPosition = weight > p.avSTUCK_CONSENSUS_PCT; + newPosition = weight > requiredPct; } else { @@ -238,13 +300,16 @@ DisputedTx::updateVote( if (newPosition == ourVote_) { - JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") - << ") : weight " << weight << ", percent " - << percentTime; + ++currentVoteCounter_; + JLOG(j_.info()) << "No change (" << (ourVote_ ? "YES" : "NO") << ") on " + << tx_.id() << " : weight " << weight << ", percent " + << percentTime + << ", round(s) with this vote: " << currentVoteCounter_; JLOG(j_.debug()) << Json::Compact{getJson()}; return false; } + currentVoteCounter_ = 0; ourVote_ = newPosition; JLOG(j_.debug()) << "We now vote " << (ourVote_ ? "YES" : "NO") << " on " << tx_.id(); diff --git a/src/xrpld/consensus/LedgerTiming.h b/src/xrpld/consensus/LedgerTiming.h index b3ef5ee59c2..434f19b0818 100644 --- a/src/xrpld/consensus/LedgerTiming.h +++ b/src/xrpld/consensus/LedgerTiming.h @@ -22,8 +22,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/consensus/Validations.h b/src/xrpld/consensus/Validations.h index 582d36cbcd9..c333aeaefd7 100644 --- a/src/xrpld/consensus/Validations.h +++ b/src/xrpld/consensus/Validations.h @@ -21,6 +21,7 @@ #define RIPPLE_CONSENSUS_VALIDATIONS_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/core/ClosureCounter.h b/src/xrpld/core/ClosureCounter.h index 9b1a69bf95d..92117a91c45 100644 --- a/src/xrpld/core/ClosureCounter.h +++ b/src/xrpld/core/ClosureCounter.h @@ -21,11 +21,11 @@ #define RIPPLE_CORE_CLOSURE_COUNTER_H_INCLUDED #include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index c0cedcc1a47..8e29ecdcf41 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -24,20 +24,13 @@ #include #include #include -#include #include // VFALCO Breaks levelization -#include #include // VFALCO FIX: This include should not be here -#include -#include -#include #include -#include #include #include -#include #include #include #include diff --git a/src/xrpld/core/DatabaseCon.h b/src/xrpld/core/DatabaseCon.h index 8c6ba730320..299861e1b03 100644 --- a/src/xrpld/core/DatabaseCon.h +++ b/src/xrpld/core/DatabaseCon.h @@ -24,7 +24,9 @@ #include #include #include + #include + #include #include #include diff --git a/src/xrpld/core/Job.h b/src/xrpld/core/Job.h index 76d26c39e72..66048f4f21a 100644 --- a/src/xrpld/core/Job.h +++ b/src/xrpld/core/Job.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include diff --git a/src/xrpld/core/JobQueue.h b/src/xrpld/core/JobQueue.h index 06f90dd1c4e..051c2982514 100644 --- a/src/xrpld/core/JobQueue.h +++ b/src/xrpld/core/JobQueue.h @@ -24,11 +24,11 @@ #include #include #include + #include #include + #include -#include // workaround for boost 1.72 bug -#include // workaround for boost 1.72 bug namespace ripple { diff --git a/src/xrpld/core/JobTypeData.h b/src/xrpld/core/JobTypeData.h index 43d63895d8b..89532c15d9f 100644 --- a/src/xrpld/core/JobTypeData.h +++ b/src/xrpld/core/JobTypeData.h @@ -21,6 +21,7 @@ #define RIPPLE_CORE_JOBTYPEDATA_H_INCLUDED #include + #include #include diff --git a/src/xrpld/core/JobTypes.h b/src/xrpld/core/JobTypes.h index 29b096b7a3b..29863893d97 100644 --- a/src/xrpld/core/JobTypes.h +++ b/src/xrpld/core/JobTypes.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { diff --git a/src/xrpld/core/LoadEvent.h b/src/xrpld/core/LoadEvent.h index 458c8a0cd6e..3b5f69194fa 100644 --- a/src/xrpld/core/LoadEvent.h +++ b/src/xrpld/core/LoadEvent.h @@ -21,7 +21,6 @@ #define RIPPLE_CORE_LOADEVENT_H_INCLUDED #include -#include #include namespace ripple { diff --git a/src/xrpld/core/LoadMonitor.h b/src/xrpld/core/LoadMonitor.h index e57429da23b..c65a0e68707 100644 --- a/src/xrpld/core/LoadMonitor.h +++ b/src/xrpld/core/LoadMonitor.h @@ -21,8 +21,10 @@ #define RIPPLE_CORE_LOADMONITOR_H_INCLUDED #include + #include #include + #include #include diff --git a/src/xrpld/core/SociDB.h b/src/xrpld/core/SociDB.h index 20f210d4e38..a741504e971 100644 --- a/src/xrpld/core/SociDB.h +++ b/src/xrpld/core/SociDB.h @@ -34,10 +34,13 @@ #endif #include + #include + #define SOCI_USE_BOOST -#include #include + +#include #include #include diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index 6a34b1db91f..fb4a4aab211 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,11 +29,12 @@ #include #include #include + #include #include #include #include -#include + #include #include #include diff --git a/src/xrpld/core/detail/DatabaseCon.cpp b/src/xrpld/core/detail/DatabaseCon.cpp index 6d49c647a6f..89e4daf90e0 100644 --- a/src/xrpld/core/detail/DatabaseCon.cpp +++ b/src/xrpld/core/detail/DatabaseCon.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Job.cpp b/src/xrpld/core/detail/Job.cpp index 17f600a4f41..d62f49ff494 100644 --- a/src/xrpld/core/detail/Job.cpp +++ b/src/xrpld/core/detail/Job.cpp @@ -18,8 +18,8 @@ //============================================================================== #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/JobQueue.cpp b/src/xrpld/core/detail/JobQueue.cpp index 5eb1f24d43a..1ea1df51abb 100644 --- a/src/xrpld/core/detail/JobQueue.cpp +++ b/src/xrpld/core/detail/JobQueue.cpp @@ -19,7 +19,9 @@ #include #include + #include + #include namespace ripple { diff --git a/src/xrpld/core/detail/LoadEvent.cpp b/src/xrpld/core/detail/LoadEvent.cpp index 2602c0691fc..bee2a145791 100644 --- a/src/xrpld/core/detail/LoadEvent.cpp +++ b/src/xrpld/core/detail/LoadEvent.cpp @@ -19,8 +19,8 @@ #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/core/detail/LoadMonitor.cpp b/src/xrpld/core/detail/LoadMonitor.cpp index 80b08bbdfc3..98fa959d6ca 100644 --- a/src/xrpld/core/detail/LoadMonitor.cpp +++ b/src/xrpld/core/detail/LoadMonitor.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/core/detail/SociDB.cpp b/src/xrpld/core/detail/SociDB.cpp index 94f9098d9c0..96b1f97977f 100644 --- a/src/xrpld/core/detail/SociDB.cpp +++ b/src/xrpld/core/detail/SociDB.cpp @@ -23,15 +23,18 @@ #endif #include -#include #include #include + #include #include + #include -#include + #include +#include + namespace ripple { static auto checkpointPageCount = 1000; diff --git a/src/xrpld/core/detail/Workers.cpp b/src/xrpld/core/detail/Workers.cpp index 7286f378e85..53b5944ac00 100644 --- a/src/xrpld/core/detail/Workers.cpp +++ b/src/xrpld/core/detail/Workers.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/core/detail/Workers.h b/src/xrpld/core/detail/Workers.h index 3645d4fbcf0..3f41e382b03 100644 --- a/src/xrpld/core/detail/Workers.h +++ b/src/xrpld/core/detail/Workers.h @@ -21,7 +21,9 @@ #define RIPPLE_CORE_WORKERS_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/ledger/ApplyView.h b/src/xrpld/ledger/ApplyView.h index e99e8b29763..1abff33be09 100644 --- a/src/xrpld/ledger/ApplyView.h +++ b/src/xrpld/ledger/ApplyView.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index 74ee2908295..1c282565b17 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/ledger/BookDirs.h b/src/xrpld/ledger/BookDirs.h index 2c27a5b6596..dc58905c5a2 100644 --- a/src/xrpld/ledger/BookDirs.h +++ b/src/xrpld/ledger/BookDirs.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { class BookDirs diff --git a/src/xrpld/ledger/CachedView.h b/src/xrpld/ledger/CachedView.h index fd921c63ca9..ae59312f98e 100644 --- a/src/xrpld/ledger/CachedView.h +++ b/src/xrpld/ledger/CachedView.h @@ -22,9 +22,9 @@ #include #include + #include -#include -#include + #include #include diff --git a/src/xrpld/ledger/Dir.h b/src/xrpld/ledger/Dir.h index 0e92d7dbca6..d3a52558fd8 100644 --- a/src/xrpld/ledger/Dir.h +++ b/src/xrpld/ledger/Dir.h @@ -21,6 +21,7 @@ #define RIPPLE_LEDGER_DIR_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/ledger/OpenView.h b/src/xrpld/ledger/OpenView.h index c8e1911bf96..ecc618e185d 100644 --- a/src/xrpld/ledger/OpenView.h +++ b/src/xrpld/ledger/OpenView.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/ledger/PaymentSandbox.h b/src/xrpld/ledger/PaymentSandbox.h index d7299b2efbf..a41a0211a29 100644 --- a/src/xrpld/ledger/PaymentSandbox.h +++ b/src/xrpld/ledger/PaymentSandbox.h @@ -23,7 +23,9 @@ #include #include #include + #include + #include #include diff --git a/src/xrpld/ledger/RawView.h b/src/xrpld/ledger/RawView.h index cd9bcff8761..fb6dcffe06e 100644 --- a/src/xrpld/ledger/RawView.h +++ b/src/xrpld/ledger/RawView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_RAWVIEW_H_INCLUDED #include + #include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/ReadView.h b/src/xrpld/ledger/ReadView.h index fb695b9a360..53e12083f34 100644 --- a/src/xrpld/ledger/ReadView.h +++ b/src/xrpld/ledger/ReadView.h @@ -21,11 +21,9 @@ #define RIPPLE_LEDGER_READVIEW_H_INCLUDED #include + #include #include -#include -#include -#include #include #include #include @@ -35,9 +33,8 @@ #include #include #include -#include + #include -#include #include #include diff --git a/src/xrpld/ledger/View.h b/src/xrpld/ledger/View.h index aca3f9fa6d8..85aa02f1b4c 100644 --- a/src/xrpld/ledger/View.h +++ b/src/xrpld/ledger/View.h @@ -20,27 +20,23 @@ #ifndef RIPPLE_LEDGER_VIEW_H_INCLUDED #define RIPPLE_LEDGER_VIEW_H_INCLUDED -#include #include #include -#include #include + #include #include #include #include #include #include -#include #include #include + #include #include -#include #include -#include - namespace ripple { enum class WaiveTransferFee : bool { No = false, Yes }; diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 2c76b9b587d..c11a72d7829 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index b95e41363ce..b1bac733fc8 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyView.cpp b/src/xrpld/ledger/detail/ApplyView.cpp index 8b491bdcb2b..3191b47cbbf 100644 --- a/src/xrpld/ledger/detail/ApplyView.cpp +++ b/src/xrpld/ledger/detail/ApplyView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include #include diff --git a/src/xrpld/ledger/detail/ApplyViewBase.cpp b/src/xrpld/ledger/detail/ApplyViewBase.cpp index 647927ae965..1d93eae7aac 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.cpp +++ b/src/xrpld/ledger/detail/ApplyViewBase.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/ApplyViewBase.h b/src/xrpld/ledger/detail/ApplyViewBase.h index 8cc38e41430..f9c9c80af04 100644 --- a/src/xrpld/ledger/detail/ApplyViewBase.h +++ b/src/xrpld/ledger/detail/ApplyViewBase.h @@ -21,9 +21,9 @@ #define RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED #include -#include #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index b9b333eb8b8..74b71c8324f 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/BookDirs.cpp b/src/xrpld/ledger/detail/BookDirs.cpp index f584db89e84..41a14945a65 100644 --- a/src/xrpld/ledger/detail/BookDirs.cpp +++ b/src/xrpld/ledger/detail/BookDirs.cpp @@ -20,6 +20,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/CachedView.cpp b/src/xrpld/ledger/detail/CachedView.cpp index 0463e5de05c..5d6d3546884 100644 --- a/src/xrpld/ledger/detail/CachedView.cpp +++ b/src/xrpld/ledger/detail/CachedView.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { namespace detail { diff --git a/src/xrpld/ledger/detail/OpenView.cpp b/src/xrpld/ledger/detail/OpenView.cpp index 619006161f8..5c62d8cef8d 100644 --- a/src/xrpld/ledger/detail/OpenView.cpp +++ b/src/xrpld/ledger/detail/OpenView.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/PaymentSandbox.cpp b/src/xrpld/ledger/detail/PaymentSandbox.cpp index 745d8a90c7a..3eab8454721 100644 --- a/src/xrpld/ledger/detail/PaymentSandbox.cpp +++ b/src/xrpld/ledger/detail/PaymentSandbox.cpp @@ -20,10 +20,9 @@ #include #include #include + #include -#include #include -#include namespace ripple { diff --git a/src/xrpld/ledger/detail/RawStateTable.cpp b/src/xrpld/ledger/detail/RawStateTable.cpp index b93fc4a2aa6..f19eed8297d 100644 --- a/src/xrpld/ledger/detail/RawStateTable.cpp +++ b/src/xrpld/ledger/detail/RawStateTable.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/ledger/detail/ReadViewFwdRange.h b/src/xrpld/ledger/detail/ReadViewFwdRange.h index 626a5f4743e..0dab5e9464e 100644 --- a/src/xrpld/ledger/detail/ReadViewFwdRange.h +++ b/src/xrpld/ledger/detail/ReadViewFwdRange.h @@ -21,7 +21,6 @@ #define RIPPLE_LEDGER_READVIEWFWDRANGE_H_INCLUDED #include -#include #include #include diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 85abf7fc62c..1860f614456 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -19,14 +19,15 @@ #include #include + #include #include -#include #include #include #include #include #include + #include namespace ripple { @@ -529,8 +530,7 @@ xrpLiquid( STAmount const amount = (balance < reserve) ? STAmount{0} : balance - reserve; - JLOG(j.trace()) << "accountHolds:" - << " account=" << to_string(id) + JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(id) << " amount=" << amount.getFullText() << " fullBalance=" << fullBalance.getFullText() << " balance=" << balance.getFullText() diff --git a/src/xrpld/net/AutoSocket.h b/src/xrpld/net/AutoSocket.h index be35c082461..7486d6128dc 100644 --- a/src/xrpld/net/AutoSocket.h +++ b/src/xrpld/net/AutoSocket.h @@ -22,6 +22,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/net/HTTPClient.h b/src/xrpld/net/HTTPClient.h index 3b7da776ea4..2a33500aa48 100644 --- a/src/xrpld/net/HTTPClient.h +++ b/src/xrpld/net/HTTPClient.h @@ -21,7 +21,9 @@ #define RIPPLE_NET_HTTPCLIENT_H_INCLUDED #include + #include + #include #include diff --git a/src/xrpld/net/HTTPClientSSLContext.h b/src/xrpld/net/HTTPClientSSLContext.h index 64ca2461d23..2da5ac38de6 100644 --- a/src/xrpld/net/HTTPClientSSLContext.h +++ b/src/xrpld/net/HTTPClientSSLContext.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include #include #include diff --git a/src/xrpld/net/InfoSub.h b/src/xrpld/net/InfoSub.h index 08fba26ff00..c8762c31fd4 100644 --- a/src/xrpld/net/InfoSub.h +++ b/src/xrpld/net/InfoSub.h @@ -21,12 +21,12 @@ #define RIPPLE_NET_INFOSUB_H_INCLUDED #include + #include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/net/RPCCall.h b/src/xrpld/net/RPCCall.h index 9c78bb20d25..612d80c6639 100644 --- a/src/xrpld/net/RPCCall.h +++ b/src/xrpld/net/RPCCall.h @@ -21,13 +21,15 @@ #define RIPPLE_NET_RPCCALL_H_INCLUDED #include + #include #include + #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/net/RPCSub.h b/src/xrpld/net/RPCSub.h index b2a751d4a19..9730ca2dec2 100644 --- a/src/xrpld/net/RPCSub.h +++ b/src/xrpld/net/RPCSub.h @@ -22,6 +22,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/net/RegisterSSLCerts.h b/src/xrpld/net/RegisterSSLCerts.h index 88664139f19..58c8c6c82d2 100644 --- a/src/xrpld/net/RegisterSSLCerts.h +++ b/src/xrpld/net/RegisterSSLCerts.h @@ -21,6 +21,7 @@ #define RIPPLE_NET_REGISTER_SSL_CERTS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/HTTPClient.cpp b/src/xrpld/net/detail/HTTPClient.cpp index 61c2875a5fa..0ead4cf0dc3 100644 --- a/src/xrpld/net/detail/HTTPClient.cpp +++ b/src/xrpld/net/detail/HTTPClient.cpp @@ -20,14 +20,15 @@ #include #include #include + #include -#include -#include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/InfoSub.cpp b/src/xrpld/net/detail/InfoSub.cpp index e22a3704802..7acd7f07a79 100644 --- a/src/xrpld/net/detail/InfoSub.cpp +++ b/src/xrpld/net/detail/InfoSub.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { diff --git a/src/xrpld/net/detail/RPCCall.cpp b/src/xrpld/net/detail/RPCCall.cpp index c91005a66db..814ea362e4f 100644 --- a/src/xrpld/net/detail/RPCCall.cpp +++ b/src/xrpld/net/detail/RPCCall.cpp @@ -23,17 +23,16 @@ #include #include #include + #include #include #include #include #include #include -#include #include #include #include -#include #include #include #include @@ -41,7 +40,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/net/detail/RPCSub.cpp b/src/xrpld/net/detail/RPCSub.cpp index 13bdf9119b4..96f91cdcf59 100644 --- a/src/xrpld/net/detail/RPCSub.cpp +++ b/src/xrpld/net/detail/RPCSub.cpp @@ -19,10 +19,12 @@ #include #include + #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/net/detail/RegisterSSLCerts.cpp b/src/xrpld/net/detail/RegisterSSLCerts.cpp index ede42b03af2..0dbf036e010 100644 --- a/src/xrpld/net/detail/RegisterSSLCerts.cpp +++ b/src/xrpld/net/detail/RegisterSSLCerts.cpp @@ -16,17 +16,20 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include -#include #if BOOST_OS_WINDOWS #include #include -#include + #include #include #include + #include + +#include #endif namespace ripple { diff --git a/src/xrpld/nodestore/Backend.h b/src/xrpld/nodestore/Backend.h index 29f37553327..10978954165 100644 --- a/src/xrpld/nodestore/Backend.h +++ b/src/xrpld/nodestore/Backend.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_BACKEND_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Database.h b/src/xrpld/nodestore/Database.h index c22ede82481..e1aa801c44f 100644 --- a/src/xrpld/nodestore/Database.h +++ b/src/xrpld/nodestore/Database.h @@ -23,11 +23,12 @@ #include #include #include -#include + +#include +#include #include #include -#include namespace ripple { diff --git a/src/xrpld/nodestore/Factory.h b/src/xrpld/nodestore/Factory.h index 8853a6ce9a5..b0768907da4 100644 --- a/src/xrpld/nodestore/Factory.h +++ b/src/xrpld/nodestore/Factory.h @@ -22,7 +22,10 @@ #include #include + +#include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/NodeObject.h b/src/xrpld/nodestore/NodeObject.h index f5a1fdb075d..dd7f4c4dc7d 100644 --- a/src/xrpld/nodestore/NodeObject.h +++ b/src/xrpld/nodestore/NodeObject.h @@ -22,7 +22,7 @@ #include #include -#include +#include // VFALCO NOTE Intentionally not in the NodeStore namespace diff --git a/src/xrpld/nodestore/Scheduler.h b/src/xrpld/nodestore/Scheduler.h index 236c2260eed..663db7eb74b 100644 --- a/src/xrpld/nodestore/Scheduler.h +++ b/src/xrpld/nodestore/Scheduler.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_SCHEDULER_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/Types.h b/src/xrpld/nodestore/Types.h index a5792fe7df3..5e22eb4ddf1 100644 --- a/src/xrpld/nodestore/Types.h +++ b/src/xrpld/nodestore/Types.h @@ -21,7 +21,7 @@ #define RIPPLE_NODESTORE_TYPES_H_INCLUDED #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/MemoryFactory.cpp b/src/xrpld/nodestore/backend/MemoryFactory.cpp index aac305cea07..dc3106cc91f 100644 --- a/src/xrpld/nodestore/backend/MemoryFactory.cpp +++ b/src/xrpld/nodestore/backend/MemoryFactory.cpp @@ -19,9 +19,12 @@ #include #include + #include + #include #include + #include #include #include diff --git a/src/xrpld/nodestore/backend/NuDBFactory.cpp b/src/xrpld/nodestore/backend/NuDBFactory.cpp index 24ebffd33a2..2f4e9d502e3 100644 --- a/src/xrpld/nodestore/backend/NuDBFactory.cpp +++ b/src/xrpld/nodestore/backend/NuDBFactory.cpp @@ -22,15 +22,19 @@ #include #include #include + #include #include + #include + +#include + #include #include #include #include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/backend/NullFactory.cpp b/src/xrpld/nodestore/backend/NullFactory.cpp index 47254cd50fc..5aae8ca7cf7 100644 --- a/src/xrpld/nodestore/backend/NullFactory.cpp +++ b/src/xrpld/nodestore/backend/NullFactory.cpp @@ -19,7 +19,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/nodestore/backend/RocksDBFactory.cpp b/src/xrpld/nodestore/backend/RocksDBFactory.cpp index 2034128949f..0e421cd6bdb 100644 --- a/src/xrpld/nodestore/backend/RocksDBFactory.cpp +++ b/src/xrpld/nodestore/backend/RocksDBFactory.cpp @@ -20,13 +20,13 @@ #include #if RIPPLE_ROCKSDB_AVAILABLE - #include // VFALCO Bad dependency #include #include #include #include #include + #include #include #include @@ -191,8 +191,12 @@ class RocksDBBackend : public Backend, public BatchWriter::Callback if (keyValues.exists("bbt_options")) { + rocksdb::ConfigOptions config_options; auto const s = rocksdb::GetBlockBasedTableOptionsFromString( - table_options, get(keyValues, "bbt_options"), &table_options); + config_options, + table_options, + get(keyValues, "bbt_options"), + &table_options); if (!s.ok()) Throw( std::string("Unable to set RocksDB bbt_options: ") + diff --git a/src/xrpld/nodestore/detail/BatchWriter.h b/src/xrpld/nodestore/detail/BatchWriter.h index c48002f4f80..15ba508f64c 100644 --- a/src/xrpld/nodestore/detail/BatchWriter.h +++ b/src/xrpld/nodestore/detail/BatchWriter.h @@ -23,6 +23,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/nodestore/detail/Database.cpp b/src/xrpld/nodestore/detail/Database.cpp index 7564ca60b52..4edafcddca1 100644 --- a/src/xrpld/nodestore/detail/Database.cpp +++ b/src/xrpld/nodestore/detail/Database.cpp @@ -18,11 +18,13 @@ //============================================================================== #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp index 85e5d3c0da9..2502d52815f 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DatabaseNodeImp.h b/src/xrpld/nodestore/detail/DatabaseNodeImp.h index d90f02ce877..160bf92d5ed 100644 --- a/src/xrpld/nodestore/detail/DatabaseNodeImp.h +++ b/src/xrpld/nodestore/detail/DatabaseNodeImp.h @@ -21,6 +21,7 @@ #define RIPPLE_NODESTORE_DATABASENODEIMP_H_INCLUDED #include + #include #include diff --git a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp index c7e6c8c349f..a4828ab2c22 100644 --- a/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp +++ b/src/xrpld/nodestore/detail/DatabaseRotatingImp.cpp @@ -18,7 +18,6 @@ //============================================================================== #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/DecodedBlob.cpp b/src/xrpld/nodestore/detail/DecodedBlob.cpp index fbf9f532a0a..adec27a68f2 100644 --- a/src/xrpld/nodestore/detail/DecodedBlob.cpp +++ b/src/xrpld/nodestore/detail/DecodedBlob.cpp @@ -18,8 +18,10 @@ //============================================================================== #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/EncodedBlob.h b/src/xrpld/nodestore/detail/EncodedBlob.h index 01b167159e7..a238f2b8560 100644 --- a/src/xrpld/nodestore/detail/EncodedBlob.h +++ b/src/xrpld/nodestore/detail/EncodedBlob.h @@ -21,9 +21,11 @@ #define RIPPLE_NODESTORE_ENCODEDBLOB_H_INCLUDED #include -#include + #include + #include + #include #include #include diff --git a/src/xrpld/nodestore/detail/NodeObject.cpp b/src/xrpld/nodestore/detail/NodeObject.cpp index f633014b09f..0e81c047c6c 100644 --- a/src/xrpld/nodestore/detail/NodeObject.cpp +++ b/src/xrpld/nodestore/detail/NodeObject.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/nodestore/detail/codec.h b/src/xrpld/nodestore/detail/codec.h index f19672b8123..7bc3ab2caa3 100644 --- a/src/xrpld/nodestore/detail/codec.h +++ b/src/xrpld/nodestore/detail/codec.h @@ -25,15 +25,18 @@ #include #include + #include #include #include + +#include + +#include + #include #include -#include -#include #include -#include namespace ripple { namespace NodeStore { diff --git a/src/xrpld/nodestore/detail/varint.h b/src/xrpld/nodestore/detail/varint.h index 75d8e58a751..6ccbe68b87f 100644 --- a/src/xrpld/nodestore/detail/varint.h +++ b/src/xrpld/nodestore/detail/varint.h @@ -20,8 +20,9 @@ #ifndef BEAST_NUDB_VARINT_H_INCLUDED #define BEAST_NUDB_VARINT_H_INCLUDED -#include #include + +#include #include namespace ripple { diff --git a/src/xrpld/overlay/Cluster.h b/src/xrpld/overlay/Cluster.h index 42bda586c0d..a2fd7f9c53b 100644 --- a/src/xrpld/overlay/Cluster.h +++ b/src/xrpld/overlay/Cluster.h @@ -20,18 +20,16 @@ #ifndef RIPPLE_OVERLAY_CLUSTER_H_INCLUDED #define RIPPLE_OVERLAY_CLUSTER_H_INCLUDED -#include #include + #include #include -#include #include #include + #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/ClusterNode.h b/src/xrpld/overlay/ClusterNode.h index 1ca78208dd5..02b4709c52b 100644 --- a/src/xrpld/overlay/ClusterNode.h +++ b/src/xrpld/overlay/ClusterNode.h @@ -22,6 +22,7 @@ #include #include + #include #include diff --git a/src/xrpld/overlay/Compression.h b/src/xrpld/overlay/Compression.h index c7437badc4d..3a278a3403d 100644 --- a/src/xrpld/overlay/Compression.h +++ b/src/xrpld/overlay/Compression.h @@ -22,7 +22,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/overlay/Message.h b/src/xrpld/overlay/Message.h index 247e53ec9fd..92e2824327f 100644 --- a/src/xrpld/overlay/Message.h +++ b/src/xrpld/overlay/Message.h @@ -21,17 +21,13 @@ #define RIPPLE_OVERLAY_MESSAGE_H_INCLUDED #include + #include #include #include -#include -#include + #include -#include #include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/Overlay.h b/src/xrpld/overlay/Overlay.h index 9aff1560682..7f5c858f67a 100644 --- a/src/xrpld/overlay/Overlay.h +++ b/src/xrpld/overlay/Overlay.h @@ -21,21 +21,18 @@ #define RIPPLE_OVERLAY_OVERLAY_H_INCLUDED #include -#include + #include #include #include -#include + #include #include -#include #include -#include #include + #include -#include #include -#include namespace boost { namespace asio { diff --git a/src/xrpld/overlay/Peer.h b/src/xrpld/overlay/Peer.h index 2646b24a3ed..9a5bd7136ba 100644 --- a/src/xrpld/overlay/Peer.h +++ b/src/xrpld/overlay/Peer.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PEER_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/PeerReservationTable.h b/src/xrpld/overlay/PeerReservationTable.h index fb3add61f70..ddd65261615 100644 --- a/src/xrpld/overlay/PeerReservationTable.h +++ b/src/xrpld/overlay/PeerReservationTable.h @@ -23,7 +23,6 @@ #include #include #include -#include #include #include diff --git a/src/xrpld/overlay/PeerSet.h b/src/xrpld/overlay/PeerSet.h index aca6242f9de..6fb4b656430 100644 --- a/src/xrpld/overlay/PeerSet.h +++ b/src/xrpld/overlay/PeerSet.h @@ -23,11 +23,6 @@ #include #include #include -#include -#include -#include -#include -#include namespace ripple { diff --git a/src/xrpld/overlay/ReduceRelayCommon.h b/src/xrpld/overlay/ReduceRelayCommon.h index 8289e467e65..01d7dc597fc 100644 --- a/src/xrpld/overlay/ReduceRelayCommon.h +++ b/src/xrpld/overlay/ReduceRelayCommon.h @@ -62,4 +62,4 @@ static constexpr std::size_t MAX_TX_QUEUE_SIZE = 10000; } // namespace ripple -#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED \ No newline at end of file +#endif // RIPPLED_REDUCERELAYCOMMON_H_INCLUDED diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 92ec09de124..b2db772f5b7 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -22,9 +22,10 @@ #include #include -#include + #include #include +#include #include #include #include diff --git a/src/xrpld/overlay/Squelch.h b/src/xrpld/overlay/Squelch.h index 2919922da92..0507bd4d2d9 100644 --- a/src/xrpld/overlay/Squelch.h +++ b/src/xrpld/overlay/Squelch.h @@ -21,7 +21,7 @@ #define RIPPLE_OVERLAY_SQUELCH_H_INCLUDED #include -#include + #include #include diff --git a/src/xrpld/overlay/detail/Cluster.cpp b/src/xrpld/overlay/detail/Cluster.cpp index 9d25248e8df..b4e5b6fc509 100644 --- a/src/xrpld/overlay/detail/Cluster.cpp +++ b/src/xrpld/overlay/detail/Cluster.cpp @@ -21,10 +21,11 @@ #include #include #include + #include #include -#include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.cpp b/src/xrpld/overlay/detail/ConnectAttempt.cpp index 4bb76369c4c..30763b1357b 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.cpp +++ b/src/xrpld/overlay/detail/ConnectAttempt.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/ConnectAttempt.h b/src/xrpld/overlay/detail/ConnectAttempt.h index 474ac3c069f..c3e07f956ac 100644 --- a/src/xrpld/overlay/detail/ConnectAttempt.h +++ b/src/xrpld/overlay/detail/ConnectAttempt.h @@ -21,7 +21,6 @@ #define RIPPLE_OVERLAY_CONNECTATTEMPT_H_INCLUDED #include -#include namespace ripple { diff --git a/src/xrpld/overlay/detail/Handshake.cpp b/src/xrpld/overlay/detail/Handshake.cpp index 8f1aae8c025..657d28072f5 100644 --- a/src/xrpld/overlay/detail/Handshake.cpp +++ b/src/xrpld/overlay/detail/Handshake.cpp @@ -20,11 +20,14 @@ #include #include #include + #include #include #include #include + #include + #include // VFALCO Shouldn't we have to include the OpenSSL diff --git a/src/xrpld/overlay/detail/Handshake.h b/src/xrpld/overlay/detail/Handshake.h index 76c11b287ca..37f138b88b7 100644 --- a/src/xrpld/overlay/detail/Handshake.h +++ b/src/xrpld/overlay/detail/Handshake.h @@ -22,18 +22,17 @@ #include #include + #include #include -#include -#include -#include -#include -#include #include +#include #include #include #include +#include + #include #include diff --git a/src/xrpld/overlay/detail/Message.cpp b/src/xrpld/overlay/detail/Message.cpp index cdcf433f610..6473f30c89b 100644 --- a/src/xrpld/overlay/detail/Message.cpp +++ b/src/xrpld/overlay/detail/Message.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/overlay/detail/OverlayImpl.cpp b/src/xrpld/overlay/detail/OverlayImpl.cpp index b69a074e996..2209414d9f8 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.cpp +++ b/src/xrpld/overlay/detail/OverlayImpl.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -27,10 +26,12 @@ #include #include #include +#include #include #include #include #include + #include #include #include @@ -502,6 +503,9 @@ OverlayImpl::start() // Pool of servers operated by @Xrpkuwait - https://xrpkuwait.com bootstrapIps.push_back("hubs.xrpkuwait.com 51235"); + + // Pool of servers operated by XRPL Commons - https://xrpl-commons.org + bootstrapIps.push_back("hub.xrpl-commons.org 51235"); } m_resolver.resolve( diff --git a/src/xrpld/overlay/detail/OverlayImpl.h b/src/xrpld/overlay/detail/OverlayImpl.h index c5cfe6274e3..4112e6dfd97 100644 --- a/src/xrpld/overlay/detail/OverlayImpl.h +++ b/src/xrpld/overlay/detail/OverlayImpl.h @@ -30,17 +30,20 @@ #include #include #include + #include #include #include #include #include #include + #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 8989f89fb3e..6df9b78df82 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -32,6 +32,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerImp.h b/src/xrpld/overlay/detail/PeerImp.h index 23916db2175..459b359ffb9 100644 --- a/src/xrpld/overlay/detail/PeerImp.h +++ b/src/xrpld/overlay/detail/PeerImp.h @@ -24,11 +24,10 @@ #include #include #include -#include #include #include + #include -#include #include #include #include @@ -39,6 +38,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/overlay/detail/PeerReservationTable.cpp b/src/xrpld/overlay/detail/PeerReservationTable.cpp index 6fd0112f46f..1a2842591cd 100644 --- a/src/xrpld/overlay/detail/PeerReservationTable.cpp +++ b/src/xrpld/overlay/detail/PeerReservationTable.cpp @@ -17,17 +17,14 @@ */ //============================================================================== -#include - #include #include -#include +#include + #include #include #include -#include - #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolMessage.h b/src/xrpld/overlay/detail/ProtocolMessage.h index 54f99eb73d0..26c83055a34 100644 --- a/src/xrpld/overlay/detail/ProtocolMessage.h +++ b/src/xrpld/overlay/detail/ProtocolMessage.h @@ -23,14 +23,14 @@ #include #include #include -#include + #include #include + #include #include -#include + #include -#include #include #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.cpp b/src/xrpld/overlay/detail/ProtocolVersion.cpp index 0fecb301f7f..9da1d6416e1 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.cpp +++ b/src/xrpld/overlay/detail/ProtocolVersion.cpp @@ -18,10 +18,13 @@ //============================================================================== #include + #include #include + #include #include + #include #include diff --git a/src/xrpld/overlay/detail/ProtocolVersion.h b/src/xrpld/overlay/detail/ProtocolVersion.h index 71ab0d59d75..efdb4908f0e 100644 --- a/src/xrpld/overlay/detail/ProtocolVersion.h +++ b/src/xrpld/overlay/detail/ProtocolVersion.h @@ -21,6 +21,7 @@ #define RIPPLE_OVERLAY_PROTOCOLVERSION_H_INCLUDED #include + #include #include #include diff --git a/src/xrpld/overlay/detail/TrafficCount.h b/src/xrpld/overlay/detail/TrafficCount.h index 9b4fabdc344..b508970e446 100644 --- a/src/xrpld/overlay/detail/TrafficCount.h +++ b/src/xrpld/overlay/detail/TrafficCount.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED #define RIPPLE_OVERLAY_TRAFFIC_H_INCLUDED -#include #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.cpp b/src/xrpld/overlay/detail/TxMetrics.cpp index 8759e0122e5..bd493d74678 100644 --- a/src/xrpld/overlay/detail/TxMetrics.cpp +++ b/src/xrpld/overlay/detail/TxMetrics.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/overlay/detail/TxMetrics.h b/src/xrpld/overlay/detail/TxMetrics.h index eda7f1bb1b3..7f369cdda8c 100644 --- a/src/xrpld/overlay/detail/TxMetrics.h +++ b/src/xrpld/overlay/detail/TxMetrics.h @@ -138,4 +138,4 @@ struct TxMetrics } // namespace ripple -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/overlay/detail/ZeroCopyStream.h b/src/xrpld/overlay/detail/ZeroCopyStream.h index ac210bf6b9e..41d94578b08 100644 --- a/src/xrpld/overlay/detail/ZeroCopyStream.h +++ b/src/xrpld/overlay/detail/ZeroCopyStream.h @@ -23,7 +23,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/overlay/make_Overlay.h b/src/xrpld/overlay/make_Overlay.h index 6532281f3dc..34760265622 100644 --- a/src/xrpld/overlay/make_Overlay.h +++ b/src/xrpld/overlay/make_Overlay.h @@ -22,10 +22,10 @@ #include #include + #include -#include + #include -#include namespace ripple { diff --git a/src/xrpld/peerfinder/PeerfinderManager.h b/src/xrpld/peerfinder/PeerfinderManager.h index 10de99abe62..a670fb87802 100644 --- a/src/xrpld/peerfinder/PeerfinderManager.h +++ b/src/xrpld/peerfinder/PeerfinderManager.h @@ -22,8 +22,10 @@ #include #include + #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/Slot.h b/src/xrpld/peerfinder/Slot.h index 879c6a53317..171faed945c 100644 --- a/src/xrpld/peerfinder/Slot.h +++ b/src/xrpld/peerfinder/Slot.h @@ -22,7 +22,7 @@ #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.cpp b/src/xrpld/peerfinder/detail/Bootcache.cpp index 1af5f0e1c97..9652d55802e 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.cpp +++ b/src/xrpld/peerfinder/detail/Bootcache.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Bootcache.h b/src/xrpld/peerfinder/detail/Bootcache.h index 07e8869594c..4a5d95fd415 100644 --- a/src/xrpld/peerfinder/detail/Bootcache.h +++ b/src/xrpld/peerfinder/detail/Bootcache.h @@ -22,9 +22,11 @@ #include #include + #include #include #include + #include #include #include diff --git a/src/xrpld/peerfinder/detail/Checker.h b/src/xrpld/peerfinder/detail/Checker.h index 338bd839541..e7983471a5b 100644 --- a/src/xrpld/peerfinder/detail/Checker.h +++ b/src/xrpld/peerfinder/detail/Checker.h @@ -21,15 +21,14 @@ #define RIPPLE_PEERFINDER_CHECKER_H_INCLUDED #include -#include + #include #include #include -#include + #include #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Counts.h b/src/xrpld/peerfinder/detail/Counts.h index 0078ae28411..c91b27b0262 100644 --- a/src/xrpld/peerfinder/detail/Counts.h +++ b/src/xrpld/peerfinder/detail/Counts.h @@ -23,9 +23,8 @@ #include #include #include -#include -#include +#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Handouts.h b/src/xrpld/peerfinder/detail/Handouts.h index 36e9c712e38..4c30af48059 100644 --- a/src/xrpld/peerfinder/detail/Handouts.h +++ b/src/xrpld/peerfinder/detail/Handouts.h @@ -22,10 +22,9 @@ #include #include + #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/Livecache.h b/src/xrpld/peerfinder/detail/Livecache.h index 03d99592107..503ea0161ab 100644 --- a/src/xrpld/peerfinder/detail/Livecache.h +++ b/src/xrpld/peerfinder/detail/Livecache.h @@ -23,10 +23,12 @@ #include #include #include + #include #include #include #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 01f38ad7fd4..b3922f63b3f 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -30,10 +30,10 @@ #include #include #include + #include #include #include -#include #include #include diff --git a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp index 8baa2b50b9a..86093fa166f 100644 --- a/src/xrpld/peerfinder/detail/PeerfinderManager.cpp +++ b/src/xrpld/peerfinder/detail/PeerfinderManager.cpp @@ -22,11 +22,11 @@ #include #include #include + #include -#include + #include #include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/detail/SlotImp.h b/src/xrpld/peerfinder/detail/SlotImp.h index 45143a90121..e5d8b1e6c5b 100644 --- a/src/xrpld/peerfinder/detail/SlotImp.h +++ b/src/xrpld/peerfinder/detail/SlotImp.h @@ -22,8 +22,9 @@ #include #include -#include + #include + #include #include diff --git a/src/xrpld/peerfinder/detail/Source.h b/src/xrpld/peerfinder/detail/Source.h index a64da7b9e79..0f388ec3bbd 100644 --- a/src/xrpld/peerfinder/detail/Source.h +++ b/src/xrpld/peerfinder/detail/Source.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCE_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/SourceStrings.h b/src/xrpld/peerfinder/detail/SourceStrings.h index 52d985a7017..0c858dca85e 100644 --- a/src/xrpld/peerfinder/detail/SourceStrings.h +++ b/src/xrpld/peerfinder/detail/SourceStrings.h @@ -21,6 +21,7 @@ #define RIPPLE_PEERFINDER_SOURCESTRINGS_H_INCLUDED #include + #include namespace ripple { diff --git a/src/xrpld/peerfinder/detail/Store.h b/src/xrpld/peerfinder/detail/Store.h index f0c033c7a6d..2d51dfc204e 100644 --- a/src/xrpld/peerfinder/detail/Store.h +++ b/src/xrpld/peerfinder/detail/Store.h @@ -1,3 +1,4 @@ + //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled diff --git a/src/xrpld/peerfinder/detail/StoreSqdb.h b/src/xrpld/peerfinder/detail/StoreSqdb.h index ad8b886d4a3..a8e74e6db4f 100644 --- a/src/xrpld/peerfinder/detail/StoreSqdb.h +++ b/src/xrpld/peerfinder/detail/StoreSqdb.h @@ -23,8 +23,6 @@ #include #include #include -#include -#include namespace ripple { namespace PeerFinder { diff --git a/src/xrpld/peerfinder/make_Manager.h b/src/xrpld/peerfinder/make_Manager.h index 3a4f68d94c9..fba95e8f22f 100644 --- a/src/xrpld/peerfinder/make_Manager.h +++ b/src/xrpld/peerfinder/make_Manager.h @@ -21,7 +21,9 @@ #define RIPPLE_PEERFINDER_MAKE_MANAGER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/perflog/PerfLog.h b/src/xrpld/perflog/PerfLog.h index a7d66f57ad7..58df185e092 100644 --- a/src/xrpld/perflog/PerfLog.h +++ b/src/xrpld/perflog/PerfLog.h @@ -22,8 +22,11 @@ #include #include + #include + #include + #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.cpp b/src/xrpld/perflog/detail/PerfLogImp.cpp index 559bdb1743c..a34faf885c5 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.cpp +++ b/src/xrpld/perflog/detail/PerfLogImp.cpp @@ -17,18 +17,17 @@ */ //============================================================================== +#include #include -#include #include #include #include #include -#include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/perflog/detail/PerfLogImp.h b/src/xrpld/perflog/detail/PerfLogImp.h index 937486f75dc..d9354471f1b 100644 --- a/src/xrpld/perflog/detail/PerfLogImp.h +++ b/src/xrpld/perflog/detail/PerfLogImp.h @@ -22,20 +22,18 @@ #include #include -#include + #include -#include + #include + #include #include #include #include -#include #include #include -#include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/CTID.h b/src/xrpld/rpc/CTID.h index 8cac8d63171..8407d515263 100644 --- a/src/xrpld/rpc/CTID.h +++ b/src/xrpld/rpc/CTID.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_RPC_CTID_H_INCLUDED #define RIPPLE_RPC_CTID_H_INCLUDED -#include #include + #include #include #include diff --git a/src/xrpld/rpc/Context.h b/src/xrpld/rpc/Context.h index edc5582a401..32a7cca6534 100644 --- a/src/xrpld/rpc/Context.h +++ b/src/xrpld/rpc/Context.h @@ -20,7 +20,6 @@ #ifndef RIPPLE_RPC_CONTEXT_H_INCLUDED #define RIPPLE_RPC_CONTEXT_H_INCLUDED -#include #include #include #include diff --git a/src/xrpld/rpc/GRPCHandlers.h b/src/xrpld/rpc/GRPCHandlers.h index 679b16fd8ac..29e3b1b9ca6 100644 --- a/src/xrpld/rpc/GRPCHandlers.h +++ b/src/xrpld/rpc/GRPCHandlers.h @@ -21,7 +21,9 @@ #define RIPPLE_RPC_GRPCHANDLER_H_INCLUDED #include + #include + #include namespace ripple { diff --git a/src/xrpld/rpc/RPCHandler.h b/src/xrpld/rpc/RPCHandler.h index c056ca27eb6..0b5f73bcbe3 100644 --- a/src/xrpld/rpc/RPCHandler.h +++ b/src/xrpld/rpc/RPCHandler.h @@ -20,8 +20,6 @@ #ifndef RIPPLE_RPC_RPCHANDLER_H_INCLUDED #define RIPPLE_RPC_RPCHANDLER_H_INCLUDED -#include -#include #include #include diff --git a/src/xrpld/rpc/Role.h b/src/xrpld/rpc/Role.h index 0ce84e09ef6..c65db622e73 100644 --- a/src/xrpld/rpc/Role.h +++ b/src/xrpld/rpc/Role.h @@ -25,11 +25,12 @@ #include #include #include + #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/ServerHandler.h b/src/xrpld/rpc/ServerHandler.h index 032011ca771..5f726733131 100644 --- a/src/xrpld/rpc/ServerHandler.h +++ b/src/xrpld/rpc/ServerHandler.h @@ -20,10 +20,11 @@ #ifndef RIPPLE_RPC_SERVERHANDLER_H_INCLUDED #define RIPPLE_RPC_SERVERHANDLER_H_INCLUDED +#include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/DeliveredAmount.cpp b/src/xrpld/rpc/detail/DeliveredAmount.cpp index 93af8599146..9a6d0e9dc81 100644 --- a/src/xrpld/rpc/detail/DeliveredAmount.cpp +++ b/src/xrpld/rpc/detail/DeliveredAmount.cpp @@ -17,18 +17,14 @@ */ //============================================================================== -#include - #include #include #include -#include #include -#include -#include +#include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/Handler.cpp b/src/xrpld/rpc/detail/Handler.cpp index 7414a4b088e..abdfa921bba 100644 --- a/src/xrpld/rpc/detail/Handler.cpp +++ b/src/xrpld/rpc/detail/Handler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/Handler.h b/src/xrpld/rpc/detail/Handler.h index cb1a2579ecb..e0fb66f6fd9 100644 --- a/src/xrpld/rpc/detail/Handler.h +++ b/src/xrpld/rpc/detail/Handler.h @@ -22,12 +22,10 @@ #include #include -#include #include #include #include #include -#include namespace Json { class Object; diff --git a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp index 721be652622..5054ca9cb42 100644 --- a/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp +++ b/src/xrpld/rpc/detail/MPTokenIssuanceID.cpp @@ -19,11 +19,6 @@ #include -#include -#include -#include -#include - namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHandler.cpp b/src/xrpld/rpc/detail/RPCHandler.cpp index 19b33709c83..c261666eb9e 100644 --- a/src/xrpld/rpc/detail/RPCHandler.cpp +++ b/src/xrpld/rpc/detail/RPCHandler.cpp @@ -31,17 +31,15 @@ #include #include #include + #include -#include -#include #include #include -#include #include #include + #include #include -#include namespace ripple { namespace RPC { diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index 11c7a7698f3..3449a744d6c 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -28,8 +28,8 @@ #include #include #include + #include -#include #include #include #include diff --git a/src/xrpld/rpc/detail/RPCHelpers.h b/src/xrpld/rpc/detail/RPCHelpers.h index 74171af28e3..89af0052928 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.h +++ b/src/xrpld/rpc/detail/RPCHelpers.h @@ -20,16 +20,15 @@ #ifndef RIPPLE_RPC_RPCHELPERS_H_INCLUDED #define RIPPLE_RPC_RPCHELPERS_H_INCLUDED -#include -#include -#include -#include - #include #include #include #include #include + +#include +#include +#include #include #include diff --git a/src/xrpld/rpc/detail/Role.cpp b/src/xrpld/rpc/detail/Role.cpp index b374f035884..94da34efa22 100644 --- a/src/xrpld/rpc/detail/Role.cpp +++ b/src/xrpld/rpc/detail/Role.cpp @@ -18,10 +18,11 @@ //============================================================================== #include + #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/detail/ServerHandler.cpp b/src/xrpld/rpc/detail/ServerHandler.cpp index e5b7d9e3270..a5aca596578 100644 --- a/src/xrpld/rpc/detail/ServerHandler.cpp +++ b/src/xrpld/rpc/detail/ServerHandler.cpp @@ -17,18 +17,17 @@ */ //============================================================================== -#include - #include -#include #include #include #include #include #include +#include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/detail/Status.cpp b/src/xrpld/rpc/detail/Status.cpp index 7b23c2cc13a..738219b6b50 100644 --- a/src/xrpld/rpc/detail/Status.cpp +++ b/src/xrpld/rpc/detail/Status.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include namespace ripple { diff --git a/src/xrpld/rpc/detail/TransactionSign.cpp b/src/xrpld/rpc/detail/TransactionSign.cpp index 376a0ce24a5..2a7807f8cae 100644 --- a/src/xrpld/rpc/detail/TransactionSign.cpp +++ b/src/xrpld/rpc/detail/TransactionSign.cpp @@ -17,7 +17,6 @@ */ //============================================================================== -#include #include #include #include @@ -29,16 +28,16 @@ #include #include #include + #include #include #include #include -#include #include -#include #include #include #include + #include #include diff --git a/src/xrpld/rpc/detail/TransactionSign.h b/src/xrpld/rpc/detail/TransactionSign.h index 13e963644a0..406707a6a87 100644 --- a/src/xrpld/rpc/detail/TransactionSign.h +++ b/src/xrpld/rpc/detail/TransactionSign.h @@ -22,7 +22,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/rpc/detail/WSInfoSub.h b/src/xrpld/rpc/detail/WSInfoSub.h index 2267b9147f4..1652617455e 100644 --- a/src/xrpld/rpc/detail/WSInfoSub.h +++ b/src/xrpld/rpc/detail/WSInfoSub.h @@ -22,10 +22,11 @@ #include #include + #include #include #include -#include + #include #include diff --git a/src/xrpld/rpc/handlers/AMMInfo.cpp b/src/xrpld/rpc/handlers/AMMInfo.cpp index 1990cdafd3e..b312264f90e 100644 --- a/src/xrpld/rpc/handlers/AMMInfo.cpp +++ b/src/xrpld/rpc/handlers/AMMInfo.cpp @@ -16,15 +16,17 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== + #include #include #include #include #include + #include #include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountChannels.cpp b/src/xrpld/rpc/handlers/AccountChannels.cpp index 4b9ff7e43c5..5d810d61a00 100644 --- a/src/xrpld/rpc/handlers/AccountChannels.cpp +++ b/src/xrpld/rpc/handlers/AccountChannels.cpp @@ -17,18 +17,18 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include -#include #include #include + namespace ripple { void diff --git a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp index 6c8fe282674..2d08561ec90 100644 --- a/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp +++ b/src/xrpld/rpc/handlers/AccountCurrenciesHandler.cpp @@ -17,11 +17,11 @@ */ //============================================================================== -#include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountInfo.cpp b/src/xrpld/rpc/handlers/AccountInfo.cpp index 90e3a8d46e0..6416309e2e9 100644 --- a/src/xrpld/rpc/handlers/AccountInfo.cpp +++ b/src/xrpld/rpc/handlers/AccountInfo.cpp @@ -23,13 +23,12 @@ #include #include #include + #include #include #include -#include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountLines.cpp b/src/xrpld/rpc/handlers/AccountLines.cpp index 5170342eb99..e921eee386b 100644 --- a/src/xrpld/rpc/handlers/AccountLines.cpp +++ b/src/xrpld/rpc/handlers/AccountLines.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -54,10 +54,10 @@ addLine(Json::Value& jsonLines, RPCTrustLine const& line) jPeer[jss::authorized] = true; if (line.getAuthPeer()) jPeer[jss::peer_authorized] = true; - if (line.getNoRipple() || !line.getDefaultRipple()) - jPeer[jss::no_ripple] = line.getNoRipple(); - if (line.getNoRipplePeer() || !line.getDefaultRipple()) - jPeer[jss::no_ripple_peer] = line.getNoRipplePeer(); + if (line.getNoRipple()) + jPeer[jss::no_ripple] = true; + if (line.getNoRipplePeer()) + jPeer[jss::no_ripple_peer] = true; if (line.getFreeze()) jPeer[jss::freeze] = true; if (line.getFreezePeer()) diff --git a/src/xrpld/rpc/handlers/AccountObjects.cpp b/src/xrpld/rpc/handlers/AccountObjects.cpp index 1bdd95a74ca..03ea427b123 100644 --- a/src/xrpld/rpc/handlers/AccountObjects.cpp +++ b/src/xrpld/rpc/handlers/AccountObjects.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -31,7 +31,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/AccountOffers.cpp b/src/xrpld/rpc/handlers/AccountOffers.cpp index 86559a79f4f..bc575d2d861 100644 --- a/src/xrpld/rpc/handlers/AccountOffers.cpp +++ b/src/xrpld/rpc/handlers/AccountOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/AccountTx.cpp b/src/xrpld/rpc/handlers/AccountTx.cpp index ae50401b630..26c8065edf5 100644 --- a/src/xrpld/rpc/handlers/AccountTx.cpp +++ b/src/xrpld/rpc/handlers/AccountTx.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -28,7 +27,7 @@ #include #include #include -#include + #include #include #include @@ -37,8 +36,6 @@ #include #include -#include - namespace ripple { using TxnsData = RelationalDatabase::AccountTxs; diff --git a/src/xrpld/rpc/handlers/BlackList.cpp b/src/xrpld/rpc/handlers/BlackList.cpp index 3e887ff7309..ee8326a3d6a 100644 --- a/src/xrpld/rpc/handlers/BlackList.cpp +++ b/src/xrpld/rpc/handlers/BlackList.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/BookOffers.cpp b/src/xrpld/rpc/handlers/BookOffers.cpp index dccc03de5be..bede01b9279 100644 --- a/src/xrpld/rpc/handlers/BookOffers.cpp +++ b/src/xrpld/rpc/handlers/BookOffers.cpp @@ -23,6 +23,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/CanDelete.cpp b/src/xrpld/rpc/handlers/CanDelete.cpp index df2301d03e0..b7056e74391 100644 --- a/src/xrpld/rpc/handlers/CanDelete.cpp +++ b/src/xrpld/rpc/handlers/CanDelete.cpp @@ -19,14 +19,14 @@ #include #include -#include #include #include + #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Connect.cpp b/src/xrpld/rpc/handlers/Connect.cpp index eb4f67e76f8..81a85fd5ae3 100644 --- a/src/xrpld/rpc/handlers/Connect.cpp +++ b/src/xrpld/rpc/handlers/Connect.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ConsensusInfo.cpp b/src/xrpld/rpc/handlers/ConsensusInfo.cpp index ce727bb4006..113a2f28157 100644 --- a/src/xrpld/rpc/handlers/ConsensusInfo.cpp +++ b/src/xrpld/rpc/handlers/ConsensusInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/DepositAuthorized.cpp b/src/xrpld/rpc/handlers/DepositAuthorized.cpp index 50aa9ef2898..1bb480544d1 100644 --- a/src/xrpld/rpc/handlers/DepositAuthorized.cpp +++ b/src/xrpld/rpc/handlers/DepositAuthorized.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Feature1.cpp b/src/xrpld/rpc/handlers/Feature1.cpp index 75e583a352c..b2c8098ad13 100644 --- a/src/xrpld/rpc/handlers/Feature1.cpp +++ b/src/xrpld/rpc/handlers/Feature1.cpp @@ -21,8 +21,8 @@ #include #include #include + #include -#include #include #include diff --git a/src/xrpld/rpc/handlers/Fee1.cpp b/src/xrpld/rpc/handlers/Fee1.cpp index de5bdc4f6ca..6d15a4d95f1 100644 --- a/src/xrpld/rpc/handlers/Fee1.cpp +++ b/src/xrpld/rpc/handlers/Fee1.cpp @@ -22,8 +22,8 @@ #include #include #include + #include -#include namespace ripple { Json::Value diff --git a/src/xrpld/rpc/handlers/FetchInfo.cpp b/src/xrpld/rpc/handlers/FetchInfo.cpp index a4287266e52..1e0fa82480c 100644 --- a/src/xrpld/rpc/handlers/FetchInfo.cpp +++ b/src/xrpld/rpc/handlers/FetchInfo.cpp @@ -17,12 +17,11 @@ */ //============================================================================== -#include #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GatewayBalances.cpp b/src/xrpld/rpc/handlers/GatewayBalances.cpp index 26f338cb4f9..e8b95bd75c1 100644 --- a/src/xrpld/rpc/handlers/GatewayBalances.cpp +++ b/src/xrpld/rpc/handlers/GatewayBalances.cpp @@ -22,9 +22,9 @@ #include #include #include + #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp index 7467b94b63f..8001071f85f 100644 --- a/src/xrpld/rpc/handlers/GetAggregatePrice.cpp +++ b/src/xrpld/rpc/handlers/GetAggregatePrice.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/GetCounts.cpp b/src/xrpld/rpc/handlers/GetCounts.cpp index 690106ebbd2..9f57f08a247 100644 --- a/src/xrpld/rpc/handlers/GetCounts.cpp +++ b/src/xrpld/rpc/handlers/GetCounts.cpp @@ -23,13 +23,12 @@ #include #include #include -#include #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/GetCounts.h b/src/xrpld/rpc/handlers/GetCounts.h index dacf93fa910..57b43e44bdb 100644 --- a/src/xrpld/rpc/handlers/GetCounts.h +++ b/src/xrpld/rpc/handlers/GetCounts.h @@ -21,6 +21,7 @@ #define RIPPLE_RPC_HANDLERS_GETCOUNTS_H_INCLUDED #include + #include namespace ripple { @@ -30,4 +31,4 @@ getCountsJson(Application& app, int minObjectCount); } -#endif \ No newline at end of file +#endif diff --git a/src/xrpld/rpc/handlers/LedgerAccept.cpp b/src/xrpld/rpc/handlers/LedgerAccept.cpp index dbd7eb9f1ca..8784513363f 100644 --- a/src/xrpld/rpc/handlers/LedgerAccept.cpp +++ b/src/xrpld/rpc/handlers/LedgerAccept.cpp @@ -22,9 +22,8 @@ #include #include #include + #include -#include -#include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp index 48f024c051e..943065e5225 100644 --- a/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerCleanerHandler.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerClosed.cpp b/src/xrpld/rpc/handlers/LedgerClosed.cpp index b5644d9910e..9a188700461 100644 --- a/src/xrpld/rpc/handlers/LedgerClosed.cpp +++ b/src/xrpld/rpc/handlers/LedgerClosed.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerCurrent.cpp b/src/xrpld/rpc/handlers/LedgerCurrent.cpp index 7f1d83c17a7..8927e449536 100644 --- a/src/xrpld/rpc/handlers/LedgerCurrent.cpp +++ b/src/xrpld/rpc/handlers/LedgerCurrent.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LedgerData.cpp b/src/xrpld/rpc/handlers/LedgerData.cpp index ad26b83b43b..7bd50cc1e54 100644 --- a/src/xrpld/rpc/handlers/LedgerData.cpp +++ b/src/xrpld/rpc/handlers/LedgerData.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -169,16 +170,23 @@ doLedgerDataGrpc( } auto e = ledger->sles.end(); - if (auto key = uint256::fromVoidChecked(request.end_marker())) + if (request.end_marker().size() != 0) { + auto const key = uint256::fromVoidChecked(request.end_marker()); + + if (!key) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}}; + + if (*key < startKey) + return { + response, + {grpc::StatusCode::INVALID_ARGUMENT, + "end marker out of range"}}; + e = ledger->sles.upper_bound(*key); } - else if (request.end_marker().size() != 0) - { - grpc::Status errorStatus{ - grpc::StatusCode::INVALID_ARGUMENT, "end marker malformed"}; - return {response, errorStatus}; - } int maxLimit = RPC::Tuning::pageLength(true); diff --git a/src/xrpld/rpc/handlers/LedgerEntry.cpp b/src/xrpld/rpc/handlers/LedgerEntry.cpp index 7298ee290d8..7da99b3a764 100644 --- a/src/xrpld/rpc/handlers/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/LedgerEntry.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include @@ -32,6 +32,7 @@ #include #include #include + #include namespace ripple { @@ -821,12 +822,18 @@ parsePermissionedDomains(Json::Value const& pd, Json::Value& jvResult) return std::nullopt; } - if (!pd.isMember(jss::account) || !pd[jss::account].isString()) + if (!pd.isMember(jss::account)) { jvResult[jss::error] = "malformedRequest"; return std::nullopt; } + if (!pd[jss::account].isString()) + { + jvResult[jss::error] = "malformedAddress"; + return std::nullopt; + } + if (!pd.isMember(jss::seq) || (pd[jss::seq].isInt() && pd[jss::seq].asInt() < 0) || (!pd[jss::seq].isInt() && !pd[jss::seq].isUInt())) diff --git a/src/xrpld/rpc/handlers/LedgerHandler.cpp b/src/xrpld/rpc/handlers/LedgerHandler.cpp index 486c587d7e1..4015bb9fcc3 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.cpp +++ b/src/xrpld/rpc/handlers/LedgerHandler.cpp @@ -23,7 +23,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHandler.h b/src/xrpld/rpc/handlers/LedgerHandler.h index 0a1ba2b427e..0e47164ad3d 100644 --- a/src/xrpld/rpc/handlers/LedgerHandler.h +++ b/src/xrpld/rpc/handlers/LedgerHandler.h @@ -29,6 +29,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerHeader.cpp b/src/xrpld/rpc/handlers/LedgerHeader.cpp index b73ee260d4a..1815c8db562 100644 --- a/src/xrpld/rpc/handlers/LedgerHeader.cpp +++ b/src/xrpld/rpc/handlers/LedgerHeader.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/LedgerRequest.cpp b/src/xrpld/rpc/handlers/LedgerRequest.cpp index 8f79bb04f30..fed89daaf20 100644 --- a/src/xrpld/rpc/handlers/LedgerRequest.cpp +++ b/src/xrpld/rpc/handlers/LedgerRequest.cpp @@ -17,17 +17,13 @@ */ //============================================================================== -#include -#include #include -#include #include #include -#include + #include -#include #include -#include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogLevel.cpp b/src/xrpld/rpc/handlers/LogLevel.cpp index bf0a0e1e285..0fc266569e8 100644 --- a/src/xrpld/rpc/handlers/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/LogLevel.cpp @@ -19,11 +19,13 @@ #include #include + #include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/LogRotate.cpp b/src/xrpld/rpc/handlers/LogRotate.cpp index b7a887b0e27..959c77d718f 100644 --- a/src/xrpld/rpc/handlers/LogRotate.cpp +++ b/src/xrpld/rpc/handlers/LogRotate.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Manifest.cpp b/src/xrpld/rpc/handlers/Manifest.cpp index 1debd48422a..4d783c1d3bb 100644 --- a/src/xrpld/rpc/handlers/Manifest.cpp +++ b/src/xrpld/rpc/handlers/Manifest.cpp @@ -19,10 +19,10 @@ #include #include + #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/NFTOffers.cpp b/src/xrpld/rpc/handlers/NFTOffers.cpp index bffb3dfbb60..52a5c69ab0e 100644 --- a/src/xrpld/rpc/handlers/NFTOffers.cpp +++ b/src/xrpld/rpc/handlers/NFTOffers.cpp @@ -17,12 +17,12 @@ */ //============================================================================== -#include #include #include #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/NoRippleCheck.cpp b/src/xrpld/rpc/handlers/NoRippleCheck.cpp index 94830a4f397..a6007e9eaba 100644 --- a/src/xrpld/rpc/handlers/NoRippleCheck.cpp +++ b/src/xrpld/rpc/handlers/NoRippleCheck.cpp @@ -24,6 +24,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/OwnerInfo.cpp b/src/xrpld/rpc/handlers/OwnerInfo.cpp index 83bf8b0ef21..36c14cecafa 100644 --- a/src/xrpld/rpc/handlers/OwnerInfo.cpp +++ b/src/xrpld/rpc/handlers/OwnerInfo.cpp @@ -20,7 +20,7 @@ #include #include #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PathFind.cpp b/src/xrpld/rpc/handlers/PathFind.cpp index 6c9021ce97d..29304227c22 100644 --- a/src/xrpld/rpc/handlers/PathFind.cpp +++ b/src/xrpld/rpc/handlers/PathFind.cpp @@ -19,9 +19,9 @@ #include #include -#include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index f9c40ee776d..aaa559895c0 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,18 +17,15 @@ */ //============================================================================== -#include #include #include #include -#include + #include #include #include #include -#include #include -#include #include diff --git a/src/xrpld/rpc/handlers/Peers.cpp b/src/xrpld/rpc/handlers/Peers.cpp index f3be0df558e..33f3af27e64 100644 --- a/src/xrpld/rpc/handlers/Peers.cpp +++ b/src/xrpld/rpc/handlers/Peers.cpp @@ -17,13 +17,14 @@ */ //============================================================================== +#include #include #include #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Ping.cpp b/src/xrpld/rpc/handlers/Ping.cpp index cb0dabcb9de..e96ff190545 100644 --- a/src/xrpld/rpc/handlers/Ping.cpp +++ b/src/xrpld/rpc/handlers/Ping.cpp @@ -19,6 +19,7 @@ #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Print.cpp b/src/xrpld/rpc/handlers/Print.cpp index df501240882..d9a7f3484e1 100644 --- a/src/xrpld/rpc/handlers/Print.cpp +++ b/src/xrpld/rpc/handlers/Print.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Reservations.cpp b/src/xrpld/rpc/handlers/Reservations.cpp index 1ff2d506afa..b19b948469c 100644 --- a/src/xrpld/rpc/handlers/Reservations.cpp +++ b/src/xrpld/rpc/handlers/Reservations.cpp @@ -19,6 +19,7 @@ #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/RipplePathFind.cpp b/src/xrpld/rpc/handlers/RipplePathFind.cpp index 80c336004b4..abe1b3b9bbc 100644 --- a/src/xrpld/rpc/handlers/RipplePathFind.cpp +++ b/src/xrpld/rpc/handlers/RipplePathFind.cpp @@ -22,6 +22,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/ServerInfo.cpp b/src/xrpld/rpc/handlers/ServerInfo.cpp index 1cb90c0b9db..b303402e2da 100644 --- a/src/xrpld/rpc/handlers/ServerInfo.cpp +++ b/src/xrpld/rpc/handlers/ServerInfo.cpp @@ -17,14 +17,13 @@ */ //============================================================================== -#include #include #include #include + #include #include #include -#include #include #include #include diff --git a/src/xrpld/rpc/handlers/ServerState.cpp b/src/xrpld/rpc/handlers/ServerState.cpp index dec18eca119..dbe80c65994 100644 --- a/src/xrpld/rpc/handlers/ServerState.cpp +++ b/src/xrpld/rpc/handlers/ServerState.cpp @@ -20,9 +20,8 @@ #include #include #include -#include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignFor.cpp b/src/xrpld/rpc/handlers/SignFor.cpp index 80f5594e1ea..5a26450dbe6 100644 --- a/src/xrpld/rpc/handlers/SignFor.cpp +++ b/src/xrpld/rpc/handlers/SignFor.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/SignHandler.cpp b/src/xrpld/rpc/handlers/SignHandler.cpp index 2547ef8ead7..f6b068ddd3d 100644 --- a/src/xrpld/rpc/handlers/SignHandler.cpp +++ b/src/xrpld/rpc/handlers/SignHandler.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/rpc/handlers/Simulate.cpp b/src/xrpld/rpc/handlers/Simulate.cpp index 7d391497f63..3c7340ece32 100644 --- a/src/xrpld/rpc/handlers/Simulate.cpp +++ b/src/xrpld/rpc/handlers/Simulate.cpp @@ -21,11 +21,12 @@ #include #include #include +#include #include #include #include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/Stop.cpp b/src/xrpld/rpc/handlers/Stop.cpp index ea37a1aaa1b..03e73fb6b70 100644 --- a/src/xrpld/rpc/handlers/Stop.cpp +++ b/src/xrpld/rpc/handlers/Stop.cpp @@ -19,9 +19,8 @@ #include #include -#include -#include +#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Submit.cpp b/src/xrpld/rpc/handlers/Submit.cpp index 0a3fe419238..b0ea437cf12 100644 --- a/src/xrpld/rpc/handlers/Submit.cpp +++ b/src/xrpld/rpc/handlers/Submit.cpp @@ -18,13 +18,11 @@ //============================================================================== #include -#include #include #include #include -#include -#include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp index 5535e376818..48ac8245e86 100644 --- a/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp +++ b/src/xrpld/rpc/handlers/SubmitMultiSigned.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Subscribe.cpp b/src/xrpld/rpc/handlers/Subscribe.cpp index 66fe89dea04..35b82edb3ff 100644 --- a/src/xrpld/rpc/handlers/Subscribe.cpp +++ b/src/xrpld/rpc/handlers/Subscribe.cpp @@ -25,6 +25,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/TransactionEntry.cpp b/src/xrpld/rpc/handlers/TransactionEntry.cpp index e81e0434595..c94e95063ba 100644 --- a/src/xrpld/rpc/handlers/TransactionEntry.cpp +++ b/src/xrpld/rpc/handlers/TransactionEntry.cpp @@ -18,11 +18,11 @@ //============================================================================== #include -#include #include #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Tx.cpp b/src/xrpld/rpc/handlers/Tx.cpp index b603e3945a2..c3b3305af73 100644 --- a/src/xrpld/rpc/handlers/Tx.cpp +++ b/src/xrpld/rpc/handlers/Tx.cpp @@ -29,13 +29,13 @@ #include #include #include + #include #include #include #include #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxHistory.cpp b/src/xrpld/rpc/handlers/TxHistory.cpp index 1122eab51c3..786f7c6398a 100644 --- a/src/xrpld/rpc/handlers/TxHistory.cpp +++ b/src/xrpld/rpc/handlers/TxHistory.cpp @@ -22,16 +22,13 @@ #include #include #include -#include -#include #include #include -#include + #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/TxReduceRelay.cpp b/src/xrpld/rpc/handlers/TxReduceRelay.cpp index d8c21b3fa46..665e78f4de3 100644 --- a/src/xrpld/rpc/handlers/TxReduceRelay.cpp +++ b/src/xrpld/rpc/handlers/TxReduceRelay.cpp @@ -20,6 +20,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/UnlList.cpp b/src/xrpld/rpc/handlers/UnlList.cpp index b3394534372..4edb86b7b32 100644 --- a/src/xrpld/rpc/handlers/UnlList.cpp +++ b/src/xrpld/rpc/handlers/UnlList.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Unsubscribe.cpp b/src/xrpld/rpc/handlers/Unsubscribe.cpp index bab0d99744c..c890de593ae 100644 --- a/src/xrpld/rpc/handlers/Unsubscribe.cpp +++ b/src/xrpld/rpc/handlers/Unsubscribe.cpp @@ -21,6 +21,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidationCreate.cpp b/src/xrpld/rpc/handlers/ValidationCreate.cpp index ce53f84d951..6690e7f284d 100644 --- a/src/xrpld/rpc/handlers/ValidationCreate.cpp +++ b/src/xrpld/rpc/handlers/ValidationCreate.cpp @@ -18,7 +18,7 @@ //============================================================================== #include -#include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorInfo.cpp b/src/xrpld/rpc/handlers/ValidatorInfo.cpp index d1a63371980..638aeb7842a 100644 --- a/src/xrpld/rpc/handlers/ValidatorInfo.cpp +++ b/src/xrpld/rpc/handlers/ValidatorInfo.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include diff --git a/src/xrpld/rpc/handlers/ValidatorListSites.cpp b/src/xrpld/rpc/handlers/ValidatorListSites.cpp index 39bc4e36471..fc241072336 100644 --- a/src/xrpld/rpc/handlers/ValidatorListSites.cpp +++ b/src/xrpld/rpc/handlers/ValidatorListSites.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/Validators.cpp b/src/xrpld/rpc/handlers/Validators.cpp index 599e76f847a..4d8318d1940 100644 --- a/src/xrpld/rpc/handlers/Validators.cpp +++ b/src/xrpld/rpc/handlers/Validators.cpp @@ -20,8 +20,8 @@ #include #include #include + #include -#include namespace ripple { diff --git a/src/xrpld/rpc/handlers/WalletPropose.cpp b/src/xrpld/rpc/handlers/WalletPropose.cpp index f3300b9ed04..2c9cadcbbac 100644 --- a/src/xrpld/rpc/handlers/WalletPropose.cpp +++ b/src/xrpld/rpc/handlers/WalletPropose.cpp @@ -20,6 +20,7 @@ #include #include #include + #include #include #include @@ -28,8 +29,8 @@ #include #include #include + #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/Family.h b/src/xrpld/shamap/Family.h index bbb22c273d0..eb04df05e41 100644 --- a/src/xrpld/shamap/Family.h +++ b/src/xrpld/shamap/Family.h @@ -23,8 +23,9 @@ #include #include #include -#include + #include + #include namespace ripple { diff --git a/src/xrpld/shamap/FullBelowCache.h b/src/xrpld/shamap/FullBelowCache.h index eed7e6294a0..f792b9035f5 100644 --- a/src/xrpld/shamap/FullBelowCache.h +++ b/src/xrpld/shamap/FullBelowCache.h @@ -25,6 +25,7 @@ #include #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMap.h b/src/xrpld/shamap/SHAMap.h index c10f4eb1cb7..e63245b51c5 100644 --- a/src/xrpld/shamap/SHAMap.h +++ b/src/xrpld/shamap/SHAMap.h @@ -23,17 +23,16 @@ #include #include #include -#include #include #include #include #include #include #include -#include -#include + #include #include + #include #include diff --git a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h index 842c1092dd9..1069c363ecb 100644 --- a/src/xrpld/shamap/SHAMapAccountStateLeafNode.h +++ b/src/xrpld/shamap/SHAMapAccountStateLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapInnerNode.h b/src/xrpld/shamap/SHAMapInnerNode.h index d2791915c3c..c45621d0c19 100644 --- a/src/xrpld/shamap/SHAMapInnerNode.h +++ b/src/xrpld/shamap/SHAMapInnerNode.h @@ -20,20 +20,12 @@ #ifndef RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPINNERNODE_H_INCLUDED -#include #include #include #include -#include -#include #include -#include -#include #include -#include -#include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapItem.h b/src/xrpld/shamap/SHAMapItem.h index 2aba5d5d8eb..4c9ce654692 100644 --- a/src/xrpld/shamap/SHAMapItem.h +++ b/src/xrpld/shamap/SHAMapItem.h @@ -26,6 +26,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapLeafNode.h b/src/xrpld/shamap/SHAMapLeafNode.h index d5d84d3f003..9ff46a9bb75 100644 --- a/src/xrpld/shamap/SHAMapLeafNode.h +++ b/src/xrpld/shamap/SHAMapLeafNode.h @@ -25,7 +25,6 @@ #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapMissingNode.h b/src/xrpld/shamap/SHAMapMissingNode.h index 50aa193b2b6..73ffe0090a8 100644 --- a/src/xrpld/shamap/SHAMapMissingNode.h +++ b/src/xrpld/shamap/SHAMapMissingNode.h @@ -21,7 +21,9 @@ #define RIPPLE_SHAMAP_SHAMAPMISSINGNODE_H_INCLUDED #include + #include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapNodeID.h b/src/xrpld/shamap/SHAMapNodeID.h index 176553fd7d3..abdca3a55ad 100644 --- a/src/xrpld/shamap/SHAMapNodeID.h +++ b/src/xrpld/shamap/SHAMapNodeID.h @@ -22,8 +22,8 @@ #include #include + #include -#include #include #include diff --git a/src/xrpld/shamap/SHAMapSyncFilter.h b/src/xrpld/shamap/SHAMapSyncFilter.h index b14effac88b..a2ac2f99e84 100644 --- a/src/xrpld/shamap/SHAMapSyncFilter.h +++ b/src/xrpld/shamap/SHAMapSyncFilter.h @@ -20,8 +20,8 @@ #ifndef RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED #define RIPPLE_SHAMAP_SHAMAPSYNCFILTER_H_INCLUDED -#include #include + #include /** Callback for filtering SHAMap during sync. */ diff --git a/src/xrpld/shamap/SHAMapTreeNode.h b/src/xrpld/shamap/SHAMapTreeNode.h index d6b0ebce9e1..6f209d13d79 100644 --- a/src/xrpld/shamap/SHAMapTreeNode.h +++ b/src/xrpld/shamap/SHAMapTreeNode.h @@ -22,15 +22,11 @@ #include #include -#include + #include -#include -#include #include #include -#include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/SHAMapTxLeafNode.h b/src/xrpld/shamap/SHAMapTxLeafNode.h index f4d3f21e908..7444e61813e 100644 --- a/src/xrpld/shamap/SHAMapTxLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h index 6ea55f4ac46..78cc919b4e1 100644 --- a/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h +++ b/src/xrpld/shamap/SHAMapTxPlusMetaLeafNode.h @@ -22,7 +22,7 @@ #include #include -#include + #include #include #include diff --git a/src/xrpld/shamap/TreeNodeCache.h b/src/xrpld/shamap/TreeNodeCache.h index f59fdc92801..3eead799a3a 100644 --- a/src/xrpld/shamap/TreeNodeCache.h +++ b/src/xrpld/shamap/TreeNodeCache.h @@ -22,6 +22,8 @@ #include +#include + namespace ripple { using TreeNodeCache = TaggedCache; diff --git a/src/xrpld/shamap/detail/NodeFamily.cpp b/src/xrpld/shamap/detail/NodeFamily.cpp index bf95003aef8..21dbe7469e8 100644 --- a/src/xrpld/shamap/detail/NodeFamily.cpp +++ b/src/xrpld/shamap/detail/NodeFamily.cpp @@ -21,6 +21,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMap.cpp b/src/xrpld/shamap/detail/SHAMap.cpp index 09a546be147..7c3fadbec90 100644 --- a/src/xrpld/shamap/detail/SHAMap.cpp +++ b/src/xrpld/shamap/detail/SHAMap.cpp @@ -23,6 +23,7 @@ #include #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapDelta.cpp b/src/xrpld/shamap/detail/SHAMapDelta.cpp index baabd4ef139..a6c54b6f22f 100644 --- a/src/xrpld/shamap/detail/SHAMapDelta.cpp +++ b/src/xrpld/shamap/detail/SHAMapDelta.cpp @@ -18,6 +18,7 @@ //============================================================================== #include + #include #include diff --git a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp index b2fba1f9314..7d3c3c8fb26 100644 --- a/src/xrpld/shamap/detail/SHAMapInnerNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapInnerNode.cpp @@ -18,20 +18,17 @@ //============================================================================== #include - #include #include -#include + #include #include #include -#include #include #include #include #include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp index 72ec177fb39..cdf0f80a840 100644 --- a/src/xrpld/shamap/detail/SHAMapLeafNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapLeafNode.cpp @@ -18,8 +18,6 @@ //============================================================================== #include -#include -#include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapNodeID.cpp b/src/xrpld/shamap/detail/SHAMapNodeID.cpp index 7f093dbe46e..efe4f959361 100644 --- a/src/xrpld/shamap/detail/SHAMapNodeID.cpp +++ b/src/xrpld/shamap/detail/SHAMapNodeID.cpp @@ -19,9 +19,9 @@ #include #include + #include #include -#include #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapSync.cpp b/src/xrpld/shamap/detail/SHAMapSync.cpp index 4f938257511..092b1efc5ad 100644 --- a/src/xrpld/shamap/detail/SHAMapSync.cpp +++ b/src/xrpld/shamap/detail/SHAMapSync.cpp @@ -19,6 +19,7 @@ #include #include + #include namespace ripple { diff --git a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp index fe5b5377eee..c50683213cd 100644 --- a/src/xrpld/shamap/detail/SHAMapTreeNode.cpp +++ b/src/xrpld/shamap/detail/SHAMapTreeNode.cpp @@ -19,18 +19,16 @@ #include #include -#include #include #include #include + #include #include #include #include -#include #include #include -#include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.h b/src/xrpld/shamap/detail/TaggedPointer.h index 48534076548..beee32a9451 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.h +++ b/src/xrpld/shamap/detail/TaggedPointer.h @@ -23,7 +23,6 @@ #include #include -#include #include #include diff --git a/src/xrpld/shamap/detail/TaggedPointer.ipp b/src/xrpld/shamap/detail/TaggedPointer.ipp index 0e67947a8ed..bed821b5c9d 100644 --- a/src/xrpld/shamap/detail/TaggedPointer.ipp +++ b/src/xrpld/shamap/detail/TaggedPointer.ipp @@ -19,13 +19,13 @@ #include #include -#include -#include -#include +#include #include +#include + namespace ripple { namespace { From 1573a443b713cb6a119c4324a0a78ec14555de23 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Mon, 24 Mar 2025 17:07:17 -0400 Subject: [PATCH 003/212] smart escrow devnet 1 host functions (#5353) * devnet 1 host functions * clang-format * fix build issues --- examples/example/src/example.cpp | 4 +- include/xrpl/protocol/FeeUnits.h | 4 +- include/xrpl/protocol/MPTAmount.h | 3 +- include/xrpl/protocol/XRPAmount.h | 3 +- src/test/app/Escrow_test.cpp | 56 +- src/test/app/Wasm_test.cpp | 6491 +++++++---------------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 118 + src/xrpld/app/misc/WasmHostFuncImpl.h | 69 + src/xrpld/app/misc/WasmVM.cpp | 807 ++- src/xrpld/app/misc/WasmVM.h | 105 +- src/xrpld/app/tx/detail/Escrow.cpp | 26 +- 11 files changed, 2596 insertions(+), 5090 deletions(-) create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncImpl.h diff --git a/examples/example/src/example.cpp b/examples/example/src/example.cpp index 8c3acdee075..41dcd624624 100644 --- a/examples/example/src/example.cpp +++ b/examples/example/src/example.cpp @@ -2,7 +2,9 @@ #include -int main(int argc, char const** argv) { +int +main(int argc, char const** argv) +{ std::printf("%s\n", ripple::BuildInfo::getVersionString().c_str()); return 0; } diff --git a/include/xrpl/protocol/FeeUnits.h b/include/xrpl/protocol/FeeUnits.h index 0cbf1b608a2..fd760d07aec 100644 --- a/include/xrpl/protocol/FeeUnits.h +++ b/include/xrpl/protocol/FeeUnits.h @@ -451,8 +451,8 @@ mulDivU(Source1 value, Dest mul, Source2 div) } using namespace boost::multiprecision; - - uint128_t product; + using uint128 = boost::multiprecision::uint128_t; + uint128 product; product = multiply( product, static_cast(value.value()), diff --git a/include/xrpl/protocol/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h index 244d6839156..cf00aa81fb5 100644 --- a/include/xrpl/protocol/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -152,11 +152,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.value()); + int128 const amt128(amt.value()); auto const neg = amt.value() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/include/xrpl/protocol/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h index 1d6cae9ecf2..bdd0f0b7977 100644 --- a/include/xrpl/protocol/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -286,11 +286,12 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; + using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128_t const amt128(amt.drops()); + int128 const amt128(amt.drops()); auto const neg = amt.drops() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1f872d2bdc7..0ac8bba8a0e 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1672,22 +1672,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // featureSmartEscrow disabled @@ -1827,22 +1827,22 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] // pub fn ready() -> bool { - // unsafe { host_lib::get_ledger_sqn() >= 5} + // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; { // basic FinishFunction situation diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 31e8007c72c..ce8d836269c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -132,4601 +132,2020 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(true); } - void - testEscrowWasmP0() - { - testcase("escrow wasm P0 test"); - auto wasmHex = - "0061736d0100000001090260017f017f6000000305040001010004050170010101" - "05030100100609017f01418080c0000b071802066d656d6f727902000b6d6f636b" - "5f657363726f7700030a25040800200041056f450b02000b0e0010818080800010" - "81808080000b08002000100010020b0072046e616d650011106d6f636b5f657363" - "726f772e7761736d014404000b6d6f636b5f657363726f77010564756d6d790211" - "5f5f7761736d5f63616c6c5f64746f7273031a6d6f636b5f657363726f772e636f" - "6d6d616e645f6578706f7274071201000f5f5f737461636b5f706f696e74657200" - "c0010970726f64756365727302086c616e67756167650204527573740003433131" - "000c70726f6365737365642d62790205727573746325312e38332e302d6e696768" - "746c79202863326637346333663920323032342d30392d30392905636c616e675f" - "31382e312e322d776173692d73646b202868747470733a2f2f6769746875622e63" - "6f6d2f6c6c766d2f6c6c766d2d70726f6a65637420323661316436363031643732" - "376139366634333031643064383634376235613432373630616530632900560f74" - "61726765745f6665617475726573052b0b62756c6b2d6d656d6f72792b0a6d756c" - "746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e" - "63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - - re = runEscrowWasm(wasm, funcName, 11); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - void testBadWasm() { testcase("bad wasm test"); + + HostFunctions hfs; auto wasmHex = "00000000"; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, 15); + auto re = runEscrowWasm(wasm, funcName, &hfs, 15); BEAST_EXPECT(re.error()); } void - testEscrowWasmP1() + testEscrowWasmDN1() { - testcase("escrow wasm P1 test"); + testcase("escrow wasm devnet 1 test"); auto wasmHex = - "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" - "00030c0b01010200000000000003000405017001030305030100110619037f0141" - "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" - "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" - "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" - "200010012200450d0120000f0b230041206b220024002000410036021820004101" - "36020c200041b480c00036020820004204370210200041086a41d080c000100500" - "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" - "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" - "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" - "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" - "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" - "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" - "0245044041002100410021010c040b4100210020054100411920074101766b2007" - "411f461b7421044100210103400240200228020441787122062005490d00200620" - "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" - "021422062000200620022004411d764104716a41106a2802002202471b20002006" - "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" - "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" - "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" - "000b20012000410372360204200020016a220020002802044101723602040c060b" - "024041022000742203410020036b72200120007471682206410374220041a483c0" - "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" - "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" - "360204200120056a2206200020056b2204410172360204200020016a2004360200" - "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" - "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" - "200220057236020020000c010b20002802080b2102200020033602082002200336" - "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" - "043602000c050b200068410274419482c0006a280200220128020441787120056b" - "2103200121020240034002400240200128021022000d00200128021422000d0020" - "022802182107024002402002200228020c22004604402002411441102002280214" - "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" - "013602080c010b200241146a200241106a20001b21040340200421062001220041" - "146a200041106a200028021422011b210420004114411020011b6a28020022010d" - "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" - "28020047044020074110411420072802102002461b6a20003602002000450d040c" - "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" - "77713602000c030b200028020441787120056b22012003200120034922011b2103" - "2000200220011b2102200021010c010b0b20002007360218200228021022010440" - "20002001360210200120003602180b20022802142201450d002000200136021420" - "0120003602180b02400240200341104f044020022005410372360204200220056a" - "22062003410172360204200320066a200336020041b485c0002802002204450d01" - "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" - "2205410120044103767422047145044041ac85c000200420057236020020000c01" - "0b20002802080b2104200020013602082004200136020c2001200036020c200120" - "043602080c010b2002200320056a2200410372360204200020026a220020002802" - "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" - "41086a0f0b20002001724504404100210141022007742200410020006b72200871" - "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" - "20012000280204417871220420056b220620034922071b21082000280210220245" - "0440200028021421020b20012008200420054922001b210120032006200320071b" - "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" - "200020056b4f710d0020012802182107024002402001200128020c220046044020" - "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" - "2202200036020c200020023602080c010b200141146a200141106a20001b210403" - "40200421062002220041146a200041106a200028021422021b2104200041144110" - "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" - "28021c410274419482c0006a220228020047044020074110411420072802102001" - "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" - "b085c000280200417e200128021c77713602000c010b2000200736021820012802" - "102202044020002002360210200220003602180b20012802142202450d00200020" - "02360214200220003602180b0240200341104f0440200120054103723602042001" - "20056a22022003410172360204200220036a200336020020034180024f04402002" - "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" - "410120034103767422037145044041ac85c000200320047236020020000c010b20" - "002802080b2103200020023602082003200236020c2002200036020c2002200336" - "02080c010b2001200320056a2200410372360204200020016a2200200028020441" - "01723602040b0c010b024002400240024002400240200541b485c0002802002201" - "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" - "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" - "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" - "02002201200020002001491b3602000240024041c085c000280200220304404194" - "83c0002100034020002802002201200028020422066a2002460d02200028020822" - "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" - "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" - "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" - "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" - "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" - "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" - "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" - "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" - "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" - "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" - "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" - "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" - "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" - "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" - "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" - "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" - "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" - "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" - "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" - "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" - "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" - "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" - "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" - "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" - "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" - "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" - "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" - "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" - "85c000200441286b220036020020022000410172360204200020026a4128360204" - "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" - "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" - "20046a2101419483c0002100024002400340200120002802002206470440200028" - "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" - "0028020022014f04402003200120002802046a2206490d010b200028020821000c" - "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" - "0172360204200020026a412836020441cc85c00041808080013602002003200641" - "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" - "002109200141106a419c83c00029020037020020012009370208419883c0002004" - "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" - "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" - "012003460d0720012001280204417e713602042003200120036b22004101723602" - "042001200036020020004180024f04402003200010070c080b200041f8017141a4" - "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" - "ac85c000200020027236020020010c010b20012802080b21002001200336020820" - "00200336020c2003200136020c200320003602080c070b20002002360200200020" - "0028020420046a360204200220054103723602042006410f6a41787141086b2201" - "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" - "460d04200128020422054103714101460440200120054178712200100820002001" - "6a22012802042105200020036a21030b20012005417e7136020420042003410172" - "360204200320046a200336020020034180024f04402004200310070c060b200341" - "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" - "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" - "043602082003200436020c2004200036020c200420033602080c050b41b885c000" - "200020056b220136020041c085c00041c085c000280200220020056a2202360200" - "2002200141017236020420002005410372360204200041086a21000c060b41bc85" - "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" - "85c000410036020020002001410372360204200020016a22012001280204410172" - "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" - "2002410172360204200020016a2002360200200020054103723602040b20004108" - "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" - "71220141086b220236020041b885c00041b885c00028020020046a220320002001" - "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" - "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" - "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" - "0041b485c00041b485c00028020020036a22003602002004200041017236020420" - "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" - "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" - "20056a22023602002002200141017236020420002005410372360204200041086a" - "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" - "402007410020076b41037122026a21062002044020072103418080c00021050340" - "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" - "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" - "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" - "6b411871210820052802002105034020062005200c762004280200220520087472" - "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" - "20022104034020062004280200360200200441046a2104200641046a2206200349" - "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" - "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" - "4122460440200021032007210241002105412221080240034020032d0000220920" - "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" - "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" - "0b000bd20601047f0240200041046b280200220241787122034104410820024103" - "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" - "0041046b280200220341787122006a21020240024020034101710d002003410271" - "450d012001280200220320006a2100200120036b220141bc85c000280200460440" - "20022802044103714103470d0141b485c000200036020020022002280204417e71" - "36020420012000410172360204200220003602000c020b2001200310080b024002" - "4002400240024020022802042203410271450440200241c085c000280200460d02" - "200241bc85c000280200460d0320022003417871220210082001200020026a2200" - "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" - "0020003602000c060b20022003417e713602042001200041017236020420002001" - "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" - "c00028020041016b220036020020000d04419c83c0002802002200044003402001" - "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" - "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" - "003602002001200041017236020441bc85c000280200200146044041b485c00041" - "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" - "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" - "00210103402002200128020022054f04402002200520012802046a490d040b2001" - "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" - "20006a220036020020012000410172360204200020016a20003602000c020b2000" - "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" - "007145044041ac85c000200020037236020020020c010b20022802080b21002002" - "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" - "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" - "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" - "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" - "7f230041206b220224002002410036021020024101360204200242043702082002" - "412e36021c200220003602182002200241186a360200200220011005000ba40201" - "037f230041206b22022400200241106a2203200041106a29020037030020024108" - "6a2204200041086a290200370300200241013b011c200220013602182002200029" - "0200370300230041206b2200240020022802182101200041106a20032902003703" - "00200041086a20042902003703002000200236021c200020013602182000200229" - "020037030041002102230041106b22012400200028020c21030240024002400240" - "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" - "2802042102200328020021030c010b20014180808080783602002001200036020c" - "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" - "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" - "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" - "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" - "2002410274419482c0006a21044101200274220341b085c0002802007145044020" - "042000360200200020043602182000200036020c2000200036020841b085c00041" - "b085c0002802002003723602000f0b024002402001200428020022032802044178" - "71460440200321020c010b20014100411920024101766b2002411f461b74210503" - "4020032005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c200220" - "00360208200041003602182000200236020c200020013602080f0b200420003602" - "00200020033602182000200036020c200020003602080bf10201047f200028020c" - "21020240024020014180024f044020002802182103024002402000200246044020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" - "2201200236020c200220013602080c010b200041146a200041106a20021b210403" - "40200421052001220241146a200241106a200228021422011b2104200241144110" - "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" - "0274419482c0006a220128020047044020034110411420032802102000461b6a20" - "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" - "280200417e200028021c77713602000c020b200028020822002002470440200020" - "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" - "77713602000f0b2002200336021820002802102201044020022001360210200120" - "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" - "017f230041106b22032400419082c000419082c000280200220441016a36020002" - "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" - "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" - "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" - "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" - "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" - "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" - "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" - "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" - "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" - "64006000100029000000a804000009000000617373657274696f6e206661696c65" - "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" - "6765010452757374000c70726f6365737365642d62790105727573746325312e38" - "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" - "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("check_accountID"); - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; - std::vector data(str.begin(), str.end()); - auto re = runEscrowWasm(wasm, funcName, data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP2P3() - { - testcase("escrow wasm P2 & P3 test"); - auto wasmHex = - "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" - "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" - "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" - "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" - "616004030305060001070808080809040702000000040403030304030500020306" - "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" - "0903020201020200000405000203030402020205100b0303000005030101010104" - "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" - "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" - "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" - "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" - "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" - "360228200320023602242003200136022020034180013a002c2003410036021c20" - "03428080808010370214200341c8006a200341146a108180808000024002400240" - "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" - "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" - "2903483703300240024020032802282202200328022422064f0d00200328022021" - "070340200720026a2d000041776a220141174b0d02410120017441938080047145" - "0d022006200241016a2202470d000b200320063602280b20002003290330370300" - "200041106a2004290300370300200041086a200529030037030020032802142202" - "450d04200328021820021082808080000c040b20032002360228200341086a2007" - "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" - "200328020c21012003280208210641141084808080002202450d01200220063602" - "0c2002411636020020002002360204200041063a00002002200136021020034130" - "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" - "032802142202450d00200328021820021082808080000b200341e0006a24808080" - "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" - "210302400240024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f0006a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" - "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" - "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241386a200320052005200441016a220420052004491b" - "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" - "84808080002207450d1f2007200836020c20074105360200200720043602100c08" - "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" - "c080001a200228024c21042002280248210841141084808080002207450d1e2007" - "200836020c20074107360200200720043602100c070b20022902dc02210e200228" - "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228024421042002280240210841141084808080002207450d1c2007200836020c" - "20074115360200200720043602100c050b200241b0016a20011081808080000240" - "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" - "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" - "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" - "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" - "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" - "000120042007360204200441106a2003290300370300200441036a20052d00003a" - "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" - "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" - "0000200420083602100c180b200628020021030b200241306a2003200520052004" - "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" - "042002280230210841141084808080002207450d172007200836020c2007410236" - "0200200720043602100b200241d8026a109180808000024020022802d802220445" - "0d002009200441186c1082808080000b200128020c210320012802142104200128" - "0210210541062106410121090b200120012d001841016a3a001802400240200420" - "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" - "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" - "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28021421082002280210210541141084808080002204450d1d200441163602000c" - "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" - "41776a220841174b0d024101200874419380800471450d022001200441016a2204" - "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" - "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" - "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" - "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" - "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" - "210541141084808080002204450d1a200441153602000c040b200241206a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228022421082002280220210541141084808080002204450d1920044116360200" - "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" - "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" - "001a200228021c21082002280218210541141084808080002204450d1620044102" - "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" - "01200220073602b401200220063a00b001024020090d00200241063a0078200220" - "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" - "200241c8016a1092808080000c110b200241086a20032005200520042005200449" - "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" - "1084808080002204450d142004200136020c200441183602002000200436020420" - "0041063a0000200420083602100c130b200141003602082001200441016a360214" - "200241b0016a2006200110938080800020022802b40121080240024020022802b0" - "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" - "948080800020022d00784106460d1320002002290378370300200041106a200241" - "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" - "150b41002101024020044100480d00024020040d0041012101410021050c030b41" - "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" - "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" - "086a220320012008200410df808080003602002002200536027c200241033a0078" - "2002200436028401200041106a200241f8006a41106a290300370300200041086a" - "2003290300370300200020022903783703000c120b2001200441016a3602142002" - "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" - "20024190016a109680808000024020022d00784106460d00200020022903783703" - "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" - "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" - "200020043602040c120b2000200228029801360204200041063a00000c110b0240" - "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" - "14200141bb80c0800041031086808080002204450d02200041063a000020002004" - "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" - "0a490d042002200320052005200441016a220420052004491b1083808080004100" - "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" - "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" - "200241003a007820002002290378370300200041086a200241f8006a41086a2903" - "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" - "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" - "00200020043602040c0e0b20024181023b01782000200229037837030020004108" - "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" - "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" - "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" - "02290378370300200041086a200241f8006a41086a290300370300200041106a20" - "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" - "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" - "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" - "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" - "21070c070b20022802d401220441003602082004200428021441016a3602142002" - "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" - "460d06200241d8026a200720022802b801109880808000024020022802d8022204" - "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" - "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" - "41003602dc01200220053602e002200220083602dc02200220043602d802200241" - "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" - "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" - "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" - "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" - "024020022d00b101450d0020022802d40122044100360208200420042802144101" - "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" - "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" - "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" - "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" - "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" - "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" - "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" - "290300220f370300200220022903b00122103703d802200541106a200e37020020" - "0541086a200f3702002005201037020020024180026a41086a200c290200370300" - "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" - "186a280200360200200220022902b00137038002200220033602a4022002200736" - "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" - "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" - "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" - "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" - "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" - "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" - "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" - "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" - "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" - "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" - "200820041082808080000b200241dc016a109b808080000b41062106410121090b" - "200120012d001841016a3a0018200128020c210302400240024020012802142204" - "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" - "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" - "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" - "21040c050b200241e8006a200320052005200441016a220420052004491b108380" - "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" - "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" - "200441016a220436021420052004470d000b200521040b200241e0006a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28026421082002280260210541141084808080002204450d072004200536020c20" - "044103360200200420083602100c010b200241d8006a200320052005200441016a" - "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" - "280258210541141084808080002204450d062004200536020c2004411636020020" - "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" - "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" - "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" - "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" - "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" - "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" - "80000c010b200241d0006a200320052005200420052004491b1083808080004100" - "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" - "0d042004200136020c2004411836020020002004360204200041063a0000200420" - "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" - "200041063a0000200020043602040c010b20002002290378370300200041106a20" - "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" - "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" - "002202417871220341044108200241037122021b20016a490d0002402002450d00" - "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" - "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" - "0301057f02400240024002400240024020022003490d0041012104410021052003" - "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" - "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" - "418a94a8d000736b20077241808182847871418081828478460d00034020062001" - "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" - "034109490d0103400240024020074108480d004180828408200120076a22064178" - "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" - "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" - "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" - "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" - "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" - "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" - "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" - "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" - "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" - "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" - "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" - "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" - "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" - "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" - "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" - "0041002100410021060c040b4100210020024100411920054101766b2005411f46" - "1b74210741002106034002402001220128020441787122082002490d0020082002" - "6b220820034f0d00200821032001210620080d004100210320012106200121000c" - "060b200128021422082000200820012007411d764104716a41106a280200220147" - "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" - "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" - "0022032802082206460d002006200236020c200220063602080c010b4100200141" - "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" - "0204410172360204200341086a0f0b024002402000200374410220037422004100" - "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" - "0022002802082207460d002007200636020c200620073602080c010b4100200141" - "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" - "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" - "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" - "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" - "d2c08000200621010c010b200628020821010b200620033602082001200336020c" - "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" - "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" - "787120026b2103200621010240024003400240200628021022000d002006280214" - "22000d0020012802182105024002400240200128020c22002001470d0020014114" - "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" - "0036020c200020063602080c010b200141146a200141106a20001b210703402007" - "21082006220041146a200041106a200028021422061b210720004114411020061b" - "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" - "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" - "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" - "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" - "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" - "360218024020012802102206450d0020002006360210200620003602180b200128" - "02142206450d0020002006360214200620003602180b0240024002402003411049" - "0d0020012002410372360204200120026a22022003410172360204200220036a20" - "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" - "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" - "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" - "0b200620003602082007200036020c2000200636020c200020073602080c010b20" - "01200320026a2200410372360204200120006a220020002802044101723602040c" - "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" - "4020002006720d004100210641022005742200410020006b722004712200450d03" - "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" - "280204417871220120026b220820034922051b2104200120024921072008200320" - "051b21080240200028021022010d00200028021421010b2006200420071b210620" - "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" - "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" - "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" - "410021000c020b20062802082201200036020c200020013602080c010b20064114" - "6a200641106a20001b21070340200721082001220041146a200041106a20002802" - "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" - "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" - "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" - "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" - "c080000c010b20002005360218024020062802102201450d002000200136021020" - "0120003602180b20062802142201450d0020002001360214200120003602180b02" - "40024020034110490d0020062002410372360204200620026a2200200341017236" - "0204200020036a200336020002402003418002490d002000200310d7808080000c" - "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" - "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" - "200228020821030b200220003602082003200036020c2000200236020c20002003" - "3602080c010b2006200320026a2200410372360204200620006a22002000280204" - "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" - "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" - "200241af80046a220641107640002203417f4622070d0720034110742201450d07" - "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" - "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" - "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" - "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" - "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" - "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" - "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" - "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" - "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" - "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" - "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" - "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" - "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" - "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" - "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" - "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" - "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" - "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" - "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" - "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" - "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" - "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" - "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" - "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" - "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" - "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" - "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" - "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" - "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" - "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" - "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" - "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" - "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" - "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" - "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" - "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" - "003602f0d2c0800020012000410172360204200120006a41283602044100418080" - "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" - "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" - "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" - "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" - "02402000280200220620034b0d002003200620002802046a2206490d020b200028" - "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" - "800020012000410172360204200120006a412836020441004180808001360284d3" - "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" - "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" - "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" - "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" - "200041046a22002006490d000b20072003460d0720072007280204417e71360204" - "2003200720036b22004101723602042007200036020002402000418002490d0020" - "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" - "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" - "c08000200621000c010b200628020821000b200620033602082000200336020c20" - "03200636020c200320003602080c070b200020013602002000200028020420086a" - "360204200120024103723602042007410f6a41787141786a2206200120026a2200" - "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" - "200628020422024103714101470d0020062002417871220210a880808000200220" - "036a2103200620026a220628020421020b20062002417e71360204200020034101" - "72360204200020036a200336020002402003418002490d002000200310d7808080" - "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" - "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" - "010b200228020821030b200220003602082003200036020c2000200236020c2000" - "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" - "8000220020026a22063602f8d2c080002006200341017236020420002002410372" - "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" - "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" - "410372360204200320006a220020002802044101723602040c010b410020063602" - "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" - "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" - "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" - "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" - "d2c0800020062001410172360204200020036a4128360204410041808080013602" - "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" - "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" - "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" - "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" - "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" - "0020026a22063602f8d2c080002006200341017236020420002002410372360204" - "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" - "02000b200041046a109b808080000c020b20002802042201450d01200028020820" - "011082808080000f0b200041046a10918080800020002802042201450d00200028" - "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" - "80808080002000280214220420002802102205200420054b1b2106200028020c21" - "0702400240024002400340024020020d00410021040c050b20062004460d012000" - "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" - "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" - "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" - "8080002204450d01200441093602000c020b200320072005200610838080800041" - "002d00c0cfc080001a200328020421012003280200210241141084808080002204" - "450d00200441053602000c010b000b2004200236020c200420013602100b200341" - "106a24808080800020040b970202027f027e23808080800041106b220424808080" - "8000024002400240024002400240024002402001280214220520012802104f0d00" - "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" - "020b2002450d02420121060c050b20042001200220034100108880808000200428" - "02000d020c030b200420012002200341001089808080002004280200450d022000" - "2004280204360208200042033703000c040b420021060240420020037d22074200" - "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" - "020b20002004280204360208200042033703000c020b2004290308210342002106" - "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" - "23808080800041106b220524808080800020012001280214220641016a22073602" - "140240024002402007200128021022084f0d00200720086b2109200128020c210a" - "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" - "410a490d00024020060d002005200a20082008200741016a220720082007491b10" - "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" - "808080002207450d072007200c36020c2007410d36020020002007360204200041" - "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" - "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" - "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" - "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" - "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" - "20002001200220032007108b808080000c010b200541086a200128020c20082008" - "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" - "0c21062005280208210c41141084808080002207450d012007200c36020c200741" - "053602002000200736020420004101360200200720063602100b200541106a2480" - "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" - "0620012001280214220741016a220836021402402008200128021022094f0d0041" - "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" - "2001200741026a22083602140b200128020c210a02400240024002400240024002" - "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" - "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" - "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" - "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" - "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" - "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" - "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" - "042007200836020c20074105360200200020073602042000410136020020072001" - "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" - "020421012005280200210841141084808080002207450d032007200836020c2007" - "410d3602002000200736020420004101360200200720013602100c040b20042008" - "6a2207411f7541808080807873200720084100482007200448731b21070b200020" - "01200220032007108b808080000c020b2000200120022003502006108c80808000" - "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" - "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" - "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" - "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" - "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" - "22052480808080002003ba2106024002400240024002400240024020042004411f" - "7522077320076b220741b502490d0003402006440000000000000000610d062004" - "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" - "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" - "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" - "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" - "84808080002204450d022004200136020c2004410e360200200020043602042004" - "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" - "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" - "28020c21072005280208210141141084808080002204450d012004200136020c20" - "04410e36020020002004360204200420073602100b410121040c020b000b200020" - "0620069a20021b390308410021040b20002004360200200541106a248080808000" - "0b840201027f23808080800041106b220524808080800002400240024002402004" - "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" - "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" - "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" - "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" - "1084808080002204450d002004200336020c2004410e3602002000200436020420" - "042001360210410121040c020b000b200044000000000000000044000000000000" - "008020021b390308410021040b20002004360200200541106a2480808080000b95" - "0502067f017e23808080800041306b2203248080808000200128020c2104024002" - "40024002400240024020012802142205200128021022064f0d002001200541016a" - "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" - "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" - "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" - "21072003280218210441141084808080002201450d022001200436020c20014105" - "3602002000200136020820004203370300200120073602100c040b200341086a20" - "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" - "1a200328020c21072003280208210441141084808080002201450d012001200436" - "020c2001410d3602002000200136020820004203370300200120073602100c030b" - "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" - "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" - "01450d012001200436020c2001410d360200200020013602082000420337030020" - "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" - "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" - "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" - "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" - "0b0b200341206a200120022009108e808080000240024020032802200d00200020" - "032b0328390308420021090c010b20002003280224360208420321090b20002009" - "3703000c020b000b20002001200220091087808080000b200341306a2480808080" - "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" - "0641016a2107200520066b2108200128020c20066a210541002104034002402005" - "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" - "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" - "200720046a3602142008200441016a2204470d000b200821040b20002001200220" - "032004108b808080000f0b200020012002200320041088808080000bc80101047f" - "23808080800041206b2202248080808000024002400240200028020c450d002000" - "21010c010b200241106a41086a2203200041086a28020036020020022000290200" - "370310200241086a200128020c2001280210200128021410838080800041002d00" - "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" - "200120022903103702002001200536020c20012004360210200141086a20032802" - "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "014108411810d480808000024020012802082200418180808078460d0020002001" - "28020c109580808000000b200141106a2480808080000b950101027f0240200028" - "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" - "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" - "0041046a28020020021082808080000c010b200010918080800020002802002202" - "450d00200041046a280200200241186c1082808080000b200041186a2100200141" - "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" - "01020b20002802082201450d01200028020420011082808080000c010b20002d00" - "044103470d00200028020822012802002102024020012802042203280200220445" - "0d002002200411808080800080808080000b024020032802042203450d00200220" - "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" - "097f017e23808080800041306b2203248080808000024002400240024002400240" - "0240024002400340024002402001280208220420012802042205460d0002400240" - "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" - "00460d0120074120490d012006200441016a22086a21094100200520086b417871" - "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" - "800020012802042105200128020821070c040b200741086a2107200b41086a2109" - "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" - "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" - "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" - "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" - "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" - "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" - "1084808080002207450d052007200936020c200741043602002000200736020420" - "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" - "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" - "024020094122470d002002280208450d0520072004490d072002200b20046a2007" - "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" - "0204200228020810ca8080800020032802282207450d032000200328022c360208" - "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" - "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" - "450d052007200936020c2007411036020020002007360204200041023602002007" - "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" - "80002001200741016a2209360208024020092005490d00200341206a200b200520" - "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" - "1084808080002207450d06200741043602000c090b2001200741026a2204360208" - "02400240024002400240024002400240024002400240200b20096a2d0000220741" - "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" - "00470d020240200228020822072002280200470d00200210cb808080000b200220" - "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" - "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" - "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" - "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" - "22072002280200470d00200210cb808080000b2002200741016a36020820022802" - "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" - "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" - "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" - "02200741016a360208200228020420076a41083a0000410021070c050b02402002" - "28020822072002280200470d00200210cb808080000b2002200741016a36020820" - "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" - "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" - "0000410021070c030b0240200228020822072002280200470d00200210cb808080" - "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" - "40200228020822072002280200470d00200210cb808080000b2002200741016a36" - "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" - "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" - "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" - "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" - "40024020032802282207450d002000200328022c3602084100210b0c010b410221" - "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" - "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" - "200936020c2007200b3602100b20004102360200200020073602040b200341306a" - "2480808080000b7901027f410021030240024020024100480d00024020020d0041" - "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" - "040d01410121030b20032002109580808000000b20042001200210df8080800021" - "012000200236020c2000200136020820002003360204200041033a00000b100002" - "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" - "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" - "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" - "370308200041023a0000200020012903083703100f0b200041023a000020002001" - "290308220337031020002003423f883703080bb40701077f23808080800041306b" - "22022480808080002001280200220328020c210402400240024002402003280214" - "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" - "174b0d024101200874419380800471450d022003200541016a2205360214200620" - "05470d000b200621050b41012108200241286a200420062006200541016a220520" - "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" - "210341141084808080002205450d022005200336020c2005410336020020002005" - "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" - "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" - "20053602140240200520064f0d00034002400240024002400240200420056a2d00" - "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" - "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" - "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" - "0c21062002280208210341141084808080002205450d092005200336020c200541" - "1136020020002005360204200520063602100c080b200041013a0001410021080c" - "070b41012108200241186a200420062006200541016a220520062005491b108380" - "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" - "80002205450d072005200336020c20054115360200200020053602042005200636" - "02100c060b2003200541016a220536021420062005470d000b200621050b410121" - "08200241106a200420062006200541016a220520062005491b1083808080004100" - "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" - "0d042005200336020c2005410536020020002005360204200520063602100c030b" - "41002108200141003a0004024020074122460d002002200420062006200541016a" - "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" - "280200210641141084808080002205450d042005200636020c2005411136020020" - "002005360204200520083602100c020b200041013a00010c020b200241206a2004" - "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" - "21082002280220210641141084808080002205450d022005200636020c20054108" - "36020020002005360204200520083602100b410121080b200020083a0000200241" - "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" - "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" - "8080800022040d01410121030b20032002109580808000000b20042001200210df" - "8080800021012000200236020820002001360204200020033602000bdc0201067f" - "23808080800041106b22022480808080002001280200220328020c210402400240" - "02400240024020032802142201200341106a28020022054f0d000340200420016a" - "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" - "41016a220136021420052001470d000b200521010b200241086a20042005200520" - "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" - "21072002280208210541141084808080002201450d03200141033602000c010b02" - "402006413a470d002003200141016a360214200020031081808080000c020b2002" - "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" - "001a200228020421072002280200210541141084808080002201450d0220014106" - "3602000b2001200536020c20002001360204200041063a0000200120073602100b" - "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" - "042480808080000240024002400240024002400240024002400240024002400240" - "20012802002205450d002002280208210620022802042107200128020421080240" - "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" - "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" - "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" - "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" - "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" - "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" - "2002290204220fa721092002280200220b418080808078470d03200921050c010b" - "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" - "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" - "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" - "028c02200142808080801037020420012009360200200920032903003703002009" - "41086a200341086a290300370300200941106a200341106a2903003703000c010b" - "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" - "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" - "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" - "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" - "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" - "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" - "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" - "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" - "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" - "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" - "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" - "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" - "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" - "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" - "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" - "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" - "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" - "200420042903880137026020042005360208200420063602782008280200220d41" - "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" - "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" - "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" - "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" - "370300200b2003290300370300200b41086a200341086a290300370300200d200e" - "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" - "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" - "246a200441dc006a41186a28020036020020042010370234200420073602302004" - "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" - "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" - "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" - "210d200b2f019203410b490d02200641016a210602400240024002400240024002" - "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" - "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" - "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" - "36027820044188016a200441f8006a10c18080800020042802b001410520044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" - "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" - "2105200d418080808078460d032004200d3602302008200441086a412410df8080" - "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" - "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" - "41003b019203200d410036028802200b41003b019003200b200d36028802200120" - "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" - "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" - "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" - "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" - "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" - "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" - "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" - "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" - "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" - "6a200941106a220d290300370300200041086a200941086a220b29030037030020" - "092003290300370300200b200341086a290300370300200d200341106a29030037" - "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" - "80808080004100210241002103024020002802002204450d002001200436021820" - "014100360214200120043602082001410036020420012000280204220336021c20" - "01200336020c20002802082103410121020b200120033602202001200236021020" - "01200236020002400240024003400240024002400240024020030d002001280200" - "450d0820012802082104200128020422030d0141002100200128020c2203450d06" - "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" - "024020024101712203450d0020012802040d0020012802082103200128020c2200" - "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" - "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" - "3702082001200336020441012102200141013602000b2001280208210002402001" - "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" - "20012802242203450d0120012802282100200128022c220520032f019203490d02" - "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" - "2001200436020c20014100360208200120033602040c010b200320044102746a41" - "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" - "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" - "2802002204450d00200028020420041082808080000b0240024002400240200320" - "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" - "20032802042200450d01200328020820001082808080000c010b200341046a1091" - "8080800020032802042200450d002003280208200041186c1082808080000b2001" - "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" - "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" - "03037f017e037f23808080800041f0006b22022480808080004100210302402000" - "2d0000220420012d0000470d00410121030240024002400240024020040e060500" - "01020304050b20002d000120012d00014621030c040b4100210320002903082205" - "2001290308520d030240024002402005a70e03000102000b200029031020012903" - "105121030c050b200029031020012903105121030c040b20002b031020012b0310" - "6121030c030b41002103200028020c2204200128020c470d022000280208200128" - "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" - "0d012001280208210420002802082100200641016a210103402001417f6a220145" - "21032001450d0220002004109c808080002106200441186a2104200041186a2100" - "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" - "6c2002420037026420024100360254200241003602442002410036023020024100" - "36022020022001280208220636025c200220012802042203360258200220063602" - "4c2002200336024820022000280208220636023820022000280204220136023420" - "0220063602282002200136022420022004410020031b3602602002200341004722" - "033602502002200336024020022004410020011b36023c20022001410047220336" - "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" - "80004101210320022802102201450d0120022802142104200241086a2007109d80" - "80800020022802082200450d0141002103200128020822062000280208470d0120" - "0228020c210820012802042000280204200610dc808080000d0120042008109c80" - "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" - "200128022022020d00410021020c010b20012002417f6a36022002400240024020" - "012802004101470d0020012802040d01200128020821030240200128020c220245" - "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" - "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" - "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" - "050c010b03402003280288022205450d03200241016a210220032f019003210420" - "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" - "21060c010b200520034102746a4198036a21030340200328020022064198036a21" - "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" - "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" - "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" - "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" - "001a200010848080800022010d01410121010b20012000109580808000000b2001" - "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" - "108080808000024002400240024020042d00384106460d00200441086a41106a20" - "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" - "29030037030020042004290338370308200441386a200220031080808080002004" - "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" - "0629030037030020042004290338370320200441086a10a0808080002205450d02" - "200441206a10a0808080002206450d0320052006109c808080002105200441206a" - "108580808000200441086a10858080800002402003450d00200220031082808080" - "000b02402001450d00200020011082808080000b200441d0006a24808080800020" - "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" - "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" - "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" - "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" - "004105470d0020002802042202450d002000280208210303402002418c026a2100" - "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" - "0c020b2000280208210120002802042107200641016a2106200541746a21052000" - "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" - "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" - "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" - "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" - "0041c0006b22052480808080002005200136020c20052000360208200520033602" - "14200520023602102005410236021c200541dc82c0800036021820054202370224" - "2005418180808000ad422086200541106aad843703382005418280808000ad4220" - "86200541086aad843703302005200541306a360220200541186a200410a4808080" - "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" - "41206b2200248080808000200041003602182000410136020c200041ac81c08000" - "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" - "23808080800041206b2202248080808000200241106a200041106a290200370300" - "200241086a200041086a290200370300200241013b011c20022001360218200220" - "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" - "6a280200220241787122006a21030240024020024101710d002002410271450d01" - "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" - "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" - "7136020420012000410172360204200320003602000f0b2001200210a880808000" - "0b024002400240024002400240200328020422024102710d00200341002802f8d2" - "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" - "80002001200220006a2200410172360204200120006a2000360200200141002802" - "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" - "2000410172360204200120006a20003602000b2000418002490d022001200010d7" - "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" - "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" - "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" - "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" - "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" - "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" - "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" - "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" - "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" - "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" - "00220241012000410376742200710d00410020022000723602e4d2c08000200321" - "000c010b200328020821000b200320013602082000200136020c2001200336020c" - "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" - "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" - "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" - "0041206b2203248080808000200341003602102003410136020420034204370208" - "2003200136021c200320003602182003200341186a3602002003200210a4808080" - "00000b840601057f0240024002402000417c6a2203280200220441787122054104" - "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" - "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" - "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" - "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" - "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" - "7871220420056a22052001490d042006200410a880808000200520016b22024110" - "490d0120032001200328020041017172410272360200200720016a220120024103" - "72360204200720056a220520052802044101723602042001200210a98080800020" - "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" - "20016a22052002410372360204200620062802044101723602042005200210a980" - "80800020000f0b20032005200328020041017172410272360200200720056a2202" - "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" - "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" - "200720056a2202200228020441017236020441002102410021010c010b20032001" - "200441017172410272360200200720016a22012002410172360204200720056a22" - "05200236020020052005280204417e713602040b410020013602f4d2c080004100" - "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" - "0240200210848080800022050d0041000f0b20052000417c417820032802002201" - "4103711b20014178716a2201200220012002491b10df808080002102200010a580" - "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" - "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" - "410272360200200720016a2202200520016b2205410172360204410020053602f0" - "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" - "4002402001418002490d002000280218210302400240024020022000470d002000" - "41144110200028021422021b6a28020022010d01410021020c020b200028020822" - "01200236020c200220013602080c010b200041146a200041106a20021b21040340" - "200421052001220241146a200241106a200228021422011b210420024114411020" - "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" - "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" - "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" - "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" - "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" - "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d0020022001360214" - "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" - "4101710d002003410271450d012000280200220320016a21010240200020036b22" - "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" - "d2c0800020022002280204417e7136020420002001410172360204200220013602" - "000c020b2000200310a8808080000b024002400240024020022802042203410271" - "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" - "03417871220310a8808080002000200320016a2201410172360204200020016a20" - "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" - "2003417e7136020420002001410172360204200020016a20013602000b02402001" - "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" - "0240024041002802e4d2c08000220341012001410376742201710d004100200320" - "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" - "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" - "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" - "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" - "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" - "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" - "7e23808080800041306b2203248080808000200320003602002003200136020420" - "03410236020c200341c485c08000360208200342023702142003418380808000ad" - "4220862204200341046aad84370328200320042003ad843703202003200341206a" - "360210200341086a200210a480808000000b110020003502004101200110ad8080" - "80000b7902017f017e23808080800041306b220324808080800020032001360204" - "200320003602002003410236020c200341c882c080003602082003420237021420" - "03418380808000ad42208622042003ad8437032820032004200341046aad843703" - "202003200341206a360210200341086a200210a480808000000bec0203027f017e" - "037f23808080800041306b2203248080808000412721040240024020004290ce00" - "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" - "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" - "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" - "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" - "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" - "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" - "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" - "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" - "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" - "23808080800041206b220124808080800020002802182102200141106a20004110" - "6a290200370300200141086a200041086a2902003703002001200036021c200120" - "0236021820012000290200370300200110d880808000000bcb0501077f02400240" - "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" - "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" - "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" - "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" - "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" - "28021422012000280218220920082002200310b080808000450d0041010f0b2001" - "20042005200928020c11818080800080808080000f0b0240024002400240200028" - "0204220120064b0d00200028021422012000280218220920082002200310b08080" - "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" - "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" - "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" - "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" - "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" - "00202000200736021041000f0b200120042005200928020c118180808000808080" - "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" - "020b20072101410021070c010b20074101762101200741016a41017621070b2001" - "41016a210120002802102106200028021821092000280214210a02400340200141" - "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" - "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" - "020c11818080800080808080000d00410021010340024020072001470d00200720" - "07490f0b200141016a2101200a200620092802101182808080008080808000450d" - "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" - "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" - "200020032004200128020c11818080800080808080000b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c200341e485c08000360208200342023702142003418380808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" - "200028020022040d002003410171450d010b02402003410171450d00200120026a" - "210502400240200028020c22060d0041002107200121080c010b41002107410021" - "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" - "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" - "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" - "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" - "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" - "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" - "2007200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a02402002" - "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" - "0641002103024020012007460d004100210302402009417c4b0d00410021034100" - "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" - "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" - "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" - "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" - "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" - "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" - "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" - "41002108024020054104490d002004200d41f007716a2109410021082004210303" - "40200328020c2207417f7341077620074106767241818284087120032802082207" - "417f7341077620074106767241818284087120032802042207417f734107762007" - "4106767241818284087120032802002207417f7341077620074106767241818284" - "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" - "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" - "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" - "4107762003410676724181828408712103200c4101460d0220082802042207417f" - "7341077620074106767241818284087120036a2103200c4102460d022008280208" - "2208417f7341077620084106767241818284087120036a21030c020b024020020d" - "00410021060c030b2002410371210802400240200241044f0d0041002106410021" - "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" - "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" - "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" - "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" - "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" - "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" - "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" - "024020002d00200e0402000102020b20052103410021050c010b20054101762103" - "200541016a41017621050b200341016a2103200028021021092000280218210820" - "00280214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c118180" - "80800080808080000f0b0240200720012002200828020c11818080800080808080" - "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" - "016a21032007200920082802101182808080008080808000450d000b2003417f6a" - "2005490b140020012000280200200028020410b2808080000b1c00200028020020" - "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" - "306b2203248080808000200341033a002c2003412036021c410021042003410036" - "02282003200136022420032000360220200341003602142003410036020c024002" - "40024002400240200228021022050d00200228020c2200450d0120022802082101" - "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" - "0240200041046a2802002207450d00200328022020002802002007200328022428" - "020c11818080800080808080000d040b20012802002003410c6a20012802041182" - "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" - "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" - "41016a210420022802082109200228020021004100210603400240200041046a28" - "02002201450d00200328022020002802002001200328022428020c118180808000" - "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" - "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" - "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" - "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" - "02102003200b36020c200141046a280200210702400240024020012802000e0301" - "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" - "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" - "2802002003410c6a200128020411828080800080808080000d02200041086a2100" - "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" - "0020044103746a22012802002001280204200328022428020c1181808080008080" - "808000450d010b410121010c010b410021010b200341306a24808080800020010b" - "d70201057f2380808080004180016b220224808080800002400240024002402001" - "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" - "030b41ff00210303402002200322046a22052000410f712203413072200341d700" - "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" - "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" - "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" - "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" - "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" - "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" - "20024180016a24808080800020000b7902017f017e23808080800041306b220324" - "808080800020032000360200200320013602042003410236020c2003419886c080" - "00360208200342023702142003418380808000ad4220862204200341046aad8437" - "0328200320042003ad843703202003200341206a360210200341086a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" - "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" - "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" - "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" - "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" - "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" - "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" - "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" - "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" - "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" - "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" - "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" - "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" - "0010a280808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641a888c0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541b089c080003602302005420537023c20054182" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418480808000ad422086200541286aad843703582005418580808000ad42" - "2086200541246aad843703502005418380808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541f089c080003602302005420337023c2005" - "418280808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418380808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541d088c080003602302005420437023c2005418280" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" - "000d00200128021441d881c080004102200128021828020c118180808000808080" - "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111828080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111828080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11818080800080808080000d010b2004412720011182808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410de808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" - "400240024041c8031084808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" - "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "df80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" - "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" - "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" - "00200028020021002002410036022c2002428080808010370224200241033a0050" - "200241203602402002410036024c200241c0a0c080003602482002410036023820" - "0241003602302002200241246a3602440240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002400240" - "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" - "1314151617180b024002400240024020002d00040e0400010203000b2002200028" - "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" - "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" - "2900e4ccc08000370000200241143602602002200336025c200241143602582002" - "410336026c200241ccccc08000360268200242023702742002418680808000ad42" - "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" - "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" - "8080002103024020022802582204450d00200228025c20041082808080000b2003" - "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" - "013702742002418280808000ad422086200241086aad8437035820022003410274" - "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" - "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" - "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" - "0c190b20002802082203280200200241306a200328020428021011828080800080" - "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" - "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" - "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" - "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" - "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" - "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" - "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" - "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" - "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" - "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" - "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" - "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" - "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" - "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" - "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" - "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" - "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" - "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" - "6a200241246a41086a280200360200200220022902243703582002418380808000" - "36027c2002418380808000360274200241888080800036026c2002410436020c20" - "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" - "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" - "280218200241086a10b5808080002100024020022802582201450d00200228025c" - "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" - "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" - "00280204200028020810b2808080000b4b01017f02402000280200200028020822" - "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" - "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" - "8080800041106b2202248080808000200028020821032000280204210441012105" - "024020012802142206412220012802182207280210220811828080800080808080" - "000d000240024020030d0041002103410021000c010b410021094100210a200421" - "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" - "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" - "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" - "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" - "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" - "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" - "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" - "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" - "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" - "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" - "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" - "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" - "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" - "0d010240024020022d0004418001470d0020062002280208200811828080800080" - "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" - "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" - "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" - "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" - "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" - "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" - "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" - "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" - "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" - "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" - "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" - "200728020c11818080800080808080000d00200641222008118280808000808080" - "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" - "05200128021828020c11818080800080808080000b1e01017f0240200028020022" - "01450d00200028020420011082808080000b0b5301047f02402000280208220120" - "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" - "200441dc00460d0120044120490d012000200141016a220136020820022001470d" - "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" - "0210cf80808000200028020821030b200028020420036a2001200210df80808000" - "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" - "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" - "20026b21074100210503400240024002400240200220056a2d00002208c0220941" - "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" - "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" - "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" - "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" - "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" - "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" - "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" - "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" - "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" - "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" - "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" - "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" - "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" - "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" - "0520042802082108024041141084808080002203450d002003200836020c200341" - "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" - "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" - "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" - "41106a2480808080000b5901017f23808080800041106b22012480808080002001" - "41086a2000200028020041014101410110d4808080000240200128020822004181" - "80808078460d002000200128020c109580808000000b200141106a248080808000" - "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" - "8080000240024020022f01140d0002400240024002400240024020022f01162203" - "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" - "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" - "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" - "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" - "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" - "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" - "2205418080046a210302402001280200200128020822006b41034b0d0020012000" - "410410cf80808000200128020821000b2001200041046a36020820012802042000" - "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" - "002005410676413f71418001723a000220002003410c76413f71418001723a0001" - "410021000c070b200220002802002000280204200028020810838080800041002d" - "00c0cfc080001a200228020421012002280200210341141084808080002200450d" - "042000200336020c20004114360200200020013602100c060b200241086a200028" - "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" - "21012002280208210341141084808080002200450d032000200336020c20004114" - "360200200020013602100c050b200241173602142000200241146a10d080808000" - "21000c040b200241173602142000200241146a10d08080800021000c030b024002" - "4002402003418001490d0002402001280200200128020822046b41034b0d002001" - "2004410410cf80808000200128020821040b200128020420046a21002003418010" - "4f0d0120034106764140722106410221050c020b02402001280208220020012802" - "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" - "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" - "60722106410321050b200020063a00002001200420056a360208200020056a417f" - "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" - "206a24808080800020000b910301057f23808080800041106b2202248080808000" - "02400240024002402001280204220320012802082204490d000240200320046b41" - "034b0d0020012003360208200241086a2001280200200320031083808080004100" - "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" - "0d022001200436020c2001410436020020002001360204200120033602100c030b" - "2001200441046a220536020802402001280200220620046a22012d000141017441" - "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" - "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" - "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" - "001a200228020421032002280200210441141084808080002201450d0220012004" - "36020c2001410c36020020002001360204200120033602100c030b200020013b01" - "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" - "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" - "022480808080000240024002402001280208220320012802042204490d00200241" - "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" - "032002280208210441141084808080002201450d022001200436020c2001410436" - "02002000200136020420012003360210410121010c010b2000200128020020036a" - "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" - "5601017f23808080800041106b2203248080808000200341086a20002001200241" - "01410110d480808000024020032802082202418180808078460d00200220032802" - "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" - "106b2202248080808000200241086a200028020020002802042000280208108380" - "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" - "8080800022000d00000b2000200436020c20002001290200370200200020033602" - "10200041086a200141086a280200360200200241106a24808080800020000b1f00" - "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" - "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" - "00200320016a3602080b200241106a24808080800041000b820101017f02400240" - "024002402003280204450d000240200328020822040d002002450d0341002d00c0" - "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" - "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" - "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" - "8080800041206b2206248080808000024002400240200220036a220320024f0d00" - "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" - "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" - "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" - "20080d00410021020c010b2006200820056c36021c200620012802043602142004" - "21020b20062002360218200641086a20042009200641146a10d380808000024020" - "062802080d00200628020c21022001200736020020012002360204418180808078" - "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" - "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" - "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" - "017120024101746b413e6a21020b200042003702102000200236021c2002410274" - "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" - "00360200200020033602182000200036020c20002000360208410041002802e8d2" - "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" - "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" - "03034020042003411d764104716a41106a22052802002202450d02200341017421" - "032002210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b20052000" - "360200200020043602182000200036020c200020003602080b0b00200010d98080" - "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" - "024002400240024020002802040e020001020b20020d0141012102410021030c02" - "0b20020d00200028020022022802042103200228020021020c010b200141808080" - "80783602002001200036020c2001418980808000200028021c22002d001c20002d" - "001d10da80808000000b20012003360204200120023602002001418a8080800020" - "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" - "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" - "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" - "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" - "086a200020011183808080008080808000000b410041003a0094d3c08000200245" - "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" - "02402002450d000240034020002d0000220420012d00002205470d01200041016a" - "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" - "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" - "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" - "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" - "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" - "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" - "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" - "280200210803402005417c6a220520082003742001280200220820027672360200" - "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" - "210103402005417c6a220520012802003602002001417c6a210120042005490d00" - "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" - "036a210502402003450d0020002104200121080340200420082d00003a00002008" - "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" - "6a210402400240200120036a2206410371450d0020074101480d01200641037422" - "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" - "21080340200520082002762001280200220820037472360200200141046a210120" - "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" - "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" - "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" - "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" - "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" - "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" - "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" - "00410020006b41037122046a210502402004450d00200021032001210603402003" - "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" - "01480d012009410374220641187121022009417c71220a41046a2101410020066b" - "4118712104200a2802002106034020052006200276200128020022062004747236" - "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" - "092101034020052001280200360200200141046a2101200541046a22052003490d" - "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" - "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" - "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" - "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" - "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" - "0a000000150000004b000000450010000a000000160000004b0000004163636f75" - "6e7400450010000a0000001700000033000000450010000a000000180000003300" - "00006361706163697479206f766572666c6f770000009800100011000000616c6c" - "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" - "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" - "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" - "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" - "686520696e6465782069732000150110002000000035011000120000003a200000" - "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" - "7273006c0110001300000066000000170000003078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230323132" - "323233323432353236323732383239333033313332333333343335333633373338" - "333934303431343234333434343534363437343834393530353135323533353435" - "353536353735383539363036313632363336343635363636373638363937303731" - "373237333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939636f72652f7372632f66" - "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" - "000000a40900001a00000072616e676520737461727420696e64657820206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" - "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" - "10000000a202100022000000736c69636520696e64657820737461727473206174" - "202062757420656e64732061742000f4021000160000000a0310000d0000000101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000020202020202" - "020202020202020202020202020202020202020202020202030303030303030303" - "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" - "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" - "000e0000003b041000040000003f041000100000004f0410000100000062797465" - "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" - "7420697320696e7369646520202862797465732029206f66206000700410000b00" - "00007b04100026000000a104100008000000a9041000060000004f041000010000" - "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" - "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" - "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" - "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" - "002c0510001d0000000a0000002b00000000060101030104020507070208080902" - "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" - "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" - "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" - "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" - "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" - "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" - "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" - "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" - "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" - "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" - "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" - "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" - "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" - "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" - "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" - "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" - "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" - "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" - "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" - "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" - "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" - "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" - "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" - "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" - "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" - "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" - "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" - "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" - "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" - "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" - "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" - "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" - "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" - "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" - "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" - "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" - "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" - "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" - "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" - "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" - "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" - "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" - "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" - "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" - "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" - "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" - "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" - "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" - "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" - "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" - "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" - "0239010405010204011402160601013a0101020104080107030a021e013b010101" - "0c01090128010301370101030503010407020b021d013a01020102010301050207" - "020b021c02390201010204080109010a021d014801040102030101080151010207" - "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" - "0202021902040310040d01020206010f01000300031d021e021e02400201070801" - "020b09012d030101750222017603040209010603db0202013a0101070101010102" - "08060a0201301f310430070101050128090c022004020201033801010203010103" - "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" - "04010a200250020001030104011902050197021a120d012608190b2e0330010204" - "020227014306020202020c0108012f01330101030202050201012a020801ee0102" - "01040100010010101000020001e201950500030102050428030401a50200040002" - "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" - "090a0402015f0302010102060102019d010308150239020101010116010e070305" - "c308020301011701510102060101020101020102eb010204060201021b02550802" - "0101026a0101010206010165030204010500090102f5010a020101040190040202" - "0401200a280602040801090602032e0d010200070106010152160207010201027a" - "06030101020107010148020301010100020b023405050101010001060f00053b07" - "00013f0451010002002e0217000101030405080802071e0494030037043208010e" - "011605010f000701110207010201056401a00700013d04000400076d07006080f0" - "002f72757374632f63326637346333663932386165623530336631356234653965" - "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" - "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" - "0e10006000000071010000360000002f72757374632f6332663734633366393238" - "61656235303366313562346539656635373738653737663330353862382f6c6962" - "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" - "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" - "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" - "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" - "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" - "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" - "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" - "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" - "00181d10005f00000058020000300000000d0000000c000000040000000e000000" - "0f00000010000000000000000000000001000000110000006120446973706c6179" - "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" - "20756e65787065637465646c792f72757374632f63326637346333663932386165" - "6235303366313562346539656635373738653737663330353862382f6c69627261" - "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" - "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" - "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" - "207768696c652070617273696e67206120737472696e67454f46207768696c6520" - "70617273696e6720612076616c7565657870656374656420603a60657870656374" - "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" - "78706563746564206964656e7465787065637465642076616c7565657870656374" - "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" - "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" - "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" - "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" - "206120737472696e676b6579206d757374206265206120737472696e67696e7661" - "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" - "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" - "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" - "6164696e6720737572726f6761746520696e206865782065736361706574726169" - "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" - "70656374656420656e64206f662068657820657363617065726563757273696f6e" - "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" - "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" - "4826100001000000000000000000f03f0000000000002440000000000000594000" - "00000000408f40000000000088c34000000000006af8400000000080842e410000" - "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" - "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" - "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" - "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" - "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" - "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" - "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" - "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" - "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" - "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" - "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" - "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" - "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" - "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" - "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" - "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" - "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" - "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" - "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" - "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" - "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" - "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" - "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" - "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" - "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" - "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" - "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" - "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" - "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" - "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" - "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" - "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" - "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" - "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" - "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" - "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" - "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" - "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" - "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" - "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" - "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" - "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" - "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" - "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" - "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" - "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" - "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" - "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" - "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" - "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" - "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" - "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" - "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" - "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" - "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" - "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" - "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" - "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" - "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" - "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" - "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" - "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" - "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" - "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" - "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" - "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" - "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" - "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" - "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" - "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" - "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" - "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" - "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" - "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" - "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" - "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" - "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" - "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" - "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" - "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" - "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" - "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" - "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" - "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" - "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" - "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" - "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" - "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" - "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" - "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" - "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" - "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" - "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" - "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" - "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" - "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" - "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" - "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" - "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" - "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" - "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" - "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" - "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" - "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" - "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" - "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" - "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" - "64656466696c6520746f6f206c617267657265736f757263652062757379657865" - "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" - "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" - "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" - "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" - "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" - "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" - "0048261000010000006f7065726174696f6e207375636365737366756c10000000" - "1100000012000000100000001000000013000000120000000d0000000e00000015" - "0000000c0000000b00000015000000150000000f0000000e000000130000002600" - "00003800000019000000170000000c000000090000000a00000010000000170000" - "00190000000e0000000d00000014000000080000001b0000000e00000010000000" - "16000000150000000b000000160000000d0000000b000000130000005023100060" - "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" - "1000f8231000042410000f24100024241000392410004824100056241000692410" - "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" - "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" - "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" - "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" - "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" - "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" - "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" - "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" - "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" - "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" - "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" - "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" - "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" - "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" - "243137683533326265333033376461316237656445064a5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" - "70617273655f6964656e743137683663353964643731393635353139313045074b" - "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" - "4c54245224475424313270617273655f6e756d6265723137683738336134316134" - "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" - "73657269616c697a6572244c54245224475424313370617273655f646563696d61" - "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" - "70617273655f6578706f6e656e7431376833366464376462643233653461346562" - "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" - "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" - "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" - "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" - "346636345f66726f6d5f7061727473313768633863316239626161613836666637" - "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" - "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" - "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" - "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" - "24313670617273655f616e795f6e756d6265723137683931643533303465356139" - "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" - "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" - "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" - "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" - "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" - "61775f7665633139526177566563244c54245424432441244754243867726f775f" - "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" - "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" - "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" - "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" - "62653863353535633862636433353545143c5f5a4e357365726465326465375669" - "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" - "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" - "68616e646c655f6572726f72313768393762376462643066373264643738384516" - "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" - "35766973697431376838366238393638313662613130613765451781015f5a4e37" - "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" - "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" - "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" - "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" - "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" - "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" - "244754243976697369745f73747231376835356436653830653061376366383938" - "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" - "6363657373244c5424522447542424753230246173247532302473657264652e2e" - "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" - "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" - "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" - "4c54244b24432456244324412447542436696e7365727431376834643164623464" - "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" - "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" - "244b244324562443244124475424247532302461732475323024636f72652e2e6f" - "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" - "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" - "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" - "702e2e5061727469616c4571244754243265713137683162323138393234373831" - "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" - "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" - "475424247532302461732475323024636f72652e2e697465722e2e747261697473" - "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" - "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" - "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" - "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" - "6e646578244754243130696e6465785f696e746f31376864333238633634636161" - "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" - "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" - "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" - "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" - "63617061636974795f6f766572666c6f7731376834393964343832613965643537" - "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" - "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" - "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" - "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" - "70616e69636b696e673570616e6963313768303465656239313764643933633232" - "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" - "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" - "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" - "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "244754243133646973706f73655f6368756e6b3137683665306363636434353836" - "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" - "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" - "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" - "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" - "2475323024666f7224753230247533322447542433666d74313768626633653032" - "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" - "70616e69635f626f756e64735f636865636b313768336436623861613463383034" - "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" - "363431376864353231666136656636613036373261452e11727573745f62656769" - "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" - "327061645f696e74656772616c3137686334656130376130626331333536633445" - "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" - "656772616c313277726974655f7072656669783137686139613433323830623630" - "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" - "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" - "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" - "706164313768343736396165333839333734636335314533495f5a4e34345f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" - "706c61792447542433666d74313768376666346430623836303963323437324534" - "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" - "2e666d742e2e44656275672447542433666d743137683361366261613162623437" - "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" - "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" - "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" - "3024666f7224753230247533322447542433666d74313768353533393862313635" - "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" - "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" - "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" - "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" - "6275675f657874313768656366613566303431373437393039384539345f5a4e34" - "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" - "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" - "6963655f6572726f725f6661696c31376862303364323439386438646362363433" - "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" - "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" - "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" - "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" - "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" - "656275672447542433666d7431376865613566643964626339343936626665453e" - "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" - "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" - "30246933322447542433666d743137686365643930633761363339633031646445" - "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" - "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" - "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" - "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" - "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" - "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" - "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" - "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" - "3130696e736572745f666974313768633861306366353339656666303131314541" - "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" - "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" - "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" - "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" - "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" - "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" - "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768343032353764366634326532" - "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" - "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" - "61792447542433666d74313768636534323236616131663732366331634544615f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" - "74655f73747231376835393964396535373839343664643938452e31393245575f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768623637326562313939633335643138364546555f5a4e35335f244c542463" - "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768663761653238353562323439" - "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" - "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" - "313768376236353738393966393837353963624548475f5a4e313073657264655f" - "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" - "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" - "616c6c6f63337665633136566563244c5424542443244124475424313765787465" - "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" - "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" - "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" - "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" - "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" - "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" - "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" - "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" - "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" - "6f64655f6865785f65736361706531376834376265353936383535663830346461" - "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" - "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" - "63377261775f7665633230526177566563496e6e6572244c542441244754243772" - "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" - "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" - "3472656164356572726f7231376865663535323764333333633963323666455130" - "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" - "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" - "666d742e2e577269746524475424313077726974655f6368617231376832313433" - "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" - "766563313166696e6973685f67726f773137683533383539626133383962373164" - "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" - "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" - "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" - "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" - "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" - "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" - "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" - "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" - "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" - "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" - "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" - "75376424247537642431376865313761333937376638396331313738455a3b5f5a" - "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" - "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" - "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" - "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" - "61735f73747231376865623366373232643232346534326638455c066d656d636d" - "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" - "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" - "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" - "2e726f6461746100550970726f64756365727302086c616e677561676501045275" - "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" - "6768746c79202863326637346333663920323032342d30392d30392900490f7461" - "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasm( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); - } - } - - void - testEscrowWasmP4() - { - testcase("escrow wasm P4 test"); - auto wasmHex = - "0061736d0100000001791160037f7f7f017f60027f7f017f60017f0060027f7f00" - "60037e7f7f017f60037f7f7f0060067f7f7f7f7f7f017f60017f017f60047f7f7f" - "7f017f60057f7f7f7f7f0060000060057f7f7f7f7f017f60077f7f7f7f7f7f7f01" - "7f60047f7f7f7f0060067f7f7f7f7f7f0060047f7f7f7e0060057f7f7f7e7f0003" - "7c7b01010301040506010202020202010102050001000103010007070303080500" - "090201020a03020500030305020b05050101010001010a0505050c090901010105" - "0903010101030d0d0502050d01030301010d0e020a0a02030101020a0d0d000101" - "0a030302020d03030205050003030f0f1010101009030000000004050170011e1e" - "05030100110619037f01418080c0000b7f004184e0c0000b7f004190e0c0000b07" - "5106066d656d6f7279020008616c6c6f6361746500180a6465616c6c6f63617465" - "001b11636f6d706172655f6163636f756e744944001c0a5f5f646174615f656e64" - "03010b5f5f686561705f6261736503020923010041010b1d210307122f30433134" - "3c3d443e59626708110e500d160942585a5e5f600a9188037b6601017f23808080" - "800041106b220224808080800002400240200028020c450d00200021010c010b20" - "0241086a200041086a280200360200200220002902003703002001200210818080" - "80002101200041141082808080000b200241106a24808080800020010b8c010103" - "7f23808080800041106b2202248080808000200241086a200028020c2000280210" - "200028021410c78080800041002d00e0dbc080001a200228020c21032002280208" - "21040240411410998080800022000d00000b2000200436020c2000200129020037" - "020020002003360210200041086a200141086a280200360200200241106a248080" - "80800020000b7001027f024002402000417c6a2802002202417871220341044108" - "200241037122021b20016a490d0002402002450d002003200141276a4b0d020b20" - "0010a5808080000f0b419db8c08000412e41ccb8c0800010a680808000000b41dc" - "b8c08000412e418cb9c0800010a680808000000be90201057f2380808080004180" - "016b22022480808080000240024002400240200128021c22034110710d00200341" - "20710d0120003100004101200110848080800021000c030b20002d0000210041ff" - "00210303402002200322046a22052000410f712203413072200341d7006a200341" - "0a491b3a00002004417f6a2103200041ff017122064104762100200641104f0d00" - "0c020b0b20002d0000210041ff00210303402002200322046a22052000410f7122" - "03413072200341376a2003410a491b3a00002004417f6a2103200041ff01712206" - "4104762100200641104f0d000b02402004418101490d002004418001419887c080" - "00108580808000000b2001410141a887c0800041022005418101200441016a6b10" - "868080800021000c010b02402004418101490d002004418001419887c080001085" - "80808000000b2001410141a887c0800041022005418101200441016a6b10868080" - "800021000b20024180016a24808080800020000bec0203027f017e037f23808080" - "800041306b2203248080808000412721040240024020004290ce005a0d00200021" - "050c010b412721040340200341096a20046a2206417c6a20004290ce0080220542" - "f0b1037e20007ca7220741ffff037141e4006e220841017441aa87c080006a2f00" - "003b00002006417e6a2008419c7f6c20076a41ffff037141017441aa87c080006a" - "2f00003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22046a" - "2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141017441aa" - "87c080006a2f00003b00000b024002402006410a490d00200341096a2004417e6a" - "22046a200641017441aa87c080006a2f00003b00000c010b200341096a2004417f" - "6a22046a20064130723a00000b2002200141014100200341096a20046a41272004" - "6b1086808080002104200341306a24808080800020040b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c2003419c8ac08000360208200342023702142003418180808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bcb0501077f0240024020010d00200541016a2106" - "200028021c2107412d21080c010b412b418080c400200028021c22074101712201" - "1b2108200120056a21060b0240024020074104710d00410021020c010b02400240" - "20030d00410021090c010b02402003410371220a0d000c010b4100210920022101" - "0340200920012c000041bf7f4a6a2109200141016a2101200a417f6a220a0d000b" - "0b200920066a21060b024020002802000d00024020002802142201200028021822" - "0920082002200310ac80808000450d0041010f0b200120042005200928020c1180" - "8080800080808080000f0b02400240024002402000280204220120064b0d002000" - "28021422012000280218220920082002200310ac80808000450d0141010f0b2007" - "410871450d01200028021021072000413036021020002d0020210b4101210c2000" - "41013a0020200028021422092000280218220a20082002200310ac808080000d02" - "200120066b41016a2101024003402001417f6a2201450d0120094130200a280210" - "1181808080008080808000450d000b41010f0b0240200920042005200a28020c11" - "80808080008080808000450d0041010f0b2000200b3a0020200020073602104100" - "0f0b200120042005200928020c1180808080008080808000210c0c010b20012006" - "6b210702400240024020002d002022010e0402000100020b20072101410021070c" - "010b20074101762101200741016a41017621070b200141016a2101200028021021" - "06200028021821092000280214210a024003402001417f6a2201450d01200a2006" - "20092802101181808080008080808000450d000b41010f0b4101210c200a200920" - "082002200310ac808080000d00200a20042005200928020c118080808000808080" - "80000d00410021010340024020072001470d0020072007490f0b200141016a2101" - "200a200620092802101181808080008080808000450d000b2001417f6a2007490f" - "0b200c0be70201057f2380808080004180016b2202248080808000024002400240" - "0240200128021c22034110710d0020034120710d01200035020041012001108480" - "80800021000c030b2000280200210041ff00210303402002200322046a22052000" - "410f712203413072200341d7006a2003410a491b3a00002004417f6a2103200041" - "10492106200041047621002006450d000c020b0b2000280200210041ff00210303" - "402002200322046a22052000410f712203413072200341376a2003410a491b3a00" - "002004417f6a210320004110492106200041047621002006450d000b0240200441" - "8101490d002004418001419887c08000108580808000000b2001410141a887c080" - "0041022005418101200441016a6b10868080800021000c010b0240200441810149" - "0d002004418001419887c08000108580808000000b2001410141a887c080004102" - "2005418101200441016a6b10868080800021000b20024180016a24808080800020" - "000b1e01017f024020002802002201450d00200028020420011082808080000b0b" - "970101047f024002400240200028020022002802000e020001020b200028020822" - "01450d01200028020420011082808080000c010b20002d00044103470d00200028" - "0208220128020021020240200128020422032802002204450d0020022004118280" - "80800080808080000b024020032802042203450d00200220031082808080000b20" - "01410c1082808080000b200041141082808080000b6801017f0240024002400240" - "20002d00000e050303030102000b200041046a108b808080000c020b2000280204" - "2201450d01200028020820011082808080000f0b200041046a108c808080002000" - "2802042201450d002000280208200141186c1082808080000f0b0be30501067f23" - "808080800041306b22012480808080004100210241002103024020002802002204" - "450d00200120043602182001410036021420012004360208200141003602042001" - "2000280204220336021c2001200336020c20002802082103410121020b20012003" - "360220200120023602102001200236020002400240024003400240024002400240" - "024020030d002001280200450d0820012802082104200128020422030d01410021" - "00200128020c2203450d06034020042802980321042003417f6a22030d000c070b" - "0b20012003417f6a360220024020024101712203450d0020012802040d00200128" - "02082103200128020c2200450d03034020032802980321032000417f6a22000d00" - "0c040b0b2003450d01200128020421030c030b200421000c050b41a8acc0800010" - "a080808000000b200142003702082001200336020441012102200141013602000b" - "200128020821000240200128020c220520032f019203490d000240034020014124" - "6a2003200010bf8080800020012802242203450d0120012802282100200128022c" - "220520032f019203490d020c000b0b4188a5c0800010a080808000000b20054101" - "6a21040240024020000d002001200436020c20014100360208200120033602040c" - "010b200320044102746a4198036a21040340200428020022064198036a21042000" - "417f6a22000d000b20014200370208200120063602042003450d040b0240200320" - "05410c6c6a418c026a22002802002204450d00200028020420041082808080000b" - "02400240024002402003200541186c6a22032d00000e050303030102000b200341" - "046a108b808080000c020b20032802042200450d01200328020820001082808080" - "000c010b200341046a108c8080800020032802042200450d002003280208200041" - "186c1082808080000b200128022021030c000b0b200421030b0340200141246a20" - "03200010bf8080800020012802242203450d01200128022821000c000b0b200141" - "306a2480808080000b950101027f024020002802082201450d0020002802044104" - "6a2100034002400240024002402000417c6a2d00000e050303030102000b200010" - "8b808080000c020b20002802002202450d01200041046a28020020021082808080" - "000c010b2000108c8080800020002802002202450d00200041046a280200200241" - "186c1082808080000b200041186a21002001417f6a22010d000b0b0b2200200128" - "021441d4a6c080004105200128021828020c11808080800080808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "002000108f808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110908080" - "8000200028020821030b200028020420036a2002410c6a200110fa808080001a20" - "00200320016a3602080b200241106a24808080800041000b5901017f2380808080" - "0041106b2201248080808000200141086a2000200028020041014101410110d280" - "808000024020012802082200418180808078460d002000200128020c109a808080" - "00000b200141106a2480808080000b5601017f23808080800041106b2203248080" - "808000200341086a2000200120024101410110d280808000024020032802082202" - "418180808078460d002002200328020c109a80808000000b200341106a24808080" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109080808000200028020821030b200028020420036a2001200210fa808080001a" - "2000200320026a36020841000b1400200120002802042000280208109380808000" - "0bc20b010b7f200028020821030240024002400240200028020022040d00200341" - "0171450d010b02402003410171450d00200120026a210502400240200028020c22" - "060d0041002107200121080c010b41002107410021092001210803402008220320" - "05460d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21080c" - "010b200341046a21080b200820036b20076a21072006200941016a2209470d000b" - "0b20082005460d00024020082c00002203417f4a0d0020034160491a0b02400240" - "2007450d000240200720024f0d00200120076a2c000041bf7f4a0d01410021030c" - "020b20072002460d00410021030c010b200121030b2007200220031b2102200320" - "0120031b21010b024020040d00200028021420012002200028021828020c118080" - "80800080808080000f0b2000280204210a024020024110490d0020022001200141" - "036a417c7122076b22096a220b4103712104410021064100210302402001200746" - "0d004100210302402009417c4b0d00410021034100210503402003200120056a22" - "082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841026a2c000041bf7f" - "4a6a200841036a2c000041bf7f4a6a2103200541046a22050d000b0b2001210803" - "40200320082c000041bf7f4a6a2103200841016a2108200941016a22090d000b0b" - "02402004450d002007200b417c716a22082c000041bf7f4a210620044101460d00" - "200620082c000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a" - "21060b200b4102762105200620036a21060340200721042005450d04200541c001" - "200541c001491b220b410371210c200b410274210d41002108024020054104490d" - "002004200d41f007716a210941002108200421030340200328020c2207417f7341" - "077620074106767241818284087120032802082207417f73410776200741067672" - "41818284087120032802042207417f734107762007410676724181828408712003" - "2802002207417f7341077620074106767241818284087120086a6a6a6a21082003" - "41106a22032009470d000b0b2005200b6b21052004200d6a2107200841087641ff" - "81fc0771200841ff81fc07716a418180046c41107620066a2106200c450d000b20" - "04200b41fc01714102746a22082802002203417f73410776200341067672418182" - "8408712103200c4101460d0220082802042207417f734107762007410676724181" - "8284087120036a2103200c4102460d0220082802082208417f7341077620084106" - "767241818284087120036a21030c020b024020020d00410021060c030b20024103" - "71210802400240200241044f0d0041002106410021090c010b4100210620012103" - "2002410c71220921070340200620032c000041bf7f4a6a200341016a2c000041bf" - "7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a21062003" - "41046a21032007417c6a22070d000b0b2008450d02200120096a21030340200620" - "032c000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11808080800080808080000f0b2003410876" - "41ff811c71200341ff81fc07716a418180046c41107620066a21060b0240024020" - "0a20064d0d00200a20066b21054100210302400240024020002d00200e04020001" - "02020b20052103410021050c010b20054101762103200541016a41017621050b20" - "0341016a210320002802102109200028021821082000280214210703402003417f" - "6a2203450d022007200920082802101181808080008080808000450d000b41010f" - "0b200028021420012002200028021828020c11808080800080808080000f0b0240" - "200720012002200828020c1180808080008080808000450d0041010f0b41002103" - "0340024020052003470d0020052005490f0b200341016a21032007200920082802" - "101181808080008080808000450d000b2003417f6a2005490b890503037f017e03" - "7f23808080800041f0006b220224808080800041002103024020002d0000220420" - "012d0000470d00410121030240024002400240024020040e06050001020304050b" - "20002d000120012d00014621030c040b4100210320002903082205200129030852" - "0d030240024002402005a70e03000102000b200029031020012903105121030c05" - "0b200029031020012903105121030c040b20002b031020012b03106121030c030b" - "41002103200028020c2204200128020c470d0220002802082001280208200410f7" - "808080004521030c020b41002103200028020c2206200128020c470d0120012802" - "08210420002802082100200641016a210103402001417f6a22014521032001450d" - "02200020041094808080002106200441186a2104200041186a210020060d000c02" - "0b0b41002103200028020c2204200128020c470d002002410036026c2002420037" - "026420024100360254200241003602442002410036023020024100360220200220" - "01280208220636025c2002200128020422033602582002200636024c2002200336" - "024820022000280208220636023820022000280204220136023420022006360228" - "2002200136022420022004410020031b3602602002200341004722033602502002" - "200336024020022004410020011b36023c20022001410047220336022c20022003" - "36021c200241c0006a21070340200241106a2002411c6a10958080800041012103" - "20022802102201450d0120022802142104200241086a2007109580808000200228" - "02082200450d0141002103200128020822062000280208470d01200228020c2108" - "20012802042000280204200610f7808080000d01200420081094808080000d000b" - "0b200241f0006a24808080800020030bed0201057f024002400240200128022022" - "020d00410021020c010b20012002417f6a36022002400240024020012802004101" - "470d0020012802040d01200128020821030240200128020c2202450d0003402003" - "2802980321032002417f6a22020d000b0b20014200370208200120033602042001" - "41013602000c020b41c8acc0800010a080808000000b200128020421030b200128" - "0208210202400240200128020c220420032f0192034f0d00200321050c010b0340" - "2003280288022205450d03200241016a210220032f019003210420052103200420" - "052f0192034f0d000b0b200441016a21030240024020020d00200521060c010b20" - "0520034102746a4198036a21030340200328020022064198036a21032002417f6a" - "22020d000b410021030b2001200336020c20014100360208200120063602042005" - "200441186c6a210320052004410c6c6a418c026a21020b20002003360204200020" - "023602000f0b41b8acc0800010a080808000000bae0301057f2380808080004110" - "6b220224808080800041012103024020012802142204419f81c08000410d200128" - "0218220528020c220611808080800080808080000d00024020012d001c4104710d" - "00200441f886c080004103200611808080800080808080000d01200441ac81c080" - "004104200611808080800080808080000d012004418bc2c0800041022006118080" - "80800080808080000d01200420002d0000410274220141dc83c080006a28020020" - "0141c883c080006a280200200611808080800080808080000d012004418187c080" - "0041022006118080808000808080800021030c010b200441fb86c0800041032006" - "11808080800080808080000d002002200536020420022004360200410121032002" - "41013a000f20022002410f6a360208200241ac81c0800041041097808080000d00" - "2002418bc2c0800041021097808080000d00200220002d0000410274220141dc83" - "c080006a280200200141c883c080006a2802001097808080000d00410121032002" - "41fe86c0800041021097808080000d002004418087c08000410120061180808080" - "00808080800021030b200241106a24808080800020030bdf04010c7f2001417f6a" - "210320002802042104200028020021052000280208210641002107410021084100" - "21094100210a02400340200a4101710d0102400240200920024b0d000340200120" - "096a210a0240024002400240200220096b220b41074b0d0020022009470d012002" - "21090c050b02400240200a41036a417c71220c200a6b220d450d00410021000340" - "200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b41786a" - "220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a94" - "a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b2000" - "727141808182847871418081828478470d02200c41086a210c200d41086a220d20" - "0e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b20004101" - "6a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a20" - "0d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a46" - "0d01200b200041016a2200470d000b200221090c030b2000200d6a21000b200020" - "096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d004100" - "210a2009210d200921000c030b200920024d0d000b0b20082002460d024101210a" - "2008210d200221000b0240024020062d0000450d00200541f486c0800041042004" - "28020c11808080800080808080000d010b200020086b210b4100210c0240200020" - "08460d00200320006a2d0000410a46210c0b200120086a21002006200c3a000020" - "0d210820052000200b200428020c1180808080008080808000450d010b0b410121" - "070b20070b4901017f410021010240024020004100480d00024020000d00410121" - "010c020b41002d00e0dbc080001a200010998080800022010d01410121010b2001" - "2000109a80808000000b20010bcb2502087f017e02400240024002400240024002" - "400240200041f501490d0041002101200041cdff7b4f0d052000410b6a22014178" - "71210241002802c4dfc080002203450d04411f21040240200041f4ffff074b0d00" - "2002410620014108766722006b7641017120004101746b413e6a21040b41002002" - "6b21010240200441027441a8dcc080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b742107410021060340" - "02402005220528020441787122082002490d00200820026b220820014f0d002008" - "21012005210620080d004100210120052106200521000c040b2005280214220820" - "00200820052007411d764104716a41106a2802002205471b200020081b21002007" - "41017421072005450d020c000b0b024041002802c0dfc08000220541102000410b" - "6a41f803712000410b491b22024103762201762200410371450d00024002402000" - "417f7341017120016a2207410374220041b8ddc080006a2201200041c0ddc08000" - "6a28020022022802082206460d002006200136020c200120063602080c010b4100" - "2005417e200777713602c0dfc080000b20022000410372360204200220006a2200" - "2000280204410172360204200241086a0f0b200241002802c8dfc080004d0d0302" - "400240024020000d0041002802c4dfc080002200450d0620006841027441a8dcc0" - "80006a280200220628020441787120026b21012006210503400240200628021022" - "000d00200628021422000d0020052802182104024002400240200528020c220020" - "05470d00200541144110200528021422001b6a28020022060d01410021000c020b" - "20052802082206200036020c200020063602080c010b200541146a200541106a20" - "001b21070340200721082006220041146a200041106a200028021422061b210720" - "004114411020061b6a28020022060d000b200841003602000b2004450d04024020" - "0528021c41027441a8dcc080006a22062802002005460d00200441104114200428" - "02102005461b6a20003602002000450d050c040b2006200036020020000d034100" - "41002802c4dfc08000417e200528021c77713602c4dfc080000c040b2000280204" - "41787120026b22062001200620014922061b21012000200520061b210520002106" - "0c000b0b02400240200020017441022001742200410020006b7271682208410374" - "220141b8ddc080006a2206200141c0ddc080006a28020022002802082207460d00" - "2007200636020c200620073602080c010b41002005417e200877713602c0dfc080" - "000b20002002410372360204200020026a2207200120026b220641017236020420" - "0020016a2006360200024041002802c8dfc080002205450d00200541787141b8dd" - "c080006a210141002802d0dfc0800021020240024041002802c0dfc08000220841" - "012005410376742205710d00410020082005723602c0dfc08000200121050c010b" - "200128020821050b200120023602082005200236020c2002200136020c20022005" - "3602080b410020073602d0dfc08000410020063602c8dfc08000200041086a0f0b" - "20002004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b02400240024020" - "014110490d0020052002410372360204200520026a220220014101723602042002" - "20016a200136020041002802c8dfc080002207450d01200741787141b8ddc08000" - "6a210641002802d0dfc0800021000240024041002802c0dfc08000220841012007" - "410376742207710d00410020082007723602c0dfc08000200621070c010b200628" - "020821070b200620003602082007200036020c2000200636020c20002007360208" - "0c010b2005200120026a2200410372360204200520006a22002000280204410172" - "3602040c010b410020023602d0dfc08000410020013602c8dfc080000b20054108" - "6a0f0b024020002006720d004100210641022004742200410020006b7220037122" - "00450d0320006841027441a8dcc080006a28020021000b2000450d010b03402000" - "20062000280204417871220520026b220820014922041b21032005200249210720" - "08200120041b21080240200028021022050d00200028021421050b200620032007" - "1b21062001200820071b21012005210020050d000b0b2006450d00024041002802" - "c8dfc0800022002002490d002001200020026b4f0d010b20062802182104024002" - "400240200628020c22002006470d00200641144110200628021422001b6a280200" - "22050d01410021000c020b20062802082205200036020c200020053602080c010b" - "200641146a200641106a20001b21070340200721082005220041146a200041106a" - "200028021422051b210720004114411020051b6a28020022050d000b2008410036" - "02000b2004450d030240200628021c41027441a8dcc080006a2205280200200646" - "0d0020044110411420042802102006461b6a20003602002000450d040c030b2005" - "200036020020000d02410041002802c4dfc08000417e200628021c77713602c4df" - "c080000c030b02400240024002400240024041002802c8dfc08000220020024f0d" - "00024041002802ccdfc08000220020024b0d0041002101200241af80046a220641" - "107640002200417f4622070d0720004110742205450d07410041002802d8dfc080" - "00410020064180807c7120071b22086a22003602d8dfc08000410041002802dcdf" - "c0800022012000200120004b1b3602dcdfc0800002400240024041002802d4dfc0" - "80002201450d0041a8ddc080002100034020002802002206200028020422076a20" - "05460d02200028020822000d000c030b0b0240024041002802e4dfc08000220045" - "0d00200020054d0d010b410020053602e4dfc080000b410041ff1f3602e8dfc080" - "00410020083602acddc08000410020053602a8ddc08000410041b8ddc080003602" - "c4ddc08000410041c0ddc080003602ccddc08000410041b8ddc080003602c0ddc0" - "8000410041c8ddc080003602d4ddc08000410041c0ddc080003602c8ddc0800041" - "0041d0ddc080003602dcddc08000410041c8ddc080003602d0ddc08000410041d8" - "ddc080003602e4ddc08000410041d0ddc080003602d8ddc08000410041e0ddc080" - "003602ecddc08000410041d8ddc080003602e0ddc08000410041e8ddc080003602" - "f4ddc08000410041e0ddc080003602e8ddc08000410041f0ddc080003602fcddc0" - "8000410041e8ddc080003602f0ddc08000410041003602b4ddc08000410041f8dd" - "c08000360284dec08000410041f0ddc080003602f8ddc08000410041f8ddc08000" - "360280dec0800041004180dec0800036028cdec0800041004180dec08000360288" - "dec0800041004188dec08000360294dec0800041004188dec08000360290dec080" - "0041004190dec0800036029cdec0800041004190dec08000360298dec080004100" - "4198dec080003602a4dec0800041004198dec080003602a0dec08000410041a0de" - "c080003602acdec08000410041a0dec080003602a8dec08000410041a8dec08000" - "3602b4dec08000410041a8dec080003602b0dec08000410041b0dec080003602bc" - "dec08000410041b0dec080003602b8dec08000410041b8dec080003602c4dec080" - "00410041c0dec080003602ccdec08000410041b8dec080003602c0dec080004100" - "41c8dec080003602d4dec08000410041c0dec080003602c8dec08000410041d0de" - "c080003602dcdec08000410041c8dec080003602d0dec08000410041d8dec08000" - "3602e4dec08000410041d0dec080003602d8dec08000410041e0dec080003602ec" - "dec08000410041d8dec080003602e0dec08000410041e8dec080003602f4dec080" - "00410041e0dec080003602e8dec08000410041f0dec080003602fcdec080004100" - "41e8dec080003602f0dec08000410041f8dec08000360284dfc08000410041f0de" - "c080003602f8dec0800041004180dfc0800036028cdfc08000410041f8dec08000" - "360280dfc0800041004188dfc08000360294dfc0800041004180dfc08000360288" - "dfc0800041004190dfc0800036029cdfc0800041004188dfc08000360290dfc080" - "0041004198dfc080003602a4dfc0800041004190dfc08000360298dfc080004100" - "41a0dfc080003602acdfc0800041004198dfc080003602a0dfc08000410041a8df" - "c080003602b4dfc08000410041a0dfc080003602a8dfc08000410041b0dfc08000" - "3602bcdfc08000410041a8dfc080003602b0dfc08000410020053602d4dfc08000" - "410041b0dfc080003602b8dfc080004100200841586a22003602ccdfc080002005" - "2000410172360204200520006a4128360204410041808080013602e0dfc080000c" - "080b200120054f0d00200620014b0d00200028020c450d030b410041002802e4df" - "c080002200200520002005491b3602e4dfc08000200520086a210641a8ddc08000" - "21000240024002400340200028020022072006460d01200028020822000d000c02" - "0b0b200028020c450d010b41a8ddc0800021000240034002402000280200220620" - "014b0d002001200620002802046a2206490d020b200028020821000c000b0b4100" - "20053602d4dfc080004100200841586a22003602ccdfc080002005200041017236" - "0204200520006a4128360204410041808080013602e0dfc080002001200641606a" - "41787141786a22002000200141106a491b2207411b36020441002902a8ddc08000" - "2109200741106a41002902b0ddc0800037020020072009370208410020083602ac" - "ddc08000410020053602a8ddc080004100200741086a3602b0ddc0800041004100" - "3602b4ddc080002007411c6a2100034020004107360200200041046a2200200649" - "0d000b20072001460d0720072007280204417e713602042001200720016b220041" - "01723602042007200036020002402000418002490d002001200010e3808080000c" - "080b200041f8017141b8ddc080006a21060240024041002802c0dfc08000220541" - "012000410376742200710d00410020052000723602c0dfc08000200621000c010b" - "200628020821000b200620013602082000200136020c2001200636020c20012000" - "3602080c070b200020053602002000200028020420086a36020420052002410372" - "3602042007410f6a41787141786a2201200520026a22006b2102200141002802d4" - "dfc08000460d03200141002802d0dfc08000460d04024020012802042206410371" - "4101470d0020012006417871220610a880808000200620026a2102200120066a22" - "0128020421060b20012006417e7136020420002002410172360204200020026a20" - "0236020002402002418002490d002000200210e3808080000c060b200241f80171" - "41b8ddc080006a21010240024041002802c0dfc080002206410120024103767422" - "02710d00410020062002723602c0dfc08000200121020c010b200128020821020b" - "200120003602082002200036020c2000200136020c200020023602080c050b4100" - "200020026b22013602ccdfc08000410041002802d4dfc08000220020026a220636" - "02d4dfc080002006200141017236020420002002410372360204200041086a2101" - "0c060b41002802d0dfc08000210102400240200020026b2206410f4b0d00410041" - "003602d0dfc08000410041003602c8dfc080002001200041037236020420012000" - "6a220020002802044101723602040c010b410020063602c8dfc080004100200120" - "026a22053602d0dfc0800020052006410172360204200120006a20063602002001" - "20024103723602040b200141086a0f0b2000200720086a360204410041002802d4" - "dfc080002200410f6a417871220141786a22063602d4dfc080004100200020016b" - "41002802ccdfc0800020086a22016a41086a22053602ccdfc08000200620054101" - "72360204200020016a4128360204410041808080013602e0dfc080000c030b4100" - "20003602d4dfc08000410041002802ccdfc0800020026a22023602ccdfc0800020" - "0020024101723602040c010b410020003602d0dfc08000410041002802c8dfc080" - "0020026a22023602c8dfc0800020002002410172360204200020026a2002360200" - "0b200541086a0f0b4100210141002802ccdfc08000220020024d0d004100200020" - "026b22013602ccdfc08000410041002802d4dfc08000220020026a22063602d4df" - "c080002006200141017236020420002002410372360204200041086a0f0b20010f" - "0b20002004360218024020062802102205450d0020002005360210200520003602" - "180b20062802142205450d0020002005360214200520003602180b024002402001" - "4110490d0020062002410372360204200620026a22002001410172360204200020" - "016a200136020002402001418002490d002000200110e3808080000c020b200141" - "f8017141b8ddc080006a21020240024041002802c0dfc080002205410120014103" - "76742201710d00410020052001723602c0dfc08000200221010c010b2002280208" - "21010b200220003602082001200036020c2000200236020c200020013602080c01" - "0b2006200120026a2200410372360204200620006a220020002802044101723602" - "040b200641086a0b1000024020000d0010a3808080000b000b140002402001450d" - "00200020011082808080000b0ba20b03087f017e017f2380808080004190016b22" - "04248080808000200441e8006a20002001109d8080800002400240024002400240" - "024002400240024002400240024020042d00684106460d00200441106a200441e8" - "006a41106a2205290300370300200441086a200441e8006a41086a220629030037" - "030020042004290368370300200441e8006a20022003109d8080800020042d0068" - "4106460d01200441186a41106a2005290300370300200441186a41086a20062903" - "003703002004200429036837031841dc81c0800041072004109e80808000220745" - "0d0241dc81c080004107200441186a109e808080002208450d03418482c0800041" - "04200441186a109e808080002206450d0420062d00004103462205450d05410021" - "092006280208410020051b210502400240200628020c220a0e020c00010b410121" - "0920052d000041556a0e030b080b080b20052d0000412b470d06200541016a2105" - "200a410a492106200a417f6a2209210a20060d070c080b2004200428026c36024c" - "41b880c08000412b200441cc006a41e480c0800041bc81c08000109f8080800000" - "0b2004200428026c36024c41b880c08000412b200441cc006a41e480c0800041cc" - "81c08000109f80808000000b41e481c0800010a080808000000b41f481c0800010" - "a080808000000b418882c0800010a080808000000b419882c0800010a080808000" - "000b200a2109200a41094f0d010b41002106034020052d000041506a220a41094b" - "0d02200541016a2105200a2006410a6c6a21062009417f6a22090d000c040b0b41" - "0021060340200a450d0320052d000041506a220b41094b0d01410221092006ad42" - "0a7e220c422088a74100470d02200541016a2105200a417f6a210a200b200ca722" - "0d6a2206200d4f0d000c020b0b410121090b200420093a006841b880c08000412b" - "200441e8006a41a880c0800041a882c08000109f80808000000b20042006360230" - "02400240200720081094808080000d00200441003a00370c010b20042006417f6a" - "220536023002402005450d00200441003a00370c010b200441013a00370b200441" - "0336026c200441d482c08000360268200442023702742004418180808000360258" - "20044182808080003602502004200441cc006a3602702004200441306a36025420" - "04200441376a36024c200441e8006a10a28080800041002d00e0dbc080001a0240" - "02400240024041091099808080002205450d00200520042d00373a000020044100" - "360254200442808080801037024c200441033a0088012004412036027820044100" - "360284012004418080c08000360280012004410036027020044100360268200420" - "0441cc006a36027c20043502304101200441e8006a1084808080000d0120044138" - "6a41086a200441cc006a41086a2802003602002004200429024c37033841002d00" - "e0dbc080001a200428023c210641041099808080002209450d0220092006360000" - "2005200636000120042004280240220a36024841002d00e0dbc080001a20044104" - "3602444104109980808000220b450d032005200a360005200b200a360000200441" - "05360250200441a083c0800036024c200442043702582004418180808000360284" - "01200441818080800036027c200441838080800036027420044184808080003602" - "6c200420063602642004200441e8006a3602542004200441c8006a360280012004" - "200441c4006a3602782004200441e4006a3602702004200441386a360268200441" - "cc006a10a280808000200b41041082808080002009410410828080800020044118" - "6a108a808080002004108a8080800002402003450d00200220031082808080000b" - "02402001450d00200020011082808080000b20044190016a24808080800020050f" - "0b41014109109a80808000000b41c0a5c080004137200441e4006a419880c08000" - "41c4a6c08000109f80808000000b41014104109a80808000000b41014104109a80" - "808000000bea0301057f23808080800041e0006b22032480808080002003410036" - "0228200320023602242003200136022020034180013a002c2003410036021c2003" - "428080808010370214200341c8006a200341146a10e88080800002400240024002" - "4020032d00484106460d00200341306a41106a2204200341c8006a41106a290300" - "370300200341306a41086a2205200341c8006a41086a2903003703002003200329" - "03483703300240024020032802282202200328022422064f0d0020032802202107" - "0340200720026a2d000041776a220141174b0d024101200174419380800471450d" - "022006200241016a2202470d000b200320063602280b2000200329033037030020" - "0041106a2004290300370300200041086a20052903003703002003280214220245" - "0d04200328021820021082808080000c040b20032002360228200341086a200720" - "062006200241016a220220062002491b10c78080800041002d00e0dbc080001a20" - "0328020c21012003280208210641141099808080002202450d012002200636020c" - "2002411636020020002002360204200041063a000020022001360210200341306a" - "108a808080000c020b2000200328024c360204200041063a00000c010b000b2003" - "2802142202450d00200328021820021082808080000b200341e0006a2480808080" - "000be60101077f41002103024020022d00004105470d0020022802042204450d00" - "2002280208210503402004418c026a210220042f0192032206410c6c2107417f21" - "08024002400340024020070d00200621080c020b20022802082103200228020421" - "09200841016a2108200741746a21072002410c6a2102417f200020092001200320" - "012003491b10f7808080002209200120036b20091b220341004720034100481b22" - "034101460d000b200341ff0171450d010b024020050d0041000f0b2005417f6a21" - "05200420084102746a4198036a28020021040c010b0b2004200841186c6a21030b" - "20030b8f0101017f23808080800041c0006b22052480808080002005200136020c" - "2005200036020820052003360214200520023602102005410236021c200541e486" - "c08000360218200542023702242005418580808000ad422086200541106aad8437" - "03382005418680808000ad422086200541086aad843703302005200541306a3602" - "20200541186a200410a480808000000b130041ec84c08000412b200010a6808080" - "00000b11002000350200410120011084808080000bbe0604017f017e037f017e23" - "808080800041c0006b22012480808080002001410636020c200141b0c2c0800036" - "0208024041002d0090dcc080004103460d0010db808080000b0240024002400240" - "024041002903f8dfc0800022024200520d0002404100280280e0c0800022030d00" - "10d5808080004100280280e0c0800021030b20032003280200220441016a360200" - "2004417f4c0d012003450d02200320032802002204417f6a360200200329030821" - "0220044101470d00200310d6808080000b024002400240200241002903e8dbc080" - "00510d0041002d00f4dbc08000210441012103410041013a00f4dbc08000200120" - "043a00182004450d012001420037023420014281808080c00037022c200141d8c3" - "c08000360228200141186a200141286a10d780808000000b024041002802f0dbc0" - "80002203417f460d00200341016a21030c020b41b8c4c08000412641fcc4c08000" - "10b780808000000b410020023703e8dbc080000b410020033602f0dbc080002001" - "41e8dbc0800036021041042103200141043a00182001200141106a360220200141" - "186a41dcb7c08000200010b280808000210020012d001821040240024020000d00" - "420021024117200441ff0171764101710d01200128021c22032802002100024020" - "0341046a28020022042802002205450d002000200511828080800080808080000b" - "024020042802042204450d00200020041082808080000b2003410c108280808000" - "410421030c010b200441ff01714104460d032001290318220642807e8321022006" - "a721030b200128021022002000280208417f6a2204360208024020040d00200041" - "003a000c200042003703000b200341ff01714104470d03200141c0006a24808080" - "80000f0b000b419cb9c0800041de004190bac0800010b780808000000b20014100" - "3602382001410136022c200141a0c3c0800036022820014204370230200141286a" - "41a8c3c0800010a480808000000b200120022003ad42ff01838437031020014102" - "36022c20014190c2c08000360228200142023702342001418780808000ad422086" - "200141106aad843703202001418680808000ad422086200141086aad8437031820" - "01200141186a360230200141286a41a0c2c0800010a480808000000b4701017f23" - "808080800041206b2200248080808000200041003602182000410136020c200041" - "8484c0800036020820004204370210200041086a41a084c0800010a48080800000" - "0b5601017f23808080800041206b2202248080808000200241106a200041106a29" - "0200370300200241086a200041086a290200370300200241013b011c2002200136" - "021820022000290200370300200210ab80808000000bbe0601057f200041786a22" - "012000417c6a280200220241787122006a21030240024020024101710d00200241" - "0271450d012001280200220220006a21000240200120026b220141002802d0dfc0" - "8000470d0020032802044103714103470d01410020003602c8dfc0800020032003" - "280204417e7136020420012000410172360204200320003602000f0b2001200210" - "a8808080000b024002400240024002400240200328020422024102710d00200341" - "002802d4dfc08000460d02200341002802d0dfc08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a200036020020" - "0141002802d0dfc08000470d01410020003602c8dfc080000f0b20032002417e71" - "36020420012000410172360204200120006a20003602000b2000418002490d0220" - "01200010e38080800041002101410041002802e8dfc08000417f6a22003602e8df" - "c0800020000d04024041002802b0ddc080002200450d0041002101034020014101" - "6a2101200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602e8dfc0" - "80000f0b410020013602d4dfc08000410041002802ccdfc0800020006a22003602" - "ccdfc08000200120004101723602040240200141002802d0dfc08000470d004100" - "41003602c8dfc08000410041003602d0dfc080000b200041002802e0dfc0800022" - "044d0d0341002802d4dfc080002200450d034100210241002802ccdfc080002205" - "4129490d0241a8ddc080002101034002402001280200220320004b0d0020002003" - "20012802046a490d040b200128020821010c000b0b410020013602d0dfc0800041" - "0041002802c8dfc0800020006a22003602c8dfc080002001200041017236020420" - "0120006a20003602000f0b200041f8017141b8ddc080006a210302400240410028" - "02c0dfc08000220241012000410376742200710d00410020022000723602c0dfc0" - "8000200321000c010b200328020821000b200320013602082000200136020c2001" - "200336020c200120003602080f0b024041002802b0ddc080002201450d00410021" - "020340200241016a2102200128020822010d000b0b4100200241ff1f200241ff1f" - "4b1b3602e8dfc08000200520044d0d004100417f3602e0dfc080000b0b4d01017f" - "23808080800041206b220324808080800020034100360210200341013602042003" - "42043702082003200136021c200320003602182003200341186a36020020032002" - "10a480808000000b840601057f0240024002402000417c6a220328020022044178" - "71220541044108200441037122061b20016a490d0002402006450d002005200141" - "276a4b0d020b41102002410b6a4178712002410b491b210102400240024020060d" - "002001418002490d0120052001410472490d01200520016b418180084f0d010c02" - "0b200041786a220720056a21060240024002400240200520014f0d002006410028" - "02d4dfc08000460d03200641002802d0dfc08000460d0220062802042204410271" - "0d042004417871220420056a22052001490d042006200410a88080800020052001" - "6b22024110490d0120032001200328020041017172410272360200200720016a22" - "012002410372360204200720056a220520052802044101723602042001200210a9" - "8080800020000f0b200520016b2202410f4d0d0420032001200441017172410272" - "360200200720016a22052002410372360204200620062802044101723602042005" - "200210a98080800020000f0b200320052003280200410171724102723602002007" - "20056a2202200228020441017236020420000f0b41002802c8dfc0800020056a22" - "052001490d0102400240200520016b2202410f4b0d002003200441017120057241" - "0272360200200720056a2202200228020441017236020441002102410021010c01" - "0b20032001200441017172410272360200200720016a2201200241017236020420" - "0720056a2205200236020020052005280204417e713602040b410020013602d0df" - "c08000410020023602c8dfc0800020000f0b41002802ccdfc0800020056a220520" - "014b0d040b0240200210998080800022050d0041000f0b20052000417c41782003" - "28020022014103711b20014178716a2201200220012002491b10fa808080002102" - "200010a580808000200221000b20000f0b419db8c08000412e41ccb8c0800010a6" - "80808000000b41dcb8c08000412e418cb9c0800010a680808000000b2003200120" - "0441017172410272360200200720016a2202200520016b22054101723602044100" - "20053602ccdfc08000410020023602d4dfc0800020000b820301047f200028020c" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" "21020240024002402001418002490d002000280218210302400240024020022000" "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" "002802082201200236020c200220013602080c010b200041146a200041106a2002" "1b21040340200421052001220241146a200241106a200228021422011b21042002" "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441a8dcc080006a22012802002000460d0020034110411420032802" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "002802c4dfc08000417e200028021c77713602c4dfc080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b410041002802c0dfc0" - "8000417e200141037677713602c0dfc080000f0b20022003360218024020002802" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" "102201450d0020022001360210200120023602180b20002802142201450d002002" "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802d0dfc08000470d0020022802044103714103470d014100" - "20013602c8dfc0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a8808080000b02400240024002402002280204" - "22034102710d00200241002802d4dfc08000460d02200241002802d0dfc0800046" - "0d0320022003417871220310a8808080002000200320016a220141017236020420" - "0020016a2001360200200041002802d0dfc08000470d01410020013602c8dfc080" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110e3808080000f0b200141f8017141b8ddc0" - "80006a21020240024041002802c0dfc08000220341012001410376742201710d00" - "410020032001723602c0dfc08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602d4" - "dfc08000410041002802ccdfc0800020016a22013602ccdfc08000200020014101" - "72360204200041002802d0dfc08000470d01410041003602c8dfc0800041004100" - "3602d0dfc080000f0b410020003602d0dfc08000410041002802c8dfc080002001" - "6a22013602c8dfc0800020002001410172360204200020016a20013602000f0b0b" - "7902017f017e23808080800041306b220324808080800020032001360204200320" - "003602002003410236020c200341cc85c080003602082003420237021420034181" - "80808000ad42208622042003ad8437032820032004200341046aad843703202003" - "200341206a360210200341086a200210a480808000000b5d01027f238080808000" - "41206b220124808080800020002802182102200141106a200041106a2902003703" - "00200141086a200041086a2902003703002001200036021c200120023602182001" - "2000290200370300200110e480808000000b490002402002418080c400460d0020" - "00200220012802101181808080008080808000450d0041010f0b024020030d0041" - "000f0b200020032004200128020c11808080800080808080000b7902017f017e23" - "808080800041306b22032480808080002003200036020020032001360204200341" - "0236020c200341bc8ac08000360208200342023702142003418180808000ad4220" - "862204200341046aad84370328200320042003ad843703202003200341206a3602" - "10200341086a200210a480808000000b820302017f017e23808080800041f0006b" - "2203248080808000200341ccb7c0800036020c20032000360208200341ccb7c080" - "00360214200320013602102003410236021c200341dc85c0800036021802402002" - "2802000d002003410336025c2003419086c0800036025820034203370264200341" - "8580808000ad4220862204200341106aad8437034820032004200341086aad8437" - "03402003418680808000ad422086200341186aad843703382003200341386a3602" - "60200341d8006a4184c4c0800010a480808000000b200341206a41106a20024110" - "6a290200370300200341206a41086a200241086a29020037030020032002290200" - "3703202003410436025c200341c486c08000360258200342043702642003418580" - "808000ad4220862204200341106aad8437035020032004200341086aad84370348" - "2003418880808000ad422086200341206aad843703402003418680808000ad4220" - "86200341186aad843703382003200341386a360260200341d8006a4184c4c08000" - "10a480808000000b1c0020002802002001200028020428020c1181808080008080" - "8080000b14002001200028020020002802041093808080000b1400200128021420" - "01280218200010b2808080000bbf05010a7f23808080800041306b220324808080" - "8000200341033a002c2003412036021c4100210420034100360228200320013602" - "2420032000360220200341003602142003410036020c0240024002400240024020" - "0228021022050d00200228020c2200450d01200228020821012000410374210620" - "00417f6a41ffffffff017141016a21042002280200210003400240200041046a28" - "02002207450d00200328022020002802002007200328022428020c118080808000" - "80808080000d040b20012802002003410c6a200128020411818080800080808080" - "000d03200141086a2101200041086a2100200641786a22060d000c020b0b200228" - "02142201450d00200141057421082001417f6a41ffffff3f7141016a2104200228" - "02082109200228020021004100210603400240200041046a2802002201450d0020" - "0328022020002802002001200328022428020c11808080800080808080000d030b" - "2003200520066a220141106a28020036021c20032001411c6a2d00003a002c2003" - "200141186a2802003602282001410c6a28020021074100210a4100210b02400240" - "0240200141086a2802000e03010002010b2007410374210c4100210b2009200c6a" - "220c2802040d01200c28020021070b4101210b0b200320073602102003200b3602" - "0c200141046a280200210702400240024020012802000e03010002010b20074103" - "74210b2009200b6a220b2802040d01200b28020021070b4101210a0b2003200736" - "02182003200a3602142009200141146a2802004103746a22012802002003410c6a" - "200128020411818080800080808080000d02200041086a21002008200641206a22" - "06470d000b0b200420022802044f0d012003280220200228020020044103746a22" - "012802002001280204200328022428020c1180808080008080808000450d010b41" - "0121010c010b410021010b200341306a24808080800020010bd70201057f238080" - "8080004180016b22022480808080000240024002400240200128021c2203411071" - "0d0020034120710d012000ad4101200110848080800021000c030b41ff00210303" - "402002200322046a22052000410f712203413072200341d7006a2003410a491b3a" - "00002004417f6a210320004110492106200041047621002006450d000c020b0b41" - "ff00210303402002200322046a22052000410f712203413072200341376a200341" - "0a491b3a00002004417f6a210320004110492106200041047621002006450d000b" - "02402004418101490d002004418001419887c08000108580808000000b20014101" - "41a887c0800041022005418101200441016a6b10868080800021000c010b024020" - "04418101490d002004418001419887c08000108580808000000b2001410141a887" - "c0800041022005418101200441016a6b10868080800021000b20024180016a2480" - "8080800020000b2200200128021441c284c08000410e200128021828020c118080" - "80800080808080000b6001017f23808080800041306b2200248080808000200041" - "0136020c200041e484c08000360208200042013702142000418980808000ad4220" - "862000412f6aad843703202000200041206a360210200041086a41e8c1c0800010" - "a480808000000b7902017f017e23808080800041306b2203248080808000200320" - "00360200200320013602042003410236020c200341f08ac0800036020820034202" - "3702142003418180808000ad4220862204200341046aad84370328200320042003" - "ad843703202003200341206a360210200341086a200210a480808000000b6a0101" - "7f23808080800041306b22032480808080002003200136020c2003200036020820" - "034101360214200341f0bac080003602102003420137021c2003418680808000ad" - "422086200341086aad843703282003200341286a360218200341106a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441809b" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41809bc080006a280200410b7420024b1b22042004410272220420044102744180" - "9bc080006a280200410b7420024b1b2204200441016a2204200441027441809bc0" - "80006a280200410b7420024b1b2204200441016a2204200441027441809bc08000" - "6a280200410b7420024b1b220441027441809bc080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441809bc080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441fc9ac080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241849cc080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641b284c080006a2d" - "00003a000b20032001410476410f7141b284c080006a2d00003a000f2003200141" - "0876410f7141b284c080006a2d00003a000e20032001410c76410f7141b284c080" - "006a2d00003a000d20032001411076410f7141b284c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141b284c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b2004412141e09ac0800010aa80808000000b200541d70541" - "f09ac0800010aa80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141c48fc08000412c419c90c0800041c40141" - "e091c0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141a295c08000412841f295c080" - "0041a002419298c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641b284c080006a2d00003a001720032001410476410f71" - "41b284c080006a2d00003a001b20032001410876410f7141b284c080006a2d0000" - "3a001a20032001410c76410f7141b284c080006a2d00003a001920032001411076" - "410f7141b284c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141b284c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41b48fc0800010b680808000000b200c200441b48fc0800010ad" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41a48fc080" - "0010a080808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641808dc0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541888ec080003602302005420537023c20054186" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418a80808000ad422086200541286aad843703582005418b80808000ad42" - "2086200541246aad843703502005418180808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541c88ec080003602302005420337023c2005" - "418680808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418180808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541a88dc080003602302005420437023c2005418680" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418180808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "200641f48ec0800010b680808000000b200410a080808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b3808080" - "000d00200128021441b084c080004102200128021828020c118080808000808080" - "80000d002000280204200110b38080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111818080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111818080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11808080800080808080000d010b2004412720011181808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f7620011084808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10f9808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10f9808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410f9808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00e0dbc080001a200128020022032f01920321040240024002" - "400240024041c8031099808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10fa8080" - "80001a20052003200b41186c6a200841186c10fa80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "fa80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810fa80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41a0a4c0800010ad80808000000b41e8a3c0800041284190a4c0800010a68080" - "8000000b2008410c41b0a4c0800010ad80808000000b41e8a3c0800041284190a4" - "c0800010a680808000000b900801017f23808080800041f0006b22022480808080" - "0020002802002100200241003602482002428080808010370240200241033a006c" - "2002412036025c2002410036026820024198a5c080003602642002410036025420" - "02410036024c2002200241c0006a36026002400240024002400240024002400240" - "024002400240024002400240024002400240024002400240024002400240024002" - "400240024020002802000e191718000102030405060708090a0b0c0d0e0f101112" - "13141516170b200241c0006a41d9a6c0800041181091808080000d190c180b2002" - "41c0006a41f1a6c08000411b1091808080000d180c170b200241c0006a418ca7c0" - "8000411a1091808080000d170c160b200241c0006a41a6a7c08000411910918080" - "80000d160c150b200241c0006a41bfa7c08000410c1091808080000d150c140b20" - "0241c0006a41cba7c0800041131091808080000d140c130b200241c0006a41dea7" - "c0800041131091808080000d130c120b200241c0006a41f1a7c08000410e109180" - "8080000d120c110b200241c0006a41ffa7c08000410e1091808080000d110c100b" - "200241c0006a418da8c08000410c1091808080000d100c0f0b200241c0006a4199" - "a8c08000410e1091808080000d0f0c0e0b200241c0006a41a7a8c08000410e1091" - "808080000d0e0c0d0b200241c0006a41b5a8c0800041131091808080000d0d0c0c" - "0b200241c0006a41c8a8c08000411a1091808080000d0c0c0b0b200241c0006a41" - "e2a8c08000413e1091808080000d0b0c0a0b200241c0006a41a0a9c08000411410" - "91808080000d0a0c090b200241c0006a41b4a9c0800041341091808080000d090c" - "080b200241c0006a41e8a9c08000412c1091808080000d080c070b200241c0006a" - "4194aac0800041241091808080000d070c060b200241c0006a41b8aac08000410e" - "1091808080000d060c050b200241c0006a41c6aac0800041131091808080000d05" - "0c040b200241c0006a41d9aac08000411c1091808080000d040c030b200241c000" - "6a41f5aac0800041181091808080000d030c020b200241c0006a20002802042000" - "280208109180808000450d010c020b200041046a200241cc006a10c3808080000d" - "010b200241306a41086a200241c0006a41086a2802003602002002200229024037" - "0330200241818080800036022c20024181808080003602242002418c8080800036" - "021c20024104360204200241a8abc080003602002002420337020c200220004110" - "6a36022820022000410c6a3602202002200241306a3602182002200241186a3602" - "0820012802142001280218200210b2808080002100024020022802302201450d00" - "200228023420011082808080000b200241f0006a24808080800020000f0b41c0a5" - "c080004137200241186a41b0a5c0800041c4a6c08000109f80808000000be50301" - "017f23808080800041c0006b220224808080800002400240024002400240024020" - "002d00000e0400010203000b2002200028020436020441002d00e0dbc080001a41" - "141099808080002200450d04200041106a410028009cc5c0800036000020004108" - "6a4100290094c5c080003700002000410029008cc5c08000370000200241143602" - "102002200036020c200241143602082002410336022c200241bcc1c08000360228" - "200242023702342002418d80808000ad422086200241046aad843703202002418e" - "80808000ad422086200241086aad843703182002200241186a3602302001280214" - "2001280218200241286a10b280808000210020022802082201450d03200228020c" - "20011082808080000c030b20002d000121002002410136022c200241f0bac08000" - "360228200242013702342002418680808000ad422086200241186aad8437030820" - "022000410274220041e0c5c080006a28020036021c200220004184c7c080006a28" - "02003602182002200241086a36023020012802142001280218200241286a10b280" - "80800021000c020b20012000280204220028020020002802041093808080002100" - "0c010b200028020422002802002001200028020428021011818080800080808080" - "0021000b200241c0006a24808080800020000f0b000bd507010d7f238080808000" - "41106b220224808080800020002802082103200028020421044101210502402001" - "2802142206412220012802182207280210220811818080800080808080000d0002" - "40024020030d0041002103410021000c010b410021094100210a2004210b200321" - "0c024002400340200b200c6a210d4100210002400340200b20006a220e2d000022" - "0141817f6a41ff017141a101490d0120014122460d01200141dc00460d01200c20" - "0041016a2200470d000b200a200c6a210a0c030b02400240200e2c00002201417f" - "4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71210b2001" - "411f71210c02402001415f4b0d00200c410674200b722101200e41026a210b0c01" - "0b200b410674200e2d0002413f7172210b0240200141704f0d00200b200c410c74" - "722101200e41036a210b0c010b200b410674200e2d0003413f7172200c41127441" - "8080f00071722101200e41046a210b0b2000200a6a2100200241046a2001418180" - "0410b8808080000240024020022d0004418001460d0020022d000f20022d000e6b" - "41ff01714101460d0020002009490d0302402009450d000240200920034f0d0020" - "0420096a2c000041bf7f4a0d010c050b20092003470d040b02402000450d000240" - "200020034f0d00200420006a2c000041bf7f4c0d050c010b20002003470d040b20" - "06200420096a200020096b200728020c220e11808080800080808080000d010240" - "024020022d0004418001470d002006200228020820081181808080008080808000" - "450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b200e1180" - "8080800080808080000d020b0240024020014180014f0d004101210e0c010b0240" - "20014180104f0d004102210e0c010b41034104200141808004491b210e0b200e20" - "006a21090b0240024020014180014f0d00410121010c010b024020014180104f0d" - "00410221010c010b41034104200141808004491b21010b200120006a210a200d20" - "0b6b220c0d010c030b0b410121050c030b2004200320092000419089c0800010ba" - "80808000000b02402009200a4b0d004100210002402009450d000240200920034f" - "0d0020092100200420096a2c000041bf7f4c0d020c010b2003210020092003470d" - "010b0240200a0d00410021030c020b0240200a20034f0d00200021092004200a6a" - "2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b2004200320" - "09200a41a089c0800010ba80808000000b2006200420006a200320006b20072802" - "0c11808080800080808080000d0020064122200811818080800080808080002105" - "0b200241106a24808080800020050b870102017c017e0240024002402001280200" - "0e03000102000b20004202370308200020012b0308220239031020002002bd42ff" - "ffffffffffffffff00834280808080808080f8ff00534101743a00000f0b200042" - "00370308200041023a0000200020012903083703100f0b200041023a0000200020" - "01290308220337031020002003423f883703080be411020b7f027e238080808000" - "41c0016b2204248080808000024002400240024002400240024002400240024002" - "400240024020012802002205450d00200228020821062002280204210720012802" - "042108024003402005418c026a210920052f019203220a410c6c210b417f210c02" - "40024003400240200b0d00200a210c0c020b2009280208210d2009280204210e20" - "0c41016a210c200b41746a210b2009410c6a2109417f2007200e2006200d200620" - "0d491b10f780808000220e2006200d6b200e1b220d410047200d4100481b220d41" - "01460d000b200d41ff0171450d010b2008450d022008417f6a21082005200c4102" - "746a4198036a28020021050c010b0b20022802002209450d0c2007200910828080" - "80000c0c0b2002290204220fa721092002280200220b418080808078470d032009" - "21050c010b2002290204220fa721052002280200220d418080808078470d010b20" - "01210c0c090b41002d00e0dbc080001a4198031099808080002209450d02200941" - "013b01920320094100360288022009200f422088a7ad4220862005ad8437039002" - "2009200d36028c0220014280808080103702042001200936020020092003290300" - "370300200941086a200341086a290300370300200941106a200341106a29030037" - "03000c010b200f422088a7ad4220862009ad84210f024002400240024002402005" - "2f0192032209410b490d00200441086a21084104210d200c4105490d03200c210d" - "200c417b6a0e020302010b2005418c026a220e200c410c6c6a210d02400240200c" - "41016a220620094d0d00200d200f370204200d200b3602000c010b200e2006410c" - "6c6a200d2009200c6b220e410c6c10f9808080001a200d200f370204200d200b36" - "02002005200641186c6a2005200c41186c6a200e41186c10f9808080001a0b2005" - "200c41186c6a220d41106a200341106a290300370300200d200329030037030020" - "0d41086a200341086a2903003703002005200941016a3b0192030c030b200c4179" - "6a210c200441f8006a21084106210d0c010b4100210c200441f8006a2108410521" - "0d0b41002d00e0dbc080001a4198031099808080002209450d02200941003b0192" - "0320094100360288022009200d417f7320052f01920322076a22063b0192032004" - "4188016a41086a2005200d41186c6a220e41086a29030037030020044188016a41" - "106a200e41106a2903003703002004200e290300370388012006410c4f0d032007" - "200d41016a220e6b2006470d042005418c026a2202200d410c6c6a220729020421" - "10200728020021072009418c026a2002200e410c6c6a2006410c6c10fa80808000" - "1a20092005200e41186c6a200641186c10fa8080800021062005200d3b01920320" - "0441dc006a410c6a20044190016a290300370200200441f0006a20044198016a29" - "030037020020042004290388013702602004200536020820042006360278200828" - "0200220d418c026a200c410c6c6a210602400240200d2f019203220e200c4b0d00" - "2006200f3702042006200b3602000c010b2006410c6a2006200e200c6b2208410c" - "6c10f9808080001a2006200f3702042006200b360200200d200c41186c6a220b41" - "186a200b200841186c10f9808080001a0b200d200c41186c6a220b41106a200341" - "106a290300370300200b2003290300370300200b41086a200341086a2903003703" - "00200d200e41016a3b0192032007418080808078460d00200441c4006a200441dc" - "006a41086a290200370200200441cc006a200441dc006a41106a29020037020020" - "0441306a41246a200441dc006a41186a2802003602002004201037023420042007" - "3602302004200429025c37023c024002400240200528028802220b0d004100210c" - "0c010b200441306a4104722108200441b8016a210220044188016a410472210720" - "0441b0016a2103200441c0006a210e4100210c4100210603402006200c470d0820" - "052f019003210d200b2f019203410b490d02200641016a21060240024002400240" - "024002400240200d4105490d00200d417b6a0e020203010b200441043602800120" - "04200636027c2004200b3602782003210b0c040b20044106360280012004200636" - "027c2004200b360278200d41796a210d0c020b2004410536028001200420063602" - "7c2004200b36027820044188016a200441f8006a10c18080800020042802b00141" - "05200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0c030b20044105360280012004200636027c2004200b36027841" - "00210d0b2002210b0b20044188016a200441f8006a10c180808000200b28020020" - "0d200441306a200e200910c080808000200428028801210d200441086a20074124" - "10fa808080001a0b20042802bc01210c20042802b801210920042802b401210620" - "042802b0012105200d418080808078460d032004200d3602302008200441086a41" - "2410fa808080001a200528028802220b0d000b0b2001280200220b450d0741002d" - "00e0dbc080001a2001280204210641c803109980808000220d450d03200d200b36" - "029803200d41003b019203200d410036028802200b41003b019003200b200d3602" - "88022001200641016a3602042001200d3602002006200c470d08200d2004290330" - "37028c02200d41013b019203200d2004290340370300200d200936029c03200d41" - "94026a200441306a41086a280200360200200d41086a200441c8006a2903003703" - "00200d41106a200441d0006a2903003703002009200d36028802200941013b0190" - "030c010b200b200d200441306a200e200910c0808080000b200120012802084101" - "6a3602080b200041063a00000c070b000b2006410b41a0a4c0800010ad80808000" - "000b41e8a3c0800041284190a4c0800010a680808000000b41c0a4c08000413541" - "f8a4c0800010a680808000000b41bca2c0800010a080808000000b41a7a3c08000" - "413041d8a3c0800010a680808000000b20002005200c41186c6a22092903003703" - "00200041106a200941106a220d290300370300200041086a200941086a220b2903" - "0037030020092003290300370300200b200341086a290300370300200d20034110" - "6a2903003703000b200441c0016a2480808080000be60301057f02400240024002" - "400240024020022003490d00410121044100210520034101480d04200120036a21" - "060240200341034b0d000340200620014d0d062006417f6a22062d0000410a470d" - "000c050b0b024041808284082006417c6a2800002207418a94a8d000736b200772" - "41808182847871418081828478460d000340200620014d0d062006417f6a22062d" - "0000410a470d000c050b0b200320064103716b210720034109490d010340024002" - "4020074108480d004180828408200120076a220641786a2802002208418a94a8d0" - "00736b20087241808182847871418081828478460d010b200120076a21060c040b" - "200741786a210741808284082006417c6a2802002208418a94a8d000736b200872" - "41808182847871418081828478460d000c030b0b2003200241b8adc0800010ad80" - "808000000b200120076a21060340200620014d0d032006417f6a22062d0000410a" - "470d000c020b0b0340200620014d0d022006417f6a22062d0000410a470d000b0b" - "200620016b41016a220520024b0d010b0240200120056a20014d0d004100210620" - "0521070340200620012d0000410a466a2106200141016a21012007417f6a22070d" - "000b200641016a21040b200020043602002000200320056b3602040f0b20052002" - "41c8adc0800010ad80808000000b9b0d02097f017e23808080800041306b220324" - "808080800002400240024002400240024002400240024003400240024020012802" - "08220420012802042205460d00024002400240200420054f0d0020012802002206" - "20046a2d000022074122460d01200741dc00460d0120074120490d012006200441" - "016a22086a21094100200520086b417871220a6b210703402009210b024020070d" - "002001200a20086a360208200110c9808080002001280204210520012802082107" - "0c040b200741086a2107200b41086a2109200b290000220c42a2c48891a2c48891" - "228542fffdfbf7efdfbfff7e7c200c42e0bffffefdfbf7ef5f7c84200c42dcb8f1" - "e2c58b97aedc008542fffdfbf7efdfbfff7e7c84200c427f858342808182848890" - "a0c0807f83220c500d000b2001200b20066b200c7aa74103766a22073602080c02" - "0b2004200541d8adc0800010aa808080000c080b200421070b20072005470d0120" - "0521040b200341086a20012802002004200410c78080800041002d00e0dbc08000" - "1a200328020c210b2003280208210941141099808080002207450d052007200936" - "020c2007410436020020002007360204200041023602002007200b3602100c0a0b" - "024020072005490d002007200541e8adc0800010aa80808000000b024020012802" - "00220b20076a2d0000220941dc00460d00024020094122470d002002280208450d" - "0520072004490d072002200b20046a200720046b10ca808080004101210b200120" - "0741016a360208200341286a20012002280204200228020810cb80808000200328" - "02282207450d032000200328022c3602080c040b2001200741016a220736020820" - "0341106a200b2005200710c78080800041002d00e0dbc080001a2003280214210b" - "2003280210210941141099808080002207450d052007200936020c200741103602" - "0020002007360204200041023602002007200b3602100c0a0b024020072004490d" - "002002200b20046a200720046b10ca808080002001200741016a22093602080240" - "20092005490d00200341206a200b2005200910c78080800041002d00e0dbc08000" - "1a2003280224210b2003280220210941141099808080002207450d062007410436" - "02000c090b2001200741026a220436020802400240024002400240024002400240" - "024002400240200b20096a2d0000220741ed004a0d000240200741e1004a0d0020" - "074122460d032007412f460d04200741dc00470d02024020022802082207200228" - "0200470d002002108f808080000b2002200741016a360208200228020420076a41" - "dc003a0000410021070c0b0b2007419e7f6a0e050401010105010b200741927f6a" - "0e080500000006000708000b200341186a200b2005200410c78080800041002d00" - "e0dbc080001a200328021c210b2003280218210941141099808080002207450d0e" - "2007410c3602000c110b0240200228020822072002280200470d002002108f8080" - "80000b2002200741016a360208200228020420076a41223a0000410021070c070b" - "0240200228020822072002280200470d002002108f808080000b2002200741016a" - "360208200228020420076a412f3a0000410021070c060b02402002280208220720" - "02280200470d002002108f808080000b2002200741016a36020820022802042007" - "6a41083a0000410021070c050b0240200228020822072002280200470d00200210" - "8f808080000b2002200741016a360208200228020420076a410c3a000041002107" - "0c040b0240200228020822072002280200470d002002108f808080000b20022007" - "41016a360208200228020420076a410a3a0000410021070c030b02402002280208" - "22072002280200470d002002108f808080000b2002200741016a36020820022802" - "0420076a410d3a0000410021070c020b0240200228020822072002280200470d00" - "2002108f808080000b2002200741016a360208200228020420076a41093a000041" - "0021070c010b2001200210cc8080800021070b2007450d010c090b0b2004200741" - "98aec0800010b680808000000b4102210b200328022c21070b2000200b36020020" - "0020073602040c060b20072004490d022001200741016a360208200341286a2001" - "200b20046a200720046b10cb808080000240024020032802282207450d00200020" - "0328022c3602084100210b0c010b4102210b200328022c21070b2000200b360200" - "200020073602040c050b000b2004200741f8adc0800010b680808000000b200420" - "074188aec0800010b680808000000b2007200936020c2007200b3602100b200041" - "02360200200020073602040b200341306a2480808080000b5301047f0240200028" - "02082201200028020422024f0d00200028020021030340200320016a2d00002204" - "4122460d01200441dc00460d0120044120490d012000200141016a220136020820" - "022001470d000b0b0b4901017f02402000280200200028020822036b20024f0d00" - "200020032002109080808000200028020821030b200028020420036a2001200210" - "fa808080001a2000200320026a3602080bb10501077f23808080800041106b2204" - "24808080800002402003450d004100200341796a2205200520034b1b2106200241" - "036a417c7120026b21074100210503400240024002400240200220056a2d000022" - "08c022094100480d00200720056b4103710d01200520064f0d020340200220056a" - "2208280204200828020072418081828478710d03200541086a22052006490d000c" - "030b0b0240024002400240024002400240200841808bc080006a2d0000417e6a0e" - "03000102050b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c" - "050b200541016a220a20034f0d032002200a6a2c0000210a02400240200841e001" - "460d00200841ed01460d012009411f6a41ff0171410c490d032009417e71416e47" - "0d05200a4140480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d" - "030c020b200541016a220a20034f0d022002200a6a2c0000210a02400240024002" - "40200841907e6a0e050100000002000b2009410f6a41ff017141024b0d05200a41" - "40480d020c050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d03" - "0b200541026a220820034f0d02200220086a2c000041bf7f4a0d02200541036a22" - "0520034f0d02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b2005" - "41026a220520034f0d00200220056a2c000041bf7f4c0d010b200441086a200128" - "02002001280204200128020810c7808080004100210241002d00e0dbc080001a20" - "0428020c210520042802082108024041141099808080002203450d002003200836" - "020c2003410f360200200320053602100c060b000b200541016a21050c020b2005" - "41016a21050c010b200520034f0d000340200220056a2c00004100480d01200320" - "0541016a2205470d000c030b0b20052003490d000b0b2000200236020020002003" - "360204200441106a2480808080000be20601057f23808080800041206b22022480" - "80808000200241146a200010cd808080000240024020022f01140d000240024002" - "4002400240024020022f011622034180f803714180b803460d0020034180c8006a" - "41ffff03714180f803490d04200241146a200010ce8080800020022d00140d0620" - "022d0015210420002000280208220541016a360208200441dc00470d0320024114" - "6a200010ce8080800020022d00140d0620022d001521042000200541026a360208" - "200441f500470d02200241146a200010cd8080800020022f01140d0620022f0116" - "22044180c0006a41ffff03714180f803490d0120034180d0006a41ffff0371410a" - "7420044180c8006a41ffff0371722205418080046a210302402001280200200128" - "020822006b41034b0d00200120004104109080808000200128020821000b200120" - "0041046a360208200128020420006a2200200341127641f001723a000020004103" - "6a2004413f71418001723a000020002005410676413f71418001723a0002200020" - "03410c76413f71418001723a0001410021000c070b200220002802002000280204" - "200028020810c78080800041002d00e0dbc080001a200228020421012002280200" - "210341141099808080002200450d042000200336020c2000411436020020002001" - "3602100c060b200241086a20002802002000280204200028020810c78080800041" - "002d00e0dbc080001a200228020c21012002280208210341141099808080002200" - "450d032000200336020c20004114360200200020013602100c050b200241173602" - "142000200241146a10cf8080800021000c040b200241173602142000200241146a" - "10cf8080800021000c030b0240024002402003418001490d000240200128020020" - "0128020822046b41034b0d00200120044104109080808000200128020821040b20" - "0128020420046a210020034180104f0d0120034106764140722106410221050c02" - "0b0240200128020822002001280200470d002001108f808080000b200120004101" - "6a360208200128020420006a20033a0000410021000c040b20002003410676413f" - "71418001723a00012003410c764160722106410321050b200020063a0000200120" - "0420056a360208200020056a417f6a2003413f71418001723a0000410021000c02" - "0b000b200228021821000b200241206a24808080800020000b910301057f238080" - "80800041106b220224808080800002400240024002402001280204220320012802" - "082204490d000240200320046b41034b0d0020012003360208200241086a200128" - "02002003200310c78080800041002d00e0dbc080001a200228020c210320022802" - "08210441141099808080002201450d022001200436020c20014104360200200020" - "01360204200120033602100c030b2001200441046a220536020802402001280200" - "220620046a22012d000141017441b8aec080006a2f010020012d000041017441b8" - "b2c080006a2f010072c141087420012d000241017441b8b2c080006a2e01007220" - "012d000341017441b8aec080006a2e0100722201417f4a0d002002200620032005" - "10c78080800041002d00e0dbc080001a2002280204210320022802002104411410" - "99808080002201450d022001200436020c2001410c360200200020013602042001" - "20033602100c030b200020013b0102410021010c030b2004200341a8aec0800010" - "85808080000b000b410121010b200020013b0100200241106a2480808080000bb2" - "0101037f23808080800041106b2202248080808000024002400240200128020822" - "0320012802042204490d00200241086a20012802002004200310c7808080004100" - "2d00e0dbc080001a200228020c2103200228020821044114109980808000220145" - "0d022001200436020c200141043602002000200136020420012003360210410121" - "010c010b2000200128020020036a2d00003a0001410021010b200020013a000020" - "0241106a2480808080000f0b000b8c0101037f23808080800041106b2202248080" - "808000200241086a20002802002000280204200028020810c78080800041002d00" - "e0dbc080001a200228020c2103200228020821040240411410998080800022000d" - "00000b2000200436020c2000200129020037020020002003360210200041086a20" - "0141086a280200360200200241106a24808080800020000b1f0002402001280204" - "0e020000000b200041b8b6c08000200110b2808080000b820101017f0240024002" - "4002402003280204450d000240200328020822040d002002450d0341002d00e0db" - "c080001a0c020b20032802002004200210a78080800021030c030b2002450d0141" - "002d00e0dbc080001a0b200210998080800021030c010b200121030b2000200236" - "020820002003200120031b36020420002003453602000b9f0202047f017e238080" - "80800041206b2206248080808000024002400240200220036a220320024f0d0041" - "0021020c010b41002102200420056a417f6a410020046b71ad4108410420054101" - "461b22072001280200220841017422092003200920034b1b2203200720034b1b22" - "07ad7e220a422088a70d00200aa7220941808080807820046b4b0d010240024020" - "080d00410021020c010b2006200820056c36021c20062001280204360214200421" - "020b20062002360218200641086a20042009200641146a10d18080800002402006" - "2802080d00200628020c2102200120073602002001200236020441818080807821" - "020c010b20062802102103200628020c21020c010b0b2000200336020420002002" - "360200200641206a2480808080000b5901017f23808080800041106b2201248080" - "808000200141086a2000200028020041014108411810d280808000024020012802" - "082200418180808078460d002000200128020c109a80808000000b200141106a24" - "80808080000b4701017f23808080800041206b2200248080808000200041003602" - "182000410136020c200041d8bac0800036020820004204370210200041086a41e0" - "bac0800010a480808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d00e0dbc080001a02400240024041201099808080002201450d" - "0020014102360210200142818080801037030041002903a0dcc080002102034020" - "02427f510d024100200242017c220341002903a0dcc08000220420042002512205" - "1b3703a0dcc08000200421022005450d000b410020033703f8dfc0800020012003" - "3703084100280280e0c08000450d02200041003602182000410136020c200041e0" - "b6c0800036020820004204370210200041086a41b8b7c0800010a4808080000b00" - "0b10d480808000000b41002001360280e0c08000200041206a2480808080000b5b" - "01027f024020002802104101470d002000280214220141003a0000200028021822" - "02450d00200120021082808080000b02402000417f460d00200020002802042201" - "417f6a36020420014101470d00200041201082808080000b0b3a01017f23808080" - "800041106b2202248080808000200241c8b7c0800036020c200220003602082002" - "41086a2002410c6a200110ae80808000000b3000024020002802002d00000d0020" - "01418589c0800041051093808080000f0b2001418a89c080004104109380808000" - "0b14002001200028020420002802081093808080000b7001037f20002802042101" - "0240024020002d0000220041044b0d0020004103470d010b200128020021000240" - "200141046a28020022022802002203450d00200020031182808080008080808000" - "0b024020022802042202450d00200020021082808080000b2001410c1082808080" - "000b0bf10101027f23808080800041206b22002480808080000240024002400240" - "41002d0090dcc080000e0400000301000b410041023a0090dcc0800041002d00e0" - "dbc080001a4180081099808080002201450d01410041033a0090dcc08000410020" - "01360280dcc08000410042808080808080013703f8dbc08000410042003703e8db" - "c08000410041003a0088dcc0800041004100360284dcc08000410041003a00f4db" - "c08000410041003602f0dbc080000b200041206a2480808080000f0b000b200041" - "003602182000410136020c200041d8c5c080003602082000420437021020004108" - "6a41a8c4c0800010a480808000000bb708010a7f23808080800041206b22042480" - "808080000240024002400240024020012802100d002001417f3602102003410020" - "03200241036a417c7120026b22056b41077120032005491b22066b210720032006" - "490d0102402006450d0002400240200220036a2208417f6a22092d0000410a470d" - "002006417f6a21060c010b200220076a220a2009460d0102402008417e6a22092d" - "0000410a470d002006417e6a21060c010b200a2009460d0102402008417d6a2209" - "2d0000410a470d002006417d6a21060c010b200a2009460d0102402008417c6a22" - "092d0000410a470d002006417c6a21060c010b200a2009460d0102402008417b6a" - "22092d0000410a470d002006417b6a21060c010b200a2009460d0102402008417a" - "6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240200841" - "796a22092d0000410a470d00200641796a21060c010b200a2009460d0120064178" - "7221060b200620076a41016a21060c040b20052003200320054b1b210b41002006" - "6b21082002417c6a210c2006417f7320026a210a02400340200a21052008210620" - "072209200b4d0d01200641786a2108200541786a210a4180828408200220094178" - "6a22076a280200220d418a94a8d000736b200d724180828408200c20096a280200" - "220d418a94a8d000736b200d727141808182847871418081828478460d000b0b20" - "0920034b0d0202400340200320066a450d012006417f6a2106200520036a210920" - "05417f6a210520092d0000410a470d000b200320066a41016a21060c040b024002" - "402001411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b0240" - "200128021420066b20034b0d002000200141146a2002200310dd808080000c050b" - "200128021820066a2002200310fa808080001a200041043a00002001411c6a2006" - "20036a3602000c040b10b580808000000b2007200341c889c08000108580808000" - "000b2009200341d889c0800010ad80808000000b0240200320064f0d0020044100" - "3602182004410136020c200441a8bbc0800036020820044204370210200441086a" - "41b0bbc0800010a480808000000b02402001411c6a2802002205450d0002400240" - "200128021420056b20064d0d00200141186a28020020056a2002200610fa808080" - "001a2001411c6a200520066a22053602000c010b200441086a200141146a200220" - "0610dd80808000024020042d00084104460d00200020042903083702000c030b20" - "01411c6a28020021050b2005450d00200141003a00202001411c6a41003602000b" - "200220066a210502402001280214200320066b22064b0d002000200141146a2005" - "200610dd808080000c010b200141186a2802002005200610fa808080001a200041" - "043a00002001411c6a20063602000b2001200128021041016a360210200441206a" - "2480808080000b7101027f20012802002104024020012802082205450d00200420" - "056b20034f0d004100210520014100360208200141003a000c0b0240200420034d" - "0d00200128020420056a2002200310fa808080001a200041043a00002001200520" - "036a3602080f0b20004204370200200141003a000c0bc90103027f017e027f2380" - "8080800041106b2203248080808000200341086a20002802082802002001200210" - "dc80808000024020032d000822024104460d002000280204210420032903082105" - "0240024020002d0000220141044b0d0020014103470d010b200428020021010240" - "200441046a28020022062802002207450d00200120071182808080008080808000" - "0b024020062802042206450d00200120061082808080000b2004410c1082808080" - "000b200020053702000b200341106a24808080800020024104470b9c0303027f01" - "7e037f23808080800041106b220224808080800020024100360204024002400240" - "02402001418001490d002001418010490d012001418080044f0d0220022001413f" - "71418001723a000620022001410c7641e001723a000420022001410676413f7141" - "8001723a0005410321010c030b200220013a0004410121010c020b20022001413f" - "71418001723a00052002200141067641c001723a0004410221010c010b20022001" - "413f71418001723a00072002200141127641f001723a000420022001410676413f" - "71418001723a000620022001410c76413f71418001723a0005410421010b200241" - "086a2000280208280200200241046a200110dc80808000024020022d0008220141" - "04460d0020002802042103200229030821040240024020002d0000220541044b0d" - "0020054103470d010b200328020021050240200341046a28020022062802002207" - "450d002005200711828080800080808080000b024020062802042206450d002005" - "20061082808080000b2003410c1082808080000b200020043702000b200241106a" - "24808080800020014104470b1200200041dcb7c08000200110b2808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b0d00" - "2001410620014108766722026b7641017120024101746b413e6a21020b20004200" - "3702102000200236021c200241027441a8dcc080006a2103024041002802c4dfc0" - "800041012002742204710d0020032000360200200020033602182000200036020c" - "20002000360208410041002802c4dfc080002004723602c4dfc080000f0b024002" - "400240200328020022042802044178712001470d00200421020c010b2001410041" - "1920024101766b2002411f461b742103034020042003411d764104716a41106a22" - "052802002202450d02200341017421032002210420022802044178712001470d00" - "0b0b20022802082203200036020c20022000360208200041003602182000200236" - "020c200020033602080f0b20052000360200200020043602182000200036020c20" - "0020003602080b0b00200010e580808000000bb50101037f23808080800041106b" - "2201248080808000200028020c2102024002400240024020002802040e02000102" - "0b20020d0141012102410021030c020b20020d0020002802002202280204210320" - "0228020021020c010b20014180808080783602002001200036020c2001418f8080" - "8000200028021c22002d001c20002d001d10e680808000000b2001200336020420" - "0120023602002001419080808000200028021c22002d001c20002d001d10e68080" - "8000000b990101027f23808080800041106b22042480808080004100410028029c" - "dcc08000220541016a36029cdcc08000024020054100480d000240024041002d00" - "f0dfc080000d00410041002802ecdfc0800041016a3602ecdfc080004100280298" - "dcc08000417f4a0d010c020b200441086a20002001118380808000808080800000" - "0b410041003a00f0dfc080002002450d0010e180808000000b000b0c0020002001" - "2902003703000bf726020c7f017e2380808080004190036b220224808080800020" - "0128020c2103024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f8006a200320052005200441016a220420" - "052004491b10c78080800041002d00e0dbc080001a200228027c21082002280278" - "2101411410998080800022040d010c190b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602b002200242808080" - "8080013702a80241082109200420054f0d02200241b8016a41086a210a200241b8" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241c0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802442104200228024021084114" - "1099808080002206450d1d2006200836020c20064105360200200620043602100c" - "080b200241d0006a200320052005200420052004491b10c78080800041002d00e0" - "dbc080001a200228025421042002280250210841141099808080002206450d1c20" - "06200836020c20064107360200200620043602100c070b20022902ac02210e2002" - "2802a802210641042107410021090c070b200741dd00470d00200241c8006a2003" - "20052005200441016a220420052004491b10c78080800041002d00e0dbc080001a" - "200228024c21042002280248210841141099808080002206450d1a200620083602" - "0c20064115360200200620043602100c050b200241b8016a200110e88080800002" - "4020022d00b80122084106470d0020022802bc0121060c050b200241ec016a4102" - "6a2205200b41026a2d00003a0000200241d8016a41086a2203200a41086a290300" - "3703002002200b2f00003b01ec012002200a2903003703d80120022802bc012107" - "0240200c20022802a802470d00200241a8026a10d3808080000b20022802ac0222" - "09200c41186c6a220420022903d801370308200420083a0000200420022f01ec01" - "3b000120042007360204200441106a2003290300370300200441036a20052d0000" - "3a00002002200c41016a220c3602b0024100210d20012802142204200128021022" - "054f0d020c000b0b2004200136020c200441053602002000200436020420004106" - "3a0000200420083602100c160b200628020021030b200241386a20032005200520" - "0441016a220420052004491b10c78080800041002d00e0dbc080001a200228023c" - "21042002280238210841141099808080002206450d152006200836020c20064102" - "360200200620043602100b200241a8026a108c80808000024020022802a8022204" - "450d002009200441186c1082808080000b200128020c2103200128021421042001" - "280210210541062107410121090b200120012d001841016a3a0018024002402004" - "20054f0d0003400240024002400240024002400240200320046a2d00002208410c" - "4a0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c" - "060b20084120460d052008412c460d01200841dd00460d020b200241186a200320" - "052005200441016a220420052004491b10c78080800041002d00e0dbc080001a20" - "0228021c21082002280218210541141099808080002204450d1b20044116360200" - "0c070b2001200441016a2204360214200420054f0d020340200320046a2d000022" - "0c41776a220841174b0d024101200874419380800471450d022001200441016a22" - "0436021420052004470d000b200521040c020b2001200441016a3602142002200e" - "3703c001200220063602bc01200220073a00b80102402009450d00410621072002" - "41063a00800120022006360284010c160b20024180016a41106a200241b8016a41" - "106a29030037030020024180016a41086a200241b8016a41086a29030037030020" - "0220022903b801220e37038001200ea721070c150b200c41dd00470d0020024130" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228023421082002280230210541141099808080002204450d18200441" - "153602000c040b200241286a200320052005200441016a220420052004491b10c7" - "8080800041002d00e0dbc080001a200228022c2108200228022821054114109980" - "8080002204450d17200441163602000c030b2001200441016a2204360214200520" - "04470d000b200521040b200241206a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802242108200228022021054114" - "1099808080002204450d14200441023602000b2004200536020c20042008360210" - "200220043602d0012002200e3703c001200220063602bc01200220073a00b80102" - "4020090d0041062107200241063a0080012002200436028401200241b8016a108a" - "808080000c100b41062107200241063a0080012002200636028401200410e98080" - "80000c0f0b200241106a200320052005200420052004491b10c78080800041002d" - "00e0dbc080001a200228021421082002280210210141141099808080002204450d" - "122004200136020c2004411836020020002004360204200041063a000020042008" - "3602100c110b200141003602082001200441016a360214200241b8016a20062001" - "10c88080800020022802bc0121080240024020022802b80122054102460d002002" - "2802c0012104024020050d0020024180016a2008200410ea8080800020022d0080" - "014106460d112000200229038001370300200041106a20024180016a41106a2903" - "00370300200041086a20024180016a41086a2903003703000c130b410021010240" - "20044100480d00024020040d0041012101410021050c030b41002d00e0dbc08000" - "1a20042105200410998080800022010d02410121010b20012004109a8080800000" - "0b200041063a0000200020083602040c110b20024180016a41086a220320012008" - "200410fa808080003602002002200536028401200241033a008001200220043602" - "8c01200041106a20024180016a41106a290300370300200041086a200329030037" - "030020002002290380013703000c100b2001200441016a36021420024198016a20" - "01410010eb8080800002402002290398014203510d0020024180016a2002419801" - "6a10c580808000024020022d0080014106460d0020002002290380013703002000" - "41106a20024180016a41106a290300370300200041086a20024180016a41086a29" - "03003703000c110b20022802840120011080808080002104200041063a00002000" - "20043602040c100b200020022802a001360204200041063a00000c0f0b02402007" - "41f3004a0d00200741e600460d04200741ee00470d012001200441016a36021420" - "0141d0dbc08000410310ec808080002204450d02200041063a0000200020043602" - "040c0f0b200741f400460d02200741fb00460d040b200741506a41ff0171410a49" - "0d04200241086a200320052005200441016a220420052004491b10c78080800041" - "002d00e0dbc080001a200228020c21082002280208210541141099808080002204" - "450d0e2004200536020c2004410a3602002004200836021020022004360284010c" - "0b0b200241003a0080012000200229038001370300200041086a20024180016a41" - "086a290300370300200041106a20024180016a41106a2903003703000c0c0b2001" - "200441016a3602140240200141d3dbc08000410310ec808080002204450d002000" - "41063a0000200020043602040c0c0b20024181023b018001200020022903800137" - "0300200041086a20024180016a41086a290300370300200041106a20024180016a" - "41106a2903003703000c0b0b2001200441016a3602140240200141d6dbc0800041" - "0410ec808080002204450d00200041063a0000200020043602040c0b0b20024101" - "3b0180012000200229038001370300200041086a20024180016a41086a29030037" - "0300200041106a20024180016a41106a2903003703000c0a0b200120012d001841" - "7f6a22083a0018200441016a2104200841ff0171450d0520012004360214200220" - "013602f001200241013a00f401200241f8016a200241f0016a10ed808080004100" - "210d410021064100210c024002400240024020022802f80122044180808080786a" - "0e020200010b20022802fc0121060c060b20022902fc01210e2002410036028c02" - "20024100360284022002200e3702ac02200220043602a80220024190026a200241" - "f0016a10ee8080800020022d0090024106460d03200241b8016a20024184026a20" - "0241a8026a20024190026a10c680808000024020022d00b8014106460d00200241" - "b8016a108a808080000b200241a8026a41046a2104200241b8016a41046a210802" - "400340200241ec026a200241f0016a10ed80808000024020022802ec0222054180" - "808080786a0e020204000b20022902f002210e20022802f0022103200241f8026a" - "200241f0016a10ee80808000024020022d00f8024106470d0020022802fc022106" - "2005450d07200320051082808080000c070b200820022903f80237020020084110" - "6a200241f8026a41106a290300370200200841086a200241f8026a41086a290300" - "370200200241a8026a41086a200241b8016a41086a290200370300200241a8026a" - "41106a200241b8016a41106a290200370300200241a8026a41186a200241b8016a" - "41186a280200360200200220022902b8013703a802200220053602c4022002200e" - "3e02c8022002200e4220883e02cc02200241d0026a41106a200441106a29020037" - "0300200241d0026a41086a200441086a290200370300200220042902003703d002" - "200241b8016a20024184026a200241c4026a200241d0026a10c68080800020022d" - "00b8014106460d00200241b8016a108a808080000c000b0b200228028402210620" - "02280288022109200228028c02210c0b410521070c050b20022802f00221060c02" - "0b200241a8016a2001410110eb80808000024020022903a8014203510d00200241" - "80016a200241a8016a10c580808000024020022d0080014106460d002000200229" - "038001370300200041106a20024180016a41106a290300370300200041086a2002" - "4180016a41086a2903003703000c0a0b2002280284012001108080808000210420" - "0041063a0000200020043602040c090b200020022802b001360204200041063a00" - "000c080b20022802940221062004450d00200ea720041082808080000b20024184" - "026a108b808080000b410621074101210d0b200120012d001841016a3a00182001" - "28020c21030240024020012802142204200128021022054f0d0003400240024002" - "4002400240200320046a2d00002208410c4a0d00200841776a4102490d040c010b" - "02402008411f4a0d002008410d470d010c040b20084120460d032008412c460d01" - "200841fd00460d020b200241e0006a200320052005200441016a22042005200449" - "1b10c78080800041002d00e0dbc080001a20022802642108200228026021054114" - "1099808080002204450d0b200441163602000c050b200241f0006a200320052005" - "200441016a220420052004491b10c78080800041002d00e0dbc080001a20022802" - "7421082002280270210541141099808080002204450d0a200441153602000c040b" - "2001200441016a3602140240200d450d0041062107200241063a00800120022006" - "360284010c060b200220073a008001200220022f00a8023b0081012002200c3602" - "8c01200220093602880120022006360284012002200241aa026a2d00003a008301" - "0c050b2001200441016a220436021420052004470d000b200521040b200241e800" - "6a200320052005200441016a220420052004491b10c78080800041002d00e0dbc0" - "80001a200228026c21082002280268210541141099808080002204450d06200441" - "033602000b2004200536020c20042008360210200220073a00b801200220022f00" - "a8023b00b901200220043602d0012002200c3602c401200220093602c001200220" - "063602bc012002200241aa026a2d00003a00bb010240200d0d0041062107200241" - "063a0080012002200436028401200241b8016a108a808080000c020b4106210720" - "0241063a0080012002200636028401200410e9808080000c010b200241d8006a20" - "0320052005200420052004491b10c78080800041002d00e0dbc080001a20022802" - "5c21082002280258210141141099808080002204450d042004200136020c200441" - "1836020020002004360204200041063a0000200420083602100c030b200741ff01" - "714106470d010b20022802840120011080808080002104200041063a0000200020" - "043602040c010b2000200229038001370300200041106a20024180016a41106a29" - "0300370300200041086a20024180016a41086a2903003703000b20024190036a24" - "80808080000f0b000b920101047f02400240024020002802000e020001020b2000" - "2802082201450d01200028020420011082808080000c010b20002d00044103470d" - "002000280208220128020021020240200128020422032802002204450d00200220" - "0411828080800080808080000b024020032802042203450d002002200310828080" - "80000b2001410c1082808080000b200041141082808080000b7901027f41002103" - "0240024020024100480d00024020020d0041002103410121040c020b41002d00e0" - "dbc080001a20022103200210998080800022040d01410121030b20032002109a80" - "808000000b20042001200210fa8080800021012000200236020c20002001360208" - "20002003360204200041033a00000b950502067f017e23808080800041306b2203" - "248080808000200128020c21040240024002400240024002402001280214220520" - "0128021022064f0d002001200541016a2207360214200420056a2d000022084130" - "470d020240200720064f0d00200420076a2d000041506a41ff0171410a490d020b" - "200020012002420010ef808080000c050b200341186a20042006200510c7808080" - "0041002d00e0dbc080001a200328021c2107200328021821044114109980808000" - "2201450d022001200436020c200141053602002000200136020820004203370300" - "200120073602100c040b200341086a200420062006200541026a22012006200149" - "1b10c78080800041002d00e0dbc080001a200328020c2107200328020821044114" - "1099808080002201450d012001200436020c2001410d3602002000200136020820" - "004203370300200120073602100c030b02402008414f6a41ff01714109490d0020" - "0341106a20042006200710c78080800041002d00e0dbc080001a20032802142107" - "2003280210210441141099808080002201450d012001200436020c2001410d3602" - "002000200136020820004203370300200120073602100c030b200841506aad42ff" - "01832109200720064f0d010340200420076a2d000041506a220541ff0171220841" - "0a4f0d020240024020094299b3e6cc99b3e6cc19540d0020094299b3e6cc99b3e6" - "cc19520d01200841054b0d010b2001200741016a22073602142009420a7e2005ad" - "42ff01837c210920062007470d010c030b0b200341206a20012002200910f08080" - "80000240024020032802200d00200020032b0328390308420021090c010b200020" - "03280224360208420321090b200020093703000c020b000b200020012002200910" - "ef808080000b200341306a2480808080000ba20201087f23808080800041106b22" - "032480808080002000280214220420002802102205200420054b1b210620002802" - "0c210702400240024002400340024020020d00410021040c050b20062004460d01" - "2000200441016a22083602142002417f6a2102200720046a210920012d0000210a" - "20082104200141016a2101200a20092d0000460d000b200341086a200720052008" - "10c78080800041002d00e0dbc080001a200328020c210120032802082102411410" - "99808080002204450d01200441093602000c020b200320072005200610c7808080" - "0041002d00e0dbc080001a20032802042101200328020021024114109980808000" - "2204450d00200441053602000c010b000b2004200236020c200420013602100b20" - "0341106a24808080800020040bae0201047f23808080800041106b220224808080" - "8000200241046a200110f680808000024002400240024020022d00040d00024020" - "022d00050d0020004180808080783602000c040b41002103200128020022014100" - "3602082001200128021441016a360214200241046a2001410c6a200110c8808080" - "002002280208210420022802044102460d010240200228020c22014100480d0002" - "4020010d0041012103410021050c040b41002d00e0dbc080001a20012105200110" - "998080800022030d03410121030b20032001109a80808000000b20002002280208" - "36020420004181808080783602000c020b20004181808080783602002000200436" - "02040c010b20032004200110fa8080800021042000200136020820002004360204" - "200020053602000b200241106a2480808080000bdc0201067f2380808080004110" - "6b22022480808080002001280200220328020c2104024002400240024002402003" - "2802142201200341106a28020022054f0d000340200420016a2d0000220641776a" - "220741174b0d024101200774419380800471450d022003200141016a2201360214" - "20052001470d000b200521010b200241086a200420052005200141016a22012005" - "2001491b10c78080800041002d00e0dbc080001a200228020c2107200228020821" - "0541141099808080002201450d03200141033602000c010b02402006413a470d00" - "2003200141016a3602142000200310e8808080000c020b20022004200520052001" - "41016a220120052001491b10c78080800041002d00e0dbc080001a200228020421" - "072002280200210541141099808080002201450d02200141063602000b20012005" - "36020c20002001360204200041063a0000200120073602100b200241106a248080" - "8080000f0b000b970202027f027e23808080800041106b22042480808080000240" - "02400240024002400240024002402001280214220520012802104f0d0020012802" - "0c20056a2d00002205412e460d01200541c500460d02200541e500460d020b2002" - "450d02420121060c050b2004200120022003410010f18080800020042802000d02" - "0c030b2004200120022003410010f2808080002004280200450d02200020042802" - "04360208200042033703000c040b420021060240420020037d22074200590d0042" - "022106200721030c030b2003babd428080808080808080807f8421030c020b2000" - "2004280204360208200042033703000c020b20042903082103420021060b200020" - "03370308200020063703000b200441106a2480808080000bbd0101057f41002104" - "0240024020012802102205200128021422064d0d00200641016a2107200520066b" - "2108200128020c20066a21054100210403400240200520046a2d0000220641506a" - "41ff0171410a490d002006412e460d030240200641c500460d00200641e500470d" - "030b2000200120022003200410f2808080000f0b2001200720046a360214200820" - "0441016a2204470d000b200821040b2000200120022003200410f3808080000f0b" - "2000200120022003200410f1808080000bfa0301097f23808080800041106b2205" - "24808080800020012001280214220641016a220736021402400240024020072001" - "28021022084f0d00200720086b2109200128020c210a4100210602400240034002" - "40200a20076a2d0000220b41506a220c41ff0171220d410a490d00024020060d00" - "2005200a20082008200741016a220720082007491b10c78080800041002d00e0db" - "c080001a200528020421062005280200210c41141099808080002207450d072007" - "200c36020c2007410d360200200020073602042000410136020020072006360210" - "0c060b200620046a2107200b41207241e500470d032000200120022003200710f2" - "808080000c050b024020034298b3e6cc99b3e6cc19580d0020034299b3e6cc99b3" - "e6cc19520d02200d41054b0d020b2001200741016a22073602142006417f6a2106" - "2003420a7e200cad42ff01837c210320072008470d000b200920046a21070c010b" - "2000200120022003200620046a10f4808080000c020b2000200120022003200710" - "f3808080000c010b200541086a200128020c20082008200641026a220720082007" - "491b10c78080800041002d00e0dbc080001a200528020c21062005280208210c41" - "141099808080002207450d012007200c36020c2007410536020020002007360204" - "20004101360200200720063602100b200541106a2480808080000f0b000bb80401" - "077f23808080800041106b22052480808080004101210620012001280214220741" - "016a220836021402402008200128021022094f0d00410121060240024020012802" - "0c20086a2d000041556a0e03010200020b410021060b2001200741026a22083602" - "140b200128020c210a0240024002400240024002400240200820094f0d00200120" - "0841016a2207360214200a20086a2d000041506a41ff01712208410a4f0d010240" - "200720094f0d000340200a20076a2d000041506a41ff0171220b410a4f0d012001" - "200741016a22073602140240200841cb99b3e6004c0d00200841cc99b3e600470d" - "07200b41074b0d070b2008410a6c200b6a210820092007470d000b0b20060d0220" - "0420086b2207411f75418080808078732007200841004a2007200448731b21070c" - "030b200541086a200a2009200810c78080800041002d00e0dbc080001a20052802" - "0c21012005280208210841141099808080002207450d042007200836020c200741" - "053602002000200736020420004101360200200720013602100c050b2005200a20" - "09200710c78080800041002d00e0dbc080001a2005280204210120052802002108" - "41141099808080002207450d032007200836020c2007410d360200200020073602" - "0420004101360200200720013602100c040b200420086a2207411f754180808080" - "7873200720084100482007200448731b21070b2000200120022003200710f38080" - "80000c020b200020012002200350200610f5808080000c010b000b200541106a24" - "80808080000b9f0304017f017c017f017c23808080800041106b22052480808080" - "002003ba2106024002400240024002400240024020042004411f7522077320076b" - "220741b502490d0003402006440000000000000000610d062004417f4a0d022006" - "44a0c8eb85f3cce17fa32106200441b4026a22042004411f7522077320076b2207" - "41b4024b0d000b0b200741037441a8c8c080006a2b030021082004417f4a0d0120" - "062008a321060c040b2005200128020c2001280210200128021410c78080800041" - "002d00e0dbc080001a200528020421072005280200210141141099808080002204" - "450d022004200136020c2004410e36020020002004360204200420073602100c01" - "0b20062008a222069944000000000000f07f620d02200541086a200128020c2001" - "280210200128021410c78080800041002d00e0dbc080001a200528020c21072005" - "280208210141141099808080002204450d012004200136020c2004410e36020020" - "002004360204200420073602100b410121040c020b000b2000200620069a20021b" - "390308410021040b20002004360200200541106a2480808080000b7f01047f0240" - "024020012802142205200128021022064f0d00200128020c210702400340200720" - "056a2d0000220841506a41ff017141094b0d012001200541016a22053602142006" - "2005470d000c020b0b200841207241e500460d010b2000200120022003200410f3" - "808080000f0b2000200120022003200410f2808080000b840201027f2380808080" - "0041106b220524808080800002400240024002402004450d002003450d010b2001" - "2802142204200128021022034f0d01200128020c21060340200620046a2d000041" - "506a41ff0171410a4f0d022001200441016a220436021420032004470d000c020b" - "0b200541086a200128020c2001280210200128021410c78080800041002d00e0db" - "c080001a200528020c210120052802082103024041141099808080002204450d00" - "2004200336020c2004410e3602002000200436020420042001360210410121040c" - "020b000b200044000000000000000044000000000000008020021b390308410021" - "040b20002004360200200541106a2480808080000bb40701077f23808080800041" - "306b22022480808080002001280200220328020c21040240024002400240200328" - "02142205200341106a28020022064f0d000340200420056a2d0000220741776a22" - "0841174b0d024101200874419380800471450d022003200541016a220536021420" - "062005470d000b200621050b41012108200241286a200420062006200541016a22" - "0520062005491b10c78080800041002d00e0dbc080001a200228022c2106200228" - "0228210341141099808080002205450d022005200336020c200541033602002000" - "2005360204200520063602100c010b0240200741fd00470d004100210820004100" - "3a00010c010b02400240024020012d00040d00200541016a21052007412c470d01" - "200320053602140240200520064f0d00034002400240024002400240200420056a" - "2d00002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e0304" - "0102000b2008410d460d03200841fd00460d020b41012108200241086a20042006" - "2006200541016a220520062005491b10c78080800041002d00e0dbc080001a2002" - "28020c21062002280208210341141099808080002205450d092005200336020c20" - "05411136020020002005360204200520063602100c080b200041013a0001410021" - "080c070b41012108200241186a200420062006200541016a220520062005491b10" - "c78080800041002d00e0dbc080001a200228021c21062002280218210341141099" - "808080002205450d072005200336020c2005411536020020002005360204200520" - "063602100c060b2003200541016a220536021420062005470d000b200621050b41" - "012108200241106a200420062006200541016a220520062005491b10c780808000" - "41002d00e0dbc080001a2002280214210620022802102103411410998080800022" - "05450d042005200336020c2005410536020020002005360204200520063602100c" - "030b41002108200141003a0004024020074122460d002002200420062006200541" - "016a220520062005491b10c78080800041002d00e0dbc080001a20022802042108" - "2002280200210641141099808080002205450d042005200636020c200541113602" - "0020002005360204200520083602100c020b200041013a00010c020b200241206a" - "200420062006200520062005491b10c78080800041002d00e0dbc080001a200228" - "022421082002280220210641141099808080002205450d022005200636020c2005" - "410836020020002005360204200520083602100b410121080b200020083a000020" - "0241306a2480808080000f0b000b4a01037f4100210302402002450d0002400340" - "20002d0000220420012d00002205470d01200041016a2100200141016a21012002" - "417f6a2202450d020c000b0b200420056b21030b20030bac0501087f0240024002" - "400240200020016b20024f0d00200120026a2103200020026a2104024020024110" - "4f0d00200021050c030b2004417c7121054100200441037122066b210702402006" - "450d00200120026a417f6a210803402004417f6a220420082d00003a0000200841" - "7f6a210820052004490d000b0b2005200220066b2209417c7122066b2104024020" - "0320076a2207410371450d0020064101480d022007410374220841187121022007" - "417c71220a417c6a2101410020086b4118712103200a280200210803402005417c" - "6a2205200820037420012802002208200276723602002001417c6a210120042005" - "490d000c030b0b20064101480d01200920016a417c6a210103402005417c6a2205" - "20012802003602002001417c6a210120042005490d000c020b0b02400240200241" - "104f0d00200021040c010b2000410020006b41037122036a210502402003450d00" - "20002104200121080340200420082d00003a0000200841016a2108200441016a22" - "042005490d000b0b2005200220036b2209417c7122076a21040240024020012003" - "6a2206410371450d0020074101480d012006410374220841187121022006417c71" - "220a41046a2101410020086b4118712103200a2802002108034020052008200276" - "2001280200220820037472360200200141046a2101200541046a22052004490d00" - "0c020b0b20074101480d0020062101034020052001280200360200200141046a21" - "01200541046a22052004490d000b0b20094103712102200620076a21010b200245" - "0d02200420026a21050340200420012d00003a0000200141016a2101200441016a" - "22042005490d000c030b0b20094103712201450d012007410020066b6a21032004" - "20016b21050b2003417f6a210103402004417f6a220420012d00003a0000200141" - "7f6a210120052004490d000b0b20000b0e0020002001200210f8808080000bc102" - "01087f02400240200241104f0d00200021030c010b2000410020006b4103712204" - "6a210502402004450d0020002103200121060340200320062d00003a0000200641" - "016a2106200341016a22032005490d000b0b2005200220046b2207417c7122086a" - "210302400240200120046a2209410371450d0020084101480d0120094103742206" - "41187121022009417c71220a41046a2101410020066b4118712104200a28020021" - "060340200520062002762001280200220620047472360200200141046a21012005" - "41046a22052003490d000c020b0b20084101480d00200921010340200520012802" - "00360200200141046a2101200541046a22052003490d000b0b2007410371210220" - "0920086a21010b02402002450d00200320026a21050340200320012d00003a0000" - "200141016a2101200341016a22032005490d000b0b20000b0be45b0100418080c0" - "000bda5b110000000c000000040000001200000013000000140000000000000000" - "00000001000000150000000000000001000000010000001600000063616c6c6564" - "2060526573756c743a3a756e77726170282960206f6e20616e2060457272602076" - "616c75650017000000040000000400000018000000456d707479496e76616c6964" - "4469676974506f734f766572666c6f774e65674f766572666c6f775a65726f5061" - "727365496e744572726f726b696e647372632f6c69622e72730000b00010000a00" - "0000200000004b000000b00010000a000000210000004b0000004163636f756e74" - "00b00010000a0000002200000033000000b00010000a0000002300000033000000" - "44617461b00010000a0000002500000030000000b00010000a0000002600000024" - "000000b00010000a00000027000000350000007465737420676f6f64203d202c20" - "636f756e746572203d200a000000380110000c000000440110000c000000500110" - "0001000000746573742064617461202c20706f696e746572203d202c20706f696e" - "7465725f7533325f6c656e203d202c206c656e203d2000006c0110000a00000076" - "0110000c0000008201100014000000960110000800000050011000010000000500" - "00000c0000000b0000000b00000004000000740010007900100085001000900010" - "009b0010006361706163697479206f766572666c6f77000000f001100011000000" - "616c6c6f632f7372632f7261775f7665632e72730c021000140000001800000005" - "0000002e2e30313233343536373839616263646566426f72726f774d7574457272" - "6f72616c726561647920626f72726f7765643a200000500210001200000063616c" - "6c656420604f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e65" - "602076616c7565696e646578206f7574206f6620626f756e64733a20746865206c" - "656e20697320206275742074686520696e64657820697320000000970210002000" - "0000b7021000120000003d3d617373657274696f6e20606c656674202072696768" - "7460206661696c65640a20206c6566743a200a2072696768743a200000de021000" - "10000000ee02100017000000050310000900000020726967687460206661696c65" - "643a200a20206c6566743a20000000de0210001000000028031000100000003803" - "100009000000050310000900000001000000000000000b21100002000000202020" - "20207b20207b0a2c0a7d207d636f72652f7372632f666d742f6e756d2e72730000" - "830310001300000066000000170000003078303030313032303330343035303630" - "373038303931303131313231333134313531363137313831393230323132323233" - "323432353236323732383239333033313332333333343335333633373338333934" - "303431343234333434343534363437343834393530353135323533353435353536" - "353735383539363036313632363336343635363636373638363937303731373237" - "333734373537363737373837393830383138323833383438353836383738383839" - "3930393139323933393439353936393739383939636f72652f7372632f666d742f" - "6d6f642e727366616c736574727565000072041000130000009b09000026000000" - "7204100013000000a40900001a000000636f72652f7372632f736c6963652f6d65" - "6d6368722e7273b004100018000000830000001e000000b0041000180000009f00" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820e804100012000000" - "fa0410002200000072616e676520656e6420696e646578202c05100010000000fa" - "04100022000000736c69636520696e646578207374617274732061742020627574" - "20656e647320617420004c05100016000000620510000d00000001010101010101" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010000000000000000000000" + "010101000000000000000000000000000000000000000000000000000000000000" "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000202020202020202020202" - "020202020202020202020202020202020202020303030303030303030303030303" - "0303040404040400000000000000000000005b2e2e2e5d626567696e203c3d2065" - "6e642028203c3d2029207768656e20736c6963696e67206060850610000e000000" - "93061000040000009706100010000000a7061000010000006279746520696e6465" - "7820206973206e6f742061206368617220626f756e646172793b20697420697320" - "696e7369646520202862797465732029206f66206000c80610000b000000d30610" - "0026000000f9061000080000000107100006000000a70610000100000020697320" - "6f7574206f6620626f756e6473206f6620600000c80610000b0000003007100016" - "000000a706100001000000636f72652f7372632f7374722f6d6f642e7273006007" - "100013000000f00000002c000000636f72652f7372632f756e69636f64652f7072" - "696e7461626c652e7273000000840710001d0000001a0000003600000084071000" - "1d0000000a0000002b000000000601010301040205070702080809020a050b020e" - "041001110212051311140115021702190d1c051d081f0124016a046b02af03b102" - "bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004f802fa03fb" - "010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3d0d1041418" - "363756577faaaeafbd35e01287898e9e040d0e11122931343a4546494a4e4f6465" - "5cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66698f92116f" - "5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabcc4060b0c15" - "1d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c604202325262833383a48" - "4a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf6e6fbe935e" - "227b0503042d036603012f2e80821d03310f1c0424091e052b0544040e2a80aa06" - "240424042808340b4e43813709160a08183b45390363080930160521031b050140" - "38044b052f040a070907402027040c0936033a051a07040c07504937330d33072e" - "080a8126524b2b082a161a261c1417094e042409440d19070a0648082709750b42" - "3e2a063b050a0651060105100305808b621e48080a80a65e22450b0a060d133a06" - "0a362c041780b93c64530c48090a46451b4808530d49070a80f6460a1d03474937" - "030e080a0639070a813619073b031c56010f320d839b66750b80c48a4c630d8430" - "10168faa8247a1b98239072a045c06260a460a28051382b05b654b043907114005" - "0b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d0309071092" - "604709743c80f60a73087015467a140c140c570919808781470385420f1584501f" - "060680d52b053e2101702d031a040281401f113a050181d02a82e680f7294c040a" - "04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae381d0d2c04" - "0907020e06809a83d80411030d0377045f060c04010f0c0438080a062808224e81" - "540c1d03090736080e040907090780cb250a840600010305050606020706080709" - "110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a071b011c02" - "1f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05fd02fe03ff" - "09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2848d8e9192" - "a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e92a9b1b4ba" - "bbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b9dc9cecf0d" - "11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d11454964658084" - "b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf494e4f57595e" - "5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f6e6f1c1d5f" - "7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1f572738f74" - "7596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a5b07080f10" - "272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f2282df0482" - "44081b04061181ac0e80ab051f09811b03190801042f043404070301070607110a" - "500f1207550703041c0a090308030703020303030c0405030b06010e15054e071b" - "0757070206170c500443032d03010411060f0c3a041d255f206d046a2580c80582" - "b0031a0682fd03590716091809140c140c6a060a061a0659072b05460a2c040c04" - "0103310b2c041a060b0380ac060a062f314d0380a4083c030f033c0738082b0582" - "ff1118082f112d03210f210f808c048297190b158894052f053b07020e180980be" - "22740c80d61a81100580df0bf29e033709815c1480b80880cb050a183b030a0638" - "0846080c06740b1e035a0459098083181c0a16094c04808a06aba40c170431a104" - "81da26070c050580a61081f50701202a064c04808d0480be031b030f0d636f7265" - "2f7372632f756e69636f64652f756e69636f64655f646174612e7273003f0d1000" - "2000000050000000280000003f0d1000200000005c000000160000000003000083" - "042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6fa6e02c02a8" - "602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e61392f18a1" - "39301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf615365d1a153" - "00da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a0070000700" - "2d0101010201020101480b30151001650702060202010423011e1b5b0b3a090901" - "18040109010301052b033c082a180120370101010408040103070a021d013a0101" - "010204080109010a021a010202390104020402020303011e0203010b0239010405" - "010204011402160601013a0101020104080107030a021e013b0101010c01090128" - "010301370101030503010407020b021d013a01020102010301050207020b021c02" - "390201010204080109010a021d0148010401020301010801510102070c08620102" - "090b0749021b0101010101370e01050102050b0124090166040106010202021902" - "040310040d01020206010f01000300031d021e021e02400201070801020b09012d" - "030101750222017603040209010603db0202013a010107010101010208060a0201" - "301f310430070101050128090c0220040202010338010102030101033a08020298" - "03010d0107040106010302c6400001c32100038d016020000669020004010a2002" - "50020001030104011902050197021a120d012608190b2e03300102040202270143" - "06020202020c0108012f01330101030202050201012a020801ee01020104010001" - "0010101000020001e201950500030102050428030401a502000400025003460b31" - "047b01360f290102020a033104020207013d03240501083e010c0234090a040201" - "5f0302010102060102019d010308150239020101010116010e070305c308020301" - "011701510102060101020101020102eb010204060201021b025508020101026a01" - "01010206010165030204010500090102f5010a0201010401900402020401200a28" - "0602040801090602032e0d010200070106010152160207010201027a0603010102" - "0107010148020301010100020b023405050101010001060f00053b0700013f0451" - "010002002e0217000101030405080802071e0494030037043208010e011605010f" - "000701110207010201056401a00700013d04000400076d07006080f0002f727573" - "74632f633266373463336639323861656235303366313562346539656635373738" - "653737663330353862382f6c6962726172792f616c6c6f632f7372632f636f6c6c" - "656374696f6e732f62747265652f6d61702f656e7472792e727300db1010006000" - "000071010000360000002f72757374632f63326637346333663932386165623530" - "3366313562346539656635373738653737663330353862382f6c6962726172792f" - "616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f6e6f64652e" - "7273617373657274696f6e206661696c65643a20656467652e686569676874203d" - "3d2073656c662e686569676874202d2031004c1110005b000000af020000090000" - "00617373657274696f6e206661696c65643a207372632e6c656e2829203d3d2064" - "73742e6c656e28294c1110005b0000002f070000050000004c1110005b000000af" - "040000230000004c1110005b000000ef04000024000000617373657274696f6e20" - "6661696c65643a20656467652e686569676874203d3d2073656c662e6e6f64652e" - "686569676874202d20310000004c1110005b000000f003000009000000c8151000" - "5f0000005802000030000000110000000c00000004000000120000001300000014" - "000000000000000000000001000000150000006120446973706c617920696d706c" - "656d656e746174696f6e2072657475726e656420616e206572726f7220756e6578" - "7065637465646c792f72757374632f633266373463336639323861656235303366" - "313562346539656635373738653737663330353862382f6c6962726172792f616c" - "6c6f632f7372632f737472696e672e72730000f71210004b000000060a00000e00" - "00004572726f72454f46207768696c652070617273696e672061206c697374454f" - "46207768696c652070617273696e6720616e206f626a656374454f46207768696c" - "652070617273696e67206120737472696e67454f46207768696c65207061727369" - "6e6720612076616c7565657870656374656420603a60657870656374656420602c" - "60206f7220605d60657870656374656420602c60206f7220607d60657870656374" - "6564206964656e7465787065637465642076616c75656578706563746564206022" - "60696e76616c696420657363617065696e76616c6964206e756d6265726e756d62" - "6572206f7574206f662072616e6765696e76616c696420756e69636f646520636f" - "646520706f696e74636f6e74726f6c2063686172616374657220285c7530303030" - "2d5c75303031462920666f756e64207768696c652070617273696e672061207374" - "72696e676b6579206d757374206265206120737472696e67696e76616c69642076" - "616c75653a206578706563746564206b657920746f2062652061206e756d626572" - "20696e2071756f746573666c6f6174206b6579206d7573742062652066696e6974" - "652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c656164696e67" - "20737572726f6761746520696e2068657820657363617065747261696c696e6720" - "636f6d6d61747261696c696e672063686172616374657273756e65787065637465" - "6420656e64206f662068657820657363617065726563757273696f6e206c696d69" - "742065786365656465644572726f72282c206c696e653a202c20636f6c756d6e3a" - "200000008d1510000600000093151000080000009b1510000a000000b820100001" - "0000002f72757374632f6332663734633366393238616562353033663135623465" - "39656635373738653737663330353862382f6c6962726172792f616c6c6f632f73" - "72632f636f6c6c656374696f6e732f62747265652f6e617669676174652e727300" - "c81510005f000000c600000027000000c81510005f000000160200002f000000c8" - "1510005f000000a1000000240000002f686f6d652f7077616e672f2e636172676f" - "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d366631" - "376432326262613135303031662f73657264655f6a736f6e2d312e302e3133352f" - "7372632f726561642e727300581610005f000000a001000045000000581610005f" - "000000a50100003d000000581610005f000000ad0100001a000000581610005f00" - "0000fa01000013000000581610005f000000030200003e000000581610005f0000" - "00ff01000033000000581610005f000000090200003a000000581610005f000000" - "6802000019000000ffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffff0000010002000300040005000600070008000900ffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffff0000100020003000400050" - "006000700080009000ffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000f000" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffff110000000c00000004000000120000001300000014000000" - "7265656e7472616e7420696e69740000501b10000e0000002f72757374632f6332" - "663734633366393238616562353033663135623465396566353737386537376633" - "30353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63652e" - "7273000000681b10004d0000002301000042000000000000000000000004000000" - "04000000190000001a0000000c000000040000001b0000001c0000001d0000002f" - "727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c6d61" - "6c6c6f632e7273617373657274696f6e206661696c65643a207073697a65203e3d" - "2073697a65202b206d696e5f6f7665726865616400f41b100029000000a8040000" - "09000000617373657274696f6e206661696c65643a207073697a65203c3d207369" - "7a65202b206d61785f6f766572686561640000f41b100029000000ae0400000d00" - "0000757365206f66207374643a3a7468726561643a3a63757272656e7428292069" - "73206e6f7420706f737369626c6520616674657220746865207468726561642773" - "206c6f63616c206461746120686173206265656e2064657374726f796564737464" - "2f7372632f7468726561642f6d6f642e727300fa1c100015000000f10200001300" - "00006661696c656420746f2067656e657261746520756e69717565207468726561" - "642049443a2062697473706163652065786861757374656400201d100037000000" - "fa1c100015000000c40400000d00000001000000000000007374642f7372632f69" - "6f2f62756666657265642f6c696e657772697465727368696d2e72736d6964203e" - "206c656e00009d1d100009000000781d1000250000000f01000029000000656e74" - "697479206e6f7420666f756e647065726d697373696f6e2064656e696564636f6e" - "6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574686f" - "737420756e726561636861626c656e6574776f726b20756e726561636861626c65" - "636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e65637465646164" - "647265737320696e2075736561646472657373206e6f7420617661696c61626c65" - "6e6574776f726b20646f776e62726f6b656e2070697065656e7469747920616c72" - "65616479206578697374736f7065726174696f6e20776f756c6420626c6f636b6e" - "6f742061206469726563746f727969732061206469726563746f72796469726563" - "746f7279206e6f7420656d707479726561642d6f6e6c792066696c657379737465" - "6d206f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e2073796d6c" - "696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e646c" - "65696e76616c696420696e70757420706172616d65746572696e76616c69642064" - "61746174696d6564206f75747772697465207a65726f6e6f2073746f7261676520" - "73706163657365656b206f6e20756e7365656b61626c652066696c6566696c6573" - "797374656d2071756f746120657863656564656466696c6520746f6f206c617267" - "657265736f75726365206275737965786563757461626c652066696c6520627573" - "79646561646c6f636b63726f73732d646576696365206c696e6b206f722072656e" - "616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e616d65" - "617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e2069" - "6e746572727570746564756e737570706f72746564756e65787065637465642065" - "6e64206f662066696c656f7574206f66206d656d6f72796f74686572206572726f" - "72756e63617465676f72697a6564206572726f7220286f73206572726f72202900" - "00000100000000000000ad2010000b000000b8201000010000007374642f737263" - "2f696f2f737464696f2e727300d4201000130000002c030000140000006661696c" - "6564207072696e74696e6720746f203a20000000f8201000130000000b21100002" - "000000d4201000130000005d040000090000007374646f75747374642f7372632f" - "696f2f6d6f642e72736120666f726d617474696e6720747261697420696d706c65" - "6d656e746174696f6e2072657475726e656420616e206572726f72207768656e20" - "74686520756e6465726c79696e672073747265616d20646964206e6f7400000047" - "211000560000003621100011000000280700001500000063616e6e6f7420726563" - "7572736976656c792061637175697265206d75746578b821100020000000737464" - "2f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e7273" - "e02110002400000014000000090000007374642f7372632f73796e632f6f6e6365" - "2e72731422100014000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465787374642f7372632f73" - "796e632f7265656e7472616e745f6c6f636b2e72735e2210001e00000022010000" - "2d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d6520" - "696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f726d" - "6564207265637572736976656c79a0221000380000001000000011000000120000" - "00100000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e00000013000000260000003800000019" - "000000170000000c000000090000000a0000001000000017000000190000000e00" - "00000d00000014000000080000001b0000000e0000001000000016000000150000" - "000b000000160000000d0000000b00000013000000c01d1000d01d1000e11d1000" - "f31d1000031e1000131e1000261e1000381e1000451e1000531e1000681e100074" - "1e10007f1e1000941e1000a91e1000b81e1000c61e1000d91e1000ff1e1000371f" - "1000501f1000671f1000731f10007c1f1000861f1000961f1000ad1f1000c61f10" - "00d41f1000e11f1000f51f1000fd1f10001820100026201000362010004c201000" - "612010006c201000822010008f2010009a201000000000000000f03f0000000000" - "00244000000000000059400000000000408f40000000000088c34000000000006a" - "f8400000000080842e4100000000d01263410000000084d797410000000065cdcd" - "41000000205fa00242000000e876483742000000a2941a6d42000040e59c30a242" - "0000901ec4bcd64200003426f56b0c430080e03779c3414300a0d8855734764300" - "c84e676dc1ab43003d9160e458e143408cb5781daf154450efe2d6e41a4b4492d5" - "4d06cff08044f64ae1c7022db544b49dd9794378ea449102282c2a8b2045350332" - "b7f4ad54450284fee471d9894581121f2fe727c04521d7e6fae031f445ea8ca039" - "593e294624b00888ef8d5f46176e05b5b5b893469cc94622e3a6c846037cd8ea9b" - "d0fe46824dc77261423347e32079cff91268471b695743b8179e47b1a1162ad3ce" - "d2471d4a9cf487820748a55cc3f129633d48e7191a37fa5d724861a0e0c478f5a6" - "4879c818f6d6b2dc484c7dcf59c6ef11499e5c43f0b76b4649c63354eca5067c49" - "5ca0b4b32784b14973c8a1a031e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0" - "fddd76d261854a307d951447baba4a3e6edd6c6cb4f04acec9148887e1244b41fc" - "196ae9195a4ba93d50e23150904b134de45a3e64c44b57609df14d7df94b6db804" - "6ea1dc2f4c44f3c2e4e4e9634c15b0f31d5ee4984c1b9c70a5751dcf4c91616687" - "6972034df5f93fe9034f384d72f88fe3c4626e4d47fb390ebbfda24d197ac8d129" - "bdd74d9f983a4674ac0d4e649fe4abc88b424e3dc7ddd6ba2e774e0c39958c69fa" - "ac4ea743ddf7811ce24e9194d475a2a3164fb5b949138b4c4c4f11140eecd6af81" - "4f169911a7cc1bb64f5bffd5d0bfa2eb4f99bf85e2b74521507f2f27db25975550" - "5ffbf051effc8a501b9d369315dec050624404f89a15f5507b5505b6015b2a516d" - "55c311e1786051c82a3456199794517a35c1abdfbcc9516cc158cb0b160052c7f1" - "2ebe8e1b345239aeba6d72226952c75929090f6b9f521dd8b965e9a2d352244e28" - "bfa38b0853ad61f2ae8cae3e530c7d57ed172d73534f5cade85df8a75363b3d862" - "75f6dd531e70c75d09ba1254254c39b58b6847542e9f87a2ae427d547dc39425ad" - "49b2545cf4f96e18dce6547371b88a1e931c55e846b316f3db5155a21860dcef52" - "8655ca1e78d3abe7bb553f132b64cb70f1550ed8353dfecc2556124e83cc3d405b" - "56cb10d29f26089156fe94c647304ac5563d3ab859bc9cfa56662413b8f5a13057" - "80ed172673ca6457e0e89def0ffd99578cb1c2f5293ed057ef5d3373b44d04586b" - "35009021613958c54200f469b96f58bb298038e2d3a3582a34a0c6dac8d8583541" - "487811fb0e59c1282debea5c4359f172f8a525347859ad8f760f2f41ae59cc19aa" - "69bde8e2593fa014c4eca2175a4fc819f5a78b4d5a321d30f94877825a7e247c37" - "1b15b75a9e2d5b0562daec5a82fc58437d08225ba33b2f949c8a565b8c0a3bb943" - "2d8c5b97e6c4534a9cc15b3d20b6e85c03f65b4da8e32234842b5c3049ce95a032" - "615c7cdb41bb487f955c5b5212ea1adfca5c79734bd270cb005d5750de064dfe34" - "5d6de49548e03d6a5dc4ae5d2dac66a05d751ab5385780d45d1261e2066da0095e" - "ab7c4d244404405ed6db602d5505745ecc12b978aa06a95e7f57e7165548df5eaf" - "96502e358d135f5bbce4798270485f72eb5d18a38c7e5f27b33aefe517b35ff15f" - "096bdfdde75fedb7cb4557d51d60f4529f8b56a55260b127872eac4e87609df128" - "3a5722bd60029759847635f260c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd" - "35c89161d65c8f2c433ac6610c34b3f7d3c8fb618700d07a845d3162a9008499e5" - "b46562d400e5ff1e229b628420ef5f53f5d062a5e8ea37a8320563cfa2e545527f" - "3a63c185af6b938f706332679b4678b3a463fe40425856e0d9639f6829f7352c10" - "64c6c2f3744337446478b330521445796456e0bc665996af64360c36e0f7bde364" - "438f43d875ad18651473544ed3d84e65ecc7f41084478365e8f931156519b86561" - "787e5abe1fee653d0b8ff8d6d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0" - "bbeedf62c266389d6aea97fbf666864405e57dba2c67d44a23af8ef46167891dec" - "5ab2719667eb24a7f11e0ecc6713770857d3880168d794ca2c08eb35680d3afd37" - "ca656b684844fe629e1fa1685ad5bdfb8567d568b14aad7a67c10a69af4eacace0" - "b840695a62d7d718e77469f13acd0ddf20aa69d644a0688b54e0690c56c842ae69" - "146a8f6b7ad31984496a7306594820e57f6a08a4372d34efb36a0a8d853801ebe8" - "6a4cf0a686c1251f6b305628f49877536bbb6b32317f55886baa067ffdde6abe6b" - "2a646f5ecb02f36b353d0b367ec3276c820c8ec35db45d6cd1c7389aba90926cc6" - "f9c640e934c76c37b8f8902302fd6c23739b3a5621326deb4f42c9aba9666de6e3" - "92bb16549c6d70ce3b358eb4d16d0cc28ac2b121066e8f722d331eaa3b6e9967fc" - "df524a716e7f81fb97e79ca56edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a" - "3a1b456f948306b508627a6f3d122471457db06fcc166dcd969ce46f7f5cc880bc" - "c31970cf397dd0551a507043889c44eb20847054aac3152629b970e994349b6f73" - "ef7011dd00c125a82371561441312f9258716b5991fdbab68e71e3d77ade3432c3" - "71dc8d1916c2fef77153f19f9b72fe2d72d4f643a107bf627289f49489c96e9772" - "ab31faeb7b4acd720b5f7c738d4e0273cd765bd030e2367381547204bd9a6c73d0" - "74c722b6e0a173045279abe358d67386a657961cef0b7414c8f6dd71754174187a" - "7455ced275749e98d1ea8147ab7463ffc232b10ce1743cbf737fdd4f15750baf50" - "dfd4a34a75676d920b65a68075c008774efecfb475f1ca14e2fd03ea75d6fe4cad" - "7e4220768c3ea0581e5354762f4ec8eee5678976bb617a6adfc1bf76157d8ca22b" - "d9f3765a9c2f8b76cf28777083fb2d54035f772632bd9c14629377b07eecc3993a" - "c8775c9ee7344049fe77f9c21021c8ed3278b8f354293aa96778a530aab388939d" - "78675e4a70357cd27801f65ccc421b07798233747f13e23c7931a0a82f4c0d7279" - "3dc8923b9f90a6794d7a770ac734dc7970ac8a66fca0117a8c572d803b09467a6f" - "ad38608a8b7b7a656c237c3637b17a7f472c1b0485e57a5e59f72145e61a7bdb97" - "3a35ebcf507bd23d8902e603857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a" - "9ece85247cf687184642a7597cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8" - "560df97cf8f19066ac502f7d3b971ac06b92637d0a3d21b00677987d4c8c295cc8" - "94ce7db0f79939fd1c037e9c7500883ce4377e039300aa4bdd6d7ee25b404a4faa" - "a27eda72d01ce354d77e908f04e41b2a0d7fbad9826e513a427f299023cae5c876" - "7f3374ac3c1f7bac7fa0c8eb85f3cce17f756c6c727565616c736500c04a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01884a7b003d5f5a4e313073657264" - "655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e31" - "3768386631666565323432343761346639634501435f5a4e313073657264655f6a" - "736f6e3264653231446573657269616c697a6572244c5424522447542435657272" - "6f723137683438663764306565626231623836343145020e5f5f727573745f6465" - "616c6c6f63035b5f5a4e34636f726533666d74336e756d34395f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e44656275672475323024666f72247532" - "302475382447542433666d74313768346234323333323664643863616231354504" - "305f5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "3532316661366566366130363732614505445f5a4e34636f726535736c69636535" - "696e6465783236736c6963655f73746172745f696e6465785f6c656e5f6661696c" - "313768663931613361666538376231643434334506385f5a4e34636f726533666d" - "7439466f726d617474657231327061645f696e74656772616c3137686334656130" - "376130626331333536633445075c5f5a4e34636f726533666d74336e756d35305f" - "244c5424696d706c2475323024636f72652e2e666d742e2e446562756724753230" - "24666f7224753230247533322447542433666d7431376835353339386231363535" - "30643532376545084c5f5a4e34636f726533707472343264726f705f696e5f706c" - "616365244c5424616c6c6f632e2e737472696e672e2e537472696e672447542431" - "37683738323934613239653363373833306445094f5f5a4e34636f726533707472" - "343564726f705f696e5f706c616365244c542473657264655f6a736f6e2e2e6572" - "726f722e2e4572726f722447542431376866383763386436646339616234626335" - "450a4f5f5a4e34636f726533707472343564726f705f696e5f706c616365244c54" - "2473657264655f6a736f6e2e2e76616c75652e2e56616c75652447542431376835" - "333262653330333764613162376564450b81015f5a4e39395f244c5424616c6c6f" - "632e2e636f6c6c656374696f6e732e2e62747265652e2e6d61702e2e4254726565" - "4d6170244c54244b24432456244324412447542424753230246173247532302463" - "6f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031376835" - "346633306630323133646334313362450c645f5a4e37305f244c5424616c6c6f63" - "2e2e7665632e2e566563244c542454244324412447542424753230246173247532" - "3024636f72652e2e6f70732e2e64726f702e2e44726f70244754243464726f7031" - "376864313538343863353832316334666665450d525f5a4e35335f244c5424636f" - "72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376866376165323835356232343964" - "626335450e5f5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "475424313077726974655f63686172313768323134333931636238656231353263" - "36450f435f5a4e35616c6c6f63377261775f7665633139526177566563244c5424" - "5424432441244754243867726f775f6f6e65313768363666383634616630346265" - "6432623245105a5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c5424412447542437726573657276653231646f5f72657365727665" - "5f616e645f68616e646c653137683766656665376563326164336435616245115d" - "5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475" - "32302461732475323024636f72652e2e666d742e2e577269746524475424397772" - "6974655f737472313768353939643965353738393436646439384512595f5a4e36" - "305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532302461" - "732475323024636f72652e2e666d742e2e446973706c61792447542433666d7431" - "37686365343232366161316637323663316345132e5f5a4e34636f726533666d74" - "39466f726d61747465723370616431376834373639616533383933373463633531" - "45145d5f5a4e36355f244c542473657264655f6a736f6e2e2e76616c75652e2e56" - "616c7565247532302461732475323024636f72652e2e636d702e2e506172746961" - "6c4571244754243265713137683162323138393234373831393663383045158b01" - "5f5a4e3130385f244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e6274" - "7265652e2e6d61702e2e49746572244c54244b2443245624475424247532302461" - "732475323024636f72652e2e697465722e2e7472616974732e2e6974657261746f" - "722e2e4974657261746f7224475424346e65787431376835363664323036316535" - "6139376461644516615f5a4e36385f244c5424636f72652e2e6e756d2e2e657272" - "6f722e2e5061727365496e744572726f72247532302461732475323024636f7265" - "2e2e666d742e2e44656275672447542433666d7431376863383736363338616561" - "6230633031664517675f5a4e36385f244c5424636f72652e2e666d742e2e627569" - "6c646572732e2e50616441646170746572247532302461732475323024636f7265" - "2e2e666d742e2e5772697465244754243977726974655f73747231376838313862" - "343965376536396132366664451808616c6c6f6361746519435f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542436" - "6d616c6c6f6331376865363539333961346338393763633135451a335f5a4e3561" - "6c6c6f63377261775f766563313268616e646c655f6572726f7231376839376237" - "646264306637326464373838451b0a6465616c6c6f636174651c11636f6d706172" - "655f6163636f756e7449441d325f5a4e313073657264655f6a736f6e3264653130" - "66726f6d5f736c69636531376831316365303837373634633961376230451e5c5f" - "5a4e35355f244c542473747224753230246173247532302473657264655f6a736f" - "6e2e2e76616c75652e2e696e6465782e2e496e646578244754243130696e646578" - "5f696e746f31376864333238633634636161396431376163451f325f5a4e34636f" - "726536726573756c743133756e777261705f6661696c6564313768663839396364" - "303037373637303035314520325f5a4e34636f7265366f7074696f6e3133756e77" - "7261705f6661696c6564313768333535313964653938613737363134664521625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "7533322447542433666d743137686266336530323238343833653337356145222b" - "5f5a4e3373746432696f35737464696f365f7072696e7431376838316334373231" - "3636303436663066634523385f5a4e35616c6c6f63377261775f76656331376361" - "7061636974795f6f766572666c6f77313768343939643438326139656435373135" - "614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d7431" - "3768363534306363623264356664633361624525415f5a4e38646c6d616c6c6f63" - "38646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243466726565" - "3137683339383334616161616533653839343645262c5f5a4e34636f7265397061" - "6e69636b696e673570616e69633137683034656562393137646439336332323945" - "270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c696e6b" - "5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447" - "54243133646973706f73655f6368756e6b31376836653063636364343538363537" - "343633452a3a5f5a4e34636f72653970616e69636b696e67313870616e69635f62" - "6f756e64735f636865636b31376833643662386161346338303439363632452b11" - "727573745f626567696e5f756e77696e642c465f5a4e34636f726533666d743946" - "6f726d617474657231327061645f696e74656772616c313277726974655f707265" - "66697831376861396134333238306236303036643132452d425f5a4e34636f7265" - "35736c69636535696e6465783234736c6963655f656e645f696e6465785f6c656e" - "5f6661696c31376830383862353665323939626561616166452e3b5f5a4e34636f" - "72653970616e69636b696e6731396173736572745f6661696c65645f696e6e6572" - "31376836663765333235376438346135303432452f475f5a4e34325f244c542424" - "52462454247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768336136626161316262343761643230344530495f5a4e34" - "345f244c54242452462454247532302461732475323024636f72652e2e666d742e" - "2e446973706c61792447542433666d743137683766663464306238363039633234" - "37324531585f5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e" - "7473247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768363861336538653530396361666336344532265f5a4e34" - "636f726533666d7435777269746531376839333535346534626537316632633761" - "45335f5f5a4e34636f726533666d74336e756d35305f244c5424696d706c247532" - "3024636f72652e2e666d742e2e44656275672475323024666f7224753230247533" - "322447542433666d7431376835353339386231363535306435323765452e323534" - "5c5f5a4e36335f244c5424636f72652e2e63656c6c2e2e426f72726f774d757445" - "72726f72247532302461732475323024636f72652e2e666d742e2e446562756724" - "47542433666d74313768313564336433343334626464636363384535395f5a4e34" - "636f72653463656c6c323270616e69635f616c72656164795f626f72726f776564" - "313768333134623532613162633436626665344536405f5a4e34636f726535736c" - "69636535696e6465783232736c6963655f696e6465785f6f726465725f6661696c" - "313768353862336536383666653333373030654537325f5a4e34636f7265366f70" - "74696f6e31336578706563745f6661696c65643137686630386139396532643733" - "33366336614538535f5a4e34636f72653463686172376d6574686f647332325f24" - "4c5424696d706c2475323024636861722447542431366573636170655f64656275" - "675f657874313768656366613566303431373437393039384539345f5a4e34636f" - "726537756e69636f6465397072696e7461626c6535636865636b31376836646136" - "346638306663313630633761453a325f5a4e34636f7265337374723136736c6963" - "655f6572726f725f6661696c31376862303364323439386438646362363433453b" - "355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c5f72" - "7431376832616462643139306563313832373933453c645f5a4e37315f244c5424" - "636f72652e2e6f70732e2e72616e67652e2e52616e6765244c5424496478244754" - "24247532302461732475323024636f72652e2e666d742e2e446562756724475424" - "33666d7431376836636632383632303536616535653233453d465f5a4e34315f24" - "4c542463686172247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376865613566643964626339343936626665453e625f" - "5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c247532" - "3024636f72652e2e666d742e2e446973706c61792475323024666f722475323024" - "6933322447542433666d7431376863656439306337613633396330316464453fce" - "015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f64" - "653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e672443244b24" - "432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e" - "6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c2447542432" - "316465616c6c6f636174655f616e645f617363656e643137683538396137326639" - "343233626663656245409a025f5a4e35616c6c6f633131636f6c6c656374696f6e" - "73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f646552656624" - "4c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e2e63" - "6f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e" - "496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e45646765244754243130" - "696e736572745f6669743137686338613063663533396566663031313145419202" - "5f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f6465" - "32313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e636f" - "6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4d" - "75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e" - "62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c24475424" - "244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64" - "652e2e6d61726b65722e2e4b56244754243573706c697431376864303961343862" - "37613831363331616145425a5f5a4e36315f244c542473657264655f6a736f6e2e" - "2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e666d" - "742e2e44656275672447542433666d743137683430323537643666343265323962" - "37344543595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e4572" - "726f72247532302461732475323024636f72652e2e666d742e2e446973706c6179" - "2447542433666d74313768393032373163376232613663653833394544575f5a4e" - "35385f244c5424616c6c6f632e2e737472696e672e2e537472696e672475323024" - "61732475323024636f72652e2e666d742e2e44656275672447542433666d743137" - "686236373265623139396333356431383645453a5f5a4e313073657264655f6a73" - "6f6e32646531325061727365724e756d6265723576697369743137683836623839" - "36383136626131306137654546565f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565336d6170323542547265654d6170244c54244b2443245624" - "4324412447542436696e7365727431376834643164623464613838343264346665" - "4547455f5a4e313073657264655f6a736f6e347265616439536c69636552656164" - "3137706f736974696f6e5f6f665f696e6465783137683236623431383938353234" - "38333239364548695f5a4e37305f244c542473657264655f6a736f6e2e2e726561" - "642e2e536c6963655265616424753230246173247532302473657264655f6a736f" - "6e2e2e726561642e2e52656164244754243970617273655f737472313768616265" - "386335353563386263643335354549475f5a4e313073657264655f6a736f6e3472" - "65616439536c696365526561643139736b69705f746f5f6573636170655f736c6f" - "7731376834373836633665323234666132336632454a465f5a4e35616c6c6f6333" - "7665633136566563244c54245424432441244754243137657874656e645f66726f" - "6d5f736c69636531376864626131346637346638653232366463454b2f5f5a4e31" - "3073657264655f6a736f6e34726561643661735f73747231376866636436626234" - "313731373865366635454c3e5f5a4e313073657264655f6a736f6e347265616432" - "3070617273655f756e69636f64655f657363617065313768393634306663636162" - "64303034613064454d725f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e526561642447542431376465636f64655f6865785f65" - "736361706531376834376265353936383535663830346461454e355f5a4e313073" - "657264655f6a736f6e347265616431317065656b5f6f725f656f66313768373363" - "62313436306531616339386135454f2e5f5a4e313073657264655f6a736f6e3472" - "656164356572726f72313768656635353237643333336339633236664550305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376861333165" - "6164363637646336373865304551325f5a4e35616c6c6f63377261775f76656331" - "3166696e6973685f67726f77313768353338353962613338396237316433354552" - "4b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e6572244c" - "54244124475424313467726f775f616d6f7274697a656431376839386333363466" - "6334356633643132344553435f5a4e35616c6c6f63377261775f76656331395261" - "77566563244c54245424432441244754243867726f775f6f6e6531376866373333" - "3137633566643665626336364554395f5a4e337374643674687265616438546872" - "6561644964336e6577396578686175737465643137683333366266376131343838" - "30343463384555425f5a4e34636f72653463656c6c346f6e636531374f6e636543" - "656c6c244c54245424475424387472795f696e6974313768636536336266323238" - "3531393165373145563e5f5a4e35616c6c6f633473796e633136417263244c5424" - "5424432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394557355f5a4e34636f72653970616e69636b696e6731336173736572" - "745f6661696c6564313768323332363266326333633738623661624558475f5a4e" - "34325f244c54242452462454247532302461732475323024636f72652e2e666d74" - "2e2e44656275672447542433666d74313768653138373433383865303762666532" - "3545595d5f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53747269" - "6e67247532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d7431376863653432323661613166373236633163452e3238335a7a" - "5f5a4e34636f726533707472383864726f705f696e5f706c616365244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447542424" - "47542431376831363664633631616230333334633165455b495f5a4e3373746434" - "73796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424" - "3130696e697469616c697a6531376837663563353038646139653162303962455c" - "605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e5374646f7574" - "4c6f636b2475323024617324753230247374642e2e696f2e2e5772697465244754" - "243977726974655f616c6c31376832346238323631303436316432353666455d55" - "5f5a4e3373746432696f3862756666657265643962756677726974657231384275" - "66577269746572244c54245724475424313477726974655f616c6c5f636f6c6431" - "376835383462646262616562306662316262455e735f5a4e38305f244c54247374" - "642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164617074657224" - "4c54245424475424247532302461732475323024636f72652e2e666d742e2e5772" - "697465244754243977726974655f73747231376837666163663562633065666364" - "383038455f325f5a4e34636f726533666d74355772697465313077726974655f63" - "686172313768663062336265316563313964653565374560305f5a4e34636f7265" - "33666d743557726974653977726974655f666d7431376866383830386630646630" - "65343531336445610a727573745f70616e696362375f5a4e34636f72653570616e" - "6963313250616e69635061796c6f61643661735f73747231376836313439663134" - "3264396132653032654563505f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c542441244754243138696e736572745f6c61726765" - "5f6368756e6b313768656665383531613237353832646137624564455f5a4e3373" - "746433737973396261636b747261636532365f5f727573745f656e645f73686f72" - "745f6261636b747261636531376834646333646534376432323032316239456558" - "5f5a4e337374643970616e69636b696e673139626567696e5f70616e69635f6861" - "6e646c657232385f24753762242475376224636c6f737572652475376424247537" - "64243137686531376133393737663839633131373845663b5f5a4e337374643970" - "616e69636b696e673230727573745f70616e69635f776974685f686f6f6b313768" - "37373665373963396636353931626535456783015f5a4e39395f244c5424737464" - "2e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e646c65722e" - "2e5374617469635374725061796c6f6164247532302461732475323024636f7265" - "2e2e70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638456888015f5a4e313073657264655f" - "6a736f6e3576616c756532646537375f244c5424696d706c247532302473657264" - "652e2e64652e2e446573657269616c697a652475323024666f7224753230247365" - "7264655f6a736f6e2e2e76616c75652e2e56616c75652447542431316465736572" - "69616c697a65313768333165353137383163383336383735394569535f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "39616234626335452e3331316a3c5f5a4e3573657264653264653756697369746f" - "72313876697369745f626f72726f7765645f737472313768343564373131633837" - "31363863326636456b4f5f5a4e313073657264655f6a736f6e3264653231446573" - "657269616c697a6572244c54245224475424313670617273655f616e795f6e756d" - "62657231376839316435333034653561396363663531456c4a5f5a4e3130736572" - "64655f6a736f6e3264653231446573657269616c697a6572244c54245224475424" - "313170617273655f6964656e743137683663353964643731393635353139313045" - "6d735f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d61704163" - "63657373244c5424522447542424753230246173247532302473657264652e2e64" - "652e2e4d61704163636573732447542431336e6578745f6b65795f736565643137" - "6865363235636133323138363233653036456e755f5a4e37355f244c5424736572" - "64655f6a736f6e2e2e64652e2e4d6170416363657373244c542452244754242475" - "3230246173247532302473657264652e2e64652e2e4d6170416363657373244754" - "2431356e6578745f76616c75655f73656564313768656338353637376538303165" - "39393133456f4b5f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424313270617273655f6e756d62657231376837" - "3833613431613462393130646432304570515f5a4e313073657264655f6a736f6e" - "3264653231446573657269616c697a6572244c5424522447542431387061727365" - "5f6c6f6e675f696e74656765723137686438313037386634613331633262653245" - "714c5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a65" - "72244c54245224475424313370617273655f646563696d616c3137683661306333" - "363832326663336530306145724d5f5a4e313073657264655f6a736f6e32646532" - "31446573657269616c697a6572244c54245224475424313470617273655f657870" - "6f6e656e743137683336646437646264323365346134656245734d5f5a4e313073" - "657264655f6a736f6e3264653231446573657269616c697a6572244c5424522447" - "542431346636345f66726f6d5f7061727473313768633863316239626161613836" - "666637334574555f5a4e313073657264655f6a736f6e3264653231446573657269" - "616c697a6572244c54245224475424323270617273655f646563696d616c5f6f76" - "6572666c6f77313768336130306563656466383630313864334575565f5a4e3130" - "73657264655f6a736f6e3264653231446573657269616c697a6572244c54245224" - "475424323370617273655f6578706f6e656e745f6f766572666c6f773137683034" - "3762396637333562616463666138457681015f5a4e37355f244c54247365726465" - "5f6a736f6e2e2e64652e2e4d6170416363657373244c5424522447542424753230" - "246173247532302473657264652e2e64652e2e4d61704163636573732447542431" - "336e6578745f6b65795f7365656431326861735f6e6578745f6b65793137683564" - "61326634303536653538313464394577066d656d636d7078365f5a4e3137636f6d" - "70696c65725f6275696c74696e73336d656d376d656d6d6f766531376863383366" - "3931363866353238616565364579076d656d6d6f76657a066d656d637079071201" - "000f5f5f737461636b5f706f696e746572090a0100072e726f6461746100550970" - "726f64756365727302086c616e6775616765010452757374000c70726f63657373" - "65642d62790105727573746325312e38332e302d6e696768746c79202863326637" - "346333663920323032342d30392d30392900490f7461726765745f666561747572" - "6573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b" - "0f7265666572656e63652d74797065732b087369676e2d657874"; + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::string escrow_tx_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; - std::vector escrow_tx_json_data( - escrow_tx_json_str.begin(), escrow_tx_json_str.end()); + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time + using namespace test::jtx; + struct TestHostFunctions : public HostFunctions { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "02" - })"; + Env* env; + Bytes accountID; + Bytes data; + int clock_drift = 0; - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) + public: + explicit TestHostFunctions(Env* env, int cd = 0) + : env(env), clock_drift(cd) { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(!reValue.first); - BEAST_EXPECT(reValue.second == "1"); + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data = Bytes{t.begin(), t.end()}; } - } - - { - std::string escrow_lo_json_str = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F", - "Data" : "1" - })"; - std::vector escrow_lo_json_data( - escrow_lo_json_str.begin(), escrow_lo_json_str.end()); - auto re = runEscrowWasmP4( - wasm, funcName, escrow_tx_json_data, escrow_lo_json_data); - if (BEAST_EXPECT(re.has_value())) + int32_t + getLedgerSqn() override { - auto reValue = re.value(); - // std::cout << reValue.first << " " << - // reValue.second - // << std::endl; - BEAST_EXPECT(reValue.first); - BEAST_EXPECT(reValue.second == "0"); + return (int32_t)env->current()->seq(); } - } - } - void - testEscrowWasmP5() - { - testcase("escrow wasm P5 test"); - auto wasmHex = - "0061736d010000000105016000017f021b0108686f73745f6c69620e6765745f6c" - "65646765725f73716e0000030201000405017001010105030100100619037f0141" - "8080c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f72790200" - "05726561647900010a5f5f646174615f656e6403010b5f5f686561705f62617365" - "03020a0d010b0010808080800041044a0b006e046e616d65000e0d7761736d5f6c" - "69622e7761736d01430200395f5a4e387761736d5f6c696238686f73745f6c6962" - "31346765745f6c65646765725f73716e3137686663383539386237646539633036" - "64624501057265616479071201000f5f5f737461636b5f706f696e746572005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d62790105727573746325312e38332e302d6e696768746c792028633266" - "37346333663920323032342d30392d30392900490f7461726765745f6665617475" - "726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c73" - "2b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + int32_t + getParentLedgerTime() override + { + return env->current() + ->parentCloseTime() + .time_since_epoch() + .count() + + clock_drift; + } - using namespace test::jtx; - struct TestLedgerDataProvider : public LedgerDataProvider - { - Env* env; + std::optional + getTxField(std::string const& fname) override + { + return accountID; + } - public: - TestLedgerDataProvider(Env* env) : env(env) + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override { + return data; } - int32_t - get_ledger_sqn() override + std::optional + getCurrentLedgerEntryField(std::string const& fname) override { - return (int32_t)env->current()->seq(); + if (fname == "Destination" || fname == "Account") + return accountID; + else if (fname == "Data") + return data; + else if (fname == "FinishAfter") + { + auto t = env->current() + ->parentCloseTime() + .time_since_epoch() + .count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return std::nullopt; } }; + Env env{*this}; - TestLedgerDataProvider ledgerDataProvider(&env); - std::string funcName("ready"); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value()); + + { + TestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re.value().result); + std::cout << "good case result " << re.value().result + << " cost: " << re.value().cost << std::endl; + } + } env.close(); env.close(); env.close(); env.close(); - re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value()); - } - - void - testEscrowWasmP6() - { - testcase("escrow wasm P6 test"); - auto wasmHex = - "0061736d010000000109026000017f60017f0002150108686f73745f6c69620863" - "6f6e7374496e74000003030201010405017001010105030100100619037f014180" - "80c0000b7f00418080c0000b7f00418080c0000b073e05066d656d6f7279020007" - "6c6f6f70696e6700010c6c6f6f70696e675f686f737400020a5f5f646174615f65" - "6e6403010b5f5f686561705f6261736503020a1a0202000b150003401080808080" - "001a2000417f6a22000d000b0b0077046e616d65000e0d7761736d5f6c69622e77" - "61736d014c0300325f5a4e387761736d5f6c696238686f73745f6c696238636f6e" - "7374496e74313768643939653133366665323437376662344501076c6f6f70696e" - "67020c6c6f6f70696e675f686f7374071201000f5f5f737461636b5f706f696e74" - "657200550970726f64756365727302086c616e6775616765010452757374000c70" - "726f6365737365642d62790105727573746325312e38332e302d6e696768746c79" - "202863326637346333663920323032342d30392d30392900490f7461726765745f" - "6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c" - "6f62616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - - { - std::string funcName("looping"); - auto re = runEscrowWasm(wasm, funcName, 1000, 500); + { // fail because current time < escrow_finish_after time + TestHostFunctions nfs(&env); + nfs.clock_drift = -1; + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re.value().result); - std::cout << re.value().cost << std::endl; + BEAST_EXPECT(!re.value().result); + std::cout << "bad case (current time < escrow_finish_after " + "time) result " + << re.value().result << " cost: " << re.value().cost + << std::endl; } } - { - std::string funcName("looping_host"); - auto re = runEscrowWasm(wasm, funcName, 1000, 50); - BEAST_EXPECT(!re.has_value()); + + { // fail because trying to access nonexistent field + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return std::nullopt; + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (access nonexistent field) result " + << re.error() << std::endl; + } + + { // fail because trying to allocate more than MAX_PAGES memory + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + { + } + std::optional + getTxField(std::string const& fname) override + { + return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); + } + }; + BadTestHostFunctions nfs(&env); + std::string funcName("ready"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (more than MAX_PAGES) result " << re.error() + << std::endl; + } + + { // fail because recursion too deep + auto wasmHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(&env); + std::string funcName("recursive"); + auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); + BEAST_EXPECT(re.error()); + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } @@ -4734,15 +2153,9 @@ struct Wasm_test : public beast::unit_test::suite run() override { using namespace test::jtx; - testWasmtimeLib(); - testEscrowWasmP0(); testBadWasm(); - testEscrowWasmP1(); - testEscrowWasmP2P3(); - testEscrowWasmP4(); - testEscrowWasmP5(); - testEscrowWasmP6(); + testEscrowWasmDN1(); } }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp new file mode 100644 index 00000000000..9ecbe22f31d --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -0,0 +1,118 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include "xrpld/app/misc/WasmHostFuncImpl.h" + +#include "xrpl/protocol/digest.h" + +namespace ripple { + +int32_t +WasmHostFunctionsImpl::getLedgerSqn() +{ + return ctx.view().seq(); +} + +int32_t +WasmHostFunctionsImpl::getParentLedgerTime() +{ + return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try +} + +// TODO remove json code after deciding encoding scheme + +std::optional +WasmHostFunctionsImpl::getTxField(const std::string& fname) +{ + auto js = ctx.tx.getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getLedgerEntryField( + int32_t type, + Bytes const& kdata, + const std::string& fname) +{ + auto kl = [&]() -> std::optional { + if (type == ltACCOUNT_ROOT) + { + std::string s(kdata.begin(), kdata.end()); + auto const account = parseBase58(s); + if (account) + { + return keylet::account(account.value()); + } + } + return std::nullopt; + }(); + + if (!kl || !ctx.view().exists(kl.value())) + return std::nullopt; + + auto js = ctx.view().read(kl.value())->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +std::optional +WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) +{ + if (!ctx.view().exists(leKey)) + return std::nullopt; + + auto js = ctx.view().read(leKey)->getJson(JsonOptions::none); + if (js.isMember(fname)) + { + auto s = js.get(fname, Json::Value::null).asString(); + return Bytes{s.begin(), s.end()}; + } + else + return std::nullopt; +} + +bool +WasmHostFunctionsImpl::updateData(const Bytes& data) +{ + if (!ctx.view().exists(leKey)) + return false; + auto sle = ctx.view().peek(leKey); + sle->setFieldVL(sfData, data); + ctx.view().update(sle); + return true; +} + +Hash +WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) +{ + auto const hash = sha512Half(data); + return uint256::fromVoid(hash.data()); +} +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h new file mode 100644 index 00000000000..a311073d7b6 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -0,0 +1,69 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#include +#include + +#include "xrpl/basics/base_uint.h" +#include "xrpld/app/misc/WasmVM.h" +#include "xrpld/app/tx/detail/ApplyContext.h" +#include + +namespace ripple { +class WasmHostFunctionsImpl : public HostFunctions +{ +public: + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet leKey) + : ctx(ctx), leKey(leKey) + { + } + + int32_t + getLedgerSqn() override; + + int32_t + getParentLedgerTime() override; + + std::optional + getTxField(std::string const& fname) override; + + std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) override; + + std::optional + getCurrentLedgerEntryField(std::string const& fname) override; + + bool + updateData(Bytes const& data) override; + + Hash + computeSha512HalfHash(Bytes const& data) override; + +private: + ApplyContext& ctx; + Keylet leKey; +}; + +} // namespace ripple +#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d94135646b0..22ac65479fb 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -19,496 +19,275 @@ #include -// WasmVM::WasmVM(beast::Journal j) -// : j_(j) -//{ -// } +#include "xrpl/protocol/AccountID.h" +#include "xrpl/protocol/LedgerFormats.h" namespace ripple { -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input) + +WasmEdge_Result +getLedgerSqn( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; - WasmEdge_Value Returns[1]; - WasmEdge_String FuncName = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - FuncName, - Params, - 1, - Returns, - 1); - - bool ok = WasmEdge_ResultOK(Res); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(Returns[0]); - // printf("Get the result: %d\n", result); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } + out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); + return WasmEdge_Result_Success; +} - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); +WasmEdge_Result +getParentLedgerTime( + void* data, + const WasmEdge_CallingFrameContext*, + const WasmEdge_Value*, + WasmEdge_Value* out) +{ + out[0] = + WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); + return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID) +Expected +getParameterData( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) { - auto dataLen = (int32_t)accountID.size(); - // printf("accountID size: %d\n", dataLen); - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - WasmEdge_Result allocRes = WasmEdge_VMRunWasmFromBuffer( - VMCxt, - wasmCode.data(), - wasmCode.size(), - allocFunc, - allocParams, - 1, - allocReturns, - 1); - - bool ok = WasmEdge_ResultOK(allocRes); - bool re = false; - if (ok) + auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); + auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); + Bytes fname(fnameLen, char{0}); + WasmEdge_MemoryInstanceContext* mem = + WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( + mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); + if (WasmEdge_ResultOK(Res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("Alloc pointer: %d\n", pointer); - - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, accountID.data(), pointer, dataLen); - - ok = WasmEdge_ResultOK(setRes); - if (ok) - { - // printf("Set data ok\n"); - - WasmEdge_Value params[2] = { - WasmEdge_ValueGenI32(pointer), WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = - WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 2, returns, 1); - - ok = WasmEdge_ResultOK(funcRes); - if (ok) - { - // printf("func ok\n"); - re = (WasmEdge_ValueGetI32(returns[0]) == 1); - } - else - { - printf( - "Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - } - else - { - printf( - "Set error message: %s\n", WasmEdge_ResultGetMessage(setRes)); - } + return fname; } else { - printf( - "Alloc error message: %s\n", WasmEdge_ResultGetMessage(allocRes)); + return Unexpected(Res); } - - WasmEdge_VMDelete(VMCxt); - // TODO free everything - // WasmEdge_StringDelete(FuncName); - if (ok) - { - // printf("runEscrowWasm ok, result %d\n", re); - return re; - } - else - return Unexpected(tecFAILED_PROCESSING); } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) +Expected +getFieldName( + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + size_t index) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) + auto dataRes = getParameterData(fm, in, index); + if (dataRes) { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) - { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) - { - return pointer; - } - } - - return 0; - }; - - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) - { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) - { - // printf("func ok\n"); - return WasmEdge_ValueGetI32(returns[0]) == 1; + return std::string(dataRes.value().begin(), dataRes->end()); } else { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); + return Unexpected(dataRes.error()); } } -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data) +Expected +setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto wasmAlloc = [VMCxt](std::vector const& data) -> int32_t { - auto dataLen = (int32_t)data.size(); - WasmEdge_Value allocParams[1] = {WasmEdge_ValueGenI32(dataLen)}; - WasmEdge_Value allocReturns[1]; + auto alloc = [fm](int32_t dataLen) -> int32_t { WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - - WasmEdge_Result allocRes = WasmEdge_VMExecute( - VMCxt, allocFunc, allocParams, 1, allocReturns, 1); - - if (WasmEdge_ResultOK(allocRes)) + auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); + WasmEdge_FunctionInstanceContext* func = + WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); + WasmEdge_Value allocParams[1] = { + WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size + WasmEdge_Value allocReturns[1]; + auto executor = WasmEdge_CallingFrameGetExecutor(fm); + auto res = WasmEdge_ExecutorInvoke( + executor, func, allocParams, 1, allocReturns, 1); + if (WasmEdge_ResultOK(res)) { - auto pointer = WasmEdge_ValueGetI32(allocReturns[0]); - // printf("alloc ptr %d, len %d\n", pointer, dataLen); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - WasmEdge_Result setRes = WasmEdge_MemoryInstanceSetData( - mi, data.data(), pointer, dataLen); - if (WasmEdge_ResultOK(setRes)) - { - return pointer; - } + return WasmEdge_ValueGetI32(allocReturns[0]); + } + else + { + return 0; } - - return 0; }; - auto tx_ptr = wasmAlloc(escrow_tx_json_data); - auto lo_ptr = wasmAlloc(escrow_lo_json_data); - if (tx_ptr == 0 || lo_ptr == 0) - { - printf("data error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - - auto txLen = (int32_t)escrow_tx_json_data.size(); - auto loLen = (int32_t)escrow_lo_json_data.size(); - - WasmEdge_Value params[4] = { - WasmEdge_ValueGenI32(tx_ptr), - WasmEdge_ValueGenI32(txLen), - WasmEdge_ValueGenI32(lo_ptr), - WasmEdge_ValueGenI32(loLen)}; - WasmEdge_Value returns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, params, 4, returns, 1); - - if (WasmEdge_ResultOK(funcRes)) + auto dataLen = (int32_t)data.size(); + auto dataPtr = alloc(dataLen); + auto retPtr = alloc(8); + if (dataPtr && retPtr) { - auto pointer = WasmEdge_ValueGetI32(returns[0]); - const WasmEdge_ModuleInstanceContext* m = - WasmEdge_VMGetActiveModule(VMCxt); - WasmEdge_String mName = WasmEdge_StringCreateByCString("memory"); - WasmEdge_MemoryInstanceContext* mi = - WasmEdge_ModuleInstanceFindMemory(m, mName); - uint8_t buff[9]; - WasmEdge_Result getRes = - WasmEdge_MemoryInstanceGetData(mi, buff, pointer, 9); - if (!WasmEdge_ResultOK(getRes)) + auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); + auto res = + WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); + if (WasmEdge_ResultOK(res)) { - printf( - "re mem get message: %s\n", WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); - } - auto flag = buff[0]; + unsigned char intBuf[8]; // little-endian + for (size_t i = 0; i < 4; ++i) + { + intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; + } + for (size_t i = 0; i < 4; ++i) + { + intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; + } - auto leToInt32 = [](const uint8_t* d) -> uint32_t { - uint32_t r = 0; - for (int i = 0; i < 4; ++i) + res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); + if (WasmEdge_ResultOK(res)) { - r |= static_cast(d[i]) << (i * 8); - // printf("leToInt32 %d\n", r); + return WasmEdge_ValueGenI32(retPtr); } - return r; - }; - auto ret_pointer = - leToInt32(reinterpret_cast(&buff[1])); - auto ret_len = leToInt32(reinterpret_cast(&buff[5])); - // printf("re flag %d, ptr %d, len %d\n", flag, ret_pointer, - // ret_len); - - std::vector buff2(ret_len); - getRes = WasmEdge_MemoryInstanceGetData( - mi, buff2.data(), ret_pointer, ret_len); - if (!WasmEdge_ResultOK(getRes)) - { - printf( - "re 2 mem get message: %s\n", - WasmEdge_ResultGetMessage(getRes)); - return Unexpected(tecFAILED_PROCESSING); } + } + return Unexpected(WasmEdge_Result_Fail); +} - std::string newData(buff2.begin(), buff2.end()); +WasmEdge_Result +getTxField( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); - // free - WasmEdge_String freeFunc = WasmEdge_StringCreateByCString("deallocate"); - WasmEdge_Value freeParams[2] = { - WasmEdge_ValueGenI32(ret_pointer), WasmEdge_ValueGenI32(ret_len)}; - WasmEdge_Value freeReturns[0]; - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); - // free pointer too, with len = 9 too - freeParams[0] = WasmEdge_ValueGenI32(pointer); - freeParams[1] = WasmEdge_ValueGenI32(9); - WasmEdge_VMExecute(VMCxt, freeFunc, freeParams, 2, freeReturns, 0); + auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; - return std::pair(flag == 1, newData); - } - else - { - printf("Func message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - return Unexpected(tecFAILED_PROCESSING); - } + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return WasmEdge_Result_Success; } WasmEdge_Result -get_ledger_sqn( +getLedgerEntryField( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = - WasmEdge_ValueGenI32(((LedgerDataProvider*)data)->get_ledger_sqn()); + auto type = WasmEdge_ValueGetI32(in[0]); + auto lkData = getParameterData(fm, in, 1); + if (!lkData) + return lkData.error(); + + auto fname = getFieldName(fm, in, 3); + if (!fname) + return fname.error(); + + auto fieldData = + ((HostFunctions*)data) + ->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); return WasmEdge_Result_Success; } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - LedgerDataProvider* ledgerDataProvider) +WasmEdge_Result +getCurrentLedgerEntryField( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate( - HostFType, get_ledger_sqn, ledgerDataProvider, 0); - WasmEdge_FunctionTypeDelete(HostFType); - - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); - - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("get_ledger_sqn"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + auto fname = getFieldName(fm, in, 0); + if (!fname) + return fname.error(); - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } + auto fieldData = + ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return WasmEdge_Result_Fail; - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); + auto pointer = setData(fm, fieldData.value()); + if (!pointer) + return pointer.error(); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return WasmEdge_Result_Success; +} - bool ok = WasmEdge_ResultOK(funcRes); - bool re = false; - if (ok) - { - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re = true; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } +WasmEdge_Result +updateData( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - if (ok) - return re; + if (((HostFunctions*)data)->updateData(fname.value())) + return WasmEdge_Result_Success; else - return Unexpected(tecFAILED_PROCESSING); + return WasmEdge_Result_Fail; } WasmEdge_Result -constInt( +computeSha512HalfHash( void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value* In, - WasmEdge_Value* Out) + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto fname = getParameterData(fm, in, 0); + if (!fname) + return fname.error(); + + auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(fm, digest); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32(32); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +print( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) { - Out[0] = WasmEdge_ValueGenI32(5); + auto f = getParameterData(fm, in, 0); + if (!f) + return f.error(); + std::string s(f.value().begin(), f.value().end()); + std::cout << s << std::endl; return WasmEdge_Result_Success; } -Expected +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - int32_t gasLimit, - int32_t input) + HostFunctions* hfs, + uint64_t gasLimit) { + // WasmEdge_LogOff(); + // TODO deletes + // create VM and set cost limit WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); + WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); WasmEdge_StatisticsContext* StatCxt = @@ -516,36 +295,168 @@ runEscrowWasm( WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); { // register host function - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(NULL, 0, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, constInt, nullptr, 100); - WasmEdge_FunctionTypeDelete(HostFType); - - WasmEdge_String HostName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* HostMod = - WasmEdge_ModuleInstanceCreate(HostName); - WasmEdge_StringDelete(HostName); - - WasmEdge_String HostFuncName = - WasmEdge_StringCreateByCString("constInt"); - WasmEdge_ModuleInstanceAddFunction(HostMod, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); + // module + WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); + WasmEdge_ModuleInstanceContext* hostMod = + WasmEdge_ModuleInstanceCreate(libName); + WasmEdge_StringDelete(libName); + // getLedgerSqn + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerSqn, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerSqn"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + + // getParentLedgerTime + { + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getParentLedgerTime, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getParentLedgerTime"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + // WasmEdge_FunctionInstanceDelete(hostFunc); + } + + // getTxField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getTxField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getTxField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getLedgerEntryField + { + WasmEdge_ValType inputList[5] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // getCurrentLedgerEntryField + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, getCurrentLedgerEntryField, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // updateData + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, updateData, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("updateData"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // computeSha512HalfHash + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, computeSha512HalfHash, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("computeSha512HalfHash"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // print + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostMod); + WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); if (!WasmEdge_ResultOK(regRe)) { printf("host func reg error\n"); return Unexpected(tecFAILED_PROCESSING); } } + WasmEdge_Result loadRes = WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); if (!WasmEdge_ResultOK(loadRes)) { - printf("load error\n"); + printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); return Unexpected(tecFAILED_PROCESSING); } WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); @@ -560,20 +471,23 @@ runEscrowWasm( printf("instantiate error\n"); return Unexpected(tecFAILED_PROCESSING); } - + WasmEdge_Value funcReturns[1]; WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Value Params[1] = {WasmEdge_ValueGenI32(input)}; WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, Params, 1, NULL, 0); + WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); bool ok = WasmEdge_ResultOK(funcRes); - EscrowResultP6 re; + EscrowResult re; if (ok) { auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); re.cost = WasmEdge_StatisticsGetTotalCost(sc); // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - re.result = true; + auto result = WasmEdge_ValueGetI32(funcReturns[0]); + if (result != 0) + re.result = true; + else + re.result = false; } else { @@ -588,5 +502,4 @@ runEscrowWasm( else return Unexpected(tecFAILED_PROCESSING); } - } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 37988a97e3a..d1e14e4246e 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -20,78 +20,81 @@ #define RIPPLE_APP_MISC_WASMVM_H_INLCUDED #include -// #include #include +#include "xrpl/basics/base_uint.h" #include namespace ripple { +const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - int32_t input); - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& accountID); - -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); +typedef std::vector Bytes; +typedef ripple::uint256 Hash; -Expected, TER> -runEscrowWasmP4( - std::vector const& wasmCode, - std::string const& funcName, - std::vector const& escrow_tx_json_data, - std::vector const& escrow_lo_json_data); +template +struct WasmResult +{ + T result; + uint64_t cost; +}; +typedef WasmResult EscrowResult; -struct LedgerDataProvider +struct HostFunctions { virtual int32_t - get_ledger_sqn() + getLedgerSqn() { return 1; } - virtual ~LedgerDataProvider() = default; -}; + virtual int32_t + getParentLedgerTime() + { + return 1; + } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - LedgerDataProvider* ledgerDataProvider); + virtual std::optional + getTxField(std::string const& fname) + { + return Bytes{}; + } -struct EscrowResultP6 -{ - bool result; - int32_t cost; + virtual std::optional + getLedgerEntryField( + int32_t type, + Bytes const& kdata, + std::string const& fname) + { + return Bytes{}; + } + + virtual std::optional + getCurrentLedgerEntryField(std::string const& fname) + { + return Bytes{}; + } + + virtual bool + updateData(Bytes const& data) + { + return true; + } + + virtual Hash + computeSha512HalfHash(Bytes const& data) + { + return Hash{}; + } + + virtual ~HostFunctions() = default; }; -Expected +Expected runEscrowWasm( std::vector const& wasmCode, std::string const& funcName, - int32_t gasLimit, - int32_t input); + HostFunctions* hfs, + uint64_t gasLimit); } // namespace ripple #endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED - -// class WasmVM final -//{ -// public: -// explicit WasmVM(beast::Journal j); -// ~WasmVM() = default; -// -// private: -// beast::Journal j_; -// }; \ No newline at end of file diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 165a6df5f43..89eace193a3 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -434,22 +435,6 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) return tesSUCCESS; } -struct EscrowLedgerDataProvider : public LedgerDataProvider -{ - ApplyView& view_; - -public: - EscrowLedgerDataProvider(ApplyView& view) : view_(view) - { - } - - int32_t - get_ledger_sqn() override - { - return (int32_t)view_.seq(); - } -}; - TER EscrowFinish::doApply() { @@ -601,14 +586,15 @@ EscrowFinish::doApply() std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - EscrowLedgerDataProvider ledgerDataProvider(ctx_.view()); + WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider); + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { - auto reValue = re.value(); - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue); + auto reValue = re.value().result; + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << re.value().cost; if (!reValue) { // ctx_.view().update(slep); From 177cdaf550c56f1e8a819ac84efbde68c6a5cfb1 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Mar 2025 10:55:33 -0400 Subject: [PATCH 004/212] Connect votable gas limit into VM (#5360) * [WIP] add gas limit * [WIP] host function escrow tests * finish test * uncomment out tests --- src/test/app/Escrow_test.cpp | 1190 +++++++++++++++++++++++ src/test/jtx/TestHelpers.h | 26 + src/xrpld/app/misc/AMMUtils.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 4 +- src/xrpld/app/misc/WasmVM.h | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 6 files changed, 1224 insertions(+), 7 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 0ac8bba8a0e..6c0e32179e8 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2022,6 +2022,1195 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testAllHostFunctions() + { + testcase("Test all host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: figure out how to make this a fixture in a separate file + auto wasmHex = + "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" + "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" + "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" + "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" + "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" + "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" + "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" + "745f6c696213676574506172656e744c656467657254696d650005035453020603" + "070101080901010a01000202010102080008000b0c030101010104050802030303" + "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" + "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" + "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" + "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" + "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" + "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" + "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" + "14200142808080801037020c200141033a00382001412036022820014100360234" + "2001418080c08000360230200141003602202001410036021820012001410c6a36" + "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" + "808080000d00200128020c21002001280210220220012802141080808080000240" + "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" + "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" + "027f017e037f23808080800041306b220324808080800041272104024002402000" + "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" + "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" + "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" + "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" + "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" + "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" + "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" + "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" + "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" + "41096a20046a412720046b108c808080002104200341306a24808080800020040b" + "6c01027f024002402000417c6a2802002202417871220341044108200241037122" + "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" + "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" + "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" + "2005200136020c2005200036020820052003360214200520023602102005410236" + "021c200541b884c08000360218200542023702242005418180808000ad42208620" + "0541106aad843703382005418280808000ad422086200541086aad843703302005" + "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" + "0041c0006b220224808080800002400240200028020022032d00000d0020012802" + "14419582c080004104200128021828020c118080808000808080800021000c010b" + "4101210020012802142204419982c0800041042001280218220528020c22061180" + "8080800080808080000d00200341016a210302400240200128021c22074104710d" + "0041012100200441f184c080004101200611808080800080808080000d02200320" + "01108a80808000450d010c020b200441f284c08000410220061180808080008080" + "8080000d0141012100200241013a001b200220053602102002200436020c200220" + "07360238200241c884c08000360234200220012d00203a003c2002200128021036" + "022c200220012902083702242002200129020037021c20022002411b6a36021420" + "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" + "80004102200228023428020c11808080800080808080000d010b2001280214419c" + "97c080004101200128021828020c118080808000808080800021000b200241c000" + "6a24808080800020000be90201057f2380808080004180016b2202248080808000" + "0240024002400240200128021c22034110710d0020034120710d01200031000041" + "01200110868080800021000c030b20002d0000210041ff00210303402002200322" + "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" + "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" + "0041ff00210303402002200322046a22052000410f712203413072200341376a20" + "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" + "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" + "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" + "02402004418101490d002004418001418885c08000108b80808000000b20014101" + "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" + "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" + "20032000360200200320013602042003410236020c200341d887c0800036020820" + "0342023702142003418380808000ad4220862204200341046aad84370328200320" + "042003ad843703202003200341206a360210200341086a200210aa80808000000b" + "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" + "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" + "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" + "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" + "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" + "2802000d000240200028021422012000280218220920082002200310ad80808000" + "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" + "0240024002402000280204220120064b0d00200028021422012000280218220920" + "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" + "2000413036021020002d0020210b4101210c200041013a00202000280214220920" + "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" + "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" + "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" + "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" + "1180808080008080808000210c0c010b200120066b210702400240024020002d00" + "2022010e0402000100020b20072101410021070c010b2007410176210120074101" + "6a41017621070b200141016a210120002802102106200028021821092000280214" + "210a024003402001417f6a2201450d01200a200620092802101181808080008080" + "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" + "200a20042005200928020c11808080800080808080000d00410021010340024020" + "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" + "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" + "0041106b220224808080800020022000280200220041046a36020c200141e181c0" + "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" + "418580808000108f808080002100200241106a24808080800020000be70201057f" + "2380808080004180016b22022480808080000240024002400240200128021c2203" + "4110710d0020034120710d0120003502004101200110868080800021000c030b20" + "00280200210041ff00210303402002200322046a22052000410f71220341307220" + "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" + "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" + "004110492106200041047621002006450d000b02402004418101490d0020044180" + "01418885c08000108b80808000000b20014101419885c080004102200541810120" + "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" + "85c08000108b80808000000b20014101419885c080004102200541810120044101" + "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" + "8080800041106b220b248080808000200028021420012002200028021828020c11" + "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" + "200b41086a200320042005200610b680808000200720082009200a10b680808000" + "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" + "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" + "0028021828020c118080808000808080800021000c010b200028021441ee84c080" + "004101200028021828020c118080808000808080800021000b200b41106a248080" + "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" + "23808080800041306b2203248080808000200341033a002c2003412036021c4100" + "210420034100360228200320013602242003200036022020034100360214200341" + "0036020c02400240024002400240200228021022050d00200228020c2200450d01" + "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" + "280200210003400240200041046a2802002207450d002003280220200028020020" + "07200328022428020c11808080800080808080000d040b20012802002003410c6a" + "200128020411818080800080808080000d03200141086a2101200041086a210020" + "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" + "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" + "40200041046a2802002201450d0020032802202000280200200120032802242802" + "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" + "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" + "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" + "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" + "0b0b200320073602102003200b36020c200141046a280200210702400240024020" + "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" + "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a200128020411818080800080808080000d02" + "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" + "280220200228020020044103746a22012802002001280204200328022428020c11" + "80808080008080808000450d010b410121010c010b410021010b200341306a2480" + "8080800020010b1e01017f024020002802002201450d0020002802042001108780" + "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" + "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" + "808080000be30201027f23808080800041106b2202248080808000024002400240" + "02402001418001490d002002410036020c2001418010490d010240200141808004" + "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" + "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" + "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" + "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" + "032000280200470d0020001096808080000b2000200341016a3602082000280204" + "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" + "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" + "20032001109780808000200028020821030b200028020420036a2002410c6a2001" + "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "01109c80808000024020012802082200418180808078460d002000200128020c10" + "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" + "03248080808000200341086a200020012002109c80808000024020032802082202" + "418180808078460d002002200328020c109d80808000000b200341106a24808080" + "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" + "109780808000200028020821030b200028020420036a2001200210d6808080001a" + "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" + "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" + "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" + "200136020820002002410120021b36020420002002453602000b800601057f0240" + "024002402000417c6a22032802002204417871220541044108200441037122061b" + "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" + "712002410b491b210102400240024020060d002001418002490d01200520014104" + "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" + "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" + "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" + "01490d042006200410a780808000200520016b22024110490d0120032001200328" + "020041017172410272360200200720016a22012002410372360204200720056a22" + "0520052802044101723602042001200210a88080800020000f0b200520016b2202" + "410f4d0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210a88080800020000f0b200320" + "05200328020041017172410272360200200720056a220220022802044101723602" + "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" + "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" + "020441017236020441002102410021010c010b2003200120044101717241027236" + "0200200720016a22012002410172360204200720056a2205200236020020052005" + "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" + "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" + "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" + "2201200220012002491b10d6808080002102200010a580808000200221000b2000" + "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" + "0010a680808000000b20032001200441017172410272360200200720016a220220" + "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" + "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" + "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" + "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" + "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" + "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" + "00411920044101766b2004411f461b742107410021060340024020052205280204" + "41787122082002490d00200820026b220820014f0d00200821012005210620080d" + "004100210120052106200521000c040b200528021422082000200820052007411d" + "764104716a41106a2802002205471b200020081b2100200741017421072005450d" + "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" + "491b22024103762201762200410371450d00024002402000417f7341017120016a" + "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" + "2206460d002006200136020c200120063602080c010b41002005417e2007777136" + "0298a2c080000b20022000410372360204200220006a2200200028020441017236" + "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" + "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" + "020441787120026b21012006210503400240200628021022000d00200628021422" + "000d0020052802182104024002400240200528020c22002005470d002005411441" + "10200528021422001b6a28020022060d01410021000c020b200528020822062000" + "36020c200020063602080c010b200541146a200541106a20001b21070340200721" + "082006220041146a200041106a200028021422061b210720004114411020061b6a" + "28020022060d000b200841003602000b2004450d040240200528021c4102744180" + "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" + "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" + "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" + "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" + "0020017441022001742200410020006b727168220841037422014190a0c080006a" + "220620014198a0c080006a28020022002802082207460d002007200636020c2006" + "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" + "360204200020026a2207200120026b2206410172360204200020016a2006360200" + "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" + "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" + "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" + "0120023602082005200236020c2002200136020c200220053602080b4100200736" + "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" + "20052802102206450d0020002006360210200620003602180b2005280214220645" + "0d0020002006360214200620003602180b02400240024020014110490d00200520" + "02410372360204200520026a22022001410172360204200220016a200136020041" + "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" + "c080002100024002404100280298a2c08000220841012007410376742207710d00" + "41002008200772360298a2c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200520012002" + "6a2200410372360204200520006a220020002802044101723602040c010b410020" + "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" + "720d004100210641022004742200410020006b722003712200450d032000684102" + "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" + "71220520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b2106200120082007" + "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" + "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" + "002006470d00200641144110200628021422001b6a28020022050d01410021000c" + "020b20062802082205200036020c200020053602080c010b200641146a20064110" + "6a20001b21070340200721082005220041146a200041106a200028021422051b21" + "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" + "40200628021c41027441809fc080006a22052802002006460d0020044110411420" + "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" + "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" + "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" + "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" + "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" + "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" + "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" + "a0c080002100034020002802002206200028020422076a2005460d022000280208" + "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" + "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" + "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" + "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" + "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" + "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" + "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" + "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" + "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" + "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" + "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" + "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" + "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" + "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" + "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" + "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" + "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" + "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" + "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" + "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" + "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" + "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" + "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" + "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" + "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" + "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" + "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" + "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" + "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" + "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" + "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" + "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" + "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" + "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" + "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" + "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" + "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" + "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" + "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" + "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" + "360204410041808080013602b8a2c080002001200641606a41787141786a220020" + "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" + "290288a0c080003702002007200937020841002008360284a0c080004100200536" + "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" + "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" + "0720072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010d0808080000c080b200041f8017141" + "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" + "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" + "0620013602082000200136020c2001200636020c200120003602080c070b200020" + "053602002000200028020420086a360204200520024103723602042007410f6a41" + "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" + "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" + "417871220610a780808000200620026a2102200120066a220128020421060b2001" + "2006417e7136020420002002410172360204200020026a20023602000240200241" + "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" + "024002404100280298a2c08000220641012002410376742202710d004100200620" + "0272360298a2c08000200121020c010b200128020821020b200120003602082002" + "200036020c2000200136020c200020023602080c050b4100200020026b22013602" + "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" + "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" + "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" + "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" + "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" + "800020052006410172360204200120006a2006360200200120024103723602040b" + "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" + "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" + "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" + "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" + "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" + "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" + "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" + "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" + "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" + "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" + "4020062802102205450d0020002005360210200520003602180b20062802142205" + "450d0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a20013602000240" + "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" + "6a2102024002404100280298a2c08000220541012001410376742201710d004100" + "2005200172360298a2c08000200221010c010b200228020821010b200220003602" + "082001200036020c2000200236020c200020013602080c010b2006200120026a22" + "00410372360204200620006a220020002802044101723602040b200641086a0be9" + "0101037f23808080800041206b2204248080808000024002400240200220036a22" + "0320024f0d00410021020c010b4100210220012802002205410174220620032006" + "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" + "0c010b2004200536021c20042001280204360214410121020b2004200236021820" + "0441086a2003200441146a109980808000024020042802080d00200428020c2102" + "200120033602002001200236020441818080807821020c010b2004280210210120" + "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" + "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" + "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" + "0041052000418680808000419082c0800041052002410c6a418780808000108f80" + "8080002100200241106a24808080800020000be00301097f23808080800041c000" + "6b2202248080808000200028020821032000280204210441012105200128021441" + "b083c080004101200128021828020c118080808000808080800021000240200345" + "0d0041002106034020062107410121062000410171210841012100024020080d00" + "02400240200128021c22084104710d002007410171450d01410121002001280214" + "41e784c080004102200128021828020c1180808080008080808000450d010c020b" + "200128021821092001280214210a024020074101710d0041012100200a41888bc0" + "80004101200928020c11808080800080808080000d020b200241013a001b200220" + "093602102002200a36020c20022008360238200241c884c0800036023420022001" + "2d00203a003c2002200128021036022c2002200129020837022420022001290200" + "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" + "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" + "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" + "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" + "4101200128021828020c118080808000808080800021050b200241c0006a248080" + "80800020050b4a01017f23808080800041106b2202248080808000200220003602" + "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" + "00200241106a24808080800020000b3d00200128021420002802002d0000410274" + "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" + "808080800080808080000be70101017f23808080800041106b2205248080808000" + "20002802142001410d200028021828020c11808080800080808080002101200541" + "003a000d200520013a000c20052000360208200541086a200241042003200410b6" + "80808000210320052d000d220120052d000c2204722100024020014101470d0020" + "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" + "004102200028021828020c118080808000808080800021000c010b200028021441" + "ee84c080004101200028021828020c118080808000808080800021000b20054110" + "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" + "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" + "02400240024002400240024002404107109b808080002201450d00200141036a41" + "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" + "800022022800042103200228000021042002410810878080800020014107108780" + "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" + "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" + "002202280004210520022800002106200241081087808080002001410710878080" + "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" + "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" + "2202280004210720022800002108200241081087808080002001410b1087808080" + "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" + "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" + "108380808000220928000421022009280000210a20094108108780808000200041" + "186a200a200210a48080800002400240024020002d00184101460d002000290320" + "210b02402002450d00200a20021087808080000b20014107108780808000410021" + "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" + "0000200141041082808080002202280000210c2002280004210a20024108108780" + "80800020014104108780808000024002400240200a4100480d000240200a0d0041" + "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" + "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" + "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" + "026b210f4100210103400240024002400240200220016a2d00002209c022104100" + "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" + "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" + "808080202111428080808010211202400240024002400240024002400240024002" + "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" + "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" + "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" + "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" + "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" + "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" + "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" + "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" + "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" + "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" + "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" + "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" + "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" + "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" + "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" + "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" + "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" + "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" + "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" + "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" + "41186a20142011a710a48080800020002d00184101460d01200029032021124100" + "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" + "201641076a41002800878cc08000360000201641002900808cc080003700002016" + "410b10828080800022012800002117200128000421132001410810878080800002" + "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" + "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" + "09201741016a210220134109490d024100210103402009450d0a20022d00004150" + "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" + "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" + "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" + "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" + "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" + "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" + "20090d040b410021010c050b201321092017210220134108490d020b4100210103" + "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" + "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" + "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" + "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" + "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" + "0b1087808080002004200310808080800020062005108080808000200820071080" + "80808000200c200a10808080800020004100360214200042808080801037020c20" + "0041033a003820004120360228200041003602342000418080c080003602302000" + "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" + "1086808080000d00200028020c2102200028021022092000280214108080808000" + "02402002450d00200920021087808080000b201510858080800020011085808080" + "0041002102024020032005470d0020042006200310d58080800045200b20125871" + "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" + "00200c200a1087808080000b02402007450d00200820071087808080000b024020" + "05450d00200620051087808080000b02402003450d00200420031087808080000b" + "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" + "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" + "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" + "80800041106b220324808080800002400240024002400240024002400240024002" + "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" + "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" + "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" + "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" + "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" + "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" + "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" + "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" + "0121010c010b20002005370308410021010b200020013a0000200341106a248080" + "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" + "030240024020024101710d002002410271450d012001280200220220006a210002" + "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" + "410020003602a0a2c0800020032003280204417e71360204200120004101723602" + "04200320003602000f0b2001200210a7808080000b024002400240024002400240" + "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" + "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" + "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" + "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" + "20003602000b2000418002490d022001200010d080808000410021014100410028" + "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" + "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" + "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" + "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" + "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" + "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" + "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b200128020821010c" + "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" + "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" + "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" + "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" + "0320013602082000200136020c2001200336020c200120003602080f0b02404100" + "280288a0c080002201450d00410021020340200241016a2102200128020822010d" + "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" + "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" + "02410036021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110aa80808000000b820301047f200028020c" + "21020240024002402001418002490d002000280218210302400240024020022000" + "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" + "002802082201200236020c200220013602080c010b200041146a200041106a2002" + "1b21040340200421052001220241146a200241106a200228021422011b21042002" + "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" + "28021c41027441809fc080006a22012802002000460d0020034110411420032802" + "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" + "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" + "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" + "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" + "102201450d0020022001360210200120023602180b20002802142201450d002002" + "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" + "28020422034101710d002003410271450d012000280200220320016a2101024020" + "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" + "20013602a0a2c0800020022002280204417e713602042000200141017236020420" + "0220013602000c020b2000200310a7808080000b02400240024002402002280204" + "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" + "0d0320022003417871220310a7808080002000200320016a220141017236020420" + "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" + "000f0b20022003417e7136020420002001410172360204200020016a2001360200" + "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" + "80006a2102024002404100280298a2c08000220341012001410376742201710d00" + "41002003200172360298a2c08000200221010c010b200228020821010b20022000" + "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" + "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" + "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" + "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" + "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" + "4701017f23808080800041206b2200248080808000200041003602182000410136" + "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" + "80808000000b5601017f23808080800041206b2202248080808000200241106a20" + "0041106a290200370300200241086a200041086a290200370300200241013b011c" + "2002200136021820022000290200370300200210ac80808000000b110020003502" + "00410120011086808080000b5d01027f23808080800041206b2201248080808000" + "20002802182102200141106a200041106a290200370300200141086a200041086a" + "2902003703002001200036021c2001200236021820012000290200370300200110" + "d180808000000b490002402002418080c400460d00200020022001280210118180" + "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" + "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" + "808080800020022000360200200220013602042002410236020c200241f887c080" + "00360208200242023702142002418380808000ad4220862203200241046aad8437" + "0328200220032002ad843703202002200241206a360210200241086a419487c080" + "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" + "0022040d002003410171450d010b02402003410171450d00200120026a21050240" + "0240200028020c22060d0041002107200121080c010b4100210741002109200121" + "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" + "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" + "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" + "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" + "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" + "20031b21022003200120031b21010b024020040d00200028021420012002200028" + "021828020c11808080800080808080000f0b2000280204210a024020024110490d" + "0020022001200141036a417c7122076b22096a220b410371210441002106410021" + "03024020012007460d004100210302402009417c4b0d0041002103410021050340" + "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" + "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" + "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" + "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" + "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" + "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" + "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002004200d41f007716a210941002108200421030340200328" + "020c2207417f7341077620074106767241818284087120032802082207417f7341" + "077620074106767241818284087120032802042207417f73410776200741067672" + "41818284087120032802002207417f734107762007410676724181828408712008" + "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" + "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" + "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" + "03410676724181828408712103200c4101460d0220082802042207417f73410776" + "20074106767241818284087120036a2103200c4102460d0220082802082208417f" + "7341077620084106767241818284087120036a21030c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" + "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" + "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" + "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" + "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" + "0d000c030b0b200028021420012002200028021828020c11808080800080808080" + "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" + "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" + "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a210320002802102109200028021821082000280214" + "210703402003417f6a2203450d0220072009200828021011818080800080808080" + "00450d000b41010f0b200028021420012002200028021828020c11808080800080" + "808080000f0b0240200720012002200828020c1180808080008080808000450d00" + "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" + "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" + "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" + "36020c20032000360208200341b08dc08000360214200320013602102003410236" + "021c200341b183c08000360218024020022802000d002003410336025c200341e4" + "83c08000360258200342033702642003418180808000ad4220862204200341106a" + "ad8437034820032004200341086aad843703402003418280808000ad4220862003" + "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" + "808000000b200341206a41106a200241106a290200370300200341206a41086a20" + "0241086a290200370300200320022902003703202003410436025c2003419884c0" + "8000360258200342043702642003418180808000ad4220862204200341106aad84" + "37035020032004200341086aad843703482003418980808000ad42208620034120" + "6aad843703402003418280808000ad422086200341186aad843703382003200341" + "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" + "01200028020428020c11818080800080808080000b140020012000280200200028" + "020410af808080000b14002001280214200128021820001091808080000b220020" + "01280214418883c08000410e200128021828020c11808080800080808080000b60" + "01017f23808080800041306b22002480808080002000410136020c200041a883c0" + "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" + "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" + "057f017e23808080800041c0006b220524808080800041012106024020002d0004" + "0d0020002d0005210702402000280200220828021c22094104710d004101210620" + "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" + "28021828020c11808080800080808080000d012008280214200120022008280218" + "28020c11808080800080808080000d01200828021441ef97c08000410220082802" + "1828020c11808080800080808080000d0120032008200411818080800080808080" + "0021060c010b41012106024020074101710d00200828021441e984c08000410320" + "0828021828020c11808080800080808080000d01200828021c21090b4101210620" + "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" + "6a360214200520082902083702242008290200210a200520093602382005200828" + "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" + "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" + "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" + "84c080004102200528023428020c118080808000808080800021060b200041013a" + "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" + "6a2103200028020421042000280200210520002802082106410021074100210841" + "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" + "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" + "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" + "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" + "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" + "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" + "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" + "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" + "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" + "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" + "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" + "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" + "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" + "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" + "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" + "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" + "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" + "21070b20070b6001027f2000280204210220002802002103024020002802082200" + "2d0000450d00200341e084c080004104200228020c118080808000808080800045" + "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" + "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" + "41306b22032480808080002003200136020c200320003602082003410136021420" + "0341d490c080003602102003420137021c2003418280808000ad42208620034108" + "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" + "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" + "808080000b830201087f2380808080004180016b22022480808080002001280204" + "21032001280200210420002802002100200128021c220521060240200541047145" + "0d002005410872210620040d0020014281808080a0013702000b20012006410472" + "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" + "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" + "09450d000b02402007418101490d002007418001418885c08000108b8080800000" + "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" + "01200536021c200120033602042001200436020020024180016a24808080800020" + "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" + "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" + "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" + "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" + "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" + "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" + "006b22012480808080002001410636020c2001419498c08000360208024041002d" + "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" + "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" + "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" + "2003450d02200320032802002204417f6a3602002003290308210220044101470d" + "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" + "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" + "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" + "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" + "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" + "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" + "021041042103200141043a00182001200141106a360220200141186a41c08dc080" + "002000109180808000210020012d001821040240024020000d0042002102411720" + "0441ff0171764101710d01200128021c220328020021000240200341046a280200" + "22042802002205450d002000200511828080800080808080000b02402004280204" + "2204450d00200020041087808080000b2003410c108780808000410421030c010b" + "200441ff01714104460d032001290318220642807e8321022006a721030b200128" + "021022002000280208417f6a2204360208024020040d00200041003a000c200042" + "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" + "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" + "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" + "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" + "97c08000360228200142023702342001418c80808000ad422086200141106aad84" + "3703202001418280808000ad422086200141086aad843703182001200141186a36" + "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" + "6b22022480808080002002200036020c20024102360214200241a88bc080003602" + "102002420137021c2002418b8080800036022c2002200241286a36021820022002" + "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" + "808080000b200241306a2480808080000b4701017f23808080800041206b220024" + "8080808000200041003602182000410136020c200041bc90c08000360208200042" + "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" + "808080800041206b220024808080800041002d00b89ec080001a02400240024041" + "20109b808080002201450d00200141023602102001428180808010370300410029" + "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" + "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" + "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" + "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" + "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" + "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" + "41003a000020002802182202450d00200120021087808080000b02402000417f46" + "0d00200020002802042201417f6a36020420014101470d00200041201087808080" + "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" + "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" + "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" + "c08000410410af808080000be50301017f23808080800041c0006b220224808080" + "800002400240024002400240024020002d00000e0400010203000b200220002802" + "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" + "002800809bc08000360000200041086a41002900f89ac080003700002000410029" + "00f09ac08000370000200241143602102002200036020c20024114360208200241" + "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" + "86200241046aad843703202002418e80808000ad422086200241086aad84370318" + "2002200241186a36023020012802142001280218200241286a1091808080002100" + "20022802082201450d03200228020c20011087808080000c030b20002d00012100" + "2002410136022c200241d490c08000360228200242013702342002418280808000" + "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" + "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" + "02142001280218200241286a10918080800021000c020b20012000280204220028" + "0200200028020410af8080800021000c010b200028020422002802002001200028" + "0204280210118180808000808080800021000b200241c0006a2480808080002000" + "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" + "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" + "000240200141046a28020022022802002203450d00200020031182808080008080" + "8080000b024020022802042202450d00200020021087808080000b2001410c1087" + "808080000b0bf10101027f23808080800041206b22002480808080000240024002" + "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" + "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" + "410020013602d89ec08000410042808080808080013703d09ec080004100420037" + "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" + "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" + "200041003602182000410136020c200041bc9bc080003602082000420437021020" + "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" + "042480808080000240024002400240024020012802100d002001417f3602102003" + "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" + "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" + "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" + "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" + "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" + "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" + "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" + "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" + "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" + "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" + "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" + "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" + "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" + "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" + "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" + "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" + "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" + "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" + "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" + "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" + "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" + "2004410136020c2004418c91c0800036020820044204370210200441086a419491" + "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" + "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" + "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" + "80808000024020042d00084104460d00200020042903083702000c030b2001411c" + "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" + "066a210502402001280214200320066b22064b0d002000200141146a2005200610" + "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" + "002001411c6a20063602000b2001200128021041016a360210200441206a248080" + "8080000b7101027f20012802002104024020012802082205450d00200420056b20" + "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" + "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" + "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" + "0041106b2203248080808000200341086a20002802082802002001200210c98080" + "8000024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" + "046a28020022062802002207450d002001200711828080800080808080000b0240" + "20062802042206450d00200120061087808080000b2004410c1087808080000b20" + "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" + "23808080800041106b220224808080800020024100360204024002400240024020" + "01418001490d002001418010490d012001418080044f0d0220022001413f714180" + "01723a000620022001410c7641e001723a000420022001410676413f7141800172" + "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" + "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" + "418001723a00072002200141127641f001723a000420022001410676413f714180" + "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" + "00280208280200200241046a200110c980808000024020022d000822014104460d" + "0020002802042103200229030821040240024020002d0000220541044b0d002005" + "4103470d010b200328020021050240200341046a28020022062802002207450d00" + "2005200711828080800080808080000b024020062802042206450d002005200610" + "87808080000b2003410c1087808080000b200020043702000b200241106a248080" + "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" + "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" + "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" + "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" + "012002742204710d0020032000360200200020033602182000200036020c200020" + "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" + "200328020022042802044178712001470d00200421020c010b2001410041192002" + "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" + "002202450d02200341017421032002210420022802044178712001470d000b0b20" + "022802082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20002000" + "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" + "8080808000200028020c2102024002400240024020002802040e020001020b2002" + "0d0141012102410021030c020b20020d0020002802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c2001418f8080800020" + "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" + "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" + "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" + "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" + "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" + "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" + "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" + "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" + "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" + "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" + "0c010b2000410020006b41037122046a210502402004450d002000210320012106" + "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" + "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" + "0020084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a28020021060340200520062002762001280200220620" + "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" + "480d0020092101034020052001280200360200200141046a2101200541046a2205" + "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" + "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" + "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" + "067e22072003422088220820067e22062005200142208822097e7c22054220867c" + "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" + "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" + "00000c000000040000001200000013000000140000000000000000000000010000" + "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" + "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" + "2f6332663734633366393238616562353033663135623465396566353737386537" + "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" + "2e727300005f0010004b000000060a00000e000000000000000100000001000000" + "16000000170000001400000004000000180000004572726f72557466384572726f" + "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" + "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" + "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" + "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" + "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" + "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" + "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" + "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" + "000000da0110000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000b301100010000000fc011000100000000c02100009000000da0110" + "00090000000100000000000000ef0b100002000000000000000c00000004000000" + "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" + "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" + "000030783030303130323033303430353036303730383039313031313132313331" + "343135313631373138313932303231323232333234323532363237323832393330" + "333133323333333433353336333733383339343034313432343334343435343634" + "373438343935303531353235333534353535363537353835393630363136323633" + "363436353636363736383639373037313732373337343735373637373738373938" + "303831383238333834383538363837383838393930393139323933393439353936" + "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" + "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" + "00000900000072616e676520737461727420696e64657820206f7574206f662072" + "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" + "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" + "031000220000000101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000020202020202020202020202020202020202020202020202020202020202" + "030303030303030303030303030303030404040404000000000000000000000000" + "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" + "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" + "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" + "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" + "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" + "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" + "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" + "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" + "000000690000001600000042616c616e636500b8051000360000007e0000001600" + "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" + "633266373463336639323861656235303366313562346539656635373738653737" + "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" + "652e72730000004c0610004d000000230100004200000000000000000000000400" + "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" + "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" + "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" + "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" + "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" + "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" + "206973206e6f7420706f737369626c652061667465722074686520746872656164" + "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" + "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" + "130000006661696c656420746f2067656e657261746520756e6971756520746872" + "6561642049443a2062697473706163652065786861757374656400040810003700" + "0000de07100015000000c40400000d00000001000000000000007374642f737263" + "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e000081081000090000005c081000250000000f0100002900000065" + "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" + "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" + "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" + "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" + "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" + "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" + "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" + "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" + "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" + "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" + "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" + "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" + "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" + "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" + "7267657265736f75726365206275737965786563757461626c652066696c652062" + "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" + "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" + "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" + "20696e746572727570746564756e737570706f72746564756e6578706563746564" + "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" + "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" + "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" + "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" + "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" + "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" + "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" + "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" + "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" + "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" + "65637572736976656c792061637175697265206d757465789c0c10002000000073" + "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" + "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" + "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" + "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" + "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" + "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" + "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" + "726d6564207265637572736976656c79840d100038000000100000001100000012" + "000000100000001000000013000000120000000d0000000e000000150000000c00" + "00000b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a000000100000001700000019000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600000015" + "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" + "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" + "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" + "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" + "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" + "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" + "000b000000040000004305100048051000540510005f0510006a05100000c62e04" + "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" + "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" + "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" + "6c6962313067657454784669656c64313768623836623962643665383439353163" + "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" + "43757272656e744c6564676572456e7472794669656c6431376861346138303037" + "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" + "6c696231396765744c6564676572456e7472794669656c64313768633661326634" + "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" + "5f6c69623139676574506172656e744c656467657254696d653137683731643366" + "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" + "696e745f6e756d626572313768343432633966366462343461613636374506305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" + "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" + "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" + "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" + "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" + "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376833326438343961303132376564636461450b445f" + "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" + "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" + "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" + "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" + "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683562646335303561663532336432393945" + "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" + "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" + "7a652447542433666d7431376836336361623039386234313233343130450f465f" + "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" + "63745f6669656c64325f66696e6973683137683135666166363733326663303964" + "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" + "313768396461663134643536353865323530364511265f5a4e34636f726533666d" + "743577726974653137683933353534653462653731663263376145124c5f5a4e34" + "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67244754243137683230373631353664386431" + "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" + "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" + "7224475424313768323066303937633266353863396661374514525f5a4e35335f" + "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" + "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" + "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" + "577269746524475424313077726974655f63686172313768323134333931636238" + "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" + "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" + "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" + "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" + "6573657276655f616e645f68616e646c6531376862356335336362636666396436" + "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" + "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" + "4754243977726974655f7374723137683539396439653537383934366464393845" + "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" + "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" + "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" + "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" + "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" + "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" + "6563313268616e646c655f6572726f723137683937623764626430663732646437" + "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" + "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" + "44656275672447542433666d743137683132313861313631643933363438653945" + "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" + "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768613636623539636339336533383537344520615f" + "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" + "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d74313768633837363633386165616230633031664521475f" + "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376839393432316563653462383633" + "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" + "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" + "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" + "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" + "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" + "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" + "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" + "653970616e69636b696e673570616e696331376830346565623931376464393363" + "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" + "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" + "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" + "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" + "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" + "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" + "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" + "6b696e673970616e69635f666d7431376836353430636362326435666463336162" + "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" + "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" + "753230247533322447542433666d74313768626633653032323834383365333735" + "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" + "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" + "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" + "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" + "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" + "4e34636f726533666d7439466f726d617474657233706164313768343736396165" + "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" + "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" + "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" + "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" + "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" + "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" + "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" + "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" + "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" + "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" + "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" + "72656164795f626f72726f77656431376833313462353261316263343662666534" + "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" + "72756374356669656c64313768333531353864666637643465616633354537675f" + "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" + "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" + "7465244754243977726974655f7374723137683831386234396537653639613236" + "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" + "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" + "742e2e577269746524475424313077726974655f63686172313768393437396266" + "363162306130356661314539305f5a4e34636f726533666d743557726974653977" + "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" + "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" + "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" + "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" + "706c61792475323024666f7224753230246933322447542433666d743137686365" + "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" + "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" + "75672447542433666d7431376834366435353230663839333131346633453d0861" + "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" + "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" + "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" + "73746564313768333336626637613134383830343463384541425f5a4e34636f72" + "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" + "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" + "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" + "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" + "653970616e69636b696e6731336173736572745f6661696c656431376832333236" + "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768653138373433383865303762666532354545595f5a4e36305f244c542473" + "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" + "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" + "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" + "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" + "2e2e446973706c61792447542433666d7431376863653432323661613166373236" + "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" + "242447542424475424313768313636646336316162303333346331654548495f5a" + "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" + "2454244754243130696e697469616c697a65313768376635633530386461396531" + "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" + "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" + "697465244754243977726974655f616c6c31376832346238323631303436316432" + "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" + "65723138427566577269746572244c54245724475424313477726974655f616c6c" + "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" + "6170746572244c54245424475424247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376837666163663562" + "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" + "726974655f6368617231376866306233626531656331396465356537454d305f5a" + "4e34636f726533666d743557726974653977726974655f666d7431376866383830" + "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" + "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" + "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" + "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" + "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" + "645f73686f72745f6261636b747261636531376834646333646534376432323032" + "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" + "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" + "37642424753764243137686531376133393737663839633131373845533b5f5a4e" + "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" + "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" + "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" + "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" + "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" + "735f737472313768656233663732326432323465343266384555066d656d636d70" + "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" + "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d627901057275737463" + "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" + "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" + "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" + "797065732b087369676e2d657874"; + // let sender = get_tx_account_id(); + // let owner = get_current_escrow_account_id(); + // let dest = get_current_escrow_destination(); + // let dest_balance = get_account_balance(dest); + // let escrow_data = get_current_escrow_data(); + // let ed_str = String::from_utf8(escrow_data).unwrap(); + // let threshold_balance = ed_str.parse::().unwrap(); + // let pl_time = host_lib::getParentLedgerTime(); + // let e_time = get_current_escrow_finish_after(); + // sender == owner && dest_balance <= threshold_balance && + // pl_time >= e_time + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + // basic FinishFunction situation + Env env(*this); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto escrowCreate = escrow(alice, carol, XRP(1000)); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrowCreate, + finish_function(wasmHex), + finish_time(env.now() + 11s), + cancel_time(env.now() + 100s), + data("1000000000"), // 1000 XRP in drops + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + // FinishAfter time hasn't passed + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecNO_PERMISSION)); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + // destination balance is too high + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + + env.close(); + + // reduce the destination balance + env(pay(carol, alice, XRP(4500))); + env.close(); + + // tx sender not escrow creator (alice) + env(finish(carol, alice, seq), + fee(txnFees), + ter(tecWASM_REJECTED)); + env.close(); + + env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + } + } + } + void run() override { @@ -2039,6 +3228,7 @@ struct Escrow_test : public beast::unit_test::suite testCredentials(); testFinishFunctionPreflight(); testFinishFunction(); + testAllHostFunctions(); } }; diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 16bb966317d..8a5e30a0011 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -372,6 +372,32 @@ struct finish_function } }; +struct data +{ +private: + std::string value_; + +public: + explicit data(std::string func) : value_(func) + { + } + + explicit data(Slice const& func) : value_(strHex(func)) + { + } + + template + explicit data(std::array const& f) : data(makeSlice(f)) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfData.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/xrpld/app/misc/AMMUtils.h b/src/xrpld/app/misc/AMMUtils.h index ebc28341097..b2c0007dc77 100644 --- a/src/xrpld/app/misc/AMMUtils.h +++ b/src/xrpld/app/misc/AMMUtils.h @@ -17,8 +17,8 @@ */ //============================================================================== -#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED -#define RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#ifndef RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED +#define RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED #include @@ -127,4 +127,4 @@ isOnlyLiquidityProvider( } // namespace ripple -#endif // RIPPLE_APP_MISC_AMMUTILS_H_INLCUDED +#endif // RIPPLE_APP_MISC_AMMUTILS_H_INCLUDED diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 9ecbe22f31d..fe1b02a53b2 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -17,9 +17,9 @@ */ //============================================================================== -#include "xrpld/app/misc/WasmHostFuncImpl.h" +#include -#include "xrpl/protocol/digest.h" +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index d1e14e4246e..796c1ee6bb9 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 89eace193a3..055fbc14995 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -588,7 +588,8 @@ EscrowFinish::doApply() WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, 100000); + std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From f37d52d8e95ab2c819f230007b5c476f911be39f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 24 Apr 2025 08:47:13 -0400 Subject: [PATCH 005/212] Set up fees for WASM processing (#5393) * set up fields * throw error if allowance is too high * votable gas price * fix comments * hook everything together * make test less flaky (hopefully) * fix other tests * fix some tests * fix tests * clean up * add more tests * uncomment other tests * respond to comments * fix build * respond to comments --- cfg/rippled-example.cfg | 11 +- include/xrpl/protocol/Fees.h | 3 + include/xrpl/protocol/TER.h | 2 + .../xrpl/protocol/detail/ledger_entries.macro | 1 + include/xrpl/protocol/detail/sfields.macro | 2 + .../xrpl/protocol/detail/transactions.macro | 6 +- include/xrpl/protocol/jss.h | 1 + src/libxrpl/protocol/STValidation.cpp | 1 + src/libxrpl/protocol/TER.cpp | 2 + src/test/app/Escrow_test.cpp | 211 ++++++++++++++++-- src/test/app/FeeVote_test.cpp | 17 +- src/test/app/PseudoTx_test.cpp | 1 + src/test/jtx/TestHelpers.h | 17 ++ src/test/jtx/impl/envconfig.cpp | 3 + src/xrpld/app/ledger/Ledger.cpp | 11 +- src/xrpld/app/misc/FeeVoteImpl.cpp | 9 +- src/xrpld/app/misc/NetworkOPs.cpp | 7 + src/xrpld/app/tx/detail/Change.cpp | 7 +- src/xrpld/app/tx/detail/Escrow.cpp | 72 +++++- src/xrpld/core/Config.h | 3 + src/xrpld/core/detail/Config.cpp | 2 + 21 files changed, 342 insertions(+), 47 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 7affa212ab9..6da68410526 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1271,8 +1271,17 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_size_limit = 2000000 # 2 mb +# +# gas_price = # +# The gas price is the conversion between WASM gas and its price in drops. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# gas_price = 2000000 # 2 drops per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index a89bd4e4863..1a1ecacb362 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -24,6 +24,8 @@ namespace ripple { +constexpr std::uint32_t MICRO_DROPS_PER_DROP{1'000'000}; + /** Reflects the fee settings for a particular ledger. The fees are always the same for any transactions applied @@ -37,6 +39,7 @@ struct Fees std::uint32_t extensionComputeLimit{ 0}; // Extension compute limit (instructions) std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) + std::uint32_t gasPrice{0}; // price of WASM gas (micro-drops) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 4f544963f03..caf05daf766 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -185,6 +185,8 @@ enum TEFcodes : TERUnderlyingType { tefNO_TICKET, tefNFTOKEN_IS_NOT_TRANSFERABLE, tefINVALID_LEDGER_FIX_TYPE, + tefNO_WASM, + tefWASM_FIELD_NOT_INCLUDED, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 2d4a3453eaa..08849f0fa6c 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -319,6 +319,7 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ // New fields {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 42a706c4de1..65a4bfcbc1e 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -114,6 +114,8 @@ TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 52) TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 53) +TYPED_SFIELD(sfGasPrice, UINT32, 54) +TYPED_SFIELD(sfComputationAllowance, UINT32, 55) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 19c31d439b5..f9d70ea6dbb 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -59,6 +59,7 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, ({ {sfFulfillment, soeOPTIONAL}, {sfCondition, soeOPTIONAL}, {sfCredentialIDs, soeOPTIONAL}, + {sfComputationAllowance, soeOPTIONAL}, })) @@ -490,8 +491,9 @@ TRANSACTION(ttFEE, 101, SetFee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, - {sfExtensionComputeLimit, soeOPTIONAL}, - {sfExtensionSizeLimit, soeOPTIONAL}, + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index fa34cf800b7..96aefb07880 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -267,6 +267,7 @@ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info JSS(extension_compute); // out: NetworkOps JSS(extension_size); // out: NetworkOps +JSS(gas_price); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 948a47f0ac9..3a9d16445e4 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -81,6 +81,7 @@ STValidation::validationFormat() // featureSmartEscrow {sfExtensionComputeLimit, soeOPTIONAL}, {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, }; // clang-format on diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 3766f33c548..6a2387035bf 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -147,6 +147,8 @@ transResults() MAKE_ERROR(tefNO_TICKET, "Ticket is not in ledger."), MAKE_ERROR(tefNFTOKEN_IS_NOT_TRANSFERABLE, "The specified NFToken is not transferable."), MAKE_ERROR(tefINVALID_LEDGER_FIX_TYPE, "The LedgerFixType field has an invalid value."), + MAKE_ERROR(tefNO_WASM, "There is no WASM code to run, but a WASM-specific field was included."), + MAKE_ERROR(tefWASM_FIELD_NOT_INCLUDED, "WASM code requires a field to be included that was not included."), MAKE_ERROR(telLOCAL_ERROR, "Local failure."), MAKE_ERROR(telBAD_DOMAIN, "Domain too long."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6c0e32179e8..6b25da63631 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1659,7 +1659,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishFunctionPreflight() + testCreateFinishFunctionPreflight() { testcase("Test preflight checks involving FinishFunction"); @@ -1703,12 +1703,37 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } - Env env(*this); + { + // FinishFunction > max length + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + })); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow(alice, carol, XRP(500)); + + // 11-byte string + std::string longWasmHex = "00112233445566778899AA"; + env(escrowCreate, + finish_function(longWasmHex), + cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + })); XRPAmount const txnFees = env.current()->fees().base + 1000; // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow(alice, carol, XRP(1000)); + auto escrowCreate = escrow(alice, carol, XRP(500)); // Success situations { @@ -1794,23 +1819,132 @@ struct Escrow_test : public beast::unit_test::suite ter(temMALFORMED)); env.close(); } - // { - // // FinishFunction > max length - // std::string longWasmHex = "00"; - // // TODO: fix to use the config setting - // // TODO: make this test more efficient - // // uncomment when that's done - // for (int i = 0; i < 4294967295; i++) - // { - // longWasmHex += "11"; - // } - // env(escrowCreate, - // finish_function(longWasmHex), - // cancel_time(env.now() + 100s), - // fee(txnFees), - // ter(temMALFORMED)); - // env.close(); + } + + void + testFinishWasmFailures() + { + testcase("EscrowFinish Smart Escrow failures"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // #[no_mangle] + // pub fn ready() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5} // } + static auto wasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" + "6467657253716e0000030201000405017001010105030100100619037f01418080" + "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" + "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" + "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" + "6765744c656467657253716e313768303033306666356636376562356638314501" + "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" + "756365727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38332e302d6e696768746c79202863326637346333" + "663920323032342d30392d30392900490f7461726765745f666561747572657304" + "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" + "666572656e63652d74797065732b087369676e2d657874"; + + { + // featureSmartEscrow disabled + Env env(*this, supported_amendments() - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + env(finish(carol, alice, 1), + fee(txnFees), + comp_allowance(110), + ter(temDISABLED)); + env.close(); + } + + { + // ComputationAllowance > max compute limit + Env env(*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + })); + env.fund(XRP(5000), alice, carol); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + auto const allowance = 1'001; + env(finish(carol, alice, 1), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(temBAD_LIMIT)); + } + + Env env(*this); + + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + XRPAmount const txnFees = env.current()->fees().base + 1000; + env.fund(XRP(5000), alice, carol); + + // create escrow + auto const seq = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_function(wasmHex), + cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + { + // no ComputationAllowance field + env(finish(carol, alice, seq), ter(tefWASM_FIELD_NOT_INCLUDED)); + } + + { + // not enough fees + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 109; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(110), + ter(telINSUF_FEE_P)); + } + + { + // not enough gas + // This function takes 110 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 108; + env(finish(carol, alice, seq), + fee(finishFee), + comp_allowance(108), + ter(tecFAILED_PROCESSING)); + } + + { + // ComputationAllowance field included w/no FinishFunction on + // escrow + auto const seq2 = env.seq(alice); + env(escrow(alice, carol, XRP(500)), + finish_time(env.now() + 10s), + cancel_time(env.now() + 100s)); + env.close(); + + auto const allowance = 100; + env(finish(carol, alice, seq2), + fee(env.current()->fees().base + allowance), + comp_allowance(allowance), + ter(tefNO_WASM)); + } } void @@ -1865,22 +1999,30 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(carol, XRP(5000))); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + fee(txnFees), + comp_allowance(110), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -1910,29 +2052,34 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(finish(carol, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // no fulfillment provided, function succeeds env(finish(alice, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb2), + comp_allowance(110), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb1), + comp_allowance(110), fee(txnFees), ter(tesSUCCESS)); env.close(); @@ -1965,16 +2112,19 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees + 1), ter(tesSUCCESS)); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2004,17 +2154,22 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(finish(carol, alice, seq), + comp_allowance(110), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // finish time has passed, function succeeds, tx succeeds - env(finish(carol, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(carol, alice, seq), + comp_allowance(110), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3175,19 +3330,24 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); + auto const allowance = 40'000; + // FinishAfter time hasn't passed env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); // destination balance is too high env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); @@ -3199,11 +3359,15 @@ struct Escrow_test : public beast::unit_test::suite // tx sender not escrow creator (alice) env(finish(carol, alice, seq), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); - env(finish(alice, alice, seq), fee(txnFees), ter(tesSUCCESS)); + env(finish(alice, alice, seq), + comp_allowance(allowance), + fee(txnFees), + ter(tesSUCCESS)); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -3226,7 +3390,8 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(); testEscrowWithTickets(); testCredentials(); - testFinishFunctionPreflight(); + testCreateFinishFunctionPreflight(); + testFinishWasmFailures(); testFinishFunction(); testAllHostFunctions(); } diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 73bb539a222..8e333b27eae 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -43,6 +43,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -51,13 +52,15 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = 1234567", "owner_reserve = 1234", "extension_compute_limit = 100", - "extension_size_limit = 200"}); + "extension_size_limit = 200", + " gas_price = 300"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); BEAST_EXPECT(setup.extension_compute_limit == 100); BEAST_EXPECT(setup.extension_size_limit == 200); + BEAST_EXPECT(setup.gas_price == 300); } { Section config; @@ -66,7 +69,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = yada", "owner_reserve = foo", "extension_compute_limit = bar", - "extension_size_limit = baz"}); + "extension_size_limit = baz", + "gas_price = qux"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -78,6 +82,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; @@ -86,7 +91,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = -1234567", "owner_reserve = -1234", "extension_compute_limit = -100", - "extension_size_limit = -200"}); + "extension_size_limit = -200", + "gas_price = -300"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -99,6 +105,7 @@ class FeeVote_test : public beast::unit_test::suite static_cast(-100)); BEAST_EXPECT( setup.extension_size_limit == static_cast(-200)); + BEAST_EXPECT(setup.gas_price == static_cast(-300)); } { const auto big64 = std::to_string( @@ -111,7 +118,8 @@ class FeeVote_test : public beast::unit_test::suite "account_reserve = " + big64, "owner_reserve = " + big64, "extension_compute_limit = " + big64, - "extension_size_limit = " + big64}); + "extension_size_limit = " + big64, + "gas_price = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -123,6 +131,7 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT( setup.extension_size_limit == defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 1101f56c699..0ba7b0e5ba3 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -54,6 +54,7 @@ struct PseudoTx_test : public beast::unit_test::suite { obj[sfExtensionComputeLimit] = 0; obj[sfExtensionSizeLimit] = 0; + obj[sfGasPrice] = 0; } })); diff --git a/src/test/jtx/TestHelpers.h b/src/test/jtx/TestHelpers.h index 8a5e30a0011..b77b00b00c1 100644 --- a/src/test/jtx/TestHelpers.h +++ b/src/test/jtx/TestHelpers.h @@ -398,6 +398,23 @@ struct data } }; +struct comp_allowance +{ +private: + std::uint32_t value_; + +public: + explicit comp_allowance(std::uint32_t const& value) : value_(value) + { + } + + void + operator()(Env&, JTx& jt) const + { + jt.jv[sfComputationAllowance.jsonName] = value_; + } +}; + /* Payment Channel */ /******************************************************************************/ diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index b94c79ccb85..ab0969c6cb8 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -33,11 +33,14 @@ setupConfigForUnitTests(Config& cfg) using namespace jtx; // Default fees to old values, so tests don't have to worry about changes in // Config.h + // NOTE: For new `FEES` fields, you need to wait for the first flag ledger + // to close for the values to be activated. cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); cfg.FEES.extension_compute_limit = 4294967295; cfg.FEES.extension_size_limit = 4294967295; + cfg.FEES.gas_price = 1000000; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index d3c59fbeb69..d9a0dce1513 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -228,6 +228,7 @@ Ledger::Ledger( sle->at(sfExtensionComputeLimit) = config.FEES.extension_compute_limit; sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + sle->at(sfGasPrice) = config.FEES.gas_price; } rawInsert(sle); } @@ -659,6 +660,7 @@ Ledger::setup() auto const extensionComputeLimit = sle->at(~sfExtensionComputeLimit); auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + auto const gasPrice = sle->at(~sfGasPrice); auto assign = [](std::uint32_t& dest, std::optional const& src) { @@ -669,7 +671,9 @@ Ledger::setup() }; assign(fees_.extensionComputeLimit, extensionComputeLimit); assign(fees_.extensionSizeLimit, extensionSizeLimit); - extensionFees = extensionComputeLimit || extensionSizeLimit; + assign(fees_.gasPrice, gasPrice); + extensionFees = + extensionComputeLimit || extensionSizeLimit || gasPrice; } if (oldFees && newFees) // Should be all of one or the other, but not both @@ -701,7 +705,8 @@ Ledger::defaultFees(Config const& config) { assert( fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && - fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0); + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0 && + fees_.gasPrice == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) @@ -710,6 +715,8 @@ Ledger::defaultFees(Config const& config) fees_.extensionComputeLimit = config.FEES.extension_compute_limit; if (fees_.extensionSizeLimit == 0) fees_.extensionSizeLimit = config.FEES.extension_size_limit; + if (fees_.gasPrice == 0) + fees_.gasPrice = config.FEES.gas_price; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index e312ab042f8..6c6e2f08655 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -216,6 +216,7 @@ FeeVoteImpl::doValidation( target_.extension_size_limit, "extension size limit", sfExtensionSizeLimit); + vote(lastFees.gasPrice, target_.gas_price, "gas price", sfGasPrice); } } @@ -247,6 +248,9 @@ FeeVoteImpl::doVoting( lastClosedLedger->fees().extensionSizeLimit, target_.extension_size_limit); + detail::VotableValue gasPriceVote( + lastClosedLedger->fees().gasPrice, target_.gas_price); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { @@ -332,6 +336,7 @@ FeeVoteImpl::doVoting( continue; doVote(val, extensionComputeVote, sfExtensionComputeLimit); doVote(val, extensionSizeVote, sfExtensionSizeLimit); + doVote(val, gasPriceVote, sfGasPrice); } } @@ -344,12 +349,13 @@ FeeVoteImpl::doVoting( auto const incReserve = incReserveVote.getVotes(); auto const extensionCompute = extensionComputeVote.getVotes(); auto const extensionSize = extensionSizeVote.getVotes(); + auto const gasPrice = gasPriceVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position if (baseFee.second || baseReserve.second || incReserve.second || - extensionCompute.second || extensionSize.second) + extensionCompute.second || extensionSize.second || gasPrice.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -381,6 +387,7 @@ FeeVoteImpl::doVoting( { obj[sfExtensionComputeLimit] = extensionCompute.first; obj[sfExtensionSizeLimit] = extensionSize.first; + obj[sfGasPrice] = gasPrice.first; } }); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index b721c80bfde..049a47bc232 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2295,6 +2295,9 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) extensionSizeLimit) jvObj[jss::extension_size] = *extensionSizeLimit; + if (auto const gasPrice = ~val->at(~sfGasPrice); gasPrice) + jvObj[jss::gas_price] = *gasPrice; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2758,6 +2761,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); @@ -2773,6 +2777,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; } if (auto const closeOffset = app_.timeKeeper().closeOffset(); @@ -2965,6 +2970,7 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().extensionComputeLimit; jvObj[jss::extension_size] = lpAccepted->fees().extensionSizeLimit; + jvObj[jss::gas_price] = lpAccepted->fees().gasPrice; } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -4007,6 +4013,7 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::extension_compute] = lpClosed->fees().extensionComputeLimit; jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + jvResult[jss::gas_price] = lpClosed->fees().gasPrice; } } diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index e40e61ff94e..7d84e003fb5 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -133,13 +133,15 @@ Change::preclaim(PreclaimContext const& ctx) if (ctx.view.rules().enabled(featureSmartEscrow)) { if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - !ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + !ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + !ctx.tx.isFieldPresent(sfGasPrice)) return temMALFORMED; } else { if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || - ctx.tx.isFieldPresent(sfExtensionSizeLimit)) + ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + ctx.tx.isFieldPresent(sfGasPrice)) return temDISABLED; } return tesSUCCESS; @@ -393,6 +395,7 @@ Change::applyFee() { set(feeObject, ctx_.tx, sfExtensionComputeLimit); set(feeObject, ctx_.tx, sfExtensionSizeLimit); + set(feeObject, ctx_.tx, sfGasPrice); } view().update(feeObject); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 055fbc14995..ab91274326d 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -34,6 +34,8 @@ #include #include +#include + // During an EscrowFinish, the transaction must specify both // a condition and a fulfillment. We track whether that // fulfillment matches and validates the condition. @@ -361,6 +363,13 @@ EscrowFinish::preflight(PreflightContext const& ctx) !ctx.rules.enabled(featureCredentials)) return temDISABLED; + if (ctx.tx.isFieldPresent(sfComputationAllowance) && + !ctx.rules.enabled(featureSmartEscrow)) + { + JLOG(ctx.j.debug()) << "SmartEscrow not enabled"; + return temDISABLED; + } + if (auto const ret = preflight1(ctx); !isTesSuccess(ret)) return ret; @@ -402,6 +411,16 @@ EscrowFinish::preflight(PreflightContext const& ctx) } } + if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) + { + if (*allowance > ctx.app.config().FEES.extension_compute_limit) + { + JLOG(ctx.j.debug()) + << "ComputationAllowance too large: " << *allowance; + return temBAD_LIMIT; + } + } + if (auto const err = credentials::checkFields(ctx); !isTesSuccess(err)) return err; @@ -417,8 +436,10 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } - // TODO: make this fee increase based on the extra compute run - + if (auto const allowance = tx[~sfComputationAllowance]; allowance) + { + extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + } return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -428,6 +449,34 @@ EscrowFinish::preclaim(PreclaimContext const& ctx) if (!ctx.view.rules().enabled(featureCredentials)) return Transactor::preclaim(ctx); + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + // this check is done in doApply before this amendment is enabled + auto const k = keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); + auto const slep = ctx.view.read(k); + if (!slep) + return tecNO_TARGET; + + if (slep->isFieldPresent(sfFinishFunction)) + { + if (!ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) + << "FinishFunction requires ComputationAllowance"; + return tefWASM_FIELD_NOT_INCLUDED; + } + } + else + { + if (ctx.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(ctx.j.debug()) << "FinishFunction not present, " + "ComputationAllowance present"; + return tefNO_WASM; + } + } + } + if (auto const err = credentials::valid(ctx, ctx.tx[sfAccount]); !isTesSuccess(err)) return err; @@ -441,7 +490,8 @@ EscrowFinish::doApply() auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); auto const slep = ctx_.view().peek(k); if (!slep) - return tecNO_TARGET; + return ctx_.view().rules().enabled(featureSmartEscrow) ? tecINTERNAL + : tecNO_TARGET; // Order of processing the release conditions (in order of performance): // FinishAfter/CancelAfter @@ -579,17 +629,15 @@ EscrowFinish::doApply() std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("ready"); - auto const escrowTx = - ctx_.tx.getJson(JsonOptions::none).toStyledString(); - auto const escrowObj = - slep->getJson(JsonOptions::none).toStyledString(); - std::vector escrowTxData(escrowTx.begin(), escrowTx.end()); - std::vector escrowObjData(escrowObj.begin(), escrowObj.end()); - WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - std::uint32_t gasLimit = ctx_.app.config().FEES.extension_compute_limit; - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, gasLimit); + if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) + { + // already checked above, this check is just in case + return tecINTERNAL; + } + std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 8e29ecdcf41..4b297c8610d 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -79,6 +79,9 @@ struct FeeSetup /** The WASM size limit for Feature Extensions. */ std::uint32_t extension_size_limit{4294967295}; + /** The price of 1 WASM gas, in micro-drops. */ + std::uint32_t gas_price{1000000}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index fb4a4aab211..97d6d5fd9d5 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1108,6 +1108,8 @@ setup_FeeVote(Section const& section) setup.extension_compute_limit = temp; if (set(temp, "extension_size_limit", section)) setup.extension_size_limit = temp; + if (set(temp, "gas_price", section)) + setup.gas_price = temp; } return setup; } From f8b2fe4dd5f24f6b91b727147e21017bc43f66d3 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 28 Apr 2025 17:43:15 -0400 Subject: [PATCH 006/212] fix imports --- src/xrpld/rpc/handlers/PayChanClaim.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/rpc/handlers/PayChanClaim.cpp b/src/xrpld/rpc/handlers/PayChanClaim.cpp index 084f41db85d..b62f5e54e55 100644 --- a/src/xrpld/rpc/handlers/PayChanClaim.cpp +++ b/src/xrpld/rpc/handlers/PayChanClaim.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include #include From f03b5883bd87440bdc4d2996d8e3bcc5a84e8dad Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 12:39:12 -0400 Subject: [PATCH 007/212] More host functions (#5411) * getNFT * escrow keylet * account keylet * credential keylet * oracle keylet * hook everything in * fix stuff --- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 115 +++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 19 ++ src/xrpld/app/misc/WasmVM.cpp | 241 ++++++++++++++++++++++++ src/xrpld/app/misc/WasmVM.h | 33 ++++ 4 files changed, 408 insertions(+) diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index fe1b02a53b2..0383b15662b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -18,6 +18,7 @@ //============================================================================== #include +#include #include @@ -98,6 +99,33 @@ WasmHostFunctionsImpl::getCurrentLedgerEntryField(const std::string& fname) return std::nullopt; } +std::optional +WasmHostFunctionsImpl::getNFT( + const std::string& account, + const std::string& nftId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + uint256 nftHash; + if (!nftHash.parseHex(nftId)) + { + return std::nullopt; + } + + auto jv = nft::findToken(ctx.view(), accountId.value(), nftHash); + if (!jv) + { + return std::nullopt; + } + + Slice const s = (*jv)[sfURI]; + return Bytes{s.begin(), s.end()}; +} + bool WasmHostFunctionsImpl::updateData(const Bytes& data) { @@ -115,4 +143,91 @@ WasmHostFunctionsImpl::computeSha512HalfHash(const Bytes& data) auto const hash = sha512Half(data); return uint256::fromVoid(hash.data()); } + +std::optional +WasmHostFunctionsImpl::accountKeylet(const std::string& account) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::account(*accountId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::credentialKeylet( + const std::string& subject, + const std::string& issuer, + const std::string& credentialType) +{ + auto const subjectId = parseBase58(subject); + if (!subjectId || subjectId->isZero()) + { + return std::nullopt; + } + + auto const issuerId = parseBase58(issuer); + if (!issuerId || issuerId->isZero()) + { + return std::nullopt; + } + + auto keylet = + keylet::credential(*subjectId, *issuerId, makeSlice(credentialType)) + .key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::escrowKeylet( + const std::string& account, + const std::uint32_t& seq) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::escrow(*accountId, seq).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} + +std::optional +WasmHostFunctionsImpl::oracleKeylet( + const std::string& account, + const std::uint32_t& documentId) +{ + auto const accountId = parseBase58(account); + if (!accountId || accountId->isZero()) + { + return std::nullopt; + } + + auto keylet = keylet::oracle(*accountId, documentId).key; + if (!keylet) + { + return std::nullopt; + } + + return Bytes{keylet.begin(), keylet.end()}; +} } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a311073d7b6..aa42f79ff6b 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -54,12 +54,31 @@ class WasmHostFunctionsImpl : public HostFunctions std::optional getCurrentLedgerEntryField(std::string const& fname) override; + std::optional + getNFT(std::string const& account, std::string const& nftId) override; + bool updateData(Bytes const& data) override; Hash computeSha512HalfHash(Bytes const& data) override; + std::optional + accountKeylet(std::string const& account) override; + + std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) override; + + std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) override; + + std::optional + oracleKeylet(std::string const& account, std::uint32_t const& documentId) + override; + private: ApplyContext& ctx; Keylet leKey; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 22ac65479fb..1764734db36 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -220,6 +220,148 @@ getCurrentLedgerEntryField( return WasmEdge_Result_Success; } +WasmEdge_Result +getNFT( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto nftId = getFieldName(fm, in, 2); + if (!nftId) + return nftId.error(); + + auto nftURI = + ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); + if (!nftURI) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, nftURI.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +accountKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +credentialKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto subject = getFieldName(fm, in, 0); + if (!subject) + return subject.error(); + + auto issuer = getFieldName(fm, in, 2); + if (!issuer) + return issuer.error(); + + auto credentialType = getFieldName(fm, in, 4); + if (!credentialType) + return credentialType.error(); + + auto keylet = + ((HostFunctions*)data) + ->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +escrowKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto sequence = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + +WasmEdge_Result +oracleKeylet( + void* data, + const WasmEdge_CallingFrameContext* fm, + const WasmEdge_Value* in, + WasmEdge_Value* out) +{ + auto account = getFieldName(fm, in, 0); + if (!account) + return account.error(); + + auto documentId = WasmEdge_ValueGetI32(in[2]); + + auto keylet = + ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); + if (!keylet) + return WasmEdge_Result_Fail; + + auto pointer = setData(fm, keylet.value()); + if (!pointer) + return pointer.error(); + + out[0] = pointer.value(); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return WasmEdge_Result_Success; +} + WasmEdge_Result updateData( void* data, @@ -393,6 +535,25 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // getNFT + { + WasmEdge_ValType inputList[4] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // updateData { WasmEdge_ValType inputList[2] = { @@ -428,6 +589,86 @@ runEscrowWasm( WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); // WasmEdge_StringDelete(fName); } + // accountKeylet + { + WasmEdge_ValType inputList[2] = { + WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, accountKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("accountKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // credentialKeylet + { + WasmEdge_ValType inputList[6] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, credentialKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + WasmEdge_String fName = + WasmEdge_StringCreateByCString("credentialKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // escrowKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, escrowKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("escrowKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } + // oracleKeylet + { + WasmEdge_ValType inputList[3] = { + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32(), + WasmEdge_ValTypeGenI32()}; + WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; + WasmEdge_FunctionTypeContext* hostFuncType = + WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); + WasmEdge_FunctionInstanceContext* hostFunc = + WasmEdge_FunctionInstanceCreate( + hostFuncType, oracleKeylet, hfs, 100); + // WasmEdge_FunctionTypeDelete(hostFuncType); + // WasmEdge_FunctionInstanceDelete(hostFunc); + + WasmEdge_String fName = + WasmEdge_StringCreateByCString("oracleKeylet"); + WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); + // WasmEdge_StringDelete(fName); + } // print { WasmEdge_ValType inputList[2] = { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 796c1ee6bb9..b0839dc76de 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -74,6 +74,12 @@ struct HostFunctions return Bytes{}; } + virtual std::optional + getNFT(std::string const& account, std::string const& nftId) + { + return Bytes{}; + } + virtual bool updateData(Bytes const& data) { @@ -86,6 +92,33 @@ struct HostFunctions return Hash{}; } + virtual std::optional + accountKeylet(std::string const& account) + { + return Bytes{}; + } + + virtual std::optional + credentialKeylet( + std::string const& subject, + std::string const& issuer, + std::string const& credentialType) + { + return Bytes{}; + } + + virtual std::optional + escrowKeylet(std::string const& account, std::uint32_t const& seq) + { + return Bytes{}; + } + + virtual std::optional + oracleKeylet(std::string const& account, std::uint32_t const& docId) + { + return Bytes{}; + } + virtual ~HostFunctions() = default; }; From 4670b373c10f2e093ff8670557af882e535d6a3f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 14:10:27 -0400 Subject: [PATCH 008/212] try to fix tests --- src/test/app/Escrow_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 81f1f9724e6..da62a590c17 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1756,7 +1756,7 @@ struct Escrow_test : public beast::unit_test::suite cfg->START_UP = Config::FRESH; return cfg; })); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -2064,7 +2064,7 @@ struct Escrow_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = env.current()->fees().base * 10 + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), From 9c0204906c4c82b3a1a4f201fa375abc6abc50d2 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Apr 2025 15:25:00 -0400 Subject: [PATCH 009/212] fix reference fee tests --- src/test/app/Escrow_test.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index da62a590c17..52a077615f6 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1977,7 +1977,7 @@ struct Escrow_test : public beast::unit_test::suite void testFinishFunction() { - testcase("PoC escrow function"); + testcase("Example escrow function"); using namespace jtx; using namespace std::chrono; @@ -2059,24 +2059,27 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + Condition Env env(*this); - // create escrow env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + auto const seq = env.seq(alice); + // create escrow auto escrowCreate = escrow(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + 1000; + XRPAmount const createFee = env.current()->fees().base + 1000; env(escrowCreate, finish_function(wasmHex), condition(cb1), cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); + XRPAmount const txnFees = + env.current()->fees().base * 34 + 1000; + // no fulfillment provided, function fails env(finish(carol, alice, seq), comp_allowance(110), From bb9bc764bcc2990b534554a596c0f69d338dd402 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 1 May 2025 18:02:06 -0400 Subject: [PATCH 010/212] Switch to WAMR (#5416) * Switch to WAMR --- .github/actions/dependencies/action.yml | 1 + .github/workflows/nix.yml | 1 + BUILD.md | 11 + CMakeLists.txt | 2 +- cmake/RippledCore.cmake | 2 +- conanfile.py | 2 +- external/wamr/conandata.yml | 6 + external/wamr/conanfile.py | 90 +++ external/wamr/patches/ripp_metering.patch | 417 ++++++++++++ src/test/app/Escrow_test.cpp | 7 +- src/test/app/Wasm_test.cpp | 154 ++--- src/xrpld/app/misc/WamrVM.cpp | 754 ++++++++++++++++++++ src/xrpld/app/misc/WamrVM.h | 264 +++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 8 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 392 +++++++++++ src/xrpld/app/misc/WasmHostFuncWrapper.h | 113 +++ src/xrpld/app/misc/WasmVM.cpp | 756 ++------------------- src/xrpld/app/misc/WasmVM.h | 249 ++++++- 18 files changed, 2427 insertions(+), 802 deletions(-) create mode 100644 external/wamr/conandata.yml create mode 100644 external/wamr/conanfile.py create mode 100644 external/wamr/patches/ripp_metering.patch create mode 100644 src/xrpld/app/misc/WamrVM.cpp create mode 100644 src/xrpld/app/misc/WamrVM.h create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.cpp create mode 100644 src/xrpld/app/misc/WasmHostFuncWrapper.h diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index afce1557d3b..c251daa9369 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -17,6 +17,7 @@ runs: conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ + conan export -k external/wamr wamr/2.2.0@ - name: add Ripple Conan remote shell: bash run: | diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index d9a67a63e95..2ea9b325448 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -351,6 +351,7 @@ jobs: conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default conan export external/snappy snappy/1.1.10@ conan export external/soci soci/4.0.3@ + conan export -k external/wamr wamr/2.2.0@ - name: build dependencies run: | diff --git a/BUILD.md b/BUILD.md index fd985dce817..d348f2d670d 100644 --- a/BUILD.md +++ b/BUILD.md @@ -204,6 +204,17 @@ It fixes some source files to add missing `#include`s. conan export --version 2.0.8 external/nudb ``` +Export our [Conan recipe for WAMR](./external/wamr). +It add metering and expose some internal structures. + + + ``` + # Conan 1.x + conan export external/wamr wamr/2.2.0@ + # Conan 2.x + conan export --version 2.2.0 external/wamr + ``` + ### Build and Test 1. Create a build directory and move into it. diff --git a/CMakeLists.txt b/CMakeLists.txt index 28cfd2322a1..702cb41a0a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -103,7 +103,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) -find_package(wasmedge REQUIRED) +find_package(wamr REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index d4ff75434ea..ec56323926b 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,7 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> - wasmedge::wasmedge + wamr::wamr ) include(add_module) diff --git a/conanfile.py b/conanfile.py index d49f45903e0..a0b1602daa6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -33,7 +33,7 @@ class Xrpl(ConanFile): 'soci/4.0.3', 'xxhash/0.8.2', 'zlib/1.3.1', - 'wasmedge/0.14.1', + 'wamr/2.2.0', ] tool_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml new file mode 100644 index 00000000000..6c49946ecab --- /dev/null +++ b/external/wamr/conandata.yml @@ -0,0 +1,6 @@ +patches: + 2.2.0: + - patch_description: add metering to iwasm interpreter + patch_file: patches/ripp_metering.patch + patch_type: conan + diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py new file mode 100644 index 00000000000..d54bb6f98fb --- /dev/null +++ b/external/wamr/conanfile.py @@ -0,0 +1,90 @@ +from conans import ConanFile, tools +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy +import os +import json + +required_conan_version = ">=1.55.0" + +class WamrConan(ConanFile): + name = "wamr" + version = "2.2.0" + license = "Apache License v2.0" + url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" + description = "Webassembly micro runtime" + package_type = "library" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + generators = "CMakeToolchain", "CMakeDeps" + #requires = [("llvm/20.1.1@")] + + def export_sources(self): + export_conandata_patches(self) + pass + + + #def build_requirements(self): + # self.tool_requires("llvm/20.1.1") + + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + + def layout(self): + cmake_layout(self, src_folder="src") + + + def source(self): + git = tools.Git() + git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) + #get(self, **self.conan_data["sources"][self.version], strip_root=True) + + + def generate(self): + tc = CMakeToolchain(self) + + tc.variables["WAMR_BUILD_INTERP"] = 1 + tc.variables["WAMR_BUILD_FAST_INTERP"] = 1 + tc.variables["WAMR_BUILD_INSTRUCTION_METERING"] = 1 + tc.variables["WAMR_BUILD_AOT"] = 0 + tc.variables["WAMR_BUILD_JIT"] = 0 + tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 + tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 + #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + #ll_dep = self.dependencies["llvm"] + #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.generate() + + # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder + deps = CMakeDeps(self) + deps.generate() + + + def build(self): + apply_conandata_patches(self) + cmake = CMake(self) + cmake.verbose = True + cmake.configure() + cmake.build() + #self.run(f'echo {self.source_folder}') + # Explicit way: + # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) + # self.run("cmake --build . %s" % cmake.build_config) + + + def package(self): + cmake = CMake(self) + cmake.verbose = True + cmake.install() + + + def package_info(self): + self.cpp_info.libs = ["iwasm"] + self.cpp_info.names["cmake_find_package"] = "wamr" + self.cpp_info.names["cmake_find_package_multi"] = "wamr" + diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch new file mode 100644 index 00000000000..7cc3544b685 --- /dev/null +++ b/external/wamr/patches/ripp_metering.patch @@ -0,0 +1,417 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 551991f8..5f48a0b8 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,7 +1,7 @@ + # Copyright (C) 2019 Intel Corporation. All rights reserved. + # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +-cmake_minimum_required (VERSION 3.14) ++cmake_minimum_required (VERSION 3.20) + + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + +diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake +index 1cb50235..bd103022 100644 +--- a/build-scripts/config_common.cmake ++++ b/build-scripts/config_common.cmake +@@ -669,6 +669,10 @@ if (WAMR_BUILD_AOT_VALIDATOR EQUAL 1) + message (" AOT validator enabled") + add_definitions (-DWASM_ENABLE_AOT_VALIDATOR=1) + endif () ++if (WAMR_BUILD_INSTRUCTION_METERING EQUAL 1) ++ message (" Instruction metering enabled") ++ add_definitions (-DWASM_ENABLE_INSTRUCTION_METERING=1) ++endif () + + ######################################## + # Show Phase4 Wasm proposals status. +diff --git a/core/config.h b/core/config.h +index cb1189c9..a4e1499e 100644 +--- a/core/config.h ++++ b/core/config.h +@@ -716,4 +716,8 @@ unless used elsewhere */ + #define WASM_ENABLE_AOT_VALIDATOR 0 + #endif + ++#ifndef WASM_ENABLE_INSTRUCTION_METERING ++#define WASM_ENABLE_INSTRUCTION_METERING 0 ++#endif ++ + #endif /* end of _CONFIG_H_ */ +diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c +index 269ec577..bc6fd01b 100644 +--- a/core/iwasm/common/wasm_c_api.c ++++ b/core/iwasm/common/wasm_c_api.c +@@ -5389,3 +5389,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, + return -1.0; + #endif + } ++ ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*instance) ++{ ++ return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); ++} +diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c +index e33fd9f3..d1ff9c41 100644 +--- a/core/iwasm/common/wasm_exec_env.c ++++ b/core/iwasm/common/wasm_exec_env.c +@@ -85,6 +85,12 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, + wasm_runtime_dump_exec_env_mem_consumption(exec_env); + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ exec_env->instructions_to_execute = -1; ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = 1; ++#endif ++ + return exec_env; + + #ifdef OS_ENABLE_HW_BOUND_CHECK +diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h +index ce0c1fa7..2713a092 100644 +--- a/core/iwasm/common/wasm_exec_env.h ++++ b/core/iwasm/common/wasm_exec_env.h +@@ -87,6 +87,12 @@ typedef struct WASMExecEnv { + uint8 *bottom; + } wasm_stack; + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ /* instructions to execute */ ++ int64 instructions_to_execute; ++ int64 instructions_schedule[256]; ++#endif ++ + #if WASM_ENABLE_FAST_JIT != 0 + /** + * Cache for +diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c +index d33c0272..900fb536 100644 +--- a/core/iwasm/common/wasm_runtime_common.c ++++ b/core/iwasm/common/wasm_runtime_common.c +@@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() + } + #endif + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ ++void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute) ++{ ++ exec_env->instructions_to_execute = instructions_to_execute; ++} ++ ++int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) ++{ ++ return exec_env->instructions_to_execute; ++} ++ ++void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule) ++{ ++ for(int i = 0; i < 256; ++i) ++ exec_env->instructions_schedule[i] = instructions_schedule[i]; ++} ++ ++#endif ++ + WASMFuncType * + wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, + uint32 module_type) +@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; + boundary = boundary + page_size * guard_page_count; + #endif +- if ((uint8 *)&boundary < boundary) { ++ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), + "native stack overflow"); + return false; +diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h +index 8ac032bf..5ca5d489 100644 +--- a/core/iwasm/common/wasm_runtime_common.h ++++ b/core/iwasm/common/wasm_runtime_common.h +@@ -791,9 +791,25 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, + uint8 *native_stack_boundary); + +-#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ + /* See wasm_export.h for description */ + WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, ++ int64 instructions_to_execute); ++WASM_RUNTIME_API_EXTERN int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, ++ int64 const *instructions_schedule); ++ ++#endif ++ ++#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 ++/* See wasm_export.h for description */ ++WASM_RUNTIME_API_EXTERN ++void + wasm_runtime_set_bounds_checks(WASMModuleInstanceCommon *module_inst, + bool enable); + +diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h +index 241a0eec..82e048c0 100644 +--- a/core/iwasm/include/wasm_c_api.h ++++ b/core/iwasm/include/wasm_c_api.h +@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); + // func_name. If the function is not found, return 0. + WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); + ++struct WASMExecEnv; ++typedef struct WASMExecEnv *wasm_exec_env_t; ++ ++WASM_API_EXTERN wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*); ++ + /////////////////////////////////////////////////////////////////////////////// + // Convenience + +diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h +index b73a0364..f7e20b24 100644 +--- a/core/iwasm/include/wasm_export.h ++++ b/core/iwasm/include/wasm_export.h +@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + uint8_t *native_stack_boundary); + ++/** ++ * Set the instruction count limit to the execution environment. ++ * By default the instruction count limit is -1, which means no limit. ++ * However, if the instruction count limit is set to a positive value, ++ * the execution will be terminated when the instruction count reaches ++ * the limit. ++ * ++ * @param exec_env the execution environment ++ * @param instruction_count the instruction count limit ++ */ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, ++ int64_t instruction_count); ++ ++WASM_RUNTIME_API_EXTERN int64_t ++wasm_runtime_get_instruction_count_limit(wasm_exec_env_t exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, ++ int64_t const *instructions_schedule); ++ + /** + * Dump runtime memory consumption, including: + * Exec env memory consumption +diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c +index 41ac4c72..1aa1fe1c 100644 +--- a/core/iwasm/interpreter/wasm_interp_classic.c ++++ b/core/iwasm/interpreter/wasm_interp_classic.c +@@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *handle_table[*frame_ip++]; \ + } while (0) + #else +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ FETCH_OPCODE_AND_DISPATCH() + #endif + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1542,9 +1545,12 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, + } \ + os_mutex_unlock(&exec_env->wait_lock); \ + } \ ++ CHECK_INSTRUCTION_LIMIT(); \ + continue; + #else +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue; + #endif + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ +@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #endif + } + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute == 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ else if (instructions_to_execute > 0) \ ++ instructions_to_execute--; ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static void + wasm_interp_call_func_bytecode(WASMModuleInstance *module, + WASMExecEnv *exec_env, +@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint32 local_idx, local_offset, global_idx; + uint8 local_type, *global_addr; + uint32 cache_index, type_index, param_cell_num, cell_num; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ if(exec_env) ++ instructions_to_execute = exec_env->instructions_to_execute; ++#endif ++ + #if WASM_ENABLE_EXCE_HANDLING != 0 + int32_t exception_tag_index; + #endif +@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) { + /* Called from native. */ + return; +@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + #endif + SYNC_ALL_TO_FRAME(); ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c +index f33ad60e..a7078fe8 100644 +--- a/core/iwasm/interpreter/wasm_interp_fast.c ++++ b/core/iwasm/interpreter/wasm_interp_fast.c +@@ -105,6 +105,20 @@ typedef float64 CellType_F64; + goto unaligned_atomic; \ + } while (0) + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opc]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } ++#else ++#define CHECK_INSTRUCTION_LIMIT() (void)0 ++#endif ++ + static inline uint32 + rotl32(uint32 n, uint32 c) + { +@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() + #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 + #define FETCH_OPCODE_AND_DISPATCH() \ + do { \ ++ const uint64 opc = *frame_ip; \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* int32 relative offset was emitted in 64-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() + const void *p_label_addr; \ + bh_assert(((uintptr_t)frame_ip & 1) == 0); \ + /* uint32 label address was emitted in 32-bit target */ \ ++ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ ++ CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #endif +@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 *maddr = NULL; + uint32 local_idx, local_offset, global_idx; + uint8 opcode = 0, local_type, *global_addr; ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; ++ if(exec_env) ++ { ++ instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } ++#endif ++ + #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif ++ + if (!prev_frame->ip) + /* Called from native. */ + return; +@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + + got_exception: + SYNC_ALL_TO_FRAME(); ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_to_execute; ++#endif + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/doc/build_wamr.md b/doc/build_wamr.md +index 6425450b..94dd9628 100644 +--- a/doc/build_wamr.md ++++ b/doc/build_wamr.md +@@ -327,6 +327,10 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared + - **WAMR_BUILD_SHRUNK_MEMORY**=1/0, default to enable if not set + > Note: When enabled, this feature will reduce memory usage by decreasing the size of the linear memory, particularly when the `memory.grow` opcode is not used and memory usage is somewhat predictable. + ++## **Instruction metering** ++- **WAMR_BUILD_INSTRUCTION_METERING**=1/0, default to disable if not set ++> Note: Enabling this feature allows limiting the number of instructions a wasm module instance can execute. Use the `wasm_runtime_set_instruction_count_limit(...)` API before calling `wasm_runtime_call_*(...)` APIs to enforce this limit. ++ + ## **Combination of configurations:** + + We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6b25da63631..75467fc7c81 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -19,6 +19,7 @@ #include +#include #include #include @@ -1921,12 +1922,12 @@ struct Escrow_test : public beast::unit_test::suite { // not enough gas - // This function takes 110 gas + // This function takes 4 gas // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 108; + auto const finishFee = env.current()->fees().base + 4; env(finish(carol, alice, seq), fee(finishFee), - comp_allowance(108), + comp_allowance(2), ter(tecFAILED_PROCESSING)); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index ce8d836269c..a46d71a5699 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -21,105 +21,21 @@ #include -#include - -#include +#include namespace ripple { namespace test { /* Host function body definition. */ -WasmEdge_Result -Add(void* Data, - const WasmEdge_CallingFrameContext* CallFrameCxt, - const WasmEdge_Value* In, - WasmEdge_Value* Out) +using Add_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +Add(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) { - int32_t Val1 = WasmEdge_ValueGetI32(In[0]); - int32_t Val2 = WasmEdge_ValueGetI32(In[1]); + int32_t Val1 = params->data[0].of.i32; + int32_t Val2 = params->data[1].of.i32; // printf("Host function \"Add\": %d + %d\n", Val1, Val2); - Out[0] = WasmEdge_ValueGenI32(Val1 + Val2); - return WasmEdge_Result_Success; -} - -void -invokeAdd() -{ - /* Create the VM context. */ - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(NULL, NULL); - - // clang-format off - /* The WASM module buffer. */ - uint8_t WASM[] = {/* WASM header */ - 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, - /* Type section */ - 0x01, 0x07, 0x01, - /* function type {i32, i32} -> {i32} */ - 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, - /* Import section */ - 0x02, 0x13, 0x01, - /* module name: "extern" */ - 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, - /* extern name: "func-add" */ - 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, - /* import desc: func 0 */ - 0x00, 0x00, - /* Function section */ - 0x03, 0x02, 0x01, 0x00, - /* Export section */ - 0x07, 0x0A, 0x01, - /* export name: "addTwo" */ - 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, - /* export desc: func 0 */ - 0x00, 0x01, - /* Code section */ - 0x0A, 0x0A, 0x01, - /* code body */ - 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; - // clang-format on - - /* Create the module instance. */ - WasmEdge_String ExportName = WasmEdge_StringCreateByCString("extern"); - WasmEdge_ModuleInstanceContext* HostModCxt = - WasmEdge_ModuleInstanceCreate(ExportName); - WasmEdge_ValType ParamList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType ReturnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* HostFType = - WasmEdge_FunctionTypeCreate(ParamList, 2, ReturnList, 1); - WasmEdge_FunctionInstanceContext* HostFunc = - WasmEdge_FunctionInstanceCreate(HostFType, Add, NULL, 0); - WasmEdge_FunctionTypeDelete(HostFType); - WasmEdge_String HostFuncName = WasmEdge_StringCreateByCString("func-add"); - WasmEdge_ModuleInstanceAddFunction(HostModCxt, HostFuncName, HostFunc); - WasmEdge_StringDelete(HostFuncName); - - WasmEdge_VMRegisterModuleFromImport(VMCxt, HostModCxt); - - /* The parameters and returns arrays. */ - WasmEdge_Value Params[2] = { - WasmEdge_ValueGenI32(1234), WasmEdge_ValueGenI32(5678)}; - WasmEdge_Value Returns[1]; - /* Function name. */ - WasmEdge_String FuncName = WasmEdge_StringCreateByCString("addTwo"); - /* Run the WASM function from buffer. */ - WasmEdge_Result Res = WasmEdge_VMRunWasmFromBuffer( - VMCxt, WASM, sizeof(WASM), FuncName, Params, 2, Returns, 1); - - if (WasmEdge_ResultOK(Res)) - { - // printf("invokeAdd get the result: %d\n", - // WasmEdge_ValueGetI32(Returns[0])); - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(Res)); - } - - /* Resources deallocations. */ - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(FuncName); - WasmEdge_ModuleInstanceDelete(HostModCxt); + results->data[0] = WASM_I32_VAL(Val1 + Val2); + return nullptr; } struct Wasm_test : public beast::unit_test::suite @@ -128,8 +44,46 @@ struct Wasm_test : public beast::unit_test::suite testWasmtimeLib() { testcase("wasmtime lib test"); - invokeAdd(); - BEAST_EXPECT(true); + // clang-format off + /* The WASM module buffer. */ + wbytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto res = vm.run(wasm, "addTwo", imports, wasmParams(1234, 5678)); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + BEAST_EXPECT(res.has_value() && res.value() == 6912); } void @@ -1412,9 +1366,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("ready"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (more than MAX_PAGES) result " << re.error() - << std::endl; + if (BEAST_EXPECT(!re)) + std::cout << "bad case (more than MAX_PAGES) result " + << re.error() << std::endl; } { // fail because recursion too deep @@ -2143,9 +2097,9 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - BEAST_EXPECT(re.error()); - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + if (BEAST_EXPECT(re.error())) + std::cout << "bad case (deep recursion) result " << re.error() + << std::endl; } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp new file mode 100644 index 00000000000..a92d8e463e4 --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -0,0 +1,754 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { + +////////////////////////////////////////////////////////////////////////////////////////// + +namespace { + +static void +print_wasm_error(const char* message, wasm_trap_t* trap) +{ + fprintf(stderr, "WAMR error: %s\n", message); + wasm_byte_vec_t error_message; + + if (trap) + { + wasm_trap_message(trap, &error_message); + wasm_trap_delete(trap); + fprintf( + stderr, + "WAMR trap: %.*s\n", + (int)error_message.size, + error_message.data); + wasm_byte_vec_delete(&error_message); + } +} + +} // namespace + +InstancePtr +InstanceWrapper::init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports) +{ + wasm_trap_t* trap = nullptr; + InstantiationArgs inst_args{ + 128 * 1024, + 256 * 1024, + static_cast(maxPages > 0 ? maxPages : 0)}; + + InstancePtr mi = InstancePtr( + wasm_instance_new_with_args_ex(s, m, &imports, &trap, &inst_args), + &wasm_instance_delete); + + if (!mi || trap) + { + print_wasm_error("can't create instance", trap); + throw std::runtime_error("WAMR: can't create instance"); + } + wasm_instance_exports(mi.get(), expt); + return mi; +} + +InstanceWrapper::InstanceWrapper() + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ +} + +InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) + : exports{0, nullptr, 0, 0, nullptr} + , mod_inst(nullptr, &wasm_instance_delete) +{ + *this = std::move(o); +} + +InstanceWrapper& +InstanceWrapper::operator=(InstanceWrapper&& o) +{ + if (this == &o) + return *this; + + if (exports.size) + wasm_extern_vec_delete(&exports); + exports = o.exports; + o.exports = {0, nullptr, 0, 0, nullptr}; + + mod_inst = std::move(o.mod_inst); + + return *this; +} + +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports) + : exports WASM_EMPTY_VEC, mod_inst(init(s, m, maxPages, &exports, imports)) +{ +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports.size) + wasm_extern_vec_delete(&exports); +} + +InstanceWrapper::operator bool() const +{ + return static_cast(mod_inst); +} + +wasm_func_t* +InstanceWrapper::getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const +{ + wasm_func_t* f = nullptr; + + if (!export_types.size) + throw std::runtime_error("WAMR: no export"); + if (export_types.size != exports.size) + throw std::runtime_error("WAMR: invalid export"); + + for (unsigned i = 0; i < export_types.size; ++i) + { + auto const* exp_type(export_types.data[i]); + + wasm_name_t const* name = wasm_exporttype_name(exp_type); + const wasm_externtype_t* exn_type = wasm_exporttype_type(exp_type); + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) + { + if (funcName == std::string_view(name->data, name->size - 1)) + { + auto* exn(exports.data[i]); + if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) + throw std::runtime_error("WAMR: invalid export"); + + f = wasm_extern_as_func(exn); + break; + } + } + } + + if (!f) + throw std::runtime_error( + "WAMR: can't find function " + std::string(funcName)); + + return f; +} + +wmem +InstanceWrapper::getMem() const +{ + wasm_memory_t* mem = nullptr; + for (unsigned i = 0; i < exports.size; ++i) + { + auto* e(exports.data[i]); + if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) + { + mem = wasm_extern_as_memory(e); + break; + } + } + + if (!mem) + throw std::runtime_error("WAMR: no memory exported"); + + return { + reinterpret_cast(wasm_memory_data(mem)), + wasm_memory_data_size(mem)}; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ModulePtr +ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) +{ + wasm_byte_vec_t const code{ + wasmBin.size(), + (char*)(wasmBin.data()), + wasmBin.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + return m; +} + +ModuleWrapper::ModuleWrapper() + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ +} + +ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) + : module(nullptr, &wasm_module_delete) + , export_types{0, nullptr, 0, 0, nullptr} +{ + *this = std::move(o); +} + +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module = std::move(o.module); + mod_inst = std::move(o.mod_inst); + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); + export_types = o.export_types; + o.export_types = {0, nullptr, 0, 0, nullptr}; + exec_env = o.exec_env; + o.exec_env = nullptr; + return *this; +} + +ModuleWrapper::ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports) + : module(init(s, wasmBin)), export_types{0, nullptr, 0, 0, nullptr} +{ + if (!module) + throw std::runtime_error("WAMR: can't create module"); + + wasm_module_exports(module.get(), &export_types); + if (instantiate) + { + auto wimports = buildImports(s, imports); + addInstance(s, maxPages, wimports); + } +} + +ModuleWrapper::~ModuleWrapper() +{ + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); +} + +ModuleWrapper::operator bool() const +{ + return mod_inst; +} + +void +ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + auto const paramSize = imp.params.size(); + + if (paramSize) + { + wasm_valtype_vec_new(&v, paramSize, nullptr); + v.num_elems = paramSize; + } + else + v = WASM_EMPTY_VEC; + for (unsigned i = 0; i < paramSize; ++i) + { + auto const vt = imp.params[i]; + switch (vt) + { + case WT_I32: + v.data[i] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[i] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[i] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[i] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid import type"); + } + } +} + +void +ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + if (imp.result) + { + wasm_valtype_vec_new(&v, 1, nullptr); + v.num_elems = 1; + switch (*imp.result) + { + case WT_I32: + v.data[0] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[0] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[0] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[0] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("Invalid return type"); + } + } + else + v = WASM_EMPTY_VEC; +} + +wasm_extern_vec_t +ModuleWrapper::buildImports( + wasm_store_t* s, + std::vector const& imports) +{ + wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; + wasm_module_imports(module.get(), &importTypes); + std:: + unique_ptr + itDeleter(&importTypes, &wasm_importtype_vec_delete); + + wasm_extern_vec_t wimports = WASM_EMPTY_VEC; + if (!importTypes.num_elems) + return wimports; + + wasm_extern_vec_new(&wimports, importTypes.size, nullptr); + wimports.num_elems = importTypes.num_elems; + + for (unsigned i = 0; i < importTypes.num_elems; ++i) + { + wasm_importtype_t const* importtype = importTypes.data[i]; + if (wasm_importtype_is_linked(importtype)) + { + // create a placeholder + wimports.data[i] = wasm_extern_new_empty( + s, wasm_externtype_kind(wasm_importtype_type(importtype))); + continue; + } + + // wasm_name_t const* mn = wasm_importtype_module(importtype); + // auto modName = std::string_view(mn->data, mn->num_elems - 1); + wasm_name_t const* fn = wasm_importtype_name(importtype); + auto fieldName = std::string_view(fn->data, fn->num_elems - 1); + + // for multi-module support + // if ((W_ENV != modName) && (W_HOST_LIB != modName)) + // continue; + + for (auto const& imp : imports) + { + if (imp.name != fieldName) + continue; + + wasm_valtype_vec_t params, results; + makeImpReturn(results, imp); + makeImpParams(params, imp); + + using ftype_ptr = std:: + unique_ptr; + ftype_ptr ftype( + wasm_functype_new(¶ms, &results), &wasm_functype_delete); + wasm_func_t* func = wasm_func_new_with_env( + s, + ftype.get(), + reinterpret_cast(imp.wrap), + imp.udata, + nullptr); + + wimports.data[i] = wasm_func_as_extern(func); + break; + } + } + + return wimports; +} + +wasm_func_t* +ModuleWrapper::getFunc(std::string_view funcName) const +{ + return mod_inst.getFunc(funcName, export_types); +} + +wmem +ModuleWrapper::getMem() const +{ + return mod_inst.getMem(); +} + +int +ModuleWrapper::addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports) +{ + mod_inst = {s, module.get(), maxPages, imports}; + exec_env = wasm_instance_exec_env(mod_inst.mod_inst.get()); + + return 0; +} + +// int +// my_module_t::delInstance(int i) +// { +// if (i >= mod_inst.size()) +// return -1; +// if (!mod_inst[i]) +// mod_inst[i] = my_mod_inst_t(); +// return i; +// } + +std::int64_t +ModuleWrapper::setGas(std::int64_t gas) +{ + if (exec_env) + { + wasm_runtime_set_instruction_count_limit(exec_env, gas); + return gas; + } + return 0; +} + +std::int64_t +ModuleWrapper::getGas() +{ + return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// void +// WamrEngine::clearModules() +// { +// modules.clear(); +// store.reset(); // to free the memory before creating new store +// store = {wasm_store_new(engine.get()), &wasm_store_delete}; +// } + +WamrEngine::WamrEngine() + : engine(wasm_engine_new(), &wasm_engine_delete) + , store(nullptr, &wasm_store_delete) +{ + wasm_runtime_set_default_running_mode(Mode_Interp); + wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); + // wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE); +} + +int +WamrEngine::addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports) +{ + module.reset(); + store.reset(); // to free the memory before creating new store + store = {wasm_store_new(engine.get()), &wasm_store_delete}; + module = std::make_unique( + store.get(), wasmCode, instantiate, defMaxPages, imports); + setGas(defGas); + return module ? 0 : -1; +} + +int +WamrEngine::addInstance() +{ + return module->addInstance(store.get(), defMaxPages); +} + +wasm_func_t* +WamrEngine::getFunc(std::string_view funcName) +{ + return module->getFunc(funcName); +} + +std::vector +WamrEngine::convertParams(std::vector const& params) +{ + std::vector v; + v.reserve(params.size()); + for (auto const& p : params) + { + switch (p.type) + { + case WT_I32: + v.push_back(WASM_I32_VAL(p.of.i32)); + break; + case WT_I64: + v.push_back(WASM_I64_VAL(p.of.i64)); + break; + case WT_F32: + v.push_back(WASM_F32_VAL(p.of.f32)); + break; + case WT_F64: + v.push_back(WASM_F64_VAL(p.of.f64)); + break; + default: + break; + } + } + + return v; +} + +void +WamrEngine::add_param(std::vector& in, int32_t p) +{ + in.emplace_back(); + auto& el(in.back()); + memset(&el, 0, sizeof(el)); + el = WASM_I32_VAL(p); // WASM_I32; +} + +void +WamrEngine::add_param(std::vector& in, int64_t p) +{ + in.emplace_back(); + auto& el(in.back()); + el = WASM_I64_VAL(p); +} + +template +WamrResult +WamrEngine::call(std::string_view func, Types... args) +{ + // Lookup our export function + auto* f = getFunc(func); + return call(f, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, Types... args) +{ + std::vector in; + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(wasm_func_t* func, std::vector& in) +{ + // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; + WamrResult ret(NR); + // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // + // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + + wasm_val_vec_t const inv = in.empty() + ? wasm_val_vec_t WASM_EMPTY_VEC + : wasm_val_vec_t{ + in.size(), + in.data(), + in.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + trap = wasm_func_call(func, &inv, &ret.r); + if (trap) + print_wasm_error("failed to call func", trap); + + // assert(results[0].kind == WASM_I32); + // if (NR) printf("Result P5: %d\n", ret[0].of.i32); + + return ret; +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + + std::vector& in, + std::int64_t p, + Types... args) +{ + add_param(in, p); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + + auto mem = getMem(); + memcpy(mem.p + ptr, d, sz); + + add_param(in, ptr); + add_param(in, static_cast(sz)); + return call(func, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args) +{ + return call(func, in, p.data(), p.size(), std::forward(args)...); +} + +Expected +WamrEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + try + { + return runHlp(wasmCode, funcName, imports, params); + } + catch (std::exception const&) + { + } + catch (...) + { + } + return Unexpected(tecFAILED_PROCESSING); +} + +Expected +WamrEngine::runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) +{ + // Create and instantiate the module. + if (!wasmCode.empty()) + { + int const m = addModule(wasmCode, true, imports); + if (m < 0) + return Unexpected(tecFAILED_PROCESSING); + } + + if (!module) + return Unexpected(tecFAILED_PROCESSING); + + // Call main + auto* f = getFunc(!funcName.empty() ? funcName : "_start"); + auto p = convertParams(params); + auto res = call<1>(f, p); + if (!res.r.size || trap) + return Unexpected(tecFAILED_PROCESSING); + + assert(res.r.data[0].kind == WASM_I32); + // printf("Result: %d\n", results[0].of.i32); + // return res.r.data[0].of.i32 != 0; + return res.r.data[0].of.i32; +} + +std::int64_t +WamrEngine::initGas(std::int64_t def) +{ + defGas = def; + return def; +} + +std::int32_t +WamrEngine::initMaxPages(std::int32_t def) +{ + defMaxPages = def; + return def; +} + +std::int64_t +WamrEngine::setGas(std::int64_t gas) +{ + if (module) + { + module->setGas(gas); + return gas; + } + return 0; +} + +std::int64_t +WamrEngine::getGas() +{ + return module ? module->getGas() : 0; +} + +wmem +WamrEngine::getMem() const +{ + return module ? module->getMem() : wmem(); +} + +int32_t +WamrEngine::allocate(int32_t sz) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + if (trap || (res.r.data[0].kind != WASM_I32)) + return {}; + auto const ptr = res.r.data[0].of.i32; + if (!ptr) + throw std::runtime_error( + "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); + return ptr; +} + +wasm_trap_t* +WamrEngine::newTrap(std::string_view txt) +{ + wasm_message_t msg = WASM_EMPTY_VEC; + + if (!txt.empty()) + wasm_name_new(&msg, txt.size(), txt.data()); + + return wasm_trap_new(store.get(), &msg); +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h new file mode 100644 index 00000000000..113fcf88866 --- /dev/null +++ b/src/xrpld/app/misc/WamrVM.h @@ -0,0 +1,264 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include + +namespace ripple { + +// clang-format off + +struct WamrResult +{ + wasm_val_vec_t r; + WamrResult(unsigned N = 0):r{0, nullptr, 0, 0, nullptr} {if (N) wasm_val_vec_new_uninitialized(&r, N);} + ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } + WamrResult(WamrResult const &) = delete; + WamrResult& operator=(WamrResult const &) = delete; + + WamrResult(WamrResult &&o) {*this = std::move(o);} + WamrResult& operator=(WamrResult &&o){r = o.r; o.r = {0, nullptr, 0, 0, nullptr}; return *this;} + //operator wasm_val_vec_t &() {return r;} +}; + +using ModulePtr = std::unique_ptr; +using InstancePtr = std::unique_ptr; + +// clang-format on + +struct InstanceWrapper +{ + wasm_extern_vec_t exports; + InstancePtr mod_inst; + +private: + static InstancePtr + init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + +public: + InstanceWrapper(); + + InstanceWrapper(InstanceWrapper&& o); + + InstanceWrapper& + operator=(InstanceWrapper&& o); + + InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + ~InstanceWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const; + + wmem + getMem() const; +}; + +struct ModuleWrapper +{ + ModulePtr module; + wasm_exec_env_t exec_env = nullptr; + InstanceWrapper mod_inst; + wasm_exporttype_vec_t export_types; + +private: + static ModulePtr + init(wasm_store_t* s, wbytes const& wasmBin); + +public: + ModuleWrapper(); + ModuleWrapper(ModuleWrapper&& o); + ModuleWrapper& + operator=(ModuleWrapper&& o); + ModuleWrapper( + wasm_store_t* s, + wbytes const& wasmBin, + bool instantiate, + int32_t maxPages, + std::vector const& imports = {}); + ~ModuleWrapper(); + + operator bool() const; + + wasm_func_t* + getFunc(std::string_view funcName) const; + wmem + getMem() const; + + int + addInstance( + wasm_store_t* s, + int32_t maxPages, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + +private: + static void + makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + static void + makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + wasm_extern_vec_t + buildImports(wasm_store_t* s, std::vector const& imports); +}; + +class WamrEngine +{ + std::unique_ptr engine; + std::unique_ptr store; + std::unique_ptr module; + wasm_trap_t* trap = nullptr; + std::int64_t defGas = -1; + std::int32_t defMaxPages = -1; + +public: + WamrEngine(); + ~WamrEngine() = default; + + Expected + run(wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + std::int64_t + initGas(std::int64_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + getGas(); + + // Host functions helper functionality + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + wasm_trap_t* + newTrap(std::string_view msg); + +private: + Expected + runHlp( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params); + + int + addModule( + wbytes const& wasmCode, + bool instantiate, + std::vector const& imports); + void + clearModules(); + int + addInstance(); + int32_t + runFunc(std::string_view const funcName, int32_t p); + + int32_t + makeModule( + wbytes const& wasmCode, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + wasm_func_t* + getFunc(std::string_view funcName); + + std::vector + convertParams(std::vector const& params); + + void + add_param(std::vector& in, int32_t p); + void + add_param(std::vector& in, int64_t p); + + template + inline WamrResult + call(std::string_view func, Types... args); + + template + inline WamrResult + call(wasm_func_t* func, Types... args); + + template + inline WamrResult + call(wasm_func_t* f, std::vector& in); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int32_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + std::int64_t p, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types... args); + + template + inline WamrResult + call( + wasm_func_t* func, + std::vector& in, + wbytes const& p, + Types... args); +}; + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index aa42f79ff6b..e1943244e70 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -19,14 +19,12 @@ #ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED #define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED +#include +#include + #include #include -#include "xrpl/basics/base_uint.h" -#include "xrpld/app/misc/WasmVM.h" -#include "xrpld/app/tx/detail/ApplyContext.h" -#include - namespace ripple { class WasmHostFunctionsImpl : public HostFunctions { diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp new file mode 100644 index 00000000000..d893a938890 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -0,0 +1,392 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include + +namespace ripple { + +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const sqn = hf->getLedgerSqn(); + results->data[0] = WASM_I32_VAL(sqn); + + return nullptr; +} + +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + int32_t const ltime = hf->getParentLedgerTime(); + results->data[0] = WASM_I32_VAL(ltime); + return nullptr; +} + +static Expected +getParameterData(wasm_val_vec_t const* params, size_t index) +{ + auto& vm = WasmEngine::instance(); + auto fnameOffset = params->data[index].of.i32; + auto fnameLen = params->data[index + 1].of.i32; + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + if (mem.s <= fnameOffset + fnameLen) + return Unexpected("Memory access failed"); + Bytes fname(mem.p + fnameOffset, mem.p + fnameOffset + fnameLen); + return fname; +} + +static Expected +getFieldName(wasm_val_vec_t const* params, size_t index) +{ + auto const dataRes = getParameterData(params, index); + if (dataRes) + { + return std::string(dataRes->begin(), dataRes->end()); + } + else + { + auto& vm = WasmEngine::instance(); + return Unexpected( + reinterpret_cast(vm.newTrap(dataRes.error()))); + } +} + +static Expected +setData(Bytes const& data) +{ + auto& vm = WasmEngine::instance(); + auto mem = vm.getMem(); + if (!mem.s) + return Unexpected("No memory exported"); + + int32_t const dataLen = static_cast(data.size()); + int32_t const dataPtr = vm.allocate(dataLen); + if (!dataPtr) + return Unexpected("Allocation error"); + memcpy(mem.p + dataPtr, data.data(), dataLen); + + auto retPtr = vm.allocate(8); + if (!retPtr) + return Unexpected("Allocation error"); + int32_t* retData = reinterpret_cast(mem.p + retPtr); + retData[0] = dataPtr; + retData[1] = dataLen; + + return retPtr; +} + +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getTxField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap("Field not found")); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + int32_t const type = params->data[0].of.i32; + auto lkData = getParameterData(params, 1); + if (!lkData) + return reinterpret_cast(vm.newTrap()); + + auto fname = getFieldName(params, 3); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = + hf->getLedgerEntryField(type, lkData.value(), fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getFieldName(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + if (!fieldData) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(fieldData.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); + return nullptr; +} + +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto nftId = getFieldName(params, 2); + if (!nftId) + return reinterpret_cast(vm.newTrap()); + + auto nftURI = hf->getNFT(account.value(), nftId.value()); + if (!nftURI) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(nftURI.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->accountKeylet(account.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto subject = getFieldName(params, 0); + if (!subject) + return reinterpret_cast(vm.newTrap()); + + auto issuer = getFieldName(params, 2); + if (!issuer) + return reinterpret_cast(vm.newTrap()); + + auto credentialType = getFieldName(params, 4); + if (!credentialType) + return reinterpret_cast(vm.newTrap()); + + auto keylet = hf->credentialKeylet( + subject.value(), issuer.value(), credentialType.value()); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + int32_t const sequence = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), sequence); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto account = getFieldName(params, 0); + if (!account) + return reinterpret_cast(vm.newTrap()); + + auto documentId = params->data[2].of.i32; + + auto keylet = hf->escrowKeylet(account.value(), documentId); + if (!keylet) + return reinterpret_cast(vm.newTrap()); + + auto pointer = setData(keylet.value()); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); + return nullptr; +} + +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + if (!hf->updateData(fname.value())) + return reinterpret_cast(vm.newTrap()); + + return nullptr; +} + +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + auto* hf = reinterpret_cast(env); + + auto fname = getParameterData(params, 0); + if (!fname) + return reinterpret_cast(vm.newTrap()); + + auto hres = hf->computeSha512HalfHash(fname.value()); + Bytes digest{hres.begin(), hres.end()}; + auto pointer = setData(digest); + if (!pointer) + return reinterpret_cast(vm.newTrap()); + + results->data[0] = WASM_I32_VAL(pointer.value()); + // out[1] = WasmEdge_ValueGenI32(32); + return nullptr; +} + +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results) +{ + auto& vm = WasmEngine::instance(); + // auto* hf = reinterpret_cast(env); + + auto f = getParameterData(params, 0); + if (!f) + return reinterpret_cast(vm.newTrap()); + std::string s(f->begin(), f->end()); + if (s.size() < 4096) + std::cout << s << std::endl; + return nullptr; +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h new file mode 100644 index 00000000000..c3f5bb11a97 --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +namespace ripple { + +using getLedgerSqn_proto = int32_t(); +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getParentLedgerTime_proto = int32_t(); +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getTxField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getLedgerEntryField_proto = + uint32_t*(int32_t, uint8_t const*, int32_t, char const*, int32_t); +wasm_trap_t* +getLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getCurrentLedgerEntryField_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +getCurrentLedgerEntryField_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using getNFT_proto = uint32_t*(char const*, int32_t, char const*, int32_t); +wasm_trap_t* +getNFT_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +using accountKeylet_proto = uint32_t*(char const*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = + uint32_t*(char const*, int32_t, char const*, int32_t, char const*, int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using updateData_proto = void(uint8_t const*, int32_t); +wasm_trap_t* +updateData_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using computeSha512HalfHash_proto = uint32_t*(uint8_t const*, int32_t); +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + const wasm_val_vec_t* params, + wasm_val_vec_t* results); + +using print_proto = void(char const*, int32_t); +wasm_trap_t* +print_wrap(void* env, const wasm_val_vec_t* params, wasm_val_vec_t* results); + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 1764734db36..d786cae7fbe 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -17,730 +17,118 @@ */ //============================================================================== -#include +#include +#include -#include "xrpl/protocol/AccountID.h" -#include "xrpl/protocol/LedgerFormats.h" +#include +#include -namespace ripple { +#include -WasmEdge_Result -getLedgerSqn( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = WasmEdge_ValueGenI32(((HostFunctions*)data)->getLedgerSqn()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getParentLedgerTime( - void* data, - const WasmEdge_CallingFrameContext*, - const WasmEdge_Value*, - WasmEdge_Value* out) -{ - out[0] = - WasmEdge_ValueGenI32(((HostFunctions*)data)->getParentLedgerTime()); - return WasmEdge_Result_Success; -} +namespace ripple { -Expected -getParameterData( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + HostFunctions* hfs, + uint64_t gasLimit) { - auto fnameOffset = (uint32_t)WasmEdge_ValueGetI32(in[index]); - auto fnameLen = (uint32_t)WasmEdge_ValueGetI32(in[index + 1]); - Bytes fname(fnameLen, char{0}); - WasmEdge_MemoryInstanceContext* mem = - WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - WasmEdge_Result Res = WasmEdge_MemoryInstanceGetData( - mem, (uint8_t*)(fname.data()), fnameOffset, fnameLen); - if (WasmEdge_ResultOK(Res)) - { - return fname; - } - else - { - return Unexpected(Res); - } -} + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initGas(gasLimit); + vm.initMaxPages(MAX_PAGES); -Expected -getFieldName( - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - size_t index) -{ - auto dataRes = getParameterData(fm, in, index); - if (dataRes) - { - return std::string(dataRes.value().begin(), dataRes->end()); - } - else - { - return Unexpected(dataRes.error()); - } -} + std::vector imports; -Expected -setData(const WasmEdge_CallingFrameContext* fm, Bytes const& data) -{ - auto alloc = [fm](int32_t dataLen) -> int32_t { - WasmEdge_String allocFunc = WasmEdge_StringCreateByCString("allocate"); - auto mod = WasmEdge_CallingFrameGetModuleInstance(fm); - WasmEdge_FunctionInstanceContext* func = - WasmEdge_ModuleInstanceFindFunction(mod, allocFunc); - WasmEdge_Value allocParams[1] = { - WasmEdge_ValueGenI32(dataLen)}; // 4 for prepend the data size - WasmEdge_Value allocReturns[1]; - auto executor = WasmEdge_CallingFrameGetExecutor(fm); - auto res = WasmEdge_ExecutorInvoke( - executor, func, allocParams, 1, allocReturns, 1); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGetI32(allocReturns[0]); - } - else - { - return 0; - } - }; + WASM_IMPORT_FUNC(imports, getLedgerSqn, hfs) + WASM_IMPORT_FUNC(imports, getParentLedgerTime, hfs) + WASM_IMPORT_FUNC(imports, getTxField, hfs) + WASM_IMPORT_FUNC(imports, getLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getCurrentLedgerEntryField, hfs) + WASM_IMPORT_FUNC(imports, getNFT, hfs) + WASM_IMPORT_FUNC(imports, accountKeylet, hfs) + WASM_IMPORT_FUNC(imports, credentialKeylet, hfs) + WASM_IMPORT_FUNC(imports, escrowKeylet, hfs) + WASM_IMPORT_FUNC(imports, oracleKeylet, hfs) + WASM_IMPORT_FUNC(imports, updateData, hfs) + WASM_IMPORT_FUNC(imports, computeSha512HalfHash, hfs) + WASM_IMPORT_FUNC(imports, print, hfs) - auto dataLen = (int32_t)data.size(); - auto dataPtr = alloc(dataLen); - auto retPtr = alloc(8); - if (dataPtr && retPtr) - { - auto mem = WasmEdge_CallingFrameGetMemoryInstance(fm, 0); - auto res = - WasmEdge_MemoryInstanceSetData(mem, data.data(), dataPtr, dataLen); - if (WasmEdge_ResultOK(res)) - { - unsigned char intBuf[8]; // little-endian - for (size_t i = 0; i < 4; ++i) - { - intBuf[i] = (dataPtr >> (i * 8)) & 0xFF; - } - for (size_t i = 0; i < 4; ++i) - { - intBuf[i + 4] = (dataLen >> (i * 8)) & 0xFF; - } + std::int64_t const sgas = gasLimit; // vm.getGas(); + auto ret = vm.run(wasmCode, funcName, imports); + if (!ret.has_value()) + return Unexpected(ret.error()); + std::int64_t const egas = vm.getGas(); + std::uint64_t const spent = static_cast(sgas - egas); - res = WasmEdge_MemoryInstanceSetData(mem, intBuf, retPtr, 8); - if (WasmEdge_ResultOK(res)) - { - return WasmEdge_ValueGenI32(retPtr); - } - } - } - return Unexpected(WasmEdge_Result_Fail); + return EscrowResult{static_cast(ret.value()), spent}; } -WasmEdge_Result -getTxField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) -{ - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = ((HostFunctions*)data)->getTxField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; -} - -WasmEdge_Result -getLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +WasmEngine::WasmEngine() : impl(std::make_unique()) { - auto type = WasmEdge_ValueGetI32(in[0]); - auto lkData = getParameterData(fm, in, 1); - if (!lkData) - return lkData.error(); - - auto fname = getFieldName(fm, in, 3); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data) - ->getLedgerEntryField(type, lkData.value(), fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; } -WasmEdge_Result -getCurrentLedgerEntryField( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +WasmEngine& +WasmEngine::instance() { - auto fname = getFieldName(fm, in, 0); - if (!fname) - return fname.error(); - - auto fieldData = - ((HostFunctions*)data)->getCurrentLedgerEntryField(fname.value()); - if (!fieldData) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, fieldData.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return WasmEdge_Result_Success; + static WasmEngine e; + return e; } -WasmEdge_Result -getNFT( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +Expected +WasmEngine::run( + wbytes const& wasmCode, + std::string_view funcName, + std::vector const& imports, + std::vector const& params) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto nftId = getFieldName(fm, in, 2); - if (!nftId) - return nftId.error(); - - auto nftURI = - ((HostFunctions*)data)->getNFT(account.value(), nftId.value()); - if (!nftURI) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, nftURI.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->run(wasmCode, funcName, imports, params); } -WasmEdge_Result -accountKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int64_t +WasmEngine::initGas(std::int64_t def) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto keylet = ((HostFunctions*)data)->accountKeylet(account.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->initGas(def); } -WasmEdge_Result -credentialKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int32_t +WasmEngine::initMaxPages(std::int32_t def) { - auto subject = getFieldName(fm, in, 0); - if (!subject) - return subject.error(); - - auto issuer = getFieldName(fm, in, 2); - if (!issuer) - return issuer.error(); - - auto credentialType = getFieldName(fm, in, 4); - if (!credentialType) - return credentialType.error(); - - auto keylet = - ((HostFunctions*)data) - ->credentialKeylet( - subject.value(), issuer.value(), credentialType.value()); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->initMaxPages(def); } -WasmEdge_Result -escrowKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +// gas = 1'000'000'000LL +std::int64_t +WasmEngine::setGas(std::int64_t gas) { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto sequence = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), sequence); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->setGas(gas); } -WasmEdge_Result -oracleKeylet( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +std::int64_t +WasmEngine::getGas() { - auto account = getFieldName(fm, in, 0); - if (!account) - return account.error(); - - auto documentId = WasmEdge_ValueGetI32(in[2]); - - auto keylet = - ((HostFunctions*)data)->escrowKeylet(account.value(), documentId); - if (!keylet) - return WasmEdge_Result_Fail; - - auto pointer = setData(fm, keylet.value()); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return WasmEdge_Result_Success; + return impl->getGas(); } -WasmEdge_Result -updateData( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +wmem +WasmEngine::getMem() const { - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - if (((HostFunctions*)data)->updateData(fname.value())) - return WasmEdge_Result_Success; - else - return WasmEdge_Result_Fail; + return impl->getMem(); } -WasmEdge_Result -computeSha512HalfHash( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +int32_t +WasmEngine::allocate(int32_t size) { - auto fname = getParameterData(fm, in, 0); - if (!fname) - return fname.error(); - - auto hres = ((HostFunctions*)data)->computeSha512HalfHash(fname.value()); - Bytes digest{hres.begin(), hres.end()}; - auto pointer = setData(fm, digest); - if (!pointer) - return pointer.error(); - - out[0] = pointer.value(); - // out[1] = WasmEdge_ValueGenI32(32); - return WasmEdge_Result_Success; + return impl->allocate(size); } -WasmEdge_Result -print( - void* data, - const WasmEdge_CallingFrameContext* fm, - const WasmEdge_Value* in, - WasmEdge_Value* out) +void* +WasmEngine::newTrap(std::string_view msg) { - auto f = getParameterData(fm, in, 0); - if (!f) - return f.error(); - std::string s(f.value().begin(), f.value().end()); - std::cout << s << std::endl; - return WasmEdge_Result_Success; + return impl->newTrap(msg); } -Expected -runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, - HostFunctions* hfs, - uint64_t gasLimit) -{ - // WasmEdge_LogOff(); - // TODO deletes - // create VM and set cost limit - WasmEdge_ConfigureContext* conf = WasmEdge_ConfigureCreate(); - WasmEdge_ConfigureStatisticsSetInstructionCounting(conf, true); - WasmEdge_ConfigureStatisticsSetCostMeasuring(conf, true); - WasmEdge_ConfigureSetMaxMemoryPage(conf, MAX_PAGES); - - WasmEdge_VMContext* VMCxt = WasmEdge_VMCreate(conf, NULL); - WasmEdge_StatisticsContext* StatCxt = - WasmEdge_VMGetStatisticsContext(VMCxt); - WasmEdge_StatisticsSetCostLimit(StatCxt, gasLimit); - - { // register host function - // module - WasmEdge_String libName = WasmEdge_StringCreateByCString("host_lib"); - WasmEdge_ModuleInstanceContext* hostMod = - WasmEdge_ModuleInstanceCreate(libName); - WasmEdge_StringDelete(libName); - - // getLedgerSqn - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerSqn, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerSqn"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getParentLedgerTime - { - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(NULL, 0, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getParentLedgerTime, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getParentLedgerTime"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - // WasmEdge_FunctionInstanceDelete(hostFunc); - } - - // getTxField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getTxField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getTxField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getLedgerEntryField - { - WasmEdge_ValType inputList[5] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 5, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getCurrentLedgerEntryField - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, getCurrentLedgerEntryField, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("getCurrentLedgerEntryField"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // getNFT - { - WasmEdge_ValType inputList[4] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, getNFT, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("getNFT"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // updateData - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, updateData, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("updateData"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // computeSha512HalfHash - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, computeSha512HalfHash, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("computeSha512HalfHash"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // accountKeylet - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, accountKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("accountKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // credentialKeylet - { - WasmEdge_ValType inputList[6] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 6, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, credentialKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - WasmEdge_String fName = - WasmEdge_StringCreateByCString("credentialKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // escrowKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, escrowKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("escrowKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // oracleKeylet - { - WasmEdge_ValType inputList[3] = { - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32(), - WasmEdge_ValTypeGenI32()}; - WasmEdge_ValType returnList[1] = {WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 3, returnList, 1); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate( - hostFuncType, oracleKeylet, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = - WasmEdge_StringCreateByCString("oracleKeylet"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - // print - { - WasmEdge_ValType inputList[2] = { - WasmEdge_ValTypeGenI32(), WasmEdge_ValTypeGenI32()}; - WasmEdge_FunctionTypeContext* hostFuncType = - WasmEdge_FunctionTypeCreate(inputList, 2, NULL, 0); - WasmEdge_FunctionInstanceContext* hostFunc = - WasmEdge_FunctionInstanceCreate(hostFuncType, print, hfs, 100); - // WasmEdge_FunctionTypeDelete(hostFuncType); - // WasmEdge_FunctionInstanceDelete(hostFunc); - - WasmEdge_String fName = WasmEdge_StringCreateByCString("print"); - WasmEdge_ModuleInstanceAddFunction(hostMod, fName, hostFunc); - // WasmEdge_StringDelete(fName); - } - WasmEdge_Result regRe = - WasmEdge_VMRegisterModuleFromImport(VMCxt, hostMod); - if (!WasmEdge_ResultOK(regRe)) - { - printf("host func reg error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - } - - WasmEdge_Result loadRes = - WasmEdge_VMLoadWasmFromBuffer(VMCxt, wasmCode.data(), wasmCode.size()); - if (!WasmEdge_ResultOK(loadRes)) - { - printf("load error, %p, %d\n", wasmCode.data(), wasmCode.size()); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result validateRes = WasmEdge_VMValidate(VMCxt); - if (!WasmEdge_ResultOK(validateRes)) - { - printf("validate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Result instantiateRes = WasmEdge_VMInstantiate(VMCxt); - if (!WasmEdge_ResultOK(instantiateRes)) - { - printf("instantiate error\n"); - return Unexpected(tecFAILED_PROCESSING); - } - WasmEdge_Value funcReturns[1]; - WasmEdge_String func = WasmEdge_StringCreateByCString(funcName.c_str()); - WasmEdge_Result funcRes = - WasmEdge_VMExecute(VMCxt, func, NULL, 0, funcReturns, 1); - - bool ok = WasmEdge_ResultOK(funcRes); - EscrowResult re; - if (ok) - { - auto sc = WasmEdge_VMGetStatisticsContext(VMCxt); - re.cost = WasmEdge_StatisticsGetTotalCost(sc); - // WasmEdge_StatisticsGetTotalCost, WasmEdge_StatisticsGetInstrCount - auto result = WasmEdge_ValueGetI32(funcReturns[0]); - if (result != 0) - re.result = true; - else - re.result = false; - } - else - { - printf("Error message: %s\n", WasmEdge_ResultGetMessage(funcRes)); - } - - WasmEdge_VMDelete(VMCxt); - WasmEdge_StringDelete(func); - // delete other obj allocated - if (ok) - return re; - else - return Unexpected(tecFAILED_PROCESSING); -} } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b0839dc76de..b383bba37d8 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -16,16 +16,43 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMVM_H_INLCUDED -#define RIPPLE_APP_MISC_WASMVM_H_INLCUDED +#pragma once #include +#include +#include #include -#include "xrpl/basics/base_uint.h" -#include +#include +#include +#include +#include + +// #include + +#include + +namespace bft = boost::function_types; namespace ripple { + +static const std::string_view W_ENV = "env"; +static const std::string_view W_HOST_LIB = "host_lib"; +static const std::string_view W_MEM = "memory"; +static const std::string_view W_STORE = "store"; +static const std::string_view W_LOAD = "load"; +static const std::string_view W_SIZE = "size"; +static const std::string_view W_ALLOC = "allocate"; +static const std::string_view W_DEALLOC = "deallocate"; +static const std::string_view W_PROC_EXIT = "proc_exit"; + +using wbytes = std::vector; +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + const uint32_t MAX_PAGES = 128; // 8MB = 64KB*128 typedef std::vector Bytes; @@ -122,12 +149,220 @@ struct HostFunctions virtual ~HostFunctions() = default; }; +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64 }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__); + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + } of; +}; + +template +inline std::vector +wasmParams(Types... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int32_t p, Types... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, std::int64_t p, Types... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, float p, Types... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + return wasmParams(v, std::forward(args)...); +} + +template +inline std::vector +wasmParams(std::vector& v, double p, Types... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + return wasmParams(v, std::forward(args)...); +} + +inline std::vector +wasmParams(std::vector& v) +{ + return v; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class WamrEngine; +class WasmEngine +{ + std::unique_ptr const impl; + + WasmEngine(); + + WasmEngine(WasmEngine const&) = delete; + WasmEngine(WasmEngine&&) = delete; + WasmEngine& + operator=(WasmEngine const&) = delete; + WasmEngine& + operator=(WasmEngine&&) = delete; + +public: + ~WasmEngine() = default; + + static WasmEngine& + instance(); + + Expected + run(wbytes const& wasmCode, + std::string_view funcName = {}, + std::vector const& imports = {}, + std::vector const& params = {}); + + std::int64_t + initGas(std::int64_t def = 1'000'000'000'000LL); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + setGas(std::int64_t gas); + + std::int64_t + getGas(); + + // for host functions usage + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + void* + newTrap(std::string_view msg = {}); +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Expected runEscrowWasm( - std::vector const& wasmCode, - std::string const& funcName, + Bytes const& wasmCode, + std::string_view funcName, HostFunctions* hfs, uint64_t gasLimit); } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMVM_H_INLCUDED From c533abd8b61995e00995a2ec0f1bf83c5d8b9d3d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 1 May 2025 18:41:51 -0400 Subject: [PATCH 011/212] Update size and compute cap defaults (#5417) --- cfg/rippled-example.cfg | 6 +++--- src/test/jtx/impl/envconfig.cpp | 6 +++--- src/xrpld/core/Config.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 6da68410526..bd2b044c4c5 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1259,7 +1259,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_compute_limit = 2000000 # 2 million gas +# extension_compute_limit = 1000000 # 1 million gas # # extension_size_limit = # @@ -1271,7 +1271,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# extension_size_limit = 2000000 # 2 mb +# extension_size_limit = 100000 # 100 kb # # gas_price = # @@ -1281,7 +1281,7 @@ # default. Don't change this without understanding the consequences. # # Example: -# gas_price = 2000000 # 2 drops per gas +# gas_price = 1000000 # 1 drop per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index ab0969c6cb8..79643a8bb9e 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -38,9 +38,9 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = 10; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); - cfg.FEES.extension_compute_limit = 4294967295; - cfg.FEES.extension_size_limit = 4294967295; - cfg.FEES.gas_price = 1000000; + cfg.FEES.extension_compute_limit = 1'000'000; + cfg.FEES.extension_size_limit = 100'000; + cfg.FEES.gas_price = 1'000'000; // 1 drop = 1,000,000 micro-drops // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 4b297c8610d..c1b143b799c 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -74,13 +74,13 @@ struct FeeSetup XRPAmount owner_reserve{2 * DROPS_PER_XRP}; /** The compute limit for Feature Extensions. */ - std::uint32_t extension_compute_limit{4294967295}; + std::uint32_t extension_compute_limit{1'000'000}; /** The WASM size limit for Feature Extensions. */ - std::uint32_t extension_size_limit{4294967295}; + std::uint32_t extension_size_limit{100'000}; /** The price of 1 WASM gas, in micro-drops. */ - std::uint32_t gas_price{1000000}; + std::uint32_t gas_price{1'000'000}; /* (Remember to update the example cfg files when changing any of these * values.) */ From 1e9ff88a00500621a187fa5c1ab9fa1a9ef4be98 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 8 May 2025 12:39:37 -0400 Subject: [PATCH 012/212] Fix CI build issues * Mac build fix * Windows build fix * Windows instruction counter fix --- external/wamr/patches/ripp_metering.patch | 193 ++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 3 +- src/xrpld/app/misc/WasmVM.cpp | 9 + 3 files changed, 134 insertions(+), 71 deletions(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 7cc3544b685..a2abf37a57c 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -87,7 +87,7 @@ index ce0c1fa7..2713a092 100644 /** * Cache for diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index d33c0272..900fb536 100644 +index d33c0272..21bfdf29 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() @@ -122,15 +122,39 @@ index d33c0272..900fb536 100644 WASMFuncType * wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, uint32 module_type) -@@ -7803,7 +7828,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7792,13 +7817,14 @@ wasm_runtime_get_module_name(wasm_module_t module) + bool + wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + { ++#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 + uint8 *boundary = exec_env->native_stack_boundary; + RECORD_STACK_USAGE(exec_env, (uint8 *)&boundary); + if (boundary == NULL) { + /* the platform doesn't support os_thread_get_stack_boundary */ + return true; + } +-#if defined(OS_ENABLE_HW_BOUND_CHECK) && WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 ++#if defined(OS_ENABLE_HW_BOUND_CHECK) + uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; - #endif -- if ((uint8 *)&boundary < boundary) { -+ if (((uint8 *)&boundary < boundary) && ((uint8 *)&boundary > exec_env->native_stack_boundary)){ - wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +@@ -7808,6 +7834,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; + } ++#endif + return true; + } + +@@ -7830,7 +7857,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, + boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; + if ((uint8 *)&boundary < boundary) { + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +- "native stack overflow"); ++ "native s stack overflow"); + return false; + } + return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h index 8ac032bf..5ca5d489 100644 --- a/core/iwasm/common/wasm_runtime_common.h @@ -163,10 +187,22 @@ index 8ac032bf..5ca5d489 100644 bool enable); diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..82e048c0 100644 +index 241a0eec..9eb0dde1 100644 --- a/core/iwasm/include/wasm_c_api.h +++ b/core/iwasm/include/wasm_c_api.h -@@ -701,6 +701,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); +@@ -19,8 +19,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_API_EXTERN + #endif + #else + #define WASM_API_EXTERN +@@ -701,6 +703,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); // func_name. If the function is not found, return 0. WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); @@ -179,10 +215,22 @@ index 241a0eec..82e048c0 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b73a0364..f7e20b24 100644 +index b73a0364..3fd0949f 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h -@@ -1821,6 +1821,27 @@ WASM_RUNTIME_API_EXTERN void +@@ -20,8 +20,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_RUNTIME_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_RUNTIME_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_RUNTIME_API_EXTERN + #endif + #elif defined(__GNUC__) || defined(__clang__) + #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) +@@ -1821,6 +1823,27 @@ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, uint8_t *native_stack_boundary); @@ -211,7 +259,7 @@ index b73a0364..f7e20b24 100644 * Dump runtime memory consumption, including: * Exec env memory consumption diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 41ac4c72..1aa1fe1c 100644 +index 41ac4c72..bd8f714a 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, @@ -243,18 +291,20 @@ index 41ac4c72..1aa1fe1c 100644 #endif #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1562,6 +1568,18 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) +@@ -1562,6 +1568,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) #endif } +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute == 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ else if (instructions_to_execute > 0) \ -+ instructions_to_execute--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) \ ++ { \ ++ instructions_to_execute -= instructions_schedule[opcode];\ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 +#endif @@ -262,21 +312,25 @@ index 41ac4c72..1aa1fe1c 100644 static void wasm_interp_call_func_bytecode(WASMModuleInstance *module, WASMExecEnv *exec_env, -@@ -1605,6 +1623,13 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1605,6 +1625,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 local_idx, local_offset, global_idx; uint8 local_type, *global_addr; uint32 cache_index, type_index, param_cell_num, cell_num; + +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; ++ int64 const *instructions_schedule = NULL; + if(exec_env) ++ { + instructions_to_execute = exec_env->instructions_to_execute; ++ instructions_schedule = exec_env->instructions_schedule; ++ } +#endif + #if WASM_ENABLE_EXCE_HANDLING != 0 int32_t exception_tag_index; #endif -@@ -6859,6 +6884,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -288,7 +342,7 @@ index 41ac4c72..1aa1fe1c 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6899,6 +6929,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6899,6 +6935,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -302,22 +356,21 @@ index 41ac4c72..1aa1fe1c 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index f33ad60e..a7078fe8 100644 +index f33ad60e..9cbf2010 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -105,6 +105,20 @@ typedef float64 CellType_F64; +@@ -105,6 +105,19 @@ typedef float64 CellType_F64; goto unaligned_atomic; \ } while (0) +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) \ -+ { \ -+ instructions_to_execute -= instructions_schedule[opc]; \ -+ if (instructions_to_execute < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ ++#define CHECK_INSTRUCTION_LIMIT() \ ++ if (instructions_to_execute >= 0) { \ ++ instructions_to_execute -= instructions_schedule[opcode]; \ ++ if (instructions_to_execute < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ + } +#else +#define CHECK_INSTRUCTION_LIMIT() (void)0 @@ -326,40 +379,24 @@ index f33ad60e..a7078fe8 100644 static inline uint32 rotl32(uint32 n, uint32 c) { -@@ -1439,8 +1453,10 @@ wasm_interp_dump_op_count() - #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0 - #define FETCH_OPCODE_AND_DISPATCH() \ - do { \ -+ const uint64 opc = *frame_ip; \ - const void *p_label_addr = *(void **)frame_ip; \ - frame_ip += sizeof(void *); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1450,8 +1466,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* int32 relative offset was emitted in 64-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1460,8 +1478,10 @@ wasm_interp_dump_op_count() - const void *p_label_addr; \ - bh_assert(((uintptr_t)frame_ip & 1) == 0); \ - /* uint32 label address was emitted in 32-bit target */ \ -+ const uint64 opc = LOAD_U32_WITH_2U16S(frame_ip); \ - p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ +@@ -1466,12 +1479,14 @@ wasm_interp_dump_op_count() } while (0) #endif -@@ -1538,6 +1558,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() CHECK_INSTRUCTION_LIMIT(); FETCH_OPCODE_AND_DISPATCH() + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ + + #define HANDLE_OP(opcode) case opcode: +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ + +@@ -1538,6 +1553,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 *maddr = NULL; uint32 local_idx, local_offset, global_idx; uint8 opcode = 0, local_type, *global_addr; @@ -367,8 +404,7 @@ index f33ad60e..a7078fe8 100644 +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + int64 instructions_to_execute = -1; + int64 const *instructions_schedule = NULL; -+ if(exec_env) -+ { ++ if (exec_env) { + instructions_to_execute = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; + } @@ -377,29 +413,46 @@ index f33ad60e..a7078fe8 100644 #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -@@ -7761,6 +7792,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7761,6 +7786,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif + if (!prev_frame->ip) /* Called from native. */ return; -@@ -7789,6 +7825,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7789,6 +7819,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) ++ if (exec_env) + exec_env->instructions_to_execute = instructions_to_execute; +#endif return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h +index ac1a95ea..e23b500e 100644 +--- a/core/shared/platform/include/platform_wasi_types.h ++++ b/core/shared/platform/include/platform_wasi_types.h +@@ -36,7 +36,11 @@ extern "C" { + #if WASM_ENABLE_UVWASI != 0 || WASM_ENABLE_LIBC_WASI == 0 + #define assert_wasi_layout(expr, message) /* nothing */ + #else +-#define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #ifndef _MSC_VER ++ #define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #else ++ #define assert_wasi_layout(expr, message) static_assert(expr, message) ++ #endif + #endif + + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); diff --git a/doc/build_wamr.md b/doc/build_wamr.md index 6425450b..94dd9628 100644 --- a/doc/build_wamr.md diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a92d8e463e4..a781aadea9c 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -31,10 +31,11 @@ static void print_wasm_error(const char* message, wasm_trap_t* trap) { fprintf(stderr, "WAMR error: %s\n", message); - wasm_byte_vec_t error_message; if (trap) { + wasm_byte_vec_t error_message; + wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); fprintf( diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index d786cae7fbe..46267d55b57 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -57,11 +57,20 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports); + + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + if (!ret.has_value()) + { + // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); + } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); + // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From 5b43ec7f7386ede320bea75080117f8e12187ebe Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 20 May 2025 16:12:19 -0400 Subject: [PATCH 013/212] refactor: switch function name from `ready` to `finish` (#5430) --- src/test/app/Escrow_test.cpp | 1161 +--------------- src/test/app/Wasm_test.cpp | 1839 +------------------------ src/test/app/wasm_fixtures/fixtures.h | 1569 +++++++++++++++++++++ src/xrpld/app/misc/WasmVM.cpp | 2 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- 5 files changed, 1589 insertions(+), 2984 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.h diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 94e71cfdcfb..4e39ac298f4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -29,6 +30,7 @@ #include #include +#include #include namespace ripple { @@ -1699,23 +1701,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1862,23 +1851,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // featureSmartEscrow disabled @@ -1988,23 +1964,10 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // #[no_mangle] - // pub fn ready() -> bool { + // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765744c65" - "6467657253716e0000030201000405017001010105030100100619037f01418080" - "c0000b7f00418080c0000b7f00418080c0000b072d04066d656d6f727902000572" - "6561647900010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a0d010b0010808080800041044a0b006c046e616d65000e0d7761736d5f6c6962" - "2e7761736d01410200375f5a4e387761736d5f6c696238686f73745f6c69623132" - "6765744c656467657253716e313768303033306666356636376562356638314501" - "057265616479071201000f5f5f737461636b5f706f696e74657200550970726f64" - "756365727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38332e302d6e696768746c79202863326637346333" - "663920323032342d30392d30392900490f7461726765745f666561747572657304" - "2b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732b0f7265" - "666572656e63652d74797065732b087369676e2d657874"; + static auto wasmHex = ledgerSqnHex; { // basic FinishFunction situation @@ -2217,1113 +2180,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: figure out how to make this a fixture in a separate file - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); // let dest = get_current_escrow_destination(); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a46d71a5699..5c9c0afc9c2 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -17,12 +17,15 @@ */ //============================================================================== +#include #include #include #include +#include + namespace ripple { namespace test { @@ -104,1113 +107,7 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN1() { testcase("escrow wasm devnet 1 test"); - auto wasmHex = - "0061736d0100000001690f60037f7f7f017f60027f7f017f60017f0060027f7f00" - "60057f7f7f7f7f017f6000017f60037e7f7f017f60057f7f7f7f7f0060037f7f7f" - "0060067f7f7f7f7f7f017f600b7f7f7f7f7f7f7f7f7f7f7f017f60017f017f6004" - "7f7f7f7f0060000060057f7e7e7e7e00028c010508686f73745f6c696205707269" - "6e74000308686f73745f6c69620a67657454784669656c64000108686f73745f6c" - "69621a67657443757272656e744c6564676572456e7472794669656c6400010868" - "6f73745f6c6962136765744c6564676572456e7472794669656c64000408686f73" - "745f6c696213676574506172656e744c656467657254696d650005035453020603" - "070101080901010a01000202010102080008000b0c030101010104050802030303" - "0d03010204030008010101010d040001010801010b02030d0d0203010101020d0c" - "0c0001010d030302020c0300000e0405017001212105030100110619037f014180" - "80c0000b7f0041dca2c0000b7f0041e0a2c0000b074506066d656d6f7279020005" - "7265616479002308616c6c6f63617465003d0a6465616c6c6f63617465003f0a5f" - "5f646174615f656e6403010b5f5f686561705f6261736503020926010041010b20" - "31322b0e091f0d2133343c453b464f54121815101420131e37383944474b4c4d0a" - "e1ca0153de0101027f23808080800041c0006b2201248080808000200141003602" - "14200142808080801037020c200141033a00382001412036022820014100360234" - "2001418080c08000360230200141003602202001410036021820012001410c6a36" - "022c024020002000411f7522027320026bad2000417f73411f76200141186a1086" - "808080000d00200128020c21002001280210220220012802141080808080000240" - "2000450d00200220001087808080000b200141c0006a2480808080000f0b41a880" - "c0800041372001413f6a419880c0800041ac81c08000108880808000000bec0203" - "027f017e037f23808080800041306b220324808080800041272104024002402000" - "4290ce005a0d00200021050c010b412721040340200341096a20046a2206417c6a" - "20004290ce0080220542f0b1037e20007ca7220741ffff037141e4006e22084101" - "74419a85c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff0371" - "410174419a85c080006a2f00003b00002004417c6a2104200042ffc1d72f562106" - "2005210020060d000b0b02400240200542e300560d002005a721060c010b200341" - "096a2004417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a" - "41ffff0371410174419a85c080006a2f00003b00000b024002402006410a490d00" - "200341096a2004417e6a22046a2006410174419a85c080006a2f00003b00000c01" - "0b200341096a2004417f6a22046a20064130723a00000b20022001410141002003" - "41096a20046a412720046b108c808080002104200341306a24808080800020040b" - "6c01027f024002402000417c6a2802002202417871220341044108200241037122" - "021b20016a490d0002402002450d002003200141276a4b0d020b200010a5808080" - "000f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec0" - "800010a680808000000b8f0101017f23808080800041c0006b2205248080808000" - "2005200136020c2005200036020820052003360214200520023602102005410236" - "021c200541b884c08000360218200542023702242005418180808000ad42208620" - "0541106aad843703382005418280808000ad422086200541086aad843703302005" - "200541306a360220200541186a200410aa80808000000b9e0301067f2380808080" - "0041c0006b220224808080800002400240200028020022032d00000d0020012802" - "14419582c080004104200128021828020c118080808000808080800021000c010b" - "4101210020012802142204419982c0800041042001280218220528020c22061180" - "8080800080808080000d00200341016a210302400240200128021c22074104710d" - "0041012100200441f184c080004101200611808080800080808080000d02200320" - "01108a80808000450d010c020b200441f284c08000410220061180808080008080" - "8080000d0141012100200241013a001b200220053602102002200436020c200220" - "07360238200241c884c08000360234200220012d00203a003c2002200128021036" - "022c200220012902083702242002200129020037021c20022002411b6a36021420" - "022002410c6a36023020032002411c6a108a808080000d01200228023041ec84c0" - "80004102200228023428020c11808080800080808080000d010b2001280214419c" - "97c080004101200128021828020c118080808000808080800021000b200241c000" - "6a24808080800020000be90201057f2380808080004180016b2202248080808000" - "0240024002400240200128021c22034110710d0020034120710d01200031000041" - "01200110868080800021000c030b20002d0000210041ff00210303402002200322" - "046a22052000410f712203413072200341d7006a2003410a491b3a00002004417f" - "6a2103200041ff017122064104762100200641104f0d000c020b0b20002d000021" - "0041ff00210303402002200322046a22052000410f712203413072200341376a20" - "03410a491b3a00002004417f6a2103200041ff017122064104762100200641104f" - "0d000b02402004418101490d002004418001418885c08000108b80808000000b20" - "014101419885c0800041022005418101200441016a6b108c8080800021000c010b" - "02402004418101490d002004418001418885c08000108b80808000000b20014101" - "419885c0800041022005418101200441016a6b108c8080800021000b2002418001" - "6a24808080800020000b7902017f017e23808080800041306b2203248080808000" - "20032000360200200320013602042003410236020c200341d887c0800036020820" - "0342023702142003418380808000ad4220862204200341046aad84370328200320" - "042003ad843703202003200341206a360210200341086a200210aa80808000000b" - "cb0501077f0240024020010d00200541016a2106200028021c2107412d21080c01" - "0b412b418080c400200028021c220741017122011b2108200120056a21060b0240" - "024020074104710d00410021020c010b0240024020030d00410021090c010b0240" - "2003410371220a0d000c010b41002109200221010340200920012c000041bf7f4a" - "6a2109200141016a2101200a417f6a220a0d000b0b200920066a21060b02402000" - "2802000d000240200028021422012000280218220920082002200310ad80808000" - "450d0041010f0b200120042005200928020c11808080800080808080000f0b0240" - "0240024002402000280204220120064b0d00200028021422012000280218220920" - "082002200310ad80808000450d0141010f0b2007410871450d0120002802102107" - "2000413036021020002d0020210b4101210c200041013a00202000280214220920" - "00280218220a20082002200310ad808080000d02200120066b41016a2101024003" - "402001417f6a2201450d0120094130200a2802101181808080008080808000450d" - "000b41010f0b0240200920042005200a28020c1180808080008080808000450d00" - "41010f0b2000200b3a00202000200736021041000f0b200120042005200928020c" - "1180808080008080808000210c0c010b200120066b210702400240024020002d00" - "2022010e0402000100020b20072101410021070c010b2007410176210120074101" - "6a41017621070b200141016a210120002802102106200028021821092000280214" - "210a024003402001417f6a2201450d01200a200620092802101181808080008080" - "808000450d000b41010f0b4101210c200a200920082002200310ad808080000d00" - "200a20042005200928020c11808080800080808080000d00410021010340024020" - "072001470d0020072007490f0b200141016a2101200a2006200928021011818080" - "80008080808000450d000b2001417f6a2007490f0b200c0b6601017f2380808080" - "0041106b220224808080800020022000280200220041046a36020c200141e181c0" - "8000410941ea81c08000410b200041848080800041f581c0800041092002410c6a" - "418580808000108f808080002100200241106a24808080800020000be70201057f" - "2380808080004180016b22022480808080000240024002400240200128021c2203" - "4110710d0020034120710d0120003502004101200110868080800021000c030b20" - "00280200210041ff00210303402002200322046a22052000410f71220341307220" - "0341d7006a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000c020b0b2000280200210041ff00210303402002200322046a22" - "052000410f712203413072200341376a2003410a491b3a00002004417f6a210320" - "004110492106200041047621002006450d000b02402004418101490d0020044180" - "01418885c08000108b80808000000b20014101419885c080004102200541810120" - "0441016a6b108c8080800021000c010b02402004418101490d0020044180014188" - "85c08000108b80808000000b20014101419885c080004102200541810120044101" - "6a6b108c8080800021000b20024180016a24808080800020000bf50101017f2380" - "8080800041106b220b248080808000200028021420012002200028021828020c11" - "808080800080808080002102200b41003a000d200b20023a000c200b2000360208" - "200b41086a200320042005200610b680808000200720082009200a10b680808000" - "210a200b2d000d2202200b2d000c2201722100024020024101470d002001410171" - "0d000240200a28020022002d001c4104710d00200028021441ef84c08000410220" - "0028021828020c118080808000808080800021000c010b200028021441ee84c080" - "004101200028021828020c118080808000808080800021000b200b41106a248080" - "80800020004101710b12002000418080c0800020011091808080000bbf05010a7f" - "23808080800041306b2203248080808000200341033a002c2003412036021c4100" - "210420034100360228200320013602242003200036022020034100360214200341" - "0036020c02400240024002400240200228021022050d00200228020c2200450d01" - "20022802082101200041037421062000417f6a41ffffffff017141016a21042002" - "280200210003400240200041046a2802002207450d002003280220200028020020" - "07200328022428020c11808080800080808080000d040b20012802002003410c6a" - "200128020411818080800080808080000d03200141086a2101200041086a210020" - "0641786a22060d000c020b0b20022802142201450d00200141057421082001417f" - "6a41ffffff3f7141016a2104200228020821092002280200210041002106034002" - "40200041046a2802002201450d0020032802202000280200200120032802242802" - "0c11808080800080808080000d030b2003200520066a220141106a28020036021c" - "20032001411c6a2d00003a002c2003200141186a2802003602282001410c6a2802" - "0021074100210a4100210b024002400240200141086a2802000e03010002010b20" - "07410374210c4100210b2009200c6a220c2802040d01200c28020021070b410121" - "0b0b200320073602102003200b36020c200141046a280200210702400240024020" - "012802000e03010002010b2007410374210b2009200b6a220b2802040d01200b28" - "020021070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a200128020411818080800080808080000d02" - "200041086a21002008200641206a2206470d000b0b200420022802044f0d012003" - "280220200228020020044103746a22012802002001280204200328022428020c11" - "80808080008080808000450d010b410121010c010b410021010b200341306a2480" - "8080800020010b1e01017f024020002802002201450d0020002802042001108780" - "8080000b0b1e01017f024020002802002201450d00200028020420011087808080" - "000b0b2200200128021441dc81c080004105200128021828020c11808080800080" - "808080000be30201027f23808080800041106b2202248080808000024002400240" - "02402001418001490d002002410036020c2001418010490d010240200141808004" - "4f0d0020022001413f71418001723a000e20022001410c7641e001723a000c2002" - "2001410676413f71418001723a000d410321010c030b20022001413f7141800172" - "3a000f2002200141127641f001723a000c20022001410676413f71418001723a00" - "0e20022001410c76413f71418001723a000d410421010c020b0240200028020822" - "032000280200470d0020001096808080000b2000200341016a3602082000280204" - "20036a20013a00000c020b20022001413f71418001723a000d2002200141067641" - "c001723a000c410221010b02402000280200200028020822036b20014f0d002000" - "20032001109780808000200028020821030b200028020420036a2002410c6a2001" - "10d6808080001a2000200320016a3602080b200241106a24808080800041000b55" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "01109c80808000024020012802082200418180808078460d002000200128020c10" - "9d80808000000b200141106a2480808080000b5201017f23808080800041106b22" - "03248080808000200341086a200020012002109c80808000024020032802082202" - "418180808078460d002002200328020c109d80808000000b200341106a24808080" - "80000b4b01017f02402000280200200028020822036b20024f0d00200020032002" - "109780808000200028020821030b200028020420036a2001200210d6808080001a" - "2000200320026a36020841000b6f01017f0240024002402002280204450d000240" - "200228020822030d0041002d00b89ec080001a0c020b200228020020032001109a" - "8080800021020c020b41002d00b89ec080001a0b2001109b8080800021020b2000" - "200136020820002002410120021b36020420002002453602000b800601057f0240" - "024002402000417c6a22032802002204417871220541044108200441037122061b" - "20016a490d0002402006450d002005200141276a4b0d020b41102002410b6a4178" - "712002410b491b210102400240024020060d002001418002490d01200520014104" - "72490d01200520016b418180084f0d010c020b200041786a220720056a21060240" - "024002400240200520014f0d00200641002802aca2c08000460d03200641002802" - "a8a2c08000460d02200628020422044102710d042004417871220420056a220520" - "01490d042006200410a780808000200520016b22024110490d0120032001200328" - "020041017172410272360200200720016a22012002410372360204200720056a22" - "0520052802044101723602042001200210a88080800020000f0b200520016b2202" - "410f4d0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210a88080800020000f0b200320" - "05200328020041017172410272360200200720056a220220022802044101723602" - "0420000f0b41002802a0a2c0800020056a22052001490d0102400240200520016b" - "2202410f4b0d0020032004410171200572410272360200200720056a2202200228" - "020441017236020441002102410021010c010b2003200120044101717241027236" - "0200200720016a22012002410172360204200720056a2205200236020020052005" - "280204417e713602040b410020013602a8a2c08000410020023602a0a2c0800020" - "000f0b41002802a4a2c0800020056a220520014b0d040b02402002109b80808000" - "22050d0041000f0b20052000417c4178200328020022014103711b20014178716a" - "2201200220012002491b10d6808080002102200010a580808000200221000b2000" - "0f0b41818ec0800041b08ec0800010a680808000000b41c08ec0800041f08ec080" - "0010a680808000000b20032001200441017172410272360200200720016a220220" - "0520016b2205410172360204410020053602a4a2c08000410020023602aca2c080" - "0020000bcb2502087f017e02400240024002400240024002400240200041f50149" - "0d0041002101200041cdff7b4f0d052000410b6a22014178712102410028029ca2" - "c080002203450d04411f21040240200041f4ffff074b0d00200241062001410876" - "6722006b7641017120004101746b413e6a21040b410020026b2101024020044102" - "7441809fc080006a28020022050d0041002100410021060c020b41002100200241" - "00411920044101766b2004411f461b742107410021060340024020052205280204" - "41787122082002490d00200820026b220820014f0d00200821012005210620080d" - "004100210120052106200521000c040b200528021422082000200820052007411d" - "764104716a41106a2802002205471b200020081b2100200741017421072005450d" - "020c000b0b02404100280298a2c08000220541102000410b6a41f803712000410b" - "491b22024103762201762200410371450d00024002402000417f7341017120016a" - "220741037422004190a0c080006a220120004198a0c080006a2802002202280208" - "2206460d002006200136020c200120063602080c010b41002005417e2007777136" - "0298a2c080000b20022000410372360204200220006a2200200028020441017236" - "0204200241086a0f0b200241002802a0a2c080004d0d0302400240024020000d00" - "410028029ca2c080002200450d0620006841027441809fc080006a280200220628" - "020441787120026b21012006210503400240200628021022000d00200628021422" - "000d0020052802182104024002400240200528020c22002005470d002005411441" - "10200528021422001b6a28020022060d01410021000c020b200528020822062000" - "36020c200020063602080c010b200541146a200541106a20001b21070340200721" - "082006220041146a200041106a200028021422061b210720004114411020061b6a" - "28020022060d000b200841003602000b2004450d040240200528021c4102744180" - "9fc080006a22062802002005460d0020044110411420042802102005461b6a2000" - "3602002000450d050c040b2006200036020020000d034100410028029ca2c08000" - "417e200528021c777136029ca2c080000c040b200028020441787120026b220620" - "01200620014922061b21012000200520061b2105200021060c000b0b0240024020" - "0020017441022001742200410020006b727168220841037422014190a0c080006a" - "220620014198a0c080006a28020022002802082207460d002007200636020c2006" - "20073602080c010b41002005417e20087771360298a2c080000b20002002410372" - "360204200020026a2207200120026b2206410172360204200020016a2006360200" - "024041002802a0a2c080002205450d0020054178714190a0c080006a2101410028" - "02a8a2c080002102024002404100280298a2c08000220841012005410376742205" - "710d0041002008200572360298a2c08000200121050c010b200128020821050b20" - "0120023602082005200236020c2002200136020c200220053602080b4100200736" - "02a8a2c08000410020063602a0a2c08000200041086a0f0b200020043602180240" - "20052802102206450d0020002006360210200620003602180b2005280214220645" - "0d0020002006360214200620003602180b02400240024020014110490d00200520" - "02410372360204200520026a22022001410172360204200220016a200136020041" - "002802a0a2c080002207450d0120074178714190a0c080006a210641002802a8a2" - "c080002100024002404100280298a2c08000220841012007410376742207710d00" - "41002008200772360298a2c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200520012002" - "6a2200410372360204200520006a220020002802044101723602040c010b410020" - "023602a8a2c08000410020013602a0a2c080000b200541086a0f0b024020002006" - "720d004100210641022004742200410020006b722003712200450d032000684102" - "7441809fc080006a28020021000b2000450d010b03402000200620002802044178" - "71220520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b2106200120082007" - "1b21012005210020050d000b0b2006450d00024041002802a0a2c0800022002002" - "490d002001200020026b4f0d010b20062802182104024002400240200628020c22" - "002006470d00200641144110200628021422001b6a28020022050d01410021000c" - "020b20062802082205200036020c200020053602080c010b200641146a20064110" - "6a20001b21070340200721082005220041146a200041106a200028021422051b21" - "0720004114411020051b6a28020022050d000b200841003602000b2004450d0302" - "40200628021c41027441809fc080006a22052802002006460d0020044110411420" - "042802102006461b6a20003602002000450d040c030b2005200036020020000d02" - "4100410028029ca2c08000417e200628021c777136029ca2c080000c030b024002" - "40024002400240024041002802a0a2c08000220020024f0d00024041002802a4a2" - "c08000220020024b0d0041002101200241af80046a220641107640002200417f46" - "22070d0720004110742205450d07410041002802b0a2c08000410020064180807c" - "7120071b22086a22003602b0a2c08000410041002802b4a2c08000220120002001" - "20004b1b3602b4a2c0800002400240024041002802aca2c080002201450d004180" - "a0c080002100034020002802002206200028020422076a2005460d022000280208" - "22000d000c030b0b0240024041002802bca2c080002200450d00200020054d0d01" - "0b410020053602bca2c080000b410041ff1f3602c0a2c0800041002008360284a0" - "c0800041002005360280a0c0800041004190a0c0800036029ca0c0800041004198" - "a0c080003602a4a0c0800041004190a0c08000360298a0c08000410041a0a0c080" - "003602aca0c0800041004198a0c080003602a0a0c08000410041a8a0c080003602" - "b4a0c08000410041a0a0c080003602a8a0c08000410041b0a0c080003602bca0c0" - "8000410041a8a0c080003602b0a0c08000410041b8a0c080003602c4a0c0800041" - "0041b0a0c080003602b8a0c08000410041c0a0c080003602cca0c08000410041b8" - "a0c080003602c0a0c08000410041c8a0c080003602d4a0c08000410041c0a0c080" - "003602c8a0c080004100410036028ca0c08000410041d0a0c080003602dca0c080" - "00410041c8a0c080003602d0a0c08000410041d0a0c080003602d8a0c080004100" - "41d8a0c080003602e4a0c08000410041d8a0c080003602e0a0c08000410041e0a0" - "c080003602eca0c08000410041e0a0c080003602e8a0c08000410041e8a0c08000" - "3602f4a0c08000410041e8a0c080003602f0a0c08000410041f0a0c080003602fc" - "a0c08000410041f0a0c080003602f8a0c08000410041f8a0c08000360284a1c080" - "00410041f8a0c08000360280a1c0800041004180a1c0800036028ca1c080004100" - "4180a1c08000360288a1c0800041004188a1c08000360294a1c0800041004188a1" - "c08000360290a1c0800041004190a1c0800036029ca1c0800041004198a1c08000" - "3602a4a1c0800041004190a1c08000360298a1c08000410041a0a1c080003602ac" - "a1c0800041004198a1c080003602a0a1c08000410041a8a1c080003602b4a1c080" - "00410041a0a1c080003602a8a1c08000410041b0a1c080003602bca1c080004100" - "41a8a1c080003602b0a1c08000410041b8a1c080003602c4a1c08000410041b0a1" - "c080003602b8a1c08000410041c0a1c080003602cca1c08000410041b8a1c08000" - "3602c0a1c08000410041c8a1c080003602d4a1c08000410041c0a1c080003602c8" - "a1c08000410041d0a1c080003602dca1c08000410041c8a1c080003602d0a1c080" - "00410041d8a1c080003602e4a1c08000410041d0a1c080003602d8a1c080004100" - "41e0a1c080003602eca1c08000410041d8a1c080003602e0a1c08000410041e8a1" - "c080003602f4a1c08000410041e0a1c080003602e8a1c08000410041f0a1c08000" - "3602fca1c08000410041e8a1c080003602f0a1c08000410041f8a1c08000360284" - "a2c08000410041f0a1c080003602f8a1c0800041004180a2c0800036028ca2c080" - "00410041f8a1c08000360280a2c0800041004188a2c08000360294a2c080004100" - "4180a2c08000360288a2c08000410020053602aca2c0800041004188a2c0800036" - "0290a2c080004100200841586a22003602a4a2c080002005200041017236020420" - "0520006a4128360204410041808080013602b8a2c080000c080b200120054f0d00" - "200620014b0d00200028020c450d030b410041002802bca2c08000220020052000" - "2005491b3602bca2c08000200520086a21064180a0c08000210002400240024003" - "40200028020022072006460d01200028020822000d000c020b0b200028020c450d" - "010b4180a0c0800021000240034002402000280200220620014b0d002001200620" - "002802046a2206490d020b200028020821000c000b0b410020053602aca2c08000" - "4100200841586a22003602a4a2c0800020052000410172360204200520006a4128" - "360204410041808080013602b8a2c080002001200641606a41787141786a220020" - "00200141106a491b2207411b3602044100290280a0c080002109200741106a4100" - "290288a0c080003702002007200937020841002008360284a0c080004100200536" - "0280a0c080004100200741086a360288a0c080004100410036028ca0c080002007" - "411c6a2100034020004107360200200041046a22002006490d000b20072001460d" - "0720072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010d0808080000c080b200041f8017141" - "90a0c080006a2106024002404100280298a2c08000220541012000410376742200" - "710d0041002005200072360298a2c08000200621000c010b200628020821000b20" - "0620013602082000200136020c2001200636020c200120003602080c070b200020" - "053602002000200028020420086a360204200520024103723602042007410f6a41" - "787141786a2201200520026a22006b2102200141002802aca2c08000460d032001" - "41002802a8a2c08000460d040240200128020422064103714101470d0020012006" - "417871220610a780808000200620026a2102200120066a220128020421060b2001" - "2006417e7136020420002002410172360204200020026a20023602000240200241" - "8002490d002000200210d0808080000c060b200241f801714190a0c080006a2101" - "024002404100280298a2c08000220641012002410376742202710d004100200620" - "0272360298a2c08000200121020c010b200128020821020b200120003602082002" - "200036020c2000200136020c200020023602080c050b4100200020026b22013602" - "a4a2c08000410041002802aca2c08000220020026a22063602aca2c08000200620" - "0141017236020420002002410372360204200041086a21010c060b41002802a8a2" - "c08000210102400240200020026b2206410f4b0d00410041003602a8a2c0800041" - "0041003602a0a2c0800020012000410372360204200120006a2200200028020441" - "01723602040c010b410020063602a0a2c080004100200120026a22053602a8a2c0" - "800020052006410172360204200120006a2006360200200120024103723602040b" - "200141086a0f0b2000200720086a360204410041002802aca2c080002200410f6a" - "417871220141786a22063602aca2c080004100200020016b41002802a4a2c08000" - "20086a22016a41086a22053602a4a2c0800020062005410172360204200020016a" - "4128360204410041808080013602b8a2c080000c030b410020003602aca2c08000" - "410041002802a4a2c0800020026a22023602a4a2c0800020002002410172360204" - "0c010b410020003602a8a2c08000410041002802a0a2c0800020026a22023602a0" - "a2c0800020002002410172360204200020026a20023602000b200541086a0f0b41" - "00210141002802a4a2c08000220020024d0d004100200020026b22013602a4a2c0" - "8000410041002802aca2c08000220020026a22063602aca2c08000200620014101" - "7236020420002002410372360204200041086a0f0b20010f0b2000200436021802" - "4020062802102205450d0020002005360210200520003602180b20062802142205" - "450d0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a20013602000240" - "2001418002490d002000200110d0808080000c020b200141f801714190a0c08000" - "6a2102024002404100280298a2c08000220541012001410376742201710d004100" - "2005200172360298a2c08000200221010c010b200228020821010b200220003602" - "082001200036020c2000200236020c200020013602080c010b2006200120026a22" - "00410372360204200620006a220020002802044101723602040b200641086a0be9" - "0101037f23808080800041206b2204248080808000024002400240200220036a22" - "0320024f0d00410021020c010b4100210220012802002205410174220620032006" - "20034b1b22034108200341084b1b22034100480d000240024020050d0041002102" - "0c010b2004200536021c20042001280204360214410121020b2004200236021820" - "0441086a2003200441146a109980808000024020042802080d00200428020c2102" - "200120033602002001200236020441818080807821020c010b2004280210210120" - "0428020c21020c010b0b2000200136020420002002360200200441206a24808080" - "80000b1000024020000d0010a9808080000b000b6101017f23808080800041106b" - "220224808080800020022000410c6a36020c200141fe81c08000410d418b82c080" - "0041052000418680808000419082c0800041052002410c6a418780808000108f80" - "8080002100200241106a24808080800020000be00301097f23808080800041c000" - "6b2202248080808000200028020821032000280204210441012105200128021441" - "b083c080004101200128021828020c118080808000808080800021000240200345" - "0d0041002106034020062107410121062000410171210841012100024020080d00" - "02400240200128021c22084104710d002007410171450d01410121002001280214" - "41e784c080004102200128021828020c1180808080008080808000450d010c020b" - "200128021821092001280214210a024020074101710d0041012100200a41888bc0" - "80004101200928020c11808080800080808080000d020b200241013a001b200220" - "093602102002200a36020c20022008360238200241c884c0800036023420022001" - "2d00203a003c2002200128021036022c2002200129020837022420022001290200" - "37021c20022002411b6a36021420022002410c6a360230024020042002411c6a10" - "8a808080000d00200228023041ec84c080004102200228023428020c1180808080" - "00808080800021000c020b410121000c010b20042001108a8080800021000b2004" - "41016a21042003417f6a22030d000b0b024020000d00200128021441f484c08000" - "4101200128021828020c118080808000808080800021050b200241c0006a248080" - "80800020050b4a01017f23808080800041106b2202248080808000200220003602" - "0c200141ee8ac0800041fb8ac080002002410c6a41888080800010a28080800021" - "00200241106a24808080800020000b3d00200128021420002802002d0000410274" - "220041a09ec080006a2802002000418c9ec080006a280200200128021828020c11" - "808080800080808080000be70101017f23808080800041106b2205248080808000" - "20002802142001410d200028021828020c11808080800080808080002101200541" - "003a000d200520013a000c20052000360208200541086a200241042003200410b6" - "80808000210320052d000d220120052d000c2204722100024020014101470d0020" - "044101710d000240200328020022002d001c4104710d00200028021441ef84c080" - "004102200028021828020c118080808000808080800021000c010b200028021441" - "ee84c080004101200028021828020c118080808000808080800021000b20054110" - "6a24808080800020004101710bf513050b7f017e057f027e057f23808080800041" - "c0006b220024808080800041002d00b89ec080001a024002400240024002400240" - "02400240024002400240024002404107109b808080002201450d00200141036a41" - "002800f18bc08000360000200141002800ee8bc080003600002001410710818080" - "800022022800042103200228000021042002410810878080800020014107108780" - "80800041002d00b89ec080001a4107109b808080002201450d00200141036a4100" - "2800f18bc08000360000200141002800ee8bc08000360000200141071082808080" - "002202280004210520022800002106200241081087808080002001410710878080" - "800041002d00b89ec080001a410b109b808080002201450d00200141076a410028" - "00fc8bc08000360000200141002900f58bc080003700002001410b108280808000" - "2202280004210720022800002108200241081087808080002001410b1087808080" - "0041002d00b89ec080001a4107109b808080002201450d00200141036a41002800" - "9f8cc080003600002001410028009c8cc0800036000041e1002008200720014107" - "108380808000220928000421022009280000210a20094108108780808000200041" - "186a200a200210a48080800002400240024020002d00184101460d002000290320" - "210b02402002450d00200a20021087808080000b20014107108780808000410021" - "0941002d00b89ec080001a4104109b808080002201450d03200141c4c2d18b0636" - "0000200141041082808080002202280000210c2002280004210a20024108108780" - "80800020014104108780808000024002400240200a4100480d000240200a0d0041" - "0121014100210d0c030b41002d00b89ec080001a200a109b8080800022010d0141" - "0121090b2009200a109d80808000000b200a210d0b2001200c200a10d680808000" - "2102200a450d014100200a41796a22012001200a4b1b210e200241036a417c7120" - "026b210f4100210103400240024002400240200220016a2d00002209c022104100" - "480d00200f20016b4103710d012001200e4f0d020340200220016a220928020420" - "0928020072418081828478710d03200141086a2201200e490d000c030b0b428080" - "808080202111428080808010211202400240024002400240024002400240024002" - "40024002402009418888c080006a2d0000417e6a0e030003010b0b200141016a22" - "09200a490d01420021110c090b42002111200141016a2213200a490d020c080b42" - "80808080802021114280808080102112200220096a2c000041bf7f4a0d080c060b" - "42002111200141016a2213200a4f0d06200220136a2c0000211302400240024020" - "0941e001460d00200941ed01460d012010411f6a41ff0171410c490d022010417e" - "71416e470d0420134140480d050c040b201341607141a07f460d040c030b201341" - "9f7f4a0d020c030b20134140480d020c010b200220136a2c000021130240024002" - "400240200941907e6a0e050100000002000b2010410f6a41ff017141024b0d0320" - "1341404e0d030c020b201341f0006a41ff017141304f0d020c010b2013418f7f4a" - "0d010b200141026a2209200a4f0d05200220096a2c000041bf7f4a0d0242002112" - "200141036a2209200a4f0d06200220096a2c000041bf7f4c0d04428080808080e0" - "0021110c030b4280808080802021110c020b42002112200141026a2209200a4f0d" - "04200220096a2c000041bf7f4c0d020b428080808080c00021110b428080808010" - "21120c020b200941016a21010c040b420021120b20112012842001ad8421110240" - "200d418080808078470d00200a21142002210d0c070b200020113702242000200d" - "3602182000200aad4220862002ad8437021c41988ac08000412b200041186a41cc" - "81c0800041a882c08000108880808000000b200141016a21010c010b2001200a4f" - "0d000340200220016a2c00004100480d01200a200141016a2201470d000c040b0b" - "2001200a490d000c020b0b200020002d00193a000c41988ac08000412b2000410c" - "6a41888ac0800041a48cc08000108880808000000b200aad2111200221140b2000" - "41186a20142011a710a48080800020002d00184101460d01200029032021124100" - "210f108480808000211541002d00b89ec080001a410b109b808080002216450d00" - "201641076a41002800878cc08000360000201641002900808cc080003700002016" - "410b10828080800022012800002117200128000421132001410810878080800002" - "400240024020130e020f00010b4101210f20172d0000220141556a0e030e010e01" - "0b20172d000021010b0240200141ff017141556a0e03040600060b2013417f6a21" - "09201741016a210220134109490d024100210103402009450d0a20022d00004150" - "6a220e41094b0d084103210f2001ac420a7e2211422088a72011a72210411f7547" - "0d0d200241016a21022009417f6a2109200e41004a2010200e6b22012010487345" - "0d000c0d0b0b000b200020002d00193a000c41988ac08000412b2000410c6a41bc" - "81c0800041b882c08000108880808000000b2009450d01410021014101210f0340" - "20022d000041506a220e41094b0d0a200241016a21022001410a6c200e6b210120" - "09417f6a22090d000c070b0b2013417f6a2109201741016a2102201341094f0d02" - "20090d040b410021010c050b201321092017210220134108490d020b4100210103" - "402009450d0320022d000041506a220e41094b0d014102210f2001ac420a7e2211" - "422088a72011a72210411f75470d06200241016a21022009417f6a2109200e4100" - "482010200e6a220120104873450d000c060b0b4101210f0c040b41002101410121" - "0f034020022d000041506a220e41094b0d04200241016a2102200e2001410a6c6a" - "21012009417f6a22090d000b0b2013450d010b201720131087808080000b201641" - "0b1087808080002004200310808080800020062005108080808000200820071080" - "80808000200c200a10808080800020004100360214200042808080801037020c20" - "0041033a003820004120360228200041003602342000418080c080003602302000" - "41003602202000410036021820002000410c6a36022c0240200b4101200041186a" - "1086808080000d00200028020c2102200028021022092000280214108080808000" - "02402002450d00200920021087808080000b201510858080800020011085808080" - "0041002102024020032005470d0020042006200310d58080800045200b20125871" - "201520014e7121020b0240200d450d002014200d1087808080000b0240200a450d" - "00200c200a1087808080000b02402007450d00200820071087808080000b024020" - "05450d00200620051087808080000b02402003450d00200420031087808080000b" - "200041c0006a24808080800020020f0b41a880c0800041372000413f6a419880c0" - "800041ac81c08000108880808000000b2000200f3a001841988ac08000412b2000" - "41186a41888ac08000418c8cc08000108880808000000bd60202027f027e238080" - "80800041106b220324808080800002400240024002400240024002400240024002" - "40024020020e020200010b4101210220012d000041556a0e03060306030b20012d" - "0000412b470d01200141016a2101200241124921042002417f6a210220040d020c" - "030b200041003a00010c050b200241114f0d010b420021050c010b420021050340" - "2002450d04200320054200420a420010d78080800020012d000041506a2204410a" - "4f0d02024020032903084200510d00200041023a00010c040b200141016a210120" - "02417f6a2102200329030022062004ad7c220520065a0d000b200041023a00010c" - "020b034020012d000041506a2204410a4f0d01200141016a21012005420a7e2004" - "ad7c21052002417f6a2202450d030c000b0b41012101200041013a00010c020b41" - "0121010c010b20002005370308410021010b200020013a0000200341106a248080" - "8080000bbe0601057f200041786a22012000417c6a280200220241787122006a21" - "030240024020024101710d002002410271450d012001280200220220006a210002" - "40200120026b220141002802a8a2c08000470d0020032802044103714103470d01" - "410020003602a0a2c0800020032003280204417e71360204200120004101723602" - "04200320003602000f0b2001200210a7808080000b024002400240024002400240" - "200328020422024102710d00200341002802aca2c08000460d02200341002802a8" - "a2c08000460d0320032002417871220210a7808080002001200220006a22004101" - "72360204200120006a2000360200200141002802a8a2c08000470d014100200036" - "02a0a2c080000f0b20032002417e7136020420012000410172360204200120006a" - "20003602000b2000418002490d022001200010d080808000410021014100410028" - "02c0a2c08000417f6a22003602c0a2c0800020000d0402404100280288a0c08000" - "2200450d00410021010340200141016a2101200028020822000d000b0b41002001" - "41ff1f200141ff1f4b1b3602c0a2c080000f0b410020013602aca2c08000410041" - "002802a4a2c0800020006a22003602a4a2c0800020012000410172360204024020" - "0141002802a8a2c08000470d00410041003602a0a2c08000410041003602a8a2c0" - "80000b200041002802b8a2c0800022044d0d0341002802aca2c080002200450d03" - "4100210241002802a4a2c0800022054129490d024180a0c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b200128020821010c" - "000b0b410020013602a8a2c08000410041002802a0a2c0800020006a22003602a0" - "a2c0800020012000410172360204200120006a20003602000f0b200041f8017141" - "90a0c080006a2103024002404100280298a2c08000220241012000410376742200" - "710d0041002002200072360298a2c08000200321000c010b200328020821000b20" - "0320013602082000200136020c2001200336020c200120003602080f0b02404100" - "280288a0c080002201450d00410021020340200241016a2102200128020822010d" - "000b0b4100200241ff1f200241ff1f4b1b3602c0a2c08000200520044d0d004100" - "417f3602b8a2c080000b0b4d01017f23808080800041206b220224808080800020" - "02410036021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110aa80808000000b820301047f200028020c" - "21020240024002402001418002490d002000280218210302400240024020022000" - "470d00200041144110200028021422021b6a28020022010d01410021020c020b20" - "002802082201200236020c200220013602080c010b200041146a200041106a2002" - "1b21040340200421052001220241146a200241106a200228021422011b21042002" - "4114411020011b6a28020022010d000b200541003602000b2003450d0202402000" - "28021c41027441809fc080006a22012802002000460d0020034110411420032802" - "102000461b6a20023602002002450d030c020b2001200236020020020d01410041" - "0028029ca2c08000417e200028021c777136029ca2c080000c020b024020022000" - "2802082204460d002004200236020c200220043602080f0b41004100280298a2c0" - "8000417e20014103767771360298a2c080000f0b20022003360218024020002802" - "102201450d0020022001360210200120023602180b20002802142201450d002002" - "2001360214200120023602180f0b0ba00401027f200020016a2102024002402000" - "28020422034101710d002003410271450d012000280200220320016a2101024020" - "0020036b220041002802a8a2c08000470d0020022802044103714103470d014100" - "20013602a0a2c0800020022002280204417e713602042000200141017236020420" - "0220013602000c020b2000200310a7808080000b02400240024002402002280204" - "22034102710d00200241002802aca2c08000460d02200241002802a8a2c0800046" - "0d0320022003417871220310a7808080002000200320016a220141017236020420" - "0020016a2001360200200041002802a8a2c08000470d01410020013602a0a2c080" - "000f0b20022003417e7136020420002001410172360204200020016a2001360200" - "0b02402001418002490d002000200110d0808080000f0b200141f801714190a0c0" - "80006a2102024002404100280298a2c08000220341012001410376742201710d00" - "41002003200172360298a2c08000200221010c010b200228020821010b20022000" - "3602082001200036020c2000200236020c200020013602080f0b410020003602ac" - "a2c08000410041002802a4a2c0800020016a22013602a4a2c08000200020014101" - "72360204200041002802a8a2c08000470d01410041003602a0a2c0800041004100" - "3602a8a2c080000f0b410020003602a8a2c08000410041002802a0a2c080002001" - "6a22013602a0a2c0800020002001410172360204200020016a20013602000f0b0b" - "4701017f23808080800041206b2200248080808000200041003602182000410136" - "020c200041dc82c0800036020820004204370210200041086a41f882c0800010aa" - "80808000000b5601017f23808080800041206b2202248080808000200241106a20" - "0041106a290200370300200241086a200041086a290200370300200241013b011c" - "2002200136021820022000290200370300200210ac80808000000b110020003502" - "00410120011086808080000b5d01027f23808080800041206b2201248080808000" - "20002802182102200141106a200041106a290200370300200141086a200041086a" - "2902003703002001200036021c2001200236021820012000290200370300200110" - "d180808000000b490002402002418080c400460d00200020022001280210118180" - "8080008080808000450d0041010f0b024020030d0041000f0b2000200320042001" - "28020c11808080800080808080000b7d02017f017e23808080800041306b220224" - "808080800020022000360200200220013602042002410236020c200241f887c080" - "00360208200242023702142002418380808000ad4220862203200241046aad8437" - "0328200220032002ad843703202002200241206a360210200241086a419487c080" - "0010aa80808000000bc20b010b7f20002802082103024002400240024020002802" - "0022040d002003410171450d010b02402003410171450d00200120026a21050240" - "0240200028020c22060d0041002107200121080c010b4100210741002109200121" - "080340200822032005460d020240024020032c00002208417f4c0d00200341016a" - "21080c010b0240200841604f0d00200341026a21080c010b0240200841704f0d00" - "200341036a21080c010b200341046a21080b200820036b20076a21072006200941" - "016a2209470d000b0b20082005460d00024020082c00002203417f4a0d00200341" - "60491a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b20072002" - "20031b21022003200120031b21010b024020040d00200028021420012002200028" - "021828020c11808080800080808080000f0b2000280204210a024020024110490d" - "0020022001200141036a417c7122076b22096a220b410371210441002106410021" - "03024020012007460d004100210302402009417c4b0d0041002103410021050340" - "2003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a6a200841" - "026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a2103200541046a22050d" - "000b0b200121080340200320082c000041bf7f4a6a2103200841016a2108200941" - "016a22090d000b0b02402004450d002007200b417c716a22082c000041bf7f4a21" - "0620044101460d00200620082c000141bf7f4a6a210620044102460d0020062008" - "2c000241bf7f4a6a21060b200b4102762105200620036a21060340200721042005" - "450d04200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002004200d41f007716a210941002108200421030340200328" - "020c2207417f7341077620074106767241818284087120032802082207417f7341" - "077620074106767241818284087120032802042207417f73410776200741067672" - "41818284087120032802002207417f734107762007410676724181828408712008" - "6a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004200d6a21" - "07200841087641ff81fc0771200841ff81fc07716a418180046c41107620066a21" - "06200c450d000b2004200b41fc01714102746a22082802002203417f7341077620" - "03410676724181828408712103200c4101460d0220082802042207417f73410776" - "20074106767241818284087120036a2103200c4102460d0220082802082208417f" - "7341077620084106767241818284087120036a21030c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d0041002106410021090c010b" - "41002106200121032002410c71220921070340200620032c000041bf7f4a6a2003" - "41016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a2c000041" - "bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d0220012009" - "6a21030340200620032c000041bf7f4a6a2106200341016a21032008417f6a2208" - "0d000c030b0b200028021420012002200028021828020c11808080800080808080" - "000f0b200341087641ff811c71200341ff81fc07716a418180046c41107620066a" - "21060b02400240200a20064d0d00200a20066b2105410021030240024002402000" - "2d00200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a210320002802102109200028021821082000280214" - "210703402003417f6a2203450d0220072009200828021011818080800080808080" - "00450d000b41010f0b200028021420012002200028021828020c11808080800080" - "808080000f0b0240200720012002200828020c1180808080008080808000450d00" - "41010f0b410021030340024020052003470d0020052005490f0b200341016a2103" - "2007200920082802101181808080008080808000450d000b2003417f6a2005490b" - "820302017f017e23808080800041f0006b2203248080808000200341b08dc08000" - "36020c20032000360208200341b08dc08000360214200320013602102003410236" - "021c200341b183c08000360218024020022802000d002003410336025c200341e4" - "83c08000360258200342033702642003418180808000ad4220862204200341106a" - "ad8437034820032004200341086aad843703402003418280808000ad4220862003" - "41186aad843703382003200341386a360260200341d8006a41e899c0800010aa80" - "808000000b200341206a41106a200241106a290200370300200341206a41086a20" - "0241086a290200370300200320022902003703202003410436025c2003419884c0" - "8000360258200342043702642003418180808000ad4220862204200341106aad84" - "37035020032004200341086aad843703482003418980808000ad42208620034120" - "6aad843703402003418280808000ad422086200341186aad843703382003200341" - "386a360260200341d8006a41e899c0800010aa80808000000b1c00200028020020" - "01200028020428020c11818080800080808080000b140020012000280200200028" - "020410af808080000b14002001280214200128021820001091808080000b220020" - "01280214418883c08000410e200128021828020c11808080800080808080000b60" - "01017f23808080800041306b22002480808080002000410136020c200041a883c0" - "8000360208200042013702142000418a80808000ad4220862000412f6aad843703" - "202000200041206a360210200041086a41cc97c0800010aa80808000000be70302" - "057f017e23808080800041c0006b220524808080800041012106024020002d0004" - "0d0020002d0005210702402000280200220828021c22094104710d004101210620" - "0828021441e784c0800041e484c08000200741017122071b4102410320071b2008" - "28021828020c11808080800080808080000d012008280214200120022008280218" - "28020c11808080800080808080000d01200828021441ef97c08000410220082802" - "1828020c11808080800080808080000d0120032008200411818080800080808080" - "0021060c010b41012106024020074101710d00200828021441e984c08000410320" - "0828021828020c11808080800080808080000d01200828021c21090b4101210620" - "0541013a001b2005200829021437020c200541c884c0800036023420052005411b" - "6a360214200520082902083702242008290200210a200520093602382005200828" - "021036022c200520082d00203a003c2005200a37021c20052005410c6a36023020" - "05410c6a2001200210b7808080000d002005410c6a41ef97c08000410210b78080" - "80000d0020032005411c6a200411818080800080808080000d00200528023041ec" - "84c080004102200528023428020c118080808000808080800021060b200041013a" - "0005200020063a0004200541c0006a24808080800020000bdf04010c7f2001417f" - "6a2103200028020421042000280200210520002802082106410021074100210841" - "0021094100210a02400340200a4101710d0102400240200920024b0d0003402001" - "20096a210a0240024002400240200220096b220b41074b0d0020022009470d0120" - "0221090c050b02400240200a41036a417c71220c200a6b220d450d004100210003" - "40200a20006a2d0000410a460d05200d200041016a2200470d000b200d200b4178" - "6a220e4d0d010c030b200b41786a210e0b03404180828408200c2802002200418a" - "94a8d000736b2000724180828408200c41046a2802002200418a94a8d000736b20" - "00727141808182847871418081828478470d02200c41086a210c200d41086a220d" - "200e4d0d000c020b0b410021000340200a20006a2d0000410a460d02200b200041" - "016a2200470d000b200221090c030b0240200d200b470d00200221090c030b200a" - "200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d0000410a" - "460d01200b200041016a2200470d000b200221090c030b2000200d6a21000b2000" - "20096a220c41016a21090240200c20024f0d00200a20006a2d0000410a470d0041" - "00210a2009210d200921000c030b200920024d0d000b0b20082002460d02410121" - "0a2008210d200221000b0240024020062d0000450d00200541e084c08000410420" - "0428020c11808080800080808080000d010b200020086b210b4100210c02402000" - "2008460d00200320006a2d0000410a46210c0b200120086a21002006200c3a0000" - "200d210820052000200b200428020c1180808080008080808000450d010b0b4101" - "21070b20070b6001027f2000280204210220002802002103024020002802082200" - "2d0000450d00200341e084c080004104200228020c118080808000808080800045" - "0d0041010f0b20002001410a463a00002003200120022802101181808080008080" - "8080000b1200200041c884c0800020011091808080000b6a01017f238080808000" - "41306b22032480808080002003200136020c200320003602082003410136021420" - "0341d490c080003602102003420137021c2003418280808000ad42208620034108" - "6aad843703282003200341286a360218200341106a200210aa80808000000b2701" - "017f200028020022002000411f7522027320026bad2000417f73411f7620011086" - "808080000b830201087f2380808080004180016b22022480808080002001280204" - "21032001280200210420002802002100200128021c220521060240200541047145" - "0d002005410872210620040d0020014281808080a0013702000b20012006410472" - "36021c41ff00210603402002200622076a22082000410f712206413072200641d7" - "006a2006410a491b3a00002007417f6a2106200041104921092000410476210020" - "09450d000b02402007418101490d002007418001418885c08000108b8080800000" - "0b20014101419885c0800041022008418101200741016a6b108c80808000210020" - "01200536021c200120033602042001200436020020024180016a24808080800020" - "000baf0101017f23808080800041306b2201248080808000024002402000417f4c" - "0d000240024020000d00410121000c010b41002d00b89ec080001a2000109b8080" - "80002200450d020b2001200036020c200141023602142001418c8bc08000360210" - "2001420137021c2001418b8080800036022c2001200141286a3602182001200141" - "0c6a360228200141106a10be80808000200128020c2100200141306a2480808080" - "0020000f0b10a9808080000b000bbe0604017f017e037f017e23808080800041c0" - "006b22012480808080002001410636020c2001419498c08000360208024041002d" - "00e89ec080004103460d0010c8808080000b0240024002400240024041002903d0" - "a2c0800022024200520d00024041002802d8a2c0800022030d0010c18080800041" - "002802d8a2c0800021030b20032003280200220441016a3602002004417f4c0d01" - "2003450d02200320032802002204417f6a3602002003290308210220044101470d" - "00200310c2808080000b024002400240200241002903c09ec08000510d0041002d" - "00cc9ec08000210441012103410041013a00cc9ec08000200120043a0018200445" - "0d012001420037023420014281808080c00037022c200141bc99c0800036022820" - "0141186a200141286a10c380808000000b024041002802c89ec080002203417f46" - "0d00200341016a21030c020b419c9ac08000412641e09ac0800010ba8080800000" - "0b410020023703c09ec080000b410020033602c89ec08000200141c09ec0800036" - "021041042103200141043a00182001200141106a360220200141186a41c08dc080" - "002000109180808000210020012d001821040240024020000d0042002102411720" - "0441ff0171764101710d01200128021c220328020021000240200341046a280200" - "22042802002205450d002000200511828080800080808080000b02402004280204" - "2204450d00200020041087808080000b2003410c108780808000410421030c010b" - "200441ff01714104460d032001290318220642807e8321022006a721030b200128" - "021022002000280208417f6a2204360208024020040d00200041003a000c200042" - "003703000b200341ff01714104470d03200141c0006a2480808080000f0b000b41" - "808fc0800041de0041f48fc0800010ba80808000000b2001410036023820014101" - "36022c2001418499c0800036022820014204370230200141286a418c99c0800010" - "aa80808000000b200120022003ad42ff0183843703102001410236022c200141f4" - "97c08000360228200142023702342001418c80808000ad422086200141106aad84" - "3703202001418280808000ad422086200141086aad843703182001200141186a36" - "0230200141286a418498c0800010aa80808000000b7f01017f2380808080004130" - "6b22022480808080002002200036020c20024102360214200241a88bc080003602" - "102002420137021c2002418b8080800036022c2002200241286a36021820022002" - "410c6a360228200241106a10be8080800002402001450d00200228020c20011087" - "808080000b200241306a2480808080000b4701017f23808080800041206b220024" - "8080808000200041003602182000410136020c200041bc90c08000360208200042" - "04370210200041086a41c490c0800010aa80808000000bf90103027f037e017f23" - "808080800041206b220024808080800041002d00b89ec080001a02400240024041" - "20109b808080002201450d00200141023602102001428180808010370300410029" - "03f89ec08000210203402002427f510d024100200242017c220341002903f89ec0" - "80002204200420025122051b3703f89ec08000200421022005450d000b41002003" - "3703d0a2c080002001200337030841002802d8a2c08000450d0220004100360218" - "2000410136020c200041c48cc0800036020820004204370210200041086a419c8d" - "c0800010aa808080000b000b10c080808000000b410020013602d8a2c080002000" - "41206a2480808080000b5b01027f024020002802104101470d0020002802142201" - "41003a000020002802182202450d00200120021087808080000b02402000417f46" - "0d00200020002802042201417f6a36020420014101470d00200041201087808080" - "000b0b3a01017f23808080800041106b2202248080808000200241ac8dc0800036" - "020c20022000360208200241086a2002410c6a200110b080808000000b30000240" - "20002802002d00000d00200141e286c08000410510af808080000f0b200141e786" - "c08000410410af808080000be50301017f23808080800041c0006b220224808080" - "800002400240024002400240024020002d00000e0400010203000b200220002802" - "0436020441002d00b89ec080001a4114109b808080002200450d04200041106a41" - "002800809bc08000360000200041086a41002900f89ac080003700002000410029" - "00f09ac08000370000200241143602102002200036020c20024114360208200241" - "0336022c200241a097c08000360228200242023702342002418d80808000ad4220" - "86200241046aad843703202002418e80808000ad422086200241086aad84370318" - "2002200241186a36023020012802142001280218200241286a1091808080002100" - "20022802082201450d03200228020c20011087808080000c030b20002d00012100" - "2002410136022c200241d490c08000360228200242013702342002418280808000" - "ad422086200241186aad8437030820022000410274220041c49bc080006a280200" - "36021c2002200041e89cc080006a2802003602182002200241086a360230200128" - "02142001280218200241286a10918080800021000c020b20012000280204220028" - "0200200028020410af8080800021000c010b200028020422002802002001200028" - "0204280210118180808000808080800021000b200241c0006a2480808080002000" - "0f0b000b140020012000280204200028020810af808080000b7001037f20002802" - "0421010240024020002d0000220041044b0d0020004103470d010b200128020021" - "000240200141046a28020022022802002203450d00200020031182808080008080" - "8080000b024020022802042202450d00200020021087808080000b2001410c1087" - "808080000b0bf10101027f23808080800041206b22002480808080000240024002" - "40024041002d00e89ec080000e0400000301000b410041023a00e89ec080004100" - "2d00b89ec080001a418008109b808080002201450d01410041033a00e89ec08000" - "410020013602d89ec08000410042808080808080013703d09ec080004100420037" - "03c09ec08000410041003a00e09ec08000410041003602dc9ec08000410041003a" - "00cc9ec08000410041003602c89ec080000b200041206a2480808080000f0b000b" - "200041003602182000410136020c200041bc9bc080003602082000420437021020" - "0041086a418c9ac0800010aa80808000000bb108010a7f23808080800041206b22" - "042480808080000240024002400240024020012802100d002001417f3602102003" - "41002003200241036a417c7120026b22056b41077120032005491b22066b210720" - "032006490d0102402006450d0002400240200220036a2208417f6a22092d000041" - "0a470d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008417d" - "6a22092d0000410a470d002006417d6a21060c010b200a2009460d010240200841" - "7c6a22092d0000410a470d002006417c6a21060c010b200a2009460d0102402008" - "417b6a22092d0000410a470d002006417b6a21060c010b200a2009460d01024020" - "08417a6a22092d0000410a470d002006417a6a21060c010b200a2009460d010240" - "200841796a22092d0000410a470d00200641796a21060c010b200a2009460d0120" - "0641787221060b200620076a41016a21060c040b20052003200320054b1b210b41" - "0020066b21082002417c6a210c2006417f7320026a210a02400340200a21052008" - "210620072209200b4d0d01200641786a2108200541786a210a4180828408200220" - "0941786a22076a280200220d418a94a8d000736b200d724180828408200c20096a" - "280200220d418a94a8d000736b200d727141808182847871418081828478460d00" - "0b0b200920034b0d0202400340200320066a450d012006417f6a2106200520036a" - "21092005417f6a210520092d0000410a470d000b200320066a41016a21060c040b" - "024002402001411c6a28020022060d00410021060c010b2006200141186a280200" - "6a417f6a2d0000410a470d0041002106200141003a00202001411c6a4100360200" - "0b0240200128021420066b20034b0d002000200141146a2002200310ca80808000" - "0c050b200128021820066a2002200310d6808080001a200041043a00002001411c" - "6a200620036a3602000c040b10b580808000000b20072003418487c08000108b80" - "808000000b2009200310ae80808000000b0240200320064f0d0020044100360218" - "2004410136020c2004418c91c0800036020820044204370210200441086a419491" - "c0800010aa80808000000b02402001411c6a2802002205450d0002400240200128" - "021420056b20064d0d00200141186a28020020056a2002200610d6808080001a20" - "01411c6a200520066a22053602000c010b200441086a200141146a2002200610ca" - "80808000024020042d00084104460d00200020042903083702000c030b2001411c" - "6a28020021050b2005450d00200141003a00202001411c6a41003602000b200220" - "066a210502402001280214200320066b22064b0d002000200141146a2005200610" - "ca808080000c010b200141186a2802002005200610d6808080001a200041043a00" - "002001411c6a20063602000b2001200128021041016a360210200441206a248080" - "8080000b7101027f20012802002104024020012802082205450d00200420056b20" - "034f0d004100210520014100360208200141003a000c0b0240200420034d0d0020" - "0128020420056a2002200310d6808080001a200041043a00002001200520036a36" - "02080f0b20004204370200200141003a000c0bc90103027f017e027f2380808080" - "0041106b2203248080808000200341086a20002802082802002001200210c98080" - "8000024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b200428020021010240200441" - "046a28020022062802002207450d002001200711828080800080808080000b0240" - "20062802042206450d00200120061087808080000b2004410c1087808080000b20" - "0020053702000b200341106a24808080800020024104470b9c0303027f017e037f" - "23808080800041106b220224808080800020024100360204024002400240024020" - "01418001490d002001418010490d012001418080044f0d0220022001413f714180" - "01723a000620022001410c7641e001723a000420022001410676413f7141800172" - "3a0005410321010c030b200220013a0004410121010c020b20022001413f714180" - "01723a00052002200141067641c001723a0004410221010c010b20022001413f71" - "418001723a00072002200141127641f001723a000420022001410676413f714180" - "01723a000620022001410c76413f71418001723a0005410421010b200241086a20" - "00280208280200200241046a200110c980808000024020022d000822014104460d" - "0020002802042103200229030821040240024020002d0000220541044b0d002005" - "4103470d010b200328020021050240200341046a28020022062802002207450d00" - "2005200711828080800080808080000b024020062802042206450d002005200610" - "87808080000b2003410c1087808080000b200020043702000b200241106a248080" - "80800020014104470b1200200041c08dc0800020011091808080000b0300000b09" - "00200041003602000bc30201047f411f21020240200141ffffff074b0d00200141" - "0620014108766722026b7641017120024101746b413e6a21020b20004200370210" - "2000200236021c200241027441809fc080006a21030240410028029ca2c0800041" - "012002742204710d0020032000360200200020033602182000200036020c200020" - "003602084100410028029ca2c0800020047236029ca2c080000f0b024002400240" - "200328020022042802044178712001470d00200421020c010b2001410041192002" - "4101766b2002411f461b742103034020042003411d764104716a41106a22052802" - "002202450d02200341017421032002210420022802044178712001470d000b0b20" - "022802082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20002000" - "3602080b0b00200010d280808000000bb50101037f23808080800041106b220124" - "8080808000200028020c2102024002400240024020002802040e020001020b2002" - "0d0141012102410021030c020b20020d0020002802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c2001418f8080800020" - "0028021c22002d001c20002d001d10d380808000000b2001200336020420012002" - "3602002001419080808000200028021c22002d001c20002d001d10d38080800000" - "0b990101027f23808080800041106b2204248080808000410041002802f49ec080" - "00220541016a3602f49ec08000024020054100480d000240024041002d00c8a2c0" - "80000d00410041002802c4a2c0800041016a3602c4a2c0800041002802f09ec080" - "00417f4a0d010c020b200441086a200020011183808080008080808000000b4100" - "41003a00c8a2c080002002450d0010ce80808000000b000b0c0020002001290200" - "3703000b4a01037f4100210302402002450d000240034020002d0000220420012d" - "00002205470d01200041016a2100200141016a21012002417f6a2202450d020c00" - "0b0b200420056b21030b20030bc10201087f02400240200241104f0d0020002103" - "0c010b2000410020006b41037122046a210502402004450d002000210320012106" - "0340200320062d00003a0000200641016a2106200341016a22032005490d000b0b" - "2005200220046b2207417c7122086a210302400240200120046a2209410371450d" - "0020084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a28020021060340200520062002762001280200220620" - "047472360200200141046a2101200541046a22052003490d000c020b0b20084101" - "480d0020092101034020052001280200360200200141046a2101200541046a2205" - "2003490d000b0b20074103712102200920086a21010b02402002450d0020032002" - "6a21050340200320012d00003a0000200141016a2101200341016a22032005490d" - "000b0b20000b6e01067e2000200342ffffffff0f832205200142ffffffff0f8322" - "067e22072003422088220820067e22062005200142208822097e7c22054220867c" - "220a3703002000200820097e2005200654ad4220862005422088847c200a200754" - "ad7c200420017e200320027e7c7c3703080b0bbe1e0100418080c0000bb41e1100" - "00000c000000040000001200000013000000140000000000000000000000010000" - "00150000006120446973706c617920696d706c656d656e746174696f6e20726574" - "75726e656420616e206572726f7220756e65787065637465646c792f7275737463" - "2f6332663734633366393238616562353033663135623465396566353737386537" - "37663330353862382f6c6962726172792f616c6c6f632f7372632f737472696e67" - "2e727300005f0010004b000000060a00000e000000000000000100000001000000" - "16000000170000001400000004000000180000004572726f72557466384572726f" - "7276616c69645f75705f746f6572726f725f6c656e46726f6d557466384572726f" - "7262797465736572726f724e6f6e65536f6d657372632f6c69622e7273001d0110" - "000a0000000c0000003d0000001d0110000a0000000d0000003700000063617061" - "63697479206f766572666c6f770000004801100011000000616c6c6f632f737263" - "2f7261775f7665632e727364011000140000001800000005000000426f72726f77" - "4d75744572726f72616c726561647920626f72726f7765643a2096011000120000" - "005b3d3d617373657274696f6e20606c6566742020726967687460206661696c65" - "640a20206c6566743a200a2072696768743a2000b301100010000000c301100017" - "000000da0110000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000b301100010000000fc011000100000000c02100009000000da0110" - "00090000000100000000000000ef0b100002000000000000000c00000004000000" - "190000001a0000001b00000020202020207b202c20207b0a2c0a7d207d28280a5d" - "636f72652f7372632f666d742f6e756d2e72737502100013000000660000001700" - "000030783030303130323033303430353036303730383039313031313132313331" - "343135313631373138313932303231323232333234323532363237323832393330" - "333133323333333433353336333733383339343034313432343334343435343634" - "373438343935303531353235333534353535363537353835393630363136323633" - "363436353636363736383639373037313732373337343735373637373738373938" - "303831383238333834383538363837383838393930393139323933393439353936" - "39373938393966616c736574727565636f72652f7372632f736c6963652f6d656d" - "6368722e7273006b03100018000000830000001e0000006b031000180000009f00" - "00000900000072616e676520737461727420696e64657820206f7574206f662072" - "616e676520666f7220736c696365206f66206c656e67746820a403100012000000" - "b60310002200000072616e676520656e6420696e64657820e803100010000000b6" - "031000220000000101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000020202020202020202020202020202020202020202020202020202020202" - "030303030303030303030303030303030404040404000000000000000000000000" - "00000001000000010000001600000063616c6c65642060526573756c743a3a756e" - "77726170282960206f6e20616e2060457272602076616c7565456d707479496e76" - "616c69644469676974506f734f766572666c6f774e65674f766572666c6f775a65" - "726f5061727365496e744572726f726b696e64616c6c6f63617465200a0000007f" - "0510000900000088051000010000006465616c6c6f6361746520009c0510000b00" - "000088051000010000002f686f6d652f7077616e672f7761736d2f72782d776173" - "6d2d70726f746f747970652f7872706c2d7374642f7372632f6c69622e72734163" - "636f756e7444657374696e6174696f6e46696e697368416674657200b805100036" - "000000690000001600000042616c616e636500b8051000360000007e0000001600" - "00007265656e7472616e7420696e69740000340610000e0000002f72757374632f" - "633266373463336639323861656235303366313562346539656635373738653737" - "663330353862382f6c6962726172792f636f72652f7372632f63656c6c2f6f6e63" - "652e72730000004c0610004d000000230100004200000000000000000000000400" - "0000040000001c0000001d0000000c000000040000001e0000001f000000200000" - "002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a6520" - "3e3d2073697a65202b206d696e5f6f7665726865616400d806100029000000a804" - "000009000000617373657274696f6e206661696c65643a207073697a65203c3d20" - "73697a65202b206d61785f6f766572686561640000d806100029000000ae040000" - "0d000000757365206f66207374643a3a7468726561643a3a63757272656e742829" - "206973206e6f7420706f737369626c652061667465722074686520746872656164" - "2773206c6f63616c206461746120686173206265656e2064657374726f79656473" - "74642f7372632f7468726561642f6d6f642e727300de07100015000000f1020000" - "130000006661696c656420746f2067656e657261746520756e6971756520746872" - "6561642049443a2062697473706163652065786861757374656400040810003700" - "0000de07100015000000c40400000d00000001000000000000007374642f737263" - "2f696f2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e000081081000090000005c081000250000000f0100002900000065" - "6e74697479206e6f7420666f756e647065726d697373696f6e2064656e69656463" - "6f6e6e656374696f6e2072656675736564636f6e6e656374696f6e207265736574" - "686f737420756e726561636861626c656e6574776f726b20756e72656163686162" - "6c65636f6e6e656374696f6e2061626f727465646e6f7420636f6e6e6563746564" - "6164647265737320696e2075736561646472657373206e6f7420617661696c6162" - "6c656e6574776f726b20646f776e62726f6b656e2070697065656e746974792061" - "6c7265616479206578697374736f7065726174696f6e20776f756c6420626c6f63" - "6b6e6f742061206469726563746f727969732061206469726563746f7279646972" - "6563746f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c6573797374656d206c" - "6f6f70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068616e" - "646c65696e76616c696420696e70757420706172616d65746572696e76616c6964" - "206461746174696d6564206f75747772697465207a65726f6e6f2073746f726167" - "652073706163657365656b206f6e20756e7365656b61626c652066696c6566696c" - "6573797374656d2071756f746120657863656564656466696c6520746f6f206c61" - "7267657265736f75726365206275737965786563757461626c652066696c652062" - "757379646561646c6f636b63726f73732d646576696365206c696e6b206f722072" - "656e616d65746f6f206d616e79206c696e6b73696e76616c69642066696c656e61" - "6d65617267756d656e74206c69737420746f6f206c6f6e676f7065726174696f6e" - "20696e746572727570746564756e737570706f72746564756e6578706563746564" - "20656e64206f662066696c656f7574206f66206d656d6f72796f74686572206572" - "726f72756e63617465676f72697a6564206572726f7220286f73206572726f7220" - "290000000100000000000000910b10000b0000009c0b1000010000007374642f73" - "72632f696f2f737464696f2e727300b80b1000130000002c030000140000006661" - "696c6564207072696e74696e6720746f203a20000000dc0b100013000000ef0b10" - "0002000000b80b1000130000005d040000090000007374646f75747374642f7372" - "632f696f2f6d6f642e72736120666f726d617474696e6720747261697420696d70" - "6c656d656e746174696f6e2072657475726e656420616e206572726f7220776865" - "6e2074686520756e6465726c79696e672073747265616d20646964206e6f740000" - "002b0c1000560000001a0c100011000000280700001500000063616e6e6f742072" - "65637572736976656c792061637175697265206d757465789c0c10002000000073" - "74642f7372632f7379732f73796e632f6d757465782f6e6f5f746872656164732e" - "7273c40c10002400000014000000090000007374642f7372632f73796e632f6f6e" - "63652e7273f80c100014000000d9000000140000006c6f636b20636f756e74206f" - "766572666c6f7720696e207265656e7472616e74206d757465787374642f737263" - "2f73796e632f7265656e7472616e745f6c6f636b2e7273420d10001e0000002201" - "00002d0000006f7065726174696f6e207375636365737366756c6f6e652d74696d" - "6520696e697469616c697a6174696f6e206d6179206e6f7420626520706572666f" - "726d6564207265637572736976656c79840d100038000000100000001100000012" - "000000100000001000000013000000120000000d0000000e000000150000000c00" - "00000b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a000000100000001700000019000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600000015" - "0000000b000000160000000d0000000b00000013000000a4081000b4081000c508" - "1000d7081000e7081000f70810000a0910001c09100029091000370910004c0910" - "005809100063091000780910008d0910009c091000aa091000bd091000e3091000" - "1b0a1000340a10004b0a1000570a1000600a10006a0a10007a0a1000910a1000aa" - "0a1000b80a1000c50a1000d90a1000e10a1000fc0a10000a0b10001a0b1000300b" - "1000450b1000500b1000660b1000730b10007e0b1000050000000c0000000b0000" - "000b000000040000004305100048051000540510005f0510006a05100000c62e04" - "6e616d65000e0d7761736d5f6c69622e7761736d018e2e5800325f5a4e31306865" - "6c7065725f6c696238686f73745f6c6962357072696e7431376864336330313266" - "3765666531663636334501385f5a4e313068656c7065725f6c696238686f73745f" - "6c6962313067657454784669656c64313768623836623962643665383439353163" - "634502485f5a4e313068656c7065725f6c696238686f73745f6c69623236676574" - "43757272656e744c6564676572456e7472794669656c6431376861346138303037" - "3262396335613761644503415f5a4e313068656c7065725f6c696238686f73745f" - "6c696231396765744c6564676572456e7472794669656c64313768633661326634" - "323734313038306331384504415f5a4e313068656c7065725f6c696238686f7374" - "5f6c69623139676574506172656e744c656467657254696d653137683731643366" - "39663165383665663230374505315f5a4e313068656c7065725f6c696231327072" - "696e745f6e756d626572313768343432633966366462343461613636374506305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f753634313768643532" - "3166613665663661303637326145070e5f5f727573745f6465616c6c6f6308325f" - "5a4e34636f726536726573756c743133756e777261705f6661696c656431376866" - "3839396364303037373637303035314509475f5a4e34325f244c54242452462454" - "247532302461732475323024636f72652e2e666d742e2e44656275672447542433" - "666d7431376831323761303230623939303135656661450a475f5a4e34325f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376833326438343961303132376564636461450b445f" - "5a4e34636f726535736c69636535696e6465783236736c6963655f73746172745f" - "696e6465785f6c656e5f6661696c31376866393161336166653837623164343433" - "450c385f5a4e34636f726533666d7439466f726d617474657231327061645f696e" - "74656772616c31376863346561303761306263313335366334450d475f5a4e3432" - "5f244c54242452462454247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683562646335303561663532336432393945" - "0e5e5f5a4e34636f726533666d74336e756d35325f244c5424696d706c24753230" - "24636f72652e2e666d742e2e44656275672475323024666f722475323024757369" - "7a652447542433666d7431376836336361623039386234313233343130450f465f" - "5a4e34636f726533666d7439466f726d6174746572323664656275675f73747275" - "63745f6669656c64325f66696e6973683137683135666166363733326663303964" - "62644510305f5a4e34636f726533666d743557726974653977726974655f666d74" - "313768396461663134643536353865323530364511265f5a4e34636f726533666d" - "743577726974653137683933353534653462653731663263376145124c5f5a4e34" - "636f726533707472343264726f705f696e5f706c616365244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67244754243137683230373631353664386431" - "65323961384513535f5a4e34636f726533707472343964726f705f696e5f706c61" - "6365244c5424616c6c6f632e2e737472696e672e2e46726f6d557466384572726f" - "7224475424313768323066303937633266353863396661374514525f5a4e35335f" - "244c5424636f72652e2e666d742e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e44656275672447542433666d7431376866376165323835" - "35623234396462633545155f5f5a4e35385f244c5424616c6c6f632e2e73747269" - "6e672e2e537472696e67247532302461732475323024636f72652e2e666d742e2e" - "577269746524475424313077726974655f63686172313768323134333931636238" - "656231353263364516435f5a4e35616c6c6f63377261775f766563313952617756" - "6563244c54245424432441244754243867726f775f6f6e65313768666166636338" - "3935356337386333653545175a5f5a4e35616c6c6f63377261775f766563323052" - "6177566563496e6e6572244c5424412447542437726573657276653231646f5f72" - "6573657276655f616e645f68616e646c6531376862356335336362636666396436" - "31653745185d5f5a4e35385f244c5424616c6c6f632e2e737472696e672e2e5374" - "72696e67247532302461732475323024636f72652e2e666d742e2e577269746524" - "4754243977726974655f7374723137683539396439653537383934366464393845" - "19325f5a4e35616c6c6f63377261775f766563313166696e6973685f67726f7731" - "376832313261636366633461323839333362451a0e5f5f727573745f7265616c6c" - "6f631b435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c54244124475424366d616c6c6f63313768653635393339613463383937" - "63633135451c4b5f5a4e35616c6c6f63377261775f766563323052617756656349" - "6e6e6572244c54244124475424313467726f775f616d6f7274697a656431376834" - "623330643530396631323837393465451d335f5a4e35616c6c6f63377261775f76" - "6563313268616e646c655f6572726f723137683937623764626430663732646437" - "3838451e5e5f5a4e36355f244c5424616c6c6f632e2e737472696e672e2e46726f" - "6d557466384572726f72247532302461732475323024636f72652e2e666d742e2e" - "44656275672447542433666d743137683132313861313631643933363438653945" - "1f5e5f5a4e36355f244c5424616c6c6f632e2e7665632e2e566563244c54245424" - "43244124475424247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768613636623539636339336533383537344520615f" - "5a4e36385f244c5424636f72652e2e6e756d2e2e6572726f722e2e506172736549" - "6e744572726f72247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d74313768633837363633386165616230633031664521475f" - "5a4e34325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376839393432316563653462383633" - "3034384522465f5a4e34636f726533666d7439466f726d61747465723236646562" - "75675f7374727563745f6669656c64315f66696e69736831376862653338633662" - "346233306235386332452305726561647924675f5a4e34636f7265336e756d3630" - "5f244c5424696d706c2475323024636f72652e2e7374722e2e7472616974732e2e" - "46726f6d5374722475323024666f722475323024753634244754243866726f6d5f" - "737472313768356563336638363835643535346239644525415f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c5424412447542434" - "667265653137683339383334616161616533653839343645262c5f5a4e34636f72" - "653970616e69636b696e673570616e696331376830346565623931376464393363" - "32323945274a5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d61" - "6c6c6f63244c542441244754243132756e6c696e6b5f6368756e6b313768393334" - "6533646333383362623538613345284b5f5a4e38646c6d616c6c6f6338646c6d61" - "6c6c6f633137446c6d616c6c6f63244c542441244754243133646973706f73655f" - "6368756e6b313768366530636363643435383635373436334529385f5a4e35616c" - "6c6f63377261775f766563313763617061636974795f6f766572666c6f77313768" - "34393964343832613965643537313561452a305f5a4e34636f72653970616e6963" - "6b696e673970616e69635f666d7431376836353430636362326435666463336162" - "452b625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d70" - "6c2475323024636f72652e2e666d742e2e446973706c61792475323024666f7224" - "753230247533322447542433666d74313768626633653032323834383365333735" - "61452c11727573745f626567696e5f756e77696e642d465f5a4e34636f72653366" - "6d7439466f726d617474657231327061645f696e74656772616c31327772697465" - "5f70726566697831376861396134333238306236303036643132452e425f5a4e34" - "636f726535736c69636535696e6465783234736c6963655f656e645f696e646578" - "5f6c656e5f6661696c31376830383862353665323939626561616166452f2e5f5a" - "4e34636f726533666d7439466f726d617474657233706164313768343736396165" - "3338393337346363353145303b5f5a4e34636f72653970616e69636b696e673139" - "6173736572745f6661696c65645f696e6e65723137683666376533323537643834" - "61353034324531475f5a4e34325f244c5424245246245424753230246173247532" - "3024636f72652e2e666d742e2e44656275672447542433666d7431376833613662" - "6161316262343761643230344532495f5a4e34345f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e446973706c6179244754243366" - "6d74313768376666346430623836303963323437324533585f5a4e35395f244c54" - "24636f72652e2e666d742e2e417267756d656e7473247532302461732475323024" - "636f72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445345c5f5a4e36335f244c5424636f72652e2e6365" - "6c6c2e2e426f72726f774d75744572726f72247532302461732475323024636f72" - "652e2e666d742e2e44656275672447542433666d74313768313564336433343334" - "626464636363384535395f5a4e34636f72653463656c6c323270616e69635f616c" - "72656164795f626f72726f77656431376833313462353261316263343662666534" - "45363c5f5a4e34636f726533666d74386275696c64657273313144656275675374" - "72756374356669656c64313768333531353864666637643465616633354537675f" - "5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e2e506164" - "41646170746572247532302461732475323024636f72652e2e666d742e2e577269" - "7465244754243977726974655f7374723137683831386234396537653639613236" - "66644538695f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572" - "732e2e50616441646170746572247532302461732475323024636f72652e2e666d" - "742e2e577269746524475424313077726974655f63686172313768393437396266" - "363162306130356661314539305f5a4e34636f726533666d743557726974653977" - "726974655f666d7431376835393430386336353062386232313531453a325f5a4e" - "34636f7265366f7074696f6e31336578706563745f6661696c6564313768663038" - "61393965326437333336633661453b625f5a4e34636f726533666d74336e756d33" - "696d7035325f244c5424696d706c2475323024636f72652e2e666d742e2e446973" - "706c61792475323024666f7224753230246933322447542433666d743137686365" - "6439306337613633396330316464453c4f5f5a4e35305f244c5424244250246d75" - "74247532302454247532302461732475323024636f72652e2e666d742e2e446562" - "75672447542433666d7431376834366435353230663839333131346633453d0861" - "6c6c6f636174653e2b5f5a4e3373746432696f35737464696f365f7072696e7431" - "376838316334373231363630343666306663453f0a6465616c6c6f636174654039" - "5f5a4e3373746436746872656164385468726561644964336e6577396578686175" - "73746564313768333336626637613134383830343463384541425f5a4e34636f72" - "653463656c6c346f6e636531374f6e636543656c6c244c54245424475424387472" - "795f696e69743137686365363362663232383531393165373145423e5f5a4e3561" - "6c6c6f633473796e633136417263244c54245424432441244754243964726f705f" - "736c6f77313768656539616363636164396363313036394543355f5a4e34636f72" - "653970616e69636b696e6731336173736572745f6661696c656431376832333236" - "3266326333633738623661624544475f5a4e34325f244c54242452462454247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768653138373433383865303762666532354545595f5a4e36305f244c542473" - "74642e2e696f2e2e6572726f722e2e4572726f7224753230246173247532302463" - "6f72652e2e666d742e2e446973706c61792447542433666d743137683930323731" - "63376232613663653833394546595f5a4e36305f244c5424616c6c6f632e2e7374" - "72696e672e2e537472696e67247532302461732475323024636f72652e2e666d74" - "2e2e446973706c61792447542433666d7431376863653432323661613166373236" - "63316345477a5f5a4e34636f726533707472383864726f705f696e5f706c616365" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c5424616c6c6f632e2e7665632e2e566563244c54247538244754" - "242447542424475424313768313636646336316162303333346331654548495f5a" - "4e337374643473796e63396f6e63655f6c6f636b31374f6e63654c6f636b244c54" - "2454244754243130696e697469616c697a65313768376635633530386461396531" - "623039624549605f5a4e36315f244c54247374642e2e696f2e2e737464696f2e2e" - "5374646f75744c6f636b2475323024617324753230247374642e2e696f2e2e5772" - "697465244754243977726974655f616c6c31376832346238323631303436316432" - "353666454a555f5a4e3373746432696f3862756666657265643962756677726974" - "65723138427566577269746572244c54245724475424313477726974655f616c6c" - "5f636f6c6431376835383462646262616562306662316262454b735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e4164" - "6170746572244c54245424475424247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376837666163663562" - "633065666364383038454c325f5a4e34636f726533666d74355772697465313077" - "726974655f6368617231376866306233626531656331396465356537454d305f5a" - "4e34636f726533666d743557726974653977726974655f666d7431376866383830" - "386630646630653435313364454e0a727573745f70616e69634f375f5a4e34636f" - "72653570616e6963313250616e69635061796c6f61643661735f73747231376836" - "3134396631343264396132653032654550505f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e73657274" - "5f6c617267655f6368756e6b313768656665383531613237353832646137624551" - "455f5a4e3373746433737973396261636b747261636532365f5f727573745f656e" - "645f73686f72745f6261636b747261636531376834646333646534376432323032" - "3162394552585f5a4e337374643970616e69636b696e673139626567696e5f7061" - "6e69635f68616e646c657232385f24753762242475376224636c6f737572652475" - "37642424753764243137686531376133393737663839633131373845533b5f5a4e" - "337374643970616e69636b696e673230727573745f70616e69635f776974685f68" - "6f6f6b31376837373665373963396636353931626535455483015f5a4e39395f24" - "4c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f6861" - "6e646c65722e2e5374617469635374725061796c6f616424753230246173247532" - "3024636f72652e2e70616e69632e2e50616e69635061796c6f6164244754243661" - "735f737472313768656233663732326432323465343266384555066d656d636d70" - "56066d656d63707957085f5f6d756c746933071201000f5f5f737461636b5f706f" - "696e746572090a0100072e726f6461746100550970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d627901057275737463" - "25312e38332e302d6e696768746c79202863326637346333663920323032342d30" - "392d30392900490f7461726765745f6665617475726573042b0a6d756c74697661" - "6c75652b0f6d757461626c652d676c6f62616c732b0f7265666572656e63652d74" - "797065732b087369676e2d657874"; + auto wasmHex = allHostFunctionsHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); @@ -1301,7 +198,7 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1319,7 +216,7 @@ struct Wasm_test : public beast::unit_test::suite { // fail because current time < escrow_finish_after time TestHostFunctions nfs(&env); nfs.clock_drift = -1; - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { @@ -1344,7 +241,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); std::cout << "bad case (access nonexistent field) result " @@ -1364,7 +261,7 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(&env); - std::string funcName("ready"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(!re)) std::cout << "bad case (more than MAX_PAGES) result " @@ -1372,725 +269,7 @@ struct Wasm_test : public beast::unit_test::suite } { // fail because recursion too deep - auto wasmHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; + auto wasmHex = deepRecursionHex; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h new file mode 100644 index 00000000000..1d377676c6b --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -0,0 +1,1569 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +static auto const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +static auto const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +static auto const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 46267d55b57..a61b4f73cb2 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index e6ef682e490..fd90b48d701 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -615,7 +615,7 @@ EscrowFinish::doApply() // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("ready"); + std::string funcName("finish"); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); From aef32ead2c0cd4027d882b4238634535a7756b6c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 10:31:02 -0400 Subject: [PATCH 014/212] better WASM logging to match rippled (#5395) * basic logging * pass in Journal * log level based on journal level * clean up * attempt at adding WAMR logging properly * improve logline * maybe_unused * fix * fix * fix segfault * add test --- external/wamr/conanfile.py | 43 +++++------ src/test/app/Wasm_test.cpp | 103 +++++++++++++++++-------- src/xrpld/app/misc/WamrVM.cpp | 105 +++++++++++++++++++++++--- src/xrpld/app/misc/WamrVM.h | 6 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 7 ++ src/xrpld/app/misc/WasmVM.cpp | 7 +- src/xrpld/app/misc/WasmVM.h | 9 ++- 7 files changed, 212 insertions(+), 68 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index d54bb6f98fb..ae83e8c13c1 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,11 +1,16 @@ from conans import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import apply_conandata_patches, export_conandata_patches, get, copy -import os -import json +from conan.tools.files import ( + apply_conandata_patches, + export_conandata_patches, + # get, +) + +# import os required_conan_version = ">=1.55.0" + class WamrConan(ConanFile): name = "wamr" version = "2.2.0" @@ -17,31 +22,30 @@ class WamrConan(ConanFile): options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} generators = "CMakeToolchain", "CMakeDeps" - #requires = [("llvm/20.1.1@")] + # requires = [("llvm/20.1.1@")] def export_sources(self): export_conandata_patches(self) pass - - #def build_requirements(self): + # def build_requirements(self): # self.tool_requires("llvm/20.1.1") - def config_options(self): if self.settings.os == "Windows": del self.options.fPIC - def layout(self): cmake_layout(self, src_folder="src") - def source(self): git = tools.Git() - git.clone("https://github.com/bytecodealliance/wasm-micro-runtime.git", "c883fafead005e87ad3122b05409886f507c1cb0",shallow=True) - #get(self, **self.conan_data["sources"][self.version], strip_root=True) - + git.clone( + "https://github.com/bytecodealliance/wasm-micro-runtime.git", + "c883fafead005e87ad3122b05409886f507c1cb0", + shallow=True, + ) + # get(self, **self.conan_data["sources"][self.version], strip_root=True) def generate(self): tc = CMakeToolchain(self) @@ -54,37 +58,34 @@ def generate(self): tc.variables["WAMR_BUILD_FAST_JIT"] = 0 tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 - #tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 - #ll_dep = self.dependencies["llvm"] - #self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") - #tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" + # tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 + # ll_dep = self.dependencies["llvm"] + # self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") + # tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") tc.generate() # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder deps = CMakeDeps(self) deps.generate() - def build(self): apply_conandata_patches(self) cmake = CMake(self) cmake.verbose = True cmake.configure() cmake.build() - #self.run(f'echo {self.source_folder}') + # self.run(f'echo {self.source_folder}') # Explicit way: # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) # self.run("cmake --build . %s" % cmake.build_config) - def package(self): cmake = CMake(self) cmake.verbose = True cmake.install() - def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" - diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 5c9c0afc9c2..7f54a636ccb 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -127,41 +127,58 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; struct TestHostFunctions : public HostFunctions { - Env* env; - Bytes accountID; - Bytes data; - int clock_drift = 0; + Env* env_; + Bytes accountID_; + Bytes data_; + int clock_drift_ = 0; + test::StreamSink sink_; + beast::Journal jlog_; public: explicit TestHostFunctions(Env* env, int cd = 0) - : env(env), clock_drift(cd) + : env_(env) + , clock_drift_(cd) + , sink_(beast::severities::kTrace) + , jlog_(sink_) { std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID = Bytes{s.begin(), s.end()}; + accountID_ = Bytes{s.begin(), s.end()}; std::string t = "10000"; - data = Bytes{t.begin(), t.end()}; + data_ = Bytes{t.begin(), t.end()}; + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; } int32_t getLedgerSqn() override { - return (int32_t)env->current()->seq(); + return (int32_t)env_->current()->seq(); } int32_t getParentLedgerTime() override { - return env->current() + return env_->current() ->parentCloseTime() .time_since_epoch() .count() + - clock_drift; + clock_drift_; } std::optional getTxField(std::string const& fname) override { - return accountID; + return accountID_; } std::optional @@ -170,19 +187,19 @@ struct Wasm_test : public beast::unit_test::suite Bytes const& kdata, std::string const& fname) override { - return data; + return data_; } std::optional getCurrentLedgerEntryField(std::string const& fname) override { if (fname == "Destination" || fname == "Account") - return accountID; + return accountID_; else if (fname == "Data") - return data; + return data_; else if (fname == "FinishAfter") { - auto t = env->current() + auto t = env_->current() ->parentCloseTime() .time_since_epoch() .count(); @@ -197,14 +214,14 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { - TestHostFunctions nfs(&env); + TestHostFunctions nfs(&env, 0); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); - std::cout << "good case result " << re.value().result - << " cost: " << re.value().cost << std::endl; + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; } } @@ -214,17 +231,17 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(&env); - nfs.clock_drift = -1; + TestHostFunctions nfs(&env, -1); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(!re.value().result); - std::cout << "bad case (current time < escrow_finish_after " - "time) result " - << re.value().result << " cost: " << re.value().cost - << std::endl; + // std::cout << "bad case (current time < escrow_finish_after " + // "time) result " + // << re.value().result << " cost: " << + // re.value().cost + // << std::endl; } } @@ -244,8 +261,8 @@ struct Wasm_test : public beast::unit_test::suite std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); BEAST_EXPECT(re.error()); - std::cout << "bad case (access nonexistent field) result " - << re.error() << std::endl; + // std::cout << "bad case (access nonexistent field) result " + // << re.error() << std::endl; } { // fail because trying to allocate more than MAX_PAGES memory @@ -263,9 +280,9 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(&env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); - if (BEAST_EXPECT(!re)) - std::cout << "bad case (more than MAX_PAGES) result " - << re.error() << std::endl; + BEAST_EXPECT(!re); + // std::cout << "bad case (more than MAX_PAGES) result " + // << re.error() << std::endl; } { // fail because recursion too deep @@ -276,9 +293,31 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions nfs(&env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); - if (BEAST_EXPECT(re.error())) - std::cout << "bad case (deep recursion) result " << re.error() - << std::endl; + BEAST_EXPECT(re.error()); + // std::cout << "bad case (deep recursion) result " << re.error() + // << std::endl; + + auto const& sink = nfs.getSink(); + auto countSubstr = [](std::string const& str, + std::string const& substr) { + std::size_t pos = 0; + int occurrences = 0; + while ((pos = str.find(substr, pos)) != std::string::npos) + { + occurrences++; + pos += substr.length(); + } + return occurrences; + }; + + BEAST_EXPECT( + countSubstr( + sink.messages().str(), "WAMR error: failed to call func") == + 1); + BEAST_EXPECT( + countSubstr( + sink.messages().str(), + "WAMR trap: Exception: wasm operand stack overflow") == 1); } } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index a781aadea9c..4ed47a2ffbb 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -19,6 +19,8 @@ #include +#include + #include namespace ripple { @@ -27,10 +29,91 @@ namespace ripple { namespace { +static log_level_t +getLogLevel(beast::severities::Severity severity) +{ + using namespace beast::severities; + switch (severity) + { + case kTrace: + return WASM_LOG_LEVEL_VERBOSE; + case kDebug: + return WASM_LOG_LEVEL_DEBUG; + case kInfo: + case kWarning: + return WASM_LOG_LEVEL_WARNING; + case kError: + return WASM_LOG_LEVEL_ERROR; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case kFatal: + case kNone: + break; + } + + return WASM_LOG_LEVEL_FATAL; +} + +static beast::severities::Severity +getLogLevel(uint32_t severity) +{ + using namespace beast::severities; + switch (severity) + { + case WASM_LOG_LEVEL_VERBOSE: + return kTrace; + case WASM_LOG_LEVEL_DEBUG: + return kDebug; + case WASM_LOG_LEVEL_WARNING: + return kWarning; + case WASM_LOG_LEVEL_ERROR: + return kError; + default: + UNREACHABLE("invalid severity"); + [[fallthrough]]; + case WASM_LOG_LEVEL_FATAL: + break; + } + + return kFatal; +} + +// This function is called from WAMR to log messages. +extern "C" void +wamr_log_to_rippled( + uint32_t logLevel, + const char* file, + int line, + const char* fmt, + ...) +{ + beast::Journal j = debugLog(); + + // Format the variadic args + const char* safeFile = file ? file : ""; + + std::ostringstream oss; + oss << "WAMR LOG (" << safeFile << ":" << line << "): "; + + va_list args; + va_start(args, fmt); + + char formatted[1024]; + vsnprintf(formatted, sizeof(formatted), fmt, args); + formatted[sizeof(formatted) - 1] = '\0'; + + va_end(args); + + oss << formatted; + + j.stream(getLogLevel(logLevel)) << oss.str(); +} + static void -print_wasm_error(const char* message, wasm_trap_t* trap) +print_wasm_error(const char* message, wasm_trap_t* trap, beast::Journal j) { - fprintf(stderr, "WAMR error: %s\n", message); + j.debug() << "WAMR error: " << message; if (trap) { @@ -38,11 +121,7 @@ print_wasm_error(const char* message, wasm_trap_t* trap) wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); - fprintf( - stderr, - "WAMR trap: %.*s\n", - (int)error_message.size, - error_message.data); + j.debug() << "WAMR trap: " << error_message.data; wasm_byte_vec_delete(&error_message); } } @@ -69,7 +148,10 @@ InstanceWrapper::init( if (!mi || trap) { - print_wasm_error("can't create instance", trap); + print_wasm_error( + "can't create instance", + trap, + beast::Journal(beast::Journal::getNullSink())); throw std::runtime_error("WAMR: can't create instance"); } wasm_instance_exports(mi.get(), expt); @@ -570,7 +652,7 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) nullptr}; trap = wasm_func_call(func, &inv, &ret.r); if (trap) - print_wasm_error("failed to call func", trap); + print_wasm_error("failed to call func", trap, j_); // assert(results[0].kind == WASM_I32); // if (NR) printf("Result P5: %d\n", ret[0].of.i32); @@ -645,10 +727,13 @@ WamrEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { try { + wasm_runtime_set_log_level(getLogLevel(j.sink().threshold())); + j_ = j; return runHlp(wasmCode, funcName, imports, params); } catch (std::exception const&) diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 113fcf88866..a5b8051cb10 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,6 +20,8 @@ #include +#include + #include #include @@ -146,6 +148,7 @@ class WamrEngine wasm_trap_t* trap = nullptr; std::int64_t defGas = -1; std::int32_t defMaxPages = -1; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); public: WamrEngine(); @@ -155,7 +158,8 @@ class WamrEngine run(wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params); + std::vector const& params, + beast::Journal j); std::int64_t initGas(std::int64_t def); diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index e1943244e70..f2f70ee558d 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -23,6 +23,7 @@ #include #include +#include #include namespace ripple { @@ -34,6 +35,12 @@ class WasmHostFunctionsImpl : public HostFunctions { } + beast::Journal + getJournal() override + { + return ctx.journal; + } + int32_t getLedgerSqn() override; diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index a61b4f73cb2..8e77bc027b9 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -56,7 +56,7 @@ runEscrowWasm( WASM_IMPORT_FUNC(imports, print, hfs) std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports); + auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -92,9 +92,10 @@ WasmEngine::run( wbytes const& wasmCode, std::string_view funcName, std::vector const& imports, - std::vector const& params) + std::vector const& params, + beast::Journal j) { - return impl->run(wasmCode, funcName, imports, params); + return impl->run(wasmCode, funcName, imports, params, j); } std::int64_t diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b383bba37d8..25079861b97 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -68,6 +68,12 @@ typedef WasmResult EscrowResult; struct HostFunctions { + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + virtual int32_t getLedgerSqn() { @@ -331,7 +337,8 @@ class WasmEngine run(wbytes const& wasmCode, std::string_view funcName = {}, std::vector const& imports = {}, - std::vector const& params = {}); + std::vector const& params = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); std::int64_t initGas(std::int64_t def = 1'000'000'000'000LL); From 1ede0bdec443eecb0d1ee7cf429b08ca00b39299 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 May 2025 17:37:14 -0400 Subject: [PATCH 015/212] fix: fix fixtures (#5445) --- src/test/app/wasm_fixtures/fixtures.cpp | 1571 +++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 1553 +--------------------- src/xrpld/app/misc/WasmHostFuncImpl.h | 5 +- 3 files changed, 1580 insertions(+), 1549 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixtures.cpp diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp new file mode 100644 index 00000000000..1ed246f2529 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -0,0 +1,1571 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +std::string const ledgerSqnHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" + "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" + "010700100041044a0b004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d31" + "2e38352e31202834656231363132353020323032352d30332d3135290049" + "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" + "732b0a6d756c746976616c7565"; + +std::string const allHostFunctionsHex = + "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" + "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" + "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" + "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" + "686f73745f6c69621a67657443757272656e744c6564676572456e747279" + "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" + "794669656c64000408686f73745f6c696213676574506172656e744c6564" + "67657254696d65000503363501010101090a000302010101010506020207" + "020201040001010100010400010101020701080101030800010103020202" + "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" + "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" + "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" + "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" + "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" + "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" + "0000450440200128021c41d480c0004104200128022028020c1100002100" + "0c010b41012100200128021c220341d880c0004104200128022022062802" + "0c22051100000d00200441016a2104024020012d00144104714504402003" + "418d83c000410120051100000d022004200110050d02200128021c210320" + "0128022028020c21050c010b2003418e83c000410220051100000d012002" + "41013a0017200241206a200141086a290200370300200241286a20014110" + "6a290200370300200241306a200141186a2802003602002002200636020c" + "20022003360208200241e482c00036023820022001290200370318200220" + "0241176a3602102002200241086a3602342004200241186a10050d012002" + "280234418883c0004102200228023828020c1100000d010b2003419891c0" + "004101200511000021000b200241406b240020000bff0201037f23004180" + "016b22032400027f0240200128021422024110714504402002412071450d" + "0120002d0000210241810121000340200020036a41026b2002410f712204" + "413072200441376a2004410a491b3a000020022204410476210220004101" + "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" + "41810120006b10090c020b20002d0000210241810121000340200020036a" + "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" + "22044104762102200041016b21002004410f4b0d000b20014101419183c0" + "004102200020036a41016b41810120006b10090c010b0240024002402000" + "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" + "0171410174419383c0006a2f00003b0001410021000c010b410221002002" + "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" + "410174419383c0006a2f00003b00010b2001410141014100200020036a20" + "0041037310090b20034180016a24000b4701017f230041106b2202240020" + "022000280200220041046a36020c200141a080c000410941a980c000410b" + "2000410141b480c00041092002410c6a41021008200241106a24000bff01" + "01037f23004180016b22042400027f024020012802142202411071450440" + "20024120710d01200028020041012001100a0c020b200028020021004181" + "0121020340200220046a41026b2000410f712203413072200341d7006a20" + "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" + "20014101419183c0004102200220046a41016b41810120026b10090c010b" + "2000280200210041810121020340200220046a41026b2000410f71220341" + "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" + "41047621000d000b20014101419183c0004102200220046a41016b418101" + "20026b10090b20044180016a24000bc50101017f230041106b220b240020" + "0028021c20012002200028022028020c1100002101200b41003a000d200b" + "20013a000c200b2000360208200b41086a20032004200520061020200720" + "082009200a10202101200b2d000d2202200b2d000c220372210002402003" + "4101712002410147720d00200128020022002d0014410471450440200028" + "021c418b83c0004102200028022028020c11000021000c010b200028021c" + "418a83c0004101200028022028020c11000021000b200b41106a24002000" + "4101710bef0401077f027f200145044020002802142106412d2109200541" + "016a0c010b412b418080c4002000280214220641017122011b2109200120" + "056a0b210702402006410471450440410021020c010b024020034504400c" + "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" + "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" + "280200450440200028021c22012000280220220020092002200310190440" + "41010f0b200120042005200028020c1100000f0b02400240024020072000" + "28020422084f0440200028021c2201200028022022002009200220031019" + "450d0141010f0b2006410871450d012000280210210b2000413036021020" + "002d0018210c41012101200041013a0018200028021c2206200028022022" + "0a20092002200310190d02200820076b41016a210102400340200141016b" + "2201450d0120064130200a280210110100450d000b41010f0b2006200420" + "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" + "000f0b200120042005200028020c11000021010c010b200820076b210602" + "4002400240410120002d0018220120014103461b220141016b0e02000102" + "0b20062101410021060c010b20064101762101200641016a41017621060b" + "200141016a21012000280210210820002802202107200028021c21000240" + "0340200141016b2201450d01200020082007280210110100450d000b4101" + "0f0b410121012000200720092002200310190d0020002004200520072802" + "0c1100000d004100210103402001200646044041000f0b200141016a2101" + "200020082007280210110100450d000b200141016b2006490f0b20010bbd" + "0201067f230041106b22042400410a2103024020004190ce004904402000" + "21050c010b0340200441066a20036a220641046b20004190ce006e220541" + "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" + "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" + "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" + "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" + "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" + "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" + "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" + "2203200441066a6a20004130723a00000b2002200141014100200441066a" + "20036a410a20036b1009200441106a24000b1701017f2000280200220104" + "4020002802042001100c0b0bce0601047f0240200041046b280200220422" + "02417871220341044108200241037122021b20016a4f0440200241002003" + "200141276a4b1b0d01200041086b22012004220341787122006a21020240" + "024020034101710d002003410271450d012001280200220320006a210020" + "0120036b22014190a0c00028020046044020022802044103714103470d01" + "4188a0c000200036020020022002280204417e7136020420012000410172" + "360204200220003602000c020b2001200310330b02400240024002400240" + "2002280204220341027145044020024194a0c000280200460d0220024190" + "a0c000280200460d0320022003417871220210332001200020026a220041" + "0172360204200020016a200036020020014190a0c000280200470d014188" + "a0c00020003602000c060b20022003417e71360204200120004101723602" + "04200020016a20003602000b2000418002490d0220012000103241002101" + "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" + "280200220004400340200141016a2101200028020822000d000b0b41a8a0" + "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" + "418ca0c000418ca0c00028020020006a2200360200200120004101723602" + "044190a0c00028020020014604404188a0c00041003602004190a0c00041" + "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" + "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" + "402002200128020022054f04402002200520012802046a490d040b200128" + "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" + "020020006a220036020020012000410172360204200020016a2000360200" + "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" + "012000410376742200714504404180a0c000200020037236020020020c01" + "0b20022802080b2100200220013602082000200136020c2001200236020c" + "200120003602080c010b41f09dc000280200220104400340200041016a21" + "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" + "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" + "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" + "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" + "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" + "087f230041406a2202240020002802082105200028020421034101210620" + "0128021c41cc81c0004101200128022028020c1100002100200504400340" + "20072108410121072000410171210441012100024020040d00024020012d" + "00144104714504402008410171450d01200128021c418383c00041022001" + "28022028020c110000450d010c020b20012802202104200128021c210920" + "08410171450440200941d59ac0004101200428020c1100000d020b200241" + "013a0017200241206a200141086a290200370300200241286a200141106a" + "290200370300200241306a200141186a2802003602002002200436020c20" + "022009360208200241e482c0003602382002200129020037031820022002" + "41176a3602102002200241086a3602342003200241186a10054504402002" + "280234418883c0004102200228023828020c11000021000c020b0c010b20" + "032001100521000b200341016a2103200541016b22050d000b0b20004504" + "40200128021c419083c0004101200128022028020c11000021060b200241" + "406b240020060bdb0101047f230041106b220224002002200036020c2300" + "41106b22002400200128021c41f899c000410d200128022028020c110000" + "2103200041003a000d200020033a000c20002001360208200041086a4185" + "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" + "722101024020054101712004410147720d00200328020022012d00144104" + "71450440200128021c418b83c0004102200128022028020c11000021010c" + "010b200128021c418a83c0004101200128022028020c11000021010b2000" + "41106a24002001410171200241106a24000b3300200128021c2000280200" + "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" + "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" + "c0002d00001a024002400240024002404107101222000440200041036a41" + "879bc000280000360000200041849bc000280000360000200341286a2000" + "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" + "200041036a41879bc000280000360000200041849bc00028000036000020" + "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" + "122200450d05200041076a41929bc0002800003600002000418b9bc00029" + "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" + "00001a200328024821012003280244210b410710122204450d0541002100" + "200441036a41b79bc000280000360000200441b49bc00028000036000020" + "0341d8006a41e100200b20012004410710021013200328025c2105024002" + "400240200328026022020e020700010b41012100200522012d0000412b6b" + "0e03060106010b20052d0000412b460440200241016b2100200541016a21" + "0120024112490d010c030b200521012002220041114f0d020b034020012d" + "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" + "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" + "186a2010103820012d000041306b220941094b0d02410221002003290320" + "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" + "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" + "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" + "8b06360000200341cc006a200041041001101320004104100c027f024020" + "03280254220541004e047f2003280250210c20054504404101210141000c" + "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" + "1014000b20050b21092001200c2005103721002005450d01200541076b22" + "014100200120054d1b2106200041036a417c7120006b2108410021010340" + "024002400240200020016a2d00002202c0220741004e0440200820016b41" + "03710d01200120064f0d020340200020016a220228020420022802007241" + "8081828478710d03200141086a22012006490d000b0c020b428080808080" + "20210e428080808010210f024002400240027e0240024002400240024002" + "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" + "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" + "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" + "220420054f0d06200020046a2c0000210402400240200241e00147044020" + "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" + "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" + "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" + "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" + "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" + "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" + "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" + "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" + "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" + "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" + "00210f0b2001ad200e200f8484210e200941808080807846044020002109" + "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" + "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" + "010b200120054f0d000340200020016a2c00004100480d01200520014101" + "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" + "0021050b410021000240024002400240024002400240200ea722020e0206" + "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" + "2b460440200241016b2100200541016a210120024112490d010c020b2005" + "21012002220041114f0d010b4200210e034020012d000041306b22024109" + "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" + "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" + "2d000041306b220441094b0d024102210020032903104200520d03200141" + "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" + "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" + "024002400240410b101222080440200841076a419d9bc000280000360000" + "200841969bc000290000370000200341d8006a2008410b10011013200328" + "025c2104024002400240200328026022020e020a00010b4101210720042d" + "00002201412b6b0e03090109010b20042d000021010b0240024002400240" + "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" + "20024109490d02200121020c080b200241016b2106200441016a21002002" + "4109490d044100210103402006450d0b20002d000041306b220241094b0d" + "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" + "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" + "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" + "0c0b4100210141012107034020002d000041306b220641094b0d06200041" + "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" + "010b410021010c040b4100210141012107034020002d000041306b220241" + "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" + "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" + "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" + "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" + "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" + "c0001015000b20032802582200044020042000100c0b2008410b100c4100" + "210020032802302202200328023c460440200328022c2104200328023821" + "0741002106024020022200450d00034020042d0000220220072d00002208" + "460440200441016a2104200741016a2107200041016b22000d010c020b0b" + "200220086b21060b20064521000b2009044020052009100c0b200328024c" + "22020440200c2002100c0b200328024022020440200b2002100c0b200328" + "02342202044020032802382002100c0b200328022822020440200328022c" + "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" + "0121000b200320003a0058200341d8006a419080c00041f880c000101500" + "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" + "15000b410141e899c0001014000bee2202087f017e024002400240024002" + "40024002400240200041f4014d04404180a0c00028020022024110200041" + "0b6a41f803712000410b491b220541037622007622014103710d01200541" + "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" + "00410b6a220141787121054184a0c0002802002208450d06411f21074100" + "20056b2103200041f4ffff074d04402005410620014108766722006b7641" + "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" + "45044041002100410021010c040b410021002005411920074101766b4100" + "2007411f471b742104410021010340024020022802044178712206200549" + "0d00200620056b220620034f0d0020022101200622030d00410021032001" + "21000c060b200228021422062000200620022004411d764104716a41106a" + "2802002202471b200020061b21002004410174210420020d000b0c030b02" + "402001417f7341017120006a2206410374220041f89dc0006a2203200041" + "809ec0006a280200220128020822044704402004200336020c2003200436" + "02080c010b4180a0c0002002417e200677713602000b2001200041037236" + "0204200020016a220020002802044101723602040c060b02404102200074" + "2203410020036b72200120007471682206410374220041f89dc0006a2203" + "200041809ec0006a280200220128020822044704402004200336020c2003" + "20043602080c010b4180a0c0002002417e200677713602000b2001200541" + "0372360204200120056a2206200020056b2204410172360204200020016a" + "20043602004188a0c00028020022020440200241787141f89dc0006a2100" + "4190a0c0002802002103027f4180a0c00028020022054101200241037674" + "2202714504404180a0c000200220057236020020000c010b20002802080b" + "2102200020033602082002200336020c2003200036020c20032002360208" + "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" + "41e89cc0006a280200220128020441787120056b21032001210202400340" + "02400240200128021022000d00200128021422000d002002280218210702" + "4002402002200228020c2200460440200241144110200228021422001b6a" + "28020022010d01410021000c020b20022802082201200036020c20002001" + "3602080c010b200241146a200241106a20001b2104034020042106200122" + "0041146a200041106a200028021422011b210420004114411020011b6a28" + "020022010d000b200641003602000b2007450d032002200228021c410274" + "41e89cc0006a220128020047044020074110411420072802102002461b6a" + "20003602002000450d040c020b2001200036020020000d014184a0c00041" + "84a0c000280200417e200228021c77713602000c030b2000280204417871" + "20056b22012003200120034922011b21032000200220011b210220002101" + "0c010b0b2000200736021820022802102201044020002001360210200120" + "003602180b20022802142201450d0020002001360214200120003602180b" + "02400240200341104f044020022005410372360204200220056a22062003" + "410172360204200320066a20033602004188a0c0002802002204450d0120" + "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" + "0200220541012004410376742204714504404180a0c00020042005723602" + "0020000c010b20002802080b2104200020013602082004200136020c2001" + "200036020c200120043602080c010b2002200320056a2200410372360204" + "200020026a220020002802044101723602040c010b4190a0c00020063602" + "004188a0c00020033602000b200241086a0f0b2000200172450440410021" + "0141022007742200410020006b722008712200450d0320006841027441e8" + "9cc0006a28020021000b2000450d010b0340200020012000280204417871" + "220420056b220620034922071b2108200028021022024504402000280214" + "21020b20012008200420054922001b210120032006200320071b20001b21" + "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" + "0020056b4f710d0020012802182107024002402001200128020c22004604" + "40200141144110200128021422001b6a28020022020d01410021000c020b" + "20012802082202200036020c200020023602080c010b200141146a200141" + "106a20001b21040340200421062002220041146a200041106a2000280214" + "22021b210420004114411020021b6a28020022020d000b20064100360200" + "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" + "0047044020074110411420072802102001461b6a20003602002000450d02" + "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" + "0128021c77713602000c010b200020073602182001280210220204402000" + "2002360210200220003602180b20012802142202450d0020002002360214" + "200220003602180b0240200341104f044020012005410372360204200120" + "056a22022003410172360204200220036a200336020020034180024f0440" + "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" + "280200220441012003410376742203714504404180a0c000200320047236" + "020020000c010b20002802080b2103200020023602082003200236020c20" + "02200036020c200220033602080c010b2001200320056a22004103723602" + "04200020016a220020002802044101723602040b0c010b02400240024002" + "400240024020054188a0c00028020022014b04402005418ca0c000280200" + "22004f044041002100200541af80046a220141107640002202417f462203" + "0d0720024110742202450d074198a0c000410020014180807c7120031b22" + "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" + "200020002001491b360200024002404194a0c0002802002203044041e89d" + "c0002100034020002802002201200028020422066a2002460d0220002802" + "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" + "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" + "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" + "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" + "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" + "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" + "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" + "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" + "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" + "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" + "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" + "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" + "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" + "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" + "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" + "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" + "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" + "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" + "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" + "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" + "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" + "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" + "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" + "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" + "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" + "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" + "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" + "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" + "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" + "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" + "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" + "0441286b220036020020022000410172360204200020026a412836020441" + "a0a0c00041808080013602000c080b200220034d200120034b720d002000" + "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" + "360200200220046a210141e89dc000210002400240034020012000280200" + "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" + "c0002100034002402003200028020022014f04402003200120002802046a" + "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" + "c000200441286b220036020020022000410172360204200020026a412836" + "020441a0a0c00041808080013602002003200641206b41787141086b2200" + "2000200341106a491b2201411b36020441e89dc000290200210920014110" + "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" + "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" + "02002001411c6a2100034020004107360200200041046a22002006490d00" + "0b20012003460d0720012001280204417e713602042003200120036b2200" + "4101723602042001200036020020004180024f04402003200010320c080b" + "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" + "410376742200714504404180a0c000200020027236020020010c010b2001" + "2802080b2100200120033602082000200336020c2003200136020c200320" + "003602080c070b200020023602002000200028020420046a360204200220" + "054103723602042006410f6a41787141086b2201200220056a22046b2103" + "20014194a0c000280200460d0320014190a0c000280200460d0420012802" + "04220541037141014604402001200541787122001033200020016a220128" + "02042105200020036a21030b20012005417e713602042004200341017236" + "0204200320046a200336020020034180024f04402004200310320c060b20" + "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" + "0376742203714504404180a0c000200120037236020020000c010b200028" + "02080b2103200020043602082003200436020c2004200036020c20042003" + "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" + "00280200220020056a220236020020022001410172360204200020054103" + "72360204200041086a21000c060b4190a0c0002802002100024020012005" + "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" + "2001410372360204200020016a220120012802044101723602040c010b41" + "88a0c00020023602004190a0c000200020056a2203360200200320024101" + "72360204200020016a2002360200200020054103723602040b200041086a" + "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" + "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" + "03200020016b6a41086a220136020020022001410172360204200020036a" + "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" + "00418ca0c000418ca0c00028020020036a22003602002004200041017236" + "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" + "6a220036020020042000410172360204200020046a20003602000b200241" + "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" + "20056b22013602004194a0c0004194a0c000280200220020056a22023602" + "002002200141017236020420002005410372360204200041086a0f0b2000" + "0f0b200141086a0b2701017f200020012800042202360208200020012800" + "003602042000200236020020014108100c0b3b002000450440230041206b" + "22002400200041003602182000410136020c2000419c81c0003602082000" + "4204370210200041086a20011017000b000b7e01017f230041406a220324" + "002003412b36020c200341d098c000360208200320013602142003200036" + "02102003410236021c200341d482c0003602182003420237022420032003" + "41106aad4280808080e000843703382003200341086aad4280808080f000" + "843703302003200341306a360220200341186a20021017000b4101017f23" + "0041206b2202240020024100360210200241013602042002420437020820" + "02412e36021c200220003602182002200241186a36020020022001101700" + "0bf40102027f017e230041106b22022400200241013b010c200220013602" + "0820022000360204230041106b22012400200241046a2200290200210420" + "01200036020c20012004370204230041106b22002400200141046a220128" + "0200220228020c2103024002400240024020022802040e020001020b2003" + "0d0141012102410021030c020b20030d0020022802002202280204210320" + "0228020021020c010b20004180808080783602002000200136020c200128" + "020822012d0008210220012d00091a2000410e20021026000b2000200336" + "020420002002360200200128020822012d0008210220012d00091a200041" + "0f20021026000b0d00200028020041012001100a0b380002402002418080" + "c400460d00200020022001280210110100450d0041010f0b200345044041" + "000f0b200020032004200128020c1100000b900a010a7f02400240024020" + "0028020022052000280208220372044002402003410171450d0020012002" + "6a21060240200028020c2209450440200121040c010b2001210403402004" + "22032006460d02027f200341016a20032c0000220441004e0d001a200341" + "026a20044160490d001a200341036a20044170490d001a200341046a0b22" + "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" + "20042c00001a20072002027f02402007450d00200220074d044020022007" + "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" + "031b21022003200120031b21010b2005450d032000280204210b20024110" + "4f044020022001200141036a417c7122076b22086a220a41037121094100" + "210541002103200120074704402008417c4d044041002106034020032001" + "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" + "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" + "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" + "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" + "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" + "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" + "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" + "09410371210a2009410274210741002104200641044f04402008200741f0" + "07716a210c200821030340200420032802002204417f7341077620044106" + "76724181828408716a20032802042204417f734107762004410676724181" + "828408716a20032802082204417f73410776200441067672418182840871" + "6a200328020c2204417f734107762004410676724181828408716a210420" + "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" + "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" + "200a450d000b2008200941fc01714102746a22042802002203417f734107" + "762003410676724181828408712103200a4101460d022003200428020422" + "03417f734107762003410676724181828408716a2103200a4102460d0220" + "0320042802082203417f734107762003410676724181828408716a21030c" + "020b2002450440410021050c030b20024103712104024020024104490440" + "41002105410021080c010b41002105200121032002410c71220821070340" + "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" + "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" + "200741046b22070d000b0b2004450d02200120086a21030340200520032c" + "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" + "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" + "056a21050b02402005200b490440200b20056b210602400240024020002d" + "00182203410020034103471b220341016b0e020001020b20062103410021" + "060c010b20064101762103200641016a41017621060b200341016a210320" + "00280210210820002802202104200028021c21000340200341016b220345" + "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" + "02200428020c110000044041010f0b410021030340200320064604404100" + "0f0b200341016a2103200020082004280210110100450d000b200341016b" + "2006490f0b200028021c20012002200028022028020c1100000b14002000" + "2802002001200028020428020c1101000b10002001200028020020002802" + "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" + "6b220324002003200136022c20032000360228200341033a002420034220" + "37021c200341003602142003410036020c027f0240024002402002280210" + "220a450440200228020c2200450d012002280208220120004103746a2104" + "200041016b41ffffffff017141016a210720022802002100034020004104" + "6a28020022050440200328022820002802002005200328022c28020c1100" + "000d040b20012802002003410c6a200141046a2802001101000d03200041" + "086a2100200141086a22012004470d000b0c010b20022802142200450d00" + "2000410574210b200041016b41ffffff3f7141016a210720022802082105" + "200228020021000340200041046a28020022010440200328022820002802" + "002001200328022c28020c1100000d030b20032008200a6a220141106a28" + "020036021c20032001411c6a2d00003a00242003200141186a2802003602" + "202001410c6a28020021044100210941002106024002400240200141086a" + "28020041016b0e020002010b200441037420056a220c2802000d01200c28" + "020421040b410121060b200320043602102003200636020c200141046a28" + "02002104024002400240200128020041016b0e020002010b200441037420" + "056a22062802000d01200628020421040b410121090b2003200436021820" + "0320093602142005200141146a2802004103746a22012802002003410c6a" + "200141046a2802001101000d02200041086a2100200b200841206a220847" + "0d000b0b200720022802044f0d012003280228200228020020074103746a" + "22002802002000280204200328022c28020c110000450d010b41010c010b" + "41000b200341306a24000b1900200128021c41a481c000410e2001280220" + "28020c1100000b820302047f017e230041406a2206240041012107024020" + "002d00040d0020002d00052108200028020022052d001441047145044020" + "0528021c418383c000418083c000200841017122081b4102410320081b20" + "0528022028020c1100000d01200528021c20012002200528022028020c11" + "00000d01200528021c41f391c0004102200528022028020c1100000d0120" + "032005200411010021070c010b2008410171450440200528021c418583c0" + "004103200528022028020c1100000d010b200641013a0017200641206a20" + "0541086a290200370300200641286a200541106a29020037030020064130" + "6a200541186a2802003602002006200529021c3702082005290200210920" + "0641e482c000360238200620093703182006200641176a36021020062006" + "41086a220536023420052001200210210d00200541f391c000410210210d" + "002003200641186a20041101000d002006280234418883c0004102200628" + "023828020c11000021070b200041013a0005200020073a0004200641406b" + "240020000bab04010c7f200141016b210e2000280204210a200028020021" + "0b2000280208210c0240034020050d01027f024020022003490d00034020" + "0120036a2105024002400240200220036b220741074d044020022003470d" + "01200221030c050b0240200541036a417c71220620056b22040440410021" + "000340200020056a2d0000410a460d052004200041016a2200470d000b20" + "04200741086b22004d0d010c030b200741086b21000b0340418082840820" + "062802002209418a94a8d000736b2009724180828408200641046a280200" + "2209418a94a8d000736b2009727141808182847871418081828478470d02" + "200641086a2106200441086a220420004d0d000b0c010b41002100034020" + "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" + "030b20042007460440200221030c030b200420056a2106200220046b2003" + "6b21074100210002400340200020066a2d0000410a460d01200720004101" + "6a2200470d000b200221030c030b200020046a21000b200020036a220441" + "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" + "200322040c030b200220034f0d000b0b20022008460d0241012105200821" + "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" + "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" + "200020086b2100200120086a2107200c20063a000020042108200b200720" + "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" + "042102200028020021030240200028020822002d0000450d00200341fc82" + "c0004104200228020c110000450d0041010f0b20002001410a463a000020" + "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" + "200028020022002000411f7522027320026b2000417f73411f762001100a" + "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" + "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" + "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" + "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" + "0041003a00002002450d00000b000b250020002802002d00004504402001" + "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" + "02082204452001280200220520046b20034f724504402001410036020820" + "0141003a000c410021040b20032005490440200128020420046a20022003" + "10371a200041043a00002001200320046a3602080f0b2000420437020020" + "0141003a000c0bac0301017f230041406a22022400024002400240024002" + "40024020002d000041016b0e03010203000b2002200028020436020441b1" + "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" + "0000200041086a41a495c0002900003700002000419c95c0002900003700" + "00200241143602102002200036020c200241143602082002410336022c20" + "02419c91c000360228200242023702342002200241046aad4280808080b0" + "01843703202002200241086aad4280808080c00184370318200220024118" + "6a360230200128021c2001280220200241286a101e210020022802082201" + "450d03200228020c2001100c0c030b20002d000121002002410136022c20" + "0241c88ac000360228200242013702342002200241186aad4280808080f0" + "008437030820022000410274220041f095c0006a28020036021c20022000" + "419897c0006a2802003602182002200241086a360230200128021c200128" + "0220200241286a101e21000c020b20012000280204220028020020002802" + "04101a21000c010b20002802042200280200200120002802042802101101" + "0021000b200241406b240020000f0b000b10002001200028020420002802" + "08101a0b5501037f2000280204210120002d0000220041044d2000410347" + "7145044020012802002100200141046a2802002202280200220304402000" + "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" + "c709010a7f230041206b2208240002400240024002402001280210450440" + "2001417f36021020032003200241036a417c7120026b220a6b4107714100" + "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" + "016b200220036a220541016b22062d0000410a460d001a2006200220096a" + "2207460d01200441026b200541026b22062d0000410a460d001a20062007" + "460d01200441036b200541036b22062d0000410a460d001a20062007460d" + "01200441046b200541046b22062d0000410a460d001a20062007460d0120" + "0441056b200541056b22062d0000410a460d001a20062007460d01200441" + "066b200541066b22062d0000410a460d001a20062007460d01200441076b" + "200541076b22052d0000410a460d001a20052007460d0120044178720b20" + "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" + "0241046b210d2004417f7320026a21060340024020062105200a21042009" + "2207200c4d0d00200441086b210a200541086b2106418082840820022007" + "41086b22096a280200220b418a94a8d000736b200b724180828408200720" + "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" + "8478460d010b0b20032007490d0202400340200320046a450d0120044101" + "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" + "016a21040c040b02402001411c6a2802002204450440410021040c010b20" + "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" + "00202001411c6a41003602000b2003200128021420046b4f044020002001" + "41146a2002200310280c050b200128021820046a2002200310371a200041" + "043a00002001411c6a200320046a3602000c040b230041306b2200240020" + "00410136020c200041c481c0003602082000420137021420002000412f6a" + "ad4280808080a001843703202000200041206a360210200041086a41d091" + "c0001017000b230041306b22002400200020033602042000200936020020" + "00410236020c200041d887c000360208200042023702142000200041046a" + "ad428080808080018437032820002000ad42808080808001843703202000" + "200041206a360210200041086a418485c0001017000b230041306b220024" + "0020002003360204200020073602002000410236020c200041f887c00036" + "0208200042023702142000200041046aad42808080808001843703282000" + "2000ad42808080808001843703202000200041206a360210200041086a41" + "9485c0001017000b20032004490440200841003602182008410136020c20" + "0841888bc00036020820084204370210200841086a41908bc0001017000b" + "02402001411c6a2802002205450d0002400240200128021420056b20044d" + "0440200841086a200141146a20022004102820082d00084104470d012001" + "411c6a28020021050c020b200141186a28020020056a2002200410371a20" + "01411c6a200420056a22053602000c010b200020082903083702000c020b" + "2005450d00200141003a00202001411c6a41003602000b200220046a2105" + "200320046b220220012802144f04402000200141146a2005200210280c01" + "0b200141186a2802002005200210371a200041043a00002001411c6a2002" + "3602000b2001200128021041016a360210200841206a24000b9a0102047f" + "017e230041106b22032400200341086a200028020828020020012002102c" + "20032d000822054104470440200028020421012003290308210720002d00" + "00220241044d20024103477145044020012802002102200141046a280200" + "220428020022060440200220061103000b20042802042204044020022004" + "100c0b2001410c100c0b200020073702000b200341106a24002005410447" + "0be10202057f017e230041106b2202240020024100360204027f20014180" + "014f044020014180104f04402001418080044f044020022001413f714180" + "01723a00072002200141127641f001723a000420022001410676413f7141" + "8001723a000620022001410c76413f71418001723a000541040c030b2002" + "2001413f71418001723a000620022001410c7641e001723a000420022001" + "410676413f71418001723a000541030c020b20022001413f71418001723a" + "00052002200141067641c001723a000441020c010b200220013a00044101" + "0b2101200241086a2000280208280200200241046a2001102c20022d0008" + "22054104470440200028020421012002290308210720002d000022034104" + "4d20034103477145044020012802002103200141046a2802002204280200" + "22060440200320061103000b20042802042204044020032004100c0b2001" + "410c100c0b200020073702000b200241106a240020054104470b0d002000" + "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" + "36020c2001419892c00036020841c89cc0002d0000410347044002402300" + "41206b22022400024002400240024041c89cc0002d000041026b0e020301" + "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" + "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" + "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" + "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" + "41206a24000c020b000b200241003602182002410136020c200241e895c0" + "0036020820024204370210200241086a41b094c0001017000b0b02400240" + "024041d89cc000290300220650044041e09cc00029030021050340200542" + "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" + "5122021b370300200721052002450d000b41d89cc00020063703000b0240" + "024041a09cc000290300200652044041ac9cc0002d000021034101210241" + "ac9cc00041013a0000200120033a00182003450d01200142003702342001" + "4281808080c00037022c200141c893c000360228230041106b2202240020" + "02418888c00036020c2002200141186a360208230041f0006b2200240020" + "00418c88c00036020c2000200241086a3602082000418c88c00036021420" + "002002410c6a3602102000410236021c200041cd81c00036021802402001" + "41286a22012802004504402000410336025c2000418082c0003602582000" + "42033702642000200041106aad4280808080e00084370348200020004108" + "6aad4280808080e000843703400c010b200041306a200141106a29020037" + "0300200041286a200141086a290200370300200020012902003703202000" + "410436025c200041b482c000360258200042043702642000200041106aad" + "4280808080e000843703502000200041086aad4280808080e00084370348" + "2000200041206aad42808080809001843703400b2000200041186aad4280" + "808080f000843703382000200041386a360260200041d8006a41fc93c000" + "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" + "0041306b220024002000412636020c200041c094c0003602082000410136" + "0214200041c88ac0003602102000420137021c2000200041086aad428080" + "8080f000843703282000200041286a360218200041106a418c95c0001017" + "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" + "36021041042102200141043a00182001200141106a360220200141186a41" + "9c88c0002000101e210320012d0018210002402003450440420021054117" + "2000764101710d01200128021c22002802002102200041046a2802002203" + "28020022040440200220041103000b20032802042203044020022003100c" + "0b2000410c100c410421020c010b20004104460d02200129031822074280" + "7e8321052007a721020b20012802102200200028020841016b2203360208" + "2003450440200041003a000c200042003703000b200241ff01714104470d" + "02200141406b24000f0b230041206b220024002000410036021820004101" + "36020c200041b08ac00036020820004204370210200041086a41b88ac000" + "1017000b200141003602382001410136022c2001419093c0003602282001" + "4204370230200141286a419893c0001017000b200120052002ad42ff0183" + "843703102001410236022c200141f891c000360228200142023702342001" + "200141106aad4280808080d001843703202001200141086aad4280808080" + "f000843703182001200141186a360230200141286a418892c0001017000b" + "0c00200020012902003703000bba0201047f411f21022000420037021020" + "0141ffffff074d04402001410620014108766722036b7641017120034101" + "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" + "20027422034184a0c0002802007145044020042000360200200020043602" + "182000200036020c200020003602084184a0c0004184a0c0002802002003" + "723602000f0b024002402001200428020022032802044178714604402003" + "21020c010b2001411920024101766b41002002411f471b74210503402003" + "2005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c" + "20022000360208200041003602182000200236020c200020013602080f0b" + "20042000360200200020033602182000200036020c200020003602080bf1" + "0201047f200028020c21020240024020014180024f044020002802182103" + "0240024020002002460440200041144110200028021422021b6a28020022" + "010d01410021020c020b20002802082201200236020c200220013602080c" + "010b200041146a200041106a20021b21040340200421052001220241146a" + "200241106a200228021422011b210420024114411020011b6a2802002201" + "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" + "006a220128020047044020034110411420032802102000461b6a20023602" + "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" + "280200417e200028021c77713602000c020b200028020822002002470440" + "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" + "7e200141037677713602000f0b2002200336021820002802102201044020" + "022001360210200120023602180b20002802142200450d00200220003602" + "14200020023602180b0b8f0101027f230041306b22012400024020004100" + "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" + "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" + "14200141d89ac0003602102001420137021c2001411036022c2001200141" + "286a36021820012001410c6a360228200141106a1030200128020c200141" + "306a24000bcf0101067f23004180016b2204240020012802042107200128" + "020021062000280200210020012802142205210202402005410471450d00" + "2005410872210220060d0020014281808080a0013702000b200120024104" + "7236021441810121020340200220046a41026b2000410f71220341307220" + "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" + "762100450d000b20014101419183c0004102200220046a41016b41810120" + "026b10092001200536021420012007360204200120063602002004418001" + "6a24000b6301017f230041306b220224002002200036020c200241023602" + "14200241f49ac0003602102002420137021c2002411036022c2002200241" + "286a36021820022002410c6a360228200241106a10302001044020022802" + "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" + "21030c010b02402000410020006b41037122066a220520004d0d00200021" + "032001210420060440200621070340200320042d00003a0000200441016a" + "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" + "0340200320042d00003a0000200341016a200441016a2d00003a00002003" + "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" + "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" + "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" + "003a0000200441086a2104200341086a22032005470d000b0b2005200220" + "066b2207417c7122086a21030240200120066a2204410371450440200320" + "054d0d0120042101034020052001280200360200200141046a2101200541" + "046a22052003490d000b0c010b200320054d0d0020044103742202411871" + "21062004417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220067620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20074103712102200420086a21010b" + "02402003200220036a22064f0d002002410771220404400340200320012d" + "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" + "200241016b4107490d000340200320012d00003a0000200341016a200141" + "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" + "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" + "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" + "41076a200141076a2d00003a0000200141086a2101200341086a22032006" + "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" + "420022022001422088420a7e7c22014220867c2204370300200020032004" + "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" + "c0000ba40611000000140000000400000012000000000000000100000001" + "00000013000000557466384572726f7276616c69645f75705f746f657272" + "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" + "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" + "003d0000005c0010000a0000001600000037000000636170616369747920" + "6f766572666c6f770000008800100011000000426f72726f774d75744572" + "726f72616c726561647920626f72726f7765643a20b2001000120000005b" + "3d3d617373657274696f6e20606c6566742020726967687460206661696c" + "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" + "00100017000000f60010000900000020726967687460206661696c65643a" + "200a20206c6566743a20000000cf00100010000000180110001000000028" + "01100009000000f6001000090000000100000000000000f3081000020000" + "00000000000c000000040000001400000015000000160000002020202020" + "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230" + "323132323233323432353236323732383239333033313332333333343335" + "333633373338333934303431343234333434343534363437343834393530" + "353135323533353435353536353735383539363036313632363336343635" + "363636373638363937303731373237333734373537363737373837393830" + "383138323833383438353836383738383839393039313932393339343935" + "393639373938393966616c7365747275656c6962726172792f636f72652f" + "7372632f736c6963652f6d656d6368722e72736402100020000000850000" + "001e0000006402100020000000a100000009000000010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010100" + "41e686c0000b330202020202020202020202020202020202020202020202" + "020202020202020303030303030303030303030303030304040404040041" + "a487c0000b6172616e676520737461727420696e64657820206f7574206f" + "662072616e676520666f7220736c696365206f66206c656e67746820a403" + "100012000000b60310002200000072616e676520656e6420696e64657820" + "e803100010000000b60310002200419088c0000b8f140400000004000000" + "17000000180000000c00000004000000190000001a0000001b0000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" + "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" + "61746520756e69717565207468726561642049443a206269747370616365" + "20657868617573746564f904100037000000dc0410001d000000ae040000" + "0d00000001000000000000006c6962726172792f7374642f7372632f696f" + "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" + "203e206c656e00007d05100009000000500510002d000000160100002900" + "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" + "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" + "696f6e207265736574686f737420756e726561636861626c656e6574776f" + "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" + "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" + "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c7265616479206578" + "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" + "206469726563746f727969732061206469726563746f7279646972656374" + "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" + "74656d206f722073746f72616765206d656469756d66696c657379737465" + "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" + "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" + "2066696c652068616e646c65696e76616c696420696e7075742070617261" + "6d65746572696e76616c6964206461746174696d6564206f757477726974" + "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" + "756e7365656b61626c652066696c6571756f746120657863656564656466" + "696c6520746f6f206c617267657265736f75726365206275737965786563" + "757461626c652066696c652062757379646561646c6f636b63726f73732d" + "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" + "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" + "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" + "70746564756e737570706f72746564756e657870656374656420656e6420" + "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" + "736f74686572206572726f72756e63617465676f72697a6564206572726f" + "7220286f73206572726f72202900000001000000000000008d0810000b00" + "000098081000010000006c6962726172792f7374642f7372632f696f2f73" + "7464696f2e727300b40810001b00000032030000140000006661696c6564" + "207072696e74696e6720746f203a20000000e008100013000000f3081000" + "02000000b40810001b00000063040000090000007374646f75746c696272" + "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" + "696e6720747261697420696d706c656d656e746174696f6e207265747572" + "6e656420616e206572726f72207768656e2074686520756e6465726c7969" + "6e672073747265616d20646964206e6f7400000037091000560000001e09" + "100019000000680700001500000063616e6e6f7420726563757273697665" + "6c792061637175697265206d75746578a8091000200000006c6962726172" + "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" + "72656164732e7273d00910002c00000013000000090000006c6962726172" + "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" + "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" + "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" + "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" + "7273660a100026000000220100002d0000006f7065726174696f6e207375" + "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" + "6e206d6179206e6f7420626520706572666f726d65642072656375727369" + "76656c79b00a100038000000100000001100000012000000100000001000" + "000013000000120000000d0000000e000000150000000c0000000b000000" + "15000000150000000f0000000e0000001300000026000000380000001900" + "0000170000000c000000090000000a00000010000000170000000e000000" + "0e0000000d00000014000000080000001b0000000e000000100000001600" + "0000150000000b000000160000000d0000000b0000000b00000013000000" + "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" + "1000250610003306100048061000540610005f0610007406100089061000" + "98061000a6061000b9061000df0610001707100030071000470710005307" + "10005c07100066071000760710008d0710009b071000a9071000b6071000" + "ca071000d2071000ed071000fb0710000b08100021081000360810004108" + "100057081000640810006f0810007a081000000000000100000001000000" + "1300000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" + "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" + "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" + "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" + "6963652e72737b0c10006d000000a1000000190000005061727365496e74" + "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" + "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" + "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" + "100009000000550d1000010000006465616c6c6f636174652000680d1000" + "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" + "46696e6973684166746572000000090d1000320000008000000016000000" + "42616c616e636500090d1000320000009b00000016000000456d70747949" + "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" + "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" + "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" + "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; + +std::string const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 1d377676c6b..e7bada74a5f 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -17,1553 +17,14 @@ */ //============================================================================== +#pragma once + // TODO: consider moving these to separate files (and figure out the build) -static auto const ledgerSqnHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" - "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" - "010700100041044a0b004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d31" - "2e38352e31202834656231363132353020323032352d30332d3135290049" - "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" - "732b0a6d756c746976616c7565"; +#include + +extern std::string const ledgerSqnHex; -static auto const allHostFunctionsHex = - "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" - "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" - "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" - "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" - "686f73745f6c69621a67657443757272656e744c6564676572456e747279" - "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" - "794669656c64000408686f73745f6c696213676574506172656e744c6564" - "67657254696d65000503363501010101090a000302010101010506020207" - "020201040001010100010400010101020701080101030800010103020202" - "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" - "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" - "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" - "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" - "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" - "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" - "0000450440200128021c41d480c0004104200128022028020c1100002100" - "0c010b41012100200128021c220341d880c0004104200128022022062802" - "0c22051100000d00200441016a2104024020012d00144104714504402003" - "418d83c000410120051100000d022004200110050d02200128021c210320" - "0128022028020c21050c010b2003418e83c000410220051100000d012002" - "41013a0017200241206a200141086a290200370300200241286a20014110" - "6a290200370300200241306a200141186a2802003602002002200636020c" - "20022003360208200241e482c00036023820022001290200370318200220" - "0241176a3602102002200241086a3602342004200241186a10050d012002" - "280234418883c0004102200228023828020c1100000d010b2003419891c0" - "004101200511000021000b200241406b240020000bff0201037f23004180" - "016b22032400027f0240200128021422024110714504402002412071450d" - "0120002d0000210241810121000340200020036a41026b2002410f712204" - "413072200441376a2004410a491b3a000020022204410476210220004101" - "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" - "41810120006b10090c020b20002d0000210241810121000340200020036a" - "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" - "22044104762102200041016b21002004410f4b0d000b20014101419183c0" - "004102200020036a41016b41810120006b10090c010b0240024002402000" - "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" - "0171410174419383c0006a2f00003b0001410021000c010b410221002002" - "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" - "410174419383c0006a2f00003b00010b2001410141014100200020036a20" - "0041037310090b20034180016a24000b4701017f230041106b2202240020" - "022000280200220041046a36020c200141a080c000410941a980c000410b" - "2000410141b480c00041092002410c6a41021008200241106a24000bff01" - "01037f23004180016b22042400027f024020012802142202411071450440" - "20024120710d01200028020041012001100a0c020b200028020021004181" - "0121020340200220046a41026b2000410f712203413072200341d7006a20" - "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" - "20014101419183c0004102200220046a41016b41810120026b10090c010b" - "2000280200210041810121020340200220046a41026b2000410f71220341" - "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" - "41047621000d000b20014101419183c0004102200220046a41016b418101" - "20026b10090b20044180016a24000bc50101017f230041106b220b240020" - "0028021c20012002200028022028020c1100002101200b41003a000d200b" - "20013a000c200b2000360208200b41086a20032004200520061020200720" - "082009200a10202101200b2d000d2202200b2d000c220372210002402003" - "4101712002410147720d00200128020022002d0014410471450440200028" - "021c418b83c0004102200028022028020c11000021000c010b200028021c" - "418a83c0004101200028022028020c11000021000b200b41106a24002000" - "4101710bef0401077f027f200145044020002802142106412d2109200541" - "016a0c010b412b418080c4002000280214220641017122011b2109200120" - "056a0b210702402006410471450440410021020c010b024020034504400c" - "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" - "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" - "280200450440200028021c22012000280220220020092002200310190440" - "41010f0b200120042005200028020c1100000f0b02400240024020072000" - "28020422084f0440200028021c2201200028022022002009200220031019" - "450d0141010f0b2006410871450d012000280210210b2000413036021020" - "002d0018210c41012101200041013a0018200028021c2206200028022022" - "0a20092002200310190d02200820076b41016a210102400340200141016b" - "2201450d0120064130200a280210110100450d000b41010f0b2006200420" - "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" - "000f0b200120042005200028020c11000021010c010b200820076b210602" - "4002400240410120002d0018220120014103461b220141016b0e02000102" - "0b20062101410021060c010b20064101762101200641016a41017621060b" - "200141016a21012000280210210820002802202107200028021c21000240" - "0340200141016b2201450d01200020082007280210110100450d000b4101" - "0f0b410121012000200720092002200310190d0020002004200520072802" - "0c1100000d004100210103402001200646044041000f0b200141016a2101" - "200020082007280210110100450d000b200141016b2006490f0b20010bbd" - "0201067f230041106b22042400410a2103024020004190ce004904402000" - "21050c010b0340200441066a20036a220641046b20004190ce006e220541" - "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" - "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" - "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" - "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" - "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" - "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" - "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" - "2203200441066a6a20004130723a00000b2002200141014100200441066a" - "20036a410a20036b1009200441106a24000b1701017f2000280200220104" - "4020002802042001100c0b0bce0601047f0240200041046b280200220422" - "02417871220341044108200241037122021b20016a4f0440200241002003" - "200141276a4b1b0d01200041086b22012004220341787122006a21020240" - "024020034101710d002003410271450d012001280200220320006a210020" - "0120036b22014190a0c00028020046044020022802044103714103470d01" - "4188a0c000200036020020022002280204417e7136020420012000410172" - "360204200220003602000c020b2001200310330b02400240024002400240" - "2002280204220341027145044020024194a0c000280200460d0220024190" - "a0c000280200460d0320022003417871220210332001200020026a220041" - "0172360204200020016a200036020020014190a0c000280200470d014188" - "a0c00020003602000c060b20022003417e71360204200120004101723602" - "04200020016a20003602000b2000418002490d0220012000103241002101" - "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" - "280200220004400340200141016a2101200028020822000d000b0b41a8a0" - "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" - "418ca0c000418ca0c00028020020006a2200360200200120004101723602" - "044190a0c00028020020014604404188a0c00041003602004190a0c00041" - "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" - "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" - "402002200128020022054f04402002200520012802046a490d040b200128" - "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" - "020020006a220036020020012000410172360204200020016a2000360200" - "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" - "012000410376742200714504404180a0c000200020037236020020020c01" - "0b20022802080b2100200220013602082000200136020c2001200236020c" - "200120003602080c010b41f09dc000280200220104400340200041016a21" - "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" - "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" - "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" - "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" - "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" - "087f230041406a2202240020002802082105200028020421034101210620" - "0128021c41cc81c0004101200128022028020c1100002100200504400340" - "20072108410121072000410171210441012100024020040d00024020012d" - "00144104714504402008410171450d01200128021c418383c00041022001" - "28022028020c110000450d010c020b20012802202104200128021c210920" - "08410171450440200941d59ac0004101200428020c1100000d020b200241" - "013a0017200241206a200141086a290200370300200241286a200141106a" - "290200370300200241306a200141186a2802003602002002200436020c20" - "022009360208200241e482c0003602382002200129020037031820022002" - "41176a3602102002200241086a3602342003200241186a10054504402002" - "280234418883c0004102200228023828020c11000021000c020b0c010b20" - "032001100521000b200341016a2103200541016b22050d000b0b20004504" - "40200128021c419083c0004101200128022028020c11000021060b200241" - "406b240020060bdb0101047f230041106b220224002002200036020c2300" - "41106b22002400200128021c41f899c000410d200128022028020c110000" - "2103200041003a000d200020033a000c20002001360208200041086a4185" - "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" - "722101024020054101712004410147720d00200328020022012d00144104" - "71450440200128021c418b83c0004102200128022028020c11000021010c" - "010b200128021c418a83c0004101200128022028020c11000021010b2000" - "41106a24002001410171200241106a24000b3300200128021c2000280200" - "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" - "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" - "c0002d00001a024002400240024002404107101222000440200041036a41" - "879bc000280000360000200041849bc000280000360000200341286a2000" - "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" - "200041036a41879bc000280000360000200041849bc00028000036000020" - "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" - "122200450d05200041076a41929bc0002800003600002000418b9bc00029" - "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" - "00001a200328024821012003280244210b410710122204450d0541002100" - "200441036a41b79bc000280000360000200441b49bc00028000036000020" - "0341d8006a41e100200b20012004410710021013200328025c2105024002" - "400240200328026022020e020700010b41012100200522012d0000412b6b" - "0e03060106010b20052d0000412b460440200241016b2100200541016a21" - "0120024112490d010c030b200521012002220041114f0d020b034020012d" - "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" - "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" - "186a2010103820012d000041306b220941094b0d02410221002003290320" - "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" - "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" - "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" - "8b06360000200341cc006a200041041001101320004104100c027f024020" - "03280254220541004e047f2003280250210c20054504404101210141000c" - "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" - "1014000b20050b21092001200c2005103721002005450d01200541076b22" - "014100200120054d1b2106200041036a417c7120006b2108410021010340" - "024002400240200020016a2d00002202c0220741004e0440200820016b41" - "03710d01200120064f0d020340200020016a220228020420022802007241" - "8081828478710d03200141086a22012006490d000b0c020b428080808080" - "20210e428080808010210f024002400240027e0240024002400240024002" - "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" - "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" - "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" - "220420054f0d06200020046a2c0000210402400240200241e00147044020" - "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" - "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" - "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" - "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" - "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" - "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" - "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" - "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" - "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" - "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" - "00210f0b2001ad200e200f8484210e200941808080807846044020002109" - "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" - "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" - "010b200120054f0d000340200020016a2c00004100480d01200520014101" - "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" - "0021050b410021000240024002400240024002400240200ea722020e0206" - "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" - "2b460440200241016b2100200541016a210120024112490d010c020b2005" - "21012002220041114f0d010b4200210e034020012d000041306b22024109" - "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" - "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" - "2d000041306b220441094b0d024102210020032903104200520d03200141" - "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" - "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" - "024002400240410b101222080440200841076a419d9bc000280000360000" - "200841969bc000290000370000200341d8006a2008410b10011013200328" - "025c2104024002400240200328026022020e020a00010b4101210720042d" - "00002201412b6b0e03090109010b20042d000021010b0240024002400240" - "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" - "20024109490d02200121020c080b200241016b2106200441016a21002002" - "4109490d044100210103402006450d0b20002d000041306b220241094b0d" - "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" - "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" - "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" - "0c0b4100210141012107034020002d000041306b220641094b0d06200041" - "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" - "010b410021010c040b4100210141012107034020002d000041306b220241" - "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" - "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" - "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" - "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" - "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" - "c0001015000b20032802582200044020042000100c0b2008410b100c4100" - "210020032802302202200328023c460440200328022c2104200328023821" - "0741002106024020022200450d00034020042d0000220220072d00002208" - "460440200441016a2104200741016a2107200041016b22000d010c020b0b" - "200220086b21060b20064521000b2009044020052009100c0b200328024c" - "22020440200c2002100c0b200328024022020440200b2002100c0b200328" - "02342202044020032802382002100c0b200328022822020440200328022c" - "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" - "0121000b200320003a0058200341d8006a419080c00041f880c000101500" - "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" - "15000b410141e899c0001014000bee2202087f017e024002400240024002" - "40024002400240200041f4014d04404180a0c00028020022024110200041" - "0b6a41f803712000410b491b220541037622007622014103710d01200541" - "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" - "00410b6a220141787121054184a0c0002802002208450d06411f21074100" - "20056b2103200041f4ffff074d04402005410620014108766722006b7641" - "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" - "45044041002100410021010c040b410021002005411920074101766b4100" - "2007411f471b742104410021010340024020022802044178712206200549" - "0d00200620056b220620034f0d0020022101200622030d00410021032001" - "21000c060b200228021422062000200620022004411d764104716a41106a" - "2802002202471b200020061b21002004410174210420020d000b0c030b02" - "402001417f7341017120006a2206410374220041f89dc0006a2203200041" - "809ec0006a280200220128020822044704402004200336020c2003200436" - "02080c010b4180a0c0002002417e200677713602000b2001200041037236" - "0204200020016a220020002802044101723602040c060b02404102200074" - "2203410020036b72200120007471682206410374220041f89dc0006a2203" - "200041809ec0006a280200220128020822044704402004200336020c2003" - "20043602080c010b4180a0c0002002417e200677713602000b2001200541" - "0372360204200120056a2206200020056b2204410172360204200020016a" - "20043602004188a0c00028020022020440200241787141f89dc0006a2100" - "4190a0c0002802002103027f4180a0c00028020022054101200241037674" - "2202714504404180a0c000200220057236020020000c010b20002802080b" - "2102200020033602082002200336020c2003200036020c20032002360208" - "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" - "41e89cc0006a280200220128020441787120056b21032001210202400340" - "02400240200128021022000d00200128021422000d002002280218210702" - "4002402002200228020c2200460440200241144110200228021422001b6a" - "28020022010d01410021000c020b20022802082201200036020c20002001" - "3602080c010b200241146a200241106a20001b2104034020042106200122" - "0041146a200041106a200028021422011b210420004114411020011b6a28" - "020022010d000b200641003602000b2007450d032002200228021c410274" - "41e89cc0006a220128020047044020074110411420072802102002461b6a" - "20003602002000450d040c020b2001200036020020000d014184a0c00041" - "84a0c000280200417e200228021c77713602000c030b2000280204417871" - "20056b22012003200120034922011b21032000200220011b210220002101" - "0c010b0b2000200736021820022802102201044020002001360210200120" - "003602180b20022802142201450d0020002001360214200120003602180b" - "02400240200341104f044020022005410372360204200220056a22062003" - "410172360204200320066a20033602004188a0c0002802002204450d0120" - "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" - "0200220541012004410376742204714504404180a0c00020042005723602" - "0020000c010b20002802080b2104200020013602082004200136020c2001" - "200036020c200120043602080c010b2002200320056a2200410372360204" - "200020026a220020002802044101723602040c010b4190a0c00020063602" - "004188a0c00020033602000b200241086a0f0b2000200172450440410021" - "0141022007742200410020006b722008712200450d0320006841027441e8" - "9cc0006a28020021000b2000450d010b0340200020012000280204417871" - "220420056b220620034922071b2108200028021022024504402000280214" - "21020b20012008200420054922001b210120032006200320071b20001b21" - "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" - "0020056b4f710d0020012802182107024002402001200128020c22004604" - "40200141144110200128021422001b6a28020022020d01410021000c020b" - "20012802082202200036020c200020023602080c010b200141146a200141" - "106a20001b21040340200421062002220041146a200041106a2000280214" - "22021b210420004114411020021b6a28020022020d000b20064100360200" - "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" - "0047044020074110411420072802102001461b6a20003602002000450d02" - "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" - "0128021c77713602000c010b200020073602182001280210220204402000" - "2002360210200220003602180b20012802142202450d0020002002360214" - "200220003602180b0240200341104f044020012005410372360204200120" - "056a22022003410172360204200220036a200336020020034180024f0440" - "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" - "280200220441012003410376742203714504404180a0c000200320047236" - "020020000c010b20002802080b2103200020023602082003200236020c20" - "02200036020c200220033602080c010b2001200320056a22004103723602" - "04200020016a220020002802044101723602040b0c010b02400240024002" - "400240024020054188a0c00028020022014b04402005418ca0c000280200" - "22004f044041002100200541af80046a220141107640002202417f462203" - "0d0720024110742202450d074198a0c000410020014180807c7120031b22" - "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" - "200020002001491b360200024002404194a0c0002802002203044041e89d" - "c0002100034020002802002201200028020422066a2002460d0220002802" - "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" - "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" - "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" - "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" - "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" - "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" - "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" - "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" - "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" - "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" - "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" - "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" - "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" - "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" - "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" - "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" - "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" - "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" - "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" - "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" - "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" - "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" - "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" - "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" - "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" - "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" - "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" - "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" - "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" - "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" - "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" - "0441286b220036020020022000410172360204200020026a412836020441" - "a0a0c00041808080013602000c080b200220034d200120034b720d002000" - "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" - "360200200220046a210141e89dc000210002400240034020012000280200" - "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" - "c0002100034002402003200028020022014f04402003200120002802046a" - "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" - "c000200441286b220036020020022000410172360204200020026a412836" - "020441a0a0c00041808080013602002003200641206b41787141086b2200" - "2000200341106a491b2201411b36020441e89dc000290200210920014110" - "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" - "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" - "02002001411c6a2100034020004107360200200041046a22002006490d00" - "0b20012003460d0720012001280204417e713602042003200120036b2200" - "4101723602042001200036020020004180024f04402003200010320c080b" - "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" - "410376742200714504404180a0c000200020027236020020010c010b2001" - "2802080b2100200120033602082000200336020c2003200136020c200320" - "003602080c070b200020023602002000200028020420046a360204200220" - "054103723602042006410f6a41787141086b2201200220056a22046b2103" - "20014194a0c000280200460d0320014190a0c000280200460d0420012802" - "04220541037141014604402001200541787122001033200020016a220128" - "02042105200020036a21030b20012005417e713602042004200341017236" - "0204200320046a200336020020034180024f04402004200310320c060b20" - "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" - "0376742203714504404180a0c000200120037236020020000c010b200028" - "02080b2103200020043602082003200436020c2004200036020c20042003" - "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" - "00280200220020056a220236020020022001410172360204200020054103" - "72360204200041086a21000c060b4190a0c0002802002100024020012005" - "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" - "2001410372360204200020016a220120012802044101723602040c010b41" - "88a0c00020023602004190a0c000200020056a2203360200200320024101" - "72360204200020016a2002360200200020054103723602040b200041086a" - "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" - "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" - "03200020016b6a41086a220136020020022001410172360204200020036a" - "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" - "00418ca0c000418ca0c00028020020036a22003602002004200041017236" - "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" - "6a220036020020042000410172360204200020046a20003602000b200241" - "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" - "20056b22013602004194a0c0004194a0c000280200220020056a22023602" - "002002200141017236020420002005410372360204200041086a0f0b2000" - "0f0b200141086a0b2701017f200020012800042202360208200020012800" - "003602042000200236020020014108100c0b3b002000450440230041206b" - "22002400200041003602182000410136020c2000419c81c0003602082000" - "4204370210200041086a20011017000b000b7e01017f230041406a220324" - "002003412b36020c200341d098c000360208200320013602142003200036" - "02102003410236021c200341d482c0003602182003420237022420032003" - "41106aad4280808080e000843703382003200341086aad4280808080f000" - "843703302003200341306a360220200341186a20021017000b4101017f23" - "0041206b2202240020024100360210200241013602042002420437020820" - "02412e36021c200220003602182002200241186a36020020022001101700" - "0bf40102027f017e230041106b22022400200241013b010c200220013602" - "0820022000360204230041106b22012400200241046a2200290200210420" - "01200036020c20012004370204230041106b22002400200141046a220128" - "0200220228020c2103024002400240024020022802040e020001020b2003" - "0d0141012102410021030c020b20030d0020022802002202280204210320" - "0228020021020c010b20004180808080783602002000200136020c200128" - "020822012d0008210220012d00091a2000410e20021026000b2000200336" - "020420002002360200200128020822012d0008210220012d00091a200041" - "0f20021026000b0d00200028020041012001100a0b380002402002418080" - "c400460d00200020022001280210110100450d0041010f0b200345044041" - "000f0b200020032004200128020c1100000b900a010a7f02400240024020" - "0028020022052000280208220372044002402003410171450d0020012002" - "6a21060240200028020c2209450440200121040c010b2001210403402004" - "22032006460d02027f200341016a20032c0000220441004e0d001a200341" - "026a20044160490d001a200341036a20044170490d001a200341046a0b22" - "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" - "20042c00001a20072002027f02402007450d00200220074d044020022007" - "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" - "031b21022003200120031b21010b2005450d032000280204210b20024110" - "4f044020022001200141036a417c7122076b22086a220a41037121094100" - "210541002103200120074704402008417c4d044041002106034020032001" - "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" - "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" - "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" - "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" - "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" - "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" - "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" - "09410371210a2009410274210741002104200641044f04402008200741f0" - "07716a210c200821030340200420032802002204417f7341077620044106" - "76724181828408716a20032802042204417f734107762004410676724181" - "828408716a20032802082204417f73410776200441067672418182840871" - "6a200328020c2204417f734107762004410676724181828408716a210420" - "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" - "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" - "200a450d000b2008200941fc01714102746a22042802002203417f734107" - "762003410676724181828408712103200a4101460d022003200428020422" - "03417f734107762003410676724181828408716a2103200a4102460d0220" - "0320042802082203417f734107762003410676724181828408716a21030c" - "020b2002450440410021050c030b20024103712104024020024104490440" - "41002105410021080c010b41002105200121032002410c71220821070340" - "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" - "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" - "200741046b22070d000b0b2004450d02200120086a21030340200520032c" - "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" - "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" - "056a21050b02402005200b490440200b20056b210602400240024020002d" - "00182203410020034103471b220341016b0e020001020b20062103410021" - "060c010b20064101762103200641016a41017621060b200341016a210320" - "00280210210820002802202104200028021c21000340200341016b220345" - "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" - "02200428020c110000044041010f0b410021030340200320064604404100" - "0f0b200341016a2103200020082004280210110100450d000b200341016b" - "2006490f0b200028021c20012002200028022028020c1100000b14002000" - "2802002001200028020428020c1101000b10002001200028020020002802" - "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" - "6b220324002003200136022c20032000360228200341033a002420034220" - "37021c200341003602142003410036020c027f0240024002402002280210" - "220a450440200228020c2200450d012002280208220120004103746a2104" - "200041016b41ffffffff017141016a210720022802002100034020004104" - "6a28020022050440200328022820002802002005200328022c28020c1100" - "000d040b20012802002003410c6a200141046a2802001101000d03200041" - "086a2100200141086a22012004470d000b0c010b20022802142200450d00" - "2000410574210b200041016b41ffffff3f7141016a210720022802082105" - "200228020021000340200041046a28020022010440200328022820002802" - "002001200328022c28020c1100000d030b20032008200a6a220141106a28" - "020036021c20032001411c6a2d00003a00242003200141186a2802003602" - "202001410c6a28020021044100210941002106024002400240200141086a" - "28020041016b0e020002010b200441037420056a220c2802000d01200c28" - "020421040b410121060b200320043602102003200636020c200141046a28" - "02002104024002400240200128020041016b0e020002010b200441037420" - "056a22062802000d01200628020421040b410121090b2003200436021820" - "0320093602142005200141146a2802004103746a22012802002003410c6a" - "200141046a2802001101000d02200041086a2100200b200841206a220847" - "0d000b0b200720022802044f0d012003280228200228020020074103746a" - "22002802002000280204200328022c28020c110000450d010b41010c010b" - "41000b200341306a24000b1900200128021c41a481c000410e2001280220" - "28020c1100000b820302047f017e230041406a2206240041012107024020" - "002d00040d0020002d00052108200028020022052d001441047145044020" - "0528021c418383c000418083c000200841017122081b4102410320081b20" - "0528022028020c1100000d01200528021c20012002200528022028020c11" - "00000d01200528021c41f391c0004102200528022028020c1100000d0120" - "032005200411010021070c010b2008410171450440200528021c418583c0" - "004103200528022028020c1100000d010b200641013a0017200641206a20" - "0541086a290200370300200641286a200541106a29020037030020064130" - "6a200541186a2802003602002006200529021c3702082005290200210920" - "0641e482c000360238200620093703182006200641176a36021020062006" - "41086a220536023420052001200210210d00200541f391c000410210210d" - "002003200641186a20041101000d002006280234418883c0004102200628" - "023828020c11000021070b200041013a0005200020073a0004200641406b" - "240020000bab04010c7f200141016b210e2000280204210a200028020021" - "0b2000280208210c0240034020050d01027f024020022003490d00034020" - "0120036a2105024002400240200220036b220741074d044020022003470d" - "01200221030c050b0240200541036a417c71220620056b22040440410021" - "000340200020056a2d0000410a460d052004200041016a2200470d000b20" - "04200741086b22004d0d010c030b200741086b21000b0340418082840820" - "062802002209418a94a8d000736b2009724180828408200641046a280200" - "2209418a94a8d000736b2009727141808182847871418081828478470d02" - "200641086a2106200441086a220420004d0d000b0c010b41002100034020" - "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" - "030b20042007460440200221030c030b200420056a2106200220046b2003" - "6b21074100210002400340200020066a2d0000410a460d01200720004101" - "6a2200470d000b200221030c030b200020046a21000b200020036a220441" - "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" - "200322040c030b200220034f0d000b0b20022008460d0241012105200821" - "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" - "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" - "200020086b2100200120086a2107200c20063a000020042108200b200720" - "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" - "042102200028020021030240200028020822002d0000450d00200341fc82" - "c0004104200228020c110000450d0041010f0b20002001410a463a000020" - "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" - "200028020022002000411f7522027320026b2000417f73411f762001100a" - "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" - "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" - "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" - "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" - "0041003a00002002450d00000b000b250020002802002d00004504402001" - "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" - "02082204452001280200220520046b20034f724504402001410036020820" - "0141003a000c410021040b20032005490440200128020420046a20022003" - "10371a200041043a00002001200320046a3602080f0b2000420437020020" - "0141003a000c0bac0301017f230041406a22022400024002400240024002" - "40024020002d000041016b0e03010203000b2002200028020436020441b1" - "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" - "0000200041086a41a495c0002900003700002000419c95c0002900003700" - "00200241143602102002200036020c200241143602082002410336022c20" - "02419c91c000360228200242023702342002200241046aad4280808080b0" - "01843703202002200241086aad4280808080c00184370318200220024118" - "6a360230200128021c2001280220200241286a101e210020022802082201" - "450d03200228020c2001100c0c030b20002d000121002002410136022c20" - "0241c88ac000360228200242013702342002200241186aad4280808080f0" - "008437030820022000410274220041f095c0006a28020036021c20022000" - "419897c0006a2802003602182002200241086a360230200128021c200128" - "0220200241286a101e21000c020b20012000280204220028020020002802" - "04101a21000c010b20002802042200280200200120002802042802101101" - "0021000b200241406b240020000f0b000b10002001200028020420002802" - "08101a0b5501037f2000280204210120002d0000220041044d2000410347" - "7145044020012802002100200141046a2802002202280200220304402000" - "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" - "c709010a7f230041206b2208240002400240024002402001280210450440" - "2001417f36021020032003200241036a417c7120026b220a6b4107714100" - "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" - "016b200220036a220541016b22062d0000410a460d001a2006200220096a" - "2207460d01200441026b200541026b22062d0000410a460d001a20062007" - "460d01200441036b200541036b22062d0000410a460d001a20062007460d" - "01200441046b200541046b22062d0000410a460d001a20062007460d0120" - "0441056b200541056b22062d0000410a460d001a20062007460d01200441" - "066b200541066b22062d0000410a460d001a20062007460d01200441076b" - "200541076b22052d0000410a460d001a20052007460d0120044178720b20" - "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" - "0241046b210d2004417f7320026a21060340024020062105200a21042009" - "2207200c4d0d00200441086b210a200541086b2106418082840820022007" - "41086b22096a280200220b418a94a8d000736b200b724180828408200720" - "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" - "8478460d010b0b20032007490d0202400340200320046a450d0120044101" - "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" - "016a21040c040b02402001411c6a2802002204450440410021040c010b20" - "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" - "00202001411c6a41003602000b2003200128021420046b4f044020002001" - "41146a2002200310280c050b200128021820046a2002200310371a200041" - "043a00002001411c6a200320046a3602000c040b230041306b2200240020" - "00410136020c200041c481c0003602082000420137021420002000412f6a" - "ad4280808080a001843703202000200041206a360210200041086a41d091" - "c0001017000b230041306b22002400200020033602042000200936020020" - "00410236020c200041d887c000360208200042023702142000200041046a" - "ad428080808080018437032820002000ad42808080808001843703202000" - "200041206a360210200041086a418485c0001017000b230041306b220024" - "0020002003360204200020073602002000410236020c200041f887c00036" - "0208200042023702142000200041046aad42808080808001843703282000" - "2000ad42808080808001843703202000200041206a360210200041086a41" - "9485c0001017000b20032004490440200841003602182008410136020c20" - "0841888bc00036020820084204370210200841086a41908bc0001017000b" - "02402001411c6a2802002205450d0002400240200128021420056b20044d" - "0440200841086a200141146a20022004102820082d00084104470d012001" - "411c6a28020021050c020b200141186a28020020056a2002200410371a20" - "01411c6a200420056a22053602000c010b200020082903083702000c020b" - "2005450d00200141003a00202001411c6a41003602000b200220046a2105" - "200320046b220220012802144f04402000200141146a2005200210280c01" - "0b200141186a2802002005200210371a200041043a00002001411c6a2002" - "3602000b2001200128021041016a360210200841206a24000b9a0102047f" - "017e230041106b22032400200341086a200028020828020020012002102c" - "20032d000822054104470440200028020421012003290308210720002d00" - "00220241044d20024103477145044020012802002102200141046a280200" - "220428020022060440200220061103000b20042802042204044020022004" - "100c0b2001410c100c0b200020073702000b200341106a24002005410447" - "0be10202057f017e230041106b2202240020024100360204027f20014180" - "014f044020014180104f04402001418080044f044020022001413f714180" - "01723a00072002200141127641f001723a000420022001410676413f7141" - "8001723a000620022001410c76413f71418001723a000541040c030b2002" - "2001413f71418001723a000620022001410c7641e001723a000420022001" - "410676413f71418001723a000541030c020b20022001413f71418001723a" - "00052002200141067641c001723a000441020c010b200220013a00044101" - "0b2101200241086a2000280208280200200241046a2001102c20022d0008" - "22054104470440200028020421012002290308210720002d000022034104" - "4d20034103477145044020012802002103200141046a2802002204280200" - "22060440200320061103000b20042802042204044020032004100c0b2001" - "410c100c0b200020073702000b200241106a240020054104470b0d002000" - "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" - "36020c2001419892c00036020841c89cc0002d0000410347044002402300" - "41206b22022400024002400240024041c89cc0002d000041026b0e020301" - "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" - "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" - "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" - "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" - "41206a24000c020b000b200241003602182002410136020c200241e895c0" - "0036020820024204370210200241086a41b094c0001017000b0b02400240" - "024041d89cc000290300220650044041e09cc00029030021050340200542" - "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" - "5122021b370300200721052002450d000b41d89cc00020063703000b0240" - "024041a09cc000290300200652044041ac9cc0002d000021034101210241" - "ac9cc00041013a0000200120033a00182003450d01200142003702342001" - "4281808080c00037022c200141c893c000360228230041106b2202240020" - "02418888c00036020c2002200141186a360208230041f0006b2200240020" - "00418c88c00036020c2000200241086a3602082000418c88c00036021420" - "002002410c6a3602102000410236021c200041cd81c00036021802402001" - "41286a22012802004504402000410336025c2000418082c0003602582000" - "42033702642000200041106aad4280808080e00084370348200020004108" - "6aad4280808080e000843703400c010b200041306a200141106a29020037" - "0300200041286a200141086a290200370300200020012902003703202000" - "410436025c200041b482c000360258200042043702642000200041106aad" - "4280808080e000843703502000200041086aad4280808080e00084370348" - "2000200041206aad42808080809001843703400b2000200041186aad4280" - "808080f000843703382000200041386a360260200041d8006a41fc93c000" - "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" - "0041306b220024002000412636020c200041c094c0003602082000410136" - "0214200041c88ac0003602102000420137021c2000200041086aad428080" - "8080f000843703282000200041286a360218200041106a418c95c0001017" - "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" - "36021041042102200141043a00182001200141106a360220200141186a41" - "9c88c0002000101e210320012d0018210002402003450440420021054117" - "2000764101710d01200128021c22002802002102200041046a2802002203" - "28020022040440200220041103000b20032802042203044020022003100c" - "0b2000410c100c410421020c010b20004104460d02200129031822074280" - "7e8321052007a721020b20012802102200200028020841016b2203360208" - "2003450440200041003a000c200042003703000b200241ff01714104470d" - "02200141406b24000f0b230041206b220024002000410036021820004101" - "36020c200041b08ac00036020820004204370210200041086a41b88ac000" - "1017000b200141003602382001410136022c2001419093c0003602282001" - "4204370230200141286a419893c0001017000b200120052002ad42ff0183" - "843703102001410236022c200141f891c000360228200142023702342001" - "200141106aad4280808080d001843703202001200141086aad4280808080" - "f000843703182001200141186a360230200141286a418892c0001017000b" - "0c00200020012902003703000bba0201047f411f21022000420037021020" - "0141ffffff074d04402001410620014108766722036b7641017120034101" - "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" - "20027422034184a0c0002802007145044020042000360200200020043602" - "182000200036020c200020003602084184a0c0004184a0c0002802002003" - "723602000f0b024002402001200428020022032802044178714604402003" - "21020c010b2001411920024101766b41002002411f471b74210503402003" - "2005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c" - "20022000360208200041003602182000200236020c200020013602080f0b" - "20042000360200200020033602182000200036020c200020003602080bf1" - "0201047f200028020c21020240024020014180024f044020002802182103" - "0240024020002002460440200041144110200028021422021b6a28020022" - "010d01410021020c020b20002802082201200236020c200220013602080c" - "010b200041146a200041106a20021b21040340200421052001220241146a" - "200241106a200228021422011b210420024114411020011b6a2802002201" - "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" - "006a220128020047044020034110411420032802102000461b6a20023602" - "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" - "280200417e200028021c77713602000c020b200028020822002002470440" - "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" - "7e200141037677713602000f0b2002200336021820002802102201044020" - "022001360210200120023602180b20002802142200450d00200220003602" - "14200020023602180b0b8f0101027f230041306b22012400024020004100" - "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" - "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" - "14200141d89ac0003602102001420137021c2001411036022c2001200141" - "286a36021820012001410c6a360228200141106a1030200128020c200141" - "306a24000bcf0101067f23004180016b2204240020012802042107200128" - "020021062000280200210020012802142205210202402005410471450d00" - "2005410872210220060d0020014281808080a0013702000b200120024104" - "7236021441810121020340200220046a41026b2000410f71220341307220" - "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" - "762100450d000b20014101419183c0004102200220046a41016b41810120" - "026b10092001200536021420012007360204200120063602002004418001" - "6a24000b6301017f230041306b220224002002200036020c200241023602" - "14200241f49ac0003602102002420137021c2002411036022c2002200241" - "286a36021820022002410c6a360228200241106a10302001044020022802" - "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" - "21030c010b02402000410020006b41037122066a220520004d0d00200021" - "032001210420060440200621070340200320042d00003a0000200441016a" - "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" - "0340200320042d00003a0000200341016a200441016a2d00003a00002003" - "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" - "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" - "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" - "003a0000200441086a2104200341086a22032005470d000b0b2005200220" - "066b2207417c7122086a21030240200120066a2204410371450440200320" - "054d0d0120042101034020052001280200360200200141046a2101200541" - "046a22052003490d000b0c010b200320054d0d0020044103742202411871" - "21062004417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220067620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20074103712102200420086a21010b" - "02402003200220036a22064f0d002002410771220404400340200320012d" - "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" - "200241016b4107490d000340200320012d00003a0000200341016a200141" - "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" - "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" - "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" - "41076a200141076a2d00003a0000200141086a2101200341086a22032006" - "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" - "420022022001422088420a7e7c22014220867c2204370300200020032004" - "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" - "c0000ba40611000000140000000400000012000000000000000100000001" - "00000013000000557466384572726f7276616c69645f75705f746f657272" - "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" - "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" - "003d0000005c0010000a0000001600000037000000636170616369747920" - "6f766572666c6f770000008800100011000000426f72726f774d75744572" - "726f72616c726561647920626f72726f7765643a20b2001000120000005b" - "3d3d617373657274696f6e20606c6566742020726967687460206661696c" - "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" - "00100017000000f60010000900000020726967687460206661696c65643a" - "200a20206c6566743a20000000cf00100010000000180110001000000028" - "01100009000000f6001000090000000100000000000000f3081000020000" - "00000000000c000000040000001400000015000000160000002020202020" - "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230" - "323132323233323432353236323732383239333033313332333333343335" - "333633373338333934303431343234333434343534363437343834393530" - "353135323533353435353536353735383539363036313632363336343635" - "363636373638363937303731373237333734373537363737373837393830" - "383138323833383438353836383738383839393039313932393339343935" - "393639373938393966616c7365747275656c6962726172792f636f72652f" - "7372632f736c6963652f6d656d6368722e72736402100020000000850000" - "001e0000006402100020000000a100000009000000010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010100" - "41e686c0000b330202020202020202020202020202020202020202020202" - "020202020202020303030303030303030303030303030304040404040041" - "a487c0000b6172616e676520737461727420696e64657820206f7574206f" - "662072616e676520666f7220736c696365206f66206c656e67746820a403" - "100012000000b60310002200000072616e676520656e6420696e64657820" - "e803100010000000b60310002200419088c0000b8f140400000004000000" - "17000000180000000c00000004000000190000001a0000001b0000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" - "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" - "61746520756e69717565207468726561642049443a206269747370616365" - "20657868617573746564f904100037000000dc0410001d000000ae040000" - "0d00000001000000000000006c6962726172792f7374642f7372632f696f" - "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e00007d05100009000000500510002d000000160100002900" - "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" - "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" - "696f6e207265736574686f737420756e726561636861626c656e6574776f" - "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" - "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" - "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c7265616479206578" - "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" - "206469726563746f727969732061206469726563746f7279646972656374" - "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c657379737465" - "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" - "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" - "2066696c652068616e646c65696e76616c696420696e7075742070617261" - "6d65746572696e76616c6964206461746174696d6564206f757477726974" - "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" - "756e7365656b61626c652066696c6571756f746120657863656564656466" - "696c6520746f6f206c617267657265736f75726365206275737965786563" - "757461626c652066696c652062757379646561646c6f636b63726f73732d" - "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" - "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" - "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" - "70746564756e737570706f72746564756e657870656374656420656e6420" - "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" - "736f74686572206572726f72756e63617465676f72697a6564206572726f" - "7220286f73206572726f72202900000001000000000000008d0810000b00" - "000098081000010000006c6962726172792f7374642f7372632f696f2f73" - "7464696f2e727300b40810001b00000032030000140000006661696c6564" - "207072696e74696e6720746f203a20000000e008100013000000f3081000" - "02000000b40810001b00000063040000090000007374646f75746c696272" - "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" - "696e6720747261697420696d706c656d656e746174696f6e207265747572" - "6e656420616e206572726f72207768656e2074686520756e6465726c7969" - "6e672073747265616d20646964206e6f7400000037091000560000001e09" - "100019000000680700001500000063616e6e6f7420726563757273697665" - "6c792061637175697265206d75746578a8091000200000006c6962726172" - "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" - "72656164732e7273d00910002c00000013000000090000006c6962726172" - "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" - "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" - "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" - "7273660a100026000000220100002d0000006f7065726174696f6e207375" - "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" - "6e206d6179206e6f7420626520706572666f726d65642072656375727369" - "76656c79b00a100038000000100000001100000012000000100000001000" - "000013000000120000000d0000000e000000150000000c0000000b000000" - "15000000150000000f0000000e0000001300000026000000380000001900" - "0000170000000c000000090000000a00000010000000170000000e000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600" - "0000150000000b000000160000000d0000000b0000000b00000013000000" - "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" - "1000250610003306100048061000540610005f0610007406100089061000" - "98061000a6061000b9061000df0610001707100030071000470710005307" - "10005c07100066071000760710008d0710009b071000a9071000b6071000" - "ca071000d2071000ed071000fb0710000b08100021081000360810004108" - "100057081000640810006f0810007a081000000000000100000001000000" - "1300000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" - "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" - "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" - "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" - "6963652e72737b0c10006d000000a1000000190000005061727365496e74" - "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" - "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" - "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" - "100009000000550d1000010000006465616c6c6f636174652000680d1000" - "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" - "46696e6973684166746572000000090d1000320000008000000016000000" - "42616c616e636500090d1000320000009b00000016000000456d70747949" - "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" - "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" - "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" - "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; +extern std::string const allHostFunctionsHex; -static auto const deepRecursionHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; +extern std::string const deepRecursionHex; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index f2f70ee558d..b87c23a4a85 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -16,8 +16,8 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ //============================================================================== -#ifndef RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED -#define RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED + +#pragma once #include #include @@ -90,4 +90,3 @@ class WasmHostFunctionsImpl : public HostFunctions }; } // namespace ripple -#endif // RIPPLE_APP_MISC_WASMHOSTFUNCIMPL_H_INLCUDED From ce31acf0306444d8a1842200be2f47415928db90 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 May 2025 13:48:38 -0400 Subject: [PATCH 016/212] debug comments --- src/xrpld/app/misc/WasmVM.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 8e77bc027b9..6185826826d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -58,19 +58,19 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); - // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() - // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + << ", gasLimit: " << gasLimit << ", funcName: " << funcName; if (!ret.has_value()) { - // std::cout << ", error: " << ret.error() << std::endl; + std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); - // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent - // << std::endl; + std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From fb1311e013a049fa22d538a74201a99f683de49c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 May 2025 14:00:50 -0400 Subject: [PATCH 017/212] uncomment???? --- src/xrpld/app/misc/WasmVM.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 6185826826d..8e77bc027b9 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -58,19 +58,19 @@ runEscrowWasm( std::int64_t const sgas = gasLimit; // vm.getGas(); auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); - std::cout << "runEscrowWasm, mod size: " << wasmCode.size() - << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; if (!ret.has_value()) { - std::cout << ", error: " << ret.error() << std::endl; + // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } std::int64_t const egas = vm.getGas(); std::uint64_t const spent = static_cast(sgas - egas); - std::cout << ", ret: " << ret.value() << ", gas spent: " << spent - << std::endl; + // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // << std::endl; return EscrowResult{static_cast(ret.value()), spent}; } From 1f8aece8cd19b3fb271a5534f1db0fd71c1e31fd Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 29 May 2025 16:36:55 -0400 Subject: [PATCH 018/212] feat: add a `GasUsed` parameter to the metadata (#5456) --- include/xrpl/protocol/TxMeta.h | 34 ++++++--- include/xrpl/protocol/detail/sfields.macro | 1 + src/libxrpl/protocol/TxMeta.cpp | 15 ++-- src/test/app/Escrow_test.cpp | 76 +++++++++++++-------- src/xrpld/app/tx/detail/ApplyContext.h | 7 ++ src/xrpld/app/tx/detail/Escrow.cpp | 2 + src/xrpld/ledger/ApplyViewImpl.h | 7 ++ src/xrpld/ledger/detail/ApplyStateTable.cpp | 8 ++- src/xrpld/ledger/detail/ApplyStateTable.h | 1 + src/xrpld/ledger/detail/ApplyViewImpl.cpp | 3 +- 10 files changed, 109 insertions(+), 45 deletions(-) diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 02fde2ffe53..eb594fcc57f 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -46,10 +46,7 @@ class TxMeta CtorHelper); public: - TxMeta( - uint256 const& transactionID, - std::uint32_t ledger, - std::optional parentBatchId = std::nullopt); + TxMeta(uint256 const& transactionID, std::uint32_t ledger); TxMeta(uint256 const& txID, std::uint32_t ledger, Blob const&); TxMeta(uint256 const& txID, std::uint32_t ledger, std::string const&); TxMeta(uint256 const& txID, std::uint32_t ledger, STObject const&); @@ -136,7 +133,7 @@ class TxMeta void setParentBatchId(uint256 const& parentBatchId) { - mParentBatchId = parentBatchId; + parentBatchId_ = parentBatchId; } uint256 @@ -145,13 +142,33 @@ class TxMeta XRPL_ASSERT( hasParentBatchId(), "ripple::TxMeta::getParentBatchId : non-null batch id"); - return *mParentBatchId; + return *parentBatchId_; } bool hasParentBatchId() const { - return static_cast(mParentBatchId); + return static_cast(parentBatchId_); + } + + void + setGasUsed(std::uint32_t const& gasUsed) + { + gasUsed_ = gasUsed; + } + + std::uint32_t + getGasUsed() const + { + XRPL_ASSERT( + hasGasUsed(), "ripple::TxMeta::getGasUsed : non-null batch id"); + return *gasUsed_; + } + + bool + hasGasUsed() const + { + return static_cast(gasUsed_); } private: @@ -161,7 +178,8 @@ class TxMeta int mResult; std::optional mDelivered; - std::optional mParentBatchId; + std::optional gasUsed_; + std::optional parentBatchId_; STArray mNodes; }; diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index faeff4ebb22..155d0e8663d 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -118,6 +118,7 @@ TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 53) TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 54) TYPED_SFIELD(sfGasPrice, UINT32, 55) TYPED_SFIELD(sfComputationAllowance, UINT32, 56) +TYPED_SFIELD(sfGasUsed, UINT32, 57) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index 2083fc8eaf3..fb703d9435e 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -56,9 +56,10 @@ TxMeta::TxMeta( if (obj.isFieldPresent(sfDeliveredAmount)) setDeliveredAmount(obj.getFieldAmount(sfDeliveredAmount)); - if (obj.isFieldPresent(sfParentBatchID)) setParentBatchId(obj.getFieldH256(sfParentBatchID)); + if (obj.isFieldPresent(sfGasUsed)) + setGasUsed(obj.getFieldU32(sfGasUsed)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) @@ -82,6 +83,9 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) if (obj.isFieldPresent(sfParentBatchID)) setParentBatchId(obj.getFieldH256(sfParentBatchID)); + + if (obj.isFieldPresent(sfGasUsed)) + setGasUsed(obj.getFieldU32(sfGasUsed)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, Blob const& vec) @@ -97,15 +101,11 @@ TxMeta::TxMeta( { } -TxMeta::TxMeta( - uint256 const& transactionID, - std::uint32_t ledger, - std::optional parentBatchId) +TxMeta::TxMeta(uint256 const& transactionID, std::uint32_t ledger) : mTransactionID(transactionID) , mLedger(ledger) , mIndex(static_cast(-1)) , mResult(255) - , mParentBatchId(parentBatchId) , mNodes(sfAffectedNodes) { mNodes.reserve(32); @@ -241,9 +241,10 @@ TxMeta::getAsObject() const metaData.emplace_back(mNodes); if (hasDeliveredAmount()) metaData.setFieldAmount(sfDeliveredAmount, getDeliveredAmount()); - if (hasParentBatchId()) metaData.setFieldH256(sfParentBatchID, getParentBatchId()); + if (hasGasUsed()) + metaData.setFieldU32(sfGasUsed, getGasUsed()); return metaData; } diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c326f8c996e..df505b317b1 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1863,7 +1863,7 @@ struct Escrow_test : public beast::unit_test::suite XRPAmount const txnFees = env.current()->fees().base + 1000; env(finish(carol, alice, 1), fee(txnFees), - comp_allowance(110), + comp_allowance(4), ter(temDISABLED)); env.close(); } @@ -1914,12 +1914,12 @@ struct Escrow_test : public beast::unit_test::suite { // not enough fees - // This function takes 110 gas + // This function takes 4 gas // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 109; + auto const finishFee = env.current()->fees().base + 3; env(finish(carol, alice, seq), fee(finishFee), - comp_allowance(110), + comp_allowance(4), ter(telINSUF_FEE_P)); } @@ -1968,6 +1968,7 @@ struct Escrow_test : public beast::unit_test::suite // unsafe { host_lib::getLedgerSqn() >= 5} // } static auto wasmHex = ledgerSqnHex; + std::uint32_t constexpr allowance = 4; { // basic FinishFunction situation @@ -1990,31 +1991,34 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(carol, XRP(5000))); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); env(finish(alice, alice, seq), fee(txnFees), - comp_allowance(110), + comp_allowance(allowance), ter(tesSUCCESS)); - env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2046,38 +2050,42 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(finish(carol, alice, seq), condition(cb1), fulfillment(fb1), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // no fulfillment provided, function succeeds env(finish(alice, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb2), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(finish(alice, alice, seq), condition(cb1), fulfillment(fb1), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2106,21 +2114,26 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(4), fee(txnFees + 1), ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2148,24 +2161,28 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); env.close(); // finish time has passed, function succeeds, tx succeeds env(finish(carol, alice, seq), - comp_allowance(110), + comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } @@ -2179,7 +2196,6 @@ struct Escrow_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; - // TODO: figure out how to make this a fixture in a separate file static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); @@ -2218,7 +2234,8 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - auto const allowance = 40'000; + // TODO: figure out why this can't be 2412 + auto const allowance = 3'600; // FinishAfter time hasn't passed env(finish(carol, alice, seq), @@ -2232,6 +2249,7 @@ struct Escrow_test : public beast::unit_test::suite comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + env.close(); // destination balance is too high env(finish(carol, alice, seq), @@ -2256,8 +2274,12 @@ struct Escrow_test : public beast::unit_test::suite comp_allowance(allowance), fee(txnFees), ter(tesSUCCESS)); - env.close(); + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 2412); + + env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } } diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 720d0aeea3c..a3bdf9a85a7 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -106,6 +106,13 @@ class ApplyContext view_->deliver(amount); } + /** Sets the gas used in the metadata */ + void + setGasUsed(std::uint32_t const& gasUsed) + { + view_->setGasUsed(gasUsed); + } + /** Discard changes and start fresh. */ void discard(); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 375a77022cf..42e67621e77 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -634,6 +634,8 @@ EscrowFinish::doApply() if (re.has_value()) { auto reValue = re.value().result; + // TODO: better error handling for this conversion + ctx_.setGasUsed(static_cast(re.value().cost)); JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << re.value().cost; if (!reValue) diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index d170cf71ffd..f7e90b9d54c 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -75,6 +75,12 @@ class ApplyViewImpl final : public detail::ApplyViewBase deliver_ = amount; } + void + setGasUsed(std::uint32_t const& gasUsed) + { + gasUsed_ = gasUsed; + } + /** Get the number of modified entries */ std::size_t @@ -93,6 +99,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase private: std::optional deliver_; + std::optional gasUsed_; }; } // namespace ripple diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 2a740093d9e..039088205bd 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -117,6 +117,7 @@ ApplyStateTable::apply( TER ter, std::optional const& deliver, std::optional const& parentBatchId, + std::optional const& gasUsed, bool isDryRun, beast::Journal j) { @@ -127,11 +128,14 @@ ApplyStateTable::apply( std::optional metadata; if (!to.open() || isDryRun) { - TxMeta meta(tx.getTransactionID(), to.seq(), parentBatchId); + TxMeta meta(tx.getTransactionID(), to.seq()); if (deliver) meta.setDeliveredAmount(*deliver); - + if (parentBatchId) + meta.setParentBatchId(*parentBatchId); + if (gasUsed) + meta.setGasUsed(*gasUsed); Mods newMod; for (auto& item : items_) { diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index 5a2e0bcf545..896705042fd 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -73,6 +73,7 @@ class ApplyStateTable TER ter, std::optional const& deliver, std::optional const& parentBatchId, + std::optional const& gasUsed, bool isDryRun, beast::Journal j); diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index 3fd9478b542..a90fc3fcbbc 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -35,7 +35,8 @@ ApplyViewImpl::apply( bool isDryRun, beast::Journal j) { - return items_.apply(to, tx, ter, deliver_, parentBatchId, isDryRun, j); + return items_.apply( + to, tx, ter, deliver_, parentBatchId, gasUsed_, isDryRun, j); } std::size_t From 6a6fed5dcef436a05a2d5998e371328bff45fde2 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 30 May 2025 19:01:27 -0400 Subject: [PATCH 019/212] More hostfunctions (#5451) * Bug fixes: - Fix bugs found during schedule table tests - Add more tests - Add parameters passing for runEscrowWasm function * Add new host-functions fix wamr logging add runtime passing through HF fix runEscrowWasm interface * Improve logs * Fix logging bug * Set 4k limit for update_data HF * allHF wasm module fixes --- include/xrpl/protocol/Protocol.h | 4 + src/test/app/Escrow_test.cpp | 5 +- src/test/app/Wasm_test.cpp | 698 +- src/test/app/wasm_fixtures/fixtures.cpp | 11744 +++++++++++++++++-- src/test/app/wasm_fixtures/fixtures.h | 26 + src/xrpld/app/misc/WamrVM.cpp | 452 +- src/xrpld/app/misc/WamrVM.h | 153 +- src/xrpld/app/misc/WasmHostFunc.h | 224 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 533 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 111 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 767 +- src/xrpld/app/misc/WasmHostFuncWrapper.h | 155 +- src/xrpld/app/misc/WasmParamsHelper.h | 269 + src/xrpld/app/misc/WasmVM.cpp | 147 +- src/xrpld/app/misc/WasmVM.h | 313 +- src/xrpld/app/tx/detail/Escrow.cpp | 3 +- 16 files changed, 13691 insertions(+), 1913 deletions(-) create mode 100644 src/xrpld/app/misc/WasmHostFunc.h create mode 100644 src/xrpld/app/misc/WasmParamsHelper.h diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 898fd06fbd2..ab95017db12 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -126,6 +126,10 @@ std::uint8_t constexpr vaultStrategyFirstComeFirstServe = 1; * another vault; counted from 0 */ std::uint8_t constexpr maxAssetCheckDepth = 5; +/** The maximum length of a Data field in Escrow object that can be updated by + * Wasm code */ +std::size_t constexpr maxWasmDataLength = 4 * 1024; + /** A ledger index. */ using LedgerIndex = std::uint32_t; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index df505b317b1..52abf61fc6c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2196,6 +2196,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; + // TODO: create wasm module for all host functions static auto wasmHex = allHostFunctionsHex; // let sender = get_tx_account_id(); // let owner = get_current_escrow_account_id(); @@ -2277,7 +2278,7 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 2412); + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 487); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2303,6 +2304,8 @@ struct Escrow_test : public beast::unit_test::suite testCreateFinishFunctionPreflight(); testFinishWasmFailures(); testFinishFunction(); + + // TODO: Update module with new host functions testAllHostFunctions(); } }; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 16e7f67d991..3156a98a864 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -20,18 +20,20 @@ #include #include +#include #include #include -#include +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif namespace ripple { namespace test { -/* Host function body definition. */ using Add_proto = int32_t(int32_t, int32_t); -wasm_trap_t* +static wasm_trap_t* Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { int32_t Val1 = params->data[0].of.i32; @@ -41,15 +43,497 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } +struct TestLedgerDataProvider +{ + jtx::Env* env; + +public: + TestLedgerDataProvider(jtx::Env* env_) : env(env_) + { + } + + int32_t + get_ledger_sqn() + { + return (int32_t)env->current()->seq(); + } +}; + +using getLedgerSqn_proto = std::int32_t(); +static wasm_trap_t* +getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) +{ + auto sqn = reinterpret_cast(env)->get_ledger_sqn(); + + results->data[0] = WASM_I32_VAL(sqn); + results->num_elems = 1; + + return nullptr; +} + +struct TestHostFunctionsOld : public HostFunctions +{ + test::jtx::Env* env_; + Bytes accountID_; + Bytes data_; + int clock_drift_ = 0; + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsOld(test::jtx::Env* env, int cd = 0) + : env_(env) + , clock_drift_(cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + accountID_ = Bytes{s.begin(), s.end()}; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } + + int32_t + getLedgerSqn() override + { + return (int32_t)env_->current()->seq(); + } + + int32_t + getParentLedgerTime() override + { + return env_->current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + Expected + getTxField(SField const& fname) override + { + return accountID_; + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + return data_; + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + if (fname.getName() == "Destination" || fname.getName() == "Account") + return accountID_; + else if (fname.getName() == "Data") + return data_; + else if (fname.getName() == "FinishAfter") + { + auto t = + env_->current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); + } +}; + +struct TestHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + AccountID accountID_; + Bytes data_; + int clock_drift_ = 0; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctions(test::jtx::Env& env, int cd = 0) + : env_(env), clock_drift_(cd) + { + auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + if (opt) + accountID_ = *opt; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + int32_t + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + int32_t + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + virtual int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override + { + return 1; + } + + Expected + getTxField(SField const& fname) override + { + if (fname == sfAccount) + return Bytes(accountID_.begin(), accountID_.end()); + else if (fname == sfFee) + { + int64_t x = 235; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfSequence) + { + int32_t x = getLedgerSqn(); + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return Bytes(); + } + + Expected + getTxNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + // auto const& sn = fname.getName(); + if (fname == sfBalance) + { + int64_t x = 10'000; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return data_; + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); + } + + int32_t + getTxArrayLen(SField const& fname) override + { + return 32; + } + + int32_t + getTxNestedArrayLen(Slice const& locator) override + { + return 32; + } + + int32_t + updateData(Bytes const& data) override + { + return 0; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + int32_t + traceNum(std::string const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + struct Wasm_test : public beast::unit_test::suite { void - testWasmtimeLib() + testWasmFib() + { + testcase("Wasm fibo"); + + auto const ws = boost::algorithm::unhex(fib32Hex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "fib", wasmParams(10)); + + BEAST_EXPECT(r.has_value() && (r->result == 55)); + } + + void + testWasmSha() + { + testcase("Wasm sha"); + + auto const ws = boost::algorithm::unhex(sha512PureHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = + engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); + + BEAST_EXPECT(r.has_value() && (r->result == 34432)); + } + + void + testWasmB58() + { + testcase("Wasm base58"); + auto const ws = boost::algorithm::unhex(b58Hex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + Bytes outb; + outb.resize(1024); + + auto const minsz = std::min( + static_cast(512), + static_cast(b58Hex.size())); + auto const s = std::string_view(b58Hex.c_str(), minsz); + auto const r = engine.run(wasm, "b58enco", wasmParams(outb, s)); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmSP1Verifier() + { + testcase("Wasm sp1 zkproof verifier"); + auto const ws = boost::algorithm::unhex(sp1_wasm); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "sp1_groth16_verifier"); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmBG16Verifier() + { + testcase("Wasm BG16 zkproof verifier"); + auto const ws = boost::algorithm::unhex(zkProofHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const r = engine.run(wasm, "bellman_groth16_test"); + + BEAST_EXPECT(r.has_value() && r->result); + } + + void + testWasmLedgerSqn() + { + testcase("Wasm get ledger sequence"); + + auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider ledgerDataProvider(&env); + std::string const funcName("finish"); + + std::vector imports; + WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + + auto r = engine.run( + wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + if (BEAST_EXPECT(r.has_value())) + BEAST_EXPECT(!r->result); + env.close(); + env.close(); + env.close(); + env.close(); + + // empty module - run the same module + r = engine.run( + {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); + if (BEAST_EXPECT(r.has_value())) + BEAST_EXPECT(r->result); + } + + void + testWasmCheckJson() + { + testcase("Wasm check json"); + + using namespace test::jtx; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(checkJsonHex); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("check_accountID"); + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; + Bytes data(str.begin(), str.end()); + auto re = runEscrowWasm( + wasm, funcName, wasmParams(data), nullptr, -1, env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value().result); + } + { + std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; + Bytes data(str.begin(), str.end()); + auto re = runEscrowWasm( + wasm, funcName, wasmParams(data), nullptr, -1, env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value().result); + } + } + + void + testWasmCompareJson() + { + testcase("Wasm compare json"); + + using namespace test::jtx; + Env env{*this}; + + auto wasmStr = boost::algorithm::unhex(compareJsonHex); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("compare_accountID"); + + std::vector const tx_data(tx_js.begin(), tx_js.end()); + std::vector const lo_data(lo_js.begin(), lo_js.end()); + auto re = runEscrowWasm( + wasm, + funcName, + wasmParams(tx_data, lo_data), + nullptr, + -1, + env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re.value().result); + + std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); + re = runEscrowWasm( + wasm, + funcName, + wasmParams(tx_data, lo_data2), + nullptr, + -1, + env.journal); + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re.value().result); + } + + void + testWasmLib() { testcase("wasmtime lib test"); // clang-format off /* The WASM module buffer. */ - wbytes const wasm = {/* WASM header */ + Bytes const wasm = {/* WASM header */ 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, /* Type section */ 0x01, 0x07, 0x01, @@ -82,11 +566,11 @@ struct Wasm_test : public beast::unit_test::suite WasmImpFunc( imports, "func-add", reinterpret_cast(&Add)); - auto res = vm.run(wasm, "addTwo", imports, wasmParams(1234, 5678)); + auto res = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(res.has_value() && res.value() == 6912); + BEAST_EXPECT(res.has_value() && res->result == 6912); } void @@ -94,12 +578,15 @@ struct Wasm_test : public beast::unit_test::suite { testcase("bad wasm test"); + using namespace test::jtx; + Env env{*this}; + HostFunctions hfs; auto wasmHex = "00000000"; auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, &hfs, 15); + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); BEAST_EXPECT(re.error()); } @@ -107,9 +594,9 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN1() { testcase("escrow wasm devnet 1 test"); - auto wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsHex; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); // let sender = get_tx_account_id(); @@ -125,98 +612,11 @@ struct Wasm_test : public beast::unit_test::suite // pl_time >= e_time using namespace test::jtx; - struct TestHostFunctions : public HostFunctions - { - Env* env_; - Bytes accountID_; - Bytes data_; - int clock_drift_ = 0; - test::StreamSink sink_; - beast::Journal jlog_; - - public: - explicit TestHostFunctions(Env* env, int cd = 0) - : env_(env) - , clock_drift_(cd) - , sink_(beast::severities::kTrace) - , jlog_(sink_) - { - std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID_ = Bytes{s.begin(), s.end()}; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } - - int32_t - getLedgerSqn() override - { - return (int32_t)env_->current()->seq(); - } - - int32_t - getParentLedgerTime() override - { - return env_->current() - ->parentCloseTime() - .time_since_epoch() - .count() + - clock_drift_; - } - - std::optional - getTxField(std::string const& fname) override - { - return accountID_; - } - - std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) override - { - return data_; - } - - std::optional - getCurrentLedgerEntryField(std::string const& fname) override - { - if (fname == "Destination" || fname == "Account") - return accountID_; - else if (fname == "Data") - return data_; - else if (fname == "FinishAfter") - { - auto t = env_->current() - ->parentCloseTime() - .time_since_epoch() - .count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return std::nullopt; - } - }; - Env env{*this}; - { - TestHostFunctions nfs(&env, 0); + TestHostFunctions nfs(env, 0); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re.value().result); @@ -231,9 +631,9 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(&env, -1); + TestHostFunctions nfs(env, -1); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(!re.value().result); @@ -248,18 +648,18 @@ struct Wasm_test : public beast::unit_test::suite { // fail because trying to access nonexistent field struct BadTestHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - std::optional - getTxField(std::string const& fname) override + Expected + getTxField(SField const& fname) override { - return std::nullopt; + return Unexpected(-1); } }; - BadTestHostFunctions nfs(&env); + BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); BEAST_EXPECT(re.error()); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; @@ -268,18 +668,18 @@ struct Wasm_test : public beast::unit_test::suite { // fail because trying to allocate more than MAX_PAGES memory struct BadTestHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env* env) : TestHostFunctions(env) + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - std::optional - getTxField(std::string const& fname) override + Expected + getTxField(SField const& fname) override { return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); } }; - BadTestHostFunctions nfs(&env); + BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); BEAST_EXPECT(!re); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; @@ -290,9 +690,9 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctions nfs(&env); + TestHostFunctionsOld nfs(&env); std::string funcName("recursive"); - auto re = runEscrowWasm(wasm, funcName, &nfs, 1000'000'000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); BEAST_EXPECT(re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -317,7 +717,56 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT( countSubstr( sink.messages().str(), - "WAMR trap: Exception: wasm operand stack overflow") == 1); + "WAMR Exception: wasm operand stack overflow") == 1); + } + } + + void + testEscrowWasmDN2() + { + testcase("wasm devnet 3 test"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = xrplStdExampleHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(env, 0); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; + } + } + + env.close(); + env.close(); + env.close(); + env.close(); + env.close(); + + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions nfs(env, 0); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + // std::cout << "good case result " << re.value().result + // << " cost: " << re.value().cost << std::endl; + } } } @@ -325,9 +774,24 @@ struct Wasm_test : public beast::unit_test::suite run() override { using namespace test::jtx; - testWasmtimeLib(); + + testWasmLib(); testBadWasm(); - testEscrowWasmDN1(); + testWasmCheckJson(); + testWasmCompareJson(); + testWasmLedgerSqn(); + + testWasmFib(); + testWasmSha(); + testWasmB58(); + + // runing too long + // testWasmSP1Verifier(); + // testWasmBG16Verifier(); + + // TODO: needs fix for new host functions interface + // testEscrowWasmDN1(); + testEscrowWasmDN2(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 1ed246f2529..7dbc4fdc2ff 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -21,6 +21,10781 @@ #include +extern std::string const tx_js = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Fee" : "10", + "Flags" : 2147483648, + "OfferSequence" : 2, + "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Sequence" : 3, + "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", + "TransactionType" : "EscrowFinish", + "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", + "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" + })"; +extern std::string const lo_js = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode" : "0", + "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + +extern std::string const lo_js2 = R"({ + "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", + "Amount" : "100000", + "CancelAfter" : 790297421, + "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", + "DestinationNode" : "0", + "FinishAfter" : 790297403, + "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", + "Flags" : 0, + "LedgerEntryType" : "Escrow", + "OwnerNode": "0", + "PreviousTxnID": "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", + "PreviousTxnLgrSeq" : 4, + "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" + })"; + +extern std::string const fib32Hex = + "0061736d0100000001090260000060017f017f0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017f200045044041000f0b2000410348044041010f0b200041026a2100" + "0340200041036b100120016a2101200041026b220041044a0d000b200141" + "016a0b"; + +extern std::string const fib64Hex = + "0061736d0100000001090260000060017e017e0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017e200050044042000f0b2000420353044042010f0b200042027c2100" + "0340200042037d100120017c2101200042027d22004204550d000b200142" + "017c0b00490f7461726765745f6665617475726573042b0f6d757461626c" + "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e6365" + "2d74797065732b0a6d756c746976616c7565"; + +extern std::string const b58Hex = + "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" + "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" + "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" + "617465000106655f6461746103000a6465616c6c6f636174650002076235" + "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" + "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" + "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" + "200220066a2d00000d012003200641016a2206470d000b200321060b2003" + "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" + "480d00200741016a220a410771210541002104200741074f0440200a41f8" + "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" + "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" + "200541016b22050d000b0b200320064a0440200621052007210403402002" + "20056a2d0000210802402004220a20074e0440200721042008450d010b20" + "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" + "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" + "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" + "200741016a22022103410021040240200c4100480d000340200420096a2d" + "00000d012002200441016a2204470d000b200221040b2001200320066a20" + "046b4a047f02402006450d002006410771210841002105200641084f0440" + "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" + "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" + "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" + "0420076a410171047f200405200020066a200420096a2d00004180086a2d" + "00003a0000200641016a2106200441016a0b210520042007460d00200520" + "096a2101200720056b2102200020066a2103417f21040340200320046a22" + "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" + "026a200541026a2d00004180086a2d00003a00002002200441026a220447" + "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" + "41000b0b0b4101004180080b3a3132333435363738394142434445464748" + "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" + "707172737475767778797a00490f7461726765745f666561747572657304" + "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const sha512PureHex = + "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" + "05040001020305030100020607017f0041800d0b075006066d656d6f7279" + "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" + "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" + "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" + "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" + "06211620014180016d41016bac210b41808d02290300210c41888d022903" + "00210d41908d02290300210e41988d02290300210f41a08d022903002110" + "41a88d02290300211141b08d02290300211241b88d022903002113034041" + "002101200c21092013210a201221082011210520102103200f2115200e21" + "06200d2102034020022107200120166a200020016a290000220242388620" + "024280fe0383422886842002428080fc0783421886200242808080f80f83" + "4208868484200242088842808080f80f832002421888428080fc07838420" + "024228884280fe03832002423888848484220237030020014180086a2903" + "00200a200322044232892004422e89852004421789857c2008220a200442" + "7f858320052208200483847c7c20027c2203200922024224892002421e89" + "85200242198985200220072006221485832006200783857c7c2109200320" + "157c2103200421052006211520072106200141086a2201418001470d000b" + "200020016a21004180092117411e210103402002210620162001410e6b41" + "0f714103746a221820182903002016200141056b410f714103746a290300" + "20162001410d6b410f714103746a2903002202423f892002423889852002" + "420788857c7c20162001410f714103746a2903002202422d892002420389" + "852002420688857c22023703002017290300200a20032205423289200542" + "2e89852005421789857c2005427f852008832004200583847c7c20027c22" + "03200922024224892002421e898520024219898520022006200785832006" + "200783857c7c2109200320147c2103201741086a21172008210a20042108" + "200521042007211420062107200141016a220141de00470d000b41b88d02" + "200a20137c221337030041b08d02200820127c221237030041a88d022004" + "20117c221137030041a08d02200320107c221037030041988d02200f2014" + "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" + "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" + "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" + "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" + "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" + "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" + "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" + "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" + "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" + "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" + "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" + "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" + "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" + "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" + "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" + "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" + "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" + "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" + "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" + "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" + "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" + "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" + "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" + "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" + "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" + "7065732b0a6d756c746976616c7565"; + +extern std::string const checkJsonHex = + "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" + "00030c0b01010200000000000003000405017001030305030100110619037f0141" + "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" + "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" + "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" + "200010012200450d0120000f0b230041206b220024002000410036021820004101" + "36020c200041b480c00036020820004204370210200041086a41d080c000100500" + "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" + "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" + "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" + "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" + "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" + "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" + "0245044041002100410021010c040b4100210020054100411920074101766b2007" + "411f461b7421044100210103400240200228020441787122062005490d00200620" + "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" + "021422062000200620022004411d764104716a41106a2802002202471b20002006" + "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" + "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" + "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" + "000b20012000410372360204200020016a220020002802044101723602040c060b" + "024041022000742203410020036b72200120007471682206410374220041a483c0" + "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" + "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" + "360204200120056a2206200020056b2204410172360204200020016a2004360200" + "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" + "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" + "200220057236020020000c010b20002802080b2102200020033602082002200336" + "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" + "043602000c050b200068410274419482c0006a280200220128020441787120056b" + "2103200121020240034002400240200128021022000d00200128021422000d0020" + "022802182107024002402002200228020c22004604402002411441102002280214" + "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" + "013602080c010b200241146a200241106a20001b21040340200421062001220041" + "146a200041106a200028021422011b210420004114411020011b6a28020022010d" + "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" + "28020047044020074110411420072802102002461b6a20003602002000450d040c" + "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" + "77713602000c030b200028020441787120056b22012003200120034922011b2103" + "2000200220011b2102200021010c010b0b20002007360218200228021022010440" + "20002001360210200120003602180b20022802142201450d002000200136021420" + "0120003602180b02400240200341104f044020022005410372360204200220056a" + "22062003410172360204200320066a200336020041b485c0002802002204450d01" + "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" + "2205410120044103767422047145044041ac85c000200420057236020020000c01" + "0b20002802080b2104200020013602082004200136020c2001200036020c200120" + "043602080c010b2002200320056a2200410372360204200020026a220020002802" + "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" + "41086a0f0b20002001724504404100210141022007742200410020006b72200871" + "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" + "20012000280204417871220420056b220620034922071b21082000280210220245" + "0440200028021421020b20012008200420054922001b210120032006200320071b" + "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" + "200020056b4f710d0020012802182107024002402001200128020c220046044020" + "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" + "2202200036020c200020023602080c010b200141146a200141106a20001b210403" + "40200421062002220041146a200041106a200028021422021b2104200041144110" + "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" + "28021c410274419482c0006a220228020047044020074110411420072802102001" + "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" + "b085c000280200417e200128021c77713602000c010b2000200736021820012802" + "102202044020002002360210200220003602180b20012802142202450d00200020" + "02360214200220003602180b0240200341104f0440200120054103723602042001" + "20056a22022003410172360204200220036a200336020020034180024f04402002" + "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" + "410120034103767422037145044041ac85c000200320047236020020000c010b20" + "002802080b2103200020023602082003200236020c2002200036020c2002200336" + "02080c010b2001200320056a2200410372360204200020016a2200200028020441" + "01723602040b0c010b024002400240024002400240200541b485c0002802002201" + "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" + "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" + "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" + "02002201200020002001491b3602000240024041c085c000280200220304404194" + "83c0002100034020002802002201200028020422066a2002460d02200028020822" + "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" + "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" + "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" + "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" + "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" + "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" + "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" + "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" + "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" + "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" + "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" + "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" + "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" + "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" + "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" + "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" + "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" + "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" + "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" + "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" + "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" + "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" + "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" + "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" + "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" + "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" + "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" + "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" + "85c000200441286b220036020020022000410172360204200020026a4128360204" + "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" + "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" + "20046a2101419483c0002100024002400340200120002802002206470440200028" + "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" + "0028020022014f04402003200120002802046a2206490d010b200028020821000c" + "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" + "0172360204200020026a412836020441cc85c00041808080013602002003200641" + "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" + "002109200141106a419c83c00029020037020020012009370208419883c0002004" + "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" + "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" + "012003460d0720012001280204417e713602042003200120036b22004101723602" + "042001200036020020004180024f04402003200010070c080b200041f8017141a4" + "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" + "ac85c000200020027236020020010c010b20012802080b21002001200336020820" + "00200336020c2003200136020c200320003602080c070b20002002360200200020" + "0028020420046a360204200220054103723602042006410f6a41787141086b2201" + "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" + "460d04200128020422054103714101460440200120054178712200100820002001" + "6a22012802042105200020036a21030b20012005417e7136020420042003410172" + "360204200320046a200336020020034180024f04402004200310070c060b200341" + "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" + "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" + "043602082003200436020c2004200036020c200420033602080c050b41b885c000" + "200020056b220136020041c085c00041c085c000280200220020056a2202360200" + "2002200141017236020420002005410372360204200041086a21000c060b41bc85" + "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" + "85c000410036020020002001410372360204200020016a22012001280204410172" + "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" + "2002410172360204200020016a2002360200200020054103723602040b20004108" + "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" + "71220141086b220236020041b885c00041b885c00028020020046a220320002001" + "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" + "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" + "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" + "0041b485c00041b485c00028020020036a22003602002004200041017236020420" + "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" + "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" + "20056a22023602002002200141017236020420002005410372360204200041086a" + "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" + "402007410020076b41037122026a21062002044020072103418080c00021050340" + "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" + "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" + "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" + "6b411871210820052802002105034020062005200c762004280200220520087472" + "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" + "20022104034020062004280200360200200441046a2104200641046a2206200349" + "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" + "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" + "4122460440200021032007210241002105412221080240034020032d0000220920" + "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" + "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" + "0b000bd20601047f0240200041046b280200220241787122034104410820024103" + "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" + "0041046b280200220341787122006a21020240024020034101710d002003410271" + "450d012001280200220320006a2100200120036b220141bc85c000280200460440" + "20022802044103714103470d0141b485c000200036020020022002280204417e71" + "36020420012000410172360204200220003602000c020b2001200310080b024002" + "4002400240024020022802042203410271450440200241c085c000280200460d02" + "200241bc85c000280200460d0320022003417871220210082001200020026a2200" + "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" + "0020003602000c060b20022003417e713602042001200041017236020420002001" + "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" + "c00028020041016b220036020020000d04419c83c0002802002200044003402001" + "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" + "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" + "003602002001200041017236020441bc85c000280200200146044041b485c00041" + "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" + "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" + "00210103402002200128020022054f04402002200520012802046a490d040b2001" + "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" + "20006a220036020020012000410172360204200020016a20003602000c020b2000" + "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" + "007145044041ac85c000200020037236020020020c010b20022802080b21002002" + "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" + "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" + "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" + "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" + "7f230041206b220224002002410036021020024101360204200242043702082002" + "412e36021c200220003602182002200241186a360200200220011005000ba40201" + "037f230041206b22022400200241106a2203200041106a29020037030020024108" + "6a2204200041086a290200370300200241013b011c200220013602182002200029" + "0200370300230041206b2200240020022802182101200041106a20032902003703" + "00200041086a20042902003703002000200236021c200020013602182000200229" + "020037030041002102230041106b22012400200028020c21030240024002400240" + "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" + "2802042102200328020021030c010b20014180808080783602002001200036020c" + "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" + "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" + "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" + "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" + "2002410274419482c0006a21044101200274220341b085c0002802007145044020" + "042000360200200020043602182000200036020c2000200036020841b085c00041" + "b085c0002802002003723602000f0b024002402001200428020022032802044178" + "71460440200321020c010b20014100411920024101766b2002411f461b74210503" + "4020032005411d764104716a41106a22042802002202450d022005410174210520" + "02210320022802044178712001470d000b0b20022802082201200036020c200220" + "00360208200041003602182000200236020c200020013602080f0b200420003602" + "00200020033602182000200036020c200020003602080bf10201047f200028020c" + "21020240024020014180024f044020002802182103024002402000200246044020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" + "2201200236020c200220013602080c010b200041146a200041106a20021b210403" + "40200421052001220241146a200241106a200228021422011b2104200241144110" + "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" + "0274419482c0006a220128020047044020034110411420032802102000461b6a20" + "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" + "280200417e200028021c77713602000c020b200028020822002002470440200020" + "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" + "77713602000f0b2002200336021820002802102201044020022001360210200120" + "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" + "017f230041106b22032400419082c000419082c000280200220441016a36020002" + "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" + "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" + "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" + "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" + "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" + "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" + "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" + "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" + "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" + "64006000100029000000a804000009000000617373657274696f6e206661696c65" + "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d62790105727573746325312e38" + "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" + "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" + "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + +extern std::string const compareJsonHex = + "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" + "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" + "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" + "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" + "616004030305060001070808080809040702000000040403030304030500020306" + "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" + "0903020201020200000405000203030402020205100b0303000005030101010104" + "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" + "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" + "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" + "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" + "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" + "360228200320023602242003200136022020034180013a002c2003410036021c20" + "03428080808010370214200341c8006a200341146a108180808000024002400240" + "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" + "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" + "2903483703300240024020032802282202200328022422064f0d00200328022021" + "070340200720026a2d000041776a220141174b0d02410120017441938080047145" + "0d022006200241016a2202470d000b200320063602280b20002003290330370300" + "200041106a2004290300370300200041086a200529030037030020032802142202" + "450d04200328021820021082808080000c040b20032002360228200341086a2007" + "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" + "200328020c21012003280208210641141084808080002202450d01200220063602" + "0c2002411636020020002002360204200041063a00002002200136021020034130" + "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" + "032802142202450d00200328021820021082808080000b200341e0006a24808080" + "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" + "210302400240024002400240024002400240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240200128021422" + "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" + "220841174b0d024101200874419380800471450d022001200441016a2204360214" + "20052004470d000b200521040b200241f0006a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" + "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" + "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" + "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" + "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" + "016a410172210b410821094100210c4101210d0340200628020021030240034020" + "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" + "2001200441016a220436021420052004470d000b200521040c040b024002400240" + "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" + "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" + "4b0d044101200874419380800471450d042001200441016a220436021420052004" + "470d000b200521040b200241386a200320052005200441016a220420052004491b" + "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" + "84808080002207450d1f2007200836020c20074105360200200720043602100c08" + "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" + "c080001a200228024c21042002280248210841141084808080002207450d1e2007" + "200836020c20074107360200200720043602100c070b20022902dc02210e200228" + "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228024421042002280240210841141084808080002207450d1c2007200836020c" + "20074115360200200720043602100c050b200241b0016a20011081808080000240" + "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" + "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" + "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" + "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" + "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" + "000120042007360204200441106a2003290300370300200441036a20052d00003a" + "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" + "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" + "0000200420083602100c180b200628020021030b200241306a2003200520052004" + "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" + "042002280230210841141084808080002207450d172007200836020c2007410236" + "0200200720043602100b200241d8026a109180808000024020022802d802220445" + "0d002009200441186c1082808080000b200128020c210320012802142104200128" + "0210210541062106410121090b200120012d001841016a3a001802400240200420" + "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" + "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" + "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28021421082002280210210541141084808080002204450d1d200441163602000c" + "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" + "41776a220841174b0d024101200874419380800471450d022001200441016a2204" + "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" + "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" + "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" + "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" + "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" + "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" + "210541141084808080002204450d1a200441153602000c040b200241206a200320" + "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" + "0228022421082002280220210541141084808080002204450d1920044116360200" + "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" + "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" + "001a200228021c21082002280218210541141084808080002204450d1620044102" + "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" + "01200220073602b401200220063a00b001024020090d00200241063a0078200220" + "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" + "200241c8016a1092808080000c110b200241086a20032005200520042005200449" + "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" + "1084808080002204450d142004200136020c200441183602002000200436020420" + "0041063a0000200420083602100c130b200141003602082001200441016a360214" + "200241b0016a2006200110938080800020022802b40121080240024020022802b0" + "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" + "948080800020022d00784106460d1320002002290378370300200041106a200241" + "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" + "150b41002101024020044100480d00024020040d0041012101410021050c030b41" + "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" + "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" + "086a220320012008200410df808080003602002002200536027c200241033a0078" + "2002200436028401200041106a200241f8006a41106a290300370300200041086a" + "2003290300370300200020022903783703000c120b2001200441016a3602142002" + "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" + "20024190016a109680808000024020022d00784106460d00200020022903783703" + "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" + "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" + "200020043602040c120b2000200228029801360204200041063a00000c110b0240" + "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" + "14200141bb80c0800041031086808080002204450d02200041063a000020002004" + "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" + "0a490d042002200320052005200441016a220420052004491b1083808080004100" + "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" + "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" + "200241003a007820002002290378370300200041086a200241f8006a41086a2903" + "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" + "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" + "00200020043602040c0e0b20024181023b01782000200229037837030020004108" + "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" + "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" + "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" + "02290378370300200041086a200241f8006a41086a290300370300200041106a20" + "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" + "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" + "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" + "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" + "21070c070b20022802d401220441003602082004200428021441016a3602142002" + "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" + "460d06200241d8026a200720022802b801109880808000024020022802d8022204" + "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" + "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" + "41003602dc01200220053602e002200220083602dc02200220043602d802200241" + "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" + "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" + "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" + "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" + "024020022d00b101450d0020022802d40122044100360208200420042802144101" + "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" + "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" + "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" + "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" + "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" + "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" + "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" + "290300220f370300200220022903b00122103703d802200541106a200e37020020" + "0541086a200f3702002005201037020020024180026a41086a200c290200370300" + "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" + "186a280200360200200220022902b00137038002200220033602a4022002200736" + "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" + "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" + "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" + "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" + "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" + "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" + "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" + "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" + "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" + "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" + "200820041082808080000b200241dc016a109b808080000b41062106410121090b" + "200120012d001841016a3a0018200128020c210302400240024020012802142204" + "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" + "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" + "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" + "21040c050b200241e8006a200320052005200441016a220420052004491b108380" + "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" + "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" + "200441016a220436021420052004470d000b200521040b200241e0006a20032005" + "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" + "28026421082002280260210541141084808080002204450d072004200536020c20" + "044103360200200420083602100c010b200241d8006a200320052005200441016a" + "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" + "280258210541141084808080002204450d062004200536020c2004411636020020" + "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" + "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" + "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" + "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" + "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" + "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" + "80000c010b200241d0006a200320052005200420052004491b1083808080004100" + "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" + "0d042004200136020c2004411836020020002004360204200041063a0000200420" + "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" + "200041063a0000200020043602040c010b20002002290378370300200041106a20" + "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" + "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" + "002202417871220341044108200241037122021b20016a490d0002402002450d00" + "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" + "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" + "0301057f02400240024002400240024020022003490d0041012104410021052003" + "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" + "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" + "418a94a8d000736b20077241808182847871418081828478460d00034020062001" + "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" + "034109490d0103400240024020074108480d004180828408200120076a22064178" + "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" + "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" + "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" + "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" + "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" + "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" + "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" + "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" + "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" + "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" + "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" + "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" + "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" + "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" + "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" + "0041002100410021060c040b4100210020024100411920054101766b2005411f46" + "1b74210741002106034002402001220128020441787122082002490d0020082002" + "6b220820034f0d00200821032001210620080d004100210320012106200121000c" + "060b200128021422082000200820012007411d764104716a41106a280200220147" + "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" + "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" + "0022032802082206460d002006200236020c200220063602080c010b4100200141" + "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" + "0204410172360204200341086a0f0b024002402000200374410220037422004100" + "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" + "0022002802082207460d002007200636020c200620073602080c010b4100200141" + "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" + "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" + "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" + "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" + "d2c08000200621010c010b200628020821010b200620033602082001200336020c" + "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" + "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" + "787120026b2103200621010240024003400240200628021022000d002006280214" + "22000d0020012802182105024002400240200128020c22002001470d0020014114" + "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" + "0036020c200020063602080c010b200141146a200141106a20001b210703402007" + "21082006220041146a200041106a200028021422061b210720004114411020061b" + "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" + "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" + "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" + "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" + "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" + "360218024020012802102206450d0020002006360210200620003602180b200128" + "02142206450d0020002006360214200620003602180b0240024002402003411049" + "0d0020012002410372360204200120026a22022003410172360204200220036a20" + "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" + "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" + "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" + "0b200620003602082007200036020c2000200636020c200020073602080c010b20" + "01200320026a2200410372360204200120006a220020002802044101723602040c" + "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" + "4020002006720d004100210641022005742200410020006b722004712200450d03" + "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" + "280204417871220120026b220820034922051b2104200120024921072008200320" + "051b21080240200028021022010d00200028021421010b2006200420071b210620" + "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" + "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" + "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" + "410021000c020b20062802082201200036020c200020013602080c010b20064114" + "6a200641106a20001b21070340200721082001220041146a200041106a20002802" + "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" + "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" + "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" + "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" + "c080000c010b20002005360218024020062802102201450d002000200136021020" + "0120003602180b20062802142201450d0020002001360214200120003602180b02" + "40024020034110490d0020062002410372360204200620026a2200200341017236" + "0204200020036a200336020002402003418002490d002000200310d7808080000c" + "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" + "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" + "200228020821030b200220003602082003200036020c2000200236020c20002003" + "3602080c010b2006200320026a2200410372360204200620006a22002000280204" + "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" + "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" + "200241af80046a220641107640002203417f4622070d0720034110742201450d07" + "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" + "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" + "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" + "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" + "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" + "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" + "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" + "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" + "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" + "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" + "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" + "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" + "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" + "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" + "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" + "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" + "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" + "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" + "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" + "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" + "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" + "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" + "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" + "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" + "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" + "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" + "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" + "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" + "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" + "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" + "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" + "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" + "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" + "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" + "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" + "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" + "003602f0d2c0800020012000410172360204200120006a41283602044100418080" + "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" + "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" + "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" + "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" + "02402000280200220620034b0d002003200620002802046a2206490d020b200028" + "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" + "800020012000410172360204200120006a412836020441004180808001360284d3" + "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" + "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" + "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" + "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" + "200041046a22002006490d000b20072003460d0720072007280204417e71360204" + "2003200720036b22004101723602042007200036020002402000418002490d0020" + "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" + "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" + "c08000200621000c010b200628020821000b200620033602082000200336020c20" + "03200636020c200320003602080c070b200020013602002000200028020420086a" + "360204200120024103723602042007410f6a41787141786a2206200120026a2200" + "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" + "200628020422024103714101470d0020062002417871220210a880808000200220" + "036a2103200620026a220628020421020b20062002417e71360204200020034101" + "72360204200020036a200336020002402003418002490d002000200310d7808080" + "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" + "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" + "010b200228020821030b200220003602082003200036020c2000200236020c2000" + "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" + "8000220020026a22063602f8d2c080002006200341017236020420002002410372" + "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" + "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" + "410372360204200320006a220020002802044101723602040c010b410020063602" + "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" + "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" + "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" + "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" + "d2c0800020062001410172360204200020036a4128360204410041808080013602" + "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" + "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" + "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" + "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" + "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" + "0020026a22063602f8d2c080002006200341017236020420002002410372360204" + "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" + "02000b200041046a109b808080000c020b20002802042201450d01200028020820" + "011082808080000f0b200041046a10918080800020002802042201450d00200028" + "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" + "80808080002000280214220420002802102205200420054b1b2106200028020c21" + "0702400240024002400340024020020d00410021040c050b20062004460d012000" + "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" + "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" + "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" + "8080002204450d01200441093602000c020b200320072005200610838080800041" + "002d00c0cfc080001a200328020421012003280200210241141084808080002204" + "450d00200441053602000c010b000b2004200236020c200420013602100b200341" + "106a24808080800020040b970202027f027e23808080800041106b220424808080" + "8000024002400240024002400240024002402001280214220520012802104f0d00" + "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" + "020b2002450d02420121060c050b20042001200220034100108880808000200428" + "02000d020c030b200420012002200341001089808080002004280200450d022000" + "2004280204360208200042033703000c040b420021060240420020037d22074200" + "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" + "020b20002004280204360208200042033703000c020b2004290308210342002106" + "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" + "23808080800041106b220524808080800020012001280214220641016a22073602" + "140240024002402007200128021022084f0d00200720086b2109200128020c210a" + "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" + "410a490d00024020060d002005200a20082008200741016a220720082007491b10" + "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" + "808080002207450d072007200c36020c2007410d36020020002007360204200041" + "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" + "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" + "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" + "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" + "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" + "20002001200220032007108b808080000c010b200541086a200128020c20082008" + "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" + "0c21062005280208210c41141084808080002207450d012007200c36020c200741" + "053602002000200736020420004101360200200720063602100b200541106a2480" + "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" + "0620012001280214220741016a220836021402402008200128021022094f0d0041" + "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" + "2001200741026a22083602140b200128020c210a02400240024002400240024002" + "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" + "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" + "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" + "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" + "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" + "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" + "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" + "042007200836020c20074105360200200020073602042000410136020020072001" + "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" + "020421012005280200210841141084808080002207450d032007200836020c2007" + "410d3602002000200736020420004101360200200720013602100c040b20042008" + "6a2207411f7541808080807873200720084100482007200448731b21070b200020" + "01200220032007108b808080000c020b2000200120022003502006108c80808000" + "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" + "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" + "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" + "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" + "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" + "22052480808080002003ba2106024002400240024002400240024020042004411f" + "7522077320076b220741b502490d0003402006440000000000000000610d062004" + "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" + "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" + "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" + "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" + "84808080002204450d022004200136020c2004410e360200200020043602042004" + "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" + "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" + "28020c21072005280208210141141084808080002204450d012004200136020c20" + "04410e36020020002004360204200420073602100b410121040c020b000b200020" + "0620069a20021b390308410021040b20002004360200200541106a248080808000" + "0b840201027f23808080800041106b220524808080800002400240024002402004" + "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" + "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" + "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" + "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" + "1084808080002204450d002004200336020c2004410e3602002000200436020420" + "042001360210410121040c020b000b200044000000000000000044000000000000" + "008020021b390308410021040b20002004360200200541106a2480808080000b95" + "0502067f017e23808080800041306b2203248080808000200128020c2104024002" + "40024002400240024020012802142205200128021022064f0d002001200541016a" + "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" + "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" + "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" + "21072003280218210441141084808080002201450d022001200436020c20014105" + "3602002000200136020820004203370300200120073602100c040b200341086a20" + "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" + "1a200328020c21072003280208210441141084808080002201450d012001200436" + "020c2001410d3602002000200136020820004203370300200120073602100c030b" + "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" + "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" + "01450d012001200436020c2001410d360200200020013602082000420337030020" + "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" + "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" + "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" + "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" + "0b0b200341206a200120022009108e808080000240024020032802200d00200020" + "032b0328390308420021090c010b20002003280224360208420321090b20002009" + "3703000c020b000b20002001200220091087808080000b200341306a2480808080" + "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" + "0641016a2107200520066b2108200128020c20066a210541002104034002402005" + "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" + "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" + "200720046a3602142008200441016a2204470d000b200821040b20002001200220" + "032004108b808080000f0b200020012002200320041088808080000bc80101047f" + "23808080800041206b2202248080808000024002400240200028020c450d002000" + "21010c010b200241106a41086a2203200041086a28020036020020022000290200" + "370310200241086a200128020c2001280210200128021410838080800041002d00" + "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" + "200120022903103702002001200536020c20012004360210200141086a20032802" + "00360200200041141082808080000b200241206a24808080800020010f0b000b59" + "01017f23808080800041106b2201248080808000200141086a2000200028020041" + "014108411810d480808000024020012802082200418180808078460d0020002001" + "28020c109580808000000b200141106a2480808080000b950101027f0240200028" + "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" + "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" + "0041046a28020020021082808080000c010b200010918080800020002802002202" + "450d00200041046a280200200241186c1082808080000b200041186a2100200141" + "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" + "01020b20002802082201450d01200028020420011082808080000c010b20002d00" + "044103470d00200028020822012802002102024020012802042203280200220445" + "0d002002200411808080800080808080000b024020032802042203450d00200220" + "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" + "097f017e23808080800041306b2203248080808000024002400240024002400240" + "0240024002400340024002402001280208220420012802042205460d0002400240" + "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" + "00460d0120074120490d012006200441016a22086a21094100200520086b417871" + "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" + "800020012802042105200128020821070c040b200741086a2107200b41086a2109" + "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" + "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" + "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" + "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" + "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" + "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" + "1084808080002207450d052007200936020c200741043602002000200736020420" + "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" + "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" + "024020094122470d002002280208450d0520072004490d072002200b20046a2007" + "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" + "0204200228020810ca8080800020032802282207450d032000200328022c360208" + "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" + "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" + "450d052007200936020c2007411036020020002007360204200041023602002007" + "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" + "80002001200741016a2209360208024020092005490d00200341206a200b200520" + "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" + "1084808080002207450d06200741043602000c090b2001200741026a2204360208" + "02400240024002400240024002400240024002400240200b20096a2d0000220741" + "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" + "00470d020240200228020822072002280200470d00200210cb808080000b200220" + "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" + "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" + "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" + "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" + "22072002280200470d00200210cb808080000b2002200741016a36020820022802" + "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" + "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" + "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" + "02200741016a360208200228020420076a41083a0000410021070c050b02402002" + "28020822072002280200470d00200210cb808080000b2002200741016a36020820" + "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" + "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" + "0000410021070c030b0240200228020822072002280200470d00200210cb808080" + "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" + "40200228020822072002280200470d00200210cb808080000b2002200741016a36" + "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" + "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" + "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" + "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" + "40024020032802282207450d002000200328022c3602084100210b0c010b410221" + "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" + "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" + "200936020c2007200b3602100b20004102360200200020073602040b200341306a" + "2480808080000b7901027f410021030240024020024100480d00024020020d0041" + "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" + "040d01410121030b20032002109580808000000b20042001200210df8080800021" + "012000200236020c2000200136020820002003360204200041033a00000b100002" + "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" + "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" + "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" + "370308200041023a0000200020012903083703100f0b200041023a000020002001" + "290308220337031020002003423f883703080bb40701077f23808080800041306b" + "22022480808080002001280200220328020c210402400240024002402003280214" + "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" + "174b0d024101200874419380800471450d022003200541016a2205360214200620" + "05470d000b200621050b41012108200241286a200420062006200541016a220520" + "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" + "210341141084808080002205450d022005200336020c2005410336020020002005" + "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" + "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" + "20053602140240200520064f0d00034002400240024002400240200420056a2d00" + "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" + "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" + "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" + "0c21062002280208210341141084808080002205450d092005200336020c200541" + "1136020020002005360204200520063602100c080b200041013a0001410021080c" + "070b41012108200241186a200420062006200541016a220520062005491b108380" + "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" + "80002205450d072005200336020c20054115360200200020053602042005200636" + "02100c060b2003200541016a220536021420062005470d000b200621050b410121" + "08200241106a200420062006200541016a220520062005491b1083808080004100" + "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" + "0d042005200336020c2005410536020020002005360204200520063602100c030b" + "41002108200141003a0004024020074122460d002002200420062006200541016a" + "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" + "280200210641141084808080002205450d042005200636020c2005411136020020" + "002005360204200520083602100c020b200041013a00010c020b200241206a2004" + "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" + "21082002280220210641141084808080002205450d022005200636020c20054108" + "36020020002005360204200520083602100b410121080b200020083a0000200241" + "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" + "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" + "8080800022040d01410121030b20032002109580808000000b20042001200210df" + "8080800021012000200236020820002001360204200020033602000bdc0201067f" + "23808080800041106b22022480808080002001280200220328020c210402400240" + "02400240024020032802142201200341106a28020022054f0d000340200420016a" + "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" + "41016a220136021420052001470d000b200521010b200241086a20042005200520" + "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" + "21072002280208210541141084808080002201450d03200141033602000c010b02" + "402006413a470d002003200141016a360214200020031081808080000c020b2002" + "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" + "001a200228020421072002280200210541141084808080002201450d0220014106" + "3602000b2001200536020c20002001360204200041063a0000200120073602100b" + "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" + "042480808080000240024002400240024002400240024002400240024002400240" + "20012802002205450d002002280208210620022802042107200128020421080240" + "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" + "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" + "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" + "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" + "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" + "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" + "2002290204220fa721092002280200220b418080808078470d03200921050c010b" + "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" + "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" + "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" + "028c02200142808080801037020420012009360200200920032903003703002009" + "41086a200341086a290300370300200941106a200341106a2903003703000c010b" + "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" + "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" + "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" + "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" + "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" + "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" + "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" + "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" + "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" + "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" + "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" + "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" + "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" + "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" + "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" + "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" + "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" + "200420042903880137026020042005360208200420063602782008280200220d41" + "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" + "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" + "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" + "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" + "370300200b2003290300370300200b41086a200341086a290300370300200d200e" + "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" + "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" + "246a200441dc006a41186a28020036020020042010370234200420073602302004" + "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" + "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" + "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" + "210d200b2f019203410b490d02200641016a210602400240024002400240024002" + "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" + "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" + "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" + "36027820044188016a200441f8006a10c18080800020042802b001410520044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" + "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" + "6a200e200910c080808000200428028801210d200441086a2007412410df808080" + "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" + "2105200d418080808078460d032004200d3602302008200441086a412410df8080" + "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" + "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" + "41003b019203200d410036028802200b41003b019003200b200d36028802200120" + "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" + "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" + "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" + "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" + "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" + "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" + "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" + "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" + "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" + "6a200941106a220d290300370300200041086a200941086a220b29030037030020" + "092003290300370300200b200341086a290300370300200d200341106a29030037" + "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" + "80808080004100210241002103024020002802002204450d002001200436021820" + "014100360214200120043602082001410036020420012000280204220336021c20" + "01200336020c20002802082103410121020b200120033602202001200236021020" + "01200236020002400240024003400240024002400240024020030d002001280200" + "450d0820012802082104200128020422030d0141002100200128020c2203450d06" + "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" + "024020024101712203450d0020012802040d0020012802082103200128020c2200" + "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" + "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" + "3702082001200336020441012102200141013602000b2001280208210002402001" + "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" + "20012802242203450d0120012802282100200128022c220520032f019203490d02" + "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" + "2001200436020c20014100360208200120033602040c010b200320044102746a41" + "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" + "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" + "2802002204450d00200028020420041082808080000b0240024002400240200320" + "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" + "20032802042200450d01200328020820001082808080000c010b200341046a1091" + "8080800020032802042200450d002003280208200041186c1082808080000b2001" + "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" + "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" + "03037f017e037f23808080800041f0006b22022480808080004100210302402000" + "2d0000220420012d0000470d00410121030240024002400240024020040e060500" + "01020304050b20002d000120012d00014621030c040b4100210320002903082205" + "2001290308520d030240024002402005a70e03000102000b200029031020012903" + "105121030c050b200029031020012903105121030c040b20002b031020012b0310" + "6121030c030b41002103200028020c2204200128020c470d022000280208200128" + "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" + "0d012001280208210420002802082100200641016a210103402001417f6a220145" + "21032001450d0220002004109c808080002106200441186a2104200041186a2100" + "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" + "6c2002420037026420024100360254200241003602442002410036023020024100" + "36022020022001280208220636025c200220012802042203360258200220063602" + "4c2002200336024820022000280208220636023820022000280204220136023420" + "0220063602282002200136022420022004410020031b3602602002200341004722" + "033602502002200336024020022004410020011b36023c20022001410047220336" + "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" + "80004101210320022802102201450d0120022802142104200241086a2007109d80" + "80800020022802082200450d0141002103200128020822062000280208470d0120" + "0228020c210820012802042000280204200610dc808080000d0120042008109c80" + "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" + "200128022022020d00410021020c010b20012002417f6a36022002400240024020" + "012802004101470d0020012802040d01200128020821030240200128020c220245" + "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" + "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" + "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" + "050c010b03402003280288022205450d03200241016a210220032f019003210420" + "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" + "21060c010b200520034102746a4198036a21030340200328020022064198036a21" + "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" + "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" + "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" + "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" + "001a200010848080800022010d01410121010b20012000109580808000000b2001" + "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" + "108080808000024002400240024020042d00384106460d00200441086a41106a20" + "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" + "29030037030020042004290338370308200441386a200220031080808080002004" + "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" + "0629030037030020042004290338370320200441086a10a0808080002205450d02" + "200441206a10a0808080002206450d0320052006109c808080002105200441206a" + "108580808000200441086a10858080800002402003450d00200220031082808080" + "000b02402001450d00200020011082808080000b200441d0006a24808080800020" + "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" + "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" + "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" + "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" + "004105470d0020002802042202450d002000280208210303402002418c026a2100" + "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" + "0c020b2000280208210120002802042107200641016a2106200541746a21052000" + "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" + "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" + "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" + "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" + "0041c0006b22052480808080002005200136020c20052000360208200520033602" + "14200520023602102005410236021c200541dc82c0800036021820054202370224" + "2005418180808000ad422086200541106aad843703382005418280808000ad4220" + "86200541086aad843703302005200541306a360220200541186a200410a4808080" + "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" + "41206b2200248080808000200041003602182000410136020c200041ac81c08000" + "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" + "23808080800041206b2202248080808000200241106a200041106a290200370300" + "200241086a200041086a290200370300200241013b011c20022001360218200220" + "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" + "6a280200220241787122006a21030240024020024101710d002002410271450d01" + "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" + "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" + "7136020420012000410172360204200320003602000f0b2001200210a880808000" + "0b024002400240024002400240200328020422024102710d00200341002802f8d2" + "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" + "80002001200220006a2200410172360204200120006a2000360200200141002802" + "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" + "2000410172360204200120006a20003602000b2000418002490d022001200010d7" + "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" + "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" + "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" + "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" + "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" + "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" + "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" + "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" + "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" + "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" + "00220241012000410376742200710d00410020022000723602e4d2c08000200321" + "000c010b200328020821000b200320013602082000200136020c2001200336020c" + "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" + "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" + "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" + "0041206b2203248080808000200341003602102003410136020420034204370208" + "2003200136021c200320003602182003200341186a3602002003200210a4808080" + "00000b840601057f0240024002402000417c6a2203280200220441787122054104" + "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" + "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" + "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" + "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" + "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" + "7871220420056a22052001490d042006200410a880808000200520016b22024110" + "490d0120032001200328020041017172410272360200200720016a220120024103" + "72360204200720056a220520052802044101723602042001200210a98080800020" + "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" + "20016a22052002410372360204200620062802044101723602042005200210a980" + "80800020000f0b20032005200328020041017172410272360200200720056a2202" + "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" + "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" + "200720056a2202200228020441017236020441002102410021010c010b20032001" + "200441017172410272360200200720016a22012002410172360204200720056a22" + "05200236020020052005280204417e713602040b410020013602f4d2c080004100" + "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" + "0240200210848080800022050d0041000f0b20052000417c417820032802002201" + "4103711b20014178716a2201200220012002491b10df808080002102200010a580" + "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" + "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" + "410272360200200720016a2202200520016b2205410172360204410020053602f0" + "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" + "4002402001418002490d002000280218210302400240024020022000470d002000" + "41144110200028021422021b6a28020022010d01410021020c020b200028020822" + "01200236020c200220013602080c010b200041146a200041106a20021b21040340" + "200421052001220241146a200241106a200228021422011b210420024114411020" + "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" + "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" + "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" + "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" + "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" + "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d0020022001360214" + "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" + "4101710d002003410271450d012000280200220320016a21010240200020036b22" + "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" + "d2c0800020022002280204417e7136020420002001410172360204200220013602" + "000c020b2000200310a8808080000b024002400240024020022802042203410271" + "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" + "03417871220310a8808080002000200320016a2201410172360204200020016a20" + "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" + "2003417e7136020420002001410172360204200020016a20013602000b02402001" + "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" + "0240024041002802e4d2c08000220341012001410376742201710d004100200320" + "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" + "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" + "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" + "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" + "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" + "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" + "7e23808080800041306b2203248080808000200320003602002003200136020420" + "03410236020c200341c485c08000360208200342023702142003418380808000ad" + "4220862204200341046aad84370328200320042003ad843703202003200341206a" + "360210200341086a200210a480808000000b110020003502004101200110ad8080" + "80000b7902017f017e23808080800041306b220324808080800020032001360204" + "200320003602002003410236020c200341c882c080003602082003420237021420" + "03418380808000ad42208622042003ad8437032820032004200341046aad843703" + "202003200341206a360210200341086a200210a480808000000bec0203027f017e" + "037f23808080800041306b2203248080808000412721040240024020004290ce00" + "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" + "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" + "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" + "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" + "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" + "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" + "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" + "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" + "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" + "23808080800041206b220124808080800020002802182102200141106a20004110" + "6a290200370300200141086a200041086a2902003703002001200036021c200120" + "0236021820012000290200370300200110d880808000000bcb0501077f02400240" + "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" + "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" + "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" + "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" + "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" + "28021422012000280218220920082002200310b080808000450d0041010f0b2001" + "20042005200928020c11818080800080808080000f0b0240024002400240200028" + "0204220120064b0d00200028021422012000280218220920082002200310b08080" + "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" + "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" + "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" + "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" + "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" + "00202000200736021041000f0b200120042005200928020c118180808000808080" + "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" + "020b20072101410021070c010b20074101762101200741016a41017621070b2001" + "41016a210120002802102106200028021821092000280214210a02400340200141" + "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" + "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" + "020c11818080800080808080000d00410021010340024020072001470d00200720" + "07490f0b200141016a2101200a200620092802101182808080008080808000450d" + "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" + "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" + "200020032004200128020c11818080800080808080000b7902017f017e23808080" + "800041306b22032480808080002003200036020020032001360204200341023602" + "0c200341e485c08000360208200342023702142003418380808000ad4220862204" + "200341046aad84370328200320042003ad843703202003200341206a3602102003" + "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" + "200028020022040d002003410171450d010b02402003410171450d00200120026a" + "210502400240200028020c22060d0041002107200121080c010b41002107410021" + "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" + "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" + "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" + "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" + "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" + "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" + "2007200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a02402002" + "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" + "0641002103024020012007460d004100210302402009417c4b0d00410021034100" + "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" + "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" + "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" + "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" + "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" + "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" + "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" + "41002108024020054104490d002004200d41f007716a2109410021082004210303" + "40200328020c2207417f7341077620074106767241818284087120032802082207" + "417f7341077620074106767241818284087120032802042207417f734107762007" + "4106767241818284087120032802002207417f7341077620074106767241818284" + "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" + "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" + "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" + "4107762003410676724181828408712103200c4101460d0220082802042207417f" + "7341077620074106767241818284087120036a2103200c4102460d022008280208" + "2208417f7341077620084106767241818284087120036a21030c020b024020020d" + "00410021060c030b2002410371210802400240200241044f0d0041002106410021" + "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" + "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" + "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" + "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" + "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" + "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" + "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" + "024020002d00200e0402000102020b20052103410021050c010b20054101762103" + "200541016a41017621050b200341016a2103200028021021092000280218210820" + "00280214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c118180" + "80800080808080000f0b0240200720012002200828020c11818080800080808080" + "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" + "016a21032007200920082802101182808080008080808000450d000b2003417f6a" + "2005490b140020012000280200200028020410b2808080000b1c00200028020020" + "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" + "306b2203248080808000200341033a002c2003412036021c410021042003410036" + "02282003200136022420032000360220200341003602142003410036020c024002" + "40024002400240200228021022050d00200228020c2200450d0120022802082101" + "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" + "0240200041046a2802002207450d00200328022020002802002007200328022428" + "020c11818080800080808080000d040b20012802002003410c6a20012802041182" + "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" + "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" + "41016a210420022802082109200228020021004100210603400240200041046a28" + "02002201450d00200328022020002802002001200328022428020c118180808000" + "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" + "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" + "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" + "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" + "02102003200b36020c200141046a280200210702400240024020012802000e0301" + "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" + "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" + "2802002003410c6a200128020411828080800080808080000d02200041086a2100" + "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" + "0020044103746a22012802002001280204200328022428020c1181808080008080" + "808000450d010b410121010c010b410021010b200341306a24808080800020010b" + "d70201057f2380808080004180016b220224808080800002400240024002402001" + "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" + "030b41ff00210303402002200322046a22052000410f712203413072200341d700" + "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" + "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" + "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" + "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" + "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" + "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" + "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" + "20024180016a24808080800020000b7902017f017e23808080800041306b220324" + "808080800020032000360200200320013602042003410236020c2003419886c080" + "00360208200342023702142003418380808000ad4220862204200341046aad8437" + "0328200320042003ad843703202003200341206a360210200341086a200210a480" + "808000000b920c01057f23808080800041206b2203248080808000024002400240" + "024002400240024002400240024002400240024002400240024020010e28060101" + "010101010101020401010301010101010101010101010101010101010101010901" + "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" + "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" + "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" + "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" + "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" + "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" + "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" + "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" + "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" + "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" + "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" + "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" + "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" + "00411576210241d70521060240024020044120460d002005280204411576210620" + "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" + "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" + "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" + "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" + "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" + "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" + "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" + "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" + "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" + "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" + "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" + "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" + "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" + "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" + "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" + "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" + "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" + "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" + "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" + "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" + "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" + "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" + "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" + "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" + "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" + "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" + "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" + "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" + "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" + "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" + "41206a2480808080000be90201067f200120024101746a210720004180fe037141" + "0876210841002109200041ff0171210a02400240024002400340200141026a210b" + "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" + "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" + "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" + "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" + "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" + "80808000000b200041ffff03712109200520066a210c410121020340200541016a" + "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" + "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" + "0010a280808000000b200920016b22094100480d01200241017321022005200c47" + "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" + "057f017e23808080800041f0006b22052480808080002005200336020c20052002" + "3602080240024002400240024002400240024002402001418102490d0002402000" + "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" + "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" + "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" + "0214200520003602104105210641a888c0800021070b2005200636021c20052007" + "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" + "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" + "360220200121020240200320014f0d00200341016a220641002003417d6a220220" + "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" + "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" + "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" + "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" + "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" + "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" + "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" + "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" + "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" + "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" + "717221000240200141704f0d0020002006410c747221010c010b20004106742003" + "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" + "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" + "21010c010b41034104200141808004491b21010b20052002360228200520012002" + "6a36022c20054105360234200541b089c080003602302005420537023c20054182" + "80808000ad422086220a200541186aad843703682005200a200541106aad843703" + "602005418480808000ad422086200541286aad843703582005418580808000ad42" + "2086200541246aad843703502005418380808000ad422086200541206aad843703" + "482005200541c8006a360238200541306a200410a480808000000b200520022003" + "20061b36022820054103360234200541f089c080003602302005420337023c2005" + "418280808000ad422086220a200541186aad843703582005200a200541106aad84" + "3703502005418380808000ad422086200541286aad843703482005200541c8006a" + "360238200541306a200410a480808000000b2000200141002006200410ba808080" + "00000b20054104360234200541d088c080003602302005420437023c2005418280" + "808000ad422086220a200541186aad843703602005200a200541106aad84370358" + "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" + "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" + "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" + "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" + "000d00200128021441d881c080004102200128021828020c118180808000808080" + "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" + "0041106b2202248080808000410121030240200128021422044127200128021822" + "05280210220111828080800080808080000d00200241046a200028020041810210" + "b8808080000240024020022d0004418001470d0020042002280208200111828080" + "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" + "20006b200528020c11818080800080808080000d010b2004412720011182808080" + "00808080800021030b200241106a24808080800020030b2701017f200028020022" + "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" + "7f200121032002210402402001280288022205450d00200241016a210320012f01" + "900321040b200141c80341980320021b1082808080002000200536020020002004" + "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" + "02400240200141016a220720002f01920322084d0d002006200229020037020020" + "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" + "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" + "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" + "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" + "41106a290300370300200641086a200341086a29030037030020004198036a2103" + "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" + "746a200820016b41027410de808080001a0b200320074102746a20043602002000" + "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" + "6a2107034020072802002208200141016a22013b01900320082000360288022007" + "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" + "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" + "400240024041c8031084808080002205450d002005410036028802200520012802" + "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" + "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" + "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" + "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" + "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" + "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" + "03200241086a200241286a41086a280200360200200241186a200241386a41086a" + "290300370300200241206a200241c8006a29030037030020022002290328370300" + "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" + "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" + "df80808000210a200128020421014100210602400340200a20064102746a280200" + "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" + "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" + "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" + "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" + "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" + "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" + "00200028020021002002410036022c2002428080808010370224200241033a0050" + "200241203602402002410036024c200241c0a0c080003602482002410036023820" + "0241003602302002200241246a3602440240024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002400240" + "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" + "1314151617180b024002400240024020002d00040e0400010203000b2002200028" + "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" + "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" + "2900e4ccc08000370000200241143602602002200336025c200241143602582002" + "410336026c200241ccccc08000360268200242023702742002418680808000ad42" + "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" + "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" + "8080002103024020022802582204450d00200228025c20041082808080000b2003" + "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" + "013702742002418280808000ad422086200241086aad8437035820022003410274" + "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" + "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" + "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" + "0c190b20002802082203280200200241306a200328020428021011828080800080" + "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" + "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" + "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" + "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" + "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" + "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" + "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" + "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" + "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" + "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" + "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" + "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" + "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" + "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" + "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" + "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" + "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" + "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" + "6a200241246a41086a280200360200200220022902243703582002418380808000" + "36027c2002418380808000360274200241888080800036026c2002410436020c20" + "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" + "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" + "280218200241086a10b5808080002100024020022802582201450d00200228025c" + "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" + "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" + "00280204200028020810b2808080000b4b01017f02402000280200200028020822" + "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" + "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" + "8080800041106b2202248080808000200028020821032000280204210441012105" + "024020012802142206412220012802182207280210220811828080800080808080" + "000d000240024020030d0041002103410021000c010b410021094100210a200421" + "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" + "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" + "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" + "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" + "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" + "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" + "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" + "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" + "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" + "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" + "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" + "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" + "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" + "0d010240024020022d0004418001470d0020062002280208200811828080800080" + "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" + "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" + "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" + "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" + "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" + "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" + "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" + "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" + "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" + "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" + "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" + "200728020c11818080800080808080000d00200641222008118280808000808080" + "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" + "05200128021828020c11818080800080808080000b1e01017f0240200028020022" + "01450d00200028020420011082808080000b0b5301047f02402000280208220120" + "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" + "200441dc00460d0120044120490d012000200141016a220136020820022001470d" + "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" + "0210cf80808000200028020821030b200028020420036a2001200210df80808000" + "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" + "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" + "20026b21074100210503400240024002400240200220056a2d00002208c0220941" + "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" + "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" + "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" + "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" + "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" + "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" + "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" + "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" + "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" + "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" + "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" + "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" + "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" + "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" + "0520042802082108024041141084808080002203450d002003200836020c200341" + "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" + "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" + "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" + "41106a2480808080000b5901017f23808080800041106b22012480808080002001" + "41086a2000200028020041014101410110d4808080000240200128020822004181" + "80808078460d002000200128020c109580808000000b200141106a248080808000" + "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" + "8080000240024020022f01140d0002400240024002400240024020022f01162203" + "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" + "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" + "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" + "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" + "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" + "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" + "2205418080046a210302402001280200200128020822006b41034b0d0020012000" + "410410cf80808000200128020821000b2001200041046a36020820012802042000" + "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" + "002005410676413f71418001723a000220002003410c76413f71418001723a0001" + "410021000c070b200220002802002000280204200028020810838080800041002d" + "00c0cfc080001a200228020421012002280200210341141084808080002200450d" + "042000200336020c20004114360200200020013602100c060b200241086a200028" + "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" + "21012002280208210341141084808080002200450d032000200336020c20004114" + "360200200020013602100c050b200241173602142000200241146a10d080808000" + "21000c040b200241173602142000200241146a10d08080800021000c030b024002" + "4002402003418001490d0002402001280200200128020822046b41034b0d002001" + "2004410410cf80808000200128020821040b200128020420046a21002003418010" + "4f0d0120034106764140722106410221050c020b02402001280208220020012802" + "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" + "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" + "60722106410321050b200020063a00002001200420056a360208200020056a417f" + "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" + "206a24808080800020000b910301057f23808080800041106b2202248080808000" + "02400240024002402001280204220320012802082204490d000240200320046b41" + "034b0d0020012003360208200241086a2001280200200320031083808080004100" + "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" + "0d022001200436020c2001410436020020002001360204200120033602100c030b" + "2001200441046a220536020802402001280200220620046a22012d000141017441" + "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" + "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" + "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" + "001a200228020421032002280200210441141084808080002201450d0220012004" + "36020c2001410c36020020002001360204200120033602100c030b200020013b01" + "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" + "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" + "022480808080000240024002402001280208220320012802042204490d00200241" + "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" + "032002280208210441141084808080002201450d022001200436020c2001410436" + "02002000200136020420012003360210410121010c010b2000200128020020036a" + "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" + "5601017f23808080800041106b2203248080808000200341086a20002001200241" + "01410110d480808000024020032802082202418180808078460d00200220032802" + "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" + "106b2202248080808000200241086a200028020020002802042000280208108380" + "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" + "8080800022000d00000b2000200436020c20002001290200370200200020033602" + "10200041086a200141086a280200360200200241106a24808080800020000b1f00" + "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" + "027f23808080800041106b22022480808080000240024002400240200141800149" + "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" + "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" + "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" + "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" + "413f71418001723a000d410421010c020b0240200028020822032000280200470d" + "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" + "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" + "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" + "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" + "00200320016a3602080b200241106a24808080800041000b820101017f02400240" + "024002402003280204450d000240200328020822040d002002450d0341002d00c0" + "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" + "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" + "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" + "8080800041206b2206248080808000024002400240200220036a220320024f0d00" + "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" + "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" + "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" + "20080d00410021020c010b2006200820056c36021c200620012802043602142004" + "21020b20062002360218200641086a20042009200641146a10d380808000024020" + "062802080d00200628020c21022001200736020020012002360204418180808078" + "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" + "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" + "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" + "017120024101746b413e6a21020b200042003702102000200236021c2002410274" + "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" + "00360200200020033602182000200036020c20002000360208410041002802e8d2" + "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" + "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" + "03034020042003411d764104716a41106a22052802002202450d02200341017421" + "032002210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b20052000" + "360200200020043602182000200036020c200020003602080b0b00200010d98080" + "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" + "024002400240024020002802040e020001020b20020d0141012102410021030c02" + "0b20020d00200028020022022802042103200228020021020c010b200141808080" + "80783602002001200036020c2001418980808000200028021c22002d001c20002d" + "001d10da80808000000b20012003360204200120023602002001418a8080800020" + "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" + "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" + "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" + "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" + "086a200020011183808080008080808000000b410041003a0094d3c08000200245" + "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" + "02402002450d000240034020002d0000220420012d00002205470d01200041016a" + "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" + "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" + "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" + "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" + "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" + "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" + "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" + "280200210803402005417c6a220520082003742001280200220820027672360200" + "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" + "210103402005417c6a220520012802003602002001417c6a210120042005490d00" + "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" + "036a210502402003450d0020002104200121080340200420082d00003a00002008" + "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" + "6a210402400240200120036a2206410371450d0020074101480d01200641037422" + "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" + "21080340200520082002762001280200220820037472360200200141046a210120" + "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" + "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" + "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" + "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" + "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" + "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" + "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" + "00410020006b41037122046a210502402004450d00200021032001210603402003" + "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" + "01480d012009410374220641187121022009417c71220a41046a2101410020066b" + "4118712104200a2802002106034020052006200276200128020022062004747236" + "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" + "092101034020052001280200360200200141046a2101200541046a22052003490d" + "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" + "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" + "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" + "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" + "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" + "0a000000150000004b000000450010000a000000160000004b0000004163636f75" + "6e7400450010000a0000001700000033000000450010000a000000180000003300" + "00006361706163697479206f766572666c6f770000009800100011000000616c6c" + "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" + "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" + "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" + "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" + "686520696e6465782069732000150110002000000035011000120000003a200000" + "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" + "7273006c0110001300000066000000170000003078303030313032303330343035" + "303630373038303931303131313231333134313531363137313831393230323132" + "323233323432353236323732383239333033313332333333343335333633373338" + "333934303431343234333434343534363437343834393530353135323533353435" + "353536353735383539363036313632363336343635363636373638363937303731" + "373237333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939636f72652f7372632f66" + "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" + "000000a40900001a00000072616e676520737461727420696e64657820206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" + "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" + "10000000a202100022000000736c69636520696e64657820737461727473206174" + "202062757420656e64732061742000f4021000160000000a0310000d0000000101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101010101010101" + "010101010101010101010101010101010101010101010101010101000000000000" + "000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000020202020202" + "020202020202020202020202020202020202020202020202030303030303030303" + "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" + "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" + "000e0000003b041000040000003f041000100000004f0410000100000062797465" + "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" + "7420697320696e7369646520202862797465732029206f66206000700410000b00" + "00007b04100026000000a104100008000000a9041000060000004f041000010000" + "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" + "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" + "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" + "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" + "002c0510001d0000000a0000002b00000000060101030104020507070208080902" + "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" + "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" + "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" + "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" + "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" + "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" + "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" + "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" + "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" + "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" + "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" + "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" + "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" + "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" + "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" + "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" + "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" + "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" + "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" + "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" + "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" + "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" + "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" + "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" + "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" + "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" + "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" + "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" + "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" + "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" + "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" + "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" + "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" + "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" + "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" + "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" + "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" + "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" + "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" + "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" + "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" + "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" + "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" + "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" + "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" + "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" + "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" + "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" + "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" + "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" + "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" + "0239010405010204011402160601013a0101020104080107030a021e013b010101" + "0c01090128010301370101030503010407020b021d013a01020102010301050207" + "020b021c02390201010204080109010a021d014801040102030101080151010207" + "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" + "0202021902040310040d01020206010f01000300031d021e021e02400201070801" + "020b09012d030101750222017603040209010603db0202013a0101070101010102" + "08060a0201301f310430070101050128090c022004020201033801010203010103" + "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" + "04010a200250020001030104011902050197021a120d012608190b2e0330010204" + "020227014306020202020c0108012f01330101030202050201012a020801ee0102" + "01040100010010101000020001e201950500030102050428030401a50200040002" + "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" + "090a0402015f0302010102060102019d010308150239020101010116010e070305" + "c308020301011701510102060101020101020102eb010204060201021b02550802" + "0101026a0101010206010165030204010500090102f5010a020101040190040202" + "0401200a280602040801090602032e0d010200070106010152160207010201027a" + "06030101020107010148020301010100020b023405050101010001060f00053b07" + "00013f0451010002002e0217000101030405080802071e0494030037043208010e" + "011605010f000701110207010201056401a00700013d04000400076d07006080f0" + "002f72757374632f63326637346333663932386165623530336631356234653965" + "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" + "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" + "0e10006000000071010000360000002f72757374632f6332663734633366393238" + "61656235303366313562346539656635373738653737663330353862382f6c6962" + "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" + "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" + "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" + "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" + "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" + "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" + "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" + "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" + "00181d10005f00000058020000300000000d0000000c000000040000000e000000" + "0f00000010000000000000000000000001000000110000006120446973706c6179" + "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" + "20756e65787065637465646c792f72757374632f63326637346333663932386165" + "6235303366313562346539656635373738653737663330353862382f6c69627261" + "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" + "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" + "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" + "207768696c652070617273696e67206120737472696e67454f46207768696c6520" + "70617273696e6720612076616c7565657870656374656420603a60657870656374" + "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" + "78706563746564206964656e7465787065637465642076616c7565657870656374" + "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" + "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" + "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" + "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" + "206120737472696e676b6579206d757374206265206120737472696e67696e7661" + "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" + "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" + "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" + "6164696e6720737572726f6761746520696e206865782065736361706574726169" + "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" + "70656374656420656e64206f662068657820657363617065726563757273696f6e" + "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" + "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" + "4826100001000000000000000000f03f0000000000002440000000000000594000" + "00000000408f40000000000088c34000000000006af8400000000080842e410000" + "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" + "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" + "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" + "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" + "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" + "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" + "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" + "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" + "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" + "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" + "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" + "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" + "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" + "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" + "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" + "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" + "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" + "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" + "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" + "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" + "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" + "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" + "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" + "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" + "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" + "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" + "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" + "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" + "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" + "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" + "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" + "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" + "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" + "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" + "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" + "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" + "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" + "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" + "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" + "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" + "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" + "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" + "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" + "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" + "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" + "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" + "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" + "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" + "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" + "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" + "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" + "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" + "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" + "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" + "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" + "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" + "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" + "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" + "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" + "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" + "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" + "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" + "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" + "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" + "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" + "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" + "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" + "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" + "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" + "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" + "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" + "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" + "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" + "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" + "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" + "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" + "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" + "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" + "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" + "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" + "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" + "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" + "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" + "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" + "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" + "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" + "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" + "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" + "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" + "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" + "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" + "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" + "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" + "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" + "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" + "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" + "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" + "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" + "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" + "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" + "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" + "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" + "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" + "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" + "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" + "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" + "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" + "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" + "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" + "64656466696c6520746f6f206c617267657265736f757263652062757379657865" + "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" + "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" + "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" + "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" + "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" + "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" + "0048261000010000006f7065726174696f6e207375636365737366756c10000000" + "1100000012000000100000001000000013000000120000000d0000000e00000015" + "0000000c0000000b00000015000000150000000f0000000e000000130000002600" + "00003800000019000000170000000c000000090000000a00000010000000170000" + "00190000000e0000000d00000014000000080000001b0000000e00000010000000" + "16000000150000000b000000160000000d0000000b000000130000005023100060" + "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" + "1000f8231000042410000f24100024241000392410004824100056241000692410" + "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" + "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" + "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" + "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" + "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" + "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" + "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" + "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" + "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" + "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" + "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" + "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" + "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" + "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" + "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" + "243137683533326265333033376461316237656445064a5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" + "70617273655f6964656e743137683663353964643731393635353139313045074b" + "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" + "4c54245224475424313270617273655f6e756d6265723137683738336134316134" + "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" + "73657269616c697a6572244c54245224475424313370617273655f646563696d61" + "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" + "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" + "70617273655f6578706f6e656e7431376833366464376462643233653461346562" + "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" + "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" + "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" + "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" + "346636345f66726f6d5f7061727473313768633863316239626161613836666637" + "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" + "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" + "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" + "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" + "24313670617273655f616e795f6e756d6265723137683931643533303465356139" + "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" + "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" + "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" + "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" + "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" + "61775f7665633139526177566563244c54245424432441244754243867726f775f" + "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" + "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" + "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" + "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" + "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" + "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" + "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" + "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" + "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" + "62653863353535633862636433353545143c5f5a4e357365726465326465375669" + "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" + "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" + "68616e646c655f6572726f72313768393762376462643066373264643738384516" + "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" + "35766973697431376838366238393638313662613130613765451781015f5a4e37" + "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" + "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" + "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" + "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" + "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" + "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" + "244754243976697369745f73747231376835356436653830653061376366383938" + "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" + "6363657373244c5424522447542424753230246173247532302473657264652e2e" + "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" + "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" + "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" + "4c54244b24432456244324412447542436696e7365727431376834643164623464" + "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" + "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" + "244b244324562443244124475424247532302461732475323024636f72652e2e6f" + "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" + "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" + "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" + "702e2e5061727469616c4571244754243265713137683162323138393234373831" + "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" + "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" + "475424247532302461732475323024636f72652e2e697465722e2e747261697473" + "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" + "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" + "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" + "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" + "6e646578244754243130696e6465785f696e746f31376864333238633634636161" + "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" + "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" + "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" + "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" + "63617061636974795f6f766572666c6f7731376834393964343832613965643537" + "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" + "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" + "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" + "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" + "70616e69636b696e673570616e6963313768303465656239313764643933633232" + "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" + "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" + "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" + "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "244754243133646973706f73655f6368756e6b3137683665306363636434353836" + "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" + "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" + "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" + "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" + "2475323024666f7224753230247533322447542433666d74313768626633653032" + "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" + "70616e69635f626f756e64735f636865636b313768336436623861613463383034" + "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" + "363431376864353231666136656636613036373261452e11727573745f62656769" + "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" + "327061645f696e74656772616c3137686334656130376130626331333536633445" + "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" + "656772616c313277726974655f7072656669783137686139613433323830623630" + "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" + "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" + "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" + "706164313768343736396165333839333734636335314533495f5a4e34345f244c" + "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" + "706c61792447542433666d74313768376666346430623836303963323437324534" + "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" + "2e666d742e2e44656275672447542433666d743137683361366261613162623437" + "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" + "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" + "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" + "3024666f7224753230247533322447542433666d74313768353533393862313635" + "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" + "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" + "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" + "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" + "6275675f657874313768656366613566303431373437393039384539345f5a4e34" + "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" + "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" + "6963655f6572726f725f6661696c31376862303364323439386438646362363433" + "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" + "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" + "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" + "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" + "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" + "656275672447542433666d7431376865613566643964626339343936626665453e" + "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" + "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" + "30246933322447542433666d743137686365643930633761363339633031646445" + "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" + "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" + "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" + "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" + "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" + "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" + "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" + "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" + "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" + "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" + "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" + "3130696e736572745f666974313768633861306366353339656666303131314541" + "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" + "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" + "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" + "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" + "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" + "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" + "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" + "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" + "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768343032353764366634326532" + "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" + "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" + "61792447542433666d74313768636534323236616131663732366331634544615f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" + "74655f73747231376835393964396535373839343664643938452e31393245575f" + "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "313768623637326562313939633335643138364546555f5a4e35335f244c542463" + "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" + "666d742e2e44656275672447542433666d74313768663761653238353562323439" + "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" + "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" + "313768376236353738393966393837353963624548475f5a4e313073657264655f" + "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" + "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" + "616c6c6f63337665633136566563244c5424542443244124475424313765787465" + "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" + "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" + "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" + "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" + "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" + "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" + "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" + "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" + "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" + "6f64655f6865785f65736361706531376834376265353936383535663830346461" + "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" + "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" + "63377261775f7665633230526177566563496e6e6572244c542441244754243772" + "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" + "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" + "3472656164356572726f7231376865663535323764333333633963323666455130" + "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" + "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" + "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" + "666d742e2e577269746524475424313077726974655f6368617231376832313433" + "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" + "766563313166696e6973685f67726f773137683533383539626133383962373164" + "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" + "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" + "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" + "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" + "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" + "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" + "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" + "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" + "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" + "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" + "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" + "75376424247537642431376865313761333937376638396331313738455a3b5f5a" + "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" + "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" + "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" + "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" + "61735f73747231376865623366373232643232346534326638455c066d656d636d" + "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" + "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" + "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" + "2e726f6461746100550970726f64756365727302086c616e677561676501045275" + "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" + "6768746c79202863326637346333663920323032342d30392d30392900490f7461" + "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const zkProofHex = + "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" + "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" + "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" + "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" + "030505030206020601000006010606070303080202020302090208020202" + "030a0806020a030b06060202030302020303030203030203020202010302" + "030203060a02000202080a020c0807010d02030206060102020803080302" + "030202020a02060303020a03020301010a0d030101010001010301020604" + "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" + "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" + "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" + "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" + "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" + "4020010d00410021010c010b2002450d01200120026e2203200320026c20" + "01476a21010b2000200136020820004101360204200020013602000f0b10" + "8180808000000b4701017f23808080800041206b22002480808080002000" + "41003602182000410136020c200041e090c0800036020820004204370210" + "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" + "808080000b170002402000450d002001200020026c108d808080000b0b0e" + "002000200141011083808080000b0f002000200141a0021083808080000b" + "0e002000200141201083808080000b4201017f0240200028020822032000" + "280200470d00200020021088808080000b2000280204200341e8006c6a20" + "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" + "800041106b2202248080808000200241086a20002000280200410141e800" + "108b80808000024020022802082200418180808078460d00200020022802" + "0c2001108c80808000000b200241106a2480808080000b6401027f238080" + "80800041106b2203248080808000200341086a20024101410141f081c080" + "00108a8080800020032802082104200328020c2001200210868180800021" + "01200020023602082000200136020420002004360200200341106a248080" + "8080000b6401017f23808080800041106b2205248080808000200541046a" + "200120022003108e8080800020052802082103024020052802040d002000" + "200528020c36020420002003360200200541106a2480808080000f0b2003" + "200528020c2004108c80808000000bfd0102037f017e2380808080004110" + "6b22052480808080004100210602400240200220036a22032002490d0020" + "0441076a417871ad2001280200220741017422022003200220034b1b2202" + "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" + "074b0d01024002402007450d00024020040d00200541086a4108200210d7" + "80808000200528020821040c020b2001280204200720046c200210cb8080" + "800021040c010b20054108200210d780808000200528020021040b024020" + "040d00410821060c020b2001200336020020012004360204418180808078" + "21060b0b2000200236020420002006360200200541106a2480808080000b" + "1200024020000d00200210cf808080000b000b6c01027f02400240200041" + "7c6a2802002202417871220341044108200241037122021b20016a490d00" + "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" + "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" + "10ca80808000000bc70103017f017e017f23808080800041106b22042480" + "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" + "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" + "200236020841002102200041003602040c020b200441086a2002200310d7" + "80808000024020042802082206450d002000200636020820002001360204" + "410021020c020b2000200336020820002002360204410121020c010b2000" + "4100360204410121020b20002002360200200441106a2480808080000b88" + "0303017f097e017f23808080800041306b22022480808080002002420042" + "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" + "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" + "20012903482209842001290350220a842001290358220b8450220c1b3703" + "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" + "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" + "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" + "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" + "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" + "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" + "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" + "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" + "80808000200020014130108681808000200c3a0060200241306a24808080" + "80000b9e0101027e20002002290328200129032822048542002003ad42ff" + "01837d220583200485370328200020022903202001290320220485200583" + "200485370320200020022903182001290318220485200583200485370318" + "200020022903102001290310220485200583200485370310200020022903" + "082001290308220485200583200485370308200020022903002001290300" + "2204852005832004853703000bec0201057f23808080800041c0006b2202" + "248080808000410121030240200128021c2204418082c080004111200128" + "0220220528020c220611808080800080808080000d000240024020012d00" + "144104710d0041012103200441fa8ec08000410120061180808080008080" + "8080000d02200141e091c080004102109280808000450d010c020b200441" + "fb8ec080004102200611808080800080808080000d014101210320024101" + "3a0017200241186a41086a200141086a290200370300200241186a41106a" + "200141106a290200370300200241186a41186a200141186a280200360200" + "2002200536020c20022004360208200241dc8ec080003602382002200129" + "02003703182002200241176a3602102002200241086a360234200241186a" + "41e091c0800041021092808080000d01200241086a41f88ec08000410210" + "93808080000d010b200441ec8cc080004101200611808080800080808080" + "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" + "200028020022032000280208220472450d0002402004410171450d002001" + "20026a210502400240200028020c22060d0041002107200121080c010b41" + "00210741002109200121080340200822042005460d020240024020042c00" + "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" + "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" + "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" + "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" + "2007450d00024020072002490d0020072002460d01410021040c020b2001" + "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" + "21022004200120041b21010b024020030d00200028021c20012002200028" + "022028020c11808080800080808080000f0b2000280204210a0240200241" + "10490d0020022001200141036a417c7122076b22096a220b410371210341" + "00210641002104024020012007460d004100210402402009417c4b0d0041" + "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" + "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" + "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" + "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" + "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" + "4a6a21060b200b4102762105200620046a21060340200721032005450d04" + "200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002003200d41f007716a210941002108200321040340" + "200428020c2207417f734107762007410676724181828408712004280208" + "2207417f7341077620074106767241818284087120042802042207417f73" + "41077620074106767241818284087120042802002207417f734107762007" + "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" + "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" + "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" + "fc01714102746a22082802002204417f7341077620044106767241818284" + "08712104200c4101460d0220082802042207417f73410776200741067672" + "41818284087120046a2104200c4102460d0220082802082208417f734107" + "7620084106767241818284087120046a21040c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d004100210641002109" + "0c010b41002106200121042002410c71220921070340200620042c000041" + "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" + "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" + "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" + "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" + "200028022028020c11808080800080808080000f0b200441087641ff811c" + "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" + "20064d0d00200a20066b2105024002400240410020002d00182204200441" + "03461b22040e03020001020b20052104410021050c010b20054101762104" + "200541016a41017621050b200441016a2104200028021021092000280220" + "2108200028021c210703402004417f6a2204450d02200720092008280210" + "1181808080008080808000450d000b41010f0b200028021c200120022000" + "28022028020c11808080800080808080000f0b0240200720012002200828" + "020c1180808080008080808000450d0041010f0b41002104034002402005" + "2004470d0020052005490f0b200441016a21042007200920082802101181" + "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" + "7f6a21032000280204210420002802002105200028020821064100210741" + "002108410021094100210a02400340200a4101710d010240024020092002" + "4b0d000340200120096a210a0240024002400240200220096b220b41074b" + "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" + "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" + "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" + "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" + "828408200c41046a2802002200418a94a8d000736b200072714180818284" + "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" + "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" + "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" + "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" + "0000410a460d01200b200041016a2200470d000b200221090c030b200020" + "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" + "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" + "000b0b20082002460d024101210a2008210d200221000b0240024020062d" + "0000450d00200541f48ec080004104200428020c11808080800080808080" + "000d010b200020086b210b4100210c024020002008460d00200320006a2d" + "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" + "200b200428020c1180808080008080808000450d010b0b410121070b2007" + "0ba80101017f23808080800041306b220424808080800020042003360208" + "20042002360204200420012d00c80122033a000f024020034101460d0020" + "04420137021c200441013602142004419482c08000360210200441818080" + "800036022c2004200441286a3602182004200441046a3602282004410f6a" + "41c886c08000200441106a419c82c08000109680808000000b2000200141" + "c8011086818080001a200441306a2480808080000b140020012000280200" + "20002802041092808080000b4401017f23808080800041106b2204248080" + "8080002004200136020c20042000360208200441086a41b886c080002004" + "410c6a41b886c080002002200310d380808000000ba70101017f23808080" + "800041306b22042480808080002004200336020820042002360204200420" + "012d006822033a000f024020034101460d002004420137021c2004410136" + "02142004419482c08000360210200441818080800036022c200420044128" + "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" + "419c82c08000109680808000000b2000200141e8001086818080001a2004" + "41306a2480808080000b45000240024020042003490d0020022004490d01" + "2000200420036b3602042000200120036a3602000f0b2003200420051099" + "80808000000b200420022005109a80808000000b0f0020002001200210fc" + "80808000000b0f0020002001200210f580808000000b4001017f23808080" + "800041106b2201248080808000200141086a200041014101419883c08000" + "108a80808000200128020c2100200141106a24808080800020000b9a0101" + "017f23808080800041b0016b2202248080808000200241086a2001280204" + "20012802084100413041a883c080001098808080000240200228020c4130" + "460d00200241106a41b883c08000109d80808000000b20024180016a2002" + "28020841301089818080001a200241106a20024180016a109e8080800020" + "00200241106a41c883c080004118109780808000200241b0016a24808080" + "80000b970101017f23808080800041c0006b22022480808080002002412b" + "36020c200241f880c08000360208200241e880c080003602142002200036" + "02102002410236021c200241cc8ec0800036021820024202370224200241" + "8280808000ad422086200241106aad843703382002418380808000ad4220" + "86200241086aad843703302002200241306a360220200241186a200110a4" + "80808000000ba50801077f23808080800041c0086b220224808080800020" + "012d0000220341077610a3808080002104200341067641017110a3808080" + "002105200341057641017110a3808080002106200241a0066a2001413010" + "86818080001a200220022d00a006411f713a00a006200241e8006a200241" + "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" + "026a200241b0076a200241e8006a20022d00980122071090808080002002" + "4190056a10a8808080002002200520047110a380808000200610d2808080" + "007110a380808000200241c0026a10a9808080007110a38080800022013a" + "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" + "0020024180046a200241a0066a200241c0026a10a780808000200241e007" + "6a20024180046a418089c0800010b98080800020024180046a200241e007" + "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" + "00200241a0066a200241e0076a10db808080002103200241f0026a200241" + "80046a41301086818080001a200220033a00a00320024100413010858180" + "800022024190086a2002200241f0026a2003109080808000200241a0066a" + "20024190086a10b28080800020024180046a41306a20024190086a200241" + "a0066a200620024190086a10de808080007310a380808000109080808000" + "20024180046a200241c0026a41301086818080001a20032004200510d280" + "8080007110a3808080007110a3808080002103200241a0066a2002418004" + "6a41e0001086818080001a200220033a008807200220053a008007200241" + "d0016a20024190056a200241a0066a200810aa8080800020022007200120" + "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" + "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" + "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" + "8080800020024180046a20024190056a10e480808000200241f0026a2002" + "4180046a10e58080800020024190056a200241e8001086818080001a2002" + "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" + "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" + "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" + "8080800020024190086a200241f0026a41306a200510a780808000200241" + "80046a200241a0066a41306a200110a7808080002003200110a980808000" + "2201200510a98080800022057110a380808000200110d280808000200510" + "d2808080007110a380808000200241b0076a200241e0076a10db80808000" + "7110a38080800020024190086a20024180046a10db808080007110a38080" + "80007210a3808080007110a38080800021052000200241e8001086818080" + "0020053a0068200241c0086a2480808080000b970101017f238080808000" + "41c0026b2203248080808000200341086a20012002410041e00041e083c0" + "80001098808080000240200328020c41e000460d00200341106a41f083c0" + "8000109d80808000000b200341e0016a200328020841e000108981808000" + "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" + "004118109480808000200341c0026a2480808080000bff1d02137f017e23" + "808080800041a0276b220224808080800020012d0000220341077610a380" + "8080002104200341067641017110a3808080002105200341057641017110" + "a380808000210620024180106a200141301086818080001a200220022d00" + "8010411f713a008010200241a0216a20024180106a10dc80808000200241" + "80226a200141306a10dc80808000200241e01f6a41004130108581808000" + "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" + "80800020022d00b0222101200241c0206a410041301085818080001a2002" + "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" + "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" + "2002200520047110a380808000200610d2808080007110a3808080002002" + "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" + "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" + "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" + "c0800010bc80808000200241c0236a10e08080800021032002410041e000" + "108581808000220220033a0060200310d2808080002109200241a0246a20" + "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" + "ba8080800020024180256a20024180106a200241c0236a10b38080800020" + "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" + "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" + "30108681808000210a200241d0016a41306a410041301085818080001a20" + "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" + "016a10e28080800020024180256a200241c0266a10c28080800021032002" + "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" + "10d280808000210b200a41004130108581808000210320024180106a41e0" + "86c0800041301086818080001a20024180076a20024180256a2002418010" + "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" + "0020024180106a20024198036a200241e0256a10b3808080002002410110" + "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" + "da80808000200241c00b6a410041e0001085818080001a20024198036a20" + "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" + "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" + "8080007110a380808000210a20024180106a20024198036a41e000108681" + "8080001a2002200a3a00e01020024180076a200220024180106a200910da" + "808080002002410041e00010858180800022024198036a20022002418007" + "6a20022d00e007220910b08080800020024180106a20024198036a10e280" + "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" + "024198036a41306a220a10de80808000200a10a98080800020024198036a" + "10de808080007110a3808080007210a3808080007310a38080800010b080" + "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" + "0510d2808080007110a3808080007110a380808000210420024180106a20" + "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" + "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" + "0420022d00a80f220573410020086b712005737110a38080800021012002" + "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" + "6a280000360000200220022800890d3600c9012002200120077110a38080" + "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" + "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" + "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" + "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" + "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" + "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" + "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" + "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" + "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" + "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" + "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" + "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" + "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" + "4180106a200241e0046a41301086818080001a20024180076a2002418010" + "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" + "80106a200241e0046a41e0006a220141301086818080001a20024180076a" + "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" + "066a10b28080800020024180106a200241e0046a41c0016a220541301086" + "818080001a20024180076a41c0016a20024180106a41e000108681808000" + "210e2003410041301085818080001a20024180106a41e086c08000413010" + "86818080001a200241a0096a410041e0001085818080001a200241a0096a" + "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" + "6a410041e000108581808000210a200241c0266a41306a210f2002418010" + "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" + "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" + "8080a080e9002115024003402015500d01200241e0196a200110ba808080" + "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" + "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" + "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" + "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" + "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" + "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" + "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" + "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" + "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" + "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" + "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" + "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" + "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" + "0241a0246a41e00010868180800021082014200241c0206a41e000108681" + "8080002107200f410041301085818080001a200241c0266a41e086c08000" + "41301086818080001a20024180106a410041e0001085818080001a201020" + "0241c0266a41e00010868180800021042012410041e00010858180800021" + "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" + "b080808000200b20082004200310b080808000201320072006200310b080" + "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" + "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" + "024180136a2009200110b380808000200241e0136a200a200510b3808080" + "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" + "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" + "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" + "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" + "09200a10bc8080800020024180196a2001200510bc80808000200241e019" + "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" + "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" + "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" + "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" + "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" + "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" + "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" + "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" + "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" + "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" + "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" + "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" + "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" + "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" + "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" + "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" + "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" + "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" + "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" + "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" + "818080001a20024180106a200241a0096a41e0001086818080001a200241" + "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" + "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" + "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" + "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" + "0110e08080800022017110a380808000200510d280808000200110d28080" + "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" + "80808000200241e00d6a20024180106a10c2808080007110a38080800072" + "10a380808000200c7110a38080800021012000200241d0016a41c8011086" + "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" + "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" + "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" + "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" + "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" + "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" + "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" + "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" + "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" + "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" + "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" + "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" + "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" + "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" + "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" + "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" + "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" + "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" + "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" + "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" + "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" + "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" + "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" + "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" + "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" + "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" + "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" + "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" + "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" + "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" + "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" + "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" + "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" + "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" + "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" + "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" + "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" + "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" + "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" + "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" + "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" + "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" + "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" + "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" + "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" + "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" + "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" + "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" + "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" + "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" + "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" + "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" + "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" + "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" + "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" + "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" + "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" + "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" + "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" + "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" + "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" + "066a41e0006a41e000108980808000200041980f6a20002802900f200028" + "02940f109f80808000200041e4106a2000419c086a41e000108980808000" + "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" + "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" + "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" + "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" + "900110898080800020004194156a41086a22014100360200200042808080" + "80800137029415200041d0066a200028028c152202200028029015220341" + "004130418084c08000109880808000200041a0156a20002802d006200028" + "02d406108980808000200041b0156a200041a0156a109c80808000200041" + "94156a200041b0156a419084c08000108780808000200041c8066a200220" + "03413041e00041a084c08000109880808000200041b0156a20002802c806" + "20002802cc0610898080800020002802a01520002802a415108480808000" + "200041a0156a41086a2204200041b0156a41086a22052802003602002000" + "20002902b0153703a015200041b0156a200041a0156a109c808080002000" + "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" + "200341e00041900141c084c08000109880808000200041b0156a20002802" + "c00620002802c40610898080800020002802a01520002802a41510848080" + "800020042005280200360200200020002902b0153703a015200041b0156a" + "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" + "108780808000200041c81c6a200128020036020020002000290294153703" + "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" + "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" + "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" + "818080002107200041901a6a200041c8126a41e8001086818080001a2000" + "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" + "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" + "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" + "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" + "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" + "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" + "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" + "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" + "0002400240024002400240024020002802a4684101470d00200041b8066a" + "20002802a8684108412041d880c08000108a80808000200041003602c85b" + "200020002802bc0622033602c45b200020002802b80622023602c05b2000" + "41f8326a41c0004120108080808000024020002802fc324101470d004100" + "21050240200220002802803322014f0d00200041b0066a200041c0db006a" + "410020014120108b8080800020002802b0062202418180808078470d0520" + "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" + "746a210341c000210103402001450d03200041b0046a2002290000220942" + "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" + "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" + "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" + "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" + "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" + "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" + "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" + "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" + "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" + "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" + "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" + "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" + "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" + "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" + "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" + "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" + "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" + "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" + "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" + "00420010878180800020004180046a20002903f005220f20002903c00422" + "10200041b0046a41086a2903007c22117c22122000290390047c22132000" + "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" + "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" + "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" + "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" + "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" + "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" + "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" + "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" + "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" + "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" + "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" + "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" + "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" + "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" + "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" + "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" + "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" + "2903e0047c220f2000290390067c221420004180066a41086a2903002011" + "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" + "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" + "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" + "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" + "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" + "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" + "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" + "8000200041d0036a41086a290300211d20004180056a41086a290300211e" + "200041d0056a41086a290300211f200041a0066a41086a29030021202000" + "2903e00521212000290390052122200029038003212320004180036a4108" + "6a290300212420004190036a41086a290300212520004190056a41086a29" + "03002126200041e0056a41086a290300212720002903a005212820002903" + "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" + "026a41086a290300212c200020002903d002222d200041e0046a41086a29" + "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" + "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" + "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" + "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" + "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" + "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" + "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" + "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" + "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" + "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" + "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" + "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" + "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" + "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" + "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" + "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" + "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" + "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" + "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" + "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" + "41f8326a10a28080800020002903a068210e20002903a868211220002903" + "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" + "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" + "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" + "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" + "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" + "0021042000411836028457200041a585c0800036028057200020043a00c0" + "52200441ff01714101470d04200341186a200d370300200341106a201337" + "0300200341086a20123703002003200e370300200341206a210320054101" + "6a210520022001412020014120491b22046a2102200120046b21010c000b" + "0b2000410036028833200041013602fc32200041d085c080003602f83220" + "00420437028033200041f8326a41d880c0800010a480808000000b200041" + "0036028833200041013602fc32200041d085c080003602f8322000420437" + "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" + "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" + "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" + "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" + "6a2134200041a0dc006a2135410021040340024020042005470d00200041" + "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" + "410041301085818080001a200041c0db006a200041a0e8006a200041f832" + "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" + "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" + "41c0db006a10a7808080002000410010a3808080003a008069200041f832" + "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" + "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" + "80800020004188256a200710ab8080800020004198256a200810ab808080" + "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" + "808000200041c0376a200041801f6a108f80808000200041803c6a200041" + "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" + "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" + "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" + "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" + "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" + "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" + "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" + "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" + "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" + "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" + "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" + "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" + "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" + "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" + "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" + "64410374210120002802c064210320002802c8642130024003402001450d" + "01200328020422042d000c20032802002d00607210a38080800021022000" + "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" + "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" + "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" + "10b0808080002037203a2039200210b08080800020004180d7006a203120" + "08200210b080808000203420072006200210b08080800020332032203520" + "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" + "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" + "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" + "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" + "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" + "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" + "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" + "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" + "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" + "41301086818080001a200041c0db006a41306a2201200041b8256a419001" + "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" + "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" + "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" + "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" + "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" + "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" + "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" + "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" + "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" + "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" + "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" + "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" + "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" + "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" + "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" + "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" + "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" + "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" + "41e0036a41301086818080001a200041f8326a410041301085818080001a" + "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" + "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" + "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" + "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" + "0041f8326a10b3808080002005410041301085818080002133200042ba8a" + "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" + "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" + "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" + "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" + "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" + "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" + "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" + "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" + "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" + "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" + "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" + "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" + "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" + "b28080800020004180ce006a200041f8326a41301086818080001a200041" + "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" + "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" + "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" + "41301086818080001a200041a0e8006a410041301085818080001a200042" + "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" + "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" + "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" + "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" + "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" + "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" + "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" + "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" + "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" + "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" + "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" + "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" + "80800020004180ce006a200041f8326a4180036a22414130108681808000" + "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" + "326a41e0036a224241301086818080001a200041a0e8006a410041301085" + "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" + "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" + "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" + "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" + "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" + "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" + "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" + "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" + "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" + "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" + "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" + "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" + "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" + "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" + "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" + "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" + "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" + "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" + "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" + "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" + "4410b280808000200041c0d2006a200841301086818080001a2007200041" + "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" + "41c0016a223a41301086818080001a200041c0db006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" + "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" + "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" + "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" + "006a200041c0db006a10b380808000200141004130108581808000210120" + "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" + "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" + "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" + "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" + "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" + "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" + "10b28080800020004180c5006a200341301086818080001a2005200041a0" + "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" + "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" + "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" + "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" + "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" + "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" + "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" + "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" + "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" + "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" + "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" + "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" + "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" + "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" + "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" + "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" + "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" + "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" + "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" + "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" + "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" + "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" + "2031203510b28080800020004180c5006a200041c0db006a413010868180" + "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" + "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" + "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" + "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" + "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" + "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" + "0620004180ce006a20004180d7006a10b380808000200741004130108581" + "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" + "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" + "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" + "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" + "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" + "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" + "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" + "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" + "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" + "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" + "5241301086818080001a20004180d7006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" + "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" + "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" + "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" + "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" + "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" + "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" + "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" + "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" + "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" + "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" + "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" + "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" + "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" + "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" + "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" + "01108581808000213820004180d7006a41a0026a225320004180ce006a20" + "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" + "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" + "41301086818080001a200520004180d7006a4190016a10b2808080002000" + "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" + "b28080800020004180ce006a200441301086818080001a200041c0d2006a" + "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" + "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" + "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" + "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" + "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" + "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" + "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" + "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" + "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" + "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" + "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" + "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" + "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" + "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" + "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" + "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" + "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" + "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" + "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" + "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" + "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" + "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" + "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" + "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" + "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" + "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" + "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" + "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" + "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" + "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" + "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" + "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" + "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" + "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" + "b280808000200041803c6a200041c0d2006a41301086818080001a203720" + "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" + "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" + "c0c9006a203441301086818080001a20004180ce006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" + "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" + "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" + "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" + "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" + "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" + "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" + "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" + "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" + "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" + "41d0026a225a10b280808000200041c0376a205641301086818080001a20" + "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" + "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" + "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" + "301086818080001a20004180ce006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" + "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" + "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" + "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" + "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" + "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" + "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" + "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" + "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" + "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" + "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" + "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" + "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" + "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" + "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" + "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" + "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" + "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" + "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" + "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" + "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" + "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" + "8080800020004180e0006a41306a2230200041f8326a203310b980808000" + "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" + "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" + "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" + "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" + "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" + "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" + "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" + "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" + "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" + "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" + "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" + "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" + "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" + "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" + "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" + "0020004180d7006a410041301085818080001a200041c0e7006a20004180" + "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" + "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" + "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" + "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" + "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" + "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" + "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" + "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" + "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" + "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" + "0041c0db006a200210b0808080002038203d203c200210b0808080002034" + "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" + "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" + "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" + "86818080001a200020023a00b837200041803c6a410041c0041085818080" + "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" + "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" + "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" + "203e200210b0808080002008200041803c6a4180036a2041200210b08080" + "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" + "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" + "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" + "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" + "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" + "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" + "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" + "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" + "301086818080001a200041a0e8006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" + "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" + "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" + "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" + "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" + "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" + "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" + "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" + "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" + "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" + "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" + "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" + "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" + "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" + "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" + "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" + "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" + "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" + "006a200041a0e8006a10b380808000203341004130108581808000210620" + "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" + "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" + "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" + "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" + "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" + "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" + "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" + "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" + "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" + "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" + "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" + "98abaaa584073703c05b203c410041c00110858180800021432003200041" + "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" + "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" + "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" + "6a200841301086818080001a2001204510b28080800020004180d7006a20" + "3a41301086818080001a200041c0db006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" + "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" + "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" + "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" + "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" + "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" + "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" + "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" + "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" + "001086818080001a2031204710b28080800020004180c5006a2003413010" + "86818080001a2005204810b280808000200041c0c9006a20494130108681" + "8080001a2001204a10b28080800020004180d7006a204b41301086818080" + "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" + "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" + "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" + "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" + "38200041c0c9006a200041c0db006a10b380808000203341004130108581" + "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" + "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" + "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" + "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" + "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" + "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" + "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" + "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" + "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" + "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" + "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" + "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" + "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" + "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" + "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" + "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" + "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" + "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" + "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" + "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" + "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" + "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" + "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" + "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" + "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" + "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" + "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" + "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" + "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" + "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" + "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" + "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" + "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" + "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" + "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" + "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" + "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" + "20004180d7006a200041a0e8006a10b38080800020064100413010858180" + "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" + "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" + "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" + "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" + "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" + "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" + "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" + "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" + "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" + "410041c001108581808000213d200320004180d7006a200041c0db006a10" + "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" + "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" + "001a2036204410b280808000200041c0e4006a200841301086818080001a" + "2001204510b28080800020004180d7006a203a41301086818080001a2000" + "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" + "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" + "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" + "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" + "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" + "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" + "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" + "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" + "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" + "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" + "204710b280808000200041c0e7006a200341301086818080001a20302048" + "10b28080800020004180e0006a204941301086818080001a2001204a10b2" + "8080800020004180d7006a204b41301086818080001a200041c0db006a41" + "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" + "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" + "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" + "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" + "41c0db006a10b3808080002033410041301085818080002133200042ba8a" + "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" + "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" + "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" + "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" + "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" + "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" + "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" + "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" + "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" + "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" + "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" + "8407370380572007410041c00110858180800021072032200041c0e4006a" + "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" + "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" + "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" + "301086818080001a2036204d10b280808000200041c0e4006a203b413010" + "86818080001a20004180d7006a410041301085818080001a200042c18e8e" + "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" + "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" + "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" + "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" + "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" + "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" + "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" + "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" + "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" + "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" + "306a204e10b280808000200041e0e6006a203241301086818080001a2006" + "204f10b280808000200041c0e7006a205041301086818080001a20362051" + "10b280808000200041c0e4006a205241301086818080001a20004180d700" + "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" + "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" + "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" + "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" + "20004180d7006a10b3808080002001410041301085818080002101200042" + "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" + "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" + "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" + "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" + "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" + "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" + "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" + "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" + "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" + "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" + "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" + "aaa584073703c0642037410041c00110858180800021372053200041a0e2" + "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" + "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" + "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" + "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" + "b28080800020004180d7006a203841301086818080001a2033205810b280" + "808000200041c0db006a203441301086818080001a200041a0e8006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" + "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" + "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" + "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" + "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" + "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" + "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" + "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" + "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" + "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" + "004180e0006a205641301086818080001a2005205b10b280808000200041" + "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" + "006a205e41301086818080001a200041a0e8006a41004130108581808000" + "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" + "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" + "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" + "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" + "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" + "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" + "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" + "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" + "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" + "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" + "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" + "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" + "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" + "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" + "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" + "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" + "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" + "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" + "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" + "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" + "80800020004180d7006a205441301086818080001a203320004180c5006a" + "41f0016a10b280808000200041c0db006a205541301086818080001a2000" + "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" + "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" + "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" + "80d7006a200041a0e8006a10b38080800020344100413010858180800021" + "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" + "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" + "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" + "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" + "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" + "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" + "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" + "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" + "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" + "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" + "200510b28080800020004180e0006a200041a0e8006a4130108681808000" + "1a2036204410b280808000200041c0e4006a200841301086818080001a20" + "01204510b28080800020004180d7006a203a41301086818080001a200041" + "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" + "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" + "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" + "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" + "e4006a200041c0db006a10b3808080002033410041301085818080002104" + "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" + "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" + "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" + "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" + "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" + "b280808000200041c0e7006a200341301086818080001a2030204810b280" + "80800020004180e0006a204941301086818080001a2001204a10b2808080" + "0020004180d7006a204b41301086818080001a200041c0db006a41004130" + "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" + "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" + "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" + "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" + "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" + "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" + "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" + "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" + "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" + "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" + "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" + "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" + "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" + "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" + "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" + "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" + "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" + "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" + "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" + "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" + "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" + "00200020023a00a068024020024101470d00200041a0e8006a200041f829" + "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" + "200041f8326a10c2808080002008203f10c2808080007110a38080800020" + "3a204010c2808080007110a3808080002003203e10c28080800020492041" + "10c2808080007110a380808000204b204210c2808080007110a380808000" + "7110a380808000210220002802a82520002802ac25108580808000200028" + "029825200028029c25108580808000200028028825200028028c25108580" + "80800020002802f82420002802fc24108580808000202f202e1086808080" + "0020002802c01c20002802c41c10828080800020002802a01520002802a4" + "15108480808000200028028815200028028c1510848080800020002802b4" + "1320002802b81310848080800020002802bc1220002802c0121084808080" + "0020002802e41020002802e810108480808000200028028c0f2000280290" + "0f10848080800020002802940e20002802980e108480808000200028029c" + "0d20002802a00d108480808000200241ff017141004721020c080b200041" + "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" + "109680808000000b200041c0c0006a200041b8256a203610b48080800020" + "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" + "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" + "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" + "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" + "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" + "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" + "006a10b7808080002005200041c0db006a41a0021086818080001a200041" + "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" + "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" + "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" + "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" + "8180800020004180026a200942004285b087cd8081f69c33420010878180" + "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" + "00200041e0016a200029039002220e20022903087c220b200041a0026a41" + "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" + "7e220942004281808080704200108781808000200041d0016a2009420042" + "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" + "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" + "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" + "29038002221220022903107c220a20004190026a41086a290300200b200e" + "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" + "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" + "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" + "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" + "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" + "4200108781808000200041f0006a20002903b001221020002903f0012211" + "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" + "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" + "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" + "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" + "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" + "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" + "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" + "f3004200108781808000200041a0016a41086a290300210d200041306a41" + "086a290300210f200029039001211720002903502114200041d0006a4108" + "6a2903002115200020002903602216200041f0016a41086a290300200e20" + "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" + "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" + "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" + "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" + "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" + "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" + "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" + "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" + "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" + "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" + "200041a0e8006a200041f8326a10a280808000200020002903b868370398" + "4e200020002903b0683703904e200020002903a8683703884e2000200029" + "03a0683703804e200041c0db006a410041301085818080001a2035410041" + "301085818080001a203441e086c0800041301086818080001a4101210220" + "0041013602e052200041003602d452200041003602c852200020333602c4" + "52200020004180ce006a3602c05203400240024020020d00200041086a20" + "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" + "0041003602e0520240024020002802c852450d00200041286a2002203210" + "c58080800020002802280d01200028022c21020b024020002802c0522201" + "450d0020002802c45221030340024020032001470d00200020033602c452" + "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" + "0041206a2002203210c580808000024020002802200d0020002802242102" + "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" + "52450d00200041186a2002203110c58080800020002802180d0120002802" + "1c21020b41002103200041003602d45220020d010b200041106a200041c0" + "d2006a10c48080800020002d0011210120002d001021030b024020034101" + "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" + "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" + "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" + "326a200110c880808000200041c0db006a200041a0e8006a419001108681" + "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" + "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" + "c78080800020004180236a200041f8326a4190011086818080001a200441" + "016a21040c000b0b2000420137028433200041013602fc322000419482c0" + "80003602f83220004181808080003602a4682000200041a0e8006a360280" + "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" + "f8326a419c82c08000109680808000000b200220002802b40641b092c080" + "00108c80808000000b202f202e10868080800020002802c01c20002802c4" + "1c10828080800020002802a01520002802a4151084808080002000280288" + "15200028028c1510848080800020002802b41320002802b8131084808080" + "0020002802bc1220002802c01210848080800020002802e41020002802e8" + "10108480808000200028028c0f20002802900f1084808080002000280294" + "0e20002802980e108480808000200028029c0d20002802a00d1084808080" + "00410021020b200041e0ec006a24808080800020020ba60201087e200020" + "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" + "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" + "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" + "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" + "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" + "54ad7c427f7c220242818080807083220720037c22083703002000200242" + "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" + "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" + "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" + "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" + "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" + "8080808000200241013b010c200220013602082002200036020420024104" + "6a10f380808000000b6501017f23808080800041306b2202248080808000" + "200041306a200141306a41301086818080001a200041e0006a41e086c080" + "00200241004130108581808000220220012d006010908080800020002001" + "41301086818080001a200241306a2480808080000b25002000200141f087" + "c0800010df808080002000200110a98080800010d2808080003a00300be7" + "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" + "200229030022044200200129030022054200108781808000200341d0046a" + "20022903082206420020054200108781808000200341e0046a2002290310" + "2207420020054200108781808000200341f0046a20022903182208420020" + "05420010878180800020034180056a200229032022094200200542001087" + "8180800020034190056a2002290328220a42002005420010878180800020" + "0341a0056a20012903082205420020044200108781808000200341f0056a" + "2005420020064200108781808000200341c0066a20054200200742001087" + "8180800020034190076a2005420020084200108781808000200341e0076a" + "2005420020094200108781808000200341b0086a20054200200a42001087" + "81808000200341b0056a2001290310220542002004420010878180800020" + "034180066a2005420020064200108781808000200341d0066a2005420020" + "074200108781808000200341a0076a200542002008420010878180800020" + "0341f0076a2005420020094200108781808000200341c0086a2005420020" + "0a4200108781808000200341c0056a200129031822054200200442001087" + "8180800020034190066a2005420020064200108781808000200341e0066a" + "2005420020074200108781808000200341b0076a20054200200842001087" + "8180800020034180086a2005420020094200108781808000200341d0086a" + "20054200200a4200108781808000200341d0056a20012903202205420020" + "044200108781808000200341a0066a200542002006420010878180800020" + "0341f0066a2005420020074200108781808000200341c0076a2005420020" + "08420010878180800020034190086a200542002009420010878180800020" + "0341e0086a20054200200a4200108781808000200341e0056a2001290328" + "2205420020044200108781808000200341b0066a20054200200642001087" + "8180800020034180076a2005420020074200108781808000200341d0076a" + "2005420020084200108781808000200341a0086a20054200200942001087" + "81808000200341f0086a20054200200a4200108781808000200341b0046a" + "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" + "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" + "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" + "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" + "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" + "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" + "10878180800020034190046a200341b0046a41086a290300200520032903" + "b00422047c200454ad7c220720032903a0047c220520032903a005220820" + "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" + "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" + "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" + "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" + "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" + "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" + "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" + "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" + "20032903b0037c220520032903f005220d200341d0046a41086a29030020" + "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" + "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" + "7c220a20034190046a41086a290300200329039004220420067c200454ad" + "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" + "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" + "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" + "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" + "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" + "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" + "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" + "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" + "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" + "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" + "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" + "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" + "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" + "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" + "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" + "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" + "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" + "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" + "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" + "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" + "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" + "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" + "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" + "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" + "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" + "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" + "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" + "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" + "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" + "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" + "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" + "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" + "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" + "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" + "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" + "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" + "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" + "06201154ad7c22192003290390027c221120034180036a41086a29030020" + "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" + "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" + "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" + "032903607c220520034180056a41086a290300200d201354ad7c22172003" + "290390057c221020032903e0077c221220034190076a41086a290300200f" + "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" + "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" + "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" + "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" + "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" + "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" + "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" + "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" + "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" + "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" + "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" + "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" + "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" + "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" + "03002122200341b0086a41086a290300212320032903c008212420032903" + "8008212520032903c0072126200329038007212720032903d00221282003" + "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" + "076a41086a290300212b200341c0076a41086a290300212c20034180086a" + "41086a290300212d200341c0086a41086a290300212e20032903d008212f" + "200329039008213020032903d007213120032903e0012132200341e0016a" + "41086a290300213320032903f0012134200341f0016a41086a2903002135" + "20034180026a41086a2903002136200341d0076a41086a29030021372003" + "4190086a41086a2903002138200341d0086a41086a290300213920032903" + "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" + "00213d200329038001213e20034180016a41086a290300213f2003290390" + "01214020034190016a41086a2903002141200341a0016a41086a29030021" + "42200341a0086a41086a2903002143200341e0086a41086a290300214420" + "032903f008214520032903002146200341086a2903002147200329031021" + "48200341106a41086a29030021492003290320214a200341206a41086a29" + "0300214b2003290330214c200341306a41086a290300214d200320032903" + "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" + "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" + "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" + "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" + "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" + "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" + "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" + "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" + "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" + "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" + "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" + "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" + "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" + "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" + "1a370380092003204c204020342028202720262025202420232004204f54" + "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" + "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" + "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" + "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" + "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" + "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" + "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" + "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" + "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" + "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" + "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" + "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" + "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" + "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" + "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" + "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" + "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" + "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" + "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" + "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" + "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" + "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" + "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" + "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" + "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" + "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" + "b0096a2480808080000b3701017f20004100413010858180800021004101" + "10a3808080002101200041306a41e086c0800041301086818080001a2000" + "20013a00600b3a01017f23808080800041306b2201248080808000200020" + "0141004130108581808000220110db808080002100200141306a24808080" + "800020000b42002000200120022003109080808000200041306a20014130" + "6a200241306a2003109080808000200020022d006020012d006022027341" + "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" + "808080800020012d00c0012103410021042002410010a3808080003a0088" + "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" + "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" + "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" + "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" + "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" + "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" + "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" + "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" + "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" + "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" + "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" + "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" + "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" + "a3f9753703c80120022001200241c8016a200310d980808000200241c005" + "6a200210e880808000200241c8016a41c400410841a002108e8080800020" + "022802cc0121010240024020022802c8014101460d0020022802d0012105" + "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" + "026a200241c8011086818080002106200241003602b805200220053602b4" + "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" + "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" + "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" + "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" + "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" + "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" + "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" + "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" + "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" + "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" + "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" + "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" + "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" + "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" + "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" + "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" + "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" + "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" + "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" + "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" + "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" + "00200241a0156a20024180166a200241e0076a10bb808080002005200241" + "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" + "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" + "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" + "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" + "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" + "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" + "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" + "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" + "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" + "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" + "e2808080002008200241e0166a200241e0166a10bc808080002007200241" + "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" + "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" + "022802b80522013602e016200141c400470d01200020033a000c2000200b" + "290200370200200041086a200b41086a280200360200200241c0176a2480" + "808080000f0b200120022802d00141888cc08000108c80808000000b2002" + "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" + "7f2380808080004180036b2201248080808000200141a0026a41306a4100" + "41301085818080001a200141a0026a41e086c0800041301086818080001a" + "2001200141a0026a41e000108681808000220141e0006a410041c0011085" + "818080001a200041a0026a410041a0021085818080001a2000200141a002" + "1086818080001a20014180036a2480808080000bd70301157f2380808080" + "0041c00d6b2203248080808000200241e0036a210420024180036a210520" + "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" + "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" + "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" + "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" + "c0016a2112200341e0006a21132001280200211420012802082115034002" + "4020090d002001201541016a3602082000200241c0041086818080001a20" + "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" + "607210a380808000211720032002201641046a280200201641086a280200" + "201541cc8cc0800010ae80808000201428020010af808080002003418009" + "6a20032002201710b080808000201120132008201710b080808000201020" + "122007201710b080808000200341a00b6a200f2006201710b08080800020" + "0c200e2005201710b080808000200b200d2004201710b080808000200341" + "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" + "1086818080001a2002200341c0046a41c0041086818080001a200941786a" + "2109201441086a21140c000b0b22000240200120024b0d00200220012003" + "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" + "e00f6b22042480808080002004200241e000108681808000220441e0006a" + "200241e0006a41e0001086818080001a2004200341306a220510dd808080" + "00200441306a200510dd80808000200441e0006a200310dd808080002004" + "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" + "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" + "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" + "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" + "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" + "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" + "1086818080001a20044180066a200441e0006a200410bc80808000200441" + "e0066a2003200110c38080800020044180096a200441e0066a2002200441" + "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" + "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" + "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" + "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" + "e00f6a2480808080000b2700200020012002200310908080800020004130" + "6a200141306a200241306a20031090808080000b30002000200110e28080" + "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" + "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" + "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" + "ffd51e7c2206200420028420012903102207842001290318220884200129" + "03202209842001290328220a845022011b3703082000420042abd5feffff" + "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" + "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" + "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" + "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" + "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" + "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" + "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" + "01057f23808080800041c0016b2203248080808000200341306a22042001" + "41306a220510b280808000200320014130108681808000220341e0006a41" + "306a200241306a220641301086818080002107200341e0006a2002413010" + "86818080001a20002003200341e0006a10e1808080002004200541301086" + "818080001a200320014130108681808000220341e0006a20064130108681" + "8080001a2007200241301086818080001a200041306a2003200341e0006a" + "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" + "41a0086b22032480808080002003200241e0006a220420024190016a2205" + "10b980808000200341306a2004200510b880808000200341e0006a200241" + "c0016a2206200241f0016a220710b98080800020034190016a2006200710" + "b880808000200341e0036a41306a2208200141306a220910b28080800020" + "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" + "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" + "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" + "6a2210200141f0016a221110b280808000200341e0036a20014130108681" + "8080001a20034180066a41306a200241306a221241301086818080002113" + "20034180066a200241301086818080001a20034180066a41e0006a200341" + "90016a4130108681808000211420034180066a4190016a200341e0006a41" + "30108681808000211520034180066a41c0016a200341306a413010868180" + "8000211620034180066a41f0016a200341301086818080002117200341c0" + "016a200341e0036a20034180066a10ea8080800020082009413010868180" + "80002108200b200a41301086818080002118200c200d4130108681808000" + "210b200f200e4130108681808000210f201020114130108681808000210c" + "200341e0036a200141301086818080001a20034180066a20124130108681" + "8080001a20132002413010868180800021102014200341e0006a41301086" + "818080002113201520034190016a41301086818080002114201620034130" + "10868180800021152017200341306a41301086818080002116200341c001" + "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" + "80002018200a41301086818080002117200b200d10b280808000200f200e" + "4130108681808000210f200c201110b280808000200341e0036a20014130" + "1086818080001a20034180066a200441301086818080001a201020054130" + "108681808000211020142012413010868180800021142013200241301086" + "818080002113201520034190016a413010868180800021152016200341e0" + "006a41301086818080002116200341a0026a200341e0036a20034180066a" + "10ea8080800020082009413010868180800021082017200a413010868180" + "80002117200b200d4130108681808000210b200f200e4130108681808000" + "210f200c20114130108681808000210c200341e0036a2001413010868180" + "80001a20034180066a200541301086818080001a20102004413010868180" + "800021102013201241301086818080002113201420024130108681808000" + "21142015200341e0006a41301086818080002115201620034190016a4130" + "1086818080002116200341a0026a41306a200341e0036a20034180066a10" + "ea808080002008200910b2808080002017200a4130108681808000211720" + "0b200d10b280808000200f200e4130108681808000210f200c201110b280" + "808000200341e0036a200141301086818080001a20034180066a20064130" + "1086818080001a2010200741301086818080002110201320044130108681" + "808000211320142005413010868180800021142016201241301086818080" + "002116201520024130108681808000211520034180036a200341e0036a20" + "034180066a10ea808080002008200941301086818080001a2017200a4130" + "1086818080001a200b200d41301086818080001a200f200e413010868180" + "80001a200c201141301086818080001a200341e0036a2001413010868180" + "80001a20034180066a200741301086818080001a20102006413010868180" + "80001a2013200541301086818080001a2014200441301086818080001a20" + "15201241301086818080001a2016200241301086818080001a2003418003" + "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" + "41e000108681808000220241e0006a200341a0026a41e000108681808000" + "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" + "80808080000bb30301027f23808080800041e0066b220224808080800020" + "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" + "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" + "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" + "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" + "6a2003200110b380808000200241e0036a20024180036a20024180036a10" + "bc80808000200241c0046a200110ba8080800020024180066a200241e003" + "6a200241e0036a41306a220110b88080800020024180066a41306a220320" + "0241e0036a200110b980808000200020024180066a200210bc8080800020" + "024180066a200241c0046a200241c0046a41306a220110b8808080002003" + "200241c0046a200110b980808000200041e0006a20024180066a200241c0" + "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" + "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" + "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" + "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" + "80800041e0006b22022480808080002002200141c0016a2203200141f001" + "6a220410b880808000200241306a2003200410b980808000200041c0016a" + "200141e0006a41e0001086818080001a2000200241e00010868180800041" + "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" + "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" + "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" + "0b3601017f23808080800041306b22032480808080002003200210b28080" + "800020002003200110b980808000200341306a2480808080000b87020201" + "7f0c7e23808080800041306b220324808080800020012903082104200229" + "030821052002290328210620012903282107200229032021082001290320" + "21092002290318210a2001290318210b2002290310210c2001290310210d" + "20032002290300220e20012903007c220f3703002003200520047c220420" + "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" + "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" + "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" + "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" + "00200310d680808000200341306a2480808080000b7401027f2380808080" + "004190016b220224808080800020022001200141306a220310b980808000" + "200241306a2001200310b880808000200241e0006a2001200110b9808080" + "0020002002200241306a10a780808000200041306a200241e0006a200310" + "a78080800020024190016a2480808080000b230020002001200210b88080" + "8000200041306a200141306a200241306a10b8808080000b230020002001" + "200210b980808000200041306a200141306a200241306a10b9808080000b" + "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" + "6a200129030822034200200129030022044200108781808000200241d004" + "6a20012903102205420020044200108781808000200241e0046a20012903" + "182206420020044200108781808000200241f0046a200129032022074200" + "2004420010878180800020024180056a2001290328220842002004420010" + "8781808000200241a0056a2005420020034200108781808000200241b005" + "6a2006420020034200108781808000200241c0056a200742002003420010" + "8781808000200241d0056a2008420020034200108781808000200241f005" + "6a200642002005420010878180800020024180066a200742002005420010" + "878180800020024190066a2008420020054200108781808000200241b006" + "6a2007420020064200108781808000200241c0066a200842002006420010" + "8781808000200241e0066a20084200200742001087818080002002419005" + "6a2004420020044200108781808000200241e0056a200342002003420010" + "8781808000200241a0066a2005420020054200108781808000200241d006" + "6a2006420020064200108781808000200241f0066a200742002007420010" + "878180800020024180076a2008420020084200108781808000200241b004" + "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" + "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" + "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" + "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" + "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" + "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" + "00108781808000200241d0036a20024190056a41086a2903002209200229" + "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" + "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" + "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" + "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" + "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" + "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" + "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" + "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" + "220a20022903e005220b20022903d004220c200241c0046a41086a290300" + "7c22074201862008423f88847c22082004200954ad7c2209200229039004" + "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" + "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" + "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" + "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" + "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" + "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" + "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" + "81808000200241c0026a20022903a003220f200241e0056a41086a290300" + "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" + "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" + "423f88847c22072002290380047c220b20024190046a41086a290300200d" + "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" + "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" + "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" + "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" + "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" + "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" + "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" + "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" + "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" + "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" + "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" + "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" + "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" + "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" + "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" + "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" + "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" + "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" + "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" + "290300200b201054ad7c22182002290380057c220720022903c0057c220e" + "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" + "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" + "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" + "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" + "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" + "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" + "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" + "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" + "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" + "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" + "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" + "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" + "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" + "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" + "200241d0066a41086a290300211920024180066a41086a290300211a2002" + "41d0056a41086a290300211b200229039006211c20022903b006211d2002" + "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" + "03002120200241b0066a41086a290300212120024190066a41086a290300" + "212220022903c006212320022903f006210320022903f0012124200241f0" + "016a41086a2903002125200229038002212620024180026a41086a290300" + "212720024190026a41086a2903002128200241c0066a41086a2903002129" + "20022903e006212a200241f0066a41086a290300212b200229038001212c" + "20024180016a41086a290300212d200229039001212e20024190016a4108" + "6a290300212f20022903a0012130200241a0016a41086a29030021312002" + "41b0016a41086a2903002132200241e0066a41086a290300213320022903" + "8007211120022903102134200241106a41086a2903002135200229032021" + "36200241206a41086a290300213720022903302138200241306a41086a29" + "030021392002290340213a200241c0006a41086a290300213b2002200229" + "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" + "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" + "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" + "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" + "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" + "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" + "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" + "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" + "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" + "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" + "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" + "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" + "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" + "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" + "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" + "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" + "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" + "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" + "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" + "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" + "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" + "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" + "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" + "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" + "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" + "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" + "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" + "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" + "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" + "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" + "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" + "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" + "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" + "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" + "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" + "076a10d680808000200241c0076a2480808080000be60101037f23808080" + "80004180126b220324808080800020032001200210b480808000200341a0" + "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" + "2002200510c380808000200341e0066a2004200110c38080800020034180" + "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" + "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" + "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" + "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" + "20034180126a2480808080000b3c01017f23808080800041c0046b220224" + "808080800020022000200110be808080002000200241c004108681808000" + "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" + "022480808080002002200141e000108681808000220241e0006a200141e0" + "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" + "001086818080001a200241a0026a200141a0026a220541e0001086818080" + "001a20024180036a20014180036a220641e0001086818080001a200241e0" + "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" + "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" + "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" + "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" + "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" + "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" + "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" + "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" + "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" + "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" + "200241a0086a200841e0001086818080001a200241e0006a20024180066a" + "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" + "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" + "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" + "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" + "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" + "808000200241a00b6a41306a200241a0086a200110b98080800020024180" + "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" + "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" + "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" + "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" + "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" + "8080800020024180096a200241e0001086818080001a20024180096a41e0" + "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" + "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" + "86818080001a200820024180036a41e0001086818080001a200241a00b6a" + "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" + "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" + "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" + "8080808000200210ac8080800041002103413f2104034002400240024020" + "04417f460d0042012004413f71ad8642808084808080c080528321052003" + "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" + "8080002000200241a0021086818080001a20024180096a2480808080000f" + "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" + "80001a410121030b02402005500d002002200110bf808080000b2004417f" + "6a21040c000b0b23002000200110db80808000200041306a200141306a10" + "db808080007110a3808080000b3e0020002001200210bc80808000200041" + "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" + "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" + "2202248080808000200141086a21030340200241086a200310e680808000" + "02400240024020022d0008450d0020022d00092101410121040c010b0240" + "20012802002204450d00200420012802042205470d020b2002200141146a" + "10e68080800020022d0001210120022d000021040b200020013a00012000" + "20044101713a0000200241106a2480808080000f0b200142808080808001" + "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" + "23808080800041106b220324808080800041002104410121054100210602" + "400340200120062207460d01200341086a200210d080808000200741016a" + "210620032d00080d000b200120076b2104410021050b2000200436020420" + "002005360200200341106a2480808080000bf50401037f23808080800041" + "b0096b22022480808080002002200141306a220310bd8080800020024130" + "6a2002200210b980808000200241e0006a200241306a200241306a10b980" + "80800020024190016a200241e0006a200241e0006a10b980808000200241" + "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" + "808000200241d0086a200241f0016a200241f0016a10b980808000200241" + "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" + "80096a20024180096a10b980808000200241a0026a200241c0076a200241" + "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" + "80800020024180036a2002200241a0026a10b980808000200241b0036a20" + "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" + "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" + "b980808000200241c0046a200220024190046a10b880808000200241f004" + "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" + "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" + "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" + "024180066a20024180066a10b980808000200241b0066a41306a200241a0" + "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" + "86818080001a200241c0076a410041301085818080001a200241c0076a41" + "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" + "301086818080001a2000200241b0066a200241c0076a200410a980808000" + "10c880808000200241b0096a2480808080000bf60601057f238080808000" + "41900d6b220324808080800020032001200210a780808000200341306a20" + "0141306a2204200241306a220510a780808000200341e0006a200141e000" + "6a2206200241e0006a220710a78080800020034190016a2001200410b980" + "808000200341c0016a2002200510b980808000200341f0016a2003419001" + "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" + "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" + "036a2004200610b980808000200341b0036a2005200710b9808080002003" + "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" + "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" + "90046a10b880808000200341f0046a2001200610b980808000200341a005" + "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" + "a78080800020034180066a2003200341e0006a10b980808000200341b006" + "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" + "b98080800020034190076a200341e0066a200310b980808000200341800c" + "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" + "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" + "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" + "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" + "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" + "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" + "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" + "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" + "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" + "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" + "00200341e0096a200341d0086a20034190076a10a780808000200341900a" + "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" + "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" + "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" + "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" + "2480808080000b41002000200120022003109080808000200041306a2001" + "41306a200241306a2003109080808000200041e0006a200141e0006a2002" + "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" + "280200220241787122006a21030240024020024101710d00200241027145" + "0d012001280200220220006a21000240200120026b2201410028029c97c0" + "8000470d0020032802044103714103470d014100200036029497c0800020" + "032003280204417e7136020420012000410172360204200320003602000f" + "0b2001200210cc808080000b024002400240024002400240200328020422" + "024102710d00200341002802a097c08000460d022003410028029c97c080" + "00460d0320032002417871220210cc808080002001200220006a22004101" + "72360204200120006a20003602002001410028029c97c08000470d014100" + "200036029497c080000f0b20032002417e71360204200120004101723602" + "04200120006a20003602000b2000418002490d0220012000108481808000" + "41002101410041002802b497c08000417f6a22003602b497c0800020000d" + "04024041002802fc94c080002200450d00410021010340200141016a2101" + "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" + "80000f0b410020013602a097c080004100410028029897c0800020006a22" + "0036029897c080002001200041017236020402402001410028029c97c080" + "00470d004100410036029497c080004100410036029c97c080000b200041" + "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" + "02410028029897c0800022054129490d0241f494c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b2001280208" + "21010c000b0b4100200136029c97c080004100410028029497c080002000" + "6a220036029497c0800020012000410172360204200120006a2000360200" + "0f0b200041f80171418495c080006a210302400240410028028c97c08000" + "220241012000410376742200710d004100200220007236028c97c0800020" + "0321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802fc94c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff" + "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" + "c080000b0b4d01017f23808080800041206b220224808080800020024100" + "36021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110a480808000000b800601057f0240" + "024002402000417c6a220328020022044178712205410441082004410371" + "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" + "02410b6a4178712002410b491b210102400240024020060d002001418002" + "490d0120052001410472490d01200520016b418180084f0d010c020b2000" + "41786a220720056a21060240024002400240200520014f0d002006410028" + "02a097c08000460d032006410028029c97c08000460d0220062802042204" + "4102710d042004417871220420056a22052001490d042006200410cc8080" + "8000200520016b22024110490d0120032001200328020041017172410272" + "360200200720016a22012002410372360204200720056a22052005280204" + "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" + "0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210cd8080800020000f0b" + "20032005200328020041017172410272360200200720056a220220022802" + "0441017236020420000f0b410028029497c0800020056a22052001490d01" + "02400240200520016b2202410f4b0d002003200441017120057241027236" + "0200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236" + "0204200720056a2205200236020020052005280204417e713602040b4100" + "200136029c97c080004100200236029497c0800020000f0b410028029897" + "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" + "0f0b20052000417c4178200328020022014103711b20014178716a220120" + "0220012002491b1086818080002102200010c980808000200221000b2000" + "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" + "93c0800010ca80808000000b200320012004410171724102723602002007" + "20016a2202200520016b22054101723602044100200536029897c0800041" + "0020023602a097c0800020000b820301047f200028020c21020240024002" + "402001418002490d002000280218210302400240024020022000470d0020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000" + "2802082201200236020c200220013602080c010b200041146a200041106a" + "20021b21040340200421052001220241146a200241106a20022802142201" + "1b210420024114411020011b6a28020022010d000b200541003602000b20" + "03450d020240200028021c41027441f493c080006a22012802002000460d" + "0020034110411420032802102000461b6a20023602002002450d030c020b" + "2001200236020020020d014100410028029097c08000417e200028021c77" + "7136029097c080000c020b0240200220002802082204460d002004200236" + "020c200220043602080f0b4100410028028c97c08000417e200141037677" + "7136028c97c080000f0b20022003360218024020002802102201450d0020" + "022001360210200120023602180b20002802142201450d00200220013602" + "14200120023602180f0b0ba00401027f200020016a210202400240200028" + "020422034101710d002003410271450d012000280200220320016a210102" + "40200020036b2200410028029c97c08000470d0020022802044103714103" + "470d014100200136029497c0800020022002280204417e71360204200020" + "01410172360204200220013602000c020b2000200310cc808080000b0240" + "024002400240200228020422034102710d00200241002802a097c0800046" + "0d022002410028029c97c08000460d0320022003417871220310cc808080" + "002000200320016a2201410172360204200020016a200136020020004100" + "28029c97c08000470d014100200136029497c080000f0b20022003417e71" + "36020420002001410172360204200020016a20013602000b024020014180" + "02490d00200020011084818080000f0b200141f80171418495c080006a21" + "0202400240410028028c97c08000220341012001410376742201710d0041" + "00200320017236028c97c08000200221010c010b200228020821010b2002" + "20003602082001200036020c2000200236020c200020013602080f0b4100" + "20003602a097c080004100410028029897c0800020016a220136029897c0" + "8000200020014101723602042000410028029c97c08000470d0141004100" + "36029497c080004100410036029c97c080000f0b4100200036029c97c080" + "004100410028029497c0800020016a220136029497c08000200020014101" + "72360204200020016a20013602000f0b0bc12502087f017e024002400240" + "02400240024002400240200041f4014b0d00410028028c97c08000220141" + "102000410b6a41f803712000410b491b220241037622037622004103710d" + "012002410028029497c080004d0d0720000d02410028029097c080002200" + "0d030c070b2000410b6a22034178712102410028029097c080002204450d" + "06411f21050240200041f4ffff074b0d002002410620034108766722006b" + "7641017120004101746b413e6a21050b410020026b210302402005410274" + "41f493c080006a28020022010d0041002100410021060c040b4100210020" + "024100411920054101766b2005411f461b74210741002106034002402001" + "220128020441787122082002490d00200820026b220820034f0d00200821" + "032001210620080d004100210320012106200121000c060b200128021422" + "082000200820012007411d764104716a41106a2802002201471b20002008" + "1b2100200741017421072001450d040c000b0b024002402000417f734101" + "7120036a22074103742200418495c080006a22022000418c95c080006a28" + "020022032802082206460d002006200236020c200220063602080c010b41" + "002001417e2007777136028c97c080000b20032000410372360204200320" + "006a22002000280204410172360204200341086a0f0b0240024020002003" + "7441022003742200410020006b72716822084103742203418495c080006a" + "22062003418c95c080006a28020022002802082207460d00200720063602" + "0c200620073602080c010b41002001417e2008777136028c97c080000b20" + "002002410372360204200020026a2207200320026b220241017236020420" + "0020036a20023602000240410028029497c080002201450d002001417871" + "418495c080006a2106410028029c97c08000210302400240410028028c97" + "c08000220841012001410376742201710d004100200820017236028c97c0" + "8000200621010c010b200628020821010b20062003360208200120033602" + "0c2003200636020c200320013602080b4100200736029c97c08000410020" + "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" + "00220628020441787120026b210320062101024002400340024020062802" + "1022000d00200628021422000d0020012802182105024002400240200128" + "020c22002001470d00200141144110200128021422001b6a28020022060d" + "01410021000c020b20012802082206200036020c200020063602080c010b" + "200141146a200141106a20001b21070340200721082006220041146a2000" + "41106a200028021422061b210720004114411020061b6a28020022060d00" + "0b200841003602000b2005450d030240200128021c41027441f493c08000" + "6a22062802002001460d0020054110411420052802102001461b6a200036" + "02002000450d040c030b2006200036020020000d024100410028029097c0" + "8000417e200128021c777136029097c080000c030b200028020441787120" + "026b22062003200620034922061b21032000200120061b2101200021060c" + "000b0b20002005360218024020012802102206450d002000200636021020" + "0620003602180b20012802142206450d0020002006360214200620003602" + "180b02400240024020034110490d0020012002410372360204200120026a" + "22022003410172360204200220036a2003360200410028029497c0800022" + "07450d012007417871418495c080006a2106410028029c97c08000210002" + "400240410028028c97c08000220841012007410376742207710d00410020" + "0820077236028c97c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200120" + "0320026a2200410372360204200120006a22002000280204410172360204" + "0c010b4100200236029c97c080004100200336029497c080000b20014108" + "6a0f0b024020002006720d004100210641022005742200410020006b7220" + "04712200450d0320006841027441f493c080006a28020021000b2000450d" + "010b0340200020062000280204417871220120026b220820034922051b21" + "04200120024921072008200320051b21080240200028021022010d002000" + "28021421010b2006200420071b21062003200820071b2103200121002001" + "0d000b0b2006450d000240410028029497c0800022002002490d00200320" + "0020026b4f0d010b20062802182105024002400240200628020c22002006" + "470d00200641144110200628021422001b6a28020022010d01410021000c" + "020b20062802082201200036020c200020013602080c010b200641146a20" + "0641106a20001b21070340200721082001220041146a200041106a200028" + "021422011b210720004114411020011b6a28020022010d000b2008410036" + "02000b02402005450d0002400240200628021c41027441f493c080006a22" + "012802002006460d0020054110411420052802102006461b6a2000360200" + "2000450d020c010b2001200036020020000d004100410028029097c08000" + "417e200628021c777136029097c080000c010b2000200536021802402006" + "2802102201450d0020002001360210200120003602180b20062802142201" + "450d0020002001360214200120003602180b0240024020034110490d0020" + "062002410372360204200620026a22002003410172360204200020036a20" + "0336020002402003418002490d00200020031084818080000c020b200341" + "f80171418495c080006a210202400240410028028c97c080002201410120" + "03410376742203710d004100200120037236028c97c08000200221030c01" + "0b200228020821030b200220003602082003200036020c2000200236020c" + "200020033602080c010b2006200320026a2200410372360204200620006a" + "220020002802044101723602040b200641086a0f0b024002400240024002" + "4002400240410028029497c08000220020024f0d000240410028029897c0" + "8000220020024b0d0041002100200241af80046a22064110764000220341" + "7f4622070d0720034110742201450d07410041002802a497c08000410020" + "064180807c7120071b22086a22003602a497c08000410041002802a897c0" + "800022032000200320004b1b3602a897c0800002400240024041002802a0" + "97c080002203450d0041f494c08000210003402000280200220620002802" + "0422076a2001460d02200028020822000d000c030b0b0240024041002802" + "b097c080002200450d00200020014d0d010b410020013602b097c080000b" + "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" + "94c080004100418495c0800036029095c080004100418c95c08000360298" + "95c080004100418495c0800036028c95c080004100419495c080003602a0" + "95c080004100418c95c0800036029495c080004100419c95c080003602a8" + "95c080004100419495c0800036029c95c08000410041a495c080003602b0" + "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" + "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" + "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" + "95c08000410041b495c080003602bc95c080004100410036028095c08000" + "410041c495c080003602d095c08000410041bc95c080003602c495c08000" + "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" + "410041cc95c080003602d495c08000410041d495c080003602e095c08000" + "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" + "410041dc95c080003602e495c08000410041e495c080003602f095c08000" + "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" + "410041ec95c080003602f495c08000410041f495c0800036028096c08000" + "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" + "410041fc95c0800036028496c080004100418496c0800036029096c08000" + "4100418c96c0800036029896c080004100418496c0800036028c96c08000" + "4100419496c080003602a096c080004100418c96c0800036029496c08000" + "4100419c96c080003602a896c080004100419496c0800036029c96c08000" + "410041a496c080003602b096c080004100419c96c080003602a496c08000" + "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" + "410041b496c080003602c096c08000410041ac96c080003602b496c08000" + "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" + "410041c496c080003602d096c08000410041bc96c080003602c496c08000" + "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" + "410041d496c080003602e096c08000410041cc96c080003602d496c08000" + "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" + "410041e496c080003602f096c08000410041dc96c080003602e496c08000" + "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" + "410041f496c0800036028097c08000410041ec96c080003602f496c08000" + "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" + "410020013602a097c08000410041fc96c0800036028497c0800041002008" + "41586a220036029897c0800020012000410172360204200120006a412836" + "0204410041808080013602ac97c080000c080b200320014f0d0020062003" + "4b0d00200028020c450d030b410041002802b097c0800022002001200020" + "01491b3602b097c08000200120086a210641f494c0800021000240024002" + "400340200028020022072006460d01200028020822000d000c020b0b2000" + "28020c450d010b41f494c080002100024003400240200028020022062003" + "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" + "410020013602a097c080004100200841586a220036029897c08000200120" + "00410172360204200120006a4128360204410041808080013602ac97c080" + "002003200641606a41787141786a22002000200341106a491b2207411b36" + "020441002902f494c080002109200741106a41002902fc94c08000370200" + "20072009370208410020083602f894c08000410020013602f494c0800041" + "00200741086a3602fc94c080004100410036028095c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072003460d07" + "20072007280204417e713602042003200720036b22004101723602042007" + "200036020002402000418002490d00200320001084818080000c080b2000" + "41f80171418495c080006a210602400240410028028c97c0800022014101" + "2000410376742200710d004100200120007236028c97c08000200621000c" + "010b200628020821000b200620033602082000200336020c200320063602" + "0c200320003602080c070b200020013602002000200028020420086a3602" + "04200120024103723602042007410f6a41787141786a2206200120026a22" + "006b2103200641002802a097c08000460d032006410028029c97c0800046" + "0d040240200628020422024103714101470d0020062002417871220210cc" + "80808000200220036a2103200620026a220628020421020b20062002417e" + "7136020420002003410172360204200020036a2003360200024020034180" + "02490d00200020031084818080000c060b200341f80171418495c080006a" + "210202400240410028028c97c08000220641012003410376742203710d00" + "4100200620037236028c97c08000200221030c010b200228020821030b20" + "0220003602082003200036020c2000200236020c200020033602080c050b" + "4100200020026b220336029897c08000410041002802a097c08000220020" + "026a22063602a097c0800020062003410172360204200020024103723602" + "04200041086a21000c060b410028029c97c0800021030240024020002002" + "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" + "20032000410372360204200320006a220020002802044101723602040c01" + "0b4100200636029497c080004100200320026a220136029c97c080002001" + "2006410172360204200320006a2006360200200320024103723602040b20" + "0341086a0f0b2000200720086a360204410041002802a097c08000220041" + "0f6a417871220341786a22063602a097c080004100200020036b41002802" + "9897c0800020086a22036a41086a220136029897c0800020062001410172" + "360204200020036a4128360204410041808080013602ac97c080000c030b" + "410020003602a097c080004100410028029897c0800020036a2203360298" + "97c08000200020034101723602040c010b4100200036029c97c080004100" + "410028029497c0800020036a220336029497c08000200020034101723602" + "04200020036a20033602000b200141086a0f0b41002100410028029897c0" + "8000220320024d0d004100200320026b220336029897c080004100410028" + "02a097c08000220020026a22063602a097c0800020062003410172360204" + "20002002410372360204200041086a0f0b20000b4301017f238080808000" + "41206b2201248080808000200141003602182001410136020c200141d085" + "c0800036020820014204370210200141086a200010a480808000000b4e01" + "037f024020012802042202200128020822034e0d0020012003417f6a2204" + "36020820012802002d000020044107717641017110a38080800021040b20" + "0020043a0001200020022003483a00000b18002001200085220042002000" + "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" + "0202017f017e23808080800041f0006b2206248080808000200620013602" + "0c2006200036020820062003360214200620023602102006410236021c20" + "0641c08dc08000360218024020042802000d002006410336025c200641f4" + "8dc08000360258200642033702642006418280808000ad42208622072006" + "41106aad8437034820062007200641086aad843703402006418380808000" + "ad422086200641186aad843703382006200641386a360260200641d8006a" + "200510a480808000000b200641206a41106a200441106a29020037030020" + "0641206a41086a200441086a290200370300200620042902003703202006" + "410436025c200641a88ec080003602582006420437026420064182808080" + "00ad4220862207200641106aad8437035020062007200641086aad843703" + "482006418480808000ad422086200641206aad8437034020064183808080" + "00ad422086200641186aad843703382006200641386a360260200641d800" + "6a200510a480808000000bb30301037f2380808080004180016b22022480" + "8080800020002802002100024002400240200128021422034110710d0020" + "03412071450d0120002d0000210341810121000340200220006a417e6a20" + "03410f712204413072200441376a2004410a491b3a0000200341ff017122" + "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" + "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" + "00210341810121000340200220006a417e6a2003410f7122044130722004" + "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" + "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" + "810120006b10d58080800021000c010b024002400240024020002d000022" + "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" + "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" + "0d01200321040b200220006a20044130723a00000c010b41012100200220" + "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" + "0041037310d58080800021000b20024180016a24808080800020000bb605" + "01087f20002802142205410171220620046a21070240024020054104710d" + "00410021010c010b0240024020020d00410021080c010b02402002410371" + "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" + "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" + "8080c40020061b2106024020002802000d000240200028021c220a200028" + "0220220820062001200210f480808000450d0041010f0b200a2003200420" + "0828020c11808080800080808080000f0b02400240024002402000280204" + "220a20074b0d00200028021c220a2000280220220820062001200210f480" + "808000450d0141010f0b2005410871450d01200028021021052000413036" + "021020002d0018210b4101210c200041013a0018200028021c2208200028" + "0220220920062001200210f4808080000d02200a20076b41016a210a0240" + "0340200a417f6a220a450d01200841302009280210118180808000808080" + "8000450d000b41010f0b0240200820032004200928020c11808080800080" + "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" + "0a20032004200828020c1180808080008080808000210c0c010b200a2007" + "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" + "01020b2005210a410021050c010b2005410176210a200541016a41017621" + "050b200a41016a210a2000280210210720002802202108200028021c2109" + "02400340200a417f6a220a450d0120092007200828021011818080800080" + "80808000450d000b41010f0b4101210c2009200820062001200210f48080" + "80000d00200920032004200828020c11808080800080808080000d004100" + "210a034002402005200a470d0020052005490f0b200a41016a210a200920" + "0720082802101181808080008080808000450d000b200a417f6a2005490f" + "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" + "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" + "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" + "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" + "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" + "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" + "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" + "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" + "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" + "83420020057d2205200e83843703282000200c2002832005200d83843703" + "202000200a2002832005200b838437031820002008200283200520098384" + "370310200020062002832005200783843703082000200320028320052004" + "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" + "80800021010b20002002360204200020013602000b5a01017f2380808080" + "0041106b2202248080808000200241086a20002000280200410141a00210" + "8b80808000024020022802082200418180808078460d002000200228020c" + "2001108c80808000000b200241106a2480808080000b4800200020012002" + "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" + "80808000200020022d00c00120012d00c001220273410020036b71200273" + "3a00c0010b2b00200020012002200310b080808000200020022d00602001" + "2d0060220273410020036b712002733a00600b8501002000290300200129" + "030010d1808080002000290308200129030810d1808080007110a3808080" + "002000290310200129031010d1808080007110a380808000200029031820" + "0129031810d1808080007110a3808080002000290320200129032010d180" + "8080007110a3808080002000290328200129032810d1808080007110a380" + "8080000bda0602017f067e23808080800041306b22022480808080002002" + "2001290000220342388620034280fe0383422886842003428080fc078342" + "1886200342808080f80f834208868484200342088842808080f80f832003" + "421888428080fc07838420034228884280fe038320034238888484842204" + "37032820022001290008220342388620034280fe03834228868420034280" + "80fc0783421886200342808080f80f834208868484200342088842808080" + "f80f832003421888428080fc07838420034228884280fe03832003423888" + "848484220537032020022001290010220342388620034280fe0383422886" + "842003428080fc0783421886200342808080f80f83420886848420034208" + "8842808080f80f832003421888428080fc07838420034228884280fe0383" + "2003423888848484220637031820022001290018220342388620034280fe" + "0383422886842003428080fc0783421886200342808080f80f8342088684" + "84200342088842808080f80f832003421888428080fc0783842003422888" + "4280fe038320034238888484842207370310200220012900202203423886" + "20034280fe0383422886842003428080fc0783421886200342808080f80f" + "834208868484200342088842808080f80f832003421888428080fc078384" + "20034228884280fe03832003423888848484220837030820022001290028" + "220342388620034280fe0383422886842003428080fc0783421886200342" + "808080f80f834208868484200342088842808080f80f8320034218884280" + "80fc07838420034228884280fe0383200342388884848422033703002002" + "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" + "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" + "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" + "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" + "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" + "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" + "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" + "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" + "3010868180800020013a0030200241306a2480808080000b3901017f2380" + "8080800041306b220224808080800020022000200110a780808000200020" + "0241301086818080001a200241306a2480808080000b9b1602017f177e23" + "808080800041a0056b2201248080808000200141b0046a20002903002202" + "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" + "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" + "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" + "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" + "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" + "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" + "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" + "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" + "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" + "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" + "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" + "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" + "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" + "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" + "0129039004220720002903107c2208200141a0046a41086a290300200520" + "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" + "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" + "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" + "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" + "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" + "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" + "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" + "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" + "200129038004220b20002903187c220420014190046a41086a2903002008" + "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" + "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" + "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" + "6a20012903b002220d20012903f003220e20002903207c22062001418004" + "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" + "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" + "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" + "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" + "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" + "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" + "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" + "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" + "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" + "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" + "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" + "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" + "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" + "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" + "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" + "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" + "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" + "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" + "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" + "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" + "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" + "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" + "808000200141b0016a41086a290300210d20014190026a41086a29030021" + "0e200141f0026a41086a2903002111200141086a290300211220012903e0" + "022113200129038002211420012903a001211520012903402116200141c0" + "006a41086a2903002117200120012903502218200141e0036a41086a2903" + "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" + "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" + "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" + "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" + "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" + "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" + "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" + "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" + "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" + "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" + "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" + "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" + "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" + "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" + "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" + "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" + "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" + "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" + "20012903207c2202200141306a41086a2903002006200454ad7c20082006" + "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" + "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" + "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" + "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" + "f0046a10d68080800020012903c004220342aad580808080a080237c2003" + "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" + "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" + "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" + "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" + "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" + "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" + "423f872203200320012903e80422057c2203200554ad7c200342b399809a" + "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" + "2100200141a0056a24808080800020000bb60103037f017e017f23808080" + "800041e0006b2203248080808000200341e086c080004130108681808000" + "2104200241306a21050240034020052002460d01200541786a2205290300" + "2106413f210303402003417f460d01200441306a200410bd808080002004" + "200441306a41301086818080002107024020062003413f71ad8842018350" + "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" + "301086818080001a200441e0006a2480808080000b1c00200010a9808080" + "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" + "7e017f027e23808080800041f0016b220324808080800041002104420021" + "05420021064200210742002108420021094200210a02400340200441054b" + "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" + "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" + "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" + "200441e8006a2903004200200f420010878180800020034190016a200441" + "f0006a2903004200200f420010878180800020034180016a200441f8006a" + "2903004200200f4200108781808000200341f0006a20044180016a290300" + "4200200f4200108781808000200341e0006a20044188016a290300420020" + "0f4200108781808000200d200341e0006a41086a29030020032903602210" + "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" + "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" + "01221020087c2209201054ad7c200920034190016a41086a290300200329" + "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" + "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" + "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" + "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" + "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" + "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" + "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" + "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" + "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" + "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" + "bdc4801a4200108781808000200d200341086a2903002003290300221020" + "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" + "097c220a201054ad7c200a200341206a41086a2903002003290320221020" + "087c2209201054ad7c2009200341306a41086a2903002003290330221020" + "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" + "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" + "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" + "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" + "2003200a3703e801200320093703e001200320083703d801200320073703" + "d001200320063703c801200320053703c0012000200341c0016a10d68080" + "8000200341f0016a2480808080000b1c002000200110b280808000200041" + "306a200141306a10b2808080000be20103037f017e017f23808080800041" + "c0016b2203248080808000200341306a410041301085818080001a200341" + "e086c0800041301086818080002104200241306a21050240034020052002" + "460d01200541786a22052903002106413f210303402003417f460d012004" + "41e0006a200410ba808080002004200441e0006a41e00010868180800021" + "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" + "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" + "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" + "000b900202017f017e23808080800041b0036b2202248080808000200241" + "004130108581808000220241e0006a410041301085818080001a20024130" + "6a41e086c0800041301086818080001a20024190016a2001419001108681" + "8080001a42808082808080a080e90021030240034020034200510d012002" + "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" + "011086818080001a02402003420183500d00200241a0026a200220024190" + "016a10c7808080002002200241a0026a4190011086818080001a0b200342" + "018821030c000b0b200241a0026a200210e58080800020002002200241a0" + "026a41900110868180800022024190011086818080001a200241b0036a24" + "80808080000b3400200041306a200141306a10b280808000200041e0006a" + "200141e0006a41301086818080001a2000200141301086818080001a0b6b" + "01037f23808080800041106b22022480808080000240024020012802000d" + "00410021030c010b200241086a200110d0808080004101210320022d0009" + "210420022d00080d0041002103200141003602000b200020043a00012000" + "20033a0000200241106a2480808080000b7501027f23808080800041e000" + "6b2201248080808000200141306a410041301085818080001a200141e086" + "c0800041301086818080002101410110a38080800021022000410041e000" + "108581808000220041e0006a200141e0001086818080001a200020023a00" + "c001200141e0006a2480808080000b920101017f23808080800041c0016b" + "2202248080808000200041e0006a200141e0006a41e0001086818080001a" + "200241306a410041301085818080001a200241e086c08000413010868180" + "8000220241e0006a410041e0001085818080001a200041c0016a20022002" + "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" + "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" + "24808080800020042001200210b380808000200441e0006a200141e0006a" + "2205200310b38080800020044180036a200141c0016a2206200310b38080" + "8000200441a0026a20044180036a20044180036a41306a220710b8808080" + "00200441a0026a41306a20044180036a200710b9808080002000200441a0" + "026a200410bc80808000200441a0026a2002200310bc8080800020044180" + "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" + "10b38080800020044180036a200441c0016a200410bb80808000200041e0" + "006a20044180036a200441e0006a10bb8080800020044180036a20062002" + "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" + "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" + "8080800041f0016b22032480808080004100210442002105420021064200" + "210742002108420021094200210a02400340200441054b0d012004200441" + "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" + "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" + "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" + "03004200200f420010878180800020034190016a200441b0026a29030042" + "00200f420010878180800020034180016a200441b8026a2903004200200f" + "4200108781808000200341f0006a200441c0026a2903004200200f420010" + "8781808000200341e0006a200441c8026a2903004200200f420010878180" + "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" + "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" + "1054ad7c200a20034180016a41086a290300200329038001221020087c22" + "09201054ad7c200920034190016a41086a29030020032903900122102007" + "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" + "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" + "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" + "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" + "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" + "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" + "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" + "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" + "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" + "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" + "8781808000200d200341086a29030020032903002210200a7c220f201054" + "ad7c200f200341106a41086a2903002003290310221020097c220a201054" + "ad7c200a200341206a41086a2903002003290320221020087c2209201054" + "ad7c2009200341306a41086a2903002003290330221020077c2208201054" + "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" + "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" + "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" + "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" + "01200320093703e001200320083703d801200320073703d0012003200637" + "03c801200320053703c0012000200341c0016a10d680808000200341f001" + "6a2480808080000bdc0101027f2380808080004180036b22032480808080" + "002003200110ba80808000200341e0006a200210ba80808000200341c001" + "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" + "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" + "808000200341c0016a2001200210bc80808000200341a0026a200341c001" + "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" + "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" + "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" + "41e0006b220224808080800020022000200110bb808080002000200241e0" + "001086818080001a200241e0006a2480808080000b9f0701037f23808080" + "800041a0116b2201248080808000200141a0026a200010ba808080002001" + "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" + "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" + "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" + "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" + "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" + "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" + "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" + "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" + "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" + "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" + "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" + "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" + "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" + "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" + "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" + "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" + "00210220014180096a200141e0036a200141e0036a10bc80808000200141" + "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" + "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" + "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" + "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" + "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" + "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" + "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" + "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" + "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" + "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" + "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" + "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" + "0010ee80808000200141a0116a2480808080000b4201017f024020002802" + "0822032000280200470d002000200210d8808080000b2000280204200341" + "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" + "7f23808080800041106b2202248080808000200241988cc0800036020c20" + "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" + "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" + "0324808080800020032001360204200320003602002003410236020c2003" + "41a08dc08000360208200342023702142003418580808000ad4220862204" + "2003ad8437032820032004200341046aad843703202003200341206a3602" + "10200341086a200210a480808000000b0f002000280200200110f2808080" + "000be10201067f23808080800041106b2202248080808000410a21030240" + "024020004190ce004f0d00200021040c010b410a21030340200241066a20" + "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" + "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" + "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" + "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" + "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" + "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" + "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" + "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" + "03417f6a22036a20004130723a00000b200141014100200241066a20036a" + "410a20036b10d5808080002100200241106a24808080800020000b380201" + "7f017e23808080800041106b220124808080800020002902002102200120" + "0036020c20012002370204200141046a108181808000000b490002402002" + "418080c400460d002000200220012802101181808080008080808000450d" + "0041010f0b024020030d0041000f0b200020032004200128020c11808080" + "800080808080000b7902017f017e23808080800041306b22032480808080" + "0020032001360204200320003602002003410236020c2003419c91c08000" + "360208200342023702142003418580808000ad4220862204200341046aad" + "84370328200320042003ad843703202003200341206a360210200341086a" + "200210a480808000000b1c0020002802002001200028020428020c118180" + "80800080808080000b14002001200028020020002802041092808080000b" + "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" + "800041306b22032480808080002003200136022c20032000360228200341" + "033a00242003422037021c41002104200341003602142003410036020c02" + "400240024002400240200228021022050d00200228020c2200450d012002" + "280208220120004103746a21062000417f6a41ffffffff017141016a2104" + "2002280200210003400240200041046a2802002207450d00200328022820" + "002802002007200328022c28020c11808080800080808080000d040b2001" + "2802002003410c6a200141046a28020011818080800080808080000d0320" + "0041086a2100200141086a22012006470d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" + "2109200228020021004100210703400240200041046a2802002201450d00" + "200328022820002802002001200328022c28020c11808080800080808080" + "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" + "00003a00242003200141186a2802003602202001410c6a28020021064100" + "210a4100210b024002400240200141086a2802000e03010002010b200641" + "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" + "210b0b200320063602102003200b36020c200141046a2802002106024002" + "40024020012802000e03010002010b2006410374210b2009200b6a220b28" + "02000d01200b28020421060b4101210a0b200320063602182003200a3602" + "142009200141146a2802004103746a22012802002003410c6a200141046a" + "28020011818080800080808080000d02200041086a21002008200741206a" + "2207470d000b0b200420022802044f0d0120032802282002280200200441" + "03746a22012802002001280204200328022c28020c118080808000808080" + "8000450d010b410121010c010b410021010b200341306a24808080800020" + "010b6001027f20002802042102200028020021030240200028020822002d" + "0000450d00200341f48ec080004104200228020c11808080800080808080" + "00450d0041010f0b20002001410a463a0000200320012002280210118180" + "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" + "017f017e23808080800041306b2203248080808000200320013602042003" + "20003602002003410236020c200341d091c0800036020820034202370214" + "2003418580808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b" + "ab0201037f2380808080004180016b220224808080800020002802002100" + "024002400240200128021422034110710d0020034120710d012000280200" + "200110f28080800021000c020b2000280200210041810121030340200220" + "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" + "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" + "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" + "0b2000280200210041810121030340200220036a417e6a2000410f712204" + "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" + "042000410476210020040d000b200141fd8ec080004102200220036a417f" + "6a41810120036b10d58080800021000b20024180016a2480808080002000" + "0b0900200041003602000b990101027f23808080800041106b2204248080" + "808000410041002802f093c08000220541016a3602f093c0800002402005" + "4100480d000240024041002d00bc97c080000d00410041002802b897c080" + "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" + "41086a200020011182808080008080808000000b410041003a00bc97c080" + "002002450d00108081808000000b000b0300000b0b002000108281808000" + "000bba0101037f23808080800041106b2201248080808000200028020022" + "0228020c2103024002400240024020022802040e020001020b20030d0141" + "012102410021030c020b20030d0020022802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c200141868080" + "8000200028020822002d000820002d000910ff80808000000b2001200336" + "0204200120023602002001418780808000200028020822002d000820002d" + "000910ff80808000000b0c00200020012902003703000bc30201047f411f" + "21020240200141ffffff074b0d002001410620014108766722026b764101" + "7120024101746b413e6a21020b200042003702102000200236021c200241" + "027441f493c080006a21030240410028029097c080004101200274220471" + "0d0020032000360200200020033602182000200036020c20002000360208" + "4100410028029097c0800020047236029097c080000f0b02400240024020" + "0328020022042802044178712001470d00200421020c010b200141004119" + "20024101766b2002411f461b742103034020042003411d764104716a4110" + "6a22052802002202450d0220034101742103200221042002280204417871" + "2001470d000b0b20022802082203200036020c2002200036020820004100" + "3602182000200236020c200020033602080f0b2005200036020020002004" + "3602182000200036020c200020003602080baa0301057f02400240200241" + "104f0d00200021030c010b02402000410020006b41037122046a22052000" + "4d0d002004417f6a21062000210302402004450d00200421072000210303" + "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" + "490d000340200320013a0000200341076a20013a0000200341066a20013a" + "0000200341056a20013a0000200341046a20013a0000200341036a20013a" + "0000200341026a20013a0000200341016a20013a0000200341086a220320" + "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" + "41ff017141818284086c2107034020052007360200200541046a22052003" + "490d000b0b200241037121020b02402003200320026a22074f0d00200241" + "7f6a2104024020024107712205450d000340200320013a0000200341016a" + "21032005417f6a22050d000b0b20044107490d000340200320013a000020" + "0341076a20013a0000200341066a20013a0000200341056a20013a000020" + "0341046a20013a0000200341036a20013a0000200341026a20013a000020" + "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" + "7f02400240200241104f0d00200021030c010b02402000410020006b4103" + "7122046a220520004d0d002004417f6a2106200021032001210702402004" + "450d002004210820002103200121070340200320072d00003a0000200741" + "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" + "40200320072d00003a0000200341016a200741016a2d00003a0000200341" + "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" + "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" + "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" + "3a0000200741086a2107200341086a22032005470d000b0b200520022004" + "6b2208417c7122066a210302400240200120046a22074103710d00200520" + "034f0d0120072101034020052001280200360200200141046a2101200541" + "046a22052003490d000c020b0b200520034f0d0020074103742202411871" + "21042007417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220047620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20084103712102200720066a21010b" + "02402003200320026a22054f0d002002417f6a2108024020024107712207" + "450d000340200320012d00003a0000200141016a2101200341016a210320" + "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" + "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" + "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" + "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" + "00003a0000200341076a200141076a2d00003a0000200141086a21012003" + "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" + "2205200142ffffffff0f8322067e22072003422088220820067e22062005" + "200142208822097e7c22054220867c220a3703002000200820097e200520" + "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" + "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" + "026a2103200020026a210420024110490d014100200441037122056b2106" + "02402004417c71220720044f0d002005417f6a21080240024020050d0020" + "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" + "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" + "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" + "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" + "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" + "09417c7122026b2104410020026b210a02400240200320066a2203410371" + "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" + "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" + "002003410374220241187121052003417c712208417c6a2101410020026b" + "41187121062008280200210203402007417c6a2207200220067420012802" + "002202200576723602002001417c6a210120042007490d000b0b20094103" + "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" + "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" + "20002104200121070240200a450d00200a21032000210420012107034020" + "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" + "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" + "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" + "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" + "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" + "0441076a200741076a2d00003a0000200741086a2107200441086a220420" + "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" + "0a6a22074103710d00200920044f0d012007210103402009200128020036" + "0200200141046a2101200941046a22092004490d000c020b0b200920044f" + "0d0020074103742202411871210a2007417c71220841046a210141002002" + "6b411871210620082802002102034020092002200a762001280200220220" + "067472360200200141046a2101200941046a22092004490d000b0b200341" + "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" + "03024020024107712207450d000340200420012d00003a0000200141016a" + "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" + "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" + "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" + "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" + "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" + "00200141086a2101200441086a22042009470d000c020b0b200420026b22" + "0720044f0d002002417f6a2109024020024103712201450d000340200441" + "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" + "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" + "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" + "00002004417c6a220420012d00003a00002001417c6a210120072004490d" + "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" + "000be8132f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f697465722f7472616974732f6974657261746f722e" + "72730000100058000000b307000009000000000000000000000001000000" + "0800000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f72757374632f346562313631" + "323530653334306338663438663636653262393239656634613562656437" + "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" + "73000000a30010004a000000a10000001900000054727946726f6d536c69" + "63654572726f720000000100000000000000d80210005e000000b4020000" + "090000002f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" + "0000f6050000150000007372632f6c69622e727300008c0110000a000000" + "1f000000160000008c0110000a00000028000000310000008c0110000a00" + "000028000000440000004661696c656420746f20646573657269616c697a" + "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" + "0000440000008c0110000a000000620000001f0000008c0110000a000000" + "630000000a0000008c0110000a00000064000000170000008c0110000a00" + "0000650000000a0000008c0110000a00000066000000170000008c011000" + "0a000000670000000a0000004661696c656420746f20646573657269616c" + "697a6520614661696c656420746f20646573657269616c697a6520624661" + "696c656420746f20646573657269616c697a652063496e76616c69642062" + "7974657320666f72205363616c61726361706163697479206f766572666c" + "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f737562746c652d" + "322e362e312f7372632f6c69622e72730000000000000400000004000000" + "0900000001000000d80210005e000000bd0200000900000000000000fdff" + "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" + "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" + "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" + "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" + "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" + "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" + "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" + "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" + "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" + "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" + "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" + "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" + "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" + "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" + "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" + "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" + "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" + "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" + "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" + "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" + "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" + "34396366386336623562353537662f626c7331325f3338312d302e382e30" + "2f7372632f70616972696e67732e72730000a00510006600000016020000" + "1500000044000000a0051000660000001b02000009000000a00510006600" + "0000050200001d000000a005100066000000090200001d000000a0051000" + "660000003802000032000000a00510006600000044020000320000002969" + "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" + "20206275742074686520696e64657820697320006d061000200000008d06" + "1000120000000000000004000000040000000a0000003d3d617373657274" + "696f6e20606c6566742020726967687460206661696c65640a20206c6566" + "743a200a2072696768743a200000c206100010000000d206100017000000" + "e90610000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000c2061000100000000c071000100000001c07100009000000" + "e9061000090000003a200000010000000000000048071000020000000000" + "00000c000000040000000b0000000c0000000d000000202020202c0a2828" + "0a3078303030313032303330343035303630373038303931303131313231" + "333134313531363137313831393230323132323233323432353236323732" + "383239333033313332333333343335333633373338333934303431343234" + "333434343534363437343834393530353135323533353435353536353735" + "383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939617474656d7074" + "20746f20646976696465206279207a65726f4708100019000000206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820" + "72616e676520656e6420696e6465782000008a0810001000000068081000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e64732061742000ac08100016000000c20810000d00000028292f72" + "757374632f34656231363132353065333430633866343866363665326239" + "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" + "7372632f7261775f7665632e72730000e20810004c000000280200001100" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" + "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" + "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" + "4009100029000000a804000009000000617373657274696f6e206661696c" + "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" + "616400004009100029000000ae0400000d00000000c94e046e616d65000e" + "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" + "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" + "4d6170244c5424492443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f72244754243973697a655f68696e7431376833383630386236" + "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" + "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" + "5f62795f7a65726f3137683033346433623765633138373166373545024d" + "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" + "247761736d5f6c69622e2e566572696679696e674b657924475424313768" + "393064303131346662343063613937644503475f5a4e35616c6c6f633772" + "61775f7665633230526177566563496e6e6572244c542441244754243130" + "6465616c6c6f636174653137683235303163353461663065323831336145" + "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" + "5424313768663462323737666433376462353031654505565f5a4e34636f" + "726533707472353264726f705f696e5f706c616365244c5424626c733132" + "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" + "313768623964653634383231343939353539344506675f5a4e34636f7265" + "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" + "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" + "2e5363616c61722447542424475424313768376265333235646130373238" + "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" + "244324412447542434707573683137686236356465366561306165303964" + "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" + "244c54245424432441244754243867726f775f6f6e653137686531306535" + "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" + "395f244c5424696d706c2475323024247535622454247535642424475424" + "36746f5f76656331376836333665656464383765653761373437450a4d5f" + "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" + "4c542441244754243136776974685f63617061636974795f696e31376861" + "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" + "775f7665633230526177566563496e6e6572244c54244124475424313467" + "726f775f616d6f7274697a65643137686439353064656131373163323030" + "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" + "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" + "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" + "633230526177566563496e6e6572244c5424412447542431357472795f61" + "6c6c6f636174655f696e3137686534626630623334333637646136646345" + "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" + "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" + "6974682e2e4e656724475424336e65673137683434323138626332316532" + "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" + "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" + "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" + "696f6e616c5f73656c656374313768386165306466613830666434313139" + "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" + "46726f6d536c6963654572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863303634386262" + "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" + "747465723370616431376833316663303133336231396665333065451367" + "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" + "2e50616441646170746572247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376834353537" + "3732653638643462343039364514385f5a4e36737562746c65313743744f" + "7074696f6e244c5424542447542436657870656374313768623863663632" + "323139313530313333334515495f5a4e34345f244c542424524624542475" + "32302461732475323024636f72652e2e666d742e2e446973706c61792447" + "542433666d74313768353633396538653836623831393165364516355f5a" + "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" + "64313768393337633632373834633734396537664517385f5a4e36737562" + "746c65313743744f7074696f6e244c542454244754243665787065637431" + "3768633764316533383030323138386237654518705f5a4e38315f244c54" + "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" + "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" + "6e646578244c542449244754242447542435696e64657831376862376565" + "6135613738316438393239374519405f5a4e34636f726535736c69636535" + "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" + "376866663036393161306536326561633864451a425f5a4e34636f726535" + "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" + "656e5f6661696c31376861383936346133343065666132346537451b0861" + "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" + "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" + "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" + "325f333831326731384731416666696e65313566726f6d5f636f6d707265" + "7373656431376832333963336331363436646339303436451f355f5a4e38" + "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" + "37683530336430613839336365653362666645203e5f5a4e39626c733132" + "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" + "7365643137686333616566303334336638323663626245211462656c6c6d" + "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" + "367363616c6172365363616c617233737562313768656363643066636134" + "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" + "313768633661663135363636663731396234384524305f5a4e34636f7265" + "3970616e69636b696e673970616e69635f666d7431376862393162616461" + "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" + "3338312e2e67312e2e473150726f6a656374697665247532302461732475" + "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" + "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" + "243466726f6d3137686634356430353636343237373335316445262e5f5a" + "4e39626c7331325f33383132667032467036696e76657274313768366335" + "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" + "6670324670336d756c313768646666623336663036373139613633374528" + "365f5a4e39626c7331325f333831326731384731416666696e6538696465" + "6e746974793137686236366162643638326233626339356345292f5f5a4e" + "39626c7331325f3338313266703246703769735f7a65726f313768333962" + "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" + "325f3338312e2e67312e2e4731416666696e652475323024617324753230" + "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" + "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" + "323735393935653930646636613863452b85015f5a4e3130325f244c5424" + "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" + "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" + "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" + "475424244754243466726f6d313768353930643863663565363536346465" + "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" + "6531376839346666616330666264306163343332452d90015f5a4e313033" + "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" + "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" + "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" + "6f6f70447269766572244754243133646f75626c696e675f737465703137" + "6833346536393232613038346336343933452e705f5a4e38315f244c5424" + "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" + "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" + "646578244c542449244754242447542435696e6465783137686539346538" + "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" + "6972696e677333656c6c3137683264393865303762336132336635313345" + "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e646974696f6e" + "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" + "6c5f73656c6563743137686366633738633362393036656661383945315a" + "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" + "656724475424336e65673137686230666536353636326461326334343345" + "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" + "363566633733316133386134393745332d5f5a4e39626c7331325f333831" + "3366703233467032336d756c313768326433373464346666306563343037" + "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" + "467036247532302461732475323024636f72652e2e6f70732e2e61726974" + "682e2e4d756c24475424336d756c31376865613934393735323931313764" + "3166634535305f5a4e39626c7331325f3338313366703633467036367371" + "756172653137683866633831663539663666313530643145363c5f5a4e39" + "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" + "6573696475653137686432663865613131393236643732653945375a5f5a" + "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" + "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" + "24475424337375623137686137396663636566323762323631323445382b" + "5f5a4e39626c7331325f3338313266703246703373756231376865646439" + "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" + "703246703361646431376863366562626430363731666432643965453a30" + "5f5a4e39626c7331325f3338313366703233467032367371756172653137" + "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" + "333831336670323346703233737562313768636330663365343532313765" + "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" + "646431376864363030363832376137333934646563453d2e5f5a4e39626c" + "7331325f3338313266703246703673717561726531376835616337663530" + "666666393136623065453e605f5a4e36375f244c542424524624626c7331" + "325f3338312e2e667031322e2e4670313224753230246173247532302463" + "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" + "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" + "626c7331325f3338312e2e667031322e2e46703132247532302461732475" + "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" + "2447542431306d756c5f61737369676e3137683037326534616130343436" + "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" + "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" + "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" + "3768613463633461633966316338323538644541635f5a4e39626c733132" + "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" + "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" + "6f746f6d69635f6578703137686166636437313637356662666432373645" + "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e7374616e7454" + "696d654571244754243563745f6571313768316264323735363036643361" + "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" + "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" + "726974682e2e416464244754243361646431376835343330336164316564" + "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" + "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" + "4c542449244324552443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f7224475424346e657874313768633964373737363930666232" + "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" + "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" + "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" + "637469766536646f75626c65313768386366636435343461313633326664" + "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" + "74697665336164643137686338666437656633383137383263636145487c" + "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024737562746c652e2e436f6e" + "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" + "6974696f6e616c5f73656c65637431376839346663383463303336386533" + "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" + "6c6d616c6c6f63244c542441244754243466726565313768623937643238" + "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" + "673570616e696331376832323065356136376635653365303666454b0e5f" + "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" + "696e6b5f6368756e6b31376831623634356162376339333032303939454d" + "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c542441244754243133646973706f73655f6368756e6b31376832" + "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" + "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" + "35616c6c6f63377261775f766563313763617061636974795f6f76657266" + "6c6f7731376863393936333961626361313337633131455085015f5a4e31" + "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" + "61702e2e4d6170244c542449244324462447542424753230246173247532" + "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" + "2e2e4974657261746f7224475424346e6578743137683161356136633566" + "303263666237373445514d5f5a4e34365f244c5424753634247532302461" + "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" + "54243563745f657131376839613065366130383065643661303532455253" + "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" + "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" + "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" + "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" + "6e6e6572313768363939386636356530343630623966324554475f5a4e34" + "325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866396562386538303434" + "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" + "7231327061645f696e74656772616c313768336538303336383966363939" + "303466334556335f5a4e39626c7331325f33383132667032467031307375" + "6274726163745f7031376833353337643137643839306564373430455736" + "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" + "696d706c313768636263383565313966363066396565314558435f5a4e35" + "616c6c6f63377261775f7665633139526177566563244c54245424432441" + "244754243867726f775f6f6e653137683761366133613131343862316565" + "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" + "4732416666696e65247532302461732475323024737562746c652e2e436f" + "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" + "646974696f6e616c5f73656c656374313768346631633532376163323663" + "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" + "696f6e244c54245424475424247532302461732475323024737562746c65" + "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" + "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" + "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" + "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" + "6e7374616e7454696d654571244754243563745f65713137683764613737" + "3038613961336631623237455c335f5a4e39626c7331325f333831326670" + "324670313066726f6d5f6279746573313768663632643265653863383835" + "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" + "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" + "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" + "376862613864393933386331336334313962455e425f5a4e39626c733132" + "5f33383132667032467032356c657869636f67726170686963616c6c795f" + "6c61726765737431376864623239383362653765626662373630455f345f" + "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" + "65313768386339643861353637336531663765654560315f5a4e39626c73" + "31325f33383133667032334670323769735f7a65726f3137683232633162" + "33626231383039373337664561385f5a4e39626c7331325f333831326670" + "324670313573756d5f6f665f70726f647563747331376864373831613962" + "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" + "467032336e6567313768336535623432323139303537623839334563365f" + "5a4e39626c7331325f33383133667032334670323131706f775f76617274" + "696d653137683839356266623030643732663461646145643b5f5a4e3962" + "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" + "62795f78313768313830336335636330383333313036354565665f5a4e37" + "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" + "61726974682e2e4e656724475424336e6567313768363961333962383136" + "613036626237614566455f5a4e34636f7265346974657238616461707465" + "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" + "3768373932316661373530366638613637624567365f5a4e39626c733132" + "5f333831326732384732416666696e65386964656e746974793137683532" + "3261303037353662633832613639456885015f5a4e3130325f244c542462" + "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" + "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" + "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" + "5424244754243466726f6d31376831393034396666373534383632623533" + "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" + "795f303131376837316231356266356135313961376133456a385f5a4e39" + "626c7331325f333831326670324670313573756d5f6f665f70726f647563" + "747331376862306665663033383436356461336561456b5e5f5a4e39626c" + "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" + "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" + "345f73717561726531376835333530613232303537323261303037456c68" + "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" + "756241737369676e2447542431307375625f61737369676e313768656138" + "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" + "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" + "726564247532302461732475323024636f72652e2e636f6e766572742e2e" + "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" + "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" + "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" + "724c6f6f70447269766572244754243133646f75626c696e675f73746570" + "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" + "63337665633136566563244c542454244324412447542434707573683137" + "6836633466633030383766393064366561456f355f5a4e34636f72653970" + "616e69636b696e6731336173736572745f6661696c656431376838396134" + "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" + "696e67313870616e69635f626f756e64735f636865636b31376835613339" + "3334316633393435306165354571625f5a4e34636f726533666d74336e75" + "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" + "2e2e446973706c61792475323024666f7224753230247533322447542433" + "666d74313768646131373032323936653330396138624572445f5a4e3463" + "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" + "2475333224475424345f666d743137686531613333633761616434313031" + "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" + "726533666d7439466f726d617474657231327061645f696e74656772616c" + "313277726974655f70726566697831376865323164633232613535336139" + "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" + "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" + "633772756e74696d65313768623465303239633465666136373431314576" + "475f5a4e34325f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e44656275672447542433666d743137683763663234" + "64633163663734653663354577495f5a4e34345f244c5424245246245424" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363963313766643162653433346236384578585f" + "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768356530663632333530333933336330664579265f" + "5a4e34636f726533666d7435777269746531376862633530306361396130" + "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" + "6275696c646572732e2e5061644164617074657224753230246173247532" + "3024636f72652e2e666d742e2e577269746524475424313077726974655f" + "6368617231376837323761393336343062616631636662457b305f5a4e34" + "636f726533666d743557726974653977726974655f666d74313768653264" + "32326663306535326231396336457c515f5a4e34636f726535736c696365" + "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "38646f5f70616e69633772756e74696d6531376836346563303433376262" + "666263656363457d475f5a4e34325f244c54242452462454247532302461" + "732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "31376837396432393730376137363931633337457e375f5a4e34636f7265" + "3570616e6963313250616e69635061796c6f61643661735f737472313768" + "33653762626665396537333233373036457f3b5f5a4e337374643970616e" + "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" + "68396561303139313462356439323635394580010a727573745f70616e69" + "638101455f5a4e3373746433737973396261636b747261636532365f5f72" + "7573745f656e645f73686f72745f6261636b747261636531376865376239" + "323038656534343338376436458201585f5a4e337374643970616e69636b" + "696e673139626567696e5f70616e69635f68616e646c657232385f247537" + "62242475376224636c6f7375726524753764242475376424313768393666" + "3161333534313164393334366245830183015f5a4e39395f244c54247374" + "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" + "6c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" + "54243661735f737472313768653362376630636337353061633833394584" + "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f636875" + "6e6b31376866646432333135363766663933346634458501066d656d7365" + "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" + "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" + "6830343030366431613866396435653532458901076d656d6d6f76650712" + "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" + "004d0970726f64756365727302086c616e6775616765010452757374000c" + "70726f6365737365642d6279010572757374631d312e38352e3120283465" + "6231363132353020323032352d30332d31352900490f7461726765745f66" + "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" + "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const sp1_wasm = + "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" + "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" + "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" + "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" + "000000060100000001010107040800000000000102080202040101000505" + "00010502000a0b0c00010100000100000401040000010100000101000200" + "0100000107010202030d0e000405017001080805030100110619037f0141" + "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" + "790200147370315f67726f746831365f766572696669657200000a5f5f64" + "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" + "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" + "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" + "0120051b3a00000240200504400340024002400240200541016b0e030005" + "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" + "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" + "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" + "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" + "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" + "280200211241e0a5c000280200211f024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002" + "400240024002404184021001220a450d00200a41c1befe827c3600800220" + "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" + "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" + "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" + "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" + "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" + "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" + "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" + "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" + "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" + "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" + "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" + "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" + "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" + "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" + "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" + "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" + "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" + "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" + "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" + "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" + "00370000201d41286a4200370000201d41306a4200370000201d41376a42" + "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" + "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" + "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" + "200a280000470d002001418280c4003602e01c2001410036029c03200142" + "c080808020370294032001205241026a360290032001200141e01c6a3602" + "a003200141106a20014190036a100320012d0010044020012d0011210502" + "4020012802a003280200418280c400470d00200128029403450d00200128" + "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" + "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" + "053a0000200141013602a80c200120023602a40c200141083602a00c2001" + "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" + "0037030020012001290290033703a00f4101210503400240200141086a20" + "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" + "460440024020012802b00f280200418280c400470d0020012802a40f450d" + "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" + "220e280200220c4101742208200541016a220220022008491b2202200241" + "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" + "36021441010541000b360218200f41086a41012002200f41146a1028200f" + "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" + "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" + "20012802a40c21020b200220056a20063a00002001200541016a22053602" + "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" + "80c4004704402002450d02200641046b2802002205417871221241044108" + "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" + "0610040c020b2002418080808078460d0102400240024002402005412046" + "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" + "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" + "28000721262006280003213520062d0002212d20062d0001214720062d00" + "00214820020440200641046b2802002208417871220c4104410820084103" + "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" + "200141206a22062005290300370300200141286a220520232d00003a0000" + "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" + "2006290300370000200141cf006a20052d00003a0000201641086a200141" + "f8006a290000370000201641106a20014180016a29000037000020164118" + "6a20014188016a290000370000200120012d0070411f713a007020162001" + "2900703700002001202436003b2001202636003720012035360033200120" + "2d3a0032200120473a0031200120483a00302001200129031837003f200a" + "290014225742388620574280fe0383422886842057428080fc0783421886" + "205742808080f80f834208868484205742088842808080f80f8320574218" + "88428080fc07838420574228884280fe03832057423888848484215e200a" + "411c6a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" + "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" + "2886842058428080fc0783421886205842808080f80f8342088684842058" + "42088842808080f80f832058421888428080fc07838420584228884280fe" + "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" + "574280fe0383422886842057428080fc0783421886205742808080f80f83" + "4208868484205742088842808080f80f832057421888428080fc07838420" + "574228884280fe03832057423888848484225742a9c0c689aece93b23054" + "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" + "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" + "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" + "18200120573703b8182001205e3703a818200a2900342257423886205742" + "80fe0383422886842057428080fc0783421886205742808080f80f834208" + "868484205742088842808080f80f832057421888428080fc078384205742" + "28884280fe03832057423888848484215e200a413c6a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe038320574238888484842165417f200a290024225742" + "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" + "008584420052205842388620584280fe0383422886842058428080fc0783" + "421886205842808080f80f834208868484205842088842808080f80f8320" + "58421888428080fc07838420584228884280fe0383205842388884848422" + "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" + "57428080fc0783421886205742808080f80f834208868484205742088842" + "808080f80f832057421888428080fc07838420574228884280fe03832057" + "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" + "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" + "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" + "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" + "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" + "222420014188076a290300370000200141bd0c6a222620014180076a2903" + "00370000200141b50c6a2235200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022023290000370000200141851d6a22232024290000370000200141fd" + "1c6a22242026290000370000200141f51c6a222620352900003700002001" + "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" + "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" + "290000370300200141b80a6a2023290000370300200141b00a6a20242900" + "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" + "0054225742388620574280fe0383422886842057428080fc078342188620" + "5742808080f80f834208868484205742088842808080f80f832057421888" + "428080fc07838420574228884280fe038320574238888484842165200a41" + "dc006a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" + "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" + "422886842058428080fc0783421886205842808080f80f83420886848420" + "5842088842808080f80f832058421888428080fc07838420584228884280" + "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" + "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" + "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" + "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" + "fe0383422886842057428080fc0783421886205742808080f80f83420886" + "8484205742088842808080f80f832057421888428080fc07838420574228" + "884280fe03832057423888848484215a200a41fc006a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484215c417f200a290064225742" + "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" + "dd008584420052205842388620584280fe0383422886842058428080fc07" + "83421886205842808080f80f834208868484205842088842808080f80f83" + "2058421888428080fc07838420584228884280fe03832058423888848484" + "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" + "2057428080fc0783421886205742808080f80f8342088684842057420888" + "42808080f80f832057421888428080fc07838420574228884280fe038320" + "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" + "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" + "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" + "511b0d070b200a29009401225742388620574280fe038342288684205742" + "8080fc0783421886205742808080f80f8342088684842057420888428080" + "80f80f832057421888428080fc07838420574228884280fe038320574238" + "88848484215b200a419c016a290000225742388620574280fe0383422886" + "842057428080fc0783421886205742808080f80f83420886848420574208" + "8842808080f80f832057421888428080fc07838420574228884280fe0383" + "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" + "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" + "42388620584280fe0383422886842058428080fc07834218862058428080" + "80f80f834208868484205842088842808080f80f832058421888428080fc" + "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" + "91a8b87f54205742388620574280fe0383422886842057428080fc078342" + "1886205742808080f80f834208868484205742088842808080f80f832057" + "421888428080fc07838420574228884280fe038320574238888484842257" + "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" + "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" + "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" + "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" + "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" + "4180076a290300370300200120012903f0063703a00b200120533703a80b" + "200120623703900b2001206a3703800b200120593703f00a2001205c3703" + "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" + "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" + "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" + "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" + "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" + "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" + "2205200141f8066a22062903002257370000200141f80a6a20014188076a" + "2202290300370300200141f00a6a20014180076a22202903003703002001" + "20012903f0063703e00a200120573703e80a200141e0066a200910062001" + "2d00e0060d06200520062903002257370000200141b80b6a200229030037" + "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" + "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" + "222220014188076a290300370000200141bd0c6a220920014180076a2903" + "00370000200141b50c6a2223200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022020290000370000200141851d6a22202022290000370000200141fd" + "1c6a22222009290000370000200141f51c6a220920232900003700002001" + "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" + "2005290000370300200141c8086a2006290000370300200141c0086a2002" + "290000370300200141b8086a2020290000370300200141b0086a20222900" + "00370300200141a8086a2009290000370300200120012900ed1c3703a008" + "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" + "370300200141f8076a200141b80a6a29030037030020014180086a200141" + "c00a6a29030037030020014188086a200141c80a6a290300370300200141" + "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" + "370300200120012903a00a3703e007200141e0066a200141801f6a418001" + "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" + "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" + "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" + "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" + "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" + "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" + "00370300200141800c6a2065370300200141880c6a205e37030020014190" + "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" + "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" + "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" + "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" + "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" + "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" + "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" + "418001104c418001104c1a201241a002460d13201241a102460d14201241" + "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" + "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" + "8080808080023702a00b2005200641087472202041107472200241187472" + "220504404101200541187420054180fe03714108747220054108764180fe" + "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" + "b00f6a210641a40221024100212241102108410021200340202041f6ffff" + "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" + "012d00a00f0d0320052006290000370000200541386a2202200641386a29" + "0000370000200541306a2223200641306a290000370000200541286a2224" + "200641286a290000370000200541206a2226200641206a29000037000020" + "0541186a2235200641186a290000370000200541106a222d200641106a29" + "0000370000200541086a2247200641086a290000370000200141901f6a22" + "48202d290000370300200141981f6a222d2035290000370300200141a01f" + "6a22352026290000370300200141a81f6a22262024290000370300200141" + "b01f6a22242023290000370300200141b81f6a2223200229000037030020" + "0120052900003703801f200120472900003703881f20012802a00b202046" + "044041002108230041206b2203240002400240200141a00b6a221b280200" + "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" + "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" + "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" + "100541000b360218200341086a4110200e200341146a1028200328020841" + "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" + "0328020c210f201b2002360200201b200f360204200341206a2400200128" + "02a40b21080b200820226a220220012903801f370300200241386a202329" + "0300370300200241306a2024290300370300200241286a20262903003703" + "00200241206a2035290300370300200241186a202d290300370300200241" + "106a2048290300370300200241086a20012903881f370300200120204101" + "6a22203602a80b202241406b212220092102200c2020470d000b20012802" + "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" + "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" + "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" + "900c6a290300370100200141c6126a200141880c6a290300370100200141" + "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" + "370100200141ae126a200141f00b6a290300370100200141a6126a200129" + "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" + "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" + "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" + "410272200141e0066a41be03104c1a200120263602d006200120063a0091" + "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" + "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" + "6a2105200141306a2106410021120340230041206b22092400200941186a" + "221b2006290000225342388620534280fe0383422886842053428080fc07" + "83421886205342808080f80f834208868484205342088842808080f80f83" + "2053421888428080fc07838420534228884280fe03832053423888848484" + "370300200941106a2208200641086a290000225342388620534280fe0383" + "422886842053428080fc0783421886205342808080f80f83420886848420" + "5342088842808080f80f832053421888428080fc07838420534228884280" + "fe0383205342388884848437030020092006290010225342388620534280" + "fe0383422886842053428080fc0783421886205342808080f80f83420886" + "8484205342088842808080f80f832053421888428080fc07838420534228" + "884280fe038320534238888484843703082009200641186a290000225342" + "388620534280fe0383422886842053428080fc0783421886205342808080" + "f80f834208868484205342088842808080f80f832053421888428080fc07" + "838420534228884280fe0383205342388884848437030020094201420042" + "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" + "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" + "0300370300200c41186a2009290308370300200c20092903003703102009" + "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" + "2257370300200141f0066a200541106a2903002258370300200120052903" + "00225e3703e0062001200541086a29030022653703e80620202012410574" + "6a220641186a2057370300200641106a2058370300200641086a20653703" + "002006205e370300410121122002410171211f4101210220162106201f45" + "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" + "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" + "352005104c211220624203520d02206a428080808010540d042001419006" + "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" + "386a290300370300200141f01a6a2216201241306a290300370300200141" + "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" + "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" + "2224201241106a290300370300200120122903003703c01a200120124108" + "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" + "370300200141d00c6a2016290300370300200141c80c6a20222903003703" + "00200141c00c6a2009290300370300200141b80c6a202329030037030020" + "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" + "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" + "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" + "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" + "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" + "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" + "ffff01716a22422903002004290300832159204241086a29030020044108" + "6a29030083215302400240027f0240024002400240024020364101714504" + "4041002053205984500d061a200441e0006a200441206a29030037030020" + "0441e8006a200441286a290300370300200441f0006a202b290300370300" + "200441f8006a200441386a29030037030020044180016a200441406b2903" + "0037030020044188016a200441c8006a2903003703002004200429031037" + "035020042004290318370358202e0d010c030b202e450d0120044188026a" + "200441c8006a222e29030037030020044180026a200441406b2250290300" + "370300200441f8016a200441386a2203290300370300200e202b29030037" + "0300200441e8016a200441286a2236290300370300200441e0016a200441" + "206a2242290300370300200420042903183703d801200420042903103703" + "d001200441d8036a224b4200370300200441d0036a220242003703002004" + "42003703f803200442003703f003200442003703e803200442013703e003" + "200442003703c803200442003703c003024002400240200441d0016a2004" + "41c0036a104a450440200e200f104a450d010b204b420037030020024200" + "370300200442003703f803200442003703f003200442003703e803200442" + "013703e003200442003703c803200442003703c003027f0240200441d001" + "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" + "0300204941186a202b41186a290300370300204941106a202b41106a2903" + "00370300204941086a202b41086a290300370300200441a0026a20422903" + "00370300200441a8026a2036290300370300200420042903103703900220" + "0420042903183703980220082102204a0c010b204a4200370300200441a0" + "026a4200370300200441a8026a4200370300204a41086a4200370300204a" + "41106a4200370300204a41186a4200370300200442003703900220044200" + "37039802201b210220490b214b2002420037030820024200370300204b42" + "00370308204b4201370300200441c0036a20044190026a20044190026a10" + "40200441f0026a200441c0036a104120042802f002410171450d01200441" + "c8016a203741386a290300370300200441c0016a203741306a2903003703" + "00200441b8016a203741286a290300370300200441b0016a203741206a29" + "0300370300200441a8016a203741186a290300370300200441a0016a2037" + "41106a29030037030020042037290300370390012004203741086a290300" + "370398010c020b200441a0016a2042290300370300200441a8016a203629" + "0300370300200441b0016a202b290300370300200441b8016a2003290300" + "370300200441c0016a2050290300370300200441c8016a202e2903003703" + "00200420042903103703900120042004290318370398010c010b41c4a0c0" + "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" + "41a8016a290300370300202b200441b0016a2903003703002003200441b8" + "016a2903003703002050200441c0016a290300370300202e200441c8016a" + "290300370300200420042903900137031020042004290398013703182053" + "205984500d04200441e0006a2042290300370300200441e8006a20362903" + "00370300200441f0006a202b290300370300200441f8006a200329030037" + "030020044180016a205029030037030020044188016a202e290300370300" + "20042004290310370350200420042903183703580b200441c0036a200441" + "d0006a200c100c0c020b20532059844200520d002041450d044101213641" + "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" + "0c41306a290300370300200441e8036a200c41286a290300370300200f20" + "0c41206a290300370300200441d8036a200c41186a290300370300200441" + "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" + "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" + "41406b200441f0036a290300370300200441386a200441e8036a29030037" + "0300202b200f290300370300200441286a200441d8036a29030037030020" + "0441206a200441d0036a290300370300200420042903c803370318200420" + "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" + "c0001020000b204141016b21410c010b0b20312004290310370300203141" + "086a2004290318370300203141386a200441c8006a290300370300203141" + "306a200441406b290300370300203141286a200441386a29030037030020" + "3141206a200441306a290300370300203141186a200441286a2903003703" + "00203141106a200441206a290300370300200441a0046a2400200541206a" + "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" + "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" + "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" + "20014190026a100d200141a0186a21024200215c42002154420021532001" + "41e0066a220541386a2903002161200541286a290300215b200529033021" + "592005290320215e027e200529034022652005290350226a84200541c800" + "6a2903002262200541d8006a290300225a84845004402059215c20612154" + "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" + "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" + "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" + "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" + "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" + "3c205e7d0b21612002206a370350200220653703402002205c3703302002" + "20613703202002205a370358200220623703482002205437033820022053" + "37032820022005290300370300200241186a200541186a29030037030020" + "0241106a200541106a290300370300200241086a200541086a2903003703" + "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" + "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" + "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" + "00215c42002153024002400240200141801f6a2202290380012002418801" + "6a290300844200520d0020022903900120024198016a290300844200520d" + "0020022903a001200241a8016a290300844200520d0020022903b0012002" + "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" + "0300215e2002290370215420022903602161200229035022582002290340" + "226a84200241d8006a290300225a200241c8006a29030022628484420052" + "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" + "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" + "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" + "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" + "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" + "542061842059205e84844200520440427f4200427f4200206142788342c7" + "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" + "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" + "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" + "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" + "4180016a22052903003703800120082002290300370300200841b8016a20" + "0541386a290300370300200841b0016a200541306a290300370300200841" + "a8016a200541286a290300370300200841a0016a200541206a2903003703" + "0020084198016a200541186a29030037030020084190016a200541106a29" + "030037030020084188016a200541086a290300370300200841086a200241" + "086a290300370300200841106a200241106a290300370300200841186a20" + "0241186a290300370300200841206a200241206a29030037030020084128" + "6a200241286a290300370300200841306a200241306a2903003703002008" + "41386a200241386a2903003703002008205a370378200820623703702008" + "206a370368200820583703602008205c3703582008206537035020082053" + "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" + "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" + "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" + "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" + "023820004280808080800237023020004100360244200042808080808002" + "37023c41102133200041306a10362000280234223b200141a00f6a220341" + "e000104c1a20004101360238200341e0006a2102200028023c4504402000" + "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" + "022000410136024420002802304101460440200041306a10362000280234" + "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" + "2102200028023c41014604402000413c6a1038200028024021330b203341" + "c0016a200241c001104c1a200341c0046a21022000410236024420002802" + "304102460440200041306a10362000280234213b0b203b41c0016a200241" + "e000104c1a20004103360238200341a0056a2102200028023c4102460440" + "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" + "0341e0066a21022000410336024420002802304103460440200041306a10" + "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" + "200341c0076a2103200028023c41034604402000413c6a10382000280240" + "21330b203341c0046a200341c001104c1a20004104360244200041003602" + "502000428080808080023702482000410036025c20004280808080800237" + "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" + "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" + "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" + "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" + "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" + "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" + "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" + "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" + "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" + "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" + "002802b001410171450d00200041a00d6a2003104120002802a00d410171" + "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" + "00200041f0026a2213201041306a290300370300200041e8026a22092010" + "41286a290300370300200041e0026a2215201041206a2903003703002000" + "41d8026a220f201041186a290300370300200041d0026a2225201041106a" + "290300370300200020102903003703c0022000202e2903003703c8022000" + "280248203946044041002108230041206b220e240002400240200041c800" + "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" + "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" + "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" + "020436021441100541000b360218200e41086a2016200e41146a1037200e" + "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" + "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" + "00200028024c21050b200520394106746a220320002903c0023703002003" + "41386a2011290300370300200341306a2013290300370300200341286a20" + "09290300370300200341206a2015290300370300200341186a200f290300" + "370300200341106a2025290300370300200341086a20002903c802370300" + "2000203941016a2239360250200041a00d6a200d10450240024020002802" + "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" + "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" + "200b4200370300200041b80d6a220d420037030020104200370300203f42" + "00370300203f41086a4200370300203f41106a4200370300203f41186a42" + "00370300203f41206a4200370300203f41286a4200370300200042003703" + "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" + "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" + "104a0d00203d202d104a450d010b203c4200370300200220272903003703" + "00203c41086a4200370300203c41106a4200370300203c41186a42003703" + "00203c41206a4200370300203c41286a4200370300200241386a20274138" + "6a290300370300200241306a202741306a290300370300200241286a2027" + "41286a290300370300200241206a202741206a290300370300200241186a" + "202741186a290300370300200241106a202741106a290300370300200241" + "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" + "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" + "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" + "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" + "370300200020002903b83a3703b846200020002903b03a3703b04620070c" + "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" + "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" + "0300200041e8c6006a4200370300200042003703b046200042003703b846" + "202b41f000104b1a20020b220342003703082003420137030041bda9c000" + "2d00001a41809901100b221e450d0141002109200041003602b819200020" + "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" + "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" + "200d290300370300200041c0c3006a220f20102903003703002000200029" + "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200041a8076a2211200b41186a221b290300370300200041a0076a221320" + "0b41106a22342903003703002000200b41086a2240290300370398072000" + "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" + "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" + "370300200041c01f6a200f29030037030020182000290390073703002018" + "41086a200029039807370300201841106a2013290300370300201841186a" + "2011290300370300200020002903b8433703b81f200020002903b0433703" + "b01f200041e8346a2203200241386a290300370300200041e0346a200241" + "306a290300370300200041d8346a2232200241286a290300370300200041" + "d0346a200241206a290300370300200041c8346a220e200241186a290300" + "370300200041c0346a200241106a2903003703002000200241086a290300" + "3703b834200020022903003703b034200041b0346a20022002102f200041" + "e8376a2219200741386a290300370300200041e0376a200741306a290300" + "370300200041d8376a221a200741286a290300370300200041d0376a2007" + "41206a290300370300200041c8376a222f200741186a2903003703002000" + "41c0376a2230200741106a2903003703002000200741086a2903003703b8" + "37200020072903003703b037200041b0376a20072007102f20002903b837" + "226942018620002903b037226b423f88842155206b420186215402400240" + "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" + "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" + "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" + "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" + "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" + "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" + "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" + "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" + "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" + "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" + "00226742018620002903d037226f423f88842154206f4201862153024002" + "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" + "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" + "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" + "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" + "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" + "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" + "aece93b230511b450d002053215b20542170205921600c010b2055205920" + "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" + "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" + "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" + "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" + "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" + "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" + "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" + "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" + "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" + "30511b450d0120540b215f205921582053215c0c010b2056205420532059" + "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" + "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" + "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" + "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" + "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" + "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" + "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" + "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" + "89aece93b230511b450d002059215a205321590c010b2055205420532059" + "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" + "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" + "550b200020543703e0222000205a3703d0222000205f3703c02220002058" + "3703b022200020553703e822200020593703d822200020563703c8222000" + "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" + "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" + "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" + "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" + "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" + "0041b0226a102f20002903b825226442018620002903b025226e423f8884" + "2155206e420186215402400240027e20002903c02522704201862064423f" + "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" + "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" + "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" + "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" + "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" + "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" + "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" + "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" + "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" + "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" + "018620002903d0252265423f888421542065420186215302400240200029" + "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" + "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" + "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" + "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d002053216c20542173205921680c010b205520" + "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" + "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" + "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" + "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" + "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" + "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" + "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" + "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" + "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" + "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" + "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" + "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" + "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" + "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" + "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" + "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" + "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" + "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" + "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" + "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" + "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" + "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" + "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" + "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" + "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" + "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" + "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" + "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" + "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" + "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" + "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" + "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" + "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" + "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "0240207320002903e03422597c22552079203229030022687c2263207954" + "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" + "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" + "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" + "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" + "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" + "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" + "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" + "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" + "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" + "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" + "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" + "723703002000207a37039807200020753703900720004190076a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200d20633703002010205d370300200020613703a80d200020573703a00d" + "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" + "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" + "286a220e2013290300370300200620002903a00d370300200641086a2000" + "2903a80d370300200641106a2010290300370300200641186a200d290300" + "37030020002000290398073703b82820002000290390073703b028024002" + "40027e20002903c04722612000290380477c226d204d290300225d204c29" + "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" + "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" + "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" + "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" + "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" + "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" + "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" + "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "024020002903e047225720002903a0477c226320222903002262201f2903" + "007c225d206254ad205d20002903d04722622000290390477c2261206254" + "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" + "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" + "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" + "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" + "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" + "89aece93b230511b450d0020612157206221610c010b2063205d20622061" + "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" + "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" + "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" + "630b200d206d3703002010207237030020292061370300200b2057370300" + "203a205d37030020252063370300200041c0c0006a224520723703002000" + "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" + "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" + "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" + "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" + "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" + "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" + "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" + "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" + "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" + "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" + "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" + "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" + "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" + "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" + "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" + "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" + "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" + "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" + "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" + "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" + "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" + "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" + "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" + "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" + "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" + "5d20002903b040216102400240417f20002903c0402267206d8520322903" + "002266206985844200522067206d54206620695420662069511b1b222141" + "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" + "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" + "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" + "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" + "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" + "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" + "02400240417f20002903e0402263206f85201c2903002267206b85844200" + "522063206f542067206b542067206b511b1b2214417f470440201441ff01" + "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" + "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" + "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" + "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" + "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" + "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" + "417f20542070852056206085844200522054207056205620605620562060" + "511b1b2214417f470440201441ff01710d012058206e5820532064582053" + "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" + "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" + "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" + "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" + "64420120727d21722063207e7c216f420120767d2175206020567d205442" + "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" + "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" + "216e205e20587d217e02400240417f2059205c852055205b858442005220" + "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" + "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" + "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" + "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" + "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" + "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" + "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" + "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" + "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" + "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" + "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" + "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" + "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" + "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" + "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" + "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" + "0041e0256a290300370300200041b8076a2217201a290300370300202c20" + "0041d0256a290300370300201120192903003703002013200041c0256a29" + "0300370300200020002903b82537039807200020002903b0253703900720" + "004190076a200041b0256a200041b0256a102f0240417f20542074852056" + "205a858442005220542074542056205a542056205a511b1b2219417f4704" + "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" + "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" + "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" + "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" + "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" + "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" + "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" + "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" + "40417f20592073852055205f858442005220592073542055205f54205520" + "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" + "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" + "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" + "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" + "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" + "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" + "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" + "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" + "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" + "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" + "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" + "0300370300200b20062903003703002029200041d8286a29030037030020" + "3a200041e0286a2903003703002025200041e8286a290300370300200020" + "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" + "b0286a200041b0286a102f20002903980722544201862000290390072253" + "423f888421552053420186215a02400240027e20002903a0072259420186" + "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" + "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" + "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" + "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" + "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" + "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" + "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" + "290300225a42018620002903b007225f423f8884215b205f420186215c02" + "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" + "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" + "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" + "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" + "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" + "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" + "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" + "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" + "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" + "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" + "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" + "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" + "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" + "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" + "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" + "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" + "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" + "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" + "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" + "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" + "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" + "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" + "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" + "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" + "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" + "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" + "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" + "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" + "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" + "417f20002903b00d225f205b85200d290300225420568584420052205b20" + "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" + "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" + "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" + "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" + "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" + "2066216c205821660b206220787d215f206120777d2158205420567d205b" + "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" + "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" + "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" + "7f20002903d00d2254205a8520252903002256205585844200522054205a" + "54205520565620552056511b1b2203417f470440200341ff01710d012064" + "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" + "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" + "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" + "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" + "20002066370380472000206c3703f0462000205c20717d37039047200020" + "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" + "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" + "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" + "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" + "03d831200020583703d031200020603703c0312000206b3703c831200020" + "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" + "002164200042003703e831200042003703e031200042003703d831200042" + "013703d031200042003703c831200042003703c031200042003703b83120" + "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" + "714200216c4200216642002167205f2060842053206b8484420052044042" + "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" + "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" + "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" + "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" + "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" + "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" + "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" + "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" + "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" + "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" + "20002903b0432253423f888421552053420186215a02400240027e200029" + "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" + "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" + "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" + "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" + "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" + "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" + "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" + "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" + "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" + "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" + "018620002903d043225f423f88842160205f420186215b02400240200029" + "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" + "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" + "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" + "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" + "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" + "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" + "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" + "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" + "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" + "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" + "0b02400240027e205920687c225b205420737c2269205454ad2069205320" + "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" + "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" + "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" + "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" + "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" + "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" + "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" + "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" + "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" + "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" + "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" + "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" + "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" + "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" + "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" + "b230511b450d002059215a205321590c010b205520542053205942c7faf3" + "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" + "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" + "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" + "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" + "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" + "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" + "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" + "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" + "21532019290300215f2003290300215820002903b81c2160201e200941c0" + "016c6a220320553703b80120142903002155201a290300215c200e290300" + "216820002903b01c2174200320543703b001200320593703a8012003205a" + "3703a00120032056370398012003205b3703900120032069370388012003" + "2070370380012003205e3703782003206f3703702003206b370368200320" + "643703602003206c37035820032071370350200320673703482003206637" + "034020032074370300200341386a2058370300200341306a206837030020" + "0341286a205f370300200341206a205c370300200341186a205337030020" + "0341106a2055370300200341086a20603703002000200941016a22033602" + "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" + "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" + "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" + "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" + "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" + "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" + "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" + "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" + "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" + "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" + "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" + "186a290300370300200f203e41106a2903003703002000203e41086a2903" + "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" + "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" + "2903b043370300204020002903b8433703002034200f290300370300201b" + "2015290300370300200020002903b83a3703a80d200020002903b03a3703" + "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" + "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" + "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" + "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" + "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" + "90072015203d41186a290300370300200f203d41106a2903003703002000" + "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" + "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200d202741186a2903003703002010202741106a2903003703" + "00200b20002903b043370300204020002903b8433703002034200f290300" + "370300201b20152903003703002000202741086a2903003703a80d200020" + "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" + "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" + "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" + "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" + "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" + "997f3703b043202f202841186a2903003703002030202841106a29030037" + "03002000202841086a2903003703b837200020282903003703b037200041" + "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2011203229030037030020132045290300370300202c" + "20002903b037370300202c41086a220d20002903b837370300202c41106a" + "22092030290300370300202c41186a2215202f2903003703002000200029" + "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" + "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" + "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" + "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" + "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" + "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" + "03002030204341106a2903003703002000204341086a2903003703b83720" + "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" + "003703002013204441106a290300370300202c20002903b037370300200d" + "20002903b837370300200920302903003703002015202f29030037030020" + "00204441086a2903003703980720002044290300370390072004200041b0" + "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" + "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" + "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" + "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" + "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" + "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" + "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" + "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" + "104c1a205141086a200d280200360200205120002902b019370200200028" + "025420464604404100211b230041206b220e240002400240200041d4006a" + "22162802002209417f460d00410420094101742208200941016a220c2008" + "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" + "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" + "200e201628020436021441100541000b360218200e41086a2008200e4114" + "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" + "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" + "0e41206a2400200028025821380b203820464190016c6a20004180036a41" + "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" + "0b0240024002400240024002400240024002400240024002402046450440" + "2000280254210320004190076a41f002104b1a20030d010c020b41002118" + "200041a0076a41f002104b1a200042003703980720004201370390072046" + "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" + "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" + "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" + "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" + "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" + "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" + "6a2017103b200042003703e849200042003703e049200042003703d84920" + "0042013703d049200042003703c849200042003703c049200042003703b8" + "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" + "386a2203201c41386a290300370300201941306a2202201c41306a290300" + "370300201941286a2207201c41286a290300370300201941206a220b201c" + "41206a290300370300201941186a220d201c41186a290300370300201941" + "106a2211201c41106a290300370300201941086a2206201c41086a290300" + "3703002019201c290300370300201a2017290300370300201a41086a2209" + "201741086a290300370300201a41106a2215201741106a29030037030020" + "1a41186a220f201741186a290300370300201a41206a2225201741206a29" + "0300370300201a41286a2229201741286a290300370300201a41306a222a" + "201741306a290300370300201a41386a221e201741386a29030037030020" + "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" + "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" + "004190076a2017103020452028201a10302040202c20191030200041b0ce" + "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" + "006a200041b0c3006a103c200042003703e846200042003703e046200042" + "003703d846200042013703d046200042003703c846200042003703c04620" + "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" + "6a102f201a20002903b043370300200920002903b8433703002015200041" + "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" + "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" + "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" + "386a2903003703002002201441306a2903003703002007201441286a2903" + "00370300200b201441206a290300370300200d201441186a290300370300" + "2011201441106a2903003703002006201441086a29030037030020192014" + "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" + "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" + "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" + "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" + "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" + "220c41c000460d040c030b02400340200641046a280200220320184b0440" + "200241386a2903002156200241306a2903002155200241286a2903002154" + "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" + "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" + "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" + "200d290300370300200041c0c9006a222920112903003703002013200029" + "03a00d370300201341086a222a20002903a80d370300201341106a221e20" + "0b290300370300201341186a222f2007290300370300200020002903b84e" + "3703b849200020002903b04e3703b049200241186a290300215620024110" + "6a2903002155200241086a290300215420022903002153200041c8c6006a" + "220920034198016a290300370300200041c0c6006a221520034190016a29" + "0300370300200020034188016a2903003703b84620002003290380013703" + "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" + "016a2903003703002000200341a8016a2903003703a80d200020032903a0" + "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" + "0300201020002903a00d370300201041086a223020002903a80d37030020" + "1041106a223a200b290300370300201041186a2232200729030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" + "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" + "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" + "41046a2802002203200f4b0440200241386a2903002156200241306a2903" + "002155200241286a2903002154200241206a2903002153200d2006280200" + "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" + "3703002000200341c8006a2903003703b84e200020032903403703b04e20" + "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" + "03003703002000200341e8006a2903003703a80d200020032903603703a0" + "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2025200d290300370300202920112903003703002013" + "20002903a00d370300202a20002903a80d370300201e200b290300370300" + "202f2007290300370300200020002903b84e3703b849200020002903b04e" + "3703b049200241186a2903002156200241106a2903002155200241086a29" + "0300215420022903002153200920034198016a2903003703002015200341" + "90016a290300370300200020034188016a2903003703b846200020032903" + "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" + "200341b0016a2903003703002000200341a8016a2903003703a80d200020" + "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" + "290300370300201020002903a00d370300203020002903a80d370300203a" + "200b29030037030020322007290300370300200020002903b8463703b84e" + "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" + "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" + "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" + "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" + "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" + "0d201841c0016c2125200521022008210903402018200741046a28020022" + "034f0d02200241386a2903002156200241306a2903002155200241286a29" + "03002154200241206a2903002153200041c8ce006a221320072802002025" + "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" + "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" + "290300370300200041c0c9006a2006290300370300200d20002903a00d37" + "0300200d41086a20002903a80d370300200d41106a201029030037030020" + "0d41186a2011290300370300200020002903b84e3703b849200020002903" + "b04e3703b049200241186a2903002156200241106a290300215520024108" + "6a290300215420022903002153200041c8c6006a221520034198016a2903" + "00370300200041c0c6006a220f20034190016a2903003703002000200341" + "88016a2903003703b84620002003290380013703b046200041b0c6006a20" + "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2011200341b8016a2903003703002010200341b0016a2903003703002000" + "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" + "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b201320152903003703002006200f290300370300200b20002903a00d" + "370300200b41086a20002903a80d370300200b41106a2010290300370300" + "200b41186a2011290300370300200020002903b8463703b84e2000200029" + "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" + "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" + "6a2107200241406b2102200941016b22090d000b20384184016a21072000" + "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" + "05210203402018200741046a28020022034f0d03200241386a2903002156" + "200241306a2903002155200241286a2903002154200241206a2903002153" + "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" + "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" + "003703b84e200020032903403703b04e200041b0ce006a20532054205520" + "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" + "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" + "003703002000200341e8006a2903003703a80d200020032903603703a00d" + "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" + "06290300370300200d20002903a00d370300200d41086a20002903a80d37" + "0300200d41106a2010290300370300200d41186a20112903003703002000" + "20002903b84e3703b849200020002903b04e3703b049200241186a290300" + "2156200241106a2903002155200241086a29030021542002290300215320" + "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" + "034190016a290300370300200020034188016a2903003703b84620002003" + "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" + "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" + "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" + "2015290300370300200b20002903a00d370300200b41086a20002903a80d" + "370300200b41106a2010290300370300200b41186a201129030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" + "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" + "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" + "03e834200042003703e034200042003703d834200042013703d034200042" + "003703c834200042003703c034200042003703b834200042093703b03420" + "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" + "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" + "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" + "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" + "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" + "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" + "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" + "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" + "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" + "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" + "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" + "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" + "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" + "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" + "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" + "290300370300200041c8106a220c200041c8376a221e2903003703002000" + "41c0106a2216200041c0376a222f290300370300200020002903b8373703" + "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" + "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" + "136a2228200041a0386a221b290300370300200041d8136a223420004198" + "386a2240290300370300200041d0136a224520004190386a224c29030037" + "0300200041c8136a221020004188386a224d290300370300200041c0136a" + "221320004180386a224e290300370300200041c0316a2230200041c0386a" + "223d290300370300200041c8316a223a200041c8386a2243290300370300" + "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" + "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" + "290300370300200041e8316a221a200041e8386a222d2903003703002000" + "200041f8376a22122903003703b813200020002903f0373703b013200020" + "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" + "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" + "42003703e034200042003703d834200042013703d034200042003703c834" + "200042003703c034200042003703b834200042093703b034200041b0ce00" + "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" + "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" + "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" + "006a22112903003703002013200041c0ce006a220b290300370300200020" + "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" + "0c290300370300200041b00a6a22092016290300370300200020002903b8" + "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" + "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "0041c83d6a22132017290300370300200041c03d6a221020142903003703" + "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" + "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d201120062903002256370300200b20092903002255370300200d20" + "002903b03d2254370300200220102903002253370300200720002903b83d" + "225937030020032013290300225a370300200020002903a80a225f3703b8" + "4e200020002903a00a22583703b04e2017205a3703002014205337030020" + "1c205937030020212054370300200c205637030020162055370300200020" + "5f3703b810200020583703b010200041e8166a2217202d29030037030020" + "0041e0166a2214202e290300370300200041d8166a221c20042903003703" + "00200041d0166a22212051290300370300200041c8166a220c2043290300" + "370300200041c0166a2216203d2903003703002000202b2903003703b816" + "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" + "6a200041b0166a200041b0346a102f201720032903003703002014200229" + "0300370300201c20072903003703002021200d290300370300200c201129" + "03003703002016200b290300370300200041c0196a2208202f2903003703" + "00200041c8196a2228201e290300370300200041d0196a2234202a290300" + "370300200041d8196a22452029290300370300200041e0196a223d202529" + "0300370300200041e8196a2243200f290300370300200020002903b84e37" + "03b816200020002903b04e3703b016200020002903b0373703b019200020" + "002903b8373703b819200041e8226a202c290300370300200041e0226a20" + "1b290300370300200041d8226a2040290300370300200041d0226a204c29" + "0300370300200041c8226a204d290300370300200041c0226a204e290300" + "370300200020122903003703b822200020002903f0373703b022200041b0" + "196a200041b0376a2015102f2006200c2903003703002009201629030037" + "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" + "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20132017290300370300201020142903003703002000" + "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" + "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201120062903002256370300200b20092903002255370300200d20002903" + "b03d2254370300200220102903002253370300200720002903b83d225937" + "030020032013290300225a370300200020002903a80a225f3703b84e2000" + "20002903a00a22583703b04e2017205a37030020142053370300201c2059" + "37030020212054370300200c2056370300201620553703002000205f3703" + "b816200020583703b016200041e81c6a2217202c290300370300200041e0" + "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" + "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" + "200041c01c6a2216204e290300370300200020122903003703b81c200020" + "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" + "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" + "282029290300370300200041d01f6a221b202a290300370300200041c81f" + "6a2234201e290300370300200041c01f6a2240202f290300370300200020" + "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" + "b0376a2018102f2006200c29030037030020092016290300370300200020" + "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" + "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20132017290300370300201020142903003703002000201c290300" + "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" + "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" + "03002256370300200b20092903002255370300200d20002903b03d225437" + "0300200220102903002253370300200720002903b83d2259370300200320" + "13290300225a370300200020002903a80a225f3703b84e200020002903a0" + "0a22583703b04e2017205a37030020142053370300201c20593703002021" + "2054370300200c2056370300201620553703002000205f3703b81c200020" + "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" + "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" + "200329030037030020192002290300370300200e20072903003703002032" + "200d290300370300203a20112903003703002030200b2903003703002000" + "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" + "0041b0316a200041b0346a102f201a200329030037030020192002290300" + "370300200e20072903003703002032200d290300370300203a2011290300" + "3703002030200b290300370300200041c0256a202f290300370300200041" + "c8256a201e290300370300200041d0256a202a290300370300200041d825" + "6a2029290300370300200041e0256a2025290300370300200041e8256a20" + "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" + "31200020002903b0373703b025200020002903b8373703b825200041b025" + "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" + "41b0256a1030201a200329030037030020192002290300370300200e2007" + "2903003703002032200d290300370300203a20112903003703002030200b" + "290300370300200020002903b84e3703b831200020002903b04e3703b031" + "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" + "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" + "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" + "03002254370300200041d02e6a222f200041e03d6a221829030022533703" + "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" + "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" + "0300200041c8286a220e2059370300200041d0286a221920533703002000" + "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" + "22142056370300200020002903c03d22563703b02e200020563703b02820" + "00201329030022563703b82e200020563703b828200041b0286a20102000" + "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" + "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" + "220c2018290300370300200041c82b6a2216200f290300370300200041c0" + "2b6a22082025290300370300200020132903003703b82b200020002903c0" + "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" + "0041b01c6a102f2003201429030037030020022017290300370300200720" + "1a290300370300200d20192903003703002011200e290300370300200b20" + "32290300370300202220002903b82b370300202320082903003703002024" + "2016290300370300204f200c2903003703002027202a290300370300203f" + "2021290300370300203e201c290300370300200020002903b8283703b84e" + "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" + "00370300204820292903003703002047201e2903003703002041202f2903" + "00370300204220302903003703002037203a290300370300203620002903" + "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" + "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" + "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" + "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" + "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" + "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" + "103f200742003703002002420037030020034200370300200042a9c0c689" + "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" + "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" + "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" + "0742003703002002420037030020034200370300200042003703c84e2000" + "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" + "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" + "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" + "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" + "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" + "3703002015200041e8c6006a290300370300200920002903b84037030020" + "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" + "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" + "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" + "370300200041a83e6a200041e8c0006a2206290300370300200020002903" + "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" + "200742003703002002420037030020034200370300200042a9c0c689aece" + "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" + "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" + "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" + "3703002013420037030020064200370300200042003703c840200042ac97" + "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" + "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" + "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" + "370300201120004188c8006a290300370300200d20004190c8006a290300" + "370300200720004198c8006a2903003703002002200041a0c8006a290300" + "3703002003200041a8c8006a290300370300202220002903b83a37030020" + "2320492903003703002024204a290300370300204f205029030037030020" + "272039290300370300203f203c290300370300203e204429030037030020" + "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" + "002903b03a3703f04e20394200370300203c420037030020444200370300" + "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" + "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" + "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" + "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" + "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" + "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" + "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" + "039007200041a00a6a200d418003104c1a200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" + "03200041286a210b0340200041206a200341ff0071104f200b2903002000" + "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" + "20200229030083215520074101710440200041a00d6a200041b0ce006a10" + "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" + "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" + "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" + "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" + "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" + "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" + "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" + "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" + "562000290310200229030083215520074101710440200041a00d6a200041" + "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" + "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" + "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" + "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" + "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" + "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" + "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" + "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" + "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" + "8321562000290300200229030083215520074101710440200041a00d6a20" + "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" + "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" + "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" + "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" + "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" + "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" + "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" + "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" + "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" + "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" + "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" + "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" + "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" + "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" + "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" + "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" + "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" + "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" + "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" + "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" + "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" + "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" + "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" + "6a200041a00d6a102f2002420037030020074200370300200b4200370300" + "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" + "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" + "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" + "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" + "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" + "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" + "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" + "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" + "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" + "6a29030037030020004198ca006a200041d8ce006a220629030037030020" + "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" + "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" + "03b82e3703b849200020002903b04e3703f0492002420037030020074200" + "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" + "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" + "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" + "200041b0306a200041a00d6a102f20064200370300200942003703002015" + "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" + "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" + "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" + "41b00d6a220620004180306a290300370300200041b80d6a220920004188" + "306a290300370300200041c00d6a221520004190306a2903003703002002" + "20004198306a2903003703002007200041a0306a290300370300200b2000" + "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" + "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" + "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" + "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" + "00370300200041980e6a200041e8c6006a220b2903003703002000200029" + "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" + "3703e00d2002420037030020074200370300200b4200370300200042a9c0" + "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" + "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" + "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" + "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" + "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" + "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" + "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" + "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" + "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" + "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" + "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" + "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" + "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" + "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" + "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" + "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" + "006a200041b0c3006a103f2009290300215620002903b00d215520004190" + "076a201541f002104c1a20384184016a2103024002400240024002400240" + "0340200341046b280200220204402003280200220b41046b280200220741" + "7871220d200241c0016c220241044108200741037122071b72490d022007" + "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" + "6b22460d000b200028025422030440203841046b28020022024178712207" + "20034190016c220341044108200241037122021b72490d03200241002007" + "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" + "0200220241787122072003410674220341044108200241037122021b7249" + "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" + "18200341e4a1c0001010000b203841046b28020022024178712207200341" + "90016c220341044108200241037122021b72490d02200241002007200341" + "276a4b1b0d03203810040b200028024822030440200541046b2802002202" + "41787122072003410674220341044108200241037122021b72490d042002" + "4100200720034127724b1b0d05200510040b42002156420121550b203120" + "5637030820312055370300203141106a20004190076a41f002104c1a2000" + "28023c22030440203341046b28020022024178712207200341c0016c2203" + "41044108200241037122021b72490d0520024100200720034127724b1b0d" + "06203310040b200028023022030440203b41046b28020022024178712207" + "200341e0006c220341044108200241037122021b72490d07200241002007" + "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" + "1011000b200141f0066a41f002104b1a200142003703e806200142013703" + "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" + "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" + "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" + "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" + "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" + "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" + "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" + "05417871221241044108200541037122051b20026a490d0c200541002012" + "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" + "05410674100e0c040b206a428080808010540d0020122005100e0b202041" + "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" + "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" + "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" + "04201d41046b280200220541787141e40041e800200541037122061b490d" + "162006410020054188014f1b0d17201d1004200a41046b28020022054178" + "71221d418802418c02200541037122051b490d1820054100201d41ac024f" + "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" + "200541003602182005410136020c200541a099c000360208200542043702" + "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" + "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" + "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" + "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" + "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" + "0204200241643602002002410236020c200241b884c00036020820024202" + "3702142002200241046aad4280808080108437032820022002ad42808080" + "8010843703202002200241206a360210200241086a41cc90c000101a000b" + "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" + "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b962502087f017e02400240024002400240024002402000" + "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" + "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" + "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" + "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" + "04410620014108766722006b7641017120004101746b413e6a21070b4100" + "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" + "0b410021002004411920074101766b41002007411f471b74210503400240" + "200328020441787122062004490d00200620046b220620014f0d00200321" + "02200622010d0041002101200321000c060b200328021422062000200620" + "032005411d764104716a41106a2802002203471b200020061b2100200541" + "0174210520030d000b0c030b02402000417f7341017120016a2205410374" + "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" + "402002200436020c200420023602080c010b418ca9c0002003417e200577" + "713602000b20012000410372360204200020016a22002000280204410172" + "360204200141086a0f0b0240200020017441022001742200410020006b72" + "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" + "28020822054704402005200236020c200220053602080c010b418ca9c000" + "2003417e200677713602000b20002004410372360204200020046a220520" + "0120046b2204410172360204200020016a20043602004194a9c000280200" + "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" + "8ca9c00028020022064101200341037674220371450440418ca9c0002003" + "20067236020020020c010b20022802080b21032002200136020820032001" + "36020c2001200236020c200120033602080b419ca9c00020053602004194" + "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" + "220228020441787120046b21012002210302400340024002402002280210" + "22000d00200228021422000d002003280218210702400240200320032802" + "0c2200460440200341144110200328021422001b6a28020022020d014100" + "21000c020b20032802082202200036020c200020023602080c010b200341" + "146a200341106a20001b21050340200521062002220041146a200041106a" + "200028021422021b210520004114411020021b6a28020022020d000b2006" + "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" + "020047044020074110411420072802102003461b6a20003602002000450d" + "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" + "200328021c77713602000c030b200028020441787120046b220220012001" + "20024b22021b21012000200320021b2103200021020c010b0b2000200736" + "021820032802102202044020002002360210200220003602180b20032802" + "142202450d0020002002360214200220003602180b02400240200141104f" + "044020032004410372360204200320046a22042001410172360204200120" + "046a20013602004194a9c0002802002205450d0120054178714184a7c000" + "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" + "037674220571450440418ca9c000200520067236020020020c010b200228" + "02080b2105200220003602082005200036020c2000200236020c20002005" + "3602080c010b2003200120046a2200410372360204200020036a22002000" + "2802044101723602040c010b419ca9c00020043602004194a9c000200136" + "02000b200341086a0f0b2000200272450440410021024102200774220041" + "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" + "0b2000450d010b03402002200020022000280204417871220320046b2206" + "20014922071b200320044922051b210220012006200120071b20051b2101" + "20002802102203047f20030520002802140b22000d000b0b2002450d0020" + "044194a9c00028020022004d2001200020046b4f710d0020022802182107" + "024002402002200228020c2200460440200241144110200228021422001b" + "6a28020022030d01410021000c020b20022802082203200036020c200020" + "033602080c010b200241146a200241106a20001b21050340200521062003" + "220041146a200041106a200028021422031b210520004114411020031b6a" + "28020022030d000b200641003602000b02402007450d0002402002200228" + "021c41027441f4a5c0006a22032802004704402007411041142007280210" + "2002461b6a20003602002000450d020c010b2003200036020020000d0041" + "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" + "0736021820022802102203044020002003360210200320003602180b2002" + "2802142203450d0020002003360214200320003602180b0240200141104f" + "044020022004410372360204200220046a22042001410172360204200120" + "046a200136020020014180024f0440411f210020044200370210200141ff" + "ffff074d04402001410620014108766722006b7641017120004101746b41" + "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" + "22054190a9c0002802007145044020032004360200200420033602182004" + "200436020c200420043602084190a9c0004190a9c0002802002005723602" + "000c030b0240024020012003280200220528020441787146044020052100" + "0c010b2001411920004101766b41002000411f471b742103034020052003" + "411d764104716a41106a22062802002200450d0220034101742103200021" + "0520002802044178712001470d000b0b20002802082201200436020c2000" + "2004360208200441003602182004200036020c200420013602080c030b20" + "062004360200200420053602182004200436020c200420043602080c020b" + "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" + "41037674220171450440418ca9c000200120037236020020000c010b2000" + "2802080b2101200020043602082001200436020c2004200036020c200420" + "013602080c010b2002200120046a2200410372360204200020026a220020" + "002802044101723602040b200241086a0f0b024002400240024002400240" + "20044194a9c00028020022004b044020044198a9c00028020022004f0440" + "41002100200441af80046a220241107640002201417f4622050d07200141" + "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" + "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" + "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" + "4020002802002202200028020422056a2003460d02200028020822000d00" + "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" + "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" + "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" + "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" + "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" + "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" + "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" + "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" + "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" + "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" + "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" + "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" + "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" + "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" + "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" + "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" + "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" + "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" + "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" + "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" + "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" + "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" + "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" + "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" + "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" + "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" + "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" + "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" + "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" + "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" + "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" + "0036020020032000410172360204200020036a412836020441aca9c00041" + "808080013602000c080b200120034f0d0020012002490d00200028020c45" + "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" + "0320066a210241f4a6c00021000240024003402002200028020022054704" + "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" + "034002402001200028020022024f04402001200220002802046a2202490d" + "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" + "41286b220036020020032000410172360204200020036a412836020441ac" + "a9c00041808080013602002001200241206b41787141086b220020002001" + "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" + "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" + "200336020041fca6c000200541086a3602004180a7c00041003602002005" + "411c6a2100034020004107360200200041046a22002002490d000b200120" + "05460d0720052005280204417e713602042001200520016b220041017236" + "02042005200036020020004180024f04402001200010350c080b200041f8" + "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" + "220071450440418ca9c000200020037236020020020c010b20022802080b" + "2100200220013602082000200136020c2001200236020c20012000360208" + "0c070b200020033602002000200028020420066a36020420032004410372" + "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" + "a9c000280200460d032002419ca9c000280200460d042002280204220441" + "037141014604402002200441787122041016200120046a2101200220046a" + "220228020421040b20022004417e71360204200020014101723602042000" + "20016a200136020020014180024f04402000200110350c060b200141f801" + "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" + "0171450440418ca9c000200120027236020020040c010b20042802080b21" + "01200420003602082001200036020c2000200436020c200020013602080c" + "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" + "220020046a22023602002002200141017236020420002004410372360204" + "200041086a21000c060b419ca9c00028020021010240200020046b220241" + "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" + "72360204200020016a220020002802044101723602040c010b4194a9c000" + "2002360200419ca9c000200120046a220336020020032002410172360204" + "200020016a2002360200200120044103723602040b200141086a0f0b2000" + "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" + "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" + "22016a41086a220336020020022003410172360204200020016a41283602" + "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" + "c0004198a9c00028020020016a2201360200200020014101723602040c01" + "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" + "020020002001410172360204200020016a20013602000b200341086a0f0b" + "410021004198a9c000280200220120044d0d004198a9c000200120046b22" + "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" + "0141017236020420002004410372360204200041086a0f0b20000bc60602" + "037f037e230041a0026b22032400200341286a41c100104b210420034118" + "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" + "41086a41e08bc00029030037030020034200370320200341d88bc0002903" + "003703000240200241c0004f0440200320024106762205ad370320200320" + "01200510272004200120024140716a2002413f712202104c1a0c010b2004" + "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" + "034198016a220120032d00d80122026a22044180013a00002002ad220742" + "3b862003290390012206420986220820074203868422074280fe03834228" + "86842007428080fc0783421886200742808080f80f834208868484200642" + "018642808080f80f832006420f88428080fc0783842006421f884280fe03" + "8320084238888484842106024002402002413f470440200441016a200241" + "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" + "4190026a420037030020034188026a420037030020034180026a42003703" + "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" + "00370300200342003703e0012003200637039802200341f0006a200341e0" + "016a410110270c010b200320063703d001200341f0006a2001410110270b" + "2000200328028c01220241187420024180fe037141087472200241087641" + "80fe03712002411876727236001c20002003280288012202411874200241" + "80fe03714108747220024108764180fe0371200241187672723600182000" + "200328028401220241187420024180fe03714108747220024108764180fe" + "0371200241187672723600142000200328028001220241187420024180fe" + "03714108747220024108764180fe03712002411876727236001020002003" + "28027c220241187420024180fe03714108747220024108764180fe037120" + "02411876727236000c20002003280278220241187420024180fe03714108" + "747220024108764180fe0371200241187672723600082000200328027422" + "0241187420024180fe03714108747220024108764180fe03712002411876" + "727236000420002003280270220241187420024180fe0371410874722002" + "4108764180fe037120024118767272360000200341a0026a24000bee0201" + "077f024020012802042202450440410021020c010b200128021021062001" + "200220022001280208220320022003491b22046b36020420012001280200" + "220720046a360200027f0240024002400240027f02400240024020030440" + "200128020c2208410174210520072d0000220241c1006b41ff0171410649" + "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" + "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" + "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" + "01714106490d01200241e1006b41ff01714106490d02200241306b220441" + "ff0171410a490d0420054101720b21032006200241ff0171360200200620" + "0541807e71200341ff01717236020441000c040b200241376b21040c020b" + "200241d7006b21040c010b4101410141948bc0001010000b200420034104" + "7472210341010b21022001200841016a36020c0b200020033a0001200020" + "023a00000bb40801057f200041086b2201200041046b2802002203417871" + "22006a21020240024020034101710d002003410271450d01200128020022" + "0320006a2100200120036b2201419ca9c000280200460440200228020441" + "03714103470d014194a9c000200036020020022002280204417e71360204" + "20012000410172360204200220003602000f0b2001200310160b02400240" + "0240024002400240024020022802042203410271450440200241a0a9c000" + "280200460d022002419ca9c000280200460d032002200341787122031016" + "2001200020036a2200410172360204200020016a20003602002001419ca9" + "c000280200470d014194a9c00020003602000f0b20022003417e71360204" + "20012000410172360204200020016a20003602000b2000418002490d0241" + "1f210220014200370210200041ffffff074d044020004106200041087667" + "22026b7641017120024101746b413e6a21020b2001200236021c20024102" + "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" + "01360200200120033602182001200136020c200120013602084190a9c000" + "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" + "c0004198a9c00028020020006a220036020020012000410172360204419c" + "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" + "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" + "410021034198a9c00028020022054129490d0441f4a6c000210103402000" + "200128020022024f04402000200220012802046a490d060b200128020821" + "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" + "006a220036020020012000410172360204200020016a20003602000f0b20" + "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" + "037674220071450440418ca9c000200020037236020020020c010b200228" + "02080b2100200220013602082000200136020c2001200236020c20012000" + "3602080f0b02400240200020032802002204280204417871460440200421" + "020c010b2000411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712000470d000b0b20022802082200200136020c20" + "022001360208200141003602182001200236020c200120003602080c010b" + "20052001360200200120043602182001200136020c200120013602080b41" + "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" + "a6c000280200220004400340200141016a2101200028020822000d000b0b" + "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" + "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" + "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" + "000b0b810802077f067e230041c0026b2203240020034198026a20024118" + "6a290300220a37030020034190026a200241106a290300220d3703002003" + "200241086a290300220b3703880220032002290300220c3703800242ddb0" + "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" + "290300220a370300200341b8026a2205200141186a290300220d37030020" + "032001290300220b3703a0022003200141086a290300220c3703a8022003" + "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" + "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" + "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" + "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" + "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" + "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" + "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" + "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" + "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" + "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" + "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" + "80026a200341a0016a104a45044020034180016a22042002290300370100" + "20034198016a2205200241186a29030037010020034190016a2206200241" + "106a29030037010020034188016a2207200241086a290300370100200341" + "f8006a2202200141186a290300370100200341f0006a2208200141106a29" + "0300370100200341e8006a2209200141086a290300370100200320012903" + "00370160200341ca006a22012005290100370100200341c2006a22052006" + "2901003701002003413a6a22062007290100370100200341326a22072004" + "2901003701002003412a6a22042002290100370100200341226a22022008" + "2901003701002003411a6a22082009290100370100200320032901603701" + "12200041c8006a2001290100370100200041406b20052901003701002000" + "41386a2006290100370100200041306a2007290100370100200041286a20" + "04290100370100200041206a2002290100370100200041186a2008290100" + "3701002000200329011237011041000c010b200041003a000141010b3a00" + "00200341c0026a24000baa0401047e2001290010220242388620024280fe" + "0383422886842002428080fc0783421886200242808080f80f8342088684" + "84200242088842808080f80f832002421888428080fc0783842002422888" + "4280fe038320024238888484842104200141186a29000022024238862002" + "4280fe0383422886842002428080fc0783421886200242808080f80f8342" + "08868484200242088842808080f80f832002421888428080fc0783842002" + "4228884280fe0383200242388884848421050240417f2001290000220242" + "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" + "008584420052200342388620034280fe0383422886842003428080fc0783" + "421886200342808080f80f834208868484200342088842808080f80f8320" + "03421888428080fc07838420034228884280fe0383200342388884848422" + "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" + "02428080fc0783421886200242808080f80f834208868484200242088842" + "808080f80f832002421888428080fc07838420024228884280fe03832002" + "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" + "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" + "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" + "1b0d010b2000200337032020002005370310200020023703282000200437" + "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" + "7f027e230041d0066b2203240020034188036a200241386a290300370300" + "20034180036a200241306a290300370300200341f8026a200241286a2903" + "00370300200341f0026a2204200241206a290300370300200341e8026a20" + "0241186a290300370300200341e0026a200241106a290300370300200320" + "022903003703d0022003200241086a2903003703d802200341d0026a2002" + "2002102f200341a0036a200141106a290300370300200341a8036a200141" + "186a290300370300200341b0036a200141206a290300370300200341b803" + "6a200141286a290300370300200341c0036a200141306a29030037030020" + "0341c8036a200141386a2903003703002003200129030037039003200320" + "0141086a2903003703980320034190036a20012001102f200341d0006a20" + "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" + "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" + "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" + "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" + "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" + "6a20034190056a103002400240200341d0026a200341106a104a45044020" + "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" + "370300200341c0026a4200370300200341b8026a4200370300200341b002" + "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" + "00370300200341a8016a200141186a290300370300200341b0016a200141" + "206a290300370300200341b8016a200141286a290300370300200341c001" + "6a200141306a290300370300200341c8016a200141386a29030037030020" + "0342003703a00220032001290300370390012003200141086a2903003703" + "980120034188026a200241386a29030037030020034180026a200241306a" + "290300370300200341f8016a200241286a290300370300200341f0016a20" + "0241206a290300370300200341e8016a200241186a290300370300200341" + "e0016a200241106a290300370300200341d8016a200241086a2903003703" + "0020034201370390022003420037039802200320022903003703d0012003" + "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" + "00200341f8036a420037030020034180046a420037030020034188046a42" + "00370300200342003703d003200342003703d803200342a9c0c689aece93" + "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" + "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" + "00104b1a2003420037039804200342013703900441ff0121040340200320" + "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" + "ff01716a2206290308832107200329030020062903008321082005044020" + "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" + "1a0b2007200884420052044020034190056a200341d0036a20034190016a" + "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" + "2204417f470d000b20034190056a200341d0036a20034190016a10440240" + "20032903900620034198066a290300844200520d0020032903a006200341" + "a8066a290300844200520d0020032903b006200341b8066a290300844200" + "520d0020032903c006200341c8066a290300844200520d00200341c8056a" + "200141386a290300370300200341c0056a200141306a2903003703002003" + "41b8056a200141286a290300370300200341b0056a200141206a29030037" + "0300200341a8056a200141186a290300370300200341a0056a200141106a" + "290300370300200341d8056a200241086a290300370300200341e0056a20" + "0241106a290300370300200341e8056a200241186a290300370300200341" + "f0056a200241206a290300370300200341f8056a200241286a2903003703" + "0020034180066a200241306a29030037030020034188066a200241386a29" + "03003703002003200129030037039005200320022903003703d005200320" + "0141086a29030037039805200041106a20034190056a418001104c1a2000" + "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" + "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" + "022d001021072000027f024020022d0030220841c101470440200235011a" + "2109200233011e210a2002290112211620022903202114200241d8006a22" + "01200241286a29030022173703002002201437035020022009200a422086" + "842219421086201642308884220937034820022007ad42ff018320164210" + "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" + "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" + "0b200954ad220920022903487c220a200954ad220c20022903507c220942" + "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" + "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" + "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" + "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" + "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" + "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" + "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" + "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" + "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" + "470440230041e0006b220324004190aac0004190aac0002d000022044101" + "20041b3a00000240200404400340024002400240200441ff017141016b0e" + "03000501020b03404190aac0002d000022044101460d000b024002402004" + "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" + "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" + "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" + "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" + "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" + "220142003703002003420037033020034200370328200342043703202003" + "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" + "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" + "200341206a200341406b103a200320032903202003290328200329033020" + "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" + "c00041023a00004188aac00020042903003703004180aac0002005290300" + "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" + "200341e0006a24000b20024198016a4188aac00029030037030020024190" + "016a4180aac000290300370300200241f8a9c00029030037038801200241" + "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" + "210c0340200220024180016a200141037641f0ffffff01716a2205290300" + "2005290308200141ff0071104e200241286a2205200b3703002002200937" + "03202002200c3703182002200a370310200241106a200a200c2009200b42" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" + "0229032021092002290318210c2002290310210a20022802004101710440" + "2005200b370300200220093703202002200a3703102002200c3703182002" + "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f102b2005290300210b2002290318210c200229032021092002290310" + "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" + "20093703202002200c3703182002200a370310200241106a2010200d200f" + "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" + "0378200220093703702002200c3703682002200a370360200241e0006a20" + "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" + "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" + "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" + "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" + "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" + "030041d8a9c000290300102d2002290388012110200229038001210d0240" + "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" + "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" + "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" + "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" + "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" + "0d010b2002200f3703202002200d37031020022009370328200220103703" + "18027e0240200241e0006a200241106a104a0440420021104200210f4200" + "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" + "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" + "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" + "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" + "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" + "0e201554200b201054200b2010511b200c200f542009200a562009200a51" + "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" + "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" + "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" + "40024002400240417f201b420052200f2012562009200d562009200d511b" + "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" + "85200b201085844200520b4101460d010b200841c001470d014200210942" + "00210a4200210b4200210c2011201284200d20138484500d04427f420042" + "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" + "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" + "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" + "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" + "20117d21090c040b2008418001460d010b201121092013210a2012210b20" + "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" + "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" + "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" + "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" + "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" + "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" + "2014370320200020163701122000200b3703402000200937033020002006" + "3a0011200020073a0010200020193e011a200020173703282000200c3703" + "482000200a3703382000411e6a20194220883d010041000c020b20002006" + "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" + "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" + "0620022d00f0042107024002400240024020022d009005220941c1014704" + "4020024198016a220520022901fa04370300200241a6016a220420024188" + "056a2203290100370100200241a0016a220820024182056a290100370300" + "200220022901f20437039001200241f0046a200141206a102e20022d00f0" + "04450440200241d5076a2003290300220c37000020024188016a20024198" + "056a290300220b37030020024180016a20024190056a290300220a370300" + "200241c8006a200b370300200241406b200a370300200220022903800522" + "0b3703702002200c3703782002200b3703302002200c370338200220063a" + "0051200220073a0050200241e8006a22012004290100370100200241e200" + "6a2008290300370100200241da006a200529030037010020022002290390" + "01370152200941c000460d0220024180026a200241406b29030037030020" + "024188026a200241c8006a29030037030020024190026a200241d0006a29" + "030037030020024198026a200241d8006a290300370300200241a0026a20" + "0241e0006a290300370300200241a8026a20012903003703002002200229" + "03303703f001200220022903383703f801200241f0016a200241306a2002" + "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" + "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" + "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" + "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" + "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" + "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" + "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" + "002204410120041b3a00000240200404400340024002400240200441ff01" + "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" + "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" + "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" + "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" + "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" + "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" + "200341386a22014200370300200342003703302003420037032820034204" + "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" + "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" + "903c370340200341206a200341406b103a20032003290320200329032820" + "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" + "200829030037030041d8aac000200329030837030041d0aac00020032903" + "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" + "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" + "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" + "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" + "046a200141037641f0ffffff01716a22052903002005290308200141ff00" + "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" + "0e3703e0072002200d3703d807200220103703d007200220113703c80720" + "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" + "082002200e3703a0082002200d3703980820022010370390082002201137" + "0388082002200b370380082002280220210520024180076a200241c0076a" + "20024180086a102f20024198076a290300210d2004290300210f20032903" + "00210a2002290388072111200229038007210b2002290390072110200229" + "03a007210e20022903b007210c200541017104402002200a3703b8082002" + "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" + "200220103703900820022011370388082002200b37038008200241c0076a" + "20024180086a200241b0016a102f200241e8076a290300210f200241f807" + "6a290300210a20022903c007210b20022903d007211020022903e007210e" + "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" + "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" + "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" + "02200d3703c802200220113703b802200241f0026a200241b0026a200241" + "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" + "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" + "000240200104400340024002400240200141016b0e03000501020b034041" + "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" + "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" + "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" + "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" + "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" + "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" + "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" + "00370300200241a8aac0002903003703c806200241a0aac0002903003703" + "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" + "034200210a4200210e4200210f420021104200210d420021110340200241" + "106a200241c0066a200141037641f0ffffff01716a220529030020052903" + "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" + "03e8072002200e3703e0072002200d3703d807200220103703d007200220" + "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" + "02200f3703a8082002200e3703a0082002200d3703980820022010370390" + "0820022011370388082002200b370380082002280210210520024180076a" + "200241c0076a20024180086a102f20024198076a290300210d2004290300" + "210f2003290300210a2002290388072111200229038007210b2002290390" + "07211020022903a007210e20022903b007210c200541017104402002200a" + "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" + "200d37039808200220103703900820022011370388082002200b37038008" + "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" + "0f200241f8076a290300210a20022903c007210b20022903d00721102002" + "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" + "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" + "03a00820022010370390082002200b370380082002200a3703b808200220" + "0f3703a8082002200d370398082002201137038808200241f0036a200241" + "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" + "22054200370300200241b8086a22044200370300200242a9c0c689aece93" + "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" + "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" + "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" + "4020024190046a2003104a450d010b200142003703002005420037030020" + "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" + "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" + "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" + "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" + "6a4200370300200241a0086a4200370300200241a8086a42003703002002" + "41b0086a4200370300200241b8086a420037030020024200370388084201" + "210b20024201370380082002420037039008200241c0066a200241b0036a" + "20024180086a103041a0abc0002d00004102470440230041e0006b220324" + "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" + "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" + "002d000022044101460d000b02400240200441016b0e03000601030b000b" + "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" + "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" + "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" + "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" + "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" + "03302003420037032820034202370320200342a9c0c689aece93b2303703" + "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" + "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" + "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" + "20042903003703004190abc00020082903003703004188abc00020032903" + "083703004180abc00020032903003703000b200341e0006a24000b200241" + "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" + "0020024188abc0002903003703d80420024180abc0002903003703d00441" + "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" + "210f420021104200210d4200211103402002200241d0046a200141037641" + "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" + "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" + "0d3703d807200220103703d007200220113703c8072002200b3703c00720" + "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" + "082002200d37039808200220103703900820022011370388082002200b37" + "0380082002280200210520024180076a200241c0076a20024180086a102f" + "20024198076a290300210d2004290300210f2003290300210a2002290388" + "072111200229038007210b200229039007211020022903a007210e200229" + "03b007210c200541017104402002200a3703b8082002200c3703b0082002" + "200f3703a8082002200e3703a0082002200d370398082002201037039008" + "20022011370388082002200b37038008200241c0076a20024180086a2002" + "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" + "2903c007210b20022903d007211020022903e007210e20022903f007210c" + "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" + "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" + "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" + "0220113703880620024180056a20024180066a200241f0026a102f0c050b" + "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" + "0c040b200020063a0002200020073a0001200041013a00000c030b200241" + "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" + "200241e0066a4200370300200241d8066a4200370300200242003703d006" + "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" + "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" + "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" + "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" + "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" + "0241f0046a200241c0066a10310240024020022802f00441017104402002" + "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" + "056a2204290300370300200241a8086a2203200241a8056a220629030037" + "0300200241a0086a200241a0056a29030037030020024198086a20024198" + "056a220729030037030020024190086a20024190056a2903003703002002" + "20022903800537038008200220024188056a290300370388082002418006" + "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" + "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" + "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" + "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" + "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" + "f0046a200241c0066a103120022802f004410171450d0120012005290300" + "370300200241b0086a200429030037030020032006290300370300200241" + "a0086a200241a0056a29030037030020024198086a200729030037030020" + "024190086a20024190056a29030037030020022002290380053703800820" + "0220024188056a2903003703880820024180076a200241c0076a20024180" + "086a102f200241f0046a20024180066a20024180076a100720022d00f004" + "4101460d02200041106a20024180056a418001104c1a200041003a00000c" + "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" + "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" + "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" + "4200370300200242003703b808200242003703b008200242003703a80820" + "0242013703a0082002420037038808200242003703800820024180056a20" + "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" + "6a290300210c20022903a005210f20022903b005210b200229039005220d" + "20022903800522158420024198056a290300221220024188056a29030022" + "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" + "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" + "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" + "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" + "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" + "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" + "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" + "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" + "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" + "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" + "0240417f200b201085200a200c8584420052200b201054200a200c56200a" + "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" + "201485200e2011858442005221010b2019211c2017211d2018211a201621" + "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" + "0b027e200d20188520122016858450044020152019542013201754201320" + "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" + "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" + "1e200e211f200b2120200c212120192115201721132018210d2016211220" + "14210f2011210e2010210b200a210c0b200041186a200229037837030020" + "0020022903703703102000200229039001370132200041286a2002418801" + "6a290300370300200041206a20024180016a2903003703002000413a6a20" + "024198016a290300370100200041c2006a200241a0016a29030037010020" + "0041c8006a200241a6016a29010037010020094180014604402000202037" + "0380012000201e3703702000201a3703602000201c370350200020063a00" + "31200020073a0030200041003a000020002021370388012000201f370378" + "2000201b3703682000201d3703580c010b2000200b370380012000200f37" + "03702000200d37036020002015370350200020063a0031200020073a0030" + "200041003a00002000200c370388012000200e3703782000201237036820" + "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" + "022400200241386a4200370300200241306a4200370300200241286a4200" + "370300200241206a22034200370300200241186a4200370300200241106a" + "4200370300200241d8006a4200370300200241e0006a4200370300200241" + "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" + "200242003703482002420137034020024200370308200242003703002002" + "420037035002400240024020012002104a0d00200141206a2003104a0d00" + "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" + "010b200141f8006a290300210e200141e8006a2903002106200129037021" + "0c2001290360210d200129035022042001290340220884200141d8006a29" + "0300220b200141c8006a290300220984844200520440427f4200427f4200" + "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" + "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" + "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" + "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" + "21070b4200210442002108420021094200210b200c200d842006200e8484" + "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" + "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" + "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" + "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" + "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" + "20002005370350200020073703402000200b370378200020083703682000" + "200a3703582000200f37034820002001290300370300200041386a200141" + "386a290300370300200041306a200141306a290300370300200041286a20" + "0141286a290300370300200041206a200141206a29030037030020004118" + "6a200141186a290300370300200041106a200141106a2903003703002000" + "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" + "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" + "411c6a1001220045044041000f0b200041086b210102402000410f714504" + "40200121000c010b200041046b220528020022064178712000410f6a4170" + "7141086b2200200020016b4111494104746a220020016b22026b21032006" + "410371044020002003200028020441017172410272360204200020036a22" + "032003280204410172360204200520022005280200410171724102723602" + "00200120026a220320032802044101723602042001200210170c010b2001" + "2802002101200020033602042000200120026a3602000b02402000280204" + "2201410371450d0020014178712202200441106a4d0d0020002004200141" + "017172410272360204200020046a2201200220046b220441037236020420" + "0020026a220220022802044101723602042001200410170b200041086a0b" + "de0a01047f230041f0026b22032400200341a8026a220442003703002003" + "41a0026a22054200370300200342003703c802200342003703c002200342" + "003703b802200342013703b0022003420037039802200342003703900220" + "0341b0026a21060240024002400240200120034190026a104a4504402001" + "41206a2006104a450d010b20044200370300200542003703002003420037" + "03c802200342003703c002200342003703b802200342013703b002200342" + "00370398022003420037039002200220034190026a104a45044020024120" + "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" + "00370300200341a0026a4200370300200342003703c802200342003703c0" + "02200342003703b802200342013703b00220034200370398022003420037" + "039002027f0240200120034190026a104a450440200141206a200341b002" + "6a104a450d010b20042001290320370300200441186a200141386a290300" + "370300200441106a200141306a290300370300200441086a200141286a29" + "0300370300200341106a200141106a290300370300200341186a20014118" + "6a290300370300200320012903003703002003200141086a290300370308" + "200341d0006a0c010b20054200370300200341106a420037030020034118" + "6a4200370300200541086a4200370300200541106a420037030020054118" + "6a4200370300200342003703002003420037030820042105200341306a0b" + "210620034180016a2101200341a0016a2104200642003703082006420037" + "03002005420037030820054201370300200341a8026a4200370300200341" + "a0026a4200370300200342003703c802200342003703c002200342003703" + "b802200342013703b00220034200370398022003420037039002027f0240" + "200220034190026a104a450440200241206a200341b0026a104a450d010b" + "20012002290320370300200141186a200241386a29030037030020014110" + "6a200241306a290300370300200141086a200241286a2903003703002003" + "41f0006a200241106a290300370300200341f8006a200241186a29030037" + "0300200320022903003703602003200241086a290300370368200341b001" + "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" + "370300200441086a4200370300200441106a4200370300200441186a4200" + "37030020034200370360200342003703682001210420034190016a0b2205" + "420037030820054200370300200442003703082004420137030020034190" + "026a2003200341e0006a1040200341c0016a20034190026a104120032802" + "c001410171450d02200020032903d001370300200041386a20034188026a" + "290300370300200041306a20034180026a290300370300200041286a2003" + "41f8016a290300370300200041206a200341f0016a290300370300200041" + "186a200341e8016a290300370300200041106a200341e0016a2903003703" + "00200041086a200341d8016a2903003703000c030b200020022903003703" + "00200041386a200241386a290300370300200041306a200241306a290300" + "370300200041286a200241286a290300370300200041206a200241206a29" + "0300370300200041186a200241186a290300370300200041106a20024110" + "6a290300370300200041086a200241086a2903003703000c020b20002001" + "290300370300200041386a200141386a290300370300200041306a200141" + "306a290300370300200041286a200141286a290300370300200041206a20" + "0141206a290300370300200041186a200141186a29030037030020004110" + "6a200141106a290300370300200041086a200141086a2903003703000c01" + "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" + "7f067e230041e0006b22022400200241386a4200370300200241306a4200" + "370300200242003703582002420037035020024200370348420121042002" + "42013703402002420037032820024200370320027e02402001200241206a" + "104a450440200141206a200241406b104a450d010b200241106a20014110" + "6a290300370300200241186a200141186a29030037030020022001290300" + "3703002002200141086a290300370308200141286a290300210520012903" + "30210620012903202107200141386a2903000c010b42002104200241106a" + "4200370300200241186a4200370300200242003703002002420037030842" + "01210742000b210820004200370358200042003703502000200437034020" + "002006370330200020073703202000200229030037030020002003370348" + "2000200837033820002005370328200041086a2002290308370300200041" + "186a200241186a290300370300200041106a200241106a29030037030020" + "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" + "044108200241037122021b20016a4f0440200241002003200141276a4b1b" + "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" + "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" + "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" + "200241c0016a22034200370300200241b8016a4200370300200241b0016a" + "4200370300200241f8016a420037030020024180026a4200370300200241" + "88026a420037030020024190026a420037030020024198026a4200370300" + "200242003703e80142012105200242013703e001200242003703a8012002" + "42003703a001200242003703f0010240024002402001200241a0016a104a" + "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" + "41e0006a20024180026a104a450d010b200241106a420037030020024118" + "6a4200370300200241206a4200370300200241286a420037030020024140" + "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" + "00200241d0006a200141f0006a290300370300200241d8006a200141f800" + "6a2903003703002002420037030020024200370308200220012903503703" + "302002200141d8006a290300370338200141c8006a290300210620012903" + "40210720024198016a200141386a29030037030020024190016a20014130" + "6a29030037030020024188016a200141286a29030037030020024180016a" + "200141206a290300370300200241f8006a200141186a2903003703002002" + "41f0006a200141106a2903003703002002200141086a2903003703682002" + "20012903003703600c010b42002105200241f0006a4200370300200241f8" + "006a420037030020024180016a420037030020024188016a420037030020" + "024190016a420037030020024198016a4200370300200241406b42003703" + "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" + "00370300200241106a4200370300200241186a4200370300200241206a42" + "00370300200241286a420037030020024200370360200242003703682002" + "420037033020024200370338200242003703002002420037030842012107" + "0b2000200737034020002002290360370300200020022903303703502000" + "2006370348200041086a2002290368370300200041d8006a200229033837" + "0300200041386a20024198016a290300370300200041306a20024190016a" + "290300370300200041286a20024188016a290300370300200041206a2002" + "4180016a290300370300200041186a200241f8006a290300370300200041" + "106a200241f0006a290300370300200041e0006a200241406b2903003703" + "00200041e8006a200241c8006a290300370300200041f0006a200241d000" + "6a290300370300200041f8006a200241d8006a2903003703002000200437" + "0388012000200537038001200020022903003703900120004198016a2002" + "290308370300200041a0016a200241106a290300370300200041a8016a20" + "0241186a290300370300200041b0016a200241206a290300370300200041" + "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" + "0041306b2203240020032001360204200320003602002003410236020c20" + "0341c481c00036020820034202370214200342808080801022042003ad84" + "37032820032004200341046aad843703202003200341206a360210200341" + "086a2002101a000b4101017f230041206b22032400200341003602102003" + "4101360204200342043702082003200136021c2003200036021820032003" + "41186a36020020032002101a000b6801017f230041306b22032400200320" + "01360204200320003602002003410236020c2003418484c0003602082003" + "42023702142003200341046aad4280808080108437032820032003ad4280" + "80808010843703202003200341206a360210200341086a2002101a000b79" + "01017f230041406a220524002005200136020c2005200036020820052003" + "360214200520023602102005410236021c200541d881c000360218200542" + "023702242005200541106aad428080808020843703382005200541086aad" + "428080808030843703302005200541306a360220200541186a2004101a00" + "0b3601017f230041206b22012400200141003602182001410136020c2001" + "41d480c00036020820014204370210200141086a2000101a000bcc060105" + "7f0240024002400240200041046b22062802002207417871220441044108" + "200741037122051b20016a4f044020054100200141276a22082004491b0d" + "0102400240200241094f04402003100b22040d0141000f0b41102003410b" + "6a4178712003410b491b2101024020054504402001418002490d01200420" + "01410472490d01200420016b418180084f0d010c030b200041086b220220" + "046a2105024002400240200120044b0440200541a0a9c000280200460d03" + "2005419ca9c000280200460d02200528020422074102710d042007417871" + "220720046a22042001490d04200520071016200420016b22034110490d01" + "20062001200628020041017172410272360200200120026a220120034103" + "72360204200220046a220420042802044101723602042001200310172000" + "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" + "200120026a22012003410372360204200520052802044101723602042001" + "2003101720000f0b20062004200628020041017172410272360200200220" + "046a2201200128020441017236020420000f0b4194a9c00028020020046a" + "22042001490d010240200420016b2203410f4d0440200620074101712004" + "72410272360200200220046a220120012802044101723602044100210341" + "0021010c010b20062001200741017172410272360200200120026a220120" + "03410172360204200220046a2204200336020020042004280204417e7136" + "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" + "c00028020020046a220420014b0d070b20031001220145044041000f0b20" + "012000417c4178200628020022044103711b20044178716a220420032003" + "20044b1b104c21012000100420010f0b200420002001200320012003491b" + "104c210420062802002203417871220541044108200341037122031b2001" + "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" + "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b20062001200741017172410272360200200120026a220320042001" + "6b22014101723602044198a9c000200136020041a0a9c000200336020020" + "000bf10201047f200028020c21020240024020014180024f044020002802" + "1821040240024020002002460440200041144110200028021422021b6a28" + "020022010d01410021020c020b20002802082201200236020c2002200136" + "02080c010b200041146a200041106a20021b210303402003210520012202" + "41146a200241106a200228021422011b210320024114411020011b6a2802" + "0022010d000b200541003602000b2004450d022000200028021c41027441" + "f4a5c0006a220128020047044020044110411420042802102000461b6a20" + "023602002002450d030c020b2001200236020020020d014190a9c0004190" + "a9c000280200417e200028021c77713602000c020b200028020822032002" + "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" + "0200417e200141037677713602000f0b2002200436021820002802102201" + "044020022001360210200120023602180b20002802142201450d00200220" + "01360214200120023602180b0ba90601047f200020016a21020240024020" + "0028020422034101710d002003410271450d012000280200220320016a21" + "01200020036b2200419ca9c0002802004604402002280204410371410347" + "0d014194a9c000200136020020022002280204417e713602042000200141" + "0172360204200220013602000c020b2000200310160b0240024002402002" + "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" + "00280200460d0320022003417871220310162000200120036a2201410172" + "360204200020016a20013602002000419ca9c000280200470d014194a9c0" + "0020013602000f0b20022003417e71360204200020014101723602042000" + "20016a20013602000b20014180024f0440411f2102200042003702102001" + "41ffffff074d04402001410620014108766722026b764101712002410174" + "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" + "027422044190a9c000280200714504402003200036020020002003360218" + "2000200036020c200020003602084190a9c0004190a9c000280200200472" + "3602000f0b02400240200120032802002204280204417871460440200421" + "020c010b2001411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712001470d000b0b20022802082201200036020c20" + "022000360208200041003602182000200236020c200020013602080f0b20" + "052000360200200020043602182000200036020c200020003602080f0b20" + "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" + "037674220171450440418ca9c000200120037236020020020c010b200228" + "02080b2101200220003602082001200036020c2000200236020c20002001" + "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" + "6a2201360200200020014101723602042000419ca9c000280200470d0141" + "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" + "004194a9c0004194a9c00028020020016a22013602002000200141017236" + "0204200020016a20013602000b0b8e0201057f230041206b220324002000" + "2802002202417f460440410020011019000b410820024101742204200241" + "016a2205200420054b1b2204200441084d1b220441004804404100200110" + "19000b20032002047f2003200236021c2003200028020436021441010541" + "000b360218200341086a2105027f0240200341146a220228020404402002" + "280208220645044041bda9c0002d00001a0c020b20022802002006410120" + "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" + "20052002410120021b360204200520024536020020032802084101460440" + "20032802101a200328020c20011019000b200328020c2102200020043602" + "0020002002360204200341206a24000b0d002000450440200110140b000b" + "f40102027f017e230041106b22022400200241013b010c20022001360208" + "20022000360204230041106b22002400200241046a220129020021042000" + "200136020c20002004370204230041106b22022400200041046a22012802" + "00220028020c2103024002400240024020002802040e020001020b20030d" + "0141012100410021030c020b20030d002000280200220028020421032000" + "28020021000c010b20024180808080783602002002200136020c20012802" + "0822012d0008210020012d00091a2002410420001033000b200220033602" + "0420022000360200200128020822012d0008210020012d00091a20024105" + "20001033000b6801017f230041306b220324002003200136020420032000" + "3602002003410236020c200341e483c00036020820034202370214200320" + "0341046aad4280808080108437032820032003ad42808080801084370320" + "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" + "002102230041106b22072400410a2103024020024190ce00490440200221" + "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" + "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" + "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" + "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" + "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" + "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" + "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" + "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" + "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" + "210941012108410a20036b220a2001280214220241017122056a21062008" + "410020024104711b2108412b418080c40020051b21052001280200450440" + "4101200128021c22002001280220220320052008101d0d011a2000200920" + "0a200328020c1103000c010b0240024002402006200128020422004f0440" + "200128021c22002001280220220320052008101d450d0141010c040b2002" + "410871450d01200128021021022001413036021020012d0018210c410121" + "0b200141013a0018200128021c22032001280220220420052008101d0d02" + "200020066b41016a210002400340200041016b2200450d01200341302004" + "280210110200450d000b41010c040b410120032009200a200428020c1103" + "000d031a2001200c3a00182001200236021041000c030b20002009200a20" + "0328020c110300210b0c010b200020066b2102024002400240410120012d" + "0018220020004103461b220041016b0e020001020b20022100410021020c" + "010b20024101762100200241016a41017621020b200041016a2100200128" + "0210210620012802202103200128021c210402400340200041016b220045" + "0d01200420062003280210110200450d000b41010c020b4101210b200420" + "0320052008101d0d0020042009200a200328020c1103000d004100210003" + "40410020002002460d021a200041016a2100200420062003280210110200" + "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" + "380002402002418080c400460d00200020022001280210110200450d0041" + "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" + "0c7f20002802042107200028020021030240024020012802002209200128" + "0208220072044002402000410171450d00200320076a2106024020012802" + "0c2205450440200321020c010b200321020340200222002006460d02027f" + "200041016a20002c0000220241004e0d001a200041026a20024160490d00" + "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" + "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" + "07027f02402004450d00200420074f044020042007460d0141000c020b20" + "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" + "001b21030b2009450440200128021c20032007200128022028020c110300" + "0f0b2001280204210c200741104f044020072003200341036a417c712204" + "6b22086a220a41037121094100210541002100200320044704402008417c" + "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" + "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" + "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" + "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" + "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" + "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" + "4a6a21050b200a4102762106200020056a21050340200421092006450d04" + "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" + "200641044f04402004200d41f007716a2108200421000340200028020c22" + "04417f7341077620044106767241818284087120002802082204417f7341" + "077620044106767241818284087120002802042204417f73410776200441" + "06767241818284087120002802002204417f734107762004410676724181" + "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" + "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" + "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" + "6a22022802002200417f734107762000410676724181828408712100200b" + "4101460d0220022802042204417f73410776200441067672418182840871" + "20006a2100200b4102460d0220022802082202417f734107762002410676" + "7241818284087120006a21000c020b2007450440410021050c030b200741" + "03712102027f200741044904404100210041000c010b20032c000041bf7f" + "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" + "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" + "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" + "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" + "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" + "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" + "41016b22020d000b0c020b200128021c20032007200128022028020c1103" + "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" + "20056a21050b02402005200c490440200c20056b21060240024002402001" + "2d00182200410020004103471b220041016b0e020001020b200621004100" + "21060c010b20064101762100200641016a41017621060b200041016a2100" + "2001280210210820012802202102200128021c21040340200041016b2200" + "450d02200420082002280210110200450d000b41010f0b200128021c2003" + "2007200128022028020c1103000f0b200420032007200228020c11030004" + "4041010f0b4100210003402000200646044041000f0b200041016a210020" + "0420082002280210110200450d000b200041016b2006490b140020002802" + "002001200028020428020c1102000b0e0041e480c000412b20001011000b" + "5901017f230041306b220324002003200136020c20032000360208200341" + "01360214200341dc80c0003602102003420137021c2003200341086aad42" + "8080808030843703282003200341286a360218200341106a2002101a000b" + "7f01017f027f0240027f0240200228020404402002280208220345044020" + "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" + "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" + "032002450c010b4104210341000b21022000200136020820002003360204" + "200020023602000bdd0101087f230041206b220224002000280200220341" + "7f460440410020011019000b20034101742204200341016a220620042006" + "4b1b220441ffffffff034b0440410020011019000b024041042004200441" + "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" + "02200341027436021c2002200028020436021441040520040b3602182002" + "41086a2006200241146a102220022802084101470d012002280210210520" + "0228020c0520050b210820052109200820011019000b200228020c210320" + "00200736020020002003360204200241206a24000bd10d021c7f077e2300" + "41206b220c2400200341016b211102400240024002402003044020034102" + "6b210520034101460d0402402001280208221420036b221941016a220e41" + "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" + "746a2802002115200220054102746a3502002123027f2004450440410421" + "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" + "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" + "09200e044020012802042212200941027420034102746b6a211320034101" + "7121162003417e71210d201241086b211b201241046b211c42002015ad22" + "2242208622247d2125200e210f0340024020090440201c20094102742204" + "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" + "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" + "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" + "868422202020202280222620227e7d21202026a70b21070240202042ffff" + "ffff0f560d00202520204220867c20217c21210340202120247c22212007" + "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" + "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" + "09200f460d04201220176a21182007ad212102400240201145044042ffff" + "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" + "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" + "22203e0200200441046a220a200a35020020204220887c2021200541046a" + "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" + "04200541086a2105200d200641026a2206470d000b2016450d010b201820" + "0641027422046a2205202020053502007c2021200220046a3502007e7d42" + "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" + "20114504404100210a410021080c030b41002104410021084100210a0340" + "200420136a22052005280200221d200220046a221e2802006a220620086a" + "2208360200200541046a22052005280200221f201e41046a2802006a2205" + "2006201d49200620084b726a22063602002005201f49200520064b722108" + "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" + "c000101b000b2016450d010b2018200a41027422046a2205200528020020" + "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" + "3602002001200941016b2209360208201341046b2113201220094102746a" + "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" + "200941016a220d3602082001280204220a200941027422046a2008360200" + "20080d03200d41ffffffff0371210702400340200721052004417c460d01" + "200541016b21072004200a6a2106200441046b21042006280200450d000b" + "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" + "41ac87c0001010000b200120053602082005210d0b024002400240024002" + "40200d200128020022044102764f0d002004200d490d012004450d002004" + "41027421040240200d450440200a41046b28020022054178712207410441" + "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" + "200a1004410421040c010b200a20044104200d41027410152204450d060b" + "2001200d360200200120043602040b41002106200e450d03200b200e4102" + "746a41046b2802000440200e21060c040b201441027420034102746b2104" + "201941026a210503402004417c460d04200541016b21052004200b6a2107" + "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" + "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" + "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b024002400240024020104102" + "7620064d0440201021040c010b200620104b0d01410021042010450d0020" + "1041027421052006450440200b41046b2802002207417871220a41044108" + "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" + "0b10044104210b0c010b200b20054104200622044102741015220b450d04" + "0b200020063602082000200b360204200020043602002000200129020037" + "020c200041146a200141086a280200360200200c41206a24000f0b200c41" + "00360218200c410136020c200c41ec84c000360208200c4204370210200c" + "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" + "010c7f230041306b220724002001280200210c0240024002400240024002" + "400240024002400240024002400240024020024504402001280204210b20" + "0c418080808078470d02200b41086a280200220441ffffffff034d044020" + "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" + "220b2001200c418080808078461b2208280208220941feffffff014f0d04" + "41bda9c0002d00001a200941026a220141027410012205450d0720054100" + "360200200720053602102007200136020c41012101200741013602142008" + "2802082206410274210d200828020421082006200941016a4b0440200741" + "0c6a2105230041206b22042400024002402006417f460d00200528020022" + "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" + "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" + "047f2004200941027436021c2004200528020436021441040541000b3602" + "18200441086a200a200441146a102220042802084101470d012004280210" + "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" + "0f36020020052001360204200441206a2400200728021021052007280214" + "21010b200520014102746a2008200d104c1a2007200120066a2204360214" + "0c030b200b41046a28020021092006450440410421054100210141042009" + "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" + "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" + "2004360214200720053602102007200136020c0b200341ff0171450d0202" + "40200220044d044020022004470d01200221040c040b2002410041c889c0" + "00101b000b20044102742109200241027421012003411f71210841002003" + "6b411f71210d410021030340200120056a22062006280200220620087420" + "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" + "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" + "89c0001023200728021021050b200520044102746a200336020020072004" + "41016a22043602140b41002108200728020c210a02402004450d00200520" + "0441027422016a41046b2802000440200421080c010b200541046b210d20" + "0441ffffffff037121030340200321062001450d01200641016b21032001" + "200d6a2109200141046b21012009280200450d000b200420062004200649" + "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" + "41002101200a450d00200a41027421032008450440200541046b28020022" + "06417871220941044108200641037122061b20036a490d04200641002009" + "200341276a4b1b0d0520051004410421050c010b20052003410420082201" + "41027410152205450d010b20002008360208200020053602042000200136" + "02002002450d06200c41808080807872418080808078460d06200b41046b" + "28020022014178712203200c410274220641044108200141037122011b6a" + "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" + "003602282007410136021c200741ec84c000360218200742043702202007" + "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" + "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" + "bda9c0002d00001a024002400240412010012202450d0020022001290000" + "370200200220012900083702082002200129001037021020022001280018" + "3602182002200128001c220336021c410821012000027f410820030d001a" + "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" + "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" + "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" + "1a2002280200450440200241046b28020022014178714124412820014103" + "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" + "210141000c010b200241204104410410152202450d014101210141010b36" + "020820002002360204200020013602000f0b000b41f996c000412e41a897" + "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" + "024106746a2124200028021c21222000280218211f2000280214211e2000" + "280210211b200028020c2123200028020821202000280204211d20002802" + "002102034020022001280000220341187420034180fe0371410874722003" + "4108764180fe03712003411876727222152022201b411a77201b41157773" + "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" + "1d202073200271201d202071732002411e772002411377732002410a7773" + "6a6a2203411e772003411377732003410a777320032002201d7371200220" + "1d71736a201f2001280004220541187420054180fe037141087472200541" + "08764180fe03712005411876727222136a200420236a2207201b201e7371" + "201e736a2007411a772007411577732007410777736a419189dd89076a22" + "066a2205411e772005411377732005410a77732005200220037371200220" + "0371736a201e2001280008220441187420044180fe037141087472200441" + "08764180fe03712004411876727222146a200620206a220c2007201b7371" + "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a201b200128000c220641187420064180fe037141087472200641" + "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" + "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" + "086a2206411e772006411377732006410a77732006200420057371200420" + "0571736a20072001280010220f411874200f4180fe037141087472200f41" + "08764180fe0371200f411876727222166a200220086a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280014220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a2001280018220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a200128001c220841187420084180fe0371410874722008410876" + "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" + "096a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280020220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" + "096a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280024220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280028220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a200128002c220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" + "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a2001280030220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" + "200f736a2009411a772009411577732009410777736a41f4baf995076a22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280034220c411874200c4180fe037141087472200c410876" + "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" + "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" + "0d6a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280038220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" + "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" + "0f6a2207411e772007411377732007410a77732007200420067371200420" + "0671736a200128003c220d411874200d4180fe037141087472200d410876" + "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" + "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" + "086a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20134119772013410e777320134103767320156a200a6a200c41" + "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" + "1773712012736a2015411a772015411577732015410777736a41bfac92db" + "016b22096a2205411e772005411377732005410a77732005200320077371" + "2003200771736a20144119772014410e777320144103767320136a200b6a" + "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" + "2015201773712017736a2013411a772013411577732013410777736a41fa" + "f08682016b220e6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20114119772011410e777320114103767320146a" + "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" + "6a22142013201573712015736a2014411a77201441157773201441077773" + "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" + "2004200573712004200571736a20164119772016410e7773201641037673" + "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" + "0720126a22112013201473712013736a2011411a77201141157773201141" + "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" + "7320072004200673712004200671736a20184119772018410e7773201841" + "03767320166a20216a2009410f772009410d77732009410a76736a221220" + "136a200320176a22162011201473712014736a2016411a77201641157773" + "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" + "410a777320032006200773712006200771736a20194119772019410e7773" + "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" + "221720146a200520156a22182011201673712011736a2018411a77201841" + "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" + "732005410a777320052003200773712003200771736a201a411977201a41" + "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" + "76736a221520116a200420136a22192016201873712016736a2019411a77" + "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" + "411377732004410a777320042003200573712003200571736a2002411977" + "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" + "17410a76736a221320166a200620146a221a2018201973712018736a201a" + "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" + "772006411377732006410a777320062004200573712004200571736a200a" + "411977200a410e7773200a4103767320026a20086a2015410f772015410d" + "77732015410a76736a221420186a200720116a22022019201a7371201973" + "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" + "07411e772007411377732007410a77732007200420067371200420067173" + "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" + "13410d77732013410a76736a221120196a200320166a220a2002201a7371" + "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" + "186a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20104119772010410e7773201041037673200b6a200e6a201441" + "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" + "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" + "046b22196a2205411e772005411377732005410a77732005200320077371" + "2003200771736a201c411977201c410e7773201c4103767320106a20126a" + "2011410f772011410d77732011410a76736a221820026a200420196a2202" + "200a200b7371200a736a2002411a772002411577732002410777736a41b9" + "809a85046b221a6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20214119772021410e7773202141037673201c6a" + "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" + "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" + "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" + "2004200573712004200571736a200c411977200c410e7773200c41037673" + "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" + "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" + "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" + "7320072004200673712004200671736a200d411977200d410e7773200d41" + "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" + "026a200320106a2202200a200b7371200a736a2002411a77200241157773" + "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200f411977200f410e777320" + "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" + "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" + "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20084119772008410e" + "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" + "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" + "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a200941197720" + "09410e777320094103767320086a20166a200d410f77200d410d7773200d" + "410a76736a220820026a200620106a2202200a200b7371200a736a200241" + "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a200e41" + "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" + "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" + "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20124119772012410e7773201241037673200e6a20196a2008410f772008" + "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" + "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20174119772017410e777320174103767320126a201a6a2009410f" + "772009410d77732009410a76736a221220026a200520106a2202200a200b" + "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" + "6a22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20154119772015410e777320154103767320176a200c6a20" + "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" + "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" + "a8b3076a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20134119772013410e777320134103767320156a20" + "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" + "220b2002200a73712002736a200b411a77200b41157773200b410777736a" + "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20144119772014410e777320144103767320" + "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" + "20106a2202200a200b7371200a736a2002411a7720024115777320024107" + "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" + "20072004200673712004200671736a20114119772011410e777320114103" + "767320146a20086a2015410f772015410d77732015410a76736a2214200a" + "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" + "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20164119772016410e777320" + "164103767320116a20096a2013410f772013410d77732013410a76736a22" + "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" + "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20184119772018410e" + "777320184103767320166a200e6a2014410f772014410d77732014410a76" + "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" + "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201941197720" + "19410e777320194103767320186a20126a2011410f772011410d77732011" + "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" + "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201a41" + "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" + "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" + "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" + "410d77732018410a76736a221a20026a200320106a2202200a200b737120" + "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" + "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" + "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" + "6b22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" + "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" + "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" + "aa83016a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20084119772008410e7773200841037673200f6a20" + "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" + "2202200a200b7371200a736a2002411a772002411577732002410777736a" + "41968293cd016a221c6a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20094119772009410e777320094103767320" + "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" + "201c6a22082002200b7371200b736a2008411a7720084115777320084107" + "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" + "20072004200673712004200671736a200e411977200e410e7773200e4103" + "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" + "6a2003201c6a22092002200873712002736a2009411a7720094115777320" + "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20124119772012410e777320" + "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" + "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" + "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20174119772017410e" + "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" + "736a221220086a200220046a22082009200e73712009736a2008411a7720" + "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201541197720" + "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" + "410a76736a221720096a200220066a22092008200e7371200e736a200941" + "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201341" + "19772013410e777320134103767320156a200d6a2012410f772012410d77" + "732012410a76736a2215200e6a200220076a220e2008200973712008736a" + "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20144119772014410e777320144103767320136a200f6a2017410f772017" + "410d77732017410a76736a221320086a200220036a22082009200e737120" + "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20114119772011410e777320114103767320146a20106a2015410f" + "772015410d77732015410a76736a221420096a200220056a22092008200e" + "7371200e736a2009411a772009411577732009410777736a41ee85bea407" + "6a22026a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20164119772016410e777320164103767320116a200a6a20" + "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" + "08200973712008736a200e411a77200e41157773200e410777736a41efc6" + "95c5076a22026a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20184119772018410e777320184103767320166a20" + "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" + "22082009200e73712009736a2008411a772008411577732008410777736a" + "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20194119772019410e777320194103767320" + "186a20126a2011410f772011410d77732011410a76736a221220096a2002" + "20076a22092008200e7371200e736a2009411a7720094115777320094107" + "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" + "20072004200673712004200671736a201a411977201a410e7773201a4103" + "767320196a20176a2016410f772016410d77732016410a76736a2217200e" + "6a200320116a220e2008200973712008736a200e411a77200e4115777320" + "0e410777736a41868084fa066b22116a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200c411977200c410e777320" + "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" + "1220086a200520116a22052009200e73712009736a2005411a7720054115" + "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" + "2008410a777320082003200773712003200771736a200c200d411977200d" + "410e7773200d410376736a20136a2017410f772017410d77732017410a76" + "736a20096a200420156a22042005200e7371200e736a2004411a77200441" + "1577732004410777736a4189b89988046b22096a220c2003200873712003" + "200871736a200c411e77200c41137773200c410a77736a200d200f411977" + "200f410e7773200f410376736a20146a2012410f772012410d7773201241" + "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" + "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" + "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" + "21232004201f6a211f200520226a2122200141406b22012024470d000b20" + "00202236021c2000201f3602182000201e3602142000201b360210200020" + "2336020c200020203602082000201d360204200020023602000b89010101" + "7f027f0240200328020404402003280208220445044020012002450d031a" + "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" + "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" + "490d002002100b0c010b200210010b210320002002360208200020032001" + "20031b36020420002003453602000b3000200128021c20002d0000410274" + "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" + "1103000bfc0402037f017e23004180016b220224000240024020012d0000" + "220441c00171220341c000470440200241186a200141186a290000370300" + "200241106a200141106a290000370300200241086a200141086a29000037" + "030020022001290000220537030020022005a7413f713a0000200241406b" + "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" + "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" + "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" + "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" + "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" + "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" + "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" + "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" + "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" + "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" + "200041c0003a0020200041186a4200370300200041106a42003703002000" + "41086a42003703000c010b200241386a200241e8006a2903003703002002" + "41306a200241e0006a290300370300200220022903503703202002200241" + "d8006a2903003703282003044020002002290320370300200020033a0020" + "200041086a2002290328370300200041186a200241386a29030037030020" + "0041106a200241306a2903003703000c010b200241003602502002410136" + "0244200241a88cc00036024020024204370248200241406b419c8dc00010" + "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" + "00290300220c200041086a290300220d8450047e420005200741f0016a20" + "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" + "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" + "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" + "072903f0012112200741c8016a290300200741a8016a290300220d200729" + "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" + "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" + "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" + "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" + "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" + "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" + "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" + "21112000290310220c200041186a290300220d8450047e420005200741f0" + "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" + "104d20074180016a200d2002104d200741306a200c2003104d200741206a" + "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" + "0741c8006a290300200741286a290300220320072903407c2204200354ad" + "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" + "117c2204200254ad200420072903207c2202200454ad7c20022007418801" + "6a29030020074198016a29030022012007290380017c2204200154ad7c20" + "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" + "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" + "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" + "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" + "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" + "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" + "200e3703b002200720123703a002200720043703d802200720113703c802" + "2007200f3703b802200720133703a80220074188036a4200370300200741" + "80036a4200370300200741f8026a4200370300200742003703f002200741" + "f0026a210a41ff032109420021034200210442002101420021024201210d" + "0340200741106a2009410776410474220b200741a0026a6a220829030020" + "08290308200941ff00712208104e2004423f88210c20044201862003423f" + "888421042007290310420183200342018684210302400240024002400240" + "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" + "3f8884220242a9c0c689aece93b230858450044020032005542004200654" + "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" + "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" + "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" + "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" + "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" + "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" + "022004200f7d2104200320057d2103200941016a41810249200d42005271" + "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" + "22082008290300200729030084370300200841086a220820082903002007" + "41086a2903008437030020090d010b200020023703182000200137031020" + "0020043703082000200337030020074190036a24000f0b200941016b2109" + "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" + "3a00000240200004400340024002400240200041016b0e03000501020b03" + "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" + "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" + "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" + "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" + "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" + "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" + "0b0b840202047e017f200041086a29030021092000290300210a0240417f" + "2000290310220b200385200041186a290300220c20048584420052200320" + "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" + "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" + "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" + "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" + "2000200920027d22072001200a56ad22017d37030820002003427f852203" + "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" + "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" + "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" + "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" + "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" + "3700002003200210262000027f0240024002400240024002400240024002" + "40024002400240024002400240027f024002400240024002400240024002" + "7f02400240027f0240024002400240024002400240024002400240024002" + "400240024002400240024002400240200241046b28020022044178714124" + "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" + "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" + "290000370000200220012900002210370000200241106a2205200141106a" + "290000370000200241086a2208200141086a29000037000020022002411f" + "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" + "22072d00003a0001200720013a00002002411d6a22012d00002107200120" + "022d00023a0000200220073a00022002411c6a22012d0000210720012002" + "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" + "00043a0000200220073a00042002411a6a22012d00002107200120022d00" + "053a0000200220073a0005200241196a22012d00002107200120022d0006" + "3a0000200220073a000620042d00002101200420022d00073a0000200220" + "013a0007200241176a22012d00002104200120082d00003a000020082004" + "3a0000200241166a22012d00002104200120022d00093a0000200220043a" + "0009200241156a22012d00002104200120022d000a3a0000200220043a00" + "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" + "200241136a22012d00002104200120022d000c3a0000200220043a000c20" + "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" + "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" + "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" + "200241046b280200220141787141244128200141037122041b490d022004" + "4100200141c8004f1b0d032002100420032802082202450d120240024002" + "40200241016b220241feffffff0371450440200241ffffffff0371220441" + "016a2205410371210142002110200328020422082102200441034f044020" + "0541fcffffff07712104034020104280017c2110200241106a2102200441" + "046b22040d000b0b2001450d020340200235020020108620117c21112010" + "42207c2110200241046a2102200141016b22010d000b2011428080808010" + "540d010b200341406b200341146a2802003602002003200329020c370338" + "200341d0006a200341086a28020022043602002003200329020037034820" + "04450d0720032802402207450440200341206a418098c000280200220236" + "02002003412c6a2002360200200341f897c0002902002210370318200320" + "10370224200328024822020440200328024c220441046b28020022014178" + "7122052002410274220241044108200141037122011b6a490d0a20014100" + "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" + "3c220441046b280200220141787122052002410274220241044108200141" + "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" + "0b0240027f02400240024020044101460440200328024c220c2802002202" + "4101470d012003412c6a418098c000280200360200200341206a20034114" + "6a2802003602002003200329020c370318200341f897c000290200370224" + "20032802482202450d2a200c41046b280200220141787122042002410274" + "220241044108200141037122011b6a490d12200141002004200241276a4b" + "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" + "200747200420074b1b22050d0020074102742102200b41046b2106200441" + "02742101200c41046b2109200420076b21070340200204402001450d0720" + "0220066a2105200120096a2108200241046b2102200141046b2101417f20" + "082802002208200528020022054720052008491b2205450d010c020b0b41" + "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" + "450d1220074102742101200328023c2109200241ffff034d044020094104" + "6b2106410021040340200120066a22052005280200220541107622082008" + "20044110747220026e220420026c6b411074200541ffff03717222052002" + "6e22082004411074723602002005200220086c6b2104200141046b22010d" + "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" + "45044042002111200120096a0c270b200241016a41feffffff0771210120" + "0741027420096a41086b2102420021110340200241046a22042004350200" + "201142208684221120108022123e0200200220023502002011201020127e" + "7d42208684221120108022123e02002011201020127e7d2111200241086b" + "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" + "002003200329020c370224200341186a0c010b2003410036024020032802" + "38047f200b05200341386a418c87c0001023200328023c0b410136020020" + "0341406b4101360200200341206a41013602002003200329033837031820" + "0341246a0b220241086a418098c000280200360200200241f897c0002902" + "0037020020032802482202450d25200c41046b2802002201417871220420" + "02410274220241044108200141037122011b6a490d102001410020042002" + "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" + "20022802002202672208450440200341f8006a200341146a280200360200" + "2003200329020c370370200341186a200341f0006a200c20041024200328" + "02482202450d25200c41046b280200220141787122042002410274220241" + "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" + "200c10040c250b024002402003280238418080808078470d00200b280208" + "0d002003410036026c20034280808080c0003702640c010b200341e4006a" + "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" + "402003280248418080808078470d00200c2802080d004100210420034100" + "3602704100210541040c010b200341f0006a20032002452008411f711025" + "200328027021042003280278210520032802740b220120051024200341e0" + "006a200341206a28020036020020032003290218370358200328022c2105" + "200328022821092003280224210c20040440200141046b28020022074178" + "7122062004410274220441044108200741037122071b6a490d1420074100" + "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" + "404100210120092802080d0141042105410021040c220b41002101200545" + "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" + "0274220a20092206200620044102746a22056b4b04402005200a6a210120" + "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" + "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" + "200d2107200121040340200641016b2206200441016b22042d00003a0000" + "200741016b22070d000b0b200f4103490d00200441046b21040340200641" + "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" + "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" + "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" + "6b21064100200a6b210702402001200e6a2201410371450440200220064d" + "0d01200420056a41046b21050340200241046b2202200528020036020020" + "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" + "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" + "280200210a0340200241046b2202200a200e742005280200220a200d7672" + "360200200541046b2105200220064b0d000b0b2004410371210a20012007" + "6a21010c010b200a41104f044002402006410020066b41037122076a2204" + "20064d0d00200741016b210d200521022007044020072101034020062002" + "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" + "0b200d4107490d000340200620022d00003a0000200641016a200241016a" + "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" + "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" + "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" + "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" + "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" + "0371450440200420064f0d01200221050340200420052802003602002005" + "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" + "410374220a41187121072002417c71220f41046a21054100200a6b411871" + "210e200f280200210a03402004200a2007762005280200220a200e747236" + "0200200541046a2105200441046a22042006490d000b0b2001410371210a" + "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" + "0771220204400340200620052d00003a0000200541016a2105200641016a" + "2106200241016b22020d000b0b20014107490d010340200620052d00003a" + "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" + "003a0000200641036a200541036a2d00003a0000200641046a200541046a" + "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" + "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" + "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" + "0a41016b2104200a410371220504400340200641016b2206200141016b22" + "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" + "21050340200641016b200541036a2d00003a0000200641026b200541026a" + "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" + "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" + "200941046a28020021072009280208220420024522024d04402004410274" + "21022004044041bda9c0002d00001a200210012205450d360b2005200720" + "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" + "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" + "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" + "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" + "410371210820074103490d1b200641fcffffff077121070340200241046b" + "220620062802002206200176200572360200200241086b22052006200474" + "20052802002205200176723602002002410c6b2206200520047420062802" + "00220620017672360200200241106b220220062004742002280200220520" + "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" + "14200328021421022003280210210502402011428080045a04402002450d" + "0320024102742104200241ffffffff036a220741ffffffff037122020d01" + "42002110200420056a0c180b2002450d022011a721040c180b200241016a" + "41feffffff07712101200420056a41086b21024200211003402002350200" + "200241046a35020020104220868420118242208684201182211020024108" + "6b2102200141026b22010d000b0c150b2003280210210520032802142202" + "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" + "1011000b41b897c000412e41e897c0001011000b20034100360228200341" + "0136021c200341a099c00036021820034204370220200341186a41fc86c0" + "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" + "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" + "412e41e897c0001011000b200341003602282003410136021c200341a099" + "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b200341003602282003410136021c200341a099c00036021820034204" + "370220200341186a41989ac000101a000b200241086a0b21022007410171" + "047e201005200241046b3502002010422086842011820ba721010c010b20" + "0241027421024100210103402001411074200241046b220220056a280200" + "220141107672200470411074200141ffff037172200470210120020d000b" + "0b41002102200341206a418098c000280200360200200341f897c0002902" + "0037031820014504404104210741000c010b200341186a41f498c0001023" + "200328021c220720013602004101210220032802180b210a024002400240" + "0240200328020022010440200841046b2802002204417871220620014102" + "74220141044108200441037122041b6a490d01200441002006200141276a" + "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" + "787122082001410274220141044108200441037122041b6a490d02200441" + "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" + "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" + "41046b21020340200220022802002207200176200572360200200241046b" + "210220072004742105200841016b22080d000b0b41002101200b450d0020" + "09200b41027422026a41046b2802000440200b21010c010b200941046b21" + "07200b41ffffffff037121040340200421052002450d01200441016b2104" + "200220076a2108200241046b21022008280200450d000b200b2005200520" + "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" + "04200c450440200921050c050b200c41027421022001450440200941046b" + "2802002205417871220841044108200541037122051b20026a490d022005" + "41002008200241276a4b1b0d0320091004410421050c050b200121042009" + "200241042001410274101522050d040c180b200341003602282003410136" + "021c200341ec84c00036021820034204370220200341186a41f484c00010" + "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b200c2104200921050b200341206a200341e0006a2802003602" + "00200320032903583703182003200136022c200320053602282003200436" + "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" + "1105200241046b22022002350200201142208684221120108022123e0200" + "2011201020127e7d0ba721040b2003280238210b02402009200741027422" + "026a41046b2802000d00200941046b210620072101034020012105200245" + "0440410021070c020b200541016b2101200220066a2108200241046b2102" + "2008280200450d000b20072005200520074b1b21070b0240200b41027620" + "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" + "027421012007450440200941046b28020022054178712208410441082005" + "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" + "04410421090c010b2009200141042007220241027410152209450d100b20" + "034100360250200404402003280248047f200c05200341c8006a41dc86c0" + "001023200328024c0b2004360200200341013602500b2003412c6a200341" + "d0006a280200360200200320032903483702242003200936021c20032002" + "3602180b200328022c2102200328022821072003280224210a2003280218" + "2201450d00200328021c220541046b280200220441787122082001410274" + "220141044108200441037122041b6a490d04200441002008200141276a4b" + "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" + "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" + "86200720024102746a41046b28020067ad7d221042038820104207834200" + "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" + "a7220510012204450d0e0b200341003602202003200436021c2003200536" + "02182007200241016b22054102746a210920050440200241027441046b21" + "06410021020340200220076a280200210120032802182002460440200341" + "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" + "0241016a2205360220200141087621082003280218200546044020034118" + "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" + "03200541016a220536022020014110762108200328021820054604402003" + "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" + "002003200541016a22053602202001411876210120032802182005460440" + "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" + "3a00002003200541016a2205360220200241046a21012005210220012006" + "470d000b0b20092802002202450d05034020032802182001460440200341" + "186a419c88c00010180b200328021c220420016a20023a00002003200141" + "016a2201360220200241ff014b21052002410876210220050d000b0c060b" + "200341003602282003410136021c200341ec84c000360218200342043702" + "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" + "0218210d200141014b0d010b200341306a4200370300200341286a420037" + "0300200341206a4200370300200342003703180c010b200120046a210c41" + "002102200141017622084101470440200141016b2105200841feffffff07" + "71210b0340200420056a22062d000021092006200220046a22082d00003a" + "0000200820093a0000200c2002417e736a22062d00002109200620084101" + "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" + "2202470d000b0b20014102710440200220046a22052d000021082005200c" + "2002417f736a22022d00003a0000200220083a00000b200341306a420037" + "0300200341286a4200370300200341206a42003703002003420037031820" + "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" + "388620104280fe0383422886842010428080fc0783421886201042808080" + "f80f834208868484201042088842808080f80f832010421888428080fc07" + "838420104228884280fe038320104238888484842112200341306a290300" + "221042388620104280fe0383422886842010428080fc0783421886201042" + "808080f80f834208868484201042088842808080f80f8320104218884280" + "80fc07838420104228884280fe038320104238888484842113417f200329" + "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" + "9bb0a0acdd008584420052201142388620114280fe038342288684201142" + "8080fc0783421886201142808080f80f8342088684842011420888428080" + "80f80f832011421888428080fc07838420114228884280fe038320114238" + "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" + "422886842010428080fc0783421886201042808080f80f83420886848420" + "1042088842808080f80f832010421888428080fc07838420104228884280" + "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" + "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" + "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" + "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" + "20103703282000201237031841000c020b410021010b200020013a000141" + "010b3a00000240024002400240200a0440200741046b2802002202417871" + "2201200a410274220541044108200241037122021b6a490d012002410020" + "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" + "7871220141044108200241037122021b200d6a490d03200241002001200d" + "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" + "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" + "02057f167e230041e0006b22032400200341386a2204200141186a290300" + "370300200341306a2205200141106a290300370300200320012903003703" + "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" + "206a20022903002219200241086a290300221a2002290310221b20024118" + "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "042903002113200529030021142003290320211520032903282116200341" + "106a2206200141306a290300370300200341186a2207200141386a290300" + "370300200320012903203703002003200141286a29030037030820032002" + "290320220e200241286a290300220c20022903302211200241386a290300" + "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" + "030037030020052006290300370300200320032903083703282003200329" + "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" + "7c220d2016200329032822087c2209200854ad2009201520032903202208" + "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" + "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" + "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" + "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" + "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" + "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" + "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" + "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" + "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" + "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" + "210f024002402001290330221020012903107c2209200141286a29030022" + "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" + "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" + "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" + "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" + "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" + "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" + "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" + "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" + "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" + "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" + "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" + "307d21090b2003200f37035020032010370340200320093703582003200b" + "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" + "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" + "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" + "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" + "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" + "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" + "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" + "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" + "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" + "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" + "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" + "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d200341406b200329030020032903082003290310" + "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" + "002012370310200020183703082000201737030020002003290340370320" + "200041286a2003290348370300200041306a200341d0006a290300370300" + "200041386a200341d8006a290300370300200341e0006a24000ba706010a" + "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" + "03107c2207200241086a2903002203200141086a2903007c2204200354ad" + "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" + "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" + "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" + "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" + "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" + "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" + "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" + "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" + "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" + "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" + "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" + "02290330220920012903307c2204200241286a2903002205200141286a29" + "03007c2203200554ad20032002290320220520012903207c2206200554ad" + "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" + "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" + "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" + "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" + "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" + "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" + "450d002006210920052106200321080c010b200420032005200642c7faf3" + "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" + "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" + "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" + "2008370330200020093703202000200a3703102000200b37030020002004" + "37033820002006370328200020073703182000200c3703080bf10802087f" + "087e23004180016b22022400200141386a290300210e200141286a290300" + "210b200141186a2203290300210d2001290330210f2001290320210a2001" + "290310210c02400240024020012903002210200141086a22042903002211" + "844200520d00200c200d844200520d00200a200b844200520d00200e200f" + "84500d010b200241186a22052003290300370300200241106a2206200141" + "106a22072903003703002002200429030037030820022001290300370300" + "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200241386a2204200141206a220341186a29030037030020024130" + "6a2208200341106a22092903003703002002200341086a29030037032820" + "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" + "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2000027e2002290300220d2006290300220c842002290308220b200529" + "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" + "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" + "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" + "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" + "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" + "290350210a200241d0006a20072903003703002004200141186a29030037" + "0300200220012903003703402002200141086a290300370348200241406b" + "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200241f8006a2201200341186a290300370300200241f0006a22042009" + "2903003703002002200341086a2903003703682002200329030037036020" + "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f102b2004290300220c20022903602210842001290300220e2002" + "290368220b84845004404200210c4200210b4200210a4200210e4200210f" + "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" + "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" + "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" + "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" + "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" + "03402000200c370330200020022903403703102000200f3703082000200e" + "3703482000200b370338200041186a2002290348370300200041206a2002" + "41d0006a290300370300200041286a200241d8006a2903003703000c010b" + "20004200370308200042003703000b20024180016a24000b090020004100" + "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" + "220441016a360200024020044100480d00024041bca9c0002d0000450440" + "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" + "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" + "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" + "20004200370210200141ffffff074d04402001410620014108766722026b" + "7641017120024101746b413e6a21020b2000200236021c200241027441f4" + "a5c0006a2103410120027422044190a9c000280200714504402003200036" + "0200200020033602182000200036020c200020003602084190a9c0004190" + "a9c0002802002004723602000f0b02400240200120032802002204280204" + "417871460440200421020c010b2001411920024101766b41002002411f47" + "1b742103034020042003411d764104716a41106a22052802002202450d02" + "200341017421032002210420022802044178712001470d000b0b20022802" + "082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080bd20102067f017e230041206b2201240002400240200028" + "02002203417f460d00410420034101742202200341016a2204200220044b" + "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" + "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" + "1c2001200028020436021441100520020b360218200141086a2006200141" + "146a103720012802084101470d0120012802102102200128020c21050b20" + "0541dca4c0001019000b200128020c210320002004360200200020033602" + "04200141206a24000b7f01017f027f0240027f0240200228020404402002" + "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" + "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" + "0b2202411020021b21032002450c010b4110210341000b21022000200136" + "020820002003360204200020023602000bd20102067f017e230041206b22" + "0124000240024020002802002203417f460d004104200341017422022003" + "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" + "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" + "2001200341c0016c36021c2001200028020436021441100520020b360218" + "200141086a2006200141146a103720012802084101470d01200128021021" + "02200128020c21050b200541eca4c0001019000b200128020c2103200020" + "0436020020002003360204200141206a24000bdd0102067f017e23004120" + "6b2202240020002802002204417f460440410020011019000b4104200441" + "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" + "017e22084220884200520440410020011019000b02402008a7220741f0ff" + "ffff074d04404100210320022004047f2002200441c0016c36021c200220" + "0028020436021441100520030b360218200241086a2007200241146a1037" + "20022802084101470d01200228020c2106200228021021030b2006200110" + "19000b200228020c21042000200536020020002004360204200241206a24" + "000b830b02037f167e230041c0016b22022400200241186a220320004118" + "6a290300370300200241106a2204200041106a2903003703002002200029" + "03003703002002200041086a290300370308200241386a200141186a2903" + "002218370300200241306a200141106a2903002213370300200220014108" + "6a2903002214370328200220012903002215370320200242003703582002" + "42003703502002420037034820024201370340200241f8006a2201420037" + "0300200241f0006a42003703002002420037036820024200370360200329" + "0300210e2004290300210f2002290308210a200229030021072013211020" + "182111201521082014210b03400240200242003703980120024200370390" + "0120024200370388012002420137038001200220024180016a104a450440" + "200241406b21010c010b200241b8016a20024198016a2903003703002002" + "41b0016a20024190016a29030037030020022002290388013703a8012002" + "2002290380013703a001200241206a200241a0016a104a450440200241e0" + "006a21010c010b200241d8006a2903002112200229035021052002290348" + "21162002290340210d2007a74101714504400340200a423f862007420188" + "8421070240200da74101714504402016423f86200d42018884210d200542" + "3f8620164201888421160c010b200520137c2209201420167c2205201454" + "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" + "4201888421162006423f86200d42018884210d2009201354ad2005200954" + "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" + "0f42018884210f200e420188210e2012423f862005420188842105201242" + "018821122007420183500d000b2002200f3703102002200e3703180b2002" + "20053703502002200d370340200220073703002002201237035820022016" + "3703482002200a3703082001290300210920022903702106200229036821" + "172002290360210c2008a74101714504400340200b423f86200842018884" + "21080240200c420183a70440200620137c2219201420177c2206201454ad" + "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" + "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" + "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" + "20174201888421170b2010423f86200b42018884210b2011423f86201042" + "0188842110201142018821112009423f8620064201888421062009420188" + "21092008420183500d000b20022010370330200220113703380b20022006" + "3703702002200c3703602002200837032020022009370378200220173703" + "682002200b37032802400240200f201085200e2011858450044020072008" + "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" + "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" + "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" + "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" + "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" + "e0006a200d2016200520122015201420132018102d20062108200c210b0c" + "020b2002200720087d427e8322123703002002200a200b7d220520072008" + "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" + "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" + "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" + "2017200620092015201420132018102d20122107200d210a0c010b0b2000" + "2001290300370300200041186a200141186a290300370300200041106a20" + "0141106a290300370300200041086a200141086a290300370300200241c0" + "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" + "0141386a2226290300370300200341306a222c200141306a220e29030037" + "0300200341286a222d200141286a220f290300370300200341206a222e20" + "0141206a2210290300370300200341186a222f200141186a221129030037" + "0300200341106a2230200141106a22122903003703002003200129030037" + "03002003200141086a2227290300370308200320012002102f200341f800" + "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" + "6a2205290300370300200341e8006a2216200141e8006a22062903003703" + "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" + "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" + "092903003703002003200141c8006a220c29030037034820032001290340" + "370340200341406b200141406b2213200241406b2228102f200341b8016a" + "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" + "00370300200341a8016a2222200141a8016a290300370300200341a0016a" + "2223200141a0016a29030037030020034198016a222420014198016a2903" + "0037030020034190016a222520014190016a290300370300200320014188" + "016a2903003703880120032001290380013703800120034180016a200141" + "80016a222920024180016a222a102f200341f8016a221820042903003703" + "00200341f0016a22192005290300370300200341e8016a221a2006290300" + "370300200341e0016a221b2007290300370300200341d8016a221c200829" + "0300370300200341d0016a221d20092903003703002003200c2903003703" + "c801200320012903403703c001200341c0016a201320291030200341b802" + "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" + "00200341a8026a200241e8006a290300370300200341a0026a200241e000" + "6a29030037030020034198026a200241d8006a2903003703002003419002" + "6a200241d0006a2903003703002003200241c8006a290300370388022003" + "20022903403703800220034180026a2028202a1030200341c0056a200341" + "c0016a20034180026a102f2018200341f8056a2204290300370300201920" + "0341f0056a2205290300370300201a200341e8056a220629030037030020" + "1b200341e0056a2207290300370300201c200341d8056a22082903003703" + "00201d200341d0056a2209290300370300200320032903c8053703c80120" + "0320032903c0053703c00120034198066a220c201c290300370300200341" + "90066a220d201d290300370300200320032903c801370388062003200329" + "03c0013703800620034180066a2003290340223820032903482239200b29" + "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" + "6a220a2018290300370300200341b0066a220b2019290300370300200320" + "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" + "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200c29030022403703002009200d29030022413703" + "00200720032903a00622423703002005200b290300224337030020062003" + "2903a80622443703002004200a2903002245370300200320032903880622" + "463703c805200320032903800622473703c0052018204537030020192043" + "370300201a2044370300201b2042370300201c2040370300201d20413703" + "00200320463703c801200320473703c001200c201c290300370300200d20" + "1d290300370300200320032903c80137038806200320032903c001370380" + "0620034180066a2003290380012003290388012025290300202429030042" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" + "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" + "3703002003201a2903003703a8062003201b2903003703a006200341a006" + "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d2008200c29030022403703002009200d290300224137030020" + "0720032903a00622423703002005200b2903002243370300200620032903" + "a80622443703002004200a29030022453703002003200329038806224637" + "03c805200320032903800622473703c00520182045370300201920433703" + "00201a2044370300201b2042370300201c2040370300201d204137030020" + "0320463703c801200320473703c001200342003703b805200342003703b0" + "05200342003703a805200342013703a00520034200370398052003420037" + "03900520034200370388052003420937038005200341c0056a200341c001" + "6a20034180056a102f201820042903003703002019200529030037030020" + "1a2006290300370300201b2007290300370300201c200829030037030020" + "1d2009290300370300200320032903c8053703c801200320032903c00537" + "03c001200341c0056a200341c0016a200310302018200429030037030020" + "192005290300370300201a2006290300370300201b200729030037030020" + "1c2008290300370300201d2009290300370300200320032903c8053703c8" + "01200320032903c0053703c001200341d0026a2214201229030037030020" + "0341d8026a22152011290300370300200341e0026a221620102903003703" + "00200341e8026a2217200f290300370300200341f0026a221e200e290300" + "370300200341f8026a221f2026290300370300200320012903003703c002" + "200320272903003703c802200341c0026a200120131030200341b8036a20" + "0241386a2231290300370300200341b0036a200241306a22322903003703" + "00200341a8036a200241286a2233290300370300200341a0036a20024120" + "6a223429030037030020034198036a200241186a22352903003703002003" + "4190036a200241106a22362903003703002003200241086a223729030037" + "038803200320022903003703800320034180036a200220281030200341c0" + "056a200341c0026a20034180036a102f201f2004290300370300201e2005" + "290300370300201720062903003703002016200729030037030020152008" + "29030037030020142009290300370300200320032903c8053703c8022003" + "20032903c0053703c002200c2015290300370300200d2014290300370300" + "200320032903c80237038806200320032903c0023703800620034180066a" + "200329030022402003290308224120302903002242202f290300224342c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" + "0300200320172903003703a806200320162903003703a006200341a0066a" + "202e2903002244202d2903002245202c2903002246202b290300224742c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" + "002249370300200720032903a006224a3703002005200b290300224b3703" + "00200620032903a806224c3703002004200a290300224d37030020032003" + "29038806224e3703c8052003200329038006224f3703c005201f204d3703" + "00201e204b3703002017204c3703002016204a3703002015204837030020" + "1420493703002003204e3703c8022003204f3703c002200c201529030037" + "0300200d2014290300370300200320032903c80237038806200320032903" + "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200a201f290300370300200b201e290300370300200320172903" + "003703a806200320162903003703a006200341a0066a203c203d203e203f" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" + "2903002239370300200720032903a006223a3703002005200b290300223b" + "370300200620032903a806223c3703002004200a290300223d3703002003" + "200329038806223e3703c8052003200329038006223f3703c005201f203d" + "370300201e203b3703002017203c3703002016203a370300201520383703" + "00201420393703002003203e3703c8022003203f3703c002200341f8036a" + "2020290300370300200341f0036a2021290300370300200341e8036a2022" + "290300370300200341e0036a2023290300370300200341d8036a20242903" + "00370300200341d0036a202529030037030020032003290388013703c803" + "20032003290380013703c003200341c0036a20034180016a20034180056a" + "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" + "0300201e2005290300370300201720062903003703002016200729030037" + "03002015200829030037030020142009290300370300200320032903c805" + "3703c802200320032903c0053703c00220034190046a2213201229030037" + "030020034198046a22122011290300370300200341a0046a221120102903" + "00370300200341a8046a2210200f290300370300200341b0046a220f200e" + "290300370300200341b8046a220e20262903003703002003200129030037" + "038004200320272903003703880420034180046a200120291030200341f8" + "046a2031290300370300200341f0046a2032290300370300200341e8046a" + "2033290300370300200341e0046a2034290300370300200341d8046a2035" + "290300370300200341d0046a2036290300370300200320372903003703c8" + "04200320022903003703c004200341c0046a2002202a1030200341c0056a" + "20034180046a200341c0046a102f200e2004290300370300200f20052903" + "003703002010200629030037030020112007290300370300201220082903" + "0037030020132009290300370300200320032903c8053703880420032003" + "2903c00537038004200c2012290300370300200d20132903003703002003" + "2003290388043703880620032003290380043703800620034180066a2040" + "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" + "200b200f290300370300200320102903003703a806200320112903003703" + "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2008200c29030022383703002009200d2903002239370300200720032903" + "a006223a3703002005200b290300223b370300200620032903a806223c37" + "03002004200a290300223d3703002003200329038806223e3703c8052003" + "200329038006223f3703c005200e203d370300200f203b3703002010203c" + "3703002011203a37030020122038370300201320393703002003203e3703" + "88042003203f37038004200341c0056a20034180046a200341406b103020" + "0e2004290300370300200f20052903003703002010200629030037030020" + "112007290300370300201220082903003703002013200929030037030020" + "0320032903c80537038804200320032903c00537038004200c2012290300" + "370300200d20132903003703002003200329038804370388062003200329" + "0380043703800620034180066a2003290380012003290388012025290300" + "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" + "0b200f290300370300200320102903003703a806200320112903003703a0" + "06200341a0066a202329030020222903002021290300202029030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" + "2239370300200720032903a006223a3703002005200b290300223b370300" + "200620032903a806223c3703002004200a290300223d3703002003200329" + "038806223e3703c8052003200329038006223f3703c005200e203d370300" + "200f203b3703002010203c3703002011203a370300201220383703002013" + "20393703002003203e370388042003203f37038004200041386a20182903" + "00370300200041306a2019290300370300200041286a201a290300370300" + "200041206a201b290300370300200041186a201c29030037030020004110" + "6a201d290300370300200041086a20032903c801370300200020032903c0" + "01370300200020032903c002370340200041c8006a20032903c802370300" + "200041d0006a2014290300370300200041d8006a20152903003703002000" + "41e0006a2016290300370300200041e8006a2017290300370300200041f0" + "006a201e290300370300200041f8006a201f290300370300200041b8016a" + "200e290300370300200041b0016a200f290300370300200041a8016a2010" + "290300370300200041a0016a201129030037030020004198016a20122903" + "0037030020004190016a201329030037030020004188016a200329038804" + "370300200020032903800437038001200341c0066a24000b830c02137f04" + "7e23004180026b22032400200341d8006a2207200141186a290300370300" + "200341d0006a2208200141106a2903003703002003200141086a29030037" + "034820032001290300370340200341406b2002290300200241086a290300" + "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "98016a2204200141386a29030037030020034190016a2205200141306a29" + "03003703002003200141286a290300370388012003200129032037038001" + "20034180016a2002290320200241286a2903002002290330200241386a29" + "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" + "00200341106a220c2008290300370300200341206a220d20032903800137" + "0300200341286a220e200329038801370300200341306a220f2005290300" + "370300200341386a22102004290300370300200320032903483703082003" + "2003290340370300200241f8006a2903002116200241e8006a2903002117" + "2002290370211820022903602119200341f8016a2209200141d8006a2903" + "00370300200341f0016a2206200141d0006a2903003703002003200141c8" + "006a2903003703e801200320012903403703e001200341e0016a20022903" + "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" + "2903003703002003200141e8006a29030037038801200320012903603703" + "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2007200929030037030020082006290300370300200341e0006a22112003" + "29038001370300200341e8006a2212200329038801370300200341f0006a" + "22132005290300370300200341f8006a2214200429030037030020032003" + "2903e801370348200320032903e001370340200241b8016a290300211620" + "0241a8016a290300211720022903b001211820022903a0012119200341d8" + "016a220a20014198016a290300370300200341d0016a221520014190016a" + "290300370300200320014188016a2903003703c801200320012903800137" + "03c001200341c0016a20022903800120024188016a290300200229039001" + "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" + "6a2903003703002006200141b0016a2903003703002003200141a8016a29" + "03003703e801200320012903a0013703e001200341e0016a201920172018" + "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" + "290300370300200341a0016a220120032903e001370300200341a8016a22" + "0220032903e801370300200341b0016a220a2006290300370300200341b8" + "016a22062009290300370300200320032903c80137038801200320032903" + "c00137038001200041386a2010290300370300200041306a200f29030037" + "0300200041286a200e290300370300200041206a200d2903003703002000" + "41186a200b290300370300200041106a200c290300370300200041086a20" + "032903083703002000200329030037030020002003290340370340200041" + "c8006a2003290348370300200041d0006a2008290300370300200041d800" + "6a2007290300370300200041e0006a2011290300370300200041e8006a20" + "12290300370300200041f0006a2013290300370300200041f8006a201429" + "0300370300200041b8016a2006290300370300200041b0016a200a290300" + "370300200041a8016a2002290300370300200041a0016a20012903003703" + "0020004198016a200429030037030020004190016a200529030037030020" + "004188016a20032903880137030020002003290380013703800120034180" + "026a24000bf11902287f087e23004180056b22022400200241386a222420" + "0141386a220a290300370300200241306a2225200141306a220329030037" + "0300200241286a2226200141286a2204290300370300200241206a222720" + "0141206a2205290300370300200241186a2228200141186a220f29030037" + "0300200241106a2229200141106a22062903003703002002200129030037" + "03002002200141086a2207290300370308200220012001102f200241f800" + "6a2210200a290300370300200241f0006a22112003290300370300200241" + "e8006a22122004290300370300200241e0006a2213200529030037030020" + "0241d8006a2214200f290300370300200241d0006a221520062903003703" + "002002200729030037034820022001290300370340200241406b20012001" + "41406b2218102f20024180046a200241406b200241406b10302010200241" + "b8046a220b2903003703002011200241b0046a220c290300370300201220" + "0241a8046a220d2903003703002013200241a0046a220e29030037030020" + "1420024198046a2208290300370300201520024190046a22092903003703" + "0020022002290388043703482002200229038004370340200141f8006a22" + "19290300212a200141f0006a221a290300212b200141e8006a221b290300" + "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" + "00200241f0046a220f2006290300370300200220072903003703e8042002" + "20012903003703e004200241e0046a2001290340200141c8006a221d2903" + "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200a29030037030020092003290300370300200220" + "0429030037038804200220052903003703800420024180046a202d202c20" + "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" + "37030020024190036a2204200f290300370300200241a0036a2205200229" + "038004370300200241a8036a2206200229038804370300200241b0036a22" + "072009290300370300200241b8036a221620082903003703002002200229" + "03e80437038803200220022903e0043703800320024180046a2002418003" + "6a20014180016a220a10302016200b2903003703002007200c2903003703" + "002006200d2903003703002005200e290300370300200320082903003703" + "002004200929030037030020022002290388043703880320022002290380" + "043703800320024180046a20024180036a20024180036a102f2016200b29" + "03003703002007200c2903003703002006200d2903003703002005200e29" + "030037030020032008290300370300200420092903003703002002200229" + "0388043703880320022002290380043703800320024190016a2203201e29" + "030037030020024198016a2204201f290300370300200241a0016a220520" + "1c290300370300200241a8016a2206201b290300370300200241b0016a22" + "07201a290300370300200241b8016a221620192903003703002002200129" + "0340370380012002201d2903003703880120024180016a2018200a102f20" + "024180046a20024180016a20024180016a10302016200b29030037030020" + "07200c2903003703002006200d2903003703002005200e29030037030020" + "042008290300370300200320092903003703002002200229038804370388" + "01200220022903800437038001200241d0016a221820014190016a290300" + "370300200241d8016a221920014198016a290300370300200241e0016a22" + "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" + "370300200241f0016a221c200141b0016a290300370300200241f8016a22" + "1d200141b8016a29030037030020022001290380013703c0012002200141" + "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" + "2016290300370300200241b0026a22162007290300370300200241a8026a" + "22072006290300370300200241a0026a2206200529030037030020024198" + "026a2205200429030037030020024190026a220420032903003703002002" + "42003703f803200242003703f003200242003703e803200242013703e003" + "200242003703d803200242003703d003200242003703c803200242093703" + "c00320022002290388013703880220022002290380013703800220024180" + "026a20024180016a200241c0036a102f20024180046a20024180026a2002" + "1030201e200b2903003703002016200c2903003703002007200d29030037" + "03002006200e290300370300200520082903003703002004200929030037" + "0300200241d0026a22032018290300370300200241d8026a221f20192903" + "00370300200241e0026a2220201a290300370300200241e8026a2221201b" + "290300370300200241f0026a2222201c290300370300200241f8026a2223" + "201d29030037030020022002290388043703880220022002290380043703" + "8002200220022903c0013703c002200220022903c8013703c802200241c0" + "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" + "41406b10302023200b2903003703002022200c2903003703002021200d29" + "03003703002020200e290300370300201f20082903003703002003200929" + "030037030020022002290388043703c80220022002290380043703c00220" + "024180046a200241406b20024180036a10302010200b2903003703002011" + "200c2903003703002012200d2903003703002013200e2903003703002014" + "200829030037030020152009290300370300200220022903880437034820" + "0220022903800437034020024180046a200241406b20024180016a103020" + "10200b2903003703002011200c2903003703002012200d29030037030020" + "13200e290300370300201420082903003703002015200929030037030020" + "022002290388043703482002200229038004370340200241d8046a220120" + "14290300370300200241d0046a220a201529030037030020022002290348" + "3703c804200220022903403703c004200241c0046a200229030020022903" + "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" + "0300370300200f2011290300370300200220122903003703e80420022013" + "2903003703e004200241e0046a2027290300202629030020252903002024" + "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" + "09200a290300222b370300200e20022903e004222c370300200c200f2903" + "00222d370300200d20022903e804222e370300200b2017290300222f3703" + "00200220022903c804223037038804200220022903c00422313703800420" + "10202f3703002011202d3703002012202e3703002013202c370300201420" + "2a3703002015202b37030020022030370348200220313703402001201429" + "0300370300200a2015290300370300200220022903483703c80420022002" + "2903403703c004200241c0046a20022903c00120022903c8012018290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" + "0f2011290300370300200220122903003703e804200220132903003703e0" + "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" + "222b370300200e20022903e004222c370300200c200f290300222d370300" + "200d20022903e804222e370300200b2017290300222f3703002002200229" + "03c804223037038804200220022903c0042231370380042010202f370300" + "2011202d3703002012202e3703002013202c3703002014202a3703002015" + "202b3703002002203037034820022031370340200041386a201e29030037" + "0300200041306a2016290300370300200041286a20072903003703002000" + "41206a2006290300370300200041186a2005290300370300200041106a20" + "04290300370300200041086a200229038802370300200020022903800237" + "0300200020022903c002370340200041c8006a20022903c8023703002000" + "41d0006a2003290300370300200041d8006a201f290300370300200041e0" + "006a2020290300370300200041e8006a2021290300370300200041f0006a" + "2022290300370300200041f8006a2023290300370300200041b8016a2010" + "290300370300200041b0016a2011290300370300200041a8016a20122903" + "00370300200041a0016a201329030037030020004198016a201429030037" + "030020004190016a201529030037030020004188016a2002290348370300" + "200020022903403703800120024180056a24000bfe09011d7e2001290310" + "22022001290300220484200141186a2903002215200141086a2903002203" + "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" + "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" + "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" + "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" + "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" + "01290320220484200141386a2903002208200141286a2903002203848442" + "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" + "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" + "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" + "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" + "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" + "006a290300210220012903702104200129036021032001290350220e2001" + "290340220f84200141d8006a2903002205200141c8006a29030022108484" + "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" + "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" + "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" + "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" + "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" + "2004842002200884844200520440427f4200427f4200200342788342c7fa" + "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" + "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" + "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" + "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" + "6a2903002108200141a8016a290300210220012903b001210420012903a0" + "01210342002105200129039001221220012903800122138420014198016a" + "290300221e20014188016a290300221484844200520440427f4200427f42" + "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" + "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" + "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" + "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" + "7d21110b4200211242002113420021142003200484200220088484420052" + "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" + "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" + "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" + "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" + "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" + "00200a3703900120002011370380012000200f3703702000200737036020" + "0020093703502000200d3703402000201a37033020002006370320200020" + "0b37031020002018370300200020143703b801200020123703a801200020" + "17370398012000201d37038801200020103703782000200e370368200020" + "163703582000201c3703482000201b370338200020153703282000200c37" + "0318200020193703080b960501057f230041800c6b220324002003200120" + "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" + "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" + "03b809200342003703b009200342003703a809200342013703a009200342" + "003703980920034200370390092003420037038809200342093703800920" + "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" + "6a290300370300200341d00b6a20034190026a290300370300200341d80b" + "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" + "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" + "6a290300370300200341f80b6a200341b8026a290300370300200341880b" + "6a20032903c801370300200341900b6a200341d0016a2903003703002003" + "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" + "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" + "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" + "2003290380023703c00b200320032903c0013703800b20034180066a2003" + "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" + "034180076a200341c00b6a220720034180016a103020034180096a200120" + "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" + "4180016a20034180046a1030200341c00a6a200220051030200620024140" + "6b20034180056a1030200720024180016a200341c0056a1030200341c007" + "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" + "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" + "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" + "0002400240200129034022212001290350222084200141c8006a29030022" + "23200141d8006a2903002222848442005204402002290340221d20022903" + "50221584200241c8006a2903002224200241d8006a290300221e8484500d" + "01200341f8016a2204200141406b220641186a2205290300370300200341" + "f0016a2208200641106a220b290300370300200320062903003703e00120" + "03200641086a220c2903003703e801200341e0016a202120232020202242" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" + "200241406b220741186a220d29030037030020034190026a220a20074110" + "6a220e2903003703002003200741086a220f290300370388022003200729" + "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" + "00200341106a200141106a2903003703002003200141086a290300370308" + "20032001290300370300200320032903800222162003290388022219200a" + "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341386a2209200241186a290300370300200341306a220a" + "200241106a2903003703002003200241086a290300370328200320022903" + "00370320200341206a20032903e001222c20032903e80122302008290300" + "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200341b8036a22042005290300370300200341b0036a2205200b2903" + "003703002003200c2903003703a803200320062903003703a003200341a0" + "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200429030021132005290300211f20032903a803211c20032903a0" + "0321172004200d2903003703002005200e2903003703002003200f290300" + "3703a803200320072903003703a003200341a0036a201620192025202842" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" + "05290300211420032903a803211120032903a003211a200341d0006a2001" + "41306a290300370300200341d8006a2206200141386a2903003703002003" + "20012903203703402003200141286a290300370348200341406b201a2011" + "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" + "f8006a2207200241386a290300370300200341f0006a2208200241306a29" + "03003703002003200241286a290300370368200320022903203703602003" + "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b02402003200341206a104a450440200341406b200341e0006a" + "104a450d010b200420092903003703002005200a29030037030020032003" + "2903283703a803200320032903203703a003200341a0036a200329030020" + "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" + "290300211f2005290300211c20032903a003211720032903a80321122004" + "200729030037030020052008290300370300200320032903683703a80320" + "0320032903603703a003200341a0036a2003290340200329034820032903" + "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" + "842114201742018621112004290300211a2005290300211b20032903a803" + "211820032903a003212602400240201c4201862012423f8884222942ddb0" + "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" + "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" + "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d002011212a201421110c010b20132029201420" + "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" + "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" + "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" + "21130b200341b8036a22012013370300200320293703b0032003202a3703" + "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" + "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2003201f3703d8012003201c3703d001200320123703c801200320173703" + "c001200341c0016a20032903a003222920032903a803222a20032903b003" + "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b20184201862026423f888421112026420186212602400240201b4201" + "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" + "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" + "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" + "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" + "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" + "89aece93b230511b450d002026211a2011211b201821140c010b20132018" + "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" + "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" + "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" + "b2307d21130b20034198016a2201200341186a2903003703002003419001" + "6a2202200341106a29030037030020032003290308370388012003200329" + "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" + "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" + "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" + "290300370300200320032903483703a803200320032903403703a0032003" + "41a0036a20032903c001221120032903c801221820032903d00122272003" + "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200320133703b802200320143703b0022003201b3703a8022003201a" + "3703a002200429030021262005290300212920032903a803212a20032903" + "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200329038801222b4201862003290380012211423f" + "88842118201142018621270240024020022903002211420186202b423f88" + "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" + "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" + "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" + "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" + "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" + "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" + "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" + "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" + "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" + "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" + "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" + "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" + "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200341a0016a20032903800120032903880120032903900120" + "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b202a420186202d423f88842114202d4201862111024002402029420186" + "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" + "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" + "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" + "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" + "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" + "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" + "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" + "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" + "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" + "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" + "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" + "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" + "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" + "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" + "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" + "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" + "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" + "c689aece93b230511b450d002024212220232113202021140c010b202120" + "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" + "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" + "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" + "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" + "370300200320223703c002200320133703c802200341c0026a2022201320" + "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" + "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" + "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" + "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "0041186a200341b8026a290300370300200041106a200341b0026a290300" + "370300200041086a20032903a802370300200020032903a0023703002000" + "20032903a001370320200041286a20032903a801370300200041306a2003" + "41b0016a290300370300200041386a200341b8016a290300370300200020" + "032903c002370340200041c8006a20032903c802370300200041d0006a20" + "02290300370300200041d8006a20012903003703000c030b200341b8036a" + "2204200141186a290300221b370300200341b0036a2205200141106a2903" + "0022183703002003200141086a29030022163703a8032003200129030022" + "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" + "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" + "211d2005290300211520032903a803212420032903a003211f2004200141" + "206a220241186a2903003703002005200241106a29030037030020032002" + "41086a2903003703a803200320022903003703a003200341a0036a200129" + "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" + "1c20032903a8032117200420042903002225370300200320133703b00320" + "0320173703a8032003201c3703a003200341a0036a201c20172013202542" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" + "032903b003211e20032903a803211120032903a003211a02400240024020" + "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" + "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" + "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" + "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" + "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" + "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" + "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" + "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" + "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" + "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" + "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" + "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" + "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" + "90036a22062004290300370300200320032903a803370388032003200329" + "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d20012005290300370300200420062903003703002003200329" + "0388033703a80320032003290380033703a003200341a0036a201a201120" + "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" + "2903a0032213423f88842117201342018621120240024002402004290300" + "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" + "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" + "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" + "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" + "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" + "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" + "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" + "b87f2116201f42018621190240024020154201862024423f8884222842dd" + "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" + "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" + "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" + "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" + "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" + "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" + "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" + "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" + "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" + "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" + "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" + "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" + "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" + "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" + "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" + "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" + "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" + "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" + "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" + "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" + "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" + "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" + "88842112201b420186211602400240201c4201862018423f8884222542dd" + "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" + "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" + "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" + "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" + "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" + "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" + "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" + "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" + "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" + "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2011420186201a423f88842116201a420186211a02400240" + "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" + "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" + "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" + "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" + "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" + "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" + "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" + "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" + "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" + "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" + "91a8b87f211420114201862111024002402012420186201a423f88842216" + "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" + "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" + "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" + "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" + "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" + "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" + "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" + "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" + "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" + "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" + "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" + "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" + "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" + "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" + "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" + "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" + "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" + "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" + "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" + "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" + "37030020034190036a2204200241106a2903003703002003200229030037" + "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" + "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" + "02200320243703e002200129030021212004290300212320032903800321" + "22200329038803211d200120133703002003201c37039003200320183703" + "88032003201b3703800320034180036a20032903a00320032903a8032003" + "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "e0026a200329038003200329038803200329039003200129030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" + "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" + "20224201862122024002402023420186201d423f8884221342ddb0858ce8" + "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" + "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" + "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" + "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" + "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" + "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" + "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" + "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" + "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" + "2023370340200020032903a003370300200020032903e002370320200020" + "2137035820002022370348200041086a20032903a803370300200041286a" + "20032903e802370300200041186a200341b8036a29030037030020004110" + "6a200341b0036a290300370300200041306a200341f0026a290300370300" + "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" + "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" + "230041a0016b220224000240200129034022082001290350220984200141" + "c8006a290300220a200141d8006a290300220b8484420052044020024200" + "370318200242003703102002420037030820024201370300024020014140" + "6b2002104a450440200241206a2001290320220837030020002001290300" + "2209370310200041306a2008370300200241386a200141386a2903002208" + "370300200241306a200141306a290300220a370300200241286a20014128" + "6a290300220b370300200241106a200141106a290300220c370300200241" + "186a200141186a290300220d370300200041186a200141086a290300220e" + "370300200041206a200c370300200041286a200d370300200041386a200b" + "370300200041406b200a370300200041c8006a2008370300200220093703" + "002002200e3703080c010b20024198016a2204200b370300200220093703" + "900120022008370380012002200a37038801200242a9c0c689aece93b230" + "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" + "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" + "20022903800121082002290388012109200229039001210a200241186a22" + "032004290300220b3703002002200a370310200220093703082002200837" + "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b2003290300210c2002290310210d2002290308210e20022903" + "00210f200241d0006a2204200141106a290300370300200241d8006a2205" + "200141186a290300370300200220012903003703402002200141086a2903" + "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" + "0241f0006a2207200141306a2903003703002002200141286a2903003703" + "68200220012903203703602003200b3703002002200a3703102002200937" + "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" + "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200320052903002208370300200241106a200429030022093703002002" + "41206a2002290360220a370300200241286a2002290368220b3703002002" + "41306a2007290300220c370300200241386a2006290300220d3703002000" + "2002290340220e370310200041186a2002290348220f370300200041206a" + "2009370300200041286a2008370300200041306a200a370300200041386a" + "200b370300200041406b200c370300200041c8006a200d3703002002200f" + "3703082002200e3703000b20004200370308200042013703000c010b2000" + "4200370308200042003703000b200241a0016a24000b3000200128021c20" + "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" + "0128022028020c1103000bf917021d7f087e23004180066b220224002002" + "41b8036a2208200141386a290300370300200241b0036a2209200141306a" + "290300370300200241a8036a2213200141286a290300370300200241a003" + "6a2214200141206a29030037030020024198036a2203200141186a290300" + "37030020024190036a2204200141106a2903003703002002200129030037" + "0380032002200141086a2903003703880320024180036a20012001102f20" + "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" + "f0006a290300370300200241e8036a2207200141e8006a29030037030020" + "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" + "d8006a290300370300200241d0036a220c200141d0006a29030037030020" + "02200141c8006a2903003703c803200220012903403703c003200241c003" + "6a200141406b221e201e102f200241b8046a221520052903003703002002" + "41b0046a22162006290300370300200241a8046a22172007290300370300" + "200241a0046a2218200a29030037030020024198046a2219200b29030037" + "030020024190046a221a200c290300370300200220022903c80337038804" + "200220022903c0033703800420024180046a200241c0036a200241c0036a" + "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" + "026a2205290300370300200241f0046a220e200241f0026a220a29030037" + "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" + "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" + "2207290300370300200241d0046a2211200241d0026a220b290300370300" + "200220022903c8023703c804200220022903c0023703c004200241c0046a" + "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" + "200241d0056a220d2011290300370300200220022903c8043703c8052002" + "20022903c0043703c005200241c0056a2002290380032002290388032004" + "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" + "201b290300370300200241f0056a2204200e2903003703002002200f2903" + "003703e805200220102903003703e005200241e0056a2014290300201329" + "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" + "026a2208201229030037030020024190026a2209200d2903003703002002" + "41a8026a221320022903e805370300200241b0026a221420042903003703" + "00200241b8026a221b2003290300370300200220022903c8053703880220" + "0220022903c00537038002200220022903e0053703a00220122008290300" + "370300200d200929030037030020022002290388023703c8052002200229" + "0380023703c005200241c0056a200229038004200229038804201a290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" + "042014290300370300200220132903003703e805200220022903a0023703" + "e005200241e0056a201829030020172903002016290300201529030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200241186a22152012290300370300200241" + "106a2216200d290300370300200241206a221720022903e0053703002002" + "41286a221820022903e805370300200241306a2219200429030037030020" + "0241386a221a2003290300370300200220022903c8053703082002200229" + "03c005370300200241c0026a200220021030201a20052903003703002019" + "200a290300370300201820062903003703002017200c2903003703002015" + "20072903003703002016200b290300370300200220022903c80237030820" + "0220022903c002370300200241c0026a20024180036a20024180036a1030" + "200241406b200241c0026a20024180036a103020024190056a220e200241" + "d0006a29030037030020024198056a220f200241d8006a29030037030020" + "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" + "e8006a290300370300200241b0056a221c200241f0006a29030037030020" + "0241b8056a221d200241f8006a2903003703002002200229034037038005" + "200220022903483703880520024180056a200241406b200241406b102f20" + "0241c0026a2002200210302003200f2903003703002004200e2903003703" + "0020022002290388053703e80520022002290380053703e005200241e005" + "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2008201d2903003703002009201c2903003703002002" + "201129030037038802200220102903003703800220024180026a20022903" + "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d2008290300211f200929030021202003290300212120042903002122" + "2002290388022123200229038002212420022903e805212520022903e005" + "212620024180016a20024180046a20024180046a1030200241c0026a2002" + "4180016a20024180016a1030200241b8016a220e20052903003703002002" + "41b0016a220f200a290300370300200241a8016a22102006290300370300" + "200241a0016a2211200c29030037030020024198016a221c200729030037" + "030020024190016a221d200b290300370300200220022903c80237038801" + "200220022903c00237038001200241c0026a20024180016a20024180016a" + "1030200e2005290300370300200f200a2903003703002010200629030037" + "03002011200c290300370300201c2007290300370300201d200b29030037" + "0300200220022903c80237038801200220022903c00237038001200241c0" + "016a201e20014180016a102f200320152903003703002004201629030037" + "0300200220022903083703e805200220022903003703e005200241e0056a" + "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" + "030020092019290300370300200220182903003703880220022017290300" + "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d20072003290300370300200b20042903003703002006200229038802" + "370300200a200929030037030020052008290300370300200220022903e8" + "053703c802200220022903e0053703c00220022002290380023703e00220" + "024180026a200241406b200241c0026a102f20122008290300370300200d" + "200929030037030020022002290388023703c80520022002290380023703" + "c005200241c0056a200229038001200229038801201d290300201c290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" + "00370300200220132903003703e805200220022903a0023703e005200241" + "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20072012290300370300200b200d290300370300200c20" + "022903e005370300200620022903e805370300200a200429030037030020" + "052003290300370300200220022903c8053703c802200220022903c00537" + "03c00220004180016a200241c0016a200241c0016a10302000201f370338" + "200020203703302000202337032820002024370320200020213703182000" + "20223703102000202537030820002026370300200020022903c002370340" + "200041c8006a20022903c802370300200041d0006a200b29030037030020" + "0041d8006a2007290300370300200041e0006a200c290300370300200041" + "e8006a2006290300370300200041f0006a200a290300370300200041f800" + "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" + "6b22032400024002400240024020012903800120014188016a2903008442" + "00520d0020012903900120014198016a290300844200520d0020012903a0" + "01200141a8016a290300844200520d0020012903b001200141b8016a2903" + "0084500d010b024020022903800120024188016a290300844200520d0020" + "022903900120024198016a290300844200520d0020022903a001200241a8" + "016a290300844200520d0020022903b001200241b8016a29030084500d02" + "0b200341b8086a221420014180016a220441386a290300370300200341b0" + "086a200441306a290300370300200341a8086a2215200441286a29030037" + "0300200341a0086a200441206a29030037030020034198086a2216200441" + "186a29030037030020034190086a200441106a2903003703002003200429" + "0300370380082003200441086a2903003703880820034180086a20042004" + "102f200341f8086a221720024180016a220541386a290300370300200341" + "f0086a200541306a290300370300200341e8086a2218200541286a290300" + "370300200341e0086a200541206a290300370300200341d8086a22192005" + "41186a290300370300200341d0086a200541106a29030037030020032005" + "41086a2903003703c808200320052903003703c008200341c0086a200520" + "05102f20032001200341c0086a102f200341406b200220034180086a102f" + "20034180016a200420034180086a102f200341c0016a2005200341c0086a" + "102f20034180026a200141406b200341c0016a102f200341c0026a200241" + "406b20034180016a102f024002402003200341406b104a0d00200341206a" + "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" + "026a200341e0026a104a450d010b200341386a290300211f200341286a29" + "03002120200329033021212003290320212220034198076a2201200341d8" + "006a29030037030020034190076a2202200341d0006a2903003703002003" + "200329034837038807200320032903403703800720034180076a20032903" + "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" + "09200341f0006a2903003703002003200341e8006a2903003703c8072003" + "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20034198036a200129030037030020034190036a200229" + "0300370300200341a8036a20032903c807370300200341b0036a20092903" + "00370300200341b8036a2006290300370300200320032903880737038803" + "200320032903800737038003200320032903c0073703a003200341b8026a" + "290300211f200341a8026a290300212020032903b002212120032903a002" + "21222001200341d8026a2903003703002002200341d0026a290300370300" + "200320032903c80237038807200320032903c0023703800720034180076a" + "20032903800220032903880220032903900220034198026a29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" + "f0026a2903003703002003200341e8026a2903003703c807200320032903" + "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200341d8036a2001290300370300200341d0036a200229030037" + "0300200341e8036a20032903c807370300200341f0036a20092903003703" + "00200341f8036a200629030037030020032003290388073703c803200320" + "03290380073703c003200320032903c0073703e003200341c0076a200341" + "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" + "00200341b0096a200341f0076a2211290300370300200341a8096a200341" + "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" + "0020034198096a200629030037030020034190096a200929030037030020" + "0320032903c80737038809200320032903c0073703800920034180096a20" + "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" + "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" + "0320034180096a102f200341c0056a20034180026a20034180046a102f20" + "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" + "d8046a290300370300200341e0096a220b200341e0046a29030037030020" + "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" + "f0046a290300370300200341f8096a2210200341f8046a29030037030020" + "0320032903c0043703c009200320032903c8043703c809200341c0096a20" + "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" + "0341d0066a2207200a290300370300200320032903c8093703c806200320" + "032903c0093703c006200341c0066a200329038004200329038804200329" + "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" + "2903003703002009200f2903003703002003200e2903003703c807200320" + "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" + "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" + "200829030037030020022007290300370300200341a8076a220e20032903" + "c807370300200341b0076a220f2009290300370300200341b8076a221020" + "06290300370300200320032903c80637038807200320032903c006370380" + "07200320032903c0073703a007200341c0076a20034180056a2003418005" + "6a103020034198066a2212200129030037030020034190066a2213200229" + "030037030020032003290388073703880620032003290380073703800620" + "034180066a20032903c00720032903c80720032903d007200629030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200820102903003703002007200f29030037" + "03002003200e2903003703c806200320032903a0073703c006200341c006" + "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008290300211f20072903002120201229030021212013" + "290300212220032903c806212320032903c0062124200329038806212520" + "03290380062126200820034198056a290300370300200720034190056a29" + "030037030020032003290388053703c80620032003290380053703c00620" + "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" + "0341b8056a2903003703002002200341b0056a2903003703002003200341" + "a8056a29030037038807200320032903a0053703800720034180076a2024" + "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" + "20092007290300370300200d200329038807370300201120022903003703" + "00200c2001290300370300200320032903c8063703c807200320032903c0" + "063703c00720032003290380073703e00720034180076a200341c0046a20" + "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" + "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" + "032003290388073703e80a20032003290380073703e00a200341e00a6a20" + "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d200820102903003703002007200f2903003703002003200e" + "2903003703c806200320032903a0073703c006200341c0066a20032903e0" + "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2012200a2903003703002013200b290300370300200341a0066a221b20" + "032903c006370300200341a8066a221c20032903c806370300200341b006" + "6a221d2007290300370300200341b8066a221e2008290300370300200320" + "032903e80a37038806200320032903e00a37038006200341c0076a200420" + "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" + "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" + "1a290300370300200341980a6a22112006290300370300200341900a6a22" + "062009290300370300200320032903c8073703880a200320032903c00737" + "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" + "370300200b2006290300370300200320032903880a3703e80a2003200329" + "03800a3703e00a200341e00a6a2003290380082003290388082003290390" + "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" + "200720052903003703002003200c2903003703c8062003200d2903003703" + "c006200341c0066a20032903a008201529030020032903b0082014290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" + "00370300200e20032903c806370300200f20072903003703002010200829" + "0300370300200320032903e80a37038807200320032903e00a3703800720" + "0320032903c0063703a007200341d80a6a22042001290300370300200341" + "d00a6a2201200229030037030020032003290388073703c80a2003200329" + "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" + "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" + "200b200f2903003703002003200e2903003703e80a200320032903a00737" + "03e00a200341e00a6a20032903e008201829030020032903f00820172903" + "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" + "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" + "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" + "00370300200341f8066a200a290300370300200320032903c80a3703c806" + "200320032903c00a3703c006200320032903e00a3703e00620004180016a" + "200341c0066a20034180036a102f2000201f370338200020203703302000" + "202337032820002024370320200020213703182000202237031020002025" + "370308200020263703002000200329038006370340200041c8006a200329" + "038806370300200041d0006a2013290300370300200041d8006a20122903" + "00370300200041e0006a201b290300370300200041e8006a201c29030037" + "0300200041f0006a201d290300370300200041f8006a201e290300370300" + "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" + "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" + "24000240024002400240024020012903800120014188016a290300844200" + "520d0020012903900120014198016a290300844200520d0020012903a001" + "200141a8016a290300844200520d0020012903b001200141b8016a290300" + "84500d010b200241d8006a4200370300200241e0006a2204420037030020" + "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" + "030020024200370348200242013703402002420037035020014180016a22" + "03200241406b104a450440200141a0016a2004104a450d020b200241406b" + "200310312002280240410171450d02200241386a20024188016a29030022" + "05370300200241306a20024180016a22032903002206370300200241286a" + "200241f8006a2903002207370300200241206a200241f0006a2903002208" + "370300200241186a200241e8006a2903002209370300200241106a200241" + "e0006a290300220a37030020024190026a200a37030020024198026a2009" + "370300200241a0026a2008370300200241a8026a2007370300200241b002" + "6a2006370300200241b8026a200537030020022002290350220537030020" + "02200241d8006a2903002206370308200220053703800220022006370388" + "0220024180026a20022002102f200241406b200120024180026a102f2002" + "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" + "0041106a200241406b418001104c1a20004200370308200042013703000c" + "030b20004200370308200042003703000c020b200241b8016a200141f800" + "6a290300370300200241b0016a200141f0006a290300370300200241a801" + "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" + "0020024198016a200141d8006a29030037030020024190016a200141d000" + "6a29030037030020024188016a200141c8006a290300370300200241d000" + "6a200141106a290300370300200241d8006a200141186a29030037030020" + "0241e0006a200141206a290300370300200241e8006a200141286a290300" + "370300200241f0006a200141306a290300370300200241f8006a20014138" + "6a2903003703002002200129034037038001200220012903003703402002" + "200141086a290300370348200041106a200241406b418001104c1a200042" + "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" + "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" + "006a220e290300370300200241306a2240200141f0006a220f2903003703" + "00200241286a2241200141e8006a2210290300370300200241206a224220" + "0141e0006a2211290300370300200241186a2243200141d8006a22122903" + "00370300200241106a2244200141d0006a22202903003703002002200129" + "03403703002002200141c8006a2221290300370308200141a8016a222329" + "03002153200141a0016a22242903002154200141b8016a22252903002155" + "200141b0016a2230290300215620014188016a2235290300215720014198" + "016a2236290300215820014190016a22372903002159200129038001215a" + "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" + "016a2214290300370300200241e8006a200141e8016a2215290300370300" + "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" + "016a2217290300370300200241d0006a200141d0016a220d290300370300" + "20024190016a20014190026a220429030037030020024198016a20014198" + "026a2206290300370300200241a0016a200141a0026a2207290300370300" + "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" + "026a2205290300370300200241b8016a200141b8026a2209290300370300" + "2002200141c8016a2222290300370348200220012903c001370340200220" + "012903800237038001200220014188026a220a29030037038801200241f8" + "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" + "290300370300200241e8016a200141e8026a2246290300370300200241e0" + "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" + "290300370300200241d0016a200141d0026a2249290300370300200241b8" + "026a2226200141386a2231290300370300200241b0026a2227200141306a" + "2232290300370300200241a8026a2228200141286a223a29030037030020" + "0241a0026a2229200141206a223b29030037030020024198026a222a2001" + "41186a223c29030037030020024190026a222b200141106a223d29030037" + "03002002200141c8026a224a2903003703c801200220012903c0023703c0" + "012002200141086a223e2903003703880220022001290300370380022002" + "4180026a200120014180026a2203102f200241f8026a2219203129030037" + "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" + "00370300200241e0026a221c203b290300370300200241d8026a221d203c" + "290300370300200241d0026a221e203d2903003703002002203e29030037" + "03c802200220012903003703c002200241c0026a200120031030200241b8" + "036a220b2009290300370300200241b0036a220920052903003703002002" + "41a8036a22052008290300370300200241a0036a220c2007290300370300" + "20024198036a2218200629030037030020024190036a221f200429030037" + "0300200242003703b80d200242003703b00d200242003703a80d20024201" + "3703a00d200242003703980d200242003703900d200242003703880d2002" + "42093703800d2002200a2903003703880320022001290380023703800320" + "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" + "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" + "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" + "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" + "04290300370300200220022903c80b37038803200220022903c00b370380" + "03200241c00b6a200241c0026a20024180036a102f201920062903003703" + "00201a2007290300370300201b2008290300370300201c20052903003703" + "00201d2003290300370300201e2004290300370300200220022903c80b37" + "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" + "00200241900f6a220c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903800220022903880220" + "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" + "092019290300370300200241900a6a220a201a2903003703002002201b29" + "03003703880a2002201c2903003703800a200241800a6a20292903002028" + "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" + "0b290300224b3703002004200c290300224c370300200520022903800a22" + "4d3703002007200a290300224e370300200820022903880a224f37030020" + "0620092903002250370300200220022903880f22513703c80b2002200229" + "03800f22523703c00b20192050370300201a204e370300201b204f370300" + "201c204d370300201d204b370300201e204c370300200220513703c80220" + "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" + "1d290300370300200c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903c00320022903c80320" + "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" + "2019290300370300200a201a2903003703002002201b2903003703880a20" + "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" + "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2003200b290300224b3703002004200c290300224c370300200520022903" + "800a224d3703002007200a290300224e370300200820022903880a224f37" + "0300200620092903002250370300200220022903880f22513703c80b2002" + "20022903800f22523703c00b20192050370300201a204e370300201b204f" + "370300201c204d370300201d204b370300201e204c370300200220513703" + "c802200220523703c002200241c00b6a20024180026a20024180026a1030" + "202620062903003703002027200729030037030020282008290300370300" + "20292005290300370300202a2003290300370300202b2004290300370300" + "200220022903c80b37038802200220022903c00b3703800220024190046a" + "221f200d29030037030020024198046a222c2017290300370300200241a0" + "046a222d2016290300370300200241a8046a222e20152903003703002002" + "41b0046a222f2014290300370300200241b8046a22392013290300370300" + "200220012903c00137038004200220222903003703880420024180046a20" + "0141c0016a223320014180016a2234102f200241f8046a22182013290300" + "370300200241f0046a22132014290300370300200241e8046a2214201529" + "0300370300200241e0046a22152016290300370300200241d8046a221620" + "17290300370300200241d0046a2217200d29030037030020022022290300" + "3703c804200220012903c0013703c004200241c0046a2033203410302002" + "41b8056a220d2025290300370300200241b0056a22222030290300370300" + "200241a8056a22252023290300370300200241a0056a2223202429030037" + "030020024198056a2224203629030037030020024190056a223020372903" + "003703002002203529030037038805200220012903800137038005200241" + "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" + "0d2006290300370300202220072903003703002025200829030037030020" + "232005290300370300202420032903003703002030200429030037030020" + "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" + "0241c0046a20024180056a102f2018200629030037030020132007290300" + "370300201420082903003703002015200529030037030020162003290300" + "37030020172004290300370300200220022903c80b3703c8042002200229" + "03c00b3703c004200b2016290300370300200c2017290300370300200220" + "022903c8043703880f200220022903c0043703800f200241800f6a200229" + "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20092018290300370300200a201329030037030020022014290300" + "3703880a200220152903003703800a200241800a6a202d290300202e2903" + "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" + "0300224b3703002004200c290300224c370300200520022903800a224d37" + "03002007200a290300224e370300200820022903880a224f370300200620" + "092903002250370300200220022903880f22513703c80b20022002290380" + "0f22523703c00b201820503703002013204e3703002014204f3703002015" + "204d3703002016204b3703002017204c370300200220513703c804200220" + "523703c004200241c0056a20024180046a200241800d6a102f200b201629" + "0300370300200c2017290300370300200220022903c8043703880f200220" + "022903c0043703800f200241800f6a20022903c00520022903c805200229" + "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" + "290300370300200a2013290300370300200220142903003703880a200220" + "152903003703800a200241800a6a20022903e005200241e8056a29030020" + "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" + "200b290300224b3703002004200c290300224c370300200520022903800a" + "224d3703002007200a290300224e370300200820022903880a224f370300" + "200620092903002250370300200220022903880f22513703c80b20022002" + "2903800f22523703c00b201820503703002013204e3703002014204f3703" + "002015204d3703002016204b3703002017204c370300200220513703c804" + "200220523703c004200241c00b6a20024180046a20024180046a10302039" + "2006290300370300202f2007290300370300202e2008290300370300202d" + "2005290300370300202c2003290300370300201f20042903003703002002" + "20022903c80b37038804200220022903c00b3703800420024190066a2222" + "202029030037030020024198066a22332012290300370300200241a0066a" + "22342011290300370300200241a8066a22232010290300370300200241b0" + "066a2224200f290300370300200241b8066a2225200e2903003703002002" + "200129034037038006200220212903003703880620024180066a20014140" + "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" + "f0066a220e200f290300370300200241e8066a220f201029030037030020" + "0241e0066a22102011290300370300200241d8066a221120122903003703" + "00200241d0066a22122020290300370300200220212903003703c8062002" + "20012903403703c006200241c0066a200220301030200241b8076a222020" + "38290300370300200241b0076a22212045290300370300200241a8076a22" + "352046290300370300200241a0076a223620472903003703002002419807" + "6a2237204829030037030020024190076a22382049290300370300200220" + "4a29030037038807200220012903c0023703800720024180076a20302002" + "41800d6a102f200241c00b6a20024180076a200210302020200629030037" + "030020212007290300370300203520082903003703002036200529030037" + "03002037200329030037030020382004290300370300200220022903c80b" + "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" + "4180076a102f200d2006290300370300200e2007290300370300200f2008" + "290300370300201020052903003703002011200329030037030020122004" + "290300370300200220022903c80b3703c806200220022903c00b3703c006" + "200b2011290300370300200c2012290300370300200220022903c8063703" + "880f200220022903c0063703800f200241800f6a20022903800620022903" + "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" + "290300370300200a200e2903003703002002200f2903003703880a200220" + "102903003703800a200241800a6a20342903002023290300202429030020" + "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" + "2004200c290300224c370300200520022903800a224d3703002007200a29" + "0300224e370300200820022903880a224f37030020062009290300225037" + "0300200220022903880f22513703c80b200220022903800f22523703c00b" + "200d2050370300200e204e370300200f204f3703002010204d3703002011" + "204b3703002012204c370300200220513703c806200220523703c0062002" + "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" + "2012290300370300200220022903c8063703880f200220022903c0063703" + "800f200241800f6a20022903c00720022903c80720022903d007200241d8" + "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" + "0a200e2903003703002002200f2903003703880a20022010290300370380" + "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" + "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" + "3703002004200c290300224c370300200520022903800a224d3703002007" + "200a290300224e370300200820022903880a224f37030020062009290300" + "2250370300200220022903880f22513703c80b200220022903800f225237" + "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" + "002011204b3703002012204c370300200220513703c806200220523703c0" + "06200241c00b6a20024180066a20024180066a1030202520062903003703" + "002024200729030037030020232008290300370300203420052903003703" + "002033200329030037030020222004290300370300200220022903c80b37" + "038806200220022903c00b370380062009201d290300370300200a201e29" + "0300370300200220022903c8023703880a200220022903c0023703800a20" + "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200320192903003703002004201a29030037030020" + "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" + "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" + "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" + "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" + "312003290300370300200220022903880a3703c80d200220022903800a37" + "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" + "3703002021200729030037030020202008290300370300201e2005290300" + "370300201c2003290300370300201d2004290300370300200220022903c8" + "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" + "0241c0026a10302031200629030037030020212007290300370300202020" + "08290300370300201e2005290300370300201c2003290300370300201d20" + "0429030037030020024190086a2232202b29030037030020024198086a22" + "2b202a290300370300200241a0086a222a2029290300370300200241a808" + "6a22292028290300370300200241b0086a22282027290300370300200241" + "b8086a22272026290300370300200220022903c80b3703c80d2002200229" + "03c00b3703c00d2002200229038002370380082002200229038802370388" + "0820024180086a20024180026a20024180016a1030200241c00b6a200241" + "80086a20024180086a103020272006290300370300202820072903003703" + "0020292008290300370300202a2005290300370300202b20032903003703" + "0020322004290300370300200220022903c80b37038808200220022903c0" + "0b37038008200241c00b6a20024180086a20024180026a10302027200629" + "03003703002028200729030037030020292008290300370300202a200529" + "0300370300202b200329030037030020322004290300370300200241d008" + "6a22012022290300370300200241d8086a220b2033290300370300200241" + "e0086a220c2034290300370300200241e8086a2219202329030037030020" + "0241f0086a221a2024290300370300200241f8086a221b20252903003703" + "00200220022903c80b37038808200220022903c00b370380082002200229" + "0380063703c00820022002290388063703c808200241c0086a2002418006" + "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" + "2006290300370300201a200729030037030020192008290300370300200c" + "2005290300370300200b2003290300370300200120042903003703002002" + "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" + "41c0086a200241c0086a1030201b2006290300370300201a200729030037" + "030020192008290300370300200c2005290300370300200b200329030037" + "030020012004290300370300200220022903c80b3703c808200220022903" + "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" + "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" + "29030037030020192008290300370300200c2005290300370300200b2003" + "29030037030020012004290300370300200220022903c80b3703c8082002" + "20022903c00b3703c00820092011290300370300200a2012290300370300" + "200220022903c8063703880a200220022903c0063703800a200241800a6a" + "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" + "03002004200e2903003703002002200f2903003703c80b20022010290300" + "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" + "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" + "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" + "22122003290300370300200220022903880a3703880e200220022903800a" + "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" + "003703002011200729030037030020102008290300370300200f20052903" + "00370300200d2003290300370300200e2004290300370300200220022903" + "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" + "200241c0066a103020122006290300370300201120072903003703002010" + "2008290300370300200f2005290300370300200d2003290300370300200e" + "2004290300370300200220022903c80b3703880e200220022903c00b3703" + "800e20092016290300370300200a2017290300370300200220022903c804" + "3703880a200220022903c0043703800a200241800a6a2002290300200229" + "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" + "29030037030020042013290300370300200220142903003703c80b200220" + "152903003703c00b200241c00b6a20422903002041290300204029030020" + "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" + "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" + "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" + "22162004290300370300200241f80e6a2217200329030037030020022002" + "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" + "0e6a200241c00e6a10302017200629030037030020162007290300370300" + "201520082903003703002014200529030037030020182003290300370300" + "20132004290300370300200220022903c80b3703c80e200220022903c00b" + "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" + "003703002016200729030037030020152008290300370300201420052903" + "003703002018200329030037030020132004290300370300200241d0096a" + "2226201f290300370300200241d8096a221f202c290300370300200241e0" + "096a222c202d290300370300200241e8096a222d202e2903003703002002" + "41f0096a222e202f290300370300200241f8096a222f2039290300370300" + "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" + "80043703c00920022002290388043703c809200241c0096a20024180046a" + "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" + "2006290300370300202e2007290300370300202d2008290300370300202c" + "2005290300370300201f2003290300370300202620042903003703002002" + "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" + "41c0096a20024180046a1030202f2006290300370300202e200729030037" + "0300202d2008290300370300202c2005290300370300201f200329030037" + "030020262004290300370300200220022903c80b3703c809200220022903" + "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" + "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" + "03002009201c290300370300200a201d290300370300200220022903c80d" + "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" + "00200241d00a6a2013290300370300200241d80a6a201829030037030020" + "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" + "f00a6a2016290300370300200241f80a6a20172903003703002002200229" + "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" + "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" + "370300200241980b6a200d290300370300200241900b6a200e2903003703" + "00200241880b6a20022903880e370300200220022903800e3703800b2006" + "201b2903003703002007201a290300370300200820192903003703002005" + "200c2903003703002003200b290300370300200420012903003703002002" + "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" + "29038808370300200241900c6a2032290300370300200241980c6a202b29" + "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" + "370300200241b00c6a2028290300370300200241b80c6a20272903003703" + "0020022002290380083703800c200241f80c6a202f290300370300200241" + "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" + "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" + "26290300370300200241c80c6a20022903c809370300200220022903c009" + "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" + "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" + "024101712206450440200341386a200141386a290300370300200341306a" + "200141306a290300370300200341286a200141286a290300370300200341" + "206a200141206a290300370300200341186a200141186a29030037030020" + "0341106a200141106a290300370300200320012903003703002003200141" + "086a29030037030820034190016a200141d0006a29030037030020034198" + "016a200141d8006a290300370300200341a0016a200141e0006a29030037" + "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" + "006a290300370300200341b8016a200141f8006a29030037030020032001" + "290340370380012003200141c8006a290300370388010c010b200341d801" + "6a2204200141386a290300370300200341d0016a2205200141306a290300" + "370300200320012903203703c0012003200141286a2903003703c8012003" + "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f102b200341186a200141186a290300370300200341106a" + "200141106a290300370300200341286a20032903c801370300200341306a" + "2005290300370300200341386a20042903003703002003200141086a2903" + "0037030820032001290300370300200320032903c0013703202004200141" + "f8006a2903003703002005200141f0006a2903003703002003200141e800" + "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "20034198016a200141d8006a29030037030020034190016a200141d0006a" + "290300370300200341a8016a20032903c801370300200341b0016a200529" + "0300370300200341b8016a20042903003703002003200141c8006a290300" + "370388012003200129034037038001200320032903c0013703a0010b0240" + "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" + "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" + "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" + "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" + "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" + "3703c0010c020b200341e0016a22024200370300200241086a4200370300" + "200241106a4200370300200241186a4200370300200342a9c0c689aece93" + "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" + "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" + "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" + "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" + "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" + "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" + "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" + "200341c0016a102f02402006450440200341b8016a200241386a29030037" + "0300200341b0016a200241306a290300370300200341a8016a200241286a" + "290300370300200341a0016a200241206a29030037030020034198016a20" + "0241186a29030037030020034190016a200241106a290300370300200320" + "02290300370380012003200241086a290300370388010c010b200341d801" + "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" + "0300370300200320012903a0013703c0012003200141a8016a2903003703" + "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" + "20034190016a200241106a290300370300200341a8016a20032903c80137" + "0300200341b0016a2005290300370300200341b8016a2006290300370300" + "2003200241086a2903003703880120032002290300370380012003200329" + "03c0013703a0010b0240024002400240200441026b0e020102000b200342" + "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" + "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" + "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" + "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" + "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" + "00370300200141106a4200370300200141186a4200370300200342003703" + "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" + "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" + "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" + "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" + "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" + "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" + "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" + "6a200341386a290300370300200041306a200341306a2903003703002000" + "41286a200341286a290300370300200041206a200341206a290300370300" + "200041186a200341186a290300370300200041106a200341106a29030037" + "0300200041086a2003290308370300200020032903003703002000200329" + "0340370340200041c8006a2003290348370300200041d0006a200341d000" + "6a290300370300200041d8006a200341d8006a290300370300200041e000" + "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" + "00200041f0006a200341f0006a290300370300200041f8006a200341f800" + "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" + "052400200541b8016a2234200141b8016a2235290300370300200541b001" + "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" + "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" + "0020054198016a223c20014198016a223d29030037030020054190016a22" + "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" + "4f290300370300200541d8016a222f200141d8016a225029030037030020" + "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" + "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" + "0300370300200541f8016a2233200141f8016a2254290300370300200520" + "012903800137038001200520012903c0013703c001200520014188016a22" + "40290300370388012005200141c8016a22552903003703c801200541b802" + "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" + "6a2221290300370300200541a8026a2258200141e8026a22282903003703" + "00200541a0026a2259200141e0026a222929030037030020054198026a22" + "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" + "2b290300370300200541d0026a2241200141106a22062903003703002005" + "41d8026a2242200141186a2207290300370300200541e0026a2243200141" + "206a2208290300370300200541e8026a2244200141286a22092903003703" + "00200541f0026a2245200141306a220a290300370300200541f8026a2246" + "200141386a220b2903003703002005200141c8026a222c29030037038802" + "200520012903c00237038002200520012903003703c0022005200141086a" + "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" + "35290300370300200541b0036a225d2037290300370300200541a8036a22" + "5e2039290300370300200541a0036a225f203b2903003703002005419803" + "6a2260203d29030037030020054190036a2261203f290300370300200520" + "402903003703880320052001290380013703800320054180036a20014180" + "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" + "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" + "026a290300370300200541e0036a2265200141a0026a2903003703002005" + "41d8036a226620014198026a290300370300200541d0036a226720014190" + "026a290300370300200520014188026a2903003703c80320052001290380" + "023703c003200541c0036a20014180026a22472003102f200541b8046a22" + "68200b290300370300200541b0046a2269200a290300370300200541a804" + "6a226a2009290300370300200541a0046a226b2008290300370300200541" + "98046a226c200729030037030020054190046a226d200629030037030020" + "05200c29030037038804200520012903003703800420054180046a200120" + "471030200541f8046a226e200b290300370300200541f0046a226f200a29" + "0300370300200541e8046a22702009290300370300200541e0046a227120" + "08290300370300200541d8046a22722007290300370300200541d0046a22" + "7320062903003703002005200c2903003703c804200520012903003703c0" + "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" + "0300370300200541b0056a2249200141f0006a2213290300370300200541" + "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" + "e0006a221529030037030020054198056a224c200141d8006a221c290300" + "37030020054190056a224d200141d0006a221d2903003703002005200141" + "c8006a221e29030037038805200520012903403703800520054180056a20" + "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" + "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" + "096a220d290300370300204a200541e8096a220e290300370300204b2005" + "41e0096a220f290300370300204c200541d8096a2210290300370300204d" + "200541d0096a2211290300370300200520052903c8093703880520052005" + "2903c00937038005200541d0056a2222201d290300370300200541d8056a" + "2223201c290300370300200541e0056a22242015290300370300200541e8" + "056a22252014290300370300200541f0056a222620132903003703002005" + "41f8056a22272012290300370300200520012903403703c0052005201e29" + "03003703c805200541c0056a201f2004102f200541b8066a221620272903" + "00370300200541b0066a22172026290300370300200541a8066a22182025" + "290300370300200541a0066a2219202429030037030020054198066a221a" + "202329030037030020054190066a221b2022290300370300200520052903" + "c80537038806200520052903c0053703800620054180066a200541c0056a" + "200541c0036a1030200542003703b80b200542003703b00b200542003703" + "a80b200542013703a00b200542003703980b200542003703900b20054200" + "3703880b200542093703800b200541c0096a20054180066a200541800b6a" + "102f2016200c2903003703002017200d2903003703002018200e29030037" + "03002019200f290300370300201a2010290300370300201b201129030037" + "0300200520052903c80937038806200520052903c00937038006200541c0" + "096a20054180066a200541c0026a10302016200c29030022810137030020" + "17200d2903002282013703002018200e2903002283013703002019200f29" + "0300228401370300201a2010290300228501370300201b20112903002286" + "01370300200541106a2275208601370300200541186a2276208501370300" + "200541206a2277208401370300200541286a227820830137030020054130" + "6a2279208201370300200541386a227a208101370300200520052903c809" + "22810137038806200520052903c009228201370380062005208201370300" + "2005208101370308200541f8066a22062020290300370300200541f0066a" + "22072021290300370300200541e8066a22082028290300370300200541e0" + "066a22092029290300370300200541d8066a220a202a2903003703002005" + "41d0066a220b202b2903003703002005202c2903003703c8062005200129" + "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" + "6a200541c0066a10302027200c2903003703002026200d29030037030020" + "25200e2903003703002024200f2903003703002023201029030037030020" + "222011290300370300200520052903c8093703c805200520052903c00937" + "03c005200541c0096a200541c0066a20054180036a10302006200c290300" + "2281013703002007200d2903002282013703002008200e29030022830137" + "03002009200f290300228401370300200a2010290300228501370300200b" + "2011290300228601370300201b208601370300201a208501370300201920" + "840137030020182083013703002017208201370300201620810137030020" + "0520052903c8092281013703c806200520052903c0092282013703c00620" + "052082013703800620052081013703880620054180066a200541c0066a20" + "0541800b6a102f2006201229030037030020072013290300370300200820" + "1429030037030020092015290300370300200a201c290300370300200b20" + "1d2903003703002005201e2903003703c806200520012903403703c00620" + "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" + "302027200c2903003703002026200d2903003703002025200e2903003703" + "002024200f29030037030020232010290300370300202220112903003703" + "00200520052903c8093703c805200520052903c0093703c005200541c009" + "6a20054180066a200541c0066a10302016200c2903002281013703002017" + "200d2903002282013703002018200e2903002283013703002019200f2903" + "00228401370300201a2010290300228501370300201b2011290300228601" + "370300200541d0006a227b208601370300200541d8006a227c2085013703" + "00200541e0006a227d208401370300200541e8006a227e20830137030020" + "0541f0006a227f208201370300200541f8006a2280012081013703002005" + "20052903c80922810137038806200520052903c009228201370380062005" + "2082013703402005208101370348200541b8076a221c200241386a222829" + "0300370300200541b0076a221d200241306a2229290300370300200541a8" + "076a221e200241286a222a290300370300200541a0076a221f200241206a" + "222b29030037030020054198076a2220200241186a222c29030037030020" + "054190076a2221200241106a222d2903003703002005200241086a224e29" + "030037038807200520022903003703800720054180076a20022004103020" + "06206e2903003703002007206f2903003703002008207029030037030020" + "092071290300370300200a2072290300370300200b207329030037030020" + "0520052903c8043703c806200520052903c0043703c006200541c0066a20" + "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" + "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" + "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" + "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" + "0629030037030020054190086a2213200729030037030020052008290300" + "37038808200520092903003703800820054180086a204329030020442903" + "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" + "030022810137030020112015290300228201370300200f20052903800822" + "8301370300200d2013290300228401370300200e20052903880822850137" + "0300200c2012290300228601370300200520052903c80b2287013703c809" + "200520052903c00b2288013703c009200620860137030020072084013703" + "0020082085013703002009208301370300200a208101370300200b208201" + "37030020052087013703c80620052088013703c0062014200a2903003703" + "002015200b290300370300200520052903c8063703c80b200520052903c0" + "063703c00b200541c00b6a20052903800322810120052903880322820120" + "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "122006290300370300201320072903003703002005200829030037038808" + "200520092903003703800820054180086a205f290300228501205e290300" + "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d2010201429030022890137030020112015290300228a0137030020" + "0f200529038008228b01370300200d2013290300228c01370300200e2005" + "29038808228d01370300200c2012290300228e01370300200520052903c8" + "0b228f013703c809200520052903c00b2290013703c0092006208e013703" + "002007208c013703002008208d013703002009208b01370300200a208901" + "370300200b208a013703002005208f013703c80620052090013703c00620" + "162054290300370300201720532903003703002018205229030037030020" + "192051290300370300201a2050290300370300201b204f29030037030020" + "05205529030037038806200520012903c0013703800620054180066a2074" + "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" + "003703002026200d2903003703002025200e2903003703002024200f2903" + "003703002023201029030037030020222011290300370300200520052903" + "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" + "20054180066a10302006200c2903003703002007200d2903003703002008" + "200e2903003703002009200f290300370300200a2010290300370300200b" + "2011290300370300200520052903c8093703c806200520052903c0093703" + "c0062021203f2903003703002020203d290300370300201f203b29030037" + "0300201e2039290300370300201d2037290300370300201c203529030037" + "030020052001290380013703800720052040290300370388072005418007" + "6a20054180016a2047103020342006290300370300203620072903003703" + "0020382008290300370300203a2009290300370300203c200a2903003703" + "00203e200b290300370300200541d0076a200441106a2903003703002005" + "41d8076a200441186a290300370300200541e0076a200441206a29030037" + "0300200541e8076a200441286a290300370300200541f0076a200441306a" + "290300370300200541f8076a200441386a290300370300200520052903c8" + "0637038801200520052903c00637038001200520042903003703c0072005" + "200441086a2903003703c807200541c0076a2004200310302006201c2903" + "003703002007201d2903003703002008201e2903003703002009201f2903" + "00370300200a2020290300370300200b2021290300370300200520052903" + "88073703c80620052005290380073703c006200541c0066a20054180076a" + "200541c0076a102f2014200a2903003703002015200b2903003703002005" + "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" + "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" + "003703002013200729030037030020052008290300370388082005200929" + "03003703800820054180086a20850120860120870120880142c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20102014290300228101370300201120152903002282" + "01370300200f200529038008228301370300200d20132903002284013703" + "00200e200529038808228501370300200c20122903002286013703002005" + "20052903c80b2287013703c809200520052903c00b2288013703c0092006" + "208601370300200720840137030020082085013703002009208301370300" + "200a208101370300200b20820137030020052087013703c8062005208801" + "3703c0062014200a2903003703002015200b290300370300200520052903" + "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" + "22810120052903c8032282012067290300228301206629030022840142c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d201220062903003703002013200729030037" + "03002005200829030037038808200520092903003703800820054180086a" + "206529030022850120642903002286012063290300228701206229030022" + "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" + "112015290300228a01370300200f200529038008228b01370300200d2013" + "290300228c01370300200e200529038808228d01370300200c2012290300" + "228e01370300200520052903c80b228f013703c809200520052903c00b22" + "90013703c0092006208e013703002007208c013703002008208d01370300" + "2009208b01370300200a208901370300200b208a013703002005208f0137" + "03c80620052090013703c006201620062903003703002017200729030037" + "03002018200829030037030020192009290300370300201a200a29030037" + "0300201b200b290300370300200520052903c80637038806200520052903" + "c0063703800620054180066a200541c0066a200541800b6a102f20062033" + "290300370300200720322903003703002008203129030037030020092030" + "290300370300200a202f290300370300200b202e29030037030020052005" + "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" + "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" + "2903003703002026200d2903003703002025200e2903003703002024200f" + "290300370300202320102903003703002022201129030037030020052005" + "2903c8093703c805200520052903c0093703c005200541c0096a20054180" + "066a200541c0066a10302016200c2903002289013703002017200d290300" + "228a013703002018200e290300228b013703002019200f290300228c0137" + "0300201a2010290300228d01370300201b2011290300228e01370300202e" + "208e01370300202f208d013703002030208c013703002031208b01370300" + "2032208a013703002033208901370300200520052903c809228901370388" + "06200520052903c009228a01370380062005208a013703c0012005208901" + "3703c8012006205629030037030020072057290300370300200820582903" + "0037030020092059290300370300200a205a290300370300200b205b2903" + "0037030020052005290388023703c80620052005290380023703c0062005" + "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" + "066a10302027200c2903003703002026200d2903003703002025200e2903" + "003703002024200f29030037030020232010290300370300202220112903" + "00370300201b200b290300370300201a200a290300370300201920092903" + "003703002018200829030037030020172007290300370300201620062903" + "00370300200520052903c8093703c805200520052903c0093703c0052005" + "20052903c00637038006200520052903c8063703880620054180066a2005" + "41c0066a200541800b6a102f201c2028290300370300201d202929030037" + "0300201e202a290300370300201f202b2903003703002020202c29030037" + "03002021202d2903003703002005204e2903003703880720052002290300" + "3703800720054180076a2002200310302006206829030037030020072069" + "2903003703002008206a2903003703002009206b290300370300200a206c" + "290300370300200b206d29030037030020052005290388043703c8062005" + "2005290380043703c006200541c0066a20054180046a20054180076a102f" + "2014200a2903003703002015200b290300370300200520052903c8063703" + "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" + "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" + "290300370300201320072903003703002005200829030037038808200520" + "092903003703800820054180086a20432903002044290300204529030020" + "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" + "0020112015290300228a01370300200f200529038008228b01370300200d" + "2013290300228c01370300200e200529038808228d01370300200c201229" + "0300228e01370300200520052903c80b228f013703c809200520052903c0" + "0b2290013703c0092006208e013703002007208c013703002008208d0137" + "03002009208b01370300200a208901370300200b208a013703002005208f" + "013703c80620052090013703c0062014200a2903003703002015200b2903" + "00370300200520052903c8063703c80b200520052903c0063703c00b2005" + "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201220062903003703002013200729030037030020052008290300370388" + "08200520092903003703800820054180086a208501208601208701208801" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" + "15290300228201370300200f200529038008228301370300200d20132903" + "00228401370300200e200529038808228501370300200c20122903002286" + "01370300200520052903c80b2287013703c809200520052903c00b228801" + "3703c0092006208601370300200720840137030020082085013703002009" + "208301370300200a208101370300200b20820137030020052087013703c8" + "0620052088013703c006200541c0096a20054180066a200541c0066a1030" + "2016200c2903003703002017200d2903003703002018200e290300370300" + "2019200f290300370300201a2010290300370300201b2011290300370300" + "200520052903c80937038806200520052903c009370380062021202d2903" + "003703002020202c290300370300201f202b290300370300201e202a2903" + "00370300201d2029290300370300201c2028290300370300200520022903" + "00370380072005204e2903003703880720054180076a2002200410302005" + "41c0096a20054180076a20031030201c200c290300370300201d200d2903" + "00370300201e200e290300370300201f200f290300370300202020102903" + "0037030020212011290300370300200b204d290300370300200a204c2903" + "003703002009204b2903003703002008204a290300370300200720492903" + "0037030020062048290300370300200520052903c8093703880720052005" + "2903c0093703800720052005290380053703c00620052005290388053703" + "c806200541c0066a20054180056a20054180076a102f2014200a29030037" + "03002015200b290300370300200520052903c8063703c80b200520052903" + "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" + "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" + "200729030037030020052008290300370388082005200929030037038008" + "20054180086a202429030020252903002026290300202729030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d2010201429030022810137030020112015290300" + "228201370300200f200529038008228301370300200d2013290300228401" + "370300200e200529038808228501370300200c2012290300228601370300" + "200520052903c80b2287013703c809200520052903c00b2288013703c009" + "200620860137030020072084013703002008208501370300200920830137" + "0300200a208101370300200b20820137030020052087013703c806200520" + "88013703c006200541b8086a207a290300370300200541b0086a20792903" + "00370300200541a8086a2078290300370300200541a0086a207729030037" + "030020122076290300370300201320752903003703002005200529030837" + "0388082005200529030037038008200541c8086a20052903483703002005" + "41d0086a207b290300370300200541d8086a207c290300370300200541e0" + "086a207d290300370300200541e8086a207e290300370300200541f0086a" + "207f290300370300200541f8086a20800129030037030020052005290340" + "3703c008200541b8096a2034290300370300200541b0096a203629030037" + "0300200541a8096a2038290300370300200541a0096a203a290300370300" + "20054198096a203c29030037030020054190096a203e2903003703002005" + "4188096a200529038801370300200520052903800137038009200c203329" + "0300370300200d2032290300370300200e2031290300370300200f203029" + "03003703002010202f2903003703002011202e2903003703002005200529" + "03c8013703c809200520052903c0013703c009200541880a6a2005290388" + "06370300200541900a6a201b290300370300200541980a6a201a29030037" + "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" + "200541b00a6a2017290300370300200541b80a6a20162903003703002005" + "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" + "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" + "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" + "00370300200541c80a6a20052903c806370300200520052903c0063703c0" + "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" + "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" + "046a20014180016a22162002102f20034198036a2204200141186a220c29" + "030037030020034190036a2205200141106a220d29030037030020032001" + "41086a220f29030037038803200320012903003703800320034180036a20" + "032903800420032903880420032903900420034198046a220929030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" + "370300200341d0036a2207200141306a2211290300370300200320014128" + "6a22122903003703c8032003200141206a22172903003703c003200341c0" + "036a20032903a004200341a8046a220a29030020032903b004200341b804" + "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" + "0300370300200341106a22082005290300370300200341206a2213200329" + "03c003370300200341286a221420032903c803370300200341306a221520" + "07290300370300200341386a221820062903003703002003200329038803" + "370308200320032903800337030020034180046a2016200241406b221f10" + "2f2004200141d8006a22202903003703002005200141d0006a2221290300" + "3703002003200141c8006a22222903003703880320032001290340370380" + "0320034180036a2003290380042003290388042003290390042009290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" + "2007200141f0006a22242903003703002003200141e8006a222529030037" + "03c8032003200141e0006a22262903003703c003200341c0036a20032903" + "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200341d8006a22192004290300370300200341d0006a221a20052903" + "00370300200341e0006a221b20032903c003370300200341e8006a221c20" + "032903c803370300200341f0006a221d2007290300370300200341f8006a" + "221e20062903003703002003200329038803370348200320032903800337" + "0340200341f8046a2018290300370300200341f0046a2015290300370300" + "200341e8046a2014290300370300200341e0046a20132903003703002003" + "41d8046a200e290300370300200341d0046a200829030037030020032003" + "2903083703c804200320032903003703c004200341c0046a20032003102f" + "200341b8056a201e290300370300200341b0056a201d2903003703002003" + "41a8056a201c290300370300200341a0056a201b29030037030020034198" + "056a201929030037030020034190056a201a290300370300200320032903" + "4837038805200320032903403703800520034180056a200341406b200341" + "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" + "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" + "4180046a20034180016a103020034180046a200341c0016a200341c0016a" + "1030200341d8026a220e2006290300370300200341d0026a220820072903" + "00370300200320032903c8033703c802200320032903c0033703c0022003" + "41c0026a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" + "0341f0036a22142903003703002003200341e8036a221529030037038803" + "200320032903e0033703800320034180036a20032903a004200a29030020" + "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" + "2218200e29030037030020034190026a22272008290300370300200341a8" + "026a2228200329038803370300200341b0026a2229200529030037030020" + "0341b8026a222a2004290300370300200320032903c80237038802200320" + "032903c0023703800220032003290380033703a00220034180046a200320" + "034180026a102f2010200b2903003703002011200341b0046a2210290300" + "3703002012200a2903003703002017200341a0046a222b29030037030020" + "0c2009290300370300200d20034190046a2211290300370300200f200329" + "03880437030020012003290380043703002004200341d8016a2903003703" + "002005200341d0016a290300370300200320032903c80137038803200320" + "032903c0013703800320034180036a200329038002200329038802202729" + "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" + "03003703002007200341f0016a2903003703002003200341e8016a290300" + "3703c803200320032903e0013703c003200341c0036a20032903a0022028" + "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" + "0429030037030020112005290300370300200a20032903c8033703002010" + "2007290300370300200b2006290300370300200320032903880337038804" + "200320032903800337038004200320032903c0033703a004200341c0036a" + "200341406b20034180046a102f20034180046a20034180016a200141406b" + "102f200341f8056a220c2006290300370300200341f0056a220d20072903" + "00370300200320032903c8033703e805200320032903c0033703e0052003" + "41e0056a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d200e2013290300370300200820142903003703" + "00200320152903003703c802200320032903e0033703c002200341c0026a" + "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2004200c2903003703002005200d290300370300200341a0" + "036a221720032903c002370300200341a8036a220f20032903c802370300" + "200341b0036a22122008290300370300200341b8036a2208200e29030037" + "0300200320032903e80537038803200320032903e0053703800320232008" + "290300370300202420122903003703002025200f29030037030020262017" + "290300370300202020042903003703002021200529030037030020222003" + "29038803370300200120032903800337034020034180046a201620034180" + "016a102f200141b8016a200b290300370300200141b0016a201029030037" + "0300200141a8016a200a290300370300200141a0016a202b290300370300" + "20014198016a200929030037030020014190016a20112903003703002001" + "4188016a2003290388043703002001200329038004370380012003420037" + "03f802200342003703f002200342003703e802200342013703e002200342" + "003703d802200342003703d002200342003703c802200342093703c00220" + "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" + "056a22012006290300370300200341d0056a220620072903003703002003" + "20032903c8033703c805200320032903c0033703c005200341c0056a2003" + "29038004200329038804200329039004200929030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200c2013290300370300200d20142903003703002003201529" + "03003703e805200320032903e0033703e005200341e0056a20032903a004" + "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2004200129030037030020052006290300370300200f20032903e8053703" + "002012200d2903003703002008200c290300370300200320032903c80537" + "038803200320032903c00537038003200320032903e0053703a003200341" + "80046a200341c0026a20034180036a102f201e2903002136201d29030021" + "34201c290300212d201b2903002135201a29030022302003290340223184" + "201929030022382003290348223284844200520440427f4200427f420020" + "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" + "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" + "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" + "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" + "2f0b4200213042002131420021322034203584202d203684844200520440" + "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" + "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" + "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" + "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" + "ed82a3903c20357d212c0b20002003290380043703002000200329030037" + "0340200041086a200329038804370300200041c8006a2003290308370300" + "200041386a200341b8046a290300370300200041306a200341b0046a2903" + "00370300200041286a200341a8046a290300370300200041206a200341a0" + "046a290300370300200041186a20034198046a290300370300200041106a" + "20034190046a290300370300200041d0006a200341106a29030037030020" + "0041d8006a200341186a290300370300200041e0006a200341206a290300" + "370300200041e8006a200341286a290300370300200041f0006a20034130" + "6a290300370300200041f8006a200341386a290300370300200020323703" + "b801200020313703b001200020303703a8012000202c3703a00120002033" + "370398012000202e3703900120002037370388012000202f370380012003" + "4180066a24000b4201047f412021020240034020002d0000220320012d00" + "002204460440200041016a2100200141016a2101200241016b22020d010c" + "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" + "21020c010b02402000410020006b41037122046a220320004d0d00200021" + "0220040440200421050340200241003a0000200241016a2102200541016b" + "22050d000b0b200441016b4107490d000340200241003a0000200241076a" + "41003a0000200241066a41003a0000200241056a41003a0000200241046a" + "41003a0000200241036a41003a0000200241026a41003a0000200241016a" + "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" + "716a220220034b0440034020034100360200200341046a22032002490d00" + "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" + "042001410771220304400340200241003a0000200241016a210220034101" + "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" + "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" + "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" + "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" + "10490440200021030c010b02402000410020006b41037122066a22052000" + "4d0d00200641016b21082000210320012104200604402006210703402003" + "20042d00003a0000200441016a2104200341016a2103200741016b22070d" + "000b0b20084107490d000340200320042d00003a0000200341016a200441" + "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" + "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" + "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" + "41076a200441076a2d00003a0000200441086a2104200341086a22032005" + "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" + "04410371450440200320054d0d0120042101034020052001280200360200" + "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" + "2004410374220241187121062004417c71220941046a2101410020026b41" + "1871210a2009280200210203402005200220067620012802002202200a74" + "72360200200141046a2101200541046a22052003490d000b0b2007410371" + "2102200420086a21010b02402003200220036a22054f0d00200241016b21" + "072002410771220404400340200320012d00003a0000200141016a210120" + "0341016a2103200441016b22040d000b0b20074107490d00034020032001" + "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" + "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" + "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" + "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" + "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" + "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" + "20047e22042003200142208822017e7c22034220867c2206370300200020" + "05200656ad200120027e2003200454ad4220862003422088847c7c370308" + "0b5601017e0240200341c000714504402003450d012002410020036b413f" + "71ad8620012003413f71ad220488842101200220048821020c010b200220" + "03413f71ad882101420021020b20002001370300200020023703080b5a01" + "027e420121020240200141c000714504402001450d0142002001413f71ad" + "2202864201410020016b413f71ad88842103420120028621020c010b4201" + "2001413f71ad862103420021020b20002002370300200020033703080b0b" + "e1250100418080c0000bd725307830306165613865396338336337336437" + "343033363932336465316234613636643138353437643538656565346561" + "6366656537303233356564323931393534636361706163697479206f7665" + "72666c6f77004200100011000000010000000000000063616c6c65642060" + "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" + "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" + "6c656e20697320206275742074686520696e646578206973200000008f00" + "100020000000af001000120000003a2000000100000000000000d4001000" + "020000003030303130323033303430353036303730383039313031313132" + "313331343135313631373138313932303231323232333234323532363237" + "323832393330333133323333333433353336333733383339343034313432" + "343334343435343634373438343935303531353235333534353535363537" + "353835393630363136323633363436353636363736383639373037313732" + "373337343735373637373738373938303831383238333834383538363837" + "38383839393039313932393339343935393639373938393972616e676520" + "737461727420696e64657820206f7574206f662072616e676520666f7220" + "736c696365206f66206c656e67746820b001100012000000c20110002200" + "000072616e676520656e6420696e64657820f401100010000000c2011000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e6473206174200014021000160000002a0210000d00000054726965" + "6420746f20736872696e6b20746f2061206c617267657220636170616369" + "74794802100024000000f40a10004c000000b3020000090000002f686f6d" + "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" + "7372632f696e6465782e6372617465732e696f2d31393439636638633662" + "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" + "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" + "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" + "0000ea0210006f000000890000001b000000a80c10006f00000057000000" + "09000000a80c10006f000000a3000000090000008402100066000000ad00" + "000013000000a80c10006f000000c40000001f000000a80c10006f000000" + "150100000e000000a80c10006f000000160100000e000000a80c10006f00" + "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" + "6f0000002001000021000000a80c10006f0000002101000018000000a80c" + "10006f000000420100003c000000040c10006e0000006d0200000d000000" + "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f6e756d" + "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" + "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" + "0000120000003c0410006c00000028000000190000002f72757374632f34" + "656231363132353065333430633866343866363665326239323965663461" + "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" + "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f6865782d302e342e33" + "2f7372632f6c69622e7273000000260510005b000000c700000025000000" + "260510005b000000c7000000410000004e6f744d656d626572496e76616c" + "6964536c6963654c656e677468496e76616c696455353132456e636f6469" + "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" + "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" + "6c696420636f6d7072657373656420706f696e7420666c61670000000806" + "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" + "313934396366386336623562353537662f7370312d76657269666965722d" + "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" + "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f7370312d7665726966" + "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" + "00000100000001000000060000004661696c656420746f20636f6e766572" + "74207820627974657320746f20467100ac0610006a0000001f0000003700" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7370312d76657269666965722d342e312e" + "332f7372632f67726f746831362f636f6e7665727465722e727300005807" + "100072000000290000003e00000058071000720000002a0000003d000000" + "58071000720000002b0000003e00000058071000720000002c0000003e00" + "000058071000720000002e0000002500000058071000720000002e000000" + "3200000058071000720000002e0000003f00000058071000720000002e00" + "00004c0000005807100072000000320000003f0000005807100072000000" + "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f7370312d76657269666965" + "722d342e312e332f7372632f67726f746831362f7665726966792e727300" + "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737031" + "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" + "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" + "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" + "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" + "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" + "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" + "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" + "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" + "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" + "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" + "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" + "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" + "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" + "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" + "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" + "74632f346562313631323530653334306338663438663636653262393239" + "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" + "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "500b100029000000ae0400000d0000000000000004000000000000002f68" + "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" + "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" + "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" + "62696775696e742f636f6e766572742e72730000040c10006e000000f001" + "000016000000617474656d707420746f20646976696465206279207a6572" + "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f6e756d2d626967" + "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" + "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" + "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" + "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" + "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" + "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" + "726576696f75736c7920706f69736f6e656420627920612070616e69636b" + "65640000350d10005d0000004e010000250000002f72757374632f346562" + "313631323530653334306338663438663636653262393239656634613562" + "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" + "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" + "526573756c743a3a756e77726170282960206f6e20616e20604572726020" + "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" + "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" + "3934396366386336623562353537662f7375627374726174652d626e2d73" + "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" + "64732f66702e72730000630e10007b000000e9020000230000004661696c" + "656420746f20636f6d707574652074686520696e7665727365206f662074" + "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f737562737472617465" + "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" + "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" + "000000000100000001000000070000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737562" + "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" + "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" + "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" + "416666696e654731b80f10007c0000000001000012000000b80f10007c00" + "00002001000012000000b80f10007c000000400100000d000000b80f1000" + "7c0000006b01000029000000010001000000030003000000030001000300" + "000300000000000100000300010000030000000003000100000003000300" + "00010000000300000300010001000000b80f10007c000000150300002600" + "0000b80f10007c0000001003000026000000b80f10007c00000008030000" + "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" + "000010000000b80f10007c0000009c03000010000000b80f10007c000000" + "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" + "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" + "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" + "10007c000000191100002a000000b80f10007c0000001911000017000000" + "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7375627374726174652d626e2d73756363" + "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" + "0000e4111000750000003b0300000c000000e4111000750000003c030000" + "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" + "616c6964496e7075744c656e677468000000120000001300000009000000" + "ad051000bf051000a40510000a0000000d000000120000007c1210008612" + "1000931210004d0970726f64756365727302086c616e6775616765010452" + "757374000c70726f6365737365642d6279010572757374631d312e38352e" + "31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" + "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" + "756c746976616c7565"; + +extern std::string const xrplStdExampleHex = + "0061736d0100000001240560037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" + "7f7f7e017f6000017f0295010608686f73745f6c69620c6765745f74785f6669656c640000" + "08686f73745f6c6962057472616365000108686f73745f6c69620e6163636f756e745f6b65" + "796c6574000208686f73745f6c69621063616368655f6c65646765725f6f626a000008686f" + "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000208686f73745f6c69" + "620974726163655f6e756d00030302010405030100110619037f01418080c0000b7f004190" + "80c0000b7f00419080c0000b072e04066d656d6f727902000666696e69736800060a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020aa203019f0302047f017e238080" + "80800041e0006b2200248080808000200041c0006a41106a22014100360200200041c0006a" + "41086a220242003703002000420037034002400240024041818020200041c0006a41141080" + "808080004101480d00200041086a41106a2001280200360200200041086a41086a20022903" + "0037030020002000290340370308418080c08000410a200041086a41144101108180808000" + "1a200041c0006a41186a220342003703002001420037030020024200370300200042003703" + "400240200041086a4114200041c0006a41201082808080004101480d00200041206a41186a" + "2003290300370300200041206a41106a200041c0006a41106a290300370300200041206a41" + "086a200041c0006a41086a29030037030020002000290340370320200041206a4120410010" + "8380808000220241014e0d020b417b21010c020b417f21010c010b20004200370340417b21" + "01200241828018200041c0006a41081084808080004108470d00418a80c080004106200029" + "034022041085808080001a417741012004501b21010b200041e0006a24808080800020010b" + "0b190100418080c0000b1020204163636f756e743a20204665653a008903046e616d650016" + "157872706c5f7374645f6578616d706c652e7761736d01c9020700335f5a4e387872706c5f" + "73746434686f737431326765745f74785f6669656c64313768646531643438363634626333" + "6138346145012b5f5a4e387872706c5f73746434686f737435747261636531376831626534" + "3662336564373737306363624502355f5a4e387872706c5f73746434686f73743134616363" + "6f756e745f6b65796c6574313768333736666637613833306562626537624503375f5a4e38" + "7872706c5f73746434686f7374313663616368655f6c65646765725f6f626a313768646361" + "6435366531366262633331653345043b5f5a4e387872706c5f73746434686f737432306765" + "745f6c65646765725f6f626a5f6669656c6431376863623833653465366431326162306332" + "45052f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376832363139" + "36306163653839633831313845060666696e697368071201000f5f5f737461636b5f706f69" + "6e746572090a0100072e726f64617461004d0970726f64756365727302086c616e67756167" + "65010452757374000c70726f6365737365642d6279010572757374631d312e38372e302028" + "31373036376539616320323032352d30352d3039290094010f7461726765745f6665617475" + "726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663" + "616c6c2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75" + "7461626c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72" + "65666572656e63652d74797065732b087369676e2d657874"; + std::string const ledgerSqnHex = "0061736d010000000105016000017f02190108686f73745f6c69620c6765" "744c656467657253716e00000302010005030100100611027f00418080c0" @@ -34,821 +10809,74 @@ std::string const ledgerSqnHex = "732b0a6d756c746976616c7565"; std::string const allHostFunctionsHex = - "0061736d0100000001540c60037f7f7f017f60027f7f017f60027f7f0060" - "017f0060057f7f7f7f7f017f6000017f60017f017f60037f7f7f0060047f" - "7f7f7f00600b7f7f7f7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60" - "027f7e00027b0408686f73745f6c69620a67657454784669656c64000108" - "686f73745f6c69621a67657443757272656e744c6564676572456e747279" - "4669656c64000108686f73745f6c6962136765744c6564676572456e7472" - "794669656c64000408686f73745f6c696213676574506172656e744c6564" - "67657254696d65000503363501010101090a000302010101010506020207" - "020201040001010100010400010101020701080101030800010103020202" - "060102000b04050170011c1c05030100110619037f01418080c0000b7f00" - "41b2a0c0000b7f0041c0a0c0000b074606066d656d6f727902000666696e" - "697368001108616c6c6f6361746500340a6465616c6c6f6361746500360a" - "5f5f646174615f656e6403010b5f5f686561705f62617365030209210100" - "41010b1b07040e06101b1c181d1f242a292531350b0d0f212223272b2d2e" - "2f0ac99e0135d70201057f230041406a220224000240200028020022042d" - "0000450440200128021c41d480c0004104200128022028020c1100002100" - "0c010b41012100200128021c220341d880c0004104200128022022062802" - "0c22051100000d00200441016a2104024020012d00144104714504402003" - "418d83c000410120051100000d022004200110050d02200128021c210320" - "0128022028020c21050c010b2003418e83c000410220051100000d012002" - "41013a0017200241206a200141086a290200370300200241286a20014110" - "6a290200370300200241306a200141186a2802003602002002200636020c" - "20022003360208200241e482c00036023820022001290200370318200220" - "0241176a3602102002200241086a3602342004200241186a10050d012002" - "280234418883c0004102200228023828020c1100000d010b2003419891c0" - "004101200511000021000b200241406b240020000bff0201037f23004180" - "016b22032400027f0240200128021422024110714504402002412071450d" - "0120002d0000210241810121000340200020036a41026b2002410f712204" - "413072200441376a2004410a491b3a000020022204410476210220004101" - "6b21002004410f4b0d000b20014101419183c0004102200020036a41016b" - "41810120006b10090c020b20002d0000210241810121000340200020036a" - "41026b2002410f712204413072200441d7006a2004410a491b3a00002002" - "22044104762102200041016b21002004410f4b0d000b20014101419183c0" - "004102200020036a41016b41810120006b10090c010b0240024002402000" - "2d0000220241e4004f044020032002200241e4006e2202419c7f6c6a41ff" - "0171410174419383c0006a2f00003b0001410021000c010b410221002002" - "410a4f0d010b200020036a20024130723a00000c010b4101210020032002" - "410174419383c0006a2f00003b00010b2001410141014100200020036a20" - "0041037310090b20034180016a24000b4701017f230041106b2202240020" - "022000280200220041046a36020c200141a080c000410941a980c000410b" - "2000410141b480c00041092002410c6a41021008200241106a24000bff01" - "01037f23004180016b22042400027f024020012802142202411071450440" - "20024120710d01200028020041012001100a0c020b200028020021004181" - "0121020340200220046a41026b2000410f712203413072200341d7006a20" - "03410a491b3a0000200241016b21022000410f4b200041047621000d000b" - "20014101419183c0004102200220046a41016b41810120026b10090c010b" - "2000280200210041810121020340200220046a41026b2000410f71220341" - "3072200341376a2003410a491b3a0000200241016b21022000410f4b2000" - "41047621000d000b20014101419183c0004102200220046a41016b418101" - "20026b10090b20044180016a24000bc50101017f230041106b220b240020" - "0028021c20012002200028022028020c1100002101200b41003a000d200b" - "20013a000c200b2000360208200b41086a20032004200520061020200720" - "082009200a10202101200b2d000d2202200b2d000c220372210002402003" - "4101712002410147720d00200128020022002d0014410471450440200028" - "021c418b83c0004102200028022028020c11000021000c010b200028021c" - "418a83c0004101200028022028020c11000021000b200b41106a24002000" - "4101710bef0401077f027f200145044020002802142106412d2109200541" - "016a0c010b412b418080c4002000280214220641017122011b2109200120" - "056a0b210702402006410471450440410021020c010b024020034504400c" - "010b2003410371220a450d00200221010340200820012c000041bf7f4a6a" - "2108200141016a2101200a41016b220a0d000b0b200720086a21070b2000" - "280200450440200028021c22012000280220220020092002200310190440" - "41010f0b200120042005200028020c1100000f0b02400240024020072000" - "28020422084f0440200028021c2201200028022022002009200220031019" - "450d0141010f0b2006410871450d012000280210210b2000413036021020" - "002d0018210c41012101200041013a0018200028021c2206200028022022" - "0a20092002200310190d02200820076b41016a210102400340200141016b" - "2201450d0120064130200a280210110100450d000b41010f0b2006200420" - "05200a28020c110000044041010f0b2000200c3a00182000200b36021041" - "000f0b200120042005200028020c11000021010c010b200820076b210602" - "4002400240410120002d0018220120014103461b220141016b0e02000102" - "0b20062101410021060c010b20064101762101200641016a41017621060b" - "200141016a21012000280210210820002802202107200028021c21000240" - "0340200141016b2201450d01200020082007280210110100450d000b4101" - "0f0b410121012000200720092002200310190d0020002004200520072802" - "0c1100000d004100210103402001200646044041000f0b200141016a2101" - "200020082007280210110100450d000b200141016b2006490f0b20010bbd" - "0201067f230041106b22042400410a2103024020004190ce004904402000" - "21050c010b0340200441066a20036a220641046b20004190ce006e220541" - "f0b1036c20006a220741ffff037141e4006e2208410174419383c0006a2f" - "00003b0000200641026b2008419c7f6c20076a41ffff0371410174419383" - "c0006a2f00003b0000200341046b2103200041ffc1d72f4b200521000d00" - "0b0b0240200541e3004d0440200521000c010b200341026b220320044106" - "6a6a200541ffff037141e4006e2200419c7f6c20056a41ffff0371410174" - "419383c0006a2f00003b00000b02402000410a4f0440200341026b220320" - "0441066a6a2000410174419383c0006a2f00003b00000c010b200341016b" - "2203200441066a6a20004130723a00000b2002200141014100200441066a" - "20036a410a20036b1009200441106a24000b1701017f2000280200220104" - "4020002802042001100c0b0bce0601047f0240200041046b280200220422" - "02417871220341044108200241037122021b20016a4f0440200241002003" - "200141276a4b1b0d01200041086b22012004220341787122006a21020240" - "024020034101710d002003410271450d012001280200220320006a210020" - "0120036b22014190a0c00028020046044020022802044103714103470d01" - "4188a0c000200036020020022002280204417e7136020420012000410172" - "360204200220003602000c020b2001200310330b02400240024002400240" - "2002280204220341027145044020024194a0c000280200460d0220024190" - "a0c000280200460d0320022003417871220210332001200020026a220041" - "0172360204200020016a200036020020014190a0c000280200470d014188" - "a0c00020003602000c060b20022003417e71360204200120004101723602" - "04200020016a20003602000b2000418002490d0220012000103241002101" - "41a8a0c00041a8a0c00028020041016b220036020020000d0441f09dc000" - "280200220004400340200141016a2101200028020822000d000b0b41a8a0" - "c00041ff1f2001200141ff1f4d1b3602000c040b4194a0c0002001360200" - "418ca0c000418ca0c00028020020006a2200360200200120004101723602" - "044190a0c00028020020014604404188a0c00041003602004190a0c00041" - "003602000b200041a0a0c00028020022034d0d034194a0c0002802002202" - "450d0341002100418ca0c00028020022044129490d0241e89dc000210103" - "402002200128020022054f04402002200520012802046a490d040b200128" - "020821010c000b000b4190a0c00020013602004188a0c0004188a0c00028" - "020020006a220036020020012000410172360204200020016a2000360200" - "0c020b200041f8017141f89dc0006a2102027f4180a0c000280200220341" - "012000410376742200714504404180a0c000200020037236020020020c01" - "0b20022802080b2100200220013602082000200136020c2001200236020c" - "200120003602080c010b41f09dc000280200220104400340200041016a21" - "00200128020822010d000b0b41a8a0c00041ff1f2000200041ff1f4d1b36" - "0200200320044f0d0041a0a0c000417f3602000b0f0b41dd88c000418c89" - "c0001016000b419c89c00041cc89c0001016000b4201017f230041106b22" - "02240020022000410c6a36020c200141bd80c000410d41ca80c000410520" - "00410341cf80c00041052002410c6a41041008200241106a24000b8e0301" - "087f230041406a2202240020002802082105200028020421034101210620" - "0128021c41cc81c0004101200128022028020c1100002100200504400340" - "20072108410121072000410171210441012100024020040d00024020012d" - "00144104714504402008410171450d01200128021c418383c00041022001" - "28022028020c110000450d010c020b20012802202104200128021c210920" - "08410171450440200941d59ac0004101200428020c1100000d020b200241" - "013a0017200241206a200141086a290200370300200241286a200141106a" - "290200370300200241306a200141186a2802003602002002200436020c20" - "022009360208200241e482c0003602382002200129020037031820022002" - "41176a3602102002200241086a3602342003200241186a10054504402002" - "280234418883c0004102200228023828020c11000021000c020b0c010b20" - "032001100521000b200341016a2103200541016b22050d000b0b20004504" - "40200128021c419083c0004101200128022028020c11000021060b200241" - "406b240020060bdb0101047f230041106b220224002002200036020c2300" - "41106b22002400200128021c41f899c000410d200128022028020c110000" - "2103200041003a000d200020033a000c20002001360208200041086a4185" - "9ac00041042002410c6a41051020210320002d000d220420002d000c2205" - "722101024020054101712004410147720d00200328020022012d00144104" - "71450440200128021c418b83c0004102200128022028020c11000021010c" - "010b200128021c418a83c0004101200128022028020c11000021010b2000" - "41106a24002001410171200241106a24000b3300200128021c2000280200" - "2d00004102742200418c9cc0006a280200200041f89bc0006a2802002001" - "28022028020c1100000bf813020e7f037e230041f0006b2203240041b1a0" - "c0002d00001a024002400240024002404107101222000440200041036a41" - "879bc000280000360000200041849bc000280000360000200341286a2000" - "41071000101320004107100c41b1a0c0002d00001a410710122200450d05" - "200041036a41879bc000280000360000200041849bc00028000036000020" - "0341346a200041071001101320004107100c41b1a0c0002d00001a410b10" - "122200450d05200041076a41929bc0002800003600002000418b9bc00029" - "0000370000200341406b2000410b100110132000410b100c41b1a0c0002d" - "00001a200328024821012003280244210b410710122204450d0541002100" - "200441036a41b79bc000280000360000200441b49bc00028000036000020" - "0341d8006a41e100200b20012004410710021013200328025c2105024002" - "400240200328026022020e020700010b41012100200522012d0000412b6b" - "0e03060106010b20052d0000412b460440200241016b2100200541016a21" - "0120024112490d010c030b200521012002220041114f0d020b034020012d" - "000041306b220241094b0d04200141016a21012002ad2010420a7e7c2110" - "200041016b22000d000b0c020b0c040b2000210203402002450d01200341" - "186a2010103820012d000041306b220941094b0d02410221002003290320" - "4200520d03200141016a2101200241016b21022003290318220e2009ad7c" - "2210200e5a0d000b0c020b20032802582200044020052000100c0b200441" - "07100c41b1a0c0002d00001a024002404104101222000440200041c4c2d1" - "8b06360000200341cc006a200041041001101320004104100c027f024020" - "03280254220541004e047f2003280250210c20054504404101210141000c" - "030b41b1a0c0002d00001a2005101222010d0141010541000b41e899c000" - "1014000b20050b21092001200c2005103721002005450d01200541076b22" - "014100200120054d1b2106200041036a417c7120006b2108410021010340" - "024002400240200020016a2d00002202c0220741004e0440200820016b41" - "03710d01200120064f0d020340200020016a220228020420022802007241" - "8081828478710d03200141086a22012006490d000b0c020b428080808080" - "20210e428080808010210f024002400240027e0240024002400240024002" - "4002400240200241a485c0006a2d000041026b0e030003010b0b20014101" - "6a22022005490d014200210e0c090b4200210e200141016a22042005490d" - "020c080b200020026a2c000041bf7f4a0d080c060b4200210e200141016a" - "220420054f0d06200020046a2c0000210402400240200241e00147044020" - "0241ed01460d012007411f6a41ff0171410c490d022007417e71416e470d" - "0420044140480d050c040b200441607141a07f460d040c030b2004419f7f" - "4a0d020c030b20044140480d020c010b200020046a2c0000210402400240" - "02400240200241f0016b0e050100000002000b2007410f6a41ff01714102" - "4b200441404e720d030c020b200441f0006a41ff017141304f0d020c010b" - "2004418f7f4a0d010b200141026a220220054f0d05200020026a2c000041" - "bf7f4a0d024200210f200141036a220220054f0d06200020026a2c000041" - "bf7f4c0d04428080808080e0000c030b428080808080200c020b4200210f" - "200141026a220220054f0d04200020026a2c000041bf7f4c0d020b428080" - "808080c0000b210e428080808010210f0c020b200241016a21010c040b42" - "00210f0b2001ad200e200f8484210e200941808080807846044020002109" - "0c070b2003200e3702642003200936025820032000ad2005ad4220868437" - "025c200341d8006a418080c00041e880c0001015000b200141016a21010c" - "010b200120054f0d000340200020016a2c00004100480d01200520014101" - "6a2201470d000b0c030b20012005490d000b0c010b0c040b2005ad210e20" - "0021050b410021000240024002400240024002400240200ea722020e0206" - "00010b41012100200522012d0000412b6b0e03050105010b20052d000041" - "2b460440200241016b2100200541016a210120024112490d010c020b2005" - "21012002220041114f0d010b4200210e034020012d000041306b22024109" - "4b0d03200141016a21012002ad200e420a7e7c210e200041016b22000d00" - "0b0c010b4200210e2000210203402002450d01200341086a200e10382001" - "2d000041306b220441094b0d024102210020032903104200520d03200141" - "016a2101200241016b21022003290308220f2004ad7c220e200f5a0d000b" - "0c020b410021071003210d41b1a0c0002d00001a02400240024002400240" - "024002400240410b101222080440200841076a419d9bc000280000360000" - "200841969bc000290000370000200341d8006a2008410b10011013200328" - "025c2104024002400240200328026022020e020a00010b4101210720042d" - "00002201412b6b0e03090109010b20042d000021010b0240024002400240" - "200141ff0171412b6b0e03000201020b200241016b2101200441016a2100" - "20024109490d02200121020c080b200241016b2106200441016a21002002" - "4109490d044100210103402006450d0b20002d000041306b220241094b0d" - "09410321072001ac420a7e220f422088a7200fa7220a411f75470d0a2000" - "41016a2100200641016b2106200a200a20026b22014a200241004a73450d" - "000b0c090b20042100200241074b0d060c020b20012202450d030c010b0c" - "0c0b4100210141012107034020002d000041306b220641094b0d06200041" - "016a210020062001410a6c6a2101200241016b22020d000b0c060b20060d" - "010b410021010c040b4100210141012107034020002d000041306b220241" - "094b0d03200041016a21002001410a6c20026b2101200641016b22060d00" - "0b0c030b4100210103402002450d0320002d000041306b220641094b0d01" - "410221072001ac420a7e220f422088a7200fa7220a411f75470d02200041" - "016a2100200241016b21022006410048200a2006200a6a22014a73450d00" - "0b0c010b410121070b200320073a006f200341ef006a41c098c00041a49b" - "c0001015000b20032802582200044020042000100c0b2008410b100c4100" - "210020032802302202200328023c460440200328022c2104200328023821" - "0741002106024020022200450d00034020042d0000220220072d00002208" - "460440200441016a2104200741016a2107200041016b22000d010c020b0b" - "200220086b21060b20064521000b2009044020052009100c0b200328024c" - "22020440200c2002100c0b200328024022020440200b2002100c0b200328" - "02342202044020032802382002100c0b200328022822020440200328022c" - "2002100c0b200341f0006a2400200e20105a2000712001200d4c710f0b41" - "0121000b200320003a0058200341d8006a419080c00041f880c000101500" - "0b410121000b200320003a004c200341cc006a41c098c00041bc9bc00010" - "15000b410141e899c0001014000bee2202087f017e024002400240024002" - "40024002400240200041f4014d04404180a0c00028020022024110200041" - "0b6a41f803712000410b491b220541037622007622014103710d01200541" - "88a0c0002802004d0d0720010d024184a0c00028020022000d030c070b20" - "00410b6a220141787121054184a0c0002802002208450d06411f21074100" - "20056b2103200041f4ffff074d04402005410620014108766722006b7641" - "017120004101746b413e6a21070b200741027441e89cc0006a2802002202" - "45044041002100410021010c040b410021002005411920074101766b4100" - "2007411f471b742104410021010340024020022802044178712206200549" - "0d00200620056b220620034f0d0020022101200622030d00410021032001" - "21000c060b200228021422062000200620022004411d764104716a41106a" - "2802002202471b200020061b21002004410174210420020d000b0c030b02" - "402001417f7341017120006a2206410374220041f89dc0006a2203200041" - "809ec0006a280200220128020822044704402004200336020c2003200436" - "02080c010b4180a0c0002002417e200677713602000b2001200041037236" - "0204200020016a220020002802044101723602040c060b02404102200074" - "2203410020036b72200120007471682206410374220041f89dc0006a2203" - "200041809ec0006a280200220128020822044704402004200336020c2003" - "20043602080c010b4180a0c0002002417e200677713602000b2001200541" - "0372360204200120056a2206200020056b2204410172360204200020016a" - "20043602004188a0c00028020022020440200241787141f89dc0006a2100" - "4190a0c0002802002103027f4180a0c00028020022054101200241037674" - "2202714504404180a0c000200220057236020020000c010b20002802080b" - "2102200020033602082002200336020c2003200036020c20032002360208" - "0b4190a0c00020063602004188a0c00020043602000c050b200068410274" - "41e89cc0006a280200220128020441787120056b21032001210202400340" - "02400240200128021022000d00200128021422000d002002280218210702" - "4002402002200228020c2200460440200241144110200228021422001b6a" - "28020022010d01410021000c020b20022802082201200036020c20002001" - "3602080c010b200241146a200241106a20001b2104034020042106200122" - "0041146a200041106a200028021422011b210420004114411020011b6a28" - "020022010d000b200641003602000b2007450d032002200228021c410274" - "41e89cc0006a220128020047044020074110411420072802102002461b6a" - "20003602002000450d040c020b2001200036020020000d014184a0c00041" - "84a0c000280200417e200228021c77713602000c030b2000280204417871" - "20056b22012003200120034922011b21032000200220011b210220002101" - "0c010b0b2000200736021820022802102201044020002001360210200120" - "003602180b20022802142201450d0020002001360214200120003602180b" - "02400240200341104f044020022005410372360204200220056a22062003" - "410172360204200320066a20033602004188a0c0002802002204450d0120" - "0441787141f89dc0006a21004190a0c0002802002101027f4180a0c00028" - "0200220541012004410376742204714504404180a0c00020042005723602" - "0020000c010b20002802080b2104200020013602082004200136020c2001" - "200036020c200120043602080c010b2002200320056a2200410372360204" - "200020026a220020002802044101723602040c010b4190a0c00020063602" - "004188a0c00020033602000b200241086a0f0b2000200172450440410021" - "0141022007742200410020006b722008712200450d0320006841027441e8" - "9cc0006a28020021000b2000450d010b0340200020012000280204417871" - "220420056b220620034922071b2108200028021022024504402000280214" - "21020b20012008200420054922001b210120032006200320071b20001b21" - "03200222000d000b0b2001450d0020054188a0c00028020022004d200320" - "0020056b4f710d0020012802182107024002402001200128020c22004604" - "40200141144110200128021422001b6a28020022020d01410021000c020b" - "20012802082202200036020c200020023602080c010b200141146a200141" - "106a20001b21040340200421062002220041146a200041106a2000280214" - "22021b210420004114411020021b6a28020022020d000b20064100360200" - "0b02402007450d0002402001200128021c41027441e89cc0006a22022802" - "0047044020074110411420072802102001461b6a20003602002000450d02" - "0c010b2002200036020020000d004184a0c0004184a0c000280200417e20" - "0128021c77713602000c010b200020073602182001280210220204402000" - "2002360210200220003602180b20012802142202450d0020002002360214" - "200220003602180b0240200341104f044020012005410372360204200120" - "056a22022003410172360204200220036a200336020020034180024f0440" - "2002200310320c020b200341f8017141f89dc0006a2100027f4180a0c000" - "280200220441012003410376742203714504404180a0c000200320047236" - "020020000c010b20002802080b2103200020023602082003200236020c20" - "02200036020c200220033602080c010b2001200320056a22004103723602" - "04200020016a220020002802044101723602040b0c010b02400240024002" - "400240024020054188a0c00028020022014b04402005418ca0c000280200" - "22004f044041002100200541af80046a220141107640002202417f462203" - "0d0720024110742202450d074198a0c000410020014180807c7120031b22" - "044198a0c0002802006a2200360200419ca0c000419ca0c0002802002201" - "200020002001491b360200024002404194a0c0002802002203044041e89d" - "c0002100034020002802002201200028020422066a2002460d0220002802" - "0822000d000b0c020b41a4a0c00028020022004100200020024d1b450440" - "41a4a0c00020023602000b41a8a0c00041ff1f36020041ec9dc000200436" - "020041e89dc000200236020041849ec00041f89dc000360200418c9ec000" - "41809ec00036020041809ec00041f89dc00036020041949ec00041889ec0" - "0036020041889ec00041809ec000360200419c9ec00041909ec000360200" - "41909ec00041889ec00036020041a49ec00041989ec00036020041989ec0" - "0041909ec00036020041ac9ec00041a09ec00036020041a09ec00041989e" - "c00036020041b49ec00041a89ec00036020041a89ec00041a09ec0003602" - "0041bc9ec00041b09ec00036020041b09ec00041a89ec00036020041f49d" - "c000410036020041c49ec00041b89ec00036020041b89ec00041b09ec000" - "36020041c09ec00041b89ec00036020041cc9ec00041c09ec00036020041" - "c89ec00041c09ec00036020041d49ec00041c89ec00036020041d09ec000" - "41c89ec00036020041dc9ec00041d09ec00036020041d89ec00041d09ec0" - "0036020041e49ec00041d89ec00036020041e09ec00041d89ec000360200" - "41ec9ec00041e09ec00036020041e89ec00041e09ec00036020041f49ec0" - "0041e89ec00036020041f09ec00041e89ec00036020041fc9ec00041f09e" - "c00036020041f89ec00041f09ec00036020041849fc00041f89ec0003602" - "00418c9fc00041809fc00036020041809fc00041f89ec00036020041949f" - "c00041889fc00036020041889fc00041809fc000360200419c9fc0004190" - "9fc00036020041909fc00041889fc00036020041a49fc00041989fc00036" - "020041989fc00041909fc00036020041ac9fc00041a09fc00036020041a0" - "9fc00041989fc00036020041b49fc00041a89fc00036020041a89fc00041" - "a09fc00036020041bc9fc00041b09fc00036020041b09fc00041a89fc000" - "36020041c49fc00041b89fc00036020041b89fc00041b09fc00036020041" - "cc9fc00041c09fc00036020041c09fc00041b89fc00036020041d49fc000" - "41c89fc00036020041c89fc00041c09fc00036020041dc9fc00041d09fc0" - "0036020041d09fc00041c89fc00036020041e49fc00041d89fc000360200" - "41d89fc00041d09fc00036020041ec9fc00041e09fc00036020041e09fc0" - "0041d89fc00036020041f49fc00041e89fc00036020041e89fc00041e09f" - "c00036020041fc9fc00041f09fc00036020041f09fc00041e89fc0003602" - "004194a0c000200236020041f89fc00041f09fc000360200418ca0c00020" - "0441286b220036020020022000410172360204200020026a412836020441" - "a0a0c00041808080013602000c080b200220034d200120034b720d002000" - "28020c450d030b41a4a0c00041a4a0c0002802002200200220002002491b" - "360200200220046a210141e89dc000210002400240034020012000280200" - "2206470440200028020822000d010c020b0b200028020c450d010b41e89d" - "c0002100034002402003200028020022014f04402003200120002802046a" - "2206490d010b200028020821000c010b0b4194a0c0002002360200418ca0" - "c000200441286b220036020020022000410172360204200020026a412836" - "020441a0a0c00041808080013602002003200641206b41787141086b2200" - "2000200341106a491b2201411b36020441e89dc000290200210920014110" - "6a41f09dc0002902003702002001200937020841ec9dc000200436020041" - "e89dc000200236020041f09dc000200141086a36020041f49dc000410036" - "02002001411c6a2100034020004107360200200041046a22002006490d00" - "0b20012003460d0720012001280204417e713602042003200120036b2200" - "4101723602042001200036020020004180024f04402003200010320c080b" - "200041f8017141f89dc0006a2101027f4180a0c000280200220241012000" - "410376742200714504404180a0c000200020027236020020010c010b2001" - "2802080b2100200120033602082000200336020c2003200136020c200320" - "003602080c070b200020023602002000200028020420046a360204200220" - "054103723602042006410f6a41787141086b2201200220056a22046b2103" - "20014194a0c000280200460d0320014190a0c000280200460d0420012802" - "04220541037141014604402001200541787122001033200020016a220128" - "02042105200020036a21030b20012005417e713602042004200341017236" - "0204200320046a200336020020034180024f04402004200310320c060b20" - "0341f8017141f89dc0006a2100027f4180a0c00028020022014101200341" - "0376742203714504404180a0c000200120037236020020000c010b200028" - "02080b2103200020043602082003200436020c2004200036020c20042003" - "3602080c050b418ca0c000200020056b22013602004194a0c0004194a0c0" - "00280200220020056a220236020020022001410172360204200020054103" - "72360204200041086a21000c060b4190a0c0002802002100024020012005" - "6b2202410f4d04404190a0c00041003602004188a0c00041003602002000" - "2001410372360204200020016a220120012802044101723602040c010b41" - "88a0c00020023602004190a0c000200020056a2203360200200320024101" - "72360204200020016a2002360200200020054103723602040b200041086a" - "0f0b2000200420066a3602044194a0c0004194a0c0002802002200410f6a" - "417871220141086b2202360200418ca0c000418ca0c00028020020046a22" - "03200020016b6a41086a220136020020022001410172360204200020036a" - "412836020441a0a0c00041808080013602000c030b4194a0c00020043602" - "00418ca0c000418ca0c00028020020036a22003602002004200041017236" - "02040c010b4190a0c00020043602004188a0c0004188a0c0002802002003" - "6a220036020020042000410172360204200020046a20003602000b200241" - "086a0f0b41002100418ca0c000280200220120054d0d00418ca0c0002001" - "20056b22013602004194a0c0004194a0c000280200220020056a22023602" - "002002200141017236020420002005410372360204200041086a0f0b2000" - "0f0b200141086a0b2701017f200020012800042202360208200020012800" - "003602042000200236020020014108100c0b3b002000450440230041206b" - "22002400200041003602182000410136020c2000419c81c0003602082000" - "4204370210200041086a20011017000b000b7e01017f230041406a220324" - "002003412b36020c200341d098c000360208200320013602142003200036" - "02102003410236021c200341d482c0003602182003420237022420032003" - "41106aad4280808080e000843703382003200341086aad4280808080f000" - "843703302003200341306a360220200341186a20021017000b4101017f23" - "0041206b2202240020024100360210200241013602042002420437020820" - "02412e36021c200220003602182002200241186a36020020022001101700" - "0bf40102027f017e230041106b22022400200241013b010c200220013602" - "0820022000360204230041106b22012400200241046a2200290200210420" - "01200036020c20012004370204230041106b22002400200141046a220128" - "0200220228020c2103024002400240024020022802040e020001020b2003" - "0d0141012102410021030c020b20030d0020022802002202280204210320" - "0228020021020c010b20004180808080783602002000200136020c200128" - "020822012d0008210220012d00091a2000410e20021026000b2000200336" - "020420002002360200200128020822012d0008210220012d00091a200041" - "0f20021026000b0d00200028020041012001100a0b380002402002418080" - "c400460d00200020022001280210110100450d0041010f0b200345044041" - "000f0b200020032004200128020c1100000b900a010a7f02400240024020" - "0028020022052000280208220372044002402003410171450d0020012002" - "6a21060240200028020c2209450440200121040c010b2001210403402004" - "22032006460d02027f200341016a20032c0000220441004e0d001a200341" - "026a20044160490d001a200341036a20044170490d001a200341046a0b22" - "0420036b20076a21072009200841016a2208470d000b0b20042006460d00" - "20042c00001a20072002027f02402007450d00200220074d044020022007" - "460d0141000c020b200120076a2c000041404e0d0041000c010b20010b22" - "031b21022003200120031b21010b2005450d032000280204210b20024110" - "4f044020022001200141036a417c7122076b22086a220a41037121094100" - "210541002103200120074704402008417c4d044041002106034020032001" - "20066a22042c000041bf7f4a6a200441016a2c000041bf7f4a6a20044102" - "6a2c000041bf7f4a6a200441036a2c000041bf7f4a6a2103200641046a22" - "060d000b0b200121040340200320042c000041bf7f4a6a2103200441016a" - "2104200841016a22080d000b0b02402009450d002007200a417c716a2204" - "2c000041bf7f4a210520094101460d00200520042c000141bf7f4a6a2105" - "20094102460d00200520042c000241bf7f4a6a21050b200a410276210620" - "0320056a21050340200721082006450d0441c0012006200641c0014f1b22" - "09410371210a2009410274210741002104200641044f04402008200741f0" - "07716a210c200821030340200420032802002204417f7341077620044106" - "76724181828408716a20032802042204417f734107762004410676724181" - "828408716a20032802082204417f73410776200441067672418182840871" - "6a200328020c2204417f734107762004410676724181828408716a210420" - "0341106a2203200c470d000b0b200620096b2106200720086a2107200441" - "087641ff81fc0771200441ff81fc07716a418180046c41107620056a2105" - "200a450d000b2008200941fc01714102746a22042802002203417f734107" - "762003410676724181828408712103200a4101460d022003200428020422" - "03417f734107762003410676724181828408716a2103200a4102460d0220" - "0320042802082203417f734107762003410676724181828408716a21030c" - "020b2002450440410021050c030b20024103712104024020024104490440" - "41002105410021080c010b41002105200121032002410c71220821070340" - "200520032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341026a" - "2c000041bf7f4a6a200341036a2c000041bf7f4a6a2105200341046a2103" - "200741046b22070d000b0b2004450d02200120086a21030340200520032c" - "000041bf7f4a6a2105200341016a2103200441016b22040d000b0c020b0c" - "020b200341087641ff811c71200341ff81fc07716a418180046c41107620" - "056a21050b02402005200b490440200b20056b210602400240024020002d" - "00182203410020034103471b220341016b0e020001020b20062103410021" - "060c010b20064101762103200641016a41017621060b200341016a210320" - "00280210210820002802202104200028021c21000340200341016b220345" - "0d02200020082004280210110100450d000b41010f0b0c010b2000200120" - "02200428020c110000044041010f0b410021030340200320064604404100" - "0f0b200341016a2103200020082004280210110100450d000b200341016b" - "2006490f0b200028021c20012002200028022028020c1100000b14002000" - "2802002001200028020428020c1101000b10002001200028020020002802" - "04101a0b1000200128021c20012802202000101e0bea04010a7f23004130" - "6b220324002003200136022c20032000360228200341033a002420034220" - "37021c200341003602142003410036020c027f0240024002402002280210" - "220a450440200228020c2200450d012002280208220120004103746a2104" - "200041016b41ffffffff017141016a210720022802002100034020004104" - "6a28020022050440200328022820002802002005200328022c28020c1100" - "000d040b20012802002003410c6a200141046a2802001101000d03200041" - "086a2100200141086a22012004470d000b0c010b20022802142200450d00" - "2000410574210b200041016b41ffffff3f7141016a210720022802082105" - "200228020021000340200041046a28020022010440200328022820002802" - "002001200328022c28020c1100000d030b20032008200a6a220141106a28" - "020036021c20032001411c6a2d00003a00242003200141186a2802003602" - "202001410c6a28020021044100210941002106024002400240200141086a" - "28020041016b0e020002010b200441037420056a220c2802000d01200c28" - "020421040b410121060b200320043602102003200636020c200141046a28" - "02002104024002400240200128020041016b0e020002010b200441037420" - "056a22062802000d01200628020421040b410121090b2003200436021820" - "0320093602142005200141146a2802004103746a22012802002003410c6a" - "200141046a2802001101000d02200041086a2100200b200841206a220847" - "0d000b0b200720022802044f0d012003280228200228020020074103746a" - "22002802002000280204200328022c28020c110000450d010b41010c010b" - "41000b200341306a24000b1900200128021c41a481c000410e2001280220" - "28020c1100000b820302047f017e230041406a2206240041012107024020" - "002d00040d0020002d00052108200028020022052d001441047145044020" - "0528021c418383c000418083c000200841017122081b4102410320081b20" - "0528022028020c1100000d01200528021c20012002200528022028020c11" - "00000d01200528021c41f391c0004102200528022028020c1100000d0120" - "032005200411010021070c010b2008410171450440200528021c418583c0" - "004103200528022028020c1100000d010b200641013a0017200641206a20" - "0541086a290200370300200641286a200541106a29020037030020064130" - "6a200541186a2802003602002006200529021c3702082005290200210920" - "0641e482c000360238200620093703182006200641176a36021020062006" - "41086a220536023420052001200210210d00200541f391c000410210210d" - "002003200641186a20041101000d002006280234418883c0004102200628" - "023828020c11000021070b200041013a0005200020073a0004200641406b" - "240020000bab04010c7f200141016b210e2000280204210a200028020021" - "0b2000280208210c0240034020050d01027f024020022003490d00034020" - "0120036a2105024002400240200220036b220741074d044020022003470d" - "01200221030c050b0240200541036a417c71220620056b22040440410021" - "000340200020056a2d0000410a460d052004200041016a2200470d000b20" - "04200741086b22004d0d010c030b200741086b21000b0340418082840820" - "062802002209418a94a8d000736b2009724180828408200641046a280200" - "2209418a94a8d000736b2009727141808182847871418081828478470d02" - "200641086a2106200441086a220420004d0d000b0c010b41002100034020" - "0020056a2d0000410a460d022007200041016a2200470d000b200221030c" - "030b20042007460440200221030c030b200420056a2106200220046b2003" - "6b21074100210002400340200020066a2d0000410a460d01200720004101" - "6a2200470d000b200221030c030b200020046a21000b200020036a220441" - "016a21030240200220044d0d00200020056a2d0000410a470d0041002105" - "200322040c030b200220034f0d000b0b20022008460d0241012105200821" - "0420020b21000240200c2d00000440200b41fc82c0004104200a28020c11" - "00000d010b41002106200020084704402000200e6a2d0000410a4621060b" - "200020086b2100200120086a2107200c20063a000020042108200b200720" - "00200a28020c110000450d010b0b4101210d0b200d0b4f01027f20002802" - "042102200028020021030240200028020822002d0000450d00200341fc82" - "c0004104200228020c110000450d0041010f0b20002001410a463a000020" - "03200120022802101101000b0d00200041e482c0002001101e0b2201017f" - "200028020022002000411f7522027320026b2000417f73411f762001100a" - "0b0900200041003602000b7b01027f230041106b2203240041d49cc00041" - "d49cc000280200220441016a360200024020044100480d00024041b0a0c0" - "002d000045044041aca0c00041aca0c00028020041016a36020041d09cc0" - "0028020041004e0d010c020b200341086a20002001110200000b41b0a0c0" - "0041003a00002002450d00000b000b250020002802002d00004504402001" - "41db84c0004105101a0f0b200141e084c0004104101a0b6701027f200128" - "02082204452001280200220520046b20034f724504402001410036020820" - "0141003a000c410021040b20032005490440200128020420046a20022003" - "10371a200041043a00002001200320046a3602080f0b2000420437020020" - "0141003a000c0bac0301017f230041406a22022400024002400240024002" - "40024020002d000041016b0e03010203000b2002200028020436020441b1" - "a0c0002d00001a411410122200450d04200041106a41ac95c00028000036" - "0000200041086a41a495c0002900003700002000419c95c0002900003700" - "00200241143602102002200036020c200241143602082002410336022c20" - "02419c91c000360228200242023702342002200241046aad4280808080b0" - "01843703202002200241086aad4280808080c00184370318200220024118" - "6a360230200128021c2001280220200241286a101e210020022802082201" - "450d03200228020c2001100c0c030b20002d000121002002410136022c20" - "0241c88ac000360228200242013702342002200241186aad4280808080f0" - "008437030820022000410274220041f095c0006a28020036021c20022000" - "419897c0006a2802003602182002200241086a360230200128021c200128" - "0220200241286a101e21000c020b20012000280204220028020020002802" - "04101a21000c010b20002802042200280200200120002802042802101101" - "0021000b200241406b240020000f0b000b10002001200028020420002802" - "08101a0b5501037f2000280204210120002d0000220041044d2000410347" - "7145044020012802002100200141046a2802002202280200220304402000" - "20031103000b20022802042202044020002002100c0b2001410c100c0b0b" - "c709010a7f230041206b2208240002400240024002402001280210450440" - "2001417f36021020032003200241036a417c7120026b220a6b4107714100" - "2003200a4f1b22046b210920032004490d0102402004450d00027f200441" - "016b200220036a220541016b22062d0000410a460d001a2006200220096a" - "2207460d01200441026b200541026b22062d0000410a460d001a20062007" - "460d01200441036b200541036b22062d0000410a460d001a20062007460d" - "01200441046b200541046b22062d0000410a460d001a20062007460d0120" - "0441056b200541056b22062d0000410a460d001a20062007460d01200441" - "066b200541066b22062d0000410a460d001a20062007460d01200441076b" - "200541076b22052d0000410a460d001a20052007460d0120044178720b20" - "096a41016a21040c040b200a20032003200a4b1b210c410020046b210a20" - "0241046b210d2004417f7320026a21060340024020062105200a21042009" - "2207200c4d0d00200441086b210a200541086b2106418082840820022007" - "41086b22096a280200220b418a94a8d000736b200b724180828408200720" - "0d6a280200220b418a94a8d000736b200b72714180818284787141808182" - "8478460d010b0b20032007490d0202400340200320046a450d0120044101" - "6b2104200320056a200541016b21052d0000410a470d000b200320046a41" - "016a21040c040b02402001411c6a2802002204450440410021040c010b20" - "0141186a28020020046a41016b2d0000410a470d0041002104200141003a" - "00202001411c6a41003602000b2003200128021420046b4f044020002001" - "41146a2002200310280c050b200128021820046a2002200310371a200041" - "043a00002001411c6a200320046a3602000c040b230041306b2200240020" - "00410136020c200041c481c0003602082000420137021420002000412f6a" - "ad4280808080a001843703202000200041206a360210200041086a41d091" - "c0001017000b230041306b22002400200020033602042000200936020020" - "00410236020c200041d887c000360208200042023702142000200041046a" - "ad428080808080018437032820002000ad42808080808001843703202000" - "200041206a360210200041086a418485c0001017000b230041306b220024" - "0020002003360204200020073602002000410236020c200041f887c00036" - "0208200042023702142000200041046aad42808080808001843703282000" - "2000ad42808080808001843703202000200041206a360210200041086a41" - "9485c0001017000b20032004490440200841003602182008410136020c20" - "0841888bc00036020820084204370210200841086a41908bc0001017000b" - "02402001411c6a2802002205450d0002400240200128021420056b20044d" - "0440200841086a200141146a20022004102820082d00084104470d012001" - "411c6a28020021050c020b200141186a28020020056a2002200410371a20" - "01411c6a200420056a22053602000c010b200020082903083702000c020b" - "2005450d00200141003a00202001411c6a41003602000b200220046a2105" - "200320046b220220012802144f04402000200141146a2005200210280c01" - "0b200141186a2802002005200210371a200041043a00002001411c6a2002" - "3602000b2001200128021041016a360210200841206a24000b9a0102047f" - "017e230041106b22032400200341086a200028020828020020012002102c" - "20032d000822054104470440200028020421012003290308210720002d00" - "00220241044d20024103477145044020012802002102200141046a280200" - "220428020022060440200220061103000b20042802042204044020022004" - "100c0b2001410c100c0b200020073702000b200341106a24002005410447" - "0be10202057f017e230041106b2202240020024100360204027f20014180" - "014f044020014180104f04402001418080044f044020022001413f714180" - "01723a00072002200141127641f001723a000420022001410676413f7141" - "8001723a000620022001410c76413f71418001723a000541040c030b2002" - "2001413f71418001723a000620022001410c7641e001723a000420022001" - "410676413f71418001723a000541030c020b20022001413f71418001723a" - "00052002200141067641c001723a000441020c010b200220013a00044101" - "0b2101200241086a2000280208280200200241046a2001102c20022d0008" - "22054104470440200028020421012002290308210720002d000022034104" - "4d20034103477145044020012802002103200141046a2802002204280200" - "22060440200320061103000b20042802042204044020032004100c0b2001" - "410c100c0b200020073702000b200241106a240020054104470b0d002000" - "419c88c0002001101e0bba0a02047f037e230041406a2201240020014106" - "36020c2001419892c00036020841c89cc0002d0000410347044002402300" - "41206b22022400024002400240024041c89cc0002d000041026b0e020301" - "000b41c89cc00041023a000041b1a0c0002d00001a41800810122203450d" - "0141c89cc00041033a000041b89cc000200336020041b09cc00042808080" - "8080800137030041a09cc000420037030041c09cc00041003a000041bc9c" - "c000410036020041ac9cc00041003a000041a89cc00041003602000b2002" - "41206a24000c020b000b200241003602182002410136020c200241e895c0" - "0036020820024204370210200241086a41b094c0001017000b0b02400240" - "024041d89cc000290300220650044041e09cc00029030021050340200542" - "7f510d0241e09cc000200542017c220641e09cc000290300220720052007" - "5122021b370300200721052002450d000b41d89cc00020063703000b0240" - "024041a09cc000290300200652044041ac9cc0002d000021034101210241" - "ac9cc00041013a0000200120033a00182003450d01200142003702342001" - "4281808080c00037022c200141c893c000360228230041106b2202240020" - "02418888c00036020c2002200141186a360208230041f0006b2200240020" - "00418c88c00036020c2000200241086a3602082000418c88c00036021420" - "002002410c6a3602102000410236021c200041cd81c00036021802402001" - "41286a22012802004504402000410336025c2000418082c0003602582000" - "42033702642000200041106aad4280808080e00084370348200020004108" - "6aad4280808080e000843703400c010b200041306a200141106a29020037" - "0300200041286a200141086a290200370300200020012902003703202000" - "410436025c200041b482c000360258200042043702642000200041106aad" - "4280808080e000843703502000200041086aad4280808080e00084370348" - "2000200041206aad42808080809001843703400b2000200041186aad4280" - "808080f000843703382000200041386a360260200041d8006a41fc93c000" - "1017000b41a89cc0002802002202417f470440200241016a21020c020b23" - "0041306b220024002000412636020c200041c094c0003602082000410136" - "0214200041c88ac0003602102000420137021c2000200041086aad428080" - "8080f000843703282000200041286a360218200041106a418c95c0001017" - "000b41a09cc00020063703000b41a89cc0002002360200200141a09cc000" - "36021041042102200141043a00182001200141106a360220200141186a41" - "9c88c0002000101e210320012d0018210002402003450440420021054117" - "2000764101710d01200128021c22002802002102200041046a2802002203" - "28020022040440200220041103000b20032802042203044020022003100c" - "0b2000410c100c410421020c010b20004104460d02200129031822074280" - "7e8321052007a721020b20012802102200200028020841016b2203360208" - "2003450440200041003a000c200042003703000b200241ff01714104470d" - "02200141406b24000f0b230041206b220024002000410036021820004101" - "36020c200041b08ac00036020820004204370210200041086a41b88ac000" - "1017000b200141003602382001410136022c2001419093c0003602282001" - "4204370230200141286a419893c0001017000b200120052002ad42ff0183" - "843703102001410236022c200141f891c000360228200142023702342001" - "200141106aad4280808080d001843703202001200141086aad4280808080" - "f000843703182001200141186a360230200141286a418892c0001017000b" - "0c00200020012902003703000bba0201047f411f21022000420037021020" - "0141ffffff074d04402001410620014108766722036b7641017120034101" - "746b413e6a21020b2000200236021c200241027441e89cc0006a21044101" - "20027422034184a0c0002802007145044020042000360200200020043602" - "182000200036020c200020003602084184a0c0004184a0c0002802002003" - "723602000f0b024002402001200428020022032802044178714604402003" - "21020c010b2001411920024101766b41002002411f471b74210503402003" - "2005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c" - "20022000360208200041003602182000200236020c200020013602080f0b" - "20042000360200200020033602182000200036020c200020003602080bf1" - "0201047f200028020c21020240024020014180024f044020002802182103" - "0240024020002002460440200041144110200028021422021b6a28020022" - "010d01410021020c020b20002802082201200236020c200220013602080c" - "010b200041146a200041106a20021b21040340200421052001220241146a" - "200241106a200228021422011b210420024114411020011b6a2802002201" - "0d000b200541003602000b2003450d022000200028021c41027441e89cc0" - "006a220128020047044020034110411420032802102000461b6a20023602" - "002002450d030c020b2001200236020020020d014184a0c0004184a0c000" - "280200417e200028021c77713602000c020b200028020822002002470440" - "2000200236020c200220003602080f0b4180a0c0004180a0c00028020041" - "7e200141037677713602000f0b2002200336021820002802102201044020" - "022001360210200120023602180b20002802142200450d00200220003602" - "14200020023602180b0b8f0101027f230041306b22012400024020004100" - "4e047f2000450440410121020c020b41b1a0c0002d00001a200010122202" - "0d0141010541000b41bc9ac0001014000b2001200236020c200141023602" - "14200141d89ac0003602102001420137021c2001411036022c2001200141" - "286a36021820012001410c6a360228200141106a1030200128020c200141" - "306a24000bcf0101067f23004180016b2204240020012802042107200128" - "020021062000280200210020012802142205210202402005410471450d00" - "2005410872210220060d0020014281808080a0013702000b200120024104" - "7236021441810121020340200220046a41026b2000410f71220341307220" - "0341d7006a2003410a491b3a0000200241016b2102200041104920004104" - "762100450d000b20014101419183c0004102200220046a41016b41810120" - "026b10092001200536021420012007360204200120063602002004418001" - "6a24000b6301017f230041306b220224002002200036020c200241023602" - "14200241f49ac0003602102002420137021c2002411036022c2002200241" - "286a36021820022002410c6a360228200241106a10302001044020022802" - "0c2001100c0b200241306a24000b8c0501087f0240200241104904402000" - "21030c010b02402000410020006b41037122066a220520004d0d00200021" - "032001210420060440200621070340200320042d00003a0000200441016a" - "2104200341016a2103200741016b22070d000b0b200641016b4107490d00" - "0340200320042d00003a0000200341016a200441016a2d00003a00002003" - "41026a200441026a2d00003a0000200341036a200441036a2d00003a0000" - "200341046a200441046a2d00003a0000200341056a200441056a2d00003a" - "0000200341066a200441066a2d00003a0000200341076a200441076a2d00" - "003a0000200441086a2104200341086a22032005470d000b0b2005200220" - "066b2207417c7122086a21030240200120066a2204410371450440200320" - "054d0d0120042101034020052001280200360200200141046a2101200541" - "046a22052003490d000b0c010b200320054d0d0020044103742202411871" - "21062004417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220067620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20074103712102200420086a21010b" - "02402003200220036a22064f0d002002410771220404400340200320012d" - "00003a0000200141016a2101200341016a2103200441016b22040d000b0b" - "200241016b4107490d000340200320012d00003a0000200341016a200141" - "016a2d00003a0000200341026a200141026a2d00003a0000200341036a20" - "0141036a2d00003a0000200341046a200141046a2d00003a000020034105" - "6a200141056a2d00003a0000200341066a200141066a2d00003a00002003" - "41076a200141076a2d00003a0000200141086a2101200341086a22032006" - "470d000b0b20000b4901037e2000200142ffffffff0f832202420a7e2203" - "420022022001422088420a7e7c22014220867c2204370300200020032004" - "56ad2001200254ad4220862001422088847c3703080b0bea1b0400418080" - "c0000ba40611000000140000000400000012000000000000000100000001" - "00000013000000557466384572726f7276616c69645f75705f746f657272" - "6f725f6c656e46726f6d557466384572726f7262797465736572726f724e" - "6f6e65536f6d657372632f6c69622e727300005c0010000a000000150000" - "003d0000005c0010000a0000001600000037000000636170616369747920" - "6f766572666c6f770000008800100011000000426f72726f774d75744572" - "726f72616c726561647920626f72726f7765643a20b2001000120000005b" - "3d3d617373657274696f6e20606c6566742020726967687460206661696c" - "65640a20206c6566743a200a2072696768743a2000cf00100010000000df" - "00100017000000f60010000900000020726967687460206661696c65643a" - "200a20206c6566743a20000000cf00100010000000180110001000000028" - "01100009000000f6001000090000000100000000000000f3081000020000" - "00000000000c000000040000001400000015000000160000002020202020" - "7b202c20207b0a2c0a7d207d28280a5d3078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230" - "323132323233323432353236323732383239333033313332333333343335" - "333633373338333934303431343234333434343534363437343834393530" - "353135323533353435353536353735383539363036313632363336343635" - "363636373638363937303731373237333734373537363737373837393830" - "383138323833383438353836383738383839393039313932393339343935" - "393639373938393966616c7365747275656c6962726172792f636f72652f" - "7372632f736c6963652f6d656d6368722e72736402100020000000850000" - "001e0000006402100020000000a100000009000000010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010100" - "41e686c0000b330202020202020202020202020202020202020202020202" - "020202020202020303030303030303030303030303030304040404040041" - "a487c0000b6172616e676520737461727420696e64657820206f7574206f" - "662072616e676520666f7220736c696365206f66206c656e67746820a403" - "100012000000b60310002200000072616e676520656e6420696e64657820" - "e803100010000000b60310002200419088c0000b8f140400000004000000" - "17000000180000000c00000004000000190000001a0000001b0000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f766572686561640034041000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "3404100029000000ae0400000d0000006c6962726172792f7374642f7372" - "632f7468726561642f6d6f642e72736661696c656420746f2067656e6572" - "61746520756e69717565207468726561642049443a206269747370616365" - "20657868617573746564f904100037000000dc0410001d000000ae040000" - "0d00000001000000000000006c6962726172792f7374642f7372632f696f" - "2f62756666657265642f6c696e657772697465727368696d2e72736d6964" - "203e206c656e00007d05100009000000500510002d000000160100002900" - "0000656e74697479206e6f7420666f756e647065726d697373696f6e2064" - "656e696564636f6e6e656374696f6e2072656675736564636f6e6e656374" - "696f6e207265736574686f737420756e726561636861626c656e6574776f" - "726b20756e726561636861626c65636f6e6e656374696f6e2061626f7274" - "65646e6f7420636f6e6e65637465646164647265737320696e2075736561" - "646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c7265616479206578" - "697374736f7065726174696f6e20776f756c6420626c6f636b6e6f742061" - "206469726563746f727969732061206469726563746f7279646972656374" - "6f7279206e6f7420656d707479726561642d6f6e6c792066696c65737973" - "74656d206f722073746f72616765206d656469756d66696c657379737465" - "6d206c6f6f70206f7220696e646972656374696f6e206c696d6974202865" - "2e672e2073796d6c696e6b206c6f6f70297374616c65206e6574776f726b" - "2066696c652068616e646c65696e76616c696420696e7075742070617261" - "6d65746572696e76616c6964206461746174696d6564206f757477726974" - "65207a65726f6e6f2073746f726167652073706163657365656b206f6e20" - "756e7365656b61626c652066696c6571756f746120657863656564656466" - "696c6520746f6f206c617267657265736f75726365206275737965786563" - "757461626c652066696c652062757379646561646c6f636b63726f73732d" - "646576696365206c696e6b206f722072656e616d65746f6f206d616e7920" - "6c696e6b73696e76616c69642066696c656e616d65617267756d656e7420" - "6c69737420746f6f206c6f6e676f7065726174696f6e20696e7465727275" - "70746564756e737570706f72746564756e657870656374656420656e6420" - "6f662066696c656f7574206f66206d656d6f7279696e2070726f67726573" - "736f74686572206572726f72756e63617465676f72697a6564206572726f" - "7220286f73206572726f72202900000001000000000000008d0810000b00" - "000098081000010000006c6962726172792f7374642f7372632f696f2f73" - "7464696f2e727300b40810001b00000032030000140000006661696c6564" - "207072696e74696e6720746f203a20000000e008100013000000f3081000" - "02000000b40810001b00000063040000090000007374646f75746c696272" - "6172792f7374642f7372632f696f2f6d6f642e72736120666f726d617474" - "696e6720747261697420696d706c656d656e746174696f6e207265747572" - "6e656420616e206572726f72207768656e2074686520756e6465726c7969" - "6e672073747265616d20646964206e6f7400000037091000560000001e09" - "100019000000680700001500000063616e6e6f7420726563757273697665" - "6c792061637175697265206d75746578a8091000200000006c6962726172" - "792f7374642f7372632f7379732f73796e632f6d757465782f6e6f5f7468" - "72656164732e7273d00910002c00000013000000090000006c6962726172" - "792f7374642f7372632f73796e632f706f69736f6e2f6f6e63652e727300" - "0c0a100023000000d9000000140000006c6f636b20636f756e74206f7665" - "72666c6f7720696e207265656e7472616e74206d757465786c6962726172" - "792f7374642f7372632f73796e632f7265656e7472616e745f6c6f636b2e" - "7273660a100026000000220100002d0000006f7065726174696f6e207375" - "636365737366756c6f6e652d74696d6520696e697469616c697a6174696f" - "6e206d6179206e6f7420626520706572666f726d65642072656375727369" - "76656c79b00a100038000000100000001100000012000000100000001000" - "000013000000120000000d0000000e000000150000000c0000000b000000" - "15000000150000000f0000000e0000001300000026000000380000001900" - "0000170000000c000000090000000a00000010000000170000000e000000" - "0e0000000d00000014000000080000001b0000000e000000100000001600" - "0000150000000b000000160000000d0000000b0000000b00000013000000" - "a0051000b0051000c1051000d3051000e3051000f3051000060610001806" - "1000250610003306100048061000540610005f0610007406100089061000" - "98061000a6061000b9061000df0610001707100030071000470710005307" - "10005c07100066071000760710008d0710009b071000a9071000b6071000" - "ca071000d2071000ed071000fb0710000b08100021081000360810004108" - "100057081000640810006f0810007a081000000000000100000001000000" - "1300000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f55736572732f6d7661646172" - "692f2e7275737475702f746f6f6c636861696e732f737461626c652d6161" - "72636836342d6170706c652d64617277696e2f6c69622f727573746c6962" - "2f7372632f727573742f6c6962726172792f616c6c6f632f7372632f736c" - "6963652e72737b0c10006d000000a1000000190000005061727365496e74" - "4572726f726b696e642f55736572732f6d7661646172692f446f63756d65" - "6e74732f63726166742f7872706c2d7374642f7372632f6c69622e727300" - "090d1000320000000500000016000000616c6c6f63617465200a00004c0d" - "100009000000550d1000010000006465616c6c6f636174652000680d1000" - "0b000000550d1000010000004163636f756e7444657374696e6174696f6e" - "46696e6973684166746572000000090d1000320000008000000016000000" - "42616c616e636500090d1000320000009b00000016000000456d70747949" - "6e76616c69644469676974506f734f766572666c6f774e65674f76657266" - "6c6f775a65726f00050000000c0000000b0000000b00000004000000cc0d" - "1000d10d1000dd0d1000e80d1000f30d10004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d7574" - "61626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; + "0061736d01000000012e0760037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" + "7f7f7e017f60027f7f017f6000017f60017f0002df010808686f73745f6c69620c6765745f" + "74785f6669656c64000008686f73745f6c6962057472616365000108686f73745f6c69621c" + "6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000008686f73745f6c" + "69620e6163636f756e745f6b65796c6574000208686f73745f6c69621063616368655f6c65" + "646765725f6f626a000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669" + "656c64000208686f73745f6c69620974726163655f6e756d000308686f73745f6c69621667" + "65745f706172656e745f6c65646765725f74696d6500040304030506000405017001010105" + "030100110619037f01418080c0000b7f00418481c0000b7f00419081c0000b072e04066d65" + "6d6f727902000666696e69736800080a5f5f646174615f656e6403010b5f5f686561705f62" + "61736503020af80803db0702047f027e23808080800041f0206b2200248080808000200041" + "d0006a41106a22014100360200200041d0006a41086a220242003703002000420037035002" + "4002400240024041818020200041d0006a41141080808080004101480d00200041086a4110" + "6a2001280200360200200041086a41086a2002290300370300200020002903503703084180" + "80c080004109200041086a411441011081808080001a200141003602002002420037030020" + "00420037035041818020200041d0006a411410828080800041004c0d01200041206a41106a" + "200041d0006a41106a2201280200360200200041206a41086a200041d0006a41086a220229" + "030037030020002000290350370320418980c080004108200041206a411441011081808080" + "001a2001410036020020024200370300200042003703500240024041838020200041d0006a" + "411410828080800041004c0d00200041386a41106a2001280200360200200041386a41086a" + "200229030037030020002000290350370338419180c080004107200041386a411441011081" + "808080001a200041d0006a41186a2203420037030020014200370300200242003703002000" + "42003703500240200041386a4114200041d0006a41201083808080004101480d00200041d0" + "206a41186a2003290300370300200041d0206a41106a200041d0006a41106a290300370300" + "200041d0206a41086a200041d0006a41086a290300370300200020002903503703d0202000" + "41d0206a41204100108480808000220241014e0d020b417c21010c050b417d21010c040b20" + "004200370350417c2101200241828018200041d0006a41081085808080004108470d034198" + "80c08000410f200029035022041086808080001a0240418020450d00200041d0006a410041" + "8020fc0b000b0240419b801c200041d0006a418020108280808000220241014e0d00417b21" + "010c040b41a780c08000410a2002ad1086808080001a0240200241084d0d00417a21010c04" + "0b41b180c080004107200041d0006a200241011081808080001a4100210142002105034020" + "05420886200041d0006a20016a3100008421052002200141016a2201470d000b41b880c080" + "00412120051086808080001a200041003602d0200240200041d0206a410410878080800041" + "004e0d00417921010c040b41d980c08000411520003402d0201086808080001a2000108980" + "80800020002802004101710d02417821010c030b417f21010c020b417e21010c010b41ee80" + "c08000411620002802042201ac1086808080001a200041086a200041206a4114108a808080" + "004520042005587120002802d02020014e7121010b200041f0206a24808080800020010b4e" + "01027f23808080800041106b22012480808080002001410036020c41a580082001410c6a41" + "0410828080800021022000200128020c3602042000200241004a360200200141106a248080" + "8080000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205" + "470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21" + "030b20030b0b8e010100418080c0000b8401202073656e6465723a20206f776e65723a2020" + "646573743a2020646573745f62616c616e63653a2020646174615f6c656e2020646174613a" + "20207468726573686f6c645f62616c616e63652c2075736520646174615b695d3a20207061" + "72656e745f6c65646765725f74696d653a2020657363726f775f66696e6973685f61667465" + "723a00d804046e616d650016157872706c5f7374645f6578616d706c652e7761736d019804" + "0b00335f5a4e387872706c5f73746434686f737431326765745f74785f6669656c64313768" + "6465316434383636346263336138346145012b5f5a4e387872706c5f73746434686f737435" + "7472616365313768316265343662336564373737306363624502435f5a4e387872706c5f73" + "746434686f737432386765745f63757272656e745f6c65646765725f6f626a5f6669656c64" + "313768343532633531353638653033353531384503355f5a4e387872706c5f73746434686f" + "737431346163636f756e745f6b65796c657431376833373666663761383330656262653762" + "4504375f5a4e387872706c5f73746434686f7374313663616368655f6c65646765725f6f62" + "6a3137686463616435366531366262633331653345053b5f5a4e387872706c5f7374643468" + "6f737432306765745f6c65646765725f6f626a5f6669656c64313768636238336534653664" + "3132616230633245062f5f5a4e387872706c5f73746434686f73743974726163655f6e756d" + "3137683236313936306163653839633831313845073d5f5a4e387872706c5f73746434686f" + "737432326765745f706172656e745f6c65646765725f74696d653137686234636264356664" + "336463326230383445080666696e69736809415f5a4e387872706c5f73746433316765745f" + "63757272656e745f657363726f775f66696e6973685f616674657231376863333562336366" + "356633353733363933450a066d656d636d70071201000f5f5f737461636b5f706f696e7465" + "72090a0100072e726f64617461004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e38372e302028313730" + "36376539616320323032352d30352d3039290094010f7461726765745f6665617475726573" + "082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c" + "2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75746162" + "6c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72656665" + "72656e63652d74797065732b087369676e2d657874"; std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -1569,3 +11597,89 @@ std::string const deepRecursionHex = "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; + +extern std::string const hostFunctions2Hex = + "0061736d01000000012f0760047f7f7f7f017f60037f7f7f017f60027f7f" + "017f60057f7f7f7f7f017f60037f7f7e017f60017f017f6000017f028a02" + "0a08686f73745f6c6962057472616365000308686f73745f6c69620c6765" + "745f74785f6669656c64000108686f73745f6c69620974726163655f6e75" + "6d000408686f73745f6c69620e6163636f756e745f6b65796c6574000008" + "686f73745f6c69621063616368655f6c65646765725f6f626a000108686f" + "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008" + "686f73745f6c6962136765745f74785f6e65737465645f6669656c640000" + "08686f73745f6c6962106765745f74785f61727261795f6c656e00050868" + "6f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000208686f73745f6c69620b7570646174655f64617461000203020106" + "05030100110619037f01418080c0000b7f00419187c0000b7f0041a087c0" + "000b072e04066d656d6f727902000666696e697368000a0a5f5f64617461" + "5f656e6403010b5f5f686561705f6261736503020ae50701e20701057f23" + "0041e0006b2201240041b580c000411b41014100410110001a41f380c000" + "412841014100410110001a200141d0006a4100360200200141c8006a4200" + "370300200142003703400240024002400240024002400240418180202001" + "41406b22004114100122024114460440419b81c000410e20004114410110" + "001a2001420037032041888018200141206a41081001220041004c0d0141" + "a981c00041112000ad10021a2001410036020841848008200141086a4104" + "1001220041004c044041d081c00041252000ac10021a0c070b41ba81c000" + "41162000ad10021a41bf82c000412841014100410110001a200141306a22" + "034100360200200141286a22044200370300200142003703204181802020" + "0141206a22024114100122004100480d0220012000360238200141143602" + "3c20004114470d03200141106a2004290300370300200141186a20032802" + "0036020020012001290320370308200141d8006a4200370300200141d000" + "6a4200370300200141c8006a420037030020014200370340024002402001" + "41086a4114200141406b220341201003220041004a044041e782c000410f" + "20034120410110001a41f682c00041172000ad10021a2003200041001004" + "220041004c0d01418d83c00041162000ad10021a20014200370320200041" + "828018200241081005220041004a044041a383c00041152000ad10021a20" + "0041094f0d0841b883c000410e20022000410110001a0c030b41c683c000" + "412b2000ac10021a0c020b41ac84c000411d2000ac10021a417e21000c09" + "0b41f183c000413b2000ac10021a0b41c984c00041234101410041011000" + "1a200141d8006a4200370300200141d0006a4200370300200141c8006a42" + "0037030020014200370340024041ec84c0004102200141406b2202412010" + "06220041004e044041ee84c000411e2000ad10021a200041214f0d07418c" + "85c000411220022000410110001a0c010b419e85c00041292000ac10021a" + "0b02404183803c10072200410048044041c785c00041202000ac10021a0c" + "010b41e785c00041152000ad10021a0b024041ec84c00041021008220041" + "0048044041fc85c000411f2000ac10021a0c010b419b86c00041142000ad" + "10021a0b4101210041af86c000412241014100410110001a41d186c00041" + "0e10092202044041f786c000411a2002ac10021a417c21000c080b41df86" + "c000411841d186c000410e410110001a41d080c000412341014100410110" + "001a0c070b419582c000412a2002ac10021a0c050b41f581c00041202000" + "ac10021a0c040b418080c00041354100410041001000000b200141003602" + "40230041106b2400000b000b000b417f21000b200141e0006a240020000b" + "0b9b070100418080c0000b9107486f73742066756e6374696f6e20676574" + "5f63757272656e745f657363726f775f66696e6973685f6669656c642066" + "61696c6564213d3d3d20484f53542046554e4354494f4e53205445535420" + "3d3d3d535543434553533a20486f73742066756e6374696f6e2074657374" + "73207061737365642d2d2d205465737420313a205472616e73616374696f" + "6e204669656c6420416363657373202d2d2d4163636f756e74206669656c" + "643a466565206669656c64206c656e6774683a53657175656e6365206669" + "656c64206c656e6774683a4552524f523a206765745f74785f6669656c64" + "2853657175656e636529206661696c65643a4552524f523a206765745f74" + "785f6669656c642846656529206661696c65643a4552524f523a20676574" + "5f74785f6669656c64284163636f756e74292077726f6e67206c656e6774" + "683a2d2d2d205465737420323a204c6564676572204f626a656374204f70" + "65726174696f6e73202d2d2d4163636f756e74206b65796c65743a4b6579" + "6c65742062797465732067656e6572617465643a4f626a65637420636163" + "68656420696e20736c6f743a42616c616e6365206669656c64206c656e67" + "74683a42616c616e6365206669656c643a494e464f3a206765745f6c6564" + "6765725f6f626a5f6669656c642842616c616e636529206661696c65643a" + "494e464f3a2063616368655f6c65646765725f6f626a206661696c656420" + "28657870656374656420666f722074657374206669787475726573293a45" + "52524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d" + "2d205465737420333a204e6573746564204669656c642041636365737320" + "2d2d2d01024e6573746564206669656c6420616363657373207375636365" + "656465643a4e6573746564206669656c6420646174613a494e464f3a2067" + "65745f74785f6e65737465645f6669656c64206e6f74206170706c696361" + "626c653a494e464f3a204e6f207369676e657273206172726179206f7220" + "6572726f723a5369676e657273206172726179206c656e6774683a494e46" + "4f3a204e6f206e6573746564206172726179206f72206572726f723a4e65" + "73746564206172726179206c656e6774683a2d2d2d205465737420343a20" + "5374617465204d6f64696669636174696f6e202d2d2d746573745f737461" + "74655f31323353746174652075706461746564207769746820646174613a" + "4552524f523a207570646174655f64617461206661696c65643a00550970" + "726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38362e302d6e696768746c79" + "202862336233363861313820323032352d30312d30352900490f74617267" + "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" + "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index e7bada74a5f..acf2de906e0 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -28,3 +28,29 @@ extern std::string const ledgerSqnHex; extern std::string const allHostFunctionsHex; extern std::string const deepRecursionHex; + +extern std::string const tx_js; + +extern std::string const lo_js; + +extern std::string const lo_js2; + +extern std::string const fib32Hex; + +extern std::string const fib64Hex; + +extern std::string const b58Hex; + +extern std::string const sha512PureHex; + +extern std::string const checkJsonHex; + +extern std::string const compareJsonHex; + +extern std::string const zkProofHex; + +extern std::string const sp1_wasm; + +extern std::string const xrplStdExampleHex; + +extern std::string const hostFunctions2Hex; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 3cc18fdea8d..fb1852bd00d 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -23,9 +23,12 @@ #include -namespace ripple { +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif -////////////////////////////////////////////////////////////////////////////////////////// +namespace ripple { namespace { @@ -45,7 +48,7 @@ getLogLevel(beast::severities::Severity severity) case kError: return WASM_LOG_LEVEL_ERROR; default: - UNREACHABLE("invalid severity"); + UNREACHABLE("WAMR invalid severity"); [[fallthrough]]; case kFatal: case kNone: @@ -70,7 +73,7 @@ getLogLevel(uint32_t severity) case WASM_LOG_LEVEL_ERROR: return kError; default: - UNREACHABLE("invalid severity"); + UNREACHABLE("WAMR invalid reverse severity"); [[fallthrough]]; case WASM_LOG_LEVEL_FATAL: break; @@ -88,18 +91,18 @@ wamr_log_to_rippled( char const* fmt, ...) { - beast::Journal j = debugLog(); + beast::Journal j = WasmEngine::instance().getJournal(); // Format the variadic args char const* safeFile = file ? file : ""; std::ostringstream oss; - oss << "WAMR LOG (" << safeFile << ":" << line << "): "; + oss << "WAMR (" << safeFile << ":" << line << "): "; va_list args; va_start(args, fmt); - char formatted[1024]; + char formatted[4096]; vsnprintf(formatted, sizeof(formatted), fmt, args); formatted[sizeof(formatted) - 1] = '\0'; @@ -108,22 +111,47 @@ wamr_log_to_rippled( oss << formatted; j.stream(getLogLevel(logLevel)) << oss.str(); +#ifdef DEBUG_OUTPUT_WAMR + std::cerr << oss.str() << std::endl; +#endif + // } -static void -print_wasm_error(char const* message, wasm_trap_t* trap, beast::Journal j) +void +print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) { - j.debug() << "WAMR error: " << message; +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = jlog.error(); +#endif + + j << "WAMR Error: " << msg; if (trap) { wasm_byte_vec_t error_message; wasm_trap_message(trap, &error_message); + if (error_message.num_elems) + { + j << +#ifdef DEBUG_OUTPUT + "\nWAMR " +#else + "WAMR " +#endif + << error_message.data; + } + + if (error_message.size) + wasm_byte_vec_delete(&error_message); wasm_trap_delete(trap); - j.debug() << "WAMR trap: " << error_message.data; - wasm_byte_vec_delete(&error_message); } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif } } // namespace @@ -134,7 +162,8 @@ InstanceWrapper::init( wasm_module_t* m, int32_t maxPages, wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports) + wasm_extern_vec_t const& imports, + beast::Journal j) { wasm_trap_t* trap = nullptr; InstantiationArgs inst_args{ @@ -148,11 +177,8 @@ InstanceWrapper::init( if (!mi || trap) { - print_wasm_error( - "can't create instance", - trap, - beast::Journal(beast::Journal::getNullSink())); - throw std::runtime_error("WAMR: can't create instance"); + print_wasm_error("can't create instance", trap, j); + throw std::runtime_error("WAMR can't create instance"); } wasm_instance_exports(mi.get(), expt); return mi; @@ -171,6 +197,27 @@ InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) *this = std::move(o); } +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j) + : exports WASM_EMPTY_VEC + , mod_inst(init(s, m, maxPages, &exports, imports, j)) + , exec_env(wasm_instance_exec_env(mod_inst.get())) + , j_(j) +{ + wasm_runtime_set_instruction_count_limit(exec_env, gas); +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports.size) + wasm_extern_vec_delete(&exports); +} + InstanceWrapper& InstanceWrapper::operator=(InstanceWrapper&& o) { @@ -183,23 +230,12 @@ InstanceWrapper::operator=(InstanceWrapper&& o) o.exports = {0, nullptr, 0, 0, nullptr}; mod_inst = std::move(o.mod_inst); + exec_env = o.exec_env; + o.exec_env = nullptr; - return *this; -} + j_ = o.j_; -InstanceWrapper::InstanceWrapper( - wasm_store_t* s, - wasm_module_t* m, - int32_t maxPages, - wasm_extern_vec_t const& imports) - : exports WASM_EMPTY_VEC, mod_inst(init(s, m, maxPages, &exports, imports)) -{ -} - -InstanceWrapper::~InstanceWrapper() -{ - if (exports.size) - wasm_extern_vec_delete(&exports); + return *this; } InstanceWrapper::operator bool() const @@ -207,19 +243,23 @@ InstanceWrapper::operator bool() const return static_cast(mod_inst); } -wasm_func_t* +FuncInfo InstanceWrapper::getFunc( std::string_view funcName, wasm_exporttype_vec_t const& export_types) const { wasm_func_t* f = nullptr; + wasm_functype_t* ft = nullptr; + + if (!mod_inst) + throw std::runtime_error("WAMR no module instance"); - if (!export_types.size) - throw std::runtime_error("WAMR: no export"); - if (export_types.size != exports.size) - throw std::runtime_error("WAMR: invalid export"); + if (!export_types.num_elems) + throw std::runtime_error("WAMR no export"); + if (export_types.num_elems != exports.num_elems) + throw std::runtime_error("WAMR invalid export"); - for (unsigned i = 0; i < export_types.size; ++i) + for (unsigned i = 0; i < export_types.num_elems; ++i) { auto const* exp_type(export_types.data[i]); @@ -231,26 +271,31 @@ InstanceWrapper::getFunc( { auto* exn(exports.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error("WAMR: invalid export"); + throw std::runtime_error("WAMR invalid export"); + ft = wasm_externtype_as_functype( + const_cast(exn_type)); f = wasm_extern_as_func(exn); break; } } } - if (!f) + if (!f || !ft) throw std::runtime_error( - "WAMR: can't find function " + std::string(funcName)); + "WAMR can't find function <" + std::string(funcName) + ">"); - return f; + return {f, ft}; } wmem InstanceWrapper::getMem() const { + if (!mod_inst) + throw std::runtime_error("WAMR no module instance"); + wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports.size; ++i) + for (unsigned i = 0; i < exports.num_elems; ++i) { auto* e(exports.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) @@ -261,17 +306,23 @@ InstanceWrapper::getMem() const } if (!mem) - throw std::runtime_error("WAMR: no memory exported"); + throw std::runtime_error("WAMR no memory exported"); return { reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; } +std::int64_t +InstanceWrapper::getGas() const +{ + return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ModulePtr -ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) +ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) { wasm_byte_vec_t const code{ wasmBin.size(), @@ -280,6 +331,11 @@ ModuleWrapper::init(wasm_store_t* s, wbytes const& wasmBin) sizeof(std::remove_reference_t::value_type), nullptr}; ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + if (!m) + { + print_wasm_error("can't create module", nullptr, j); + throw std::runtime_error("WAMR can't create module"); + } return m; } @@ -296,39 +352,23 @@ ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) *this = std::move(o); } -ModuleWrapper& -ModuleWrapper::operator=(ModuleWrapper&& o) -{ - if (this == &o) - return *this; - - module = std::move(o.module); - mod_inst = std::move(o.mod_inst); - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); - export_types = o.export_types; - o.export_types = {0, nullptr, 0, 0, nullptr}; - exec_env = o.exec_env; - o.exec_env = nullptr; - return *this; -} - ModuleWrapper::ModuleWrapper( wasm_store_t* s, - wbytes const& wasmBin, + Bytes const& wasmBin, bool instantiate, int32_t maxPages, - std::vector const& imports) - : module(init(s, wasmBin)), export_types{0, nullptr, 0, 0, nullptr} + int64_t gas, + std::vector const& imports, + beast::Journal j) + : module(init(s, wasmBin, j)) + , export_types{0, nullptr, 0, 0, nullptr} + , j_(j) { - if (!module) - throw std::runtime_error("WAMR: can't create module"); - wasm_module_exports(module.get(), &export_types); if (instantiate) { auto wimports = buildImports(s, imports); - addInstance(s, maxPages, wimports); + addInstance(s, maxPages, gas, wimports); } } @@ -338,6 +378,23 @@ ModuleWrapper::~ModuleWrapper() wasm_exporttype_vec_delete(&export_types); } +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module = std::move(o.module); + mod_inst = std::move(o.mod_inst); + if (export_types.size) + wasm_exporttype_vec_delete(&export_types); + export_types = o.export_types; + o.export_types = {0, nullptr, 0, 0, nullptr}; + j_ = o.j_; + + return *this; +} + ModuleWrapper::operator bool() const { return mod_inst; @@ -373,7 +430,7 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[i] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("Invalid import type"); + throw std::runtime_error("WAMR Invalid import type"); } } } @@ -400,7 +457,7 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[0] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("Invalid return type"); + throw std::runtime_error("WAMR Invalid return type"); } } else @@ -425,6 +482,7 @@ ModuleWrapper::buildImports( wasm_extern_vec_new(&wimports, importTypes.size, nullptr); wimports.num_elems = importTypes.num_elems; + unsigned impCnt = 0; for (unsigned i = 0; i < importTypes.num_elems; ++i) { wasm_importtype_t const* importtype = importTypes.data[i]; @@ -433,6 +491,7 @@ ModuleWrapper::buildImports( // create a placeholder wimports.data[i] = wasm_extern_new_empty( s, wasm_externtype_kind(wasm_importtype_type(importtype))); + ++impCnt; continue; } @@ -445,6 +504,7 @@ ModuleWrapper::buildImports( // if ((W_ENV != modName) && (W_HOST_LIB != modName)) // continue; + bool impSet = false; for (auto const& imp : imports) { if (imp.name != fieldName) @@ -466,14 +526,35 @@ ModuleWrapper::buildImports( nullptr); wimports.data[i] = wasm_func_as_extern(func); + ++impCnt; + impSet = true; + break; } + + if (!impSet) + { + print_wasm_error( + std::string("Import not found: ") + fieldName.data(), + nullptr, + j_); + } + } + + if (impCnt != importTypes.num_elems) + { + print_wasm_error( + std::string("Imports not finished: ") + + std::to_string(wimports.num_elems) + "/" + + std::to_string(importTypes.num_elems), + nullptr, + j_); } return wimports; } -wasm_func_t* +FuncInfo ModuleWrapper::getFunc(std::string_view funcName) const { return mod_inst.getFunc(funcName, export_types); @@ -485,15 +566,20 @@ ModuleWrapper::getMem() const return mod_inst.getMem(); } +InstanceWrapper const& +ModuleWrapper::getInstance(int) const +{ + return mod_inst; +} + int ModuleWrapper::addInstance( wasm_store_t* s, int32_t maxPages, + int64_t gas, wasm_extern_vec_t const& imports) { - mod_inst = {s, module.get(), maxPages, imports}; - exec_env = wasm_instance_exec_env(mod_inst.mod_inst.get()); - + mod_inst = {s, module.get(), maxPages, gas, imports, j_}; return 0; } @@ -507,21 +593,10 @@ ModuleWrapper::addInstance( // return i; // } -std::int64_t -ModuleWrapper::setGas(std::int64_t gas) -{ - if (exec_env) - { - wasm_runtime_set_instruction_count_limit(exec_env, gas); - return gas; - } - return 0; -} - std::int64_t ModuleWrapper::getGas() { - return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; + return mod_inst.getGas(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -545,26 +620,33 @@ WamrEngine::WamrEngine() int WamrEngine::addModule( - wbytes const& wasmCode, + Bytes const& wasmCode, bool instantiate, + int64_t gas, std::vector const& imports) { module.reset(); store.reset(); // to free the memory before creating new store store = {wasm_store_new(engine.get()), &wasm_store_delete}; module = std::make_unique( - store.get(), wasmCode, instantiate, defMaxPages, imports); - setGas(defGas); + store.get(), wasmCode, instantiate, defMaxPages, gas, imports, j_); + + if (!module) + { + print_wasm_error("can't create module wrapper", nullptr, j_); + throw std::runtime_error("WAMR can't create module wrapper"); + } + return module ? 0 : -1; } -int -WamrEngine::addInstance() -{ - return module->addInstance(store.get(), defMaxPages); -} +// int +// WamrEngine::addInstance() +// { +// return module->addInstance(store.get(), defMaxPages); +// } -wasm_func_t* +FuncInfo WamrEngine::getFunc(std::string_view funcName) { return module->getFunc(funcName); @@ -591,6 +673,16 @@ WamrEngine::convertParams(std::vector const& params) case WT_F64: v.push_back(WASM_F64_VAL(p.of.f64)); break; + case WT_U8V: { + auto const sz = p.of.u8v.sz; + auto const ptr = allocate(sz); + auto mem = getMem(); + memcpy(mem.p + ptr, p.of.u8v.d, sz); + + v.push_back(WASM_I32_VAL(ptr)); + v.push_back(WASM_I32_VAL(sz)); + } + break; default: break; } @@ -618,30 +710,37 @@ WamrEngine::add_param(std::vector& in, int64_t p) template WamrResult -WamrEngine::call(std::string_view func, Types... args) +WamrEngine::call(std::string_view func, Types&&... args) { // Lookup our export function - auto* f = getFunc(func); + auto f = getFunc(func); return call(f, std::forward(args)...); } template WamrResult -WamrEngine::call(wasm_func_t* func, Types... args) +WamrEngine::call(FuncInfo const& f, Types&&... args) { std::vector in; - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult -WamrEngine::call(wasm_func_t* func, std::vector& in) +WamrEngine::call(FuncInfo const& f, std::vector& in) { // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; WamrResult ret(NR); // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + auto const* ftp = wasm_functype_params(f.second); + if (ftp->num_elems != in.size()) + { + print_wasm_error("invalid num of params to call func", nullptr, j_); + return ret; + } + wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC : wasm_val_vec_t{ @@ -650,9 +749,12 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) in.size(), sizeof(std::remove_reference_t::value_type), nullptr}; - trap = wasm_func_call(func, &inv, &ret.r); + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); if (trap) + { + ret.f = true; print_wasm_error("failed to call func", trap, j_); + } // assert(results[0].kind == WASM_I32); // if (NR) printf("Result P5: %d\n", ret[0].of.i32); @@ -663,124 +765,136 @@ WamrEngine::call(wasm_func_t* func, std::vector& in) template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int32_t p, - Types... args) + Types&&... args) { add_param(in, p); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, - + FuncInfo const& f, std::vector& in, std::int64_t p, - Types... args) + Types&&... args) { add_param(in, p); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, uint8_t const* d, std::size_t sz, - Types... args) + Types&&... args) { - auto res = call<1>(W_ALLOC, static_cast(sz)); - - if (trap || (res.r.data[0].kind != WASM_I32)) - return {}; - auto const ptr = res.r.data[0].of.i32; - if (!ptr) - throw std::runtime_error( - "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); - + auto const ptr = allocate(sz); auto mem = getMem(); memcpy(mem.p + ptr, d, sz); add_param(in, ptr); add_param(in, static_cast(sz)); - return call(func, in, std::forward(args)...); + return call(f, in, std::forward(args)...); } template WamrResult WamrEngine::call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, - wbytes const& p, - Types... args) + Bytes const& p, + Types&&... args) { - return call(func, in, p.data(), p.size(), std::forward(args)...); + return call(f, in, p.data(), p.size(), std::forward(args)...); } -Expected +Expected, TER> WamrEngine::run( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, beast::Journal j) { + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); try { - wasm_runtime_set_log_level(getLogLevel(j.sink().threshold())); - j_ = j; - return runHlp(wasmCode, funcName, imports, params); + return runHlp(wasmCode, funcName, params, imports, hfs, gas); } - catch (std::exception const&) + catch (std::exception const& e) { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); } catch (...) { + print_wasm_error(std::string("unknown exception"), nullptr, j_); } return Unexpected(tecFAILED_PROCESSING); } -Expected +Expected, TER> WamrEngine::runHlp( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, std::vector const& imports, - std::vector const& params) + HostFunctions* hfs, + int64_t gas) { + // #ifdef DEBUG_OUTPUT + // auto& j = std::cerr; + // #else + // auto j = j_.debug(); + // #endif + // Create and instantiate the module. if (!wasmCode.empty()) { - int const m = addModule(wasmCode, true, imports); - if (m < 0) - return Unexpected(tecFAILED_PROCESSING); + [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); } - if (!module) + if (!module || !module->mod_inst) + { + print_wasm_error("no instance to run", nullptr, j_); return Unexpected(tecFAILED_PROCESSING); + } + + if (hfs) + hfs->setRT(&getRT()); // Call main - auto* f = getFunc(!funcName.empty() ? funcName : "_start"); + auto f = getFunc(!funcName.empty() ? funcName : "_start"); auto p = convertParams(params); auto res = call<1>(f, p); - if (!res.r.size || trap) + + if (res.f) + { return Unexpected(tecFAILED_PROCESSING); + } + else if (!res.r.num_elems) + { + print_wasm_error( + "<" + std::string(funcName) + "> return nothing", nullptr, j_); + return Unexpected(tecFAILED_PROCESSING); + } assert(res.r.data[0].kind == WASM_I32); - // printf("Result: %d\n", results[0].of.i32); - // return res.r.data[0].of.i32 != 0; - return res.r.data[0].of.i32; -} -std::int64_t -WamrEngine::initGas(std::int64_t def) -{ - defGas = def; - return def; + WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; + + // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + return ret; } std::int32_t @@ -790,17 +904,6 @@ WamrEngine::initMaxPages(std::int32_t def) return def; } -std::int64_t -WamrEngine::setGas(std::int64_t gas) -{ - if (module) - { - module->setGas(gas); - return gas; - } - return 0; -} - std::int64_t WamrEngine::getGas() { @@ -813,17 +916,24 @@ WamrEngine::getMem() const return module ? module->getMem() : wmem(); } +InstanceWrapper const& +WamrEngine::getRT(int m, int i) +{ + if (!module) + throw std::runtime_error("WAMR no module"); + return module->getInstance(i); +} + int32_t WamrEngine::allocate(int32_t sz) { auto res = call<1>(W_ALLOC, static_cast(sz)); - if (trap || (res.r.data[0].kind != WASM_I32)) - return {}; - auto const ptr = res.r.data[0].of.i32; - if (!ptr) + + if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || + !res.r.data[0].of.i32) throw std::runtime_error( - "WAMR: can't allocate memory, " + std::to_string(sz) + " bytes"); - return ptr; + "WAMR can't allocate memory, " + std::to_string(sz) + " bytes"); + return res.r.data[0].of.i32; } wasm_trap_t* @@ -837,4 +947,10 @@ WamrEngine::newTrap(std::string_view txt) return wasm_trap_new(store.get(), &msg); } +beast::Journal +WamrEngine::getJournal() const +{ + return j_; +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index a5b8051cb10..635673fb9b7 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,37 +20,57 @@ #include -#include - #include #include namespace ripple { -// clang-format off - struct WamrResult { wasm_val_vec_t r; - WamrResult(unsigned N = 0):r{0, nullptr, 0, 0, nullptr} {if (N) wasm_val_vec_new_uninitialized(&r, N);} - ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } - WamrResult(WamrResult const &) = delete; - WamrResult& operator=(WamrResult const &) = delete; - - WamrResult(WamrResult &&o) {*this = std::move(o);} - WamrResult& operator=(WamrResult &&o){r = o.r; o.r = {0, nullptr, 0, 0, nullptr}; return *this;} - //operator wasm_val_vec_t &() {return r;} + bool f; + WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) + { + if (N) + wasm_val_vec_new_uninitialized(&r, N); + } + ~WamrResult() + { + if (r.size) + wasm_val_vec_delete(&r); + } + WamrResult(WamrResult const&) = delete; + WamrResult& + operator=(WamrResult const&) = delete; + + WamrResult(WamrResult&& o) + { + *this = std::move(o); + } + WamrResult& + operator=(WamrResult&& o) + { + r = o.r; + o.r = {0, nullptr, 0, 0, nullptr}; + f = o.f; + o.f = false; + return *this; + } + // operator wasm_val_vec_t &() {return r;} }; using ModulePtr = std::unique_ptr; -using InstancePtr = std::unique_ptr; +using InstancePtr = + std::unique_ptr; -// clang-format on +using FuncInfo = std::pair; struct InstanceWrapper { wasm_extern_vec_t exports; InstancePtr mod_inst; + wasm_exec_env_t exec_env = nullptr; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static InstancePtr @@ -59,7 +79,8 @@ struct InstanceWrapper wasm_module_t* m, int32_t maxPages, wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + wasm_extern_vec_t const& imports, + beast::Journal j); public: InstanceWrapper(); @@ -73,31 +94,36 @@ struct InstanceWrapper wasm_store_t* s, wasm_module_t* m, int32_t maxPages, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j); ~InstanceWrapper(); operator bool() const; - wasm_func_t* + FuncInfo getFunc( std::string_view funcName, wasm_exporttype_vec_t const& export_types) const; wmem getMem() const; + + std::int64_t + getGas() const; }; struct ModuleWrapper { ModulePtr module; - wasm_exec_env_t exec_env = nullptr; InstanceWrapper mod_inst; wasm_exporttype_vec_t export_types; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static ModulePtr - init(wasm_store_t* s, wbytes const& wasmBin); + init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j); public: ModuleWrapper(); @@ -106,28 +132,31 @@ struct ModuleWrapper operator=(ModuleWrapper&& o); ModuleWrapper( wasm_store_t* s, - wbytes const& wasmBin, + Bytes const& wasmBin, bool instantiate, int32_t maxPages, - std::vector const& imports = {}); + int64_t gas, + std::vector const& imports, + beast::Journal j); ~ModuleWrapper(); operator bool() const; - wasm_func_t* + FuncInfo getFunc(std::string_view funcName) const; wmem getMem() const; + InstanceWrapper const& + getInstance(int i = 0) const; + int addInstance( wasm_store_t* s, int32_t maxPages, + int64_t gas, wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); - std::int64_t - setGas(std::int64_t gas); - std::int64_t getGas(); @@ -145,8 +174,6 @@ class WamrEngine std::unique_ptr engine; std::unique_ptr store; std::unique_ptr module; - wasm_trap_t* trap = nullptr; - std::int64_t defGas = -1; std::int32_t defMaxPages = -1; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); @@ -154,19 +181,15 @@ class WamrEngine WamrEngine(); ~WamrEngine() = default; - Expected - run(wbytes const& wasmCode, + Expected, TER> + run(Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, beast::Journal j); - std::int64_t - initGas(std::int64_t def); - - std::int64_t - setGas(std::int64_t gas); - std::int32_t initMaxPages(std::int32_t def); @@ -174,41 +197,51 @@ class WamrEngine getGas(); // Host functions helper functionality + wasm_trap_t* + newTrap(std::string_view msg); + + beast::Journal + getJournal() const; + +private: + InstanceWrapper const& + getRT(int m = 0, int i = 0); + wmem getMem() const; int32_t allocate(int32_t size); - wasm_trap_t* - newTrap(std::string_view msg); - -private: - Expected + Expected, TER> runHlp( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, std::vector const& imports, - std::vector const& params); + HostFunctions* hfs, + int64_t gas); int addModule( - wbytes const& wasmCode, + Bytes const& wasmCode, bool instantiate, + int64_t gas, std::vector const& imports); void clearModules(); - int - addInstance(); + + // int addInstance(); + int32_t runFunc(std::string_view const funcName, int32_t p); int32_t makeModule( - wbytes const& wasmCode, + Bytes const& wasmCode, wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); - wasm_func_t* + FuncInfo getFunc(std::string_view funcName); std::vector @@ -221,48 +254,48 @@ class WamrEngine template inline WamrResult - call(std::string_view func, Types... args); + call(std::string_view func, Types&&... args); template inline WamrResult - call(wasm_func_t* func, Types... args); + call(FuncInfo const& f, Types&&... args); template inline WamrResult - call(wasm_func_t* f, std::vector& in); + call(FuncInfo const& f, std::vector& in); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int32_t p, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, std::int64_t p, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, uint8_t const* d, std::size_t sz, - Types... args); + Types&&... args); template inline WamrResult call( - wasm_func_t* func, + FuncInfo const& f, std::vector& in, - wbytes const& p, - Types... args); + Bytes const& p, + Types&&... args); }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h new file mode 100644 index 00000000000..1d1f4d011be --- /dev/null +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -0,0 +1,224 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +#include +#include +#include +#include +#include + +namespace ripple { + +int32_t const HF_ERR_INTERNAL = -1; +int32_t const HF_ERR_FIELD_NOT_FOUND = -2; +int32_t const HF_ERR_BUFFER_TOO_SMALL = -3; +int32_t const HF_ERR_NO_ARRAY = -4; +int32_t const HF_ERR_NOT_LEAF_FIELD = -5; +int32_t const HF_ERR_LOCATOR_MALFORMED = -6; +int32_t const HF_ERR_SLOT_OUT_RANGE = -7; +int32_t const HF_ERR_SLOTS_FULL = -8; +int32_t const HF_ERR_INVALID_SLOT = -9; +int32_t const HF_ERR_LEDGER_OBJ_NOT_FOUND = -10; +int32_t const HF_ERR_DECODING = -11; +int32_t const HF_ERR_DATA_FIELD_TOO_LARGE = -12; +int32_t const HF_ERR_OUT_OF_BOUNDS = -13; +int32_t const HF_ERR_NO_MEM_EXPORTED = -14; +int32_t const HF_ERR_INVALID_PARAMS = -15; +int32_t const HF_ERR_INVALID_ACCOUNT = -16; + +struct HostFunctions +{ + virtual void + setRT(void const*) + { + } + + virtual void const* + getRT() const + { + return nullptr; + } + + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + + virtual int32_t + getLedgerSqn() + { + return 1; + } + + virtual int32_t + getParentLedgerTime() + { + return 1; + } + + virtual Hash + getParentLedgerHash() + { + return {}; + } + + virtual int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) + { + return HF_ERR_INTERNAL; + } + + virtual Expected + getTxField(SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getCurrentLedgerObjField(SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getTxNestedField(Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getCurrentLedgerObjNestedField(Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual int32_t + getTxArrayLen(SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getCurrentLedgerObjArrayLen(SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getTxNestedArrayLen(Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + updateData(Bytes const& data) + { + return HF_ERR_INTERNAL; + } + + virtual Hash + computeSha512HalfHash(Bytes const& data) + { + return Hash{}; + } + + virtual Expected + accountKeylet(AccountID const& account) + { + return Bytes{}; + } + + virtual Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual Expected + getNFT(AccountID const& account, uint256 const& nftId) + { + return Unexpected(HF_ERR_INTERNAL); + } + + virtual int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) + { + return HF_ERR_INTERNAL; + } + + virtual int32_t + traceNum(std::string const& msg, int64_t data) + { + return HF_ERR_INTERNAL; + } + + virtual ~HostFunctions() = default; +}; + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6450647809b..1da8c38a2d6 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -20,8 +20,14 @@ #include #include +#include #include +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif + namespace ripple { int32_t @@ -36,198 +42,455 @@ WasmHostFunctionsImpl::getParentLedgerTime() return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try } -// TODO remove json code after deciding encoding scheme +Hash +WasmHostFunctionsImpl::getParentLedgerHash() +{ + return ctx.view().info().parentHash; +} -std::optional -WasmHostFunctionsImpl::getTxField(std::string const& fname) +int32_t +WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) { - auto js = ctx.tx.getJson(JsonOptions::none); - if (js.isMember(fname)) + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cacheIdx) { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; } else - return std::nullopt; + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return HF_ERR_SLOTS_FULL; + + cache[cacheIdx] = ctx.view().read(keylet); + return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; +} + +Bytes +getAnyFieldData(STBase const& obj) +{ + // auto const& fname = obj.getFName(); + if (STI_ACCOUNT == obj.getSType()) + { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_AMOUNT == obj.getSType()) + { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + else if (STI_VL == obj.getSType()) + { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_UINT256 == obj.getSType()) + { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + else if (STI_UINT32 == obj.getSType()) + { + auto const& super(static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); +} + +Expected +WasmHostFunctionsImpl::getTxField(SField const& fname) +{ + auto const* field = ctx.tx.peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) +{ + auto const sle = ctx.view().read(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + return Unexpected(HF_ERR_INVALID_SLOT); + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + return getAnyFieldData(*field); } -std::optional -WasmHostFunctionsImpl::getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) +static Expected +locateField(STObject const* obj, Slice const& loc) { - auto kl = [&]() -> std::optional { - if (type == ltACCOUNT_ROOT) + if (loc.size() % 4) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + for (int i = 0; i < sz; ++i) + { + int32_t const c = l[i]; + + if (!field) + { + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + auto const& fname(*it->second); + + field = obj->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + else if (STI_ARRAY == field->getSType()) { - std::string s(kdata.begin(), kdata.end()); - auto const account = parseBase58(s); - if (account) - { - return keylet::account(account.value()); - } + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + field = &(arr->operator[](c)); } - return std::nullopt; - }(); + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); - if (!kl || !ctx.view().exists(kl.value())) - return std::nullopt; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + auto const& fname(*it->second); - auto js = ctx.view().read(kl.value())->getJson(JsonOptions::none); - if (js.isMember(fname)) - { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; + field = o->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } } - else - return std::nullopt; + + if (!field || (STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + return field; } -std::optional -WasmHostFunctionsImpl::getCurrentLedgerEntryField(std::string const& fname) +Expected +WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { - if (!ctx.view().exists(leKey)) - return std::nullopt; + auto const r = locateField(&ctx.tx, locator); + if (!r.has_value()) + return Unexpected(r.error()); - auto js = ctx.view().read(leKey)->getJson(JsonOptions::none); - if (js.isMember(fname)) - { - auto s = js.get(fname, Json::Value::null).asString(); - return Bytes{s.begin(), s.end()}; - } - else - return std::nullopt; + auto const* field = r.value(); + return getAnyFieldData(*field); } -std::optional -WasmHostFunctionsImpl::getNFT( - std::string const& account, - std::string const& nftId) +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } + auto const sle = ctx.view().read(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - uint256 nftHash; - if (!nftHash.parseHex(nftId)) - { - return std::nullopt; - } + auto const r = locateField(sle.get(), locator); + if (!r.has_value()) + return Unexpected(r.error()); - auto jv = nft::findToken(ctx.view(), accountId.value(), nftHash); - if (!jv) - { - return std::nullopt; - } + auto const* field = r.value(); + return getAnyFieldData(*field); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedField( + int32_t cacheIdx, + Slice const& locator) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + return Unexpected(HF_ERR_INVALID_SLOT); + + auto const r = locateField(cache[cacheIdx].get(), locator); + if (!r.has_value()) + return Unexpected(r.error()); + + auto const* field = r.value(); + return getAnyFieldData(*field); +} + +int32_t +WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const* field = ctx.tx.peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); - Slice const s = (*jv)[sfURI]; - return Bytes{s.begin(), s.end()}; + return sz; } -bool +int32_t +WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const sle = ctx.view().read(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + auto const* field = sle->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getLedgerObjArrayLen( + int32_t cacheIdx, + SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + return HF_ERR_INVALID_SLOT; + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) +{ + auto const r = locateField(&ctx.tx, locator); + if (!r.has_value()) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) +{ + auto const sle = ctx.view().read(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + auto const r = locateField(sle.get(), locator); + if (!r.has_value()) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( + int32_t cacheIdx, + Slice const& locator) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + return HF_ERR_INVALID_SLOT; + + auto const r = locateField(cache[cacheIdx].get(), locator); + if (!r.has_value()) + return r.error(); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +int32_t WasmHostFunctionsImpl::updateData(Bytes const& data) { - if (!ctx.view().exists(leKey)) - return false; auto sle = ctx.view().peek(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; sle->setFieldVL(sfData, data); ctx.view().update(sle); - return true; + return 0; } Hash WasmHostFunctionsImpl::computeSha512HalfHash(Bytes const& data) { auto const hash = sha512Half(data); - return uint256::fromVoid(hash.data()); + return hash; } -std::optional -WasmHostFunctionsImpl::accountKeylet(std::string const& account) +Expected +WasmHostFunctionsImpl::accountKeylet(AccountID const& account) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } - - auto keylet = keylet::account(*accountId).key; - if (!keylet) - { - return std::nullopt; - } - - return Bytes{keylet.begin(), keylet.end()}; + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; } -std::optional +Expected WasmHostFunctionsImpl::credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) { - auto const subjectId = parseBase58(subject); - if (!subjectId || subjectId->isZero()) - { - return std::nullopt; - } + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HF_ERR_INVALID_PARAMS); - auto const issuerId = parseBase58(issuer); - if (!issuerId || issuerId->isZero()) - { - return std::nullopt; - } + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); - auto keylet = - keylet::credential(*subjectId, *issuerId, makeSlice(credentialType)) - .key; - if (!keylet) - { - return std::nullopt; - } + return Bytes{keylet.key.begin(), keylet.key.end()}; +} - return Bytes{keylet.begin(), keylet.end()}; +Expected +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; } -std::optional -WasmHostFunctionsImpl::escrowKeylet( - std::string const& account, - std::uint32_t const& seq) +Expected +WasmHostFunctionsImpl::oracleKeylet( + AccountID const& account, + std::uint32_t documentId) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) - { - return std::nullopt; - } + if (!account || account.isZero()) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} - auto keylet = keylet::escrow(*accountId, seq).key; - if (!keylet) - { - return std::nullopt; - } +Expected +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +{ + if (!account || !nftId) + return Unexpected(HF_ERR_INVALID_PARAMS); - return Bytes{keylet.begin(), keylet.end()}; + auto obj = nft::findToken(ctx.view(), account, nftId); + if (!obj) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + Slice const s = obj->at(sfURI); + return Bytes(s.begin(), s.end()); } -std::optional -WasmHostFunctionsImpl::oracleKeylet( - std::string const& account, - std::uint32_t const& documentId) +int32_t +WasmHostFunctionsImpl::trace( + std::string const& msg, + Bytes const& data, + bool asHex) { - auto const accountId = parseBase58(account); - if (!accountId || accountId->isZero()) +#ifdef DEBUG_OUTPUT + auto j = ctx.journal.error(); +#else + auto j = ctx.journal.trace(); +#endif + j << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else { - return std::nullopt; + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << hex; } - auto keylet = keylet::oracle(*accountId, documentId).key; - if (!keylet) - { - return std::nullopt; - } + return msg.size() + data.size() * (asHex ? 2 : 1); +} + +int32_t +WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) +{ +#ifdef DEBUG_OUTPUT + auto j = ctx.journal.error(); +#else + auto j = ctx.journal.trace(); +#endif - return Bytes{keylet.begin(), keylet.end()}; + j << msg << data; + + return msg.size() + sizeof(data); } + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index b87c23a4a85..091ca249345 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -19,22 +19,38 @@ #pragma once -#include +#include #include -#include -#include -#include - namespace ripple { class WasmHostFunctionsImpl : public HostFunctions { + ApplyContext& ctx; + Keylet leKey; + + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + + void const* rt_ = nullptr; + public: - WasmHostFunctionsImpl(ApplyContext& ctx, Keylet leKey) + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) : ctx(ctx), leKey(leKey) { } + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + beast::Journal getJournal() override { @@ -47,46 +63,77 @@ class WasmHostFunctionsImpl : public HostFunctions int32_t getParentLedgerTime() override; - std::optional - getTxField(std::string const& fname) override; + Hash + getParentLedgerHash() override; + + int32_t + cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override; - std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) override; + Expected + getTxField(SField const& fname) override; - std::optional - getCurrentLedgerEntryField(std::string const& fname) override; + Expected + getCurrentLedgerObjField(SField const& fname) override; - std::optional - getNFT(std::string const& account, std::string const& nftId) override; + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override; - bool + Expected + getTxNestedField(Slice const& locator) override; + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override; + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; + + int32_t + getTxArrayLen(SField const& fname) override; + + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override; + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; + + int32_t + getTxNestedArrayLen(Slice const& locator) override; + + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; + + int32_t updateData(Bytes const& data) override; Hash computeSha512HalfHash(Bytes const& data) override; - std::optional - accountKeylet(std::string const& account) override; + Expected + accountKeylet(AccountID const& account) override; - std::optional + Expected credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) override; + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override; - std::optional - escrowKeylet(std::string const& account, std::uint32_t const& seq) override; + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override; - std::optional - oracleKeylet(std::string const& account, std::uint32_t const& documentId) - override; + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override; -private: - ApplyContext& ctx; - Keylet leKey; + Expected + getNFT(AccountID const& account, uint256 const& nftId) override; + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override; + + int32_t + traceNum(std::string const& msg, int64_t data) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 543350a7c12..e4196263d65 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -17,6 +17,8 @@ */ //============================================================================== +#include +#include #include #include @@ -24,6 +26,83 @@ namespace ripple { +static int32_t +setData( + InstanceWrapper const* rt, + int32_t dst, + int32_t dsz, + uint8_t const* src, + int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + + if (!mem.s) + return HF_ERR_NO_MEM_EXPORTED; + if (dst + dsz > mem.s) + return HF_ERR_OUT_OF_BOUNDS; + if (ssz > dsz) + return HF_ERR_BUFFER_TOO_SMALL; + + memcpy(mem.p + dst, src, ssz); + + return ssz; +} + +static Expected +getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + if (!mem.s) + return Unexpected(HF_ERR_NO_MEM_EXPORTED); + + if (src + ssz > mem.s) + return Unexpected(HF_ERR_OUT_OF_BOUNDS); + + Bytes data(mem.p + src, mem.p + src + ssz); + return data; +} + +static Expected +getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) +{ + auto const r = getData(rt, ptr, sz); + if (r->size() < AccountID::bytes) + return Unexpected(HF_ERR_INVALID_PARAMS); + + return AccountID::fromVoid(r->data()); +} + +static Expected +getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) +{ + auto mem = rt ? rt->getMem() : wmem(); + if (!mem.s) + return Unexpected(HF_ERR_NO_MEM_EXPORTED); + + if (src + ssz > mem.s) + return Unexpected(HF_ERR_OUT_OF_BOUNDS); + + std::string data(mem.p + src, mem.p + src + ssz); + return data; +} + +#define RET(x) \ + results->data[0] = WASM_I32_VAL(x); \ + results->num_elems = 1; \ + return nullptr; + +wasm_trap_t* +getLedgerSqnOld_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); + int32_t const sqn = hf->getLedgerSqn(); + RET(sqn); +} + wasm_trap_t* getLedgerSqn_wrap( void* env, @@ -31,10 +110,15 @@ getLedgerSqn_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); int32_t const sqn = hf->getLedgerSqn(); - results->data[0] = WASM_I32_VAL(sqn); - return nullptr; + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + reinterpret_cast(&sqn), + static_cast(sizeof(sqn)))); } wasm_trap_t* @@ -44,349 +128,622 @@ getParentLedgerTime_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); int32_t const ltime = hf->getParentLedgerTime(); - results->data[0] = WASM_I32_VAL(ltime); - return nullptr; + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + reinterpret_cast(<ime), + static_cast(sizeof(ltime)))); } -static Expected -getParameterData(wasm_val_vec_t const* params, size_t index) +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - auto fnameOffset = params->data[index].of.i32; - auto fnameLen = params->data[index + 1].of.i32; - auto mem = vm.getMem(); - if (!mem.s) - return Unexpected("No memory exported"); - - if (mem.s <= fnameOffset + fnameLen) - return Unexpected("Memory access failed"); - Bytes fname(mem.p + fnameOffset, mem.p + fnameOffset + fnameLen); - return fname; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + Hash const hash = hf->getParentLedgerHash(); + RET(setData( + rt, + params->data[0].of.i32, + params->data[1].of.i32, + hash.data(), + static_cast(hash.size()))); } -static Expected -getFieldName(wasm_val_vec_t const* params, size_t index) +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto const dataRes = getParameterData(params, index); - if (dataRes) + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) { - return std::string(dataRes->begin(), dataRes->end()); + RET(r.error()); } - else + + if (r->size() < uint256::bytes) { - auto& vm = WasmEngine::instance(); - return Unexpected( - reinterpret_cast(vm.newTrap(dataRes.error()))); + RET(HF_ERR_INVALID_PARAMS); } + + uint256 const key(uint256::fromVoid(r->data())); + int32_t const idx = + hf->cacheLedgerObj(keylet::unchecked(key), params->data[2].of.i32); + RET(idx); } -static Expected -setData(Bytes const& data) +wasm_trap_t* +getTxField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - auto mem = vm.getMem(); - if (!mem.s) - return Unexpected("No memory exported"); - - int32_t const dataLen = static_cast(data.size()); - int32_t const dataPtr = vm.allocate(dataLen); - if (!dataPtr) - return Unexpected("Allocation error"); - memcpy(mem.p + dataPtr, data.data(), dataLen); - - auto retPtr = vm.allocate(8); - if (!retPtr) - return Unexpected("Allocation error"); - int32_t* retData = reinterpret_cast(mem.p + retPtr); - retData[0] = dataPtr; - retData[1] = dataLen; - - return retPtr; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + auto fieldData = hf->getTxField(fname); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getTxField_wrap( +getCurrentLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - auto fieldData = hf->getTxField(fname.value()); + auto fieldData = hf->getCurrentLedgerObjField(fname); if (!fieldData) - return reinterpret_cast(vm.newTrap("Field not found")); + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[1].of.i32, + params->data[2].of.i32, + fieldData->data(), + fieldData->size())); +} - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[1].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getLedgerEntryField_wrap( +getTxNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } + + auto fieldData = hf->getTxNestedField(makeSlice(r.value())); + if (!fieldData) + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); +} - int32_t const type = params->data[0].of.i32; - auto lkData = getParameterData(params, 1); - if (!lkData) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getCurrentLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 3); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto fieldData = - hf->getLedgerEntryField(type, lkData.value(), fname.value()); + auto fieldData = hf->getCurrentLedgerObjNestedField(makeSlice(r.value())); if (!fieldData) - return reinterpret_cast(vm.newTrap()); - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + { + RET(fieldData.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + fieldData->data(), + fieldData->size())); } wasm_trap_t* -getCurrentLedgerEntryField_wrap( +getLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getFieldName(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); + if (!r) + { + RET(r.error()); + } - auto fieldData = hf->getCurrentLedgerEntryField(fname.value()); + auto fieldData = hf->getLedgerObjNestedField( + params->data[0].of.i32, makeSlice(r.value())); if (!fieldData) - return reinterpret_cast(vm.newTrap()); + { + RET(fieldData.error()); + } + + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + fieldData->data(), + fieldData->size())); +} - auto pointer = setData(fieldData.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getTxArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)fieldData.value().size()); - return nullptr; + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); + + int32_t sz = hf->getTxArrayLen(fname); + RET(sz); } wasm_trap_t* -getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + // auto const* rt = reinterpret_cast(hf->getRT()); + + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[0].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - auto nftId = getFieldName(params, 2); - if (!nftId) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getCurrentLedgerObjArrayLen(fname); + RET(sz); +} - auto nftURI = hf->getNFT(account.value(), nftId.value()); - if (!nftURI) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + // auto const* rt = reinterpret_cast(hf->getRT()); - auto pointer = setData(nftURI.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[1].of.i32); + if (it == m.end()) + { + RET(HF_ERR_FIELD_NOT_FOUND); + } + auto const& fname(*it->second); - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); + RET(sz); } wasm_trap_t* -accountKeylet_wrap( +getTxNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getTxNestedArrayLen(makeSlice(r.value())); + RET(sz); +} - auto keylet = hf->accountKeylet(account.value()); - if (!keylet) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + int32_t sz = hf->getCurrentLedgerObjNestedArrayLen(makeSlice(r.value())); + RET(sz); } wasm_trap_t* -credentialKeylet_wrap( +getLedgerObjNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto subject = getFieldName(params, 0); - if (!subject) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); + if (!r) + { + RET(r.error()); + } - auto issuer = getFieldName(params, 2); - if (!issuer) - return reinterpret_cast(vm.newTrap()); + int32_t sz = hf->getLedgerObjNestedArrayLen( + params->data[0].of.i32, makeSlice(r.value())); + RET(sz); +} - auto credentialType = getFieldName(params, 4); - if (!credentialType) - return reinterpret_cast(vm.newTrap()); +wasm_trap_t* +updateData_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto keylet = hf->credentialKeylet( - subject.value(), issuer.value(), credentialType.value()); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE) + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(hf->updateData(r.value())); } wasm_trap_t* -escrowKeylet_wrap( +computeSha512HalfHash_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!r) + { + RET(r.error()); + } - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + auto const hash = hf->computeSha512HalfHash(r.value()); + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + hash.data(), + hash.size())); +} - int32_t const sequence = params->data[2].of.i32; +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto keylet = hf->escrowKeylet(account.value(), sequence); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->accountKeylet(acc.value()); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(setData( + rt, + params->data[2].of.i32, + params->data[3].of.i32, + k->data(), + k->size())); } wasm_trap_t* -oracleKeylet_wrap( +credentialKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto account = getFieldName(params, 0); - if (!account) - return reinterpret_cast(vm.newTrap()); + auto const subject = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!subject) + { + RET(subject.error()); + } - auto documentId = params->data[2].of.i32; + auto const issuer = + getDataAccount(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!issuer) + { + RET(issuer.error()); + } - auto keylet = hf->escrowKeylet(account.value(), documentId); - if (!keylet) - return reinterpret_cast(vm.newTrap()); + auto const credType = + getData(rt, params->data[4].of.i32, params->data[5].of.i32); + if (!credType) + { + RET(credType.error()); + } - auto pointer = setData(keylet.value()); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = + hf->credentialKeylet(subject.value(), issuer.value(), credType.value()); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32((int)nftURI.value().size()); - return nullptr; + RET(setData( + rt, + params->data[6].of.i32, + params->data[7].of.i32, + k->data(), + k->size())); } wasm_trap_t* -updateData_wrap( +escrowKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getParameterData(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - if (!hf->updateData(fname.value())) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->escrowKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } - return nullptr; + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); } wasm_trap_t* -computeSha512HalfHash_wrap( +oracleKeylet_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); - auto fname = getParameterData(params, 0); - if (!fname) - return reinterpret_cast(vm.newTrap()); + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } - auto hres = hf->computeSha512HalfHash(fname.value()); - Bytes digest{hres.begin(), hres.end()}; - auto pointer = setData(digest); - if (!pointer) - return reinterpret_cast(vm.newTrap()); + auto const k = hf->oracleKeylet(acc.value(), params->data[2].of.i32); + if (!k) + { + RET(k.error()); + } - results->data[0] = WASM_I32_VAL(pointer.value()); - // out[1] = WasmEdge_ValueGenI32(32); - return nullptr; + RET(setData( + rt, + params->data[3].of.i32, + params->data[4].of.i32, + k->data(), + k->size())); } wasm_trap_t* -print_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto& vm = WasmEngine::instance(); - // auto* hf = reinterpret_cast(env); - - auto f = getParameterData(params, 0); - if (!f) - return reinterpret_cast(vm.newTrap()); - std::string s(f->begin(), f->end()); - if (s.size() < 4096) - std::cout << s << std::endl; - return nullptr; + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const acc = + getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!acc) + { + RET(acc.error()); + } + + auto const nftRaw = + getData(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!nftRaw) + { + RET(nftRaw.error()); + } + + if (nftRaw->size() < uint256::bytes * 2) + { + RET(HF_ERR_INVALID_PARAMS); + } + + uint256 const ntfId(uint256::fromVoid(nftRaw->data())); + auto const nftURI = hf->getNFT(acc.value(), ntfId); + if (!nftURI) + { + RET(nftURI.error()); + } + + RET(setData( + rt, + params->data[4].of.i32, + params->data[5].of.i32, + nftURI->data(), + nftURI->size())); +} + +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const msg = + getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!msg) + { + RET(msg.error()); + } + + auto const data = + getData(rt, params->data[2].of.i32, params->data[3].of.i32); + if (!data) + { + RET(data.error()); + } + + auto const e = hf->trace(msg.value(), data.value(), params->data[4].of.i32); + RET(e); +} + +wasm_trap_t* +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + + auto const msg = + getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + if (!msg) + { + RET(msg.error()); + } + + auto const e = hf->traceNum(msg.value(), params->data[2].of.i64); + RET(e); } } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index d63db3d5057..ac0cb88e497 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -23,91 +23,200 @@ namespace ripple { -using getLedgerSqn_proto = int32_t(); +using getLedgerSqnOld_proto = int32_t(); +wasm_trap_t* +getLedgerSqnOld_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getLedgerSqn_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getParentLedgerTime_proto = int32_t(); +using getParentLedgerTime_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getParentLedgerTime_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getTxField_proto = uint32_t*(char const*, int32_t); +using getParentLedgerHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* getTxField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getLedgerEntryField_proto = - uint32_t*(int32_t, uint8_t const*, int32_t, char const*, int32_t); +using getCurrentLedgerObjField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* -getLedgerEntryField_wrap( +getCurrentLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getCurrentLedgerEntryField_proto = uint32_t*(char const*, int32_t); +using getLedgerObjField_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* -getCurrentLedgerEntryField_wrap( +getLedgerObjField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getNFT_proto = uint32_t*(char const*, int32_t, char const*, int32_t); +using getTxNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +getTxNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); -using accountKeylet_proto = uint32_t*(char const*, int32_t); +using getCurrentLedgerObjNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -accountKeylet_wrap( +getCurrentLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using credentialKeylet_proto = - uint32_t*(char const*, int32_t, char const*, int32_t, char const*, int32_t); +using getLedgerObjNestedField_proto = + int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -credentialKeylet_wrap( +getLedgerObjNestedField_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using escrowKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +using getTxArrayLen_proto = int32_t(int32_t); wasm_trap_t* -escrowKeylet_wrap( +getTxArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using oracleKeylet_proto = uint32_t*(char const*, int32_t, int32_t); +using getCurrentLedgerObjArrayLen_proto = int32_t(int32_t); wasm_trap_t* -oracleKeylet_wrap( +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjArrayLen_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxNestedArrayLen_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getTxNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjNestedArrayLen_proto = + int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using updateData_proto = void(uint8_t const*, int32_t); +using getLedgerObjNestedArrayLen_proto = + int32_t(int32_t, uint8_t const*, int32_t); +wasm_trap_t* +getLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using updateData_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* updateData_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using computeSha512HalfHash_proto = uint32_t*(uint8_t const*, int32_t); +using computeSha512HalfHash_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* computeSha512HalfHash_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using print_proto = void(char const*, int32_t); +using accountKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFT_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using trace_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* -print_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); } // namespace ripple diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h new file mode 100644 index 00000000000..af2db08ebc1 --- /dev/null +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -0,0 +1,269 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace bft = boost::function_types; + +namespace ripple { + +using Bytes = std::vector; +using Hash = ripple::uint256; + +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + +template +struct WasmResult +{ + T result; + int64_t cost; +}; +typedef WasmResult EscrowResult; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64, WT_U8V }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +#define WASM_IMPORT_FUNC2(v, f, n, ...) \ + WasmImpFunc( \ + v, n, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParamVec +{ + std::uint8_t const* d = nullptr; + std::int32_t sz = 0; +}; + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + WasmParamVec u8v; + } of; +}; + +template +inline void +wasmParamsHlp(std::vector& v, std::int32_t p, Types&&... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, float p, Types&&... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, double p, Types&&... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::uint8_t const* dt, + std::int32_t sz, + Types&&... args) +{ + v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) +{ + wasmParamsHlp( + v, + p.data(), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::string_view const& p, + Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.data()), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.c_str()), + static_cast(p.size()), + std::forward(args)...); +} + +inline void +wasmParamsHlp(std::vector& v) +{ + return; +} + +template +inline std::vector +wasmParams(Types&&... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + wasmParamsHlp(v, std::forward(args)...); + return v; +} + +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 8e77bc027b9..dbfcfe549c0 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -18,8 +18,10 @@ //============================================================================== #include +#include #include +#include #include #include @@ -31,32 +33,88 @@ Expected runEscrowWasm( Bytes const& wasmCode, std::string_view funcName, + std::vector const& params, HostFunctions* hfs, - uint64_t gasLimit) + int64_t gasLimit, + beast::Journal j) { // create VM and set cost limit auto& vm = WasmEngine::instance(); - vm.initGas(gasLimit); vm.initMaxPages(MAX_PAGES); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, hfs) - WASM_IMPORT_FUNC(imports, getParentLedgerTime, hfs) - WASM_IMPORT_FUNC(imports, getTxField, hfs) - WASM_IMPORT_FUNC(imports, getLedgerEntryField, hfs) - WASM_IMPORT_FUNC(imports, getCurrentLedgerEntryField, hfs) - WASM_IMPORT_FUNC(imports, getNFT, hfs) - WASM_IMPORT_FUNC(imports, accountKeylet, hfs) - WASM_IMPORT_FUNC(imports, credentialKeylet, hfs) - WASM_IMPORT_FUNC(imports, escrowKeylet, hfs) - WASM_IMPORT_FUNC(imports, oracleKeylet, hfs) - WASM_IMPORT_FUNC(imports, updateData, hfs) - WASM_IMPORT_FUNC(imports, computeSha512HalfHash, hfs) - WASM_IMPORT_FUNC(imports, print, hfs) - - std::int64_t const sgas = gasLimit; // vm.getGas(); - auto ret = vm.run(wasmCode, funcName, imports, {}, hfs->getJournal()); + if (hfs) + { + // TODO: remove after escrow_test wasm module will be updated + WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); + + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", hfs); + WASM_IMPORT_FUNC2( + imports, getParentLedgerTime, "get_parent_ledger_time", hfs); + WASM_IMPORT_FUNC2( + imports, getParentLedgerHash, "get_parent_ledger_hash", hfs); + WASM_IMPORT_FUNC2(imports, cacheLedgerObj, "cache_ledger_obj", hfs); + WASM_IMPORT_FUNC2(imports, getTxField, "get_tx_field", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjField, + "get_current_ledger_obj_field", + hfs); + WASM_IMPORT_FUNC2( + imports, getLedgerObjField, "get_ledger_obj_field", hfs); + WASM_IMPORT_FUNC2( + imports, getTxNestedField, "get_tx_nested_field", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjNestedField, + "get_current_ledger_obj_nested_field", + hfs); + WASM_IMPORT_FUNC2( + imports, + getLedgerObjNestedField, + "get_ledger_obj_nested_field", + hfs); + WASM_IMPORT_FUNC2(imports, getTxArrayLen, "get_tx_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjArrayLen, + "get_current_ledger_obj_array_len", + hfs); + WASM_IMPORT_FUNC2( + imports, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, getTxNestedArrayLen, "get_tx_nested_array_len", hfs); + WASM_IMPORT_FUNC2( + imports, + getCurrentLedgerObjNestedArrayLen, + "get_current_ledger_obj_nested_array_len", + hfs); + WASM_IMPORT_FUNC2( + imports, + getLedgerObjNestedArrayLen, + "get_ledger_obj_nested_array_len", + hfs); + WASM_IMPORT_FUNC2(imports, updateData, "update_data", hfs); + WASM_IMPORT_FUNC2( + imports, computeSha512HalfHash, "compute_sha512_half", hfs); + WASM_IMPORT_FUNC2(imports, accountKeylet, "account_keylet", hfs); + WASM_IMPORT_FUNC2(imports, credentialKeylet, "credential_keylet", hfs); + WASM_IMPORT_FUNC2(imports, escrowKeylet, "escrow_keylet", hfs); + WASM_IMPORT_FUNC2(imports, oracleKeylet, "oracle_keylet", hfs); + WASM_IMPORT_FUNC2(imports, getNFT, "get_NFT", hfs); + WASM_IMPORT_FUNC(imports, trace, hfs); + WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); + } + + auto ret = vm.run( + wasmCode, + funcName, + params, + imports, + hfs, + gasLimit, + hfs ? hfs->getJournal() : j); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -66,12 +124,10 @@ runEscrowWasm( // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } - std::int64_t const egas = vm.getGas(); - std::uint64_t const spent = static_cast(sgas - egas); - // std::cout << ", ret: " << ret.value() << ", gas spent: " << spent + // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost // << std::endl; - return EscrowResult{static_cast(ret.value()), spent}; + return EscrowResult{ret->result > 0, ret->cost}; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -87,21 +143,17 @@ WasmEngine::instance() return e; } -Expected +Expected, TER> WasmEngine::run( - wbytes const& wasmCode, + Bytes const& wasmCode, std::string_view funcName, - std::vector const& imports, std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gasLimit, beast::Journal j) { - return impl->run(wasmCode, funcName, imports, params, j); -} - -std::int64_t -WasmEngine::initGas(std::int64_t def) -{ - return impl->initGas(def); + return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); } std::int32_t @@ -110,35 +162,16 @@ WasmEngine::initMaxPages(std::int32_t def) return impl->initMaxPages(def); } -// gas = 1'000'000'000LL -std::int64_t -WasmEngine::setGas(std::int64_t gas) -{ - return impl->setGas(gas); -} - -std::int64_t -WasmEngine::getGas() -{ - return impl->getGas(); -} - -wmem -WasmEngine::getMem() const -{ - return impl->getMem(); -} - -int32_t -WasmEngine::allocate(int32_t size) -{ - return impl->allocate(size); -} - void* WasmEngine::newTrap(std::string_view msg) { return impl->newTrap(msg); } +beast::Journal +WasmEngine::getJournal() const +{ + return impl->getJournal(); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 74e700883df..b12d7ecc7ef 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -18,22 +18,10 @@ //============================================================================== #pragma once -#include -#include -#include -#include - -#include -#include -#include -#include - -// #include +#include #include -namespace bft = boost::function_types; - namespace ripple { static std::string_view const W_ENV = "env"; @@ -46,273 +34,8 @@ static std::string_view const W_ALLOC = "allocate"; static std::string_view const W_DEALLOC = "deallocate"; static std::string_view const W_PROC_EXIT = "proc_exit"; -using wbytes = std::vector; -struct wmem -{ - std::uint8_t* p = nullptr; - std::size_t s = 0; -}; - uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 -typedef std::vector Bytes; -typedef ripple::uint256 Hash; - -template -struct WasmResult -{ - T result; - uint64_t cost; -}; -typedef WasmResult EscrowResult; - -struct HostFunctions -{ - virtual beast::Journal - getJournal() - { - return beast::Journal{beast::Journal::getNullSink()}; - } - - virtual int32_t - getLedgerSqn() - { - return 1; - } - - virtual int32_t - getParentLedgerTime() - { - return 1; - } - - virtual std::optional - getTxField(std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getLedgerEntryField( - int32_t type, - Bytes const& kdata, - std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getCurrentLedgerEntryField(std::string const& fname) - { - return Bytes{}; - } - - virtual std::optional - getNFT(std::string const& account, std::string const& nftId) - { - return Bytes{}; - } - - virtual bool - updateData(Bytes const& data) - { - return true; - } - - virtual Hash - computeSha512HalfHash(Bytes const& data) - { - return Hash{}; - } - - virtual std::optional - accountKeylet(std::string const& account) - { - return Bytes{}; - } - - virtual std::optional - credentialKeylet( - std::string const& subject, - std::string const& issuer, - std::string const& credentialType) - { - return Bytes{}; - } - - virtual std::optional - escrowKeylet(std::string const& account, std::uint32_t const& seq) - { - return Bytes{}; - } - - virtual std::optional - oracleKeylet(std::string const& account, std::uint32_t const& docId) - { - return Bytes{}; - } - - virtual ~HostFunctions() = default; -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64 }; - -struct WasmImportFunc -{ - std::string name; - std::optional result; - std::vector params; - void* udata = nullptr; - // wasm_func_callback_with_env_t - void* wrap = nullptr; -}; - -#define WASM_IMPORT_FUNC(v, f, ...) \ - WasmImpFunc( \ - v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__); - -template -void -WasmImpArgs(WasmImportFunc& e) -{ - if constexpr (N < C) - { - using at = typename boost::mpl::at_c::type; - if constexpr (std::is_pointer_v) - e.params.push_back(WT_I32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_I32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_I64); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F64); - else - static_assert(std::is_pointer_v, "Unsupported argument type"); - - return WasmImpArgs(e); - } - return; -} - -template -void -WasmImpRet(WasmImportFunc& e) -{ - if constexpr (std::is_pointer_v) - e.result = WT_I32; - else if constexpr (std::is_same_v) - e.result = WT_I32; - else if constexpr (std::is_same_v) - e.result = WT_I64; - else if constexpr (std::is_same_v) - e.result = WT_F32; - else if constexpr (std::is_same_v) - e.result = WT_F64; - else if constexpr (std::is_void_v) - e.result.reset(); -#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ - ((defined(__clang_major__)) && (__clang_major__ >= 18)) - else - static_assert(false, "Unsupported return type"); -#endif -} - -template -void -WasmImpFuncHelper(WasmImportFunc& e) -{ - using rt = typename bft::result_type::type; - using pt = typename bft::parameter_types::type; - // typename boost::mpl::at_c::type - - WasmImpRet(e); - WasmImpArgs<0, bft::function_arity::value, pt>(e); - // WasmImpWrap(e, std::forward(f)); -} - -template -void -WasmImpFunc( - std::vector& v, - std::string_view imp_name, - void* f_wrap, - void* data = nullptr) -{ - WasmImportFunc e; - e.name = imp_name; - e.udata = data; - e.wrap = f_wrap; - WasmImpFuncHelper(e); - v.push_back(std::move(e)); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -struct WasmParam -{ - WasmTypes type = WT_I32; - union - { - std::int32_t i32; - std::int64_t i64 = 0; - float f32; - double f64; - } of; -}; - -template -inline std::vector -wasmParams(Types... args) -{ - std::vector v; - v.reserve(sizeof...(args)); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, std::int32_t p, Types... args) -{ - v.push_back({.type = WT_I32, .of = {.i32 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, std::int64_t p, Types... args) -{ - v.push_back({.type = WT_I64, .of = {.i64 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, float p, Types... args) -{ - v.push_back({.type = WT_F32, .of = {.f32 = p}}); - return wasmParams(v, std::forward(args)...); -} - -template -inline std::vector -wasmParams(std::vector& v, double p, Types... args) -{ - v.push_back({.type = WT_F64, .of = {.f64 = p}}); - return wasmParams(v, std::forward(args)...); -} - -inline std::vector -wasmParams(std::vector& v) -{ - return v; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - class WamrEngine; class WasmEngine { @@ -333,34 +56,24 @@ class WasmEngine static WasmEngine& instance(); - Expected - run(wbytes const& wasmCode, + Expected, TER> + run(Bytes const& wasmCode, std::string_view funcName = {}, - std::vector const& imports = {}, std::vector const& params = {}, + std::vector const& imports = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); - std::int64_t - initGas(std::int64_t def = 1'000'000'000'000LL); - std::int32_t initMaxPages(std::int32_t def); - std::int64_t - setGas(std::int64_t gas); - - std::int64_t - getGas(); - - // for host functions usage - wmem - getMem() const; - - int32_t - allocate(int32_t size); - + // Host functions helper functionality void* newTrap(std::string_view msg = {}); + + beast::Journal + getJournal() const; }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -369,7 +82,9 @@ Expected runEscrowWasm( Bytes const& wasmCode, std::string_view funcName, - HostFunctions* hfs, - uint64_t gasLimit); + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 42e67621e77..75bc54c2bc9 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -629,7 +629,8 @@ EscrowFinish::doApply() return tecINTERNAL; } std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = runEscrowWasm(wasm, funcName, &ledgerDataProvider, allowance); + auto re = + runEscrowWasm(wasm, funcName, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From 383b225690cf7e12ff2f29f8fd9ecc4615f12510 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 4 Jun 2025 17:32:11 -0400 Subject: [PATCH 020/212] Fix processing nonexistent field (#5467) --- src/test/app/Escrow_test.cpp | 27 +++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 26 +++++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 75 ++++++++++++++----------- 4 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 52abf61fc6c..49d7fb216df 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1888,6 +1888,33 @@ struct Escrow_test : public beast::unit_test::suite ter(temBAD_LIMIT)); } + { + uint32_t const allowance = 10'000; + Env env(*this); + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + XRPAmount const createFee = env.current()->fees().base + 1000; + + // Escrow with FinishFunction + Condition + auto escrowCreate = escrow(alice, carol, XRP(1000)); + env(escrowCreate, + finish_function(reqNonexistentField), + condition(cb1), + cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + env.close(); + + // Rejected as wasm code request nonexistent memo field + XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; + env(finish(alice, alice, seq), + condition(cb1), + fulfillment(fb1), + comp_allowance(allowance), + fee(txnFees), + ter(tecWASM_REJECTED)); + } + Env env(*this); // Run past the flag ledger so that a Fee change vote occurs and diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 7dbc4fdc2ff..10330f93bf7 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11683,3 +11683,29 @@ extern std::string const hostFunctions2Hex = "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" "6c746976616c7565"; + +extern std::string const reqNonexistentField = + "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" + "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" + "19037f01418080c0000b7f00418080c0000b7f00418080c0000b072e04066d656d6f727902" + "000666696e69736800010a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0abc04035f01037f230041d0206b220124002001410c6a220241802010032001418c206a22" + "0041c400100320004189803c10022000410010022000418a803810022000418d801c100220" + "0020012802cc2020024180201000200141d0206a240041004a0b6101027f230041106b2103" + "024020002802402202413d6b41bf7f490d002003200136020c4100210103402002413f4b0d" + "01200020026a2003410c6a20016a2d00003a00002000200028024041016a22023602402001" + "41016a22014104470d000b0b0bf70201037f200141104f044002402000410020006b410371" + "22036a220220004d0d0020030440200321040340200041003a0000200041016a2100200441" + "016b22040d000b0b200341016b4107490d000340200041003a0000200041076a41003a0000" + "200041066a41003a0000200041056a41003a0000200041046a41003a0000200041036a4100" + "3a0000200041026a41003a0000200041016a41003a0000200041086a22002002470d000b0b" + "2002200120036b2201417c716a220020024b0440034020024100360200200241046a220220" + "00490d000b0b200141037121010b02402000200020016a22034f0d00200141077122020440" + "0340200041003a0000200041016a2100200241016b22020d000b0b200141016b4107490d00" + "0340200041003a0000200041076a41003a0000200041066a41003a0000200041056a41003a" + "0000200041046a41003a0000200041036a41003a0000200041026a41003a0000200041016a" + "41003a0000200041086a22002003470d000b0b0b004d0970726f64756365727302086c616e" + "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" + "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index acf2de906e0..308c2668bd7 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -54,3 +54,5 @@ extern std::string const sp1_wasm; extern std::string const xrplStdExampleHex; extern std::string const hostFunctions2Hex; + +extern std::string const reqNonexistentField; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 1da8c38a2d6..9e2ec00d184 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -74,39 +74,50 @@ Bytes getAnyFieldData(STBase const& obj) { // auto const& fname = obj.getFName(); - if (STI_ACCOUNT == obj.getSType()) + auto const stype = obj.getSType(); + switch (stype) { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_AMOUNT == obj.getSType()) - { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - else if (STI_VL == obj.getSType()) - { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_UINT256 == obj.getSType()) - { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - else if (STI_UINT32 == obj.getSType()) - { - auto const& super(static_cast const&>(obj)); - std::uint32_t const data = super.value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; } Serializer msg; From 8a33702f265dd917a945937ef70d05676317b630 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Jun 2025 12:11:09 -0400 Subject: [PATCH 021/212] fix merge issues --- src/test/app/Escrow_test.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3f89f430edf..d052415f9f4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1904,21 +1904,21 @@ struct Escrow_test : public beast::unit_test::suite XRPAmount const createFee = env.current()->fees().base + 1000; // Escrow with FinishFunction + Condition - auto escrowCreate = escrow(alice, carol, XRP(1000)); + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); env(escrowCreate, - finish_function(reqNonexistentField), - condition(cb1), - cancel_time(env.now() + 100s), + escrow::finish_function(reqNonexistentField), + escrow::condition(escrow::cb1), + escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); env.close(); // Rejected as wasm code request nonexistent memo field XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; - env(finish(alice, alice, seq), - condition(cb1), - fulfillment(fb1), - comp_allowance(allowance), + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); } From 6e8a5f0f4e18b80e6ecc67ec8803934806c14faa Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Jun 2025 14:24:13 -0400 Subject: [PATCH 022/212] fix: make host function traces easier to use, fix `get_NFT` bug (#5466) Co-authored-by: Olek <115580134+oleks-rip@users.noreply.github.com> --- src/xrpld/app/misc/WamrVM.cpp | 20 ++++++++++++-------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 16 +++++++++++----- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 5 ++++- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index fb1852bd00d..8f7c9b1c361 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -93,11 +93,17 @@ wamr_log_to_rippled( { beast::Journal j = WasmEngine::instance().getJournal(); - // Format the variadic args - char const* safeFile = file ? file : ""; - std::ostringstream oss; - oss << "WAMR (" << safeFile << ":" << line << "): "; + + // Format the variadic args + if (file) + { + oss << "WAMR (" << file << ":" << line << "): "; + } + else + { + oss << "WAMR: "; + } va_list args; va_start(args, fmt); @@ -114,7 +120,6 @@ wamr_log_to_rippled( #ifdef DEBUG_OUTPUT_WAMR std::cerr << oss.str() << std::endl; #endif - // } void @@ -544,9 +549,8 @@ ModuleWrapper::buildImports( if (impCnt != importTypes.num_elems) { print_wasm_error( - std::string("Imports not finished: ") + - std::to_string(wimports.num_elems) + "/" + - std::to_string(importTypes.num_elems), + std::string("Imports not finished: ") + std::to_string(impCnt) + + "/" + std::to_string(importTypes.num_elems), nullptr, j_); } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 9e2ec00d184..6c19db6dc42 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -455,11 +455,17 @@ Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; return Unexpected(HF_ERR_INVALID_PARAMS); + } auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + } Slice const s = obj->at(sfURI); return Bytes(s.begin(), s.end()); @@ -476,15 +482,15 @@ WasmHostFunctionsImpl::trace( #else auto j = ctx.journal.trace(); #endif - j << msg; if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); + j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " + << std::string_view( + reinterpret_cast(data.data()), data.size()); else { auto const hex = boost::algorithm::hex(std::string(data.begin(), data.end())); - j << hex; + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); @@ -499,7 +505,7 @@ WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) auto j = ctx.journal.trace(); #endif - j << msg << data; + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << data; return msg.size() + sizeof(data); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index e4196263d65..b654c16aa54 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -685,8 +685,11 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) RET(nftRaw.error()); } - if (nftRaw->size() < uint256::bytes * 2) + if (nftRaw->size() != uint256::bytes) { + hf->getJournal().trace() + << "WAMR getNFT: Invalid NFT data size: " << nftRaw->size() + << ", expected " << (uint256::bytes); RET(HF_ERR_INVALID_PARAMS); } From 51a9c0ff59c8fcd891e83631d737832b7626d602 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 12 Jun 2025 15:54:49 -0400 Subject: [PATCH 023/212] Host function gas cost (#5488) * Update Wamr to 2.3.1 * Add gas cost per host-function * Fix windows build * Fix wasm test * Add no import test --- .github/actions/dependencies/action.yml | 2 +- .github/workflows/nix.yml | 2 +- conanfile.py | 2 +- external/wamr/conandata.yml | 2 +- external/wamr/conanfile.py | 5 +- external/wamr/patches/ripp_metering.patch | 484 ++++++++++++---------- src/test/app/Wasm_test.cpp | 365 +++++++++------- src/xrpld/app/misc/WamrVM.cpp | 16 +- src/xrpld/app/misc/WamrVM.h | 4 +- src/xrpld/app/misc/WasmParamsHelper.h | 5 +- 10 files changed, 500 insertions(+), 387 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index c251daa9369..4f7e2383335 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -17,7 +17,7 @@ runs: conan export external/rocksdb rocksdb/9.7.3@ conan export external/soci soci/4.0.3@ conan export external/nudb nudb/2.0.8@ - conan export -k external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ - name: add Ripple Conan remote shell: bash run: | diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index 76597a68e01..3b95fbe1d8d 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -408,7 +408,7 @@ jobs: conan profile update 'conf.tools.build:cxxflags+=["-DBOOST_ASIO_DISABLE_CONCEPTS"]' default conan export external/snappy snappy/1.1.10@ conan export external/soci soci/4.0.3@ - conan export -k external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ - name: build dependencies run: | diff --git a/conanfile.py b/conanfile.py index cc9ce866ecc..01c7ccfc9ba 100644 --- a/conanfile.py +++ b/conanfile.py @@ -31,7 +31,7 @@ class Xrpl(ConanFile): 'openssl/1.1.1v', 'soci/4.0.3', 'zlib/1.3.1', - 'wamr/2.2.0', + 'wamr/2.3.1', ] tool_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml index 6c49946ecab..b1459816305 100644 --- a/external/wamr/conandata.yml +++ b/external/wamr/conandata.yml @@ -1,5 +1,5 @@ patches: - 2.2.0: + 2.3.1: - patch_description: add metering to iwasm interpreter patch_file: patches/ripp_metering.patch patch_type: conan diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index ae83e8c13c1..1fa3281c1e5 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -13,7 +13,7 @@ class WamrConan(ConanFile): name = "wamr" - version = "2.2.0" + version = "2.3.1" license = "Apache License v2.0" url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" description = "Webassembly micro runtime" @@ -42,7 +42,7 @@ def source(self): git = tools.Git() git.clone( "https://github.com/bytecodealliance/wasm-micro-runtime.git", - "c883fafead005e87ad3122b05409886f507c1cb0", + "2a303861cc916dc182b7fecaa0aacc1b797e7ac6", shallow=True, ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -89,3 +89,4 @@ def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" + diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index a2abf37a57c..e9ca69338f6 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 551991f8..5f48a0b8 100644 +index 88a1642b..aeb29912 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -11,97 +11,127 @@ index 551991f8..5f48a0b8 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) -diff --git a/build-scripts/config_common.cmake b/build-scripts/config_common.cmake -index 1cb50235..bd103022 100644 ---- a/build-scripts/config_common.cmake -+++ b/build-scripts/config_common.cmake -@@ -669,6 +669,10 @@ if (WAMR_BUILD_AOT_VALIDATOR EQUAL 1) - message (" AOT validator enabled") - add_definitions (-DWASM_ENABLE_AOT_VALIDATOR=1) - endif () -+if (WAMR_BUILD_INSTRUCTION_METERING EQUAL 1) -+ message (" Instruction metering enabled") -+ add_definitions (-DWASM_ENABLE_INSTRUCTION_METERING=1) -+endif () - - ######################################## - # Show Phase4 Wasm proposals status. -diff --git a/core/config.h b/core/config.h -index cb1189c9..a4e1499e 100644 ---- a/core/config.h -+++ b/core/config.h -@@ -716,4 +716,8 @@ unless used elsewhere */ - #define WASM_ENABLE_AOT_VALIDATOR 0 - #endif - -+#ifndef WASM_ENABLE_INSTRUCTION_METERING -+#define WASM_ENABLE_INSTRUCTION_METERING 0 -+#endif -+ - #endif /* end of _CONFIG_H_ */ diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c -index 269ec577..bc6fd01b 100644 +index 269ec577..34eb7c34 100644 --- a/core/iwasm/common/wasm_c_api.c +++ b/core/iwasm/common/wasm_c_api.c -@@ -5389,3 +5389,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, +@@ -3242,10 +3242,20 @@ wasm_func_copy(const wasm_func_t *func) + + cloned->func_idx_rt = func->func_idx_rt; + cloned->inst_comm_rt = func->inst_comm_rt; ++ cloned->gas = func->gas; + + RETURN_OBJ(cloned, wasm_func_delete) + } + ++uint32_t ++wasm_func_set_gas(wasm_func_t *func, uint32_t gas) ++{ ++ if(!func) return 0; ++ ++ func->gas = gas; ++ return gas; ++} ++ + own wasm_functype_t * + wasm_func_type(const wasm_func_t *func) + { +@@ -4998,11 +5008,11 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + goto failed; + } + ++ WASMModuleInstance *wasm_module_inst = NULL; + /* create the c-api func import list */ + #if WASM_ENABLE_INTERP != 0 + if (instance->inst_comm_rt->module_type == Wasm_Module_Bytecode) { +- WASMModuleInstance *wasm_module_inst = +- (WASMModuleInstance *)instance->inst_comm_rt; ++ wasm_module_inst = (WASMModuleInstance *)instance->inst_comm_rt; + p_func_imports = &(wasm_module_inst->c_api_func_imports); + import_func_count = MODULE_INTERP(module)->import_function_count; + } +@@ -5052,6 +5062,13 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + } + bh_assert(func_import->func_ptr_linked); + ++ // fill gas ++ if(wasm_module_inst) { ++ WASMFunctionInstance *fi = wasm_module_inst->e->functions + func_host->func_idx_rt; ++ if(fi) fi->gas = func_host->gas; ++ } ++ ++ + func_import++; + } + +@@ -5389,3 +5406,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, return -1.0; #endif } + -+wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*instance) ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t *instance) +{ + return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); +} +diff --git a/core/iwasm/common/wasm_c_api_internal.h b/core/iwasm/common/wasm_c_api_internal.h +index 49a17a96..19a85980 100644 +--- a/core/iwasm/common/wasm_c_api_internal.h ++++ b/core/iwasm/common/wasm_c_api_internal.h +@@ -142,6 +142,10 @@ struct wasm_func_t { + void (*finalizer)(void *); + } cb_env; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + /* + * an index in both functions runtime instance lists + * of interpreter mode and aot mode diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c -index e33fd9f3..d1ff9c41 100644 +index 47752950..d5821c4f 100644 --- a/core/iwasm/common/wasm_exec_env.c +++ b/core/iwasm/common/wasm_exec_env.c -@@ -85,6 +85,12 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, - wasm_runtime_dump_exec_env_mem_consumption(exec_env); +@@ -86,7 +86,9 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, #endif -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ exec_env->instructions_to_execute = -1; + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- exec_env->instructions_to_execute = -1; ++ exec_env->instructions_to_execute = INT64_MAX; + for(int i = 0; i < 256; ++i) + exec_env->instructions_schedule[i] = 1; -+#endif -+ - return exec_env; + #endif - #ifdef OS_ENABLE_HW_BOUND_CHECK + return exec_env; diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h -index ce0c1fa7..2713a092 100644 +index 5d80312f..2713a092 100644 --- a/core/iwasm/common/wasm_exec_env.h +++ b/core/iwasm/common/wasm_exec_env.h -@@ -87,6 +87,12 @@ typedef struct WASMExecEnv { - uint8 *bottom; - } wasm_stack; +@@ -89,7 +89,8 @@ typedef struct WASMExecEnv { -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ /* instructions to execute */ + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + /* instructions to execute */ +- int instructions_to_execute; + int64 instructions_to_execute; + int64 instructions_schedule[256]; -+#endif -+ + #endif + #if WASM_ENABLE_FAST_JIT != 0 - /** - * Cache for diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index d33c0272..21bfdf29 100644 +index dcee0aea..2559be21 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2285,6 +2285,31 @@ wasm_runtime_access_exce_check_guard_page() - } - #endif - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ -+void -+wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +@@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + void + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute) + int64 instructions_to_execute) -+{ -+ exec_env->instructions_to_execute = instructions_to_execute; -+} + { ++ if(instructions_to_execute == -1) ++ instructions_to_execute = INT64_MAX; + exec_env->instructions_to_execute = instructions_to_execute; + } + +int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) @@ -116,13 +146,10 @@ index d33c0272..21bfdf29 100644 + for(int i = 0; i < 256; ++i) + exec_env->instructions_schedule[i] = instructions_schedule[i]; +} -+ -+#endif -+ + #endif + WASMFuncType * - wasm_runtime_get_function_type(const WASMFunctionInstanceCommon *function, - uint32 module_type) -@@ -7792,13 +7817,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -138,7 +165,7 @@ index d33c0272..21bfdf29 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7808,6 +7834,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7821,6 +7838,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -146,7 +173,7 @@ index d33c0272..21bfdf29 100644 return true; } -@@ -7830,7 +7857,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7843,7 +7861,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -156,19 +183,14 @@ index d33c0272..21bfdf29 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 8ac032bf..5ca5d489 100644 +index 64a6cd79..f4c55e2f 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -791,9 +791,25 @@ WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, - uint8 *native_stack_boundary); - --#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ +@@ -795,7 +795,14 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute); + int64 instructions_to_execute); +WASM_RUNTIME_API_EXTERN int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); @@ -177,17 +199,11 @@ index 8ac032bf..5ca5d489 100644 +wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, + int64 const *instructions_schedule); + -+#endif -+ -+#if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -+/* See wasm_export.h for description */ -+WASM_RUNTIME_API_EXTERN -+void - wasm_runtime_set_bounds_checks(WASMModuleInstanceCommon *module_inst, - bool enable); + #endif + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..9eb0dde1 100644 +index 241a0eec..1141744c 100644 --- a/core/iwasm/include/wasm_c_api.h +++ b/core/iwasm/include/wasm_c_api.h @@ -19,8 +19,10 @@ @@ -202,7 +218,16 @@ index 241a0eec..9eb0dde1 100644 #endif #else #define WASM_API_EXTERN -@@ -701,6 +703,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); +@@ -592,6 +594,8 @@ WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); + WASM_API_EXTERN own wasm_trap_t* wasm_func_call( + const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); + ++WASM_API_EXTERN own uint32_t wasm_func_set_gas(wasm_func_t*, uint32_t); ++ + + // Global Instances + +@@ -701,6 +705,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); // func_name. If the function is not found, return 0. WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); @@ -215,7 +240,7 @@ index 241a0eec..9eb0dde1 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b73a0364..3fd0949f 100644 +index b4ab34be..3fd0949f 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -20,8 +20,10 @@ @@ -230,22 +255,11 @@ index b73a0364..3fd0949f 100644 #endif #elif defined(__GNUC__) || defined(__clang__) #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) -@@ -1821,6 +1823,27 @@ WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, - uint8_t *native_stack_boundary); - -+/** -+ * Set the instruction count limit to the execution environment. -+ * By default the instruction count limit is -1, which means no limit. -+ * However, if the instruction count limit is set to a positive value, -+ * the execution will be terminated when the instruction count reaches -+ * the limit. -+ * -+ * @param exec_env the execution environment -+ * @param instruction_count the instruction count limit -+ */ -+WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, +@@ -1833,7 +1835,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + */ + WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, +- int instruction_count); + int64_t instruction_count); + +WASM_RUNTIME_API_EXTERN int64_t @@ -254,132 +268,122 @@ index b73a0364..3fd0949f 100644 +WASM_RUNTIME_API_EXTERN void +wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, + int64_t const *instructions_schedule); -+ + /** * Dump runtime memory consumption, including: - * Exec env memory consumption diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 41ac4c72..bd8f714a 100644 +index 1e98b0fa..ae24ff8b 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c -@@ -1516,10 +1516,13 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, - } \ - os_mutex_unlock(&exec_env->wait_lock); \ - } \ -+ CHECK_INSTRUCTION_LIMIT(); \ - goto *handle_table[*frame_ip++]; \ - } while (0) - #else --#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() -+#define HANDLE_OP_END() \ -+ CHECK_INSTRUCTION_LIMIT(); \ -+ FETCH_OPCODE_AND_DISPATCH() - #endif +@@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + } - #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1542,9 +1545,12 @@ wasm_interp_call_func_import(WASMModuleInstance *module_inst, - } \ - os_mutex_unlock(&exec_env->wait_lock); \ - } \ -+ CHECK_INSTRUCTION_LIMIT(); \ - continue; + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ do { \ ++ instructions_left -= instructions_schedule[opcode]; \ ++ if (instructions_left < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } while (0) #else --#define HANDLE_OP_END() continue -+#define HANDLE_OP_END() \ -+ CHECK_INSTRUCTION_LIMIT(); \ -+ continue; - #endif - - #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1562,6 +1568,20 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif - } - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) \ -+ { \ -+ instructions_to_execute -= instructions_schedule[opcode];\ -+ if (instructions_to_execute < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ } -+#else -+#define CHECK_INSTRUCTION_LIMIT() (void)0 -+#endif -+ - static void - wasm_interp_call_func_bytecode(WASMModuleInstance *module, - WASMExecEnv *exec_env, -@@ -1605,6 +1625,17 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint32 local_idx, local_offset, global_idx; - uint8 local_type, *global_addr; +@@ -1625,9 +1626,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; -+ -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ int64 instructions_to_execute = -1; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; ++ int64 instructions_left = INT64_MAX; + int64 const *instructions_schedule = NULL; -+ if(exec_env) -+ { -+ instructions_to_execute = exec_env->instructions_to_execute; + if (exec_env) { + instructions_left = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; -+ } -+#endif -+ - #if WASM_ENABLE_EXCE_HANDLING != 0 - int32_t exception_tag_index; + } #endif -@@ -6859,6 +6890,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + +@@ -6885,6 +6888,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if(exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6899,6 +6935,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6925,6 +6933,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); + +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if(exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index f33ad60e..9cbf2010 100644 +index 4e5edf41..04c39e1f 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -105,6 +105,19 @@ typedef float64 CellType_F64; - goto unaligned_atomic; \ +@@ -106,14 +106,14 @@ typedef float64 CellType_F64; } while (0) -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; +- +#define CHECK_INSTRUCTION_LIMIT() \ -+ if (instructions_to_execute >= 0) { \ -+ instructions_to_execute -= instructions_schedule[opcode]; \ -+ if (instructions_to_execute < 0) { \ ++ do { \ ++ instructions_left -= instructions_schedule[opcode]; \ ++ if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ -+ } -+#else -+#define CHECK_INSTRUCTION_LIMIT() (void)0 -+#endif -+ - static inline uint32 - rotl32(uint32 n, uint32 c) - { -@@ -1466,12 +1479,14 @@ wasm_interp_dump_op_count() ++ } while (0) + #else + #define CHECK_INSTRUCTION_LIMIT() (void)0 + #endif +@@ -1454,7 +1454,6 @@ wasm_interp_dump_op_count() + do { \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1466,7 +1465,6 @@ wasm_interp_dump_op_count() + /* int32 relative offset was emitted in 64-bit target */ \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1477,17 +1475,18 @@ wasm_interp_dump_op_count() + /* uint32 label address was emitted in 32-bit target */ \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ } while (0) #endif #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ @@ -396,46 +400,91 @@ index f33ad60e..9cbf2010 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1538,6 +1553,16 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint8 *maddr = NULL; - uint32 local_idx, local_offset, global_idx; - uint8 opcode = 0, local_type, *global_addr; +@@ -1508,6 +1507,25 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + #endif + } + ++static int64 const def_instructions_schedule[256] = { ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, ++ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ++}; + -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ int64 instructions_to_execute = -1; -+ int64 const *instructions_schedule = NULL; -+ if (exec_env) { -+ instructions_to_execute = exec_env->instructions_to_execute; + static void + wasm_interp_call_func_bytecode(WASMModuleInstance *module, + WASMExecEnv *exec_env, +@@ -1556,9 +1574,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 opcode = 0, local_type, *global_addr; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; ++ int64 instructions_left = INT64_MAX; ++ int64 const *instructions_schedule = def_instructions_schedule; + if (exec_env) { + instructions_left = exec_env->instructions_to_execute; + instructions_schedule = exec_env->instructions_schedule; -+ } -+#endif -+ + } + #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ - || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 - #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -@@ -7761,6 +7786,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7694,6 +7714,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + wasm_interp_call_func_native(module, exec_env, cur_func, + prev_frame); ++ instructions_left -= cur_func->gas; + } + + #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 +@@ -7806,6 +7827,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if (exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif + if (!prev_frame->ip) /* Called from native. */ return; -@@ -7789,6 +7819,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7834,6 +7860,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); +#if WASM_ENABLE_INSTRUCTION_METERING != 0 + if (exec_env) -+ exec_env->instructions_to_execute = instructions_to_execute; ++ exec_env->instructions_to_execute = instructions_left; +#endif return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h +index 8d38c883..a687ab89 100644 +--- a/core/iwasm/interpreter/wasm_runtime.h ++++ b/core/iwasm/interpreter/wasm_runtime.h +@@ -228,6 +228,10 @@ struct WASMFunctionInstance { + WASMFunctionImport *func_import; + WASMFunction *func; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + #if WASM_ENABLE_MULTI_MODULE != 0 + WASMModuleInstance *import_module_inst; + WASMFunctionInstance *import_func_inst; diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea..e23b500e 100644 --- a/core/shared/platform/include/platform_wasi_types.h @@ -451,20 +500,5 @@ index ac1a95ea..e23b500e 100644 + #define assert_wasi_layout(expr, message) static_assert(expr, message) + #endif #endif - - assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); -diff --git a/doc/build_wamr.md b/doc/build_wamr.md -index 6425450b..94dd9628 100644 ---- a/doc/build_wamr.md -+++ b/doc/build_wamr.md -@@ -327,6 +327,10 @@ And the wasm app can calls below APIs to allocate/free memory from/to the shared - - **WAMR_BUILD_SHRUNK_MEMORY**=1/0, default to enable if not set - > Note: When enabled, this feature will reduce memory usage by decreasing the size of the linear memory, particularly when the `memory.grow` opcode is not used and memory usage is somewhat predictable. - -+## **Instruction metering** -+- **WAMR_BUILD_INSTRUCTION_METERING**=1/0, default to disable if not set -+> Note: Enabling this feature allows limiting the number of instructions a wasm module instance can execute. Use the `wasm_runtime_set_instruction_count_limit(...)` API before calling `wasm_runtime_call_*(...)` APIs to enforce this limit. -+ - ## **Combination of configurations:** - We can combine the configurations. For example, if we want to disable interpreter, enable AOT and WASI, we can run command: + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 3156a98a864..c5bd2278df7 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include #ifdef _DEBUG // #define DEBUG_OUTPUT 1 @@ -71,97 +71,6 @@ getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) return nullptr; } -struct TestHostFunctionsOld : public HostFunctions -{ - test::jtx::Env* env_; - Bytes accountID_; - Bytes data_; - int clock_drift_ = 0; - test::StreamSink sink_; - beast::Journal jlog_; - void const* rt_ = nullptr; - -public: - explicit TestHostFunctionsOld(test::jtx::Env* env, int cd = 0) - : env_(env) - , clock_drift_(cd) - , sink_(beast::severities::kDebug) - , jlog_(sink_) - { - std::string s = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - accountID_ = Bytes{s.begin(), s.end()}; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } - - int32_t - getLedgerSqn() override - { - return (int32_t)env_->current()->seq(); - } - - int32_t - getParentLedgerTime() override - { - return env_->current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; - } - - Expected - getTxField(SField const& fname) override - { - return accountID_; - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - return data_; - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - if (fname.getName() == "Destination" || fname.getName() == "Account") - return accountID_; - else if (fname.getName() == "Data") - return data_; - else if (fname.getName() == "FinishAfter") - { - auto t = - env_->current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return Unexpected(-1); - } -}; - struct TestHostFunctions : public HostFunctions { test::jtx::Env& env_; @@ -171,7 +80,7 @@ struct TestHostFunctions : public HostFunctions void const* rt_ = nullptr; public: - explicit TestHostFunctions(test::jtx::Env& env, int cd = 0) + TestHostFunctions(test::jtx::Env& env, int cd = 0) : env_(env), clock_drift_(cd) { auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); @@ -212,6 +121,12 @@ struct TestHostFunctions : public HostFunctions clock_drift_; } + Hash + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + virtual int32_t cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override { @@ -239,13 +154,22 @@ struct TestHostFunctions : public HostFunctions } Expected - getTxNestedField(Slice const& locator) override + getCurrentLedgerObjField(SField const& fname) override { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(-1); } Expected @@ -262,22 +186,33 @@ struct TestHostFunctions : public HostFunctions } Expected - getCurrentLedgerObjField(SField const& fname) override + getTxNestedField(Slice const& locator) override { - auto const& sn = fname.getName(); - if (sn == "Destination" || sn == "Account") - return Bytes(accountID_.begin(), accountID_.end()); - else if (sn == "Data") - return data_; - else if (sn == "FinishAfter") - { - auto t = - env_.current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } - return Unexpected(-1); + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); } int32_t @@ -286,18 +221,48 @@ struct TestHostFunctions : public HostFunctions return 32; } + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override + { + return 32; + } + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + return 32; + } + int32_t getTxNestedArrayLen(Slice const& locator) override { return 32; } + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + return 32; + } + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + return 32; + } + int32_t updateData(Bytes const& data) override { return 0; } + Hash + computeSha512HalfHash(Bytes const& data) override + { + return env_.current()->info().parentHash; + } + Expected accountKeylet(AccountID const& account) override { @@ -307,6 +272,49 @@ struct TestHostFunctions : public HostFunctions return Bytes{keylet.key.begin(), keylet.key.end()}; } + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override + { + if (!subject || !issuer || credentialType.empty()) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + return Unexpected(HF_ERR_INVALID_PARAMS); + } + + std::string s = "https://ripple.com"; + return Bytes(s.begin(), s.end()); + } + int32_t trace(std::string const& msg, Bytes const& data, bool asHex) override { @@ -350,6 +358,33 @@ struct TestHostFunctions : public HostFunctions } }; +struct TestHostFunctionsSink : public TestHostFunctions +{ + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) + : TestHostFunctions(env, cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } +}; + struct Wasm_test : public beast::unit_test::suite { void @@ -361,9 +396,9 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "fib", wasmParams(10)); + auto const re = engine.run(wasm, "fib", wasmParams(10)); - BEAST_EXPECT(r.has_value() && (r->result == 55)); + BEAST_EXPECT(re.has_value() && (re->result == 55) && (re->cost == 755)); } void @@ -375,10 +410,11 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = + auto const re = engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); - BEAST_EXPECT(r.has_value() && (r->result == 34432)); + BEAST_EXPECT( + re.has_value() && (re->result == 34432) && (re->cost == 157'452)); } void @@ -396,9 +432,9 @@ struct Wasm_test : public beast::unit_test::suite static_cast(512), static_cast(b58Hex.size())); auto const s = std::string_view(b58Hex.c_str(), minsz); - auto const r = engine.run(wasm, "b58enco", wasmParams(outb, s)); + auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT(re.has_value() && re->result && (re->cost == 3'066'129)); } void @@ -409,9 +445,10 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "sp1_groth16_verifier"); + auto const re = engine.run(wasm, "sp1_groth16_verifier"); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT( + re.has_value() && re->result && (re->cost == 4'191'711'969ll)); } void @@ -422,9 +459,9 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); - auto const r = engine.run(wasm, "bellman_groth16_test"); + auto const re = engine.run(wasm, "bellman_groth16_test"); - BEAST_EXPECT(r.has_value() && r->result); + BEAST_EXPECT(re.has_value() && re->result && (re->cost == 332'205'984)); } void @@ -442,24 +479,29 @@ struct Wasm_test : public beast::unit_test::suite std::string const funcName("finish"); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider); + WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider, 33); auto& engine = WasmEngine::instance(); - auto r = engine.run( + auto re = engine.run( wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); - if (BEAST_EXPECT(r.has_value())) - BEAST_EXPECT(!r->result); + + // code takes 4 gas + 1 getLedgerSqn call + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(!re->result && (re->cost == 37)); + env.close(); env.close(); env.close(); env.close(); - // empty module - run the same module - r = engine.run( + // empty module - run the same instance + re = engine.run( {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); - if (BEAST_EXPECT(r.has_value())) - BEAST_EXPECT(r->result); + + // code takes 8 gas + 2 getLedgerSqn calls + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re->result && (re->cost == 74)); } void @@ -479,7 +521,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm( wasm, funcName, wasmParams(data), nullptr, -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(re.value().result && (re->cost == 838)); } { std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; @@ -487,7 +529,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm( wasm, funcName, wasmParams(data), nullptr, -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re.value().result && (re->cost == 822)); } } @@ -513,7 +555,7 @@ struct Wasm_test : public beast::unit_test::suite -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(re.value().result && (re->cost == 42'212)); std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); re = runEscrowWasm( @@ -524,7 +566,7 @@ struct Wasm_test : public beast::unit_test::suite -1, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re.value().result && (re->cost == 41'496)); } void @@ -566,11 +608,11 @@ struct Wasm_test : public beast::unit_test::suite WasmImpFunc( imports, "func-add", reinterpret_cast(&Add)); - auto res = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(res.has_value() && res->result == 6912); + BEAST_EXPECT(re.has_value() && re->result == 6912 && (re->cost == 2)); } void @@ -587,7 +629,7 @@ struct Wasm_test : public beast::unit_test::suite std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(!re && re.error()); } void @@ -616,10 +658,10 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(env, 0); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re.value().result); + BEAST_EXPECT(!re->result && (re->cost == 487)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -636,7 +678,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re.value().result); + BEAST_EXPECT(!re->result && (re->cost == 487)); // std::cout << "bad case (current time < escrow_finish_after " // "time) result " // << re.value().result << " cost: " << @@ -654,13 +696,13 @@ struct Wasm_test : public beast::unit_test::suite Expected getTxField(SField const& fname) override { - return Unexpected(-1); + return Unexpected(HF_ERR_FIELD_NOT_FOUND); } }; BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -680,7 +722,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(!re); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } @@ -690,10 +732,10 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctionsOld nfs(&env); + TestHostFunctionsSink nfs(env); std::string funcName("recursive"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); - BEAST_EXPECT(re.error()); + BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -712,13 +754,32 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT( countSubstr( - sink.messages().str(), "WAMR error: failed to call func") == + sink.messages().str(), "WAMR Error: failed to call func") == 1); BEAST_EXPECT( countSubstr( sink.messages().str(), "WAMR Exception: wasm operand stack overflow") == 1); } + + { + auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestLedgerDataProvider ledgerDataProvider(&env); + + std::vector imports; + WASM_IMPORT_FUNC2( + imports, getLedgerSqn, "get_ledger_sqn2", &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + + // expected import not provided + BEAST_EXPECT(!re); + } } void @@ -741,7 +802,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result); + BEAST_EXPECT(re->result && (re->cost == 80)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -763,7 +824,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result); + BEAST_EXPECT(re->result && (re->cost == 138)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -787,10 +848,10 @@ struct Wasm_test : public beast::unit_test::suite // runing too long // testWasmSP1Verifier(); - // testWasmBG16Verifier(); + testWasmBG16Verifier(); - // TODO: needs fix for new host functions interface - // testEscrowWasmDN1(); + // TODO: fix result + testEscrowWasmDN1(); testEscrowWasmDN2(); } }; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 8f7c9b1c361..b44c4bac2ec 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -529,6 +529,15 @@ ModuleWrapper::buildImports( reinterpret_cast(imp.wrap), imp.udata, nullptr); + if (!func) + throw std::runtime_error( + "can't create import function " + + imp.name); // LCOV_EXCL_LINE + + if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + throw std::runtime_error( + "can't set gas for import function " + + imp.name); // LCOV_EXCL_LINE wimports.data[i] = wasm_func_as_extern(func); ++impCnt; @@ -862,6 +871,10 @@ WamrEngine::runHlp( // auto j = j_.debug(); // #endif + // currently only 1 module support, possible parallel UT run + static std::mutex m; + std::lock_guard lg(m); + // Create and instantiate the module. if (!wasmCode.empty()) { @@ -894,7 +907,8 @@ WamrEngine::runHlp( } assert(res.r.data[0].kind == WASM_I32); - + if (gas == -1) + gas = std::numeric_limits::max(); WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 635673fb9b7..57c65504e16 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -20,8 +20,8 @@ #include -#include -#include +#include +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h index af2db08ebc1..224d7431d30 100644 --- a/src/xrpld/app/misc/WasmParamsHelper.h +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -62,6 +62,7 @@ struct WasmImportFunc void* udata = nullptr; // wasm_func_callback_with_env_t void* wrap = nullptr; + uint32_t gas = 0; }; #define WASM_IMPORT_FUNC(v, f, ...) \ @@ -139,12 +140,14 @@ WasmImpFunc( std::vector& v, std::string_view imp_name, void* f_wrap, - void* data = nullptr) + void* data = nullptr, + uint32_t gas = 0) { WasmImportFunc e; e.name = imp_name; e.udata = data; e.wrap = f_wrap; + e.gas = gas; WasmImpFuncHelper(e); v.push_back(std::move(e)); } From add55c4f33afd2c7afe85216af0e4a87e9abe5d6 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 25 Jun 2025 10:04:04 -0400 Subject: [PATCH 024/212] Host functions gas cost for wasm_runtime interface (#5500) --- external/wamr/patches/ripp_metering.patch | 222 +++++++++++++++++++++- 1 file changed, 221 insertions(+), 1 deletion(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index e9ca69338f6..5a41b125b7d 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -11,6 +11,19 @@ index 88a1642b..aeb29912 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) +diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c +index b2c9ed62..87947a18 100644 +--- a/core/iwasm/aot/aot_runtime.c ++++ b/core/iwasm/aot/aot_runtime.c +@@ -5484,7 +5484,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) + import_func->func_ptr_linked = wasm_native_resolve_symbol( + import_func->module_name, import_func->func_name, + import_func->func_type, &import_func->signature, +- &import_func->attachment, &import_func->call_conv_raw); ++ &import_func->attachment, NULL, &import_func->call_conv_raw); + #if WASM_ENABLE_MULTI_MODULE != 0 + if (!import_func->func_ptr_linked) { + if (!wasm_runtime_is_built_in_module(import_func->module_name)) { diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c index 269ec577..34eb7c34 100644 --- a/core/iwasm/common/wasm_c_api.c @@ -117,8 +130,91 @@ index 5d80312f..2713a092 100644 #endif #if WASM_ENABLE_FAST_JIT != 0 +diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c +index 060bb2c3..9221c36a 100644 +--- a/core/iwasm/common/wasm_native.c ++++ b/core/iwasm/common/wasm_native.c +@@ -180,9 +180,9 @@ native_symbol_cmp(const void *native_symbol1, const void *native_symbol2) + ((const NativeSymbol *)native_symbol2)->symbol); + } + +-static void * ++static NativeSymbol * + lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, +- const char *symbol, const char **p_signature, void **p_attachment) ++ const char *symbol) + { + NativeSymbol *native_symbol, key = { 0 }; + +@@ -190,9 +190,7 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + + if ((native_symbol = bsearch(&key, native_symbols, n_native_symbols, + sizeof(NativeSymbol), native_symbol_cmp))) { +- *p_signature = native_symbol->signature; +- *p_attachment = native_symbol->attachment; +- return native_symbol->func_ptr; ++ return native_symbol; + } + + return NULL; +@@ -205,25 +203,36 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw) + { + NativeSymbolsNode *node, *node_next; + const char *signature = NULL; + void *func_ptr = NULL, *attachment = NULL; ++ NativeSymbol *native_symbol = NULL; + + node = g_native_symbols_list; + while (node) { + node_next = node->next; + if (!strcmp(node->module_name, module_name)) { +- if ((func_ptr = ++ if ((native_symbol = + lookup_symbol(node->native_symbols, node->n_native_symbols, +- field_name, &signature, &attachment)) ++ field_name)) + || (field_name[0] == '_' +- && (func_ptr = lookup_symbol( ++ && (native_symbol = lookup_symbol( + node->native_symbols, node->n_native_symbols, +- field_name + 1, &signature, &attachment)))) +- break; ++ field_name + 1)))) ++ { ++ func_ptr = native_symbol->func_ptr; ++ if(func_ptr) ++ { ++ if(gas) ++ *gas = native_symbol->gas; ++ signature = native_symbol->signature; ++ attachment = native_symbol->attachment; ++ break; ++ } ++ } + } + node = node_next; + } +diff --git a/core/iwasm/common/wasm_native.h b/core/iwasm/common/wasm_native.h +index 9a6afee1..0fe4739f 100644 +--- a/core/iwasm/common/wasm_native.h ++++ b/core/iwasm/common/wasm_native.h +@@ -52,7 +52,7 @@ wasm_native_lookup_libc_builtin_global(const char *module_name, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw); + + bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..2559be21 100644 +index dcee0aea..10c516d6 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c @@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() @@ -149,6 +245,15 @@ index dcee0aea..2559be21 100644 #endif WASMFuncType * +@@ -7348,7 +7364,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, + const char *func_name) + { + return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, +- NULL); ++ NULL, NULL); + } + + bool @@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) @@ -202,6 +307,19 @@ index 64a6cd79..f4c55e2f 100644 #endif #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +diff --git a/core/iwasm/include/lib_export.h b/core/iwasm/include/lib_export.h +index 0ca668f5..93bcf807 100644 +--- a/core/iwasm/include/lib_export.h ++++ b/core/iwasm/include/lib_export.h +@@ -24,6 +24,8 @@ typedef struct NativeSymbol { + /* attachment which can be retrieved in native API by + calling wasm_runtime_get_function_attachment(exec_env) */ + void *attachment; ++ // gas cost for import func ++ uint32_t gas; + } NativeSymbol; + + /* clang-format off */ diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h index 241a0eec..1141744c 100644 --- a/core/iwasm/include/wasm_c_api.h @@ -271,6 +389,20 @@ index b4ab34be..3fd0949f 100644 /** * Dump runtime memory consumption, including: +diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h +index ddc0b15b..3a707878 100644 +--- a/core/iwasm/interpreter/wasm.h ++++ b/core/iwasm/interpreter/wasm.h +@@ -579,6 +579,9 @@ typedef struct WASMFunctionImport { + WASMModule *import_module; + WASMFunction *import_func_linked; + #endif ++ // gas cost for import func ++ uint32 gas; ++ + } WASMFunctionImport; + + #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c index 1e98b0fa..ae24ff8b 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c @@ -470,6 +602,56 @@ index 4e5edf41..04c39e1f 100644 return; #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c +index e66c08ba..d52e677e 100644 +--- a/core/iwasm/interpreter/wasm_mini_loader.c ++++ b/core/iwasm/interpreter/wasm_mini_loader.c +@@ -636,6 +636,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + const char *linked_signature = NULL; + void *linked_attachment = NULL; + bool linked_call_conv_raw = false; ++ uint32_t gas = 0; + + read_leb_uint32(p, p_end, declare_type_index); + *p_buf = p; +@@ -647,7 +648,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + /* check built-in modules */ + linked_func = wasm_native_resolve_symbol( + sub_module_name, function_name, declare_func_type, &linked_signature, +- &linked_attachment, &linked_call_conv_raw); ++ &linked_attachment, &gas, &linked_call_conv_raw); + + function->module_name = (char *)sub_module_name; + function->field_name = (char *)function_name; +@@ -656,6 +657,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + function->signature = linked_signature; + function->attachment = linked_attachment; + function->call_conv_raw = linked_call_conv_raw; ++ function->gas = gas; + return true; + } + +diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c +index 3cc2afe0..55859d35 100644 +--- a/core/iwasm/interpreter/wasm_runtime.c ++++ b/core/iwasm/interpreter/wasm_runtime.c +@@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) + #endif + function->func_ptr_linked = wasm_native_resolve_symbol( + function->module_name, function->field_name, function->func_type, +- &function->signature, &function->attachment, &function->call_conv_raw); ++ &function->signature, &function->attachment, &function->gas, &function->call_conv_raw); + + if (function->func_ptr_linked) { + return true; +@@ -820,6 +820,7 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, + function->param_count = + (uint16)function->u.func_import->func_type->param_count; + function->param_types = function->u.func_import->func_type->types; ++ function->gas = import->u.function.gas; + function->local_cell_num = 0; + function->local_count = 0; + function->local_types = NULL; diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h index 8d38c883..a687ab89 100644 --- a/core/iwasm/interpreter/wasm_runtime.h @@ -485,6 +667,44 @@ index 8d38c883..a687ab89 100644 #if WASM_ENABLE_MULTI_MODULE != 0 WASMModuleInstance *import_module_inst; WASMFunctionInstance *import_func_inst; +diff --git a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +index a68c0749..cafb6915 100644 +--- a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c ++++ b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +@@ -1038,16 +1038,16 @@ print_f64_wrapper(wasm_exec_env_t exec_env, double f64) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, func_name##_wrapper, signature, NULL } ++ { #func_name, func_name##_wrapper, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_builtin[] = { + REG_NATIVE_FUNC(printf, "($*)i"), + REG_NATIVE_FUNC(sprintf, "($$*)i"), + REG_NATIVE_FUNC(snprintf, "(*~$*)i"), +- { "vprintf", printf_wrapper, "($*)i", NULL }, +- { "vsprintf", sprintf_wrapper, "($$*)i", NULL }, +- { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL }, ++ { "vprintf", printf_wrapper, "($*)i", NULL, 0 }, ++ { "vsprintf", sprintf_wrapper, "($$*)i", NULL, 0 }, ++ { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL, 0 }, + REG_NATIVE_FUNC(puts, "($)i"), + REG_NATIVE_FUNC(putchar, "(i)i"), + REG_NATIVE_FUNC(memcmp, "(**~)i"), +diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +index 6d057a6a..25879f33 100644 +--- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c ++++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +@@ -2257,7 +2257,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, wasi_##func_name, signature, NULL } ++ { #func_name, wasi_##func_name, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_wasi[] = { diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h index ac1a95ea..e23b500e 100644 --- a/core/shared/platform/include/platform_wasi_types.h From 1cd16fab8779c26b304418a3f7f1e9ed6c99bc76 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 27 Jun 2025 09:59:28 -0400 Subject: [PATCH 025/212] Host-functions perf test fixes (#5514) --- src/test/app/Escrow_test.cpp | 1 - src/test/app/Wasm_test.cpp | 666 +++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 47 ++ src/test/app/wasm_fixtures/fixtures.h | 4 + src/xrpld/app/misc/WamrVM.cpp | 26 + src/xrpld/app/misc/WasmHostFuncImpl.cpp | 98 +-- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 11 +- 7 files changed, 813 insertions(+), 40 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index d052415f9f4..197fab8aaad 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -30,7 +30,6 @@ #include #include -#include #include namespace ripple { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c5bd2278df7..19b7946f5bf 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -22,6 +22,8 @@ #include #include +#include +#include #include @@ -385,6 +387,571 @@ struct TestHostFunctionsSink : public TestHostFunctions } }; +struct PerfHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + + Keylet leKey; + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::shared_ptr tx_; + + void const* rt_ = nullptr; + +public: + PerfHostFunctions( + test::jtx::Env& env, + Keylet const& k, + std::shared_ptr&& tx) + : env_(env), leKey(k), tx_(std::move(tx)) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + int32_t + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + int32_t + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count(); + } + + Hash + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + virtual int32_t + cacheLedgerObj(Keylet const&, int32_t cacheIdx) override + { + static int32_t intIdx = 0; + + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cacheIdx) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + if (cacheIdx >= MAX_CACHE) + cacheIdx = intIdx++ % MAX_CACHE; + } + else + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return HF_ERR_SLOTS_FULL; + + cache[cacheIdx] = env_.le(leKey); + return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; + } + + static Bytes + getAnyFieldData(STBase const& obj) + { + // auto const& fname = obj.getFName(); + auto const stype = obj.getSType(); + switch (stype) + { + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); + } + + Expected + getTxField(SField const& fname) override + { + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + static Expected + locateField(STObject const& obj, Slice const& loc) + { + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + { + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + field = &(arr->operator[](c)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + } + + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } + + return field; + } + + Expected + getTxNestedField(Slice const& locator) override + { + // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << + // std::endl; + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HF_ERR_SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + int32_t + getTxArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const* field = tx_->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getCurrentLedgerObjArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + auto const sle = env_.le(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + auto const* field = sle->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return HF_ERR_NO_ARRAY; + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return HF_ERR_FIELD_NOT_FOUND; + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getTxNestedArrayLen(Slice const& locator) override + { + auto const r = locateField(*tx_, locator); + if (!r) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + auto const r = locateField(*sle, locator); + if (!r) + return r.error(); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return HF_ERR_SLOT_OUT_RANGE; + + if (!cache[cacheIdx]) + { + // return Unexpected(HF_ERR_INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return r.error(); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return HF_ERR_NO_ARRAY; + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + int32_t + updateData(Bytes const& data) override + { + ripple::detail::ApplyViewBase v( + env_.app().openLedger().current().get(), tapNONE); + + auto sle = v.peek(leKey); + if (!sle) + return HF_ERR_LEDGER_OBJ_NOT_FOUND; + + sle->setFieldVL(sfData, data); + v.update(sle); + + return data.size(); + } + + Hash + computeSha512HalfHash(Bytes const& data) override + { + auto const hash = sha512Half(data); + return hash; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Bytes const& credentialType) override + { + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HF_ERR_INVALID_PARAMS); + + auto const keylet = + keylet::credential(subject, issuer, makeSlice(credentialType)); + + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + return Unexpected(HF_ERR_INVALID_PARAMS); + } + + auto obj = nft::findToken(*env_.current(), account, nftId); + if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; + return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + } + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); + } + + int32_t + trace(std::string const& msg, Bytes const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().error(); +#endif + if (!asHex) + j << msg + << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + auto const hex = + boost::algorithm::hex(std::string(data.begin(), data.end())); + j << msg << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + int32_t + traceNum(std::string const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().error(); +#endif + j << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + struct Wasm_test : public beast::unit_test::suite { void @@ -831,6 +1398,103 @@ struct Wasm_test : public beast::unit_test::suite } } + void + perfTest() + { + testcase("Perf test host functions"); + + using namespace jtx; + using namespace std::chrono; + + std::string const funcName("finish"); + // std::string const funcName("test"); + auto const& wasmHex = hfPerfTest; + // auto const& wasmHex = opcCallPerfTest; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + std::string const credType = "abcde"; + std::string const credType2 = "fghijk"; + std::string const credType3 = "0123456"; + // char const uri[] = "uri"; + + Account const alan{"alan"}; + Account const bob{"bob"}; + Account const issuer{"issuer"}; + + { + Env env(*this); + // Env env(*this, envconfig(), {}, nullptr, + // beast::severities::kTrace); + env.fund(XRP(5000), alan, bob, issuer); + env.close(); + + // // create escrow + // auto const seq = env.seq(alan); + // auto const k = keylet::escrow(alan, seq); + // // auto const allowance = 3'600; + // auto escrowCreate = escrow::create(alan, bob, XRP(1000)); + // XRPAmount txnFees = env.current()->fees().base + 1000; + // env(escrowCreate, + // escrow::finish_function(wasmHex), + // escrow::finish_time(env.now() + 11s), + // escrow::cancel_time(env.now() + 100s), + // escrow::data("1000000000"), // 1000 XRP in drops + // memodata("memo1234567"), + // memodata("2memo1234567"), + // fee(txnFees)); + + // // create depositPreauth + // auto const k = keylet::depositPreauth( + // bob, + // {{issuer.id(), makeSlice(credType)}, + // {issuer.id(), makeSlice(credType2)}, + // {issuer.id(), makeSlice(credType3)}}); + // env(deposit::authCredentials( + // bob, + // {{issuer, credType}, + // {issuer, credType2}, + // {issuer, credType3}})); + + // cREATE nft + [[maybe_unused]] uint256 const nft0{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + auto const k = keylet::nftoffer(alan, 0); + [[maybe_unused]] uint256 const nft1{ + token::getNextID(env, alan, 0u)}; + + env(token::mint(alan, 0u), + token::uri( + "https://github.com/XRPLF/XRPL-Standards/discussions/" + "279?id=github.com/XRPLF/XRPL-Standards/discussions/" + "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" + "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" + "279&aot=github.com/XRPLF/XRPL-Standards/disc")); + [[maybe_unused]] uint256 const nft2{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + env.close(); + + PerfHostFunctions nfs(env, k, env.tx()); + + auto re = runEscrowWasm(wasm, funcName, {}, &nfs); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + std::cout << "Res: " << re->result << " cost: " << re->cost + << std::endl; + } + + // env(escrow::finish(alan, alan, seq), + // escrow::comp_allowance(allowance), + // fee(txnFees), + // ter(tesSUCCESS)); + + env.close(); + } + } + void run() override { @@ -853,6 +1517,8 @@ struct Wasm_test : public beast::unit_test::suite // TODO: fix result testEscrowWasmDN1(); testEscrowWasmDN2(); + + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 10330f93bf7..146c4338a03 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11709,3 +11709,50 @@ extern std::string const reqNonexistentField = "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const hfPerfTest = + "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" + "6000017f021d0203656e760974726163655f6e756d000003656e76057472" + "616365000103030202030503010002068601167f0041a0090b7f0041a011" + "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" + "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" + "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" + "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" + "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300020666696e6973680003036275660300076c6f635f6275660301" + "036d73670302086572725f686561640303096572725f646174613103040a" + "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" + "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" + "746103090753465f44617461030a1753465f417574686f72697a65437265" + "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" + "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" + "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" + "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" + "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" + "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" + "0300200041086a22000d000b41d811420037030041d011420037030041c8" + "11420037030041c011420037030041b811420037030041b0114200370300" + "41a811428d801c37030041a011429a803c3703000240034041e008411020" + "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" + "1441c0084113410010011a0b41010b0b840104004180080b340100080003" + "00080009000f000a000e000d0007001b0007001a000f0000000000676574" + "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" + "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" + "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" + "007f0970726f647563657273010c70726f6365737365642d62790105636c" + "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" + "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" + "346235613264623538323935386166316565333038613739306366646234" + "32626432343732302900490f7461726765745f6665617475726573042b0f" + "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" + "6572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const opcCallPerfTest = + "0061736d010000000112046000017e60027f7f017f6000017f6000000304" + "0303020104050170010101050401008002061c047f0141b08880040b7f00" + "41ac080b7f0041b08880040b7f01410a0b073305066d656d6f7279020004" + "6d61696e0002047465737400010a5f5f646174615f656e6403010b5f5f68" + "6561705f6261736503020a4e030400010f0b3b04017f017c017f027e4180" + "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" + "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" + "0b0e01004180080b07623a2025660a00"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 308c2668bd7..d1c689a0162 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -56,3 +56,7 @@ extern std::string const xrplStdExampleHex; extern std::string const hostFunctions2Hex; extern std::string const reqNonexistentField; + +extern std::string const hfPerfTest; + +extern std::string const opcCallPerfTest; diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index b44c4bac2ec..cefee723f58 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -28,6 +28,8 @@ // #define DEBUG_OUTPUT_WAMR 1 #endif +// #define SHOW_CALL_TIME 1 + namespace ripple { namespace { @@ -738,6 +740,18 @@ WamrEngine::call(FuncInfo const& f, Types&&... args) return call(f, in, std::forward(args)...); } +#ifdef SHOW_CALL_TIME +static inline uint64_t +usecs() +{ + uint64_t x = + std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); + return x; +} +#endif + template WamrResult WamrEngine::call(FuncInfo const& f, std::vector& in) @@ -762,7 +776,19 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) in.size(), sizeof(std::remove_reference_t::value_type), nullptr}; + +#ifdef SHOW_CALL_TIME + auto const start = usecs(); +#endif + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); + +#ifdef SHOW_CALL_TIME + auto const finish = usecs(); + auto const delta_ms = (finish - start) / 1000; + std::cout << "wasm_func_call: " << delta_ms << "ms" << std::endl; +#endif + if (trap) { ret.f = true; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6c19db6dc42..71236034afc 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -39,7 +39,7 @@ WasmHostFunctionsImpl::getLedgerSqn() int32_t WasmHostFunctionsImpl::getParentLedgerTime() { - return ctx.view().parentCloseTime().time_since_epoch().count(); // TODO try + return ctx.view().parentCloseTime().time_since_epoch().count(); } Hash @@ -70,7 +70,7 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; } -Bytes +static Bytes getAnyFieldData(STBase const& obj) { // auto const& fname = obj.getFName(); @@ -132,6 +132,9 @@ WasmHostFunctionsImpl::getTxField(SField const& fname) auto const* field = ctx.tx.peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -145,6 +148,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) auto const* field = sle->peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); return getAnyFieldData(*field); } @@ -162,14 +167,16 @@ WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) auto const* field = cache[cacheIdx]->peekAtPField(fname); if (!field) return Unexpected(HF_ERR_FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); return getAnyFieldData(*field); } static Expected -locateField(STObject const* obj, Slice const& loc) +locateField(STObject const& obj, Slice const& loc) { - if (loc.size() % 4) + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 return Unexpected(HF_ERR_LOCATOR_MALFORMED); int32_t const* l = reinterpret_cast(loc.data()); @@ -177,22 +184,23 @@ locateField(STObject const* obj, Slice const& loc) STBase const* field = nullptr; auto const& m = SField::getKnownCodeToField(); - for (int i = 0; i < sz; ++i) { - int32_t const c = l[i]; + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } - if (!field) - { - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - auto const& fname(*it->second); + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; - field = obj->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - else if (STI_ARRAY == field->getSType()) + if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); if (c >= arr->size()) @@ -205,18 +213,19 @@ locateField(STObject const* obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HF_ERR_LOCATOR_MALFORMED); auto const& fname(*it->second); field = o->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); } - } + else // simple field must be the last one + { + return Unexpected(HF_ERR_LOCATOR_MALFORMED); + } - if (!field || (STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + } return field; } @@ -224,11 +233,14 @@ locateField(STObject const* obj, Slice const& loc) Expected WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { - auto const r = locateField(&ctx.tx, locator); - if (!r.has_value()) + auto const r = locateField(ctx.tx, locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -239,11 +251,14 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) if (!sle) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - auto const r = locateField(sle.get(), locator); - if (!r.has_value()) + auto const r = locateField(*sle, locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -259,11 +274,14 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( if (!cache[cacheIdx]) return Unexpected(HF_ERR_INVALID_SLOT); - auto const r = locateField(cache[cacheIdx].get(), locator); - if (!r.has_value()) + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) return Unexpected(r.error()); auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) + return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return getAnyFieldData(*field); } @@ -333,8 +351,8 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( int32_t WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) { - auto const r = locateField(&ctx.tx, locator); - if (!r.has_value()) + auto const r = locateField(ctx.tx, locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -351,8 +369,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) auto const sle = ctx.view().read(leKey); if (!sle) return HF_ERR_LEDGER_OBJ_NOT_FOUND; - auto const r = locateField(sle.get(), locator); - if (!r.has_value()) + auto const r = locateField(*sle, locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -375,8 +393,8 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( if (!cache[cacheIdx]) return HF_ERR_INVALID_SLOT; - auto const r = locateField(cache[cacheIdx].get(), locator); - if (!r.has_value()) + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) return r.error(); auto const* field = r.value(); @@ -445,7 +463,7 @@ WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, std::uint32_t documentId) { - if (!account || account.isZero()) + if (!account) return Unexpected(HF_ERR_INVALID_ACCOUNT); auto const keylet = keylet::oracle(account, documentId); return Bytes{keylet.key.begin(), keylet.key.end()}; @@ -467,7 +485,11 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); } - Slice const s = obj->at(sfURI); + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index b654c16aa54..9b5968c31d1 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -34,6 +34,9 @@ setData( uint8_t const* src, int32_t ssz) { + if (!ssz) + return 0; + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) @@ -51,6 +54,9 @@ setData( static Expected getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) { + if (!ssz) + return Unexpected(HF_ERR_INVALID_PARAMS); + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return Unexpected(HF_ERR_NO_MEM_EXPORTED); @@ -66,7 +72,7 @@ static Expected getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) { auto const r = getData(rt, ptr, sz); - if (r->size() < AccountID::bytes) + if (!r || (r->size() < AccountID::bytes)) return Unexpected(HF_ERR_INVALID_PARAMS); return AccountID::fromVoid(r->data()); @@ -75,6 +81,9 @@ getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) static Expected getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) { + if (!ssz) + return Unexpected(HF_ERR_INVALID_PARAMS); + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return Unexpected(HF_ERR_NO_MEM_EXPORTED); From 463acf51b5418bd6087ae125f56f48f455274e2d Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 30 Jun 2025 09:34:38 -0400 Subject: [PATCH 026/212] preflight checks for wasm (#5517) --- include/xrpl/protocol/TER.h | 2 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/Escrow_test.cpp | 23 ++ src/test/app/Wasm_test.cpp | 63 ++++-- src/xrpld/app/misc/WamrVM.cpp | 325 +++++++++++++++++------------ src/xrpld/app/misc/WamrVM.h | 52 +++-- src/xrpld/app/misc/WasmVM.cpp | 67 ++++-- src/xrpld/app/misc/WasmVM.h | 16 ++ src/xrpld/app/tx/detail/Escrow.cpp | 9 +- 9 files changed, 385 insertions(+), 173 deletions(-) diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index aa838a736e7..9fd73520d5f 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -141,6 +141,8 @@ enum TEMcodes : TERUnderlyingType { temARRAY_TOO_LARGE, temBAD_TRANSFER_FEE, temINVALID_INNER_BATCH, + + temBAD_WASM, }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 85b0d702595..35cf23d50e0 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -223,6 +223,7 @@ transResults() MAKE_ERROR(temARRAY_TOO_LARGE, "Malformed: Array is too large."), MAKE_ERROR(temBAD_TRANSFER_FEE, "Malformed: Transfer fee is outside valid range."), MAKE_ERROR(temINVALID_INNER_BATCH, "Malformed: Invalid inner batch transaction."), + MAKE_ERROR(temBAD_WASM, "Malformed: Provided WASM code is invalid."), MAKE_ERROR(terRETRY, "Retry transaction."), MAKE_ERROR(terFUNDS_SPENT, "DEPRECATED."), diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 197fab8aaad..23b2c29c787 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1843,6 +1843,29 @@ struct Escrow_test : public beast::unit_test::suite ter(temMALFORMED)); env.close(); } + + { + // FinishFunction nonexistent host function + // pub fn finish() -> bool { + // unsafe { host_lib::bad() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02100108686f73745f6c696203626164" + "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" + "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" + "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" + "726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235" + "3020323032352d30332d31352900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + env(escrowCreate, + escrow::finish_function(badWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temBAD_WASM)); + env.close(); + } } void diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 19b7946f5bf..52d30835612 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1188,15 +1188,55 @@ struct Wasm_test : public beast::unit_test::suite testcase("bad wasm test"); using namespace test::jtx; - Env env{*this}; + Env env{*this}; HostFunctions hfs; - auto wasmHex = "00000000"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(!re && re.error()); + + { + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + BEAST_EXPECT(!re); + } + + { + auto wasmHex = "00112233445566778899AA"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + + { + // FinishFunction wrong function name + // pub fn bad() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" + "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" + "100041044a0b004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("finish"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } } void @@ -1319,14 +1359,11 @@ struct Wasm_test : public beast::unit_test::suite return occurrences; }; + auto const s = sink.messages().str(); BEAST_EXPECT( - countSubstr( - sink.messages().str(), "WAMR Error: failed to call func") == - 1); + countSubstr(s, "WAMR Error: failed to call func") == 1); BEAST_EXPECT( - countSubstr( - sink.messages().str(), - "WAMR Exception: wasm operand stack overflow") == 1); + countSubstr(s, "Exception: wasm operand stack overflow") > 0); } { diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index cefee723f58..9ad697b1c10 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -133,28 +133,22 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) auto j = jlog.error(); #endif - j << "WAMR Error: " << msg; + wasm_byte_vec_t error_message WASM_EMPTY_VEC; if (trap) - { - wasm_byte_vec_t error_message; - wasm_trap_message(trap, &error_message); - if (error_message.num_elems) - { - j << -#ifdef DEBUG_OUTPUT - "\nWAMR " -#else - "WAMR " -#endif - << error_message.data; - } - if (error_message.size) - wasm_byte_vec_delete(&error_message); - wasm_trap_delete(trap); + if (error_message.num_elems) + { + error_message.data[error_message.num_elems - 1] = 0; // just in case + j << "WAMR Error: " << msg << ", " << error_message.data; } + else + j << "WAMR Error: " << msg; + + if (error_message.size) + wasm_byte_vec_delete(&error_message); + wasm_trap_delete(trap); #ifdef DEBUG_OUTPUT j << std::endl; @@ -185,21 +179,21 @@ InstanceWrapper::init( if (!mi || trap) { print_wasm_error("can't create instance", trap, j); - throw std::runtime_error("WAMR can't create instance"); + throw std::runtime_error("can't create instance"); } wasm_instance_exports(mi.get(), expt); return mi; } InstanceWrapper::InstanceWrapper() - : exports{0, nullptr, 0, 0, nullptr} - , mod_inst(nullptr, &wasm_instance_delete) + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) { } InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) - : exports{0, nullptr, 0, 0, nullptr} - , mod_inst(nullptr, &wasm_instance_delete) + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } @@ -211,18 +205,18 @@ InstanceWrapper::InstanceWrapper( int64_t gas, wasm_extern_vec_t const& imports, beast::Journal j) - : exports WASM_EMPTY_VEC - , mod_inst(init(s, m, maxPages, &exports, imports, j)) - , exec_env(wasm_instance_exec_env(mod_inst.get())) + : exports_ WASM_EMPTY_VEC + , instance_(init(s, m, maxPages, &exports_, imports, j)) + , execEnv_(wasm_instance_exec_env(instance_.get())) , j_(j) { - wasm_runtime_set_instruction_count_limit(exec_env, gas); + wasm_runtime_set_instruction_count_limit(execEnv_, gas); } InstanceWrapper::~InstanceWrapper() { - if (exports.size) - wasm_extern_vec_delete(&exports); + if (exports_.size) + wasm_extern_vec_delete(&exports_); } InstanceWrapper& @@ -231,14 +225,14 @@ InstanceWrapper::operator=(InstanceWrapper&& o) if (this == &o) return *this; - if (exports.size) - wasm_extern_vec_delete(&exports); - exports = o.exports; - o.exports = {0, nullptr, 0, 0, nullptr}; + if (exports_.size) + wasm_extern_vec_delete(&exports_); + exports_ = o.exports_; + o.exports_ = {0, nullptr, 0, 0, nullptr}; - mod_inst = std::move(o.mod_inst); - exec_env = o.exec_env; - o.exec_env = nullptr; + instance_ = std::move(o.instance_); + execEnv_ = o.execEnv_; + o.execEnv_ = nullptr; j_ = o.j_; @@ -247,7 +241,7 @@ InstanceWrapper::operator=(InstanceWrapper&& o) InstanceWrapper::operator bool() const { - return static_cast(mod_inst); + return static_cast(instance_); } FuncInfo @@ -258,13 +252,13 @@ InstanceWrapper::getFunc( wasm_func_t* f = nullptr; wasm_functype_t* ft = nullptr; - if (!mod_inst) - throw std::runtime_error("WAMR no module instance"); + if (!instance_) + throw std::runtime_error("no instance"); if (!export_types.num_elems) - throw std::runtime_error("WAMR no export"); - if (export_types.num_elems != exports.num_elems) - throw std::runtime_error("WAMR invalid export"); + throw std::runtime_error("no export"); + if (export_types.num_elems != exports_.num_elems) + throw std::runtime_error("invalid export"); for (unsigned i = 0; i < export_types.num_elems; ++i) { @@ -276,9 +270,9 @@ InstanceWrapper::getFunc( { if (funcName == std::string_view(name->data, name->size - 1)) { - auto* exn(exports.data[i]); + auto* exn(exports_.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error("WAMR invalid export"); + throw std::runtime_error("invalid export"); ft = wasm_externtype_as_functype( const_cast(exn_type)); @@ -290,7 +284,7 @@ InstanceWrapper::getFunc( if (!f || !ft) throw std::runtime_error( - "WAMR can't find function <" + std::string(funcName) + ">"); + "can't find function <" + std::string(funcName) + ">"); return {f, ft}; } @@ -298,13 +292,13 @@ InstanceWrapper::getFunc( wmem InstanceWrapper::getMem() const { - if (!mod_inst) - throw std::runtime_error("WAMR no module instance"); + if (!instance_) + throw std::runtime_error("no instance"); wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports.num_elems; ++i) + for (unsigned i = 0; i < exports_.num_elems; ++i) { - auto* e(exports.data[i]); + auto* e(exports_.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) { mem = wasm_extern_as_memory(e); @@ -313,7 +307,7 @@ InstanceWrapper::getMem() const } if (!mem) - throw std::runtime_error("WAMR no memory exported"); + throw std::runtime_error("no memory exported"); return { reinterpret_cast(wasm_memory_data(mem)), @@ -323,7 +317,7 @@ InstanceWrapper::getMem() const std::int64_t InstanceWrapper::getGas() const { - return exec_env ? wasm_runtime_get_instruction_count_limit(exec_env) : 0; + return execEnv_ ? wasm_runtime_get_instruction_count_limit(execEnv_) : 0; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -339,22 +333,20 @@ ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) nullptr}; ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); if (!m) - { - print_wasm_error("can't create module", nullptr, j); - throw std::runtime_error("WAMR can't create module"); - } + throw std::runtime_error("can't create module"); + return m; } ModuleWrapper::ModuleWrapper() - : module(nullptr, &wasm_module_delete) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} { } ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) - : module(nullptr, &wasm_module_delete) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} { *this = std::move(o); } @@ -367,11 +359,11 @@ ModuleWrapper::ModuleWrapper( int64_t gas, std::vector const& imports, beast::Journal j) - : module(init(s, wasmBin, j)) - , export_types{0, nullptr, 0, 0, nullptr} + : module_(init(s, wasmBin, j)) + , exportTypes_{0, nullptr, 0, 0, nullptr} , j_(j) { - wasm_module_exports(module.get(), &export_types); + wasm_module_exports(module_.get(), &exportTypes_); if (instantiate) { auto wimports = buildImports(s, imports); @@ -381,8 +373,8 @@ ModuleWrapper::ModuleWrapper( ModuleWrapper::~ModuleWrapper() { - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); } ModuleWrapper& @@ -391,12 +383,12 @@ ModuleWrapper::operator=(ModuleWrapper&& o) if (this == &o) return *this; - module = std::move(o.module); - mod_inst = std::move(o.mod_inst); - if (export_types.size) - wasm_exporttype_vec_delete(&export_types); - export_types = o.export_types; - o.export_types = {0, nullptr, 0, 0, nullptr}; + module_ = std::move(o.module_); + instanceWrap_ = std::move(o.instanceWrap_); + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); + exportTypes_ = o.exportTypes_; + o.exportTypes_ = {0, nullptr, 0, 0, nullptr}; j_ = o.j_; return *this; @@ -404,7 +396,7 @@ ModuleWrapper::operator=(ModuleWrapper&& o) ModuleWrapper::operator bool() const { - return mod_inst; + return instanceWrap_; } void @@ -437,7 +429,7 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[i] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("WAMR Invalid import type"); + throw std::runtime_error("invalid import type"); } } } @@ -464,7 +456,7 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) v.data[0] = wasm_valtype_new_f64(); break; default: - throw std::runtime_error("WAMR Invalid return type"); + throw std::runtime_error("invalid return type"); } } else @@ -477,7 +469,7 @@ ModuleWrapper::buildImports( std::vector const& imports) { wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; - wasm_module_imports(module.get(), &importTypes); + wasm_module_imports(module_.get(), &importTypes); std:: unique_ptr itDeleter(&importTypes, &wasm_importtype_vec_delete); @@ -572,19 +564,19 @@ ModuleWrapper::buildImports( FuncInfo ModuleWrapper::getFunc(std::string_view funcName) const { - return mod_inst.getFunc(funcName, export_types); + return instanceWrap_.getFunc(funcName, exportTypes_); } wmem ModuleWrapper::getMem() const { - return mod_inst.getMem(); + return instanceWrap_.getMem(); } InstanceWrapper const& ModuleWrapper::getInstance(int) const { - return mod_inst; + return instanceWrap_; } int @@ -594,7 +586,7 @@ ModuleWrapper::addInstance( int64_t gas, wasm_extern_vec_t const& imports) { - mod_inst = {s, module.get(), maxPages, gas, imports, j_}; + instanceWrap_ = {s, module_.get(), maxPages, gas, imports, j_}; return 0; } @@ -611,7 +603,7 @@ ModuleWrapper::addInstance( std::int64_t ModuleWrapper::getGas() { - return mod_inst.getGas(); + return instanceWrap_.getGas(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -625,8 +617,8 @@ ModuleWrapper::getGas() // } WamrEngine::WamrEngine() - : engine(wasm_engine_new(), &wasm_engine_delete) - , store(nullptr, &wasm_store_delete) + : engine_(wasm_engine_new(), &wasm_engine_delete) + , store_(nullptr, &wasm_store_delete) { wasm_runtime_set_default_running_mode(Mode_Interp); wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); @@ -640,19 +632,16 @@ WamrEngine::addModule( int64_t gas, std::vector const& imports) { - module.reset(); - store.reset(); // to free the memory before creating new store - store = {wasm_store_new(engine.get()), &wasm_store_delete}; - module = std::make_unique( - store.get(), wasmCode, instantiate, defMaxPages, gas, imports, j_); + moduleWrap_.reset(); + store_.reset(); // to free the memory before creating new store + store_ = {wasm_store_new(engine_.get()), &wasm_store_delete}; + moduleWrap_ = std::make_unique( + store_.get(), wasmCode, instantiate, defMaxPages_, gas, imports, j_); - if (!module) - { - print_wasm_error("can't create module wrapper", nullptr, j_); - throw std::runtime_error("WAMR can't create module wrapper"); - } + if (!moduleWrap_) + throw std::runtime_error("can't create module wrapper"); - return module ? 0 : -1; + return moduleWrap_ ? 0 : -1; } // int @@ -664,7 +653,7 @@ WamrEngine::addModule( FuncInfo WamrEngine::getFunc(std::string_view funcName) { - return module->getFunc(funcName); + return moduleWrap_->getFunc(funcName); } std::vector @@ -699,6 +688,8 @@ WamrEngine::convertParams(std::vector const& params) } break; default: + throw std::runtime_error( + "unknown parameter type: " + std::to_string(p.type)); break; } } @@ -706,6 +697,25 @@ WamrEngine::convertParams(std::vector const& params) return v; } +int +WamrEngine::compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p) +{ + if (ftp->num_elems != p.size()) + return std::min(ftp->num_elems, p.size()); + + for (unsigned i = 0; i < ftp->num_elems; ++i) + { + auto const t1 = wasm_valtype_kind(ftp->data[i]); + auto const t2 = p[i].kind; + if (t1 != t2) + return i; + } + + return -1; +} + void WamrEngine::add_param(std::vector& in, int32_t p) { @@ -761,13 +771,6 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } - auto const* ftp = wasm_functype_params(f.second); - if (ftp->num_elems != in.size()) - { - print_wasm_error("invalid num of params to call func", nullptr, j_); - return ret; - } - wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC : wasm_val_vec_t{ @@ -877,7 +880,7 @@ WamrEngine::run( } catch (...) { - print_wasm_error(std::string("unknown exception"), nullptr, j_); + print_wasm_error(std::string("exception: unknown"), nullptr, j_); } return Unexpected(tecFAILED_PROCESSING); } @@ -891,15 +894,8 @@ WamrEngine::runHlp( HostFunctions* hfs, int64_t gas) { - // #ifdef DEBUG_OUTPUT - // auto& j = std::cerr; - // #else - // auto j = j_.debug(); - // #endif - // currently only 1 module support, possible parallel UT run - static std::mutex m; - std::lock_guard lg(m); + std::lock_guard lg(m_); // Create and instantiate the module. if (!wasmCode.empty()) @@ -907,65 +903,130 @@ WamrEngine::runHlp( [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); } - if (!module || !module->mod_inst) - { - print_wasm_error("no instance to run", nullptr, j_); - return Unexpected(tecFAILED_PROCESSING); - } + if (!moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); if (hfs) hfs->setRT(&getRT()); // Call main - auto f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + + // not const because passed directly to wamr function (which accept non + // const) auto p = convertParams(params); - auto res = call<1>(f, p); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + auto const res = call<1>(f, p); if (res.f) - { - return Unexpected(tecFAILED_PROCESSING); - } + throw std::runtime_error("<" + std::string(funcName) + "> failed"); else if (!res.r.num_elems) - { - print_wasm_error( - "<" + std::string(funcName) + "> return nothing", nullptr, j_); - return Unexpected(tecFAILED_PROCESSING); - } + throw std::runtime_error( + "<" + std::string(funcName) + "> return nothing"); assert(res.r.data[0].kind == WASM_I32); if (gas == -1) gas = std::numeric_limits::max(); - WasmResult const ret{res.r.data[0].of.i32, gas - module->getGas()}; + WasmResult const ret{ + res.r.data[0].of.i32, gas - moduleWrap_->getGas()}; + // #ifdef DEBUG_OUTPUT + // auto& j = std::cerr; + // #else + // auto j = j_.debug(); + // #endif // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + return ret; } +NotTEC +WamrEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); + try + { + return checkHlp(wasmCode, funcName, params, imports); + } + catch (std::exception const& e) + { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); + } + catch (...) + { + print_wasm_error(std::string("exception: unknown"), nullptr, j_); + } + + return temBAD_WASM; +} + +NotTEC +WamrEngine::checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports) +{ + // currently only 1 module support, possible parallel UT run + std::lock_guard lg(m_); + + // Create and instantiate the module. + if (wasmCode.empty()) + throw std::runtime_error("empty nodule"); + + int const m = addModule(wasmCode, true, -1, imports); + if ((m < 0) || !moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); + + // Looking for a func and compare parameter types + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + auto const p = convertParams(params); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + return tesSUCCESS; +} + std::int32_t WamrEngine::initMaxPages(std::int32_t def) { - defMaxPages = def; + defMaxPages_ = def; return def; } std::int64_t WamrEngine::getGas() { - return module ? module->getGas() : 0; + return moduleWrap_ ? moduleWrap_->getGas() : 0; } wmem WamrEngine::getMem() const { - return module ? module->getMem() : wmem(); + return moduleWrap_ ? moduleWrap_->getMem() : wmem(); } InstanceWrapper const& WamrEngine::getRT(int m, int i) { - if (!module) - throw std::runtime_error("WAMR no module"); - return module->getInstance(i); + if (!moduleWrap_) + throw std::runtime_error("no module"); + return moduleWrap_->getInstance(i); } int32_t @@ -976,7 +1037,7 @@ WamrEngine::allocate(int32_t sz) if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || !res.r.data[0].of.i32) throw std::runtime_error( - "WAMR can't allocate memory, " + std::to_string(sz) + " bytes"); + "can't allocate memory, " + std::to_string(sz) + " bytes"); return res.r.data[0].of.i32; } @@ -988,7 +1049,7 @@ WamrEngine::newTrap(std::string_view txt) if (!txt.empty()) wasm_name_new(&msg, txt.size(), txt.data()); - return wasm_trap_new(store.get(), &msg); + return wasm_trap_new(store_.get(), &msg); } beast::Journal diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/misc/WamrVM.h index 57c65504e16..3be35c673ee 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/misc/WamrVM.h @@ -28,17 +28,20 @@ namespace ripple { struct WamrResult { wasm_val_vec_t r; - bool f; + bool f; // failure flag + WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) { if (N) wasm_val_vec_new_uninitialized(&r, N); } + ~WamrResult() { if (r.size) wasm_val_vec_delete(&r); } + WamrResult(WamrResult const&) = delete; WamrResult& operator=(WamrResult const&) = delete; @@ -47,6 +50,7 @@ struct WamrResult { *this = std::move(o); } + WamrResult& operator=(WamrResult&& o) { @@ -67,9 +71,9 @@ using FuncInfo = std::pair; struct InstanceWrapper { - wasm_extern_vec_t exports; - InstancePtr mod_inst; - wasm_exec_env_t exec_env = nullptr; + wasm_extern_vec_t exports_; + InstancePtr instance_; + wasm_exec_env_t execEnv_ = nullptr; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: @@ -116,9 +120,9 @@ struct InstanceWrapper struct ModuleWrapper { - ModulePtr module; - InstanceWrapper mod_inst; - wasm_exporttype_vec_t export_types; + ModulePtr module_; + InstanceWrapper instanceWrap_; + wasm_exporttype_vec_t exportTypes_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: @@ -171,12 +175,14 @@ struct ModuleWrapper class WamrEngine { - std::unique_ptr engine; - std::unique_ptr store; - std::unique_ptr module; - std::int32_t defMaxPages = -1; + std::unique_ptr engine_; + std::unique_ptr store_; + std::unique_ptr moduleWrap_; + std::int32_t defMaxPages_ = -1; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); + std::mutex m_; // 1 instance mutex + public: WamrEngine(); ~WamrEngine() = default; @@ -190,6 +196,14 @@ class WamrEngine int64_t gas, beast::Journal j); + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j); + std::int32_t initMaxPages(std::int32_t def); @@ -222,6 +236,13 @@ class WamrEngine HostFunctions* hfs, int64_t gas); + NotTEC + checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports); + int addModule( Bytes const& wasmCode, @@ -247,9 +268,14 @@ class WamrEngine std::vector convertParams(std::vector const& params); - void + static int + compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p); + + static void add_param(std::vector& in, int32_t p); - void + static void add_param(std::vector& in, int64_t p); template diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index dbfcfe549c0..b21007b9d8d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -29,19 +29,9 @@ namespace ripple { -Expected -runEscrowWasm( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params, - HostFunctions* hfs, - int64_t gasLimit, - beast::Journal j) +static std::vector +createImports(HostFunctions* hfs) { - // create VM and set cost limit - auto& vm = WasmEngine::instance(); - vm.initMaxPages(MAX_PAGES); - std::vector imports; if (hfs) @@ -107,11 +97,27 @@ runEscrowWasm( WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); } - auto ret = vm.run( + return imports; +} + +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + int64_t gasLimit, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.run( wasmCode, funcName, params, - imports, + createImports(hfs), hfs, gasLimit, hfs ? hfs->getJournal() : j); @@ -130,6 +136,28 @@ runEscrowWasm( return EscrowResult{ret->result > 0, ret->cost}; } +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.check( + wasmCode, + funcName, + params, + createImports(hfs), + hfs ? hfs->getJournal() : j); + + return ret; +} + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WasmEngine::WasmEngine() : impl(std::make_unique()) @@ -156,6 +184,17 @@ WasmEngine::run( return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); } +NotTEC +WasmEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + return impl->check(wasmCode, funcName, params, imports, j); +} + std::int32_t WasmEngine::initMaxPages(std::int32_t def) { diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index b12d7ecc7ef..7c68a186966 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -65,6 +65,14 @@ class WasmEngine int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params = {}, + std::vector const& imports = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + std::int32_t initMaxPages(std::int32_t def); @@ -87,4 +95,12 @@ runEscrowWasm( int64_t gasLimit = -1, beast::Journal j = beast::Journal(beast::Journal::getNullSink())); +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 6f52d1a4f28..7639b4efa03 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -231,7 +231,14 @@ EscrowCreate::preflight(PreflightContext const& ctx) << "EscrowCreate.FinishFunction bad size " << code.size(); return temMALFORMED; } - // TODO: add check to ensure this is valid WASM code + + HostFunctions mock; + auto const re = preflightEscrowWasm(code, "finish", {}, &mock); + if (!isTesSuccess(re)) + { + JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; + return re; + } } return preflight2(ctx); From a0d275feec923ad5be43eee4292c6b1b80d39cf2 Mon Sep 17 00:00:00 2001 From: "Elliot." Date: Wed, 2 Jul 2025 10:39:57 -0700 Subject: [PATCH 027/212] chore: Clear CODEOWNERS (#5528) --- .github/CODEOWNERS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bc4fe2febde..24620f8d7ca 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,2 @@ # Allow anyone to review any change by default. * - -# Require the rpc-reviewers team to review changes to the rpc code. -include/xrpl/protocol/ @xrplf/rpc-reviewers -src/libxrpl/protocol/ @xrplf/rpc-reviewers -src/xrpld/rpc/ @xrplf/rpc-reviewers -src/xrpld/app/misc/ @xrplf/rpc-reviewers From 65b0b976d98e54226136fad8e733d17b7fbb511e Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 2 Jul 2025 17:33:39 -0400 Subject: [PATCH 028/212] Sync error codes (#5527) * Sync error codes --- src/xrpld/app/misc/WasmHostFunc.h | 36 ++--- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 148 +++++++++------------ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 29 ++-- 3 files changed, 100 insertions(+), 113 deletions(-) diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 1d1f4d011be..86eb174451d 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -29,22 +29,26 @@ namespace ripple { -int32_t const HF_ERR_INTERNAL = -1; -int32_t const HF_ERR_FIELD_NOT_FOUND = -2; -int32_t const HF_ERR_BUFFER_TOO_SMALL = -3; -int32_t const HF_ERR_NO_ARRAY = -4; -int32_t const HF_ERR_NOT_LEAF_FIELD = -5; -int32_t const HF_ERR_LOCATOR_MALFORMED = -6; -int32_t const HF_ERR_SLOT_OUT_RANGE = -7; -int32_t const HF_ERR_SLOTS_FULL = -8; -int32_t const HF_ERR_INVALID_SLOT = -9; -int32_t const HF_ERR_LEDGER_OBJ_NOT_FOUND = -10; -int32_t const HF_ERR_DECODING = -11; -int32_t const HF_ERR_DATA_FIELD_TOO_LARGE = -12; -int32_t const HF_ERR_OUT_OF_BOUNDS = -13; -int32_t const HF_ERR_NO_MEM_EXPORTED = -14; -int32_t const HF_ERR_INVALID_PARAMS = -15; -int32_t const HF_ERR_INVALID_ACCOUNT = -16; +enum HostFunctionErrors : int32_t { + HF_ERR_INTERNAL = -1, + HF_ERR_FIELD_NOT_FOUND = -2, + HF_ERR_BUFFER_TOO_SMALL = -3, + HF_ERR_NO_ARRAY = -4, + HF_ERR_NOT_LEAF_FIELD = -5, + HF_ERR_LOCATOR_MALFORMED = -6, + HF_ERR_SLOT_OUT_RANGE = -7, + HF_ERR_SLOTS_FULL = -8, + HF_ERR_EMPTY_SLOT = -9, + HF_ERR_LEDGER_OBJ_NOT_FOUND = -10, + HF_ERR_DECODING = -11, + HF_ERR_DATA_FIELD_TOO_LARGE = -12, + HF_ERR_POINTER_OUT_OF_BOUNDS = -13, + HF_ERR_NO_MEM_EXPORTED = -14, + HF_ERR_INVALID_PARAMS = -15, + HF_ERR_INVALID_ACCOUNT = -16, + HF_ERR_INVALID_FIELD = -17, + HF_ERR_INDEX_OUT_OF_BOUNDS = -18, +}; struct HostFunctions { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 71236034afc..7c804f376d9 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -70,50 +70,57 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; } -static Bytes -getAnyFieldData(STBase const& obj) +static Expected +getAnyFieldData(STBase const* obj) { // auto const& fname = obj.getFName(); - auto const stype = obj.getSType(); + if (!obj) + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + + auto const stype = obj->getSType(); switch (stype) { case STI_UNKNOWN: case STI_NOTPRESENT: - return {}; + return Unexpected(HF_ERR_FIELD_NOT_FOUND); + break; + case STI_OBJECT: + case STI_ARRAY: + return Unexpected(HF_ERR_NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); + auto const& super(static_cast(obj)); + int64_t const data = super->xrp().drops(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + return Bytes{b, e}; } break; case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const& super(static_cast const*>(obj)); + auto const& data = super->value(); + return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { auto const& super( - static_cast const&>(obj)); - std::uint32_t const data = super.value(); + static_cast const*>(obj)); + std::uint32_t const data = super->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + return Bytes{b, e}; } break; default: @@ -121,7 +128,7 @@ getAnyFieldData(STBase const& obj) } Serializer msg; - obj.add(msg); + obj->add(msg); return msg.getData(); } @@ -129,13 +136,7 @@ getAnyFieldData(STBase const& obj) Expected WasmHostFunctionsImpl::getTxField(SField const& fname) { - auto const* field = ctx.tx.peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(ctx.tx.peekAtPField(fname)); } Expected @@ -144,14 +145,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) auto const sle = ctx.view().read(leKey); if (!sle) return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const* field = sle->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(sle->peekAtPField(fname)); } Expected @@ -160,17 +154,16 @@ WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) return Unexpected(HF_ERR_SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HF_ERR_INVALID_SLOT); - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return Unexpected(HF_ERR_EMPTY_SLOT); + return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); +} - return getAnyFieldData(*field); +static inline bool +noField(STBase const* field) +{ + return !field || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); } static Expected @@ -188,11 +181,11 @@ locateField(STObject const& obj, Slice const& loc) int32_t const c = l[0]; auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); + return Unexpected(HF_ERR_INVALID_FIELD); + auto const& fname(*it->second); field = obj.peekAtPField(fname); - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HF_ERR_FIELD_NOT_FOUND); } @@ -204,7 +197,7 @@ locateField(STObject const& obj, Slice const& loc) { auto const* arr = static_cast(field); if (c >= arr->size()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HF_ERR_INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](c)); } else if (STI_OBJECT == field->getSType()) @@ -213,9 +206,9 @@ locateField(STObject const& obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); + return Unexpected(HF_ERR_INVALID_FIELD); + auto const& fname(*it->second); field = o->peekAtPField(fname); } else // simple field must be the last one @@ -223,7 +216,7 @@ locateField(STObject const& obj, Slice const& loc) return Unexpected(HF_ERR_LOCATOR_MALFORMED); } - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HF_ERR_FIELD_NOT_FOUND); } @@ -237,11 +230,7 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } Expected @@ -255,11 +244,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } Expected @@ -272,17 +257,13 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( return Unexpected(HF_ERR_SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_INVALID_SLOT); + return Unexpected(HF_ERR_EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(r.value()); } int32_t @@ -292,7 +273,7 @@ WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) return HF_ERR_NO_ARRAY; auto const* field = ctx.tx.peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -313,7 +294,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) return HF_ERR_LEDGER_OBJ_NOT_FOUND; auto const* field = sle->peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -335,10 +316,10 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( return HF_ERR_SLOT_OUT_RANGE; if (!cache[cacheIdx]) - return HF_ERR_INVALID_SLOT; + return HF_ERR_EMPTY_SLOT; auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) + if (noField(field)) return HF_ERR_FIELD_NOT_FOUND; if (field->getSType() != STI_ARRAY) @@ -354,8 +335,8 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) auto const r = locateField(ctx.tx, locator); if (!r) return r.error(); - auto const* field = r.value(); + auto const* field = r.value(); if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -372,8 +353,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) auto const r = locateField(*sle, locator); if (!r) return r.error(); - auto const* field = r.value(); + auto const* field = r.value(); if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -391,14 +372,13 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( return HF_ERR_SLOT_OUT_RANGE; if (!cache[cacheIdx]) - return HF_ERR_INVALID_SLOT; + return HF_ERR_EMPTY_SLOT; auto const r = locateField(*cache[cacheIdx], locator); if (!r) return r.error(); auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) return HF_ERR_NO_ARRAY; int32_t const sz = static_cast(field)->size(); @@ -439,7 +419,10 @@ WasmHostFunctionsImpl::credentialKeylet( AccountID const& issuer, Bytes const& credentialType) { - if (!subject || !issuer || credentialType.empty() || + if (!subject || !issuer) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + + if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HF_ERR_INVALID_PARAMS); @@ -472,22 +455,19 @@ WasmHostFunctionsImpl::oracleKeylet( Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { - if (!account || !nftId) - { - getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + if (!account) + return Unexpected(HF_ERR_INVALID_ACCOUNT); + + if (!nftId) return Unexpected(HF_ERR_INVALID_PARAMS); - } auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) - { - getJournal().trace() << "WAMR getNFT: NFT not found"; return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - } auto ouri = obj->at(~sfURI); if (!ouri) - return Bytes(); + return Unexpected(HF_ERR_FIELD_NOT_FOUND); Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 9b5968c31d1..0e1f8862592 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -37,12 +37,15 @@ setData( if (!ssz) return 0; + if (dst < 0 || dsz < 0 || !src || ssz < 0) + return HF_ERR_INVALID_PARAMS; + auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) return HF_ERR_NO_MEM_EXPORTED; if (dst + dsz > mem.s) - return HF_ERR_OUT_OF_BOUNDS; + return HF_ERR_POINTER_OUT_OF_BOUNDS; if (ssz > dsz) return HF_ERR_BUFFER_TOO_SMALL; @@ -54,7 +57,7 @@ setData( static Expected getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) { - if (!ssz) + if (src < 0 || ssz <= 0) return Unexpected(HF_ERR_INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); @@ -62,7 +65,7 @@ getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) return Unexpected(HF_ERR_NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_OUT_OF_BOUNDS); + return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); Bytes data(mem.p + src, mem.p + src + ssz); return data; @@ -72,7 +75,7 @@ static Expected getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) { auto const r = getData(rt, ptr, sz); - if (!r || (r->size() < AccountID::bytes)) + if (!r || (r->size() != AccountID::bytes)) return Unexpected(HF_ERR_INVALID_PARAMS); return AccountID::fromVoid(r->data()); @@ -81,7 +84,7 @@ getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) static Expected getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) { - if (!ssz) + if (src < 0 || ssz <= 0) return Unexpected(HF_ERR_INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); @@ -89,7 +92,7 @@ getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) return Unexpected(HF_ERR_NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_OUT_OF_BOUNDS); + return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); std::string data(mem.p + src, mem.p + src + ssz); return data; @@ -179,7 +182,7 @@ cacheLedgerObj_wrap( RET(r.error()); } - if (r->size() < uint256::bytes) + if (r->size() != uint256::bytes) { RET(HF_ERR_INVALID_PARAMS); } @@ -203,7 +206,7 @@ getTxField_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -234,7 +237,7 @@ getCurrentLedgerObjField_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -265,7 +268,7 @@ getLedgerObjField_wrap( auto const it = m.find(params->data[1].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -384,7 +387,7 @@ getTxArrayLen_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -405,7 +408,7 @@ getCurrentLedgerObjArrayLen_wrap( auto const it = m.find(params->data[0].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); @@ -426,7 +429,7 @@ getLedgerObjArrayLen_wrap( auto const it = m.find(params->data[1].of.i32); if (it == m.end()) { - RET(HF_ERR_FIELD_NOT_FOUND); + RET(HF_ERR_INVALID_FIELD); } auto const& fname(*it->second); From 7bdf5fa8b8caa2b1efb3e6c8d06c89d9fc179c54 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:18:03 -0400 Subject: [PATCH 029/212] Fix build.md wamr version (#5535) --- BUILD.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILD.md b/BUILD.md index d4824fe1a0a..50aea4c7dcd 100644 --- a/BUILD.md +++ b/BUILD.md @@ -210,9 +210,9 @@ It add metering and expose some internal structures. ``` # Conan 1.x - conan export external/wamr wamr/2.2.0@ + conan export external/wamr wamr/2.3.1@ # Conan 2.x - conan export --version 2.2.0 external/wamr + conan export --version 2.3.1 external/wamr ``` ### Build and Test From 4fa0ae521e5b65840d60a4d87baa1b0f6ddeee82 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 9 Jul 2025 00:34:17 +0530 Subject: [PATCH 030/212] disallow a computation allowance of 0 (#5541) --- src/test/app/Escrow_test.cpp | 7 +++++++ src/xrpld/app/tx/detail/Escrow.cpp | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 23b2c29c787..00a53029131 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1970,6 +1970,13 @@ struct Escrow_test : public beast::unit_test::suite ter(tefWASM_FIELD_NOT_INCLUDED)); } + { + // ComputationAllowance value of 0 + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(0), + ter(temBAD_LIMIT)); + } + { // not enough fees // This function takes 4 gas diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 7639b4efa03..e9a7c78c7f6 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -743,6 +743,10 @@ EscrowFinish::preflight(PreflightContext const& ctx) if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) { + if (*allowance == 0) + { + return temBAD_LIMIT; + } if (*allowance > ctx.app.config().FEES.extension_compute_limit) { JLOG(ctx.j.debug()) From bc445ec6a2167e944a4b5af7b849e9f2500ed11e Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:08:36 -0400 Subject: [PATCH 031/212] Add hostfunctions schedule table Remove opcode schedule table from wamr --- external/wamr/patches/ripp_metering.patch | 105 ++++++-------------- include/xrpl/protocol/Protocol.h | 3 + src/test/app/Escrow_test.cpp | 15 ++- src/test/app/Wasm_test.cpp | 79 +++++++++++++-- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 15 +++ src/xrpld/app/misc/WasmVM.cpp | 108 ++++++++------------- src/xrpld/app/misc/WasmVM.h | 3 + 7 files changed, 174 insertions(+), 154 deletions(-) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 5a41b125b7d..5e09eec8df8 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -102,31 +102,28 @@ index 49a17a96..19a85980 100644 * an index in both functions runtime instance lists * of interpreter mode and aot mode diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c -index 47752950..d5821c4f 100644 +index 47752950..5f26d886 100644 --- a/core/iwasm/common/wasm_exec_env.c +++ b/core/iwasm/common/wasm_exec_env.c -@@ -86,7 +86,9 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, +@@ -86,7 +86,7 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, #endif #if WASM_ENABLE_INSTRUCTION_METERING != 0 - exec_env->instructions_to_execute = -1; + exec_env->instructions_to_execute = INT64_MAX; -+ for(int i = 0; i < 256; ++i) -+ exec_env->instructions_schedule[i] = 1; #endif return exec_env; diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h -index 5d80312f..2713a092 100644 +index 5d80312f..b2ecce2e 100644 --- a/core/iwasm/common/wasm_exec_env.h +++ b/core/iwasm/common/wasm_exec_env.h -@@ -89,7 +89,8 @@ typedef struct WASMExecEnv { +@@ -89,7 +89,7 @@ typedef struct WASMExecEnv { #if WASM_ENABLE_INSTRUCTION_METERING != 0 /* instructions to execute */ - int instructions_to_execute; + int64 instructions_to_execute; -+ int64 instructions_schedule[256]; #endif #if WASM_ENABLE_FAST_JIT != 0 @@ -214,10 +211,10 @@ index 9a6afee1..0fe4739f 100644 bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..10c516d6 100644 +index dcee0aea..a1f7866e 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2288,10 +2288,26 @@ wasm_runtime_access_exce_check_guard_page() +@@ -2288,10 +2288,18 @@ wasm_runtime_access_exce_check_guard_page() #if WASM_ENABLE_INSTRUCTION_METERING != 0 void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -233,19 +230,11 @@ index dcee0aea..10c516d6 100644 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) +{ + return exec_env->instructions_to_execute; -+} -+ -+void -+wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, -+ int64 const *instructions_schedule) -+{ -+ for(int i = 0; i < 256; ++i) -+ exec_env->instructions_schedule[i] = instructions_schedule[i]; +} #endif WASMFuncType * -@@ -7348,7 +7364,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, +@@ -7348,7 +7356,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, const char *func_name) { return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, @@ -254,7 +243,7 @@ index dcee0aea..10c516d6 100644 } bool -@@ -7805,13 +7821,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7805,13 +7813,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -270,7 +259,7 @@ index dcee0aea..10c516d6 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7821,6 +7838,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7821,6 +7830,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -278,7 +267,7 @@ index dcee0aea..10c516d6 100644 return true; } -@@ -7843,7 +7861,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7843,7 +7853,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -288,10 +277,10 @@ index dcee0aea..10c516d6 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 64a6cd79..f4c55e2f 100644 +index 64a6cd79..cb674edc 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -795,7 +795,14 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, +@@ -795,7 +795,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -299,10 +288,6 @@ index 64a6cd79..f4c55e2f 100644 + int64 instructions_to_execute); +WASM_RUNTIME_API_EXTERN int64 +wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); -+ -+WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_schedule(WASMExecEnv *exec_env, -+ int64 const *instructions_schedule); + #endif @@ -404,7 +389,7 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..ae24ff8b 100644 +index 1e98b0fa..db6278c5 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) @@ -420,8 +405,8 @@ index 1e98b0fa..ae24ff8b 100644 - instructions_left--; +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ -+ instructions_left -= instructions_schedule[opcode]; \ -+ if (instructions_left < 0) { \ ++ --instructions_left; \ ++ if (instructions_left <= 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ @@ -429,20 +414,20 @@ index 1e98b0fa..ae24ff8b 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1625,9 +1626,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1625,10 +1626,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; #if WASM_ENABLE_INSTRUCTION_METERING != 0 - int instructions_left = -1; +- if (exec_env) { + int64 instructions_left = INT64_MAX; -+ int64 const *instructions_schedule = NULL; - if (exec_env) { ++ if (exec_env) instructions_left = exec_env->instructions_to_execute; -+ instructions_schedule = exec_env->instructions_schedule; - } +- } #endif -@@ -6885,6 +6888,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + #if WASM_ENABLE_EXCE_HANDLING != 0 +@@ -6885,6 +6885,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -454,7 +439,7 @@ index 1e98b0fa..ae24ff8b 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6925,6 +6933,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6925,6 +6930,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -468,7 +453,7 @@ index 1e98b0fa..ae24ff8b 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 4e5edf41..04c39e1f 100644 +index 4e5edf41..37b36c17 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -106,14 +106,14 @@ typedef float64 CellType_F64; @@ -485,7 +470,7 @@ index 4e5edf41..04c39e1f 100644 - +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ -+ instructions_left -= instructions_schedule[opcode]; \ ++ --instructions_left; \ + if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ @@ -532,46 +517,20 @@ index 4e5edf41..04c39e1f 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1508,6 +1507,25 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) - #endif - } - -+static int64 const def_instructions_schedule[256] = { -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -+ 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 -+}; -+ - static void - wasm_interp_call_func_bytecode(WASMModuleInstance *module, - WASMExecEnv *exec_env, -@@ -1556,9 +1574,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1556,10 +1555,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 opcode = 0, local_type, *global_addr; #if WASM_ENABLE_INSTRUCTION_METERING != 0 - int instructions_left = -1; +- if (exec_env) { + int64 instructions_left = INT64_MAX; -+ int64 const *instructions_schedule = def_instructions_schedule; - if (exec_env) { ++ if (exec_env) instructions_left = exec_env->instructions_to_execute; -+ instructions_schedule = exec_env->instructions_schedule; - } +- } #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ -@@ -7694,6 +7714,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 +@@ -7694,6 +7692,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -579,7 +538,7 @@ index 4e5edf41..04c39e1f 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7806,6 +7827,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7806,6 +7805,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -591,7 +550,7 @@ index 4e5edf41..04c39e1f 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7834,6 +7860,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7834,6 +7838,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index ab95017db12..e4592d48896 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -130,6 +130,9 @@ std::uint8_t constexpr maxAssetCheckDepth = 5; * Wasm code */ std::size_t constexpr maxWasmDataLength = 4 * 1024; +/** The maximum length of a parameters passed from Wasm code*/ +std::size_t constexpr maxWasmParamLength = 1024; + /** A ledger index. */ using LedgerIndex = std::uint32_t; diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 00a53029131..1ade21eb59b 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2032,8 +2032,8 @@ struct Escrow_test : public beast::unit_test::suite // pub fn finish() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5} // } - static auto wasmHex = ledgerSqnHex; - std::uint32_t constexpr allowance = 4; + auto const& wasmHex = ledgerSqnHex; + std::uint32_t const allowance = 64; { // basic FinishFunction situation @@ -2179,19 +2179,19 @@ struct Escrow_test : public beast::unit_test::suite // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 2), ter(tecNO_PERMISSION)); env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(4), + escrow::comp_allowance(allowance), fee(txnFees + 1), ter(tesSUCCESS)); @@ -2300,8 +2300,7 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - // TODO: figure out why this can't be 2412 - auto const allowance = 3'600; + auto const allowance = 20'000; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), @@ -2343,7 +2342,7 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 487); + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 10817); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 52d30835612..e5d0a9f29f6 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1268,7 +1268,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 487)); + BEAST_EXPECT(!re->result && (re->cost == 10817)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -1285,7 +1285,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 487)); + BEAST_EXPECT(!re->result && (re->cost == 10817)); // std::cout << "bad case (current time < escrow_finish_after " // "time) result " // << re.value().result << " cost: " << @@ -1309,7 +1309,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -1329,7 +1329,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 23)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } @@ -1406,7 +1406,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 80)); + BEAST_EXPECT(re->result && (re->cost == 6570)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } @@ -1428,13 +1428,78 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 138)); + BEAST_EXPECT(re->result && (re->cost == 16558)); // std::cout << "good case result " << re.value().result // << " cost: " << re.value().cost << std::endl; } } } + void + testHFCost() + { + testcase("wasm test host functions cost"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector imp = createWasmImport(&hfs); + for (auto& i : imp) + i.gas = 0; + + auto re = engine.run( + wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + // std::cout << ", ret: " << re->result + // << ", gas spent: " << re->cost << std::endl; + BEAST_EXPECT(re->result && (re->cost == 138)); + } + + env.close(); + } + + env.close(); + env.close(); + env.close(); + env.close(); + env.close(); + + { + std::string const wasmHex = hostFunctions2Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector const imp = createWasmImport(&hfs); + + auto re = engine.run( + wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + // std::cout << ", ret: " << re->result + // << ", gas spent: " << re->cost << std::endl; + BEAST_EXPECT(re->result && (re->cost == 16558)); + } + + env.close(); + } + } + void perfTest() { @@ -1551,6 +1616,8 @@ struct Wasm_test : public beast::unit_test::suite // testWasmSP1Verifier(); testWasmBG16Verifier(); + testHFCost(); + // TODO: fix result testEscrowWasmDN1(); testEscrowWasmDN2(); diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 0e1f8862592..0c502733620 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -527,6 +527,11 @@ computeSha512HalfHash_wrap( auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); if (!r) { @@ -726,6 +731,11 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const msg = getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); if (!msg) @@ -750,6 +760,11 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + if (params->data[1].of.i32 > maxWasmDataLength) + { + RET(HF_ERR_DATA_FIELD_TOO_LARGE); + } + auto const msg = getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); if (!msg) diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index b21007b9d8d..3f7d61c349d 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -29,75 +29,49 @@ namespace ripple { -static std::vector -createImports(HostFunctions* hfs) +std::vector +createWasmImport(HostFunctions* hfs) { - std::vector imports; + std::vector i; if (hfs) { + // clang-format off + // TODO: remove after escrow_test wasm module will be updated - WASM_IMPORT_FUNC2(imports, getLedgerSqnOld, "getLedgerSqn", hfs); - - WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", hfs); - WASM_IMPORT_FUNC2( - imports, getParentLedgerTime, "get_parent_ledger_time", hfs); - WASM_IMPORT_FUNC2( - imports, getParentLedgerHash, "get_parent_ledger_hash", hfs); - WASM_IMPORT_FUNC2(imports, cacheLedgerObj, "cache_ledger_obj", hfs); - WASM_IMPORT_FUNC2(imports, getTxField, "get_tx_field", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjField, - "get_current_ledger_obj_field", - hfs); - WASM_IMPORT_FUNC2( - imports, getLedgerObjField, "get_ledger_obj_field", hfs); - WASM_IMPORT_FUNC2( - imports, getTxNestedField, "get_tx_nested_field", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjNestedField, - "get_current_ledger_obj_nested_field", - hfs); - WASM_IMPORT_FUNC2( - imports, - getLedgerObjNestedField, - "get_ledger_obj_nested_field", - hfs); - WASM_IMPORT_FUNC2(imports, getTxArrayLen, "get_tx_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjArrayLen, - "get_current_ledger_obj_array_len", - hfs); - WASM_IMPORT_FUNC2( - imports, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, getTxNestedArrayLen, "get_tx_nested_array_len", hfs); - WASM_IMPORT_FUNC2( - imports, - getCurrentLedgerObjNestedArrayLen, - "get_current_ledger_obj_nested_array_len", - hfs); - WASM_IMPORT_FUNC2( - imports, - getLedgerObjNestedArrayLen, - "get_ledger_obj_nested_array_len", - hfs); - WASM_IMPORT_FUNC2(imports, updateData, "update_data", hfs); - WASM_IMPORT_FUNC2( - imports, computeSha512HalfHash, "compute_sha512_half", hfs); - WASM_IMPORT_FUNC2(imports, accountKeylet, "account_keylet", hfs); - WASM_IMPORT_FUNC2(imports, credentialKeylet, "credential_keylet", hfs); - WASM_IMPORT_FUNC2(imports, escrowKeylet, "escrow_keylet", hfs); - WASM_IMPORT_FUNC2(imports, oracleKeylet, "oracle_keylet", hfs); - WASM_IMPORT_FUNC2(imports, getNFT, "get_NFT", hfs); - WASM_IMPORT_FUNC(imports, trace, hfs); - WASM_IMPORT_FUNC2(imports, traceNum, "trace_num", hfs); + WASM_IMPORT_FUNC2(i, getLedgerSqnOld, "getLedgerSqn", hfs, 60); + + + WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_NFT", hfs, 1000); + WASM_IMPORT_FUNC (i, trace, hfs, 500); + WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + + // clang-format on } - return imports; + return i; } Expected @@ -117,7 +91,7 @@ runEscrowWasm( wasmCode, funcName, params, - createImports(hfs), + createWasmImport(hfs), hfs, gasLimit, hfs ? hfs->getJournal() : j); @@ -125,14 +99,14 @@ runEscrowWasm( // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; - if (!ret.has_value()) + if (!ret) { // std::cout << ", error: " << ret.error() << std::endl; return Unexpected(ret.error()); } - // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost - // << std::endl; + // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << + // std::endl; return EscrowResult{ret->result > 0, ret->cost}; } @@ -152,7 +126,7 @@ preflightEscrowWasm( wasmCode, funcName, params, - createImports(hfs), + createWasmImport(hfs), hfs ? hfs->getJournal() : j); return ret; diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index 7c68a186966..c4db2fedd5d 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -86,6 +86,9 @@ class WasmEngine //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +std::vector +createWasmImport(HostFunctions* hfs); + Expected runEscrowWasm( Bytes const& wasmCode, From 9007097d247eec1cf9b3442390c7209418ea805b Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 15 Jul 2025 04:28:59 +0530 Subject: [PATCH 032/212] Simplify host function boilerplate (#5534) * enum for HF errors * switch getData functions to be templates * getData working * Slice -> Bytes in host functions * RET -> helper function instead of macro * get template function working * more organization/cleanup * fix failures * more cleanup * Bytes -> Slice * SFieldParam macro -> type alias * fix return type * fix bugs * replace std::make_index_sequence * remove `failed` from output * remove complex function * more uniformity * respond to comments * enum class HostFunctionError * rename variable * respond to comments * remove templating * [WIP] basic getData tests * weird linker error * fix issue --- src/test/app/AMM_test.cpp | 2 +- src/test/app/TestHostFunctions.h | 797 ++++++++++++++++++ src/test/app/Vault_test.cpp | 2 +- src/test/app/Wasm_test.cpp | 905 +-------------------- src/xrpld/app/misc/WamrVM.cpp | 4 +- src/xrpld/app/misc/WasmHostFunc.h | 150 ++-- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 206 ++--- src/xrpld/app/misc/WasmHostFuncImpl.h | 62 +- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 819 +++++++++++-------- 9 files changed, 1525 insertions(+), 1422 deletions(-) create mode 100644 src/test/app/TestHostFunctions.h diff --git a/src/test/app/AMM_test.cpp b/src/test/app/AMM_test.cpp index 2ee9e5f1f37..93bb57a0816 100644 --- a/src/test/app/AMM_test.cpp +++ b/src/test/app/AMM_test.cpp @@ -7480,7 +7480,7 @@ struct AMM_test : public jtx::AMMTest using namespace test::jtx; auto const testCase = [&](std::string suffix, FeatureBitset features) { - testcase("Failed pseudo-account allocation " + suffix); + testcase("Pseudo-account allocation failure " + suffix); std::string logs; Env env{*this, features, std::make_unique(&logs)}; env.fund(XRP(30'000), gw, alice); diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h new file mode 100644 index 00000000000..680ec03896c --- /dev/null +++ b/src/test/app/TestHostFunctions.h @@ -0,0 +1,797 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include +#include +#include +#include + +#include + +namespace ripple { +namespace test { + +struct TestHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + AccountID accountID_; + Bytes data_; + int clock_drift_ = 0; + void const* rt_ = nullptr; + +public: + TestHostFunctions(test::jtx::Env& env, int cd = 0) + : env_(env), clock_drift_(cd) + { + auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); + if (opt) + accountID_ = *opt; + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + Expected + getLedgerSqn() override + { + return static_cast(env_.current()->seq()); + } + + Expected + getParentLedgerTime() override + { + return env_.current()->parentCloseTime().time_since_epoch().count() + + clock_drift_; + } + + Expected + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override + { + return 1; + } + + Expected + getTxField(SField const& fname) override + { + if (fname == sfAccount) + return Bytes(accountID_.begin(), accountID_.end()); + else if (fname == sfFee) + { + int64_t x = 235; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfSequence) + { + auto const x = getLedgerSqn(); + if (!x) + return Unexpected(x.error()); + std::uint32_t const data = x.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + return Bytes(); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(HostFunctionError::INTERNAL); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + // auto const& sn = fname.getName(); + if (fname == sfBalance) + { + int64_t x = 10'000; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + return data_; + } + + Expected + getTxNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getTxArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + return 32; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + return 32; + } + + Expected + updateData(Slice const& data) override + { + return 0; + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + return env_.current()->info().parentHash; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) override + { + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::credential(subject, issuer, credentialType); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + std::string s = "https://ripple.com"; + return Bytes(s.begin(), s.end()); + } + + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << "WASM TRACE: " << msg; + if (!asHex) + j << std::string_view( + reinterpret_cast(data.data()), data.size()); + else + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex(data.begin(), data.end(), hex.begin()); + j << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + Expected + traceNum(std::string_view const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << "WASM TRACE NUM: " << msg << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } +}; + +struct TestHostFunctionsSink : public TestHostFunctions +{ + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) + : TestHostFunctions(env, cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } +}; + +struct PerfHostFunctions : public TestHostFunctions +{ + Keylet leKey; + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::shared_ptr tx_; + + void const* rt_ = nullptr; + +public: + PerfHostFunctions( + test::jtx::Env& env, + Keylet const& k, + std::shared_ptr&& tx) + : TestHostFunctions(env), leKey(k), tx_(std::move(tx)) + { + } + + virtual Expected + cacheLedgerObj(uint256 const&, int32_t cacheIdx) override + { + static int32_t intIdx = 0; + + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cacheIdx) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + if (cacheIdx >= MAX_CACHE) + cacheIdx = intIdx++ % MAX_CACHE; + } + else + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOTS_FULL); + + cache[cacheIdx] = env_.le(leKey); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; + } + + static Bytes + getAnyFieldData(STBase const& obj) + { + // auto const& fname = obj.getFName(); + auto const stype = obj.getSType(); + switch (stype) + { + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); + } + + Expected + getTxField(SField const& fname) override + { + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + static Expected + locateField(STObject const& obj, Slice const& loc) + { + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + { + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + field = &(arr->operator[](c)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + } + + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + return field; + } + + Expected + getTxNestedField(Slice const& locator) override + { + // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << + // std::endl; + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getTxArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + updateData(Slice const& data) override + { + ripple::detail::ApplyViewBase v( + env_.app().openLedger().current().get(), tapNONE); + + auto sle = v.peek(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + sle->setFieldVL(sfData, data); + v.update(sle); + + return data.size(); + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + auto const hash = sha512Half(data); + return hash; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + auto obj = nft::findToken(*env_.current(), account, nftId); + if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); + } +}; + +} // namespace test +} // namespace ripple diff --git a/src/test/app/Vault_test.cpp b/src/test/app/Vault_test.cpp index ccac0e2819a..24a951c83c4 100644 --- a/src/test/app/Vault_test.cpp +++ b/src/test/app/Vault_test.cpp @@ -2638,7 +2638,7 @@ class Vault_test : public beast::unit_test::suite { using namespace test::jtx; - testcase("failed pseudo-account allocation"); + testcase("Pseudo-account allocation failure"); Env env{*this, supported_amendments() | featureSingleAssetVault}; Account const owner{"owner"}; Vault vault{env}; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index e5d0a9f29f6..6c77706b8b5 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ /* This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. + Copyright (c) 2025 Ripple Labs Inc. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -34,6 +35,9 @@ namespace ripple { namespace test { +bool +testGetDataIncrement(); + using Add_proto = int32_t(int32_t, int32_t); static wasm_trap_t* Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) @@ -54,7 +58,7 @@ struct TestLedgerDataProvider { } - int32_t + Expected get_ledger_sqn() { return (int32_t)env->current()->seq(); @@ -67,893 +71,21 @@ getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) { auto sqn = reinterpret_cast(env)->get_ledger_sqn(); - results->data[0] = WASM_I32_VAL(sqn); + results->data[0] = WASM_I32_VAL(sqn.value()); results->num_elems = 1; return nullptr; } -struct TestHostFunctions : public HostFunctions -{ - test::jtx::Env& env_; - AccountID accountID_; - Bytes data_; - int clock_drift_ = 0; - void const* rt_ = nullptr; - -public: - TestHostFunctions(test::jtx::Env& env, int cd = 0) - : env_(env), clock_drift_(cd) - { - auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); - if (opt) - accountID_ = *opt; - std::string t = "10000"; - data_ = Bytes{t.begin(), t.end()}; - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - beast::Journal - getJournal() override - { - return env_.journal; - } - - int32_t - getLedgerSqn() override - { - return static_cast(env_.current()->seq()); - } - - int32_t - getParentLedgerTime() override - { - return env_.current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; - } - - Hash - getParentLedgerHash() override - { - return env_.current()->info().parentHash; - } - - virtual int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override - { - return 1; - } - - Expected - getTxField(SField const& fname) override - { - if (fname == sfAccount) - return Bytes(accountID_.begin(), accountID_.end()); - else if (fname == sfFee) - { - int64_t x = 235; - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - else if (fname == sfSequence) - { - int32_t x = getLedgerSqn(); - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - return Bytes(); - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - auto const& sn = fname.getName(); - if (sn == "Destination" || sn == "Account") - return Bytes(accountID_.begin(), accountID_.end()); - else if (sn == "Data") - return data_; - else if (sn == "FinishAfter") - { - auto t = - env_.current()->parentCloseTime().time_since_epoch().count(); - std::string s = std::to_string(t); - return Bytes{s.begin(), s.end()}; - } - - return Unexpected(-1); - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - // auto const& sn = fname.getName(); - if (fname == sfBalance) - { - int64_t x = 10'000; - uint8_t const* p = reinterpret_cast(&x); - return Bytes{p, p + sizeof(x)}; - } - return data_; - } - - Expected - getTxNestedField(Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - Expected - getCurrentLedgerObjNestedField(Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override - { - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; - return Bytes(&a[0], &a[sizeof(a)]); - } - - int32_t - getTxArrayLen(SField const& fname) override - { - return 32; - } - - int32_t - getCurrentLedgerObjArrayLen(SField const& fname) override - { - return 32; - } - - int32_t - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override - { - return 32; - } - - int32_t - getTxNestedArrayLen(Slice const& locator) override - { - return 32; - } - - int32_t - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override - { - return 32; - } - - int32_t - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override - { - return 32; - } - - int32_t - updateData(Bytes const& data) override - { - return 0; - } - - Hash - computeSha512HalfHash(Bytes const& data) override - { - return env_.current()->info().parentHash; - } - - Expected - accountKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Bytes const& credentialType) override - { - if (!subject || !issuer || credentialType.empty()) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - getNFT(AccountID const& account, uint256 const& nftId) override - { - if (!account || !nftId) - { - return Unexpected(HF_ERR_INVALID_PARAMS); - } - - std::string s = "https://ripple.com"; - return Bytes(s.begin(), s.end()); - } - - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().trace(); -#endif - j << msg; - if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); - else - { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); - j << hex; - } - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return msg.size() + data.size() * (asHex ? 2 : 1); - } - - int32_t - traceNum(std::string const& msg, int64_t data) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().trace(); -#endif - j << msg << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return msg.size() + sizeof(data); - } -}; - -struct TestHostFunctionsSink : public TestHostFunctions -{ - test::StreamSink sink_; - beast::Journal jlog_; - void const* rt_ = nullptr; - -public: - explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) - : TestHostFunctions(env, cd) - , sink_(beast::severities::kDebug) - , jlog_(sink_) - { - } - - test::StreamSink& - getSink() - { - return sink_; - } - - beast::Journal - getJournal() override - { - return jlog_; - } -}; - -struct PerfHostFunctions : public HostFunctions +struct Wasm_test : public beast::unit_test::suite { - test::jtx::Env& env_; - - Keylet leKey; - static int constexpr MAX_CACHE = 256; - std::array, MAX_CACHE> cache; - std::shared_ptr tx_; - - void const* rt_ = nullptr; - -public: - PerfHostFunctions( - test::jtx::Env& env, - Keylet const& k, - std::shared_ptr&& tx) - : env_(env), leKey(k), tx_(std::move(tx)) - { - } - - virtual void - setRT(void const* rt) override - { - rt_ = rt; - } - - virtual void const* - getRT() const override - { - return rt_; - } - - beast::Journal - getJournal() override - { - return env_.journal; - } - - int32_t - getLedgerSqn() override - { - return static_cast(env_.current()->seq()); - } - - int32_t - getParentLedgerTime() override - { - return env_.current()->parentCloseTime().time_since_epoch().count(); - } - - Hash - getParentLedgerHash() override - { - return env_.current()->info().parentHash; - } - - virtual int32_t - cacheLedgerObj(Keylet const&, int32_t cacheIdx) override - { - static int32_t intIdx = 0; - - if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cacheIdx) - { - for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) - if (!cache[cacheIdx]) - break; - if (cacheIdx >= MAX_CACHE) - cacheIdx = intIdx++ % MAX_CACHE; - } - else - --cacheIdx; - - if (cacheIdx >= MAX_CACHE) - return HF_ERR_SLOTS_FULL; - - cache[cacheIdx] = env_.le(leKey); - return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; - } - - static Bytes - getAnyFieldData(STBase const& obj) - { - // auto const& fname = obj.getFName(); - auto const stype = obj.getSType(); - switch (stype) - { - case STI_UNKNOWN: - case STI_NOTPRESENT: - return {}; - break; - case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - break; - case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_UINT256: { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; - } - break; - case STI_UINT32: { - auto const& super( - static_cast const&>(obj)); - std::uint32_t const data = super.value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; - } - break; - default: - break; - } - - Serializer msg; - obj.add(msg); - - return msg.getData(); - } - - Expected - getTxField(SField const& fname) override - { - auto const* field = tx_->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - auto const sle = env_.le(leKey); - if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const* field = sle->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - static Expected - locateField(STObject const& obj, Slice const& loc) - { - if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - - int32_t const* l = reinterpret_cast(loc.data()); - int32_t const sz = loc.size() / 4; - STBase const* field = nullptr; - auto const& m = SField::getKnownCodeToField(); - - { - int32_t const c = l[0]; - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); - - field = obj.peekAtPField(fname); - if (!field || (STI_NOTPRESENT == field->getSType())) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - - for (int i = 1; i < sz; ++i) - { - int32_t const c = l[i]; - - if (STI_ARRAY == field->getSType()) - { - auto const* arr = static_cast(field); - if (c >= arr->size()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - field = &(arr->operator[](c)); - } - else if (STI_OBJECT == field->getSType()) - { - auto const* o = static_cast(field); - - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - auto const& fname(*it->second); - - field = o->peekAtPField(fname); - } - else // simple field must be the last one - { - return Unexpected(HF_ERR_LOCATOR_MALFORMED); - } - - if (!field || (STI_NOTPRESENT == field->getSType())) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); - } - - return field; - } - - Expected - getTxNestedField(Slice const& locator) override - { - // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << - // std::endl; - auto const r = locateField(*tx_, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getCurrentLedgerObjNestedField(Slice const& locator) override - { - auto const sle = env_.le(leKey); - if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - - auto const r = locateField(*sle, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const r = locateField(*cache[cacheIdx], locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HF_ERR_NOT_LEAF_FIELD); - - return getAnyFieldData(*field); - } - - int32_t - getTxArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - auto const* field = tx_->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getCurrentLedgerObjArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - auto const sle = env_.le(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - - auto const* field = sle->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; - - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return HF_ERR_FIELD_NOT_FOUND; - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getTxNestedArrayLen(Slice const& locator) override - { - auto const r = locateField(*tx_, locator); - if (!r) - return r.error(); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override - { - auto const sle = env_.le(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - auto const r = locateField(*sle, locator); - if (!r) - return r.error(); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; - - if (!cache[cacheIdx]) - { - // return Unexpected(HF_ERR_INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const r = locateField(*cache[cacheIdx], locator); - if (!r) - return r.error(); - - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - int32_t - updateData(Bytes const& data) override - { - ripple::detail::ApplyViewBase v( - env_.app().openLedger().current().get(), tapNONE); - - auto sle = v.peek(leKey); - if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; - - sle->setFieldVL(sfData, data); - v.update(sle); - - return data.size(); - } - - Hash - computeSha512HalfHash(Bytes const& data) override - { - auto const hash = sha512Half(data); - return hash; - } - - Expected - accountKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Bytes const& credentialType) override - { - if (!subject || !issuer || credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) - return Unexpected(HF_ERR_INVALID_PARAMS); - - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); - - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override - { - if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - getNFT(AccountID const& account, uint256 const& nftId) override - { - if (!account || !nftId) - { - getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; - return Unexpected(HF_ERR_INVALID_PARAMS); - } - - auto obj = nft::findToken(*env_.current(), account, nftId); - if (!obj) - { - getJournal().trace() << "WAMR getNFT: NFT not found"; - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); - } - - auto ouri = obj->at(~sfURI); - if (!ouri) - return Bytes(); - - Slice const s = ouri->value(); - return Bytes(s.begin(), s.end()); - } - - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override - { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().error(); -#endif - if (!asHex) - j << msg - << std::string_view( - reinterpret_cast(data.data()), data.size()); - else - { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); - j << msg << hex; - } - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return msg.size() + data.size() * (asHex ? 2 : 1); - } - - int32_t - traceNum(std::string const& msg, int64_t data) override + void + testGetDataHelperFunctions() { -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - auto j = getJournal().error(); -#endif - j << msg << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return msg.size() + sizeof(data); + testcase("getData helper functions"); + BEAST_EXPECT(testGetDataIncrement()); } -}; -struct Wasm_test : public beast::unit_test::suite -{ void testWasmFib() { @@ -1300,10 +432,10 @@ struct Wasm_test : public beast::unit_test::suite explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - Expected + Expected getTxField(SField const& fname) override { - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } }; BadTestHostFunctions nfs(env); @@ -1320,7 +452,7 @@ struct Wasm_test : public beast::unit_test::suite explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) { } - Expected + Expected getTxField(SField const& fname) override { return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); @@ -1361,7 +493,7 @@ struct Wasm_test : public beast::unit_test::suite auto const s = sink.messages().str(); BEAST_EXPECT( - countSubstr(s, "WAMR Error: failed to call func") == 1); + countSubstr(s, "WAMR Error: failure to call func") == 1); BEAST_EXPECT( countSubstr(s, "Exception: wasm operand stack overflow") > 0); } @@ -1387,7 +519,7 @@ struct Wasm_test : public beast::unit_test::suite } void - testEscrowWasmDN2() + testEscrowWasmDN3() { testcase("wasm devnet 3 test"); @@ -1602,6 +734,7 @@ struct Wasm_test : public beast::unit_test::suite { using namespace test::jtx; + testGetDataHelperFunctions(); testWasmLib(); testBadWasm(); testWasmCheckJson(); @@ -1620,7 +753,7 @@ struct Wasm_test : public beast::unit_test::suite // TODO: fix result testEscrowWasmDN1(); - testEscrowWasmDN2(); + testEscrowWasmDN3(); // perfTest(); } diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 9ad697b1c10..64759ff8d07 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -795,7 +795,7 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) if (trap) { ret.f = true; - print_wasm_error("failed to call func", trap, j_); + print_wasm_error("failure to call func", trap, j_); } // assert(results[0].kind == WASM_I32); @@ -924,7 +924,7 @@ WamrEngine::runHlp( auto const res = call<1>(f, p); if (res.f) - throw std::runtime_error("<" + std::string(funcName) + "> failed"); + throw std::runtime_error("<" + std::string(funcName) + "> failure"); else if (!res.r.num_elems) throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 86eb174451d..b507d6fe696 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -29,25 +29,25 @@ namespace ripple { -enum HostFunctionErrors : int32_t { - HF_ERR_INTERNAL = -1, - HF_ERR_FIELD_NOT_FOUND = -2, - HF_ERR_BUFFER_TOO_SMALL = -3, - HF_ERR_NO_ARRAY = -4, - HF_ERR_NOT_LEAF_FIELD = -5, - HF_ERR_LOCATOR_MALFORMED = -6, - HF_ERR_SLOT_OUT_RANGE = -7, - HF_ERR_SLOTS_FULL = -8, - HF_ERR_EMPTY_SLOT = -9, - HF_ERR_LEDGER_OBJ_NOT_FOUND = -10, - HF_ERR_DECODING = -11, - HF_ERR_DATA_FIELD_TOO_LARGE = -12, - HF_ERR_POINTER_OUT_OF_BOUNDS = -13, - HF_ERR_NO_MEM_EXPORTED = -14, - HF_ERR_INVALID_PARAMS = -15, - HF_ERR_INVALID_ACCOUNT = -16, - HF_ERR_INVALID_FIELD = -17, - HF_ERR_INDEX_OUT_OF_BOUNDS = -18, +enum class HostFunctionError : int32_t { + INTERNAL = -1, + FIELD_NOT_FOUND = -2, + BUFFER_TOO_SMALL = -3, + NO_ARRAY = -4, + NOT_LEAF_FIELD = -5, + LOCATOR_MALFORMED = -6, + SLOT_OUT_RANGE = -7, + SLOTS_FULL = -8, + EMPTY_SLOT = -9, + LEDGER_OBJ_NOT_FOUND = -10, + DECODING = -11, + DATA_FIELD_TOO_LARGE = -12, + POINTER_OUT_OF_BOUNDS = -13, + NO_MEM_EXPORTED = -14, + INVALID_PARAMS = -15, + INVALID_ACCOUNT = -16, + INVALID_FIELD = -17, + INDEX_OUT_OF_BOUNDS = -18, }; struct HostFunctions @@ -69,157 +69,157 @@ struct HostFunctions return beast::Journal{beast::Journal::getNullSink()}; } - virtual int32_t + virtual Expected getLedgerSqn() { - return 1; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getParentLedgerTime() { - return 1; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Hash + virtual Expected getParentLedgerHash() { - return {}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getTxField(SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getCurrentLedgerObjField(SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getTxNestedField(Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getCurrentLedgerObjNestedField(Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getTxArrayLen(SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getCurrentLedgerObjArrayLen(SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getTxNestedArrayLen(Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getCurrentLedgerObjNestedArrayLen(Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t + virtual Expected getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - updateData(Bytes const& data) + virtual Expected + updateData(Slice const& data) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Hash - computeSha512HalfHash(Bytes const& data) + virtual Expected + computeSha512HalfHash(Slice const& data) { - return Hash{}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected accountKeylet(AccountID const& account) { - return Bytes{}; + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) + Slice const& credentialType) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected escrowKeylet(AccountID const& account, std::uint32_t seq) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected oracleKeylet(AccountID const& account, std::uint32_t docId) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { - return Unexpected(HF_ERR_INTERNAL); + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) + virtual Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } - virtual int32_t - traceNum(std::string const& msg, int64_t data) + virtual Expected + traceNum(std::string_view const& msg, int64_t data) { - return HF_ERR_INTERNAL; + return Unexpected(HostFunctionError::INTERNAL); } virtual ~HostFunctions() = default; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 7c804f376d9..6c7ae43d91e 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -30,29 +30,30 @@ namespace ripple { -int32_t +Expected WasmHostFunctionsImpl::getLedgerSqn() { return ctx.view().seq(); } -int32_t +Expected WasmHostFunctionsImpl::getParentLedgerTime() { return ctx.view().parentCloseTime().time_since_epoch().count(); } -Hash +Expected WasmHostFunctionsImpl::getParentLedgerHash() { return ctx.view().info().parentHash; } -int32_t -WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) +Expected +WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { + auto const& keylet = keylet::unchecked(objId); if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cacheIdx) { @@ -64,60 +65,61 @@ WasmHostFunctionsImpl::cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) --cacheIdx; if (cacheIdx >= MAX_CACHE) - return HF_ERR_SLOTS_FULL; + return Unexpected(HostFunctionError::SLOTS_FULL); cache[cacheIdx] = ctx.view().read(keylet); - return cache[cacheIdx] ? cacheIdx + 1 : HF_ERR_LEDGER_OBJ_NOT_FOUND; + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; } -static Expected +static Expected getAnyFieldData(STBase const* obj) { // auto const& fname = obj.getFName(); if (!obj) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); auto const stype = obj->getSType(); switch (stype) { case STI_UNKNOWN: case STI_NOTPRESENT: - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); break; case STI_OBJECT: case STI_ARRAY: - return Unexpected(HF_ERR_NOT_LEAF_FIELD); + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super->value(); + auto const& account(static_cast(obj)); + auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } break; case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super->xrp().drops(); + auto const& amount(static_cast(obj)); + int64_t const data = amount->xrp().drops(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; } break; case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super->value(); + auto const& vl(static_cast(obj)); + auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& super(static_cast const*>(obj)); - auto const& data = super->value(); + auto const& num(static_cast const*>(obj)); + auto const& data = num->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { - auto const& super( - static_cast const*>(obj)); - std::uint32_t const data = super->value(); + auto const& num(static_cast const*>(obj)); + std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; @@ -133,29 +135,29 @@ getAnyFieldData(STBase const* obj) return msg.getData(); } -Expected +Expected WasmHostFunctionsImpl::getTxField(SField const& fname) { return getAnyFieldData(ctx.tx.peekAtPField(fname)); } -Expected +Expected WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) { auto const sle = ctx.view().read(leKey); if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); return getAnyFieldData(sle->peekAtPField(fname)); } -Expected +Expected WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_EMPTY_SLOT); + return Unexpected(HostFunctionError::EMPTY_SLOT); return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); } @@ -166,11 +168,11 @@ noField(STBase const* field) (STI_UNKNOWN == field->getSType()); } -static Expected +static Expected locateField(STObject const& obj, Slice const& loc) { if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); int32_t const* l = reinterpret_cast(loc.data()); int32_t const sz = loc.size() / 4; @@ -181,12 +183,12 @@ locateField(STObject const& obj, Slice const& loc) int32_t const c = l[0]; auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_INVALID_FIELD); + return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); field = obj.peekAtPField(fname); if (noField(field)) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } for (int i = 1; i < sz; ++i) @@ -197,7 +199,7 @@ locateField(STObject const& obj, Slice const& loc) { auto const* arr = static_cast(field); if (c >= arr->size()) - return Unexpected(HF_ERR_INDEX_OUT_OF_BOUNDS); + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](c)); } else if (STI_OBJECT == field->getSType()) @@ -206,24 +208,24 @@ locateField(STObject const& obj, Slice const& loc) auto const it = m.find(c); if (it == m.end()) - return Unexpected(HF_ERR_INVALID_FIELD); + return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); field = o->peekAtPField(fname); } else // simple field must be the last one { - return Unexpected(HF_ERR_LOCATOR_MALFORMED); + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); } if (noField(field)) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } return field; } -Expected +Expected WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) { auto const r = locateField(ctx.tx, locator); @@ -233,12 +235,12 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) return getAnyFieldData(r.value()); } -Expected +Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { auto const sle = ctx.view().read(leKey); if (!sle) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const r = locateField(*sle, locator); if (!r) @@ -247,17 +249,17 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) return getAnyFieldData(r.value()); } -Expected +Expected WasmHostFunctionsImpl::getLedgerObjNestedField( int32_t cacheIdx, Slice const& locator) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HF_ERR_SLOT_OUT_RANGE); + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return Unexpected(HF_ERR_EMPTY_SLOT); + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) @@ -266,217 +268,220 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( return getAnyFieldData(r.value()); } -int32_t +Expected WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); auto const* field = ctx.tx.peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); auto const sle = ctx.view().read(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const* field = sle->peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getLedgerObjArrayLen( int32_t cacheIdx, SField const& fname) { if (fname.fieldType != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return HF_ERR_EMPTY_SLOT; + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const* field = cache[cacheIdx]->peekAtPField(fname); if (noField(field)) - return HF_ERR_FIELD_NOT_FOUND; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) { auto const r = locateField(ctx.tx, locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) { auto const sle = ctx.view().read(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto const r = locateField(*sle, locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t +Expected WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( int32_t cacheIdx, Slice const& locator) { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return HF_ERR_SLOT_OUT_RANGE; + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); if (!cache[cacheIdx]) - return HF_ERR_EMPTY_SLOT; + return Unexpected(HostFunctionError::EMPTY_SLOT); auto const r = locateField(*cache[cacheIdx], locator); if (!r) - return r.error(); + return Unexpected(r.error()); auto const* field = r.value(); if (field->getSType() != STI_ARRAY) - return HF_ERR_NO_ARRAY; + return Unexpected(HostFunctionError::NO_ARRAY); int32_t const sz = static_cast(field)->size(); return sz; } -int32_t -WasmHostFunctionsImpl::updateData(Bytes const& data) +Expected +WasmHostFunctionsImpl::updateData(Slice const& data) { + if (data.size() > maxWasmDataLength) + { + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + } auto sle = ctx.view().peek(leKey); if (!sle) - return HF_ERR_LEDGER_OBJ_NOT_FOUND; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); sle->setFieldVL(sfData, data); ctx.view().update(sle); return 0; } -Hash -WasmHostFunctionsImpl::computeSha512HalfHash(Bytes const& data) +Expected +WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) { auto const hash = sha512Half(data); return hash; } -Expected +Expected WasmHostFunctionsImpl::accountKeylet(AccountID const& account) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::account(account); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) + Slice const& credentialType) { if (!subject || !issuer) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = - keylet::credential(subject, issuer, makeSlice(credentialType)); + auto const keylet = keylet::credential(subject, issuer, credentialType); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::escrow(account, seq); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, std::uint32_t documentId) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::oracle(account, documentId); return Bytes{keylet.key.begin(), keylet.key.end()}; } -Expected +Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { if (!account) - return Unexpected(HF_ERR_INVALID_ACCOUNT); + return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (!nftId) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); auto obj = nft::findToken(ctx.view(), account, nftId); if (!obj) - return Unexpected(HF_ERR_LEDGER_OBJ_NOT_FOUND); + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); auto ouri = obj->at(~sfURI); if (!ouri) - return Unexpected(HF_ERR_FIELD_NOT_FOUND); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); } -int32_t +Expected WasmHostFunctionsImpl::trace( - std::string const& msg, - Bytes const& data, + std::string_view const& msg, + Slice const& data, bool asHex) { #ifdef DEBUG_OUTPUT @@ -485,21 +490,24 @@ WasmHostFunctionsImpl::trace( auto j = ctx.journal.trace(); #endif if (!asHex) + { j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " << std::string_view( reinterpret_cast(data.data()), data.size()); + } else { - auto const hex = - boost::algorithm::hex(std::string(data.begin(), data.end())); + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex(data.begin(), data.end(), hex.begin()); j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); } -int32_t -WasmHostFunctionsImpl::traceNum(std::string const& msg, int64_t data) +Expected +WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { #ifdef DEBUG_OUTPUT auto j = ctx.journal.error(); diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 091ca249345..58bf4c194a8 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -57,83 +57,83 @@ class WasmHostFunctionsImpl : public HostFunctions return ctx.journal; } - int32_t + Expected getLedgerSqn() override; - int32_t + Expected getParentLedgerTime() override; - Hash + Expected getParentLedgerHash() override; - int32_t - cacheLedgerObj(Keylet const& keylet, int32_t cacheIdx) override; + Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; - Expected + Expected getTxField(SField const& fname) override; - Expected + Expected getCurrentLedgerObjField(SField const& fname) override; - Expected + Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) override; - Expected + Expected getTxNestedField(Slice const& locator) override; - Expected + Expected getCurrentLedgerObjNestedField(Slice const& locator) override; - Expected + Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; - int32_t + Expected getTxArrayLen(SField const& fname) override; - int32_t + Expected getCurrentLedgerObjArrayLen(SField const& fname) override; - int32_t + Expected getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; - int32_t + Expected getTxNestedArrayLen(Slice const& locator) override; - int32_t + Expected getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; - int32_t + Expected getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; - int32_t - updateData(Bytes const& data) override; + Expected + updateData(Slice const& data) override; - Hash - computeSha512HalfHash(Bytes const& data) override; + Expected + computeSha512HalfHash(Slice const& data) override; - Expected + Expected accountKeylet(AccountID const& account) override; - Expected + Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, - Bytes const& credentialType) override; + Slice const& credentialType) override; - Expected + Expected escrowKeylet(AccountID const& account, std::uint32_t seq) override; - Expected + Expected oracleKeylet(AccountID const& account, std::uint32_t documentId) override; - Expected + Expected getNFT(AccountID const& account, uint256 const& nftId) override; - int32_t - trace(std::string const& msg, Bytes const& data, bool asHex) override; + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override; - int32_t - traceNum(std::string const& msg, int64_t data) override; + Expected + traceNum(std::string_view const& msg, int64_t data) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 0c502733620..f1de9b22355 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -26,6 +26,8 @@ namespace ripple { +using SFieldCRef = std::reference_wrapper; + static int32_t setData( InstanceWrapper const* rt, @@ -38,70 +40,199 @@ setData( return 0; if (dst < 0 || dsz < 0 || !src || ssz < 0) - return HF_ERR_INVALID_PARAMS; + return static_cast>( + HostFunctionError::INVALID_PARAMS); auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) - return HF_ERR_NO_MEM_EXPORTED; + return static_cast>( + HostFunctionError::NO_MEM_EXPORTED); if (dst + dsz > mem.s) - return HF_ERR_POINTER_OUT_OF_BOUNDS; + return static_cast>( + HostFunctionError::POINTER_OUT_OF_BOUNDS); if (ssz > dsz) - return HF_ERR_BUFFER_TOO_SMALL; + return static_cast>( + HostFunctionError::BUFFER_TOO_SMALL); memcpy(mem.p + dst, src, ssz); return ssz; } -static Expected -getData(InstanceWrapper const* rt, int32_t src, int32_t ssz) +template +Expected +getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i32; + i++; + return result; +} + +template +Expected +getDataInt64(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i64; + i++; + return result; +} + +template +Expected +getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[i].of.i32); + if (it == m.end()) + { + return Unexpected(HostFunctionError::INVALID_FIELD); + } + i++; + return *it->second; +} + +template +Expected +getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { + auto const src = params->data[i].of.i32; + auto const ssz = params->data[i + 1].of.i32; if (src < 0 || ssz <= 0) - return Unexpected(HF_ERR_INVALID_PARAMS); + return Unexpected(HostFunctionError::INVALID_PARAMS); + + if (ssz > maxWasmDataLength) + { + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + } auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) - return Unexpected(HF_ERR_NO_MEM_EXPORTED); + return Unexpected(HostFunctionError::NO_MEM_EXPORTED); if (src + ssz > mem.s) - return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); + return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); - Bytes data(mem.p + src, mem.p + src + ssz); + Slice data(mem.p + src, ssz); + i += 2; return data; } -static Expected -getDataAccount(InstanceWrapper const* rt, int32_t ptr, int32_t sz) +template +Expected +getDataUInt256(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getData(rt, ptr, sz); - if (!r || (r->size() != AccountID::bytes)) - return Unexpected(HF_ERR_INVALID_PARAMS); + auto const r = getDataSlice(rt, params, i); + if (!r) + { + return Unexpected(r.error()); + } - return AccountID::fromVoid(r->data()); + if (r->size() != uint256::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + return uint256::fromVoid(r->data()); } -static Expected -getDataString(InstanceWrapper const* rt, int32_t src, int32_t ssz) +template +Expected +getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { - if (src < 0 || ssz <= 0) - return Unexpected(HF_ERR_INVALID_PARAMS); + auto const r = getDataSlice(rt, params, i); + if (!r || (r->size() != AccountID::bytes)) + return Unexpected(HostFunctionError::INVALID_PARAMS); - auto mem = rt ? rt->getMem() : wmem(); - if (!mem.s) - return Unexpected(HF_ERR_NO_MEM_EXPORTED); + return AccountID::fromVoid(r->data()); +} - if (src + ssz > mem.s) - return Unexpected(HF_ERR_POINTER_OUT_OF_BOUNDS); +template +Expected +getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(rt, params, i); + if (!r) + return Unexpected(r.error()); + return std::string_view( + reinterpret_cast(r->data()), r->size()); +} - std::string data(mem.p + src, mem.p + src + ssz); - return data; +std::nullptr_t +hfResult(wasm_val_vec_t* results, int32_t value) +{ + results->data[0] = WASM_I32_VAL(value); + results->num_elems = 1; + return nullptr; } -#define RET(x) \ - results->data[0] = WASM_I32_VAL(x); \ - results->num_elems = 1; \ +std::nullptr_t +hfResult(wasm_val_vec_t* results, HostFunctionError value) +{ + results->data[0] = WASM_I32_VAL( + static_cast>(value)); + results->num_elems = 1; return nullptr; +} + +template +std::nullptr_t +returnResult( + InstanceWrapper const* rt, + wasm_val_vec_t const* params, + wasm_val_vec_t* results, + Expected const& res, + int32_t index) +{ + if (!res) + { + return hfResult(results, res.error()); + } + if constexpr (std::is_same_v, Bytes>) + { + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v, Hash>) + { + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v, int32_t>) + { + return hfResult(results, res.value()); + } + else if constexpr (std::is_same_v< + std::decay_t, + std::uint32_t>) + { + auto const resultValue = res.value(); + return hfResult( + results, + setData( + rt, + params->data[index].of.i32, + params->data[index + 1].of.i32, + reinterpret_cast(&resultValue), + static_cast(sizeof(resultValue)))); + } + else + { + static_assert( + [] { return false; }(), "Unhandled return type in returnResult"); + } +} wasm_trap_t* getLedgerSqnOld_wrap( @@ -111,8 +242,12 @@ getLedgerSqnOld_wrap( { auto* hf = reinterpret_cast(env); // auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const sqn = hf->getLedgerSqn(); - RET(sqn); + auto const sqn = hf->getLedgerSqn(); + if (!sqn) + { + return hfResult(results, sqn.error()); + } + return hfResult(results, static_cast(sqn.value())); } wasm_trap_t* @@ -123,14 +258,9 @@ getLedgerSqn_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const sqn = hf->getLedgerSqn(); + int index = 0; - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - reinterpret_cast(&sqn), - static_cast(sizeof(sqn)))); + return returnResult(rt, params, results, hf->getLedgerSqn(), index); } wasm_trap_t* @@ -141,13 +271,9 @@ getParentLedgerTime_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - int32_t const ltime = hf->getParentLedgerTime(); - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - reinterpret_cast(<ime), - static_cast(sizeof(ltime)))); + int index = 0; + + return returnResult(rt, params, results, hf->getParentLedgerTime(), index); } wasm_trap_t* @@ -158,13 +284,9 @@ getParentLedgerHash_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - Hash const hash = hf->getParentLedgerHash(); - RET(setData( - rt, - params->data[0].of.i32, - params->data[1].of.i32, - hash.data(), - static_cast(hash.size()))); + int index = 0; + + return returnResult(rt, params, results, hf->getParentLedgerHash(), index); } wasm_trap_t* @@ -175,22 +297,22 @@ cacheLedgerObj_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const id = getDataUInt256(rt, params, index); + if (!id) { - RET(r.error()); + return hfResult(results, id.error()); } - if (r->size() != uint256::bytes) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(HF_ERR_INVALID_PARAMS); + return hfResult(results, cache.error()); } - uint256 const key(uint256::fromVoid(r->data())); - int32_t const idx = - hf->cacheLedgerObj(keylet::unchecked(key), params->data[2].of.i32); - RET(idx); + return returnResult( + rt, params, results, hf->cacheLedgerObj(*id, *cache), index); } wasm_trap_t* @@ -201,27 +323,14 @@ getTxField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) - { - RET(HF_ERR_INVALID_FIELD); - } - auto const& fname(*it->second); - - auto fieldData = hf->getTxField(fname); - if (!fieldData) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(fieldData.error()); + return hfResult(results, fname.error()); } - - RET(setData( - rt, - params->data[1].of.i32, - params->data[2].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult(rt, params, results, hf->getTxField(*fname), index); } wasm_trap_t* @@ -232,27 +341,16 @@ getCurrentLedgerObjField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - auto fieldData = hf->getCurrentLedgerObjField(fname); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[1].of.i32, - params->data[2].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjField(*fname), index); } wasm_trap_t* @@ -263,27 +361,22 @@ getLedgerObjField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[1].of.i32); - if (it == m.end()) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, cache.error()); } - auto const& fname(*it->second); - auto fieldData = hf->getLedgerObjField(params->data[0].of.i32, fname); - if (!fieldData) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(fieldData.error()); + return hfResult(results, fname.error()); } - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getLedgerObjField(*cache, *fname), index); } wasm_trap_t* @@ -294,25 +387,16 @@ getTxNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - auto fieldData = hf->getTxNestedField(makeSlice(r.value())); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getTxNestedField(*bytes), index); } wasm_trap_t* @@ -323,25 +407,15 @@ getCurrentLedgerObjNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - - auto fieldData = hf->getCurrentLedgerObjNestedField(makeSlice(r.value())); - if (!fieldData) - { - RET(fieldData.error()); - } - - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - fieldData->data(), - fieldData->size())); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjNestedField(*bytes), index); } wasm_trap_t* @@ -352,26 +426,26 @@ getLedgerObjNestedField_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); - if (!r) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(r.error()); + return hfResult(results, cache.error()); } - auto fieldData = hf->getLedgerObjNestedField( - params->data[0].of.i32, makeSlice(r.value())); - if (!fieldData) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(fieldData.error()); + return hfResult(results, bytes.error()); } - RET(setData( + return returnResult( rt, - params->data[3].of.i32, - params->data[4].of.i32, - fieldData->data(), - fieldData->size())); + params, + results, + hf->getLedgerObjNestedField(*cache, *bytes), + index); } wasm_trap_t* @@ -381,18 +455,16 @@ getTxArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getTxArrayLen(fname); - RET(sz); + return returnResult(rt, params, results, hf->getTxArrayLen(*fname), index); } wasm_trap_t* @@ -402,18 +474,17 @@ getCurrentLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[0].of.i32); - if (it == m.end()) + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getCurrentLedgerObjArrayLen(fname); - RET(sz); + return returnResult( + rt, params, results, hf->getCurrentLedgerObjArrayLen(*fname), index); } wasm_trap_t* @@ -423,18 +494,23 @@ getLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const& m = SField::getKnownCodeToField(); - auto const it = m.find(params->data[1].of.i32); - if (it == m.end()) + auto const cache = getDataInt32(rt, params, index); + if (!cache) + { + return hfResult(results, cache.error()); + } + + auto const fname = getDataSField(rt, params, index); + if (!fname) { - RET(HF_ERR_INVALID_FIELD); + return hfResult(results, fname.error()); } - auto const& fname(*it->second); - int32_t sz = hf->getLedgerObjArrayLen(params->data[0].of.i32, fname); - RET(sz); + return returnResult( + rt, params, results, hf->getLedgerObjArrayLen(*cache, *fname), index); } wasm_trap_t* @@ -445,15 +521,16 @@ getTxNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - int32_t sz = hf->getTxNestedArrayLen(makeSlice(r.value())); - RET(sz); + return returnResult( + rt, params, results, hf->getTxNestedArrayLen(*bytes), index); } wasm_trap_t* @@ -464,17 +541,21 @@ getCurrentLedgerObjNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - int32_t sz = hf->getCurrentLedgerObjNestedArrayLen(makeSlice(r.value())); - RET(sz); + return returnResult( + rt, + params, + results, + hf->getCurrentLedgerObjNestedArrayLen(*bytes), + index); } - wasm_trap_t* getLedgerObjNestedArrayLen_wrap( void* env, @@ -483,16 +564,25 @@ getLedgerObjNestedArrayLen_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const r = getData(rt, params->data[1].of.i32, params->data[2].of.i32); - if (!r) + auto const cache = getDataInt32(rt, params, index); + if (!cache) { - RET(r.error()); + return hfResult(results, cache.error()); } - int32_t sz = hf->getLedgerObjNestedArrayLen( - params->data[0].of.i32, makeSlice(r.value())); - RET(sz); + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + return returnResult( + rt, + params, + results, + hf->getLedgerObjNestedArrayLen(*cache, *bytes), + index); } wasm_trap_t* @@ -503,19 +593,15 @@ updateData_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - RET(HF_ERR_DATA_FIELD_TOO_LARGE) - } - - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - RET(hf->updateData(r.value())); + return returnResult(rt, params, results, hf->updateData(*bytes), index); } wasm_trap_t* @@ -526,25 +612,15 @@ computeSha512HalfHash_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); - } - - auto const r = getData(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!r) + auto const bytes = getDataSlice(rt, params, index); + if (!bytes) { - RET(r.error()); + return hfResult(results, bytes.error()); } - - auto const hash = hf->computeSha512HalfHash(r.value()); - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - hash.data(), - hash.size())); + return returnResult( + rt, params, results, hf->computeSha512HalfHash(*bytes), index); } wasm_trap_t* @@ -555,26 +631,15 @@ accountKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); - } - - auto const k = hf->accountKeylet(acc.value()); - if (!k) - { - RET(k.error()); + return hfResult(results, acc.error()); } - RET(setData( - rt, - params->data[2].of.i32, - params->data[3].of.i32, - k->data(), - k->size())); + return returnResult(rt, params, results, hf->accountKeylet(*acc), index); } wasm_trap_t* @@ -585,41 +650,32 @@ credentialKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const subject = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); - if (!subject) + auto const subj = getDataAccountID(rt, params, index); + if (!subj) { - RET(subject.error()); + return hfResult(results, subj.error()); } - auto const issuer = - getDataAccount(rt, params->data[2].of.i32, params->data[3].of.i32); - if (!issuer) + auto const iss = getDataAccountID(rt, params, index); + if (!iss) { - RET(issuer.error()); + return hfResult(results, iss.error()); } - auto const credType = - getData(rt, params->data[4].of.i32, params->data[5].of.i32); + auto const credType = getDataSlice(rt, params, index); if (!credType) { - RET(credType.error()); + return hfResult(results, credType.error()); } - auto const k = - hf->credentialKeylet(subject.value(), issuer.value(), credType.value()); - if (!k) - { - RET(k.error()); - } - - RET(setData( + return returnResult( rt, - params->data[6].of.i32, - params->data[7].of.i32, - k->data(), - k->size())); + params, + results, + hf->credentialKeylet(*subj, *iss, *credType), + index); } wasm_trap_t* @@ -630,26 +686,22 @@ escrowKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const k = hf->escrowKeylet(acc.value(), params->data[2].of.i32); - if (!k) + auto const seq = getDataInt32(rt, params, index); + if (!seq) { - RET(k.error()); + return hfResult(results, seq.error()); } - RET(setData( - rt, - params->data[3].of.i32, - params->data[4].of.i32, - k->data(), - k->size())); + return returnResult( + rt, params, results, hf->escrowKeylet(*acc, *seq), index); } wasm_trap_t* @@ -660,26 +712,21 @@ oracleKeylet_wrap( { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const k = hf->oracleKeylet(acc.value(), params->data[2].of.i32); - if (!k) + auto const seq = getDataInt32(rt, params, index); + if (!seq) { - RET(k.error()); + return hfResult(results, seq.error()); } - - RET(setData( - rt, - params->data[3].of.i32, - params->data[4].of.i32, - k->data(), - k->size())); + return returnResult( + rt, params, results, hf->oracleKeylet(*acc, *seq), index); } wasm_trap_t* @@ -687,42 +734,21 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; - auto const acc = - getDataAccount(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const acc = getDataAccountID(rt, params, index); if (!acc) { - RET(acc.error()); + return hfResult(results, acc.error()); } - auto const nftRaw = - getData(rt, params->data[2].of.i32, params->data[3].of.i32); - if (!nftRaw) + auto const nftId = getDataUInt256(rt, params, index); + if (!nftId) { - RET(nftRaw.error()); + return hfResult(results, nftId.error()); } - if (nftRaw->size() != uint256::bytes) - { - hf->getJournal().trace() - << "WAMR getNFT: Invalid NFT data size: " << nftRaw->size() - << ", expected " << (uint256::bytes); - RET(HF_ERR_INVALID_PARAMS); - } - - uint256 const ntfId(uint256::fromVoid(nftRaw->data())); - auto const nftURI = hf->getNFT(acc.value(), ntfId); - if (!nftURI) - { - RET(nftURI.error()); - } - - RET(setData( - rt, - params->data[4].of.i32, - params->data[5].of.i32, - nftURI->data(), - nftURI->size())); + return returnResult(rt, params, results, hf->getNFT(*acc, *nftId), index); } wasm_trap_t* @@ -730,28 +756,33 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = - getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const msg = getDataString(rt, params, index); if (!msg) { - RET(msg.error()); + return hfResult(results, msg.error()); } - auto const data = - getData(rt, params->data[2].of.i32, params->data[3].of.i32); + auto const data = getDataSlice(rt, params, index); if (!data) { - RET(data.error()); + return hfResult(results, data.error()); + } + + auto const asHex = getDataInt32(rt, params, index); + if (!asHex) + { + return hfResult(results, asHex.error()); } - auto const e = hf->trace(msg.value(), data.value(), params->data[4].of.i32); - RET(e); + return returnResult( + rt, params, results, hf->trace(*msg, *data, *asHex), index); } wasm_trap_t* @@ -759,21 +790,155 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); auto const* rt = reinterpret_cast(hf->getRT()); - + int index = 0; if (params->data[1].of.i32 > maxWasmDataLength) { - RET(HF_ERR_DATA_FIELD_TOO_LARGE); + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = - getDataString(rt, params->data[0].of.i32, params->data[1].of.i32); + auto const msg = getDataString(rt, params, index); if (!msg) { - RET(msg.error()); + return hfResult(results, msg.error()); + } + + auto const number = getDataInt64(rt, params, index); + if (!number) + { + return hfResult(results, number.error()); + } + + return returnResult( + rt, params, results, hf->traceNum(*msg, *number), index); +} + +class MockInstanceWrapper +{ + wmem mem_; + +public: + MockInstanceWrapper(wmem mem) : mem_(mem) + { + } + + // Mock methods to simulate the behavior of InstanceWrapper + wmem + getMem() const + { + return mem_; + } +}; + +namespace test { +bool +testGetDataIncrement() +{ + wasm_val_t values[4]; + + std::array buffer = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + MockInstanceWrapper rt(wmem{buffer.data(), buffer.size()}); + + { + // test int32_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(42); + + int index = 0; + auto const result = getDataInt32(&rt, ¶ms, index); + if (!result || result.value() != 42 || index != 1) + return false; + } + + { + // test int64_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I64_VAL(1234); + + int index = 0; + auto const result = getDataInt64(&rt, ¶ms, index); + if (!result || result.value() != 1234 || index != 1) + return false; + } + + { + // test SFieldCRef + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(sfAccount.fieldCode); + + int index = 0; + auto const result = getDataSField(&rt, ¶ms, index); + if (!result || result.value().get() != sfAccount || index != 1) + return false; + } + + { + // test Slice + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(3); + + int index = 0; + auto const result = getDataSlice(&rt, ¶ms, index); + if (!result || result.value() != Slice(buffer.data(), 3)) + return false; + } + + { + // test string + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(5); + + int index = 0; + auto const result = getDataString(&rt, ¶ms, index); + if (!result || + result.value() != + std::string_view( + reinterpret_cast(buffer.data()), 5)) + return false; + } + + { + // test account + AccountID const id(calcAccountID( + generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); + + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(id.bytes); + memcpy(&buffer[0], id.data(), id.bytes); + + int index = 0; + auto const result = getDataAccountID(&rt, ¶ms, index); + if (!result || result.value() != id) + return false; + } + + { + // test uint256 + + Hash h1 = sha512Half(Slice(buffer.data(), 8)); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(h1.bytes); + memcpy(&buffer[0], h1.data(), h1.bytes); + + int index = 0; + auto const result = getDataUInt256(&rt, ¶ms, index); + if (!result || result.value() != h1) + return false; } - auto const e = hf->traceNum(msg.value(), params->data[2].of.i64); - RET(e); + return true; } +} // namespace test } // namespace ripple From 24b7a03224f1cfc9e5d9275a33167df902379684 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 17 Jul 2025 12:37:41 -0400 Subject: [PATCH 033/212] feat: add more keylet host functions (#5522) --- src/test/app/Escrow_test.cpp | 88 ++++++- src/test/app/wasm_fixtures/fixtures.cpp | 241 +++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/test/unit_test/SuiteJournal.h | 2 + src/xrpld/app/misc/WasmHostFunc.h | 67 +++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 115 ++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 40 ++- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 290 ++++++++++++++++++++- src/xrpld/app/misc/WasmHostFuncWrapper.h | 101 +++++++ src/xrpld/app/misc/WasmVM.cpp | 12 +- src/xrpld/app/tx/detail/Escrow.cpp | 2 +- 11 files changed, 944 insertions(+), 16 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 1ade21eb59b..b3409ed14fd 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2263,23 +2263,11 @@ struct Escrow_test : public beast::unit_test::suite // TODO: create wasm module for all host functions static auto wasmHex = allHostFunctionsHex; - // let sender = get_tx_account_id(); - // let owner = get_current_escrow_account_id(); - // let dest = get_current_escrow_destination(); - // let dest_balance = get_account_balance(dest); - // let escrow_data = get_current_escrow_data(); - // let ed_str = String::from_utf8(escrow_data).unwrap(); - // let threshold_balance = ed_str.parse::().unwrap(); - // let pl_time = host_lib::getParentLedgerTime(); - // let e_time = get_current_escrow_finish_after(); - // sender == owner && dest_balance <= threshold_balance && - // pl_time >= e_time Account const alice{"alice"}; Account const carol{"carol"}; { - // basic FinishFunction situation Env env(*this); // create escrow env.fund(XRP(5000), alice, carol); @@ -2350,6 +2338,81 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testKeyletHostFunctions() + { + testcase("Test all keylet host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = keyletHostFunctions; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env(*this); + env.fund(XRP(5000), alice, carol); + } + + { + Env env{*this}; + env.fund(XRP(5000), alice, carol); + + BEAST_EXPECT(env.seq(alice) == 4); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + + // base objects that need to be created first + auto const tokenId = + token::getNextID(env, alice, 0, tfTransferable); + env(token::mint(alice, 0u), txflags(tfTransferable)); + env(trust(alice, carol["USD"](1'000'000))); + env.close(); + BEAST_EXPECT(env.seq(alice) == 6); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); + + // set up a bunch of objects to check their keylets + env(check::create(alice, carol, XRP(100))); + env(credentials::create(alice, alice, "termsandconditions")); + env(delegate::set(alice, carol, {"TrustSet"})); + env(deposit::auth(alice, carol)); + env(did::set(alice), did::data("alice_did")); + env(escrow::create(alice, carol, XRP(100)), + escrow::finish_time(env.now() + 100s)); + env(token::createOffer(carol, tokenId, XRP(100)), + token::owner(alice)); + env(create(alice, carol, XRP(1000), 100s, alice.pk())); + env(signers(alice, 1, {{carol, 1}})); + env(ticket::create(alice, 1)); + env.close(); + + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 11); + if (BEAST_EXPECTS( + env.seq(alice) == 16, std::to_string(env.seq(alice)))) + { + auto const seq = env.seq(alice); + XRPAmount txnFees = env.current()->fees().base + 1000; + env(escrow::create(alice, carol, XRP(1000)), + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + auto const allowance = 1'000'000; + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(txnFees)); + env.close(); + } + } + } + void testWithFeats(FeatureBitset features) { @@ -2371,6 +2434,7 @@ struct Escrow_test : public beast::unit_test::suite // TODO: Update module with new host functions testAllHostFunctions(); + testKeyletHostFunctions(); } public: diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 146c4338a03..c2dab9252a3 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11756,3 +11756,244 @@ extern std::string const opcCallPerfTest = "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" "0b0e01004180080b07623a2025660a00"; + +extern std::string const keyletHostFunctions = + "0061736d01000000015b0c60057f7f7f7f7f017f60037f7f7f017f60037f7f7e017f60047f" + "7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60000060037f7f7f0060027f7f0002c6031108686f73745f" + "6c6962057472616365000008686f73745f6c69621063616368655f6c65646765725f6f626a" + "000108686f73745f6c69620974726163655f6e756d000208686f73745f6c6962146765745f" + "6c65646765725f6f626a5f6669656c64000308686f73745f6c69621c6765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c64000108686f73745f6c69620e6163636f756e" + "745f6b65796c6574000308686f73745f6c69620b6c696e655f6b65796c6574000408686f73" + "745f6c69620c636865636b5f6b65796c6574000008686f73745f6c69621163726564656e74" + "69616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c6574" + "000508686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000508" + "686f73745f6c69620a6469645f6b65796c6574000308686f73745f6c69620d657363726f77" + "5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c65740000" + "08686f73745f6c69620e7061796368616e5f6b65796c6574000608686f73745f6c69620e73" + "69676e6572735f6b65796c6574000308686f73745f6c69620d7469636b65745f6b65796c65" + "740000030d0c0708090a0a0a0b0b0b0a0b0b05030100110619037f01418080c0000b7f0041" + "f989c0000b7f0041808ac0000b073e05066d656d6f727902000d6f626a6563745f65786973" + "747300110666696e69736800120a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020a94270c9a0603017f037e037f23808080800041f0006b2205248080808000024002" + "40024020012d00000d00200541186a200141196a290000370300200541106a200141116a29" + "0000370300200541086a200141096a29000037030020052001290001370300200220032005" + "412041011080808080001a20054120410010818080800022014101480d0102400240024002" + "4020040d00418b80c08000410f428580141082808080001a200541d0006a41186a42003703" + "00200541d0006a41106a4200370300200541d0006a41086a42003703002005420037035020" + "0141858014200541d0006a412010838080800022014120470d01200541206a41086a200541" + "d0006a410f6a22012900002206370300200541206a41106a200541e7006a22042900002207" + "370300200541206a41186a200541ef006a22032d000022023a000020052005290057220837" + "032020052f015021092005280152210a20052d0056210b2001200637000020042007370000" + "200320023a00002005200b3a00562005200a360152200520093b015020052008370057419a" + "80c08000410c200541d0006a412041011080808080001a0c030b418b80c08000410f2004ac" + "1082808080001a200541e0006a4100360200200541d8006a42003703002005420037035020" + "012004200541d0006a411410838080800022014114460d0141a680c0800041152001417f20" + "01417f481b2201ac1082808080001a200041013a0000200020013602040c050b41a680c080" + "0041152001417f2001417f481b2201ac1082808080001a200041013a000020002001360204" + "0c040b200541226a20052d00523a0000200520052900573703402005200541d0006a410c6a" + "290000370045200541206a410c6a2005290045370000200520052f01503b01202005200528" + "005336002320052005290340370027419a80c08000410c200541206a411441011080808080" + "001a0b20004180023b01000c020b41c280c08000411620012802042201ac1082808080001a" + "200041013a0000200020013602040c010b41bb80c0800041072001ac1082808080001a2000" + "41013a0000200041783602040b200541f0006a2480808080000bd21201067f238080808000" + "4190046b220024808080800041d880c0800041234100410041001080808080001a20004180" + "046a22014100360200200041f8036a22024200370300200042003703f00302400240024002" + "4041818020200041f0036a411410848080800022034114470d00200041046a41026a20002d" + "00f2033a0000200020002900f7033703502000200041f0036a410c6a220329000037005520" + "0041046a410c6a2000290055370000200020002f01f0033b0104200020002800f303360007" + "2000200029035037000b41fb80c08000410a200041046a411441011080808080001a200141" + "0036020020024200370300200042003703f00341838020200041f0036a4114108480808000" + "22014114470d01200041186a41026a20002d00f2033a0000200020002900f7033703502000" + "2003290000370055200041186a410c6a2000290055370000200020002f01f0033b01182000" + "20002800f30336001b2000200029035037001f418581c08000410e200041186a4114410110" + "80808080001a20004188046a2202420037030020004180046a22034200370300200041f803" + "6a22044200370300200042003703f003200041046a4114200041f0036a4120108580808000" + "22014120460d02024002402001417f4a0d00200020013602300c010b2000417f3602300b41" + "0121010c030b418080c08000410b2003417f2003417f481bac1082808080001a1093808080" + "00000b418080c08000410b2001417f2001417f481bac1082808080001a109380808000000b" + "200041c5006a20022903003700002000413d6a2003290300370000200041356a2004290300" + "370000200020002903f00337002d410021010b200020013a002c200041f0036a2000412c6a" + "419381c080004107418180201091808080000240024020002d00f0030d00024020002d00f1" + "030d00419a81c0800041364100410041001080808080001a0c010b4100210141d081c08000" + "41354100410041001080808080001a200041de006a41c4003a0000200041d0006a41086a41" + "00360200200041e3006a41003a0000200041d5a6013b015c20004200370350200041003600" + "5f20004188046a2203420037030020004180046a22044200370300200041f0036a41086a22" + "054200370300200042003703f00302400240200041046a4114200041186a4114200041d000" + "6a4114200041f0036a412010868080800022024120460d00024002402002417f4a0d002000" + "20023602680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000" + "200041f5006a2004290300370000200041ed006a2005290300370000200020002903f00337" + "00650b200020013a0064200041f0036a200041e4006a418582c08000410941001091808080" + "0020002d00f0030d00024020002d00f1030d00418e82c08000413a41004100410010808080" + "80001a0c010b4100210141c882c0800041394100410041001080808080001a20004188046a" + "2203420037030020004180046a22044200370300200041f8036a2205420037030020004200" + "3703f00302400240200041046a41144106200041f0036a412010878080800022024120460d" + "00024002402002417f4a0d002000200236028c010c010b2000417f36028c010b410121010c" + "010b200041a1016a200329030037000020004199016a200429030037000020004191016a20" + "05290300370000200020002903f003370089010b200020013a008801200041f0036a200041" + "88016a418183c0800041054181802010918080800020002d00f0030d00024020002d00f103" + "0d00419a81c0800041364100410041001080808080001a0c010b41d081c080004135410041" + "0041001080808080001a200041ac016a200041046a200041046a109480808000200041f003" + "6a200041ac016a419883c08000410a4198802010918080800020002d00f0030d0002402000" + "2d00f1030d0041a283c08000413b4100410041001080808080001a0c010b41dd83c0800041" + "3a4100410041001080808080001a200041d0016a200041046a200041186a10958080800020" + "0041f0036a200041d0016a419784c0800041084181802010918080800020002d00f0030d00" + "024020002d00f1030d00419f84c0800041394100410041001080808080001a0c010b41d884" + "c0800041384100410041001080808080001a200041f4016a200041046a200041186a109680" + "808000200041f0036a200041f4016a419784c0800041084181802010918080800020002d00" + "f0030d00024020002d00f1030d00419f84c0800041394100410041001080808080001a0c01" + "0b41d884c0800041384100410041001080808080001a20004198026a200041046a10978080" + "8000200041f0036a20004198026a419381c0800041074181802010918080800020002d00f0" + "030d00024020002d00f1030d00419a81c0800041364100410041001080808080001a0c010b" + "41d081c0800041354100410041001080808080001a200041bc026a200041046a1098808080" + "00200041f0036a200041bc026a419085c0800041064181802010918080800020002d00f003" + "0d00024020002d00f1030d00419685c0800041374100410041001080808080001a0c010b41" + "cd85c0800041364100410041001080808080001a200041e0026a200041186a109980808000" + "200041f0036a200041e0026a418386c08000410c4182802010918080800020002d00f0030d" + "00024020002d00f1030d00418f86c08000413d4100410041001080808080001a0c010b41cc" + "86c08000413c4100410041001080808080001a20004184036a200041046a200041186a109a" + "80808000200041f0036a20004184036a418887c08000410a4181802010918080800020002d" + "00f0030d00024020002d00f1030d00419287c08000413b4100410041001080808080001a0c" + "010b41cd87c08000413a4100410041001080808080001a200041a8036a200041046a109b80" + "808000200041f0036a200041a8036a418788c08000410a410010918080800020002d00f003" + "0d00024020002d00f1030d00419188c08000413b4100410041001080808080001a0c010b41" + "cc88c08000413a4100410041001080808080001a200041cc036a200041046a109c80808000" + "200041f0036a200041cc036a418689c0800041064181802010918080800020002d00f0030d" + "00024020002d00f1030d00418c89c0800041374100410041001080808080001a0c010b41c3" + "89c0800041364100410041001080808080001a410121010c010b410021010b20004190046a" + "24808080800020010b0300000bd10101047f23808080800041206b22032480808080002003" + "41186a22044200370300200341106a22054200370300200341086a22064200370300200342" + "00370300024002402001411420024114418683c08000411220034120108880808000220241" + "20460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b41012102" + "0c010b20002003290300370001200041196a2004290300370000200041116a200529030037" + "0000200041096a2006290300370000410021020b200020023a0000200341206a2480808080" + "000bc90101047f23808080800041206b2203248080808000200341186a2204420037030020" + "0341106a22054200370300200341086a220642003703002003420037030002400240200141" + "14200241142003412010898080800022024120460d00024002402002417f4a0d0020002002" + "3602040c010b2000417f3602040b410121020c010b20002003290300370001200041196a20" + "04290300370000200041116a2005290300370000200041096a200629030037000041002102" + "0b200020023a0000200341206a2480808080000bc90101047f23808080800041206b220324" + "8080808000200341186a22044200370300200341106a22054200370300200341086a220642" + "003703002003420037030002400240200141142002411420034120108a8080800022024120" + "460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b410121020c" + "010b20002003290300370001200041196a2004290300370000200041116a20052903003700" + "00200041096a2006290300370000410021020b200020023a0000200341206a248080808000" + "0bc50101047f23808080800041206b2202248080808000200241186a220342003703002002" + "41106a22044200370300200241086a22054200370300200242003703000240024020014114" + "20024120108b8080800022014120460d00024002402001417f4a0d00200020013602040c01" + "0b2000417f3602040b410121010c010b20002002290300370001200041196a200329030037" + "0000200041116a2004290300370000200041096a2005290300370000410021010b20002001" + "3a0000200241206a2480808080000bc70101047f23808080800041206b2202248080808000" + "200241186a22034200370300200241106a22044200370300200241086a2205420037030020" + "0242003703000240024020014114410b20024120108c8080800022014120460d0002400240" + "2001417f4a0d00200020013602040c010b2000417f3602040b410121010c010b2000200229" + "0300370001200041196a2003290300370000200041116a2004290300370000200041096a20" + "05290300370000410021010b200020013a0000200241206a2480808080000bc70101047f23" + "808080800041206b2202248080808000200241186a22034200370300200241106a22044200" + "370300200241086a2205420037030020024200370300024002402001411441042002412010" + "8d8080800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f" + "3602040b410121010c010b20002002290300370001200041196a2003290300370000200041" + "116a2004290300370000200041096a2005290300370000410021010b200020013a00002002" + "41206a2480808080000bcb0101047f23808080800041206b2203248080808000200341186a" + "22044200370300200341106a22054200370300200341086a22064200370300200342003703" + "00024002402001411420024114410c20034120108e8080800022024120460d000240024020" + "02417f4a0d00200020023602040c010b2000417f3602040b410121020c010b200020032903" + "00370001200041196a2004290300370000200041116a2005290300370000200041096a2006" + "290300370000410021020b200020023a0000200341206a2480808080000bc50101047f2380" + "8080800041206b2202248080808000200241186a22034200370300200241106a2204420037" + "0300200241086a2205420037030020024200370300024002402001411420024120108f8080" + "800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f360204" + "0b410121010c010b20002002290300370001200041196a2003290300370000200041116a20" + "04290300370000200041096a2005290300370000410021010b200020013a0000200241206a" + "2480808080000bc70101047f23808080800041206b2202248080808000200241186a220342" + "00370300200241106a22044200370300200241086a22054200370300200242003703000240" + "024020014114410f2002412010908080800022014120460d00024002402001417f4a0d0020" + "0020013602040c010b2000417f3602040b410121010c010b20002002290300370001200041" + "196a2003290300370000200041116a2004290300370000200041096a200529030037000041" + "0021010b200020013a0000200241206a2480808080000b0b830a0100418080c0000bf90965" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e20242424242420204163636f756e743a202044657374696e6174696f6e3a4163" + "636f756e742020436865636b206f626a65637420646f6573206e6f742065786973742c2061" + "626f7274696e6720657363726f772066696e6973682e2020436865636b206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e54727573746c696e65202054727573746c696e65206f626a65637420646f6573206e6f74" + "2065786973742c2061626f7274696e6720657363726f772066696e6973682e202054727573" + "746c696e65206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e436865636b7465726d73616e64636f6e646974696f6e73" + "43726564656e7469616c202043726564656e7469616c206f626a65637420646f6573206e6f" + "742065786973742c2061626f7274696e6720657363726f772066696e6973682e2020437265" + "64656e7469616c206f626a656374206578697374732c2070726f63656564696e6720776974" + "6820657363726f772066696e6973682e44656c6567617465202044656c6567617465206f62" + "6a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f7720" + "66696e6973682e202044656c6567617465206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e457363726f772020457363" + "726f77206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065" + "7363726f772066696e6973682e2020457363726f77206f626a656374206578697374732c20" + "70726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e" + "4f6666657220204e46546f6b656e4f66666572206f626a65637420646f6573206e6f742065" + "786973742c2061626f7274696e6720657363726f772066696e6973682e20204e46546f6b65" + "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e5061794368616e6e656c20205061794368616e6e656c" + "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" + "6f772066696e6973682e20205061794368616e6e656c206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e6572" + "4c69737420205369676e65724c697374206f626a65637420646f6573206e6f742065786973" + "742c2061626f7274696e6720657363726f772066696e6973682e20205369676e65724c6973" + "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" + "6f772066696e6973682e5469636b657420205469636b6574206f626a65637420646f657320" + "6e6f742065786973742c2061626f7274696e6720657363726f772066696e6973682e202054" + "69636b6574206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e00ad0d046e616d650014136b65796c65745f6578616d70" + "6c652e7761736d01ef0c1d002b5f5a4e387872706c5f73746434686f737435747261636531" + "3768356563663766653133666438643166354501375f5a4e387872706c5f73746434686f73" + "74313663616368655f6c65646765725f6f626a313768373838623636346237363634616165" + "3145022f5f5a4e387872706c5f73746434686f73743974726163655f6e756d313768653639" + "3463616436386330376633386345033b5f5a4e387872706c5f73746434686f737432306765" + "745f6c65646765725f6f626a5f6669656c6431376838373939646530383866396236356339" + "4504435f5a4e387872706c5f73746434686f737432386765745f63757272656e745f6c6564" + "6765725f6f626a5f6669656c64313768346239313763353864363137613961394505355f5a" + "4e387872706c5f73746434686f737431346163636f756e745f6b65796c6574313768616233" + "363663616435383039376261304506325f5a4e387872706c5f73746434686f737431316c69" + "6e655f6b65796c6574313768653466386161383862646663633464664507335f5a4e387872" + "706c5f73746434686f73743132636865636b5f6b65796c6574313768333165356538343139" + "326131633631654508385f5a4e387872706c5f73746434686f7374313763726564656e7469" + "616c5f6b65796c6574313768643731653739346561383463373839644509365f5a4e387872" + "706c5f73746434686f7374313564656c65676174655f6b65796c6574313768323639663430" + "63643739663834373237450a3d5f5a4e387872706c5f73746434686f737432326465706f73" + "69745f707265617574685f6b65796c65743137686161306631646338616233346634623745" + "0b315f5a4e387872706c5f73746434686f737431306469645f6b65796c6574313768313866" + "61393935616436326331313139450c345f5a4e387872706c5f73746434686f737431336573" + "63726f775f6b65796c657431376838373464316235373266376333326437450d375f5a4e38" + "7872706c5f73746434686f737431366e66745f6f666665725f6b65796c6574313768663931" + "35393838643961386466633863450e355f5a4e387872706c5f73746434686f737431347061" + "796368616e5f6b65796c657431376862373435373234653534336539333565450f355f5a4e" + "387872706c5f73746434686f737431347369676e6572735f6b65796c657431376866646335" + "3536343961633961626465304510345f5a4e387872706c5f73746434686f73743133746963" + "6b65745f6b65796c65743137683164393432633034663234386362666545110d6f626a6563" + "745f657869737473120666696e69736813305f5a4e34636f72653970616e69636b696e6739" + "70616e69635f666d74313768623931626164616365366565383238374514465f5a4e387872" + "706c5f73746434636f7265357479706573376b65796c657473313763726564656e7469616c" + "5f6b65796c6574313768353839343033303564323939613236354515445f5a4e387872706c" + "5f73746434636f7265357479706573376b65796c657473313564656c65676174655f6b6579" + "6c65743137686665363134666163326238656437626445164b5f5a4e387872706c5f737464" + "34636f7265357479706573376b65796c65747332326465706f7369745f707265617574685f" + "6b65796c65743137683634303539316533346337323839363645173f5f5a4e387872706c5f" + "73746434636f7265357479706573376b65796c65747331306469645f6b65796c6574313768" + "326538323337313938626638373463634518425f5a4e387872706c5f73746434636f726535" + "7479706573376b65796c6574733133657363726f775f6b65796c6574313768363462336265" + "663061333138383233634519455f5a4e387872706c5f73746434636f726535747970657337" + "6b65796c65747331366e66745f6f666665725f6b65796c6574313768633833353933386361" + "63306465646263451a435f5a4e387872706c5f73746434636f7265357479706573376b6579" + "6c65747331347061796368616e5f6b65796c65743137683332396231633338396165343162" + "3638451b435f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331" + "347369676e6572735f6b65796c657431376839633832313566396330386134636565451c42" + "5f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331337469636b" + "65745f6b65796c65743137683366303138626436663561373338326645071201000f5f5f73" + "7461636b5f706f696e746572090a0100072e726f64617461004d0970726f64756365727302" + "086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d" + "312e38352e31202834656231363132353020323032352d30332d31352900490f7461726765" + "745f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62" + "616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index d1c689a0162..aa560580ffa 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -60,3 +60,5 @@ extern std::string const reqNonexistentField; extern std::string const hfPerfTest; extern std::string const opcCallPerfTest; + +extern std::string const keyletHostFunctions; diff --git a/src/test/unit_test/SuiteJournal.h b/src/test/unit_test/SuiteJournal.h index b5c59f3d29e..d56c297b0a2 100644 --- a/src/test/unit_test/SuiteJournal.h +++ b/src/test/unit_test/SuiteJournal.h @@ -94,6 +94,8 @@ SuiteJournalSink::writeAlways( return "FTL:"; }(); + static std::mutex log_mutex; + std::lock_guard lock(log_mutex); suite_.log << s << partition_ << text << std::endl; } diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index b507d6fe696..00f89a4ac73 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -26,6 +26,7 @@ #include #include #include +#include namespace ripple { @@ -183,6 +184,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + checkKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected credentialKeylet( AccountID const& subject, @@ -192,18 +199,78 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + didKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected escrowKeylet(AccountID const& account, std::uint32_t seq) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + offerKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected oracleKeylet(AccountID const& account, std::uint32_t docId) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + signersKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 6c7ae43d91e..e35af622d46 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -419,6 +419,15 @@ WasmHostFunctionsImpl::accountKeylet(AccountID const& account) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::credentialKeylet( AccountID const& subject, @@ -437,6 +446,41 @@ WasmHostFunctionsImpl::credentialKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::didKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::did(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::delegateKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::delegate(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::depositPreauthKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::depositPreauth(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) { @@ -446,6 +490,43 @@ WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) +{ + if (!account1 || !account2) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account1 == account2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (currency.isZero()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::line(account1, account2, currency); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::nftOfferKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::nftoffer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::offer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::oracleKeylet( AccountID const& account, @@ -457,6 +538,40 @@ WasmHostFunctionsImpl::oracleKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) +{ + if (!account || !destination) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == destination) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (seq == 0) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::payChan(account, destination, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::signersKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::signers(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::ticket(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 58bf4c194a8..a22097ed6be 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -114,17 +114,55 @@ class WasmHostFunctionsImpl : public HostFunctions Expected accountKeylet(AccountID const& account) override; + Expected + checkKeylet(AccountID const& account, std::uint32_t seq) override; + Expected credentialKeylet( AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override; + Expected + didKeylet(AccountID const& account) override; + + Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + override; + + Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + override; + Expected escrowKeylet(AccountID const& account, std::uint32_t seq) override; Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override; + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) override; + + Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + offerKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) override; + + Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) override; + + Expected + signersKeylet(AccountID const& account) override; + + Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) override; Expected getNFT(AccountID const& account, uint256 const& nftId) override; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index f1de9b22355..c2b321e85ac 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -146,6 +146,17 @@ getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) return AccountID::fromVoid(r->data()); } +template +static Expected +getDataCurrency(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(rt, params, i); + if (!r || (r->size() != Currency::bytes)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Currency::fromVoid(r->data()); +} + template Expected getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) @@ -642,6 +653,32 @@ accountKeylet_wrap( return returnResult(rt, params, results, hf->accountKeylet(*acc), index); } +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, params, results, hf->checkKeylet(acc.value(), *seq), index); +} + wasm_trap_t* credentialKeylet_wrap( void* env, @@ -678,6 +715,82 @@ credentialKeylet_wrap( index); } +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(rt, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + rt, + params, + results, + hf->delegateKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(rt, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + rt, + params, + results, + hf->depositPreauthKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult(rt, params, results, hf->didKeylet(acc.value()), index); +} + wasm_trap_t* escrowKeylet_wrap( void* env, @@ -704,6 +817,98 @@ escrowKeylet_wrap( rt, params, results, hf->escrowKeylet(*acc, *seq), index); } +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc1 = getDataAccountID(rt, params, index); + if (!acc1) + { + return hfResult(results, acc1.error()); + } + + auto const acc2 = getDataAccountID(rt, params, index); + if (!acc2) + { + return hfResult(results, acc2.error()); + } + + auto const currency = getDataCurrency(rt, params, index); + if (!currency) + { + return hfResult(results, currency.error()); + } + + return returnResult( + rt, + params, + results, + hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), + index); +} + +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, + params, + results, + hf->nftOfferKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, params, results, hf->offerKeylet(acc.value(), seq.value()), index); +} + wasm_trap_t* oracleKeylet_wrap( void* env, @@ -720,13 +925,96 @@ oracleKeylet_wrap( return hfResult(results, acc.error()); } + auto const documentId = getDataInt32(rt, params, index); + if (!documentId) + { + return hfResult(results, documentId.error()); + } + return returnResult( + rt, params, results, hf->oracleKeylet(*acc, *documentId), index); +} + +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const dest = getDataAccountID(rt, params, index); + if (!dest) + { + return hfResult(results, dest.error()); + } + + auto const seq = getDataInt32(rt, params, index); + if (!seq) + { + return hfResult(results, seq.error()); + } + + return returnResult( + rt, + params, + results, + hf->paychanKeylet(acc.value(), dest.value(), seq.value()), + index); +} + +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult( + rt, params, results, hf->signersKeylet(acc.value()), index); +} + +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + auto const seq = getDataInt32(rt, params, index); if (!seq) { return hfResult(results, seq.error()); } + return returnResult( - rt, params, results, hf->oracleKeylet(*acc, *seq), index); + rt, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); + ; } wasm_trap_t* diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index ac0cb88e497..93b681009de 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -169,6 +169,14 @@ accountKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using checkKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using credentialKeylet_proto = int32_t( uint8_t const*, int32_t, @@ -184,6 +192,39 @@ credentialKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using delegateKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using depositPreauthKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using didKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +didKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using escrowKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -192,6 +233,37 @@ escrowKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using lineKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using nftOfferKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using offerKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using oracleKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -200,6 +272,35 @@ oracleKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using paychanKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using ticketKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using getNFT_proto = int32_t( uint8_t const*, int32_t, diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 3f7d61c349d..c9badfe460b 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -61,10 +61,20 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, getNFT, "get_NFT", hfs, 1000); + WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index e9a7c78c7f6..a82aa399997 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -233,7 +233,7 @@ EscrowCreate::preflight(PreflightContext const& ctx) } HostFunctions mock; - auto const re = preflightEscrowWasm(code, "finish", {}, &mock); + auto const re = preflightEscrowWasm(code, "finish", {}, &mock, ctx.j); if (!isTesSuccess(re)) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; From 9eca1a3a0c33eb3053ebe8c44d0977f7030d8f9a Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 22 Jul 2025 13:43:21 -0400 Subject: [PATCH 034/212] MPT and IOU support for amount and issue (#5573) * MPT and IOU support for ammount and issue * Fix tests Update wasm code to the latest version Remove deprecated tests Remove deprecated wasm --- src/test/app/Escrow_test.cpp | 42 +- src/test/app/TestHostFunctions.h | 46 +- src/test/app/Wasm_test.cpp | 185 ++------ src/test/app/wasm_fixtures/fixtures.cpp | 496 ++++++++++++--------- src/test/app/wasm_fixtures/fixtures.h | 4 - src/xrpld/app/misc/WasmHostFuncImpl.cpp | 50 ++- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 48 +- src/xrpld/app/misc/WasmHostFuncWrapper.h | 7 - src/xrpld/app/misc/WasmVM.cpp | 18 +- 9 files changed, 433 insertions(+), 463 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index b3409ed14fd..a92fac57eb1 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1707,10 +1707,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} static auto wasmHex = ledgerSqnHex; { @@ -1880,10 +1877,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} static auto wasmHex = ledgerSqnHex; { @@ -2028,12 +2022,9 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; // Tests whether the ledger index is >= 5 - // #[no_mangle] - // pub fn finish() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5} - // } + // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnHex; - std::uint32_t const allowance = 64; + std::uint32_t const allowance = 71; { // basic FinishFunction situation @@ -2288,7 +2279,7 @@ struct Escrow_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); - auto const allowance = 20'000; + auto const allowance = 1'000'000; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), @@ -2296,31 +2287,12 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecNO_PERMISSION)); env.close(); - - // tx sender not escrow creator (alice) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); env.close(); - - // destination balance is too high - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); - env.close(); // reduce the destination balance env(pay(carol, alice, XRP(4500))); env.close(); - - // tx sender not escrow creator (alice) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); env.close(); env(escrow::finish(alice, alice, seq), @@ -2329,8 +2301,8 @@ struct Escrow_test : public beast::unit_test::suite ter(tesSUCCESS)); auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 10817); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 680ec03896c..6a177380492 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -25,11 +25,38 @@ #include #include -#include - namespace ripple { namespace test { +struct TestLedgerDataProvider : public HostFunctions +{ + jtx::Env* env_; + void const* rt_ = nullptr; + +public: + TestLedgerDataProvider(jtx::Env* env) : env_(env) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + Expected + getLedgerSqn() override + { + return static_cast(env_->current()->seq()); + } +}; + struct TestHostFunctions : public HostFunctions { test::jtx::Env& env_; @@ -286,16 +313,19 @@ struct TestHostFunctions : public HostFunctions #else auto j = getJournal().trace(); #endif - j << "WASM TRACE: " << msg; if (!asHex) - j << std::string_view( - reinterpret_cast(data.data()), data.size()); + { + j << "WAMR TRACE: " << msg << " " + << std::string_view( + reinterpret_cast(data.data()), data.size()); + } else { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex(data.begin(), data.end(), hex.begin()); - j << hex; + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE: " << msg << " " << hex; } #ifdef DEBUG_OUTPUT @@ -313,7 +343,7 @@ struct TestHostFunctions : public HostFunctions #else auto j = getJournal().trace(); #endif - j << "WASM TRACE NUM: " << msg << data; + j << "WAMR TRACE NUM: " << msg << " " << data; #ifdef DEBUG_OUTPUT j << std::endl; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 6c77706b8b5..d03135ae65c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -17,21 +17,15 @@ */ //============================================================================== -#include -#include -#include - -#include -#include -#include -#include - -#include - #ifdef _DEBUG // #define DEBUG_OUTPUT 1 #endif +#include + +#include +#include + namespace ripple { namespace test { @@ -49,34 +43,6 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } -struct TestLedgerDataProvider -{ - jtx::Env* env; - -public: - TestLedgerDataProvider(jtx::Env* env_) : env(env_) - { - } - - Expected - get_ledger_sqn() - { - return (int32_t)env->current()->seq(); - } -}; - -using getLedgerSqn_proto = std::int32_t(); -static wasm_trap_t* -getLedgerSqn_wrap(void* env, wasm_val_vec_t const*, wasm_val_vec_t* results) -{ - auto sqn = reinterpret_cast(env)->get_ledger_sqn(); - - results->data[0] = WASM_I32_VAL(sqn.value()); - results->num_elems = 1; - - return nullptr; -} - struct Wasm_test : public beast::unit_test::suite { void @@ -174,20 +140,19 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestLedgerDataProvider ledgerDataProvider(&env); + TestLedgerDataProvider hf(&env); std::string const funcName("finish"); std::vector imports; - WASM_IMPORT_FUNC(imports, getLedgerSqn, &ledgerDataProvider, 33); - + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + wasm, funcName, {}, imports, &hf, 1'000'000, env.journal); - // code takes 4 gas + 1 getLedgerSqn call + // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re->result && (re->cost == 37)); + BEAST_EXPECT(!re->result && (re->cost == 44)); env.close(); env.close(); @@ -195,12 +160,11 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module - run the same instance - re = engine.run( - {}, funcName, {}, imports, nullptr, 1'000'000, env.journal); + re = engine.run({}, funcName, {}, imports, &hf, 1'000'000, env.journal); - // code takes 8 gas + 2 getLedgerSqn calls + // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result && (re->cost == 74)); + BEAST_EXPECT(re->result && (re->cost == 88)); } void @@ -372,26 +336,14 @@ struct Wasm_test : public beast::unit_test::suite } void - testEscrowWasmDN1() + testEscrowWasmDN() { - testcase("escrow wasm devnet 1 test"); - std::string const wasmHex = allHostFunctionsHex; + testcase("escrow wasm devnet test"); - std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::string const wasmStr = + boost::algorithm::unhex(allHostFunctionsHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); - // let sender = get_tx_account_id(); - // let owner = get_current_escrow_account_id(); - // let dest = get_current_escrow_destination(); - // let dest_balance = get_account_balance(dest); - // let escrow_data = get_current_escrow_data(); - // let ed_str = String::from_utf8(escrow_data).unwrap(); - // let threshold_balance = ed_str.parse::().unwrap(); - // let pl_time = host_lib::getParentLedgerTime(); - // let e_time = get_current_escrow_finish_after(); - // sender == owner && dest_balance <= threshold_balance && - // pl_time >= e_time - using namespace test::jtx; Env env{*this}; { @@ -400,29 +352,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(!re->result && (re->cost == 10817)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - - env.close(); - env.close(); - env.close(); - env.close(); - - { // fail because current time < escrow_finish_after time - TestHostFunctions nfs(env, -1); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(!re->result && (re->cost == 10817)); - // std::cout << "bad case (current time < escrow_finish_after " - // "time) result " - // << re.value().result << " cost: " << - // re.value().cost - // << std::endl; + BEAST_EXPECT(re->result && (re->cost == 41'132)); } } @@ -441,7 +371,7 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); std::string funcName("finish"); auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; } @@ -460,15 +390,15 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 93)); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; } { // fail because recursion too deep - auto wasmHex = deepRecursionHex; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + + auto const wasmStr = boost::algorithm::unhex(deepRecursionHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctionsSink nfs(env); @@ -518,55 +448,6 @@ struct Wasm_test : public beast::unit_test::suite } } - void - testEscrowWasmDN3() - { - testcase("wasm devnet 3 test"); - - std::string const funcName("finish"); - - using namespace test::jtx; - - Env env(*this); - { - std::string const wasmHex = xrplStdExampleHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - TestHostFunctions nfs(env, 0); - - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 6570)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - - env.close(); - env.close(); - env.close(); - env.close(); - env.close(); - - { - std::string const wasmHex = hostFunctions2Hex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - TestHostFunctions nfs(env, 0); - - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 16558)); - // std::cout << "good case result " << re.value().result - // << " cost: " << re.value().cost << std::endl; - } - } - } - void testHFCost() { @@ -578,7 +459,7 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = hostFunctions2Hex; + std::string const wasmHex = allHostFunctionsHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -590,13 +471,11 @@ struct Wasm_test : public beast::unit_test::suite i.gas = 0; auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) { - // std::cout << ", ret: " << re->result - // << ", gas spent: " << re->cost << std::endl; - BEAST_EXPECT(re->result && (re->cost == 138)); + BEAST_EXPECT(re->result && (re->cost == 872)); } env.close(); @@ -609,7 +488,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { - std::string const wasmHex = hostFunctions2Hex; + std::string const wasmHex = allHostFunctionsHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -619,13 +498,11 @@ struct Wasm_test : public beast::unit_test::suite std::vector const imp = createWasmImport(&hfs); auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1000'000, env.journal); + wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) { - // std::cout << ", ret: " << re->result - // << ", gas spent: " << re->cost << std::endl; - BEAST_EXPECT(re->result && (re->cost == 16558)); + BEAST_EXPECT(re->result && (re->cost == 41'132)); } env.close(); @@ -751,9 +628,7 @@ struct Wasm_test : public beast::unit_test::suite testHFCost(); - // TODO: fix result - testEscrowWasmDN1(); - testEscrowWasmDN3(); + testEscrowWasmDN(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index c2dab9252a3..48b0d20b73a 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -10757,126 +10757,302 @@ extern std::string const sp1_wasm = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -extern std::string const xrplStdExampleHex = - "0061736d0100000001240560037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" - "7f7f7e017f6000017f0295010608686f73745f6c69620c6765745f74785f6669656c640000" - "08686f73745f6c6962057472616365000108686f73745f6c69620e6163636f756e745f6b65" - "796c6574000208686f73745f6c69621063616368655f6c65646765725f6f626a000008686f" - "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000208686f73745f6c69" - "620974726163655f6e756d00030302010405030100110619037f01418080c0000b7f004190" - "80c0000b7f00419080c0000b072e04066d656d6f727902000666696e69736800060a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020aa203019f0302047f017e238080" - "80800041e0006b2200248080808000200041c0006a41106a22014100360200200041c0006a" - "41086a220242003703002000420037034002400240024041818020200041c0006a41141080" - "808080004101480d00200041086a41106a2001280200360200200041086a41086a20022903" - "0037030020002000290340370308418080c08000410a200041086a41144101108180808000" - "1a200041c0006a41186a220342003703002001420037030020024200370300200042003703" - "400240200041086a4114200041c0006a41201082808080004101480d00200041206a41186a" - "2003290300370300200041206a41106a200041c0006a41106a290300370300200041206a41" - "086a200041c0006a41086a29030037030020002000290340370320200041206a4120410010" - "8380808000220241014e0d020b417b21010c020b417f21010c010b20004200370340417b21" - "01200241828018200041c0006a41081084808080004108470d00418a80c080004106200029" - "034022041085808080001a417741012004501b21010b200041e0006a24808080800020010b" - "0b190100418080c0000b1020204163636f756e743a20204665653a008903046e616d650016" - "157872706c5f7374645f6578616d706c652e7761736d01c9020700335f5a4e387872706c5f" - "73746434686f737431326765745f74785f6669656c64313768646531643438363634626333" - "6138346145012b5f5a4e387872706c5f73746434686f737435747261636531376831626534" - "3662336564373737306363624502355f5a4e387872706c5f73746434686f73743134616363" - "6f756e745f6b65796c6574313768333736666637613833306562626537624503375f5a4e38" - "7872706c5f73746434686f7374313663616368655f6c65646765725f6f626a313768646361" - "6435366531366262633331653345043b5f5a4e387872706c5f73746434686f737432306765" - "745f6c65646765725f6f626a5f6669656c6431376863623833653465366431326162306332" - "45052f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376832363139" - "36306163653839633831313845060666696e697368071201000f5f5f737461636b5f706f69" - "6e746572090a0100072e726f64617461004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d312e38372e302028" - "31373036376539616320323032352d30352d3039290094010f7461726765745f6665617475" - "726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663" - "616c6c2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75" - "7461626c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72" - "65666572656e63652d74797065732b087369676e2d657874"; - std::string const ledgerSqnHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072e04066d656d6f727902000666696e69736800" - "010a5f5f646174615f656e6403000b5f5f686561705f6261736503010a09" - "010700100041044a0b004d0970726f64756365727302086c616e67756167" - "65010452757374000c70726f6365737365642d6279010572757374631d31" - "2e38352e31202834656231363132353020323032352d30332d3135290049" - "0f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065" - "732b0a6d756c746976616c7565"; + "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" + "760e6765745f6c65646765725f73716e000003030201020503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300010666696e69736800020362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a2b0202000b2601017f41800841041000220041800828020020004100" + "481b2200200041044a20004100481b0b007f0970726f647563657273010c" + "70726f6365737365642d62790105636c616e675f31392e312e352d776173" + "692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d" + "2f6c6c766d2d70726f6a6563742061623462356132646235383239353861" + "6631656533303861373930636664623432626432343732302900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; std::string const allHostFunctionsHex = - "0061736d01000000012e0760037f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f6003" - "7f7f7e017f60027f7f017f6000017f60017f0002df010808686f73745f6c69620c6765745f" - "74785f6669656c64000008686f73745f6c6962057472616365000108686f73745f6c69621c" - "6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000008686f73745f6c" - "69620e6163636f756e745f6b65796c6574000208686f73745f6c69621063616368655f6c65" - "646765725f6f626a000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669" - "656c64000208686f73745f6c69620974726163655f6e756d000308686f73745f6c69621667" - "65745f706172656e745f6c65646765725f74696d6500040304030506000405017001010105" - "030100110619037f01418080c0000b7f00418481c0000b7f00419081c0000b072e04066d65" - "6d6f727902000666696e69736800080a5f5f646174615f656e6403010b5f5f686561705f62" - "61736503020af80803db0702047f027e23808080800041f0206b2200248080808000200041" - "d0006a41106a22014100360200200041d0006a41086a220242003703002000420037035002" - "4002400240024041818020200041d0006a41141080808080004101480d00200041086a4110" - "6a2001280200360200200041086a41086a2002290300370300200020002903503703084180" - "80c080004109200041086a411441011081808080001a200141003602002002420037030020" - "00420037035041818020200041d0006a411410828080800041004c0d01200041206a41106a" - "200041d0006a41106a2201280200360200200041206a41086a200041d0006a41086a220229" - "030037030020002000290350370320418980c080004108200041206a411441011081808080" - "001a2001410036020020024200370300200042003703500240024041838020200041d0006a" - "411410828080800041004c0d00200041386a41106a2001280200360200200041386a41086a" - "200229030037030020002000290350370338419180c080004107200041386a411441011081" - "808080001a200041d0006a41186a2203420037030020014200370300200242003703002000" - "42003703500240200041386a4114200041d0006a41201083808080004101480d00200041d0" - "206a41186a2003290300370300200041d0206a41106a200041d0006a41106a290300370300" - "200041d0206a41086a200041d0006a41086a290300370300200020002903503703d0202000" - "41d0206a41204100108480808000220241014e0d020b417c21010c050b417d21010c040b20" - "004200370350417c2101200241828018200041d0006a41081085808080004108470d034198" - "80c08000410f200029035022041086808080001a0240418020450d00200041d0006a410041" - "8020fc0b000b0240419b801c200041d0006a418020108280808000220241014e0d00417b21" - "010c040b41a780c08000410a2002ad1086808080001a0240200241084d0d00417a21010c04" - "0b41b180c080004107200041d0006a200241011081808080001a4100210142002105034020" - "05420886200041d0006a20016a3100008421052002200141016a2201470d000b41b880c080" - "00412120051086808080001a200041003602d0200240200041d0206a410410878080800041" - "004e0d00417921010c040b41d980c08000411520003402d0201086808080001a2000108980" - "80800020002802004101710d02417821010c030b417f21010c020b417e21010c010b41ee80" - "c08000411620002802042201ac1086808080001a200041086a200041206a4114108a808080" - "004520042005587120002802d02020014e7121010b200041f0206a24808080800020010b4e" - "01027f23808080800041106b22012480808080002001410036020c41a580082001410c6a41" - "0410828080800021022000200128020c3602042000200241004a360200200141106a248080" - "8080000b4a01037f4100210302402002450d000240034020002d0000220420012d00002205" - "470d01200041016a2100200141016a21012002417f6a2202450d020c000b0b200420056b21" - "030b20030b0b8e010100418080c0000b8401202073656e6465723a20206f776e65723a2020" - "646573743a2020646573745f62616c616e63653a2020646174615f6c656e2020646174613a" - "20207468726573686f6c645f62616c616e63652c2075736520646174615b695d3a20207061" - "72656e745f6c65646765725f74696d653a2020657363726f775f66696e6973685f61667465" - "723a00d804046e616d650016157872706c5f7374645f6578616d706c652e7761736d019804" - "0b00335f5a4e387872706c5f73746434686f737431326765745f74785f6669656c64313768" - "6465316434383636346263336138346145012b5f5a4e387872706c5f73746434686f737435" - "7472616365313768316265343662336564373737306363624502435f5a4e387872706c5f73" - "746434686f737432386765745f63757272656e745f6c65646765725f6f626a5f6669656c64" - "313768343532633531353638653033353531384503355f5a4e387872706c5f73746434686f" - "737431346163636f756e745f6b65796c657431376833373666663761383330656262653762" - "4504375f5a4e387872706c5f73746434686f7374313663616368655f6c65646765725f6f62" - "6a3137686463616435366531366262633331653345053b5f5a4e387872706c5f7374643468" - "6f737432306765745f6c65646765725f6f626a5f6669656c64313768636238336534653664" - "3132616230633245062f5f5a4e387872706c5f73746434686f73743974726163655f6e756d" - "3137683236313936306163653839633831313845073d5f5a4e387872706c5f73746434686f" - "737432326765745f706172656e745f6c65646765725f74696d653137686234636264356664" - "336463326230383445080666696e69736809415f5a4e387872706c5f73746433316765745f" - "63757272656e745f657363726f775f66696e6973685f616674657231376863333562336366" - "356633353733363933450a066d656d636d70071201000f5f5f737461636b5f706f696e7465" - "72090a0100072e726f64617461004d0970726f64756365727302086c616e67756167650104" - "52757374000c70726f6365737365642d6279010572757374631d312e38372e302028313730" - "36376539616320323032352d30352d3039290094010f7461726765745f6665617475726573" - "082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c" - "2d696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f72656665" - "72656e63652d74797065732b087369676e2d657874"; + "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" + "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" + "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" + "6000017f0295061908686f73745f6c69620c6765745f74785f6669656c64" + "000208686f73745f6c69620974726163655f6e756d000608686f73745f6c" + "6962057472616365000308686f73745f6c69620e6765745f6c6564676572" + "5f73716e000008686f73745f6c6962166765745f706172656e745f6c6564" + "6765725f74696d65000008686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f68617368000008686f73745f6c6962136765745f7478" + "5f6e65737465645f6669656c64000108686f73745f6c6962106765745f74" + "785f61727261795f6c656e000408686f73745f6c6962176765745f74785f" + "6e65737465645f61727261795f6c656e000008686f73745f6c69621c6765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c6400020868" + "6f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f6669656c64000108686f73745f6c6962206765745f63" + "757272656e745f6c65646765725f6f626a5f61727261795f6c656e000408" + "686f73745f6c6962276765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e000008686f73745f6c69620e" + "6163636f756e745f6b65796c6574000108686f73745f6c69621063616368" + "655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c65" + "646765725f6f626a5f6669656c64000108686f73745f6c69621b6765745f" + "6c65646765725f6f626a5f6e65737465645f6669656c64000308686f7374" + "5f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e00" + "0008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e657374" + "65645f61727261795f6c656e000208686f73745f6c69621163726564656e" + "7469616c5f6b65796c6574000708686f73745f6c69620d657363726f775f" + "6b65796c6574000308686f73745f6c69620d6f7261636c655f6b65796c65" + "74000308686f73745f6c696213636f6d707574655f7368613531325f6861" + "6c66000108686f73745f6c6962076765745f6e6674000808686f73745f6c" + "69620b7570646174655f6461746100000306050505090a0b050301001106" + "19037f01418080c0000b7f0041eb99c0000b7f0041f099c0000b072e0406" + "6d656d6f727902000666696e697368001d0a5f5f646174615f656e640301" + "0b5f5f686561705f6261736503020a951d051900200241214f0440000b20" + "002002360204200020013602000b1900200241094f0440000b2000200236" + "0204200020013602000b970101057f230041206b22012400200141186a22" + "044100360200200141106a22054200370300200142003703080240418180" + "20200141086a411410002203411447044002402003410048044020002003" + "3602040c010b2000417f3602040b410121020c010b200020012903083700" + "01200041116a2004280200360000200041096a20052903003700000b2000" + "20023a0000200141206a24000b450020012d000045044020002001290001" + "370000200041106a200141116a280000360000200041086a200141096a29" + "00003700000f0b418080c000410b20013402041001000bff1a01097f2300" + "41c0036b22002400418b80c000411b41014100410110021a41a680c00041" + "2841014100410110021a41f680c000412b41014100410110021a20004200" + "370380010240024002400240024002400240024020004180016a22064108" + "1003220141004a044041a181c000411d2001ad10011a200041406b200620" + "01101a41be81c000411020002802402000280244410110021a2000420037" + "03a001200041a0016a220341081004220141004c0d0141ce81c000411920" + "01ad10011a200041386a20032001101a41e781c000411120002802382000" + "28023c410110021a200041d8016a22024200370300200041d0016a220542" + "00370300200041c8016a22044200370300200042003703c001200041c001" + "6a22074120100522014120470d0241f881c000411320074120410110021a" + "418b82c000412041014100410110021a419883c000412e41014100410110" + "021a200041b0016a4100360200200041a8016a4200370300200042003703" + "a0014181802020034114100022014114470d0341c683c000411420034114" + "410110021a20004200370380014188801820064108100022014108470d04" + "41da83c0004117420810011a41f183c000412820064108410110021a2000" + "410036026041848008200041e0006a22034104100022014104470d054199" + "84c000411520034104410110021a200041013b004c200242003703002005" + "420037030020044200370300200042003703c0010240200041cc006a4102" + "200741201006220141004e044041ae84c00041142001ad10011a20004130" + "6a20072001101941c284c000410d20002802302000280234410110021a0c" + "010b41cf84c00041292001ac10011a0b41f884c00041154183803c1007ac" + "10011a418d85c00041134189803c1007ac10011a0240200041cc006a4102" + "1008220141004e044041a085c00041142001ad10011a0c010b41b485c000" + "412d2001ac10011a0b41e185c000412341014100410110021a419a87c000" + "413341014100410110021a20004200370380014182801820004180016a22" + "0141081009220341004c0d062003410846044041cd87c000412b42081001" + "1a41f887c000412f20014108410110021a0c080b41a788c000412f2003ad" + "10011a200041286a20004180016a2003101a41d688c00041172000280228" + "200028022c410110021a0c070b41fb82c000411d2001ac10011a419b7f21" + "020c070b41d682c00041252001ac10011a419a7f21020c060b41ab82c000" + "412b2001ac10011a41997f21020c050b41f086c000412a2001ac10011a41" + "b77e21020c040b41af86c00041c1002001ac10011a41b67e21020c030b41" + "8486c000412b2001ac10011a41b57e21020c020b41ed88c00041c5002003" + "ac10011a0b200041b0016a4100360200200041a8016a4200370300200042" + "003703a0010240024002400240024002400240024041818020200041a001" + "6a220141141009220341004a0440200341154f0d0241b289c000411e2001" + "2003410110021a0c010b41d089c00041332003ac10011a0b200041013b00" + "60200041d8016a4200370300200041d0016a4200370300200041c8016a42" + "00370300200042003703c0010240200041e0006a4102200041c0016a2201" + "4120100a220341004e044041838ac000411c2003ad10011a200041206a20" + "0120031019419f8ac000411520002802202000280224410110021a0c010b" + "41b48ac00041392003ac10011a0b41ed8ac00041244183803c100bac1001" + "1a0240200041e0006a4102100c220141004e044041918bc000411c2001ad" + "10011a0c010b41ad8bc000413d2001ac10011a0b41ea8bc0004128410141" + "00410110021a41928cc000412f41014100410110021a200041c0016a2203" + "101b20004180016a22012003101c200041b8016a4200370300200041b001" + "6a4200370300200041a8016a4200370300200042003703a0012001411420" + "0041a0016a22034120100d22014120470d01200341204100100e22044100" + "4a044041c18cc00041232004ad10011a2000420037036020044182801820" + "0041e0006a22014108100f220341004c0d032003410846044041e48cc000" + "412a420810011a418e8dc000412e20014108410110021a0c070b41bc8dc0" + "00412e2003ad10011a200041186a200041e0006a2003101a41ea8dc00041" + "162000280218200028021c410110021a0c060b41a290c000413c2004ac10" + "011a200041d8016a4200370300200041d0016a4200370300200041c8016a" + "4200370300200042003703c001410141828018200041c0016a4120100f22" + "014100480d030c040b000b41f692c000412e2001ac10011a41ef7c21020c" + "050b41808ec000412b2003ac10011a0c020b41de90c00041c1002001ac10" + "011a0b200041013b00604101200041e0006a4102200041c0016a41201010" + "22014100480440419f91c00041352001ac10011a0b41014183803c101122" + "01410048044041d491c00041322001ac10011a0b4101200041e0006a4102" + "101222014100480440418692c00041392001ac10011a0b41bf92c0004137" + "41014100410110021a0c010b200041013b004c200041d8016a4200370300" + "200041d0016a4200370300200041c8016a4200370300200042003703c001" + "02402004200041cc006a4102200041c0016a220141201010220341004e04" + "4041ab8ec000411b2003ad10011a200041106a20012003101941c68ec000" + "411420002802102000280214410110021a0c010b41da8ec00041312003ac" + "10011a0b418b8fc000412320044183803c1011ac10011a02402004200041" + "cc006a41021012220141004e044041ae8fc000411b2001ad10011a0c010b" + "41c98fc00041352001ac10011a0b41fe8fc000412441014100410110021a" + "0b41a493c000412f41014100410110021a200041c0016a2201101b200041" + "cc006a22042001101c200041f8006a4200370300200041f0006a42003703" + "00200041e8006a4200370300200042003703600240024002400240024002" + "4020044114200041e0006a22034120100d2201412046044041d393c00041" + "0f20034120410110021a20004198016a420037030020004190016a420037" + "030020004188016a42003703002000420037038001024020044114200441" + "1441e293c000410920004180016a220141201013220341004a0440200041" + "086a20012003101941ea93c00041122000280208200028020c410110021a" + "0c010b41fc93c000413c2003ac10011a0b200041b8016a22064200370300" + "200041b0016a22024200370300200041a8016a2205420037030020004200" + "3703a001200041cc006a2203411441e807200041a0016a22084120101422" + "014120470d0141b894c000410e20084120410110021a200041d8016a4200" + "370300200041d0016a4200370300200041c8016a42003703002000420037" + "03c00120034114412a200041c0016a22044120101522014120470d0241c6" + "94c000410e20044120410110021a41d494c000412441014100410110021a" + "41cd95c000412541014100410110021a20004198016a4200370300200041" + "90016a420037030020004188016a4200370300200042003703800141f295" + "c000411720004180016a22034120101622014120470d03418996c000410b" + "41f295c0004117410110021a419496c000411120034120410110021a2004" + "101b200041e0006a22072004101c20064200370300200242003703002005" + "4200370300200042003703a0010240200422022002410020026b41037122" + "036a22054f0d0020030440200321010340200241003a0000200241016a21" + "02200141016b22010d000b0b200341016b4107490d000340200241003a00" + "00200241076a41003a0000200241066a41003a0000200241056a41003a00" + "00200241046a41003a0000200241036a41003a0000200241026a41003a00" + "00200241016a41003a0000200241086a22022005470d000b0b2005418002" + "20036b2201417c716a220220054b0440034020054100360200200541046a" + "22052002490d000b0b024020022001410371220120026a22034f0d002001" + "220504400340200241003a0000200241016a2102200541016b22050d000b" + "0b200141016b4107490d000340200241003a0000200241076a41003a0000" + "200241066a41003a0000200241056a41003a0000200241046a41003a0000" + "200241036a41003a0000200241026a41003a0000200241016a41003a0000" + "200241086a22022003470d000b0b02402007411420084120200441800210" + "17220141004a044041a596c00041102001ad10011a20014181024f0d0641" + "b596c000410920042001410110021a0c010b41be96c000412e2001ac1001" + "1a0b41ec96c000411241fe96c00041074101100222014100480d05418597" + "c000411d2001ad10011a41a297c0004111422a10014100480d0641b397c0" + "00411c420010011a4101210241cf97c000411a41014100410110021a41bb" + "98c000412941014100410110021a41e498c000412810182201450440418c" + "99c000412741e498c0004128410110021a41b399c000411e410141004101" + "10021a41ce80c000412841014100410110021a0c080b41d199c000411a20" + "01ac10011a41c37a21020c070b41b095c000411d2001ac10011a418b7c21" + "020c060b419495c000411c2001ac10011a41897c21020c050b41f894c000" + "411c2001ac10011a41887c21020c040b419998c00041222001ac10011a41" + "a77b21020c030b000b418398c00041162001ac10011a41a57b21020c010b" + "41e997c000411a42a47b10011a41a47b21020b200041c0036a240020020b" + "0bf5190100418080c0000beb196572726f725f636f64653d3d3d3d20484f" + "53542046554e4354494f4e532054455354203d3d3d54657374696e672032" + "3620686f73742066756e6374696f6e732028372063617465676f72696573" + "29535543434553533a20416c6c20686f73742066756e6374696f6e207465" + "73747320706173736564212d2d2d2043617465676f727920313a204c6564" + "676572204865616465722046756e6374696f6e73202d2d2d4c6564676572" + "2073657175656e6365206e756d6265722062797465733a4c656467657220" + "73716e20646174613a506172656e74206c65646765722074696d65206279" + "7465733a506172656e742074696d6520646174613a506172656e74206c65" + "6467657220686173683a535543434553533a204c65646765722068656164" + "65722066756e6374696f6e734552524f523a206765745f706172656e745f" + "6c65646765725f686173682077726f6e67206c656e6774683a4552524f52" + "3a206765745f706172656e745f6c65646765725f74696d65206661696c65" + "643a4552524f523a206765745f6c65646765725f73716e206661696c6564" + "3a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" + "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e2041" + "63636f756e743a5472616e73616374696f6e20466565206c656e6774683a" + "5472616e73616374696f6e20466565202873657269616c697a6564205852" + "5020616d6f756e74293a5472616e73616374696f6e2053657175656e6365" + "3a4e6573746564206669656c64206c656e6774683a4e6573746564206669" + "656c643a494e464f3a206765745f74785f6e65737465645f6669656c6420" + "6e6f74206170706c696361626c653a5369676e657273206172726179206c" + "656e6774683a4d656d6f73206172726179206c656e6774683a4e65737465" + "64206172726179206c656e6774683a494e464f3a206765745f74785f6e65" + "737465645f61727261795f6c656e206e6f74206170706c696361626c653a" + "535543434553533a205472616e73616374696f6e20646174612066756e63" + "74696f6e734552524f523a206765745f74785f6669656c64285365717565" + "6e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" + "785f6669656c6428466565292077726f6e67206c656e6774682028657870" + "6563746564203820627974657320666f7220585250293a4552524f523a20" + "6765745f74785f6669656c64284163636f756e74292077726f6e67206c65" + "6e6774683a2d2d2d2043617465676f727920333a2043757272656e74204c" + "6564676572204f626a6563742046756e6374696f6e73202d2d2d43757272" + "656e74206f626a6563742062616c616e6365206c656e6774682028585250" + "20616d6f756e74293a43757272656e74206f626a6563742062616c616e63" + "65202873657269616c697a65642058525020616d6f756e74293a43757272" + "656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e" + "2d58525020616d6f756e74293a43757272656e74206f626a656374206261" + "6c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c642842616c616e636529206661696c656420286d61" + "79206265206578706563746564293a43757272656e74206c656467657220" + "6f626a656374206163636f756e743a494e464f3a206765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c64284163636f756e74292066" + "61696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a" + "206765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f6669656c64206e6f74206170706c696361626c653a43757272656e7420" + "6f626a656374205369676e657273206172726179206c656e6774683a4375" + "7272656e74206e6573746564206172726179206c656e6774683a494e464f" + "3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e206e6f74206170706c696361626c653a535543" + "434553533a2043757272656e74206c6564676572206f626a656374206675" + "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564" + "676572204f626a6563742046756e6374696f6e73202d2d2d537563636573" + "7366756c6c7920636163686564206f626a65637420696e20736c6f743a43" + "6163686564206f626a6563742062616c616e6365206c656e677468202858" + "525020616d6f756e74293a436163686564206f626a6563742062616c616e" + "6365202873657269616c697a65642058525020616d6f756e74293a436163" + "686564206f626a6563742062616c616e6365206c656e67746820286e6f6e" + "2d58525020616d6f756e74293a436163686564206f626a6563742062616c" + "616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c" + "642842616c616e636529206661696c65643a436163686564206e65737465" + "64206669656c64206c656e6774683a436163686564206e65737465642066" + "69656c643a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206e6f74206170706c696361626c653a436163686564" + "206f626a656374205369676e657273206172726179206c656e6774683a43" + "6163686564206e6573746564206172726179206c656e6774683a494e464f" + "3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" + "6c656e206e6f74206170706c696361626c653a535543434553533a20416e" + "79206c6564676572206f626a6563742066756e6374696f6e73494e464f3a" + "2063616368655f6c65646765725f6f626a206661696c6564202865787065" + "6374656420776974682074657374206669787475726573293a494e464f3a" + "206765745f6c65646765725f6f626a5f6669656c64206661696c65642061" + "7320657870656374656420286e6f20636163686564206f626a656374293a" + "494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669" + "656c64206661696c65642061732065787065637465643a494e464f3a2067" + "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c6564" + "2061732065787065637465643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206661696c6564206173" + "2065787065637465643a535543434553533a20416e79206c656467657220" + "6f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c657420666169" + "6c656420666f722063616368696e6720746573743a2d2d2d204361746567" + "6f727920353a204b65796c65742047656e65726174696f6e2046756e6374" + "696f6e73202d2d2d4163636f756e74206b65796c65743a54657374547970" + "6543726564656e7469616c206b65796c65743a494e464f3a206372656465" + "6e7469616c5f6b65796c6574206661696c65642028657870656374656420" + "2d20696e74657266616365206973737565293a457363726f77206b65796c" + "65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" + "65742067656e65726174696f6e2066756e6374696f6e734552524f523a20" + "6f7261636c655f6b65796c6574206661696c65643a4552524f523a206573" + "63726f775f6b65796c6574206661696c65643a4552524f523a206163636f" + "756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f7279" + "20363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f" + "2c205852504c205741534d20776f726c6421496e70757420646174613a53" + "48413531322068616c6620686173683a4e46542064617461206c656e6774" + "683a4e465420646174613a494e464f3a206765745f6e6674206661696c65" + "6420286578706563746564202d206e6f2073756368204e4654293a546573" + "74207472616365206d6573736167657061796c6f61645472616365206675" + "6e6374696f6e206279746573207772697474656e3a54657374206e756d62" + "657220747261636554726163655f6e756d2066756e6374696f6e20737563" + "636565646564535543434553533a205574696c6974792066756e6374696f" + "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552" + "524f523a2074726163652829206661696c65643a4552524f523a20636f6d" + "707574655f7368613531325f68616c66206661696c65643a2d2d2d204361" + "7465676f727920373a2044617461205570646174652046756e6374696f6e" + "73202d2d2d55706461746564206c656467657220656e7472792064617461" + "2066726f6d205741534d20746573745375636365737366756c6c79207570" + "6461746564206c656467657220656e74727920776974683a535543434553" + "533a2044617461207570646174652066756e6374696f6e734552524f523a" + "207570646174655f64617461206661696c65643a00550970726f64756365" + "727302086c616e6775616765010452757374000c70726f6365737365642d" + "62790105727573746325312e38362e302d6e696768746c79202862336233" + "363861313820323032352d30312d30352900490f7461726765745f666561" + "7475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c" + "7565"; std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -11598,92 +11774,6 @@ std::string const deepRecursionHex = "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const hostFunctions2Hex = - "0061736d01000000012f0760047f7f7f7f017f60037f7f7f017f60027f7f" - "017f60057f7f7f7f7f017f60037f7f7e017f60017f017f6000017f028a02" - "0a08686f73745f6c6962057472616365000308686f73745f6c69620c6765" - "745f74785f6669656c64000108686f73745f6c69620974726163655f6e75" - "6d000408686f73745f6c69620e6163636f756e745f6b65796c6574000008" - "686f73745f6c69621063616368655f6c65646765725f6f626a000108686f" - "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008" - "686f73745f6c6962136765745f74785f6e65737465645f6669656c640000" - "08686f73745f6c6962106765745f74785f61727261795f6c656e00050868" - "6f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" - "6e000208686f73745f6c69620b7570646174655f64617461000203020106" - "05030100110619037f01418080c0000b7f00419187c0000b7f0041a087c0" - "000b072e04066d656d6f727902000666696e697368000a0a5f5f64617461" - "5f656e6403010b5f5f686561705f6261736503020ae50701e20701057f23" - "0041e0006b2201240041b580c000411b41014100410110001a41f380c000" - "412841014100410110001a200141d0006a4100360200200141c8006a4200" - "370300200142003703400240024002400240024002400240418180202001" - "41406b22004114100122024114460440419b81c000410e20004114410110" - "001a2001420037032041888018200141206a41081001220041004c0d0141" - "a981c00041112000ad10021a2001410036020841848008200141086a4104" - "1001220041004c044041d081c00041252000ac10021a0c070b41ba81c000" - "41162000ad10021a41bf82c000412841014100410110001a200141306a22" - "034100360200200141286a22044200370300200142003703204181802020" - "0141206a22024114100122004100480d0220012000360238200141143602" - "3c20004114470d03200141106a2004290300370300200141186a20032802" - "0036020020012001290320370308200141d8006a4200370300200141d000" - "6a4200370300200141c8006a420037030020014200370340024002402001" - "41086a4114200141406b220341201003220041004a044041e782c000410f" - "20034120410110001a41f682c00041172000ad10021a2003200041001004" - "220041004c0d01418d83c00041162000ad10021a20014200370320200041" - "828018200241081005220041004a044041a383c00041152000ad10021a20" - "0041094f0d0841b883c000410e20022000410110001a0c030b41c683c000" - "412b2000ac10021a0c020b41ac84c000411d2000ac10021a417e21000c09" - "0b41f183c000413b2000ac10021a0b41c984c00041234101410041011000" - "1a200141d8006a4200370300200141d0006a4200370300200141c8006a42" - "0037030020014200370340024041ec84c0004102200141406b2202412010" - "06220041004e044041ee84c000411e2000ad10021a200041214f0d07418c" - "85c000411220022000410110001a0c010b419e85c00041292000ac10021a" - "0b02404183803c10072200410048044041c785c00041202000ac10021a0c" - "010b41e785c00041152000ad10021a0b024041ec84c00041021008220041" - "0048044041fc85c000411f2000ac10021a0c010b419b86c00041142000ad" - "10021a0b4101210041af86c000412241014100410110001a41d186c00041" - "0e10092202044041f786c000411a2002ac10021a417c21000c080b41df86" - "c000411841d186c000410e410110001a41d080c000412341014100410110" - "001a0c070b419582c000412a2002ac10021a0c050b41f581c00041202000" - "ac10021a0c040b418080c00041354100410041001000000b200141003602" - "40230041106b2400000b000b000b417f21000b200141e0006a240020000b" - "0b9b070100418080c0000b9107486f73742066756e6374696f6e20676574" - "5f63757272656e745f657363726f775f66696e6973685f6669656c642066" - "61696c6564213d3d3d20484f53542046554e4354494f4e53205445535420" - "3d3d3d535543434553533a20486f73742066756e6374696f6e2074657374" - "73207061737365642d2d2d205465737420313a205472616e73616374696f" - "6e204669656c6420416363657373202d2d2d4163636f756e74206669656c" - "643a466565206669656c64206c656e6774683a53657175656e6365206669" - "656c64206c656e6774683a4552524f523a206765745f74785f6669656c64" - "2853657175656e636529206661696c65643a4552524f523a206765745f74" - "785f6669656c642846656529206661696c65643a4552524f523a20676574" - "5f74785f6669656c64284163636f756e74292077726f6e67206c656e6774" - "683a2d2d2d205465737420323a204c6564676572204f626a656374204f70" - "65726174696f6e73202d2d2d4163636f756e74206b65796c65743a4b6579" - "6c65742062797465732067656e6572617465643a4f626a65637420636163" - "68656420696e20736c6f743a42616c616e6365206669656c64206c656e67" - "74683a42616c616e6365206669656c643a494e464f3a206765745f6c6564" - "6765725f6f626a5f6669656c642842616c616e636529206661696c65643a" - "494e464f3a2063616368655f6c65646765725f6f626a206661696c656420" - "28657870656374656420666f722074657374206669787475726573293a45" - "52524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d" - "2d205465737420333a204e6573746564204669656c642041636365737320" - "2d2d2d01024e6573746564206669656c6420616363657373207375636365" - "656465643a4e6573746564206669656c6420646174613a494e464f3a2067" - "65745f74785f6e65737465645f6669656c64206e6f74206170706c696361" - "626c653a494e464f3a204e6f207369676e657273206172726179206f7220" - "6572726f723a5369676e657273206172726179206c656e6774683a494e46" - "4f3a204e6f206e6573746564206172726179206f72206572726f723a4e65" - "73746564206172726179206c656e6774683a2d2d2d205465737420343a20" - "5374617465204d6f64696669636174696f6e202d2d2d746573745f737461" - "74655f31323353746174652075706461746564207769746820646174613a" - "4552524f523a207570646174655f64617461206661696c65643a00550970" - "726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38362e302d6e696768746c79" - "202862336233363861313820323032352d30312d30352900490f74617267" - "65745f6665617475726573042b0f6d757461626c652d676c6f62616c732b" - "087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; - extern std::string const reqNonexistentField = "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index aa560580ffa..97b2236d1b8 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -51,10 +51,6 @@ extern std::string const zkProofHex; extern std::string const sp1_wasm; -extern std::string const xrplStdExampleHex; - -extern std::string const hostFunctions2Hex; - extern std::string const reqNonexistentField; extern std::string const hfPerfTest; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index e35af622d46..152c946c7cc 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -92,33 +92,41 @@ getAnyFieldData(STBase const* obj) return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& account(static_cast(obj)); + auto const* account(static_cast(obj)); auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } break; - case STI_AMOUNT: { - auto const& amount(static_cast(obj)); - int64_t const data = amount->xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; + case STI_AMOUNT: + // will be processed by serializer + break; + case STI_ISSUE: { + auto const* issue(static_cast(obj)); + Asset const& asset(issue->value()); + // XRP and IOU will be processed by serializer + if (!asset.holds()) + { + // MPT + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; + } } break; case STI_VL: { - auto const& vl(static_cast(obj)); + auto const* vl(static_cast(obj)); auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT256: { - auto const& num(static_cast const*>(obj)); + auto const* num(static_cast const*>(obj)); auto const& data = num->value(); return Bytes{data.begin(), data.end()}; } break; case STI_UINT32: { - auto const& num(static_cast const*>(obj)); + auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); @@ -131,8 +139,9 @@ getAnyFieldData(STBase const* obj) Serializer msg; obj->add(msg); + auto const data = msg.getData(); - return msg.getData(); + return data; } Expected @@ -600,13 +609,13 @@ WasmHostFunctionsImpl::trace( bool asHex) { #ifdef DEBUG_OUTPUT - auto j = ctx.journal.error(); + auto j = getJournal().error(); #else - auto j = ctx.journal.trace(); + auto j = getJournal().trace(); #endif if (!asHex) { - j << "WAMR TRACE (" << leKey.key << "): " << msg << " - " + j << "WAMR TRACE (" << leKey.key << "): " << msg << " " << std::string_view( reinterpret_cast(data.data()), data.size()); } @@ -614,8 +623,9 @@ WasmHostFunctionsImpl::trace( { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex(data.begin(), data.end(), hex.begin()); - j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << hex; + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); @@ -625,13 +635,11 @@ Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { #ifdef DEBUG_OUTPUT - auto j = ctx.journal.error(); + auto j = getJournal().error(); #else - auto j = ctx.journal.trace(); + auto j = getJournal().trace(); #endif - - j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " - " << data; - + j << "WAMR TRACE NUM(" << leKey.key << "): " << msg << " " << data; return msg.size() + sizeof(data); } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index c2b321e85ac..9fae700988a 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -98,13 +98,14 @@ getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) { auto const src = params->data[i].of.i32; auto const ssz = params->data[i + 1].of.i32; - if (src < 0 || ssz <= 0) + if (src < 0 || ssz < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!ssz) + return Slice(); + if (ssz > maxWasmDataLength) - { return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - } auto mem = rt ? rt->getMem() : wmem(); if (!mem.s) @@ -245,22 +246,6 @@ returnResult( } } -wasm_trap_t* -getLedgerSqnOld_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) -{ - auto* hf = reinterpret_cast(env); - // auto const* rt = reinterpret_cast(hf->getRT()); - auto const sqn = hf->getLedgerSqn(); - if (!sqn) - { - return hfResult(results, sqn.error()); - } - return hfResult(results, static_cast(sqn.value())); -} - wasm_trap_t* getLedgerSqn_wrap( void* env, @@ -1172,7 +1157,7 @@ testGetDataIncrement() int index = 0; auto const result = getDataSlice(&rt, ¶ms, index); - if (!result || result.value() != Slice(buffer.data(), 3)) + if (!result || result.value() != Slice(buffer.data(), 3) || index != 2) return false; } @@ -1188,7 +1173,8 @@ testGetDataIncrement() if (!result || result.value() != std::string_view( - reinterpret_cast(buffer.data()), 5)) + reinterpret_cast(buffer.data()), 5) || + index != 2) return false; } @@ -1205,7 +1191,7 @@ testGetDataIncrement() int index = 0; auto const result = getDataAccountID(&rt, ¶ms, index); - if (!result || result.value() != id) + if (!result || result.value() != id || index != 2) return false; } @@ -1221,7 +1207,23 @@ testGetDataIncrement() int index = 0; auto const result = getDataUInt256(&rt, ¶ms, index); - if (!result || result.value() != h1) + if (!result || result.value() != h1 || index != 2) + return false; + } + + { + // test Currency + + Currency const c = xrpCurrency(); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(c.bytes); + memcpy(&buffer[0], c.data(), c.bytes); + + int index = 0; + auto const result = getDataCurrency(&rt, ¶ms, index); + if (!result || result.value() != c || index != 2) return false; } diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 93b681009de..22597716322 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -23,13 +23,6 @@ namespace ripple { -using getLedgerSqnOld_proto = int32_t(); -wasm_trap_t* -getLedgerSqnOld_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getLedgerSqn_wrap( diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index c9badfe460b..0b94150db2f 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -17,6 +17,10 @@ */ //============================================================================== +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + #include #include #include @@ -38,10 +42,6 @@ createWasmImport(HostFunctions* hfs) { // clang-format off - // TODO: remove after escrow_test wasm module will be updated - WASM_IMPORT_FUNC2(i, getLedgerSqnOld, "getLedgerSqn", hfs, 60); - - WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); @@ -111,12 +111,16 @@ runEscrowWasm( if (!ret) { - // std::cout << ", error: " << ret.error() << std::endl; +#ifdef DEBUG_OUTPUT + std::cout << ", error: " << ret.error() << std::endl; +#endif return Unexpected(ret.error()); } - // std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << - // std::endl; +#ifdef DEBUG_OUTPUT + std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost + << std::endl; +#endif return EscrowResult{ret->result > 0, ret->cost}; } From 98b898686892ae3d335ace30405339207f8ca51d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 23 Jul 2025 13:47:56 -0400 Subject: [PATCH 035/212] fix merge issues (mostly with Conan2 upgrade) --- .github/workflows/macos.yml | 6 +++--- .github/workflows/nix.yml | 1 + .github/workflows/windows.yml | 12 ++++++------ conanfile.py | 1 + external/wamr/conanfile.py | 14 ++++++-------- src/test/app/Escrow_test.cpp | 4 ++-- src/xrpld/app/tx/detail/Escrow.cpp | 3 ++- 7 files changed, 21 insertions(+), 20 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8acd90eeff6..b21d912f44b 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -11,7 +11,7 @@ on: - release - master # Branches that opt-in to running - - 'ci/**' + - "ci/**" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -31,7 +31,6 @@ env: tools.compilation:verbosity=verbose jobs: - test: if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }} strategy: @@ -88,7 +87,7 @@ jobs: sysctl -n hw.logicalcpu clang --version - name: configure Conan - run : | + run: | echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show @@ -98,6 +97,7 @@ jobs: conan export --version 1.1.10 external/snappy conan export --version 9.7.3 external/rocksdb conan export --version 4.0.3 external/soci + conan export --version 2.3.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index dc895285f9f..d404a0fec24 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -384,6 +384,7 @@ jobs: run: | echo "${CONAN_GLOBAL_CONF}" >> $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ + conan export --version 2.3.1 external/wamr conan profile show - name: build dependencies run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 254850f26ab..369e4869d47 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -12,7 +12,7 @@ on: - release - master # Branches that opt-in to running - - 'ci/**' + - "ci/**" # https://docs.github.com/en/actions/using-jobs/using-concurrency concurrency: @@ -34,7 +34,6 @@ env: tools.compilation:verbosity=verbose jobs: - test: if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }} strategy: @@ -70,8 +69,8 @@ jobs: - name: restore Python cache directory uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 with: - path: ${{ steps.pip-cache.outputs.dir }} - key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }} + path: ${{ steps.pip-cache.outputs.dir }} + key: ${{ runner.os }}-${{ hashFiles('.github/workflows/windows.yml') }} - name: install Conan run: pip install wheel conan - name: check environment @@ -93,6 +92,7 @@ jobs: conan export --version 1.1.10 external/snappy conan export --version 9.7.3 external/rocksdb conan export --version 4.0.3 external/soci + conan export --version 2.3.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash @@ -110,10 +110,10 @@ jobs: - name: build uses: ./.github/actions/build with: - generator: '${{ matrix.version.generator }}' + generator: "${{ matrix.version.generator }}" configuration: ${{ matrix.configuration.type }} # Hard code for now. Move to the matrix if varied options are needed - cmake-args: '-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON' + cmake-args: "-Dassert=TRUE -Dwerr=TRUE -Dreporting=OFF -Dunity=ON" cmake-target: install - name: test shell: bash diff --git a/conanfile.py b/conanfile.py index 19f056dc1d0..9a4eccbdce1 100644 --- a/conanfile.py +++ b/conanfile.py @@ -193,6 +193,7 @@ def package_info(self): 'protobuf::libprotobuf', 'soci::soci', 'sqlite3::sqlite', + 'wamr::wamr', 'xxhash::xxhash', 'zlib::zlib', ] diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index 1fa3281c1e5..f391ea43505 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,10 +1,11 @@ -from conans import ConanFile, tools +from conan import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout from conan.tools.files import ( apply_conandata_patches, export_conandata_patches, # get, ) +from conan.tools.scm import Git # import os @@ -21,7 +22,6 @@ class WamrConan(ConanFile): settings = "os", "compiler", "build_type", "arch" options = {"shared": [True, False], "fPIC": [True, False]} default_options = {"shared": False, "fPIC": True} - generators = "CMakeToolchain", "CMakeDeps" # requires = [("llvm/20.1.1@")] def export_sources(self): @@ -39,11 +39,10 @@ def layout(self): cmake_layout(self, src_folder="src") def source(self): - git = tools.Git() - git.clone( - "https://github.com/bytecodealliance/wasm-micro-runtime.git", - "2a303861cc916dc182b7fecaa0aacc1b797e7ac6", - shallow=True, + git = Git(self) + git.fetch_commit( + url="https://github.com/bytecodealliance/wasm-micro-runtime.git", + commit="2a303861cc916dc182b7fecaa0aacc1b797e7ac6", ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -89,4 +88,3 @@ def package_info(self): self.cpp_info.libs = ["iwasm"] self.cpp_info.names["cmake_find_package"] = "wamr" self.cpp_info.names["cmake_find_package_multi"] = "wamr" - diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index ab2e9a993dc..3fdccae9ee5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1712,7 +1712,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, supported_amendments() - featureSmartEscrow); + Env env(*this, testable_amendments() - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); @@ -1882,7 +1882,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, supported_amendments() - featureSmartEscrow); + Env env(*this, testable_amendments() - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; env(escrow::finish(carol, alice, 1), diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index f70621fa4ed..048e54805ee 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1189,7 +1189,8 @@ EscrowFinish::doApply() if (ctx_.view().rules().enabled(featureDepositAuth)) { - if (auto err = verifyDepositPreauth(ctx_, account_, destID, sled); + if (auto err = verifyDepositPreauth( + ctx_.tx, ctx_.view(), account_, destID, sled, ctx_.journal); !isTesSuccess(err)) return err; } From 7f52287aae17751e30564c9ed90fbe944dfb88ee Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 25 Jul 2025 11:54:31 -0400 Subject: [PATCH 036/212] rename variables (#5609) * rename variables * instanceWrapper -> runtime * size -> srcSize * begin -> ptr --- src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 386 +++++++++++---------- 1 file changed, 207 insertions(+), 179 deletions(-) diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 9fae700988a..23b89af3d32 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -30,34 +30,34 @@ using SFieldCRef = std::reference_wrapper; static int32_t setData( - InstanceWrapper const* rt, + InstanceWrapper const* runtime, int32_t dst, - int32_t dsz, + int32_t dstSize, uint8_t const* src, - int32_t ssz) + int32_t srcSize) { - if (!ssz) + if (!srcSize) return 0; - if (dst < 0 || dsz < 0 || !src || ssz < 0) + if (dst < 0 || dstSize < 0 || !src || srcSize < 0) return static_cast>( HostFunctionError::INVALID_PARAMS); - auto mem = rt ? rt->getMem() : wmem(); + auto memory = runtime ? runtime->getMem() : wmem(); - if (!mem.s) + if (!memory.s) return static_cast>( HostFunctionError::NO_MEM_EXPORTED); - if (dst + dsz > mem.s) + if (dst + dstSize > memory.s) return static_cast>( HostFunctionError::POINTER_OUT_OF_BOUNDS); - if (ssz > dsz) + if (srcSize > dstSize) return static_cast>( HostFunctionError::BUFFER_TOO_SMALL); - memcpy(mem.p + dst, src, ssz); + memcpy(memory.p + dst, src, srcSize); - return ssz; + return srcSize; } template @@ -94,79 +94,79 @@ getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataSlice(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const src = params->data[i].of.i32; - auto const ssz = params->data[i + 1].of.i32; - if (src < 0 || ssz < 0) + auto const ptr = params->data[i].of.i32; + auto const size = params->data[i + 1].of.i32; + if (ptr < 0 || size < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); - if (!ssz) + if (!size) return Slice(); - if (ssz > maxWasmDataLength) + if (size > maxWasmDataLength) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - auto mem = rt ? rt->getMem() : wmem(); - if (!mem.s) + auto memory = runtime ? runtime->getMem() : wmem(); + if (!memory.s) return Unexpected(HostFunctionError::NO_MEM_EXPORTED); - if (src + ssz > mem.s) + if (ptr + size > memory.s) return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); - Slice data(mem.p + src, ssz); + Slice data(memory.p + ptr, size); i += 2; return data; } template Expected -getDataUInt256(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataUInt256(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r) + auto const slice = getDataSlice(runtime, params, i); + if (!slice) { - return Unexpected(r.error()); + return Unexpected(slice.error()); } - if (r->size() != uint256::bytes) + if (slice->size() != uint256::bytes) { return Unexpected(HostFunctionError::INVALID_PARAMS); } - return uint256::fromVoid(r->data()); + return uint256::fromVoid(slice->data()); } template Expected -getDataAccountID(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataAccountID(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r || (r->size() != AccountID::bytes)) + auto const slice = getDataSlice(runtime, params, i); + if (!slice || (slice->size() != AccountID::bytes)) return Unexpected(HostFunctionError::INVALID_PARAMS); - return AccountID::fromVoid(r->data()); + return AccountID::fromVoid(slice->data()); } template static Expected -getDataCurrency(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r || (r->size() != Currency::bytes)) + auto const slice = getDataSlice(runtime, params, i); + if (!slice || (slice->size() != Currency::bytes)) return Unexpected(HostFunctionError::INVALID_PARAMS); - return Currency::fromVoid(r->data()); + return Currency::fromVoid(slice->data()); } template Expected -getDataString(IW const* rt, wasm_val_vec_t const* params, int32_t& i) +getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { - auto const r = getDataSlice(rt, params, i); - if (!r) - return Unexpected(r.error()); + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + return Unexpected(slice.error()); return std::string_view( - reinterpret_cast(r->data()), r->size()); + reinterpret_cast(slice->data()), slice->size()); } std::nullptr_t @@ -189,7 +189,7 @@ hfResult(wasm_val_vec_t* results, HostFunctionError value) template std::nullptr_t returnResult( - InstanceWrapper const* rt, + InstanceWrapper const* runtime, wasm_val_vec_t const* params, wasm_val_vec_t* results, Expected const& res, @@ -204,7 +204,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), @@ -215,7 +215,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), @@ -233,7 +233,7 @@ returnResult( return hfResult( results, setData( - rt, + runtime, params->data[index].of.i32, params->data[index + 1].of.i32, reinterpret_cast(&resultValue), @@ -253,10 +253,10 @@ getLedgerSqn_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getLedgerSqn(), index); + return returnResult(runtime, params, results, hf->getLedgerSqn(), index); } wasm_trap_t* @@ -266,10 +266,11 @@ getParentLedgerTime_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getParentLedgerTime(), index); + return returnResult( + runtime, params, results, hf->getParentLedgerTime(), index); } wasm_trap_t* @@ -279,10 +280,11 @@ getParentLedgerHash_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult(rt, params, results, hf->getParentLedgerHash(), index); + return returnResult( + runtime, params, results, hf->getParentLedgerHash(), index); } wasm_trap_t* @@ -292,23 +294,23 @@ cacheLedgerObj_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const id = getDataUInt256(rt, params, index); + auto const id = getDataUInt256(runtime, params, index); if (!id) { return hfResult(results, id.error()); } - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } return returnResult( - rt, params, results, hf->cacheLedgerObj(*id, *cache), index); + runtime, params, results, hf->cacheLedgerObj(*id, *cache), index); } wasm_trap_t* @@ -318,15 +320,16 @@ getTxField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } - return returnResult(rt, params, results, hf->getTxField(*fname), index); + return returnResult( + runtime, params, results, hf->getTxField(*fname), index); } wasm_trap_t* @@ -336,17 +339,17 @@ getCurrentLedgerObjField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjField(*fname), index); + runtime, params, results, hf->getCurrentLedgerObjField(*fname), index); } wasm_trap_t* @@ -356,23 +359,23 @@ getLedgerObjField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getLedgerObjField(*cache, *fname), index); + runtime, params, results, hf->getLedgerObjField(*cache, *fname), index); } wasm_trap_t* @@ -382,17 +385,17 @@ getTxNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getTxNestedField(*bytes), index); + runtime, params, results, hf->getTxNestedField(*bytes), index); } wasm_trap_t* @@ -402,16 +405,20 @@ getCurrentLedgerObjNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjNestedField(*bytes), index); + runtime, + params, + results, + hf->getCurrentLedgerObjNestedField(*bytes), + index); } wasm_trap_t* @@ -421,23 +428,23 @@ getLedgerObjNestedField_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getLedgerObjNestedField(*cache, *bytes), @@ -451,16 +458,17 @@ getTxArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } - return returnResult(rt, params, results, hf->getTxArrayLen(*fname), index); + return returnResult( + runtime, params, results, hf->getTxArrayLen(*fname), index); } wasm_trap_t* @@ -470,17 +478,21 @@ getCurrentLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getCurrentLedgerObjArrayLen(*fname), index); + runtime, + params, + results, + hf->getCurrentLedgerObjArrayLen(*fname), + index); } wasm_trap_t* @@ -490,23 +502,27 @@ getLedgerObjArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const fname = getDataSField(rt, params, index); + auto const fname = getDataSField(runtime, params, index); if (!fname) { return hfResult(results, fname.error()); } return returnResult( - rt, params, results, hf->getLedgerObjArrayLen(*cache, *fname), index); + runtime, + params, + results, + hf->getLedgerObjArrayLen(*cache, *fname), + index); } wasm_trap_t* @@ -516,17 +532,17 @@ getTxNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->getTxNestedArrayLen(*bytes), index); + runtime, params, results, hf->getTxNestedArrayLen(*bytes), index); } wasm_trap_t* @@ -536,17 +552,17 @@ getCurrentLedgerObjNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getCurrentLedgerObjNestedArrayLen(*bytes), @@ -559,22 +575,22 @@ getLedgerObjNestedArrayLen_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const cache = getDataInt32(rt, params, index); + auto const cache = getDataInt32(runtime, params, index); if (!cache) { return hfResult(results, cache.error()); } - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, + runtime, params, results, hf->getLedgerObjNestedArrayLen(*cache, *bytes), @@ -588,16 +604,17 @@ updateData_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } - return returnResult(rt, params, results, hf->updateData(*bytes), index); + return returnResult( + runtime, params, results, hf->updateData(*bytes), index); } wasm_trap_t* @@ -607,16 +624,16 @@ computeSha512HalfHash_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(rt, params, index); + auto const bytes = getDataSlice(runtime, params, index); if (!bytes) { return hfResult(results, bytes.error()); } return returnResult( - rt, params, results, hf->computeSha512HalfHash(*bytes), index); + runtime, params, results, hf->computeSha512HalfHash(*bytes), index); } wasm_trap_t* @@ -626,16 +643,17 @@ accountKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - return returnResult(rt, params, results, hf->accountKeylet(*acc), index); + return returnResult( + runtime, params, results, hf->accountKeylet(*acc), index); } wasm_trap_t* @@ -645,23 +663,23 @@ checkKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->checkKeylet(acc.value(), *seq), index); + runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); } wasm_trap_t* @@ -671,29 +689,29 @@ credentialKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const subj = getDataAccountID(rt, params, index); + auto const subj = getDataAccountID(runtime, params, index); if (!subj) { return hfResult(results, subj.error()); } - auto const iss = getDataAccountID(rt, params, index); + auto const iss = getDataAccountID(runtime, params, index); if (!iss) { return hfResult(results, iss.error()); } - auto const credType = getDataSlice(rt, params, index); + auto const credType = getDataSlice(runtime, params, index); if (!credType) { return hfResult(results, credType.error()); } return returnResult( - rt, + runtime, params, results, hf->credentialKeylet(*subj, *iss, *credType), @@ -707,23 +725,23 @@ delegateKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const authorize = getDataAccountID(rt, params, index); + auto const authorize = getDataAccountID(runtime, params, index); if (!authorize) { return hfResult(results, authorize.error()); } return returnResult( - rt, + runtime, params, results, hf->delegateKeylet(acc.value(), authorize.value()), @@ -737,23 +755,23 @@ depositPreauthKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const authorize = getDataAccountID(rt, params, index); + auto const authorize = getDataAccountID(runtime, params, index); if (!authorize) { return hfResult(results, authorize.error()); } return returnResult( - rt, + runtime, params, results, hf->depositPreauthKeylet(acc.value(), authorize.value()), @@ -764,16 +782,17 @@ wasm_trap_t* didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - return returnResult(rt, params, results, hf->didKeylet(acc.value()), index); + return returnResult( + runtime, params, results, hf->didKeylet(acc.value()), index); } wasm_trap_t* @@ -783,23 +802,23 @@ escrowKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->escrowKeylet(*acc, *seq), index); + runtime, params, results, hf->escrowKeylet(*acc, *seq), index); } wasm_trap_t* @@ -809,29 +828,29 @@ lineKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc1 = getDataAccountID(rt, params, index); + auto const acc1 = getDataAccountID(runtime, params, index); if (!acc1) { return hfResult(results, acc1.error()); } - auto const acc2 = getDataAccountID(rt, params, index); + auto const acc2 = getDataAccountID(runtime, params, index); if (!acc2) { return hfResult(results, acc2.error()); } - auto const currency = getDataCurrency(rt, params, index); + auto const currency = getDataCurrency(runtime, params, index); if (!currency) { return hfResult(results, currency.error()); } return returnResult( - rt, + runtime, params, results, hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), @@ -845,23 +864,23 @@ nftOfferKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, + runtime, params, results, hf->nftOfferKeylet(acc.value(), seq.value()), @@ -875,23 +894,27 @@ offerKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->offerKeylet(acc.value(), seq.value()), index); + runtime, + params, + results, + hf->offerKeylet(acc.value(), seq.value()), + index); } wasm_trap_t* @@ -901,22 +924,22 @@ oracleKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const documentId = getDataInt32(rt, params, index); + auto const documentId = getDataInt32(runtime, params, index); if (!documentId) { return hfResult(results, documentId.error()); } return returnResult( - rt, params, results, hf->oracleKeylet(*acc, *documentId), index); + runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); } wasm_trap_t* @@ -926,29 +949,29 @@ paychanKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const dest = getDataAccountID(rt, params, index); + auto const dest = getDataAccountID(runtime, params, index); if (!dest) { return hfResult(results, dest.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, + runtime, params, results, hf->paychanKeylet(acc.value(), dest.value(), seq.value()), @@ -962,17 +985,17 @@ signersKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } return returnResult( - rt, params, results, hf->signersKeylet(acc.value()), index); + runtime, params, results, hf->signersKeylet(acc.value()), index); } wasm_trap_t* @@ -982,23 +1005,27 @@ ticketKeylet_wrap( wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const seq = getDataInt32(rt, params, index); + auto const seq = getDataInt32(runtime, params, index); if (!seq) { return hfResult(results, seq.error()); } return returnResult( - rt, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); + runtime, + params, + results, + hf->ticketKeylet(acc.value(), seq.value()), + index); ; } @@ -1006,29 +1033,30 @@ wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const acc = getDataAccountID(rt, params, index); + auto const acc = getDataAccountID(runtime, params, index); if (!acc) { return hfResult(results, acc.error()); } - auto const nftId = getDataUInt256(rt, params, index); + auto const nftId = getDataUInt256(runtime, params, index); if (!nftId) { return hfResult(results, nftId.error()); } - return returnResult(rt, params, results, hf->getNFT(*acc, *nftId), index); + return returnResult( + runtime, params, results, hf->getNFT(*acc, *nftId), index); } wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) @@ -1036,53 +1064,53 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = getDataString(rt, params, index); + auto const msg = getDataString(runtime, params, index); if (!msg) { return hfResult(results, msg.error()); } - auto const data = getDataSlice(rt, params, index); + auto const data = getDataSlice(runtime, params, index); if (!data) { return hfResult(results, data.error()); } - auto const asHex = getDataInt32(rt, params, index); + auto const asHex = getDataInt32(runtime, params, index); if (!asHex) { return hfResult(results, asHex.error()); } return returnResult( - rt, params, results, hf->trace(*msg, *data, *asHex), index); + runtime, params, results, hf->trace(*msg, *data, *asHex), index); } wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { auto* hf = reinterpret_cast(env); - auto const* rt = reinterpret_cast(hf->getRT()); + auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; if (params->data[1].of.i32 > maxWasmDataLength) { return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const msg = getDataString(rt, params, index); + auto const msg = getDataString(runtime, params, index); if (!msg) { return hfResult(results, msg.error()); } - auto const number = getDataInt64(rt, params, index); + auto const number = getDataInt64(runtime, params, index); if (!number) { return hfResult(results, number.error()); } return returnResult( - rt, params, results, hf->traceNum(*msg, *number), index); + runtime, params, results, hf->traceNum(*msg, *number), index); } class MockInstanceWrapper @@ -1090,7 +1118,7 @@ class MockInstanceWrapper wmem mem_; public: - MockInstanceWrapper(wmem mem) : mem_(mem) + MockInstanceWrapper(wmem memory) : mem_(memory) { } @@ -1110,7 +1138,7 @@ testGetDataIncrement() std::array buffer = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - MockInstanceWrapper rt(wmem{buffer.data(), buffer.size()}); + MockInstanceWrapper runtime(wmem{buffer.data(), buffer.size()}); { // test int32_t @@ -1119,7 +1147,7 @@ testGetDataIncrement() values[0] = WASM_I32_VAL(42); int index = 0; - auto const result = getDataInt32(&rt, ¶ms, index); + auto const result = getDataInt32(&runtime, ¶ms, index); if (!result || result.value() != 42 || index != 1) return false; } @@ -1131,7 +1159,7 @@ testGetDataIncrement() values[0] = WASM_I64_VAL(1234); int index = 0; - auto const result = getDataInt64(&rt, ¶ms, index); + auto const result = getDataInt64(&runtime, ¶ms, index); if (!result || result.value() != 1234 || index != 1) return false; } @@ -1143,7 +1171,7 @@ testGetDataIncrement() values[0] = WASM_I32_VAL(sfAccount.fieldCode); int index = 0; - auto const result = getDataSField(&rt, ¶ms, index); + auto const result = getDataSField(&runtime, ¶ms, index); if (!result || result.value().get() != sfAccount || index != 1) return false; } @@ -1156,7 +1184,7 @@ testGetDataIncrement() values[1] = WASM_I32_VAL(3); int index = 0; - auto const result = getDataSlice(&rt, ¶ms, index); + auto const result = getDataSlice(&runtime, ¶ms, index); if (!result || result.value() != Slice(buffer.data(), 3) || index != 2) return false; } @@ -1169,7 +1197,7 @@ testGetDataIncrement() values[1] = WASM_I32_VAL(5); int index = 0; - auto const result = getDataString(&rt, ¶ms, index); + auto const result = getDataString(&runtime, ¶ms, index); if (!result || result.value() != std::string_view( @@ -1190,7 +1218,7 @@ testGetDataIncrement() memcpy(&buffer[0], id.data(), id.bytes); int index = 0; - auto const result = getDataAccountID(&rt, ¶ms, index); + auto const result = getDataAccountID(&runtime, ¶ms, index); if (!result || result.value() != id || index != 2) return false; } @@ -1206,7 +1234,7 @@ testGetDataIncrement() memcpy(&buffer[0], h1.data(), h1.bytes); int index = 0; - auto const result = getDataUInt256(&rt, ¶ms, index); + auto const result = getDataUInt256(&runtime, ¶ms, index); if (!result || result.value() != h1 || index != 2) return false; } @@ -1222,7 +1250,7 @@ testGetDataIncrement() memcpy(&buffer[0], c.data(), c.bytes); int index = 0; - auto const result = getDataCurrency(&rt, ¶ms, index); + auto const result = getDataCurrency(&runtime, ¶ms, index); if (!result || result.value() != c || index != 2) return false; } From 3d933791320301ade73a438a47e1c3adb1b0239a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 25 Jul 2025 15:10:47 -0400 Subject: [PATCH 037/212] add header --- src/xrpld/app/misc/WamrVM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/misc/WamrVM.cpp index 64759ff8d07..3f0bd1d95fb 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/misc/WamrVM.cpp @@ -21,6 +21,7 @@ #include +#include #include #ifdef _DEBUG From 6f91b8f8d15892cd3964985ecb9b9e53d138e879 Mon Sep 17 00:00:00 2001 From: Oleksandr <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 28 Jul 2025 11:08:40 -0400 Subject: [PATCH 038/212] Fix windows --- cmake/RippledCore.cmake | 5 +++++ external/wamr/patches/ripp_metering.patch | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index b3a6a77bcb5..e5c584d1eb0 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -68,6 +68,11 @@ target_link_libraries(xrpl.imports.main wamr::wamr ) +if (WIN32) + target_link_libraries(xrpl.imports.main INTERFACE ntdll) +endif() + + include(add_module) include(target_link_modules) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 5e09eec8df8..76a2057cc9a 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 88a1642b..aeb29912 100644 +index 88a1642b..e9eab7ec 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -11,6 +11,15 @@ index 88a1642b..aeb29912 100644 option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) +@@ -170,7 +170,7 @@ if (MINGW) + endif () + + if (WIN32) +- target_link_libraries(vmlib PRIVATE ntdll) ++ target_link_libraries(vmlib PUBLIC ntdll) + endif() + + set (WAMR_PUBLIC_HEADERS diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c index b2c9ed62..87947a18 100644 --- a/core/iwasm/aot/aot_runtime.c @@ -389,7 +398,7 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..db6278c5 100644 +index 1e98b0fa..e77fdfcd 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c @@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) @@ -406,7 +415,7 @@ index 1e98b0fa..db6278c5 100644 +#define CHECK_INSTRUCTION_LIMIT() \ + do { \ + --instructions_left; \ -+ if (instructions_left <= 0) { \ ++ if (instructions_left < 0) { \ + wasm_set_exception(module, "instruction limit exceeded"); \ + goto got_exception; \ + } \ From 44cb588371e9ba821eba9f33fa63ce33d15a94b1 Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Fri, 25 Jul 2025 20:48:22 +0100 Subject: [PATCH 039/212] Build options cleanup (#5581) As we no longer support old compiler versions, we are bringing back some warnings by removing no longer relevant `-Wno-...` options. --- cmake/RippledCompiler.cmake | 23 ++------- external/ed25519-donna/CMakeLists.txt | 3 ++ .../detail/aged_unordered_container.h | 1 - src/libxrpl/protocol/PublicKey.cpp | 5 +- src/libxrpl/protocol/STTx.cpp | 4 +- src/libxrpl/protocol/tokens.cpp | 4 +- src/test/app/RCLValidations_test.cpp | 1 - .../beast/aged_associative_container_test.cpp | 48 ------------------- src/test/consensus/LedgerTrie_test.cpp | 2 - src/test/consensus/Validations_test.cpp | 1 - src/xrpld/rpc/handlers/LogLevel.cpp | 1 - 11 files changed, 15 insertions(+), 78 deletions(-) diff --git a/cmake/RippledCompiler.cmake b/cmake/RippledCompiler.cmake index 7485605d950..30058fd5036 100644 --- a/cmake/RippledCompiler.cmake +++ b/cmake/RippledCompiler.cmake @@ -90,28 +90,15 @@ if (MSVC) -errorreport:none -machine:X64) else () - # HACK : because these need to come first, before any warning demotion - string (APPEND CMAKE_CXX_FLAGS " -Wall -Wdeprecated") - if (wextra) - string (APPEND CMAKE_CXX_FLAGS " -Wextra -Wno-unused-parameter") - endif () - # not MSVC target_compile_options (common INTERFACE + -Wall + -Wdeprecated + $<$:-Wextra -Wno-unused-parameter> $<$:-Werror> - $<$: - -frtti - -Wnon-virtual-dtor - > - -Wno-sign-compare - -Wno-char-subscripts - -Wno-format - -Wno-unused-local-typedefs -fstack-protector - $<$: - -Wno-unused-but-set-variable - -Wno-deprecated - > + -Wno-sign-compare + -Wno-unused-but-set-variable $<$>:-fno-strict-aliasing> # tweak gcc optimization for debug $<$,$>:-O0> diff --git a/external/ed25519-donna/CMakeLists.txt b/external/ed25519-donna/CMakeLists.txt index 418dc38326b..f060d530aa4 100644 --- a/external/ed25519-donna/CMakeLists.txt +++ b/external/ed25519-donna/CMakeLists.txt @@ -17,6 +17,9 @@ add_library(ed25519 STATIC ) add_library(ed25519::ed25519 ALIAS ed25519) target_link_libraries(ed25519 PUBLIC OpenSSL::SSL) +if(NOT MSVC) + target_compile_options(ed25519 PRIVATE -Wno-implicit-fallthrough) +endif() include(GNUInstallDirs) diff --git a/include/xrpl/beast/container/detail/aged_unordered_container.h b/include/xrpl/beast/container/detail/aged_unordered_container.h index 3b9c83a0149..23200ae007e 100644 --- a/include/xrpl/beast/container/detail/aged_unordered_container.h +++ b/include/xrpl/beast/container/detail/aged_unordered_container.h @@ -3257,7 +3257,6 @@ operator==(aged_unordered_container< { if (size() != other.size()) return false; - using EqRng = std::pair; for (auto iter(cbegin()), last(cend()); iter != last;) { auto const& k(extract(*iter)); diff --git a/src/libxrpl/protocol/PublicKey.cpp b/src/libxrpl/protocol/PublicKey.cpp index cdf646e0f86..54b50c80ef1 100644 --- a/src/libxrpl/protocol/PublicKey.cpp +++ b/src/libxrpl/protocol/PublicKey.cpp @@ -107,8 +107,9 @@ sliceToHex(Slice const& slice) } for (int i = 0; i < slice.size(); ++i) { - s += "0123456789ABCDEF"[((slice[i] & 0xf0) >> 4)]; - s += "0123456789ABCDEF"[((slice[i] & 0x0f) >> 0)]; + constexpr char hex[] = "0123456789ABCDEF"; + s += hex[((slice[i] & 0xf0) >> 4)]; + s += hex[((slice[i] & 0x0f) >> 0)]; } return s; } diff --git a/src/libxrpl/protocol/STTx.cpp b/src/libxrpl/protocol/STTx.cpp index 615012dba4d..8be8f906a5e 100644 --- a/src/libxrpl/protocol/STTx.cpp +++ b/src/libxrpl/protocol/STTx.cpp @@ -671,12 +671,12 @@ isMemoOkay(STObject const& st, std::string& reason) "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"); - for (char c : symbols) + for (unsigned char c : symbols) a[c] = 1; return a; }(); - for (auto c : *optData) + for (unsigned char c : *optData) { if (!allowedSymbols[c]) { diff --git a/src/libxrpl/protocol/tokens.cpp b/src/libxrpl/protocol/tokens.cpp index a822b1937fb..52cffd7a5cb 100644 --- a/src/libxrpl/protocol/tokens.cpp +++ b/src/libxrpl/protocol/tokens.cpp @@ -544,7 +544,7 @@ b58_to_b256_be(std::string_view input, std::span out) XRPL_ASSERT( num_b_58_10_coeffs <= b_58_10_coeff.size(), "ripple::b58_fast::detail::b58_to_b256_be : maximum coeff"); - for (auto c : input.substr(0, partial_coeff_len)) + for (unsigned char c : input.substr(0, partial_coeff_len)) { auto cur_val = ::ripple::alphabetReverse[c]; if (cur_val < 0) @@ -558,7 +558,7 @@ b58_to_b256_be(std::string_view input, std::span out) { for (int j = 0; j < num_full_coeffs; ++j) { - auto c = input[partial_coeff_len + j * 10 + i]; + unsigned char c = input[partial_coeff_len + j * 10 + i]; auto cur_val = ::ripple::alphabetReverse[c]; if (cur_val < 0) { diff --git a/src/test/app/RCLValidations_test.cpp b/src/test/app/RCLValidations_test.cpp index 31c38f23b1c..fce4e94048d 100644 --- a/src/test/app/RCLValidations_test.cpp +++ b/src/test/app/RCLValidations_test.cpp @@ -229,7 +229,6 @@ class RCLValidations_test : public beast::unit_test::suite // support for a ledger hash which is already in the trie. using Seq = RCLValidatedLedger::Seq; - using ID = RCLValidatedLedger::ID; // Max known ancestors for each ledger Seq const maxAncestors = 256; diff --git a/src/test/beast/aged_associative_container_test.cpp b/src/test/beast/aged_associative_container_test.cpp index f88d5acc277..586f4868726 100644 --- a/src/test/beast/aged_associative_container_test.cpp +++ b/src/test/beast/aged_associative_container_test.cpp @@ -703,10 +703,6 @@ aged_associative_container_test_base::checkContentsRefRef( Values const& v) { using Cont = typename std::remove_reference::type; - using Traits = TestTraits< - Cont::is_unordered::value, - Cont::is_multi::value, - Cont::is_map::value>; using size_type = typename Cont::size_type; BEAST_EXPECT(c.size() == v.size()); @@ -761,10 +757,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructEmpty() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Comp = typename Traits::Comp; using Alloc = typename Traits::Alloc; using MyComp = typename Traits::MyComp; @@ -802,10 +794,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructEmpty() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Hash = typename Traits::Hash; using Equal = typename Traits::Equal; using Alloc = typename Traits::Alloc; @@ -870,10 +858,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructRange() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Comp = typename Traits::Comp; using Alloc = typename Traits::Alloc; using MyComp = typename Traits::MyComp; @@ -925,10 +909,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructRange() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; using Hash = typename Traits::Hash; using Equal = typename Traits::Equal; using Alloc = typename Traits::Alloc; @@ -996,14 +976,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructInitList() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; - using Comp = typename Traits::Comp; - using Alloc = typename Traits::Alloc; - using MyComp = typename Traits::MyComp; - using MyAlloc = typename Traits::MyAlloc; typename Traits::ManualClock clock; // testcase (Traits::name() + " init-list"); @@ -1020,16 +992,6 @@ typename std::enable_if::type aged_associative_container_test_base::testConstructInitList() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Key = typename Traits::Key; - using T = typename Traits::T; - using Clock = typename Traits::Clock; - using Hash = typename Traits::Hash; - using Equal = typename Traits::Equal; - using Alloc = typename Traits::Alloc; - using MyHash = typename Traits::MyHash; - using MyEqual = typename Traits::MyEqual; - using MyAlloc = typename Traits::MyAlloc; typename Traits::ManualClock clock; // testcase (Traits::name() + " init-list"); @@ -1050,7 +1012,6 @@ void aged_associative_container_test_base::testCopyMove() { using Traits = TestTraits; - using Value = typename Traits::Value; using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1121,8 +1082,6 @@ void aged_associative_container_test_base::testIterator() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1179,8 +1138,6 @@ typename std::enable_if::type aged_associative_container_test_base::testReverseIterator() { using Traits = TestTraits; - using Value = typename Traits::Value; - using Alloc = typename Traits::Alloc; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1190,7 +1147,6 @@ aged_associative_container_test_base::testReverseIterator() typename Traits::template Cont<> c{clock}; using iterator = decltype(c.begin()); - using const_iterator = decltype(c.cbegin()); using reverse_iterator = decltype(c.rbegin()); using const_reverse_iterator = decltype(c.crbegin()); @@ -1394,7 +1350,6 @@ void aged_associative_container_test_base::testChronological() { using Traits = TestTraits; - using Value = typename Traits::Value; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1760,7 +1715,6 @@ typename std::enable_if::type aged_associative_container_test_base::testCompare() { using Traits = TestTraits; - using Value = typename Traits::Value; typename Traits::ManualClock clock; auto const v(Traits::values()); @@ -1832,8 +1786,6 @@ template void aged_associative_container_test_base::testMaybeUnorderedMultiMap() { - using Traits = TestTraits; - testConstructEmpty(); testConstructRange(); testConstructInitList(); diff --git a/src/test/consensus/LedgerTrie_test.cpp b/src/test/consensus/LedgerTrie_test.cpp index f46fea8e6e0..6ed45777f09 100644 --- a/src/test/consensus/LedgerTrie_test.cpp +++ b/src/test/consensus/LedgerTrie_test.cpp @@ -313,7 +313,6 @@ class LedgerTrie_test : public beast::unit_test::suite testSupport() { using namespace csf; - using Seq = Ledger::Seq; LedgerTrie t; LedgerHistoryHelper h; @@ -596,7 +595,6 @@ class LedgerTrie_test : public beast::unit_test::suite testRootRelated() { using namespace csf; - using Seq = Ledger::Seq; // Since the root is a special node that breaks the no-single child // invariant, do some tests that exercise it. diff --git a/src/test/consensus/Validations_test.cpp b/src/test/consensus/Validations_test.cpp index 4424d7619d2..a04e62b7235 100644 --- a/src/test/consensus/Validations_test.cpp +++ b/src/test/consensus/Validations_test.cpp @@ -805,7 +805,6 @@ class Validations_test : public beast::unit_test::suite Ledger ledgerACD = h["acd"]; using Seq = Ledger::Seq; - using ID = Ledger::ID; auto pref = [](Ledger ledger) { return std::make_pair(ledger.seq(), ledger.id()); diff --git a/src/xrpld/rpc/handlers/LogLevel.cpp b/src/xrpld/rpc/handlers/LogLevel.cpp index 0fc266569e8..a93d010706e 100644 --- a/src/xrpld/rpc/handlers/LogLevel.cpp +++ b/src/xrpld/rpc/handlers/LogLevel.cpp @@ -44,7 +44,6 @@ doLogLevel(RPC::JsonContext& context) Logs::toString(Logs::fromSeverity(context.app.logs().threshold())); std::vector> logTable( context.app.logs().partition_severities()); - using stringPair = std::map::value_type; for (auto const& [k, v] : logTable) lev[k] = v; From 66776b6a85fc58aa5ee5346bb4def911dbd9915e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Jul 2025 16:06:21 -0400 Subject: [PATCH 040/212] test: codecov for WasmHostFuncWrapper.cpp (#5601) --- src/test/app/Escrow_test.cpp | 12 +- src/test/app/TestHostFunctions.h | 36 +- src/test/app/Wasm_test.cpp | 29 + src/test/app/wasm_fixtures/fixtures.cpp | 611 +++++++++++++-------- src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 55 +- 6 files changed, 478 insertions(+), 267 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3fdccae9ee5..93a37d81037 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2324,14 +2324,9 @@ struct Escrow_test : public beast::unit_test::suite Account const alice{"alice"}; Account const carol{"carol"}; - { - Env env(*this); - env.fund(XRP(5000), alice, carol); - } - { Env env{*this}; - env.fund(XRP(5000), alice, carol); + env.fund(XRP(10000), alice, carol); BEAST_EXPECT(env.seq(alice) == 4); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2355,14 +2350,15 @@ struct Escrow_test : public beast::unit_test::suite escrow::finish_time(env.now() + 100s)); env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); + env(offer(alice, carol["USD"](0.1), XRP(100))); env(create(alice, carol, XRP(1000), 100s, alice.pk())); env(signers(alice, 1, {{carol, 1}})); env(ticket::create(alice, 1)); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 11); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); if (BEAST_EXPECTS( - env.seq(alice) == 16, std::to_string(env.seq(alice)))) + env.seq(alice) == 17, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); XRPAmount txnFees = env.current()->fees().base + 1000; diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 6a177380492..45de5d7b936 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -69,9 +69,7 @@ struct TestHostFunctions : public HostFunctions TestHostFunctions(test::jtx::Env& env, int cd = 0) : env_(env), clock_drift_(cd) { - auto opt = parseBase58("rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"); - if (opt) - accountID_ = *opt; + accountID_ = env_.master.id(); std::string t = "10000"; data_ = Bytes{t.begin(), t.end()}; } @@ -165,19 +163,31 @@ struct TestHostFunctions : public HostFunctions Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) override { - // auto const& sn = fname.getName(); if (fname == sfBalance) { int64_t x = 10'000; uint8_t const* p = reinterpret_cast(&x); return Bytes{p, p + sizeof(x)}; } + else if (fname == sfAccount) + { + return Bytes(accountID_.begin(), accountID_.end()); + } return data_; } Expected getTxNestedField(Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, @@ -188,6 +198,15 @@ struct TestHostFunctions : public HostFunctions Expected getCurrentLedgerObjNestedField(Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, @@ -198,6 +217,15 @@ struct TestHostFunctions : public HostFunctions Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index d03135ae65c..5eee6014e5a 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -606,6 +606,33 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testCodecovWasm() + { + testcase("Codecov wasm test"); + + using namespace test::jtx; + + // Env env{ + // *this, + // envconfig(), + // testable_amendments(), + // nullptr, + // beast::severities::kTrace}; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(codecovWasm); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestHostFunctions hfs(env, 0); + + auto re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + + if (BEAST_EXPECT(re.has_value())) + BEAST_EXPECT(re->result); + } + void run() override { @@ -630,6 +657,8 @@ struct Wasm_test : public beast::unit_test::suite testEscrowWasmDN(); + testCodecovWasm(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 48b0d20b73a..bddb076df9c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -11848,242 +11848,377 @@ extern std::string const opcCallPerfTest = "0b0e01004180080b07623a2025660a00"; extern std::string const keyletHostFunctions = - "0061736d01000000015b0c60057f7f7f7f7f017f60037f7f7f017f60037f7f7e017f60047f" - "7f7f7f017f60087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60000060037f7f7f0060027f7f0002c6031108686f73745f" - "6c6962057472616365000008686f73745f6c69621063616368655f6c65646765725f6f626a" - "000108686f73745f6c69620974726163655f6e756d000208686f73745f6c6962146765745f" - "6c65646765725f6f626a5f6669656c64000308686f73745f6c69621c6765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c64000108686f73745f6c69620e6163636f756e" - "745f6b65796c6574000308686f73745f6c69620b6c696e655f6b65796c6574000408686f73" - "745f6c69620c636865636b5f6b65796c6574000008686f73745f6c69621163726564656e74" - "69616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c6574" - "000508686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000508" - "686f73745f6c69620a6469645f6b65796c6574000308686f73745f6c69620d657363726f77" - "5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c65740000" - "08686f73745f6c69620e7061796368616e5f6b65796c6574000608686f73745f6c69620e73" - "69676e6572735f6b65796c6574000308686f73745f6c69620d7469636b65745f6b65796c65" - "740000030d0c0708090a0a0a0b0b0b0a0b0b05030100110619037f01418080c0000b7f0041" - "f989c0000b7f0041808ac0000b073e05066d656d6f727902000d6f626a6563745f65786973" - "747300110666696e69736800120a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020a94270c9a0603017f037e037f23808080800041f0006b2205248080808000024002" - "40024020012d00000d00200541186a200141196a290000370300200541106a200141116a29" - "0000370300200541086a200141096a29000037030020052001290001370300200220032005" - "412041011080808080001a20054120410010818080800022014101480d0102400240024002" - "4020040d00418b80c08000410f428580141082808080001a200541d0006a41186a42003703" - "00200541d0006a41106a4200370300200541d0006a41086a42003703002005420037035020" - "0141858014200541d0006a412010838080800022014120470d01200541206a41086a200541" - "d0006a410f6a22012900002206370300200541206a41106a200541e7006a22042900002207" - "370300200541206a41186a200541ef006a22032d000022023a000020052005290057220837" - "032020052f015021092005280152210a20052d0056210b2001200637000020042007370000" - "200320023a00002005200b3a00562005200a360152200520093b015020052008370057419a" - "80c08000410c200541d0006a412041011080808080001a0c030b418b80c08000410f2004ac" - "1082808080001a200541e0006a4100360200200541d8006a42003703002005420037035020" - "012004200541d0006a411410838080800022014114460d0141a680c0800041152001417f20" - "01417f481b2201ac1082808080001a200041013a0000200020013602040c050b41a680c080" - "0041152001417f2001417f481b2201ac1082808080001a200041013a000020002001360204" - "0c040b200541226a20052d00523a0000200520052900573703402005200541d0006a410c6a" - "290000370045200541206a410c6a2005290045370000200520052f01503b01202005200528" - "005336002320052005290340370027419a80c08000410c200541206a411441011080808080" - "001a0b20004180023b01000c020b41c280c08000411620012802042201ac1082808080001a" - "200041013a0000200020013602040c010b41bb80c0800041072001ac1082808080001a2000" - "41013a0000200041783602040b200541f0006a2480808080000bd21201067f238080808000" - "4190046b220024808080800041d880c0800041234100410041001080808080001a20004180" - "046a22014100360200200041f8036a22024200370300200042003703f00302400240024002" - "4041818020200041f0036a411410848080800022034114470d00200041046a41026a20002d" - "00f2033a0000200020002900f7033703502000200041f0036a410c6a220329000037005520" - "0041046a410c6a2000290055370000200020002f01f0033b0104200020002800f303360007" - "2000200029035037000b41fb80c08000410a200041046a411441011080808080001a200141" - "0036020020024200370300200042003703f00341838020200041f0036a4114108480808000" - "22014114470d01200041186a41026a20002d00f2033a0000200020002900f7033703502000" - "2003290000370055200041186a410c6a2000290055370000200020002f01f0033b01182000" - "20002800f30336001b2000200029035037001f418581c08000410e200041186a4114410110" - "80808080001a20004188046a2202420037030020004180046a22034200370300200041f803" - "6a22044200370300200042003703f003200041046a4114200041f0036a4120108580808000" - "22014120460d02024002402001417f4a0d00200020013602300c010b2000417f3602300b41" - "0121010c030b418080c08000410b2003417f2003417f481bac1082808080001a1093808080" - "00000b418080c08000410b2001417f2001417f481bac1082808080001a109380808000000b" - "200041c5006a20022903003700002000413d6a2003290300370000200041356a2004290300" - "370000200020002903f00337002d410021010b200020013a002c200041f0036a2000412c6a" - "419381c080004107418180201091808080000240024020002d00f0030d00024020002d00f1" - "030d00419a81c0800041364100410041001080808080001a0c010b4100210141d081c08000" - "41354100410041001080808080001a200041de006a41c4003a0000200041d0006a41086a41" - "00360200200041e3006a41003a0000200041d5a6013b015c20004200370350200041003600" - "5f20004188046a2203420037030020004180046a22044200370300200041f0036a41086a22" - "054200370300200042003703f00302400240200041046a4114200041186a4114200041d000" - "6a4114200041f0036a412010868080800022024120460d00024002402002417f4a0d002000" - "20023602680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000" - "200041f5006a2004290300370000200041ed006a2005290300370000200020002903f00337" - "00650b200020013a0064200041f0036a200041e4006a418582c08000410941001091808080" - "0020002d00f0030d00024020002d00f1030d00418e82c08000413a41004100410010808080" - "80001a0c010b4100210141c882c0800041394100410041001080808080001a20004188046a" - "2203420037030020004180046a22044200370300200041f8036a2205420037030020004200" - "3703f00302400240200041046a41144106200041f0036a412010878080800022024120460d" - "00024002402002417f4a0d002000200236028c010c010b2000417f36028c010b410121010c" - "010b200041a1016a200329030037000020004199016a200429030037000020004191016a20" - "05290300370000200020002903f003370089010b200020013a008801200041f0036a200041" - "88016a418183c0800041054181802010918080800020002d00f0030d00024020002d00f103" - "0d00419a81c0800041364100410041001080808080001a0c010b41d081c080004135410041" - "0041001080808080001a200041ac016a200041046a200041046a109480808000200041f003" - "6a200041ac016a419883c08000410a4198802010918080800020002d00f0030d0002402000" - "2d00f1030d0041a283c08000413b4100410041001080808080001a0c010b41dd83c0800041" - "3a4100410041001080808080001a200041d0016a200041046a200041186a10958080800020" - "0041f0036a200041d0016a419784c0800041084181802010918080800020002d00f0030d00" - "024020002d00f1030d00419f84c0800041394100410041001080808080001a0c010b41d884" - "c0800041384100410041001080808080001a200041f4016a200041046a200041186a109680" - "808000200041f0036a200041f4016a419784c0800041084181802010918080800020002d00" - "f0030d00024020002d00f1030d00419f84c0800041394100410041001080808080001a0c01" - "0b41d884c0800041384100410041001080808080001a20004198026a200041046a10978080" - "8000200041f0036a20004198026a419381c0800041074181802010918080800020002d00f0" - "030d00024020002d00f1030d00419a81c0800041364100410041001080808080001a0c010b" - "41d081c0800041354100410041001080808080001a200041bc026a200041046a1098808080" - "00200041f0036a200041bc026a419085c0800041064181802010918080800020002d00f003" - "0d00024020002d00f1030d00419685c0800041374100410041001080808080001a0c010b41" - "cd85c0800041364100410041001080808080001a200041e0026a200041186a109980808000" - "200041f0036a200041e0026a418386c08000410c4182802010918080800020002d00f0030d" - "00024020002d00f1030d00418f86c08000413d4100410041001080808080001a0c010b41cc" - "86c08000413c4100410041001080808080001a20004184036a200041046a200041186a109a" - "80808000200041f0036a20004184036a418887c08000410a4181802010918080800020002d" - "00f0030d00024020002d00f1030d00419287c08000413b4100410041001080808080001a0c" - "010b41cd87c08000413a4100410041001080808080001a200041a8036a200041046a109b80" - "808000200041f0036a200041a8036a418788c08000410a410010918080800020002d00f003" - "0d00024020002d00f1030d00419188c08000413b4100410041001080808080001a0c010b41" - "cc88c08000413a4100410041001080808080001a200041cc036a200041046a109c80808000" - "200041f0036a200041cc036a418689c0800041064181802010918080800020002d00f0030d" - "00024020002d00f1030d00418c89c0800041374100410041001080808080001a0c010b41c3" - "89c0800041364100410041001080808080001a410121010c010b410021010b20004190046a" - "24808080800020010b0300000bd10101047f23808080800041206b22032480808080002003" - "41186a22044200370300200341106a22054200370300200341086a22064200370300200342" - "00370300024002402001411420024114418683c08000411220034120108880808000220241" - "20460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b41012102" - "0c010b20002003290300370001200041196a2004290300370000200041116a200529030037" - "0000200041096a2006290300370000410021020b200020023a0000200341206a2480808080" - "000bc90101047f23808080800041206b2203248080808000200341186a2204420037030020" - "0341106a22054200370300200341086a220642003703002003420037030002400240200141" - "14200241142003412010898080800022024120460d00024002402002417f4a0d0020002002" - "3602040c010b2000417f3602040b410121020c010b20002003290300370001200041196a20" - "04290300370000200041116a2005290300370000200041096a200629030037000041002102" - "0b200020023a0000200341206a2480808080000bc90101047f23808080800041206b220324" - "8080808000200341186a22044200370300200341106a22054200370300200341086a220642" - "003703002003420037030002400240200141142002411420034120108a8080800022024120" - "460d00024002402002417f4a0d00200020023602040c010b2000417f3602040b410121020c" - "010b20002003290300370001200041196a2004290300370000200041116a20052903003700" - "00200041096a2006290300370000410021020b200020023a0000200341206a248080808000" - "0bc50101047f23808080800041206b2202248080808000200241186a220342003703002002" - "41106a22044200370300200241086a22054200370300200242003703000240024020014114" - "20024120108b8080800022014120460d00024002402001417f4a0d00200020013602040c01" - "0b2000417f3602040b410121010c010b20002002290300370001200041196a200329030037" - "0000200041116a2004290300370000200041096a2005290300370000410021010b20002001" - "3a0000200241206a2480808080000bc70101047f23808080800041206b2202248080808000" - "200241186a22034200370300200241106a22044200370300200241086a2205420037030020" - "0242003703000240024020014114410b20024120108c8080800022014120460d0002400240" - "2001417f4a0d00200020013602040c010b2000417f3602040b410121010c010b2000200229" - "0300370001200041196a2003290300370000200041116a2004290300370000200041096a20" - "05290300370000410021010b200020013a0000200241206a2480808080000bc70101047f23" - "808080800041206b2202248080808000200241186a22034200370300200241106a22044200" - "370300200241086a2205420037030020024200370300024002402001411441042002412010" - "8d8080800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f" - "3602040b410121010c010b20002002290300370001200041196a2003290300370000200041" - "116a2004290300370000200041096a2005290300370000410021010b200020013a00002002" - "41206a2480808080000bcb0101047f23808080800041206b2203248080808000200341186a" - "22044200370300200341106a22054200370300200341086a22064200370300200342003703" - "00024002402001411420024114410c20034120108e8080800022024120460d000240024020" - "02417f4a0d00200020023602040c010b2000417f3602040b410121020c010b200020032903" - "00370001200041196a2004290300370000200041116a2005290300370000200041096a2006" - "290300370000410021020b200020023a0000200341206a2480808080000bc50101047f2380" - "8080800041206b2202248080808000200241186a22034200370300200241106a2204420037" - "0300200241086a2205420037030020024200370300024002402001411420024120108f8080" - "800022014120460d00024002402001417f4a0d00200020013602040c010b2000417f360204" - "0b410121010c010b20002002290300370001200041196a2003290300370000200041116a20" - "04290300370000200041096a2005290300370000410021010b200020013a0000200241206a" - "2480808080000bc70101047f23808080800041206b2202248080808000200241186a220342" - "00370300200241106a22044200370300200241086a22054200370300200242003703000240" - "024020014114410f2002412010908080800022014120460d00024002402001417f4a0d0020" - "0020013602040c010b2000417f3602040b410121010c010b20002002290300370001200041" - "196a2003290300370000200041116a2004290300370000200041096a200529030037000041" - "0021010b200020013a0000200241206a2480808080000b0b830a0100418080c0000bf90965" - "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" - "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" - "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" - "5554494f4e20242424242420204163636f756e743a202044657374696e6174696f6e3a4163" - "636f756e742020436865636b206f626a65637420646f6573206e6f742065786973742c2061" - "626f7274696e6720657363726f772066696e6973682e2020436865636b206f626a65637420" - "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" - "2e54727573746c696e65202054727573746c696e65206f626a65637420646f6573206e6f74" - "2065786973742c2061626f7274696e6720657363726f772066696e6973682e202054727573" - "746c696e65206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e436865636b7465726d73616e64636f6e646974696f6e73" - "43726564656e7469616c202043726564656e7469616c206f626a65637420646f6573206e6f" - "742065786973742c2061626f7274696e6720657363726f772066696e6973682e2020437265" - "64656e7469616c206f626a656374206578697374732c2070726f63656564696e6720776974" - "6820657363726f772066696e6973682e44656c6567617465202044656c6567617465206f62" - "6a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f7720" - "66696e6973682e202044656c6567617465206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e457363726f772020457363" - "726f77206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065" - "7363726f772066696e6973682e2020457363726f77206f626a656374206578697374732c20" - "70726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e" - "4f6666657220204e46546f6b656e4f66666572206f626a65637420646f6573206e6f742065" - "786973742c2061626f7274696e6720657363726f772066696e6973682e20204e46546f6b65" - "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e5061794368616e6e656c20205061794368616e6e656c" + "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" + "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" + "73745f6c69621063616368655f6c65646765725f6f626a000208686f73745f6c6962097472" + "6163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f626a5f666965" + "6c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f" + "6669656c64000208686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73" + "745f6c69620b6c696e655f6b65796c6574000308686f73745f6c69620c636865636b5f6b65" + "796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c657400030868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" + "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" + "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" + "725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608" + "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" + "636b65745f6b65796c65740000030302070805030100110619037f01418080c0000b7f0041" + "f48bc0000b7f0041808cc0000b073e05066d656d6f727902000d6f626a6563745f65786973" + "747300120666696e69736800130a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020ab82202b50502057f037e230041f0006b220524000240024020012d000045044020" + "0541186a200141196a290000370300200541106a200141116a290000370300200541086a20" + "0141096a290000370300200520012900013703002002200320054120410110001a20054120" + "41001001220141004c0d010240024002402004450440418b80c000410f4285801410021a20" + "0541e8006a4200370300200541e0006a4200370300200541d8006a42003703002005420037" + "0350200141858014200541d0006a22064120100322014120470d01200541286a200541df00" + "6a2201290000220a370300200541306a200541e7006a2202290000220b370300200541386a" + "200541ef006a22032d000022043a000020052005290057220c37032020052f015021072005" + "280152210820052d005621092001200a3700002002200b370000200320043a000020052009" + "3a005620052008360152200520073b01502005200c370057419a80c000410c200641204101" + "10001a0c030b418b80c000410f2004ac10021a200541e0006a4100360200200541d8006a42" + "003703002005420037035020012004200541d0006a4114100322014114460d0141a680c000" + "4115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c050b41a6" + "80c0004115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c04" + "0b200541226a20052d00523a0000200520052900573703402005200541dc006a2900003700" + "452005412c6a2005290045370000200520052f01503b012020052005280053360023200520" + "05290340370027419a80c000410c200541206a4114410110001a0b20004180023b01000c02" + "0b41c280c000411620012802042201ac10021a200041013a0000200020013602040c010b41" + "bb80c00041072001ac10021a200041013a0000200041783602040b200541f0006a24000bfe" + "1c01077f230041c0046b2200240041d880c000412341004100410010001a200041b0046a22" + "014100360200200041a8046a22024200370300200042003703a00402402000027f02404181" + "8020200041a0046a220541141004220341144604402000410e6a20002d00a2043a00002000" + "20002900a7043703582000200041ac046a220429000037005d200041186a200029005d3700" + "00200020002f01a0043b010c200020002800a30436000f2000200029035837001341fb80c0" + "00410a2000410c6a22064114410110001a2001410036020020024200370300200042003703" + "a0044183802020054114100422034114470d03200041226a20002d00a2043a000020002000" + "2900a7043703582000200429000037005d2000412c6a200029005d370000200020002f01a0" + "043b0120200020002800a30436002320002000290358370027418581c000410e200041206a" + "4114410110001a200041b8046a220442003703002001420037030020024200370300200042" + "003703a0042006411420054120100522034120460d01024020034100480440200020033602" + "380c010b2000417f3602380b41010c020b0c020b200041cd006a2004290300370000200041" + "c5006a20012903003700002000413d6a2002290300370000200020002903a0043700354100" + "0b3a0034200041a0046a200041346a419381c0004107418180201012027f024020002d00a0" + "040d0020002d00a104450440419a81c000413641004100410010001a0c010b4100210341d0" + "81c000413541004100410010001a200041e6006a41c4003a0000200041e0006a4100360200" + "200041eb006a41003a0000200041d5a6013b01642000420037035820004100360067200041" + "b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037030020" + "0042003703a00402402000410c6a4114200041206a4114200041d8006a4114200041a0046a" + "4120100622014120470440024020014100480440200020013602740c010b2000417f360274" + "0b410121030c010b20004189016a200229030037000020004181016a200529030037000020" + "0041f9006a2004290300370000200020002903a0043700710b200020033a0070200041a004" + "6a200041f0006a418582c00041094100101220002d00a0040d0020002d00a104450440418e" + "82c000413a41004100410010001a0c010b4100210341c882c000413941004100410010001a" + "200041b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037" + "0300200042003703a00402402000410c6a41144106200041a0046a41201007220141204704" + "4002402001410048044020002001360298010c010b2000417f360298010b410121030c010b" + "200041ad016a2002290300370000200041a5016a20052903003700002000419d016a200429" + "0300370000200020002903a004370095010b200020033a009401200041a0046a2000419401" + "6a418183c000410541818020101220002d00a0040d0020002d00a104450440419a81c00041" + "3641004100410010001a0c010b41d081c000413541004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "20014200370300200041b8016a2202027f2000410c6a2203411420034114418683c0004112" + "20014120100822034120470440024020034100480440200220033602040c010b2002417f36" + "02040b41010c010b20022001290300370001200241196a2005290300370000200241116a20" + "04290300370000200241096a200629030037000041000b3a0000200141206a2400200041a0" + "046a2002419883c000410a41988020101220002d00a0040d0020002d00a10445044041a283" + "c000413b41004100410010001a0c010b41dd83c000413a41004100410010001a230041206b" + "22012400200141186a22054200370300200141106a22044200370300200141086a22064200" + "37030020014200370300200041dc016a2202027f2000410c6a4114200041206a4114200141" + "20100922034120470440024020034100480440200220033602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" + "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" + "02419784c000410841818020101220002d00a0040d0020002d00a104450440419f84c00041" + "3941004100410010001a0c010b41d884c000413841004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "2001420037030020004180026a2202027f2000410c6a4114200041206a411420014120100a" + "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" + "010b20022001290300370001200241196a2005290300370000200241116a20042903003700" + "00200241096a200629030037000041000b3a0000200141206a2400200041a0046a20024190" + "85c000410e41818020101220002d00a0040d0020002d00a104450440419e85c000413f4100" + "4100410010001a0c010b41dd85c000413e41004100410010001a230041206b220124002001" + "41186a22054200370300200141106a22044200370300200141086a22064200370300200142" + "00370300200041a4026a2202027f2000410c6a411420014120100b22034120470440024020" + "034100480440200220033602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2005290300370000200241116a2004290300370000200241096a20062903" + "0037000041000b3a0000200141206a2400200041a0046a2002419381c00041074181802010" + "1220002d00a0040d0020002d00a104450440419a81c000413641004100410010001a0c010b" + "41d081c000413541004100410010001a230041206b22012400200141186a22054200370300" + "200141106a22044200370300200141086a2206420037030020014200370300200041c8026a" + "2202027f2000410c6a4114410b20014120100c220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041a0046a2002419b86c000410641818020101220002d00a0040d" + "0020002d00a10445044041a186c000413741004100410010001a0c010b41d886c000413641" + "004100410010001a230041206b22012400200141186a22054200370300200141106a220442" + "00370300200141086a2206420037030020014200370300200041ec026a2202027f20004120" + "6a4114410420014120100d22034120470440024020034100480440200220033602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200529030037000020" + "0241116a2004290300370000200241096a200629030037000041000b3a0000200141206a24" + "00200041a0046a2002418e87c000410c41828020101220002d00a0040d0020002d00a10445" + "0440419a87c000413d41004100410010001a0c010b41d787c000413c41004100410010001a" + "230041206b22012400200141186a22054200370300200141106a2204420037030020014108" + "6a220642003703002001420037030020004190036a2202027f2000410c6a4114410c200141" + "20100e22034120470440024020034100480440200220033602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" + "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" + "02419388c000410541818020101220002d00a0040d0020002d00a104450440419888c00041" + "3641004100410010001a0c010b41ce88c000413541004100410010001a230041206b220124" + "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" + "20014200370300200041b4036a2202027f2000410c6a4114200041206a4114410d20014120" + "100f22034120470440024020034100480440200220033602040c010b2002417f3602040b41" + "010c010b20022001290300370001200241196a2005290300370000200241116a2004290300" + "370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a2002" + "418389c000410a41818020101220002d00a0040d0020002d00a104450440418d89c000413b" + "41004100410010001a0c010b41c889c000413a41004100410010001a230041206b22012400" + "200141186a22054200370300200141106a22044200370300200141086a2206420037030020" + "014200370300200041d8036a2202027f2000410c6a41142001412010102203412047044002" + "4020034100480440200220033602040c010b2002417f3602040b41010c010b200220012903" + "00370001200241196a2005290300370000200241116a2004290300370000200241096a2006" + "29030037000041000b3a0000200141206a2400200041a0046a200241828ac000410a410010" + "1220002d00a0040d0020002d00a104450440418c8ac000413b41004100410010001a0c010b" + "41c78ac000413a41004100410010001a230041206b22012400200141186a22054200370300" + "200141106a22044200370300200141086a2206420037030020014200370300200041fc036a" + "2202027f2000410c6a41144110200141201011220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041a0046a200241818bc000410641818020101220002d00a0040d" + "0020002d00a10445044041878bc000413741004100410010001a0c010b41be8bc000413641" + "004100410010001a41010c010b41000b200041c0046a24000f0b418080c000410b417f2003" + "2003417f4e1bac1002000b0bfe0b0100418080c0000bf40b6572726f725f636f64653d4765" + "7474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e" + "67206669656c643a204572726f723a204572726f722067657474696e67206b65796c65743a" + "202424242424205354415254494e47205741534d20455845435554494f4e20242424242420" + "204163636f756e743a202044657374696e6174696f6e3a4163636f756e742020436865636b" "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" - "6f772066696e6973682e20205061794368616e6e656c206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e6572" - "4c69737420205369676e65724c697374206f626a65637420646f6573206e6f742065786973" - "742c2061626f7274696e6720657363726f772066696e6973682e20205369676e65724c6973" - "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" - "6f772066696e6973682e5469636b657420205469636b6574206f626a65637420646f657320" - "6e6f742065786973742c2061626f7274696e6720657363726f772066696e6973682e202054" - "69636b6574206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e00ad0d046e616d650014136b65796c65745f6578616d70" - "6c652e7761736d01ef0c1d002b5f5a4e387872706c5f73746434686f737435747261636531" - "3768356563663766653133666438643166354501375f5a4e387872706c5f73746434686f73" - "74313663616368655f6c65646765725f6f626a313768373838623636346237363634616165" - "3145022f5f5a4e387872706c5f73746434686f73743974726163655f6e756d313768653639" - "3463616436386330376633386345033b5f5a4e387872706c5f73746434686f737432306765" - "745f6c65646765725f6f626a5f6669656c6431376838373939646530383866396236356339" - "4504435f5a4e387872706c5f73746434686f737432386765745f63757272656e745f6c6564" - "6765725f6f626a5f6669656c64313768346239313763353864363137613961394505355f5a" - "4e387872706c5f73746434686f737431346163636f756e745f6b65796c6574313768616233" - "363663616435383039376261304506325f5a4e387872706c5f73746434686f737431316c69" - "6e655f6b65796c6574313768653466386161383862646663633464664507335f5a4e387872" - "706c5f73746434686f73743132636865636b5f6b65796c6574313768333165356538343139" - "326131633631654508385f5a4e387872706c5f73746434686f7374313763726564656e7469" - "616c5f6b65796c6574313768643731653739346561383463373839644509365f5a4e387872" - "706c5f73746434686f7374313564656c65676174655f6b65796c6574313768323639663430" - "63643739663834373237450a3d5f5a4e387872706c5f73746434686f737432326465706f73" - "69745f707265617574685f6b65796c65743137686161306631646338616233346634623745" - "0b315f5a4e387872706c5f73746434686f737431306469645f6b65796c6574313768313866" - "61393935616436326331313139450c345f5a4e387872706c5f73746434686f737431336573" - "63726f775f6b65796c657431376838373464316235373266376333326437450d375f5a4e38" - "7872706c5f73746434686f737431366e66745f6f666665725f6b65796c6574313768663931" - "35393838643961386466633863450e355f5a4e387872706c5f73746434686f737431347061" - "796368616e5f6b65796c657431376862373435373234653534336539333565450f355f5a4e" - "387872706c5f73746434686f737431347369676e6572735f6b65796c657431376866646335" - "3536343961633961626465304510345f5a4e387872706c5f73746434686f73743133746963" - "6b65745f6b65796c65743137683164393432633034663234386362666545110d6f626a6563" - "745f657869737473120666696e69736813305f5a4e34636f72653970616e69636b696e6739" - "70616e69635f666d74313768623931626164616365366565383238374514465f5a4e387872" - "706c5f73746434636f7265357479706573376b65796c657473313763726564656e7469616c" - "5f6b65796c6574313768353839343033303564323939613236354515445f5a4e387872706c" - "5f73746434636f7265357479706573376b65796c657473313564656c65676174655f6b6579" - "6c65743137686665363134666163326238656437626445164b5f5a4e387872706c5f737464" - "34636f7265357479706573376b65796c65747332326465706f7369745f707265617574685f" - "6b65796c65743137683634303539316533346337323839363645173f5f5a4e387872706c5f" - "73746434636f7265357479706573376b65796c65747331306469645f6b65796c6574313768" - "326538323337313938626638373463634518425f5a4e387872706c5f73746434636f726535" - "7479706573376b65796c6574733133657363726f775f6b65796c6574313768363462336265" - "663061333138383233634519455f5a4e387872706c5f73746434636f726535747970657337" - "6b65796c65747331366e66745f6f666665725f6b65796c6574313768633833353933386361" - "63306465646263451a435f5a4e387872706c5f73746434636f7265357479706573376b6579" - "6c65747331347061796368616e5f6b65796c65743137683332396231633338396165343162" - "3638451b435f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331" - "347369676e6572735f6b65796c657431376839633832313566396330386134636565451c42" - "5f5a4e387872706c5f73746434636f7265357479706573376b65796c65747331337469636b" - "65745f6b65796c65743137683366303138626436663561373338326645071201000f5f5f73" - "7461636b5f706f696e746572090a0100072e726f64617461004d0970726f64756365727302" - "086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d" - "312e38352e31202834656231363132353020323032352d30332d31352900490f7461726765" - "745f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c652d676c6f62" - "616c732b0f7265666572656e63652d74797065732b087369676e2d657874"; + "6f772066696e6973682e2020436865636b206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e54727573746c696e652020" + "54727573746c696e65206f626a65637420646f6573206e6f742065786973742c2061626f72" + "74696e6720657363726f772066696e6973682e202054727573746c696e65206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e436865636b7465726d73616e64636f6e646974696f6e7343726564656e7469616c2020" + "43726564656e7469616c206f626a65637420646f6573206e6f742065786973742c2061626f" + "7274696e6720657363726f772066696e6973682e202043726564656e7469616c206f626a65" + "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" + "6973682e44656c6567617465202044656c6567617465206f626a65637420646f6573206e6f" + "742065786973742c2061626f7274696e6720657363726f772066696e6973682e202044656c" + "6567617465206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4465706f7369745072656175746820204465706f736974" + "50726561757468206f626a65637420646f6573206e6f742065786973742c2061626f727469" + "6e6720657363726f772066696e6973682e20204465706f73697450726561757468206f626a" + "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" + "6e6973682e457363726f772020457363726f77206f626a65637420646f6573206e6f742065" + "786973742c2061626f7274696e6720657363726f772066696e6973682e2020457363726f77" + "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" + "772066696e6973682e4e46546f6b656e4f6666657220204e46546f6b656e4f66666572206f" + "626a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f77" + "2066696e6973682e20204e46546f6b656e4f66666572206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e4f6666657220" + "204f66666572206f626a65637420646f6573206e6f742065786973742c2061626f7274696e" + "6720657363726f772066696e6973682e20204f66666572206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e5061794368" + "616e6e656c20205061794368616e6e656c206f626a65637420646f6573206e6f7420657869" + "73742c2061626f7274696e6720657363726f772066696e6973682e20205061794368616e6e" + "656c206f626a656374206578697374732c2070726f63656564696e67207769746820657363" + "726f772066696e6973682e5369676e65724c69737420205369676e65724c697374206f626a" + "65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f772066" + "696e6973682e20205369676e65724c697374206f626a656374206578697374732c2070726f" + "63656564696e67207769746820657363726f772066696e6973682e5469636b657420205469" + "636b6574206f626a65637420646f6573206e6f742065786973742c2061626f7274696e6720" + "657363726f772066696e6973682e20205469636b6574206f626a656374206578697374732c" + "2070726f63656564696e67207769746820657363726f772066696e6973682e004d0970726f" + "64756365727302086c616e6775616765010452757374000c70726f6365737365642d627901" + "0572757374631d312e38352e31202834656231363132353020323032352d30332d31352900" + "490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b08" + "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" + "5"; + +extern std::string const codecovWasm = + "0061736d0100000001570b60057f7f7f7f7f017f60027f7f017f60047f7f7f7f017f60037f" + "7f7f017f60067f7f7f7f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f60037f7f7e01" + "7f60077f7f7f7f7f7f7f017f60047f7f7f7f006000017f0298082308686f73745f6c696209" + "74726163655f6e756d000708686f73745f6c6962057472616365000008686f73745f6c6962" + "0e6765745f6c65646765725f73716e000108686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000108686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000108686f73745f6c69620c6765745f74785f6669656c6400030868" + "6f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c696210636163" + "68655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63757272656e745f" + "6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765745f6c65646765" + "725f6f626a5f6669656c64000208686f73745f6c6962136765745f74785f6e65737465645f" + "6669656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f" + "626a5f6e65737465645f6669656c64000208686f73745f6c69621b6765745f6c6564676572" + "5f6f626a5f6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61" + "727261795f6c656e000508686f73745f6c6962206765745f63757272656e745f6c65646765" + "725f6f626a5f61727261795f6c656e000508686f73745f6c6962186765745f6c6564676572" + "5f6f626a5f61727261795f6c656e000108686f73745f6c6962176765745f74785f6e657374" + "65645f61727261795f6c656e000108686f73745f6c6962276765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f61727261795f6c656e000108686f73745f6c6962" + "1f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000308686f" + "73745f6c69620b7570646174655f64617461000108686f73745f6c696213636f6d70757465" + "5f7368613531325f68616c66000208686f73745f6c69620b6c696e655f6b65796c65740006" + "08686f73745f6c69621163726564656e7469616c5f6b65796c6574000608686f73745f6c69" + "62076765745f6e6674000408686f73745f6c69620c636865636b5f6b65796c657400000868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" + "65796c6574000208686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" + "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" + "725f6b65796c6574000008686f73745f6c69620d6f7261636c655f6b65796c657400000868" + "6f73745f6c69620e7061796368616e5f6b65796c6574000808686f73745f6c69620e736967" + "6e6572735f6b65796c6574000208686f73745f6c69620d7469636b65745f6b65796c657400" + "00030302090a05030100110619037f01418080c0000b7f00419c92c0000b7f0041a092c000" + "0b072e04066d656d6f727902000666696e69736800240a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020af41802390002402000200147044020004100480d01418b80" + "c000410b2000ad1000000b200220032000ac10001a0f0b418b80c000410b2000ac1000000b" + "b71802087f027e230041a0016b22002400419680c000412341004100410010011a20004100" + "360238200041386a2201410410024104418987c000410e1023200041003602382001410410" + "034104419787c00041161023200041d0006a22064200370300200041c8006a220342003703" + "00200041406b2202420037030020004200370338200141201004412041ad87c00041161023" + "20034100360200200242003703002000420037033841818020200141141005220441144604" + "400240200041066a20002d003a3a00002000200029003f370380012000200041c4006a2900" + "0037008501200041106a200029008501370000200020002f01383b01042000200028003b36" + "0007200020002903800137000b200642003703002003420037030020024200370300200042" + "00370338200041046a411420014120100622044120470d002000411a6a20002d003a3a0000" + "20004188016a200041c7006a290000220837030020004190016a200041cf006a2900002209" + "370300200041276a20083700002000412f6a2009370000200041376a200041d7006a2d0000" + "3a0000200020002f01383b01182000200028003b36001b2000200029003f37001f20004118" + "6a412041001007410141b980c0004110102320034100360200200242003703002000420037" + "033841818020200141141008411441c387c000411c10232003410036020020024200370300" + "20004200370338410141818020200141141009411441df87c0004114102302402001410020" + "016b41037122036a220220014d0d0020030440200321040340200141003a0000200141016a" + "2101200441016b22040d000b0b200341016b4107490d000340200141003a0000200141076a" + "41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a00002001" + "41036a41003a0000200141026a41003a0000200141016a41003a0000200141086a22012002" + "470d000b0b200241c40020036b2203417c716a220120024b04400340200241003602002002" + "41046a22022001490d000b0b024020012003410371220320016a22044f0d00200322020440" + "0340200141003a0000200141016a2101200241016b22020d000b0b200341016b4107490d00" + "0340200141003a0000200141076a41003a0000200141066a41003a0000200141056a41003a" + "0000200141046a41003a0000200141036a41003a0000200141026a41003a0000200141016a" + "41003a0000200141086a22012004470d000b0b200041818020360280014100210103402005" + "41c000490440200041386a20056a20004180016a20016a2d00003a00002000200028027841" + "016a2205360278200141016a22014104470d010b0b20004190016a22044100360200200041" + "88016a220642003703002000420037038001200041386a2201200520004180016a22024114" + "100a411441f387c00041131023200441003602002006420037030020004200370380012001" + "200028027820024114100b4114418688c00041231023200441003602002006420037030020" + "0042003703800141012001200028027820024114100c411441a988c000411b10234189803c" + "100d412041c980c000411010234189803c100e412041d980c0004120102341014189803c10" + "0f412041f980c000411810232001200028027810104120419181c000411710232001200028" + "02781011412041a881c000412710234101200120002802781012412041cf81c000411f1023" + "200041046a220341141013410041ee81c000410b102320004198016a220742003703002004" + "420037030020064200370300200042003703800120012000280278200241201014412041c4" + "88c00041131023417f41041002417141f981c0004116102320004100360280012002417f10" + "02417141d788c0004116102320004182016a41003a0000200041003b018001200241031002" + "417d41ed88c000411c102320004100360280012002418094ebdc0310024173418989c00041" + "1b10234102100d416f418f82c000411f1023417f20002802781010417141ae82c000411f10" + "232001417f1010417141cd82c000411f102320014181201010417441ec82c0004120102320" + "0041b894ebdc036a2205200028027810104173418c83c000411f1023200520002802784101" + "1007417341ab83c000411810232001200028027841011007417141c383c000411a10232007" + "42003703002004420037030020064200370300200042003703800120052000280278200241" + "201006417341a489c000411b10232007420037030020044200370300200642003703002000" + "42003703800120012000280278200241201006417141bf89c0004118102320074200370300" + "20044200370300200642003703002000420037038001200341142003411420052000280278" + "200241201015417341d789c000412110232007420037030020044200370300200642003703" + "002000420037038001200341142003411420012000280278200241201015417141f889c000" + "411e102320052000280278422a1000417341dd83c00041171023200041003b018001410220" + "0241021005416f41968ac000411b1023200041003b0180014102200241021008416f41b18a" + "c000412b1023200041003b01800141014102200241021009416f41dc8ac000412310234102" + "100d416f418f82c000411f10234102100e416f41f483c000412f102341014102100f416f41" + "a384c00041271023200041003b018001200141812020024102100a417441ff8ac000412110" + "23200041003b018001200141812020024102100b417441a08bc00041311023200041003b01" + "80014101200141812020024102100c417441d18bc0004129102320014181201010417441ca" + "84c0004125102320014181201011417441ef84c00041351023410120014181201012417441" + "a485c000412d102320014181201013417441d185c00041191023200041003b018001200141" + "8120200241021014417441fa8bc00041211023200041003b01800120034114200341142001" + "4181202002410210164174419b8cc000411f10232001200028027822042005200441001001" + "417341ea85c000410f10232001200028027841001007417141f985c0004123102320004100" + "3b0180012003411420012000280278200241021017417141ba8cc000411a1023200041003b" + "01800120012000280278200241021006417141d48cc00041231023200041003b0180012001" + "20002802784101200241021018417141f78cc00041211023200041003b0180012001200028" + "027822042003411420012004200241021016417141988dc00041271023200041003b018001" + "2003411420012000280278220420012004200241021016417141bf8dc00041271023200041" + "003b0180012001200028027820034114200241021019417141e68dc0004125102320004100" + "3b01800120034114200120002802782002410210194171418b8ec00041251023200041003b" + "018001200120002802782003411420024102101a417141b08ec000412c1023200041003b01" + "8001200341142001200028027820024102101a417141dc8ec000412c1023200041003b0180" + "012001200028027820024102101b417141888fc000411f1023200041003b01800120012000" + "280278410120024102101c417141a78fc00041221023200041003b01800120012000280278" + "20034114419c86c0004114200241021015417141c98fc00041211023200041003b01800120" + "03411420012000280278419c86c0004114200241021015417141ea8fc00041211023200041" + "003b01800120012000280278410120024102101d4171418b90c00041251023200041003b01" + "800120012000280278410120024102101e417141b090c00041211023200041003b01800120" + "012000280278410120024102101f417141d190c00041221023200041003b01800120012000" + "280278200341144101200241021020417141f390c00041241023200041003b018001200341" + "142001200028027841012002410210204171419791c00041241023200041003b0180012001" + "2000280278200241021021417141bb91c00041231023200041003b01800120012000280278" + "4101200241021022417141de91c00041221023200041003b0180012001200028027841b086" + "c00041202002410210174171418092c000411c10232005200028027841b086c00041204100" + "1001417341d086c0004119102320012000280278200141812041001001417441e986c00041" + "0e1023200141812042011000417441f786c00041121023200041a0016a240041010f0b0b41" + "8080c000410b417f20042004417f4e1bac1000000b0ba6120100418080c0000b9c12657272" + "6f725f636f64653d54455354204641494c45442424242424205354415254494e4720574153" + "4d20455845435554494f4e20242424242463616368655f6c65646765725f6f626a6765745f" + "74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6172" + "7261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f7478" + "5f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" + "626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e6573" + "7465645f61727261795f6c656e7570646174655f646174616765745f6c65646765725f7371" + "6e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669" + "656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f707472676574" + "5f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65" + "737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f" + "61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f707472" + "5f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e74726163655f6e" + "756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765725f6f62" + "6a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f" + "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65" + "737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" + "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c65" + "6e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c" + "69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f626a5f7772" + "6f6e675f73697a655f75696e74323536555344303030303030303030303030303030303030" + "303030303030303030303030303030303030303030303030303030303030316765745f6e66" + "745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e6774726163" + "655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f706172656e" + "745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f" + "6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765" + "745f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f6275" + "665f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e" + "676163636f756e745f6b65796c65745f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f746f6f5f6c6f" + "6e675f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272" + "656e63796765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375" + "7272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64" + "6765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765" + "745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f626967" + "5f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" + "5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f626967" + "5f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c696365" + "6765745f6e66745f77726f6e675f73697a655f75696e743235366163636f756e745f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072656175" + "74685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369" + "745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f" + "775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f6163" + "636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e746964004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" + "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 97b2236d1b8..b82b9aadcf2 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -58,3 +58,5 @@ extern std::string const hfPerfTest; extern std::string const opcCallPerfTest; extern std::string const keyletHostFunctions; + +extern std::string const codecovWasm; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index 23b89af3d32..a3a6f858c93 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -37,7 +37,7 @@ setData( int32_t srcSize) { if (!srcSize) - return 0; + return 0; // LCOV_EXCL_LINE if (dst < 0 || dstSize < 0 || !src || srcSize < 0) return static_cast>( @@ -45,9 +45,11 @@ setData( auto memory = runtime ? runtime->getMem() : wmem(); + // LCOV_EXCL_START if (!memory.s) return static_cast>( HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP if (dst + dstSize > memory.s) return static_cast>( HostFunctionError::POINTER_OUT_OF_BOUNDS); @@ -108,8 +110,10 @@ getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); auto memory = runtime ? runtime->getMem() : wmem(); + // LCOV_EXCL_START if (!memory.s) return Unexpected(HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP if (ptr + size > memory.s) return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); @@ -141,8 +145,15 @@ Expected getDataAccountID(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const slice = getDataSlice(runtime, params, i); - if (!slice || (slice->size() != AccountID::bytes)) + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != AccountID::bytes) + { return Unexpected(HostFunctionError::INVALID_PARAMS); + } return AccountID::fromVoid(slice->data()); } @@ -152,8 +163,15 @@ static Expected getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const slice = getDataSlice(runtime, params, i); - if (!slice || (slice->size() != Currency::bytes)) + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != Currency::bytes) + { return Unexpected(HostFunctionError::INVALID_PARAMS); + } return Currency::fromVoid(slice->data()); } @@ -306,7 +324,7 @@ cacheLedgerObj_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } return returnResult( @@ -365,7 +383,7 @@ getLedgerObjField_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const fname = getDataSField(runtime, params, index); @@ -434,7 +452,7 @@ getLedgerObjNestedField_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const bytes = getDataSlice(runtime, params, index); @@ -508,7 +526,7 @@ getLedgerObjArrayLen_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const fname = getDataSField(runtime, params, index); @@ -581,7 +599,7 @@ getLedgerObjNestedArrayLen_wrap( auto const cache = getDataInt32(runtime, params, index); if (!cache) { - return hfResult(results, cache.error()); + return hfResult(results, cache.error()); // LCOV_EXCL_LINE } auto const bytes = getDataSlice(runtime, params, index); @@ -675,7 +693,7 @@ checkKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -814,7 +832,7 @@ escrowKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -876,7 +894,7 @@ nftOfferKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -906,7 +924,7 @@ offerKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -936,7 +954,7 @@ oracleKeylet_wrap( auto const documentId = getDataInt32(runtime, params, index); if (!documentId) { - return hfResult(results, documentId.error()); + return hfResult(results, documentId.error()); // LCOV_EXCL_LINE } return returnResult( runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); @@ -967,7 +985,7 @@ paychanKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1017,7 +1035,7 @@ ticketKeylet_wrap( auto const seq = getDataInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); + return hfResult(results, seq.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1079,7 +1097,7 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const asHex = getDataInt32(runtime, params, index); if (!asHex) { - return hfResult(results, asHex.error()); + return hfResult(results, asHex.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1106,7 +1124,7 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const number = getDataInt64(runtime, params, index); if (!number) { - return hfResult(results, number.error()); + return hfResult(results, number.error()); // LCOV_EXCL_LINE } return returnResult( @@ -1131,6 +1149,8 @@ class MockInstanceWrapper }; namespace test { + +// LCOV_EXCL_START bool testGetDataIncrement() { @@ -1257,6 +1277,7 @@ testGetDataIncrement() return true; } +// LCOV_EXCL_STOP } // namespace test } // namespace ripple From 3b849ff49753dc791cc5b14268a46772d095d84d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 29 Jul 2025 17:54:48 -0400 Subject: [PATCH 041/212] Add unit tests for host functions (#5578) --- src/test/app/WasmHostFuncImpl_test.cpp | 1693 +++++++++++++++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 153 +- src/xrpld/app/misc/WasmHostFuncImpl.h | 18 + 3 files changed, 1793 insertions(+), 71 deletions(-) create mode 100644 src/test/app/WasmHostFuncImpl_test.cpp diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp new file mode 100644 index 00000000000..5a4b2441748 --- /dev/null +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -0,0 +1,1693 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { +namespace test { + +static Bytes +toBytes(std::uint16_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(std::uint32_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(Asset const& asset) +{ + if (asset.holds()) + { + Serializer s; + auto const& issue = asset.get(); + s.addBitString(issue.currency); + if (!isXRP(issue.currency)) + s.addBitString(issue.account); + auto const data = s.getData(); + return data; + } + + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; +} + +static Bytes +toBytes(STAmount const& amount) +{ + Serializer msg; + amount.add(msg); + auto const data = msg.getData(); + + return data; +} + +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +{ + ApplyContext ac{ + env.app(), + ov, + tx, + tesSUCCESS, + env.current()->fees().base, + tapNONE, + env.journal}; + return ac; +} + +struct WasmHostFuncImpl_test : public beast::unit_test::suite +{ + void + testGetLedgerSqn() + { + testcase("getLedgerSqn"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerSqn(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().seq); + } + + void + testGetParentLedgerTime() + { + testcase("getParentLedgerTime"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + env.current()->parentCloseTime().time_since_epoch().count()); + } + + void + testGetParentLedgerHash() + { + testcase("getParentLedgerHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getParentLedgerHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().parentHash); + } + void + testCacheLedgerObj() + { + testcase("cacheLedgerObj"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = keylet::escrow(env.master, 2); + auto const accountKeylet = keylet::account(env.master); + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, -1).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 257).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(dummyEscrow.key, 0).error() == + HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).value() == 1); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, i); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, 0); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + } + + void + testGetTxField() + { + testcase("getTxField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setAccountID(sfOwner, env.master.id()); + obj.setFieldU32(sfOfferSequence, env.seq(env.master)); + obj.setFieldU32(sfComputationAllowance, 1000); + obj.setFieldArray(sfMemos, STArray{}); + }); + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const account = hfs.getTxField(sfAccount); + BEAST_EXPECT( + account.has_value() && + std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + auto const owner = hfs.getTxField(sfOwner); + BEAST_EXPECT( + owner.has_value() && + std::equal( + owner.value().begin(), + owner.value().end(), + env.master.id().data())); + + auto const txType = hfs.getTxField(sfTransactionType); + BEAST_EXPECT( + txType.has_value() && + std::equal( + txType.value().begin(), + txType.value().end(), + toBytes(ttESCROW_FINISH).begin())); + + auto const offerSeq = hfs.getTxField(sfOfferSequence); + BEAST_EXPECT( + offerSeq.has_value() && + std::equal( + offerSeq.value().begin(), + offerSeq.value().end(), + toBytes(env.seq(env.master)).begin())); + + auto const compAllowance = hfs.getTxField(sfComputationAllowance); + std::uint32_t const expectedAllowance = 1000; + BEAST_EXPECT( + compAllowance.has_value() && + std::equal( + compAllowance.value().begin(), + compAllowance.value().end(), + toBytes(expectedAllowance).begin())); + + auto const notPresent = hfs.getTxField(sfDestination); + if (BEAST_EXPECT(!notPresent.has_value())) + BEAST_EXPECT( + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const memos = hfs.getTxField(sfMemos); + if (BEAST_EXPECT(!memos.has_value())) + BEAST_EXPECT( + memos.error() == HostFunctionError::NOT_LEAF_FIELD); + + auto const nonField = hfs.getTxField(sfInvalid); + if (BEAST_EXPECT(!nonField.has_value())) + BEAST_EXPECT( + nonField.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const nonField2 = hfs.getTxField(sfGeneric); + if (BEAST_EXPECT(!nonField2.has_value())) + BEAST_EXPECT( + nonField2.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + { + auto const iouAsset = env.master["USD"]; + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, xrpIssue()}); + obj.setFieldIssue( + sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + std::vector expectedAsset(20, 0); + BEAST_EXPECT( + asset.has_value() && + std::equal( + asset.value().begin(), + asset.value().end(), + expectedAsset.begin())); + + auto const asset2 = hfs.getTxField(sfAsset2); + BEAST_EXPECT( + asset2.has_value() && + std::equal( + asset2.value().begin(), + asset2.value().end(), + toBytes(Asset(iouAsset)).begin())); + } + + { + auto const iouAsset = env.master["GBP"]; + auto const mptId = makeMptID(1, env.master); + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, iouAsset.issue()}); + obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, MPTIssue{mptId}}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + if (BEAST_EXPECT(asset.has_value())) + { + BEAST_EXPECT(std::equal( + asset.value().begin(), + asset.value().end(), + toBytes(Asset(iouAsset)).begin())); + } + + auto const asset2 = hfs.getTxField(sfAsset2); + if (BEAST_EXPECT(asset2.has_value())) + { + BEAST_EXPECT(std::equal( + asset2.value().begin(), + asset2.value().end(), + toBytes(Asset(mptId)).begin())); + } + } + } + + void + testGetCurrentLedgerObjField() + { + testcase("getCurrentLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the escrow ledger object + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + BEAST_EXPECT(env.le(escrowKeylet)); + + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should return the Account field from the escrow ledger object + auto const account = hfs.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + // Should return the Amount field from the escrow ledger object + auto const amountField = hfs.getCurrentLedgerObjField(sfAmount); + if (BEAST_EXPECT(amountField.has_value())) + { + BEAST_EXPECT(std::equal( + amountField.value().begin(), + amountField.value().end(), + toBytes(XRP(100)).begin())); + } + + // Should return nullopt for a field not present + auto const notPresent = hfs.getCurrentLedgerObjField(sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl hfs2(ac, dummyEscrow); + auto const account = hfs2.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECT(!account.has_value())) + { + BEAST_EXPECT( + account.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + } + + void + testGetLedgerObjField() + { + testcase("getLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const accountKeylet = keylet::account(env.master.id()); + auto const escrowKeylet = + keylet::escrow(env.master.id(), env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Cache the escrow ledger object in slot 1 + auto cacheResult = hfs.cacheLedgerObj(accountKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Should return the Account field from the cached ledger object + auto const account = hfs.getLedgerObjField(1, sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + + // Should return the Balance field from the cached ledger object + auto const balanceField = hfs.getLedgerObjField(1, sfBalance); + if (BEAST_EXPECT(balanceField.has_value())) + { + BEAST_EXPECT(std::equal( + balanceField.value().begin(), + balanceField.value().end(), + toBytes(env.balance(env.master)).begin())); + } + + // Should return error for slot out of range + auto const outOfRange = hfs.getLedgerObjField(0, sfAccount); + BEAST_EXPECT( + !outOfRange.has_value() && + outOfRange.error() == HostFunctionError::SLOT_OUT_RANGE); + + auto const tooHigh = hfs.getLedgerObjField(257, sfAccount); + BEAST_EXPECT( + !tooHigh.has_value() && + tooHigh.error() == HostFunctionError::SLOT_OUT_RANGE); + + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjField(2, sfAccount); + BEAST_EXPECT( + !emptySlot.has_value() && + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + + // Should return error for field not present + auto const notPresent = hfs.getLedgerObjField(1, sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetTxNestedField() + { + testcase("getTxNestedField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Create a transaction with a nested array field + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + // Locator for sfMemos[0].sfMemo.sfMemoData + // Locator is a sequence of int32_t codes: + // [sfMemos.fieldCode, 0, sfMemoData.fieldCode] + std::vector locatorVec = { + sfMemos.fieldCode, 0, sfMemoData.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + std::string memoData( + result.value().begin(), result.value().end()); + BEAST_EXPECT(memoData == "hello"); + } + } + + { + // can use the nested locator for base fields too + std::vector locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const account = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + { + BEAST_EXPECT(std::equal( + account.value().begin(), + account.value().end(), + env.master.id().data())); + } + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent index + expectError( + {sfMemos.fieldCode, + 1, // index 1 does not exist + sfMemoData.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Locator for non-existent nested field + expectError( + {sfMemos.fieldCode, + 0, + sfURI.fieldCode}, // sfURI does not exist in the memo + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent base sfield + expectError( + {field_code(20000, 20000), // nonexistent SField code + 0, + sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Locator for non-existent nested sfield + expectError( + {sfMemos.fieldCode, // nonexistent SField code + 0, + field_code(20000, 20000)}, + HostFunctionError::INVALID_FIELD); + + // Locator for STArray + expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Locator for nesting into non-array/object field + expectError( + {sfAccount.fieldCode, // sfAccount is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(locatorVec.data()), 3); + auto const malformedResult = hfs.getTxNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == + HostFunctionError::LOCATOR_MALFORMED); + } + } + + void + testGetCurrentLedgerObjNestedField() + { + testcase("getCurrentLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the signer ledger object + auto const signerKeylet = keylet::signers(env.master.id()); + BEAST_EXPECT(env.le(signerKeylet)); + + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Locator for base field + std::vector baseLocator = {sfSignerQuorum.fieldCode}; + Slice baseLocatorSlice( + reinterpret_cast(baseLocator.data()), + baseLocator.size() * sizeof(int32_t)); + auto const signerQuorum = + hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); + if (BEAST_EXPECTS( + signerQuorum.has_value(), + std::to_string(static_cast(signerQuorum.error())))) + { + BEAST_EXPECT(std::equal( + signerQuorum.value().begin(), + signerQuorum.value().end(), + toBytes(static_cast(2)).begin())); + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + // Locator for nesting into non-array/object field + expectError( + {sfSignerQuorum + .fieldCode, // sfSignerQuorum is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + Slice emptyLocator(nullptr, 0); + auto const emptyResult = + hfs.getCurrentLedgerObjNestedField(emptyLocator); + BEAST_EXPECT( + !emptyResult.has_value() && + emptyResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + std::vector malformedLocatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(malformedLocatorVec.data()), 3); + auto const malformedResult = + hfs.getCurrentLedgerObjNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector const locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedField() + { + testcase("getLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Cache the SignerList ledger object in slot 1 + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries[0].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + BEAST_EXPECT(std::equal( + result.value().begin(), + result.value().end(), + alice.id().data())); + } + } + + // Locator for sfSignerEntries[1].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 1, sfAccount.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result2 = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result2.has_value(), + std::to_string(static_cast(result2.error())))) + { + BEAST_EXPECT(std::equal( + result2.value().begin(), + result2.value().end(), + becky.id().data())); + } + } + + // Locator for sfSignerEntries[0].sfSignerWeight + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfSignerWeight.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const weightResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + weightResult.has_value(), + std::to_string(static_cast(weightResult.error())))) + { + // Should be 1 + auto const expected = toBytes(static_cast(1)); + BEAST_EXPECT(std::equal( + weightResult.value().begin(), + weightResult.value().end(), + expected.begin())); + } + } + + // Locator for base field sfSignerQuorum + { + std::vector const locatorVec = {sfSignerQuorum.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const quorumResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + quorumResult.has_value(), + std::to_string(static_cast(quorumResult.error())))) + { + auto const expected = toBytes(static_cast(2)); + BEAST_EXPECT(std::equal( + quorumResult.value().begin(), + quorumResult.value().end(), + expected.begin())); + } + } + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedField(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: base field not found + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: index out of bounds + expectError( + {sfSignerEntries.fieldCode, + 2, // index 2 does not exist + sfAccount.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Error: nested field not found + expectError( + { + sfSignerEntries.fieldCode, + 0, + sfDestination.fieldCode // sfDestination does not exist + }, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: invalid field code + expectError( + {field_code(99999, 99999), 0, sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Error: invalid nested field code + expectError( + {sfSignerEntries.fieldCode, 0, field_code(99999, 99999)}, + HostFunctionError::INVALID_FIELD); + + // Error: slot out of range + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Error: empty slot + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::EMPTY_SLOT, 2); + + // Error: locator for STArray (not leaf field) + expectError( + {sfSignerEntries.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Error: nesting into non-array/object field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + std::vector const locatorVec = {sfSignerEntries.fieldCode}; + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), 3); + auto const malformed = hfs.getLedgerObjNestedField(1, locator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + } + + void + testGetTxArrayLen() + { + testcase("getTxArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Transaction with an array field + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + } + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("world", 5)); + memos.push_back(memoObj); + } + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should return 1 for sfMemos + auto const memosLen = hfs.getTxArrayLen(sfMemos); + if (BEAST_EXPECT(memosLen.has_value())) + BEAST_EXPECT(memosLen.value() == 2); + + // Should return error for non-array field + auto const notArray = hfs.getTxArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + // Should return error for missing array field + auto const missingArray = hfs.getTxArrayLen(sfSigners); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjArrayLen() + { + testcase("getCurrentLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + auto const entriesLen = + hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); + if (BEAST_EXPECT(entriesLen.has_value())) + BEAST_EXPECT(entriesLen.value() == 2); + + auto const arrLen = hfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT(arrLen.error() == HostFunctionError::FIELD_NOT_FOUND); + + // Should return NO_ARRAY for non-array field + auto const notArray = hfs.getCurrentLedgerObjArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + auto const len = dummyHfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!len.has_value())) + BEAST_EXPECT( + len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + + void + testGetLedgerObjArrayLen() + { + testcase("getLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + { + auto const arrLen = hfs.getLedgerObjArrayLen(1, sfSignerEntries); + if (BEAST_EXPECT(arrLen.has_value())) + // Should return 2 for sfSignerEntries + BEAST_EXPECT(arrLen.value() == 2); + } + { + auto const arrLen = hfs.getLedgerObjArrayLen(0, sfSignerEntries); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT( + arrLen.error() == HostFunctionError::SLOT_OUT_RANGE); + } + + { + // Should return error for non-array field + auto const notArray = hfs.getLedgerObjArrayLen(1, sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + } + + { + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjArrayLen(2, sfSignerEntries); + if (BEAST_EXPECT(!emptySlot.has_value())) + BEAST_EXPECT( + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + } + + { + // Should return error for missing array field + auto const missingArray = hfs.getLedgerObjArrayLen(1, sfMemos); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetTxNestedArrayLen() + { + testcase("getTxNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfMemos + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getTxNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 1); + } + + // Error: non-array field + expectError({sfAccount.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjNestedArrayLen() + { + testcase("getCurrentLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfSignerEntries + { + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getCurrentLedgerObjNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 2); + } + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector locatorVec = {sfAccount.fieldCode}; + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedArrayLen() + { + testcase("getLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getLedgerObjNestedArrayLen(1, locator); + if (BEAST_EXPECT(arrLen.has_value())) + BEAST_EXPECT(arrLen.value() == 2); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedArrayLen(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + // Slot out of range + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Empty slot + expectError(locatorVec, HostFunctionError::EMPTY_SLOT, 2); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + Slice malformedLocator( + reinterpret_cast(locator.data()), 3); + auto const malformed = + hfs.getLedgerObjNestedArrayLen(1, malformedLocator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator for non-STArray field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + } + + void + testUpdateData() + { + testcase("updateData"); + using namespace test::jtx; + + Env env{*this}; + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + std::chrono::seconds(1))); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should succeed for small data + std::vector data(10, 0x42); + auto result = hfs.updateData(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value() && result.value() == 0); + + // Should fail for too large data + std::vector bigData( + 1024 * 1024 + 1, 0x42); // > maxWasmDataLength + auto tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); + if (BEAST_EXPECT(!tooBig.has_value())) + BEAST_EXPECT( + tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); + + // Should fail if ledger object not found (use a bogus keylet) + auto bogusKeylet = keylet::escrow(env.master, 999999); + WasmHostFunctionsImpl hfs2(ac, bogusKeylet); + auto notFound = hfs2.updateData(Slice(data.data(), data.size())); + if (BEAST_EXPECT(!notFound.has_value())) + BEAST_EXPECT( + notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + void + testComputeSha512HalfHash() + { + testcase("computeSha512HalfHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string data = "hello world"; + auto result = + hfs.computeSha512HalfHash(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value()); + + // Should match direct call to sha512Half + auto expected = sha512Half(Slice(data.data(), data.size())); + BEAST_EXPECT(result.value() == expected); + } + + void + testKeyletFunctions() + { + testcase("keylet functions"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto compareKeylet = [](std::vector const& bytes, + Keylet const& kl) { + return bytes.size() == kl.key.size() && + std::equal(bytes.begin(), bytes.end(), kl.key.begin()); + }; +// Lambda to compare a Bytes (std::vector) to a keylet +#define COMPARE_KEYLET(hfsFunc, keyletFunc, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + auto expected = keyletFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(actual.has_value())) \ + { \ + BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ + } \ + } +#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(static_cast(actual.error()))); \ + } \ + } + + // accountKeylet + COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); + COMPARE_KEYLET_FAIL( + accountKeylet, + keylet::account, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + checkKeylet, + keylet::check, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + std::string const credType = "test"; + COMPARE_KEYLET( + credentialKeylet, + keylet::credential, + env.master.id(), + env.master.id(), + Slice(credType.data(), credType.size())); + + Account const alice("alice"); + constexpr std::string_view longCredType = + "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]" + "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p"; + static_assert(longCredType.size() > maxCredentialTypeLength); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + Slice(longCredType.data(), longCredType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + alice.id(), + Slice(credType.data(), credType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + keylet::credential, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + Slice(credType.data(), credType.size())); + + COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); + COMPARE_KEYLET_FAIL( + didKeylet, + keylet::did, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET( + delegateKeylet, keylet::delegate, env.master.id(), alice.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + keylet::delegate, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + COMPARE_KEYLET( + depositPreauthKeylet, + keylet::depositPreauth, + env.master.id(), + alice.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + keylet::depositPreauth, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + // escrowKeylet + COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + escrowKeylet, + keylet::escrow, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + + // lineKeylet + Currency usd = to_currency("USD"); + COMPARE_KEYLET( + lineKeylet, keylet::line, env.master.id(), alice.id(), usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + keylet::line, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + to_currency("")); + + COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + nftOfferKeylet, + keylet::nftoffer, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + offerKeylet, + keylet::offer, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + oracleKeylet, + keylet::oracle, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + COMPARE_KEYLET( + paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + keylet::payChan, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + 1); + + COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); + COMPARE_KEYLET_FAIL( + signersKeylet, + keylet::signers, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount()); + COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + ticketKeylet, + keylet::ticket, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + } + + void + testGetNFT() + { + testcase("getNFT"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + + // Mint NFT for alice + uint256 const nftId = token::getNextID(env, alice, 0u, 0u); + std::string const uri = "https://example.com/nft"; + env(token::mint(alice), token::uri(uri)); + env.close(); + uint256 const nftId2 = token::getNextID(env, alice, 0u, 0u); + env(token::mint(alice)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = keylet::escrow(alice, env.seq(alice)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT + { + auto nftResult = hfs.getNFT(alice.id(), nftId); + if (BEAST_EXPECT(nftResult.has_value())) + BEAST_EXPECT(std::equal( + nftResult.value().begin(), + nftResult.value().end(), + uri.data())); + } + + // Should fail for invalid account + { + auto nftResult = hfs.getNFT(xrpAccount(), nftId); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::INVALID_ACCOUNT); + } + + // Should fail for invalid nftId + { + auto nftResult = hfs.getNFT(alice.id(), uint256()); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for invalid nftId + { + auto const badId = token::getNextID(env, alice, 0u, 1u); + auto nftResult = hfs.getNFT(alice.id(), badId); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == + HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + { + auto nftResult = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!nftResult.has_value())) + BEAST_EXPECT( + nftResult.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testTrace() + { + testcase("trace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto result = hfs.trace(msg, slice, false); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + data.size()); + + auto resultHex = hfs.trace(msg, slice, true); + BEAST_EXPECT(resultHex.has_value()); + BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + } + + void + testTraceNum() + { + testcase("traceNum"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace number"; + int64_t num = 123456789; + auto result = hfs.traceNum(msg, num); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + } + + void + run() override + { + testGetLedgerSqn(); + testGetParentLedgerTime(); + testGetParentLedgerHash(); + testCacheLedgerObj(); + testGetTxField(); + testGetCurrentLedgerObjField(); + testGetLedgerObjField(); + testGetTxNestedField(); + testGetCurrentLedgerObjNestedField(); + testGetLedgerObjNestedField(); + testGetTxArrayLen(); + testGetCurrentLedgerObjArrayLen(); + testGetLedgerObjArrayLen(); + testGetTxNestedArrayLen(); + testGetCurrentLedgerObjNestedArrayLen(); + testGetLedgerObjNestedArrayLen(); + testUpdateData(); + testComputeSha512HalfHash(); + testKeyletFunctions(); + testGetNFT(); + testTrace(); + testTraceNum(); + } +}; + +BEAST_DEFINE_TESTSUITE(WasmHostFuncImpl, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 152c946c7cc..7dce3b865aa 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -48,6 +48,17 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().info().parentHash; } +Expected +WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::EMPTY_SLOT); + return cacheIdx; +} + Expected WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { @@ -55,14 +66,16 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) if (cacheIdx < 0 || cacheIdx > MAX_CACHE) return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cacheIdx) + if (cacheIdx == 0) { for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) if (!cache[cacheIdx]) break; } else - --cacheIdx; + { + cacheIdx--; // convert to 0-based index + } if (cacheIdx >= MAX_CACHE) return Unexpected(HostFunctionError::SLOTS_FULL); @@ -70,7 +83,7 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) cache[cacheIdx] = ctx.view().read(keylet); if (!cache[cacheIdx]) return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return cacheIdx + 1; + return cacheIdx + 1; // return 1-based index } static Expected @@ -83,10 +96,12 @@ getAnyFieldData(STBase const* obj) auto const stype = obj->getSType(); switch (stype) { + // LCOV_EXCL_START case STI_UNKNOWN: case STI_NOTPRESENT: return Unexpected(HostFunctionError::FIELD_NOT_FOUND); break; + // LCOV_EXCL_STOP case STI_OBJECT: case STI_ARRAY: return Unexpected(HostFunctionError::NOT_LEAF_FIELD); @@ -104,7 +119,7 @@ getAnyFieldData(STBase const* obj) auto const* issue(static_cast(obj)); Asset const& asset(issue->value()); // XRP and IOU will be processed by serializer - if (!asset.holds()) + if (asset.holds()) { // MPT auto const& mptIssue = asset.get(); @@ -119,12 +134,13 @@ getAnyFieldData(STBase const* obj) return Bytes{data.begin(), data.end()}; } break; - case STI_UINT256: { - auto const* num(static_cast const*>(obj)); - auto const& data = num->value(); - return Bytes{data.begin(), data.end()}; + case STI_UINT16: { + auto const& num(static_cast const*>(obj)); + std::uint16_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; } - break; case STI_UINT32: { auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); @@ -133,8 +149,14 @@ getAnyFieldData(STBase const* obj) return Bytes{b, e}; } break; + case STI_UINT256: { + auto const* num(static_cast const*>(obj)); + auto const& data = num->value(); + return Bytes{data.begin(), data.end()}; + } + break; default: - break; + break; // default to serializer } Serializer msg; @@ -153,21 +175,19 @@ WasmHostFunctionsImpl::getTxField(SField const& fname) Expected WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return getAnyFieldData(sle->peekAtPField(fname)); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + return getAnyFieldData(sle.value()->peekAtPField(fname)); } Expected WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - return getAnyFieldData(cache[cacheIdx]->peekAtPField(fname)); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + return getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); } static inline bool @@ -178,20 +198,20 @@ noField(STBase const* field) } static Expected -locateField(STObject const& obj, Slice const& loc) +locateField(STObject const& obj, Slice const& locator) { - if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - int32_t const* l = reinterpret_cast(loc.data()); - int32_t const sz = loc.size() / 4; + int32_t const* locPtr = reinterpret_cast(locator.data()); + int32_t const locSize = locator.size() / 4; STBase const* field = nullptr; - auto const& m = SField::getKnownCodeToField(); + auto const& knownSFields = SField::getKnownCodeToField(); { - int32_t const c = l[0]; - auto const it = m.find(c); - if (it == m.end()) + int32_t const sfieldCode = locPtr[0]; + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); @@ -200,23 +220,23 @@ locateField(STObject const& obj, Slice const& loc) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } - for (int i = 1; i < sz; ++i) + for (int i = 1; i < locSize; ++i) { - int32_t const c = l[i]; + int32_t const sfieldCode = locPtr[i]; if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); - if (c >= arr->size()) + if (sfieldCode >= arr->size()) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); - field = &(arr->operator[](c)); + field = &(arr->operator[](sfieldCode)); } else if (STI_OBJECT == field->getSType()) { auto const* o = static_cast(field); - auto const it = m.find(c); - if (it == m.end()) + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) return Unexpected(HostFunctionError::INVALID_FIELD); auto const& fname(*it->second); @@ -247,11 +267,11 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); - auto const r = locateField(*sle, locator); + auto const r = locateField(*sle.value(), locator); if (!r) return Unexpected(r.error()); @@ -263,14 +283,11 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( int32_t cacheIdx, Slice const& locator) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(*cache[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); @@ -288,7 +305,7 @@ WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE int32_t const sz = static_cast(field)->size(); return sz; @@ -300,16 +317,16 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); - auto const* field = sle->peekAtPField(fname); + auto const* field = sle.value()->peekAtPField(fname); if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE int32_t const sz = static_cast(field)->size(); return sz; @@ -323,18 +340,17 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - auto const* field = cache[cacheIdx]->peekAtPField(fname); + auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); return sz; @@ -358,10 +374,10 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) Expected WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) { - auto const sle = ctx.view().read(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - auto const r = locateField(*sle, locator); + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + auto const r = locateField(*sle.value(), locator); if (!r) return Unexpected(r.error()); @@ -378,14 +394,11 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( int32_t cacheIdx, Slice const& locator) { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(*cache[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); @@ -557,8 +570,6 @@ WasmHostFunctionsImpl::paychanKeylet( return Unexpected(HostFunctionError::INVALID_ACCOUNT); if (account == destination) return Unexpected(HostFunctionError::INVALID_PARAMS); - if (seq == 0) - return Unexpected(HostFunctionError::INVALID_PARAMS); auto const keylet = keylet::payChan(account, destination, seq); return Bytes{keylet.key.begin(), keylet.key.end()}; } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a22097ed6be..1fdfbbb20da 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -27,12 +27,30 @@ class WasmHostFunctionsImpl : public HostFunctions { ApplyContext& ctx; Keylet leKey; + std::shared_ptr currentLedgerObj = nullptr; + bool isLedgerObjCached = false; static int constexpr MAX_CACHE = 256; std::array, MAX_CACHE> cache; void const* rt_ = nullptr; + Expected, HostFunctionError> + getCurrentLedgerObj() + { + if (!isLedgerObjCached) + { + isLedgerObjCached = true; + currentLedgerObj = ctx.view().read(leKey); + } + if (currentLedgerObj) + return currentLedgerObj; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + Expected + normalizeCacheIndex(int32_t cacheIdx); + public: WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) : ctx(ctx), leKey(leKey) From 3108ca05499d5b8483cdb08f4ccc43278c65ad49 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 30 Jul 2025 10:38:03 -0400 Subject: [PATCH 042/212] Float point HF (#5611) - added support for 8-byte float point --- include/xrpl/basics/Number.h | 4 + src/libxrpl/basics/Number.cpp | 42 ++ src/test/app/TestHostFunctions.h | 84 ++++ src/test/app/Wasm_test.cpp | 26 + src/test/app/wasm_fixtures/fixtures.cpp | 148 ++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/misc/WasmHostFunc.h | 111 +++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 540 +++++++++++++++++++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 36 ++ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 339 ++++++++++++- src/xrpld/app/misc/WasmHostFuncWrapper.h | 109 +++++ src/xrpld/app/misc/WasmVM.cpp | 13 + 12 files changed, 1442 insertions(+), 12 deletions(-) diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index 9ee05bfb450..eb28721ec30 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -342,6 +342,10 @@ abs(Number x) noexcept Number power(Number const& f, unsigned n); +// logarithm with base 10 +Number +lg(Number const& value); + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the root of the polynomial g(x) = x^d - f diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index f43288b57b1..50583cc2909 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -623,6 +623,48 @@ power(Number const& f, unsigned n) return r; } +// Continued fraction approximation of ln(x) +static Number +ln(Number const& x, unsigned iterations = 50) +{ + if (x <= 0) + throw std::runtime_error("Not positive value"); + + Number const z = (x - 1) / (x + 1); + Number const zz = z * z; + Number denom = Number(1, -10); + + // Construct the fraction from the bottom up + for (int i = iterations; i > 0; --i) + { + Number k(2 * i - 1); + denom = k - (i * i * zz / denom); + } + + auto const r = 2 * z / denom; + return r; +} + +Number +lg(Number const& x) +{ + static Number const ln10 = ln(Number(10)); + + if (x <= Number(10)) + { + auto const r = ln(x) / ln10; + return r; + } + + // ln(x) = ln(normX * 10^norm) = ln(normX) + norm * ln(10) + int diffExp = 15 + x.exponent(); + Number const normalX = x / Number(1, diffExp); // (1 <= normalX < 10) + auto const lnX = ln(normalX) + diffExp * ln10; + + auto const r = lnX / ln10; + return r; +} + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the non-negative root of the polynomial g(x) = x^d - f diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 45de5d7b936..0752d6f6f4c 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -26,6 +26,7 @@ #include namespace ripple { + namespace test { struct TestLedgerDataProvider : public HostFunctions @@ -378,6 +379,89 @@ struct TestHostFunctions : public HostFunctions #endif return msg.size() + sizeof(data); } + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT: " << msg << " " << s; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + s.size(); + } + + Expected + floatFromInt(int64_t x, int32_t mode) override + { + return floatFromIntImpl(x, mode); + } + + Expected + floatFromUint(uint64_t x, int32_t mode) override + { + return floatFromUintImpl(x, mode); + } + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override + { + return floatSetImpl(mantissa, exponent, mode); + } + + Expected + floatCompare(Slice const& x, Slice const& y) override + { + return floatCompareImpl(x, y); + } + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override + { + return floatAddImpl(x, y, mode); + } + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override + { + return floatSubtractImpl(x, y, mode); + } + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override + { + return floatMultiplyImpl(x, y, mode); + } + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override + { + return floatDivideImpl(x, y, mode); + } + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override + { + return floatRootImpl(x, n, mode); + } + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override + { + return floatPowerImpl(x, n, mode); + } + + Expected + floatLog(Slice const& x, int32_t mode) override + { + return floatLogImpl(x, mode); + } }; struct TestHostFunctionsSink : public TestHostFunctions diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 5eee6014e5a..98e06a86361 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -509,6 +509,31 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testFloat() + { + testcase("float point"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = floatHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result && (re->cost == 91'412)); + } + env.close(); + } + } + void perfTest() { @@ -656,6 +681,7 @@ struct Wasm_test : public beast::unit_test::suite testHFCost(); testEscrowWasmDN(); + testFloat(); testCodecovWasm(); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index bddb076df9c..d01835988ac 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12222,3 +12222,151 @@ extern std::string const codecovWasm = "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" "616c7565"; + +extern std::string const floatHex = + "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" + "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" + "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" + "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" + "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" + "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" + "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" + "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" + "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" + "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" + "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" + "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" + "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" + "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" + "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" + "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" + "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" + "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" + "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" + "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" + "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" + "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" + "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" + "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" + "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" + "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" + "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" + "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" + "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" + "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" + "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" + "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" + "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" + "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" + "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" + "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" + "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" + "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" + "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" + "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" + "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" + "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" + "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" + "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" + "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" + "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" + "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" + "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" + "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" + "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" + "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" + "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" + "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" + "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" + "41081083808080001a200042003703184200200041186a410841001081808080001a200041" + "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" + "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" + "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" + "084209200041086a410841001081808080001a20004200370310200041086a410841022000" + "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" + "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" + "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" + "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" + "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" + "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" + "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" + "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" + "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" + "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" + "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" + "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" + "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" + "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" + "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" + "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" + "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" + "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" + "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" + "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" + "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" + "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" + "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" + "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" + "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" + "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" + "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" + "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" + "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" + "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" + "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" + "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" + "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" + "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" + "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" + "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" + "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" + "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" + "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" + "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" + "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" + "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" + "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" + "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" + "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" + "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" + "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" + "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" + "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" + "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" + "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" + "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" + "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" + "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" + "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" + "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" + "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" + "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" + "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" + "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" + "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" + "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" + "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" + "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" + "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" + "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" + "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" + "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" + "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" + "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" + "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" + "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" + "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" + "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" + "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" + "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" + "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" + "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" + "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" + "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" + "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" + "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" + "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" + "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" + "2d74797065732b087369676e2d657874"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index b82b9aadcf2..3ffb41caf9a 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -60,3 +60,5 @@ extern std::string const opcCallPerfTest; extern std::string const keyletHostFunctions; extern std::string const codecovWasm; + +extern std::string const floatHex; diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 00f89a4ac73..84e3882cc04 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -49,8 +50,46 @@ enum class HostFunctionError : int32_t { INVALID_ACCOUNT = -16, INVALID_FIELD = -17, INDEX_OUT_OF_BOUNDS = -18, + FLOAT_INPUT_MALFORMED = -19, + FLOAT_COMPUTATION_ERROR = -20, }; +std::string +floatToString(Slice const& data); + +Expected +floatFromIntImpl(int64_t x, int32_t mode); + +Expected +floatFromUintImpl(uint64_t x, int32_t mode); + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode); + +Expected +floatCompareImpl(Slice const& x, Slice const& y); + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatLogImpl(Slice const& x, int32_t mode); + struct HostFunctions { virtual void @@ -289,6 +328,78 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceFloat(std::string_view const& msg, Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromInt(int64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromUint(uint64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatCompare(Slice const& x, Slice const& y) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatPower(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatLog(Slice const& x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual ~HostFunctions() = default; }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 7dce3b865aa..d8f452159a3 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -654,4 +654,544 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) return msg.size() + sizeof(data); } +Expected +WasmHostFunctionsImpl::traceFloat( + std::string_view const& msg, + Slice const& data) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; + return msg.size() + s.size(); +} + +Expected +WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) +{ + return floatFromIntImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) +{ + return floatFromUintImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatSet( + int64_t mantissa, + int32_t exponent, + int32_t mode) +{ + return floatSetImpl(mantissa, exponent, mode); +} + +Expected +WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) +{ + return floatCompareImpl(x, y); +} + +Expected +WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) +{ + return floatAddImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatSubtract( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatSubtractImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatMultiply( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatMultiplyImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) +{ + return floatDivideImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) +{ + return floatRootImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) +{ + return floatPowerImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) +{ + return floatLogImpl(x, mode); +} + +class Number2 : public Number +{ + bool good_; + + enum Issue { XRP, MPT, IOU }; + Issue issue_; + +public: + Number2(Slice const& data) : Number(0), good_(false), issue_(IOU) + { + if (data.size() != 8) + return; + + uint64_t const v = SerialIter(data).get64(); + int const neg = (v & STAmount::cPositive) ? 1 : -1; + + Number x; + + if (v & STAmount::cIssuedCurrency) + { + // IOU + int32_t const e = + static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); + int64_t const m = neg * (v & ((1ull << 54) - 1)); + x = !m ? Number() : Number(m, e - 97); + if (m && (x.exponent() > 80 || x.exponent() < -96)) + return; // invalid number + issue_ = IOU; + } + else if (v & STAmount::cMPToken) + { + // MPT + int64_t const m = neg * (v & ((1ull << 61) - 1)); + x = !m ? Number() : Number(m); + issue_ = MPT; + } + else + { + // XRP + int64_t const m = neg * (v & ((1ull << 61) - 1)); + x = !m ? Number() : Number(m); + issue_ = XRP; + } + + *static_cast(this) = x; + good_ = true; + } + + Number2(int64_t x) : Number(x), good_(true), issue_(IOU) + { + } + + Number2(uint64_t x) : Number(0), good_(false), issue_(IOU) + { + if (x <= + std::numeric_limits< + std::invoke_result_t>:: + max()) + *static_cast(this) = Number(x); + else + { + *static_cast(this) = Number(x / 10, 1) + Number(x % 10); + } + + good_ = true; + } + + Number2(int64_t mantissa, int32_t exponent) + : Number(mantissa, exponent), good_(true), issue_(IOU) + { + } + + Number2(Number const& n) : Number(n), good_(true), issue_(IOU) + { + } + + operator bool() const + { + return good_; + } + + Expected + toBytes() const + { + uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + + if (issue_ == IOU) + { + v |= STAmount::cIssuedCurrency; + + if (!mantissa()) + { + if (exponent() != std::numeric_limits::lowest()) + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + else if (exponent() > 80 || exponent() < -96) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + + uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (absM > ((1ull << 54) - 1)) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + + v |= absM; + + int const e = (!mantissa() ? 0 : exponent()) + 97; + v |= ((uint64_t)e) << 54; + } + else if (issue_ == MPT) + { + v |= STAmount::cMPToken; + uint64_t x = toUInt(61); + if (x == std::numeric_limits::max()) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + v |= x; + } + else + { + uint64_t x = toUInt(61); + if (x == std::numeric_limits::max()) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + v |= x; + } + + Serializer msg; + msg.add64(v); + auto const data = msg.getData(); + return data; + } + +protected: + uint64_t + toUInt(unsigned bits) const + { + if (bits >= sizeof(uint64_t) * 8) + return std::numeric_limits::max(); + + uint64_t maxV = (1ull << bits) - 1; + uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); + + if (!absM) + return 0; + else if (exponent() < 0) + { + for (int i = 0; i > exponent(); --i) + { + if (absM < 10) + return std::numeric_limits::max(); // underflow + absM /= 10; + } + } + else + { + for (int i = 0; i < exponent(); ++i) + { + if (absM > maxV / 10) + return std::numeric_limits::max(); // overflow + absM *= 10; + } + } + + return absM > maxV ? std::numeric_limits::max() : absM; + } +}; + +struct SetRound +{ + Number::rounding_mode oldMode_; + bool good_; + + SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) + { + if (mode < Number::rounding_mode::to_nearest || + mode > Number::rounding_mode::upward) + return; + + Number::setround(static_cast(mode)); + good_ = true; + } + + ~SetRound() + { + Number::setround(oldMode_); + } + + operator bool() const + { + return good_; + } +}; + +std::string +floatToString(Slice const& data) +{ + Number2 const num(data); + if (!num) + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return "Invalid data: " + hex; + } + + auto const s = to_string(num); + return s; +} + +Expected +floatFromIntImpl(int64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatFromUintImpl(uint64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 num(mantissa, exponent); + if (!num) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatCompareImpl(Slice const& x, Slice const& y) +{ + try + { + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return xx < yy ? 2 : (xx == yy ? 0 : 1); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx + yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx - yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx * yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx / yy; + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 const res(root(xx, n)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + if (xx == Number() && !n) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + Number2 const res(power(xx, n, 1)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatLogImpl(Slice const& x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 const res(lg(xx)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index 1fdfbbb20da..e23df2c6ecb 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -190,6 +190,42 @@ class WasmHostFunctionsImpl : public HostFunctions Expected traceNum(std::string_view const& msg, int64_t data) override; + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override; + + Expected + floatFromInt(int64_t x, int32_t mode) override; + + Expected + floatFromUint(uint64_t x, int32_t mode) override; + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override; + + Expected + floatCompare(Slice const& x, Slice const& y) override; + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatLog(Slice const& x, int32_t mode) override; }; } // namespace ripple diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index a3a6f858c93..d9488c3b4e4 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -22,6 +22,7 @@ #include #include +#include #include namespace ripple { @@ -64,7 +65,7 @@ setData( template Expected -getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataInt32(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const result = params->data[i].of.i32; i++; @@ -73,16 +74,29 @@ getDataInt32(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataInt64(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const result = params->data[i].of.i64; i++; return result; } +template +Expected +getDataUint64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(runtime, params, i); + if (!r) + return Unexpected(r.error()); + if (r->size() != sizeof(uint64_t)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return *reinterpret_cast(r->data()); +} + template Expected -getDataSField(IW const* _rt, wasm_val_vec_t const* params, int32_t& i) +getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const& m = SField::getKnownCodeToField(); auto const it = m.find(params->data[i].of.i32); @@ -217,7 +231,9 @@ returnResult( { return hfResult(results, res.error()); } - if constexpr (std::is_same_v, Bytes>) + + using t = std::decay_t; + if constexpr (std::is_same_v) { return hfResult( results, @@ -228,7 +244,7 @@ returnResult( res->data(), res->size())); } - else if constexpr (std::is_same_v, Hash>) + else if constexpr (std::is_same_v) { return hfResult( results, @@ -239,13 +255,11 @@ returnResult( res->data(), res->size())); } - else if constexpr (std::is_same_v, int32_t>) + else if constexpr (std::is_same_v) { return hfResult(results, res.value()); } - else if constexpr (std::is_same_v< - std::decay_t, - std::uint32_t>) + else if constexpr (std::is_same_v) { auto const resultValue = res.value(); return hfResult( @@ -1044,7 +1058,6 @@ ticketKeylet_wrap( results, hf->ticketKeylet(acc.value(), seq.value()), index); - ; } wasm_trap_t* @@ -1131,6 +1144,310 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->traceNum(*msg, *number), index); } +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const number = getDataSlice(runtime, params, i); + if (!number) + return hfResult(results, number.error()); + + return returnResult( + runtime, params, results, hf->traceFloat(*msg, *number), i); +} + +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataInt64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 3; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 1; + return returnResult( + runtime, params, results, hf->floatFromInt(*x, *rounding), i); +} + +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataUint64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatFromUint(*x, *rounding), i); +} + +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const exp = getDataInt32(runtime, params, i); + if (!exp) + return hfResult(results, exp.error()); + + auto const mant = getDataInt64(runtime, params, i); + if (!mant) + return hfResult(results, mant.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatSet(*mant, *exp, *rounding), i); +} + +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + return returnResult(runtime, params, results, hf->floatCompare(*x, *y), i); +} + +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatAdd(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatSubtract(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatMultiply(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatDivide(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatRoot(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatPower(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatLog(*x, *rounding), i); +} + +namespace test { + class MockInstanceWrapper { wmem mem_; @@ -1148,8 +1465,6 @@ class MockInstanceWrapper } }; -namespace test { - // LCOV_EXCL_START bool testGetDataIncrement() diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 22597716322..6bad18b3686 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -313,4 +313,113 @@ using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceFloat_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromUint_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatSet_proto = int32_t(int32_t, int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatCompare_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatAdd_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatSubtract_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatMultiply_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatDivide_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatRoot_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatRoot_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatPower_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatLog_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + } // namespace ripple diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 0b94150db2f..9194943737b 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -77,6 +77,19 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); // clang-format on } From 28470757056c141ecf3c25baf2b4aab6c8572f94 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 31 Jul 2025 10:57:56 -0400 Subject: [PATCH 043/212] fix: ensure `GasUsed` shows up in the metadata even on `tecWASM_REJECTED` (#5633) * always set gas used * fix * add tests * clean up --- src/test/app/Escrow_test.cpp | 100 +++++++++++++++-------- src/xrpld/app/tx/detail/ApplyContext.cpp | 1 + src/xrpld/app/tx/detail/ApplyContext.h | 5 +- src/xrpld/ledger/ApplyViewImpl.h | 2 +- 4 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 93a37d81037..d77de860fd4 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -296,7 +296,7 @@ struct Escrow_test : public beast::unit_test::suite { testcase("Implied Finish Time (without fix1571)"); - Env env(*this, testable_amendments() - fix1571); + Env env(*this, features - fix1571); auto const baseFee = env.current()->fees().base; env.fund(XRP(5000), "alice", "bob", "carol"); env.close(); @@ -1696,7 +1696,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testCreateFinishFunctionPreflight() + testCreateFinishFunctionPreflight(FeatureBitset features) { testcase("Test preflight checks involving FinishFunction"); @@ -1712,7 +1712,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, testable_amendments() - featureSmartEscrow); + Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); @@ -1726,10 +1726,13 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction > max length - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_size_limit = 10; // 10 bytes - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + }), + features); XRPAmount const txnFees = env.current()->fees().base + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -1746,10 +1749,13 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->START_UP = Config::FRESH; - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + }), + features); XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; // create escrow env.fund(XRP(5000), alice, carol); @@ -1866,7 +1872,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishWasmFailures() + testFinishWasmFailures(FeatureBitset features) { testcase("EscrowFinish Smart Escrow failures"); @@ -1882,7 +1888,7 @@ struct Escrow_test : public beast::unit_test::suite { // featureSmartEscrow disabled - Env env(*this, testable_amendments() - featureSmartEscrow); + Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; env(escrow::finish(carol, alice, 1), @@ -1894,10 +1900,13 @@ struct Escrow_test : public beast::unit_test::suite { // ComputationAllowance > max compute limit - Env env(*this, envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_compute_limit = 1'000; // in gas - return cfg; - })); + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + }), + features); env.fund(XRP(5000), alice, carol); // Run past the flag ledger so that a Fee change vote occurs and // updates FeeSettings. (It also activates all supported @@ -1913,8 +1922,8 @@ struct Escrow_test : public beast::unit_test::suite } { - uint32_t const allowance = 10'000; - Env env(*this); + uint32_t const allowance = 5'664; + Env env(*this, features); env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); XRPAmount const createFee = env.current()->fees().base + 1000; @@ -1937,9 +1946,13 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); } - Env env(*this); + Env env(*this, features); // Run past the flag ledger so that a Fee change vote occurs and // updates FeeSettings. (It also activates all supported @@ -2011,7 +2024,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testFinishFunction() + testFinishFunction(FeatureBitset features) { testcase("Example escrow function"); @@ -2028,7 +2041,7 @@ struct Escrow_test : public beast::unit_test::suite { // basic FinishFunction situation - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2067,6 +2080,14 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); env.close(); + + { + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + txMeta->getFieldU32(sfGasUsed) == allowance); + } + env(escrow::finish(alice, alice, seq), fee(txnFees), escrow::comp_allowance(allowance), @@ -2082,7 +2103,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + Condition - Env env(*this); + Env env(*this, features); env.fund(XRP(5000), alice, carol); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto const seq = env.seq(alice); @@ -2116,6 +2137,9 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + env.meta()->getFieldU32(sfGasUsed) == allowance); env.close(); // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), @@ -2148,7 +2172,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + FinishAfter - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2196,7 +2220,7 @@ struct Escrow_test : public beast::unit_test::suite { // FinishFunction + FinishAfter #2 - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2227,6 +2251,9 @@ struct Escrow_test : public beast::unit_test::suite escrow::comp_allowance(allowance), fee(txnFees), ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECT( + env.meta()->getFieldU32(sfGasUsed) == allowance); env.close(); // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), @@ -2245,7 +2272,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testAllHostFunctions() + testAllHostFunctions(FeatureBitset features) { testcase("Test all host functions"); @@ -2259,7 +2286,7 @@ struct Escrow_test : public beast::unit_test::suite Account const carol{"carol"}; { - Env env(*this); + Env env(*this, features); // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); @@ -2311,7 +2338,7 @@ struct Escrow_test : public beast::unit_test::suite } void - testKeyletHostFunctions() + testKeyletHostFunctions(FeatureBitset features) { testcase("Test all keylet host functions"); @@ -2371,12 +2398,17 @@ struct Escrow_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 1'000'000; + auto const allowance = 99'596; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), fee(txnFees)); env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); } } } @@ -2396,13 +2428,13 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(features); testEscrowWithTickets(features); testCredentials(features); - testCreateFinishFunctionPreflight(); - testFinishWasmFailures(); - testFinishFunction(); + testCreateFinishFunctionPreflight(features); + testFinishWasmFailures(features); + testFinishFunction(features); // TODO: Update module with new host functions - testAllHostFunctions(); - testKeyletHostFunctions(); + testAllHostFunctions(features); + testKeyletHostFunctions(features); } public: diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index 79cbb7f40dc..ff31662494d 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -59,6 +59,7 @@ ApplyContext::discard() std::optional ApplyContext::apply(TER ter) { + view_->setGasUsed(gasUsed_); return view_->apply( base_, tx, ter, parentBatchId_, flags_ & tapDRY_RUN, journal); } diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index a3bdf9a85a7..5334bdabcb4 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -108,9 +108,9 @@ class ApplyContext /** Sets the gas used in the metadata */ void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::uint32_t const gasUsed) { - view_->setGasUsed(gasUsed); + gasUsed_ = gasUsed; } /** Discard changes and start fresh. */ @@ -164,6 +164,7 @@ class ApplyContext // The ID of the batch transaction we are executing under, if seated. std::optional parentBatchId_; + std::optional gasUsed_; }; } // namespace ripple diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index f7e90b9d54c..cf494217f4b 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -76,7 +76,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase } void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::optional const gasUsed) { gasUsed_ = gasUsed; } From ccc3280b1a63b399c38283bd4931a9abb8cb1048 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 31 Jul 2025 13:42:53 -0400 Subject: [PATCH 044/212] Update wamr to 2.4.1 (#5640) --- .github/actions/dependencies/action.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 2 +- BUILD.md | 4 +- conanfile.py | 2 +- external/wamr/conandata.yml | 2 +- external/wamr/conanfile.py | 4 +- external/wamr/patches/ripp_metering.patch | 76 +++++++++++------------ 8 files changed, 46 insertions(+), 48 deletions(-) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index 2a66f7dc760..a1a46c7e352 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -11,7 +11,7 @@ runs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 4a414935582..f838f083388 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -94,7 +94,7 @@ jobs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index e759b2edc8c..e2d0ae370ff 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -89,7 +89,7 @@ jobs: run: | conan export --version 1.1.10 external/snappy conan export --version 4.0.3 external/soci - conan export --version 2.3.1 external/wamr + conan export --version 2.4.1 external/wamr - name: add Ripple Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/BUILD.md b/BUILD.md index 0ea3c12e62a..7534e539de3 100644 --- a/BUILD.md +++ b/BUILD.md @@ -184,10 +184,8 @@ Export our [Conan recipe for WAMR](./external/wamr). It add metering and expose some internal structures. ``` -# Conan 1.x -conan export external/wamr wamr/2.3.1@ # Conan 2.x -conan export --version 2.3.1 external/wamr +conan export --version 2.4.1 external/wamr ``` ### Build and Test diff --git a/conanfile.py b/conanfile.py index 898cfe74d70..abffa32f3e6 100644 --- a/conanfile.py +++ b/conanfile.py @@ -31,7 +31,7 @@ class Xrpl(ConanFile): 'openssl/1.1.1w', 'soci/4.0.3', 'zlib/1.3.1', - 'wamr/2.3.1', + 'wamr/2.4.1', ] test_requires = [ diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml index b1459816305..d475ad987c0 100644 --- a/external/wamr/conandata.yml +++ b/external/wamr/conandata.yml @@ -1,5 +1,5 @@ patches: - 2.3.1: + 2.4.1: - patch_description: add metering to iwasm interpreter patch_file: patches/ripp_metering.patch patch_type: conan diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index f391ea43505..eed674adefc 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -14,7 +14,7 @@ class WamrConan(ConanFile): name = "wamr" - version = "2.3.1" + version = "2.4.1" license = "Apache License v2.0" url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" description = "Webassembly micro runtime" @@ -42,7 +42,7 @@ def source(self): git = Git(self) git.fetch_commit( url="https://github.com/bytecodealliance/wasm-micro-runtime.git", - commit="2a303861cc916dc182b7fecaa0aacc1b797e7ac6", + commit="b124f70345d712bead5c0c2393acb2dc583511de", ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 76a2057cc9a..9749d475da9 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -1,5 +1,5 @@ diff --git a/CMakeLists.txt b/CMakeLists.txt -index 88a1642b..e9eab7ec 100644 +index 4b28fa89..7d523a3d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ @@ -21,10 +21,10 @@ index 88a1642b..e9eab7ec 100644 set (WAMR_PUBLIC_HEADERS diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c -index b2c9ed62..87947a18 100644 +index d2621fb2..6c96a844 100644 --- a/core/iwasm/aot/aot_runtime.c +++ b/core/iwasm/aot/aot_runtime.c -@@ -5484,7 +5484,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) +@@ -5611,7 +5611,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) import_func->func_ptr_linked = wasm_native_resolve_symbol( import_func->module_name, import_func->func_name, import_func->func_type, &import_func->signature, @@ -220,10 +220,10 @@ index 9a6afee1..0fe4739f 100644 bool diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index dcee0aea..a1f7866e 100644 +index 943b46fc..d026777e 100644 --- a/core/iwasm/common/wasm_runtime_common.c +++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2288,10 +2288,18 @@ wasm_runtime_access_exce_check_guard_page() +@@ -2344,10 +2344,18 @@ wasm_runtime_access_exce_check_guard_page() #if WASM_ENABLE_INSTRUCTION_METERING != 0 void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -243,7 +243,7 @@ index dcee0aea..a1f7866e 100644 #endif WASMFuncType * -@@ -7348,7 +7356,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, +@@ -7412,7 +7420,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, const char *func_name) { return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, @@ -252,7 +252,7 @@ index dcee0aea..a1f7866e 100644 } bool -@@ -7805,13 +7813,14 @@ wasm_runtime_get_module_name(wasm_module_t module) +@@ -7869,13 +7877,14 @@ wasm_runtime_get_module_name(wasm_module_t module) bool wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) { @@ -268,7 +268,7 @@ index dcee0aea..a1f7866e 100644 uint32 page_size = os_getpagesize(); uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; boundary = boundary + page_size * guard_page_count; -@@ -7821,6 +7830,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) +@@ -7885,6 +7894,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) "native stack overflow"); return false; } @@ -276,7 +276,7 @@ index dcee0aea..a1f7866e 100644 return true; } -@@ -7843,7 +7853,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, +@@ -7907,7 +7917,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; if ((uint8 *)&boundary < boundary) { wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), @@ -286,10 +286,10 @@ index dcee0aea..a1f7866e 100644 } return true; diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 64a6cd79..cb674edc 100644 +index 324620be..54155a0c 100644 --- a/core/iwasm/common/wasm_runtime_common.h +++ b/core/iwasm/common/wasm_runtime_common.h -@@ -795,7 +795,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, +@@ -833,7 +833,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, /* See wasm_export.h for description */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, @@ -352,7 +352,7 @@ index 241a0eec..1141744c 100644 // Convenience diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index b4ab34be..3fd0949f 100644 +index 81efb8f6..f752a970 100644 --- a/core/iwasm/include/wasm_export.h +++ b/core/iwasm/include/wasm_export.h @@ -20,8 +20,10 @@ @@ -367,7 +367,7 @@ index b4ab34be..3fd0949f 100644 #endif #elif defined(__GNUC__) || defined(__clang__) #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) -@@ -1833,7 +1835,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, +@@ -1874,7 +1876,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, */ WASM_RUNTIME_API_EXTERN void wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, @@ -384,10 +384,10 @@ index b4ab34be..3fd0949f 100644 /** * Dump runtime memory consumption, including: diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h -index ddc0b15b..3a707878 100644 +index 0dd73958..b7cad5f2 100644 --- a/core/iwasm/interpreter/wasm.h +++ b/core/iwasm/interpreter/wasm.h -@@ -579,6 +579,9 @@ typedef struct WASMFunctionImport { +@@ -617,6 +617,9 @@ typedef struct WASMFunctionImport { WASMModule *import_module; WASMFunction *import_func_linked; #endif @@ -398,10 +398,10 @@ index ddc0b15b..3a707878 100644 #if WASM_ENABLE_TAGS != 0 diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index 1e98b0fa..e77fdfcd 100644 +index edc473f2..55071613 100644 --- a/core/iwasm/interpreter/wasm_interp_classic.c +++ b/core/iwasm/interpreter/wasm_interp_classic.c -@@ -1569,13 +1569,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) +@@ -1547,13 +1547,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) } #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -423,7 +423,7 @@ index 1e98b0fa..e77fdfcd 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1625,10 +1626,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1603,10 +1604,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint32 cache_index, type_index, param_cell_num, cell_num; #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -436,7 +436,7 @@ index 1e98b0fa..e77fdfcd 100644 #endif #if WASM_ENABLE_EXCE_HANDLING != 0 -@@ -6885,6 +6885,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6849,6 +6849,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, prev_frame); @@ -448,7 +448,7 @@ index 1e98b0fa..e77fdfcd 100644 if (!prev_frame->ip) { /* Called from native. */ return; -@@ -6925,6 +6930,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -6889,6 +6894,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, } #endif SYNC_ALL_TO_FRAME(); @@ -462,10 +462,10 @@ index 1e98b0fa..e77fdfcd 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 4e5edf41..37b36c17 100644 +index 36d4538f..912be3d8 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -106,14 +106,14 @@ typedef float64 CellType_F64; +@@ -90,14 +90,14 @@ typedef float64 CellType_F64; } while (0) #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -488,7 +488,7 @@ index 4e5edf41..37b36c17 100644 #else #define CHECK_INSTRUCTION_LIMIT() (void)0 #endif -@@ -1454,7 +1454,6 @@ wasm_interp_dump_op_count() +@@ -1438,7 +1438,6 @@ wasm_interp_dump_op_count() do { \ const void *p_label_addr = *(void **)frame_ip; \ frame_ip += sizeof(void *); \ @@ -496,7 +496,7 @@ index 4e5edf41..37b36c17 100644 goto *p_label_addr; \ } while (0) #else -@@ -1466,7 +1465,6 @@ wasm_interp_dump_op_count() +@@ -1450,7 +1449,6 @@ wasm_interp_dump_op_count() /* int32 relative offset was emitted in 64-bit target */ \ p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ frame_ip += sizeof(int32); \ @@ -504,7 +504,7 @@ index 4e5edf41..37b36c17 100644 goto *p_label_addr; \ } while (0) #else -@@ -1477,17 +1475,18 @@ wasm_interp_dump_op_count() +@@ -1461,17 +1459,18 @@ wasm_interp_dump_op_count() /* uint32 label address was emitted in 32-bit target */ \ p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ frame_ip += sizeof(int32); \ @@ -526,7 +526,7 @@ index 4e5edf41..37b36c17 100644 #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ -@@ -1556,10 +1555,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -1540,10 +1539,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, uint8 opcode = 0, local_type, *global_addr; #if WASM_ENABLE_INSTRUCTION_METERING != 0 @@ -539,7 +539,7 @@ index 4e5edf41..37b36c17 100644 #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 -@@ -7694,6 +7692,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7672,6 +7670,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -547,7 +547,7 @@ index 4e5edf41..37b36c17 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7806,6 +7805,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7784,6 +7783,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -559,7 +559,7 @@ index 4e5edf41..37b36c17 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7834,6 +7838,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7812,6 +7816,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); @@ -571,10 +571,10 @@ index 4e5edf41..37b36c17 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c -index e66c08ba..d52e677e 100644 +index 771538a1..d6e6a6b8 100644 --- a/core/iwasm/interpreter/wasm_mini_loader.c +++ b/core/iwasm/interpreter/wasm_mini_loader.c -@@ -636,6 +636,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -805,6 +805,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, const char *linked_signature = NULL; void *linked_attachment = NULL; bool linked_call_conv_raw = false; @@ -582,7 +582,7 @@ index e66c08ba..d52e677e 100644 read_leb_uint32(p, p_end, declare_type_index); *p_buf = p; -@@ -647,7 +648,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -816,7 +817,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, /* check built-in modules */ linked_func = wasm_native_resolve_symbol( sub_module_name, function_name, declare_func_type, &linked_signature, @@ -591,7 +591,7 @@ index e66c08ba..d52e677e 100644 function->module_name = (char *)sub_module_name; function->field_name = (char *)function_name; -@@ -656,6 +657,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, +@@ -825,6 +826,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, function->signature = linked_signature; function->attachment = linked_attachment; function->call_conv_raw = linked_call_conv_raw; @@ -600,7 +600,7 @@ index e66c08ba..d52e677e 100644 } diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c -index 3cc2afe0..55859d35 100644 +index b4aa483d..2d74e469 100644 --- a/core/iwasm/interpreter/wasm_runtime.c +++ b/core/iwasm/interpreter/wasm_runtime.c @@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) @@ -621,10 +621,10 @@ index 3cc2afe0..55859d35 100644 function->local_count = 0; function->local_types = NULL; diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h -index 8d38c883..a687ab89 100644 +index 16c670f0..5ddac567 100644 --- a/core/iwasm/interpreter/wasm_runtime.h +++ b/core/iwasm/interpreter/wasm_runtime.h -@@ -228,6 +228,10 @@ struct WASMFunctionInstance { +@@ -237,6 +237,10 @@ struct WASMFunctionInstance { WASMFunctionImport *func_import; WASMFunction *func; } u; @@ -661,10 +661,10 @@ index a68c0749..cafb6915 100644 REG_NATIVE_FUNC(putchar, "(i)i"), REG_NATIVE_FUNC(memcmp, "(**~)i"), diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -index 6d057a6a..25879f33 100644 +index f7dfea0b..c01e80a9 100644 --- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -@@ -2257,7 +2257,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) +@@ -2269,7 +2269,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) /* clang-format off */ #define REG_NATIVE_FUNC(func_name, signature) \ From 842647050631c21c3713fe362d75ae720930a623 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 31 Jul 2025 18:39:21 -0400 Subject: [PATCH 045/212] feat: add other misc host functions (#5574) --- src/test/app/TestHostFunctions.h | 70 ++++ src/test/app/WasmHostFuncImpl_test.cpp | 421 +++++++++++++++++++-- src/test/app/wasm_fixtures/fixtures.cpp | 416 +++++++++++--------- src/xrpld/app/misc/WasmHostFunc.h | 69 ++++ src/xrpld/app/misc/WasmHostFuncImpl.cpp | 83 ++++ src/xrpld/app/misc/WasmHostFuncImpl.h | 36 ++ src/xrpld/app/misc/WasmHostFuncWrapper.cpp | 213 +++++++++++ src/xrpld/app/misc/WasmHostFuncWrapper.h | 76 ++++ src/xrpld/app/misc/WasmVM.cpp | 11 + 9 files changed, 1181 insertions(+), 214 deletions(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0752d6f6f4c..562d2091a07 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -112,6 +113,36 @@ struct TestHostFunctions : public HostFunctions return env_.current()->info().parentHash; } + Expected + getLedgerAccountHash() override + { + return env_.current()->info().accountHash; + } + + Expected + getLedgerTransactionHash() override + { + return env_.current()->info().txHash; + } + + Expected + getBaseFee() override + { + return 10; + } + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override + { + return 1; + } + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override + { + return 1; + } + virtual Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override { @@ -276,6 +307,15 @@ struct TestHostFunctions : public HostFunctions return 0; } + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override + { + return 1; + } + Expected computeSha512HalfHash(Slice const& data) override { @@ -334,6 +374,36 @@ struct TestHostFunctions : public HostFunctions return Bytes(s.begin(), s.end()); } + Expected + getNFTIssuer(uint256 const& nftId) override + { + return Bytes(accountID_.begin(), accountID_.end()); + } + + Expected + getNFTTaxon(uint256 const& nftId) override + { + return 4; + } + + Expected + getNFTFlags(uint256 const& nftId) override + { + return 8; + } + + Expected + getNFTTransferFee(uint256 const& nftId) override + { + return 10; + } + + Expected + getNFTSerial(uint256 const& nftId) override + { + return 4; + } + Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index 5a4b2441748..2f19b7dc30f 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -145,6 +145,112 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->info().parentHash); } + + void + testGetLedgerAccountHash() + { + testcase("getLedgerAccountHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerAccountHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().accountHash); + } + + void + testGetLedgerTransactionHash() + { + testcase("getLedgerTransactionHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerTransactionHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().txHash); + } + + void + testGetBaseFee() + { + testcase("getBaseFee"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getBaseFee(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); + } + + void + testIsAmendmentEnabled() + { + testcase("isAmendmentEnabled"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Use featureSmartEscrow for testing + auto const amendmentId = featureSmartEscrow; + + // Test by id + { + auto const result = hfs.isAmendmentEnabled(amendmentId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test by name + std::string const amendmentName = "SmartEscrow"; + { + auto const result = hfs.isAmendmentEnabled(amendmentName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test with a fake amendment id (all zeros) + uint256 fakeId; + { + auto const result = hfs.isAmendmentEnabled(fakeId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Test with a fake amendment name + std::string fakeName = "FakeAmendment"; + { + auto const result = hfs.isAmendmentEnabled(fakeName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + void testCacheLedgerObj() { @@ -1256,26 +1362,111 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite // Should succeed for small data std::vector data(10, 0x42); - auto result = hfs.updateData(Slice(data.data(), data.size())); + auto const result = hfs.updateData(Slice(data.data(), data.size())); BEAST_EXPECT(result.has_value() && result.value() == 0); // Should fail for too large data std::vector bigData( 1024 * 1024 + 1, 0x42); // > maxWasmDataLength - auto tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); + auto const tooBig = + hfs.updateData(Slice(bigData.data(), bigData.size())); if (BEAST_EXPECT(!tooBig.has_value())) BEAST_EXPECT( tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); // Should fail if ledger object not found (use a bogus keylet) - auto bogusKeylet = keylet::escrow(env.master, 999999); + auto const bogusKeylet = keylet::escrow(env.master, 999999); WasmHostFunctionsImpl hfs2(ac, bogusKeylet); - auto notFound = hfs2.updateData(Slice(data.data(), data.size())); + auto const notFound = hfs2.updateData(Slice(data.data(), data.size())); if (BEAST_EXPECT(!notFound.has_value())) BEAST_EXPECT( notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } + void + testCheckSignature() + { + testcase("checkSignature"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Generate a keypair and sign a message + auto const kp = generateKeyPair(KeyType::secp256k1, randomSeed()); + PublicKey const& pk = kp.first; + SecretKey const& sk = kp.second; + std::string const& message = "hello signature"; + auto const sig = sign(pk, sk, Slice(message.data(), message.size())); + + // Should succeed for valid signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Should fail for invalid signature + { + std::string badSig(sig.size(), 0xFF); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(badSig.data(), badSig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for invalid public key + { + std::string badPk(pk.size(), 0x00); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(badPk.data(), badPk.size())); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty public key + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(nullptr, 0)); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(nullptr, 0), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for empty message + { + auto const result = hfs.checkSignature( + Slice(nullptr, 0), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + void testComputeSha512HalfHash() { @@ -1291,7 +1482,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string data = "hello world"; - auto result = + auto const result = hfs.computeSha512HalfHash(Slice(data.data(), data.size())); BEAST_EXPECT(result.has_value()); @@ -1570,45 +1761,213 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite // Should succeed for valid NFT { - auto nftResult = hfs.getNFT(alice.id(), nftId); - if (BEAST_EXPECT(nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), nftId); + if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(std::equal( - nftResult.value().begin(), - nftResult.value().end(), - uri.data())); + result.value().begin(), result.value().end(), uri.data())); } // Should fail for invalid account { - auto nftResult = hfs.getNFT(xrpAccount(), nftId); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(xrpAccount(), nftId); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::INVALID_ACCOUNT); + result.error() == HostFunctionError::INVALID_ACCOUNT); } // Should fail for invalid nftId { - auto nftResult = hfs.getNFT(alice.id(), uint256()); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), uint256()); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::INVALID_PARAMS); + result.error() == HostFunctionError::INVALID_PARAMS); } // Should fail for invalid nftId { auto const badId = token::getNextID(env, alice, 0u, 1u); - auto nftResult = hfs.getNFT(alice.id(), badId); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFT(alice.id(), badId); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + { + auto const result = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == - HostFunctionError::LEDGER_OBJ_NOT_FOUND); + result.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetNFTIssuer() + { + testcase("getNFTIssuer"); + using namespace test::jtx; + + Env env{*this}; + // Mint NFT for env.master + uint32_t const taxon = 12345; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT id + { + auto const result = hfs.getNFTIssuer(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(std::equal( + result.value().begin(), + result.value().end(), + env.master.id().data())); } + // Should fail for zero NFT id { - auto nftResult = hfs.getNFT(alice.id(), nftId2); - if (BEAST_EXPECT(!nftResult.has_value())) + auto const result = hfs.getNFTIssuer(uint256()); + if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECT( - nftResult.error() == HostFunctionError::FIELD_NOT_FOUND); + result.error() == HostFunctionError::INVALID_PARAMS); + } + } + + void + testGetNFTTaxon() + { + testcase("getNFTTaxon"); + using namespace test::jtx; + + Env env{*this}; + + uint32_t const taxon = 54321; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getNFTTaxon(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == taxon); + } + + void + testGetNFTFlags() + { + testcase("getNFTFlags"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with default flags + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable); + env(token::mint(env.master, 0), txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTFlags(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == tfTransferable); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTFlags(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTTransferFee() + { + testcase("getNFTTransferFee"); + using namespace test::jtx; + + Env env{*this}; + + uint16_t const transferFee = 250; + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable, transferFee); + env(token::mint(env.master, 0), + token::xferFee(transferFee), + txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTTransferFee(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == transferFee); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTTransferFee(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTSerial() + { + testcase("getNFTSerial"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with serial 0 + uint256 const nftId = token::getNextID(env, env.master, 0u); + auto const serial = env.seq(env.master); + env(token::mint(env.master)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTSerial(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == serial); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTSerial(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); } } @@ -1629,11 +1988,11 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::string msg = "test trace"; std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); - auto result = hfs.trace(msg, slice, false); + auto const result = hfs.trace(msg, slice, false); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == msg.size() + data.size()); - auto resultHex = hfs.trace(msg, slice, true); + auto const resultHex = hfs.trace(msg, slice, true); BEAST_EXPECT(resultHex.has_value()); BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); } @@ -1654,7 +2013,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace number"; int64_t num = 123456789; - auto result = hfs.traceNum(msg, num); + auto const result = hfs.traceNum(msg, num); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } @@ -1665,6 +2024,10 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetLedgerSqn(); testGetParentLedgerTime(); testGetParentLedgerHash(); + testGetLedgerAccountHash(); + testGetLedgerTransactionHash(); + testGetBaseFee(); + testIsAmendmentEnabled(); testCacheLedgerObj(); testGetTxField(); testGetCurrentLedgerObjField(); @@ -1679,9 +2042,15 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetCurrentLedgerObjNestedArrayLen(); testGetLedgerObjNestedArrayLen(); testUpdateData(); + testCheckSignature(); testComputeSha512HalfHash(); testKeyletFunctions(); testGetNFT(); + testGetNFTIssuer(); + testGetNFTTaxon(); + testGetNFTFlags(); + testGetNFTTransferFee(); + testGetNFTSerial(); testTrace(); testTraceNum(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index d01835988ac..eb3e894d91f 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12034,194 +12034,234 @@ extern std::string const keyletHostFunctions = "5"; extern std::string const codecovWasm = - "0061736d0100000001570b60057f7f7f7f7f017f60027f7f017f60047f7f7f7f017f60037f" - "7f7f017f60067f7f7f7f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f60037f7f7e01" - "7f60077f7f7f7f7f7f7f017f60047f7f7f7f006000017f0298082308686f73745f6c696209" - "74726163655f6e756d000708686f73745f6c6962057472616365000008686f73745f6c6962" - "0e6765745f6c65646765725f73716e000108686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000108686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000108686f73745f6c69620c6765745f74785f6669656c6400030868" - "6f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c696210636163" - "68655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63757272656e745f" - "6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765745f6c65646765" - "725f6f626a5f6669656c64000208686f73745f6c6962136765745f74785f6e65737465645f" - "6669656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f" - "626a5f6e65737465645f6669656c64000208686f73745f6c69621b6765745f6c6564676572" - "5f6f626a5f6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61" - "727261795f6c656e000508686f73745f6c6962206765745f63757272656e745f6c65646765" - "725f6f626a5f61727261795f6c656e000508686f73745f6c6962186765745f6c6564676572" - "5f6f626a5f61727261795f6c656e000108686f73745f6c6962176765745f74785f6e657374" - "65645f61727261795f6c656e000108686f73745f6c6962276765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f61727261795f6c656e000108686f73745f6c6962" - "1f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000308686f" - "73745f6c69620b7570646174655f64617461000108686f73745f6c696213636f6d70757465" - "5f7368613531325f68616c66000208686f73745f6c69620b6c696e655f6b65796c65740006" - "08686f73745f6c69621163726564656e7469616c5f6b65796c6574000608686f73745f6c69" - "62076765745f6e6674000408686f73745f6c69620c636865636b5f6b65796c657400000868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" - "65796c6574000208686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" - "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" - "725f6b65796c6574000008686f73745f6c69620d6f7261636c655f6b65796c657400000868" - "6f73745f6c69620e7061796368616e5f6b65796c6574000808686f73745f6c69620e736967" - "6e6572735f6b65796c6574000208686f73745f6c69620d7469636b65745f6b65796c657400" - "00030302090a05030100110619037f01418080c0000b7f00419c92c0000b7f0041a092c000" - "0b072e04066d656d6f727902000666696e69736800240a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020af41802390002402000200147044020004100480d01418b80" - "c000410b2000ad1000000b200220032000ac10001a0f0b418b80c000410b2000ac1000000b" - "b71802087f027e230041a0016b22002400419680c000412341004100410010011a20004100" - "360238200041386a2201410410024104418987c000410e1023200041003602382001410410" - "034104419787c00041161023200041d0006a22064200370300200041c8006a220342003703" - "00200041406b2202420037030020004200370338200141201004412041ad87c00041161023" - "20034100360200200242003703002000420037033841818020200141141005220441144604" - "400240200041066a20002d003a3a00002000200029003f370380012000200041c4006a2900" - "0037008501200041106a200029008501370000200020002f01383b01042000200028003b36" - "0007200020002903800137000b200642003703002003420037030020024200370300200042" - "00370338200041046a411420014120100622044120470d002000411a6a20002d003a3a0000" - "20004188016a200041c7006a290000220837030020004190016a200041cf006a2900002209" - "370300200041276a20083700002000412f6a2009370000200041376a200041d7006a2d0000" - "3a0000200020002f01383b01182000200028003b36001b2000200029003f37001f20004118" - "6a412041001007410141b980c0004110102320034100360200200242003703002000420037" - "033841818020200141141008411441c387c000411c10232003410036020020024200370300" - "20004200370338410141818020200141141009411441df87c0004114102302402001410020" - "016b41037122036a220220014d0d0020030440200321040340200141003a0000200141016a" - "2101200441016b22040d000b0b200341016b4107490d000340200141003a0000200141076a" - "41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a00002001" - "41036a41003a0000200141026a41003a0000200141016a41003a0000200141086a22012002" - "470d000b0b200241c40020036b2203417c716a220120024b04400340200241003602002002" - "41046a22022001490d000b0b024020012003410371220320016a22044f0d00200322020440" - "0340200141003a0000200141016a2101200241016b22020d000b0b200341016b4107490d00" - "0340200141003a0000200141076a41003a0000200141066a41003a0000200141056a41003a" - "0000200141046a41003a0000200141036a41003a0000200141026a41003a0000200141016a" - "41003a0000200141086a22012004470d000b0b200041818020360280014100210103402005" - "41c000490440200041386a20056a20004180016a20016a2d00003a00002000200028027841" - "016a2205360278200141016a22014104470d010b0b20004190016a22044100360200200041" - "88016a220642003703002000420037038001200041386a2201200520004180016a22024114" - "100a411441f387c00041131023200441003602002006420037030020004200370380012001" - "200028027820024114100b4114418688c00041231023200441003602002006420037030020" - "0042003703800141012001200028027820024114100c411441a988c000411b10234189803c" - "100d412041c980c000411010234189803c100e412041d980c0004120102341014189803c10" - "0f412041f980c000411810232001200028027810104120419181c000411710232001200028" - "02781011412041a881c000412710234101200120002802781012412041cf81c000411f1023" - "200041046a220341141013410041ee81c000410b102320004198016a220742003703002004" - "420037030020064200370300200042003703800120012000280278200241201014412041c4" - "88c00041131023417f41041002417141f981c0004116102320004100360280012002417f10" - "02417141d788c0004116102320004182016a41003a0000200041003b018001200241031002" - "417d41ed88c000411c102320004100360280012002418094ebdc0310024173418989c00041" - "1b10234102100d416f418f82c000411f1023417f20002802781010417141ae82c000411f10" - "232001417f1010417141cd82c000411f102320014181201010417441ec82c0004120102320" - "0041b894ebdc036a2205200028027810104173418c83c000411f1023200520002802784101" - "1007417341ab83c000411810232001200028027841011007417141c383c000411a10232007" - "42003703002004420037030020064200370300200042003703800120052000280278200241" - "201006417341a489c000411b10232007420037030020044200370300200642003703002000" - "42003703800120012000280278200241201006417141bf89c0004118102320074200370300" - "20044200370300200642003703002000420037038001200341142003411420052000280278" - "200241201015417341d789c000412110232007420037030020044200370300200642003703" - "002000420037038001200341142003411420012000280278200241201015417141f889c000" - "411e102320052000280278422a1000417341dd83c00041171023200041003b018001410220" - "0241021005416f41968ac000411b1023200041003b0180014102200241021008416f41b18a" - "c000412b1023200041003b01800141014102200241021009416f41dc8ac000412310234102" - "100d416f418f82c000411f10234102100e416f41f483c000412f102341014102100f416f41" - "a384c00041271023200041003b018001200141812020024102100a417441ff8ac000412110" - "23200041003b018001200141812020024102100b417441a08bc00041311023200041003b01" - "80014101200141812020024102100c417441d18bc0004129102320014181201010417441ca" - "84c0004125102320014181201011417441ef84c00041351023410120014181201012417441" - "a485c000412d102320014181201013417441d185c00041191023200041003b018001200141" - "8120200241021014417441fa8bc00041211023200041003b01800120034114200341142001" - "4181202002410210164174419b8cc000411f10232001200028027822042005200441001001" - "417341ea85c000410f10232001200028027841001007417141f985c0004123102320004100" - "3b0180012003411420012000280278200241021017417141ba8cc000411a1023200041003b" - "01800120012000280278200241021006417141d48cc00041231023200041003b0180012001" - "20002802784101200241021018417141f78cc00041211023200041003b0180012001200028" - "027822042003411420012004200241021016417141988dc00041271023200041003b018001" - "2003411420012000280278220420012004200241021016417141bf8dc00041271023200041" - "003b0180012001200028027820034114200241021019417141e68dc0004125102320004100" - "3b01800120034114200120002802782002410210194171418b8ec00041251023200041003b" - "018001200120002802782003411420024102101a417141b08ec000412c1023200041003b01" - "8001200341142001200028027820024102101a417141dc8ec000412c1023200041003b0180" - "012001200028027820024102101b417141888fc000411f1023200041003b01800120012000" - "280278410120024102101c417141a78fc00041221023200041003b01800120012000280278" - "20034114419c86c0004114200241021015417141c98fc00041211023200041003b01800120" - "03411420012000280278419c86c0004114200241021015417141ea8fc00041211023200041" - "003b01800120012000280278410120024102101d4171418b90c00041251023200041003b01" - "800120012000280278410120024102101e417141b090c00041211023200041003b01800120" - "012000280278410120024102101f417141d190c00041221023200041003b01800120012000" - "280278200341144101200241021020417141f390c00041241023200041003b018001200341" - "142001200028027841012002410210204171419791c00041241023200041003b0180012001" - "2000280278200241021021417141bb91c00041231023200041003b01800120012000280278" - "4101200241021022417141de91c00041221023200041003b0180012001200028027841b086" - "c00041202002410210174171418092c000411c10232005200028027841b086c00041204100" - "1001417341d086c0004119102320012000280278200141812041001001417441e986c00041" - "0e1023200141812042011000417441f786c00041121023200041a0016a240041010f0b0b41" - "8080c000410b417f20042004417f4e1bac1000000b0ba6120100418080c0000b9c12657272" - "6f725f636f64653d54455354204641494c45442424242424205354415254494e4720574153" - "4d20455845435554494f4e20242424242463616368655f6c65646765725f6f626a6765745f" - "74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6172" - "7261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f7478" - "5f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e6573" - "7465645f61727261795f6c656e7570646174655f646174616765745f6c65646765725f7371" - "6e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669" - "656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f707472676574" - "5f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65" - "737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f" - "61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f707472" - "5f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e74726163655f6e" - "756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765725f6f62" - "6a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f" - "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65" - "737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" - "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c65" - "6e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c" - "69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f626a5f7772" - "6f6e675f73697a655f75696e74323536555344303030303030303030303030303030303030" - "303030303030303030303030303030303030303030303030303030303030316765745f6e66" - "745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e6774726163" - "655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f706172656e" - "745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765" - "745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f" - "6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f" - "6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765" - "745f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f6275" - "665f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e" - "676163636f756e745f6b65796c65745f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" - "65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f746f6f5f6c6f" - "6e675f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272" - "656e63796765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375" - "7272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64" - "6765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765" - "745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f626967" - "5f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" - "5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f626967" - "5f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c696365" - "6765745f6e66745f77726f6e675f73697a655f75696e743235366163636f756e745f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072656175" - "74685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369" - "745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" - "326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f" - "775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f6163" - "636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e746964004d" - "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" - "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" - "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; + "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" + "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" + "74726163655f6e756d000808686f73745f6c6962057472616365000208686f73745f6c6962" + "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" + "656c64000308686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" + "6c69621063616368655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c69621067" + "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" + "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" + "5f6c65646765725f6f626a5f61727261795f6c656e000008686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" + "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" + "656e000308686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" + "736967000408686f73745f6c6962076765745f6e6674000408686f73745f6c69620e676574" + "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" + "745f73657269616c000108686f73745f6c69620b6c696e655f6b65796c6574000708686f73" + "745f6c69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620c6368" + "65636b5f6b65796c6574000208686f73745f6c69620f64656c65676174655f6b65796c6574" + "000408686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000408" + "686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d657363726f77" + "5f6b65796c6574000208686f73745f6c6962106e66745f6f666665725f6b65796c65740002" + "08686f73745f6c69620c6f666665725f6b65796c6574000208686f73745f6c69620d6f7261" + "636c655f6b65796c6574000208686f73745f6c69620e7061796368616e5f6b65796c657400" + "0908686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d" + "7469636b65745f6b65796c657400020303020a0505030100110619037f01418080c0000b7f" + "00419895c0000b7f0041a095c0000b072e04066d656d6f727902000666696e697368002e0a" + "5f5f646174615f656e6403010b5f5f686561705f6261736503020ab21f0239000240200020" + "0147044020004100480d01418b80c000410b2000ad1000000b200220032000ac10001a0f0b" + "418b80c000410b2000ac1000000bf51e02087f027e230041e0016b22002400419680c00041" + "2341004100410010011a20004100360258200041d8006a220141041002410441ca88c00041" + "0e102d20004100360258200141041003410441d888c0004116102d200041f0006a22044200" + "370300200041e8006a22034200370300200041e0006a220242003703002000420037035820" + "0141201004412041ee88c0004116102d200442003703002003420037030020024200370300" + "200042003703582001412010054120418489c0004117102d20044200370300200342003703" + "0020024200370300200042003703582001412010064120419b89c0004112102d1007410a41" + "b980c000410c102d200041186a428182848890a0c08001370300200041106a428182848890" + "a0c08001370300200041086a428182848890a0c080013703002000428182848890a0c08001" + "37030041c580c000410e1008410141d380c0004111102d200041201008410141d380c00041" + "11102d20034100360200200242003703002000420037035802404181802020014114100922" + "064114460440200041266a20002d005a3a00002000200029005f3703c0012000200041e400" + "6a2900003700c501200041306a20002900c501370000200020002f01583b01242000200028" + "005b360027200020002903c00137002b200442003703002003420037030020024200370300" + "20004200370358200041246a411420014120100a22044120470d012000413a6a20002d005a" + "3a0000200041c8016a200041e7006a2900002208370300200041d0016a200041ef006a2900" + "002209370300200041c7006a2008370000200041cf006a2009370000200041d7006a200041" + "f7006a2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37" + "003f200041386a41204100100b410141e480c0004110102d20034100360200200242003703" + "00200042003703584181802020014114100c411441ad89c000411c102d2003410036020020" + "0242003703002000420037035841014181802020014114100d411441c989c0004114102d02" + "402001410020016b41037122036a220220014d0d0020030440200321040340200141003a00" + "00200141016a2101200441016b22040d000b0b200341016b4107490d000340200141003a00" + "00200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41" + "003a0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141" + "086a22012002470d000b0b200241c40020036b2203417c716a220120024b04400340200241" + "00360200200241046a22022001490d000b0b024020012003410371220320016a22044f0d00" + "2003220204400340200141003a0000200141016a2101200241016b22020d000b0b20034101" + "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" + "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" + "00200141016a41003a0000200141086a22012004470d000b0b2000418180203602c0014100" + "21010340200541c000490440200041d8006a20056a200041c0016a20016a2d00003a000020" + "0020002802980141016a220536029801200141016a22014104470d010b0b200041d0016a22" + "044100360200200041c8016a22064200370300200042003703c001200041d8006a22012005" + "200041c0016a22024114100e411441dd89c0004113102d2004410036020020064200370300" + "200042003703c001200120002802980120024114100f411441f089c0004123102d20044100" + "36020020064200370300200042003703c00141012001200028029801200241141010411441" + "938ac000411b102d4189803c1011412041f480c0004110102d4189803c10124120418481c0" + "004120102d41014189803c1013412041a481c0004118102d20012000280298011014412041" + "bc81c0004117102d20012000280298011015412041d381c0004127102d4101200120002802" + "98011016412041fa81c000411f102d200041246a2203411410174100419982c000410b102d" + "200041d8016a220742003703002004420037030020064200370300200042003703c0012001" + "200028029801200241201018412041ae8ac0004113102d41a482c000410c41b082c000410b" + "41bb82c000410e1019410141c982c0004109102d200041b8016a200041186a290300370300" + "200041b0016a200041106a290300370300200041a8016a200041086a290300370300200020" + "002903003703a001200441003b010020064200370300200042003703c00120034114200041" + "a0016a2205412020024112101a411241c18ac0004107102d20044100360200200642003703" + "00200042003703c0012005412020024114101b411441c88ac000410e102d200041003602c0" + "012005412020024104101c410441d68ac000410d102d20054120101d410841d282c000410d" + "102d20054120101e410a41df82c0004114102d200041003602c0012005412020024104101f" + "410441e38ac000410e102d417f41041002417141f382c0004116102d200041003602c00120" + "02417f1002417141f18ac0004116102d200041c2016a41003a0000200041003b01c0012002" + "41031002417d41878bc000411c102d200041003602c0012002418094ebdc031002417341a3" + "8bc000411b102d41021011416f418983c000411f102d417f2000280298011014417141a883" + "c000411f102d2001417f1014417141c783c000411f102d20014181201014417441e683c000" + "4120102d200041d894ebdc036a220520002802980110144173418684c000411f102d200520" + "00280298014101100b417341a584c0004118102d20012000280298014101100b417141bd84" + "c000411a102d200742003703002004420037030020064200370300200042003703c0012005" + "20002802980120024120100a417341be8bc000411b102d2007420037030020044200370300" + "20064200370300200042003703c001200120002802980120024120100a417141d98bc00041" + "18102d200742003703002004420037030020064200370300200042003703c0012003411420" + "0341142005200028029801200241201020417341f18bc0004121102d200742003703002004" + "420037030020064200370300200042003703c0012003411420034114200120002802980120" + "0241201020417141928cc000411e102d2005200028029801422a1000417341d784c0004117" + "102d200041003b01c0014102200241021009416f41b08cc000411b102d200041003b01c001" + "410220024102100c416f41cb8cc000412b102d200041003b01c0014101410220024102100d" + "416f41f68cc0004123102d41021011416f418983c000411f102d41021012416f41ee84c000" + "412f102d410141021013416f419d85c0004127102d41c580c0004181201008417441d380c0" + "004111102d200041003b01c001200141812020024102100e417441998dc0004121102d2000" + "41003b01c001200141812020024102100f417441ba8dc0004131102d200041003b01c00141" + "012001418120200241021010417441eb8dc0004129102d20014181201014417441c485c000" + "4125102d20014181201015417441e985c0004135102d4101200141812010164174419e86c0" + "00412d102d20014181201017417441cb86c0004119102d41a482c00041812041b082c00041" + "0b41bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c00041812041" + "bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c000410b41bb82c0" + "004181201019417441c982c0004109102d200041003b01c001200141812020024102101841" + "7441948ec0004121102d200041003b01c00120034114200341142001418120200241021021" + "417441b58ec000411f102d200120002802980122042005200441001001417341e486c00041" + "0f102d20012000280298014100100b417141f386c0004123102d200041003b01c001200341" + "14200120002802980120024102101a417141d48ec000411a102d200041003b01c001200120" + "002802980120024102101b417141ee8ec0004121102d200041003b01c00120012000280298" + "0120024102101c4171418f8fc0004120102d2001200028029801101d4171419687c0004120" + "102d2001200028029801101e417141b687c0004127102d200041003602c001200120002802" + "980120024104101f417141af8fc0004121102d200041003b01c00120012000280298012002" + "4102100a417141d08fc0004123102d200041003b01c0012001200028029801410120024102" + "1022417141f38fc0004121102d200041003b01c00120012000280298012204200341142001" + "20042002410210214171419490c0004127102d200041003b01c00120034114200120002802" + "9801220420012004200241021021417141bb90c0004127102d200041003b01c00120012000" + "2802980120034114200241021023417141e290c0004125102d200041003b01c00120034114" + "20012000280298012002410210234171418791c0004125102d200041003b01c00120012000" + "2802980120034114200241021024417141ac91c000412c102d200041003b01c00120034114" + "2001200028029801200241021024417141d891c000412c102d200041003b01c00120012000" + "280298012002410210254171418492c000411f102d200041003b01c0012001200028029801" + "4101200241021026417141a392c0004122102d200041003b01c00120012000280298012003" + "411441dd87c0004114200241021020417141c592c0004121102d200041003b01c001200341" + "14200120002802980141dd87c0004114200241021020417141e692c0004121102d20004100" + "3b01c001200120002802980141012002410210274171418793c0004125102d200041003b01" + "c00120012000280298014101200241021028417141ac93c0004121102d200041003b01c001" + "20012000280298014101200241021029417141cd93c0004122102d200041003b01c0012001" + "20002802980120034114410120024102102a417141ef93c0004124102d200041003b01c001" + "200341142001200028029801410120024102102a4171419394c0004124102d200041003b01" + "c001200120002802980120024102102b417141b794c0004123102d200041003b01c0012001" + "200028029801410120024102102c417141da94c0004122102d200041003b01c00120012000" + "2802980141f187c000412020024102101a417141fc94c000411c102d200520002802980141" + "f187c0004120410010014173419188c0004119102d20012000280298012001418120410010" + "01417441aa88c000410e102d200141812042011000417441b888c0004112102d200041e001" + "6a240041010f0b418080c000410b417f20062006417f4e1bac1000000b418080c000410b41" + "7f20042004417f4e1bac1000000b0ba2150100418080c0000b98156572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f626173655f666565746573745f616d656e646d656e7461" + "6d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f74" + "785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f617272" + "61795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f" + "6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e657374" + "65645f61727261795f6c656e7570646174655f6461746174657374206d6573736167657465" + "7374207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e" + "66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c65646765" + "725f73716e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c6964" + "5f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074" + "726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74" + "785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e6573" + "7465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a" + "5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e747261" + "63655f6e756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765" + "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c6564" + "6765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74" + "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" + "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" + "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" + "675f736c69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f62" + "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" + "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" + "726f6e675f73697a655f75696e743235365553443030303030303030303030303030303030" + "30303030303030303030303030303030303030303030303030303030303030316765745f6e" + "66745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e67747261" + "63655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f70617265" + "6e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f6861736867" + "65745f6c65646765725f6163636f756e745f686173686765745f6c65646765725f74785f68" + "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" + "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" + "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" + "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" + "6765745f6e66745f73657269616c6765745f6c65646765725f73716e5f6e65675f6c656e67" + "65745f6c65646765725f73716e5f6275665f746f6f5f736d616c6c6765745f6c6564676572" + "5f73716e5f6c656e5f746f6f5f6c6f6e676163636f756e745f6b65796c65745f6c656e5f74" + "6f6f5f6c6f6e676163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" + "65796c65745f6c656e5f746f6f5f6c6f6e675f63757272656e63796c696e655f6b65796c65" + "745f77726f6e675f6c656e5f63757272656e63796765745f74785f6669656c645f696e7661" + "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" + "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" + "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" + "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" + "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" + "3531325f68616c665f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c" + "65745f746f6f5f6269675f736c6963656765745f6e66745f77726f6e675f73697a655f7569" + "6e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235" + "366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f" + "6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072" + "65617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74696431646570" + "6f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646573" + "63726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469" + "64004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d6279010572757374631d312e38352e31202834656231363132353020323032352d" + "30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c" + "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" + "746976616c7565"; extern std::string const floatHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/misc/WasmHostFunc.h index 84e3882cc04..cd1848a5227 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/misc/WasmHostFunc.h @@ -127,6 +127,36 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + getLedgerAccountHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerTransactionHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getBaseFee() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(uint256 const& amendmentId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(std::string_view const& amendmentName) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { @@ -211,6 +241,15 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected computeSha512HalfHash(Slice const& data) { @@ -316,6 +355,36 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + getNFTIssuer(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTaxon(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTFlags(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTransferFee(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTSerial(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected trace(std::string_view const& msg, Slice const& data, bool asHex) { diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index d8f452159a3..4adb99a4472 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -17,6 +17,7 @@ */ //============================================================================== +#include #include #include @@ -48,6 +49,41 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().info().parentHash; } +Expected +WasmHostFunctionsImpl::getLedgerAccountHash() +{ + return ctx.view().info().accountHash; +} + +Expected +WasmHostFunctionsImpl::getLedgerTransactionHash() +{ + return ctx.view().info().txHash; +} + +Expected +WasmHostFunctionsImpl::getBaseFee() +{ + auto fee = ctx.view().fees().base.drops(); + if (fee > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(fee); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) +{ + return ctx.view().rules().enabled(amendmentId); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) +{ + auto const& table = ctx.app.getAmendmentTable(); + auto const amendment = table.find(std::string(amendmentName)); + return ctx.view().rules().enabled(amendment); +} + Expected WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) { @@ -425,6 +461,19 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return 0; } +Expected +WasmHostFunctionsImpl::checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) +{ + if (!publicKeyType(pubkey)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + PublicKey const pk(pubkey); + return verify(pk, message, signature, /*canonical*/ true); +} + Expected WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) { @@ -613,6 +662,40 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) return Bytes(s.begin(), s.end()); } +Expected +WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) +{ + auto const issuer = nft::getIssuer(nftId); + if (!issuer) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Bytes{issuer.begin(), issuer.end()}; +} + +Expected +WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) +{ + return nft::toUInt32(nft::getTaxon(nftId)); +} + +Expected +WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) +{ + return nft::getFlags(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) +{ + return nft::getTransferFee(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) +{ + return nft::getSerial(nftId); +} + Expected WasmHostFunctionsImpl::trace( std::string_view const& msg, diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index e23df2c6ecb..a6051bb1c74 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -84,6 +84,21 @@ class WasmHostFunctionsImpl : public HostFunctions Expected getParentLedgerHash() override; + Expected + getLedgerAccountHash() override; + + Expected + getLedgerTransactionHash() override; + + Expected + getBaseFee() override; + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override; + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override; + Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; @@ -126,6 +141,12 @@ class WasmHostFunctionsImpl : public HostFunctions Expected updateData(Slice const& data) override; + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override; + Expected computeSha512HalfHash(Slice const& data) override; @@ -185,6 +206,21 @@ class WasmHostFunctionsImpl : public HostFunctions Expected getNFT(AccountID const& account, uint256 const& nftId) override; + Expected + getNFTIssuer(uint256 const& nftId) override; + + Expected + getNFTTaxon(uint256 const& nftId) override; + + Expected + getNFTFlags(uint256 const& nftId) override; + + Expected + getNFTTransferFee(uint256 const& nftId) override; + + Expected + getNFTSerial(uint256 const& nftId) override; + Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override; diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp index d9488c3b4e4..6fb7b0c58c0 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.cpp @@ -319,6 +319,83 @@ getParentLedgerHash_wrap( runtime, params, results, hf->getParentLedgerHash(), index); } +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerAccountHash(), index); +} + +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerTransactionHash(), index); +} + +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult(runtime, params, results, hf->getBaseFee(), index); +} + +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() == uint256::bytes) + { + if (auto ret = hf->isAmendmentEnabled(uint256::fromVoid(slice->data())); + *ret == 1) + { + return returnResult(runtime, params, results, ret, index); + } + } + + if (slice->size() > 64) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const str = std::string_view( + reinterpret_cast(slice->data()), slice->size()); + return returnResult( + runtime, params, results, hf->isAmendmentEnabled(str), index); +} + wasm_trap_t* cacheLedgerObj_wrap( void* env, @@ -649,6 +726,42 @@ updateData_wrap( runtime, params, results, hf->updateData(*bytes), index); } +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const message = getDataSlice(runtime, params, index); + if (!message) + { + return hfResult(results, message.error()); + } + + auto const signature = getDataSlice(runtime, params, index); + if (!signature) + { + return hfResult(results, signature.error()); + } + + auto const pubkey = getDataSlice(runtime, params, index); + if (!pubkey) + { + return hfResult(results, pubkey.error()); + } + + return returnResult( + runtime, + params, + results, + hf->checkSignature(*message, *signature, *pubkey), + index); +} + wasm_trap_t* computeSha512HalfHash_wrap( void* env, @@ -1083,6 +1196,106 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->getNFT(*acc, *nftId), index); } +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTIssuer(*nftId), index); +} + +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTaxon(*nftId), index); +} + +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTFlags(*nftId), index); +} + +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTransferFee(*nftId), index); +} + +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTSerial(*nftId), index); +} + wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/misc/WasmHostFuncWrapper.h index 6bad18b3686..aac8ba387ea 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/misc/WasmHostFuncWrapper.h @@ -44,6 +44,34 @@ getParentLedgerHash_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using getLedgerAccountHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerTransactionHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getBaseFee_proto = int32_t(); +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using isAmendmentEnabled_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); wasm_trap_t* cacheLedgerObj_wrap( @@ -147,6 +175,19 @@ updateData_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using checkSignature_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t); +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using computeSha512HalfHash_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -304,6 +345,41 @@ using getNFT_proto = int32_t( wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using getNFTIssuer_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTaxon_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTFlags_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTransferFee_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTSerial_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using trace_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); wasm_trap_t* diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 9194943737b..49990dfb998 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include @@ -45,6 +46,10 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); @@ -59,6 +64,7 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); @@ -75,6 +81,11 @@ createWasmImport(HostFunctions* hfs) WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); From 58741d27910710da9f5b808bec6ae44268b3a734 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 4 Aug 2025 09:25:47 -0400 Subject: [PATCH 046/212] feat: return an int instead of boolean from `finish`, display in metadata (#5641) * create STInt32 and STInt64, use it for sfWasmReturnCode in metadata * get it actually working * add tests * update comment * change type * respond to comments --- include/xrpl/protocol/SField.h | 7 +- include/xrpl/protocol/STInteger.h | 3 + include/xrpl/protocol/STObject.h | 8 +++ include/xrpl/protocol/TxMeta.h | 27 ++++++- include/xrpl/protocol/detail/sfields.macro | 3 + src/libxrpl/protocol/STInteger.cpp | 78 +++++++++++++++++++++ src/libxrpl/protocol/STObject.cpp | 24 +++++++ src/libxrpl/protocol/STParsedJSON.cpp | 52 ++++++++++++-- src/libxrpl/protocol/STVar.cpp | 6 ++ src/libxrpl/protocol/Serializer.cpp | 12 ++++ src/libxrpl/protocol/TxMeta.cpp | 7 ++ src/test/app/Escrow_test.cpp | 10 +++ src/xrpld/app/misc/WasmParamsHelper.h | 2 +- src/xrpld/app/tx/detail/ApplyContext.cpp | 4 ++ src/xrpld/app/tx/detail/ApplyContext.h | 8 +++ src/xrpld/app/tx/detail/Escrow.cpp | 4 +- src/xrpld/ledger/ApplyViewImpl.h | 7 ++ src/xrpld/ledger/detail/ApplyStateTable.cpp | 3 + src/xrpld/ledger/detail/ApplyStateTable.h | 1 + src/xrpld/ledger/detail/ApplyViewImpl.cpp | 10 ++- 20 files changed, 263 insertions(+), 13 deletions(-) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index 777cfa02ba9..5d0215102ac 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -71,8 +71,10 @@ class STCurrency; STYPE(STI_VL, 7) \ STYPE(STI_ACCOUNT, 8) \ STYPE(STI_NUMBER, 9) \ + STYPE(STI_INT32, 10) \ + STYPE(STI_INT64, 11) \ \ - /* 10-13 are reserved */ \ + /* 12-13 are reserved */ \ STYPE(STI_OBJECT, 14) \ STYPE(STI_ARRAY, 15) \ \ @@ -352,6 +354,9 @@ using SF_UINT256 = TypedField>; using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; +using SF_INT32 = TypedField>; +using SF_INT64 = TypedField>; + using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; using SF_ISSUE = TypedField; diff --git a/include/xrpl/protocol/STInteger.h b/include/xrpl/protocol/STInteger.h index b2596387742..f86d3023481 100644 --- a/include/xrpl/protocol/STInteger.h +++ b/include/xrpl/protocol/STInteger.h @@ -81,6 +81,9 @@ using STUInt16 = STInteger; using STUInt32 = STInteger; using STUInt64 = STInteger; +using STInt32 = STInteger; +using STInt64 = STInteger; + template inline STInteger::STInteger(Integer v) : value_(v) { diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 6cd083ef857..19d4bc714d1 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -231,6 +231,10 @@ class STObject : public STBase, public CountedObject getFieldH192(SField const& field) const; uint256 getFieldH256(SField const& field) const; + std::int32_t + getFieldI32(SField const& field) const; + std::int64_t + getFieldI64(SField const& field) const; AccountID getAccountID(SField const& field) const; @@ -365,6 +369,10 @@ class STObject : public STBase, public CountedObject void setFieldH256(SField const& field, uint256 const&); void + setFieldI32(SField const& field, std::int32_t); + void + setFieldI64(SField const& field, std::int64_t); + void setFieldVL(SField const& field, Blob const&); void setFieldVL(SField const& field, Slice const&); diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index eb594fcc57f..6b1c24e9eb5 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -161,7 +161,8 @@ class TxMeta getGasUsed() const { XRPL_ASSERT( - hasGasUsed(), "ripple::TxMeta::getGasUsed : non-null batch id"); + hasGasUsed(), + "ripple::TxMeta::getGasUsed : non-null gas used field"); return *gasUsed_; } @@ -171,6 +172,27 @@ class TxMeta return static_cast(gasUsed_); } + void + setWasmReturnCode(std::int32_t const& wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + + std::int32_t + getWasmReturnCode() const + { + XRPL_ASSERT( + hasWasmReturnCode(), + "ripple::TxMeta::getWasmReturnCode : non-null wasm return code"); + return *wasmReturnCode_; + } + + bool + hasWasmReturnCode() const + { + return static_cast(wasmReturnCode_); + } + private: uint256 mTransactionID; std::uint32_t mLedger; @@ -178,8 +200,9 @@ class TxMeta int mResult; std::optional mDelivered; - std::optional gasUsed_; std::optional parentBatchId_; + std::optional gasUsed_; + std::optional wasmReturnCode_; STArray mNodes; }; diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index d5f98ca9995..1fcf1da6225 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -210,6 +210,9 @@ TYPED_SFIELD(sfAssetsMaximum, NUMBER, 3) TYPED_SFIELD(sfAssetsTotal, NUMBER, 4) TYPED_SFIELD(sfLossUnrealized, NUMBER, 5) +// 32-bit signed (common) +TYPED_SFIELD(sfWasmReturnCode, INT32, 1) + // currency amount (common) TYPED_SFIELD(sfAmount, AMOUNT, 1) TYPED_SFIELD(sfBalance, AMOUNT, 2) diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index a90e21491c0..458bc2b57ce 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -251,4 +251,82 @@ STUInt64::getJson(JsonOptions) const return convertToString(value_, 16); // Convert to base 16 } +//------------------------------------------------------------------------------ + +template <> +STInteger::STInteger(SerialIter& sit, SField const& name) + : STInteger(name, sit.get32()) +{ +} + +template <> +SerializedTypeID +STInt32::getSType() const +{ + return STI_INT32; +} + +template <> +std::string +STInt32::getText() const +{ + return std::to_string(value_); +} + +template <> +Json::Value +STInt32::getJson(JsonOptions) const +{ + return value_; +} + +//------------------------------------------------------------------------------ + +template <> +STInteger::STInteger(SerialIter& sit, SField const& name) + : STInteger(name, sit.get64()) +{ +} + +template <> +SerializedTypeID +STInt64::getSType() const +{ + return STI_INT64; +} + +template <> +std::string +STInt64::getText() const +{ + return std::to_string(value_); +} + +template <> +Json::Value +STInt64::getJson(JsonOptions) const +{ + auto convertToString = [](int64_t const value, int const base) { + XRPL_ASSERT( + base == 10 || base == 16, + "ripple::STInt64::getJson : base 10 or 16"); + std::string str( + base == 10 ? 20 : 16, 0); // Allocate space depending on base + auto ret = + std::to_chars(str.data(), str.data() + str.size(), value, base); + XRPL_ASSERT( + ret.ec == std::errc(), + "ripple::STInt64::getJson : to_chars succeeded"); + str.resize(std::distance(str.data(), ret.ptr)); + return str; + }; + + if (auto const& fName = getFName(); fName.shouldMeta(SField::sMD_BaseTen)) + { + return convertToString(value_, 10); // Convert to base 10 + } + + return convertToString(value_, 16); // Convert to base 16 +} + } // namespace ripple diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 9c23898a743..384ab527701 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -647,6 +647,18 @@ STObject::getFieldH256(SField const& field) const return getFieldByValue(field); } +std::int32_t +STObject::getFieldI32(SField const& field) const +{ + return getFieldByValue(field); +} + +std::int64_t +STObject::getFieldI64(SField const& field) const +{ + return getFieldByValue(field); +} + AccountID STObject::getAccountID(SField const& field) const { @@ -761,6 +773,18 @@ STObject::setFieldH256(SField const& field, uint256 const& v) setFieldUsingSetValue(field, v); } +void +STObject::setFieldI32(SField const& field, std::int32_t v) +{ + setFieldUsingSetValue(field, v); +} + +void +STObject::setFieldI64(SField const& field, std::int64_t v) +{ + setFieldUsingSetValue(field, v); +} + void STObject::setFieldV256(SField const& field, STVector256 const& v) { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index a5f163ba65c..56d5f5c60ee 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -501,14 +501,14 @@ parseLeaf( break; } - case STI_UINT192: { + case STI_UINT160: { if (!value.isString()) { error = bad_type(json_name, fieldName); return ret; } - uint192 num; + uint160 num; if (auto const s = value.asString(); !num.parseHex(s)) { @@ -521,18 +521,18 @@ parseLeaf( num.zero(); } - ret = detail::make_stvar(field, num); + ret = detail::make_stvar(field, num); break; } - case STI_UINT160: { + case STI_UINT192: { if (!value.isString()) { error = bad_type(json_name, fieldName); return ret; } - uint160 num; + uint192 num; if (auto const s = value.asString(); !num.parseHex(s)) { @@ -545,7 +545,7 @@ parseLeaf( num.zero(); } - ret = detail::make_stvar(field, num); + ret = detail::make_stvar(field, num); break; } @@ -573,6 +573,46 @@ parseLeaf( break; } + case STI_INT32: + try + { + if (value.isString()) + { + ret = detail::make_stvar( + field, + beast::lexicalCastThrow( + value.asString())); + } + else if (value.isInt()) + { + ret = detail::make_stvar(field, value.asInt()); + } + else if (value.isUInt()) + { + if (value.asUInt() > + static_cast( + std::numeric_limits::max())) + { + error = out_of_range(json_name, fieldName); + return ret; + } + ret = detail::make_stvar( + field, safe_cast(value.asInt())); + } + else + { + error = bad_type(json_name, fieldName); + return ret; + } + } + catch (std::exception const&) + { + error = invalid_data(json_name, fieldName); + return ret; + } + + break; + case STI_VL: if (!value.isString()) { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 24954c4add7..72b348091c9 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -208,6 +208,12 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args) case STI_UINT256: construct(std::forward(args)...); return; + case STI_INT32: + construct(std::forward(args)...); + return; + case STI_INT64: + construct(std::forward(args)...); + return; case STI_VECTOR256: construct(std::forward(args)...); return; diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index b8a68d28b83..d85f25ec8b2 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -83,6 +83,18 @@ Serializer::addInteger(std::uint64_t i) { return add64(i); } +template <> +int +Serializer::addInteger(std::int32_t i) +{ + return add32(i); +} +template <> +int +Serializer::addInteger(std::int64_t i) +{ + return add64(i); +} int Serializer::addRaw(Blob const& vector) diff --git a/src/libxrpl/protocol/TxMeta.cpp b/src/libxrpl/protocol/TxMeta.cpp index 9a33cb81f19..923059e1114 100644 --- a/src/libxrpl/protocol/TxMeta.cpp +++ b/src/libxrpl/protocol/TxMeta.cpp @@ -60,6 +60,8 @@ TxMeta::TxMeta( setParentBatchId(obj.getFieldH256(sfParentBatchID)); if (obj.isFieldPresent(sfGasUsed)) setGasUsed(obj.getFieldU32(sfGasUsed)); + if (obj.isFieldPresent(sfWasmReturnCode)) + setWasmReturnCode(obj.getFieldI32(sfWasmReturnCode)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) @@ -86,6 +88,9 @@ TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, STObject const& obj) if (obj.isFieldPresent(sfGasUsed)) setGasUsed(obj.getFieldU32(sfGasUsed)); + + if (obj.isFieldPresent(sfWasmReturnCode)) + setWasmReturnCode(obj.getFieldI32(sfWasmReturnCode)); } TxMeta::TxMeta(uint256 const& txid, std::uint32_t ledger, Blob const& vec) @@ -257,6 +262,8 @@ TxMeta::getAsObject() const metaData.setFieldH256(sfParentBatchID, getParentBatchId()); if (hasGasUsed()) metaData.setFieldU32(sfGasUsed, getGasUsed()); + if (hasWasmReturnCode()) + metaData.setFieldI32(sfWasmReturnCode, getWasmReturnCode()); return metaData; } diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index d77de860fd4..640743a8699 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2096,6 +2096,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2164,6 +2166,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2213,6 +2217,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2264,6 +2270,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2330,6 +2338,8 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/misc/WasmParamsHelper.h index 224d7431d30..8bdf11e6182 100644 --- a/src/xrpld/app/misc/WasmParamsHelper.h +++ b/src/xrpld/app/misc/WasmParamsHelper.h @@ -48,7 +48,7 @@ struct WasmResult T result; int64_t cost; }; -typedef WasmResult EscrowResult; +typedef WasmResult EscrowResult; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/xrpld/app/tx/detail/ApplyContext.cpp b/src/xrpld/app/tx/detail/ApplyContext.cpp index ff31662494d..42f6c7ecfa5 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.cpp +++ b/src/xrpld/app/tx/detail/ApplyContext.cpp @@ -59,6 +59,10 @@ ApplyContext::discard() std::optional ApplyContext::apply(TER ter) { + if (wasmReturnCode_.has_value()) + { + view_->setWasmReturnCode(*wasmReturnCode_); + } view_->setGasUsed(gasUsed_); return view_->apply( base_, tx, ter, parentBatchId_, flags_ & tapDRY_RUN, journal); diff --git a/src/xrpld/app/tx/detail/ApplyContext.h b/src/xrpld/app/tx/detail/ApplyContext.h index 5334bdabcb4..22b270b8479 100644 --- a/src/xrpld/app/tx/detail/ApplyContext.h +++ b/src/xrpld/app/tx/detail/ApplyContext.h @@ -113,6 +113,13 @@ class ApplyContext gasUsed_ = gasUsed; } + /** Sets the gas used in the metadata */ + void + setWasmReturnCode(std::int32_t const wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + /** Discard changes and start fresh. */ void discard(); @@ -165,6 +172,7 @@ class ApplyContext // The ID of the batch transaction we are executing under, if seated. std::optional parentBatchId_; std::optional gasUsed_; + std::optional wasmReturnCode_; }; } // namespace ripple diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 83dcef2fa9b..c993d8ba593 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1282,13 +1282,13 @@ EscrowFinish::doApply() if (re.has_value()) { auto reValue = re.value().result; + ctx_.setWasmReturnCode(reValue); // TODO: better error handling for this conversion ctx_.setGasUsed(static_cast(re.value().cost)); JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << re.value().cost; - if (!reValue) + if (reValue <= 0) { - // ctx_.view().update(slep); return tecWASM_REJECTED; } } diff --git a/src/xrpld/ledger/ApplyViewImpl.h b/src/xrpld/ledger/ApplyViewImpl.h index cf494217f4b..e6eb4a683d9 100644 --- a/src/xrpld/ledger/ApplyViewImpl.h +++ b/src/xrpld/ledger/ApplyViewImpl.h @@ -81,6 +81,12 @@ class ApplyViewImpl final : public detail::ApplyViewBase gasUsed_ = gasUsed; } + void + setWasmReturnCode(std::int32_t const wasmReturnCode) + { + wasmReturnCode_ = wasmReturnCode; + } + /** Get the number of modified entries */ std::size_t @@ -100,6 +106,7 @@ class ApplyViewImpl final : public detail::ApplyViewBase private: std::optional deliver_; std::optional gasUsed_; + std::optional wasmReturnCode_; }; } // namespace ripple diff --git a/src/xrpld/ledger/detail/ApplyStateTable.cpp b/src/xrpld/ledger/detail/ApplyStateTable.cpp index 039088205bd..026955baba0 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.cpp +++ b/src/xrpld/ledger/detail/ApplyStateTable.cpp @@ -118,6 +118,7 @@ ApplyStateTable::apply( std::optional const& deliver, std::optional const& parentBatchId, std::optional const& gasUsed, + std::optional const& wasmReturnCode, bool isDryRun, beast::Journal j) { @@ -136,6 +137,8 @@ ApplyStateTable::apply( meta.setParentBatchId(*parentBatchId); if (gasUsed) meta.setGasUsed(*gasUsed); + if (wasmReturnCode) + meta.setWasmReturnCode(*wasmReturnCode); Mods newMod; for (auto& item : items_) { diff --git a/src/xrpld/ledger/detail/ApplyStateTable.h b/src/xrpld/ledger/detail/ApplyStateTable.h index 896705042fd..1ba7f00945b 100644 --- a/src/xrpld/ledger/detail/ApplyStateTable.h +++ b/src/xrpld/ledger/detail/ApplyStateTable.h @@ -74,6 +74,7 @@ class ApplyStateTable std::optional const& deliver, std::optional const& parentBatchId, std::optional const& gasUsed, + std::optional const& wasmReturnCode, bool isDryRun, beast::Journal j); diff --git a/src/xrpld/ledger/detail/ApplyViewImpl.cpp b/src/xrpld/ledger/detail/ApplyViewImpl.cpp index a90fc3fcbbc..1191f6573fb 100644 --- a/src/xrpld/ledger/detail/ApplyViewImpl.cpp +++ b/src/xrpld/ledger/detail/ApplyViewImpl.cpp @@ -36,7 +36,15 @@ ApplyViewImpl::apply( beast::Journal j) { return items_.apply( - to, tx, ter, deliver_, parentBatchId, gasUsed_, isDryRun, j); + to, + tx, + ter, + deliver_, + parentBatchId, + gasUsed_, + wasmReturnCode_, + isDryRun, + j); } std::size_t From 38c7a27010da7465c1436a5fde98df970ddaac03 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 5 Aug 2025 18:06:34 -0400 Subject: [PATCH 047/212] clean up WASM functions a bit (#5628) --- src/test/app/Wasm_test.cpp | 59 ++++++++----- src/xrpld/app/misc/WasmVM.cpp | 129 +++++++++++++++-------------- src/xrpld/app/misc/WasmVM.h | 6 +- src/xrpld/app/tx/detail/Escrow.cpp | 8 +- 4 files changed, 114 insertions(+), 88 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 98e06a86361..c8db385c670 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -141,14 +141,19 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; TestLedgerDataProvider hf(&env); - std::string const funcName("finish"); std::vector imports; WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, &hf, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &hf, + 1'000'000, + env.journal); // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) @@ -160,7 +165,8 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module - run the same instance - re = engine.run({}, funcName, {}, imports, &hf, 1'000'000, env.journal); + re = engine.run( + {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) @@ -327,10 +333,9 @@ struct Wasm_test : public beast::unit_test::suite "6d756c746976616c7565"; auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("finish"); - auto const re = - preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + auto const re = preflightEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); BEAST_EXPECT(!isTesSuccess(re)); } } @@ -348,8 +353,8 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { TestHostFunctions nfs(env, 0); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result && (re->cost == 41'132)); @@ -369,8 +374,8 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(env); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (access nonexistent field) result " // << re.error() << std::endl; @@ -389,8 +394,8 @@ struct Wasm_test : public beast::unit_test::suite } }; BadTestHostFunctions nfs(env); - std::string funcName("finish"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 100'000); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); // std::cout << "bad case (more than MAX_PAGES) result " // << re.error() << std::endl; @@ -431,7 +436,6 @@ struct Wasm_test : public beast::unit_test::suite { auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("finish"); TestLedgerDataProvider ledgerDataProvider(&env); std::vector imports; @@ -441,7 +445,13 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, funcName, {}, imports, nullptr, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + nullptr, + 1'000'000, + env.journal); // expected import not provided BEAST_EXPECT(!re); @@ -453,8 +463,6 @@ struct Wasm_test : public beast::unit_test::suite { testcase("wasm test host functions cost"); - std::string const funcName("finish"); - using namespace test::jtx; Env env(*this); @@ -471,7 +479,13 @@ struct Wasm_test : public beast::unit_test::suite i.gas = 0; auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); if (BEAST_EXPECT(re.has_value())) { @@ -498,7 +512,13 @@ struct Wasm_test : public beast::unit_test::suite std::vector const imp = createWasmImport(&hfs); auto re = engine.run( - wasm, funcName, {}, imp, &hfs, 1'000'000, env.journal); + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); if (BEAST_EXPECT(re.has_value())) { @@ -542,7 +562,6 @@ struct Wasm_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; - std::string const funcName("finish"); // std::string const funcName("test"); auto const& wasmHex = hfPerfTest; // auto const& wasmHex = opcCallPerfTest; @@ -614,7 +633,7 @@ struct Wasm_test : public beast::unit_test::suite PerfHostFunctions nfs(env, k, env.tx()); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs); + auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/misc/WasmVM.cpp index 49990dfb998..d815c9939d1 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/misc/WasmVM.cpp @@ -34,6 +34,71 @@ namespace ripple { +static void +setCommonHostFunctions(HostFunctions* hfs, std::vector& i) +{ + // clang-format off + WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); + WASM_IMPORT_FUNC (i, trace, hfs, 500); + WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); + // clang-format on +} + std::vector createWasmImport(HostFunctions* hfs) { @@ -41,68 +106,8 @@ createWasmImport(HostFunctions* hfs) if (hfs) { - // clang-format off - - WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); - WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); - WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); - WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); - WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); - WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); - WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); - WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); - WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); - WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); - WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); - WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); - WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); - WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); - WASM_IMPORT_FUNC (i, trace, hfs, 500); - WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); - WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); - - WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); - - // clang-format on + setCommonHostFunctions(hfs, i); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); } return i; diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/misc/WasmVM.h index c4db2fedd5d..d4a9072740a 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/misc/WasmVM.h @@ -34,6 +34,8 @@ static std::string_view const W_ALLOC = "allocate"; static std::string_view const W_DEALLOC = "deallocate"; static std::string_view const W_PROC_EXIT = "proc_exit"; +static std::string_view const ESCROW_FUNCTION_NAME = "finish"; + uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 class WamrEngine; @@ -92,7 +94,7 @@ createWasmImport(HostFunctions* hfs); Expected runEscrowWasm( Bytes const& wasmCode, - std::string_view funcName, + std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, HostFunctions* hfs = nullptr, int64_t gasLimit = -1, @@ -101,7 +103,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - std::string_view funcName, + std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, HostFunctions* hfs = nullptr, beast::Journal j = beast::Journal(beast::Journal::getNullSink())); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index c993d8ba593..f0389c06ad9 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -232,7 +232,8 @@ EscrowCreate::preflight(PreflightContext const& ctx) } HostFunctions mock; - auto const re = preflightEscrowWasm(code, "finish", {}, &mock, ctx.j); + auto const re = + preflightEscrowWasm(code, ESCROW_FUNCTION_NAME, {}, &mock, ctx.j); if (!isTesSuccess(re)) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; @@ -1266,7 +1267,6 @@ EscrowFinish::doApply() // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("finish"); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); @@ -1276,8 +1276,8 @@ EscrowFinish::doApply() return tecINTERNAL; } std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = - runEscrowWasm(wasm, funcName, {}, &ledgerDataProvider, allowance); + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (re.has_value()) { From c15947da56b01a27b0234cfa960d0ba2dbc043a0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 6 Aug 2025 12:41:12 -0400 Subject: [PATCH 048/212] fix CI --- .github/actions/dependencies/action.yml | 5 +++++ .github/workflows/macos.yml | 5 +++++ .github/workflows/windows.yml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/.github/actions/dependencies/action.yml b/.github/actions/dependencies/action.yml index e32d8934ba6..51b0080899a 100644 --- a/.github/actions/dependencies/action.yml +++ b/.github/actions/dependencies/action.yml @@ -6,6 +6,11 @@ inputs: runs: using: composite steps: + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: add Conan remote if: env.CONAN_URL != '' shell: bash diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8fea7c6fc22..371944fd946 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -87,6 +87,11 @@ jobs: echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: build dependencies uses: ./.github/actions/dependencies with: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 4922c7d6bdc..a56a74a498d 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -82,6 +82,11 @@ jobs: echo "${CONAN_GLOBAL_CONF}" > $(conan config home)/global.conf conan config install conan/profiles/ -tf $(conan config home)/profiles/ conan profile show + - name: export custom recipes + shell: bash + # TODO: add WAMR to conan center index + # This is a workaround until WAMR is available in conan center + run: conan export --version 2.4.1 external/wamr - name: build dependencies uses: ./.github/actions/dependencies with: From 5dc0cee28a2f35e01e7874401aaaf9f513387033 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 11 Aug 2025 15:52:21 -0400 Subject: [PATCH 049/212] cache data instead of setting it in `updateData` (#5642) Co-authored-by: Oleksandr <115580134+oleks-rip@users.noreply.github.com> --- src/test/app/WasmHostFuncImpl_test.cpp | 8 -------- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 6 +----- src/xrpld/app/misc/WasmHostFuncImpl.h | 7 +++++++ src/xrpld/app/tx/detail/Escrow.cpp | 6 ++++++ 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index 2f19b7dc30f..b8d86f375bc 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -1373,14 +1373,6 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(!tooBig.has_value())) BEAST_EXPECT( tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); - - // Should fail if ledger object not found (use a bogus keylet) - auto const bogusKeylet = keylet::escrow(env.master, 999999); - WasmHostFunctionsImpl hfs2(ac, bogusKeylet); - auto const notFound = hfs2.updateData(Slice(data.data(), data.size())); - if (BEAST_EXPECT(!notFound.has_value())) - BEAST_EXPECT( - notFound.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } void diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 4adb99a4472..1b95a0dbf38 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -453,11 +453,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) { return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto sle = ctx.view().peek(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - sle->setFieldVL(sfData, data); - ctx.view().update(sle); + data_ = Bytes(data.begin(), data.end()); return 0; } diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/misc/WasmHostFuncImpl.h index a6051bb1c74..a56c2379436 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/misc/WasmHostFuncImpl.h @@ -32,6 +32,7 @@ class WasmHostFunctionsImpl : public HostFunctions static int constexpr MAX_CACHE = 256; std::array, MAX_CACHE> cache; + std::optional data_; void const* rt_ = nullptr; @@ -75,6 +76,12 @@ class WasmHostFunctionsImpl : public HostFunctions return ctx.journal; } + std::optional const& + getData() const + { + return data_; + } + Expected getLedgerSqn() override; diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index f0389c06ad9..9ba02cc877f 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1279,6 +1279,12 @@ EscrowFinish::doApply() auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; + + if (auto const& data = ledgerDataProvider.getData(); data.has_value()) + { + slep->setFieldVL(sfData, makeSlice(*data)); + } + if (re.has_value()) { auto reValue = re.value().result; From 0d0e279ae226309746bb38591f72235b67fcd455 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:21:21 -0400 Subject: [PATCH 050/212] Float point Hostfunctions unit tests (#5656) * Added direct unittests for float hostfunctions --- include/xrpl/protocol/IOUAmount.h | 7 + src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/test/app/WasmHostFuncImpl_test.cpp | 999 +++++++++++++++++++++--- src/xrpld/app/misc/WasmHostFuncImpl.cpp | 103 ++- 4 files changed, 992 insertions(+), 127 deletions(-) diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index 93fba4150d7..c9838a6a804 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -58,6 +58,13 @@ class IOUAmount : private boost::totally_ordered, normalize(); public: + /* The range for the mantissa when normalized */ + static std::int64_t constexpr minMantissa = 1000000000000000ull; + static std::int64_t constexpr maxMantissa = 9999999999999999ull; + /* The range for the exponent when normalized */ + static int constexpr minExponent = -96; + static int constexpr maxExponent = 80; + IOUAmount() = default; explicit IOUAmount(Number const& other); IOUAmount(beast::Zero); diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 9bd1ceb5eb3..b4f3f18e2e1 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -58,13 +58,6 @@ setSTNumberSwitchover(bool v) *getStaticSTNumberSwitchover() = v; } -/* The range for the mantissa when normalized */ -static std::int64_t constexpr minMantissa = 1000000000000000ull; -static std::int64_t constexpr maxMantissa = 9999999999999999ull; -/* The range for the exponent when normalized */ -static int constexpr minExponent = -96; -static int constexpr maxExponent = 80; - IOUAmount IOUAmount::minPositiveAmount() { @@ -312,7 +305,8 @@ mulRatio( { if (!result) { - return IOUAmount(-minMantissa, minExponent); + return IOUAmount( + -IOUAmount::minMantissa, IOUAmount::minExponent); } // This subtraction cannot underflow because `result` is not zero return IOUAmount(result.mantissa() - 1, result.exponent()); diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/WasmHostFuncImpl_test.cpp index b8d86f375bc..bab142391d1 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/WasmHostFuncImpl_test.cpp @@ -323,44 +323,21 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const account = hfs.getTxField(sfAccount); BEAST_EXPECT( - account.has_value() && - std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + account && std::ranges::equal(*account, env.master.id())); auto const owner = hfs.getTxField(sfOwner); - BEAST_EXPECT( - owner.has_value() && - std::equal( - owner.value().begin(), - owner.value().end(), - env.master.id().data())); + BEAST_EXPECT(owner && std::ranges::equal(*owner, env.master.id())); auto const txType = hfs.getTxField(sfTransactionType); - BEAST_EXPECT( - txType.has_value() && - std::equal( - txType.value().begin(), - txType.value().end(), - toBytes(ttESCROW_FINISH).begin())); + BEAST_EXPECT(txType && *txType == toBytes(ttESCROW_FINISH)); auto const offerSeq = hfs.getTxField(sfOfferSequence); - BEAST_EXPECT( - offerSeq.has_value() && - std::equal( - offerSeq.value().begin(), - offerSeq.value().end(), - toBytes(env.seq(env.master)).begin())); + BEAST_EXPECT(offerSeq && *offerSeq == toBytes(env.seq(env.master))); auto const compAllowance = hfs.getTxField(sfComputationAllowance); std::uint32_t const expectedAllowance = 1000; BEAST_EXPECT( - compAllowance.has_value() && - std::equal( - compAllowance.value().begin(), - compAllowance.value().end(), - toBytes(expectedAllowance).begin())); + compAllowance && *compAllowance == toBytes(expectedAllowance)); auto const notPresent = hfs.getTxField(sfDestination); if (BEAST_EXPECT(!notPresent.has_value())) @@ -396,20 +373,10 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto const asset = hfs.getTxField(sfAsset); std::vector expectedAsset(20, 0); - BEAST_EXPECT( - asset.has_value() && - std::equal( - asset.value().begin(), - asset.value().end(), - expectedAsset.begin())); + BEAST_EXPECT(asset && *asset == expectedAsset); auto const asset2 = hfs.getTxField(sfAsset2); - BEAST_EXPECT( - asset2.has_value() && - std::equal( - asset2.value().begin(), - asset2.value().end(), - toBytes(Asset(iouAsset)).begin())); + BEAST_EXPECT(asset2 && *asset2 == toBytes(Asset(iouAsset))); } { @@ -426,19 +393,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto const asset = hfs.getTxField(sfAsset); if (BEAST_EXPECT(asset.has_value())) { - BEAST_EXPECT(std::equal( - asset.value().begin(), - asset.value().end(), - toBytes(Asset(iouAsset)).begin())); + BEAST_EXPECT(*asset == toBytes(Asset(iouAsset))); } auto const asset2 = hfs.getTxField(sfAsset2); if (BEAST_EXPECT(asset2.has_value())) { - BEAST_EXPECT(std::equal( - asset2.value().begin(), - asset2.value().end(), - toBytes(Asset(mptId)).begin())); + BEAST_EXPECT(*asset2 == toBytes(Asset(mptId))); } } } @@ -472,19 +433,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECTS( account.has_value(), std::to_string(static_cast(account.error())))) - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Amount field from the escrow ledger object auto const amountField = hfs.getCurrentLedgerObjField(sfAmount); if (BEAST_EXPECT(amountField.has_value())) { - BEAST_EXPECT(std::equal( - amountField.value().begin(), - amountField.value().end(), - toBytes(XRP(100)).begin())); + BEAST_EXPECT(*amountField == toBytes(XRP(100))); } // Should return nullopt for a field not present @@ -536,19 +491,13 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECTS( account.has_value(), std::to_string(static_cast(account.error())))) - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Balance field from the cached ledger object auto const balanceField = hfs.getLedgerObjField(1, sfBalance); if (BEAST_EXPECT(balanceField.has_value())) { - BEAST_EXPECT(std::equal( - balanceField.value().begin(), - balanceField.value().end(), - toBytes(env.balance(env.master)).begin())); + BEAST_EXPECT(*balanceField == toBytes(env.balance(env.master))); } // Should return error for slot out of range @@ -633,10 +582,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite account.has_value(), std::to_string(static_cast(account.error())))) { - BEAST_EXPECT(std::equal( - account.value().begin(), - account.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); } } @@ -744,10 +690,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite signerQuorum.has_value(), std::to_string(static_cast(signerQuorum.error())))) { - BEAST_EXPECT(std::equal( - signerQuorum.value().begin(), - signerQuorum.value().end(), - toBytes(static_cast(2)).begin())); + BEAST_EXPECT(*signerQuorum == toBytes(static_cast(2))); } auto expectError = [&](std::vector const& locatorVec, @@ -848,10 +791,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite result.has_value(), std::to_string(static_cast(result.error())))) { - BEAST_EXPECT(std::equal( - result.value().begin(), - result.value().end(), - alice.id().data())); + BEAST_EXPECT(std::ranges::equal(*result, alice.id())); } } @@ -867,10 +807,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite result2.has_value(), std::to_string(static_cast(result2.error())))) { - BEAST_EXPECT(std::equal( - result2.value().begin(), - result2.value().end(), - becky.id().data())); + BEAST_EXPECT(std::ranges::equal(*result2, becky.id())); } } @@ -888,10 +825,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { // Should be 1 auto const expected = toBytes(static_cast(1)); - BEAST_EXPECT(std::equal( - weightResult.value().begin(), - weightResult.value().end(), - expected.begin())); + BEAST_EXPECT(*weightResult == expected); } } @@ -907,10 +841,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite std::to_string(static_cast(quorumResult.error())))) { auto const expected = toBytes(static_cast(2)); - BEAST_EXPECT(std::equal( - quorumResult.value().begin(), - quorumResult.value().end(), - expected.begin())); + BEAST_EXPECT(*quorumResult == expected); } } @@ -1499,8 +1430,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite auto compareKeylet = [](std::vector const& bytes, Keylet const& kl) { - return bytes.size() == kl.key.size() && - std::equal(bytes.begin(), bytes.end(), kl.key.begin()); + return std::ranges::equal(bytes, kl.key); }; // Lambda to compare a Bytes (std::vector) to a keylet #define COMPARE_KEYLET(hfsFunc, keyletFunc, ...) \ @@ -1755,8 +1685,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFT(alice.id(), nftId); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(std::equal( - result.value().begin(), result.value().end(), uri.data())); + BEAST_EXPECT(std::ranges::equal(*result, uri)); } // Should fail for invalid account @@ -1816,10 +1745,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFTIssuer(nftId); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(std::equal( - result.value().begin(), - result.value().end(), - env.master.id().data())); + BEAST_EXPECT(std::ranges::equal(*result, env.master.id())); } // Should fail for zero NFT id @@ -2010,6 +1936,886 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } + // clang-format off + + int const normalExp = 15; + + Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 + Bytes const floatIntZero = {0xd8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 + Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 + Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 + Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) + Bytes const floatPreMaxExp = {0xEC, 0x03, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(79+15) + Bytes const floatMinusMaxExp = {0xAC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1e(80+15) + Bytes const floatMaxIOU = {0xEC, 0x63, 0x86, 0xF2, 0x6F, 0xC0, 0xFF, 0xFF}; // 1e(81+15)-1 + Bytes const floatMinExp = {0xC0, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e-96 + Bytes const float1 = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1 + Bytes const floatMinus1 = {0x94, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1 + Bytes const float1More = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x01}; // 1.000 000 000 000 001 + Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 + Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 + Bytes const floatMaxXRP = {0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + Bytes const floatMaxMPT = {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + + std::string const invalid = "invalid_data"; + + // clang-format on + + void + testFloatTrace() + { + testcase("FloatTrace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + { + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); + BEAST_EXPECT( + result && + *result == + msg.size() + 14 /* error msg size*/ + invalid.size() * 2); + } + + { + auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + BEAST_EXPECT( + result && *result == msg.size() + 19 /* string represenation*/); + } + } + + void + testFloatFromInt() + { + testcase("FloatFromInt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatFromInt(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMax); + } + } + + void + testFloatFromUint() + { + testcase("FloatFromUint"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatFromUint(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatUIntMax); + } + } + + void + testFloatSet() + { + testcase("FloatSet"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSet(1, 0, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSet(1, 0, 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSet(1, Number::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + + { + auto const result = + hfs.floatSet(-1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + + { + auto const result = + hfs.floatSet(IOUAmount::maxMantissa, IOUAmount::maxExponent, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinExp); + } + + { + auto const result = hfs.floatSet(10, -1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + } + + void + testFloatCompare() + { + testcase("FloatCompare"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatCompare(Slice(), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto x = floatMaxExp; + // exp = 81 + 97 = 178 + x[1] |= 0x80; + x[1] &= 0xBF; + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(floatMaxExp)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMin), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 2); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMax), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 1); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(float1)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 0); + } + } + + void + testFloatAdd() + { + testcase("floatAdd"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatAdd(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatAdd(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxIOU), makeSlice(floatMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatAdd( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatIntMax), makeSlice(floatIntMin), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + } + + void + testFloatSubtract() + { + testcase("floatSubtract"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSubtract(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatMaxIOU), makeSlice(floatMinusMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinus1); + } + } + + void + testFloatMultiply() + { + testcase("floatMultiply"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatMaxIOU), makeSlice(float1More), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatIntZero), makeSlice(floatMaxIOU), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(float10), makeSlice(floatPreMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + } + + void + testFloatDivide() + { + testcase("floatDivide"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatDivide(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatDivide(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(floatIntZero), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const y = hfs.floatSet( + IOUAmount::maxMantissa, -normalExp - 1, 0); // 0.9999999... + if (BEAST_EXPECT(y)) + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxIOU), makeSlice(*y), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxExp), makeSlice(float10), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + } + + void + testFloatRoot() + { + testcase("floatRoot"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatRoot(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatIntZero), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 3, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = hfs.floatSet(1, -1, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatPower() + { + testcase("floatPower"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatPower(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatPower(makeSlice(floatMaxIOU), 40000, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatPower(makeSlice(float10), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(1, -1, 0); // 0.1 + auto const y = hfs.floatSet(1, -2, 0); // 0.01 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatPower(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatLog() + { + testcase("floatLog"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatLog(Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatLog(makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const x = + hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(floatMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float2); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + auto const y = hfs.floatSet(3, 0, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = + hfs.floatSet(-1999999993734431, -15, 0); // almost -2 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatNonIOU() + { + testcase("Float Xrp+Mpt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const y = hfs.floatSet(20, 0, 0); + if (!BEAST_EXPECT(y)) + return; + + Bytes x(8); + + // XRP + memset(x.data(), 0, x.size()); + x[0] = 0x40; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(result && *result == 0); + } + + { + auto const result = + hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = + hfs.floatCompare(makeSlice(*result), makeSlice(*y)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + // underflow + x[7] = 1; + { + auto const result = + hfs.floatDivide(makeSlice(x), makeSlice(float1More), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatMaxXRP), makeSlice(floatIntZero), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = hfs.floatCompare( + makeSlice(*result), makeSlice(floatIntZero)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + // overflow + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxXRP), makeSlice(float1), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + // MPT + memset(x.data(), 0, x.size()); + x[0] = 0x60; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(result && *result == 0); + } + + { + auto const result = + hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); + if (BEAST_EXPECT(result)) + { + auto const result2 = + hfs.floatCompare(makeSlice(*result), makeSlice(*y)); + BEAST_EXPECT(result2 && *result2 == 0); + } + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxMPT), makeSlice(float1), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + } + + void + testFloats() + { + testFloatFromInt(); + testFloatFromUint(); + testFloatSet(); + testFloatCompare(); + testFloatAdd(); + testFloatSubtract(); + testFloatMultiply(); + testFloatDivide(); + testFloatRoot(); + testFloatPower(); + testFloatLog(); + testFloatNonIOU(); + testFloatTrace(); + } + void run() override { @@ -2045,6 +2851,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite testGetNFTSerial(); testTrace(); testTraceNum(); + testFloats(); } }; diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/misc/WasmHostFuncImpl.cpp index 1b95a0dbf38..ed5417ce0fa 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/misc/WasmHostFuncImpl.cpp @@ -825,9 +825,11 @@ WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) class Number2 : public Number { - bool good_; - +public: enum Issue { XRP, MPT, IOU }; + +protected: + bool good_; Issue issue_; public: @@ -847,8 +849,9 @@ class Number2 : public Number int32_t const e = static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); int64_t const m = neg * (v & ((1ull << 54) - 1)); - x = !m ? Number() : Number(m, e - 97); - if (m && (x.exponent() > 80 || x.exponent() < -96)) + x = !m || (e < 1) ? Number() + : Number(m, e + IOUAmount::minExponent - 1); + if (m && (x.exponent() > IOUAmount::maxExponent)) return; // invalid number issue_ = IOU; } @@ -871,6 +874,10 @@ class Number2 : public Number good_ = true; } + Number2() : Number(), good_(true), issue_(IOU) + { + } + Number2(int64_t x) : Number(x), good_(true), issue_(IOU) { } @@ -904,6 +911,18 @@ class Number2 : public Number return good_; } + Issue + getIssue() const + { + return issue_; + } + + void + setIssue(Issue i) + { + issue_ = i; + } + Expected toBytes() const { @@ -917,18 +936,24 @@ class Number2 : public Number { if (exponent() != std::numeric_limits::lowest()) return Unexpected( - HostFunctionError::FLOAT_COMPUTATION_ERROR); + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } - else if (exponent() > 80 || exponent() < -96) + else if (exponent() > IOUAmount::maxExponent) return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return Number2().toBytes(); uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); if (absM > ((1ull << 54) - 1)) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + return Unexpected( + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE v |= absM; - int const e = (!mantissa() ? 0 : exponent()) + 97; + int const e = + (!mantissa() ? 0 : exponent()) - IOUAmount::minExponent + 1; v |= ((uint64_t)e) << 54; } else if (issue_ == MPT) @@ -950,6 +975,16 @@ class Number2 : public Number Serializer msg; msg.add64(v); auto const data = msg.getData(); + +#ifdef DEBUG_OUTPUT + std::cout << "m: " << std::setw(20) << mantissa() + << ", e: " << std::setw(12) << exponent() << ", hex: "; + std::cout << std::hex << std::uppercase << std::setfill('0'); + for (auto const& c : data) + std::cout << std::setw(2) << (unsigned)c << " "; + std::cout << std::dec << std::setfill(' ') << std::endl; +#endif + return data; } @@ -958,7 +993,7 @@ class Number2 : public Number toUInt(unsigned bits) const { if (bits >= sizeof(uint64_t) * 8) - return std::numeric_limits::max(); + return std::numeric_limits::max(); // LCOV_EXCL_LINE uint64_t maxV = (1ull << bits) - 1; uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); @@ -969,8 +1004,9 @@ class Number2 : public Number { for (int i = 0; i > exponent(); --i) { + // underflow if (absM < 10) - return std::numeric_limits::max(); // underflow + return std::numeric_limits::max(); absM /= 10; } } @@ -978,8 +1014,9 @@ class Number2 : public Number { for (int i = 0; i < exponent(); ++i) { + // overflow if (absM > maxV / 10) - return std::numeric_limits::max(); // overflow + return std::numeric_limits::max(); absM *= 10; } } @@ -1041,15 +1078,14 @@ floatFromIntImpl(int64_t x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(x); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return num.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1062,15 +1098,14 @@ floatFromUintImpl(uint64_t x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(x); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return num.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1082,8 +1117,6 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 num(mantissa, exponent); - if (!num) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); return num.toBytes(); } catch (...) @@ -1105,10 +1138,12 @@ floatCompareImpl(Slice const& x, Slice const& y) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); return xx < yy ? 2 : (xx == yy ? 0 : 1); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1127,12 +1162,15 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx + yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1150,12 +1188,15 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx - yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1173,12 +1214,15 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx * yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1196,6 +1240,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx / yy; + res.setIssue(xx.getIssue()); return res.toBytes(); } catch (...) @@ -1209,6 +1254,9 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) { try { + if (n < 1) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + SetRound rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -1216,14 +1264,17 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 const res(root(xx, n)); + Number2 res(root(xx, n)); + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected @@ -1231,6 +1282,9 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { + if (n < 0) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + SetRound rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -1241,8 +1295,8 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) if (xx == Number() && !n) return Unexpected(HostFunctionError::INVALID_PARAMS); - Number2 const res(power(xx, n, 1)); - + Number2 res(power(xx, n, 1)); + res.setIssue(xx.getIssue()); return res.toBytes(); } catch (...) @@ -1263,14 +1317,17 @@ floatLogImpl(Slice const& x, int32_t mode) Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 const res(lg(xx)); + Number2 res(lg(xx)); + res.setIssue(xx.getIssue()); return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } } // namespace ripple From 1d141bf2e834e85acd312aa5c64ec2115d16c221 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 14 Aug 2025 11:46:10 -0400 Subject: [PATCH 051/212] chore: move WASM files to separate folder (#5666) --- src/test/app/Escrow_test.cpp | 2 +- .../{WasmHostFuncImpl_test.cpp => HostFuncImpl_test.cpp} | 6 +++--- src/test/app/TestHostFunctions.h | 4 ++-- src/test/app/Wasm_test.cpp | 4 ++-- src/xrpld/app/tx/detail/Escrow.cpp | 4 ++-- src/xrpld/app/{misc/WasmHostFunc.h => wasm/HostFunc.h} | 2 +- .../app/{misc/WasmHostFuncImpl.h => wasm/HostFuncImpl.h} | 2 +- .../{misc/WasmHostFuncWrapper.h => wasm/HostFuncWrapper.h} | 2 +- .../app/{misc/WasmParamsHelper.h => wasm/ParamsHelper.h} | 0 src/xrpld/app/{misc => wasm}/WamrVM.h | 2 +- src/xrpld/app/{misc => wasm}/WasmVM.h | 2 +- .../WasmHostFuncImpl.cpp => wasm/detail/HostFuncImpl.cpp} | 2 +- .../detail/HostFuncWrapper.cpp} | 6 +++--- src/xrpld/app/{misc => wasm/detail}/WamrVM.cpp | 2 +- src/xrpld/app/{misc => wasm/detail}/WasmVM.cpp | 6 +++--- 15 files changed, 23 insertions(+), 23 deletions(-) rename src/test/app/{WasmHostFuncImpl_test.cpp => HostFuncImpl_test.cpp} (99%) rename src/xrpld/app/{misc/WasmHostFunc.h => wasm/HostFunc.h} (99%) rename src/xrpld/app/{misc/WasmHostFuncImpl.h => wasm/HostFuncImpl.h} (99%) rename src/xrpld/app/{misc/WasmHostFuncWrapper.h => wasm/HostFuncWrapper.h} (99%) rename src/xrpld/app/{misc/WasmParamsHelper.h => wasm/ParamsHelper.h} (100%) rename src/xrpld/app/{misc => wasm}/WamrVM.h (99%) rename src/xrpld/app/{misc => wasm}/WasmVM.h (98%) rename src/xrpld/app/{misc/WasmHostFuncImpl.cpp => wasm/detail/HostFuncImpl.cpp} (99%) rename src/xrpld/app/{misc/WasmHostFuncWrapper.cpp => wasm/detail/HostFuncWrapper.cpp} (99%) rename src/xrpld/app/{misc => wasm/detail}/WamrVM.cpp (99%) rename src/xrpld/app/{misc => wasm/detail}/WasmVM.cpp (98%) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 640743a8699..c07f3edd61c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -20,8 +20,8 @@ #include #include -#include #include +#include #include #include diff --git a/src/test/app/WasmHostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp similarity index 99% rename from src/test/app/WasmHostFuncImpl_test.cpp rename to src/test/app/HostFuncImpl_test.cpp index bab142391d1..980d8d2b436 100644 --- a/src/test/app/WasmHostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -19,7 +19,7 @@ #include -#include +#include namespace ripple { namespace test { @@ -86,7 +86,7 @@ createApplyContext( return ac; } -struct WasmHostFuncImpl_test : public beast::unit_test::suite +struct HostFuncImpl_test : public beast::unit_test::suite { void testGetLedgerSqn() @@ -2855,7 +2855,7 @@ struct WasmHostFuncImpl_test : public beast::unit_test::suite } }; -BEAST_DEFINE_TESTSUITE(WasmHostFuncImpl, app, ripple); +BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, ripple); } // namespace test } // namespace ripple diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 562d2091a07..2d7793463fd 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -21,9 +21,9 @@ #include #include -#include -#include #include +#include +#include #include namespace ripple { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c8db385c670..002dc22ac4f 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -23,8 +23,8 @@ #include -#include -#include +#include +#include namespace ripple { namespace test { diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 9ba02cc877f..4b5a92e8c2b 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -19,10 +19,10 @@ #include #include -#include -#include #include #include +#include +#include #include #include #include diff --git a/src/xrpld/app/misc/WasmHostFunc.h b/src/xrpld/app/wasm/HostFunc.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFunc.h rename to src/xrpld/app/wasm/HostFunc.h index cd1848a5227..865ce49fb36 100644 --- a/src/xrpld/app/misc/WasmHostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncImpl.h rename to src/xrpld/app/wasm/HostFuncImpl.h index a56c2379436..4067afccb47 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -19,8 +19,8 @@ #pragma once -#include #include +#include namespace ripple { class WasmHostFunctionsImpl : public HostFunctions diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncWrapper.h rename to src/xrpld/app/wasm/HostFuncWrapper.h index aac8ba387ea..a6cbd91b188 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -19,7 +19,7 @@ #pragma once -#include +#include namespace ripple { diff --git a/src/xrpld/app/misc/WasmParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h similarity index 100% rename from src/xrpld/app/misc/WasmParamsHelper.h rename to src/xrpld/app/wasm/ParamsHelper.h diff --git a/src/xrpld/app/misc/WamrVM.h b/src/xrpld/app/wasm/WamrVM.h similarity index 99% rename from src/xrpld/app/misc/WamrVM.h rename to src/xrpld/app/wasm/WamrVM.h index 3be35c673ee..a32257feb6c 100644 --- a/src/xrpld/app/misc/WamrVM.h +++ b/src/xrpld/app/wasm/WamrVM.h @@ -18,7 +18,7 @@ //============================================================================== #pragma once -#include +#include #include #include diff --git a/src/xrpld/app/misc/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h similarity index 98% rename from src/xrpld/app/misc/WasmVM.h rename to src/xrpld/app/wasm/WasmVM.h index d4a9072740a..32eb239f609 100644 --- a/src/xrpld/app/misc/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -18,7 +18,7 @@ //============================================================================== #pragma once -#include +#include #include diff --git a/src/xrpld/app/misc/WasmHostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncImpl.cpp rename to src/xrpld/app/wasm/detail/HostFuncImpl.cpp index ed5417ce0fa..d619c6e58f4 100644 --- a/src/xrpld/app/misc/WasmHostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -18,8 +18,8 @@ //============================================================================== #include -#include #include +#include #include #include diff --git a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp similarity index 99% rename from src/xrpld/app/misc/WasmHostFuncWrapper.cpp rename to src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 6fb7b0c58c0..20b52e418f8 100644 --- a/src/xrpld/app/misc/WasmHostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -17,10 +17,10 @@ */ //============================================================================== -#include -#include -#include #include +#include +#include +#include #include #include diff --git a/src/xrpld/app/misc/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp similarity index 99% rename from src/xrpld/app/misc/WamrVM.cpp rename to src/xrpld/app/wasm/detail/WamrVM.cpp index 3f0bd1d95fb..d7cf9aa78da 100644 --- a/src/xrpld/app/misc/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -17,7 +17,7 @@ */ //============================================================================== -#include +#include #include diff --git a/src/xrpld/app/misc/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp similarity index 98% rename from src/xrpld/app/misc/WasmVM.cpp rename to src/xrpld/app/wasm/detail/WasmVM.cpp index d815c9939d1..7d20f67fa12 100644 --- a/src/xrpld/app/misc/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -21,9 +21,9 @@ // #define DEBUG_OUTPUT 1 #endif -#include -#include -#include +#include +#include +#include #include #include From b0a1ad3b06f5c72a6803a476f5389cf2c2da29b3 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:59:55 -0400 Subject: [PATCH 052/212] Disable float point instructions (#5679) --- external/wamr/conanfile.py | 10 +- external/wamr/patches/ripp_metering.patch | 217 +++++++++++++++++++++- src/test/app/Wasm_test.cpp | 31 ++++ src/test/app/wasm_fixtures/fixtures.cpp | 12 ++ src/test/app/wasm_fixtures/fixtures.h | 2 + 5 files changed, 264 insertions(+), 8 deletions(-) diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index eed674adefc..429c509795f 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -55,13 +55,15 @@ def generate(self): tc.variables["WAMR_BUILD_AOT"] = 0 tc.variables["WAMR_BUILD_JIT"] = 0 tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_BUILD_SIMD"] = 0 + tc.variables["WAMR_BUILD_LIB_PTHREAD"] = 0 + tc.variables["WAMR_BUILD_LIB_WASI_THREADS"] = 0 + tc.variables["WAMR_BUILD_TAIL_CALL"] = 1 + tc.variables["WAMR_BUILD_BULK_MEMORY"] = 0 tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" - # tc.variables["WAMR_BUILD_FAST_JIT"] = 0 if self.settings.os == "Windows" else 1 - # ll_dep = self.dependencies["llvm"] - # self.output.info(f"-----------package_folder: {type(ll_dep.__dict__)}") - # tc.variables["LLVM_DIR"] = os.path.join(ll_dep.package_folder, "lib", "cmake", "llvm") + tc.generate() # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch index 9749d475da9..2e8ec70d7a8 100644 --- a/external/wamr/patches/ripp_metering.patch +++ b/external/wamr/patches/ripp_metering.patch @@ -462,7 +462,7 @@ index edc473f2..55071613 100644 #if WASM_ENABLE_LABELS_AS_VALUES == 0 diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 36d4538f..912be3d8 100644 +index 36d4538f..4d03603e 100644 --- a/core/iwasm/interpreter/wasm_interp_fast.c +++ b/core/iwasm/interpreter/wasm_interp_fast.c @@ -90,14 +90,14 @@ typedef float64 CellType_F64; @@ -539,7 +539,216 @@ index 36d4538f..912be3d8 100644 #endif #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 -@@ -7672,6 +7670,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -4012,7 +4010,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + + /* constant instructions */ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_F64_CONST) ++#else ++ HANDLE_OP(WASM_OP_F64_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I64_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4025,7 +4031,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ HANDLE_OP(WASM_OP_F32_CONST) ++#else + HANDLE_OP(WASM_OP_F32_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I32_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4172,6 +4186,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* comparison instructions of f32 */ + HANDLE_OP(WASM_OP_F32_EQ) + { +@@ -4245,6 +4261,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_CMP(float64, F64, >=); + HANDLE_OP_END(); + } ++#else ++ HANDLE_OP(WASM_OP_F32_EQ) ++ HANDLE_OP(WASM_OP_F32_NE) ++ HANDLE_OP(WASM_OP_F32_LT) ++ HANDLE_OP(WASM_OP_F32_GT) ++ HANDLE_OP(WASM_OP_F32_LE) ++ HANDLE_OP(WASM_OP_F32_GE) ++ HANDLE_OP(WASM_OP_F64_EQ) ++ HANDLE_OP(WASM_OP_F64_NE) ++ HANDLE_OP(WASM_OP_F64_LT) ++ HANDLE_OP(WASM_OP_F64_GT) ++ HANDLE_OP(WASM_OP_F64_LE) ++ HANDLE_OP(WASM_OP_F64_GE) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + + /* numeric instructions of i32 */ + HANDLE_OP(WASM_OP_I32_CLZ) +@@ -4573,6 +4607,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* numeric instructions of f32 */ + HANDLE_OP(WASM_OP_F32_ABS) + { +@@ -4784,6 +4820,43 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_F32_ABS) ++ HANDLE_OP(WASM_OP_F32_NEG) ++ HANDLE_OP(WASM_OP_F32_CEIL) ++ HANDLE_OP(WASM_OP_F32_FLOOR) ++ HANDLE_OP(WASM_OP_F32_TRUNC) ++ HANDLE_OP(WASM_OP_F32_NEAREST) ++ HANDLE_OP(WASM_OP_F32_SQRT) ++ HANDLE_OP(WASM_OP_F32_ADD) ++ HANDLE_OP(WASM_OP_F32_SUB) ++ HANDLE_OP(WASM_OP_F32_MUL) ++ HANDLE_OP(WASM_OP_F32_DIV) ++ HANDLE_OP(WASM_OP_F32_MIN) ++ HANDLE_OP(WASM_OP_F32_MAX) ++ HANDLE_OP(WASM_OP_F32_COPYSIGN) ++ HANDLE_OP(WASM_OP_F64_ABS) ++ HANDLE_OP(WASM_OP_F64_NEG) ++ HANDLE_OP(WASM_OP_F64_CEIL) ++ HANDLE_OP(WASM_OP_F64_FLOOR) ++ HANDLE_OP(WASM_OP_F64_TRUNC) ++ HANDLE_OP(WASM_OP_F64_NEAREST) ++ HANDLE_OP(WASM_OP_F64_SQRT) ++ HANDLE_OP(WASM_OP_F64_ADD) ++ HANDLE_OP(WASM_OP_F64_SUB) ++ HANDLE_OP(WASM_OP_F64_MUL) ++ HANDLE_OP(WASM_OP_F64_DIV) ++ HANDLE_OP(WASM_OP_F64_MIN) ++ HANDLE_OP(WASM_OP_F64_MAX) ++ HANDLE_OP(WASM_OP_F64_COPYSIGN) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i32 */ + HANDLE_OP(WASM_OP_I32_WRAP_I64) + { +@@ -4792,6 +4865,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) + { + /* We don't use INT32_MIN/INT32_MAX/UINT32_MIN/UINT32_MAX, +@@ -4821,6 +4896,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i64 */ + HANDLE_OP(WASM_OP_I64_EXTEND_S_I32) + { +@@ -4834,6 +4922,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) + { + DEF_OP_TRUNC_F32(-9223373136366403584.0f, +@@ -4937,6 +5027,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F32_DEMOTE_F64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F64_PROMOTE_F32) ++ HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) ++ HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) ++ HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) ++ HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + HANDLE_OP(EXT_OP_COPY_STACK_TOP) + { + addr1 = GET_OFFSET(); +@@ -5108,6 +5224,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + GET_OPCODE(); + switch (opcode) { ++ ++#ifdef ENABLE_FLOAT_POINT + case WASM_OP_I32_TRUNC_SAT_S_F32: + DEF_OP_TRUNC_SAT_F32(-2147483904.0f, 2147483648.0f, + true, true); +@@ -5140,6 +5258,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, + false, false); + break; ++ ++#endif ++ + #if WASM_ENABLE_BULK_MEMORY != 0 + case WASM_OP_MEMORY_INIT: + { +@@ -7672,6 +7793,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, { wasm_interp_call_func_native(module, exec_env, cur_func, prev_frame); @@ -547,7 +756,7 @@ index 36d4538f..912be3d8 100644 } #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7784,6 +7783,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7784,6 +7906,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, FREE_FRAME(exec_env, frame); wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); @@ -559,7 +768,7 @@ index 36d4538f..912be3d8 100644 if (!prev_frame->ip) /* Called from native. */ return; -@@ -7812,6 +7816,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, +@@ -7812,6 +7939,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, got_exception: SYNC_ALL_TO_FRAME(); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 002dc22ac4f..b423153a8a3 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -677,6 +677,35 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(re->result); } + void + testDisabledFloat() + { + testcase("disabled float"); + + using namespace test::jtx; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(disabledFloatHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestHostFunctions hfs(env, 0); + + { + // f32 set constant, opcode disabled exception + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + } + + { + // f32 add, can't create module exception + wasm[0x117] = 0x92; + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + } + } + void run() override { @@ -704,6 +733,8 @@ struct Wasm_test : public beast::unit_test::suite testCodecovWasm(); + testDisabledFloat(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index eb3e894d91f..4a8e0e73855 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12410,3 +12410,15 @@ extern std::string const floatHex = "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" "2d74797065732b087369676e2d657874"; + +extern std::string const disabledFloatHex = + "0061736d010000000108026000006000017f03030200010503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a150202000b100043000000c54300200045921a41010b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 3ffb41caf9a..948646404ae 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -62,3 +62,5 @@ extern std::string const keyletHostFunctions; extern std::string const codecovWasm; extern std::string const floatHex; + +extern std::string const disabledFloatHex; From 647b47567e6be5ecc2ed647398fb32552951ccf1 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 15 Aug 2025 09:51:40 -0400 Subject: [PATCH 053/212] Fix float point binary format (#5688) --- src/test/app/HostFuncImpl_test.cpp | 69 ++------ src/test/app/Wasm_test.cpp | 17 +- src/test/app/wasm_fixtures/fixtures.cpp | 43 +++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 193 ++++++--------------- 5 files changed, 132 insertions(+), 192 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 980d8d2b436..bd8ef8a3792 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1941,7 +1941,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite int const normalExp = 15; Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 - Bytes const floatIntZero = {0xd8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 + Bytes const floatIntZero = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) @@ -1954,8 +1954,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Bytes const float1More = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x01}; // 1.000 000 000 000 001 Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 - Bytes const floatMaxXRP = {0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 - Bytes const floatMaxMPT = {0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // 2^62-1 + Bytes const floatInvalidZero = {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // INVALID std::string const invalid = "invalid_data"; @@ -2187,6 +2186,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } + { + auto const result = + hfs.floatCompare(makeSlice(floatInvalidZero), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + { auto const result = hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); @@ -2723,48 +2730,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT(result && *result == 0); - } - - { - auto const result = - hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = - hfs.floatCompare(makeSlice(*result), makeSlice(*y)); - BEAST_EXPECT(result2 && *result2 == 0); - } - } - - // underflow - x[7] = 1; - { - auto const result = - hfs.floatDivide(makeSlice(x), makeSlice(float1More), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); - } - - { - auto const result = hfs.floatMultiply( - makeSlice(floatMaxXRP), makeSlice(floatIntZero), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = hfs.floatCompare( - makeSlice(*result), makeSlice(floatIntZero)); - BEAST_EXPECT(result2 && *result2 == 0); - } + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } - // overflow { auto const result = - hfs.floatAdd(makeSlice(floatMaxXRP), makeSlice(float1), 0); + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } // MPT @@ -2775,26 +2751,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT(result && *result == 0); - } - - { - auto const result = - hfs.floatAdd(makeSlice(x), makeSlice(float10), 0); - if (BEAST_EXPECT(result)) - { - auto const result2 = - hfs.floatCompare(makeSlice(*result), makeSlice(*y)); - BEAST_EXPECT(result2 && *result2 == 0); - } + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = - hfs.floatAdd(makeSlice(floatMaxMPT), makeSlice(float1), 0); + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); BEAST_EXPECT( !result && - result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b423153a8a3..4fb30242fb0 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -546,10 +546,18 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result && (re->cost == 91'412)); - } + BEAST_EXPECT(re && re->result && (re->cost == 91'412)); + env.close(); + } + + { + std::string const wasmHex = float0Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + BEAST_EXPECT(re && re->result && (re->cost == 6'533)); env.close(); } } @@ -732,7 +740,6 @@ struct Wasm_test : public beast::unit_test::suite testFloat(); testCodecovWasm(); - testDisabledFloat(); // perfTest(); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 4a8e0e73855..3424de7006c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -12411,6 +12411,49 @@ extern std::string const floatHex = "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" "2d74797065732b087369676e2d657874"; +extern std::string const float0Hex = + "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" + "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" + "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" + "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" + "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" + "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" + "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" + "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" + "7f23808080800041206b2200248080808000418080c08000411541004100" + "41001080808080001a200042003703084200200041086a41084100108180" + "8080001a20004200370310420a200041106a410841001081808080001a20" + "0042003703180240200041106a4108200041106a4108200041186a410841" + "001082808080004108460d00419580c08000411541004100410010808080" + "80001a0b02400240200041086a4108200041186a41081083808080000d00" + "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" + "41164100410041001080808080001a0b02400240200041086a410841d780" + "c0800041081083808080000d0041df80c08000411a410041004100108080" + "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" + "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" + "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" + "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" + "642020666c6f6174203020636f6d706172653a2062616480000000000000" + "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" + "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" + "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" + "72706c5f73746434686f7374357472616365313768616338383262323664" + "656162656436364501355f5a4e387872706c5f73746434686f7374313466" + "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" + "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" + "737562747261637431376864363430633135323334353432393563450334" + "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" + "72653137683663386465656231323864393638386645040666696e697368" + "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" + "7461004d0970726f64756365727302086c616e6775616765010452757374" + "000c70726f6365737365642d6279010572757374631d312e38392e302028" + "32393438333838336520323032352d30382d3034290094010f7461726765" + "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" + "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" + "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" + "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" + "6572656e63652d74797065732b087369676e2d657874"; + extern std::string const disabledFloatHex = "0061736d010000000108026000006000017f03030200010503010002063e" "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 948646404ae..f3fdf66aaef 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -63,4 +63,6 @@ extern std::string const codecovWasm; extern std::string const floatHex; +extern std::string const float0Hex; + extern std::string const disabledFloatHex; diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index d619c6e58f4..441caddd77b 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -825,84 +825,66 @@ WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) class Number2 : public Number { -public: - enum Issue { XRP, MPT, IOU }; - protected: + static Bytes const FLOAT_NULL; + bool good_; - Issue issue_; public: - Number2(Slice const& data) : Number(0), good_(false), issue_(IOU) + Number2(Slice const& data) : Number(), good_(false) { if (data.size() != 8) return; + if (std::ranges::equal(FLOAT_NULL, data)) + { + good_ = true; + return; + } + uint64_t const v = SerialIter(data).get64(); - int const neg = (v & STAmount::cPositive) ? 1 : -1; + if (!(v & STAmount::cIssuedCurrency)) + return; - Number x; + int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); + if (e < 1 || e > 177) + return; - if (v & STAmount::cIssuedCurrency) - { - // IOU - int32_t const e = - static_cast((v >> (64 - 10)) & ((1ull << 8) - 1)); - int64_t const m = neg * (v & ((1ull << 54) - 1)); - x = !m || (e < 1) ? Number() - : Number(m, e + IOUAmount::minExponent - 1); - if (m && (x.exponent() > IOUAmount::maxExponent)) - return; // invalid number - issue_ = IOU; - } - else if (v & STAmount::cMPToken) - { - // MPT - int64_t const m = neg * (v & ((1ull << 61) - 1)); - x = !m ? Number() : Number(m); - issue_ = MPT; - } - else - { - // XRP - int64_t const m = neg * (v & ((1ull << 61) - 1)); - x = !m ? Number() : Number(m); - issue_ = XRP; - } + int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); + if (!m) + return; + Number x(m, e + IOUAmount::minExponent - 1); *static_cast(this) = x; good_ = true; } - Number2() : Number(), good_(true), issue_(IOU) + Number2() : Number(), good_(true) { } - Number2(int64_t x) : Number(x), good_(true), issue_(IOU) + Number2(int64_t x) : Number(x), good_(true) { } - Number2(uint64_t x) : Number(0), good_(false), issue_(IOU) + Number2(uint64_t x) : Number(0), good_(false) { - if (x <= - std::numeric_limits< - std::invoke_result_t>:: - max()) - *static_cast(this) = Number(x); + using mtype = std::invoke_result_t; + if (x <= std::numeric_limits::max()) + *this = Number(x); else - { - *static_cast(this) = Number(x / 10, 1) + Number(x % 10); - } + *this = Number(x / 10, 1) + Number(x % 10); good_ = true; } Number2(int64_t mantissa, int32_t exponent) - : Number(mantissa, exponent), good_(true), issue_(IOU) + : Number(mantissa, exponent), good_(true) { } - Number2(Number const& n) : Number(n), good_(true), issue_(IOU) + Number2(Number const& n) : Number(n), good_(true) { } @@ -911,66 +893,38 @@ class Number2 : public Number return good_; } - Issue - getIssue() const - { - return issue_; - } - - void - setIssue(Issue i) - { - issue_ = i; - } - Expected toBytes() const { uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + v |= STAmount::cIssuedCurrency; - if (issue_ == IOU) + uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (!absM) { - v |= STAmount::cIssuedCurrency; - - if (!mantissa()) + using etype = + std::invoke_result_t; + if (exponent() != std::numeric_limits::lowest()) { - if (exponent() != std::numeric_limits::lowest()) - return Unexpected( - HostFunctionError:: - FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - } - else if (exponent() > IOUAmount::maxExponent) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < IOUAmount::minExponent) - return Number2().toBytes(); - - uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); - if (absM > ((1ull << 54) - 1)) return Unexpected( HostFunctionError:: FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - - v |= absM; - - int const e = - (!mantissa() ? 0 : exponent()) - IOUAmount::minExponent + 1; - v |= ((uint64_t)e) << 54; - } - else if (issue_ == MPT) - { - v |= STAmount::cMPToken; - uint64_t x = toUInt(61); - if (x == std::numeric_limits::max()) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - v |= x; + } + return FLOAT_NULL; } - else + else if (absM > ((1ull << 54) - 1)) { - uint64_t x = toUInt(61); - if (x == std::numeric_limits::max()) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - v |= x; + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } + else if (exponent() > IOUAmount::maxExponent) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return FLOAT_NULL; + + int const e = exponent() - IOUAmount::minExponent + 1; //+97 + v |= absM; + v |= ((uint64_t)e) << 54; Serializer msg; msg.add64(v); @@ -987,44 +941,11 @@ class Number2 : public Number return data; } - -protected: - uint64_t - toUInt(unsigned bits) const - { - if (bits >= sizeof(uint64_t) * 8) - return std::numeric_limits::max(); // LCOV_EXCL_LINE - - uint64_t maxV = (1ull << bits) - 1; - uint64_t absM = mantissa() >= 0 ? mantissa() : -mantissa(); - - if (!absM) - return 0; - else if (exponent() < 0) - { - for (int i = 0; i > exponent(); --i) - { - // underflow - if (absM < 10) - return std::numeric_limits::max(); - absM /= 10; - } - } - else - { - for (int i = 0; i < exponent(); ++i) - { - // overflow - if (absM > maxV / 10) - return std::numeric_limits::max(); - absM *= 10; - } - } - - return absM > maxV ? std::numeric_limits::max() : absM; - } }; +Bytes const Number2::FLOAT_NULL = + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + struct SetRound { Number::rounding_mode oldMode_; @@ -1162,7 +1083,7 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx + yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1188,7 +1109,7 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx - yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1214,7 +1135,7 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx * yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1240,7 +1161,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res = xx / yy; - res.setIssue(xx.getIssue()); + return res.toBytes(); } catch (...) @@ -1266,7 +1187,7 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res(root(xx, n)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START @@ -1296,7 +1217,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) return Unexpected(HostFunctionError::INVALID_PARAMS); Number2 res(power(xx, n, 1)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } catch (...) @@ -1319,7 +1240,7 @@ floatLogImpl(Slice const& x, int32_t mode) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); Number2 res(lg(xx)); - res.setIssue(xx.getIssue()); + return res.toBytes(); } // LCOV_EXCL_START From 77875c9133dfa90abc86de23e59f96daacc516b0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 13:58:38 -0400 Subject: [PATCH 054/212] fix: actually return int instead of bool (#5651) --- src/test/app/HostFuncImpl_test.cpp | 18 +++++++++--------- src/test/app/Wasm_test.cpp | 16 ++++++++++------ src/xrpld/app/wasm/HostFunc.h | 6 ++++++ src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 15 +++++---------- src/xrpld/app/wasm/detail/WasmVM.cpp | 2 +- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index bd8ef8a3792..dea7ce4d510 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1442,15 +1442,15 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ } \ } -#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ - { \ - auto actual = hfs.hfsFunc(__VA_ARGS__); \ - if (BEAST_EXPECT(!actual.has_value())) \ - { \ - BEAST_EXPECTS( \ - actual.error() == expected, \ - std::to_string(static_cast(actual.error()))); \ - } \ +#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(HfErrorToInt(actual.error()))); \ + } \ } // accountKeylet diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 4fb30242fb0..42e3951869b 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -376,9 +376,11 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); - // std::cout << "bad case (access nonexistent field) result " - // << re.error() << std::endl; + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result == -201); + BEAST_EXPECT(re->cost == 5831); + } } { // fail because trying to allocate more than MAX_PAGES memory @@ -396,9 +398,11 @@ struct Wasm_test : public beast::unit_test::suite BadTestHostFunctions nfs(env); auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); - BEAST_EXPECT(re.has_value() && !re->result && (re->cost == 5831)); - // std::cout << "bad case (more than MAX_PAGES) result " - // << re.error() << std::endl; + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result == -201); + BEAST_EXPECT(re->cost == 5831); + } } { // fail because recursion too deep diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 865ce49fb36..d1552df5a50 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -54,6 +54,12 @@ enum class HostFunctionError : int32_t { FLOAT_COMPUTATION_ERROR = -20, }; +inline int32_t +HfErrorToInt(HostFunctionError e) +{ + return static_cast(e); +} + std::string floatToString(Slice const& data); diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 20b52e418f8..75f072be2a1 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -41,22 +41,18 @@ setData( return 0; // LCOV_EXCL_LINE if (dst < 0 || dstSize < 0 || !src || srcSize < 0) - return static_cast>( - HostFunctionError::INVALID_PARAMS); + return HfErrorToInt(HostFunctionError::INVALID_PARAMS); auto memory = runtime ? runtime->getMem() : wmem(); // LCOV_EXCL_START if (!memory.s) - return static_cast>( - HostFunctionError::NO_MEM_EXPORTED); + return HfErrorToInt(HostFunctionError::NO_MEM_EXPORTED); // LCOV_EXCL_STOP if (dst + dstSize > memory.s) - return static_cast>( - HostFunctionError::POINTER_OUT_OF_BOUNDS); + return HfErrorToInt(HostFunctionError::POINTER_OUT_OF_BOUNDS); if (srcSize > dstSize) - return static_cast>( - HostFunctionError::BUFFER_TOO_SMALL); + return HfErrorToInt(HostFunctionError::BUFFER_TOO_SMALL); memcpy(memory.p + dst, src, srcSize); @@ -212,8 +208,7 @@ hfResult(wasm_val_vec_t* results, int32_t value) std::nullptr_t hfResult(wasm_val_vec_t* results, HostFunctionError value) { - results->data[0] = WASM_I32_VAL( - static_cast>(value)); + results->data[0] = WASM_I32_VAL(HfErrorToInt(value)); results->num_elems = 1; return nullptr; } diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 7d20f67fa12..335d406254f 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -150,7 +150,7 @@ runEscrowWasm( std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << std::endl; #endif - return EscrowResult{ret->result > 0, ret->cost}; + return EscrowResult{ret->result, ret->cost}; } NotTEC From 293d8e4ddb39b61a66012005ca795442eec741fb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 15:32:36 -0400 Subject: [PATCH 055/212] test: store Rust source code in rippled, instead of just opaque hex strings (#5653) --- .clang-format | 3 + src/test/app/Escrow_test.cpp | 41 +- src/test/app/Wasm_test.cpp | 191 +- src/test/app/wasm_fixtures/.gitignore | 3 + .../all_host_functions/Cargo.lock | 15 + .../all_host_functions/Cargo.toml | 21 + .../all_host_functions/src/lib.rs | 828 +++++++ .../app/wasm_fixtures/all_keylets/Cargo.lock | 15 + .../app/wasm_fixtures/all_keylets/Cargo.toml | 21 + .../app/wasm_fixtures/all_keylets/src/lib.rs | 156 ++ src/test/app/wasm_fixtures/b58.c | 73 + .../wasm_fixtures/codecov_tests/Cargo.lock | 15 + .../wasm_fixtures/codecov_tests/Cargo.toml | 19 + .../codecov_tests/src/host_bindings_loose.rs | 47 + .../wasm_fixtures/codecov_tests/src/lib.rs | 953 +++++++ src/test/app/wasm_fixtures/copyFixtures.py | 130 + src/test/app/wasm_fixtures/disableFloat.wat | 34 + src/test/app/wasm_fixtures/fib.c | 12 + src/test/app/wasm_fixtures/fixtures.cpp | 2199 +---------------- src/test/app/wasm_fixtures/fixtures.h | 36 +- .../app/wasm_fixtures/float_tests/Cargo.lock | 15 + .../app/wasm_fixtures/float_tests/Cargo.toml | 21 + .../app/wasm_fixtures/float_tests/src/lib.rs | 460 ++++ src/test/app/wasm_fixtures/ledgerSqn.c | 27 + src/test/app/wasm_fixtures/sha512Pure.c | 145 ++ src/test/app/wasm_fixtures/sp1/Cargo.lock | 1384 +++++++++++ src/test/app/wasm_fixtures/sp1/Cargo.toml | 16 + src/test/app/wasm_fixtures/sp1/src/lib.rs | 37 + .../app/wasm_fixtures/zk_proof/Cargo.lock | 106 + .../app/wasm_fixtures/zk_proof/Cargo.toml | 19 + .../app/wasm_fixtures/zk_proof/src/lib.rs | 254 ++ src/xrpld/app/wasm/detail/WamrVM.cpp | 2 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 1 - 33 files changed, 4942 insertions(+), 2357 deletions(-) create mode 100644 src/test/app/wasm_fixtures/.gitignore create mode 100644 src/test/app/wasm_fixtures/all_host_functions/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/all_host_functions/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/all_host_functions/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/all_keylets/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/all_keylets/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/all_keylets/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/b58.c create mode 100644 src/test/app/wasm_fixtures/codecov_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/codecov_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs create mode 100644 src/test/app/wasm_fixtures/codecov_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/copyFixtures.py create mode 100644 src/test/app/wasm_fixtures/disableFloat.wat create mode 100644 src/test/app/wasm_fixtures/fib.c create mode 100644 src/test/app/wasm_fixtures/float_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/float_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/float_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/ledgerSqn.c create mode 100644 src/test/app/wasm_fixtures/sha512Pure.c create mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/sp1/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/zk_proof/src/lib.rs diff --git a/.clang-format b/.clang-format index 660a60c4a19..883549168b2 100644 --- a/.clang-format +++ b/.clang-format @@ -95,3 +95,6 @@ Standard: Cpp11 TabWidth: 8 UseTab: Never QualifierAlignment: Right +--- +Language: Json +IndentWidth: 2 diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c07f3edd61c..c74b98e8c7c 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1708,7 +1708,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnHex; + static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled @@ -1884,7 +1884,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnHex; + static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled @@ -1921,37 +1921,6 @@ struct Escrow_test : public beast::unit_test::suite ter(temBAD_LIMIT)); } - { - uint32_t const allowance = 5'664; - Env env(*this, features); - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - XRPAmount const createFee = env.current()->fees().base + 1000; - - // Escrow with FinishFunction + Condition - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - env(escrowCreate, - escrow::finish_function(reqNonexistentField), - escrow::condition(escrow::cb1), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - env.close(); - - // Rejected as wasm code request nonexistent memo field - XRPAmount const txnFees = env.current()->fees().base * 34 + 1000; - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(txnFees), - ter(tecWASM_REJECTED)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - } - Env env(*this, features); // Run past the flag ledger so that a Fee change vote occurs and @@ -2036,7 +2005,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnHex; + auto const& wasmHex = ledgerSqnWasmHex; std::uint32_t const allowance = 71; { @@ -2288,7 +2257,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = allHostFunctionsHex; + static auto wasmHex = allHostFunctionsWasmHex; Account const alice{"alice"}; Account const carol{"carol"}; @@ -2356,7 +2325,7 @@ struct Escrow_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = keyletHostFunctions; + static auto wasmHex = allKeyletsWasmHex; Account const alice{"alice"}; Account const carol{"carol"}; diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 42e3951869b..46c116637a9 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -57,13 +57,17 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm fibo"); - auto const ws = boost::algorithm::unhex(fib32Hex); + auto const ws = boost::algorithm::unhex(fibWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "fib", wasmParams(10)); - BEAST_EXPECT(re.has_value() && (re->result == 55) && (re->cost == 755)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 755, std::to_string(re->cost)); + } } void @@ -71,22 +75,25 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm sha"); - auto const ws = boost::algorithm::unhex(sha512PureHex); + auto const ws = boost::algorithm::unhex(sha512PureWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = - engine.run(wasm, "sha512_process", wasmParams(sha512PureHex)); + engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); - BEAST_EXPECT( - re.has_value() && (re->result == 34432) && (re->cost == 157'452)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 157'452, std::to_string(re->cost)); + } } void testWasmB58() { testcase("Wasm base58"); - auto const ws = boost::algorithm::unhex(b58Hex); + auto const ws = boost::algorithm::unhex(b58WasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); @@ -95,38 +102,51 @@ struct Wasm_test : public beast::unit_test::suite auto const minsz = std::min( static_cast(512), - static_cast(b58Hex.size())); - auto const s = std::string_view(b58Hex.c_str(), minsz); + static_cast(b58WasmHex.size())); + auto const s = std::string_view(b58WasmHex.c_str(), minsz); + auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - BEAST_EXPECT(re.has_value() && re->result && (re->cost == 3'066'129)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); + } } void testWasmSP1Verifier() { testcase("Wasm sp1 zkproof verifier"); - auto const ws = boost::algorithm::unhex(sp1_wasm); + auto const ws = boost::algorithm::unhex(sp1WasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "sp1_groth16_verifier"); - BEAST_EXPECT( - re.has_value() && re->result && (re->cost == 4'191'711'969ll)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS( + re->cost == 4'191'711'969ll, std::to_string(re->cost)); + } } void testWasmBG16Verifier() { testcase("Wasm BG16 zkproof verifier"); - auto const ws = boost::algorithm::unhex(zkProofHex); + auto const ws = boost::algorithm::unhex(zkProofWasmHex); Bytes const wasm(ws.begin(), ws.end()); auto& engine = WasmEngine::instance(); auto const re = engine.run(wasm, "bellman_groth16_test"); - BEAST_EXPECT(re.has_value() && re->result && (re->cost == 332'205'984)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); + } } void @@ -134,7 +154,7 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm get ledger sequence"); - auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); using namespace test::jtx; @@ -157,7 +177,10 @@ struct Wasm_test : public beast::unit_test::suite // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re->result && (re->cost == 44)); + { + BEAST_EXPECTS(!re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 44, std::to_string(re->cost)); + } env.close(); env.close(); @@ -170,74 +193,12 @@ struct Wasm_test : public beast::unit_test::suite // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result && (re->cost == 88)); - } - - void - testWasmCheckJson() - { - testcase("Wasm check json"); - - using namespace test::jtx; - Env env{*this}; - - auto const wasmStr = boost::algorithm::unhex(checkJsonHex); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("check_accountID"); - { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh"; - Bytes data(str.begin(), str.end()); - auto re = runEscrowWasm( - wasm, funcName, wasmParams(data), nullptr, -1, env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result && (re->cost == 838)); - } { - std::string str = "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00"; - Bytes data(str.begin(), str.end()); - auto re = runEscrowWasm( - wasm, funcName, wasmParams(data), nullptr, -1, env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result && (re->cost == 822)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 88, std::to_string(re->cost)); } } - void - testWasmCompareJson() - { - testcase("Wasm compare json"); - - using namespace test::jtx; - Env env{*this}; - - auto wasmStr = boost::algorithm::unhex(compareJsonHex); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("compare_accountID"); - - std::vector const tx_data(tx_js.begin(), tx_js.end()); - std::vector const lo_data(lo_js.begin(), lo_js.end()); - auto re = runEscrowWasm( - wasm, - funcName, - wasmParams(tx_data, lo_data), - nullptr, - -1, - env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re.value().result && (re->cost == 42'212)); - - std::vector const lo_data2(lo_js2.begin(), lo_js2.end()); - re = runEscrowWasm( - wasm, - funcName, - wasmParams(tx_data, lo_data2), - nullptr, - -1, - env.journal); - if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(!re.value().result && (re->cost == 41'496)); - } - void testWasmLib() { @@ -281,7 +242,11 @@ struct Wasm_test : public beast::unit_test::suite // if (res) printf("invokeAdd get the result: %d\n", res.value()); - BEAST_EXPECT(re.has_value() && re->result == 6912 && (re->cost == 2)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + } } void @@ -346,7 +311,7 @@ struct Wasm_test : public beast::unit_test::suite testcase("escrow wasm devnet test"); std::string const wasmStr = - boost::algorithm::unhex(allHostFunctionsHex); + boost::algorithm::unhex(allHostFunctionsWasmHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); using namespace test::jtx; @@ -357,7 +322,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 41'132)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); } } @@ -375,11 +341,11 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); auto re = - runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100000); + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result == -201); - BEAST_EXPECT(re->cost == 5831); + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); } } @@ -400,8 +366,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result == -201); - BEAST_EXPECT(re->cost == 5831); + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); } } @@ -412,7 +378,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctionsSink nfs(env); std::string funcName("recursive"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1000'000'000); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -438,7 +404,7 @@ struct Wasm_test : public beast::unit_test::suite } { - auto wasmStr = boost::algorithm::unhex(ledgerSqnHex); + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); TestLedgerDataProvider ledgerDataProvider(&env); @@ -471,7 +437,7 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -493,7 +459,8 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 872)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 872, std::to_string(re->cost)); } env.close(); @@ -506,7 +473,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { - std::string const wasmHex = allHostFunctionsHex; + std::string const wasmHex = allHostFunctionsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); @@ -526,7 +493,8 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECT(re->result && (re->cost == 41'132)); + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); } env.close(); @@ -544,13 +512,17 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = floatHex; + std::string const wasmHex = floatTestsWasmHex; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - BEAST_EXPECT(re && re->result && (re->cost == 91'412)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); + } env.close(); } @@ -561,7 +533,11 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hf(env, 0); auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); - BEAST_EXPECT(re && re->result && (re->cost == 6'533)); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); + } env.close(); } } @@ -677,7 +653,7 @@ struct Wasm_test : public beast::unit_test::suite // beast::severities::kTrace}; Env env{*this}; - auto const wasmStr = boost::algorithm::unhex(codecovWasm); + auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); Bytes const wasm(wasmStr.begin(), wasmStr.end()); std::string const funcName("finish"); TestHostFunctions hfs(env, 0); @@ -686,7 +662,10 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) - BEAST_EXPECT(re->result); + { + BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 100'784, std::to_string(re->cost)); + } } void @@ -706,7 +685,10 @@ struct Wasm_test : public beast::unit_test::suite // f32 set constant, opcode disabled exception auto const re = runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } } { @@ -714,7 +696,10 @@ struct Wasm_test : public beast::unit_test::suite wasm[0x117] = 0x92; auto const re = runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re && re.error() == tecFAILED_PROCESSING); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } } } @@ -726,8 +711,6 @@ struct Wasm_test : public beast::unit_test::suite testGetDataHelperFunctions(); testWasmLib(); testBadWasm(); - testWasmCheckJson(); - testWasmCompareJson(); testWasmLedgerSqn(); testWasmFib(); diff --git a/src/test/app/wasm_fixtures/.gitignore b/src/test/app/wasm_fixtures/.gitignore new file mode 100644 index 00000000000..08b2e8a2569 --- /dev/null +++ b/src/test/app/wasm_fixtures/.gitignore @@ -0,0 +1,3 @@ +**/target +**/debug +*.wasm diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock new file mode 100644 index 00000000000..13931f02298 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_host_functions" +version = "0.1.0" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml new file mode 100644 index 00000000000..4c3455b3ca8 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "all_host_functions" +version = "0.1.0" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +opt-level = "z" +lto = true diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs new file mode 100644 index 00000000000..b685de59dac --- /dev/null +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -0,0 +1,828 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +// +// Host Functions Test +// Tests 26 host functions (across 7 categories) +// +// With craft you can run this test with: +// craft test --project host_functions_test --test-case host_functions_test +// +// Amount Format Update: +// - XRP amounts now return as 8-byte serialized rippled objects +// - IOU and MPT amounts return in variable-length serialized format +// - Format details: https://xrpl.org/docs/references/protocol/binary-format#amount-fields +// +// Error Code Ranges: +// -100 to -199: Ledger Header Functions (3 functions) +// -200 to -299: Transaction Data Functions (5 functions) +// -300 to -399: Current Ledger Object Functions (4 functions) +// -400 to -499: Any Ledger Object Functions (5 functions) +// -500 to -599: Keylet Generation Functions (4 functions) +// -600 to -699: Utility Functions (4 functions) +// -700 to -799: Data Update Functions (1 function) +// + +use xrpl_std::core::current_tx::escrow_finish::EscrowFinish; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::host::trace::{DataRepr, trace_data, trace_num}; +use xrpl_std::host::*; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace_data("=== HOST FUNCTIONS TEST ===", &[], DataRepr::AsHex); + let _ = trace_data("Testing 26 host functions", &[], DataRepr::AsHex); + + // Category 1: Ledger Header Data Functions (3 functions) + // Error range: -100 to -199 + match test_ledger_header_functions() { + 0 => (), + err => return err, + } + + // Category 2: Transaction Data Functions (5 functions) + // Error range: -200 to -299 + match test_transaction_data_functions() { + 0 => (), + err => return err, + } + + // Category 3: Current Ledger Object Functions (4 functions) + // Error range: -300 to -399 + match test_current_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 4: Any Ledger Object Functions (5 functions) + // Error range: -400 to -499 + match test_any_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 5: Keylet Generation Functions (4 functions) + // Error range: -500 to -599 + match test_keylet_generation_functions() { + 0 => (), + err => return err, + } + + // Category 6: Utility Functions (4 functions) + // Error range: -600 to -699 + match test_utility_functions() { + 0 => (), + err => return err, + } + + // Category 7: Data Update Functions (1 function) + // Error range: -700 to -799 + match test_data_update_functions() { + 0 => (), + err => return err, + } + + let _ = trace_data( + "SUCCESS: All host function tests passed!", + &[], + DataRepr::AsHex, + ); + 1 // Success return code for WASM finish function +} + +/// Test Category 1: Ledger Header Data Functions (3 functions) +/// - get_ledger_sqn() - Get ledger sequence number +/// - get_parent_ledger_time() - Get parent ledger timestamp +/// - get_parent_ledger_hash() - Get parent ledger hash +fn test_ledger_header_functions() -> i32 { + let _ = trace_data( + "--- Category 1: Ledger Header Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 1.1: get_ledger_sqn() - should return current ledger sequence number + let mut ledger_sqn_buffer = [0u8; 8]; + let sqn_result = + unsafe { get_ledger_sqn(ledger_sqn_buffer.as_mut_ptr(), ledger_sqn_buffer.len()) }; + + if sqn_result <= 0 { + let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); + return -101; // Ledger sequence number test failed + } + let _ = trace_num("Ledger sequence number bytes:", sqn_result as i64); + let _ = trace_data( + "Ledger sqn data:", + &ledger_sqn_buffer[..sqn_result as usize], + DataRepr::AsHex, + ); + + // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp + let mut time_buffer = [0u8; 8]; + let time_result = + unsafe { get_parent_ledger_time(time_buffer.as_mut_ptr(), time_buffer.len()) }; + + if time_result <= 0 { + let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); + return -102; // Parent ledger time test failed + } + let _ = trace_num("Parent ledger time bytes:", time_result as i64); + let _ = trace_data( + "Parent time data:", + &time_buffer[..time_result as usize], + DataRepr::AsHex, + ); + + // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) + let mut hash_buffer = [0u8; 32]; + let hash_result = + unsafe { get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; + + if hash_result != 32 { + let _ = trace_num( + "ERROR: get_parent_ledger_hash wrong length:", + hash_result as i64, + ); + return -103; // Parent ledger hash test failed - should be exactly 32 bytes + } + let _ = trace_data("Parent ledger hash:", &hash_buffer, DataRepr::AsHex); + + let _ = trace_data("SUCCESS: Ledger header functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 2: Transaction Data Functions (5 functions) +/// Tests all functions for accessing current transaction data +fn test_transaction_data_functions() -> i32 { + let _ = trace_data( + "--- Category 2: Transaction Data Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 2.1: get_tx_field() - Basic transaction field access + // Test with Account field (required, 20 bytes) + let mut account_buffer = [0u8; 20]; + let account_len = unsafe { + get_tx_field( + sfield::Account, + account_buffer.as_mut_ptr(), + account_buffer.len(), + ) + }; + + if account_len != 20 { + let _ = trace_num( + "ERROR: get_tx_field(Account) wrong length:", + account_len as i64, + ); + return -201; // Basic transaction field test failed + } + let _ = trace_data("Transaction Account:", &account_buffer, DataRepr::AsHex); + + // Test with Fee field (XRP amount - 8 bytes in new serialized format) + // New format: XRP amounts are always 8 bytes (positive: value | cPositive flag, negative: just value) + let mut fee_buffer = [0u8; 8]; + let fee_len = unsafe { get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; + + if fee_len != 8 { + let _ = trace_num( + "ERROR: get_tx_field(Fee) wrong length (expected 8 bytes for XRP):", + fee_len as i64, + ); + return -202; // Fee field test failed - XRP amounts should be exactly 8 bytes + } + let _ = trace_num("Transaction Fee length:", fee_len as i64); + let _ = trace_data( + "Transaction Fee (serialized XRP amount):", + &fee_buffer, + DataRepr::AsHex, + ); + + // Test with Sequence field (required, 4 bytes uint32) + let mut seq_buffer = [0u8; 4]; + let seq_len = + unsafe { get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; + + if seq_len != 4 { + let _ = trace_num( + "ERROR: get_tx_field(Sequence) wrong length:", + seq_len as i64, + ); + return -203; // Sequence field test failed + } + let _ = trace_data("Transaction Sequence:", &seq_buffer, DataRepr::AsHex); + + // NOTE: get_tx_field2() through get_tx_field6() have been deprecated. + // Use get_tx_field() with appropriate parameters for all transaction field access. + + // Test 2.2: get_tx_nested_field() - Nested field access with locator + let locator = [0x01, 0x00]; // Simple locator for first element + let mut nested_buffer = [0u8; 32]; + let nested_result = unsafe { + get_tx_nested_field( + locator.as_ptr(), + locator.len(), + nested_buffer.as_mut_ptr(), + nested_buffer.len(), + ) + }; + + if nested_result < 0 { + let _ = trace_num( + "INFO: get_tx_nested_field not applicable:", + nested_result as i64, + ); + // Expected - locator may not match transaction structure + } else { + let _ = trace_num("Nested field length:", nested_result as i64); + let _ = trace_data( + "Nested field:", + &nested_buffer[..nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 2.3: get_tx_array_len() - Get array length + let signers_len = unsafe { get_tx_array_len(sfield::Signers) }; + let _ = trace_num("Signers array length:", signers_len as i64); + + let memos_len = unsafe { get_tx_array_len(sfield::Memos) }; + let _ = trace_num("Memos array length:", memos_len as i64); + + // Test 2.4: get_tx_nested_array_len() - Get nested array length with locator + let nested_array_len = unsafe { get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; + + if nested_array_len < 0 { + let _ = trace_num( + "INFO: get_tx_nested_array_len not applicable:", + nested_array_len as i64, + ); + } else { + let _ = trace_num("Nested array length:", nested_array_len as i64); + } + + let _ = trace_data("SUCCESS: Transaction data functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 3: Current Ledger Object Functions (4 functions) +/// Tests functions that access the current ledger object being processed +fn test_current_ledger_object_functions() -> i32 { + let _ = trace_data( + "--- Category 3: Current Ledger Object Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 3.1: get_current_ledger_obj_field() - Access field from current ledger object + // Test with Balance field (XRP amount - 8 bytes in new serialized format) + let mut balance_buffer = [0u8; 8]; + let balance_result = unsafe { + get_current_ledger_obj_field( + sfield::Balance, + balance_buffer.as_mut_ptr(), + balance_buffer.len(), + ) + }; + + if balance_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Balance) failed (may be expected):", + balance_result as i64, + ); + // This might fail if current ledger object doesn't have balance field + } else if balance_result == 8 { + let _ = trace_num( + "Current object balance length (XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance (serialized XRP amount):", + &balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Current object balance length (non-XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance:", + &balance_buffer[..balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test with Account field + let mut current_account_buffer = [0u8; 20]; + let current_account_result = unsafe { + get_current_ledger_obj_field( + sfield::Account, + current_account_buffer.as_mut_ptr(), + current_account_buffer.len(), + ) + }; + + if current_account_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Account) failed:", + current_account_result as i64, + ); + } else { + let _ = trace_data( + "Current ledger object account:", + ¤t_account_buffer[..current_account_result as usize], + DataRepr::AsHex, + ); + } + + // Test 3.2: get_current_ledger_obj_nested_field() - Nested field access + let locator = [0x01, 0x00]; // Simple locator + let mut current_nested_buffer = [0u8; 32]; + let current_nested_result = unsafe { + get_current_ledger_obj_nested_field( + locator.as_ptr(), + locator.len(), + current_nested_buffer.as_mut_ptr(), + current_nested_buffer.len(), + ) + }; + + if current_nested_result < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_field not applicable:", + current_nested_result as i64, + ); + } else { + let _ = trace_num("Current nested field length:", current_nested_result as i64); + let _ = trace_data( + "Current nested field:", + ¤t_nested_buffer[..current_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 3.3: get_current_ledger_obj_array_len() - Array length in current object + let current_array_len = unsafe { get_current_ledger_obj_array_len(sfield::Signers) }; + let _ = trace_num( + "Current object Signers array length:", + current_array_len as i64, + ); + + // Test 3.4: get_current_ledger_obj_nested_array_len() - Nested array length + let current_nested_array_len = + unsafe { get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; + + if current_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_array_len not applicable:", + current_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Current nested array length:", + current_nested_array_len as i64, + ); + } + + let _ = trace_data( + "SUCCESS: Current ledger object functions", + &[], + DataRepr::AsHex, + ); + 0 +} + +/// Test Category 4: Any Ledger Object Functions (5 functions) +/// Tests functions that work with cached ledger objects +fn test_any_ledger_object_functions() -> i32 { + let _ = trace_data( + "--- Category 4: Any Ledger Object Functions ---", + &[], + DataRepr::AsHex, + ); + + // First we need to cache a ledger object to test the other functions + // Get the account from transaction and generate its keylet + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 4.1: cache_ledger_obj() - Cache a ledger object + let mut keylet_buffer = [0u8; 32]; + let keylet_result = unsafe { + account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + keylet_buffer.as_mut_ptr(), + keylet_buffer.len(), + ) + }; + + if keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed for caching test:", + keylet_result as i64, + ); + return -401; // Keylet generation failed for caching test + } + + let cache_result = + unsafe { cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; + + if cache_result <= 0 { + let _ = trace_num( + "INFO: cache_ledger_obj failed (expected with test fixtures):", + cache_result as i64, + ); + // Test fixtures may not contain the account object - this is expected + // We'll test the interface but expect failures + + // Test 4.2-4.5 with invalid slot (should fail gracefully) + let mut test_buffer = [0u8; 32]; + + // Test get_ledger_obj_field with invalid slot + let field_result = unsafe { + get_ledger_obj_field( + 1, + sfield::Balance, + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if field_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field failed as expected (no cached object):", + field_result as i64, + ); + } + + // Test get_ledger_obj_nested_field with invalid slot + let locator = [0x01, 0x00]; + let nested_result = unsafe { + get_ledger_obj_nested_field( + 1, + locator.as_ptr(), + locator.len(), + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field failed as expected:", + nested_result as i64, + ); + } + + // Test get_ledger_obj_array_len with invalid slot + let array_result = unsafe { get_ledger_obj_array_len(1, sfield::Signers) }; + if array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_array_len failed as expected:", + array_result as i64, + ); + } + + // Test get_ledger_obj_nested_array_len with invalid slot + let nested_array_result = + unsafe { get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; + if nested_array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len failed as expected:", + nested_array_result as i64, + ); + } + + let _ = trace_data( + "SUCCESS: Any ledger object functions (interface tested)", + &[], + DataRepr::AsHex, + ); + return 0; + } + + // If we successfully cached an object, test the access functions + let slot = cache_result; + let _ = trace_num("Successfully cached object in slot:", slot as i64); + + // Test 4.2: get_ledger_obj_field() - Access field from cached object + let mut cached_balance_buffer = [0u8; 8]; + let cached_balance_result = unsafe { + get_ledger_obj_field( + slot, + sfield::Balance, + cached_balance_buffer.as_mut_ptr(), + cached_balance_buffer.len(), + ) + }; + + if cached_balance_result <= 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field(Balance) failed:", + cached_balance_result as i64, + ); + } else if cached_balance_result == 8 { + let _ = trace_num( + "Cached object balance length (XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance (serialized XRP amount):", + &cached_balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Cached object balance length (non-XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance:", + &cached_balance_buffer[..cached_balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.3: get_ledger_obj_nested_field() - Nested field from cached object + let locator = [0x01, 0x00]; + let mut cached_nested_buffer = [0u8; 32]; + let cached_nested_result = unsafe { + get_ledger_obj_nested_field( + slot, + locator.as_ptr(), + locator.len(), + cached_nested_buffer.as_mut_ptr(), + cached_nested_buffer.len(), + ) + }; + + if cached_nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field not applicable:", + cached_nested_result as i64, + ); + } else { + let _ = trace_num("Cached nested field length:", cached_nested_result as i64); + let _ = trace_data( + "Cached nested field:", + &cached_nested_buffer[..cached_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.4: get_ledger_obj_array_len() - Array length from cached object + let cached_array_len = unsafe { get_ledger_obj_array_len(slot, sfield::Signers) }; + let _ = trace_num( + "Cached object Signers array length:", + cached_array_len as i64, + ); + + // Test 4.5: get_ledger_obj_nested_array_len() - Nested array length from cached object + let cached_nested_array_len = + unsafe { get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; + + if cached_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len not applicable:", + cached_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Cached nested array length:", + cached_nested_array_len as i64, + ); + } + + let _ = trace_data("SUCCESS: Any ledger object functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 5: Keylet Generation Functions (4 functions) +/// Tests keylet generation functions for different ledger entry types +fn test_keylet_generation_functions() -> i32 { + let _ = trace_data( + "--- Category 5: Keylet Generation Functions ---", + &[], + DataRepr::AsHex, + ); + + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 5.1: account_keylet() - Generate keylet for account + let mut account_keylet_buffer = [0u8; 32]; + let account_keylet_result = unsafe { + account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + account_keylet_buffer.as_mut_ptr(), + account_keylet_buffer.len(), + ) + }; + + if account_keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed:", + account_keylet_result as i64, + ); + return -501; // Account keylet generation failed + } + let _ = trace_data("Account keylet:", &account_keylet_buffer, DataRepr::AsHex); + + // Test 5.2: credential_keylet() - Generate keylet for credential + let mut credential_keylet_buffer = [0u8; 32]; + let credential_keylet_result = unsafe { + credential_keylet( + account_id.0.as_ptr(), // Subject + account_id.0.len(), + account_id.0.as_ptr(), // Issuer - same account for test + account_id.0.len(), + b"TestType".as_ptr(), // Credential type + 9usize, // Length of "TestType" + credential_keylet_buffer.as_mut_ptr(), + credential_keylet_buffer.len(), + ) + }; + + if credential_keylet_result <= 0 { + let _ = trace_num( + "INFO: credential_keylet failed (expected - interface issue):", + credential_keylet_result as i64, + ); + // This is expected to fail due to unusual parameter types + } else { + let _ = trace_data( + "Credential keylet:", + &credential_keylet_buffer[..credential_keylet_result as usize], + DataRepr::AsHex, + ); + } + + // Test 5.3: escrow_keylet() - Generate keylet for escrow + let mut escrow_keylet_buffer = [0u8; 32]; + let escrow_keylet_result = unsafe { + escrow_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 1000, // Sequence number + escrow_keylet_buffer.as_mut_ptr(), + escrow_keylet_buffer.len(), + ) + }; + + if escrow_keylet_result != 32 { + let _ = trace_num("ERROR: escrow_keylet failed:", escrow_keylet_result as i64); + return -503; // Escrow keylet generation failed + } + let _ = trace_data("Escrow keylet:", &escrow_keylet_buffer, DataRepr::AsHex); + + // Test 5.4: oracle_keylet() - Generate keylet for oracle + let mut oracle_keylet_buffer = [0u8; 32]; + let oracle_keylet_result = unsafe { + oracle_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 42, // Document ID + oracle_keylet_buffer.as_mut_ptr(), + oracle_keylet_buffer.len(), + ) + }; + + if oracle_keylet_result != 32 { + let _ = trace_num("ERROR: oracle_keylet failed:", oracle_keylet_result as i64); + return -504; // Oracle keylet generation failed + } + let _ = trace_data("Oracle keylet:", &oracle_keylet_buffer, DataRepr::AsHex); + + let _ = trace_data("SUCCESS: Keylet generation functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 6: Utility Functions (4 functions) +/// Tests utility functions for hashing, NFT access, and tracing +fn test_utility_functions() -> i32 { + let _ = trace_data( + "--- Category 6: Utility Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 6.1: compute_sha512_half() - SHA512 hash computation (first 32 bytes) + let test_data = b"Hello, XRPL WASM world!"; + let mut hash_output = [0u8; 32]; + let hash_result = unsafe { + compute_sha512_half( + test_data.as_ptr(), + test_data.len(), + hash_output.as_mut_ptr(), + hash_output.len(), + ) + }; + + if hash_result != 32 { + let _ = trace_num("ERROR: compute_sha512_half failed:", hash_result as i64); + return -601; // SHA512 half computation failed + } + let _ = trace_data("Input data:", test_data, DataRepr::AsHex); + let _ = trace_data("SHA512 half hash:", &hash_output, DataRepr::AsHex); + + // Test 6.2: get_nft() - NFT data retrieval + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + let nft_id = [0u8; 32]; // Dummy NFT ID for testing + let mut nft_buffer = [0u8; 256]; + let nft_result = unsafe { + get_nft( + account_id.0.as_ptr(), + account_id.0.len(), + nft_id.as_ptr(), + nft_id.len(), + nft_buffer.as_mut_ptr(), + nft_buffer.len(), + ) + }; + + if nft_result <= 0 { + let _ = trace_num( + "INFO: get_nft failed (expected - no such NFT):", + nft_result as i64, + ); + // This is expected - test account likely doesn't own the dummy NFT + } else { + let _ = trace_num("NFT data length:", nft_result as i64); + let _ = trace_data( + "NFT data:", + &nft_buffer[..nft_result as usize], + DataRepr::AsHex, + ); + } + + // Test 6.3: trace() - Debug logging with data + let trace_message = b"Test trace message"; + let trace_data_payload = b"payload"; + let trace_result = unsafe { + trace( + trace_message.as_ptr(), + trace_message.len(), + trace_data_payload.as_ptr(), + trace_data_payload.len(), + 1, // as_hex = true + ) + }; + + if trace_result < 0 { + let _ = trace_num("ERROR: trace() failed:", trace_result as i64); + return -603; // Trace function failed + } + let _ = trace_num("Trace function bytes written:", trace_result as i64); + + // Test 6.4: trace_num() - Debug logging with number + let test_number = 42i64; + let trace_num_result = trace_num("Test number trace", test_number); + + use xrpl_std::host::Result; + match trace_num_result { + Result::Ok(_) => { + let _ = trace_num("Trace_num function succeeded", 0); + } + Result::Err(_) => { + let _ = trace_num("ERROR: trace_num() failed:", -604); + return -604; // Trace number function failed + } + } + + let _ = trace_data("SUCCESS: Utility functions", &[], DataRepr::AsHex); + 0 +} + +/// Test Category 7: Data Update Functions (1 function) +/// Tests the function for modifying the current ledger entry +fn test_data_update_functions() -> i32 { + let _ = trace_data( + "--- Category 7: Data Update Functions ---", + &[], + DataRepr::AsHex, + ); + + // Test 7.1: update_data() - Update current ledger entry data + let update_payload = b"Updated ledger entry data from WASM test"; + + let update_result = unsafe { update_data(update_payload.as_ptr(), update_payload.len()) }; + + if update_result != 0 { + let _ = trace_num("ERROR: update_data failed:", update_result as i64); + return -701; // Data update failed + } + + let _ = trace_data( + "Successfully updated ledger entry with:", + update_payload, + DataRepr::AsHex, + ); + let _ = trace_data("SUCCESS: Data update functions", &[], DataRepr::AsHex); + 0 +} diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock new file mode 100644 index 00000000000..cc667d4d346 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_keylets" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml new file mode 100644 index 00000000000..e1fd222bebe --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -0,0 +1,21 @@ +[package] +edition = "2024" +name = "all_keylets" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs new file mode 100644 index 00000000000..167541eae63 --- /dev/null +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -0,0 +1,156 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use crate::host::{Result, Result::Err, Result::Ok}; +use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; +use xrpl_std::core::ledger_objects::ledger_object; +use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; +use xrpl_std::core::types::amount::currency_code::CurrencyCode; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_data, trace_num, DataRepr}; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub fn object_exists( + keylet_result: Result, + keylet_type: &str, + field: i32, +) -> Result { + match keylet_result { + Ok(keylet) => { + let _ = trace_data(keylet_type, &keylet, DataRepr::AsHex); + + let slot = unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }; + if slot <= 0 { + let _ = trace_num("Error: ", slot.into()); + return Err(host::Error::NoFreeSlots); + } + if field == 0 { + let new_field = sfield::PreviousTxnID; + let _ = trace_num("Getting field: ", new_field.into()); + match ledger_object::get_hash_256_field(slot, new_field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } else { + let _ = trace_num("Getting field: ", field.into()); + match ledger_object::get_account_id_field(slot, field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } + + Ok(true) + } + Err(error) => { + let _ = trace_num("Error getting keylet: ", error.into()); + Err(error) + } + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + let escrow: CurrentEscrow = get_current_escrow(); + + let account = escrow.get_account().unwrap_or_panic(); + let _ = trace_data(" Account:", &account.0, DataRepr::AsHex); + + let destination = escrow.get_destination().unwrap_or_panic(); + let _ = trace_data(" Destination:", &destination.0, DataRepr::AsHex); + + macro_rules! check_object_exists { + ($keylet:expr, $type:expr, $field:expr) => { + match object_exists($keylet, $type, $field) { + Ok(exists) => { + if exists { + let _ = trace(concat!( + $type, + " object exists, proceeding with escrow finish." + )); + } else { + let _ = trace(concat!( + $type, + " object does not exist, aborting escrow finish." + )); + return 0; + } + } + Err(error) => return error.code(), + } + }; + } + + let account_keylet = keylets::account_keylet(&account); + check_object_exists!(account_keylet, "Account", sfield::Account); + + let mut seq = 5; + let currency_code: &[u8; 3] = b"USD"; + let currency: CurrencyCode = CurrencyCode::from(*currency_code); + let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); + check_object_exists!(line_keylet, "Trustline", sfield::Generic); + seq += 1; + + let check_keylet = keylets::check_keylet(&account, seq); + check_object_exists!(check_keylet, "Check", sfield::Account); + seq += 1; + + let cred_type: &[u8] = b"termsandconditions"; + let credential_keylet = keylets::credential_keylet(&account, &account, cred_type); + check_object_exists!(credential_keylet, "Credential", sfield::Subject); + seq += 1; + + let delegate_keylet = keylets::delegate_keylet(&account, &destination); + check_object_exists!(delegate_keylet, "Delegate", sfield::Account); + seq += 1; + + let deposit_preauth_keylet = keylets::deposit_preauth_keylet(&account, &destination); + check_object_exists!(deposit_preauth_keylet, "DepositPreauth", sfield::Account); + seq += 1; + + let did_keylet = keylets::did_keylet(&account); + check_object_exists!(did_keylet, "DID", sfield::Account); + seq += 1; + + let escrow_keylet = keylets::escrow_keylet(&account, seq); + check_object_exists!(escrow_keylet, "Escrow", sfield::Account); + seq += 1; + + let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 4); + check_object_exists!(nft_offer_keylet, "NFTokenOffer", sfield::Owner); + + let offer_keylet = keylets::offer_keylet(&account, seq); + check_object_exists!(offer_keylet, "Offer", sfield::Account); + seq += 1; + + let paychan_keylet = keylets::paychan_keylet(&account, &destination, seq); + check_object_exists!(paychan_keylet, "PayChannel", sfield::Account); + seq += 1; + + let signers_keylet = keylets::signers_keylet(&account); + check_object_exists!(signers_keylet, "SignerList", sfield::Generic); + seq += 1; + + seq += 1; // ticket sequence number is one greater + let ticket_keylet = keylets::ticket_keylet(&account, seq); + check_object_exists!(ticket_keylet, "Ticket", sfield::Account); + // seq += 1; + + 1 // All keylets exist, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c new file mode 100644 index 00000000000..00b6178ec05 --- /dev/null +++ b/src/test/app/wasm_fixtures/b58.c @@ -0,0 +1,73 @@ +#include + +static char const b58digits_ordered[] = + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +uint8_t e_data[32 * 1024]; + +void* +allocate(int sz) +{ + static int idx = 0; + if (idx >= 32) + return 0; + if (sz > 1024) + return 0; + return &e_data[idx++ << 10]; +} + +void +deallocate(void* p) +{ +} + +extern int32_t +b58enco(char* b58, int32_t b58sz, void const* data, int32_t binsz) +{ + uint8_t const* bin = data; + int32_t carry; + int32_t i, j, high, zcount = 0; + int32_t size; + + while (zcount < binsz && !bin[zcount]) + ++zcount; + + size = (binsz - zcount) * 138 / 100 + 1; + uint8_t* buf = allocate(size); + if (!buf) + return 0; + // memset(buf, 0, size); + for (i = 0; i < size; ++i) + buf[i] = 0; + + for (i = zcount, high = size - 1; i < binsz; ++i, high = j) + { + for (carry = bin[i], j = size - 1; (j > high) || carry; --j) + { + carry += 256 * buf[j]; + buf[j] = carry % 58; + carry /= 58; + if (!j) + break; + } + } + + for (j = 0; j < size && !buf[j]; ++j) + ; + + if (b58sz <= zcount + size - j) + return 0; + + if (zcount) + { + // memset(b58, '1', zcount); + for (i = 0; i < zcount; ++i) + b58[i] = '1'; + } + + for (i = zcount; j < size; ++i, ++j) + b58[i] = b58digits_ordered[buf[j]]; + b58[i] = '\0'; + + return i + 1; +} diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock new file mode 100644 index 00000000000..00b548911b4 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "codecov_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml new file mode 100644 index 00000000000..e379fe9790c --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -0,0 +1,19 @@ +[package] +edition = "2024" +name = "codecov_tests" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs new file mode 100644 index 00000000000..0e8a1ecee08 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -0,0 +1,47 @@ +//TODO add docs after discussing the interface +//Note that Craft currently does not honor the rounding modes +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TO_NEAREST: i32 = 0; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TOWARDS_ZERO: i32 = 1; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_DOWNWARD: i32 = 2; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_UPWARD: i32 = 3; + +// pub enum RippledRoundingModes{ +// ToNearest = 0, +// TowardsZero = 1, +// DOWNWARD = 2, +// UPWARD = 3 +// } + +#[allow(unused)] +#[link(wasm_import_module = "host_lib")] +unsafe extern "C" { + pub fn get_ledger_sqn(out_buff_ptr: i32, out_buff_len: i32) -> i32; + + pub fn cache_ledger_obj(keylet_ptr: i32, keylet_len: i32, cache_num: i32) -> i32; + + pub fn get_tx_nested_array_len(locator_ptr: i32, locator_len: i32) -> i32; + + pub fn account_keylet( + account_ptr: i32, + account_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn line_keylet( + account1_ptr: *const u8, + account1_len: usize, + account2_ptr: *const u8, + account2_len: usize, + currency_ptr: i32, + currency_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn trace_num(msg_read_ptr: i32, msg_read_len: i32, number: i64) -> i32; +} diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs new file mode 100644 index 00000000000..1323068b397 --- /dev/null +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -0,0 +1,953 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use core::panic; +use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow_finish}; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::core::error_codes; +use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_num as trace_number}; +use xrpl_std::sfield; + +mod host_bindings_loose; +include!("host_bindings_loose.rs"); + +fn check_result(result: i32, expected: i32, test_name: &'static str) { + match result { + code if code == expected => { + let _ = trace_number(test_name, code.into()); + } + code if code >= 0 => { + let _ = trace(test_name); + let _ = trace_number("TEST FAILED", code.into()); + panic!("Unexpected success code: {}", code); + } + code => { + let _ = trace_number("TEST FAILED", code.into()); + panic!("Error code: {}", code); + } + } +} + +fn with_buffer(mut f: F) -> R +where + F: FnMut(*mut u8, usize) -> R, +{ + let mut buf = [0u8; N]; + f(buf.as_mut_ptr(), buf.len()) +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + // ######################################## + // Step #1: Test all host function happy paths + // Note: not testing all the keylet functions, + // that's in a separate test file. + // ######################################## + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_sqn(ptr, len) }, + 4, + "get_ledger_sqn", + ) + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_time(ptr, len) }, + 4, + "get_parent_ledger_time", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_hash(ptr, len) }, + 32, + "get_parent_ledger_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_account_hash(ptr, len) }, + 32, + "get_ledger_account_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_tx_hash(ptr, len) }, + 32, + "get_ledger_tx_hash", + ); + }); + check_result(unsafe { host::get_base_fee() }, 10, "get_base_fee"); + let amendment_name: &[u8] = b"test_amendment"; + let amendment_id: [u8; 32] = [1; 32]; + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), amendment_name.len()) }, + 1, + "amendment_enabled", + ); + check_result( + unsafe { host::amendment_enabled(amendment_id.as_ptr(), amendment_id.len()) }, + 1, + "amendment_enabled", + ); + let tx: EscrowFinish = get_current_escrow_finish(); + let account = tx.get_account().unwrap_or_panic(); // get_tx_field under the hood + let keylet = keylets::account_keylet(&account).unwrap_or_panic(); // account_keylet under the hood + check_result( + unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }, + 1, + "cache_ledger_obj", + ); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(sfield::Account, ptr, len) }, + 20, + "get_current_ledger_obj_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, sfield::Account, ptr, len) }, + 20, + "get_ledger_obj_field", + ); + }); + let mut locator = Locator::new(); + locator.pack(sfield::Account); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), locator.len(), ptr, len) }, + 20, + "get_tx_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_current_ledger_obj_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_ledger_obj_nested_field(1, locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_ledger_obj_nested_field", + ); + }); + check_result( + unsafe { host::get_tx_array_len(sfield::Memos) }, + 32, + "get_tx_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(sfield::Memos) }, + 32, + "get_current_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, sfield::Memos) }, + 32, + "get_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_tx_nested_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_current_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }, + 32, + "get_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::update_data(account.0.as_ptr(), account.0.len()) }, + 0, + "update_data", + ); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), locator.len(), ptr, len) }, + 32, + "compute_sha512_half", + ); + }); + let message: &[u8] = b"test message"; + let pubkey: &[u8] = b"test pubkey"; //tx.get_public_key().unwrap_or_panic(); + let signature: &[u8] = b"test signature"; + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + 1, + "check_sig", + ); + + let nft_id: [u8; 32] = amendment_id; + with_buffer::<18, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + nft_id.as_ptr(), + nft_id.len(), + ptr, + len, + ) + }, + 18, + "get_nft", + ) + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 20, + "get_nft_issuer", + ) + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_taxon", + ) + }); + check_result( + unsafe { host::get_nft_flags(nft_id.as_ptr(), nft_id.len()) }, + 8, + "get_nft_flags", + ); + check_result( + unsafe { host::get_nft_transfer_fee(nft_id.as_ptr(), nft_id.len()) }, + 10, + "get_nft_transfer_fee", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_serial", + ) + }); + + // ######################################## + // Step #2: Test set_data edge cases + // ######################################## + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(-1, 4) }, + error_codes::INVALID_PARAMS, + "get_ledger_sqn_neg_ptr", + ); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_ledger_sqn_neg_len", + ) + }); + with_buffer::<3, _, _>(|ptr, len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, len as i32) }, + error_codes::BUFFER_TOO_SMALL, + "get_ledger_sqn_buf_too_small", + ) + }); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, 1_000_000_000) }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_ledger_sqn_len_too_long", + ) + }); + + // ######################################## + // Step #3: Test getData[Type] edge cases + // ######################################## + + // SField + check_result( + unsafe { host::get_tx_array_len(2) }, // not a valid SField value + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + + // Slice + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(-1, locator.len() as i32) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_ptr", + ); + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_len", + ); + let long_len = 4 * 1024 + 1; + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, long_len as i32) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_long", + ); + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_tx_nested_array_len_ptr_oob", + ); + + // uint256 + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 1, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "cache_ledger_obj_ptr_oob", + ); + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj(locator.as_ptr() as i32, locator.len() as i32, 1) + }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_len", + ); + + // AccountID + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "account_keylet_len_too_long", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_len", + ) + }); + + // Currency + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "line_keylet_len_too_long_currency", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_len_currency", + ) + }); + + // string + check_result( + unsafe { + host_bindings_loose::trace_num( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 42, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_num_wrong_len_str", + ); + + // ######################################## + // Step #4: Test other host function edge cases + // ######################################## + + // invalid SFields + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_tx_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, 2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_field_invalid_sfield", + ); + }); + check_result( + unsafe { host::get_tx_array_len(2) }, + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(2) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, 2) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_array_len_invalid_sfield", + ); + + // invalid Slice + + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), long_len, ptr, len) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_nested_field(1, locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_field_too_big_slice", + ); + }); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::update_data(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "update_data_too_big_slice", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + long_len, + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + long_len, + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + long_len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "compute_sha512_half_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + long_len, + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "credential_keylet_too_big_slice", + ) + }); + check_result( + unsafe { + host::trace( + locator.as_ptr(), + locator.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_oob_slice", + ); + + // invalid UInt256 + + check_result( + unsafe { host::cache_ledger_obj(locator.as_ptr(), locator.len(), 0) }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_size_uint256", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_issuer_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_taxon_wrong_size_uint256", + ) + }); + check_result( + unsafe { host::get_nft_flags(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_flags_wrong_size_uint256", + ); + check_result( + unsafe { host::get_nft_transfer_fee(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_transfer_fee_wrong_size_uint256", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_serial_wrong_size_uint256", + ) + }); + + // invalid AccountID + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::account_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::check_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "check_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::did_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "did_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::escrow_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "escrow_keylet_wrong_size_accountid", + ) + }); + let currency: &[u8] = b"USD00000000000000000"; // 20 bytes + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "nft_offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::oracle_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "oracle_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "signers_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::ticket_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "ticket_keylet_wrong_size_accountid", + ) + }); + let uint256: &[u8] = b"00000000000000000000000000000001"; + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + locator.as_ptr(), + locator.len(), + uint256.as_ptr(), + uint256.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_accountid", + ) + }); + + // invalid Currency was already tested above + // invalid string + + check_result( + unsafe { + host::trace( + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + uint256.as_ptr(), + uint256.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_nft_wrong_size_string", + ); + + // trace too large + + check_result( + unsafe { + host::trace( + locator.as_ptr(), + locator.len(), + locator.as_ptr(), + long_len, + 0, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_too_long", + ); + check_result( + unsafe { host::trace_num(locator.as_ptr(), long_len, 1) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_num_too_long", + ); + + 1 // <-- If we get here, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py new file mode 100644 index 00000000000..1198946eb50 --- /dev/null +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -0,0 +1,130 @@ +import os +import sys +import subprocess +import re + +OPT = "-Oz" + + +def update_fixture(project_name, wasm): + fixture_name = ( + re.sub(r"_([a-z])", lambda m: m.group(1).upper(), project_name) + "WasmHex" + ) + print(f"Updating fixture: {fixture_name}") + + cpp_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.cpp")) + h_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.h")) + with open(cpp_path, "r", encoding="utf8") as f: + cpp_content = f.read() + + pattern = rf'extern std::string const {fixture_name} =[ \n]+"[^;]*;' + if re.search(pattern, cpp_content, flags=re.MULTILINE): + updated_cpp_content = re.sub( + pattern, + f'extern std::string const {fixture_name} = "{wasm}";', + cpp_content, + flags=re.MULTILINE, + ) + else: + with open(h_path, "r", encoding="utf8") as f: + h_content = f.read() + updated_h_content = ( + h_content.rstrip() + f"\n\n extern std::string const {fixture_name};\n" + ) + with open(h_path, "w", encoding="utf8") as f: + f.write(updated_h_content) + updated_cpp_content = ( + cpp_content.rstrip() + + f'\n\nextern std::string const {fixture_name} = "{wasm}";\n' + ) + + with open(cpp_path, "w", encoding="utf8") as f: + f.write(updated_cpp_content) + + +def process_rust(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), project_name) + ) + wasm_location = f"target/wasm32-unknown-unknown/release/{project_name}.wasm" + build_cmd = ( + f"(cd {project_path} " + f"&& cargo build --target wasm32-unknown-unknown --release " + f"&& wasm-opt {wasm_location} {OPT} -o {wasm_location}" + ")" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print(f"WASM file for {project_name} has been built and optimized.") + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + src_path = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + f"{project_name}/target/wasm32-unknown-unknown/release/{project_name}.wasm", + ) + ) + with open(src_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +def process_c(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.c") + ) + wasm_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.wasm") + ) + build_cmd = ( + f"$CC --sysroot=$SYSROOT -I$SYSROOT/include/wasm32-wasi " + f"-O3 -ffast-math --target=wasm32 -fno-exceptions -fno-threadsafe-statics -fvisibility=default -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -DNDEBUG --no-standard-libraries -fno-builtin-memset " + f"-o {wasm_path} {project_path}" + f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print( + f"WASM file for {project_name} has been built with WASI support using clang." + ) + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + with open(wasm_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +if __name__ == "__main__": + if len(sys.argv) > 2: + print("Usage: python copyFixtures.py []") + sys.exit(1) + if len(sys.argv) == 2: + process_rust(sys.argv[1]) + else: + dirs = [ + d + for d in os.listdir(os.path.dirname(__file__)) + if os.path.isdir(os.path.join(os.path.dirname(__file__), d)) + ] + c_files = [f for f in os.listdir(os.path.dirname(__file__)) if f.endswith(".c")] + for d in dirs: + process_rust(d) + for c in c_files: + process_c(c[:-2]) + print("All fixtures have been processed.") diff --git a/src/test/app/wasm_fixtures/disableFloat.wat b/src/test/app/wasm_fixtures/disableFloat.wat new file mode 100644 index 00000000000..035a849e30d --- /dev/null +++ b/src/test/app/wasm_fixtures/disableFloat.wat @@ -0,0 +1,34 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (result i32))) + (func (;0;) (type 0)) + (func (;1;) (type 1) (result i32) + f32.const -2048 + f32.const 2050 + f32.sub + drop + i32.const 1) + (memory (;0;) 2) + (global (;0;) i32 (i32.const 1024)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 2048)) + (global (;3;) i32 (i32.const 2048)) + (global (;4;) i32 (i32.const 67584)) + (global (;5;) i32 (i32.const 1024)) + (global (;6;) i32 (i32.const 67584)) + (global (;7;) i32 (i32.const 131072)) + (global (;8;) i32 (i32.const 0)) + (global (;9;) i32 (i32.const 1)) + (export "memory" (memory 0)) + (export "__wasm_call_ctors" (func 0)) + (export "finish" (func 1)) + (export "buf" (global 0)) + (export "__dso_handle" (global 1)) + (export "__data_end" (global 2)) + (export "__stack_low" (global 3)) + (export "__stack_high" (global 4)) + (export "__global_base" (global 5)) + (export "__heap_base" (global 6)) + (export "__heap_end" (global 7)) + (export "__memory_base" (global 8)) + (export "__table_base" (global 9))) diff --git a/src/test/app/wasm_fixtures/fib.c b/src/test/app/wasm_fixtures/fib.c new file mode 100644 index 00000000000..4410923054f --- /dev/null +++ b/src/test/app/wasm_fixtures/fib.c @@ -0,0 +1,12 @@ +// typedef long long mint; +typedef int mint; + +mint +fib(mint n) +{ + if (!n) + return 0; + if (n <= 2) + return 1; + return fib(n - 1) + fib(n - 2); +} diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 3424de7006c..9e530997a0e 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -21,67 +21,14 @@ #include -extern std::string const tx_js = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Fee" : "10", - "Flags" : 2147483648, - "OfferSequence" : 2, - "Owner" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Sequence" : 3, - "SigningPubKey" : "0330E7FC9D56BB25D6893BA3F317AE5BCF33B3291BD63DB32654A313222F7FD020", - "TransactionType" : "EscrowFinish", - "TxnSignature" : "30450221008AD5EE48F7F1047813E79C174FE401D023A4B4A7B99AF826E081DB1DFF7B9C510220133F05B7FD3D7D7F163E8C77EE0A49D02619AB6C77CC3487D0095C9B34033C1C", - "hash" : "74465121372813CBA4C77E31F12E137163F5B2509B16AC1703ECF0DA194B2DD4" - })"; -extern std::string const lo_js = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode" : "0", - "PreviousTxnID" : "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - -extern std::string const lo_js2 = R"({ - "Account" : "rHb9CJAWyB4rj91VRWn96DkukG4bwdty00", - "Amount" : "100000", - "CancelAfter" : 790297421, - "Destination" : "rBYn44yhs8cf8G2t79XMUHYQpp2ayhqwcw", - "DestinationNode" : "0", - "FinishAfter" : 790297403, - "FinishFunction" : "0061736D0100000001180460027F7F0060017F017F60027F7F017F60047F7F7F7F00030C0B01010200000000000003000405017001030305030100110619037F01418080C0000B7F0041DD85C0000B7F0041E085C0000B074205066D656D6F7279020008616C6C6F6361746500000F636865636B5F6163636F756E74494400020A5F5F646174615F656E6403010B5F5F686561705F6261736503020908010041010B02060A0AF5360B610002", - "Flags" : 0, - "LedgerEntryType" : "Escrow", - "OwnerNode": "0", - "PreviousTxnID": "CF25D1C6B8E637C7DAC61B586F820A16896A3090D9F6FBF9FA00D8B13A265647", - "PreviousTxnLgrSeq" : 4, - "index" : "9BC6631F3EC761CF9BD846D006560E2D57B0A5C91D4570AEB209645B189A702F" - })"; - -extern std::string const fib32Hex = +extern std::string const fibWasmHex = "0061736d0100000001090260000060017f017f0303020001071b02115f5f" "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" "01017f200045044041000f0b2000410348044041010f0b200041026a2100" "0340200041036b100120016a2101200041026b220041044a0d000b200141" "016a0b"; -extern std::string const fib64Hex = - "0061736d0100000001090260000060017e017e0303020001071b02115f5f" - "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" - "01017e200050044042000f0b2000420353044042010f0b200042027c2100" - "0340200042037d100120017c2101200042027d22004204550d000b200142" - "017c0b00490f7461726765745f6665617475726573042b0f6d757461626c" - "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e6365" - "2d74797065732b0a6d756c746976616c7565"; - -extern std::string const b58Hex = +extern std::string const b58WasmHex = "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" @@ -117,7 +64,7 @@ extern std::string const b58Hex = "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" "65666572656e63652d74797065732b0a6d756c746976616c7565"; -extern std::string const sha512PureHex = +extern std::string const sha512PureWasmHex = "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" "05040001020305030100020607017f0041800d0b075006066d656d6f7279" "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" @@ -175,2097 +122,7 @@ extern std::string const sha512PureHex = "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" "7065732b0a6d756c746976616c7565"; -extern std::string const checkJsonHex = - "0061736d0100000001180460027f7f0060017f017f60027f7f017f60047f7f7f7f" - "00030c0b01010200000000000003000405017001030305030100110619037f0141" - "8080c0000b7f0041dd85c0000b7f0041e085c0000b074205066d656d6f72790200" - "08616c6c6f6361746500000f636865636b5f6163636f756e74494400020a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020908010041010b02060a" - "0af5360b61000240200041004e0440200045044041010f0b418882c0002d00001a" - "200010012200450d0120000f0b230041206b220024002000410036021820004101" - "36020c200041b480c00036020820004204370210200041086a41d080c000100500" - "0b000bee2202087f017e02400240024002400240024002400240200041f4014d04" - "4041ac85c000280200220241102000410b6a41f803712000410b491b2205410376" - "22007622014103710d01200541b485c0002802004d0d0720010d0241b085c00028" - "020022000d030c070b2000410b6a2201417871210541b085c0002802002208450d" - "06411f2107410020056b2103200041f4ffff074d04402005410620014108766722" - "006b7641017120004101746b413e6a21070b2007410274419482c0006a28020022" - "0245044041002100410021010c040b4100210020054100411920074101766b2007" - "411f461b7421044100210103400240200228020441787122062005490d00200620" - "056b220620034f0d0020022101200622030d0041002103200221000c060b200228" - "021422062000200620022004411d764104716a41106a2802002202471b20002006" - "1b21002004410174210420020d000b0c030b02402001417f7341017120006a2206" - "410374220041a483c0006a2203200041ac83c0006a280200220128020822044704" - "402004200336020c200320043602080c010b41ac85c0002002417e200677713602" - "000b20012000410372360204200020016a220020002802044101723602040c060b" - "024041022000742203410020036b72200120007471682206410374220041a483c0" - "006a2203200041ac83c0006a280200220128020822044704402004200336020c20" - "0320043602080c010b41ac85c0002002417e200677713602000b20012005410372" - "360204200120056a2206200020056b2204410172360204200020016a2004360200" - "41b485c00028020022020440200241787141a483c0006a210041bc85c000280200" - "2103027f41ac85c0002802002205410120024103767422027145044041ac85c000" - "200220057236020020000c010b20002802080b2102200020033602082002200336" - "020c2003200036020c200320023602080b41bc85c000200636020041b485c00020" - "043602000c050b200068410274419482c0006a280200220128020441787120056b" - "2103200121020240034002400240200128021022000d00200128021422000d0020" - "022802182107024002402002200228020c22004604402002411441102002280214" - "22001b6a28020022010d01410021000c020b20022802082201200036020c200020" - "013602080c010b200241146a200241106a20001b21040340200421062001220041" - "146a200041106a200028021422011b210420004114411020011b6a28020022010d" - "000b200641003602000b2007450d032002200228021c410274419482c0006a2201" - "28020047044020074110411420072802102002461b6a20003602002000450d040c" - "020b2001200036020020000d0141b085c00041b085c000280200417e200228021c" - "77713602000c030b200028020441787120056b22012003200120034922011b2103" - "2000200220011b2102200021010c010b0b20002007360218200228021022010440" - "20002001360210200120003602180b20022802142201450d002000200136021420" - "0120003602180b02400240200341104f044020022005410372360204200220056a" - "22062003410172360204200320066a200336020041b485c0002802002204450d01" - "200441787141a483c0006a210041bc85c0002802002101027f41ac85c000280200" - "2205410120044103767422047145044041ac85c000200420057236020020000c01" - "0b20002802080b2104200020013602082004200136020c2001200036020c200120" - "043602080c010b2002200320056a2200410372360204200020026a220020002802" - "044101723602040c010b41bc85c000200636020041b485c00020033602000b2002" - "41086a0f0b20002001724504404100210141022007742200410020006b72200871" - "2200450d03200068410274419482c0006a28020021000b2000450d010b03402000" - "20012000280204417871220420056b220620034922071b21082000280210220245" - "0440200028021421020b20012008200420054922001b210120032006200320071b" - "20001b2103200222000d000b0b2001450d00200541b485c00028020022004d2003" - "200020056b4f710d0020012802182107024002402001200128020c220046044020" - "0141144110200128021422001b6a28020022020d01410021000c020b2001280208" - "2202200036020c200020023602080c010b200141146a200141106a20001b210403" - "40200421062002220041146a200041106a200028021422021b2104200041144110" - "20021b6a28020022020d000b200641003602000b02402007450d00024020012001" - "28021c410274419482c0006a220228020047044020074110411420072802102001" - "461b6a20003602002000450d020c010b2002200036020020000d0041b085c00041" - "b085c000280200417e200128021c77713602000c010b2000200736021820012802" - "102202044020002002360210200220003602180b20012802142202450d00200020" - "02360214200220003602180b0240200341104f0440200120054103723602042001" - "20056a22022003410172360204200220036a200336020020034180024f04402002" - "200310070c020b200341f8017141a483c0006a2100027f41ac85c0002802002204" - "410120034103767422037145044041ac85c000200320047236020020000c010b20" - "002802080b2103200020023602082003200236020c2002200036020c2002200336" - "02080c010b2001200320056a2200410372360204200020016a2200200028020441" - "01723602040b0c010b024002400240024002400240200541b485c0002802002201" - "4b0440200541b885c00028020022004f044041002100200541af80046a22014110" - "7640002202417f4622030d0720024110742202450d0741c485c000410020014180" - "807c7120031b220441c485c0002802006a220036020041c885c00041c885c00028" - "02002201200020002001491b3602000240024041c085c000280200220304404194" - "83c0002100034020002802002201200028020422066a2002460d02200028020822" - "000d000b0c020b41d085c00028020022004100200020024d1b45044041d085c000" - "20023602000b41d485c00041ff1f360200419883c0002004360200419483c00020" - "0236020041b083c00041a483c00036020041b883c00041ac83c00036020041ac83" - "c00041a483c00036020041c083c00041b483c00036020041b483c00041ac83c000" - "36020041c883c00041bc83c00036020041bc83c00041b483c00036020041d083c0" - "0041c483c00036020041c483c00041bc83c00036020041d883c00041cc83c00036" - "020041cc83c00041c483c00036020041e083c00041d483c00036020041d483c000" - "41cc83c00036020041e883c00041dc83c00036020041dc83c00041d483c0003602" - "0041a083c000410036020041f083c00041e483c00036020041e483c00041dc83c0" - "0036020041ec83c00041e483c00036020041f883c00041ec83c00036020041f483" - "c00041ec83c000360200418084c00041f483c00036020041fc83c00041f483c000" - "360200418884c00041fc83c000360200418484c00041fc83c000360200419084c0" - "00418484c000360200418c84c000418484c000360200419884c000418c84c00036" - "0200419484c000418c84c00036020041a084c000419484c000360200419c84c000" - "419484c00036020041a884c000419c84c00036020041a484c000419c84c0003602" - "0041b084c00041a484c00036020041b884c00041ac84c00036020041ac84c00041" - "a484c00036020041c084c00041b484c00036020041b484c00041ac84c000360200" - "41c884c00041bc84c00036020041bc84c00041b484c00036020041d084c00041c4" - "84c00036020041c484c00041bc84c00036020041d884c00041cc84c00036020041" - "cc84c00041c484c00036020041e084c00041d484c00036020041d484c00041cc84" - "c00036020041e884c00041dc84c00036020041dc84c00041d484c00036020041f0" - "84c00041e484c00036020041e484c00041dc84c00036020041f884c00041ec84c0" - "0036020041ec84c00041e484c000360200418085c00041f484c00036020041f484" - "c00041ec84c000360200418885c00041fc84c00036020041fc84c00041f484c000" - "360200419085c000418485c000360200418485c00041fc84c000360200419885c0" - "00418c85c000360200418c85c000418485c00036020041a085c000419485c00036" - "0200419485c000418c85c00036020041a885c000419c85c000360200419c85c000" - "419485c00036020041c085c000200236020041a485c000419c85c00036020041b8" - "85c000200441286b220036020020022000410172360204200020026a4128360204" - "41cc85c00041808080013602000c080b200220034d200120034b720d0020002802" - "0c450d030b41d085c00041d085c0002802002200200220002002491b3602002002" - "20046a2101419483c0002100024002400340200120002802002206470440200028" - "020822000d010c020b0b200028020c450d010b419483c000210003400240200320" - "0028020022014f04402003200120002802046a2206490d010b200028020821000c" - "010b0b41c085c000200236020041b885c000200441286b22003602002002200041" - "0172360204200020026a412836020441cc85c00041808080013602002003200641" - "206b41787141086b22002000200341106a491b2201411b360204419483c0002902" - "002109200141106a419c83c00029020037020020012009370208419883c0002004" - "360200419483c0002002360200419c83c000200141086a36020041a083c0004100" - "3602002001411c6a2100034020004107360200200041046a22002006490d000b20" - "012003460d0720012001280204417e713602042003200120036b22004101723602" - "042001200036020020004180024f04402003200010070c080b200041f8017141a4" - "83c0006a2101027f41ac85c0002802002202410120004103767422007145044041" - "ac85c000200020027236020020010c010b20012802080b21002001200336020820" - "00200336020c2003200136020c200320003602080c070b20002002360200200020" - "0028020420046a360204200220054103723602042006410f6a41787141086b2201" - "200220056a22046b2103200141c085c000280200460d03200141bc85c000280200" - "460d04200128020422054103714101460440200120054178712200100820002001" - "6a22012802042105200020036a21030b20012005417e7136020420042003410172" - "360204200320046a200336020020034180024f04402004200310070c060b200341" - "f8017141a483c0006a2100027f41ac85c000280200220141012003410376742203" - "7145044041ac85c000200120037236020020000c010b20002802080b2103200020" - "043602082003200436020c2004200036020c200420033602080c050b41b885c000" - "200020056b220136020041c085c00041c085c000280200220020056a2202360200" - "2002200141017236020420002005410372360204200041086a21000c060b41bc85" - "c00028020021000240200120056b2202410f4d044041bc85c000410036020041b4" - "85c000410036020020002001410372360204200020016a22012001280204410172" - "3602040c010b41b485c000200236020041bc85c000200020056a22033602002003" - "2002410172360204200020016a2002360200200020054103723602040b20004108" - "6a0f0b2000200420066a36020441c085c00041c085c0002802002200410f6a4178" - "71220141086b220236020041b885c00041b885c00028020020046a220320002001" - "6b6a41086a220136020020022001410172360204200020036a412836020441cc85" - "c00041808080013602000c030b41c085c000200436020041b885c00041b885c000" - "28020020036a2200360200200420004101723602040c010b41bc85c00020043602" - "0041b485c00041b485c00028020020036a22003602002004200041017236020420" - "0020046a20003602000b200241086a0f0b4100210041b885c00028020022012005" - "4d0d0041b885c000200120056b220136020041c085c00041c085c0002802002200" - "20056a22023602002002200141017236020420002005410372360204200041086a" - "0f0b20000f0b200141086a0ba203010b7f418882c0002d00001a41221001220704" - "402007410020076b41037122026a21062002044020072103418080c00021050340" - "200320052d00003a0000200541016a2105200341016a22032006490d000b0b2006" - "412220026b220b417c71220a6a210302402002418080406b22024103710440200a" - "41004c0d0120024103742208411871210c2002417c71220541046a210441002008" - "6b411871210820052802002105034020062005200c762004280200220520087472" - "360200200441046a2104200641046a22062003490d000b0c010b200a41004c0d00" - "20022104034020062004280200360200200441046a2104200641046a2206200349" - "0d000b0b2002200a6a2104200b41037122020440200220036a2102034020032004" - "2d00003a0000200441016a2104200341016a22032002490d000b0b200104402001" - "4122460440200021032007210241002105412221080240034020032d0000220920" - "022d00002204460440200341016a2103200241016a2102200841016b22080d010c" - "020b0b200920046b21050b20054521090b2000200110030b20074122100320090f" - "0b000bd20601047f0240200041046b280200220241787122034104410820024103" - "7122021b20016a4f0440200241002003200141276a4b1b0d01200041086b220120" - "0041046b280200220341787122006a21020240024020034101710d002003410271" - "450d012001280200220320006a2100200120036b220141bc85c000280200460440" - "20022802044103714103470d0141b485c000200036020020022002280204417e71" - "36020420012000410172360204200220003602000c020b2001200310080b024002" - "4002400240024020022802042203410271450440200241c085c000280200460d02" - "200241bc85c000280200460d0320022003417871220210082001200020026a2200" - "410172360204200020016a2000360200200141bc85c000280200470d0141b485c0" - "0020003602000c060b20022003417e713602042001200041017236020420002001" - "6a20003602000b2000418002490d022001200010074100210141d485c00041d485" - "c00028020041016b220036020020000d04419c83c0002802002200044003402001" - "41016a2101200028020822000d000b0b41d485c000200141ff1f200141ff1f4b1b" - "3602000c040b41c085c000200136020041b885c00041b885c00028020020006a22" - "003602002001200041017236020441bc85c000280200200146044041b485c00041" - "0036020041bc85c00041003602000b200041cc85c00028020022034d0d0341c085" - "c0002802002202450d034100210041b885c00028020022044129490d02419483c0" - "00210103402002200128020022054f04402002200520012802046a490d040b2001" - "28020821010c000b000b41bc85c000200136020041b485c00041b485c000280200" - "20006a220036020020012000410172360204200020016a20003602000c020b2000" - "41f8017141a483c0006a2102027f41ac85c0002802002203410120004103767422" - "007145044041ac85c000200020037236020020020c010b20022802080b21002002" - "20013602082000200136020c2001200236020c200120003602080c010b419c83c0" - "00280200220104400340200041016a2100200128020822010d000b0b41d485c000" - "200041ff1f200041ff1f4b1b360200200320044f0d0041cc85c000417f3602000b" - "0f0b418981c00041b881c0001004000b41c881c00041f881c0001004000b410101" - "7f230041206b220224002002410036021020024101360204200242043702082002" - "412e36021c200220003602182002200241186a360200200220011005000ba40201" - "037f230041206b22022400200241106a2203200041106a29020037030020024108" - "6a2204200041086a290200370300200241013b011c200220013602182002200029" - "0200370300230041206b2200240020022802182101200041106a20032902003703" - "00200041086a20042902003703002000200236021c200020013602182000200229" - "020037030041002102230041106b22012400200028020c21030240024002400240" - "20002802040e020001020b20030d01410121030c020b20030d0020002802002203" - "2802042102200328020021030c010b20014180808080783602002001200036020c" - "20014101200028021c22002d001c20002d001d1009000b20012002360204200120" - "0336020020014102200028021c22002d001c20002d001d1009000b090020004100" - "3602000bba0201047f411f210220004200370210200141ffffff074d0440200141" - "0620014108766722036b7641017120034101746b413e6a21020b2000200236021c" - "2002410274419482c0006a21044101200274220341b085c0002802007145044020" - "042000360200200020043602182000200036020c2000200036020841b085c00041" - "b085c0002802002003723602000f0b024002402001200428020022032802044178" - "71460440200321020c010b20014100411920024101766b2002411f461b74210503" - "4020032005411d764104716a41106a22042802002202450d022005410174210520" - "02210320022802044178712001470d000b0b20022802082201200036020c200220" - "00360208200041003602182000200236020c200020013602080f0b200420003602" - "00200020033602182000200036020c200020003602080bf10201047f200028020c" - "21020240024020014180024f044020002802182103024002402000200246044020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000280208" - "2201200236020c200220013602080c010b200041146a200041106a20021b210403" - "40200421052001220241146a200241106a200228021422011b2104200241144110" - "20011b6a28020022010d000b200541003602000b2003450d022000200028021c41" - "0274419482c0006a220128020047044020034110411420032802102000461b6a20" - "023602002002450d030c020b2001200236020020020d0141b085c00041b085c000" - "280200417e200028021c77713602000c020b200028020822002002470440200020" - "0236020c200220003602080f0b41ac85c00041ac85c000280200417e2001410376" - "77713602000f0b2002200336021820002802102201044020022001360210200120" - "023602180b20002802142200450d0020022000360214200020023602180b0b7b01" - "017f230041106b22032400419082c000419082c000280200220441016a36020002" - "4020044100480d00024041dc85c0002d000045044041d885c00041d885c0002802" - "0041016a360200418c82c00028020041004e0d010c020b200341086a2000200111" - "0000000b41dc85c00041003a00002002450d00000b000b0c002000200129020037" - "03000b0b8f020100418080c0000b850272486239434a4157794234726a39315652" - "576e3936446b756b4734627764747954686361706163697479206f766572666c6f" - "77002200100011000000616c6c6f632f7372632f7261775f7665632e72733c0010" - "001400000018000000050000002f727573742f646570732f646c6d616c6c6f632d" - "302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f6e206661" - "696c65643a207073697a65203e3d2073697a65202b206d696e5f6f766572686561" - "64006000100029000000a804000009000000617373657274696f6e206661696c65" - "643a207073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "6000100029000000ae0400000d00550970726f64756365727302086c616e677561" - "6765010452757374000c70726f6365737365642d62790105727573746325312e38" - "332e302d6e696768746c79202863326637346333663920323032342d30392d3039" - "2900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f" - "62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - -extern std::string const compareJsonHex = - "0061736d0100000001791160017f0060037f7f7f017f60027f7f017f60027f7f00" - "60037f7f7f0060047f7f7f7f0060017f017f60047f7f7f7e0060057f7f7f7e7f00" - "60057f7f7f7f7f0060047f7f7f7f017f60000060037e7f7f017f60067f7f7f7f7f" - "7f017f60057f7f7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f0003" - "616004030305060001070808080809040702000000040403030304030500020306" - "0a0609000b0300040103030402040c000d0e04010202010204040f090902020204" - "0903020201020200000405000203030402020205100b0303000005030101010104" - "05017001121205030100110619037f01418080c0000b7f004195d3c0000b7f0041" - "a0d3c0000b074405066d656d6f7279020008616c6c6f63617465001e11636f6d70" - "6172655f6163636f756e744944001f0a5f5f646174615f656e6403010b5f5f6865" - "61705f6261736503020917010041010b1134332b3c3d3e4345565b124247445251" - "460ad3cf0260ea0301057f23808080800041e0006b220324808080800020034100" - "360228200320023602242003200136022020034180013a002c2003410036021c20" - "03428080808010370214200341c8006a200341146a108180808000024002400240" - "024020032d00484106460d00200341306a41106a2204200341c8006a41106a2903" - "00370300200341306a41086a2205200341c8006a41086a29030037030020032003" - "2903483703300240024020032802282202200328022422064f0d00200328022021" - "070340200720026a2d000041776a220141174b0d02410120017441938080047145" - "0d022006200241016a2202470d000b200320063602280b20002003290330370300" - "200041106a2004290300370300200041086a200529030037030020032802142202" - "450d04200328021820021082808080000c040b20032002360228200341086a2007" - "20062006200241016a220220062002491b10838080800041002d00c0cfc080001a" - "200328020c21012003280208210641141084808080002202450d01200220063602" - "0c2002411636020020002002360204200041063a00002002200136021020034130" - "6a1085808080000c020b2000200328024c360204200041063a00000c010b000b20" - "032802142202450d00200328021820021082808080000b200341e0006a24808080" - "80000beb28020c7f037e2380808080004180036b2202248080808000200128020c" - "210302400240024002400240024002400240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240200128021422" - "04200128021022054f0d002001410c6a21060340200320046a2d0000220741776a" - "220841174b0d024101200874419380800471450d022001200441016a2204360214" - "20052004470d000b200521040b200241f0006a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228027421082002280270" - "2101411410848080800022040d010c1b0b200741e5004a0d0820074122460d0620" - "07412d460d07200741db00470d09200120012d0018417f6a22083a001820044101" - "6a2104200841ff0171450d0520012004360214200241003602e002200242808080" - "8080013702d80241082109200420054f0d02200241b0016a41086a210a200241b0" - "016a410172210b410821094100210c4101210d0340200628020021030240034020" - "0320046a2d0000220741776a220841174b0d014101200874419380800471450d01" - "2001200441016a220436021420052004470d000b200521040c040b024002400240" - "200741dd00460d00200d4101710d02200441016a210402402007412c470d002001" - "20043602140240200420054f0d000340200320046a2d0000220741776a22084117" - "4b0d044101200874419380800471450d042001200441016a220436021420052004" - "470d000b200521040b200241386a200320052005200441016a220420052004491b" - "10838080800041002d00c0cfc080001a200228023c210420022802382108411410" - "84808080002207450d1f2007200836020c20074105360200200720043602100c08" - "0b200241c8006a200320052005200420052004491b10838080800041002d00c0cf" - "c080001a200228024c21042002280248210841141084808080002207450d1e2007" - "200836020c20074107360200200720043602100c070b20022902dc02210e200228" - "02d802210741042106410021090c070b200741dd00470d00200241c0006a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228024421042002280240210841141084808080002207450d1c2007200836020c" - "20074115360200200720043602100c050b200241b0016a20011081808080000240" - "20022d00b00122084106470d0020022802b40121070c050b200241d4026a41026a" - "2205200b41026a2d00003a0000200241c0026a41086a2203200a41086a29030037" - "03002002200b2f00003b01d4022002200a2903003703c00220022802b401210702" - "40200c20022802d802470d00200241d8026a1090808080000b20022802dc022209" - "200c41186c6a220420022903c002370308200420083a0000200420022f01d4023b" - "000120042007360204200441106a2003290300370300200441036a20052d00003a" - "00002002200c41016a220c3602e0024100210d2001280214220420012802102205" - "4f0d020c000b0b2004200136020c2004410536020020002004360204200041063a" - "0000200420083602100c180b200628020021030b200241306a2003200520052004" - "41016a220420052004491b10838080800041002d00c0cfc080001a200228023421" - "042002280230210841141084808080002207450d172007200836020c2007410236" - "0200200720043602100b200241d8026a109180808000024020022802d802220445" - "0d002009200441186c1082808080000b200128020c210320012802142104200128" - "0210210541062106410121090b200120012d001841016a3a001802400240200420" - "054f0d0003400240024002400240024002400240200320046a2d00002208410c4a" - "0d00200841776a4102490d060c010b02402008411f4a0d002008410d470d010c06" - "0b20084120460d052008412c460d01200841dd00460d020b200241106a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28021421082002280210210541141084808080002204450d1d200441163602000c" - "070b2001200441016a2204360214200420054f0d020340200320046a2d0000220c" - "41776a220841174b0d024101200874419380800471450d022001200441016a2204" - "36021420052004470d000b200521040c020b2001200441016a3602142002200e37" - "03b801200220073602b401200220063a00b00102402009450d00200241063a0078" - "2002200736027c0c180b200241f8006a41106a200241b0016a41106a2903003703" - "00200241f8006a41086a200241b0016a41086a290300370300200220022903b001" - "3703780c170b200c41dd00470d00200241286a200320052005200441016a220420" - "052004491b10838080800041002d00c0cfc080001a200228022c21082002280228" - "210541141084808080002204450d1a200441153602000c040b200241206a200320" - "052005200441016a220420052004491b10838080800041002d00c0cfc080001a20" - "0228022421082002280220210541141084808080002204450d1920044116360200" - "0c030b2001200441016a220436021420052004470d000b200521040b200241186a" - "200320052005200441016a220420052004491b10838080800041002d00c0cfc080" - "001a200228021c21082002280218210541141084808080002204450d1620044102" - "3602000b2004200536020c20042008360210200220043602c8012002200e3703b8" - "01200220073602b401200220063a00b001024020090d00200241063a0078200220" - "0436027c200241b0016a1085808080000c120b200241063a00782002200736027c" - "200241c8016a1092808080000c110b200241086a20032005200520042005200449" - "1b10838080800041002d00c0cfc080001a200228020c2108200228020821014114" - "1084808080002204450d142004200136020c200441183602002000200436020420" - "0041063a0000200420083602100c130b200141003602082001200441016a360214" - "200241b0016a2006200110938080800020022802b40121080240024020022802b0" - "0122054102460d0020022802b8012104024020050d00200241f8006a2008200410" - "948080800020022d00784106460d1320002002290378370300200041106a200241" - "f8006a41106a290300370300200041086a200241f8006a41086a2903003703000c" - "150b41002101024020044100480d00024020040d0041012101410021050c030b41" - "002d00c0cfc080001a20042105200410848080800022010d02410121010b200120" - "04109580808000000b200041063a0000200020083602040c130b200241f8006a41" - "086a220320012008200410df808080003602002002200536027c200241033a0078" - "2002200436028401200041106a200241f8006a41106a290300370300200041086a" - "2003290300370300200020022903783703000c120b2001200441016a3602142002" - "4190016a20014100108d8080800002402002290390014203510d00200241f8006a" - "20024190016a109680808000024020022d00784106460d00200020022903783703" - "00200041106a200241f8006a41106a290300370300200041086a200241f8006a41" - "086a2903003703000c130b200228027c2001108f808080002104200041063a0000" - "200020043602040c120b2000200228029801360204200041063a00000c110b0240" - "200741f3004a0d00200741e600460d04200741ee00470d012001200441016a3602" - "14200141bb80c0800041031086808080002204450d02200041063a000020002004" - "3602040c110b200741f400460d02200741fb00460d040b200741506a41ff017141" - "0a490d042002200320052005200441016a220420052004491b1083808080004100" - "2d00c0cfc080001a20022802042108200228020021054114108480808000220445" - "0d102004200536020c2004410a360200200420083602102002200436027c0c0d0b" - "200241003a007820002002290378370300200041086a200241f8006a41086a2903" - "00370300200041106a200241f8006a41106a2903003703000c0e0b200120044101" - "6a3602140240200141be80c0800041031086808080002204450d00200041063a00" - "00200020043602040c0e0b20024181023b01782000200229037837030020004108" - "6a200241f8006a41086a290300370300200041106a200241f8006a41106a290300" - "3703000c0d0b2001200441016a3602140240200141c180c0800041041086808080" - "002204450d00200041063a0000200020043602040c0d0b200241013b0178200020" - "02290378370300200041086a200241f8006a41086a290300370300200041106a20" - "0241f8006a41106a2903003703000c0c0b200120012d0018417f6a22083a001820" - "0441016a2104200841ff0171450d0720012004360214200241013a00d801200220" - "013602d401200241b0016a200241d4016a10978080800002400240024020022d00" - "b0010d004105210620022d00b1010d01410021074200210e0c020b20022802b401" - "21070c070b20022802d401220441003602082004200428021441016a3602142002" - "41b0016a2004410c6a200410938080800020022802b401210720022802b0014102" - "460d06200241d8026a200720022802b801109880808000024020022802d8022204" - "418080808078470d0020022802dc0221070c070b20022802dc0221080240200441" - "8180808078470d00200821070c070b20022802e0022105200241003602e4012002" - "41003602dc01200220053602e002200220083602dc02200220043602d802200241" - "e8016a200241d4016a10998080800020022d00e8014106460d04200241b0016a20" - "0241dc016a200241d8026a200241e8016a109a80808000024020022d00b0014106" - "460d00200241b0016a1085808080000b20024180026a41046a2108200241b0016a" - "41046a21050340200241b0016a200241d4016a10978080800020022d00b0010d03" - "024020022d00b101450d0020022802d40122044100360208200420042802144101" - "6a360214200241b0016a2004410c6a200410938080800020022802b40121072002" - "2802b0014102460d07200241f4026a200720022802b80110988080800002402002" - "2802f4022204418080808078470d0020022802f80221070c080b20022802f80221" - "072004418180808078460d0720022802fc022103200241b0016a200241d4016a10" - "9980808000024020022d00b0014106470d0020022802b401210802402004450d00" - "200720041082808080000b200821070c080b200241d8026a41106a200241b0016a" - "41106a2209290300220e370300200241d8026a41086a200241b0016a41086a220c" - "290300220f370300200220022903b00122103703d802200541106a200e37020020" - "0541086a200f3702002005201037020020024180026a41086a200c290200370300" - "20024180026a41106a200929020037030020024180026a41186a200241b0016a41" - "186a280200360200200220022902b00137038002200220033602a4022002200736" - "02a0022002200436029c02200241a8026a41106a200841106a2902003703002002" - "41a8026a41086a200841086a290200370300200220082902003703a802200241b0" - "016a200241dc016a2002419c026a200241a8026a109a8080800020022d00b00141" - "06460d01200241b0016a1085808080000c010b0b20022802dc01210720022902e0" - "01210e0b410021090c060b200241a0016a20014101108d8080800020022903a001" - "4203510d01200241f8006a200241a0016a109680808000024020022d0078410646" - "0d0020002002290378370300200041106a200241f8006a41106a29030037030020" - "0041086a200241f8006a41086a2903003703000c0b0b200228027c2001108f8080" - "80002104200041063a0000200020043602040c0a0b20022802b40121070c020b20" - "0020022802a801360204200041063a00000c080b20022802ec0121072004450d00" - "200820041082808080000b200241dc016a109b808080000b41062106410121090b" - "200120012d001841016a3a0018200128020c210302400240024020012802142204" - "200128021022054f0d00034002400240200320046a2d00002208410c4a0d002008" - "41776a4102490d010c040b02402008411f4a0d002008410d470d040c010b200841" - "20460d0002402008412c460d00200841fd00470d042001200441016a3602144100" - "21040c050b200241e8006a200320052005200441016a220420052004491b108380" - "80800041002d00c0cfc080001a200228026c210820022802682105411410848080" - "80002204450d0a2004200536020c20044115360200200420083602100c040b2001" - "200441016a220436021420052004470d000b200521040b200241e0006a20032005" - "2005200441016a220420052004491b10838080800041002d00c0cfc080001a2002" - "28026421082002280260210541141084808080002204450d072004200536020c20" - "044103360200200420083602100c010b200241d8006a200320052005200441016a" - "220420052004491b10838080800041002d00c0cfc080001a200228025c21082002" - "280258210541141084808080002204450d062004200536020c2004411636020020" - "0420083602100b200220063a00b001200220022f00d8023b00b101200220043602" - "c8012002200e3703b801200220073602b4012002200241da026a2d00003a00b301" - "024020090d00024020040d00200241f8006a41106a200241b0016a41106a290300" - "370300200241f8006a41086a200241b0016a41086a290300370300200220022903" - "b0013703780c030b200241063a00782002200436027c200241b0016a1085808080" - "000c020b200241063a00782002200736027c2004450d01200241c8016a10928080" - "80000c010b200241d0006a200320052005200420052004491b1083808080004100" - "2d00c0cfc080001a20022802542108200228025021014114108480808000220445" - "0d042004200136020c2004411836020020002004360204200041063a0000200420" - "083602100c030b20022d00784106470d010b200228027c2001108f808080002104" - "200041063a0000200020043602040c010b20002002290378370300200041106a20" - "0241f8006a41106a290300370300200041086a200241f8006a41086a2903003703" - "000b20024180036a2480808080000f0b000b7001027f024002402000417c6a2802" - "002202417871220341044108200241037122021b20016a490d0002402002450d00" - "2003200141276a4b0d020b200010a5808080000f0b41c9c5c08000412e41f8c5c0" - "800010a680808000000b4188c6c08000412e41b8c6c0800010a680808000000be6" - "0301057f02400240024002400240024020022003490d0041012104410021052003" - "4101480d04200120036a21060240200341034b0d000340200620014d0d06200641" - "7f6a22062d0000410a470d000c050b0b024041808284082006417c6a2800002207" - "418a94a8d000736b20077241808182847871418081828478460d00034020062001" - "4d0d062006417f6a22062d0000410a470d000c050b0b200320064103716b210720" - "034109490d0103400240024020074108480d004180828408200120076a22064178" - "6a2802002208418a94a8d000736b20087241808182847871418081828478460d01" - "0b200120076a21060c040b200741786a210741808284082006417c6a2802002208" - "418a94a8d000736b20087241808182847871418081828478460d000c030b0b2003" - "20024188bcc0800010b180808000000b200120076a21060340200620014d0d0320" - "06417f6a22062d0000410a470d000c020b0b0340200620014d0d022006417f6a22" - "062d0000410a470d000b0b200620016b41016a220520024b0d010b024020012005" - "6a20014d0d0041002106200521070340200620012d0000410a466a210620014101" - "6a21012007417f6a22070d000b200641016a21040b200020043602002000200320" - "056b3602040f0b200520024198bcc0800010b180808000000bc12502087f017e02" - "400240024002400240024002400240200041f4014b0d0041002802e4d2c0800022" - "0141102000410b6a41f803712000410b491b220241037622037622004103710d01" - "200241002802ecd2c080004d0d0720000d0241002802e8d2c0800022000d030c07" - "0b2000410b6a2203417871210241002802e8d2c080002204450d06411f21050240" - "200041f4ffff074b0d002002410620034108766722006b7641017120004101746b" - "413e6a21050b410020026b21030240200541027441cccfc080006a28020022010d" - "0041002100410021060c040b4100210020024100411920054101766b2005411f46" - "1b74210741002106034002402001220128020441787122082002490d0020082002" - "6b220820034f0d00200821032001210620080d004100210320012106200121000c" - "060b200128021422082000200820012007411d764104716a41106a280200220147" - "1b200020081b2100200741017421072001450d040c000b0b024002402000417f73" - "41017120036a2207410374220041dcd0c080006a2202200041e4d0c080006a2802" - "0022032802082206460d002006200236020c200220063602080c010b4100200141" - "7e200777713602e4d2c080000b20032000410372360204200320006a2200200028" - "0204410172360204200341086a0f0b024002402000200374410220037422004100" - "20006b7271682208410374220341dcd0c080006a2206200341e4d0c080006a2802" - "0022002802082207460d002007200636020c200620073602080c010b4100200141" - "7e200877713602e4d2c080000b20002002410372360204200020026a2207200320" - "026b2202410172360204200020036a2002360200024041002802ecd2c080002201" - "450d00200141787141dcd0c080006a210641002802f4d2c0800021030240024041" - "002802e4d2c08000220841012001410376742201710d00410020082001723602e4" - "d2c08000200621010c010b200628020821010b200620033602082001200336020c" - "2003200636020c200320013602080b410020073602f4d2c08000410020023602ec" - "d2c08000200041086a0f0b20006841027441cccfc080006a280200220628020441" - "787120026b2103200621010240024003400240200628021022000d002006280214" - "22000d0020012802182105024002400240200128020c22002001470d0020014114" - "4110200128021422001b6a28020022060d01410021000c020b2001280208220620" - "0036020c200020063602080c010b200141146a200141106a20001b210703402007" - "21082006220041146a200041106a200028021422061b210720004114411020061b" - "6a28020022060d000b200841003602000b2005450d030240200128021c41027441" - "cccfc080006a22062802002001460d0020054110411420052802102001461b6a20" - "003602002000450d040c030b2006200036020020000d02410041002802e8d2c080" - "00417e200128021c77713602e8d2c080000c030b200028020441787120026b2206" - "2003200620034922061b21032000200120061b2101200021060c000b0b20002005" - "360218024020012802102206450d0020002006360210200620003602180b200128" - "02142206450d0020002006360214200620003602180b0240024002402003411049" - "0d0020012002410372360204200120026a22022003410172360204200220036a20" - "0336020041002802ecd2c080002207450d01200741787141dcd0c080006a210641" - "002802f4d2c0800021000240024041002802e4d2c0800022084101200741037674" - "2207710d00410020082007723602e4d2c08000200621070c010b20062802082107" - "0b200620003602082007200036020c2000200636020c200020073602080c010b20" - "01200320026a2200410372360204200120006a220020002802044101723602040c" - "010b410020023602f4d2c08000410020033602ecd2c080000b200141086a0f0b02" - "4020002006720d004100210641022005742200410020006b722004712200450d03" - "20006841027441cccfc080006a28020021000b2000450d010b0340200020062000" - "280204417871220120026b220820034922051b2104200120024921072008200320" - "051b21080240200028021022010d00200028021421010b2006200420071b210620" - "03200820071b21032001210020010d000b0b2006450d00024041002802ecd2c080" - "0022002002490d002003200020026b4f0d010b2006280218210502400240024020" - "0628020c22002006470d00200641144110200628021422001b6a28020022010d01" - "410021000c020b20062802082201200036020c200020013602080c010b20064114" - "6a200641106a20001b21070340200721082001220041146a200041106a20002802" - "1422011b210720004114411020011b6a28020022010d000b200841003602000b02" - "402005450d0002400240200628021c41027441cccfc080006a2201280200200646" - "0d0020054110411420052802102006461b6a20003602002000450d020c010b2001" - "200036020020000d00410041002802e8d2c08000417e200628021c77713602e8d2" - "c080000c010b20002005360218024020062802102201450d002000200136021020" - "0120003602180b20062802142201450d0020002001360214200120003602180b02" - "40024020034110490d0020062002410372360204200620026a2200200341017236" - "0204200020036a200336020002402003418002490d002000200310d7808080000c" - "020b200341f8017141dcd0c080006a21020240024041002802e4d2c08000220141" - "012003410376742203710d00410020012003723602e4d2c08000200221030c010b" - "200228020821030b200220003602082003200036020c2000200236020c20002003" - "3602080c010b2006200320026a2200410372360204200620006a22002000280204" - "4101723602040b200641086a0f0b024002400240024002400240024041002802ec" - "d2c08000220020024f0d00024041002802f0d2c08000220020024b0d0041002100" - "200241af80046a220641107640002203417f4622070d0720034110742201450d07" - "410041002802fcd2c08000410020064180807c7120071b22086a22003602fcd2c0" - "800041004100280280d3c0800022032000200320004b1b360280d3c08000024002" - "40024041002802f8d2c080002203450d0041ccd0c0800021000340200028020022" - "06200028020422076a2001460d02200028020822000d000c030b0b024002404100" - "280288d3c080002200450d00200020014d0d010b41002001360288d3c080000b41" - "0041ff1f36028cd3c08000410020083602d0d0c08000410020013602ccd0c08000" - "410041dcd0c080003602e8d0c08000410041e4d0c080003602f0d0c08000410041" - "dcd0c080003602e4d0c08000410041ecd0c080003602f8d0c08000410041e4d0c0" - "80003602ecd0c08000410041f4d0c08000360280d1c08000410041ecd0c0800036" - "02f4d0c08000410041fcd0c08000360288d1c08000410041f4d0c080003602fcd0" - "c0800041004184d1c08000360290d1c08000410041fcd0c08000360284d1c08000" - "4100418cd1c08000360298d1c0800041004184d1c0800036028cd1c08000410041" - "94d1c080003602a0d1c080004100418cd1c08000360294d1c08000410041003602" - "d8d0c080004100419cd1c080003602a8d1c0800041004194d1c0800036029cd1c0" - "80004100419cd1c080003602a4d1c08000410041a4d1c080003602b0d1c0800041" - "0041a4d1c080003602acd1c08000410041acd1c080003602b8d1c08000410041ac" - "d1c080003602b4d1c08000410041b4d1c080003602c0d1c08000410041b4d1c080" - "003602bcd1c08000410041bcd1c080003602c8d1c08000410041bcd1c080003602" - "c4d1c08000410041c4d1c080003602d0d1c08000410041c4d1c080003602ccd1c0" - "8000410041ccd1c080003602d8d1c08000410041ccd1c080003602d4d1c0800041" - "0041d4d1c080003602e0d1c08000410041d4d1c080003602dcd1c08000410041dc" - "d1c080003602e8d1c08000410041e4d1c080003602f0d1c08000410041dcd1c080" - "003602e4d1c08000410041ecd1c080003602f8d1c08000410041e4d1c080003602" - "ecd1c08000410041f4d1c08000360280d2c08000410041ecd1c080003602f4d1c0" - "8000410041fcd1c08000360288d2c08000410041f4d1c080003602fcd1c0800041" - "004184d2c08000360290d2c08000410041fcd1c08000360284d2c080004100418c" - "d2c08000360298d2c0800041004184d2c0800036028cd2c0800041004194d2c080" - "003602a0d2c080004100418cd2c08000360294d2c080004100419cd2c080003602" - "a8d2c0800041004194d2c0800036029cd2c08000410041a4d2c080003602b0d2c0" - "80004100419cd2c080003602a4d2c08000410041acd2c080003602b8d2c0800041" - "0041a4d2c080003602acd2c08000410041b4d2c080003602c0d2c08000410041ac" - "d2c080003602b4d2c08000410041bcd2c080003602c8d2c08000410041b4d2c080" - "003602bcd2c08000410041c4d2c080003602d0d2c08000410041bcd2c080003602" - "c4d2c08000410041ccd2c080003602d8d2c08000410041c4d2c080003602ccd2c0" - "8000410041d4d2c080003602e0d2c08000410041ccd2c080003602d4d2c0800041" - "0020013602f8d2c08000410041d4d2c080003602dcd2c080004100200841586a22" - "003602f0d2c0800020012000410172360204200120006a41283602044100418080" - "8001360284d3c080000c080b200320014f0d00200620034b0d00200028020c450d" - "030b41004100280288d3c080002200200120002001491b360288d3c08000200120" - "086a210641ccd0c0800021000240024002400340200028020022072006460d0120" - "0028020822000d000c020b0b200028020c450d010b41ccd0c08000210002400340" - "02402000280200220620034b0d002003200620002802046a2206490d020b200028" - "020821000c000b0b410020013602f8d2c080004100200841586a22003602f0d2c0" - "800020012000410172360204200120006a412836020441004180808001360284d3" - "c080002003200641606a41787141786a22002000200341106a491b2207411b3602" - "0441002902ccd0c080002109200741106a41002902d4d0c0800037020020072009" - "370208410020083602d0d0c08000410020013602ccd0c080004100200741086a36" - "02d4d0c08000410041003602d8d0c080002007411c6a2100034020004107360200" - "200041046a22002006490d000b20072003460d0720072007280204417e71360204" - "2003200720036b22004101723602042007200036020002402000418002490d0020" - "03200010d7808080000c080b200041f8017141dcd0c080006a2106024002404100" - "2802e4d2c08000220141012000410376742200710d00410020012000723602e4d2" - "c08000200621000c010b200628020821000b200620033602082000200336020c20" - "03200636020c200320003602080c070b200020013602002000200028020420086a" - "360204200120024103723602042007410f6a41787141786a2206200120026a2200" - "6b2103200641002802f8d2c08000460d03200641002802f4d2c08000460d040240" - "200628020422024103714101470d0020062002417871220210a880808000200220" - "036a2103200620026a220628020421020b20062002417e71360204200020034101" - "72360204200020036a200336020002402003418002490d002000200310d7808080" - "000c060b200341f8017141dcd0c080006a21020240024041002802e4d2c0800022" - "0641012003410376742203710d00410020062003723602e4d2c08000200221030c" - "010b200228020821030b200220003602082003200036020c2000200236020c2000" - "20033602080c050b4100200020026b22033602f0d2c08000410041002802f8d2c0" - "8000220020026a22063602f8d2c080002006200341017236020420002002410372" - "360204200041086a21000c060b41002802f4d2c08000210302400240200020026b" - "2206410f4b0d00410041003602f4d2c08000410041003602ecd2c0800020032000" - "410372360204200320006a220020002802044101723602040c010b410020063602" - "ecd2c080004100200320026a22013602f4d2c08000200120064101723602042003" - "20006a2006360200200320024103723602040b200341086a0f0b2000200720086a" - "360204410041002802f8d2c080002200410f6a417871220341786a22063602f8d2" - "c080004100200020036b41002802f0d2c0800020086a22036a41086a22013602f0" - "d2c0800020062001410172360204200020036a4128360204410041808080013602" - "84d3c080000c030b410020003602f8d2c08000410041002802f0d2c0800020036a" - "22033602f0d2c08000200020034101723602040c010b410020003602f4d2c08000" - "410041002802ecd2c0800020036a22033602ecd2c0800020002003410172360204" - "200020036a20033602000b200141086a0f0b4100210041002802f0d2c080002203" - "20024d0d004100200320026b22033602f0d2c08000410041002802f8d2c0800022" - "0020026a22063602f8d2c080002006200341017236020420002002410372360204" - "200041086a0f0b20000b6801017f024002400240024020002d00000e0503030301" - "02000b200041046a109b808080000c020b20002802042201450d01200028020820" - "011082808080000f0b200041046a10918080800020002802042201450d00200028" - "0208200141186c1082808080000f0b0ba20201087f23808080800041106b220324" - "80808080002000280214220420002802102205200420054b1b2106200028020c21" - "0702400240024002400340024020020d00410021040c050b20062004460d012000" - "200441016a22083602142002417f6a2102200720046a210920012d0000210a2008" - "2104200141016a2101200a20092d0000460d000b200341086a2007200520081083" - "8080800041002d00c0cfc080001a200328020c2101200328020821024114108480" - "8080002204450d01200441093602000c020b200320072005200610838080800041" - "002d00c0cfc080001a200328020421012003280200210241141084808080002204" - "450d00200441053602000c010b000b2004200236020c200420013602100b200341" - "106a24808080800020040b970202027f027e23808080800041106b220424808080" - "8000024002400240024002400240024002402001280214220520012802104f0d00" - "200128020c20056a2d00002205412e460d01200541c500460d02200541e500460d" - "020b2002450d02420121060c050b20042001200220034100108880808000200428" - "02000d020c030b200420012002200341001089808080002004280200450d022000" - "2004280204360208200042033703000c040b420021060240420020037d22074200" - "590d0042022106200721030c030b2003babd428080808080808080807f8421030c" - "020b20002004280204360208200042033703000c020b2004290308210342002106" - "0b20002003370308200020063703000b200441106a2480808080000bfa0301097f" - "23808080800041106b220524808080800020012001280214220641016a22073602" - "140240024002402007200128021022084f0d00200720086b2109200128020c210a" - "410021060240024003400240200a20076a2d0000220b41506a220c41ff0171220d" - "410a490d00024020060d002005200a20082008200741016a220720082007491b10" - "838080800041002d00c0cfc080001a200528020421062005280200210c41141084" - "808080002207450d072007200c36020c2007410d36020020002007360204200041" - "01360200200720063602100c060b200620046a2107200b41207241e500470d0320" - "0020012002200320071089808080000c050b024020034298b3e6cc99b3e6cc1958" - "0d0020034299b3e6cc99b3e6cc19520d02200d41054b0d020b2001200741016a22" - "073602142006417f6a21062003420a7e200cad42ff01837c210320072008470d00" - "0b200920046a21070c010b2000200120022003200620046a108a808080000c020b" - "20002001200220032007108b808080000c010b200541086a200128020c20082008" - "200641026a220720082007491b10838080800041002d00c0cfc080001a20052802" - "0c21062005280208210c41141084808080002207450d012007200c36020c200741" - "053602002000200736020420004101360200200720063602100b200541106a2480" - "808080000f0b000bb80401077f23808080800041106b2205248080808000410121" - "0620012001280214220741016a220836021402402008200128021022094f0d0041" - "01210602400240200128020c20086a2d000041556a0e03010200020b410021060b" - "2001200741026a22083602140b200128020c210a02400240024002400240024002" - "40200820094f0d002001200841016a2207360214200a20086a2d000041506a41ff" - "01712208410a4f0d010240200720094f0d000340200a20076a2d000041506a41ff" - "0171220b410a4f0d012001200741016a22073602140240200841cb99b3e6004c0d" - "00200841cc99b3e600470d07200b41074b0d070b2008410a6c200b6a2108200920" - "07470d000b0b20060d02200420086b2207411f7541808080807873200720084100" - "4a2007200448731b21070c030b200541086a200a2009200810838080800041002d" - "00c0cfc080001a200528020c21012005280208210841141084808080002207450d" - "042007200836020c20074105360200200020073602042000410136020020072001" - "3602100c050b2005200a2009200710838080800041002d00c0cfc080001a200528" - "020421012005280200210841141084808080002207450d032007200836020c2007" - "410d3602002000200736020420004101360200200720013602100c040b20042008" - "6a2207411f7541808080807873200720084100482007200448731b21070b200020" - "01200220032007108b808080000c020b2000200120022003502006108c80808000" - "0c010b000b200541106a2480808080000b7f01047f024002402001280214220520" - "0128021022064f0d00200128020c210702400340200720056a2d0000220841506a" - "41ff017141094b0d012001200541016a220536021420062005470d000c020b0b20" - "0841207241e500460d010b20002001200220032004108b808080000f0b20002001" - "2002200320041089808080000b9f0304017f017c017f017c23808080800041106b" - "22052480808080002003ba2106024002400240024002400240024020042004411f" - "7522077320076b220741b502490d0003402006440000000000000000610d062004" - "417f4a0d02200644a0c8eb85f3cce17fa32106200441b4026a22042004411f7522" - "077320076b220741b4024b0d000b0b200741037441f0a6c080006a2b0300210820" - "04417f4a0d0120062008a321060c040b2005200128020c20012802102001280214" - "10838080800041002d00c0cfc080001a2005280204210720052802002101411410" - "84808080002204450d022004200136020c2004410e360200200020043602042004" - "20073602100c010b20062008a222069944000000000000f07f620d02200541086a" - "200128020c2001280210200128021410838080800041002d00c0cfc080001a2005" - "28020c21072005280208210141141084808080002204450d012004200136020c20" - "04410e36020020002004360204200420073602100b410121040c020b000b200020" - "0620069a20021b390308410021040b20002004360200200541106a248080808000" - "0b840201027f23808080800041106b220524808080800002400240024002402004" - "450d002003450d010b20012802142204200128021022034f0d01200128020c2106" - "0340200620046a2d000041506a41ff0171410a4f0d022001200441016a22043602" - "1420032004470d000c020b0b200541086a200128020c2001280210200128021410" - "838080800041002d00c0cfc080001a200528020c21012005280208210302404114" - "1084808080002204450d002004200336020c2004410e3602002000200436020420" - "042001360210410121040c020b000b200044000000000000000044000000000000" - "008020021b390308410021040b20002004360200200541106a2480808080000b95" - "0502067f017e23808080800041306b2203248080808000200128020c2104024002" - "40024002400240024020012802142205200128021022064f0d002001200541016a" - "2207360214200420056a2d000022084130470d020240200720064f0d0020042007" - "6a2d000041506a41ff0171410a490d020b20002001200242001087808080000c05" - "0b200341186a20042006200510838080800041002d00c0cfc080001a200328021c" - "21072003280218210441141084808080002201450d022001200436020c20014105" - "3602002000200136020820004203370300200120073602100c040b200341086a20" - "0420062006200541026a220120062001491b10838080800041002d00c0cfc08000" - "1a200328020c21072003280208210441141084808080002201450d012001200436" - "020c2001410d3602002000200136020820004203370300200120073602100c030b" - "02402008414f6a41ff01714109490d00200341106a200420062007108380808000" - "41002d00c0cfc080001a2003280214210720032802102104411410848080800022" - "01450d012001200436020c2001410d360200200020013602082000420337030020" - "0120073602100c030b200841506aad42ff01832109200720064f0d010340200420" - "076a2d000041506a220541ff01712208410a4f0d020240024020094299b3e6cc99" - "b3e6cc19540d0020094299b3e6cc99b3e6cc19520d01200841054b0d010b200120" - "0741016a22073602142009420a7e2005ad42ff01837c210920062007470d010c03" - "0b0b200341206a200120022009108e808080000240024020032802200d00200020" - "032b0328390308420021090c010b20002003280224360208420321090b20002009" - "3703000c020b000b20002001200220091087808080000b200341306a2480808080" - "000bbd0101057f410021040240024020012802102205200128021422064d0d0020" - "0641016a2107200520066b2108200128020c20066a210541002104034002402005" - "20046a2d0000220641506a41ff0171410a490d002006412e460d030240200641c5" - "00460d00200641e500470d030b200020012002200320041089808080000f0b2001" - "200720046a3602142008200441016a2204470d000b200821040b20002001200220" - "032004108b808080000f0b200020012002200320041088808080000bc80101047f" - "23808080800041206b2202248080808000024002400240200028020c450d002000" - "21010c010b200241106a41086a2203200041086a28020036020020022000290200" - "370310200241086a200128020c2001280210200128021410838080800041002d00" - "c0cfc080001a200228020c21042002280208210541141084808080002201450d01" - "200120022903103702002001200536020c20012004360210200141086a20032802" - "00360200200041141082808080000b200241206a24808080800020010f0b000b59" - "01017f23808080800041106b2201248080808000200141086a2000200028020041" - "014108411810d480808000024020012802082200418180808078460d0020002001" - "28020c109580808000000b200141106a2480808080000b950101027f0240200028" - "02082201450d00200028020441046a2100034002400240024002402000417c6a2d" - "00000e050303030102000b2000109b808080000c020b20002802002202450d0120" - "0041046a28020020021082808080000c010b200010918080800020002802002202" - "450d00200041046a280200200241186c1082808080000b200041186a2100200141" - "7f6a22010d000b0b0b970101047f024002400240200028020022002802000e0200" - "01020b20002802082201450d01200028020420011082808080000c010b20002d00" - "044103470d00200028020822012802002102024020012802042203280200220445" - "0d002002200411808080800080808080000b024020032802042203450d00200220" - "031082808080000b2001410c1082808080000b200041141082808080000b9b0d02" - "097f017e23808080800041306b2203248080808000024002400240024002400240" - "0240024002400340024002402001280208220420012802042205460d0002400240" - "0240200420054f0d002001280200220620046a2d000022074122460d01200741dc" - "00460d0120074120490d012006200441016a22086a21094100200520086b417871" - "220a6b210703402009210b024020070d002001200a20086a360208200110c88080" - "800020012802042105200128020821070c040b200741086a2107200b41086a2109" - "200b290000220c42a2c48891a2c48891228542fffdfbf7efdfbfff7e7c200c42e0" - "bffffefdfbf7ef5f7c84200c42dcb8f1e2c58b97aedc008542fffdfbf7efdfbfff" - "7e7c84200c427f858342808182848890a0c0807f83220c500d000b2001200b2006" - "6b200c7aa74103766a22073602080c020b2004200541a8bcc0800010ac80808000" - "0c080b200421070b20072005470d01200521040b200341086a2001280200200420" - "0410838080800041002d00c0cfc080001a200328020c210b200328020821094114" - "1084808080002207450d052007200936020c200741043602002000200736020420" - "0041023602002007200b3602100c0a0b024020072005490d002007200541b8bcc0" - "800010ac80808000000b02402001280200220b20076a2d0000220941dc00460d00" - "024020094122470d002002280208450d0520072004490d072002200b20046a2007" - "20046b10c9808080004101210b2001200741016a360208200341286a2001200228" - "0204200228020810ca8080800020032802282207450d032000200328022c360208" - "0c040b2001200741016a2207360208200341106a200b2005200710838080800041" - "002d00c0cfc080001a2003280214210b2003280210210941141084808080002207" - "450d052007200936020c2007411036020020002007360204200041023602002007" - "200b3602100c0a0b024020072004490d002002200b20046a200720046b10c98080" - "80002001200741016a2209360208024020092005490d00200341206a200b200520" - "0910838080800041002d00c0cfc080001a2003280224210b200328022021094114" - "1084808080002207450d06200741043602000c090b2001200741026a2204360208" - "02400240024002400240024002400240024002400240200b20096a2d0000220741" - "ed004a0d000240200741e1004a0d0020074122460d032007412f460d04200741dc" - "00470d020240200228020822072002280200470d00200210cb808080000b200220" - "0741016a360208200228020420076a41dc003a0000410021070c0b0b2007419e7f" - "6a0e050401010105010b200741927f6a0e080500000006000708000b200341186a" - "200b2005200410838080800041002d00c0cfc080001a200328021c210b20032802" - "18210941141084808080002207450d0e2007410c3602000c110b02402002280208" - "22072002280200470d00200210cb808080000b2002200741016a36020820022802" - "0420076a41223a0000410021070c070b0240200228020822072002280200470d00" - "200210cb808080000b2002200741016a360208200228020420076a412f3a000041" - "0021070c060b0240200228020822072002280200470d00200210cb808080000b20" - "02200741016a360208200228020420076a41083a0000410021070c050b02402002" - "28020822072002280200470d00200210cb808080000b2002200741016a36020820" - "0228020420076a410c3a0000410021070c040b0240200228020822072002280200" - "470d00200210cb808080000b2002200741016a360208200228020420076a410a3a" - "0000410021070c030b0240200228020822072002280200470d00200210cb808080" - "000b2002200741016a360208200228020420076a410d3a0000410021070c020b02" - "40200228020822072002280200470d00200210cb808080000b2002200741016a36" - "0208200228020420076a41093a0000410021070c010b2001200210cc8080800021" - "070b2007450d010c090b0b2004200741e8bcc0800010b780808000000b4102210b" - "200328022c21070b2000200b360200200020073602040c060b20072004490d0220" - "01200741016a360208200341286a2001200b20046a200720046b10ca8080800002" - "40024020032802282207450d002000200328022c3602084100210b0c010b410221" - "0b200328022c21070b2000200b360200200020073602040c050b000b2004200741" - "c8bcc0800010b780808000000b2004200741d8bcc0800010b780808000000b2007" - "200936020c2007200b3602100b20004102360200200020073602040b200341306a" - "2480808080000b7901027f410021030240024020024100480d00024020020d0041" - "002103410121040c020b41002d00c0cfc080001a20022103200210848080800022" - "040d01410121030b20032002109580808000000b20042001200210df8080800021" - "012000200236020c2000200136020820002003360204200041033a00000b100002" - "4020000d0010a3808080000b000b870102017c017e02400240024020012802000e" - "03000102000b20004202370308200020012b0308220239031020002002bd42ffff" - "ffffffffffffff00834280808080808080f8ff00534101743a00000f0b20004200" - "370308200041023a0000200020012903083703100f0b200041023a000020002001" - "290308220337031020002003423f883703080bb40701077f23808080800041306b" - "22022480808080002001280200220328020c210402400240024002402003280214" - "2205200341106a28020022064f0d000340200420056a2d0000220741776a220841" - "174b0d024101200874419380800471450d022003200541016a2205360214200620" - "05470d000b200621050b41012108200241286a200420062006200541016a220520" - "062005491b10838080800041002d00c0cfc080001a200228022c21062002280228" - "210341141084808080002205450d022005200336020c2005410336020020002005" - "360204200520063602100c010b0240200741fd00470d0041002108200041003a00" - "010c010b02400240024020012d00040d00200541016a21052007412c470d012003" - "20053602140240200520064f0d00034002400240024002400240200420056a2d00" - "002208410c4a0d00200841776a41024f0d010c040b0240200841606a0e03040102" - "000b2008410d460d03200841fd00460d020b41012108200241086a200420062006" - "200541016a220520062005491b10838080800041002d00c0cfc080001a20022802" - "0c21062002280208210341141084808080002205450d092005200336020c200541" - "1136020020002005360204200520063602100c080b200041013a0001410021080c" - "070b41012108200241186a200420062006200541016a220520062005491b108380" - "80800041002d00c0cfc080001a200228021c210620022802182103411410848080" - "80002205450d072005200336020c20054115360200200020053602042005200636" - "02100c060b2003200541016a220536021420062005470d000b200621050b410121" - "08200241106a200420062006200541016a220520062005491b1083808080004100" - "2d00c0cfc080001a20022802142106200228021021034114108480808000220545" - "0d042005200336020c2005410536020020002005360204200520063602100c030b" - "41002108200141003a0004024020074122460d002002200420062006200541016a" - "220520062005491b10838080800041002d00c0cfc080001a200228020421082002" - "280200210641141084808080002205450d042005200636020c2005411136020020" - "002005360204200520083602100c020b200041013a00010c020b200241206a2004" - "20062006200520062005491b10838080800041002d00c0cfc080001a2002280224" - "21082002280220210641141084808080002205450d022005200636020c20054108" - "36020020002005360204200520083602100b410121080b200020083a0000200241" - "306a2480808080000f0b000b7201027f410021030240024020024100480d000240" - "20020d0041002103410121040c020b41002d00c0cfc080001a2002210320021084" - "8080800022040d01410121030b20032002109580808000000b20042001200210df" - "8080800021012000200236020820002001360204200020033602000bdc0201067f" - "23808080800041106b22022480808080002001280200220328020c210402400240" - "02400240024020032802142201200341106a28020022054f0d000340200420016a" - "2d0000220641776a220741174b0d024101200774419380800471450d0220032001" - "41016a220136021420052001470d000b200521010b200241086a20042005200520" - "0141016a220120052001491b10838080800041002d00c0cfc080001a200228020c" - "21072002280208210541141084808080002201450d03200141033602000c010b02" - "402006413a470d002003200141016a360214200020031081808080000c020b2002" - "200420052005200141016a220120052001491b10838080800041002d00c0cfc080" - "001a200228020421072002280200210541141084808080002201450d0220014106" - "3602000b2001200536020c20002001360204200041063a0000200120073602100b" - "200241106a2480808080000f0b000be411020b7f027e23808080800041c0016b22" - "042480808080000240024002400240024002400240024002400240024002400240" - "20012802002205450d002002280208210620022802042107200128020421080240" - "03402005418c026a210920052f019203220a410c6c210b417f210c024002400340" - "0240200b0d00200a210c0c020b2009280208210d2009280204210e200c41016a21" - "0c200b41746a210b2009410c6a2109417f2007200e2006200d2006200d491b10dc" - "80808000220e2006200d6b200e1b220d410047200d4100481b220d4101460d000b" - "200d41ff0171450d010b2008450d022008417f6a21082005200c4102746a419803" - "6a28020021050c010b0b20022802002209450d0c200720091082808080000c0c0b" - "2002290204220fa721092002280200220b418080808078470d03200921050c010b" - "2002290204220fa721052002280200220d418080808078470d010b2001210c0c09" - "0b41002d00c0cfc080001a4198031084808080002209450d02200941013b019203" - "20094100360288022009200f422088a7ad4220862005ad84370390022009200d36" - "028c02200142808080801037020420012009360200200920032903003703002009" - "41086a200341086a290300370300200941106a200341106a2903003703000c010b" - "200f422088a7ad4220862009ad84210f0240024002400240024020052f01920322" - "09410b490d00200441086a21084104210d200c4105490d03200c210d200c417b6a" - "0e020302010b2005418c026a220e200c410c6c6a210d02400240200c41016a2206" - "20094d0d00200d200f370204200d200b3602000c010b200e2006410c6c6a200d20" - "09200c6b220e410c6c10de808080001a200d200f370204200d200b360200200520" - "0641186c6a2005200c41186c6a200e41186c10de808080001a0b2005200c41186c" - "6a220d41106a200341106a290300370300200d2003290300370300200d41086a20" - "0341086a2903003703002005200941016a3b0192030c030b200c41796a210c2004" - "41f8006a21084106210d0c010b4100210c200441f8006a21084105210d0b41002d" - "00c0cfc080001a4198031084808080002209450d02200941003b01920320094100" - "360288022009200d417f7320052f01920322076a22063b01920320044188016a41" - "086a2005200d41186c6a220e41086a29030037030020044188016a41106a200e41" - "106a2903003703002004200e290300370388012006410c4f0d032007200d41016a" - "220e6b2006470d042005418c026a2202200d410c6c6a2207290204211020072802" - "0021072009418c026a2002200e410c6c6a2006410c6c10df808080001a20092005" - "200e41186c6a200641186c10df8080800021062005200d3b019203200441dc006a" - "410c6a20044190016a290300370200200441f0006a20044198016a290300370200" - "200420042903880137026020042005360208200420063602782008280200220d41" - "8c026a200c410c6c6a210602400240200d2f019203220e200c4b0d002006200f37" - "02042006200b3602000c010b2006410c6a2006200e200c6b2208410c6c10de8080" - "80001a2006200f3702042006200b360200200d200c41186c6a220b41186a200b20" - "0841186c10de808080001a0b200d200c41186c6a220b41106a200341106a290300" - "370300200b2003290300370300200b41086a200341086a290300370300200d200e" - "41016a3b0192032007418080808078460d00200441c4006a200441dc006a41086a" - "290200370200200441cc006a200441dc006a41106a290200370200200441306a41" - "246a200441dc006a41186a28020036020020042010370234200420073602302004" - "200429025c37023c024002400240200528028802220b0d004100210c0c010b2004" - "41306a4104722108200441b8016a210220044188016a4104722107200441b0016a" - "2103200441c0006a210e4100210c4100210603402006200c470d0820052f019003" - "210d200b2f019203410b490d02200641016a210602400240024002400240024002" - "40200d4105490d00200d417b6a0e020203010b2004410436028001200420063602" - "7c2004200b3602782003210b0c040b20044106360280012004200636027c200420" - "0b360278200d41796a210d0c020b20044105360280012004200636027c2004200b" - "36027820044188016a200441f8006a10c18080800020042802b001410520044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0c030b20044105360280012004200636027c2004200b3602784100210d0b20" - "02210b0b20044188016a200441f8006a10c180808000200b280200200d20044130" - "6a200e200910c080808000200428028801210d200441086a2007412410df808080" - "001a0b20042802bc01210c20042802b801210920042802b401210620042802b001" - "2105200d418080808078460d032004200d3602302008200441086a412410df8080" - "80001a200528028802220b0d000b0b2001280200220b450d0741002d00c0cfc080" - "001a2001280204210641c803108480808000220d450d03200d200b36029803200d" - "41003b019203200d410036028802200b41003b019003200b200d36028802200120" - "0641016a3602042001200d3602002006200c470d08200d200429033037028c0220" - "0d41013b019203200d2004290340370300200d200936029c03200d4194026a2004" - "41306a41086a280200360200200d41086a200441c8006a290300370300200d4110" - "6a200441d0006a2903003703002009200d36028802200941013b0190030c010b20" - "0b200d200441306a200e200910c0808080000b2001200128020841016a3602080b" - "200041063a00000c070b000b2006410b41c89fc0800010b180808000000b41909f" - "c08000412841b89fc0800010a680808000000b41e89fc08000413541a0a0c08000" - "10a680808000000b41e49dc0800010a280808000000b41cf9ec08000413041809f" - "c0800010a680808000000b20002005200c41186c6a220929030037030020004110" - "6a200941106a220d290300370300200041086a200941086a220b29030037030020" - "092003290300370300200b200341086a290300370300200d200341106a29030037" - "03000b200441c0016a2480808080000be30501067f23808080800041306b220124" - "80808080004100210241002103024020002802002204450d002001200436021820" - "014100360214200120043602082001410036020420012000280204220336021c20" - "01200336020c20002802082103410121020b200120033602202001200236021020" - "01200236020002400240024003400240024002400240024020030d002001280200" - "450d0820012802082104200128020422030d0141002100200128020c2203450d06" - "034020042802980321042003417f6a22030d000c070b0b20012003417f6a360220" - "024020024101712203450d0020012802040d0020012802082103200128020c2200" - "450d03034020032802980321032000417f6a22000d000c040b0b2003450d012001" - "28020421030c030b200421000c050b41f8bac0800010a280808000000b20014200" - "3702082001200336020441012102200141013602000b2001280208210002402001" - "28020c220520032f019203490d0002400340200141246a2003200010bf80808000" - "20012802242203450d0120012802282100200128022c220520032f019203490d02" - "0c000b0b41b0a0c0800010a280808000000b200541016a21040240024020000d00" - "2001200436020c20014100360208200120033602040c010b200320044102746a41" - "98036a21040340200428020022064198036a21042000417f6a22000d000b200142" - "00370208200120063602042003450d040b024020032005410c6c6a418c026a2200" - "2802002204450d00200028020420041082808080000b0240024002400240200320" - "0541186c6a22032d00000e050303030102000b200341046a109b808080000c020b" - "20032802042200450d01200328020820001082808080000c010b200341046a1091" - "8080800020032802042200450d002003280208200041186c1082808080000b2001" - "28022021030c000b0b200421030b0340200141246a2003200010bf808080002001" - "2802242203450d01200128022821000c000b0b200141306a2480808080000b8905" - "03037f017e037f23808080800041f0006b22022480808080004100210302402000" - "2d0000220420012d0000470d00410121030240024002400240024020040e060500" - "01020304050b20002d000120012d00014621030c040b4100210320002903082205" - "2001290308520d030240024002402005a70e03000102000b200029031020012903" - "105121030c050b200029031020012903105121030c040b20002b031020012b0310" - "6121030c030b41002103200028020c2204200128020c470d022000280208200128" - "0208200410dc808080004521030c020b41002103200028020c2206200128020c47" - "0d012001280208210420002802082100200641016a210103402001417f6a220145" - "21032001450d0220002004109c808080002106200441186a2104200041186a2100" - "20060d000c020b0b41002103200028020c2204200128020c470d00200241003602" - "6c2002420037026420024100360254200241003602442002410036023020024100" - "36022020022001280208220636025c200220012802042203360258200220063602" - "4c2002200336024820022000280208220636023820022000280204220136023420" - "0220063602282002200136022420022004410020031b3602602002200341004722" - "033602502002200336024020022004410020011b36023c20022001410047220336" - "022c2002200336021c200241c0006a21070340200241106a2002411c6a109d8080" - "80004101210320022802102201450d0120022802142104200241086a2007109d80" - "80800020022802082200450d0141002103200128020822062000280208470d0120" - "0228020c210820012802042000280204200610dc808080000d0120042008109c80" - "8080000d000b0b200241f0006a24808080800020030bed0201057f024002400240" - "200128022022020d00410021020c010b20012002417f6a36022002400240024020" - "012802004101470d0020012802040d01200128020821030240200128020c220245" - "0d00034020032802980321032002417f6a22020d000b0b20014200370208200120" - "03360204200141013602000c020b4198bbc0800010a280808000000b2001280204" - "21030b2001280208210202400240200128020c220420032f0192034f0d00200321" - "050c010b03402003280288022205450d03200241016a210220032f019003210420" - "052103200420052f0192034f0d000b0b200441016a21030240024020020d002005" - "21060c010b200520034102746a4198036a21030340200328020022064198036a21" - "032002417f6a22020d000b410021030b2001200336020c20014100360208200120" - "063602042005200441186c6a210320052004410c6c6a418c026a21020b20002003" - "360204200020023602000f0b4188bbc0800010a280808000000b4901017f410021" - "010240024020004100480d00024020000d00410121010c020b41002d00c0cfc080" - "001a200010848080800022010d01410121010b20012000109580808000000b2001" - "0b9b0301037f23808080800041d0006b2204248080808000200441386a20002001" - "108080808000024002400240024020042d00384106460d00200441086a41106a20" - "0441386a41106a2205290300370300200441086a41086a200441386a41086a2206" - "29030037030020042004290338370308200441386a200220031080808080002004" - "2d00384106460d01200441206a41106a2005290300370300200441206a41086a20" - "0629030037030020042004290338370320200441086a10a0808080002205450d02" - "200441206a10a0808080002206450d0320052006109c808080002105200441206a" - "108580808000200441086a10858080800002402003450d00200220031082808080" - "000b02402001450d00200020011082808080000b200441d0006a24808080800020" - "050f0b2004200428023c360220419080c08000412b200441206a418080c0800041" - "d080c0800010a180808000000b2004200428023c360220419080c08000412b2004" - "41206a418080c0800041e080c0800010a180808000000b41f880c0800010a28080" - "8000000b418881c0800010a280808000000bea0101077f41002101024020002d00" - "004105470d0020002802042202450d002000280208210303402002418c026a2100" - "20022f0192032204410c6c2105417f2106024002400340024020050d0020042106" - "0c020b2000280208210120002802042107200641016a2106200541746a21052000" - "410c6a2100417f41f080c0800020072001410720014107491b10dc808080002207" - "410720016b20071b220141004720014100481b22014101460d000b200141ff0171" - "450d010b024020030d0041000f0b2003417f6a2103200220064102746a4198036a" - "28020021020c010b0b2002200641186c6a21010b20010b8f0101017f2380808080" - "0041c0006b22052480808080002005200136020c20052000360208200520033602" - "14200520023602102005410236021c200541dc82c0800036021820054202370224" - "2005418180808000ad422086200541106aad843703382005418280808000ad4220" - "86200541086aad843703302005200541306a360220200541186a200410a4808080" - "00000b130041ea81c08000412b200010a680808000000b4701017f238080808000" - "41206b2200248080808000200041003602182000410136020c200041ac81c08000" - "36020820004204370210200041086a41c881c0800010a480808000000b5601017f" - "23808080800041206b2202248080808000200241106a200041106a290200370300" - "200241086a200041086a290200370300200241013b011c20022001360218200220" - "00290200370300200210ae80808000000bbe0601057f200041786a22012000417c" - "6a280200220241787122006a21030240024020024101710d002002410271450d01" - "2001280200220220006a21000240200120026b220141002802f4d2c08000470d00" - "20032802044103714103470d01410020003602ecd2c0800020032003280204417e" - "7136020420012000410172360204200320003602000f0b2001200210a880808000" - "0b024002400240024002400240200328020422024102710d00200341002802f8d2" - "c08000460d02200341002802f4d2c08000460d0320032002417871220210a88080" - "80002001200220006a2200410172360204200120006a2000360200200141002802" - "f4d2c08000470d01410020003602ecd2c080000f0b20032002417e713602042001" - "2000410172360204200120006a20003602000b2000418002490d022001200010d7" - "80808000410021014100410028028cd3c08000417f6a220036028cd3c080002000" - "0d04024041002802d4d0c080002200450d00410021010340200141016a21012000" - "28020822000d000b0b4100200141ff1f200141ff1f4b1b36028cd3c080000f0b41" - "0020013602f8d2c08000410041002802f0d2c0800020006a22003602f0d2c08000" - "200120004101723602040240200141002802f4d2c08000470d00410041003602ec" - "d2c08000410041003602f4d2c080000b20004100280284d3c0800022044d0d0341" - "002802f8d2c080002200450d034100210241002802f0d2c0800022054129490d02" - "41ccd0c080002101034002402001280200220320004b0d00200020032001280204" - "6a490d040b200128020821010c000b0b410020013602f4d2c08000410041002802" - "ecd2c0800020006a22003602ecd2c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141dcd0c080006a21030240024041002802e4d2c080" - "00220241012000410376742200710d00410020022000723602e4d2c08000200321" - "000c010b200328020821000b200320013602082000200136020c2001200336020c" - "200120003602080f0b024041002802d4d0c080002201450d004100210203402002" - "41016a2102200128020822010d000b0b4100200241ff1f200241ff1f4b1b36028c" - "d3c08000200520044d0d004100417f360284d3c080000b0b4d01017f2380808080" - "0041206b2203248080808000200341003602102003410136020420034204370208" - "2003200136021c200320003602182003200341186a3602002003200210a4808080" - "00000b840601057f0240024002402000417c6a2203280200220441787122054104" - "4108200441037122061b20016a490d0002402006450d002005200141276a4b0d02" - "0b41102002410b6a4178712002410b491b210102400240024020060d0020014180" - "02490d0120052001410472490d01200520016b418180084f0d010c020b20004178" - "6a220720056a21060240024002400240200520014f0d00200641002802f8d2c080" - "00460d03200641002802f4d2c08000460d02200628020422044102710d04200441" - "7871220420056a22052001490d042006200410a880808000200520016b22024110" - "490d0120032001200328020041017172410272360200200720016a220120024103" - "72360204200720056a220520052802044101723602042001200210a98080800020" - "000f0b200520016b2202410f4d0d04200320012004410171724102723602002007" - "20016a22052002410372360204200620062802044101723602042005200210a980" - "80800020000f0b20032005200328020041017172410272360200200720056a2202" - "200228020441017236020420000f0b41002802ecd2c0800020056a22052001490d" - "0102400240200520016b2202410f4b0d0020032004410171200572410272360200" - "200720056a2202200228020441017236020441002102410021010c010b20032001" - "200441017172410272360200200720016a22012002410172360204200720056a22" - "05200236020020052005280204417e713602040b410020013602f4d2c080004100" - "20023602ecd2c0800020000f0b41002802f0d2c0800020056a220520014b0d040b" - "0240200210848080800022050d0041000f0b20052000417c417820032802002201" - "4103711b20014178716a2201200220012002491b10df808080002102200010a580" - "808000200221000b20000f0b41c9c5c08000412e41f8c5c0800010a68080800000" - "0b4188c6c08000412e41b8c6c0800010a680808000000b20032001200441017172" - "410272360200200720016a2202200520016b2205410172360204410020053602f0" - "d2c08000410020023602f8d2c0800020000b820301047f200028020c2102024002" - "4002402001418002490d002000280218210302400240024020022000470d002000" - "41144110200028021422021b6a28020022010d01410021020c020b200028020822" - "01200236020c200220013602080c010b200041146a200041106a20021b21040340" - "200421052001220241146a200241106a200228021422011b210420024114411020" - "011b6a28020022010d000b200541003602000b2003450d020240200028021c4102" - "7441cccfc080006a22012802002000460d0020034110411420032802102000461b" - "6a20023602002002450d030c020b2001200236020020020d01410041002802e8d2" - "c08000417e200028021c77713602e8d2c080000c020b0240200220002802082204" - "460d002004200236020c200220043602080f0b410041002802e4d2c08000417e20" - "0141037677713602e4d2c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d0020022001360214" - "200120023602180f0b0ba00401027f200020016a21020240024020002802042203" - "4101710d002003410271450d012000280200220320016a21010240200020036b22" - "0041002802f4d2c08000470d0020022802044103714103470d01410020013602ec" - "d2c0800020022002280204417e7136020420002001410172360204200220013602" - "000c020b2000200310a8808080000b024002400240024020022802042203410271" - "0d00200241002802f8d2c08000460d02200241002802f4d2c08000460d03200220" - "03417871220310a8808080002000200320016a2201410172360204200020016a20" - "01360200200041002802f4d2c08000470d01410020013602ecd2c080000f0b2002" - "2003417e7136020420002001410172360204200020016a20013602000b02402001" - "418002490d002000200110d7808080000f0b200141f8017141dcd0c080006a2102" - "0240024041002802e4d2c08000220341012001410376742201710d004100200320" - "01723602e4d2c08000200221010c010b200228020821010b200220003602082001" - "200036020c2000200236020c200020013602080f0b410020003602f8d2c0800041" - "0041002802f0d2c0800020016a22013602f0d2c080002000200141017236020420" - "0041002802f4d2c08000470d01410041003602ecd2c08000410041003602f4d2c0" - "80000f0b410020003602f4d2c08000410041002802ecd2c0800020016a22013602" - "ecd2c0800020002001410172360204200020016a20013602000f0b0b7902017f01" - "7e23808080800041306b2203248080808000200320003602002003200136020420" - "03410236020c200341c485c08000360208200342023702142003418380808000ad" - "4220862204200341046aad84370328200320042003ad843703202003200341206a" - "360210200341086a200210a480808000000b110020003502004101200110ad8080" - "80000b7902017f017e23808080800041306b220324808080800020032001360204" - "200320003602002003410236020c200341c882c080003602082003420237021420" - "03418380808000ad42208622042003ad8437032820032004200341046aad843703" - "202003200341206a360210200341086a200210a480808000000bec0203027f017e" - "037f23808080800041306b2203248080808000412721040240024020004290ce00" - "5a0d00200021050c010b412721040340200341096a20046a2206417c6a20004290" - "ce0080220542f0b1037e20007ca7220741ffff037141e4006e2208410174419283" - "c080006a2f00003b00002006417e6a2008419c7f6c20076a41ffff037141017441" - "9283c080006a2f00003b00002004417c6a2104200042ffc1d72f56210620052100" - "20060d000b0b02400240200542e300560d002005a721060c010b200341096a2004" - "417e6a22046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff03" - "71410174419283c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a2006410174419283c080006a2f00003b00000c010b200341" - "096a2004417f6a22046a20064130723a00000b2002200141014100200341096a20" - "046a412720046b10af808080002104200341306a24808080800020040b5d01027f" - "23808080800041206b220124808080800020002802182102200141106a20004110" - "6a290200370300200141086a200041086a2902003703002001200036021c200120" - "0236021820012000290200370300200110d880808000000bcb0501077f02400240" - "20010d00200541016a2106200028021c2107412d21080c010b412b418080c40020" - "0028021c220741017122011b2108200120056a21060b0240024020074104710d00" - "410021020c010b0240024020030d00410021090c010b02402003410371220a0d00" - "0c010b41002109200221010340200920012c000041bf7f4a6a2109200141016a21" - "01200a417f6a220a0d000b0b200920066a21060b024020002802000d0002402000" - "28021422012000280218220920082002200310b080808000450d0041010f0b2001" - "20042005200928020c11818080800080808080000f0b0240024002400240200028" - "0204220120064b0d00200028021422012000280218220920082002200310b08080" - "8000450d0141010f0b2007410871450d0120002802102107200041303602102000" - "2d0020210b4101210c200041013a0020200028021422092000280218220a200820" - "02200310b0808080000d02200120066b41016a2101024003402001417f6a220145" - "0d0120094130200a2802101182808080008080808000450d000b41010f0b024020" - "0920042005200a28020c1181808080008080808000450d0041010f0b2000200b3a" - "00202000200736021041000f0b200120042005200928020c118180808000808080" - "8000210c0c010b200120066b210702400240024020002d002022010e0402000100" - "020b20072101410021070c010b20074101762101200741016a41017621070b2001" - "41016a210120002802102106200028021821092000280214210a02400340200141" - "7f6a2201450d01200a200620092802101182808080008080808000450d000b4101" - "0f0b4101210c200a200920082002200310b0808080000d00200a20042005200928" - "020c11818080800080808080000d00410021010340024020072001470d00200720" - "07490f0b200141016a2101200a200620092802101182808080008080808000450d" - "000b2001417f6a2007490f0b200c0b490002402002418080c400460d0020002002" - "20012802101182808080008080808000450d0041010f0b024020030d0041000f0b" - "200020032004200128020c11818080800080808080000b7902017f017e23808080" - "800041306b22032480808080002003200036020020032001360204200341023602" - "0c200341e485c08000360208200342023702142003418380808000ad4220862204" - "200341046aad84370328200320042003ad843703202003200341206a3602102003" - "41086a200210a480808000000bc20b010b7f200028020821030240024002400240" - "200028020022040d002003410171450d010b02402003410171450d00200120026a" - "210502400240200028020c22060d0041002107200121080c010b41002107410021" - "09200121080340200822032005460d020240024020032c00002208417f4c0d0020" - "0341016a21080c010b0240200841604f0d00200341026a21080c010b0240200841" - "704f0d00200341036a21080c010b200341046a21080b200820036b20076a210720" - "06200941016a2209470d000b0b20082005460d00024020082c00002203417f4a0d" - "0020034160491a0b024002402007450d000240200720024f0d00200120076a2c00" - "0041bf7f4a0d01410021030c020b20072002460d00410021030c010b200121030b" - "2007200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a02402002" - "4110490d0020022001200141036a417c7122076b22096a220b4103712104410021" - "0641002103024020012007460d004100210302402009417c4b0d00410021034100" - "210503402003200120056a22082c000041bf7f4a6a200841016a2c000041bf7f4a" - "6a200841026a2c000041bf7f4a6a200841036a2c000041bf7f4a6a210320054104" - "6a22050d000b0b200121080340200320082c000041bf7f4a6a2103200841016a21" - "08200941016a22090d000b0b02402004450d002007200b417c716a22082c000041" - "bf7f4a210620044101460d00200620082c000141bf7f4a6a210620044102460d00" - "200620082c000241bf7f4a6a21060b200b4102762105200620036a210603402007" - "21042005450d04200541c001200541c001491b220b410371210c200b410274210d" - "41002108024020054104490d002004200d41f007716a2109410021082004210303" - "40200328020c2207417f7341077620074106767241818284087120032802082207" - "417f7341077620074106767241818284087120032802042207417f734107762007" - "4106767241818284087120032802002207417f7341077620074106767241818284" - "087120086a6a6a6a2108200341106a22032009470d000b0b2005200b6b21052004" - "200d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c411076" - "20066a2106200c450d000b2004200b41fc01714102746a22082802002203417f73" - "4107762003410676724181828408712103200c4101460d0220082802042207417f" - "7341077620074106767241818284087120036a2103200c4102460d022008280208" - "2208417f7341077620084106767241818284087120036a21030c020b024020020d" - "00410021060c030b2002410371210802400240200241044f0d0041002106410021" - "090c010b41002106200121032002410c71220921070340200620032c000041bf7f" - "4a6a200341016a2c000041bf7f4a6a200341026a2c000041bf7f4a6a200341036a" - "2c000041bf7f4a6a2106200341046a21032007417c6a22070d000b0b2008450d02" - "200120096a21030340200620032c000041bf7f4a6a2106200341016a2103200841" - "7f6a22080d000c030b0b200028021420012002200028021828020c118180808000" - "80808080000f0b200341087641ff811c71200341ff81fc07716a418180046c4110" - "7620066a21060b02400240200a20064d0d00200a20066b21054100210302400240" - "024020002d00200e0402000102020b20052103410021050c010b20054101762103" - "200541016a41017621050b200341016a2103200028021021092000280218210820" - "00280214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c118180" - "80800080808080000f0b0240200720012002200828020c11818080800080808080" - "00450d0041010f0b410021030340024020052003470d0020052005490f0b200341" - "016a21032007200920082802101182808080008080808000450d000b2003417f6a" - "2005490b140020012000280200200028020410b2808080000b1c00200028020020" - "01200028020428020c11828080800080808080000bbf05010a7f23808080800041" - "306b2203248080808000200341033a002c2003412036021c410021042003410036" - "02282003200136022420032000360220200341003602142003410036020c024002" - "40024002400240200228021022050d00200228020c2200450d0120022802082101" - "200041037421062000417f6a41ffffffff017141016a2104200228020021000340" - "0240200041046a2802002207450d00200328022020002802002007200328022428" - "020c11818080800080808080000d040b20012802002003410c6a20012802041182" - "8080800080808080000d03200141086a2101200041086a2100200641786a22060d" - "000c020b0b20022802142201450d00200141057421082001417f6a41ffffff3f71" - "41016a210420022802082109200228020021004100210603400240200041046a28" - "02002201450d00200328022020002802002001200328022428020c118180808000" - "80808080000d030b2003200520066a220141106a28020036021c20032001411c6a" - "2d00003a002c2003200141186a2802003602282001410c6a28020021074100210a" - "4100210b024002400240200141086a2802000e03010002010b2007410374210c41" - "00210b2009200c6a220c2802040d01200c28020021070b4101210b0b2003200736" - "02102003200b36020c200141046a280200210702400240024020012802000e0301" - "0002010b2007410374210b2009200b6a220b2802040d01200b28020021070b4101" - "210a0b200320073602182003200a3602142009200141146a2802004103746a2201" - "2802002003410c6a200128020411828080800080808080000d02200041086a2100" - "2008200641206a2206470d000b0b200420022802044f0d01200328022020022802" - "0020044103746a22012802002001280204200328022428020c1181808080008080" - "808000450d010b410121010c010b410021010b200341306a24808080800020010b" - "d70201057f2380808080004180016b220224808080800002400240024002402001" - "28021c22034110710d0020034120710d012000ad4101200110ad8080800021000c" - "030b41ff00210303402002200322046a22052000410f712203413072200341d700" - "6a2003410a491b3a00002004417f6a210320004110492106200041047621002006" - "450d000c020b0b41ff00210303402002200322046a22052000410f712203413072" - "200341376a2003410a491b3a00002004417f6a2103200041104921062000410476" - "21002006450d000b02402004418101490d002004418001418083c0800010aa8080" - "8000000b20014101419083c0800041022005418101200441016a6b10af80808000" - "21000c010b02402004418101490d002004418001418083c0800010aa8080800000" - "0b20014101419083c0800041022005418101200441016a6b10af8080800021000b" - "20024180016a24808080800020000b7902017f017e23808080800041306b220324" - "808080800020032000360200200320013602042003410236020c2003419886c080" - "00360208200342023702142003418380808000ad4220862204200341046aad8437" - "0328200320042003ad843703202003200341206a360210200341086a200210a480" - "808000000b920c01057f23808080800041206b2203248080808000024002400240" - "024002400240024002400240024002400240024002400240024020010e28060101" - "010101010101020401010301010101010101010101010101010101010101010901" - "01010107000b200141dc00460d040b2001418006490d0b20024101710d060c0b0b" - "20004180043b010a20004200370102200041dce8013b01000c0c0b20004180043b" - "010a20004200370102200041dce4013b01000c0b0b20004180043b010a20004200" - "370102200041dcdc013b01000c0a0b20004180043b010a20004200370102200041" - "dcb8013b01000c090b20004180043b010a20004200370102200041dce0003b0100" - "0c080b200241800271450d0620004180043b010a20004200370102200041dcce00" - "3b01000c070b200141aa9d044b410474220220024108722202200241027441a896" - "c080006a280200410b742001410b7422024b1b2204200441047222042004410274" - "41a896c080006a280200410b7420024b1b220420044102722204200441027441a8" - "96c080006a280200410b7420024b1b2204200441016a2204200441027441a896c0" - "80006a280200410b7420024b1b2204200441016a2204200441027441a896c08000" - "6a280200410b7420024b1b220441027441a896c080006a280200410b7422052002" - "4620052002496a20046a220441204b0d01200441027441a896c080006a22052802" - "00411576210241d70521060240024020044120460d002005280204411576210620" - "040d00410021040c010b200441027441a496c080006a28020041ffffff00712104" - "0b024020062002417f736a450d00200120046b2107200241d705200241d7054b1b" - "21052006417f6a210641002104034020052002460d042004200241ac97c080006a" - "2d00006a220420074b0d012006200241016a2202470d000b200621020b20024101" - "71450d04200341003a000a200341003b01082003200141147641da81c080006a2d" - "00003a000b20032001410476410f7141da81c080006a2d00003a000f2003200141" - "0876410f7141da81c080006a2d00003a000e20032001410c76410f7141da81c080" - "006a2d00003a000d20032001411076410f7141da81c080006a2d00003a000c2003" - "41086a20014101726741027622026a220441fb003a00002004417f6a41f5003a00" - "00200341086a2002417e6a22026a41dc003a0000200341086a41086a2204200141" - "0f7141da81c080006a2d00003a00002000410a3a000b200020023a000a20002003" - "290208370200200341fd003a0011200041086a20042f01003b01000c060b200241" - "808004710d020c040b20044121418896c0800010ac80808000000b200541d70541" - "9896c0800010ac80808000000b20004180043b010a20004200370102200041dcc4" - "003b01000c020b024020014120490d00200141ff00490d01024020014180800449" - "0d0002402001418080084f0d00200141ec8ac08000412c41c48bc0800041c40141" - "888dc0800041c20310b980808000450d020c030b200141feffff0071419ef00a46" - "0d01200141e0ffff007141e0cd0a460d01200141c091756a41794b0d01200141d0" - "e2746a41714b0d0120014190a8746a41704b0d012001418090746a41dd6c4b0d01" - "2001418080746a419d744b0d01200141b0d9736a417a4b0d0120014180fe476a41" - "afc5544b0d01200141f083384f0d010c020b200141ca90c080004128419a91c080" - "0041a00241ba93c0800041ad0210b9808080000d010b200341003a001620034100" - "3b01142003200141147641da81c080006a2d00003a001720032001410476410f71" - "41da81c080006a2d00003a001b20032001410876410f7141da81c080006a2d0000" - "3a001a20032001410c76410f7141da81c080006a2d00003a001920032001411076" - "410f7141da81c080006a2d00003a0018200341146a20014101726741027622026a" - "220441fb003a00002004417f6a41f5003a0000200341146a2002417e6a22026a41" - "dc003a0000200341146a41086a22042001410f7141da81c080006a2d00003a0000" - "2000410a3a000b200020023a000a20002003290214370200200341fd003a001d20" - "0041086a20042f01003b01000c010b2000200136020420004180013a00000b2003" - "41206a2480808080000be90201067f200120024101746a210720004180fe037141" - "0876210841002109200041ff0171210a02400240024002400340200141026a210b" - "200920012d000122026a210c024020012d000022012008460d00200120084b0d04" - "200c2109200b2101200b2007470d010c040b200c2009490d01200c20044b0d0220" - "0320096a21010340024020020d00200c2109200b2101200b2007470d020c050b20" - "02417f6a210220012d00002109200141016a21012009200a470d000b0b41002102" - "0c030b2009200c41dc8ac0800010b780808000000b200c200441dc8ac0800010b1" - "80808000000b200041ffff03712109200520066a210c410121020340200541016a" - "210a0240024020052c000022014100480d00200a21050c010b0240200a200c460d" - "00200141ff007141087420052d0001722101200541026a21050c010b41cc8ac080" - "0010a280808000000b200920016b22094100480d01200241017321022005200c47" - "0d000b0b20024101710b13002000200120022003200410bb80808000000bd10902" - "057f017e23808080800041f0006b22052480808080002005200336020c20052002" - "3602080240024002400240024002400240024002402001418102490d0002402000" - "2c00800241bf7f4c0d00410321060c030b20002c00ff0141bf7f4c0d0141022106" - "0c020b200520013602142005200036021041002106410121070c020b20002c00fe" - "0141bf7f4a21060b2000200641fd016a22066a2c000041bf7f4c0d012005200636" - "0214200520003602104105210641a888c0800021070b2005200636021c20052007" - "3602180240200220014b22060d00200320014b0d00200220034b0d020240200245" - "0d00200220014f0d0020032002200020026a2c000041bf7f4a1b21030b20052003" - "360220200121020240200320014f0d00200341016a220641002003417d6a220220" - "0220034b1b2202490d04024020062002460d00200620026b21080240200020036a" - "2c000041bf7f4c0d002008417f6a21070c010b20022003460d000240200020066a" - "2206417e6a22032c000041bf7f4c0d002008417e6a21070c010b200020026a2209" - "2003460d0002402006417d6a22032c000041bf7f4c0d002008417d6a21070c010b" - "20092003460d0002402006417c6a22032c000041bf7f4c0d002008417c6a21070c" - "010b20092003460d002008417b6a21070b200720026a21020b02402002450d0002" - "40200220014f0d00200020026a2c000041bf7f4a0d010c070b20022001470d060b" - "20022001460d040240024002400240200020026a22032c00002201417f4a0d0020" - "032d0001413f7121002001411f7121062001415f4b0d0120064106742000722101" - "0c020b2005200141ff0171360224410121010c020b200041067420032d0002413f" - "717221000240200141704f0d0020002006410c747221010c010b20004106742003" - "2d0003413f71722006411274418080f00071722201418080c400460d060b200520" - "01360224024020014180014f0d00410121010c010b024020014180104f0d004102" - "21010c010b41034104200141808004491b21010b20052002360228200520012002" - "6a36022c20054105360234200541b089c080003602302005420537023c20054182" - "80808000ad422086220a200541186aad843703682005200a200541106aad843703" - "602005418480808000ad422086200541286aad843703582005418580808000ad42" - "2086200541246aad843703502005418380808000ad422086200541206aad843703" - "482005200541c8006a360238200541306a200410a480808000000b200520022003" - "20061b36022820054103360234200541f089c080003602302005420337023c2005" - "418280808000ad422086220a200541186aad843703582005200a200541106aad84" - "3703502005418380808000ad422086200541286aad843703482005200541c8006a" - "360238200541306a200410a480808000000b2000200141002006200410ba808080" - "00000b20054104360234200541d088c080003602302005420437023c2005418280" - "808000ad422086220a200541186aad843703602005200a200541106aad84370358" - "2005418380808000ad422086220a2005410c6aad843703502005200a200541086a" - "ad843703482005200541c8006a360238200541306a200410a480808000000b2002" - "2006419c8ac0800010b780808000000b200410a280808000000b20002001200220" - "01200410ba80808000000b4d01017f4101210202402000280200200110b6808080" - "000d00200128021441d881c080004102200128021828020c118180808000808080" - "80000d002000280204200110b68080800021020b20020bc40101047f2380808080" - "0041106b2202248080808000410121030240200128021422044127200128021822" - "05280210220111828080800080808080000d00200241046a200028020041810210" - "b8808080000240024020022d0004418001470d0020042002280208200111828080" - "80008080808000450d010c020b2004200241046a20022d000e22006a20022d000f" - "20006b200528020c11818080800080808080000d010b2004412720011182808080" - "00808080800021030b200241106a24808080800020030b2701017f200028020022" - "002000411f7522027320026bad2000417f73411f76200110ad808080000b500103" - "7f200121032002210402402001280288022205450d00200241016a210320012f01" - "900321040b200141c80341980320021b1082808080002000200536020020002004" - "ad4220862003ad843702040bec0201047f2000418c026a22052001410c6c6a2106" - "02400240200141016a220720002f01920322084d0d002006200229020037020020" - "0641086a200241086a2802003602000c010b20052007410c6c6a2006200820016b" - "2205410c6c10de808080001a200641086a200241086a2802003602002006200229" - "02003702002000200741186c6a2000200141186c6a200541186c10de808080001a" - "0b200841016a21022000200141186c6a22062003290300370300200641106a2003" - "41106a290300370300200641086a200341086a29030037030020004198036a2103" - "0240200141026a2205200841026a22064f0d00200320054102746a200320074102" - "746a200820016b41027410de808080001a0b200320074102746a20043602002000" - "20023b0192030240200720064f0d00200841016a2103200141027420006a419c03" - "6a2107034020072802002208200141016a22013b01900320082000360288022007" - "41046a210720032001470d000b0b0bed04010a7f23808080800041d0006b220224" - "808080800041002d00c0cfc080001a200128020022032f01920321040240024002" - "400240024041c8031084808080002205450d002005410036028802200520012802" - "082206417f7320032f01920322076a22083b019203200241286a41086a2003418c" - "026a22092006410c6c6a220a41086a280200360200200241386a41086a20032006" - "41186c6a220b41086a290300370300200241386a41106a200b41106a2903003703" - "002002200a2902003703282002200b2903003703382008410c4f0d012007200641" - "016a220b6b2008470d022005418c026a2009200b410c6c6a2008410c6c10df8080" - "80001a20052003200b41186c6a200841186c10df80808000210b200320063b0192" - "03200241086a200241286a41086a280200360200200241186a200241386a41086a" - "290300370300200241206a200241c8006a29030037030020022002290328370300" - "20022002290338370310200b2f019203220541016a21082005410c4f0d03200420" - "066b220a2008470d04200b4198036a200320064102746a419c036a200a41027410" - "df80808000210a200128020421014100210602400340200a20064102746a280200" - "220820063b0190032008200b36028802200620054f0d01200620062005496a2206" - "20054d0d000b0b2000200136022c2000200336022820002002412810df80808000" - "220620013602342006200b360230200241d0006a2480808080000f0b000b200841" - "0b41c89fc0800010b180808000000b41909fc08000412841b89fc0800010a68080" - "8000000b2008410c41d89fc0800010b180808000000b41909fc08000412841b89f" - "c0800010a680808000000bbb0b01037f2380808080004180016b22022480808080" - "00200028020021002002410036022c2002428080808010370224200241033a0050" - "200241203602402002410036024c200241c0a0c080003602482002410036023820" - "0241003602302002200241246a3602440240024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002400240" - "02400240024020002802000e1918000102030405060708090a0b0c0d0e0f101112" - "1314151617180b024002400240024020002d00040e0400010203000b2002200028" - "020836025441002d00c0cfc080001a41141084808080002203450d1c200341106a" - "41002800f4ccc08000360000200341086a41002900ecccc0800037000020034100" - "2900e4ccc08000370000200241143602602002200336025c200241143602582002" - "410336026c200241ccccc08000360268200242023702742002418680808000ad42" - "2086200241d4006aad843703102002418780808000ad422086200241d8006aad84" - "3703082002200241086a360270200241246a41c0a0c08000200241e8006a10b580" - "8080002103024020022802582204450d00200228025c20041082808080000b2003" - "0d1d0c1b0b20002d000521032002410136026c200241c8c6c08000360268200242" - "013702742002418280808000ad422086200241086aad8437035820022003410274" - "220341f8ccc080006a28020036020c20022003419ccec080006a28020036020820" - "02200241d8006a360270200241246a41c0a0c08000200241e8006a10b580808000" - "0d1c0c1a0b200241306a20002802082203280200200328020410b2808080000d1b" - "0c190b20002802082203280200200241306a200328020428021011828080800080" - "808080000d1a0c180b200241246a4181a2c08000411810c4808080000d190c170b" - "200241246a4199a2c08000411b10c4808080000d180c160b200241246a41b4a2c0" - "8000411a10c4808080000d170c150b200241246a41cea2c08000411910c4808080" - "000d160c140b200241246a41e7a2c08000410c10c4808080000d150c130b200241" - "246a41f3a2c08000411310c4808080000d140c120b200241246a4186a3c0800041" - "1310c4808080000d130c110b200241246a4199a3c08000410e10c4808080000d12" - "0c100b200241246a41a7a3c08000410e10c4808080000d110c0f0b200241246a41" - "b5a3c08000410c10c4808080000d100c0e0b200241246a41c1a3c08000410e10c4" - "808080000d0f0c0d0b200241246a41cfa3c08000410e10c4808080000d0e0c0c0b" - "200241246a41dda3c08000411310c4808080000d0d0c0b0b200241246a41f0a3c0" - "8000411a10c4808080000d0c0c0a0b200241246a418aa4c08000413e10c4808080" - "000d0b0c090b200241246a41c8a4c08000411410c4808080000d0a0c080b200241" - "246a41dca4c08000413410c4808080000d090c070b200241246a4190a5c0800041" - "2c10c4808080000d080c060b200241246a41bca5c08000412410c4808080000d07" - "0c050b200241246a41e0a5c08000410e10c4808080000d060c040b200241246a41" - "eea5c08000411310c4808080000d050c030b200241246a4181a6c08000411c10c4" - "808080000d040c020b200241246a419da6c08000411810c480808000450d010c03" - "0b200241246a2000280204200028020810c4808080000d020b200241d8006a4108" - "6a200241246a41086a280200360200200220022902243703582002418380808000" - "36027c2002418380808000360274200241888080800036026c2002410436020c20" - "0241d0a6c08000360208200242033702142002200041106a36027820022000410c" - "6a3602702002200241d8006a3602682002200241e8006a36021020012802142001" - "280218200241086a10b5808080002100024020022802582201450d00200228025c" - "20011082808080000b20024180016a24808080800020000f0b000b41e8a0c08000" - "4137200241e8006a41d8a0c0800041eca1c0800010a180808000000b1400200120" - "00280204200028020810b2808080000b4b01017f02402000280200200028020822" - "036b20024f0d0020002003200210cf80808000200028020821030b200028020420" - "036a2001200210df808080001a2000200320026a36020841000bd507010d7f2380" - "8080800041106b2202248080808000200028020821032000280204210441012105" - "024020012802142206412220012802182207280210220811828080800080808080" - "000d000240024020030d0041002103410021000c010b410021094100210a200421" - "0b2003210c024002400340200b200c6a210d4100210002400340200b20006a220e" - "2d0000220141817f6a41ff017141a101490d0120014122460d01200141dc00460d" - "01200c200041016a2200470d000b200a200c6a210a0c030b02400240200e2c0000" - "2201417f4c0d00200e41016a210b200141ff017121010c010b200e2d0001413f71" - "210b2001411f71210c02402001415f4b0d00200c410674200b722101200e41026a" - "210b0c010b200b410674200e2d0002413f7172210b0240200141704f0d00200b20" - "0c410c74722101200e41036a210b0c010b200b410674200e2d0003413f7172200c" - "411274418080f00071722101200e41046a210b0b2000200a6a2100200241046a20" - "014181800410b8808080000240024020022d0004418001460d0020022d000f2002" - "2d000e6b41ff01714101460d0020002009490d0302402009450d00024020092003" - "4f0d00200420096a2c000041bf7f4a0d010c050b20092003470d040b0240200045" - "0d000240200020034f0d00200420006a2c000041bf7f4c0d050c010b2000200347" - "0d040b2006200420096a200020096b200728020c220e1181808080008080808000" - "0d010240024020022d0004418001470d0020062002280208200811828080800080" - "80808000450d010c030b2006200241046a20022d000e220c6a20022d000f200c6b" - "200e11818080800080808080000d020b0240024020014180014f0d004101210e0c" - "010b024020014180104f0d004102210e0c010b41034104200141808004491b210e" - "0b200e20006a21090b0240024020014180014f0d00410121010c010b0240200141" - "80104f0d00410221010c010b41034104200141808004491b21010b200120006a21" - "0a200d200b6b220c0d010c030b0b410121050c030b200420032009200041f084c0" - "800010ba80808000000b02402009200a4b0d004100210002402009450d00024020" - "0920034f0d0020092100200420096a2c000041bf7f4c0d020c010b200321002009" - "2003470d010b0240200a0d00410021030c020b0240200a20034f0d002000210920" - "04200a6a2c000041bf7f4c0d01200a21030c020b20002109200a2003460d010b20" - "0420032009200a418085c0800010ba80808000000b2006200420006a200320006b" - "200728020c11818080800080808080000d00200641222008118280808000808080" - "800021050b200241106a24808080800020050b2200200128021441fca1c0800041" - "05200128021828020c11818080800080808080000b1e01017f0240200028020022" - "01450d00200028020420011082808080000b0b5301047f02402000280208220120" - "0028020422024f0d00200028020021030340200320016a2d000022044122460d01" - "200441dc00460d0120044120490d012000200141016a220136020820022001470d" - "000b0b0b4901017f02402000280200200028020822036b20024f0d002000200320" - "0210cf80808000200028020821030b200028020420036a2001200210df80808000" - "1a2000200320026a3602080bb10501077f23808080800041106b22042480808080" - "0002402003450d004100200341796a2205200520034b1b2106200241036a417c71" - "20026b21074100210503400240024002400240200220056a2d00002208c0220941" - "00480d00200720056b4103710d01200520064f0d020340200220056a2208280204" - "200828020072418081828478710d03200541086a22052006490d000c030b0b0240" - "024002400240024002400240200841a886c080006a2d0000417e6a0e0300010205" - "0b200541016a220520034f0d04200220056a2c000041bf7f4a0d040c050b200541" - "016a220a20034f0d032002200a6a2c0000210a02400240200841e001460d002008" - "41ed01460d012009411f6a41ff0171410c490d032009417e71416e470d05200a41" - "40480d040c050b200a41607141a07f460d030c040b200a419f7f4a0d030c020b20" - "0541016a220a20034f0d022002200a6a2c0000210a024002400240024020084190" - "7e6a0e050100000002000b2009410f6a41ff017141024b0d05200a4140480d020c" - "050b200a41f0006a41ff01714130490d010c040b200a418f7f4a0d030b20054102" - "6a220820034f0d02200220086a2c000041bf7f4a0d02200541036a220520034f0d" - "02200220056a2c000041bf7f4c0d030c020b200a41404e0d010b200541026a2205" - "20034f0d00200220056a2c000041bf7f4c0d010b200441086a2001280200200128" - "020420012802081083808080004100210241002d00c0cfc080001a200428020c21" - "0520042802082108024041141084808080002203450d002003200836020c200341" - "0f360200200320053602100c060b000b200541016a21050c020b200541016a2105" - "0c010b200520034f0d000340200220056a2c00004100480d012003200541016a22" - "05470d000c030b0b20052003490d000b0b20002002360200200020033602042004" - "41106a2480808080000b5901017f23808080800041106b22012480808080002001" - "41086a2000200028020041014101410110d4808080000240200128020822004181" - "80808078460d002000200128020c109580808000000b200141106a248080808000" - "0be20601057f23808080800041206b2202248080808000200241146a200010cd80" - "8080000240024020022f01140d0002400240024002400240024020022f01162203" - "4180f803714180b803460d0020034180c8006a41ffff03714180f803490d042002" - "41146a200010ce8080800020022d00140d0620022d001521042000200028020822" - "0541016a360208200441dc00470d03200241146a200010ce8080800020022d0014" - "0d0620022d001521042000200541026a360208200441f500470d02200241146a20" - "0010cd8080800020022f01140d0620022f011622044180c0006a41ffff03714180" - "f803490d0120034180d0006a41ffff0371410a7420044180c8006a41ffff037172" - "2205418080046a210302402001280200200128020822006b41034b0d0020012000" - "410410cf80808000200128020821000b2001200041046a36020820012802042000" - "6a2200200341127641f001723a0000200041036a2004413f71418001723a000020" - "002005410676413f71418001723a000220002003410c76413f71418001723a0001" - "410021000c070b200220002802002000280204200028020810838080800041002d" - "00c0cfc080001a200228020421012002280200210341141084808080002200450d" - "042000200336020c20004114360200200020013602100c060b200241086a200028" - "02002000280204200028020810838080800041002d00c0cfc080001a200228020c" - "21012002280208210341141084808080002200450d032000200336020c20004114" - "360200200020013602100c050b200241173602142000200241146a10d080808000" - "21000c040b200241173602142000200241146a10d08080800021000c030b024002" - "4002402003418001490d0002402001280200200128020822046b41034b0d002001" - "2004410410cf80808000200128020821040b200128020420046a21002003418010" - "4f0d0120034106764140722106410221050c020b02402001280208220020012802" - "00470d00200110cb808080000b2001200041016a360208200128020420006a2003" - "3a0000410021000c040b20002003410676413f71418001723a00012003410c7641" - "60722106410321050b200020063a00002001200420056a360208200020056a417f" - "6a2003413f71418001723a0000410021000c020b000b200228021821000b200241" - "206a24808080800020000b910301057f23808080800041106b2202248080808000" - "02400240024002402001280204220320012802082204490d000240200320046b41" - "034b0d0020012003360208200241086a2001280200200320031083808080004100" - "2d00c0cfc080001a200228020c2103200228020821044114108480808000220145" - "0d022001200436020c2001410436020020002001360204200120033602100c030b" - "2001200441046a220536020802402001280200220620046a22012d000141017441" - "88bdc080006a2f010020012d00004101744188c1c080006a2f010072c141087420" - "012d00024101744188c1c080006a2e01007220012d00034101744188bdc080006a" - "2e0100722201417f4a0d00200220062003200510838080800041002d00c0cfc080" - "001a200228020421032002280200210441141084808080002201450d0220012004" - "36020c2001410c36020020002001360204200120033602100c030b200020013b01" - "02410021010c030b2004200341f8bcc0800010aa808080000b000b410121010b20" - "0020013b0100200241106a2480808080000bb20101037f23808080800041106b22" - "022480808080000240024002402001280208220320012802042204490d00200241" - "086a20012802002004200310838080800041002d00c0cfc080001a200228020c21" - "032002280208210441141084808080002201450d022001200436020c2001410436" - "02002000200136020420012003360210410121010c010b2000200128020020036a" - "2d00003a0001410021010b200020013a0000200241106a2480808080000f0b000b" - "5601017f23808080800041106b2203248080808000200341086a20002001200241" - "01410110d480808000024020032802082202418180808078460d00200220032802" - "0c109580808000000b200341106a2480808080000b8c0101037f23808080800041" - "106b2202248080808000200241086a200028020020002802042000280208108380" - "80800041002d00c0cfc080001a200228020c210320022802082104024041141084" - "8080800022000d00000b2000200436020c20002001290200370200200020033602" - "10200041086a200141086a280200360200200241106a24808080800020000b1f00" - "024020012802040e020000000b20004188c5c08000200110b5808080000be30201" - "027f23808080800041106b22022480808080000240024002400240200141800149" - "0d002002410036020c2001418010490d0102402001418080044f0d002002200141" - "3f71418001723a000e20022001410c7641e001723a000c20022001410676413f71" - "418001723a000d410321010c030b20022001413f71418001723a000f2002200141" - "127641f001723a000c20022001410676413f71418001723a000e20022001410c76" - "413f71418001723a000d410421010c020b0240200028020822032000280200470d" - "00200010cb808080000b2000200341016a360208200028020420036a20013a0000" - "0c020b20022001413f71418001723a000d2002200141067641c001723a000c4102" - "21010b02402000280200200028020822036b20014f0d0020002003200110cf8080" - "8000200028020821030b200028020420036a2002410c6a200110df808080001a20" - "00200320016a3602080b200241106a24808080800041000b820101017f02400240" - "024002402003280204450d000240200328020822040d002002450d0341002d00c0" - "cfc080001a0c020b20032802002004200210a78080800021030c030b2002450d01" - "41002d00c0cfc080001a0b200210848080800021030c010b200121030b20002002" - "36020820002003200120031b36020420002003453602000b9f0202047f017e2380" - "8080800041206b2206248080808000024002400240200220036a220320024f0d00" - "410021020c010b41002102200420056a417f6a410020046b71ad41084104200541" - "01461b22072001280200220841017422092003200920034b1b2203200720034b1b" - "2207ad7e220a422088a70d00200aa7220941808080807820046b4b0d0102400240" - "20080d00410021020c010b2006200820056c36021c200620012802043602142004" - "21020b20062002360218200641086a20042009200641146a10d380808000024020" - "062802080d00200628020c21022001200736020020012002360204418180808078" - "21020c010b20062802102103200628020c21020c010b0b20002003360204200020" - "02360200200641206a2480808080000b0300000b0900200041003602000bc30201" - "047f411f21020240200141ffffff074b0d002001410620014108766722026b7641" - "017120024101746b413e6a21020b200042003702102000200236021c2002410274" - "41cccfc080006a2103024041002802e8d2c0800041012002742204710d00200320" - "00360200200020033602182000200036020c20002000360208410041002802e8d2" - "c080002004723602e8d2c080000f0b024002400240200328020022042802044178" - "712001470d00200421020c010b20014100411920024101766b2002411f461b7421" - "03034020042003411d764104716a41106a22052802002202450d02200341017421" - "032002210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b20052000" - "360200200020043602182000200036020c200020003602080b0b00200010d98080" - "8000000bb50101037f23808080800041106b2201248080808000200028020c2102" - "024002400240024020002802040e020001020b20020d0141012102410021030c02" - "0b20020d00200028020022022802042103200228020021020c010b200141808080" - "80783602002001200036020c2001418980808000200028021c22002d001c20002d" - "001d10da80808000000b20012003360204200120023602002001418a8080800020" - "0028021c22002d001c20002d001d10da80808000000b990101027f238080808000" - "41106b2204248080808000410041002802c8cfc08000220541016a3602c8cfc080" - "00024020054100480d000240024041002d0094d3c080000d0041004100280290d3" - "c0800041016a360290d3c0800041002802c4cfc08000417f4a0d010c020b200441" - "086a200020011183808080008080808000000b410041003a0094d3c08000200245" - "0d0010d580808000000b000b0c00200020012902003703000b4a01037f41002103" - "02402002450d000240034020002d0000220420012d00002205470d01200041016a" - "2100200141016a21012002417f6a2202450d020c000b0b200420056b21030b2003" - "0bac0501087f0240024002400240200020016b20024f0d00200120026a21032000" - "20026a21040240200241104f0d00200021050c030b2004417c7121054100200441" - "037122066b210702402006450d00200120026a417f6a210803402004417f6a2204" - "20082d00003a00002008417f6a210820052004490d000b0b2005200220066b2209" - "417c7122066b21040240200320076a2207410371450d0020064101480d02200741" - "0374220841187121022007417c71220a417c6a2101410020086b4118712103200a" - "280200210803402005417c6a220520082003742001280200220820027672360200" - "2001417c6a210120042005490d000c030b0b20064101480d01200920016a417c6a" - "210103402005417c6a220520012802003602002001417c6a210120042005490d00" - "0c020b0b02400240200241104f0d00200021040c010b2000410020006b41037122" - "036a210502402003450d0020002104200121080340200420082d00003a00002008" - "41016a2108200441016a22042005490d000b0b2005200220036b2209417c712207" - "6a210402400240200120036a2206410371450d0020074101480d01200641037422" - "0841187121022006417c71220a41046a2101410020086b4118712103200a280200" - "21080340200520082002762001280200220820037472360200200141046a210120" - "0541046a22052004490d000c020b0b20074101480d002006210103402005200128" - "0200360200200141046a2101200541046a22052004490d000b0b20094103712102" - "200620076a21010b2002450d02200420026a21050340200420012d00003a000020" - "0141016a2101200441016a22042005490d000c030b0b20094103712201450d0120" - "07410020066b6a2103200420016b21050b2003417f6a210103402004417f6a2204" - "20012d00003a00002001417f6a210120052004490d000b0b20000b0e0020002001" - "200210dd808080000bc10201087f02400240200241104f0d00200021030c010b20" - "00410020006b41037122046a210502402004450d00200021032001210603402003" - "20062d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d00200841" - "01480d012009410374220641187121022009417c71220a41046a2101410020066b" - "4118712104200a2802002106034020052006200276200128020022062004747236" - "0200200141046a2101200541046a22052003490d000c020b0b20084101480d0020" - "092101034020052001280200360200200141046a2101200541046a22052003490d" - "000b0b20074103712102200920086a21010b02402002450d00200320026a210503" - "40200320012d00003a0000200141016a2101200341016a22032005490d000b0b20" - "000b0bca4f0100418080c0000bc04f0b00000004000000040000000c0000006361" - "6c6c65642060526573756c743a3a756e77726170282960206f6e20616e20604572" - "72602076616c7565756c6c727565616c73657372632f6c69622e72730045001000" - "0a000000150000004b000000450010000a000000160000004b0000004163636f75" - "6e7400450010000a0000001700000033000000450010000a000000180000003300" - "00006361706163697479206f766572666c6f770000009800100011000000616c6c" - "6f632f7372632f7261775f7665632e7273b4001000140000001800000005000000" - "2e2e3031323334353637383961626364656663616c6c656420604f7074696f6e3a" - "3a756e77726170282960206f6e206120604e6f6e65602076616c7565696e646578" - "206f7574206f6620626f756e64733a20746865206c656e20697320206275742074" - "686520696e6465782069732000150110002000000035011000120000003a200000" - "01000000000000005801100002000000636f72652f7372632f666d742f6e756d2e" - "7273006c0110001300000066000000170000003078303030313032303330343035" - "303630373038303931303131313231333134313531363137313831393230323132" - "323233323432353236323732383239333033313332333333343335333633373338" - "333934303431343234333434343534363437343834393530353135323533353435" - "353536353735383539363036313632363336343635363636373638363937303731" - "373237333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939636f72652f7372632f66" - "6d742f6d6f642e72730000005a021000130000009b090000260000005a02100013" - "000000a40900001a00000072616e676520737461727420696e64657820206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820900210" - "0012000000a20210002200000072616e676520656e6420696e64657820d4021000" - "10000000a202100022000000736c69636520696e64657820737461727473206174" - "202062757420656e64732061742000f4021000160000000a0310000d0000000101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101010101010101" - "010101010101010101010101010101010101010101010101010101000000000000" - "000000000000000000000000000000000000000000000000000000000000000000" - "000000000000000000000000000000000000000000000000000000020202020202" - "020202020202020202020202020202020202020202020202030303030303030303" - "03030303030303040404040400000000000000000000005b2e2e2e5d626567696e" - "203c3d20656e642028203c3d2029207768656e20736c6963696e672060602d0410" - "000e0000003b041000040000003f041000100000004f0410000100000062797465" - "20696e64657820206973206e6f742061206368617220626f756e646172793b2069" - "7420697320696e7369646520202862797465732029206f66206000700410000b00" - "00007b04100026000000a104100008000000a9041000060000004f041000010000" - "00206973206f7574206f6620626f756e6473206f6620600000700410000b000000" - "d8041000160000004f04100001000000636f72652f7372632f7374722f6d6f642e" - "7273000805100013000000f00000002c000000636f72652f7372632f756e69636f" - "64652f7072696e7461626c652e72730000002c0510001d0000001a000000360000" - "002c0510001d0000000a0000002b00000000060101030104020507070208080902" - "0a050b020e041001110212051311140115021702190d1c051d081f0124016a046b" - "02af03b102bc02cf02d102d40cd509d602d702da01e005e102e704e802ee20f004" - "f802fa03fb010c273b3e4e4f8f9e9e9f7b8b9396a2b2ba86b1060709363d3e56f3" - "d0d1041418363756577faaaeafbd35e01287898e9e040d0e11122931343a454649" - "4a4e4f64655cb6b71b1c07080a0b141736393aa8a9d8d909379091a8070a3b3e66" - "698f92116f5fbfeeef5a62f4fcff53549a9b2e2f2728559da0a1a3a4a7a8adbabc" - "c4060b0c151d3a3f4551a6a7cccda007191a22253e3fe7ecefffc5c60420232526" - "2833383a484a4c50535556585a5c5e606365666b73787d7f8aa4aaafb0c0d0aeaf" - "6e6fbe935e227b0503042d036603012f2e80821d03310f1c0424091e052b054404" - "0e2a80aa06240424042808340b4e43813709160a08183b45390363080930160521" - "031b05014038044b052f040a070907402027040c0936033a051a07040c07504937" - "330d33072e080a8126524b2b082a161a261c1417094e042409440d19070a064808" - "2709750b423e2a063b050a0651060105100305808b621e48080a80a65e22450b0a" - "060d133a060a362c041780b93c64530c48090a46451b4808530d49070a80f6460a" - "1d03474937030e080a0639070a813619073b031c56010f320d839b66750b80c48a" - "4c630d843010168faa8247a1b98239072a045c06260a460a28051382b05b654b04" - "39071140050b020e97f80884d62a09a2e781330f011d060e0408818c89046b050d" - "0309071092604709743c80f60a73087015467a140c140c57091980878147038542" - "0f1584501f060680d52b053e2101702d031a040281401f113a050181d02a82e680" - "f7294c040a04028311444c3d80c23c06010455051b3402810e2c04640c560a80ae" - "381d0d2c040907020e06809a83d80411030d0377045f060c04010f0c0438080a06" - "2808224e81540c1d03090736080e040907090780cb250a84060001030505060602" - "0706080709110a1c0b190c1a0d100e0c0f0410031212130916011704180119031a" - "071b011c021f1620032b032d0b2e01300431023201a702a902aa04ab08fa02fb05" - "fd02fe03ff09ad78798b8da23057588b8c901cdd0e0f4b4cfbfc2e2f3f5c5d5fe2" - "848d8e9192a9b1babbc5c6c9cadee4e5ff00041112293134373a3b3d494a5d848e" - "92a9b1b4babbc6cacecfe4e500040d0e11122931343a3b4546494a5e646584919b" - "9dc9cecf0d11293a3b4549575b5c5e5f64658d91a9b4babbc5c9dfe4e5f00d1145" - "4964658084b2bcbebfd5d7f0f183858ba4a6bebfc5c7cfdadb4898bdcdc6cecf49" - "4e4f57595e5f898e8fb1b6b7bfc1c6c7d71116175b5cf6f7feff806d71dedf0e1f" - "6e6f1c1d5f7d7eaeaf7fbbbc16171e1f46474e4f585a5c5e7e7fb5c5d4d5dcf0f1" - "f572738f747596262e2fa7afb7bfc7cfd7df9a00409798308f1fd2d4ceff4e4f5a" - "5b07080f10272feeef6e6f373d3f42459091536775c8c9d0d1d8d9e7feff00205f" - "2282df048244081b04061181ac0e80ab051f09811b03190801042f043404070301" - "070607110a500f1207550703041c0a090308030703020303030c0405030b06010e" - "15054e071b0757070206170c500443032d03010411060f0c3a041d255f206d046a" - "2580c80582b0031a0682fd03590716091809140c140c6a060a061a0659072b0546" - "0a2c040c040103310b2c041a060b0380ac060a062f314d0380a4083c030f033c07" - "38082b0582ff1118082f112d03210f210f808c048297190b158894052f053b0702" - "0e180980be22740c80d61a81100580df0bf29e033709815c1480b80880cb050a18" - "3b030a06380846080c06740b1e035a0459098083181c0a16094c04808a06aba40c" - "170431a10481da26070c050580a61081f50701202a064c04808d0480be031b030f" - "0d636f72652f7372632f756e69636f64652f756e69636f64655f646174612e7273" - "00e70a1000200000005000000028000000e70a1000200000005c00000016000000" - "0003000083042000910560005d13a0001217201f0c20601fef2ca02b2a30202c6f" - "a6e02c02a8602d1efb602e00fe20369eff6036fd01e136010a2137240de137ab0e" - "61392f18a139301c6148f31ea14c40346150f06aa1514f6f21529dbca15200cf61" - "5365d1a15300da215400e0e155aee26157ece42159d0e8a1592000ee59f0017f5a" - "00700007002d0101010201020101480b30151001650702060202010423011e1b5b" - "0b3a09090118040109010301052b033c082a180120370101010408040103070a02" - "1d013a0101010204080109010a021a010202390104020402020303011e0203010b" - "0239010405010204011402160601013a0101020104080107030a021e013b010101" - "0c01090128010301370101030503010407020b021d013a01020102010301050207" - "020b021c02390201010204080109010a021d014801040102030101080151010207" - "0c08620102090b0749021b0101010101370e01050102050b012409016604010601" - "0202021902040310040d01020206010f01000300031d021e021e02400201070801" - "020b09012d030101750222017603040209010603db0202013a0101070101010102" - "08060a0201301f310430070101050128090c022004020201033801010203010103" - "3a0802029803010d0107040106010302c6400001c32100038d0160200006690200" - "04010a200250020001030104011902050197021a120d012608190b2e0330010204" - "020227014306020202020c0108012f01330101030202050201012a020801ee0102" - "01040100010010101000020001e201950500030102050428030401a50200040002" - "5003460b31047b01360f290102020a033104020207013d03240501083e010c0234" - "090a0402015f0302010102060102019d010308150239020101010116010e070305" - "c308020301011701510102060101020101020102eb010204060201021b02550802" - "0101026a0101010206010165030204010500090102f5010a020101040190040202" - "0401200a280602040801090602032e0d010200070106010152160207010201027a" - "06030101020107010148020301010100020b023405050101010001060f00053b07" - "00013f0451010002002e0217000101030405080802071e0494030037043208010e" - "011605010f000701110207010201056401a00700013d04000400076d07006080f0" - "002f72757374632f63326637346333663932386165623530336631356234653965" - "6635373738653737663330353862382f6c6962726172792f616c6c6f632f737263" - "2f636f6c6c656374696f6e732f62747265652f6d61702f656e7472792e72730083" - "0e10006000000071010000360000002f72757374632f6332663734633366393238" - "61656235303366313562346539656635373738653737663330353862382f6c6962" - "726172792f616c6c6f632f7372632f636f6c6c656374696f6e732f62747265652f" - "6e6f64652e7273617373657274696f6e206661696c65643a20656467652e686569" - "676874203d3d2073656c662e686569676874202d203100f40e10005b000000af02" - "000009000000617373657274696f6e206661696c65643a207372632e6c656e2829" - "203d3d206473742e6c656e2829f40e10005b0000002f07000005000000f40e1000" - "5b000000af04000023000000f40e10005b000000ef040000240000006173736572" - "74696f6e206661696c65643a20656467652e686569676874203d3d2073656c662e" - "6e6f64652e686569676874202d2031000000f40e10005b000000f0030000090000" - "00181d10005f00000058020000300000000d0000000c000000040000000e000000" - "0f00000010000000000000000000000001000000110000006120446973706c6179" - "20696d706c656d656e746174696f6e2072657475726e656420616e206572726f72" - "20756e65787065637465646c792f72757374632f63326637346333663932386165" - "6235303366313562346539656635373738653737663330353862382f6c69627261" - "72792f616c6c6f632f7372632f737472696e672e727300009f1010004b00000006" - "0a00000e0000004572726f72454f46207768696c652070617273696e672061206c" - "697374454f46207768696c652070617273696e6720616e206f626a656374454f46" - "207768696c652070617273696e67206120737472696e67454f46207768696c6520" - "70617273696e6720612076616c7565657870656374656420603a60657870656374" - "656420602c60206f7220605d60657870656374656420602c60206f7220607d6065" - "78706563746564206964656e7465787065637465642076616c7565657870656374" - "656420602260696e76616c696420657363617065696e76616c6964206e756d6265" - "726e756d626572206f7574206f662072616e6765696e76616c696420756e69636f" - "646520636f646520706f696e74636f6e74726f6c2063686172616374657220285c" - "75303030302d5c75303031462920666f756e64207768696c652070617273696e67" - "206120737472696e676b6579206d757374206265206120737472696e67696e7661" - "6c69642076616c75653a206578706563746564206b657920746f2062652061206e" - "756d62657220696e2071756f746573666c6f6174206b6579206d75737420626520" - "66696e6974652028676f74204e614e206f72202b2f2d696e66296c6f6e65206c65" - "6164696e6720737572726f6761746520696e206865782065736361706574726169" - "6c696e6720636f6d6d61747261696c696e672063686172616374657273756e6578" - "70656374656420656e64206f662068657820657363617065726563757273696f6e" - "206c696d69742065786365656465644572726f72282c206c696e653a202c20636f" - "6c756d6e3a2000000035131000060000003b13100008000000431310000a000000" - "4826100001000000000000000000f03f0000000000002440000000000000594000" - "00000000408f40000000000088c34000000000006af8400000000080842e410000" - "0000d01263410000000084d797410000000065cdcd41000000205fa00242000000" - "e876483742000000a2941a6d42000040e59c30a2420000901ec4bcd64200003426" - "f56b0c430080e03779c3414300a0d8855734764300c84e676dc1ab43003d9160e4" - "58e143408cb5781daf154450efe2d6e41a4b4492d54d06cff08044f64ae1c7022d" - "b544b49dd9794378ea449102282c2a8b2045350332b7f4ad54450284fee471d989" - "4581121f2fe727c04521d7e6fae031f445ea8ca039593e294624b00888ef8d5f46" - "176e05b5b5b893469cc94622e3a6c846037cd8ea9bd0fe46824dc77261423347e3" - "2079cff91268471b695743b8179e47b1a1162ad3ced2471d4a9cf487820748a55c" - "c3f129633d48e7191a37fa5d724861a0e0c478f5a64879c818f6d6b2dc484c7dcf" - "59c6ef11499e5c43f0b76b4649c63354eca5067c495ca0b4b32784b14973c8a1a0" - "31e5e5498f3aca087e5e1b4a9a647ec50e1b514ac0fddd76d261854a307d951447" - "baba4a3e6edd6c6cb4f04acec9148887e1244b41fc196ae9195a4ba93d50e23150" - "904b134de45a3e64c44b57609df14d7df94b6db8046ea1dc2f4c44f3c2e4e4e963" - "4c15b0f31d5ee4984c1b9c70a5751dcf4c916166876972034df5f93fe9034f384d" - "72f88fe3c4626e4d47fb390ebbfda24d197ac8d129bdd74d9f983a4674ac0d4e64" - "9fe4abc88b424e3dc7ddd6ba2e774e0c39958c69faac4ea743ddf7811ce24e9194" - "d475a2a3164fb5b949138b4c4c4f11140eecd6af814f169911a7cc1bb64f5bffd5" - "d0bfa2eb4f99bf85e2b74521507f2f27db259755505ffbf051effc8a501b9d3693" - "15dec050624404f89a15f5507b5505b6015b2a516d55c311e1786051c82a345619" - "9794517a35c1abdfbcc9516cc158cb0b160052c7f12ebe8e1b345239aeba6d7222" - "6952c75929090f6b9f521dd8b965e9a2d352244e28bfa38b0853ad61f2ae8cae3e" - "530c7d57ed172d73534f5cade85df8a75363b3d86275f6dd531e70c75d09ba1254" - "254c39b58b6847542e9f87a2ae427d547dc39425ad49b2545cf4f96e18dce65473" - "71b88a1e931c55e846b316f3db5155a21860dcef528655ca1e78d3abe7bb553f13" - "2b64cb70f1550ed8353dfecc2556124e83cc3d405b56cb10d29f26089156fe94c6" - "47304ac5563d3ab859bc9cfa56662413b8f5a1305780ed172673ca6457e0e89def" - "0ffd99578cb1c2f5293ed057ef5d3373b44d04586b35009021613958c54200f469" - "b96f58bb298038e2d3a3582a34a0c6dac8d8583541487811fb0e59c1282debea5c" - "4359f172f8a525347859ad8f760f2f41ae59cc19aa69bde8e2593fa014c4eca217" - "5a4fc819f5a78b4d5a321d30f94877825a7e247c371b15b75a9e2d5b0562daec5a" - "82fc58437d08225ba33b2f949c8a565b8c0a3bb9432d8c5b97e6c4534a9cc15b3d" - "20b6e85c03f65b4da8e32234842b5c3049ce95a032615c7cdb41bb487f955c5b52" - "12ea1adfca5c79734bd270cb005d5750de064dfe345d6de49548e03d6a5dc4ae5d" - "2dac66a05d751ab5385780d45d1261e2066da0095eab7c4d244404405ed6db602d" - "5505745ecc12b978aa06a95e7f57e7165548df5eaf96502e358d135f5bbce47982" - "70485f72eb5d18a38c7e5f27b33aefe517b35ff15f096bdfdde75fedb7cb4557d5" - "1d60f4529f8b56a55260b127872eac4e87609df1283a5722bd60029759847635f2" - "60c3fc6f25d4c22661f4fbcb2e89735c61787d3fbd35c89161d65c8f2c433ac661" - "0c34b3f7d3c8fb618700d07a845d3162a9008499e5b46562d400e5ff1e229b6284" - "20ef5f53f5d062a5e8ea37a8320563cfa2e545527f3a63c185af6b938f70633267" - "9b4678b3a463fe40425856e0d9639f6829f7352c1064c6c2f3744337446478b330" - "521445796456e0bc665996af64360c36e0f7bde364438f43d875ad18651473544e" - "d3d84e65ecc7f41084478365e8f931156519b86561787e5abe1fee653d0b8ff8d6" - "d322660cceb2b6cc8857668f815fe4ff6a8d66f9b0bbeedf62c266389d6aea97fb" - "f666864405e57dba2c67d44a23af8ef46167891dec5ab2719667eb24a7f11e0ecc" - "6713770857d3880168d794ca2c08eb35680d3afd37ca656b684844fe629e1fa168" - "5ad5bdfb8567d568b14aad7a67c10a69af4eacace0b840695a62d7d718e77469f1" - "3acd0ddf20aa69d644a0688b54e0690c56c842ae69146a8f6b7ad31984496a7306" - "594820e57f6a08a4372d34efb36a0a8d853801ebe86a4cf0a686c1251f6b305628" - "f49877536bbb6b32317f55886baa067ffdde6abe6b2a646f5ecb02f36b353d0b36" - "7ec3276c820c8ec35db45d6cd1c7389aba90926cc6f9c640e934c76c37b8f89023" - "02fd6c23739b3a5621326deb4f42c9aba9666de6e392bb16549c6d70ce3b358eb4" - "d16d0cc28ac2b121066e8f722d331eaa3b6e9967fcdf524a716e7f81fb97e79ca5" - "6edf61fa7d2104db6e2c7dbcee94e2106f769c6b2a3a1b456f948306b508627a6f" - "3d122471457db06fcc166dcd969ce46f7f5cc880bcc31970cf397dd0551a507043" - "889c44eb20847054aac3152629b970e994349b6f73ef7011dd00c125a823715614" - "41312f9258716b5991fdbab68e71e3d77ade3432c371dc8d1916c2fef77153f19f" - "9b72fe2d72d4f643a107bf627289f49489c96e9772ab31faeb7b4acd720b5f7c73" - "8d4e0273cd765bd030e2367381547204bd9a6c73d074c722b6e0a173045279abe3" - "58d67386a657961cef0b7414c8f6dd71754174187a7455ced275749e98d1ea8147" - "ab7463ffc232b10ce1743cbf737fdd4f15750baf50dfd4a34a75676d920b65a680" - "75c008774efecfb475f1ca14e2fd03ea75d6fe4cad7e4220768c3ea0581e535476" - "2f4ec8eee5678976bb617a6adfc1bf76157d8ca22bd9f3765a9c2f8b76cf287770" - "83fb2d54035f772632bd9c14629377b07eecc3993ac8775c9ee7344049fe77f9c2" - "1021c8ed3278b8f354293aa96778a530aab388939d78675e4a70357cd27801f65c" - "cc421b07798233747f13e23c7931a0a82f4c0d72793dc8923b9f90a6794d7a770a" - "c734dc7970ac8a66fca0117a8c572d803b09467a6fad38608a8b7b7a656c237c36" - "37b17a7f472c1b0485e57a5e59f72145e61a7bdb973a35ebcf507bd23d8902e603" - "857b468d2b83df44ba7b4c38fbb10b6bf07b5f067a9ece85247cf687184642a759" - "7cfa54cf6b8908907c382ac3c6ab0ac47cc7f473b8560df97cf8f19066ac502f7d" - "3b971ac06b92637d0a3d21b00677987d4c8c295cc894ce7db0f79939fd1c037e9c" - "7500883ce4377e039300aa4bdd6d7ee25b404a4faaa27eda72d01ce354d77e908f" - "04e41b2a0d7fbad9826e513a427f299023cae5c8767f3374ac3c1f7bac7fa0c8eb" - "85f3cce17f2f72757374632f633266373463336639323861656235303366313562" - "346539656635373738653737663330353862382f6c6962726172792f616c6c6f63" - "2f7372632f636f6c6c656374696f6e732f62747265652f6e617669676174652e72" - "7300181d10005f000000c600000027000000181d10005f000000160200002f0000" - "00181d10005f000000a1000000240000002f686f6d652f7077616e672f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e696f2d36" - "6631376432326262613135303031662f73657264655f6a736f6e2d312e302e3133" - "352f7372632f726561642e727300a81d10005f000000a001000045000000a81d10" - "005f000000a50100003d000000a81d10005f000000ad0100001a000000a81d1000" - "5f000000fa01000013000000a81d10005f000000030200003e000000a81d10005f" - "000000ff01000033000000a81d10005f000000090200003a000000a81d10005f00" - "00006802000019000000ffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffff0000010002000300040005000600070008000900ffffffffffff" - "ffffffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffff0a000b000c000d000e000f00ffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffff000010002000300040" - "0050006000700080009000ffffffffffffffffffffffffffffa000b000c000d000" - "e000f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffa000b000c000d000e000" - "f000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" - "ffffffffffffffffffffff0d0000000c000000040000000e0000000f0000001000" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e362f7372632f64" - "6c6d616c6c6f632e7273617373657274696f6e206661696c65643a207073697a65" - "203e3d2073697a65202b206d696e5f6f7665726865616400a022100029000000a8" - "04000009000000617373657274696f6e206661696c65643a207073697a65203c3d" - "2073697a65202b206d61785f6f766572686561640000a022100029000000ae0400" - "000d0000000100000000000000656e74697479206e6f7420666f756e647065726d" - "697373696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f" - "6e6e656374696f6e207265736574686f737420756e726561636861626c656e6574" - "776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f727465" - "646e6f7420636f6e6e65637465646164647265737320696e207573656164647265" - "7373206e6f7420617661696c61626c656e6574776f726b20646f776e62726f6b65" - "6e2070697065656e7469747920616c7265616479206578697374736f7065726174" - "696f6e20776f756c6420626c6f636b6e6f742061206469726563746f7279697320" - "61206469726563746f72796469726563746f7279206e6f7420656d707479726561" - "642d6f6e6c792066696c6573797374656d206f722073746f72616765206d656469" - "756d66696c6573797374656d206c6f6f70206f7220696e646972656374696f6e20" - "6c696d69742028652e672e2073796d6c696e6b206c6f6f70297374616c65206e65" - "74776f726b2066696c652068616e646c65696e76616c696420696e707574207061" - "72616d65746572696e76616c6964206461746174696d6564206f75747772697465" - "207a65726f6e6f2073746f726167652073706163657365656b206f6e20756e7365" - "656b61626c652066696c6566696c6573797374656d2071756f7461206578636565" - "64656466696c6520746f6f206c617267657265736f757263652062757379657865" - "63757461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e6b73" - "696e76616c69642066696c656e616d65617267756d656e74206c69737420746f6f" - "206c6f6e676f7065726174696f6e20696e746572727570746564756e737570706f" - "72746564756e657870656374656420656e64206f662066696c656f7574206f6620" - "6d656d6f72796f74686572206572726f72756e63617465676f72697a6564206572" - "726f7220286f73206572726f72202900000001000000000000003d2610000b0000" - "0048261000010000006f7065726174696f6e207375636365737366756c10000000" - "1100000012000000100000001000000013000000120000000d0000000e00000015" - "0000000c0000000b00000015000000150000000f0000000e000000130000002600" - "00003800000019000000170000000c000000090000000a00000010000000170000" - "00190000000e0000000d00000014000000080000001b0000000e00000010000000" - "16000000150000000b000000160000000d0000000b000000130000005023100060" - "231000712310008323100093231000a3231000b6231000c8231000d5231000e323" - "1000f8231000042410000f24100024241000392410004824100056241000692410" - "008f241000c7241000e0241000f7241000032510000c2510001625100026251000" - "3d251000562510006425100071251000852510008d251000a8251000b6251000c6" - "251000dc251000f1251000fc251000122610001f2610002a26100000ac3a046e61" - "6d65000e0d7761736d5f6c69622e7761736d01f4396000325f5a4e313073657264" - "655f6a736f6e326465313066726f6d5f736c696365313768313163653038373736" - "34633961376230450188015f5a4e313073657264655f6a736f6e3576616c756532" - "646537375f244c5424696d706c247532302473657264652e2e64652e2e44657365" - "7269616c697a652475323024666f72247532302473657264655f6a736f6e2e2e76" - "616c75652e2e56616c7565244754243131646573657269616c697a653137683331" - "653531373831633833363837353945020e5f5f727573745f6465616c6c6f630345" - "5f5a4e313073657264655f6a736f6e347265616439536c69636552656164313770" - "6f736974696f6e5f6f665f696e6465783137683236623431383938353234383332" - "39364504435f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c54244124475424366d616c6c6f633137686536353933396134633839" - "376363313545054f5f5a4e34636f726533707472343564726f705f696e5f706c61" - "6365244c542473657264655f6a736f6e2e2e76616c75652e2e56616c7565244754" - "243137683533326265333033376461316237656445064a5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243131" - "70617273655f6964656e743137683663353964643731393635353139313045074b" - "5f5a4e313073657264655f6a736f6e3264653231446573657269616c697a657224" - "4c54245224475424313270617273655f6e756d6265723137683738336134316134" - "623931306464323045084c5f5a4e313073657264655f6a736f6e32646532314465" - "73657269616c697a6572244c54245224475424313370617273655f646563696d61" - "6c3137683661306333363832326663336530306145094d5f5a4e31307365726465" - "5f6a736f6e3264653231446573657269616c697a6572244c542452244754243134" - "70617273655f6578706f6e656e7431376833366464376462643233653461346562" - "450a555f5a4e313073657264655f6a736f6e3264653231446573657269616c697a" - "6572244c54245224475424323270617273655f646563696d616c5f6f766572666c" - "6f7731376833613030656365646638363031386433450b4d5f5a4e313073657264" - "655f6a736f6e3264653231446573657269616c697a6572244c5424522447542431" - "346636345f66726f6d5f7061727473313768633863316239626161613836666637" - "33450c565f5a4e313073657264655f6a736f6e3264653231446573657269616c69" - "7a6572244c54245224475424323370617273655f6578706f6e656e745f6f766572" - "666c6f7731376830343762396637333562616463666138450d4f5f5a4e31307365" - "7264655f6a736f6e3264653231446573657269616c697a6572244c542452244754" - "24313670617273655f616e795f6e756d6265723137683931643533303465356139" - "6363663531450e515f5a4e313073657264655f6a736f6e32646532314465736572" - "69616c697a6572244c54245224475424313870617273655f6c6f6e675f696e7465" - "67657231376864383130373866346133316332626532450f3d5f5a4e3130736572" - "64655f6a736f6e356572726f72354572726f7231326669785f706f736974696f6e" - "313768386631666565323432343761346639634510435f5a4e35616c6c6f633772" - "61775f7665633139526177566563244c54245424432441244754243867726f775f" - "6f6e65313768663733333137633566643665626336364511645f5a4e37305f244c" - "5424616c6c6f632e2e7665632e2e566563244c5424542443244124475424247532" - "302461732475323024636f72652e2e6f70732e2e64726f702e2e44726f70244754" - "243464726f703137686431353834386335383231633466666545124f5f5a4e3463" - "6f726533707472343564726f705f696e5f706c616365244c542473657264655f6a" - "736f6e2e2e6572726f722e2e4572726f7224475424313768663837633864366463" - "396162346263354513695f5a4e37305f244c542473657264655f6a736f6e2e2e72" - "6561642e2e536c6963655265616424753230246173247532302473657264655f6a" - "736f6e2e2e726561642e2e52656164244754243970617273655f73747231376861" - "62653863353535633862636433353545143c5f5a4e357365726465326465375669" - "7369746f72313876697369745f626f72726f7765645f7374723137683435643731" - "31633837313638633266364515335f5a4e35616c6c6f63377261775f7665633132" - "68616e646c655f6572726f72313768393762376462643066373264643738384516" - "3a5f5a4e313073657264655f6a736f6e32646531325061727365724e756d626572" - "35766973697431376838366238393638313662613130613765451781015f5a4e37" - "355f244c542473657264655f6a736f6e2e2e64652e2e4d6170416363657373244c" - "5424522447542424753230246173247532302473657264652e2e64652e2e4d6170" - "4163636573732447542431336e6578745f6b65795f7365656431326861735f6e65" - "78745f6b6579313768356461326634303536653538313464394518695f5a4e3730" - "5f244c542473657264652e2e64652e2e696d706c732e2e537472696e6756697369" - "746f7224753230246173247532302473657264652e2e64652e2e56697369746f72" - "244754243976697369745f73747231376835356436653830653061376366383938" - "4519755f5a4e37355f244c542473657264655f6a736f6e2e2e64652e2e4d617041" - "6363657373244c5424522447542424753230246173247532302473657264652e2e" - "64652e2e4d61704163636573732447542431356e6578745f76616c75655f736565" - "6431376865633835363737653830316539393133451a565f5a4e35616c6c6f6331" - "31636f6c6c656374696f6e73356274726565336d6170323542547265654d617024" - "4c54244b24432456244324412447542436696e7365727431376834643164623464" - "613838343264346665451b81015f5a4e39395f244c5424616c6c6f632e2e636f6c" - "6c656374696f6e732e2e62747265652e2e6d61702e2e42547265654d6170244c54" - "244b244324562443244124475424247532302461732475323024636f72652e2e6f" - "70732e2e64726f702e2e44726f70244754243464726f7031376835346633306630" - "323133646334313362451c5d5f5a4e36355f244c542473657264655f6a736f6e2e" - "2e76616c75652e2e56616c7565247532302461732475323024636f72652e2e636d" - "702e2e5061727469616c4571244754243265713137683162323138393234373831" - "3936633830451d8b015f5a4e3130385f244c5424616c6c6f632e2e636f6c6c6563" - "74696f6e732e2e62747265652e2e6d61702e2e49746572244c54244b2443245624" - "475424247532302461732475323024636f72652e2e697465722e2e747261697473" - "2e2e6974657261746f722e2e4974657261746f7224475424346e65787431376835" - "363664323036316535613937646164451e08616c6c6f636174651f11636f6d7061" - "72655f6163636f756e744944205c5f5a4e35355f244c5424737472247532302461" - "73247532302473657264655f6a736f6e2e2e76616c75652e2e696e6465782e2e49" - "6e646578244754243130696e6465785f696e746f31376864333238633634636161" - "3964313761634521325f5a4e34636f726536726573756c743133756e777261705f" - "6661696c6564313768663839396364303037373637303035314522325f5a4e3463" - "6f7265366f7074696f6e3133756e777261705f6661696c65643137683335353139" - "64653938613737363134664523385f5a4e35616c6c6f63377261775f7665633137" - "63617061636974795f6f766572666c6f7731376834393964343832613965643537" - "3135614524305f5a4e34636f72653970616e69636b696e673970616e69635f666d" - "74313768363534306363623264356664633361624525415f5a4e38646c6d616c6c" - "6f6338646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424346672" - "65653137683339383334616161616533653839343645262c5f5a4e34636f726539" - "70616e69636b696e673570616e6963313768303465656239313764643933633232" - "3945270e5f5f727573745f7265616c6c6f63284a5f5a4e38646c6d616c6c6f6338" - "646c6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c69" - "6e6b5f6368756e6b3137683933346533646333383362623538613345294b5f5a4e" - "38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "244754243133646973706f73655f6368756e6b3137683665306363636434353836" - "3537343633452a445f5a4e34636f726535736c69636535696e6465783236736c69" - "63655f73746172745f696e6465785f6c656e5f6661696c31376866393161336166" - "653837623164343433452b625f5a4e34636f726533666d74336e756d33696d7035" - "325f244c5424696d706c2475323024636f72652e2e666d742e2e446973706c6179" - "2475323024666f7224753230247533322447542433666d74313768626633653032" - "32383438336533373561452c3a5f5a4e34636f72653970616e69636b696e673138" - "70616e69635f626f756e64735f636865636b313768336436623861613463383034" - "39363632452d305f5a4e34636f726533666d74336e756d33696d7037666d745f75" - "363431376864353231666136656636613036373261452e11727573745f62656769" - "6e5f756e77696e642f385f5a4e34636f726533666d7439466f726d617474657231" - "327061645f696e74656772616c3137686334656130376130626331333536633445" - "30465f5a4e34636f726533666d7439466f726d617474657231327061645f696e74" - "656772616c313277726974655f7072656669783137686139613433323830623630" - "30366431324531425f5a4e34636f726535736c69636535696e6465783234736c69" - "63655f656e645f696e6465785f6c656e5f6661696c313768303838623536653239" - "3962656161616645322e5f5a4e34636f726533666d7439466f726d617474657233" - "706164313768343736396165333839333734636335314533495f5a4e34345f244c" - "54242452462454247532302461732475323024636f72652e2e666d742e2e446973" - "706c61792447542433666d74313768376666346430623836303963323437324534" - "475f5a4e34325f244c54242452462454247532302461732475323024636f72652e" - "2e666d742e2e44656275672447542433666d743137683361366261613162623437" - "61643230344535265f5a4e34636f726533666d7435777269746531376839333535" - "34653462653731663263376145365c5f5a4e34636f726533666d74336e756d3530" - "5f244c5424696d706c2475323024636f72652e2e666d742e2e4465627567247532" - "3024666f7224753230247533322447542433666d74313768353533393862313635" - "353064353237654537405f5a4e34636f726535736c69636535696e646578323273" - "6c6963655f696e6465785f6f726465725f6661696c313768353862336536383666" - "653333373030654538535f5a4e34636f72653463686172376d6574686f64733232" - "5f244c5424696d706c2475323024636861722447542431366573636170655f6465" - "6275675f657874313768656366613566303431373437393039384539345f5a4e34" - "636f726537756e69636f6465397072696e7461626c6535636865636b3137683664" - "6136346638306663313630633761453a325f5a4e34636f7265337374723136736c" - "6963655f6572726f725f6661696c31376862303364323439386438646362363433" - "453b355f5a4e34636f7265337374723139736c6963655f6572726f725f6661696c" - "5f727431376832616462643139306563313832373933453c645f5a4e37315f244c" - "5424636f72652e2e6f70732e2e72616e67652e2e52616e6765244c542449647824" - "475424247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376836636632383632303536616535653233453d465f5a4e3431" - "5f244c542463686172247532302461732475323024636f72652e2e666d742e2e44" - "656275672447542433666d7431376865613566643964626339343936626665453e" - "625f5a4e34636f726533666d74336e756d33696d7035325f244c5424696d706c24" - "75323024636f72652e2e666d742e2e446973706c61792475323024666f72247532" - "30246933322447542433666d743137686365643930633761363339633031646445" - "3fce015f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e" - "6f64653132374e6f6465526566244c5424616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4479696e67244324" - "4b24432456244324616c6c6f632e2e636f6c6c656374696f6e732e2e6274726565" - "2e2e6e6f64652e2e6d61726b65722e2e4c6561664f72496e7465726e616c244754" - "2432316465616c6c6f636174655f616e645f617363656e64313768353839613732" - "6639343233626663656245409a025f5a4e35616c6c6f633131636f6c6c65637469" - "6f6e73356274726565346e6f646532313448616e646c65244c5424616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e4e6f64655265" - "66244c5424616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4d75742443244b24432456244324616c6c6f632e" - "2e636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b6572" - "2e2e496e7465726e616c24475424244324616c6c6f632e2e636f6c6c656374696f" - "6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e2e4564676524475424" - "3130696e736572745f666974313768633861306366353339656666303131314541" - "92025f5a4e35616c6c6f633131636f6c6c656374696f6e73356274726565346e6f" - "646532313248616e646c65244c5424616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e4e6f6465526566244c5424616c6c6f632e2e" - "636f6c6c656374696f6e732e2e62747265652e2e6e6f64652e2e6d61726b65722e" - "2e4d75742443244b24432456244324616c6c6f632e2e636f6c6c656374696f6e73" - "2e2e62747265652e2e6e6f64652e2e6d61726b65722e2e496e7465726e616c2447" - "5424244324616c6c6f632e2e636f6c6c656374696f6e732e2e62747265652e2e6e" - "6f64652e2e6d61726b65722e2e4b56244754243573706c69743137686430396134" - "386237613831363331616145425a5f5a4e36315f244c542473657264655f6a736f" - "6e2e2e6572726f722e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768343032353764366634326532" - "396237344543595f5a4e36305f244c5424616c6c6f632e2e737472696e672e2e53" - "7472696e67247532302461732475323024636f72652e2e666d742e2e446973706c" - "61792447542433666d74313768636534323236616131663732366331634544615f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e57726974652447542439777269" - "74655f73747231376835393964396535373839343664643938452e31393245575f" - "5a4e35385f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "313768623637326562313939633335643138364546555f5a4e35335f244c542463" - "6f72652e2e666d742e2e4572726f72247532302461732475323024636f72652e2e" - "666d742e2e44656275672447542433666d74313768663761653238353562323439" - "64626335452e3734474c5f5a4e34636f726533707472343264726f705f696e5f70" - "6c616365244c5424616c6c6f632e2e737472696e672e2e537472696e6724475424" - "313768376236353738393966393837353963624548475f5a4e313073657264655f" - "6a736f6e347265616439536c696365526561643139736b69705f746f5f65736361" - "70655f736c6f77313768343738366336653232346661323366324549465f5a4e35" - "616c6c6f63337665633136566563244c5424542443244124475424313765787465" - "6e645f66726f6d5f736c6963653137686462613134663734663865323236646345" - "4a2f5f5a4e313073657264655f6a736f6e34726561643661735f73747231376866" - "636436626234313731373865366635454b435f5a4e35616c6c6f63377261775f76" - "65633139526177566563244c54245424432441244754243867726f775f6f6e6531" - "376836366638363461663034626564326232454c3e5f5a4e313073657264655f6a" - "736f6e3472656164323070617273655f756e69636f64655f657363617065313768" - "39363430666363616264303034613064454d725f5a4e37305f244c542473657264" - "655f6a736f6e2e2e726561642e2e536c6963655265616424753230246173247532" - "302473657264655f6a736f6e2e2e726561642e2e52656164244754243137646563" - "6f64655f6865785f65736361706531376834376265353936383535663830346461" - "454e355f5a4e313073657264655f6a736f6e347265616431317065656b5f6f725f" - "656f6631376837336362313436306531616339386135454f5a5f5a4e35616c6c6f" - "63377261775f7665633230526177566563496e6e6572244c542441244754243772" - "6573657276653231646f5f726573657276655f616e645f68616e646c6531376837" - "66656665376563326164336435616245502e5f5a4e313073657264655f6a736f6e" - "3472656164356572726f7231376865663535323764333333633963323666455130" - "5f5a4e34636f726533666d743557726974653977726974655f666d743137686133" - "31656164363637646336373865304552635f5a4e35385f244c5424616c6c6f632e" - "2e737472696e672e2e537472696e67247532302461732475323024636f72652e2e" - "666d742e2e577269746524475424313077726974655f6368617231376832313433" - "393163623865623135326336452e31393353325f5a4e35616c6c6f63377261775f" - "766563313166696e6973685f67726f773137683533383539626133383962373164" - "333545544b5f5a4e35616c6c6f63377261775f7665633230526177566563496e6e" - "6572244c54244124475424313467726f775f616d6f7274697a6564313768393863" - "3336346663343566336431323445550a727573745f70616e696356375f5a4e3463" - "6f72653570616e6963313250616e69635061796c6f61643661735f737472313768" - "363134396631343264396132653032654557505f5a4e38646c6d616c6c6f633864" - "6c6d616c6c6f633137446c6d616c6c6f63244c542441244754243138696e736572" - "745f6c617267655f6368756e6b3137686566653835316132373538326461376245" - "58455f5a4e3373746433737973396261636b747261636532365f5f727573745f65" - "6e645f73686f72745f6261636b7472616365313768346463336465343764323230" - "323162394559585f5a4e337374643970616e69636b696e673139626567696e5f70" - "616e69635f68616e646c657232385f24753762242475376224636c6f7375726524" - "75376424247537642431376865313761333937376638396331313738455a3b5f5a" - "4e337374643970616e69636b696e673230727573745f70616e69635f776974685f" - "686f6f6b31376837373665373963396636353931626535455b83015f5a4e39395f" - "244c54247374642e2e70616e69636b696e672e2e626567696e5f70616e69635f68" - "616e646c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447542436" - "61735f73747231376865623366373232643232346534326638455c066d656d636d" - "705d365f5a4e3137636f6d70696c65725f6275696c74696e73336d656d376d656d" - "6d6f766531376863383366393136386635323861656536455e076d656d6d6f7665" - "5f066d656d637079071201000f5f5f737461636b5f706f696e746572090a010007" - "2e726f6461746100550970726f64756365727302086c616e677561676501045275" - "7374000c70726f6365737365642d62790105727573746325312e38332e302d6e69" - "6768746c79202863326637346333663920323032342d30392d30392900490f7461" - "726765745f6665617475726573042b0a6d756c746976616c75652b0f6d75746162" - "6c652d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - -extern std::string const zkProofHex = +extern std::string const zkProofWasmHex = "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" @@ -5385,7 +3242,7 @@ extern std::string const zkProofHex = "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const sp1_wasm = +extern std::string const sp1WasmHex = "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" @@ -10757,7 +8614,7 @@ extern std::string const sp1_wasm = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -std::string const ledgerSqnHex = +std::string const ledgerSqnWasmHex = "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" "760e6765745f6c65646765725f73716e000003030201020503010002063e" "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" @@ -10778,7 +8635,7 @@ std::string const ledgerSqnHex = "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" "6d756c746976616c7565"; -std::string const allHostFunctionsHex = +std::string const allHostFunctionsWasmHex = "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" @@ -11774,32 +9631,6 @@ std::string const deepRecursionHex = "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" "2d657874"; -extern std::string const reqNonexistentField = - "0061736d0100000001120360027f7f0060047f7f7f7f017f6000017f02200108686f73745f" - "6c6962136765745f74785f6e65737465645f6669656c640001030403020000050301001006" - "19037f01418080c0000b7f00418080c0000b7f00418080c0000b072e04066d656d6f727902" - "000666696e69736800010a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0abc04035f01037f230041d0206b220124002001410c6a220241802010032001418c206a22" - "0041c400100320004189803c10022000410010022000418a803810022000418d801c100220" - "0020012802cc2020024180201000200141d0206a240041004a0b6101027f230041106b2103" - "024020002802402202413d6b41bf7f490d002003200136020c4100210103402002413f4b0d" - "01200020026a2003410c6a20016a2d00003a00002000200028024041016a22023602402001" - "41016a22014104470d000b0b0bf70201037f200141104f044002402000410020006b410371" - "22036a220220004d0d0020030440200321040340200041003a0000200041016a2100200441" - "016b22040d000b0b200341016b4107490d000340200041003a0000200041076a41003a0000" - "200041066a41003a0000200041056a41003a0000200041046a41003a0000200041036a4100" - "3a0000200041026a41003a0000200041016a41003a0000200041086a22002002470d000b0b" - "2002200120036b2201417c716a220020024b0440034020024100360200200241046a220220" - "00490d000b0b200141037121010b02402000200020016a22034f0d00200141077122020440" - "0340200041003a0000200041016a2100200241016b22020d000b0b200141016b4107490d00" - "0340200041003a0000200041076a41003a0000200041066a41003a0000200041056a41003a" - "0000200041046a41003a0000200041036a41003a0000200041026a41003a0000200041016a" - "41003a0000200041086a22002003470d000b0b0b004d0970726f64756365727302086c616e" - "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3835" - "2e31202834656231363132353020323032352d30332d31352900490f7461726765745f6665" - "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - extern std::string const hfPerfTest = "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" "6000017f021d0203656e760974726163655f6e756d000003656e76057472" @@ -11837,17 +9668,7 @@ extern std::string const hfPerfTest = "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" "6572656e63652d74797065732b0a6d756c746976616c7565"; -extern std::string const opcCallPerfTest = - "0061736d010000000112046000017e60027f7f017f6000017f6000000304" - "0303020104050170010101050401008002061c047f0141b08880040b7f00" - "41ac080b7f0041b08880040b7f01410a0b073305066d656d6f7279020004" - "6d61696e0002047465737400010a5f5f646174615f656e6403010b5f5f68" - "6561705f6261736503020a4e030400010f0b3b04017f017c017f027e4180" - "84afdf0021004494b768e11b6c9b42210141d1e3c6012102024003401000" - "200041016b220041004a0d000b0b41010f0b0b01017f1001210220020f0b" - "0b0e01004180080b07623a2025660a00"; - -extern std::string const keyletHostFunctions = +extern std::string const allKeyletsWasmHex = "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" @@ -12033,7 +9854,7 @@ extern std::string const keyletHostFunctions = "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" "5"; -extern std::string const codecovWasm = +extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" @@ -12263,7 +10084,7 @@ extern std::string const codecovWasm = "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" "746976616c7565"; -extern std::string const floatHex = +extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index f3fdf66aaef..0e7e3785ea8 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -23,45 +23,29 @@ #include -extern std::string const ledgerSqnHex; +extern std::string const ledgerSqnWasmHex; -extern std::string const allHostFunctionsHex; +extern std::string const allHostFunctionsWasmHex; extern std::string const deepRecursionHex; -extern std::string const tx_js; +extern std::string const fibWasmHex; -extern std::string const lo_js; +extern std::string const b58WasmHex; -extern std::string const lo_js2; +extern std::string const sha512PureWasmHex; -extern std::string const fib32Hex; +extern std::string const zkProofWasmHex; -extern std::string const fib64Hex; - -extern std::string const b58Hex; - -extern std::string const sha512PureHex; - -extern std::string const checkJsonHex; - -extern std::string const compareJsonHex; - -extern std::string const zkProofHex; - -extern std::string const sp1_wasm; - -extern std::string const reqNonexistentField; +extern std::string const sp1WasmHex; extern std::string const hfPerfTest; -extern std::string const opcCallPerfTest; - -extern std::string const keyletHostFunctions; +extern std::string const allKeyletsWasmHex; -extern std::string const codecovWasm; +extern std::string const codecovTestsWasmHex; -extern std::string const floatHex; +extern std::string const floatTestsWasmHex; extern std::string const float0Hex; diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock new file mode 100644 index 00000000000..972bf3ce61e --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "float_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml new file mode 100644 index 00000000000..b4dec2aa504 --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "float_tests" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/float_tests/src/lib.rs b/src/test/app/wasm_fixtures/float_tests/src/lib.rs new file mode 100644 index 00000000000..9688ebd6029 --- /dev/null +++ b/src/test/app/wasm_fixtures/float_tests/src/lib.rs @@ -0,0 +1,460 @@ +#![allow(unused_imports)] +#![allow(unused_variables)] +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_std::core::locator::Locator; +use xrpl_std::decode_hex_32; +use xrpl_std::host::trace::DataRepr::AsHex; +use xrpl_std::host::trace::{trace, trace_data, trace_float, trace_num, DataRepr}; +use xrpl_std::host::{ + cache_ledger_obj, float_add, float_compare, float_divide, float_from_int, float_from_uint, + float_log, float_multiply, float_pow, float_root, float_set, float_subtract, + get_ledger_obj_array_len, get_ledger_obj_field, get_ledger_obj_nested_field, + trace_opaque_float, FLOAT_NEGATIVE_ONE, FLOAT_ONE, FLOAT_ROUNDING_MODES_TO_NEAREST, +}; +use xrpl_std::sfield; +use xrpl_std::sfield::{ + Account, AccountTxnID, Balance, Domain, EmailHash, Flags, LedgerEntryType, MessageKey, + OwnerCount, PreviousTxnID, PreviousTxnLgrSeq, RegularKey, Sequence, TicketCount, TransferRate, +}; + +fn test_float_from_wasm() { + let _ = trace("\n$$$ test_float_from_wasm $$$"); + + let mut f: [u8; 8] = [0u8; 8]; + if 8 == unsafe { float_from_int(12300, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from i64 12300:", &f); + let _ = trace_data(" float from i64 12300 as HEX:", &f, AsHex); + } else { + let _ = trace(" float from i64 12300: failed"); + } + + let u64_value: u64 = 12300; + if 8 == unsafe { + float_from_uint( + &u64_value as *const u64 as *const u8, + 8, + f.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + } { + let _ = trace_float(" float from u64 12300:", &f); + } else { + let _ = trace(" float from u64 12300: failed"); + } + + if 8 == unsafe { float_set(2, 123, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from exp 2, mantissa 123:", &f); + } else { + let _ = trace(" float from exp 2, mantissa 3: failed"); + } + + let _ = trace_float(" float from const 1:", &FLOAT_ONE); + let _ = trace_float(" float from const -1:", &FLOAT_NEGATIVE_ONE); +} + +fn test_float_compare() { + let _ = trace("\n$$$ test_float_compare $$$"); + + let mut f1: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(1, f1.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace(" float from 1: failed"); + } else { + let _ = trace_float(" float from 1:", &f1); + } + + if 0 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 == FLOAT_ONE"); + } else { + let _ = trace(" float from 1 != FLOAT_ONE"); + } + + if 1 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 > FLOAT_NEGATIVE_ONE"); + } else { + let _ = trace(" float from 1 !> FLOAT_NEGATIVE_ONE"); + } + + if 2 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f1.as_ptr(), 8) } { + let _ = trace(" FLOAT_NEGATIVE_ONE < float from 1"); + } else { + let _ = trace(" FLOAT_NEGATIVE_ONE !< float from 1"); + } +} + +fn test_float_add_subtract() { + let _ = trace("\n$$$ test_float_add_subtract $$$"); + + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..9 { + unsafe { + float_add( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f10: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + // let _ = trace(" float from 10: failed"); + } + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated add: good"); + } else { + let _ = trace(" repeated add: bad"); + } + + for i in 0..11 { + unsafe { + float_subtract( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" repeated subtract: good"); + } else { + let _ = trace(" repeated subtract: bad"); + } +} + +fn test_float_multiply_divide() { + let _ = trace("\n$$$ test_float_multiply_divide $$$"); + + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..6 { + unsafe { + float_multiply( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + if 0 == unsafe { float_compare(f1000000.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated multiply: good"); + } else { + let _ = trace(" repeated multiply: bad"); + } + + for i in 0..7 { + unsafe { + float_divide( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + let mut f01: [u8; 8] = [0u8; 8]; + unsafe { float_set(-1, 1, f01.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, f01.as_ptr(), 8) } { + let _ = trace(" repeated divide: good"); + } else { + let _ = trace(" repeated divide: bad"); + } +} + +fn test_float_pow() { + let _ = trace("\n$$$ test_float_pow $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_pow( + FLOAT_ONE.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cube of 1:", &f_compute); + + unsafe { + float_pow( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th power of -1:", &f_compute); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 9:", &f_compute); + + unsafe { + float_pow( + f9.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 0th power of 9:", &f_compute); + + let mut f0: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(0, f0.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f0.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 0:", &f_compute); + + let r = unsafe { + float_pow( + f0.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_num( + " float 0th power of 0 (expecting INVALID_PARAMS error):", + r as i64, + ); +} + +fn test_float_root() { + let _ = trace("\n$$$ test_float_root $$$"); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_root( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float sqrt of 9:", &f_compute); + unsafe { + float_root( + f9.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 9:", &f_compute); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 1000000:", &f_compute); + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th root of 1000000:", &f_compute); +} + +fn test_float_log() { + let _ = trace("\n$$$ test_float_log $$$"); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_log( + f1000000.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" log_10 of 1000000:", &f_compute); +} + +fn test_float_negate() { + let _ = trace("\n$$$ test_float_negate $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_multiply( + FLOAT_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const 1: good"); + } else { + let _ = trace(" negate const 1: bad"); + } + + unsafe { + float_multiply( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const -1: good"); + } else { + let _ = trace(" negate const -1: bad"); + } +} + +fn test_float_invert() { + let _ = trace("\n$$$ test_float_invert $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert a float from 10:", &f_compute); + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert again:", &f_compute); + + // if f10's value is 7, then invert twice won't match the original value + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" invert twice: good"); + } else { + let _ = trace(" invert twice: bad"); + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + test_float_from_wasm(); + test_float_compare(); + test_float_add_subtract(); + test_float_multiply_divide(); + test_float_pow(); + test_float_root(); + test_float_log(); + test_float_negate(); + test_float_invert(); + + 1 +} diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c new file mode 100644 index 00000000000..66ed1d42c7d --- /dev/null +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -0,0 +1,27 @@ +#include + +int32_t +get_ledger_sqn(uint8_t*, int32_t); +// int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +// int32_t trace_num(uint8_t const*, int32_t, int64_t); + +uint8_t buf[1024]; + +// char const test_res[] = "sqn: "; +// char const test_name[] = "TEST get_ledger_sqn"; + +int +finish() +{ + // trace((uint8_t const *)test_name, sizeof(test_name) - 1, 0, 0, 0); + + // memset(buf, 0, sizeof(buf)); + // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; + + int x = get_ledger_sqn(buf, sizeof(int32_t)); + if (x >= 0) + x = *((int32_t*)buf); + // trace_num((uint8_t const *)test_res, sizeof(test_res) - 1, x); + + return x < 0 ? x : (x >= 5 ? 1 : 0); +} diff --git a/src/test/app/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c new file mode 100644 index 00000000000..fe82aa2a659 --- /dev/null +++ b/src/test/app/wasm_fixtures/sha512Pure.c @@ -0,0 +1,145 @@ +#include +#include + +static uint64_t const K512[] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, + 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, + 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, + 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, + 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, + 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, + 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, + 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, + 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, + 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, + 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, + 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, + 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, + 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, + 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, + 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, + 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; + +#define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) +#define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) +#define Sigma1(x) (ROTATE((x), 14) ^ ROTATE((x), 18) ^ ROTATE((x), 41)) +#define sigma0(x) (ROTATE((x), 1) ^ ROTATE((x), 8) ^ ((x) >> 7)) +#define sigma1(x) (ROTATE((x), 19) ^ ROTATE((x), 61) ^ ((x) >> 6)) + +#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +static inline uint64_t +B2U64(uint8_t val, uint8_t sh) +{ + return ((uint64_t)val) << sh; +} + +void* +allocate(int sz) +{ + return malloc(sz); +} +void +deallocate(void* p) +{ + free(p); +} + +uint8_t e_data[32 * 1024]; + +uint8_t* +sha512_process(uint8_t const* data, int32_t length) +{ + static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + + uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; + uint64_t X[16]; + + uint64_t blocks = length / 128; + while (blocks--) + { + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + unsigned i; + for (i = 0; i < 16; i++) + { + X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | + B2U64(data[2], 40) | B2U64(data[3], 32) | B2U64(data[4], 24) | + B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); + data += 8; + + T1 = h; + T1 += Sigma1(e); + T1 += Ch(e, f, g); + T1 += K512[i]; + T1 += X[i]; + + T2 = Sigma0(a); + T2 += Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + for (i = 16; i < 80; i++) + { + s0 = X[(i + 1) & 0x0f]; + s0 = sigma0(s0); + s1 = X[(i + 14) & 0x0f]; + s1 = sigma1(s1); + + T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; + T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; + T2 = Sigma0(a) + Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + } + + return (uint8_t*)(state); +} + +// int main () +//{ +// return 0; +// } diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.lock b/src/test/app/wasm_fixtures/sp1/Cargo.lock new file mode 100644 index 00000000000..4374624cd2c --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/Cargo.lock @@ -0,0 +1,1384 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools", + "num-bigint", + "num-traits", + "p3-util", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sp1" +version = "0.0.1" +dependencies = [ + "sp1-verifier", +] + +[[package]] +name = "sp1-build" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05372b4e3eecca255ba8e385f8dc294861a3b4ea0b0a9946873e39941011db4c" +dependencies = [ + "anyhow", + "cargo_metadata", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "sp1-lib" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e166e94b13146c65de433cf29acc1030f021414fbebfc24cd4eeaeb787ba3443" +dependencies = [ + "bincode", + "elliptic-curve", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a85ffe9606bd2cc93575ce608f063ca08521cee9bdebf611914c5b2d90d7412" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-verifier" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d94a7db4a54984acf4d64c6ba55c4698104f02ef213cc21882e233b4409e7155" +dependencies = [ + "blake3", + "cfg-if", + "hex", + "lazy_static", + "sha2", + "sp1-build", + "substrate-bn-succinct", + "thiserror 2.0.12", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "substrate-bn-succinct" +version = "0.6.0-v4.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ac8ce0a40e721f790e2ef99beab32b99b3121c58edaaa140ffd8f1795a6af7" +dependencies = [ + "bytemuck", + "byteorder", + "cfg-if", + "crunchy", + "lazy_static", + "num-bigint", + "rand", + "rustc-hex", + "sp1-lib", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.toml b/src/test/app/wasm_fixtures/sp1/Cargo.toml new file mode 100644 index 00000000000..d730160aeaa --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/Cargo.toml @@ -0,0 +1,16 @@ +[package] +edition = "2021" +name = "sp1" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +sp1-verifier = "4.1.3" + +[profile.release] +opt-level = 3 # "z" for size or "3" for speed +lto = true # Link Time Optimization +codegen-units = 1 # Single unit = better optimization +panic = "abort" # Smaller binary, faster execution diff --git a/src/test/app/wasm_fixtures/sp1/src/lib.rs b/src/test/app/wasm_fixtures/sp1/src/lib.rs new file mode 100644 index 00000000000..f918e4f42df --- /dev/null +++ b/src/test/app/wasm_fixtures/sp1/src/lib.rs @@ -0,0 +1,37 @@ +use sp1_verifier::Groth16Verifier; + +#[no_mangle] +pub fn sp1_groth16_verifier() -> bool { + let groth16_vk = *sp1_verifier::GROTH16_VK_BYTES; + + let proof: Vec = vec![ + 17, 182, 160, 157, 31, 189, 116, 200, 17, 224, 230, 34, 195, 108, 230, 185, 62, 91, 181, + 212, 80, 111, 197, 89, 247, 206, 99, 206, 147, 13, 216, 101, 252, 192, 149, 2, 40, 4, 249, + 44, 97, 227, 127, 36, 244, 18, 27, 75, 248, 3, 45, 11, 103, 45, 183, 204, 61, 217, 19, 208, + 66, 73, 202, 108, 136, 162, 221, 184, 6, 189, 49, 196, 104, 128, 151, 21, 104, 109, 145, + 150, 243, 51, 27, 243, 203, 75, 176, 59, 193, 51, 177, 64, 83, 13, 133, 140, 248, 242, 13, + 24, 12, 103, 126, 112, 244, 181, 129, 246, 52, 110, 134, 57, 149, 23, 163, 43, 202, 7, 164, + 233, 179, 160, 16, 5, 22, 45, 129, 76, 183, 76, 150, 139, 27, 224, 191, 59, 47, 105, 71, + 47, 8, 176, 157, 159, 234, 253, 239, 131, 138, 120, 101, 4, 98, 236, 106, 235, 98, 76, 93, + 220, 174, 153, 58, 216, 28, 141, 129, 191, 188, 40, 184, 225, 22, 61, 75, 139, 159, 162, + 117, 83, 214, 239, 1, 246, 236, 255, 64, 228, 116, 107, 206, 23, 59, 3, 221, 95, 14, 170, + 28, 171, 36, 179, 75, 101, 177, 40, 198, 12, 193, 82, 105, 155, 177, 62, 158, 72, 209, 252, + 51, 169, 109, 32, 121, 179, 194, 73, 164, 14, 8, 206, 181, 9, 5, 38, 74, 136, 97, 0, 89, + 80, 75, 88, 228, 94, 46, 196, 199, 83, 229, 11, 103, 115, 25, 31, 215, 137, 65, 159, 95, + 192, + ]; + + let sp1_public_values = vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, + ]; + + let sp1_vkey_hash: String = + "0x00aea8e9c83c73d74036923de1b4a66d18547d58eee4eacfee70235ed291954c".to_string(); + + let _ = Groth16Verifier::verify(&proof, &sp1_public_values, &sp1_vkey_hash, groth16_vk); + + true +} diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.lock b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock new file mode 100644 index 00000000000..f042837723f --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock @@ -0,0 +1,106 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zk_proof" +version = "0.0.1" +dependencies = [ + "bls12_381", + "group", +] diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.toml b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml new file mode 100644 index 00000000000..3e556d43176 --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml @@ -0,0 +1,19 @@ +[package] +edition = "2021" +name = "zk_proof" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# bellman = "=0.14.0" +bls12_381 = "=0.8.0" +group = "0.13.0" + +[profile.release] +# opt-level = 3 # Optimize for time +opt-level = "z" # Optimize for size +lto = true # Enable Link Time Optimization +codegen-units = 1 +panic = "abort" # Remove unnecessary panic machinery diff --git a/src/test/app/wasm_fixtures/zk_proof/src/lib.rs b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs new file mode 100644 index 00000000000..4d44d8e3424 --- /dev/null +++ b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs @@ -0,0 +1,254 @@ +use bls12_381::multi_miller_loop; +use bls12_381::Scalar; +use bls12_381::{G1Affine, G2Affine, G2Prepared}; +use group::prime::PrimeCurveAffine; +use group::Curve; + +use std::mem; +use std::os::raw::c_void; +// use std::time::{Instant}; + +// Groth16 proof struct +pub struct Proof { + pub a: G1Affine, + pub b: G2Affine, + pub c: G1Affine, +} + +// Groth16 verification key struct +pub struct VerifyingKey { + pub alpha_g1: G1Affine, + pub beta_g1: G1Affine, + pub beta_g2: G2Affine, + pub gamma_g2: G2Affine, + pub delta_g1: G1Affine, + pub delta_g2: G2Affine, + pub ic: Vec, +} + +#[no_mangle] +pub extern "C" fn allocate(size: usize) -> *mut c_void { + let mut buffer = Vec::with_capacity(size); + let pointer = buffer.as_mut_ptr(); + mem::forget(buffer); + pointer as *mut c_void + // } +} + +#[no_mangle] +fn deserialize_g1_wasm(buffer: &mut Vec) -> G1Affine { + let d_g1 = G1Affine::from_compressed(&buffer[0..48].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g1 +} + +fn deserialize_g2_wasm(buffer: &mut Vec) -> G2Affine { + let d_g2 = G2Affine::from_compressed(&buffer[0..96].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g2 +} + +#[no_mangle] +// pub extern fn bellman_groth16_test(pointer: *mut u8, capacity: usize) -> bool { +pub extern "C" fn bellman_groth16_test() -> bool { + // let mut bytes = Vec::new(); + // unsafe { + // // println!("Test in vm {:?}", pointer); + // let v = Vec::from_raw_parts(pointer, capacity, capacity); //TODO no need to deallocate?? + // bytes.extend_from_slice(&v); + // } + + // Hardcode the input bytes for testing in different WASM VMs + // let bytes = [172, 197, 81, 189, 121, 193, 159, 27, 92, 95, 151, 164, 40, 59, 214, 96, 132, 58, 87, 37, 169, 1, 63, 230, 35, 74, 245, 6, 185, 56, 120, 108, 214, 179, 187, 21, 36, 206, 43, 160, 10, 250, 249, 73, 210, 35, 137, 87, 177, 66, 65, 154, 11, 232, 137, 246, 125, 72, 227, 222, 116, 168, 87, 24, 165, 160, 132, 109, 108, 101, 222, 143, 78, 97, 48, 95, 59, 177, 29, 247, 219, 166, 73, 249, 69, 206, 15, 151, 30, 248, 235, 63, 148, 240, 17, 22, 150, 67, 252, 141, 95, 179, 94, 111, 207, 201, 192, 144, 154, 94, 21, 2, 22, 58, 96, 144, 227, 107, 107, 182, 142, 0, 57, 27, 168, 39, 226, 40, 163, 159, 112, 83, 196, 182, 215, 74, 92, 20, 158, 60, 23, 184, 198, 143, 17, 6, 242, 7, 75, 220, 87, 47, 224, 145, 99, 169, 203, 218, 112, 185, 51, 102, 59, 56, 171, 46, 49, 255, 116, 108, 241, 50, 180, 247, 62, 218, 181, 197, 155, 80, 61, 252, 8, 41, 232, 73, 51, 250, 223, 82, 94, 8, 185, 83, 223, 187, 6, 41, 20, 62, 189, 254, 11, 11, 58, 187, 200, 88, 53, 234, 98, 172, 213, 62, 22, 34, 90, 166, 182, 133, 8, 230, 103, 219, 233, 141, 10, 137, 210, 151, 4, 129, 29, 92, 103, 251, 72, 182, 162, 59, 20, 222, 188, 232, 13, 74, 214, 182, 172, 120, 33, 198, 57, 204, 134, 93, 26, 79, 213, 45, 146, 6, 128, 103, 63, 202, 226, 120, 141, 193, 248, 65, 196, 235, 21, 184, 104, 228, 206, 117, 190, 28, 153, 183, 68, 36, 63, 60, 131, 87, 137, 213, 105, 27, 110, 37, 238, 200, 250, 145, 76, 25, 57, 81, 69, 164, 208, 255, 49, 80, 14, 64, 181, 143, 12, 58, 35, 63, 199, 35, 70, 25, 86, 158, 210, 150, 59, 159, 253, 238, 174, 211, 142, 166, 223, 51, 134, 118, 171, 27, 218, 219, 117, 163, 71, 134, 95, 142, 83, 251, 240, 241, 162, 232, 93, 248, 167, 112, 197, 212, 169, 209, 159, 101, 140, 248, 222, 234, 201, 169, 76, 242, 7, 10, 192, 30, 151, 167, 74, 186, 97, 121, 144, 36, 6, 187, 92, 7, 248, 45, 134, 85, 240, 112, 74, 224, 70, 64, 198, 59, 26, 195, 192, 140, 101, 118, 175, 17, 160, 195, 142, 133, 1, 139, 5, 130, 245, 17, 73, 176, 232, 107, 130, 172, 110, 20, 190, 37, 108, 250, 178, 187, 151, 158, 35, 248, 246, 143, 38, 212, 133, 226, 24, 45, 33, 164, 46, 125, 200, 157, 253, 225, 132, 181, 60, 90, 7, 240, 80, 232, 97, 206, 164, 28, 12, 75, 68, 126, 230, 145, 216, 45, 180, 203, 19, 152, 29, 203, 9, 4, 145, 122, 206, 146, 179, 44, 145, 191, 126, 199, 175, 171, 127, 189, 222, 108, 126, 161, 80, 190, 47, 44, 8, 40, 65, 68, 95, 61, 109, 148, 175, 113, 226, 8, 93, 126, 53, 39, 192, 196, 6, 152, 194, 105, 169, 226, 192, 201, 184, 198, 134, 210, 153, 170, 12, 241, 90, 250, 233, 20, 152, 119, 142, 120, 83, 2, 164, 80, 178, 125, 227, 253, 207, 240, 201, 127, 213, 196, 100, 90, 65, 120, 50, 108, 175, 34, 192, 197, 173, 202, 176, 210, 131, 22, 216, 57, 169, 241, 28, 40, 44, 62, 11, 42, 50, 46, 204, 242, 109, 158, 114, 41, 127, 206, 25, 194, 255, 128, 245, 232, 193, 189, 229, 51, 93, 94, 64, 117, 33, 132, 75, 253, 114, 64, 116, 155, 183, 137, 112, 201, 243, 13, 221, 142, 164, 59, 98, 152, 249, 40, 133, 70, 185, 231, 249, 151, 253, 240, 122, 214, 60, 18, 132, 177, 37, 42, 75, 206, 12, 100, 214, 248, 234, 78, 165, 74, 212, 248, 32, 162, 254, 227, 218, 46, 9, 87, 0, 118, 13, 249, 107, 83, 5, 138, 223, 9, 247, 70, 160, 228, 197, 54, 87, 18, 1, 37, 199, 162, 84, 189, 161, 10, 26, 75, 45, 168, 185, 153, 245, 243, 51, 176, 208, 187, 235, 135, 239, 231, 42, 43, 233, 150, 46, 249, 73, 229, 138, 84, 89, 75, 129, 238, 211, 80, 147, 67, 159, 227, 214, 131, 188, 130, 70, 224, 1, 77, 139, 239, 185, 53, 68, 41, 193, 207, 16, 2, 33, 139, 214, 103, 240, 14, 141, 223, 24, 236, 50, 64, 79, 178, 6, 79, 38, 165, 35, 173, 203, 101, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + let bytes = [ + 147, 235, 138, 182, 249, 146, 149, 28, 58, 36, 144, 99, 188, 155, 153, 135, 239, 79, 76, + 109, 152, 156, 202, 1, 153, 84, 239, 184, 69, 145, 133, 48, 156, 80, 122, 227, 231, 161, + 137, 232, 67, 183, 34, 186, 230, 135, 25, 90, 136, 201, 110, 134, 208, 93, 78, 82, 153, + 239, 208, 236, 160, 231, 192, 150, 215, 128, 193, 255, 107, 39, 133, 12, 136, 148, 119, 17, + 59, 198, 100, 49, 37, 89, 132, 205, 45, 79, 151, 112, 247, 140, 94, 179, 215, 165, 52, 182, + 153, 68, 204, 210, 218, 156, 69, 74, 192, 30, 160, 13, 80, 188, 23, 112, 21, 124, 91, 147, + 21, 140, 217, 226, 248, 60, 182, 119, 18, 34, 32, 41, 181, 128, 165, 97, 168, 76, 98, 44, + 114, 122, 128, 215, 68, 156, 18, 91, 5, 33, 22, 141, 249, 137, 49, 252, 82, 122, 206, 58, + 183, 108, 176, 15, 38, 183, 87, 254, 34, 102, 195, 78, 166, 227, 96, 180, 137, 173, 131, + 178, 179, 25, 89, 159, 5, 73, 125, 24, 25, 86, 227, 19, 184, 117, 228, 173, 150, 1, 82, + 142, 48, 251, 236, 132, 73, 79, 201, 165, 192, 191, 195, 60, 100, 198, 251, 187, 161, 220, + 63, 143, 38, 21, 189, 219, 194, 100, 64, 186, 102, 7, 186, 213, 227, 92, 228, 52, 181, 171, + 223, 222, 218, 206, 221, 22, 15, 46, 77, 175, 34, 43, 221, 110, 21, 89, 149, 213, 68, 242, + 140, 185, 176, 73, 88, 216, 75, 237, 209, 10, 75, 251, 152, 101, 15, 146, 168, 27, 81, 8, + 61, 76, 103, 230, 171, 23, 144, 171, 6, 118, 157, 233, 234, 214, 132, 106, 30, 171, 121, + 77, 147, 175, 170, 62, 48, 251, 12, 221, 202, 109, 80, 97, 180, 27, 45, 87, 162, 19, 168, + 152, 27, 205, 113, 91, 83, 52, 99, 109, 17, 149, 189, 244, 174, 164, 192, 79, 133, 111, + 195, 215, 232, 129, 166, 204, 3, 169, 248, 49, 18, 190, 198, 145, 177, 169, 10, 4, 66, 134, + 46, 11, 163, 170, 94, 230, 234, 234, 43, 122, 51, 230, 100, 106, 149, 228, 208, 217, 87, + 231, 125, 170, 47, 143, 151, 45, 208, 64, 91, 10, 188, 136, 15, 155, 131, 200, 141, 243, + 200, 5, 109, 22, 98, 189, 193, 44, 40, 95, 126, 145, 234, 190, 205, 179, 172, 224, 147, + 253, 238, 162, 157, 60, 126, 9, 174, 34, 16, 161, 197, 60, 243, 211, 241, 78, 114, 51, 167, + 214, 53, 149, 172, 56, 149, 32, 66, 123, 48, 240, 179, 53, 154, 29, 134, 34, 141, 204, 168, + 184, 158, 165, 115, 241, 119, 228, 11, 35, 82, 186, 132, 103, 65, 243, 215, 31, 105, 201, + 191, 155, 210, 53, 194, 76, 63, 199, 181, 28, 138, 181, 181, 211, 145, 15, 139, 244, 38, + 56, 159, 161, 95, 46, 147, 141, 163, 221, 88, 167, 134, 73, 45, 70, 98, 98, 167, 55, 52, + 234, 110, 150, 79, 248, 157, 167, 84, 210, 89, 10, 193, 169, 32, 40, 218, 7, 236, 206, 85, + 178, 174, 157, 132, 181, 192, 119, 60, 205, 46, 217, 120, 97, 59, 82, 121, 11, 189, 21, + 213, 176, 255, 225, 57, 76, 239, 38, 99, 226, 55, 98, 227, 10, 45, 193, 69, 255, 247, 39, + 121, 86, 150, 6, 220, 98, 41, 132, 237, 189, 169, 110, 213, 115, 33, 228, 197, 61, 219, + 202, 58, 54, 70, 223, 179, 208, 139, 232, 103, 76, 165, 169, 68, 6, 148, 47, 244, 26, 203, + 186, 110, 69, 44, 175, 128, 119, 212, 188, 167, 223, 87, 119, 238, 199, 201, 61, 78, 96, + 175, 0, 156, 145, 196, 253, 162, 175, 172, 227, 80, 251, 96, 61, 189, 35, 13, 97, 22, 157, + 86, 249, 128, 148, 172, 66, 80, 172, 208, 222, 131, 0, 207, 80, 163, 27, 155, 113, 57, 186, + 246, 139, 111, 71, 117, 152, 184, 60, 1, 230, 44, 169, 213, 88, 82, 156, 194, 234, 41, 183, + 87, 36, 175, 154, 156, 128, 59, 187, 208, 101, 9, 51, 205, 42, 174, 29, 215, 43, 150, 183, + 129, 125, 2, 84, 210, 149, 245, 126, 140, 166, 255, 134, 116, 162, 107, 82, 178, 158, 38, + 11, 135, 91, 224, 157, 112, 189, 164, 250, 1, 215, 49, 21, 214, 211, 73, 243, 251, 58, 198, + 1, 165, 196, 122, 13, 238, 252, 227, 229, 149, 47, 13, 173, 171, 176, 185, 220, 82, 96, + 163, 4, 36, 199, 152, 88, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, + 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + // ***** Test deserialization and reconstruction of vk ***** + // let start_key_recons = Instant::now(); + // println!("Start verification key reconstruction"); + + // alpha_g1 + let mut vec_alpha_g1 = bytes[0..48].to_vec(); + let r_alpha_g1 = deserialize_g1_wasm(&mut vec_alpha_g1); + + // beta_g1 + let mut vec_beta_g1 = bytes[48..96].to_vec(); + let r_beta_g1 = deserialize_g1_wasm(&mut vec_beta_g1); + + // beta_g2 + let mut vec_beta_g2 = bytes[96..192].to_vec(); + let r_beta_g2 = deserialize_g2_wasm(&mut vec_beta_g2); + + // gamma_g2 + let mut vec_gamma_g2 = bytes[192..288].to_vec(); + let r_gamma_g2 = deserialize_g2_wasm(&mut vec_gamma_g2); + + // delta_g1 + let mut vec_delta_g1 = bytes[288..336].to_vec(); + let r_delta_g1 = deserialize_g1_wasm(&mut vec_delta_g1); + + // delta_g2 + let mut vec_delta_g2 = bytes[336..432].to_vec(); + let r_delta_g2 = deserialize_g2_wasm(&mut vec_delta_g2); + + // ic + let vec_ic = bytes[432..576].to_vec(); + // println!("\nic vector: {:?}", vec_ic); + let mut r_ic: Vec = Vec::new(); + let mut vec_ic_de = vec_ic[0..48].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[48..96].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[96..144].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + + // Reconstruct vk + // replace following if using bellman::{groth16, groth16::Proof}; + // let deserialized_vk = groth16::VerifyingKey:: { + let deserialized_vk = VerifyingKey { + alpha_g1: r_alpha_g1, + beta_g1: r_beta_g1, + beta_g2: r_beta_g2, + gamma_g2: r_gamma_g2, + delta_g1: r_delta_g1, + delta_g2: r_delta_g2, + ic: r_ic, + }; + + // Uncomment following if using bellman::{groth16, groth16::Proof}; + // let pvk = groth16::prepare_verifying_key(&deserialized_vk); + // println!("Key reconstruction time: {:?}", start_key_recons.elapsed()); + + // ***** Reconstruct proof ***** + // let start_proof_recons = Instant::now(); + + // proof.g1 + let r_a = G1Affine::from_compressed(&bytes[576..624].try_into().unwrap()) + .expect("Failed to deserialize a"); + // proof.g2 + let r_b = G2Affine::from_compressed(&bytes[624..720].try_into().unwrap()) + .expect("Failed to deserialize b"); + // proof.g1 + let r_c = G1Affine::from_compressed(&bytes[720..768].try_into().unwrap()) + .expect("Failed to deserialize c"); + + // Replace following if using bellman::{groth16, groth16::Proof}; + // let r_proof: Proof = Proof{a: r_a, b: r_b, c: r_c}; + let r_proof: Proof = Proof { + a: r_a, + b: r_b, + c: r_c, + }; + // println!("Proof reconstruction time: {:?}", start_proof_recons.elapsed()); + + // ***** Reconstruct input ***** + // let start_input_recons = Instant::now(); + + let last_64_bytes = &bytes[bytes.len() - 64..]; + + let r_inputs: Vec = last_64_bytes + .chunks(32) // Each Scalar in bls12_381 uses 32 bytes + .map(|chunk| { + Scalar::from_bytes(chunk.try_into().unwrap()).expect("Invalid bytes for Scalar") + }) + .collect(); + + // println!("Input reconstruction time: {:?}", start_input_recons.elapsed()); + + /***** proof verification *****/ + // uncomment following if bellman groth16 is used + // assert!(groth16::verify_proof(&pvk, &r_proof, &r_inputs).is_ok()); + // let start_verify = Instant::now(); + + // Ensure the number of inputs matches the vk.ic length minus 1 (for IC[0]) + if (r_inputs.len() + 1) != deserialized_vk.ic.len() { + return false; + } + + /***** Compute linear combination: input_acc = IC[0] + sum(input[i] * IC[i+1]) *****/ + let mut acc = deserialized_vk.ic[0].to_curve(); // Convert G1Affine to G1Projective + + // Computes multi-scalar multiplication, + // which is a weighted sum of elliptic curve points. + // In Groth16, this builds the point: + // acc = IC₀ + input₁ × IC₁ + input₂ × IC₂ + ... + inputₙ × ICₙ + // Where: ICᵢ are fixed elliptic curve points (from the verifying key). + // inputᵢ are the public inputs to the circuit. + // Example: public_inputs = [x₁, x₂], vk.ic = [IC₀, IC₁, IC₂], acc = IC₀ + x₁ * IC₁ + x₂ * IC₂ + // This binds the public inputs to the proof + for (input, ic_point) in r_inputs.iter().zip(&deserialized_vk.ic[1..]) { + acc += ic_point.to_curve() * input; + } + + let acc_affine = acc.to_affine(); // converts the point acc from projective form back to affine form. + + // Preparing G2 elements for pairing by converting them into G2Prepared format. + let proof_b_prepared = G2Prepared::from(r_proof.b); + let gamma_g2_prepared = G2Prepared::from(deserialized_vk.gamma_g2); + let delta_g2_prepared = G2Prepared::from(deserialized_vk.delta_g2); + let beta_g2_prepared = G2Prepared::from(deserialized_vk.beta_g2); + + // Compute required product of pairings in their Miller loop form + // Groth16 verifier checks if e(A, B) * e(acc, γ)⁻¹ * e(C, δ)⁻¹ * e(α, β)⁻¹ == 1 + // which boils down to + // let start_miller = Instant::now(); + let ml_result = multi_miller_loop(&[ + (&r_proof.a, &proof_b_prepared), // e(A,B) + (&(-acc_affine), &gamma_g2_prepared), // e(acc, γ)⁻¹ + (&(-r_proof.c), &delta_g2_prepared), // e(C, δ)⁻¹ + (&(-deserialized_vk.alpha_g1), &beta_g2_prepared), //e(α, β)⁻¹ + ]); + // println!("Miller time: {:?}", start_miller.elapsed()); + + // let start_final = Instant::now(); + let result = ml_result.final_exponentiation(); + // println!("Final time: {:?}", start_final.elapsed()); + // println!("Proof verification time: {:?}", start_verify.elapsed()); + + // true + result == bls12_381::Gt::identity() +} diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index d7cf9aa78da..413240559b8 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -131,7 +131,7 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else - auto j = jlog.error(); + auto j = jlog.warn(); #endif wasm_byte_vec_t error_message WASM_EMPTY_VEC; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 335d406254f..6ea15f42abf 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -58,7 +58,6 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); From dd30d811e61eb57168642c1a1a4728129b4045b4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 15 Aug 2025 16:51:30 -0400 Subject: [PATCH 056/212] feat: last set of host functions (#5674) --- src/test/app/Escrow_test.cpp | 26 +- src/test/app/HostFuncImpl_test.cpp | 270 ++++-- src/test/app/TestHostFunctions.h | 41 + src/test/app/Wasm_test.cpp | 16 +- .../app/wasm_fixtures/all_keylets/Cargo.lock | 2 +- .../app/wasm_fixtures/all_keylets/src/lib.rs | 67 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 2 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 1 - .../codecov_tests/src/host_bindings_loose.rs | 9 + .../wasm_fixtures/codecov_tests/src/lib.rs | 293 +++++- src/test/app/wasm_fixtures/fixtures.cpp | 880 ++++++++++-------- src/xrpld/app/wasm/HostFunc.h | 43 + src/xrpld/app/wasm/HostFuncImpl.h | 23 + src/xrpld/app/wasm/HostFuncWrapper.h | 66 ++ src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 99 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 267 +++++- src/xrpld/app/wasm/detail/WasmVM.cpp | 12 + 17 files changed, 1600 insertions(+), 517 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index c74b98e8c7c..a6861a252c6 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2347,6 +2347,7 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); // set up a bunch of objects to check their keylets + AMM amm(env, carol, XRP(10), carol["USD"](1000)); env(check::create(alice, carol, XRP(100))); env(credentials::create(alice, alice, "termsandconditions")); env(delegate::set(alice, carol, {"TrustSet"})); @@ -2354,17 +2355,26 @@ struct Escrow_test : public beast::unit_test::suite env(did::set(alice), did::data("alice_did")); env(escrow::create(alice, carol, XRP(100)), escrow::finish_time(env.now() + 100s)); + MPTTester mptTester{env, alice, {.fund = false}}; + mptTester.create(); + mptTester.authorize({.account = carol}); env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); - env(offer(alice, carol["USD"](0.1), XRP(100))); + env(offer(alice, carol["GBP"](0.1), XRP(100))); env(create(alice, carol, XRP(1000), 100s, alice.pk())); + pdomain::Credentials credentials{{alice, "first credential"}}; + env(pdomain::setTx(alice, credentials)); env(signers(alice, 1, {{carol, 1}})); env(ticket::create(alice, 1)); + Vault vault{env}; + auto [tx, _keylet] = + vault.create({.owner = alice, .asset = xrpIssue()}); + env(tx); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); if (BEAST_EXPECTS( - env.seq(alice) == 17, std::to_string(env.seq(alice)))) + env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); XRPAmount txnFees = env.current()->fees().base + 1000; @@ -2377,7 +2387,7 @@ struct Escrow_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 99'596; + auto const allowance = 137'596; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), @@ -2386,8 +2396,12 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 12); + { + auto const gasUsed = txMeta->getFieldU32(sfGasUsed); + BEAST_EXPECTS( + gasUsed == allowance, std::to_string(gasUsed)); + } + BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); } } } diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index dea7ce4d510..38d1cd0237a 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -24,6 +24,12 @@ namespace ripple { namespace test { +static Bytes +toBytes(std::uint8_t value) +{ + return {value}; +} + static Bytes toBytes(std::uint16_t value) { @@ -201,6 +207,31 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.getBaseFee(); if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); + + { + Env env2( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.reference_fee = + static_cast( + std::numeric_limits::max()) + + 1; + return cfg; + }), + testable_amendments()); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + OpenView ov2{*env2.current()}; + ApplyContext ac2 = createApplyContext(env2, ov2); + WasmHostFunctionsImpl hfs2(ac2, dummyEscrow); + auto const result2 = hfs2.getBaseFee(); + if (BEAST_EXPECT(!result2.has_value())) + BEAST_EXPECT(result2.error() == HostFunctionError::INTERNAL); + } } void @@ -402,6 +433,23 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(*asset2 == toBytes(Asset(mptId))); } } + + { + std::uint8_t const expectedScale = 8; + STTx const stx2 = STTx(ttMPTOKEN_ISSUANCE_CREATE, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldU8(sfAssetScale, expectedScale); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const actualScale = hfs.getTxField(sfAssetScale); + if (BEAST_EXPECT(actualScale.has_value())) + { + BEAST_EXPECT( + std::ranges::equal(*actualScale, toBytes(expectedScale))); + } + } } void @@ -1442,31 +1490,38 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ } \ } -#define COMPARE_KEYLET_FAIL(hfsFunc, keyletFunc, expected, ...) \ - { \ - auto actual = hfs.hfsFunc(__VA_ARGS__); \ - if (BEAST_EXPECT(!actual.has_value())) \ - { \ - BEAST_EXPECTS( \ - actual.error() == expected, \ - std::to_string(HfErrorToInt(actual.error()))); \ - } \ +#define COMPARE_KEYLET_FAIL(hfsFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(HfErrorToInt(actual.error()))); \ + } \ } - // accountKeylet COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); COMPARE_KEYLET_FAIL( - accountKeylet, - keylet::account, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); + accountKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET( + ammKeylet, keylet::amm, xrpIssue(), env.master["USD"].issue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + xrpIssue(), + xrpIssue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + makeMptID(1, env.master.id()), + xrpIssue()); + COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); COMPARE_KEYLET_FAIL( - checkKeylet, - keylet::check, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + checkKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + std::string const credType = "test"; COMPARE_KEYLET( credentialKeylet, @@ -1482,21 +1537,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite static_assert(longCredType.size() > maxCredentialTypeLength); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_PARAMS, env.master.id(), alice.id(), Slice(longCredType.data(), longCredType.size())); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), alice.id(), Slice(credType.data(), credType.size())); COMPARE_KEYLET_FAIL( credentialKeylet, - keylet::credential, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), @@ -1504,27 +1556,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); COMPARE_KEYLET_FAIL( - didKeylet, - keylet::did, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); + didKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + COMPARE_KEYLET( delegateKeylet, keylet::delegate, env.master.id(), alice.id()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); COMPARE_KEYLET_FAIL( delegateKeylet, - keylet::delegate, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); @@ -1536,123 +1583,138 @@ struct HostFuncImpl_test : public beast::unit_test::suite alice.id()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); COMPARE_KEYLET_FAIL( depositPreauthKeylet, - keylet::depositPreauth, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); - // escrowKeylet COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); COMPARE_KEYLET_FAIL( - escrowKeylet, - keylet::escrow, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); - // lineKeylet Currency usd = to_currency("USD"); COMPARE_KEYLET( lineKeylet, keylet::line, env.master.id(), alice.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, - keylet::line, HostFunctionError::INVALID_PARAMS, env.master.id(), alice.id(), to_currency("")); + { + auto actual = hfs.mptIssuanceKeylet(env.master.id(), 1); + auto expected = keylet::mptIssuance(1, env.master.id()); + if (BEAST_EXPECT(actual.has_value())) + { + BEAST_EXPECT(compareKeylet(actual.value(), expected)); + } + } + { + auto actual = hfs.mptIssuanceKeylet(xrpAccount(), 1); + if (BEAST_EXPECT(!actual.has_value())) + BEAST_EXPECT( + actual.error() == HostFunctionError::INVALID_ACCOUNT); + } + + auto const sampleMPTID = makeMptID(1, env.master.id()); + COMPARE_KEYLET(mptokenKeylet, keylet::mptoken, sampleMPTID, alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_PARAMS, + MPTID{}, + alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_ACCOUNT, + sampleMPTID, + xrpAccount()); + COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); COMPARE_KEYLET_FAIL( nftOfferKeylet, - keylet::nftoffer, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); COMPARE_KEYLET_FAIL( - offerKeylet, - keylet::offer, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + offerKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); COMPARE_KEYLET_FAIL( - oracleKeylet, - keylet::oracle, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + oracleKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET( paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), 1); COMPARE_KEYLET_FAIL( paychanKeylet, - keylet::payChan, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), 1); - COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); - COMPARE_KEYLET_FAIL( - signersKeylet, - keylet::signers, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount()); - COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET( + permissionedDomainKeylet, + keylet::permissionedDomain, + env.master.id(), + 1); COMPARE_KEYLET_FAIL( - ticketKeylet, - keylet::ticket, + permissionedDomainKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); + COMPARE_KEYLET_FAIL( + signersKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + ticketKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(vaultKeylet, keylet::vault, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + vaultKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); } void @@ -1936,6 +1998,80 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); } + void + testTraceAccount() + { + testcase("traceAccount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace account"; + // Valid account + { + auto const result = hfs.traceAccount(msg, env.master.id()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + toBase58(env.master.id()).size()); + } + } + + void + testTraceAmount() + { + testcase("traceAmount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + { + auto const result = hfs.traceAmount(msg, amount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == msg.size() + amount.getFullText().size()); + } + + // IOU amount + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + STAmount iouAmount = env.master["USD"](100); + { + auto const result = hfs.traceAmount(msg, iouAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + iouAmount.getFullText().size()); + } + + // MPT amount + { + auto const mptId = makeMptID(42, env.master.id()); + Asset mptAsset = Asset(mptId); + STAmount mptAmount(mptAsset, 123456); + auto const result = hfs.traceAmount(msg, mptAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + mptAmount.getFullText().size()); + } + } + // clang-format off int const normalExp = 15; @@ -2818,6 +2954,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite testGetNFTSerial(); testTrace(); testTraceNum(); + testTraceAccount(); + testTraceAmount(); testFloats(); } }; diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 2d7793463fd..9cacaa4c8c2 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -331,6 +331,17 @@ struct TestHostFunctions : public HostFunctions return Bytes{keylet.key.begin(), keylet.key.end()}; } + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override + { + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + Expected credentialKeylet( AccountID const& subject, @@ -450,6 +461,23 @@ struct TestHostFunctions : public HostFunctions return msg.size() + sizeof(data); } + Expected + traceAccount(std::string_view const& msg, AccountID const& account) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT: " << msg << " " << accountStr; + return msg.size() + accountStr.size(); + } + Expected traceFloat(std::string_view const& msg, Slice const& data) override { @@ -467,6 +495,19 @@ struct TestHostFunctions : public HostFunctions return msg.size() + s.size(); } + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT: " << msg << " " << amountStr; + return msg.size() + amountStr.size(); + } + Expected floatFromInt(int64_t x, int32_t mode) override { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 46c116637a9..c09b366b7f4 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -645,26 +645,20 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; - // Env env{ - // *this, - // envconfig(), - // testable_amendments(), - // nullptr, - // beast::severities::kTrace}; Env env{*this}; auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); Bytes const wasm(wasmStr.begin(), wasmStr.end()); - std::string const funcName("finish"); TestHostFunctions hfs(env, 0); - auto re = - runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + auto const allowance = 119'883; + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 100'784, std::to_string(re->cost)); + BEAST_EXPECT(re->result); + BEAST_EXPECTS(re->cost == allowance, std::to_string(re->cost)); } } diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index cc667d4d346..83078812d35 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" +version = "0.5.1-devnet5" source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs index 167541eae63..970db7bd50b 100644 --- a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -3,15 +3,17 @@ #[cfg(not(target_arch = "wasm32"))] extern crate std; -use crate::host::{Result, Result::Err, Result::Ok}; -use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use crate::host::{Error, Result, Result::Err, Result::Ok}; use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; +use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; use xrpl_std::core::ledger_objects::ledger_object; use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; +use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; use xrpl_std::core::types::amount::currency_code::CurrencyCode; +use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; -use xrpl_std::host::trace::{trace, trace_data, trace_num, DataRepr}; +use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; use xrpl_std::sfield; #[unsafe(no_mangle)] @@ -27,7 +29,7 @@ pub fn object_exists( let slot = unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }; if slot <= 0 { let _ = trace_num("Error: ", slot.into()); - return Err(host::Error::NoFreeSlots); + return Err(Error::from_code(slot)); } if field == 0 { let new_field = sfield::PreviousTxnID; @@ -70,29 +72,27 @@ pub extern "C" fn finish() -> i32 { let escrow: CurrentEscrow = get_current_escrow(); let account = escrow.get_account().unwrap_or_panic(); - let _ = trace_data(" Account:", &account.0, DataRepr::AsHex); + let _ = trace_account("Account:", &account); let destination = escrow.get_destination().unwrap_or_panic(); - let _ = trace_data(" Destination:", &destination.0, DataRepr::AsHex); + let _ = trace_account("Destination:", &destination); + + let mut seq = 5; macro_rules! check_object_exists { ($keylet:expr, $type:expr, $field:expr) => { match object_exists($keylet, $type, $field) { - Ok(exists) => { - if exists { - let _ = trace(concat!( - $type, - " object exists, proceeding with escrow finish." - )); - } else { - let _ = trace(concat!( - $type, - " object does not exist, aborting escrow finish." - )); - return 0; - } + Ok(_exists) => { + // false isn't returned + let _ = trace(concat!( + $type, + " object exists, proceeding with escrow finish." + )); + } + Err(error) => { + let _ = trace_num("Current seq value:", seq.try_into().unwrap()); + return error.code(); } - Err(error) => return error.code(), } }; } @@ -100,13 +100,20 @@ pub extern "C" fn finish() -> i32 { let account_keylet = keylets::account_keylet(&account); check_object_exists!(account_keylet, "Account", sfield::Account); - let mut seq = 5; let currency_code: &[u8; 3] = b"USD"; let currency: CurrencyCode = CurrencyCode::from(*currency_code); let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); check_object_exists!(line_keylet, "Trustline", sfield::Generic); seq += 1; + let asset1 = Asset::XRP(XrpAsset {}); + let asset2 = Asset::IOU(IouAsset::new(destination, currency)); + check_object_exists!( + keylets::amm_keylet(&asset1, &asset2), + "AMM", + sfield::Account + ); + let check_keylet = keylets::check_keylet(&account, seq); check_object_exists!(check_keylet, "Check", sfield::Account); seq += 1; @@ -132,7 +139,15 @@ pub extern "C" fn finish() -> i32 { check_object_exists!(escrow_keylet, "Escrow", sfield::Account); seq += 1; - let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 4); + let mpt_issuance_keylet = keylets::mpt_issuance_keylet(&account, seq); + let mpt_id = MptId::new(seq.try_into().unwrap(), account); + check_object_exists!(mpt_issuance_keylet, "MPTIssuance", sfield::Issuer); + seq += 1; + + let mptoken_keylet = keylets::mptoken_keylet(&mpt_id, &destination); + check_object_exists!(mptoken_keylet, "MPToken", sfield::Account); + + let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 6); check_object_exists!(nft_offer_keylet, "NFTokenOffer", sfield::Owner); let offer_keylet = keylets::offer_keylet(&account, seq); @@ -143,6 +158,10 @@ pub extern "C" fn finish() -> i32 { check_object_exists!(paychan_keylet, "PayChannel", sfield::Account); seq += 1; + let pd_keylet = keylets::permissioned_domain_keylet(&account, seq); + check_object_exists!(pd_keylet, "PermissionedDomain", sfield::Owner); + seq += 1; + let signers_keylet = keylets::signers_keylet(&account); check_object_exists!(signers_keylet, "SignerList", sfield::Generic); seq += 1; @@ -150,6 +169,10 @@ pub extern "C" fn finish() -> i32 { seq += 1; // ticket sequence number is one greater let ticket_keylet = keylets::ticket_keylet(&account, seq); check_object_exists!(ticket_keylet, "Ticket", sfield::Account); + seq += 1; + + let vault_keylet = keylets::vault_keylet(&account, seq); + check_object_exists!(vault_keylet, "Vault", sfield::Account); // seq += 1; 1 // All keylets exist, finish the escrow. diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 00b548911b4..f6b293d40dd 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" +version = "0.5.1-devnet5" source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index e379fe9790c..33ae5b78d71 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -16,4 +16,3 @@ panic = "abort" [dependencies] xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } - diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs index 0e8a1ecee08..1d3d04e74f5 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -32,6 +32,15 @@ unsafe extern "C" { out_buff_len: usize, ) -> i32; + pub fn amm_keylet( + issue1_ptr: *const u8, + issue1_len: usize, + issue2_ptr: i32, + issue2_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + pub fn line_keylet( account1_ptr: *const u8, account1_len: usize, diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 1323068b397..1b1f5f7b2d0 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -8,6 +8,9 @@ use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::error_codes; use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::amount::asset::Asset; +use xrpl_std::core::types::amount::asset::XrpAsset; +use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; use xrpl_std::host::trace::{trace, trace_num as trace_number}; @@ -27,6 +30,7 @@ fn check_result(result: i32, expected: i32, test_name: &'static str) { panic!("Unexpected success code: {}", code); } code => { + let _ = trace(test_name); let _ = trace_number("TEST FAILED", code.into()); panic!("Error code: {}", code); } @@ -285,6 +289,32 @@ pub extern "C" fn finish() -> i32 { "get_ledger_sqn_len_too_long", ) }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); // ######################################## // Step #3: Test getData[Type] edge cases @@ -359,7 +389,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "account_keylet_len_too_long", + "account_keylet_len_oob", ) }); with_buffer::<32, _, _>(|ptr, len| { @@ -393,7 +423,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "line_keylet_len_too_long_currency", + "line_keylet_len_oob_currency", ) }); with_buffer::<32, _, _>(|ptr, len| { @@ -415,6 +445,75 @@ pub extern "C" fn finish() -> i32 { ) }); + // Asset + let asset1_bytes = Asset::XRP(XrpAsset {}).as_bytes(); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "amm_keylet_len_oob_asset2", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_len_asset2", + ) + }); + let currency: &[u8] = b"USD00000000000000000"; // 20 bytes + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + currency.as_ptr() as i32, + currency.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_non_xrp_currency_len", + ) + }); + let mptid = MptId::new(1, account); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + mptid.as_ptr(), + mptid.len(), + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_mpt", + ) + }); + // string check_result( unsafe { @@ -425,7 +524,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "trace_num_wrong_len_str", + "trace_num_oob_str", ); // ######################################## @@ -476,7 +575,12 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::amendment_enabled(amendment_name.as_ptr(), long_len) }, error_codes::DATA_FIELD_TOO_LARGE, - "amendment_enabled", + "amendment_enabled_too_big_slice", + ); + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), 65) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled_too_long", ); with_buffer::<2, _, _>(|ptr, len| { check_result( @@ -570,6 +674,22 @@ pub extern "C" fn finish() -> i32 { "compute_sha512_half_too_big_slice", ); }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + asset1_bytes.as_ptr(), + long_len, + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "amm_keylet_too_big_slice", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { @@ -588,11 +708,27 @@ pub extern "C" fn finish() -> i32 { "credential_keylet_too_big_slice", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "mptoken_keylet_too_big_slice_mptid", + ) + }); check_result( unsafe { host::trace( - locator.as_ptr(), - locator.len(), + message.as_ptr(), + message.len(), locator.as_ptr().wrapping_add(1_000_000_000), locator.len(), 0, @@ -601,6 +737,18 @@ pub extern "C" fn finish() -> i32 { error_codes::POINTER_OUT_OF_BOUNDS, "trace_oob_slice", ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_slice", + ); // invalid UInt256 @@ -787,7 +935,6 @@ pub extern "C" fn finish() -> i32 { "escrow_keylet_wrong_size_accountid", ) }); - let currency: &[u8] = b"USD00000000000000000"; // 20 bytes with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { @@ -824,6 +971,29 @@ pub extern "C" fn finish() -> i32 { "line_keylet_wrong_size_accountid2", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::mpt_issuance_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "mpt_issuance_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + mptid.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_wrong_size_accountid", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, @@ -879,6 +1049,15 @@ pub extern "C" fn finish() -> i32 { "paychan_keylet_wrong_size_accountid2", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::permissioned_domain_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) + }, + error_codes::INVALID_PARAMS, + "permissioned_domain_keylet_wrong_size_accountid", + ) + }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, @@ -893,6 +1072,13 @@ pub extern "C" fn finish() -> i32 { "ticket_keylet_wrong_size_accountid", ) }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::vault_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "vault_keylet_wrong_size_accountid", + ) + }); let uint256: &[u8] = b"00000000000000000000000000000001"; with_buffer::<2, _, _>(|ptr, len| { check_result( @@ -910,6 +1096,18 @@ pub extern "C" fn finish() -> i32 { "get_nft_wrong_size_accountid", ) }); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_account_wrong_size_accountid", + ); // invalid Currency was already tested above // invalid string @@ -917,15 +1115,39 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::trace( - locator.as_ptr().wrapping_add(1_000_000_000), - locator.len(), + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), uint256.as_ptr(), uint256.len(), 0, ) }, error_codes::POINTER_OUT_OF_BOUNDS, - "get_nft_wrong_size_string", + "trace_oob_string", + ); + check_result( + unsafe { + host::trace_account( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_account_oob_string", + ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_string", ); // trace too large @@ -948,6 +1170,57 @@ pub extern "C" fn finish() -> i32 { error_codes::DATA_FIELD_TOO_LARGE, "trace_num_too_long", ); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + check_result( + unsafe { host::trace_amount(message.as_ptr(), long_len, amount.as_ptr(), amount.len()) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + + // trace amount errors + + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_amount_wrong_length", + ); + + // other misc errors + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + locator.as_ptr(), + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_mptid_wrong_length", + ) + }); 1 // <-- If we get here, finish the escrow. } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 9e530997a0e..a0d8d4efaa3 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9669,205 +9669,264 @@ extern std::string const hfPerfTest = "6572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const allKeyletsWasmHex = - "0061736d01000000014d0960057f7f7f7f7f017f60047f7f7f7f017f60037f7f7f017f6008" - "7f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f02de031208686f73745f6c6962057472616365000008686f" - "73745f6c69621063616368655f6c65646765725f6f626a000208686f73745f6c6962097472" - "6163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f626a5f666965" - "6c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f" - "6669656c64000208686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73" - "745f6c69620b6c696e655f6b65796c6574000308686f73745f6c69620c636865636b5f6b65" - "796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c657400030868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000408686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000408686f73745f6c69620a6469645f6b" - "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000008686f7374" - "5f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665" - "725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608" + "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" + "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" + "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" + "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" + "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" + "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" + "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" + "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" + "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" + "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" + "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" + "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" + "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" + "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" + "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" + "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" - "636b65745f6b65796c65740000030302070805030100110619037f01418080c0000b7f0041" - "f48bc0000b7f0041808cc0000b073e05066d656d6f727902000d6f626a6563745f65786973" - "747300120666696e69736800130a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020ab82202b50502057f037e230041f0006b220524000240024020012d000045044020" - "0541186a200141196a290000370300200541106a200141116a290000370300200541086a20" - "0141096a290000370300200520012900013703002002200320054120410110001a20054120" - "41001001220141004c0d010240024002402004450440418b80c000410f4285801410021a20" - "0541e8006a4200370300200541e0006a4200370300200541d8006a42003703002005420037" - "0350200141858014200541d0006a22064120100322014120470d01200541286a200541df00" - "6a2201290000220a370300200541306a200541e7006a2202290000220b370300200541386a" - "200541ef006a22032d000022043a000020052005290057220c37032020052f015021072005" - "280152210820052d005621092001200a3700002002200b370000200320043a000020052009" - "3a005620052008360152200520073b01502005200c370057419a80c000410c200641204101" - "10001a0c030b418b80c000410f2004ac10021a200541e0006a4100360200200541d8006a42" - "003703002005420037035020012004200541d0006a4114100322014114460d0141a680c000" - "4115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c050b41a6" - "80c0004115417f20012001417f4e1b2201ac10021a200041013a0000200020013602040c04" - "0b200541226a20052d00523a0000200520052900573703402005200541dc006a2900003700" - "452005412c6a2005290045370000200520052f01503b012020052005280053360023200520" - "05290340370027419a80c000410c200541206a4114410110001a0b20004180023b01000c02" - "0b41c280c000411620012802042201ac10021a200041013a0000200020013602040c010b41" - "bb80c00041072001ac10021a200041013a0000200041783602040b200541f0006a24000bfe" - "1c01077f230041c0046b2200240041d880c000412341004100410010001a200041b0046a22" - "014100360200200041a8046a22024200370300200042003703a00402402000027f02404181" - "8020200041a0046a220541141004220341144604402000410e6a20002d00a2043a00002000" - "20002900a7043703582000200041ac046a220429000037005d200041186a200029005d3700" - "00200020002f01a0043b010c200020002800a30436000f2000200029035837001341fb80c0" - "00410a2000410c6a22064114410110001a2001410036020020024200370300200042003703" - "a0044183802020054114100422034114470d03200041226a20002d00a2043a000020002000" - "2900a7043703582000200429000037005d2000412c6a200029005d370000200020002f01a0" - "043b0120200020002800a30436002320002000290358370027418581c000410e200041206a" - "4114410110001a200041b8046a220442003703002001420037030020024200370300200042" - "003703a0042006411420054120100522034120460d01024020034100480440200020033602" - "380c010b2000417f3602380b41010c020b0c020b200041cd006a2004290300370000200041" - "c5006a20012903003700002000413d6a2002290300370000200020002903a0043700354100" - "0b3a0034200041a0046a200041346a419381c0004107418180201012027f024020002d00a0" - "040d0020002d00a104450440419a81c000413641004100410010001a0c010b4100210341d0" - "81c000413541004100410010001a200041e6006a41c4003a0000200041e0006a4100360200" - "200041eb006a41003a0000200041d5a6013b01642000420037035820004100360067200041" - "b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037030020" - "0042003703a00402402000410c6a4114200041206a4114200041d8006a4114200041a0046a" - "4120100622014120470440024020014100480440200020013602740c010b2000417f360274" - "0b410121030c010b20004189016a200229030037000020004181016a200529030037000020" - "0041f9006a2004290300370000200020002903a0043700710b200020033a0070200041a004" - "6a200041f0006a418582c00041094100101220002d00a0040d0020002d00a104450440418e" - "82c000413a41004100410010001a0c010b4100210341c882c000413941004100410010001a" - "200041b8046a22024200370300200041b0046a22054200370300200041a8046a2204420037" - "0300200042003703a00402402000410c6a41144106200041a0046a41201007220141204704" - "4002402001410048044020002001360298010c010b2000417f360298010b410121030c010b" - "200041ad016a2002290300370000200041a5016a20052903003700002000419d016a200429" - "0300370000200020002903a004370095010b200020033a009401200041a0046a2000419401" - "6a418183c000410541818020101220002d00a0040d0020002d00a104450440419a81c00041" - "3641004100410010001a0c010b41d081c000413541004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "20014200370300200041b8016a2202027f2000410c6a2203411420034114418683c0004112" - "20014120100822034120470440024020034100480440200220033602040c010b2002417f36" - "02040b41010c010b20022001290300370001200241196a2005290300370000200241116a20" - "04290300370000200241096a200629030037000041000b3a0000200141206a2400200041a0" - "046a2002419883c000410a41988020101220002d00a0040d0020002d00a10445044041a283" - "c000413b41004100410010001a0c010b41dd83c000413a41004100410010001a230041206b" - "22012400200141186a22054200370300200141106a22044200370300200141086a22064200" - "37030020014200370300200041dc016a2202027f2000410c6a4114200041206a4114200141" - "20100922034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" - "02419784c000410841818020101220002d00a0040d0020002d00a104450440419f84c00041" - "3941004100410010001a0c010b41d884c000413841004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "2001420037030020004180026a2202027f2000410c6a4114200041206a411420014120100a" - "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" - "010b20022001290300370001200241196a2005290300370000200241116a20042903003700" - "00200241096a200629030037000041000b3a0000200141206a2400200041a0046a20024190" - "85c000410e41818020101220002d00a0040d0020002d00a104450440419e85c000413f4100" - "4100410010001a0c010b41dd85c000413e41004100410010001a230041206b220124002001" - "41186a22054200370300200141106a22044200370300200141086a22064200370300200142" - "00370300200041a4026a2202027f2000410c6a411420014120100b22034120470440024020" - "034100480440200220033602040c010b2002417f3602040b41010c010b2002200129030037" - "0001200241196a2005290300370000200241116a2004290300370000200241096a20062903" - "0037000041000b3a0000200141206a2400200041a0046a2002419381c00041074181802010" - "1220002d00a0040d0020002d00a104450440419a81c000413641004100410010001a0c010b" - "41d081c000413541004100410010001a230041206b22012400200141186a22054200370300" - "200141106a22044200370300200141086a2206420037030020014200370300200041c8026a" - "2202027f2000410c6a4114410b20014120100c220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041a0046a2002419b86c000410641818020101220002d00a0040d" - "0020002d00a10445044041a186c000413741004100410010001a0c010b41d886c000413641" - "004100410010001a230041206b22012400200141186a22054200370300200141106a220442" - "00370300200141086a2206420037030020014200370300200041ec026a2202027f20004120" - "6a4114410420014120100d22034120470440024020034100480440200220033602040c010b" - "2002417f3602040b41010c010b20022001290300370001200241196a200529030037000020" - "0241116a2004290300370000200241096a200629030037000041000b3a0000200141206a24" - "00200041a0046a2002418e87c000410c41828020101220002d00a0040d0020002d00a10445" - "0440419a87c000413d41004100410010001a0c010b41d787c000413c41004100410010001a" - "230041206b22012400200141186a22054200370300200141106a2204420037030020014108" - "6a220642003703002001420037030020004190036a2202027f2000410c6a4114410c200141" - "20100e22034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2005290300370000200241116a20042903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a20" - "02419388c000410541818020101220002d00a0040d0020002d00a104450440419888c00041" - "3641004100410010001a0c010b41ce88c000413541004100410010001a230041206b220124" - "00200141186a22054200370300200141106a22044200370300200141086a22064200370300" - "20014200370300200041b4036a2202027f2000410c6a4114200041206a4114410d20014120" - "100f22034120470440024020034100480440200220033602040c010b2002417f3602040b41" - "010c010b20022001290300370001200241196a2005290300370000200241116a2004290300" - "370000200241096a200629030037000041000b3a0000200141206a2400200041a0046a2002" - "418389c000410a41818020101220002d00a0040d0020002d00a104450440418d89c000413b" - "41004100410010001a0c010b41c889c000413a41004100410010001a230041206b22012400" - "200141186a22054200370300200141106a22044200370300200141086a2206420037030020" - "014200370300200041d8036a2202027f2000410c6a41142001412010102203412047044002" - "4020034100480440200220033602040c010b2002417f3602040b41010c010b200220012903" - "00370001200241196a2005290300370000200241116a2004290300370000200241096a2006" - "29030037000041000b3a0000200141206a2400200041a0046a200241828ac000410a410010" - "1220002d00a0040d0020002d00a104450440418c8ac000413b41004100410010001a0c010b" - "41c78ac000413a41004100410010001a230041206b22012400200141186a22054200370300" - "200141106a22044200370300200141086a2206420037030020014200370300200041fc036a" - "2202027f2000410c6a41144110200141201011220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "05290300370000200241116a2004290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041a0046a200241818bc000410641818020101220002d00a0040d" - "0020002d00a10445044041878bc000413741004100410010001a0c010b41be8bc000413641" - "004100410010001a41010c010b41000b200041c0046a24000f0b418080c000410b417f2003" - "2003417f4e1bac1002000b0bfe0b0100418080c0000bf40b6572726f725f636f64653d4765" - "7474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e" - "67206669656c643a204572726f723a204572726f722067657474696e67206b65796c65743a" - "202424242424205354415254494e47205741534d20455845435554494f4e20242424242420" - "204163636f756e743a202044657374696e6174696f6e3a4163636f756e742020436865636b" - "206f626a65637420646f6573206e6f742065786973742c2061626f7274696e672065736372" - "6f772066696e6973682e2020436865636b206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e54727573746c696e652020" - "54727573746c696e65206f626a65637420646f6573206e6f742065786973742c2061626f72" - "74696e6720657363726f772066696e6973682e202054727573746c696e65206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e436865636b7465726d73616e64636f6e646974696f6e7343726564656e7469616c2020" - "43726564656e7469616c206f626a65637420646f6573206e6f742065786973742c2061626f" - "7274696e6720657363726f772066696e6973682e202043726564656e7469616c206f626a65" + "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" + "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" + "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" + "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" + "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" + "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" + "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" + "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" + "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" + "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" + "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" + "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" + "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" + "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" + "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" + "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" + "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" + "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" + "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" + "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" + "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" + "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" + "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" + "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" + "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" + "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" + "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" + "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" + "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" + "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" + "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" + "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" + "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" + "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" + "420037030020004200370388012008411420024120100622014120460d0102402001410048" + "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" + "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" + "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" + "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" + "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" + "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" + "420037030020004190016a220542003703002000420037038801200041046a411420004118" + "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" + "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" + "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" + "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" + "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" + "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" + "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" + "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" + "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" + "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" + "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" + "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" + "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" + "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" + "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" + "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" + "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" + "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" + "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" + "003703e001200041046a411441062004412010092204412047044002402004410048044020" + "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" + "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" + "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" + "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" + "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" + "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" + "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" + "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" + "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" + "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" + "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" + "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" + "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" + "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" + "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" + "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" + "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" + "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" + "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" + "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" + "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" + "200041186a2208411420034120100c22024120470440024020024100480440200120023602" + "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" + "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" + "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" + "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" + "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" + "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" + "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" + "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" + "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" + "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" + "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" + "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" + "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" + "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" + "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" + "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" + "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" + "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" + "03290300370001200141196a2006290300370000200141116a200729030037000020014109" + "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" + "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" + "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" + "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" + "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" + "02027f20054118200841142001412010102205412047044002402005410048044020022005" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" + "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" + "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" + "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" + "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" + "084114410620014120101122054120470440024020054100480440200220053602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" + "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" + "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" + "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" + "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" + "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" + "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" + "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" + "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" + "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" + "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" + "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" + "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" + "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" + "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" + "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" + "022001290300370001200241196a2008290300370000200241116a20062903003700002002" + "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" + "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" + "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" + "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" + "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" + "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" + "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" + "370300200141106a22064200370300200141086a2207420037030020014200370300200041" + "90066a2202027f200441144112200141201016220541204704400240200541004804402002" + "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" + "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" + "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" + "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" + "7f20044114411320014120101722044120470440024020044100480440200220043602040c" + "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" + "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" + "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" + "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" + "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" + "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" + "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" + "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" + "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" + "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" + "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" + "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" + "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" + "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" + "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" + "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" + "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" + "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" + "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" + "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" + "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" + "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" + "200228020021020340200420022003762001280200220220057472360200200141046a2101" + "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" + "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" + "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" + "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" + "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" + "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" + "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" + "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" + "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" - "6973682e44656c6567617465202044656c6567617465206f626a65637420646f6573206e6f" - "742065786973742c2061626f7274696e6720657363726f772066696e6973682e202044656c" - "6567617465206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e4465706f7369745072656175746820204465706f736974" - "50726561757468206f626a65637420646f6573206e6f742065786973742c2061626f727469" - "6e6720657363726f772066696e6973682e20204465706f73697450726561757468206f626a" - "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" - "6e6973682e457363726f772020457363726f77206f626a65637420646f6573206e6f742065" - "786973742c2061626f7274696e6720657363726f772066696e6973682e2020457363726f77" + "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" + "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" + "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" + "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" + "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" + "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" + "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" - "772066696e6973682e4e46546f6b656e4f6666657220204e46546f6b656e4f66666572206f" - "626a65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f77" - "2066696e6973682e20204e46546f6b656e4f66666572206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e4f6666657220" - "204f66666572206f626a65637420646f6573206e6f742065786973742c2061626f7274696e" - "6720657363726f772066696e6973682e20204f66666572206f626a65637420657869737473" - "2c2070726f63656564696e67207769746820657363726f772066696e6973682e5061794368" - "616e6e656c20205061794368616e6e656c206f626a65637420646f6573206e6f7420657869" - "73742c2061626f7274696e6720657363726f772066696e6973682e20205061794368616e6e" - "656c206f626a656374206578697374732c2070726f63656564696e67207769746820657363" - "726f772066696e6973682e5369676e65724c69737420205369676e65724c697374206f626a" - "65637420646f6573206e6f742065786973742c2061626f7274696e6720657363726f772066" - "696e6973682e20205369676e65724c697374206f626a656374206578697374732c2070726f" - "63656564696e67207769746820657363726f772066696e6973682e5469636b657420205469" - "636b6574206f626a65637420646f6573206e6f742065786973742c2061626f7274696e6720" - "657363726f772066696e6973682e20205469636b6574206f626a656374206578697374732c" - "2070726f63656564696e67207769746820657363726f772066696e6973682e004d0970726f" - "64756365727302086c616e6775616765010452757374000c70726f6365737365642d627901" - "0572757374631d312e38352e31202834656231363132353020323032352d30332d31352900" - "490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b08" - "7369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c756" - "5"; + "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" + "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" + "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" + "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" + "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60037f" - "7f7f017f60067f7f7f7f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" - "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002a90a2d08686f73745f6c696209" - "74726163655f6e756d000808686f73745f6c6962057472616365000208686f73745f6c6962" + "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60067f" + "7f7f7f7f7f017f60037f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" + "7472616365000208686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" - "656c64000308686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" - "6c69621063616368655f6c65646765725f6f626a000308686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000308686f73745f6c6962146765" + "656c64000408686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" + "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000408686f73745f6c6962146765" "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" @@ -9878,211 +9937,254 @@ extern std::string const codecovTestsWasmHex = "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000308686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" + "656e000408686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" - "736967000408686f73745f6c6962076765745f6e6674000408686f73745f6c69620e676574" + "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" - "745f73657269616c000108686f73745f6c69620b6c696e655f6b65796c6574000708686f73" - "745f6c69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620c6368" - "65636b5f6b65796c6574000208686f73745f6c69620f64656c65676174655f6b65796c6574" - "000408686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000408" - "686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d657363726f77" - "5f6b65796c6574000208686f73745f6c6962106e66745f6f666665725f6b65796c65740002" - "08686f73745f6c69620c6f666665725f6b65796c6574000208686f73745f6c69620d6f7261" - "636c655f6b65796c6574000208686f73745f6c69620e7061796368616e5f6b65796c657400" - "0908686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d" - "7469636b65745f6b65796c657400020303020a0505030100110619037f01418080c0000b7f" - "00419895c0000b7f0041a095c0000b072e04066d656d6f727902000666696e697368002e0a" - "5f5f646174615f656e6403010b5f5f686561705f6261736503020ab21f0239000240200020" - "0147044020004100480d01418b80c000410b2000ad1000000b200220032000ac10001a0f0b" - "418b80c000410b2000ac1000000bf51e02087f027e230041e0016b22002400419680c00041" - "2341004100410010011a20004100360258200041d8006a220141041002410441ca88c00041" - "0e102d20004100360258200141041003410441d888c0004116102d200041f0006a22044200" - "370300200041e8006a22034200370300200041e0006a220242003703002000420037035820" - "0141201004412041ee88c0004116102d200442003703002003420037030020024200370300" - "200042003703582001412010054120418489c0004117102d20044200370300200342003703" - "0020024200370300200042003703582001412010064120419b89c0004112102d1007410a41" - "b980c000410c102d200041186a428182848890a0c08001370300200041106a428182848890" - "a0c08001370300200041086a428182848890a0c080013703002000428182848890a0c08001" - "37030041c580c000410e1008410141d380c0004111102d200041201008410141d380c00041" - "11102d20034100360200200242003703002000420037035802404181802020014114100922" - "064114460440200041266a20002d005a3a00002000200029005f3703c0012000200041e400" - "6a2900003700c501200041306a20002900c501370000200020002f01583b01242000200028" - "005b360027200020002903c00137002b200442003703002003420037030020024200370300" - "20004200370358200041246a411420014120100a22044120470d012000413a6a20002d005a" - "3a0000200041c8016a200041e7006a2900002208370300200041d0016a200041ef006a2900" - "002209370300200041c7006a2008370000200041cf006a2009370000200041d7006a200041" - "f7006a2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37" - "003f200041386a41204100100b410141e480c0004110102d20034100360200200242003703" - "00200042003703584181802020014114100c411441ad89c000411c102d2003410036020020" - "0242003703002000420037035841014181802020014114100d411441c989c0004114102d02" - "402001410020016b41037122036a220220014d0d0020030440200321040340200141003a00" - "00200141016a2101200441016b22040d000b0b200341016b4107490d000340200141003a00" - "00200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41" - "003a0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141" - "086a22012002470d000b0b200241c40020036b2203417c716a220120024b04400340200241" - "00360200200241046a22022001490d000b0b024020012003410371220320016a22044f0d00" - "2003220204400340200141003a0000200141016a2101200241016b22020d000b0b20034101" - "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" - "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" - "00200141016a41003a0000200141086a22012004470d000b0b2000418180203602c0014100" - "21010340200541c000490440200041d8006a20056a200041c0016a20016a2d00003a000020" - "0020002802980141016a220536029801200141016a22014104470d010b0b200041d0016a22" - "044100360200200041c8016a22064200370300200042003703c001200041d8006a22012005" - "200041c0016a22024114100e411441dd89c0004113102d2004410036020020064200370300" - "200042003703c001200120002802980120024114100f411441f089c0004123102d20044100" - "36020020064200370300200042003703c00141012001200028029801200241141010411441" - "938ac000411b102d4189803c1011412041f480c0004110102d4189803c10124120418481c0" - "004120102d41014189803c1013412041a481c0004118102d20012000280298011014412041" - "bc81c0004117102d20012000280298011015412041d381c0004127102d4101200120002802" - "98011016412041fa81c000411f102d200041246a2203411410174100419982c000410b102d" - "200041d8016a220742003703002004420037030020064200370300200042003703c0012001" - "200028029801200241201018412041ae8ac0004113102d41a482c000410c41b082c000410b" - "41bb82c000410e1019410141c982c0004109102d200041b8016a200041186a290300370300" - "200041b0016a200041106a290300370300200041a8016a200041086a290300370300200020" - "002903003703a001200441003b010020064200370300200042003703c00120034114200041" - "a0016a2205412020024112101a411241c18ac0004107102d20044100360200200642003703" - "00200042003703c0012005412020024114101b411441c88ac000410e102d200041003602c0" - "012005412020024104101c410441d68ac000410d102d20054120101d410841d282c000410d" - "102d20054120101e410a41df82c0004114102d200041003602c0012005412020024104101f" - "410441e38ac000410e102d417f41041002417141f382c0004116102d200041003602c00120" - "02417f1002417141f18ac0004116102d200041c2016a41003a0000200041003b01c0012002" - "41031002417d41878bc000411c102d200041003602c0012002418094ebdc031002417341a3" - "8bc000411b102d41021011416f418983c000411f102d417f2000280298011014417141a883" - "c000411f102d2001417f1014417141c783c000411f102d20014181201014417441e683c000" - "4120102d200041d894ebdc036a220520002802980110144173418684c000411f102d200520" - "00280298014101100b417341a584c0004118102d20012000280298014101100b417141bd84" - "c000411a102d200742003703002004420037030020064200370300200042003703c0012005" - "20002802980120024120100a417341be8bc000411b102d2007420037030020044200370300" - "20064200370300200042003703c001200120002802980120024120100a417141d98bc00041" - "18102d200742003703002004420037030020064200370300200042003703c0012003411420" - "0341142005200028029801200241201020417341f18bc0004121102d200742003703002004" - "420037030020064200370300200042003703c0012003411420034114200120002802980120" - "0241201020417141928cc000411e102d2005200028029801422a1000417341d784c0004117" - "102d200041003b01c0014102200241021009416f41b08cc000411b102d200041003b01c001" - "410220024102100c416f41cb8cc000412b102d200041003b01c0014101410220024102100d" - "416f41f68cc0004123102d41021011416f418983c000411f102d41021012416f41ee84c000" - "412f102d410141021013416f419d85c0004127102d41c580c0004181201008417441d380c0" - "004111102d200041003b01c001200141812020024102100e417441998dc0004121102d2000" - "41003b01c001200141812020024102100f417441ba8dc0004131102d200041003b01c00141" - "012001418120200241021010417441eb8dc0004129102d20014181201014417441c485c000" - "4125102d20014181201015417441e985c0004135102d4101200141812010164174419e86c0" - "00412d102d20014181201017417441cb86c0004119102d41a482c00041812041b082c00041" - "0b41bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c00041812041" - "bb82c000410e1019417441c982c0004109102d41a482c000410c41b082c000410b41bb82c0" - "004181201019417441c982c0004109102d200041003b01c001200141812020024102101841" - "7441948ec0004121102d200041003b01c00120034114200341142001418120200241021021" - "417441b58ec000411f102d200120002802980122042005200441001001417341e486c00041" - "0f102d20012000280298014100100b417141f386c0004123102d200041003b01c001200341" - "14200120002802980120024102101a417141d48ec000411a102d200041003b01c001200120" - "002802980120024102101b417141ee8ec0004121102d200041003b01c00120012000280298" - "0120024102101c4171418f8fc0004120102d2001200028029801101d4171419687c0004120" - "102d2001200028029801101e417141b687c0004127102d200041003602c001200120002802" - "980120024104101f417141af8fc0004121102d200041003b01c00120012000280298012002" - "4102100a417141d08fc0004123102d200041003b01c0012001200028029801410120024102" - "1022417141f38fc0004121102d200041003b01c00120012000280298012204200341142001" - "20042002410210214171419490c0004127102d200041003b01c00120034114200120002802" - "9801220420012004200241021021417141bb90c0004127102d200041003b01c00120012000" - "2802980120034114200241021023417141e290c0004125102d200041003b01c00120034114" - "20012000280298012002410210234171418791c0004125102d200041003b01c00120012000" - "2802980120034114200241021024417141ac91c000412c102d200041003b01c00120034114" - "2001200028029801200241021024417141d891c000412c102d200041003b01c00120012000" - "280298012002410210254171418492c000411f102d200041003b01c0012001200028029801" - "4101200241021026417141a392c0004122102d200041003b01c00120012000280298012003" - "411441dd87c0004114200241021020417141c592c0004121102d200041003b01c001200341" - "14200120002802980141dd87c0004114200241021020417141e692c0004121102d20004100" - "3b01c001200120002802980141012002410210274171418793c0004125102d200041003b01" - "c00120012000280298014101200241021028417141ac93c0004121102d200041003b01c001" - "20012000280298014101200241021029417141cd93c0004122102d200041003b01c0012001" - "20002802980120034114410120024102102a417141ef93c0004124102d200041003b01c001" - "200341142001200028029801410120024102102a4171419394c0004124102d200041003b01" - "c001200120002802980120024102102b417141b794c0004123102d200041003b01c0012001" - "200028029801410120024102102c417141da94c0004122102d200041003b01c00120012000" - "2802980141f187c000412020024102101a417141fc94c000411c102d200520002802980141" - "f187c0004120410010014173419188c0004119102d20012000280298012001418120410010" - "01417441aa88c000410e102d200141812042011000417441b888c0004112102d200041e001" - "6a240041010f0b418080c000410b417f20062006417f4e1bac1000000b418080c000410b41" - "7f20042004417f4e1bac1000000b0ba2150100418080c0000b98156572726f725f636f6465" - "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" - "54494f4e2024242424246765745f626173655f666565746573745f616d656e646d656e7461" - "6d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f74" - "785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f617272" - "61795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f" - "6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e657374" - "65645f61727261795f6c656e7570646174655f6461746174657374206d6573736167657465" - "7374207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e" - "66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c65646765" - "725f73716e5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c6964" - "5f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074" - "726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74" - "785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e6573" - "7465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a" - "5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e747261" - "63655f6e756d5f77726f6e675f6c656e5f7374726765745f63757272656e745f6c65646765" - "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c6564" - "6765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f74" - "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" - "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" - "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" - "675f736c69636574726163655f6f6f625f736c69636563616368655f6c65646765725f6f62" - "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" - "726f6e675f73697a655f75696e743235365553443030303030303030303030303030303030" - "30303030303030303030303030303030303030303030303030303030303030316765745f6e" - "66745f77726f6e675f73697a655f737472696e6774726163655f746f6f5f6c6f6e67747261" - "63655f6e756d5f746f6f5f6c6f6e676765745f6c65646765725f73716e6765745f70617265" - "6e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f6861736867" - "65745f6c65646765725f6163636f756e745f686173686765745f6c65646765725f74785f68" - "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" - "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" - "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" - "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" - "6765745f6e66745f73657269616c6765745f6c65646765725f73716e5f6e65675f6c656e67" - "65745f6c65646765725f73716e5f6275665f746f6f5f736d616c6c6765745f6c6564676572" - "5f73716e5f6c656e5f746f6f5f6c6f6e676163636f756e745f6b65796c65745f6c656e5f74" - "6f6f5f6c6f6e676163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" - "65796c65745f6c656e5f746f6f5f6c6f6e675f63757272656e63796c696e655f6b65796c65" - "745f77726f6e675f6c656e5f63757272656e63796765745f74785f6669656c645f696e7661" - "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" - "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" - "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" - "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" - "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" - "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" - "3531325f68616c665f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c" - "65745f746f6f5f6269675f736c6963656765745f6e66745f77726f6e675f73697a655f7569" - "6e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235" - "366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f" - "6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f7072" - "65617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74696431646570" - "6f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646573" - "63726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964326e66745f6f666665725f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964327369676e6572735f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469" - "64004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d6279010572757374631d312e38352e31202834656231363132353020323032352d" - "30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c" - "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c" - "746976616c7565"; + "745f73657269616c000108686f73745f6c69620d74726163655f6163636f756e7400010868" + "6f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620b6c696e655f" + "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" + "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400020868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" + "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000208686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000208686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000208686f73745f6c69620c6f666665725f6b65796c" + "6574000208686f73745f6c69620d6f7261636c655f6b65796c6574000208686f73745f6c69" + "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" + "6e65645f646f6d61696e5f6b65796c6574000208686f73745f6c69620e7369676e6572735f" + "6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574000208686f73" + "745f6c69620c7661756c745f6b65796c657400020303020a0505030100110619037f014180" + "80c0000b7f0041f599c0000b7f0041809ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020adf25024600" + "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b952502087f" + "027e230041f0016b22002400419680c000412341004100410010001a200041003602602000" + "41e0006a220141041002410441b88ac000410e103420004100360260200141041003410441" + "c68ac00041161034200041f8006a22044200370300200041f0006a22034200370300200041" + "e8006a2202420037030020004200370360200141201004412041dc8ac00041161034200442" + "00370300200342003703002002420037030020004200370360200141201005412041f28ac0" + "00411710342004420037030020034200370300200242003703002000420037036020014120" + "1006412041898bc000411210341007410a41b980c000410c1034200041206a428182848890" + "a0c08001370300200041186a428182848890a0c08001370300200041106a428182848890a0" + "c080013703002000428182848890a0c0800137030841c580c000410e1008410141d380c000" + "41111034200041086a41201008410141d380c0004111103420034100360200200242003703" + "0020004200370360024041818020200141141009220541144604402000412e6a20002d0062" + "3a0000200020002900673703c8012000200041ec006a2900003700cd01200041386a200029" + "00cd01370000200020002f01603b012c2000200028006336002f200020002903c801370033" + "200442003703002003420037030020024200370300200042003703602000412c6a41142001" + "4120100a22044120470d01200041c2006a20002d00623a0000200041d0016a200041ef006a" + "2900002208370300200041d8016a200041f7006a2900002209370300200041cf006a200837" + "0000200041d7006a2009370000200041df006a200041ff006a2d00003a0000200020002f01" + "603b01402000200028006336004320002000290067370047200041406b41204100100b4101" + "41e480c0004110103420034100360200200242003703002000420037036041818020200141" + "14100c4114419b8bc000411c10342003410036020020024200370300200042003703604101" + "4181802020014114100d411441b78bc0004114103402402001410020016b41037122036a22" + "0220014d0d0020030440200321040340200141003a0000200141016a2101200441016b2204" + "0d000b0b200341016b4107490d000340200141003a0000200141076a41003a000020014106" + "6a41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a000020" + "0141026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c4" + "0020036b2203417c716a220120024b0440034020024100360200200241046a22022001490d" + "000b0b024020012003410371220320016a22044f0d002003220204400340200141003a0000" + "200141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a0000" + "200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a4100" + "3a0000200141036a41003a0000200141026a41003a0000200141016a41003a000020014108" + "6a22012004470d000b0b2000418180203602c801410021010340200741c000490440200041" + "e0006a20076a200041c8016a20016a2d00003a0000200020002802a00141016a22073602a0" + "01200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a220542" + "00370300200042003703c801200041e0006a22012007200041c8016a22044114100e411441" + "cb8bc000411310342002410036020020054200370300200042003703c801200120002802a0" + "0120044114100f411441de8bc0004123103420024100360200200542003703002000420037" + "03c8014101200120002802a001200441141010411441818cc000411b10344189803c101141" + "2041f480c000411010344189803c10124120418481c0004120103441014189803c10134120" + "41a481c00041181034200120002802a0011014412041bc81c00041171034200120002802a0" + "011015412041d381c000412710344101200120002802a0011016412041fa81c000411f1034" + "2000412c6a2203411410174100419982c000410b1034200041e0016a220742003703002002" + "420037030020054200370300200042003703c801200120002802a001200441201018412041" + "9c8cc0004113103441a482c000410c41b082c000410b41bb82c000410e1019410141c982c0" + "0041091034200041c0016a200041206a290300370300200041b8016a200041186a29030037" + "0300200041b0016a200041106a290300370300200020002903083703a801200241003b0100" + "20054200370300200042003703c80120034114200041a8016a2206412020044112101a4112" + "41af8cc000410710342002410036020020054200370300200042003703c801200641202004" + "4114101b411441b68cc000410e1034200041003602c8012006412020044104101c410441c4" + "8cc000410d103420064120101d410841d282c000410d103420064120101e410a41df82c000" + "41141034200041003602c8012006412020044104101f410441d18cc000410e1034417f4104" + "1002417141f382c00041161034200041003602c8012004417f1002417141df8cc000411610" + "34200041ca016a41003a0000200041003b01c801200441031002417d41f58cc000411c1034" + "200041003602c8012004418094ebdc031002417341918dc000411b1034418983c000410d20" + "0341141020412f419683c000410d1034418983c000410d41a383c00041081021411341ab83" + "c000410c103441021011416f41b783c000411f1034417f20002802a0011014417141d683c0" + "00411f10342001417f1014417141f583c000411f1034200141812010144174419484c00041" + "201034200041e094ebdc036a220620002802a0011014417341b484c000411f103420062000" + "2802a0014101100b417341d384c00041181034200120002802a0014101100b417141eb84c0" + "00411a1034200742003703002002420037030020054200370300200042003703c801200620" + "002802a00120044120100a417341ac8dc00041161034200742003703002002420037030020" + "054200370300200042003703c801200120002802a00120044120100a417141c28dc0004118" + "1034200742003703002002420037030020054200370300200042003703c801200341142003" + "4114200620002802a001200441201022417341da8dc000411c103420074200370300200242" + "0037030020054200370300200042003703c8012003411420034114200120002802a0012004" + "41201022417141f68dc000411e103420074200370300200242003703002005420037030020" + "0042003703c80141e199c0004114200620002802a001200441201023417341948ec0004119" + "1034200742003703002002420037030020054200370300200042003703c80141e199c00041" + "14200120002802a001200441201023417141ad8ec000411f10342007420037030020024200" + "37030020054200370300200042003703c80141e199c0004114418585c00041142004412010" + "23417141cc8ec00041291034200041dc016a2000413c6a280100360200200041d4016a2000" + "41346a2901003702002000200029012c3702cc01200041808080083602c801200041003b01" + "ec012004411841e199c0004114200041ec016a220241021023417141f58ec000410e103420" + "0620002802a001422a10014173419985c00041111034200041003b01ec0141022002410210" + "09416f41838fc000411b1034200041003b01ec01410220024102100c416f419e8fc000412b" + "1034200041003b01ec014101410220024102100d416f41c98fc0004123103441021011416f" + "41b783c000411f103441021012416f41aa85c000412f1034410141021013416f41d985c000" + "4127103441c580c00041812010084174418086c000411f103441c580c00041c10010084174" + "419f86c000411a1034200041003b01ec01200141812020024102100e417441ec8fc0004121" + "1034200041003b01ec01200141812020024102100f4174418d90c00041311034200041003b" + "01ec0141012001418120200241021010417441be90c0004129103420014181201014417441" + "b986c0004125103420014181201015417441de86c000413510344101200141812010164174" + "419387c000412d103420014181201017417441c087c00041191034418983c00041812041b0" + "82c000410b41bb82c000410e1019417441c982c00041091034418983c000410d41b082c000" + "41812041bb82c000410e1019417441c982c00041091034418983c000410d41b082c000410b" + "41bb82c0004181201019417441c982c00041091034200041003b01ec012001418120200241" + "021018417441e790c00041211034200041003b01ec0141e199c00041812041e199c0004114" + "2002410210234174418891c00041181034200041003b01ec01200341142003411420014181" + "20200241021024417441a091c000411f1034200041003b01ec012004418120200341142002" + "41021025417441bf91c00041221034418983c000410d200620002802a00141001000417341" + "d987c000410f1034418983c000410d200620002802a0011021417341e887c0004116103420" + "0120002802a0014100100b417141fe87c00041231034200041003b01ec0120034114200120" + "002802a00120024102101a417141e191c000411a1034200041003b01ec01200120002802a0" + "0120024102101b417141fb91c00041211034200041003b01ec01200120002802a001200241" + "02101c4171419c92c00041201034200120002802a001101d417141a188c000412010342001" + "20002802a001101e417141c188c00041271034200041003602ec01200120002802a0012002" + "4104101f417141bc92c00041211034200041003b01ec01200120002802a00120024102100a" + "417141dd92c00041231034200041003b01ec01200120002802a00141012002410210264171" + "418093c00041211034200041003b01ec01200120002802a001220520034114200120052002" + "41021024417141a193c00041271034200041003b01ec0120034114200120002802a0012205" + "20012005200241021024417141c893c00041271034200041003b01ec01200120002802a001" + "20034114200241021027417141ef93c00041251034200041003b01ec012003411420012000" + "2802a0012002410210274171419494c00041251034200041003b01ec01200120002802a001" + "20034114200241021028417141b994c000412c1034200041003b01ec012003411420012000" + "2802a001200241021028417141e594c000412c1034200041003b01ec01200120002802a001" + "2002410210294171419195c000411f1034200041003b01ec01200120002802a00141012002" + "4102102a417141b095c00041221034200041003b01ec01200120002802a001200341144185" + "85c0004114200241021022417141d295c00041211034200041003b01ec0120034114200120" + "002802a001418585c0004114200241021022417141f395c00041211034200041003b01ec01" + "200120002802a001410120024102102b4171419496c00041281034200041003b01ec012004" + "4118200120002802a001200241021025417141bc96c00041231034200041003b01ec012001" + "20002802a001410120024102102c417141df96c00041251034200041003b01ec0120012000" + "2802a001410120024102102d4171418497c00041211034200041003b01ec01200120002802" + "a001410120024102102e417141a597c00041221034200041003b01ec01200120002802a001" + "20034114410120024102102f417141c797c00041241034200041003b01ec01200341142001" + "20002802a001410120024102102f417141eb97c00041241034200041003b01ec0120012000" + "2802a00141012002410210304171418f98c000412f1034200041003b01ec01200120002802" + "a001200241021031417141be98c00041231034200041003b01ec01200120002802a0014101" + "200241021032417141e198c00041221034200041003b01ec01200120002802a00141012002" + "410210334171418399c00041211034200041003b01ec01200120002802a00141e888c00041" + "2020024102101a417141a499c000411c1034418983c000410d200120002802a00110204171" + "418889c00041221034418997abdd03410d41e888c000412041001000417341aa89c0004110" + "1034418997abdd03410d200341141020417341ba89c00041181034418997abdd03410d41a3" + "83c00041081021417341d289c00041171034200120002802a0012001418120410010004174" + "41e989c000410e1034200141812042011001417441f789c00041121034418983c000418120" + "200341141020417441898ac00041161034418983c00041812041a383c00041081021417441" + "898ac00041161034418983c000410d200120002802a00110214171419f8ac0004119103420" + "0041003b01ec01200120002802a00120034114200241021025417141c099c0004121103420" + "0041f0016a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c0" + "00410b417f20042004417f4e1bac1001000b0beb190100418080c0000be1196572726f725f" + "636f64653d54455354204641494c45442424242424205354415254494e47205741534d2045" + "5845435554494f4e2024242424246765745f626173655f666565746573745f616d656e646d" + "656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a67" + "65745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e676574" + "5f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f" + "6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361" + "676574657374207075626b657974657374207369676e6174757265636865636b5f73696767" + "65745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c" + "65646765725f73716e5f6e65675f70747274657374696e6720747261636574726163655f61" + "63636f756e74400000000000005f74726163655f616d6f756e746765745f74785f61727261" + "795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f617272" + "61795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e" + "5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c" + "6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62636163" + "68655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a" + "5f77726f6e675f6c656e555344303030303030303030303030303030303074726163655f6e" + "756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6172" + "7261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c" + "65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f" + "5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f" + "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6172" + "7261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f64" + "6174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472616365" + "5f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f77726f" + "6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f7369" + "7a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f" + "73697a655f75696e7432353630303030303030303030303030303030303030303030303030" + "3030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f75" + "6e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f6f6f62" + "5f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f74" + "6f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6163636f756e" + "745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765" + "745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d65676574" + "5f706172656e745f6c65646765725f686173686765745f6c65646765725f6163636f756e74" + "5f686173686765745f6c65646765725f74785f686173686765745f63757272656e745f6c65" + "646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c64676574" + "5f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f66" + "69656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e6674" + "5f6973737565726765745f6e66745f7461786f6e6765745f6e66745f73657269616c676574" + "5f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f627566" + "5f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e67" + "6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f" + "77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e6379" + "6c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b6579" + "6c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e" + "675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f" + "7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f" + "6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f" + "6f626a5f6669656c645f696e76616c69645f736669656c646765745f74785f6e6573746564" + "5f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c" + "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c69636563" + "6f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b" + "65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f" + "746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f73" + "6c6963655f6d707469646765745f6e66745f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" + "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" + "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" + "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" + "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" + "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index d1552df5a50..08058e45c5a 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -268,6 +269,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + ammKeylet(Asset const& issue1, Asset const& issue2) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected checkKeylet(AccountID const& account, std::uint32_t seq) { @@ -316,6 +323,18 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected nftOfferKeylet(AccountID const& account, std::uint32_t seq) { @@ -343,6 +362,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected signersKeylet(AccountID const& account) { @@ -355,6 +380,12 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected getNFT(AccountID const& account, uint256 const& nftId) { @@ -403,12 +434,24 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceAccount(std::string_view const& msg, AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected traceFloat(std::string_view const& msg, Slice const& data) { return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + traceAmount(std::string_view const& msg, STAmount const& amount) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual Expected floatFromInt(int64_t x, int32_t mode) { diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 4067afccb47..78fcde3f577 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -160,6 +160,9 @@ class WasmHostFunctionsImpl : public HostFunctions Expected accountKeylet(AccountID const& account) override; + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override; + Expected checkKeylet(AccountID const& account, std::uint32_t seq) override; @@ -189,6 +192,12 @@ class WasmHostFunctionsImpl : public HostFunctions AccountID const& account2, Currency const& currency) override; + Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override; + + Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) override; + Expected nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; @@ -204,12 +213,19 @@ class WasmHostFunctionsImpl : public HostFunctions AccountID const& destination, std::uint32_t seq) override; + Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + override; + Expected signersKeylet(AccountID const& account) override; Expected ticketKeylet(AccountID const& account, std::uint32_t seq) override; + Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) override; + Expected getNFT(AccountID const& account, uint256 const& nftId) override; @@ -234,9 +250,16 @@ class WasmHostFunctionsImpl : public HostFunctions Expected traceNum(std::string_view const& msg, int64_t data) override; + Expected + traceAccount(std::string_view const& msg, AccountID const& account) + override; + Expected traceFloat(std::string_view const& msg, Slice const& data) override; + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override; + Expected floatFromInt(int64_t x, int32_t mode) override; diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index a6cbd91b188..b7d10026357 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -203,6 +203,19 @@ accountKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using ammKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +ammKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using checkKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -282,6 +295,27 @@ lineKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using mptIssuanceKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using mptokenKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using nftOfferKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* @@ -320,6 +354,14 @@ paychanKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using permissionedDomainKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* signersKeylet_wrap( @@ -335,6 +377,14 @@ ticketKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using vaultKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using getNFT_proto = int32_t( uint8_t const*, int32_t, @@ -389,6 +439,14 @@ using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceAccount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using traceFloat_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* @@ -397,6 +455,14 @@ traceFloat_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); +using traceAmount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); wasm_trap_t* floatFromInt_wrap( diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 441caddd77b..050bf643145 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -185,12 +185,6 @@ getAnyFieldData(STBase const* obj) return Bytes{b, e}; } break; - case STI_UINT256: { - auto const* num(static_cast const*>(obj)); - auto const& data = num->value(); - return Bytes{data.begin(), data.end()}; - } - break; default: break; // default to serializer } @@ -486,6 +480,20 @@ WasmHostFunctionsImpl::accountKeylet(AccountID const& account) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) +{ + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + // note: this should be removed with the MPT DEX amendment + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) { @@ -574,6 +582,32 @@ WasmHostFunctionsImpl::lineKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::mptIssuanceKeylet( + AccountID const& issuer, + std::uint32_t seq) +{ + if (!issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptIssuance(seq, issuer); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptokenKeylet( + MPTID const& mptid, + AccountID const& holder) +{ + if (!mptid) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!holder) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptoken(mptid, holder); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::nftOfferKeylet( AccountID const& account, @@ -619,6 +653,17 @@ WasmHostFunctionsImpl::paychanKeylet( return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::permissionedDomainKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::permissionedDomain(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::signersKeylet(AccountID const& account) { @@ -637,6 +682,15 @@ WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) return Bytes{keylet.key.begin(), keylet.key.end()}; } +Expected +WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::vault(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + Expected WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) { @@ -733,6 +787,24 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) return msg.size() + sizeof(data); } +Expected +WasmHostFunctionsImpl::traceAccount( + std::string_view const& msg, + AccountID const& account) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT(" << leKey.key << "): " << msg << " " + << accountStr; + return msg.size() + accountStr.size(); +} + Expected WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, @@ -748,6 +820,21 @@ WasmHostFunctionsImpl::traceFloat( return msg.size() + s.size(); } +Expected +WasmHostFunctionsImpl::traceAmount( + std::string_view const& msg, + STAmount const& amount) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; + return msg.size() + amountStr.size(); +} + Expected WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) { diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 75f072be2a1..1bd9622a4c3 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -79,7 +80,7 @@ getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataUint64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { auto const r = getDataSlice(runtime, params, i); if (!r) @@ -186,6 +187,45 @@ getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) return Currency::fromVoid(slice->data()); } +template +static Expected +getDataAsset(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() == MPTID::bytes) + { + auto const mptid = MPTID::fromVoid(slice->data()); + return Asset{mptid}; + } + + if (slice->size() == Currency::bytes) + { + auto const currency = Currency::fromVoid(slice->data()); + auto const issue = Issue{currency, xrpAccount()}; + if (!issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + if (slice->size() == (AccountID::bytes + Currency::bytes)) + { + auto const issue = Issue( + Currency::fromVoid(slice->data()), + AccountID::fromVoid(slice->data() + Currency::bytes)); + + if (issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + return Unexpected(HostFunctionError::INVALID_PARAMS); +} + template Expected getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) @@ -796,6 +836,33 @@ accountKeylet_wrap( runtime, params, results, hf->accountKeylet(*acc), index); } +wasm_trap_t* +ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const issue1 = getDataAsset(runtime, params, index); + if (!issue1) + { + return hfResult(results, issue1.error()); + } + + auto const issue2 = getDataAsset(runtime, params, index); + if (!issue2) + { + return hfResult(results, issue2.error()); + } + + return returnResult( + runtime, + params, + results, + hf->ammKeylet(issue1.value(), issue2.value()), + index); +} + wasm_trap_t* checkKeylet_wrap( void* env, @@ -997,6 +1064,72 @@ lineKeylet_wrap( index); } +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->mptIssuanceKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() != MPTID::bytes) + { + return hfResult(results, HostFunctionError::INVALID_PARAMS); + } + auto const mptid = MPTID::fromVoid(slice->data()); + + auto const holder = getDataAccountID(runtime, params, index); + if (!holder) + { + return hfResult(results, holder.error()); + } + + return returnResult( + runtime, + params, + results, + hf->mptokenKeylet(mptid, holder.value()), + index); +} + wasm_trap_t* nftOfferKeylet_wrap( void* env, @@ -1118,6 +1251,36 @@ paychanKeylet_wrap( index); } +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->permissionedDomainKeylet(acc.value(), seq.value()), + index); +} + wasm_trap_t* signersKeylet_wrap( void* env, @@ -1168,6 +1331,36 @@ ticketKeylet_wrap( index); } +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->vaultKeylet(acc.value(), seq.value()), + index); +} + wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { @@ -1352,6 +1545,31 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->traceNum(*msg, *number), index); } +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const account = getDataAccountID(runtime, params, i); + if (!account) + return hfResult(results, account.error()); + + return returnResult( + runtime, params, results, hf->traceAccount(*msg, *account), i); +} + wasm_trap_t* traceFloat_wrap( void* env, @@ -1377,6 +1595,46 @@ traceFloat_wrap( runtime, params, results, hf->traceFloat(*msg, *number), i); } +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const amountSliceOpt = getDataSlice(runtime, params, i); + if (!amountSliceOpt) + return hfResult(results, amountSliceOpt.error()); + + auto const amountSlice = amountSliceOpt.value(); + auto serialIter = SerialIter(amountSlice); + + std::optional amount; + try + { + amount = STAmount(serialIter, sfGeneric); + } + catch (std::exception const&) + { + amount = std::nullopt; + } + if (!amount || !amount.value()) + return hfResult(results, HostFunctionError::INVALID_PARAMS); + + return returnResult( + runtime, params, results, hf->traceAmount(*msg, *amount), i); +} + wasm_trap_t* floatFromInt_wrap( void* env, @@ -1411,7 +1669,7 @@ floatFromUint_wrap( auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; - auto const x = getDataUint64(runtime, params, i); + auto const x = getDataUInt64(runtime, params, i); if (!x) return hfResult(results, x.error()); @@ -1654,6 +1912,7 @@ floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) runtime, params, results, hf->floatLog(*x, *rounding), i); } +// LCOV_EXCL_START namespace test { class MockInstanceWrapper @@ -1673,7 +1932,6 @@ class MockInstanceWrapper } }; -// LCOV_EXCL_START bool testGetDataIncrement() { @@ -1800,7 +2058,8 @@ testGetDataIncrement() return true; } -// LCOV_EXCL_STOP } // namespace test +// LCOV_EXCL_STOP + } // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 6ea15f42abf..d9dd67860d8 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -45,6 +45,7 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); @@ -58,9 +59,12 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); @@ -68,21 +72,29 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptIssuanceKeylet, "mpt_issuance_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptokenKeylet, "mptoken_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, permissionedDomainKeylet, "permissioned_domain_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, vaultKeylet, "vault_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); + WASM_IMPORT_FUNC (i, trace, hfs, 500); WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAccount, "trace_account", hfs, 500); WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAmount, "trace_amount", hfs, 500); WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); From 8c38ef726b8d00a40fc71106376e84b41ff4be00 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 26 Aug 2025 15:04:27 -0400 Subject: [PATCH 057/212] chore: exclude a bunch of code that doesn't need to be tested from codecov (#5721) * exclude the bulk of HostFunc.h from codecov * fix codecov (maybe) * adjust * more codecov excl --- src/xrpld/app/wasm/HostFunc.h | 2 ++ src/xrpld/app/wasm/detail/WamrVM.cpp | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 08058e45c5a..56ce33e69d3 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -99,6 +99,7 @@ floatLogImpl(Slice const& x, int32_t mode); struct HostFunctions { + // LCOV_EXCL_START virtual void setRT(void const*) { @@ -519,6 +520,7 @@ struct HostFunctions } virtual ~HostFunctions() = default; + // LCOV_EXCL_STOP }; } // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index 413240559b8..e47a618f12a 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -35,6 +35,7 @@ namespace ripple { namespace { +// LCOV_EXCL_START static log_level_t getLogLevel(beast::severities::Severity severity) { @@ -155,6 +156,7 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) j << std::endl; #endif } +// LCOV_EXCL_STOP } // namespace @@ -525,14 +527,20 @@ ModuleWrapper::buildImports( imp.udata, nullptr); if (!func) + { + // LCOV_EXCL_START throw std::runtime_error( - "can't create import function " + - imp.name); // LCOV_EXCL_LINE + "can't create import function " + imp.name); + // LCOV_EXCL_STOP + } if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + { + // LCOV_EXCL_START throw std::runtime_error( - "can't set gas for import function " + - imp.name); // LCOV_EXCL_LINE + "can't set gas for import function " + imp.name); + // LCOV_EXCL_STOP + } wimports.data[i] = wasm_func_as_extern(func); ++impCnt; From 697d1470f4a8972e84cacb9b8483ae9a16a63b4f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 27 Aug 2025 13:58:27 -0400 Subject: [PATCH 058/212] change: adjust the function signatures for `get_ledger_sqn` and `get_parent_ledger_time` (#5733) --- src/test/app/Escrow_test.cpp | 41 +- src/test/app/HostFuncImpl_test.cpp | 33 +- src/test/app/TestHostFunctions.h | 13 +- src/test/app/Wasm_test.cpp | 428 ++++--- .../all_host_functions/Cargo.lock | 4 +- .../all_host_functions/Cargo.toml | 2 +- .../all_host_functions/src/lib.rs | 174 +-- .../app/wasm_fixtures/all_keylets/Cargo.lock | 2 +- .../app/wasm_fixtures/all_keylets/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 2 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../codecov_tests/src/host_bindings_loose.rs | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 64 +- src/test/app/wasm_fixtures/copyFixtures.py | 6 +- src/test/app/wasm_fixtures/fixtures.cpp | 1052 ++++++++--------- src/test/app/wasm_fixtures/ledgerSqn.c | 14 +- src/xrpld/app/wasm/HostFunc.h | 4 +- src/xrpld/app/wasm/HostFuncImpl.h | 4 +- src/xrpld/app/wasm/HostFuncWrapper.h | 4 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 14 +- 20 files changed, 904 insertions(+), 963 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index a6861a252c6..6721eed12f9 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2006,7 +2006,7 @@ struct Escrow_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 71; + std::uint32_t const allowance = 66; { // basic FinishFunction situation @@ -2053,8 +2053,9 @@ struct Escrow_test : public beast::unit_test::suite { auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); } env(escrow::finish(alice, alice, seq), @@ -2064,9 +2065,13 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 5, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2109,8 +2114,9 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - env.meta()->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); env.close(); // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), @@ -2136,7 +2142,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2187,7 +2195,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 13, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); } @@ -2227,8 +2237,9 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECT( - env.meta()->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); env.close(); // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), @@ -2240,7 +2251,9 @@ struct Escrow_test : public beast::unit_test::suite if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); @@ -2306,7 +2319,9 @@ struct Escrow_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == 39'596); + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == 38'571, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 38d1cd0237a..a198ba4af44 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -119,18 +119,35 @@ struct HostFuncImpl_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + env.current() + ->parentCloseTime() + .time_since_epoch() + .count()); + } - auto const result = hfs.getParentLedgerTime(); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - env.current()->parentCloseTime().time_since_epoch().count()); + env.close( + env.now() + + std::chrono::seconds(std::numeric_limits::max() - 1)); + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECTS( + !result.has_value(), std::to_string(result.value()))) + BEAST_EXPECT(result.error() == HostFunctionError::INTERNAL); + } } void diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 9cacaa4c8c2..ae4db59b0d0 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -52,10 +52,10 @@ struct TestLedgerDataProvider : public HostFunctions return rt_; } - Expected + Expected getLedgerSqn() override { - return static_cast(env_->current()->seq()); + return env_->current()->seq(); } }; @@ -94,17 +94,16 @@ struct TestHostFunctions : public HostFunctions return env_.journal; } - Expected + Expected getLedgerSqn() override { - return static_cast(env_.current()->seq()); + return 12345; } - Expected + Expected getParentLedgerTime() override { - return env_.current()->parentCloseTime().time_since_epoch().count() + - clock_drift_; + return 67890; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c09b366b7f4..a48e16f1eb0 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -52,6 +52,160 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(testGetDataIncrement()); } + void + testWasmLib() + { + testcase("wasmtime lib test"); + // clang-format off + /* The WASM module buffer. */ + Bytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + } + } + + void + testBadWasm() + { + testcase("bad wasm test"); + + using namespace test::jtx; + + Env env{*this}; + HostFunctions hfs; + + { + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + BEAST_EXPECT(!re); + } + + { + auto wasmHex = "00112233445566778899AA"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + + { + // FinishFunction wrong function name + // pub fn bad() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" + "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" + "100041044a0b004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + auto const re = preflightEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + } + + void + testWasmLedgerSqn() + { + testcase("Wasm get ledger sequence"); + + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider hf(&env); + + std::vector imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &hf, + 1'000'000, + env.journal); + + // code takes 11 gas + 1 getLedgerSqn call + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 39, std::to_string(re->cost)); + } + + env.close(); + env.close(); + + // empty module - run the same instance + re = engine.run( + {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); + + // code takes 22 gas + 2 getLedgerSqn calls + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 78, std::to_string(re->cost)); + } + } + void testWasmFib() { @@ -109,7 +263,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); } } @@ -126,7 +280,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS( re->cost == 4'191'711'969ll, std::to_string(re->cost)); } @@ -144,164 +298,81 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); } } void - testWasmLedgerSqn() + testHFCost() { - testcase("Wasm get ledger sequence"); - - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + testcase("wasm test host functions cost"); using namespace test::jtx; - Env env{*this}; - TestLedgerDataProvider hf(&env); + Env env(*this); + { + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); - std::vector imports; - WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); - auto& engine = WasmEngine::instance(); + auto& engine = WasmEngine::instance(); - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - &hf, - 1'000'000, - env.journal); + TestHostFunctions hfs(env, 0); + std::vector imp = createWasmImport(&hfs); + for (auto& i : imp) + i.gas = 0; - // code takes 11 gas + 1 getLedgerSqn call - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(!re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 44, std::to_string(re->cost)); + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 847, std::to_string(re->cost)); + } + + env.close(); } env.close(); env.close(); env.close(); env.close(); - - // empty module - run the same instance - re = engine.run( - {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); - - // code takes 22 gas + 2 getLedgerSqn calls - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 88, std::to_string(re->cost)); - } - } - - void - testWasmLib() - { - testcase("wasmtime lib test"); - // clang-format off - /* The WASM module buffer. */ - Bytes const wasm = {/* WASM header */ - 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, - /* Type section */ - 0x01, 0x07, 0x01, - /* function type {i32, i32} -> {i32} */ - 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, - /* Import section */ - 0x02, 0x13, 0x01, - /* module name: "extern" */ - 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, - /* extern name: "func-add" */ - 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, - /* import desc: func 0 */ - 0x00, 0x00, - /* Function section */ - 0x03, 0x02, 0x01, 0x00, - /* Export section */ - 0x07, 0x0A, 0x01, - /* export name: "addTwo" */ - 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, - /* export desc: func 0 */ - 0x00, 0x01, - /* Code section */ - 0x0A, 0x0A, 0x01, - /* code body */ - 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; - // clang-format on - auto& vm = WasmEngine::instance(); - - std::vector imports; - WasmImpFunc( - imports, "func-add", reinterpret_cast(&Add)); - - auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); - - // if (res) printf("invokeAdd get the result: %d\n", res.value()); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); - } - } - - void - testBadWasm() - { - testcase("bad wasm test"); - - using namespace test::jtx; - - Env env{*this}; - HostFunctions hfs; + env.close(); { - auto wasmHex = "00000000"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); - auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); - BEAST_EXPECT(!re); - } + auto& engine = WasmEngine::instance(); - { - auto wasmHex = "00112233445566778899AA"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); - std::string funcName("mock_escrow"); + TestHostFunctions hfs(env, 0); + std::vector const imp = createWasmImport(&hfs); - auto const re = - preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); - BEAST_EXPECT(!isTesSuccess(re)); - } + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); - { - // FinishFunction wrong function name - // pub fn bad() -> bool { - // unsafe { host_lib::getLedgerSqn() >= 5 } - // } - auto const badWasmHex = - "0061736d010000000105016000017f02190108686f73745f6c69620c6765" - "744c656467657253716e00000302010005030100100611027f00418080c0" - "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" - "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" - "100041044a0b004d0970726f64756365727302086c616e67756167650104" - "52757374000c70726f6365737365642d6279010572757374631d312e3835" - "2e31202834656231363132353020323032352d30332d31352900490f7461" - "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" - "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + } - auto const re = preflightEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); - BEAST_EXPECT(!isTesSuccess(re)); + env.close(); } } @@ -322,8 +393,8 @@ struct Wasm_test : public beast::unit_test::suite runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); } } @@ -345,7 +416,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); } } @@ -367,7 +438,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'831, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); } } @@ -428,79 +499,6 @@ struct Wasm_test : public beast::unit_test::suite } } - void - testHFCost() - { - testcase("wasm test host functions cost"); - - using namespace test::jtx; - - Env env(*this); - { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - auto& engine = WasmEngine::instance(); - - TestHostFunctions hfs(env, 0); - std::vector imp = createWasmImport(&hfs); - for (auto& i : imp) - i.gas = 0; - - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - &hfs, - 1'000'000, - env.journal); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 872, std::to_string(re->cost)); - } - - env.close(); - } - - env.close(); - env.close(); - env.close(); - env.close(); - env.close(); - - { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); - - auto& engine = WasmEngine::instance(); - - TestHostFunctions hfs(env, 0); - std::vector const imp = createWasmImport(&hfs); - - auto re = engine.run( - wasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - &hfs, - 1'000'000, - env.journal); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 41'132, std::to_string(re->cost)); - } - - env.close(); - } - } - void testFloat() { @@ -520,7 +518,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); } env.close(); @@ -535,7 +533,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); if (BEAST_EXPECT(re.has_value())) { - BEAST_EXPECTS(re->result, std::to_string(re->result)); + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); } env.close(); @@ -651,7 +649,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 119'883; + auto const allowance = 121'895; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock index 13931f02298..7f6a6bc7175 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -11,5 +11,5 @@ dependencies = [ [[package]] name = "xrpl-std" -version = "0.0.1" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +version = "0.5.1-devnet5" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml index 4c3455b3ca8..959056f374e 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index b685de59dac..c8a27aed876 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -27,14 +27,14 @@ extern crate std; use xrpl_std::core::current_tx::escrow_finish::EscrowFinish; use xrpl_std::core::current_tx::traits::TransactionCommonFields; -use xrpl_std::host::trace::{DataRepr, trace_data, trace_num}; -use xrpl_std::host::*; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_account_buf, trace_data, trace_num, DataRepr}; use xrpl_std::sfield; #[unsafe(no_mangle)] pub extern "C" fn finish() -> i32 { - let _ = trace_data("=== HOST FUNCTIONS TEST ===", &[], DataRepr::AsHex); - let _ = trace_data("Testing 26 host functions", &[], DataRepr::AsHex); + let _ = trace("=== HOST FUNCTIONS TEST ==="); + let _ = trace("Testing 26 host functions"); // Category 1: Ledger Header Data Functions (3 functions) // Error range: -100 to -199 @@ -85,11 +85,7 @@ pub extern "C" fn finish() -> i32 { err => return err, } - let _ = trace_data( - "SUCCESS: All host function tests passed!", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: All host function tests passed!"); 1 // Success return code for WASM finish function } @@ -98,48 +94,30 @@ pub extern "C" fn finish() -> i32 { /// - get_parent_ledger_time() - Get parent ledger timestamp /// - get_parent_ledger_hash() - Get parent ledger hash fn test_ledger_header_functions() -> i32 { - let _ = trace_data( - "--- Category 1: Ledger Header Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 1: Ledger Header Functions ---"); // Test 1.1: get_ledger_sqn() - should return current ledger sequence number - let mut ledger_sqn_buffer = [0u8; 8]; - let sqn_result = - unsafe { get_ledger_sqn(ledger_sqn_buffer.as_mut_ptr(), ledger_sqn_buffer.len()) }; + let sqn_result = unsafe { host::get_ledger_sqn() }; if sqn_result <= 0 { let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); return -101; // Ledger sequence number test failed } - let _ = trace_num("Ledger sequence number bytes:", sqn_result as i64); - let _ = trace_data( - "Ledger sqn data:", - &ledger_sqn_buffer[..sqn_result as usize], - DataRepr::AsHex, - ); + let _ = trace_num("Ledger sequence number:", sqn_result as i64); // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp - let mut time_buffer = [0u8; 8]; - let time_result = - unsafe { get_parent_ledger_time(time_buffer.as_mut_ptr(), time_buffer.len()) }; + let time_result = unsafe { host::get_parent_ledger_time() }; if time_result <= 0 { let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); return -102; // Parent ledger time test failed } - let _ = trace_num("Parent ledger time bytes:", time_result as i64); - let _ = trace_data( - "Parent time data:", - &time_buffer[..time_result as usize], - DataRepr::AsHex, - ); + let _ = trace_num("Parent ledger time:", time_result as i64); // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) let mut hash_buffer = [0u8; 32]; let hash_result = - unsafe { get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; + unsafe { host::get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; if hash_result != 32 { let _ = trace_num( @@ -150,24 +128,20 @@ fn test_ledger_header_functions() -> i32 { } let _ = trace_data("Parent ledger hash:", &hash_buffer, DataRepr::AsHex); - let _ = trace_data("SUCCESS: Ledger header functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Ledger header functions"); 0 } /// Test Category 2: Transaction Data Functions (5 functions) /// Tests all functions for accessing current transaction data fn test_transaction_data_functions() -> i32 { - let _ = trace_data( - "--- Category 2: Transaction Data Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 2: Transaction Data Functions ---"); // Test 2.1: get_tx_field() - Basic transaction field access // Test with Account field (required, 20 bytes) let mut account_buffer = [0u8; 20]; let account_len = unsafe { - get_tx_field( + host::get_tx_field( sfield::Account, account_buffer.as_mut_ptr(), account_buffer.len(), @@ -181,12 +155,13 @@ fn test_transaction_data_functions() -> i32 { ); return -201; // Basic transaction field test failed } - let _ = trace_data("Transaction Account:", &account_buffer, DataRepr::AsHex); + let _ = trace_account_buf("Transaction Account:", &account_buffer); // Test with Fee field (XRP amount - 8 bytes in new serialized format) // New format: XRP amounts are always 8 bytes (positive: value | cPositive flag, negative: just value) let mut fee_buffer = [0u8; 8]; - let fee_len = unsafe { get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; + let fee_len = + unsafe { host::get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; if fee_len != 8 { let _ = trace_num( @@ -205,7 +180,7 @@ fn test_transaction_data_functions() -> i32 { // Test with Sequence field (required, 4 bytes uint32) let mut seq_buffer = [0u8; 4]; let seq_len = - unsafe { get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; + unsafe { host::get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; if seq_len != 4 { let _ = trace_num( @@ -223,7 +198,7 @@ fn test_transaction_data_functions() -> i32 { let locator = [0x01, 0x00]; // Simple locator for first element let mut nested_buffer = [0u8; 32]; let nested_result = unsafe { - get_tx_nested_field( + host::get_tx_nested_field( locator.as_ptr(), locator.len(), nested_buffer.as_mut_ptr(), @@ -247,14 +222,15 @@ fn test_transaction_data_functions() -> i32 { } // Test 2.3: get_tx_array_len() - Get array length - let signers_len = unsafe { get_tx_array_len(sfield::Signers) }; + let signers_len = unsafe { host::get_tx_array_len(sfield::Signers) }; let _ = trace_num("Signers array length:", signers_len as i64); - let memos_len = unsafe { get_tx_array_len(sfield::Memos) }; + let memos_len = unsafe { host::get_tx_array_len(sfield::Memos) }; let _ = trace_num("Memos array length:", memos_len as i64); // Test 2.4: get_tx_nested_array_len() - Get nested array length with locator - let nested_array_len = unsafe { get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; + let nested_array_len = + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; if nested_array_len < 0 { let _ = trace_num( @@ -265,24 +241,20 @@ fn test_transaction_data_functions() -> i32 { let _ = trace_num("Nested array length:", nested_array_len as i64); } - let _ = trace_data("SUCCESS: Transaction data functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Transaction data functions"); 0 } /// Test Category 3: Current Ledger Object Functions (4 functions) /// Tests functions that access the current ledger object being processed fn test_current_ledger_object_functions() -> i32 { - let _ = trace_data( - "--- Category 3: Current Ledger Object Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 3: Current Ledger Object Functions ---"); // Test 3.1: get_current_ledger_obj_field() - Access field from current ledger object // Test with Balance field (XRP amount - 8 bytes in new serialized format) let mut balance_buffer = [0u8; 8]; let balance_result = unsafe { - get_current_ledger_obj_field( + host::get_current_ledger_obj_field( sfield::Balance, balance_buffer.as_mut_ptr(), balance_buffer.len(), @@ -320,7 +292,7 @@ fn test_current_ledger_object_functions() -> i32 { // Test with Account field let mut current_account_buffer = [0u8; 20]; let current_account_result = unsafe { - get_current_ledger_obj_field( + host::get_current_ledger_obj_field( sfield::Account, current_account_buffer.as_mut_ptr(), current_account_buffer.len(), @@ -333,18 +305,14 @@ fn test_current_ledger_object_functions() -> i32 { current_account_result as i64, ); } else { - let _ = trace_data( - "Current ledger object account:", - ¤t_account_buffer[..current_account_result as usize], - DataRepr::AsHex, - ); + let _ = trace_account_buf("Current ledger object account:", ¤t_account_buffer); } // Test 3.2: get_current_ledger_obj_nested_field() - Nested field access let locator = [0x01, 0x00]; // Simple locator let mut current_nested_buffer = [0u8; 32]; let current_nested_result = unsafe { - get_current_ledger_obj_nested_field( + host::get_current_ledger_obj_nested_field( locator.as_ptr(), locator.len(), current_nested_buffer.as_mut_ptr(), @@ -367,7 +335,7 @@ fn test_current_ledger_object_functions() -> i32 { } // Test 3.3: get_current_ledger_obj_array_len() - Array length in current object - let current_array_len = unsafe { get_current_ledger_obj_array_len(sfield::Signers) }; + let current_array_len = unsafe { host::get_current_ledger_obj_array_len(sfield::Signers) }; let _ = trace_num( "Current object Signers array length:", current_array_len as i64, @@ -375,7 +343,7 @@ fn test_current_ledger_object_functions() -> i32 { // Test 3.4: get_current_ledger_obj_nested_array_len() - Nested array length let current_nested_array_len = - unsafe { get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; if current_nested_array_len < 0 { let _ = trace_num( @@ -389,22 +357,14 @@ fn test_current_ledger_object_functions() -> i32 { ); } - let _ = trace_data( - "SUCCESS: Current ledger object functions", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: Current ledger object functions"); 0 } /// Test Category 4: Any Ledger Object Functions (5 functions) /// Tests functions that work with cached ledger objects fn test_any_ledger_object_functions() -> i32 { - let _ = trace_data( - "--- Category 4: Any Ledger Object Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 4: Any Ledger Object Functions ---"); // First we need to cache a ledger object to test the other functions // Get the account from transaction and generate its keylet @@ -414,7 +374,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.1: cache_ledger_obj() - Cache a ledger object let mut keylet_buffer = [0u8; 32]; let keylet_result = unsafe { - account_keylet( + host::account_keylet( account_id.0.as_ptr(), account_id.0.len(), keylet_buffer.as_mut_ptr(), @@ -431,7 +391,7 @@ fn test_any_ledger_object_functions() -> i32 { } let cache_result = - unsafe { cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; + unsafe { host::cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; if cache_result <= 0 { let _ = trace_num( @@ -446,7 +406,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_field with invalid slot let field_result = unsafe { - get_ledger_obj_field( + host::get_ledger_obj_field( 1, sfield::Balance, test_buffer.as_mut_ptr(), @@ -463,7 +423,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_nested_field with invalid slot let locator = [0x01, 0x00]; let nested_result = unsafe { - get_ledger_obj_nested_field( + host::get_ledger_obj_nested_field( 1, locator.as_ptr(), locator.len(), @@ -479,7 +439,7 @@ fn test_any_ledger_object_functions() -> i32 { } // Test get_ledger_obj_array_len with invalid slot - let array_result = unsafe { get_ledger_obj_array_len(1, sfield::Signers) }; + let array_result = unsafe { host::get_ledger_obj_array_len(1, sfield::Signers) }; if array_result < 0 { let _ = trace_num( "INFO: get_ledger_obj_array_len failed as expected:", @@ -489,7 +449,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test get_ledger_obj_nested_array_len with invalid slot let nested_array_result = - unsafe { get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; if nested_array_result < 0 { let _ = trace_num( "INFO: get_ledger_obj_nested_array_len failed as expected:", @@ -497,11 +457,7 @@ fn test_any_ledger_object_functions() -> i32 { ); } - let _ = trace_data( - "SUCCESS: Any ledger object functions (interface tested)", - &[], - DataRepr::AsHex, - ); + let _ = trace("SUCCESS: Any ledger object functions (interface tested)"); return 0; } @@ -512,7 +468,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.2: get_ledger_obj_field() - Access field from cached object let mut cached_balance_buffer = [0u8; 8]; let cached_balance_result = unsafe { - get_ledger_obj_field( + host::get_ledger_obj_field( slot, sfield::Balance, cached_balance_buffer.as_mut_ptr(), @@ -551,7 +507,7 @@ fn test_any_ledger_object_functions() -> i32 { let locator = [0x01, 0x00]; let mut cached_nested_buffer = [0u8; 32]; let cached_nested_result = unsafe { - get_ledger_obj_nested_field( + host::get_ledger_obj_nested_field( slot, locator.as_ptr(), locator.len(), @@ -575,7 +531,7 @@ fn test_any_ledger_object_functions() -> i32 { } // Test 4.4: get_ledger_obj_array_len() - Array length from cached object - let cached_array_len = unsafe { get_ledger_obj_array_len(slot, sfield::Signers) }; + let cached_array_len = unsafe { host::get_ledger_obj_array_len(slot, sfield::Signers) }; let _ = trace_num( "Cached object Signers array length:", cached_array_len as i64, @@ -583,7 +539,7 @@ fn test_any_ledger_object_functions() -> i32 { // Test 4.5: get_ledger_obj_nested_array_len() - Nested array length from cached object let cached_nested_array_len = - unsafe { get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; + unsafe { host::get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; if cached_nested_array_len < 0 { let _ = trace_num( @@ -597,18 +553,14 @@ fn test_any_ledger_object_functions() -> i32 { ); } - let _ = trace_data("SUCCESS: Any ledger object functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Any ledger object functions"); 0 } /// Test Category 5: Keylet Generation Functions (4 functions) /// Tests keylet generation functions for different ledger entry types fn test_keylet_generation_functions() -> i32 { - let _ = trace_data( - "--- Category 5: Keylet Generation Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 5: Keylet Generation Functions ---"); let escrow_finish = EscrowFinish; let account_id = escrow_finish.get_account().unwrap(); @@ -616,7 +568,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.1: account_keylet() - Generate keylet for account let mut account_keylet_buffer = [0u8; 32]; let account_keylet_result = unsafe { - account_keylet( + host::account_keylet( account_id.0.as_ptr(), account_id.0.len(), account_keylet_buffer.as_mut_ptr(), @@ -636,7 +588,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.2: credential_keylet() - Generate keylet for credential let mut credential_keylet_buffer = [0u8; 32]; let credential_keylet_result = unsafe { - credential_keylet( + host::credential_keylet( account_id.0.as_ptr(), // Subject account_id.0.len(), account_id.0.as_ptr(), // Issuer - same account for test @@ -665,7 +617,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.3: escrow_keylet() - Generate keylet for escrow let mut escrow_keylet_buffer = [0u8; 32]; let escrow_keylet_result = unsafe { - escrow_keylet( + host::escrow_keylet( account_id.0.as_ptr(), account_id.0.len(), 1000, // Sequence number @@ -683,7 +635,7 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.4: oracle_keylet() - Generate keylet for oracle let mut oracle_keylet_buffer = [0u8; 32]; let oracle_keylet_result = unsafe { - oracle_keylet( + host::oracle_keylet( account_id.0.as_ptr(), account_id.0.len(), 42, // Document ID @@ -698,24 +650,20 @@ fn test_keylet_generation_functions() -> i32 { } let _ = trace_data("Oracle keylet:", &oracle_keylet_buffer, DataRepr::AsHex); - let _ = trace_data("SUCCESS: Keylet generation functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Keylet generation functions"); 0 } /// Test Category 6: Utility Functions (4 functions) /// Tests utility functions for hashing, NFT access, and tracing fn test_utility_functions() -> i32 { - let _ = trace_data( - "--- Category 6: Utility Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 6: Utility Functions ---"); // Test 6.1: compute_sha512_half() - SHA512 hash computation (first 32 bytes) let test_data = b"Hello, XRPL WASM world!"; let mut hash_output = [0u8; 32]; let hash_result = unsafe { - compute_sha512_half( + host::compute_sha512_half( test_data.as_ptr(), test_data.len(), hash_output.as_mut_ptr(), @@ -736,7 +684,7 @@ fn test_utility_functions() -> i32 { let nft_id = [0u8; 32]; // Dummy NFT ID for testing let mut nft_buffer = [0u8; 256]; let nft_result = unsafe { - get_nft( + host::get_nft( account_id.0.as_ptr(), account_id.0.len(), nft_id.as_ptr(), @@ -765,7 +713,7 @@ fn test_utility_functions() -> i32 { let trace_message = b"Test trace message"; let trace_data_payload = b"payload"; let trace_result = unsafe { - trace( + host::trace( trace_message.as_ptr(), trace_message.len(), trace_data_payload.as_ptr(), @@ -795,23 +743,19 @@ fn test_utility_functions() -> i32 { } } - let _ = trace_data("SUCCESS: Utility functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Utility functions"); 0 } /// Test Category 7: Data Update Functions (1 function) /// Tests the function for modifying the current ledger entry fn test_data_update_functions() -> i32 { - let _ = trace_data( - "--- Category 7: Data Update Functions ---", - &[], - DataRepr::AsHex, - ); + let _ = trace("--- Category 7: Data Update Functions ---"); // Test 7.1: update_data() - Update current ledger entry data let update_payload = b"Updated ledger entry data from WASM test"; - let update_result = unsafe { update_data(update_payload.as_ptr(), update_payload.len()) }; + let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; if update_result != 0 { let _ = trace_num("ERROR: update_data failed:", update_result as i64); @@ -823,6 +767,6 @@ fn test_data_update_functions() -> i32 { update_payload, DataRepr::AsHex, ); - let _ = trace_data("SUCCESS: Data update functions", &[], DataRepr::AsHex); + let _ = trace("SUCCESS: Data update functions"); 0 } diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index 83078812d35..3491dc00fa4 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -12,4 +12,4 @@ dependencies = [ [[package]] name = "xrpl-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#c3a92273195a211ac9b41d641b0d20f60f982bb2" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml index e1fd222bebe..620e28fceb1 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index f6b293d40dd..704846d35a6 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -12,4 +12,4 @@ dependencies = [ [[package]] name = "xrpl-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index 33ae5b78d71..52ca804bc0f 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs index 1d3d04e74f5..706add2ed78 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -19,7 +19,7 @@ pub const FLOAT_ROUNDING_MODES_UPWARD: i32 = 3; #[allow(unused)] #[link(wasm_import_module = "host_lib")] unsafe extern "C" { - pub fn get_ledger_sqn(out_buff_ptr: i32, out_buff_len: i32) -> i32; + pub fn get_parent_ledger_hash(out_buff_ptr: i32, out_buff_len: i32) -> i32; pub fn cache_ledger_obj(keylet_ptr: i32, keylet_len: i32, cache_num: i32) -> i32; diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 1b1f5f7b2d0..36c61fe439d 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -4,7 +4,7 @@ extern crate std; use core::panic; -use xrpl_std::core::current_tx::escrow_finish::{EscrowFinish, get_current_escrow_finish}; +use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::error_codes; use xrpl_std::core::locator::Locator; @@ -54,20 +54,12 @@ pub extern "C" fn finish() -> i32 { // Note: not testing all the keylet functions, // that's in a separate test file. // ######################################## - with_buffer::<4, _, _>(|ptr, len| { - check_result( - unsafe { host::get_ledger_sqn(ptr, len) }, - 4, - "get_ledger_sqn", - ) - }); - with_buffer::<4, _, _>(|ptr, len| { - check_result( - unsafe { host::get_parent_ledger_time(ptr, len) }, - 4, - "get_parent_ledger_time", - ); - }); + check_result(unsafe { host::get_ledger_sqn() }, 12345, "get_ledger_sqn"); + check_result( + unsafe { host::get_parent_ledger_time() }, + 67890, + "get_parent_ledger_time", + ); with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { host::get_parent_ledger_hash(ptr, len) }, @@ -259,34 +251,60 @@ pub extern "C" fn finish() -> i32 { "get_nft_serial", ) }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); // ######################################## // Step #2: Test set_data edge cases // ######################################## check_result( - unsafe { host_bindings_loose::get_ledger_sqn(-1, 4) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(-1, 4) }, error_codes::INVALID_PARAMS, - "get_ledger_sqn_neg_ptr", + "get_parent_ledger_hash_neg_ptr", ); with_buffer::<4, _, _>(|ptr, _len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, -1) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, -1) }, error_codes::INVALID_PARAMS, - "get_ledger_sqn_neg_len", + "get_parent_ledger_hash_neg_len", ) }); with_buffer::<3, _, _>(|ptr, len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, len as i32) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, len as i32) }, error_codes::BUFFER_TOO_SMALL, - "get_ledger_sqn_buf_too_small", + "get_parent_ledger_hash_buf_too_small", ) }); with_buffer::<4, _, _>(|ptr, _len| { check_result( - unsafe { host_bindings_loose::get_ledger_sqn(ptr as i32, 1_000_000_000) }, + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, 1_000_000_000) }, error_codes::POINTER_OUT_OF_BOUNDS, - "get_ledger_sqn_len_too_long", + "get_parent_ledger_hash_len_too_long", ) }); let message = "testing trace"; diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index 1198946eb50..eb1b6d0f9ec 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -115,7 +115,11 @@ def process_c(project_name): print("Usage: python copyFixtures.py []") sys.exit(1) if len(sys.argv) == 2: - process_rust(sys.argv[1]) + if os.path.isdir(os.path.join(os.path.dirname(__file__), sys.argv[1])): + process_rust(sys.argv[1]) + else: + process_c(sys.argv[1]) + print("Fixture has been processed.") else: dirs = [ d diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index a0d8d4efaa3..ec91496428c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8614,304 +8614,243 @@ extern std::string const sp1WasmHex = "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" "756c746976616c7565"; -std::string const ledgerSqnWasmHex = - "0061736d01000000010e0360027f7f017f6000006000017f02160103656e" - "760e6765745f6c65646765725f73716e000003030201020503010002063e" - "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" - "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" - "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300010666696e69736800020362756603000c5f5f64736f5f68616e" - "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" - "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" - "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" - "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" - "090a2b0202000b2601017f41800841041000220041800828020020004100" - "481b2200200041044a20004100481b0b007f0970726f647563657273010c" - "70726f6365737365642d62790105636c616e675f31392e312e352d776173" - "692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d" - "2f6c6c766d2d70726f6a6563742061623462356132646235383239353861" - "6631656533303861373930636664623432626432343732302900490f7461" - "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" - "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; +extern std::string const ledgerSqnWasmHex = + "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" + "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" + "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" + "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" + "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" + "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" + "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" + "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" + "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" + "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" + "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" + "62346235613264623538323935386166316565333038613739306366646234326264323437" + "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; -std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60027f7f017f60047f7f7f7f017f60037f7f7f" - "017f60057f7f7f7f7f017f60017f017f60037f7f7f0060037f7f7e017f60" - "087f7f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60017f0060027f7f00" - "6000017f0295061908686f73745f6c69620c6765745f74785f6669656c64" - "000208686f73745f6c69620974726163655f6e756d000608686f73745f6c" - "6962057472616365000308686f73745f6c69620e6765745f6c6564676572" - "5f73716e000008686f73745f6c6962166765745f706172656e745f6c6564" - "6765725f74696d65000008686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f68617368000008686f73745f6c6962136765745f7478" - "5f6e65737465645f6669656c64000108686f73745f6c6962106765745f74" - "785f61727261795f6c656e000408686f73745f6c6962176765745f74785f" - "6e65737465645f61727261795f6c656e000008686f73745f6c69621c6765" - "745f63757272656e745f6c65646765725f6f626a5f6669656c6400020868" - "6f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a" - "5f6e65737465645f6669656c64000108686f73745f6c6962206765745f63" - "757272656e745f6c65646765725f6f626a5f61727261795f6c656e000408" - "686f73745f6c6962276765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e000008686f73745f6c69620e" - "6163636f756e745f6b65796c6574000108686f73745f6c69621063616368" - "655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c65" - "646765725f6f626a5f6669656c64000108686f73745f6c69621b6765745f" - "6c65646765725f6f626a5f6e65737465645f6669656c64000308686f7374" - "5f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e00" - "0008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e657374" - "65645f61727261795f6c656e000208686f73745f6c69621163726564656e" - "7469616c5f6b65796c6574000708686f73745f6c69620d657363726f775f" - "6b65796c6574000308686f73745f6c69620d6f7261636c655f6b65796c65" - "74000308686f73745f6c696213636f6d707574655f7368613531325f6861" - "6c66000108686f73745f6c6962076765745f6e6674000808686f73745f6c" - "69620b7570646174655f6461746100000306050505090a0b050301001106" - "19037f01418080c0000b7f0041eb99c0000b7f0041f099c0000b072e0406" - "6d656d6f727902000666696e697368001d0a5f5f646174615f656e640301" - "0b5f5f686561705f6261736503020a951d051900200241214f0440000b20" - "002002360204200020013602000b1900200241094f0440000b2000200236" - "0204200020013602000b970101057f230041206b22012400200141186a22" - "044100360200200141106a22054200370300200142003703080240418180" - "20200141086a411410002203411447044002402003410048044020002003" - "3602040c010b2000417f3602040b410121020c010b200020012903083700" - "01200041116a2004280200360000200041096a20052903003700000b2000" - "20023a0000200141206a24000b450020012d000045044020002001290001" - "370000200041106a200141116a280000360000200041086a200141096a29" - "00003700000f0b418080c000410b20013402041001000bff1a01097f2300" - "41c0036b22002400418b80c000411b41014100410110021a41a680c00041" - "2841014100410110021a41f680c000412b41014100410110021a20004200" - "370380010240024002400240024002400240024020004180016a22064108" - "1003220141004a044041a181c000411d2001ad10011a200041406b200620" - "01101a41be81c000411020002802402000280244410110021a2000420037" - "03a001200041a0016a220341081004220141004c0d0141ce81c000411920" - "01ad10011a200041386a20032001101a41e781c000411120002802382000" - "28023c410110021a200041d8016a22024200370300200041d0016a220542" - "00370300200041c8016a22044200370300200042003703c001200041c001" - "6a22074120100522014120470d0241f881c000411320074120410110021a" - "418b82c000412041014100410110021a419883c000412e41014100410110" - "021a200041b0016a4100360200200041a8016a4200370300200042003703" - "a0014181802020034114100022014114470d0341c683c000411420034114" - "410110021a20004200370380014188801820064108100022014108470d04" - "41da83c0004117420810011a41f183c000412820064108410110021a2000" - "410036026041848008200041e0006a22034104100022014104470d054199" - "84c000411520034104410110021a200041013b004c200242003703002005" - "420037030020044200370300200042003703c0010240200041cc006a4102" - "200741201006220141004e044041ae84c00041142001ad10011a20004130" - "6a20072001101941c284c000410d20002802302000280234410110021a0c" - "010b41cf84c00041292001ac10011a0b41f884c00041154183803c1007ac" - "10011a418d85c00041134189803c1007ac10011a0240200041cc006a4102" - "1008220141004e044041a085c00041142001ad10011a0c010b41b485c000" - "412d2001ac10011a0b41e185c000412341014100410110021a419a87c000" - "413341014100410110021a20004200370380014182801820004180016a22" - "0141081009220341004c0d062003410846044041cd87c000412b42081001" - "1a41f887c000412f20014108410110021a0c080b41a788c000412f2003ad" - "10011a200041286a20004180016a2003101a41d688c00041172000280228" - "200028022c410110021a0c070b41fb82c000411d2001ac10011a419b7f21" - "020c070b41d682c00041252001ac10011a419a7f21020c060b41ab82c000" - "412b2001ac10011a41997f21020c050b41f086c000412a2001ac10011a41" - "b77e21020c040b41af86c00041c1002001ac10011a41b67e21020c030b41" - "8486c000412b2001ac10011a41b57e21020c020b41ed88c00041c5002003" - "ac10011a0b200041b0016a4100360200200041a8016a4200370300200042" - "003703a0010240024002400240024002400240024041818020200041a001" - "6a220141141009220341004a0440200341154f0d0241b289c000411e2001" - "2003410110021a0c010b41d089c00041332003ac10011a0b200041013b00" - "60200041d8016a4200370300200041d0016a4200370300200041c8016a42" - "00370300200042003703c0010240200041e0006a4102200041c0016a2201" - "4120100a220341004e044041838ac000411c2003ad10011a200041206a20" - "0120031019419f8ac000411520002802202000280224410110021a0c010b" - "41b48ac00041392003ac10011a0b41ed8ac00041244183803c100bac1001" - "1a0240200041e0006a4102100c220141004e044041918bc000411c2001ad" - "10011a0c010b41ad8bc000413d2001ac10011a0b41ea8bc0004128410141" - "00410110021a41928cc000412f41014100410110021a200041c0016a2203" - "101b20004180016a22012003101c200041b8016a4200370300200041b001" - "6a4200370300200041a8016a4200370300200042003703a0012001411420" - "0041a0016a22034120100d22014120470d01200341204100100e22044100" - "4a044041c18cc00041232004ad10011a2000420037036020044182801820" - "0041e0006a22014108100f220341004c0d032003410846044041e48cc000" - "412a420810011a418e8dc000412e20014108410110021a0c070b41bc8dc0" - "00412e2003ad10011a200041186a200041e0006a2003101a41ea8dc00041" - "162000280218200028021c410110021a0c060b41a290c000413c2004ac10" - "011a200041d8016a4200370300200041d0016a4200370300200041c8016a" - "4200370300200042003703c001410141828018200041c0016a4120100f22" - "014100480d030c040b000b41f692c000412e2001ac10011a41ef7c21020c" - "050b41808ec000412b2003ac10011a0c020b41de90c00041c1002001ac10" - "011a0b200041013b00604101200041e0006a4102200041c0016a41201010" - "22014100480440419f91c00041352001ac10011a0b41014183803c101122" - "01410048044041d491c00041322001ac10011a0b4101200041e0006a4102" - "101222014100480440418692c00041392001ac10011a0b41bf92c0004137" - "41014100410110021a0c010b200041013b004c200041d8016a4200370300" - "200041d0016a4200370300200041c8016a4200370300200042003703c001" - "02402004200041cc006a4102200041c0016a220141201010220341004e04" - "4041ab8ec000411b2003ad10011a200041106a20012003101941c68ec000" - "411420002802102000280214410110021a0c010b41da8ec00041312003ac" - "10011a0b418b8fc000412320044183803c1011ac10011a02402004200041" - "cc006a41021012220141004e044041ae8fc000411b2001ad10011a0c010b" - "41c98fc00041352001ac10011a0b41fe8fc000412441014100410110021a" - "0b41a493c000412f41014100410110021a200041c0016a2201101b200041" - "cc006a22042001101c200041f8006a4200370300200041f0006a42003703" - "00200041e8006a4200370300200042003703600240024002400240024002" - "4020044114200041e0006a22034120100d2201412046044041d393c00041" - "0f20034120410110021a20004198016a420037030020004190016a420037" - "030020004188016a42003703002000420037038001024020044114200441" - "1441e293c000410920004180016a220141201013220341004a0440200041" - "086a20012003101941ea93c00041122000280208200028020c410110021a" - "0c010b41fc93c000413c2003ac10011a0b200041b8016a22064200370300" - "200041b0016a22024200370300200041a8016a2205420037030020004200" - "3703a001200041cc006a2203411441e807200041a0016a22084120101422" - "014120470d0141b894c000410e20084120410110021a200041d8016a4200" - "370300200041d0016a4200370300200041c8016a42003703002000420037" - "03c00120034114412a200041c0016a22044120101522014120470d0241c6" - "94c000410e20044120410110021a41d494c000412441014100410110021a" - "41cd95c000412541014100410110021a20004198016a4200370300200041" - "90016a420037030020004188016a4200370300200042003703800141f295" - "c000411720004180016a22034120101622014120470d03418996c000410b" - "41f295c0004117410110021a419496c000411120034120410110021a2004" - "101b200041e0006a22072004101c20064200370300200242003703002005" - "4200370300200042003703a0010240200422022002410020026b41037122" - "036a22054f0d0020030440200321010340200241003a0000200241016a21" - "02200141016b22010d000b0b200341016b4107490d000340200241003a00" - "00200241076a41003a0000200241066a41003a0000200241056a41003a00" - "00200241046a41003a0000200241036a41003a0000200241026a41003a00" - "00200241016a41003a0000200241086a22022005470d000b0b2005418002" - "20036b2201417c716a220220054b0440034020054100360200200541046a" - "22052002490d000b0b024020022001410371220120026a22034f0d002001" - "220504400340200241003a0000200241016a2102200541016b22050d000b" - "0b200141016b4107490d000340200241003a0000200241076a41003a0000" - "200241066a41003a0000200241056a41003a0000200241046a41003a0000" - "200241036a41003a0000200241026a41003a0000200241016a41003a0000" - "200241086a22022003470d000b0b02402007411420084120200441800210" - "17220141004a044041a596c00041102001ad10011a20014181024f0d0641" - "b596c000410920042001410110021a0c010b41be96c000412e2001ac1001" - "1a0b41ec96c000411241fe96c00041074101100222014100480d05418597" - "c000411d2001ad10011a41a297c0004111422a10014100480d0641b397c0" - "00411c420010011a4101210241cf97c000411a41014100410110021a41bb" - "98c000412941014100410110021a41e498c000412810182201450440418c" - "99c000412741e498c0004128410110021a41b399c000411e410141004101" - "10021a41ce80c000412841014100410110021a0c080b41d199c000411a20" - "01ac10011a41c37a21020c070b41b095c000411d2001ac10011a418b7c21" - "020c060b419495c000411c2001ac10011a41897c21020c050b41f894c000" - "411c2001ac10011a41887c21020c040b419998c00041222001ac10011a41" - "a77b21020c030b000b418398c00041162001ac10011a41a57b21020c010b" - "41e997c000411a42a47b10011a41a47b21020b200041c0036a240020020b" - "0bf5190100418080c0000beb196572726f725f636f64653d3d3d3d20484f" - "53542046554e4354494f4e532054455354203d3d3d54657374696e672032" - "3620686f73742066756e6374696f6e732028372063617465676f72696573" - "29535543434553533a20416c6c20686f73742066756e6374696f6e207465" - "73747320706173736564212d2d2d2043617465676f727920313a204c6564" - "676572204865616465722046756e6374696f6e73202d2d2d4c6564676572" - "2073657175656e6365206e756d6265722062797465733a4c656467657220" - "73716e20646174613a506172656e74206c65646765722074696d65206279" - "7465733a506172656e742074696d6520646174613a506172656e74206c65" - "6467657220686173683a535543434553533a204c65646765722068656164" - "65722066756e6374696f6e734552524f523a206765745f706172656e745f" - "6c65646765725f686173682077726f6e67206c656e6774683a4552524f52" - "3a206765745f706172656e745f6c65646765725f74696d65206661696c65" - "643a4552524f523a206765745f6c65646765725f73716e206661696c6564" - "3a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" - "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e2041" - "63636f756e743a5472616e73616374696f6e20466565206c656e6774683a" - "5472616e73616374696f6e20466565202873657269616c697a6564205852" - "5020616d6f756e74293a5472616e73616374696f6e2053657175656e6365" - "3a4e6573746564206669656c64206c656e6774683a4e6573746564206669" - "656c643a494e464f3a206765745f74785f6e65737465645f6669656c6420" - "6e6f74206170706c696361626c653a5369676e657273206172726179206c" - "656e6774683a4d656d6f73206172726179206c656e6774683a4e65737465" - "64206172726179206c656e6774683a494e464f3a206765745f74785f6e65" - "737465645f61727261795f6c656e206e6f74206170706c696361626c653a" - "535543434553533a205472616e73616374696f6e20646174612066756e63" - "74696f6e734552524f523a206765745f74785f6669656c64285365717565" - "6e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" - "785f6669656c6428466565292077726f6e67206c656e6774682028657870" - "6563746564203820627974657320666f7220585250293a4552524f523a20" - "6765745f74785f6669656c64284163636f756e74292077726f6e67206c65" - "6e6774683a2d2d2d2043617465676f727920333a2043757272656e74204c" - "6564676572204f626a6563742046756e6374696f6e73202d2d2d43757272" - "656e74206f626a6563742062616c616e6365206c656e6774682028585250" - "20616d6f756e74293a43757272656e74206f626a6563742062616c616e63" - "65202873657269616c697a65642058525020616d6f756e74293a43757272" - "656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e" - "2d58525020616d6f756e74293a43757272656e74206f626a656374206261" - "6c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" - "5f6f626a5f6669656c642842616c616e636529206661696c656420286d61" - "79206265206578706563746564293a43757272656e74206c656467657220" - "6f626a656374206163636f756e743a494e464f3a206765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c64284163636f756e74292066" - "61696c65643a43757272656e74206e6573746564206669656c64206c656e" - "6774683a43757272656e74206e6573746564206669656c643a494e464f3a" - "206765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f6669656c64206e6f74206170706c696361626c653a43757272656e7420" - "6f626a656374205369676e657273206172726179206c656e6774683a4375" - "7272656e74206e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465" - "645f61727261795f6c656e206e6f74206170706c696361626c653a535543" - "434553533a2043757272656e74206c6564676572206f626a656374206675" - "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564" - "676572204f626a6563742046756e6374696f6e73202d2d2d537563636573" - "7366756c6c7920636163686564206f626a65637420696e20736c6f743a43" - "6163686564206f626a6563742062616c616e6365206c656e677468202858" - "525020616d6f756e74293a436163686564206f626a6563742062616c616e" - "6365202873657269616c697a65642058525020616d6f756e74293a436163" - "686564206f626a6563742062616c616e6365206c656e67746820286e6f6e" - "2d58525020616d6f756e74293a436163686564206f626a6563742062616c" - "616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c" - "642842616c616e636529206661696c65643a436163686564206e65737465" - "64206669656c64206c656e6774683a436163686564206e65737465642066" - "69656c643a494e464f3a206765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64206e6f74206170706c696361626c653a436163686564" - "206f626a656374205369676e657273206172726179206c656e6774683a43" - "6163686564206e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" - "6c656e206e6f74206170706c696361626c653a535543434553533a20416e" - "79206c6564676572206f626a6563742066756e6374696f6e73494e464f3a" - "2063616368655f6c65646765725f6f626a206661696c6564202865787065" - "6374656420776974682074657374206669787475726573293a494e464f3a" - "206765745f6c65646765725f6f626a5f6669656c64206661696c65642061" - "7320657870656374656420286e6f20636163686564206f626a656374293a" - "494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669" - "656c64206661696c65642061732065787065637465643a494e464f3a2067" - "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c6564" - "2061732065787065637465643a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e206661696c6564206173" - "2065787065637465643a535543434553533a20416e79206c656467657220" - "6f626a6563742066756e6374696f6e732028696e74657266616365207465" - "73746564294552524f523a206163636f756e745f6b65796c657420666169" - "6c656420666f722063616368696e6720746573743a2d2d2d204361746567" - "6f727920353a204b65796c65742047656e65726174696f6e2046756e6374" - "696f6e73202d2d2d4163636f756e74206b65796c65743a54657374547970" - "6543726564656e7469616c206b65796c65743a494e464f3a206372656465" - "6e7469616c5f6b65796c6574206661696c65642028657870656374656420" - "2d20696e74657266616365206973737565293a457363726f77206b65796c" - "65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" - "65742067656e65726174696f6e2066756e6374696f6e734552524f523a20" - "6f7261636c655f6b65796c6574206661696c65643a4552524f523a206573" - "63726f775f6b65796c6574206661696c65643a4552524f523a206163636f" - "756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f7279" - "20363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f" - "2c205852504c205741534d20776f726c6421496e70757420646174613a53" - "48413531322068616c6620686173683a4e46542064617461206c656e6774" - "683a4e465420646174613a494e464f3a206765745f6e6674206661696c65" - "6420286578706563746564202d206e6f2073756368204e4654293a546573" - "74207472616365206d6573736167657061796c6f61645472616365206675" - "6e6374696f6e206279746573207772697474656e3a54657374206e756d62" - "657220747261636554726163655f6e756d2066756e6374696f6e20737563" - "636565646564535543434553533a205574696c6974792066756e6374696f" - "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552" - "524f523a2074726163652829206661696c65643a4552524f523a20636f6d" - "707574655f7368613531325f68616c66206661696c65643a2d2d2d204361" - "7465676f727920373a2044617461205570646174652046756e6374696f6e" - "73202d2d2d55706461746564206c656467657220656e7472792064617461" - "2066726f6d205741534d20746573745375636365737366756c6c79207570" - "6461746564206c656467657220656e74727920776974683a535543434553" - "533a2044617461207570646174652066756e6374696f6e734552524f523a" - "207570646174655f64617461206661696c65643a00550970726f64756365" - "727302086c616e6775616765010452757374000c70726f6365737365642d" - "62790105727573746325312e38362e302d6e696768746c79202862336233" - "363861313820323032352d30312d30352900490f7461726765745f666561" - "7475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c" - "7565"; +extern std::string const allHostFunctionsWasmHex = + "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" + "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" + "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" + "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" + "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" + "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" + "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" + "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" + "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" + "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" + "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" + "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" + "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" + "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" + "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" + "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" + "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" + "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" + "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" + "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" + "6a22044100360200200141106a220542003703002001420037030802404181802020014108" + "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" + "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" + "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" + "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" + "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" + "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" + "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" + "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" + "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" + "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" + "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" + "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" + "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" + "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" + "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" + "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" + "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" + "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" + "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" + "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" + "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" + "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" + "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" + "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" + "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" + "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" + "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" + "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" + "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" + "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" + "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" + "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" + "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" + "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" + "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" + "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" + "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" + "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" + "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" + "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" + "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" + "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" + "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" + "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" + "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" + "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" + "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" + "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" + "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" + "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" + "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" + "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" + "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" + "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" + "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" + "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" + "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" + "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" + "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" + "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" + "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" + "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" + "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" + "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" + "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" + "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" + "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" + "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" + "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" + "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" + "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" + "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" + "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" + "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" + "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" + "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" + "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" + "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" + "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" + "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" + "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" + "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" + "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" + "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" + "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" + "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; -std::string const deepRecursionHex = +extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" @@ -9914,277 +9853,278 @@ extern std::string const allKeyletsWasmHex = "6c746976616c7565"; extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60027f7f017f60047f7f7f7f017f60057f7f7f7f7f017f60067f" - "7f7f7f7f7f017f60037f7f7f017f6000017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" + "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" - "7472616365000208686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" - "0e6765745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000008686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000008686f73745f6c6962176765745f6c65646765725f6163636f75" - "6e745f68617368000008686f73745f6c6962126765745f6c65646765725f74785f68617368" - "000008686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" - "6d656e646d656e745f656e61626c6564000008686f73745f6c69620c6765745f74785f6669" - "656c64000408686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" - "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000408686f73745f6c6962146765" - "745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621b676574" - "5f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c69621067" + "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" + "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" + "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" + "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" - "5f6c65646765725f6f626a5f61727261795f6c656e000008686f73745f6c6962176765745f" - "74785f6e65737465645f61727261795f6c656e000008686f73745f6c6962276765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00000868" + "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000408686f73745f6c69620b7570646174655f64617461000008686f73745f6c696213" - "636f6d707574655f7368613531325f68616c66000108686f73745f6c696209636865636b5f" + "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" - "5f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e00" - "0108686f73745f6c69620d6765745f6e66745f666c616773000008686f73745f6c69621467" - "65745f6e66745f7472616e736665725f666565000008686f73745f6c69620e6765745f6e66" - "745f73657269616c000108686f73745f6c69620d74726163655f6163636f756e7400010868" - "6f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620b6c696e655f" + "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" + "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" + "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" - "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400020868" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" - "65796c6574000108686f73745f6c69620d657363726f775f6b65796c6574000208686f7374" - "5f6c6962136d70745f69737375616e63655f6b65796c6574000208686f73745f6c6962106e" - "66745f6f666665725f6b65796c6574000208686f73745f6c69620c6f666665725f6b65796c" - "6574000208686f73745f6c69620d6f7261636c655f6b65796c6574000208686f73745f6c69" + "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" + "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" - "6e65645f646f6d61696e5f6b65796c6574000208686f73745f6c69620e7369676e6572735f" - "6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574000208686f73" - "745f6c69620c7661756c745f6b65796c657400020303020a0505030100110619037f014180" - "80c0000b7f0041f599c0000b7f0041809ac0000b072e04066d656d6f727902000666696e69" - "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020adf25024600" + "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" + "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" + "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" + "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" - "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b952502087f" - "027e230041f0016b22002400419680c000412341004100410010001a200041003602602000" - "41e0006a220141041002410441b88ac000410e103420004100360260200141041003410441" - "c68ac00041161034200041f8006a22044200370300200041f0006a22034200370300200041" - "e8006a2202420037030020004200370360200141201004412041dc8ac00041161034200442" - "00370300200342003703002002420037030020004200370360200141201005412041f28ac0" - "00411710342004420037030020034200370300200242003703002000420037036020014120" - "1006412041898bc000411210341007410a41b980c000410c1034200041206a428182848890" - "a0c08001370300200041186a428182848890a0c08001370300200041106a428182848890a0" - "c080013703002000428182848890a0c0800137030841c580c000410e1008410141d380c000" - "41111034200041086a41201008410141d380c0004111103420034100360200200242003703" - "0020004200370360024041818020200141141009220541144604402000412e6a20002d0062" - "3a0000200020002900673703c8012000200041ec006a2900003700cd01200041386a200029" - "00cd01370000200020002f01603b012c2000200028006336002f200020002903c801370033" - "200442003703002003420037030020024200370300200042003703602000412c6a41142001" - "4120100a22044120470d01200041c2006a20002d00623a0000200041d0016a200041ef006a" - "2900002208370300200041d8016a200041f7006a2900002209370300200041cf006a200837" - "0000200041d7006a2009370000200041df006a200041ff006a2d00003a0000200020002f01" - "603b01402000200028006336004320002000290067370047200041406b41204100100b4101" - "41e480c0004110103420034100360200200242003703002000420037036041818020200141" - "14100c4114419b8bc000411c10342003410036020020024200370300200042003703604101" - "4181802020014114100d411441b78bc0004114103402402001410020016b41037122036a22" - "0220014d0d0020030440200321040340200141003a0000200141016a2101200441016b2204" - "0d000b0b200341016b4107490d000340200141003a0000200141076a41003a000020014106" - "6a41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a000020" - "0141026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c4" - "0020036b2203417c716a220120024b0440034020024100360200200241046a22022001490d" - "000b0b024020012003410371220320016a22044f0d002003220204400340200141003a0000" - "200141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a0000" - "200141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a4100" - "3a0000200141036a41003a0000200141026a41003a0000200141016a41003a000020014108" - "6a22012004470d000b0b2000418180203602c801410021010340200741c000490440200041" - "e0006a20076a200041c8016a20016a2d00003a0000200020002802a00141016a22073602a0" - "01200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a220542" - "00370300200042003703c801200041e0006a22012007200041c8016a22044114100e411441" - "cb8bc000411310342002410036020020054200370300200042003703c801200120002802a0" - "0120044114100f411441de8bc0004123103420024100360200200542003703002000420037" - "03c8014101200120002802a001200441141010411441818cc000411b10344189803c101141" - "2041f480c000411010344189803c10124120418481c0004120103441014189803c10134120" - "41a481c00041181034200120002802a0011014412041bc81c00041171034200120002802a0" - "011015412041d381c000412710344101200120002802a0011016412041fa81c000411f1034" - "2000412c6a2203411410174100419982c000410b1034200041e0016a220742003703002002" - "420037030020054200370300200042003703c801200120002802a001200441201018412041" - "9c8cc0004113103441a482c000410c41b082c000410b41bb82c000410e1019410141c982c0" - "0041091034200041c0016a200041206a290300370300200041b8016a200041186a29030037" - "0300200041b0016a200041106a290300370300200020002903083703a801200241003b0100" - "20054200370300200042003703c80120034114200041a8016a2206412020044112101a4112" - "41af8cc000410710342002410036020020054200370300200042003703c801200641202004" - "4114101b411441b68cc000410e1034200041003602c8012006412020044104101c410441c4" - "8cc000410d103420064120101d410841d282c000410d103420064120101e410a41df82c000" - "41141034200041003602c8012006412020044104101f410441d18cc000410e1034417f4104" - "1002417141f382c00041161034200041003602c8012004417f1002417141df8cc000411610" - "34200041ca016a41003a0000200041003b01c801200441031002417d41f58cc000411c1034" - "200041003602c8012004418094ebdc031002417341918dc000411b1034418983c000410d20" - "0341141020412f419683c000410d1034418983c000410d41a383c00041081021411341ab83" - "c000410c103441021011416f41b783c000411f1034417f20002802a0011014417141d683c0" - "00411f10342001417f1014417141f583c000411f1034200141812010144174419484c00041" - "201034200041e094ebdc036a220620002802a0011014417341b484c000411f103420062000" - "2802a0014101100b417341d384c00041181034200120002802a0014101100b417141eb84c0" - "00411a1034200742003703002002420037030020054200370300200042003703c801200620" - "002802a00120044120100a417341ac8dc00041161034200742003703002002420037030020" - "054200370300200042003703c801200120002802a00120044120100a417141c28dc0004118" - "1034200742003703002002420037030020054200370300200042003703c801200341142003" - "4114200620002802a001200441201022417341da8dc000411c103420074200370300200242" - "0037030020054200370300200042003703c8012003411420034114200120002802a0012004" - "41201022417141f68dc000411e103420074200370300200242003703002005420037030020" - "0042003703c80141e199c0004114200620002802a001200441201023417341948ec0004119" - "1034200742003703002002420037030020054200370300200042003703c80141e199c00041" - "14200120002802a001200441201023417141ad8ec000411f10342007420037030020024200" - "37030020054200370300200042003703c80141e199c0004114418585c00041142004412010" - "23417141cc8ec00041291034200041dc016a2000413c6a280100360200200041d4016a2000" - "41346a2901003702002000200029012c3702cc01200041808080083602c801200041003b01" - "ec012004411841e199c0004114200041ec016a220241021023417141f58ec000410e103420" - "0620002802a001422a10014173419985c00041111034200041003b01ec0141022002410210" - "09416f41838fc000411b1034200041003b01ec01410220024102100c416f419e8fc000412b" - "1034200041003b01ec014101410220024102100d416f41c98fc0004123103441021011416f" - "41b783c000411f103441021012416f41aa85c000412f1034410141021013416f41d985c000" - "4127103441c580c00041812010084174418086c000411f103441c580c00041c10010084174" - "419f86c000411a1034200041003b01ec01200141812020024102100e417441ec8fc0004121" - "1034200041003b01ec01200141812020024102100f4174418d90c00041311034200041003b" - "01ec0141012001418120200241021010417441be90c0004129103420014181201014417441" - "b986c0004125103420014181201015417441de86c000413510344101200141812010164174" - "419387c000412d103420014181201017417441c087c00041191034418983c00041812041b0" - "82c000410b41bb82c000410e1019417441c982c00041091034418983c000410d41b082c000" - "41812041bb82c000410e1019417441c982c00041091034418983c000410d41b082c000410b" - "41bb82c0004181201019417441c982c00041091034200041003b01ec012001418120200241" - "021018417441e790c00041211034200041003b01ec0141e199c00041812041e199c0004114" - "2002410210234174418891c00041181034200041003b01ec01200341142003411420014181" - "20200241021024417441a091c000411f1034200041003b01ec012004418120200341142002" - "41021025417441bf91c00041221034418983c000410d200620002802a00141001000417341" - "d987c000410f1034418983c000410d200620002802a0011021417341e887c0004116103420" - "0120002802a0014100100b417141fe87c00041231034200041003b01ec0120034114200120" - "002802a00120024102101a417141e191c000411a1034200041003b01ec01200120002802a0" - "0120024102101b417141fb91c00041211034200041003b01ec01200120002802a001200241" - "02101c4171419c92c00041201034200120002802a001101d417141a188c000412010342001" - "20002802a001101e417141c188c00041271034200041003602ec01200120002802a0012002" - "4104101f417141bc92c00041211034200041003b01ec01200120002802a00120024102100a" - "417141dd92c00041231034200041003b01ec01200120002802a00141012002410210264171" - "418093c00041211034200041003b01ec01200120002802a001220520034114200120052002" - "41021024417141a193c00041271034200041003b01ec0120034114200120002802a0012205" - "20012005200241021024417141c893c00041271034200041003b01ec01200120002802a001" - "20034114200241021027417141ef93c00041251034200041003b01ec012003411420012000" - "2802a0012002410210274171419494c00041251034200041003b01ec01200120002802a001" - "20034114200241021028417141b994c000412c1034200041003b01ec012003411420012000" - "2802a001200241021028417141e594c000412c1034200041003b01ec01200120002802a001" - "2002410210294171419195c000411f1034200041003b01ec01200120002802a00141012002" - "4102102a417141b095c00041221034200041003b01ec01200120002802a001200341144185" - "85c0004114200241021022417141d295c00041211034200041003b01ec0120034114200120" - "002802a001418585c0004114200241021022417141f395c00041211034200041003b01ec01" - "200120002802a001410120024102102b4171419496c00041281034200041003b01ec012004" - "4118200120002802a001200241021025417141bc96c00041231034200041003b01ec012001" - "20002802a001410120024102102c417141df96c00041251034200041003b01ec0120012000" - "2802a001410120024102102d4171418497c00041211034200041003b01ec01200120002802" - "a001410120024102102e417141a597c00041221034200041003b01ec01200120002802a001" - "20034114410120024102102f417141c797c00041241034200041003b01ec01200341142001" - "20002802a001410120024102102f417141eb97c00041241034200041003b01ec0120012000" - "2802a00141012002410210304171418f98c000412f1034200041003b01ec01200120002802" - "a001200241021031417141be98c00041231034200041003b01ec01200120002802a0014101" - "200241021032417141e198c00041221034200041003b01ec01200120002802a00141012002" - "410210334171418399c00041211034200041003b01ec01200120002802a00141e888c00041" - "2020024102101a417141a499c000411c1034418983c000410d200120002802a00110204171" - "418889c00041221034418997abdd03410d41e888c000412041001000417341aa89c0004110" - "1034418997abdd03410d200341141020417341ba89c00041181034418997abdd03410d41a3" - "83c00041081021417341d289c00041171034200120002802a0012001418120410010004174" - "41e989c000410e1034200141812042011001417441f789c00041121034418983c000418120" - "200341141020417441898ac00041161034418983c00041812041a383c00041081021417441" - "898ac00041161034418983c000410d200120002802a00110214171419f8ac0004119103420" - "0041003b01ec01200120002802a00120034114200241021025417141c099c0004121103420" - "0041f0016a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c0" - "00410b417f20042004417f4e1bac1001000b0beb190100418080c0000be1196572726f725f" - "636f64653d54455354204641494c45442424242424205354415254494e47205741534d2045" - "5845435554494f4e2024242424246765745f626173655f666565746573745f616d656e646d" - "656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a67" - "65745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" - "5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e676574" - "5f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f" - "6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361" - "676574657374207075626b657974657374207369676e6174757265636865636b5f73696767" - "65745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665656765745f6c" - "65646765725f73716e5f6e65675f70747274657374696e6720747261636574726163655f61" - "63636f756e74400000000000005f74726163655f616d6f756e746765745f74785f61727261" - "795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f617272" - "61795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e" - "5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c" - "6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62636163" - "68655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a" - "5f77726f6e675f6c656e555344303030303030303030303030303030303074726163655f6e" - "756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61727261" - "795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6172" - "7261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c" - "65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f" - "5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f" - "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6172" - "7261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f64" - "6174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472616365" - "5f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f7369" - "7a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f" - "73697a655f75696e7432353630303030303030303030303030303030303030303030303030" - "3030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f75" - "6e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f6f6f62" - "5f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f74" - "6f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6163636f756e" - "745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765" - "745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d65676574" - "5f706172656e745f6c65646765725f686173686765745f6c65646765725f6163636f756e74" - "5f686173686765745f6c65646765725f74785f686173686765745f63757272656e745f6c65" - "646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c64676574" - "5f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f66" - "69656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e6674" - "5f6973737565726765745f6e66745f7461786f6e6765745f6e66745f73657269616c676574" - "5f6c65646765725f73716e5f6e65675f6c656e6765745f6c65646765725f73716e5f627566" - "5f746f6f5f736d616c6c6765745f6c65646765725f73716e5f6c656e5f746f6f5f6c6f6e67" - "6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f" - "77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e6379" - "6c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b6579" - "6c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e" - "675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f" - "7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f" - "6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c65646765" - "725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f" - "6f626a5f6669656c645f696e76616c69645f736669656c646765745f74785f6e6573746564" - "5f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c" - "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c69636563" - "6f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b" - "65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f" - "746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f73" - "6c6963655f6d707469646765745f6e66745f77726f6e675f73697a655f75696e7432353667" - "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" - "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" - "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" - "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" - "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" - "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" - "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" - "2d6279010572757374631d312e38352e31202834656231363132353020323032352d30332d" - "31352900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" + "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" + "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" + "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" + "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" + "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" + "002002420037030020004200370360200141201006412041918bc000411210341007410a41" + "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" + "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" + "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" + "c0004111103420034100360200200242003703002000420037036002404181802020014114" + "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" + "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" + "200028006336002f200020002903c801370033200442003703002003420037030020024200" + "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" + "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" + "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" + "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" + "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" + "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" + "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" + "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" + "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" + "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" + "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" + "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" + "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" + "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" + "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" + "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" + "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" + "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" + "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" + "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" + "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" + "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" + "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" + "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" + "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" + "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" + "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" + "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" + "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" + "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" + "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" + "00200020002903083703a801200241003b010020054200370300200042003703c801200341" + "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" + "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" + "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" + "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" + "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" + "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" + "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" + "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" + "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" + "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" + "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" + "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" + "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" + "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" + "34200742003703002002420037030020054200370300200042003703c801200620002802a0" + "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" + "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" + "42003703002002420037030020054200370300200042003703c80120034114200341142006" + "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" + "20054200370300200042003703c8012003411420034114200120002802a001200441201022" + "417141968ec000411e10342007420037030020024200370300200542003703002000420037" + "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" + "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" + "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" + "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" + "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" + "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" + "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" + "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" + "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" + "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" + "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" + "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" + "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" + "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" + "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" + "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" + "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" + "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" + "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" + "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" + "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" + "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" + "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" + "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" + "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" + "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" + "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" + "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" + "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" + "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" + "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" + "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" + "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" + "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" + "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" + "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" + "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" + "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" + "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" + "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" + "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" + "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" + "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" + "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" + "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" + "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" + "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" + "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" + "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" + "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" + "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" + "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" + "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" + "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" + "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" + "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" + "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" + "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" + "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" + "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" + "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" + "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" + "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" + "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" + "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" + "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" + "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" + "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" + "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" + "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" + "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" + "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" + "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" + "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" + "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" + "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" + "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" + "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" + "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" + "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" + "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" + "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" + "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" + "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" + "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" + "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" + "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" + "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" + "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" + "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" + "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" + "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" + "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" + "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" + "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" + "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" + "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" + "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" + "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" + "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" + "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" + "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" + "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" + "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" + "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" + "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" + "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" + "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" + "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" + "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" + "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" + "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" + "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" + "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" + "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" + "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" + "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c index 66ed1d42c7d..3458b02872c 100644 --- a/src/test/app/wasm_fixtures/ledgerSqn.c +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -1,11 +1,11 @@ #include int32_t -get_ledger_sqn(uint8_t*, int32_t); +get_ledger_sqn(); // int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); // int32_t trace_num(uint8_t const*, int32_t, int64_t); -uint8_t buf[1024]; +// uint8_t buf[1024]; // char const test_res[] = "sqn: "; // char const test_name[] = "TEST get_ledger_sqn"; @@ -18,10 +18,10 @@ finish() // memset(buf, 0, sizeof(buf)); // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; - int x = get_ledger_sqn(buf, sizeof(int32_t)); - if (x >= 0) - x = *((int32_t*)buf); - // trace_num((uint8_t const *)test_res, sizeof(test_res) - 1, x); + int x = get_ledger_sqn(); + // if (x >= 0) + // x = *((int32_t*)buf); + // trace_num((uint8_t const *)test`_res, sizeof(test_res) - 1, x); - return x < 0 ? x : (x >= 5 ? 1 : 0); + return x < 0 ? x : (x >= 5 ? x : 0); } diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 56ce33e69d3..f1332462a49 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -117,13 +117,13 @@ struct HostFunctions return beast::Journal{beast::Journal::getNullSink()}; } - virtual Expected + virtual Expected getLedgerSqn() { return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getParentLedgerTime() { return Unexpected(HostFunctionError::INTERNAL); diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 78fcde3f577..5539a5ef408 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -82,10 +82,10 @@ class WasmHostFunctionsImpl : public HostFunctions return data_; } - Expected + Expected getLedgerSqn() override; - Expected + Expected getParentLedgerTime() override; Expected diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index b7d10026357..dc0524d611a 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -23,14 +23,14 @@ namespace ripple { -using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); +using getLedgerSqn_proto = int32_t(); wasm_trap_t* getLedgerSqn_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getParentLedgerTime_proto = int32_t(uint8_t*, int32_t); +using getParentLedgerTime_proto = int32_t(); wasm_trap_t* getParentLedgerTime_wrap( void* env, diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 050bf643145..4b585acdcd4 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -31,16 +31,22 @@ namespace ripple { -Expected +Expected WasmHostFunctionsImpl::getLedgerSqn() { - return ctx.view().seq(); + auto seq = ctx.view().seq(); + if (seq > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE + return static_cast(seq); } -Expected +Expected WasmHostFunctionsImpl::getParentLedgerTime() { - return ctx.view().parentCloseTime().time_since_epoch().count(); + auto time = ctx.view().parentCloseTime().time_since_epoch().count(); + if (time > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(time); } Expected From 8ac514363d37481a094c97409d54fcba581a2f60 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 29 Aug 2025 10:58:52 -0400 Subject: [PATCH 059/212] get new fees and reserves working (#5714) --- src/test/app/Escrow_test.cpp | 128 ++++++++++++++++++----------- src/xrpld/app/tx/detail/Escrow.cpp | 49 ++++++----- 2 files changed, 108 insertions(+), 69 deletions(-) diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 6721eed12f9..2923ea84ca5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1756,7 +1756,8 @@ struct Escrow_test : public beast::unit_test::suite return cfg; }), features); - XRPAmount const txnFees = env.current()->fees().base * 10 + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; // create escrow env.fund(XRP(5000), alice, carol); @@ -1767,7 +1768,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 20s), fee(txnFees)); env.close(); } @@ -1775,7 +1776,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + Condition + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 30s), escrow::condition(escrow::cb1), fee(txnFees)); env.close(); @@ -1784,7 +1785,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + FinishAfter + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 40s), escrow::finish_time(env.now() + 2s), fee(txnFees)); env.close(); @@ -1793,7 +1794,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + FinishAfter + Condition + CancelAfter env(escrowCreate, escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 50s), escrow::condition(escrow::cb1), escrow::finish_time(env.now() + 2s), fee(txnFees)); @@ -1841,11 +1842,20 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction 0 length env(escrowCreate, escrow::finish_function(""), - escrow::cancel_time(env.now() + 100s), + escrow::cancel_time(env.now() + 60s), fee(txnFees), ter(temMALFORMED)); env.close(); } + { + // Not enough fees + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 70s), + fee(txnFees - 1), + ter(telINSUF_FEE_P)); + env.close(); + } { // FinishFunction nonexistent host function @@ -1890,7 +1900,8 @@ struct Escrow_test : public beast::unit_test::suite // featureSmartEscrow disabled Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrow::finish(carol, alice, 1), fee(txnFees), escrow::comp_allowance(4), @@ -1929,7 +1940,8 @@ struct Escrow_test : public beast::unit_test::suite for (auto i = env.current()->seq(); i <= 257; ++i) env.close(); - XRPAmount const txnFees = env.current()->fees().base + 1000; + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env.fund(XRP(5000), alice, carol); // create escrow @@ -1986,7 +1998,10 @@ struct Escrow_test : public beast::unit_test::suite auto const allowance = 100; env(escrow::finish(carol, alice, seq2), - fee(env.current()->fees().base + allowance), + fee(env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1), escrow::comp_allowance(allowance), ter(tefNO_WASM)); } @@ -2007,6 +2022,17 @@ struct Escrow_test : public beast::unit_test::suite // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; std::uint32_t const allowance = 66; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto [createFee, finishFee] = [&]() { + Env env(*this, features); + auto createFee = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + return std::make_pair(createFee, finishFee); + }(); { // basic FinishFunction situation @@ -2015,38 +2041,36 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); env.close(); @@ -2059,7 +2083,7 @@ struct Escrow_test : public beast::unit_test::suite } env(escrow::finish(alice, alice, seq), - fee(txnFees), + fee(finishFee), escrow::comp_allowance(allowance), ter(tesSUCCESS)); @@ -2084,34 +2108,31 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto const seq = env.seq(alice); // create escrow - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount const createFee = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); + auto const conditionFinishFee = finishFee + + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); - XRPAmount const txnFees = - env.current()->fees().base * 34 + 1000; - // no fulfillment provided, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function fails env(escrow::finish(carol, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( @@ -2121,21 +2142,21 @@ struct Escrow_test : public beast::unit_test::suite // no fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecCRYPTOCONDITION_ERROR)); // wrong fulfillment provided, function succeeds env(escrow::finish(alice, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb2), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tecCRYPTOCONDITION_ERROR)); // fulfillment provided, function succeeds, tx succeeds env(escrow::finish(alice, alice, seq), escrow::condition(escrow::cb1), escrow::fulfillment(escrow::fb1), escrow::comp_allowance(allowance), - fee(txnFees), + fee(conditionFinishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2158,37 +2179,35 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; auto const ts = env.now() + 97s; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(ts), escrow::cancel_time(env.now() + 1000s), - fee(txnFees)); + fee(createFee)); env.close(); if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 1), + fee(finishFee + 1), ter(tecNO_PERMISSION)); env.close(); // finish time hasn't passed, function succeeds for (; env.now() < ts; env.close()) env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 2), + fee(finishFee + 2), ter(tecNO_PERMISSION)); env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees + 1), + fee(finishFee + 1), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2210,31 +2229,29 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), escrow::cancel_time(env.now() + 100s), - fee(txnFees)); + fee(createFee)); // Don't close the ledger here if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) { - env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); // finish time hasn't passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecNO_PERMISSION)); env.close(); // finish time has passed, function fails env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecWASM_REJECTED)); if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( @@ -2244,7 +2261,7 @@ struct Escrow_test : public beast::unit_test::suite // finish time has passed, function succeeds, tx succeeds env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2282,7 +2299,8 @@ struct Escrow_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 11s), @@ -2291,17 +2309,23 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT( + (*env.le(alice))[sfOwnerCount] == + (1 + wasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); auto const allowance = 1'000'000; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; // FinishAfter time hasn't passed env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tecNO_PERMISSION)); env.close(); env.close(); @@ -2314,7 +2338,7 @@ struct Escrow_test : public beast::unit_test::suite env(escrow::finish(alice, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees), + fee(finishFee), ter(tesSUCCESS)); auto const txMeta = env.meta(); @@ -2392,7 +2416,8 @@ struct Escrow_test : public beast::unit_test::suite env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); - XRPAmount txnFees = env.current()->fees().base + 1000; + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; env(escrow::create(alice, carol, XRP(1000)), escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), @@ -2403,10 +2428,13 @@ struct Escrow_test : public beast::unit_test::suite env.close(); auto const allowance = 137'596; - + auto const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), - fee(txnFees)); + fee(finishFee)); env.close(); auto const txMeta = env.meta(); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 4b5a92e8c2b..d0b42e16158 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -127,8 +127,9 @@ EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) XRPAmount txnFees{Transactor::calculateBaseFee(view, tx)}; if (tx.isFieldPresent(sfFinishFunction)) { - // TODO: make this fee increase based on the extra compute run - txnFees += 1000; + // 10 base fees for the transaction (1 is in + // `Transactor::calculateBaseFee`), plus 5 drops per byte + txnFees += 9 * view.fees().base + 5 * tx[sfFinishFunction].size(); } return txnFees; } @@ -503,6 +504,17 @@ escrowLockApplyHelper( return tesSUCCESS; } +template +static uint32_t +calculateAdditionalReserve(T const& finishFunction) +{ + if (!finishFunction) + return 1; + // First 500 bytes included in the normal reserve + // Each additional 500 bytes requires an additional reserve + return 1 + (finishFunction->size() / 500); +} + TER EscrowCreate::doApply() { @@ -546,9 +558,11 @@ EscrowCreate::doApply() // Check reserve and funds availability STAmount const amount{ctx_.tx[sfAmount]}; + auto const reserveToAdd = + calculateAdditionalReserve(ctx_.tx[~sfFinishFunction]); auto const reserve = - ctx_.view().fees().accountReserve((*sle)[sfOwnerCount] + 1); + ctx_.view().fees().accountReserve((*sle)[sfOwnerCount] + reserveToAdd); if (mSourceBalance < reserve) return tecINSUFFICIENT_RESERVE; @@ -654,11 +668,7 @@ EscrowCreate::doApply() // increment owner count // TODO: determine actual reserve based on FinishFunction size - adjustOwnerCount( - ctx_.view(), - sle, - ctx_.tx.isFieldPresent(sfFinishFunction) ? 2 : 1, - ctx_.journal); + adjustOwnerCount(ctx_.view(), sle, reserveToAdd, ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; } @@ -773,7 +783,11 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) } if (auto const allowance = tx[~sfComputationAllowance]; allowance) { - extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + // The extra fee is the allowance in drops, rounded up to the nearest + // whole drop. + // Integer math rounds down by default, so we add 1 to round up. + extraFee += + ((*allowance) * view.fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; } return Transactor::calculateBaseFee(view, tx) + extraFee; } @@ -1375,13 +1389,12 @@ EscrowFinish::doApply() ctx_.view().update(sled); + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); + // Adjust source owner count auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount( - ctx_.view(), - sle, - slep->isFieldPresent(sfFinishFunction) ? -2 : -1, - ctx_.journal); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger @@ -1592,11 +1605,9 @@ EscrowCancel::doApply() } } - adjustOwnerCount( - ctx_.view(), - sle, - slep->isFieldPresent(sfFinishFunction) ? -2 : -1, - ctx_.journal); + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); ctx_.view().update(sle); // Remove escrow from ledger From 5266f049707e4b5d0eecb8f0e397d2cae417f9f7 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 2 Sep 2025 18:26:01 -0400 Subject: [PATCH 060/212] chore: rollback unrelated changes (#5737) --- .../consensus/ByzantineFailureSim_test.cpp | 4 +- src/test/overlay/reduce_relay_test.cpp | 5 +- .../app/ledger/detail/TimeoutCounter.cpp | 4 +- src/xrpld/app/main/GRPCServer.cpp | 4 +- src/xrpld/app/misc/AMMHelpers.h | 6 +- src/xrpld/app/misc/detail/AMMUtils.cpp | 4 +- src/xrpld/app/misc/detail/TxQ.cpp | 10 +-- src/xrpld/app/paths/Pathfinder.cpp | 3 +- src/xrpld/app/paths/detail/BookStep.cpp | 3 +- src/xrpld/app/paths/detail/DirectStep.cpp | 3 +- .../app/paths/detail/XRPEndpointStep.cpp | 3 +- src/xrpld/app/rdb/RelationalDatabase.h | 4 +- src/xrpld/app/tx/detail/Batch.cpp | 87 +++++++++---------- src/xrpld/app/tx/detail/CancelOffer.cpp | 8 +- src/xrpld/consensus/Consensus.h | 14 +-- src/xrpld/ledger/detail/View.cpp | 6 +- src/xrpld/overlay/detail/PeerImp.cpp | 4 +- src/xrpld/peerfinder/detail/Logic.h | 6 +- 18 files changed, 92 insertions(+), 86 deletions(-) diff --git a/src/test/consensus/ByzantineFailureSim_test.cpp b/src/test/consensus/ByzantineFailureSim_test.cpp index b9799434776..887a060a5ba 100644 --- a/src/test/consensus/ByzantineFailureSim_test.cpp +++ b/src/test/consensus/ByzantineFailureSim_test.cpp @@ -68,8 +68,8 @@ class ByzantineFailureSim_test : public beast::unit_test::suite for (TrustGraph::ForkInfo const& fi : sim.trustGraph.forkablePairs(0.8)) { - std::cout << "Can fork " << PeerGroup{fi.unlA} << " " << " " - << PeerGroup{fi.unlB} << " overlap " << fi.overlap + std::cout << "Can fork " << PeerGroup{fi.unlA} << " " + << " " << PeerGroup{fi.unlB} << " overlap " << fi.overlap << " required " << fi.required << "\n"; }; diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index b7c55eafd3a..e53f53f2dbc 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -897,8 +897,9 @@ class reduce_relay_test : public beast::unit_test::suite printPeers(std::string const& msg, std::uint16_t validator = 0) { auto peers = network_.overlay().getPeers(network_.validator(validator)); - std::cout << msg << " " << "num peers " - << (int)network_.overlay().getNumPeers() << std::endl; + std::cout << msg << " " + << "num peers " << (int)network_.overlay().getNumPeers() + << std::endl; for (auto& [k, v] : peers) std::cout << k << ":" << (int)std::get(v) << " "; diff --git a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp index cdf659f5aa1..774b70e4d1e 100644 --- a/src/xrpld/app/ledger/detail/TimeoutCounter.cpp +++ b/src/xrpld/app/ledger/detail/TimeoutCounter.cpp @@ -100,8 +100,8 @@ TimeoutCounter::invokeOnTimer() if (!progress_) { ++timeouts_; - JLOG(journal_.debug()) - << "Timeout(" << timeouts_ << ") " << " acquiring " << hash_; + JLOG(journal_.debug()) << "Timeout(" << timeouts_ << ") " + << " acquiring " << hash_; onTimer(false, sl); } else diff --git a/src/xrpld/app/main/GRPCServer.cpp b/src/xrpld/app/main/GRPCServer.cpp index 2ee811dc19e..a4bbcda0a57 100644 --- a/src/xrpld/app/main/GRPCServer.cpp +++ b/src/xrpld/app/main/GRPCServer.cpp @@ -447,8 +447,8 @@ GRPCServerImpl::handleRpcs() if (!ok) { - JLOG(journal_.debug()) - << "Request listener cancelled. " << "Destroying object"; + JLOG(journal_.debug()) << "Request listener cancelled. " + << "Destroying object"; erase(ptr); } else diff --git a/src/xrpld/app/misc/AMMHelpers.h b/src/xrpld/app/misc/AMMHelpers.h index 0693973fe5f..8cc39468b10 100644 --- a/src/xrpld/app/misc/AMMHelpers.h +++ b/src/xrpld/app/misc/AMMHelpers.h @@ -384,9 +384,9 @@ changeSpotPriceQuality( { JLOG(j.error()) << "changeSpotPriceQuality failed: " << to_string(pool.in) - << " " << to_string(pool.out) << " " << " " << quality - << " " << tfee << " " << to_string(amounts.in) << " " - << to_string(amounts.out); + << " " << to_string(pool.out) << " " + << " " << quality << " " << tfee << " " + << to_string(amounts.in) << " " << to_string(amounts.out); Throw("changeSpotPriceQuality failed"); } else diff --git a/src/xrpld/app/misc/detail/AMMUtils.cpp b/src/xrpld/app/misc/detail/AMMUtils.cpp index 659219bb8ed..b56ce2748e8 100644 --- a/src/xrpld/app/misc/detail/AMMUtils.cpp +++ b/src/xrpld/app/misc/detail/AMMUtils.cpp @@ -151,8 +151,8 @@ ammLPHolds( } amount.setIssuer(ammAccount); - JLOG(j.trace()) << "ammLPHolds:" << " lpAccount=" - << to_string(lpAccount) + JLOG(j.trace()) << "ammLPHolds:" + << " lpAccount=" << to_string(lpAccount) << " amount=" << amount.getFullText(); } diff --git a/src/xrpld/app/misc/detail/TxQ.cpp b/src/xrpld/app/misc/detail/TxQ.cpp index caa4cba8bee..6924dae6c82 100644 --- a/src/xrpld/app/misc/detail/TxQ.cpp +++ b/src/xrpld/app/misc/detail/TxQ.cpp @@ -1504,11 +1504,11 @@ TxQ::accept(Application& app, OpenView& view) } else { - JLOG(j_.debug()) - << "Queued transaction " << candidateIter->txID - << " failed with " << transToken(txnResult) - << ". Leave in queue." << " Applied: " << didApply - << ". Flags: " << candidateIter->flags; + JLOG(j_.debug()) << "Queued transaction " << candidateIter->txID + << " failed with " << transToken(txnResult) + << ". Leave in queue." + << " Applied: " << didApply + << ". Flags: " << candidateIter->flags; if (account.retryPenalty && candidateIter->retriesRemaining > 2) candidateIter->retriesRemaining = 1; else diff --git a/src/xrpld/app/paths/Pathfinder.cpp b/src/xrpld/app/paths/Pathfinder.cpp index e8cef72d2b7..74a33ec917c 100644 --- a/src/xrpld/app/paths/Pathfinder.cpp +++ b/src/xrpld/app/paths/Pathfinder.cpp @@ -238,7 +238,8 @@ Pathfinder::findPaths( mSource = STPathElement(account, mSrcCurrency, issuer); auto issuerString = mSrcIssuer ? to_string(*mSrcIssuer) : std::string("none"); - JLOG(j_.trace()) << "findPaths>" << " mSrcAccount=" << mSrcAccount + JLOG(j_.trace()) << "findPaths>" + << " mSrcAccount=" << mSrcAccount << " mDstAccount=" << mDstAccount << " mDstAmount=" << mDstAmount.getFullText() << " mSrcCurrency=" << mSrcCurrency diff --git a/src/xrpld/app/paths/detail/BookStep.cpp b/src/xrpld/app/paths/detail/BookStep.cpp index 26d93629c98..554d2525f58 100644 --- a/src/xrpld/app/paths/detail/BookStep.cpp +++ b/src/xrpld/app/paths/detail/BookStep.cpp @@ -190,7 +190,8 @@ class BookStep : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\ninIss: " << book_.in.account + ostr << name << ": " + << "\ninIss: " << book_.in.account << "\noutIss: " << book_.out.account << "\ninCur: " << book_.in.currency << "\noutCur: " << book_.out.currency; diff --git a/src/xrpld/app/paths/detail/DirectStep.cpp b/src/xrpld/app/paths/detail/DirectStep.cpp index 1ff77c15012..5e62a289a3d 100644 --- a/src/xrpld/app/paths/detail/DirectStep.cpp +++ b/src/xrpld/app/paths/detail/DirectStep.cpp @@ -205,7 +205,8 @@ class DirectStepI : public StepImp> logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\nSrc: " << src_ << "\nDst: " << dst_; + ostr << name << ": " + << "\nSrc: " << src_ << "\nDst: " << dst_; return ostr.str(); } diff --git a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp index 4f38a7b422e..7fdfb3749dd 100644 --- a/src/xrpld/app/paths/detail/XRPEndpointStep.cpp +++ b/src/xrpld/app/paths/detail/XRPEndpointStep.cpp @@ -132,7 +132,8 @@ class XRPEndpointStep logStringImpl(char const* name) const { std::ostringstream ostr; - ostr << name << ": " << "\nAcc: " << acc_; + ostr << name << ": " + << "\nAcc: " << acc_; return ostr.str(); } diff --git a/src/xrpld/app/rdb/RelationalDatabase.h b/src/xrpld/app/rdb/RelationalDatabase.h index 927b08d3853..25b16f04a1f 100644 --- a/src/xrpld/app/rdb/RelationalDatabase.h +++ b/src/xrpld/app/rdb/RelationalDatabase.h @@ -238,8 +238,8 @@ rangeCheckedCast(C c) /* This should never happen */ UNREACHABLE("ripple::rangeCheckedCast : domain error"); JLOG(debugLog().error()) - << "rangeCheckedCast domain error:" << " value = " << c - << " min = " << std::numeric_limits::lowest() + << "rangeCheckedCast domain error:" + << " value = " << c << " min = " << std::numeric_limits::lowest() << " max: " << std::numeric_limits::max(); } diff --git a/src/xrpld/app/tx/detail/Batch.cpp b/src/xrpld/app/tx/detail/Batch.cpp index 40e506566bb..40991ea99a3 100644 --- a/src/xrpld/app/tx/detail/Batch.cpp +++ b/src/xrpld/app/tx/detail/Batch.cpp @@ -212,8 +212,8 @@ Batch::preflight(PreflightContext const& ctx) if (flags & tfBatchMask) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId << "]:" << "invalid flags."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "invalid flags."; return temINVALID_FLAG; } @@ -221,24 +221,23 @@ Batch::preflight(PreflightContext const& ctx) flags & (tfAllOrNothing | tfOnlyOne | tfUntilFailure | tfIndependent)) != 1) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId << "]:" << "too many flags."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "too many flags."; return temINVALID_FLAG; } auto const& rawTxns = ctx.tx.getFieldArray(sfRawTransactions); if (rawTxns.size() <= 1) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]:" << "txns array must have at least 2 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "txns array must have at least 2 entries."; return temARRAY_EMPTY; } if (rawTxns.size() > maxBatchTxCount) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]:" << "txns array exceeds 8 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" + << "txns array exceeds 8 entries."; return temARRAY_TOO_LARGE; } @@ -253,53 +252,50 @@ Batch::preflight(PreflightContext const& ctx) auto const hash = stx.getTransactionID(); if (!uniqueHashes.emplace(hash).second) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "duplicate Txn found. " << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "duplicate Txn found. " + << "txID: " << hash; return temREDUNDANT; } if (stx.getFieldU16(sfTransactionType) == ttBATCH) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "batch cannot have an inner batch txn. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "batch cannot have an inner batch txn. " + << "txID: " << hash; return temINVALID; } if (!(stx.getFlags() & tfInnerBatchTxn)) { JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn must have the tfInnerBatchTxn flag. " + << "BatchTrace[" << parentBatchId << "]: " + << "inner txn must have the tfInnerBatchTxn flag. " << "txID: " << hash; return temINVALID_FLAG; } if (stx.isFieldPresent(sfTxnSignature)) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn cannot include TxnSignature. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn cannot include TxnSignature. " + << "txID: " << hash; return temBAD_SIGNATURE; } if (stx.isFieldPresent(sfSigners)) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "inner txn cannot include Signers. " + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn cannot include Signers. " << "txID: " << hash; return temBAD_SIGNER; } if (!stx.getSigningPubKey().empty()) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn SigningPubKey must be empty. " - << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn SigningPubKey must be empty. " + << "txID: " << hash; return temBAD_REGKEY; } @@ -308,10 +304,10 @@ Batch::preflight(PreflightContext const& ctx) ctx.app, ctx.rules, parentBatchId, stx, tapBATCH, ctx.j); preflightResult.ter != tesSUCCESS) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "inner txn preflight failed: " - << transHuman(preflightResult.ter) << " " << "txID: " << hash; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn preflight failed: " + << transHuman(preflightResult.ter) << " " + << "txID: " << hash; return temINVALID_INNER_BATCH; } @@ -319,8 +315,8 @@ Batch::preflight(PreflightContext const& ctx) if (auto const fee = stx.getFieldAmount(sfFee); !fee.native() || fee.xrp() != beast::zero) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "inner txn must have a fee of 0. " + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "inner txn must have a fee of 0. " << "txID: " << hash; return temBAD_FEE; } @@ -357,7 +353,8 @@ Batch::preflight(PreflightContext const& ctx) { JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " - << "duplicate sequence found: " << "txID: " << hash; + << "duplicate sequence found: " + << "txID: " << hash; return temREDUNDANT; } } @@ -369,7 +366,8 @@ Batch::preflight(PreflightContext const& ctx) { JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " - << "duplicate ticket found: " << "txID: " << hash; + << "duplicate ticket found: " + << "txID: " << hash; return temREDUNDANT; } } @@ -395,8 +393,8 @@ Batch::preflight(PreflightContext const& ctx) // Check that the batch signers array is not too large. if (signers.size() > maxBatchTxCount) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "signers array exceeds 8 entries."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "signers array exceeds 8 entries."; return temARRAY_TOO_LARGE; } @@ -419,8 +417,8 @@ Batch::preflight(PreflightContext const& ctx) if (!batchSigners.insert(signerAccount).second) { JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "duplicate signer found: " << signerAccount; + << "BatchTrace[" << parentBatchId << "]: " + << "duplicate signer found: " << signerAccount; return temREDUNDANT; } @@ -428,9 +426,8 @@ Batch::preflight(PreflightContext const& ctx) // Remove it if it does, as it can be crossed off the list. if (requiredSigners.erase(signerAccount) == 0) { - JLOG(ctx.j.debug()) - << "BatchTrace[" << parentBatchId - << "]: " << "no account signature for inner txn."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "no account signature for inner txn."; return temBAD_SIGNER; } } @@ -450,8 +447,8 @@ Batch::preflight(PreflightContext const& ctx) if (!requiredSigners.empty()) { - JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId - << "]: " << "invalid batch signers."; + JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]: " + << "invalid batch signers."; return temBAD_SIGNER; } return tesSUCCESS; diff --git a/src/xrpld/app/tx/detail/CancelOffer.cpp b/src/xrpld/app/tx/detail/CancelOffer.cpp index 6d8c077a621..004ae1e8b97 100644 --- a/src/xrpld/app/tx/detail/CancelOffer.cpp +++ b/src/xrpld/app/tx/detail/CancelOffer.cpp @@ -35,8 +35,8 @@ CancelOffer::preflight(PreflightContext const& ctx) if (uTxFlags & tfUniversalMask) { - JLOG(ctx.j.trace()) - << "Malformed transaction: " << "Invalid flags set."; + JLOG(ctx.j.trace()) << "Malformed transaction: " + << "Invalid flags set."; return temINVALID_FLAG; } @@ -63,8 +63,8 @@ CancelOffer::preclaim(PreclaimContext const& ctx) if ((*sle)[sfSequence] <= offerSequence) { - JLOG(ctx.j.trace()) << "Malformed transaction: " << "Sequence " - << offerSequence << " is invalid."; + JLOG(ctx.j.trace()) << "Malformed transaction: " + << "Sequence " << offerSequence << " is invalid."; return temBAD_SEQUENCE; } diff --git a/src/xrpld/consensus/Consensus.h b/src/xrpld/consensus/Consensus.h index b548b45cc2c..df6cedccff1 100644 --- a/src/xrpld/consensus/Consensus.h +++ b/src/xrpld/consensus/Consensus.h @@ -1121,8 +1121,8 @@ Consensus::checkLedger(std::unique_ptr const& clog) auto netLgr = adaptor_.getPrevLedger(prevLedgerID_, previousLedger_, mode_.get()); - CLOG(clog) << "network ledgerid " << netLgr << ", " << "previous ledger " - << prevLedgerID_ << ". "; + CLOG(clog) << "network ledgerid " << netLgr << ", " + << "previous ledger " << prevLedgerID_ << ". "; if (netLgr != prevLedgerID_) { @@ -1213,7 +1213,8 @@ Consensus::phaseOpen(std::unique_ptr const& clog) adaptor_.parms().ledgerIDLE_INTERVAL, 2 * previousLedger_.closeTimeResolution()); CLOG(clog) << "idle interval set to " << idleInterval.count() - << "ms based on " << "ledgerIDLE_INTERVAL: " + << "ms based on " + << "ledgerIDLE_INTERVAL: " << adaptor_.parms().ledgerIDLE_INTERVAL.count() << ", previous ledger close time resolution: " << previousLedger_.closeTimeResolution().count() << "ms. "; @@ -1261,7 +1262,8 @@ Consensus::shouldPause( << "roundTime: " << result_->roundTime.read().count() << ", " << "max consensus time: " << parms.ledgerMAX_CONSENSUS.count() << ", " << "validators: " << totalValidators << ", " - << "laggards: " << laggards << ", " << "offline: " << offline << ", " + << "laggards: " << laggards << ", " + << "offline: " << offline << ", " << "quorum: " << quorum << ")"; if (!ahead || !laggards || !totalValidators || !adaptor_.validator() || @@ -1622,8 +1624,8 @@ Consensus::updateOurPositions( if (!haveCloseTimeConsensus_) { JLOG(j_.debug()) - << "No CT consensus:" << " Proposers:" - << currPeerPositions_.size() + << "No CT consensus:" + << " Proposers:" << currPeerPositions_.size() << " Mode:" << to_string(mode_.get()) << " Thresh:" << threshConsensus << " Pos:" << consensusCloseTime.time_since_epoch().count(); diff --git a/src/xrpld/ledger/detail/View.cpp b/src/xrpld/ledger/detail/View.cpp index 2ef40eeebd6..4f8a29d15c3 100644 --- a/src/xrpld/ledger/detail/View.cpp +++ b/src/xrpld/ledger/detail/View.cpp @@ -457,7 +457,8 @@ accountHolds( amount.clear(Issue{currency, issuer}); } - JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(account) + JLOG(j.trace()) << "accountHolds:" + << " account=" << to_string(account) << " amount=" << amount.getFullText(); return view.balanceHook(account, issuer, amount); @@ -638,7 +639,8 @@ xrpLiquid( STAmount const amount = (balance < reserve) ? STAmount{0} : balance - reserve; - JLOG(j.trace()) << "accountHolds:" << " account=" << to_string(id) + JLOG(j.trace()) << "accountHolds:" + << " account=" << to_string(id) << " amount=" << amount.getFullText() << " fullBalance=" << fullBalance.getFullText() << " balance=" << balance.getFullText() diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 7c2499b97dd..69f25e1eb49 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -1286,8 +1286,8 @@ PeerImp::handleTransaction( { // If we've never been in synch, there's nothing we can do // with a transaction - JLOG(p_journal_.debug()) - << "Ignoring incoming transaction: " << "Need network ledger"; + JLOG(p_journal_.debug()) << "Ignoring incoming transaction: " + << "Need network ledger"; return; } diff --git a/src/xrpld/peerfinder/detail/Logic.h b/src/xrpld/peerfinder/detail/Logic.h index 9da2e55726a..4b92a1d1431 100644 --- a/src/xrpld/peerfinder/detail/Logic.h +++ b/src/xrpld/peerfinder/detail/Logic.h @@ -1132,9 +1132,9 @@ class Logic } else { - JLOG(m_journal.error()) - << beast::leftw(18) << "Logic failed " << "'" << source->name() - << "' fetch, " << results.error.message(); + JLOG(m_journal.error()) << beast::leftw(18) << "Logic failed " + << "'" << source->name() << "' fetch, " + << results.error.message(); } } From a46d772147d65ced864c6e780216bd142d29ab61 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 4 Sep 2025 17:05:39 -0400 Subject: [PATCH 061/212] fix build and tests (#5768) * fix conan.lock * add conan.lock to triggers * update on-trigger.yml too * fix tests * roll back unrelated changes --- .github/workflows/on-pr.yml | 1 + .github/workflows/on-trigger.yml | 1 + conan.lock | 3 ++- src/test/app/Escrow_test.cpp | 43 +++++++++++++++++--------------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml index a4bbfd0997e..8008aebcbb9 100644 --- a/.github/workflows/on-pr.yml +++ b/.github/workflows/on-pr.yml @@ -75,6 +75,7 @@ jobs: tests/** CMakeLists.txt conanfile.py + conan.lock - name: Check whether to run # This step determines whether the rest of the workflow should # run. The rest of the workflow will run if this job runs AND at diff --git a/.github/workflows/on-trigger.yml b/.github/workflows/on-trigger.yml index 7732b814adf..dcd592a1f7e 100644 --- a/.github/workflows/on-trigger.yml +++ b/.github/workflows/on-trigger.yml @@ -32,6 +32,7 @@ on: - "tests/**" - "CMakeLists.txt" - "conanfile.py" + - "conan.lock" # Run at 06:32 UTC on every day of the week from Monday through Friday. This # will force all dependencies to be rebuilt, which is useful to verify that diff --git a/conan.lock b/conan.lock index 0f11f086b41..f30abd020de 100644 --- a/conan.lock +++ b/conan.lock @@ -3,6 +3,7 @@ "requires": [ "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", + "wamr/2.4.1#731b101bc8fa06d84e5c84edb4dc41a5%1755280063.774542", "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", @@ -53,4 +54,4 @@ ] }, "config_requires": [] -} \ No newline at end of file +} diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 2923ea84ca5..74babf797cc 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -2040,14 +2040,14 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2097,7 +2097,7 @@ struct Escrow_test : public beast::unit_test::suite txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2105,7 +2105,7 @@ struct Escrow_test : public beast::unit_test::suite // FinishFunction + Condition Env env(*this, features); env.fund(XRP(5000), alice, carol); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto const seq = env.seq(alice); // create escrow env(escrowCreate, @@ -2117,7 +2117,7 @@ struct Escrow_test : public beast::unit_test::suite auto const conditionFinishFee = finishFee + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2168,7 +2168,7 @@ struct Escrow_test : public beast::unit_test::suite std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2178,7 +2178,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto const ts = env.now() + 97s; env(escrowCreate, escrow::finish_function(wasmHex), @@ -2187,7 +2187,7 @@ struct Escrow_test : public beast::unit_test::suite fee(createFee)); env.close(); - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2218,7 +2218,7 @@ struct Escrow_test : public beast::unit_test::suite txMeta->getFieldI32(sfWasmReturnCode) == 13, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } @@ -2228,7 +2228,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); env(escrowCreate, escrow::finish_function(wasmHex), escrow::finish_time(env.now() + 2s), @@ -2236,7 +2236,7 @@ struct Escrow_test : public beast::unit_test::suite fee(createFee)); // Don't close the ledger here - if (BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2)) + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { env.require(balance(alice, XRP(4000) - createFee)); env.require(balance(carol, XRP(5000))); @@ -2273,7 +2273,7 @@ struct Escrow_test : public beast::unit_test::suite std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } } @@ -2297,7 +2297,7 @@ struct Escrow_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); XRPAmount txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; @@ -2310,8 +2310,7 @@ struct Escrow_test : public beast::unit_test::suite env.close(); if (BEAST_EXPECT( - (*env.le(alice))[sfOwnerCount] == - (1 + wasmHex.size() / 2 / 500))) + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); @@ -2350,7 +2349,7 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); } } } @@ -2374,7 +2373,7 @@ struct Escrow_test : public beast::unit_test::suite env.fund(XRP(10000), alice, carol); BEAST_EXPECT(env.seq(alice) == 4); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 0); + BEAST_EXPECT(env.ownerCount(alice) == 0); // base objects that need to be created first auto const tokenId = @@ -2383,7 +2382,7 @@ struct Escrow_test : public beast::unit_test::suite env(trust(alice, carol["USD"](1'000'000))); env.close(); BEAST_EXPECT(env.seq(alice) == 6); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 2); + BEAST_EXPECT(env.ownerCount(alice) == 2); // set up a bunch of objects to check their keylets AMM amm(env, carol, XRP(10), carol["USD"](1000)); @@ -2411,7 +2410,9 @@ struct Escrow_test : public beast::unit_test::suite env(tx); env.close(); - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); if (BEAST_EXPECTS( env.seq(alice) == 20, std::to_string(env.seq(alice)))) { @@ -2444,7 +2445,9 @@ struct Escrow_test : public beast::unit_test::suite BEAST_EXPECTS( gasUsed == allowance, std::to_string(gasUsed)); } - BEAST_EXPECT((*env.le(alice))[sfOwnerCount] == 15); + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); } } } From 45ab15d4b5a11f45175c679361e5ab0222544698 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 14:40:48 -0400 Subject: [PATCH 062/212] add WAMR dependency --- BUILD.md | 1 + CMakeLists.txt | 1 + cmake/RippledCore.cmake | 6 + conan.lock | 3 +- conanfile.py | 4 + external/wamr/conandata.yml | 6 + external/wamr/conanfile.py | 92 +++ external/wamr/patches/ripp_metering.patch | 901 ++++++++++++++++++++++ 8 files changed, 1013 insertions(+), 1 deletion(-) create mode 100644 external/wamr/conandata.yml create mode 100644 external/wamr/conanfile.py create mode 100644 external/wamr/patches/ripp_metering.patch diff --git a/BUILD.md b/BUILD.md index 6b1594bb5ee..0b1da3703cf 100644 --- a/BUILD.md +++ b/BUILD.md @@ -147,6 +147,7 @@ git sparse-checkout set recipes/snappy git sparse-checkout add recipes/soci git fetch origin master git checkout master +conan export --version 2.4.1 external/wamr # TODO: needs to be added to the conan center index conan export --version 1.1.10 recipes/snappy/all conan export --version 4.0.3 recipes/soci/all rm -rf .git diff --git a/CMakeLists.txt b/CMakeLists.txt index c71fb685990..022f45e395d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,6 +120,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) +find_package(wamr REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index 7d3561675a1..1c86c8a4819 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,8 +65,14 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> + wamr::wamr ) +if (WIN32) + target_link_libraries(xrpl.imports.main INTERFACE ntdll) +endif() + + include(add_module) include(target_link_modules) diff --git a/conan.lock b/conan.lock index 0f11f086b41..2726749ffda 100644 --- a/conan.lock +++ b/conan.lock @@ -3,6 +3,7 @@ "requires": [ "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", + "wamr/2.4.1#731b101bc8fa06d84e5c84edb4dc41a5%1756223745.11", "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", @@ -53,4 +54,4 @@ ] }, "config_requires": [] -} \ No newline at end of file +} diff --git a/conanfile.py b/conanfile.py index 01f61c5d4e6..b6ce2e35a91 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout import re + class Xrpl(ConanFile): name = 'xrpl' @@ -30,6 +31,7 @@ class Xrpl(ConanFile): 'openssl/3.5.2', 'soci/4.0.3', 'zlib/1.3.1', + 'wamr/2.4.1', ] test_requires = [ @@ -133,6 +135,7 @@ def layout(self): self.folders.generators = 'build/generators' generators = 'CMakeDeps' + def generate(self): tc = CMakeToolchain(self) tc.variables['tests'] = self.options.tests @@ -190,6 +193,7 @@ def package_info(self): 'protobuf::libprotobuf', 'soci::soci', 'sqlite3::sqlite', + 'wamr::wamr', 'xxhash::xxhash', 'zlib::zlib', ] diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml new file mode 100644 index 00000000000..d475ad987c0 --- /dev/null +++ b/external/wamr/conandata.yml @@ -0,0 +1,6 @@ +patches: + 2.4.1: + - patch_description: add metering to iwasm interpreter + patch_file: patches/ripp_metering.patch + patch_type: conan + diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py new file mode 100644 index 00000000000..429c509795f --- /dev/null +++ b/external/wamr/conanfile.py @@ -0,0 +1,92 @@ +from conan import ConanFile, tools +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import ( + apply_conandata_patches, + export_conandata_patches, + # get, +) +from conan.tools.scm import Git + +# import os + +required_conan_version = ">=1.55.0" + + +class WamrConan(ConanFile): + name = "wamr" + version = "2.4.1" + license = "Apache License v2.0" + url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" + description = "Webassembly micro runtime" + package_type = "library" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False], "fPIC": [True, False]} + default_options = {"shared": False, "fPIC": True} + # requires = [("llvm/20.1.1@")] + + def export_sources(self): + export_conandata_patches(self) + pass + + # def build_requirements(self): + # self.tool_requires("llvm/20.1.1") + + def config_options(self): + if self.settings.os == "Windows": + del self.options.fPIC + + def layout(self): + cmake_layout(self, src_folder="src") + + def source(self): + git = Git(self) + git.fetch_commit( + url="https://github.com/bytecodealliance/wasm-micro-runtime.git", + commit="b124f70345d712bead5c0c2393acb2dc583511de", + ) + # get(self, **self.conan_data["sources"][self.version], strip_root=True) + + def generate(self): + tc = CMakeToolchain(self) + + tc.variables["WAMR_BUILD_INTERP"] = 1 + tc.variables["WAMR_BUILD_FAST_INTERP"] = 1 + tc.variables["WAMR_BUILD_INSTRUCTION_METERING"] = 1 + tc.variables["WAMR_BUILD_AOT"] = 0 + tc.variables["WAMR_BUILD_JIT"] = 0 + tc.variables["WAMR_BUILD_FAST_JIT"] = 0 + tc.variables["WAMR_BUILD_SIMD"] = 0 + tc.variables["WAMR_BUILD_LIB_PTHREAD"] = 0 + tc.variables["WAMR_BUILD_LIB_WASI_THREADS"] = 0 + tc.variables["WAMR_BUILD_TAIL_CALL"] = 1 + tc.variables["WAMR_BUILD_BULK_MEMORY"] = 0 + tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 + tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 + tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" + + tc.generate() + + # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder + deps = CMakeDeps(self) + deps.generate() + + def build(self): + apply_conandata_patches(self) + cmake = CMake(self) + cmake.verbose = True + cmake.configure() + cmake.build() + # self.run(f'echo {self.source_folder}') + # Explicit way: + # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) + # self.run("cmake --build . %s" % cmake.build_config) + + def package(self): + cmake = CMake(self) + cmake.verbose = True + cmake.install() + + def package_info(self): + self.cpp_info.libs = ["iwasm"] + self.cpp_info.names["cmake_find_package"] = "wamr" + self.cpp_info.names["cmake_find_package_multi"] = "wamr" diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch new file mode 100644 index 00000000000..2e8ec70d7a8 --- /dev/null +++ b/external/wamr/patches/ripp_metering.patch @@ -0,0 +1,901 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 4b28fa89..7d523a3d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -1,7 +1,7 @@ + # Copyright (C) 2019 Intel Corporation. All rights reserved. + # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + +-cmake_minimum_required (VERSION 3.14) ++cmake_minimum_required (VERSION 3.20) + + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + +@@ -170,7 +170,7 @@ if (MINGW) + endif () + + if (WIN32) +- target_link_libraries(vmlib PRIVATE ntdll) ++ target_link_libraries(vmlib PUBLIC ntdll) + endif() + + set (WAMR_PUBLIC_HEADERS +diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c +index d2621fb2..6c96a844 100644 +--- a/core/iwasm/aot/aot_runtime.c ++++ b/core/iwasm/aot/aot_runtime.c +@@ -5611,7 +5611,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) + import_func->func_ptr_linked = wasm_native_resolve_symbol( + import_func->module_name, import_func->func_name, + import_func->func_type, &import_func->signature, +- &import_func->attachment, &import_func->call_conv_raw); ++ &import_func->attachment, NULL, &import_func->call_conv_raw); + #if WASM_ENABLE_MULTI_MODULE != 0 + if (!import_func->func_ptr_linked) { + if (!wasm_runtime_is_built_in_module(import_func->module_name)) { +diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c +index 269ec577..34eb7c34 100644 +--- a/core/iwasm/common/wasm_c_api.c ++++ b/core/iwasm/common/wasm_c_api.c +@@ -3242,10 +3242,20 @@ wasm_func_copy(const wasm_func_t *func) + + cloned->func_idx_rt = func->func_idx_rt; + cloned->inst_comm_rt = func->inst_comm_rt; ++ cloned->gas = func->gas; + + RETURN_OBJ(cloned, wasm_func_delete) + } + ++uint32_t ++wasm_func_set_gas(wasm_func_t *func, uint32_t gas) ++{ ++ if(!func) return 0; ++ ++ func->gas = gas; ++ return gas; ++} ++ + own wasm_functype_t * + wasm_func_type(const wasm_func_t *func) + { +@@ -4998,11 +5008,11 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + goto failed; + } + ++ WASMModuleInstance *wasm_module_inst = NULL; + /* create the c-api func import list */ + #if WASM_ENABLE_INTERP != 0 + if (instance->inst_comm_rt->module_type == Wasm_Module_Bytecode) { +- WASMModuleInstance *wasm_module_inst = +- (WASMModuleInstance *)instance->inst_comm_rt; ++ wasm_module_inst = (WASMModuleInstance *)instance->inst_comm_rt; + p_func_imports = &(wasm_module_inst->c_api_func_imports); + import_func_count = MODULE_INTERP(module)->import_function_count; + } +@@ -5052,6 +5062,13 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, + } + bh_assert(func_import->func_ptr_linked); + ++ // fill gas ++ if(wasm_module_inst) { ++ WASMFunctionInstance *fi = wasm_module_inst->e->functions + func_host->func_idx_rt; ++ if(fi) fi->gas = func_host->gas; ++ } ++ ++ + func_import++; + } + +@@ -5389,3 +5406,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, + return -1.0; + #endif + } ++ ++wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t *instance) ++{ ++ return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); ++} +diff --git a/core/iwasm/common/wasm_c_api_internal.h b/core/iwasm/common/wasm_c_api_internal.h +index 49a17a96..19a85980 100644 +--- a/core/iwasm/common/wasm_c_api_internal.h ++++ b/core/iwasm/common/wasm_c_api_internal.h +@@ -142,6 +142,10 @@ struct wasm_func_t { + void (*finalizer)(void *); + } cb_env; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + /* + * an index in both functions runtime instance lists + * of interpreter mode and aot mode +diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c +index 47752950..5f26d886 100644 +--- a/core/iwasm/common/wasm_exec_env.c ++++ b/core/iwasm/common/wasm_exec_env.c +@@ -86,7 +86,7 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, + #endif + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- exec_env->instructions_to_execute = -1; ++ exec_env->instructions_to_execute = INT64_MAX; + #endif + + return exec_env; +diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h +index 5d80312f..b2ecce2e 100644 +--- a/core/iwasm/common/wasm_exec_env.h ++++ b/core/iwasm/common/wasm_exec_env.h +@@ -89,7 +89,7 @@ typedef struct WASMExecEnv { + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + /* instructions to execute */ +- int instructions_to_execute; ++ int64 instructions_to_execute; + #endif + + #if WASM_ENABLE_FAST_JIT != 0 +diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c +index 060bb2c3..9221c36a 100644 +--- a/core/iwasm/common/wasm_native.c ++++ b/core/iwasm/common/wasm_native.c +@@ -180,9 +180,9 @@ native_symbol_cmp(const void *native_symbol1, const void *native_symbol2) + ((const NativeSymbol *)native_symbol2)->symbol); + } + +-static void * ++static NativeSymbol * + lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, +- const char *symbol, const char **p_signature, void **p_attachment) ++ const char *symbol) + { + NativeSymbol *native_symbol, key = { 0 }; + +@@ -190,9 +190,7 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + + if ((native_symbol = bsearch(&key, native_symbols, n_native_symbols, + sizeof(NativeSymbol), native_symbol_cmp))) { +- *p_signature = native_symbol->signature; +- *p_attachment = native_symbol->attachment; +- return native_symbol->func_ptr; ++ return native_symbol; + } + + return NULL; +@@ -205,25 +203,36 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw) + { + NativeSymbolsNode *node, *node_next; + const char *signature = NULL; + void *func_ptr = NULL, *attachment = NULL; ++ NativeSymbol *native_symbol = NULL; + + node = g_native_symbols_list; + while (node) { + node_next = node->next; + if (!strcmp(node->module_name, module_name)) { +- if ((func_ptr = ++ if ((native_symbol = + lookup_symbol(node->native_symbols, node->n_native_symbols, +- field_name, &signature, &attachment)) ++ field_name)) + || (field_name[0] == '_' +- && (func_ptr = lookup_symbol( ++ && (native_symbol = lookup_symbol( + node->native_symbols, node->n_native_symbols, +- field_name + 1, &signature, &attachment)))) +- break; ++ field_name + 1)))) ++ { ++ func_ptr = native_symbol->func_ptr; ++ if(func_ptr) ++ { ++ if(gas) ++ *gas = native_symbol->gas; ++ signature = native_symbol->signature; ++ attachment = native_symbol->attachment; ++ break; ++ } ++ } + } + node = node_next; + } +diff --git a/core/iwasm/common/wasm_native.h b/core/iwasm/common/wasm_native.h +index 9a6afee1..0fe4739f 100644 +--- a/core/iwasm/common/wasm_native.h ++++ b/core/iwasm/common/wasm_native.h +@@ -52,7 +52,7 @@ wasm_native_lookup_libc_builtin_global(const char *module_name, + void * + wasm_native_resolve_symbol(const char *module_name, const char *field_name, + const WASMFuncType *func_type, +- const char **p_signature, void **p_attachment, ++ const char **p_signature, void **p_attachment, uint32_t *gas, + bool *p_call_conv_raw); + + bool +diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c +index 943b46fc..d026777e 100644 +--- a/core/iwasm/common/wasm_runtime_common.c ++++ b/core/iwasm/common/wasm_runtime_common.c +@@ -2344,10 +2344,18 @@ wasm_runtime_access_exce_check_guard_page() + #if WASM_ENABLE_INSTRUCTION_METERING != 0 + void + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute) ++ int64 instructions_to_execute) + { ++ if(instructions_to_execute == -1) ++ instructions_to_execute = INT64_MAX; + exec_env->instructions_to_execute = instructions_to_execute; + } ++ ++int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) ++{ ++ return exec_env->instructions_to_execute; ++} + #endif + + WASMFuncType * +@@ -7412,7 +7420,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, + const char *func_name) + { + return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, +- NULL); ++ NULL, NULL); + } + + bool +@@ -7869,13 +7877,14 @@ wasm_runtime_get_module_name(wasm_module_t module) + bool + wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + { ++#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 + uint8 *boundary = exec_env->native_stack_boundary; + RECORD_STACK_USAGE(exec_env, (uint8 *)&boundary); + if (boundary == NULL) { + /* the platform doesn't support os_thread_get_stack_boundary */ + return true; + } +-#if defined(OS_ENABLE_HW_BOUND_CHECK) && WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 ++#if defined(OS_ENABLE_HW_BOUND_CHECK) + uint32 page_size = os_getpagesize(); + uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; + boundary = boundary + page_size * guard_page_count; +@@ -7885,6 +7894,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) + "native stack overflow"); + return false; + } ++#endif + return true; + } + +@@ -7907,7 +7917,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, + boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; + if ((uint8 *)&boundary < boundary) { + wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), +- "native stack overflow"); ++ "native s stack overflow"); + return false; + } + return true; +diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h +index 324620be..54155a0c 100644 +--- a/core/iwasm/common/wasm_runtime_common.h ++++ b/core/iwasm/common/wasm_runtime_common.h +@@ -833,7 +833,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, + /* See wasm_export.h for description */ + WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, +- int instructions_to_execute); ++ int64 instructions_to_execute); ++WASM_RUNTIME_API_EXTERN int64 ++wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); ++ + #endif + + #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 +diff --git a/core/iwasm/include/lib_export.h b/core/iwasm/include/lib_export.h +index 0ca668f5..93bcf807 100644 +--- a/core/iwasm/include/lib_export.h ++++ b/core/iwasm/include/lib_export.h +@@ -24,6 +24,8 @@ typedef struct NativeSymbol { + /* attachment which can be retrieved in native API by + calling wasm_runtime_get_function_attachment(exec_env) */ + void *attachment; ++ // gas cost for import func ++ uint32_t gas; + } NativeSymbol; + + /* clang-format off */ +diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h +index 241a0eec..1141744c 100644 +--- a/core/iwasm/include/wasm_c_api.h ++++ b/core/iwasm/include/wasm_c_api.h +@@ -19,8 +19,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_API_EXTERN + #endif + #else + #define WASM_API_EXTERN +@@ -592,6 +594,8 @@ WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); + WASM_API_EXTERN own wasm_trap_t* wasm_func_call( + const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); + ++WASM_API_EXTERN own uint32_t wasm_func_set_gas(wasm_func_t*, uint32_t); ++ + + // Global Instances + +@@ -701,6 +705,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); + // func_name. If the function is not found, return 0. + WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); + ++struct WASMExecEnv; ++typedef struct WASMExecEnv *wasm_exec_env_t; ++ ++WASM_API_EXTERN wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*); ++ + /////////////////////////////////////////////////////////////////////////////// + // Convenience + +diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h +index 81efb8f6..f752a970 100644 +--- a/core/iwasm/include/wasm_export.h ++++ b/core/iwasm/include/wasm_export.h +@@ -20,8 +20,10 @@ + #if defined(_MSC_BUILD) + #if defined(COMPILING_WASM_RUNTIME_API) + #define WASM_RUNTIME_API_EXTERN __declspec(dllexport) +-#else ++#elif defined(_DLL) + #define WASM_RUNTIME_API_EXTERN __declspec(dllimport) ++#else ++#define WASM_RUNTIME_API_EXTERN + #endif + #elif defined(__GNUC__) || defined(__clang__) + #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) +@@ -1874,7 +1876,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, + */ + WASM_RUNTIME_API_EXTERN void + wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, +- int instruction_count); ++ int64_t instruction_count); ++ ++WASM_RUNTIME_API_EXTERN int64_t ++wasm_runtime_get_instruction_count_limit(wasm_exec_env_t exec_env); ++ ++WASM_RUNTIME_API_EXTERN void ++wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, ++ int64_t const *instructions_schedule); + + /** + * Dump runtime memory consumption, including: +diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h +index 0dd73958..b7cad5f2 100644 +--- a/core/iwasm/interpreter/wasm.h ++++ b/core/iwasm/interpreter/wasm.h +@@ -617,6 +617,9 @@ typedef struct WASMFunctionImport { + WASMModule *import_module; + WASMFunction *import_func_linked; + #endif ++ // gas cost for import func ++ uint32 gas; ++ + } WASMFunctionImport; + + #if WASM_ENABLE_TAGS != 0 +diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c +index edc473f2..55071613 100644 +--- a/core/iwasm/interpreter/wasm_interp_classic.c ++++ b/core/iwasm/interpreter/wasm_interp_classic.c +@@ -1547,13 +1547,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) + } + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; ++#define CHECK_INSTRUCTION_LIMIT() \ ++ do { \ ++ --instructions_left; \ ++ if (instructions_left < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } while (0) + #else + #define CHECK_INSTRUCTION_LIMIT() (void)0 + #endif +@@ -1603,10 +1604,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint32 cache_index, type_index, param_cell_num, cell_num; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; +- if (exec_env) { ++ int64 instructions_left = INT64_MAX; ++ if (exec_env) + instructions_left = exec_env->instructions_to_execute; +- } + #endif + + #if WASM_ENABLE_EXCE_HANDLING != 0 +@@ -6849,6 +6849,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_left; ++#endif ++ + if (!prev_frame->ip) { + /* Called from native. */ + return; +@@ -6889,6 +6894,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + #endif + SYNC_ALL_TO_FRAME(); ++ ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if(exec_env) ++ exec_env->instructions_to_execute = instructions_left; ++#endif ++ + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c +index 36d4538f..4d03603e 100644 +--- a/core/iwasm/interpreter/wasm_interp_fast.c ++++ b/core/iwasm/interpreter/wasm_interp_fast.c +@@ -90,14 +90,14 @@ typedef float64 CellType_F64; + } while (0) + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +-#define CHECK_INSTRUCTION_LIMIT() \ +- if (instructions_left == 0) { \ +- wasm_set_exception(module, "instruction limit exceeded"); \ +- goto got_exception; \ +- } \ +- else if (instructions_left > 0) \ +- instructions_left--; +- ++#define CHECK_INSTRUCTION_LIMIT() \ ++ do { \ ++ --instructions_left; \ ++ if (instructions_left < 0) { \ ++ wasm_set_exception(module, "instruction limit exceeded"); \ ++ goto got_exception; \ ++ } \ ++ } while (0) + #else + #define CHECK_INSTRUCTION_LIMIT() (void)0 + #endif +@@ -1438,7 +1438,6 @@ wasm_interp_dump_op_count() + do { \ + const void *p_label_addr = *(void **)frame_ip; \ + frame_ip += sizeof(void *); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1450,7 +1449,6 @@ wasm_interp_dump_op_count() + /* int32 relative offset was emitted in 64-bit target */ \ + p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #else +@@ -1461,17 +1459,18 @@ wasm_interp_dump_op_count() + /* uint32 label address was emitted in 32-bit target */ \ + p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ + frame_ip += sizeof(int32); \ +- CHECK_INSTRUCTION_LIMIT(); \ + goto *p_label_addr; \ + } while (0) + #endif + #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ +-#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() ++#define HANDLE_OP_END() CHECK_INSTRUCTION_LIMIT(); FETCH_OPCODE_AND_DISPATCH() + + #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ + + #define HANDLE_OP(opcode) case opcode: +-#define HANDLE_OP_END() continue ++#define HANDLE_OP_END() \ ++ CHECK_INSTRUCTION_LIMIT(); \ ++ continue + + #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ + +@@ -1540,10 +1539,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + uint8 opcode = 0, local_type, *global_addr; + + #if WASM_ENABLE_INSTRUCTION_METERING != 0 +- int instructions_left = -1; +- if (exec_env) { ++ int64 instructions_left = INT64_MAX; ++ if (exec_env) + instructions_left = exec_env->instructions_to_execute; +- } + #endif + #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ + || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 +@@ -4012,7 +4010,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + } + + /* constant instructions */ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_F64_CONST) ++#else ++ HANDLE_OP(WASM_OP_F64_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I64_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4025,7 +4031,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ HANDLE_OP(WASM_OP_F32_CONST) ++#else + HANDLE_OP(WASM_OP_F32_CONST) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + HANDLE_OP(WASM_OP_I32_CONST) + { + uint8 *orig_ip = frame_ip; +@@ -4172,6 +4186,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* comparison instructions of f32 */ + HANDLE_OP(WASM_OP_F32_EQ) + { +@@ -4245,6 +4261,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_CMP(float64, F64, >=); + HANDLE_OP_END(); + } ++#else ++ HANDLE_OP(WASM_OP_F32_EQ) ++ HANDLE_OP(WASM_OP_F32_NE) ++ HANDLE_OP(WASM_OP_F32_LT) ++ HANDLE_OP(WASM_OP_F32_GT) ++ HANDLE_OP(WASM_OP_F32_LE) ++ HANDLE_OP(WASM_OP_F32_GE) ++ HANDLE_OP(WASM_OP_F64_EQ) ++ HANDLE_OP(WASM_OP_F64_NE) ++ HANDLE_OP(WASM_OP_F64_LT) ++ HANDLE_OP(WASM_OP_F64_GT) ++ HANDLE_OP(WASM_OP_F64_LE) ++ HANDLE_OP(WASM_OP_F64_GE) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++#endif + + /* numeric instructions of i32 */ + HANDLE_OP(WASM_OP_I32_CLZ) +@@ -4573,6 +4607,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + /* numeric instructions of f32 */ + HANDLE_OP(WASM_OP_F32_ABS) + { +@@ -4784,6 +4820,43 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_F32_ABS) ++ HANDLE_OP(WASM_OP_F32_NEG) ++ HANDLE_OP(WASM_OP_F32_CEIL) ++ HANDLE_OP(WASM_OP_F32_FLOOR) ++ HANDLE_OP(WASM_OP_F32_TRUNC) ++ HANDLE_OP(WASM_OP_F32_NEAREST) ++ HANDLE_OP(WASM_OP_F32_SQRT) ++ HANDLE_OP(WASM_OP_F32_ADD) ++ HANDLE_OP(WASM_OP_F32_SUB) ++ HANDLE_OP(WASM_OP_F32_MUL) ++ HANDLE_OP(WASM_OP_F32_DIV) ++ HANDLE_OP(WASM_OP_F32_MIN) ++ HANDLE_OP(WASM_OP_F32_MAX) ++ HANDLE_OP(WASM_OP_F32_COPYSIGN) ++ HANDLE_OP(WASM_OP_F64_ABS) ++ HANDLE_OP(WASM_OP_F64_NEG) ++ HANDLE_OP(WASM_OP_F64_CEIL) ++ HANDLE_OP(WASM_OP_F64_FLOOR) ++ HANDLE_OP(WASM_OP_F64_TRUNC) ++ HANDLE_OP(WASM_OP_F64_NEAREST) ++ HANDLE_OP(WASM_OP_F64_SQRT) ++ HANDLE_OP(WASM_OP_F64_ADD) ++ HANDLE_OP(WASM_OP_F64_SUB) ++ HANDLE_OP(WASM_OP_F64_MUL) ++ HANDLE_OP(WASM_OP_F64_DIV) ++ HANDLE_OP(WASM_OP_F64_MIN) ++ HANDLE_OP(WASM_OP_F64_MAX) ++ HANDLE_OP(WASM_OP_F64_COPYSIGN) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i32 */ + HANDLE_OP(WASM_OP_I32_WRAP_I64) + { +@@ -4792,6 +4865,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++ ++#ifdef ENABLE_FLOAT_POINT + HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) + { + /* We don't use INT32_MIN/INT32_MAX/UINT32_MIN/UINT32_MAX, +@@ -4821,6 +4896,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I32_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I32_TRUNC_U_F64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + /* conversions of i64 */ + HANDLE_OP(WASM_OP_I64_EXTEND_S_I32) + { +@@ -4834,6 +4922,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#ifdef ENABLE_FLOAT_POINT ++ + HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) + { + DEF_OP_TRUNC_F32(-9223373136366403584.0f, +@@ -4937,6 +5027,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + HANDLE_OP_END(); + } + ++#else ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F32) ++ HANDLE_OP(WASM_OP_I64_TRUNC_S_F64) ++ HANDLE_OP(WASM_OP_I64_TRUNC_U_F64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F32_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F32_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F32_DEMOTE_F64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I32) ++ HANDLE_OP(WASM_OP_F64_CONVERT_S_I64) ++ HANDLE_OP(WASM_OP_F64_CONVERT_U_I64) ++ HANDLE_OP(WASM_OP_F64_PROMOTE_F32) ++ HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) ++ HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) ++ HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) ++ HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) ++ { ++ wasm_set_exception(module, "opcode disabled"); ++ goto got_exception; ++ } ++ ++#endif //ENABLE_FLOAT_POINT ++ + HANDLE_OP(EXT_OP_COPY_STACK_TOP) + { + addr1 = GET_OFFSET(); +@@ -5108,6 +5224,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + GET_OPCODE(); + switch (opcode) { ++ ++#ifdef ENABLE_FLOAT_POINT + case WASM_OP_I32_TRUNC_SAT_S_F32: + DEF_OP_TRUNC_SAT_F32(-2147483904.0f, 2147483648.0f, + true, true); +@@ -5140,6 +5258,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, + false, false); + break; ++ ++#endif ++ + #if WASM_ENABLE_BULK_MEMORY != 0 + case WASM_OP_MEMORY_INIT: + { +@@ -7672,6 +7793,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + { + wasm_interp_call_func_native(module, exec_env, cur_func, + prev_frame); ++ instructions_left -= cur_func->gas; + } + + #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 +@@ -7784,6 +7906,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + FREE_FRAME(exec_env, frame); + wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); + ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if (exec_env) ++ exec_env->instructions_to_execute = instructions_left; ++#endif ++ + if (!prev_frame->ip) + /* Called from native. */ + return; +@@ -7812,6 +7939,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, + + got_exception: + SYNC_ALL_TO_FRAME(); ++#if WASM_ENABLE_INSTRUCTION_METERING != 0 ++ if (exec_env) ++ exec_env->instructions_to_execute = instructions_left; ++#endif + return; + + #if WASM_ENABLE_LABELS_AS_VALUES == 0 +diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c +index 771538a1..d6e6a6b8 100644 +--- a/core/iwasm/interpreter/wasm_mini_loader.c ++++ b/core/iwasm/interpreter/wasm_mini_loader.c +@@ -805,6 +805,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + const char *linked_signature = NULL; + void *linked_attachment = NULL; + bool linked_call_conv_raw = false; ++ uint32_t gas = 0; + + read_leb_uint32(p, p_end, declare_type_index); + *p_buf = p; +@@ -816,7 +817,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + /* check built-in modules */ + linked_func = wasm_native_resolve_symbol( + sub_module_name, function_name, declare_func_type, &linked_signature, +- &linked_attachment, &linked_call_conv_raw); ++ &linked_attachment, &gas, &linked_call_conv_raw); + + function->module_name = (char *)sub_module_name; + function->field_name = (char *)function_name; +@@ -825,6 +826,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, + function->signature = linked_signature; + function->attachment = linked_attachment; + function->call_conv_raw = linked_call_conv_raw; ++ function->gas = gas; + return true; + } + +diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c +index b4aa483d..2d74e469 100644 +--- a/core/iwasm/interpreter/wasm_runtime.c ++++ b/core/iwasm/interpreter/wasm_runtime.c +@@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) + #endif + function->func_ptr_linked = wasm_native_resolve_symbol( + function->module_name, function->field_name, function->func_type, +- &function->signature, &function->attachment, &function->call_conv_raw); ++ &function->signature, &function->attachment, &function->gas, &function->call_conv_raw); + + if (function->func_ptr_linked) { + return true; +@@ -820,6 +820,7 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, + function->param_count = + (uint16)function->u.func_import->func_type->param_count; + function->param_types = function->u.func_import->func_type->types; ++ function->gas = import->u.function.gas; + function->local_cell_num = 0; + function->local_count = 0; + function->local_types = NULL; +diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h +index 16c670f0..5ddac567 100644 +--- a/core/iwasm/interpreter/wasm_runtime.h ++++ b/core/iwasm/interpreter/wasm_runtime.h +@@ -237,6 +237,10 @@ struct WASMFunctionInstance { + WASMFunctionImport *func_import; + WASMFunction *func; + } u; ++ ++ // gas cost for import func ++ uint32 gas; ++ + #if WASM_ENABLE_MULTI_MODULE != 0 + WASMModuleInstance *import_module_inst; + WASMFunctionInstance *import_func_inst; +diff --git a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +index a68c0749..cafb6915 100644 +--- a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c ++++ b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c +@@ -1038,16 +1038,16 @@ print_f64_wrapper(wasm_exec_env_t exec_env, double f64) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, func_name##_wrapper, signature, NULL } ++ { #func_name, func_name##_wrapper, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_builtin[] = { + REG_NATIVE_FUNC(printf, "($*)i"), + REG_NATIVE_FUNC(sprintf, "($$*)i"), + REG_NATIVE_FUNC(snprintf, "(*~$*)i"), +- { "vprintf", printf_wrapper, "($*)i", NULL }, +- { "vsprintf", sprintf_wrapper, "($$*)i", NULL }, +- { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL }, ++ { "vprintf", printf_wrapper, "($*)i", NULL, 0 }, ++ { "vsprintf", sprintf_wrapper, "($$*)i", NULL, 0 }, ++ { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL, 0 }, + REG_NATIVE_FUNC(puts, "($)i"), + REG_NATIVE_FUNC(putchar, "(i)i"), + REG_NATIVE_FUNC(memcmp, "(**~)i"), +diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +index f7dfea0b..c01e80a9 100644 +--- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c ++++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c +@@ -2269,7 +2269,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) + + /* clang-format off */ + #define REG_NATIVE_FUNC(func_name, signature) \ +- { #func_name, wasi_##func_name, signature, NULL } ++ { #func_name, wasi_##func_name, signature, NULL, 0 } + /* clang-format on */ + + static NativeSymbol native_symbols_libc_wasi[] = { +diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h +index ac1a95ea..e23b500e 100644 +--- a/core/shared/platform/include/platform_wasi_types.h ++++ b/core/shared/platform/include/platform_wasi_types.h +@@ -36,7 +36,11 @@ extern "C" { + #if WASM_ENABLE_UVWASI != 0 || WASM_ENABLE_LIBC_WASI == 0 + #define assert_wasi_layout(expr, message) /* nothing */ + #else +-#define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #ifndef _MSC_VER ++ #define assert_wasi_layout(expr, message) _Static_assert(expr, message) ++ #else ++ #define assert_wasi_layout(expr, message) static_assert(expr, message) ++ #endif + #endif + + assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); From dbc9dd5bfc15adc21ed8a75340b8734c8e9b3945 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 14:56:08 -0400 Subject: [PATCH 063/212] Add WAMR integration code --- src/xrpld/app/wasm/HostFunc.h | 59 ++ src/xrpld/app/wasm/ParamsHelper.h | 272 +++++++ src/xrpld/app/wasm/WamrVM.h | 327 ++++++++ src/xrpld/app/wasm/WasmVM.h | 111 +++ src/xrpld/app/wasm/detail/WamrVM.cpp | 1070 ++++++++++++++++++++++++++ src/xrpld/app/wasm/detail/WasmVM.cpp | 164 ++++ 6 files changed, 2003 insertions(+) create mode 100644 src/xrpld/app/wasm/HostFunc.h create mode 100644 src/xrpld/app/wasm/ParamsHelper.h create mode 100644 src/xrpld/app/wasm/WamrVM.h create mode 100644 src/xrpld/app/wasm/WasmVM.h create mode 100644 src/xrpld/app/wasm/detail/WamrVM.cpp create mode 100644 src/xrpld/app/wasm/detail/WasmVM.cpp diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h new file mode 100644 index 00000000000..b7ea5c7e85a --- /dev/null +++ b/src/xrpld/app/wasm/HostFunc.h @@ -0,0 +1,59 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace ripple { + +struct HostFunctions +{ + // LCOV_EXCL_START + virtual void + setRT(void const*) + { + } + + virtual void const* + getRT() const + { + return nullptr; + } + + virtual beast::Journal + getJournal() + { + return beast::Journal{beast::Journal::getNullSink()}; + } + + virtual ~HostFunctions() = default; + // LCOV_EXCL_STOP +}; + +} // namespace ripple diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h new file mode 100644 index 00000000000..8bdf11e6182 --- /dev/null +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -0,0 +1,272 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include +#include +#include + +#include +#include +#include + +namespace bft = boost::function_types; + +namespace ripple { + +using Bytes = std::vector; +using Hash = ripple::uint256; + +struct wmem +{ + std::uint8_t* p = nullptr; + std::size_t s = 0; +}; + +template +struct WasmResult +{ + T result; + int64_t cost; +}; +typedef WasmResult EscrowResult; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64, WT_U8V }; + +struct WasmImportFunc +{ + std::string name; + std::optional result; + std::vector params; + void* udata = nullptr; + // wasm_func_callback_with_env_t + void* wrap = nullptr; + uint32_t gas = 0; +}; + +#define WASM_IMPORT_FUNC(v, f, ...) \ + WasmImpFunc( \ + v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +#define WASM_IMPORT_FUNC2(v, f, n, ...) \ + WasmImpFunc( \ + v, n, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) + +template +void +WasmImpArgs(WasmImportFunc& e) +{ + if constexpr (N < C) + { + using at = typename boost::mpl::at_c::type; + if constexpr (std::is_pointer_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_I64); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F32); + else if constexpr (std::is_same_v) + e.params.push_back(WT_F64); + else + static_assert(std::is_pointer_v, "Unsupported argument type"); + + return WasmImpArgs(e); + } + return; +} + +template +void +WasmImpRet(WasmImportFunc& e) +{ + if constexpr (std::is_pointer_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I32; + else if constexpr (std::is_same_v) + e.result = WT_I64; + else if constexpr (std::is_same_v) + e.result = WT_F32; + else if constexpr (std::is_same_v) + e.result = WT_F64; + else if constexpr (std::is_void_v) + e.result.reset(); +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ + ((defined(__clang_major__)) && (__clang_major__ >= 18)) + else + static_assert(false, "Unsupported return type"); +#endif +} + +template +void +WasmImpFuncHelper(WasmImportFunc& e) +{ + using rt = typename bft::result_type::type; + using pt = typename bft::parameter_types::type; + // typename boost::mpl::at_c::type + + WasmImpRet(e); + WasmImpArgs<0, bft::function_arity::value, pt>(e); + // WasmImpWrap(e, std::forward(f)); +} + +template +void +WasmImpFunc( + std::vector& v, + std::string_view imp_name, + void* f_wrap, + void* data = nullptr, + uint32_t gas = 0) +{ + WasmImportFunc e; + e.name = imp_name; + e.udata = data; + e.wrap = f_wrap; + e.gas = gas; + WasmImpFuncHelper(e); + v.push_back(std::move(e)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +struct WasmParamVec +{ + std::uint8_t const* d = nullptr; + std::int32_t sz = 0; +}; + +struct WasmParam +{ + WasmTypes type = WT_I32; + union + { + std::int32_t i32; + std::int64_t i64 = 0; + float f32; + double f64; + WasmParamVec u8v; + } of; +}; + +template +inline void +wasmParamsHlp(std::vector& v, std::int32_t p, Types&&... args) +{ + v.push_back({.type = WT_I32, .of = {.i32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) +{ + v.push_back({.type = WT_I64, .of = {.i64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, float p, Types&&... args) +{ + v.push_back({.type = WT_F32, .of = {.f32 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, double p, Types&&... args) +{ + v.push_back({.type = WT_F64, .of = {.f64 = p}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::uint8_t const* dt, + std::int32_t sz, + Types&&... args) +{ + v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) +{ + wasmParamsHlp( + v, + p.data(), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp( + std::vector& v, + std::string_view const& p, + Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.data()), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.c_str()), + static_cast(p.size()), + std::forward(args)...); +} + +inline void +wasmParamsHlp(std::vector& v) +{ + return; +} + +template +inline std::vector +wasmParams(Types&&... args) +{ + std::vector v; + v.reserve(sizeof...(args)); + wasmParamsHlp(v, std::forward(args)...); + return v; +} + +} // namespace ripple diff --git a/src/xrpld/app/wasm/WamrVM.h b/src/xrpld/app/wasm/WamrVM.h new file mode 100644 index 00000000000..a32257feb6c --- /dev/null +++ b/src/xrpld/app/wasm/WamrVM.h @@ -0,0 +1,327 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include +#include + +namespace ripple { + +struct WamrResult +{ + wasm_val_vec_t r; + bool f; // failure flag + + WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) + { + if (N) + wasm_val_vec_new_uninitialized(&r, N); + } + + ~WamrResult() + { + if (r.size) + wasm_val_vec_delete(&r); + } + + WamrResult(WamrResult const&) = delete; + WamrResult& + operator=(WamrResult const&) = delete; + + WamrResult(WamrResult&& o) + { + *this = std::move(o); + } + + WamrResult& + operator=(WamrResult&& o) + { + r = o.r; + o.r = {0, nullptr, 0, 0, nullptr}; + f = o.f; + o.f = false; + return *this; + } + // operator wasm_val_vec_t &() {return r;} +}; + +using ModulePtr = std::unique_ptr; +using InstancePtr = + std::unique_ptr; + +using FuncInfo = std::pair; + +struct InstanceWrapper +{ + wasm_extern_vec_t exports_; + InstancePtr instance_; + wasm_exec_env_t execEnv_ = nullptr; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); + +private: + static InstancePtr + init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports, + beast::Journal j); + +public: + InstanceWrapper(); + + InstanceWrapper(InstanceWrapper&& o); + + InstanceWrapper& + operator=(InstanceWrapper&& o); + + InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j); + + ~InstanceWrapper(); + + operator bool() const; + + FuncInfo + getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const; + + wmem + getMem() const; + + std::int64_t + getGas() const; +}; + +struct ModuleWrapper +{ + ModulePtr module_; + InstanceWrapper instanceWrap_; + wasm_exporttype_vec_t exportTypes_; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); + +private: + static ModulePtr + init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j); + +public: + ModuleWrapper(); + ModuleWrapper(ModuleWrapper&& o); + ModuleWrapper& + operator=(ModuleWrapper&& o); + ModuleWrapper( + wasm_store_t* s, + Bytes const& wasmBin, + bool instantiate, + int32_t maxPages, + int64_t gas, + std::vector const& imports, + beast::Journal j); + ~ModuleWrapper(); + + operator bool() const; + + FuncInfo + getFunc(std::string_view funcName) const; + wmem + getMem() const; + + InstanceWrapper const& + getInstance(int i = 0) const; + + int + addInstance( + wasm_store_t* s, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + std::int64_t + getGas(); + +private: + static void + makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + static void + makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); + wasm_extern_vec_t + buildImports(wasm_store_t* s, std::vector const& imports); +}; + +class WamrEngine +{ + std::unique_ptr engine_; + std::unique_ptr store_; + std::unique_ptr moduleWrap_; + std::int32_t defMaxPages_ = -1; + beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); + + std::mutex m_; // 1 instance mutex + +public: + WamrEngine(); + ~WamrEngine() = default; + + Expected, TER> + run(Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, + beast::Journal j); + + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j); + + std::int32_t + initMaxPages(std::int32_t def); + + std::int64_t + getGas(); + + // Host functions helper functionality + wasm_trap_t* + newTrap(std::string_view msg); + + beast::Journal + getJournal() const; + +private: + InstanceWrapper const& + getRT(int m = 0, int i = 0); + + wmem + getMem() const; + + int32_t + allocate(int32_t size); + + Expected, TER> + runHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas); + + NotTEC + checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports); + + int + addModule( + Bytes const& wasmCode, + bool instantiate, + int64_t gas, + std::vector const& imports); + void + clearModules(); + + // int addInstance(); + + int32_t + runFunc(std::string_view const funcName, int32_t p); + + int32_t + makeModule( + Bytes const& wasmCode, + wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + + FuncInfo + getFunc(std::string_view funcName); + + std::vector + convertParams(std::vector const& params); + + static int + compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p); + + static void + add_param(std::vector& in, int32_t p); + static void + add_param(std::vector& in, int64_t p); + + template + inline WamrResult + call(std::string_view func, Types&&... args); + + template + inline WamrResult + call(FuncInfo const& f, Types&&... args); + + template + inline WamrResult + call(FuncInfo const& f, std::vector& in); + + template + inline WamrResult + call( + FuncInfo const& f, + std::vector& in, + std::int32_t p, + Types&&... args); + + template + inline WamrResult + call( + FuncInfo const& f, + std::vector& in, + std::int64_t p, + Types&&... args); + + template + inline WamrResult + call( + FuncInfo const& f, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types&&... args); + + template + inline WamrResult + call( + FuncInfo const& f, + std::vector& in, + Bytes const& p, + Types&&... args); +}; + +} // namespace ripple diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h new file mode 100644 index 00000000000..32eb239f609 --- /dev/null +++ b/src/xrpld/app/wasm/WasmVM.h @@ -0,0 +1,111 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== +#pragma once + +#include + +#include + +namespace ripple { + +static std::string_view const W_ENV = "env"; +static std::string_view const W_HOST_LIB = "host_lib"; +static std::string_view const W_MEM = "memory"; +static std::string_view const W_STORE = "store"; +static std::string_view const W_LOAD = "load"; +static std::string_view const W_SIZE = "size"; +static std::string_view const W_ALLOC = "allocate"; +static std::string_view const W_DEALLOC = "deallocate"; +static std::string_view const W_PROC_EXIT = "proc_exit"; + +static std::string_view const ESCROW_FUNCTION_NAME = "finish"; + +uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 + +class WamrEngine; +class WasmEngine +{ + std::unique_ptr const impl; + + WasmEngine(); + + WasmEngine(WasmEngine const&) = delete; + WasmEngine(WasmEngine&&) = delete; + WasmEngine& + operator=(WasmEngine const&) = delete; + WasmEngine& + operator=(WasmEngine&&) = delete; + +public: + ~WasmEngine() = default; + + static WasmEngine& + instance(); + + Expected, TER> + run(Bytes const& wasmCode, + std::string_view funcName = {}, + std::vector const& params = {}, + std::vector const& imports = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + + NotTEC + check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params = {}, + std::vector const& imports = {}, + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); + + std::int32_t + initMaxPages(std::int32_t def); + + // Host functions helper functionality + void* + newTrap(std::string_view msg = {}); + + beast::Journal + getJournal() const; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +std::vector +createWasmImport(HostFunctions* hfs); + +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName = ESCROW_FUNCTION_NAME, + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + int64_t gasLimit = -1, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName = ESCROW_FUNCTION_NAME, + std::vector const& params = {}, + HostFunctions* hfs = nullptr, + beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + +} // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp new file mode 100644 index 00000000000..e47a618f12a --- /dev/null +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -0,0 +1,1070 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2020 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +#include +#include + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif + +// #define SHOW_CALL_TIME 1 + +namespace ripple { + +namespace { + +// LCOV_EXCL_START +static log_level_t +getLogLevel(beast::severities::Severity severity) +{ + using namespace beast::severities; + switch (severity) + { + case kTrace: + return WASM_LOG_LEVEL_VERBOSE; + case kDebug: + return WASM_LOG_LEVEL_DEBUG; + case kInfo: + case kWarning: + return WASM_LOG_LEVEL_WARNING; + case kError: + return WASM_LOG_LEVEL_ERROR; + default: + UNREACHABLE("WAMR invalid severity"); + [[fallthrough]]; + case kFatal: + case kNone: + break; + } + + return WASM_LOG_LEVEL_FATAL; +} + +static beast::severities::Severity +getLogLevel(uint32_t severity) +{ + using namespace beast::severities; + switch (severity) + { + case WASM_LOG_LEVEL_VERBOSE: + return kTrace; + case WASM_LOG_LEVEL_DEBUG: + return kDebug; + case WASM_LOG_LEVEL_WARNING: + return kWarning; + case WASM_LOG_LEVEL_ERROR: + return kError; + default: + UNREACHABLE("WAMR invalid reverse severity"); + [[fallthrough]]; + case WASM_LOG_LEVEL_FATAL: + break; + } + + return kFatal; +} + +// This function is called from WAMR to log messages. +extern "C" void +wamr_log_to_rippled( + uint32_t logLevel, + char const* file, + int line, + char const* fmt, + ...) +{ + beast::Journal j = WasmEngine::instance().getJournal(); + + std::ostringstream oss; + + // Format the variadic args + if (file) + { + oss << "WAMR (" << file << ":" << line << "): "; + } + else + { + oss << "WAMR: "; + } + + va_list args; + va_start(args, fmt); + + char formatted[4096]; + vsnprintf(formatted, sizeof(formatted), fmt, args); + formatted[sizeof(formatted) - 1] = '\0'; + + va_end(args); + + oss << formatted; + + j.stream(getLogLevel(logLevel)) << oss.str(); +#ifdef DEBUG_OUTPUT_WAMR + std::cerr << oss.str() << std::endl; +#endif +} + +void +print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) +{ +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = jlog.warn(); +#endif + + wasm_byte_vec_t error_message WASM_EMPTY_VEC; + + if (trap) + wasm_trap_message(trap, &error_message); + + if (error_message.num_elems) + { + error_message.data[error_message.num_elems - 1] = 0; // just in case + j << "WAMR Error: " << msg << ", " << error_message.data; + } + else + j << "WAMR Error: " << msg; + + if (error_message.size) + wasm_byte_vec_delete(&error_message); + wasm_trap_delete(trap); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif +} +// LCOV_EXCL_STOP + +} // namespace + +InstancePtr +InstanceWrapper::init( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + wasm_extern_vec_t* expt, + wasm_extern_vec_t const& imports, + beast::Journal j) +{ + wasm_trap_t* trap = nullptr; + InstantiationArgs inst_args{ + 128 * 1024, + 256 * 1024, + static_cast(maxPages > 0 ? maxPages : 0)}; + + InstancePtr mi = InstancePtr( + wasm_instance_new_with_args_ex(s, m, &imports, &trap, &inst_args), + &wasm_instance_delete); + + if (!mi || trap) + { + print_wasm_error("can't create instance", trap, j); + throw std::runtime_error("can't create instance"); + } + wasm_instance_exports(mi.get(), expt); + return mi; +} + +InstanceWrapper::InstanceWrapper() + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) +{ +} + +InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) + : exports_{0, nullptr, 0, 0, nullptr} + , instance_(nullptr, &wasm_instance_delete) +{ + *this = std::move(o); +} + +InstanceWrapper::InstanceWrapper( + wasm_store_t* s, + wasm_module_t* m, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports, + beast::Journal j) + : exports_ WASM_EMPTY_VEC + , instance_(init(s, m, maxPages, &exports_, imports, j)) + , execEnv_(wasm_instance_exec_env(instance_.get())) + , j_(j) +{ + wasm_runtime_set_instruction_count_limit(execEnv_, gas); +} + +InstanceWrapper::~InstanceWrapper() +{ + if (exports_.size) + wasm_extern_vec_delete(&exports_); +} + +InstanceWrapper& +InstanceWrapper::operator=(InstanceWrapper&& o) +{ + if (this == &o) + return *this; + + if (exports_.size) + wasm_extern_vec_delete(&exports_); + exports_ = o.exports_; + o.exports_ = {0, nullptr, 0, 0, nullptr}; + + instance_ = std::move(o.instance_); + execEnv_ = o.execEnv_; + o.execEnv_ = nullptr; + + j_ = o.j_; + + return *this; +} + +InstanceWrapper::operator bool() const +{ + return static_cast(instance_); +} + +FuncInfo +InstanceWrapper::getFunc( + std::string_view funcName, + wasm_exporttype_vec_t const& export_types) const +{ + wasm_func_t* f = nullptr; + wasm_functype_t* ft = nullptr; + + if (!instance_) + throw std::runtime_error("no instance"); + + if (!export_types.num_elems) + throw std::runtime_error("no export"); + if (export_types.num_elems != exports_.num_elems) + throw std::runtime_error("invalid export"); + + for (unsigned i = 0; i < export_types.num_elems; ++i) + { + auto const* exp_type(export_types.data[i]); + + wasm_name_t const* name = wasm_exporttype_name(exp_type); + wasm_externtype_t const* exn_type = wasm_exporttype_type(exp_type); + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) + { + if (funcName == std::string_view(name->data, name->size - 1)) + { + auto* exn(exports_.data[i]); + if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) + throw std::runtime_error("invalid export"); + + ft = wasm_externtype_as_functype( + const_cast(exn_type)); + f = wasm_extern_as_func(exn); + break; + } + } + } + + if (!f || !ft) + throw std::runtime_error( + "can't find function <" + std::string(funcName) + ">"); + + return {f, ft}; +} + +wmem +InstanceWrapper::getMem() const +{ + if (!instance_) + throw std::runtime_error("no instance"); + + wasm_memory_t* mem = nullptr; + for (unsigned i = 0; i < exports_.num_elems; ++i) + { + auto* e(exports_.data[i]); + if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) + { + mem = wasm_extern_as_memory(e); + break; + } + } + + if (!mem) + throw std::runtime_error("no memory exported"); + + return { + reinterpret_cast(wasm_memory_data(mem)), + wasm_memory_data_size(mem)}; +} + +std::int64_t +InstanceWrapper::getGas() const +{ + return execEnv_ ? wasm_runtime_get_instruction_count_limit(execEnv_) : 0; +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ModulePtr +ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) +{ + wasm_byte_vec_t const code{ + wasmBin.size(), + (char*)(wasmBin.data()), + wasmBin.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + if (!m) + throw std::runtime_error("can't create module"); + + return m; +} + +ModuleWrapper::ModuleWrapper() + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} +{ +} + +ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) + : module_(nullptr, &wasm_module_delete) + , exportTypes_{0, nullptr, 0, 0, nullptr} +{ + *this = std::move(o); +} + +ModuleWrapper::ModuleWrapper( + wasm_store_t* s, + Bytes const& wasmBin, + bool instantiate, + int32_t maxPages, + int64_t gas, + std::vector const& imports, + beast::Journal j) + : module_(init(s, wasmBin, j)) + , exportTypes_{0, nullptr, 0, 0, nullptr} + , j_(j) +{ + wasm_module_exports(module_.get(), &exportTypes_); + if (instantiate) + { + auto wimports = buildImports(s, imports); + addInstance(s, maxPages, gas, wimports); + } +} + +ModuleWrapper::~ModuleWrapper() +{ + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); +} + +ModuleWrapper& +ModuleWrapper::operator=(ModuleWrapper&& o) +{ + if (this == &o) + return *this; + + module_ = std::move(o.module_); + instanceWrap_ = std::move(o.instanceWrap_); + if (exportTypes_.size) + wasm_exporttype_vec_delete(&exportTypes_); + exportTypes_ = o.exportTypes_; + o.exportTypes_ = {0, nullptr, 0, 0, nullptr}; + j_ = o.j_; + + return *this; +} + +ModuleWrapper::operator bool() const +{ + return instanceWrap_; +} + +void +ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + auto const paramSize = imp.params.size(); + + if (paramSize) + { + wasm_valtype_vec_new(&v, paramSize, nullptr); + v.num_elems = paramSize; + } + else + v = WASM_EMPTY_VEC; + for (unsigned i = 0; i < paramSize; ++i) + { + auto const vt = imp.params[i]; + switch (vt) + { + case WT_I32: + v.data[i] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[i] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[i] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[i] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("invalid import type"); + } + } +} + +void +ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +{ + if (imp.result) + { + wasm_valtype_vec_new(&v, 1, nullptr); + v.num_elems = 1; + switch (*imp.result) + { + case WT_I32: + v.data[0] = wasm_valtype_new_i32(); + break; + case WT_I64: + v.data[0] = wasm_valtype_new_i64(); + break; + case WT_F32: + v.data[0] = wasm_valtype_new_f32(); + break; + case WT_F64: + v.data[0] = wasm_valtype_new_f64(); + break; + default: + throw std::runtime_error("invalid return type"); + } + } + else + v = WASM_EMPTY_VEC; +} + +wasm_extern_vec_t +ModuleWrapper::buildImports( + wasm_store_t* s, + std::vector const& imports) +{ + wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; + wasm_module_imports(module_.get(), &importTypes); + std:: + unique_ptr + itDeleter(&importTypes, &wasm_importtype_vec_delete); + + wasm_extern_vec_t wimports = WASM_EMPTY_VEC; + if (!importTypes.num_elems) + return wimports; + + wasm_extern_vec_new(&wimports, importTypes.size, nullptr); + wimports.num_elems = importTypes.num_elems; + + unsigned impCnt = 0; + for (unsigned i = 0; i < importTypes.num_elems; ++i) + { + wasm_importtype_t const* importtype = importTypes.data[i]; + if (wasm_importtype_is_linked(importtype)) + { + // create a placeholder + wimports.data[i] = wasm_extern_new_empty( + s, wasm_externtype_kind(wasm_importtype_type(importtype))); + ++impCnt; + continue; + } + + // wasm_name_t const* mn = wasm_importtype_module(importtype); + // auto modName = std::string_view(mn->data, mn->num_elems - 1); + wasm_name_t const* fn = wasm_importtype_name(importtype); + auto fieldName = std::string_view(fn->data, fn->num_elems - 1); + + // for multi-module support + // if ((W_ENV != modName) && (W_HOST_LIB != modName)) + // continue; + + bool impSet = false; + for (auto const& imp : imports) + { + if (imp.name != fieldName) + continue; + + wasm_valtype_vec_t params, results; + makeImpReturn(results, imp); + makeImpParams(params, imp); + + using ftype_ptr = std:: + unique_ptr; + ftype_ptr ftype( + wasm_functype_new(¶ms, &results), &wasm_functype_delete); + wasm_func_t* func = wasm_func_new_with_env( + s, + ftype.get(), + reinterpret_cast(imp.wrap), + imp.udata, + nullptr); + if (!func) + { + // LCOV_EXCL_START + throw std::runtime_error( + "can't create import function " + imp.name); + // LCOV_EXCL_STOP + } + + if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + { + // LCOV_EXCL_START + throw std::runtime_error( + "can't set gas for import function " + imp.name); + // LCOV_EXCL_STOP + } + + wimports.data[i] = wasm_func_as_extern(func); + ++impCnt; + impSet = true; + + break; + } + + if (!impSet) + { + print_wasm_error( + std::string("Import not found: ") + fieldName.data(), + nullptr, + j_); + } + } + + if (impCnt != importTypes.num_elems) + { + print_wasm_error( + std::string("Imports not finished: ") + std::to_string(impCnt) + + "/" + std::to_string(importTypes.num_elems), + nullptr, + j_); + } + + return wimports; +} + +FuncInfo +ModuleWrapper::getFunc(std::string_view funcName) const +{ + return instanceWrap_.getFunc(funcName, exportTypes_); +} + +wmem +ModuleWrapper::getMem() const +{ + return instanceWrap_.getMem(); +} + +InstanceWrapper const& +ModuleWrapper::getInstance(int) const +{ + return instanceWrap_; +} + +int +ModuleWrapper::addInstance( + wasm_store_t* s, + int32_t maxPages, + int64_t gas, + wasm_extern_vec_t const& imports) +{ + instanceWrap_ = {s, module_.get(), maxPages, gas, imports, j_}; + return 0; +} + +// int +// my_module_t::delInstance(int i) +// { +// if (i >= mod_inst.size()) +// return -1; +// if (!mod_inst[i]) +// mod_inst[i] = my_mod_inst_t(); +// return i; +// } + +std::int64_t +ModuleWrapper::getGas() +{ + return instanceWrap_.getGas(); +} + +////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// void +// WamrEngine::clearModules() +// { +// modules.clear(); +// store.reset(); // to free the memory before creating new store +// store = {wasm_store_new(engine.get()), &wasm_store_delete}; +// } + +WamrEngine::WamrEngine() + : engine_(wasm_engine_new(), &wasm_engine_delete) + , store_(nullptr, &wasm_store_delete) +{ + wasm_runtime_set_default_running_mode(Mode_Interp); + wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); + // wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE); +} + +int +WamrEngine::addModule( + Bytes const& wasmCode, + bool instantiate, + int64_t gas, + std::vector const& imports) +{ + moduleWrap_.reset(); + store_.reset(); // to free the memory before creating new store + store_ = {wasm_store_new(engine_.get()), &wasm_store_delete}; + moduleWrap_ = std::make_unique( + store_.get(), wasmCode, instantiate, defMaxPages_, gas, imports, j_); + + if (!moduleWrap_) + throw std::runtime_error("can't create module wrapper"); + + return moduleWrap_ ? 0 : -1; +} + +// int +// WamrEngine::addInstance() +// { +// return module->addInstance(store.get(), defMaxPages); +// } + +FuncInfo +WamrEngine::getFunc(std::string_view funcName) +{ + return moduleWrap_->getFunc(funcName); +} + +std::vector +WamrEngine::convertParams(std::vector const& params) +{ + std::vector v; + v.reserve(params.size()); + for (auto const& p : params) + { + switch (p.type) + { + case WT_I32: + v.push_back(WASM_I32_VAL(p.of.i32)); + break; + case WT_I64: + v.push_back(WASM_I64_VAL(p.of.i64)); + break; + case WT_F32: + v.push_back(WASM_F32_VAL(p.of.f32)); + break; + case WT_F64: + v.push_back(WASM_F64_VAL(p.of.f64)); + break; + case WT_U8V: { + auto const sz = p.of.u8v.sz; + auto const ptr = allocate(sz); + auto mem = getMem(); + memcpy(mem.p + ptr, p.of.u8v.d, sz); + + v.push_back(WASM_I32_VAL(ptr)); + v.push_back(WASM_I32_VAL(sz)); + } + break; + default: + throw std::runtime_error( + "unknown parameter type: " + std::to_string(p.type)); + break; + } + } + + return v; +} + +int +WamrEngine::compareParamTypes( + wasm_valtype_vec_t const* ftp, + std::vector const& p) +{ + if (ftp->num_elems != p.size()) + return std::min(ftp->num_elems, p.size()); + + for (unsigned i = 0; i < ftp->num_elems; ++i) + { + auto const t1 = wasm_valtype_kind(ftp->data[i]); + auto const t2 = p[i].kind; + if (t1 != t2) + return i; + } + + return -1; +} + +void +WamrEngine::add_param(std::vector& in, int32_t p) +{ + in.emplace_back(); + auto& el(in.back()); + memset(&el, 0, sizeof(el)); + el = WASM_I32_VAL(p); // WASM_I32; +} + +void +WamrEngine::add_param(std::vector& in, int64_t p) +{ + in.emplace_back(); + auto& el(in.back()); + el = WASM_I64_VAL(p); +} + +template +WamrResult +WamrEngine::call(std::string_view func, Types&&... args) +{ + // Lookup our export function + auto f = getFunc(func); + return call(f, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call(FuncInfo const& f, Types&&... args) +{ + std::vector in; + return call(f, in, std::forward(args)...); +} + +#ifdef SHOW_CALL_TIME +static inline uint64_t +usecs() +{ + uint64_t x = + std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); + return x; +} +#endif + +template +WamrResult +WamrEngine::call(FuncInfo const& f, std::vector& in) +{ + // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; + WamrResult ret(NR); + // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // + // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } + + wasm_val_vec_t const inv = in.empty() + ? wasm_val_vec_t WASM_EMPTY_VEC + : wasm_val_vec_t{ + in.size(), + in.data(), + in.size(), + sizeof(std::remove_reference_t::value_type), + nullptr}; + +#ifdef SHOW_CALL_TIME + auto const start = usecs(); +#endif + + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); + +#ifdef SHOW_CALL_TIME + auto const finish = usecs(); + auto const delta_ms = (finish - start) / 1000; + std::cout << "wasm_func_call: " << delta_ms << "ms" << std::endl; +#endif + + if (trap) + { + ret.f = true; + print_wasm_error("failure to call func", trap, j_); + } + + // assert(results[0].kind == WASM_I32); + // if (NR) printf("Result P5: %d\n", ret[0].of.i32); + + return ret; +} + +template +WamrResult +WamrEngine::call( + FuncInfo const& f, + std::vector& in, + std::int32_t p, + Types&&... args) +{ + add_param(in, p); + return call(f, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + FuncInfo const& f, + std::vector& in, + std::int64_t p, + Types&&... args) +{ + add_param(in, p); + return call(f, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + FuncInfo const& f, + std::vector& in, + uint8_t const* d, + std::size_t sz, + Types&&... args) +{ + auto const ptr = allocate(sz); + auto mem = getMem(); + memcpy(mem.p + ptr, d, sz); + + add_param(in, ptr); + add_param(in, static_cast(sz)); + return call(f, in, std::forward(args)...); +} + +template +WamrResult +WamrEngine::call( + FuncInfo const& f, + std::vector& in, + Bytes const& p, + Types&&... args) +{ + return call(f, in, p.data(), p.size(), std::forward(args)...); +} + +Expected, TER> +WamrEngine::run( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas, + beast::Journal j) +{ + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); + try + { + return runHlp(wasmCode, funcName, params, imports, hfs, gas); + } + catch (std::exception const& e) + { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); + } + catch (...) + { + print_wasm_error(std::string("exception: unknown"), nullptr, j_); + } + return Unexpected(tecFAILED_PROCESSING); +} + +Expected, TER> +WamrEngine::runHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gas) +{ + // currently only 1 module support, possible parallel UT run + std::lock_guard lg(m_); + + // Create and instantiate the module. + if (!wasmCode.empty()) + { + [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); + } + + if (!moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); + + if (hfs) + hfs->setRT(&getRT()); + + // Call main + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + + // not const because passed directly to wamr function (which accept non + // const) + auto p = convertParams(params); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + auto const res = call<1>(f, p); + + if (res.f) + throw std::runtime_error("<" + std::string(funcName) + "> failure"); + else if (!res.r.num_elems) + throw std::runtime_error( + "<" + std::string(funcName) + "> return nothing"); + + assert(res.r.data[0].kind == WASM_I32); + if (gas == -1) + gas = std::numeric_limits::max(); + WasmResult const ret{ + res.r.data[0].of.i32, gas - moduleWrap_->getGas()}; + + // #ifdef DEBUG_OUTPUT + // auto& j = std::cerr; + // #else + // auto j = j_.debug(); + // #endif + // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + + return ret; +} + +NotTEC +WamrEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + j_ = j; + wasm_runtime_set_log_level( + std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); + try + { + return checkHlp(wasmCode, funcName, params, imports); + } + catch (std::exception const& e) + { + print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); + } + catch (...) + { + print_wasm_error(std::string("exception: unknown"), nullptr, j_); + } + + return temBAD_WASM; +} + +NotTEC +WamrEngine::checkHlp( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports) +{ + // currently only 1 module support, possible parallel UT run + std::lock_guard lg(m_); + + // Create and instantiate the module. + if (wasmCode.empty()) + throw std::runtime_error("empty nodule"); + + int const m = addModule(wasmCode, true, -1, imports); + if ((m < 0) || !moduleWrap_ || !moduleWrap_->instanceWrap_) + throw std::runtime_error("no instance"); + + // Looking for a func and compare parameter types + auto const f = getFunc(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f.second); + auto const p = convertParams(params); + + if (int const comp = compareParamTypes(ftp, p); comp >= 0) + throw std::runtime_error( + "invalid parameter type #" + std::to_string(comp)); + + return tesSUCCESS; +} + +std::int32_t +WamrEngine::initMaxPages(std::int32_t def) +{ + defMaxPages_ = def; + return def; +} + +std::int64_t +WamrEngine::getGas() +{ + return moduleWrap_ ? moduleWrap_->getGas() : 0; +} + +wmem +WamrEngine::getMem() const +{ + return moduleWrap_ ? moduleWrap_->getMem() : wmem(); +} + +InstanceWrapper const& +WamrEngine::getRT(int m, int i) +{ + if (!moduleWrap_) + throw std::runtime_error("no module"); + return moduleWrap_->getInstance(i); +} + +int32_t +WamrEngine::allocate(int32_t sz) +{ + auto res = call<1>(W_ALLOC, static_cast(sz)); + + if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || + !res.r.data[0].of.i32) + throw std::runtime_error( + "can't allocate memory, " + std::to_string(sz) + " bytes"); + return res.r.data[0].of.i32; +} + +wasm_trap_t* +WamrEngine::newTrap(std::string_view txt) +{ + wasm_message_t msg = WASM_EMPTY_VEC; + + if (!txt.empty()) + wasm_name_new(&msg, txt.size(), txt.data()); + + return wasm_trap_new(store_.get(), &msg); +} + +beast::Journal +WamrEngine::getJournal() const +{ + return j_; +} + +} // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp new file mode 100644 index 00000000000..e13b5885cfb --- /dev/null +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -0,0 +1,164 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + +#include +#include +#include + +#include +#include +#include +#include + +#include + +namespace ripple { + +std::vector +createWasmImport(HostFunctions* hfs) +{ + std::vector i; + + // Add host functions here + + return i; +} + +Expected +runEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + int64_t gasLimit, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.run( + wasmCode, + funcName, + params, + createWasmImport(hfs), + hfs, + gasLimit, + hfs ? hfs->getJournal() : j); + + // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() + // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; + + if (!ret) + { +#ifdef DEBUG_OUTPUT + std::cout << ", error: " << ret.error() << std::endl; +#endif + return Unexpected(ret.error()); + } + +#ifdef DEBUG_OUTPUT + std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost + << std::endl; +#endif + return EscrowResult{ret->result, ret->cost}; +} + +NotTEC +preflightEscrowWasm( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + HostFunctions* hfs, + beast::Journal j) +{ + // create VM and set cost limit + auto& vm = WasmEngine::instance(); + vm.initMaxPages(MAX_PAGES); + + auto const ret = vm.check( + wasmCode, + funcName, + params, + createWasmImport(hfs), + hfs ? hfs->getJournal() : j); + + return ret; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +WasmEngine::WasmEngine() : impl(std::make_unique()) +{ +} + +WasmEngine& +WasmEngine::instance() +{ + static WasmEngine e; + return e; +} + +Expected, TER> +WasmEngine::run( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + HostFunctions* hfs, + int64_t gasLimit, + beast::Journal j) +{ + return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); +} + +NotTEC +WasmEngine::check( + Bytes const& wasmCode, + std::string_view funcName, + std::vector const& params, + std::vector const& imports, + beast::Journal j) +{ + return impl->check(wasmCode, funcName, params, imports, j); +} + +std::int32_t +WasmEngine::initMaxPages(std::int32_t def) +{ + return impl->initMaxPages(def); +} + +void* +WasmEngine::newTrap(std::string_view msg) +{ + return impl->newTrap(msg); +} + +beast::Journal +WasmEngine::getJournal() const +{ + return impl->getJournal(); +} + +} // namespace ripple From 83418644f7bcba2ee2a084401268d6ab68653610 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 14:56:21 -0400 Subject: [PATCH 064/212] add host functions --- src/xrpld/app/wasm/HostFunc.h | 467 ++++ src/xrpld/app/wasm/HostFuncImpl.h | 297 +++ src/xrpld/app/wasm/HostFuncWrapper.h | 567 +++++ src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 1347 +++++++++++ src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 2065 +++++++++++++++++ src/xrpld/app/wasm/detail/WasmVM.cpp | 82 +- 6 files changed, 4824 insertions(+), 1 deletion(-) create mode 100644 src/xrpld/app/wasm/HostFuncImpl.h create mode 100644 src/xrpld/app/wasm/HostFuncWrapper.h create mode 100644 src/xrpld/app/wasm/detail/HostFuncImpl.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncWrapper.cpp diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index b7ea5c7e85a..f1332462a49 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -32,6 +32,71 @@ namespace ripple { +enum class HostFunctionError : int32_t { + INTERNAL = -1, + FIELD_NOT_FOUND = -2, + BUFFER_TOO_SMALL = -3, + NO_ARRAY = -4, + NOT_LEAF_FIELD = -5, + LOCATOR_MALFORMED = -6, + SLOT_OUT_RANGE = -7, + SLOTS_FULL = -8, + EMPTY_SLOT = -9, + LEDGER_OBJ_NOT_FOUND = -10, + DECODING = -11, + DATA_FIELD_TOO_LARGE = -12, + POINTER_OUT_OF_BOUNDS = -13, + NO_MEM_EXPORTED = -14, + INVALID_PARAMS = -15, + INVALID_ACCOUNT = -16, + INVALID_FIELD = -17, + INDEX_OUT_OF_BOUNDS = -18, + FLOAT_INPUT_MALFORMED = -19, + FLOAT_COMPUTATION_ERROR = -20, +}; + +inline int32_t +HfErrorToInt(HostFunctionError e) +{ + return static_cast(e); +} + +std::string +floatToString(Slice const& data); + +Expected +floatFromIntImpl(int64_t x, int32_t mode); + +Expected +floatFromUintImpl(uint64_t x, int32_t mode); + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode); + +Expected +floatCompareImpl(Slice const& x, Slice const& y); + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode); + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode); + +Expected +floatLogImpl(Slice const& x, int32_t mode); + struct HostFunctions { // LCOV_EXCL_START @@ -52,6 +117,408 @@ struct HostFunctions return beast::Journal{beast::Journal::getNullSink()}; } + virtual Expected + getLedgerSqn() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getParentLedgerTime() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getParentLedgerHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerAccountHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerTransactionHash() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getBaseFee() + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(uint256 const& amendmentId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + isAmendmentEnabled(std::string_view const& amendmentName) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getTxField(SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getCurrentLedgerObjField(SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getTxNestedField(Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getCurrentLedgerObjNestedField(Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getTxArrayLen(SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getCurrentLedgerObjArrayLen(SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getTxNestedArrayLen(Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + updateData(Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + computeSha512HalfHash(Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + accountKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + ammKeylet(Asset const& issue1, Asset const& issue2) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + checkKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + didKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + offerKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + signersKeylet(AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFT(AccountID const& account, uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTIssuer(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTaxon(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTFlags(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTTransferFee(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getNFTSerial(uint256 const& nftId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + traceNum(std::string_view const& msg, int64_t data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + traceAccount(std::string_view const& msg, AccountID const& account) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + traceFloat(std::string_view const& msg, Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + traceAmount(std::string_view const& msg, STAmount const& amount) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromInt(int64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatFromUint(uint64_t x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatCompare(Slice const& x, Slice const& y) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatPower(Slice const& x, int32_t n, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + floatLog(Slice const& x, int32_t mode) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual ~HostFunctions() = default; // LCOV_EXCL_STOP }; diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h new file mode 100644 index 00000000000..5539a5ef408 --- /dev/null +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -0,0 +1,297 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2023 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include +#include + +namespace ripple { +class WasmHostFunctionsImpl : public HostFunctions +{ + ApplyContext& ctx; + Keylet leKey; + std::shared_ptr currentLedgerObj = nullptr; + bool isLedgerObjCached = false; + + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::optional data_; + + void const* rt_ = nullptr; + + Expected, HostFunctionError> + getCurrentLedgerObj() + { + if (!isLedgerObjCached) + { + isLedgerObjCached = true; + currentLedgerObj = ctx.view().read(leKey); + } + if (currentLedgerObj) + return currentLedgerObj; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + Expected + normalizeCacheIndex(int32_t cacheIdx); + +public: + WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) + : ctx(ctx), leKey(leKey) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return ctx.journal; + } + + std::optional const& + getData() const + { + return data_; + } + + Expected + getLedgerSqn() override; + + Expected + getParentLedgerTime() override; + + Expected + getParentLedgerHash() override; + + Expected + getLedgerAccountHash() override; + + Expected + getLedgerTransactionHash() override; + + Expected + getBaseFee() override; + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override; + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override; + + Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; + + Expected + getTxField(SField const& fname) override; + + Expected + getCurrentLedgerObjField(SField const& fname) override; + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override; + + Expected + getTxNestedField(Slice const& locator) override; + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override; + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; + + Expected + getTxArrayLen(SField const& fname) override; + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override; + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; + + Expected + getTxNestedArrayLen(Slice const& locator) override; + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; + + Expected + updateData(Slice const& data) override; + + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override; + + Expected + computeSha512HalfHash(Slice const& data) override; + + Expected + accountKeylet(AccountID const& account) override; + + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override; + + Expected + checkKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) override; + + Expected + didKeylet(AccountID const& account) override; + + Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + override; + + Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + override; + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) override; + + Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override; + + Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) override; + + Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + offerKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + oracleKeylet(AccountID const& account, std::uint32_t docId) override; + + Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) override; + + Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + override; + + Expected + signersKeylet(AccountID const& account) override; + + Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) override; + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override; + + Expected + getNFTIssuer(uint256 const& nftId) override; + + Expected + getNFTTaxon(uint256 const& nftId) override; + + Expected + getNFTFlags(uint256 const& nftId) override; + + Expected + getNFTTransferFee(uint256 const& nftId) override; + + Expected + getNFTSerial(uint256 const& nftId) override; + + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override; + + Expected + traceNum(std::string_view const& msg, int64_t data) override; + + Expected + traceAccount(std::string_view const& msg, AccountID const& account) + override; + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override; + + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override; + + Expected + floatFromInt(int64_t x, int32_t mode) override; + + Expected + floatFromUint(uint64_t x, int32_t mode) override; + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override; + + Expected + floatCompare(Slice const& x, Slice const& y) override; + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override; + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override; + + Expected + floatLog(Slice const& x, int32_t mode) override; +}; + +} // namespace ripple diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h new file mode 100644 index 00000000000..dc0524d611a --- /dev/null +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -0,0 +1,567 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include + +namespace ripple { + +using getLedgerSqn_proto = int32_t(); +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getParentLedgerTime_proto = int32_t(); +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getParentLedgerHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerAccountHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerTransactionHash_proto = int32_t(uint8_t*, int32_t); +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getBaseFee_proto = int32_t(); +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using isAmendmentEnabled_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxField_proto = int32_t(int32_t, uint8_t*, int32_t); +wasm_trap_t* +getTxField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjField_proto = int32_t(int32_t, uint8_t*, int32_t); +wasm_trap_t* +getCurrentLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjField_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getTxNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjNestedField_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getCurrentLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjNestedField_proto = + int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxArrayLen_proto = int32_t(int32_t); +wasm_trap_t* +getTxArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjArrayLen_proto = int32_t(int32_t); +wasm_trap_t* +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjArrayLen_proto = int32_t(int32_t, int32_t); +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getTxNestedArrayLen_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getTxNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getCurrentLedgerObjNestedArrayLen_proto = + int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getLedgerObjNestedArrayLen_proto = + int32_t(int32_t, uint8_t const*, int32_t); +wasm_trap_t* +getLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using updateData_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +updateData_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using checkSignature_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t); +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using computeSha512HalfHash_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using accountKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using ammKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +ammKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using checkKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using credentialKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +credentialKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using delegateKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using depositPreauthKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using didKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +didKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using escrowKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +escrowKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using lineKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using mptIssuanceKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using mptokenKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using nftOfferKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using offerKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using oracleKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +oracleKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using paychanKeylet_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using permissionedDomainKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using ticketKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using vaultKeylet_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFT_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using getNFTIssuer_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTaxon_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTFlags_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTTransferFee_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using getNFTSerial_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using trace_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); +wasm_trap_t* +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using traceAccount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using traceFloat_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using traceAmount_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatFromUint_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatSet_proto = int32_t(int32_t, int64_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatCompare_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatAdd_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatSubtract_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatMultiply_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatDivide_proto = int32_t( + uint8_t const*, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t, + int32_t); +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatRoot_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatRoot_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatPower_proto = + int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using floatLog_proto = + int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +} // namespace ripple diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp new file mode 100644 index 00000000000..4b585acdcd4 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -0,0 +1,1347 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include +#include + +#include +#include + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +// #define DEBUG_OUTPUT_WAMR 1 +#endif + +namespace ripple { + +Expected +WasmHostFunctionsImpl::getLedgerSqn() +{ + auto seq = ctx.view().seq(); + if (seq > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE + return static_cast(seq); +} + +Expected +WasmHostFunctionsImpl::getParentLedgerTime() +{ + auto time = ctx.view().parentCloseTime().time_since_epoch().count(); + if (time > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(time); +} + +Expected +WasmHostFunctionsImpl::getParentLedgerHash() +{ + return ctx.view().info().parentHash; +} + +Expected +WasmHostFunctionsImpl::getLedgerAccountHash() +{ + return ctx.view().info().accountHash; +} + +Expected +WasmHostFunctionsImpl::getLedgerTransactionHash() +{ + return ctx.view().info().txHash; +} + +Expected +WasmHostFunctionsImpl::getBaseFee() +{ + auto fee = ctx.view().fees().base.drops(); + if (fee > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(fee); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) +{ + return ctx.view().rules().enabled(amendmentId); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) +{ + auto const& table = ctx.app.getAmendmentTable(); + auto const amendment = table.find(std::string(amendmentName)); + return ctx.view().rules().enabled(amendment); +} + +Expected +WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) +{ + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::EMPTY_SLOT); + return cacheIdx; +} + +Expected +WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) +{ + auto const& keylet = keylet::unchecked(objId); + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (cacheIdx == 0) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + } + else + { + cacheIdx--; // convert to 0-based index + } + + if (cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOTS_FULL); + + cache[cacheIdx] = ctx.view().read(keylet); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; // return 1-based index +} + +static Expected +getAnyFieldData(STBase const* obj) +{ + // auto const& fname = obj.getFName(); + if (!obj) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + auto const stype = obj->getSType(); + switch (stype) + { + // LCOV_EXCL_START + case STI_UNKNOWN: + case STI_NOTPRESENT: + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + break; + // LCOV_EXCL_STOP + case STI_OBJECT: + case STI_ARRAY: + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + break; + case STI_ACCOUNT: { + auto const* account(static_cast(obj)); + auto const& data = account->value(); + return Bytes{data.begin(), data.end()}; + } + break; + case STI_AMOUNT: + // will be processed by serializer + break; + case STI_ISSUE: { + auto const* issue(static_cast(obj)); + Asset const& asset(issue->value()); + // XRP and IOU will be processed by serializer + if (asset.holds()) + { + // MPT + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; + } + } + break; + case STI_VL: { + auto const* vl(static_cast(obj)); + auto const& data = vl->value(); + return Bytes{data.begin(), data.end()}; + } + break; + case STI_UINT16: { + auto const& num(static_cast const*>(obj)); + std::uint16_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + case STI_UINT32: { + auto const* num(static_cast const*>(obj)); + std::uint32_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + break; + default: + break; // default to serializer + } + + Serializer msg; + obj->add(msg); + auto const data = msg.getData(); + + return data; +} + +Expected +WasmHostFunctionsImpl::getTxField(SField const& fname) +{ + return getAnyFieldData(ctx.tx.peekAtPField(fname)); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + return getAnyFieldData(sle.value()->peekAtPField(fname)); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + return getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); +} + +static inline bool +noField(STBase const* field) +{ + return !field || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); +} + +static Expected +locateField(STObject const& obj, Slice const& locator) +{ + if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + + int32_t const* locPtr = reinterpret_cast(locator.data()); + int32_t const locSize = locator.size() / 4; + STBase const* field = nullptr; + auto const& knownSFields = SField::getKnownCodeToField(); + + { + int32_t const sfieldCode = locPtr[0]; + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + + auto const& fname(*it->second); + field = obj.peekAtPField(fname); + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + for (int i = 1; i < locSize; ++i) + { + int32_t const sfieldCode = locPtr[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (sfieldCode >= arr->size()) + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + field = &(arr->operator[](sfieldCode)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + + auto const& fname(*it->second); + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + } + + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + return field; +} + +Expected +WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) +{ + auto const r = locateField(ctx.tx, locator); + if (!r) + return Unexpected(r.error()); + + return getAnyFieldData(r.value()); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + + auto const r = locateField(*sle.value(), locator); + if (!r) + return Unexpected(r.error()); + + return getAnyFieldData(r.value()); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedField( + int32_t cacheIdx, + Slice const& locator) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const r = locateField(*cache[normalizedIdx.value()], locator); + if (!r) + return Unexpected(r.error()); + + return getAnyFieldData(r.value()); +} + +Expected +WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const* field = ctx.tx.peekAtPField(fname); + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + + auto const* field = sle.value()->peekAtPField(fname); + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getLedgerObjArrayLen( + int32_t cacheIdx, + SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) +{ + auto const r = locateField(ctx.tx, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + auto const r = locateField(*sle.value(), locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( + int32_t cacheIdx, + Slice const& locator) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const r = locateField(*cache[normalizedIdx.value()], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::updateData(Slice const& data) +{ + if (data.size() > maxWasmDataLength) + { + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + } + data_ = Bytes(data.begin(), data.end()); + return 0; +} + +Expected +WasmHostFunctionsImpl::checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) +{ + if (!publicKeyType(pubkey)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + PublicKey const pk(pubkey); + return verify(pk, message, signature, /*canonical*/ true); +} + +Expected +WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) +{ + auto const hash = sha512Half(data); + return hash; +} + +Expected +WasmHostFunctionsImpl::accountKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) +{ + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + // note: this should be removed with the MPT DEX amendment + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) +{ + if (!subject || !issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + if (credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::credential(subject, issuer, credentialType); + + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::didKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::did(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::delegateKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::delegate(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::depositPreauthKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::depositPreauth(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) +{ + if (!account1 || !account2) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account1 == account2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (currency.isZero()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::line(account1, account2, currency); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptIssuanceKeylet( + AccountID const& issuer, + std::uint32_t seq) +{ + if (!issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptIssuance(seq, issuer); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptokenKeylet( + MPTID const& mptid, + AccountID const& holder) +{ + if (!mptid) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!holder) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptoken(mptid, holder); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::nftOfferKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::nftoffer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::offer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::oracleKeylet( + AccountID const& account, + std::uint32_t documentId) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) +{ + if (!account || !destination) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == destination) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::payChan(account, destination, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::permissionedDomainKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::permissionedDomain(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::signersKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::signers(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::ticket(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::vault(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + if (!nftId) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto obj = nft::findToken(ctx.view(), account, nftId); + if (!obj) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); +} + +Expected +WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) +{ + auto const issuer = nft::getIssuer(nftId); + if (!issuer) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Bytes{issuer.begin(), issuer.end()}; +} + +Expected +WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) +{ + return nft::toUInt32(nft::getTaxon(nftId)); +} + +Expected +WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) +{ + return nft::getFlags(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) +{ + return nft::getTransferFee(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) +{ + return nft::getSerial(nftId); +} + +Expected +WasmHostFunctionsImpl::trace( + std::string_view const& msg, + Slice const& data, + bool asHex) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + if (!asHex) + { + j << "WAMR TRACE (" << leKey.key << "): " << msg << " " + << std::string_view( + reinterpret_cast(data.data()), data.size()); + } + else + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " " << hex; + } + + return msg.size() + data.size() * (asHex ? 2 : 1); +} + +Expected +WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + j << "WAMR TRACE NUM(" << leKey.key << "): " << msg << " " << data; + return msg.size() + sizeof(data); +} + +Expected +WasmHostFunctionsImpl::traceAccount( + std::string_view const& msg, + AccountID const& account) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT(" << leKey.key << "): " << msg << " " + << accountStr; + return msg.size() + accountStr.size(); +} + +Expected +WasmHostFunctionsImpl::traceFloat( + std::string_view const& msg, + Slice const& data) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; + return msg.size() + s.size(); +} + +Expected +WasmHostFunctionsImpl::traceAmount( + std::string_view const& msg, + STAmount const& amount) +{ +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; + return msg.size() + amountStr.size(); +} + +Expected +WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) +{ + return floatFromIntImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) +{ + return floatFromUintImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatSet( + int64_t mantissa, + int32_t exponent, + int32_t mode) +{ + return floatSetImpl(mantissa, exponent, mode); +} + +Expected +WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) +{ + return floatCompareImpl(x, y); +} + +Expected +WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) +{ + return floatAddImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatSubtract( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatSubtractImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatMultiply( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return floatMultiplyImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) +{ + return floatDivideImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) +{ + return floatRootImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) +{ + return floatPowerImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) +{ + return floatLogImpl(x, mode); +} + +class Number2 : public Number +{ +protected: + static Bytes const FLOAT_NULL; + + bool good_; + +public: + Number2(Slice const& data) : Number(), good_(false) + { + if (data.size() != 8) + return; + + if (std::ranges::equal(FLOAT_NULL, data)) + { + good_ = true; + return; + } + + uint64_t const v = SerialIter(data).get64(); + if (!(v & STAmount::cIssuedCurrency)) + return; + + int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); + if (e < 1 || e > 177) + return; + + int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); + if (!m) + return; + + Number x(m, e + IOUAmount::minExponent - 1); + *static_cast(this) = x; + good_ = true; + } + + Number2() : Number(), good_(true) + { + } + + Number2(int64_t x) : Number(x), good_(true) + { + } + + Number2(uint64_t x) : Number(0), good_(false) + { + using mtype = std::invoke_result_t; + if (x <= std::numeric_limits::max()) + *this = Number(x); + else + *this = Number(x / 10, 1) + Number(x % 10); + + good_ = true; + } + + Number2(int64_t mantissa, int32_t exponent) + : Number(mantissa, exponent), good_(true) + { + } + + Number2(Number const& n) : Number(n), good_(true) + { + } + + operator bool() const + { + return good_; + } + + Expected + toBytes() const + { + uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + v |= STAmount::cIssuedCurrency; + + uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (!absM) + { + using etype = + std::invoke_result_t; + if (exponent() != std::numeric_limits::lowest()) + { + return Unexpected( + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE + } + return FLOAT_NULL; + } + else if (absM > ((1ull << 54) - 1)) + { + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE + } + else if (exponent() > IOUAmount::maxExponent) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return FLOAT_NULL; + + int const e = exponent() - IOUAmount::minExponent + 1; //+97 + v |= absM; + v |= ((uint64_t)e) << 54; + + Serializer msg; + msg.add64(v); + auto const data = msg.getData(); + +#ifdef DEBUG_OUTPUT + std::cout << "m: " << std::setw(20) << mantissa() + << ", e: " << std::setw(12) << exponent() << ", hex: "; + std::cout << std::hex << std::uppercase << std::setfill('0'); + for (auto const& c : data) + std::cout << std::setw(2) << (unsigned)c << " "; + std::cout << std::dec << std::setfill(' ') << std::endl; +#endif + + return data; + } +}; + +Bytes const Number2::FLOAT_NULL = + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +struct SetRound +{ + Number::rounding_mode oldMode_; + bool good_; + + SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) + { + if (mode < Number::rounding_mode::to_nearest || + mode > Number::rounding_mode::upward) + return; + + Number::setround(static_cast(mode)); + good_ = true; + } + + ~SetRound() + { + Number::setround(oldMode_); + } + + operator bool() const + { + return good_; + } +}; + +std::string +floatToString(Slice const& data) +{ + Number2 const num(data); + if (!num) + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return "Invalid data: " + hex; + } + + auto const s = to_string(num); + return s; +} + +Expected +floatFromIntImpl(int64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + return num.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatFromUintImpl(uint64_t x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 num(x); + return num.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 num(mantissa, exponent); + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatCompareImpl(Slice const& x, Slice const& y) +{ + try + { + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return xx < yy ? 2 : (xx == yy ? 0 : 1); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx + yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx - yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx * yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + Number2 res = xx / yy; + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + if (n < 1) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 res(root(xx, n)); + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + if (n < 0) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + if (xx == Number() && !n) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + Number2 res(power(xx, n, 1)); + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatLogImpl(Slice const& x, int32_t mode) +{ + try + { + SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + Number2 res(lg(xx)); + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +} // namespace ripple diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp new file mode 100644 index 00000000000..1bd9622a4c3 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -0,0 +1,2065 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include +#include +#include + +#include +#include +#include + +namespace ripple { + +using SFieldCRef = std::reference_wrapper; + +static int32_t +setData( + InstanceWrapper const* runtime, + int32_t dst, + int32_t dstSize, + uint8_t const* src, + int32_t srcSize) +{ + if (!srcSize) + return 0; // LCOV_EXCL_LINE + + if (dst < 0 || dstSize < 0 || !src || srcSize < 0) + return HfErrorToInt(HostFunctionError::INVALID_PARAMS); + + auto memory = runtime ? runtime->getMem() : wmem(); + + // LCOV_EXCL_START + if (!memory.s) + return HfErrorToInt(HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP + if (dst + dstSize > memory.s) + return HfErrorToInt(HostFunctionError::POINTER_OUT_OF_BOUNDS); + if (srcSize > dstSize) + return HfErrorToInt(HostFunctionError::BUFFER_TOO_SMALL); + + memcpy(memory.p + dst, src, srcSize); + + return srcSize; +} + +template +Expected +getDataInt32(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i32; + i++; + return result; +} + +template +Expected +getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const result = params->data[i].of.i64; + i++; + return result; +} + +template +Expected +getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const r = getDataSlice(runtime, params, i); + if (!r) + return Unexpected(r.error()); + if (r->size() != sizeof(uint64_t)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return *reinterpret_cast(r->data()); +} + +template +Expected +getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const& m = SField::getKnownCodeToField(); + auto const it = m.find(params->data[i].of.i32); + if (it == m.end()) + { + return Unexpected(HostFunctionError::INVALID_FIELD); + } + i++; + return *it->second; +} + +template +Expected +getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const ptr = params->data[i].of.i32; + auto const size = params->data[i + 1].of.i32; + if (ptr < 0 || size < 0) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + if (!size) + return Slice(); + + if (size > maxWasmDataLength) + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + + auto memory = runtime ? runtime->getMem() : wmem(); + // LCOV_EXCL_START + if (!memory.s) + return Unexpected(HostFunctionError::NO_MEM_EXPORTED); + // LCOV_EXCL_STOP + + if (ptr + size > memory.s) + return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); + + Slice data(memory.p + ptr, size); + i += 2; + return data; +} + +template +Expected +getDataUInt256(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != uint256::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + return uint256::fromVoid(slice->data()); +} + +template +Expected +getDataAccountID(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != AccountID::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + return AccountID::fromVoid(slice->data()); +} + +template +static Expected +getDataCurrency(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() != Currency::bytes) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + return Currency::fromVoid(slice->data()); +} + +template +static Expected +getDataAsset(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + { + return Unexpected(slice.error()); + } + + if (slice->size() == MPTID::bytes) + { + auto const mptid = MPTID::fromVoid(slice->data()); + return Asset{mptid}; + } + + if (slice->size() == Currency::bytes) + { + auto const currency = Currency::fromVoid(slice->data()); + auto const issue = Issue{currency, xrpAccount()}; + if (!issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + if (slice->size() == (AccountID::bytes + Currency::bytes)) + { + auto const issue = Issue( + Currency::fromVoid(slice->data()), + AccountID::fromVoid(slice->data() + Currency::bytes)); + + if (issue.native()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + return Asset{issue}; + } + + return Unexpected(HostFunctionError::INVALID_PARAMS); +} + +template +Expected +getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + auto const slice = getDataSlice(runtime, params, i); + if (!slice) + return Unexpected(slice.error()); + return std::string_view( + reinterpret_cast(slice->data()), slice->size()); +} + +std::nullptr_t +hfResult(wasm_val_vec_t* results, int32_t value) +{ + results->data[0] = WASM_I32_VAL(value); + results->num_elems = 1; + return nullptr; +} + +std::nullptr_t +hfResult(wasm_val_vec_t* results, HostFunctionError value) +{ + results->data[0] = WASM_I32_VAL(HfErrorToInt(value)); + results->num_elems = 1; + return nullptr; +} + +template +std::nullptr_t +returnResult( + InstanceWrapper const* runtime, + wasm_val_vec_t const* params, + wasm_val_vec_t* results, + Expected const& res, + int32_t index) +{ + if (!res) + { + return hfResult(results, res.error()); + } + + using t = std::decay_t; + if constexpr (std::is_same_v) + { + return hfResult( + results, + setData( + runtime, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v) + { + return hfResult( + results, + setData( + runtime, + params->data[index].of.i32, + params->data[index + 1].of.i32, + res->data(), + res->size())); + } + else if constexpr (std::is_same_v) + { + return hfResult(results, res.value()); + } + else if constexpr (std::is_same_v) + { + auto const resultValue = res.value(); + return hfResult( + results, + setData( + runtime, + params->data[index].of.i32, + params->data[index + 1].of.i32, + reinterpret_cast(&resultValue), + static_cast(sizeof(resultValue)))); + } + else + { + static_assert( + [] { return false; }(), "Unhandled return type in returnResult"); + } +} + +wasm_trap_t* +getLedgerSqn_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult(runtime, params, results, hf->getLedgerSqn(), index); +} + +wasm_trap_t* +getParentLedgerTime_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getParentLedgerTime(), index); +} + +wasm_trap_t* +getParentLedgerHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getParentLedgerHash(), index); +} + +wasm_trap_t* +getLedgerAccountHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerAccountHash(), index); +} + +wasm_trap_t* +getLedgerTransactionHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult( + runtime, params, results, hf->getLedgerTransactionHash(), index); +} + +wasm_trap_t* +getBaseFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + return returnResult(runtime, params, results, hf->getBaseFee(), index); +} + +wasm_trap_t* +isAmendmentEnabled_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() == uint256::bytes) + { + if (auto ret = hf->isAmendmentEnabled(uint256::fromVoid(slice->data())); + *ret == 1) + { + return returnResult(runtime, params, results, ret, index); + } + } + + if (slice->size() > 64) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const str = std::string_view( + reinterpret_cast(slice->data()), slice->size()); + return returnResult( + runtime, params, results, hf->isAmendmentEnabled(str), index); +} + +wasm_trap_t* +cacheLedgerObj_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const id = getDataUInt256(runtime, params, index); + if (!id) + { + return hfResult(results, id.error()); + } + + auto const cache = getDataInt32(runtime, params, index); + if (!cache) + { + return hfResult(results, cache.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, params, results, hf->cacheLedgerObj(*id, *cache), index); +} + +wasm_trap_t* +getTxField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + return returnResult( + runtime, params, results, hf->getTxField(*fname), index); +} + +wasm_trap_t* +getCurrentLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + return returnResult( + runtime, params, results, hf->getCurrentLedgerObjField(*fname), index); +} + +wasm_trap_t* +getLedgerObjField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const cache = getDataInt32(runtime, params, index); + if (!cache) + { + return hfResult(results, cache.error()); // LCOV_EXCL_LINE + } + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + return returnResult( + runtime, params, results, hf->getLedgerObjField(*cache, *fname), index); +} + +wasm_trap_t* +getTxNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + + return returnResult( + runtime, params, results, hf->getTxNestedField(*bytes), index); +} + +wasm_trap_t* +getCurrentLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + return returnResult( + runtime, + params, + results, + hf->getCurrentLedgerObjNestedField(*bytes), + index); +} + +wasm_trap_t* +getLedgerObjNestedField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const cache = getDataInt32(runtime, params, index); + if (!cache) + { + return hfResult(results, cache.error()); // LCOV_EXCL_LINE + } + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + + return returnResult( + runtime, + params, + results, + hf->getLedgerObjNestedField(*cache, *bytes), + index); +} + +wasm_trap_t* +getTxArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + return returnResult( + runtime, params, results, hf->getTxArrayLen(*fname), index); +} + +wasm_trap_t* +getCurrentLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + return returnResult( + runtime, + params, + results, + hf->getCurrentLedgerObjArrayLen(*fname), + index); +} + +wasm_trap_t* +getLedgerObjArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const cache = getDataInt32(runtime, params, index); + if (!cache) + { + return hfResult(results, cache.error()); // LCOV_EXCL_LINE + } + + auto const fname = getDataSField(runtime, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + return returnResult( + runtime, + params, + results, + hf->getLedgerObjArrayLen(*cache, *fname), + index); +} + +wasm_trap_t* +getTxNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + + return returnResult( + runtime, params, results, hf->getTxNestedArrayLen(*bytes), index); +} + +wasm_trap_t* +getCurrentLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + + return returnResult( + runtime, + params, + results, + hf->getCurrentLedgerObjNestedArrayLen(*bytes), + index); +} +wasm_trap_t* +getLedgerObjNestedArrayLen_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const cache = getDataInt32(runtime, params, index); + if (!cache) + { + return hfResult(results, cache.error()); // LCOV_EXCL_LINE + } + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + return returnResult( + runtime, + params, + results, + hf->getLedgerObjNestedArrayLen(*cache, *bytes), + index); +} + +wasm_trap_t* +updateData_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + + return returnResult( + runtime, params, results, hf->updateData(*bytes), index); +} + +wasm_trap_t* +checkSignature_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const message = getDataSlice(runtime, params, index); + if (!message) + { + return hfResult(results, message.error()); + } + + auto const signature = getDataSlice(runtime, params, index); + if (!signature) + { + return hfResult(results, signature.error()); + } + + auto const pubkey = getDataSlice(runtime, params, index); + if (!pubkey) + { + return hfResult(results, pubkey.error()); + } + + return returnResult( + runtime, + params, + results, + hf->checkSignature(*message, *signature, *pubkey), + index); +} + +wasm_trap_t* +computeSha512HalfHash_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const bytes = getDataSlice(runtime, params, index); + if (!bytes) + { + return hfResult(results, bytes.error()); + } + return returnResult( + runtime, params, results, hf->computeSha512HalfHash(*bytes), index); +} + +wasm_trap_t* +accountKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult( + runtime, params, results, hf->accountKeylet(*acc), index); +} + +wasm_trap_t* +ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const issue1 = getDataAsset(runtime, params, index); + if (!issue1) + { + return hfResult(results, issue1.error()); + } + + auto const issue2 = getDataAsset(runtime, params, index); + if (!issue2) + { + return hfResult(results, issue2.error()); + } + + return returnResult( + runtime, + params, + results, + hf->ammKeylet(issue1.value(), issue2.value()), + index); +} + +wasm_trap_t* +checkKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); +} + +wasm_trap_t* +credentialKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const subj = getDataAccountID(runtime, params, index); + if (!subj) + { + return hfResult(results, subj.error()); + } + + auto const iss = getDataAccountID(runtime, params, index); + if (!iss) + { + return hfResult(results, iss.error()); + } + + auto const credType = getDataSlice(runtime, params, index); + if (!credType) + { + return hfResult(results, credType.error()); + } + + return returnResult( + runtime, + params, + results, + hf->credentialKeylet(*subj, *iss, *credType), + index); +} + +wasm_trap_t* +delegateKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(runtime, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + runtime, + params, + results, + hf->delegateKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +depositPreauthKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const authorize = getDataAccountID(runtime, params, index); + if (!authorize) + { + return hfResult(results, authorize.error()); + } + + return returnResult( + runtime, + params, + results, + hf->depositPreauthKeylet(acc.value(), authorize.value()), + index); +} + +wasm_trap_t* +didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult( + runtime, params, results, hf->didKeylet(acc.value()), index); +} + +wasm_trap_t* +escrowKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, params, results, hf->escrowKeylet(*acc, *seq), index); +} + +wasm_trap_t* +lineKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc1 = getDataAccountID(runtime, params, index); + if (!acc1) + { + return hfResult(results, acc1.error()); + } + + auto const acc2 = getDataAccountID(runtime, params, index); + if (!acc2) + { + return hfResult(results, acc2.error()); + } + + auto const currency = getDataCurrency(runtime, params, index); + if (!currency) + { + return hfResult(results, currency.error()); + } + + return returnResult( + runtime, + params, + results, + hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), + index); +} + +wasm_trap_t* +mptIssuanceKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->mptIssuanceKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +mptokenKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const slice = getDataSlice(runtime, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + if (slice->size() != MPTID::bytes) + { + return hfResult(results, HostFunctionError::INVALID_PARAMS); + } + auto const mptid = MPTID::fromVoid(slice->data()); + + auto const holder = getDataAccountID(runtime, params, index); + if (!holder) + { + return hfResult(results, holder.error()); + } + + return returnResult( + runtime, + params, + results, + hf->mptokenKeylet(mptid, holder.value()), + index); +} + +wasm_trap_t* +nftOfferKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->nftOfferKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +offerKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->offerKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +oracleKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const documentId = getDataInt32(runtime, params, index); + if (!documentId) + { + return hfResult(results, documentId.error()); // LCOV_EXCL_LINE + } + return returnResult( + runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); +} + +wasm_trap_t* +paychanKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const dest = getDataAccountID(runtime, params, index); + if (!dest) + { + return hfResult(results, dest.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->paychanKeylet(acc.value(), dest.value(), seq.value()), + index); +} + +wasm_trap_t* +permissionedDomainKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->permissionedDomainKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +signersKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + return returnResult( + runtime, params, results, hf->signersKeylet(acc.value()), index); +} + +wasm_trap_t* +ticketKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->ticketKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +vaultKeylet_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const seq = getDataInt32(runtime, params, index); + if (!seq) + { + return hfResult(results, seq.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, + params, + results, + hf->vaultKeylet(acc.value(), seq.value()), + index); +} + +wasm_trap_t* +getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const acc = getDataAccountID(runtime, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFT(*acc, *nftId), index); +} + +wasm_trap_t* +getNFTIssuer_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTIssuer(*nftId), index); +} + +wasm_trap_t* +getNFTTaxon_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTaxon(*nftId), index); +} + +wasm_trap_t* +getNFTFlags_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTFlags(*nftId), index); +} + +wasm_trap_t* +getNFTTransferFee_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTTransferFee(*nftId), index); +} + +wasm_trap_t* +getNFTSerial_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + auto const nftId = getDataUInt256(runtime, params, index); + if (!nftId) + { + return hfResult(results, nftId.error()); + } + + return returnResult( + runtime, params, results, hf->getNFTSerial(*nftId), index); +} + +wasm_trap_t* +trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + + if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const msg = getDataString(runtime, params, index); + if (!msg) + { + return hfResult(results, msg.error()); + } + + auto const data = getDataSlice(runtime, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + auto const asHex = getDataInt32(runtime, params, index); + if (!asHex) + { + return hfResult(results, asHex.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, params, results, hf->trace(*msg, *data, *asHex), index); +} + +wasm_trap_t* +traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const msg = getDataString(runtime, params, index); + if (!msg) + { + return hfResult(results, msg.error()); + } + + auto const number = getDataInt64(runtime, params, index); + if (!number) + { + return hfResult(results, number.error()); // LCOV_EXCL_LINE + } + + return returnResult( + runtime, params, results, hf->traceNum(*msg, *number), index); +} + +wasm_trap_t* +traceAccount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const account = getDataAccountID(runtime, params, i); + if (!account) + return hfResult(results, account.error()); + + return returnResult( + runtime, params, results, hf->traceAccount(*msg, *account), i); +} + +wasm_trap_t* +traceFloat_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const number = getDataSlice(runtime, params, i); + if (!number) + return hfResult(results, number.error()); + + return returnResult( + runtime, params, results, hf->traceFloat(*msg, *number), i); +} + +wasm_trap_t* +traceAmount_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + if (params->data[1].of.i32 > maxWasmDataLength) + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + + int i = 0; + auto const msg = getDataString(runtime, params, i); + if (!msg) + return hfResult(results, msg.error()); + + auto const amountSliceOpt = getDataSlice(runtime, params, i); + if (!amountSliceOpt) + return hfResult(results, amountSliceOpt.error()); + + auto const amountSlice = amountSliceOpt.value(); + auto serialIter = SerialIter(amountSlice); + + std::optional amount; + try + { + amount = STAmount(serialIter, sfGeneric); + } + catch (std::exception const&) + { + amount = std::nullopt; + } + if (!amount || !amount.value()) + return hfResult(results, HostFunctionError::INVALID_PARAMS); + + return returnResult( + runtime, params, results, hf->traceAmount(*msg, *amount), i); +} + +wasm_trap_t* +floatFromInt_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataInt64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 3; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 1; + return returnResult( + runtime, params, results, hf->floatFromInt(*x, *rounding), i); +} + +wasm_trap_t* +floatFromUint_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataUInt64(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatFromUint(*x, *rounding), i); +} + +wasm_trap_t* +floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const exp = getDataInt32(runtime, params, i); + if (!exp) + return hfResult(results, exp.error()); + + auto const mant = getDataInt64(runtime, params, i); + if (!mant) + return hfResult(results, mant.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatSet(*mant, *exp, *rounding), i); +} + +wasm_trap_t* +floatCompare_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + return returnResult(runtime, params, results, hf->floatCompare(*x, *y), i); +} + +wasm_trap_t* +floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatAdd(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatSubtract_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatSubtract(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatMultiply_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatMultiply(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatDivide_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const y = getDataSlice(runtime, params, i); + if (!y) + return hfResult(results, y.error()); + + i = 6; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 4; + return returnResult( + runtime, params, results, hf->floatDivide(*x, *y, *rounding), i); +} + +wasm_trap_t* +floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatRoot(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatPower_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + auto const n = getDataInt32(runtime, params, i); + if (!n) + return hfResult(results, n.error()); + + i = 5; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 3; + return returnResult( + runtime, params, results, hf->floatPower(*x, *n, *rounding), i); +} + +wasm_trap_t* +floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = reinterpret_cast(env); + auto const* runtime = reinterpret_cast(hf->getRT()); + + int i = 0; + auto const x = getDataSlice(runtime, params, i); + if (!x) + return hfResult(results, x.error()); + + i = 4; + auto const rounding = getDataInt32(runtime, params, i); + if (!rounding) + return hfResult(results, rounding.error()); + + i = 2; + return returnResult( + runtime, params, results, hf->floatLog(*x, *rounding), i); +} + +// LCOV_EXCL_START +namespace test { + +class MockInstanceWrapper +{ + wmem mem_; + +public: + MockInstanceWrapper(wmem memory) : mem_(memory) + { + } + + // Mock methods to simulate the behavior of InstanceWrapper + wmem + getMem() const + { + return mem_; + } +}; + +bool +testGetDataIncrement() +{ + wasm_val_t values[4]; + + std::array buffer = { + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + MockInstanceWrapper runtime(wmem{buffer.data(), buffer.size()}); + + { + // test int32_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(42); + + int index = 0; + auto const result = getDataInt32(&runtime, ¶ms, index); + if (!result || result.value() != 42 || index != 1) + return false; + } + + { + // test int64_t + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I64_VAL(1234); + + int index = 0; + auto const result = getDataInt64(&runtime, ¶ms, index); + if (!result || result.value() != 1234 || index != 1) + return false; + } + + { + // test SFieldCRef + wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(sfAccount.fieldCode); + + int index = 0; + auto const result = getDataSField(&runtime, ¶ms, index); + if (!result || result.value().get() != sfAccount || index != 1) + return false; + } + + { + // test Slice + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(3); + + int index = 0; + auto const result = getDataSlice(&runtime, ¶ms, index); + if (!result || result.value() != Slice(buffer.data(), 3) || index != 2) + return false; + } + + { + // test string + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(5); + + int index = 0; + auto const result = getDataString(&runtime, ¶ms, index); + if (!result || + result.value() != + std::string_view( + reinterpret_cast(buffer.data()), 5) || + index != 2) + return false; + } + + { + // test account + AccountID const id(calcAccountID( + generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); + + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(id.bytes); + memcpy(&buffer[0], id.data(), id.bytes); + + int index = 0; + auto const result = getDataAccountID(&runtime, ¶ms, index); + if (!result || result.value() != id || index != 2) + return false; + } + + { + // test uint256 + + Hash h1 = sha512Half(Slice(buffer.data(), 8)); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(h1.bytes); + memcpy(&buffer[0], h1.data(), h1.bytes); + + int index = 0; + auto const result = getDataUInt256(&runtime, ¶ms, index); + if (!result || result.value() != h1 || index != 2) + return false; + } + + { + // test Currency + + Currency const c = xrpCurrency(); + wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + + values[0] = WASM_I32_VAL(0); + values[1] = WASM_I32_VAL(c.bytes); + memcpy(&buffer[0], c.data(), c.bytes); + + int index = 0; + auto const result = getDataCurrency(&runtime, ¶ms, index); + if (!result || result.value() != c || index != 2) + return false; + } + + return true; +} + +} // namespace test +// LCOV_EXCL_STOP + +} // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index e13b5885cfb..d9dd67860d8 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -34,12 +34,92 @@ namespace ripple { +static void +setCommonHostFunctions(HostFunctions* hfs, std::vector& i) +{ + // clang-format off + WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); + WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); + WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); + WASM_IMPORT_FUNC2(i, getTxNestedField, "get_tx_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedField, "get_current_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedField, "get_ledger_obj_nested_field", hfs, 110); + WASM_IMPORT_FUNC2(i, getTxArrayLen, "get_tx_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjArrayLen, "get_current_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getLedgerObjArrayLen, "get_ledger_obj_array_len", hfs, 40); + WASM_IMPORT_FUNC2(i, getTxNestedArrayLen, "get_tx_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); + WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); + + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + + WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptIssuanceKeylet, "mpt_issuance_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptokenKeylet, "mptoken_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, paychanKeylet, "paychan_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, permissionedDomainKeylet, "permissioned_domain_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, signersKeylet, "signers_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ticketKeylet, "ticket_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, vaultKeylet, "vault_keylet", hfs, 350); + + WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTSerial, "get_nft_serial", hfs, 60); + + WASM_IMPORT_FUNC (i, trace, hfs, 500); + WASM_IMPORT_FUNC2(i, traceNum, "trace_num", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAccount, "trace_account", hfs, 500); + WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); + WASM_IMPORT_FUNC2(i, traceAmount, "trace_amount", hfs, 500); + + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); + // clang-format on +} + std::vector createWasmImport(HostFunctions* hfs) { std::vector i; - // Add host functions here + if (hfs) + { + setCommonHostFunctions(hfs, i); + WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); + } return i; } From bfc048e3fe8489e1c659a01c78b401af350d29d4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 14:57:23 -0400 Subject: [PATCH 065/212] add tests --- src/test/app/Wasm_test.cpp | 731 ++ .../wasm_fixtures/wasm_fixtures/.gitignore | 3 + .../all_host_functions/Cargo.lock | 15 + .../all_host_functions/Cargo.toml | 21 + .../all_host_functions/src/lib.rs | 772 ++ .../wasm_fixtures/all_keylets/Cargo.lock | 15 + .../wasm_fixtures/all_keylets/Cargo.toml | 21 + .../wasm_fixtures/all_keylets/src/lib.rs | 179 + .../app/wasm_fixtures/wasm_fixtures/b58.c | 73 + .../wasm_fixtures/codecov_tests/Cargo.lock | 15 + .../wasm_fixtures/codecov_tests/Cargo.toml | 18 + .../codecov_tests/src/host_bindings_loose.rs | 56 + .../wasm_fixtures/codecov_tests/src/lib.rs | 1244 ++ .../wasm_fixtures/copyFixtures.py | 134 + .../wasm_fixtures/disableFloat.wat | 34 + .../app/wasm_fixtures/wasm_fixtures/fib.c | 12 + .../wasm_fixtures/wasm_fixtures/fixtures.cpp | 10330 ++++++++++++++++ .../wasm_fixtures/wasm_fixtures/fixtures.h | 52 + .../wasm_fixtures/float_tests/Cargo.lock | 15 + .../wasm_fixtures/float_tests/Cargo.toml | 21 + .../wasm_fixtures/float_tests/src/lib.rs | 460 + .../wasm_fixtures/wasm_fixtures/ledgerSqn.c | 27 + .../wasm_fixtures/wasm_fixtures/sha512Pure.c | 145 + .../wasm_fixtures/sp1/Cargo.lock | 1384 +++ .../wasm_fixtures/sp1/Cargo.toml | 16 + .../wasm_fixtures/sp1/src/lib.rs | 37 + .../wasm_fixtures/zk_proof/Cargo.lock | 106 + .../wasm_fixtures/zk_proof/Cargo.toml | 19 + .../wasm_fixtures/zk_proof/src/lib.rs | 254 + 29 files changed, 16209 insertions(+) create mode 100644 src/test/app/Wasm_test.cpp create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/.gitignore create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/b58.c create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/fib.c create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp new file mode 100644 index 00000000000..a48e16f1eb0 --- /dev/null +++ b/src/test/app/Wasm_test.cpp @@ -0,0 +1,731 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + +#include + +#include +#include + +namespace ripple { +namespace test { + +bool +testGetDataIncrement(); + +using Add_proto = int32_t(int32_t, int32_t); +static wasm_trap_t* +Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + int32_t Val1 = params->data[0].of.i32; + int32_t Val2 = params->data[1].of.i32; + // printf("Host function \"Add\": %d + %d\n", Val1, Val2); + results->data[0] = WASM_I32_VAL(Val1 + Val2); + return nullptr; +} + +struct Wasm_test : public beast::unit_test::suite +{ + void + testGetDataHelperFunctions() + { + testcase("getData helper functions"); + BEAST_EXPECT(testGetDataIncrement()); + } + + void + testWasmLib() + { + testcase("wasmtime lib test"); + // clang-format off + /* The WASM module buffer. */ + Bytes const wasm = {/* WASM header */ + 0x00, 0x61, 0x73, 0x6D, 0x01, 0x00, 0x00, 0x00, + /* Type section */ + 0x01, 0x07, 0x01, + /* function type {i32, i32} -> {i32} */ + 0x60, 0x02, 0x7F, 0x7F, 0x01, 0x7F, + /* Import section */ + 0x02, 0x13, 0x01, + /* module name: "extern" */ + 0x06, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, + /* extern name: "func-add" */ + 0x08, 0x66, 0x75, 0x6E, 0x63, 0x2D, 0x61, 0x64, 0x64, + /* import desc: func 0 */ + 0x00, 0x00, + /* Function section */ + 0x03, 0x02, 0x01, 0x00, + /* Export section */ + 0x07, 0x0A, 0x01, + /* export name: "addTwo" */ + 0x06, 0x61, 0x64, 0x64, 0x54, 0x77, 0x6F, + /* export desc: func 0 */ + 0x00, 0x01, + /* Code section */ + 0x0A, 0x0A, 0x01, + /* code body */ + 0x08, 0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x0B}; + // clang-format on + auto& vm = WasmEngine::instance(); + + std::vector imports; + WasmImpFunc( + imports, "func-add", reinterpret_cast(&Add)); + + auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + + // if (res) printf("invokeAdd get the result: %d\n", res.value()); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + } + } + + void + testBadWasm() + { + testcase("bad wasm test"); + + using namespace test::jtx; + + Env env{*this}; + HostFunctions hfs; + + { + auto wasmHex = "00000000"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + BEAST_EXPECT(!re); + } + + { + auto wasmHex = "00112233445566778899AA"; + auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::string funcName("mock_escrow"); + + auto const re = + preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + + { + // FinishFunction wrong function name + // pub fn bad() -> bool { + // unsafe { host_lib::getLedgerSqn() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02190108686f73745f6c69620c6765" + "744c656467657253716e00000302010005030100100611027f00418080c0" + "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" + "5f646174615f656e6403000b5f5f686561705f6261736503010a09010700" + "100041044a0b004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e3835" + "2e31202834656231363132353020323032352d30332d31352900490f7461" + "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" + "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" + "6d756c746976616c7565"; + auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + auto const re = preflightEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); + BEAST_EXPECT(!isTesSuccess(re)); + } + } + + void + testWasmLedgerSqn() + { + testcase("Wasm get ledger sequence"); + + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider hf(&env); + + std::vector imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &hf, + 1'000'000, + env.journal); + + // code takes 11 gas + 1 getLedgerSqn call + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 39, std::to_string(re->cost)); + } + + env.close(); + env.close(); + + // empty module - run the same instance + re = engine.run( + {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); + + // code takes 22 gas + 2 getLedgerSqn calls + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 78, std::to_string(re->cost)); + } + } + + void + testWasmFib() + { + testcase("Wasm fibo"); + + auto const ws = boost::algorithm::unhex(fibWasmHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const re = engine.run(wasm, "fib", wasmParams(10)); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 755, std::to_string(re->cost)); + } + } + + void + testWasmSha() + { + testcase("Wasm sha"); + + auto const ws = boost::algorithm::unhex(sha512PureWasmHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const re = + engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 157'452, std::to_string(re->cost)); + } + } + + void + testWasmB58() + { + testcase("Wasm base58"); + auto const ws = boost::algorithm::unhex(b58WasmHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + Bytes outb; + outb.resize(1024); + + auto const minsz = std::min( + static_cast(512), + static_cast(b58WasmHex.size())); + auto const s = std::string_view(b58WasmHex.c_str(), minsz); + + auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); + } + } + + void + testWasmSP1Verifier() + { + testcase("Wasm sp1 zkproof verifier"); + auto const ws = boost::algorithm::unhex(sp1WasmHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const re = engine.run(wasm, "sp1_groth16_verifier"); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS( + re->cost == 4'191'711'969ll, std::to_string(re->cost)); + } + } + + void + testWasmBG16Verifier() + { + testcase("Wasm BG16 zkproof verifier"); + auto const ws = boost::algorithm::unhex(zkProofWasmHex); + Bytes const wasm(ws.begin(), ws.end()); + auto& engine = WasmEngine::instance(); + + auto const re = engine.run(wasm, "bellman_groth16_test"); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); + } + } + + void + testHFCost() + { + testcase("wasm test host functions cost"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector imp = createWasmImport(&hfs); + for (auto& i : imp) + i.gas = 0; + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 847, std::to_string(re->cost)); + } + + env.close(); + } + + env.close(); + env.close(); + env.close(); + env.close(); + env.close(); + + { + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + std::vector const imp = createWasmImport(&hfs); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + &hfs, + 1'000'000, + env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + } + + env.close(); + } + } + + void + testEscrowWasmDN() + { + testcase("escrow wasm devnet test"); + + std::string const wasmStr = + boost::algorithm::unhex(allHostFunctionsWasmHex); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + Env env{*this}; + { + TestHostFunctions nfs(env, 0); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + } + } + + { // fail because trying to access nonexistent field + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) + { + } + Expected + getTxField(SField const& fname) override + { + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + }; + BadTestHostFunctions nfs(env); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); + } + } + + { // fail because trying to allocate more than MAX_PAGES memory + struct BadTestHostFunctions : public TestHostFunctions + { + explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) + { + } + Expected + getTxField(SField const& fname) override + { + return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); + } + }; + BadTestHostFunctions nfs(env); + auto re = + runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); + } + } + + { // fail because recursion too deep + + auto const wasmStr = boost::algorithm::unhex(deepRecursionHex); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctionsSink nfs(env); + std::string funcName("recursive"); + auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1'000'000'000); + BEAST_EXPECT(!re && re.error()); + // std::cout << "bad case (deep recursion) result " << re.error() + // << std::endl; + + auto const& sink = nfs.getSink(); + auto countSubstr = [](std::string const& str, + std::string const& substr) { + std::size_t pos = 0; + int occurrences = 0; + while ((pos = str.find(substr, pos)) != std::string::npos) + { + occurrences++; + pos += substr.length(); + } + return occurrences; + }; + + auto const s = sink.messages().str(); + BEAST_EXPECT( + countSubstr(s, "WAMR Error: failure to call func") == 1); + BEAST_EXPECT( + countSubstr(s, "Exception: wasm operand stack overflow") > 0); + } + + { + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + TestLedgerDataProvider ledgerDataProvider(&env); + + std::vector imports; + WASM_IMPORT_FUNC2( + imports, getLedgerSqn, "get_ledger_sqn2", &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + nullptr, + 1'000'000, + env.journal); + + // expected import not provided + BEAST_EXPECT(!re); + } + } + + void + testFloat() + { + testcase("float point"); + + std::string const funcName("finish"); + + using namespace test::jtx; + + Env env(*this); + { + std::string const wasmHex = floatTestsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); + } + env.close(); + } + + { + std::string const wasmHex = float0Hex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + TestHostFunctions hf(env, 0); + auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); + } + env.close(); + } + } + + void + perfTest() + { + testcase("Perf test host functions"); + + using namespace jtx; + using namespace std::chrono; + + // std::string const funcName("test"); + auto const& wasmHex = hfPerfTest; + // auto const& wasmHex = opcCallPerfTest; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + std::string const credType = "abcde"; + std::string const credType2 = "fghijk"; + std::string const credType3 = "0123456"; + // char const uri[] = "uri"; + + Account const alan{"alan"}; + Account const bob{"bob"}; + Account const issuer{"issuer"}; + + { + Env env(*this); + // Env env(*this, envconfig(), {}, nullptr, + // beast::severities::kTrace); + env.fund(XRP(5000), alan, bob, issuer); + env.close(); + + // // create escrow + // auto const seq = env.seq(alan); + // auto const k = keylet::escrow(alan, seq); + // // auto const allowance = 3'600; + // auto escrowCreate = escrow::create(alan, bob, XRP(1000)); + // XRPAmount txnFees = env.current()->fees().base + 1000; + // env(escrowCreate, + // escrow::finish_function(wasmHex), + // escrow::finish_time(env.now() + 11s), + // escrow::cancel_time(env.now() + 100s), + // escrow::data("1000000000"), // 1000 XRP in drops + // memodata("memo1234567"), + // memodata("2memo1234567"), + // fee(txnFees)); + + // // create depositPreauth + // auto const k = keylet::depositPreauth( + // bob, + // {{issuer.id(), makeSlice(credType)}, + // {issuer.id(), makeSlice(credType2)}, + // {issuer.id(), makeSlice(credType3)}}); + // env(deposit::authCredentials( + // bob, + // {{issuer, credType}, + // {issuer, credType2}, + // {issuer, credType3}})); + + // cREATE nft + [[maybe_unused]] uint256 const nft0{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + auto const k = keylet::nftoffer(alan, 0); + [[maybe_unused]] uint256 const nft1{ + token::getNextID(env, alan, 0u)}; + + env(token::mint(alan, 0u), + token::uri( + "https://github.com/XRPLF/XRPL-Standards/discussions/" + "279?id=github.com/XRPLF/XRPL-Standards/discussions/" + "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" + "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" + "279&aot=github.com/XRPLF/XRPL-Standards/disc")); + [[maybe_unused]] uint256 const nft2{ + token::getNextID(env, alan, 0u)}; + env(token::mint(alan, 0u)); + env.close(); + + PerfHostFunctions nfs(env, k, env.tx()); + + auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + std::cout << "Res: " << re->result << " cost: " << re->cost + << std::endl; + } + + // env(escrow::finish(alan, alan, seq), + // escrow::comp_allowance(allowance), + // fee(txnFees), + // ter(tesSUCCESS)); + + env.close(); + } + } + + void + testCodecovWasm() + { + testcase("Codecov wasm test"); + + using namespace test::jtx; + + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + TestHostFunctions hfs(env, 0); + + auto const allowance = 121'895; + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); + + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECT(re->result); + BEAST_EXPECTS(re->cost == allowance, std::to_string(re->cost)); + } + } + + void + testDisabledFloat() + { + testcase("disabled float"); + + using namespace test::jtx; + Env env{*this}; + + auto const wasmStr = boost::algorithm::unhex(disabledFloatHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("finish"); + TestHostFunctions hfs(env, 0); + + { + // f32 set constant, opcode disabled exception + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + } + + { + // f32 add, can't create module exception + wasm[0x117] = 0x92; + auto const re = + runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + } + } + + void + run() override + { + using namespace test::jtx; + + testGetDataHelperFunctions(); + testWasmLib(); + testBadWasm(); + testWasmLedgerSqn(); + + testWasmFib(); + testWasmSha(); + testWasmB58(); + + // runing too long + // testWasmSP1Verifier(); + testWasmBG16Verifier(); + + testHFCost(); + + testEscrowWasmDN(); + testFloat(); + + testCodecovWasm(); + testDisabledFloat(); + + // perfTest(); + } +}; + +BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/.gitignore b/src/test/app/wasm_fixtures/wasm_fixtures/.gitignore new file mode 100644 index 00000000000..08b2e8a2569 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/.gitignore @@ -0,0 +1,3 @@ +**/target +**/debug +*.wasm diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock new file mode 100644 index 00000000000..7f6a6bc7175 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_host_functions" +version = "0.1.0" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.5.1-devnet5" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml new file mode 100644 index 00000000000..959056f374e --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "all_host_functions" +version = "0.1.0" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } + +[profile.dev] +panic = "abort" + +[profile.release] +panic = "abort" +opt-level = "z" +lto = true diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs new file mode 100644 index 00000000000..c8a27aed876 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs @@ -0,0 +1,772 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +// +// Host Functions Test +// Tests 26 host functions (across 7 categories) +// +// With craft you can run this test with: +// craft test --project host_functions_test --test-case host_functions_test +// +// Amount Format Update: +// - XRP amounts now return as 8-byte serialized rippled objects +// - IOU and MPT amounts return in variable-length serialized format +// - Format details: https://xrpl.org/docs/references/protocol/binary-format#amount-fields +// +// Error Code Ranges: +// -100 to -199: Ledger Header Functions (3 functions) +// -200 to -299: Transaction Data Functions (5 functions) +// -300 to -399: Current Ledger Object Functions (4 functions) +// -400 to -499: Any Ledger Object Functions (5 functions) +// -500 to -599: Keylet Generation Functions (4 functions) +// -600 to -699: Utility Functions (4 functions) +// -700 to -799: Data Update Functions (1 function) +// + +use xrpl_std::core::current_tx::escrow_finish::EscrowFinish; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_account_buf, trace_data, trace_num, DataRepr}; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("=== HOST FUNCTIONS TEST ==="); + let _ = trace("Testing 26 host functions"); + + // Category 1: Ledger Header Data Functions (3 functions) + // Error range: -100 to -199 + match test_ledger_header_functions() { + 0 => (), + err => return err, + } + + // Category 2: Transaction Data Functions (5 functions) + // Error range: -200 to -299 + match test_transaction_data_functions() { + 0 => (), + err => return err, + } + + // Category 3: Current Ledger Object Functions (4 functions) + // Error range: -300 to -399 + match test_current_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 4: Any Ledger Object Functions (5 functions) + // Error range: -400 to -499 + match test_any_ledger_object_functions() { + 0 => (), + err => return err, + } + + // Category 5: Keylet Generation Functions (4 functions) + // Error range: -500 to -599 + match test_keylet_generation_functions() { + 0 => (), + err => return err, + } + + // Category 6: Utility Functions (4 functions) + // Error range: -600 to -699 + match test_utility_functions() { + 0 => (), + err => return err, + } + + // Category 7: Data Update Functions (1 function) + // Error range: -700 to -799 + match test_data_update_functions() { + 0 => (), + err => return err, + } + + let _ = trace("SUCCESS: All host function tests passed!"); + 1 // Success return code for WASM finish function +} + +/// Test Category 1: Ledger Header Data Functions (3 functions) +/// - get_ledger_sqn() - Get ledger sequence number +/// - get_parent_ledger_time() - Get parent ledger timestamp +/// - get_parent_ledger_hash() - Get parent ledger hash +fn test_ledger_header_functions() -> i32 { + let _ = trace("--- Category 1: Ledger Header Functions ---"); + + // Test 1.1: get_ledger_sqn() - should return current ledger sequence number + let sqn_result = unsafe { host::get_ledger_sqn() }; + + if sqn_result <= 0 { + let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); + return -101; // Ledger sequence number test failed + } + let _ = trace_num("Ledger sequence number:", sqn_result as i64); + + // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp + let time_result = unsafe { host::get_parent_ledger_time() }; + + if time_result <= 0 { + let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); + return -102; // Parent ledger time test failed + } + let _ = trace_num("Parent ledger time:", time_result as i64); + + // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) + let mut hash_buffer = [0u8; 32]; + let hash_result = + unsafe { host::get_parent_ledger_hash(hash_buffer.as_mut_ptr(), hash_buffer.len()) }; + + if hash_result != 32 { + let _ = trace_num( + "ERROR: get_parent_ledger_hash wrong length:", + hash_result as i64, + ); + return -103; // Parent ledger hash test failed - should be exactly 32 bytes + } + let _ = trace_data("Parent ledger hash:", &hash_buffer, DataRepr::AsHex); + + let _ = trace("SUCCESS: Ledger header functions"); + 0 +} + +/// Test Category 2: Transaction Data Functions (5 functions) +/// Tests all functions for accessing current transaction data +fn test_transaction_data_functions() -> i32 { + let _ = trace("--- Category 2: Transaction Data Functions ---"); + + // Test 2.1: get_tx_field() - Basic transaction field access + // Test with Account field (required, 20 bytes) + let mut account_buffer = [0u8; 20]; + let account_len = unsafe { + host::get_tx_field( + sfield::Account, + account_buffer.as_mut_ptr(), + account_buffer.len(), + ) + }; + + if account_len != 20 { + let _ = trace_num( + "ERROR: get_tx_field(Account) wrong length:", + account_len as i64, + ); + return -201; // Basic transaction field test failed + } + let _ = trace_account_buf("Transaction Account:", &account_buffer); + + // Test with Fee field (XRP amount - 8 bytes in new serialized format) + // New format: XRP amounts are always 8 bytes (positive: value | cPositive flag, negative: just value) + let mut fee_buffer = [0u8; 8]; + let fee_len = + unsafe { host::get_tx_field(sfield::Fee, fee_buffer.as_mut_ptr(), fee_buffer.len()) }; + + if fee_len != 8 { + let _ = trace_num( + "ERROR: get_tx_field(Fee) wrong length (expected 8 bytes for XRP):", + fee_len as i64, + ); + return -202; // Fee field test failed - XRP amounts should be exactly 8 bytes + } + let _ = trace_num("Transaction Fee length:", fee_len as i64); + let _ = trace_data( + "Transaction Fee (serialized XRP amount):", + &fee_buffer, + DataRepr::AsHex, + ); + + // Test with Sequence field (required, 4 bytes uint32) + let mut seq_buffer = [0u8; 4]; + let seq_len = + unsafe { host::get_tx_field(sfield::Sequence, seq_buffer.as_mut_ptr(), seq_buffer.len()) }; + + if seq_len != 4 { + let _ = trace_num( + "ERROR: get_tx_field(Sequence) wrong length:", + seq_len as i64, + ); + return -203; // Sequence field test failed + } + let _ = trace_data("Transaction Sequence:", &seq_buffer, DataRepr::AsHex); + + // NOTE: get_tx_field2() through get_tx_field6() have been deprecated. + // Use get_tx_field() with appropriate parameters for all transaction field access. + + // Test 2.2: get_tx_nested_field() - Nested field access with locator + let locator = [0x01, 0x00]; // Simple locator for first element + let mut nested_buffer = [0u8; 32]; + let nested_result = unsafe { + host::get_tx_nested_field( + locator.as_ptr(), + locator.len(), + nested_buffer.as_mut_ptr(), + nested_buffer.len(), + ) + }; + + if nested_result < 0 { + let _ = trace_num( + "INFO: get_tx_nested_field not applicable:", + nested_result as i64, + ); + // Expected - locator may not match transaction structure + } else { + let _ = trace_num("Nested field length:", nested_result as i64); + let _ = trace_data( + "Nested field:", + &nested_buffer[..nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 2.3: get_tx_array_len() - Get array length + let signers_len = unsafe { host::get_tx_array_len(sfield::Signers) }; + let _ = trace_num("Signers array length:", signers_len as i64); + + let memos_len = unsafe { host::get_tx_array_len(sfield::Memos) }; + let _ = trace_num("Memos array length:", memos_len as i64); + + // Test 2.4: get_tx_nested_array_len() - Get nested array length with locator + let nested_array_len = + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }; + + if nested_array_len < 0 { + let _ = trace_num( + "INFO: get_tx_nested_array_len not applicable:", + nested_array_len as i64, + ); + } else { + let _ = trace_num("Nested array length:", nested_array_len as i64); + } + + let _ = trace("SUCCESS: Transaction data functions"); + 0 +} + +/// Test Category 3: Current Ledger Object Functions (4 functions) +/// Tests functions that access the current ledger object being processed +fn test_current_ledger_object_functions() -> i32 { + let _ = trace("--- Category 3: Current Ledger Object Functions ---"); + + // Test 3.1: get_current_ledger_obj_field() - Access field from current ledger object + // Test with Balance field (XRP amount - 8 bytes in new serialized format) + let mut balance_buffer = [0u8; 8]; + let balance_result = unsafe { + host::get_current_ledger_obj_field( + sfield::Balance, + balance_buffer.as_mut_ptr(), + balance_buffer.len(), + ) + }; + + if balance_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Balance) failed (may be expected):", + balance_result as i64, + ); + // This might fail if current ledger object doesn't have balance field + } else if balance_result == 8 { + let _ = trace_num( + "Current object balance length (XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance (serialized XRP amount):", + &balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Current object balance length (non-XRP amount):", + balance_result as i64, + ); + let _ = trace_data( + "Current object balance:", + &balance_buffer[..balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test with Account field + let mut current_account_buffer = [0u8; 20]; + let current_account_result = unsafe { + host::get_current_ledger_obj_field( + sfield::Account, + current_account_buffer.as_mut_ptr(), + current_account_buffer.len(), + ) + }; + + if current_account_result <= 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_field(Account) failed:", + current_account_result as i64, + ); + } else { + let _ = trace_account_buf("Current ledger object account:", ¤t_account_buffer); + } + + // Test 3.2: get_current_ledger_obj_nested_field() - Nested field access + let locator = [0x01, 0x00]; // Simple locator + let mut current_nested_buffer = [0u8; 32]; + let current_nested_result = unsafe { + host::get_current_ledger_obj_nested_field( + locator.as_ptr(), + locator.len(), + current_nested_buffer.as_mut_ptr(), + current_nested_buffer.len(), + ) + }; + + if current_nested_result < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_field not applicable:", + current_nested_result as i64, + ); + } else { + let _ = trace_num("Current nested field length:", current_nested_result as i64); + let _ = trace_data( + "Current nested field:", + ¤t_nested_buffer[..current_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 3.3: get_current_ledger_obj_array_len() - Array length in current object + let current_array_len = unsafe { host::get_current_ledger_obj_array_len(sfield::Signers) }; + let _ = trace_num( + "Current object Signers array length:", + current_array_len as i64, + ); + + // Test 3.4: get_current_ledger_obj_nested_array_len() - Nested array length + let current_nested_array_len = + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }; + + if current_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_current_ledger_obj_nested_array_len not applicable:", + current_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Current nested array length:", + current_nested_array_len as i64, + ); + } + + let _ = trace("SUCCESS: Current ledger object functions"); + 0 +} + +/// Test Category 4: Any Ledger Object Functions (5 functions) +/// Tests functions that work with cached ledger objects +fn test_any_ledger_object_functions() -> i32 { + let _ = trace("--- Category 4: Any Ledger Object Functions ---"); + + // First we need to cache a ledger object to test the other functions + // Get the account from transaction and generate its keylet + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 4.1: cache_ledger_obj() - Cache a ledger object + let mut keylet_buffer = [0u8; 32]; + let keylet_result = unsafe { + host::account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + keylet_buffer.as_mut_ptr(), + keylet_buffer.len(), + ) + }; + + if keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed for caching test:", + keylet_result as i64, + ); + return -401; // Keylet generation failed for caching test + } + + let cache_result = + unsafe { host::cache_ledger_obj(keylet_buffer.as_ptr(), keylet_result as usize, 0) }; + + if cache_result <= 0 { + let _ = trace_num( + "INFO: cache_ledger_obj failed (expected with test fixtures):", + cache_result as i64, + ); + // Test fixtures may not contain the account object - this is expected + // We'll test the interface but expect failures + + // Test 4.2-4.5 with invalid slot (should fail gracefully) + let mut test_buffer = [0u8; 32]; + + // Test get_ledger_obj_field with invalid slot + let field_result = unsafe { + host::get_ledger_obj_field( + 1, + sfield::Balance, + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if field_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field failed as expected (no cached object):", + field_result as i64, + ); + } + + // Test get_ledger_obj_nested_field with invalid slot + let locator = [0x01, 0x00]; + let nested_result = unsafe { + host::get_ledger_obj_nested_field( + 1, + locator.as_ptr(), + locator.len(), + test_buffer.as_mut_ptr(), + test_buffer.len(), + ) + }; + if nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field failed as expected:", + nested_result as i64, + ); + } + + // Test get_ledger_obj_array_len with invalid slot + let array_result = unsafe { host::get_ledger_obj_array_len(1, sfield::Signers) }; + if array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_array_len failed as expected:", + array_result as i64, + ); + } + + // Test get_ledger_obj_nested_array_len with invalid slot + let nested_array_result = + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }; + if nested_array_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len failed as expected:", + nested_array_result as i64, + ); + } + + let _ = trace("SUCCESS: Any ledger object functions (interface tested)"); + return 0; + } + + // If we successfully cached an object, test the access functions + let slot = cache_result; + let _ = trace_num("Successfully cached object in slot:", slot as i64); + + // Test 4.2: get_ledger_obj_field() - Access field from cached object + let mut cached_balance_buffer = [0u8; 8]; + let cached_balance_result = unsafe { + host::get_ledger_obj_field( + slot, + sfield::Balance, + cached_balance_buffer.as_mut_ptr(), + cached_balance_buffer.len(), + ) + }; + + if cached_balance_result <= 0 { + let _ = trace_num( + "INFO: get_ledger_obj_field(Balance) failed:", + cached_balance_result as i64, + ); + } else if cached_balance_result == 8 { + let _ = trace_num( + "Cached object balance length (XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance (serialized XRP amount):", + &cached_balance_buffer, + DataRepr::AsHex, + ); + } else { + let _ = trace_num( + "Cached object balance length (non-XRP amount):", + cached_balance_result as i64, + ); + let _ = trace_data( + "Cached object balance:", + &cached_balance_buffer[..cached_balance_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.3: get_ledger_obj_nested_field() - Nested field from cached object + let locator = [0x01, 0x00]; + let mut cached_nested_buffer = [0u8; 32]; + let cached_nested_result = unsafe { + host::get_ledger_obj_nested_field( + slot, + locator.as_ptr(), + locator.len(), + cached_nested_buffer.as_mut_ptr(), + cached_nested_buffer.len(), + ) + }; + + if cached_nested_result < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_field not applicable:", + cached_nested_result as i64, + ); + } else { + let _ = trace_num("Cached nested field length:", cached_nested_result as i64); + let _ = trace_data( + "Cached nested field:", + &cached_nested_buffer[..cached_nested_result as usize], + DataRepr::AsHex, + ); + } + + // Test 4.4: get_ledger_obj_array_len() - Array length from cached object + let cached_array_len = unsafe { host::get_ledger_obj_array_len(slot, sfield::Signers) }; + let _ = trace_num( + "Cached object Signers array length:", + cached_array_len as i64, + ); + + // Test 4.5: get_ledger_obj_nested_array_len() - Nested array length from cached object + let cached_nested_array_len = + unsafe { host::get_ledger_obj_nested_array_len(slot, locator.as_ptr(), locator.len()) }; + + if cached_nested_array_len < 0 { + let _ = trace_num( + "INFO: get_ledger_obj_nested_array_len not applicable:", + cached_nested_array_len as i64, + ); + } else { + let _ = trace_num( + "Cached nested array length:", + cached_nested_array_len as i64, + ); + } + + let _ = trace("SUCCESS: Any ledger object functions"); + 0 +} + +/// Test Category 5: Keylet Generation Functions (4 functions) +/// Tests keylet generation functions for different ledger entry types +fn test_keylet_generation_functions() -> i32 { + let _ = trace("--- Category 5: Keylet Generation Functions ---"); + + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + + // Test 5.1: account_keylet() - Generate keylet for account + let mut account_keylet_buffer = [0u8; 32]; + let account_keylet_result = unsafe { + host::account_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + account_keylet_buffer.as_mut_ptr(), + account_keylet_buffer.len(), + ) + }; + + if account_keylet_result != 32 { + let _ = trace_num( + "ERROR: account_keylet failed:", + account_keylet_result as i64, + ); + return -501; // Account keylet generation failed + } + let _ = trace_data("Account keylet:", &account_keylet_buffer, DataRepr::AsHex); + + // Test 5.2: credential_keylet() - Generate keylet for credential + let mut credential_keylet_buffer = [0u8; 32]; + let credential_keylet_result = unsafe { + host::credential_keylet( + account_id.0.as_ptr(), // Subject + account_id.0.len(), + account_id.0.as_ptr(), // Issuer - same account for test + account_id.0.len(), + b"TestType".as_ptr(), // Credential type + 9usize, // Length of "TestType" + credential_keylet_buffer.as_mut_ptr(), + credential_keylet_buffer.len(), + ) + }; + + if credential_keylet_result <= 0 { + let _ = trace_num( + "INFO: credential_keylet failed (expected - interface issue):", + credential_keylet_result as i64, + ); + // This is expected to fail due to unusual parameter types + } else { + let _ = trace_data( + "Credential keylet:", + &credential_keylet_buffer[..credential_keylet_result as usize], + DataRepr::AsHex, + ); + } + + // Test 5.3: escrow_keylet() - Generate keylet for escrow + let mut escrow_keylet_buffer = [0u8; 32]; + let escrow_keylet_result = unsafe { + host::escrow_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 1000, // Sequence number + escrow_keylet_buffer.as_mut_ptr(), + escrow_keylet_buffer.len(), + ) + }; + + if escrow_keylet_result != 32 { + let _ = trace_num("ERROR: escrow_keylet failed:", escrow_keylet_result as i64); + return -503; // Escrow keylet generation failed + } + let _ = trace_data("Escrow keylet:", &escrow_keylet_buffer, DataRepr::AsHex); + + // Test 5.4: oracle_keylet() - Generate keylet for oracle + let mut oracle_keylet_buffer = [0u8; 32]; + let oracle_keylet_result = unsafe { + host::oracle_keylet( + account_id.0.as_ptr(), + account_id.0.len(), + 42, // Document ID + oracle_keylet_buffer.as_mut_ptr(), + oracle_keylet_buffer.len(), + ) + }; + + if oracle_keylet_result != 32 { + let _ = trace_num("ERROR: oracle_keylet failed:", oracle_keylet_result as i64); + return -504; // Oracle keylet generation failed + } + let _ = trace_data("Oracle keylet:", &oracle_keylet_buffer, DataRepr::AsHex); + + let _ = trace("SUCCESS: Keylet generation functions"); + 0 +} + +/// Test Category 6: Utility Functions (4 functions) +/// Tests utility functions for hashing, NFT access, and tracing +fn test_utility_functions() -> i32 { + let _ = trace("--- Category 6: Utility Functions ---"); + + // Test 6.1: compute_sha512_half() - SHA512 hash computation (first 32 bytes) + let test_data = b"Hello, XRPL WASM world!"; + let mut hash_output = [0u8; 32]; + let hash_result = unsafe { + host::compute_sha512_half( + test_data.as_ptr(), + test_data.len(), + hash_output.as_mut_ptr(), + hash_output.len(), + ) + }; + + if hash_result != 32 { + let _ = trace_num("ERROR: compute_sha512_half failed:", hash_result as i64); + return -601; // SHA512 half computation failed + } + let _ = trace_data("Input data:", test_data, DataRepr::AsHex); + let _ = trace_data("SHA512 half hash:", &hash_output, DataRepr::AsHex); + + // Test 6.2: get_nft() - NFT data retrieval + let escrow_finish = EscrowFinish; + let account_id = escrow_finish.get_account().unwrap(); + let nft_id = [0u8; 32]; // Dummy NFT ID for testing + let mut nft_buffer = [0u8; 256]; + let nft_result = unsafe { + host::get_nft( + account_id.0.as_ptr(), + account_id.0.len(), + nft_id.as_ptr(), + nft_id.len(), + nft_buffer.as_mut_ptr(), + nft_buffer.len(), + ) + }; + + if nft_result <= 0 { + let _ = trace_num( + "INFO: get_nft failed (expected - no such NFT):", + nft_result as i64, + ); + // This is expected - test account likely doesn't own the dummy NFT + } else { + let _ = trace_num("NFT data length:", nft_result as i64); + let _ = trace_data( + "NFT data:", + &nft_buffer[..nft_result as usize], + DataRepr::AsHex, + ); + } + + // Test 6.3: trace() - Debug logging with data + let trace_message = b"Test trace message"; + let trace_data_payload = b"payload"; + let trace_result = unsafe { + host::trace( + trace_message.as_ptr(), + trace_message.len(), + trace_data_payload.as_ptr(), + trace_data_payload.len(), + 1, // as_hex = true + ) + }; + + if trace_result < 0 { + let _ = trace_num("ERROR: trace() failed:", trace_result as i64); + return -603; // Trace function failed + } + let _ = trace_num("Trace function bytes written:", trace_result as i64); + + // Test 6.4: trace_num() - Debug logging with number + let test_number = 42i64; + let trace_num_result = trace_num("Test number trace", test_number); + + use xrpl_std::host::Result; + match trace_num_result { + Result::Ok(_) => { + let _ = trace_num("Trace_num function succeeded", 0); + } + Result::Err(_) => { + let _ = trace_num("ERROR: trace_num() failed:", -604); + return -604; // Trace number function failed + } + } + + let _ = trace("SUCCESS: Utility functions"); + 0 +} + +/// Test Category 7: Data Update Functions (1 function) +/// Tests the function for modifying the current ledger entry +fn test_data_update_functions() -> i32 { + let _ = trace("--- Category 7: Data Update Functions ---"); + + // Test 7.1: update_data() - Update current ledger entry data + let update_payload = b"Updated ledger entry data from WASM test"; + + let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; + + if update_result != 0 { + let _ = trace_num("ERROR: update_data failed:", update_result as i64); + return -701; // Data update failed + } + + let _ = trace_data( + "Successfully updated ledger entry with:", + update_payload, + DataRepr::AsHex, + ); + let _ = trace("SUCCESS: Data update functions"); + 0 +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock new file mode 100644 index 00000000000..3491dc00fa4 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "all_keylets" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.5.1-devnet5" +source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#c3a92273195a211ac9b41d641b0d20f60f982bb2" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml new file mode 100644 index 00000000000..620e28fceb1 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml @@ -0,0 +1,21 @@ +[package] +edition = "2024" +name = "all_keylets" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs new file mode 100644 index 00000000000..970db7bd50b --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs @@ -0,0 +1,179 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use crate::host::{Error, Result, Result::Err, Result::Ok}; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; +use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::ledger_object; +use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; +use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; +use xrpl_std::core::types::amount::currency_code::CurrencyCode; +use xrpl_std::core::types::amount::mpt_id::MptId; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; +use xrpl_std::sfield; + +#[unsafe(no_mangle)] +pub fn object_exists( + keylet_result: Result, + keylet_type: &str, + field: i32, +) -> Result { + match keylet_result { + Ok(keylet) => { + let _ = trace_data(keylet_type, &keylet, DataRepr::AsHex); + + let slot = unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }; + if slot <= 0 { + let _ = trace_num("Error: ", slot.into()); + return Err(Error::from_code(slot)); + } + if field == 0 { + let new_field = sfield::PreviousTxnID; + let _ = trace_num("Getting field: ", new_field.into()); + match ledger_object::get_hash_256_field(slot, new_field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } else { + let _ = trace_num("Getting field: ", field.into()); + match ledger_object::get_account_id_field(slot, field) { + Ok(data) => { + let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); + } + Err(result_code) => { + let _ = trace_num("Error getting field: ", result_code.into()); + return Err(result_code); + } + } + } + + Ok(true) + } + Err(error) => { + let _ = trace_num("Error getting keylet: ", error.into()); + Err(error) + } + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + let escrow: CurrentEscrow = get_current_escrow(); + + let account = escrow.get_account().unwrap_or_panic(); + let _ = trace_account("Account:", &account); + + let destination = escrow.get_destination().unwrap_or_panic(); + let _ = trace_account("Destination:", &destination); + + let mut seq = 5; + + macro_rules! check_object_exists { + ($keylet:expr, $type:expr, $field:expr) => { + match object_exists($keylet, $type, $field) { + Ok(_exists) => { + // false isn't returned + let _ = trace(concat!( + $type, + " object exists, proceeding with escrow finish." + )); + } + Err(error) => { + let _ = trace_num("Current seq value:", seq.try_into().unwrap()); + return error.code(); + } + } + }; + } + + let account_keylet = keylets::account_keylet(&account); + check_object_exists!(account_keylet, "Account", sfield::Account); + + let currency_code: &[u8; 3] = b"USD"; + let currency: CurrencyCode = CurrencyCode::from(*currency_code); + let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); + check_object_exists!(line_keylet, "Trustline", sfield::Generic); + seq += 1; + + let asset1 = Asset::XRP(XrpAsset {}); + let asset2 = Asset::IOU(IouAsset::new(destination, currency)); + check_object_exists!( + keylets::amm_keylet(&asset1, &asset2), + "AMM", + sfield::Account + ); + + let check_keylet = keylets::check_keylet(&account, seq); + check_object_exists!(check_keylet, "Check", sfield::Account); + seq += 1; + + let cred_type: &[u8] = b"termsandconditions"; + let credential_keylet = keylets::credential_keylet(&account, &account, cred_type); + check_object_exists!(credential_keylet, "Credential", sfield::Subject); + seq += 1; + + let delegate_keylet = keylets::delegate_keylet(&account, &destination); + check_object_exists!(delegate_keylet, "Delegate", sfield::Account); + seq += 1; + + let deposit_preauth_keylet = keylets::deposit_preauth_keylet(&account, &destination); + check_object_exists!(deposit_preauth_keylet, "DepositPreauth", sfield::Account); + seq += 1; + + let did_keylet = keylets::did_keylet(&account); + check_object_exists!(did_keylet, "DID", sfield::Account); + seq += 1; + + let escrow_keylet = keylets::escrow_keylet(&account, seq); + check_object_exists!(escrow_keylet, "Escrow", sfield::Account); + seq += 1; + + let mpt_issuance_keylet = keylets::mpt_issuance_keylet(&account, seq); + let mpt_id = MptId::new(seq.try_into().unwrap(), account); + check_object_exists!(mpt_issuance_keylet, "MPTIssuance", sfield::Issuer); + seq += 1; + + let mptoken_keylet = keylets::mptoken_keylet(&mpt_id, &destination); + check_object_exists!(mptoken_keylet, "MPToken", sfield::Account); + + let nft_offer_keylet = keylets::nft_offer_keylet(&destination, 6); + check_object_exists!(nft_offer_keylet, "NFTokenOffer", sfield::Owner); + + let offer_keylet = keylets::offer_keylet(&account, seq); + check_object_exists!(offer_keylet, "Offer", sfield::Account); + seq += 1; + + let paychan_keylet = keylets::paychan_keylet(&account, &destination, seq); + check_object_exists!(paychan_keylet, "PayChannel", sfield::Account); + seq += 1; + + let pd_keylet = keylets::permissioned_domain_keylet(&account, seq); + check_object_exists!(pd_keylet, "PermissionedDomain", sfield::Owner); + seq += 1; + + let signers_keylet = keylets::signers_keylet(&account); + check_object_exists!(signers_keylet, "SignerList", sfield::Generic); + seq += 1; + + seq += 1; // ticket sequence number is one greater + let ticket_keylet = keylets::ticket_keylet(&account, seq); + check_object_exists!(ticket_keylet, "Ticket", sfield::Account); + seq += 1; + + let vault_keylet = keylets::vault_keylet(&account, seq); + check_object_exists!(vault_keylet, "Vault", sfield::Account); + // seq += 1; + + 1 // All keylets exist, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/wasm_fixtures/b58.c new file mode 100644 index 00000000000..00b6178ec05 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/b58.c @@ -0,0 +1,73 @@ +#include + +static char const b58digits_ordered[] = + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; + +uint8_t e_data[32 * 1024]; + +void* +allocate(int sz) +{ + static int idx = 0; + if (idx >= 32) + return 0; + if (sz > 1024) + return 0; + return &e_data[idx++ << 10]; +} + +void +deallocate(void* p) +{ +} + +extern int32_t +b58enco(char* b58, int32_t b58sz, void const* data, int32_t binsz) +{ + uint8_t const* bin = data; + int32_t carry; + int32_t i, j, high, zcount = 0; + int32_t size; + + while (zcount < binsz && !bin[zcount]) + ++zcount; + + size = (binsz - zcount) * 138 / 100 + 1; + uint8_t* buf = allocate(size); + if (!buf) + return 0; + // memset(buf, 0, size); + for (i = 0; i < size; ++i) + buf[i] = 0; + + for (i = zcount, high = size - 1; i < binsz; ++i, high = j) + { + for (carry = bin[i], j = size - 1; (j > high) || carry; --j) + { + carry += 256 * buf[j]; + buf[j] = carry % 58; + carry /= 58; + if (!j) + break; + } + } + + for (j = 0; j < size && !buf[j]; ++j) + ; + + if (b58sz <= zcount + size - j) + return 0; + + if (zcount) + { + // memset(b58, '1', zcount); + for (i = 0; i < zcount; ++i) + b58[i] = '1'; + } + + for (i = zcount; j < size; ++i, ++j) + b58[i] = b58digits_ordered[buf[j]]; + b58[i] = '\0'; + + return i + 1; +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock new file mode 100644 index 00000000000..704846d35a6 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "codecov_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.5.1-devnet5" +source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml new file mode 100644 index 00000000000..52ca804bc0f --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml @@ -0,0 +1,18 @@ +[package] +edition = "2024" +name = "codecov_tests" +version = "0.0.1" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs new file mode 100644 index 00000000000..706add2ed78 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -0,0 +1,56 @@ +//TODO add docs after discussing the interface +//Note that Craft currently does not honor the rounding modes +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TO_NEAREST: i32 = 0; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_TOWARDS_ZERO: i32 = 1; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_DOWNWARD: i32 = 2; +#[allow(unused)] +pub const FLOAT_ROUNDING_MODES_UPWARD: i32 = 3; + +// pub enum RippledRoundingModes{ +// ToNearest = 0, +// TowardsZero = 1, +// DOWNWARD = 2, +// UPWARD = 3 +// } + +#[allow(unused)] +#[link(wasm_import_module = "host_lib")] +unsafe extern "C" { + pub fn get_parent_ledger_hash(out_buff_ptr: i32, out_buff_len: i32) -> i32; + + pub fn cache_ledger_obj(keylet_ptr: i32, keylet_len: i32, cache_num: i32) -> i32; + + pub fn get_tx_nested_array_len(locator_ptr: i32, locator_len: i32) -> i32; + + pub fn account_keylet( + account_ptr: i32, + account_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn amm_keylet( + issue1_ptr: *const u8, + issue1_len: usize, + issue2_ptr: i32, + issue2_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn line_keylet( + account1_ptr: *const u8, + account1_len: usize, + account2_ptr: *const u8, + account2_len: usize, + currency_ptr: i32, + currency_len: i32, + out_buff_ptr: *mut u8, + out_buff_len: usize, + ) -> i32; + + pub fn trace_num(msg_read_ptr: i32, msg_read_len: i32, number: i64) -> i32; +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs new file mode 100644 index 00000000000..36c61fe439d --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs @@ -0,0 +1,1244 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use core::panic; +use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; +use xrpl_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_std::core::error_codes; +use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::amount::asset::Asset; +use xrpl_std::core::types::amount::asset::XrpAsset; +use xrpl_std::core::types::amount::mpt_id::MptId; +use xrpl_std::core::types::keylets; +use xrpl_std::host; +use xrpl_std::host::trace::{trace, trace_num as trace_number}; +use xrpl_std::sfield; + +mod host_bindings_loose; +include!("host_bindings_loose.rs"); + +fn check_result(result: i32, expected: i32, test_name: &'static str) { + match result { + code if code == expected => { + let _ = trace_number(test_name, code.into()); + } + code if code >= 0 => { + let _ = trace(test_name); + let _ = trace_number("TEST FAILED", code.into()); + panic!("Unexpected success code: {}", code); + } + code => { + let _ = trace(test_name); + let _ = trace_number("TEST FAILED", code.into()); + panic!("Error code: {}", code); + } + } +} + +fn with_buffer(mut f: F) -> R +where + F: FnMut(*mut u8, usize) -> R, +{ + let mut buf = [0u8; N]; + f(buf.as_mut_ptr(), buf.len()) +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + let _ = trace("$$$$$ STARTING WASM EXECUTION $$$$$"); + + // ######################################## + // Step #1: Test all host function happy paths + // Note: not testing all the keylet functions, + // that's in a separate test file. + // ######################################## + check_result(unsafe { host::get_ledger_sqn() }, 12345, "get_ledger_sqn"); + check_result( + unsafe { host::get_parent_ledger_time() }, + 67890, + "get_parent_ledger_time", + ); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_hash(ptr, len) }, + 32, + "get_parent_ledger_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_account_hash(ptr, len) }, + 32, + "get_ledger_account_hash", + ); + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_tx_hash(ptr, len) }, + 32, + "get_ledger_tx_hash", + ); + }); + check_result(unsafe { host::get_base_fee() }, 10, "get_base_fee"); + let amendment_name: &[u8] = b"test_amendment"; + let amendment_id: [u8; 32] = [1; 32]; + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), amendment_name.len()) }, + 1, + "amendment_enabled", + ); + check_result( + unsafe { host::amendment_enabled(amendment_id.as_ptr(), amendment_id.len()) }, + 1, + "amendment_enabled", + ); + let tx: EscrowFinish = get_current_escrow_finish(); + let account = tx.get_account().unwrap_or_panic(); // get_tx_field under the hood + let keylet = keylets::account_keylet(&account).unwrap_or_panic(); // account_keylet under the hood + check_result( + unsafe { host::cache_ledger_obj(keylet.as_ptr(), keylet.len(), 0) }, + 1, + "cache_ledger_obj", + ); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(sfield::Account, ptr, len) }, + 20, + "get_current_ledger_obj_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, sfield::Account, ptr, len) }, + 20, + "get_ledger_obj_field", + ); + }); + let mut locator = Locator::new(); + locator.pack(sfield::Account); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), locator.len(), ptr, len) }, + 20, + "get_tx_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_current_ledger_obj_nested_field", + ); + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_ledger_obj_nested_field(1, locator.as_ptr(), locator.len(), ptr, len) + }, + 20, + "get_ledger_obj_nested_field", + ); + }); + check_result( + unsafe { host::get_tx_array_len(sfield::Memos) }, + 32, + "get_tx_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(sfield::Memos) }, + 32, + "get_current_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, sfield::Memos) }, + 32, + "get_ledger_obj_array_len", + ); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_tx_nested_array_len", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), locator.len()) }, + 32, + "get_current_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), locator.len()) }, + 32, + "get_ledger_obj_nested_array_len", + ); + check_result( + unsafe { host::update_data(account.0.as_ptr(), account.0.len()) }, + 0, + "update_data", + ); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), locator.len(), ptr, len) }, + 32, + "compute_sha512_half", + ); + }); + let message: &[u8] = b"test message"; + let pubkey: &[u8] = b"test pubkey"; //tx.get_public_key().unwrap_or_panic(); + let signature: &[u8] = b"test signature"; + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + 1, + "check_sig", + ); + + let nft_id: [u8; 32] = amendment_id; + with_buffer::<18, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + nft_id.as_ptr(), + nft_id.len(), + ptr, + len, + ) + }, + 18, + "get_nft", + ) + }); + with_buffer::<20, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 20, + "get_nft_issuer", + ) + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_taxon", + ) + }); + check_result( + unsafe { host::get_nft_flags(nft_id.as_ptr(), nft_id.len()) }, + 8, + "get_nft_flags", + ); + check_result( + unsafe { host::get_nft_transfer_fee(nft_id.as_ptr(), nft_id.len()) }, + 10, + "get_nft_transfer_fee", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(nft_id.as_ptr(), nft_id.len(), ptr, len) }, + 4, + "get_nft_serial", + ) + }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); + + // ######################################## + // Step #2: Test set_data edge cases + // ######################################## + check_result( + unsafe { host_bindings_loose::get_parent_ledger_hash(-1, 4) }, + error_codes::INVALID_PARAMS, + "get_parent_ledger_hash_neg_ptr", + ); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_parent_ledger_hash_neg_len", + ) + }); + with_buffer::<3, _, _>(|ptr, len| { + check_result( + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, len as i32) }, + error_codes::BUFFER_TOO_SMALL, + "get_parent_ledger_hash_buf_too_small", + ) + }); + with_buffer::<4, _, _>(|ptr, _len| { + check_result( + unsafe { host_bindings_loose::get_parent_ledger_hash(ptr as i32, 1_000_000_000) }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_parent_ledger_hash_len_too_long", + ) + }); + let message = "testing trace"; + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 47, + "trace_account", + ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 19, + "trace_amount", + ); + + // ######################################## + // Step #3: Test getData[Type] edge cases + // ######################################## + + // SField + check_result( + unsafe { host::get_tx_array_len(2) }, // not a valid SField value + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + + // Slice + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(-1, locator.len() as i32) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_ptr", + ); + check_result( + unsafe { host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, -1) }, + error_codes::INVALID_PARAMS, + "get_tx_nested_array_len_neg_len", + ); + let long_len = 4 * 1024 + 1; + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, long_len as i32) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_long", + ); + check_result( + unsafe { + host_bindings_loose::get_tx_nested_array_len( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "get_tx_nested_array_len_ptr_oob", + ); + + // uint256 + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 1, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "cache_ledger_obj_ptr_oob", + ); + check_result( + unsafe { + host_bindings_loose::cache_ledger_obj(locator.as_ptr() as i32, locator.len() as i32, 1) + }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_len", + ); + + // AccountID + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "account_keylet_len_oob", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::account_keylet( + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_len", + ) + }); + + // Currency + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "line_keylet_len_oob_currency", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::line_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_len_currency", + ) + }); + + // Asset + let asset1_bytes = Asset::XRP(XrpAsset {}).as_bytes(); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "amm_keylet_len_oob_asset2", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + locator.as_ptr() as i32, + locator.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_len_asset2", + ) + }); + let currency: &[u8] = b"USD00000000000000000"; // 20 bytes + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host_bindings_loose::amm_keylet( + asset1_bytes.as_ptr(), + asset1_bytes.len(), + currency.as_ptr() as i32, + currency.len() as i32, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_non_xrp_currency_len", + ) + }); + let mptid = MptId::new(1, account); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + mptid.as_ptr(), + mptid.len(), + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_mpt", + ) + }); + + // string + check_result( + unsafe { + host_bindings_loose::trace_num( + locator.as_ptr() as i32 + 1_000_000_000, + locator.len() as i32, + 42, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_num_oob_str", + ); + + // ######################################## + // Step #4: Test other host function edge cases + // ######################################## + + // invalid SFields + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_tx_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_current_ledger_obj_field(2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_field_invalid_sfield", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_field(1, 2, ptr, len) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_field_invalid_sfield", + ); + }); + check_result( + unsafe { host::get_tx_array_len(2) }, + error_codes::INVALID_FIELD, + "get_tx_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_current_ledger_obj_array_len(2) }, + error_codes::INVALID_FIELD, + "get_current_ledger_obj_array_len_invalid_sfield", + ); + check_result( + unsafe { host::get_ledger_obj_array_len(1, 2) }, + error_codes::INVALID_FIELD, + "get_ledger_obj_array_len_invalid_sfield", + ); + + // invalid Slice + + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled_too_big_slice", + ); + check_result( + unsafe { host::amendment_enabled(amendment_name.as_ptr(), 65) }, + error_codes::DATA_FIELD_TOO_LARGE, + "amendment_enabled_too_long", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_tx_nested_field(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_current_ledger_obj_nested_field(locator.as_ptr(), long_len, ptr, len) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_field_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_obj_nested_field(1, locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_field_too_big_slice", + ); + }); + check_result( + unsafe { host::get_tx_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_tx_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_current_ledger_obj_nested_array_len(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_current_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::get_ledger_obj_nested_array_len(1, locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "get_ledger_obj_nested_array_len_too_big_slice", + ); + check_result( + unsafe { host::update_data(locator.as_ptr(), long_len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "update_data_too_big_slice", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + long_len, + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + long_len, + signature.as_ptr(), + signature.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + check_result( + unsafe { + host::check_sig( + message.as_ptr(), + message.len(), + pubkey.as_ptr(), + pubkey.len(), + signature.as_ptr(), + long_len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "check_sig", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::compute_sha512_half(locator.as_ptr(), long_len, ptr, len) }, + error_codes::DATA_FIELD_TOO_LARGE, + "compute_sha512_half_too_big_slice", + ); + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + asset1_bytes.as_ptr(), + long_len, + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "amm_keylet_too_big_slice", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + long_len, + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "credential_keylet_too_big_slice", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "mptoken_keylet_too_big_slice_mptid", + ) + }); + check_result( + unsafe { + host::trace( + message.as_ptr(), + message.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_oob_slice", + ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_slice", + ); + + // invalid UInt256 + + check_result( + unsafe { host::cache_ledger_obj(locator.as_ptr(), locator.len(), 0) }, + error_codes::INVALID_PARAMS, + "cache_ledger_obj_wrong_size_uint256", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_issuer(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_issuer_wrong_size_uint256", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_taxon(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_taxon_wrong_size_uint256", + ) + }); + check_result( + unsafe { host::get_nft_flags(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_flags_wrong_size_uint256", + ); + check_result( + unsafe { host::get_nft_transfer_fee(locator.as_ptr(), locator.len()) }, + error_codes::INVALID_PARAMS, + "get_nft_transfer_fee_wrong_size_uint256", + ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_nft_serial(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "get_nft_serial_wrong_size_uint256", + ) + }); + + // invalid AccountID + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::account_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "account_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::check_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "check_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::credential_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + locator.as_ptr(), // valid slice size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "credential_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::delegate_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "delegate_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::deposit_preauth_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "deposit_preauth_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::did_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "did_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::escrow_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "escrow_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::line_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + currency.as_ptr(), + currency.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "line_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::mpt_issuance_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "mpt_issuance_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + mptid.as_ptr(), + mptid.len(), + locator.as_ptr(), + locator.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "nft_offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "offer_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::oracle_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "oracle_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + locator.as_ptr(), // invalid AccountID size + locator.len(), + account.0.as_ptr(), + account.0.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr(), // invalid AccountID size + locator.len(), + 1, + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_accountid2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::permissioned_domain_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) + }, + error_codes::INVALID_PARAMS, + "permissioned_domain_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, + error_codes::INVALID_PARAMS, + "signers_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::ticket_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "ticket_keylet_wrong_size_accountid", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { host::vault_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + error_codes::INVALID_PARAMS, + "vault_keylet_wrong_size_accountid", + ) + }); + let uint256: &[u8] = b"00000000000000000000000000000001"; + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::get_nft( + locator.as_ptr(), + locator.len(), + uint256.as_ptr(), + uint256.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "get_nft_wrong_size_accountid", + ) + }); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_account_wrong_size_accountid", + ); + + // invalid Currency was already tested above + // invalid string + + check_result( + unsafe { + host::trace( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + uint256.as_ptr(), + uint256.len(), + 0, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_oob_string", + ); + check_result( + unsafe { + host::trace_account( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_account_oob_string", + ); + check_result( + unsafe { + host::trace_amount( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_amount_oob_string", + ); + + // trace too large + + check_result( + unsafe { + host::trace( + locator.as_ptr(), + locator.len(), + locator.as_ptr(), + long_len, + 0, + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_too_long", + ); + check_result( + unsafe { host::trace_num(locator.as_ptr(), long_len, 1) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_num_too_long", + ); + check_result( + unsafe { + host::trace_account( + message.as_ptr(), + long_len, + account.0.as_ptr(), + account.0.len(), + ) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + check_result( + unsafe { host::trace_amount(message.as_ptr(), long_len, amount.as_ptr(), amount.len()) }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_account_too_long", + ); + + // trace amount errors + + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + ) + }, + error_codes::INVALID_PARAMS, + "trace_amount_wrong_length", + ); + + // other misc errors + + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::mptoken_keylet( + locator.as_ptr(), + locator.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mptoken_keylet_mptid_wrong_length", + ) + }); + + 1 // <-- If we get here, finish the escrow. +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py new file mode 100644 index 00000000000..eb1b6d0f9ec --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py @@ -0,0 +1,134 @@ +import os +import sys +import subprocess +import re + +OPT = "-Oz" + + +def update_fixture(project_name, wasm): + fixture_name = ( + re.sub(r"_([a-z])", lambda m: m.group(1).upper(), project_name) + "WasmHex" + ) + print(f"Updating fixture: {fixture_name}") + + cpp_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.cpp")) + h_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "fixtures.h")) + with open(cpp_path, "r", encoding="utf8") as f: + cpp_content = f.read() + + pattern = rf'extern std::string const {fixture_name} =[ \n]+"[^;]*;' + if re.search(pattern, cpp_content, flags=re.MULTILINE): + updated_cpp_content = re.sub( + pattern, + f'extern std::string const {fixture_name} = "{wasm}";', + cpp_content, + flags=re.MULTILINE, + ) + else: + with open(h_path, "r", encoding="utf8") as f: + h_content = f.read() + updated_h_content = ( + h_content.rstrip() + f"\n\n extern std::string const {fixture_name};\n" + ) + with open(h_path, "w", encoding="utf8") as f: + f.write(updated_h_content) + updated_cpp_content = ( + cpp_content.rstrip() + + f'\n\nextern std::string const {fixture_name} = "{wasm}";\n' + ) + + with open(cpp_path, "w", encoding="utf8") as f: + f.write(updated_cpp_content) + + +def process_rust(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), project_name) + ) + wasm_location = f"target/wasm32-unknown-unknown/release/{project_name}.wasm" + build_cmd = ( + f"(cd {project_path} " + f"&& cargo build --target wasm32-unknown-unknown --release " + f"&& wasm-opt {wasm_location} {OPT} -o {wasm_location}" + ")" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print(f"WASM file for {project_name} has been built and optimized.") + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + src_path = os.path.abspath( + os.path.join( + os.path.dirname(__file__), + f"{project_name}/target/wasm32-unknown-unknown/release/{project_name}.wasm", + ) + ) + with open(src_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +def process_c(project_name): + project_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.c") + ) + wasm_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), f"{project_name}.wasm") + ) + build_cmd = ( + f"$CC --sysroot=$SYSROOT -I$SYSROOT/include/wasm32-wasi " + f"-O3 -ffast-math --target=wasm32 -fno-exceptions -fno-threadsafe-statics -fvisibility=default -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -DNDEBUG --no-standard-libraries -fno-builtin-memset " + f"-o {wasm_path} {project_path}" + f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" + ) + try: + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") + print( + f"WASM file for {project_name} has been built with WASI support using clang." + ) + except subprocess.CalledProcessError as e: + print(f"exec error: {e}") + sys.exit(1) + + with open(wasm_path, "rb") as f: + data = f.read() + wasm = data.hex() + update_fixture(project_name, wasm) + + +if __name__ == "__main__": + if len(sys.argv) > 2: + print("Usage: python copyFixtures.py []") + sys.exit(1) + if len(sys.argv) == 2: + if os.path.isdir(os.path.join(os.path.dirname(__file__), sys.argv[1])): + process_rust(sys.argv[1]) + else: + process_c(sys.argv[1]) + print("Fixture has been processed.") + else: + dirs = [ + d + for d in os.listdir(os.path.dirname(__file__)) + if os.path.isdir(os.path.join(os.path.dirname(__file__), d)) + ] + c_files = [f for f in os.listdir(os.path.dirname(__file__)) if f.endswith(".c")] + for d in dirs: + process_rust(d) + for c in c_files: + process_c(c[:-2]) + print("All fixtures have been processed.") diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat b/src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat new file mode 100644 index 00000000000..035a849e30d --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat @@ -0,0 +1,34 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (result i32))) + (func (;0;) (type 0)) + (func (;1;) (type 1) (result i32) + f32.const -2048 + f32.const 2050 + f32.sub + drop + i32.const 1) + (memory (;0;) 2) + (global (;0;) i32 (i32.const 1024)) + (global (;1;) i32 (i32.const 1024)) + (global (;2;) i32 (i32.const 2048)) + (global (;3;) i32 (i32.const 2048)) + (global (;4;) i32 (i32.const 67584)) + (global (;5;) i32 (i32.const 1024)) + (global (;6;) i32 (i32.const 67584)) + (global (;7;) i32 (i32.const 131072)) + (global (;8;) i32 (i32.const 0)) + (global (;9;) i32 (i32.const 1)) + (export "memory" (memory 0)) + (export "__wasm_call_ctors" (func 0)) + (export "finish" (func 1)) + (export "buf" (global 0)) + (export "__dso_handle" (global 1)) + (export "__data_end" (global 2)) + (export "__stack_low" (global 3)) + (export "__stack_high" (global 4)) + (export "__global_base" (global 5)) + (export "__heap_base" (global 6)) + (export "__heap_end" (global 7)) + (export "__memory_base" (global 8)) + (export "__table_base" (global 9))) diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fib.c b/src/test/app/wasm_fixtures/wasm_fixtures/fib.c new file mode 100644 index 00000000000..4410923054f --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/fib.c @@ -0,0 +1,12 @@ +// typedef long long mint; +typedef int mint; + +mint +fib(mint n) +{ + if (!n) + return 0; + if (n <= 2) + return 1; + return fib(n - 1) + fib(n - 2); +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp new file mode 100644 index 00000000000..ec91496428c --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp @@ -0,0 +1,10330 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const fibWasmHex = + "0061736d0100000001090260000060017f017f0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017f200045044041000f0b2000410348044041010f0b200041026a2100" + "0340200041036b100120016a2101200041026b220041044a0d000b200141" + "016a0b"; + +extern std::string const b58WasmHex = + "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" + "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" + "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" + "617465000106655f6461746103000a6465616c6c6f636174650002076235" + "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" + "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" + "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" + "200220066a2d00000d012003200641016a2206470d000b200321060b2003" + "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" + "480d00200741016a220a410771210541002104200741074f0440200a41f8" + "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" + "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" + "200541016b22050d000b0b200320064a0440200621052007210403402002" + "20056a2d0000210802402004220a20074e0440200721042008450d010b20" + "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" + "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" + "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" + "200741016a22022103410021040240200c4100480d000340200420096a2d" + "00000d012002200441016a2204470d000b200221040b2001200320066a20" + "046b4a047f02402006450d002006410771210841002105200641084f0440" + "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" + "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" + "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" + "0420076a410171047f200405200020066a200420096a2d00004180086a2d" + "00003a0000200641016a2106200441016a0b210520042007460d00200520" + "096a2101200720056b2102200020066a2103417f21040340200320046a22" + "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" + "026a200541026a2d00004180086a2d00003a00002002200441026a220447" + "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" + "41000b0b0b4101004180080b3a3132333435363738394142434445464748" + "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" + "707172737475767778797a00490f7461726765745f666561747572657304" + "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const sha512PureWasmHex = + "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" + "05040001020305030100020607017f0041800d0b075006066d656d6f7279" + "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" + "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" + "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" + "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" + "06211620014180016d41016bac210b41808d02290300210c41888d022903" + "00210d41908d02290300210e41988d02290300210f41a08d022903002110" + "41a88d02290300211141b08d02290300211241b88d022903002113034041" + "002101200c21092013210a201221082011210520102103200f2115200e21" + "06200d2102034020022107200120166a200020016a290000220242388620" + "024280fe0383422886842002428080fc0783421886200242808080f80f83" + "4208868484200242088842808080f80f832002421888428080fc07838420" + "024228884280fe03832002423888848484220237030020014180086a2903" + "00200a200322044232892004422e89852004421789857c2008220a200442" + "7f858320052208200483847c7c20027c2203200922024224892002421e89" + "85200242198985200220072006221485832006200783857c7c2109200320" + "157c2103200421052006211520072106200141086a2201418001470d000b" + "200020016a21004180092117411e210103402002210620162001410e6b41" + "0f714103746a221820182903002016200141056b410f714103746a290300" + "20162001410d6b410f714103746a2903002202423f892002423889852002" + "420788857c7c20162001410f714103746a2903002202422d892002420389" + "852002420688857c22023703002017290300200a20032205423289200542" + "2e89852005421789857c2005427f852008832004200583847c7c20027c22" + "03200922024224892002421e898520024219898520022006200785832006" + "200783857c7c2109200320147c2103201741086a21172008210a20042108" + "200521042007211420062107200141016a220141de00470d000b41b88d02" + "200a20137c221337030041b08d02200820127c221237030041a88d022004" + "20117c221137030041a08d02200320107c221037030041988d02200f2014" + "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" + "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" + "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" + "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" + "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" + "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" + "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" + "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" + "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" + "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" + "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" + "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" + "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" + "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" + "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" + "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" + "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" + "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" + "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" + "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" + "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" + "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" + "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" + "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" + "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" + "7065732b0a6d756c746976616c7565"; + +extern std::string const zkProofWasmHex = + "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" + "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" + "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" + "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" + "030505030206020601000006010606070303080202020302090208020202" + "030a0806020a030b06060202030302020303030203030203020202010302" + "030203060a02000202080a020c0807010d02030206060102020803080302" + "030202020a02060303020a03020301010a0d030101010001010301020604" + "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" + "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" + "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" + "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" + "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" + "4020010d00410021010c010b2002450d01200120026e2203200320026c20" + "01476a21010b2000200136020820004101360204200020013602000f0b10" + "8180808000000b4701017f23808080800041206b22002480808080002000" + "41003602182000410136020c200041e090c0800036020820004204370210" + "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" + "808080000b170002402000450d002001200020026c108d808080000b0b0e" + "002000200141011083808080000b0f002000200141a0021083808080000b" + "0e002000200141201083808080000b4201017f0240200028020822032000" + "280200470d00200020021088808080000b2000280204200341e8006c6a20" + "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" + "800041106b2202248080808000200241086a20002000280200410141e800" + "108b80808000024020022802082200418180808078460d00200020022802" + "0c2001108c80808000000b200241106a2480808080000b6401027f238080" + "80800041106b2203248080808000200341086a20024101410141f081c080" + "00108a8080800020032802082104200328020c2001200210868180800021" + "01200020023602082000200136020420002004360200200341106a248080" + "8080000b6401017f23808080800041106b2205248080808000200541046a" + "200120022003108e8080800020052802082103024020052802040d002000" + "200528020c36020420002003360200200541106a2480808080000f0b2003" + "200528020c2004108c80808000000bfd0102037f017e2380808080004110" + "6b22052480808080004100210602400240200220036a22032002490d0020" + "0441076a417871ad2001280200220741017422022003200220034b1b2202" + "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" + "074b0d01024002402007450d00024020040d00200541086a4108200210d7" + "80808000200528020821040c020b2001280204200720046c200210cb8080" + "800021040c010b20054108200210d780808000200528020021040b024020" + "040d00410821060c020b2001200336020020012004360204418180808078" + "21060b0b2000200236020420002006360200200541106a2480808080000b" + "1200024020000d00200210cf808080000b000b6c01027f02400240200041" + "7c6a2802002202417871220341044108200241037122021b20016a490d00" + "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" + "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" + "10ca80808000000bc70103017f017e017f23808080800041106b22042480" + "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" + "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" + "200236020841002102200041003602040c020b200441086a2002200310d7" + "80808000024020042802082206450d002000200636020820002001360204" + "410021020c020b2000200336020820002002360204410121020c010b2000" + "4100360204410121020b20002002360200200441106a2480808080000b88" + "0303017f097e017f23808080800041306b22022480808080002002420042" + "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" + "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" + "20012903482209842001290350220a842001290358220b8450220c1b3703" + "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" + "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" + "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" + "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" + "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" + "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" + "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" + "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" + "80808000200020014130108681808000200c3a0060200241306a24808080" + "80000b9e0101027e20002002290328200129032822048542002003ad42ff" + "01837d220583200485370328200020022903202001290320220485200583" + "200485370320200020022903182001290318220485200583200485370318" + "200020022903102001290310220485200583200485370310200020022903" + "082001290308220485200583200485370308200020022903002001290300" + "2204852005832004853703000bec0201057f23808080800041c0006b2202" + "248080808000410121030240200128021c2204418082c080004111200128" + "0220220528020c220611808080800080808080000d000240024020012d00" + "144104710d0041012103200441fa8ec08000410120061180808080008080" + "8080000d02200141e091c080004102109280808000450d010c020b200441" + "fb8ec080004102200611808080800080808080000d014101210320024101" + "3a0017200241186a41086a200141086a290200370300200241186a41106a" + "200141106a290200370300200241186a41186a200141186a280200360200" + "2002200536020c20022004360208200241dc8ec080003602382002200129" + "02003703182002200241176a3602102002200241086a360234200241186a" + "41e091c0800041021092808080000d01200241086a41f88ec08000410210" + "93808080000d010b200441ec8cc080004101200611808080800080808080" + "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" + "200028020022032000280208220472450d0002402004410171450d002001" + "20026a210502400240200028020c22060d0041002107200121080c010b41" + "00210741002109200121080340200822042005460d020240024020042c00" + "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" + "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" + "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" + "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" + "2007450d00024020072002490d0020072002460d01410021040c020b2001" + "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" + "21022004200120041b21010b024020030d00200028021c20012002200028" + "022028020c11808080800080808080000f0b2000280204210a0240200241" + "10490d0020022001200141036a417c7122076b22096a220b410371210341" + "00210641002104024020012007460d004100210402402009417c4b0d0041" + "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" + "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" + "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" + "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" + "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" + "4a6a21060b200b4102762105200620046a21060340200721032005450d04" + "200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002003200d41f007716a210941002108200321040340" + "200428020c2207417f734107762007410676724181828408712004280208" + "2207417f7341077620074106767241818284087120042802042207417f73" + "41077620074106767241818284087120042802002207417f734107762007" + "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" + "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" + "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" + "fc01714102746a22082802002204417f7341077620044106767241818284" + "08712104200c4101460d0220082802042207417f73410776200741067672" + "41818284087120046a2104200c4102460d0220082802082208417f734107" + "7620084106767241818284087120046a21040c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d004100210641002109" + "0c010b41002106200121042002410c71220921070340200620042c000041" + "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" + "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" + "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" + "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" + "200028022028020c11808080800080808080000f0b200441087641ff811c" + "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" + "20064d0d00200a20066b2105024002400240410020002d00182204200441" + "03461b22040e03020001020b20052104410021050c010b20054101762104" + "200541016a41017621050b200441016a2104200028021021092000280220" + "2108200028021c210703402004417f6a2204450d02200720092008280210" + "1181808080008080808000450d000b41010f0b200028021c200120022000" + "28022028020c11808080800080808080000f0b0240200720012002200828" + "020c1180808080008080808000450d0041010f0b41002104034002402005" + "2004470d0020052005490f0b200441016a21042007200920082802101181" + "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" + "7f6a21032000280204210420002802002105200028020821064100210741" + "002108410021094100210a02400340200a4101710d010240024020092002" + "4b0d000340200120096a210a0240024002400240200220096b220b41074b" + "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" + "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" + "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" + "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" + "828408200c41046a2802002200418a94a8d000736b200072714180818284" + "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" + "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" + "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" + "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" + "0000410a460d01200b200041016a2200470d000b200221090c030b200020" + "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" + "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" + "000b0b20082002460d024101210a2008210d200221000b0240024020062d" + "0000450d00200541f48ec080004104200428020c11808080800080808080" + "000d010b200020086b210b4100210c024020002008460d00200320006a2d" + "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" + "200b200428020c1180808080008080808000450d010b0b410121070b2007" + "0ba80101017f23808080800041306b220424808080800020042003360208" + "20042002360204200420012d00c80122033a000f024020034101460d0020" + "04420137021c200441013602142004419482c08000360210200441818080" + "800036022c2004200441286a3602182004200441046a3602282004410f6a" + "41c886c08000200441106a419c82c08000109680808000000b2000200141" + "c8011086818080001a200441306a2480808080000b140020012000280200" + "20002802041092808080000b4401017f23808080800041106b2204248080" + "8080002004200136020c20042000360208200441086a41b886c080002004" + "410c6a41b886c080002002200310d380808000000ba70101017f23808080" + "800041306b22042480808080002004200336020820042002360204200420" + "012d006822033a000f024020034101460d002004420137021c2004410136" + "02142004419482c08000360210200441818080800036022c200420044128" + "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" + "419c82c08000109680808000000b2000200141e8001086818080001a2004" + "41306a2480808080000b45000240024020042003490d0020022004490d01" + "2000200420036b3602042000200120036a3602000f0b2003200420051099" + "80808000000b200420022005109a80808000000b0f0020002001200210fc" + "80808000000b0f0020002001200210f580808000000b4001017f23808080" + "800041106b2201248080808000200141086a200041014101419883c08000" + "108a80808000200128020c2100200141106a24808080800020000b9a0101" + "017f23808080800041b0016b2202248080808000200241086a2001280204" + "20012802084100413041a883c080001098808080000240200228020c4130" + "460d00200241106a41b883c08000109d80808000000b20024180016a2002" + "28020841301089818080001a200241106a20024180016a109e8080800020" + "00200241106a41c883c080004118109780808000200241b0016a24808080" + "80000b970101017f23808080800041c0006b22022480808080002002412b" + "36020c200241f880c08000360208200241e880c080003602142002200036" + "02102002410236021c200241cc8ec0800036021820024202370224200241" + "8280808000ad422086200241106aad843703382002418380808000ad4220" + "86200241086aad843703302002200241306a360220200241186a200110a4" + "80808000000ba50801077f23808080800041c0086b220224808080800020" + "012d0000220341077610a3808080002104200341067641017110a3808080" + "002105200341057641017110a3808080002106200241a0066a2001413010" + "86818080001a200220022d00a006411f713a00a006200241e8006a200241" + "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" + "026a200241b0076a200241e8006a20022d00980122071090808080002002" + "4190056a10a8808080002002200520047110a380808000200610d2808080" + "007110a380808000200241c0026a10a9808080007110a38080800022013a" + "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" + "0020024180046a200241a0066a200241c0026a10a780808000200241e007" + "6a20024180046a418089c0800010b98080800020024180046a200241e007" + "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" + "00200241a0066a200241e0076a10db808080002103200241f0026a200241" + "80046a41301086818080001a200220033a00a00320024100413010858180" + "800022024190086a2002200241f0026a2003109080808000200241a0066a" + "20024190086a10b28080800020024180046a41306a20024190086a200241" + "a0066a200620024190086a10de808080007310a380808000109080808000" + "20024180046a200241c0026a41301086818080001a20032004200510d280" + "8080007110a3808080007110a3808080002103200241a0066a2002418004" + "6a41e0001086818080001a200220033a008807200220053a008007200241" + "d0016a20024190056a200241a0066a200810aa8080800020022007200120" + "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" + "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" + "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" + "8080800020024180046a20024190056a10e480808000200241f0026a2002" + "4180046a10e58080800020024190056a200241e8001086818080001a2002" + "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" + "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" + "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" + "8080800020024190086a200241f0026a41306a200510a780808000200241" + "80046a200241a0066a41306a200110a7808080002003200110a980808000" + "2201200510a98080800022057110a380808000200110d280808000200510" + "d2808080007110a380808000200241b0076a200241e0076a10db80808000" + "7110a38080800020024190086a20024180046a10db808080007110a38080" + "80007210a3808080007110a38080800021052000200241e8001086818080" + "0020053a0068200241c0086a2480808080000b970101017f238080808000" + "41c0026b2203248080808000200341086a20012002410041e00041e083c0" + "80001098808080000240200328020c41e000460d00200341106a41f083c0" + "8000109d80808000000b200341e0016a200328020841e000108981808000" + "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" + "004118109480808000200341c0026a2480808080000bff1d02137f017e23" + "808080800041a0276b220224808080800020012d0000220341077610a380" + "8080002104200341067641017110a3808080002105200341057641017110" + "a380808000210620024180106a200141301086818080001a200220022d00" + "8010411f713a008010200241a0216a20024180106a10dc80808000200241" + "80226a200141306a10dc80808000200241e01f6a41004130108581808000" + "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" + "80800020022d00b0222101200241c0206a410041301085818080001a2002" + "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" + "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" + "2002200520047110a380808000200610d2808080007110a3808080002002" + "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" + "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" + "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" + "c0800010bc80808000200241c0236a10e08080800021032002410041e000" + "108581808000220220033a0060200310d2808080002109200241a0246a20" + "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" + "ba8080800020024180256a20024180106a200241c0236a10b38080800020" + "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" + "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" + "30108681808000210a200241d0016a41306a410041301085818080001a20" + "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" + "016a10e28080800020024180256a200241c0266a10c28080800021032002" + "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" + "10d280808000210b200a41004130108581808000210320024180106a41e0" + "86c0800041301086818080001a20024180076a20024180256a2002418010" + "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" + "0020024180106a20024198036a200241e0256a10b3808080002002410110" + "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" + "da80808000200241c00b6a410041e0001085818080001a20024198036a20" + "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" + "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" + "8080007110a380808000210a20024180106a20024198036a41e000108681" + "8080001a2002200a3a00e01020024180076a200220024180106a200910da" + "808080002002410041e00010858180800022024198036a20022002418007" + "6a20022d00e007220910b08080800020024180106a20024198036a10e280" + "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" + "024198036a41306a220a10de80808000200a10a98080800020024198036a" + "10de808080007110a3808080007210a3808080007310a38080800010b080" + "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" + "0510d2808080007110a3808080007110a380808000210420024180106a20" + "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" + "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" + "0420022d00a80f220573410020086b712005737110a38080800021012002" + "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" + "6a280000360000200220022800890d3600c9012002200120077110a38080" + "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" + "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" + "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" + "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" + "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" + "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" + "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" + "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" + "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" + "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" + "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" + "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" + "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" + "4180106a200241e0046a41301086818080001a20024180076a2002418010" + "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" + "80106a200241e0046a41e0006a220141301086818080001a20024180076a" + "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" + "066a10b28080800020024180106a200241e0046a41c0016a220541301086" + "818080001a20024180076a41c0016a20024180106a41e000108681808000" + "210e2003410041301085818080001a20024180106a41e086c08000413010" + "86818080001a200241a0096a410041e0001085818080001a200241a0096a" + "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" + "6a410041e000108581808000210a200241c0266a41306a210f2002418010" + "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" + "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" + "8080a080e9002115024003402015500d01200241e0196a200110ba808080" + "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" + "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" + "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" + "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" + "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" + "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" + "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" + "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" + "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" + "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" + "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" + "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" + "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" + "0241a0246a41e00010868180800021082014200241c0206a41e000108681" + "8080002107200f410041301085818080001a200241c0266a41e086c08000" + "41301086818080001a20024180106a410041e0001085818080001a201020" + "0241c0266a41e00010868180800021042012410041e00010858180800021" + "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" + "b080808000200b20082004200310b080808000201320072006200310b080" + "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" + "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" + "024180136a2009200110b380808000200241e0136a200a200510b3808080" + "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" + "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" + "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" + "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" + "09200a10bc8080800020024180196a2001200510bc80808000200241e019" + "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" + "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" + "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" + "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" + "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" + "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" + "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" + "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" + "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" + "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" + "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" + "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" + "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" + "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" + "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" + "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" + "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" + "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" + "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" + "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" + "818080001a20024180106a200241a0096a41e0001086818080001a200241" + "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" + "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" + "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" + "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" + "0110e08080800022017110a380808000200510d280808000200110d28080" + "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" + "80808000200241e00d6a20024180106a10c2808080007110a38080800072" + "10a380808000200c7110a38080800021012000200241d0016a41c8011086" + "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" + "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" + "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" + "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" + "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" + "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" + "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" + "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" + "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" + "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" + "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" + "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" + "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" + "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" + "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" + "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" + "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" + "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" + "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" + "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" + "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" + "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" + "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" + "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" + "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" + "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" + "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" + "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" + "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" + "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" + "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" + "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" + "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" + "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" + "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" + "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" + "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" + "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" + "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" + "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" + "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" + "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" + "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" + "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" + "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" + "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" + "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" + "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" + "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" + "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" + "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" + "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" + "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" + "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" + "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" + "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" + "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" + "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" + "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" + "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" + "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" + "066a41e0006a41e000108980808000200041980f6a20002802900f200028" + "02940f109f80808000200041e4106a2000419c086a41e000108980808000" + "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" + "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" + "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" + "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" + "900110898080800020004194156a41086a22014100360200200042808080" + "80800137029415200041d0066a200028028c152202200028029015220341" + "004130418084c08000109880808000200041a0156a20002802d006200028" + "02d406108980808000200041b0156a200041a0156a109c80808000200041" + "94156a200041b0156a419084c08000108780808000200041c8066a200220" + "03413041e00041a084c08000109880808000200041b0156a20002802c806" + "20002802cc0610898080800020002802a01520002802a415108480808000" + "200041a0156a41086a2204200041b0156a41086a22052802003602002000" + "20002902b0153703a015200041b0156a200041a0156a109c808080002000" + "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" + "200341e00041900141c084c08000109880808000200041b0156a20002802" + "c00620002802c40610898080800020002802a01520002802a41510848080" + "800020042005280200360200200020002902b0153703a015200041b0156a" + "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" + "108780808000200041c81c6a200128020036020020002000290294153703" + "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" + "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" + "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" + "818080002107200041901a6a200041c8126a41e8001086818080001a2000" + "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" + "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" + "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" + "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" + "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" + "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" + "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" + "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" + "0002400240024002400240024020002802a4684101470d00200041b8066a" + "20002802a8684108412041d880c08000108a80808000200041003602c85b" + "200020002802bc0622033602c45b200020002802b80622023602c05b2000" + "41f8326a41c0004120108080808000024020002802fc324101470d004100" + "21050240200220002802803322014f0d00200041b0066a200041c0db006a" + "410020014120108b8080800020002802b0062202418180808078470d0520" + "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" + "746a210341c000210103402001450d03200041b0046a2002290000220942" + "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" + "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" + "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" + "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" + "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" + "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" + "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" + "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" + "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" + "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" + "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" + "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" + "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" + "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" + "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" + "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" + "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" + "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" + "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" + "00420010878180800020004180046a20002903f005220f20002903c00422" + "10200041b0046a41086a2903007c22117c22122000290390047c22132000" + "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" + "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" + "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" + "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" + "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" + "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" + "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" + "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" + "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" + "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" + "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" + "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" + "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" + "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" + "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" + "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" + "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" + "2903e0047c220f2000290390067c221420004180066a41086a2903002011" + "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" + "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" + "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" + "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" + "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" + "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" + "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" + "8000200041d0036a41086a290300211d20004180056a41086a290300211e" + "200041d0056a41086a290300211f200041a0066a41086a29030021202000" + "2903e00521212000290390052122200029038003212320004180036a4108" + "6a290300212420004190036a41086a290300212520004190056a41086a29" + "03002126200041e0056a41086a290300212720002903a005212820002903" + "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" + "026a41086a290300212c200020002903d002222d200041e0046a41086a29" + "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" + "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" + "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" + "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" + "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" + "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" + "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" + "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" + "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" + "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" + "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" + "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" + "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" + "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" + "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" + "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" + "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" + "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" + "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" + "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" + "41f8326a10a28080800020002903a068210e20002903a868211220002903" + "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" + "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" + "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" + "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" + "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" + "0021042000411836028457200041a585c0800036028057200020043a00c0" + "52200441ff01714101470d04200341186a200d370300200341106a201337" + "0300200341086a20123703002003200e370300200341206a210320054101" + "6a210520022001412020014120491b22046a2102200120046b21010c000b" + "0b2000410036028833200041013602fc32200041d085c080003602f83220" + "00420437028033200041f8326a41d880c0800010a480808000000b200041" + "0036028833200041013602fc32200041d085c080003602f8322000420437" + "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" + "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" + "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" + "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" + "6a2134200041a0dc006a2135410021040340024020042005470d00200041" + "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" + "410041301085818080001a200041c0db006a200041a0e8006a200041f832" + "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" + "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" + "41c0db006a10a7808080002000410010a3808080003a008069200041f832" + "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" + "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" + "80800020004188256a200710ab8080800020004198256a200810ab808080" + "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" + "808000200041c0376a200041801f6a108f80808000200041803c6a200041" + "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" + "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" + "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" + "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" + "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" + "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" + "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" + "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" + "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" + "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" + "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" + "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" + "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" + "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" + "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" + "64410374210120002802c064210320002802c8642130024003402001450d" + "01200328020422042d000c20032802002d00607210a38080800021022000" + "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" + "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" + "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" + "10b0808080002037203a2039200210b08080800020004180d7006a203120" + "08200210b080808000203420072006200210b08080800020332032203520" + "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" + "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" + "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" + "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" + "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" + "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" + "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" + "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" + "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" + "41301086818080001a200041c0db006a41306a2201200041b8256a419001" + "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" + "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" + "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" + "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" + "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" + "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" + "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" + "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" + "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" + "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" + "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" + "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" + "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" + "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" + "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" + "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" + "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" + "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" + "41e0036a41301086818080001a200041f8326a410041301085818080001a" + "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" + "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" + "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" + "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" + "0041f8326a10b3808080002005410041301085818080002133200042ba8a" + "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" + "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" + "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" + "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" + "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" + "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" + "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" + "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" + "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" + "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" + "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" + "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" + "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" + "b28080800020004180ce006a200041f8326a41301086818080001a200041" + "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" + "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" + "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" + "41301086818080001a200041a0e8006a410041301085818080001a200042" + "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" + "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" + "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" + "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" + "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" + "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" + "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" + "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" + "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" + "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" + "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" + "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" + "80800020004180ce006a200041f8326a4180036a22414130108681808000" + "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" + "326a41e0036a224241301086818080001a200041a0e8006a410041301085" + "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" + "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" + "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" + "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" + "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" + "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" + "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" + "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" + "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" + "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" + "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" + "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" + "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" + "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" + "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" + "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" + "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" + "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" + "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" + "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" + "4410b280808000200041c0d2006a200841301086818080001a2007200041" + "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" + "41c0016a223a41301086818080001a200041c0db006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" + "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" + "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" + "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" + "006a200041c0db006a10b380808000200141004130108581808000210120" + "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" + "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" + "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" + "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" + "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" + "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" + "10b28080800020004180c5006a200341301086818080001a2005200041a0" + "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" + "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" + "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" + "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" + "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" + "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" + "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" + "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" + "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" + "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" + "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" + "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" + "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" + "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" + "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" + "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" + "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" + "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" + "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" + "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" + "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" + "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" + "2031203510b28080800020004180c5006a200041c0db006a413010868180" + "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" + "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" + "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" + "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" + "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" + "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" + "0620004180ce006a20004180d7006a10b380808000200741004130108581" + "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" + "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" + "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" + "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" + "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" + "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" + "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" + "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" + "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" + "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" + "5241301086818080001a20004180d7006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" + "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" + "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" + "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" + "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" + "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" + "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" + "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" + "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" + "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" + "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" + "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" + "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" + "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" + "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" + "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" + "01108581808000213820004180d7006a41a0026a225320004180ce006a20" + "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" + "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" + "41301086818080001a200520004180d7006a4190016a10b2808080002000" + "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" + "b28080800020004180ce006a200441301086818080001a200041c0d2006a" + "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" + "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" + "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" + "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" + "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" + "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" + "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" + "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" + "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" + "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" + "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" + "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" + "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" + "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" + "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" + "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" + "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" + "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" + "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" + "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" + "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" + "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" + "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" + "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" + "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" + "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" + "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" + "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" + "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" + "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" + "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" + "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" + "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" + "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" + "b280808000200041803c6a200041c0d2006a41301086818080001a203720" + "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" + "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" + "c0c9006a203441301086818080001a20004180ce006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" + "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" + "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" + "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" + "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" + "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" + "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" + "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" + "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" + "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" + "41d0026a225a10b280808000200041c0376a205641301086818080001a20" + "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" + "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" + "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" + "301086818080001a20004180ce006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" + "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" + "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" + "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" + "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" + "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" + "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" + "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" + "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" + "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" + "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" + "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" + "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" + "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" + "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" + "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" + "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" + "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" + "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" + "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" + "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" + "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" + "8080800020004180e0006a41306a2230200041f8326a203310b980808000" + "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" + "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" + "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" + "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" + "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" + "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" + "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" + "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" + "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" + "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" + "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" + "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" + "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" + "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" + "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" + "0020004180d7006a410041301085818080001a200041c0e7006a20004180" + "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" + "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" + "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" + "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" + "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" + "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" + "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" + "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" + "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" + "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" + "0041c0db006a200210b0808080002038203d203c200210b0808080002034" + "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" + "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" + "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" + "86818080001a200020023a00b837200041803c6a410041c0041085818080" + "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" + "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" + "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" + "203e200210b0808080002008200041803c6a4180036a2041200210b08080" + "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" + "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" + "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" + "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" + "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" + "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" + "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" + "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" + "301086818080001a200041a0e8006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" + "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" + "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" + "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" + "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" + "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" + "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" + "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" + "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" + "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" + "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" + "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" + "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" + "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" + "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" + "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" + "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" + "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" + "006a200041a0e8006a10b380808000203341004130108581808000210620" + "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" + "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" + "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" + "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" + "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" + "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" + "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" + "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" + "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" + "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" + "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" + "98abaaa584073703c05b203c410041c00110858180800021432003200041" + "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" + "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" + "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" + "6a200841301086818080001a2001204510b28080800020004180d7006a20" + "3a41301086818080001a200041c0db006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" + "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" + "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" + "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" + "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" + "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" + "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" + "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" + "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" + "001086818080001a2031204710b28080800020004180c5006a2003413010" + "86818080001a2005204810b280808000200041c0c9006a20494130108681" + "8080001a2001204a10b28080800020004180d7006a204b41301086818080" + "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" + "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" + "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" + "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" + "38200041c0c9006a200041c0db006a10b380808000203341004130108581" + "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" + "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" + "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" + "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" + "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" + "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" + "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" + "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" + "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" + "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" + "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" + "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" + "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" + "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" + "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" + "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" + "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" + "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" + "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" + "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" + "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" + "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" + "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" + "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" + "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" + "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" + "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" + "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" + "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" + "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" + "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" + "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" + "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" + "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" + "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" + "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" + "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" + "20004180d7006a200041a0e8006a10b38080800020064100413010858180" + "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" + "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" + "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" + "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" + "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" + "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" + "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" + "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" + "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" + "410041c001108581808000213d200320004180d7006a200041c0db006a10" + "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" + "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" + "001a2036204410b280808000200041c0e4006a200841301086818080001a" + "2001204510b28080800020004180d7006a203a41301086818080001a2000" + "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" + "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" + "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" + "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" + "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" + "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" + "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" + "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" + "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" + "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" + "204710b280808000200041c0e7006a200341301086818080001a20302048" + "10b28080800020004180e0006a204941301086818080001a2001204a10b2" + "8080800020004180d7006a204b41301086818080001a200041c0db006a41" + "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" + "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" + "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" + "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" + "41c0db006a10b3808080002033410041301085818080002133200042ba8a" + "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" + "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" + "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" + "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" + "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" + "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" + "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" + "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" + "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" + "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" + "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" + "8407370380572007410041c00110858180800021072032200041c0e4006a" + "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" + "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" + "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" + "301086818080001a2036204d10b280808000200041c0e4006a203b413010" + "86818080001a20004180d7006a410041301085818080001a200042c18e8e" + "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" + "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" + "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" + "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" + "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" + "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" + "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" + "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" + "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" + "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" + "306a204e10b280808000200041e0e6006a203241301086818080001a2006" + "204f10b280808000200041c0e7006a205041301086818080001a20362051" + "10b280808000200041c0e4006a205241301086818080001a20004180d700" + "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" + "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" + "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" + "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" + "20004180d7006a10b3808080002001410041301085818080002101200042" + "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" + "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" + "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" + "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" + "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" + "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" + "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" + "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" + "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" + "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" + "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" + "aaa584073703c0642037410041c00110858180800021372053200041a0e2" + "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" + "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" + "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" + "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" + "b28080800020004180d7006a203841301086818080001a2033205810b280" + "808000200041c0db006a203441301086818080001a200041a0e8006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" + "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" + "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" + "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" + "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" + "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" + "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" + "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" + "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" + "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" + "004180e0006a205641301086818080001a2005205b10b280808000200041" + "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" + "006a205e41301086818080001a200041a0e8006a41004130108581808000" + "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" + "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" + "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" + "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" + "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" + "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" + "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" + "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" + "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" + "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" + "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" + "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" + "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" + "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" + "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" + "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" + "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" + "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" + "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" + "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" + "80800020004180d7006a205441301086818080001a203320004180c5006a" + "41f0016a10b280808000200041c0db006a205541301086818080001a2000" + "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" + "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" + "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" + "80d7006a200041a0e8006a10b38080800020344100413010858180800021" + "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" + "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" + "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" + "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" + "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" + "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" + "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" + "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" + "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" + "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" + "200510b28080800020004180e0006a200041a0e8006a4130108681808000" + "1a2036204410b280808000200041c0e4006a200841301086818080001a20" + "01204510b28080800020004180d7006a203a41301086818080001a200041" + "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" + "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" + "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" + "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" + "e4006a200041c0db006a10b3808080002033410041301085818080002104" + "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" + "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" + "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" + "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" + "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" + "b280808000200041c0e7006a200341301086818080001a2030204810b280" + "80800020004180e0006a204941301086818080001a2001204a10b2808080" + "0020004180d7006a204b41301086818080001a200041c0db006a41004130" + "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" + "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" + "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" + "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" + "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" + "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" + "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" + "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" + "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" + "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" + "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" + "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" + "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" + "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" + "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" + "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" + "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" + "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" + "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" + "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" + "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" + "00200020023a00a068024020024101470d00200041a0e8006a200041f829" + "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" + "200041f8326a10c2808080002008203f10c2808080007110a38080800020" + "3a204010c2808080007110a3808080002003203e10c28080800020492041" + "10c2808080007110a380808000204b204210c2808080007110a380808000" + "7110a380808000210220002802a82520002802ac25108580808000200028" + "029825200028029c25108580808000200028028825200028028c25108580" + "80800020002802f82420002802fc24108580808000202f202e1086808080" + "0020002802c01c20002802c41c10828080800020002802a01520002802a4" + "15108480808000200028028815200028028c1510848080800020002802b4" + "1320002802b81310848080800020002802bc1220002802c0121084808080" + "0020002802e41020002802e810108480808000200028028c0f2000280290" + "0f10848080800020002802940e20002802980e108480808000200028029c" + "0d20002802a00d108480808000200241ff017141004721020c080b200041" + "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" + "109680808000000b200041c0c0006a200041b8256a203610b48080800020" + "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" + "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" + "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" + "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" + "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" + "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" + "006a10b7808080002005200041c0db006a41a0021086818080001a200041" + "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" + "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" + "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" + "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" + "8180800020004180026a200942004285b087cd8081f69c33420010878180" + "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" + "00200041e0016a200029039002220e20022903087c220b200041a0026a41" + "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" + "7e220942004281808080704200108781808000200041d0016a2009420042" + "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" + "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" + "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" + "29038002221220022903107c220a20004190026a41086a290300200b200e" + "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" + "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" + "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" + "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" + "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" + "4200108781808000200041f0006a20002903b001221020002903f0012211" + "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" + "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" + "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" + "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" + "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" + "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" + "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" + "f3004200108781808000200041a0016a41086a290300210d200041306a41" + "086a290300210f200029039001211720002903502114200041d0006a4108" + "6a2903002115200020002903602216200041f0016a41086a290300200e20" + "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" + "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" + "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" + "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" + "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" + "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" + "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" + "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" + "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" + "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" + "200041a0e8006a200041f8326a10a280808000200020002903b868370398" + "4e200020002903b0683703904e200020002903a8683703884e2000200029" + "03a0683703804e200041c0db006a410041301085818080001a2035410041" + "301085818080001a203441e086c0800041301086818080001a4101210220" + "0041013602e052200041003602d452200041003602c852200020333602c4" + "52200020004180ce006a3602c05203400240024020020d00200041086a20" + "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" + "0041003602e0520240024020002802c852450d00200041286a2002203210" + "c58080800020002802280d01200028022c21020b024020002802c0522201" + "450d0020002802c45221030340024020032001470d00200020033602c452" + "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" + "0041206a2002203210c580808000024020002802200d0020002802242102" + "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" + "52450d00200041186a2002203110c58080800020002802180d0120002802" + "1c21020b41002103200041003602d45220020d010b200041106a200041c0" + "d2006a10c48080800020002d0011210120002d001021030b024020034101" + "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" + "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" + "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" + "326a200110c880808000200041c0db006a200041a0e8006a419001108681" + "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" + "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" + "c78080800020004180236a200041f8326a4190011086818080001a200441" + "016a21040c000b0b2000420137028433200041013602fc322000419482c0" + "80003602f83220004181808080003602a4682000200041a0e8006a360280" + "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" + "f8326a419c82c08000109680808000000b200220002802b40641b092c080" + "00108c80808000000b202f202e10868080800020002802c01c20002802c4" + "1c10828080800020002802a01520002802a4151084808080002000280288" + "15200028028c1510848080800020002802b41320002802b8131084808080" + "0020002802bc1220002802c01210848080800020002802e41020002802e8" + "10108480808000200028028c0f20002802900f1084808080002000280294" + "0e20002802980e108480808000200028029c0d20002802a00d1084808080" + "00410021020b200041e0ec006a24808080800020020ba60201087e200020" + "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" + "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" + "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" + "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" + "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" + "54ad7c427f7c220242818080807083220720037c22083703002000200242" + "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" + "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" + "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" + "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" + "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" + "8080808000200241013b010c200220013602082002200036020420024104" + "6a10f380808000000b6501017f23808080800041306b2202248080808000" + "200041306a200141306a41301086818080001a200041e0006a41e086c080" + "00200241004130108581808000220220012d006010908080800020002001" + "41301086818080001a200241306a2480808080000b25002000200141f087" + "c0800010df808080002000200110a98080800010d2808080003a00300be7" + "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" + "200229030022044200200129030022054200108781808000200341d0046a" + "20022903082206420020054200108781808000200341e0046a2002290310" + "2207420020054200108781808000200341f0046a20022903182208420020" + "05420010878180800020034180056a200229032022094200200542001087" + "8180800020034190056a2002290328220a42002005420010878180800020" + "0341a0056a20012903082205420020044200108781808000200341f0056a" + "2005420020064200108781808000200341c0066a20054200200742001087" + "8180800020034190076a2005420020084200108781808000200341e0076a" + "2005420020094200108781808000200341b0086a20054200200a42001087" + "81808000200341b0056a2001290310220542002004420010878180800020" + "034180066a2005420020064200108781808000200341d0066a2005420020" + "074200108781808000200341a0076a200542002008420010878180800020" + "0341f0076a2005420020094200108781808000200341c0086a2005420020" + "0a4200108781808000200341c0056a200129031822054200200442001087" + "8180800020034190066a2005420020064200108781808000200341e0066a" + "2005420020074200108781808000200341b0076a20054200200842001087" + "8180800020034180086a2005420020094200108781808000200341d0086a" + "20054200200a4200108781808000200341d0056a20012903202205420020" + "044200108781808000200341a0066a200542002006420010878180800020" + "0341f0066a2005420020074200108781808000200341c0076a2005420020" + "08420010878180800020034190086a200542002009420010878180800020" + "0341e0086a20054200200a4200108781808000200341e0056a2001290328" + "2205420020044200108781808000200341b0066a20054200200642001087" + "8180800020034180076a2005420020074200108781808000200341d0076a" + "2005420020084200108781808000200341a0086a20054200200942001087" + "81808000200341f0086a20054200200a4200108781808000200341b0046a" + "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" + "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" + "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" + "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" + "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" + "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" + "10878180800020034190046a200341b0046a41086a290300200520032903" + "b00422047c200454ad7c220720032903a0047c220520032903a005220820" + "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" + "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" + "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" + "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" + "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" + "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" + "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" + "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" + "20032903b0037c220520032903f005220d200341d0046a41086a29030020" + "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" + "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" + "7c220a20034190046a41086a290300200329039004220420067c200454ad" + "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" + "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" + "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" + "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" + "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" + "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" + "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" + "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" + "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" + "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" + "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" + "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" + "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" + "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" + "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" + "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" + "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" + "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" + "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" + "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" + "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" + "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" + "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" + "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" + "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" + "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" + "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" + "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" + "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" + "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" + "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" + "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" + "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" + "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" + "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" + "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" + "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" + "06201154ad7c22192003290390027c221120034180036a41086a29030020" + "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" + "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" + "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" + "032903607c220520034180056a41086a290300200d201354ad7c22172003" + "290390057c221020032903e0077c221220034190076a41086a290300200f" + "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" + "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" + "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" + "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" + "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" + "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" + "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" + "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" + "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" + "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" + "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" + "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" + "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" + "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" + "03002122200341b0086a41086a290300212320032903c008212420032903" + "8008212520032903c0072126200329038007212720032903d00221282003" + "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" + "076a41086a290300212b200341c0076a41086a290300212c20034180086a" + "41086a290300212d200341c0086a41086a290300212e20032903d008212f" + "200329039008213020032903d007213120032903e0012132200341e0016a" + "41086a290300213320032903f0012134200341f0016a41086a2903002135" + "20034180026a41086a2903002136200341d0076a41086a29030021372003" + "4190086a41086a2903002138200341d0086a41086a290300213920032903" + "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" + "00213d200329038001213e20034180016a41086a290300213f2003290390" + "01214020034190016a41086a2903002141200341a0016a41086a29030021" + "42200341a0086a41086a2903002143200341e0086a41086a290300214420" + "032903f008214520032903002146200341086a2903002147200329031021" + "48200341106a41086a29030021492003290320214a200341206a41086a29" + "0300214b2003290330214c200341306a41086a290300214d200320032903" + "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" + "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" + "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" + "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" + "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" + "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" + "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" + "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" + "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" + "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" + "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" + "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" + "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" + "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" + "1a370380092003204c204020342028202720262025202420232004204f54" + "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" + "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" + "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" + "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" + "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" + "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" + "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" + "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" + "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" + "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" + "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" + "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" + "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" + "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" + "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" + "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" + "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" + "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" + "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" + "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" + "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" + "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" + "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" + "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" + "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" + "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" + "b0096a2480808080000b3701017f20004100413010858180800021004101" + "10a3808080002101200041306a41e086c0800041301086818080001a2000" + "20013a00600b3a01017f23808080800041306b2201248080808000200020" + "0141004130108581808000220110db808080002100200141306a24808080" + "800020000b42002000200120022003109080808000200041306a20014130" + "6a200241306a2003109080808000200020022d006020012d006022027341" + "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" + "808080800020012d00c0012103410021042002410010a3808080003a0088" + "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" + "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" + "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" + "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" + "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" + "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" + "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" + "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" + "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" + "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" + "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" + "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" + "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" + "a3f9753703c80120022001200241c8016a200310d980808000200241c005" + "6a200210e880808000200241c8016a41c400410841a002108e8080800020" + "022802cc0121010240024020022802c8014101460d0020022802d0012105" + "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" + "026a200241c8011086818080002106200241003602b805200220053602b4" + "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" + "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" + "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" + "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" + "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" + "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" + "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" + "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" + "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" + "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" + "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" + "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" + "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" + "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" + "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" + "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" + "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" + "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" + "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" + "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" + "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" + "00200241a0156a20024180166a200241e0076a10bb808080002005200241" + "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" + "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" + "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" + "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" + "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" + "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" + "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" + "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" + "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" + "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" + "e2808080002008200241e0166a200241e0166a10bc808080002007200241" + "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" + "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" + "022802b80522013602e016200141c400470d01200020033a000c2000200b" + "290200370200200041086a200b41086a280200360200200241c0176a2480" + "808080000f0b200120022802d00141888cc08000108c80808000000b2002" + "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" + "7f2380808080004180036b2201248080808000200141a0026a41306a4100" + "41301085818080001a200141a0026a41e086c0800041301086818080001a" + "2001200141a0026a41e000108681808000220141e0006a410041c0011085" + "818080001a200041a0026a410041a0021085818080001a2000200141a002" + "1086818080001a20014180036a2480808080000bd70301157f2380808080" + "0041c00d6b2203248080808000200241e0036a210420024180036a210520" + "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" + "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" + "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" + "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" + "c0016a2112200341e0006a21132001280200211420012802082115034002" + "4020090d002001201541016a3602082000200241c0041086818080001a20" + "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" + "607210a380808000211720032002201641046a280200201641086a280200" + "201541cc8cc0800010ae80808000201428020010af808080002003418009" + "6a20032002201710b080808000201120132008201710b080808000201020" + "122007201710b080808000200341a00b6a200f2006201710b08080800020" + "0c200e2005201710b080808000200b200d2004201710b080808000200341" + "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" + "1086818080001a2002200341c0046a41c0041086818080001a200941786a" + "2109201441086a21140c000b0b22000240200120024b0d00200220012003" + "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" + "e00f6b22042480808080002004200241e000108681808000220441e0006a" + "200241e0006a41e0001086818080001a2004200341306a220510dd808080" + "00200441306a200510dd80808000200441e0006a200310dd808080002004" + "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" + "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" + "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" + "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" + "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" + "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" + "1086818080001a20044180066a200441e0006a200410bc80808000200441" + "e0066a2003200110c38080800020044180096a200441e0066a2002200441" + "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" + "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" + "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" + "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" + "e00f6a2480808080000b2700200020012002200310908080800020004130" + "6a200141306a200241306a20031090808080000b30002000200110e28080" + "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" + "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" + "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" + "ffd51e7c2206200420028420012903102207842001290318220884200129" + "03202209842001290328220a845022011b3703082000420042abd5feffff" + "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" + "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" + "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" + "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" + "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" + "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" + "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" + "01057f23808080800041c0016b2203248080808000200341306a22042001" + "41306a220510b280808000200320014130108681808000220341e0006a41" + "306a200241306a220641301086818080002107200341e0006a2002413010" + "86818080001a20002003200341e0006a10e1808080002004200541301086" + "818080001a200320014130108681808000220341e0006a20064130108681" + "8080001a2007200241301086818080001a200041306a2003200341e0006a" + "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" + "41a0086b22032480808080002003200241e0006a220420024190016a2205" + "10b980808000200341306a2004200510b880808000200341e0006a200241" + "c0016a2206200241f0016a220710b98080800020034190016a2006200710" + "b880808000200341e0036a41306a2208200141306a220910b28080800020" + "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" + "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" + "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" + "6a2210200141f0016a221110b280808000200341e0036a20014130108681" + "8080001a20034180066a41306a200241306a221241301086818080002113" + "20034180066a200241301086818080001a20034180066a41e0006a200341" + "90016a4130108681808000211420034180066a4190016a200341e0006a41" + "30108681808000211520034180066a41c0016a200341306a413010868180" + "8000211620034180066a41f0016a200341301086818080002117200341c0" + "016a200341e0036a20034180066a10ea8080800020082009413010868180" + "80002108200b200a41301086818080002118200c200d4130108681808000" + "210b200f200e4130108681808000210f201020114130108681808000210c" + "200341e0036a200141301086818080001a20034180066a20124130108681" + "8080001a20132002413010868180800021102014200341e0006a41301086" + "818080002113201520034190016a41301086818080002114201620034130" + "10868180800021152017200341306a41301086818080002116200341c001" + "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" + "80002018200a41301086818080002117200b200d10b280808000200f200e" + "4130108681808000210f200c201110b280808000200341e0036a20014130" + "1086818080001a20034180066a200441301086818080001a201020054130" + "108681808000211020142012413010868180800021142013200241301086" + "818080002113201520034190016a413010868180800021152016200341e0" + "006a41301086818080002116200341a0026a200341e0036a20034180066a" + "10ea8080800020082009413010868180800021082017200a413010868180" + "80002117200b200d4130108681808000210b200f200e4130108681808000" + "210f200c20114130108681808000210c200341e0036a2001413010868180" + "80001a20034180066a200541301086818080001a20102004413010868180" + "800021102013201241301086818080002113201420024130108681808000" + "21142015200341e0006a41301086818080002115201620034190016a4130" + "1086818080002116200341a0026a41306a200341e0036a20034180066a10" + "ea808080002008200910b2808080002017200a4130108681808000211720" + "0b200d10b280808000200f200e4130108681808000210f200c201110b280" + "808000200341e0036a200141301086818080001a20034180066a20064130" + "1086818080001a2010200741301086818080002110201320044130108681" + "808000211320142005413010868180800021142016201241301086818080" + "002116201520024130108681808000211520034180036a200341e0036a20" + "034180066a10ea808080002008200941301086818080001a2017200a4130" + "1086818080001a200b200d41301086818080001a200f200e413010868180" + "80001a200c201141301086818080001a200341e0036a2001413010868180" + "80001a20034180066a200741301086818080001a20102006413010868180" + "80001a2013200541301086818080001a2014200441301086818080001a20" + "15201241301086818080001a2016200241301086818080001a2003418003" + "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" + "41e000108681808000220241e0006a200341a0026a41e000108681808000" + "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" + "80808080000bb30301027f23808080800041e0066b220224808080800020" + "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" + "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" + "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" + "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" + "6a2003200110b380808000200241e0036a20024180036a20024180036a10" + "bc80808000200241c0046a200110ba8080800020024180066a200241e003" + "6a200241e0036a41306a220110b88080800020024180066a41306a220320" + "0241e0036a200110b980808000200020024180066a200210bc8080800020" + "024180066a200241c0046a200241c0046a41306a220110b8808080002003" + "200241c0046a200110b980808000200041e0006a20024180066a200241c0" + "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" + "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" + "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" + "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" + "80800041e0006b22022480808080002002200141c0016a2203200141f001" + "6a220410b880808000200241306a2003200410b980808000200041c0016a" + "200141e0006a41e0001086818080001a2000200241e00010868180800041" + "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" + "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" + "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" + "0b3601017f23808080800041306b22032480808080002003200210b28080" + "800020002003200110b980808000200341306a2480808080000b87020201" + "7f0c7e23808080800041306b220324808080800020012903082104200229" + "030821052002290328210620012903282107200229032021082001290320" + "21092002290318210a2001290318210b2002290310210c2001290310210d" + "20032002290300220e20012903007c220f3703002003200520047c220420" + "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" + "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" + "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" + "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" + "00200310d680808000200341306a2480808080000b7401027f2380808080" + "004190016b220224808080800020022001200141306a220310b980808000" + "200241306a2001200310b880808000200241e0006a2001200110b9808080" + "0020002002200241306a10a780808000200041306a200241e0006a200310" + "a78080800020024190016a2480808080000b230020002001200210b88080" + "8000200041306a200141306a200241306a10b8808080000b230020002001" + "200210b980808000200041306a200141306a200241306a10b9808080000b" + "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" + "6a200129030822034200200129030022044200108781808000200241d004" + "6a20012903102205420020044200108781808000200241e0046a20012903" + "182206420020044200108781808000200241f0046a200129032022074200" + "2004420010878180800020024180056a2001290328220842002004420010" + "8781808000200241a0056a2005420020034200108781808000200241b005" + "6a2006420020034200108781808000200241c0056a200742002003420010" + "8781808000200241d0056a2008420020034200108781808000200241f005" + "6a200642002005420010878180800020024180066a200742002005420010" + "878180800020024190066a2008420020054200108781808000200241b006" + "6a2007420020064200108781808000200241c0066a200842002006420010" + "8781808000200241e0066a20084200200742001087818080002002419005" + "6a2004420020044200108781808000200241e0056a200342002003420010" + "8781808000200241a0066a2005420020054200108781808000200241d006" + "6a2006420020064200108781808000200241f0066a200742002007420010" + "878180800020024180076a2008420020084200108781808000200241b004" + "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" + "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" + "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" + "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" + "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" + "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" + "00108781808000200241d0036a20024190056a41086a2903002209200229" + "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" + "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" + "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" + "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" + "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" + "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" + "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" + "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" + "220a20022903e005220b20022903d004220c200241c0046a41086a290300" + "7c22074201862008423f88847c22082004200954ad7c2209200229039004" + "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" + "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" + "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" + "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" + "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" + "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" + "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" + "81808000200241c0026a20022903a003220f200241e0056a41086a290300" + "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" + "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" + "423f88847c22072002290380047c220b20024190046a41086a290300200d" + "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" + "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" + "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" + "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" + "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" + "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" + "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" + "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" + "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" + "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" + "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" + "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" + "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" + "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" + "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" + "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" + "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" + "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" + "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" + "290300200b201054ad7c22182002290380057c220720022903c0057c220e" + "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" + "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" + "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" + "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" + "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" + "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" + "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" + "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" + "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" + "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" + "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" + "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" + "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" + "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" + "200241d0066a41086a290300211920024180066a41086a290300211a2002" + "41d0056a41086a290300211b200229039006211c20022903b006211d2002" + "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" + "03002120200241b0066a41086a290300212120024190066a41086a290300" + "212220022903c006212320022903f006210320022903f0012124200241f0" + "016a41086a2903002125200229038002212620024180026a41086a290300" + "212720024190026a41086a2903002128200241c0066a41086a2903002129" + "20022903e006212a200241f0066a41086a290300212b200229038001212c" + "20024180016a41086a290300212d200229039001212e20024190016a4108" + "6a290300212f20022903a0012130200241a0016a41086a29030021312002" + "41b0016a41086a2903002132200241e0066a41086a290300213320022903" + "8007211120022903102134200241106a41086a2903002135200229032021" + "36200241206a41086a290300213720022903302138200241306a41086a29" + "030021392002290340213a200241c0006a41086a290300213b2002200229" + "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" + "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" + "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" + "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" + "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" + "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" + "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" + "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" + "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" + "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" + "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" + "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" + "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" + "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" + "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" + "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" + "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" + "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" + "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" + "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" + "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" + "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" + "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" + "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" + "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" + "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" + "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" + "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" + "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" + "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" + "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" + "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" + "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" + "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" + "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" + "076a10d680808000200241c0076a2480808080000be60101037f23808080" + "80004180126b220324808080800020032001200210b480808000200341a0" + "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" + "2002200510c380808000200341e0066a2004200110c38080800020034180" + "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" + "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" + "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" + "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" + "20034180126a2480808080000b3c01017f23808080800041c0046b220224" + "808080800020022000200110be808080002000200241c004108681808000" + "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" + "022480808080002002200141e000108681808000220241e0006a200141e0" + "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" + "001086818080001a200241a0026a200141a0026a220541e0001086818080" + "001a20024180036a20014180036a220641e0001086818080001a200241e0" + "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" + "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" + "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" + "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" + "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" + "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" + "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" + "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" + "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" + "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" + "200241a0086a200841e0001086818080001a200241e0006a20024180066a" + "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" + "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" + "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" + "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" + "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" + "808000200241a00b6a41306a200241a0086a200110b98080800020024180" + "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" + "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" + "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" + "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" + "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" + "8080800020024180096a200241e0001086818080001a20024180096a41e0" + "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" + "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" + "86818080001a200820024180036a41e0001086818080001a200241a00b6a" + "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" + "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" + "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" + "8080808000200210ac8080800041002103413f2104034002400240024020" + "04417f460d0042012004413f71ad8642808084808080c080528321052003" + "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" + "8080002000200241a0021086818080001a20024180096a2480808080000f" + "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" + "80001a410121030b02402005500d002002200110bf808080000b2004417f" + "6a21040c000b0b23002000200110db80808000200041306a200141306a10" + "db808080007110a3808080000b3e0020002001200210bc80808000200041" + "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" + "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" + "2202248080808000200141086a21030340200241086a200310e680808000" + "02400240024020022d0008450d0020022d00092101410121040c010b0240" + "20012802002204450d00200420012802042205470d020b2002200141146a" + "10e68080800020022d0001210120022d000021040b200020013a00012000" + "20044101713a0000200241106a2480808080000f0b200142808080808001" + "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" + "23808080800041106b220324808080800041002104410121054100210602" + "400340200120062207460d01200341086a200210d080808000200741016a" + "210620032d00080d000b200120076b2104410021050b2000200436020420" + "002005360200200341106a2480808080000bf50401037f23808080800041" + "b0096b22022480808080002002200141306a220310bd8080800020024130" + "6a2002200210b980808000200241e0006a200241306a200241306a10b980" + "80800020024190016a200241e0006a200241e0006a10b980808000200241" + "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" + "808000200241d0086a200241f0016a200241f0016a10b980808000200241" + "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" + "80096a20024180096a10b980808000200241a0026a200241c0076a200241" + "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" + "80800020024180036a2002200241a0026a10b980808000200241b0036a20" + "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" + "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" + "b980808000200241c0046a200220024190046a10b880808000200241f004" + "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" + "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" + "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" + "024180066a20024180066a10b980808000200241b0066a41306a200241a0" + "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" + "86818080001a200241c0076a410041301085818080001a200241c0076a41" + "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" + "301086818080001a2000200241b0066a200241c0076a200410a980808000" + "10c880808000200241b0096a2480808080000bf60601057f238080808000" + "41900d6b220324808080800020032001200210a780808000200341306a20" + "0141306a2204200241306a220510a780808000200341e0006a200141e000" + "6a2206200241e0006a220710a78080800020034190016a2001200410b980" + "808000200341c0016a2002200510b980808000200341f0016a2003419001" + "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" + "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" + "036a2004200610b980808000200341b0036a2005200710b9808080002003" + "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" + "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" + "90046a10b880808000200341f0046a2001200610b980808000200341a005" + "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" + "a78080800020034180066a2003200341e0006a10b980808000200341b006" + "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" + "b98080800020034190076a200341e0066a200310b980808000200341800c" + "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" + "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" + "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" + "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" + "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" + "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" + "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" + "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" + "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" + "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" + "00200341e0096a200341d0086a20034190076a10a780808000200341900a" + "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" + "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" + "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" + "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" + "2480808080000b41002000200120022003109080808000200041306a2001" + "41306a200241306a2003109080808000200041e0006a200141e0006a2002" + "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" + "280200220241787122006a21030240024020024101710d00200241027145" + "0d012001280200220220006a21000240200120026b2201410028029c97c0" + "8000470d0020032802044103714103470d014100200036029497c0800020" + "032003280204417e7136020420012000410172360204200320003602000f" + "0b2001200210cc808080000b024002400240024002400240200328020422" + "024102710d00200341002802a097c08000460d022003410028029c97c080" + "00460d0320032002417871220210cc808080002001200220006a22004101" + "72360204200120006a20003602002001410028029c97c08000470d014100" + "200036029497c080000f0b20032002417e71360204200120004101723602" + "04200120006a20003602000b2000418002490d0220012000108481808000" + "41002101410041002802b497c08000417f6a22003602b497c0800020000d" + "04024041002802fc94c080002200450d00410021010340200141016a2101" + "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" + "80000f0b410020013602a097c080004100410028029897c0800020006a22" + "0036029897c080002001200041017236020402402001410028029c97c080" + "00470d004100410036029497c080004100410036029c97c080000b200041" + "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" + "02410028029897c0800022054129490d0241f494c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b2001280208" + "21010c000b0b4100200136029c97c080004100410028029497c080002000" + "6a220036029497c0800020012000410172360204200120006a2000360200" + "0f0b200041f80171418495c080006a210302400240410028028c97c08000" + "220241012000410376742200710d004100200220007236028c97c0800020" + "0321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802fc94c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff" + "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" + "c080000b0b4d01017f23808080800041206b220224808080800020024100" + "36021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110a480808000000b800601057f0240" + "024002402000417c6a220328020022044178712205410441082004410371" + "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" + "02410b6a4178712002410b491b210102400240024020060d002001418002" + "490d0120052001410472490d01200520016b418180084f0d010c020b2000" + "41786a220720056a21060240024002400240200520014f0d002006410028" + "02a097c08000460d032006410028029c97c08000460d0220062802042204" + "4102710d042004417871220420056a22052001490d042006200410cc8080" + "8000200520016b22024110490d0120032001200328020041017172410272" + "360200200720016a22012002410372360204200720056a22052005280204" + "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" + "0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210cd8080800020000f0b" + "20032005200328020041017172410272360200200720056a220220022802" + "0441017236020420000f0b410028029497c0800020056a22052001490d01" + "02400240200520016b2202410f4b0d002003200441017120057241027236" + "0200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236" + "0204200720056a2205200236020020052005280204417e713602040b4100" + "200136029c97c080004100200236029497c0800020000f0b410028029897" + "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" + "0f0b20052000417c4178200328020022014103711b20014178716a220120" + "0220012002491b1086818080002102200010c980808000200221000b2000" + "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" + "93c0800010ca80808000000b200320012004410171724102723602002007" + "20016a2202200520016b22054101723602044100200536029897c0800041" + "0020023602a097c0800020000b820301047f200028020c21020240024002" + "402001418002490d002000280218210302400240024020022000470d0020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000" + "2802082201200236020c200220013602080c010b200041146a200041106a" + "20021b21040340200421052001220241146a200241106a20022802142201" + "1b210420024114411020011b6a28020022010d000b200541003602000b20" + "03450d020240200028021c41027441f493c080006a22012802002000460d" + "0020034110411420032802102000461b6a20023602002002450d030c020b" + "2001200236020020020d014100410028029097c08000417e200028021c77" + "7136029097c080000c020b0240200220002802082204460d002004200236" + "020c200220043602080f0b4100410028028c97c08000417e200141037677" + "7136028c97c080000f0b20022003360218024020002802102201450d0020" + "022001360210200120023602180b20002802142201450d00200220013602" + "14200120023602180f0b0ba00401027f200020016a210202400240200028" + "020422034101710d002003410271450d012000280200220320016a210102" + "40200020036b2200410028029c97c08000470d0020022802044103714103" + "470d014100200136029497c0800020022002280204417e71360204200020" + "01410172360204200220013602000c020b2000200310cc808080000b0240" + "024002400240200228020422034102710d00200241002802a097c0800046" + "0d022002410028029c97c08000460d0320022003417871220310cc808080" + "002000200320016a2201410172360204200020016a200136020020004100" + "28029c97c08000470d014100200136029497c080000f0b20022003417e71" + "36020420002001410172360204200020016a20013602000b024020014180" + "02490d00200020011084818080000f0b200141f80171418495c080006a21" + "0202400240410028028c97c08000220341012001410376742201710d0041" + "00200320017236028c97c08000200221010c010b200228020821010b2002" + "20003602082001200036020c2000200236020c200020013602080f0b4100" + "20003602a097c080004100410028029897c0800020016a220136029897c0" + "8000200020014101723602042000410028029c97c08000470d0141004100" + "36029497c080004100410036029c97c080000f0b4100200036029c97c080" + "004100410028029497c0800020016a220136029497c08000200020014101" + "72360204200020016a20013602000f0b0bc12502087f017e024002400240" + "02400240024002400240200041f4014b0d00410028028c97c08000220141" + "102000410b6a41f803712000410b491b220241037622037622004103710d" + "012002410028029497c080004d0d0720000d02410028029097c080002200" + "0d030c070b2000410b6a22034178712102410028029097c080002204450d" + "06411f21050240200041f4ffff074b0d002002410620034108766722006b" + "7641017120004101746b413e6a21050b410020026b210302402005410274" + "41f493c080006a28020022010d0041002100410021060c040b4100210020" + "024100411920054101766b2005411f461b74210741002106034002402001" + "220128020441787122082002490d00200820026b220820034f0d00200821" + "032001210620080d004100210320012106200121000c060b200128021422" + "082000200820012007411d764104716a41106a2802002201471b20002008" + "1b2100200741017421072001450d040c000b0b024002402000417f734101" + "7120036a22074103742200418495c080006a22022000418c95c080006a28" + "020022032802082206460d002006200236020c200220063602080c010b41" + "002001417e2007777136028c97c080000b20032000410372360204200320" + "006a22002000280204410172360204200341086a0f0b0240024020002003" + "7441022003742200410020006b72716822084103742203418495c080006a" + "22062003418c95c080006a28020022002802082207460d00200720063602" + "0c200620073602080c010b41002001417e2008777136028c97c080000b20" + "002002410372360204200020026a2207200320026b220241017236020420" + "0020036a20023602000240410028029497c080002201450d002001417871" + "418495c080006a2106410028029c97c08000210302400240410028028c97" + "c08000220841012001410376742201710d004100200820017236028c97c0" + "8000200621010c010b200628020821010b20062003360208200120033602" + "0c2003200636020c200320013602080b4100200736029c97c08000410020" + "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" + "00220628020441787120026b210320062101024002400340024020062802" + "1022000d00200628021422000d0020012802182105024002400240200128" + "020c22002001470d00200141144110200128021422001b6a28020022060d" + "01410021000c020b20012802082206200036020c200020063602080c010b" + "200141146a200141106a20001b21070340200721082006220041146a2000" + "41106a200028021422061b210720004114411020061b6a28020022060d00" + "0b200841003602000b2005450d030240200128021c41027441f493c08000" + "6a22062802002001460d0020054110411420052802102001461b6a200036" + "02002000450d040c030b2006200036020020000d024100410028029097c0" + "8000417e200128021c777136029097c080000c030b200028020441787120" + "026b22062003200620034922061b21032000200120061b2101200021060c" + "000b0b20002005360218024020012802102206450d002000200636021020" + "0620003602180b20012802142206450d0020002006360214200620003602" + "180b02400240024020034110490d0020012002410372360204200120026a" + "22022003410172360204200220036a2003360200410028029497c0800022" + "07450d012007417871418495c080006a2106410028029c97c08000210002" + "400240410028028c97c08000220841012007410376742207710d00410020" + "0820077236028c97c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200120" + "0320026a2200410372360204200120006a22002000280204410172360204" + "0c010b4100200236029c97c080004100200336029497c080000b20014108" + "6a0f0b024020002006720d004100210641022005742200410020006b7220" + "04712200450d0320006841027441f493c080006a28020021000b2000450d" + "010b0340200020062000280204417871220120026b220820034922051b21" + "04200120024921072008200320051b21080240200028021022010d002000" + "28021421010b2006200420071b21062003200820071b2103200121002001" + "0d000b0b2006450d000240410028029497c0800022002002490d00200320" + "0020026b4f0d010b20062802182105024002400240200628020c22002006" + "470d00200641144110200628021422001b6a28020022010d01410021000c" + "020b20062802082201200036020c200020013602080c010b200641146a20" + "0641106a20001b21070340200721082001220041146a200041106a200028" + "021422011b210720004114411020011b6a28020022010d000b2008410036" + "02000b02402005450d0002400240200628021c41027441f493c080006a22" + "012802002006460d0020054110411420052802102006461b6a2000360200" + "2000450d020c010b2001200036020020000d004100410028029097c08000" + "417e200628021c777136029097c080000c010b2000200536021802402006" + "2802102201450d0020002001360210200120003602180b20062802142201" + "450d0020002001360214200120003602180b0240024020034110490d0020" + "062002410372360204200620026a22002003410172360204200020036a20" + "0336020002402003418002490d00200020031084818080000c020b200341" + "f80171418495c080006a210202400240410028028c97c080002201410120" + "03410376742203710d004100200120037236028c97c08000200221030c01" + "0b200228020821030b200220003602082003200036020c2000200236020c" + "200020033602080c010b2006200320026a2200410372360204200620006a" + "220020002802044101723602040b200641086a0f0b024002400240024002" + "4002400240410028029497c08000220020024f0d000240410028029897c0" + "8000220020024b0d0041002100200241af80046a22064110764000220341" + "7f4622070d0720034110742201450d07410041002802a497c08000410020" + "064180807c7120071b22086a22003602a497c08000410041002802a897c0" + "800022032000200320004b1b3602a897c0800002400240024041002802a0" + "97c080002203450d0041f494c08000210003402000280200220620002802" + "0422076a2001460d02200028020822000d000c030b0b0240024041002802" + "b097c080002200450d00200020014d0d010b410020013602b097c080000b" + "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" + "94c080004100418495c0800036029095c080004100418c95c08000360298" + "95c080004100418495c0800036028c95c080004100419495c080003602a0" + "95c080004100418c95c0800036029495c080004100419c95c080003602a8" + "95c080004100419495c0800036029c95c08000410041a495c080003602b0" + "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" + "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" + "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" + "95c08000410041b495c080003602bc95c080004100410036028095c08000" + "410041c495c080003602d095c08000410041bc95c080003602c495c08000" + "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" + "410041cc95c080003602d495c08000410041d495c080003602e095c08000" + "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" + "410041dc95c080003602e495c08000410041e495c080003602f095c08000" + "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" + "410041ec95c080003602f495c08000410041f495c0800036028096c08000" + "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" + "410041fc95c0800036028496c080004100418496c0800036029096c08000" + "4100418c96c0800036029896c080004100418496c0800036028c96c08000" + "4100419496c080003602a096c080004100418c96c0800036029496c08000" + "4100419c96c080003602a896c080004100419496c0800036029c96c08000" + "410041a496c080003602b096c080004100419c96c080003602a496c08000" + "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" + "410041b496c080003602c096c08000410041ac96c080003602b496c08000" + "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" + "410041c496c080003602d096c08000410041bc96c080003602c496c08000" + "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" + "410041d496c080003602e096c08000410041cc96c080003602d496c08000" + "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" + "410041e496c080003602f096c08000410041dc96c080003602e496c08000" + "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" + "410041f496c0800036028097c08000410041ec96c080003602f496c08000" + "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" + "410020013602a097c08000410041fc96c0800036028497c0800041002008" + "41586a220036029897c0800020012000410172360204200120006a412836" + "0204410041808080013602ac97c080000c080b200320014f0d0020062003" + "4b0d00200028020c450d030b410041002802b097c0800022002001200020" + "01491b3602b097c08000200120086a210641f494c0800021000240024002" + "400340200028020022072006460d01200028020822000d000c020b0b2000" + "28020c450d010b41f494c080002100024003400240200028020022062003" + "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" + "410020013602a097c080004100200841586a220036029897c08000200120" + "00410172360204200120006a4128360204410041808080013602ac97c080" + "002003200641606a41787141786a22002000200341106a491b2207411b36" + "020441002902f494c080002109200741106a41002902fc94c08000370200" + "20072009370208410020083602f894c08000410020013602f494c0800041" + "00200741086a3602fc94c080004100410036028095c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072003460d07" + "20072007280204417e713602042003200720036b22004101723602042007" + "200036020002402000418002490d00200320001084818080000c080b2000" + "41f80171418495c080006a210602400240410028028c97c0800022014101" + "2000410376742200710d004100200120007236028c97c08000200621000c" + "010b200628020821000b200620033602082000200336020c200320063602" + "0c200320003602080c070b200020013602002000200028020420086a3602" + "04200120024103723602042007410f6a41787141786a2206200120026a22" + "006b2103200641002802a097c08000460d032006410028029c97c0800046" + "0d040240200628020422024103714101470d0020062002417871220210cc" + "80808000200220036a2103200620026a220628020421020b20062002417e" + "7136020420002003410172360204200020036a2003360200024020034180" + "02490d00200020031084818080000c060b200341f80171418495c080006a" + "210202400240410028028c97c08000220641012003410376742203710d00" + "4100200620037236028c97c08000200221030c010b200228020821030b20" + "0220003602082003200036020c2000200236020c200020033602080c050b" + "4100200020026b220336029897c08000410041002802a097c08000220020" + "026a22063602a097c0800020062003410172360204200020024103723602" + "04200041086a21000c060b410028029c97c0800021030240024020002002" + "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" + "20032000410372360204200320006a220020002802044101723602040c01" + "0b4100200636029497c080004100200320026a220136029c97c080002001" + "2006410172360204200320006a2006360200200320024103723602040b20" + "0341086a0f0b2000200720086a360204410041002802a097c08000220041" + "0f6a417871220341786a22063602a097c080004100200020036b41002802" + "9897c0800020086a22036a41086a220136029897c0800020062001410172" + "360204200020036a4128360204410041808080013602ac97c080000c030b" + "410020003602a097c080004100410028029897c0800020036a2203360298" + "97c08000200020034101723602040c010b4100200036029c97c080004100" + "410028029497c0800020036a220336029497c08000200020034101723602" + "04200020036a20033602000b200141086a0f0b41002100410028029897c0" + "8000220320024d0d004100200320026b220336029897c080004100410028" + "02a097c08000220020026a22063602a097c0800020062003410172360204" + "20002002410372360204200041086a0f0b20000b4301017f238080808000" + "41206b2201248080808000200141003602182001410136020c200141d085" + "c0800036020820014204370210200141086a200010a480808000000b4e01" + "037f024020012802042202200128020822034e0d0020012003417f6a2204" + "36020820012802002d000020044107717641017110a38080800021040b20" + "0020043a0001200020022003483a00000b18002001200085220042002000" + "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" + "0202017f017e23808080800041f0006b2206248080808000200620013602" + "0c2006200036020820062003360214200620023602102006410236021c20" + "0641c08dc08000360218024020042802000d002006410336025c200641f4" + "8dc08000360258200642033702642006418280808000ad42208622072006" + "41106aad8437034820062007200641086aad843703402006418380808000" + "ad422086200641186aad843703382006200641386a360260200641d8006a" + "200510a480808000000b200641206a41106a200441106a29020037030020" + "0641206a41086a200441086a290200370300200620042902003703202006" + "410436025c200641a88ec080003602582006420437026420064182808080" + "00ad4220862207200641106aad8437035020062007200641086aad843703" + "482006418480808000ad422086200641206aad8437034020064183808080" + "00ad422086200641186aad843703382006200641386a360260200641d800" + "6a200510a480808000000bb30301037f2380808080004180016b22022480" + "8080800020002802002100024002400240200128021422034110710d0020" + "03412071450d0120002d0000210341810121000340200220006a417e6a20" + "03410f712204413072200441376a2004410a491b3a0000200341ff017122" + "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" + "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" + "00210341810121000340200220006a417e6a2003410f7122044130722004" + "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" + "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" + "810120006b10d58080800021000c010b024002400240024020002d000022" + "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" + "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" + "0d01200321040b200220006a20044130723a00000c010b41012100200220" + "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" + "0041037310d58080800021000b20024180016a24808080800020000bb605" + "01087f20002802142205410171220620046a21070240024020054104710d" + "00410021010c010b0240024020020d00410021080c010b02402002410371" + "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" + "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" + "8080c40020061b2106024020002802000d000240200028021c220a200028" + "0220220820062001200210f480808000450d0041010f0b200a2003200420" + "0828020c11808080800080808080000f0b02400240024002402000280204" + "220a20074b0d00200028021c220a2000280220220820062001200210f480" + "808000450d0141010f0b2005410871450d01200028021021052000413036" + "021020002d0018210b4101210c200041013a0018200028021c2208200028" + "0220220920062001200210f4808080000d02200a20076b41016a210a0240" + "0340200a417f6a220a450d01200841302009280210118180808000808080" + "8000450d000b41010f0b0240200820032004200928020c11808080800080" + "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" + "0a20032004200828020c1180808080008080808000210c0c010b200a2007" + "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" + "01020b2005210a410021050c010b2005410176210a200541016a41017621" + "050b200a41016a210a2000280210210720002802202108200028021c2109" + "02400340200a417f6a220a450d0120092007200828021011818080800080" + "80808000450d000b41010f0b4101210c2009200820062001200210f48080" + "80000d00200920032004200828020c11808080800080808080000d004100" + "210a034002402005200a470d0020052005490f0b200a41016a210a200920" + "0720082802101181808080008080808000450d000b200a417f6a2005490f" + "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" + "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" + "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" + "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" + "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" + "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" + "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" + "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" + "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" + "83420020057d2205200e83843703282000200c2002832005200d83843703" + "202000200a2002832005200b838437031820002008200283200520098384" + "370310200020062002832005200783843703082000200320028320052004" + "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" + "80800021010b20002002360204200020013602000b5a01017f2380808080" + "0041106b2202248080808000200241086a20002000280200410141a00210" + "8b80808000024020022802082200418180808078460d002000200228020c" + "2001108c80808000000b200241106a2480808080000b4800200020012002" + "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" + "80808000200020022d00c00120012d00c001220273410020036b71200273" + "3a00c0010b2b00200020012002200310b080808000200020022d00602001" + "2d0060220273410020036b712002733a00600b8501002000290300200129" + "030010d1808080002000290308200129030810d1808080007110a3808080" + "002000290310200129031010d1808080007110a380808000200029031820" + "0129031810d1808080007110a3808080002000290320200129032010d180" + "8080007110a3808080002000290328200129032810d1808080007110a380" + "8080000bda0602017f067e23808080800041306b22022480808080002002" + "2001290000220342388620034280fe0383422886842003428080fc078342" + "1886200342808080f80f834208868484200342088842808080f80f832003" + "421888428080fc07838420034228884280fe038320034238888484842204" + "37032820022001290008220342388620034280fe03834228868420034280" + "80fc0783421886200342808080f80f834208868484200342088842808080" + "f80f832003421888428080fc07838420034228884280fe03832003423888" + "848484220537032020022001290010220342388620034280fe0383422886" + "842003428080fc0783421886200342808080f80f83420886848420034208" + "8842808080f80f832003421888428080fc07838420034228884280fe0383" + "2003423888848484220637031820022001290018220342388620034280fe" + "0383422886842003428080fc0783421886200342808080f80f8342088684" + "84200342088842808080f80f832003421888428080fc0783842003422888" + "4280fe038320034238888484842207370310200220012900202203423886" + "20034280fe0383422886842003428080fc0783421886200342808080f80f" + "834208868484200342088842808080f80f832003421888428080fc078384" + "20034228884280fe03832003423888848484220837030820022001290028" + "220342388620034280fe0383422886842003428080fc0783421886200342" + "808080f80f834208868484200342088842808080f80f8320034218884280" + "80fc07838420034228884280fe0383200342388884848422033703002002" + "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" + "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" + "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" + "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" + "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" + "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" + "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" + "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" + "3010868180800020013a0030200241306a2480808080000b3901017f2380" + "8080800041306b220224808080800020022000200110a780808000200020" + "0241301086818080001a200241306a2480808080000b9b1602017f177e23" + "808080800041a0056b2201248080808000200141b0046a20002903002202" + "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" + "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" + "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" + "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" + "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" + "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" + "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" + "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" + "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" + "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" + "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" + "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" + "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" + "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" + "0129039004220720002903107c2208200141a0046a41086a290300200520" + "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" + "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" + "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" + "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" + "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" + "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" + "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" + "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" + "200129038004220b20002903187c220420014190046a41086a2903002008" + "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" + "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" + "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" + "6a20012903b002220d20012903f003220e20002903207c22062001418004" + "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" + "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" + "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" + "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" + "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" + "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" + "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" + "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" + "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" + "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" + "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" + "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" + "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" + "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" + "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" + "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" + "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" + "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" + "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" + "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" + "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" + "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" + "808000200141b0016a41086a290300210d20014190026a41086a29030021" + "0e200141f0026a41086a2903002111200141086a290300211220012903e0" + "022113200129038002211420012903a001211520012903402116200141c0" + "006a41086a2903002117200120012903502218200141e0036a41086a2903" + "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" + "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" + "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" + "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" + "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" + "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" + "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" + "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" + "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" + "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" + "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" + "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" + "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" + "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" + "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" + "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" + "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" + "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" + "20012903207c2202200141306a41086a2903002006200454ad7c20082006" + "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" + "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" + "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" + "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" + "f0046a10d68080800020012903c004220342aad580808080a080237c2003" + "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" + "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" + "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" + "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" + "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" + "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" + "423f872203200320012903e80422057c2203200554ad7c200342b399809a" + "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" + "2100200141a0056a24808080800020000bb60103037f017e017f23808080" + "800041e0006b2203248080808000200341e086c080004130108681808000" + "2104200241306a21050240034020052002460d01200541786a2205290300" + "2106413f210303402003417f460d01200441306a200410bd808080002004" + "200441306a41301086818080002107024020062003413f71ad8842018350" + "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" + "301086818080001a200441e0006a2480808080000b1c00200010a9808080" + "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" + "7e017f027e23808080800041f0016b220324808080800041002104420021" + "05420021064200210742002108420021094200210a02400340200441054b" + "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" + "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" + "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" + "200441e8006a2903004200200f420010878180800020034190016a200441" + "f0006a2903004200200f420010878180800020034180016a200441f8006a" + "2903004200200f4200108781808000200341f0006a20044180016a290300" + "4200200f4200108781808000200341e0006a20044188016a290300420020" + "0f4200108781808000200d200341e0006a41086a29030020032903602210" + "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" + "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" + "01221020087c2209201054ad7c200920034190016a41086a290300200329" + "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" + "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" + "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" + "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" + "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" + "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" + "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" + "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" + "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" + "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" + "bdc4801a4200108781808000200d200341086a2903002003290300221020" + "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" + "097c220a201054ad7c200a200341206a41086a2903002003290320221020" + "087c2209201054ad7c2009200341306a41086a2903002003290330221020" + "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" + "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" + "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" + "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" + "2003200a3703e801200320093703e001200320083703d801200320073703" + "d001200320063703c801200320053703c0012000200341c0016a10d68080" + "8000200341f0016a2480808080000b1c002000200110b280808000200041" + "306a200141306a10b2808080000be20103037f017e017f23808080800041" + "c0016b2203248080808000200341306a410041301085818080001a200341" + "e086c0800041301086818080002104200241306a21050240034020052002" + "460d01200541786a22052903002106413f210303402003417f460d012004" + "41e0006a200410ba808080002004200441e0006a41e00010868180800021" + "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" + "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" + "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" + "000b900202017f017e23808080800041b0036b2202248080808000200241" + "004130108581808000220241e0006a410041301085818080001a20024130" + "6a41e086c0800041301086818080001a20024190016a2001419001108681" + "8080001a42808082808080a080e90021030240034020034200510d012002" + "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" + "011086818080001a02402003420183500d00200241a0026a200220024190" + "016a10c7808080002002200241a0026a4190011086818080001a0b200342" + "018821030c000b0b200241a0026a200210e58080800020002002200241a0" + "026a41900110868180800022024190011086818080001a200241b0036a24" + "80808080000b3400200041306a200141306a10b280808000200041e0006a" + "200141e0006a41301086818080001a2000200141301086818080001a0b6b" + "01037f23808080800041106b22022480808080000240024020012802000d" + "00410021030c010b200241086a200110d0808080004101210320022d0009" + "210420022d00080d0041002103200141003602000b200020043a00012000" + "20033a0000200241106a2480808080000b7501027f23808080800041e000" + "6b2201248080808000200141306a410041301085818080001a200141e086" + "c0800041301086818080002101410110a38080800021022000410041e000" + "108581808000220041e0006a200141e0001086818080001a200020023a00" + "c001200141e0006a2480808080000b920101017f23808080800041c0016b" + "2202248080808000200041e0006a200141e0006a41e0001086818080001a" + "200241306a410041301085818080001a200241e086c08000413010868180" + "8000220241e0006a410041e0001085818080001a200041c0016a20022002" + "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" + "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" + "24808080800020042001200210b380808000200441e0006a200141e0006a" + "2205200310b38080800020044180036a200141c0016a2206200310b38080" + "8000200441a0026a20044180036a20044180036a41306a220710b8808080" + "00200441a0026a41306a20044180036a200710b9808080002000200441a0" + "026a200410bc80808000200441a0026a2002200310bc8080800020044180" + "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" + "10b38080800020044180036a200441c0016a200410bb80808000200041e0" + "006a20044180036a200441e0006a10bb8080800020044180036a20062002" + "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" + "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" + "8080800041f0016b22032480808080004100210442002105420021064200" + "210742002108420021094200210a02400340200441054b0d012004200441" + "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" + "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" + "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" + "03004200200f420010878180800020034190016a200441b0026a29030042" + "00200f420010878180800020034180016a200441b8026a2903004200200f" + "4200108781808000200341f0006a200441c0026a2903004200200f420010" + "8781808000200341e0006a200441c8026a2903004200200f420010878180" + "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" + "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" + "1054ad7c200a20034180016a41086a290300200329038001221020087c22" + "09201054ad7c200920034190016a41086a29030020032903900122102007" + "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" + "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" + "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" + "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" + "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" + "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" + "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" + "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" + "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" + "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" + "8781808000200d200341086a29030020032903002210200a7c220f201054" + "ad7c200f200341106a41086a2903002003290310221020097c220a201054" + "ad7c200a200341206a41086a2903002003290320221020087c2209201054" + "ad7c2009200341306a41086a2903002003290330221020077c2208201054" + "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" + "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" + "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" + "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" + "01200320093703e001200320083703d801200320073703d0012003200637" + "03c801200320053703c0012000200341c0016a10d680808000200341f001" + "6a2480808080000bdc0101027f2380808080004180036b22032480808080" + "002003200110ba80808000200341e0006a200210ba80808000200341c001" + "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" + "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" + "808000200341c0016a2001200210bc80808000200341a0026a200341c001" + "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" + "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" + "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" + "41e0006b220224808080800020022000200110bb808080002000200241e0" + "001086818080001a200241e0006a2480808080000b9f0701037f23808080" + "800041a0116b2201248080808000200141a0026a200010ba808080002001" + "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" + "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" + "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" + "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" + "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" + "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" + "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" + "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" + "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" + "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" + "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" + "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" + "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" + "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" + "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" + "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" + "00210220014180096a200141e0036a200141e0036a10bc80808000200141" + "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" + "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" + "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" + "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" + "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" + "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" + "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" + "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" + "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" + "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" + "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" + "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" + "0010ee80808000200141a0116a2480808080000b4201017f024020002802" + "0822032000280200470d002000200210d8808080000b2000280204200341" + "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" + "7f23808080800041106b2202248080808000200241988cc0800036020c20" + "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" + "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" + "0324808080800020032001360204200320003602002003410236020c2003" + "41a08dc08000360208200342023702142003418580808000ad4220862204" + "2003ad8437032820032004200341046aad843703202003200341206a3602" + "10200341086a200210a480808000000b0f002000280200200110f2808080" + "000be10201067f23808080800041106b2202248080808000410a21030240" + "024020004190ce004f0d00200021040c010b410a21030340200241066a20" + "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" + "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" + "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" + "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" + "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" + "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" + "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" + "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" + "03417f6a22036a20004130723a00000b200141014100200241066a20036a" + "410a20036b10d5808080002100200241106a24808080800020000b380201" + "7f017e23808080800041106b220124808080800020002902002102200120" + "0036020c20012002370204200141046a108181808000000b490002402002" + "418080c400460d002000200220012802101181808080008080808000450d" + "0041010f0b024020030d0041000f0b200020032004200128020c11808080" + "800080808080000b7902017f017e23808080800041306b22032480808080" + "0020032001360204200320003602002003410236020c2003419c91c08000" + "360208200342023702142003418580808000ad4220862204200341046aad" + "84370328200320042003ad843703202003200341206a360210200341086a" + "200210a480808000000b1c0020002802002001200028020428020c118180" + "80800080808080000b14002001200028020020002802041092808080000b" + "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" + "800041306b22032480808080002003200136022c20032000360228200341" + "033a00242003422037021c41002104200341003602142003410036020c02" + "400240024002400240200228021022050d00200228020c2200450d012002" + "280208220120004103746a21062000417f6a41ffffffff017141016a2104" + "2002280200210003400240200041046a2802002207450d00200328022820" + "002802002007200328022c28020c11808080800080808080000d040b2001" + "2802002003410c6a200141046a28020011818080800080808080000d0320" + "0041086a2100200141086a22012006470d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" + "2109200228020021004100210703400240200041046a2802002201450d00" + "200328022820002802002001200328022c28020c11808080800080808080" + "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" + "00003a00242003200141186a2802003602202001410c6a28020021064100" + "210a4100210b024002400240200141086a2802000e03010002010b200641" + "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" + "210b0b200320063602102003200b36020c200141046a2802002106024002" + "40024020012802000e03010002010b2006410374210b2009200b6a220b28" + "02000d01200b28020421060b4101210a0b200320063602182003200a3602" + "142009200141146a2802004103746a22012802002003410c6a200141046a" + "28020011818080800080808080000d02200041086a21002008200741206a" + "2207470d000b0b200420022802044f0d0120032802282002280200200441" + "03746a22012802002001280204200328022c28020c118080808000808080" + "8000450d010b410121010c010b410021010b200341306a24808080800020" + "010b6001027f20002802042102200028020021030240200028020822002d" + "0000450d00200341f48ec080004104200228020c11808080800080808080" + "00450d0041010f0b20002001410a463a0000200320012002280210118180" + "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" + "017f017e23808080800041306b2203248080808000200320013602042003" + "20003602002003410236020c200341d091c0800036020820034202370214" + "2003418580808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b" + "ab0201037f2380808080004180016b220224808080800020002802002100" + "024002400240200128021422034110710d0020034120710d012000280200" + "200110f28080800021000c020b2000280200210041810121030340200220" + "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" + "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" + "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" + "0b2000280200210041810121030340200220036a417e6a2000410f712204" + "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" + "042000410476210020040d000b200141fd8ec080004102200220036a417f" + "6a41810120036b10d58080800021000b20024180016a2480808080002000" + "0b0900200041003602000b990101027f23808080800041106b2204248080" + "808000410041002802f093c08000220541016a3602f093c0800002402005" + "4100480d000240024041002d00bc97c080000d00410041002802b897c080" + "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" + "41086a200020011182808080008080808000000b410041003a00bc97c080" + "002002450d00108081808000000b000b0300000b0b002000108281808000" + "000bba0101037f23808080800041106b2201248080808000200028020022" + "0228020c2103024002400240024020022802040e020001020b20030d0141" + "012102410021030c020b20030d0020022802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c200141868080" + "8000200028020822002d000820002d000910ff80808000000b2001200336" + "0204200120023602002001418780808000200028020822002d000820002d" + "000910ff80808000000b0c00200020012902003703000bc30201047f411f" + "21020240200141ffffff074b0d002001410620014108766722026b764101" + "7120024101746b413e6a21020b200042003702102000200236021c200241" + "027441f493c080006a21030240410028029097c080004101200274220471" + "0d0020032000360200200020033602182000200036020c20002000360208" + "4100410028029097c0800020047236029097c080000f0b02400240024020" + "0328020022042802044178712001470d00200421020c010b200141004119" + "20024101766b2002411f461b742103034020042003411d764104716a4110" + "6a22052802002202450d0220034101742103200221042002280204417871" + "2001470d000b0b20022802082203200036020c2002200036020820004100" + "3602182000200236020c200020033602080f0b2005200036020020002004" + "3602182000200036020c200020003602080baa0301057f02400240200241" + "104f0d00200021030c010b02402000410020006b41037122046a22052000" + "4d0d002004417f6a21062000210302402004450d00200421072000210303" + "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" + "490d000340200320013a0000200341076a20013a0000200341066a20013a" + "0000200341056a20013a0000200341046a20013a0000200341036a20013a" + "0000200341026a20013a0000200341016a20013a0000200341086a220320" + "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" + "41ff017141818284086c2107034020052007360200200541046a22052003" + "490d000b0b200241037121020b02402003200320026a22074f0d00200241" + "7f6a2104024020024107712205450d000340200320013a0000200341016a" + "21032005417f6a22050d000b0b20044107490d000340200320013a000020" + "0341076a20013a0000200341066a20013a0000200341056a20013a000020" + "0341046a20013a0000200341036a20013a0000200341026a20013a000020" + "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" + "7f02400240200241104f0d00200021030c010b02402000410020006b4103" + "7122046a220520004d0d002004417f6a2106200021032001210702402004" + "450d002004210820002103200121070340200320072d00003a0000200741" + "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" + "40200320072d00003a0000200341016a200741016a2d00003a0000200341" + "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" + "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" + "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" + "3a0000200741086a2107200341086a22032005470d000b0b200520022004" + "6b2208417c7122066a210302400240200120046a22074103710d00200520" + "034f0d0120072101034020052001280200360200200141046a2101200541" + "046a22052003490d000c020b0b200520034f0d0020074103742202411871" + "21042007417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220047620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20084103712102200720066a21010b" + "02402003200320026a22054f0d002002417f6a2108024020024107712207" + "450d000340200320012d00003a0000200141016a2101200341016a210320" + "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" + "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" + "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" + "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" + "00003a0000200341076a200141076a2d00003a0000200141086a21012003" + "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" + "2205200142ffffffff0f8322067e22072003422088220820067e22062005" + "200142208822097e7c22054220867c220a3703002000200820097e200520" + "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" + "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" + "026a2103200020026a210420024110490d014100200441037122056b2106" + "02402004417c71220720044f0d002005417f6a21080240024020050d0020" + "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" + "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" + "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" + "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" + "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" + "09417c7122026b2104410020026b210a02400240200320066a2203410371" + "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" + "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" + "002003410374220241187121052003417c712208417c6a2101410020026b" + "41187121062008280200210203402007417c6a2207200220067420012802" + "002202200576723602002001417c6a210120042007490d000b0b20094103" + "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" + "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" + "20002104200121070240200a450d00200a21032000210420012107034020" + "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" + "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" + "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" + "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" + "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" + "0441076a200741076a2d00003a0000200741086a2107200441086a220420" + "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" + "0a6a22074103710d00200920044f0d012007210103402009200128020036" + "0200200141046a2101200941046a22092004490d000c020b0b200920044f" + "0d0020074103742202411871210a2007417c71220841046a210141002002" + "6b411871210620082802002102034020092002200a762001280200220220" + "067472360200200141046a2101200941046a22092004490d000b0b200341" + "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" + "03024020024107712207450d000340200420012d00003a0000200141016a" + "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" + "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" + "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" + "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" + "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" + "00200141086a2101200441086a22042009470d000c020b0b200420026b22" + "0720044f0d002002417f6a2109024020024103712201450d000340200441" + "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" + "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" + "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" + "00002004417c6a220420012d00003a00002001417c6a210120072004490d" + "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" + "000be8132f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f697465722f7472616974732f6974657261746f722e" + "72730000100058000000b307000009000000000000000000000001000000" + "0800000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f72757374632f346562313631" + "323530653334306338663438663636653262393239656634613562656437" + "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" + "73000000a30010004a000000a10000001900000054727946726f6d536c69" + "63654572726f720000000100000000000000d80210005e000000b4020000" + "090000002f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" + "0000f6050000150000007372632f6c69622e727300008c0110000a000000" + "1f000000160000008c0110000a00000028000000310000008c0110000a00" + "000028000000440000004661696c656420746f20646573657269616c697a" + "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" + "0000440000008c0110000a000000620000001f0000008c0110000a000000" + "630000000a0000008c0110000a00000064000000170000008c0110000a00" + "0000650000000a0000008c0110000a00000066000000170000008c011000" + "0a000000670000000a0000004661696c656420746f20646573657269616c" + "697a6520614661696c656420746f20646573657269616c697a6520624661" + "696c656420746f20646573657269616c697a652063496e76616c69642062" + "7974657320666f72205363616c61726361706163697479206f766572666c" + "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f737562746c652d" + "322e362e312f7372632f6c69622e72730000000000000400000004000000" + "0900000001000000d80210005e000000bd0200000900000000000000fdff" + "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" + "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" + "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" + "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" + "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" + "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" + "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" + "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" + "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" + "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" + "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" + "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" + "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" + "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" + "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" + "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" + "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" + "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" + "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" + "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" + "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" + "34396366386336623562353537662f626c7331325f3338312d302e382e30" + "2f7372632f70616972696e67732e72730000a00510006600000016020000" + "1500000044000000a0051000660000001b02000009000000a00510006600" + "0000050200001d000000a005100066000000090200001d000000a0051000" + "660000003802000032000000a00510006600000044020000320000002969" + "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" + "20206275742074686520696e64657820697320006d061000200000008d06" + "1000120000000000000004000000040000000a0000003d3d617373657274" + "696f6e20606c6566742020726967687460206661696c65640a20206c6566" + "743a200a2072696768743a200000c206100010000000d206100017000000" + "e90610000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000c2061000100000000c071000100000001c07100009000000" + "e9061000090000003a200000010000000000000048071000020000000000" + "00000c000000040000000b0000000c0000000d000000202020202c0a2828" + "0a3078303030313032303330343035303630373038303931303131313231" + "333134313531363137313831393230323132323233323432353236323732" + "383239333033313332333333343335333633373338333934303431343234" + "333434343534363437343834393530353135323533353435353536353735" + "383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939617474656d7074" + "20746f20646976696465206279207a65726f4708100019000000206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820" + "72616e676520656e6420696e6465782000008a0810001000000068081000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e64732061742000ac08100016000000c20810000d00000028292f72" + "757374632f34656231363132353065333430633866343866363665326239" + "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" + "7372632f7261775f7665632e72730000e20810004c000000280200001100" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" + "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" + "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" + "4009100029000000a804000009000000617373657274696f6e206661696c" + "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" + "616400004009100029000000ae0400000d00000000c94e046e616d65000e" + "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" + "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" + "4d6170244c5424492443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f72244754243973697a655f68696e7431376833383630386236" + "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" + "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" + "5f62795f7a65726f3137683033346433623765633138373166373545024d" + "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" + "247761736d5f6c69622e2e566572696679696e674b657924475424313768" + "393064303131346662343063613937644503475f5a4e35616c6c6f633772" + "61775f7665633230526177566563496e6e6572244c542441244754243130" + "6465616c6c6f636174653137683235303163353461663065323831336145" + "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" + "5424313768663462323737666433376462353031654505565f5a4e34636f" + "726533707472353264726f705f696e5f706c616365244c5424626c733132" + "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" + "313768623964653634383231343939353539344506675f5a4e34636f7265" + "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" + "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" + "2e5363616c61722447542424475424313768376265333235646130373238" + "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" + "244324412447542434707573683137686236356465366561306165303964" + "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" + "244c54245424432441244754243867726f775f6f6e653137686531306535" + "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" + "395f244c5424696d706c2475323024247535622454247535642424475424" + "36746f5f76656331376836333665656464383765653761373437450a4d5f" + "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" + "4c542441244754243136776974685f63617061636974795f696e31376861" + "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" + "775f7665633230526177566563496e6e6572244c54244124475424313467" + "726f775f616d6f7274697a65643137686439353064656131373163323030" + "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" + "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" + "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" + "633230526177566563496e6e6572244c5424412447542431357472795f61" + "6c6c6f636174655f696e3137686534626630623334333637646136646345" + "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" + "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" + "6974682e2e4e656724475424336e65673137683434323138626332316532" + "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" + "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" + "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" + "696f6e616c5f73656c656374313768386165306466613830666434313139" + "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" + "46726f6d536c6963654572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863303634386262" + "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" + "747465723370616431376833316663303133336231396665333065451367" + "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" + "2e50616441646170746572247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376834353537" + "3732653638643462343039364514385f5a4e36737562746c65313743744f" + "7074696f6e244c5424542447542436657870656374313768623863663632" + "323139313530313333334515495f5a4e34345f244c542424524624542475" + "32302461732475323024636f72652e2e666d742e2e446973706c61792447" + "542433666d74313768353633396538653836623831393165364516355f5a" + "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" + "64313768393337633632373834633734396537664517385f5a4e36737562" + "746c65313743744f7074696f6e244c542454244754243665787065637431" + "3768633764316533383030323138386237654518705f5a4e38315f244c54" + "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" + "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" + "6e646578244c542449244754242447542435696e64657831376862376565" + "6135613738316438393239374519405f5a4e34636f726535736c69636535" + "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" + "376866663036393161306536326561633864451a425f5a4e34636f726535" + "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" + "656e5f6661696c31376861383936346133343065666132346537451b0861" + "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" + "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" + "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" + "325f333831326731384731416666696e65313566726f6d5f636f6d707265" + "7373656431376832333963336331363436646339303436451f355f5a4e38" + "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" + "37683530336430613839336365653362666645203e5f5a4e39626c733132" + "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" + "7365643137686333616566303334336638323663626245211462656c6c6d" + "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" + "367363616c6172365363616c617233737562313768656363643066636134" + "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" + "313768633661663135363636663731396234384524305f5a4e34636f7265" + "3970616e69636b696e673970616e69635f666d7431376862393162616461" + "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" + "3338312e2e67312e2e473150726f6a656374697665247532302461732475" + "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" + "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" + "243466726f6d3137686634356430353636343237373335316445262e5f5a" + "4e39626c7331325f33383132667032467036696e76657274313768366335" + "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" + "6670324670336d756c313768646666623336663036373139613633374528" + "365f5a4e39626c7331325f333831326731384731416666696e6538696465" + "6e746974793137686236366162643638326233626339356345292f5f5a4e" + "39626c7331325f3338313266703246703769735f7a65726f313768333962" + "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" + "325f3338312e2e67312e2e4731416666696e652475323024617324753230" + "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" + "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" + "323735393935653930646636613863452b85015f5a4e3130325f244c5424" + "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" + "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" + "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" + "475424244754243466726f6d313768353930643863663565363536346465" + "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" + "6531376839346666616330666264306163343332452d90015f5a4e313033" + "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" + "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" + "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" + "6f6f70447269766572244754243133646f75626c696e675f737465703137" + "6833346536393232613038346336343933452e705f5a4e38315f244c5424" + "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" + "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" + "646578244c542449244754242447542435696e6465783137686539346538" + "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" + "6972696e677333656c6c3137683264393865303762336132336635313345" + "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e646974696f6e" + "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" + "6c5f73656c6563743137686366633738633362393036656661383945315a" + "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" + "656724475424336e65673137686230666536353636326461326334343345" + "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" + "363566633733316133386134393745332d5f5a4e39626c7331325f333831" + "3366703233467032336d756c313768326433373464346666306563343037" + "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" + "467036247532302461732475323024636f72652e2e6f70732e2e61726974" + "682e2e4d756c24475424336d756c31376865613934393735323931313764" + "3166634535305f5a4e39626c7331325f3338313366703633467036367371" + "756172653137683866633831663539663666313530643145363c5f5a4e39" + "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" + "6573696475653137686432663865613131393236643732653945375a5f5a" + "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" + "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" + "24475424337375623137686137396663636566323762323631323445382b" + "5f5a4e39626c7331325f3338313266703246703373756231376865646439" + "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" + "703246703361646431376863366562626430363731666432643965453a30" + "5f5a4e39626c7331325f3338313366703233467032367371756172653137" + "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" + "333831336670323346703233737562313768636330663365343532313765" + "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" + "646431376864363030363832376137333934646563453d2e5f5a4e39626c" + "7331325f3338313266703246703673717561726531376835616337663530" + "666666393136623065453e605f5a4e36375f244c542424524624626c7331" + "325f3338312e2e667031322e2e4670313224753230246173247532302463" + "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" + "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" + "626c7331325f3338312e2e667031322e2e46703132247532302461732475" + "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" + "2447542431306d756c5f61737369676e3137683037326534616130343436" + "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" + "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" + "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" + "3768613463633461633966316338323538644541635f5a4e39626c733132" + "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" + "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" + "6f746f6d69635f6578703137686166636437313637356662666432373645" + "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e7374616e7454" + "696d654571244754243563745f6571313768316264323735363036643361" + "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" + "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" + "726974682e2e416464244754243361646431376835343330336164316564" + "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" + "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" + "4c542449244324552443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f7224475424346e657874313768633964373737363930666232" + "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" + "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" + "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" + "637469766536646f75626c65313768386366636435343461313633326664" + "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" + "74697665336164643137686338666437656633383137383263636145487c" + "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024737562746c652e2e436f6e" + "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" + "6974696f6e616c5f73656c65637431376839346663383463303336386533" + "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" + "6c6d616c6c6f63244c542441244754243466726565313768623937643238" + "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" + "673570616e696331376832323065356136376635653365303666454b0e5f" + "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" + "696e6b5f6368756e6b31376831623634356162376339333032303939454d" + "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c542441244754243133646973706f73655f6368756e6b31376832" + "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" + "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" + "35616c6c6f63377261775f766563313763617061636974795f6f76657266" + "6c6f7731376863393936333961626361313337633131455085015f5a4e31" + "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" + "61702e2e4d6170244c542449244324462447542424753230246173247532" + "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" + "2e2e4974657261746f7224475424346e6578743137683161356136633566" + "303263666237373445514d5f5a4e34365f244c5424753634247532302461" + "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" + "54243563745f657131376839613065366130383065643661303532455253" + "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" + "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" + "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" + "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" + "6e6e6572313768363939386636356530343630623966324554475f5a4e34" + "325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866396562386538303434" + "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" + "7231327061645f696e74656772616c313768336538303336383966363939" + "303466334556335f5a4e39626c7331325f33383132667032467031307375" + "6274726163745f7031376833353337643137643839306564373430455736" + "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" + "696d706c313768636263383565313966363066396565314558435f5a4e35" + "616c6c6f63377261775f7665633139526177566563244c54245424432441" + "244754243867726f775f6f6e653137683761366133613131343862316565" + "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" + "4732416666696e65247532302461732475323024737562746c652e2e436f" + "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" + "646974696f6e616c5f73656c656374313768346631633532376163323663" + "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" + "696f6e244c54245424475424247532302461732475323024737562746c65" + "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" + "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" + "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" + "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" + "6e7374616e7454696d654571244754243563745f65713137683764613737" + "3038613961336631623237455c335f5a4e39626c7331325f333831326670" + "324670313066726f6d5f6279746573313768663632643265653863383835" + "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" + "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" + "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" + "376862613864393933386331336334313962455e425f5a4e39626c733132" + "5f33383132667032467032356c657869636f67726170686963616c6c795f" + "6c61726765737431376864623239383362653765626662373630455f345f" + "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" + "65313768386339643861353637336531663765654560315f5a4e39626c73" + "31325f33383133667032334670323769735f7a65726f3137683232633162" + "33626231383039373337664561385f5a4e39626c7331325f333831326670" + "324670313573756d5f6f665f70726f647563747331376864373831613962" + "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" + "467032336e6567313768336535623432323139303537623839334563365f" + "5a4e39626c7331325f33383133667032334670323131706f775f76617274" + "696d653137683839356266623030643732663461646145643b5f5a4e3962" + "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" + "62795f78313768313830336335636330383333313036354565665f5a4e37" + "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" + "61726974682e2e4e656724475424336e6567313768363961333962383136" + "613036626237614566455f5a4e34636f7265346974657238616461707465" + "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" + "3768373932316661373530366638613637624567365f5a4e39626c733132" + "5f333831326732384732416666696e65386964656e746974793137683532" + "3261303037353662633832613639456885015f5a4e3130325f244c542462" + "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" + "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" + "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" + "5424244754243466726f6d31376831393034396666373534383632623533" + "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" + "795f303131376837316231356266356135313961376133456a385f5a4e39" + "626c7331325f333831326670324670313573756d5f6f665f70726f647563" + "747331376862306665663033383436356461336561456b5e5f5a4e39626c" + "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" + "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" + "345f73717561726531376835333530613232303537323261303037456c68" + "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" + "756241737369676e2447542431307375625f61737369676e313768656138" + "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" + "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" + "726564247532302461732475323024636f72652e2e636f6e766572742e2e" + "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" + "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" + "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" + "724c6f6f70447269766572244754243133646f75626c696e675f73746570" + "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" + "63337665633136566563244c542454244324412447542434707573683137" + "6836633466633030383766393064366561456f355f5a4e34636f72653970" + "616e69636b696e6731336173736572745f6661696c656431376838396134" + "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" + "696e67313870616e69635f626f756e64735f636865636b31376835613339" + "3334316633393435306165354571625f5a4e34636f726533666d74336e75" + "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" + "2e2e446973706c61792475323024666f7224753230247533322447542433" + "666d74313768646131373032323936653330396138624572445f5a4e3463" + "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" + "2475333224475424345f666d743137686531613333633761616434313031" + "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" + "726533666d7439466f726d617474657231327061645f696e74656772616c" + "313277726974655f70726566697831376865323164633232613535336139" + "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" + "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" + "633772756e74696d65313768623465303239633465666136373431314576" + "475f5a4e34325f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e44656275672447542433666d743137683763663234" + "64633163663734653663354577495f5a4e34345f244c5424245246245424" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363963313766643162653433346236384578585f" + "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768356530663632333530333933336330664579265f" + "5a4e34636f726533666d7435777269746531376862633530306361396130" + "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" + "6275696c646572732e2e5061644164617074657224753230246173247532" + "3024636f72652e2e666d742e2e577269746524475424313077726974655f" + "6368617231376837323761393336343062616631636662457b305f5a4e34" + "636f726533666d743557726974653977726974655f666d74313768653264" + "32326663306535326231396336457c515f5a4e34636f726535736c696365" + "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "38646f5f70616e69633772756e74696d6531376836346563303433376262" + "666263656363457d475f5a4e34325f244c54242452462454247532302461" + "732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "31376837396432393730376137363931633337457e375f5a4e34636f7265" + "3570616e6963313250616e69635061796c6f61643661735f737472313768" + "33653762626665396537333233373036457f3b5f5a4e337374643970616e" + "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" + "68396561303139313462356439323635394580010a727573745f70616e69" + "638101455f5a4e3373746433737973396261636b747261636532365f5f72" + "7573745f656e645f73686f72745f6261636b747261636531376865376239" + "323038656534343338376436458201585f5a4e337374643970616e69636b" + "696e673139626567696e5f70616e69635f68616e646c657232385f247537" + "62242475376224636c6f7375726524753764242475376424313768393666" + "3161333534313164393334366245830183015f5a4e39395f244c54247374" + "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" + "6c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" + "54243661735f737472313768653362376630636337353061633833394584" + "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f636875" + "6e6b31376866646432333135363766663933346634458501066d656d7365" + "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" + "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" + "6830343030366431613866396435653532458901076d656d6d6f76650712" + "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" + "004d0970726f64756365727302086c616e6775616765010452757374000c" + "70726f6365737365642d6279010572757374631d312e38352e3120283465" + "6231363132353020323032352d30332d31352900490f7461726765745f66" + "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" + "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const sp1WasmHex = + "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" + "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" + "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" + "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" + "000000060100000001010107040800000000000102080202040101000505" + "00010502000a0b0c00010100000100000401040000010100000101000200" + "0100000107010202030d0e000405017001080805030100110619037f0141" + "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" + "790200147370315f67726f746831365f766572696669657200000a5f5f64" + "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" + "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" + "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" + "0120051b3a00000240200504400340024002400240200541016b0e030005" + "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" + "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" + "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" + "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" + "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" + "280200211241e0a5c000280200211f024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002" + "400240024002404184021001220a450d00200a41c1befe827c3600800220" + "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" + "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" + "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" + "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" + "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" + "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" + "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" + "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" + "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" + "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" + "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" + "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" + "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" + "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" + "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" + "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" + "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" + "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" + "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" + "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" + "00370000201d41286a4200370000201d41306a4200370000201d41376a42" + "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" + "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" + "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" + "200a280000470d002001418280c4003602e01c2001410036029c03200142" + "c080808020370294032001205241026a360290032001200141e01c6a3602" + "a003200141106a20014190036a100320012d0010044020012d0011210502" + "4020012802a003280200418280c400470d00200128029403450d00200128" + "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" + "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" + "053a0000200141013602a80c200120023602a40c200141083602a00c2001" + "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" + "0037030020012001290290033703a00f4101210503400240200141086a20" + "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" + "460440024020012802b00f280200418280c400470d0020012802a40f450d" + "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" + "220e280200220c4101742208200541016a220220022008491b2202200241" + "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" + "36021441010541000b360218200f41086a41012002200f41146a1028200f" + "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" + "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" + "20012802a40c21020b200220056a20063a00002001200541016a22053602" + "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" + "80c4004704402002450d02200641046b2802002205417871221241044108" + "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" + "0610040c020b2002418080808078460d0102400240024002402005412046" + "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" + "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" + "28000721262006280003213520062d0002212d20062d0001214720062d00" + "00214820020440200641046b2802002208417871220c4104410820084103" + "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" + "200141206a22062005290300370300200141286a220520232d00003a0000" + "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" + "2006290300370000200141cf006a20052d00003a0000201641086a200141" + "f8006a290000370000201641106a20014180016a29000037000020164118" + "6a20014188016a290000370000200120012d0070411f713a007020162001" + "2900703700002001202436003b2001202636003720012035360033200120" + "2d3a0032200120473a0031200120483a00302001200129031837003f200a" + "290014225742388620574280fe0383422886842057428080fc0783421886" + "205742808080f80f834208868484205742088842808080f80f8320574218" + "88428080fc07838420574228884280fe03832057423888848484215e200a" + "411c6a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" + "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" + "2886842058428080fc0783421886205842808080f80f8342088684842058" + "42088842808080f80f832058421888428080fc07838420584228884280fe" + "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" + "574280fe0383422886842057428080fc0783421886205742808080f80f83" + "4208868484205742088842808080f80f832057421888428080fc07838420" + "574228884280fe03832057423888848484225742a9c0c689aece93b23054" + "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" + "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" + "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" + "18200120573703b8182001205e3703a818200a2900342257423886205742" + "80fe0383422886842057428080fc0783421886205742808080f80f834208" + "868484205742088842808080f80f832057421888428080fc078384205742" + "28884280fe03832057423888848484215e200a413c6a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe038320574238888484842165417f200a290024225742" + "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" + "008584420052205842388620584280fe0383422886842058428080fc0783" + "421886205842808080f80f834208868484205842088842808080f80f8320" + "58421888428080fc07838420584228884280fe0383205842388884848422" + "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" + "57428080fc0783421886205742808080f80f834208868484205742088842" + "808080f80f832057421888428080fc07838420574228884280fe03832057" + "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" + "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" + "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" + "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" + "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" + "222420014188076a290300370000200141bd0c6a222620014180076a2903" + "00370000200141b50c6a2235200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022023290000370000200141851d6a22232024290000370000200141fd" + "1c6a22242026290000370000200141f51c6a222620352900003700002001" + "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" + "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" + "290000370300200141b80a6a2023290000370300200141b00a6a20242900" + "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" + "0054225742388620574280fe0383422886842057428080fc078342188620" + "5742808080f80f834208868484205742088842808080f80f832057421888" + "428080fc07838420574228884280fe038320574238888484842165200a41" + "dc006a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" + "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" + "422886842058428080fc0783421886205842808080f80f83420886848420" + "5842088842808080f80f832058421888428080fc07838420584228884280" + "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" + "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" + "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" + "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" + "fe0383422886842057428080fc0783421886205742808080f80f83420886" + "8484205742088842808080f80f832057421888428080fc07838420574228" + "884280fe03832057423888848484215a200a41fc006a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484215c417f200a290064225742" + "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" + "dd008584420052205842388620584280fe0383422886842058428080fc07" + "83421886205842808080f80f834208868484205842088842808080f80f83" + "2058421888428080fc07838420584228884280fe03832058423888848484" + "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" + "2057428080fc0783421886205742808080f80f8342088684842057420888" + "42808080f80f832057421888428080fc07838420574228884280fe038320" + "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" + "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" + "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" + "511b0d070b200a29009401225742388620574280fe038342288684205742" + "8080fc0783421886205742808080f80f8342088684842057420888428080" + "80f80f832057421888428080fc07838420574228884280fe038320574238" + "88848484215b200a419c016a290000225742388620574280fe0383422886" + "842057428080fc0783421886205742808080f80f83420886848420574208" + "8842808080f80f832057421888428080fc07838420574228884280fe0383" + "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" + "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" + "42388620584280fe0383422886842058428080fc07834218862058428080" + "80f80f834208868484205842088842808080f80f832058421888428080fc" + "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" + "91a8b87f54205742388620574280fe0383422886842057428080fc078342" + "1886205742808080f80f834208868484205742088842808080f80f832057" + "421888428080fc07838420574228884280fe038320574238888484842257" + "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" + "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" + "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" + "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" + "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" + "4180076a290300370300200120012903f0063703a00b200120533703a80b" + "200120623703900b2001206a3703800b200120593703f00a2001205c3703" + "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" + "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" + "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" + "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" + "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" + "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" + "2205200141f8066a22062903002257370000200141f80a6a20014188076a" + "2202290300370300200141f00a6a20014180076a22202903003703002001" + "20012903f0063703e00a200120573703e80a200141e0066a200910062001" + "2d00e0060d06200520062903002257370000200141b80b6a200229030037" + "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" + "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" + "222220014188076a290300370000200141bd0c6a220920014180076a2903" + "00370000200141b50c6a2223200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022020290000370000200141851d6a22202022290000370000200141fd" + "1c6a22222009290000370000200141f51c6a220920232900003700002001" + "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" + "2005290000370300200141c8086a2006290000370300200141c0086a2002" + "290000370300200141b8086a2020290000370300200141b0086a20222900" + "00370300200141a8086a2009290000370300200120012900ed1c3703a008" + "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" + "370300200141f8076a200141b80a6a29030037030020014180086a200141" + "c00a6a29030037030020014188086a200141c80a6a290300370300200141" + "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" + "370300200120012903a00a3703e007200141e0066a200141801f6a418001" + "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" + "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" + "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" + "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" + "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" + "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" + "00370300200141800c6a2065370300200141880c6a205e37030020014190" + "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" + "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" + "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" + "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" + "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" + "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" + "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" + "418001104c418001104c1a201241a002460d13201241a102460d14201241" + "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" + "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" + "8080808080023702a00b2005200641087472202041107472200241187472" + "220504404101200541187420054180fe03714108747220054108764180fe" + "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" + "b00f6a210641a40221024100212241102108410021200340202041f6ffff" + "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" + "012d00a00f0d0320052006290000370000200541386a2202200641386a29" + "0000370000200541306a2223200641306a290000370000200541286a2224" + "200641286a290000370000200541206a2226200641206a29000037000020" + "0541186a2235200641186a290000370000200541106a222d200641106a29" + "0000370000200541086a2247200641086a290000370000200141901f6a22" + "48202d290000370300200141981f6a222d2035290000370300200141a01f" + "6a22352026290000370300200141a81f6a22262024290000370300200141" + "b01f6a22242023290000370300200141b81f6a2223200229000037030020" + "0120052900003703801f200120472900003703881f20012802a00b202046" + "044041002108230041206b2203240002400240200141a00b6a221b280200" + "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" + "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" + "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" + "100541000b360218200341086a4110200e200341146a1028200328020841" + "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" + "0328020c210f201b2002360200201b200f360204200341206a2400200128" + "02a40b21080b200820226a220220012903801f370300200241386a202329" + "0300370300200241306a2024290300370300200241286a20262903003703" + "00200241206a2035290300370300200241186a202d290300370300200241" + "106a2048290300370300200241086a20012903881f370300200120204101" + "6a22203602a80b202241406b212220092102200c2020470d000b20012802" + "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" + "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" + "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" + "900c6a290300370100200141c6126a200141880c6a290300370100200141" + "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" + "370100200141ae126a200141f00b6a290300370100200141a6126a200129" + "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" + "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" + "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" + "410272200141e0066a41be03104c1a200120263602d006200120063a0091" + "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" + "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" + "6a2105200141306a2106410021120340230041206b22092400200941186a" + "221b2006290000225342388620534280fe0383422886842053428080fc07" + "83421886205342808080f80f834208868484205342088842808080f80f83" + "2053421888428080fc07838420534228884280fe03832053423888848484" + "370300200941106a2208200641086a290000225342388620534280fe0383" + "422886842053428080fc0783421886205342808080f80f83420886848420" + "5342088842808080f80f832053421888428080fc07838420534228884280" + "fe0383205342388884848437030020092006290010225342388620534280" + "fe0383422886842053428080fc0783421886205342808080f80f83420886" + "8484205342088842808080f80f832053421888428080fc07838420534228" + "884280fe038320534238888484843703082009200641186a290000225342" + "388620534280fe0383422886842053428080fc0783421886205342808080" + "f80f834208868484205342088842808080f80f832053421888428080fc07" + "838420534228884280fe0383205342388884848437030020094201420042" + "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" + "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" + "0300370300200c41186a2009290308370300200c20092903003703102009" + "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" + "2257370300200141f0066a200541106a2903002258370300200120052903" + "00225e3703e0062001200541086a29030022653703e80620202012410574" + "6a220641186a2057370300200641106a2058370300200641086a20653703" + "002006205e370300410121122002410171211f4101210220162106201f45" + "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" + "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" + "352005104c211220624203520d02206a428080808010540d042001419006" + "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" + "386a290300370300200141f01a6a2216201241306a290300370300200141" + "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" + "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" + "2224201241106a290300370300200120122903003703c01a200120124108" + "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" + "370300200141d00c6a2016290300370300200141c80c6a20222903003703" + "00200141c00c6a2009290300370300200141b80c6a202329030037030020" + "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" + "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" + "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" + "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" + "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" + "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" + "ffff01716a22422903002004290300832159204241086a29030020044108" + "6a29030083215302400240027f0240024002400240024020364101714504" + "4041002053205984500d061a200441e0006a200441206a29030037030020" + "0441e8006a200441286a290300370300200441f0006a202b290300370300" + "200441f8006a200441386a29030037030020044180016a200441406b2903" + "0037030020044188016a200441c8006a2903003703002004200429031037" + "035020042004290318370358202e0d010c030b202e450d0120044188026a" + "200441c8006a222e29030037030020044180026a200441406b2250290300" + "370300200441f8016a200441386a2203290300370300200e202b29030037" + "0300200441e8016a200441286a2236290300370300200441e0016a200441" + "206a2242290300370300200420042903183703d801200420042903103703" + "d001200441d8036a224b4200370300200441d0036a220242003703002004" + "42003703f803200442003703f003200442003703e803200442013703e003" + "200442003703c803200442003703c003024002400240200441d0016a2004" + "41c0036a104a450440200e200f104a450d010b204b420037030020024200" + "370300200442003703f803200442003703f003200442003703e803200442" + "013703e003200442003703c803200442003703c003027f0240200441d001" + "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" + "0300204941186a202b41186a290300370300204941106a202b41106a2903" + "00370300204941086a202b41086a290300370300200441a0026a20422903" + "00370300200441a8026a2036290300370300200420042903103703900220" + "0420042903183703980220082102204a0c010b204a4200370300200441a0" + "026a4200370300200441a8026a4200370300204a41086a4200370300204a" + "41106a4200370300204a41186a4200370300200442003703900220044200" + "37039802201b210220490b214b2002420037030820024200370300204b42" + "00370308204b4201370300200441c0036a20044190026a20044190026a10" + "40200441f0026a200441c0036a104120042802f002410171450d01200441" + "c8016a203741386a290300370300200441c0016a203741306a2903003703" + "00200441b8016a203741286a290300370300200441b0016a203741206a29" + "0300370300200441a8016a203741186a290300370300200441a0016a2037" + "41106a29030037030020042037290300370390012004203741086a290300" + "370398010c020b200441a0016a2042290300370300200441a8016a203629" + "0300370300200441b0016a202b290300370300200441b8016a2003290300" + "370300200441c0016a2050290300370300200441c8016a202e2903003703" + "00200420042903103703900120042004290318370398010c010b41c4a0c0" + "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" + "41a8016a290300370300202b200441b0016a2903003703002003200441b8" + "016a2903003703002050200441c0016a290300370300202e200441c8016a" + "290300370300200420042903900137031020042004290398013703182053" + "205984500d04200441e0006a2042290300370300200441e8006a20362903" + "00370300200441f0006a202b290300370300200441f8006a200329030037" + "030020044180016a205029030037030020044188016a202e290300370300" + "20042004290310370350200420042903183703580b200441c0036a200441" + "d0006a200c100c0c020b20532059844200520d002041450d044101213641" + "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" + "0c41306a290300370300200441e8036a200c41286a290300370300200f20" + "0c41206a290300370300200441d8036a200c41186a290300370300200441" + "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" + "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" + "41406b200441f0036a290300370300200441386a200441e8036a29030037" + "0300202b200f290300370300200441286a200441d8036a29030037030020" + "0441206a200441d0036a290300370300200420042903c803370318200420" + "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" + "c0001020000b204141016b21410c010b0b20312004290310370300203141" + "086a2004290318370300203141386a200441c8006a290300370300203141" + "306a200441406b290300370300203141286a200441386a29030037030020" + "3141206a200441306a290300370300203141186a200441286a2903003703" + "00203141106a200441206a290300370300200441a0046a2400200541206a" + "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" + "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" + "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" + "20014190026a100d200141a0186a21024200215c42002154420021532001" + "41e0066a220541386a2903002161200541286a290300215b200529033021" + "592005290320215e027e200529034022652005290350226a84200541c800" + "6a2903002262200541d8006a290300225a84845004402059215c20612154" + "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" + "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" + "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" + "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" + "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" + "3c205e7d0b21612002206a370350200220653703402002205c3703302002" + "20613703202002205a370358200220623703482002205437033820022053" + "37032820022005290300370300200241186a200541186a29030037030020" + "0241106a200541106a290300370300200241086a200541086a2903003703" + "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" + "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" + "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" + "00215c42002153024002400240200141801f6a2202290380012002418801" + "6a290300844200520d0020022903900120024198016a290300844200520d" + "0020022903a001200241a8016a290300844200520d0020022903b0012002" + "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" + "0300215e2002290370215420022903602161200229035022582002290340" + "226a84200241d8006a290300225a200241c8006a29030022628484420052" + "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" + "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" + "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" + "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" + "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" + "542061842059205e84844200520440427f4200427f4200206142788342c7" + "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" + "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" + "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" + "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" + "4180016a22052903003703800120082002290300370300200841b8016a20" + "0541386a290300370300200841b0016a200541306a290300370300200841" + "a8016a200541286a290300370300200841a0016a200541206a2903003703" + "0020084198016a200541186a29030037030020084190016a200541106a29" + "030037030020084188016a200541086a290300370300200841086a200241" + "086a290300370300200841106a200241106a290300370300200841186a20" + "0241186a290300370300200841206a200241206a29030037030020084128" + "6a200241286a290300370300200841306a200241306a2903003703002008" + "41386a200241386a2903003703002008205a370378200820623703702008" + "206a370368200820583703602008205c3703582008206537035020082053" + "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" + "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" + "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" + "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" + "023820004280808080800237023020004100360244200042808080808002" + "37023c41102133200041306a10362000280234223b200141a00f6a220341" + "e000104c1a20004101360238200341e0006a2102200028023c4504402000" + "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" + "022000410136024420002802304101460440200041306a10362000280234" + "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" + "2102200028023c41014604402000413c6a1038200028024021330b203341" + "c0016a200241c001104c1a200341c0046a21022000410236024420002802" + "304102460440200041306a10362000280234213b0b203b41c0016a200241" + "e000104c1a20004103360238200341a0056a2102200028023c4102460440" + "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" + "0341e0066a21022000410336024420002802304103460440200041306a10" + "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" + "200341c0076a2103200028023c41034604402000413c6a10382000280240" + "21330b203341c0046a200341c001104c1a20004104360244200041003602" + "502000428080808080023702482000410036025c20004280808080800237" + "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" + "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" + "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" + "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" + "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" + "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" + "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" + "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" + "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" + "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" + "002802b001410171450d00200041a00d6a2003104120002802a00d410171" + "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" + "00200041f0026a2213201041306a290300370300200041e8026a22092010" + "41286a290300370300200041e0026a2215201041206a2903003703002000" + "41d8026a220f201041186a290300370300200041d0026a2225201041106a" + "290300370300200020102903003703c0022000202e2903003703c8022000" + "280248203946044041002108230041206b220e240002400240200041c800" + "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" + "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" + "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" + "020436021441100541000b360218200e41086a2016200e41146a1037200e" + "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" + "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" + "00200028024c21050b200520394106746a220320002903c0023703002003" + "41386a2011290300370300200341306a2013290300370300200341286a20" + "09290300370300200341206a2015290300370300200341186a200f290300" + "370300200341106a2025290300370300200341086a20002903c802370300" + "2000203941016a2239360250200041a00d6a200d10450240024020002802" + "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" + "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" + "200b4200370300200041b80d6a220d420037030020104200370300203f42" + "00370300203f41086a4200370300203f41106a4200370300203f41186a42" + "00370300203f41206a4200370300203f41286a4200370300200042003703" + "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" + "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" + "104a0d00203d202d104a450d010b203c4200370300200220272903003703" + "00203c41086a4200370300203c41106a4200370300203c41186a42003703" + "00203c41206a4200370300203c41286a4200370300200241386a20274138" + "6a290300370300200241306a202741306a290300370300200241286a2027" + "41286a290300370300200241206a202741206a290300370300200241186a" + "202741186a290300370300200241106a202741106a290300370300200241" + "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" + "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" + "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" + "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" + "370300200020002903b83a3703b846200020002903b03a3703b04620070c" + "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" + "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" + "0300200041e8c6006a4200370300200042003703b046200042003703b846" + "202b41f000104b1a20020b220342003703082003420137030041bda9c000" + "2d00001a41809901100b221e450d0141002109200041003602b819200020" + "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" + "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" + "200d290300370300200041c0c3006a220f20102903003703002000200029" + "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200041a8076a2211200b41186a221b290300370300200041a0076a221320" + "0b41106a22342903003703002000200b41086a2240290300370398072000" + "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" + "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" + "370300200041c01f6a200f29030037030020182000290390073703002018" + "41086a200029039807370300201841106a2013290300370300201841186a" + "2011290300370300200020002903b8433703b81f200020002903b0433703" + "b01f200041e8346a2203200241386a290300370300200041e0346a200241" + "306a290300370300200041d8346a2232200241286a290300370300200041" + "d0346a200241206a290300370300200041c8346a220e200241186a290300" + "370300200041c0346a200241106a2903003703002000200241086a290300" + "3703b834200020022903003703b034200041b0346a20022002102f200041" + "e8376a2219200741386a290300370300200041e0376a200741306a290300" + "370300200041d8376a221a200741286a290300370300200041d0376a2007" + "41206a290300370300200041c8376a222f200741186a2903003703002000" + "41c0376a2230200741106a2903003703002000200741086a2903003703b8" + "37200020072903003703b037200041b0376a20072007102f20002903b837" + "226942018620002903b037226b423f88842155206b420186215402400240" + "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" + "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" + "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" + "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" + "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" + "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" + "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" + "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" + "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" + "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" + "00226742018620002903d037226f423f88842154206f4201862153024002" + "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" + "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" + "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" + "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" + "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" + "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" + "aece93b230511b450d002053215b20542170205921600c010b2055205920" + "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" + "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" + "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" + "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" + "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" + "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" + "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" + "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" + "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" + "30511b450d0120540b215f205921582053215c0c010b2056205420532059" + "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" + "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" + "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" + "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" + "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" + "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" + "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" + "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" + "89aece93b230511b450d002059215a205321590c010b2055205420532059" + "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" + "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" + "550b200020543703e0222000205a3703d0222000205f3703c02220002058" + "3703b022200020553703e822200020593703d822200020563703c8222000" + "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" + "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" + "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" + "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" + "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" + "0041b0226a102f20002903b825226442018620002903b025226e423f8884" + "2155206e420186215402400240027e20002903c02522704201862064423f" + "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" + "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" + "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" + "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" + "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" + "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" + "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" + "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" + "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" + "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" + "018620002903d0252265423f888421542065420186215302400240200029" + "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" + "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" + "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" + "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d002053216c20542173205921680c010b205520" + "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" + "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" + "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" + "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" + "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" + "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" + "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" + "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" + "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" + "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" + "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" + "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" + "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" + "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" + "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" + "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" + "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" + "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" + "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" + "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" + "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" + "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" + "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" + "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" + "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" + "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" + "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" + "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" + "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" + "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" + "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" + "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" + "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" + "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "0240207320002903e03422597c22552079203229030022687c2263207954" + "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" + "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" + "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" + "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" + "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" + "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" + "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" + "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" + "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" + "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" + "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" + "723703002000207a37039807200020753703900720004190076a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200d20633703002010205d370300200020613703a80d200020573703a00d" + "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" + "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" + "286a220e2013290300370300200620002903a00d370300200641086a2000" + "2903a80d370300200641106a2010290300370300200641186a200d290300" + "37030020002000290398073703b82820002000290390073703b028024002" + "40027e20002903c04722612000290380477c226d204d290300225d204c29" + "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" + "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" + "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" + "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" + "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" + "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" + "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" + "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "024020002903e047225720002903a0477c226320222903002262201f2903" + "007c225d206254ad205d20002903d04722622000290390477c2261206254" + "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" + "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" + "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" + "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" + "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" + "89aece93b230511b450d0020612157206221610c010b2063205d20622061" + "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" + "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" + "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" + "630b200d206d3703002010207237030020292061370300200b2057370300" + "203a205d37030020252063370300200041c0c0006a224520723703002000" + "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" + "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" + "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" + "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" + "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" + "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" + "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" + "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" + "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" + "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" + "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" + "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" + "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" + "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" + "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" + "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" + "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" + "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" + "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" + "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" + "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" + "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" + "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" + "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" + "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" + "5d20002903b040216102400240417f20002903c0402267206d8520322903" + "002266206985844200522067206d54206620695420662069511b1b222141" + "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" + "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" + "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" + "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" + "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" + "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" + "02400240417f20002903e0402263206f85201c2903002267206b85844200" + "522063206f542067206b542067206b511b1b2214417f470440201441ff01" + "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" + "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" + "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" + "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" + "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" + "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" + "417f20542070852056206085844200522054207056205620605620562060" + "511b1b2214417f470440201441ff01710d012058206e5820532064582053" + "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" + "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" + "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" + "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" + "64420120727d21722063207e7c216f420120767d2175206020567d205442" + "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" + "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" + "216e205e20587d217e02400240417f2059205c852055205b858442005220" + "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" + "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" + "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" + "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" + "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" + "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" + "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" + "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" + "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" + "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" + "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" + "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" + "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" + "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" + "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" + "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" + "0041e0256a290300370300200041b8076a2217201a290300370300202c20" + "0041d0256a290300370300201120192903003703002013200041c0256a29" + "0300370300200020002903b82537039807200020002903b0253703900720" + "004190076a200041b0256a200041b0256a102f0240417f20542074852056" + "205a858442005220542074542056205a542056205a511b1b2219417f4704" + "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" + "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" + "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" + "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" + "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" + "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" + "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" + "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" + "40417f20592073852055205f858442005220592073542055205f54205520" + "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" + "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" + "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" + "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" + "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" + "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" + "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" + "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" + "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" + "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" + "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" + "0300370300200b20062903003703002029200041d8286a29030037030020" + "3a200041e0286a2903003703002025200041e8286a290300370300200020" + "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" + "b0286a200041b0286a102f20002903980722544201862000290390072253" + "423f888421552053420186215a02400240027e20002903a0072259420186" + "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" + "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" + "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" + "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" + "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" + "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" + "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" + "290300225a42018620002903b007225f423f8884215b205f420186215c02" + "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" + "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" + "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" + "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" + "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" + "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" + "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" + "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" + "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" + "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" + "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" + "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" + "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" + "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" + "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" + "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" + "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" + "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" + "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" + "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" + "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" + "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" + "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" + "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" + "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" + "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" + "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" + "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" + "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" + "417f20002903b00d225f205b85200d290300225420568584420052205b20" + "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" + "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" + "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" + "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" + "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" + "2066216c205821660b206220787d215f206120777d2158205420567d205b" + "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" + "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" + "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" + "7f20002903d00d2254205a8520252903002256205585844200522054205a" + "54205520565620552056511b1b2203417f470440200341ff01710d012064" + "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" + "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" + "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" + "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" + "20002066370380472000206c3703f0462000205c20717d37039047200020" + "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" + "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" + "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" + "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" + "03d831200020583703d031200020603703c0312000206b3703c831200020" + "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" + "002164200042003703e831200042003703e031200042003703d831200042" + "013703d031200042003703c831200042003703c031200042003703b83120" + "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" + "714200216c4200216642002167205f2060842053206b8484420052044042" + "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" + "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" + "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" + "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" + "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" + "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" + "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" + "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" + "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" + "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" + "20002903b0432253423f888421552053420186215a02400240027e200029" + "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" + "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" + "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" + "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" + "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" + "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" + "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" + "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" + "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" + "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" + "018620002903d043225f423f88842160205f420186215b02400240200029" + "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" + "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" + "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" + "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" + "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" + "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" + "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" + "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" + "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" + "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" + "0b02400240027e205920687c225b205420737c2269205454ad2069205320" + "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" + "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" + "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" + "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" + "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" + "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" + "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" + "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" + "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" + "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" + "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" + "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" + "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" + "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" + "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" + "b230511b450d002059215a205321590c010b205520542053205942c7faf3" + "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" + "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" + "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" + "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" + "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" + "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" + "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" + "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" + "21532019290300215f2003290300215820002903b81c2160201e200941c0" + "016c6a220320553703b80120142903002155201a290300215c200e290300" + "216820002903b01c2174200320543703b001200320593703a8012003205a" + "3703a00120032056370398012003205b3703900120032069370388012003" + "2070370380012003205e3703782003206f3703702003206b370368200320" + "643703602003206c37035820032071370350200320673703482003206637" + "034020032074370300200341386a2058370300200341306a206837030020" + "0341286a205f370300200341206a205c370300200341186a205337030020" + "0341106a2055370300200341086a20603703002000200941016a22033602" + "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" + "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" + "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" + "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" + "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" + "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" + "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" + "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" + "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" + "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" + "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" + "186a290300370300200f203e41106a2903003703002000203e41086a2903" + "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" + "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" + "2903b043370300204020002903b8433703002034200f290300370300201b" + "2015290300370300200020002903b83a3703a80d200020002903b03a3703" + "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" + "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" + "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" + "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" + "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" + "90072015203d41186a290300370300200f203d41106a2903003703002000" + "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" + "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200d202741186a2903003703002010202741106a2903003703" + "00200b20002903b043370300204020002903b8433703002034200f290300" + "370300201b20152903003703002000202741086a2903003703a80d200020" + "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" + "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" + "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" + "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" + "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" + "997f3703b043202f202841186a2903003703002030202841106a29030037" + "03002000202841086a2903003703b837200020282903003703b037200041" + "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2011203229030037030020132045290300370300202c" + "20002903b037370300202c41086a220d20002903b837370300202c41106a" + "22092030290300370300202c41186a2215202f2903003703002000200029" + "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" + "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" + "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" + "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" + "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" + "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" + "03002030204341106a2903003703002000204341086a2903003703b83720" + "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" + "003703002013204441106a290300370300202c20002903b037370300200d" + "20002903b837370300200920302903003703002015202f29030037030020" + "00204441086a2903003703980720002044290300370390072004200041b0" + "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" + "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" + "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" + "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" + "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" + "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" + "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" + "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" + "104c1a205141086a200d280200360200205120002902b019370200200028" + "025420464604404100211b230041206b220e240002400240200041d4006a" + "22162802002209417f460d00410420094101742208200941016a220c2008" + "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" + "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" + "200e201628020436021441100541000b360218200e41086a2008200e4114" + "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" + "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" + "0e41206a2400200028025821380b203820464190016c6a20004180036a41" + "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" + "0b0240024002400240024002400240024002400240024002402046450440" + "2000280254210320004190076a41f002104b1a20030d010c020b41002118" + "200041a0076a41f002104b1a200042003703980720004201370390072046" + "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" + "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" + "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" + "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" + "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" + "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" + "6a2017103b200042003703e849200042003703e049200042003703d84920" + "0042013703d049200042003703c849200042003703c049200042003703b8" + "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" + "386a2203201c41386a290300370300201941306a2202201c41306a290300" + "370300201941286a2207201c41286a290300370300201941206a220b201c" + "41206a290300370300201941186a220d201c41186a290300370300201941" + "106a2211201c41106a290300370300201941086a2206201c41086a290300" + "3703002019201c290300370300201a2017290300370300201a41086a2209" + "201741086a290300370300201a41106a2215201741106a29030037030020" + "1a41186a220f201741186a290300370300201a41206a2225201741206a29" + "0300370300201a41286a2229201741286a290300370300201a41306a222a" + "201741306a290300370300201a41386a221e201741386a29030037030020" + "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" + "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" + "004190076a2017103020452028201a10302040202c20191030200041b0ce" + "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" + "006a200041b0c3006a103c200042003703e846200042003703e046200042" + "003703d846200042013703d046200042003703c846200042003703c04620" + "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" + "6a102f201a20002903b043370300200920002903b8433703002015200041" + "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" + "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" + "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" + "386a2903003703002002201441306a2903003703002007201441286a2903" + "00370300200b201441206a290300370300200d201441186a290300370300" + "2011201441106a2903003703002006201441086a29030037030020192014" + "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" + "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" + "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" + "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" + "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" + "220c41c000460d040c030b02400340200641046a280200220320184b0440" + "200241386a2903002156200241306a2903002155200241286a2903002154" + "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" + "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" + "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" + "200d290300370300200041c0c9006a222920112903003703002013200029" + "03a00d370300201341086a222a20002903a80d370300201341106a221e20" + "0b290300370300201341186a222f2007290300370300200020002903b84e" + "3703b849200020002903b04e3703b049200241186a290300215620024110" + "6a2903002155200241086a290300215420022903002153200041c8c6006a" + "220920034198016a290300370300200041c0c6006a221520034190016a29" + "0300370300200020034188016a2903003703b84620002003290380013703" + "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" + "016a2903003703002000200341a8016a2903003703a80d200020032903a0" + "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" + "0300201020002903a00d370300201041086a223020002903a80d37030020" + "1041106a223a200b290300370300201041186a2232200729030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" + "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" + "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" + "41046a2802002203200f4b0440200241386a2903002156200241306a2903" + "002155200241286a2903002154200241206a2903002153200d2006280200" + "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" + "3703002000200341c8006a2903003703b84e200020032903403703b04e20" + "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" + "03003703002000200341e8006a2903003703a80d200020032903603703a0" + "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2025200d290300370300202920112903003703002013" + "20002903a00d370300202a20002903a80d370300201e200b290300370300" + "202f2007290300370300200020002903b84e3703b849200020002903b04e" + "3703b049200241186a2903002156200241106a2903002155200241086a29" + "0300215420022903002153200920034198016a2903003703002015200341" + "90016a290300370300200020034188016a2903003703b846200020032903" + "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" + "200341b0016a2903003703002000200341a8016a2903003703a80d200020" + "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" + "290300370300201020002903a00d370300203020002903a80d370300203a" + "200b29030037030020322007290300370300200020002903b8463703b84e" + "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" + "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" + "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" + "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" + "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" + "0d201841c0016c2125200521022008210903402018200741046a28020022" + "034f0d02200241386a2903002156200241306a2903002155200241286a29" + "03002154200241206a2903002153200041c8ce006a221320072802002025" + "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" + "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" + "290300370300200041c0c9006a2006290300370300200d20002903a00d37" + "0300200d41086a20002903a80d370300200d41106a201029030037030020" + "0d41186a2011290300370300200020002903b84e3703b849200020002903" + "b04e3703b049200241186a2903002156200241106a290300215520024108" + "6a290300215420022903002153200041c8c6006a221520034198016a2903" + "00370300200041c0c6006a220f20034190016a2903003703002000200341" + "88016a2903003703b84620002003290380013703b046200041b0c6006a20" + "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2011200341b8016a2903003703002010200341b0016a2903003703002000" + "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" + "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b201320152903003703002006200f290300370300200b20002903a00d" + "370300200b41086a20002903a80d370300200b41106a2010290300370300" + "200b41186a2011290300370300200020002903b8463703b84e2000200029" + "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" + "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" + "6a2107200241406b2102200941016b22090d000b20384184016a21072000" + "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" + "05210203402018200741046a28020022034f0d03200241386a2903002156" + "200241306a2903002155200241286a2903002154200241206a2903002153" + "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" + "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" + "003703b84e200020032903403703b04e200041b0ce006a20532054205520" + "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" + "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" + "003703002000200341e8006a2903003703a80d200020032903603703a00d" + "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" + "06290300370300200d20002903a00d370300200d41086a20002903a80d37" + "0300200d41106a2010290300370300200d41186a20112903003703002000" + "20002903b84e3703b849200020002903b04e3703b049200241186a290300" + "2156200241106a2903002155200241086a29030021542002290300215320" + "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" + "034190016a290300370300200020034188016a2903003703b84620002003" + "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" + "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" + "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" + "2015290300370300200b20002903a00d370300200b41086a20002903a80d" + "370300200b41106a2010290300370300200b41186a201129030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" + "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" + "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" + "03e834200042003703e034200042003703d834200042013703d034200042" + "003703c834200042003703c034200042003703b834200042093703b03420" + "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" + "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" + "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" + "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" + "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" + "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" + "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" + "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" + "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" + "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" + "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" + "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" + "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" + "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" + "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" + "290300370300200041c8106a220c200041c8376a221e2903003703002000" + "41c0106a2216200041c0376a222f290300370300200020002903b8373703" + "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" + "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" + "136a2228200041a0386a221b290300370300200041d8136a223420004198" + "386a2240290300370300200041d0136a224520004190386a224c29030037" + "0300200041c8136a221020004188386a224d290300370300200041c0136a" + "221320004180386a224e290300370300200041c0316a2230200041c0386a" + "223d290300370300200041c8316a223a200041c8386a2243290300370300" + "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" + "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" + "290300370300200041e8316a221a200041e8386a222d2903003703002000" + "200041f8376a22122903003703b813200020002903f0373703b013200020" + "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" + "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" + "42003703e034200042003703d834200042013703d034200042003703c834" + "200042003703c034200042003703b834200042093703b034200041b0ce00" + "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" + "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" + "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" + "006a22112903003703002013200041c0ce006a220b290300370300200020" + "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" + "0c290300370300200041b00a6a22092016290300370300200020002903b8" + "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" + "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "0041c83d6a22132017290300370300200041c03d6a221020142903003703" + "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" + "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d201120062903002256370300200b20092903002255370300200d20" + "002903b03d2254370300200220102903002253370300200720002903b83d" + "225937030020032013290300225a370300200020002903a80a225f3703b8" + "4e200020002903a00a22583703b04e2017205a3703002014205337030020" + "1c205937030020212054370300200c205637030020162055370300200020" + "5f3703b810200020583703b010200041e8166a2217202d29030037030020" + "0041e0166a2214202e290300370300200041d8166a221c20042903003703" + "00200041d0166a22212051290300370300200041c8166a220c2043290300" + "370300200041c0166a2216203d2903003703002000202b2903003703b816" + "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" + "6a200041b0166a200041b0346a102f201720032903003703002014200229" + "0300370300201c20072903003703002021200d290300370300200c201129" + "03003703002016200b290300370300200041c0196a2208202f2903003703" + "00200041c8196a2228201e290300370300200041d0196a2234202a290300" + "370300200041d8196a22452029290300370300200041e0196a223d202529" + "0300370300200041e8196a2243200f290300370300200020002903b84e37" + "03b816200020002903b04e3703b016200020002903b0373703b019200020" + "002903b8373703b819200041e8226a202c290300370300200041e0226a20" + "1b290300370300200041d8226a2040290300370300200041d0226a204c29" + "0300370300200041c8226a204d290300370300200041c0226a204e290300" + "370300200020122903003703b822200020002903f0373703b022200041b0" + "196a200041b0376a2015102f2006200c2903003703002009201629030037" + "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" + "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20132017290300370300201020142903003703002000" + "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" + "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201120062903002256370300200b20092903002255370300200d20002903" + "b03d2254370300200220102903002253370300200720002903b83d225937" + "030020032013290300225a370300200020002903a80a225f3703b84e2000" + "20002903a00a22583703b04e2017205a37030020142053370300201c2059" + "37030020212054370300200c2056370300201620553703002000205f3703" + "b816200020583703b016200041e81c6a2217202c290300370300200041e0" + "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" + "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" + "200041c01c6a2216204e290300370300200020122903003703b81c200020" + "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" + "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" + "282029290300370300200041d01f6a221b202a290300370300200041c81f" + "6a2234201e290300370300200041c01f6a2240202f290300370300200020" + "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" + "b0376a2018102f2006200c29030037030020092016290300370300200020" + "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" + "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20132017290300370300201020142903003703002000201c290300" + "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" + "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" + "03002256370300200b20092903002255370300200d20002903b03d225437" + "0300200220102903002253370300200720002903b83d2259370300200320" + "13290300225a370300200020002903a80a225f3703b84e200020002903a0" + "0a22583703b04e2017205a37030020142053370300201c20593703002021" + "2054370300200c2056370300201620553703002000205f3703b81c200020" + "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" + "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" + "200329030037030020192002290300370300200e20072903003703002032" + "200d290300370300203a20112903003703002030200b2903003703002000" + "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" + "0041b0316a200041b0346a102f201a200329030037030020192002290300" + "370300200e20072903003703002032200d290300370300203a2011290300" + "3703002030200b290300370300200041c0256a202f290300370300200041" + "c8256a201e290300370300200041d0256a202a290300370300200041d825" + "6a2029290300370300200041e0256a2025290300370300200041e8256a20" + "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" + "31200020002903b0373703b025200020002903b8373703b825200041b025" + "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" + "41b0256a1030201a200329030037030020192002290300370300200e2007" + "2903003703002032200d290300370300203a20112903003703002030200b" + "290300370300200020002903b84e3703b831200020002903b04e3703b031" + "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" + "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" + "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" + "03002254370300200041d02e6a222f200041e03d6a221829030022533703" + "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" + "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" + "0300200041c8286a220e2059370300200041d0286a221920533703002000" + "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" + "22142056370300200020002903c03d22563703b02e200020563703b02820" + "00201329030022563703b82e200020563703b828200041b0286a20102000" + "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" + "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" + "220c2018290300370300200041c82b6a2216200f290300370300200041c0" + "2b6a22082025290300370300200020132903003703b82b200020002903c0" + "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" + "0041b01c6a102f2003201429030037030020022017290300370300200720" + "1a290300370300200d20192903003703002011200e290300370300200b20" + "32290300370300202220002903b82b370300202320082903003703002024" + "2016290300370300204f200c2903003703002027202a290300370300203f" + "2021290300370300203e201c290300370300200020002903b8283703b84e" + "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" + "00370300204820292903003703002047201e2903003703002041202f2903" + "00370300204220302903003703002037203a290300370300203620002903" + "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" + "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" + "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" + "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" + "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" + "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" + "103f200742003703002002420037030020034200370300200042a9c0c689" + "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" + "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" + "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" + "0742003703002002420037030020034200370300200042003703c84e2000" + "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" + "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" + "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" + "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" + "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" + "3703002015200041e8c6006a290300370300200920002903b84037030020" + "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" + "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" + "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" + "370300200041a83e6a200041e8c0006a2206290300370300200020002903" + "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" + "200742003703002002420037030020034200370300200042a9c0c689aece" + "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" + "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" + "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" + "3703002013420037030020064200370300200042003703c840200042ac97" + "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" + "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" + "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" + "370300201120004188c8006a290300370300200d20004190c8006a290300" + "370300200720004198c8006a2903003703002002200041a0c8006a290300" + "3703002003200041a8c8006a290300370300202220002903b83a37030020" + "2320492903003703002024204a290300370300204f205029030037030020" + "272039290300370300203f203c290300370300203e204429030037030020" + "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" + "002903b03a3703f04e20394200370300203c420037030020444200370300" + "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" + "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" + "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" + "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" + "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" + "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" + "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" + "039007200041a00a6a200d418003104c1a200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" + "03200041286a210b0340200041206a200341ff0071104f200b2903002000" + "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" + "20200229030083215520074101710440200041a00d6a200041b0ce006a10" + "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" + "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" + "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" + "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" + "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" + "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" + "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" + "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" + "562000290310200229030083215520074101710440200041a00d6a200041" + "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" + "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" + "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" + "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" + "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" + "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" + "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" + "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" + "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" + "8321562000290300200229030083215520074101710440200041a00d6a20" + "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" + "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" + "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" + "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" + "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" + "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" + "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" + "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" + "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" + "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" + "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" + "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" + "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" + "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" + "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" + "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" + "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" + "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" + "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" + "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" + "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" + "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" + "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" + "6a200041a00d6a102f2002420037030020074200370300200b4200370300" + "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" + "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" + "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" + "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" + "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" + "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" + "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" + "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" + "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" + "6a29030037030020004198ca006a200041d8ce006a220629030037030020" + "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" + "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" + "03b82e3703b849200020002903b04e3703f0492002420037030020074200" + "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" + "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" + "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" + "200041b0306a200041a00d6a102f20064200370300200942003703002015" + "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" + "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" + "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" + "41b00d6a220620004180306a290300370300200041b80d6a220920004188" + "306a290300370300200041c00d6a221520004190306a2903003703002002" + "20004198306a2903003703002007200041a0306a290300370300200b2000" + "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" + "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" + "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" + "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" + "00370300200041980e6a200041e8c6006a220b2903003703002000200029" + "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" + "3703e00d2002420037030020074200370300200b4200370300200042a9c0" + "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" + "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" + "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" + "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" + "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" + "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" + "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" + "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" + "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" + "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" + "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" + "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" + "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" + "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" + "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" + "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" + "006a200041b0c3006a103f2009290300215620002903b00d215520004190" + "076a201541f002104c1a20384184016a2103024002400240024002400240" + "0340200341046b280200220204402003280200220b41046b280200220741" + "7871220d200241c0016c220241044108200741037122071b72490d022007" + "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" + "6b22460d000b200028025422030440203841046b28020022024178712207" + "20034190016c220341044108200241037122021b72490d03200241002007" + "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" + "0200220241787122072003410674220341044108200241037122021b7249" + "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" + "18200341e4a1c0001010000b203841046b28020022024178712207200341" + "90016c220341044108200241037122021b72490d02200241002007200341" + "276a4b1b0d03203810040b200028024822030440200541046b2802002202" + "41787122072003410674220341044108200241037122021b72490d042002" + "4100200720034127724b1b0d05200510040b42002156420121550b203120" + "5637030820312055370300203141106a20004190076a41f002104c1a2000" + "28023c22030440203341046b28020022024178712207200341c0016c2203" + "41044108200241037122021b72490d0520024100200720034127724b1b0d" + "06203310040b200028023022030440203b41046b28020022024178712207" + "200341e0006c220341044108200241037122021b72490d07200241002007" + "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" + "1011000b200141f0066a41f002104b1a200142003703e806200142013703" + "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" + "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" + "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" + "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" + "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" + "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" + "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" + "05417871221241044108200541037122051b20026a490d0c200541002012" + "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" + "05410674100e0c040b206a428080808010540d0020122005100e0b202041" + "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" + "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" + "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" + "04201d41046b280200220541787141e40041e800200541037122061b490d" + "162006410020054188014f1b0d17201d1004200a41046b28020022054178" + "71221d418802418c02200541037122051b490d1820054100201d41ac024f" + "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" + "200541003602182005410136020c200541a099c000360208200542043702" + "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" + "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" + "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" + "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" + "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" + "0204200241643602002002410236020c200241b884c00036020820024202" + "3702142002200241046aad4280808080108437032820022002ad42808080" + "8010843703202002200241206a360210200241086a41cc90c000101a000b" + "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" + "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b962502087f017e02400240024002400240024002402000" + "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" + "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" + "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" + "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" + "04410620014108766722006b7641017120004101746b413e6a21070b4100" + "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" + "0b410021002004411920074101766b41002007411f471b74210503400240" + "200328020441787122062004490d00200620046b220620014f0d00200321" + "02200622010d0041002101200321000c060b200328021422062000200620" + "032005411d764104716a41106a2802002203471b200020061b2100200541" + "0174210520030d000b0c030b02402000417f7341017120016a2205410374" + "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" + "402002200436020c200420023602080c010b418ca9c0002003417e200577" + "713602000b20012000410372360204200020016a22002000280204410172" + "360204200141086a0f0b0240200020017441022001742200410020006b72" + "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" + "28020822054704402005200236020c200220053602080c010b418ca9c000" + "2003417e200677713602000b20002004410372360204200020046a220520" + "0120046b2204410172360204200020016a20043602004194a9c000280200" + "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" + "8ca9c00028020022064101200341037674220371450440418ca9c0002003" + "20067236020020020c010b20022802080b21032002200136020820032001" + "36020c2001200236020c200120033602080b419ca9c00020053602004194" + "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" + "220228020441787120046b21012002210302400340024002402002280210" + "22000d00200228021422000d002003280218210702400240200320032802" + "0c2200460440200341144110200328021422001b6a28020022020d014100" + "21000c020b20032802082202200036020c200020023602080c010b200341" + "146a200341106a20001b21050340200521062002220041146a200041106a" + "200028021422021b210520004114411020021b6a28020022020d000b2006" + "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" + "020047044020074110411420072802102003461b6a20003602002000450d" + "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" + "200328021c77713602000c030b200028020441787120046b220220012001" + "20024b22021b21012000200320021b2103200021020c010b0b2000200736" + "021820032802102202044020002002360210200220003602180b20032802" + "142202450d0020002002360214200220003602180b02400240200141104f" + "044020032004410372360204200320046a22042001410172360204200120" + "046a20013602004194a9c0002802002205450d0120054178714184a7c000" + "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" + "037674220571450440418ca9c000200520067236020020020c010b200228" + "02080b2105200220003602082005200036020c2000200236020c20002005" + "3602080c010b2003200120046a2200410372360204200020036a22002000" + "2802044101723602040c010b419ca9c00020043602004194a9c000200136" + "02000b200341086a0f0b2000200272450440410021024102200774220041" + "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" + "0b2000450d010b03402002200020022000280204417871220320046b2206" + "20014922071b200320044922051b210220012006200120071b20051b2101" + "20002802102203047f20030520002802140b22000d000b0b2002450d0020" + "044194a9c00028020022004d2001200020046b4f710d0020022802182107" + "024002402002200228020c2200460440200241144110200228021422001b" + "6a28020022030d01410021000c020b20022802082203200036020c200020" + "033602080c010b200241146a200241106a20001b21050340200521062003" + "220041146a200041106a200028021422031b210520004114411020031b6a" + "28020022030d000b200641003602000b02402007450d0002402002200228" + "021c41027441f4a5c0006a22032802004704402007411041142007280210" + "2002461b6a20003602002000450d020c010b2003200036020020000d0041" + "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" + "0736021820022802102203044020002003360210200320003602180b2002" + "2802142203450d0020002003360214200320003602180b0240200141104f" + "044020022004410372360204200220046a22042001410172360204200120" + "046a200136020020014180024f0440411f210020044200370210200141ff" + "ffff074d04402001410620014108766722006b7641017120004101746b41" + "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" + "22054190a9c0002802007145044020032004360200200420033602182004" + "200436020c200420043602084190a9c0004190a9c0002802002005723602" + "000c030b0240024020012003280200220528020441787146044020052100" + "0c010b2001411920004101766b41002000411f471b742103034020052003" + "411d764104716a41106a22062802002200450d0220034101742103200021" + "0520002802044178712001470d000b0b20002802082201200436020c2000" + "2004360208200441003602182004200036020c200420013602080c030b20" + "062004360200200420053602182004200436020c200420043602080c020b" + "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" + "41037674220171450440418ca9c000200120037236020020000c010b2000" + "2802080b2101200020043602082001200436020c2004200036020c200420" + "013602080c010b2002200120046a2200410372360204200020026a220020" + "002802044101723602040b200241086a0f0b024002400240024002400240" + "20044194a9c00028020022004b044020044198a9c00028020022004f0440" + "41002100200441af80046a220241107640002201417f4622050d07200141" + "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" + "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" + "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" + "4020002802002202200028020422056a2003460d02200028020822000d00" + "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" + "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" + "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" + "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" + "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" + "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" + "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" + "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" + "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" + "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" + "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" + "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" + "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" + "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" + "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" + "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" + "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" + "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" + "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" + "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" + "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" + "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" + "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" + "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" + "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" + "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" + "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" + "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" + "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" + "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" + "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" + "0036020020032000410172360204200020036a412836020441aca9c00041" + "808080013602000c080b200120034f0d0020012002490d00200028020c45" + "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" + "0320066a210241f4a6c00021000240024003402002200028020022054704" + "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" + "034002402001200028020022024f04402001200220002802046a2202490d" + "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" + "41286b220036020020032000410172360204200020036a412836020441ac" + "a9c00041808080013602002001200241206b41787141086b220020002001" + "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" + "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" + "200336020041fca6c000200541086a3602004180a7c00041003602002005" + "411c6a2100034020004107360200200041046a22002002490d000b200120" + "05460d0720052005280204417e713602042001200520016b220041017236" + "02042005200036020020004180024f04402001200010350c080b200041f8" + "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" + "220071450440418ca9c000200020037236020020020c010b20022802080b" + "2100200220013602082000200136020c2001200236020c20012000360208" + "0c070b200020033602002000200028020420066a36020420032004410372" + "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" + "a9c000280200460d032002419ca9c000280200460d042002280204220441" + "037141014604402002200441787122041016200120046a2101200220046a" + "220228020421040b20022004417e71360204200020014101723602042000" + "20016a200136020020014180024f04402000200110350c060b200141f801" + "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" + "0171450440418ca9c000200120027236020020040c010b20042802080b21" + "01200420003602082001200036020c2000200436020c200020013602080c" + "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" + "220020046a22023602002002200141017236020420002004410372360204" + "200041086a21000c060b419ca9c00028020021010240200020046b220241" + "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" + "72360204200020016a220020002802044101723602040c010b4194a9c000" + "2002360200419ca9c000200120046a220336020020032002410172360204" + "200020016a2002360200200120044103723602040b200141086a0f0b2000" + "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" + "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" + "22016a41086a220336020020022003410172360204200020016a41283602" + "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" + "c0004198a9c00028020020016a2201360200200020014101723602040c01" + "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" + "020020002001410172360204200020016a20013602000b200341086a0f0b" + "410021004198a9c000280200220120044d0d004198a9c000200120046b22" + "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" + "0141017236020420002004410372360204200041086a0f0b20000bc60602" + "037f037e230041a0026b22032400200341286a41c100104b210420034118" + "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" + "41086a41e08bc00029030037030020034200370320200341d88bc0002903" + "003703000240200241c0004f0440200320024106762205ad370320200320" + "01200510272004200120024140716a2002413f712202104c1a0c010b2004" + "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" + "034198016a220120032d00d80122026a22044180013a00002002ad220742" + "3b862003290390012206420986220820074203868422074280fe03834228" + "86842007428080fc0783421886200742808080f80f834208868484200642" + "018642808080f80f832006420f88428080fc0783842006421f884280fe03" + "8320084238888484842106024002402002413f470440200441016a200241" + "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" + "4190026a420037030020034188026a420037030020034180026a42003703" + "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" + "00370300200342003703e0012003200637039802200341f0006a200341e0" + "016a410110270c010b200320063703d001200341f0006a2001410110270b" + "2000200328028c01220241187420024180fe037141087472200241087641" + "80fe03712002411876727236001c20002003280288012202411874200241" + "80fe03714108747220024108764180fe0371200241187672723600182000" + "200328028401220241187420024180fe03714108747220024108764180fe" + "0371200241187672723600142000200328028001220241187420024180fe" + "03714108747220024108764180fe03712002411876727236001020002003" + "28027c220241187420024180fe03714108747220024108764180fe037120" + "02411876727236000c20002003280278220241187420024180fe03714108" + "747220024108764180fe0371200241187672723600082000200328027422" + "0241187420024180fe03714108747220024108764180fe03712002411876" + "727236000420002003280270220241187420024180fe0371410874722002" + "4108764180fe037120024118767272360000200341a0026a24000bee0201" + "077f024020012802042202450440410021020c010b200128021021062001" + "200220022001280208220320022003491b22046b36020420012001280200" + "220720046a360200027f0240024002400240027f02400240024020030440" + "200128020c2208410174210520072d0000220241c1006b41ff0171410649" + "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" + "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" + "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" + "01714106490d01200241e1006b41ff01714106490d02200241306b220441" + "ff0171410a490d0420054101720b21032006200241ff0171360200200620" + "0541807e71200341ff01717236020441000c040b200241376b21040c020b" + "200241d7006b21040c010b4101410141948bc0001010000b200420034104" + "7472210341010b21022001200841016a36020c0b200020033a0001200020" + "023a00000bb40801057f200041086b2201200041046b2802002203417871" + "22006a21020240024020034101710d002003410271450d01200128020022" + "0320006a2100200120036b2201419ca9c000280200460440200228020441" + "03714103470d014194a9c000200036020020022002280204417e71360204" + "20012000410172360204200220003602000f0b2001200310160b02400240" + "0240024002400240024020022802042203410271450440200241a0a9c000" + "280200460d022002419ca9c000280200460d032002200341787122031016" + "2001200020036a2200410172360204200020016a20003602002001419ca9" + "c000280200470d014194a9c00020003602000f0b20022003417e71360204" + "20012000410172360204200020016a20003602000b2000418002490d0241" + "1f210220014200370210200041ffffff074d044020004106200041087667" + "22026b7641017120024101746b413e6a21020b2001200236021c20024102" + "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" + "01360200200120033602182001200136020c200120013602084190a9c000" + "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" + "c0004198a9c00028020020006a220036020020012000410172360204419c" + "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" + "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" + "410021034198a9c00028020022054129490d0441f4a6c000210103402000" + "200128020022024f04402000200220012802046a490d060b200128020821" + "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" + "006a220036020020012000410172360204200020016a20003602000f0b20" + "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" + "037674220071450440418ca9c000200020037236020020020c010b200228" + "02080b2100200220013602082000200136020c2001200236020c20012000" + "3602080f0b02400240200020032802002204280204417871460440200421" + "020c010b2000411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712000470d000b0b20022802082200200136020c20" + "022001360208200141003602182001200236020c200120003602080c010b" + "20052001360200200120043602182001200136020c200120013602080b41" + "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" + "a6c000280200220004400340200141016a2101200028020822000d000b0b" + "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" + "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" + "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" + "000b0b810802077f067e230041c0026b2203240020034198026a20024118" + "6a290300220a37030020034190026a200241106a290300220d3703002003" + "200241086a290300220b3703880220032002290300220c3703800242ddb0" + "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" + "290300220a370300200341b8026a2205200141186a290300220d37030020" + "032001290300220b3703a0022003200141086a290300220c3703a8022003" + "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" + "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" + "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" + "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" + "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" + "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" + "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" + "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" + "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" + "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" + "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" + "80026a200341a0016a104a45044020034180016a22042002290300370100" + "20034198016a2205200241186a29030037010020034190016a2206200241" + "106a29030037010020034188016a2207200241086a290300370100200341" + "f8006a2202200141186a290300370100200341f0006a2208200141106a29" + "0300370100200341e8006a2209200141086a290300370100200320012903" + "00370160200341ca006a22012005290100370100200341c2006a22052006" + "2901003701002003413a6a22062007290100370100200341326a22072004" + "2901003701002003412a6a22042002290100370100200341226a22022008" + "2901003701002003411a6a22082009290100370100200320032901603701" + "12200041c8006a2001290100370100200041406b20052901003701002000" + "41386a2006290100370100200041306a2007290100370100200041286a20" + "04290100370100200041206a2002290100370100200041186a2008290100" + "3701002000200329011237011041000c010b200041003a000141010b3a00" + "00200341c0026a24000baa0401047e2001290010220242388620024280fe" + "0383422886842002428080fc0783421886200242808080f80f8342088684" + "84200242088842808080f80f832002421888428080fc0783842002422888" + "4280fe038320024238888484842104200141186a29000022024238862002" + "4280fe0383422886842002428080fc0783421886200242808080f80f8342" + "08868484200242088842808080f80f832002421888428080fc0783842002" + "4228884280fe0383200242388884848421050240417f2001290000220242" + "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" + "008584420052200342388620034280fe0383422886842003428080fc0783" + "421886200342808080f80f834208868484200342088842808080f80f8320" + "03421888428080fc07838420034228884280fe0383200342388884848422" + "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" + "02428080fc0783421886200242808080f80f834208868484200242088842" + "808080f80f832002421888428080fc07838420024228884280fe03832002" + "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" + "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" + "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" + "1b0d010b2000200337032020002005370310200020023703282000200437" + "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" + "7f027e230041d0066b2203240020034188036a200241386a290300370300" + "20034180036a200241306a290300370300200341f8026a200241286a2903" + "00370300200341f0026a2204200241206a290300370300200341e8026a20" + "0241186a290300370300200341e0026a200241106a290300370300200320" + "022903003703d0022003200241086a2903003703d802200341d0026a2002" + "2002102f200341a0036a200141106a290300370300200341a8036a200141" + "186a290300370300200341b0036a200141206a290300370300200341b803" + "6a200141286a290300370300200341c0036a200141306a29030037030020" + "0341c8036a200141386a2903003703002003200129030037039003200320" + "0141086a2903003703980320034190036a20012001102f200341d0006a20" + "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" + "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" + "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" + "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" + "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" + "6a20034190056a103002400240200341d0026a200341106a104a45044020" + "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" + "370300200341c0026a4200370300200341b8026a4200370300200341b002" + "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" + "00370300200341a8016a200141186a290300370300200341b0016a200141" + "206a290300370300200341b8016a200141286a290300370300200341c001" + "6a200141306a290300370300200341c8016a200141386a29030037030020" + "0342003703a00220032001290300370390012003200141086a2903003703" + "980120034188026a200241386a29030037030020034180026a200241306a" + "290300370300200341f8016a200241286a290300370300200341f0016a20" + "0241206a290300370300200341e8016a200241186a290300370300200341" + "e0016a200241106a290300370300200341d8016a200241086a2903003703" + "0020034201370390022003420037039802200320022903003703d0012003" + "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" + "00200341f8036a420037030020034180046a420037030020034188046a42" + "00370300200342003703d003200342003703d803200342a9c0c689aece93" + "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" + "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" + "00104b1a2003420037039804200342013703900441ff0121040340200320" + "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" + "ff01716a2206290308832107200329030020062903008321082005044020" + "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" + "1a0b2007200884420052044020034190056a200341d0036a20034190016a" + "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" + "2204417f470d000b20034190056a200341d0036a20034190016a10440240" + "20032903900620034198066a290300844200520d0020032903a006200341" + "a8066a290300844200520d0020032903b006200341b8066a290300844200" + "520d0020032903c006200341c8066a290300844200520d00200341c8056a" + "200141386a290300370300200341c0056a200141306a2903003703002003" + "41b8056a200141286a290300370300200341b0056a200141206a29030037" + "0300200341a8056a200141186a290300370300200341a0056a200141106a" + "290300370300200341d8056a200241086a290300370300200341e0056a20" + "0241106a290300370300200341e8056a200241186a290300370300200341" + "f0056a200241206a290300370300200341f8056a200241286a2903003703" + "0020034180066a200241306a29030037030020034188066a200241386a29" + "03003703002003200129030037039005200320022903003703d005200320" + "0141086a29030037039805200041106a20034190056a418001104c1a2000" + "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" + "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" + "022d001021072000027f024020022d0030220841c101470440200235011a" + "2109200233011e210a2002290112211620022903202114200241d8006a22" + "01200241286a29030022173703002002201437035020022009200a422086" + "842219421086201642308884220937034820022007ad42ff018320164210" + "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" + "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" + "0b200954ad220920022903487c220a200954ad220c20022903507c220942" + "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" + "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" + "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" + "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" + "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" + "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" + "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" + "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" + "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" + "470440230041e0006b220324004190aac0004190aac0002d000022044101" + "20041b3a00000240200404400340024002400240200441ff017141016b0e" + "03000501020b03404190aac0002d000022044101460d000b024002402004" + "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" + "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" + "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" + "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" + "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" + "220142003703002003420037033020034200370328200342043703202003" + "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" + "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" + "200341206a200341406b103a200320032903202003290328200329033020" + "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" + "c00041023a00004188aac00020042903003703004180aac0002005290300" + "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" + "200341e0006a24000b20024198016a4188aac00029030037030020024190" + "016a4180aac000290300370300200241f8a9c00029030037038801200241" + "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" + "210c0340200220024180016a200141037641f0ffffff01716a2205290300" + "2005290308200141ff0071104e200241286a2205200b3703002002200937" + "03202002200c3703182002200a370310200241106a200a200c2009200b42" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" + "0229032021092002290318210c2002290310210a20022802004101710440" + "2005200b370300200220093703202002200a3703102002200c3703182002" + "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f102b2005290300210b2002290318210c200229032021092002290310" + "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" + "20093703202002200c3703182002200a370310200241106a2010200d200f" + "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" + "0378200220093703702002200c3703682002200a370360200241e0006a20" + "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" + "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" + "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" + "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" + "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" + "030041d8a9c000290300102d2002290388012110200229038001210d0240" + "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" + "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" + "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" + "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" + "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" + "0d010b2002200f3703202002200d37031020022009370328200220103703" + "18027e0240200241e0006a200241106a104a0440420021104200210f4200" + "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" + "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" + "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" + "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" + "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" + "0e201554200b201054200b2010511b200c200f542009200a562009200a51" + "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" + "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" + "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" + "40024002400240417f201b420052200f2012562009200d562009200d511b" + "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" + "85200b201085844200520b4101460d010b200841c001470d014200210942" + "00210a4200210b4200210c2011201284200d20138484500d04427f420042" + "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" + "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" + "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" + "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" + "20117d21090c040b2008418001460d010b201121092013210a2012210b20" + "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" + "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" + "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" + "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" + "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" + "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" + "2014370320200020163701122000200b3703402000200937033020002006" + "3a0011200020073a0010200020193e011a200020173703282000200c3703" + "482000200a3703382000411e6a20194220883d010041000c020b20002006" + "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" + "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" + "0620022d00f0042107024002400240024020022d009005220941c1014704" + "4020024198016a220520022901fa04370300200241a6016a220420024188" + "056a2203290100370100200241a0016a220820024182056a290100370300" + "200220022901f20437039001200241f0046a200141206a102e20022d00f0" + "04450440200241d5076a2003290300220c37000020024188016a20024198" + "056a290300220b37030020024180016a20024190056a290300220a370300" + "200241c8006a200b370300200241406b200a370300200220022903800522" + "0b3703702002200c3703782002200b3703302002200c370338200220063a" + "0051200220073a0050200241e8006a22012004290100370100200241e200" + "6a2008290300370100200241da006a200529030037010020022002290390" + "01370152200941c000460d0220024180026a200241406b29030037030020" + "024188026a200241c8006a29030037030020024190026a200241d0006a29" + "030037030020024198026a200241d8006a290300370300200241a0026a20" + "0241e0006a290300370300200241a8026a20012903003703002002200229" + "03303703f001200220022903383703f801200241f0016a200241306a2002" + "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" + "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" + "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" + "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" + "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" + "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" + "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" + "002204410120041b3a00000240200404400340024002400240200441ff01" + "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" + "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" + "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" + "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" + "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" + "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" + "200341386a22014200370300200342003703302003420037032820034204" + "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" + "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" + "903c370340200341206a200341406b103a20032003290320200329032820" + "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" + "200829030037030041d8aac000200329030837030041d0aac00020032903" + "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" + "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" + "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" + "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" + "046a200141037641f0ffffff01716a22052903002005290308200141ff00" + "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" + "0e3703e0072002200d3703d807200220103703d007200220113703c80720" + "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" + "082002200e3703a0082002200d3703980820022010370390082002201137" + "0388082002200b370380082002280220210520024180076a200241c0076a" + "20024180086a102f20024198076a290300210d2004290300210f20032903" + "00210a2002290388072111200229038007210b2002290390072110200229" + "03a007210e20022903b007210c200541017104402002200a3703b8082002" + "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" + "200220103703900820022011370388082002200b37038008200241c0076a" + "20024180086a200241b0016a102f200241e8076a290300210f200241f807" + "6a290300210a20022903c007210b20022903d007211020022903e007210e" + "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" + "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" + "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" + "02200d3703c802200220113703b802200241f0026a200241b0026a200241" + "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" + "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" + "000240200104400340024002400240200141016b0e03000501020b034041" + "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" + "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" + "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" + "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" + "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" + "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" + "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" + "00370300200241a8aac0002903003703c806200241a0aac0002903003703" + "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" + "034200210a4200210e4200210f420021104200210d420021110340200241" + "106a200241c0066a200141037641f0ffffff01716a220529030020052903" + "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" + "03e8072002200e3703e0072002200d3703d807200220103703d007200220" + "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" + "02200f3703a8082002200e3703a0082002200d3703980820022010370390" + "0820022011370388082002200b370380082002280210210520024180076a" + "200241c0076a20024180086a102f20024198076a290300210d2004290300" + "210f2003290300210a2002290388072111200229038007210b2002290390" + "07211020022903a007210e20022903b007210c200541017104402002200a" + "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" + "200d37039808200220103703900820022011370388082002200b37038008" + "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" + "0f200241f8076a290300210a20022903c007210b20022903d00721102002" + "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" + "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" + "03a00820022010370390082002200b370380082002200a3703b808200220" + "0f3703a8082002200d370398082002201137038808200241f0036a200241" + "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" + "22054200370300200241b8086a22044200370300200242a9c0c689aece93" + "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" + "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" + "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" + "4020024190046a2003104a450d010b200142003703002005420037030020" + "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" + "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" + "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" + "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" + "6a4200370300200241a0086a4200370300200241a8086a42003703002002" + "41b0086a4200370300200241b8086a420037030020024200370388084201" + "210b20024201370380082002420037039008200241c0066a200241b0036a" + "20024180086a103041a0abc0002d00004102470440230041e0006b220324" + "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" + "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" + "002d000022044101460d000b02400240200441016b0e03000601030b000b" + "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" + "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" + "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" + "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" + "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" + "03302003420037032820034202370320200342a9c0c689aece93b2303703" + "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" + "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" + "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" + "20042903003703004190abc00020082903003703004188abc00020032903" + "083703004180abc00020032903003703000b200341e0006a24000b200241" + "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" + "0020024188abc0002903003703d80420024180abc0002903003703d00441" + "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" + "210f420021104200210d4200211103402002200241d0046a200141037641" + "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" + "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" + "0d3703d807200220103703d007200220113703c8072002200b3703c00720" + "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" + "082002200d37039808200220103703900820022011370388082002200b37" + "0380082002280200210520024180076a200241c0076a20024180086a102f" + "20024198076a290300210d2004290300210f2003290300210a2002290388" + "072111200229038007210b200229039007211020022903a007210e200229" + "03b007210c200541017104402002200a3703b8082002200c3703b0082002" + "200f3703a8082002200e3703a0082002200d370398082002201037039008" + "20022011370388082002200b37038008200241c0076a20024180086a2002" + "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" + "2903c007210b20022903d007211020022903e007210e20022903f007210c" + "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" + "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" + "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" + "0220113703880620024180056a20024180066a200241f0026a102f0c050b" + "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" + "0c040b200020063a0002200020073a0001200041013a00000c030b200241" + "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" + "200241e0066a4200370300200241d8066a4200370300200242003703d006" + "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" + "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" + "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" + "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" + "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" + "0241f0046a200241c0066a10310240024020022802f00441017104402002" + "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" + "056a2204290300370300200241a8086a2203200241a8056a220629030037" + "0300200241a0086a200241a0056a29030037030020024198086a20024198" + "056a220729030037030020024190086a20024190056a2903003703002002" + "20022903800537038008200220024188056a290300370388082002418006" + "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" + "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" + "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" + "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" + "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" + "f0046a200241c0066a103120022802f004410171450d0120012005290300" + "370300200241b0086a200429030037030020032006290300370300200241" + "a0086a200241a0056a29030037030020024198086a200729030037030020" + "024190086a20024190056a29030037030020022002290380053703800820" + "0220024188056a2903003703880820024180076a200241c0076a20024180" + "086a102f200241f0046a20024180066a20024180076a100720022d00f004" + "4101460d02200041106a20024180056a418001104c1a200041003a00000c" + "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" + "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" + "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" + "4200370300200242003703b808200242003703b008200242003703a80820" + "0242013703a0082002420037038808200242003703800820024180056a20" + "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" + "6a290300210c20022903a005210f20022903b005210b200229039005220d" + "20022903800522158420024198056a290300221220024188056a29030022" + "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" + "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" + "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" + "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" + "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" + "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" + "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" + "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" + "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" + "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" + "0240417f200b201085200a200c8584420052200b201054200a200c56200a" + "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" + "201485200e2011858442005221010b2019211c2017211d2018211a201621" + "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" + "0b027e200d20188520122016858450044020152019542013201754201320" + "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" + "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" + "1e200e211f200b2120200c212120192115201721132018210d2016211220" + "14210f2011210e2010210b200a210c0b200041186a200229037837030020" + "0020022903703703102000200229039001370132200041286a2002418801" + "6a290300370300200041206a20024180016a2903003703002000413a6a20" + "024198016a290300370100200041c2006a200241a0016a29030037010020" + "0041c8006a200241a6016a29010037010020094180014604402000202037" + "0380012000201e3703702000201a3703602000201c370350200020063a00" + "31200020073a0030200041003a000020002021370388012000201f370378" + "2000201b3703682000201d3703580c010b2000200b370380012000200f37" + "03702000200d37036020002015370350200020063a0031200020073a0030" + "200041003a00002000200c370388012000200e3703782000201237036820" + "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" + "022400200241386a4200370300200241306a4200370300200241286a4200" + "370300200241206a22034200370300200241186a4200370300200241106a" + "4200370300200241d8006a4200370300200241e0006a4200370300200241" + "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" + "200242003703482002420137034020024200370308200242003703002002" + "420037035002400240024020012002104a0d00200141206a2003104a0d00" + "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" + "010b200141f8006a290300210e200141e8006a2903002106200129037021" + "0c2001290360210d200129035022042001290340220884200141d8006a29" + "0300220b200141c8006a290300220984844200520440427f4200427f4200" + "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" + "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" + "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" + "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" + "21070b4200210442002108420021094200210b200c200d842006200e8484" + "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" + "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" + "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" + "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" + "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" + "20002005370350200020073703402000200b370378200020083703682000" + "200a3703582000200f37034820002001290300370300200041386a200141" + "386a290300370300200041306a200141306a290300370300200041286a20" + "0141286a290300370300200041206a200141206a29030037030020004118" + "6a200141186a290300370300200041106a200141106a2903003703002000" + "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" + "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" + "411c6a1001220045044041000f0b200041086b210102402000410f714504" + "40200121000c010b200041046b220528020022064178712000410f6a4170" + "7141086b2200200020016b4111494104746a220020016b22026b21032006" + "410371044020002003200028020441017172410272360204200020036a22" + "032003280204410172360204200520022005280200410171724102723602" + "00200120026a220320032802044101723602042001200210170c010b2001" + "2802002101200020033602042000200120026a3602000b02402000280204" + "2201410371450d0020014178712202200441106a4d0d0020002004200141" + "017172410272360204200020046a2201200220046b220441037236020420" + "0020026a220220022802044101723602042001200410170b200041086a0b" + "de0a01047f230041f0026b22032400200341a8026a220442003703002003" + "41a0026a22054200370300200342003703c802200342003703c002200342" + "003703b802200342013703b0022003420037039802200342003703900220" + "0341b0026a21060240024002400240200120034190026a104a4504402001" + "41206a2006104a450d010b20044200370300200542003703002003420037" + "03c802200342003703c002200342003703b802200342013703b002200342" + "00370398022003420037039002200220034190026a104a45044020024120" + "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" + "00370300200341a0026a4200370300200342003703c802200342003703c0" + "02200342003703b802200342013703b00220034200370398022003420037" + "039002027f0240200120034190026a104a450440200141206a200341b002" + "6a104a450d010b20042001290320370300200441186a200141386a290300" + "370300200441106a200141306a290300370300200441086a200141286a29" + "0300370300200341106a200141106a290300370300200341186a20014118" + "6a290300370300200320012903003703002003200141086a290300370308" + "200341d0006a0c010b20054200370300200341106a420037030020034118" + "6a4200370300200541086a4200370300200541106a420037030020054118" + "6a4200370300200342003703002003420037030820042105200341306a0b" + "210620034180016a2101200341a0016a2104200642003703082006420037" + "03002005420037030820054201370300200341a8026a4200370300200341" + "a0026a4200370300200342003703c802200342003703c002200342003703" + "b802200342013703b00220034200370398022003420037039002027f0240" + "200220034190026a104a450440200241206a200341b0026a104a450d010b" + "20012002290320370300200141186a200241386a29030037030020014110" + "6a200241306a290300370300200141086a200241286a2903003703002003" + "41f0006a200241106a290300370300200341f8006a200241186a29030037" + "0300200320022903003703602003200241086a290300370368200341b001" + "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" + "370300200441086a4200370300200441106a4200370300200441186a4200" + "37030020034200370360200342003703682001210420034190016a0b2205" + "420037030820054200370300200442003703082004420137030020034190" + "026a2003200341e0006a1040200341c0016a20034190026a104120032802" + "c001410171450d02200020032903d001370300200041386a20034188026a" + "290300370300200041306a20034180026a290300370300200041286a2003" + "41f8016a290300370300200041206a200341f0016a290300370300200041" + "186a200341e8016a290300370300200041106a200341e0016a2903003703" + "00200041086a200341d8016a2903003703000c030b200020022903003703" + "00200041386a200241386a290300370300200041306a200241306a290300" + "370300200041286a200241286a290300370300200041206a200241206a29" + "0300370300200041186a200241186a290300370300200041106a20024110" + "6a290300370300200041086a200241086a2903003703000c020b20002001" + "290300370300200041386a200141386a290300370300200041306a200141" + "306a290300370300200041286a200141286a290300370300200041206a20" + "0141206a290300370300200041186a200141186a29030037030020004110" + "6a200141106a290300370300200041086a200141086a2903003703000c01" + "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" + "7f067e230041e0006b22022400200241386a4200370300200241306a4200" + "370300200242003703582002420037035020024200370348420121042002" + "42013703402002420037032820024200370320027e02402001200241206a" + "104a450440200141206a200241406b104a450d010b200241106a20014110" + "6a290300370300200241186a200141186a29030037030020022001290300" + "3703002002200141086a290300370308200141286a290300210520012903" + "30210620012903202107200141386a2903000c010b42002104200241106a" + "4200370300200241186a4200370300200242003703002002420037030842" + "01210742000b210820004200370358200042003703502000200437034020" + "002006370330200020073703202000200229030037030020002003370348" + "2000200837033820002005370328200041086a2002290308370300200041" + "186a200241186a290300370300200041106a200241106a29030037030020" + "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" + "044108200241037122021b20016a4f0440200241002003200141276a4b1b" + "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" + "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" + "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" + "200241c0016a22034200370300200241b8016a4200370300200241b0016a" + "4200370300200241f8016a420037030020024180026a4200370300200241" + "88026a420037030020024190026a420037030020024198026a4200370300" + "200242003703e80142012105200242013703e001200242003703a8012002" + "42003703a001200242003703f0010240024002402001200241a0016a104a" + "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" + "41e0006a20024180026a104a450d010b200241106a420037030020024118" + "6a4200370300200241206a4200370300200241286a420037030020024140" + "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" + "00200241d0006a200141f0006a290300370300200241d8006a200141f800" + "6a2903003703002002420037030020024200370308200220012903503703" + "302002200141d8006a290300370338200141c8006a290300210620012903" + "40210720024198016a200141386a29030037030020024190016a20014130" + "6a29030037030020024188016a200141286a29030037030020024180016a" + "200141206a290300370300200241f8006a200141186a2903003703002002" + "41f0006a200141106a2903003703002002200141086a2903003703682002" + "20012903003703600c010b42002105200241f0006a4200370300200241f8" + "006a420037030020024180016a420037030020024188016a420037030020" + "024190016a420037030020024198016a4200370300200241406b42003703" + "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" + "00370300200241106a4200370300200241186a4200370300200241206a42" + "00370300200241286a420037030020024200370360200242003703682002" + "420037033020024200370338200242003703002002420037030842012107" + "0b2000200737034020002002290360370300200020022903303703502000" + "2006370348200041086a2002290368370300200041d8006a200229033837" + "0300200041386a20024198016a290300370300200041306a20024190016a" + "290300370300200041286a20024188016a290300370300200041206a2002" + "4180016a290300370300200041186a200241f8006a290300370300200041" + "106a200241f0006a290300370300200041e0006a200241406b2903003703" + "00200041e8006a200241c8006a290300370300200041f0006a200241d000" + "6a290300370300200041f8006a200241d8006a2903003703002000200437" + "0388012000200537038001200020022903003703900120004198016a2002" + "290308370300200041a0016a200241106a290300370300200041a8016a20" + "0241186a290300370300200041b0016a200241206a290300370300200041" + "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" + "0041306b2203240020032001360204200320003602002003410236020c20" + "0341c481c00036020820034202370214200342808080801022042003ad84" + "37032820032004200341046aad843703202003200341206a360210200341" + "086a2002101a000b4101017f230041206b22032400200341003602102003" + "4101360204200342043702082003200136021c2003200036021820032003" + "41186a36020020032002101a000b6801017f230041306b22032400200320" + "01360204200320003602002003410236020c2003418484c0003602082003" + "42023702142003200341046aad4280808080108437032820032003ad4280" + "80808010843703202003200341206a360210200341086a2002101a000b79" + "01017f230041406a220524002005200136020c2005200036020820052003" + "360214200520023602102005410236021c200541d881c000360218200542" + "023702242005200541106aad428080808020843703382005200541086aad" + "428080808030843703302005200541306a360220200541186a2004101a00" + "0b3601017f230041206b22012400200141003602182001410136020c2001" + "41d480c00036020820014204370210200141086a2000101a000bcc060105" + "7f0240024002400240200041046b22062802002207417871220441044108" + "200741037122051b20016a4f044020054100200141276a22082004491b0d" + "0102400240200241094f04402003100b22040d0141000f0b41102003410b" + "6a4178712003410b491b2101024020054504402001418002490d01200420" + "01410472490d01200420016b418180084f0d010c030b200041086b220220" + "046a2105024002400240200120044b0440200541a0a9c000280200460d03" + "2005419ca9c000280200460d02200528020422074102710d042007417871" + "220720046a22042001490d04200520071016200420016b22034110490d01" + "20062001200628020041017172410272360200200120026a220120034103" + "72360204200220046a220420042802044101723602042001200310172000" + "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" + "200120026a22012003410372360204200520052802044101723602042001" + "2003101720000f0b20062004200628020041017172410272360200200220" + "046a2201200128020441017236020420000f0b4194a9c00028020020046a" + "22042001490d010240200420016b2203410f4d0440200620074101712004" + "72410272360200200220046a220120012802044101723602044100210341" + "0021010c010b20062001200741017172410272360200200120026a220120" + "03410172360204200220046a2204200336020020042004280204417e7136" + "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" + "c00028020020046a220420014b0d070b20031001220145044041000f0b20" + "012000417c4178200628020022044103711b20044178716a220420032003" + "20044b1b104c21012000100420010f0b200420002001200320012003491b" + "104c210420062802002203417871220541044108200341037122031b2001" + "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" + "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b20062001200741017172410272360200200120026a220320042001" + "6b22014101723602044198a9c000200136020041a0a9c000200336020020" + "000bf10201047f200028020c21020240024020014180024f044020002802" + "1821040240024020002002460440200041144110200028021422021b6a28" + "020022010d01410021020c020b20002802082201200236020c2002200136" + "02080c010b200041146a200041106a20021b210303402003210520012202" + "41146a200241106a200228021422011b210320024114411020011b6a2802" + "0022010d000b200541003602000b2004450d022000200028021c41027441" + "f4a5c0006a220128020047044020044110411420042802102000461b6a20" + "023602002002450d030c020b2001200236020020020d014190a9c0004190" + "a9c000280200417e200028021c77713602000c020b200028020822032002" + "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" + "0200417e200141037677713602000f0b2002200436021820002802102201" + "044020022001360210200120023602180b20002802142201450d00200220" + "01360214200120023602180b0ba90601047f200020016a21020240024020" + "0028020422034101710d002003410271450d012000280200220320016a21" + "01200020036b2200419ca9c0002802004604402002280204410371410347" + "0d014194a9c000200136020020022002280204417e713602042000200141" + "0172360204200220013602000c020b2000200310160b0240024002402002" + "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" + "00280200460d0320022003417871220310162000200120036a2201410172" + "360204200020016a20013602002000419ca9c000280200470d014194a9c0" + "0020013602000f0b20022003417e71360204200020014101723602042000" + "20016a20013602000b20014180024f0440411f2102200042003702102001" + "41ffffff074d04402001410620014108766722026b764101712002410174" + "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" + "027422044190a9c000280200714504402003200036020020002003360218" + "2000200036020c200020003602084190a9c0004190a9c000280200200472" + "3602000f0b02400240200120032802002204280204417871460440200421" + "020c010b2001411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712001470d000b0b20022802082201200036020c20" + "022000360208200041003602182000200236020c200020013602080f0b20" + "052000360200200020043602182000200036020c200020003602080f0b20" + "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" + "037674220171450440418ca9c000200120037236020020020c010b200228" + "02080b2101200220003602082001200036020c2000200236020c20002001" + "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" + "6a2201360200200020014101723602042000419ca9c000280200470d0141" + "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" + "004194a9c0004194a9c00028020020016a22013602002000200141017236" + "0204200020016a20013602000b0b8e0201057f230041206b220324002000" + "2802002202417f460440410020011019000b410820024101742204200241" + "016a2205200420054b1b2204200441084d1b220441004804404100200110" + "19000b20032002047f2003200236021c2003200028020436021441010541" + "000b360218200341086a2105027f0240200341146a220228020404402002" + "280208220645044041bda9c0002d00001a0c020b20022802002006410120" + "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" + "20052002410120021b360204200520024536020020032802084101460440" + "20032802101a200328020c20011019000b200328020c2102200020043602" + "0020002002360204200341206a24000b0d002000450440200110140b000b" + "f40102027f017e230041106b22022400200241013b010c20022001360208" + "20022000360204230041106b22002400200241046a220129020021042000" + "200136020c20002004370204230041106b22022400200041046a22012802" + "00220028020c2103024002400240024020002802040e020001020b20030d" + "0141012100410021030c020b20030d002000280200220028020421032000" + "28020021000c010b20024180808080783602002002200136020c20012802" + "0822012d0008210020012d00091a2002410420001033000b200220033602" + "0420022000360200200128020822012d0008210020012d00091a20024105" + "20001033000b6801017f230041306b220324002003200136020420032000" + "3602002003410236020c200341e483c00036020820034202370214200320" + "0341046aad4280808080108437032820032003ad42808080801084370320" + "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" + "002102230041106b22072400410a2103024020024190ce00490440200221" + "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" + "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" + "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" + "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" + "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" + "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" + "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" + "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" + "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" + "210941012108410a20036b220a2001280214220241017122056a21062008" + "410020024104711b2108412b418080c40020051b21052001280200450440" + "4101200128021c22002001280220220320052008101d0d011a2000200920" + "0a200328020c1103000c010b0240024002402006200128020422004f0440" + "200128021c22002001280220220320052008101d450d0141010c040b2002" + "410871450d01200128021021022001413036021020012d0018210c410121" + "0b200141013a0018200128021c22032001280220220420052008101d0d02" + "200020066b41016a210002400340200041016b2200450d01200341302004" + "280210110200450d000b41010c040b410120032009200a200428020c1103" + "000d031a2001200c3a00182001200236021041000c030b20002009200a20" + "0328020c110300210b0c010b200020066b2102024002400240410120012d" + "0018220020004103461b220041016b0e020001020b20022100410021020c" + "010b20024101762100200241016a41017621020b200041016a2100200128" + "0210210620012802202103200128021c210402400340200041016b220045" + "0d01200420062003280210110200450d000b41010c020b4101210b200420" + "0320052008101d0d0020042009200a200328020c1103000d004100210003" + "40410020002002460d021a200041016a2100200420062003280210110200" + "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" + "380002402002418080c400460d00200020022001280210110200450d0041" + "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" + "0c7f20002802042107200028020021030240024020012802002209200128" + "0208220072044002402000410171450d00200320076a2106024020012802" + "0c2205450440200321020c010b200321020340200222002006460d02027f" + "200041016a20002c0000220241004e0d001a200041026a20024160490d00" + "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" + "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" + "07027f02402004450d00200420074f044020042007460d0141000c020b20" + "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" + "001b21030b2009450440200128021c20032007200128022028020c110300" + "0f0b2001280204210c200741104f044020072003200341036a417c712204" + "6b22086a220a41037121094100210541002100200320044704402008417c" + "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" + "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" + "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" + "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" + "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" + "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" + "4a6a21050b200a4102762106200020056a21050340200421092006450d04" + "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" + "200641044f04402004200d41f007716a2108200421000340200028020c22" + "04417f7341077620044106767241818284087120002802082204417f7341" + "077620044106767241818284087120002802042204417f73410776200441" + "06767241818284087120002802002204417f734107762004410676724181" + "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" + "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" + "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" + "6a22022802002200417f734107762000410676724181828408712100200b" + "4101460d0220022802042204417f73410776200441067672418182840871" + "20006a2100200b4102460d0220022802082202417f734107762002410676" + "7241818284087120006a21000c020b2007450440410021050c030b200741" + "03712102027f200741044904404100210041000c010b20032c000041bf7f" + "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" + "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" + "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" + "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" + "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" + "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" + "41016b22020d000b0c020b200128021c20032007200128022028020c1103" + "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" + "20056a21050b02402005200c490440200c20056b21060240024002402001" + "2d00182200410020004103471b220041016b0e020001020b200621004100" + "21060c010b20064101762100200641016a41017621060b200041016a2100" + "2001280210210820012802202102200128021c21040340200041016b2200" + "450d02200420082002280210110200450d000b41010f0b200128021c2003" + "2007200128022028020c1103000f0b200420032007200228020c11030004" + "4041010f0b4100210003402000200646044041000f0b200041016a210020" + "0420082002280210110200450d000b200041016b2006490b140020002802" + "002001200028020428020c1102000b0e0041e480c000412b20001011000b" + "5901017f230041306b220324002003200136020c20032000360208200341" + "01360214200341dc80c0003602102003420137021c2003200341086aad42" + "8080808030843703282003200341286a360218200341106a2002101a000b" + "7f01017f027f0240027f0240200228020404402002280208220345044020" + "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" + "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" + "032002450c010b4104210341000b21022000200136020820002003360204" + "200020023602000bdd0101087f230041206b220224002000280200220341" + "7f460440410020011019000b20034101742204200341016a220620042006" + "4b1b220441ffffffff034b0440410020011019000b024041042004200441" + "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" + "02200341027436021c2002200028020436021441040520040b3602182002" + "41086a2006200241146a102220022802084101470d012002280210210520" + "0228020c0520050b210820052109200820011019000b200228020c210320" + "00200736020020002003360204200241206a24000bd10d021c7f077e2300" + "41206b220c2400200341016b211102400240024002402003044020034102" + "6b210520034101460d0402402001280208221420036b221941016a220e41" + "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" + "746a2802002115200220054102746a3502002123027f2004450440410421" + "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" + "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" + "09200e044020012802042212200941027420034102746b6a211320034101" + "7121162003417e71210d201241086b211b201241046b211c42002015ad22" + "2242208622247d2125200e210f0340024020090440201c20094102742204" + "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" + "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" + "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" + "868422202020202280222620227e7d21202026a70b21070240202042ffff" + "ffff0f560d00202520204220867c20217c21210340202120247c22212007" + "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" + "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" + "09200f460d04201220176a21182007ad212102400240201145044042ffff" + "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" + "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" + "22203e0200200441046a220a200a35020020204220887c2021200541046a" + "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" + "04200541086a2105200d200641026a2206470d000b2016450d010b201820" + "0641027422046a2205202020053502007c2021200220046a3502007e7d42" + "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" + "20114504404100210a410021080c030b41002104410021084100210a0340" + "200420136a22052005280200221d200220046a221e2802006a220620086a" + "2208360200200541046a22052005280200221f201e41046a2802006a2205" + "2006201d49200620084b726a22063602002005201f49200520064b722108" + "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" + "c000101b000b2016450d010b2018200a41027422046a2205200528020020" + "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" + "3602002001200941016b2209360208201341046b2113201220094102746a" + "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" + "200941016a220d3602082001280204220a200941027422046a2008360200" + "20080d03200d41ffffffff0371210702400340200721052004417c460d01" + "200541016b21072004200a6a2106200441046b21042006280200450d000b" + "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" + "41ac87c0001010000b200120053602082005210d0b024002400240024002" + "40200d200128020022044102764f0d002004200d490d012004450d002004" + "41027421040240200d450440200a41046b28020022054178712207410441" + "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" + "200a1004410421040c010b200a20044104200d41027410152204450d060b" + "2001200d360200200120043602040b41002106200e450d03200b200e4102" + "746a41046b2802000440200e21060c040b201441027420034102746b2104" + "201941026a210503402004417c460d04200541016b21052004200b6a2107" + "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" + "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" + "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b024002400240024020104102" + "7620064d0440201021040c010b200620104b0d01410021042010450d0020" + "1041027421052006450440200b41046b2802002207417871220a41044108" + "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" + "0b10044104210b0c010b200b20054104200622044102741015220b450d04" + "0b200020063602082000200b360204200020043602002000200129020037" + "020c200041146a200141086a280200360200200c41206a24000f0b200c41" + "00360218200c410136020c200c41ec84c000360208200c4204370210200c" + "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" + "010c7f230041306b220724002001280200210c0240024002400240024002" + "400240024002400240024002400240024020024504402001280204210b20" + "0c418080808078470d02200b41086a280200220441ffffffff034d044020" + "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" + "220b2001200c418080808078461b2208280208220941feffffff014f0d04" + "41bda9c0002d00001a200941026a220141027410012205450d0720054100" + "360200200720053602102007200136020c41012101200741013602142008" + "2802082206410274210d200828020421082006200941016a4b0440200741" + "0c6a2105230041206b22042400024002402006417f460d00200528020022" + "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" + "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" + "047f2004200941027436021c2004200528020436021441040541000b3602" + "18200441086a200a200441146a102220042802084101470d012004280210" + "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" + "0f36020020052001360204200441206a2400200728021021052007280214" + "21010b200520014102746a2008200d104c1a2007200120066a2204360214" + "0c030b200b41046a28020021092006450440410421054100210141042009" + "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" + "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" + "2004360214200720053602102007200136020c0b200341ff0171450d0202" + "40200220044d044020022004470d01200221040c040b2002410041c889c0" + "00101b000b20044102742109200241027421012003411f71210841002003" + "6b411f71210d410021030340200120056a22062006280200220620087420" + "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" + "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" + "89c0001023200728021021050b200520044102746a200336020020072004" + "41016a22043602140b41002108200728020c210a02402004450d00200520" + "0441027422016a41046b2802000440200421080c010b200541046b210d20" + "0441ffffffff037121030340200321062001450d01200641016b21032001" + "200d6a2109200141046b21012009280200450d000b200420062004200649" + "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" + "41002101200a450d00200a41027421032008450440200541046b28020022" + "06417871220941044108200641037122061b20036a490d04200641002009" + "200341276a4b1b0d0520051004410421050c010b20052003410420082201" + "41027410152205450d010b20002008360208200020053602042000200136" + "02002002450d06200c41808080807872418080808078460d06200b41046b" + "28020022014178712203200c410274220641044108200141037122011b6a" + "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" + "003602282007410136021c200741ec84c000360218200742043702202007" + "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" + "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" + "bda9c0002d00001a024002400240412010012202450d0020022001290000" + "370200200220012900083702082002200129001037021020022001280018" + "3602182002200128001c220336021c410821012000027f410820030d001a" + "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" + "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" + "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" + "1a2002280200450440200241046b28020022014178714124412820014103" + "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" + "210141000c010b200241204104410410152202450d014101210141010b36" + "020820002002360204200020013602000f0b000b41f996c000412e41a897" + "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" + "024106746a2124200028021c21222000280218211f2000280214211e2000" + "280210211b200028020c2123200028020821202000280204211d20002802" + "002102034020022001280000220341187420034180fe0371410874722003" + "4108764180fe03712003411876727222152022201b411a77201b41157773" + "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" + "1d202073200271201d202071732002411e772002411377732002410a7773" + "6a6a2203411e772003411377732003410a777320032002201d7371200220" + "1d71736a201f2001280004220541187420054180fe037141087472200541" + "08764180fe03712005411876727222136a200420236a2207201b201e7371" + "201e736a2007411a772007411577732007410777736a419189dd89076a22" + "066a2205411e772005411377732005410a77732005200220037371200220" + "0371736a201e2001280008220441187420044180fe037141087472200441" + "08764180fe03712004411876727222146a200620206a220c2007201b7371" + "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a201b200128000c220641187420064180fe037141087472200641" + "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" + "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" + "086a2206411e772006411377732006410a77732006200420057371200420" + "0571736a20072001280010220f411874200f4180fe037141087472200f41" + "08764180fe0371200f411876727222166a200220086a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280014220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a2001280018220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a200128001c220841187420084180fe0371410874722008410876" + "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" + "096a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280020220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" + "096a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280024220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280028220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a200128002c220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" + "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a2001280030220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" + "200f736a2009411a772009411577732009410777736a41f4baf995076a22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280034220c411874200c4180fe037141087472200c410876" + "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" + "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" + "0d6a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280038220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" + "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" + "0f6a2207411e772007411377732007410a77732007200420067371200420" + "0671736a200128003c220d411874200d4180fe037141087472200d410876" + "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" + "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" + "086a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20134119772013410e777320134103767320156a200a6a200c41" + "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" + "1773712012736a2015411a772015411577732015410777736a41bfac92db" + "016b22096a2205411e772005411377732005410a77732005200320077371" + "2003200771736a20144119772014410e777320144103767320136a200b6a" + "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" + "2015201773712017736a2013411a772013411577732013410777736a41fa" + "f08682016b220e6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20114119772011410e777320114103767320146a" + "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" + "6a22142013201573712015736a2014411a77201441157773201441077773" + "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" + "2004200573712004200571736a20164119772016410e7773201641037673" + "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" + "0720126a22112013201473712013736a2011411a77201141157773201141" + "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" + "7320072004200673712004200671736a20184119772018410e7773201841" + "03767320166a20216a2009410f772009410d77732009410a76736a221220" + "136a200320176a22162011201473712014736a2016411a77201641157773" + "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" + "410a777320032006200773712006200771736a20194119772019410e7773" + "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" + "221720146a200520156a22182011201673712011736a2018411a77201841" + "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" + "732005410a777320052003200773712003200771736a201a411977201a41" + "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" + "76736a221520116a200420136a22192016201873712016736a2019411a77" + "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" + "411377732004410a777320042003200573712003200571736a2002411977" + "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" + "17410a76736a221320166a200620146a221a2018201973712018736a201a" + "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" + "772006411377732006410a777320062004200573712004200571736a200a" + "411977200a410e7773200a4103767320026a20086a2015410f772015410d" + "77732015410a76736a221420186a200720116a22022019201a7371201973" + "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" + "07411e772007411377732007410a77732007200420067371200420067173" + "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" + "13410d77732013410a76736a221120196a200320166a220a2002201a7371" + "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" + "186a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20104119772010410e7773201041037673200b6a200e6a201441" + "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" + "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" + "046b22196a2205411e772005411377732005410a77732005200320077371" + "2003200771736a201c411977201c410e7773201c4103767320106a20126a" + "2011410f772011410d77732011410a76736a221820026a200420196a2202" + "200a200b7371200a736a2002411a772002411577732002410777736a41b9" + "809a85046b221a6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20214119772021410e7773202141037673201c6a" + "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" + "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" + "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" + "2004200573712004200571736a200c411977200c410e7773200c41037673" + "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" + "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" + "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" + "7320072004200673712004200671736a200d411977200d410e7773200d41" + "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" + "026a200320106a2202200a200b7371200a736a2002411a77200241157773" + "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200f411977200f410e777320" + "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" + "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" + "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20084119772008410e" + "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" + "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" + "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a200941197720" + "09410e777320094103767320086a20166a200d410f77200d410d7773200d" + "410a76736a220820026a200620106a2202200a200b7371200a736a200241" + "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a200e41" + "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" + "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" + "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20124119772012410e7773201241037673200e6a20196a2008410f772008" + "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" + "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20174119772017410e777320174103767320126a201a6a2009410f" + "772009410d77732009410a76736a221220026a200520106a2202200a200b" + "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" + "6a22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20154119772015410e777320154103767320176a200c6a20" + "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" + "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" + "a8b3076a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20134119772013410e777320134103767320156a20" + "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" + "220b2002200a73712002736a200b411a77200b41157773200b410777736a" + "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20144119772014410e777320144103767320" + "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" + "20106a2202200a200b7371200a736a2002411a7720024115777320024107" + "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" + "20072004200673712004200671736a20114119772011410e777320114103" + "767320146a20086a2015410f772015410d77732015410a76736a2214200a" + "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" + "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20164119772016410e777320" + "164103767320116a20096a2013410f772013410d77732013410a76736a22" + "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" + "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20184119772018410e" + "777320184103767320166a200e6a2014410f772014410d77732014410a76" + "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" + "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201941197720" + "19410e777320194103767320186a20126a2011410f772011410d77732011" + "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" + "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201a41" + "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" + "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" + "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" + "410d77732018410a76736a221a20026a200320106a2202200a200b737120" + "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" + "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" + "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" + "6b22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" + "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" + "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" + "aa83016a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20084119772008410e7773200841037673200f6a20" + "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" + "2202200a200b7371200a736a2002411a772002411577732002410777736a" + "41968293cd016a221c6a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20094119772009410e777320094103767320" + "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" + "201c6a22082002200b7371200b736a2008411a7720084115777320084107" + "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" + "20072004200673712004200671736a200e411977200e410e7773200e4103" + "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" + "6a2003201c6a22092002200873712002736a2009411a7720094115777320" + "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20124119772012410e777320" + "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" + "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" + "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20174119772017410e" + "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" + "736a221220086a200220046a22082009200e73712009736a2008411a7720" + "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201541197720" + "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" + "410a76736a221720096a200220066a22092008200e7371200e736a200941" + "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201341" + "19772013410e777320134103767320156a200d6a2012410f772012410d77" + "732012410a76736a2215200e6a200220076a220e2008200973712008736a" + "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20144119772014410e777320144103767320136a200f6a2017410f772017" + "410d77732017410a76736a221320086a200220036a22082009200e737120" + "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20114119772011410e777320114103767320146a20106a2015410f" + "772015410d77732015410a76736a221420096a200220056a22092008200e" + "7371200e736a2009411a772009411577732009410777736a41ee85bea407" + "6a22026a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20164119772016410e777320164103767320116a200a6a20" + "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" + "08200973712008736a200e411a77200e41157773200e410777736a41efc6" + "95c5076a22026a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20184119772018410e777320184103767320166a20" + "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" + "22082009200e73712009736a2008411a772008411577732008410777736a" + "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20194119772019410e777320194103767320" + "186a20126a2011410f772011410d77732011410a76736a221220096a2002" + "20076a22092008200e7371200e736a2009411a7720094115777320094107" + "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" + "20072004200673712004200671736a201a411977201a410e7773201a4103" + "767320196a20176a2016410f772016410d77732016410a76736a2217200e" + "6a200320116a220e2008200973712008736a200e411a77200e4115777320" + "0e410777736a41868084fa066b22116a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200c411977200c410e777320" + "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" + "1220086a200520116a22052009200e73712009736a2005411a7720054115" + "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" + "2008410a777320082003200773712003200771736a200c200d411977200d" + "410e7773200d410376736a20136a2017410f772017410d77732017410a76" + "736a20096a200420156a22042005200e7371200e736a2004411a77200441" + "1577732004410777736a4189b89988046b22096a220c2003200873712003" + "200871736a200c411e77200c41137773200c410a77736a200d200f411977" + "200f410e7773200f410376736a20146a2012410f772012410d7773201241" + "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" + "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" + "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" + "21232004201f6a211f200520226a2122200141406b22012024470d000b20" + "00202236021c2000201f3602182000201e3602142000201b360210200020" + "2336020c200020203602082000201d360204200020023602000b89010101" + "7f027f0240200328020404402003280208220445044020012002450d031a" + "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" + "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" + "490d002002100b0c010b200210010b210320002002360208200020032001" + "20031b36020420002003453602000b3000200128021c20002d0000410274" + "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" + "1103000bfc0402037f017e23004180016b220224000240024020012d0000" + "220441c00171220341c000470440200241186a200141186a290000370300" + "200241106a200141106a290000370300200241086a200141086a29000037" + "030020022001290000220537030020022005a7413f713a0000200241406b" + "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" + "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" + "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" + "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" + "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" + "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" + "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" + "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" + "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" + "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" + "200041c0003a0020200041186a4200370300200041106a42003703002000" + "41086a42003703000c010b200241386a200241e8006a2903003703002002" + "41306a200241e0006a290300370300200220022903503703202002200241" + "d8006a2903003703282003044020002002290320370300200020033a0020" + "200041086a2002290328370300200041186a200241386a29030037030020" + "0041106a200241306a2903003703000c010b200241003602502002410136" + "0244200241a88cc00036024020024204370248200241406b419c8dc00010" + "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" + "00290300220c200041086a290300220d8450047e420005200741f0016a20" + "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" + "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" + "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" + "072903f0012112200741c8016a290300200741a8016a290300220d200729" + "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" + "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" + "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" + "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" + "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" + "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" + "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" + "21112000290310220c200041186a290300220d8450047e420005200741f0" + "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" + "104d20074180016a200d2002104d200741306a200c2003104d200741206a" + "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" + "0741c8006a290300200741286a290300220320072903407c2204200354ad" + "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" + "117c2204200254ad200420072903207c2202200454ad7c20022007418801" + "6a29030020074198016a29030022012007290380017c2204200154ad7c20" + "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" + "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" + "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" + "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" + "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" + "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" + "200e3703b002200720123703a002200720043703d802200720113703c802" + "2007200f3703b802200720133703a80220074188036a4200370300200741" + "80036a4200370300200741f8026a4200370300200742003703f002200741" + "f0026a210a41ff032109420021034200210442002101420021024201210d" + "0340200741106a2009410776410474220b200741a0026a6a220829030020" + "08290308200941ff00712208104e2004423f88210c20044201862003423f" + "888421042007290310420183200342018684210302400240024002400240" + "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" + "3f8884220242a9c0c689aece93b230858450044020032005542004200654" + "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" + "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" + "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" + "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" + "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" + "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" + "022004200f7d2104200320057d2103200941016a41810249200d42005271" + "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" + "22082008290300200729030084370300200841086a220820082903002007" + "41086a2903008437030020090d010b200020023703182000200137031020" + "0020043703082000200337030020074190036a24000f0b200941016b2109" + "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" + "3a00000240200004400340024002400240200041016b0e03000501020b03" + "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" + "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" + "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" + "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" + "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" + "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" + "0b0b840202047e017f200041086a29030021092000290300210a0240417f" + "2000290310220b200385200041186a290300220c20048584420052200320" + "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" + "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" + "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" + "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" + "2000200920027d22072001200a56ad22017d37030820002003427f852203" + "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" + "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" + "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" + "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" + "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" + "3700002003200210262000027f0240024002400240024002400240024002" + "40024002400240024002400240027f024002400240024002400240024002" + "7f02400240027f0240024002400240024002400240024002400240024002" + "400240024002400240024002400240200241046b28020022044178714124" + "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" + "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" + "290000370000200220012900002210370000200241106a2205200141106a" + "290000370000200241086a2208200141086a29000037000020022002411f" + "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" + "22072d00003a0001200720013a00002002411d6a22012d00002107200120" + "022d00023a0000200220073a00022002411c6a22012d0000210720012002" + "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" + "00043a0000200220073a00042002411a6a22012d00002107200120022d00" + "053a0000200220073a0005200241196a22012d00002107200120022d0006" + "3a0000200220073a000620042d00002101200420022d00073a0000200220" + "013a0007200241176a22012d00002104200120082d00003a000020082004" + "3a0000200241166a22012d00002104200120022d00093a0000200220043a" + "0009200241156a22012d00002104200120022d000a3a0000200220043a00" + "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" + "200241136a22012d00002104200120022d000c3a0000200220043a000c20" + "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" + "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" + "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" + "200241046b280200220141787141244128200141037122041b490d022004" + "4100200141c8004f1b0d032002100420032802082202450d120240024002" + "40200241016b220241feffffff0371450440200241ffffffff0371220441" + "016a2205410371210142002110200328020422082102200441034f044020" + "0541fcffffff07712104034020104280017c2110200241106a2102200441" + "046b22040d000b0b2001450d020340200235020020108620117c21112010" + "42207c2110200241046a2102200141016b22010d000b2011428080808010" + "540d010b200341406b200341146a2802003602002003200329020c370338" + "200341d0006a200341086a28020022043602002003200329020037034820" + "04450d0720032802402207450440200341206a418098c000280200220236" + "02002003412c6a2002360200200341f897c0002902002210370318200320" + "10370224200328024822020440200328024c220441046b28020022014178" + "7122052002410274220241044108200141037122011b6a490d0a20014100" + "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" + "3c220441046b280200220141787122052002410274220241044108200141" + "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" + "0b0240027f02400240024020044101460440200328024c220c2802002202" + "4101470d012003412c6a418098c000280200360200200341206a20034114" + "6a2802003602002003200329020c370318200341f897c000290200370224" + "20032802482202450d2a200c41046b280200220141787122042002410274" + "220241044108200141037122011b6a490d12200141002004200241276a4b" + "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" + "200747200420074b1b22050d0020074102742102200b41046b2106200441" + "02742101200c41046b2109200420076b21070340200204402001450d0720" + "0220066a2105200120096a2108200241046b2102200141046b2101417f20" + "082802002208200528020022054720052008491b2205450d010c020b0b41" + "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" + "450d1220074102742101200328023c2109200241ffff034d044020094104" + "6b2106410021040340200120066a22052005280200220541107622082008" + "20044110747220026e220420026c6b411074200541ffff03717222052002" + "6e22082004411074723602002005200220086c6b2104200141046b22010d" + "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" + "45044042002111200120096a0c270b200241016a41feffffff0771210120" + "0741027420096a41086b2102420021110340200241046a22042004350200" + "201142208684221120108022123e0200200220023502002011201020127e" + "7d42208684221120108022123e02002011201020127e7d2111200241086b" + "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" + "002003200329020c370224200341186a0c010b2003410036024020032802" + "38047f200b05200341386a418c87c0001023200328023c0b410136020020" + "0341406b4101360200200341206a41013602002003200329033837031820" + "0341246a0b220241086a418098c000280200360200200241f897c0002902" + "0037020020032802482202450d25200c41046b2802002201417871220420" + "02410274220241044108200141037122011b6a490d102001410020042002" + "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" + "20022802002202672208450440200341f8006a200341146a280200360200" + "2003200329020c370370200341186a200341f0006a200c20041024200328" + "02482202450d25200c41046b280200220141787122042002410274220241" + "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" + "200c10040c250b024002402003280238418080808078470d00200b280208" + "0d002003410036026c20034280808080c0003702640c010b200341e4006a" + "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" + "402003280248418080808078470d00200c2802080d004100210420034100" + "3602704100210541040c010b200341f0006a20032002452008411f711025" + "200328027021042003280278210520032802740b220120051024200341e0" + "006a200341206a28020036020020032003290218370358200328022c2105" + "200328022821092003280224210c20040440200141046b28020022074178" + "7122062004410274220441044108200741037122071b6a490d1420074100" + "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" + "404100210120092802080d0141042105410021040c220b41002101200545" + "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" + "0274220a20092206200620044102746a22056b4b04402005200a6a210120" + "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" + "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" + "200d2107200121040340200641016b2206200441016b22042d00003a0000" + "200741016b22070d000b0b200f4103490d00200441046b21040340200641" + "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" + "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" + "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" + "6b21064100200a6b210702402001200e6a2201410371450440200220064d" + "0d01200420056a41046b21050340200241046b2202200528020036020020" + "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" + "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" + "280200210a0340200241046b2202200a200e742005280200220a200d7672" + "360200200541046b2105200220064b0d000b0b2004410371210a20012007" + "6a21010c010b200a41104f044002402006410020066b41037122076a2204" + "20064d0d00200741016b210d200521022007044020072101034020062002" + "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" + "0b200d4107490d000340200620022d00003a0000200641016a200241016a" + "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" + "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" + "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" + "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" + "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" + "0371450440200420064f0d01200221050340200420052802003602002005" + "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" + "410374220a41187121072002417c71220f41046a21054100200a6b411871" + "210e200f280200210a03402004200a2007762005280200220a200e747236" + "0200200541046a2105200441046a22042006490d000b0b2001410371210a" + "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" + "0771220204400340200620052d00003a0000200541016a2105200641016a" + "2106200241016b22020d000b0b20014107490d010340200620052d00003a" + "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" + "003a0000200641036a200541036a2d00003a0000200641046a200541046a" + "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" + "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" + "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" + "0a41016b2104200a410371220504400340200641016b2206200141016b22" + "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" + "21050340200641016b200541036a2d00003a0000200641026b200541026a" + "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" + "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" + "200941046a28020021072009280208220420024522024d04402004410274" + "21022004044041bda9c0002d00001a200210012205450d360b2005200720" + "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" + "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" + "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" + "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" + "410371210820074103490d1b200641fcffffff077121070340200241046b" + "220620062802002206200176200572360200200241086b22052006200474" + "20052802002205200176723602002002410c6b2206200520047420062802" + "00220620017672360200200241106b220220062004742002280200220520" + "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" + "14200328021421022003280210210502402011428080045a04402002450d" + "0320024102742104200241ffffffff036a220741ffffffff037122020d01" + "42002110200420056a0c180b2002450d022011a721040c180b200241016a" + "41feffffff07712101200420056a41086b21024200211003402002350200" + "200241046a35020020104220868420118242208684201182211020024108" + "6b2102200141026b22010d000b0c150b2003280210210520032802142202" + "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" + "1011000b41b897c000412e41e897c0001011000b20034100360228200341" + "0136021c200341a099c00036021820034204370220200341186a41fc86c0" + "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" + "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" + "412e41e897c0001011000b200341003602282003410136021c200341a099" + "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b200341003602282003410136021c200341a099c00036021820034204" + "370220200341186a41989ac000101a000b200241086a0b21022007410171" + "047e201005200241046b3502002010422086842011820ba721010c010b20" + "0241027421024100210103402001411074200241046b220220056a280200" + "220141107672200470411074200141ffff037172200470210120020d000b" + "0b41002102200341206a418098c000280200360200200341f897c0002902" + "0037031820014504404104210741000c010b200341186a41f498c0001023" + "200328021c220720013602004101210220032802180b210a024002400240" + "0240200328020022010440200841046b2802002204417871220620014102" + "74220141044108200441037122041b6a490d01200441002006200141276a" + "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" + "787122082001410274220141044108200441037122041b6a490d02200441" + "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" + "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" + "41046b21020340200220022802002207200176200572360200200241046b" + "210220072004742105200841016b22080d000b0b41002101200b450d0020" + "09200b41027422026a41046b2802000440200b21010c010b200941046b21" + "07200b41ffffffff037121040340200421052002450d01200441016b2104" + "200220076a2108200241046b21022008280200450d000b200b2005200520" + "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" + "04200c450440200921050c050b200c41027421022001450440200941046b" + "2802002205417871220841044108200541037122051b20026a490d022005" + "41002008200241276a4b1b0d0320091004410421050c050b200121042009" + "200241042001410274101522050d040c180b200341003602282003410136" + "021c200341ec84c00036021820034204370220200341186a41f484c00010" + "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b200c2104200921050b200341206a200341e0006a2802003602" + "00200320032903583703182003200136022c200320053602282003200436" + "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" + "1105200241046b22022002350200201142208684221120108022123e0200" + "2011201020127e7d0ba721040b2003280238210b02402009200741027422" + "026a41046b2802000d00200941046b210620072101034020012105200245" + "0440410021070c020b200541016b2101200220066a2108200241046b2102" + "2008280200450d000b20072005200520074b1b21070b0240200b41027620" + "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" + "027421012007450440200941046b28020022054178712208410441082005" + "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" + "04410421090c010b2009200141042007220241027410152209450d100b20" + "034100360250200404402003280248047f200c05200341c8006a41dc86c0" + "001023200328024c0b2004360200200341013602500b2003412c6a200341" + "d0006a280200360200200320032903483702242003200936021c20032002" + "3602180b200328022c2102200328022821072003280224210a2003280218" + "2201450d00200328021c220541046b280200220441787122082001410274" + "220141044108200441037122041b6a490d04200441002008200141276a4b" + "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" + "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" + "86200720024102746a41046b28020067ad7d221042038820104207834200" + "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" + "a7220510012204450d0e0b200341003602202003200436021c2003200536" + "02182007200241016b22054102746a210920050440200241027441046b21" + "06410021020340200220076a280200210120032802182002460440200341" + "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" + "0241016a2205360220200141087621082003280218200546044020034118" + "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" + "03200541016a220536022020014110762108200328021820054604402003" + "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" + "002003200541016a22053602202001411876210120032802182005460440" + "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" + "3a00002003200541016a2205360220200241046a21012005210220012006" + "470d000b0b20092802002202450d05034020032802182001460440200341" + "186a419c88c00010180b200328021c220420016a20023a00002003200141" + "016a2201360220200241ff014b21052002410876210220050d000b0c060b" + "200341003602282003410136021c200341ec84c000360218200342043702" + "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" + "0218210d200141014b0d010b200341306a4200370300200341286a420037" + "0300200341206a4200370300200342003703180c010b200120046a210c41" + "002102200141017622084101470440200141016b2105200841feffffff07" + "71210b0340200420056a22062d000021092006200220046a22082d00003a" + "0000200820093a0000200c2002417e736a22062d00002109200620084101" + "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" + "2202470d000b0b20014102710440200220046a22052d000021082005200c" + "2002417f736a22022d00003a0000200220083a00000b200341306a420037" + "0300200341286a4200370300200341206a42003703002003420037031820" + "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" + "388620104280fe0383422886842010428080fc0783421886201042808080" + "f80f834208868484201042088842808080f80f832010421888428080fc07" + "838420104228884280fe038320104238888484842112200341306a290300" + "221042388620104280fe0383422886842010428080fc0783421886201042" + "808080f80f834208868484201042088842808080f80f8320104218884280" + "80fc07838420104228884280fe038320104238888484842113417f200329" + "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" + "9bb0a0acdd008584420052201142388620114280fe038342288684201142" + "8080fc0783421886201142808080f80f8342088684842011420888428080" + "80f80f832011421888428080fc07838420114228884280fe038320114238" + "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" + "422886842010428080fc0783421886201042808080f80f83420886848420" + "1042088842808080f80f832010421888428080fc07838420104228884280" + "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" + "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" + "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" + "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" + "20103703282000201237031841000c020b410021010b200020013a000141" + "010b3a00000240024002400240200a0440200741046b2802002202417871" + "2201200a410274220541044108200241037122021b6a490d012002410020" + "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" + "7871220141044108200241037122021b200d6a490d03200241002001200d" + "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" + "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" + "02057f167e230041e0006b22032400200341386a2204200141186a290300" + "370300200341306a2205200141106a290300370300200320012903003703" + "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" + "206a20022903002219200241086a290300221a2002290310221b20024118" + "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "042903002113200529030021142003290320211520032903282116200341" + "106a2206200141306a290300370300200341186a2207200141386a290300" + "370300200320012903203703002003200141286a29030037030820032002" + "290320220e200241286a290300220c20022903302211200241386a290300" + "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" + "030037030020052006290300370300200320032903083703282003200329" + "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" + "7c220d2016200329032822087c2209200854ad2009201520032903202208" + "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" + "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" + "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" + "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" + "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" + "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" + "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" + "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" + "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" + "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" + "210f024002402001290330221020012903107c2209200141286a29030022" + "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" + "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" + "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" + "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" + "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" + "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" + "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" + "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" + "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" + "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" + "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" + "307d21090b2003200f37035020032010370340200320093703582003200b" + "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" + "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" + "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" + "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" + "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" + "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" + "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" + "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" + "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" + "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" + "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" + "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d200341406b200329030020032903082003290310" + "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" + "002012370310200020183703082000201737030020002003290340370320" + "200041286a2003290348370300200041306a200341d0006a290300370300" + "200041386a200341d8006a290300370300200341e0006a24000ba706010a" + "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" + "03107c2207200241086a2903002203200141086a2903007c2204200354ad" + "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" + "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" + "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" + "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" + "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" + "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" + "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" + "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" + "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" + "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" + "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" + "02290330220920012903307c2204200241286a2903002205200141286a29" + "03007c2203200554ad20032002290320220520012903207c2206200554ad" + "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" + "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" + "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" + "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" + "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" + "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" + "450d002006210920052106200321080c010b200420032005200642c7faf3" + "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" + "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" + "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" + "2008370330200020093703202000200a3703102000200b37030020002004" + "37033820002006370328200020073703182000200c3703080bf10802087f" + "087e23004180016b22022400200141386a290300210e200141286a290300" + "210b200141186a2203290300210d2001290330210f2001290320210a2001" + "290310210c02400240024020012903002210200141086a22042903002211" + "844200520d00200c200d844200520d00200a200b844200520d00200e200f" + "84500d010b200241186a22052003290300370300200241106a2206200141" + "106a22072903003703002002200429030037030820022001290300370300" + "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200241386a2204200141206a220341186a29030037030020024130" + "6a2208200341106a22092903003703002002200341086a29030037032820" + "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" + "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2000027e2002290300220d2006290300220c842002290308220b200529" + "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" + "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" + "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" + "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" + "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" + "290350210a200241d0006a20072903003703002004200141186a29030037" + "0300200220012903003703402002200141086a290300370348200241406b" + "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200241f8006a2201200341186a290300370300200241f0006a22042009" + "2903003703002002200341086a2903003703682002200329030037036020" + "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f102b2004290300220c20022903602210842001290300220e2002" + "290368220b84845004404200210c4200210b4200210a4200210e4200210f" + "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" + "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" + "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" + "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" + "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" + "03402000200c370330200020022903403703102000200f3703082000200e" + "3703482000200b370338200041186a2002290348370300200041206a2002" + "41d0006a290300370300200041286a200241d8006a2903003703000c010b" + "20004200370308200042003703000b20024180016a24000b090020004100" + "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" + "220441016a360200024020044100480d00024041bca9c0002d0000450440" + "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" + "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" + "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" + "20004200370210200141ffffff074d04402001410620014108766722026b" + "7641017120024101746b413e6a21020b2000200236021c200241027441f4" + "a5c0006a2103410120027422044190a9c000280200714504402003200036" + "0200200020033602182000200036020c200020003602084190a9c0004190" + "a9c0002802002004723602000f0b02400240200120032802002204280204" + "417871460440200421020c010b2001411920024101766b41002002411f47" + "1b742103034020042003411d764104716a41106a22052802002202450d02" + "200341017421032002210420022802044178712001470d000b0b20022802" + "082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080bd20102067f017e230041206b2201240002400240200028" + "02002203417f460d00410420034101742202200341016a2204200220044b" + "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" + "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" + "1c2001200028020436021441100520020b360218200141086a2006200141" + "146a103720012802084101470d0120012802102102200128020c21050b20" + "0541dca4c0001019000b200128020c210320002004360200200020033602" + "04200141206a24000b7f01017f027f0240027f0240200228020404402002" + "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" + "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" + "0b2202411020021b21032002450c010b4110210341000b21022000200136" + "020820002003360204200020023602000bd20102067f017e230041206b22" + "0124000240024020002802002203417f460d004104200341017422022003" + "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" + "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" + "2001200341c0016c36021c2001200028020436021441100520020b360218" + "200141086a2006200141146a103720012802084101470d01200128021021" + "02200128020c21050b200541eca4c0001019000b200128020c2103200020" + "0436020020002003360204200141206a24000bdd0102067f017e23004120" + "6b2202240020002802002204417f460440410020011019000b4104200441" + "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" + "017e22084220884200520440410020011019000b02402008a7220741f0ff" + "ffff074d04404100210320022004047f2002200441c0016c36021c200220" + "0028020436021441100520030b360218200241086a2007200241146a1037" + "20022802084101470d01200228020c2106200228021021030b2006200110" + "19000b200228020c21042000200536020020002004360204200241206a24" + "000b830b02037f167e230041c0016b22022400200241186a220320004118" + "6a290300370300200241106a2204200041106a2903003703002002200029" + "03003703002002200041086a290300370308200241386a200141186a2903" + "002218370300200241306a200141106a2903002213370300200220014108" + "6a2903002214370328200220012903002215370320200242003703582002" + "42003703502002420037034820024201370340200241f8006a2201420037" + "0300200241f0006a42003703002002420037036820024200370360200329" + "0300210e2004290300210f2002290308210a200229030021072013211020" + "182111201521082014210b03400240200242003703980120024200370390" + "0120024200370388012002420137038001200220024180016a104a450440" + "200241406b21010c010b200241b8016a20024198016a2903003703002002" + "41b0016a20024190016a29030037030020022002290388013703a8012002" + "2002290380013703a001200241206a200241a0016a104a450440200241e0" + "006a21010c010b200241d8006a2903002112200229035021052002290348" + "21162002290340210d2007a74101714504400340200a423f862007420188" + "8421070240200da74101714504402016423f86200d42018884210d200542" + "3f8620164201888421160c010b200520137c2209201420167c2205201454" + "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" + "4201888421162006423f86200d42018884210d2009201354ad2005200954" + "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" + "0f42018884210f200e420188210e2012423f862005420188842105201242" + "018821122007420183500d000b2002200f3703102002200e3703180b2002" + "20053703502002200d370340200220073703002002201237035820022016" + "3703482002200a3703082001290300210920022903702106200229036821" + "172002290360210c2008a74101714504400340200b423f86200842018884" + "21080240200c420183a70440200620137c2219201420177c2206201454ad" + "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" + "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" + "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" + "20174201888421170b2010423f86200b42018884210b2011423f86201042" + "0188842110201142018821112009423f8620064201888421062009420188" + "21092008420183500d000b20022010370330200220113703380b20022006" + "3703702002200c3703602002200837032020022009370378200220173703" + "682002200b37032802400240200f201085200e2011858450044020072008" + "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" + "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" + "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" + "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" + "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" + "e0006a200d2016200520122015201420132018102d20062108200c210b0c" + "020b2002200720087d427e8322123703002002200a200b7d220520072008" + "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" + "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" + "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" + "2017200620092015201420132018102d20122107200d210a0c010b0b2000" + "2001290300370300200041186a200141186a290300370300200041106a20" + "0141106a290300370300200041086a200141086a290300370300200241c0" + "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" + "0141386a2226290300370300200341306a222c200141306a220e29030037" + "0300200341286a222d200141286a220f290300370300200341206a222e20" + "0141206a2210290300370300200341186a222f200141186a221129030037" + "0300200341106a2230200141106a22122903003703002003200129030037" + "03002003200141086a2227290300370308200320012002102f200341f800" + "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" + "6a2205290300370300200341e8006a2216200141e8006a22062903003703" + "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" + "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" + "092903003703002003200141c8006a220c29030037034820032001290340" + "370340200341406b200141406b2213200241406b2228102f200341b8016a" + "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" + "00370300200341a8016a2222200141a8016a290300370300200341a0016a" + "2223200141a0016a29030037030020034198016a222420014198016a2903" + "0037030020034190016a222520014190016a290300370300200320014188" + "016a2903003703880120032001290380013703800120034180016a200141" + "80016a222920024180016a222a102f200341f8016a221820042903003703" + "00200341f0016a22192005290300370300200341e8016a221a2006290300" + "370300200341e0016a221b2007290300370300200341d8016a221c200829" + "0300370300200341d0016a221d20092903003703002003200c2903003703" + "c801200320012903403703c001200341c0016a201320291030200341b802" + "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" + "00200341a8026a200241e8006a290300370300200341a0026a200241e000" + "6a29030037030020034198026a200241d8006a2903003703002003419002" + "6a200241d0006a2903003703002003200241c8006a290300370388022003" + "20022903403703800220034180026a2028202a1030200341c0056a200341" + "c0016a20034180026a102f2018200341f8056a2204290300370300201920" + "0341f0056a2205290300370300201a200341e8056a220629030037030020" + "1b200341e0056a2207290300370300201c200341d8056a22082903003703" + "00201d200341d0056a2209290300370300200320032903c8053703c80120" + "0320032903c0053703c00120034198066a220c201c290300370300200341" + "90066a220d201d290300370300200320032903c801370388062003200329" + "03c0013703800620034180066a2003290340223820032903482239200b29" + "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" + "6a220a2018290300370300200341b0066a220b2019290300370300200320" + "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" + "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200c29030022403703002009200d29030022413703" + "00200720032903a00622423703002005200b290300224337030020062003" + "2903a80622443703002004200a2903002245370300200320032903880622" + "463703c805200320032903800622473703c0052018204537030020192043" + "370300201a2044370300201b2042370300201c2040370300201d20413703" + "00200320463703c801200320473703c001200c201c290300370300200d20" + "1d290300370300200320032903c80137038806200320032903c001370380" + "0620034180066a2003290380012003290388012025290300202429030042" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" + "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" + "3703002003201a2903003703a8062003201b2903003703a006200341a006" + "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d2008200c29030022403703002009200d290300224137030020" + "0720032903a00622423703002005200b2903002243370300200620032903" + "a80622443703002004200a29030022453703002003200329038806224637" + "03c805200320032903800622473703c00520182045370300201920433703" + "00201a2044370300201b2042370300201c2040370300201d204137030020" + "0320463703c801200320473703c001200342003703b805200342003703b0" + "05200342003703a805200342013703a00520034200370398052003420037" + "03900520034200370388052003420937038005200341c0056a200341c001" + "6a20034180056a102f201820042903003703002019200529030037030020" + "1a2006290300370300201b2007290300370300201c200829030037030020" + "1d2009290300370300200320032903c8053703c801200320032903c00537" + "03c001200341c0056a200341c0016a200310302018200429030037030020" + "192005290300370300201a2006290300370300201b200729030037030020" + "1c2008290300370300201d2009290300370300200320032903c8053703c8" + "01200320032903c0053703c001200341d0026a2214201229030037030020" + "0341d8026a22152011290300370300200341e0026a221620102903003703" + "00200341e8026a2217200f290300370300200341f0026a221e200e290300" + "370300200341f8026a221f2026290300370300200320012903003703c002" + "200320272903003703c802200341c0026a200120131030200341b8036a20" + "0241386a2231290300370300200341b0036a200241306a22322903003703" + "00200341a8036a200241286a2233290300370300200341a0036a20024120" + "6a223429030037030020034198036a200241186a22352903003703002003" + "4190036a200241106a22362903003703002003200241086a223729030037" + "038803200320022903003703800320034180036a200220281030200341c0" + "056a200341c0026a20034180036a102f201f2004290300370300201e2005" + "290300370300201720062903003703002016200729030037030020152008" + "29030037030020142009290300370300200320032903c8053703c8022003" + "20032903c0053703c002200c2015290300370300200d2014290300370300" + "200320032903c80237038806200320032903c0023703800620034180066a" + "200329030022402003290308224120302903002242202f290300224342c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" + "0300200320172903003703a806200320162903003703a006200341a0066a" + "202e2903002244202d2903002245202c2903002246202b290300224742c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" + "002249370300200720032903a006224a3703002005200b290300224b3703" + "00200620032903a806224c3703002004200a290300224d37030020032003" + "29038806224e3703c8052003200329038006224f3703c005201f204d3703" + "00201e204b3703002017204c3703002016204a3703002015204837030020" + "1420493703002003204e3703c8022003204f3703c002200c201529030037" + "0300200d2014290300370300200320032903c80237038806200320032903" + "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200a201f290300370300200b201e290300370300200320172903" + "003703a806200320162903003703a006200341a0066a203c203d203e203f" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" + "2903002239370300200720032903a006223a3703002005200b290300223b" + "370300200620032903a806223c3703002004200a290300223d3703002003" + "200329038806223e3703c8052003200329038006223f3703c005201f203d" + "370300201e203b3703002017203c3703002016203a370300201520383703" + "00201420393703002003203e3703c8022003203f3703c002200341f8036a" + "2020290300370300200341f0036a2021290300370300200341e8036a2022" + "290300370300200341e0036a2023290300370300200341d8036a20242903" + "00370300200341d0036a202529030037030020032003290388013703c803" + "20032003290380013703c003200341c0036a20034180016a20034180056a" + "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" + "0300201e2005290300370300201720062903003703002016200729030037" + "03002015200829030037030020142009290300370300200320032903c805" + "3703c802200320032903c0053703c00220034190046a2213201229030037" + "030020034198046a22122011290300370300200341a0046a221120102903" + "00370300200341a8046a2210200f290300370300200341b0046a220f200e" + "290300370300200341b8046a220e20262903003703002003200129030037" + "038004200320272903003703880420034180046a200120291030200341f8" + "046a2031290300370300200341f0046a2032290300370300200341e8046a" + "2033290300370300200341e0046a2034290300370300200341d8046a2035" + "290300370300200341d0046a2036290300370300200320372903003703c8" + "04200320022903003703c004200341c0046a2002202a1030200341c0056a" + "20034180046a200341c0046a102f200e2004290300370300200f20052903" + "003703002010200629030037030020112007290300370300201220082903" + "0037030020132009290300370300200320032903c8053703880420032003" + "2903c00537038004200c2012290300370300200d20132903003703002003" + "2003290388043703880620032003290380043703800620034180066a2040" + "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" + "200b200f290300370300200320102903003703a806200320112903003703" + "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2008200c29030022383703002009200d2903002239370300200720032903" + "a006223a3703002005200b290300223b370300200620032903a806223c37" + "03002004200a290300223d3703002003200329038806223e3703c8052003" + "200329038006223f3703c005200e203d370300200f203b3703002010203c" + "3703002011203a37030020122038370300201320393703002003203e3703" + "88042003203f37038004200341c0056a20034180046a200341406b103020" + "0e2004290300370300200f20052903003703002010200629030037030020" + "112007290300370300201220082903003703002013200929030037030020" + "0320032903c80537038804200320032903c00537038004200c2012290300" + "370300200d20132903003703002003200329038804370388062003200329" + "0380043703800620034180066a2003290380012003290388012025290300" + "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" + "0b200f290300370300200320102903003703a806200320112903003703a0" + "06200341a0066a202329030020222903002021290300202029030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" + "2239370300200720032903a006223a3703002005200b290300223b370300" + "200620032903a806223c3703002004200a290300223d3703002003200329" + "038806223e3703c8052003200329038006223f3703c005200e203d370300" + "200f203b3703002010203c3703002011203a370300201220383703002013" + "20393703002003203e370388042003203f37038004200041386a20182903" + "00370300200041306a2019290300370300200041286a201a290300370300" + "200041206a201b290300370300200041186a201c29030037030020004110" + "6a201d290300370300200041086a20032903c801370300200020032903c0" + "01370300200020032903c002370340200041c8006a20032903c802370300" + "200041d0006a2014290300370300200041d8006a20152903003703002000" + "41e0006a2016290300370300200041e8006a2017290300370300200041f0" + "006a201e290300370300200041f8006a201f290300370300200041b8016a" + "200e290300370300200041b0016a200f290300370300200041a8016a2010" + "290300370300200041a0016a201129030037030020004198016a20122903" + "0037030020004190016a201329030037030020004188016a200329038804" + "370300200020032903800437038001200341c0066a24000b830c02137f04" + "7e23004180026b22032400200341d8006a2207200141186a290300370300" + "200341d0006a2208200141106a2903003703002003200141086a29030037" + "034820032001290300370340200341406b2002290300200241086a290300" + "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "98016a2204200141386a29030037030020034190016a2205200141306a29" + "03003703002003200141286a290300370388012003200129032037038001" + "20034180016a2002290320200241286a2903002002290330200241386a29" + "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" + "00200341106a220c2008290300370300200341206a220d20032903800137" + "0300200341286a220e200329038801370300200341306a220f2005290300" + "370300200341386a22102004290300370300200320032903483703082003" + "2003290340370300200241f8006a2903002116200241e8006a2903002117" + "2002290370211820022903602119200341f8016a2209200141d8006a2903" + "00370300200341f0016a2206200141d0006a2903003703002003200141c8" + "006a2903003703e801200320012903403703e001200341e0016a20022903" + "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" + "2903003703002003200141e8006a29030037038801200320012903603703" + "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2007200929030037030020082006290300370300200341e0006a22112003" + "29038001370300200341e8006a2212200329038801370300200341f0006a" + "22132005290300370300200341f8006a2214200429030037030020032003" + "2903e801370348200320032903e001370340200241b8016a290300211620" + "0241a8016a290300211720022903b001211820022903a0012119200341d8" + "016a220a20014198016a290300370300200341d0016a221520014190016a" + "290300370300200320014188016a2903003703c801200320012903800137" + "03c001200341c0016a20022903800120024188016a290300200229039001" + "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" + "6a2903003703002006200141b0016a2903003703002003200141a8016a29" + "03003703e801200320012903a0013703e001200341e0016a201920172018" + "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" + "290300370300200341a0016a220120032903e001370300200341a8016a22" + "0220032903e801370300200341b0016a220a2006290300370300200341b8" + "016a22062009290300370300200320032903c80137038801200320032903" + "c00137038001200041386a2010290300370300200041306a200f29030037" + "0300200041286a200e290300370300200041206a200d2903003703002000" + "41186a200b290300370300200041106a200c290300370300200041086a20" + "032903083703002000200329030037030020002003290340370340200041" + "c8006a2003290348370300200041d0006a2008290300370300200041d800" + "6a2007290300370300200041e0006a2011290300370300200041e8006a20" + "12290300370300200041f0006a2013290300370300200041f8006a201429" + "0300370300200041b8016a2006290300370300200041b0016a200a290300" + "370300200041a8016a2002290300370300200041a0016a20012903003703" + "0020004198016a200429030037030020004190016a200529030037030020" + "004188016a20032903880137030020002003290380013703800120034180" + "026a24000bf11902287f087e23004180056b22022400200241386a222420" + "0141386a220a290300370300200241306a2225200141306a220329030037" + "0300200241286a2226200141286a2204290300370300200241206a222720" + "0141206a2205290300370300200241186a2228200141186a220f29030037" + "0300200241106a2229200141106a22062903003703002002200129030037" + "03002002200141086a2207290300370308200220012001102f200241f800" + "6a2210200a290300370300200241f0006a22112003290300370300200241" + "e8006a22122004290300370300200241e0006a2213200529030037030020" + "0241d8006a2214200f290300370300200241d0006a221520062903003703" + "002002200729030037034820022001290300370340200241406b20012001" + "41406b2218102f20024180046a200241406b200241406b10302010200241" + "b8046a220b2903003703002011200241b0046a220c290300370300201220" + "0241a8046a220d2903003703002013200241a0046a220e29030037030020" + "1420024198046a2208290300370300201520024190046a22092903003703" + "0020022002290388043703482002200229038004370340200141f8006a22" + "19290300212a200141f0006a221a290300212b200141e8006a221b290300" + "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" + "00200241f0046a220f2006290300370300200220072903003703e8042002" + "20012903003703e004200241e0046a2001290340200141c8006a221d2903" + "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200a29030037030020092003290300370300200220" + "0429030037038804200220052903003703800420024180046a202d202c20" + "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" + "37030020024190036a2204200f290300370300200241a0036a2205200229" + "038004370300200241a8036a2206200229038804370300200241b0036a22" + "072009290300370300200241b8036a221620082903003703002002200229" + "03e80437038803200220022903e0043703800320024180046a2002418003" + "6a20014180016a220a10302016200b2903003703002007200c2903003703" + "002006200d2903003703002005200e290300370300200320082903003703" + "002004200929030037030020022002290388043703880320022002290380" + "043703800320024180046a20024180036a20024180036a102f2016200b29" + "03003703002007200c2903003703002006200d2903003703002005200e29" + "030037030020032008290300370300200420092903003703002002200229" + "0388043703880320022002290380043703800320024190016a2203201e29" + "030037030020024198016a2204201f290300370300200241a0016a220520" + "1c290300370300200241a8016a2206201b290300370300200241b0016a22" + "07201a290300370300200241b8016a221620192903003703002002200129" + "0340370380012002201d2903003703880120024180016a2018200a102f20" + "024180046a20024180016a20024180016a10302016200b29030037030020" + "07200c2903003703002006200d2903003703002005200e29030037030020" + "042008290300370300200320092903003703002002200229038804370388" + "01200220022903800437038001200241d0016a221820014190016a290300" + "370300200241d8016a221920014198016a290300370300200241e0016a22" + "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" + "370300200241f0016a221c200141b0016a290300370300200241f8016a22" + "1d200141b8016a29030037030020022001290380013703c0012002200141" + "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" + "2016290300370300200241b0026a22162007290300370300200241a8026a" + "22072006290300370300200241a0026a2206200529030037030020024198" + "026a2205200429030037030020024190026a220420032903003703002002" + "42003703f803200242003703f003200242003703e803200242013703e003" + "200242003703d803200242003703d003200242003703c803200242093703" + "c00320022002290388013703880220022002290380013703800220024180" + "026a20024180016a200241c0036a102f20024180046a20024180026a2002" + "1030201e200b2903003703002016200c2903003703002007200d29030037" + "03002006200e290300370300200520082903003703002004200929030037" + "0300200241d0026a22032018290300370300200241d8026a221f20192903" + "00370300200241e0026a2220201a290300370300200241e8026a2221201b" + "290300370300200241f0026a2222201c290300370300200241f8026a2223" + "201d29030037030020022002290388043703880220022002290380043703" + "8002200220022903c0013703c002200220022903c8013703c802200241c0" + "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" + "41406b10302023200b2903003703002022200c2903003703002021200d29" + "03003703002020200e290300370300201f20082903003703002003200929" + "030037030020022002290388043703c80220022002290380043703c00220" + "024180046a200241406b20024180036a10302010200b2903003703002011" + "200c2903003703002012200d2903003703002013200e2903003703002014" + "200829030037030020152009290300370300200220022903880437034820" + "0220022903800437034020024180046a200241406b20024180016a103020" + "10200b2903003703002011200c2903003703002012200d29030037030020" + "13200e290300370300201420082903003703002015200929030037030020" + "022002290388043703482002200229038004370340200241d8046a220120" + "14290300370300200241d0046a220a201529030037030020022002290348" + "3703c804200220022903403703c004200241c0046a200229030020022903" + "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" + "0300370300200f2011290300370300200220122903003703e80420022013" + "2903003703e004200241e0046a2027290300202629030020252903002024" + "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" + "09200a290300222b370300200e20022903e004222c370300200c200f2903" + "00222d370300200d20022903e804222e370300200b2017290300222f3703" + "00200220022903c804223037038804200220022903c00422313703800420" + "10202f3703002011202d3703002012202e3703002013202c370300201420" + "2a3703002015202b37030020022030370348200220313703402001201429" + "0300370300200a2015290300370300200220022903483703c80420022002" + "2903403703c004200241c0046a20022903c00120022903c8012018290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" + "0f2011290300370300200220122903003703e804200220132903003703e0" + "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" + "222b370300200e20022903e004222c370300200c200f290300222d370300" + "200d20022903e804222e370300200b2017290300222f3703002002200229" + "03c804223037038804200220022903c0042231370380042010202f370300" + "2011202d3703002012202e3703002013202c3703002014202a3703002015" + "202b3703002002203037034820022031370340200041386a201e29030037" + "0300200041306a2016290300370300200041286a20072903003703002000" + "41206a2006290300370300200041186a2005290300370300200041106a20" + "04290300370300200041086a200229038802370300200020022903800237" + "0300200020022903c002370340200041c8006a20022903c8023703002000" + "41d0006a2003290300370300200041d8006a201f290300370300200041e0" + "006a2020290300370300200041e8006a2021290300370300200041f0006a" + "2022290300370300200041f8006a2023290300370300200041b8016a2010" + "290300370300200041b0016a2011290300370300200041a8016a20122903" + "00370300200041a0016a201329030037030020004198016a201429030037" + "030020004190016a201529030037030020004188016a2002290348370300" + "200020022903403703800120024180056a24000bfe09011d7e2001290310" + "22022001290300220484200141186a2903002215200141086a2903002203" + "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" + "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" + "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" + "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" + "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" + "01290320220484200141386a2903002208200141286a2903002203848442" + "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" + "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" + "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" + "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" + "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" + "006a290300210220012903702104200129036021032001290350220e2001" + "290340220f84200141d8006a2903002205200141c8006a29030022108484" + "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" + "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" + "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" + "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" + "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" + "2004842002200884844200520440427f4200427f4200200342788342c7fa" + "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" + "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" + "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" + "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" + "6a2903002108200141a8016a290300210220012903b001210420012903a0" + "01210342002105200129039001221220012903800122138420014198016a" + "290300221e20014188016a290300221484844200520440427f4200427f42" + "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" + "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" + "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" + "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" + "7d21110b4200211242002113420021142003200484200220088484420052" + "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" + "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" + "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" + "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" + "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" + "00200a3703900120002011370380012000200f3703702000200737036020" + "0020093703502000200d3703402000201a37033020002006370320200020" + "0b37031020002018370300200020143703b801200020123703a801200020" + "17370398012000201d37038801200020103703782000200e370368200020" + "163703582000201c3703482000201b370338200020153703282000200c37" + "0318200020193703080b960501057f230041800c6b220324002003200120" + "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" + "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" + "03b809200342003703b009200342003703a809200342013703a009200342" + "003703980920034200370390092003420037038809200342093703800920" + "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" + "6a290300370300200341d00b6a20034190026a290300370300200341d80b" + "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" + "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" + "6a290300370300200341f80b6a200341b8026a290300370300200341880b" + "6a20032903c801370300200341900b6a200341d0016a2903003703002003" + "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" + "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" + "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" + "2003290380023703c00b200320032903c0013703800b20034180066a2003" + "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" + "034180076a200341c00b6a220720034180016a103020034180096a200120" + "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" + "4180016a20034180046a1030200341c00a6a200220051030200620024140" + "6b20034180056a1030200720024180016a200341c0056a1030200341c007" + "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" + "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" + "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" + "0002400240200129034022212001290350222084200141c8006a29030022" + "23200141d8006a2903002222848442005204402002290340221d20022903" + "50221584200241c8006a2903002224200241d8006a290300221e8484500d" + "01200341f8016a2204200141406b220641186a2205290300370300200341" + "f0016a2208200641106a220b290300370300200320062903003703e00120" + "03200641086a220c2903003703e801200341e0016a202120232020202242" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" + "200241406b220741186a220d29030037030020034190026a220a20074110" + "6a220e2903003703002003200741086a220f290300370388022003200729" + "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" + "00200341106a200141106a2903003703002003200141086a290300370308" + "20032001290300370300200320032903800222162003290388022219200a" + "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341386a2209200241186a290300370300200341306a220a" + "200241106a2903003703002003200241086a290300370328200320022903" + "00370320200341206a20032903e001222c20032903e80122302008290300" + "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200341b8036a22042005290300370300200341b0036a2205200b2903" + "003703002003200c2903003703a803200320062903003703a003200341a0" + "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200429030021132005290300211f20032903a803211c20032903a0" + "0321172004200d2903003703002005200e2903003703002003200f290300" + "3703a803200320072903003703a003200341a0036a201620192025202842" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" + "05290300211420032903a803211120032903a003211a200341d0006a2001" + "41306a290300370300200341d8006a2206200141386a2903003703002003" + "20012903203703402003200141286a290300370348200341406b201a2011" + "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" + "f8006a2207200241386a290300370300200341f0006a2208200241306a29" + "03003703002003200241286a290300370368200320022903203703602003" + "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b02402003200341206a104a450440200341406b200341e0006a" + "104a450d010b200420092903003703002005200a29030037030020032003" + "2903283703a803200320032903203703a003200341a0036a200329030020" + "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" + "290300211f2005290300211c20032903a003211720032903a80321122004" + "200729030037030020052008290300370300200320032903683703a80320" + "0320032903603703a003200341a0036a2003290340200329034820032903" + "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" + "842114201742018621112004290300211a2005290300211b20032903a803" + "211820032903a003212602400240201c4201862012423f8884222942ddb0" + "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" + "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" + "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d002011212a201421110c010b20132029201420" + "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" + "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" + "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" + "21130b200341b8036a22012013370300200320293703b0032003202a3703" + "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" + "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2003201f3703d8012003201c3703d001200320123703c801200320173703" + "c001200341c0016a20032903a003222920032903a803222a20032903b003" + "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b20184201862026423f888421112026420186212602400240201b4201" + "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" + "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" + "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" + "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" + "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" + "89aece93b230511b450d002026211a2011211b201821140c010b20132018" + "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" + "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" + "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" + "b2307d21130b20034198016a2201200341186a2903003703002003419001" + "6a2202200341106a29030037030020032003290308370388012003200329" + "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" + "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" + "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" + "290300370300200320032903483703a803200320032903403703a0032003" + "41a0036a20032903c001221120032903c801221820032903d00122272003" + "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200320133703b802200320143703b0022003201b3703a8022003201a" + "3703a002200429030021262005290300212920032903a803212a20032903" + "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200329038801222b4201862003290380012211423f" + "88842118201142018621270240024020022903002211420186202b423f88" + "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" + "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" + "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" + "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" + "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" + "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" + "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" + "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" + "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" + "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" + "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" + "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" + "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200341a0016a20032903800120032903880120032903900120" + "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b202a420186202d423f88842114202d4201862111024002402029420186" + "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" + "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" + "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" + "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" + "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" + "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" + "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" + "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" + "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" + "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" + "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" + "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" + "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" + "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" + "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" + "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" + "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" + "c689aece93b230511b450d002024212220232113202021140c010b202120" + "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" + "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" + "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" + "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" + "370300200320223703c002200320133703c802200341c0026a2022201320" + "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" + "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" + "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" + "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "0041186a200341b8026a290300370300200041106a200341b0026a290300" + "370300200041086a20032903a802370300200020032903a0023703002000" + "20032903a001370320200041286a20032903a801370300200041306a2003" + "41b0016a290300370300200041386a200341b8016a290300370300200020" + "032903c002370340200041c8006a20032903c802370300200041d0006a20" + "02290300370300200041d8006a20012903003703000c030b200341b8036a" + "2204200141186a290300221b370300200341b0036a2205200141106a2903" + "0022183703002003200141086a29030022163703a8032003200129030022" + "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" + "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" + "211d2005290300211520032903a803212420032903a003211f2004200141" + "206a220241186a2903003703002005200241106a29030037030020032002" + "41086a2903003703a803200320022903003703a003200341a0036a200129" + "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" + "1c20032903a8032117200420042903002225370300200320133703b00320" + "0320173703a8032003201c3703a003200341a0036a201c20172013202542" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" + "032903b003211e20032903a803211120032903a003211a02400240024020" + "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" + "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" + "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" + "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" + "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" + "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" + "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" + "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" + "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" + "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" + "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" + "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" + "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" + "90036a22062004290300370300200320032903a803370388032003200329" + "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d20012005290300370300200420062903003703002003200329" + "0388033703a80320032003290380033703a003200341a0036a201a201120" + "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" + "2903a0032213423f88842117201342018621120240024002402004290300" + "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" + "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" + "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" + "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" + "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" + "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" + "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" + "b87f2116201f42018621190240024020154201862024423f8884222842dd" + "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" + "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" + "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" + "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" + "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" + "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" + "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" + "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" + "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" + "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" + "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" + "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" + "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" + "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" + "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" + "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" + "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" + "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" + "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" + "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" + "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" + "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" + "88842112201b420186211602400240201c4201862018423f8884222542dd" + "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" + "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" + "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" + "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" + "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" + "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" + "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" + "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" + "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" + "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2011420186201a423f88842116201a420186211a02400240" + "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" + "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" + "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" + "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" + "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" + "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" + "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" + "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" + "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" + "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" + "91a8b87f211420114201862111024002402012420186201a423f88842216" + "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" + "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" + "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" + "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" + "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" + "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" + "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" + "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" + "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" + "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" + "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" + "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" + "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" + "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" + "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" + "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" + "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" + "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" + "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" + "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" + "37030020034190036a2204200241106a2903003703002003200229030037" + "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" + "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" + "02200320243703e002200129030021212004290300212320032903800321" + "22200329038803211d200120133703002003201c37039003200320183703" + "88032003201b3703800320034180036a20032903a00320032903a8032003" + "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "e0026a200329038003200329038803200329039003200129030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" + "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" + "20224201862122024002402023420186201d423f8884221342ddb0858ce8" + "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" + "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" + "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" + "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" + "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" + "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" + "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" + "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" + "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" + "2023370340200020032903a003370300200020032903e002370320200020" + "2137035820002022370348200041086a20032903a803370300200041286a" + "20032903e802370300200041186a200341b8036a29030037030020004110" + "6a200341b0036a290300370300200041306a200341f0026a290300370300" + "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" + "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" + "230041a0016b220224000240200129034022082001290350220984200141" + "c8006a290300220a200141d8006a290300220b8484420052044020024200" + "370318200242003703102002420037030820024201370300024020014140" + "6b2002104a450440200241206a2001290320220837030020002001290300" + "2209370310200041306a2008370300200241386a200141386a2903002208" + "370300200241306a200141306a290300220a370300200241286a20014128" + "6a290300220b370300200241106a200141106a290300220c370300200241" + "186a200141186a290300220d370300200041186a200141086a290300220e" + "370300200041206a200c370300200041286a200d370300200041386a200b" + "370300200041406b200a370300200041c8006a2008370300200220093703" + "002002200e3703080c010b20024198016a2204200b370300200220093703" + "900120022008370380012002200a37038801200242a9c0c689aece93b230" + "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" + "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" + "20022903800121082002290388012109200229039001210a200241186a22" + "032004290300220b3703002002200a370310200220093703082002200837" + "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b2003290300210c2002290310210d2002290308210e20022903" + "00210f200241d0006a2204200141106a290300370300200241d8006a2205" + "200141186a290300370300200220012903003703402002200141086a2903" + "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" + "0241f0006a2207200141306a2903003703002002200141286a2903003703" + "68200220012903203703602003200b3703002002200a3703102002200937" + "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" + "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200320052903002208370300200241106a200429030022093703002002" + "41206a2002290360220a370300200241286a2002290368220b3703002002" + "41306a2007290300220c370300200241386a2006290300220d3703002000" + "2002290340220e370310200041186a2002290348220f370300200041206a" + "2009370300200041286a2008370300200041306a200a370300200041386a" + "200b370300200041406b200c370300200041c8006a200d3703002002200f" + "3703082002200e3703000b20004200370308200042013703000c010b2000" + "4200370308200042003703000b200241a0016a24000b3000200128021c20" + "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" + "0128022028020c1103000bf917021d7f087e23004180066b220224002002" + "41b8036a2208200141386a290300370300200241b0036a2209200141306a" + "290300370300200241a8036a2213200141286a290300370300200241a003" + "6a2214200141206a29030037030020024198036a2203200141186a290300" + "37030020024190036a2204200141106a2903003703002002200129030037" + "0380032002200141086a2903003703880320024180036a20012001102f20" + "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" + "f0006a290300370300200241e8036a2207200141e8006a29030037030020" + "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" + "d8006a290300370300200241d0036a220c200141d0006a29030037030020" + "02200141c8006a2903003703c803200220012903403703c003200241c003" + "6a200141406b221e201e102f200241b8046a221520052903003703002002" + "41b0046a22162006290300370300200241a8046a22172007290300370300" + "200241a0046a2218200a29030037030020024198046a2219200b29030037" + "030020024190046a221a200c290300370300200220022903c80337038804" + "200220022903c0033703800420024180046a200241c0036a200241c0036a" + "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" + "026a2205290300370300200241f0046a220e200241f0026a220a29030037" + "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" + "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" + "2207290300370300200241d0046a2211200241d0026a220b290300370300" + "200220022903c8023703c804200220022903c0023703c004200241c0046a" + "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" + "200241d0056a220d2011290300370300200220022903c8043703c8052002" + "20022903c0043703c005200241c0056a2002290380032002290388032004" + "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" + "201b290300370300200241f0056a2204200e2903003703002002200f2903" + "003703e805200220102903003703e005200241e0056a2014290300201329" + "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" + "026a2208201229030037030020024190026a2209200d2903003703002002" + "41a8026a221320022903e805370300200241b0026a221420042903003703" + "00200241b8026a221b2003290300370300200220022903c8053703880220" + "0220022903c00537038002200220022903e0053703a00220122008290300" + "370300200d200929030037030020022002290388023703c8052002200229" + "0380023703c005200241c0056a200229038004200229038804201a290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" + "042014290300370300200220132903003703e805200220022903a0023703" + "e005200241e0056a201829030020172903002016290300201529030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200241186a22152012290300370300200241" + "106a2216200d290300370300200241206a221720022903e0053703002002" + "41286a221820022903e805370300200241306a2219200429030037030020" + "0241386a221a2003290300370300200220022903c8053703082002200229" + "03c005370300200241c0026a200220021030201a20052903003703002019" + "200a290300370300201820062903003703002017200c2903003703002015" + "20072903003703002016200b290300370300200220022903c80237030820" + "0220022903c002370300200241c0026a20024180036a20024180036a1030" + "200241406b200241c0026a20024180036a103020024190056a220e200241" + "d0006a29030037030020024198056a220f200241d8006a29030037030020" + "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" + "e8006a290300370300200241b0056a221c200241f0006a29030037030020" + "0241b8056a221d200241f8006a2903003703002002200229034037038005" + "200220022903483703880520024180056a200241406b200241406b102f20" + "0241c0026a2002200210302003200f2903003703002004200e2903003703" + "0020022002290388053703e80520022002290380053703e005200241e005" + "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2008201d2903003703002009201c2903003703002002" + "201129030037038802200220102903003703800220024180026a20022903" + "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d2008290300211f200929030021202003290300212120042903002122" + "2002290388022123200229038002212420022903e805212520022903e005" + "212620024180016a20024180046a20024180046a1030200241c0026a2002" + "4180016a20024180016a1030200241b8016a220e20052903003703002002" + "41b0016a220f200a290300370300200241a8016a22102006290300370300" + "200241a0016a2211200c29030037030020024198016a221c200729030037" + "030020024190016a221d200b290300370300200220022903c80237038801" + "200220022903c00237038001200241c0026a20024180016a20024180016a" + "1030200e2005290300370300200f200a2903003703002010200629030037" + "03002011200c290300370300201c2007290300370300201d200b29030037" + "0300200220022903c80237038801200220022903c00237038001200241c0" + "016a201e20014180016a102f200320152903003703002004201629030037" + "0300200220022903083703e805200220022903003703e005200241e0056a" + "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" + "030020092019290300370300200220182903003703880220022017290300" + "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d20072003290300370300200b20042903003703002006200229038802" + "370300200a200929030037030020052008290300370300200220022903e8" + "053703c802200220022903e0053703c00220022002290380023703e00220" + "024180026a200241406b200241c0026a102f20122008290300370300200d" + "200929030037030020022002290388023703c80520022002290380023703" + "c005200241c0056a200229038001200229038801201d290300201c290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" + "00370300200220132903003703e805200220022903a0023703e005200241" + "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20072012290300370300200b200d290300370300200c20" + "022903e005370300200620022903e805370300200a200429030037030020" + "052003290300370300200220022903c8053703c802200220022903c00537" + "03c00220004180016a200241c0016a200241c0016a10302000201f370338" + "200020203703302000202337032820002024370320200020213703182000" + "20223703102000202537030820002026370300200020022903c002370340" + "200041c8006a20022903c802370300200041d0006a200b29030037030020" + "0041d8006a2007290300370300200041e0006a200c290300370300200041" + "e8006a2006290300370300200041f0006a200a290300370300200041f800" + "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" + "6b22032400024002400240024020012903800120014188016a2903008442" + "00520d0020012903900120014198016a290300844200520d0020012903a0" + "01200141a8016a290300844200520d0020012903b001200141b8016a2903" + "0084500d010b024020022903800120024188016a290300844200520d0020" + "022903900120024198016a290300844200520d0020022903a001200241a8" + "016a290300844200520d0020022903b001200241b8016a29030084500d02" + "0b200341b8086a221420014180016a220441386a290300370300200341b0" + "086a200441306a290300370300200341a8086a2215200441286a29030037" + "0300200341a0086a200441206a29030037030020034198086a2216200441" + "186a29030037030020034190086a200441106a2903003703002003200429" + "0300370380082003200441086a2903003703880820034180086a20042004" + "102f200341f8086a221720024180016a220541386a290300370300200341" + "f0086a200541306a290300370300200341e8086a2218200541286a290300" + "370300200341e0086a200541206a290300370300200341d8086a22192005" + "41186a290300370300200341d0086a200541106a29030037030020032005" + "41086a2903003703c808200320052903003703c008200341c0086a200520" + "05102f20032001200341c0086a102f200341406b200220034180086a102f" + "20034180016a200420034180086a102f200341c0016a2005200341c0086a" + "102f20034180026a200141406b200341c0016a102f200341c0026a200241" + "406b20034180016a102f024002402003200341406b104a0d00200341206a" + "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" + "026a200341e0026a104a450d010b200341386a290300211f200341286a29" + "03002120200329033021212003290320212220034198076a2201200341d8" + "006a29030037030020034190076a2202200341d0006a2903003703002003" + "200329034837038807200320032903403703800720034180076a20032903" + "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" + "09200341f0006a2903003703002003200341e8006a2903003703c8072003" + "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20034198036a200129030037030020034190036a200229" + "0300370300200341a8036a20032903c807370300200341b0036a20092903" + "00370300200341b8036a2006290300370300200320032903880737038803" + "200320032903800737038003200320032903c0073703a003200341b8026a" + "290300211f200341a8026a290300212020032903b002212120032903a002" + "21222001200341d8026a2903003703002002200341d0026a290300370300" + "200320032903c80237038807200320032903c0023703800720034180076a" + "20032903800220032903880220032903900220034198026a29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" + "f0026a2903003703002003200341e8026a2903003703c807200320032903" + "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200341d8036a2001290300370300200341d0036a200229030037" + "0300200341e8036a20032903c807370300200341f0036a20092903003703" + "00200341f8036a200629030037030020032003290388073703c803200320" + "03290380073703c003200320032903c0073703e003200341c0076a200341" + "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" + "00200341b0096a200341f0076a2211290300370300200341a8096a200341" + "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" + "0020034198096a200629030037030020034190096a200929030037030020" + "0320032903c80737038809200320032903c0073703800920034180096a20" + "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" + "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" + "0320034180096a102f200341c0056a20034180026a20034180046a102f20" + "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" + "d8046a290300370300200341e0096a220b200341e0046a29030037030020" + "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" + "f0046a290300370300200341f8096a2210200341f8046a29030037030020" + "0320032903c0043703c009200320032903c8043703c809200341c0096a20" + "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" + "0341d0066a2207200a290300370300200320032903c8093703c806200320" + "032903c0093703c006200341c0066a200329038004200329038804200329" + "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" + "2903003703002009200f2903003703002003200e2903003703c807200320" + "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" + "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" + "200829030037030020022007290300370300200341a8076a220e20032903" + "c807370300200341b0076a220f2009290300370300200341b8076a221020" + "06290300370300200320032903c80637038807200320032903c006370380" + "07200320032903c0073703a007200341c0076a20034180056a2003418005" + "6a103020034198066a2212200129030037030020034190066a2213200229" + "030037030020032003290388073703880620032003290380073703800620" + "034180066a20032903c00720032903c80720032903d007200629030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200820102903003703002007200f29030037" + "03002003200e2903003703c806200320032903a0073703c006200341c006" + "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008290300211f20072903002120201229030021212013" + "290300212220032903c806212320032903c0062124200329038806212520" + "03290380062126200820034198056a290300370300200720034190056a29" + "030037030020032003290388053703c80620032003290380053703c00620" + "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" + "0341b8056a2903003703002002200341b0056a2903003703002003200341" + "a8056a29030037038807200320032903a0053703800720034180076a2024" + "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" + "20092007290300370300200d200329038807370300201120022903003703" + "00200c2001290300370300200320032903c8063703c807200320032903c0" + "063703c00720032003290380073703e00720034180076a200341c0046a20" + "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" + "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" + "032003290388073703e80a20032003290380073703e00a200341e00a6a20" + "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d200820102903003703002007200f2903003703002003200e" + "2903003703c806200320032903a0073703c006200341c0066a20032903e0" + "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2012200a2903003703002013200b290300370300200341a0066a221b20" + "032903c006370300200341a8066a221c20032903c806370300200341b006" + "6a221d2007290300370300200341b8066a221e2008290300370300200320" + "032903e80a37038806200320032903e00a37038006200341c0076a200420" + "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" + "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" + "1a290300370300200341980a6a22112006290300370300200341900a6a22" + "062009290300370300200320032903c8073703880a200320032903c00737" + "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" + "370300200b2006290300370300200320032903880a3703e80a2003200329" + "03800a3703e00a200341e00a6a2003290380082003290388082003290390" + "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" + "200720052903003703002003200c2903003703c8062003200d2903003703" + "c006200341c0066a20032903a008201529030020032903b0082014290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" + "00370300200e20032903c806370300200f20072903003703002010200829" + "0300370300200320032903e80a37038807200320032903e00a3703800720" + "0320032903c0063703a007200341d80a6a22042001290300370300200341" + "d00a6a2201200229030037030020032003290388073703c80a2003200329" + "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" + "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" + "200b200f2903003703002003200e2903003703e80a200320032903a00737" + "03e00a200341e00a6a20032903e008201829030020032903f00820172903" + "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" + "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" + "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" + "00370300200341f8066a200a290300370300200320032903c80a3703c806" + "200320032903c00a3703c006200320032903e00a3703e00620004180016a" + "200341c0066a20034180036a102f2000201f370338200020203703302000" + "202337032820002024370320200020213703182000202237031020002025" + "370308200020263703002000200329038006370340200041c8006a200329" + "038806370300200041d0006a2013290300370300200041d8006a20122903" + "00370300200041e0006a201b290300370300200041e8006a201c29030037" + "0300200041f0006a201d290300370300200041f8006a201e290300370300" + "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" + "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" + "24000240024002400240024020012903800120014188016a290300844200" + "520d0020012903900120014198016a290300844200520d0020012903a001" + "200141a8016a290300844200520d0020012903b001200141b8016a290300" + "84500d010b200241d8006a4200370300200241e0006a2204420037030020" + "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" + "030020024200370348200242013703402002420037035020014180016a22" + "03200241406b104a450440200141a0016a2004104a450d020b200241406b" + "200310312002280240410171450d02200241386a20024188016a29030022" + "05370300200241306a20024180016a22032903002206370300200241286a" + "200241f8006a2903002207370300200241206a200241f0006a2903002208" + "370300200241186a200241e8006a2903002209370300200241106a200241" + "e0006a290300220a37030020024190026a200a37030020024198026a2009" + "370300200241a0026a2008370300200241a8026a2007370300200241b002" + "6a2006370300200241b8026a200537030020022002290350220537030020" + "02200241d8006a2903002206370308200220053703800220022006370388" + "0220024180026a20022002102f200241406b200120024180026a102f2002" + "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" + "0041106a200241406b418001104c1a20004200370308200042013703000c" + "030b20004200370308200042003703000c020b200241b8016a200141f800" + "6a290300370300200241b0016a200141f0006a290300370300200241a801" + "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" + "0020024198016a200141d8006a29030037030020024190016a200141d000" + "6a29030037030020024188016a200141c8006a290300370300200241d000" + "6a200141106a290300370300200241d8006a200141186a29030037030020" + "0241e0006a200141206a290300370300200241e8006a200141286a290300" + "370300200241f0006a200141306a290300370300200241f8006a20014138" + "6a2903003703002002200129034037038001200220012903003703402002" + "200141086a290300370348200041106a200241406b418001104c1a200042" + "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" + "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" + "006a220e290300370300200241306a2240200141f0006a220f2903003703" + "00200241286a2241200141e8006a2210290300370300200241206a224220" + "0141e0006a2211290300370300200241186a2243200141d8006a22122903" + "00370300200241106a2244200141d0006a22202903003703002002200129" + "03403703002002200141c8006a2221290300370308200141a8016a222329" + "03002153200141a0016a22242903002154200141b8016a22252903002155" + "200141b0016a2230290300215620014188016a2235290300215720014198" + "016a2236290300215820014190016a22372903002159200129038001215a" + "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" + "016a2214290300370300200241e8006a200141e8016a2215290300370300" + "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" + "016a2217290300370300200241d0006a200141d0016a220d290300370300" + "20024190016a20014190026a220429030037030020024198016a20014198" + "026a2206290300370300200241a0016a200141a0026a2207290300370300" + "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" + "026a2205290300370300200241b8016a200141b8026a2209290300370300" + "2002200141c8016a2222290300370348200220012903c001370340200220" + "012903800237038001200220014188026a220a29030037038801200241f8" + "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" + "290300370300200241e8016a200141e8026a2246290300370300200241e0" + "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" + "290300370300200241d0016a200141d0026a2249290300370300200241b8" + "026a2226200141386a2231290300370300200241b0026a2227200141306a" + "2232290300370300200241a8026a2228200141286a223a29030037030020" + "0241a0026a2229200141206a223b29030037030020024198026a222a2001" + "41186a223c29030037030020024190026a222b200141106a223d29030037" + "03002002200141c8026a224a2903003703c801200220012903c0023703c0" + "012002200141086a223e2903003703880220022001290300370380022002" + "4180026a200120014180026a2203102f200241f8026a2219203129030037" + "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" + "00370300200241e0026a221c203b290300370300200241d8026a221d203c" + "290300370300200241d0026a221e203d2903003703002002203e29030037" + "03c802200220012903003703c002200241c0026a200120031030200241b8" + "036a220b2009290300370300200241b0036a220920052903003703002002" + "41a8036a22052008290300370300200241a0036a220c2007290300370300" + "20024198036a2218200629030037030020024190036a221f200429030037" + "0300200242003703b80d200242003703b00d200242003703a80d20024201" + "3703a00d200242003703980d200242003703900d200242003703880d2002" + "42093703800d2002200a2903003703880320022001290380023703800320" + "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" + "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" + "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" + "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" + "04290300370300200220022903c80b37038803200220022903c00b370380" + "03200241c00b6a200241c0026a20024180036a102f201920062903003703" + "00201a2007290300370300201b2008290300370300201c20052903003703" + "00201d2003290300370300201e2004290300370300200220022903c80b37" + "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" + "00200241900f6a220c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903800220022903880220" + "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" + "092019290300370300200241900a6a220a201a2903003703002002201b29" + "03003703880a2002201c2903003703800a200241800a6a20292903002028" + "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" + "0b290300224b3703002004200c290300224c370300200520022903800a22" + "4d3703002007200a290300224e370300200820022903880a224f37030020" + "0620092903002250370300200220022903880f22513703c80b2002200229" + "03800f22523703c00b20192050370300201a204e370300201b204f370300" + "201c204d370300201d204b370300201e204c370300200220513703c80220" + "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" + "1d290300370300200c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903c00320022903c80320" + "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" + "2019290300370300200a201a2903003703002002201b2903003703880a20" + "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" + "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2003200b290300224b3703002004200c290300224c370300200520022903" + "800a224d3703002007200a290300224e370300200820022903880a224f37" + "0300200620092903002250370300200220022903880f22513703c80b2002" + "20022903800f22523703c00b20192050370300201a204e370300201b204f" + "370300201c204d370300201d204b370300201e204c370300200220513703" + "c802200220523703c002200241c00b6a20024180026a20024180026a1030" + "202620062903003703002027200729030037030020282008290300370300" + "20292005290300370300202a2003290300370300202b2004290300370300" + "200220022903c80b37038802200220022903c00b3703800220024190046a" + "221f200d29030037030020024198046a222c2017290300370300200241a0" + "046a222d2016290300370300200241a8046a222e20152903003703002002" + "41b0046a222f2014290300370300200241b8046a22392013290300370300" + "200220012903c00137038004200220222903003703880420024180046a20" + "0141c0016a223320014180016a2234102f200241f8046a22182013290300" + "370300200241f0046a22132014290300370300200241e8046a2214201529" + "0300370300200241e0046a22152016290300370300200241d8046a221620" + "17290300370300200241d0046a2217200d29030037030020022022290300" + "3703c804200220012903c0013703c004200241c0046a2033203410302002" + "41b8056a220d2025290300370300200241b0056a22222030290300370300" + "200241a8056a22252023290300370300200241a0056a2223202429030037" + "030020024198056a2224203629030037030020024190056a223020372903" + "003703002002203529030037038805200220012903800137038005200241" + "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" + "0d2006290300370300202220072903003703002025200829030037030020" + "232005290300370300202420032903003703002030200429030037030020" + "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" + "0241c0046a20024180056a102f2018200629030037030020132007290300" + "370300201420082903003703002015200529030037030020162003290300" + "37030020172004290300370300200220022903c80b3703c8042002200229" + "03c00b3703c004200b2016290300370300200c2017290300370300200220" + "022903c8043703880f200220022903c0043703800f200241800f6a200229" + "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20092018290300370300200a201329030037030020022014290300" + "3703880a200220152903003703800a200241800a6a202d290300202e2903" + "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" + "0300224b3703002004200c290300224c370300200520022903800a224d37" + "03002007200a290300224e370300200820022903880a224f370300200620" + "092903002250370300200220022903880f22513703c80b20022002290380" + "0f22523703c00b201820503703002013204e3703002014204f3703002015" + "204d3703002016204b3703002017204c370300200220513703c804200220" + "523703c004200241c0056a20024180046a200241800d6a102f200b201629" + "0300370300200c2017290300370300200220022903c8043703880f200220" + "022903c0043703800f200241800f6a20022903c00520022903c805200229" + "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" + "290300370300200a2013290300370300200220142903003703880a200220" + "152903003703800a200241800a6a20022903e005200241e8056a29030020" + "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" + "200b290300224b3703002004200c290300224c370300200520022903800a" + "224d3703002007200a290300224e370300200820022903880a224f370300" + "200620092903002250370300200220022903880f22513703c80b20022002" + "2903800f22523703c00b201820503703002013204e3703002014204f3703" + "002015204d3703002016204b3703002017204c370300200220513703c804" + "200220523703c004200241c00b6a20024180046a20024180046a10302039" + "2006290300370300202f2007290300370300202e2008290300370300202d" + "2005290300370300202c2003290300370300201f20042903003703002002" + "20022903c80b37038804200220022903c00b3703800420024190066a2222" + "202029030037030020024198066a22332012290300370300200241a0066a" + "22342011290300370300200241a8066a22232010290300370300200241b0" + "066a2224200f290300370300200241b8066a2225200e2903003703002002" + "200129034037038006200220212903003703880620024180066a20014140" + "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" + "f0066a220e200f290300370300200241e8066a220f201029030037030020" + "0241e0066a22102011290300370300200241d8066a221120122903003703" + "00200241d0066a22122020290300370300200220212903003703c8062002" + "20012903403703c006200241c0066a200220301030200241b8076a222020" + "38290300370300200241b0076a22212045290300370300200241a8076a22" + "352046290300370300200241a0076a223620472903003703002002419807" + "6a2237204829030037030020024190076a22382049290300370300200220" + "4a29030037038807200220012903c0023703800720024180076a20302002" + "41800d6a102f200241c00b6a20024180076a200210302020200629030037" + "030020212007290300370300203520082903003703002036200529030037" + "03002037200329030037030020382004290300370300200220022903c80b" + "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" + "4180076a102f200d2006290300370300200e2007290300370300200f2008" + "290300370300201020052903003703002011200329030037030020122004" + "290300370300200220022903c80b3703c806200220022903c00b3703c006" + "200b2011290300370300200c2012290300370300200220022903c8063703" + "880f200220022903c0063703800f200241800f6a20022903800620022903" + "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" + "290300370300200a200e2903003703002002200f2903003703880a200220" + "102903003703800a200241800a6a20342903002023290300202429030020" + "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" + "2004200c290300224c370300200520022903800a224d3703002007200a29" + "0300224e370300200820022903880a224f37030020062009290300225037" + "0300200220022903880f22513703c80b200220022903800f22523703c00b" + "200d2050370300200e204e370300200f204f3703002010204d3703002011" + "204b3703002012204c370300200220513703c806200220523703c0062002" + "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" + "2012290300370300200220022903c8063703880f200220022903c0063703" + "800f200241800f6a20022903c00720022903c80720022903d007200241d8" + "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" + "0a200e2903003703002002200f2903003703880a20022010290300370380" + "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" + "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" + "3703002004200c290300224c370300200520022903800a224d3703002007" + "200a290300224e370300200820022903880a224f37030020062009290300" + "2250370300200220022903880f22513703c80b200220022903800f225237" + "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" + "002011204b3703002012204c370300200220513703c806200220523703c0" + "06200241c00b6a20024180066a20024180066a1030202520062903003703" + "002024200729030037030020232008290300370300203420052903003703" + "002033200329030037030020222004290300370300200220022903c80b37" + "038806200220022903c00b370380062009201d290300370300200a201e29" + "0300370300200220022903c8023703880a200220022903c0023703800a20" + "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200320192903003703002004201a29030037030020" + "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" + "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" + "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" + "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" + "312003290300370300200220022903880a3703c80d200220022903800a37" + "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" + "3703002021200729030037030020202008290300370300201e2005290300" + "370300201c2003290300370300201d2004290300370300200220022903c8" + "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" + "0241c0026a10302031200629030037030020212007290300370300202020" + "08290300370300201e2005290300370300201c2003290300370300201d20" + "0429030037030020024190086a2232202b29030037030020024198086a22" + "2b202a290300370300200241a0086a222a2029290300370300200241a808" + "6a22292028290300370300200241b0086a22282027290300370300200241" + "b8086a22272026290300370300200220022903c80b3703c80d2002200229" + "03c00b3703c00d2002200229038002370380082002200229038802370388" + "0820024180086a20024180026a20024180016a1030200241c00b6a200241" + "80086a20024180086a103020272006290300370300202820072903003703" + "0020292008290300370300202a2005290300370300202b20032903003703" + "0020322004290300370300200220022903c80b37038808200220022903c0" + "0b37038008200241c00b6a20024180086a20024180026a10302027200629" + "03003703002028200729030037030020292008290300370300202a200529" + "0300370300202b200329030037030020322004290300370300200241d008" + "6a22012022290300370300200241d8086a220b2033290300370300200241" + "e0086a220c2034290300370300200241e8086a2219202329030037030020" + "0241f0086a221a2024290300370300200241f8086a221b20252903003703" + "00200220022903c80b37038808200220022903c00b370380082002200229" + "0380063703c00820022002290388063703c808200241c0086a2002418006" + "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" + "2006290300370300201a200729030037030020192008290300370300200c" + "2005290300370300200b2003290300370300200120042903003703002002" + "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" + "41c0086a200241c0086a1030201b2006290300370300201a200729030037" + "030020192008290300370300200c2005290300370300200b200329030037" + "030020012004290300370300200220022903c80b3703c808200220022903" + "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" + "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" + "29030037030020192008290300370300200c2005290300370300200b2003" + "29030037030020012004290300370300200220022903c80b3703c8082002" + "20022903c00b3703c00820092011290300370300200a2012290300370300" + "200220022903c8063703880a200220022903c0063703800a200241800a6a" + "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" + "03002004200e2903003703002002200f2903003703c80b20022010290300" + "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" + "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" + "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" + "22122003290300370300200220022903880a3703880e200220022903800a" + "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" + "003703002011200729030037030020102008290300370300200f20052903" + "00370300200d2003290300370300200e2004290300370300200220022903" + "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" + "200241c0066a103020122006290300370300201120072903003703002010" + "2008290300370300200f2005290300370300200d2003290300370300200e" + "2004290300370300200220022903c80b3703880e200220022903c00b3703" + "800e20092016290300370300200a2017290300370300200220022903c804" + "3703880a200220022903c0043703800a200241800a6a2002290300200229" + "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" + "29030037030020042013290300370300200220142903003703c80b200220" + "152903003703c00b200241c00b6a20422903002041290300204029030020" + "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" + "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" + "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" + "22162004290300370300200241f80e6a2217200329030037030020022002" + "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" + "0e6a200241c00e6a10302017200629030037030020162007290300370300" + "201520082903003703002014200529030037030020182003290300370300" + "20132004290300370300200220022903c80b3703c80e200220022903c00b" + "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" + "003703002016200729030037030020152008290300370300201420052903" + "003703002018200329030037030020132004290300370300200241d0096a" + "2226201f290300370300200241d8096a221f202c290300370300200241e0" + "096a222c202d290300370300200241e8096a222d202e2903003703002002" + "41f0096a222e202f290300370300200241f8096a222f2039290300370300" + "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" + "80043703c00920022002290388043703c809200241c0096a20024180046a" + "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" + "2006290300370300202e2007290300370300202d2008290300370300202c" + "2005290300370300201f2003290300370300202620042903003703002002" + "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" + "41c0096a20024180046a1030202f2006290300370300202e200729030037" + "0300202d2008290300370300202c2005290300370300201f200329030037" + "030020262004290300370300200220022903c80b3703c809200220022903" + "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" + "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" + "03002009201c290300370300200a201d290300370300200220022903c80d" + "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" + "00200241d00a6a2013290300370300200241d80a6a201829030037030020" + "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" + "f00a6a2016290300370300200241f80a6a20172903003703002002200229" + "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" + "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" + "370300200241980b6a200d290300370300200241900b6a200e2903003703" + "00200241880b6a20022903880e370300200220022903800e3703800b2006" + "201b2903003703002007201a290300370300200820192903003703002005" + "200c2903003703002003200b290300370300200420012903003703002002" + "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" + "29038808370300200241900c6a2032290300370300200241980c6a202b29" + "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" + "370300200241b00c6a2028290300370300200241b80c6a20272903003703" + "0020022002290380083703800c200241f80c6a202f290300370300200241" + "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" + "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" + "26290300370300200241c80c6a20022903c809370300200220022903c009" + "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" + "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" + "024101712206450440200341386a200141386a290300370300200341306a" + "200141306a290300370300200341286a200141286a290300370300200341" + "206a200141206a290300370300200341186a200141186a29030037030020" + "0341106a200141106a290300370300200320012903003703002003200141" + "086a29030037030820034190016a200141d0006a29030037030020034198" + "016a200141d8006a290300370300200341a0016a200141e0006a29030037" + "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" + "006a290300370300200341b8016a200141f8006a29030037030020032001" + "290340370380012003200141c8006a290300370388010c010b200341d801" + "6a2204200141386a290300370300200341d0016a2205200141306a290300" + "370300200320012903203703c0012003200141286a2903003703c8012003" + "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f102b200341186a200141186a290300370300200341106a" + "200141106a290300370300200341286a20032903c801370300200341306a" + "2005290300370300200341386a20042903003703002003200141086a2903" + "0037030820032001290300370300200320032903c0013703202004200141" + "f8006a2903003703002005200141f0006a2903003703002003200141e800" + "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "20034198016a200141d8006a29030037030020034190016a200141d0006a" + "290300370300200341a8016a20032903c801370300200341b0016a200529" + "0300370300200341b8016a20042903003703002003200141c8006a290300" + "370388012003200129034037038001200320032903c0013703a0010b0240" + "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" + "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" + "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" + "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" + "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" + "3703c0010c020b200341e0016a22024200370300200241086a4200370300" + "200241106a4200370300200241186a4200370300200342a9c0c689aece93" + "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" + "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" + "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" + "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" + "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" + "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" + "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" + "200341c0016a102f02402006450440200341b8016a200241386a29030037" + "0300200341b0016a200241306a290300370300200341a8016a200241286a" + "290300370300200341a0016a200241206a29030037030020034198016a20" + "0241186a29030037030020034190016a200241106a290300370300200320" + "02290300370380012003200241086a290300370388010c010b200341d801" + "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" + "0300370300200320012903a0013703c0012003200141a8016a2903003703" + "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" + "20034190016a200241106a290300370300200341a8016a20032903c80137" + "0300200341b0016a2005290300370300200341b8016a2006290300370300" + "2003200241086a2903003703880120032002290300370380012003200329" + "03c0013703a0010b0240024002400240200441026b0e020102000b200342" + "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" + "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" + "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" + "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" + "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" + "00370300200141106a4200370300200141186a4200370300200342003703" + "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" + "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" + "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" + "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" + "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" + "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" + "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" + "6a200341386a290300370300200041306a200341306a2903003703002000" + "41286a200341286a290300370300200041206a200341206a290300370300" + "200041186a200341186a290300370300200041106a200341106a29030037" + "0300200041086a2003290308370300200020032903003703002000200329" + "0340370340200041c8006a2003290348370300200041d0006a200341d000" + "6a290300370300200041d8006a200341d8006a290300370300200041e000" + "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" + "00200041f0006a200341f0006a290300370300200041f8006a200341f800" + "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" + "052400200541b8016a2234200141b8016a2235290300370300200541b001" + "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" + "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" + "0020054198016a223c20014198016a223d29030037030020054190016a22" + "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" + "4f290300370300200541d8016a222f200141d8016a225029030037030020" + "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" + "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" + "0300370300200541f8016a2233200141f8016a2254290300370300200520" + "012903800137038001200520012903c0013703c001200520014188016a22" + "40290300370388012005200141c8016a22552903003703c801200541b802" + "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" + "6a2221290300370300200541a8026a2258200141e8026a22282903003703" + "00200541a0026a2259200141e0026a222929030037030020054198026a22" + "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" + "2b290300370300200541d0026a2241200141106a22062903003703002005" + "41d8026a2242200141186a2207290300370300200541e0026a2243200141" + "206a2208290300370300200541e8026a2244200141286a22092903003703" + "00200541f0026a2245200141306a220a290300370300200541f8026a2246" + "200141386a220b2903003703002005200141c8026a222c29030037038802" + "200520012903c00237038002200520012903003703c0022005200141086a" + "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" + "35290300370300200541b0036a225d2037290300370300200541a8036a22" + "5e2039290300370300200541a0036a225f203b2903003703002005419803" + "6a2260203d29030037030020054190036a2261203f290300370300200520" + "402903003703880320052001290380013703800320054180036a20014180" + "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" + "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" + "026a290300370300200541e0036a2265200141a0026a2903003703002005" + "41d8036a226620014198026a290300370300200541d0036a226720014190" + "026a290300370300200520014188026a2903003703c80320052001290380" + "023703c003200541c0036a20014180026a22472003102f200541b8046a22" + "68200b290300370300200541b0046a2269200a290300370300200541a804" + "6a226a2009290300370300200541a0046a226b2008290300370300200541" + "98046a226c200729030037030020054190046a226d200629030037030020" + "05200c29030037038804200520012903003703800420054180046a200120" + "471030200541f8046a226e200b290300370300200541f0046a226f200a29" + "0300370300200541e8046a22702009290300370300200541e0046a227120" + "08290300370300200541d8046a22722007290300370300200541d0046a22" + "7320062903003703002005200c2903003703c804200520012903003703c0" + "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" + "0300370300200541b0056a2249200141f0006a2213290300370300200541" + "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" + "e0006a221529030037030020054198056a224c200141d8006a221c290300" + "37030020054190056a224d200141d0006a221d2903003703002005200141" + "c8006a221e29030037038805200520012903403703800520054180056a20" + "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" + "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" + "096a220d290300370300204a200541e8096a220e290300370300204b2005" + "41e0096a220f290300370300204c200541d8096a2210290300370300204d" + "200541d0096a2211290300370300200520052903c8093703880520052005" + "2903c00937038005200541d0056a2222201d290300370300200541d8056a" + "2223201c290300370300200541e0056a22242015290300370300200541e8" + "056a22252014290300370300200541f0056a222620132903003703002005" + "41f8056a22272012290300370300200520012903403703c0052005201e29" + "03003703c805200541c0056a201f2004102f200541b8066a221620272903" + "00370300200541b0066a22172026290300370300200541a8066a22182025" + "290300370300200541a0066a2219202429030037030020054198066a221a" + "202329030037030020054190066a221b2022290300370300200520052903" + "c80537038806200520052903c0053703800620054180066a200541c0056a" + "200541c0036a1030200542003703b80b200542003703b00b200542003703" + "a80b200542013703a00b200542003703980b200542003703900b20054200" + "3703880b200542093703800b200541c0096a20054180066a200541800b6a" + "102f2016200c2903003703002017200d2903003703002018200e29030037" + "03002019200f290300370300201a2010290300370300201b201129030037" + "0300200520052903c80937038806200520052903c00937038006200541c0" + "096a20054180066a200541c0026a10302016200c29030022810137030020" + "17200d2903002282013703002018200e2903002283013703002019200f29" + "0300228401370300201a2010290300228501370300201b20112903002286" + "01370300200541106a2275208601370300200541186a2276208501370300" + "200541206a2277208401370300200541286a227820830137030020054130" + "6a2279208201370300200541386a227a208101370300200520052903c809" + "22810137038806200520052903c009228201370380062005208201370300" + "2005208101370308200541f8066a22062020290300370300200541f0066a" + "22072021290300370300200541e8066a22082028290300370300200541e0" + "066a22092029290300370300200541d8066a220a202a2903003703002005" + "41d0066a220b202b2903003703002005202c2903003703c8062005200129" + "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" + "6a200541c0066a10302027200c2903003703002026200d29030037030020" + "25200e2903003703002024200f2903003703002023201029030037030020" + "222011290300370300200520052903c8093703c805200520052903c00937" + "03c005200541c0096a200541c0066a20054180036a10302006200c290300" + "2281013703002007200d2903002282013703002008200e29030022830137" + "03002009200f290300228401370300200a2010290300228501370300200b" + "2011290300228601370300201b208601370300201a208501370300201920" + "840137030020182083013703002017208201370300201620810137030020" + "0520052903c8092281013703c806200520052903c0092282013703c00620" + "052082013703800620052081013703880620054180066a200541c0066a20" + "0541800b6a102f2006201229030037030020072013290300370300200820" + "1429030037030020092015290300370300200a201c290300370300200b20" + "1d2903003703002005201e2903003703c806200520012903403703c00620" + "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" + "302027200c2903003703002026200d2903003703002025200e2903003703" + "002024200f29030037030020232010290300370300202220112903003703" + "00200520052903c8093703c805200520052903c0093703c005200541c009" + "6a20054180066a200541c0066a10302016200c2903002281013703002017" + "200d2903002282013703002018200e2903002283013703002019200f2903" + "00228401370300201a2010290300228501370300201b2011290300228601" + "370300200541d0006a227b208601370300200541d8006a227c2085013703" + "00200541e0006a227d208401370300200541e8006a227e20830137030020" + "0541f0006a227f208201370300200541f8006a2280012081013703002005" + "20052903c80922810137038806200520052903c009228201370380062005" + "2082013703402005208101370348200541b8076a221c200241386a222829" + "0300370300200541b0076a221d200241306a2229290300370300200541a8" + "076a221e200241286a222a290300370300200541a0076a221f200241206a" + "222b29030037030020054198076a2220200241186a222c29030037030020" + "054190076a2221200241106a222d2903003703002005200241086a224e29" + "030037038807200520022903003703800720054180076a20022004103020" + "06206e2903003703002007206f2903003703002008207029030037030020" + "092071290300370300200a2072290300370300200b207329030037030020" + "0520052903c8043703c806200520052903c0043703c006200541c0066a20" + "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" + "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" + "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" + "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" + "0629030037030020054190086a2213200729030037030020052008290300" + "37038808200520092903003703800820054180086a204329030020442903" + "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" + "030022810137030020112015290300228201370300200f20052903800822" + "8301370300200d2013290300228401370300200e20052903880822850137" + "0300200c2012290300228601370300200520052903c80b2287013703c809" + "200520052903c00b2288013703c009200620860137030020072084013703" + "0020082085013703002009208301370300200a208101370300200b208201" + "37030020052087013703c80620052088013703c0062014200a2903003703" + "002015200b290300370300200520052903c8063703c80b200520052903c0" + "063703c00b200541c00b6a20052903800322810120052903880322820120" + "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "122006290300370300201320072903003703002005200829030037038808" + "200520092903003703800820054180086a205f290300228501205e290300" + "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d2010201429030022890137030020112015290300228a0137030020" + "0f200529038008228b01370300200d2013290300228c01370300200e2005" + "29038808228d01370300200c2012290300228e01370300200520052903c8" + "0b228f013703c809200520052903c00b2290013703c0092006208e013703" + "002007208c013703002008208d013703002009208b01370300200a208901" + "370300200b208a013703002005208f013703c80620052090013703c00620" + "162054290300370300201720532903003703002018205229030037030020" + "192051290300370300201a2050290300370300201b204f29030037030020" + "05205529030037038806200520012903c0013703800620054180066a2074" + "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" + "003703002026200d2903003703002025200e2903003703002024200f2903" + "003703002023201029030037030020222011290300370300200520052903" + "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" + "20054180066a10302006200c2903003703002007200d2903003703002008" + "200e2903003703002009200f290300370300200a2010290300370300200b" + "2011290300370300200520052903c8093703c806200520052903c0093703" + "c0062021203f2903003703002020203d290300370300201f203b29030037" + "0300201e2039290300370300201d2037290300370300201c203529030037" + "030020052001290380013703800720052040290300370388072005418007" + "6a20054180016a2047103020342006290300370300203620072903003703" + "0020382008290300370300203a2009290300370300203c200a2903003703" + "00203e200b290300370300200541d0076a200441106a2903003703002005" + "41d8076a200441186a290300370300200541e0076a200441206a29030037" + "0300200541e8076a200441286a290300370300200541f0076a200441306a" + "290300370300200541f8076a200441386a290300370300200520052903c8" + "0637038801200520052903c00637038001200520042903003703c0072005" + "200441086a2903003703c807200541c0076a2004200310302006201c2903" + "003703002007201d2903003703002008201e2903003703002009201f2903" + "00370300200a2020290300370300200b2021290300370300200520052903" + "88073703c80620052005290380073703c006200541c0066a20054180076a" + "200541c0076a102f2014200a2903003703002015200b2903003703002005" + "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" + "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" + "003703002013200729030037030020052008290300370388082005200929" + "03003703800820054180086a20850120860120870120880142c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20102014290300228101370300201120152903002282" + "01370300200f200529038008228301370300200d20132903002284013703" + "00200e200529038808228501370300200c20122903002286013703002005" + "20052903c80b2287013703c809200520052903c00b2288013703c0092006" + "208601370300200720840137030020082085013703002009208301370300" + "200a208101370300200b20820137030020052087013703c8062005208801" + "3703c0062014200a2903003703002015200b290300370300200520052903" + "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" + "22810120052903c8032282012067290300228301206629030022840142c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d201220062903003703002013200729030037" + "03002005200829030037038808200520092903003703800820054180086a" + "206529030022850120642903002286012063290300228701206229030022" + "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" + "112015290300228a01370300200f200529038008228b01370300200d2013" + "290300228c01370300200e200529038808228d01370300200c2012290300" + "228e01370300200520052903c80b228f013703c809200520052903c00b22" + "90013703c0092006208e013703002007208c013703002008208d01370300" + "2009208b01370300200a208901370300200b208a013703002005208f0137" + "03c80620052090013703c006201620062903003703002017200729030037" + "03002018200829030037030020192009290300370300201a200a29030037" + "0300201b200b290300370300200520052903c80637038806200520052903" + "c0063703800620054180066a200541c0066a200541800b6a102f20062033" + "290300370300200720322903003703002008203129030037030020092030" + "290300370300200a202f290300370300200b202e29030037030020052005" + "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" + "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" + "2903003703002026200d2903003703002025200e2903003703002024200f" + "290300370300202320102903003703002022201129030037030020052005" + "2903c8093703c805200520052903c0093703c005200541c0096a20054180" + "066a200541c0066a10302016200c2903002289013703002017200d290300" + "228a013703002018200e290300228b013703002019200f290300228c0137" + "0300201a2010290300228d01370300201b2011290300228e01370300202e" + "208e01370300202f208d013703002030208c013703002031208b01370300" + "2032208a013703002033208901370300200520052903c809228901370388" + "06200520052903c009228a01370380062005208a013703c0012005208901" + "3703c8012006205629030037030020072057290300370300200820582903" + "0037030020092059290300370300200a205a290300370300200b205b2903" + "0037030020052005290388023703c80620052005290380023703c0062005" + "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" + "066a10302027200c2903003703002026200d2903003703002025200e2903" + "003703002024200f29030037030020232010290300370300202220112903" + "00370300201b200b290300370300201a200a290300370300201920092903" + "003703002018200829030037030020172007290300370300201620062903" + "00370300200520052903c8093703c805200520052903c0093703c0052005" + "20052903c00637038006200520052903c8063703880620054180066a2005" + "41c0066a200541800b6a102f201c2028290300370300201d202929030037" + "0300201e202a290300370300201f202b2903003703002020202c29030037" + "03002021202d2903003703002005204e2903003703880720052002290300" + "3703800720054180076a2002200310302006206829030037030020072069" + "2903003703002008206a2903003703002009206b290300370300200a206c" + "290300370300200b206d29030037030020052005290388043703c8062005" + "2005290380043703c006200541c0066a20054180046a20054180076a102f" + "2014200a2903003703002015200b290300370300200520052903c8063703" + "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" + "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" + "290300370300201320072903003703002005200829030037038808200520" + "092903003703800820054180086a20432903002044290300204529030020" + "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" + "0020112015290300228a01370300200f200529038008228b01370300200d" + "2013290300228c01370300200e200529038808228d01370300200c201229" + "0300228e01370300200520052903c80b228f013703c809200520052903c0" + "0b2290013703c0092006208e013703002007208c013703002008208d0137" + "03002009208b01370300200a208901370300200b208a013703002005208f" + "013703c80620052090013703c0062014200a2903003703002015200b2903" + "00370300200520052903c8063703c80b200520052903c0063703c00b2005" + "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201220062903003703002013200729030037030020052008290300370388" + "08200520092903003703800820054180086a208501208601208701208801" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" + "15290300228201370300200f200529038008228301370300200d20132903" + "00228401370300200e200529038808228501370300200c20122903002286" + "01370300200520052903c80b2287013703c809200520052903c00b228801" + "3703c0092006208601370300200720840137030020082085013703002009" + "208301370300200a208101370300200b20820137030020052087013703c8" + "0620052088013703c006200541c0096a20054180066a200541c0066a1030" + "2016200c2903003703002017200d2903003703002018200e290300370300" + "2019200f290300370300201a2010290300370300201b2011290300370300" + "200520052903c80937038806200520052903c009370380062021202d2903" + "003703002020202c290300370300201f202b290300370300201e202a2903" + "00370300201d2029290300370300201c2028290300370300200520022903" + "00370380072005204e2903003703880720054180076a2002200410302005" + "41c0096a20054180076a20031030201c200c290300370300201d200d2903" + "00370300201e200e290300370300201f200f290300370300202020102903" + "0037030020212011290300370300200b204d290300370300200a204c2903" + "003703002009204b2903003703002008204a290300370300200720492903" + "0037030020062048290300370300200520052903c8093703880720052005" + "2903c0093703800720052005290380053703c00620052005290388053703" + "c806200541c0066a20054180056a20054180076a102f2014200a29030037" + "03002015200b290300370300200520052903c8063703c80b200520052903" + "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" + "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" + "200729030037030020052008290300370388082005200929030037038008" + "20054180086a202429030020252903002026290300202729030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d2010201429030022810137030020112015290300" + "228201370300200f200529038008228301370300200d2013290300228401" + "370300200e200529038808228501370300200c2012290300228601370300" + "200520052903c80b2287013703c809200520052903c00b2288013703c009" + "200620860137030020072084013703002008208501370300200920830137" + "0300200a208101370300200b20820137030020052087013703c806200520" + "88013703c006200541b8086a207a290300370300200541b0086a20792903" + "00370300200541a8086a2078290300370300200541a0086a207729030037" + "030020122076290300370300201320752903003703002005200529030837" + "0388082005200529030037038008200541c8086a20052903483703002005" + "41d0086a207b290300370300200541d8086a207c290300370300200541e0" + "086a207d290300370300200541e8086a207e290300370300200541f0086a" + "207f290300370300200541f8086a20800129030037030020052005290340" + "3703c008200541b8096a2034290300370300200541b0096a203629030037" + "0300200541a8096a2038290300370300200541a0096a203a290300370300" + "20054198096a203c29030037030020054190096a203e2903003703002005" + "4188096a200529038801370300200520052903800137038009200c203329" + "0300370300200d2032290300370300200e2031290300370300200f203029" + "03003703002010202f2903003703002011202e2903003703002005200529" + "03c8013703c809200520052903c0013703c009200541880a6a2005290388" + "06370300200541900a6a201b290300370300200541980a6a201a29030037" + "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" + "200541b00a6a2017290300370300200541b80a6a20162903003703002005" + "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" + "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" + "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" + "00370300200541c80a6a20052903c806370300200520052903c0063703c0" + "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" + "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" + "046a20014180016a22162002102f20034198036a2204200141186a220c29" + "030037030020034190036a2205200141106a220d29030037030020032001" + "41086a220f29030037038803200320012903003703800320034180036a20" + "032903800420032903880420032903900420034198046a220929030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" + "370300200341d0036a2207200141306a2211290300370300200320014128" + "6a22122903003703c8032003200141206a22172903003703c003200341c0" + "036a20032903a004200341a8046a220a29030020032903b004200341b804" + "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" + "0300370300200341106a22082005290300370300200341206a2213200329" + "03c003370300200341286a221420032903c803370300200341306a221520" + "07290300370300200341386a221820062903003703002003200329038803" + "370308200320032903800337030020034180046a2016200241406b221f10" + "2f2004200141d8006a22202903003703002005200141d0006a2221290300" + "3703002003200141c8006a22222903003703880320032001290340370380" + "0320034180036a2003290380042003290388042003290390042009290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" + "2007200141f0006a22242903003703002003200141e8006a222529030037" + "03c8032003200141e0006a22262903003703c003200341c0036a20032903" + "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200341d8006a22192004290300370300200341d0006a221a20052903" + "00370300200341e0006a221b20032903c003370300200341e8006a221c20" + "032903c803370300200341f0006a221d2007290300370300200341f8006a" + "221e20062903003703002003200329038803370348200320032903800337" + "0340200341f8046a2018290300370300200341f0046a2015290300370300" + "200341e8046a2014290300370300200341e0046a20132903003703002003" + "41d8046a200e290300370300200341d0046a200829030037030020032003" + "2903083703c804200320032903003703c004200341c0046a20032003102f" + "200341b8056a201e290300370300200341b0056a201d2903003703002003" + "41a8056a201c290300370300200341a0056a201b29030037030020034198" + "056a201929030037030020034190056a201a290300370300200320032903" + "4837038805200320032903403703800520034180056a200341406b200341" + "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" + "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" + "4180046a20034180016a103020034180046a200341c0016a200341c0016a" + "1030200341d8026a220e2006290300370300200341d0026a220820072903" + "00370300200320032903c8033703c802200320032903c0033703c0022003" + "41c0026a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" + "0341f0036a22142903003703002003200341e8036a221529030037038803" + "200320032903e0033703800320034180036a20032903a004200a29030020" + "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" + "2218200e29030037030020034190026a22272008290300370300200341a8" + "026a2228200329038803370300200341b0026a2229200529030037030020" + "0341b8026a222a2004290300370300200320032903c80237038802200320" + "032903c0023703800220032003290380033703a00220034180046a200320" + "034180026a102f2010200b2903003703002011200341b0046a2210290300" + "3703002012200a2903003703002017200341a0046a222b29030037030020" + "0c2009290300370300200d20034190046a2211290300370300200f200329" + "03880437030020012003290380043703002004200341d8016a2903003703" + "002005200341d0016a290300370300200320032903c80137038803200320" + "032903c0013703800320034180036a200329038002200329038802202729" + "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" + "03003703002007200341f0016a2903003703002003200341e8016a290300" + "3703c803200320032903e0013703c003200341c0036a20032903a0022028" + "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" + "0429030037030020112005290300370300200a20032903c8033703002010" + "2007290300370300200b2006290300370300200320032903880337038804" + "200320032903800337038004200320032903c0033703a004200341c0036a" + "200341406b20034180046a102f20034180046a20034180016a200141406b" + "102f200341f8056a220c2006290300370300200341f0056a220d20072903" + "00370300200320032903c8033703e805200320032903c0033703e0052003" + "41e0056a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d200e2013290300370300200820142903003703" + "00200320152903003703c802200320032903e0033703c002200341c0026a" + "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2004200c2903003703002005200d290300370300200341a0" + "036a221720032903c002370300200341a8036a220f20032903c802370300" + "200341b0036a22122008290300370300200341b8036a2208200e29030037" + "0300200320032903e80537038803200320032903e0053703800320232008" + "290300370300202420122903003703002025200f29030037030020262017" + "290300370300202020042903003703002021200529030037030020222003" + "29038803370300200120032903800337034020034180046a201620034180" + "016a102f200141b8016a200b290300370300200141b0016a201029030037" + "0300200141a8016a200a290300370300200141a0016a202b290300370300" + "20014198016a200929030037030020014190016a20112903003703002001" + "4188016a2003290388043703002001200329038004370380012003420037" + "03f802200342003703f002200342003703e802200342013703e002200342" + "003703d802200342003703d002200342003703c802200342093703c00220" + "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" + "056a22012006290300370300200341d0056a220620072903003703002003" + "20032903c8033703c805200320032903c0033703c005200341c0056a2003" + "29038004200329038804200329039004200929030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200c2013290300370300200d20142903003703002003201529" + "03003703e805200320032903e0033703e005200341e0056a20032903a004" + "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2004200129030037030020052006290300370300200f20032903e8053703" + "002012200d2903003703002008200c290300370300200320032903c80537" + "038803200320032903c00537038003200320032903e0053703a003200341" + "80046a200341c0026a20034180036a102f201e2903002136201d29030021" + "34201c290300212d201b2903002135201a29030022302003290340223184" + "201929030022382003290348223284844200520440427f4200427f420020" + "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" + "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" + "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" + "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" + "2f0b4200213042002131420021322034203584202d203684844200520440" + "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" + "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" + "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" + "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" + "ed82a3903c20357d212c0b20002003290380043703002000200329030037" + "0340200041086a200329038804370300200041c8006a2003290308370300" + "200041386a200341b8046a290300370300200041306a200341b0046a2903" + "00370300200041286a200341a8046a290300370300200041206a200341a0" + "046a290300370300200041186a20034198046a290300370300200041106a" + "20034190046a290300370300200041d0006a200341106a29030037030020" + "0041d8006a200341186a290300370300200041e0006a200341206a290300" + "370300200041e8006a200341286a290300370300200041f0006a20034130" + "6a290300370300200041f8006a200341386a290300370300200020323703" + "b801200020313703b001200020303703a8012000202c3703a00120002033" + "370398012000202e3703900120002037370388012000202f370380012003" + "4180066a24000b4201047f412021020240034020002d0000220320012d00" + "002204460440200041016a2100200141016a2101200241016b22020d010c" + "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" + "21020c010b02402000410020006b41037122046a220320004d0d00200021" + "0220040440200421050340200241003a0000200241016a2102200541016b" + "22050d000b0b200441016b4107490d000340200241003a0000200241076a" + "41003a0000200241066a41003a0000200241056a41003a0000200241046a" + "41003a0000200241036a41003a0000200241026a41003a0000200241016a" + "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" + "716a220220034b0440034020034100360200200341046a22032002490d00" + "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" + "042001410771220304400340200241003a0000200241016a210220034101" + "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" + "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" + "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" + "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" + "10490440200021030c010b02402000410020006b41037122066a22052000" + "4d0d00200641016b21082000210320012104200604402006210703402003" + "20042d00003a0000200441016a2104200341016a2103200741016b22070d" + "000b0b20084107490d000340200320042d00003a0000200341016a200441" + "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" + "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" + "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" + "41076a200441076a2d00003a0000200441086a2104200341086a22032005" + "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" + "04410371450440200320054d0d0120042101034020052001280200360200" + "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" + "2004410374220241187121062004417c71220941046a2101410020026b41" + "1871210a2009280200210203402005200220067620012802002202200a74" + "72360200200141046a2101200541046a22052003490d000b0b2007410371" + "2102200420086a21010b02402003200220036a22054f0d00200241016b21" + "072002410771220404400340200320012d00003a0000200141016a210120" + "0341016a2103200441016b22040d000b0b20074107490d00034020032001" + "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" + "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" + "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" + "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" + "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" + "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" + "20047e22042003200142208822017e7c22034220867c2206370300200020" + "05200656ad200120027e2003200454ad4220862003422088847c7c370308" + "0b5601017e0240200341c000714504402003450d012002410020036b413f" + "71ad8620012003413f71ad220488842101200220048821020c010b200220" + "03413f71ad882101420021020b20002001370300200020023703080b5a01" + "027e420121020240200141c000714504402001450d0142002001413f71ad" + "2202864201410020016b413f71ad88842103420120028621020c010b4201" + "2001413f71ad862103420021020b20002002370300200020033703080b0b" + "e1250100418080c0000bd725307830306165613865396338336337336437" + "343033363932336465316234613636643138353437643538656565346561" + "6366656537303233356564323931393534636361706163697479206f7665" + "72666c6f77004200100011000000010000000000000063616c6c65642060" + "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" + "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" + "6c656e20697320206275742074686520696e646578206973200000008f00" + "100020000000af001000120000003a2000000100000000000000d4001000" + "020000003030303130323033303430353036303730383039313031313132" + "313331343135313631373138313932303231323232333234323532363237" + "323832393330333133323333333433353336333733383339343034313432" + "343334343435343634373438343935303531353235333534353535363537" + "353835393630363136323633363436353636363736383639373037313732" + "373337343735373637373738373938303831383238333834383538363837" + "38383839393039313932393339343935393639373938393972616e676520" + "737461727420696e64657820206f7574206f662072616e676520666f7220" + "736c696365206f66206c656e67746820b001100012000000c20110002200" + "000072616e676520656e6420696e64657820f401100010000000c2011000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e6473206174200014021000160000002a0210000d00000054726965" + "6420746f20736872696e6b20746f2061206c617267657220636170616369" + "74794802100024000000f40a10004c000000b3020000090000002f686f6d" + "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" + "7372632f696e6465782e6372617465732e696f2d31393439636638633662" + "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" + "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" + "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" + "0000ea0210006f000000890000001b000000a80c10006f00000057000000" + "09000000a80c10006f000000a3000000090000008402100066000000ad00" + "000013000000a80c10006f000000c40000001f000000a80c10006f000000" + "150100000e000000a80c10006f000000160100000e000000a80c10006f00" + "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" + "6f0000002001000021000000a80c10006f0000002101000018000000a80c" + "10006f000000420100003c000000040c10006e0000006d0200000d000000" + "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f6e756d" + "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" + "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" + "0000120000003c0410006c00000028000000190000002f72757374632f34" + "656231363132353065333430633866343866363665326239323965663461" + "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" + "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f6865782d302e342e33" + "2f7372632f6c69622e7273000000260510005b000000c700000025000000" + "260510005b000000c7000000410000004e6f744d656d626572496e76616c" + "6964536c6963654c656e677468496e76616c696455353132456e636f6469" + "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" + "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" + "6c696420636f6d7072657373656420706f696e7420666c61670000000806" + "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" + "313934396366386336623562353537662f7370312d76657269666965722d" + "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" + "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f7370312d7665726966" + "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" + "00000100000001000000060000004661696c656420746f20636f6e766572" + "74207820627974657320746f20467100ac0610006a0000001f0000003700" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7370312d76657269666965722d342e312e" + "332f7372632f67726f746831362f636f6e7665727465722e727300005807" + "100072000000290000003e00000058071000720000002a0000003d000000" + "58071000720000002b0000003e00000058071000720000002c0000003e00" + "000058071000720000002e0000002500000058071000720000002e000000" + "3200000058071000720000002e0000003f00000058071000720000002e00" + "00004c0000005807100072000000320000003f0000005807100072000000" + "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f7370312d76657269666965" + "722d342e312e332f7372632f67726f746831362f7665726966792e727300" + "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737031" + "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" + "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" + "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" + "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" + "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" + "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" + "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" + "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" + "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" + "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" + "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" + "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" + "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" + "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" + "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" + "74632f346562313631323530653334306338663438663636653262393239" + "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" + "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "500b100029000000ae0400000d0000000000000004000000000000002f68" + "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" + "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" + "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" + "62696775696e742f636f6e766572742e72730000040c10006e000000f001" + "000016000000617474656d707420746f20646976696465206279207a6572" + "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f6e756d2d626967" + "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" + "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" + "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" + "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" + "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" + "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" + "726576696f75736c7920706f69736f6e656420627920612070616e69636b" + "65640000350d10005d0000004e010000250000002f72757374632f346562" + "313631323530653334306338663438663636653262393239656634613562" + "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" + "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" + "526573756c743a3a756e77726170282960206f6e20616e20604572726020" + "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" + "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" + "3934396366386336623562353537662f7375627374726174652d626e2d73" + "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" + "64732f66702e72730000630e10007b000000e9020000230000004661696c" + "656420746f20636f6d707574652074686520696e7665727365206f662074" + "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f737562737472617465" + "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" + "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" + "000000000100000001000000070000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737562" + "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" + "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" + "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" + "416666696e654731b80f10007c0000000001000012000000b80f10007c00" + "00002001000012000000b80f10007c000000400100000d000000b80f1000" + "7c0000006b01000029000000010001000000030003000000030001000300" + "000300000000000100000300010000030000000003000100000003000300" + "00010000000300000300010001000000b80f10007c000000150300002600" + "0000b80f10007c0000001003000026000000b80f10007c00000008030000" + "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" + "000010000000b80f10007c0000009c03000010000000b80f10007c000000" + "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" + "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" + "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" + "10007c000000191100002a000000b80f10007c0000001911000017000000" + "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7375627374726174652d626e2d73756363" + "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" + "0000e4111000750000003b0300000c000000e4111000750000003c030000" + "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" + "616c6964496e7075744c656e677468000000120000001300000009000000" + "ad051000bf051000a40510000a0000000d000000120000007c1210008612" + "1000931210004d0970726f64756365727302086c616e6775616765010452" + "757374000c70726f6365737365642d6279010572757374631d312e38352e" + "31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" + "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" + "756c746976616c7565"; + +extern std::string const ledgerSqnWasmHex = + "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" + "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" + "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" + "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" + "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" + "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" + "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" + "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" + "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" + "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" + "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" + "62346235613264623538323935386166316565333038613739306366646234326264323437" + "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; + +extern std::string const allHostFunctionsWasmHex = + "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" + "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" + "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" + "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" + "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" + "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" + "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" + "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" + "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" + "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" + "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" + "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" + "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" + "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" + "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" + "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" + "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" + "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" + "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" + "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" + "6a22044100360200200141106a220542003703002001420037030802404181802020014108" + "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" + "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" + "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" + "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" + "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" + "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" + "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" + "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" + "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" + "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" + "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" + "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" + "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" + "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" + "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" + "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" + "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" + "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" + "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" + "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" + "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" + "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" + "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" + "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" + "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" + "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" + "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" + "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" + "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" + "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" + "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" + "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" + "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" + "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" + "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" + "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" + "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" + "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" + "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" + "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" + "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" + "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" + "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" + "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" + "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" + "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" + "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" + "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" + "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" + "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" + "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" + "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" + "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" + "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" + "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" + "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" + "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" + "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" + "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" + "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" + "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" + "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" + "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" + "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" + "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" + "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" + "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" + "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" + "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" + "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" + "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" + "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" + "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" + "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" + "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" + "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" + "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" + "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" + "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" + "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" + "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" + "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" + "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" + "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" + "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" + "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; + +extern std::string const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const hfPerfTest = + "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" + "6000017f021d0203656e760974726163655f6e756d000003656e76057472" + "616365000103030202030503010002068601167f0041a0090b7f0041a011" + "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" + "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" + "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" + "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" + "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300020666696e6973680003036275660300076c6f635f6275660301" + "036d73670302086572725f686561640303096572725f646174613103040a" + "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" + "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" + "746103090753465f44617461030a1753465f417574686f72697a65437265" + "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" + "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" + "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" + "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" + "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" + "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" + "0300200041086a22000d000b41d811420037030041d011420037030041c8" + "11420037030041c011420037030041b811420037030041b0114200370300" + "41a811428d801c37030041a011429a803c3703000240034041e008411020" + "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" + "1441c0084113410010011a0b41010b0b840104004180080b340100080003" + "00080009000f000a000e000d0007001b0007001a000f0000000000676574" + "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" + "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" + "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" + "007f0970726f647563657273010c70726f6365737365642d62790105636c" + "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" + "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" + "346235613264623538323935386166316565333038613739306366646234" + "32626432343732302900490f7461726765745f6665617475726573042b0f" + "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" + "6572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const allKeyletsWasmHex = + "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" + "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" + "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" + "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" + "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" + "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" + "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" + "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" + "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" + "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" + "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" + "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" + "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" + "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" + "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" + "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" + "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" + "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" + "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" + "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" + "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" + "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" + "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" + "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" + "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" + "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" + "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" + "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" + "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" + "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" + "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" + "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" + "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" + "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" + "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" + "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" + "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" + "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" + "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" + "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" + "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" + "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" + "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" + "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" + "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" + "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" + "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" + "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" + "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" + "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" + "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" + "420037030020004200370388012008411420024120100622014120460d0102402001410048" + "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" + "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" + "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" + "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" + "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" + "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" + "420037030020004190016a220542003703002000420037038801200041046a411420004118" + "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" + "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" + "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" + "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" + "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" + "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" + "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" + "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" + "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" + "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" + "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" + "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" + "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" + "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" + "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" + "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" + "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" + "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" + "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" + "003703e001200041046a411441062004412010092204412047044002402004410048044020" + "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" + "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" + "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" + "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" + "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" + "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" + "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" + "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" + "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" + "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" + "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" + "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" + "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" + "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" + "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" + "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" + "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" + "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" + "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" + "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" + "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" + "200041186a2208411420034120100c22024120470440024020024100480440200120023602" + "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" + "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" + "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" + "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" + "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" + "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" + "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" + "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" + "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" + "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" + "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" + "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" + "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" + "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" + "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" + "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" + "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" + "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" + "03290300370001200141196a2006290300370000200141116a200729030037000020014109" + "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" + "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" + "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" + "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" + "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" + "02027f20054118200841142001412010102205412047044002402005410048044020022005" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" + "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" + "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" + "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" + "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" + "084114410620014120101122054120470440024020054100480440200220053602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" + "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" + "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" + "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" + "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" + "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" + "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" + "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" + "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" + "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" + "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" + "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" + "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" + "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" + "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" + "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" + "022001290300370001200241196a2008290300370000200241116a20062903003700002002" + "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" + "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" + "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" + "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" + "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" + "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" + "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" + "370300200141106a22064200370300200141086a2207420037030020014200370300200041" + "90066a2202027f200441144112200141201016220541204704400240200541004804402002" + "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" + "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" + "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" + "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" + "7f20044114411320014120101722044120470440024020044100480440200220043602040c" + "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" + "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" + "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" + "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" + "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" + "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" + "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" + "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" + "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" + "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" + "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" + "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" + "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" + "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" + "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" + "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" + "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" + "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" + "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" + "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" + "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" + "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" + "200228020021020340200420022003762001280200220220057472360200200141046a2101" + "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" + "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" + "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" + "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" + "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" + "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" + "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" + "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" + "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" + "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" + "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" + "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" + "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" + "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" + "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" + "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" + "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" + "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" + "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" + "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" + "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" + "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" + "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; + +extern std::string const codecovTestsWasmHex = + "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" + "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" + "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" + "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" + "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" + "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" + "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" + "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" + "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" + "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" + "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" + "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" + "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" + "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" + "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" + "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" + "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" + "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" + "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" + "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" + "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" + "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" + "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" + "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" + "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" + "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" + "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" + "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" + "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" + "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" + "002002420037030020004200370360200141201006412041918bc000411210341007410a41" + "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" + "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" + "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" + "c0004111103420034100360200200242003703002000420037036002404181802020014114" + "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" + "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" + "200028006336002f200020002903c801370033200442003703002003420037030020024200" + "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" + "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" + "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" + "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" + "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" + "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" + "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" + "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" + "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" + "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" + "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" + "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" + "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" + "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" + "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" + "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" + "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" + "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" + "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" + "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" + "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" + "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" + "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" + "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" + "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" + "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" + "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" + "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" + "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" + "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" + "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" + "00200020002903083703a801200241003b010020054200370300200042003703c801200341" + "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" + "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" + "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" + "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" + "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" + "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" + "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" + "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" + "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" + "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" + "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" + "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" + "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" + "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" + "34200742003703002002420037030020054200370300200042003703c801200620002802a0" + "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" + "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" + "42003703002002420037030020054200370300200042003703c80120034114200341142006" + "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" + "20054200370300200042003703c8012003411420034114200120002802a001200441201022" + "417141968ec000411e10342007420037030020024200370300200542003703002000420037" + "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" + "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" + "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" + "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" + "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" + "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" + "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" + "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" + "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" + "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" + "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" + "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" + "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" + "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" + "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" + "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" + "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" + "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" + "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" + "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" + "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" + "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" + "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" + "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" + "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" + "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" + "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" + "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" + "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" + "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" + "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" + "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" + "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" + "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" + "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" + "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" + "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" + "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" + "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" + "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" + "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" + "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" + "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" + "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" + "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" + "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" + "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" + "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" + "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" + "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" + "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" + "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" + "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" + "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" + "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" + "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" + "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" + "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" + "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" + "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" + "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" + "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" + "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" + "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" + "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" + "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" + "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" + "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" + "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" + "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" + "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" + "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" + "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" + "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" + "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" + "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" + "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" + "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" + "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" + "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" + "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" + "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" + "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" + "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" + "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" + "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" + "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" + "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" + "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" + "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" + "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" + "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" + "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" + "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" + "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" + "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" + "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" + "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" + "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" + "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" + "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" + "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" + "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" + "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" + "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" + "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" + "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" + "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" + "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" + "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" + "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" + "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" + "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" + "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" + "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" + "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" + "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const floatTestsWasmHex = + "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" + "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" + "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" + "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" + "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" + "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" + "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" + "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" + "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" + "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" + "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" + "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" + "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" + "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" + "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" + "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" + "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" + "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" + "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" + "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" + "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" + "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" + "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" + "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" + "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" + "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" + "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" + "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" + "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" + "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" + "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" + "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" + "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" + "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" + "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" + "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" + "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" + "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" + "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" + "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" + "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" + "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" + "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" + "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" + "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" + "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" + "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" + "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" + "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" + "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" + "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" + "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" + "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" + "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" + "41081083808080001a200042003703184200200041186a410841001081808080001a200041" + "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" + "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" + "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" + "084209200041086a410841001081808080001a20004200370310200041086a410841022000" + "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" + "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" + "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" + "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" + "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" + "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" + "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" + "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" + "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" + "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" + "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" + "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" + "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" + "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" + "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" + "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" + "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" + "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" + "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" + "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" + "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" + "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" + "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" + "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" + "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" + "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" + "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" + "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" + "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" + "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" + "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" + "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" + "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" + "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" + "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" + "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" + "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" + "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" + "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" + "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" + "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" + "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" + "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" + "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" + "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" + "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" + "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" + "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" + "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" + "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" + "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" + "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" + "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" + "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" + "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" + "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" + "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" + "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" + "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" + "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" + "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" + "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" + "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" + "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" + "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" + "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" + "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" + "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" + "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" + "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" + "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" + "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" + "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" + "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" + "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" + "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" + "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" + "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" + "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" + "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" + "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" + "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" + "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" + "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" + "2d74797065732b087369676e2d657874"; + +extern std::string const float0Hex = + "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" + "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" + "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" + "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" + "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" + "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" + "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" + "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" + "7f23808080800041206b2200248080808000418080c08000411541004100" + "41001080808080001a200042003703084200200041086a41084100108180" + "8080001a20004200370310420a200041106a410841001081808080001a20" + "0042003703180240200041106a4108200041106a4108200041186a410841" + "001082808080004108460d00419580c08000411541004100410010808080" + "80001a0b02400240200041086a4108200041186a41081083808080000d00" + "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" + "41164100410041001080808080001a0b02400240200041086a410841d780" + "c0800041081083808080000d0041df80c08000411a410041004100108080" + "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" + "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" + "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" + "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" + "642020666c6f6174203020636f6d706172653a2062616480000000000000" + "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" + "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" + "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" + "72706c5f73746434686f7374357472616365313768616338383262323664" + "656162656436364501355f5a4e387872706c5f73746434686f7374313466" + "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" + "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" + "737562747261637431376864363430633135323334353432393563450334" + "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" + "72653137683663386465656231323864393638386645040666696e697368" + "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" + "7461004d0970726f64756365727302086c616e6775616765010452757374" + "000c70726f6365737365642d6279010572757374631d312e38392e302028" + "32393438333838336520323032352d30382d3034290094010f7461726765" + "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" + "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" + "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" + "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" + "6572656e63652d74797065732b087369676e2d657874"; + +extern std::string const disabledFloatHex = + "0061736d010000000108026000006000017f03030200010503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a150202000b100043000000c54300200045921a41010b"; diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h new file mode 100644 index 00000000000..0e7e3785ea8 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const ledgerSqnWasmHex; + +extern std::string const allHostFunctionsWasmHex; + +extern std::string const deepRecursionHex; + +extern std::string const fibWasmHex; + +extern std::string const b58WasmHex; + +extern std::string const sha512PureWasmHex; + +extern std::string const zkProofWasmHex; + +extern std::string const sp1WasmHex; + +extern std::string const hfPerfTest; + +extern std::string const allKeyletsWasmHex; + +extern std::string const codecovTestsWasmHex; + +extern std::string const floatTestsWasmHex; + +extern std::string const float0Hex; + +extern std::string const disabledFloatHex; diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock new file mode 100644 index 00000000000..972bf3ce61e --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "float_tests" +version = "0.0.1" +dependencies = [ + "xrpl-std", +] + +[[package]] +name = "xrpl-std" +version = "0.0.1" +source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml new file mode 100644 index 00000000000..b4dec2aa504 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "float_tests" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs new file mode 100644 index 00000000000..9688ebd6029 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs @@ -0,0 +1,460 @@ +#![allow(unused_imports)] +#![allow(unused_variables)] +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_std::core::locator::Locator; +use xrpl_std::decode_hex_32; +use xrpl_std::host::trace::DataRepr::AsHex; +use xrpl_std::host::trace::{trace, trace_data, trace_float, trace_num, DataRepr}; +use xrpl_std::host::{ + cache_ledger_obj, float_add, float_compare, float_divide, float_from_int, float_from_uint, + float_log, float_multiply, float_pow, float_root, float_set, float_subtract, + get_ledger_obj_array_len, get_ledger_obj_field, get_ledger_obj_nested_field, + trace_opaque_float, FLOAT_NEGATIVE_ONE, FLOAT_ONE, FLOAT_ROUNDING_MODES_TO_NEAREST, +}; +use xrpl_std::sfield; +use xrpl_std::sfield::{ + Account, AccountTxnID, Balance, Domain, EmailHash, Flags, LedgerEntryType, MessageKey, + OwnerCount, PreviousTxnID, PreviousTxnLgrSeq, RegularKey, Sequence, TicketCount, TransferRate, +}; + +fn test_float_from_wasm() { + let _ = trace("\n$$$ test_float_from_wasm $$$"); + + let mut f: [u8; 8] = [0u8; 8]; + if 8 == unsafe { float_from_int(12300, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from i64 12300:", &f); + let _ = trace_data(" float from i64 12300 as HEX:", &f, AsHex); + } else { + let _ = trace(" float from i64 12300: failed"); + } + + let u64_value: u64 = 12300; + if 8 == unsafe { + float_from_uint( + &u64_value as *const u64 as *const u8, + 8, + f.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + } { + let _ = trace_float(" float from u64 12300:", &f); + } else { + let _ = trace(" float from u64 12300: failed"); + } + + if 8 == unsafe { float_set(2, 123, f.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace_float(" float from exp 2, mantissa 123:", &f); + } else { + let _ = trace(" float from exp 2, mantissa 3: failed"); + } + + let _ = trace_float(" float from const 1:", &FLOAT_ONE); + let _ = trace_float(" float from const -1:", &FLOAT_NEGATIVE_ONE); +} + +fn test_float_compare() { + let _ = trace("\n$$$ test_float_compare $$$"); + + let mut f1: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(1, f1.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + let _ = trace(" float from 1: failed"); + } else { + let _ = trace_float(" float from 1:", &f1); + } + + if 0 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 == FLOAT_ONE"); + } else { + let _ = trace(" float from 1 != FLOAT_ONE"); + } + + if 1 == unsafe { float_compare(f1.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" float from 1 > FLOAT_NEGATIVE_ONE"); + } else { + let _ = trace(" float from 1 !> FLOAT_NEGATIVE_ONE"); + } + + if 2 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f1.as_ptr(), 8) } { + let _ = trace(" FLOAT_NEGATIVE_ONE < float from 1"); + } else { + let _ = trace(" FLOAT_NEGATIVE_ONE !< float from 1"); + } +} + +fn test_float_add_subtract() { + let _ = trace("\n$$$ test_float_add_subtract $$$"); + + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..9 { + unsafe { + float_add( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f10: [u8; 8] = [0u8; 8]; + if 8 != unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) } { + // let _ = trace(" float from 10: failed"); + } + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated add: good"); + } else { + let _ = trace(" repeated add: bad"); + } + + for i in 0..11 { + unsafe { + float_subtract( + f_compute.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, FLOAT_NEGATIVE_ONE.as_ptr(), 8) } { + let _ = trace(" repeated subtract: good"); + } else { + let _ = trace(" repeated subtract: bad"); + } +} + +fn test_float_multiply_divide() { + let _ = trace("\n$$$ test_float_multiply_divide $$$"); + + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = FLOAT_ONE; + for i in 0..6 { + unsafe { + float_multiply( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + } + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + if 0 == unsafe { float_compare(f1000000.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" repeated multiply: good"); + } else { + let _ = trace(" repeated multiply: bad"); + } + + for i in 0..7 { + unsafe { + float_divide( + f_compute.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + } + let mut f01: [u8; 8] = [0u8; 8]; + unsafe { float_set(-1, 1, f01.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + + if 0 == unsafe { float_compare(f_compute.as_ptr(), 8, f01.as_ptr(), 8) } { + let _ = trace(" repeated divide: good"); + } else { + let _ = trace(" repeated divide: bad"); + } +} + +fn test_float_pow() { + let _ = trace("\n$$$ test_float_pow $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_pow( + FLOAT_ONE.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cube of 1:", &f_compute); + + unsafe { + float_pow( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th power of -1:", &f_compute); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 9:", &f_compute); + + unsafe { + float_pow( + f9.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 0th power of 9:", &f_compute); + + let mut f0: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(0, f0.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_pow( + f0.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float square of 0:", &f_compute); + + let r = unsafe { + float_pow( + f0.as_ptr(), + 8, + 0, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_num( + " float 0th power of 0 (expecting INVALID_PARAMS error):", + r as i64, + ); +} + +fn test_float_root() { + let _ = trace("\n$$$ test_float_root $$$"); + + let mut f9: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(9, f9.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_root( + f9.as_ptr(), + 8, + 2, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float sqrt of 9:", &f_compute); + unsafe { + float_root( + f9.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 9:", &f_compute); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 3, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float cbrt of 1000000:", &f_compute); + unsafe { + float_root( + f1000000.as_ptr(), + 8, + 6, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" float 6th root of 1000000:", &f_compute); +} + +fn test_float_log() { + let _ = trace("\n$$$ test_float_log $$$"); + + let mut f1000000: [u8; 8] = [0u8; 8]; + unsafe { + float_from_int( + 1000000, + f1000000.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_log( + f1000000.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" log_10 of 1000000:", &f_compute); +} + +fn test_float_negate() { + let _ = trace("\n$$$ test_float_negate $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + unsafe { + float_multiply( + FLOAT_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_NEGATIVE_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const 1: good"); + } else { + let _ = trace(" negate const 1: bad"); + } + + unsafe { + float_multiply( + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + FLOAT_NEGATIVE_ONE.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + // let _ = trace_float(" float:", &f_compute); + if 0 == unsafe { float_compare(FLOAT_ONE.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" negate const -1: good"); + } else { + let _ = trace(" negate const -1: bad"); + } +} + +fn test_float_invert() { + let _ = trace("\n$$$ test_float_invert $$$"); + + let mut f_compute: [u8; 8] = [0u8; 8]; + let mut f10: [u8; 8] = [0u8; 8]; + unsafe { float_from_int(10, f10.as_mut_ptr(), 8, FLOAT_ROUNDING_MODES_TO_NEAREST) }; + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f10.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert a float from 10:", &f_compute); + unsafe { + float_divide( + FLOAT_ONE.as_ptr(), + 8, + f_compute.as_ptr(), + 8, + f_compute.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + let _ = trace_float(" invert again:", &f_compute); + + // if f10's value is 7, then invert twice won't match the original value + if 0 == unsafe { float_compare(f10.as_ptr(), 8, f_compute.as_ptr(), 8) } { + let _ = trace(" invert twice: good"); + } else { + let _ = trace(" invert twice: bad"); + } +} + +#[unsafe(no_mangle)] +pub extern "C" fn finish() -> i32 { + test_float_from_wasm(); + test_float_compare(); + test_float_add_subtract(); + test_float_multiply_divide(); + test_float_pow(); + test_float_root(); + test_float_log(); + test_float_negate(); + test_float_invert(); + + 1 +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c new file mode 100644 index 00000000000..3458b02872c --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c @@ -0,0 +1,27 @@ +#include + +int32_t +get_ledger_sqn(); +// int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +// int32_t trace_num(uint8_t const*, int32_t, int64_t); + +// uint8_t buf[1024]; + +// char const test_res[] = "sqn: "; +// char const test_name[] = "TEST get_ledger_sqn"; + +int +finish() +{ + // trace((uint8_t const *)test_name, sizeof(test_name) - 1, 0, 0, 0); + + // memset(buf, 0, sizeof(buf)); + // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; + + int x = get_ledger_sqn(); + // if (x >= 0) + // x = *((int32_t*)buf); + // trace_num((uint8_t const *)test`_res, sizeof(test_res) - 1, x); + + return x < 0 ? x : (x >= 5 ? x : 0); +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c new file mode 100644 index 00000000000..fe82aa2a659 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c @@ -0,0 +1,145 @@ +#include +#include + +static uint64_t const K512[] = { + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, + 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, + 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, + 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, + 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, + 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, + 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, + 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, + 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, + 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, + 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, + 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, + 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, + 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, + 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, + 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, + 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; + +#define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) +#define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) +#define Sigma1(x) (ROTATE((x), 14) ^ ROTATE((x), 18) ^ ROTATE((x), 41)) +#define sigma0(x) (ROTATE((x), 1) ^ ROTATE((x), 8) ^ ((x) >> 7)) +#define sigma1(x) (ROTATE((x), 19) ^ ROTATE((x), 61) ^ ((x) >> 6)) + +#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) +#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) + +static inline uint64_t +B2U64(uint8_t val, uint8_t sh) +{ + return ((uint64_t)val) << sh; +} + +void* +allocate(int sz) +{ + return malloc(sz); +} +void +deallocate(void* p) +{ + free(p); +} + +uint8_t e_data[32 * 1024]; + +uint8_t* +sha512_process(uint8_t const* data, int32_t length) +{ + static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + + uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; + uint64_t X[16]; + + uint64_t blocks = length / 128; + while (blocks--) + { + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + unsigned i; + for (i = 0; i < 16; i++) + { + X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | + B2U64(data[2], 40) | B2U64(data[3], 32) | B2U64(data[4], 24) | + B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); + data += 8; + + T1 = h; + T1 += Sigma1(e); + T1 += Ch(e, f, g); + T1 += K512[i]; + T1 += X[i]; + + T2 = Sigma0(a); + T2 += Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + for (i = 16; i < 80; i++) + { + s0 = X[(i + 1) & 0x0f]; + s0 = sigma0(s0); + s1 = X[(i + 14) & 0x0f]; + s1 = sigma1(s1); + + T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; + T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; + T2 = Sigma0(a) + Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } + + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + } + + return (uint8_t*)(state); +} + +// int main () +//{ +// return 0; +// } diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock new file mode 100644 index 00000000000..4374624cd2c --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock @@ -0,0 +1,1384 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "camino" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cc" +version = "1.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "windows-link", +] + +[[package]] +name = "clap" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "hkdf", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.174" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" + +[[package]] +name = "libredox" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" +dependencies = [ + "bitflags", + "libc", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "p3-baby-bear" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" +dependencies = [ + "num-bigint", + "p3-field", + "p3-mds", + "p3-poseidon2", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-dft" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" +dependencies = [ + "p3-field", + "p3-matrix", + "p3-maybe-rayon", + "p3-util", + "tracing", +] + +[[package]] +name = "p3-field" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" +dependencies = [ + "itertools", + "num-bigint", + "num-traits", + "p3-util", + "rand", + "serde", +] + +[[package]] +name = "p3-matrix" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" +dependencies = [ + "itertools", + "p3-field", + "p3-maybe-rayon", + "p3-util", + "rand", + "serde", + "tracing", +] + +[[package]] +name = "p3-maybe-rayon" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" + +[[package]] +name = "p3-mds" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" +dependencies = [ + "itertools", + "p3-dft", + "p3-field", + "p3-matrix", + "p3-symmetric", + "p3-util", + "rand", +] + +[[package]] +name = "p3-poseidon2" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" +dependencies = [ + "gcd", + "p3-field", + "p3-mds", + "p3-symmetric", + "rand", + "serde", +] + +[[package]] +name = "p3-symmetric" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" +dependencies = [ + "itertools", + "p3-field", + "serde", +] + +[[package]] +name = "p3-util" +version = "0.2.2-succinct" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" +dependencies = [ + "serde", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "sp1" +version = "0.0.1" +dependencies = [ + "sp1-verifier", +] + +[[package]] +name = "sp1-build" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05372b4e3eecca255ba8e385f8dc294861a3b4ea0b0a9946873e39941011db4c" +dependencies = [ + "anyhow", + "cargo_metadata", + "chrono", + "clap", + "dirs", +] + +[[package]] +name = "sp1-lib" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e166e94b13146c65de433cf29acc1030f021414fbebfc24cd4eeaeb787ba3443" +dependencies = [ + "bincode", + "elliptic-curve", + "serde", + "sp1-primitives", +] + +[[package]] +name = "sp1-primitives" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a85ffe9606bd2cc93575ce608f063ca08521cee9bdebf611914c5b2d90d7412" +dependencies = [ + "bincode", + "blake3", + "cfg-if", + "hex", + "lazy_static", + "num-bigint", + "p3-baby-bear", + "p3-field", + "p3-poseidon2", + "p3-symmetric", + "serde", + "sha2", +] + +[[package]] +name = "sp1-verifier" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d94a7db4a54984acf4d64c6ba55c4698104f02ef213cc21882e233b4409e7155" +dependencies = [ + "blake3", + "cfg-if", + "hex", + "lazy_static", + "sha2", + "sp1-build", + "substrate-bn-succinct", + "thiserror 2.0.12", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "substrate-bn-succinct" +version = "0.6.0-v4.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ac8ce0a40e721f790e2ef99beab32b99b3121c58edaaa140ffd8f1795a6af7" +dependencies = [ + "bytemuck", + "byteorder", + "cfg-if", + "crunchy", + "lazy_static", + "num-bigint", + "rand", + "rustc-hex", + "sp1-lib", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "zerocopy" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml new file mode 100644 index 00000000000..d730160aeaa --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml @@ -0,0 +1,16 @@ +[package] +edition = "2021" +name = "sp1" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +sp1-verifier = "4.1.3" + +[profile.release] +opt-level = 3 # "z" for size or "3" for speed +lto = true # Link Time Optimization +codegen-units = 1 # Single unit = better optimization +panic = "abort" # Smaller binary, faster execution diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs new file mode 100644 index 00000000000..f918e4f42df --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs @@ -0,0 +1,37 @@ +use sp1_verifier::Groth16Verifier; + +#[no_mangle] +pub fn sp1_groth16_verifier() -> bool { + let groth16_vk = *sp1_verifier::GROTH16_VK_BYTES; + + let proof: Vec = vec![ + 17, 182, 160, 157, 31, 189, 116, 200, 17, 224, 230, 34, 195, 108, 230, 185, 62, 91, 181, + 212, 80, 111, 197, 89, 247, 206, 99, 206, 147, 13, 216, 101, 252, 192, 149, 2, 40, 4, 249, + 44, 97, 227, 127, 36, 244, 18, 27, 75, 248, 3, 45, 11, 103, 45, 183, 204, 61, 217, 19, 208, + 66, 73, 202, 108, 136, 162, 221, 184, 6, 189, 49, 196, 104, 128, 151, 21, 104, 109, 145, + 150, 243, 51, 27, 243, 203, 75, 176, 59, 193, 51, 177, 64, 83, 13, 133, 140, 248, 242, 13, + 24, 12, 103, 126, 112, 244, 181, 129, 246, 52, 110, 134, 57, 149, 23, 163, 43, 202, 7, 164, + 233, 179, 160, 16, 5, 22, 45, 129, 76, 183, 76, 150, 139, 27, 224, 191, 59, 47, 105, 71, + 47, 8, 176, 157, 159, 234, 253, 239, 131, 138, 120, 101, 4, 98, 236, 106, 235, 98, 76, 93, + 220, 174, 153, 58, 216, 28, 141, 129, 191, 188, 40, 184, 225, 22, 61, 75, 139, 159, 162, + 117, 83, 214, 239, 1, 246, 236, 255, 64, 228, 116, 107, 206, 23, 59, 3, 221, 95, 14, 170, + 28, 171, 36, 179, 75, 101, 177, 40, 198, 12, 193, 82, 105, 155, 177, 62, 158, 72, 209, 252, + 51, 169, 109, 32, 121, 179, 194, 73, 164, 14, 8, 206, 181, 9, 5, 38, 74, 136, 97, 0, 89, + 80, 75, 88, 228, 94, 46, 196, 199, 83, 229, 11, 103, 115, 25, 31, 215, 137, 65, 159, 95, + 192, + ]; + + let sp1_public_values = vec![ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, + ]; + + let sp1_vkey_hash: String = + "0x00aea8e9c83c73d74036923de1b4a66d18547d58eee4eacfee70235ed291954c".to_string(); + + let _ = Groth16Verifier::verify(&proof, &sp1_public_values, &sp1_vkey_hash, groth16_vk); + + true +} diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock new file mode 100644 index 00000000000..f042837723f --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock @@ -0,0 +1,106 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "bitvec", + "rand_core", + "subtle", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zk_proof" +version = "0.0.1" +dependencies = [ + "bls12_381", + "group", +] diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml new file mode 100644 index 00000000000..3e556d43176 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml @@ -0,0 +1,19 @@ +[package] +edition = "2021" +name = "zk_proof" +version = "0.0.1" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +# bellman = "=0.14.0" +bls12_381 = "=0.8.0" +group = "0.13.0" + +[profile.release] +# opt-level = 3 # Optimize for time +opt-level = "z" # Optimize for size +lto = true # Enable Link Time Optimization +codegen-units = 1 +panic = "abort" # Remove unnecessary panic machinery diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs new file mode 100644 index 00000000000..4d44d8e3424 --- /dev/null +++ b/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs @@ -0,0 +1,254 @@ +use bls12_381::multi_miller_loop; +use bls12_381::Scalar; +use bls12_381::{G1Affine, G2Affine, G2Prepared}; +use group::prime::PrimeCurveAffine; +use group::Curve; + +use std::mem; +use std::os::raw::c_void; +// use std::time::{Instant}; + +// Groth16 proof struct +pub struct Proof { + pub a: G1Affine, + pub b: G2Affine, + pub c: G1Affine, +} + +// Groth16 verification key struct +pub struct VerifyingKey { + pub alpha_g1: G1Affine, + pub beta_g1: G1Affine, + pub beta_g2: G2Affine, + pub gamma_g2: G2Affine, + pub delta_g1: G1Affine, + pub delta_g2: G2Affine, + pub ic: Vec, +} + +#[no_mangle] +pub extern "C" fn allocate(size: usize) -> *mut c_void { + let mut buffer = Vec::with_capacity(size); + let pointer = buffer.as_mut_ptr(); + mem::forget(buffer); + pointer as *mut c_void + // } +} + +#[no_mangle] +fn deserialize_g1_wasm(buffer: &mut Vec) -> G1Affine { + let d_g1 = G1Affine::from_compressed(&buffer[0..48].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g1 +} + +fn deserialize_g2_wasm(buffer: &mut Vec) -> G2Affine { + let d_g2 = G2Affine::from_compressed(&buffer[0..96].try_into().unwrap()) + .expect("Failed to deserialize vk"); + + d_g2 +} + +#[no_mangle] +// pub extern fn bellman_groth16_test(pointer: *mut u8, capacity: usize) -> bool { +pub extern "C" fn bellman_groth16_test() -> bool { + // let mut bytes = Vec::new(); + // unsafe { + // // println!("Test in vm {:?}", pointer); + // let v = Vec::from_raw_parts(pointer, capacity, capacity); //TODO no need to deallocate?? + // bytes.extend_from_slice(&v); + // } + + // Hardcode the input bytes for testing in different WASM VMs + // let bytes = [172, 197, 81, 189, 121, 193, 159, 27, 92, 95, 151, 164, 40, 59, 214, 96, 132, 58, 87, 37, 169, 1, 63, 230, 35, 74, 245, 6, 185, 56, 120, 108, 214, 179, 187, 21, 36, 206, 43, 160, 10, 250, 249, 73, 210, 35, 137, 87, 177, 66, 65, 154, 11, 232, 137, 246, 125, 72, 227, 222, 116, 168, 87, 24, 165, 160, 132, 109, 108, 101, 222, 143, 78, 97, 48, 95, 59, 177, 29, 247, 219, 166, 73, 249, 69, 206, 15, 151, 30, 248, 235, 63, 148, 240, 17, 22, 150, 67, 252, 141, 95, 179, 94, 111, 207, 201, 192, 144, 154, 94, 21, 2, 22, 58, 96, 144, 227, 107, 107, 182, 142, 0, 57, 27, 168, 39, 226, 40, 163, 159, 112, 83, 196, 182, 215, 74, 92, 20, 158, 60, 23, 184, 198, 143, 17, 6, 242, 7, 75, 220, 87, 47, 224, 145, 99, 169, 203, 218, 112, 185, 51, 102, 59, 56, 171, 46, 49, 255, 116, 108, 241, 50, 180, 247, 62, 218, 181, 197, 155, 80, 61, 252, 8, 41, 232, 73, 51, 250, 223, 82, 94, 8, 185, 83, 223, 187, 6, 41, 20, 62, 189, 254, 11, 11, 58, 187, 200, 88, 53, 234, 98, 172, 213, 62, 22, 34, 90, 166, 182, 133, 8, 230, 103, 219, 233, 141, 10, 137, 210, 151, 4, 129, 29, 92, 103, 251, 72, 182, 162, 59, 20, 222, 188, 232, 13, 74, 214, 182, 172, 120, 33, 198, 57, 204, 134, 93, 26, 79, 213, 45, 146, 6, 128, 103, 63, 202, 226, 120, 141, 193, 248, 65, 196, 235, 21, 184, 104, 228, 206, 117, 190, 28, 153, 183, 68, 36, 63, 60, 131, 87, 137, 213, 105, 27, 110, 37, 238, 200, 250, 145, 76, 25, 57, 81, 69, 164, 208, 255, 49, 80, 14, 64, 181, 143, 12, 58, 35, 63, 199, 35, 70, 25, 86, 158, 210, 150, 59, 159, 253, 238, 174, 211, 142, 166, 223, 51, 134, 118, 171, 27, 218, 219, 117, 163, 71, 134, 95, 142, 83, 251, 240, 241, 162, 232, 93, 248, 167, 112, 197, 212, 169, 209, 159, 101, 140, 248, 222, 234, 201, 169, 76, 242, 7, 10, 192, 30, 151, 167, 74, 186, 97, 121, 144, 36, 6, 187, 92, 7, 248, 45, 134, 85, 240, 112, 74, 224, 70, 64, 198, 59, 26, 195, 192, 140, 101, 118, 175, 17, 160, 195, 142, 133, 1, 139, 5, 130, 245, 17, 73, 176, 232, 107, 130, 172, 110, 20, 190, 37, 108, 250, 178, 187, 151, 158, 35, 248, 246, 143, 38, 212, 133, 226, 24, 45, 33, 164, 46, 125, 200, 157, 253, 225, 132, 181, 60, 90, 7, 240, 80, 232, 97, 206, 164, 28, 12, 75, 68, 126, 230, 145, 216, 45, 180, 203, 19, 152, 29, 203, 9, 4, 145, 122, 206, 146, 179, 44, 145, 191, 126, 199, 175, 171, 127, 189, 222, 108, 126, 161, 80, 190, 47, 44, 8, 40, 65, 68, 95, 61, 109, 148, 175, 113, 226, 8, 93, 126, 53, 39, 192, 196, 6, 152, 194, 105, 169, 226, 192, 201, 184, 198, 134, 210, 153, 170, 12, 241, 90, 250, 233, 20, 152, 119, 142, 120, 83, 2, 164, 80, 178, 125, 227, 253, 207, 240, 201, 127, 213, 196, 100, 90, 65, 120, 50, 108, 175, 34, 192, 197, 173, 202, 176, 210, 131, 22, 216, 57, 169, 241, 28, 40, 44, 62, 11, 42, 50, 46, 204, 242, 109, 158, 114, 41, 127, 206, 25, 194, 255, 128, 245, 232, 193, 189, 229, 51, 93, 94, 64, 117, 33, 132, 75, 253, 114, 64, 116, 155, 183, 137, 112, 201, 243, 13, 221, 142, 164, 59, 98, 152, 249, 40, 133, 70, 185, 231, 249, 151, 253, 240, 122, 214, 60, 18, 132, 177, 37, 42, 75, 206, 12, 100, 214, 248, 234, 78, 165, 74, 212, 248, 32, 162, 254, 227, 218, 46, 9, 87, 0, 118, 13, 249, 107, 83, 5, 138, 223, 9, 247, 70, 160, 228, 197, 54, 87, 18, 1, 37, 199, 162, 84, 189, 161, 10, 26, 75, 45, 168, 185, 153, 245, 243, 51, 176, 208, 187, 235, 135, 239, 231, 42, 43, 233, 150, 46, 249, 73, 229, 138, 84, 89, 75, 129, 238, 211, 80, 147, 67, 159, 227, 214, 131, 188, 130, 70, 224, 1, 77, 139, 239, 185, 53, 68, 41, 193, 207, 16, 2, 33, 139, 214, 103, 240, 14, 141, 223, 24, 236, 50, 64, 79, 178, 6, 79, 38, 165, 35, 173, 203, 101, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + let bytes = [ + 147, 235, 138, 182, 249, 146, 149, 28, 58, 36, 144, 99, 188, 155, 153, 135, 239, 79, 76, + 109, 152, 156, 202, 1, 153, 84, 239, 184, 69, 145, 133, 48, 156, 80, 122, 227, 231, 161, + 137, 232, 67, 183, 34, 186, 230, 135, 25, 90, 136, 201, 110, 134, 208, 93, 78, 82, 153, + 239, 208, 236, 160, 231, 192, 150, 215, 128, 193, 255, 107, 39, 133, 12, 136, 148, 119, 17, + 59, 198, 100, 49, 37, 89, 132, 205, 45, 79, 151, 112, 247, 140, 94, 179, 215, 165, 52, 182, + 153, 68, 204, 210, 218, 156, 69, 74, 192, 30, 160, 13, 80, 188, 23, 112, 21, 124, 91, 147, + 21, 140, 217, 226, 248, 60, 182, 119, 18, 34, 32, 41, 181, 128, 165, 97, 168, 76, 98, 44, + 114, 122, 128, 215, 68, 156, 18, 91, 5, 33, 22, 141, 249, 137, 49, 252, 82, 122, 206, 58, + 183, 108, 176, 15, 38, 183, 87, 254, 34, 102, 195, 78, 166, 227, 96, 180, 137, 173, 131, + 178, 179, 25, 89, 159, 5, 73, 125, 24, 25, 86, 227, 19, 184, 117, 228, 173, 150, 1, 82, + 142, 48, 251, 236, 132, 73, 79, 201, 165, 192, 191, 195, 60, 100, 198, 251, 187, 161, 220, + 63, 143, 38, 21, 189, 219, 194, 100, 64, 186, 102, 7, 186, 213, 227, 92, 228, 52, 181, 171, + 223, 222, 218, 206, 221, 22, 15, 46, 77, 175, 34, 43, 221, 110, 21, 89, 149, 213, 68, 242, + 140, 185, 176, 73, 88, 216, 75, 237, 209, 10, 75, 251, 152, 101, 15, 146, 168, 27, 81, 8, + 61, 76, 103, 230, 171, 23, 144, 171, 6, 118, 157, 233, 234, 214, 132, 106, 30, 171, 121, + 77, 147, 175, 170, 62, 48, 251, 12, 221, 202, 109, 80, 97, 180, 27, 45, 87, 162, 19, 168, + 152, 27, 205, 113, 91, 83, 52, 99, 109, 17, 149, 189, 244, 174, 164, 192, 79, 133, 111, + 195, 215, 232, 129, 166, 204, 3, 169, 248, 49, 18, 190, 198, 145, 177, 169, 10, 4, 66, 134, + 46, 11, 163, 170, 94, 230, 234, 234, 43, 122, 51, 230, 100, 106, 149, 228, 208, 217, 87, + 231, 125, 170, 47, 143, 151, 45, 208, 64, 91, 10, 188, 136, 15, 155, 131, 200, 141, 243, + 200, 5, 109, 22, 98, 189, 193, 44, 40, 95, 126, 145, 234, 190, 205, 179, 172, 224, 147, + 253, 238, 162, 157, 60, 126, 9, 174, 34, 16, 161, 197, 60, 243, 211, 241, 78, 114, 51, 167, + 214, 53, 149, 172, 56, 149, 32, 66, 123, 48, 240, 179, 53, 154, 29, 134, 34, 141, 204, 168, + 184, 158, 165, 115, 241, 119, 228, 11, 35, 82, 186, 132, 103, 65, 243, 215, 31, 105, 201, + 191, 155, 210, 53, 194, 76, 63, 199, 181, 28, 138, 181, 181, 211, 145, 15, 139, 244, 38, + 56, 159, 161, 95, 46, 147, 141, 163, 221, 88, 167, 134, 73, 45, 70, 98, 98, 167, 55, 52, + 234, 110, 150, 79, 248, 157, 167, 84, 210, 89, 10, 193, 169, 32, 40, 218, 7, 236, 206, 85, + 178, 174, 157, 132, 181, 192, 119, 60, 205, 46, 217, 120, 97, 59, 82, 121, 11, 189, 21, + 213, 176, 255, 225, 57, 76, 239, 38, 99, 226, 55, 98, 227, 10, 45, 193, 69, 255, 247, 39, + 121, 86, 150, 6, 220, 98, 41, 132, 237, 189, 169, 110, 213, 115, 33, 228, 197, 61, 219, + 202, 58, 54, 70, 223, 179, 208, 139, 232, 103, 76, 165, 169, 68, 6, 148, 47, 244, 26, 203, + 186, 110, 69, 44, 175, 128, 119, 212, 188, 167, 223, 87, 119, 238, 199, 201, 61, 78, 96, + 175, 0, 156, 145, 196, 253, 162, 175, 172, 227, 80, 251, 96, 61, 189, 35, 13, 97, 22, 157, + 86, 249, 128, 148, 172, 66, 80, 172, 208, 222, 131, 0, 207, 80, 163, 27, 155, 113, 57, 186, + 246, 139, 111, 71, 117, 152, 184, 60, 1, 230, 44, 169, 213, 88, 82, 156, 194, 234, 41, 183, + 87, 36, 175, 154, 156, 128, 59, 187, 208, 101, 9, 51, 205, 42, 174, 29, 215, 43, 150, 183, + 129, 125, 2, 84, 210, 149, 245, 126, 140, 166, 255, 134, 116, 162, 107, 82, 178, 158, 38, + 11, 135, 91, 224, 157, 112, 189, 164, 250, 1, 215, 49, 21, 214, 211, 73, 243, 251, 58, 198, + 1, 165, 196, 122, 13, 238, 252, 227, 229, 149, 47, 13, 173, 171, 176, 185, 220, 82, 96, + 163, 4, 36, 199, 152, 88, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, + 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + // ***** Test deserialization and reconstruction of vk ***** + // let start_key_recons = Instant::now(); + // println!("Start verification key reconstruction"); + + // alpha_g1 + let mut vec_alpha_g1 = bytes[0..48].to_vec(); + let r_alpha_g1 = deserialize_g1_wasm(&mut vec_alpha_g1); + + // beta_g1 + let mut vec_beta_g1 = bytes[48..96].to_vec(); + let r_beta_g1 = deserialize_g1_wasm(&mut vec_beta_g1); + + // beta_g2 + let mut vec_beta_g2 = bytes[96..192].to_vec(); + let r_beta_g2 = deserialize_g2_wasm(&mut vec_beta_g2); + + // gamma_g2 + let mut vec_gamma_g2 = bytes[192..288].to_vec(); + let r_gamma_g2 = deserialize_g2_wasm(&mut vec_gamma_g2); + + // delta_g1 + let mut vec_delta_g1 = bytes[288..336].to_vec(); + let r_delta_g1 = deserialize_g1_wasm(&mut vec_delta_g1); + + // delta_g2 + let mut vec_delta_g2 = bytes[336..432].to_vec(); + let r_delta_g2 = deserialize_g2_wasm(&mut vec_delta_g2); + + // ic + let vec_ic = bytes[432..576].to_vec(); + // println!("\nic vector: {:?}", vec_ic); + let mut r_ic: Vec = Vec::new(); + let mut vec_ic_de = vec_ic[0..48].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[48..96].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + vec_ic_de = vec_ic[96..144].to_vec(); + r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); + + // Reconstruct vk + // replace following if using bellman::{groth16, groth16::Proof}; + // let deserialized_vk = groth16::VerifyingKey:: { + let deserialized_vk = VerifyingKey { + alpha_g1: r_alpha_g1, + beta_g1: r_beta_g1, + beta_g2: r_beta_g2, + gamma_g2: r_gamma_g2, + delta_g1: r_delta_g1, + delta_g2: r_delta_g2, + ic: r_ic, + }; + + // Uncomment following if using bellman::{groth16, groth16::Proof}; + // let pvk = groth16::prepare_verifying_key(&deserialized_vk); + // println!("Key reconstruction time: {:?}", start_key_recons.elapsed()); + + // ***** Reconstruct proof ***** + // let start_proof_recons = Instant::now(); + + // proof.g1 + let r_a = G1Affine::from_compressed(&bytes[576..624].try_into().unwrap()) + .expect("Failed to deserialize a"); + // proof.g2 + let r_b = G2Affine::from_compressed(&bytes[624..720].try_into().unwrap()) + .expect("Failed to deserialize b"); + // proof.g1 + let r_c = G1Affine::from_compressed(&bytes[720..768].try_into().unwrap()) + .expect("Failed to deserialize c"); + + // Replace following if using bellman::{groth16, groth16::Proof}; + // let r_proof: Proof = Proof{a: r_a, b: r_b, c: r_c}; + let r_proof: Proof = Proof { + a: r_a, + b: r_b, + c: r_c, + }; + // println!("Proof reconstruction time: {:?}", start_proof_recons.elapsed()); + + // ***** Reconstruct input ***** + // let start_input_recons = Instant::now(); + + let last_64_bytes = &bytes[bytes.len() - 64..]; + + let r_inputs: Vec = last_64_bytes + .chunks(32) // Each Scalar in bls12_381 uses 32 bytes + .map(|chunk| { + Scalar::from_bytes(chunk.try_into().unwrap()).expect("Invalid bytes for Scalar") + }) + .collect(); + + // println!("Input reconstruction time: {:?}", start_input_recons.elapsed()); + + /***** proof verification *****/ + // uncomment following if bellman groth16 is used + // assert!(groth16::verify_proof(&pvk, &r_proof, &r_inputs).is_ok()); + // let start_verify = Instant::now(); + + // Ensure the number of inputs matches the vk.ic length minus 1 (for IC[0]) + if (r_inputs.len() + 1) != deserialized_vk.ic.len() { + return false; + } + + /***** Compute linear combination: input_acc = IC[0] + sum(input[i] * IC[i+1]) *****/ + let mut acc = deserialized_vk.ic[0].to_curve(); // Convert G1Affine to G1Projective + + // Computes multi-scalar multiplication, + // which is a weighted sum of elliptic curve points. + // In Groth16, this builds the point: + // acc = IC₀ + input₁ × IC₁ + input₂ × IC₂ + ... + inputₙ × ICₙ + // Where: ICᵢ are fixed elliptic curve points (from the verifying key). + // inputᵢ are the public inputs to the circuit. + // Example: public_inputs = [x₁, x₂], vk.ic = [IC₀, IC₁, IC₂], acc = IC₀ + x₁ * IC₁ + x₂ * IC₂ + // This binds the public inputs to the proof + for (input, ic_point) in r_inputs.iter().zip(&deserialized_vk.ic[1..]) { + acc += ic_point.to_curve() * input; + } + + let acc_affine = acc.to_affine(); // converts the point acc from projective form back to affine form. + + // Preparing G2 elements for pairing by converting them into G2Prepared format. + let proof_b_prepared = G2Prepared::from(r_proof.b); + let gamma_g2_prepared = G2Prepared::from(deserialized_vk.gamma_g2); + let delta_g2_prepared = G2Prepared::from(deserialized_vk.delta_g2); + let beta_g2_prepared = G2Prepared::from(deserialized_vk.beta_g2); + + // Compute required product of pairings in their Miller loop form + // Groth16 verifier checks if e(A, B) * e(acc, γ)⁻¹ * e(C, δ)⁻¹ * e(α, β)⁻¹ == 1 + // which boils down to + // let start_miller = Instant::now(); + let ml_result = multi_miller_loop(&[ + (&r_proof.a, &proof_b_prepared), // e(A,B) + (&(-acc_affine), &gamma_g2_prepared), // e(acc, γ)⁻¹ + (&(-r_proof.c), &delta_g2_prepared), // e(C, δ)⁻¹ + (&(-deserialized_vk.alpha_g1), &beta_g2_prepared), //e(α, β)⁻¹ + ]); + // println!("Miller time: {:?}", start_miller.elapsed()); + + // let start_final = Instant::now(); + let result = ml_result.final_exponentiation(); + // println!("Final time: {:?}", start_final.elapsed()); + // println!("Proof verification time: {:?}", start_verify.elapsed()); + + // true + result == bls12_381::Gt::identity() +} From 51a9f106d1359b710ad44208cda8da0514f0fb69 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 14:59:09 -0400 Subject: [PATCH 066/212] CODEOWNERS --- .github/CODEOWNERS | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index bc4fe2febde..24620f8d7ca 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,8 +1,2 @@ # Allow anyone to review any change by default. * - -# Require the rpc-reviewers team to review changes to the rpc code. -include/xrpl/protocol/ @xrplf/rpc-reviewers -src/libxrpl/protocol/ @xrplf/rpc-reviewers -src/xrpld/rpc/ @xrplf/rpc-reviewers -src/xrpld/app/misc/ @xrplf/rpc-reviewers From f03c3aafe425cdb1aa872e3b94852d2b3f41a1d8 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 15:02:48 -0400 Subject: [PATCH 067/212] misc host function files --- include/xrpl/basics/Number.h | 4 + src/libxrpl/basics/Number.cpp | 42 + src/libxrpl/protocol/IOUAmount.cpp | 10 +- src/test/app/HostFuncImpl_test.cpp | 2983 ++++++++++++++++++++++++++++ src/test/app/TestHostFunctions.h | 1049 ++++++++++ 5 files changed, 4080 insertions(+), 8 deletions(-) create mode 100644 src/test/app/HostFuncImpl_test.cpp create mode 100644 src/test/app/TestHostFunctions.h diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index 41c60d30a13..71deda889dc 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -360,6 +360,10 @@ abs(Number x) noexcept Number power(Number const& f, unsigned n); +// logarithm with base 10 +Number +lg(Number const& value); + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the root of the polynomial g(x) = x^d - f diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index f43288b57b1..50583cc2909 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -623,6 +623,48 @@ power(Number const& f, unsigned n) return r; } +// Continued fraction approximation of ln(x) +static Number +ln(Number const& x, unsigned iterations = 50) +{ + if (x <= 0) + throw std::runtime_error("Not positive value"); + + Number const z = (x - 1) / (x + 1); + Number const zz = z * z; + Number denom = Number(1, -10); + + // Construct the fraction from the bottom up + for (int i = iterations; i > 0; --i) + { + Number k(2 * i - 1); + denom = k - (i * i * zz / denom); + } + + auto const r = 2 * z / denom; + return r; +} + +Number +lg(Number const& x) +{ + static Number const ln10 = ln(Number(10)); + + if (x <= Number(10)) + { + auto const r = ln(x) / ln10; + return r; + } + + // ln(x) = ln(normX * 10^norm) = ln(normX) + norm * ln(10) + int diffExp = 15 + x.exponent(); + Number const normalX = x / Number(1, diffExp); // (1 <= normalX < 10) + auto const lnX = ln(normalX) + diffExp * ln10; + + auto const r = lnX / ln10; + return r; +} + // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing // to find the non-negative root of the polynomial g(x) = x^d - f diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 9bd1ceb5eb3..b4f3f18e2e1 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -58,13 +58,6 @@ setSTNumberSwitchover(bool v) *getStaticSTNumberSwitchover() = v; } -/* The range for the mantissa when normalized */ -static std::int64_t constexpr minMantissa = 1000000000000000ull; -static std::int64_t constexpr maxMantissa = 9999999999999999ull; -/* The range for the exponent when normalized */ -static int constexpr minExponent = -96; -static int constexpr maxExponent = 80; - IOUAmount IOUAmount::minPositiveAmount() { @@ -312,7 +305,8 @@ mulRatio( { if (!result) { - return IOUAmount(-minMantissa, minExponent); + return IOUAmount( + -IOUAmount::minMantissa, IOUAmount::minExponent); } // This subtraction cannot underflow because `result` is not zero return IOUAmount(result.mantissa() - 1, result.exponent()); diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp new file mode 100644 index 00000000000..a198ba4af44 --- /dev/null +++ b/src/test/app/HostFuncImpl_test.cpp @@ -0,0 +1,2983 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include + +#include + +namespace ripple { +namespace test { + +static Bytes +toBytes(std::uint8_t value) +{ + return {value}; +} + +static Bytes +toBytes(std::uint16_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(std::uint32_t value) +{ + auto const* b = reinterpret_cast(&value); + auto const* e = reinterpret_cast(&value + 1); + return Bytes{b, e}; +} + +static Bytes +toBytes(Asset const& asset) +{ + if (asset.holds()) + { + Serializer s; + auto const& issue = asset.get(); + s.addBitString(issue.currency); + if (!isXRP(issue.currency)) + s.addBitString(issue.account); + auto const data = s.getData(); + return data; + } + + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; +} + +static Bytes +toBytes(STAmount const& amount) +{ + Serializer msg; + amount.add(msg); + auto const data = msg.getData(); + + return data; +} + +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +{ + ApplyContext ac{ + env.app(), + ov, + tx, + tesSUCCESS, + env.current()->fees().base, + tapNONE, + env.journal}; + return ac; +} + +struct HostFuncImpl_test : public beast::unit_test::suite +{ + void + testGetLedgerSqn() + { + testcase("getLedgerSqn"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerSqn(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().seq); + } + + void + testGetParentLedgerTime() + { + testcase("getParentLedgerTime"); + using namespace test::jtx; + + Env env{*this}; + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + env.current() + ->parentCloseTime() + .time_since_epoch() + .count()); + } + + env.close( + env.now() + + std::chrono::seconds(std::numeric_limits::max() - 1)); + { + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const result = hfs.getParentLedgerTime(); + if (BEAST_EXPECTS( + !result.has_value(), std::to_string(result.value()))) + BEAST_EXPECT(result.error() == HostFunctionError::INTERNAL); + } + } + + void + testGetParentLedgerHash() + { + testcase("getParentLedgerHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getParentLedgerHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().parentHash); + } + + void + testGetLedgerAccountHash() + { + testcase("getLedgerAccountHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerAccountHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().accountHash); + } + + void + testGetLedgerTransactionHash() + { + testcase("getLedgerTransactionHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getLedgerTransactionHash(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->info().txHash); + } + + void + testGetBaseFee() + { + testcase("getBaseFee"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getBaseFee(); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); + + { + Env env2( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.reference_fee = + static_cast( + std::numeric_limits::max()) + + 1; + return cfg; + }), + testable_amendments()); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + OpenView ov2{*env2.current()}; + ApplyContext ac2 = createApplyContext(env2, ov2); + WasmHostFunctionsImpl hfs2(ac2, dummyEscrow); + auto const result2 = hfs2.getBaseFee(); + if (BEAST_EXPECT(!result2.has_value())) + BEAST_EXPECT(result2.error() == HostFunctionError::INTERNAL); + } + } + + void + testIsAmendmentEnabled() + { + testcase("isAmendmentEnabled"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Use featureSmartEscrow for testing + auto const amendmentId = featureSmartEscrow; + + // Test by id + { + auto const result = hfs.isAmendmentEnabled(amendmentId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test by name + std::string const amendmentName = "SmartEscrow"; + { + auto const result = hfs.isAmendmentEnabled(amendmentName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Test with a fake amendment id (all zeros) + uint256 fakeId; + { + auto const result = hfs.isAmendmentEnabled(fakeId); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Test with a fake amendment name + std::string fakeName = "FakeAmendment"; + { + auto const result = hfs.isAmendmentEnabled(fakeName); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + + void + testCacheLedgerObj() + { + testcase("cacheLedgerObj"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = keylet::escrow(env.master, 2); + auto const accountKeylet = keylet::account(env.master); + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, -1).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 257).error() == + HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT( + hfs.cacheLedgerObj(dummyEscrow.key, 0).error() == + HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).value() == 1); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, i); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + for (int i = 1; i <= 256; ++i) + { + auto const result = hfs.cacheLedgerObj(accountKeylet.key, 0); + BEAST_EXPECT(result.has_value() && result.value() == i); + } + BEAST_EXPECT( + hfs.cacheLedgerObj(accountKeylet.key, 0).error() == + HostFunctionError::SLOTS_FULL); + } + } + + void + testGetTxField() + { + testcase("getTxField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setAccountID(sfOwner, env.master.id()); + obj.setFieldU32(sfOfferSequence, env.seq(env.master)); + obj.setFieldU32(sfComputationAllowance, 1000); + obj.setFieldArray(sfMemos, STArray{}); + }); + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + { + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const account = hfs.getTxField(sfAccount); + BEAST_EXPECT( + account && std::ranges::equal(*account, env.master.id())); + + auto const owner = hfs.getTxField(sfOwner); + BEAST_EXPECT(owner && std::ranges::equal(*owner, env.master.id())); + + auto const txType = hfs.getTxField(sfTransactionType); + BEAST_EXPECT(txType && *txType == toBytes(ttESCROW_FINISH)); + + auto const offerSeq = hfs.getTxField(sfOfferSequence); + BEAST_EXPECT(offerSeq && *offerSeq == toBytes(env.seq(env.master))); + + auto const compAllowance = hfs.getTxField(sfComputationAllowance); + std::uint32_t const expectedAllowance = 1000; + BEAST_EXPECT( + compAllowance && *compAllowance == toBytes(expectedAllowance)); + + auto const notPresent = hfs.getTxField(sfDestination); + if (BEAST_EXPECT(!notPresent.has_value())) + BEAST_EXPECT( + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const memos = hfs.getTxField(sfMemos); + if (BEAST_EXPECT(!memos.has_value())) + BEAST_EXPECT( + memos.error() == HostFunctionError::NOT_LEAF_FIELD); + + auto const nonField = hfs.getTxField(sfInvalid); + if (BEAST_EXPECT(!nonField.has_value())) + BEAST_EXPECT( + nonField.error() == HostFunctionError::FIELD_NOT_FOUND); + + auto const nonField2 = hfs.getTxField(sfGeneric); + if (BEAST_EXPECT(!nonField2.has_value())) + BEAST_EXPECT( + nonField2.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + { + auto const iouAsset = env.master["USD"]; + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, xrpIssue()}); + obj.setFieldIssue( + sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + std::vector expectedAsset(20, 0); + BEAST_EXPECT(asset && *asset == expectedAsset); + + auto const asset2 = hfs.getTxField(sfAsset2); + BEAST_EXPECT(asset2 && *asset2 == toBytes(Asset(iouAsset))); + } + + { + auto const iouAsset = env.master["GBP"]; + auto const mptId = makeMptID(1, env.master); + STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldIssue(sfAsset, STIssue{sfAsset, iouAsset.issue()}); + obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, MPTIssue{mptId}}); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const asset = hfs.getTxField(sfAsset); + if (BEAST_EXPECT(asset.has_value())) + { + BEAST_EXPECT(*asset == toBytes(Asset(iouAsset))); + } + + auto const asset2 = hfs.getTxField(sfAsset2); + if (BEAST_EXPECT(asset2.has_value())) + { + BEAST_EXPECT(*asset2 == toBytes(Asset(mptId))); + } + } + + { + std::uint8_t const expectedScale = 8; + STTx const stx2 = STTx(ttMPTOKEN_ISSUANCE_CREATE, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + obj.setFieldU8(sfAssetScale, expectedScale); + }); + ApplyContext ac2 = createApplyContext(env, ov, stx2); + WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + + auto const actualScale = hfs.getTxField(sfAssetScale); + if (BEAST_EXPECT(actualScale.has_value())) + { + BEAST_EXPECT( + std::ranges::equal(*actualScale, toBytes(expectedScale))); + } + } + } + + void + testGetCurrentLedgerObjField() + { + testcase("getCurrentLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the escrow ledger object + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + BEAST_EXPECT(env.le(escrowKeylet)); + + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should return the Account field from the escrow ledger object + auto const account = hfs.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); + + // Should return the Amount field from the escrow ledger object + auto const amountField = hfs.getCurrentLedgerObjField(sfAmount); + if (BEAST_EXPECT(amountField.has_value())) + { + BEAST_EXPECT(*amountField == toBytes(XRP(100))); + } + + // Should return nullopt for a field not present + auto const notPresent = hfs.getCurrentLedgerObjField(sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl hfs2(ac, dummyEscrow); + auto const account = hfs2.getCurrentLedgerObjField(sfAccount); + if (BEAST_EXPECT(!account.has_value())) + { + BEAST_EXPECT( + account.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + } + + void + testGetLedgerObjField() + { + testcase("getLedgerObjField"); + using namespace test::jtx; + using namespace std::chrono; + + Env env{*this}; + // Fund the account and create an escrow so the ledger object exists + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + 1s)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const accountKeylet = keylet::account(env.master.id()); + auto const escrowKeylet = + keylet::escrow(env.master.id(), env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Cache the escrow ledger object in slot 1 + auto cacheResult = hfs.cacheLedgerObj(accountKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Should return the Account field from the cached ledger object + auto const account = hfs.getLedgerObjField(1, sfAccount); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); + + // Should return the Balance field from the cached ledger object + auto const balanceField = hfs.getLedgerObjField(1, sfBalance); + if (BEAST_EXPECT(balanceField.has_value())) + { + BEAST_EXPECT(*balanceField == toBytes(env.balance(env.master))); + } + + // Should return error for slot out of range + auto const outOfRange = hfs.getLedgerObjField(0, sfAccount); + BEAST_EXPECT( + !outOfRange.has_value() && + outOfRange.error() == HostFunctionError::SLOT_OUT_RANGE); + + auto const tooHigh = hfs.getLedgerObjField(257, sfAccount); + BEAST_EXPECT( + !tooHigh.has_value() && + tooHigh.error() == HostFunctionError::SLOT_OUT_RANGE); + + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjField(2, sfAccount); + BEAST_EXPECT( + !emptySlot.has_value() && + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + + // Should return error for field not present + auto const notPresent = hfs.getLedgerObjField(1, sfOwner); + BEAST_EXPECT( + !notPresent.has_value() && + notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetTxNestedField() + { + testcase("getTxNestedField"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Create a transaction with a nested array field + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + // Locator for sfMemos[0].sfMemo.sfMemoData + // Locator is a sequence of int32_t codes: + // [sfMemos.fieldCode, 0, sfMemoData.fieldCode] + std::vector locatorVec = { + sfMemos.fieldCode, 0, sfMemoData.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + std::string memoData( + result.value().begin(), result.value().end()); + BEAST_EXPECT(memoData == "hello"); + } + } + + { + // can use the nested locator for base fields too + std::vector locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const account = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + { + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); + } + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent index + expectError( + {sfMemos.fieldCode, + 1, // index 1 does not exist + sfMemoData.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Locator for non-existent nested field + expectError( + {sfMemos.fieldCode, + 0, + sfURI.fieldCode}, // sfURI does not exist in the memo + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for non-existent base sfield + expectError( + {field_code(20000, 20000), // nonexistent SField code + 0, + sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Locator for non-existent nested sfield + expectError( + {sfMemos.fieldCode, // nonexistent SField code + 0, + field_code(20000, 20000)}, + HostFunctionError::INVALID_FIELD); + + // Locator for STArray + expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Locator for nesting into non-array/object field + expectError( + {sfAccount.fieldCode, // sfAccount is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(locatorVec.data()), 3); + auto const malformedResult = hfs.getTxNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == + HostFunctionError::LOCATOR_MALFORMED); + } + } + + void + testGetCurrentLedgerObjNestedField() + { + testcase("getCurrentLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + // Find the signer ledger object + auto const signerKeylet = keylet::signers(env.master.id()); + BEAST_EXPECT(env.le(signerKeylet)); + + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Locator for base field + std::vector baseLocator = {sfSignerQuorum.fieldCode}; + Slice baseLocatorSlice( + reinterpret_cast(baseLocator.data()), + baseLocator.size() * sizeof(int32_t)); + auto const signerQuorum = + hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); + if (BEAST_EXPECTS( + signerQuorum.has_value(), + std::to_string(static_cast(signerQuorum.error())))) + { + BEAST_EXPECT(*signerQuorum == toBytes(static_cast(2))); + } + + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError) { + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + // Locator for non-existent base field + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + // Locator for nesting into non-array/object field + expectError( + {sfSignerQuorum + .fieldCode, // sfSignerQuorum is not an array or object + 0, + sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Locator for empty locator + Slice emptyLocator(nullptr, 0); + auto const emptyResult = + hfs.getCurrentLedgerObjNestedField(emptyLocator); + BEAST_EXPECT( + !emptyResult.has_value() && + emptyResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Locator for malformed locator (not multiple of 4) + std::vector malformedLocatorVec = {sfMemos.fieldCode}; + Slice malformedLocator( + reinterpret_cast(malformedLocatorVec.data()), 3); + auto const malformedResult = + hfs.getCurrentLedgerObjNestedField(malformedLocator); + BEAST_EXPECT( + !malformedResult.has_value() && + malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector const locatorVec = {sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedField(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedField() + { + testcase("getLedgerObjNestedField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Cache the SignerList ledger object in slot 1 + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries[0].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + BEAST_EXPECT(std::ranges::equal(*result, alice.id())); + } + } + + // Locator for sfSignerEntries[1].sfAccount + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 1, sfAccount.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result2 = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + result2.has_value(), + std::to_string(static_cast(result2.error())))) + { + BEAST_EXPECT(std::ranges::equal(*result2, becky.id())); + } + } + + // Locator for sfSignerEntries[0].sfSignerWeight + { + std::vector const locatorVec = { + sfSignerEntries.fieldCode, 0, sfSignerWeight.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const weightResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + weightResult.has_value(), + std::to_string(static_cast(weightResult.error())))) + { + // Should be 1 + auto const expected = toBytes(static_cast(1)); + BEAST_EXPECT(*weightResult == expected); + } + } + + // Locator for base field sfSignerQuorum + { + std::vector const locatorVec = {sfSignerQuorum.fieldCode}; + Slice const locator = Slice( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const quorumResult = hfs.getLedgerObjNestedField(1, locator); + if (BEAST_EXPECTS( + quorumResult.has_value(), + std::to_string(static_cast(quorumResult.error())))) + { + auto const expected = toBytes(static_cast(2)); + BEAST_EXPECT(*quorumResult == expected); + } + } + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedField(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: base field not found + expectError( + {sfSigners.fieldCode, // sfSigners does not exist + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: index out of bounds + expectError( + {sfSignerEntries.fieldCode, + 2, // index 2 does not exist + sfAccount.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Error: nested field not found + expectError( + { + sfSignerEntries.fieldCode, + 0, + sfDestination.fieldCode // sfDestination does not exist + }, + HostFunctionError::FIELD_NOT_FOUND); + + // Error: invalid field code + expectError( + {field_code(99999, 99999), 0, sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Error: invalid nested field code + expectError( + {sfSignerEntries.fieldCode, 0, field_code(99999, 99999)}, + HostFunctionError::INVALID_FIELD); + + // Error: slot out of range + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Error: empty slot + expectError( + {sfSignerQuorum.fieldCode}, HostFunctionError::EMPTY_SLOT, 2); + + // Error: locator for STArray (not leaf field) + expectError( + {sfSignerEntries.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + + // Error: nesting into non-array/object field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + std::vector const locatorVec = {sfSignerEntries.fieldCode}; + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), 3); + auto const malformed = hfs.getLedgerObjNestedField(1, locator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + } + + void + testGetTxArrayLen() + { + testcase("getTxArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + // Transaction with an array field + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + obj.setAccountID(sfAccount, env.master.id()); + STArray memos; + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + } + { + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("world", 5)); + memos.push_back(memoObj); + } + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should return 1 for sfMemos + auto const memosLen = hfs.getTxArrayLen(sfMemos); + if (BEAST_EXPECT(memosLen.has_value())) + BEAST_EXPECT(memosLen.value() == 2); + + // Should return error for non-array field + auto const notArray = hfs.getTxArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + // Should return error for missing array field + auto const missingArray = hfs.getTxArrayLen(sfSigners); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjArrayLen() + { + testcase("getCurrentLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + auto const entriesLen = + hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); + if (BEAST_EXPECT(entriesLen.has_value())) + BEAST_EXPECT(entriesLen.value() == 2); + + auto const arrLen = hfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT(arrLen.error() == HostFunctionError::FIELD_NOT_FOUND); + + // Should return NO_ARRAY for non-array field + auto const notArray = hfs.getCurrentLedgerObjArrayLen(sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + auto const len = dummyHfs.getCurrentLedgerObjArrayLen(sfMemos); + if (BEAST_EXPECT(!len.has_value())) + BEAST_EXPECT( + len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + } + + void + testGetLedgerObjArrayLen() + { + testcase("getLedgerObjArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + { + auto const arrLen = hfs.getLedgerObjArrayLen(1, sfSignerEntries); + if (BEAST_EXPECT(arrLen.has_value())) + // Should return 2 for sfSignerEntries + BEAST_EXPECT(arrLen.value() == 2); + } + { + auto const arrLen = hfs.getLedgerObjArrayLen(0, sfSignerEntries); + if (BEAST_EXPECT(!arrLen.has_value())) + BEAST_EXPECT( + arrLen.error() == HostFunctionError::SLOT_OUT_RANGE); + } + + { + // Should return error for non-array field + auto const notArray = hfs.getLedgerObjArrayLen(1, sfAccount); + if (BEAST_EXPECT(!notArray.has_value())) + BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); + } + + { + // Should return error for empty slot + auto const emptySlot = hfs.getLedgerObjArrayLen(2, sfSignerEntries); + if (BEAST_EXPECT(!emptySlot.has_value())) + BEAST_EXPECT( + emptySlot.error() == HostFunctionError::EMPTY_SLOT); + } + + { + // Should return error for missing array field + auto const missingArray = hfs.getLedgerObjArrayLen(1, sfMemos); + if (BEAST_EXPECT(!missingArray.has_value())) + BEAST_EXPECT( + missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetTxNestedArrayLen() + { + testcase("getTxNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + + STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + STArray memos; + STObject memoObj(sfMemo); + memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); + memos.push_back(memoObj); + obj.setFieldArray(sfMemos, memos); + }); + + ApplyContext ac = createApplyContext(env, ov, stx); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getTxNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfMemos + { + std::vector locatorVec = {sfMemos.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getTxNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 1); + } + + // Error: non-array field + expectError({sfAccount.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + } + + void + testGetCurrentLedgerObjNestedArrayLen() + { + testcase("getCurrentLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + // Create a SignerList for env.master + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const signerKeylet = keylet::signers(env.master.id()); + WasmHostFunctionsImpl hfs(ac, signerKeylet); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Locator for sfSignerEntries + { + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getCurrentLedgerObjNestedArrayLen(locator); + BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 2); + } + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + { + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master) + 5); + WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + std::vector locatorVec = {sfAccount.fieldCode}; + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = + dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, + std::to_string(static_cast(result.error()))); + } + } + + void + testGetLedgerObjNestedArrayLen() + { + testcase("getLedgerObjNestedArrayLen"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const becky("becky"); + env(signers(env.master, 2, {{alice, 1}, {becky, 1}})); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const signerListKeylet = keylet::signers(env.master.id()); + auto cacheResult = hfs.cacheLedgerObj(signerListKeylet.key, 1); + BEAST_EXPECT(cacheResult.has_value() && cacheResult.value() == 1); + + // Locator for sfSignerEntries + std::vector locatorVec = {sfSignerEntries.fieldCode}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const arrLen = hfs.getLedgerObjNestedArrayLen(1, locator); + if (BEAST_EXPECT(arrLen.has_value())) + BEAST_EXPECT(arrLen.value() == 2); + + // Helper for error checks + auto expectError = [&](std::vector const& locatorVec, + HostFunctionError expectedError, + int slot = 1) { + Slice const locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + auto const result = hfs.getLedgerObjNestedArrayLen(slot, locator); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECTS( + result.error() == expectedError, + std::to_string(static_cast(result.error()))); + }; + + // Error: non-array field + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::NO_ARRAY); + + // Error: missing field + expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); + + // Slot out of range + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError(locatorVec, HostFunctionError::SLOT_OUT_RANGE, 257); + + // Empty slot + expectError(locatorVec, HostFunctionError::EMPTY_SLOT, 2); + + // Error: empty locator + expectError({}, HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator malformed (not multiple of 4) + Slice malformedLocator( + reinterpret_cast(locator.data()), 3); + auto const malformed = + hfs.getLedgerObjNestedArrayLen(1, malformedLocator); + BEAST_EXPECT( + !malformed.has_value() && + malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + + // Error: locator for non-STArray field + expectError( + {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, + HostFunctionError::LOCATOR_MALFORMED); + } + + void + testUpdateData() + { + testcase("updateData"); + using namespace test::jtx; + + Env env{*this}; + env(escrow::create(env.master, env.master, XRP(100)), + escrow::finish_time(env.now() + std::chrono::seconds(1))); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const escrowKeylet = + keylet::escrow(env.master, env.seq(env.master) - 1); + WasmHostFunctionsImpl hfs(ac, escrowKeylet); + + // Should succeed for small data + std::vector data(10, 0x42); + auto const result = hfs.updateData(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value() && result.value() == 0); + + // Should fail for too large data + std::vector bigData( + 1024 * 1024 + 1, 0x42); // > maxWasmDataLength + auto const tooBig = + hfs.updateData(Slice(bigData.data(), bigData.size())); + if (BEAST_EXPECT(!tooBig.has_value())) + BEAST_EXPECT( + tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + void + testCheckSignature() + { + testcase("checkSignature"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Generate a keypair and sign a message + auto const kp = generateKeyPair(KeyType::secp256k1, randomSeed()); + PublicKey const& pk = kp.first; + SecretKey const& sk = kp.second; + std::string const& message = "hello signature"; + auto const sig = sign(pk, sk, Slice(message.data(), message.size())); + + // Should succeed for valid signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 1); + } + + // Should fail for invalid signature + { + std::string badSig(sig.size(), 0xFF); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(badSig.data(), badSig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for invalid public key + { + std::string badPk(pk.size(), 0x00); + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(badPk.data(), badPk.size())); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty public key + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(sig.data(), sig.size()), + Slice(nullptr, 0)); + BEAST_EXPECT(!result.has_value()); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for empty signature + { + auto const result = hfs.checkSignature( + Slice(message.data(), message.size()), + Slice(nullptr, 0), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + + // Should fail for empty message + { + auto const result = hfs.checkSignature( + Slice(nullptr, 0), + Slice(sig.data(), sig.size()), + Slice(pk.data(), pk.size())); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == 0); + } + } + + void + testComputeSha512HalfHash() + { + testcase("computeSha512HalfHash"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string data = "hello world"; + auto const result = + hfs.computeSha512HalfHash(Slice(data.data(), data.size())); + BEAST_EXPECT(result.has_value()); + + // Should match direct call to sha512Half + auto expected = sha512Half(Slice(data.data(), data.size())); + BEAST_EXPECT(result.value() == expected); + } + + void + testKeyletFunctions() + { + testcase("keylet functions"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto compareKeylet = [](std::vector const& bytes, + Keylet const& kl) { + return std::ranges::equal(bytes, kl.key); + }; +// Lambda to compare a Bytes (std::vector) to a keylet +#define COMPARE_KEYLET(hfsFunc, keyletFunc, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + auto expected = keyletFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(actual.has_value())) \ + { \ + BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ + } \ + } +#define COMPARE_KEYLET_FAIL(hfsFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS( \ + actual.error() == expected, \ + std::to_string(HfErrorToInt(actual.error()))); \ + } \ + } + + COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); + COMPARE_KEYLET_FAIL( + accountKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET( + ammKeylet, keylet::amm, xrpIssue(), env.master["USD"].issue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + xrpIssue(), + xrpIssue()); + COMPARE_KEYLET_FAIL( + ammKeylet, + HostFunctionError::INVALID_PARAMS, + makeMptID(1, env.master.id()), + xrpIssue()); + + COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + checkKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + std::string const credType = "test"; + COMPARE_KEYLET( + credentialKeylet, + keylet::credential, + env.master.id(), + env.master.id(), + Slice(credType.data(), credType.size())); + + Account const alice("alice"); + constexpr std::string_view longCredType = + "abcdefghijklmnopqrstuvwxyz01234567890qwertyuiop[]" + "asdfghjkl;'zxcvbnm8237tr28weufwldebvfv8734t07p"; + static_assert(longCredType.size() > maxCredentialTypeLength); + COMPARE_KEYLET_FAIL( + credentialKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + Slice(longCredType.data(), longCredType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + alice.id(), + Slice(credType.data(), credType.size())); + COMPARE_KEYLET_FAIL( + credentialKeylet, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + Slice(credType.data(), credType.size())); + + COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); + COMPARE_KEYLET_FAIL( + didKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET( + delegateKeylet, keylet::delegate, env.master.id(), alice.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + delegateKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + COMPARE_KEYLET( + depositPreauthKeylet, + keylet::depositPreauth, + env.master.id(), + alice.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount()); + COMPARE_KEYLET_FAIL( + depositPreauthKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id()); + + COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + Currency usd = to_currency("USD"); + COMPARE_KEYLET( + lineKeylet, keylet::line, env.master.id(), alice.id(), usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + usd); + COMPARE_KEYLET_FAIL( + lineKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + alice.id(), + to_currency("")); + + { + auto actual = hfs.mptIssuanceKeylet(env.master.id(), 1); + auto expected = keylet::mptIssuance(1, env.master.id()); + if (BEAST_EXPECT(actual.has_value())) + { + BEAST_EXPECT(compareKeylet(actual.value(), expected)); + } + } + { + auto actual = hfs.mptIssuanceKeylet(xrpAccount(), 1); + if (BEAST_EXPECT(!actual.has_value())) + BEAST_EXPECT( + actual.error() == HostFunctionError::INVALID_ACCOUNT); + } + + auto const sampleMPTID = makeMptID(1, env.master.id()); + COMPARE_KEYLET(mptokenKeylet, keylet::mptoken, sampleMPTID, alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_PARAMS, + MPTID{}, + alice.id()); + COMPARE_KEYLET_FAIL( + mptokenKeylet, + HostFunctionError::INVALID_ACCOUNT, + sampleMPTID, + xrpAccount()); + + COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + nftOfferKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + + COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + offerKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + oracleKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET( + paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + HostFunctionError::INVALID_PARAMS, + env.master.id(), + env.master.id(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + HostFunctionError::INVALID_ACCOUNT, + env.master.id(), + xrpAccount(), + 1); + COMPARE_KEYLET_FAIL( + paychanKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + env.master.id(), + 1); + + COMPARE_KEYLET( + permissionedDomainKeylet, + keylet::permissionedDomain, + env.master.id(), + 1); + COMPARE_KEYLET_FAIL( + permissionedDomainKeylet, + HostFunctionError::INVALID_ACCOUNT, + xrpAccount(), + 1); + + COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); + COMPARE_KEYLET_FAIL( + signersKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + + COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + ticketKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + + COMPARE_KEYLET(vaultKeylet, keylet::vault, env.master.id(), 1); + COMPARE_KEYLET_FAIL( + vaultKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + } + + void + testGetNFT() + { + testcase("getNFT"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + + // Mint NFT for alice + uint256 const nftId = token::getNextID(env, alice, 0u, 0u); + std::string const uri = "https://example.com/nft"; + env(token::mint(alice), token::uri(uri)); + env.close(); + uint256 const nftId2 = token::getNextID(env, alice, 0u, 0u); + env(token::mint(alice)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = keylet::escrow(alice, env.seq(alice)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT + { + auto const result = hfs.getNFT(alice.id(), nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(std::ranges::equal(*result, uri)); + } + + // Should fail for invalid account + { + auto const result = hfs.getNFT(xrpAccount(), nftId); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::INVALID_ACCOUNT); + } + + // Should fail for invalid nftId + { + auto const result = hfs.getNFT(alice.id(), uint256()); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Should fail for invalid nftId + { + auto const badId = token::getNextID(env, alice, 0u, 1u); + auto const result = hfs.getNFT(alice.id(), badId); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + { + auto const result = hfs.getNFT(alice.id(), nftId2); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::FIELD_NOT_FOUND); + } + } + + void + testGetNFTIssuer() + { + testcase("getNFTIssuer"); + using namespace test::jtx; + + Env env{*this}; + // Mint NFT for env.master + uint32_t const taxon = 12345; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + // Should succeed for valid NFT id + { + auto const result = hfs.getNFTIssuer(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(std::ranges::equal(*result, env.master.id())); + } + + // Should fail for zero NFT id + { + auto const result = hfs.getNFTIssuer(uint256()); + if (BEAST_EXPECT(!result.has_value())) + BEAST_EXPECT( + result.error() == HostFunctionError::INVALID_PARAMS); + } + } + + void + testGetNFTTaxon() + { + testcase("getNFTTaxon"); + using namespace test::jtx; + + Env env{*this}; + + uint32_t const taxon = 54321; + uint256 const nftId = token::getNextID(env, env.master, taxon); + env(token::mint(env.master, taxon)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const result = hfs.getNFTTaxon(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == taxon); + } + + void + testGetNFTFlags() + { + testcase("getNFTFlags"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with default flags + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable); + env(token::mint(env.master, 0), txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTFlags(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == tfTransferable); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTFlags(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTTransferFee() + { + testcase("getNFTTransferFee"); + using namespace test::jtx; + + Env env{*this}; + + uint16_t const transferFee = 250; + uint256 const nftId = + token::getNextID(env, env.master, 0u, tfTransferable, transferFee); + env(token::mint(env.master, 0), + token::xferFee(transferFee), + txflags(tfTransferable)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTTransferFee(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == transferFee); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTTransferFee(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testGetNFTSerial() + { + testcase("getNFTSerial"); + using namespace test::jtx; + + Env env{*this}; + + // Mint NFT with serial 0 + uint256 const nftId = token::getNextID(env, env.master, 0u); + auto const serial = env.seq(env.master); + env(token::mint(env.master)); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.getNFTSerial(nftId); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == serial); + } + + // Should return 0 for zero NFT id + { + auto const result = hfs.getNFTSerial(uint256()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(result.value() == 0); + } + } + + void + testTrace() + { + testcase("trace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto const result = hfs.trace(msg, slice, false); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + data.size()); + + auto const resultHex = hfs.trace(msg, slice, true); + BEAST_EXPECT(resultHex.has_value()); + BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + } + + void + testTraceNum() + { + testcase("traceNum"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace number"; + int64_t num = 123456789; + auto const result = hfs.traceNum(msg, num); + BEAST_EXPECT(result.has_value()); + BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + } + + void + testTraceAccount() + { + testcase("traceAccount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace account"; + // Valid account + { + auto const result = hfs.traceAccount(msg, env.master.id()); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + toBase58(env.master.id()).size()); + } + } + + void + testTraceAmount() + { + testcase("traceAmount"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + { + auto const result = hfs.traceAmount(msg, amount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == msg.size() + amount.getFullText().size()); + } + + // IOU amount + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + STAmount iouAmount = env.master["USD"](100); + { + auto const result = hfs.traceAmount(msg, iouAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + iouAmount.getFullText().size()); + } + + // MPT amount + { + auto const mptId = makeMptID(42, env.master.id()); + Asset mptAsset = Asset(mptId); + STAmount mptAmount(mptAsset, 123456); + auto const result = hfs.traceAmount(msg, mptAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT( + result.value() == + msg.size() + mptAmount.getFullText().size()); + } + } + + // clang-format off + + int const normalExp = 15; + + Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 + Bytes const floatIntZero = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 + Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 + Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 + Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) + Bytes const floatPreMaxExp = {0xEC, 0x03, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(79+15) + Bytes const floatMinusMaxExp = {0xAC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1e(80+15) + Bytes const floatMaxIOU = {0xEC, 0x63, 0x86, 0xF2, 0x6F, 0xC0, 0xFF, 0xFF}; // 1e(81+15)-1 + Bytes const floatMinExp = {0xC0, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e-96 + Bytes const float1 = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1 + Bytes const floatMinus1 = {0x94, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1 + Bytes const float1More = {0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x01}; // 1.000 000 000 000 001 + Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 + Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 + Bytes const floatInvalidZero = {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // INVALID + + std::string const invalid = "invalid_data"; + + // clang-format on + + void + testFloatTrace() + { + testcase("FloatTrace"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + { + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); + BEAST_EXPECT( + result && + *result == + msg.size() + 14 /* error msg size*/ + invalid.size() * 2); + } + + { + auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + BEAST_EXPECT( + result && *result == msg.size() + 19 /* string represenation*/); + } + } + + void + testFloatFromInt() + { + testcase("FloatFromInt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::min(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatFromInt(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromInt(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMax); + } + } + + void + testFloatFromUint() + { + testcase("FloatFromUint"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatFromUint(0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatFromUint(std::numeric_limits::max(), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatUIntMax); + } + } + + void + testFloatSet() + { + testcase("FloatSet"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSet(1, 0, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSet(1, 0, 4); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSet(1, Number::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + + { + auto const result = + hfs.floatSet(-1, IOUAmount::maxExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::maxExponent + normalExp - 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + + { + auto const result = + hfs.floatSet(IOUAmount::maxMantissa, IOUAmount::maxExponent, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const result = + hfs.floatSet(1, IOUAmount::minExponent + normalExp, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinExp); + } + + { + auto const result = hfs.floatSet(10, -1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + } + + void + testFloatCompare() + { + testcase("FloatCompare"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatCompare(Slice(), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatCompare(makeSlice(floatInvalidZero), Slice()); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto x = floatMaxExp; + // exp = 81 + 97 = 178 + x[1] |= 0x80; + x[1] &= 0xBF; + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(floatMaxExp)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMin), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 2); + } + + { + auto const result = hfs.floatCompare( + makeSlice(floatIntMax), makeSlice(floatIntZero)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 1); + } + + { + auto const result = + hfs.floatCompare(makeSlice(float1), makeSlice(float1)); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == 0); + } + } + + void + testFloatAdd() + { + testcase("floatAdd"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatAdd(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatAdd(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatMaxIOU), makeSlice(floatMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatAdd( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = + hfs.floatAdd(makeSlice(floatIntMax), makeSlice(floatIntMin), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + } + + void + testFloatSubtract() + { + testcase("floatSubtract"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatSubtract(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatMaxIOU), makeSlice(floatMinusMaxExp), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); + } + + { + auto const result = hfs.floatSubtract( + makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinus1); + } + } + + void + testFloatMultiply() + { + testcase("floatMultiply"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatMaxIOU), makeSlice(float1More), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatMultiply(makeSlice(float1), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(floatIntZero), makeSlice(floatMaxIOU), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatMultiply( + makeSlice(float10), makeSlice(floatPreMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); + } + } + + void + testFloatDivide() + { + testcase("floatDivide"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatDivide(Slice(), Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatDivide(Slice(), Slice(), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatDivide(makeSlice(float1), makeSlice(floatIntZero), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const y = hfs.floatSet( + IOUAmount::maxMantissa, -normalExp - 1, 0); // 0.9999999... + if (BEAST_EXPECT(y)) + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxIOU), makeSlice(*y), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatIntZero), makeSlice(float1), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = + hfs.floatDivide(makeSlice(floatMaxExp), makeSlice(float10), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); + } + } + + void + testFloatRoot() + { + testcase("floatRoot"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatRoot(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatIntZero), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); + } + + { + auto const result = hfs.floatRoot(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 3, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float10); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = hfs.floatSet(1, -1, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatRoot(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatPower() + { + testcase("floatPower"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatPower(Slice(), 2, -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(invalid), 3, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(float1), -2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = + hfs.floatPower(makeSlice(floatMaxIOU), 40000, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == + HostFunctionError::FLOAT_COMPUTATION_ERROR); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 0, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 1, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatPower(makeSlice(float10), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(1, -1, 0); // 0.1 + auto const y = hfs.floatSet(1, -2, 0); // 0.01 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatPower(makeSlice(*x), 2, 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatLog() + { + testcase("floatLog"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + { + auto const result = hfs.floatLog(Slice(), -1); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatLog(makeSlice(invalid), 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const x = + hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(floatMaxExp), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *x); + } + } + + { + auto const x = hfs.floatSet(100, 0, 0); // 100 + if (BEAST_EXPECT(x)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == float2); + } + } + + { + auto const x = hfs.floatSet(1000, 0, 0); // 1000 + auto const y = hfs.floatSet(3, 0, 0); // 0.1 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + + { + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = + hfs.floatSet(-1999999993734431, -15, 0); // almost -2 + if (BEAST_EXPECT(x && y)) + { + auto const result = hfs.floatLog(makeSlice(*x), 0); + BEAST_EXPECT(result) && BEAST_EXPECT(*result == *y); + } + } + } + + void + testFloatNonIOU() + { + testcase("Float Xrp+Mpt"); + using namespace test::jtx; + + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + auto const y = hfs.floatSet(20, 0, 0); + if (!BEAST_EXPECT(y)) + return; + + Bytes x(8); + + // XRP + memset(x.data(), 0, x.size()); + x[0] = 0x40; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + // MPT + memset(x.data(), 0, x.size()); + x[0] = 0x60; + x[7] = 10; + + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = + hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + } + + void + testFloats() + { + testFloatFromInt(); + testFloatFromUint(); + testFloatSet(); + testFloatCompare(); + testFloatAdd(); + testFloatSubtract(); + testFloatMultiply(); + testFloatDivide(); + testFloatRoot(); + testFloatPower(); + testFloatLog(); + testFloatNonIOU(); + testFloatTrace(); + } + + void + run() override + { + testGetLedgerSqn(); + testGetParentLedgerTime(); + testGetParentLedgerHash(); + testGetLedgerAccountHash(); + testGetLedgerTransactionHash(); + testGetBaseFee(); + testIsAmendmentEnabled(); + testCacheLedgerObj(); + testGetTxField(); + testGetCurrentLedgerObjField(); + testGetLedgerObjField(); + testGetTxNestedField(); + testGetCurrentLedgerObjNestedField(); + testGetLedgerObjNestedField(); + testGetTxArrayLen(); + testGetCurrentLedgerObjArrayLen(); + testGetLedgerObjArrayLen(); + testGetTxNestedArrayLen(); + testGetCurrentLedgerObjNestedArrayLen(); + testGetLedgerObjNestedArrayLen(); + testUpdateData(); + testCheckSignature(); + testComputeSha512HalfHash(); + testKeyletFunctions(); + testGetNFT(); + testGetNFTIssuer(); + testGetNFTTaxon(); + testGetNFTFlags(); + testGetNFTTransferFee(); + testGetNFTSerial(); + testTrace(); + testTraceNum(); + testTraceAccount(); + testTraceAmount(); + testFloats(); + } +}; + +BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h new file mode 100644 index 00000000000..ae4db59b0d0 --- /dev/null +++ b/src/test/app/TestHostFunctions.h @@ -0,0 +1,1049 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include +#include +#include +#include +#include + +namespace ripple { + +namespace test { + +struct TestLedgerDataProvider : public HostFunctions +{ + jtx::Env* env_; + void const* rt_ = nullptr; + +public: + TestLedgerDataProvider(jtx::Env* env) : env_(env) + { + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + Expected + getLedgerSqn() override + { + return env_->current()->seq(); + } +}; + +struct TestHostFunctions : public HostFunctions +{ + test::jtx::Env& env_; + AccountID accountID_; + Bytes data_; + int clock_drift_ = 0; + void const* rt_ = nullptr; + +public: + TestHostFunctions(test::jtx::Env& env, int cd = 0) + : env_(env), clock_drift_(cd) + { + accountID_ = env_.master.id(); + std::string t = "10000"; + data_ = Bytes{t.begin(), t.end()}; + } + + virtual void + setRT(void const* rt) override + { + rt_ = rt; + } + + virtual void const* + getRT() const override + { + return rt_; + } + + beast::Journal + getJournal() override + { + return env_.journal; + } + + Expected + getLedgerSqn() override + { + return 12345; + } + + Expected + getParentLedgerTime() override + { + return 67890; + } + + Expected + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + Expected + getLedgerAccountHash() override + { + return env_.current()->info().accountHash; + } + + Expected + getLedgerTransactionHash() override + { + return env_.current()->info().txHash; + } + + Expected + getBaseFee() override + { + return 10; + } + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override + { + return 1; + } + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override + { + return 1; + } + + virtual Expected + cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override + { + return 1; + } + + Expected + getTxField(SField const& fname) override + { + if (fname == sfAccount) + return Bytes(accountID_.begin(), accountID_.end()); + else if (fname == sfFee) + { + int64_t x = 235; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfSequence) + { + auto const x = getLedgerSqn(); + if (!x) + return Unexpected(x.error()); + std::uint32_t const data = x.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + return Bytes(); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const& sn = fname.getName(); + if (sn == "Destination" || sn == "Account") + return Bytes(accountID_.begin(), accountID_.end()); + else if (sn == "Data") + return data_; + else if (sn == "FinishAfter") + { + auto t = + env_.current()->parentCloseTime().time_since_epoch().count(); + std::string s = std::to_string(t); + return Bytes{s.begin(), s.end()}; + } + + return Unexpected(HostFunctionError::INTERNAL); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + if (fname == sfBalance) + { + int64_t x = 10'000; + uint8_t const* p = reinterpret_cast(&x); + return Bytes{p, p + sizeof(x)}; + } + else if (fname == sfAccount) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + return data_; + } + + Expected + getTxNestedField(Slice const& locator) override + { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + if (locator.size() == 4) + { + int32_t const* l = reinterpret_cast(locator.data()); + int32_t const sfield = l[0]; + if (sfield == sfAccount.fieldCode) + { + return Bytes(accountID_.begin(), accountID_.end()); + } + } + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, + 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, + 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, + 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + return Bytes(&a[0], &a[sizeof(a)]); + } + + Expected + getTxArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + return 32; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + return 32; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + return 32; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + return 32; + } + + Expected + updateData(Slice const& data) override + { + return 0; + } + + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override + { + return 1; + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + return env_.current()->info().parentHash; + } + + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override + { + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) override + { + if (!subject || !issuer || credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::credential(subject, issuer, credentialType); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + std::string s = "https://ripple.com"; + return Bytes(s.begin(), s.end()); + } + + Expected + getNFTIssuer(uint256 const& nftId) override + { + return Bytes(accountID_.begin(), accountID_.end()); + } + + Expected + getNFTTaxon(uint256 const& nftId) override + { + return 4; + } + + Expected + getNFTFlags(uint256 const& nftId) override + { + return 8; + } + + Expected + getNFTTransferFee(uint256 const& nftId) override + { + return 10; + } + + Expected + getNFTSerial(uint256 const& nftId) override + { + return 4; + } + + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + if (!asHex) + { + j << "WAMR TRACE: " << msg << " " + << std::string_view( + reinterpret_cast(data.data()), data.size()); + } + else + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "WAMR DEV TRACE: " << msg << " " << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return msg.size() + data.size() * (asHex ? 2 : 1); + } + + Expected + traceNum(std::string_view const& msg, int64_t data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + j << "WAMR TRACE NUM: " << msg << " " << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + sizeof(data); + } + + Expected + traceAccount(std::string_view const& msg, AccountID const& account) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const accountStr = toBase58(account); + + j << "WAMR TRACE ACCOUNT: " << msg << " " << accountStr; + return msg.size() + accountStr.size(); + } + + Expected + traceFloat(std::string_view const& msg, Slice const& data) override + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + auto j = getJournal().trace(); +#endif + auto const s = floatToString(data); + j << "WAMR TRACE FLOAT: " << msg << " " << s; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + return msg.size() + s.size(); + } + + Expected + traceAmount(std::string_view const& msg, STAmount const& amount) override + { +#ifdef DEBUG_OUTPUT + auto j = getJournal().error(); +#else + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "WAMR TRACE AMOUNT: " << msg << " " << amountStr; + return msg.size() + amountStr.size(); + } + + Expected + floatFromInt(int64_t x, int32_t mode) override + { + return floatFromIntImpl(x, mode); + } + + Expected + floatFromUint(uint64_t x, int32_t mode) override + { + return floatFromUintImpl(x, mode); + } + + Expected + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override + { + return floatSetImpl(mantissa, exponent, mode); + } + + Expected + floatCompare(Slice const& x, Slice const& y) override + { + return floatCompareImpl(x, y); + } + + Expected + floatAdd(Slice const& x, Slice const& y, int32_t mode) override + { + return floatAddImpl(x, y, mode); + } + + Expected + floatSubtract(Slice const& x, Slice const& y, int32_t mode) override + { + return floatSubtractImpl(x, y, mode); + } + + Expected + floatMultiply(Slice const& x, Slice const& y, int32_t mode) override + { + return floatMultiplyImpl(x, y, mode); + } + + Expected + floatDivide(Slice const& x, Slice const& y, int32_t mode) override + { + return floatDivideImpl(x, y, mode); + } + + Expected + floatRoot(Slice const& x, int32_t n, int32_t mode) override + { + return floatRootImpl(x, n, mode); + } + + Expected + floatPower(Slice const& x, int32_t n, int32_t mode) override + { + return floatPowerImpl(x, n, mode); + } + + Expected + floatLog(Slice const& x, int32_t mode) override + { + return floatLogImpl(x, mode); + } +}; + +struct TestHostFunctionsSink : public TestHostFunctions +{ + test::StreamSink sink_; + beast::Journal jlog_; + void const* rt_ = nullptr; + +public: + explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) + : TestHostFunctions(env, cd) + , sink_(beast::severities::kDebug) + , jlog_(sink_) + { + } + + test::StreamSink& + getSink() + { + return sink_; + } + + beast::Journal + getJournal() override + { + return jlog_; + } +}; + +struct PerfHostFunctions : public TestHostFunctions +{ + Keylet leKey; + static int constexpr MAX_CACHE = 256; + std::array, MAX_CACHE> cache; + std::shared_ptr tx_; + + void const* rt_ = nullptr; + +public: + PerfHostFunctions( + test::jtx::Env& env, + Keylet const& k, + std::shared_ptr&& tx) + : TestHostFunctions(env), leKey(k), tx_(std::move(tx)) + { + } + + virtual Expected + cacheLedgerObj(uint256 const&, int32_t cacheIdx) override + { + static int32_t intIdx = 0; + + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cacheIdx) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + if (cacheIdx >= MAX_CACHE) + cacheIdx = intIdx++ % MAX_CACHE; + } + else + --cacheIdx; + + if (cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOTS_FULL); + + cache[cacheIdx] = env_.le(leKey); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; + } + + static Bytes + getAnyFieldData(STBase const& obj) + { + // auto const& fname = obj.getFName(); + auto const stype = obj.getSType(); + switch (stype) + { + case STI_UNKNOWN: + case STI_NOTPRESENT: + return {}; + break; + case STI_ACCOUNT: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_AMOUNT: { + auto const& super(static_cast(obj)); + int64_t const data = super.xrp().drops(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + case STI_VL: { + auto const& super(static_cast(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT256: { + auto const& super(static_cast const&>(obj)); + auto const& data = super.value(); + return {data.begin(), data.end()}; + } + break; + case STI_UINT32: { + auto const& super( + static_cast const&>(obj)); + std::uint32_t const data = super.value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return {b, e}; + } + break; + default: + break; + } + + Serializer msg; + obj.add(msg); + + return msg.getData(); + } + + Expected + getTxField(SField const& fname) override + { + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjField(SField const& fname) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjField(int32_t cacheIdx, SField const& fname) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + static Expected + locateField(STObject const& obj, Slice const& loc) + { + if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + + int32_t const* l = reinterpret_cast(loc.data()); + int32_t const sz = loc.size() / 4; + STBase const* field = nullptr; + auto const& m = SField::getKnownCodeToField(); + + { + int32_t const c = l[0]; + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = obj.peekAtPField(fname); + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + for (int i = 1; i < sz; ++i) + { + int32_t const c = l[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (c >= arr->size()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + field = &(arr->operator[](c)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = m.find(c); + if (it == m.end()) + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + auto const& fname(*it->second); + + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + } + + if (!field || (STI_NOTPRESENT == field->getSType())) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + return field; + } + + Expected + getTxNestedField(Slice const& locator) override + { + // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << + // std::endl; + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getCurrentLedgerObjNestedField(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if ((STI_OBJECT == field->getSType()) || + (STI_ARRAY == field->getSType())) + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + + return getAnyFieldData(*field); + } + + Expected + getTxArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const* field = tx_->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjArrayLen(SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto const* field = sle->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + { + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const* field = cache[cacheIdx]->peekAtPField(fname); + if (!field) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getTxNestedArrayLen(Slice const& locator) override + { + auto const r = locateField(*tx_, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + { + auto const sle = env_.le(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + auto const r = locateField(*sle, locator); + if (!r) + return Unexpected(r.error()); + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { + // return Unexpected(HostFunctionError::INVALID_SLOT); + cache[cacheIdx] = env_.le(leKey); + } + + auto const r = locateField(*cache[cacheIdx], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; + } + + Expected + updateData(Slice const& data) override + { + ripple::detail::ApplyViewBase v( + env_.app().openLedger().current().get(), tapNONE); + + auto sle = v.peek(leKey); + if (!sle) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + sle->setFieldVL(sfData, data); + v.update(sle); + + return data.size(); + } + + Expected + computeSha512HalfHash(Slice const& data) override + { + auto const hash = sha512Half(data); + return hash; + } + + Expected + getNFT(AccountID const& account, uint256 const& nftId) override + { + if (!account || !nftId) + { + getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + + auto obj = nft::findToken(*env_.current(), account, nftId); + if (!obj) + { + getJournal().trace() << "WAMR getNFT: NFT not found"; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + auto ouri = obj->at(~sfURI); + if (!ouri) + return Bytes(); + + Slice const s = ouri->value(); + return Bytes(s.begin(), s.end()); + } +}; + +} // namespace test +} // namespace ripple From b1d70db63b415c9ee9116085043ee2cd4af3eec8 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 10 Sep 2025 15:05:06 -0400 Subject: [PATCH 068/212] limits --- include/xrpl/protocol/Protocol.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index a0fcfee34c7..d52ae2dfc19 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -133,6 +133,13 @@ std::uint8_t constexpr vaultMaximumIOUScale = 18; * another vault; counted from 0 */ std::uint8_t constexpr maxAssetCheckDepth = 5; +/** The maximum length of a Data field in Escrow object that can be updated by + * Wasm code */ +std::size_t constexpr maxWasmDataLength = 4 * 1024; + +/** The maximum length of a parameters passed from Wasm code*/ +std::size_t constexpr maxWasmParamLength = 1024; + /** A ledger index. */ using LedgerIndex = std::uint32_t; From 129aa4bfaa8cd116c9e88855b900ef12de03ce38 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 13:18:42 -0400 Subject: [PATCH 069/212] bring out IOUAmount.h --- include/xrpl/protocol/IOUAmount.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index 93fba4150d7..c9838a6a804 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -58,6 +58,13 @@ class IOUAmount : private boost::totally_ordered, normalize(); public: + /* The range for the mantissa when normalized */ + static std::int64_t constexpr minMantissa = 1000000000000000ull; + static std::int64_t constexpr maxMantissa = 9999999999999999ull; + /* The range for the exponent when normalized */ + static int constexpr minExponent = -96; + static int constexpr maxExponent = 80; + IOUAmount() = default; explicit IOUAmount(Number const& other); IOUAmount(beast::Zero); From 2de848885504087f9220321df7f8fb34f0130150 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:02:17 -0400 Subject: [PATCH 070/212] add temBAD_WASM --- include/xrpl/protocol/TER.h | 2 ++ src/libxrpl/protocol/TER.cpp | 1 + 2 files changed, 3 insertions(+) diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index 9ace6b80f8b..2df3e725758 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -141,6 +141,8 @@ enum TEMcodes : TERUnderlyingType { temARRAY_TOO_LARGE, temBAD_TRANSFER_FEE, temINVALID_INNER_BATCH, + + temBAD_WASM, }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index a396949afe2..5d62643a13d 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -220,6 +220,7 @@ transResults() MAKE_ERROR(temARRAY_TOO_LARGE, "Malformed: Array is too large."), MAKE_ERROR(temBAD_TRANSFER_FEE, "Malformed: Transfer fee is outside valid range."), MAKE_ERROR(temINVALID_INNER_BATCH, "Malformed: Invalid inner batch transaction."), + MAKE_ERROR(temBAD_WASM, "Malformed: Provided WASM code is invalid."), MAKE_ERROR(terRETRY, "Retry transaction."), MAKE_ERROR(terFUNDS_SPENT, "DEPRECATED."), From a15d65f7a2c194fc446ab8a79a481d779a13a072 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:20:33 -0400 Subject: [PATCH 071/212] update tests --- src/test/app/HostFuncImpl_test.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index a198ba4af44..f75ad1aa723 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -264,8 +264,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); - // Use featureSmartEscrow for testing - auto const amendmentId = featureSmartEscrow; + // Use featureTokenEscrow for testing + auto const amendmentId = featureTokenEscrow; // Test by id { @@ -275,7 +275,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Test by name - std::string const amendmentName = "SmartEscrow"; + std::string const amendmentName = "TokenEscrow"; { auto const result = hfs.isAmendmentEnabled(amendmentName); BEAST_EXPECT(result.has_value()); @@ -360,7 +360,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setAccountID(sfAccount, env.master.id()); obj.setAccountID(sfOwner, env.master.id()); obj.setFieldU32(sfOfferSequence, env.seq(env.master)); - obj.setFieldU32(sfComputationAllowance, 1000); obj.setFieldArray(sfMemos, STArray{}); }); ApplyContext ac = createApplyContext(env, ov, stx); @@ -382,11 +381,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const offerSeq = hfs.getTxField(sfOfferSequence); BEAST_EXPECT(offerSeq && *offerSeq == toBytes(env.seq(env.master))); - auto const compAllowance = hfs.getTxField(sfComputationAllowance); - std::uint32_t const expectedAllowance = 1000; - BEAST_EXPECT( - compAllowance && *compAllowance == toBytes(expectedAllowance)); - auto const notPresent = hfs.getTxField(sfDestination); if (BEAST_EXPECT(!notPresent.has_value())) BEAST_EXPECT( From bf32dc2e727c3839a323e39c1eafd4f0f1731a02 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:28:11 -0400 Subject: [PATCH 072/212] add fixtures files --- src/test/app/wasm_fixtures/fixtures.cpp | 10330 ++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 52 + 2 files changed, 10382 insertions(+) create mode 100644 src/test/app/wasm_fixtures/fixtures.cpp create mode 100644 src/test/app/wasm_fixtures/fixtures.h diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp new file mode 100644 index 00000000000..ec91496428c --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -0,0 +1,10330 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const fibWasmHex = + "0061736d0100000001090260000060017f017f0303020001071b02115f5f" + "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" + "01017f200045044041000f0b2000410348044041010f0b200041026a2100" + "0340200041036b100120016a2101200041026b220041044a0d000b200141" + "016a0b"; + +extern std::string const b58WasmHex = + "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" + "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" + "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" + "617465000106655f6461746103000a6465616c6c6f636174650002076235" + "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" + "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" + "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" + "200220066a2d00000d012003200641016a2206470d000b200321060b2003" + "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" + "480d00200741016a220a410771210541002104200741074f0440200a41f8" + "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" + "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" + "200541016b22050d000b0b200320064a0440200621052007210403402002" + "20056a2d0000210802402004220a20074e0440200721042008450d010b20" + "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" + "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" + "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" + "200741016a22022103410021040240200c4100480d000340200420096a2d" + "00000d012002200441016a2204470d000b200221040b2001200320066a20" + "046b4a047f02402006450d002006410771210841002105200641084f0440" + "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" + "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" + "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" + "0420076a410171047f200405200020066a200420096a2d00004180086a2d" + "00003a0000200641016a2106200441016a0b210520042007460d00200520" + "096a2101200720056b2102200020066a2103417f21040340200320046a22" + "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" + "026a200541026a2d00004180086a2d00003a00002002200441026a220447" + "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" + "41000b0b0b4101004180080b3a3132333435363738394142434445464748" + "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" + "707172737475767778797a00490f7461726765745f666561747572657304" + "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const sha512PureWasmHex = + "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" + "05040001020305030100020607017f0041800d0b075006066d656d6f7279" + "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" + "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" + "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" + "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" + "06211620014180016d41016bac210b41808d02290300210c41888d022903" + "00210d41908d02290300210e41988d02290300210f41a08d022903002110" + "41a88d02290300211141b08d02290300211241b88d022903002113034041" + "002101200c21092013210a201221082011210520102103200f2115200e21" + "06200d2102034020022107200120166a200020016a290000220242388620" + "024280fe0383422886842002428080fc0783421886200242808080f80f83" + "4208868484200242088842808080f80f832002421888428080fc07838420" + "024228884280fe03832002423888848484220237030020014180086a2903" + "00200a200322044232892004422e89852004421789857c2008220a200442" + "7f858320052208200483847c7c20027c2203200922024224892002421e89" + "85200242198985200220072006221485832006200783857c7c2109200320" + "157c2103200421052006211520072106200141086a2201418001470d000b" + "200020016a21004180092117411e210103402002210620162001410e6b41" + "0f714103746a221820182903002016200141056b410f714103746a290300" + "20162001410d6b410f714103746a2903002202423f892002423889852002" + "420788857c7c20162001410f714103746a2903002202422d892002420389" + "852002420688857c22023703002017290300200a20032205423289200542" + "2e89852005421789857c2005427f852008832004200583847c7c20027c22" + "03200922024224892002421e898520024219898520022006200785832006" + "200783857c7c2109200320147c2103201741086a21172008210a20042108" + "200521042007211420062107200141016a220141de00470d000b41b88d02" + "200a20137c221337030041b08d02200820127c221237030041a88d022004" + "20117c221137030041a08d02200320107c221037030041988d02200f2014" + "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" + "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" + "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" + "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" + "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" + "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" + "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" + "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" + "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" + "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" + "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" + "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" + "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" + "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" + "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" + "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" + "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" + "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" + "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" + "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" + "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" + "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" + "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" + "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" + "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" + "7065732b0a6d756c746976616c7565"; + +extern std::string const zkProofWasmHex = + "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" + "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" + "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" + "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" + "030505030206020601000006010606070303080202020302090208020202" + "030a0806020a030b06060202030302020303030203030203020202010302" + "030203060a02000202080a020c0807010d02030206060102020803080302" + "030202020a02060303020a03020301010a0d030101010001010301020604" + "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" + "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" + "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" + "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" + "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" + "4020010d00410021010c010b2002450d01200120026e2203200320026c20" + "01476a21010b2000200136020820004101360204200020013602000f0b10" + "8180808000000b4701017f23808080800041206b22002480808080002000" + "41003602182000410136020c200041e090c0800036020820004204370210" + "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" + "808080000b170002402000450d002001200020026c108d808080000b0b0e" + "002000200141011083808080000b0f002000200141a0021083808080000b" + "0e002000200141201083808080000b4201017f0240200028020822032000" + "280200470d00200020021088808080000b2000280204200341e8006c6a20" + "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" + "800041106b2202248080808000200241086a20002000280200410141e800" + "108b80808000024020022802082200418180808078460d00200020022802" + "0c2001108c80808000000b200241106a2480808080000b6401027f238080" + "80800041106b2203248080808000200341086a20024101410141f081c080" + "00108a8080800020032802082104200328020c2001200210868180800021" + "01200020023602082000200136020420002004360200200341106a248080" + "8080000b6401017f23808080800041106b2205248080808000200541046a" + "200120022003108e8080800020052802082103024020052802040d002000" + "200528020c36020420002003360200200541106a2480808080000f0b2003" + "200528020c2004108c80808000000bfd0102037f017e2380808080004110" + "6b22052480808080004100210602400240200220036a22032002490d0020" + "0441076a417871ad2001280200220741017422022003200220034b1b2202" + "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" + "074b0d01024002402007450d00024020040d00200541086a4108200210d7" + "80808000200528020821040c020b2001280204200720046c200210cb8080" + "800021040c010b20054108200210d780808000200528020021040b024020" + "040d00410821060c020b2001200336020020012004360204418180808078" + "21060b0b2000200236020420002006360200200541106a2480808080000b" + "1200024020000d00200210cf808080000b000b6c01027f02400240200041" + "7c6a2802002202417871220341044108200241037122021b20016a490d00" + "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" + "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" + "10ca80808000000bc70103017f017e017f23808080800041106b22042480" + "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" + "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" + "200236020841002102200041003602040c020b200441086a2002200310d7" + "80808000024020042802082206450d002000200636020820002001360204" + "410021020c020b2000200336020820002002360204410121020c010b2000" + "4100360204410121020b20002002360200200441106a2480808080000b88" + "0303017f097e017f23808080800041306b22022480808080002002420042" + "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" + "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" + "20012903482209842001290350220a842001290358220b8450220c1b3703" + "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" + "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" + "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" + "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" + "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" + "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" + "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" + "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" + "80808000200020014130108681808000200c3a0060200241306a24808080" + "80000b9e0101027e20002002290328200129032822048542002003ad42ff" + "01837d220583200485370328200020022903202001290320220485200583" + "200485370320200020022903182001290318220485200583200485370318" + "200020022903102001290310220485200583200485370310200020022903" + "082001290308220485200583200485370308200020022903002001290300" + "2204852005832004853703000bec0201057f23808080800041c0006b2202" + "248080808000410121030240200128021c2204418082c080004111200128" + "0220220528020c220611808080800080808080000d000240024020012d00" + "144104710d0041012103200441fa8ec08000410120061180808080008080" + "8080000d02200141e091c080004102109280808000450d010c020b200441" + "fb8ec080004102200611808080800080808080000d014101210320024101" + "3a0017200241186a41086a200141086a290200370300200241186a41106a" + "200141106a290200370300200241186a41186a200141186a280200360200" + "2002200536020c20022004360208200241dc8ec080003602382002200129" + "02003703182002200241176a3602102002200241086a360234200241186a" + "41e091c0800041021092808080000d01200241086a41f88ec08000410210" + "93808080000d010b200441ec8cc080004101200611808080800080808080" + "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" + "200028020022032000280208220472450d0002402004410171450d002001" + "20026a210502400240200028020c22060d0041002107200121080c010b41" + "00210741002109200121080340200822042005460d020240024020042c00" + "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" + "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" + "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" + "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" + "2007450d00024020072002490d0020072002460d01410021040c020b2001" + "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" + "21022004200120041b21010b024020030d00200028021c20012002200028" + "022028020c11808080800080808080000f0b2000280204210a0240200241" + "10490d0020022001200141036a417c7122076b22096a220b410371210341" + "00210641002104024020012007460d004100210402402009417c4b0d0041" + "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" + "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" + "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" + "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" + "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" + "4a6a21060b200b4102762105200620046a21060340200721032005450d04" + "200541c001200541c001491b220b410371210c200b410274210d41002108" + "024020054104490d002003200d41f007716a210941002108200321040340" + "200428020c2207417f734107762007410676724181828408712004280208" + "2207417f7341077620074106767241818284087120042802042207417f73" + "41077620074106767241818284087120042802002207417f734107762007" + "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" + "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" + "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" + "fc01714102746a22082802002204417f7341077620044106767241818284" + "08712104200c4101460d0220082802042207417f73410776200741067672" + "41818284087120046a2104200c4102460d0220082802082208417f734107" + "7620084106767241818284087120046a21040c020b024020020d00410021" + "060c030b2002410371210802400240200241044f0d004100210641002109" + "0c010b41002106200121042002410c71220921070340200620042c000041" + "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" + "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" + "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" + "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" + "200028022028020c11808080800080808080000f0b200441087641ff811c" + "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" + "20064d0d00200a20066b2105024002400240410020002d00182204200441" + "03461b22040e03020001020b20052104410021050c010b20054101762104" + "200541016a41017621050b200441016a2104200028021021092000280220" + "2108200028021c210703402004417f6a2204450d02200720092008280210" + "1181808080008080808000450d000b41010f0b200028021c200120022000" + "28022028020c11808080800080808080000f0b0240200720012002200828" + "020c1180808080008080808000450d0041010f0b41002104034002402005" + "2004470d0020052005490f0b200441016a21042007200920082802101181" + "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" + "7f6a21032000280204210420002802002105200028020821064100210741" + "002108410021094100210a02400340200a4101710d010240024020092002" + "4b0d000340200120096a210a0240024002400240200220096b220b41074b" + "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" + "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" + "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" + "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" + "828408200c41046a2802002200418a94a8d000736b200072714180818284" + "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" + "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" + "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" + "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" + "0000410a460d01200b200041016a2200470d000b200221090c030b200020" + "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" + "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" + "000b0b20082002460d024101210a2008210d200221000b0240024020062d" + "0000450d00200541f48ec080004104200428020c11808080800080808080" + "000d010b200020086b210b4100210c024020002008460d00200320006a2d" + "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" + "200b200428020c1180808080008080808000450d010b0b410121070b2007" + "0ba80101017f23808080800041306b220424808080800020042003360208" + "20042002360204200420012d00c80122033a000f024020034101460d0020" + "04420137021c200441013602142004419482c08000360210200441818080" + "800036022c2004200441286a3602182004200441046a3602282004410f6a" + "41c886c08000200441106a419c82c08000109680808000000b2000200141" + "c8011086818080001a200441306a2480808080000b140020012000280200" + "20002802041092808080000b4401017f23808080800041106b2204248080" + "8080002004200136020c20042000360208200441086a41b886c080002004" + "410c6a41b886c080002002200310d380808000000ba70101017f23808080" + "800041306b22042480808080002004200336020820042002360204200420" + "012d006822033a000f024020034101460d002004420137021c2004410136" + "02142004419482c08000360210200441818080800036022c200420044128" + "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" + "419c82c08000109680808000000b2000200141e8001086818080001a2004" + "41306a2480808080000b45000240024020042003490d0020022004490d01" + "2000200420036b3602042000200120036a3602000f0b2003200420051099" + "80808000000b200420022005109a80808000000b0f0020002001200210fc" + "80808000000b0f0020002001200210f580808000000b4001017f23808080" + "800041106b2201248080808000200141086a200041014101419883c08000" + "108a80808000200128020c2100200141106a24808080800020000b9a0101" + "017f23808080800041b0016b2202248080808000200241086a2001280204" + "20012802084100413041a883c080001098808080000240200228020c4130" + "460d00200241106a41b883c08000109d80808000000b20024180016a2002" + "28020841301089818080001a200241106a20024180016a109e8080800020" + "00200241106a41c883c080004118109780808000200241b0016a24808080" + "80000b970101017f23808080800041c0006b22022480808080002002412b" + "36020c200241f880c08000360208200241e880c080003602142002200036" + "02102002410236021c200241cc8ec0800036021820024202370224200241" + "8280808000ad422086200241106aad843703382002418380808000ad4220" + "86200241086aad843703302002200241306a360220200241186a200110a4" + "80808000000ba50801077f23808080800041c0086b220224808080800020" + "012d0000220341077610a3808080002104200341067641017110a3808080" + "002105200341057641017110a3808080002106200241a0066a2001413010" + "86818080001a200220022d00a006411f713a00a006200241e8006a200241" + "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" + "026a200241b0076a200241e8006a20022d00980122071090808080002002" + "4190056a10a8808080002002200520047110a380808000200610d2808080" + "007110a380808000200241c0026a10a9808080007110a38080800022013a" + "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" + "0020024180046a200241a0066a200241c0026a10a780808000200241e007" + "6a20024180046a418089c0800010b98080800020024180046a200241e007" + "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" + "00200241a0066a200241e0076a10db808080002103200241f0026a200241" + "80046a41301086818080001a200220033a00a00320024100413010858180" + "800022024190086a2002200241f0026a2003109080808000200241a0066a" + "20024190086a10b28080800020024180046a41306a20024190086a200241" + "a0066a200620024190086a10de808080007310a380808000109080808000" + "20024180046a200241c0026a41301086818080001a20032004200510d280" + "8080007110a3808080007110a3808080002103200241a0066a2002418004" + "6a41e0001086818080001a200220033a008807200220053a008007200241" + "d0016a20024190056a200241a0066a200810aa8080800020022007200120" + "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" + "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" + "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" + "8080800020024180046a20024190056a10e480808000200241f0026a2002" + "4180046a10e58080800020024190056a200241e8001086818080001a2002" + "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" + "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" + "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" + "8080800020024190086a200241f0026a41306a200510a780808000200241" + "80046a200241a0066a41306a200110a7808080002003200110a980808000" + "2201200510a98080800022057110a380808000200110d280808000200510" + "d2808080007110a380808000200241b0076a200241e0076a10db80808000" + "7110a38080800020024190086a20024180046a10db808080007110a38080" + "80007210a3808080007110a38080800021052000200241e8001086818080" + "0020053a0068200241c0086a2480808080000b970101017f238080808000" + "41c0026b2203248080808000200341086a20012002410041e00041e083c0" + "80001098808080000240200328020c41e000460d00200341106a41f083c0" + "8000109d80808000000b200341e0016a200328020841e000108981808000" + "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" + "004118109480808000200341c0026a2480808080000bff1d02137f017e23" + "808080800041a0276b220224808080800020012d0000220341077610a380" + "8080002104200341067641017110a3808080002105200341057641017110" + "a380808000210620024180106a200141301086818080001a200220022d00" + "8010411f713a008010200241a0216a20024180106a10dc80808000200241" + "80226a200141306a10dc80808000200241e01f6a41004130108581808000" + "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" + "80800020022d00b0222101200241c0206a410041301085818080001a2002" + "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" + "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" + "2002200520047110a380808000200610d2808080007110a3808080002002" + "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" + "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" + "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" + "c0800010bc80808000200241c0236a10e08080800021032002410041e000" + "108581808000220220033a0060200310d2808080002109200241a0246a20" + "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" + "ba8080800020024180256a20024180106a200241c0236a10b38080800020" + "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" + "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" + "30108681808000210a200241d0016a41306a410041301085818080001a20" + "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" + "016a10e28080800020024180256a200241c0266a10c28080800021032002" + "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" + "10d280808000210b200a41004130108581808000210320024180106a41e0" + "86c0800041301086818080001a20024180076a20024180256a2002418010" + "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" + "0020024180106a20024198036a200241e0256a10b3808080002002410110" + "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" + "da80808000200241c00b6a410041e0001085818080001a20024198036a20" + "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" + "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" + "8080007110a380808000210a20024180106a20024198036a41e000108681" + "8080001a2002200a3a00e01020024180076a200220024180106a200910da" + "808080002002410041e00010858180800022024198036a20022002418007" + "6a20022d00e007220910b08080800020024180106a20024198036a10e280" + "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" + "024198036a41306a220a10de80808000200a10a98080800020024198036a" + "10de808080007110a3808080007210a3808080007310a38080800010b080" + "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" + "0510d2808080007110a3808080007110a380808000210420024180106a20" + "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" + "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" + "0420022d00a80f220573410020086b712005737110a38080800021012002" + "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" + "6a280000360000200220022800890d3600c9012002200120077110a38080" + "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" + "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" + "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" + "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" + "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" + "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" + "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" + "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" + "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" + "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" + "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" + "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" + "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" + "4180106a200241e0046a41301086818080001a20024180076a2002418010" + "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" + "80106a200241e0046a41e0006a220141301086818080001a20024180076a" + "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" + "066a10b28080800020024180106a200241e0046a41c0016a220541301086" + "818080001a20024180076a41c0016a20024180106a41e000108681808000" + "210e2003410041301085818080001a20024180106a41e086c08000413010" + "86818080001a200241a0096a410041e0001085818080001a200241a0096a" + "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" + "6a410041e000108581808000210a200241c0266a41306a210f2002418010" + "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" + "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" + "8080a080e9002115024003402015500d01200241e0196a200110ba808080" + "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" + "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" + "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" + "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" + "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" + "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" + "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" + "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" + "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" + "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" + "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" + "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" + "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" + "0241a0246a41e00010868180800021082014200241c0206a41e000108681" + "8080002107200f410041301085818080001a200241c0266a41e086c08000" + "41301086818080001a20024180106a410041e0001085818080001a201020" + "0241c0266a41e00010868180800021042012410041e00010858180800021" + "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" + "b080808000200b20082004200310b080808000201320072006200310b080" + "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" + "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" + "024180136a2009200110b380808000200241e0136a200a200510b3808080" + "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" + "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" + "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" + "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" + "09200a10bc8080800020024180196a2001200510bc80808000200241e019" + "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" + "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" + "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" + "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" + "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" + "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" + "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" + "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" + "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" + "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" + "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" + "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" + "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" + "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" + "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" + "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" + "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" + "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" + "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" + "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" + "818080001a20024180106a200241a0096a41e0001086818080001a200241" + "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" + "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" + "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" + "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" + "0110e08080800022017110a380808000200510d280808000200110d28080" + "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" + "80808000200241e00d6a20024180106a10c2808080007110a38080800072" + "10a380808000200c7110a38080800021012000200241d0016a41c8011086" + "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" + "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" + "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" + "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" + "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" + "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" + "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" + "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" + "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" + "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" + "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" + "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" + "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" + "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" + "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" + "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" + "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" + "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" + "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" + "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" + "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" + "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" + "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" + "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" + "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" + "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" + "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" + "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" + "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" + "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" + "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" + "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" + "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" + "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" + "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" + "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" + "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" + "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" + "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" + "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" + "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" + "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" + "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" + "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" + "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" + "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" + "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" + "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" + "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" + "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" + "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" + "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" + "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" + "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" + "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" + "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" + "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" + "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" + "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" + "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" + "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" + "066a41e0006a41e000108980808000200041980f6a20002802900f200028" + "02940f109f80808000200041e4106a2000419c086a41e000108980808000" + "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" + "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" + "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" + "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" + "900110898080800020004194156a41086a22014100360200200042808080" + "80800137029415200041d0066a200028028c152202200028029015220341" + "004130418084c08000109880808000200041a0156a20002802d006200028" + "02d406108980808000200041b0156a200041a0156a109c80808000200041" + "94156a200041b0156a419084c08000108780808000200041c8066a200220" + "03413041e00041a084c08000109880808000200041b0156a20002802c806" + "20002802cc0610898080800020002802a01520002802a415108480808000" + "200041a0156a41086a2204200041b0156a41086a22052802003602002000" + "20002902b0153703a015200041b0156a200041a0156a109c808080002000" + "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" + "200341e00041900141c084c08000109880808000200041b0156a20002802" + "c00620002802c40610898080800020002802a01520002802a41510848080" + "800020042005280200360200200020002902b0153703a015200041b0156a" + "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" + "108780808000200041c81c6a200128020036020020002000290294153703" + "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" + "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" + "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" + "818080002107200041901a6a200041c8126a41e8001086818080001a2000" + "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" + "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" + "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" + "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" + "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" + "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" + "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" + "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" + "0002400240024002400240024020002802a4684101470d00200041b8066a" + "20002802a8684108412041d880c08000108a80808000200041003602c85b" + "200020002802bc0622033602c45b200020002802b80622023602c05b2000" + "41f8326a41c0004120108080808000024020002802fc324101470d004100" + "21050240200220002802803322014f0d00200041b0066a200041c0db006a" + "410020014120108b8080800020002802b0062202418180808078470d0520" + "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" + "746a210341c000210103402001450d03200041b0046a2002290000220942" + "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" + "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" + "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" + "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" + "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" + "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" + "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" + "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" + "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" + "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" + "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" + "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" + "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" + "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" + "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" + "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" + "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" + "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" + "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" + "00420010878180800020004180046a20002903f005220f20002903c00422" + "10200041b0046a41086a2903007c22117c22122000290390047c22132000" + "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" + "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" + "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" + "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" + "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" + "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" + "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" + "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" + "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" + "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" + "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" + "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" + "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" + "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" + "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" + "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" + "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" + "2903e0047c220f2000290390067c221420004180066a41086a2903002011" + "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" + "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" + "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" + "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" + "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" + "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" + "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" + "8000200041d0036a41086a290300211d20004180056a41086a290300211e" + "200041d0056a41086a290300211f200041a0066a41086a29030021202000" + "2903e00521212000290390052122200029038003212320004180036a4108" + "6a290300212420004190036a41086a290300212520004190056a41086a29" + "03002126200041e0056a41086a290300212720002903a005212820002903" + "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" + "026a41086a290300212c200020002903d002222d200041e0046a41086a29" + "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" + "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" + "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" + "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" + "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" + "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" + "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" + "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" + "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" + "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" + "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" + "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" + "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" + "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" + "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" + "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" + "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" + "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" + "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" + "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" + "41f8326a10a28080800020002903a068210e20002903a868211220002903" + "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" + "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" + "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" + "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" + "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" + "0021042000411836028457200041a585c0800036028057200020043a00c0" + "52200441ff01714101470d04200341186a200d370300200341106a201337" + "0300200341086a20123703002003200e370300200341206a210320054101" + "6a210520022001412020014120491b22046a2102200120046b21010c000b" + "0b2000410036028833200041013602fc32200041d085c080003602f83220" + "00420437028033200041f8326a41d880c0800010a480808000000b200041" + "0036028833200041013602fc32200041d085c080003602f8322000420437" + "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" + "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" + "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" + "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" + "6a2134200041a0dc006a2135410021040340024020042005470d00200041" + "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" + "410041301085818080001a200041c0db006a200041a0e8006a200041f832" + "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" + "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" + "41c0db006a10a7808080002000410010a3808080003a008069200041f832" + "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" + "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" + "80800020004188256a200710ab8080800020004198256a200810ab808080" + "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" + "808000200041c0376a200041801f6a108f80808000200041803c6a200041" + "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" + "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" + "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" + "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" + "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" + "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" + "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" + "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" + "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" + "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" + "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" + "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" + "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" + "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" + "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" + "64410374210120002802c064210320002802c8642130024003402001450d" + "01200328020422042d000c20032802002d00607210a38080800021022000" + "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" + "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" + "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" + "10b0808080002037203a2039200210b08080800020004180d7006a203120" + "08200210b080808000203420072006200210b08080800020332032203520" + "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" + "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" + "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" + "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" + "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" + "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" + "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" + "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" + "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" + "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" + "41301086818080001a200041c0db006a41306a2201200041b8256a419001" + "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" + "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" + "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" + "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" + "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" + "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" + "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" + "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" + "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" + "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" + "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" + "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" + "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" + "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" + "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" + "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" + "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" + "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" + "41e0036a41301086818080001a200041f8326a410041301085818080001a" + "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" + "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" + "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" + "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" + "0041f8326a10b3808080002005410041301085818080002133200042ba8a" + "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" + "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" + "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" + "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" + "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" + "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" + "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" + "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" + "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" + "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" + "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" + "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" + "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" + "b28080800020004180ce006a200041f8326a41301086818080001a200041" + "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" + "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" + "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" + "41301086818080001a200041a0e8006a410041301085818080001a200042" + "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" + "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" + "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" + "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" + "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" + "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" + "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" + "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" + "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" + "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" + "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" + "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" + "80800020004180ce006a200041f8326a4180036a22414130108681808000" + "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" + "326a41e0036a224241301086818080001a200041a0e8006a410041301085" + "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" + "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" + "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" + "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" + "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" + "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" + "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" + "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" + "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" + "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" + "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" + "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" + "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" + "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" + "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" + "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" + "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" + "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" + "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" + "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" + "4410b280808000200041c0d2006a200841301086818080001a2007200041" + "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" + "41c0016a223a41301086818080001a200041c0db006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" + "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" + "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" + "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" + "006a200041c0db006a10b380808000200141004130108581808000210120" + "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" + "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" + "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" + "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" + "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" + "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" + "10b28080800020004180c5006a200341301086818080001a2005200041a0" + "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" + "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" + "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" + "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" + "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" + "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" + "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" + "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" + "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" + "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" + "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" + "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" + "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" + "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" + "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" + "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" + "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" + "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" + "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" + "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" + "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" + "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" + "2031203510b28080800020004180c5006a200041c0db006a413010868180" + "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" + "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" + "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" + "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" + "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" + "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" + "0620004180ce006a20004180d7006a10b380808000200741004130108581" + "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" + "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" + "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" + "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" + "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" + "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" + "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" + "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" + "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" + "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" + "5241301086818080001a20004180d7006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" + "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" + "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" + "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" + "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" + "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" + "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" + "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" + "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" + "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" + "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" + "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" + "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" + "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" + "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" + "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" + "01108581808000213820004180d7006a41a0026a225320004180ce006a20" + "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" + "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" + "41301086818080001a200520004180d7006a4190016a10b2808080002000" + "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" + "b28080800020004180ce006a200441301086818080001a200041c0d2006a" + "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" + "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" + "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" + "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" + "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" + "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" + "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" + "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" + "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" + "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" + "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" + "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" + "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" + "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" + "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" + "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" + "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" + "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" + "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" + "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" + "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" + "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" + "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" + "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" + "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" + "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" + "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" + "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" + "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" + "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" + "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" + "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" + "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" + "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" + "b280808000200041803c6a200041c0d2006a41301086818080001a203720" + "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" + "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" + "c0c9006a203441301086818080001a20004180ce006a4100413010858180" + "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" + "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" + "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" + "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" + "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" + "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" + "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" + "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" + "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" + "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" + "41d0026a225a10b280808000200041c0376a205641301086818080001a20" + "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" + "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" + "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" + "301086818080001a20004180ce006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" + "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" + "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" + "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" + "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" + "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" + "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" + "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" + "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" + "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" + "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" + "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" + "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" + "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" + "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" + "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" + "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" + "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" + "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" + "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" + "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" + "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" + "8080800020004180e0006a41306a2230200041f8326a203310b980808000" + "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" + "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" + "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" + "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" + "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" + "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" + "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" + "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" + "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" + "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" + "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" + "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" + "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" + "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" + "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" + "0020004180d7006a410041301085818080001a200041c0e7006a20004180" + "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" + "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" + "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" + "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" + "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" + "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" + "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" + "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" + "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" + "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" + "0041c0db006a200210b0808080002038203d203c200210b0808080002034" + "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" + "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" + "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" + "86818080001a200020023a00b837200041803c6a410041c0041085818080" + "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" + "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" + "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" + "203e200210b0808080002008200041803c6a4180036a2041200210b08080" + "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" + "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" + "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" + "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" + "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" + "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" + "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" + "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" + "301086818080001a200041a0e8006a410041301085818080001a200042c1" + "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" + "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" + "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" + "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" + "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" + "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" + "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" + "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" + "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" + "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" + "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" + "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" + "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" + "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" + "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" + "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" + "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" + "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" + "006a200041a0e8006a10b380808000203341004130108581808000210620" + "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" + "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" + "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" + "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" + "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" + "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" + "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" + "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" + "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" + "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" + "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" + "98abaaa584073703c05b203c410041c00110858180800021432003200041" + "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" + "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" + "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" + "6a200841301086818080001a2001204510b28080800020004180d7006a20" + "3a41301086818080001a200041c0db006a410041301085818080001a2000" + "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" + "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" + "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" + "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" + "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" + "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" + "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" + "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" + "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" + "001086818080001a2031204710b28080800020004180c5006a2003413010" + "86818080001a2005204810b280808000200041c0c9006a20494130108681" + "8080001a2001204a10b28080800020004180d7006a204b41301086818080" + "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" + "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" + "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" + "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" + "38200041c0c9006a200041c0db006a10b380808000203341004130108581" + "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" + "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" + "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" + "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" + "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" + "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" + "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" + "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" + "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" + "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" + "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" + "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" + "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" + "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" + "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" + "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" + "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" + "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" + "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" + "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" + "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" + "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" + "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" + "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" + "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" + "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" + "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" + "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" + "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" + "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" + "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" + "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" + "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" + "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" + "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" + "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" + "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" + "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" + "20004180d7006a200041a0e8006a10b38080800020064100413010858180" + "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" + "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" + "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" + "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" + "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" + "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" + "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" + "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" + "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" + "410041c001108581808000213d200320004180d7006a200041c0db006a10" + "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" + "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" + "001a2036204410b280808000200041c0e4006a200841301086818080001a" + "2001204510b28080800020004180d7006a203a41301086818080001a2000" + "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" + "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" + "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" + "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" + "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" + "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" + "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" + "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" + "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" + "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" + "204710b280808000200041c0e7006a200341301086818080001a20302048" + "10b28080800020004180e0006a204941301086818080001a2001204a10b2" + "8080800020004180d7006a204b41301086818080001a200041c0db006a41" + "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" + "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" + "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" + "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" + "41c0db006a10b3808080002033410041301085818080002133200042ba8a" + "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" + "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" + "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" + "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" + "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" + "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" + "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" + "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" + "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" + "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" + "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" + "8407370380572007410041c00110858180800021072032200041c0e4006a" + "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" + "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" + "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" + "301086818080001a2036204d10b280808000200041c0e4006a203b413010" + "86818080001a20004180d7006a410041301085818080001a200042c18e8e" + "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" + "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" + "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" + "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" + "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" + "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" + "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" + "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" + "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" + "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" + "306a204e10b280808000200041e0e6006a203241301086818080001a2006" + "204f10b280808000200041c0e7006a205041301086818080001a20362051" + "10b280808000200041c0e4006a205241301086818080001a20004180d700" + "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" + "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" + "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" + "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" + "20004180d7006a10b3808080002001410041301085818080002101200042" + "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" + "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" + "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" + "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" + "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" + "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" + "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" + "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" + "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" + "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" + "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" + "aaa584073703c0642037410041c00110858180800021372053200041a0e2" + "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" + "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" + "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" + "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" + "b28080800020004180d7006a203841301086818080001a2033205810b280" + "808000200041c0db006a203441301086818080001a200041a0e8006a4100" + "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" + "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" + "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" + "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" + "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" + "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" + "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" + "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" + "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" + "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" + "004180e0006a205641301086818080001a2005205b10b280808000200041" + "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" + "006a205e41301086818080001a200041a0e8006a41004130108581808000" + "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" + "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" + "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" + "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" + "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" + "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" + "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" + "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" + "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" + "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" + "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" + "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" + "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" + "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" + "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" + "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" + "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" + "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" + "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" + "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" + "80800020004180d7006a205441301086818080001a203320004180c5006a" + "41f0016a10b280808000200041c0db006a205541301086818080001a2000" + "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" + "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" + "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" + "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" + "80d7006a200041a0e8006a10b38080800020344100413010858180800021" + "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" + "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" + "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" + "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" + "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" + "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" + "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" + "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" + "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" + "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" + "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" + "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" + "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" + "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" + "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" + "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" + "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" + "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" + "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" + "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" + "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" + "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" + "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" + "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" + "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" + "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" + "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" + "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" + "200510b28080800020004180e0006a200041a0e8006a4130108681808000" + "1a2036204410b280808000200041c0e4006a200841301086818080001a20" + "01204510b28080800020004180d7006a203a41301086818080001a200041" + "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" + "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" + "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" + "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" + "e4006a200041c0db006a10b3808080002033410041301085818080002104" + "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" + "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" + "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" + "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" + "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" + "b280808000200041c0e7006a200341301086818080001a2030204810b280" + "80800020004180e0006a204941301086818080001a2001204a10b2808080" + "0020004180d7006a204b41301086818080001a200041c0db006a41004130" + "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" + "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" + "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" + "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" + "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" + "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" + "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" + "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" + "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" + "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" + "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" + "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" + "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" + "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" + "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" + "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" + "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" + "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" + "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" + "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" + "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" + "00200020023a00a068024020024101470d00200041a0e8006a200041f829" + "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" + "200041f8326a10c2808080002008203f10c2808080007110a38080800020" + "3a204010c2808080007110a3808080002003203e10c28080800020492041" + "10c2808080007110a380808000204b204210c2808080007110a380808000" + "7110a380808000210220002802a82520002802ac25108580808000200028" + "029825200028029c25108580808000200028028825200028028c25108580" + "80800020002802f82420002802fc24108580808000202f202e1086808080" + "0020002802c01c20002802c41c10828080800020002802a01520002802a4" + "15108480808000200028028815200028028c1510848080800020002802b4" + "1320002802b81310848080800020002802bc1220002802c0121084808080" + "0020002802e41020002802e810108480808000200028028c0f2000280290" + "0f10848080800020002802940e20002802980e108480808000200028029c" + "0d20002802a00d108480808000200241ff017141004721020c080b200041" + "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" + "109680808000000b200041c0c0006a200041b8256a203610b48080800020" + "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" + "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" + "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" + "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" + "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" + "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" + "006a10b7808080002005200041c0db006a41a0021086818080001a200041" + "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" + "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" + "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" + "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" + "8180800020004180026a200942004285b087cd8081f69c33420010878180" + "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" + "00200041e0016a200029039002220e20022903087c220b200041a0026a41" + "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" + "7e220942004281808080704200108781808000200041d0016a2009420042" + "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" + "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" + "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" + "29038002221220022903107c220a20004190026a41086a290300200b200e" + "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" + "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" + "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" + "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" + "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" + "4200108781808000200041f0006a20002903b001221020002903f0012211" + "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" + "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" + "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" + "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" + "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" + "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" + "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" + "f3004200108781808000200041a0016a41086a290300210d200041306a41" + "086a290300210f200029039001211720002903502114200041d0006a4108" + "6a2903002115200020002903602216200041f0016a41086a290300200e20" + "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" + "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" + "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" + "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" + "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" + "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" + "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" + "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" + "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" + "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" + "200041a0e8006a200041f8326a10a280808000200020002903b868370398" + "4e200020002903b0683703904e200020002903a8683703884e2000200029" + "03a0683703804e200041c0db006a410041301085818080001a2035410041" + "301085818080001a203441e086c0800041301086818080001a4101210220" + "0041013602e052200041003602d452200041003602c852200020333602c4" + "52200020004180ce006a3602c05203400240024020020d00200041086a20" + "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" + "0041003602e0520240024020002802c852450d00200041286a2002203210" + "c58080800020002802280d01200028022c21020b024020002802c0522201" + "450d0020002802c45221030340024020032001470d00200020033602c452" + "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" + "0041206a2002203210c580808000024020002802200d0020002802242102" + "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" + "52450d00200041186a2002203110c58080800020002802180d0120002802" + "1c21020b41002103200041003602d45220020d010b200041106a200041c0" + "d2006a10c48080800020002d0011210120002d001021030b024020034101" + "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" + "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" + "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" + "326a200110c880808000200041c0db006a200041a0e8006a419001108681" + "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" + "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" + "c78080800020004180236a200041f8326a4190011086818080001a200441" + "016a21040c000b0b2000420137028433200041013602fc322000419482c0" + "80003602f83220004181808080003602a4682000200041a0e8006a360280" + "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" + "f8326a419c82c08000109680808000000b200220002802b40641b092c080" + "00108c80808000000b202f202e10868080800020002802c01c20002802c4" + "1c10828080800020002802a01520002802a4151084808080002000280288" + "15200028028c1510848080800020002802b41320002802b8131084808080" + "0020002802bc1220002802c01210848080800020002802e41020002802e8" + "10108480808000200028028c0f20002802900f1084808080002000280294" + "0e20002802980e108480808000200028029c0d20002802a00d1084808080" + "00410021020b200041e0ec006a24808080800020020ba60201087e200020" + "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" + "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" + "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" + "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" + "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" + "54ad7c427f7c220242818080807083220720037c22083703002000200242" + "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" + "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" + "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" + "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" + "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" + "8080808000200241013b010c200220013602082002200036020420024104" + "6a10f380808000000b6501017f23808080800041306b2202248080808000" + "200041306a200141306a41301086818080001a200041e0006a41e086c080" + "00200241004130108581808000220220012d006010908080800020002001" + "41301086818080001a200241306a2480808080000b25002000200141f087" + "c0800010df808080002000200110a98080800010d2808080003a00300be7" + "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" + "200229030022044200200129030022054200108781808000200341d0046a" + "20022903082206420020054200108781808000200341e0046a2002290310" + "2207420020054200108781808000200341f0046a20022903182208420020" + "05420010878180800020034180056a200229032022094200200542001087" + "8180800020034190056a2002290328220a42002005420010878180800020" + "0341a0056a20012903082205420020044200108781808000200341f0056a" + "2005420020064200108781808000200341c0066a20054200200742001087" + "8180800020034190076a2005420020084200108781808000200341e0076a" + "2005420020094200108781808000200341b0086a20054200200a42001087" + "81808000200341b0056a2001290310220542002004420010878180800020" + "034180066a2005420020064200108781808000200341d0066a2005420020" + "074200108781808000200341a0076a200542002008420010878180800020" + "0341f0076a2005420020094200108781808000200341c0086a2005420020" + "0a4200108781808000200341c0056a200129031822054200200442001087" + "8180800020034190066a2005420020064200108781808000200341e0066a" + "2005420020074200108781808000200341b0076a20054200200842001087" + "8180800020034180086a2005420020094200108781808000200341d0086a" + "20054200200a4200108781808000200341d0056a20012903202205420020" + "044200108781808000200341a0066a200542002006420010878180800020" + "0341f0066a2005420020074200108781808000200341c0076a2005420020" + "08420010878180800020034190086a200542002009420010878180800020" + "0341e0086a20054200200a4200108781808000200341e0056a2001290328" + "2205420020044200108781808000200341b0066a20054200200642001087" + "8180800020034180076a2005420020074200108781808000200341d0076a" + "2005420020084200108781808000200341a0086a20054200200942001087" + "81808000200341f0086a20054200200a4200108781808000200341b0046a" + "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" + "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" + "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" + "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" + "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" + "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" + "10878180800020034190046a200341b0046a41086a290300200520032903" + "b00422047c200454ad7c220720032903a0047c220520032903a005220820" + "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" + "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" + "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" + "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" + "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" + "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" + "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" + "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" + "20032903b0037c220520032903f005220d200341d0046a41086a29030020" + "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" + "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" + "7c220a20034190046a41086a290300200329039004220420067c200454ad" + "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" + "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" + "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" + "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" + "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" + "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" + "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" + "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" + "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" + "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" + "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" + "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" + "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" + "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" + "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" + "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" + "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" + "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" + "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" + "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" + "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" + "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" + "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" + "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" + "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" + "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" + "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" + "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" + "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" + "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" + "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" + "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" + "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" + "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" + "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" + "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" + "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" + "06201154ad7c22192003290390027c221120034180036a41086a29030020" + "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" + "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" + "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" + "032903607c220520034180056a41086a290300200d201354ad7c22172003" + "290390057c221020032903e0077c221220034190076a41086a290300200f" + "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" + "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" + "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" + "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" + "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" + "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" + "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" + "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" + "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" + "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" + "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" + "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" + "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" + "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" + "03002122200341b0086a41086a290300212320032903c008212420032903" + "8008212520032903c0072126200329038007212720032903d00221282003" + "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" + "076a41086a290300212b200341c0076a41086a290300212c20034180086a" + "41086a290300212d200341c0086a41086a290300212e20032903d008212f" + "200329039008213020032903d007213120032903e0012132200341e0016a" + "41086a290300213320032903f0012134200341f0016a41086a2903002135" + "20034180026a41086a2903002136200341d0076a41086a29030021372003" + "4190086a41086a2903002138200341d0086a41086a290300213920032903" + "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" + "00213d200329038001213e20034180016a41086a290300213f2003290390" + "01214020034190016a41086a2903002141200341a0016a41086a29030021" + "42200341a0086a41086a2903002143200341e0086a41086a290300214420" + "032903f008214520032903002146200341086a2903002147200329031021" + "48200341106a41086a29030021492003290320214a200341206a41086a29" + "0300214b2003290330214c200341306a41086a290300214d200320032903" + "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" + "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" + "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" + "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" + "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" + "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" + "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" + "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" + "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" + "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" + "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" + "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" + "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" + "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" + "1a370380092003204c204020342028202720262025202420232004204f54" + "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" + "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" + "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" + "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" + "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" + "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" + "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" + "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" + "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" + "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" + "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" + "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" + "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" + "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" + "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" + "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" + "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" + "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" + "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" + "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" + "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" + "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" + "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" + "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" + "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" + "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" + "b0096a2480808080000b3701017f20004100413010858180800021004101" + "10a3808080002101200041306a41e086c0800041301086818080001a2000" + "20013a00600b3a01017f23808080800041306b2201248080808000200020" + "0141004130108581808000220110db808080002100200141306a24808080" + "800020000b42002000200120022003109080808000200041306a20014130" + "6a200241306a2003109080808000200020022d006020012d006022027341" + "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" + "808080800020012d00c0012103410021042002410010a3808080003a0088" + "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" + "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" + "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" + "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" + "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" + "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" + "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" + "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" + "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" + "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" + "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" + "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" + "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" + "a3f9753703c80120022001200241c8016a200310d980808000200241c005" + "6a200210e880808000200241c8016a41c400410841a002108e8080800020" + "022802cc0121010240024020022802c8014101460d0020022802d0012105" + "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" + "026a200241c8011086818080002106200241003602b805200220053602b4" + "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" + "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" + "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" + "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" + "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" + "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" + "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" + "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" + "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" + "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" + "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" + "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" + "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" + "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" + "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" + "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" + "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" + "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" + "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" + "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" + "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" + "00200241a0156a20024180166a200241e0076a10bb808080002005200241" + "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" + "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" + "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" + "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" + "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" + "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" + "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" + "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" + "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" + "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" + "e2808080002008200241e0166a200241e0166a10bc808080002007200241" + "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" + "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" + "022802b80522013602e016200141c400470d01200020033a000c2000200b" + "290200370200200041086a200b41086a280200360200200241c0176a2480" + "808080000f0b200120022802d00141888cc08000108c80808000000b2002" + "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" + "7f2380808080004180036b2201248080808000200141a0026a41306a4100" + "41301085818080001a200141a0026a41e086c0800041301086818080001a" + "2001200141a0026a41e000108681808000220141e0006a410041c0011085" + "818080001a200041a0026a410041a0021085818080001a2000200141a002" + "1086818080001a20014180036a2480808080000bd70301157f2380808080" + "0041c00d6b2203248080808000200241e0036a210420024180036a210520" + "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" + "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" + "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" + "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" + "c0016a2112200341e0006a21132001280200211420012802082115034002" + "4020090d002001201541016a3602082000200241c0041086818080001a20" + "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" + "607210a380808000211720032002201641046a280200201641086a280200" + "201541cc8cc0800010ae80808000201428020010af808080002003418009" + "6a20032002201710b080808000201120132008201710b080808000201020" + "122007201710b080808000200341a00b6a200f2006201710b08080800020" + "0c200e2005201710b080808000200b200d2004201710b080808000200341" + "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" + "1086818080001a2002200341c0046a41c0041086818080001a200941786a" + "2109201441086a21140c000b0b22000240200120024b0d00200220012003" + "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" + "e00f6b22042480808080002004200241e000108681808000220441e0006a" + "200241e0006a41e0001086818080001a2004200341306a220510dd808080" + "00200441306a200510dd80808000200441e0006a200310dd808080002004" + "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" + "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" + "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" + "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" + "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" + "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" + "1086818080001a20044180066a200441e0006a200410bc80808000200441" + "e0066a2003200110c38080800020044180096a200441e0066a2002200441" + "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" + "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" + "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" + "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" + "e00f6a2480808080000b2700200020012002200310908080800020004130" + "6a200141306a200241306a20031090808080000b30002000200110e28080" + "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" + "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" + "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" + "ffd51e7c2206200420028420012903102207842001290318220884200129" + "03202209842001290328220a845022011b3703082000420042abd5feffff" + "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" + "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" + "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" + "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" + "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" + "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" + "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" + "01057f23808080800041c0016b2203248080808000200341306a22042001" + "41306a220510b280808000200320014130108681808000220341e0006a41" + "306a200241306a220641301086818080002107200341e0006a2002413010" + "86818080001a20002003200341e0006a10e1808080002004200541301086" + "818080001a200320014130108681808000220341e0006a20064130108681" + "8080001a2007200241301086818080001a200041306a2003200341e0006a" + "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" + "41a0086b22032480808080002003200241e0006a220420024190016a2205" + "10b980808000200341306a2004200510b880808000200341e0006a200241" + "c0016a2206200241f0016a220710b98080800020034190016a2006200710" + "b880808000200341e0036a41306a2208200141306a220910b28080800020" + "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" + "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" + "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" + "6a2210200141f0016a221110b280808000200341e0036a20014130108681" + "8080001a20034180066a41306a200241306a221241301086818080002113" + "20034180066a200241301086818080001a20034180066a41e0006a200341" + "90016a4130108681808000211420034180066a4190016a200341e0006a41" + "30108681808000211520034180066a41c0016a200341306a413010868180" + "8000211620034180066a41f0016a200341301086818080002117200341c0" + "016a200341e0036a20034180066a10ea8080800020082009413010868180" + "80002108200b200a41301086818080002118200c200d4130108681808000" + "210b200f200e4130108681808000210f201020114130108681808000210c" + "200341e0036a200141301086818080001a20034180066a20124130108681" + "8080001a20132002413010868180800021102014200341e0006a41301086" + "818080002113201520034190016a41301086818080002114201620034130" + "10868180800021152017200341306a41301086818080002116200341c001" + "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" + "80002018200a41301086818080002117200b200d10b280808000200f200e" + "4130108681808000210f200c201110b280808000200341e0036a20014130" + "1086818080001a20034180066a200441301086818080001a201020054130" + "108681808000211020142012413010868180800021142013200241301086" + "818080002113201520034190016a413010868180800021152016200341e0" + "006a41301086818080002116200341a0026a200341e0036a20034180066a" + "10ea8080800020082009413010868180800021082017200a413010868180" + "80002117200b200d4130108681808000210b200f200e4130108681808000" + "210f200c20114130108681808000210c200341e0036a2001413010868180" + "80001a20034180066a200541301086818080001a20102004413010868180" + "800021102013201241301086818080002113201420024130108681808000" + "21142015200341e0006a41301086818080002115201620034190016a4130" + "1086818080002116200341a0026a41306a200341e0036a20034180066a10" + "ea808080002008200910b2808080002017200a4130108681808000211720" + "0b200d10b280808000200f200e4130108681808000210f200c201110b280" + "808000200341e0036a200141301086818080001a20034180066a20064130" + "1086818080001a2010200741301086818080002110201320044130108681" + "808000211320142005413010868180800021142016201241301086818080" + "002116201520024130108681808000211520034180036a200341e0036a20" + "034180066a10ea808080002008200941301086818080001a2017200a4130" + "1086818080001a200b200d41301086818080001a200f200e413010868180" + "80001a200c201141301086818080001a200341e0036a2001413010868180" + "80001a20034180066a200741301086818080001a20102006413010868180" + "80001a2013200541301086818080001a2014200441301086818080001a20" + "15201241301086818080001a2016200241301086818080001a2003418003" + "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" + "41e000108681808000220241e0006a200341a0026a41e000108681808000" + "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" + "80808080000bb30301027f23808080800041e0066b220224808080800020" + "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" + "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" + "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" + "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" + "6a2003200110b380808000200241e0036a20024180036a20024180036a10" + "bc80808000200241c0046a200110ba8080800020024180066a200241e003" + "6a200241e0036a41306a220110b88080800020024180066a41306a220320" + "0241e0036a200110b980808000200020024180066a200210bc8080800020" + "024180066a200241c0046a200241c0046a41306a220110b8808080002003" + "200241c0046a200110b980808000200041e0006a20024180066a200241c0" + "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" + "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" + "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" + "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" + "80800041e0006b22022480808080002002200141c0016a2203200141f001" + "6a220410b880808000200241306a2003200410b980808000200041c0016a" + "200141e0006a41e0001086818080001a2000200241e00010868180800041" + "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" + "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" + "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" + "0b3601017f23808080800041306b22032480808080002003200210b28080" + "800020002003200110b980808000200341306a2480808080000b87020201" + "7f0c7e23808080800041306b220324808080800020012903082104200229" + "030821052002290328210620012903282107200229032021082001290320" + "21092002290318210a2001290318210b2002290310210c2001290310210d" + "20032002290300220e20012903007c220f3703002003200520047c220420" + "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" + "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" + "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" + "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" + "00200310d680808000200341306a2480808080000b7401027f2380808080" + "004190016b220224808080800020022001200141306a220310b980808000" + "200241306a2001200310b880808000200241e0006a2001200110b9808080" + "0020002002200241306a10a780808000200041306a200241e0006a200310" + "a78080800020024190016a2480808080000b230020002001200210b88080" + "8000200041306a200141306a200241306a10b8808080000b230020002001" + "200210b980808000200041306a200141306a200241306a10b9808080000b" + "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" + "6a200129030822034200200129030022044200108781808000200241d004" + "6a20012903102205420020044200108781808000200241e0046a20012903" + "182206420020044200108781808000200241f0046a200129032022074200" + "2004420010878180800020024180056a2001290328220842002004420010" + "8781808000200241a0056a2005420020034200108781808000200241b005" + "6a2006420020034200108781808000200241c0056a200742002003420010" + "8781808000200241d0056a2008420020034200108781808000200241f005" + "6a200642002005420010878180800020024180066a200742002005420010" + "878180800020024190066a2008420020054200108781808000200241b006" + "6a2007420020064200108781808000200241c0066a200842002006420010" + "8781808000200241e0066a20084200200742001087818080002002419005" + "6a2004420020044200108781808000200241e0056a200342002003420010" + "8781808000200241a0066a2005420020054200108781808000200241d006" + "6a2006420020064200108781808000200241f0066a200742002007420010" + "878180800020024180076a2008420020084200108781808000200241b004" + "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" + "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" + "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" + "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" + "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" + "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" + "00108781808000200241d0036a20024190056a41086a2903002209200229" + "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" + "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" + "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" + "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" + "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" + "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" + "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" + "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" + "220a20022903e005220b20022903d004220c200241c0046a41086a290300" + "7c22074201862008423f88847c22082004200954ad7c2209200229039004" + "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" + "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" + "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" + "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" + "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" + "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" + "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" + "81808000200241c0026a20022903a003220f200241e0056a41086a290300" + "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" + "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" + "423f88847c22072002290380047c220b20024190046a41086a290300200d" + "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" + "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" + "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" + "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" + "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" + "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" + "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" + "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" + "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" + "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" + "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" + "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" + "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" + "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" + "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" + "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" + "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" + "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" + "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" + "290300200b201054ad7c22182002290380057c220720022903c0057c220e" + "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" + "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" + "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" + "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" + "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" + "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" + "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" + "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" + "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" + "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" + "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" + "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" + "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" + "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" + "200241d0066a41086a290300211920024180066a41086a290300211a2002" + "41d0056a41086a290300211b200229039006211c20022903b006211d2002" + "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" + "03002120200241b0066a41086a290300212120024190066a41086a290300" + "212220022903c006212320022903f006210320022903f0012124200241f0" + "016a41086a2903002125200229038002212620024180026a41086a290300" + "212720024190026a41086a2903002128200241c0066a41086a2903002129" + "20022903e006212a200241f0066a41086a290300212b200229038001212c" + "20024180016a41086a290300212d200229039001212e20024190016a4108" + "6a290300212f20022903a0012130200241a0016a41086a29030021312002" + "41b0016a41086a2903002132200241e0066a41086a290300213320022903" + "8007211120022903102134200241106a41086a2903002135200229032021" + "36200241206a41086a290300213720022903302138200241306a41086a29" + "030021392002290340213a200241c0006a41086a290300213b2002200229" + "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" + "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" + "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" + "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" + "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" + "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" + "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" + "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" + "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" + "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" + "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" + "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" + "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" + "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" + "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" + "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" + "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" + "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" + "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" + "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" + "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" + "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" + "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" + "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" + "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" + "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" + "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" + "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" + "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" + "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" + "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" + "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" + "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" + "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" + "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" + "076a10d680808000200241c0076a2480808080000be60101037f23808080" + "80004180126b220324808080800020032001200210b480808000200341a0" + "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" + "2002200510c380808000200341e0066a2004200110c38080800020034180" + "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" + "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" + "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" + "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" + "20034180126a2480808080000b3c01017f23808080800041c0046b220224" + "808080800020022000200110be808080002000200241c004108681808000" + "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" + "022480808080002002200141e000108681808000220241e0006a200141e0" + "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" + "001086818080001a200241a0026a200141a0026a220541e0001086818080" + "001a20024180036a20014180036a220641e0001086818080001a200241e0" + "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" + "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" + "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" + "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" + "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" + "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" + "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" + "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" + "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" + "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" + "200241a0086a200841e0001086818080001a200241e0006a20024180066a" + "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" + "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" + "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" + "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" + "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" + "808000200241a00b6a41306a200241a0086a200110b98080800020024180" + "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" + "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" + "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" + "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" + "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" + "8080800020024180096a200241e0001086818080001a20024180096a41e0" + "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" + "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" + "86818080001a200820024180036a41e0001086818080001a200241a00b6a" + "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" + "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" + "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" + "8080808000200210ac8080800041002103413f2104034002400240024020" + "04417f460d0042012004413f71ad8642808084808080c080528321052003" + "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" + "8080002000200241a0021086818080001a20024180096a2480808080000f" + "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" + "80001a410121030b02402005500d002002200110bf808080000b2004417f" + "6a21040c000b0b23002000200110db80808000200041306a200141306a10" + "db808080007110a3808080000b3e0020002001200210bc80808000200041" + "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" + "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" + "2202248080808000200141086a21030340200241086a200310e680808000" + "02400240024020022d0008450d0020022d00092101410121040c010b0240" + "20012802002204450d00200420012802042205470d020b2002200141146a" + "10e68080800020022d0001210120022d000021040b200020013a00012000" + "20044101713a0000200241106a2480808080000f0b200142808080808001" + "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" + "23808080800041106b220324808080800041002104410121054100210602" + "400340200120062207460d01200341086a200210d080808000200741016a" + "210620032d00080d000b200120076b2104410021050b2000200436020420" + "002005360200200341106a2480808080000bf50401037f23808080800041" + "b0096b22022480808080002002200141306a220310bd8080800020024130" + "6a2002200210b980808000200241e0006a200241306a200241306a10b980" + "80800020024190016a200241e0006a200241e0006a10b980808000200241" + "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" + "808000200241d0086a200241f0016a200241f0016a10b980808000200241" + "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" + "80096a20024180096a10b980808000200241a0026a200241c0076a200241" + "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" + "80800020024180036a2002200241a0026a10b980808000200241b0036a20" + "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" + "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" + "b980808000200241c0046a200220024190046a10b880808000200241f004" + "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" + "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" + "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" + "024180066a20024180066a10b980808000200241b0066a41306a200241a0" + "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" + "86818080001a200241c0076a410041301085818080001a200241c0076a41" + "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" + "301086818080001a2000200241b0066a200241c0076a200410a980808000" + "10c880808000200241b0096a2480808080000bf60601057f238080808000" + "41900d6b220324808080800020032001200210a780808000200341306a20" + "0141306a2204200241306a220510a780808000200341e0006a200141e000" + "6a2206200241e0006a220710a78080800020034190016a2001200410b980" + "808000200341c0016a2002200510b980808000200341f0016a2003419001" + "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" + "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" + "036a2004200610b980808000200341b0036a2005200710b9808080002003" + "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" + "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" + "90046a10b880808000200341f0046a2001200610b980808000200341a005" + "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" + "a78080800020034180066a2003200341e0006a10b980808000200341b006" + "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" + "b98080800020034190076a200341e0066a200310b980808000200341800c" + "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" + "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" + "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" + "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" + "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" + "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" + "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" + "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" + "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" + "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" + "00200341e0096a200341d0086a20034190076a10a780808000200341900a" + "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" + "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" + "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" + "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" + "2480808080000b41002000200120022003109080808000200041306a2001" + "41306a200241306a2003109080808000200041e0006a200141e0006a2002" + "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" + "280200220241787122006a21030240024020024101710d00200241027145" + "0d012001280200220220006a21000240200120026b2201410028029c97c0" + "8000470d0020032802044103714103470d014100200036029497c0800020" + "032003280204417e7136020420012000410172360204200320003602000f" + "0b2001200210cc808080000b024002400240024002400240200328020422" + "024102710d00200341002802a097c08000460d022003410028029c97c080" + "00460d0320032002417871220210cc808080002001200220006a22004101" + "72360204200120006a20003602002001410028029c97c08000470d014100" + "200036029497c080000f0b20032002417e71360204200120004101723602" + "04200120006a20003602000b2000418002490d0220012000108481808000" + "41002101410041002802b497c08000417f6a22003602b497c0800020000d" + "04024041002802fc94c080002200450d00410021010340200141016a2101" + "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" + "80000f0b410020013602a097c080004100410028029897c0800020006a22" + "0036029897c080002001200041017236020402402001410028029c97c080" + "00470d004100410036029497c080004100410036029c97c080000b200041" + "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" + "02410028029897c0800022054129490d0241f494c0800021010340024020" + "01280200220320004b0d002000200320012802046a490d040b2001280208" + "21010c000b0b4100200136029c97c080004100410028029497c080002000" + "6a220036029497c0800020012000410172360204200120006a2000360200" + "0f0b200041f80171418495c080006a210302400240410028028c97c08000" + "220241012000410376742200710d004100200220007236028c97c0800020" + "0321000c010b200328020821000b200320013602082000200136020c2001" + "200336020c200120003602080f0b024041002802fc94c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff" + "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" + "c080000b0b4d01017f23808080800041206b220224808080800020024100" + "36021020024101360204200242043702082002412e36021c200220003602" + "182002200241186a3602002002200110a480808000000b800601057f0240" + "024002402000417c6a220328020022044178712205410441082004410371" + "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" + "02410b6a4178712002410b491b210102400240024020060d002001418002" + "490d0120052001410472490d01200520016b418180084f0d010c020b2000" + "41786a220720056a21060240024002400240200520014f0d002006410028" + "02a097c08000460d032006410028029c97c08000460d0220062802042204" + "4102710d042004417871220420056a22052001490d042006200410cc8080" + "8000200520016b22024110490d0120032001200328020041017172410272" + "360200200720016a22012002410372360204200720056a22052005280204" + "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" + "0d0420032001200441017172410272360200200720016a22052002410372" + "360204200620062802044101723602042005200210cd8080800020000f0b" + "20032005200328020041017172410272360200200720056a220220022802" + "0441017236020420000f0b410028029497c0800020056a22052001490d01" + "02400240200520016b2202410f4b0d002003200441017120057241027236" + "0200200720056a2202200228020441017236020441002102410021010c01" + "0b20032001200441017172410272360200200720016a2201200241017236" + "0204200720056a2205200236020020052005280204417e713602040b4100" + "200136029c97c080004100200236029497c0800020000f0b410028029897" + "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" + "0f0b20052000417c4178200328020022014103711b20014178716a220120" + "0220012002491b1086818080002102200010c980808000200221000b2000" + "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" + "93c0800010ca80808000000b200320012004410171724102723602002007" + "20016a2202200520016b22054101723602044100200536029897c0800041" + "0020023602a097c0800020000b820301047f200028020c21020240024002" + "402001418002490d002000280218210302400240024020022000470d0020" + "0041144110200028021422021b6a28020022010d01410021020c020b2000" + "2802082201200236020c200220013602080c010b200041146a200041106a" + "20021b21040340200421052001220241146a200241106a20022802142201" + "1b210420024114411020011b6a28020022010d000b200541003602000b20" + "03450d020240200028021c41027441f493c080006a22012802002000460d" + "0020034110411420032802102000461b6a20023602002002450d030c020b" + "2001200236020020020d014100410028029097c08000417e200028021c77" + "7136029097c080000c020b0240200220002802082204460d002004200236" + "020c200220043602080f0b4100410028028c97c08000417e200141037677" + "7136028c97c080000f0b20022003360218024020002802102201450d0020" + "022001360210200120023602180b20002802142201450d00200220013602" + "14200120023602180f0b0ba00401027f200020016a210202400240200028" + "020422034101710d002003410271450d012000280200220320016a210102" + "40200020036b2200410028029c97c08000470d0020022802044103714103" + "470d014100200136029497c0800020022002280204417e71360204200020" + "01410172360204200220013602000c020b2000200310cc808080000b0240" + "024002400240200228020422034102710d00200241002802a097c0800046" + "0d022002410028029c97c08000460d0320022003417871220310cc808080" + "002000200320016a2201410172360204200020016a200136020020004100" + "28029c97c08000470d014100200136029497c080000f0b20022003417e71" + "36020420002001410172360204200020016a20013602000b024020014180" + "02490d00200020011084818080000f0b200141f80171418495c080006a21" + "0202400240410028028c97c08000220341012001410376742201710d0041" + "00200320017236028c97c08000200221010c010b200228020821010b2002" + "20003602082001200036020c2000200236020c200020013602080f0b4100" + "20003602a097c080004100410028029897c0800020016a220136029897c0" + "8000200020014101723602042000410028029c97c08000470d0141004100" + "36029497c080004100410036029c97c080000f0b4100200036029c97c080" + "004100410028029497c0800020016a220136029497c08000200020014101" + "72360204200020016a20013602000f0b0bc12502087f017e024002400240" + "02400240024002400240200041f4014b0d00410028028c97c08000220141" + "102000410b6a41f803712000410b491b220241037622037622004103710d" + "012002410028029497c080004d0d0720000d02410028029097c080002200" + "0d030c070b2000410b6a22034178712102410028029097c080002204450d" + "06411f21050240200041f4ffff074b0d002002410620034108766722006b" + "7641017120004101746b413e6a21050b410020026b210302402005410274" + "41f493c080006a28020022010d0041002100410021060c040b4100210020" + "024100411920054101766b2005411f461b74210741002106034002402001" + "220128020441787122082002490d00200820026b220820034f0d00200821" + "032001210620080d004100210320012106200121000c060b200128021422" + "082000200820012007411d764104716a41106a2802002201471b20002008" + "1b2100200741017421072001450d040c000b0b024002402000417f734101" + "7120036a22074103742200418495c080006a22022000418c95c080006a28" + "020022032802082206460d002006200236020c200220063602080c010b41" + "002001417e2007777136028c97c080000b20032000410372360204200320" + "006a22002000280204410172360204200341086a0f0b0240024020002003" + "7441022003742200410020006b72716822084103742203418495c080006a" + "22062003418c95c080006a28020022002802082207460d00200720063602" + "0c200620073602080c010b41002001417e2008777136028c97c080000b20" + "002002410372360204200020026a2207200320026b220241017236020420" + "0020036a20023602000240410028029497c080002201450d002001417871" + "418495c080006a2106410028029c97c08000210302400240410028028c97" + "c08000220841012001410376742201710d004100200820017236028c97c0" + "8000200621010c010b200628020821010b20062003360208200120033602" + "0c2003200636020c200320013602080b4100200736029c97c08000410020" + "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" + "00220628020441787120026b210320062101024002400340024020062802" + "1022000d00200628021422000d0020012802182105024002400240200128" + "020c22002001470d00200141144110200128021422001b6a28020022060d" + "01410021000c020b20012802082206200036020c200020063602080c010b" + "200141146a200141106a20001b21070340200721082006220041146a2000" + "41106a200028021422061b210720004114411020061b6a28020022060d00" + "0b200841003602000b2005450d030240200128021c41027441f493c08000" + "6a22062802002001460d0020054110411420052802102001461b6a200036" + "02002000450d040c030b2006200036020020000d024100410028029097c0" + "8000417e200128021c777136029097c080000c030b200028020441787120" + "026b22062003200620034922061b21032000200120061b2101200021060c" + "000b0b20002005360218024020012802102206450d002000200636021020" + "0620003602180b20012802142206450d0020002006360214200620003602" + "180b02400240024020034110490d0020012002410372360204200120026a" + "22022003410172360204200220036a2003360200410028029497c0800022" + "07450d012007417871418495c080006a2106410028029c97c08000210002" + "400240410028028c97c08000220841012007410376742207710d00410020" + "0820077236028c97c08000200621070c010b200628020821070b20062000" + "3602082007200036020c2000200636020c200020073602080c010b200120" + "0320026a2200410372360204200120006a22002000280204410172360204" + "0c010b4100200236029c97c080004100200336029497c080000b20014108" + "6a0f0b024020002006720d004100210641022005742200410020006b7220" + "04712200450d0320006841027441f493c080006a28020021000b2000450d" + "010b0340200020062000280204417871220120026b220820034922051b21" + "04200120024921072008200320051b21080240200028021022010d002000" + "28021421010b2006200420071b21062003200820071b2103200121002001" + "0d000b0b2006450d000240410028029497c0800022002002490d00200320" + "0020026b4f0d010b20062802182105024002400240200628020c22002006" + "470d00200641144110200628021422001b6a28020022010d01410021000c" + "020b20062802082201200036020c200020013602080c010b200641146a20" + "0641106a20001b21070340200721082001220041146a200041106a200028" + "021422011b210720004114411020011b6a28020022010d000b2008410036" + "02000b02402005450d0002400240200628021c41027441f493c080006a22" + "012802002006460d0020054110411420052802102006461b6a2000360200" + "2000450d020c010b2001200036020020000d004100410028029097c08000" + "417e200628021c777136029097c080000c010b2000200536021802402006" + "2802102201450d0020002001360210200120003602180b20062802142201" + "450d0020002001360214200120003602180b0240024020034110490d0020" + "062002410372360204200620026a22002003410172360204200020036a20" + "0336020002402003418002490d00200020031084818080000c020b200341" + "f80171418495c080006a210202400240410028028c97c080002201410120" + "03410376742203710d004100200120037236028c97c08000200221030c01" + "0b200228020821030b200220003602082003200036020c2000200236020c" + "200020033602080c010b2006200320026a2200410372360204200620006a" + "220020002802044101723602040b200641086a0f0b024002400240024002" + "4002400240410028029497c08000220020024f0d000240410028029897c0" + "8000220020024b0d0041002100200241af80046a22064110764000220341" + "7f4622070d0720034110742201450d07410041002802a497c08000410020" + "064180807c7120071b22086a22003602a497c08000410041002802a897c0" + "800022032000200320004b1b3602a897c0800002400240024041002802a0" + "97c080002203450d0041f494c08000210003402000280200220620002802" + "0422076a2001460d02200028020822000d000c030b0b0240024041002802" + "b097c080002200450d00200020014d0d010b410020013602b097c080000b" + "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" + "94c080004100418495c0800036029095c080004100418c95c08000360298" + "95c080004100418495c0800036028c95c080004100419495c080003602a0" + "95c080004100418c95c0800036029495c080004100419c95c080003602a8" + "95c080004100419495c0800036029c95c08000410041a495c080003602b0" + "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" + "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" + "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" + "95c08000410041b495c080003602bc95c080004100410036028095c08000" + "410041c495c080003602d095c08000410041bc95c080003602c495c08000" + "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" + "410041cc95c080003602d495c08000410041d495c080003602e095c08000" + "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" + "410041dc95c080003602e495c08000410041e495c080003602f095c08000" + "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" + "410041ec95c080003602f495c08000410041f495c0800036028096c08000" + "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" + "410041fc95c0800036028496c080004100418496c0800036029096c08000" + "4100418c96c0800036029896c080004100418496c0800036028c96c08000" + "4100419496c080003602a096c080004100418c96c0800036029496c08000" + "4100419c96c080003602a896c080004100419496c0800036029c96c08000" + "410041a496c080003602b096c080004100419c96c080003602a496c08000" + "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" + "410041b496c080003602c096c08000410041ac96c080003602b496c08000" + "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" + "410041c496c080003602d096c08000410041bc96c080003602c496c08000" + "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" + "410041d496c080003602e096c08000410041cc96c080003602d496c08000" + "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" + "410041e496c080003602f096c08000410041dc96c080003602e496c08000" + "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" + "410041f496c0800036028097c08000410041ec96c080003602f496c08000" + "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" + "410020013602a097c08000410041fc96c0800036028497c0800041002008" + "41586a220036029897c0800020012000410172360204200120006a412836" + "0204410041808080013602ac97c080000c080b200320014f0d0020062003" + "4b0d00200028020c450d030b410041002802b097c0800022002001200020" + "01491b3602b097c08000200120086a210641f494c0800021000240024002" + "400340200028020022072006460d01200028020822000d000c020b0b2000" + "28020c450d010b41f494c080002100024003400240200028020022062003" + "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" + "410020013602a097c080004100200841586a220036029897c08000200120" + "00410172360204200120006a4128360204410041808080013602ac97c080" + "002003200641606a41787141786a22002000200341106a491b2207411b36" + "020441002902f494c080002109200741106a41002902fc94c08000370200" + "20072009370208410020083602f894c08000410020013602f494c0800041" + "00200741086a3602fc94c080004100410036028095c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072003460d07" + "20072007280204417e713602042003200720036b22004101723602042007" + "200036020002402000418002490d00200320001084818080000c080b2000" + "41f80171418495c080006a210602400240410028028c97c0800022014101" + "2000410376742200710d004100200120007236028c97c08000200621000c" + "010b200628020821000b200620033602082000200336020c200320063602" + "0c200320003602080c070b200020013602002000200028020420086a3602" + "04200120024103723602042007410f6a41787141786a2206200120026a22" + "006b2103200641002802a097c08000460d032006410028029c97c0800046" + "0d040240200628020422024103714101470d0020062002417871220210cc" + "80808000200220036a2103200620026a220628020421020b20062002417e" + "7136020420002003410172360204200020036a2003360200024020034180" + "02490d00200020031084818080000c060b200341f80171418495c080006a" + "210202400240410028028c97c08000220641012003410376742203710d00" + "4100200620037236028c97c08000200221030c010b200228020821030b20" + "0220003602082003200036020c2000200236020c200020033602080c050b" + "4100200020026b220336029897c08000410041002802a097c08000220020" + "026a22063602a097c0800020062003410172360204200020024103723602" + "04200041086a21000c060b410028029c97c0800021030240024020002002" + "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" + "20032000410372360204200320006a220020002802044101723602040c01" + "0b4100200636029497c080004100200320026a220136029c97c080002001" + "2006410172360204200320006a2006360200200320024103723602040b20" + "0341086a0f0b2000200720086a360204410041002802a097c08000220041" + "0f6a417871220341786a22063602a097c080004100200020036b41002802" + "9897c0800020086a22036a41086a220136029897c0800020062001410172" + "360204200020036a4128360204410041808080013602ac97c080000c030b" + "410020003602a097c080004100410028029897c0800020036a2203360298" + "97c08000200020034101723602040c010b4100200036029c97c080004100" + "410028029497c0800020036a220336029497c08000200020034101723602" + "04200020036a20033602000b200141086a0f0b41002100410028029897c0" + "8000220320024d0d004100200320026b220336029897c080004100410028" + "02a097c08000220020026a22063602a097c0800020062003410172360204" + "20002002410372360204200041086a0f0b20000b4301017f238080808000" + "41206b2201248080808000200141003602182001410136020c200141d085" + "c0800036020820014204370210200141086a200010a480808000000b4e01" + "037f024020012802042202200128020822034e0d0020012003417f6a2204" + "36020820012802002d000020044107717641017110a38080800021040b20" + "0020043a0001200020022003483a00000b18002001200085220042002000" + "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" + "0202017f017e23808080800041f0006b2206248080808000200620013602" + "0c2006200036020820062003360214200620023602102006410236021c20" + "0641c08dc08000360218024020042802000d002006410336025c200641f4" + "8dc08000360258200642033702642006418280808000ad42208622072006" + "41106aad8437034820062007200641086aad843703402006418380808000" + "ad422086200641186aad843703382006200641386a360260200641d8006a" + "200510a480808000000b200641206a41106a200441106a29020037030020" + "0641206a41086a200441086a290200370300200620042902003703202006" + "410436025c200641a88ec080003602582006420437026420064182808080" + "00ad4220862207200641106aad8437035020062007200641086aad843703" + "482006418480808000ad422086200641206aad8437034020064183808080" + "00ad422086200641186aad843703382006200641386a360260200641d800" + "6a200510a480808000000bb30301037f2380808080004180016b22022480" + "8080800020002802002100024002400240200128021422034110710d0020" + "03412071450d0120002d0000210341810121000340200220006a417e6a20" + "03410f712204413072200441376a2004410a491b3a0000200341ff017122" + "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" + "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" + "00210341810121000340200220006a417e6a2003410f7122044130722004" + "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" + "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" + "810120006b10d58080800021000c010b024002400240024020002d000022" + "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" + "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" + "0d01200321040b200220006a20044130723a00000c010b41012100200220" + "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" + "0041037310d58080800021000b20024180016a24808080800020000bb605" + "01087f20002802142205410171220620046a21070240024020054104710d" + "00410021010c010b0240024020020d00410021080c010b02402002410371" + "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" + "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" + "8080c40020061b2106024020002802000d000240200028021c220a200028" + "0220220820062001200210f480808000450d0041010f0b200a2003200420" + "0828020c11808080800080808080000f0b02400240024002402000280204" + "220a20074b0d00200028021c220a2000280220220820062001200210f480" + "808000450d0141010f0b2005410871450d01200028021021052000413036" + "021020002d0018210b4101210c200041013a0018200028021c2208200028" + "0220220920062001200210f4808080000d02200a20076b41016a210a0240" + "0340200a417f6a220a450d01200841302009280210118180808000808080" + "8000450d000b41010f0b0240200820032004200928020c11808080800080" + "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" + "0a20032004200828020c1180808080008080808000210c0c010b200a2007" + "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" + "01020b2005210a410021050c010b2005410176210a200541016a41017621" + "050b200a41016a210a2000280210210720002802202108200028021c2109" + "02400340200a417f6a220a450d0120092007200828021011818080800080" + "80808000450d000b41010f0b4101210c2009200820062001200210f48080" + "80000d00200920032004200828020c11808080800080808080000d004100" + "210a034002402005200a470d0020052005490f0b200a41016a210a200920" + "0720082802101181808080008080808000450d000b200a417f6a2005490f" + "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" + "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" + "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" + "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" + "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" + "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" + "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" + "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" + "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" + "83420020057d2205200e83843703282000200c2002832005200d83843703" + "202000200a2002832005200b838437031820002008200283200520098384" + "370310200020062002832005200783843703082000200320028320052004" + "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" + "80800021010b20002002360204200020013602000b5a01017f2380808080" + "0041106b2202248080808000200241086a20002000280200410141a00210" + "8b80808000024020022802082200418180808078460d002000200228020c" + "2001108c80808000000b200241106a2480808080000b4800200020012002" + "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" + "80808000200020022d00c00120012d00c001220273410020036b71200273" + "3a00c0010b2b00200020012002200310b080808000200020022d00602001" + "2d0060220273410020036b712002733a00600b8501002000290300200129" + "030010d1808080002000290308200129030810d1808080007110a3808080" + "002000290310200129031010d1808080007110a380808000200029031820" + "0129031810d1808080007110a3808080002000290320200129032010d180" + "8080007110a3808080002000290328200129032810d1808080007110a380" + "8080000bda0602017f067e23808080800041306b22022480808080002002" + "2001290000220342388620034280fe0383422886842003428080fc078342" + "1886200342808080f80f834208868484200342088842808080f80f832003" + "421888428080fc07838420034228884280fe038320034238888484842204" + "37032820022001290008220342388620034280fe03834228868420034280" + "80fc0783421886200342808080f80f834208868484200342088842808080" + "f80f832003421888428080fc07838420034228884280fe03832003423888" + "848484220537032020022001290010220342388620034280fe0383422886" + "842003428080fc0783421886200342808080f80f83420886848420034208" + "8842808080f80f832003421888428080fc07838420034228884280fe0383" + "2003423888848484220637031820022001290018220342388620034280fe" + "0383422886842003428080fc0783421886200342808080f80f8342088684" + "84200342088842808080f80f832003421888428080fc0783842003422888" + "4280fe038320034238888484842207370310200220012900202203423886" + "20034280fe0383422886842003428080fc0783421886200342808080f80f" + "834208868484200342088842808080f80f832003421888428080fc078384" + "20034228884280fe03832003423888848484220837030820022001290028" + "220342388620034280fe0383422886842003428080fc0783421886200342" + "808080f80f834208868484200342088842808080f80f8320034218884280" + "80fc07838420034228884280fe0383200342388884848422033703002002" + "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" + "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" + "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" + "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" + "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" + "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" + "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" + "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" + "3010868180800020013a0030200241306a2480808080000b3901017f2380" + "8080800041306b220224808080800020022000200110a780808000200020" + "0241301086818080001a200241306a2480808080000b9b1602017f177e23" + "808080800041a0056b2201248080808000200141b0046a20002903002202" + "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" + "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" + "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" + "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" + "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" + "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" + "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" + "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" + "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" + "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" + "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" + "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" + "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" + "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" + "0129039004220720002903107c2208200141a0046a41086a290300200520" + "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" + "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" + "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" + "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" + "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" + "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" + "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" + "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" + "200129038004220b20002903187c220420014190046a41086a2903002008" + "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" + "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" + "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" + "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" + "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" + "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" + "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" + "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" + "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" + "6a20012903b002220d20012903f003220e20002903207c22062001418004" + "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" + "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" + "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" + "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" + "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" + "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" + "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" + "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" + "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" + "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" + "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" + "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" + "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" + "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" + "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" + "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" + "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" + "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" + "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" + "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" + "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" + "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" + "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" + "808000200141b0016a41086a290300210d20014190026a41086a29030021" + "0e200141f0026a41086a2903002111200141086a290300211220012903e0" + "022113200129038002211420012903a001211520012903402116200141c0" + "006a41086a2903002117200120012903502218200141e0036a41086a2903" + "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" + "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" + "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" + "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" + "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" + "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" + "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" + "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" + "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" + "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" + "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" + "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" + "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" + "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" + "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" + "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" + "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" + "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" + "20012903207c2202200141306a41086a2903002006200454ad7c20082006" + "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" + "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" + "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" + "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" + "f0046a10d68080800020012903c004220342aad580808080a080237c2003" + "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" + "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" + "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" + "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" + "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" + "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" + "423f872203200320012903e80422057c2203200554ad7c200342b399809a" + "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" + "2100200141a0056a24808080800020000bb60103037f017e017f23808080" + "800041e0006b2203248080808000200341e086c080004130108681808000" + "2104200241306a21050240034020052002460d01200541786a2205290300" + "2106413f210303402003417f460d01200441306a200410bd808080002004" + "200441306a41301086818080002107024020062003413f71ad8842018350" + "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" + "301086818080001a200441e0006a2480808080000b1c00200010a9808080" + "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" + "7e017f027e23808080800041f0016b220324808080800041002104420021" + "05420021064200210742002108420021094200210a02400340200441054b" + "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" + "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" + "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" + "200441e8006a2903004200200f420010878180800020034190016a200441" + "f0006a2903004200200f420010878180800020034180016a200441f8006a" + "2903004200200f4200108781808000200341f0006a20044180016a290300" + "4200200f4200108781808000200341e0006a20044188016a290300420020" + "0f4200108781808000200d200341e0006a41086a29030020032903602210" + "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" + "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" + "01221020087c2209201054ad7c200920034190016a41086a290300200329" + "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" + "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" + "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" + "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" + "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" + "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" + "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" + "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" + "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" + "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" + "bdc4801a4200108781808000200d200341086a2903002003290300221020" + "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" + "097c220a201054ad7c200a200341206a41086a2903002003290320221020" + "087c2209201054ad7c2009200341306a41086a2903002003290330221020" + "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" + "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" + "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" + "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" + "2003200a3703e801200320093703e001200320083703d801200320073703" + "d001200320063703c801200320053703c0012000200341c0016a10d68080" + "8000200341f0016a2480808080000b1c002000200110b280808000200041" + "306a200141306a10b2808080000be20103037f017e017f23808080800041" + "c0016b2203248080808000200341306a410041301085818080001a200341" + "e086c0800041301086818080002104200241306a21050240034020052002" + "460d01200541786a22052903002106413f210303402003417f460d012004" + "41e0006a200410ba808080002004200441e0006a41e00010868180800021" + "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" + "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" + "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" + "000b900202017f017e23808080800041b0036b2202248080808000200241" + "004130108581808000220241e0006a410041301085818080001a20024130" + "6a41e086c0800041301086818080001a20024190016a2001419001108681" + "8080001a42808082808080a080e90021030240034020034200510d012002" + "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" + "011086818080001a02402003420183500d00200241a0026a200220024190" + "016a10c7808080002002200241a0026a4190011086818080001a0b200342" + "018821030c000b0b200241a0026a200210e58080800020002002200241a0" + "026a41900110868180800022024190011086818080001a200241b0036a24" + "80808080000b3400200041306a200141306a10b280808000200041e0006a" + "200141e0006a41301086818080001a2000200141301086818080001a0b6b" + "01037f23808080800041106b22022480808080000240024020012802000d" + "00410021030c010b200241086a200110d0808080004101210320022d0009" + "210420022d00080d0041002103200141003602000b200020043a00012000" + "20033a0000200241106a2480808080000b7501027f23808080800041e000" + "6b2201248080808000200141306a410041301085818080001a200141e086" + "c0800041301086818080002101410110a38080800021022000410041e000" + "108581808000220041e0006a200141e0001086818080001a200020023a00" + "c001200141e0006a2480808080000b920101017f23808080800041c0016b" + "2202248080808000200041e0006a200141e0006a41e0001086818080001a" + "200241306a410041301085818080001a200241e086c08000413010868180" + "8000220241e0006a410041e0001085818080001a200041c0016a20022002" + "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" + "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" + "24808080800020042001200210b380808000200441e0006a200141e0006a" + "2205200310b38080800020044180036a200141c0016a2206200310b38080" + "8000200441a0026a20044180036a20044180036a41306a220710b8808080" + "00200441a0026a41306a20044180036a200710b9808080002000200441a0" + "026a200410bc80808000200441a0026a2002200310bc8080800020044180" + "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" + "10b38080800020044180036a200441c0016a200410bb80808000200041e0" + "006a20044180036a200441e0006a10bb8080800020044180036a20062002" + "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" + "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" + "8080800041f0016b22032480808080004100210442002105420021064200" + "210742002108420021094200210a02400340200441054b0d012004200441" + "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" + "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" + "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" + "03004200200f420010878180800020034190016a200441b0026a29030042" + "00200f420010878180800020034180016a200441b8026a2903004200200f" + "4200108781808000200341f0006a200441c0026a2903004200200f420010" + "8781808000200341e0006a200441c8026a2903004200200f420010878180" + "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" + "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" + "1054ad7c200a20034180016a41086a290300200329038001221020087c22" + "09201054ad7c200920034190016a41086a29030020032903900122102007" + "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" + "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" + "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" + "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" + "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" + "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" + "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" + "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" + "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" + "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" + "8781808000200d200341086a29030020032903002210200a7c220f201054" + "ad7c200f200341106a41086a2903002003290310221020097c220a201054" + "ad7c200a200341206a41086a2903002003290320221020087c2209201054" + "ad7c2009200341306a41086a2903002003290330221020077c2208201054" + "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" + "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" + "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" + "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" + "01200320093703e001200320083703d801200320073703d0012003200637" + "03c801200320053703c0012000200341c0016a10d680808000200341f001" + "6a2480808080000bdc0101027f2380808080004180036b22032480808080" + "002003200110ba80808000200341e0006a200210ba80808000200341c001" + "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" + "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" + "808000200341c0016a2001200210bc80808000200341a0026a200341c001" + "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" + "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" + "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" + "41e0006b220224808080800020022000200110bb808080002000200241e0" + "001086818080001a200241e0006a2480808080000b9f0701037f23808080" + "800041a0116b2201248080808000200141a0026a200010ba808080002001" + "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" + "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" + "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" + "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" + "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" + "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" + "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" + "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" + "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" + "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" + "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" + "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" + "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" + "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" + "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" + "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" + "00210220014180096a200141e0036a200141e0036a10bc80808000200141" + "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" + "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" + "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" + "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" + "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" + "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" + "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" + "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" + "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" + "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" + "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" + "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" + "0010ee80808000200141a0116a2480808080000b4201017f024020002802" + "0822032000280200470d002000200210d8808080000b2000280204200341" + "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" + "7f23808080800041106b2202248080808000200241988cc0800036020c20" + "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" + "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" + "0324808080800020032001360204200320003602002003410236020c2003" + "41a08dc08000360208200342023702142003418580808000ad4220862204" + "2003ad8437032820032004200341046aad843703202003200341206a3602" + "10200341086a200210a480808000000b0f002000280200200110f2808080" + "000be10201067f23808080800041106b2202248080808000410a21030240" + "024020004190ce004f0d00200021040c010b410a21030340200241066a20" + "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" + "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" + "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" + "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" + "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" + "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" + "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" + "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" + "03417f6a22036a20004130723a00000b200141014100200241066a20036a" + "410a20036b10d5808080002100200241106a24808080800020000b380201" + "7f017e23808080800041106b220124808080800020002902002102200120" + "0036020c20012002370204200141046a108181808000000b490002402002" + "418080c400460d002000200220012802101181808080008080808000450d" + "0041010f0b024020030d0041000f0b200020032004200128020c11808080" + "800080808080000b7902017f017e23808080800041306b22032480808080" + "0020032001360204200320003602002003410236020c2003419c91c08000" + "360208200342023702142003418580808000ad4220862204200341046aad" + "84370328200320042003ad843703202003200341206a360210200341086a" + "200210a480808000000b1c0020002802002001200028020428020c118180" + "80800080808080000b14002001200028020020002802041092808080000b" + "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" + "800041306b22032480808080002003200136022c20032000360228200341" + "033a00242003422037021c41002104200341003602142003410036020c02" + "400240024002400240200228021022050d00200228020c2200450d012002" + "280208220120004103746a21062000417f6a41ffffffff017141016a2104" + "2002280200210003400240200041046a2802002207450d00200328022820" + "002802002007200328022c28020c11808080800080808080000d040b2001" + "2802002003410c6a200141046a28020011818080800080808080000d0320" + "0041086a2100200141086a22012006470d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" + "2109200228020021004100210703400240200041046a2802002201450d00" + "200328022820002802002001200328022c28020c11808080800080808080" + "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" + "00003a00242003200141186a2802003602202001410c6a28020021064100" + "210a4100210b024002400240200141086a2802000e03010002010b200641" + "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" + "210b0b200320063602102003200b36020c200141046a2802002106024002" + "40024020012802000e03010002010b2006410374210b2009200b6a220b28" + "02000d01200b28020421060b4101210a0b200320063602182003200a3602" + "142009200141146a2802004103746a22012802002003410c6a200141046a" + "28020011818080800080808080000d02200041086a21002008200741206a" + "2207470d000b0b200420022802044f0d0120032802282002280200200441" + "03746a22012802002001280204200328022c28020c118080808000808080" + "8000450d010b410121010c010b410021010b200341306a24808080800020" + "010b6001027f20002802042102200028020021030240200028020822002d" + "0000450d00200341f48ec080004104200228020c11808080800080808080" + "00450d0041010f0b20002001410a463a0000200320012002280210118180" + "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" + "017f017e23808080800041306b2203248080808000200320013602042003" + "20003602002003410236020c200341d091c0800036020820034202370214" + "2003418580808000ad4220862204200341046aad84370328200320042003" + "ad843703202003200341206a360210200341086a200210a480808000000b" + "ab0201037f2380808080004180016b220224808080800020002802002100" + "024002400240200128021422034110710d0020034120710d012000280200" + "200110f28080800021000c020b2000280200210041810121030340200220" + "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" + "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" + "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" + "0b2000280200210041810121030340200220036a417e6a2000410f712204" + "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" + "042000410476210020040d000b200141fd8ec080004102200220036a417f" + "6a41810120036b10d58080800021000b20024180016a2480808080002000" + "0b0900200041003602000b990101027f23808080800041106b2204248080" + "808000410041002802f093c08000220541016a3602f093c0800002402005" + "4100480d000240024041002d00bc97c080000d00410041002802b897c080" + "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" + "41086a200020011182808080008080808000000b410041003a00bc97c080" + "002002450d00108081808000000b000b0300000b0b002000108281808000" + "000bba0101037f23808080800041106b2201248080808000200028020022" + "0228020c2103024002400240024020022802040e020001020b20030d0141" + "012102410021030c020b20030d0020022802002202280204210320022802" + "0021020c010b20014180808080783602002001200036020c200141868080" + "8000200028020822002d000820002d000910ff80808000000b2001200336" + "0204200120023602002001418780808000200028020822002d000820002d" + "000910ff80808000000b0c00200020012902003703000bc30201047f411f" + "21020240200141ffffff074b0d002001410620014108766722026b764101" + "7120024101746b413e6a21020b200042003702102000200236021c200241" + "027441f493c080006a21030240410028029097c080004101200274220471" + "0d0020032000360200200020033602182000200036020c20002000360208" + "4100410028029097c0800020047236029097c080000f0b02400240024020" + "0328020022042802044178712001470d00200421020c010b200141004119" + "20024101766b2002411f461b742103034020042003411d764104716a4110" + "6a22052802002202450d0220034101742103200221042002280204417871" + "2001470d000b0b20022802082203200036020c2002200036020820004100" + "3602182000200236020c200020033602080f0b2005200036020020002004" + "3602182000200036020c200020003602080baa0301057f02400240200241" + "104f0d00200021030c010b02402000410020006b41037122046a22052000" + "4d0d002004417f6a21062000210302402004450d00200421072000210303" + "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" + "490d000340200320013a0000200341076a20013a0000200341066a20013a" + "0000200341056a20013a0000200341046a20013a0000200341036a20013a" + "0000200341026a20013a0000200341016a20013a0000200341086a220320" + "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" + "41ff017141818284086c2107034020052007360200200541046a22052003" + "490d000b0b200241037121020b02402003200320026a22074f0d00200241" + "7f6a2104024020024107712205450d000340200320013a0000200341016a" + "21032005417f6a22050d000b0b20044107490d000340200320013a000020" + "0341076a20013a0000200341066a20013a0000200341056a20013a000020" + "0341046a20013a0000200341036a20013a0000200341026a20013a000020" + "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" + "7f02400240200241104f0d00200021030c010b02402000410020006b4103" + "7122046a220520004d0d002004417f6a2106200021032001210702402004" + "450d002004210820002103200121070340200320072d00003a0000200741" + "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" + "40200320072d00003a0000200341016a200741016a2d00003a0000200341" + "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" + "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" + "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" + "3a0000200741086a2107200341086a22032005470d000b0b200520022004" + "6b2208417c7122066a210302400240200120046a22074103710d00200520" + "034f0d0120072101034020052001280200360200200141046a2101200541" + "046a22052003490d000c020b0b200520034f0d0020074103742202411871" + "21042007417c71220941046a2101410020026b411871210a200928020021" + "0203402005200220047620012802002202200a7472360200200141046a21" + "01200541046a22052003490d000b0b20084103712102200720066a21010b" + "02402003200320026a22054f0d002002417f6a2108024020024107712207" + "450d000340200320012d00003a0000200141016a2101200341016a210320" + "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" + "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" + "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" + "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" + "00003a0000200341076a200141076a2d00003a0000200141086a21012003" + "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" + "2205200142ffffffff0f8322067e22072003422088220820067e22062005" + "200142208822097e7c22054220867c220a3703002000200820097e200520" + "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" + "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" + "026a2103200020026a210420024110490d014100200441037122056b2106" + "02402004417c71220720044f0d002005417f6a21080240024020050d0020" + "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" + "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" + "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" + "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" + "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" + "09417c7122026b2104410020026b210a02400240200320066a2203410371" + "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" + "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" + "002003410374220241187121052003417c712208417c6a2101410020026b" + "41187121062008280200210203402007417c6a2207200220067420012802" + "002202200576723602002001417c6a210120042007490d000b0b20094103" + "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" + "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" + "20002104200121070240200a450d00200a21032000210420012107034020" + "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" + "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" + "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" + "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" + "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" + "0441076a200741076a2d00003a0000200741086a2107200441086a220420" + "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" + "0a6a22074103710d00200920044f0d012007210103402009200128020036" + "0200200141046a2101200941046a22092004490d000c020b0b200920044f" + "0d0020074103742202411871210a2007417c71220841046a210141002002" + "6b411871210620082802002102034020092002200a762001280200220220" + "067472360200200141046a2101200941046a22092004490d000b0b200341" + "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" + "03024020024107712207450d000340200420012d00003a0000200141016a" + "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" + "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" + "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" + "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" + "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" + "00200141086a2101200441086a22042009470d000c020b0b200420026b22" + "0720044f0d002002417f6a2109024020024103712201450d000340200441" + "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" + "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" + "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" + "00002004417c6a220420012d00003a00002001417c6a210120072004490d" + "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" + "000be8132f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f697465722f7472616974732f6974657261746f722e" + "72730000100058000000b307000009000000000000000000000001000000" + "0800000063616c6c65642060526573756c743a3a756e7772617028296020" + "6f6e20616e2060457272602076616c75652f72757374632f346562313631" + "323530653334306338663438663636653262393239656634613562656437" + "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" + "73000000a30010004a000000a10000001900000054727946726f6d536c69" + "63654572726f720000000100000000000000d80210005e000000b4020000" + "090000002f72757374632f34656231363132353065333430633866343866" + "3636653262393239656634613562656437633138312f6c6962726172792f" + "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" + "0000f6050000150000007372632f6c69622e727300008c0110000a000000" + "1f000000160000008c0110000a00000028000000310000008c0110000a00" + "000028000000440000004661696c656420746f20646573657269616c697a" + "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" + "0000440000008c0110000a000000620000001f0000008c0110000a000000" + "630000000a0000008c0110000a00000064000000170000008c0110000a00" + "0000650000000a0000008c0110000a00000066000000170000008c011000" + "0a000000670000000a0000004661696c656420746f20646573657269616c" + "697a6520614661696c656420746f20646573657269616c697a6520624661" + "696c656420746f20646573657269616c697a652063496e76616c69642062" + "7974657320666f72205363616c61726361706163697479206f766572666c" + "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f737562746c652d" + "322e362e312f7372632f6c69622e72730000000000000400000004000000" + "0900000001000000d80210005e000000bd0200000900000000000000fdff" + "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" + "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" + "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" + "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" + "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" + "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" + "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" + "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" + "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" + "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" + "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" + "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" + "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" + "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" + "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" + "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" + "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" + "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" + "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" + "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" + "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" + "34396366386336623562353537662f626c7331325f3338312d302e382e30" + "2f7372632f70616972696e67732e72730000a00510006600000016020000" + "1500000044000000a0051000660000001b02000009000000a00510006600" + "0000050200001d000000a005100066000000090200001d000000a0051000" + "660000003802000032000000a00510006600000044020000320000002969" + "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" + "20206275742074686520696e64657820697320006d061000200000008d06" + "1000120000000000000004000000040000000a0000003d3d617373657274" + "696f6e20606c6566742020726967687460206661696c65640a20206c6566" + "743a200a2072696768743a200000c206100010000000d206100017000000" + "e90610000900000020726967687460206661696c65643a200a20206c6566" + "743a20000000c2061000100000000c071000100000001c07100009000000" + "e9061000090000003a200000010000000000000048071000020000000000" + "00000c000000040000000b0000000c0000000d000000202020202c0a2828" + "0a3078303030313032303330343035303630373038303931303131313231" + "333134313531363137313831393230323132323233323432353236323732" + "383239333033313332333333343335333633373338333934303431343234" + "333434343534363437343834393530353135323533353435353536353735" + "383539363036313632363336343635363636373638363937303731373237" + "333734373537363737373837393830383138323833383438353836383738" + "3838393930393139323933393439353936393739383939617474656d7074" + "20746f20646976696465206279207a65726f4708100019000000206f7574" + "206f662072616e676520666f7220736c696365206f66206c656e67746820" + "72616e676520656e6420696e6465782000008a0810001000000068081000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e64732061742000ac08100016000000c20810000d00000028292f72" + "757374632f34656231363132353065333430633866343866363665326239" + "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" + "7372632f7261775f7665632e72730000e20810004c000000280200001100" + "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" + "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" + "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" + "4009100029000000a804000009000000617373657274696f6e206661696c" + "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" + "616400004009100029000000ae0400000d00000000c94e046e616d65000e" + "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" + "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" + "4d6170244c5424492443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f72244754243973697a655f68696e7431376833383630386236" + "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" + "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" + "5f62795f7a65726f3137683033346433623765633138373166373545024d" + "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" + "247761736d5f6c69622e2e566572696679696e674b657924475424313768" + "393064303131346662343063613937644503475f5a4e35616c6c6f633772" + "61775f7665633230526177566563496e6e6572244c542441244754243130" + "6465616c6c6f636174653137683235303163353461663065323831336145" + "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" + "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" + "5424313768663462323737666433376462353031654505565f5a4e34636f" + "726533707472353264726f705f696e5f706c616365244c5424626c733132" + "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" + "313768623964653634383231343939353539344506675f5a4e34636f7265" + "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" + "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" + "2e5363616c61722447542424475424313768376265333235646130373238" + "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" + "244324412447542434707573683137686236356465366561306165303964" + "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" + "244c54245424432441244754243867726f775f6f6e653137686531306535" + "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" + "395f244c5424696d706c2475323024247535622454247535642424475424" + "36746f5f76656331376836333665656464383765653761373437450a4d5f" + "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" + "4c542441244754243136776974685f63617061636974795f696e31376861" + "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" + "775f7665633230526177566563496e6e6572244c54244124475424313467" + "726f775f616d6f7274697a65643137686439353064656131373163323030" + "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" + "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" + "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" + "633230526177566563496e6e6572244c5424412447542431357472795f61" + "6c6c6f636174655f696e3137686534626630623334333637646136646345" + "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" + "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" + "6974682e2e4e656724475424336e65673137683434323138626332316532" + "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" + "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" + "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" + "696f6e616c5f73656c656374313768386165306466613830666434313139" + "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" + "46726f6d536c6963654572726f72247532302461732475323024636f7265" + "2e2e666d742e2e44656275672447542433666d7431376863303634386262" + "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" + "747465723370616431376833316663303133336231396665333065451367" + "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" + "2e50616441646170746572247532302461732475323024636f72652e2e66" + "6d742e2e5772697465244754243977726974655f73747231376834353537" + "3732653638643462343039364514385f5a4e36737562746c65313743744f" + "7074696f6e244c5424542447542436657870656374313768623863663632" + "323139313530313333334515495f5a4e34345f244c542424524624542475" + "32302461732475323024636f72652e2e666d742e2e446973706c61792447" + "542433666d74313768353633396538653836623831393165364516355f5a" + "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" + "64313768393337633632373834633734396537664517385f5a4e36737562" + "746c65313743744f7074696f6e244c542454244754243665787065637431" + "3768633764316533383030323138386237654518705f5a4e38315f244c54" + "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" + "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" + "6e646578244c542449244754242447542435696e64657831376862376565" + "6135613738316438393239374519405f5a4e34636f726535736c69636535" + "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" + "376866663036393161306536326561633864451a425f5a4e34636f726535" + "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" + "656e5f6661696c31376861383936346133343065666132346537451b0861" + "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" + "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" + "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" + "325f333831326731384731416666696e65313566726f6d5f636f6d707265" + "7373656431376832333963336331363436646339303436451f355f5a4e38" + "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" + "37683530336430613839336365653362666645203e5f5a4e39626c733132" + "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" + "7365643137686333616566303334336638323663626245211462656c6c6d" + "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" + "367363616c6172365363616c617233737562313768656363643066636134" + "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" + "313768633661663135363636663731396234384524305f5a4e34636f7265" + "3970616e69636b696e673970616e69635f666d7431376862393162616461" + "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" + "3338312e2e67312e2e473150726f6a656374697665247532302461732475" + "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" + "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" + "243466726f6d3137686634356430353636343237373335316445262e5f5a" + "4e39626c7331325f33383132667032467036696e76657274313768366335" + "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" + "6670324670336d756c313768646666623336663036373139613633374528" + "365f5a4e39626c7331325f333831326731384731416666696e6538696465" + "6e746974793137686236366162643638326233626339356345292f5f5a4e" + "39626c7331325f3338313266703246703769735f7a65726f313768333962" + "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" + "325f3338312e2e67312e2e4731416666696e652475323024617324753230" + "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" + "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" + "323735393935653930646636613863452b85015f5a4e3130325f244c5424" + "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" + "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" + "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" + "475424244754243466726f6d313768353930643863663565363536346465" + "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" + "6531376839346666616330666264306163343332452d90015f5a4e313033" + "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" + "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" + "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" + "6f6f70447269766572244754243133646f75626c696e675f737465703137" + "6833346536393232613038346336343933452e705f5a4e38315f244c5424" + "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" + "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" + "646578244c542449244754242447542435696e6465783137686539346538" + "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" + "6972696e677333656c6c3137683264393865303762336132336635313345" + "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e646974696f6e" + "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" + "6c5f73656c6563743137686366633738633362393036656661383945315a" + "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" + "656724475424336e65673137686230666536353636326461326334343345" + "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" + "363566633733316133386134393745332d5f5a4e39626c7331325f333831" + "3366703233467032336d756c313768326433373464346666306563343037" + "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" + "467036247532302461732475323024636f72652e2e6f70732e2e61726974" + "682e2e4d756c24475424336d756c31376865613934393735323931313764" + "3166634535305f5a4e39626c7331325f3338313366703633467036367371" + "756172653137683866633831663539663666313530643145363c5f5a4e39" + "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" + "6573696475653137686432663865613131393236643732653945375a5f5a" + "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" + "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" + "24475424337375623137686137396663636566323762323631323445382b" + "5f5a4e39626c7331325f3338313266703246703373756231376865646439" + "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" + "703246703361646431376863366562626430363731666432643965453a30" + "5f5a4e39626c7331325f3338313366703233467032367371756172653137" + "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" + "333831336670323346703233737562313768636330663365343532313765" + "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" + "646431376864363030363832376137333934646563453d2e5f5a4e39626c" + "7331325f3338313266703246703673717561726531376835616337663530" + "666666393136623065453e605f5a4e36375f244c542424524624626c7331" + "325f3338312e2e667031322e2e4670313224753230246173247532302463" + "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" + "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" + "626c7331325f3338312e2e667031322e2e46703132247532302461732475" + "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" + "2447542431306d756c5f61737369676e3137683037326534616130343436" + "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" + "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" + "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" + "3768613463633461633966316338323538644541635f5a4e39626c733132" + "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" + "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" + "6f746f6d69635f6578703137686166636437313637356662666432373645" + "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" + "32247532302461732475323024737562746c652e2e436f6e7374616e7454" + "696d654571244754243563745f6571313768316264323735363036643361" + "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" + "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" + "726974682e2e416464244754243361646431376835343330336164316564" + "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" + "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" + "4c542449244324552443244624475424247532302461732475323024636f" + "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" + "657261746f7224475424346e657874313768633964373737363930666232" + "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" + "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" + "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" + "637469766536646f75626c65313768386366636435343461313633326664" + "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" + "74697665336164643137686338666437656633383137383263636145487c" + "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024737562746c652e2e436f6e" + "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" + "6974696f6e616c5f73656c65637431376839346663383463303336386533" + "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" + "6c6d616c6c6f63244c542441244754243466726565313768623937643238" + "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" + "673570616e696331376832323065356136376635653365303666454b0e5f" + "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" + "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" + "696e6b5f6368756e6b31376831623634356162376339333032303939454d" + "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" + "6f63244c542441244754243133646973706f73655f6368756e6b31376832" + "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" + "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" + "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" + "35616c6c6f63377261775f766563313763617061636974795f6f76657266" + "6c6f7731376863393936333961626361313337633131455085015f5a4e31" + "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" + "61702e2e4d6170244c542449244324462447542424753230246173247532" + "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" + "2e2e4974657261746f7224475424346e6578743137683161356136633566" + "303263666237373445514d5f5a4e34365f244c5424753634247532302461" + "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" + "54243563745f657131376839613065366130383065643661303532455253" + "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" + "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" + "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" + "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" + "6e6e6572313768363939386636356530343630623966324554475f5a4e34" + "325f244c54242452462454247532302461732475323024636f72652e2e66" + "6d742e2e44656275672447542433666d7431376866396562386538303434" + "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" + "7231327061645f696e74656772616c313768336538303336383966363939" + "303466334556335f5a4e39626c7331325f33383132667032467031307375" + "6274726163745f7031376833353337643137643839306564373430455736" + "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" + "696d706c313768636263383565313966363066396565314558435f5a4e35" + "616c6c6f63377261775f7665633139526177566563244c54245424432441" + "244754243867726f775f6f6e653137683761366133613131343862316565" + "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" + "4732416666696e65247532302461732475323024737562746c652e2e436f" + "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" + "646974696f6e616c5f73656c656374313768346631633532376163323663" + "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" + "696f6e244c54245424475424247532302461732475323024737562746c65" + "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" + "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" + "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" + "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" + "6e7374616e7454696d654571244754243563745f65713137683764613737" + "3038613961336631623237455c335f5a4e39626c7331325f333831326670" + "324670313066726f6d5f6279746573313768663632643265653863383835" + "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" + "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" + "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" + "376862613864393933386331336334313962455e425f5a4e39626c733132" + "5f33383132667032467032356c657869636f67726170686963616c6c795f" + "6c61726765737431376864623239383362653765626662373630455f345f" + "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" + "65313768386339643861353637336531663765654560315f5a4e39626c73" + "31325f33383133667032334670323769735f7a65726f3137683232633162" + "33626231383039373337664561385f5a4e39626c7331325f333831326670" + "324670313573756d5f6f665f70726f647563747331376864373831613962" + "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" + "467032336e6567313768336535623432323139303537623839334563365f" + "5a4e39626c7331325f33383133667032334670323131706f775f76617274" + "696d653137683839356266623030643732663461646145643b5f5a4e3962" + "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" + "62795f78313768313830336335636330383333313036354565665f5a4e37" + "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" + "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" + "61726974682e2e4e656724475424336e6567313768363961333962383136" + "613036626237614566455f5a4e34636f7265346974657238616461707465" + "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" + "3768373932316661373530366638613637624567365f5a4e39626c733132" + "5f333831326732384732416666696e65386964656e746974793137683532" + "3261303037353662633832613639456885015f5a4e3130325f244c542462" + "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" + "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" + "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" + "5424244754243466726f6d31376831393034396666373534383632623533" + "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" + "795f303131376837316231356266356135313961376133456a385f5a4e39" + "626c7331325f333831326670324670313573756d5f6f665f70726f647563" + "747331376862306665663033383436356461336561456b5e5f5a4e39626c" + "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" + "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" + "345f73717561726531376835333530613232303537323261303037456c68" + "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" + "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" + "756241737369676e2447542431307375625f61737369676e313768656138" + "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" + "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" + "726564247532302461732475323024636f72652e2e636f6e766572742e2e" + "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" + "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" + "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" + "724c6f6f70447269766572244754243133646f75626c696e675f73746570" + "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" + "63337665633136566563244c542454244324412447542434707573683137" + "6836633466633030383766393064366561456f355f5a4e34636f72653970" + "616e69636b696e6731336173736572745f6661696c656431376838396134" + "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" + "696e67313870616e69635f626f756e64735f636865636b31376835613339" + "3334316633393435306165354571625f5a4e34636f726533666d74336e75" + "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" + "2e2e446973706c61792475323024666f7224753230247533322447542433" + "666d74313768646131373032323936653330396138624572445f5a4e3463" + "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" + "2475333224475424345f666d743137686531613333633761616434313031" + "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" + "726533666d7439466f726d617474657231327061645f696e74656772616c" + "313277726974655f70726566697831376865323164633232613535336139" + "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" + "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" + "633772756e74696d65313768623465303239633465666136373431314576" + "475f5a4e34325f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e44656275672447542433666d743137683763663234" + "64633163663734653663354577495f5a4e34345f244c5424245246245424" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768363963313766643162653433346236384578585f" + "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" + "7532302461732475323024636f72652e2e666d742e2e446973706c617924" + "47542433666d74313768356530663632333530333933336330664579265f" + "5a4e34636f726533666d7435777269746531376862633530306361396130" + "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" + "6275696c646572732e2e5061644164617074657224753230246173247532" + "3024636f72652e2e666d742e2e577269746524475424313077726974655f" + "6368617231376837323761393336343062616631636662457b305f5a4e34" + "636f726533666d743557726974653977726974655f666d74313768653264" + "32326663306535326231396336457c515f5a4e34636f726535736c696365" + "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" + "38646f5f70616e69633772756e74696d6531376836346563303433376262" + "666263656363457d475f5a4e34325f244c54242452462454247532302461" + "732475323024636f72652e2e666d742e2e44656275672447542433666d74" + "31376837396432393730376137363931633337457e375f5a4e34636f7265" + "3570616e6963313250616e69635061796c6f61643661735f737472313768" + "33653762626665396537333233373036457f3b5f5a4e337374643970616e" + "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" + "68396561303139313462356439323635394580010a727573745f70616e69" + "638101455f5a4e3373746433737973396261636b747261636532365f5f72" + "7573745f656e645f73686f72745f6261636b747261636531376865376239" + "323038656534343338376436458201585f5a4e337374643970616e69636b" + "696e673139626567696e5f70616e69635f68616e646c657232385f247537" + "62242475376224636c6f7375726524753764242475376424313768393666" + "3161333534313164393334366245830183015f5a4e39395f244c54247374" + "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" + "6c65722e2e5374617469635374725061796c6f6164247532302461732475" + "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" + "54243661735f737472313768653362376630636337353061633833394584" + "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f636875" + "6e6b31376866646432333135363766663933346634458501066d656d7365" + "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" + "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" + "6830343030366431613866396435653532458901076d656d6d6f76650712" + "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" + "004d0970726f64756365727302086c616e6775616765010452757374000c" + "70726f6365737365642d6279010572757374631d312e38352e3120283465" + "6231363132353020323032352d30332d31352900490f7461726765745f66" + "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" + "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const sp1WasmHex = + "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" + "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" + "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" + "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" + "000000060100000001010107040800000000000102080202040101000505" + "00010502000a0b0c00010100000100000401040000010100000101000200" + "0100000107010202030d0e000405017001080805030100110619037f0141" + "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" + "790200147370315f67726f746831365f766572696669657200000a5f5f64" + "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" + "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" + "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" + "0120051b3a00000240200504400340024002400240200541016b0e030005" + "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" + "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" + "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" + "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" + "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" + "280200211241e0a5c000280200211f024002400240024002400240024002" + "400240024002400240024002400240024002400240024002400240024002" + "400240024002404184021001220a450d00200a41c1befe827c3600800220" + "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" + "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" + "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" + "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" + "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" + "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" + "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" + "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" + "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" + "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" + "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" + "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" + "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" + "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" + "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" + "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" + "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" + "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" + "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" + "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" + "00370000201d41286a4200370000201d41306a4200370000201d41376a42" + "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" + "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" + "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" + "200a280000470d002001418280c4003602e01c2001410036029c03200142" + "c080808020370294032001205241026a360290032001200141e01c6a3602" + "a003200141106a20014190036a100320012d0010044020012d0011210502" + "4020012802a003280200418280c400470d00200128029403450d00200128" + "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" + "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" + "053a0000200141013602a80c200120023602a40c200141083602a00c2001" + "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" + "0037030020012001290290033703a00f4101210503400240200141086a20" + "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" + "460440024020012802b00f280200418280c400470d0020012802a40f450d" + "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" + "220e280200220c4101742208200541016a220220022008491b2202200241" + "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" + "36021441010541000b360218200f41086a41012002200f41146a1028200f" + "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" + "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" + "20012802a40c21020b200220056a20063a00002001200541016a22053602" + "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" + "80c4004704402002450d02200641046b2802002205417871221241044108" + "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" + "0610040c020b2002418080808078460d0102400240024002402005412046" + "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" + "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" + "28000721262006280003213520062d0002212d20062d0001214720062d00" + "00214820020440200641046b2802002208417871220c4104410820084103" + "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" + "200141206a22062005290300370300200141286a220520232d00003a0000" + "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" + "2006290300370000200141cf006a20052d00003a0000201641086a200141" + "f8006a290000370000201641106a20014180016a29000037000020164118" + "6a20014188016a290000370000200120012d0070411f713a007020162001" + "2900703700002001202436003b2001202636003720012035360033200120" + "2d3a0032200120473a0031200120483a00302001200129031837003f200a" + "290014225742388620574280fe0383422886842057428080fc0783421886" + "205742808080f80f834208868484205742088842808080f80f8320574218" + "88428080fc07838420574228884280fe03832057423888848484215e200a" + "411c6a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" + "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" + "2886842058428080fc0783421886205842808080f80f8342088684842058" + "42088842808080f80f832058421888428080fc07838420584228884280fe" + "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" + "574280fe0383422886842057428080fc0783421886205742808080f80f83" + "4208868484205742088842808080f80f832057421888428080fc07838420" + "574228884280fe03832057423888848484225742a9c0c689aece93b23054" + "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" + "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" + "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" + "18200120573703b8182001205e3703a818200a2900342257423886205742" + "80fe0383422886842057428080fc0783421886205742808080f80f834208" + "868484205742088842808080f80f832057421888428080fc078384205742" + "28884280fe03832057423888848484215e200a413c6a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe038320574238888484842165417f200a290024225742" + "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" + "008584420052205842388620584280fe0383422886842058428080fc0783" + "421886205842808080f80f834208868484205842088842808080f80f8320" + "58421888428080fc07838420584228884280fe0383205842388884848422" + "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" + "57428080fc0783421886205742808080f80f834208868484205742088842" + "808080f80f832057421888428080fc07838420574228884280fe03832057" + "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" + "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" + "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" + "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" + "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" + "222420014188076a290300370000200141bd0c6a222620014180076a2903" + "00370000200141b50c6a2235200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022023290000370000200141851d6a22232024290000370000200141fd" + "1c6a22242026290000370000200141f51c6a222620352900003700002001" + "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" + "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" + "290000370300200141b80a6a2023290000370300200141b00a6a20242900" + "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" + "0054225742388620574280fe0383422886842057428080fc078342188620" + "5742808080f80f834208868484205742088842808080f80f832057421888" + "428080fc07838420574228884280fe038320574238888484842165200a41" + "dc006a290000225742388620574280fe0383422886842057428080fc0783" + "421886205742808080f80f834208868484205742088842808080f80f8320" + "57421888428080fc07838420574228884280fe0383205742388884848421" + "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" + "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" + "422886842058428080fc0783421886205842808080f80f83420886848420" + "5842088842808080f80f832058421888428080fc07838420584228884280" + "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" + "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" + "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" + "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" + "fe0383422886842057428080fc0783421886205742808080f80f83420886" + "8484205742088842808080f80f832057421888428080fc07838420574228" + "884280fe03832057423888848484215a200a41fc006a2900002257423886" + "20574280fe0383422886842057428080fc0783421886205742808080f80f" + "834208868484205742088842808080f80f832057421888428080fc078384" + "20574228884280fe03832057423888848484215c417f200a290064225742" + "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" + "dd008584420052205842388620584280fe0383422886842058428080fc07" + "83421886205842808080f80f834208868484205842088842808080f80f83" + "2058421888428080fc07838420584228884280fe03832058423888848484" + "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" + "2057428080fc0783421886205742808080f80f8342088684842057420888" + "42808080f80f832057421888428080fc07838420574228884280fe038320" + "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" + "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" + "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" + "511b0d070b200a29009401225742388620574280fe038342288684205742" + "8080fc0783421886205742808080f80f8342088684842057420888428080" + "80f80f832057421888428080fc07838420574228884280fe038320574238" + "88848484215b200a419c016a290000225742388620574280fe0383422886" + "842057428080fc0783421886205742808080f80f83420886848420574208" + "8842808080f80f832057421888428080fc07838420574228884280fe0383" + "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" + "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" + "42388620584280fe0383422886842058428080fc07834218862058428080" + "80f80f834208868484205842088842808080f80f832058421888428080fc" + "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" + "91a8b87f54205742388620574280fe0383422886842057428080fc078342" + "1886205742808080f80f834208868484205742088842808080f80f832057" + "421888428080fc07838420574228884280fe038320574238888484842257" + "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" + "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" + "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" + "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" + "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" + "4180076a290300370300200120012903f0063703a00b200120533703a80b" + "200120623703900b2001206a3703800b200120593703f00a2001205c3703" + "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" + "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" + "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" + "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" + "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" + "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" + "2205200141f8066a22062903002257370000200141f80a6a20014188076a" + "2202290300370300200141f00a6a20014180076a22202903003703002001" + "20012903f0063703e00a200120573703e80a200141e0066a200910062001" + "2d00e0060d06200520062903002257370000200141b80b6a200229030037" + "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" + "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" + "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" + "2206200141a0076a290300370000200141d50c6a220220014198076a2903" + "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" + "222220014188076a290300370000200141bd0c6a220920014180076a2903" + "00370000200141b50c6a2223200141f8066a290300370000200120012903" + "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" + "2006290000370000200141951d6a220620022900003700002001418d1d6a" + "22022020290000370000200141851d6a22202022290000370000200141fd" + "1c6a22222009290000370000200141f51c6a220920232900003700002001" + "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" + "2005290000370300200141c8086a2006290000370300200141c0086a2002" + "290000370300200141b8086a2020290000370300200141b0086a20222900" + "00370300200141a8086a2009290000370300200120012900ed1c3703a008" + "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" + "370300200141f8076a200141b80a6a29030037030020014180086a200141" + "c00a6a29030037030020014188086a200141c80a6a290300370300200141" + "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" + "370300200120012903a00a3703e007200141e0066a200141801f6a418001" + "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" + "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" + "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" + "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" + "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" + "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" + "00370300200141800c6a2065370300200141880c6a205e37030020014190" + "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" + "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" + "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" + "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" + "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" + "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" + "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" + "418001104c418001104c1a201241a002460d13201241a102460d14201241" + "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" + "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" + "8080808080023702a00b2005200641087472202041107472200241187472" + "220504404101200541187420054180fe03714108747220054108764180fe" + "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" + "b00f6a210641a40221024100212241102108410021200340202041f6ffff" + "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" + "012d00a00f0d0320052006290000370000200541386a2202200641386a29" + "0000370000200541306a2223200641306a290000370000200541286a2224" + "200641286a290000370000200541206a2226200641206a29000037000020" + "0541186a2235200641186a290000370000200541106a222d200641106a29" + "0000370000200541086a2247200641086a290000370000200141901f6a22" + "48202d290000370300200141981f6a222d2035290000370300200141a01f" + "6a22352026290000370300200141a81f6a22262024290000370300200141" + "b01f6a22242023290000370300200141b81f6a2223200229000037030020" + "0120052900003703801f200120472900003703881f20012802a00b202046" + "044041002108230041206b2203240002400240200141a00b6a221b280200" + "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" + "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" + "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" + "100541000b360218200341086a4110200e200341146a1028200328020841" + "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" + "0328020c210f201b2002360200201b200f360204200341206a2400200128" + "02a40b21080b200820226a220220012903801f370300200241386a202329" + "0300370300200241306a2024290300370300200241286a20262903003703" + "00200241206a2035290300370300200241186a202d290300370300200241" + "106a2048290300370300200241086a20012903881f370300200120204101" + "6a22203602a80b202241406b212220092102200c2020470d000b20012802" + "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" + "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" + "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" + "900c6a290300370100200141c6126a200141880c6a290300370100200141" + "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" + "370100200141ae126a200141f00b6a290300370100200141a6126a200129" + "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" + "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" + "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" + "410272200141e0066a41be03104c1a200120263602d006200120063a0091" + "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" + "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" + "6a2105200141306a2106410021120340230041206b22092400200941186a" + "221b2006290000225342388620534280fe0383422886842053428080fc07" + "83421886205342808080f80f834208868484205342088842808080f80f83" + "2053421888428080fc07838420534228884280fe03832053423888848484" + "370300200941106a2208200641086a290000225342388620534280fe0383" + "422886842053428080fc0783421886205342808080f80f83420886848420" + "5342088842808080f80f832053421888428080fc07838420534228884280" + "fe0383205342388884848437030020092006290010225342388620534280" + "fe0383422886842053428080fc0783421886205342808080f80f83420886" + "8484205342088842808080f80f832053421888428080fc07838420534228" + "884280fe038320534238888484843703082009200641186a290000225342" + "388620534280fe0383422886842053428080fc0783421886205342808080" + "f80f834208868484205342088842808080f80f832053421888428080fc07" + "838420534228884280fe0383205342388884848437030020094201420042" + "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" + "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" + "0300370300200c41186a2009290308370300200c20092903003703102009" + "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" + "2257370300200141f0066a200541106a2903002258370300200120052903" + "00225e3703e0062001200541086a29030022653703e80620202012410574" + "6a220641186a2057370300200641106a2058370300200641086a20653703" + "002006205e370300410121122002410171211f4101210220162106201f45" + "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" + "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" + "352005104c211220624203520d02206a428080808010540d042001419006" + "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" + "386a290300370300200141f01a6a2216201241306a290300370300200141" + "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" + "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" + "2224201241106a290300370300200120122903003703c01a200120124108" + "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" + "370300200141d00c6a2016290300370300200141c80c6a20222903003703" + "00200141c00c6a2009290300370300200141b80c6a202329030037030020" + "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" + "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" + "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" + "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" + "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" + "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" + "ffff01716a22422903002004290300832159204241086a29030020044108" + "6a29030083215302400240027f0240024002400240024020364101714504" + "4041002053205984500d061a200441e0006a200441206a29030037030020" + "0441e8006a200441286a290300370300200441f0006a202b290300370300" + "200441f8006a200441386a29030037030020044180016a200441406b2903" + "0037030020044188016a200441c8006a2903003703002004200429031037" + "035020042004290318370358202e0d010c030b202e450d0120044188026a" + "200441c8006a222e29030037030020044180026a200441406b2250290300" + "370300200441f8016a200441386a2203290300370300200e202b29030037" + "0300200441e8016a200441286a2236290300370300200441e0016a200441" + "206a2242290300370300200420042903183703d801200420042903103703" + "d001200441d8036a224b4200370300200441d0036a220242003703002004" + "42003703f803200442003703f003200442003703e803200442013703e003" + "200442003703c803200442003703c003024002400240200441d0016a2004" + "41c0036a104a450440200e200f104a450d010b204b420037030020024200" + "370300200442003703f803200442003703f003200442003703e803200442" + "013703e003200442003703c803200442003703c003027f0240200441d001" + "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" + "0300204941186a202b41186a290300370300204941106a202b41106a2903" + "00370300204941086a202b41086a290300370300200441a0026a20422903" + "00370300200441a8026a2036290300370300200420042903103703900220" + "0420042903183703980220082102204a0c010b204a4200370300200441a0" + "026a4200370300200441a8026a4200370300204a41086a4200370300204a" + "41106a4200370300204a41186a4200370300200442003703900220044200" + "37039802201b210220490b214b2002420037030820024200370300204b42" + "00370308204b4201370300200441c0036a20044190026a20044190026a10" + "40200441f0026a200441c0036a104120042802f002410171450d01200441" + "c8016a203741386a290300370300200441c0016a203741306a2903003703" + "00200441b8016a203741286a290300370300200441b0016a203741206a29" + "0300370300200441a8016a203741186a290300370300200441a0016a2037" + "41106a29030037030020042037290300370390012004203741086a290300" + "370398010c020b200441a0016a2042290300370300200441a8016a203629" + "0300370300200441b0016a202b290300370300200441b8016a2003290300" + "370300200441c0016a2050290300370300200441c8016a202e2903003703" + "00200420042903103703900120042004290318370398010c010b41c4a0c0" + "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" + "41a8016a290300370300202b200441b0016a2903003703002003200441b8" + "016a2903003703002050200441c0016a290300370300202e200441c8016a" + "290300370300200420042903900137031020042004290398013703182053" + "205984500d04200441e0006a2042290300370300200441e8006a20362903" + "00370300200441f0006a202b290300370300200441f8006a200329030037" + "030020044180016a205029030037030020044188016a202e290300370300" + "20042004290310370350200420042903183703580b200441c0036a200441" + "d0006a200c100c0c020b20532059844200520d002041450d044101213641" + "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" + "0c41306a290300370300200441e8036a200c41286a290300370300200f20" + "0c41206a290300370300200441d8036a200c41186a290300370300200441" + "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" + "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" + "41406b200441f0036a290300370300200441386a200441e8036a29030037" + "0300202b200f290300370300200441286a200441d8036a29030037030020" + "0441206a200441d0036a290300370300200420042903c803370318200420" + "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" + "c0001020000b204141016b21410c010b0b20312004290310370300203141" + "086a2004290318370300203141386a200441c8006a290300370300203141" + "306a200441406b290300370300203141286a200441386a29030037030020" + "3141206a200441306a290300370300203141186a200441286a2903003703" + "00203141106a200441206a290300370300200441a0046a2400200541206a" + "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" + "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" + "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" + "20014190026a100d200141a0186a21024200215c42002154420021532001" + "41e0066a220541386a2903002161200541286a290300215b200529033021" + "592005290320215e027e200529034022652005290350226a84200541c800" + "6a2903002262200541d8006a290300225a84845004402059215c20612154" + "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" + "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" + "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" + "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" + "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" + "3c205e7d0b21612002206a370350200220653703402002205c3703302002" + "20613703202002205a370358200220623703482002205437033820022053" + "37032820022005290300370300200241186a200541186a29030037030020" + "0241106a200541106a290300370300200241086a200541086a2903003703" + "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" + "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" + "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" + "00215c42002153024002400240200141801f6a2202290380012002418801" + "6a290300844200520d0020022903900120024198016a290300844200520d" + "0020022903a001200241a8016a290300844200520d0020022903b0012002" + "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" + "0300215e2002290370215420022903602161200229035022582002290340" + "226a84200241d8006a290300225a200241c8006a29030022628484420052" + "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" + "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" + "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" + "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" + "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" + "542061842059205e84844200520440427f4200427f4200206142788342c7" + "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" + "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" + "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" + "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" + "4180016a22052903003703800120082002290300370300200841b8016a20" + "0541386a290300370300200841b0016a200541306a290300370300200841" + "a8016a200541286a290300370300200841a0016a200541206a2903003703" + "0020084198016a200541186a29030037030020084190016a200541106a29" + "030037030020084188016a200541086a290300370300200841086a200241" + "086a290300370300200841106a200241106a290300370300200841186a20" + "0241186a290300370300200841206a200241206a29030037030020084128" + "6a200241286a290300370300200841306a200241306a2903003703002008" + "41386a200241386a2903003703002008205a370378200820623703702008" + "206a370368200820583703602008205c3703582008206537035020082053" + "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" + "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" + "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" + "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" + "023820004280808080800237023020004100360244200042808080808002" + "37023c41102133200041306a10362000280234223b200141a00f6a220341" + "e000104c1a20004101360238200341e0006a2102200028023c4504402000" + "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" + "022000410136024420002802304101460440200041306a10362000280234" + "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" + "2102200028023c41014604402000413c6a1038200028024021330b203341" + "c0016a200241c001104c1a200341c0046a21022000410236024420002802" + "304102460440200041306a10362000280234213b0b203b41c0016a200241" + "e000104c1a20004103360238200341a0056a2102200028023c4102460440" + "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" + "0341e0066a21022000410336024420002802304103460440200041306a10" + "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" + "200341c0076a2103200028023c41034604402000413c6a10382000280240" + "21330b203341c0046a200341c001104c1a20004104360244200041003602" + "502000428080808080023702482000410036025c20004280808080800237" + "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" + "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" + "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" + "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" + "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" + "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" + "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" + "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" + "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" + "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" + "002802b001410171450d00200041a00d6a2003104120002802a00d410171" + "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" + "00200041f0026a2213201041306a290300370300200041e8026a22092010" + "41286a290300370300200041e0026a2215201041206a2903003703002000" + "41d8026a220f201041186a290300370300200041d0026a2225201041106a" + "290300370300200020102903003703c0022000202e2903003703c8022000" + "280248203946044041002108230041206b220e240002400240200041c800" + "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" + "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" + "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" + "020436021441100541000b360218200e41086a2016200e41146a1037200e" + "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" + "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" + "00200028024c21050b200520394106746a220320002903c0023703002003" + "41386a2011290300370300200341306a2013290300370300200341286a20" + "09290300370300200341206a2015290300370300200341186a200f290300" + "370300200341106a2025290300370300200341086a20002903c802370300" + "2000203941016a2239360250200041a00d6a200d10450240024020002802" + "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" + "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" + "200b4200370300200041b80d6a220d420037030020104200370300203f42" + "00370300203f41086a4200370300203f41106a4200370300203f41186a42" + "00370300203f41206a4200370300203f41286a4200370300200042003703" + "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" + "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" + "104a0d00203d202d104a450d010b203c4200370300200220272903003703" + "00203c41086a4200370300203c41106a4200370300203c41186a42003703" + "00203c41206a4200370300203c41286a4200370300200241386a20274138" + "6a290300370300200241306a202741306a290300370300200241286a2027" + "41286a290300370300200241206a202741206a290300370300200241186a" + "202741186a290300370300200241106a202741106a290300370300200241" + "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" + "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" + "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" + "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" + "370300200020002903b83a3703b846200020002903b03a3703b04620070c" + "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" + "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" + "0300200041e8c6006a4200370300200042003703b046200042003703b846" + "202b41f000104b1a20020b220342003703082003420137030041bda9c000" + "2d00001a41809901100b221e450d0141002109200041003602b819200020" + "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" + "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" + "200d290300370300200041c0c3006a220f20102903003703002000200029" + "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200041a8076a2211200b41186a221b290300370300200041a0076a221320" + "0b41106a22342903003703002000200b41086a2240290300370398072000" + "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" + "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" + "370300200041c01f6a200f29030037030020182000290390073703002018" + "41086a200029039807370300201841106a2013290300370300201841186a" + "2011290300370300200020002903b8433703b81f200020002903b0433703" + "b01f200041e8346a2203200241386a290300370300200041e0346a200241" + "306a290300370300200041d8346a2232200241286a290300370300200041" + "d0346a200241206a290300370300200041c8346a220e200241186a290300" + "370300200041c0346a200241106a2903003703002000200241086a290300" + "3703b834200020022903003703b034200041b0346a20022002102f200041" + "e8376a2219200741386a290300370300200041e0376a200741306a290300" + "370300200041d8376a221a200741286a290300370300200041d0376a2007" + "41206a290300370300200041c8376a222f200741186a2903003703002000" + "41c0376a2230200741106a2903003703002000200741086a2903003703b8" + "37200020072903003703b037200041b0376a20072007102f20002903b837" + "226942018620002903b037226b423f88842155206b420186215402400240" + "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" + "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" + "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" + "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" + "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" + "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" + "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" + "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" + "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" + "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" + "00226742018620002903d037226f423f88842154206f4201862153024002" + "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" + "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" + "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" + "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" + "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" + "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" + "aece93b230511b450d002053215b20542170205921600c010b2055205920" + "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" + "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" + "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" + "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" + "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" + "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" + "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" + "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" + "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" + "30511b450d0120540b215f205921582053215c0c010b2056205420532059" + "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" + "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" + "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" + "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" + "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" + "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" + "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" + "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" + "89aece93b230511b450d002059215a205321590c010b2055205420532059" + "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" + "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" + "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" + "550b200020543703e0222000205a3703d0222000205f3703c02220002058" + "3703b022200020553703e822200020593703d822200020563703c8222000" + "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" + "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" + "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" + "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" + "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" + "0041b0226a102f20002903b825226442018620002903b025226e423f8884" + "2155206e420186215402400240027e20002903c02522704201862064423f" + "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" + "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" + "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" + "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" + "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" + "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" + "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" + "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" + "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" + "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" + "018620002903d0252265423f888421542065420186215302400240200029" + "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" + "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" + "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" + "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d002053216c20542173205921680c010b205520" + "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" + "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" + "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" + "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" + "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" + "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" + "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" + "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" + "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" + "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" + "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" + "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" + "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" + "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" + "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" + "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" + "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" + "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" + "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" + "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" + "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" + "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" + "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" + "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" + "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" + "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" + "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" + "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" + "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" + "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" + "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" + "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" + "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" + "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "0240207320002903e03422597c22552079203229030022687c2263207954" + "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" + "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" + "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" + "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" + "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" + "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" + "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" + "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" + "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" + "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" + "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" + "723703002000207a37039807200020753703900720004190076a42a4fdf9" + "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" + "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "200d20633703002010205d370300200020613703a80d200020573703a00d" + "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" + "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" + "286a220e2013290300370300200620002903a00d370300200641086a2000" + "2903a80d370300200641106a2010290300370300200641186a200d290300" + "37030020002000290398073703b82820002000290390073703b028024002" + "40027e20002903c04722612000290380477c226d204d290300225d204c29" + "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" + "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" + "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" + "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" + "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" + "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" + "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" + "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" + "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" + "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" + "024020002903e047225720002903a0477c226320222903002262201f2903" + "007c225d206254ad205d20002903d04722622000290390477c2261206254" + "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" + "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" + "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" + "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" + "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" + "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" + "89aece93b230511b450d0020612157206221610c010b2063205d20622061" + "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" + "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" + "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" + "630b200d206d3703002010207237030020292061370300200b2057370300" + "203a205d37030020252063370300200041c0c0006a224520723703002000" + "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" + "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" + "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" + "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" + "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" + "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" + "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" + "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" + "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" + "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" + "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" + "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" + "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" + "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" + "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" + "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" + "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" + "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" + "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" + "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" + "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" + "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" + "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" + "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" + "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" + "5d20002903b040216102400240417f20002903c0402267206d8520322903" + "002266206985844200522067206d54206620695420662069511b1b222141" + "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" + "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" + "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" + "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" + "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" + "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" + "02400240417f20002903e0402263206f85201c2903002267206b85844200" + "522063206f542067206b542067206b511b1b2214417f470440201441ff01" + "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" + "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" + "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" + "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" + "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" + "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" + "417f20542070852056206085844200522054207056205620605620562060" + "511b1b2214417f470440201441ff01710d012058206e5820532064582053" + "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" + "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" + "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" + "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" + "64420120727d21722063207e7c216f420120767d2175206020567d205442" + "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" + "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" + "216e205e20587d217e02400240417f2059205c852055205b858442005220" + "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" + "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" + "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" + "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" + "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" + "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" + "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" + "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" + "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" + "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" + "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" + "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" + "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" + "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" + "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" + "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" + "0041e0256a290300370300200041b8076a2217201a290300370300202c20" + "0041d0256a290300370300201120192903003703002013200041c0256a29" + "0300370300200020002903b82537039807200020002903b0253703900720" + "004190076a200041b0256a200041b0256a102f0240417f20542074852056" + "205a858442005220542074542056205a542056205a511b1b2219417f4704" + "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" + "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" + "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" + "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" + "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" + "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" + "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" + "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" + "40417f20592073852055205f858442005220592073542055205f54205520" + "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" + "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" + "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" + "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" + "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" + "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" + "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" + "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" + "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" + "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" + "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" + "0300370300200b20062903003703002029200041d8286a29030037030020" + "3a200041e0286a2903003703002025200041e8286a290300370300200020" + "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" + "b0286a200041b0286a102f20002903980722544201862000290390072253" + "423f888421552053420186215a02400240027e20002903a0072259420186" + "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" + "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" + "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" + "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" + "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" + "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" + "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" + "290300225a42018620002903b007225f423f8884215b205f420186215c02" + "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" + "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" + "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" + "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" + "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" + "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" + "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" + "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" + "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" + "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" + "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" + "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" + "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" + "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" + "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" + "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" + "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" + "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" + "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" + "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" + "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" + "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" + "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" + "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" + "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" + "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" + "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" + "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" + "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" + "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" + "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" + "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" + "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" + "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" + "417f20002903b00d225f205b85200d290300225420568584420052205b20" + "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" + "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" + "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" + "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" + "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" + "2066216c205821660b206220787d215f206120777d2158205420567d205b" + "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" + "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" + "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" + "7f20002903d00d2254205a8520252903002256205585844200522054205a" + "54205520565620552056511b1b2203417f470440200341ff01710d012064" + "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" + "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" + "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" + "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" + "20002066370380472000206c3703f0462000205c20717d37039047200020" + "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" + "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" + "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" + "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" + "03d831200020583703d031200020603703c0312000206b3703c831200020" + "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" + "002164200042003703e831200042003703e031200042003703d831200042" + "013703d031200042003703c831200042003703c031200042003703b83120" + "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" + "714200216c4200216642002167205f2060842053206b8484420052044042" + "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" + "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" + "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" + "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" + "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" + "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" + "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" + "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" + "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" + "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" + "20002903b0432253423f888421552053420186215a02400240027e200029" + "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" + "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" + "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" + "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" + "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" + "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" + "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" + "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" + "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" + "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" + "018620002903d043225f423f88842160205f420186215b02400240200029" + "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" + "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" + "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" + "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" + "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" + "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" + "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" + "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" + "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" + "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" + "0b02400240027e205920687c225b205420737c2269205454ad2069205320" + "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" + "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" + "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" + "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" + "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" + "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" + "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" + "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" + "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" + "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" + "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" + "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" + "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" + "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" + "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" + "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" + "b230511b450d002059215a205321590c010b205520542053205942c7faf3" + "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" + "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" + "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" + "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" + "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" + "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" + "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" + "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" + "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" + "21532019290300215f2003290300215820002903b81c2160201e200941c0" + "016c6a220320553703b80120142903002155201a290300215c200e290300" + "216820002903b01c2174200320543703b001200320593703a8012003205a" + "3703a00120032056370398012003205b3703900120032069370388012003" + "2070370380012003205e3703782003206f3703702003206b370368200320" + "643703602003206c37035820032071370350200320673703482003206637" + "034020032074370300200341386a2058370300200341306a206837030020" + "0341286a205f370300200341206a205c370300200341186a205337030020" + "0341106a2055370300200341086a20603703002000200941016a22033602" + "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" + "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" + "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" + "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" + "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" + "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" + "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" + "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" + "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" + "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" + "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" + "186a290300370300200f203e41106a2903003703002000203e41086a2903" + "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" + "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" + "2903b043370300204020002903b8433703002034200f290300370300201b" + "2015290300370300200020002903b83a3703a80d200020002903b03a3703" + "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" + "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" + "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" + "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" + "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" + "90072015203d41186a290300370300200f203d41106a2903003703002000" + "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" + "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200d202741186a2903003703002010202741106a2903003703" + "00200b20002903b043370300204020002903b8433703002034200f290300" + "370300201b20152903003703002000202741086a2903003703a80d200020" + "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" + "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" + "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" + "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" + "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" + "997f3703b043202f202841186a2903003703002030202841106a29030037" + "03002000202841086a2903003703b837200020282903003703b037200041" + "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2011203229030037030020132045290300370300202c" + "20002903b037370300202c41086a220d20002903b837370300202c41106a" + "22092030290300370300202c41186a2215202f2903003703002000200029" + "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" + "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" + "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" + "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" + "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" + "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" + "03002030204341106a2903003703002000204341086a2903003703b83720" + "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" + "003703002013204441106a290300370300202c20002903b037370300200d" + "20002903b837370300200920302903003703002015202f29030037030020" + "00204441086a2903003703980720002044290300370390072004200041b0" + "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" + "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" + "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" + "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" + "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" + "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" + "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" + "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" + "104c1a205141086a200d280200360200205120002902b019370200200028" + "025420464604404100211b230041206b220e240002400240200041d4006a" + "22162802002209417f460d00410420094101742208200941016a220c2008" + "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" + "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" + "200e201628020436021441100541000b360218200e41086a2008200e4114" + "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" + "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" + "0e41206a2400200028025821380b203820464190016c6a20004180036a41" + "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" + "0b0240024002400240024002400240024002400240024002402046450440" + "2000280254210320004190076a41f002104b1a20030d010c020b41002118" + "200041a0076a41f002104b1a200042003703980720004201370390072046" + "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" + "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" + "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" + "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" + "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" + "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" + "6a2017103b200042003703e849200042003703e049200042003703d84920" + "0042013703d049200042003703c849200042003703c049200042003703b8" + "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" + "386a2203201c41386a290300370300201941306a2202201c41306a290300" + "370300201941286a2207201c41286a290300370300201941206a220b201c" + "41206a290300370300201941186a220d201c41186a290300370300201941" + "106a2211201c41106a290300370300201941086a2206201c41086a290300" + "3703002019201c290300370300201a2017290300370300201a41086a2209" + "201741086a290300370300201a41106a2215201741106a29030037030020" + "1a41186a220f201741186a290300370300201a41206a2225201741206a29" + "0300370300201a41286a2229201741286a290300370300201a41306a222a" + "201741306a290300370300201a41386a221e201741386a29030037030020" + "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" + "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" + "004190076a2017103020452028201a10302040202c20191030200041b0ce" + "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" + "006a200041b0c3006a103c200042003703e846200042003703e046200042" + "003703d846200042013703d046200042003703c846200042003703c04620" + "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" + "6a102f201a20002903b043370300200920002903b8433703002015200041" + "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" + "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" + "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" + "386a2903003703002002201441306a2903003703002007201441286a2903" + "00370300200b201441206a290300370300200d201441186a290300370300" + "2011201441106a2903003703002006201441086a29030037030020192014" + "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" + "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" + "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" + "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" + "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" + "220c41c000460d040c030b02400340200641046a280200220320184b0440" + "200241386a2903002156200241306a2903002155200241286a2903002154" + "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" + "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" + "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" + "200d290300370300200041c0c9006a222920112903003703002013200029" + "03a00d370300201341086a222a20002903a80d370300201341106a221e20" + "0b290300370300201341186a222f2007290300370300200020002903b84e" + "3703b849200020002903b04e3703b049200241186a290300215620024110" + "6a2903002155200241086a290300215420022903002153200041c8c6006a" + "220920034198016a290300370300200041c0c6006a221520034190016a29" + "0300370300200020034188016a2903003703b84620002003290380013703" + "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" + "016a2903003703002000200341a8016a2903003703a80d200020032903a0" + "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" + "0300201020002903a00d370300201041086a223020002903a80d37030020" + "1041106a223a200b290300370300201041186a2232200729030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" + "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" + "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" + "41046a2802002203200f4b0440200241386a2903002156200241306a2903" + "002155200241286a2903002154200241206a2903002153200d2006280200" + "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" + "3703002000200341c8006a2903003703b84e200020032903403703b04e20" + "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" + "03003703002000200341e8006a2903003703a80d200020032903603703a0" + "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b2025200d290300370300202920112903003703002013" + "20002903a00d370300202a20002903a80d370300201e200b290300370300" + "202f2007290300370300200020002903b84e3703b849200020002903b04e" + "3703b049200241186a2903002156200241106a2903002155200241086a29" + "0300215420022903002153200920034198016a2903003703002015200341" + "90016a290300370300200020034188016a2903003703b846200020032903" + "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" + "200341b0016a2903003703002000200341a8016a2903003703a80d200020" + "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" + "290300370300201020002903a00d370300203020002903a80d370300203a" + "200b29030037030020322007290300370300200020002903b8463703b84e" + "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" + "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" + "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" + "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" + "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" + "0d201841c0016c2125200521022008210903402018200741046a28020022" + "034f0d02200241386a2903002156200241306a2903002155200241286a29" + "03002154200241206a2903002153200041c8ce006a221320072802002025" + "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" + "003703002000200341c8006a2903003703b84e200020032903403703b04e" + "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" + "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" + "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" + "290300370300200041c0c9006a2006290300370300200d20002903a00d37" + "0300200d41086a20002903a80d370300200d41106a201029030037030020" + "0d41186a2011290300370300200020002903b84e3703b849200020002903" + "b04e3703b049200241186a2903002156200241106a290300215520024108" + "6a290300215420022903002153200041c8c6006a221520034198016a2903" + "00370300200041c0c6006a220f20034190016a2903003703002000200341" + "88016a2903003703b84620002003290380013703b046200041b0c6006a20" + "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2011200341b8016a2903003703002010200341b0016a2903003703002000" + "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" + "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b201320152903003703002006200f290300370300200b20002903a00d" + "370300200b41086a20002903a80d370300200b41106a2010290300370300" + "200b41186a2011290300370300200020002903b8463703b84e2000200029" + "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" + "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" + "6a2107200241406b2102200941016b22090d000b20384184016a21072000" + "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" + "05210203402018200741046a28020022034f0d03200241386a2903002156" + "200241306a2903002155200241286a2903002154200241206a2903002153" + "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" + "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" + "003703b84e200020032903403703b04e200041b0ce006a20532054205520" + "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" + "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" + "003703002000200341e8006a2903003703a80d200020032903603703a00d" + "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" + "06290300370300200d20002903a00d370300200d41086a20002903a80d37" + "0300200d41106a2010290300370300200d41186a20112903003703002000" + "20002903b84e3703b849200020002903b04e3703b049200241186a290300" + "2156200241106a2903002155200241086a29030021542002290300215320" + "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" + "034190016a290300370300200020034188016a2903003703b84620002003" + "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" + "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" + "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" + "2015290300370300200b20002903a00d370300200b41086a20002903a80d" + "370300200b41106a2010290300370300200b41186a201129030037030020" + "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" + "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" + "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" + "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" + "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" + "03e834200042003703e034200042003703d834200042013703d034200042" + "003703c834200042003703c034200042003703b834200042093703b03420" + "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" + "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" + "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" + "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" + "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" + "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" + "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" + "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" + "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" + "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" + "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" + "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" + "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" + "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" + "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" + "290300370300200041c8106a220c200041c8376a221e2903003703002000" + "41c0106a2216200041c0376a222f290300370300200020002903b8373703" + "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" + "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" + "136a2228200041a0386a221b290300370300200041d8136a223420004198" + "386a2240290300370300200041d0136a224520004190386a224c29030037" + "0300200041c8136a221020004188386a224d290300370300200041c0136a" + "221320004180386a224e290300370300200041c0316a2230200041c0386a" + "223d290300370300200041c8316a223a200041c8386a2243290300370300" + "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" + "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" + "290300370300200041e8316a221a200041e8386a222d2903003703002000" + "200041f8376a22122903003703b813200020002903f0373703b013200020" + "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" + "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" + "42003703e034200042003703d834200042013703d034200042003703c834" + "200042003703c034200042003703b834200042093703b034200041b0ce00" + "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" + "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" + "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" + "006a22112903003703002013200041c0ce006a220b290300370300200020" + "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" + "0c290300370300200041b00a6a22092016290300370300200020002903b8" + "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" + "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "0041c83d6a22132017290300370300200041c03d6a221020142903003703" + "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" + "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d201120062903002256370300200b20092903002255370300200d20" + "002903b03d2254370300200220102903002253370300200720002903b83d" + "225937030020032013290300225a370300200020002903a80a225f3703b8" + "4e200020002903a00a22583703b04e2017205a3703002014205337030020" + "1c205937030020212054370300200c205637030020162055370300200020" + "5f3703b810200020583703b010200041e8166a2217202d29030037030020" + "0041e0166a2214202e290300370300200041d8166a221c20042903003703" + "00200041d0166a22212051290300370300200041c8166a220c2043290300" + "370300200041c0166a2216203d2903003703002000202b2903003703b816" + "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" + "6a200041b0166a200041b0346a102f201720032903003703002014200229" + "0300370300201c20072903003703002021200d290300370300200c201129" + "03003703002016200b290300370300200041c0196a2208202f2903003703" + "00200041c8196a2228201e290300370300200041d0196a2234202a290300" + "370300200041d8196a22452029290300370300200041e0196a223d202529" + "0300370300200041e8196a2243200f290300370300200020002903b84e37" + "03b816200020002903b04e3703b016200020002903b0373703b019200020" + "002903b8373703b819200041e8226a202c290300370300200041e0226a20" + "1b290300370300200041d8226a2040290300370300200041d0226a204c29" + "0300370300200041c8226a204d290300370300200041c0226a204e290300" + "370300200020122903003703b822200020002903f0373703b022200041b0" + "196a200041b0376a2015102f2006200c2903003703002009201629030037" + "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" + "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20132017290300370300201020142903003703002000" + "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" + "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201120062903002256370300200b20092903002255370300200d20002903" + "b03d2254370300200220102903002253370300200720002903b83d225937" + "030020032013290300225a370300200020002903a80a225f3703b84e2000" + "20002903a00a22583703b04e2017205a37030020142053370300201c2059" + "37030020212054370300200c2056370300201620553703002000205f3703" + "b816200020583703b016200041e81c6a2217202c290300370300200041e0" + "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" + "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" + "200041c01c6a2216204e290300370300200020122903003703b81c200020" + "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" + "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" + "282029290300370300200041d01f6a221b202a290300370300200041c81f" + "6a2234201e290300370300200041c01f6a2240202f290300370300200020" + "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" + "b0376a2018102f2006200c29030037030020092016290300370300200020" + "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" + "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20132017290300370300201020142903003703002000201c290300" + "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" + "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" + "03002256370300200b20092903002255370300200d20002903b03d225437" + "0300200220102903002253370300200720002903b83d2259370300200320" + "13290300225a370300200020002903a80a225f3703b84e200020002903a0" + "0a22583703b04e2017205a37030020142053370300201c20593703002021" + "2054370300200c2056370300201620553703002000205f3703b81c200020" + "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" + "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" + "200329030037030020192002290300370300200e20072903003703002032" + "200d290300370300203a20112903003703002030200b2903003703002000" + "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" + "0041b0316a200041b0346a102f201a200329030037030020192002290300" + "370300200e20072903003703002032200d290300370300203a2011290300" + "3703002030200b290300370300200041c0256a202f290300370300200041" + "c8256a201e290300370300200041d0256a202a290300370300200041d825" + "6a2029290300370300200041e0256a2025290300370300200041e8256a20" + "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" + "31200020002903b0373703b025200020002903b8373703b825200041b025" + "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" + "41b0256a1030201a200329030037030020192002290300370300200e2007" + "2903003703002032200d290300370300203a20112903003703002030200b" + "290300370300200020002903b84e3703b831200020002903b04e3703b031" + "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" + "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" + "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" + "03002254370300200041d02e6a222f200041e03d6a221829030022533703" + "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" + "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" + "0300200041c8286a220e2059370300200041d0286a221920533703002000" + "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" + "22142056370300200020002903c03d22563703b02e200020563703b02820" + "00201329030022563703b82e200020563703b828200041b0286a20102000" + "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" + "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" + "220c2018290300370300200041c82b6a2216200f290300370300200041c0" + "2b6a22082025290300370300200020132903003703b82b200020002903c0" + "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" + "0041b01c6a102f2003201429030037030020022017290300370300200720" + "1a290300370300200d20192903003703002011200e290300370300200b20" + "32290300370300202220002903b82b370300202320082903003703002024" + "2016290300370300204f200c2903003703002027202a290300370300203f" + "2021290300370300203e201c290300370300200020002903b8283703b84e" + "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" + "00370300204820292903003703002047201e2903003703002041202f2903" + "00370300204220302903003703002037203a290300370300203620002903" + "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" + "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" + "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" + "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" + "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" + "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" + "103f200742003703002002420037030020034200370300200042a9c0c689" + "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" + "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" + "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" + "0742003703002002420037030020034200370300200042003703c84e2000" + "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" + "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" + "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" + "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" + "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" + "3703002015200041e8c6006a290300370300200920002903b84037030020" + "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" + "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" + "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" + "370300200041a83e6a200041e8c0006a2206290300370300200020002903" + "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" + "200742003703002002420037030020034200370300200042a9c0c689aece" + "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" + "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" + "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" + "3703002013420037030020064200370300200042003703c840200042ac97" + "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" + "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" + "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" + "370300201120004188c8006a290300370300200d20004190c8006a290300" + "370300200720004198c8006a2903003703002002200041a0c8006a290300" + "3703002003200041a8c8006a290300370300202220002903b83a37030020" + "2320492903003703002024204a290300370300204f205029030037030020" + "272039290300370300203f203c290300370300203e204429030037030020" + "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" + "002903b03a3703f04e20394200370300203c420037030020444200370300" + "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" + "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" + "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" + "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" + "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" + "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" + "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" + "039007200041a00a6a200d418003104c1a200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" + "03200041286a210b0340200041206a200341ff0071104f200b2903002000" + "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" + "20200229030083215520074101710440200041a00d6a200041b0ce006a10" + "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" + "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" + "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" + "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" + "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" + "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" + "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" + "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" + "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" + "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" + "562000290310200229030083215520074101710440200041a00d6a200041" + "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" + "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" + "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" + "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" + "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" + "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" + "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" + "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" + "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" + "8321562000290300200229030083215520074101710440200041a00d6a20" + "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" + "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" + "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" + "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" + "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" + "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" + "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" + "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" + "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" + "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" + "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" + "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" + "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" + "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" + "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" + "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" + "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" + "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" + "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" + "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" + "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" + "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" + "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" + "6a200041a00d6a102f2002420037030020074200370300200b4200370300" + "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" + "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" + "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" + "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" + "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" + "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" + "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" + "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" + "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" + "6a29030037030020004198ca006a200041d8ce006a220629030037030020" + "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" + "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" + "03b82e3703b849200020002903b04e3703f0492002420037030020074200" + "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" + "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" + "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" + "200041b0306a200041a00d6a102f20064200370300200942003703002015" + "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" + "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" + "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" + "41b00d6a220620004180306a290300370300200041b80d6a220920004188" + "306a290300370300200041c00d6a221520004190306a2903003703002002" + "20004198306a2903003703002007200041a0306a290300370300200b2000" + "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" + "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" + "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" + "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" + "00370300200041980e6a200041e8c6006a220b2903003703002000200029" + "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" + "3703e00d2002420037030020074200370300200b4200370300200042a9c0" + "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" + "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" + "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" + "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" + "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" + "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" + "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" + "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" + "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" + "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" + "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" + "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" + "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" + "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" + "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" + "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" + "006a200041b0c3006a103f2009290300215620002903b00d215520004190" + "076a201541f002104c1a20384184016a2103024002400240024002400240" + "0340200341046b280200220204402003280200220b41046b280200220741" + "7871220d200241c0016c220241044108200741037122071b72490d022007" + "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" + "6b22460d000b200028025422030440203841046b28020022024178712207" + "20034190016c220341044108200241037122021b72490d03200241002007" + "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" + "0200220241787122072003410674220341044108200241037122021b7249" + "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" + "18200341e4a1c0001010000b203841046b28020022024178712207200341" + "90016c220341044108200241037122021b72490d02200241002007200341" + "276a4b1b0d03203810040b200028024822030440200541046b2802002202" + "41787122072003410674220341044108200241037122021b72490d042002" + "4100200720034127724b1b0d05200510040b42002156420121550b203120" + "5637030820312055370300203141106a20004190076a41f002104c1a2000" + "28023c22030440203341046b28020022024178712207200341c0016c2203" + "41044108200241037122021b72490d0520024100200720034127724b1b0d" + "06203310040b200028023022030440203b41046b28020022024178712207" + "200341e0006c220341044108200241037122021b72490d07200241002007" + "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" + "1011000b200141f0066a41f002104b1a200142003703e806200142013703" + "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" + "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" + "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" + "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" + "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" + "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" + "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" + "05417871221241044108200541037122051b20026a490d0c200541002012" + "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" + "05410674100e0c040b206a428080808010540d0020122005100e0b202041" + "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" + "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" + "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" + "04201d41046b280200220541787141e40041e800200541037122061b490d" + "162006410020054188014f1b0d17201d1004200a41046b28020022054178" + "71221d418802418c02200541037122051b490d1820054100201d41ac024f" + "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" + "200541003602182005410136020c200541a099c000360208200542043702" + "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" + "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" + "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" + "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" + "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" + "0204200241643602002002410236020c200241b884c00036020820024202" + "3702142002200241046aad4280808080108437032820022002ad42808080" + "8010843703202002200241206a360210200241086a41cc90c000101a000b" + "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" + "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b962502087f017e02400240024002400240024002402000" + "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" + "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" + "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" + "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" + "04410620014108766722006b7641017120004101746b413e6a21070b4100" + "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" + "0b410021002004411920074101766b41002007411f471b74210503400240" + "200328020441787122062004490d00200620046b220620014f0d00200321" + "02200622010d0041002101200321000c060b200328021422062000200620" + "032005411d764104716a41106a2802002203471b200020061b2100200541" + "0174210520030d000b0c030b02402000417f7341017120016a2205410374" + "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" + "402002200436020c200420023602080c010b418ca9c0002003417e200577" + "713602000b20012000410372360204200020016a22002000280204410172" + "360204200141086a0f0b0240200020017441022001742200410020006b72" + "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" + "28020822054704402005200236020c200220053602080c010b418ca9c000" + "2003417e200677713602000b20002004410372360204200020046a220520" + "0120046b2204410172360204200020016a20043602004194a9c000280200" + "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" + "8ca9c00028020022064101200341037674220371450440418ca9c0002003" + "20067236020020020c010b20022802080b21032002200136020820032001" + "36020c2001200236020c200120033602080b419ca9c00020053602004194" + "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" + "220228020441787120046b21012002210302400340024002402002280210" + "22000d00200228021422000d002003280218210702400240200320032802" + "0c2200460440200341144110200328021422001b6a28020022020d014100" + "21000c020b20032802082202200036020c200020023602080c010b200341" + "146a200341106a20001b21050340200521062002220041146a200041106a" + "200028021422021b210520004114411020021b6a28020022020d000b2006" + "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" + "020047044020074110411420072802102003461b6a20003602002000450d" + "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" + "200328021c77713602000c030b200028020441787120046b220220012001" + "20024b22021b21012000200320021b2103200021020c010b0b2000200736" + "021820032802102202044020002002360210200220003602180b20032802" + "142202450d0020002002360214200220003602180b02400240200141104f" + "044020032004410372360204200320046a22042001410172360204200120" + "046a20013602004194a9c0002802002205450d0120054178714184a7c000" + "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" + "037674220571450440418ca9c000200520067236020020020c010b200228" + "02080b2105200220003602082005200036020c2000200236020c20002005" + "3602080c010b2003200120046a2200410372360204200020036a22002000" + "2802044101723602040c010b419ca9c00020043602004194a9c000200136" + "02000b200341086a0f0b2000200272450440410021024102200774220041" + "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" + "0b2000450d010b03402002200020022000280204417871220320046b2206" + "20014922071b200320044922051b210220012006200120071b20051b2101" + "20002802102203047f20030520002802140b22000d000b0b2002450d0020" + "044194a9c00028020022004d2001200020046b4f710d0020022802182107" + "024002402002200228020c2200460440200241144110200228021422001b" + "6a28020022030d01410021000c020b20022802082203200036020c200020" + "033602080c010b200241146a200241106a20001b21050340200521062003" + "220041146a200041106a200028021422031b210520004114411020031b6a" + "28020022030d000b200641003602000b02402007450d0002402002200228" + "021c41027441f4a5c0006a22032802004704402007411041142007280210" + "2002461b6a20003602002000450d020c010b2003200036020020000d0041" + "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" + "0736021820022802102203044020002003360210200320003602180b2002" + "2802142203450d0020002003360214200320003602180b0240200141104f" + "044020022004410372360204200220046a22042001410172360204200120" + "046a200136020020014180024f0440411f210020044200370210200141ff" + "ffff074d04402001410620014108766722006b7641017120004101746b41" + "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" + "22054190a9c0002802007145044020032004360200200420033602182004" + "200436020c200420043602084190a9c0004190a9c0002802002005723602" + "000c030b0240024020012003280200220528020441787146044020052100" + "0c010b2001411920004101766b41002000411f471b742103034020052003" + "411d764104716a41106a22062802002200450d0220034101742103200021" + "0520002802044178712001470d000b0b20002802082201200436020c2000" + "2004360208200441003602182004200036020c200420013602080c030b20" + "062004360200200420053602182004200436020c200420043602080c020b" + "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" + "41037674220171450440418ca9c000200120037236020020000c010b2000" + "2802080b2101200020043602082001200436020c2004200036020c200420" + "013602080c010b2002200120046a2200410372360204200020026a220020" + "002802044101723602040b200241086a0f0b024002400240024002400240" + "20044194a9c00028020022004b044020044198a9c00028020022004f0440" + "41002100200441af80046a220241107640002201417f4622050d07200141" + "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" + "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" + "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" + "4020002802002202200028020422056a2003460d02200028020822000d00" + "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" + "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" + "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" + "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" + "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" + "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" + "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" + "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" + "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" + "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" + "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" + "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" + "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" + "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" + "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" + "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" + "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" + "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" + "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" + "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" + "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" + "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" + "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" + "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" + "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" + "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" + "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" + "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" + "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" + "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" + "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" + "0036020020032000410172360204200020036a412836020441aca9c00041" + "808080013602000c080b200120034f0d0020012002490d00200028020c45" + "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" + "0320066a210241f4a6c00021000240024003402002200028020022054704" + "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" + "034002402001200028020022024f04402001200220002802046a2202490d" + "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" + "41286b220036020020032000410172360204200020036a412836020441ac" + "a9c00041808080013602002001200241206b41787141086b220020002001" + "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" + "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" + "200336020041fca6c000200541086a3602004180a7c00041003602002005" + "411c6a2100034020004107360200200041046a22002002490d000b200120" + "05460d0720052005280204417e713602042001200520016b220041017236" + "02042005200036020020004180024f04402001200010350c080b200041f8" + "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" + "220071450440418ca9c000200020037236020020020c010b20022802080b" + "2100200220013602082000200136020c2001200236020c20012000360208" + "0c070b200020033602002000200028020420066a36020420032004410372" + "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" + "a9c000280200460d032002419ca9c000280200460d042002280204220441" + "037141014604402002200441787122041016200120046a2101200220046a" + "220228020421040b20022004417e71360204200020014101723602042000" + "20016a200136020020014180024f04402000200110350c060b200141f801" + "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" + "0171450440418ca9c000200120027236020020040c010b20042802080b21" + "01200420003602082001200036020c2000200436020c200020013602080c" + "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" + "220020046a22023602002002200141017236020420002004410372360204" + "200041086a21000c060b419ca9c00028020021010240200020046b220241" + "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" + "72360204200020016a220020002802044101723602040c010b4194a9c000" + "2002360200419ca9c000200120046a220336020020032002410172360204" + "200020016a2002360200200120044103723602040b200141086a0f0b2000" + "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" + "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" + "22016a41086a220336020020022003410172360204200020016a41283602" + "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" + "c0004198a9c00028020020016a2201360200200020014101723602040c01" + "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" + "020020002001410172360204200020016a20013602000b200341086a0f0b" + "410021004198a9c000280200220120044d0d004198a9c000200120046b22" + "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" + "0141017236020420002004410372360204200041086a0f0b20000bc60602" + "037f037e230041a0026b22032400200341286a41c100104b210420034118" + "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" + "41086a41e08bc00029030037030020034200370320200341d88bc0002903" + "003703000240200241c0004f0440200320024106762205ad370320200320" + "01200510272004200120024140716a2002413f712202104c1a0c010b2004" + "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" + "034198016a220120032d00d80122026a22044180013a00002002ad220742" + "3b862003290390012206420986220820074203868422074280fe03834228" + "86842007428080fc0783421886200742808080f80f834208868484200642" + "018642808080f80f832006420f88428080fc0783842006421f884280fe03" + "8320084238888484842106024002402002413f470440200441016a200241" + "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" + "4190026a420037030020034188026a420037030020034180026a42003703" + "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" + "00370300200342003703e0012003200637039802200341f0006a200341e0" + "016a410110270c010b200320063703d001200341f0006a2001410110270b" + "2000200328028c01220241187420024180fe037141087472200241087641" + "80fe03712002411876727236001c20002003280288012202411874200241" + "80fe03714108747220024108764180fe0371200241187672723600182000" + "200328028401220241187420024180fe03714108747220024108764180fe" + "0371200241187672723600142000200328028001220241187420024180fe" + "03714108747220024108764180fe03712002411876727236001020002003" + "28027c220241187420024180fe03714108747220024108764180fe037120" + "02411876727236000c20002003280278220241187420024180fe03714108" + "747220024108764180fe0371200241187672723600082000200328027422" + "0241187420024180fe03714108747220024108764180fe03712002411876" + "727236000420002003280270220241187420024180fe0371410874722002" + "4108764180fe037120024118767272360000200341a0026a24000bee0201" + "077f024020012802042202450440410021020c010b200128021021062001" + "200220022001280208220320022003491b22046b36020420012001280200" + "220720046a360200027f0240024002400240027f02400240024020030440" + "200128020c2208410174210520072d0000220241c1006b41ff0171410649" + "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" + "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" + "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" + "01714106490d01200241e1006b41ff01714106490d02200241306b220441" + "ff0171410a490d0420054101720b21032006200241ff0171360200200620" + "0541807e71200341ff01717236020441000c040b200241376b21040c020b" + "200241d7006b21040c010b4101410141948bc0001010000b200420034104" + "7472210341010b21022001200841016a36020c0b200020033a0001200020" + "023a00000bb40801057f200041086b2201200041046b2802002203417871" + "22006a21020240024020034101710d002003410271450d01200128020022" + "0320006a2100200120036b2201419ca9c000280200460440200228020441" + "03714103470d014194a9c000200036020020022002280204417e71360204" + "20012000410172360204200220003602000f0b2001200310160b02400240" + "0240024002400240024020022802042203410271450440200241a0a9c000" + "280200460d022002419ca9c000280200460d032002200341787122031016" + "2001200020036a2200410172360204200020016a20003602002001419ca9" + "c000280200470d014194a9c00020003602000f0b20022003417e71360204" + "20012000410172360204200020016a20003602000b2000418002490d0241" + "1f210220014200370210200041ffffff074d044020004106200041087667" + "22026b7641017120024101746b413e6a21020b2001200236021c20024102" + "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" + "01360200200120033602182001200136020c200120013602084190a9c000" + "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" + "c0004198a9c00028020020006a220036020020012000410172360204419c" + "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" + "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" + "410021034198a9c00028020022054129490d0441f4a6c000210103402000" + "200128020022024f04402000200220012802046a490d060b200128020821" + "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" + "006a220036020020012000410172360204200020016a20003602000f0b20" + "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" + "037674220071450440418ca9c000200020037236020020020c010b200228" + "02080b2100200220013602082000200136020c2001200236020c20012000" + "3602080f0b02400240200020032802002204280204417871460440200421" + "020c010b2000411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712000470d000b0b20022802082200200136020c20" + "022001360208200141003602182001200236020c200120003602080c010b" + "20052001360200200120043602182001200136020c200120013602080b41" + "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" + "a6c000280200220004400340200141016a2101200028020822000d000b0b" + "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" + "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" + "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" + "000b0b810802077f067e230041c0026b2203240020034198026a20024118" + "6a290300220a37030020034190026a200241106a290300220d3703002003" + "200241086a290300220b3703880220032002290300220c3703800242ddb0" + "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" + "290300220a370300200341b8026a2205200141186a290300220d37030020" + "032001290300220b3703a0022003200141086a290300220c3703a8022003" + "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" + "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" + "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" + "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" + "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" + "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" + "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" + "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" + "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" + "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" + "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" + "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" + "80026a200341a0016a104a45044020034180016a22042002290300370100" + "20034198016a2205200241186a29030037010020034190016a2206200241" + "106a29030037010020034188016a2207200241086a290300370100200341" + "f8006a2202200141186a290300370100200341f0006a2208200141106a29" + "0300370100200341e8006a2209200141086a290300370100200320012903" + "00370160200341ca006a22012005290100370100200341c2006a22052006" + "2901003701002003413a6a22062007290100370100200341326a22072004" + "2901003701002003412a6a22042002290100370100200341226a22022008" + "2901003701002003411a6a22082009290100370100200320032901603701" + "12200041c8006a2001290100370100200041406b20052901003701002000" + "41386a2006290100370100200041306a2007290100370100200041286a20" + "04290100370100200041206a2002290100370100200041186a2008290100" + "3701002000200329011237011041000c010b200041003a000141010b3a00" + "00200341c0026a24000baa0401047e2001290010220242388620024280fe" + "0383422886842002428080fc0783421886200242808080f80f8342088684" + "84200242088842808080f80f832002421888428080fc0783842002422888" + "4280fe038320024238888484842104200141186a29000022024238862002" + "4280fe0383422886842002428080fc0783421886200242808080f80f8342" + "08868484200242088842808080f80f832002421888428080fc0783842002" + "4228884280fe0383200242388884848421050240417f2001290000220242" + "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" + "008584420052200342388620034280fe0383422886842003428080fc0783" + "421886200342808080f80f834208868484200342088842808080f80f8320" + "03421888428080fc07838420034228884280fe0383200342388884848422" + "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" + "02428080fc0783421886200242808080f80f834208868484200242088842" + "808080f80f832002421888428080fc07838420024228884280fe03832002" + "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" + "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" + "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" + "1b0d010b2000200337032020002005370310200020023703282000200437" + "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" + "7f027e230041d0066b2203240020034188036a200241386a290300370300" + "20034180036a200241306a290300370300200341f8026a200241286a2903" + "00370300200341f0026a2204200241206a290300370300200341e8026a20" + "0241186a290300370300200341e0026a200241106a290300370300200320" + "022903003703d0022003200241086a2903003703d802200341d0026a2002" + "2002102f200341a0036a200141106a290300370300200341a8036a200141" + "186a290300370300200341b0036a200141206a290300370300200341b803" + "6a200141286a290300370300200341c0036a200141306a29030037030020" + "0341c8036a200141386a2903003703002003200129030037039003200320" + "0141086a2903003703980320034190036a20012001102f200341d0006a20" + "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" + "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" + "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" + "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" + "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" + "6a20034190056a103002400240200341d0026a200341106a104a45044020" + "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" + "370300200341c0026a4200370300200341b8026a4200370300200341b002" + "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" + "00370300200341a8016a200141186a290300370300200341b0016a200141" + "206a290300370300200341b8016a200141286a290300370300200341c001" + "6a200141306a290300370300200341c8016a200141386a29030037030020" + "0342003703a00220032001290300370390012003200141086a2903003703" + "980120034188026a200241386a29030037030020034180026a200241306a" + "290300370300200341f8016a200241286a290300370300200341f0016a20" + "0241206a290300370300200341e8016a200241186a290300370300200341" + "e0016a200241106a290300370300200341d8016a200241086a2903003703" + "0020034201370390022003420037039802200320022903003703d0012003" + "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" + "00200341f8036a420037030020034180046a420037030020034188046a42" + "00370300200342003703d003200342003703d803200342a9c0c689aece93" + "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" + "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" + "00104b1a2003420037039804200342013703900441ff0121040340200320" + "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" + "ff01716a2206290308832107200329030020062903008321082005044020" + "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" + "1a0b2007200884420052044020034190056a200341d0036a20034190016a" + "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" + "2204417f470d000b20034190056a200341d0036a20034190016a10440240" + "20032903900620034198066a290300844200520d0020032903a006200341" + "a8066a290300844200520d0020032903b006200341b8066a290300844200" + "520d0020032903c006200341c8066a290300844200520d00200341c8056a" + "200141386a290300370300200341c0056a200141306a2903003703002003" + "41b8056a200141286a290300370300200341b0056a200141206a29030037" + "0300200341a8056a200141186a290300370300200341a0056a200141106a" + "290300370300200341d8056a200241086a290300370300200341e0056a20" + "0241106a290300370300200341e8056a200241186a290300370300200341" + "f0056a200241206a290300370300200341f8056a200241286a2903003703" + "0020034180066a200241306a29030037030020034188066a200241386a29" + "03003703002003200129030037039005200320022903003703d005200320" + "0141086a29030037039805200041106a20034190056a418001104c1a2000" + "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" + "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" + "022d001021072000027f024020022d0030220841c101470440200235011a" + "2109200233011e210a2002290112211620022903202114200241d8006a22" + "01200241286a29030022173703002002201437035020022009200a422086" + "842219421086201642308884220937034820022007ad42ff018320164210" + "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" + "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" + "0b200954ad220920022903487c220a200954ad220c20022903507c220942" + "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" + "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" + "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" + "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" + "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" + "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" + "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" + "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" + "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" + "470440230041e0006b220324004190aac0004190aac0002d000022044101" + "20041b3a00000240200404400340024002400240200441ff017141016b0e" + "03000501020b03404190aac0002d000022044101460d000b024002402004" + "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" + "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" + "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" + "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" + "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" + "220142003703002003420037033020034200370328200342043703202003" + "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" + "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" + "200341206a200341406b103a200320032903202003290328200329033020" + "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" + "c00041023a00004188aac00020042903003703004180aac0002005290300" + "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" + "200341e0006a24000b20024198016a4188aac00029030037030020024190" + "016a4180aac000290300370300200241f8a9c00029030037038801200241" + "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" + "210c0340200220024180016a200141037641f0ffffff01716a2205290300" + "2005290308200141ff0071104e200241286a2205200b3703002002200937" + "03202002200c3703182002200a370310200241106a200a200c2009200b42" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" + "0229032021092002290318210c2002290310210a20022802004101710440" + "2005200b370300200220093703202002200a3703102002200c3703182002" + "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f102b2005290300210b2002290318210c200229032021092002290310" + "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" + "20093703202002200c3703182002200a370310200241106a2010200d200f" + "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" + "0378200220093703702002200c3703682002200a370360200241e0006a20" + "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" + "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" + "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" + "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" + "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" + "030041d8a9c000290300102d2002290388012110200229038001210d0240" + "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" + "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" + "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" + "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" + "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" + "0d010b2002200f3703202002200d37031020022009370328200220103703" + "18027e0240200241e0006a200241106a104a0440420021104200210f4200" + "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" + "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" + "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" + "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" + "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" + "0e201554200b201054200b2010511b200c200f542009200a562009200a51" + "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" + "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" + "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" + "40024002400240417f201b420052200f2012562009200d562009200d511b" + "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" + "85200b201085844200520b4101460d010b200841c001470d014200210942" + "00210a4200210b4200210c2011201284200d20138484500d04427f420042" + "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" + "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" + "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" + "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" + "20117d21090c040b2008418001460d010b201121092013210a2012210b20" + "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" + "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" + "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" + "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" + "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" + "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" + "2014370320200020163701122000200b3703402000200937033020002006" + "3a0011200020073a0010200020193e011a200020173703282000200c3703" + "482000200a3703382000411e6a20194220883d010041000c020b20002006" + "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" + "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" + "0620022d00f0042107024002400240024020022d009005220941c1014704" + "4020024198016a220520022901fa04370300200241a6016a220420024188" + "056a2203290100370100200241a0016a220820024182056a290100370300" + "200220022901f20437039001200241f0046a200141206a102e20022d00f0" + "04450440200241d5076a2003290300220c37000020024188016a20024198" + "056a290300220b37030020024180016a20024190056a290300220a370300" + "200241c8006a200b370300200241406b200a370300200220022903800522" + "0b3703702002200c3703782002200b3703302002200c370338200220063a" + "0051200220073a0050200241e8006a22012004290100370100200241e200" + "6a2008290300370100200241da006a200529030037010020022002290390" + "01370152200941c000460d0220024180026a200241406b29030037030020" + "024188026a200241c8006a29030037030020024190026a200241d0006a29" + "030037030020024198026a200241d8006a290300370300200241a0026a20" + "0241e0006a290300370300200241a8026a20012903003703002002200229" + "03303703f001200220022903383703f801200241f0016a200241306a2002" + "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" + "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" + "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" + "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" + "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" + "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" + "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" + "002204410120041b3a00000240200404400340024002400240200441ff01" + "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" + "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" + "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" + "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" + "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" + "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" + "200341386a22014200370300200342003703302003420037032820034204" + "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" + "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" + "903c370340200341206a200341406b103a20032003290320200329032820" + "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" + "200829030037030041d8aac000200329030837030041d0aac00020032903" + "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" + "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" + "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" + "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" + "046a200141037641f0ffffff01716a22052903002005290308200141ff00" + "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" + "0e3703e0072002200d3703d807200220103703d007200220113703c80720" + "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" + "082002200e3703a0082002200d3703980820022010370390082002201137" + "0388082002200b370380082002280220210520024180076a200241c0076a" + "20024180086a102f20024198076a290300210d2004290300210f20032903" + "00210a2002290388072111200229038007210b2002290390072110200229" + "03a007210e20022903b007210c200541017104402002200a3703b8082002" + "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" + "200220103703900820022011370388082002200b37038008200241c0076a" + "20024180086a200241b0016a102f200241e8076a290300210f200241f807" + "6a290300210a20022903c007210b20022903d007211020022903e007210e" + "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" + "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" + "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" + "02200d3703c802200220113703b802200241f0026a200241b0026a200241" + "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" + "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" + "000240200104400340024002400240200141016b0e03000501020b034041" + "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" + "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" + "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" + "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" + "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" + "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" + "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" + "00370300200241a8aac0002903003703c806200241a0aac0002903003703" + "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" + "034200210a4200210e4200210f420021104200210d420021110340200241" + "106a200241c0066a200141037641f0ffffff01716a220529030020052903" + "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" + "03e8072002200e3703e0072002200d3703d807200220103703d007200220" + "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" + "02200f3703a8082002200e3703a0082002200d3703980820022010370390" + "0820022011370388082002200b370380082002280210210520024180076a" + "200241c0076a20024180086a102f20024198076a290300210d2004290300" + "210f2003290300210a2002290388072111200229038007210b2002290390" + "07211020022903a007210e20022903b007210c200541017104402002200a" + "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" + "200d37039808200220103703900820022011370388082002200b37038008" + "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" + "0f200241f8076a290300210a20022903c007210b20022903d00721102002" + "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" + "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" + "03a00820022010370390082002200b370380082002200a3703b808200220" + "0f3703a8082002200d370398082002201137038808200241f0036a200241" + "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" + "22054200370300200241b8086a22044200370300200242a9c0c689aece93" + "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" + "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" + "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" + "4020024190046a2003104a450d010b200142003703002005420037030020" + "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" + "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" + "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" + "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" + "6a4200370300200241a0086a4200370300200241a8086a42003703002002" + "41b0086a4200370300200241b8086a420037030020024200370388084201" + "210b20024201370380082002420037039008200241c0066a200241b0036a" + "20024180086a103041a0abc0002d00004102470440230041e0006b220324" + "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" + "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" + "002d000022044101460d000b02400240200441016b0e03000601030b000b" + "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" + "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" + "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" + "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" + "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" + "03302003420037032820034202370320200342a9c0c689aece93b2303703" + "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" + "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" + "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" + "20042903003703004190abc00020082903003703004188abc00020032903" + "083703004180abc00020032903003703000b200341e0006a24000b200241" + "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" + "0020024188abc0002903003703d80420024180abc0002903003703d00441" + "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" + "210f420021104200210d4200211103402002200241d0046a200141037641" + "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" + "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" + "0d3703d807200220103703d007200220113703c8072002200b3703c00720" + "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" + "082002200d37039808200220103703900820022011370388082002200b37" + "0380082002280200210520024180076a200241c0076a20024180086a102f" + "20024198076a290300210d2004290300210f2003290300210a2002290388" + "072111200229038007210b200229039007211020022903a007210e200229" + "03b007210c200541017104402002200a3703b8082002200c3703b0082002" + "200f3703a8082002200e3703a0082002200d370398082002201037039008" + "20022011370388082002200b37038008200241c0076a20024180086a2002" + "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" + "2903c007210b20022903d007211020022903e007210e20022903f007210c" + "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" + "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" + "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" + "0220113703880620024180056a20024180066a200241f0026a102f0c050b" + "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" + "0c040b200020063a0002200020073a0001200041013a00000c030b200241" + "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" + "200241e0066a4200370300200241d8066a4200370300200242003703d006" + "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" + "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" + "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" + "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" + "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" + "0241f0046a200241c0066a10310240024020022802f00441017104402002" + "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" + "056a2204290300370300200241a8086a2203200241a8056a220629030037" + "0300200241a0086a200241a0056a29030037030020024198086a20024198" + "056a220729030037030020024190086a20024190056a2903003703002002" + "20022903800537038008200220024188056a290300370388082002418006" + "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" + "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" + "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" + "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" + "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" + "f0046a200241c0066a103120022802f004410171450d0120012005290300" + "370300200241b0086a200429030037030020032006290300370300200241" + "a0086a200241a0056a29030037030020024198086a200729030037030020" + "024190086a20024190056a29030037030020022002290380053703800820" + "0220024188056a2903003703880820024180076a200241c0076a20024180" + "086a102f200241f0046a20024180066a20024180076a100720022d00f004" + "4101460d02200041106a20024180056a418001104c1a200041003a00000c" + "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" + "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" + "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" + "4200370300200242003703b808200242003703b008200242003703a80820" + "0242013703a0082002420037038808200242003703800820024180056a20" + "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" + "6a290300210c20022903a005210f20022903b005210b200229039005220d" + "20022903800522158420024198056a290300221220024188056a29030022" + "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" + "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" + "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" + "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" + "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" + "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" + "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" + "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" + "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" + "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" + "0240417f200b201085200a200c8584420052200b201054200a200c56200a" + "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" + "201485200e2011858442005221010b2019211c2017211d2018211a201621" + "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" + "0b027e200d20188520122016858450044020152019542013201754201320" + "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" + "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" + "1e200e211f200b2120200c212120192115201721132018210d2016211220" + "14210f2011210e2010210b200a210c0b200041186a200229037837030020" + "0020022903703703102000200229039001370132200041286a2002418801" + "6a290300370300200041206a20024180016a2903003703002000413a6a20" + "024198016a290300370100200041c2006a200241a0016a29030037010020" + "0041c8006a200241a6016a29010037010020094180014604402000202037" + "0380012000201e3703702000201a3703602000201c370350200020063a00" + "31200020073a0030200041003a000020002021370388012000201f370378" + "2000201b3703682000201d3703580c010b2000200b370380012000200f37" + "03702000200d37036020002015370350200020063a0031200020073a0030" + "200041003a00002000200c370388012000200e3703782000201237036820" + "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" + "022400200241386a4200370300200241306a4200370300200241286a4200" + "370300200241206a22034200370300200241186a4200370300200241106a" + "4200370300200241d8006a4200370300200241e0006a4200370300200241" + "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" + "200242003703482002420137034020024200370308200242003703002002" + "420037035002400240024020012002104a0d00200141206a2003104a0d00" + "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" + "010b200141f8006a290300210e200141e8006a2903002106200129037021" + "0c2001290360210d200129035022042001290340220884200141d8006a29" + "0300220b200141c8006a290300220984844200520440427f4200427f4200" + "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" + "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" + "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" + "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" + "21070b4200210442002108420021094200210b200c200d842006200e8484" + "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" + "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" + "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" + "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" + "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" + "20002005370350200020073703402000200b370378200020083703682000" + "200a3703582000200f37034820002001290300370300200041386a200141" + "386a290300370300200041306a200141306a290300370300200041286a20" + "0141286a290300370300200041206a200141206a29030037030020004118" + "6a200141186a290300370300200041106a200141106a2903003703002000" + "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" + "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" + "411c6a1001220045044041000f0b200041086b210102402000410f714504" + "40200121000c010b200041046b220528020022064178712000410f6a4170" + "7141086b2200200020016b4111494104746a220020016b22026b21032006" + "410371044020002003200028020441017172410272360204200020036a22" + "032003280204410172360204200520022005280200410171724102723602" + "00200120026a220320032802044101723602042001200210170c010b2001" + "2802002101200020033602042000200120026a3602000b02402000280204" + "2201410371450d0020014178712202200441106a4d0d0020002004200141" + "017172410272360204200020046a2201200220046b220441037236020420" + "0020026a220220022802044101723602042001200410170b200041086a0b" + "de0a01047f230041f0026b22032400200341a8026a220442003703002003" + "41a0026a22054200370300200342003703c802200342003703c002200342" + "003703b802200342013703b0022003420037039802200342003703900220" + "0341b0026a21060240024002400240200120034190026a104a4504402001" + "41206a2006104a450d010b20044200370300200542003703002003420037" + "03c802200342003703c002200342003703b802200342013703b002200342" + "00370398022003420037039002200220034190026a104a45044020024120" + "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" + "00370300200341a0026a4200370300200342003703c802200342003703c0" + "02200342003703b802200342013703b00220034200370398022003420037" + "039002027f0240200120034190026a104a450440200141206a200341b002" + "6a104a450d010b20042001290320370300200441186a200141386a290300" + "370300200441106a200141306a290300370300200441086a200141286a29" + "0300370300200341106a200141106a290300370300200341186a20014118" + "6a290300370300200320012903003703002003200141086a290300370308" + "200341d0006a0c010b20054200370300200341106a420037030020034118" + "6a4200370300200541086a4200370300200541106a420037030020054118" + "6a4200370300200342003703002003420037030820042105200341306a0b" + "210620034180016a2101200341a0016a2104200642003703082006420037" + "03002005420037030820054201370300200341a8026a4200370300200341" + "a0026a4200370300200342003703c802200342003703c002200342003703" + "b802200342013703b00220034200370398022003420037039002027f0240" + "200220034190026a104a450440200241206a200341b0026a104a450d010b" + "20012002290320370300200141186a200241386a29030037030020014110" + "6a200241306a290300370300200141086a200241286a2903003703002003" + "41f0006a200241106a290300370300200341f8006a200241186a29030037" + "0300200320022903003703602003200241086a290300370368200341b001" + "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" + "370300200441086a4200370300200441106a4200370300200441186a4200" + "37030020034200370360200342003703682001210420034190016a0b2205" + "420037030820054200370300200442003703082004420137030020034190" + "026a2003200341e0006a1040200341c0016a20034190026a104120032802" + "c001410171450d02200020032903d001370300200041386a20034188026a" + "290300370300200041306a20034180026a290300370300200041286a2003" + "41f8016a290300370300200041206a200341f0016a290300370300200041" + "186a200341e8016a290300370300200041106a200341e0016a2903003703" + "00200041086a200341d8016a2903003703000c030b200020022903003703" + "00200041386a200241386a290300370300200041306a200241306a290300" + "370300200041286a200241286a290300370300200041206a200241206a29" + "0300370300200041186a200241186a290300370300200041106a20024110" + "6a290300370300200041086a200241086a2903003703000c020b20002001" + "290300370300200041386a200141386a290300370300200041306a200141" + "306a290300370300200041286a200141286a290300370300200041206a20" + "0141206a290300370300200041186a200141186a29030037030020004110" + "6a200141106a290300370300200041086a200141086a2903003703000c01" + "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" + "7f067e230041e0006b22022400200241386a4200370300200241306a4200" + "370300200242003703582002420037035020024200370348420121042002" + "42013703402002420037032820024200370320027e02402001200241206a" + "104a450440200141206a200241406b104a450d010b200241106a20014110" + "6a290300370300200241186a200141186a29030037030020022001290300" + "3703002002200141086a290300370308200141286a290300210520012903" + "30210620012903202107200141386a2903000c010b42002104200241106a" + "4200370300200241186a4200370300200242003703002002420037030842" + "01210742000b210820004200370358200042003703502000200437034020" + "002006370330200020073703202000200229030037030020002003370348" + "2000200837033820002005370328200041086a2002290308370300200041" + "186a200241186a290300370300200041106a200241106a29030037030020" + "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" + "044108200241037122021b20016a4f0440200241002003200141276a4b1b" + "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" + "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" + "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" + "200241c0016a22034200370300200241b8016a4200370300200241b0016a" + "4200370300200241f8016a420037030020024180026a4200370300200241" + "88026a420037030020024190026a420037030020024198026a4200370300" + "200242003703e80142012105200242013703e001200242003703a8012002" + "42003703a001200242003703f0010240024002402001200241a0016a104a" + "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" + "41e0006a20024180026a104a450d010b200241106a420037030020024118" + "6a4200370300200241206a4200370300200241286a420037030020024140" + "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" + "00200241d0006a200141f0006a290300370300200241d8006a200141f800" + "6a2903003703002002420037030020024200370308200220012903503703" + "302002200141d8006a290300370338200141c8006a290300210620012903" + "40210720024198016a200141386a29030037030020024190016a20014130" + "6a29030037030020024188016a200141286a29030037030020024180016a" + "200141206a290300370300200241f8006a200141186a2903003703002002" + "41f0006a200141106a2903003703002002200141086a2903003703682002" + "20012903003703600c010b42002105200241f0006a4200370300200241f8" + "006a420037030020024180016a420037030020024188016a420037030020" + "024190016a420037030020024198016a4200370300200241406b42003703" + "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" + "00370300200241106a4200370300200241186a4200370300200241206a42" + "00370300200241286a420037030020024200370360200242003703682002" + "420037033020024200370338200242003703002002420037030842012107" + "0b2000200737034020002002290360370300200020022903303703502000" + "2006370348200041086a2002290368370300200041d8006a200229033837" + "0300200041386a20024198016a290300370300200041306a20024190016a" + "290300370300200041286a20024188016a290300370300200041206a2002" + "4180016a290300370300200041186a200241f8006a290300370300200041" + "106a200241f0006a290300370300200041e0006a200241406b2903003703" + "00200041e8006a200241c8006a290300370300200041f0006a200241d000" + "6a290300370300200041f8006a200241d8006a2903003703002000200437" + "0388012000200537038001200020022903003703900120004198016a2002" + "290308370300200041a0016a200241106a290300370300200041a8016a20" + "0241186a290300370300200041b0016a200241206a290300370300200041" + "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" + "0041306b2203240020032001360204200320003602002003410236020c20" + "0341c481c00036020820034202370214200342808080801022042003ad84" + "37032820032004200341046aad843703202003200341206a360210200341" + "086a2002101a000b4101017f230041206b22032400200341003602102003" + "4101360204200342043702082003200136021c2003200036021820032003" + "41186a36020020032002101a000b6801017f230041306b22032400200320" + "01360204200320003602002003410236020c2003418484c0003602082003" + "42023702142003200341046aad4280808080108437032820032003ad4280" + "80808010843703202003200341206a360210200341086a2002101a000b79" + "01017f230041406a220524002005200136020c2005200036020820052003" + "360214200520023602102005410236021c200541d881c000360218200542" + "023702242005200541106aad428080808020843703382005200541086aad" + "428080808030843703302005200541306a360220200541186a2004101a00" + "0b3601017f230041206b22012400200141003602182001410136020c2001" + "41d480c00036020820014204370210200141086a2000101a000bcc060105" + "7f0240024002400240200041046b22062802002207417871220441044108" + "200741037122051b20016a4f044020054100200141276a22082004491b0d" + "0102400240200241094f04402003100b22040d0141000f0b41102003410b" + "6a4178712003410b491b2101024020054504402001418002490d01200420" + "01410472490d01200420016b418180084f0d010c030b200041086b220220" + "046a2105024002400240200120044b0440200541a0a9c000280200460d03" + "2005419ca9c000280200460d02200528020422074102710d042007417871" + "220720046a22042001490d04200520071016200420016b22034110490d01" + "20062001200628020041017172410272360200200120026a220120034103" + "72360204200220046a220420042802044101723602042001200310172000" + "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" + "200120026a22012003410372360204200520052802044101723602042001" + "2003101720000f0b20062004200628020041017172410272360200200220" + "046a2201200128020441017236020420000f0b4194a9c00028020020046a" + "22042001490d010240200420016b2203410f4d0440200620074101712004" + "72410272360200200220046a220120012802044101723602044100210341" + "0021010c010b20062001200741017172410272360200200120026a220120" + "03410172360204200220046a2204200336020020042004280204417e7136" + "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" + "c00028020020046a220420014b0d070b20031001220145044041000f0b20" + "012000417c4178200628020022044103711b20044178716a220420032003" + "20044b1b104c21012000100420010f0b200420002001200320012003491b" + "104c210420062802002203417871220541044108200341037122031b2001" + "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" + "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" + "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" + "11000b20062001200741017172410272360200200120026a220320042001" + "6b22014101723602044198a9c000200136020041a0a9c000200336020020" + "000bf10201047f200028020c21020240024020014180024f044020002802" + "1821040240024020002002460440200041144110200028021422021b6a28" + "020022010d01410021020c020b20002802082201200236020c2002200136" + "02080c010b200041146a200041106a20021b210303402003210520012202" + "41146a200241106a200228021422011b210320024114411020011b6a2802" + "0022010d000b200541003602000b2004450d022000200028021c41027441" + "f4a5c0006a220128020047044020044110411420042802102000461b6a20" + "023602002002450d030c020b2001200236020020020d014190a9c0004190" + "a9c000280200417e200028021c77713602000c020b200028020822032002" + "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" + "0200417e200141037677713602000f0b2002200436021820002802102201" + "044020022001360210200120023602180b20002802142201450d00200220" + "01360214200120023602180b0ba90601047f200020016a21020240024020" + "0028020422034101710d002003410271450d012000280200220320016a21" + "01200020036b2200419ca9c0002802004604402002280204410371410347" + "0d014194a9c000200136020020022002280204417e713602042000200141" + "0172360204200220013602000c020b2000200310160b0240024002402002" + "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" + "00280200460d0320022003417871220310162000200120036a2201410172" + "360204200020016a20013602002000419ca9c000280200470d014194a9c0" + "0020013602000f0b20022003417e71360204200020014101723602042000" + "20016a20013602000b20014180024f0440411f2102200042003702102001" + "41ffffff074d04402001410620014108766722026b764101712002410174" + "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" + "027422044190a9c000280200714504402003200036020020002003360218" + "2000200036020c200020003602084190a9c0004190a9c000280200200472" + "3602000f0b02400240200120032802002204280204417871460440200421" + "020c010b2001411920024101766b41002002411f471b7421030340200420" + "03411d764104716a41106a22052802002202450d02200341017421032002" + "210420022802044178712001470d000b0b20022802082201200036020c20" + "022000360208200041003602182000200236020c200020013602080f0b20" + "052000360200200020043602182000200036020c200020003602080f0b20" + "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" + "037674220171450440418ca9c000200120037236020020020c010b200228" + "02080b2101200220003602082001200036020c2000200236020c20002001" + "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" + "6a2201360200200020014101723602042000419ca9c000280200470d0141" + "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" + "004194a9c0004194a9c00028020020016a22013602002000200141017236" + "0204200020016a20013602000b0b8e0201057f230041206b220324002000" + "2802002202417f460440410020011019000b410820024101742204200241" + "016a2205200420054b1b2204200441084d1b220441004804404100200110" + "19000b20032002047f2003200236021c2003200028020436021441010541" + "000b360218200341086a2105027f0240200341146a220228020404402002" + "280208220645044041bda9c0002d00001a0c020b20022802002006410120" + "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" + "20052002410120021b360204200520024536020020032802084101460440" + "20032802101a200328020c20011019000b200328020c2102200020043602" + "0020002002360204200341206a24000b0d002000450440200110140b000b" + "f40102027f017e230041106b22022400200241013b010c20022001360208" + "20022000360204230041106b22002400200241046a220129020021042000" + "200136020c20002004370204230041106b22022400200041046a22012802" + "00220028020c2103024002400240024020002802040e020001020b20030d" + "0141012100410021030c020b20030d002000280200220028020421032000" + "28020021000c010b20024180808080783602002002200136020c20012802" + "0822012d0008210020012d00091a2002410420001033000b200220033602" + "0420022000360200200128020822012d0008210020012d00091a20024105" + "20001033000b6801017f230041306b220324002003200136020420032000" + "3602002003410236020c200341e483c00036020820034202370214200320" + "0341046aad4280808080108437032820032003ad42808080801084370320" + "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" + "002102230041106b22072400410a2103024020024190ce00490440200221" + "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" + "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" + "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" + "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" + "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" + "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" + "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" + "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" + "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" + "210941012108410a20036b220a2001280214220241017122056a21062008" + "410020024104711b2108412b418080c40020051b21052001280200450440" + "4101200128021c22002001280220220320052008101d0d011a2000200920" + "0a200328020c1103000c010b0240024002402006200128020422004f0440" + "200128021c22002001280220220320052008101d450d0141010c040b2002" + "410871450d01200128021021022001413036021020012d0018210c410121" + "0b200141013a0018200128021c22032001280220220420052008101d0d02" + "200020066b41016a210002400340200041016b2200450d01200341302004" + "280210110200450d000b41010c040b410120032009200a200428020c1103" + "000d031a2001200c3a00182001200236021041000c030b20002009200a20" + "0328020c110300210b0c010b200020066b2102024002400240410120012d" + "0018220020004103461b220041016b0e020001020b20022100410021020c" + "010b20024101762100200241016a41017621020b200041016a2100200128" + "0210210620012802202103200128021c210402400340200041016b220045" + "0d01200420062003280210110200450d000b41010c020b4101210b200420" + "0320052008101d0d0020042009200a200328020c1103000d004100210003" + "40410020002002460d021a200041016a2100200420062003280210110200" + "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" + "380002402002418080c400460d00200020022001280210110200450d0041" + "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" + "0c7f20002802042107200028020021030240024020012802002209200128" + "0208220072044002402000410171450d00200320076a2106024020012802" + "0c2205450440200321020c010b200321020340200222002006460d02027f" + "200041016a20002c0000220241004e0d001a200041026a20024160490d00" + "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" + "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" + "07027f02402004450d00200420074f044020042007460d0141000c020b20" + "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" + "001b21030b2009450440200128021c20032007200128022028020c110300" + "0f0b2001280204210c200741104f044020072003200341036a417c712204" + "6b22086a220a41037121094100210541002100200320044704402008417c" + "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" + "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" + "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" + "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" + "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" + "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" + "4a6a21050b200a4102762106200020056a21050340200421092006450d04" + "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" + "200641044f04402004200d41f007716a2108200421000340200028020c22" + "04417f7341077620044106767241818284087120002802082204417f7341" + "077620044106767241818284087120002802042204417f73410776200441" + "06767241818284087120002802002204417f734107762004410676724181" + "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" + "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" + "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" + "6a22022802002200417f734107762000410676724181828408712100200b" + "4101460d0220022802042204417f73410776200441067672418182840871" + "20006a2100200b4102460d0220022802082202417f734107762002410676" + "7241818284087120006a21000c020b2007450440410021050c030b200741" + "03712102027f200741044904404100210041000c010b20032c000041bf7f" + "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" + "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" + "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" + "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" + "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" + "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" + "41016b22020d000b0c020b200128021c20032007200128022028020c1103" + "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" + "20056a21050b02402005200c490440200c20056b21060240024002402001" + "2d00182200410020004103471b220041016b0e020001020b200621004100" + "21060c010b20064101762100200641016a41017621060b200041016a2100" + "2001280210210820012802202102200128021c21040340200041016b2200" + "450d02200420082002280210110200450d000b41010f0b200128021c2003" + "2007200128022028020c1103000f0b200420032007200228020c11030004" + "4041010f0b4100210003402000200646044041000f0b200041016a210020" + "0420082002280210110200450d000b200041016b2006490b140020002802" + "002001200028020428020c1102000b0e0041e480c000412b20001011000b" + "5901017f230041306b220324002003200136020c20032000360208200341" + "01360214200341dc80c0003602102003420137021c2003200341086aad42" + "8080808030843703282003200341286a360218200341106a2002101a000b" + "7f01017f027f0240027f0240200228020404402002280208220345044020" + "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" + "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" + "032002450c010b4104210341000b21022000200136020820002003360204" + "200020023602000bdd0101087f230041206b220224002000280200220341" + "7f460440410020011019000b20034101742204200341016a220620042006" + "4b1b220441ffffffff034b0440410020011019000b024041042004200441" + "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" + "02200341027436021c2002200028020436021441040520040b3602182002" + "41086a2006200241146a102220022802084101470d012002280210210520" + "0228020c0520050b210820052109200820011019000b200228020c210320" + "00200736020020002003360204200241206a24000bd10d021c7f077e2300" + "41206b220c2400200341016b211102400240024002402003044020034102" + "6b210520034101460d0402402001280208221420036b221941016a220e41" + "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" + "746a2802002115200220054102746a3502002123027f2004450440410421" + "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" + "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" + "09200e044020012802042212200941027420034102746b6a211320034101" + "7121162003417e71210d201241086b211b201241046b211c42002015ad22" + "2242208622247d2125200e210f0340024020090440201c20094102742204" + "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" + "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" + "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" + "868422202020202280222620227e7d21202026a70b21070240202042ffff" + "ffff0f560d00202520204220867c20217c21210340202120247c22212007" + "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" + "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" + "09200f460d04201220176a21182007ad212102400240201145044042ffff" + "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" + "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" + "22203e0200200441046a220a200a35020020204220887c2021200541046a" + "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" + "04200541086a2105200d200641026a2206470d000b2016450d010b201820" + "0641027422046a2205202020053502007c2021200220046a3502007e7d42" + "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" + "20114504404100210a410021080c030b41002104410021084100210a0340" + "200420136a22052005280200221d200220046a221e2802006a220620086a" + "2208360200200541046a22052005280200221f201e41046a2802006a2205" + "2006201d49200620084b726a22063602002005201f49200520064b722108" + "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" + "c000101b000b2016450d010b2018200a41027422046a2205200528020020" + "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" + "3602002001200941016b2209360208201341046b2113201220094102746a" + "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" + "200941016a220d3602082001280204220a200941027422046a2008360200" + "20080d03200d41ffffffff0371210702400340200721052004417c460d01" + "200541016b21072004200a6a2106200441046b21042006280200450d000b" + "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" + "41ac87c0001010000b200120053602082005210d0b024002400240024002" + "40200d200128020022044102764f0d002004200d490d012004450d002004" + "41027421040240200d450440200a41046b28020022054178712207410441" + "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" + "200a1004410421040c010b200a20044104200d41027410152204450d060b" + "2001200d360200200120043602040b41002106200e450d03200b200e4102" + "746a41046b2802000440200e21060c040b201441027420034102746b2104" + "201941026a210503402004417c460d04200541016b21052004200b6a2107" + "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" + "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" + "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b024002400240024020104102" + "7620064d0440201021040c010b200620104b0d01410021042010450d0020" + "1041027421052006450440200b41046b2802002207417871220a41044108" + "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" + "0b10044104210b0c010b200b20054104200622044102741015220b450d04" + "0b200020063602082000200b360204200020043602002000200129020037" + "020c200041146a200141086a280200360200200c41206a24000f0b200c41" + "00360218200c410136020c200c41ec84c000360208200c4204370210200c" + "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" + "010c7f230041306b220724002001280200210c0240024002400240024002" + "400240024002400240024002400240024020024504402001280204210b20" + "0c418080808078470d02200b41086a280200220441ffffffff034d044020" + "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" + "220b2001200c418080808078461b2208280208220941feffffff014f0d04" + "41bda9c0002d00001a200941026a220141027410012205450d0720054100" + "360200200720053602102007200136020c41012101200741013602142008" + "2802082206410274210d200828020421082006200941016a4b0440200741" + "0c6a2105230041206b22042400024002402006417f460d00200528020022" + "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" + "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" + "047f2004200941027436021c2004200528020436021441040541000b3602" + "18200441086a200a200441146a102220042802084101470d012004280210" + "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" + "0f36020020052001360204200441206a2400200728021021052007280214" + "21010b200520014102746a2008200d104c1a2007200120066a2204360214" + "0c030b200b41046a28020021092006450440410421054100210141042009" + "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" + "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" + "2004360214200720053602102007200136020c0b200341ff0171450d0202" + "40200220044d044020022004470d01200221040c040b2002410041c889c0" + "00101b000b20044102742109200241027421012003411f71210841002003" + "6b411f71210d410021030340200120056a22062006280200220620087420" + "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" + "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" + "89c0001023200728021021050b200520044102746a200336020020072004" + "41016a22043602140b41002108200728020c210a02402004450d00200520" + "0441027422016a41046b2802000440200421080c010b200541046b210d20" + "0441ffffffff037121030340200321062001450d01200641016b21032001" + "200d6a2109200141046b21012009280200450d000b200420062004200649" + "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" + "41002101200a450d00200a41027421032008450440200541046b28020022" + "06417871220941044108200641037122061b20036a490d04200641002009" + "200341276a4b1b0d0520051004410421050c010b20052003410420082201" + "41027410152205450d010b20002008360208200020053602042000200136" + "02002002450d06200c41808080807872418080808078460d06200b41046b" + "28020022014178712203200c410274220641044108200141037122011b6a" + "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" + "003602282007410136021c200741ec84c000360218200742043702202007" + "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" + "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" + "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" + "bda9c0002d00001a024002400240412010012202450d0020022001290000" + "370200200220012900083702082002200129001037021020022001280018" + "3602182002200128001c220336021c410821012000027f410820030d001a" + "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" + "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" + "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" + "1a2002280200450440200241046b28020022014178714124412820014103" + "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" + "210141000c010b200241204104410410152202450d014101210141010b36" + "020820002002360204200020013602000f0b000b41f996c000412e41a897" + "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" + "024106746a2124200028021c21222000280218211f2000280214211e2000" + "280210211b200028020c2123200028020821202000280204211d20002802" + "002102034020022001280000220341187420034180fe0371410874722003" + "4108764180fe03712003411876727222152022201b411a77201b41157773" + "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" + "1d202073200271201d202071732002411e772002411377732002410a7773" + "6a6a2203411e772003411377732003410a777320032002201d7371200220" + "1d71736a201f2001280004220541187420054180fe037141087472200541" + "08764180fe03712005411876727222136a200420236a2207201b201e7371" + "201e736a2007411a772007411577732007410777736a419189dd89076a22" + "066a2205411e772005411377732005410a77732005200220037371200220" + "0371736a201e2001280008220441187420044180fe037141087472200441" + "08764180fe03712004411876727222146a200620206a220c2007201b7371" + "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a201b200128000c220641187420064180fe037141087472200641" + "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" + "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" + "086a2206411e772006411377732006410a77732006200420057371200420" + "0571736a20072001280010220f411874200f4180fe037141087472200f41" + "08764180fe0371200f411876727222166a200220086a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280014220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a2001280018220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a200128001c220841187420084180fe0371410874722008410876" + "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" + "096a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280020220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" + "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" + "096a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280024220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" + "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" + "096a2207411e772007411377732007410a77732007200420067371200420" + "0671736a2001280028220841187420084180fe0371410874722008410876" + "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" + "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" + "096a2203411e772003411377732003410a77732003200620077371200620" + "0771736a200128002c220841187420084180fe0371410874722008410876" + "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" + "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" + "096a2205411e772005411377732005410a77732005200320077371200320" + "0771736a2001280030220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" + "200f736a2009411a772009411577732009410777736a41f4baf995076a22" + "0d6a2204411e772004411377732004410a77732004200320057371200320" + "0571736a2001280034220c411874200c4180fe037141087472200c410876" + "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" + "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" + "0d6a2206411e772006411377732006410a77732006200420057371200420" + "0571736a2001280038220c411874200c4180fe037141087472200c410876" + "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" + "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" + "0f6a2207411e772007411377732007410a77732007200420067371200420" + "0671736a200128003c220d411874200d4180fe037141087472200d410876" + "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" + "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" + "086a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20134119772013410e777320134103767320156a200a6a200c41" + "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" + "1773712012736a2015411a772015411577732015410777736a41bfac92db" + "016b22096a2205411e772005411377732005410a77732005200320077371" + "2003200771736a20144119772014410e777320144103767320136a200b6a" + "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" + "2015201773712017736a2013411a772013411577732013410777736a41fa" + "f08682016b220e6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20114119772011410e777320114103767320146a" + "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" + "6a22142013201573712015736a2014411a77201441157773201441077773" + "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" + "2004200573712004200571736a20164119772016410e7773201641037673" + "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" + "0720126a22112013201473712013736a2011411a77201141157773201141" + "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" + "7320072004200673712004200671736a20184119772018410e7773201841" + "03767320166a20216a2009410f772009410d77732009410a76736a221220" + "136a200320176a22162011201473712014736a2016411a77201641157773" + "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" + "410a777320032006200773712006200771736a20194119772019410e7773" + "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" + "221720146a200520156a22182011201673712011736a2018411a77201841" + "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" + "732005410a777320052003200773712003200771736a201a411977201a41" + "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" + "76736a221520116a200420136a22192016201873712016736a2019411a77" + "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" + "411377732004410a777320042003200573712003200571736a2002411977" + "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" + "17410a76736a221320166a200620146a221a2018201973712018736a201a" + "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" + "772006411377732006410a777320062004200573712004200571736a200a" + "411977200a410e7773200a4103767320026a20086a2015410f772015410d" + "77732015410a76736a221420186a200720116a22022019201a7371201973" + "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" + "07411e772007411377732007410a77732007200420067371200420067173" + "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" + "13410d77732013410a76736a221120196a200320166a220a2002201a7371" + "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" + "186a2203411e772003411377732003410a77732003200620077371200620" + "0771736a20104119772010410e7773201041037673200b6a200e6a201441" + "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" + "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" + "046b22196a2205411e772005411377732005410a77732005200320077371" + "2003200771736a201c411977201c410e7773201c4103767320106a20126a" + "2011410f772011410d77732011410a76736a221820026a200420196a2202" + "200a200b7371200a736a2002411a772002411577732002410777736a41b9" + "809a85046b221a6a2204411e772004411377732004410a77732004200320" + "0573712003200571736a20214119772021410e7773202141037673201c6a" + "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" + "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" + "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" + "2004200573712004200571736a200c411977200c410e7773200c41037673" + "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" + "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" + "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" + "7320072004200673712004200671736a200d411977200d410e7773200d41" + "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" + "026a200320106a2202200a200b7371200a736a2002411a77200241157773" + "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200f411977200f410e777320" + "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" + "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" + "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20084119772008410e" + "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" + "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" + "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a200941197720" + "09410e777320094103767320086a20166a200d410f77200d410d7773200d" + "410a76736a220820026a200620106a2202200a200b7371200a736a200241" + "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a200e41" + "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" + "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" + "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20124119772012410e7773201241037673200e6a20196a2008410f772008" + "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" + "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20174119772017410e777320174103767320126a201a6a2009410f" + "772009410d77732009410a76736a221220026a200520106a2202200a200b" + "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" + "6a22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20154119772015410e777320154103767320176a200c6a20" + "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" + "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" + "a8b3076a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20134119772013410e777320134103767320156a20" + "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" + "220b2002200a73712002736a200b411a77200b41157773200b410777736a" + "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20144119772014410e777320144103767320" + "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" + "20106a2202200a200b7371200a736a2002411a7720024115777320024107" + "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" + "20072004200673712004200671736a20114119772011410e777320114103" + "767320146a20086a2015410f772015410d77732015410a76736a2214200a" + "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" + "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20164119772016410e777320" + "164103767320116a20096a2013410f772013410d77732013410a76736a22" + "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" + "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20184119772018410e" + "777320184103767320166a200e6a2014410f772014410d77732014410a76" + "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" + "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201941197720" + "19410e777320194103767320186a20126a2011410f772011410d77732011" + "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" + "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201a41" + "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" + "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" + "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" + "410d77732018410a76736a221a20026a200320106a2202200a200b737120" + "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" + "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" + "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" + "6b22106a2205411e772005411377732005410a7773200520032007737120" + "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" + "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" + "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" + "aa83016a22106a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20084119772008410e7773200841037673200f6a20" + "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" + "2202200a200b7371200a736a2002411a772002411577732002410777736a" + "41968293cd016a221c6a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20094119772009410e777320094103767320" + "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" + "201c6a22082002200b7371200b736a2008411a7720084115777320084107" + "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" + "20072004200673712004200671736a200e411977200e410e7773200e4103" + "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" + "6a2003201c6a22092002200873712002736a2009411a7720094115777320" + "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" + "0a777320032006200773712006200771736a20124119772012410e777320" + "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" + "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" + "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" + "2005410a777320052003200773712003200771736a20174119772017410e" + "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" + "736a221220086a200220046a22082009200e73712009736a2008411a7720" + "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" + "1377732004410a777320042003200573712003200571736a201541197720" + "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" + "410a76736a221720096a200220066a22092008200e7371200e736a200941" + "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" + "2006411377732006410a777320062004200573712004200571736a201341" + "19772013410e777320134103767320156a200d6a2012410f772012410d77" + "732012410a76736a2215200e6a200220076a220e2008200973712008736a" + "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" + "411e772007411377732007410a777320072004200673712004200671736a" + "20144119772014410e777320144103767320136a200f6a2017410f772017" + "410d77732017410a76736a221320086a200220036a22082009200e737120" + "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" + "6a2203411e772003411377732003410a7773200320062007737120062007" + "71736a20114119772011410e777320114103767320146a20106a2015410f" + "772015410d77732015410a76736a221420096a200220056a22092008200e" + "7371200e736a2009411a772009411577732009410777736a41ee85bea407" + "6a22026a2205411e772005411377732005410a7773200520032007737120" + "03200771736a20164119772016410e777320164103767320116a200a6a20" + "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" + "08200973712008736a200e411a77200e41157773200e410777736a41efc6" + "95c5076a22026a2204411e772004411377732004410a7773200420032005" + "73712003200571736a20184119772018410e777320184103767320166a20" + "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" + "22082009200e73712009736a2008411a772008411577732008410777736a" + "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" + "04200573712004200571736a20194119772019410e777320194103767320" + "186a20126a2011410f772011410d77732011410a76736a221220096a2002" + "20076a22092008200e7371200e736a2009411a7720094115777320094107" + "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" + "20072004200673712004200671736a201a411977201a410e7773201a4103" + "767320196a20176a2016410f772016410d77732016410a76736a2217200e" + "6a200320116a220e2008200973712008736a200e411a77200e4115777320" + "0e410777736a41868084fa066b22116a2203411e77200341137773200341" + "0a777320032006200773712006200771736a200c411977200c410e777320" + "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" + "1220086a200520116a22052009200e73712009736a2005411a7720054115" + "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" + "2008410a777320082003200773712003200771736a200c200d411977200d" + "410e7773200d410376736a20136a2017410f772017410d77732017410a76" + "736a20096a200420156a22042005200e7371200e736a2004411a77200441" + "1577732004410777736a4189b89988046b22096a220c2003200873712003" + "200871736a200c411e77200c41137773200c410a77736a200d200f411977" + "200f410e7773200f410376736a20146a2012410f772012410d7773201241" + "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" + "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" + "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" + "21232004201f6a211f200520226a2122200141406b22012024470d000b20" + "00202236021c2000201f3602182000201e3602142000201b360210200020" + "2336020c200020203602082000201d360204200020023602000b89010101" + "7f027f0240200328020404402003280208220445044020012002450d031a" + "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" + "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" + "490d002002100b0c010b200210010b210320002002360208200020032001" + "20031b36020420002003453602000b3000200128021c20002d0000410274" + "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" + "1103000bfc0402037f017e23004180016b220224000240024020012d0000" + "220441c00171220341c000470440200241186a200141186a290000370300" + "200241106a200141106a290000370300200241086a200141086a29000037" + "030020022001290000220537030020022005a7413f713a0000200241406b" + "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" + "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" + "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" + "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" + "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" + "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" + "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" + "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" + "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" + "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" + "200041c0003a0020200041186a4200370300200041106a42003703002000" + "41086a42003703000c010b200241386a200241e8006a2903003703002002" + "41306a200241e0006a290300370300200220022903503703202002200241" + "d8006a2903003703282003044020002002290320370300200020033a0020" + "200041086a2002290328370300200041186a200241386a29030037030020" + "0041106a200241306a2903003703000c010b200241003602502002410136" + "0244200241a88cc00036024020024204370248200241406b419c8dc00010" + "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" + "00290300220c200041086a290300220d8450047e420005200741f0016a20" + "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" + "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" + "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" + "072903f0012112200741c8016a290300200741a8016a290300220d200729" + "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" + "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" + "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" + "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" + "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" + "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" + "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" + "21112000290310220c200041186a290300220d8450047e420005200741f0" + "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" + "104d20074180016a200d2002104d200741306a200c2003104d200741206a" + "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" + "0741c8006a290300200741286a290300220320072903407c2204200354ad" + "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" + "117c2204200254ad200420072903207c2202200454ad7c20022007418801" + "6a29030020074198016a29030022012007290380017c2204200154ad7c20" + "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" + "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" + "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" + "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" + "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" + "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" + "200e3703b002200720123703a002200720043703d802200720113703c802" + "2007200f3703b802200720133703a80220074188036a4200370300200741" + "80036a4200370300200741f8026a4200370300200742003703f002200741" + "f0026a210a41ff032109420021034200210442002101420021024201210d" + "0340200741106a2009410776410474220b200741a0026a6a220829030020" + "08290308200941ff00712208104e2004423f88210c20044201862003423f" + "888421042007290310420183200342018684210302400240024002400240" + "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" + "3f8884220242a9c0c689aece93b230858450044020032005542004200654" + "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" + "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" + "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" + "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" + "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" + "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" + "022004200f7d2104200320057d2103200941016a41810249200d42005271" + "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" + "22082008290300200729030084370300200841086a220820082903002007" + "41086a2903008437030020090d010b200020023703182000200137031020" + "0020043703082000200337030020074190036a24000f0b200941016b2109" + "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" + "3a00000240200004400340024002400240200041016b0e03000501020b03" + "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" + "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" + "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" + "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" + "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" + "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" + "0b0b840202047e017f200041086a29030021092000290300210a0240417f" + "2000290310220b200385200041186a290300220c20048584420052200320" + "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" + "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" + "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" + "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" + "2000200920027d22072001200a56ad22017d37030820002003427f852203" + "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" + "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" + "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" + "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" + "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" + "3700002003200210262000027f0240024002400240024002400240024002" + "40024002400240024002400240027f024002400240024002400240024002" + "7f02400240027f0240024002400240024002400240024002400240024002" + "400240024002400240024002400240200241046b28020022044178714124" + "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" + "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" + "290000370000200220012900002210370000200241106a2205200141106a" + "290000370000200241086a2208200141086a29000037000020022002411f" + "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" + "22072d00003a0001200720013a00002002411d6a22012d00002107200120" + "022d00023a0000200220073a00022002411c6a22012d0000210720012002" + "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" + "00043a0000200220073a00042002411a6a22012d00002107200120022d00" + "053a0000200220073a0005200241196a22012d00002107200120022d0006" + "3a0000200220073a000620042d00002101200420022d00073a0000200220" + "013a0007200241176a22012d00002104200120082d00003a000020082004" + "3a0000200241166a22012d00002104200120022d00093a0000200220043a" + "0009200241156a22012d00002104200120022d000a3a0000200220043a00" + "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" + "200241136a22012d00002104200120022d000c3a0000200220043a000c20" + "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" + "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" + "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" + "200241046b280200220141787141244128200141037122041b490d022004" + "4100200141c8004f1b0d032002100420032802082202450d120240024002" + "40200241016b220241feffffff0371450440200241ffffffff0371220441" + "016a2205410371210142002110200328020422082102200441034f044020" + "0541fcffffff07712104034020104280017c2110200241106a2102200441" + "046b22040d000b0b2001450d020340200235020020108620117c21112010" + "42207c2110200241046a2102200141016b22010d000b2011428080808010" + "540d010b200341406b200341146a2802003602002003200329020c370338" + "200341d0006a200341086a28020022043602002003200329020037034820" + "04450d0720032802402207450440200341206a418098c000280200220236" + "02002003412c6a2002360200200341f897c0002902002210370318200320" + "10370224200328024822020440200328024c220441046b28020022014178" + "7122052002410274220241044108200141037122011b6a490d0a20014100" + "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" + "3c220441046b280200220141787122052002410274220241044108200141" + "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" + "0b0240027f02400240024020044101460440200328024c220c2802002202" + "4101470d012003412c6a418098c000280200360200200341206a20034114" + "6a2802003602002003200329020c370318200341f897c000290200370224" + "20032802482202450d2a200c41046b280200220141787122042002410274" + "220241044108200141037122011b6a490d12200141002004200241276a4b" + "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" + "200747200420074b1b22050d0020074102742102200b41046b2106200441" + "02742101200c41046b2109200420076b21070340200204402001450d0720" + "0220066a2105200120096a2108200241046b2102200141046b2101417f20" + "082802002208200528020022054720052008491b2205450d010c020b0b41" + "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" + "450d1220074102742101200328023c2109200241ffff034d044020094104" + "6b2106410021040340200120066a22052005280200220541107622082008" + "20044110747220026e220420026c6b411074200541ffff03717222052002" + "6e22082004411074723602002005200220086c6b2104200141046b22010d" + "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" + "45044042002111200120096a0c270b200241016a41feffffff0771210120" + "0741027420096a41086b2102420021110340200241046a22042004350200" + "201142208684221120108022123e0200200220023502002011201020127e" + "7d42208684221120108022123e02002011201020127e7d2111200241086b" + "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" + "002003200329020c370224200341186a0c010b2003410036024020032802" + "38047f200b05200341386a418c87c0001023200328023c0b410136020020" + "0341406b4101360200200341206a41013602002003200329033837031820" + "0341246a0b220241086a418098c000280200360200200241f897c0002902" + "0037020020032802482202450d25200c41046b2802002201417871220420" + "02410274220241044108200141037122011b6a490d102001410020042002" + "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" + "20022802002202672208450440200341f8006a200341146a280200360200" + "2003200329020c370370200341186a200341f0006a200c20041024200328" + "02482202450d25200c41046b280200220141787122042002410274220241" + "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" + "200c10040c250b024002402003280238418080808078470d00200b280208" + "0d002003410036026c20034280808080c0003702640c010b200341e4006a" + "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" + "402003280248418080808078470d00200c2802080d004100210420034100" + "3602704100210541040c010b200341f0006a20032002452008411f711025" + "200328027021042003280278210520032802740b220120051024200341e0" + "006a200341206a28020036020020032003290218370358200328022c2105" + "200328022821092003280224210c20040440200141046b28020022074178" + "7122062004410274220441044108200741037122071b6a490d1420074100" + "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" + "404100210120092802080d0141042105410021040c220b41002101200545" + "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" + "0274220a20092206200620044102746a22056b4b04402005200a6a210120" + "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" + "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" + "200d2107200121040340200641016b2206200441016b22042d00003a0000" + "200741016b22070d000b0b200f4103490d00200441046b21040340200641" + "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" + "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" + "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" + "6b21064100200a6b210702402001200e6a2201410371450440200220064d" + "0d01200420056a41046b21050340200241046b2202200528020036020020" + "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" + "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" + "280200210a0340200241046b2202200a200e742005280200220a200d7672" + "360200200541046b2105200220064b0d000b0b2004410371210a20012007" + "6a21010c010b200a41104f044002402006410020066b41037122076a2204" + "20064d0d00200741016b210d200521022007044020072101034020062002" + "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" + "0b200d4107490d000340200620022d00003a0000200641016a200241016a" + "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" + "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" + "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" + "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" + "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" + "0371450440200420064f0d01200221050340200420052802003602002005" + "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" + "410374220a41187121072002417c71220f41046a21054100200a6b411871" + "210e200f280200210a03402004200a2007762005280200220a200e747236" + "0200200541046a2105200441046a22042006490d000b0b2001410371210a" + "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" + "0771220204400340200620052d00003a0000200541016a2105200641016a" + "2106200241016b22020d000b0b20014107490d010340200620052d00003a" + "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" + "003a0000200641036a200541036a2d00003a0000200641046a200541046a" + "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" + "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" + "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" + "0a41016b2104200a410371220504400340200641016b2206200141016b22" + "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" + "21050340200641016b200541036a2d00003a0000200641026b200541026a" + "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" + "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" + "200941046a28020021072009280208220420024522024d04402004410274" + "21022004044041bda9c0002d00001a200210012205450d360b2005200720" + "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" + "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" + "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" + "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" + "410371210820074103490d1b200641fcffffff077121070340200241046b" + "220620062802002206200176200572360200200241086b22052006200474" + "20052802002205200176723602002002410c6b2206200520047420062802" + "00220620017672360200200241106b220220062004742002280200220520" + "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" + "14200328021421022003280210210502402011428080045a04402002450d" + "0320024102742104200241ffffffff036a220741ffffffff037122020d01" + "42002110200420056a0c180b2002450d022011a721040c180b200241016a" + "41feffffff07712101200420056a41086b21024200211003402002350200" + "200241046a35020020104220868420118242208684201182211020024108" + "6b2102200141026b22010d000b0c150b2003280210210520032802142202" + "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" + "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" + "1011000b41b897c000412e41e897c0001011000b20034100360228200341" + "0136021c200341a099c00036021820034204370220200341186a41fc86c0" + "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" + "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" + "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" + "412e41e897c0001011000b200341003602282003410136021c200341a099" + "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" + "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" + "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" + "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" + "000b200341003602282003410136021c200341a099c00036021820034204" + "370220200341186a41989ac000101a000b200241086a0b21022007410171" + "047e201005200241046b3502002010422086842011820ba721010c010b20" + "0241027421024100210103402001411074200241046b220220056a280200" + "220141107672200470411074200141ffff037172200470210120020d000b" + "0b41002102200341206a418098c000280200360200200341f897c0002902" + "0037031820014504404104210741000c010b200341186a41f498c0001023" + "200328021c220720013602004101210220032802180b210a024002400240" + "0240200328020022010440200841046b2802002204417871220620014102" + "74220141044108200441037122041b6a490d01200441002006200141276a" + "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" + "787122082001410274220141044108200441037122041b6a490d02200441" + "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" + "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" + "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" + "41046b21020340200220022802002207200176200572360200200241046b" + "210220072004742105200841016b22080d000b0b41002101200b450d0020" + "09200b41027422026a41046b2802000440200b21010c010b200941046b21" + "07200b41ffffffff037121040340200421052002450d01200441016b2104" + "200220076a2108200241046b21022008280200450d000b200b2005200520" + "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" + "04200c450440200921050c050b200c41027421022001450440200941046b" + "2802002205417871220841044108200541037122051b20026a490d022005" + "41002008200241276a4b1b0d0320091004410421050c050b200121042009" + "200241042001410274101522050d040c180b200341003602282003410136" + "021c200341ec84c00036021820034204370220200341186a41f484c00010" + "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" + "001011000b200c2104200921050b200341206a200341e0006a2802003602" + "00200320032903583703182003200136022c200320053602282003200436" + "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" + "1105200241046b22022002350200201142208684221120108022123e0200" + "2011201020127e7d0ba721040b2003280238210b02402009200741027422" + "026a41046b2802000d00200941046b210620072101034020012105200245" + "0440410021070c020b200541016b2101200220066a2108200241046b2102" + "2008280200450d000b20072005200520074b1b21070b0240200b41027620" + "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" + "027421012007450440200941046b28020022054178712208410441082005" + "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" + "04410421090c010b2009200141042007220241027410152209450d100b20" + "034100360250200404402003280248047f200c05200341c8006a41dc86c0" + "001023200328024c0b2004360200200341013602500b2003412c6a200341" + "d0006a280200360200200320032903483702242003200936021c20032002" + "3602180b200328022c2102200328022821072003280224210a2003280218" + "2201450d00200328021c220541046b280200220441787122082001410274" + "220141044108200441037122041b6a490d04200441002008200141276a4b" + "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" + "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" + "86200720024102746a41046b28020067ad7d221042038820104207834200" + "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" + "a7220510012204450d0e0b200341003602202003200436021c2003200536" + "02182007200241016b22054102746a210920050440200241027441046b21" + "06410021020340200220076a280200210120032802182002460440200341" + "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" + "0241016a2205360220200141087621082003280218200546044020034118" + "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" + "03200541016a220536022020014110762108200328021820054604402003" + "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" + "002003200541016a22053602202001411876210120032802182005460440" + "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" + "3a00002003200541016a2205360220200241046a21012005210220012006" + "470d000b0b20092802002202450d05034020032802182001460440200341" + "186a419c88c00010180b200328021c220420016a20023a00002003200141" + "016a2201360220200241ff014b21052002410876210220050d000b0c060b" + "200341003602282003410136021c200341ec84c000360218200342043702" + "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" + "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" + "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" + "0218210d200141014b0d010b200341306a4200370300200341286a420037" + "0300200341206a4200370300200342003703180c010b200120046a210c41" + "002102200141017622084101470440200141016b2105200841feffffff07" + "71210b0340200420056a22062d000021092006200220046a22082d00003a" + "0000200820093a0000200c2002417e736a22062d00002109200620084101" + "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" + "2202470d000b0b20014102710440200220046a22052d000021082005200c" + "2002417f736a22022d00003a0000200220083a00000b200341306a420037" + "0300200341286a4200370300200341206a42003703002003420037031820" + "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" + "388620104280fe0383422886842010428080fc0783421886201042808080" + "f80f834208868484201042088842808080f80f832010421888428080fc07" + "838420104228884280fe038320104238888484842112200341306a290300" + "221042388620104280fe0383422886842010428080fc0783421886201042" + "808080f80f834208868484201042088842808080f80f8320104218884280" + "80fc07838420104228884280fe038320104238888484842113417f200329" + "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" + "9bb0a0acdd008584420052201142388620114280fe038342288684201142" + "8080fc0783421886201142808080f80f8342088684842011420888428080" + "80f80f832011421888428080fc07838420114228884280fe038320114238" + "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" + "422886842010428080fc0783421886201042808080f80f83420886848420" + "1042088842808080f80f832010421888428080fc07838420104228884280" + "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" + "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" + "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" + "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" + "20103703282000201237031841000c020b410021010b200020013a000141" + "010b3a00000240024002400240200a0440200741046b2802002202417871" + "2201200a410274220541044108200241037122021b6a490d012002410020" + "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" + "7871220141044108200241037122021b200d6a490d03200241002001200d" + "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" + "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" + "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" + "02057f167e230041e0006b22032400200341386a2204200141186a290300" + "370300200341306a2205200141106a290300370300200320012903003703" + "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" + "206a20022903002219200241086a290300221a2002290310221b20024118" + "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "042903002113200529030021142003290320211520032903282116200341" + "106a2206200141306a290300370300200341186a2207200141386a290300" + "370300200320012903203703002003200141286a29030037030820032002" + "290320220e200241286a290300220c20022903302211200241386a290300" + "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" + "030037030020052006290300370300200320032903083703282003200329" + "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" + "7c220d2016200329032822087c2209200854ad2009201520032903202208" + "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" + "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" + "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" + "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" + "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" + "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" + "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" + "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" + "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" + "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" + "210f024002402001290330221020012903107c2209200141286a29030022" + "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" + "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" + "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" + "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" + "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" + "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" + "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" + "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" + "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" + "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" + "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" + "307d21090b2003200f37035020032010370340200320093703582003200b" + "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" + "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" + "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" + "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" + "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" + "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" + "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" + "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" + "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" + "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" + "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" + "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d200341406b200329030020032903082003290310" + "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" + "002012370310200020183703082000201737030020002003290340370320" + "200041286a2003290348370300200041306a200341d0006a290300370300" + "200041386a200341d8006a290300370300200341e0006a24000ba706010a" + "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" + "03107c2207200241086a2903002203200141086a2903007c2204200354ad" + "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" + "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" + "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" + "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" + "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" + "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" + "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" + "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" + "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" + "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" + "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" + "02290330220920012903307c2204200241286a2903002205200141286a29" + "03007c2203200554ad20032002290320220520012903207c2206200554ad" + "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" + "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" + "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" + "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" + "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" + "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" + "450d002006210920052106200321080c010b200420032005200642c7faf3" + "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" + "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" + "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" + "2008370330200020093703202000200a3703102000200b37030020002004" + "37033820002006370328200020073703182000200c3703080bf10802087f" + "087e23004180016b22022400200141386a290300210e200141286a290300" + "210b200141186a2203290300210d2001290330210f2001290320210a2001" + "290310210c02400240024020012903002210200141086a22042903002211" + "844200520d00200c200d844200520d00200a200b844200520d00200e200f" + "84500d010b200241186a22052003290300370300200241106a2206200141" + "106a22072903003703002002200429030037030820022001290300370300" + "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200241386a2204200141206a220341186a29030037030020024130" + "6a2208200341106a22092903003703002002200341086a29030037032820" + "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" + "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2000027e2002290300220d2006290300220c842002290308220b200529" + "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" + "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" + "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" + "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" + "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" + "290350210a200241d0006a20072903003703002004200141186a29030037" + "0300200220012903003703402002200141086a290300370348200241406b" + "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200241f8006a2201200341186a290300370300200241f0006a22042009" + "2903003703002002200341086a2903003703682002200329030037036020" + "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f102b2004290300220c20022903602210842001290300220e2002" + "290368220b84845004404200210c4200210b4200210a4200210e4200210f" + "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" + "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" + "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" + "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" + "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" + "03402000200c370330200020022903403703102000200f3703082000200e" + "3703482000200b370338200041186a2002290348370300200041206a2002" + "41d0006a290300370300200041286a200241d8006a2903003703000c010b" + "20004200370308200042003703000b20024180016a24000b090020004100" + "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" + "220441016a360200024020044100480d00024041bca9c0002d0000450440" + "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" + "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" + "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" + "20004200370210200141ffffff074d04402001410620014108766722026b" + "7641017120024101746b413e6a21020b2000200236021c200241027441f4" + "a5c0006a2103410120027422044190a9c000280200714504402003200036" + "0200200020033602182000200036020c200020003602084190a9c0004190" + "a9c0002802002004723602000f0b02400240200120032802002204280204" + "417871460440200421020c010b2001411920024101766b41002002411f47" + "1b742103034020042003411d764104716a41106a22052802002202450d02" + "200341017421032002210420022802044178712001470d000b0b20022802" + "082203200036020c20022000360208200041003602182000200236020c20" + "0020033602080f0b20052000360200200020043602182000200036020c20" + "0020003602080bd20102067f017e230041206b2201240002400240200028" + "02002203417f460d00410420034101742202200341016a2204200220044b" + "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" + "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" + "1c2001200028020436021441100520020b360218200141086a2006200141" + "146a103720012802084101470d0120012802102102200128020c21050b20" + "0541dca4c0001019000b200128020c210320002004360200200020033602" + "04200141206a24000b7f01017f027f0240027f0240200228020404402002" + "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" + "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" + "0b2202411020021b21032002450c010b4110210341000b21022000200136" + "020820002003360204200020023602000bd20102067f017e230041206b22" + "0124000240024020002802002203417f460d004104200341017422022003" + "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" + "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" + "2001200341c0016c36021c2001200028020436021441100520020b360218" + "200141086a2006200141146a103720012802084101470d01200128021021" + "02200128020c21050b200541eca4c0001019000b200128020c2103200020" + "0436020020002003360204200141206a24000bdd0102067f017e23004120" + "6b2202240020002802002204417f460440410020011019000b4104200441" + "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" + "017e22084220884200520440410020011019000b02402008a7220741f0ff" + "ffff074d04404100210320022004047f2002200441c0016c36021c200220" + "0028020436021441100520030b360218200241086a2007200241146a1037" + "20022802084101470d01200228020c2106200228021021030b2006200110" + "19000b200228020c21042000200536020020002004360204200241206a24" + "000b830b02037f167e230041c0016b22022400200241186a220320004118" + "6a290300370300200241106a2204200041106a2903003703002002200029" + "03003703002002200041086a290300370308200241386a200141186a2903" + "002218370300200241306a200141106a2903002213370300200220014108" + "6a2903002214370328200220012903002215370320200242003703582002" + "42003703502002420037034820024201370340200241f8006a2201420037" + "0300200241f0006a42003703002002420037036820024200370360200329" + "0300210e2004290300210f2002290308210a200229030021072013211020" + "182111201521082014210b03400240200242003703980120024200370390" + "0120024200370388012002420137038001200220024180016a104a450440" + "200241406b21010c010b200241b8016a20024198016a2903003703002002" + "41b0016a20024190016a29030037030020022002290388013703a8012002" + "2002290380013703a001200241206a200241a0016a104a450440200241e0" + "006a21010c010b200241d8006a2903002112200229035021052002290348" + "21162002290340210d2007a74101714504400340200a423f862007420188" + "8421070240200da74101714504402016423f86200d42018884210d200542" + "3f8620164201888421160c010b200520137c2209201420167c2205201454" + "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" + "4201888421162006423f86200d42018884210d2009201354ad2005200954" + "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" + "0f42018884210f200e420188210e2012423f862005420188842105201242" + "018821122007420183500d000b2002200f3703102002200e3703180b2002" + "20053703502002200d370340200220073703002002201237035820022016" + "3703482002200a3703082001290300210920022903702106200229036821" + "172002290360210c2008a74101714504400340200b423f86200842018884" + "21080240200c420183a70440200620137c2219201420177c2206201454ad" + "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" + "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" + "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" + "20174201888421170b2010423f86200b42018884210b2011423f86201042" + "0188842110201142018821112009423f8620064201888421062009420188" + "21092008420183500d000b20022010370330200220113703380b20022006" + "3703702002200c3703602002200837032020022009370378200220173703" + "682002200b37032802400240200f201085200e2011858450044020072008" + "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" + "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" + "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" + "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" + "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" + "e0006a200d2016200520122015201420132018102d20062108200c210b0c" + "020b2002200720087d427e8322123703002002200a200b7d220520072008" + "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" + "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" + "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" + "2017200620092015201420132018102d20122107200d210a0c010b0b2000" + "2001290300370300200041186a200141186a290300370300200041106a20" + "0141106a290300370300200041086a200141086a290300370300200241c0" + "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" + "0141386a2226290300370300200341306a222c200141306a220e29030037" + "0300200341286a222d200141286a220f290300370300200341206a222e20" + "0141206a2210290300370300200341186a222f200141186a221129030037" + "0300200341106a2230200141106a22122903003703002003200129030037" + "03002003200141086a2227290300370308200320012002102f200341f800" + "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" + "6a2205290300370300200341e8006a2216200141e8006a22062903003703" + "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" + "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" + "092903003703002003200141c8006a220c29030037034820032001290340" + "370340200341406b200141406b2213200241406b2228102f200341b8016a" + "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" + "00370300200341a8016a2222200141a8016a290300370300200341a0016a" + "2223200141a0016a29030037030020034198016a222420014198016a2903" + "0037030020034190016a222520014190016a290300370300200320014188" + "016a2903003703880120032001290380013703800120034180016a200141" + "80016a222920024180016a222a102f200341f8016a221820042903003703" + "00200341f0016a22192005290300370300200341e8016a221a2006290300" + "370300200341e0016a221b2007290300370300200341d8016a221c200829" + "0300370300200341d0016a221d20092903003703002003200c2903003703" + "c801200320012903403703c001200341c0016a201320291030200341b802" + "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" + "00200341a8026a200241e8006a290300370300200341a0026a200241e000" + "6a29030037030020034198026a200241d8006a2903003703002003419002" + "6a200241d0006a2903003703002003200241c8006a290300370388022003" + "20022903403703800220034180026a2028202a1030200341c0056a200341" + "c0016a20034180026a102f2018200341f8056a2204290300370300201920" + "0341f0056a2205290300370300201a200341e8056a220629030037030020" + "1b200341e0056a2207290300370300201c200341d8056a22082903003703" + "00201d200341d0056a2209290300370300200320032903c8053703c80120" + "0320032903c0053703c00120034198066a220c201c290300370300200341" + "90066a220d201d290300370300200320032903c801370388062003200329" + "03c0013703800620034180066a2003290340223820032903482239200b29" + "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" + "6a220a2018290300370300200341b0066a220b2019290300370300200320" + "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" + "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200c29030022403703002009200d29030022413703" + "00200720032903a00622423703002005200b290300224337030020062003" + "2903a80622443703002004200a2903002245370300200320032903880622" + "463703c805200320032903800622473703c0052018204537030020192043" + "370300201a2044370300201b2042370300201c2040370300201d20413703" + "00200320463703c801200320473703c001200c201c290300370300200d20" + "1d290300370300200320032903c80137038806200320032903c001370380" + "0620034180066a2003290380012003290388012025290300202429030042" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" + "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" + "3703002003201a2903003703a8062003201b2903003703a006200341a006" + "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d2008200c29030022403703002009200d290300224137030020" + "0720032903a00622423703002005200b2903002243370300200620032903" + "a80622443703002004200a29030022453703002003200329038806224637" + "03c805200320032903800622473703c00520182045370300201920433703" + "00201a2044370300201b2042370300201c2040370300201d204137030020" + "0320463703c801200320473703c001200342003703b805200342003703b0" + "05200342003703a805200342013703a00520034200370398052003420037" + "03900520034200370388052003420937038005200341c0056a200341c001" + "6a20034180056a102f201820042903003703002019200529030037030020" + "1a2006290300370300201b2007290300370300201c200829030037030020" + "1d2009290300370300200320032903c8053703c801200320032903c00537" + "03c001200341c0056a200341c0016a200310302018200429030037030020" + "192005290300370300201a2006290300370300201b200729030037030020" + "1c2008290300370300201d2009290300370300200320032903c8053703c8" + "01200320032903c0053703c001200341d0026a2214201229030037030020" + "0341d8026a22152011290300370300200341e0026a221620102903003703" + "00200341e8026a2217200f290300370300200341f0026a221e200e290300" + "370300200341f8026a221f2026290300370300200320012903003703c002" + "200320272903003703c802200341c0026a200120131030200341b8036a20" + "0241386a2231290300370300200341b0036a200241306a22322903003703" + "00200341a8036a200241286a2233290300370300200341a0036a20024120" + "6a223429030037030020034198036a200241186a22352903003703002003" + "4190036a200241106a22362903003703002003200241086a223729030037" + "038803200320022903003703800320034180036a200220281030200341c0" + "056a200341c0026a20034180036a102f201f2004290300370300201e2005" + "290300370300201720062903003703002016200729030037030020152008" + "29030037030020142009290300370300200320032903c8053703c8022003" + "20032903c0053703c002200c2015290300370300200d2014290300370300" + "200320032903c80237038806200320032903c0023703800620034180066a" + "200329030022402003290308224120302903002242202f290300224342c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" + "0300200320172903003703a806200320162903003703a006200341a0066a" + "202e2903002244202d2903002245202c2903002246202b290300224742c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" + "002249370300200720032903a006224a3703002005200b290300224b3703" + "00200620032903a806224c3703002004200a290300224d37030020032003" + "29038806224e3703c8052003200329038006224f3703c005201f204d3703" + "00201e204b3703002017204c3703002016204a3703002015204837030020" + "1420493703002003204e3703c8022003204f3703c002200c201529030037" + "0300200d2014290300370300200320032903c80237038806200320032903" + "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200a201f290300370300200b201e290300370300200320172903" + "003703a806200320162903003703a006200341a0066a203c203d203e203f" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" + "2903002239370300200720032903a006223a3703002005200b290300223b" + "370300200620032903a806223c3703002004200a290300223d3703002003" + "200329038806223e3703c8052003200329038006223f3703c005201f203d" + "370300201e203b3703002017203c3703002016203a370300201520383703" + "00201420393703002003203e3703c8022003203f3703c002200341f8036a" + "2020290300370300200341f0036a2021290300370300200341e8036a2022" + "290300370300200341e0036a2023290300370300200341d8036a20242903" + "00370300200341d0036a202529030037030020032003290388013703c803" + "20032003290380013703c003200341c0036a20034180016a20034180056a" + "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" + "0300201e2005290300370300201720062903003703002016200729030037" + "03002015200829030037030020142009290300370300200320032903c805" + "3703c802200320032903c0053703c00220034190046a2213201229030037" + "030020034198046a22122011290300370300200341a0046a221120102903" + "00370300200341a8046a2210200f290300370300200341b0046a220f200e" + "290300370300200341b8046a220e20262903003703002003200129030037" + "038004200320272903003703880420034180046a200120291030200341f8" + "046a2031290300370300200341f0046a2032290300370300200341e8046a" + "2033290300370300200341e0046a2034290300370300200341d8046a2035" + "290300370300200341d0046a2036290300370300200320372903003703c8" + "04200320022903003703c004200341c0046a2002202a1030200341c0056a" + "20034180046a200341c0046a102f200e2004290300370300200f20052903" + "003703002010200629030037030020112007290300370300201220082903" + "0037030020132009290300370300200320032903c8053703880420032003" + "2903c00537038004200c2012290300370300200d20132903003703002003" + "2003290388043703880620032003290380043703800620034180066a2040" + "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" + "200b200f290300370300200320102903003703a806200320112903003703" + "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2008200c29030022383703002009200d2903002239370300200720032903" + "a006223a3703002005200b290300223b370300200620032903a806223c37" + "03002004200a290300223d3703002003200329038806223e3703c8052003" + "200329038006223f3703c005200e203d370300200f203b3703002010203c" + "3703002011203a37030020122038370300201320393703002003203e3703" + "88042003203f37038004200341c0056a20034180046a200341406b103020" + "0e2004290300370300200f20052903003703002010200629030037030020" + "112007290300370300201220082903003703002013200929030037030020" + "0320032903c80537038804200320032903c00537038004200c2012290300" + "370300200d20132903003703002003200329038804370388062003200329" + "0380043703800620034180066a2003290380012003290388012025290300" + "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" + "0b200f290300370300200320102903003703a806200320112903003703a0" + "06200341a0066a202329030020222903002021290300202029030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" + "2239370300200720032903a006223a3703002005200b290300223b370300" + "200620032903a806223c3703002004200a290300223d3703002003200329" + "038806223e3703c8052003200329038006223f3703c005200e203d370300" + "200f203b3703002010203c3703002011203a370300201220383703002013" + "20393703002003203e370388042003203f37038004200041386a20182903" + "00370300200041306a2019290300370300200041286a201a290300370300" + "200041206a201b290300370300200041186a201c29030037030020004110" + "6a201d290300370300200041086a20032903c801370300200020032903c0" + "01370300200020032903c002370340200041c8006a20032903c802370300" + "200041d0006a2014290300370300200041d8006a20152903003703002000" + "41e0006a2016290300370300200041e8006a2017290300370300200041f0" + "006a201e290300370300200041f8006a201f290300370300200041b8016a" + "200e290300370300200041b0016a200f290300370300200041a8016a2010" + "290300370300200041a0016a201129030037030020004198016a20122903" + "0037030020004190016a201329030037030020004188016a200329038804" + "370300200020032903800437038001200341c0066a24000b830c02137f04" + "7e23004180026b22032400200341d8006a2207200141186a290300370300" + "200341d0006a2208200141106a2903003703002003200141086a29030037" + "034820032001290300370340200341406b2002290300200241086a290300" + "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "98016a2204200141386a29030037030020034190016a2205200141306a29" + "03003703002003200141286a290300370388012003200129032037038001" + "20034180016a2002290320200241286a2903002002290330200241386a29" + "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" + "00200341106a220c2008290300370300200341206a220d20032903800137" + "0300200341286a220e200329038801370300200341306a220f2005290300" + "370300200341386a22102004290300370300200320032903483703082003" + "2003290340370300200241f8006a2903002116200241e8006a2903002117" + "2002290370211820022903602119200341f8016a2209200141d8006a2903" + "00370300200341f0016a2206200141d0006a2903003703002003200141c8" + "006a2903003703e801200320012903403703e001200341e0016a20022903" + "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" + "2903003703002003200141e8006a29030037038801200320012903603703" + "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2007200929030037030020082006290300370300200341e0006a22112003" + "29038001370300200341e8006a2212200329038801370300200341f0006a" + "22132005290300370300200341f8006a2214200429030037030020032003" + "2903e801370348200320032903e001370340200241b8016a290300211620" + "0241a8016a290300211720022903b001211820022903a0012119200341d8" + "016a220a20014198016a290300370300200341d0016a221520014190016a" + "290300370300200320014188016a2903003703c801200320012903800137" + "03c001200341c0016a20022903800120024188016a290300200229039001" + "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" + "6a2903003703002006200141b0016a2903003703002003200141a8016a29" + "03003703e801200320012903a0013703e001200341e0016a201920172018" + "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" + "290300370300200341a0016a220120032903e001370300200341a8016a22" + "0220032903e801370300200341b0016a220a2006290300370300200341b8" + "016a22062009290300370300200320032903c80137038801200320032903" + "c00137038001200041386a2010290300370300200041306a200f29030037" + "0300200041286a200e290300370300200041206a200d2903003703002000" + "41186a200b290300370300200041106a200c290300370300200041086a20" + "032903083703002000200329030037030020002003290340370340200041" + "c8006a2003290348370300200041d0006a2008290300370300200041d800" + "6a2007290300370300200041e0006a2011290300370300200041e8006a20" + "12290300370300200041f0006a2013290300370300200041f8006a201429" + "0300370300200041b8016a2006290300370300200041b0016a200a290300" + "370300200041a8016a2002290300370300200041a0016a20012903003703" + "0020004198016a200429030037030020004190016a200529030037030020" + "004188016a20032903880137030020002003290380013703800120034180" + "026a24000bf11902287f087e23004180056b22022400200241386a222420" + "0141386a220a290300370300200241306a2225200141306a220329030037" + "0300200241286a2226200141286a2204290300370300200241206a222720" + "0141206a2205290300370300200241186a2228200141186a220f29030037" + "0300200241106a2229200141106a22062903003703002002200129030037" + "03002002200141086a2207290300370308200220012001102f200241f800" + "6a2210200a290300370300200241f0006a22112003290300370300200241" + "e8006a22122004290300370300200241e0006a2213200529030037030020" + "0241d8006a2214200f290300370300200241d0006a221520062903003703" + "002002200729030037034820022001290300370340200241406b20012001" + "41406b2218102f20024180046a200241406b200241406b10302010200241" + "b8046a220b2903003703002011200241b0046a220c290300370300201220" + "0241a8046a220d2903003703002013200241a0046a220e29030037030020" + "1420024198046a2208290300370300201520024190046a22092903003703" + "0020022002290388043703482002200229038004370340200141f8006a22" + "19290300212a200141f0006a221a290300212b200141e8006a221b290300" + "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" + "00200241f0046a220f2006290300370300200220072903003703e8042002" + "20012903003703e004200241e0046a2001290340200141c8006a221d2903" + "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008200a29030037030020092003290300370300200220" + "0429030037038804200220052903003703800420024180046a202d202c20" + "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" + "37030020024190036a2204200f290300370300200241a0036a2205200229" + "038004370300200241a8036a2206200229038804370300200241b0036a22" + "072009290300370300200241b8036a221620082903003703002002200229" + "03e80437038803200220022903e0043703800320024180046a2002418003" + "6a20014180016a220a10302016200b2903003703002007200c2903003703" + "002006200d2903003703002005200e290300370300200320082903003703" + "002004200929030037030020022002290388043703880320022002290380" + "043703800320024180046a20024180036a20024180036a102f2016200b29" + "03003703002007200c2903003703002006200d2903003703002005200e29" + "030037030020032008290300370300200420092903003703002002200229" + "0388043703880320022002290380043703800320024190016a2203201e29" + "030037030020024198016a2204201f290300370300200241a0016a220520" + "1c290300370300200241a8016a2206201b290300370300200241b0016a22" + "07201a290300370300200241b8016a221620192903003703002002200129" + "0340370380012002201d2903003703880120024180016a2018200a102f20" + "024180046a20024180016a20024180016a10302016200b29030037030020" + "07200c2903003703002006200d2903003703002005200e29030037030020" + "042008290300370300200320092903003703002002200229038804370388" + "01200220022903800437038001200241d0016a221820014190016a290300" + "370300200241d8016a221920014198016a290300370300200241e0016a22" + "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" + "370300200241f0016a221c200141b0016a290300370300200241f8016a22" + "1d200141b8016a29030037030020022001290380013703c0012002200141" + "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" + "2016290300370300200241b0026a22162007290300370300200241a8026a" + "22072006290300370300200241a0026a2206200529030037030020024198" + "026a2205200429030037030020024190026a220420032903003703002002" + "42003703f803200242003703f003200242003703e803200242013703e003" + "200242003703d803200242003703d003200242003703c803200242093703" + "c00320022002290388013703880220022002290380013703800220024180" + "026a20024180016a200241c0036a102f20024180046a20024180026a2002" + "1030201e200b2903003703002016200c2903003703002007200d29030037" + "03002006200e290300370300200520082903003703002004200929030037" + "0300200241d0026a22032018290300370300200241d8026a221f20192903" + "00370300200241e0026a2220201a290300370300200241e8026a2221201b" + "290300370300200241f0026a2222201c290300370300200241f8026a2223" + "201d29030037030020022002290388043703880220022002290380043703" + "8002200220022903c0013703c002200220022903c8013703c802200241c0" + "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" + "41406b10302023200b2903003703002022200c2903003703002021200d29" + "03003703002020200e290300370300201f20082903003703002003200929" + "030037030020022002290388043703c80220022002290380043703c00220" + "024180046a200241406b20024180036a10302010200b2903003703002011" + "200c2903003703002012200d2903003703002013200e2903003703002014" + "200829030037030020152009290300370300200220022903880437034820" + "0220022903800437034020024180046a200241406b20024180016a103020" + "10200b2903003703002011200c2903003703002012200d29030037030020" + "13200e290300370300201420082903003703002015200929030037030020" + "022002290388043703482002200229038004370340200241d8046a220120" + "14290300370300200241d0046a220a201529030037030020022002290348" + "3703c804200220022903403703c004200241c0046a200229030020022903" + "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" + "0300370300200f2011290300370300200220122903003703e80420022013" + "2903003703e004200241e0046a2027290300202629030020252903002024" + "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" + "09200a290300222b370300200e20022903e004222c370300200c200f2903" + "00222d370300200d20022903e804222e370300200b2017290300222f3703" + "00200220022903c804223037038804200220022903c00422313703800420" + "10202f3703002011202d3703002012202e3703002013202c370300201420" + "2a3703002015202b37030020022030370348200220313703402001201429" + "0300370300200a2015290300370300200220022903483703c80420022002" + "2903403703c004200241c0046a20022903c00120022903c8012018290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" + "0f2011290300370300200220122903003703e804200220132903003703e0" + "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" + "222b370300200e20022903e004222c370300200c200f290300222d370300" + "200d20022903e804222e370300200b2017290300222f3703002002200229" + "03c804223037038804200220022903c0042231370380042010202f370300" + "2011202d3703002012202e3703002013202c3703002014202a3703002015" + "202b3703002002203037034820022031370340200041386a201e29030037" + "0300200041306a2016290300370300200041286a20072903003703002000" + "41206a2006290300370300200041186a2005290300370300200041106a20" + "04290300370300200041086a200229038802370300200020022903800237" + "0300200020022903c002370340200041c8006a20022903c8023703002000" + "41d0006a2003290300370300200041d8006a201f290300370300200041e0" + "006a2020290300370300200041e8006a2021290300370300200041f0006a" + "2022290300370300200041f8006a2023290300370300200041b8016a2010" + "290300370300200041b0016a2011290300370300200041a8016a20122903" + "00370300200041a0016a201329030037030020004198016a201429030037" + "030020004190016a201529030037030020004188016a2002290348370300" + "200020022903403703800120024180056a24000bfe09011d7e2001290310" + "22022001290300220484200141186a2903002215200141086a2903002203" + "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" + "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" + "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" + "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" + "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" + "01290320220484200141386a2903002208200141286a2903002203848442" + "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" + "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" + "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" + "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" + "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" + "006a290300210220012903702104200129036021032001290350220e2001" + "290340220f84200141d8006a2903002205200141c8006a29030022108484" + "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" + "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" + "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" + "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" + "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" + "2004842002200884844200520440427f4200427f4200200342788342c7fa" + "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" + "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" + "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" + "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" + "6a2903002108200141a8016a290300210220012903b001210420012903a0" + "01210342002105200129039001221220012903800122138420014198016a" + "290300221e20014188016a290300221484844200520440427f4200427f42" + "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" + "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" + "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" + "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" + "7d21110b4200211242002113420021142003200484200220088484420052" + "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" + "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" + "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" + "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" + "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" + "00200a3703900120002011370380012000200f3703702000200737036020" + "0020093703502000200d3703402000201a37033020002006370320200020" + "0b37031020002018370300200020143703b801200020123703a801200020" + "17370398012000201d37038801200020103703782000200e370368200020" + "163703582000201c3703482000201b370338200020153703282000200c37" + "0318200020193703080b960501057f230041800c6b220324002003200120" + "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" + "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" + "03b809200342003703b009200342003703a809200342013703a009200342" + "003703980920034200370390092003420037038809200342093703800920" + "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" + "6a290300370300200341d00b6a20034190026a290300370300200341d80b" + "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" + "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" + "6a290300370300200341f80b6a200341b8026a290300370300200341880b" + "6a20032903c801370300200341900b6a200341d0016a2903003703002003" + "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" + "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" + "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" + "2003290380023703c00b200320032903c0013703800b20034180066a2003" + "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" + "034180076a200341c00b6a220720034180016a103020034180096a200120" + "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" + "4180016a20034180046a1030200341c00a6a200220051030200620024140" + "6b20034180056a1030200720024180016a200341c0056a1030200341c007" + "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" + "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" + "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" + "0002400240200129034022212001290350222084200141c8006a29030022" + "23200141d8006a2903002222848442005204402002290340221d20022903" + "50221584200241c8006a2903002224200241d8006a290300221e8484500d" + "01200341f8016a2204200141406b220641186a2205290300370300200341" + "f0016a2208200641106a220b290300370300200320062903003703e00120" + "03200641086a220c2903003703e801200341e0016a202120232020202242" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" + "200241406b220741186a220d29030037030020034190026a220a20074110" + "6a220e2903003703002003200741086a220f290300370388022003200729" + "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" + "00200341106a200141106a2903003703002003200141086a290300370308" + "20032001290300370300200320032903800222162003290388022219200a" + "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b200341386a2209200241186a290300370300200341306a220a" + "200241106a2903003703002003200241086a290300370328200320022903" + "00370320200341206a20032903e001222c20032903e80122302008290300" + "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200341b8036a22042005290300370300200341b0036a2205200b2903" + "003703002003200c2903003703a803200320062903003703a003200341a0" + "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f102b200429030021132005290300211f20032903a803211c20032903a0" + "0321172004200d2903003703002005200e2903003703002003200f290300" + "3703a803200320072903003703a003200341a0036a201620192025202842" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" + "05290300211420032903a803211120032903a003211a200341d0006a2001" + "41306a290300370300200341d8006a2206200141386a2903003703002003" + "20012903203703402003200141286a290300370348200341406b201a2011" + "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" + "f8006a2207200241386a290300370300200341f0006a2208200241306a29" + "03003703002003200241286a290300370368200320022903203703602003" + "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b02402003200341206a104a450440200341406b200341e0006a" + "104a450d010b200420092903003703002005200a29030037030020032003" + "2903283703a803200320032903203703a003200341a0036a200329030020" + "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" + "290300211f2005290300211c20032903a003211720032903a80321122004" + "200729030037030020052008290300370300200320032903683703a80320" + "0320032903603703a003200341a0036a2003290340200329034820032903" + "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" + "842114201742018621112004290300211a2005290300211b20032903a803" + "211820032903a003212602400240201c4201862012423f8884222942ddb0" + "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" + "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" + "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" + "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d002011212a201421110c010b20132029201420" + "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" + "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" + "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" + "21130b200341b8036a22012013370300200320293703b0032003202a3703" + "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" + "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "2003201f3703d8012003201c3703d001200320123703c801200320173703" + "c001200341c0016a20032903a003222920032903a803222a20032903b003" + "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b20184201862026423f888421112026420186212602400240201b4201" + "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" + "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" + "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" + "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" + "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" + "89aece93b230511b450d002026211a2011211b201821140c010b20132018" + "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" + "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" + "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" + "b2307d21130b20034198016a2201200341186a2903003703002003419001" + "6a2202200341106a29030037030020032003290308370388012003200329" + "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" + "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" + "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" + "290300370300200320032903483703a803200320032903403703a0032003" + "41a0036a20032903c001221120032903c801221820032903d00122272003" + "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "102b200320133703b802200320143703b0022003201b3703a8022003201a" + "3703a002200429030021262005290300212920032903a803212a20032903" + "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200329038801222b4201862003290380012211423f" + "88842118201142018621270240024020022903002211420186202b423f88" + "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" + "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" + "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" + "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" + "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" + "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" + "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" + "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" + "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" + "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" + "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" + "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" + "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200341a0016a20032903800120032903880120032903900120" + "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b202a420186202d423f88842114202d4201862111024002402029420186" + "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" + "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" + "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" + "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" + "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" + "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" + "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" + "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" + "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" + "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" + "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" + "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" + "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" + "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" + "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" + "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" + "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" + "c689aece93b230511b450d002024212220232113202021140c010b202120" + "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" + "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" + "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" + "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" + "370300200320223703c002200320133703c802200341c0026a2022201320" + "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" + "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" + "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" + "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" + "0041186a200341b8026a290300370300200041106a200341b0026a290300" + "370300200041086a20032903a802370300200020032903a0023703002000" + "20032903a001370320200041286a20032903a801370300200041306a2003" + "41b0016a290300370300200041386a200341b8016a290300370300200020" + "032903c002370340200041c8006a20032903c802370300200041d0006a20" + "02290300370300200041d8006a20012903003703000c030b200341b8036a" + "2204200141186a290300221b370300200341b0036a2205200141106a2903" + "0022183703002003200141086a29030022163703a8032003200129030022" + "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" + "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" + "211d2005290300211520032903a803212420032903a003211f2004200141" + "206a220241186a2903003703002005200241106a29030037030020032002" + "41086a2903003703a803200320022903003703a003200341a0036a200129" + "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" + "1c20032903a8032117200420042903002225370300200320133703b00320" + "0320173703a8032003201c3703a003200341a0036a201c20172013202542" + "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" + "032903b003211e20032903a803211120032903a003211a02400240024020" + "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" + "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" + "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" + "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" + "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" + "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" + "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" + "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" + "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" + "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" + "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" + "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" + "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" + "90036a22062004290300370300200320032903a803370388032003200329" + "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d20012005290300370300200420062903003703002003200329" + "0388033703a80320032003290380033703a003200341a0036a201a201120" + "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" + "2903a0032213423f88842117201342018621120240024002402004290300" + "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" + "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" + "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" + "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" + "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" + "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" + "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" + "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" + "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" + "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" + "b87f2116201f42018621190240024020154201862024423f8884222842dd" + "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" + "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" + "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" + "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" + "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" + "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" + "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" + "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" + "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" + "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" + "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" + "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" + "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" + "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" + "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" + "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" + "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" + "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" + "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" + "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" + "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" + "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" + "88842112201b420186211602400240201c4201862018423f8884222542dd" + "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" + "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" + "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" + "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" + "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" + "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" + "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" + "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" + "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" + "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2011420186201a423f88842116201a420186211a02400240" + "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" + "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" + "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" + "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" + "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" + "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" + "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" + "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" + "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" + "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" + "91a8b87f211420114201862111024002402012420186201a423f88842216" + "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" + "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" + "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" + "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" + "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" + "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" + "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" + "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" + "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" + "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" + "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" + "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" + "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" + "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" + "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" + "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" + "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" + "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" + "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" + "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" + "37030020034190036a2204200241106a2903003703002003200229030037" + "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" + "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" + "02200320243703e002200129030021212004290300212320032903800321" + "22200329038803211d200120133703002003201c37039003200320183703" + "88032003201b3703800320034180036a20032903a00320032903a8032003" + "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" + "e0026a200329038003200329038803200329039003200129030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" + "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" + "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" + "20224201862122024002402023420186201d423f8884221342ddb0858ce8" + "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" + "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" + "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" + "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" + "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" + "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" + "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" + "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" + "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" + "2023370340200020032903a003370300200020032903e002370320200020" + "2137035820002022370348200041086a20032903a803370300200041286a" + "20032903e802370300200041186a200341b8036a29030037030020004110" + "6a200341b0036a290300370300200041306a200341f0026a290300370300" + "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" + "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" + "230041a0016b220224000240200129034022082001290350220984200141" + "c8006a290300220a200141d8006a290300220b8484420052044020024200" + "370318200242003703102002420037030820024201370300024020014140" + "6b2002104a450440200241206a2001290320220837030020002001290300" + "2209370310200041306a2008370300200241386a200141386a2903002208" + "370300200241306a200141306a290300220a370300200241286a20014128" + "6a290300220b370300200241106a200141106a290300220c370300200241" + "186a200141186a290300220d370300200041186a200141086a290300220e" + "370300200041206a200c370300200041286a200d370300200041386a200b" + "370300200041406b200a370300200041c8006a2008370300200220093703" + "002002200e3703080c010b20024198016a2204200b370300200220093703" + "900120022008370380012002200a37038801200242a9c0c689aece93b230" + "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" + "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" + "20022903800121082002290388012109200229039001210a200241186a22" + "032004290300220b3703002002200a370310200220093703082002200837" + "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f102b2003290300210c2002290310210d2002290308210e20022903" + "00210f200241d0006a2204200141106a290300370300200241d8006a2205" + "200141186a290300370300200220012903003703402002200141086a2903" + "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" + "0241f0006a2207200141306a2903003703002002200141286a2903003703" + "68200220012903203703602003200b3703002002200a3703102002200937" + "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" + "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" + "2b200320052903002208370300200241106a200429030022093703002002" + "41206a2002290360220a370300200241286a2002290368220b3703002002" + "41306a2007290300220c370300200241386a2006290300220d3703002000" + "2002290340220e370310200041186a2002290348220f370300200041206a" + "2009370300200041286a2008370300200041306a200a370300200041386a" + "200b370300200041406b200c370300200041c8006a200d3703002002200f" + "3703082002200e3703000b20004200370308200042013703000c010b2000" + "4200370308200042003703000b200241a0016a24000b3000200128021c20" + "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" + "0128022028020c1103000bf917021d7f087e23004180066b220224002002" + "41b8036a2208200141386a290300370300200241b0036a2209200141306a" + "290300370300200241a8036a2213200141286a290300370300200241a003" + "6a2214200141206a29030037030020024198036a2203200141186a290300" + "37030020024190036a2204200141106a2903003703002002200129030037" + "0380032002200141086a2903003703880320024180036a20012001102f20" + "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" + "f0006a290300370300200241e8036a2207200141e8006a29030037030020" + "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" + "d8006a290300370300200241d0036a220c200141d0006a29030037030020" + "02200141c8006a2903003703c803200220012903403703c003200241c003" + "6a200141406b221e201e102f200241b8046a221520052903003703002002" + "41b0046a22162006290300370300200241a8046a22172007290300370300" + "200241a0046a2218200a29030037030020024198046a2219200b29030037" + "030020024190046a221a200c290300370300200220022903c80337038804" + "200220022903c0033703800420024180046a200241c0036a200241c0036a" + "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" + "026a2205290300370300200241f0046a220e200241f0026a220a29030037" + "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" + "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" + "2207290300370300200241d0046a2211200241d0026a220b290300370300" + "200220022903c8023703c804200220022903c0023703c004200241c0046a" + "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" + "200241d0056a220d2011290300370300200220022903c8043703c8052002" + "20022903c0043703c005200241c0056a2002290380032002290388032004" + "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" + "201b290300370300200241f0056a2204200e2903003703002002200f2903" + "003703e805200220102903003703e005200241e0056a2014290300201329" + "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" + "026a2208201229030037030020024190026a2209200d2903003703002002" + "41a8026a221320022903e805370300200241b0026a221420042903003703" + "00200241b8026a221b2003290300370300200220022903c8053703880220" + "0220022903c00537038002200220022903e0053703a00220122008290300" + "370300200d200929030037030020022002290388023703c8052002200229" + "0380023703c005200241c0056a200229038004200229038804201a290300" + "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" + "042014290300370300200220132903003703e805200220022903a0023703" + "e005200241e0056a201829030020172903002016290300201529030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200241186a22152012290300370300200241" + "106a2216200d290300370300200241206a221720022903e0053703002002" + "41286a221820022903e805370300200241306a2219200429030037030020" + "0241386a221a2003290300370300200220022903c8053703082002200229" + "03c005370300200241c0026a200220021030201a20052903003703002019" + "200a290300370300201820062903003703002017200c2903003703002015" + "20072903003703002016200b290300370300200220022903c80237030820" + "0220022903c002370300200241c0026a20024180036a20024180036a1030" + "200241406b200241c0026a20024180036a103020024190056a220e200241" + "d0006a29030037030020024198056a220f200241d8006a29030037030020" + "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" + "e8006a290300370300200241b0056a221c200241f0006a29030037030020" + "0241b8056a221d200241f8006a2903003703002002200229034037038005" + "200220022903483703880520024180056a200241406b200241406b102f20" + "0241c0026a2002200210302003200f2903003703002004200e2903003703" + "0020022002290388053703e80520022002290380053703e005200241e005" + "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d2008201d2903003703002009201c2903003703002002" + "201129030037038802200220102903003703800220024180026a20022903" + "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d2008290300211f200929030021202003290300212120042903002122" + "2002290388022123200229038002212420022903e805212520022903e005" + "212620024180016a20024180046a20024180046a1030200241c0026a2002" + "4180016a20024180016a1030200241b8016a220e20052903003703002002" + "41b0016a220f200a290300370300200241a8016a22102006290300370300" + "200241a0016a2211200c29030037030020024198016a221c200729030037" + "030020024190016a221d200b290300370300200220022903c80237038801" + "200220022903c00237038001200241c0026a20024180016a20024180016a" + "1030200e2005290300370300200f200a2903003703002010200629030037" + "03002011200c290300370300201c2007290300370300201d200b29030037" + "0300200220022903c80237038801200220022903c00237038001200241c0" + "016a201e20014180016a102f200320152903003703002004201629030037" + "0300200220022903083703e805200220022903003703e005200241e0056a" + "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" + "030020092019290300370300200220182903003703880220022017290300" + "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d20072003290300370300200b20042903003703002006200229038802" + "370300200a200929030037030020052008290300370300200220022903e8" + "053703c802200220022903e0053703c00220022002290380023703e00220" + "024180026a200241406b200241c0026a102f20122008290300370300200d" + "200929030037030020022002290388023703c80520022002290380023703" + "c005200241c0056a200229038001200229038801201d290300201c290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" + "00370300200220132903003703e805200220022903a0023703e005200241" + "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20072012290300370300200b200d290300370300200c20" + "022903e005370300200620022903e805370300200a200429030037030020" + "052003290300370300200220022903c8053703c802200220022903c00537" + "03c00220004180016a200241c0016a200241c0016a10302000201f370338" + "200020203703302000202337032820002024370320200020213703182000" + "20223703102000202537030820002026370300200020022903c002370340" + "200041c8006a20022903c802370300200041d0006a200b29030037030020" + "0041d8006a2007290300370300200041e0006a200c290300370300200041" + "e8006a2006290300370300200041f0006a200a290300370300200041f800" + "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" + "6b22032400024002400240024020012903800120014188016a2903008442" + "00520d0020012903900120014198016a290300844200520d0020012903a0" + "01200141a8016a290300844200520d0020012903b001200141b8016a2903" + "0084500d010b024020022903800120024188016a290300844200520d0020" + "022903900120024198016a290300844200520d0020022903a001200241a8" + "016a290300844200520d0020022903b001200241b8016a29030084500d02" + "0b200341b8086a221420014180016a220441386a290300370300200341b0" + "086a200441306a290300370300200341a8086a2215200441286a29030037" + "0300200341a0086a200441206a29030037030020034198086a2216200441" + "186a29030037030020034190086a200441106a2903003703002003200429" + "0300370380082003200441086a2903003703880820034180086a20042004" + "102f200341f8086a221720024180016a220541386a290300370300200341" + "f0086a200541306a290300370300200341e8086a2218200541286a290300" + "370300200341e0086a200541206a290300370300200341d8086a22192005" + "41186a290300370300200341d0086a200541106a29030037030020032005" + "41086a2903003703c808200320052903003703c008200341c0086a200520" + "05102f20032001200341c0086a102f200341406b200220034180086a102f" + "20034180016a200420034180086a102f200341c0016a2005200341c0086a" + "102f20034180026a200141406b200341c0016a102f200341c0026a200241" + "406b20034180016a102f024002402003200341406b104a0d00200341206a" + "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" + "026a200341e0026a104a450d010b200341386a290300211f200341286a29" + "03002120200329033021212003290320212220034198076a2201200341d8" + "006a29030037030020034190076a2202200341d0006a2903003703002003" + "200329034837038807200320032903403703800720034180076a20032903" + "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" + "09200341f0006a2903003703002003200341e8006a2903003703c8072003" + "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d20034198036a200129030037030020034190036a200229" + "0300370300200341a8036a20032903c807370300200341b0036a20092903" + "00370300200341b8036a2006290300370300200320032903880737038803" + "200320032903800737038003200320032903c0073703a003200341b8026a" + "290300211f200341a8026a290300212020032903b002212120032903a002" + "21222001200341d8026a2903003703002002200341d0026a290300370300" + "200320032903c80237038807200320032903c0023703800720034180076a" + "20032903800220032903880220032903900220034198026a29030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" + "f0026a2903003703002003200341e8026a2903003703c807200320032903" + "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" + "b230102d200341d8036a2001290300370300200341d0036a200229030037" + "0300200341e8036a20032903c807370300200341f0036a20092903003703" + "00200341f8036a200629030037030020032003290388073703c803200320" + "03290380073703c003200320032903c0073703e003200341c0076a200341" + "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" + "00200341b0096a200341f0076a2211290300370300200341a8096a200341" + "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" + "0020034198096a200629030037030020034190096a200929030037030020" + "0320032903c80737038809200320032903c0073703800920034180096a20" + "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" + "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" + "0320034180096a102f200341c0056a20034180026a20034180046a102f20" + "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" + "d8046a290300370300200341e0096a220b200341e0046a29030037030020" + "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" + "f0046a290300370300200341f8096a2210200341f8046a29030037030020" + "0320032903c0043703c009200320032903c8043703c809200341c0096a20" + "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" + "0341d0066a2207200a290300370300200320032903c8093703c806200320" + "032903c0093703c006200341c0066a200329038004200329038804200329" + "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" + "2903003703002009200f2903003703002003200e2903003703c807200320" + "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" + "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" + "200829030037030020022007290300370300200341a8076a220e20032903" + "c807370300200341b0076a220f2009290300370300200341b8076a221020" + "06290300370300200320032903c80637038807200320032903c006370380" + "07200320032903c0073703a007200341c0076a20034180056a2003418005" + "6a103020034198066a2212200129030037030020034190066a2213200229" + "030037030020032003290388073703880620032003290380073703800620" + "034180066a20032903c00720032903c80720032903d007200629030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200820102903003703002007200f29030037" + "03002003200e2903003703c806200320032903a0073703c006200341c006" + "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" + "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" + "aece93b230102d2008290300211f20072903002120201229030021212013" + "290300212220032903c806212320032903c0062124200329038806212520" + "03290380062126200820034198056a290300370300200720034190056a29" + "030037030020032003290388053703c80620032003290380053703c00620" + "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" + "0341b8056a2903003703002002200341b0056a2903003703002003200341" + "a8056a29030037038807200320032903a0053703800720034180076a2024" + "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" + "20092007290300370300200d200329038807370300201120022903003703" + "00200c2001290300370300200320032903c8063703c807200320032903c0" + "063703c00720032003290380073703e00720034180076a200341c0046a20" + "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" + "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" + "032003290388073703e80a20032003290380073703e00a200341e00a6a20" + "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d200820102903003703002007200f2903003703002003200e" + "2903003703c806200320032903a0073703c006200341c0066a20032903e0" + "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d2012200a2903003703002013200b290300370300200341a0066a221b20" + "032903c006370300200341a8066a221c20032903c806370300200341b006" + "6a221d2007290300370300200341b8066a221e2008290300370300200320" + "032903e80a37038806200320032903e00a37038006200341c0076a200420" + "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" + "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" + "1a290300370300200341980a6a22112006290300370300200341900a6a22" + "062009290300370300200320032903c8073703880a200320032903c00737" + "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" + "370300200b2006290300370300200320032903880a3703e80a2003200329" + "03800a3703e00a200341e00a6a2003290380082003290388082003290390" + "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" + "200720052903003703002003200c2903003703c8062003200d2903003703" + "c006200341c0066a20032903a008201529030020032903b0082014290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" + "00370300200e20032903c806370300200f20072903003703002010200829" + "0300370300200320032903e80a37038807200320032903e00a3703800720" + "0320032903c0063703a007200341d80a6a22042001290300370300200341" + "d00a6a2201200229030037030020032003290388073703c80a2003200329" + "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" + "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" + "200b200f2903003703002003200e2903003703e80a200320032903a00737" + "03e00a200341e00a6a20032903e008201829030020032903f00820172903" + "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" + "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" + "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" + "00370300200341f8066a200a290300370300200320032903c80a3703c806" + "200320032903c00a3703c006200320032903e00a3703e00620004180016a" + "200341c0066a20034180036a102f2000201f370338200020203703302000" + "202337032820002024370320200020213703182000202237031020002025" + "370308200020263703002000200329038006370340200041c8006a200329" + "038806370300200041d0006a2013290300370300200041d8006a20122903" + "00370300200041e0006a201b290300370300200041e8006a201c29030037" + "0300200041f0006a201d290300370300200041f8006a201e290300370300" + "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" + "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" + "24000240024002400240024020012903800120014188016a290300844200" + "520d0020012903900120014198016a290300844200520d0020012903a001" + "200141a8016a290300844200520d0020012903b001200141b8016a290300" + "84500d010b200241d8006a4200370300200241e0006a2204420037030020" + "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" + "030020024200370348200242013703402002420037035020014180016a22" + "03200241406b104a450440200141a0016a2004104a450d020b200241406b" + "200310312002280240410171450d02200241386a20024188016a29030022" + "05370300200241306a20024180016a22032903002206370300200241286a" + "200241f8006a2903002207370300200241206a200241f0006a2903002208" + "370300200241186a200241e8006a2903002209370300200241106a200241" + "e0006a290300220a37030020024190026a200a37030020024198026a2009" + "370300200241a0026a2008370300200241a8026a2007370300200241b002" + "6a2006370300200241b8026a200537030020022002290350220537030020" + "02200241d8006a2903002206370308200220053703800220022006370388" + "0220024180026a20022002102f200241406b200120024180026a102f2002" + "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" + "0041106a200241406b418001104c1a20004200370308200042013703000c" + "030b20004200370308200042003703000c020b200241b8016a200141f800" + "6a290300370300200241b0016a200141f0006a290300370300200241a801" + "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" + "0020024198016a200141d8006a29030037030020024190016a200141d000" + "6a29030037030020024188016a200141c8006a290300370300200241d000" + "6a200141106a290300370300200241d8006a200141186a29030037030020" + "0241e0006a200141206a290300370300200241e8006a200141286a290300" + "370300200241f0006a200141306a290300370300200241f8006a20014138" + "6a2903003703002002200129034037038001200220012903003703402002" + "200141086a290300370348200041106a200241406b418001104c1a200042" + "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" + "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" + "006a220e290300370300200241306a2240200141f0006a220f2903003703" + "00200241286a2241200141e8006a2210290300370300200241206a224220" + "0141e0006a2211290300370300200241186a2243200141d8006a22122903" + "00370300200241106a2244200141d0006a22202903003703002002200129" + "03403703002002200141c8006a2221290300370308200141a8016a222329" + "03002153200141a0016a22242903002154200141b8016a22252903002155" + "200141b0016a2230290300215620014188016a2235290300215720014198" + "016a2236290300215820014190016a22372903002159200129038001215a" + "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" + "016a2214290300370300200241e8006a200141e8016a2215290300370300" + "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" + "016a2217290300370300200241d0006a200141d0016a220d290300370300" + "20024190016a20014190026a220429030037030020024198016a20014198" + "026a2206290300370300200241a0016a200141a0026a2207290300370300" + "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" + "026a2205290300370300200241b8016a200141b8026a2209290300370300" + "2002200141c8016a2222290300370348200220012903c001370340200220" + "012903800237038001200220014188026a220a29030037038801200241f8" + "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" + "290300370300200241e8016a200141e8026a2246290300370300200241e0" + "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" + "290300370300200241d0016a200141d0026a2249290300370300200241b8" + "026a2226200141386a2231290300370300200241b0026a2227200141306a" + "2232290300370300200241a8026a2228200141286a223a29030037030020" + "0241a0026a2229200141206a223b29030037030020024198026a222a2001" + "41186a223c29030037030020024190026a222b200141106a223d29030037" + "03002002200141c8026a224a2903003703c801200220012903c0023703c0" + "012002200141086a223e2903003703880220022001290300370380022002" + "4180026a200120014180026a2203102f200241f8026a2219203129030037" + "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" + "00370300200241e0026a221c203b290300370300200241d8026a221d203c" + "290300370300200241d0026a221e203d2903003703002002203e29030037" + "03c802200220012903003703c002200241c0026a200120031030200241b8" + "036a220b2009290300370300200241b0036a220920052903003703002002" + "41a8036a22052008290300370300200241a0036a220c2007290300370300" + "20024198036a2218200629030037030020024190036a221f200429030037" + "0300200242003703b80d200242003703b00d200242003703a80d20024201" + "3703a00d200242003703980d200242003703900d200242003703880d2002" + "42093703800d2002200a2903003703880320022001290380023703800320" + "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" + "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" + "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" + "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" + "04290300370300200220022903c80b37038803200220022903c00b370380" + "03200241c00b6a200241c0026a20024180036a102f201920062903003703" + "00201a2007290300370300201b2008290300370300201c20052903003703" + "00201d2003290300370300201e2004290300370300200220022903c80b37" + "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" + "00200241900f6a220c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903800220022903880220" + "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" + "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" + "092019290300370300200241900a6a220a201a2903003703002002201b29" + "03003703880a2002201c2903003703800a200241800a6a20292903002028" + "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" + "0b290300224b3703002004200c290300224c370300200520022903800a22" + "4d3703002007200a290300224e370300200820022903880a224f37030020" + "0620092903002250370300200220022903880f22513703c80b2002200229" + "03800f22523703c00b20192050370300201a204e370300201b204f370300" + "201c204d370300201d204b370300201e204c370300200220513703c80220" + "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" + "1d290300370300200c201e290300370300200220022903c8023703880f20" + "0220022903c0023703800f200241800f6a20022903c00320022903c80320" + "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" + "2019290300370300200a201a2903003703002002201b2903003703880a20" + "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" + "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2003200b290300224b3703002004200c290300224c370300200520022903" + "800a224d3703002007200a290300224e370300200820022903880a224f37" + "0300200620092903002250370300200220022903880f22513703c80b2002" + "20022903800f22523703c00b20192050370300201a204e370300201b204f" + "370300201c204d370300201d204b370300201e204c370300200220513703" + "c802200220523703c002200241c00b6a20024180026a20024180026a1030" + "202620062903003703002027200729030037030020282008290300370300" + "20292005290300370300202a2003290300370300202b2004290300370300" + "200220022903c80b37038802200220022903c00b3703800220024190046a" + "221f200d29030037030020024198046a222c2017290300370300200241a0" + "046a222d2016290300370300200241a8046a222e20152903003703002002" + "41b0046a222f2014290300370300200241b8046a22392013290300370300" + "200220012903c00137038004200220222903003703880420024180046a20" + "0141c0016a223320014180016a2234102f200241f8046a22182013290300" + "370300200241f0046a22132014290300370300200241e8046a2214201529" + "0300370300200241e0046a22152016290300370300200241d8046a221620" + "17290300370300200241d0046a2217200d29030037030020022022290300" + "3703c804200220012903c0013703c004200241c0046a2033203410302002" + "41b8056a220d2025290300370300200241b0056a22222030290300370300" + "200241a8056a22252023290300370300200241a0056a2223202429030037" + "030020024198056a2224203629030037030020024190056a223020372903" + "003703002002203529030037038805200220012903800137038005200241" + "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" + "0d2006290300370300202220072903003703002025200829030037030020" + "232005290300370300202420032903003703002030200429030037030020" + "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" + "0241c0046a20024180056a102f2018200629030037030020132007290300" + "370300201420082903003703002015200529030037030020162003290300" + "37030020172004290300370300200220022903c80b3703c8042002200229" + "03c00b3703c004200b2016290300370300200c2017290300370300200220" + "022903c8043703880f200220022903c0043703800f200241800f6a200229" + "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d20092018290300370300200a201329030037030020022014290300" + "3703880a200220152903003703800a200241800a6a202d290300202e2903" + "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" + "0300224b3703002004200c290300224c370300200520022903800a224d37" + "03002007200a290300224e370300200820022903880a224f370300200620" + "092903002250370300200220022903880f22513703c80b20022002290380" + "0f22523703c00b201820503703002013204e3703002014204f3703002015" + "204d3703002016204b3703002017204c370300200220513703c804200220" + "523703c004200241c0056a20024180046a200241800d6a102f200b201629" + "0300370300200c2017290300370300200220022903c8043703880f200220" + "022903c0043703800f200241800f6a20022903c00520022903c805200229" + "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" + "290300370300200a2013290300370300200220142903003703880a200220" + "152903003703800a200241800a6a20022903e005200241e8056a29030020" + "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" + "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" + "200b290300224b3703002004200c290300224c370300200520022903800a" + "224d3703002007200a290300224e370300200820022903880a224f370300" + "200620092903002250370300200220022903880f22513703c80b20022002" + "2903800f22523703c00b201820503703002013204e3703002014204f3703" + "002015204d3703002016204b3703002017204c370300200220513703c804" + "200220523703c004200241c00b6a20024180046a20024180046a10302039" + "2006290300370300202f2007290300370300202e2008290300370300202d" + "2005290300370300202c2003290300370300201f20042903003703002002" + "20022903c80b37038804200220022903c00b3703800420024190066a2222" + "202029030037030020024198066a22332012290300370300200241a0066a" + "22342011290300370300200241a8066a22232010290300370300200241b0" + "066a2224200f290300370300200241b8066a2225200e2903003703002002" + "200129034037038006200220212903003703880620024180066a20014140" + "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" + "f0066a220e200f290300370300200241e8066a220f201029030037030020" + "0241e0066a22102011290300370300200241d8066a221120122903003703" + "00200241d0066a22122020290300370300200220212903003703c8062002" + "20012903403703c006200241c0066a200220301030200241b8076a222020" + "38290300370300200241b0076a22212045290300370300200241a8076a22" + "352046290300370300200241a0076a223620472903003703002002419807" + "6a2237204829030037030020024190076a22382049290300370300200220" + "4a29030037038807200220012903c0023703800720024180076a20302002" + "41800d6a102f200241c00b6a20024180076a200210302020200629030037" + "030020212007290300370300203520082903003703002036200529030037" + "03002037200329030037030020382004290300370300200220022903c80b" + "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" + "4180076a102f200d2006290300370300200e2007290300370300200f2008" + "290300370300201020052903003703002011200329030037030020122004" + "290300370300200220022903c80b3703c806200220022903c00b3703c006" + "200b2011290300370300200c2012290300370300200220022903c8063703" + "880f200220022903c0063703800f200241800f6a20022903800620022903" + "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" + "290300370300200a200e2903003703002002200f2903003703880a200220" + "102903003703800a200241800a6a20342903002023290300202429030020" + "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" + "2004200c290300224c370300200520022903800a224d3703002007200a29" + "0300224e370300200820022903880a224f37030020062009290300225037" + "0300200220022903880f22513703c80b200220022903800f22523703c00b" + "200d2050370300200e204e370300200f204f3703002010204d3703002011" + "204b3703002012204c370300200220513703c806200220523703c0062002" + "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" + "2012290300370300200220022903c8063703880f200220022903c0063703" + "800f200241800f6a20022903c00720022903c80720022903d007200241d8" + "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" + "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" + "0a200e2903003703002002200f2903003703880a20022010290300370380" + "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" + "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" + "3703002004200c290300224c370300200520022903800a224d3703002007" + "200a290300224e370300200820022903880a224f37030020062009290300" + "2250370300200220022903880f22513703c80b200220022903800f225237" + "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" + "002011204b3703002012204c370300200220513703c806200220523703c0" + "06200241c00b6a20024180066a20024180066a1030202520062903003703" + "002024200729030037030020232008290300370300203420052903003703" + "002033200329030037030020222004290300370300200220022903c80b37" + "038806200220022903c00b370380062009201d290300370300200a201e29" + "0300370300200220022903c8023703880a200220022903c0023703800a20" + "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b230102d200320192903003703002004201a29030037030020" + "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" + "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" + "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" + "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" + "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" + "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" + "312003290300370300200220022903880a3703c80d200220022903800a37" + "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" + "3703002021200729030037030020202008290300370300201e2005290300" + "370300201c2003290300370300201d2004290300370300200220022903c8" + "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" + "0241c0026a10302031200629030037030020212007290300370300202020" + "08290300370300201e2005290300370300201c2003290300370300201d20" + "0429030037030020024190086a2232202b29030037030020024198086a22" + "2b202a290300370300200241a0086a222a2029290300370300200241a808" + "6a22292028290300370300200241b0086a22282027290300370300200241" + "b8086a22272026290300370300200220022903c80b3703c80d2002200229" + "03c00b3703c00d2002200229038002370380082002200229038802370388" + "0820024180086a20024180026a20024180016a1030200241c00b6a200241" + "80086a20024180086a103020272006290300370300202820072903003703" + "0020292008290300370300202a2005290300370300202b20032903003703" + "0020322004290300370300200220022903c80b37038808200220022903c0" + "0b37038008200241c00b6a20024180086a20024180026a10302027200629" + "03003703002028200729030037030020292008290300370300202a200529" + "0300370300202b200329030037030020322004290300370300200241d008" + "6a22012022290300370300200241d8086a220b2033290300370300200241" + "e0086a220c2034290300370300200241e8086a2219202329030037030020" + "0241f0086a221a2024290300370300200241f8086a221b20252903003703" + "00200220022903c80b37038808200220022903c00b370380082002200229" + "0380063703c00820022002290388063703c808200241c0086a2002418006" + "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" + "2006290300370300201a200729030037030020192008290300370300200c" + "2005290300370300200b2003290300370300200120042903003703002002" + "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" + "41c0086a200241c0086a1030201b2006290300370300201a200729030037" + "030020192008290300370300200c2005290300370300200b200329030037" + "030020012004290300370300200220022903c80b3703c808200220022903" + "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" + "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" + "29030037030020192008290300370300200c2005290300370300200b2003" + "29030037030020012004290300370300200220022903c80b3703c8082002" + "20022903c00b3703c00820092011290300370300200a2012290300370300" + "200220022903c8063703880a200220022903c0063703800a200241800a6a" + "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" + "03002004200e2903003703002002200f2903003703c80b20022010290300" + "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" + "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" + "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" + "22122003290300370300200220022903880a3703880e200220022903800a" + "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" + "003703002011200729030037030020102008290300370300200f20052903" + "00370300200d2003290300370300200e2004290300370300200220022903" + "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" + "200241c0066a103020122006290300370300201120072903003703002010" + "2008290300370300200f2005290300370300200d2003290300370300200e" + "2004290300370300200220022903c80b3703880e200220022903c00b3703" + "800e20092016290300370300200a2017290300370300200220022903c804" + "3703880a200220022903c0043703800a200241800a6a2002290300200229" + "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" + "29030037030020042013290300370300200220142903003703c80b200220" + "152903003703c00b200241c00b6a20422903002041290300204029030020" + "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" + "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" + "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" + "22162004290300370300200241f80e6a2217200329030037030020022002" + "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" + "0e6a200241c00e6a10302017200629030037030020162007290300370300" + "201520082903003703002014200529030037030020182003290300370300" + "20132004290300370300200220022903c80b3703c80e200220022903c00b" + "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" + "003703002016200729030037030020152008290300370300201420052903" + "003703002018200329030037030020132004290300370300200241d0096a" + "2226201f290300370300200241d8096a221f202c290300370300200241e0" + "096a222c202d290300370300200241e8096a222d202e2903003703002002" + "41f0096a222e202f290300370300200241f8096a222f2039290300370300" + "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" + "80043703c00920022002290388043703c809200241c0096a20024180046a" + "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" + "2006290300370300202e2007290300370300202d2008290300370300202c" + "2005290300370300201f2003290300370300202620042903003703002002" + "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" + "41c0096a20024180046a1030202f2006290300370300202e200729030037" + "0300202d2008290300370300202c2005290300370300201f200329030037" + "030020262004290300370300200220022903c80b3703c809200220022903" + "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" + "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" + "03002009201c290300370300200a201d290300370300200220022903c80d" + "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" + "00200241d00a6a2013290300370300200241d80a6a201829030037030020" + "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" + "f00a6a2016290300370300200241f80a6a20172903003703002002200229" + "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" + "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" + "370300200241980b6a200d290300370300200241900b6a200e2903003703" + "00200241880b6a20022903880e370300200220022903800e3703800b2006" + "201b2903003703002007201a290300370300200820192903003703002005" + "200c2903003703002003200b290300370300200420012903003703002002" + "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" + "29038808370300200241900c6a2032290300370300200241980c6a202b29" + "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" + "370300200241b00c6a2028290300370300200241b80c6a20272903003703" + "0020022002290380083703800c200241f80c6a202f290300370300200241" + "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" + "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" + "26290300370300200241c80c6a20022903c809370300200220022903c009" + "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" + "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" + "024101712206450440200341386a200141386a290300370300200341306a" + "200141306a290300370300200341286a200141286a290300370300200341" + "206a200141206a290300370300200341186a200141186a29030037030020" + "0341106a200141106a290300370300200320012903003703002003200141" + "086a29030037030820034190016a200141d0006a29030037030020034198" + "016a200141d8006a290300370300200341a0016a200141e0006a29030037" + "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" + "006a290300370300200341b8016a200141f8006a29030037030020032001" + "290340370380012003200141c8006a290300370388010c010b200341d801" + "6a2204200141386a290300370300200341d0016a2205200141306a290300" + "370300200320012903203703c0012003200141286a2903003703c8012003" + "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f102b200341186a200141186a290300370300200341106a" + "200141106a290300370300200341286a20032903c801370300200341306a" + "2005290300370300200341386a20042903003703002003200141086a2903" + "0037030820032001290300370300200320032903c0013703202004200141" + "f8006a2903003703002005200141f0006a2903003703002003200141e800" + "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" + "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" + "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" + "20034198016a200141d8006a29030037030020034190016a200141d0006a" + "290300370300200341a8016a20032903c801370300200341b0016a200529" + "0300370300200341b8016a20042903003703002003200141c8006a290300" + "370388012003200129034037038001200320032903c0013703a0010b0240" + "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" + "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" + "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" + "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" + "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" + "3703c0010c020b200341e0016a22024200370300200241086a4200370300" + "200241106a4200370300200241186a4200370300200342a9c0c689aece93" + "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" + "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" + "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" + "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" + "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" + "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" + "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" + "200341c0016a102f02402006450440200341b8016a200241386a29030037" + "0300200341b0016a200241306a290300370300200341a8016a200241286a" + "290300370300200341a0016a200241206a29030037030020034198016a20" + "0241186a29030037030020034190016a200241106a290300370300200320" + "02290300370380012003200241086a290300370388010c010b200341d801" + "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" + "0300370300200320012903a0013703c0012003200141a8016a2903003703" + "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" + "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" + "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" + "20034190016a200241106a290300370300200341a8016a20032903c80137" + "0300200341b0016a2005290300370300200341b8016a2006290300370300" + "2003200241086a2903003703880120032002290300370380012003200329" + "03c0013703a0010b0240024002400240200441026b0e020102000b200342" + "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" + "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" + "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" + "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" + "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" + "00370300200141106a4200370300200141186a4200370300200342003703" + "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" + "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" + "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" + "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" + "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" + "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" + "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" + "6a200341386a290300370300200041306a200341306a2903003703002000" + "41286a200341286a290300370300200041206a200341206a290300370300" + "200041186a200341186a290300370300200041106a200341106a29030037" + "0300200041086a2003290308370300200020032903003703002000200329" + "0340370340200041c8006a2003290348370300200041d0006a200341d000" + "6a290300370300200041d8006a200341d8006a290300370300200041e000" + "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" + "00200041f0006a200341f0006a290300370300200041f8006a200341f800" + "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" + "052400200541b8016a2234200141b8016a2235290300370300200541b001" + "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" + "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" + "0020054198016a223c20014198016a223d29030037030020054190016a22" + "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" + "4f290300370300200541d8016a222f200141d8016a225029030037030020" + "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" + "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" + "0300370300200541f8016a2233200141f8016a2254290300370300200520" + "012903800137038001200520012903c0013703c001200520014188016a22" + "40290300370388012005200141c8016a22552903003703c801200541b802" + "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" + "6a2221290300370300200541a8026a2258200141e8026a22282903003703" + "00200541a0026a2259200141e0026a222929030037030020054198026a22" + "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" + "2b290300370300200541d0026a2241200141106a22062903003703002005" + "41d8026a2242200141186a2207290300370300200541e0026a2243200141" + "206a2208290300370300200541e8026a2244200141286a22092903003703" + "00200541f0026a2245200141306a220a290300370300200541f8026a2246" + "200141386a220b2903003703002005200141c8026a222c29030037038802" + "200520012903c00237038002200520012903003703c0022005200141086a" + "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" + "35290300370300200541b0036a225d2037290300370300200541a8036a22" + "5e2039290300370300200541a0036a225f203b2903003703002005419803" + "6a2260203d29030037030020054190036a2261203f290300370300200520" + "402903003703880320052001290380013703800320054180036a20014180" + "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" + "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" + "026a290300370300200541e0036a2265200141a0026a2903003703002005" + "41d8036a226620014198026a290300370300200541d0036a226720014190" + "026a290300370300200520014188026a2903003703c80320052001290380" + "023703c003200541c0036a20014180026a22472003102f200541b8046a22" + "68200b290300370300200541b0046a2269200a290300370300200541a804" + "6a226a2009290300370300200541a0046a226b2008290300370300200541" + "98046a226c200729030037030020054190046a226d200629030037030020" + "05200c29030037038804200520012903003703800420054180046a200120" + "471030200541f8046a226e200b290300370300200541f0046a226f200a29" + "0300370300200541e8046a22702009290300370300200541e0046a227120" + "08290300370300200541d8046a22722007290300370300200541d0046a22" + "7320062903003703002005200c2903003703c804200520012903003703c0" + "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" + "0300370300200541b0056a2249200141f0006a2213290300370300200541" + "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" + "e0006a221529030037030020054198056a224c200141d8006a221c290300" + "37030020054190056a224d200141d0006a221d2903003703002005200141" + "c8006a221e29030037038805200520012903403703800520054180056a20" + "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" + "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" + "096a220d290300370300204a200541e8096a220e290300370300204b2005" + "41e0096a220f290300370300204c200541d8096a2210290300370300204d" + "200541d0096a2211290300370300200520052903c8093703880520052005" + "2903c00937038005200541d0056a2222201d290300370300200541d8056a" + "2223201c290300370300200541e0056a22242015290300370300200541e8" + "056a22252014290300370300200541f0056a222620132903003703002005" + "41f8056a22272012290300370300200520012903403703c0052005201e29" + "03003703c805200541c0056a201f2004102f200541b8066a221620272903" + "00370300200541b0066a22172026290300370300200541a8066a22182025" + "290300370300200541a0066a2219202429030037030020054198066a221a" + "202329030037030020054190066a221b2022290300370300200520052903" + "c80537038806200520052903c0053703800620054180066a200541c0056a" + "200541c0036a1030200542003703b80b200542003703b00b200542003703" + "a80b200542013703a00b200542003703980b200542003703900b20054200" + "3703880b200542093703800b200541c0096a20054180066a200541800b6a" + "102f2016200c2903003703002017200d2903003703002018200e29030037" + "03002019200f290300370300201a2010290300370300201b201129030037" + "0300200520052903c80937038806200520052903c00937038006200541c0" + "096a20054180066a200541c0026a10302016200c29030022810137030020" + "17200d2903002282013703002018200e2903002283013703002019200f29" + "0300228401370300201a2010290300228501370300201b20112903002286" + "01370300200541106a2275208601370300200541186a2276208501370300" + "200541206a2277208401370300200541286a227820830137030020054130" + "6a2279208201370300200541386a227a208101370300200520052903c809" + "22810137038806200520052903c009228201370380062005208201370300" + "2005208101370308200541f8066a22062020290300370300200541f0066a" + "22072021290300370300200541e8066a22082028290300370300200541e0" + "066a22092029290300370300200541d8066a220a202a2903003703002005" + "41d0066a220b202b2903003703002005202c2903003703c8062005200129" + "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" + "6a200541c0066a10302027200c2903003703002026200d29030037030020" + "25200e2903003703002024200f2903003703002023201029030037030020" + "222011290300370300200520052903c8093703c805200520052903c00937" + "03c005200541c0096a200541c0066a20054180036a10302006200c290300" + "2281013703002007200d2903002282013703002008200e29030022830137" + "03002009200f290300228401370300200a2010290300228501370300200b" + "2011290300228601370300201b208601370300201a208501370300201920" + "840137030020182083013703002017208201370300201620810137030020" + "0520052903c8092281013703c806200520052903c0092282013703c00620" + "052082013703800620052081013703880620054180066a200541c0066a20" + "0541800b6a102f2006201229030037030020072013290300370300200820" + "1429030037030020092015290300370300200a201c290300370300200b20" + "1d2903003703002005201e2903003703c806200520012903403703c00620" + "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" + "302027200c2903003703002026200d2903003703002025200e2903003703" + "002024200f29030037030020232010290300370300202220112903003703" + "00200520052903c8093703c805200520052903c0093703c005200541c009" + "6a20054180066a200541c0066a10302016200c2903002281013703002017" + "200d2903002282013703002018200e2903002283013703002019200f2903" + "00228401370300201a2010290300228501370300201b2011290300228601" + "370300200541d0006a227b208601370300200541d8006a227c2085013703" + "00200541e0006a227d208401370300200541e8006a227e20830137030020" + "0541f0006a227f208201370300200541f8006a2280012081013703002005" + "20052903c80922810137038806200520052903c009228201370380062005" + "2082013703402005208101370348200541b8076a221c200241386a222829" + "0300370300200541b0076a221d200241306a2229290300370300200541a8" + "076a221e200241286a222a290300370300200541a0076a221f200241206a" + "222b29030037030020054198076a2220200241186a222c29030037030020" + "054190076a2221200241106a222d2903003703002005200241086a224e29" + "030037038807200520022903003703800720054180076a20022004103020" + "06206e2903003703002007206f2903003703002008207029030037030020" + "092071290300370300200a2072290300370300200b207329030037030020" + "0520052903c8043703c806200520052903c0043703c006200541c0066a20" + "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" + "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" + "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" + "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" + "0629030037030020054190086a2213200729030037030020052008290300" + "37038808200520092903003703800820054180086a204329030020442903" + "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" + "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" + "030022810137030020112015290300228201370300200f20052903800822" + "8301370300200d2013290300228401370300200e20052903880822850137" + "0300200c2012290300228601370300200520052903c80b2287013703c809" + "200520052903c00b2288013703c009200620860137030020072084013703" + "0020082085013703002009208301370300200a208101370300200b208201" + "37030020052087013703c80620052088013703c0062014200a2903003703" + "002015200b290300370300200520052903c8063703c80b200520052903c0" + "063703c00b200541c00b6a20052903800322810120052903880322820120" + "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" + "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" + "122006290300370300201320072903003703002005200829030037038808" + "200520092903003703800820054180086a205f290300228501205e290300" + "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" + "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" + "30102d2010201429030022890137030020112015290300228a0137030020" + "0f200529038008228b01370300200d2013290300228c01370300200e2005" + "29038808228d01370300200c2012290300228e01370300200520052903c8" + "0b228f013703c809200520052903c00b2290013703c0092006208e013703" + "002007208c013703002008208d013703002009208b01370300200a208901" + "370300200b208a013703002005208f013703c80620052090013703c00620" + "162054290300370300201720532903003703002018205229030037030020" + "192051290300370300201a2050290300370300201b204f29030037030020" + "05205529030037038806200520012903c0013703800620054180066a2074" + "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" + "003703002026200d2903003703002025200e2903003703002024200f2903" + "003703002023201029030037030020222011290300370300200520052903" + "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" + "20054180066a10302006200c2903003703002007200d2903003703002008" + "200e2903003703002009200f290300370300200a2010290300370300200b" + "2011290300370300200520052903c8093703c806200520052903c0093703" + "c0062021203f2903003703002020203d290300370300201f203b29030037" + "0300201e2039290300370300201d2037290300370300201c203529030037" + "030020052001290380013703800720052040290300370388072005418007" + "6a20054180016a2047103020342006290300370300203620072903003703" + "0020382008290300370300203a2009290300370300203c200a2903003703" + "00203e200b290300370300200541d0076a200441106a2903003703002005" + "41d8076a200441186a290300370300200541e0076a200441206a29030037" + "0300200541e8076a200441286a290300370300200541f0076a200441306a" + "290300370300200541f8076a200441386a290300370300200520052903c8" + "0637038801200520052903c00637038001200520042903003703c0072005" + "200441086a2903003703c807200541c0076a2004200310302006201c2903" + "003703002007201d2903003703002008201e2903003703002009201f2903" + "00370300200a2020290300370300200b2021290300370300200520052903" + "88073703c80620052005290380073703c006200541c0066a20054180076a" + "200541c0076a102f2014200a2903003703002015200b2903003703002005" + "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" + "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" + "003703002013200729030037030020052008290300370388082005200929" + "03003703800820054180086a20850120860120870120880142c7faf3c3ed" + "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" + "89aece93b230102d20102014290300228101370300201120152903002282" + "01370300200f200529038008228301370300200d20132903002284013703" + "00200e200529038808228501370300200c20122903002286013703002005" + "20052903c80b2287013703c809200520052903c00b2288013703c0092006" + "208601370300200720840137030020082085013703002009208301370300" + "200a208101370300200b20820137030020052087013703c8062005208801" + "3703c0062014200a2903003703002015200b290300370300200520052903" + "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" + "22810120052903c8032282012067290300228301206629030022840142c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d201220062903003703002013200729030037" + "03002005200829030037038808200520092903003703800820054180086a" + "206529030022850120642903002286012063290300228701206229030022" + "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" + "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" + "112015290300228a01370300200f200529038008228b01370300200d2013" + "290300228c01370300200e200529038808228d01370300200c2012290300" + "228e01370300200520052903c80b228f013703c809200520052903c00b22" + "90013703c0092006208e013703002007208c013703002008208d01370300" + "2009208b01370300200a208901370300200b208a013703002005208f0137" + "03c80620052090013703c006201620062903003703002017200729030037" + "03002018200829030037030020192009290300370300201a200a29030037" + "0300201b200b290300370300200520052903c80637038806200520052903" + "c0063703800620054180066a200541c0066a200541800b6a102f20062033" + "290300370300200720322903003703002008203129030037030020092030" + "290300370300200a202f290300370300200b202e29030037030020052005" + "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" + "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" + "2903003703002026200d2903003703002025200e2903003703002024200f" + "290300370300202320102903003703002022201129030037030020052005" + "2903c8093703c805200520052903c0093703c005200541c0096a20054180" + "066a200541c0066a10302016200c2903002289013703002017200d290300" + "228a013703002018200e290300228b013703002019200f290300228c0137" + "0300201a2010290300228d01370300201b2011290300228e01370300202e" + "208e01370300202f208d013703002030208c013703002031208b01370300" + "2032208a013703002033208901370300200520052903c809228901370388" + "06200520052903c009228a01370380062005208a013703c0012005208901" + "3703c8012006205629030037030020072057290300370300200820582903" + "0037030020092059290300370300200a205a290300370300200b205b2903" + "0037030020052005290388023703c80620052005290380023703c0062005" + "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" + "066a10302027200c2903003703002026200d2903003703002025200e2903" + "003703002024200f29030037030020232010290300370300202220112903" + "00370300201b200b290300370300201a200a290300370300201920092903" + "003703002018200829030037030020172007290300370300201620062903" + "00370300200520052903c8093703c805200520052903c0093703c0052005" + "20052903c00637038006200520052903c8063703880620054180066a2005" + "41c0066a200541800b6a102f201c2028290300370300201d202929030037" + "0300201e202a290300370300201f202b2903003703002020202c29030037" + "03002021202d2903003703002005204e2903003703880720052002290300" + "3703800720054180076a2002200310302006206829030037030020072069" + "2903003703002008206a2903003703002009206b290300370300200a206c" + "290300370300200b206d29030037030020052005290388043703c8062005" + "2005290380043703c006200541c0066a20054180046a20054180076a102f" + "2014200a2903003703002015200b290300370300200520052903c8063703" + "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" + "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" + "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" + "290300370300201320072903003703002005200829030037038808200520" + "092903003703800820054180086a20432903002044290300204529030020" + "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" + "0020112015290300228a01370300200f200529038008228b01370300200d" + "2013290300228c01370300200e200529038808228d01370300200c201229" + "0300228e01370300200520052903c80b228f013703c809200520052903c0" + "0b2290013703c0092006208e013703002007208c013703002008208d0137" + "03002009208b01370300200a208901370300200b208a013703002005208f" + "013703c80620052090013703c0062014200a2903003703002015200b2903" + "00370300200520052903c8063703c80b200520052903c0063703c00b2005" + "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "201220062903003703002013200729030037030020052008290300370388" + "08200520092903003703800820054180086a208501208601208701208801" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" + "15290300228201370300200f200529038008228301370300200d20132903" + "00228401370300200e200529038808228501370300200c20122903002286" + "01370300200520052903c80b2287013703c809200520052903c00b228801" + "3703c0092006208601370300200720840137030020082085013703002009" + "208301370300200a208101370300200b20820137030020052087013703c8" + "0620052088013703c006200541c0096a20054180066a200541c0066a1030" + "2016200c2903003703002017200d2903003703002018200e290300370300" + "2019200f290300370300201a2010290300370300201b2011290300370300" + "200520052903c80937038806200520052903c009370380062021202d2903" + "003703002020202c290300370300201f202b290300370300201e202a2903" + "00370300201d2029290300370300201c2028290300370300200520022903" + "00370380072005204e2903003703880720054180076a2002200410302005" + "41c0096a20054180076a20031030201c200c290300370300201d200d2903" + "00370300201e200e290300370300201f200f290300370300202020102903" + "0037030020212011290300370300200b204d290300370300200a204c2903" + "003703002009204b2903003703002008204a290300370300200720492903" + "0037030020062048290300370300200520052903c8093703880720052005" + "2903c0093703800720052005290380053703c00620052005290388053703" + "c806200541c0066a20054180056a20054180076a102f2014200a29030037" + "03002015200b290300370300200520052903c8063703c80b200520052903" + "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" + "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" + "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" + "200729030037030020052008290300370388082005200929030037038008" + "20054180086a202429030020252903002026290300202729030042c7faf3" + "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" + "c0c689aece93b230102d2010201429030022810137030020112015290300" + "228201370300200f200529038008228301370300200d2013290300228401" + "370300200e200529038808228501370300200c2012290300228601370300" + "200520052903c80b2287013703c809200520052903c00b2288013703c009" + "200620860137030020072084013703002008208501370300200920830137" + "0300200a208101370300200b20820137030020052087013703c806200520" + "88013703c006200541b8086a207a290300370300200541b0086a20792903" + "00370300200541a8086a2078290300370300200541a0086a207729030037" + "030020122076290300370300201320752903003703002005200529030837" + "0388082005200529030037038008200541c8086a20052903483703002005" + "41d0086a207b290300370300200541d8086a207c290300370300200541e0" + "086a207d290300370300200541e8086a207e290300370300200541f0086a" + "207f290300370300200541f8086a20800129030037030020052005290340" + "3703c008200541b8096a2034290300370300200541b0096a203629030037" + "0300200541a8096a2038290300370300200541a0096a203a290300370300" + "20054198096a203c29030037030020054190096a203e2903003703002005" + "4188096a200529038801370300200520052903800137038009200c203329" + "0300370300200d2032290300370300200e2031290300370300200f203029" + "03003703002010202f2903003703002011202e2903003703002005200529" + "03c8013703c809200520052903c0013703c009200541880a6a2005290388" + "06370300200541900a6a201b290300370300200541980a6a201a29030037" + "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" + "200541b00a6a2017290300370300200541b80a6a20162903003703002005" + "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" + "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" + "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" + "00370300200541c80a6a20052903c806370300200520052903c0063703c0" + "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" + "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" + "046a20014180016a22162002102f20034198036a2204200141186a220c29" + "030037030020034190036a2205200141106a220d29030037030020032001" + "41086a220f29030037038803200320012903003703800320034180036a20" + "032903800420032903880420032903900420034198046a220929030042c7" + "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" + "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" + "370300200341d0036a2207200141306a2211290300370300200320014128" + "6a22122903003703c8032003200141206a22172903003703c003200341c0" + "036a20032903a004200341a8046a220a29030020032903b004200341b804" + "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" + "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" + "0300370300200341106a22082005290300370300200341206a2213200329" + "03c003370300200341286a221420032903c803370300200341306a221520" + "07290300370300200341386a221820062903003703002003200329038803" + "370308200320032903800337030020034180046a2016200241406b221f10" + "2f2004200141d8006a22202903003703002005200141d0006a2221290300" + "3703002003200141c8006a22222903003703880320032001290340370380" + "0320034180036a2003290380042003290388042003290390042009290300" + "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" + "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" + "2007200141f0006a22242903003703002003200141e8006a222529030037" + "03c8032003200141e0006a22262903003703c003200341c0036a20032903" + "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" + "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" + "102d200341d8006a22192004290300370300200341d0006a221a20052903" + "00370300200341e0006a221b20032903c003370300200341e8006a221c20" + "032903c803370300200341f0006a221d2007290300370300200341f8006a" + "221e20062903003703002003200329038803370348200320032903800337" + "0340200341f8046a2018290300370300200341f0046a2015290300370300" + "200341e8046a2014290300370300200341e0046a20132903003703002003" + "41d8046a200e290300370300200341d0046a200829030037030020032003" + "2903083703c804200320032903003703c004200341c0046a20032003102f" + "200341b8056a201e290300370300200341b0056a201d2903003703002003" + "41a8056a201c290300370300200341a0056a201b29030037030020034198" + "056a201929030037030020034190056a201a290300370300200320032903" + "4837038805200320032903403703800520034180056a200341406b200341" + "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" + "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" + "4180046a20034180016a103020034180046a200341c0016a200341c0016a" + "1030200341d8026a220e2006290300370300200341d0026a220820072903" + "00370300200320032903c8033703c802200320032903c0033703c0022003" + "41c0026a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" + "0341f0036a22142903003703002003200341e8036a221529030037038803" + "200320032903e0033703800320034180036a20032903a004200a29030020" + "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" + "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" + "2218200e29030037030020034190026a22272008290300370300200341a8" + "026a2228200329038803370300200341b0026a2229200529030037030020" + "0341b8026a222a2004290300370300200320032903c80237038802200320" + "032903c0023703800220032003290380033703a00220034180046a200320" + "034180026a102f2010200b2903003703002011200341b0046a2210290300" + "3703002012200a2903003703002017200341a0046a222b29030037030020" + "0c2009290300370300200d20034190046a2211290300370300200f200329" + "03880437030020012003290380043703002004200341d8016a2903003703" + "002005200341d0016a290300370300200320032903c80137038803200320" + "032903c0013703800320034180036a200329038002200329038802202729" + "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" + "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" + "03003703002007200341f0016a2903003703002003200341e8016a290300" + "3703c803200320032903e0013703c003200341c0036a20032903a0022028" + "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" + "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" + "0429030037030020112005290300370300200a20032903c8033703002010" + "2007290300370300200b2006290300370300200320032903880337038804" + "200320032903800337038004200320032903c0033703a004200341c0036a" + "200341406b20034180046a102f20034180046a20034180016a200141406b" + "102f200341f8056a220c2006290300370300200341f0056a220d20072903" + "00370300200320032903c8033703e805200320032903c0033703e0052003" + "41e0056a200329038004200329038804200329039004200929030042c7fa" + "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" + "a9c0c689aece93b230102d200e2013290300370300200820142903003703" + "00200320152903003703c802200320032903e0033703c002200341c0026a" + "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" + "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" + "ce93b230102d2004200c2903003703002005200d290300370300200341a0" + "036a221720032903c002370300200341a8036a220f20032903c802370300" + "200341b0036a22122008290300370300200341b8036a2208200e29030037" + "0300200320032903e80537038803200320032903e0053703800320232008" + "290300370300202420122903003703002025200f29030037030020262017" + "290300370300202020042903003703002021200529030037030020222003" + "29038803370300200120032903800337034020034180046a201620034180" + "016a102f200141b8016a200b290300370300200141b0016a201029030037" + "0300200141a8016a200a290300370300200141a0016a202b290300370300" + "20014198016a200929030037030020014190016a20112903003703002001" + "4188016a2003290388043703002001200329038004370380012003420037" + "03f802200342003703f002200342003703e802200342013703e002200342" + "003703d802200342003703d002200342003703c802200342093703c00220" + "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" + "056a22012006290300370300200341d0056a220620072903003703002003" + "20032903c8033703c805200320032903c0033703c005200341c0056a2003" + "29038004200329038804200329039004200929030042c7faf3c3ed82a390" + "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" + "93b230102d200c2013290300370300200d20142903003703002003201529" + "03003703e805200320032903e0033703e005200341e0056a20032903a004" + "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" + "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" + "2004200129030037030020052006290300370300200f20032903e8053703" + "002012200d2903003703002008200c290300370300200320032903c80537" + "038803200320032903c00537038003200320032903e0053703a003200341" + "80046a200341c0026a20034180036a102f201e2903002136201d29030021" + "34201c290300212d201b2903002135201a29030022302003290340223184" + "201929030022382003290348223284844200520440427f4200427f420020" + "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" + "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" + "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" + "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" + "2f0b4200213042002131420021322034203584202d203684844200520440" + "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" + "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" + "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" + "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" + "ed82a3903c20357d212c0b20002003290380043703002000200329030037" + "0340200041086a200329038804370300200041c8006a2003290308370300" + "200041386a200341b8046a290300370300200041306a200341b0046a2903" + "00370300200041286a200341a8046a290300370300200041206a200341a0" + "046a290300370300200041186a20034198046a290300370300200041106a" + "20034190046a290300370300200041d0006a200341106a29030037030020" + "0041d8006a200341186a290300370300200041e0006a200341206a290300" + "370300200041e8006a200341286a290300370300200041f0006a20034130" + "6a290300370300200041f8006a200341386a290300370300200020323703" + "b801200020313703b001200020303703a8012000202c3703a00120002033" + "370398012000202e3703900120002037370388012000202f370380012003" + "4180066a24000b4201047f412021020240034020002d0000220320012d00" + "002204460440200041016a2100200141016a2101200241016b22020d010c" + "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" + "21020c010b02402000410020006b41037122046a220320004d0d00200021" + "0220040440200421050340200241003a0000200241016a2102200541016b" + "22050d000b0b200441016b4107490d000340200241003a0000200241076a" + "41003a0000200241066a41003a0000200241056a41003a0000200241046a" + "41003a0000200241036a41003a0000200241026a41003a0000200241016a" + "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" + "716a220220034b0440034020034100360200200341046a22032002490d00" + "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" + "042001410771220304400340200241003a0000200241016a210220034101" + "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" + "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" + "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" + "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" + "10490440200021030c010b02402000410020006b41037122066a22052000" + "4d0d00200641016b21082000210320012104200604402006210703402003" + "20042d00003a0000200441016a2104200341016a2103200741016b22070d" + "000b0b20084107490d000340200320042d00003a0000200341016a200441" + "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" + "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" + "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" + "41076a200441076a2d00003a0000200441086a2104200341086a22032005" + "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" + "04410371450440200320054d0d0120042101034020052001280200360200" + "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" + "2004410374220241187121062004417c71220941046a2101410020026b41" + "1871210a2009280200210203402005200220067620012802002202200a74" + "72360200200141046a2101200541046a22052003490d000b0b2007410371" + "2102200420086a21010b02402003200220036a22054f0d00200241016b21" + "072002410771220404400340200320012d00003a0000200141016a210120" + "0341016a2103200441016b22040d000b0b20074107490d00034020032001" + "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" + "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" + "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" + "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" + "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" + "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" + "20047e22042003200142208822017e7c22034220867c2206370300200020" + "05200656ad200120027e2003200454ad4220862003422088847c7c370308" + "0b5601017e0240200341c000714504402003450d012002410020036b413f" + "71ad8620012003413f71ad220488842101200220048821020c010b200220" + "03413f71ad882101420021020b20002001370300200020023703080b5a01" + "027e420121020240200141c000714504402001450d0142002001413f71ad" + "2202864201410020016b413f71ad88842103420120028621020c010b4201" + "2001413f71ad862103420021020b20002002370300200020033703080b0b" + "e1250100418080c0000bd725307830306165613865396338336337336437" + "343033363932336465316234613636643138353437643538656565346561" + "6366656537303233356564323931393534636361706163697479206f7665" + "72666c6f77004200100011000000010000000000000063616c6c65642060" + "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" + "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" + "6c656e20697320206275742074686520696e646578206973200000008f00" + "100020000000af001000120000003a2000000100000000000000d4001000" + "020000003030303130323033303430353036303730383039313031313132" + "313331343135313631373138313932303231323232333234323532363237" + "323832393330333133323333333433353336333733383339343034313432" + "343334343435343634373438343935303531353235333534353535363537" + "353835393630363136323633363436353636363736383639373037313732" + "373337343735373637373738373938303831383238333834383538363837" + "38383839393039313932393339343935393639373938393972616e676520" + "737461727420696e64657820206f7574206f662072616e676520666f7220" + "736c696365206f66206c656e67746820b001100012000000c20110002200" + "000072616e676520656e6420696e64657820f401100010000000c2011000" + "22000000736c69636520696e646578207374617274732061742020627574" + "20656e6473206174200014021000160000002a0210000d00000054726965" + "6420746f20736872696e6b20746f2061206c617267657220636170616369" + "74794802100024000000f40a10004c000000b3020000090000002f686f6d" + "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" + "7372632f696e6465782e6372617465732e696f2d31393439636638633662" + "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" + "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" + "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" + "0000ea0210006f000000890000001b000000a80c10006f00000057000000" + "09000000a80c10006f000000a3000000090000008402100066000000ad00" + "000013000000a80c10006f000000c40000001f000000a80c10006f000000" + "150100000e000000a80c10006f000000160100000e000000a80c10006f00" + "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" + "6f0000002001000021000000a80c10006f0000002101000018000000a80c" + "10006f000000420100003c000000040c10006e0000006d0200000d000000" + "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f6e756d" + "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" + "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" + "0000120000003c0410006c00000028000000190000002f72757374632f34" + "656231363132353065333430633866343866363665326239323965663461" + "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" + "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f6865782d302e342e33" + "2f7372632f6c69622e7273000000260510005b000000c700000025000000" + "260510005b000000c7000000410000004e6f744d656d626572496e76616c" + "6964536c6963654c656e677468496e76616c696455353132456e636f6469" + "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" + "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" + "6c696420636f6d7072657373656420706f696e7420666c61670000000806" + "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" + "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" + "313934396366386336623562353537662f7370312d76657269666965722d" + "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" + "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f7370312d7665726966" + "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" + "00000100000001000000060000004661696c656420746f20636f6e766572" + "74207820627974657320746f20467100ac0610006a0000001f0000003700" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7370312d76657269666965722d342e312e" + "332f7372632f67726f746831362f636f6e7665727465722e727300005807" + "100072000000290000003e00000058071000720000002a0000003d000000" + "58071000720000002b0000003e00000058071000720000002c0000003e00" + "000058071000720000002e0000002500000058071000720000002e000000" + "3200000058071000720000002e0000003f00000058071000720000002e00" + "00004c0000005807100072000000320000003f0000005807100072000000" + "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" + "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" + "6f2d313934396366386336623562353537662f7370312d76657269666965" + "722d342e312e332f7372632f67726f746831362f7665726966792e727300" + "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737031" + "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" + "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" + "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" + "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" + "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" + "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" + "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" + "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" + "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" + "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" + "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" + "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" + "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" + "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" + "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" + "74632f346562313631323530653334306338663438663636653262393239" + "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" + "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" + "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" + "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" + "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" + "29000000a804000009000000617373657274696f6e206661696c65643a20" + "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" + "500b100029000000ae0400000d0000000000000004000000000000002f68" + "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" + "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" + "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" + "62696775696e742f636f6e766572742e72730000040c10006e000000f001" + "000016000000617474656d707420746f20646976696465206279207a6572" + "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" + "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" + "65732e696f2d313934396366386336623562353537662f6e756d2d626967" + "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" + "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" + "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" + "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" + "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" + "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" + "726576696f75736c7920706f69736f6e656420627920612070616e69636b" + "65640000350d10005d0000004e010000250000002f72757374632f346562" + "313631323530653334306338663438663636653262393239656634613562" + "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" + "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" + "526573756c743a3a756e77726170282960206f6e20616e20604572726020" + "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" + "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" + "3934396366386336623562353537662f7375627374726174652d626e2d73" + "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" + "64732f66702e72730000630e10007b000000e9020000230000004661696c" + "656420746f20636f6d707574652074686520696e7665727365206f662074" + "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" + "6172676f2f72656769737472792f7372632f696e6465782e637261746573" + "2e696f2d313934396366386336623562353537662f737562737472617465" + "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" + "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" + "000000000100000001000000070000002f686f6d652f6f706964736b6f70" + "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" + "6372617465732e696f2d313934396366386336623562353537662f737562" + "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" + "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" + "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" + "416666696e654731b80f10007c0000000001000012000000b80f10007c00" + "00002001000012000000b80f10007c000000400100000d000000b80f1000" + "7c0000006b01000029000000010001000000030003000000030001000300" + "000300000000000100000300010000030000000003000100000003000300" + "00010000000300000300010001000000b80f10007c000000150300002600" + "0000b80f10007c0000001003000026000000b80f10007c00000008030000" + "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" + "000010000000b80f10007c0000009c03000010000000b80f10007c000000" + "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" + "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" + "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" + "10007c000000191100002a000000b80f10007c0000001911000017000000" + "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" + "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" + "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" + "6366386336623562353537662f7375627374726174652d626e2d73756363" + "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" + "0000e4111000750000003b0300000c000000e4111000750000003c030000" + "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" + "616c6964496e7075744c656e677468000000120000001300000009000000" + "ad051000bf051000a40510000a0000000d000000120000007c1210008612" + "1000931210004d0970726f64756365727302086c616e6775616765010452" + "757374000c70726f6365737365642d6279010572757374631d312e38352e" + "31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" + "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" + "756c746976616c7565"; + +extern std::string const ledgerSqnWasmHex = + "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" + "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" + "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" + "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" + "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" + "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" + "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" + "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" + "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" + "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" + "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" + "62346235613264623538323935386166316565333038613739306366646234326264323437" + "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" + "616c7565"; + +extern std::string const allHostFunctionsWasmHex = + "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" + "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" + "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" + "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" + "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" + "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" + "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" + "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" + "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" + "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" + "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" + "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" + "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" + "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" + "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" + "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" + "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" + "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" + "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" + "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" + "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" + "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" + "6a22044100360200200141106a220542003703002001420037030802404181802020014108" + "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" + "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" + "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" + "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" + "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" + "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" + "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" + "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" + "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" + "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" + "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" + "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" + "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" + "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" + "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" + "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" + "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" + "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" + "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" + "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" + "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" + "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" + "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" + "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" + "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" + "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" + "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" + "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" + "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" + "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" + "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" + "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" + "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" + "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" + "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" + "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" + "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" + "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" + "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" + "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" + "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" + "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" + "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" + "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" + "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" + "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" + "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" + "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" + "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" + "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" + "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" + "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" + "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" + "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" + "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" + "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" + "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" + "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" + "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" + "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" + "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" + "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" + "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" + "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" + "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" + "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" + "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" + "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" + "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" + "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" + "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" + "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" + "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" + "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" + "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" + "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" + "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" + "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" + "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" + "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" + "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" + "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" + "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" + "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" + "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" + "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" + "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" + "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; + +extern std::string const deepRecursionHex = + "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" + "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" + "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" + "0700080301050202020404090202000a0a0102020403030300000a03010405" + "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" + "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" + "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" + "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" + "0704017f017e027f017e23808080800041e0006b2202248080808000200220" + "003602040240200041004c0d002001200128020041016a3602002000417f6a" + "20011080808080000b2002410236020c2002418480c0800036020820024201" + "37021420024181808080003602242002200241206a3602102002200241046a" + "3602202002410636022c2002419490c08000360228024041002d00c096c080" + "004103460d001082808080000b0240024002400240024041002903a89ac080" + "0022034200520d00024041002802b09ac0800022000d001083808080004100" + "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" + "012000450d02200020002802002201417f6a36020020002903082103200141" + "01470d0020001084808080000b0240024002402003410029039896c0800051" + "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" + "013a00382001450d012002420037025420024281808080c00037024c200241" + "bc91c08000360248200241386a200241c8006a108580808000000b02404100" + "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" + "2641e092c08000108680808000000b4100200337039896c080000b41002000" + "3602a096c080002002419896c0800036023041042100200241043a00382002" + "200241306a360240200241386a41c085c08000200241086a10878080800021" + "0120022d003821040240024020010d00420021034117200441ff0171764101" + "710d01200228023c220028020021010240200041046a280200220428020022" + "05450d002001200511808080800080808080000b024020042802042204450d" + "00200120041088808080000b2000410c108880808000410421000c010b2004" + "41ff01714104460d032002290338220642807e8321032006a721000b200228" + "023022012001280208417f6a2204360208024020040d00200141003a000c20" + "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" + "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" + "02582002410136024c2002418491c0800036024820024204370250200241c8" + "006a418c91c08000108980808000000b200220032000ad42ff018384370330" + "2002410236024c200241f48fc0800036024820024202370254200241828080" + "8000ad422086200241306aad843703402002418380808000ad422086200241" + "286aad843703382002200241386a360250200241c8006a418490c080001089" + "80808000000b2701017f200028020022002000411f7522027320026bad2000" + "417f73411f7620011091808080000bf10101027f23808080800041206b2200" + "248080808000024002400240024041002d00c096c080000e0400000301000b" + "410041023a00c096c0800041002d009096c080001a418008109c8080800022" + "01450d01410041033a00c096c08000410020013602b096c080004100428080" + "80808080013703a896c080004100420037039896c08000410041003a00b896" + "c08000410041003602b496c08000410041003a00a496c08000410041003602" + "a096c080000b200041206a2480808080000f0b000b20004100360218200041" + "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" + "8000108980808000000bf90103027f037e017f23808080800041206b220024" + "808080800041002d009096c080001a0240024002404120109c808080002201" + "450d0020014102360210200142818080801037030041002903d096c0800021" + "0203402002427f510d024100200242017c220341002903d096c08000220420" + "0420025122051b3703d096c08000200421022005450d000b410020033703a8" + "9ac080002001200337030841002802b09ac08000450d022000410036021820" + "00410136020c200041c484c0800036020820004204370210200041086a419c" + "85c080001089808080000b000b109b80808000000b410020013602b09ac080" + "00200041206a2480808080000b5b01027f024020002802104101470d002000" + "280214220141003a000020002802182202450d00200120021088808080000b" + "02402000417f460d00200020002802042201417f6a36020420014101470d00" + "200041201088808080000b0b3a01017f23808080800041106b220224808080" + "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" + "01109680808000000b6a01017f23808080800041306b220324808080800020" + "03200136020c2003200036020820034101360214200341d488c08000360210" + "2003420137021c2003418380808000ad422086200341086aad843703282003" + "200341286a360218200341106a2002108980808000000bbf05010a7f238080" + "80800041306b2203248080808000200341033a002c2003412036021c410021" + "04200341003602282003200136022420032000360220200341003602142003" + "410036020c02400240024002400240200228021022050d00200228020c2200" + "450d0120022802082101200041037421062000417f6a41ffffffff01714101" + "6a21042002280200210003400240200041046a2802002207450d0020032802" + "2020002802002007200328022428020c11818080800080808080000d040b20" + "012802002003410c6a200128020411828080800080808080000d0320014108" + "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" + "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" + "09200228020021004100210603400240200041046a2802002201450d002003" + "28022020002802002001200328022428020c11818080800080808080000d03" + "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" + "2c2003200141186a2802003602282001410c6a28020021074100210a410021" + "0b024002400240200141086a2802000e03010002010b2007410374210c4100" + "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" + "3602102003200b36020c200141046a28020021070240024002402001280200" + "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" + "21070b4101210a0b200320073602182003200a3602142009200141146a2802" + "004103746a22012802002003410c6a20012802041182808080008080808000" + "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" + "0d012003280220200228020020044103746a22012802002001280204200328" + "022428020c1181808080008080808000450d010b410121010c010b41002101" + "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" + "2202417871220341044108200241037122021b20016a490d0002402002450d" + "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" + "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" + "5601017f23808080800041206b2202248080808000200241106a200041106a" + "290200370300200241086a200041086a290200370300200241013b011c2002" + "2001360218200220002902003703002002109280808000000be50301017f23" + "808080800041c0006b22022480808080000240024002400240024002402000" + "2d00000e0400010203000b2002200028020436020441002d009096c080001a" + "4114109c808080002200450d04200041106a410028008093c0800036000020" + "0041086a41002900f892c08000370000200041002900f092c0800037000020" + "0241143602102002200036020c200241143602082002410336022c200241a0" + "8fc08000360228200242023702342002418180808000ad422086200241046a" + "ad843703202002418480808000ad422086200241086aad8437031820022002" + "41186a36023020012802142001280218200241286a10878080800021002002" + "2802082201450d03200228020c20011088808080000c030b20002d00012100" + "2002410136022c200241d488c0800036022820024201370234200241838080" + "8000ad422086200241186aad8437030820022000410274220041c493c08000" + "6a28020036021c2002200041e894c080006a2802003602182002200241086a" + "36023020012802142001280218200241286a10878080800021000c020b2001" + "20002802042200280200200028020410958080800021000c010b2000280204" + "220028020020012000280204280210118280808000808080800021000b2002" + "41c0006a24808080800020000f0b000b140020012000280200200028020410" + "95808080000b3f01027f23808080800041106b220024808080800020004100" + "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" + "808080800020010bbe0601057f200041786a22012000417c6a280200220241" + "787122006a21030240024020024101710d002002410271450d012001280200" + "220220006a21000240200120026b220141002802809ac08000470d00200328" + "02044103714103470d01410020003602f899c0800020032003280204417e71" + "36020420012000410172360204200320003602000f0b2001200210a8808080" + "000b024002400240024002400240200328020422024102710d002003410028" + "02849ac08000460d02200341002802809ac08000460d032003200241787122" + "0210a8808080002001200220006a2200410172360204200120006a20003602" + "00200141002802809ac08000470d01410020003602f899c080000f0b200320" + "02417e7136020420012000410172360204200120006a20003602000b200041" + "8002490d022001200010a78080800041002101410041002802989ac0800041" + "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" + "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" + "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" + "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" + "200141002802809ac08000470d00410041003602f899c08000410041003602" + "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" + "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" + "2101034002402001280200220320004b0d002000200320012802046a490d04" + "0b200128020821010c000b0b410020013602809ac08000410041002802f899" + "c0800020006a22003602f899c0800020012000410172360204200120006a20" + "003602000f0b200041f8017141e897c080006a21030240024041002802f099" + "c08000220241012000410376742200710d00410020022000723602f099c080" + "00200321000c010b200328020821000b200320013602082000200136020c20" + "01200336020c200120003602080f0b024041002802e097c080002201450d00" + "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" + "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" + "000b0b4d01017f23808080800041206b220224808080800020024100360210" + "20024101360204200242043702082002412e36021c20022000360218200220" + "0241186a36020020022001108980808000000b7d02017f017e238080808000" + "41306b22022480808080002002200036020020022001360204200241023602" + "0c2002418484c08000360208200242023702142002418580808000ad422086" + "2203200241046aad84370328200220032002ad843703202002200241206a36" + "0210200241086a41b083c08000108980808000000b11002000350200410120" + "011091808080000bdf0703027f017e097f23808080800041306b2203248080" + "808000412721040240024020004290ce005a0d00200021050c010b41272104" + "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" + "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" + "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" + "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" + "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" + "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" + "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" + "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" + "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" + "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" + "c400200228021c220641017122071b2101200720096a21070b200341096a20" + "046a210a2006410471410276210b0240024020022802000d00024020022802" + "142204200228021822062001200b109380808000450d00410121040c020b20" + "04200a2009200628020c118180808000808080800021040c010b0240024002" + "402002280204220c20074b0d0020022802142204200228021822062001200b" + "109380808000450d01410121040c030b2006410871450d012002280210210d" + "2002413036021020022d0020210e41012104200241013a0020200228021422" + "06200228021822082001200b1093808080000d02200c20076b41016a210402" + "4003402004417f6a2204450d01200641302008280210118280808000808080" + "8000450d000b410121040c030b02402006200a2009200828020c1181808080" + "008080808000450d00410121040c030b2002200e3a00202002200d36021041" + "0021040c020b2004200a2009200628020c118180808000808080800021040c" + "010b200c20076b210c02400240024020022d002022040e0402000100020b20" + "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" + "016a2104200228021021082002280218210620022802142107024003402004" + "417f6a2204450d012007200820062802101182808080008080808000450d00" + "0b410121040c010b41012104200720062001200b1093808080000d00200720" + "0a2009200628020c11818080800080808080000d004100210403400240200c" + "2004470d00200c200c4921040c020b200441016a2104200720082006280210" + "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" + "24808080800020040b5d01027f23808080800041206b220124808080800020" + "002802182102200141106a200041106a290200370300200141086a20004108" + "6a2902003703002001200036021c2001200236021820012000290200370300" + "200110a980808000000b490002402002418080c400460d0020002002200128" + "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" + "0020034100200128020c11818080800080808080000b7d02017f017e238080" + "80800041306b22022480808080002002200036020020022001360204200241" + "0236020c200241a484c08000360208200242023702142002418580808000ad" + "4220862203200241046aad84370328200220032002ad843703202002200241" + "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" + "28020821030240024002400240200028020022040d002003410171450d010b" + "02402003410171450d00200120026a210502400240200028020c22060d0041" + "002107200121080c010b410021074100210920012108034020082203200546" + "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" + "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" + "080c010b200341046a21080b200820036b20076a21072006200941016a2209" + "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" + "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" + "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" + "200220031b21022003200120031b21010b024020040d002000280214200120" + "02200028021828020c11818080800080808080000f0b2000280204210a0240" + "20024110490d0020022001200141036a417c7122076b22096a220b41037121" + "044100210641002103024020012007460d004100210302402009417c4b0d00" + "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" + "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" + "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" + "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" + "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" + "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" + "200b4102762105200620036a21060340200721042005450d04200541c00120" + "0541c001491b220b410371210c200b410274210d4100210802402005410449" + "0d002004200d41f007716a210941002108200421030340200328020c220741" + "7f7341077620074106767241818284087120032802082207417f7341077620" + "074106767241818284087120032802042207417f7341077620074106767241" + "818284087120032802002207417f7341077620074106767241818284087120" + "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" + "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" + "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" + "417f734107762003410676724181828408712103200c4101460d0220082802" + "042207417f7341077620074106767241818284087120036a2103200c410246" + "0d0220082802082208417f7341077620084106767241818284087120036a21" + "030c020b024020020d00410021060c030b2002410371210802400240200241" + "044f0d0041002106410021090c010b41002106200121032002410c71220921" + "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" + "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" + "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" + "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" + "28021420012002200028021828020c11818080800080808080000f0b200341" + "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" + "400240200a20064d0d00200a20066b21054100210302400240024020002d00" + "200e0402000102020b20052103410021050c010b2005410176210320054101" + "6a41017621050b200341016a21032000280210210920002802182108200028" + "0214210703402003417f6a2203450d02200720092008280210118280808000" + "8080808000450d000b41010f0b200028021420012002200028021828020c11" + "818080800080808080000f0b0240200720012002200828020c118180808000" + "8080808000450d0041010f0b410021030340024020052003470d0020052005" + "490f0b200341016a2103200720092008280210118280808000808080800045" + "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" + "248080808000200341b085c0800036020c20032000360208200341b085c080" + "00360214200320013602102003410236021c200341bc80c080003602180240" + "20022802000d002003410336025c200341f080c08000360258200342033702" + "642003418680808000ad4220862204200341106aad84370348200320042003" + "41086aad843703402003418380808000ad422086200341186aad8437033820" + "03200341386a360260200341d8006a41e891c08000108980808000000b2003" + "41206a41106a200241106a290200370300200341206a41086a200241086a29" + "0200370300200320022902003703202003410436025c200341a481c0800036" + "0258200342043702642003418680808000ad4220862204200341106aad8437" + "035020032004200341086aad843703482003418780808000ad422086200341" + "206aad843703402003418380808000ad422086200341186aad843703382003" + "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" + "002802002001200028020428020c11828080800080808080000b1400200128" + "0214200128021820001087808080000b22002001280214419480c08000410e" + "200128021828020c11818080800080808080000b6001017f23808080800041" + "306b22002480808080002000410136020c200041b480c08000360208200042" + "013702142000418880808000ad4220862000412f6aad843703202000200041" + "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" + "80800041206b2200248080808000200041003602182000410136020c200041" + "bc88c0800036020820004204370210200041086a41c488c080001089808080" + "00000bcb2502087f017e02400240024002400240024002400240200041f501" + "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" + "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" + "20014108766722006b7641017120004101746b413e6a21040b410020026b21" + "010240200441027441d896c080006a28020022050d0041002100410021060c" + "020b4100210020024100411920044101766b2004411f461b74210741002106" + "034002402005220528020441787122082002490d00200820026b220820014f" + "0d00200821012005210620080d004100210120052106200521000c040b2005" + "28021422082000200820052007411d764104716a41106a2802002205471b20" + "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" + "8000220541102000410b6a41f803712000410b491b22024103762201762200" + "410371450d00024002402000417f7341017120016a2207410374220041e897" + "c080006a2201200041f097c080006a28020022022802082206460d00200620" + "0136020c200120063602080c010b41002005417e200777713602f099c08000" + "0b20022000410372360204200220006a220020002802044101723602042002" + "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" + "2802f499c080002200450d0620006841027441d896c080006a280200220628" + "020441787120026b21012006210503400240200628021022000d0020062802" + "1422000d0020052802182104024002400240200528020c22002005470d0020" + "0541144110200528021422001b6a28020022060d01410021000c020b200528" + "02082206200036020c200020063602080c010b200541146a200541106a2000" + "1b21070340200721082006220041146a200041106a200028021422061b2107" + "20004114411020061b6a28020022060d000b200841003602000b2004450d04" + "0240200528021c41027441d896c080006a22062802002005460d0020044110" + "411420042802102005461b6a20003602002000450d050c040b200620003602" + "0020000d03410041002802f499c08000417e200528021c77713602f499c080" + "000c040b200028020441787120026b22062001200620014922061b21012000" + "200520061b2105200021060c000b0b02400240200020017441022001742200" + "410020006b7271682208410374220141e897c080006a2206200141f097c080" + "006a28020022002802082207460d002007200636020c200620073602080c01" + "0b41002005417e200877713602f099c080000b200020024103723602042000" + "20026a2207200120026b2206410172360204200020016a2006360200024041" + "002802f899c080002205450d00200541787141e897c080006a210141002802" + "809ac0800021020240024041002802f099c080002208410120054103767422" + "05710d00410020082005723602f099c08000200121050c010b200128020821" + "050b200120023602082005200236020c2002200136020c200220053602080b" + "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" + "2004360218024020052802102206450d002000200636021020062000360218" + "0b20052802142206450d0020002006360214200620003602180b0240024002" + "4020014110490d0020052002410372360204200520026a2202200141017236" + "0204200220016a200136020041002802f899c080002207450d012007417871" + "41e897c080006a210641002802809ac0800021000240024041002802f099c0" + "8000220841012007410376742207710d00410020082007723602f099c08000" + "200621070c010b200628020821070b200620003602082007200036020c2000" + "200636020c200020073602080c010b2005200120026a220041037236020420" + "0520006a220020002802044101723602040c010b410020023602809ac08000" + "410020013602f899c080000b200541086a0f0b024020002006720d00410021" + "0641022004742200410020006b722003712200450d0320006841027441d896" + "c080006a28020021000b2000450d010b034020002006200028020441787122" + "0520026b220820014922041b2103200520024921072008200120041b210802" + "40200028021022050d00200028021421050b2006200320071b210620012008" + "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" + "22002002490d002001200020026b4f0d010b20062802182104024002400240" + "200628020c22002006470d00200641144110200628021422001b6a28020022" + "050d01410021000c020b20062802082205200036020c200020053602080c01" + "0b200641146a200641106a20001b21070340200721082005220041146a2000" + "41106a200028021422051b210720004114411020051b6a28020022050d000b" + "200841003602000b2004450d030240200628021c41027441d896c080006a22" + "052802002006460d0020044110411420042802102006461b6a200036020020" + "00450d040c030b2005200036020020000d02410041002802f499c08000417e" + "200628021c77713602f499c080000c030b0240024002400240024002404100" + "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" + "0041002101200241af80046a220641107640002200417f4622070d07200041" + "10742205450d07410041002802889ac08000410020064180807c7120071b22" + "086a22003602889ac080004100410028028c9ac0800022012000200120004b" + "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" + "c080002100034020002802002206200028020422076a2005460d0220002802" + "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" + "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" + "083602dc97c08000410020053602d897c08000410041e897c080003602f497" + "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" + "8000410041f897c0800036028498c08000410041f097c080003602f897c080" + "004100418098c0800036028c98c08000410041f897c0800036028098c08000" + "4100418898c0800036029498c080004100418098c0800036028898c0800041" + "00419098c0800036029c98c080004100418898c0800036029098c080004100" + "419898c080003602a498c080004100419098c0800036029898c08000410041" + "a098c080003602ac98c080004100419898c080003602a098c0800041004100" + "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" + "02a898c08000410041a898c080003602b098c08000410041b098c080003602" + "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" + "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" + "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" + "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" + "00410041d098c080003602d898c08000410041d898c080003602e498c08000" + "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" + "0041e098c080003602e898c08000410041e898c080003602f498c080004100" + "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" + "f898c0800036028499c08000410041f098c080003602f898c0800041004180" + "99c0800036028c99c08000410041f898c0800036028099c080004100418899" + "c0800036029499c080004100418099c0800036028899c080004100419099c0" + "800036029c99c080004100418899c0800036029099c080004100419899c080" + "003602a499c080004100419099c0800036029899c08000410041a099c08000" + "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" + "02b499c08000410041a099c080003602a899c08000410041b099c080003602" + "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" + "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" + "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" + "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" + "00410041c899c080003602d099c08000410041d899c080003602e499c08000" + "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" + "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" + "80003602e899c080004100200841586a22003602fc99c08000200520004101" + "72360204200520006a4128360204410041808080013602909ac080000c080b" + "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" + "c080002200200520002005491b3602949ac08000200520086a210641d897c0" + "800021000240024002400340200028020022072006460d0120002802082200" + "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" + "280200220620014b0d002001200620002802046a2206490d020b2000280208" + "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" + "800020052000410172360204200520006a4128360204410041808080013602" + "909ac080002001200641606a41787141786a22002000200141106a491b2207" + "411b36020441002902d897c080002109200741106a41002902e097c0800037" + "020020072009370208410020083602dc97c08000410020053602d897c08000" + "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" + "00034020004107360200200041046a22002006490d000b20072001460d0720" + "072007280204417e713602042001200720016b220041017236020420072000" + "36020002402000418002490d002001200010a7808080000c080b200041f801" + "7141e897c080006a21060240024041002802f099c080002205410120004103" + "76742200710d00410020052000723602f099c08000200621000c010b200628" + "020821000b200620013602082000200136020c2001200636020c2001200036" + "02080c070b200020053602002000200028020420086a360204200520024103" + "723602042007410f6a41787141786a2201200520026a22006b210220014100" + "2802849ac08000460d03200141002802809ac08000460d0402402001280204" + "22064103714101470d0020012006417871220610a880808000200620026a21" + "02200120066a220128020421060b20012006417e7136020420002002410172" + "360204200020026a200236020002402002418002490d002000200210a78080" + "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" + "8000220641012002410376742202710d00410020062002723602f099c08000" + "200121020c010b200128020821020b200120003602082002200036020c2000" + "200136020c200020023602080c050b4100200020026b22013602fc99c08000" + "410041002802849ac08000220020026a22063602849ac08000200620014101" + "7236020420002002410372360204200041086a21010c060b41002802809ac0" + "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" + "410041003602f899c0800020012000410372360204200120006a2200200028" + "02044101723602040c010b410020063602f899c080004100200120026a2205" + "3602809ac0800020052006410172360204200120006a200636020020012002" + "4103723602040b200141086a0f0b2000200720086a36020441004100280284" + "9ac080002200410f6a417871220141786a22063602849ac080004100200020" + "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" + "2005410172360204200020016a4128360204410041808080013602909ac080" + "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" + "3602fc99c08000200020024101723602040c010b410020003602809ac08000" + "410041002802f899c0800020026a22023602f899c080002000200241017236" + "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" + "8000220020024d0d004100200020026b22013602fc99c08000410041002802" + "849ac08000220020026a22063602849ac08000200620014101723602042000" + "2002410372360204200041086a0f0b20010f0b200020043602180240200628" + "02102205450d0020002005360210200520003602180b20062802142205450d" + "0020002005360214200520003602180b0240024020014110490d0020062002" + "410372360204200620026a22002001410172360204200020016a2001360200" + "02402001418002490d002000200110a7808080000c020b200141f8017141e8" + "97c080006a21020240024041002802f099c080002205410120014103767422" + "01710d00410020052001723602f099c08000200221010c010b200228020821" + "010b200220003602082001200036020c2000200236020c200020013602080c" + "010b2006200120026a2200410372360204200620006a220020002802044101" + "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" + "800041051095808080000f0b2001419183c0800041041095808080000b1400" + "2001200028020420002802081095808080000b7001037f2000280204210102" + "40024020002d0000220041044b0d0020004103470d010b2001280200210002" + "40200141046a28020022022802002203450d00200020031180808080008080" + "8080000b024020022802042202450d00200020021088808080000b2001410c" + "1088808080000b0bab08010a7f23808080800041206b220424808080800002" + "40024002400240024020012802100d002001417f3602102003410020032002" + "41036a417c7120026b22056b41077120032005491b22066b21072003200649" + "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" + "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" + "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" + "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" + "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" + "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" + "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" + "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" + "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" + "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" + "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" + "6a2108200541786a210a41808284082002200941786a22076a280200220d41" + "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" + "736b200d727141808182847871418081828478460d000b0b200920034b0d02" + "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" + "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" + "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" + "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" + "0240200128021420066b20034b0d002000200141146a2002200310a1808080" + "000c050b200128021820066a2002200310ad808080001a200041043a000020" + "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" + "8000000b20092003109480808000000b0240200320064f0d00200441003602" + "182004410136020c2004418c89c0800036020820044204370210200441086a" + "419489c08000108980808000000b02402001411c6a2802002205450d000240" + "0240200128021420056b20064d0d00200141186a28020020056a2002200610" + "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" + "41146a2002200610a180808000024020042d00084104460d00200020042903" + "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" + "01411c6a41003602000b200220066a210502402001280214200320066b2206" + "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" + "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" + "200128021041016a360210200441206a2480808080000b7101027f20012802" + "002104024020012802082205450d00200420056b20034f0d00410021052001" + "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" + "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" + "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" + "2203248080808000200341086a20002802082802002001200210a080808000" + "024020032d000822024104460d002000280204210420032903082105024002" + "4020002d0000220141044b0d0020014103470d010b20042802002101024020" + "0441046a28020022062802002207450d002001200711808080800080808080" + "000b024020062802042206450d00200120061088808080000b2004410c1088" + "808080000b200020053702000b200341106a24808080800020024104470b9c" + "0303027f017e037f23808080800041106b2202248080808000200241003602" + "0402400240024002402001418001490d002001418010490d01200141808004" + "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" + "20022001410676413f71418001723a0005410321010c030b200220013a0004" + "410121010c020b20022001413f71418001723a00052002200141067641c001" + "723a0004410221010c010b20022001413f71418001723a0007200220014112" + "7641f001723a000420022001410676413f71418001723a000620022001410c" + "76413f71418001723a0005410421010b200241086a20002802082802002002" + "41046a200110a080808000024020022d000822014104460d00200028020421" + "03200229030821040240024020002d0000220541044b0d0020054103470d01" + "0b200328020021050240200341046a28020022062802002207450d00200520" + "0711808080800080808080000b024020062802042206450d00200520061088" + "808080000b2003410c1088808080000b200020043702000b200241106a2480" + "8080800020014104470b1200200041c085c0800020011087808080000b0300" + "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" + "0d002001410620014108766722026b7641017120024101746b413e6a21020b" + "200042003702102000200236021c200241027441d896c080006a2103024041" + "002802f499c0800041012002742204710d0020032000360200200020033602" + "182000200036020c20002000360208410041002802f499c080002004723602" + "f499c080000f0b024002400240200328020022042802044178712001470d00" + "200421020c010b20014100411920024101766b2002411f461b742103034020" + "042003411d764104716a41106a22052802002202450d022003410174210320" + "02210420022802044178712001470d000b0b20022802082203200036020c20" + "022000360208200041003602182000200236020c200020033602080f0b2005" + "2000360200200020043602182000200036020c200020003602080b82030104" + "7f200028020c21020240024002402001418002490d00200028021821030240" + "0240024020022000470d00200041144110200028021422021b6a2802002201" + "0d01410021020c020b20002802082201200236020c200220013602080c010b" + "200041146a200041106a20021b21040340200421052001220241146a200241" + "106a200228021422011b210420024114411020011b6a28020022010d000b20" + "0541003602000b2003450d020240200028021c41027441d896c080006a2201" + "2802002000460d0020034110411420032802102000461b6a20023602002002" + "450d030c020b2001200236020020020d01410041002802f499c08000417e20" + "0028021c77713602f499c080000c020b0240200220002802082204460d0020" + "04200236020c200220043602080f0b410041002802f099c08000417e200141" + "037677713602f099c080000f0b20022003360218024020002802102201450d" + "0020022001360210200120023602180b20002802142201450d002002200136" + "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" + "8080800041106b2201248080808000200028020c2102024002400240024020" + "002802040e020001020b20020d0141012102410021030c020b20020d002000" + "28020022022802042103200228020021020c010b2001418080808078360200" + "2001200036020c2001418980808000200028021c22002d001c20002d001d10" + "ab80808000000b20012003360204200120023602002001418a808080002000" + "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" + "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" + "96c08000024020054100480d000240024041002d00a09ac080000d00410041" + "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" + "010c020b200441086a200020011183808080008080808000000b410041003a" + "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" + "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" + "006b41037122046a210502402004450d002000210320012106034020032006" + "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" + "20046b2207417c7122086a210302400240200120046a2209410371450d0020" + "084101480d012009410374220641187121022009417c71220a41046a210141" + "0020066b4118712104200a2802002106034020052006200276200128020022" + "0620047472360200200141046a2101200541046a22052003490d000c020b0b" + "20084101480d0020092101034020052001280200360200200141046a210120" + "0541046a22052003490d000b0b20074103712102200920086a21010b024020" + "02450d00200320026a21050340200320012d00003a0000200141016a210120" + "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" + "000001000000000000000000100001000000426f72726f774d75744572726f" + "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" + "73657274696f6e20606c6566742020726967687460206661696c65640a2020" + "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" + "0000650010000900000020726967687460206661696c65643a200a20206c65" + "66743a200000003e0010001000000088001000100000009800100009000000" + "65001000090000003030303130323033303430353036303730383039313031" + "31313231333134313531363137313831393230323132323233323432353236" + "32373238323933303331333233333334333533363337333833393430343134" + "32343334343435343634373438343935303531353235333534353535363537" + "35383539363036313632363336343635363636373638363937303731373237" + "33373437353736373737383739383038313832383338343835383638373838" + "3839393039313932393339343935393639373938393966616c736574727565" + "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" + "18000000830000001e00000095011000180000009f0000000900000072616e" + "676520737461727420696e64657820206f7574206f662072616e676520666f" + "7220736c696365206f66206c656e67746820d001100012000000e201100022" + "00000072616e676520656e6420696e646578201402100010000000e2011000" + "220000007265656e7472616e7420696e69740000340210000e0000002f7275" + "7374632f633266373463336639323861656235303366313562346539656635" + "373738653737663330353862382f6c6962726172792f636f72652f7372632f" + "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" + "000000000000000004000000040000000b0000000c0000000c000000040000" + "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" + "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" + "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" + "7665726865616400d802100029000000a80400000900000061737365727469" + "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" + "6f766572686561640000d802100029000000ae0400000d000000757365206f" + "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" + "20706f737369626c6520616674657220746865207468726561642773206c6f" + "63616c206461746120686173206265656e2064657374726f7965647374642f" + "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" + "0000006661696c656420746f2067656e657261746520756e69717565207468" + "726561642049443a2062697473706163652065786861757374656400040410" + "0037000000de03100015000000c40400000d00000001000000000000007374" + "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" + "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" + "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" + "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" + "6e656374696f6e207265736574686f737420756e726561636861626c656e65" + "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" + "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" + "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" + "776e62726f6b656e2070697065656e7469747920616c726561647920657869" + "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" + "69726563746f727969732061206469726563746f72796469726563746f7279" + "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" + "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" + "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" + "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" + "616e646c65696e76616c696420696e70757420706172616d65746572696e76" + "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" + "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" + "2066696c6566696c6573797374656d2071756f746120657863656564656466" + "696c6520746f6f206c617267657265736f7572636520627573796578656375" + "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" + "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" + "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" + "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" + "6e737570706f72746564756e657870656374656420656e64206f662066696c" + "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" + "676f72697a6564206572726f7220286f73206572726f722029000000010000" + "0000000000910710000b0000009c071000010000007374642f7372632f696f" + "2f737464696f2e727300b8071000130000002c030000140000006661696c65" + "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" + "02000000b8071000130000005d040000090000007374646f75747374642f73" + "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" + "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" + "72207768656e2074686520756e6465726c79696e672073747265616d206469" + "64206e6f740000002b081000560000001a0810001100000028070000150000" + "0063616e6e6f74207265637572736976656c792061637175697265206d7574" + "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" + "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" + "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" + "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" + "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" + "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" + "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" + "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" + "65637572736976656c79840910003800000010000000110000001200000010" + "0000001000000013000000120000000d0000000e000000150000000c000000" + "0b00000015000000150000000f0000000e0000001300000026000000380000" + "0019000000170000000c000000090000000a00000010000000170000001900" + "00000e0000000d00000014000000080000001b0000000e0000001000000016" + "000000150000000b000000160000000d0000000b00000013000000a4041000" + "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" + "00370510004c0510005805100063051000780510008d0510009c051000aa05" + "1000bd051000e30510001b061000340610004b06100057061000600610006a" + "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" + "fc0610000a0710001a07100030071000450710005007100066071000730710" + "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" + "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" + "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" + "6c61792475323024666f7224753230246933322447542433666d7431376863" + "6564393063376136333963303164644502495f5a4e337374643473796e6339" + "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" + "6e697469616c697a6531376837663563353038646139653162303962450342" + "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" + "245424475424387472795f696e697431376863653633626632323835313931" + "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" + "432441244754243964726f705f736c6f773137686565396163636361643963" + "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" + "6572745f6661696c6564313768323332363266326333633738623661624506" + "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" + "313768663038613939653264373333366336614507265f5a4e34636f726533" + "666d743577726974653137683933353534653462653731663263376145080e" + "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" + "696e673970616e69635f666d74313768363534306363623264356664633361" + "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" + "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" + "6c61792447542433666d743137683930323731633762326136636538333945" + "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" + "643062383630396332343732450c097265637572736976650d415f5a4e3864" + "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" + "24475424346672656531376833393833346161616165336538393436450e2c" + "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" + "623931376464393363323239450f445f5a4e34636f726535736c6963653569" + "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" + "6c313768663931613361666538376231643434334510625f5a4e34636f7265" + "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" + "652e2e666d742e2e446973706c61792475323024666f722475323024753332" + "2447542433666d74313768626633653032323834383365333735614511305f" + "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" + "353231666136656636613036373261451211727573745f626567696e5f756e" + "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" + "61645f696e74656772616c313277726974655f707265666978313768613961" + "343332383062363030366431324514425f5a4e34636f726535736c69636535" + "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" + "3137683038386235366532393962656161616645152e5f5a4e34636f726533" + "666d7439466f726d6174746572337061643137683437363961653338393337" + "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" + "6572745f6661696c65645f696e6e6572313768366637653332353764383461" + "353034324517475f5a4e34325f244c54242452462454247532302461732475" + "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" + "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" + "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" + "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" + "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" + "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" + "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" + "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" + "70616e69635f616c72656164795f626f72726f776564313768333134623532" + "61316263343662666534451b395f5a4e337374643674687265616438546872" + "6561644964336e657739657868617573746564313768333336626637613134" + "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" + "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" + "3539333961346338393763633135451d475f5a4e34325f244c542424524624" + "54247532302461732475323024636f72652e2e666d742e2e44656275672447" + "542433666d7431376865313837343338386530376266653235451e595f5a4e" + "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" + "302461732475323024636f72652e2e666d742e2e446973706c617924475424" + "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" + "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" + "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" + "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" + "24475424313768313636646336316162303333346331654520605f5a4e3631" + "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" + "2475323024617324753230247374642e2e696f2e2e57726974652447542439" + "77726974655f616c6c31376832346238323631303436316432353666452155" + "5f5a4e3373746432696f386275666665726564396275667772697465723138" + "427566577269746572244c54245724475424313477726974655f616c6c5f63" + "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" + "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" + "41646170746572244c54245424475424247532302461732475323024636f72" + "652e2e666d742e2e5772697465244754243977726974655f73747231376837" + "6661636635626330656663643830384523325f5a4e34636f726533666d7435" + "5772697465313077726974655f636861723137686630623362653165633139" + "64653565374524305f5a4e34636f726533666d743557726974653977726974" + "655f666d743137686638383038663064663065343531336445250a72757374" + "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" + "796c6f61643661735f73747231376836313439663134326439613265303265" + "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" + "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" + "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" + "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" + "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" + "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" + "727573745f656e645f73686f72745f6261636b747261636531376834646333" + "646534376432323032316239452a585f5a4e337374643970616e69636b696e" + "673139626567696e5f70616e69635f68616e646c657232385f247537622424" + "75376224636c6f737572652475376424247537642431376865313761333937" + "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" + "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" + "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" + "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" + "7469635374725061796c6f6164247532302461732475323024636f72652e2e" + "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" + "376865623366373232643232346534326638452d066d656d63707907120100" + "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" + "70726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d62790105727573746325312e38332e302d6e696768746c7920" + "2863326637346333663920323032342d30392d30392900490f746172676574" + "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" + "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" + "2d657874"; + +extern std::string const hfPerfTest = + "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" + "6000017f021d0203656e760974726163655f6e756d000003656e76057472" + "616365000103030202030503010002068601167f0041a0090b7f0041a011" + "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" + "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" + "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" + "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" + "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300020666696e6973680003036275660300076c6f635f6275660301" + "036d73670302086572725f686561640303096572725f646174613103040a" + "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" + "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" + "746103090753465f44617461030a1753465f417574686f72697a65437265" + "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" + "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" + "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" + "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" + "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" + "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" + "0300200041086a22000d000b41d811420037030041d011420037030041c8" + "11420037030041c011420037030041b811420037030041b0114200370300" + "41a811428d801c37030041a011429a803c3703000240034041e008411020" + "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" + "1441c0084113410010011a0b41010b0b840104004180080b340100080003" + "00080009000f000a000e000d0007001b0007001a000f0000000000676574" + "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" + "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" + "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" + "007f0970726f647563657273010c70726f6365737365642d62790105636c" + "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" + "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" + "346235613264623538323935386166316565333038613739306366646234" + "32626432343732302900490f7461726765745f6665617475726573042b0f" + "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" + "6572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const allKeyletsWasmHex = + "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" + "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" + "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" + "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" + "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" + "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" + "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" + "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" + "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" + "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" + "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" + "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" + "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" + "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" + "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" + "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" + "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" + "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" + "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" + "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" + "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" + "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" + "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" + "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" + "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" + "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" + "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" + "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" + "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" + "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" + "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" + "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" + "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" + "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" + "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" + "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" + "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" + "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" + "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" + "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" + "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" + "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" + "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" + "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" + "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" + "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" + "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" + "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" + "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" + "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" + "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" + "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" + "420037030020004200370388012008411420024120100622014120460d0102402001410048" + "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" + "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" + "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" + "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" + "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" + "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" + "420037030020004190016a220542003703002000420037038801200041046a411420004118" + "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" + "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" + "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" + "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" + "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" + "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" + "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" + "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" + "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" + "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" + "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" + "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" + "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" + "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" + "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" + "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" + "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" + "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" + "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" + "003703e001200041046a411441062004412010092204412047044002402004410048044020" + "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" + "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" + "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" + "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" + "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" + "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" + "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" + "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" + "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" + "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" + "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" + "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" + "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" + "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" + "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" + "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" + "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" + "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" + "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" + "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" + "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" + "200041186a2208411420034120100c22024120470440024020024100480440200120023602" + "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" + "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" + "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" + "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" + "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" + "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" + "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" + "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" + "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" + "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" + "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" + "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" + "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" + "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" + "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" + "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" + "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" + "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" + "03290300370001200141196a2006290300370000200141116a200729030037000020014109" + "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" + "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" + "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" + "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" + "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" + "02027f20054118200841142001412010102205412047044002402005410048044020022005" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" + "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" + "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" + "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" + "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" + "084114410620014120101122054120470440024020054100480440200220053602040c010b" + "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" + "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" + "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" + "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" + "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" + "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" + "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" + "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" + "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" + "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" + "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" + "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" + "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" + "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" + "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" + "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" + "022001290300370001200241196a2008290300370000200241116a20062903003700002002" + "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" + "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" + "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" + "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" + "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" + "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" + "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" + "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" + "370300200141106a22064200370300200141086a2207420037030020014200370300200041" + "90066a2202027f200441144112200141201016220541204704400240200541004804402002" + "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" + "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" + "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" + "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" + "7f20044114411320014120101722044120470440024020044100480440200220043602040c" + "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" + "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" + "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" + "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" + "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" + "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" + "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" + "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" + "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" + "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" + "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" + "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" + "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" + "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" + "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" + "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" + "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" + "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" + "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" + "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" + "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" + "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" + "200228020021020340200420022003762001280200220220057472360200200141046a2101" + "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" + "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" + "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" + "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" + "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" + "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" + "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" + "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" + "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" + "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" + "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" + "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" + "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" + "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" + "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" + "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" + "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" + "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" + "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" + "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" + "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" + "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" + "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" + "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" + "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" + "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" + "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" + "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" + "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" + "6c746976616c7565"; + +extern std::string const codecovTestsWasmHex = + "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" + "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" + "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" + "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" + "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" + "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" + "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" + "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" + "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" + "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" + "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" + "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" + "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" + "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" + "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" + "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" + "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" + "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" + "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" + "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" + "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" + "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" + "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" + "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" + "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" + "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" + "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" + "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" + "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" + "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" + "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" + "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" + "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" + "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" + "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" + "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" + "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" + "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" + "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" + "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" + "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" + "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" + "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" + "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" + "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" + "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" + "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" + "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" + "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" + "002002420037030020004200370360200141201006412041918bc000411210341007410a41" + "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" + "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" + "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" + "c0004111103420034100360200200242003703002000420037036002404181802020014114" + "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" + "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" + "200028006336002f200020002903c801370033200442003703002003420037030020024200" + "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" + "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" + "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" + "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" + "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" + "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" + "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" + "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" + "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" + "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" + "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" + "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" + "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" + "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" + "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" + "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" + "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" + "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" + "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" + "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" + "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" + "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" + "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" + "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" + "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" + "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" + "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" + "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" + "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" + "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" + "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" + "00200020002903083703a801200241003b010020054200370300200042003703c801200341" + "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" + "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" + "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" + "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" + "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" + "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" + "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" + "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" + "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" + "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" + "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" + "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" + "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" + "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" + "34200742003703002002420037030020054200370300200042003703c801200620002802a0" + "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" + "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" + "42003703002002420037030020054200370300200042003703c80120034114200341142006" + "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" + "20054200370300200042003703c8012003411420034114200120002802a001200441201022" + "417141968ec000411e10342007420037030020024200370300200542003703002000420037" + "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" + "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" + "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" + "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" + "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" + "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" + "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" + "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" + "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" + "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" + "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" + "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" + "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" + "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" + "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" + "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" + "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" + "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" + "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" + "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" + "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" + "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" + "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" + "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" + "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" + "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" + "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" + "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" + "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" + "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" + "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" + "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" + "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" + "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" + "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" + "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" + "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" + "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" + "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" + "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" + "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" + "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" + "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" + "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" + "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" + "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" + "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" + "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" + "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" + "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" + "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" + "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" + "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" + "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" + "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" + "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" + "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" + "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" + "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" + "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" + "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" + "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" + "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" + "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" + "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" + "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" + "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" + "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" + "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" + "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" + "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" + "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" + "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" + "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" + "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" + "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" + "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" + "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" + "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" + "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" + "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" + "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" + "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" + "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" + "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" + "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" + "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" + "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" + "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" + "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" + "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" + "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" + "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" + "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" + "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" + "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" + "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" + "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" + "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" + "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" + "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" + "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" + "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" + "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" + "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" + "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" + "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" + "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" + "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" + "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" + "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" + "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" + "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" + "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" + "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" + "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" + "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" + "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" + "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" + "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" + "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" + "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" + "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const floatTestsWasmHex = + "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" + "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" + "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" + "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" + "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" + "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" + "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" + "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" + "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" + "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" + "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" + "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" + "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" + "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" + "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" + "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" + "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" + "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" + "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" + "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" + "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" + "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" + "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" + "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" + "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" + "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" + "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" + "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" + "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" + "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" + "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" + "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" + "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" + "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" + "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" + "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" + "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" + "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" + "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" + "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" + "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" + "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" + "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" + "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" + "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" + "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" + "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" + "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" + "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" + "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" + "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" + "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" + "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" + "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" + "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" + "41081083808080001a200042003703184200200041186a410841001081808080001a200041" + "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" + "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" + "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" + "084209200041086a410841001081808080001a20004200370310200041086a410841022000" + "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" + "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" + "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" + "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" + "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" + "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" + "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" + "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" + "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" + "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" + "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" + "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" + "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" + "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" + "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" + "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" + "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" + "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" + "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" + "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" + "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" + "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" + "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" + "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" + "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" + "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" + "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" + "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" + "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" + "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" + "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" + "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" + "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" + "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" + "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" + "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" + "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" + "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" + "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" + "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" + "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" + "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" + "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" + "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" + "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" + "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" + "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" + "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" + "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" + "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" + "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" + "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" + "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" + "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" + "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" + "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" + "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" + "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" + "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" + "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" + "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" + "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" + "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" + "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" + "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" + "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" + "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" + "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" + "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" + "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" + "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" + "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" + "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" + "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" + "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" + "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" + "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" + "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" + "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" + "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" + "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" + "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" + "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" + "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" + "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" + "2d74797065732b087369676e2d657874"; + +extern std::string const float0Hex = + "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" + "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" + "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" + "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" + "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" + "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" + "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" + "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" + "7f23808080800041206b2200248080808000418080c08000411541004100" + "41001080808080001a200042003703084200200041086a41084100108180" + "8080001a20004200370310420a200041106a410841001081808080001a20" + "0042003703180240200041106a4108200041106a4108200041186a410841" + "001082808080004108460d00419580c08000411541004100410010808080" + "80001a0b02400240200041086a4108200041186a41081083808080000d00" + "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" + "41164100410041001080808080001a0b02400240200041086a410841d780" + "c0800041081083808080000d0041df80c08000411a410041004100108080" + "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" + "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" + "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" + "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" + "642020666c6f6174203020636f6d706172653a2062616480000000000000" + "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" + "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" + "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" + "72706c5f73746434686f7374357472616365313768616338383262323664" + "656162656436364501355f5a4e387872706c5f73746434686f7374313466" + "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" + "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" + "737562747261637431376864363430633135323334353432393563450334" + "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" + "72653137683663386465656231323864393638386645040666696e697368" + "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" + "7461004d0970726f64756365727302086c616e6775616765010452757374" + "000c70726f6365737365642d6279010572757374631d312e38392e302028" + "32393438333838336520323032352d30382d3034290094010f7461726765" + "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" + "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" + "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" + "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" + "6572656e63652d74797065732b087369676e2d657874"; + +extern std::string const disabledFloatHex = + "0061736d010000000108026000006000017f03030200010503010002063e" + "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" + "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" + "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" + "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" + "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" + "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" + "090a150202000b100043000000c54300200045921a41010b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h new file mode 100644 index 00000000000..0e7e3785ea8 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -0,0 +1,52 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const ledgerSqnWasmHex; + +extern std::string const allHostFunctionsWasmHex; + +extern std::string const deepRecursionHex; + +extern std::string const fibWasmHex; + +extern std::string const b58WasmHex; + +extern std::string const sha512PureWasmHex; + +extern std::string const zkProofWasmHex; + +extern std::string const sp1WasmHex; + +extern std::string const hfPerfTest; + +extern std::string const allKeyletsWasmHex; + +extern std::string const codecovTestsWasmHex; + +extern std::string const floatTestsWasmHex; + +extern std::string const float0Hex; + +extern std::string const disabledFloatHex; From 1b6312afb3b2f12a6db948f9f49cd9d739329709 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:34:03 -0400 Subject: [PATCH 073/212] rearrange files --- .../{wasm_fixtures => }/.gitignore | 0 .../all_host_functions/Cargo.lock | 0 .../all_host_functions/Cargo.toml | 0 .../all_host_functions/src/lib.rs | 0 .../all_keylets/Cargo.lock | 0 .../all_keylets/Cargo.toml | 0 .../all_keylets/src/lib.rs | 0 .../wasm_fixtures/{wasm_fixtures => }/b58.c | 0 .../codecov_tests/Cargo.lock | 0 .../codecov_tests/Cargo.toml | 0 .../codecov_tests/src/host_bindings_loose.rs | 0 .../codecov_tests/src/lib.rs | 0 .../{wasm_fixtures => }/copyFixtures.py | 0 .../{wasm_fixtures => }/disableFloat.wat | 0 .../wasm_fixtures/{wasm_fixtures => }/fib.c | 0 .../float_tests/Cargo.lock | 0 .../float_tests/Cargo.toml | 0 .../float_tests/src/lib.rs | 0 .../{wasm_fixtures => }/ledgerSqn.c | 0 .../{wasm_fixtures => }/sha512Pure.c | 0 .../{wasm_fixtures => }/sp1/Cargo.lock | 0 .../{wasm_fixtures => }/sp1/Cargo.toml | 0 .../{wasm_fixtures => }/sp1/src/lib.rs | 0 .../wasm_fixtures/wasm_fixtures/fixtures.cpp | 10330 ---------------- .../wasm_fixtures/wasm_fixtures/fixtures.h | 52 - .../{wasm_fixtures => }/zk_proof/Cargo.lock | 0 .../{wasm_fixtures => }/zk_proof/Cargo.toml | 0 .../{wasm_fixtures => }/zk_proof/src/lib.rs | 0 28 files changed, 10382 deletions(-) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/.gitignore (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_host_functions/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_host_functions/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_host_functions/src/lib.rs (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_keylets/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_keylets/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/all_keylets/src/lib.rs (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/b58.c (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/codecov_tests/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/codecov_tests/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/codecov_tests/src/host_bindings_loose.rs (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/codecov_tests/src/lib.rs (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/copyFixtures.py (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/disableFloat.wat (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/fib.c (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/float_tests/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/float_tests/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/float_tests/src/lib.rs (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/ledgerSqn.c (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/sha512Pure.c (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/sp1/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/sp1/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/sp1/src/lib.rs (100%) delete mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp delete mode 100644 src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h rename src/test/app/wasm_fixtures/{wasm_fixtures => }/zk_proof/Cargo.lock (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/zk_proof/Cargo.toml (100%) rename src/test/app/wasm_fixtures/{wasm_fixtures => }/zk_proof/src/lib.rs (100%) diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/.gitignore b/src/test/app/wasm_fixtures/.gitignore similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/.gitignore rename to src/test/app/wasm_fixtures/.gitignore diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.lock rename to src/test/app/wasm_fixtures/all_host_functions/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/Cargo.toml rename to src/test/app/wasm_fixtures/all_host_functions/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_host_functions/src/lib.rs rename to src/test/app/wasm_fixtures/all_host_functions/src/lib.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.lock rename to src/test/app/wasm_fixtures/all_keylets/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/Cargo.toml rename to src/test/app/wasm_fixtures/all_keylets/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/all_keylets/src/lib.rs rename to src/test/app/wasm_fixtures/all_keylets/src/lib.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/b58.c rename to src/test/app/wasm_fixtures/b58.c diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.lock rename to src/test/app/wasm_fixtures/codecov_tests/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/Cargo.toml rename to src/test/app/wasm_fixtures/codecov_tests/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs rename to src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/codecov_tests/src/lib.rs rename to src/test/app/wasm_fixtures/codecov_tests/src/lib.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/copyFixtures.py rename to src/test/app/wasm_fixtures/copyFixtures.py diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat b/src/test/app/wasm_fixtures/disableFloat.wat similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/disableFloat.wat rename to src/test/app/wasm_fixtures/disableFloat.wat diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fib.c b/src/test/app/wasm_fixtures/fib.c similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/fib.c rename to src/test/app/wasm_fixtures/fib.c diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.lock rename to src/test/app/wasm_fixtures/float_tests/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/float_tests/Cargo.toml rename to src/test/app/wasm_fixtures/float_tests/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs b/src/test/app/wasm_fixtures/float_tests/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/float_tests/src/lib.rs rename to src/test/app/wasm_fixtures/float_tests/src/lib.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/ledgerSqn.c rename to src/test/app/wasm_fixtures/ledgerSqn.c diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/sha512Pure.c rename to src/test/app/wasm_fixtures/sha512Pure.c diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock b/src/test/app/wasm_fixtures/sp1/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.lock rename to src/test/app/wasm_fixtures/sp1/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml b/src/test/app/wasm_fixtures/sp1/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/sp1/Cargo.toml rename to src/test/app/wasm_fixtures/sp1/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs b/src/test/app/wasm_fixtures/sp1/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/sp1/src/lib.rs rename to src/test/app/wasm_fixtures/sp1/src/lib.rs diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp deleted file mode 100644 index ec91496428c..00000000000 --- a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.cpp +++ /dev/null @@ -1,10330 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -// TODO: consider moving these to separate files (and figure out the build) - -#include - -extern std::string const fibWasmHex = - "0061736d0100000001090260000060017f017f0303020001071b02115f5f" - "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" - "01017f200045044041000f0b2000410348044041010f0b200041026a2100" - "0340200041036b100120016a2101200041026b220041044a0d000b200141" - "016a0b"; - -extern std::string const b58WasmHex = - "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" - "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" - "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" - "617465000106655f6461746103000a6465616c6c6f636174650002076235" - "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" - "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" - "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" - "200220066a2d00000d012003200641016a2206470d000b200321060b2003" - "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" - "480d00200741016a220a410771210541002104200741074f0440200a41f8" - "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" - "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" - "200541016b22050d000b0b200320064a0440200621052007210403402002" - "20056a2d0000210802402004220a20074e0440200721042008450d010b20" - "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" - "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" - "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" - "200741016a22022103410021040240200c4100480d000340200420096a2d" - "00000d012002200441016a2204470d000b200221040b2001200320066a20" - "046b4a047f02402006450d002006410771210841002105200641084f0440" - "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" - "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" - "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" - "0420076a410171047f200405200020066a200420096a2d00004180086a2d" - "00003a0000200641016a2106200441016a0b210520042007460d00200520" - "096a2101200720056b2102200020066a2103417f21040340200320046a22" - "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" - "026a200541026a2d00004180086a2d00003a00002002200441026a220447" - "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" - "41000b0b0b4101004180080b3a3132333435363738394142434445464748" - "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" - "707172737475767778797a00490f7461726765745f666561747572657304" - "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - -extern std::string const sha512PureWasmHex = - "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" - "05040001020305030100020607017f0041800d0b075006066d656d6f7279" - "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" - "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" - "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" - "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" - "06211620014180016d41016bac210b41808d02290300210c41888d022903" - "00210d41908d02290300210e41988d02290300210f41a08d022903002110" - "41a88d02290300211141b08d02290300211241b88d022903002113034041" - "002101200c21092013210a201221082011210520102103200f2115200e21" - "06200d2102034020022107200120166a200020016a290000220242388620" - "024280fe0383422886842002428080fc0783421886200242808080f80f83" - "4208868484200242088842808080f80f832002421888428080fc07838420" - "024228884280fe03832002423888848484220237030020014180086a2903" - "00200a200322044232892004422e89852004421789857c2008220a200442" - "7f858320052208200483847c7c20027c2203200922024224892002421e89" - "85200242198985200220072006221485832006200783857c7c2109200320" - "157c2103200421052006211520072106200141086a2201418001470d000b" - "200020016a21004180092117411e210103402002210620162001410e6b41" - "0f714103746a221820182903002016200141056b410f714103746a290300" - "20162001410d6b410f714103746a2903002202423f892002423889852002" - "420788857c7c20162001410f714103746a2903002202422d892002420389" - "852002420688857c22023703002017290300200a20032205423289200542" - "2e89852005421789857c2005427f852008832004200583847c7c20027c22" - "03200922024224892002421e898520024219898520022006200785832006" - "200783857c7c2109200320147c2103201741086a21172008210a20042108" - "200521042007211420062107200141016a220141de00470d000b41b88d02" - "200a20137c221337030041b08d02200820127c221237030041a88d022004" - "20117c221137030041a08d02200320107c221037030041988d02200f2014" - "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" - "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" - "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" - "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" - "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" - "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" - "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" - "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" - "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" - "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" - "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" - "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" - "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" - "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" - "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" - "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" - "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" - "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" - "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" - "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" - "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" - "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" - "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" - "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" - "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" - "7065732b0a6d756c746976616c7565"; - -extern std::string const zkProofWasmHex = - "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" - "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" - "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" - "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" - "030505030206020601000006010606070303080202020302090208020202" - "030a0806020a030b06060202030302020303030203030203020202010302" - "030203060a02000202080a020c0807010d02030206060102020803080302" - "030202020a02060303020a03020301010a0d030101010001010301020604" - "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" - "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" - "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" - "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" - "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" - "4020010d00410021010c010b2002450d01200120026e2203200320026c20" - "01476a21010b2000200136020820004101360204200020013602000f0b10" - "8180808000000b4701017f23808080800041206b22002480808080002000" - "41003602182000410136020c200041e090c0800036020820004204370210" - "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" - "808080000b170002402000450d002001200020026c108d808080000b0b0e" - "002000200141011083808080000b0f002000200141a0021083808080000b" - "0e002000200141201083808080000b4201017f0240200028020822032000" - "280200470d00200020021088808080000b2000280204200341e8006c6a20" - "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" - "800041106b2202248080808000200241086a20002000280200410141e800" - "108b80808000024020022802082200418180808078460d00200020022802" - "0c2001108c80808000000b200241106a2480808080000b6401027f238080" - "80800041106b2203248080808000200341086a20024101410141f081c080" - "00108a8080800020032802082104200328020c2001200210868180800021" - "01200020023602082000200136020420002004360200200341106a248080" - "8080000b6401017f23808080800041106b2205248080808000200541046a" - "200120022003108e8080800020052802082103024020052802040d002000" - "200528020c36020420002003360200200541106a2480808080000f0b2003" - "200528020c2004108c80808000000bfd0102037f017e2380808080004110" - "6b22052480808080004100210602400240200220036a22032002490d0020" - "0441076a417871ad2001280200220741017422022003200220034b1b2202" - "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" - "074b0d01024002402007450d00024020040d00200541086a4108200210d7" - "80808000200528020821040c020b2001280204200720046c200210cb8080" - "800021040c010b20054108200210d780808000200528020021040b024020" - "040d00410821060c020b2001200336020020012004360204418180808078" - "21060b0b2000200236020420002006360200200541106a2480808080000b" - "1200024020000d00200210cf808080000b000b6c01027f02400240200041" - "7c6a2802002202417871220341044108200241037122021b20016a490d00" - "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" - "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" - "10ca80808000000bc70103017f017e017f23808080800041106b22042480" - "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" - "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" - "200236020841002102200041003602040c020b200441086a2002200310d7" - "80808000024020042802082206450d002000200636020820002001360204" - "410021020c020b2000200336020820002002360204410121020c010b2000" - "4100360204410121020b20002002360200200441106a2480808080000b88" - "0303017f097e017f23808080800041306b22022480808080002002420042" - "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" - "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" - "20012903482209842001290350220a842001290358220b8450220c1b3703" - "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" - "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" - "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" - "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" - "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" - "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" - "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" - "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" - "80808000200020014130108681808000200c3a0060200241306a24808080" - "80000b9e0101027e20002002290328200129032822048542002003ad42ff" - "01837d220583200485370328200020022903202001290320220485200583" - "200485370320200020022903182001290318220485200583200485370318" - "200020022903102001290310220485200583200485370310200020022903" - "082001290308220485200583200485370308200020022903002001290300" - "2204852005832004853703000bec0201057f23808080800041c0006b2202" - "248080808000410121030240200128021c2204418082c080004111200128" - "0220220528020c220611808080800080808080000d000240024020012d00" - "144104710d0041012103200441fa8ec08000410120061180808080008080" - "8080000d02200141e091c080004102109280808000450d010c020b200441" - "fb8ec080004102200611808080800080808080000d014101210320024101" - "3a0017200241186a41086a200141086a290200370300200241186a41106a" - "200141106a290200370300200241186a41186a200141186a280200360200" - "2002200536020c20022004360208200241dc8ec080003602382002200129" - "02003703182002200241176a3602102002200241086a360234200241186a" - "41e091c0800041021092808080000d01200241086a41f88ec08000410210" - "93808080000d010b200441ec8cc080004101200611808080800080808080" - "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" - "200028020022032000280208220472450d0002402004410171450d002001" - "20026a210502400240200028020c22060d0041002107200121080c010b41" - "00210741002109200121080340200822042005460d020240024020042c00" - "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" - "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" - "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" - "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" - "2007450d00024020072002490d0020072002460d01410021040c020b2001" - "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" - "21022004200120041b21010b024020030d00200028021c20012002200028" - "022028020c11808080800080808080000f0b2000280204210a0240200241" - "10490d0020022001200141036a417c7122076b22096a220b410371210341" - "00210641002104024020012007460d004100210402402009417c4b0d0041" - "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" - "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" - "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" - "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" - "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" - "4a6a21060b200b4102762105200620046a21060340200721032005450d04" - "200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002003200d41f007716a210941002108200321040340" - "200428020c2207417f734107762007410676724181828408712004280208" - "2207417f7341077620074106767241818284087120042802042207417f73" - "41077620074106767241818284087120042802002207417f734107762007" - "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" - "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" - "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" - "fc01714102746a22082802002204417f7341077620044106767241818284" - "08712104200c4101460d0220082802042207417f73410776200741067672" - "41818284087120046a2104200c4102460d0220082802082208417f734107" - "7620084106767241818284087120046a21040c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d004100210641002109" - "0c010b41002106200121042002410c71220921070340200620042c000041" - "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" - "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" - "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" - "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" - "200028022028020c11808080800080808080000f0b200441087641ff811c" - "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" - "20064d0d00200a20066b2105024002400240410020002d00182204200441" - "03461b22040e03020001020b20052104410021050c010b20054101762104" - "200541016a41017621050b200441016a2104200028021021092000280220" - "2108200028021c210703402004417f6a2204450d02200720092008280210" - "1181808080008080808000450d000b41010f0b200028021c200120022000" - "28022028020c11808080800080808080000f0b0240200720012002200828" - "020c1180808080008080808000450d0041010f0b41002104034002402005" - "2004470d0020052005490f0b200441016a21042007200920082802101181" - "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" - "7f6a21032000280204210420002802002105200028020821064100210741" - "002108410021094100210a02400340200a4101710d010240024020092002" - "4b0d000340200120096a210a0240024002400240200220096b220b41074b" - "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" - "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" - "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" - "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" - "828408200c41046a2802002200418a94a8d000736b200072714180818284" - "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" - "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" - "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" - "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" - "0000410a460d01200b200041016a2200470d000b200221090c030b200020" - "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" - "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" - "000b0b20082002460d024101210a2008210d200221000b0240024020062d" - "0000450d00200541f48ec080004104200428020c11808080800080808080" - "000d010b200020086b210b4100210c024020002008460d00200320006a2d" - "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" - "200b200428020c1180808080008080808000450d010b0b410121070b2007" - "0ba80101017f23808080800041306b220424808080800020042003360208" - "20042002360204200420012d00c80122033a000f024020034101460d0020" - "04420137021c200441013602142004419482c08000360210200441818080" - "800036022c2004200441286a3602182004200441046a3602282004410f6a" - "41c886c08000200441106a419c82c08000109680808000000b2000200141" - "c8011086818080001a200441306a2480808080000b140020012000280200" - "20002802041092808080000b4401017f23808080800041106b2204248080" - "8080002004200136020c20042000360208200441086a41b886c080002004" - "410c6a41b886c080002002200310d380808000000ba70101017f23808080" - "800041306b22042480808080002004200336020820042002360204200420" - "012d006822033a000f024020034101460d002004420137021c2004410136" - "02142004419482c08000360210200441818080800036022c200420044128" - "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" - "419c82c08000109680808000000b2000200141e8001086818080001a2004" - "41306a2480808080000b45000240024020042003490d0020022004490d01" - "2000200420036b3602042000200120036a3602000f0b2003200420051099" - "80808000000b200420022005109a80808000000b0f0020002001200210fc" - "80808000000b0f0020002001200210f580808000000b4001017f23808080" - "800041106b2201248080808000200141086a200041014101419883c08000" - "108a80808000200128020c2100200141106a24808080800020000b9a0101" - "017f23808080800041b0016b2202248080808000200241086a2001280204" - "20012802084100413041a883c080001098808080000240200228020c4130" - "460d00200241106a41b883c08000109d80808000000b20024180016a2002" - "28020841301089818080001a200241106a20024180016a109e8080800020" - "00200241106a41c883c080004118109780808000200241b0016a24808080" - "80000b970101017f23808080800041c0006b22022480808080002002412b" - "36020c200241f880c08000360208200241e880c080003602142002200036" - "02102002410236021c200241cc8ec0800036021820024202370224200241" - "8280808000ad422086200241106aad843703382002418380808000ad4220" - "86200241086aad843703302002200241306a360220200241186a200110a4" - "80808000000ba50801077f23808080800041c0086b220224808080800020" - "012d0000220341077610a3808080002104200341067641017110a3808080" - "002105200341057641017110a3808080002106200241a0066a2001413010" - "86818080001a200220022d00a006411f713a00a006200241e8006a200241" - "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" - "026a200241b0076a200241e8006a20022d00980122071090808080002002" - "4190056a10a8808080002002200520047110a380808000200610d2808080" - "007110a380808000200241c0026a10a9808080007110a38080800022013a" - "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" - "0020024180046a200241a0066a200241c0026a10a780808000200241e007" - "6a20024180046a418089c0800010b98080800020024180046a200241e007" - "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" - "00200241a0066a200241e0076a10db808080002103200241f0026a200241" - "80046a41301086818080001a200220033a00a00320024100413010858180" - "800022024190086a2002200241f0026a2003109080808000200241a0066a" - "20024190086a10b28080800020024180046a41306a20024190086a200241" - "a0066a200620024190086a10de808080007310a380808000109080808000" - "20024180046a200241c0026a41301086818080001a20032004200510d280" - "8080007110a3808080007110a3808080002103200241a0066a2002418004" - "6a41e0001086818080001a200220033a008807200220053a008007200241" - "d0016a20024190056a200241a0066a200810aa8080800020022007200120" - "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" - "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" - "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" - "8080800020024180046a20024190056a10e480808000200241f0026a2002" - "4180046a10e58080800020024190056a200241e8001086818080001a2002" - "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" - "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" - "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" - "8080800020024190086a200241f0026a41306a200510a780808000200241" - "80046a200241a0066a41306a200110a7808080002003200110a980808000" - "2201200510a98080800022057110a380808000200110d280808000200510" - "d2808080007110a380808000200241b0076a200241e0076a10db80808000" - "7110a38080800020024190086a20024180046a10db808080007110a38080" - "80007210a3808080007110a38080800021052000200241e8001086818080" - "0020053a0068200241c0086a2480808080000b970101017f238080808000" - "41c0026b2203248080808000200341086a20012002410041e00041e083c0" - "80001098808080000240200328020c41e000460d00200341106a41f083c0" - "8000109d80808000000b200341e0016a200328020841e000108981808000" - "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" - "004118109480808000200341c0026a2480808080000bff1d02137f017e23" - "808080800041a0276b220224808080800020012d0000220341077610a380" - "8080002104200341067641017110a3808080002105200341057641017110" - "a380808000210620024180106a200141301086818080001a200220022d00" - "8010411f713a008010200241a0216a20024180106a10dc80808000200241" - "80226a200141306a10dc80808000200241e01f6a41004130108581808000" - "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" - "80800020022d00b0222101200241c0206a410041301085818080001a2002" - "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" - "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" - "2002200520047110a380808000200610d2808080007110a3808080002002" - "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" - "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" - "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" - "c0800010bc80808000200241c0236a10e08080800021032002410041e000" - "108581808000220220033a0060200310d2808080002109200241a0246a20" - "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" - "ba8080800020024180256a20024180106a200241c0236a10b38080800020" - "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" - "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" - "30108681808000210a200241d0016a41306a410041301085818080001a20" - "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" - "016a10e28080800020024180256a200241c0266a10c28080800021032002" - "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" - "10d280808000210b200a41004130108581808000210320024180106a41e0" - "86c0800041301086818080001a20024180076a20024180256a2002418010" - "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" - "0020024180106a20024198036a200241e0256a10b3808080002002410110" - "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" - "da80808000200241c00b6a410041e0001085818080001a20024198036a20" - "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" - "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" - "8080007110a380808000210a20024180106a20024198036a41e000108681" - "8080001a2002200a3a00e01020024180076a200220024180106a200910da" - "808080002002410041e00010858180800022024198036a20022002418007" - "6a20022d00e007220910b08080800020024180106a20024198036a10e280" - "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" - "024198036a41306a220a10de80808000200a10a98080800020024198036a" - "10de808080007110a3808080007210a3808080007310a38080800010b080" - "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" - "0510d2808080007110a3808080007110a380808000210420024180106a20" - "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" - "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" - "0420022d00a80f220573410020086b712005737110a38080800021012002" - "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" - "6a280000360000200220022800890d3600c9012002200120077110a38080" - "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" - "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" - "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" - "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" - "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" - "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" - "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" - "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" - "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" - "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" - "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" - "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" - "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" - "4180106a200241e0046a41301086818080001a20024180076a2002418010" - "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" - "80106a200241e0046a41e0006a220141301086818080001a20024180076a" - "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" - "066a10b28080800020024180106a200241e0046a41c0016a220541301086" - "818080001a20024180076a41c0016a20024180106a41e000108681808000" - "210e2003410041301085818080001a20024180106a41e086c08000413010" - "86818080001a200241a0096a410041e0001085818080001a200241a0096a" - "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" - "6a410041e000108581808000210a200241c0266a41306a210f2002418010" - "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" - "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" - "8080a080e9002115024003402015500d01200241e0196a200110ba808080" - "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" - "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" - "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" - "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" - "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" - "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" - "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" - "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" - "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" - "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" - "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" - "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" - "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" - "0241a0246a41e00010868180800021082014200241c0206a41e000108681" - "8080002107200f410041301085818080001a200241c0266a41e086c08000" - "41301086818080001a20024180106a410041e0001085818080001a201020" - "0241c0266a41e00010868180800021042012410041e00010858180800021" - "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" - "b080808000200b20082004200310b080808000201320072006200310b080" - "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" - "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" - "024180136a2009200110b380808000200241e0136a200a200510b3808080" - "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" - "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" - "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" - "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" - "09200a10bc8080800020024180196a2001200510bc80808000200241e019" - "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" - "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" - "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" - "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" - "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" - "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" - "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" - "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" - "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" - "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" - "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" - "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" - "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" - "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" - "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" - "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" - "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" - "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" - "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" - "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" - "818080001a20024180106a200241a0096a41e0001086818080001a200241" - "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" - "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" - "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" - "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" - "0110e08080800022017110a380808000200510d280808000200110d28080" - "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" - "80808000200241e00d6a20024180106a10c2808080007110a38080800072" - "10a380808000200c7110a38080800021012000200241d0016a41c8011086" - "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" - "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" - "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" - "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" - "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" - "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" - "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" - "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" - "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" - "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" - "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" - "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" - "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" - "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" - "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" - "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" - "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" - "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" - "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" - "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" - "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" - "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" - "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" - "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" - "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" - "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" - "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" - "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" - "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" - "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" - "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" - "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" - "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" - "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" - "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" - "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" - "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" - "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" - "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" - "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" - "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" - "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" - "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" - "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" - "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" - "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" - "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" - "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" - "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" - "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" - "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" - "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" - "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" - "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" - "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" - "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" - "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" - "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" - "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" - "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" - "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" - "066a41e0006a41e000108980808000200041980f6a20002802900f200028" - "02940f109f80808000200041e4106a2000419c086a41e000108980808000" - "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" - "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" - "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" - "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" - "900110898080800020004194156a41086a22014100360200200042808080" - "80800137029415200041d0066a200028028c152202200028029015220341" - "004130418084c08000109880808000200041a0156a20002802d006200028" - "02d406108980808000200041b0156a200041a0156a109c80808000200041" - "94156a200041b0156a419084c08000108780808000200041c8066a200220" - "03413041e00041a084c08000109880808000200041b0156a20002802c806" - "20002802cc0610898080800020002802a01520002802a415108480808000" - "200041a0156a41086a2204200041b0156a41086a22052802003602002000" - "20002902b0153703a015200041b0156a200041a0156a109c808080002000" - "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" - "200341e00041900141c084c08000109880808000200041b0156a20002802" - "c00620002802c40610898080800020002802a01520002802a41510848080" - "800020042005280200360200200020002902b0153703a015200041b0156a" - "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" - "108780808000200041c81c6a200128020036020020002000290294153703" - "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" - "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" - "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" - "818080002107200041901a6a200041c8126a41e8001086818080001a2000" - "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" - "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" - "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" - "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" - "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" - "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" - "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" - "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" - "0002400240024002400240024020002802a4684101470d00200041b8066a" - "20002802a8684108412041d880c08000108a80808000200041003602c85b" - "200020002802bc0622033602c45b200020002802b80622023602c05b2000" - "41f8326a41c0004120108080808000024020002802fc324101470d004100" - "21050240200220002802803322014f0d00200041b0066a200041c0db006a" - "410020014120108b8080800020002802b0062202418180808078470d0520" - "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" - "746a210341c000210103402001450d03200041b0046a2002290000220942" - "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" - "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" - "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" - "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" - "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" - "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" - "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" - "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" - "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" - "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" - "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" - "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" - "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" - "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" - "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" - "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" - "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" - "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" - "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" - "00420010878180800020004180046a20002903f005220f20002903c00422" - "10200041b0046a41086a2903007c22117c22122000290390047c22132000" - "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" - "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" - "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" - "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" - "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" - "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" - "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" - "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" - "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" - "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" - "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" - "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" - "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" - "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" - "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" - "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" - "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" - "2903e0047c220f2000290390067c221420004180066a41086a2903002011" - "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" - "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" - "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" - "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" - "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" - "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" - "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" - "8000200041d0036a41086a290300211d20004180056a41086a290300211e" - "200041d0056a41086a290300211f200041a0066a41086a29030021202000" - "2903e00521212000290390052122200029038003212320004180036a4108" - "6a290300212420004190036a41086a290300212520004190056a41086a29" - "03002126200041e0056a41086a290300212720002903a005212820002903" - "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" - "026a41086a290300212c200020002903d002222d200041e0046a41086a29" - "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" - "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" - "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" - "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" - "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" - "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" - "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" - "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" - "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" - "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" - "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" - "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" - "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" - "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" - "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" - "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" - "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" - "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" - "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" - "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" - "41f8326a10a28080800020002903a068210e20002903a868211220002903" - "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" - "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" - "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" - "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" - "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" - "0021042000411836028457200041a585c0800036028057200020043a00c0" - "52200441ff01714101470d04200341186a200d370300200341106a201337" - "0300200341086a20123703002003200e370300200341206a210320054101" - "6a210520022001412020014120491b22046a2102200120046b21010c000b" - "0b2000410036028833200041013602fc32200041d085c080003602f83220" - "00420437028033200041f8326a41d880c0800010a480808000000b200041" - "0036028833200041013602fc32200041d085c080003602f8322000420437" - "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" - "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" - "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" - "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" - "6a2134200041a0dc006a2135410021040340024020042005470d00200041" - "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" - "410041301085818080001a200041c0db006a200041a0e8006a200041f832" - "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" - "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" - "41c0db006a10a7808080002000410010a3808080003a008069200041f832" - "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" - "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" - "80800020004188256a200710ab8080800020004198256a200810ab808080" - "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" - "808000200041c0376a200041801f6a108f80808000200041803c6a200041" - "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" - "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" - "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" - "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" - "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" - "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" - "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" - "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" - "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" - "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" - "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" - "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" - "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" - "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" - "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" - "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" - "64410374210120002802c064210320002802c8642130024003402001450d" - "01200328020422042d000c20032802002d00607210a38080800021022000" - "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" - "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" - "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" - "10b0808080002037203a2039200210b08080800020004180d7006a203120" - "08200210b080808000203420072006200210b08080800020332032203520" - "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" - "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" - "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" - "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" - "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" - "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" - "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" - "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" - "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" - "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" - "41301086818080001a200041c0db006a41306a2201200041b8256a419001" - "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" - "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" - "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" - "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" - "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" - "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" - "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" - "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" - "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" - "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" - "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" - "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" - "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" - "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" - "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" - "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" - "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" - "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" - "41e0036a41301086818080001a200041f8326a410041301085818080001a" - "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" - "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" - "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" - "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" - "0041f8326a10b3808080002005410041301085818080002133200042ba8a" - "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" - "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" - "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" - "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" - "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" - "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" - "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" - "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" - "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" - "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" - "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" - "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" - "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" - "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" - "b28080800020004180ce006a200041f8326a41301086818080001a200041" - "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" - "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" - "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" - "41301086818080001a200041a0e8006a410041301085818080001a200042" - "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" - "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" - "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" - "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" - "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" - "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" - "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" - "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" - "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" - "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" - "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" - "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" - "80800020004180ce006a200041f8326a4180036a22414130108681808000" - "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" - "326a41e0036a224241301086818080001a200041a0e8006a410041301085" - "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" - "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" - "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" - "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" - "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" - "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" - "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" - "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" - "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" - "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" - "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" - "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" - "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" - "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" - "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" - "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" - "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" - "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" - "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" - "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" - "4410b280808000200041c0d2006a200841301086818080001a2007200041" - "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" - "41c0016a223a41301086818080001a200041c0db006a4100413010858180" - "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" - "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" - "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" - "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" - "006a200041c0db006a10b380808000200141004130108581808000210120" - "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" - "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" - "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" - "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" - "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" - "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" - "10b28080800020004180c5006a200341301086818080001a2005200041a0" - "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" - "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" - "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" - "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" - "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" - "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" - "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" - "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" - "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" - "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" - "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" - "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" - "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" - "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" - "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" - "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" - "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" - "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" - "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" - "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" - "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" - "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" - "2031203510b28080800020004180c5006a200041c0db006a413010868180" - "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" - "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" - "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" - "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" - "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" - "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" - "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" - "0620004180ce006a20004180d7006a10b380808000200741004130108581" - "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" - "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" - "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" - "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" - "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" - "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" - "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" - "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" - "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" - "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" - "5241301086818080001a20004180d7006a410041301085818080001a2000" - "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" - "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" - "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" - "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" - "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" - "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" - "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" - "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" - "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" - "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" - "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" - "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" - "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" - "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" - "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" - "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" - "01108581808000213820004180d7006a41a0026a225320004180ce006a20" - "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" - "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" - "41301086818080001a200520004180d7006a4190016a10b2808080002000" - "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" - "b28080800020004180ce006a200441301086818080001a200041c0d2006a" - "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" - "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" - "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" - "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" - "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" - "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" - "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" - "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" - "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" - "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" - "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" - "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" - "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" - "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" - "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" - "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" - "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" - "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" - "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" - "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" - "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" - "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" - "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" - "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" - "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" - "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" - "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" - "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" - "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" - "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" - "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" - "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" - "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" - "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" - "b280808000200041803c6a200041c0d2006a41301086818080001a203720" - "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" - "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" - "c0c9006a203441301086818080001a20004180ce006a4100413010858180" - "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" - "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" - "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" - "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" - "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" - "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" - "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" - "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" - "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" - "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" - "41d0026a225a10b280808000200041c0376a205641301086818080001a20" - "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" - "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" - "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" - "301086818080001a20004180ce006a410041301085818080001a200042c1" - "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" - "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" - "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" - "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" - "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" - "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" - "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" - "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" - "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" - "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" - "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" - "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" - "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" - "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" - "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" - "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" - "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" - "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" - "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" - "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" - "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" - "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" - "8080800020004180e0006a41306a2230200041f8326a203310b980808000" - "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" - "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" - "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" - "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" - "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" - "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" - "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" - "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" - "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" - "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" - "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" - "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" - "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" - "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" - "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" - "0020004180d7006a410041301085818080001a200041c0e7006a20004180" - "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" - "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" - "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" - "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" - "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" - "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" - "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" - "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" - "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" - "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" - "0041c0db006a200210b0808080002038203d203c200210b0808080002034" - "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" - "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" - "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" - "86818080001a200020023a00b837200041803c6a410041c0041085818080" - "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" - "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" - "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" - "203e200210b0808080002008200041803c6a4180036a2041200210b08080" - "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" - "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" - "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" - "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" - "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" - "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" - "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" - "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" - "301086818080001a200041a0e8006a410041301085818080001a200042c1" - "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" - "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" - "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" - "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" - "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" - "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" - "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" - "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" - "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" - "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" - "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" - "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" - "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" - "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" - "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" - "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" - "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" - "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" - "006a200041a0e8006a10b380808000203341004130108581808000210620" - "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" - "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" - "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" - "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" - "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" - "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" - "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" - "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" - "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" - "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" - "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" - "98abaaa584073703c05b203c410041c00110858180800021432003200041" - "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" - "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" - "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" - "6a200841301086818080001a2001204510b28080800020004180d7006a20" - "3a41301086818080001a200041c0db006a410041301085818080001a2000" - "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" - "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" - "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" - "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" - "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" - "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" - "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" - "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" - "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" - "001086818080001a2031204710b28080800020004180c5006a2003413010" - "86818080001a2005204810b280808000200041c0c9006a20494130108681" - "8080001a2001204a10b28080800020004180d7006a204b41301086818080" - "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" - "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" - "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" - "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" - "38200041c0c9006a200041c0db006a10b380808000203341004130108581" - "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" - "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" - "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" - "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" - "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" - "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" - "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" - "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" - "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" - "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" - "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" - "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" - "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" - "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" - "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" - "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" - "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" - "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" - "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" - "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" - "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" - "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" - "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" - "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" - "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" - "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" - "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" - "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" - "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" - "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" - "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" - "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" - "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" - "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" - "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" - "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" - "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" - "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" - "20004180d7006a200041a0e8006a10b38080800020064100413010858180" - "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" - "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" - "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" - "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" - "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" - "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" - "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" - "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" - "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" - "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" - "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" - "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" - "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" - "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" - "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" - "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" - "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" - "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" - "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" - "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" - "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" - "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" - "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" - "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" - "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" - "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" - "410041c001108581808000213d200320004180d7006a200041c0db006a10" - "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" - "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" - "001a2036204410b280808000200041c0e4006a200841301086818080001a" - "2001204510b28080800020004180d7006a203a41301086818080001a2000" - "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" - "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" - "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" - "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" - "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" - "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" - "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" - "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" - "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" - "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" - "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" - "204710b280808000200041c0e7006a200341301086818080001a20302048" - "10b28080800020004180e0006a204941301086818080001a2001204a10b2" - "8080800020004180d7006a204b41301086818080001a200041c0db006a41" - "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" - "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" - "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" - "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" - "41c0db006a10b3808080002033410041301085818080002133200042ba8a" - "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" - "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" - "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" - "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" - "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" - "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" - "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" - "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" - "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" - "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" - "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" - "8407370380572007410041c00110858180800021072032200041c0e4006a" - "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" - "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" - "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" - "301086818080001a2036204d10b280808000200041c0e4006a203b413010" - "86818080001a20004180d7006a410041301085818080001a200042c18e8e" - "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" - "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" - "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" - "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" - "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" - "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" - "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" - "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" - "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" - "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" - "306a204e10b280808000200041e0e6006a203241301086818080001a2006" - "204f10b280808000200041c0e7006a205041301086818080001a20362051" - "10b280808000200041c0e4006a205241301086818080001a20004180d700" - "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" - "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" - "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" - "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" - "20004180d7006a10b3808080002001410041301085818080002101200042" - "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" - "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" - "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" - "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" - "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" - "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" - "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" - "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" - "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" - "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" - "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" - "aaa584073703c0642037410041c00110858180800021372053200041a0e2" - "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" - "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" - "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" - "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" - "b28080800020004180d7006a203841301086818080001a2033205810b280" - "808000200041c0db006a203441301086818080001a200041a0e8006a4100" - "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" - "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" - "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" - "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" - "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" - "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" - "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" - "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" - "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" - "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" - "004180e0006a205641301086818080001a2005205b10b280808000200041" - "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" - "006a205e41301086818080001a200041a0e8006a41004130108581808000" - "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" - "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" - "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" - "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" - "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" - "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" - "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" - "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" - "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" - "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" - "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" - "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" - "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" - "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" - "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" - "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" - "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" - "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" - "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" - "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" - "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" - "80800020004180d7006a205441301086818080001a203320004180c5006a" - "41f0016a10b280808000200041c0db006a205541301086818080001a2000" - "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" - "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" - "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" - "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" - "80d7006a200041a0e8006a10b38080800020344100413010858180800021" - "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" - "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" - "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" - "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" - "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" - "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" - "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" - "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" - "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" - "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" - "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" - "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" - "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" - "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" - "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" - "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" - "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" - "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" - "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" - "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" - "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" - "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" - "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" - "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" - "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" - "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" - "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" - "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" - "200510b28080800020004180e0006a200041a0e8006a4130108681808000" - "1a2036204410b280808000200041c0e4006a200841301086818080001a20" - "01204510b28080800020004180d7006a203a41301086818080001a200041" - "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" - "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" - "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" - "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" - "e4006a200041c0db006a10b3808080002033410041301085818080002104" - "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" - "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" - "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" - "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" - "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" - "b280808000200041c0e7006a200341301086818080001a2030204810b280" - "80800020004180e0006a204941301086818080001a2001204a10b2808080" - "0020004180d7006a204b41301086818080001a200041c0db006a41004130" - "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" - "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" - "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" - "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" - "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" - "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" - "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" - "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" - "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" - "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" - "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" - "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" - "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" - "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" - "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" - "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" - "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" - "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" - "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" - "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" - "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" - "00200020023a00a068024020024101470d00200041a0e8006a200041f829" - "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" - "200041f8326a10c2808080002008203f10c2808080007110a38080800020" - "3a204010c2808080007110a3808080002003203e10c28080800020492041" - "10c2808080007110a380808000204b204210c2808080007110a380808000" - "7110a380808000210220002802a82520002802ac25108580808000200028" - "029825200028029c25108580808000200028028825200028028c25108580" - "80800020002802f82420002802fc24108580808000202f202e1086808080" - "0020002802c01c20002802c41c10828080800020002802a01520002802a4" - "15108480808000200028028815200028028c1510848080800020002802b4" - "1320002802b81310848080800020002802bc1220002802c0121084808080" - "0020002802e41020002802e810108480808000200028028c0f2000280290" - "0f10848080800020002802940e20002802980e108480808000200028029c" - "0d20002802a00d108480808000200241ff017141004721020c080b200041" - "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" - "109680808000000b200041c0c0006a200041b8256a203610b48080800020" - "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" - "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" - "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" - "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" - "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" - "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" - "006a10b7808080002005200041c0db006a41a0021086818080001a200041" - "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" - "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" - "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" - "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" - "8180800020004180026a200942004285b087cd8081f69c33420010878180" - "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" - "00200041e0016a200029039002220e20022903087c220b200041a0026a41" - "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" - "7e220942004281808080704200108781808000200041d0016a2009420042" - "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" - "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" - "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" - "29038002221220022903107c220a20004190026a41086a290300200b200e" - "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" - "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" - "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" - "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" - "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" - "4200108781808000200041f0006a20002903b001221020002903f0012211" - "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" - "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" - "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" - "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" - "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" - "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" - "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" - "f3004200108781808000200041a0016a41086a290300210d200041306a41" - "086a290300210f200029039001211720002903502114200041d0006a4108" - "6a2903002115200020002903602216200041f0016a41086a290300200e20" - "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" - "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" - "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" - "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" - "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" - "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" - "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" - "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" - "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" - "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" - "200041a0e8006a200041f8326a10a280808000200020002903b868370398" - "4e200020002903b0683703904e200020002903a8683703884e2000200029" - "03a0683703804e200041c0db006a410041301085818080001a2035410041" - "301085818080001a203441e086c0800041301086818080001a4101210220" - "0041013602e052200041003602d452200041003602c852200020333602c4" - "52200020004180ce006a3602c05203400240024020020d00200041086a20" - "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" - "0041003602e0520240024020002802c852450d00200041286a2002203210" - "c58080800020002802280d01200028022c21020b024020002802c0522201" - "450d0020002802c45221030340024020032001470d00200020033602c452" - "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" - "0041206a2002203210c580808000024020002802200d0020002802242102" - "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" - "52450d00200041186a2002203110c58080800020002802180d0120002802" - "1c21020b41002103200041003602d45220020d010b200041106a200041c0" - "d2006a10c48080800020002d0011210120002d001021030b024020034101" - "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" - "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" - "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" - "326a200110c880808000200041c0db006a200041a0e8006a419001108681" - "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" - "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" - "c78080800020004180236a200041f8326a4190011086818080001a200441" - "016a21040c000b0b2000420137028433200041013602fc322000419482c0" - "80003602f83220004181808080003602a4682000200041a0e8006a360280" - "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" - "f8326a419c82c08000109680808000000b200220002802b40641b092c080" - "00108c80808000000b202f202e10868080800020002802c01c20002802c4" - "1c10828080800020002802a01520002802a4151084808080002000280288" - "15200028028c1510848080800020002802b41320002802b8131084808080" - "0020002802bc1220002802c01210848080800020002802e41020002802e8" - "10108480808000200028028c0f20002802900f1084808080002000280294" - "0e20002802980e108480808000200028029c0d20002802a00d1084808080" - "00410021020b200041e0ec006a24808080800020020ba60201087e200020" - "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" - "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" - "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" - "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" - "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" - "54ad7c427f7c220242818080807083220720037c22083703002000200242" - "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" - "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" - "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" - "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" - "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" - "8080808000200241013b010c200220013602082002200036020420024104" - "6a10f380808000000b6501017f23808080800041306b2202248080808000" - "200041306a200141306a41301086818080001a200041e0006a41e086c080" - "00200241004130108581808000220220012d006010908080800020002001" - "41301086818080001a200241306a2480808080000b25002000200141f087" - "c0800010df808080002000200110a98080800010d2808080003a00300be7" - "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" - "200229030022044200200129030022054200108781808000200341d0046a" - "20022903082206420020054200108781808000200341e0046a2002290310" - "2207420020054200108781808000200341f0046a20022903182208420020" - "05420010878180800020034180056a200229032022094200200542001087" - "8180800020034190056a2002290328220a42002005420010878180800020" - "0341a0056a20012903082205420020044200108781808000200341f0056a" - "2005420020064200108781808000200341c0066a20054200200742001087" - "8180800020034190076a2005420020084200108781808000200341e0076a" - "2005420020094200108781808000200341b0086a20054200200a42001087" - "81808000200341b0056a2001290310220542002004420010878180800020" - "034180066a2005420020064200108781808000200341d0066a2005420020" - "074200108781808000200341a0076a200542002008420010878180800020" - "0341f0076a2005420020094200108781808000200341c0086a2005420020" - "0a4200108781808000200341c0056a200129031822054200200442001087" - "8180800020034190066a2005420020064200108781808000200341e0066a" - "2005420020074200108781808000200341b0076a20054200200842001087" - "8180800020034180086a2005420020094200108781808000200341d0086a" - "20054200200a4200108781808000200341d0056a20012903202205420020" - "044200108781808000200341a0066a200542002006420010878180800020" - "0341f0066a2005420020074200108781808000200341c0076a2005420020" - "08420010878180800020034190086a200542002009420010878180800020" - "0341e0086a20054200200a4200108781808000200341e0056a2001290328" - "2205420020044200108781808000200341b0066a20054200200642001087" - "8180800020034180076a2005420020074200108781808000200341d0076a" - "2005420020084200108781808000200341a0086a20054200200942001087" - "81808000200341f0086a20054200200a4200108781808000200341b0046a" - "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" - "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" - "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" - "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" - "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" - "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" - "10878180800020034190046a200341b0046a41086a290300200520032903" - "b00422047c200454ad7c220720032903a0047c220520032903a005220820" - "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" - "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" - "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" - "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" - "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" - "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" - "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" - "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" - "20032903b0037c220520032903f005220d200341d0046a41086a29030020" - "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" - "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" - "7c220a20034190046a41086a290300200329039004220420067c200454ad" - "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" - "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" - "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" - "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" - "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" - "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" - "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" - "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" - "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" - "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" - "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" - "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" - "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" - "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" - "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" - "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" - "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" - "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" - "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" - "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" - "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" - "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" - "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" - "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" - "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" - "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" - "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" - "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" - "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" - "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" - "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" - "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" - "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" - "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" - "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" - "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" - "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" - "06201154ad7c22192003290390027c221120034180036a41086a29030020" - "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" - "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" - "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" - "032903607c220520034180056a41086a290300200d201354ad7c22172003" - "290390057c221020032903e0077c221220034190076a41086a290300200f" - "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" - "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" - "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" - "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" - "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" - "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" - "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" - "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" - "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" - "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" - "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" - "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" - "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" - "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" - "03002122200341b0086a41086a290300212320032903c008212420032903" - "8008212520032903c0072126200329038007212720032903d00221282003" - "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" - "076a41086a290300212b200341c0076a41086a290300212c20034180086a" - "41086a290300212d200341c0086a41086a290300212e20032903d008212f" - "200329039008213020032903d007213120032903e0012132200341e0016a" - "41086a290300213320032903f0012134200341f0016a41086a2903002135" - "20034180026a41086a2903002136200341d0076a41086a29030021372003" - "4190086a41086a2903002138200341d0086a41086a290300213920032903" - "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" - "00213d200329038001213e20034180016a41086a290300213f2003290390" - "01214020034190016a41086a2903002141200341a0016a41086a29030021" - "42200341a0086a41086a2903002143200341e0086a41086a290300214420" - "032903f008214520032903002146200341086a2903002147200329031021" - "48200341106a41086a29030021492003290320214a200341206a41086a29" - "0300214b2003290330214c200341306a41086a290300214d200320032903" - "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" - "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" - "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" - "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" - "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" - "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" - "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" - "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" - "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" - "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" - "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" - "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" - "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" - "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" - "1a370380092003204c204020342028202720262025202420232004204f54" - "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" - "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" - "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" - "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" - "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" - "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" - "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" - "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" - "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" - "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" - "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" - "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" - "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" - "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" - "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" - "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" - "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" - "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" - "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" - "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" - "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" - "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" - "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" - "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" - "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" - "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" - "b0096a2480808080000b3701017f20004100413010858180800021004101" - "10a3808080002101200041306a41e086c0800041301086818080001a2000" - "20013a00600b3a01017f23808080800041306b2201248080808000200020" - "0141004130108581808000220110db808080002100200141306a24808080" - "800020000b42002000200120022003109080808000200041306a20014130" - "6a200241306a2003109080808000200020022d006020012d006022027341" - "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" - "808080800020012d00c0012103410021042002410010a3808080003a0088" - "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" - "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" - "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" - "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" - "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" - "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" - "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" - "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" - "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" - "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" - "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" - "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" - "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" - "a3f9753703c80120022001200241c8016a200310d980808000200241c005" - "6a200210e880808000200241c8016a41c400410841a002108e8080800020" - "022802cc0121010240024020022802c8014101460d0020022802d0012105" - "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" - "026a200241c8011086818080002106200241003602b805200220053602b4" - "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" - "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" - "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" - "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" - "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" - "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" - "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" - "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" - "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" - "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" - "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" - "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" - "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" - "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" - "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" - "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" - "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" - "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" - "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" - "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" - "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" - "00200241a0156a20024180166a200241e0076a10bb808080002005200241" - "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" - "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" - "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" - "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" - "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" - "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" - "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" - "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" - "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" - "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" - "e2808080002008200241e0166a200241e0166a10bc808080002007200241" - "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" - "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" - "022802b80522013602e016200141c400470d01200020033a000c2000200b" - "290200370200200041086a200b41086a280200360200200241c0176a2480" - "808080000f0b200120022802d00141888cc08000108c80808000000b2002" - "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" - "7f2380808080004180036b2201248080808000200141a0026a41306a4100" - "41301085818080001a200141a0026a41e086c0800041301086818080001a" - "2001200141a0026a41e000108681808000220141e0006a410041c0011085" - "818080001a200041a0026a410041a0021085818080001a2000200141a002" - "1086818080001a20014180036a2480808080000bd70301157f2380808080" - "0041c00d6b2203248080808000200241e0036a210420024180036a210520" - "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" - "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" - "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" - "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" - "c0016a2112200341e0006a21132001280200211420012802082115034002" - "4020090d002001201541016a3602082000200241c0041086818080001a20" - "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" - "607210a380808000211720032002201641046a280200201641086a280200" - "201541cc8cc0800010ae80808000201428020010af808080002003418009" - "6a20032002201710b080808000201120132008201710b080808000201020" - "122007201710b080808000200341a00b6a200f2006201710b08080800020" - "0c200e2005201710b080808000200b200d2004201710b080808000200341" - "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" - "1086818080001a2002200341c0046a41c0041086818080001a200941786a" - "2109201441086a21140c000b0b22000240200120024b0d00200220012003" - "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" - "e00f6b22042480808080002004200241e000108681808000220441e0006a" - "200241e0006a41e0001086818080001a2004200341306a220510dd808080" - "00200441306a200510dd80808000200441e0006a200310dd808080002004" - "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" - "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" - "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" - "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" - "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" - "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" - "1086818080001a20044180066a200441e0006a200410bc80808000200441" - "e0066a2003200110c38080800020044180096a200441e0066a2002200441" - "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" - "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" - "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" - "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" - "e00f6a2480808080000b2700200020012002200310908080800020004130" - "6a200141306a200241306a20031090808080000b30002000200110e28080" - "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" - "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" - "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" - "ffd51e7c2206200420028420012903102207842001290318220884200129" - "03202209842001290328220a845022011b3703082000420042abd5feffff" - "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" - "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" - "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" - "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" - "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" - "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" - "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" - "01057f23808080800041c0016b2203248080808000200341306a22042001" - "41306a220510b280808000200320014130108681808000220341e0006a41" - "306a200241306a220641301086818080002107200341e0006a2002413010" - "86818080001a20002003200341e0006a10e1808080002004200541301086" - "818080001a200320014130108681808000220341e0006a20064130108681" - "8080001a2007200241301086818080001a200041306a2003200341e0006a" - "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" - "41a0086b22032480808080002003200241e0006a220420024190016a2205" - "10b980808000200341306a2004200510b880808000200341e0006a200241" - "c0016a2206200241f0016a220710b98080800020034190016a2006200710" - "b880808000200341e0036a41306a2208200141306a220910b28080800020" - "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" - "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" - "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" - "6a2210200141f0016a221110b280808000200341e0036a20014130108681" - "8080001a20034180066a41306a200241306a221241301086818080002113" - "20034180066a200241301086818080001a20034180066a41e0006a200341" - "90016a4130108681808000211420034180066a4190016a200341e0006a41" - "30108681808000211520034180066a41c0016a200341306a413010868180" - "8000211620034180066a41f0016a200341301086818080002117200341c0" - "016a200341e0036a20034180066a10ea8080800020082009413010868180" - "80002108200b200a41301086818080002118200c200d4130108681808000" - "210b200f200e4130108681808000210f201020114130108681808000210c" - "200341e0036a200141301086818080001a20034180066a20124130108681" - "8080001a20132002413010868180800021102014200341e0006a41301086" - "818080002113201520034190016a41301086818080002114201620034130" - "10868180800021152017200341306a41301086818080002116200341c001" - "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" - "80002018200a41301086818080002117200b200d10b280808000200f200e" - "4130108681808000210f200c201110b280808000200341e0036a20014130" - "1086818080001a20034180066a200441301086818080001a201020054130" - "108681808000211020142012413010868180800021142013200241301086" - "818080002113201520034190016a413010868180800021152016200341e0" - "006a41301086818080002116200341a0026a200341e0036a20034180066a" - "10ea8080800020082009413010868180800021082017200a413010868180" - "80002117200b200d4130108681808000210b200f200e4130108681808000" - "210f200c20114130108681808000210c200341e0036a2001413010868180" - "80001a20034180066a200541301086818080001a20102004413010868180" - "800021102013201241301086818080002113201420024130108681808000" - "21142015200341e0006a41301086818080002115201620034190016a4130" - "1086818080002116200341a0026a41306a200341e0036a20034180066a10" - "ea808080002008200910b2808080002017200a4130108681808000211720" - "0b200d10b280808000200f200e4130108681808000210f200c201110b280" - "808000200341e0036a200141301086818080001a20034180066a20064130" - "1086818080001a2010200741301086818080002110201320044130108681" - "808000211320142005413010868180800021142016201241301086818080" - "002116201520024130108681808000211520034180036a200341e0036a20" - "034180066a10ea808080002008200941301086818080001a2017200a4130" - "1086818080001a200b200d41301086818080001a200f200e413010868180" - "80001a200c201141301086818080001a200341e0036a2001413010868180" - "80001a20034180066a200741301086818080001a20102006413010868180" - "80001a2013200541301086818080001a2014200441301086818080001a20" - "15201241301086818080001a2016200241301086818080001a2003418003" - "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" - "41e000108681808000220241e0006a200341a0026a41e000108681808000" - "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" - "80808080000bb30301027f23808080800041e0066b220224808080800020" - "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" - "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" - "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" - "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" - "6a2003200110b380808000200241e0036a20024180036a20024180036a10" - "bc80808000200241c0046a200110ba8080800020024180066a200241e003" - "6a200241e0036a41306a220110b88080800020024180066a41306a220320" - "0241e0036a200110b980808000200020024180066a200210bc8080800020" - "024180066a200241c0046a200241c0046a41306a220110b8808080002003" - "200241c0046a200110b980808000200041e0006a20024180066a200241c0" - "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" - "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" - "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" - "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" - "80800041e0006b22022480808080002002200141c0016a2203200141f001" - "6a220410b880808000200241306a2003200410b980808000200041c0016a" - "200141e0006a41e0001086818080001a2000200241e00010868180800041" - "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" - "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" - "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" - "0b3601017f23808080800041306b22032480808080002003200210b28080" - "800020002003200110b980808000200341306a2480808080000b87020201" - "7f0c7e23808080800041306b220324808080800020012903082104200229" - "030821052002290328210620012903282107200229032021082001290320" - "21092002290318210a2001290318210b2002290310210c2001290310210d" - "20032002290300220e20012903007c220f3703002003200520047c220420" - "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" - "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" - "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" - "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" - "00200310d680808000200341306a2480808080000b7401027f2380808080" - "004190016b220224808080800020022001200141306a220310b980808000" - "200241306a2001200310b880808000200241e0006a2001200110b9808080" - "0020002002200241306a10a780808000200041306a200241e0006a200310" - "a78080800020024190016a2480808080000b230020002001200210b88080" - "8000200041306a200141306a200241306a10b8808080000b230020002001" - "200210b980808000200041306a200141306a200241306a10b9808080000b" - "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" - "6a200129030822034200200129030022044200108781808000200241d004" - "6a20012903102205420020044200108781808000200241e0046a20012903" - "182206420020044200108781808000200241f0046a200129032022074200" - "2004420010878180800020024180056a2001290328220842002004420010" - "8781808000200241a0056a2005420020034200108781808000200241b005" - "6a2006420020034200108781808000200241c0056a200742002003420010" - "8781808000200241d0056a2008420020034200108781808000200241f005" - "6a200642002005420010878180800020024180066a200742002005420010" - "878180800020024190066a2008420020054200108781808000200241b006" - "6a2007420020064200108781808000200241c0066a200842002006420010" - "8781808000200241e0066a20084200200742001087818080002002419005" - "6a2004420020044200108781808000200241e0056a200342002003420010" - "8781808000200241a0066a2005420020054200108781808000200241d006" - "6a2006420020064200108781808000200241f0066a200742002007420010" - "878180800020024180076a2008420020084200108781808000200241b004" - "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" - "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" - "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" - "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" - "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" - "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" - "00108781808000200241d0036a20024190056a41086a2903002209200229" - "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" - "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" - "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" - "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" - "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" - "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" - "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" - "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" - "220a20022903e005220b20022903d004220c200241c0046a41086a290300" - "7c22074201862008423f88847c22082004200954ad7c2209200229039004" - "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" - "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" - "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" - "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" - "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" - "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" - "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" - "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" - "81808000200241c0026a20022903a003220f200241e0056a41086a290300" - "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" - "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" - "423f88847c22072002290380047c220b20024190046a41086a290300200d" - "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" - "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" - "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" - "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" - "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" - "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" - "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" - "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" - "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" - "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" - "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" - "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" - "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" - "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" - "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" - "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" - "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" - "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" - "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" - "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" - "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" - "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" - "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" - "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" - "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" - "290300200b201054ad7c22182002290380057c220720022903c0057c220e" - "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" - "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" - "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" - "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" - "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" - "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" - "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" - "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" - "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" - "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" - "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" - "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" - "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" - "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" - "200241d0066a41086a290300211920024180066a41086a290300211a2002" - "41d0056a41086a290300211b200229039006211c20022903b006211d2002" - "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" - "03002120200241b0066a41086a290300212120024190066a41086a290300" - "212220022903c006212320022903f006210320022903f0012124200241f0" - "016a41086a2903002125200229038002212620024180026a41086a290300" - "212720024190026a41086a2903002128200241c0066a41086a2903002129" - "20022903e006212a200241f0066a41086a290300212b200229038001212c" - "20024180016a41086a290300212d200229039001212e20024190016a4108" - "6a290300212f20022903a0012130200241a0016a41086a29030021312002" - "41b0016a41086a2903002132200241e0066a41086a290300213320022903" - "8007211120022903102134200241106a41086a2903002135200229032021" - "36200241206a41086a290300213720022903302138200241306a41086a29" - "030021392002290340213a200241c0006a41086a290300213b2002200229" - "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" - "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" - "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" - "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" - "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" - "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" - "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" - "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" - "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" - "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" - "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" - "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" - "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" - "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" - "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" - "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" - "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" - "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" - "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" - "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" - "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" - "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" - "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" - "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" - "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" - "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" - "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" - "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" - "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" - "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" - "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" - "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" - "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" - "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" - "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" - "076a10d680808000200241c0076a2480808080000be60101037f23808080" - "80004180126b220324808080800020032001200210b480808000200341a0" - "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" - "2002200510c380808000200341e0066a2004200110c38080800020034180" - "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" - "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" - "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" - "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" - "20034180126a2480808080000b3c01017f23808080800041c0046b220224" - "808080800020022000200110be808080002000200241c004108681808000" - "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" - "022480808080002002200141e000108681808000220241e0006a200141e0" - "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" - "001086818080001a200241a0026a200141a0026a220541e0001086818080" - "001a20024180036a20014180036a220641e0001086818080001a200241e0" - "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" - "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" - "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" - "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" - "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" - "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" - "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" - "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" - "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" - "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" - "200241a0086a200841e0001086818080001a200241e0006a20024180066a" - "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" - "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" - "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" - "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" - "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" - "808000200241a00b6a41306a200241a0086a200110b98080800020024180" - "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" - "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" - "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" - "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" - "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" - "8080800020024180096a200241e0001086818080001a20024180096a41e0" - "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" - "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" - "86818080001a200820024180036a41e0001086818080001a200241a00b6a" - "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" - "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" - "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" - "8080808000200210ac8080800041002103413f2104034002400240024020" - "04417f460d0042012004413f71ad8642808084808080c080528321052003" - "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" - "8080002000200241a0021086818080001a20024180096a2480808080000f" - "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" - "80001a410121030b02402005500d002002200110bf808080000b2004417f" - "6a21040c000b0b23002000200110db80808000200041306a200141306a10" - "db808080007110a3808080000b3e0020002001200210bc80808000200041" - "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" - "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" - "2202248080808000200141086a21030340200241086a200310e680808000" - "02400240024020022d0008450d0020022d00092101410121040c010b0240" - "20012802002204450d00200420012802042205470d020b2002200141146a" - "10e68080800020022d0001210120022d000021040b200020013a00012000" - "20044101713a0000200241106a2480808080000f0b200142808080808001" - "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" - "23808080800041106b220324808080800041002104410121054100210602" - "400340200120062207460d01200341086a200210d080808000200741016a" - "210620032d00080d000b200120076b2104410021050b2000200436020420" - "002005360200200341106a2480808080000bf50401037f23808080800041" - "b0096b22022480808080002002200141306a220310bd8080800020024130" - "6a2002200210b980808000200241e0006a200241306a200241306a10b980" - "80800020024190016a200241e0006a200241e0006a10b980808000200241" - "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" - "808000200241d0086a200241f0016a200241f0016a10b980808000200241" - "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" - "80096a20024180096a10b980808000200241a0026a200241c0076a200241" - "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" - "80800020024180036a2002200241a0026a10b980808000200241b0036a20" - "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" - "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" - "b980808000200241c0046a200220024190046a10b880808000200241f004" - "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" - "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" - "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" - "024180066a20024180066a10b980808000200241b0066a41306a200241a0" - "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" - "86818080001a200241c0076a410041301085818080001a200241c0076a41" - "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" - "301086818080001a2000200241b0066a200241c0076a200410a980808000" - "10c880808000200241b0096a2480808080000bf60601057f238080808000" - "41900d6b220324808080800020032001200210a780808000200341306a20" - "0141306a2204200241306a220510a780808000200341e0006a200141e000" - "6a2206200241e0006a220710a78080800020034190016a2001200410b980" - "808000200341c0016a2002200510b980808000200341f0016a2003419001" - "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" - "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" - "036a2004200610b980808000200341b0036a2005200710b9808080002003" - "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" - "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" - "90046a10b880808000200341f0046a2001200610b980808000200341a005" - "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" - "a78080800020034180066a2003200341e0006a10b980808000200341b006" - "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" - "b98080800020034190076a200341e0066a200310b980808000200341800c" - "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" - "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" - "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" - "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" - "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" - "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" - "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" - "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" - "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" - "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" - "00200341e0096a200341d0086a20034190076a10a780808000200341900a" - "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" - "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" - "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" - "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" - "2480808080000b41002000200120022003109080808000200041306a2001" - "41306a200241306a2003109080808000200041e0006a200141e0006a2002" - "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" - "280200220241787122006a21030240024020024101710d00200241027145" - "0d012001280200220220006a21000240200120026b2201410028029c97c0" - "8000470d0020032802044103714103470d014100200036029497c0800020" - "032003280204417e7136020420012000410172360204200320003602000f" - "0b2001200210cc808080000b024002400240024002400240200328020422" - "024102710d00200341002802a097c08000460d022003410028029c97c080" - "00460d0320032002417871220210cc808080002001200220006a22004101" - "72360204200120006a20003602002001410028029c97c08000470d014100" - "200036029497c080000f0b20032002417e71360204200120004101723602" - "04200120006a20003602000b2000418002490d0220012000108481808000" - "41002101410041002802b497c08000417f6a22003602b497c0800020000d" - "04024041002802fc94c080002200450d00410021010340200141016a2101" - "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" - "80000f0b410020013602a097c080004100410028029897c0800020006a22" - "0036029897c080002001200041017236020402402001410028029c97c080" - "00470d004100410036029497c080004100410036029c97c080000b200041" - "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" - "02410028029897c0800022054129490d0241f494c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b2001280208" - "21010c000b0b4100200136029c97c080004100410028029497c080002000" - "6a220036029497c0800020012000410172360204200120006a2000360200" - "0f0b200041f80171418495c080006a210302400240410028028c97c08000" - "220241012000410376742200710d004100200220007236028c97c0800020" - "0321000c010b200328020821000b200320013602082000200136020c2001" - "200336020c200120003602080f0b024041002802fc94c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff" - "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" - "c080000b0b4d01017f23808080800041206b220224808080800020024100" - "36021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110a480808000000b800601057f0240" - "024002402000417c6a220328020022044178712205410441082004410371" - "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" - "02410b6a4178712002410b491b210102400240024020060d002001418002" - "490d0120052001410472490d01200520016b418180084f0d010c020b2000" - "41786a220720056a21060240024002400240200520014f0d002006410028" - "02a097c08000460d032006410028029c97c08000460d0220062802042204" - "4102710d042004417871220420056a22052001490d042006200410cc8080" - "8000200520016b22024110490d0120032001200328020041017172410272" - "360200200720016a22012002410372360204200720056a22052005280204" - "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" - "0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210cd8080800020000f0b" - "20032005200328020041017172410272360200200720056a220220022802" - "0441017236020420000f0b410028029497c0800020056a22052001490d01" - "02400240200520016b2202410f4b0d002003200441017120057241027236" - "0200200720056a2202200228020441017236020441002102410021010c01" - "0b20032001200441017172410272360200200720016a2201200241017236" - "0204200720056a2205200236020020052005280204417e713602040b4100" - "200136029c97c080004100200236029497c0800020000f0b410028029897" - "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" - "0f0b20052000417c4178200328020022014103711b20014178716a220120" - "0220012002491b1086818080002102200010c980808000200221000b2000" - "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" - "93c0800010ca80808000000b200320012004410171724102723602002007" - "20016a2202200520016b22054101723602044100200536029897c0800041" - "0020023602a097c0800020000b820301047f200028020c21020240024002" - "402001418002490d002000280218210302400240024020022000470d0020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000" - "2802082201200236020c200220013602080c010b200041146a200041106a" - "20021b21040340200421052001220241146a200241106a20022802142201" - "1b210420024114411020011b6a28020022010d000b200541003602000b20" - "03450d020240200028021c41027441f493c080006a22012802002000460d" - "0020034110411420032802102000461b6a20023602002002450d030c020b" - "2001200236020020020d014100410028029097c08000417e200028021c77" - "7136029097c080000c020b0240200220002802082204460d002004200236" - "020c200220043602080f0b4100410028028c97c08000417e200141037677" - "7136028c97c080000f0b20022003360218024020002802102201450d0020" - "022001360210200120023602180b20002802142201450d00200220013602" - "14200120023602180f0b0ba00401027f200020016a210202400240200028" - "020422034101710d002003410271450d012000280200220320016a210102" - "40200020036b2200410028029c97c08000470d0020022802044103714103" - "470d014100200136029497c0800020022002280204417e71360204200020" - "01410172360204200220013602000c020b2000200310cc808080000b0240" - "024002400240200228020422034102710d00200241002802a097c0800046" - "0d022002410028029c97c08000460d0320022003417871220310cc808080" - "002000200320016a2201410172360204200020016a200136020020004100" - "28029c97c08000470d014100200136029497c080000f0b20022003417e71" - "36020420002001410172360204200020016a20013602000b024020014180" - "02490d00200020011084818080000f0b200141f80171418495c080006a21" - "0202400240410028028c97c08000220341012001410376742201710d0041" - "00200320017236028c97c08000200221010c010b200228020821010b2002" - "20003602082001200036020c2000200236020c200020013602080f0b4100" - "20003602a097c080004100410028029897c0800020016a220136029897c0" - "8000200020014101723602042000410028029c97c08000470d0141004100" - "36029497c080004100410036029c97c080000f0b4100200036029c97c080" - "004100410028029497c0800020016a220136029497c08000200020014101" - "72360204200020016a20013602000f0b0bc12502087f017e024002400240" - "02400240024002400240200041f4014b0d00410028028c97c08000220141" - "102000410b6a41f803712000410b491b220241037622037622004103710d" - "012002410028029497c080004d0d0720000d02410028029097c080002200" - "0d030c070b2000410b6a22034178712102410028029097c080002204450d" - "06411f21050240200041f4ffff074b0d002002410620034108766722006b" - "7641017120004101746b413e6a21050b410020026b210302402005410274" - "41f493c080006a28020022010d0041002100410021060c040b4100210020" - "024100411920054101766b2005411f461b74210741002106034002402001" - "220128020441787122082002490d00200820026b220820034f0d00200821" - "032001210620080d004100210320012106200121000c060b200128021422" - "082000200820012007411d764104716a41106a2802002201471b20002008" - "1b2100200741017421072001450d040c000b0b024002402000417f734101" - "7120036a22074103742200418495c080006a22022000418c95c080006a28" - "020022032802082206460d002006200236020c200220063602080c010b41" - "002001417e2007777136028c97c080000b20032000410372360204200320" - "006a22002000280204410172360204200341086a0f0b0240024020002003" - "7441022003742200410020006b72716822084103742203418495c080006a" - "22062003418c95c080006a28020022002802082207460d00200720063602" - "0c200620073602080c010b41002001417e2008777136028c97c080000b20" - "002002410372360204200020026a2207200320026b220241017236020420" - "0020036a20023602000240410028029497c080002201450d002001417871" - "418495c080006a2106410028029c97c08000210302400240410028028c97" - "c08000220841012001410376742201710d004100200820017236028c97c0" - "8000200621010c010b200628020821010b20062003360208200120033602" - "0c2003200636020c200320013602080b4100200736029c97c08000410020" - "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" - "00220628020441787120026b210320062101024002400340024020062802" - "1022000d00200628021422000d0020012802182105024002400240200128" - "020c22002001470d00200141144110200128021422001b6a28020022060d" - "01410021000c020b20012802082206200036020c200020063602080c010b" - "200141146a200141106a20001b21070340200721082006220041146a2000" - "41106a200028021422061b210720004114411020061b6a28020022060d00" - "0b200841003602000b2005450d030240200128021c41027441f493c08000" - "6a22062802002001460d0020054110411420052802102001461b6a200036" - "02002000450d040c030b2006200036020020000d024100410028029097c0" - "8000417e200128021c777136029097c080000c030b200028020441787120" - "026b22062003200620034922061b21032000200120061b2101200021060c" - "000b0b20002005360218024020012802102206450d002000200636021020" - "0620003602180b20012802142206450d0020002006360214200620003602" - "180b02400240024020034110490d0020012002410372360204200120026a" - "22022003410172360204200220036a2003360200410028029497c0800022" - "07450d012007417871418495c080006a2106410028029c97c08000210002" - "400240410028028c97c08000220841012007410376742207710d00410020" - "0820077236028c97c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200120" - "0320026a2200410372360204200120006a22002000280204410172360204" - "0c010b4100200236029c97c080004100200336029497c080000b20014108" - "6a0f0b024020002006720d004100210641022005742200410020006b7220" - "04712200450d0320006841027441f493c080006a28020021000b2000450d" - "010b0340200020062000280204417871220120026b220820034922051b21" - "04200120024921072008200320051b21080240200028021022010d002000" - "28021421010b2006200420071b21062003200820071b2103200121002001" - "0d000b0b2006450d000240410028029497c0800022002002490d00200320" - "0020026b4f0d010b20062802182105024002400240200628020c22002006" - "470d00200641144110200628021422001b6a28020022010d01410021000c" - "020b20062802082201200036020c200020013602080c010b200641146a20" - "0641106a20001b21070340200721082001220041146a200041106a200028" - "021422011b210720004114411020011b6a28020022010d000b2008410036" - "02000b02402005450d0002400240200628021c41027441f493c080006a22" - "012802002006460d0020054110411420052802102006461b6a2000360200" - "2000450d020c010b2001200036020020000d004100410028029097c08000" - "417e200628021c777136029097c080000c010b2000200536021802402006" - "2802102201450d0020002001360210200120003602180b20062802142201" - "450d0020002001360214200120003602180b0240024020034110490d0020" - "062002410372360204200620026a22002003410172360204200020036a20" - "0336020002402003418002490d00200020031084818080000c020b200341" - "f80171418495c080006a210202400240410028028c97c080002201410120" - "03410376742203710d004100200120037236028c97c08000200221030c01" - "0b200228020821030b200220003602082003200036020c2000200236020c" - "200020033602080c010b2006200320026a2200410372360204200620006a" - "220020002802044101723602040b200641086a0f0b024002400240024002" - "4002400240410028029497c08000220020024f0d000240410028029897c0" - "8000220020024b0d0041002100200241af80046a22064110764000220341" - "7f4622070d0720034110742201450d07410041002802a497c08000410020" - "064180807c7120071b22086a22003602a497c08000410041002802a897c0" - "800022032000200320004b1b3602a897c0800002400240024041002802a0" - "97c080002203450d0041f494c08000210003402000280200220620002802" - "0422076a2001460d02200028020822000d000c030b0b0240024041002802" - "b097c080002200450d00200020014d0d010b410020013602b097c080000b" - "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" - "94c080004100418495c0800036029095c080004100418c95c08000360298" - "95c080004100418495c0800036028c95c080004100419495c080003602a0" - "95c080004100418c95c0800036029495c080004100419c95c080003602a8" - "95c080004100419495c0800036029c95c08000410041a495c080003602b0" - "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" - "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" - "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" - "95c08000410041b495c080003602bc95c080004100410036028095c08000" - "410041c495c080003602d095c08000410041bc95c080003602c495c08000" - "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" - "410041cc95c080003602d495c08000410041d495c080003602e095c08000" - "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" - "410041dc95c080003602e495c08000410041e495c080003602f095c08000" - "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" - "410041ec95c080003602f495c08000410041f495c0800036028096c08000" - "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" - "410041fc95c0800036028496c080004100418496c0800036029096c08000" - "4100418c96c0800036029896c080004100418496c0800036028c96c08000" - "4100419496c080003602a096c080004100418c96c0800036029496c08000" - "4100419c96c080003602a896c080004100419496c0800036029c96c08000" - "410041a496c080003602b096c080004100419c96c080003602a496c08000" - "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" - "410041b496c080003602c096c08000410041ac96c080003602b496c08000" - "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" - "410041c496c080003602d096c08000410041bc96c080003602c496c08000" - "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" - "410041d496c080003602e096c08000410041cc96c080003602d496c08000" - "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" - "410041e496c080003602f096c08000410041dc96c080003602e496c08000" - "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" - "410041f496c0800036028097c08000410041ec96c080003602f496c08000" - "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" - "410020013602a097c08000410041fc96c0800036028497c0800041002008" - "41586a220036029897c0800020012000410172360204200120006a412836" - "0204410041808080013602ac97c080000c080b200320014f0d0020062003" - "4b0d00200028020c450d030b410041002802b097c0800022002001200020" - "01491b3602b097c08000200120086a210641f494c0800021000240024002" - "400340200028020022072006460d01200028020822000d000c020b0b2000" - "28020c450d010b41f494c080002100024003400240200028020022062003" - "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" - "410020013602a097c080004100200841586a220036029897c08000200120" - "00410172360204200120006a4128360204410041808080013602ac97c080" - "002003200641606a41787141786a22002000200341106a491b2207411b36" - "020441002902f494c080002109200741106a41002902fc94c08000370200" - "20072009370208410020083602f894c08000410020013602f494c0800041" - "00200741086a3602fc94c080004100410036028095c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072003460d07" - "20072007280204417e713602042003200720036b22004101723602042007" - "200036020002402000418002490d00200320001084818080000c080b2000" - "41f80171418495c080006a210602400240410028028c97c0800022014101" - "2000410376742200710d004100200120007236028c97c08000200621000c" - "010b200628020821000b200620033602082000200336020c200320063602" - "0c200320003602080c070b200020013602002000200028020420086a3602" - "04200120024103723602042007410f6a41787141786a2206200120026a22" - "006b2103200641002802a097c08000460d032006410028029c97c0800046" - "0d040240200628020422024103714101470d0020062002417871220210cc" - "80808000200220036a2103200620026a220628020421020b20062002417e" - "7136020420002003410172360204200020036a2003360200024020034180" - "02490d00200020031084818080000c060b200341f80171418495c080006a" - "210202400240410028028c97c08000220641012003410376742203710d00" - "4100200620037236028c97c08000200221030c010b200228020821030b20" - "0220003602082003200036020c2000200236020c200020033602080c050b" - "4100200020026b220336029897c08000410041002802a097c08000220020" - "026a22063602a097c0800020062003410172360204200020024103723602" - "04200041086a21000c060b410028029c97c0800021030240024020002002" - "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" - "20032000410372360204200320006a220020002802044101723602040c01" - "0b4100200636029497c080004100200320026a220136029c97c080002001" - "2006410172360204200320006a2006360200200320024103723602040b20" - "0341086a0f0b2000200720086a360204410041002802a097c08000220041" - "0f6a417871220341786a22063602a097c080004100200020036b41002802" - "9897c0800020086a22036a41086a220136029897c0800020062001410172" - "360204200020036a4128360204410041808080013602ac97c080000c030b" - "410020003602a097c080004100410028029897c0800020036a2203360298" - "97c08000200020034101723602040c010b4100200036029c97c080004100" - "410028029497c0800020036a220336029497c08000200020034101723602" - "04200020036a20033602000b200141086a0f0b41002100410028029897c0" - "8000220320024d0d004100200320026b220336029897c080004100410028" - "02a097c08000220020026a22063602a097c0800020062003410172360204" - "20002002410372360204200041086a0f0b20000b4301017f238080808000" - "41206b2201248080808000200141003602182001410136020c200141d085" - "c0800036020820014204370210200141086a200010a480808000000b4e01" - "037f024020012802042202200128020822034e0d0020012003417f6a2204" - "36020820012802002d000020044107717641017110a38080800021040b20" - "0020043a0001200020022003483a00000b18002001200085220042002000" - "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" - "0202017f017e23808080800041f0006b2206248080808000200620013602" - "0c2006200036020820062003360214200620023602102006410236021c20" - "0641c08dc08000360218024020042802000d002006410336025c200641f4" - "8dc08000360258200642033702642006418280808000ad42208622072006" - "41106aad8437034820062007200641086aad843703402006418380808000" - "ad422086200641186aad843703382006200641386a360260200641d8006a" - "200510a480808000000b200641206a41106a200441106a29020037030020" - "0641206a41086a200441086a290200370300200620042902003703202006" - "410436025c200641a88ec080003602582006420437026420064182808080" - "00ad4220862207200641106aad8437035020062007200641086aad843703" - "482006418480808000ad422086200641206aad8437034020064183808080" - "00ad422086200641186aad843703382006200641386a360260200641d800" - "6a200510a480808000000bb30301037f2380808080004180016b22022480" - "8080800020002802002100024002400240200128021422034110710d0020" - "03412071450d0120002d0000210341810121000340200220006a417e6a20" - "03410f712204413072200441376a2004410a491b3a0000200341ff017122" - "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" - "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" - "00210341810121000340200220006a417e6a2003410f7122044130722004" - "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" - "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" - "810120006b10d58080800021000c010b024002400240024020002d000022" - "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" - "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" - "0d01200321040b200220006a20044130723a00000c010b41012100200220" - "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" - "0041037310d58080800021000b20024180016a24808080800020000bb605" - "01087f20002802142205410171220620046a21070240024020054104710d" - "00410021010c010b0240024020020d00410021080c010b02402002410371" - "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" - "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" - "8080c40020061b2106024020002802000d000240200028021c220a200028" - "0220220820062001200210f480808000450d0041010f0b200a2003200420" - "0828020c11808080800080808080000f0b02400240024002402000280204" - "220a20074b0d00200028021c220a2000280220220820062001200210f480" - "808000450d0141010f0b2005410871450d01200028021021052000413036" - "021020002d0018210b4101210c200041013a0018200028021c2208200028" - "0220220920062001200210f4808080000d02200a20076b41016a210a0240" - "0340200a417f6a220a450d01200841302009280210118180808000808080" - "8000450d000b41010f0b0240200820032004200928020c11808080800080" - "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" - "0a20032004200828020c1180808080008080808000210c0c010b200a2007" - "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" - "01020b2005210a410021050c010b2005410176210a200541016a41017621" - "050b200a41016a210a2000280210210720002802202108200028021c2109" - "02400340200a417f6a220a450d0120092007200828021011818080800080" - "80808000450d000b41010f0b4101210c2009200820062001200210f48080" - "80000d00200920032004200828020c11808080800080808080000d004100" - "210a034002402005200a470d0020052005490f0b200a41016a210a200920" - "0720082802101181808080008080808000450d000b200a417f6a2005490f" - "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" - "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" - "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" - "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" - "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" - "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" - "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" - "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" - "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" - "83420020057d2205200e83843703282000200c2002832005200d83843703" - "202000200a2002832005200b838437031820002008200283200520098384" - "370310200020062002832005200783843703082000200320028320052004" - "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" - "80800021010b20002002360204200020013602000b5a01017f2380808080" - "0041106b2202248080808000200241086a20002000280200410141a00210" - "8b80808000024020022802082200418180808078460d002000200228020c" - "2001108c80808000000b200241106a2480808080000b4800200020012002" - "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" - "80808000200020022d00c00120012d00c001220273410020036b71200273" - "3a00c0010b2b00200020012002200310b080808000200020022d00602001" - "2d0060220273410020036b712002733a00600b8501002000290300200129" - "030010d1808080002000290308200129030810d1808080007110a3808080" - "002000290310200129031010d1808080007110a380808000200029031820" - "0129031810d1808080007110a3808080002000290320200129032010d180" - "8080007110a3808080002000290328200129032810d1808080007110a380" - "8080000bda0602017f067e23808080800041306b22022480808080002002" - "2001290000220342388620034280fe0383422886842003428080fc078342" - "1886200342808080f80f834208868484200342088842808080f80f832003" - "421888428080fc07838420034228884280fe038320034238888484842204" - "37032820022001290008220342388620034280fe03834228868420034280" - "80fc0783421886200342808080f80f834208868484200342088842808080" - "f80f832003421888428080fc07838420034228884280fe03832003423888" - "848484220537032020022001290010220342388620034280fe0383422886" - "842003428080fc0783421886200342808080f80f83420886848420034208" - "8842808080f80f832003421888428080fc07838420034228884280fe0383" - "2003423888848484220637031820022001290018220342388620034280fe" - "0383422886842003428080fc0783421886200342808080f80f8342088684" - "84200342088842808080f80f832003421888428080fc0783842003422888" - "4280fe038320034238888484842207370310200220012900202203423886" - "20034280fe0383422886842003428080fc0783421886200342808080f80f" - "834208868484200342088842808080f80f832003421888428080fc078384" - "20034228884280fe03832003423888848484220837030820022001290028" - "220342388620034280fe0383422886842003428080fc0783421886200342" - "808080f80f834208868484200342088842808080f80f8320034218884280" - "80fc07838420034228884280fe0383200342388884848422033703002002" - "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" - "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" - "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" - "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" - "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" - "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" - "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" - "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" - "3010868180800020013a0030200241306a2480808080000b3901017f2380" - "8080800041306b220224808080800020022000200110a780808000200020" - "0241301086818080001a200241306a2480808080000b9b1602017f177e23" - "808080800041a0056b2201248080808000200141b0046a20002903002202" - "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" - "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" - "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" - "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" - "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" - "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" - "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" - "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" - "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" - "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" - "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" - "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" - "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" - "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" - "0129039004220720002903107c2208200141a0046a41086a290300200520" - "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" - "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" - "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" - "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" - "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" - "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" - "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" - "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" - "200129038004220b20002903187c220420014190046a41086a2903002008" - "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" - "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" - "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" - "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" - "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" - "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" - "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" - "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" - "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" - "6a20012903b002220d20012903f003220e20002903207c22062001418004" - "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" - "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" - "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" - "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" - "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" - "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" - "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" - "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" - "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" - "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" - "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" - "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" - "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" - "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" - "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" - "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" - "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" - "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" - "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" - "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" - "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" - "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" - "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" - "808000200141b0016a41086a290300210d20014190026a41086a29030021" - "0e200141f0026a41086a2903002111200141086a290300211220012903e0" - "022113200129038002211420012903a001211520012903402116200141c0" - "006a41086a2903002117200120012903502218200141e0036a41086a2903" - "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" - "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" - "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" - "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" - "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" - "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" - "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" - "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" - "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" - "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" - "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" - "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" - "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" - "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" - "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" - "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" - "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" - "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" - "20012903207c2202200141306a41086a2903002006200454ad7c20082006" - "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" - "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" - "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" - "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" - "f0046a10d68080800020012903c004220342aad580808080a080237c2003" - "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" - "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" - "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" - "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" - "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" - "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" - "423f872203200320012903e80422057c2203200554ad7c200342b399809a" - "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" - "2100200141a0056a24808080800020000bb60103037f017e017f23808080" - "800041e0006b2203248080808000200341e086c080004130108681808000" - "2104200241306a21050240034020052002460d01200541786a2205290300" - "2106413f210303402003417f460d01200441306a200410bd808080002004" - "200441306a41301086818080002107024020062003413f71ad8842018350" - "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" - "301086818080001a200441e0006a2480808080000b1c00200010a9808080" - "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" - "7e017f027e23808080800041f0016b220324808080800041002104420021" - "05420021064200210742002108420021094200210a02400340200441054b" - "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" - "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" - "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" - "200441e8006a2903004200200f420010878180800020034190016a200441" - "f0006a2903004200200f420010878180800020034180016a200441f8006a" - "2903004200200f4200108781808000200341f0006a20044180016a290300" - "4200200f4200108781808000200341e0006a20044188016a290300420020" - "0f4200108781808000200d200341e0006a41086a29030020032903602210" - "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" - "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" - "01221020087c2209201054ad7c200920034190016a41086a290300200329" - "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" - "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" - "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" - "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" - "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" - "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" - "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" - "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" - "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" - "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" - "bdc4801a4200108781808000200d200341086a2903002003290300221020" - "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" - "097c220a201054ad7c200a200341206a41086a2903002003290320221020" - "087c2209201054ad7c2009200341306a41086a2903002003290330221020" - "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" - "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" - "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" - "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" - "2003200a3703e801200320093703e001200320083703d801200320073703" - "d001200320063703c801200320053703c0012000200341c0016a10d68080" - "8000200341f0016a2480808080000b1c002000200110b280808000200041" - "306a200141306a10b2808080000be20103037f017e017f23808080800041" - "c0016b2203248080808000200341306a410041301085818080001a200341" - "e086c0800041301086818080002104200241306a21050240034020052002" - "460d01200541786a22052903002106413f210303402003417f460d012004" - "41e0006a200410ba808080002004200441e0006a41e00010868180800021" - "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" - "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" - "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" - "000b900202017f017e23808080800041b0036b2202248080808000200241" - "004130108581808000220241e0006a410041301085818080001a20024130" - "6a41e086c0800041301086818080001a20024190016a2001419001108681" - "8080001a42808082808080a080e90021030240034020034200510d012002" - "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" - "011086818080001a02402003420183500d00200241a0026a200220024190" - "016a10c7808080002002200241a0026a4190011086818080001a0b200342" - "018821030c000b0b200241a0026a200210e58080800020002002200241a0" - "026a41900110868180800022024190011086818080001a200241b0036a24" - "80808080000b3400200041306a200141306a10b280808000200041e0006a" - "200141e0006a41301086818080001a2000200141301086818080001a0b6b" - "01037f23808080800041106b22022480808080000240024020012802000d" - "00410021030c010b200241086a200110d0808080004101210320022d0009" - "210420022d00080d0041002103200141003602000b200020043a00012000" - "20033a0000200241106a2480808080000b7501027f23808080800041e000" - "6b2201248080808000200141306a410041301085818080001a200141e086" - "c0800041301086818080002101410110a38080800021022000410041e000" - "108581808000220041e0006a200141e0001086818080001a200020023a00" - "c001200141e0006a2480808080000b920101017f23808080800041c0016b" - "2202248080808000200041e0006a200141e0006a41e0001086818080001a" - "200241306a410041301085818080001a200241e086c08000413010868180" - "8000220241e0006a410041e0001085818080001a200041c0016a20022002" - "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" - "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" - "24808080800020042001200210b380808000200441e0006a200141e0006a" - "2205200310b38080800020044180036a200141c0016a2206200310b38080" - "8000200441a0026a20044180036a20044180036a41306a220710b8808080" - "00200441a0026a41306a20044180036a200710b9808080002000200441a0" - "026a200410bc80808000200441a0026a2002200310bc8080800020044180" - "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" - "10b38080800020044180036a200441c0016a200410bb80808000200041e0" - "006a20044180036a200441e0006a10bb8080800020044180036a20062002" - "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" - "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" - "8080800041f0016b22032480808080004100210442002105420021064200" - "210742002108420021094200210a02400340200441054b0d012004200441" - "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" - "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" - "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" - "03004200200f420010878180800020034190016a200441b0026a29030042" - "00200f420010878180800020034180016a200441b8026a2903004200200f" - "4200108781808000200341f0006a200441c0026a2903004200200f420010" - "8781808000200341e0006a200441c8026a2903004200200f420010878180" - "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" - "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" - "1054ad7c200a20034180016a41086a290300200329038001221020087c22" - "09201054ad7c200920034190016a41086a29030020032903900122102007" - "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" - "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" - "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" - "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" - "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" - "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" - "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" - "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" - "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" - "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" - "8781808000200d200341086a29030020032903002210200a7c220f201054" - "ad7c200f200341106a41086a2903002003290310221020097c220a201054" - "ad7c200a200341206a41086a2903002003290320221020087c2209201054" - "ad7c2009200341306a41086a2903002003290330221020077c2208201054" - "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" - "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" - "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" - "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" - "01200320093703e001200320083703d801200320073703d0012003200637" - "03c801200320053703c0012000200341c0016a10d680808000200341f001" - "6a2480808080000bdc0101027f2380808080004180036b22032480808080" - "002003200110ba80808000200341e0006a200210ba80808000200341c001" - "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" - "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" - "808000200341c0016a2001200210bc80808000200341a0026a200341c001" - "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" - "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" - "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" - "41e0006b220224808080800020022000200110bb808080002000200241e0" - "001086818080001a200241e0006a2480808080000b9f0701037f23808080" - "800041a0116b2201248080808000200141a0026a200010ba808080002001" - "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" - "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" - "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" - "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" - "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" - "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" - "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" - "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" - "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" - "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" - "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" - "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" - "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" - "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" - "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" - "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" - "00210220014180096a200141e0036a200141e0036a10bc80808000200141" - "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" - "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" - "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" - "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" - "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" - "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" - "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" - "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" - "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" - "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" - "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" - "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" - "0010ee80808000200141a0116a2480808080000b4201017f024020002802" - "0822032000280200470d002000200210d8808080000b2000280204200341" - "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" - "7f23808080800041106b2202248080808000200241988cc0800036020c20" - "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" - "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" - "0324808080800020032001360204200320003602002003410236020c2003" - "41a08dc08000360208200342023702142003418580808000ad4220862204" - "2003ad8437032820032004200341046aad843703202003200341206a3602" - "10200341086a200210a480808000000b0f002000280200200110f2808080" - "000be10201067f23808080800041106b2202248080808000410a21030240" - "024020004190ce004f0d00200021040c010b410a21030340200241066a20" - "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" - "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" - "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" - "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" - "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" - "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" - "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" - "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" - "03417f6a22036a20004130723a00000b200141014100200241066a20036a" - "410a20036b10d5808080002100200241106a24808080800020000b380201" - "7f017e23808080800041106b220124808080800020002902002102200120" - "0036020c20012002370204200141046a108181808000000b490002402002" - "418080c400460d002000200220012802101181808080008080808000450d" - "0041010f0b024020030d0041000f0b200020032004200128020c11808080" - "800080808080000b7902017f017e23808080800041306b22032480808080" - "0020032001360204200320003602002003410236020c2003419c91c08000" - "360208200342023702142003418580808000ad4220862204200341046aad" - "84370328200320042003ad843703202003200341206a360210200341086a" - "200210a480808000000b1c0020002802002001200028020428020c118180" - "80800080808080000b14002001200028020020002802041092808080000b" - "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" - "800041306b22032480808080002003200136022c20032000360228200341" - "033a00242003422037021c41002104200341003602142003410036020c02" - "400240024002400240200228021022050d00200228020c2200450d012002" - "280208220120004103746a21062000417f6a41ffffffff017141016a2104" - "2002280200210003400240200041046a2802002207450d00200328022820" - "002802002007200328022c28020c11808080800080808080000d040b2001" - "2802002003410c6a200141046a28020011818080800080808080000d0320" - "0041086a2100200141086a22012006470d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" - "2109200228020021004100210703400240200041046a2802002201450d00" - "200328022820002802002001200328022c28020c11808080800080808080" - "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" - "00003a00242003200141186a2802003602202001410c6a28020021064100" - "210a4100210b024002400240200141086a2802000e03010002010b200641" - "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" - "210b0b200320063602102003200b36020c200141046a2802002106024002" - "40024020012802000e03010002010b2006410374210b2009200b6a220b28" - "02000d01200b28020421060b4101210a0b200320063602182003200a3602" - "142009200141146a2802004103746a22012802002003410c6a200141046a" - "28020011818080800080808080000d02200041086a21002008200741206a" - "2207470d000b0b200420022802044f0d0120032802282002280200200441" - "03746a22012802002001280204200328022c28020c118080808000808080" - "8000450d010b410121010c010b410021010b200341306a24808080800020" - "010b6001027f20002802042102200028020021030240200028020822002d" - "0000450d00200341f48ec080004104200228020c11808080800080808080" - "00450d0041010f0b20002001410a463a0000200320012002280210118180" - "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" - "017f017e23808080800041306b2203248080808000200320013602042003" - "20003602002003410236020c200341d091c0800036020820034202370214" - "2003418580808000ad4220862204200341046aad84370328200320042003" - "ad843703202003200341206a360210200341086a200210a480808000000b" - "ab0201037f2380808080004180016b220224808080800020002802002100" - "024002400240200128021422034110710d0020034120710d012000280200" - "200110f28080800021000c020b2000280200210041810121030340200220" - "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" - "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" - "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" - "0b2000280200210041810121030340200220036a417e6a2000410f712204" - "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" - "042000410476210020040d000b200141fd8ec080004102200220036a417f" - "6a41810120036b10d58080800021000b20024180016a2480808080002000" - "0b0900200041003602000b990101027f23808080800041106b2204248080" - "808000410041002802f093c08000220541016a3602f093c0800002402005" - "4100480d000240024041002d00bc97c080000d00410041002802b897c080" - "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" - "41086a200020011182808080008080808000000b410041003a00bc97c080" - "002002450d00108081808000000b000b0300000b0b002000108281808000" - "000bba0101037f23808080800041106b2201248080808000200028020022" - "0228020c2103024002400240024020022802040e020001020b20030d0141" - "012102410021030c020b20030d0020022802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c200141868080" - "8000200028020822002d000820002d000910ff80808000000b2001200336" - "0204200120023602002001418780808000200028020822002d000820002d" - "000910ff80808000000b0c00200020012902003703000bc30201047f411f" - "21020240200141ffffff074b0d002001410620014108766722026b764101" - "7120024101746b413e6a21020b200042003702102000200236021c200241" - "027441f493c080006a21030240410028029097c080004101200274220471" - "0d0020032000360200200020033602182000200036020c20002000360208" - "4100410028029097c0800020047236029097c080000f0b02400240024020" - "0328020022042802044178712001470d00200421020c010b200141004119" - "20024101766b2002411f461b742103034020042003411d764104716a4110" - "6a22052802002202450d0220034101742103200221042002280204417871" - "2001470d000b0b20022802082203200036020c2002200036020820004100" - "3602182000200236020c200020033602080f0b2005200036020020002004" - "3602182000200036020c200020003602080baa0301057f02400240200241" - "104f0d00200021030c010b02402000410020006b41037122046a22052000" - "4d0d002004417f6a21062000210302402004450d00200421072000210303" - "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" - "490d000340200320013a0000200341076a20013a0000200341066a20013a" - "0000200341056a20013a0000200341046a20013a0000200341036a20013a" - "0000200341026a20013a0000200341016a20013a0000200341086a220320" - "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" - "41ff017141818284086c2107034020052007360200200541046a22052003" - "490d000b0b200241037121020b02402003200320026a22074f0d00200241" - "7f6a2104024020024107712205450d000340200320013a0000200341016a" - "21032005417f6a22050d000b0b20044107490d000340200320013a000020" - "0341076a20013a0000200341066a20013a0000200341056a20013a000020" - "0341046a20013a0000200341036a20013a0000200341026a20013a000020" - "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" - "7f02400240200241104f0d00200021030c010b02402000410020006b4103" - "7122046a220520004d0d002004417f6a2106200021032001210702402004" - "450d002004210820002103200121070340200320072d00003a0000200741" - "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" - "40200320072d00003a0000200341016a200741016a2d00003a0000200341" - "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" - "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" - "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" - "3a0000200741086a2107200341086a22032005470d000b0b200520022004" - "6b2208417c7122066a210302400240200120046a22074103710d00200520" - "034f0d0120072101034020052001280200360200200141046a2101200541" - "046a22052003490d000c020b0b200520034f0d0020074103742202411871" - "21042007417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220047620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20084103712102200720066a21010b" - "02402003200320026a22054f0d002002417f6a2108024020024107712207" - "450d000340200320012d00003a0000200141016a2101200341016a210320" - "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" - "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" - "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" - "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" - "00003a0000200341076a200141076a2d00003a0000200141086a21012003" - "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" - "2205200142ffffffff0f8322067e22072003422088220820067e22062005" - "200142208822097e7c22054220867c220a3703002000200820097e200520" - "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" - "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" - "026a2103200020026a210420024110490d014100200441037122056b2106" - "02402004417c71220720044f0d002005417f6a21080240024020050d0020" - "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" - "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" - "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" - "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" - "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" - "09417c7122026b2104410020026b210a02400240200320066a2203410371" - "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" - "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" - "002003410374220241187121052003417c712208417c6a2101410020026b" - "41187121062008280200210203402007417c6a2207200220067420012802" - "002202200576723602002001417c6a210120042007490d000b0b20094103" - "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" - "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" - "20002104200121070240200a450d00200a21032000210420012107034020" - "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" - "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" - "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" - "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" - "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" - "0441076a200741076a2d00003a0000200741086a2107200441086a220420" - "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" - "0a6a22074103710d00200920044f0d012007210103402009200128020036" - "0200200141046a2101200941046a22092004490d000c020b0b200920044f" - "0d0020074103742202411871210a2007417c71220841046a210141002002" - "6b411871210620082802002102034020092002200a762001280200220220" - "067472360200200141046a2101200941046a22092004490d000b0b200341" - "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" - "03024020024107712207450d000340200420012d00003a0000200141016a" - "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" - "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" - "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" - "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" - "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" - "00200141086a2101200441086a22042009470d000c020b0b200420026b22" - "0720044f0d002002417f6a2109024020024103712201450d000340200441" - "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" - "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" - "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" - "00002004417c6a220420012d00003a00002001417c6a210120072004490d" - "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" - "000be8132f72757374632f34656231363132353065333430633866343866" - "3636653262393239656634613562656437633138312f6c6962726172792f" - "636f72652f7372632f697465722f7472616974732f6974657261746f722e" - "72730000100058000000b307000009000000000000000000000001000000" - "0800000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f72757374632f346562313631" - "323530653334306338663438663636653262393239656634613562656437" - "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" - "73000000a30010004a000000a10000001900000054727946726f6d536c69" - "63654572726f720000000100000000000000d80210005e000000b4020000" - "090000002f72757374632f34656231363132353065333430633866343866" - "3636653262393239656634613562656437633138312f6c6962726172792f" - "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" - "0000f6050000150000007372632f6c69622e727300008c0110000a000000" - "1f000000160000008c0110000a00000028000000310000008c0110000a00" - "000028000000440000004661696c656420746f20646573657269616c697a" - "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" - "0000440000008c0110000a000000620000001f0000008c0110000a000000" - "630000000a0000008c0110000a00000064000000170000008c0110000a00" - "0000650000000a0000008c0110000a00000066000000170000008c011000" - "0a000000670000000a0000004661696c656420746f20646573657269616c" - "697a6520614661696c656420746f20646573657269616c697a6520624661" - "696c656420746f20646573657269616c697a652063496e76616c69642062" - "7974657320666f72205363616c61726361706163697479206f766572666c" - "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" - "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" - "65732e696f2d313934396366386336623562353537662f737562746c652d" - "322e362e312f7372632f6c69622e72730000000000000400000004000000" - "0900000001000000d80210005e000000bd0200000900000000000000fdff" - "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" - "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" - "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" - "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" - "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" - "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" - "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" - "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" - "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" - "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" - "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" - "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" - "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" - "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" - "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" - "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" - "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" - "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" - "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" - "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" - "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" - "34396366386336623562353537662f626c7331325f3338312d302e382e30" - "2f7372632f70616972696e67732e72730000a00510006600000016020000" - "1500000044000000a0051000660000001b02000009000000a00510006600" - "0000050200001d000000a005100066000000090200001d000000a0051000" - "660000003802000032000000a00510006600000044020000320000002969" - "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" - "20206275742074686520696e64657820697320006d061000200000008d06" - "1000120000000000000004000000040000000a0000003d3d617373657274" - "696f6e20606c6566742020726967687460206661696c65640a20206c6566" - "743a200a2072696768743a200000c206100010000000d206100017000000" - "e90610000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000c2061000100000000c071000100000001c07100009000000" - "e9061000090000003a200000010000000000000048071000020000000000" - "00000c000000040000000b0000000c0000000d000000202020202c0a2828" - "0a3078303030313032303330343035303630373038303931303131313231" - "333134313531363137313831393230323132323233323432353236323732" - "383239333033313332333333343335333633373338333934303431343234" - "333434343534363437343834393530353135323533353435353536353735" - "383539363036313632363336343635363636373638363937303731373237" - "333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939617474656d7074" - "20746f20646976696465206279207a65726f4708100019000000206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820" - "72616e676520656e6420696e6465782000008a0810001000000068081000" - "22000000736c69636520696e646578207374617274732061742020627574" - "20656e64732061742000ac08100016000000c20810000d00000028292f72" - "757374632f34656231363132353065333430633866343866363665326239" - "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" - "7372632f7261775f7665632e72730000e20810004c000000280200001100" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" - "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" - "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" - "4009100029000000a804000009000000617373657274696f6e206661696c" - "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" - "616400004009100029000000ae0400000d00000000c94e046e616d65000e" - "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" - "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" - "4d6170244c5424492443244624475424247532302461732475323024636f" - "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" - "657261746f72244754243973697a655f68696e7431376833383630386236" - "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" - "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" - "5f62795f7a65726f3137683033346433623765633138373166373545024d" - "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" - "247761736d5f6c69622e2e566572696679696e674b657924475424313768" - "393064303131346662343063613937644503475f5a4e35616c6c6f633772" - "61775f7665633230526177566563496e6e6572244c542441244754243130" - "6465616c6c6f636174653137683235303163353461663065323831336145" - "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" - "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" - "5424313768663462323737666433376462353031654505565f5a4e34636f" - "726533707472353264726f705f696e5f706c616365244c5424626c733132" - "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" - "313768623964653634383231343939353539344506675f5a4e34636f7265" - "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" - "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" - "2e5363616c61722447542424475424313768376265333235646130373238" - "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" - "244324412447542434707573683137686236356465366561306165303964" - "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" - "244c54245424432441244754243867726f775f6f6e653137686531306535" - "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" - "395f244c5424696d706c2475323024247535622454247535642424475424" - "36746f5f76656331376836333665656464383765653761373437450a4d5f" - "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" - "4c542441244754243136776974685f63617061636974795f696e31376861" - "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" - "775f7665633230526177566563496e6e6572244c54244124475424313467" - "726f775f616d6f7274697a65643137686439353064656131373163323030" - "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" - "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" - "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" - "633230526177566563496e6e6572244c5424412447542431357472795f61" - "6c6c6f636174655f696e3137686534626630623334333637646136646345" - "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" - "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" - "6974682e2e4e656724475424336e65673137683434323138626332316532" - "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" - "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" - "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" - "696f6e616c5f73656c656374313768386165306466613830666434313139" - "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" - "46726f6d536c6963654572726f72247532302461732475323024636f7265" - "2e2e666d742e2e44656275672447542433666d7431376863303634386262" - "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" - "747465723370616431376833316663303133336231396665333065451367" - "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" - "2e50616441646170746572247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376834353537" - "3732653638643462343039364514385f5a4e36737562746c65313743744f" - "7074696f6e244c5424542447542436657870656374313768623863663632" - "323139313530313333334515495f5a4e34345f244c542424524624542475" - "32302461732475323024636f72652e2e666d742e2e446973706c61792447" - "542433666d74313768353633396538653836623831393165364516355f5a" - "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" - "64313768393337633632373834633734396537664517385f5a4e36737562" - "746c65313743744f7074696f6e244c542454244754243665787065637431" - "3768633764316533383030323138386237654518705f5a4e38315f244c54" - "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" - "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" - "6e646578244c542449244754242447542435696e64657831376862376565" - "6135613738316438393239374519405f5a4e34636f726535736c69636535" - "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" - "376866663036393161306536326561633864451a425f5a4e34636f726535" - "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" - "656e5f6661696c31376861383936346133343065666132346537451b0861" - "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" - "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" - "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" - "325f333831326731384731416666696e65313566726f6d5f636f6d707265" - "7373656431376832333963336331363436646339303436451f355f5a4e38" - "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" - "37683530336430613839336365653362666645203e5f5a4e39626c733132" - "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" - "7365643137686333616566303334336638323663626245211462656c6c6d" - "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" - "367363616c6172365363616c617233737562313768656363643066636134" - "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" - "313768633661663135363636663731396234384524305f5a4e34636f7265" - "3970616e69636b696e673970616e69635f666d7431376862393162616461" - "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" - "3338312e2e67312e2e473150726f6a656374697665247532302461732475" - "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" - "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" - "243466726f6d3137686634356430353636343237373335316445262e5f5a" - "4e39626c7331325f33383132667032467036696e76657274313768366335" - "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" - "6670324670336d756c313768646666623336663036373139613633374528" - "365f5a4e39626c7331325f333831326731384731416666696e6538696465" - "6e746974793137686236366162643638326233626339356345292f5f5a4e" - "39626c7331325f3338313266703246703769735f7a65726f313768333962" - "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" - "325f3338312e2e67312e2e4731416666696e652475323024617324753230" - "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" - "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" - "323735393935653930646636613863452b85015f5a4e3130325f244c5424" - "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" - "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" - "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" - "475424244754243466726f6d313768353930643863663565363536346465" - "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" - "6531376839346666616330666264306163343332452d90015f5a4e313033" - "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" - "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" - "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" - "6f6f70447269766572244754243133646f75626c696e675f737465703137" - "6833346536393232613038346336343933452e705f5a4e38315f244c5424" - "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" - "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" - "646578244c542449244754242447542435696e6465783137686539346538" - "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" - "6972696e677333656c6c3137683264393865303762336132336635313345" - "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" - "32247532302461732475323024737562746c652e2e436f6e646974696f6e" - "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" - "6c5f73656c6563743137686366633738633362393036656661383945315a" - "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" - "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" - "656724475424336e65673137686230666536353636326461326334343345" - "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" - "363566633733316133386134393745332d5f5a4e39626c7331325f333831" - "3366703233467032336d756c313768326433373464346666306563343037" - "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" - "467036247532302461732475323024636f72652e2e6f70732e2e61726974" - "682e2e4d756c24475424336d756c31376865613934393735323931313764" - "3166634535305f5a4e39626c7331325f3338313366703633467036367371" - "756172653137683866633831663539663666313530643145363c5f5a4e39" - "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" - "6573696475653137686432663865613131393236643732653945375a5f5a" - "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" - "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" - "24475424337375623137686137396663636566323762323631323445382b" - "5f5a4e39626c7331325f3338313266703246703373756231376865646439" - "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" - "703246703361646431376863366562626430363731666432643965453a30" - "5f5a4e39626c7331325f3338313366703233467032367371756172653137" - "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" - "333831336670323346703233737562313768636330663365343532313765" - "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" - "646431376864363030363832376137333934646563453d2e5f5a4e39626c" - "7331325f3338313266703246703673717561726531376835616337663530" - "666666393136623065453e605f5a4e36375f244c542424524624626c7331" - "325f3338312e2e667031322e2e4670313224753230246173247532302463" - "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" - "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" - "626c7331325f3338312e2e667031322e2e46703132247532302461732475" - "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" - "2447542431306d756c5f61737369676e3137683037326534616130343436" - "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" - "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" - "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" - "3768613463633461633966316338323538644541635f5a4e39626c733132" - "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" - "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" - "6f746f6d69635f6578703137686166636437313637356662666432373645" - "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" - "32247532302461732475323024737562746c652e2e436f6e7374616e7454" - "696d654571244754243563745f6571313768316264323735363036643361" - "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" - "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" - "726974682e2e416464244754243361646431376835343330336164316564" - "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" - "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" - "4c542449244324552443244624475424247532302461732475323024636f" - "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" - "657261746f7224475424346e657874313768633964373737363930666232" - "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" - "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" - "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" - "637469766536646f75626c65313768386366636435343461313633326664" - "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" - "74697665336164643137686338666437656633383137383263636145487c" - "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" - "6a656374697665247532302461732475323024737562746c652e2e436f6e" - "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" - "6974696f6e616c5f73656c65637431376839346663383463303336386533" - "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" - "6c6d616c6c6f63244c542441244754243466726565313768623937643238" - "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" - "673570616e696331376832323065356136376635653365303666454b0e5f" - "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" - "696e6b5f6368756e6b31376831623634356162376339333032303939454d" - "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c542441244754243133646973706f73655f6368756e6b31376832" - "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" - "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" - "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" - "35616c6c6f63377261775f766563313763617061636974795f6f76657266" - "6c6f7731376863393936333961626361313337633131455085015f5a4e31" - "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" - "61702e2e4d6170244c542449244324462447542424753230246173247532" - "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" - "2e2e4974657261746f7224475424346e6578743137683161356136633566" - "303263666237373445514d5f5a4e34365f244c5424753634247532302461" - "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" - "54243563745f657131376839613065366130383065643661303532455253" - "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" - "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" - "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" - "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" - "6e6e6572313768363939386636356530343630623966324554475f5a4e34" - "325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376866396562386538303434" - "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" - "7231327061645f696e74656772616c313768336538303336383966363939" - "303466334556335f5a4e39626c7331325f33383132667032467031307375" - "6274726163745f7031376833353337643137643839306564373430455736" - "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" - "696d706c313768636263383565313966363066396565314558435f5a4e35" - "616c6c6f63377261775f7665633139526177566563244c54245424432441" - "244754243867726f775f6f6e653137683761366133613131343862316565" - "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" - "4732416666696e65247532302461732475323024737562746c652e2e436f" - "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" - "646974696f6e616c5f73656c656374313768346631633532376163323663" - "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" - "696f6e244c54245424475424247532302461732475323024737562746c65" - "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" - "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" - "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" - "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" - "6e7374616e7454696d654571244754243563745f65713137683764613737" - "3038613961336631623237455c335f5a4e39626c7331325f333831326670" - "324670313066726f6d5f6279746573313768663632643265653863383835" - "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" - "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" - "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" - "376862613864393933386331336334313962455e425f5a4e39626c733132" - "5f33383132667032467032356c657869636f67726170686963616c6c795f" - "6c61726765737431376864623239383362653765626662373630455f345f" - "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" - "65313768386339643861353637336531663765654560315f5a4e39626c73" - "31325f33383133667032334670323769735f7a65726f3137683232633162" - "33626231383039373337664561385f5a4e39626c7331325f333831326670" - "324670313573756d5f6f665f70726f647563747331376864373831613962" - "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" - "467032336e6567313768336535623432323139303537623839334563365f" - "5a4e39626c7331325f33383133667032334670323131706f775f76617274" - "696d653137683839356266623030643732663461646145643b5f5a4e3962" - "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" - "62795f78313768313830336335636330383333313036354565665f5a4e37" - "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" - "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" - "61726974682e2e4e656724475424336e6567313768363961333962383136" - "613036626237614566455f5a4e34636f7265346974657238616461707465" - "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" - "3768373932316661373530366638613637624567365f5a4e39626c733132" - "5f333831326732384732416666696e65386964656e746974793137683532" - "3261303037353662633832613639456885015f5a4e3130325f244c542462" - "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" - "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" - "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" - "5424244754243466726f6d31376831393034396666373534383632623533" - "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" - "795f303131376837316231356266356135313961376133456a385f5a4e39" - "626c7331325f333831326670324670313573756d5f6f665f70726f647563" - "747331376862306665663033383436356461336561456b5e5f5a4e39626c" - "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" - "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" - "345f73717561726531376835333530613232303537323261303037456c68" - "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" - "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" - "756241737369676e2447542431307375625f61737369676e313768656138" - "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" - "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" - "726564247532302461732475323024636f72652e2e636f6e766572742e2e" - "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" - "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" - "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" - "724c6f6f70447269766572244754243133646f75626c696e675f73746570" - "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" - "63337665633136566563244c542454244324412447542434707573683137" - "6836633466633030383766393064366561456f355f5a4e34636f72653970" - "616e69636b696e6731336173736572745f6661696c656431376838396134" - "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" - "696e67313870616e69635f626f756e64735f636865636b31376835613339" - "3334316633393435306165354571625f5a4e34636f726533666d74336e75" - "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" - "2e2e446973706c61792475323024666f7224753230247533322447542433" - "666d74313768646131373032323936653330396138624572445f5a4e3463" - "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" - "2475333224475424345f666d743137686531613333633761616434313031" - "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" - "726533666d7439466f726d617474657231327061645f696e74656772616c" - "313277726974655f70726566697831376865323164633232613535336139" - "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" - "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" - "633772756e74696d65313768623465303239633465666136373431314576" - "475f5a4e34325f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e44656275672447542433666d743137683763663234" - "64633163663734653663354577495f5a4e34345f244c5424245246245424" - "7532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768363963313766643162653433346236384578585f" - "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" - "7532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768356530663632333530333933336330664579265f" - "5a4e34636f726533666d7435777269746531376862633530306361396130" - "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" - "6275696c646572732e2e5061644164617074657224753230246173247532" - "3024636f72652e2e666d742e2e577269746524475424313077726974655f" - "6368617231376837323761393336343062616631636662457b305f5a4e34" - "636f726533666d743557726974653977726974655f666d74313768653264" - "32326663306535326231396336457c515f5a4e34636f726535736c696365" - "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" - "38646f5f70616e69633772756e74696d6531376836346563303433376262" - "666263656363457d475f5a4e34325f244c54242452462454247532302461" - "732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "31376837396432393730376137363931633337457e375f5a4e34636f7265" - "3570616e6963313250616e69635061796c6f61643661735f737472313768" - "33653762626665396537333233373036457f3b5f5a4e337374643970616e" - "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" - "68396561303139313462356439323635394580010a727573745f70616e69" - "638101455f5a4e3373746433737973396261636b747261636532365f5f72" - "7573745f656e645f73686f72745f6261636b747261636531376865376239" - "323038656534343338376436458201585f5a4e337374643970616e69636b" - "696e673139626567696e5f70616e69635f68616e646c657232385f247537" - "62242475376224636c6f7375726524753764242475376424313768393666" - "3161333534313164393334366245830183015f5a4e39395f244c54247374" - "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" - "6c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" - "54243661735f737472313768653362376630636337353061633833394584" - "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f636875" - "6e6b31376866646432333135363766663933346634458501066d656d7365" - "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" - "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" - "6830343030366431613866396435653532458901076d656d6d6f76650712" - "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" - "004d0970726f64756365727302086c616e6775616765010452757374000c" - "70726f6365737365642d6279010572757374631d312e38352e3120283465" - "6231363132353020323032352d30332d31352900490f7461726765745f66" - "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" - "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - -extern std::string const sp1WasmHex = - "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" - "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" - "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" - "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" - "000000060100000001010107040800000000000102080202040101000505" - "00010502000a0b0c00010100000100000401040000010100000101000200" - "0100000107010202030d0e000405017001080805030100110619037f0141" - "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" - "790200147370315f67726f746831365f766572696669657200000a5f5f64" - "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" - "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" - "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" - "0120051b3a00000240200504400340024002400240200541016b0e030005" - "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" - "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" - "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" - "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" - "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" - "280200211241e0a5c000280200211f024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002" - "400240024002404184021001220a450d00200a41c1befe827c3600800220" - "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" - "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" - "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" - "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" - "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" - "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" - "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" - "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" - "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" - "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" - "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" - "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" - "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" - "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" - "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" - "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" - "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" - "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" - "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" - "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" - "00370000201d41286a4200370000201d41306a4200370000201d41376a42" - "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" - "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" - "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" - "200a280000470d002001418280c4003602e01c2001410036029c03200142" - "c080808020370294032001205241026a360290032001200141e01c6a3602" - "a003200141106a20014190036a100320012d0010044020012d0011210502" - "4020012802a003280200418280c400470d00200128029403450d00200128" - "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" - "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" - "053a0000200141013602a80c200120023602a40c200141083602a00c2001" - "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" - "0037030020012001290290033703a00f4101210503400240200141086a20" - "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" - "460440024020012802b00f280200418280c400470d0020012802a40f450d" - "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" - "220e280200220c4101742208200541016a220220022008491b2202200241" - "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" - "36021441010541000b360218200f41086a41012002200f41146a1028200f" - "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" - "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" - "20012802a40c21020b200220056a20063a00002001200541016a22053602" - "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" - "80c4004704402002450d02200641046b2802002205417871221241044108" - "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" - "0610040c020b2002418080808078460d0102400240024002402005412046" - "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" - "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" - "28000721262006280003213520062d0002212d20062d0001214720062d00" - "00214820020440200641046b2802002208417871220c4104410820084103" - "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" - "200141206a22062005290300370300200141286a220520232d00003a0000" - "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" - "2006290300370000200141cf006a20052d00003a0000201641086a200141" - "f8006a290000370000201641106a20014180016a29000037000020164118" - "6a20014188016a290000370000200120012d0070411f713a007020162001" - "2900703700002001202436003b2001202636003720012035360033200120" - "2d3a0032200120473a0031200120483a00302001200129031837003f200a" - "290014225742388620574280fe0383422886842057428080fc0783421886" - "205742808080f80f834208868484205742088842808080f80f8320574218" - "88428080fc07838420574228884280fe03832057423888848484215e200a" - "411c6a290000225742388620574280fe0383422886842057428080fc0783" - "421886205742808080f80f834208868484205742088842808080f80f8320" - "57421888428080fc07838420574228884280fe0383205742388884848421" - "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" - "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" - "2886842058428080fc0783421886205842808080f80f8342088684842058" - "42088842808080f80f832058421888428080fc07838420584228884280fe" - "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" - "574280fe0383422886842057428080fc0783421886205742808080f80f83" - "4208868484205742088842808080f80f832057421888428080fc07838420" - "574228884280fe03832057423888848484225742a9c0c689aece93b23054" - "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" - "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" - "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" - "18200120573703b8182001205e3703a818200a2900342257423886205742" - "80fe0383422886842057428080fc0783421886205742808080f80f834208" - "868484205742088842808080f80f832057421888428080fc078384205742" - "28884280fe03832057423888848484215e200a413c6a2900002257423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe038320574238888484842165417f200a290024225742" - "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" - "008584420052205842388620584280fe0383422886842058428080fc0783" - "421886205842808080f80f834208868484205842088842808080f80f8320" - "58421888428080fc07838420584228884280fe0383205842388884848422" - "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" - "57428080fc0783421886205742808080f80f834208868484205742088842" - "808080f80f832057421888428080fc07838420574228884280fe03832057" - "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" - "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" - "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" - "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" - "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" - "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" - "2206200141a0076a290300370000200141d50c6a220220014198076a2903" - "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" - "222420014188076a290300370000200141bd0c6a222620014180076a2903" - "00370000200141b50c6a2235200141f8066a290300370000200120012903" - "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" - "2006290000370000200141951d6a220620022900003700002001418d1d6a" - "22022023290000370000200141851d6a22232024290000370000200141fd" - "1c6a22242026290000370000200141f51c6a222620352900003700002001" - "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" - "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" - "290000370300200141b80a6a2023290000370300200141b00a6a20242900" - "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" - "0054225742388620574280fe0383422886842057428080fc078342188620" - "5742808080f80f834208868484205742088842808080f80f832057421888" - "428080fc07838420574228884280fe038320574238888484842165200a41" - "dc006a290000225742388620574280fe0383422886842057428080fc0783" - "421886205742808080f80f834208868484205742088842808080f80f8320" - "57421888428080fc07838420574228884280fe0383205742388884848421" - "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" - "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" - "422886842058428080fc0783421886205842808080f80f83420886848420" - "5842088842808080f80f832058421888428080fc07838420584228884280" - "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" - "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" - "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" - "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" - "fe0383422886842057428080fc0783421886205742808080f80f83420886" - "8484205742088842808080f80f832057421888428080fc07838420574228" - "884280fe03832057423888848484215a200a41fc006a2900002257423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe03832057423888848484215c417f200a290064225742" - "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" - "dd008584420052205842388620584280fe0383422886842058428080fc07" - "83421886205842808080f80f834208868484205842088842808080f80f83" - "2058421888428080fc07838420584228884280fe03832058423888848484" - "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" - "2057428080fc0783421886205742808080f80f8342088684842057420888" - "42808080f80f832057421888428080fc07838420574228884280fe038320" - "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" - "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" - "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" - "511b0d070b200a29009401225742388620574280fe038342288684205742" - "8080fc0783421886205742808080f80f8342088684842057420888428080" - "80f80f832057421888428080fc07838420574228884280fe038320574238" - "88848484215b200a419c016a290000225742388620574280fe0383422886" - "842057428080fc0783421886205742808080f80f83420886848420574208" - "8842808080f80f832057421888428080fc07838420574228884280fe0383" - "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" - "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" - "42388620584280fe0383422886842058428080fc07834218862058428080" - "80f80f834208868484205842088842808080f80f832058421888428080fc" - "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" - "91a8b87f54205742388620574280fe0383422886842057428080fc078342" - "1886205742808080f80f834208868484205742088842808080f80f832057" - "421888428080fc07838420574228884280fe038320574238888484842257" - "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" - "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" - "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" - "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" - "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" - "4180076a290300370300200120012903f0063703a00b200120533703a80b" - "200120623703900b2001206a3703800b200120593703f00a2001205c3703" - "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" - "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" - "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" - "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" - "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" - "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" - "2205200141f8066a22062903002257370000200141f80a6a20014188076a" - "2202290300370300200141f00a6a20014180076a22202903003703002001" - "20012903f0063703e00a200120573703e80a200141e0066a200910062001" - "2d00e0060d06200520062903002257370000200141b80b6a200229030037" - "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" - "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" - "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" - "2206200141a0076a290300370000200141d50c6a220220014198076a2903" - "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" - "222220014188076a290300370000200141bd0c6a220920014180076a2903" - "00370000200141b50c6a2223200141f8066a290300370000200120012903" - "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" - "2006290000370000200141951d6a220620022900003700002001418d1d6a" - "22022020290000370000200141851d6a22202022290000370000200141fd" - "1c6a22222009290000370000200141f51c6a220920232900003700002001" - "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" - "2005290000370300200141c8086a2006290000370300200141c0086a2002" - "290000370300200141b8086a2020290000370300200141b0086a20222900" - "00370300200141a8086a2009290000370300200120012900ed1c3703a008" - "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" - "370300200141f8076a200141b80a6a29030037030020014180086a200141" - "c00a6a29030037030020014188086a200141c80a6a290300370300200141" - "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" - "370300200120012903a00a3703e007200141e0066a200141801f6a418001" - "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" - "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" - "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" - "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" - "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" - "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" - "00370300200141800c6a2065370300200141880c6a205e37030020014190" - "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" - "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" - "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" - "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" - "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" - "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" - "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" - "418001104c418001104c1a201241a002460d13201241a102460d14201241" - "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" - "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" - "8080808080023702a00b2005200641087472202041107472200241187472" - "220504404101200541187420054180fe03714108747220054108764180fe" - "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" - "b00f6a210641a40221024100212241102108410021200340202041f6ffff" - "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" - "012d00a00f0d0320052006290000370000200541386a2202200641386a29" - "0000370000200541306a2223200641306a290000370000200541286a2224" - "200641286a290000370000200541206a2226200641206a29000037000020" - "0541186a2235200641186a290000370000200541106a222d200641106a29" - "0000370000200541086a2247200641086a290000370000200141901f6a22" - "48202d290000370300200141981f6a222d2035290000370300200141a01f" - "6a22352026290000370300200141a81f6a22262024290000370300200141" - "b01f6a22242023290000370300200141b81f6a2223200229000037030020" - "0120052900003703801f200120472900003703881f20012802a00b202046" - "044041002108230041206b2203240002400240200141a00b6a221b280200" - "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" - "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" - "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" - "100541000b360218200341086a4110200e200341146a1028200328020841" - "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" - "0328020c210f201b2002360200201b200f360204200341206a2400200128" - "02a40b21080b200820226a220220012903801f370300200241386a202329" - "0300370300200241306a2024290300370300200241286a20262903003703" - "00200241206a2035290300370300200241186a202d290300370300200241" - "106a2048290300370300200241086a20012903881f370300200120204101" - "6a22203602a80b202241406b212220092102200c2020470d000b20012802" - "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" - "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" - "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" - "900c6a290300370100200141c6126a200141880c6a290300370100200141" - "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" - "370100200141ae126a200141f00b6a290300370100200141a6126a200129" - "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" - "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" - "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" - "410272200141e0066a41be03104c1a200120263602d006200120063a0091" - "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" - "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" - "6a2105200141306a2106410021120340230041206b22092400200941186a" - "221b2006290000225342388620534280fe0383422886842053428080fc07" - "83421886205342808080f80f834208868484205342088842808080f80f83" - "2053421888428080fc07838420534228884280fe03832053423888848484" - "370300200941106a2208200641086a290000225342388620534280fe0383" - "422886842053428080fc0783421886205342808080f80f83420886848420" - "5342088842808080f80f832053421888428080fc07838420534228884280" - "fe0383205342388884848437030020092006290010225342388620534280" - "fe0383422886842053428080fc0783421886205342808080f80f83420886" - "8484205342088842808080f80f832053421888428080fc07838420534228" - "884280fe038320534238888484843703082009200641186a290000225342" - "388620534280fe0383422886842053428080fc0783421886205342808080" - "f80f834208868484205342088842808080f80f832053421888428080fc07" - "838420534228884280fe0383205342388884848437030020094201420042" - "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" - "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" - "0300370300200c41186a2009290308370300200c20092903003703102009" - "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" - "2257370300200141f0066a200541106a2903002258370300200120052903" - "00225e3703e0062001200541086a29030022653703e80620202012410574" - "6a220641186a2057370300200641106a2058370300200641086a20653703" - "002006205e370300410121122002410171211f4101210220162106201f45" - "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" - "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" - "352005104c211220624203520d02206a428080808010540d042001419006" - "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" - "386a290300370300200141f01a6a2216201241306a290300370300200141" - "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" - "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" - "2224201241106a290300370300200120122903003703c01a200120124108" - "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" - "370300200141d00c6a2016290300370300200141c80c6a20222903003703" - "00200141c00c6a2009290300370300200141b80c6a202329030037030020" - "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" - "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" - "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" - "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" - "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" - "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" - "ffff01716a22422903002004290300832159204241086a29030020044108" - "6a29030083215302400240027f0240024002400240024020364101714504" - "4041002053205984500d061a200441e0006a200441206a29030037030020" - "0441e8006a200441286a290300370300200441f0006a202b290300370300" - "200441f8006a200441386a29030037030020044180016a200441406b2903" - "0037030020044188016a200441c8006a2903003703002004200429031037" - "035020042004290318370358202e0d010c030b202e450d0120044188026a" - "200441c8006a222e29030037030020044180026a200441406b2250290300" - "370300200441f8016a200441386a2203290300370300200e202b29030037" - "0300200441e8016a200441286a2236290300370300200441e0016a200441" - "206a2242290300370300200420042903183703d801200420042903103703" - "d001200441d8036a224b4200370300200441d0036a220242003703002004" - "42003703f803200442003703f003200442003703e803200442013703e003" - "200442003703c803200442003703c003024002400240200441d0016a2004" - "41c0036a104a450440200e200f104a450d010b204b420037030020024200" - "370300200442003703f803200442003703f003200442003703e803200442" - "013703e003200442003703c803200442003703c003027f0240200441d001" - "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" - "0300204941186a202b41186a290300370300204941106a202b41106a2903" - "00370300204941086a202b41086a290300370300200441a0026a20422903" - "00370300200441a8026a2036290300370300200420042903103703900220" - "0420042903183703980220082102204a0c010b204a4200370300200441a0" - "026a4200370300200441a8026a4200370300204a41086a4200370300204a" - "41106a4200370300204a41186a4200370300200442003703900220044200" - "37039802201b210220490b214b2002420037030820024200370300204b42" - "00370308204b4201370300200441c0036a20044190026a20044190026a10" - "40200441f0026a200441c0036a104120042802f002410171450d01200441" - "c8016a203741386a290300370300200441c0016a203741306a2903003703" - "00200441b8016a203741286a290300370300200441b0016a203741206a29" - "0300370300200441a8016a203741186a290300370300200441a0016a2037" - "41106a29030037030020042037290300370390012004203741086a290300" - "370398010c020b200441a0016a2042290300370300200441a8016a203629" - "0300370300200441b0016a202b290300370300200441b8016a2003290300" - "370300200441c0016a2050290300370300200441c8016a202e2903003703" - "00200420042903103703900120042004290318370398010c010b41c4a0c0" - "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" - "41a8016a290300370300202b200441b0016a2903003703002003200441b8" - "016a2903003703002050200441c0016a290300370300202e200441c8016a" - "290300370300200420042903900137031020042004290398013703182053" - "205984500d04200441e0006a2042290300370300200441e8006a20362903" - "00370300200441f0006a202b290300370300200441f8006a200329030037" - "030020044180016a205029030037030020044188016a202e290300370300" - "20042004290310370350200420042903183703580b200441c0036a200441" - "d0006a200c100c0c020b20532059844200520d002041450d044101213641" - "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" - "0c41306a290300370300200441e8036a200c41286a290300370300200f20" - "0c41206a290300370300200441d8036a200c41186a290300370300200441" - "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" - "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" - "41406b200441f0036a290300370300200441386a200441e8036a29030037" - "0300202b200f290300370300200441286a200441d8036a29030037030020" - "0441206a200441d0036a290300370300200420042903c803370318200420" - "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" - "c0001020000b204141016b21410c010b0b20312004290310370300203141" - "086a2004290318370300203141386a200441c8006a290300370300203141" - "306a200441406b290300370300203141286a200441386a29030037030020" - "3141206a200441306a290300370300203141186a200441286a2903003703" - "00203141106a200441206a290300370300200441a0046a2400200541206a" - "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" - "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" - "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" - "20014190026a100d200141a0186a21024200215c42002154420021532001" - "41e0066a220541386a2903002161200541286a290300215b200529033021" - "592005290320215e027e200529034022652005290350226a84200541c800" - "6a2903002262200541d8006a290300225a84845004402059215c20612154" - "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" - "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" - "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" - "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" - "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" - "3c205e7d0b21612002206a370350200220653703402002205c3703302002" - "20613703202002205a370358200220623703482002205437033820022053" - "37032820022005290300370300200241186a200541186a29030037030020" - "0241106a200541106a290300370300200241086a200541086a2903003703" - "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" - "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" - "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" - "00215c42002153024002400240200141801f6a2202290380012002418801" - "6a290300844200520d0020022903900120024198016a290300844200520d" - "0020022903a001200241a8016a290300844200520d0020022903b0012002" - "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" - "0300215e2002290370215420022903602161200229035022582002290340" - "226a84200241d8006a290300225a200241c8006a29030022628484420052" - "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" - "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" - "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" - "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" - "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" - "542061842059205e84844200520440427f4200427f4200206142788342c7" - "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" - "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" - "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" - "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" - "4180016a22052903003703800120082002290300370300200841b8016a20" - "0541386a290300370300200841b0016a200541306a290300370300200841" - "a8016a200541286a290300370300200841a0016a200541206a2903003703" - "0020084198016a200541186a29030037030020084190016a200541106a29" - "030037030020084188016a200541086a290300370300200841086a200241" - "086a290300370300200841106a200241106a290300370300200841186a20" - "0241186a290300370300200841206a200241206a29030037030020084128" - "6a200241286a290300370300200841306a200241306a2903003703002008" - "41386a200241386a2903003703002008205a370378200820623703702008" - "206a370368200820583703602008205c3703582008206537035020082053" - "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" - "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" - "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" - "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" - "023820004280808080800237023020004100360244200042808080808002" - "37023c41102133200041306a10362000280234223b200141a00f6a220341" - "e000104c1a20004101360238200341e0006a2102200028023c4504402000" - "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" - "022000410136024420002802304101460440200041306a10362000280234" - "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" - "2102200028023c41014604402000413c6a1038200028024021330b203341" - "c0016a200241c001104c1a200341c0046a21022000410236024420002802" - "304102460440200041306a10362000280234213b0b203b41c0016a200241" - "e000104c1a20004103360238200341a0056a2102200028023c4102460440" - "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" - "0341e0066a21022000410336024420002802304103460440200041306a10" - "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" - "200341c0076a2103200028023c41034604402000413c6a10382000280240" - "21330b203341c0046a200341c001104c1a20004104360244200041003602" - "502000428080808080023702482000410036025c20004280808080800237" - "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" - "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" - "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" - "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" - "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" - "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" - "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" - "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" - "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" - "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" - "002802b001410171450d00200041a00d6a2003104120002802a00d410171" - "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" - "00200041f0026a2213201041306a290300370300200041e8026a22092010" - "41286a290300370300200041e0026a2215201041206a2903003703002000" - "41d8026a220f201041186a290300370300200041d0026a2225201041106a" - "290300370300200020102903003703c0022000202e2903003703c8022000" - "280248203946044041002108230041206b220e240002400240200041c800" - "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" - "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" - "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" - "020436021441100541000b360218200e41086a2016200e41146a1037200e" - "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" - "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" - "00200028024c21050b200520394106746a220320002903c0023703002003" - "41386a2011290300370300200341306a2013290300370300200341286a20" - "09290300370300200341206a2015290300370300200341186a200f290300" - "370300200341106a2025290300370300200341086a20002903c802370300" - "2000203941016a2239360250200041a00d6a200d10450240024020002802" - "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" - "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" - "200b4200370300200041b80d6a220d420037030020104200370300203f42" - "00370300203f41086a4200370300203f41106a4200370300203f41186a42" - "00370300203f41206a4200370300203f41286a4200370300200042003703" - "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" - "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" - "104a0d00203d202d104a450d010b203c4200370300200220272903003703" - "00203c41086a4200370300203c41106a4200370300203c41186a42003703" - "00203c41206a4200370300203c41286a4200370300200241386a20274138" - "6a290300370300200241306a202741306a290300370300200241286a2027" - "41286a290300370300200241206a202741206a290300370300200241186a" - "202741186a290300370300200241106a202741106a290300370300200241" - "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" - "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" - "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" - "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" - "370300200020002903b83a3703b846200020002903b03a3703b04620070c" - "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" - "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" - "0300200041e8c6006a4200370300200042003703b046200042003703b846" - "202b41f000104b1a20020b220342003703082003420137030041bda9c000" - "2d00001a41809901100b221e450d0141002109200041003602b819200020" - "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" - "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" - "200d290300370300200041c0c3006a220f20102903003703002000200029" - "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" - "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" - "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "200041a8076a2211200b41186a221b290300370300200041a0076a221320" - "0b41106a22342903003703002000200b41086a2240290300370398072000" - "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" - "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" - "370300200041c01f6a200f29030037030020182000290390073703002018" - "41086a200029039807370300201841106a2013290300370300201841186a" - "2011290300370300200020002903b8433703b81f200020002903b0433703" - "b01f200041e8346a2203200241386a290300370300200041e0346a200241" - "306a290300370300200041d8346a2232200241286a290300370300200041" - "d0346a200241206a290300370300200041c8346a220e200241186a290300" - "370300200041c0346a200241106a2903003703002000200241086a290300" - "3703b834200020022903003703b034200041b0346a20022002102f200041" - "e8376a2219200741386a290300370300200041e0376a200741306a290300" - "370300200041d8376a221a200741286a290300370300200041d0376a2007" - "41206a290300370300200041c8376a222f200741186a2903003703002000" - "41c0376a2230200741106a2903003703002000200741086a2903003703b8" - "37200020072903003703b037200041b0376a20072007102f20002903b837" - "226942018620002903b037226b423f88842155206b420186215402400240" - "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" - "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" - "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" - "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" - "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" - "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" - "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" - "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" - "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" - "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" - "00226742018620002903d037226f423f88842154206f4201862153024002" - "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" - "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" - "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" - "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" - "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" - "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" - "aece93b230511b450d002053215b20542170205921600c010b2055205920" - "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" - "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" - "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" - "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" - "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" - "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" - "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" - "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" - "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" - "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" - "30511b450d0120540b215f205921582053215c0c010b2056205420532059" - "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" - "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" - "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" - "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" - "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" - "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" - "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" - "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" - "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" - "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" - "89aece93b230511b450d002059215a205321590c010b2055205420532059" - "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" - "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" - "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" - "550b200020543703e0222000205a3703d0222000205f3703c02220002058" - "3703b022200020553703e822200020593703d822200020563703c8222000" - "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" - "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" - "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" - "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" - "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" - "0041b0226a102f20002903b825226442018620002903b025226e423f8884" - "2155206e420186215402400240027e20002903c02522704201862064423f" - "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" - "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" - "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" - "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" - "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" - "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" - "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" - "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" - "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" - "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" - "018620002903d0252265423f888421542065420186215302400240200029" - "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" - "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" - "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" - "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" - "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" - "c689aece93b230511b450d002053216c20542173205921680c010b205520" - "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" - "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" - "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" - "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" - "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" - "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" - "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" - "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" - "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" - "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" - "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" - "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" - "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" - "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" - "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" - "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" - "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" - "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" - "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" - "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" - "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" - "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" - "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" - "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" - "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" - "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" - "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" - "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" - "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" - "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" - "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" - "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" - "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" - "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" - "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" - "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" - "0240207320002903e03422597c22552079203229030022687c2263207954" - "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" - "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" - "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" - "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" - "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" - "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" - "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" - "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" - "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" - "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" - "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" - "723703002000207a37039807200020753703900720004190076a42a4fdf9" - "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" - "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "200d20633703002010205d370300200020613703a80d200020573703a00d" - "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" - "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" - "286a220e2013290300370300200620002903a00d370300200641086a2000" - "2903a80d370300200641106a2010290300370300200641186a200d290300" - "37030020002000290398073703b82820002000290390073703b028024002" - "40027e20002903c04722612000290380477c226d204d290300225d204c29" - "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" - "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" - "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" - "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" - "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" - "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" - "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" - "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" - "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" - "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" - "024020002903e047225720002903a0477c226320222903002262201f2903" - "007c225d206254ad205d20002903d04722622000290390477c2261206254" - "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" - "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" - "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" - "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" - "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" - "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" - "89aece93b230511b450d0020612157206221610c010b2063205d20622061" - "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" - "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" - "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" - "630b200d206d3703002010207237030020292061370300200b2057370300" - "203a205d37030020252063370300200041c0c0006a224520723703002000" - "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" - "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" - "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" - "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" - "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" - "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" - "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" - "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" - "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" - "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" - "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" - "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" - "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" - "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" - "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" - "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" - "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" - "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" - "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" - "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" - "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" - "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" - "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" - "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" - "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" - "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" - "5d20002903b040216102400240417f20002903c0402267206d8520322903" - "002266206985844200522067206d54206620695420662069511b1b222141" - "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" - "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" - "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" - "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" - "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" - "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" - "02400240417f20002903e0402263206f85201c2903002267206b85844200" - "522063206f542067206b542067206b511b1b2214417f470440201441ff01" - "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" - "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" - "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" - "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" - "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" - "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" - "417f20542070852056206085844200522054207056205620605620562060" - "511b1b2214417f470440201441ff01710d012058206e5820532064582053" - "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" - "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" - "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" - "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" - "64420120727d21722063207e7c216f420120767d2175206020567d205442" - "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" - "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" - "216e205e20587d217e02400240417f2059205c852055205b858442005220" - "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" - "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" - "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" - "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" - "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" - "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" - "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" - "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" - "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" - "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" - "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" - "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" - "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" - "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" - "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" - "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" - "0041e0256a290300370300200041b8076a2217201a290300370300202c20" - "0041d0256a290300370300201120192903003703002013200041c0256a29" - "0300370300200020002903b82537039807200020002903b0253703900720" - "004190076a200041b0256a200041b0256a102f0240417f20542074852056" - "205a858442005220542074542056205a542056205a511b1b2219417f4704" - "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" - "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" - "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" - "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" - "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" - "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" - "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" - "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" - "40417f20592073852055205f858442005220592073542055205f54205520" - "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" - "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" - "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" - "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" - "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" - "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" - "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" - "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" - "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" - "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" - "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" - "0300370300200b20062903003703002029200041d8286a29030037030020" - "3a200041e0286a2903003703002025200041e8286a290300370300200020" - "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" - "b0286a200041b0286a102f20002903980722544201862000290390072253" - "423f888421552053420186215a02400240027e20002903a0072259420186" - "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" - "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" - "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" - "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" - "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" - "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" - "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" - "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" - "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" - "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" - "290300225a42018620002903b007225f423f8884215b205f420186215c02" - "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" - "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" - "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" - "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" - "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" - "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" - "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" - "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" - "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" - "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" - "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" - "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" - "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" - "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" - "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" - "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" - "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" - "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" - "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" - "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" - "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" - "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" - "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" - "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" - "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" - "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" - "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" - "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" - "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" - "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" - "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" - "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" - "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" - "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" - "417f20002903b00d225f205b85200d290300225420568584420052205b20" - "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" - "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" - "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" - "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" - "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" - "2066216c205821660b206220787d215f206120777d2158205420567d205b" - "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" - "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" - "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" - "7f20002903d00d2254205a8520252903002256205585844200522054205a" - "54205520565620552056511b1b2203417f470440200341ff01710d012064" - "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" - "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" - "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" - "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" - "20002066370380472000206c3703f0462000205c20717d37039047200020" - "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" - "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" - "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" - "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" - "03d831200020583703d031200020603703c0312000206b3703c831200020" - "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" - "002164200042003703e831200042003703e031200042003703d831200042" - "013703d031200042003703c831200042003703c031200042003703b83120" - "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" - "714200216c4200216642002167205f2060842053206b8484420052044042" - "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" - "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" - "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" - "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" - "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" - "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" - "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" - "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" - "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" - "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" - "20002903b0432253423f888421552053420186215a02400240027e200029" - "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" - "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" - "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" - "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" - "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" - "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" - "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" - "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" - "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" - "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" - "018620002903d043225f423f88842160205f420186215b02400240200029" - "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" - "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" - "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" - "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" - "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" - "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" - "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" - "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" - "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" - "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" - "0b02400240027e205920687c225b205420737c2269205454ad2069205320" - "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" - "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" - "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" - "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" - "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" - "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" - "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" - "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" - "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" - "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" - "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" - "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" - "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" - "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" - "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" - "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" - "b230511b450d002059215a205321590c010b205520542053205942c7faf3" - "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" - "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" - "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" - "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" - "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" - "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" - "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" - "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" - "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" - "21532019290300215f2003290300215820002903b81c2160201e200941c0" - "016c6a220320553703b80120142903002155201a290300215c200e290300" - "216820002903b01c2174200320543703b001200320593703a8012003205a" - "3703a00120032056370398012003205b3703900120032069370388012003" - "2070370380012003205e3703782003206f3703702003206b370368200320" - "643703602003206c37035820032071370350200320673703482003206637" - "034020032074370300200341386a2058370300200341306a206837030020" - "0341286a205f370300200341206a205c370300200341186a205337030020" - "0341106a2055370300200341086a20603703002000200941016a22033602" - "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" - "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" - "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" - "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" - "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" - "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" - "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" - "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" - "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" - "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" - "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" - "186a290300370300200f203e41106a2903003703002000203e41086a2903" - "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" - "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" - "2903b043370300204020002903b8433703002034200f290300370300201b" - "2015290300370300200020002903b83a3703a80d200020002903b03a3703" - "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" - "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" - "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" - "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" - "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" - "90072015203d41186a290300370300200f203d41106a2903003703002000" - "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" - "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200d202741186a2903003703002010202741106a2903003703" - "00200b20002903b043370300204020002903b8433703002034200f290300" - "370300201b20152903003703002000202741086a2903003703a80d200020" - "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" - "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" - "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" - "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" - "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" - "997f3703b043202f202841186a2903003703002030202841106a29030037" - "03002000202841086a2903003703b837200020282903003703b037200041" - "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b2011203229030037030020132045290300370300202c" - "20002903b037370300202c41086a220d20002903b837370300202c41106a" - "22092030290300370300202c41186a2215202f2903003703002000200029" - "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" - "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" - "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" - "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" - "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" - "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" - "03002030204341106a2903003703002000204341086a2903003703b83720" - "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" - "003703002013204441106a290300370300202c20002903b037370300200d" - "20002903b837370300200920302903003703002015202f29030037030020" - "00204441086a2903003703980720002044290300370390072004200041b0" - "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" - "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" - "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" - "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" - "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" - "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" - "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" - "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" - "104c1a205141086a200d280200360200205120002902b019370200200028" - "025420464604404100211b230041206b220e240002400240200041d4006a" - "22162802002209417f460d00410420094101742208200941016a220c2008" - "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" - "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" - "200e201628020436021441100541000b360218200e41086a2008200e4114" - "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" - "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" - "0e41206a2400200028025821380b203820464190016c6a20004180036a41" - "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" - "0b0240024002400240024002400240024002400240024002402046450440" - "2000280254210320004190076a41f002104b1a20030d010c020b41002118" - "200041a0076a41f002104b1a200042003703980720004201370390072046" - "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" - "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" - "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" - "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" - "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" - "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" - "6a2017103b200042003703e849200042003703e049200042003703d84920" - "0042013703d049200042003703c849200042003703c049200042003703b8" - "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" - "386a2203201c41386a290300370300201941306a2202201c41306a290300" - "370300201941286a2207201c41286a290300370300201941206a220b201c" - "41206a290300370300201941186a220d201c41186a290300370300201941" - "106a2211201c41106a290300370300201941086a2206201c41086a290300" - "3703002019201c290300370300201a2017290300370300201a41086a2209" - "201741086a290300370300201a41106a2215201741106a29030037030020" - "1a41186a220f201741186a290300370300201a41206a2225201741206a29" - "0300370300201a41286a2229201741286a290300370300201a41306a222a" - "201741306a290300370300201a41386a221e201741386a29030037030020" - "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" - "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" - "004190076a2017103020452028201a10302040202c20191030200041b0ce" - "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" - "006a200041b0c3006a103c200042003703e846200042003703e046200042" - "003703d846200042013703d046200042003703c846200042003703c04620" - "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" - "6a102f201a20002903b043370300200920002903b8433703002015200041" - "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" - "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" - "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" - "386a2903003703002002201441306a2903003703002007201441286a2903" - "00370300200b201441206a290300370300200d201441186a290300370300" - "2011201441106a2903003703002006201441086a29030037030020192014" - "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" - "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" - "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" - "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" - "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" - "220c41c000460d040c030b02400340200641046a280200220320184b0440" - "200241386a2903002156200241306a2903002155200241286a2903002154" - "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" - "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" - "003703002000200341c8006a2903003703b84e200020032903403703b04e" - "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" - "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" - "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" - "200d290300370300200041c0c9006a222920112903003703002013200029" - "03a00d370300201341086a222a20002903a80d370300201341106a221e20" - "0b290300370300201341186a222f2007290300370300200020002903b84e" - "3703b849200020002903b04e3703b049200241186a290300215620024110" - "6a2903002155200241086a290300215420022903002153200041c8c6006a" - "220920034198016a290300370300200041c0c6006a221520034190016a29" - "0300370300200020034188016a2903003703b84620002003290380013703" - "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" - "016a2903003703002000200341a8016a2903003703a80d200020032903a0" - "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" - "0300201020002903a00d370300201041086a223020002903a80d37030020" - "1041106a223a200b290300370300201041186a2232200729030037030020" - "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" - "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" - "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" - "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" - "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" - "41046a2802002203200f4b0440200241386a2903002156200241306a2903" - "002155200241286a2903002154200241206a2903002153200d2006280200" - "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" - "3703002000200341c8006a2903003703b84e200020032903403703b04e20" - "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" - "03003703002000200341e8006a2903003703a80d200020032903603703a0" - "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b2025200d290300370300202920112903003703002013" - "20002903a00d370300202a20002903a80d370300201e200b290300370300" - "202f2007290300370300200020002903b84e3703b849200020002903b04e" - "3703b049200241186a2903002156200241106a2903002155200241086a29" - "0300215420022903002153200920034198016a2903003703002015200341" - "90016a290300370300200020034188016a2903003703b846200020032903" - "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" - "200341b0016a2903003703002000200341a8016a2903003703a80d200020" - "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" - "290300370300201020002903a00d370300203020002903a80d370300203a" - "200b29030037030020322007290300370300200020002903b8463703b84e" - "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" - "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" - "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" - "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" - "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" - "0d201841c0016c2125200521022008210903402018200741046a28020022" - "034f0d02200241386a2903002156200241306a2903002155200241286a29" - "03002154200241206a2903002153200041c8ce006a221320072802002025" - "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" - "003703002000200341c8006a2903003703b84e200020032903403703b04e" - "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" - "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" - "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" - "290300370300200041c0c9006a2006290300370300200d20002903a00d37" - "0300200d41086a20002903a80d370300200d41106a201029030037030020" - "0d41186a2011290300370300200020002903b84e3703b849200020002903" - "b04e3703b049200241186a2903002156200241106a290300215520024108" - "6a290300215420022903002153200041c8c6006a221520034198016a2903" - "00370300200041c0c6006a220f20034190016a2903003703002000200341" - "88016a2903003703b84620002003290380013703b046200041b0c6006a20" - "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "2011200341b8016a2903003703002010200341b0016a2903003703002000" - "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" - "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b201320152903003703002006200f290300370300200b20002903a00d" - "370300200b41086a20002903a80d370300200b41106a2010290300370300" - "200b41186a2011290300370300200020002903b8463703b84e2000200029" - "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" - "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" - "6a2107200241406b2102200941016b22090d000b20384184016a21072000" - "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" - "05210203402018200741046a28020022034f0d03200241386a2903002156" - "200241306a2903002155200241286a2903002154200241206a2903002153" - "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" - "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" - "003703b84e200020032903403703b04e200041b0ce006a20532054205520" - "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" - "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" - "003703002000200341e8006a2903003703a80d200020032903603703a00d" - "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" - "06290300370300200d20002903a00d370300200d41086a20002903a80d37" - "0300200d41106a2010290300370300200d41186a20112903003703002000" - "20002903b84e3703b849200020002903b04e3703b049200241186a290300" - "2156200241106a2903002155200241086a29030021542002290300215320" - "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" - "034190016a290300370300200020034188016a2903003703b84620002003" - "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" - "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" - "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" - "2015290300370300200b20002903a00d370300200b41086a20002903a80d" - "370300200b41106a2010290300370300200b41186a201129030037030020" - "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" - "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" - "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" - "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" - "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" - "03e834200042003703e034200042003703d834200042013703d034200042" - "003703c834200042003703c034200042003703b834200042093703b03420" - "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" - "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" - "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" - "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" - "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" - "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" - "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" - "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" - "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" - "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" - "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" - "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" - "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" - "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" - "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" - "290300370300200041c8106a220c200041c8376a221e2903003703002000" - "41c0106a2216200041c0376a222f290300370300200020002903b8373703" - "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" - "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" - "136a2228200041a0386a221b290300370300200041d8136a223420004198" - "386a2240290300370300200041d0136a224520004190386a224c29030037" - "0300200041c8136a221020004188386a224d290300370300200041c0136a" - "221320004180386a224e290300370300200041c0316a2230200041c0386a" - "223d290300370300200041c8316a223a200041c8386a2243290300370300" - "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" - "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" - "290300370300200041e8316a221a200041e8386a222d2903003703002000" - "200041f8376a22122903003703b813200020002903f0373703b013200020" - "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" - "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" - "42003703e034200042003703d834200042013703d034200042003703c834" - "200042003703c034200042003703b834200042093703b034200041b0ce00" - "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" - "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" - "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" - "006a22112903003703002013200041c0ce006a220b290300370300200020" - "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" - "0c290300370300200041b00a6a22092016290300370300200020002903b8" - "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" - "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" - "0041c83d6a22132017290300370300200041c03d6a221020142903003703" - "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" - "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d201120062903002256370300200b20092903002255370300200d20" - "002903b03d2254370300200220102903002253370300200720002903b83d" - "225937030020032013290300225a370300200020002903a80a225f3703b8" - "4e200020002903a00a22583703b04e2017205a3703002014205337030020" - "1c205937030020212054370300200c205637030020162055370300200020" - "5f3703b810200020583703b010200041e8166a2217202d29030037030020" - "0041e0166a2214202e290300370300200041d8166a221c20042903003703" - "00200041d0166a22212051290300370300200041c8166a220c2043290300" - "370300200041c0166a2216203d2903003703002000202b2903003703b816" - "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" - "6a200041b0166a200041b0346a102f201720032903003703002014200229" - "0300370300201c20072903003703002021200d290300370300200c201129" - "03003703002016200b290300370300200041c0196a2208202f2903003703" - "00200041c8196a2228201e290300370300200041d0196a2234202a290300" - "370300200041d8196a22452029290300370300200041e0196a223d202529" - "0300370300200041e8196a2243200f290300370300200020002903b84e37" - "03b816200020002903b04e3703b016200020002903b0373703b019200020" - "002903b8373703b819200041e8226a202c290300370300200041e0226a20" - "1b290300370300200041d8226a2040290300370300200041d0226a204c29" - "0300370300200041c8226a204d290300370300200041c0226a204e290300" - "370300200020122903003703b822200020002903f0373703b022200041b0" - "196a200041b0376a2015102f2006200c2903003703002009201629030037" - "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" - "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d20132017290300370300201020142903003703002000" - "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" - "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "201120062903002256370300200b20092903002255370300200d20002903" - "b03d2254370300200220102903002253370300200720002903b83d225937" - "030020032013290300225a370300200020002903a80a225f3703b84e2000" - "20002903a00a22583703b04e2017205a37030020142053370300201c2059" - "37030020212054370300200c2056370300201620553703002000205f3703" - "b816200020583703b016200041e81c6a2217202c290300370300200041e0" - "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" - "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" - "200041c01c6a2216204e290300370300200020122903003703b81c200020" - "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" - "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" - "282029290300370300200041d01f6a221b202a290300370300200041c81f" - "6a2234201e290300370300200041c01f6a2240202f290300370300200020" - "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" - "b0376a2018102f2006200c29030037030020092016290300370300200020" - "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" - "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d20132017290300370300201020142903003703002000201c290300" - "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" - "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" - "03002256370300200b20092903002255370300200d20002903b03d225437" - "0300200220102903002253370300200720002903b83d2259370300200320" - "13290300225a370300200020002903a80a225f3703b84e200020002903a0" - "0a22583703b04e2017205a37030020142053370300201c20593703002021" - "2054370300200c2056370300201620553703002000205f3703b81c200020" - "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" - "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" - "200329030037030020192002290300370300200e20072903003703002032" - "200d290300370300203a20112903003703002030200b2903003703002000" - "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" - "0041b0316a200041b0346a102f201a200329030037030020192002290300" - "370300200e20072903003703002032200d290300370300203a2011290300" - "3703002030200b290300370300200041c0256a202f290300370300200041" - "c8256a201e290300370300200041d0256a202a290300370300200041d825" - "6a2029290300370300200041e0256a2025290300370300200041e8256a20" - "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" - "31200020002903b0373703b025200020002903b8373703b825200041b025" - "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" - "41b0256a1030201a200329030037030020192002290300370300200e2007" - "2903003703002032200d290300370300203a20112903003703002030200b" - "290300370300200020002903b84e3703b831200020002903b04e3703b031" - "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" - "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" - "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" - "03002254370300200041d02e6a222f200041e03d6a221829030022533703" - "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" - "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" - "0300200041c8286a220e2059370300200041d0286a221920533703002000" - "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" - "22142056370300200020002903c03d22563703b02e200020563703b02820" - "00201329030022563703b82e200020563703b828200041b0286a20102000" - "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" - "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" - "220c2018290300370300200041c82b6a2216200f290300370300200041c0" - "2b6a22082025290300370300200020132903003703b82b200020002903c0" - "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" - "0041b01c6a102f2003201429030037030020022017290300370300200720" - "1a290300370300200d20192903003703002011200e290300370300200b20" - "32290300370300202220002903b82b370300202320082903003703002024" - "2016290300370300204f200c2903003703002027202a290300370300203f" - "2021290300370300203e201c290300370300200020002903b8283703b84e" - "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" - "00370300204820292903003703002047201e2903003703002041202f2903" - "00370300204220302903003703002037203a290300370300203620002903" - "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" - "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" - "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" - "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" - "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" - "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" - "103f200742003703002002420037030020034200370300200042a9c0c689" - "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" - "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" - "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" - "0742003703002002420037030020034200370300200042003703c84e2000" - "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" - "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" - "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" - "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" - "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" - "3703002015200041e8c6006a290300370300200920002903b84037030020" - "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" - "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" - "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" - "370300200041a83e6a200041e8c0006a2206290300370300200020002903" - "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" - "200742003703002002420037030020034200370300200042a9c0c689aece" - "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" - "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" - "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" - "3703002013420037030020064200370300200042003703c840200042ac97" - "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" - "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" - "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" - "370300201120004188c8006a290300370300200d20004190c8006a290300" - "370300200720004198c8006a2903003703002002200041a0c8006a290300" - "3703002003200041a8c8006a290300370300202220002903b83a37030020" - "2320492903003703002024204a290300370300204f205029030037030020" - "272039290300370300203f203c290300370300203e204429030037030020" - "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" - "002903b03a3703f04e20394200370300203c420037030020444200370300" - "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" - "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" - "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" - "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" - "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" - "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" - "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" - "039007200041a00a6a200d418003104c1a200042003703c8492000420037" - "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" - "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" - "03200041286a210b0340200041206a200341ff0071104f200b2903002000" - "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" - "20200229030083215520074101710440200041a00d6a200041b0ce006a10" - "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" - "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" - "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" - "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" - "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" - "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" - "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" - "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" - "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" - "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" - "562000290310200229030083215520074101710440200041a00d6a200041" - "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" - "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" - "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" - "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" - "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" - "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" - "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" - "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" - "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" - "8321562000290300200229030083215520074101710440200041a00d6a20" - "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" - "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" - "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" - "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" - "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" - "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" - "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" - "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" - "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" - "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" - "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" - "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" - "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" - "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" - "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" - "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" - "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" - "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" - "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" - "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" - "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" - "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" - "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" - "6a200041a00d6a102f2002420037030020074200370300200b4200370300" - "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" - "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" - "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" - "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" - "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" - "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" - "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" - "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" - "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" - "6a29030037030020004198ca006a200041d8ce006a220629030037030020" - "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" - "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" - "03b82e3703b849200020002903b04e3703f0492002420037030020074200" - "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" - "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" - "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" - "200041b0306a200041a00d6a102f20064200370300200942003703002015" - "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" - "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" - "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" - "41b00d6a220620004180306a290300370300200041b80d6a220920004188" - "306a290300370300200041c00d6a221520004190306a2903003703002002" - "20004198306a2903003703002007200041a0306a290300370300200b2000" - "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" - "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" - "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" - "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" - "00370300200041980e6a200041e8c6006a220b2903003703002000200029" - "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" - "3703e00d2002420037030020074200370300200b4200370300200042a9c0" - "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" - "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" - "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" - "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" - "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" - "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" - "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" - "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" - "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" - "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" - "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" - "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" - "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" - "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" - "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" - "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" - "006a200041b0c3006a103f2009290300215620002903b00d215520004190" - "076a201541f002104c1a20384184016a2103024002400240024002400240" - "0340200341046b280200220204402003280200220b41046b280200220741" - "7871220d200241c0016c220241044108200741037122071b72490d022007" - "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" - "6b22460d000b200028025422030440203841046b28020022024178712207" - "20034190016c220341044108200241037122021b72490d03200241002007" - "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" - "0200220241787122072003410674220341044108200241037122021b7249" - "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" - "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" - "18200341e4a1c0001010000b203841046b28020022024178712207200341" - "90016c220341044108200241037122021b72490d02200241002007200341" - "276a4b1b0d03203810040b200028024822030440200541046b2802002202" - "41787122072003410674220341044108200241037122021b72490d042002" - "4100200720034127724b1b0d05200510040b42002156420121550b203120" - "5637030820312055370300203141106a20004190076a41f002104c1a2000" - "28023c22030440203341046b28020022024178712207200341c0016c2203" - "41044108200241037122021b72490d0520024100200720034127724b1b0d" - "06203310040b200028023022030440203b41046b28020022024178712207" - "200341e0006c220341044108200241037122021b72490d07200241002007" - "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" - "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" - "1011000b200141f0066a41f002104b1a200142003703e806200142013703" - "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" - "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" - "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" - "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" - "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" - "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" - "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" - "05417871221241044108200541037122051b20026a490d0c200541002012" - "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" - "05410674100e0c040b206a428080808010540d0020122005100e0b202041" - "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" - "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" - "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" - "04201d41046b280200220541787141e40041e800200541037122061b490d" - "162006410020054188014f1b0d17201d1004200a41046b28020022054178" - "71221d418802418c02200541037122051b490d1820054100201d41ac024f" - "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" - "200541003602182005410136020c200541a099c000360208200542043702" - "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" - "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" - "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" - "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" - "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" - "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" - "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" - "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" - "0204200241643602002002410236020c200241b884c00036020820024202" - "3702142002200241046aad4280808080108437032820022002ad42808080" - "8010843703202002200241206a360210200241086a41cc90c000101a000b" - "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" - "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" - "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" - "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" - "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" - "97c0001011000b962502087f017e02400240024002400240024002402000" - "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" - "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" - "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" - "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" - "04410620014108766722006b7641017120004101746b413e6a21070b4100" - "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" - "0b410021002004411920074101766b41002007411f471b74210503400240" - "200328020441787122062004490d00200620046b220620014f0d00200321" - "02200622010d0041002101200321000c060b200328021422062000200620" - "032005411d764104716a41106a2802002203471b200020061b2100200541" - "0174210520030d000b0c030b02402000417f7341017120016a2205410374" - "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" - "402002200436020c200420023602080c010b418ca9c0002003417e200577" - "713602000b20012000410372360204200020016a22002000280204410172" - "360204200141086a0f0b0240200020017441022001742200410020006b72" - "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" - "28020822054704402005200236020c200220053602080c010b418ca9c000" - "2003417e200677713602000b20002004410372360204200020046a220520" - "0120046b2204410172360204200020016a20043602004194a9c000280200" - "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" - "8ca9c00028020022064101200341037674220371450440418ca9c0002003" - "20067236020020020c010b20022802080b21032002200136020820032001" - "36020c2001200236020c200120033602080b419ca9c00020053602004194" - "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" - "220228020441787120046b21012002210302400340024002402002280210" - "22000d00200228021422000d002003280218210702400240200320032802" - "0c2200460440200341144110200328021422001b6a28020022020d014100" - "21000c020b20032802082202200036020c200020023602080c010b200341" - "146a200341106a20001b21050340200521062002220041146a200041106a" - "200028021422021b210520004114411020021b6a28020022020d000b2006" - "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" - "020047044020074110411420072802102003461b6a20003602002000450d" - "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" - "200328021c77713602000c030b200028020441787120046b220220012001" - "20024b22021b21012000200320021b2103200021020c010b0b2000200736" - "021820032802102202044020002002360210200220003602180b20032802" - "142202450d0020002002360214200220003602180b02400240200141104f" - "044020032004410372360204200320046a22042001410172360204200120" - "046a20013602004194a9c0002802002205450d0120054178714184a7c000" - "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" - "037674220571450440418ca9c000200520067236020020020c010b200228" - "02080b2105200220003602082005200036020c2000200236020c20002005" - "3602080c010b2003200120046a2200410372360204200020036a22002000" - "2802044101723602040c010b419ca9c00020043602004194a9c000200136" - "02000b200341086a0f0b2000200272450440410021024102200774220041" - "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" - "0b2000450d010b03402002200020022000280204417871220320046b2206" - "20014922071b200320044922051b210220012006200120071b20051b2101" - "20002802102203047f20030520002802140b22000d000b0b2002450d0020" - "044194a9c00028020022004d2001200020046b4f710d0020022802182107" - "024002402002200228020c2200460440200241144110200228021422001b" - "6a28020022030d01410021000c020b20022802082203200036020c200020" - "033602080c010b200241146a200241106a20001b21050340200521062003" - "220041146a200041106a200028021422031b210520004114411020031b6a" - "28020022030d000b200641003602000b02402007450d0002402002200228" - "021c41027441f4a5c0006a22032802004704402007411041142007280210" - "2002461b6a20003602002000450d020c010b2003200036020020000d0041" - "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" - "0736021820022802102203044020002003360210200320003602180b2002" - "2802142203450d0020002003360214200320003602180b0240200141104f" - "044020022004410372360204200220046a22042001410172360204200120" - "046a200136020020014180024f0440411f210020044200370210200141ff" - "ffff074d04402001410620014108766722006b7641017120004101746b41" - "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" - "22054190a9c0002802007145044020032004360200200420033602182004" - "200436020c200420043602084190a9c0004190a9c0002802002005723602" - "000c030b0240024020012003280200220528020441787146044020052100" - "0c010b2001411920004101766b41002000411f471b742103034020052003" - "411d764104716a41106a22062802002200450d0220034101742103200021" - "0520002802044178712001470d000b0b20002802082201200436020c2000" - "2004360208200441003602182004200036020c200420013602080c030b20" - "062004360200200420053602182004200436020c200420043602080c020b" - "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" - "41037674220171450440418ca9c000200120037236020020000c010b2000" - "2802080b2101200020043602082001200436020c2004200036020c200420" - "013602080c010b2002200120046a2200410372360204200020026a220020" - "002802044101723602040b200241086a0f0b024002400240024002400240" - "20044194a9c00028020022004b044020044198a9c00028020022004f0440" - "41002100200441af80046a220241107640002201417f4622050d07200141" - "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" - "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" - "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" - "4020002802002202200028020422056a2003460d02200028020822000d00" - "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" - "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" - "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" - "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" - "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" - "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" - "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" - "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" - "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" - "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" - "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" - "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" - "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" - "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" - "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" - "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" - "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" - "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" - "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" - "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" - "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" - "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" - "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" - "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" - "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" - "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" - "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" - "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" - "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" - "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" - "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" - "0036020020032000410172360204200020036a412836020441aca9c00041" - "808080013602000c080b200120034f0d0020012002490d00200028020c45" - "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" - "0320066a210241f4a6c00021000240024003402002200028020022054704" - "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" - "034002402001200028020022024f04402001200220002802046a2202490d" - "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" - "41286b220036020020032000410172360204200020036a412836020441ac" - "a9c00041808080013602002001200241206b41787141086b220020002001" - "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" - "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" - "200336020041fca6c000200541086a3602004180a7c00041003602002005" - "411c6a2100034020004107360200200041046a22002002490d000b200120" - "05460d0720052005280204417e713602042001200520016b220041017236" - "02042005200036020020004180024f04402001200010350c080b200041f8" - "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" - "220071450440418ca9c000200020037236020020020c010b20022802080b" - "2100200220013602082000200136020c2001200236020c20012000360208" - "0c070b200020033602002000200028020420066a36020420032004410372" - "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" - "a9c000280200460d032002419ca9c000280200460d042002280204220441" - "037141014604402002200441787122041016200120046a2101200220046a" - "220228020421040b20022004417e71360204200020014101723602042000" - "20016a200136020020014180024f04402000200110350c060b200141f801" - "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" - "0171450440418ca9c000200120027236020020040c010b20042802080b21" - "01200420003602082001200036020c2000200436020c200020013602080c" - "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" - "220020046a22023602002002200141017236020420002004410372360204" - "200041086a21000c060b419ca9c00028020021010240200020046b220241" - "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" - "72360204200020016a220020002802044101723602040c010b4194a9c000" - "2002360200419ca9c000200120046a220336020020032002410172360204" - "200020016a2002360200200120044103723602040b200141086a0f0b2000" - "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" - "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" - "22016a41086a220336020020022003410172360204200020016a41283602" - "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" - "c0004198a9c00028020020016a2201360200200020014101723602040c01" - "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" - "020020002001410172360204200020016a20013602000b200341086a0f0b" - "410021004198a9c000280200220120044d0d004198a9c000200120046b22" - "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" - "0141017236020420002004410372360204200041086a0f0b20000bc60602" - "037f037e230041a0026b22032400200341286a41c100104b210420034118" - "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" - "41086a41e08bc00029030037030020034200370320200341d88bc0002903" - "003703000240200241c0004f0440200320024106762205ad370320200320" - "01200510272004200120024140716a2002413f712202104c1a0c010b2004" - "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" - "034198016a220120032d00d80122026a22044180013a00002002ad220742" - "3b862003290390012206420986220820074203868422074280fe03834228" - "86842007428080fc0783421886200742808080f80f834208868484200642" - "018642808080f80f832006420f88428080fc0783842006421f884280fe03" - "8320084238888484842106024002402002413f470440200441016a200241" - "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" - "4190026a420037030020034188026a420037030020034180026a42003703" - "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" - "00370300200342003703e0012003200637039802200341f0006a200341e0" - "016a410110270c010b200320063703d001200341f0006a2001410110270b" - "2000200328028c01220241187420024180fe037141087472200241087641" - "80fe03712002411876727236001c20002003280288012202411874200241" - "80fe03714108747220024108764180fe0371200241187672723600182000" - "200328028401220241187420024180fe03714108747220024108764180fe" - "0371200241187672723600142000200328028001220241187420024180fe" - "03714108747220024108764180fe03712002411876727236001020002003" - "28027c220241187420024180fe03714108747220024108764180fe037120" - "02411876727236000c20002003280278220241187420024180fe03714108" - "747220024108764180fe0371200241187672723600082000200328027422" - "0241187420024180fe03714108747220024108764180fe03712002411876" - "727236000420002003280270220241187420024180fe0371410874722002" - "4108764180fe037120024118767272360000200341a0026a24000bee0201" - "077f024020012802042202450440410021020c010b200128021021062001" - "200220022001280208220320022003491b22046b36020420012001280200" - "220720046a360200027f0240024002400240027f02400240024020030440" - "200128020c2208410174210520072d0000220241c1006b41ff0171410649" - "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" - "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" - "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" - "01714106490d01200241e1006b41ff01714106490d02200241306b220441" - "ff0171410a490d0420054101720b21032006200241ff0171360200200620" - "0541807e71200341ff01717236020441000c040b200241376b21040c020b" - "200241d7006b21040c010b4101410141948bc0001010000b200420034104" - "7472210341010b21022001200841016a36020c0b200020033a0001200020" - "023a00000bb40801057f200041086b2201200041046b2802002203417871" - "22006a21020240024020034101710d002003410271450d01200128020022" - "0320006a2100200120036b2201419ca9c000280200460440200228020441" - "03714103470d014194a9c000200036020020022002280204417e71360204" - "20012000410172360204200220003602000f0b2001200310160b02400240" - "0240024002400240024020022802042203410271450440200241a0a9c000" - "280200460d022002419ca9c000280200460d032002200341787122031016" - "2001200020036a2200410172360204200020016a20003602002001419ca9" - "c000280200470d014194a9c00020003602000f0b20022003417e71360204" - "20012000410172360204200020016a20003602000b2000418002490d0241" - "1f210220014200370210200041ffffff074d044020004106200041087667" - "22026b7641017120024101746b413e6a21020b2001200236021c20024102" - "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" - "01360200200120033602182001200136020c200120013602084190a9c000" - "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" - "c0004198a9c00028020020006a220036020020012000410172360204419c" - "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" - "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" - "410021034198a9c00028020022054129490d0441f4a6c000210103402000" - "200128020022024f04402000200220012802046a490d060b200128020821" - "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" - "006a220036020020012000410172360204200020016a20003602000f0b20" - "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" - "037674220071450440418ca9c000200020037236020020020c010b200228" - "02080b2100200220013602082000200136020c2001200236020c20012000" - "3602080f0b02400240200020032802002204280204417871460440200421" - "020c010b2000411920024101766b41002002411f471b7421030340200420" - "03411d764104716a41106a22052802002202450d02200341017421032002" - "210420022802044178712000470d000b0b20022802082200200136020c20" - "022001360208200141003602182001200236020c200120003602080c010b" - "20052001360200200120043602182001200136020c200120013602080b41" - "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" - "a6c000280200220004400340200141016a2101200028020822000d000b0b" - "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" - "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" - "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" - "000b0b810802077f067e230041c0026b2203240020034198026a20024118" - "6a290300220a37030020034190026a200241106a290300220d3703002003" - "200241086a290300220b3703880220032002290300220c3703800242ddb0" - "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" - "290300220a370300200341b8026a2205200141186a290300220d37030020" - "032001290300220b3703a0022003200141086a290300220c3703a8022003" - "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" - "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" - "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" - "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" - "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" - "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" - "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" - "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" - "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" - "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" - "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" - "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" - "80026a200341a0016a104a45044020034180016a22042002290300370100" - "20034198016a2205200241186a29030037010020034190016a2206200241" - "106a29030037010020034188016a2207200241086a290300370100200341" - "f8006a2202200141186a290300370100200341f0006a2208200141106a29" - "0300370100200341e8006a2209200141086a290300370100200320012903" - "00370160200341ca006a22012005290100370100200341c2006a22052006" - "2901003701002003413a6a22062007290100370100200341326a22072004" - "2901003701002003412a6a22042002290100370100200341226a22022008" - "2901003701002003411a6a22082009290100370100200320032901603701" - "12200041c8006a2001290100370100200041406b20052901003701002000" - "41386a2006290100370100200041306a2007290100370100200041286a20" - "04290100370100200041206a2002290100370100200041186a2008290100" - "3701002000200329011237011041000c010b200041003a000141010b3a00" - "00200341c0026a24000baa0401047e2001290010220242388620024280fe" - "0383422886842002428080fc0783421886200242808080f80f8342088684" - "84200242088842808080f80f832002421888428080fc0783842002422888" - "4280fe038320024238888484842104200141186a29000022024238862002" - "4280fe0383422886842002428080fc0783421886200242808080f80f8342" - "08868484200242088842808080f80f832002421888428080fc0783842002" - "4228884280fe0383200242388884848421050240417f2001290000220242" - "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" - "008584420052200342388620034280fe0383422886842003428080fc0783" - "421886200342808080f80f834208868484200342088842808080f80f8320" - "03421888428080fc07838420034228884280fe0383200342388884848422" - "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" - "02428080fc0783421886200242808080f80f834208868484200242088842" - "808080f80f832002421888428080fc07838420024228884280fe03832002" - "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" - "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" - "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" - "1b0d010b2000200337032020002005370310200020023703282000200437" - "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" - "7f027e230041d0066b2203240020034188036a200241386a290300370300" - "20034180036a200241306a290300370300200341f8026a200241286a2903" - "00370300200341f0026a2204200241206a290300370300200341e8026a20" - "0241186a290300370300200341e0026a200241106a290300370300200320" - "022903003703d0022003200241086a2903003703d802200341d0026a2002" - "2002102f200341a0036a200141106a290300370300200341a8036a200141" - "186a290300370300200341b0036a200141206a290300370300200341b803" - "6a200141286a290300370300200341c0036a200141306a29030037030020" - "0341c8036a200141386a2903003703002003200129030037039003200320" - "0141086a2903003703980320034190036a20012001102f200341d0006a20" - "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" - "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" - "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" - "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" - "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" - "6a20034190056a103002400240200341d0026a200341106a104a45044020" - "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" - "370300200341c0026a4200370300200341b8026a4200370300200341b002" - "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" - "00370300200341a8016a200141186a290300370300200341b0016a200141" - "206a290300370300200341b8016a200141286a290300370300200341c001" - "6a200141306a290300370300200341c8016a200141386a29030037030020" - "0342003703a00220032001290300370390012003200141086a2903003703" - "980120034188026a200241386a29030037030020034180026a200241306a" - "290300370300200341f8016a200241286a290300370300200341f0016a20" - "0241206a290300370300200341e8016a200241186a290300370300200341" - "e0016a200241106a290300370300200341d8016a200241086a2903003703" - "0020034201370390022003420037039802200320022903003703d0012003" - "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" - "00200341f8036a420037030020034180046a420037030020034188046a42" - "00370300200342003703d003200342003703d803200342a9c0c689aece93" - "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" - "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" - "00104b1a2003420037039804200342013703900441ff0121040340200320" - "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" - "ff01716a2206290308832107200329030020062903008321082005044020" - "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" - "1a0b2007200884420052044020034190056a200341d0036a20034190016a" - "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" - "2204417f470d000b20034190056a200341d0036a20034190016a10440240" - "20032903900620034198066a290300844200520d0020032903a006200341" - "a8066a290300844200520d0020032903b006200341b8066a290300844200" - "520d0020032903c006200341c8066a290300844200520d00200341c8056a" - "200141386a290300370300200341c0056a200141306a2903003703002003" - "41b8056a200141286a290300370300200341b0056a200141206a29030037" - "0300200341a8056a200141186a290300370300200341a0056a200141106a" - "290300370300200341d8056a200241086a290300370300200341e0056a20" - "0241106a290300370300200341e8056a200241186a290300370300200341" - "f0056a200241206a290300370300200341f8056a200241286a2903003703" - "0020034180066a200241306a29030037030020034188066a200241386a29" - "03003703002003200129030037039005200320022903003703d005200320" - "0141086a29030037039805200041106a20034190056a418001104c1a2000" - "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" - "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" - "022d001021072000027f024020022d0030220841c101470440200235011a" - "2109200233011e210a2002290112211620022903202114200241d8006a22" - "01200241286a29030022173703002002201437035020022009200a422086" - "842219421086201642308884220937034820022007ad42ff018320164210" - "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" - "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" - "0b200954ad220920022903487c220a200954ad220c20022903507c220942" - "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" - "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" - "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" - "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" - "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" - "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" - "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" - "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" - "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" - "470440230041e0006b220324004190aac0004190aac0002d000022044101" - "20041b3a00000240200404400340024002400240200441ff017141016b0e" - "03000501020b03404190aac0002d000022044101460d000b024002402004" - "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" - "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" - "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" - "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" - "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" - "220142003703002003420037033020034200370328200342043703202003" - "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" - "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" - "200341206a200341406b103a200320032903202003290328200329033020" - "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" - "c00041023a00004188aac00020042903003703004180aac0002005290300" - "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" - "200341e0006a24000b20024198016a4188aac00029030037030020024190" - "016a4180aac000290300370300200241f8a9c00029030037038801200241" - "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" - "210c0340200220024180016a200141037641f0ffffff01716a2205290300" - "2005290308200141ff0071104e200241286a2205200b3703002002200937" - "03202002200c3703182002200a370310200241106a200a200c2009200b42" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" - "0229032021092002290318210c2002290310210a20022802004101710440" - "2005200b370300200220093703202002200a3703102002200c3703182002" - "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f102b2005290300210b2002290318210c200229032021092002290310" - "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" - "20093703202002200c3703182002200a370310200241106a2010200d200f" - "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" - "0378200220093703702002200c3703682002200a370360200241e0006a20" - "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" - "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" - "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" - "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" - "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" - "030041d8a9c000290300102d2002290388012110200229038001210d0240" - "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" - "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" - "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" - "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" - "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" - "0d010b2002200f3703202002200d37031020022009370328200220103703" - "18027e0240200241e0006a200241106a104a0440420021104200210f4200" - "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" - "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" - "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" - "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" - "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" - "0e201554200b201054200b2010511b200c200f542009200a562009200a51" - "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" - "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" - "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" - "40024002400240417f201b420052200f2012562009200d562009200d511b" - "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" - "85200b201085844200520b4101460d010b200841c001470d014200210942" - "00210a4200210b4200210c2011201284200d20138484500d04427f420042" - "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" - "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" - "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" - "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" - "20117d21090c040b2008418001460d010b201121092013210a2012210b20" - "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" - "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" - "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" - "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" - "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" - "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" - "2014370320200020163701122000200b3703402000200937033020002006" - "3a0011200020073a0010200020193e011a200020173703282000200c3703" - "482000200a3703382000411e6a20194220883d010041000c020b20002006" - "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" - "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" - "0620022d00f0042107024002400240024020022d009005220941c1014704" - "4020024198016a220520022901fa04370300200241a6016a220420024188" - "056a2203290100370100200241a0016a220820024182056a290100370300" - "200220022901f20437039001200241f0046a200141206a102e20022d00f0" - "04450440200241d5076a2003290300220c37000020024188016a20024198" - "056a290300220b37030020024180016a20024190056a290300220a370300" - "200241c8006a200b370300200241406b200a370300200220022903800522" - "0b3703702002200c3703782002200b3703302002200c370338200220063a" - "0051200220073a0050200241e8006a22012004290100370100200241e200" - "6a2008290300370100200241da006a200529030037010020022002290390" - "01370152200941c000460d0220024180026a200241406b29030037030020" - "024188026a200241c8006a29030037030020024190026a200241d0006a29" - "030037030020024198026a200241d8006a290300370300200241a0026a20" - "0241e0006a290300370300200241a8026a20012903003703002002200229" - "03303703f001200220022903383703f801200241f0016a200241306a2002" - "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" - "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" - "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" - "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" - "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" - "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" - "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" - "002204410120041b3a00000240200404400340024002400240200441ff01" - "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" - "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" - "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" - "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" - "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" - "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" - "200341386a22014200370300200342003703302003420037032820034204" - "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" - "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" - "903c370340200341206a200341406b103a20032003290320200329032820" - "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" - "200829030037030041d8aac000200329030837030041d0aac00020032903" - "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" - "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" - "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" - "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" - "046a200141037641f0ffffff01716a22052903002005290308200141ff00" - "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" - "0e3703e0072002200d3703d807200220103703d007200220113703c80720" - "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" - "082002200e3703a0082002200d3703980820022010370390082002201137" - "0388082002200b370380082002280220210520024180076a200241c0076a" - "20024180086a102f20024198076a290300210d2004290300210f20032903" - "00210a2002290388072111200229038007210b2002290390072110200229" - "03a007210e20022903b007210c200541017104402002200a3703b8082002" - "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" - "200220103703900820022011370388082002200b37038008200241c0076a" - "20024180086a200241b0016a102f200241e8076a290300210f200241f807" - "6a290300210a20022903c007210b20022903d007211020022903e007210e" - "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" - "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" - "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" - "02200d3703c802200220113703b802200241f0026a200241b0026a200241" - "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" - "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" - "000240200104400340024002400240200141016b0e03000501020b034041" - "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" - "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" - "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" - "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" - "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" - "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" - "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" - "00370300200241a8aac0002903003703c806200241a0aac0002903003703" - "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" - "034200210a4200210e4200210f420021104200210d420021110340200241" - "106a200241c0066a200141037641f0ffffff01716a220529030020052903" - "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" - "03e8072002200e3703e0072002200d3703d807200220103703d007200220" - "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" - "02200f3703a8082002200e3703a0082002200d3703980820022010370390" - "0820022011370388082002200b370380082002280210210520024180076a" - "200241c0076a20024180086a102f20024198076a290300210d2004290300" - "210f2003290300210a2002290388072111200229038007210b2002290390" - "07211020022903a007210e20022903b007210c200541017104402002200a" - "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" - "200d37039808200220103703900820022011370388082002200b37038008" - "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" - "0f200241f8076a290300210a20022903c007210b20022903d00721102002" - "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" - "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" - "03a00820022010370390082002200b370380082002200a3703b808200220" - "0f3703a8082002200d370398082002201137038808200241f0036a200241" - "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" - "22054200370300200241b8086a22044200370300200242a9c0c689aece93" - "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" - "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" - "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" - "4020024190046a2003104a450d010b200142003703002005420037030020" - "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" - "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" - "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" - "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" - "6a4200370300200241a0086a4200370300200241a8086a42003703002002" - "41b0086a4200370300200241b8086a420037030020024200370388084201" - "210b20024201370380082002420037039008200241c0066a200241b0036a" - "20024180086a103041a0abc0002d00004102470440230041e0006b220324" - "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" - "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" - "002d000022044101460d000b02400240200441016b0e03000601030b000b" - "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" - "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" - "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" - "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" - "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" - "03302003420037032820034202370320200342a9c0c689aece93b2303703" - "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" - "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" - "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" - "20042903003703004190abc00020082903003703004188abc00020032903" - "083703004180abc00020032903003703000b200341e0006a24000b200241" - "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" - "0020024188abc0002903003703d80420024180abc0002903003703d00441" - "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" - "210f420021104200210d4200211103402002200241d0046a200141037641" - "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" - "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" - "0d3703d807200220103703d007200220113703c8072002200b3703c00720" - "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" - "082002200d37039808200220103703900820022011370388082002200b37" - "0380082002280200210520024180076a200241c0076a20024180086a102f" - "20024198076a290300210d2004290300210f2003290300210a2002290388" - "072111200229038007210b200229039007211020022903a007210e200229" - "03b007210c200541017104402002200a3703b8082002200c3703b0082002" - "200f3703a8082002200e3703a0082002200d370398082002201037039008" - "20022011370388082002200b37038008200241c0076a20024180086a2002" - "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" - "2903c007210b20022903d007211020022903e007210e20022903f007210c" - "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" - "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" - "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" - "0220113703880620024180056a20024180066a200241f0026a102f0c050b" - "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" - "0c040b200020063a0002200020073a0001200041013a00000c030b200241" - "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" - "200241e0066a4200370300200241d8066a4200370300200242003703d006" - "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" - "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" - "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" - "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" - "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" - "0241f0046a200241c0066a10310240024020022802f00441017104402002" - "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" - "056a2204290300370300200241a8086a2203200241a8056a220629030037" - "0300200241a0086a200241a0056a29030037030020024198086a20024198" - "056a220729030037030020024190086a20024190056a2903003703002002" - "20022903800537038008200220024188056a290300370388082002418006" - "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" - "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" - "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" - "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" - "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" - "f0046a200241c0066a103120022802f004410171450d0120012005290300" - "370300200241b0086a200429030037030020032006290300370300200241" - "a0086a200241a0056a29030037030020024198086a200729030037030020" - "024190086a20024190056a29030037030020022002290380053703800820" - "0220024188056a2903003703880820024180076a200241c0076a20024180" - "086a102f200241f0046a20024180066a20024180076a100720022d00f004" - "4101460d02200041106a20024180056a418001104c1a200041003a00000c" - "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" - "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" - "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" - "4200370300200242003703b808200242003703b008200242003703a80820" - "0242013703a0082002420037038808200242003703800820024180056a20" - "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" - "6a290300210c20022903a005210f20022903b005210b200229039005220d" - "20022903800522158420024198056a290300221220024188056a29030022" - "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" - "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" - "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" - "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" - "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" - "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" - "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" - "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" - "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" - "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" - "0240417f200b201085200a200c8584420052200b201054200a200c56200a" - "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" - "201485200e2011858442005221010b2019211c2017211d2018211a201621" - "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" - "0b027e200d20188520122016858450044020152019542013201754201320" - "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" - "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" - "1e200e211f200b2120200c212120192115201721132018210d2016211220" - "14210f2011210e2010210b200a210c0b200041186a200229037837030020" - "0020022903703703102000200229039001370132200041286a2002418801" - "6a290300370300200041206a20024180016a2903003703002000413a6a20" - "024198016a290300370100200041c2006a200241a0016a29030037010020" - "0041c8006a200241a6016a29010037010020094180014604402000202037" - "0380012000201e3703702000201a3703602000201c370350200020063a00" - "31200020073a0030200041003a000020002021370388012000201f370378" - "2000201b3703682000201d3703580c010b2000200b370380012000200f37" - "03702000200d37036020002015370350200020063a0031200020073a0030" - "200041003a00002000200c370388012000200e3703782000201237036820" - "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" - "022400200241386a4200370300200241306a4200370300200241286a4200" - "370300200241206a22034200370300200241186a4200370300200241106a" - "4200370300200241d8006a4200370300200241e0006a4200370300200241" - "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" - "200242003703482002420137034020024200370308200242003703002002" - "420037035002400240024020012002104a0d00200141206a2003104a0d00" - "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" - "010b200141f8006a290300210e200141e8006a2903002106200129037021" - "0c2001290360210d200129035022042001290340220884200141d8006a29" - "0300220b200141c8006a290300220984844200520440427f4200427f4200" - "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" - "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" - "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" - "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" - "21070b4200210442002108420021094200210b200c200d842006200e8484" - "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" - "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" - "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" - "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" - "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" - "20002005370350200020073703402000200b370378200020083703682000" - "200a3703582000200f37034820002001290300370300200041386a200141" - "386a290300370300200041306a200141306a290300370300200041286a20" - "0141286a290300370300200041206a200141206a29030037030020004118" - "6a200141186a290300370300200041106a200141106a2903003703002000" - "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" - "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" - "411c6a1001220045044041000f0b200041086b210102402000410f714504" - "40200121000c010b200041046b220528020022064178712000410f6a4170" - "7141086b2200200020016b4111494104746a220020016b22026b21032006" - "410371044020002003200028020441017172410272360204200020036a22" - "032003280204410172360204200520022005280200410171724102723602" - "00200120026a220320032802044101723602042001200210170c010b2001" - "2802002101200020033602042000200120026a3602000b02402000280204" - "2201410371450d0020014178712202200441106a4d0d0020002004200141" - "017172410272360204200020046a2201200220046b220441037236020420" - "0020026a220220022802044101723602042001200410170b200041086a0b" - "de0a01047f230041f0026b22032400200341a8026a220442003703002003" - "41a0026a22054200370300200342003703c802200342003703c002200342" - "003703b802200342013703b0022003420037039802200342003703900220" - "0341b0026a21060240024002400240200120034190026a104a4504402001" - "41206a2006104a450d010b20044200370300200542003703002003420037" - "03c802200342003703c002200342003703b802200342013703b002200342" - "00370398022003420037039002200220034190026a104a45044020024120" - "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" - "00370300200341a0026a4200370300200342003703c802200342003703c0" - "02200342003703b802200342013703b00220034200370398022003420037" - "039002027f0240200120034190026a104a450440200141206a200341b002" - "6a104a450d010b20042001290320370300200441186a200141386a290300" - "370300200441106a200141306a290300370300200441086a200141286a29" - "0300370300200341106a200141106a290300370300200341186a20014118" - "6a290300370300200320012903003703002003200141086a290300370308" - "200341d0006a0c010b20054200370300200341106a420037030020034118" - "6a4200370300200541086a4200370300200541106a420037030020054118" - "6a4200370300200342003703002003420037030820042105200341306a0b" - "210620034180016a2101200341a0016a2104200642003703082006420037" - "03002005420037030820054201370300200341a8026a4200370300200341" - "a0026a4200370300200342003703c802200342003703c002200342003703" - "b802200342013703b00220034200370398022003420037039002027f0240" - "200220034190026a104a450440200241206a200341b0026a104a450d010b" - "20012002290320370300200141186a200241386a29030037030020014110" - "6a200241306a290300370300200141086a200241286a2903003703002003" - "41f0006a200241106a290300370300200341f8006a200241186a29030037" - "0300200320022903003703602003200241086a290300370368200341b001" - "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" - "370300200441086a4200370300200441106a4200370300200441186a4200" - "37030020034200370360200342003703682001210420034190016a0b2205" - "420037030820054200370300200442003703082004420137030020034190" - "026a2003200341e0006a1040200341c0016a20034190026a104120032802" - "c001410171450d02200020032903d001370300200041386a20034188026a" - "290300370300200041306a20034180026a290300370300200041286a2003" - "41f8016a290300370300200041206a200341f0016a290300370300200041" - "186a200341e8016a290300370300200041106a200341e0016a2903003703" - "00200041086a200341d8016a2903003703000c030b200020022903003703" - "00200041386a200241386a290300370300200041306a200241306a290300" - "370300200041286a200241286a290300370300200041206a200241206a29" - "0300370300200041186a200241186a290300370300200041106a20024110" - "6a290300370300200041086a200241086a2903003703000c020b20002001" - "290300370300200041386a200141386a290300370300200041306a200141" - "306a290300370300200041286a200141286a290300370300200041206a20" - "0141206a290300370300200041186a200141186a29030037030020004110" - "6a200141106a290300370300200041086a200141086a2903003703000c01" - "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" - "7f067e230041e0006b22022400200241386a4200370300200241306a4200" - "370300200242003703582002420037035020024200370348420121042002" - "42013703402002420037032820024200370320027e02402001200241206a" - "104a450440200141206a200241406b104a450d010b200241106a20014110" - "6a290300370300200241186a200141186a29030037030020022001290300" - "3703002002200141086a290300370308200141286a290300210520012903" - "30210620012903202107200141386a2903000c010b42002104200241106a" - "4200370300200241186a4200370300200242003703002002420037030842" - "01210742000b210820004200370358200042003703502000200437034020" - "002006370330200020073703202000200229030037030020002003370348" - "2000200837033820002005370328200041086a2002290308370300200041" - "186a200241186a290300370300200041106a200241106a29030037030020" - "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" - "044108200241037122021b20016a4f0440200241002003200141276a4b1b" - "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" - "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" - "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" - "200241c0016a22034200370300200241b8016a4200370300200241b0016a" - "4200370300200241f8016a420037030020024180026a4200370300200241" - "88026a420037030020024190026a420037030020024198026a4200370300" - "200242003703e80142012105200242013703e001200242003703a8012002" - "42003703a001200242003703f0010240024002402001200241a0016a104a" - "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" - "41e0006a20024180026a104a450d010b200241106a420037030020024118" - "6a4200370300200241206a4200370300200241286a420037030020024140" - "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" - "00200241d0006a200141f0006a290300370300200241d8006a200141f800" - "6a2903003703002002420037030020024200370308200220012903503703" - "302002200141d8006a290300370338200141c8006a290300210620012903" - "40210720024198016a200141386a29030037030020024190016a20014130" - "6a29030037030020024188016a200141286a29030037030020024180016a" - "200141206a290300370300200241f8006a200141186a2903003703002002" - "41f0006a200141106a2903003703002002200141086a2903003703682002" - "20012903003703600c010b42002105200241f0006a4200370300200241f8" - "006a420037030020024180016a420037030020024188016a420037030020" - "024190016a420037030020024198016a4200370300200241406b42003703" - "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" - "00370300200241106a4200370300200241186a4200370300200241206a42" - "00370300200241286a420037030020024200370360200242003703682002" - "420037033020024200370338200242003703002002420037030842012107" - "0b2000200737034020002002290360370300200020022903303703502000" - "2006370348200041086a2002290368370300200041d8006a200229033837" - "0300200041386a20024198016a290300370300200041306a20024190016a" - "290300370300200041286a20024188016a290300370300200041206a2002" - "4180016a290300370300200041186a200241f8006a290300370300200041" - "106a200241f0006a290300370300200041e0006a200241406b2903003703" - "00200041e8006a200241c8006a290300370300200041f0006a200241d000" - "6a290300370300200041f8006a200241d8006a2903003703002000200437" - "0388012000200537038001200020022903003703900120004198016a2002" - "290308370300200041a0016a200241106a290300370300200041a8016a20" - "0241186a290300370300200041b0016a200241206a290300370300200041" - "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" - "0041306b2203240020032001360204200320003602002003410236020c20" - "0341c481c00036020820034202370214200342808080801022042003ad84" - "37032820032004200341046aad843703202003200341206a360210200341" - "086a2002101a000b4101017f230041206b22032400200341003602102003" - "4101360204200342043702082003200136021c2003200036021820032003" - "41186a36020020032002101a000b6801017f230041306b22032400200320" - "01360204200320003602002003410236020c2003418484c0003602082003" - "42023702142003200341046aad4280808080108437032820032003ad4280" - "80808010843703202003200341206a360210200341086a2002101a000b79" - "01017f230041406a220524002005200136020c2005200036020820052003" - "360214200520023602102005410236021c200541d881c000360218200542" - "023702242005200541106aad428080808020843703382005200541086aad" - "428080808030843703302005200541306a360220200541186a2004101a00" - "0b3601017f230041206b22012400200141003602182001410136020c2001" - "41d480c00036020820014204370210200141086a2000101a000bcc060105" - "7f0240024002400240200041046b22062802002207417871220441044108" - "200741037122051b20016a4f044020054100200141276a22082004491b0d" - "0102400240200241094f04402003100b22040d0141000f0b41102003410b" - "6a4178712003410b491b2101024020054504402001418002490d01200420" - "01410472490d01200420016b418180084f0d010c030b200041086b220220" - "046a2105024002400240200120044b0440200541a0a9c000280200460d03" - "2005419ca9c000280200460d02200528020422074102710d042007417871" - "220720046a22042001490d04200520071016200420016b22034110490d01" - "20062001200628020041017172410272360200200120026a220120034103" - "72360204200220046a220420042802044101723602042001200310172000" - "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" - "200120026a22012003410372360204200520052802044101723602042001" - "2003101720000f0b20062004200628020041017172410272360200200220" - "046a2201200128020441017236020420000f0b4194a9c00028020020046a" - "22042001490d010240200420016b2203410f4d0440200620074101712004" - "72410272360200200220046a220120012802044101723602044100210341" - "0021010c010b20062001200741017172410272360200200120026a220120" - "03410172360204200220046a2204200336020020042004280204417e7136" - "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" - "c00028020020046a220420014b0d070b20031001220145044041000f0b20" - "012000417c4178200628020022044103711b20044178716a220420032003" - "20044b1b104c21012000100420010f0b200420002001200320012003491b" - "104c210420062802002203417871220541044108200341037122031b2001" - "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" - "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" - "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" - "11000b20062001200741017172410272360200200120026a220320042001" - "6b22014101723602044198a9c000200136020041a0a9c000200336020020" - "000bf10201047f200028020c21020240024020014180024f044020002802" - "1821040240024020002002460440200041144110200028021422021b6a28" - "020022010d01410021020c020b20002802082201200236020c2002200136" - "02080c010b200041146a200041106a20021b210303402003210520012202" - "41146a200241106a200228021422011b210320024114411020011b6a2802" - "0022010d000b200541003602000b2004450d022000200028021c41027441" - "f4a5c0006a220128020047044020044110411420042802102000461b6a20" - "023602002002450d030c020b2001200236020020020d014190a9c0004190" - "a9c000280200417e200028021c77713602000c020b200028020822032002" - "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" - "0200417e200141037677713602000f0b2002200436021820002802102201" - "044020022001360210200120023602180b20002802142201450d00200220" - "01360214200120023602180b0ba90601047f200020016a21020240024020" - "0028020422034101710d002003410271450d012000280200220320016a21" - "01200020036b2200419ca9c0002802004604402002280204410371410347" - "0d014194a9c000200136020020022002280204417e713602042000200141" - "0172360204200220013602000c020b2000200310160b0240024002402002" - "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" - "00280200460d0320022003417871220310162000200120036a2201410172" - "360204200020016a20013602002000419ca9c000280200470d014194a9c0" - "0020013602000f0b20022003417e71360204200020014101723602042000" - "20016a20013602000b20014180024f0440411f2102200042003702102001" - "41ffffff074d04402001410620014108766722026b764101712002410174" - "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" - "027422044190a9c000280200714504402003200036020020002003360218" - "2000200036020c200020003602084190a9c0004190a9c000280200200472" - "3602000f0b02400240200120032802002204280204417871460440200421" - "020c010b2001411920024101766b41002002411f471b7421030340200420" - "03411d764104716a41106a22052802002202450d02200341017421032002" - "210420022802044178712001470d000b0b20022802082201200036020c20" - "022000360208200041003602182000200236020c200020013602080f0b20" - "052000360200200020043602182000200036020c200020003602080f0b20" - "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" - "037674220171450440418ca9c000200120037236020020020c010b200228" - "02080b2101200220003602082001200036020c2000200236020c20002001" - "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" - "6a2201360200200020014101723602042000419ca9c000280200470d0141" - "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" - "004194a9c0004194a9c00028020020016a22013602002000200141017236" - "0204200020016a20013602000b0b8e0201057f230041206b220324002000" - "2802002202417f460440410020011019000b410820024101742204200241" - "016a2205200420054b1b2204200441084d1b220441004804404100200110" - "19000b20032002047f2003200236021c2003200028020436021441010541" - "000b360218200341086a2105027f0240200341146a220228020404402002" - "280208220645044041bda9c0002d00001a0c020b20022802002006410120" - "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" - "20052002410120021b360204200520024536020020032802084101460440" - "20032802101a200328020c20011019000b200328020c2102200020043602" - "0020002002360204200341206a24000b0d002000450440200110140b000b" - "f40102027f017e230041106b22022400200241013b010c20022001360208" - "20022000360204230041106b22002400200241046a220129020021042000" - "200136020c20002004370204230041106b22022400200041046a22012802" - "00220028020c2103024002400240024020002802040e020001020b20030d" - "0141012100410021030c020b20030d002000280200220028020421032000" - "28020021000c010b20024180808080783602002002200136020c20012802" - "0822012d0008210020012d00091a2002410420001033000b200220033602" - "0420022000360200200128020822012d0008210020012d00091a20024105" - "20001033000b6801017f230041306b220324002003200136020420032000" - "3602002003410236020c200341e483c00036020820034202370214200320" - "0341046aad4280808080108437032820032003ad42808080801084370320" - "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" - "002102230041106b22072400410a2103024020024190ce00490440200221" - "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" - "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" - "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" - "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" - "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" - "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" - "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" - "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" - "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" - "210941012108410a20036b220a2001280214220241017122056a21062008" - "410020024104711b2108412b418080c40020051b21052001280200450440" - "4101200128021c22002001280220220320052008101d0d011a2000200920" - "0a200328020c1103000c010b0240024002402006200128020422004f0440" - "200128021c22002001280220220320052008101d450d0141010c040b2002" - "410871450d01200128021021022001413036021020012d0018210c410121" - "0b200141013a0018200128021c22032001280220220420052008101d0d02" - "200020066b41016a210002400340200041016b2200450d01200341302004" - "280210110200450d000b41010c040b410120032009200a200428020c1103" - "000d031a2001200c3a00182001200236021041000c030b20002009200a20" - "0328020c110300210b0c010b200020066b2102024002400240410120012d" - "0018220020004103461b220041016b0e020001020b20022100410021020c" - "010b20024101762100200241016a41017621020b200041016a2100200128" - "0210210620012802202103200128021c210402400340200041016b220045" - "0d01200420062003280210110200450d000b41010c020b4101210b200420" - "0320052008101d0d0020042009200a200328020c1103000d004100210003" - "40410020002002460d021a200041016a2100200420062003280210110200" - "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" - "380002402002418080c400460d00200020022001280210110200450d0041" - "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" - "0c7f20002802042107200028020021030240024020012802002209200128" - "0208220072044002402000410171450d00200320076a2106024020012802" - "0c2205450440200321020c010b200321020340200222002006460d02027f" - "200041016a20002c0000220241004e0d001a200041026a20024160490d00" - "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" - "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" - "07027f02402004450d00200420074f044020042007460d0141000c020b20" - "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" - "001b21030b2009450440200128021c20032007200128022028020c110300" - "0f0b2001280204210c200741104f044020072003200341036a417c712204" - "6b22086a220a41037121094100210541002100200320044704402008417c" - "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" - "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" - "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" - "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" - "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" - "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" - "4a6a21050b200a4102762106200020056a21050340200421092006450d04" - "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" - "200641044f04402004200d41f007716a2108200421000340200028020c22" - "04417f7341077620044106767241818284087120002802082204417f7341" - "077620044106767241818284087120002802042204417f73410776200441" - "06767241818284087120002802002204417f734107762004410676724181" - "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" - "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" - "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" - "6a22022802002200417f734107762000410676724181828408712100200b" - "4101460d0220022802042204417f73410776200441067672418182840871" - "20006a2100200b4102460d0220022802082202417f734107762002410676" - "7241818284087120006a21000c020b2007450440410021050c030b200741" - "03712102027f200741044904404100210041000c010b20032c000041bf7f" - "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" - "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" - "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" - "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" - "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" - "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" - "41016b22020d000b0c020b200128021c20032007200128022028020c1103" - "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" - "20056a21050b02402005200c490440200c20056b21060240024002402001" - "2d00182200410020004103471b220041016b0e020001020b200621004100" - "21060c010b20064101762100200641016a41017621060b200041016a2100" - "2001280210210820012802202102200128021c21040340200041016b2200" - "450d02200420082002280210110200450d000b41010f0b200128021c2003" - "2007200128022028020c1103000f0b200420032007200228020c11030004" - "4041010f0b4100210003402000200646044041000f0b200041016a210020" - "0420082002280210110200450d000b200041016b2006490b140020002802" - "002001200028020428020c1102000b0e0041e480c000412b20001011000b" - "5901017f230041306b220324002003200136020c20032000360208200341" - "01360214200341dc80c0003602102003420137021c2003200341086aad42" - "8080808030843703282003200341286a360218200341106a2002101a000b" - "7f01017f027f0240027f0240200228020404402002280208220345044020" - "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" - "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" - "032002450c010b4104210341000b21022000200136020820002003360204" - "200020023602000bdd0101087f230041206b220224002000280200220341" - "7f460440410020011019000b20034101742204200341016a220620042006" - "4b1b220441ffffffff034b0440410020011019000b024041042004200441" - "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" - "02200341027436021c2002200028020436021441040520040b3602182002" - "41086a2006200241146a102220022802084101470d012002280210210520" - "0228020c0520050b210820052109200820011019000b200228020c210320" - "00200736020020002003360204200241206a24000bd10d021c7f077e2300" - "41206b220c2400200341016b211102400240024002402003044020034102" - "6b210520034101460d0402402001280208221420036b221941016a220e41" - "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" - "746a2802002115200220054102746a3502002123027f2004450440410421" - "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" - "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" - "09200e044020012802042212200941027420034102746b6a211320034101" - "7121162003417e71210d201241086b211b201241046b211c42002015ad22" - "2242208622247d2125200e210f0340024020090440201c20094102742204" - "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" - "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" - "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" - "868422202020202280222620227e7d21202026a70b21070240202042ffff" - "ffff0f560d00202520204220867c20217c21210340202120247c22212007" - "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" - "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" - "09200f460d04201220176a21182007ad212102400240201145044042ffff" - "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" - "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" - "22203e0200200441046a220a200a35020020204220887c2021200541046a" - "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" - "04200541086a2105200d200641026a2206470d000b2016450d010b201820" - "0641027422046a2205202020053502007c2021200220046a3502007e7d42" - "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" - "20114504404100210a410021080c030b41002104410021084100210a0340" - "200420136a22052005280200221d200220046a221e2802006a220620086a" - "2208360200200541046a22052005280200221f201e41046a2802006a2205" - "2006201d49200620084b726a22063602002005201f49200520064b722108" - "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" - "c000101b000b2016450d010b2018200a41027422046a2205200528020020" - "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" - "3602002001200941016b2209360208201341046b2113201220094102746a" - "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" - "200941016a220d3602082001280204220a200941027422046a2008360200" - "20080d03200d41ffffffff0371210702400340200721052004417c460d01" - "200541016b21072004200a6a2106200441046b21042006280200450d000b" - "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" - "41ac87c0001010000b200120053602082005210d0b024002400240024002" - "40200d200128020022044102764f0d002004200d490d012004450d002004" - "41027421040240200d450440200a41046b28020022054178712207410441" - "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" - "200a1004410421040c010b200a20044104200d41027410152204450d060b" - "2001200d360200200120043602040b41002106200e450d03200b200e4102" - "746a41046b2802000440200e21060c040b201441027420034102746b2104" - "201941026a210503402004417c460d04200541016b21052004200b6a2107" - "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" - "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" - "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" - "000b41b897c000412e41e897c0001011000b024002400240024020104102" - "7620064d0440201021040c010b200620104b0d01410021042010450d0020" - "1041027421052006450440200b41046b2802002207417871220a41044108" - "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" - "0b10044104210b0c010b200b20054104200622044102741015220b450d04" - "0b200020063602082000200b360204200020043602002000200129020037" - "020c200041146a200141086a280200360200200c41206a24000f0b200c41" - "00360218200c410136020c200c41ec84c000360208200c4204370210200c" - "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" - "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" - "010c7f230041306b220724002001280200210c0240024002400240024002" - "400240024002400240024002400240024020024504402001280204210b20" - "0c418080808078470d02200b41086a280200220441ffffffff034d044020" - "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" - "220b2001200c418080808078461b2208280208220941feffffff014f0d04" - "41bda9c0002d00001a200941026a220141027410012205450d0720054100" - "360200200720053602102007200136020c41012101200741013602142008" - "2802082206410274210d200828020421082006200941016a4b0440200741" - "0c6a2105230041206b22042400024002402006417f460d00200528020022" - "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" - "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" - "047f2004200941027436021c2004200528020436021441040541000b3602" - "18200441086a200a200441146a102220042802084101470d012004280210" - "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" - "0f36020020052001360204200441206a2400200728021021052007280214" - "21010b200520014102746a2008200d104c1a2007200120066a2204360214" - "0c030b200b41046a28020021092006450440410421054100210141042009" - "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" - "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" - "2004360214200720053602102007200136020c0b200341ff0171450d0202" - "40200220044d044020022004470d01200221040c040b2002410041c889c0" - "00101b000b20044102742109200241027421012003411f71210841002003" - "6b411f71210d410021030340200120056a22062006280200220620087420" - "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" - "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" - "89c0001023200728021021050b200520044102746a200336020020072004" - "41016a22043602140b41002108200728020c210a02402004450d00200520" - "0441027422016a41046b2802000440200421080c010b200541046b210d20" - "0441ffffffff037121030340200321062001450d01200641016b21032001" - "200d6a2109200141046b21012009280200450d000b200420062004200649" - "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" - "41002101200a450d00200a41027421032008450440200541046b28020022" - "06417871220941044108200641037122061b20036a490d04200641002009" - "200341276a4b1b0d0520051004410421050c010b20052003410420082201" - "41027410152205450d010b20002008360208200020053602042000200136" - "02002002450d06200c41808080807872418080808078460d06200b41046b" - "28020022014178712203200c410274220641044108200141037122011b6a" - "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" - "003602282007410136021c200741ec84c000360218200742043702202007" - "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" - "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" - "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" - "bda9c0002d00001a024002400240412010012202450d0020022001290000" - "370200200220012900083702082002200129001037021020022001280018" - "3602182002200128001c220336021c410821012000027f410820030d001a" - "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" - "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" - "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" - "1a2002280200450440200241046b28020022014178714124412820014103" - "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" - "210141000c010b200241204104410410152202450d014101210141010b36" - "020820002002360204200020013602000f0b000b41f996c000412e41a897" - "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" - "024106746a2124200028021c21222000280218211f2000280214211e2000" - "280210211b200028020c2123200028020821202000280204211d20002802" - "002102034020022001280000220341187420034180fe0371410874722003" - "4108764180fe03712003411876727222152022201b411a77201b41157773" - "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" - "1d202073200271201d202071732002411e772002411377732002410a7773" - "6a6a2203411e772003411377732003410a777320032002201d7371200220" - "1d71736a201f2001280004220541187420054180fe037141087472200541" - "08764180fe03712005411876727222136a200420236a2207201b201e7371" - "201e736a2007411a772007411577732007410777736a419189dd89076a22" - "066a2205411e772005411377732005410a77732005200220037371200220" - "0371736a201e2001280008220441187420044180fe037141087472200441" - "08764180fe03712004411876727222146a200620206a220c2007201b7371" - "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" - "0d6a2204411e772004411377732004410a77732004200320057371200320" - "0571736a201b200128000c220641187420064180fe037141087472200641" - "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" - "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" - "086a2206411e772006411377732006410a77732006200420057371200420" - "0571736a20072001280010220f411874200f4180fe037141087472200f41" - "08764180fe0371200f411876727222166a200220086a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" - "096a2207411e772007411377732007410a77732007200420067371200420" - "0671736a2001280014220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" - "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" - "096a2203411e772003411377732003410a77732003200620077371200620" - "0771736a2001280018220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" - "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" - "096a2205411e772005411377732005410a77732005200320077371200320" - "0771736a200128001c220841187420084180fe0371410874722008410876" - "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" - "096a2204411e772004411377732004410a77732004200320057371200320" - "0571736a2001280020220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" - "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" - "096a2206411e772006411377732006410a77732006200420057371200420" - "0571736a2001280024220841187420084180fe0371410874722008410876" - "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" - "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" - "096a2207411e772007411377732007410a77732007200420067371200420" - "0671736a2001280028220841187420084180fe0371410874722008410876" - "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" - "096a2203411e772003411377732003410a77732003200620077371200620" - "0771736a200128002c220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" - "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" - "096a2205411e772005411377732005410a77732005200320077371200320" - "0771736a2001280030220c411874200c4180fe037141087472200c410876" - "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" - "200f736a2009411a772009411577732009410777736a41f4baf995076a22" - "0d6a2204411e772004411377732004410a77732004200320057371200320" - "0571736a2001280034220c411874200c4180fe037141087472200c410876" - "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" - "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" - "0d6a2206411e772006411377732006410a77732006200420057371200420" - "0571736a2001280038220c411874200c4180fe037141087472200c410876" - "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" - "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" - "0f6a2207411e772007411377732007410a77732007200420067371200420" - "0671736a200128003c220d411874200d4180fe037141087472200d410876" - "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" - "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" - "086a2203411e772003411377732003410a77732003200620077371200620" - "0771736a20134119772013410e777320134103767320156a200a6a200c41" - "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" - "1773712012736a2015411a772015411577732015410777736a41bfac92db" - "016b22096a2205411e772005411377732005410a77732005200320077371" - "2003200771736a20144119772014410e777320144103767320136a200b6a" - "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" - "2015201773712017736a2013411a772013411577732013410777736a41fa" - "f08682016b220e6a2204411e772004411377732004410a77732004200320" - "0573712003200571736a20114119772011410e777320114103767320146a" - "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" - "6a22142013201573712015736a2014411a77201441157773201441077773" - "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" - "2004200573712004200571736a20164119772016410e7773201641037673" - "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" - "0720126a22112013201473712013736a2011411a77201141157773201141" - "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" - "7320072004200673712004200671736a20184119772018410e7773201841" - "03767320166a20216a2009410f772009410d77732009410a76736a221220" - "136a200320176a22162011201473712014736a2016411a77201641157773" - "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" - "410a777320032006200773712006200771736a20194119772019410e7773" - "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" - "221720146a200520156a22182011201673712011736a2018411a77201841" - "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" - "732005410a777320052003200773712003200771736a201a411977201a41" - "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" - "76736a221520116a200420136a22192016201873712016736a2019411a77" - "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" - "411377732004410a777320042003200573712003200571736a2002411977" - "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" - "17410a76736a221320166a200620146a221a2018201973712018736a201a" - "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" - "772006411377732006410a777320062004200573712004200571736a200a" - "411977200a410e7773200a4103767320026a20086a2015410f772015410d" - "77732015410a76736a221420186a200720116a22022019201a7371201973" - "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" - "07411e772007411377732007410a77732007200420067371200420067173" - "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" - "13410d77732013410a76736a221120196a200320166a220a2002201a7371" - "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" - "186a2203411e772003411377732003410a77732003200620077371200620" - "0771736a20104119772010410e7773201041037673200b6a200e6a201441" - "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" - "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" - "046b22196a2205411e772005411377732005410a77732005200320077371" - "2003200771736a201c411977201c410e7773201c4103767320106a20126a" - "2011410f772011410d77732011410a76736a221820026a200420196a2202" - "200a200b7371200a736a2002411a772002411577732002410777736a41b9" - "809a85046b221a6a2204411e772004411377732004410a77732004200320" - "0573712003200571736a20214119772021410e7773202141037673201c6a" - "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" - "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" - "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" - "2004200573712004200571736a200c411977200c410e7773200c41037673" - "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" - "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" - "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" - "7320072004200673712004200671736a200d411977200d410e7773200d41" - "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" - "026a200320106a2202200a200b7371200a736a2002411a77200241157773" - "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" - "0a777320032006200773712006200771736a200f411977200f410e777320" - "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" - "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" - "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20084119772008410e" - "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" - "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" - "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" - "1377732004410a777320042003200573712003200571736a200941197720" - "09410e777320094103767320086a20166a200d410f77200d410d7773200d" - "410a76736a220820026a200620106a2202200a200b7371200a736a200241" - "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" - "2006411377732006410a777320062004200573712004200571736a200e41" - "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" - "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" - "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "20124119772012410e7773201241037673200e6a20196a2008410f772008" - "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" - "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a20174119772017410e777320174103767320126a201a6a2009410f" - "772009410d77732009410a76736a221220026a200520106a2202200a200b" - "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" - "6a22106a2205411e772005411377732005410a7773200520032007737120" - "03200771736a20154119772015410e777320154103767320176a200c6a20" - "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" - "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" - "a8b3076a22106a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20134119772013410e777320134103767320156a20" - "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" - "220b2002200a73712002736a200b411a77200b41157773200b410777736a" - "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20144119772014410e777320144103767320" - "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" - "20106a2202200a200b7371200a736a2002411a7720024115777320024107" - "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" - "20072004200673712004200671736a20114119772011410e777320114103" - "767320146a20086a2015410f772015410d77732015410a76736a2214200a" - "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" - "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" - "0a777320032006200773712006200771736a20164119772016410e777320" - "164103767320116a20096a2013410f772013410d77732013410a76736a22" - "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" - "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20184119772018410e" - "777320184103767320166a200e6a2014410f772014410d77732014410a76" - "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" - "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" - "1377732004410a777320042003200573712003200571736a201941197720" - "19410e777320194103767320186a20126a2011410f772011410d77732011" - "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" - "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" - "2006411377732006410a777320062004200573712004200571736a201a41" - "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" - "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" - "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" - "410d77732018410a76736a221a20026a200320106a2202200a200b737120" - "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" - "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" - "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" - "6b22106a2205411e772005411377732005410a7773200520032007737120" - "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" - "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" - "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" - "aa83016a22106a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20084119772008410e7773200841037673200f6a20" - "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" - "2202200a200b7371200a736a2002411a772002411577732002410777736a" - "41968293cd016a221c6a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20094119772009410e777320094103767320" - "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" - "201c6a22082002200b7371200b736a2008411a7720084115777320084107" - "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" - "20072004200673712004200671736a200e411977200e410e7773200e4103" - "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" - "6a2003201c6a22092002200873712002736a2009411a7720094115777320" - "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" - "0a777320032006200773712006200771736a20124119772012410e777320" - "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" - "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" - "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20174119772017410e" - "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" - "736a221220086a200220046a22082009200e73712009736a2008411a7720" - "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" - "1377732004410a777320042003200573712003200571736a201541197720" - "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" - "410a76736a221720096a200220066a22092008200e7371200e736a200941" - "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" - "2006411377732006410a777320062004200573712004200571736a201341" - "19772013410e777320134103767320156a200d6a2012410f772012410d77" - "732012410a76736a2215200e6a200220076a220e2008200973712008736a" - "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "20144119772014410e777320144103767320136a200f6a2017410f772017" - "410d77732017410a76736a221320086a200220036a22082009200e737120" - "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a20114119772011410e777320114103767320146a20106a2015410f" - "772015410d77732015410a76736a221420096a200220056a22092008200e" - "7371200e736a2009411a772009411577732009410777736a41ee85bea407" - "6a22026a2205411e772005411377732005410a7773200520032007737120" - "03200771736a20164119772016410e777320164103767320116a200a6a20" - "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" - "08200973712008736a200e411a77200e41157773200e410777736a41efc6" - "95c5076a22026a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20184119772018410e777320184103767320166a20" - "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" - "22082009200e73712009736a2008411a772008411577732008410777736a" - "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20194119772019410e777320194103767320" - "186a20126a2011410f772011410d77732011410a76736a221220096a2002" - "20076a22092008200e7371200e736a2009411a7720094115777320094107" - "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" - "20072004200673712004200671736a201a411977201a410e7773201a4103" - "767320196a20176a2016410f772016410d77732016410a76736a2217200e" - "6a200320116a220e2008200973712008736a200e411a77200e4115777320" - "0e410777736a41868084fa066b22116a2203411e77200341137773200341" - "0a777320032006200773712006200771736a200c411977200c410e777320" - "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" - "1220086a200520116a22052009200e73712009736a2005411a7720054115" - "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" - "2008410a777320082003200773712003200771736a200c200d411977200d" - "410e7773200d410376736a20136a2017410f772017410d77732017410a76" - "736a20096a200420156a22042005200e7371200e736a2004411a77200441" - "1577732004410777736a4189b89988046b22096a220c2003200873712003" - "200871736a200c411e77200c41137773200c410a77736a200d200f411977" - "200f410e7773200f410376736a20146a2012410f772012410d7773201241" - "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" - "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" - "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" - "21232004201f6a211f200520226a2122200141406b22012024470d000b20" - "00202236021c2000201f3602182000201e3602142000201b360210200020" - "2336020c200020203602082000201d360204200020023602000b89010101" - "7f027f0240200328020404402003280208220445044020012002450d031a" - "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" - "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" - "490d002002100b0c010b200210010b210320002002360208200020032001" - "20031b36020420002003453602000b3000200128021c20002d0000410274" - "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" - "1103000bfc0402037f017e23004180016b220224000240024020012d0000" - "220441c00171220341c000470440200241186a200141186a290000370300" - "200241106a200141106a290000370300200241086a200141086a29000037" - "030020022001290000220537030020022005a7413f713a0000200241406b" - "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" - "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" - "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" - "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" - "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" - "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" - "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" - "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" - "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" - "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" - "200041c0003a0020200041186a4200370300200041106a42003703002000" - "41086a42003703000c010b200241386a200241e8006a2903003703002002" - "41306a200241e0006a290300370300200220022903503703202002200241" - "d8006a2903003703282003044020002002290320370300200020033a0020" - "200041086a2002290328370300200041186a200241386a29030037030020" - "0041106a200241306a2903003703000c010b200241003602502002410136" - "0244200241a88cc00036024020024204370248200241406b419c8dc00010" - "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" - "00290300220c200041086a290300220d8450047e420005200741f0016a20" - "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" - "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" - "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" - "072903f0012112200741c8016a290300200741a8016a290300220d200729" - "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" - "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" - "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" - "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" - "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" - "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" - "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" - "21112000290310220c200041186a290300220d8450047e420005200741f0" - "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" - "104d20074180016a200d2002104d200741306a200c2003104d200741206a" - "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" - "0741c8006a290300200741286a290300220320072903407c2204200354ad" - "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" - "117c2204200254ad200420072903207c2202200454ad7c20022007418801" - "6a29030020074198016a29030022012007290380017c2204200154ad7c20" - "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" - "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" - "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" - "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" - "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" - "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" - "200e3703b002200720123703a002200720043703d802200720113703c802" - "2007200f3703b802200720133703a80220074188036a4200370300200741" - "80036a4200370300200741f8026a4200370300200742003703f002200741" - "f0026a210a41ff032109420021034200210442002101420021024201210d" - "0340200741106a2009410776410474220b200741a0026a6a220829030020" - "08290308200941ff00712208104e2004423f88210c20044201862003423f" - "888421042007290310420183200342018684210302400240024002400240" - "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" - "3f8884220242a9c0c689aece93b230858450044020032005542004200654" - "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" - "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" - "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" - "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" - "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" - "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" - "022004200f7d2104200320057d2103200941016a41810249200d42005271" - "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" - "22082008290300200729030084370300200841086a220820082903002007" - "41086a2903008437030020090d010b200020023703182000200137031020" - "0020043703082000200337030020074190036a24000f0b200941016b2109" - "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" - "3a00000240200004400340024002400240200041016b0e03000501020b03" - "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" - "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" - "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" - "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" - "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" - "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" - "0b0b840202047e017f200041086a29030021092000290300210a0240417f" - "2000290310220b200385200041186a290300220c20048584420052200320" - "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" - "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" - "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" - "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" - "2000200920027d22072001200a56ad22017d37030820002003427f852203" - "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" - "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" - "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" - "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" - "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" - "3700002003200210262000027f0240024002400240024002400240024002" - "40024002400240024002400240027f024002400240024002400240024002" - "7f02400240027f0240024002400240024002400240024002400240024002" - "400240024002400240024002400240200241046b28020022044178714124" - "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" - "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" - "290000370000200220012900002210370000200241106a2205200141106a" - "290000370000200241086a2208200141086a29000037000020022002411f" - "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" - "22072d00003a0001200720013a00002002411d6a22012d00002107200120" - "022d00023a0000200220073a00022002411c6a22012d0000210720012002" - "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" - "00043a0000200220073a00042002411a6a22012d00002107200120022d00" - "053a0000200220073a0005200241196a22012d00002107200120022d0006" - "3a0000200220073a000620042d00002101200420022d00073a0000200220" - "013a0007200241176a22012d00002104200120082d00003a000020082004" - "3a0000200241166a22012d00002104200120022d00093a0000200220043a" - "0009200241156a22012d00002104200120022d000a3a0000200220043a00" - "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" - "200241136a22012d00002104200120022d000c3a0000200220043a000c20" - "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" - "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" - "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" - "200241046b280200220141787141244128200141037122041b490d022004" - "4100200141c8004f1b0d032002100420032802082202450d120240024002" - "40200241016b220241feffffff0371450440200241ffffffff0371220441" - "016a2205410371210142002110200328020422082102200441034f044020" - "0541fcffffff07712104034020104280017c2110200241106a2102200441" - "046b22040d000b0b2001450d020340200235020020108620117c21112010" - "42207c2110200241046a2102200141016b22010d000b2011428080808010" - "540d010b200341406b200341146a2802003602002003200329020c370338" - "200341d0006a200341086a28020022043602002003200329020037034820" - "04450d0720032802402207450440200341206a418098c000280200220236" - "02002003412c6a2002360200200341f897c0002902002210370318200320" - "10370224200328024822020440200328024c220441046b28020022014178" - "7122052002410274220241044108200141037122011b6a490d0a20014100" - "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" - "3c220441046b280200220141787122052002410274220241044108200141" - "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" - "0b0240027f02400240024020044101460440200328024c220c2802002202" - "4101470d012003412c6a418098c000280200360200200341206a20034114" - "6a2802003602002003200329020c370318200341f897c000290200370224" - "20032802482202450d2a200c41046b280200220141787122042002410274" - "220241044108200141037122011b6a490d12200141002004200241276a4b" - "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" - "200747200420074b1b22050d0020074102742102200b41046b2106200441" - "02742101200c41046b2109200420076b21070340200204402001450d0720" - "0220066a2105200120096a2108200241046b2102200141046b2101417f20" - "082802002208200528020022054720052008491b2205450d010c020b0b41" - "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" - "450d1220074102742101200328023c2109200241ffff034d044020094104" - "6b2106410021040340200120066a22052005280200220541107622082008" - "20044110747220026e220420026c6b411074200541ffff03717222052002" - "6e22082004411074723602002005200220086c6b2104200141046b22010d" - "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" - "45044042002111200120096a0c270b200241016a41feffffff0771210120" - "0741027420096a41086b2102420021110340200241046a22042004350200" - "201142208684221120108022123e0200200220023502002011201020127e" - "7d42208684221120108022123e02002011201020127e7d2111200241086b" - "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" - "002003200329020c370224200341186a0c010b2003410036024020032802" - "38047f200b05200341386a418c87c0001023200328023c0b410136020020" - "0341406b4101360200200341206a41013602002003200329033837031820" - "0341246a0b220241086a418098c000280200360200200241f897c0002902" - "0037020020032802482202450d25200c41046b2802002201417871220420" - "02410274220241044108200141037122011b6a490d102001410020042002" - "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" - "20022802002202672208450440200341f8006a200341146a280200360200" - "2003200329020c370370200341186a200341f0006a200c20041024200328" - "02482202450d25200c41046b280200220141787122042002410274220241" - "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" - "200c10040c250b024002402003280238418080808078470d00200b280208" - "0d002003410036026c20034280808080c0003702640c010b200341e4006a" - "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" - "402003280248418080808078470d00200c2802080d004100210420034100" - "3602704100210541040c010b200341f0006a20032002452008411f711025" - "200328027021042003280278210520032802740b220120051024200341e0" - "006a200341206a28020036020020032003290218370358200328022c2105" - "200328022821092003280224210c20040440200141046b28020022074178" - "7122062004410274220441044108200741037122071b6a490d1420074100" - "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" - "404100210120092802080d0141042105410021040c220b41002101200545" - "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" - "0274220a20092206200620044102746a22056b4b04402005200a6a210120" - "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" - "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" - "200d2107200121040340200641016b2206200441016b22042d00003a0000" - "200741016b22070d000b0b200f4103490d00200441046b21040340200641" - "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" - "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" - "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" - "6b21064100200a6b210702402001200e6a2201410371450440200220064d" - "0d01200420056a41046b21050340200241046b2202200528020036020020" - "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" - "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" - "280200210a0340200241046b2202200a200e742005280200220a200d7672" - "360200200541046b2105200220064b0d000b0b2004410371210a20012007" - "6a21010c010b200a41104f044002402006410020066b41037122076a2204" - "20064d0d00200741016b210d200521022007044020072101034020062002" - "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" - "0b200d4107490d000340200620022d00003a0000200641016a200241016a" - "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" - "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" - "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" - "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" - "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" - "0371450440200420064f0d01200221050340200420052802003602002005" - "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" - "410374220a41187121072002417c71220f41046a21054100200a6b411871" - "210e200f280200210a03402004200a2007762005280200220a200e747236" - "0200200541046a2105200441046a22042006490d000b0b2001410371210a" - "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" - "0771220204400340200620052d00003a0000200541016a2105200641016a" - "2106200241016b22020d000b0b20014107490d010340200620052d00003a" - "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" - "003a0000200641036a200541036a2d00003a0000200641046a200541046a" - "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" - "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" - "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" - "0a41016b2104200a410371220504400340200641016b2206200141016b22" - "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" - "21050340200641016b200541036a2d00003a0000200641026b200541026a" - "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" - "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" - "200941046a28020021072009280208220420024522024d04402004410274" - "21022004044041bda9c0002d00001a200210012205450d360b2005200720" - "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" - "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" - "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" - "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" - "410371210820074103490d1b200641fcffffff077121070340200241046b" - "220620062802002206200176200572360200200241086b22052006200474" - "20052802002205200176723602002002410c6b2206200520047420062802" - "00220620017672360200200241106b220220062004742002280200220520" - "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" - "14200328021421022003280210210502402011428080045a04402002450d" - "0320024102742104200241ffffffff036a220741ffffffff037122020d01" - "42002110200420056a0c180b2002450d022011a721040c180b200241016a" - "41feffffff07712101200420056a41086b21024200211003402002350200" - "200241046a35020020104220868420118242208684201182211020024108" - "6b2102200141026b22010d000b0c150b2003280210210520032802142202" - "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" - "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" - "1011000b41b897c000412e41e897c0001011000b20034100360228200341" - "0136021c200341a099c00036021820034204370220200341186a41fc86c0" - "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" - "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" - "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" - "412e41e897c0001011000b200341003602282003410136021c200341a099" - "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" - "000b200341003602282003410136021c200341a099c00036021820034204" - "370220200341186a41989ac000101a000b200241086a0b21022007410171" - "047e201005200241046b3502002010422086842011820ba721010c010b20" - "0241027421024100210103402001411074200241046b220220056a280200" - "220141107672200470411074200141ffff037172200470210120020d000b" - "0b41002102200341206a418098c000280200360200200341f897c0002902" - "0037031820014504404104210741000c010b200341186a41f498c0001023" - "200328021c220720013602004101210220032802180b210a024002400240" - "0240200328020022010440200841046b2802002204417871220620014102" - "74220141044108200441037122041b6a490d01200441002006200141276a" - "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" - "787122082001410274220141044108200441037122041b6a490d02200441" - "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" - "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" - "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" - "41046b21020340200220022802002207200176200572360200200241046b" - "210220072004742105200841016b22080d000b0b41002101200b450d0020" - "09200b41027422026a41046b2802000440200b21010c010b200941046b21" - "07200b41ffffffff037121040340200421052002450d01200441016b2104" - "200220076a2108200241046b21022008280200450d000b200b2005200520" - "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" - "04200c450440200921050c050b200c41027421022001450440200941046b" - "2802002205417871220841044108200541037122051b20026a490d022005" - "41002008200241276a4b1b0d0320091004410421050c050b200121042009" - "200241042001410274101522050d040c180b200341003602282003410136" - "021c200341ec84c00036021820034204370220200341186a41f484c00010" - "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" - "001011000b200c2104200921050b200341206a200341e0006a2802003602" - "00200320032903583703182003200136022c200320053602282003200436" - "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" - "1105200241046b22022002350200201142208684221120108022123e0200" - "2011201020127e7d0ba721040b2003280238210b02402009200741027422" - "026a41046b2802000d00200941046b210620072101034020012105200245" - "0440410021070c020b200541016b2101200220066a2108200241046b2102" - "2008280200450d000b20072005200520074b1b21070b0240200b41027620" - "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" - "027421012007450440200941046b28020022054178712208410441082005" - "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" - "04410421090c010b2009200141042007220241027410152209450d100b20" - "034100360250200404402003280248047f200c05200341c8006a41dc86c0" - "001023200328024c0b2004360200200341013602500b2003412c6a200341" - "d0006a280200360200200320032903483702242003200936021c20032002" - "3602180b200328022c2102200328022821072003280224210a2003280218" - "2201450d00200328021c220541046b280200220441787122082001410274" - "220141044108200441037122041b6a490d04200441002008200141276a4b" - "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" - "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" - "86200720024102746a41046b28020067ad7d221042038820104207834200" - "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" - "a7220510012204450d0e0b200341003602202003200436021c2003200536" - "02182007200241016b22054102746a210920050440200241027441046b21" - "06410021020340200220076a280200210120032802182002460440200341" - "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" - "0241016a2205360220200141087621082003280218200546044020034118" - "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" - "03200541016a220536022020014110762108200328021820054604402003" - "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" - "002003200541016a22053602202001411876210120032802182005460440" - "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" - "3a00002003200541016a2205360220200241046a21012005210220012006" - "470d000b0b20092802002202450d05034020032802182001460440200341" - "186a419c88c00010180b200328021c220420016a20023a00002003200141" - "016a2201360220200241ff014b21052002410876210220050d000b0c060b" - "200341003602282003410136021c200341ec84c000360218200342043702" - "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" - "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" - "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" - "0218210d200141014b0d010b200341306a4200370300200341286a420037" - "0300200341206a4200370300200342003703180c010b200120046a210c41" - "002102200141017622084101470440200141016b2105200841feffffff07" - "71210b0340200420056a22062d000021092006200220046a22082d00003a" - "0000200820093a0000200c2002417e736a22062d00002109200620084101" - "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" - "2202470d000b0b20014102710440200220046a22052d000021082005200c" - "2002417f736a22022d00003a0000200220083a00000b200341306a420037" - "0300200341286a4200370300200341206a42003703002003420037031820" - "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" - "388620104280fe0383422886842010428080fc0783421886201042808080" - "f80f834208868484201042088842808080f80f832010421888428080fc07" - "838420104228884280fe038320104238888484842112200341306a290300" - "221042388620104280fe0383422886842010428080fc0783421886201042" - "808080f80f834208868484201042088842808080f80f8320104218884280" - "80fc07838420104228884280fe038320104238888484842113417f200329" - "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" - "9bb0a0acdd008584420052201142388620114280fe038342288684201142" - "8080fc0783421886201142808080f80f8342088684842011420888428080" - "80f80f832011421888428080fc07838420114228884280fe038320114238" - "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" - "422886842010428080fc0783421886201042808080f80f83420886848420" - "1042088842808080f80f832010421888428080fc07838420104228884280" - "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" - "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" - "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" - "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" - "20103703282000201237031841000c020b410021010b200020013a000141" - "010b3a00000240024002400240200a0440200741046b2802002202417871" - "2201200a410274220541044108200241037122021b6a490d012002410020" - "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" - "7871220141044108200241037122021b200d6a490d03200241002001200d" - "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" - "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" - "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" - "02057f167e230041e0006b22032400200341386a2204200141186a290300" - "370300200341306a2205200141106a290300370300200320012903003703" - "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" - "206a20022903002219200241086a290300221a2002290310221b20024118" - "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" - "042903002113200529030021142003290320211520032903282116200341" - "106a2206200141306a290300370300200341186a2207200141386a290300" - "370300200320012903203703002003200141286a29030037030820032002" - "290320220e200241286a290300220c20022903302211200241386a290300" - "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" - "030037030020052006290300370300200320032903083703282003200329" - "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" - "7c220d2016200329032822087c2209200854ad2009201520032903202208" - "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" - "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" - "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" - "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" - "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" - "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" - "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" - "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" - "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" - "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" - "210f024002402001290330221020012903107c2209200141286a29030022" - "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" - "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" - "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" - "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" - "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" - "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" - "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" - "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" - "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" - "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" - "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" - "307d21090b2003200f37035020032010370340200320093703582003200b" - "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" - "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" - "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" - "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" - "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" - "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" - "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" - "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" - "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" - "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" - "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" - "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" - "c0c689aece93b230102d200341406b200329030020032903082003290310" - "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" - "002012370310200020183703082000201737030020002003290340370320" - "200041286a2003290348370300200041306a200341d0006a290300370300" - "200041386a200341d8006a290300370300200341e0006a24000ba706010a" - "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" - "03107c2207200241086a2903002203200141086a2903007c2204200354ad" - "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" - "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" - "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" - "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" - "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" - "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" - "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" - "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" - "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" - "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" - "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" - "02290330220920012903307c2204200241286a2903002205200141286a29" - "03007c2203200554ad20032002290320220520012903207c2206200554ad" - "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" - "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" - "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" - "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" - "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" - "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" - "450d002006210920052106200321080c010b200420032005200642c7faf3" - "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" - "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" - "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" - "2008370330200020093703202000200a3703102000200b37030020002004" - "37033820002006370328200020073703182000200c3703080bf10802087f" - "087e23004180016b22022400200141386a290300210e200141286a290300" - "210b200141186a2203290300210d2001290330210f2001290320210a2001" - "290310210c02400240024020012903002210200141086a22042903002211" - "844200520d00200c200d844200520d00200a200b844200520d00200e200f" - "84500d010b200241186a22052003290300370300200241106a2206200141" - "106a22072903003703002002200429030037030820022001290300370300" - "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f102b200241386a2204200141206a220341186a29030037030020024130" - "6a2208200341106a22092903003703002002200341086a29030037032820" - "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" - "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d2000027e2002290300220d2006290300220c842002290308220b200529" - "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" - "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" - "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" - "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" - "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" - "290350210a200241d0006a20072903003703002004200141186a29030037" - "0300200220012903003703402002200141086a290300370348200241406b" - "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b200241f8006a2201200341186a290300370300200241f0006a22042009" - "2903003703002002200341086a2903003703682002200329030037036020" - "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f102b2004290300220c20022903602210842001290300220e2002" - "290368220b84845004404200210c4200210b4200210a4200210e4200210f" - "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" - "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" - "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" - "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" - "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" - "03402000200c370330200020022903403703102000200f3703082000200e" - "3703482000200b370338200041186a2002290348370300200041206a2002" - "41d0006a290300370300200041286a200241d8006a2903003703000c010b" - "20004200370308200042003703000b20024180016a24000b090020004100" - "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" - "220441016a360200024020044100480d00024041bca9c0002d0000450440" - "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" - "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" - "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" - "20004200370210200141ffffff074d04402001410620014108766722026b" - "7641017120024101746b413e6a21020b2000200236021c200241027441f4" - "a5c0006a2103410120027422044190a9c000280200714504402003200036" - "0200200020033602182000200036020c200020003602084190a9c0004190" - "a9c0002802002004723602000f0b02400240200120032802002204280204" - "417871460440200421020c010b2001411920024101766b41002002411f47" - "1b742103034020042003411d764104716a41106a22052802002202450d02" - "200341017421032002210420022802044178712001470d000b0b20022802" - "082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20" - "0020003602080bd20102067f017e230041206b2201240002400240200028" - "02002203417f460d00410420034101742202200341016a2204200220044b" - "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" - "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" - "1c2001200028020436021441100520020b360218200141086a2006200141" - "146a103720012802084101470d0120012802102102200128020c21050b20" - "0541dca4c0001019000b200128020c210320002004360200200020033602" - "04200141206a24000b7f01017f027f0240027f0240200228020404402002" - "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" - "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" - "0b2202411020021b21032002450c010b4110210341000b21022000200136" - "020820002003360204200020023602000bd20102067f017e230041206b22" - "0124000240024020002802002203417f460d004104200341017422022003" - "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" - "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" - "2001200341c0016c36021c2001200028020436021441100520020b360218" - "200141086a2006200141146a103720012802084101470d01200128021021" - "02200128020c21050b200541eca4c0001019000b200128020c2103200020" - "0436020020002003360204200141206a24000bdd0102067f017e23004120" - "6b2202240020002802002204417f460440410020011019000b4104200441" - "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" - "017e22084220884200520440410020011019000b02402008a7220741f0ff" - "ffff074d04404100210320022004047f2002200441c0016c36021c200220" - "0028020436021441100520030b360218200241086a2007200241146a1037" - "20022802084101470d01200228020c2106200228021021030b2006200110" - "19000b200228020c21042000200536020020002004360204200241206a24" - "000b830b02037f167e230041c0016b22022400200241186a220320004118" - "6a290300370300200241106a2204200041106a2903003703002002200029" - "03003703002002200041086a290300370308200241386a200141186a2903" - "002218370300200241306a200141106a2903002213370300200220014108" - "6a2903002214370328200220012903002215370320200242003703582002" - "42003703502002420037034820024201370340200241f8006a2201420037" - "0300200241f0006a42003703002002420037036820024200370360200329" - "0300210e2004290300210f2002290308210a200229030021072013211020" - "182111201521082014210b03400240200242003703980120024200370390" - "0120024200370388012002420137038001200220024180016a104a450440" - "200241406b21010c010b200241b8016a20024198016a2903003703002002" - "41b0016a20024190016a29030037030020022002290388013703a8012002" - "2002290380013703a001200241206a200241a0016a104a450440200241e0" - "006a21010c010b200241d8006a2903002112200229035021052002290348" - "21162002290340210d2007a74101714504400340200a423f862007420188" - "8421070240200da74101714504402016423f86200d42018884210d200542" - "3f8620164201888421160c010b200520137c2209201420167c2205201454" - "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" - "4201888421162006423f86200d42018884210d2009201354ad2005200954" - "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" - "0f42018884210f200e420188210e2012423f862005420188842105201242" - "018821122007420183500d000b2002200f3703102002200e3703180b2002" - "20053703502002200d370340200220073703002002201237035820022016" - "3703482002200a3703082001290300210920022903702106200229036821" - "172002290360210c2008a74101714504400340200b423f86200842018884" - "21080240200c420183a70440200620137c2219201420177c2206201454ad" - "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" - "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" - "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" - "20174201888421170b2010423f86200b42018884210b2011423f86201042" - "0188842110201142018821112009423f8620064201888421062009420188" - "21092008420183500d000b20022010370330200220113703380b20022006" - "3703702002200c3703602002200837032020022009370378200220173703" - "682002200b37032802400240200f201085200e2011858450044020072008" - "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" - "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" - "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" - "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" - "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" - "e0006a200d2016200520122015201420132018102d20062108200c210b0c" - "020b2002200720087d427e8322123703002002200a200b7d220520072008" - "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" - "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" - "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" - "2017200620092015201420132018102d20122107200d210a0c010b0b2000" - "2001290300370300200041186a200141186a290300370300200041106a20" - "0141106a290300370300200041086a200141086a290300370300200241c0" - "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" - "0141386a2226290300370300200341306a222c200141306a220e29030037" - "0300200341286a222d200141286a220f290300370300200341206a222e20" - "0141206a2210290300370300200341186a222f200141186a221129030037" - "0300200341106a2230200141106a22122903003703002003200129030037" - "03002003200141086a2227290300370308200320012002102f200341f800" - "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" - "6a2205290300370300200341e8006a2216200141e8006a22062903003703" - "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" - "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" - "092903003703002003200141c8006a220c29030037034820032001290340" - "370340200341406b200141406b2213200241406b2228102f200341b8016a" - "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" - "00370300200341a8016a2222200141a8016a290300370300200341a0016a" - "2223200141a0016a29030037030020034198016a222420014198016a2903" - "0037030020034190016a222520014190016a290300370300200320014188" - "016a2903003703880120032001290380013703800120034180016a200141" - "80016a222920024180016a222a102f200341f8016a221820042903003703" - "00200341f0016a22192005290300370300200341e8016a221a2006290300" - "370300200341e0016a221b2007290300370300200341d8016a221c200829" - "0300370300200341d0016a221d20092903003703002003200c2903003703" - "c801200320012903403703c001200341c0016a201320291030200341b802" - "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" - "00200341a8026a200241e8006a290300370300200341a0026a200241e000" - "6a29030037030020034198026a200241d8006a2903003703002003419002" - "6a200241d0006a2903003703002003200241c8006a290300370388022003" - "20022903403703800220034180026a2028202a1030200341c0056a200341" - "c0016a20034180026a102f2018200341f8056a2204290300370300201920" - "0341f0056a2205290300370300201a200341e8056a220629030037030020" - "1b200341e0056a2207290300370300201c200341d8056a22082903003703" - "00201d200341d0056a2209290300370300200320032903c8053703c80120" - "0320032903c0053703c00120034198066a220c201c290300370300200341" - "90066a220d201d290300370300200320032903c801370388062003200329" - "03c0013703800620034180066a2003290340223820032903482239200b29" - "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" - "6a220a2018290300370300200341b0066a220b2019290300370300200320" - "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" - "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008200c29030022403703002009200d29030022413703" - "00200720032903a00622423703002005200b290300224337030020062003" - "2903a80622443703002004200a2903002245370300200320032903880622" - "463703c805200320032903800622473703c0052018204537030020192043" - "370300201a2044370300201b2042370300201c2040370300201d20413703" - "00200320463703c801200320473703c001200c201c290300370300200d20" - "1d290300370300200320032903c80137038806200320032903c001370380" - "0620034180066a2003290380012003290388012025290300202429030042" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" - "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" - "3703002003201a2903003703a8062003201b2903003703a006200341a006" - "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d2008200c29030022403703002009200d290300224137030020" - "0720032903a00622423703002005200b2903002243370300200620032903" - "a80622443703002004200a29030022453703002003200329038806224637" - "03c805200320032903800622473703c00520182045370300201920433703" - "00201a2044370300201b2042370300201c2040370300201d204137030020" - "0320463703c801200320473703c001200342003703b805200342003703b0" - "05200342003703a805200342013703a00520034200370398052003420037" - "03900520034200370388052003420937038005200341c0056a200341c001" - "6a20034180056a102f201820042903003703002019200529030037030020" - "1a2006290300370300201b2007290300370300201c200829030037030020" - "1d2009290300370300200320032903c8053703c801200320032903c00537" - "03c001200341c0056a200341c0016a200310302018200429030037030020" - "192005290300370300201a2006290300370300201b200729030037030020" - "1c2008290300370300201d2009290300370300200320032903c8053703c8" - "01200320032903c0053703c001200341d0026a2214201229030037030020" - "0341d8026a22152011290300370300200341e0026a221620102903003703" - "00200341e8026a2217200f290300370300200341f0026a221e200e290300" - "370300200341f8026a221f2026290300370300200320012903003703c002" - "200320272903003703c802200341c0026a200120131030200341b8036a20" - "0241386a2231290300370300200341b0036a200241306a22322903003703" - "00200341a8036a200241286a2233290300370300200341a0036a20024120" - "6a223429030037030020034198036a200241186a22352903003703002003" - "4190036a200241106a22362903003703002003200241086a223729030037" - "038803200320022903003703800320034180036a200220281030200341c0" - "056a200341c0026a20034180036a102f201f2004290300370300201e2005" - "290300370300201720062903003703002016200729030037030020152008" - "29030037030020142009290300370300200320032903c8053703c8022003" - "20032903c0053703c002200c2015290300370300200d2014290300370300" - "200320032903c80237038806200320032903c0023703800620034180066a" - "200329030022402003290308224120302903002242202f290300224342c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" - "0300200320172903003703a806200320162903003703a006200341a0066a" - "202e2903002244202d2903002245202c2903002246202b290300224742c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" - "002249370300200720032903a006224a3703002005200b290300224b3703" - "00200620032903a806224c3703002004200a290300224d37030020032003" - "29038806224e3703c8052003200329038006224f3703c005201f204d3703" - "00201e204b3703002017204c3703002016204a3703002015204837030020" - "1420493703002003204e3703c8022003204f3703c002200c201529030037" - "0300200d2014290300370300200320032903c80237038806200320032903" - "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b230102d200a201f290300370300200b201e290300370300200320172903" - "003703a806200320162903003703a006200341a0066a203c203d203e203f" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" - "2903002239370300200720032903a006223a3703002005200b290300223b" - "370300200620032903a806223c3703002004200a290300223d3703002003" - "200329038806223e3703c8052003200329038006223f3703c005201f203d" - "370300201e203b3703002017203c3703002016203a370300201520383703" - "00201420393703002003203e3703c8022003203f3703c002200341f8036a" - "2020290300370300200341f0036a2021290300370300200341e8036a2022" - "290300370300200341e0036a2023290300370300200341d8036a20242903" - "00370300200341d0036a202529030037030020032003290388013703c803" - "20032003290380013703c003200341c0036a20034180016a20034180056a" - "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" - "0300201e2005290300370300201720062903003703002016200729030037" - "03002015200829030037030020142009290300370300200320032903c805" - "3703c802200320032903c0053703c00220034190046a2213201229030037" - "030020034198046a22122011290300370300200341a0046a221120102903" - "00370300200341a8046a2210200f290300370300200341b0046a220f200e" - "290300370300200341b8046a220e20262903003703002003200129030037" - "038004200320272903003703880420034180046a200120291030200341f8" - "046a2031290300370300200341f0046a2032290300370300200341e8046a" - "2033290300370300200341e0046a2034290300370300200341d8046a2035" - "290300370300200341d0046a2036290300370300200320372903003703c8" - "04200320022903003703c004200341c0046a2002202a1030200341c0056a" - "20034180046a200341c0046a102f200e2004290300370300200f20052903" - "003703002010200629030037030020112007290300370300201220082903" - "0037030020132009290300370300200320032903c8053703880420032003" - "2903c00537038004200c2012290300370300200d20132903003703002003" - "2003290388043703880620032003290380043703800620034180066a2040" - "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" - "200b200f290300370300200320102903003703a806200320112903003703" - "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2008200c29030022383703002009200d2903002239370300200720032903" - "a006223a3703002005200b290300223b370300200620032903a806223c37" - "03002004200a290300223d3703002003200329038806223e3703c8052003" - "200329038006223f3703c005200e203d370300200f203b3703002010203c" - "3703002011203a37030020122038370300201320393703002003203e3703" - "88042003203f37038004200341c0056a20034180046a200341406b103020" - "0e2004290300370300200f20052903003703002010200629030037030020" - "112007290300370300201220082903003703002013200929030037030020" - "0320032903c80537038804200320032903c00537038004200c2012290300" - "370300200d20132903003703002003200329038804370388062003200329" - "0380043703800620034180066a2003290380012003290388012025290300" - "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" - "0b200f290300370300200320102903003703a806200320112903003703a0" - "06200341a0066a202329030020222903002021290300202029030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" - "2239370300200720032903a006223a3703002005200b290300223b370300" - "200620032903a806223c3703002004200a290300223d3703002003200329" - "038806223e3703c8052003200329038006223f3703c005200e203d370300" - "200f203b3703002010203c3703002011203a370300201220383703002013" - "20393703002003203e370388042003203f37038004200041386a20182903" - "00370300200041306a2019290300370300200041286a201a290300370300" - "200041206a201b290300370300200041186a201c29030037030020004110" - "6a201d290300370300200041086a20032903c801370300200020032903c0" - "01370300200020032903c002370340200041c8006a20032903c802370300" - "200041d0006a2014290300370300200041d8006a20152903003703002000" - "41e0006a2016290300370300200041e8006a2017290300370300200041f0" - "006a201e290300370300200041f8006a201f290300370300200041b8016a" - "200e290300370300200041b0016a200f290300370300200041a8016a2010" - "290300370300200041a0016a201129030037030020004198016a20122903" - "0037030020004190016a201329030037030020004188016a200329038804" - "370300200020032903800437038001200341c0066a24000b830c02137f04" - "7e23004180026b22032400200341d8006a2207200141186a290300370300" - "200341d0006a2208200141106a2903003703002003200141086a29030037" - "034820032001290300370340200341406b2002290300200241086a290300" - "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" - "98016a2204200141386a29030037030020034190016a2205200141306a29" - "03003703002003200141286a290300370388012003200129032037038001" - "20034180016a2002290320200241286a2903002002290330200241386a29" - "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" - "00200341106a220c2008290300370300200341206a220d20032903800137" - "0300200341286a220e200329038801370300200341306a220f2005290300" - "370300200341386a22102004290300370300200320032903483703082003" - "2003290340370300200241f8006a2903002116200241e8006a2903002117" - "2002290370211820022903602119200341f8016a2209200141d8006a2903" - "00370300200341f0016a2206200141d0006a2903003703002003200141c8" - "006a2903003703e801200320012903403703e001200341e0016a20022903" - "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" - "2903003703002003200141e8006a29030037038801200320012903603703" - "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2007200929030037030020082006290300370300200341e0006a22112003" - "29038001370300200341e8006a2212200329038801370300200341f0006a" - "22132005290300370300200341f8006a2214200429030037030020032003" - "2903e801370348200320032903e001370340200241b8016a290300211620" - "0241a8016a290300211720022903b001211820022903a0012119200341d8" - "016a220a20014198016a290300370300200341d0016a221520014190016a" - "290300370300200320014188016a2903003703c801200320012903800137" - "03c001200341c0016a20022903800120024188016a290300200229039001" - "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" - "6a2903003703002006200141b0016a2903003703002003200141a8016a29" - "03003703e801200320012903a0013703e001200341e0016a201920172018" - "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" - "290300370300200341a0016a220120032903e001370300200341a8016a22" - "0220032903e801370300200341b0016a220a2006290300370300200341b8" - "016a22062009290300370300200320032903c80137038801200320032903" - "c00137038001200041386a2010290300370300200041306a200f29030037" - "0300200041286a200e290300370300200041206a200d2903003703002000" - "41186a200b290300370300200041106a200c290300370300200041086a20" - "032903083703002000200329030037030020002003290340370340200041" - "c8006a2003290348370300200041d0006a2008290300370300200041d800" - "6a2007290300370300200041e0006a2011290300370300200041e8006a20" - "12290300370300200041f0006a2013290300370300200041f8006a201429" - "0300370300200041b8016a2006290300370300200041b0016a200a290300" - "370300200041a8016a2002290300370300200041a0016a20012903003703" - "0020004198016a200429030037030020004190016a200529030037030020" - "004188016a20032903880137030020002003290380013703800120034180" - "026a24000bf11902287f087e23004180056b22022400200241386a222420" - "0141386a220a290300370300200241306a2225200141306a220329030037" - "0300200241286a2226200141286a2204290300370300200241206a222720" - "0141206a2205290300370300200241186a2228200141186a220f29030037" - "0300200241106a2229200141106a22062903003703002002200129030037" - "03002002200141086a2207290300370308200220012001102f200241f800" - "6a2210200a290300370300200241f0006a22112003290300370300200241" - "e8006a22122004290300370300200241e0006a2213200529030037030020" - "0241d8006a2214200f290300370300200241d0006a221520062903003703" - "002002200729030037034820022001290300370340200241406b20012001" - "41406b2218102f20024180046a200241406b200241406b10302010200241" - "b8046a220b2903003703002011200241b0046a220c290300370300201220" - "0241a8046a220d2903003703002013200241a0046a220e29030037030020" - "1420024198046a2208290300370300201520024190046a22092903003703" - "0020022002290388043703482002200229038004370340200141f8006a22" - "19290300212a200141f0006a221a290300212b200141e8006a221b290300" - "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" - "00200241f0046a220f2006290300370300200220072903003703e8042002" - "20012903003703e004200241e0046a2001290340200141c8006a221d2903" - "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008200a29030037030020092003290300370300200220" - "0429030037038804200220052903003703800420024180046a202d202c20" - "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" - "37030020024190036a2204200f290300370300200241a0036a2205200229" - "038004370300200241a8036a2206200229038804370300200241b0036a22" - "072009290300370300200241b8036a221620082903003703002002200229" - "03e80437038803200220022903e0043703800320024180046a2002418003" - "6a20014180016a220a10302016200b2903003703002007200c2903003703" - "002006200d2903003703002005200e290300370300200320082903003703" - "002004200929030037030020022002290388043703880320022002290380" - "043703800320024180046a20024180036a20024180036a102f2016200b29" - "03003703002007200c2903003703002006200d2903003703002005200e29" - "030037030020032008290300370300200420092903003703002002200229" - "0388043703880320022002290380043703800320024190016a2203201e29" - "030037030020024198016a2204201f290300370300200241a0016a220520" - "1c290300370300200241a8016a2206201b290300370300200241b0016a22" - "07201a290300370300200241b8016a221620192903003703002002200129" - "0340370380012002201d2903003703880120024180016a2018200a102f20" - "024180046a20024180016a20024180016a10302016200b29030037030020" - "07200c2903003703002006200d2903003703002005200e29030037030020" - "042008290300370300200320092903003703002002200229038804370388" - "01200220022903800437038001200241d0016a221820014190016a290300" - "370300200241d8016a221920014198016a290300370300200241e0016a22" - "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" - "370300200241f0016a221c200141b0016a290300370300200241f8016a22" - "1d200141b8016a29030037030020022001290380013703c0012002200141" - "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" - "2016290300370300200241b0026a22162007290300370300200241a8026a" - "22072006290300370300200241a0026a2206200529030037030020024198" - "026a2205200429030037030020024190026a220420032903003703002002" - "42003703f803200242003703f003200242003703e803200242013703e003" - "200242003703d803200242003703d003200242003703c803200242093703" - "c00320022002290388013703880220022002290380013703800220024180" - "026a20024180016a200241c0036a102f20024180046a20024180026a2002" - "1030201e200b2903003703002016200c2903003703002007200d29030037" - "03002006200e290300370300200520082903003703002004200929030037" - "0300200241d0026a22032018290300370300200241d8026a221f20192903" - "00370300200241e0026a2220201a290300370300200241e8026a2221201b" - "290300370300200241f0026a2222201c290300370300200241f8026a2223" - "201d29030037030020022002290388043703880220022002290380043703" - "8002200220022903c0013703c002200220022903c8013703c802200241c0" - "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" - "41406b10302023200b2903003703002022200c2903003703002021200d29" - "03003703002020200e290300370300201f20082903003703002003200929" - "030037030020022002290388043703c80220022002290380043703c00220" - "024180046a200241406b20024180036a10302010200b2903003703002011" - "200c2903003703002012200d2903003703002013200e2903003703002014" - "200829030037030020152009290300370300200220022903880437034820" - "0220022903800437034020024180046a200241406b20024180016a103020" - "10200b2903003703002011200c2903003703002012200d29030037030020" - "13200e290300370300201420082903003703002015200929030037030020" - "022002290388043703482002200229038004370340200241d8046a220120" - "14290300370300200241d0046a220a201529030037030020022002290348" - "3703c804200220022903403703c004200241c0046a200229030020022903" - "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" - "0300370300200f2011290300370300200220122903003703e80420022013" - "2903003703e004200241e0046a2027290300202629030020252903002024" - "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" - "09200a290300222b370300200e20022903e004222c370300200c200f2903" - "00222d370300200d20022903e804222e370300200b2017290300222f3703" - "00200220022903c804223037038804200220022903c00422313703800420" - "10202f3703002011202d3703002012202e3703002013202c370300201420" - "2a3703002015202b37030020022030370348200220313703402001201429" - "0300370300200a2015290300370300200220022903483703c80420022002" - "2903403703c004200241c0046a20022903c00120022903c8012018290300" - "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" - "0f2011290300370300200220122903003703e804200220132903003703e0" - "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" - "222b370300200e20022903e004222c370300200c200f290300222d370300" - "200d20022903e804222e370300200b2017290300222f3703002002200229" - "03c804223037038804200220022903c0042231370380042010202f370300" - "2011202d3703002012202e3703002013202c3703002014202a3703002015" - "202b3703002002203037034820022031370340200041386a201e29030037" - "0300200041306a2016290300370300200041286a20072903003703002000" - "41206a2006290300370300200041186a2005290300370300200041106a20" - "04290300370300200041086a200229038802370300200020022903800237" - "0300200020022903c002370340200041c8006a20022903c8023703002000" - "41d0006a2003290300370300200041d8006a201f290300370300200041e0" - "006a2020290300370300200041e8006a2021290300370300200041f0006a" - "2022290300370300200041f8006a2023290300370300200041b8016a2010" - "290300370300200041b0016a2011290300370300200041a8016a20122903" - "00370300200041a0016a201329030037030020004198016a201429030037" - "030020004190016a201529030037030020004188016a2002290348370300" - "200020022903403703800120024180056a24000bfe09011d7e2001290310" - "22022001290300220484200141186a2903002215200141086a2903002203" - "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" - "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" - "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" - "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" - "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" - "01290320220484200141386a2903002208200141286a2903002203848442" - "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" - "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" - "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" - "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" - "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" - "006a290300210220012903702104200129036021032001290350220e2001" - "290340220f84200141d8006a2903002205200141c8006a29030022108484" - "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" - "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" - "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" - "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" - "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" - "2004842002200884844200520440427f4200427f4200200342788342c7fa" - "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" - "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" - "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" - "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" - "6a2903002108200141a8016a290300210220012903b001210420012903a0" - "01210342002105200129039001221220012903800122138420014198016a" - "290300221e20014188016a290300221484844200520440427f4200427f42" - "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" - "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" - "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" - "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" - "7d21110b4200211242002113420021142003200484200220088484420052" - "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" - "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" - "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" - "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" - "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" - "00200a3703900120002011370380012000200f3703702000200737036020" - "0020093703502000200d3703402000201a37033020002006370320200020" - "0b37031020002018370300200020143703b801200020123703a801200020" - "17370398012000201d37038801200020103703782000200e370368200020" - "163703582000201c3703482000201b370338200020153703282000200c37" - "0318200020193703080b960501057f230041800c6b220324002003200120" - "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" - "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" - "03b809200342003703b009200342003703a809200342013703a009200342" - "003703980920034200370390092003420037038809200342093703800920" - "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" - "6a290300370300200341d00b6a20034190026a290300370300200341d80b" - "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" - "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" - "6a290300370300200341f80b6a200341b8026a290300370300200341880b" - "6a20032903c801370300200341900b6a200341d0016a2903003703002003" - "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" - "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" - "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" - "2003290380023703c00b200320032903c0013703800b20034180066a2003" - "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" - "034180076a200341c00b6a220720034180016a103020034180096a200120" - "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" - "4180016a20034180046a1030200341c00a6a200220051030200620024140" - "6b20034180056a1030200720024180016a200341c0056a1030200341c007" - "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" - "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" - "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" - "0002400240200129034022212001290350222084200141c8006a29030022" - "23200141d8006a2903002222848442005204402002290340221d20022903" - "50221584200241c8006a2903002224200241d8006a290300221e8484500d" - "01200341f8016a2204200141406b220641186a2205290300370300200341" - "f0016a2208200641106a220b290300370300200320062903003703e00120" - "03200641086a220c2903003703e801200341e0016a202120232020202242" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" - "200241406b220741186a220d29030037030020034190026a220a20074110" - "6a220e2903003703002003200741086a220f290300370388022003200729" - "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" - "00200341106a200141106a2903003703002003200141086a290300370308" - "20032001290300370300200320032903800222162003290388022219200a" - "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200341386a2209200241186a290300370300200341306a220a" - "200241106a2903003703002003200241086a290300370328200320022903" - "00370320200341206a20032903e001222c20032903e80122302008290300" - "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b200341b8036a22042005290300370300200341b0036a2205200b2903" - "003703002003200c2903003703a803200320062903003703a003200341a0" - "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f102b200429030021132005290300211f20032903a803211c20032903a0" - "0321172004200d2903003703002005200e2903003703002003200f290300" - "3703a803200320072903003703a003200341a0036a201620192025202842" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" - "05290300211420032903a803211120032903a003211a200341d0006a2001" - "41306a290300370300200341d8006a2206200141386a2903003703002003" - "20012903203703402003200141286a290300370348200341406b201a2011" - "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" - "f8006a2207200241386a290300370300200341f0006a2208200241306a29" - "03003703002003200241286a290300370368200320022903203703602003" - "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b02402003200341206a104a450440200341406b200341e0006a" - "104a450d010b200420092903003703002005200a29030037030020032003" - "2903283703a803200320032903203703a003200341a0036a200329030020" - "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" - "290300211f2005290300211c20032903a003211720032903a80321122004" - "200729030037030020052008290300370300200320032903683703a80320" - "0320032903603703a003200341a0036a2003290340200329034820032903" - "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" - "842114201742018621112004290300211a2005290300211b20032903a803" - "211820032903a003212602400240201c4201862012423f8884222942ddb0" - "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" - "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" - "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" - "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" - "c689aece93b230511b450d002011212a201421110c010b20132029201420" - "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" - "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" - "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" - "21130b200341b8036a22012013370300200320293703b0032003202a3703" - "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" - "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "2003201f3703d8012003201c3703d001200320123703c801200320173703" - "c001200341c0016a20032903a003222920032903a803222a20032903b003" - "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b20184201862026423f888421112026420186212602400240201b4201" - "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" - "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" - "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" - "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" - "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" - "89aece93b230511b450d002026211a2011211b201821140c010b20132018" - "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" - "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" - "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" - "b2307d21130b20034198016a2201200341186a2903003703002003419001" - "6a2202200341106a29030037030020032003290308370388012003200329" - "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" - "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" - "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" - "290300370300200320032903483703a803200320032903403703a0032003" - "41a0036a20032903c001221120032903c801221820032903d00122272003" - "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b200320133703b802200320143703b0022003201b3703a8022003201a" - "3703a002200429030021262005290300212920032903a803212a20032903" - "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b230102d200329038801222b4201862003290380012211423f" - "88842118201142018621270240024020022903002211420186202b423f88" - "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" - "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" - "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" - "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" - "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" - "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" - "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" - "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" - "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" - "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" - "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" - "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" - "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d200341a0016a20032903800120032903880120032903900120" - "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b202a420186202d423f88842114202d4201862111024002402029420186" - "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" - "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" - "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" - "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" - "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" - "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" - "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" - "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" - "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" - "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" - "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" - "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" - "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" - "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" - "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" - "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" - "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" - "c689aece93b230511b450d002024212220232113202021140c010b202120" - "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" - "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" - "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" - "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" - "370300200320223703c002200320133703c802200341c0026a2022201320" - "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" - "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" - "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" - "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" - "0041186a200341b8026a290300370300200041106a200341b0026a290300" - "370300200041086a20032903a802370300200020032903a0023703002000" - "20032903a001370320200041286a20032903a801370300200041306a2003" - "41b0016a290300370300200041386a200341b8016a290300370300200020" - "032903c002370340200041c8006a20032903c802370300200041d0006a20" - "02290300370300200041d8006a20012903003703000c030b200341b8036a" - "2204200141186a290300221b370300200341b0036a2205200141106a2903" - "0022183703002003200141086a29030022163703a8032003200129030022" - "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" - "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" - "211d2005290300211520032903a803212420032903a003211f2004200141" - "206a220241186a2903003703002005200241106a29030037030020032002" - "41086a2903003703a803200320022903003703a003200341a0036a200129" - "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" - "1c20032903a8032117200420042903002225370300200320133703b00320" - "0320173703a8032003201c3703a003200341a0036a201c20172013202542" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" - "032903b003211e20032903a803211120032903a003211a02400240024020" - "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" - "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" - "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" - "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" - "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" - "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" - "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" - "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" - "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" - "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" - "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" - "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" - "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" - "90036a22062004290300370300200320032903a803370388032003200329" - "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d20012005290300370300200420062903003703002003200329" - "0388033703a80320032003290380033703a003200341a0036a201a201120" - "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" - "2903a0032213423f88842117201342018621120240024002402004290300" - "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" - "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" - "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" - "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" - "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" - "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" - "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" - "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" - "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" - "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" - "b87f2116201f42018621190240024020154201862024423f8884222842dd" - "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" - "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" - "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" - "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" - "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" - "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" - "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" - "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" - "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" - "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" - "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" - "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" - "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" - "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" - "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" - "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" - "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" - "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" - "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" - "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" - "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" - "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" - "88842112201b420186211602400240201c4201862018423f8884222542dd" - "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" - "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" - "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" - "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" - "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" - "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" - "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" - "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" - "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" - "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d2011420186201a423f88842116201a420186211a02400240" - "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" - "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" - "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" - "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" - "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" - "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" - "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" - "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" - "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" - "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" - "91a8b87f211420114201862111024002402012420186201a423f88842216" - "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" - "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" - "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" - "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" - "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" - "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" - "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" - "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" - "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" - "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" - "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" - "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" - "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" - "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" - "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" - "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" - "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" - "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" - "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" - "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" - "37030020034190036a2204200241106a2903003703002003200229030037" - "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" - "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" - "02200320243703e002200129030021212004290300212320032903800321" - "22200329038803211d200120133703002003201c37039003200320183703" - "88032003201b3703800320034180036a20032903a00320032903a8032003" - "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" - "e0026a200329038003200329038803200329039003200129030042c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" - "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" - "20224201862122024002402023420186201d423f8884221342ddb0858ce8" - "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" - "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" - "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" - "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" - "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" - "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" - "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" - "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" - "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" - "2023370340200020032903a003370300200020032903e002370320200020" - "2137035820002022370348200041086a20032903a803370300200041286a" - "20032903e802370300200041186a200341b8036a29030037030020004110" - "6a200341b0036a290300370300200041306a200341f0026a290300370300" - "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" - "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" - "230041a0016b220224000240200129034022082001290350220984200141" - "c8006a290300220a200141d8006a290300220b8484420052044020024200" - "370318200242003703102002420037030820024201370300024020014140" - "6b2002104a450440200241206a2001290320220837030020002001290300" - "2209370310200041306a2008370300200241386a200141386a2903002208" - "370300200241306a200141306a290300220a370300200241286a20014128" - "6a290300220b370300200241106a200141106a290300220c370300200241" - "186a200141186a290300220d370300200041186a200141086a290300220e" - "370300200041206a200c370300200041286a200d370300200041386a200b" - "370300200041406b200a370300200041c8006a2008370300200220093703" - "002002200e3703080c010b20024198016a2204200b370300200220093703" - "900120022008370380012002200a37038801200242a9c0c689aece93b230" - "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" - "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" - "20022903800121082002290388012109200229039001210a200241186a22" - "032004290300220b3703002002200a370310200220093703082002200837" - "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b2003290300210c2002290310210d2002290308210e20022903" - "00210f200241d0006a2204200141106a290300370300200241d8006a2205" - "200141186a290300370300200220012903003703402002200141086a2903" - "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" - "0241f0006a2207200141306a2903003703002002200141286a2903003703" - "68200220012903203703602003200b3703002002200a3703102002200937" - "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" - "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b200320052903002208370300200241106a200429030022093703002002" - "41206a2002290360220a370300200241286a2002290368220b3703002002" - "41306a2007290300220c370300200241386a2006290300220d3703002000" - "2002290340220e370310200041186a2002290348220f370300200041206a" - "2009370300200041286a2008370300200041306a200a370300200041386a" - "200b370300200041406b200c370300200041c8006a200d3703002002200f" - "3703082002200e3703000b20004200370308200042013703000c010b2000" - "4200370308200042003703000b200241a0016a24000b3000200128021c20" - "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" - "0128022028020c1103000bf917021d7f087e23004180066b220224002002" - "41b8036a2208200141386a290300370300200241b0036a2209200141306a" - "290300370300200241a8036a2213200141286a290300370300200241a003" - "6a2214200141206a29030037030020024198036a2203200141186a290300" - "37030020024190036a2204200141106a2903003703002002200129030037" - "0380032002200141086a2903003703880320024180036a20012001102f20" - "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" - "f0006a290300370300200241e8036a2207200141e8006a29030037030020" - "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" - "d8006a290300370300200241d0036a220c200141d0006a29030037030020" - "02200141c8006a2903003703c803200220012903403703c003200241c003" - "6a200141406b221e201e102f200241b8046a221520052903003703002002" - "41b0046a22162006290300370300200241a8046a22172007290300370300" - "200241a0046a2218200a29030037030020024198046a2219200b29030037" - "030020024190046a221a200c290300370300200220022903c80337038804" - "200220022903c0033703800420024180046a200241c0036a200241c0036a" - "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" - "026a2205290300370300200241f0046a220e200241f0026a220a29030037" - "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" - "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" - "2207290300370300200241d0046a2211200241d0026a220b290300370300" - "200220022903c8023703c804200220022903c0023703c004200241c0046a" - "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" - "200241d0056a220d2011290300370300200220022903c8043703c8052002" - "20022903c0043703c005200241c0056a2002290380032002290388032004" - "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" - "201b290300370300200241f0056a2204200e2903003703002002200f2903" - "003703e805200220102903003703e005200241e0056a2014290300201329" - "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" - "026a2208201229030037030020024190026a2209200d2903003703002002" - "41a8026a221320022903e805370300200241b0026a221420042903003703" - "00200241b8026a221b2003290300370300200220022903c8053703880220" - "0220022903c00537038002200220022903e0053703a00220122008290300" - "370300200d200929030037030020022002290388023703c8052002200229" - "0380023703c005200241c0056a200229038004200229038804201a290300" - "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" - "042014290300370300200220132903003703e805200220022903a0023703" - "e005200241e0056a201829030020172903002016290300201529030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200241186a22152012290300370300200241" - "106a2216200d290300370300200241206a221720022903e0053703002002" - "41286a221820022903e805370300200241306a2219200429030037030020" - "0241386a221a2003290300370300200220022903c8053703082002200229" - "03c005370300200241c0026a200220021030201a20052903003703002019" - "200a290300370300201820062903003703002017200c2903003703002015" - "20072903003703002016200b290300370300200220022903c80237030820" - "0220022903c002370300200241c0026a20024180036a20024180036a1030" - "200241406b200241c0026a20024180036a103020024190056a220e200241" - "d0006a29030037030020024198056a220f200241d8006a29030037030020" - "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" - "e8006a290300370300200241b0056a221c200241f0006a29030037030020" - "0241b8056a221d200241f8006a2903003703002002200229034037038005" - "200220022903483703880520024180056a200241406b200241406b102f20" - "0241c0026a2002200210302003200f2903003703002004200e2903003703" - "0020022002290388053703e80520022002290380053703e005200241e005" - "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d2008201d2903003703002009201c2903003703002002" - "201129030037038802200220102903003703800220024180026a20022903" - "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d2008290300211f200929030021202003290300212120042903002122" - "2002290388022123200229038002212420022903e805212520022903e005" - "212620024180016a20024180046a20024180046a1030200241c0026a2002" - "4180016a20024180016a1030200241b8016a220e20052903003703002002" - "41b0016a220f200a290300370300200241a8016a22102006290300370300" - "200241a0016a2211200c29030037030020024198016a221c200729030037" - "030020024190016a221d200b290300370300200220022903c80237038801" - "200220022903c00237038001200241c0026a20024180016a20024180016a" - "1030200e2005290300370300200f200a2903003703002010200629030037" - "03002011200c290300370300201c2007290300370300201d200b29030037" - "0300200220022903c80237038801200220022903c00237038001200241c0" - "016a201e20014180016a102f200320152903003703002004201629030037" - "0300200220022903083703e805200220022903003703e005200241e0056a" - "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" - "030020092019290300370300200220182903003703880220022017290300" - "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d20072003290300370300200b20042903003703002006200229038802" - "370300200a200929030037030020052008290300370300200220022903e8" - "053703c802200220022903e0053703c00220022002290380023703e00220" - "024180026a200241406b200241c0026a102f20122008290300370300200d" - "200929030037030020022002290388023703c80520022002290380023703" - "c005200241c0056a200229038001200229038801201d290300201c290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" - "00370300200220132903003703e805200220022903a0023703e005200241" - "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d20072012290300370300200b200d290300370300200c20" - "022903e005370300200620022903e805370300200a200429030037030020" - "052003290300370300200220022903c8053703c802200220022903c00537" - "03c00220004180016a200241c0016a200241c0016a10302000201f370338" - "200020203703302000202337032820002024370320200020213703182000" - "20223703102000202537030820002026370300200020022903c002370340" - "200041c8006a20022903c802370300200041d0006a200b29030037030020" - "0041d8006a2007290300370300200041e0006a200c290300370300200041" - "e8006a2006290300370300200041f0006a200a290300370300200041f800" - "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" - "6b22032400024002400240024020012903800120014188016a2903008442" - "00520d0020012903900120014198016a290300844200520d0020012903a0" - "01200141a8016a290300844200520d0020012903b001200141b8016a2903" - "0084500d010b024020022903800120024188016a290300844200520d0020" - "022903900120024198016a290300844200520d0020022903a001200241a8" - "016a290300844200520d0020022903b001200241b8016a29030084500d02" - "0b200341b8086a221420014180016a220441386a290300370300200341b0" - "086a200441306a290300370300200341a8086a2215200441286a29030037" - "0300200341a0086a200441206a29030037030020034198086a2216200441" - "186a29030037030020034190086a200441106a2903003703002003200429" - "0300370380082003200441086a2903003703880820034180086a20042004" - "102f200341f8086a221720024180016a220541386a290300370300200341" - "f0086a200541306a290300370300200341e8086a2218200541286a290300" - "370300200341e0086a200541206a290300370300200341d8086a22192005" - "41186a290300370300200341d0086a200541106a29030037030020032005" - "41086a2903003703c808200320052903003703c008200341c0086a200520" - "05102f20032001200341c0086a102f200341406b200220034180086a102f" - "20034180016a200420034180086a102f200341c0016a2005200341c0086a" - "102f20034180026a200141406b200341c0016a102f200341c0026a200241" - "406b20034180016a102f024002402003200341406b104a0d00200341206a" - "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" - "026a200341e0026a104a450d010b200341386a290300211f200341286a29" - "03002120200329033021212003290320212220034198076a2201200341d8" - "006a29030037030020034190076a2202200341d0006a2903003703002003" - "200329034837038807200320032903403703800720034180076a20032903" - "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" - "09200341f0006a2903003703002003200341e8006a2903003703c8072003" - "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d20034198036a200129030037030020034190036a200229" - "0300370300200341a8036a20032903c807370300200341b0036a20092903" - "00370300200341b8036a2006290300370300200320032903880737038803" - "200320032903800737038003200320032903c0073703a003200341b8026a" - "290300211f200341a8026a290300212020032903b002212120032903a002" - "21222001200341d8026a2903003703002002200341d0026a290300370300" - "200320032903c80237038807200320032903c0023703800720034180076a" - "20032903800220032903880220032903900220034198026a29030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" - "f0026a2903003703002003200341e8026a2903003703c807200320032903" - "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b230102d200341d8036a2001290300370300200341d0036a200229030037" - "0300200341e8036a20032903c807370300200341f0036a20092903003703" - "00200341f8036a200629030037030020032003290388073703c803200320" - "03290380073703c003200320032903c0073703e003200341c0076a200341" - "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" - "00200341b0096a200341f0076a2211290300370300200341a8096a200341" - "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" - "0020034198096a200629030037030020034190096a200929030037030020" - "0320032903c80737038809200320032903c0073703800920034180096a20" - "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" - "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" - "0320034180096a102f200341c0056a20034180026a20034180046a102f20" - "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" - "d8046a290300370300200341e0096a220b200341e0046a29030037030020" - "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" - "f0046a290300370300200341f8096a2210200341f8046a29030037030020" - "0320032903c0043703c009200320032903c8043703c809200341c0096a20" - "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" - "0341d0066a2207200a290300370300200320032903c8093703c806200320" - "032903c0093703c006200341c0066a200329038004200329038804200329" - "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" - "2903003703002009200f2903003703002003200e2903003703c807200320" - "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" - "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" - "200829030037030020022007290300370300200341a8076a220e20032903" - "c807370300200341b0076a220f2009290300370300200341b8076a221020" - "06290300370300200320032903c80637038807200320032903c006370380" - "07200320032903c0073703a007200341c0076a20034180056a2003418005" - "6a103020034198066a2212200129030037030020034190066a2213200229" - "030037030020032003290388073703880620032003290380073703800620" - "034180066a20032903c00720032903c80720032903d007200629030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200820102903003703002007200f29030037" - "03002003200e2903003703c806200320032903a0073703c006200341c006" - "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008290300211f20072903002120201229030021212013" - "290300212220032903c806212320032903c0062124200329038806212520" - "03290380062126200820034198056a290300370300200720034190056a29" - "030037030020032003290388053703c80620032003290380053703c00620" - "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" - "0341b8056a2903003703002002200341b0056a2903003703002003200341" - "a8056a29030037038807200320032903a0053703800720034180076a2024" - "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" - "20092007290300370300200d200329038807370300201120022903003703" - "00200c2001290300370300200320032903c8063703c807200320032903c0" - "063703c00720032003290380073703e00720034180076a200341c0046a20" - "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" - "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" - "032003290388073703e80a20032003290380073703e00a200341e00a6a20" - "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d200820102903003703002007200f2903003703002003200e" - "2903003703c806200320032903a0073703c006200341c0066a20032903e0" - "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d2012200a2903003703002013200b290300370300200341a0066a221b20" - "032903c006370300200341a8066a221c20032903c806370300200341b006" - "6a221d2007290300370300200341b8066a221e2008290300370300200320" - "032903e80a37038806200320032903e00a37038006200341c0076a200420" - "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" - "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" - "1a290300370300200341980a6a22112006290300370300200341900a6a22" - "062009290300370300200320032903c8073703880a200320032903c00737" - "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" - "370300200b2006290300370300200320032903880a3703e80a2003200329" - "03800a3703e00a200341e00a6a2003290380082003290388082003290390" - "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" - "200720052903003703002003200c2903003703c8062003200d2903003703" - "c006200341c0066a20032903a008201529030020032903b0082014290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" - "00370300200e20032903c806370300200f20072903003703002010200829" - "0300370300200320032903e80a37038807200320032903e00a3703800720" - "0320032903c0063703a007200341d80a6a22042001290300370300200341" - "d00a6a2201200229030037030020032003290388073703c80a2003200329" - "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" - "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" - "200b200f2903003703002003200e2903003703e80a200320032903a00737" - "03e00a200341e00a6a20032903e008201829030020032903f00820172903" - "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" - "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" - "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" - "00370300200341f8066a200a290300370300200320032903c80a3703c806" - "200320032903c00a3703c006200320032903e00a3703e00620004180016a" - "200341c0066a20034180036a102f2000201f370338200020203703302000" - "202337032820002024370320200020213703182000202237031020002025" - "370308200020263703002000200329038006370340200041c8006a200329" - "038806370300200041d0006a2013290300370300200041d8006a20122903" - "00370300200041e0006a201b290300370300200041e8006a201c29030037" - "0300200041f0006a201d290300370300200041f8006a201e290300370300" - "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" - "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" - "24000240024002400240024020012903800120014188016a290300844200" - "520d0020012903900120014198016a290300844200520d0020012903a001" - "200141a8016a290300844200520d0020012903b001200141b8016a290300" - "84500d010b200241d8006a4200370300200241e0006a2204420037030020" - "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" - "030020024200370348200242013703402002420037035020014180016a22" - "03200241406b104a450440200141a0016a2004104a450d020b200241406b" - "200310312002280240410171450d02200241386a20024188016a29030022" - "05370300200241306a20024180016a22032903002206370300200241286a" - "200241f8006a2903002207370300200241206a200241f0006a2903002208" - "370300200241186a200241e8006a2903002209370300200241106a200241" - "e0006a290300220a37030020024190026a200a37030020024198026a2009" - "370300200241a0026a2008370300200241a8026a2007370300200241b002" - "6a2006370300200241b8026a200537030020022002290350220537030020" - "02200241d8006a2903002206370308200220053703800220022006370388" - "0220024180026a20022002102f200241406b200120024180026a102f2002" - "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" - "0041106a200241406b418001104c1a20004200370308200042013703000c" - "030b20004200370308200042003703000c020b200241b8016a200141f800" - "6a290300370300200241b0016a200141f0006a290300370300200241a801" - "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" - "0020024198016a200141d8006a29030037030020024190016a200141d000" - "6a29030037030020024188016a200141c8006a290300370300200241d000" - "6a200141106a290300370300200241d8006a200141186a29030037030020" - "0241e0006a200141206a290300370300200241e8006a200141286a290300" - "370300200241f0006a200141306a290300370300200241f8006a20014138" - "6a2903003703002002200129034037038001200220012903003703402002" - "200141086a290300370348200041106a200241406b418001104c1a200042" - "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" - "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" - "006a220e290300370300200241306a2240200141f0006a220f2903003703" - "00200241286a2241200141e8006a2210290300370300200241206a224220" - "0141e0006a2211290300370300200241186a2243200141d8006a22122903" - "00370300200241106a2244200141d0006a22202903003703002002200129" - "03403703002002200141c8006a2221290300370308200141a8016a222329" - "03002153200141a0016a22242903002154200141b8016a22252903002155" - "200141b0016a2230290300215620014188016a2235290300215720014198" - "016a2236290300215820014190016a22372903002159200129038001215a" - "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" - "016a2214290300370300200241e8006a200141e8016a2215290300370300" - "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" - "016a2217290300370300200241d0006a200141d0016a220d290300370300" - "20024190016a20014190026a220429030037030020024198016a20014198" - "026a2206290300370300200241a0016a200141a0026a2207290300370300" - "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" - "026a2205290300370300200241b8016a200141b8026a2209290300370300" - "2002200141c8016a2222290300370348200220012903c001370340200220" - "012903800237038001200220014188026a220a29030037038801200241f8" - "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" - "290300370300200241e8016a200141e8026a2246290300370300200241e0" - "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" - "290300370300200241d0016a200141d0026a2249290300370300200241b8" - "026a2226200141386a2231290300370300200241b0026a2227200141306a" - "2232290300370300200241a8026a2228200141286a223a29030037030020" - "0241a0026a2229200141206a223b29030037030020024198026a222a2001" - "41186a223c29030037030020024190026a222b200141106a223d29030037" - "03002002200141c8026a224a2903003703c801200220012903c0023703c0" - "012002200141086a223e2903003703880220022001290300370380022002" - "4180026a200120014180026a2203102f200241f8026a2219203129030037" - "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" - "00370300200241e0026a221c203b290300370300200241d8026a221d203c" - "290300370300200241d0026a221e203d2903003703002002203e29030037" - "03c802200220012903003703c002200241c0026a200120031030200241b8" - "036a220b2009290300370300200241b0036a220920052903003703002002" - "41a8036a22052008290300370300200241a0036a220c2007290300370300" - "20024198036a2218200629030037030020024190036a221f200429030037" - "0300200242003703b80d200242003703b00d200242003703a80d20024201" - "3703a00d200242003703980d200242003703900d200242003703880d2002" - "42093703800d2002200a2903003703880320022001290380023703800320" - "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" - "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" - "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" - "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" - "04290300370300200220022903c80b37038803200220022903c00b370380" - "03200241c00b6a200241c0026a20024180036a102f201920062903003703" - "00201a2007290300370300201b2008290300370300201c20052903003703" - "00201d2003290300370300201e2004290300370300200220022903c80b37" - "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" - "00200241900f6a220c201e290300370300200220022903c8023703880f20" - "0220022903c0023703800f200241800f6a20022903800220022903880220" - "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" - "092019290300370300200241900a6a220a201a2903003703002002201b29" - "03003703880a2002201c2903003703800a200241800a6a20292903002028" - "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" - "0b290300224b3703002004200c290300224c370300200520022903800a22" - "4d3703002007200a290300224e370300200820022903880a224f37030020" - "0620092903002250370300200220022903880f22513703c80b2002200229" - "03800f22523703c00b20192050370300201a204e370300201b204f370300" - "201c204d370300201d204b370300201e204c370300200220513703c80220" - "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" - "1d290300370300200c201e290300370300200220022903c8023703880f20" - "0220022903c0023703800f200241800f6a20022903c00320022903c80320" - "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" - "2019290300370300200a201a2903003703002002201b2903003703880a20" - "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" - "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2003200b290300224b3703002004200c290300224c370300200520022903" - "800a224d3703002007200a290300224e370300200820022903880a224f37" - "0300200620092903002250370300200220022903880f22513703c80b2002" - "20022903800f22523703c00b20192050370300201a204e370300201b204f" - "370300201c204d370300201d204b370300201e204c370300200220513703" - "c802200220523703c002200241c00b6a20024180026a20024180026a1030" - "202620062903003703002027200729030037030020282008290300370300" - "20292005290300370300202a2003290300370300202b2004290300370300" - "200220022903c80b37038802200220022903c00b3703800220024190046a" - "221f200d29030037030020024198046a222c2017290300370300200241a0" - "046a222d2016290300370300200241a8046a222e20152903003703002002" - "41b0046a222f2014290300370300200241b8046a22392013290300370300" - "200220012903c00137038004200220222903003703880420024180046a20" - "0141c0016a223320014180016a2234102f200241f8046a22182013290300" - "370300200241f0046a22132014290300370300200241e8046a2214201529" - "0300370300200241e0046a22152016290300370300200241d8046a221620" - "17290300370300200241d0046a2217200d29030037030020022022290300" - "3703c804200220012903c0013703c004200241c0046a2033203410302002" - "41b8056a220d2025290300370300200241b0056a22222030290300370300" - "200241a8056a22252023290300370300200241a0056a2223202429030037" - "030020024198056a2224203629030037030020024190056a223020372903" - "003703002002203529030037038805200220012903800137038005200241" - "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" - "0d2006290300370300202220072903003703002025200829030037030020" - "232005290300370300202420032903003703002030200429030037030020" - "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" - "0241c0046a20024180056a102f2018200629030037030020132007290300" - "370300201420082903003703002015200529030037030020162003290300" - "37030020172004290300370300200220022903c80b3703c8042002200229" - "03c00b3703c004200b2016290300370300200c2017290300370300200220" - "022903c8043703880f200220022903c0043703800f200241800f6a200229" - "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d20092018290300370300200a201329030037030020022014290300" - "3703880a200220152903003703800a200241800a6a202d290300202e2903" - "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" - "0300224b3703002004200c290300224c370300200520022903800a224d37" - "03002007200a290300224e370300200820022903880a224f370300200620" - "092903002250370300200220022903880f22513703c80b20022002290380" - "0f22523703c00b201820503703002013204e3703002014204f3703002015" - "204d3703002016204b3703002017204c370300200220513703c804200220" - "523703c004200241c0056a20024180046a200241800d6a102f200b201629" - "0300370300200c2017290300370300200220022903c8043703880f200220" - "022903c0043703800f200241800f6a20022903c00520022903c805200229" - "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" - "290300370300200a2013290300370300200220142903003703880a200220" - "152903003703800a200241800a6a20022903e005200241e8056a29030020" - "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" - "200b290300224b3703002004200c290300224c370300200520022903800a" - "224d3703002007200a290300224e370300200820022903880a224f370300" - "200620092903002250370300200220022903880f22513703c80b20022002" - "2903800f22523703c00b201820503703002013204e3703002014204f3703" - "002015204d3703002016204b3703002017204c370300200220513703c804" - "200220523703c004200241c00b6a20024180046a20024180046a10302039" - "2006290300370300202f2007290300370300202e2008290300370300202d" - "2005290300370300202c2003290300370300201f20042903003703002002" - "20022903c80b37038804200220022903c00b3703800420024190066a2222" - "202029030037030020024198066a22332012290300370300200241a0066a" - "22342011290300370300200241a8066a22232010290300370300200241b0" - "066a2224200f290300370300200241b8066a2225200e2903003703002002" - "200129034037038006200220212903003703880620024180066a20014140" - "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" - "f0066a220e200f290300370300200241e8066a220f201029030037030020" - "0241e0066a22102011290300370300200241d8066a221120122903003703" - "00200241d0066a22122020290300370300200220212903003703c8062002" - "20012903403703c006200241c0066a200220301030200241b8076a222020" - "38290300370300200241b0076a22212045290300370300200241a8076a22" - "352046290300370300200241a0076a223620472903003703002002419807" - "6a2237204829030037030020024190076a22382049290300370300200220" - "4a29030037038807200220012903c0023703800720024180076a20302002" - "41800d6a102f200241c00b6a20024180076a200210302020200629030037" - "030020212007290300370300203520082903003703002036200529030037" - "03002037200329030037030020382004290300370300200220022903c80b" - "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" - "4180076a102f200d2006290300370300200e2007290300370300200f2008" - "290300370300201020052903003703002011200329030037030020122004" - "290300370300200220022903c80b3703c806200220022903c00b3703c006" - "200b2011290300370300200c2012290300370300200220022903c8063703" - "880f200220022903c0063703800f200241800f6a20022903800620022903" - "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" - "290300370300200a200e2903003703002002200f2903003703880a200220" - "102903003703800a200241800a6a20342903002023290300202429030020" - "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" - "2004200c290300224c370300200520022903800a224d3703002007200a29" - "0300224e370300200820022903880a224f37030020062009290300225037" - "0300200220022903880f22513703c80b200220022903800f22523703c00b" - "200d2050370300200e204e370300200f204f3703002010204d3703002011" - "204b3703002012204c370300200220513703c806200220523703c0062002" - "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" - "2012290300370300200220022903c8063703880f200220022903c0063703" - "800f200241800f6a20022903c00720022903c80720022903d007200241d8" - "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" - "0a200e2903003703002002200f2903003703880a20022010290300370380" - "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" - "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" - "3703002004200c290300224c370300200520022903800a224d3703002007" - "200a290300224e370300200820022903880a224f37030020062009290300" - "2250370300200220022903880f22513703c80b200220022903800f225237" - "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" - "002011204b3703002012204c370300200220513703c806200220523703c0" - "06200241c00b6a20024180066a20024180066a1030202520062903003703" - "002024200729030037030020232008290300370300203420052903003703" - "002033200329030037030020222004290300370300200220022903c80b37" - "038806200220022903c00b370380062009201d290300370300200a201e29" - "0300370300200220022903c8023703880a200220022903c0023703800a20" - "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b230102d200320192903003703002004201a29030037030020" - "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" - "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" - "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" - "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" - "312003290300370300200220022903880a3703c80d200220022903800a37" - "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" - "3703002021200729030037030020202008290300370300201e2005290300" - "370300201c2003290300370300201d2004290300370300200220022903c8" - "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" - "0241c0026a10302031200629030037030020212007290300370300202020" - "08290300370300201e2005290300370300201c2003290300370300201d20" - "0429030037030020024190086a2232202b29030037030020024198086a22" - "2b202a290300370300200241a0086a222a2029290300370300200241a808" - "6a22292028290300370300200241b0086a22282027290300370300200241" - "b8086a22272026290300370300200220022903c80b3703c80d2002200229" - "03c00b3703c00d2002200229038002370380082002200229038802370388" - "0820024180086a20024180026a20024180016a1030200241c00b6a200241" - "80086a20024180086a103020272006290300370300202820072903003703" - "0020292008290300370300202a2005290300370300202b20032903003703" - "0020322004290300370300200220022903c80b37038808200220022903c0" - "0b37038008200241c00b6a20024180086a20024180026a10302027200629" - "03003703002028200729030037030020292008290300370300202a200529" - "0300370300202b200329030037030020322004290300370300200241d008" - "6a22012022290300370300200241d8086a220b2033290300370300200241" - "e0086a220c2034290300370300200241e8086a2219202329030037030020" - "0241f0086a221a2024290300370300200241f8086a221b20252903003703" - "00200220022903c80b37038808200220022903c00b370380082002200229" - "0380063703c00820022002290388063703c808200241c0086a2002418006" - "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" - "2006290300370300201a200729030037030020192008290300370300200c" - "2005290300370300200b2003290300370300200120042903003703002002" - "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" - "41c0086a200241c0086a1030201b2006290300370300201a200729030037" - "030020192008290300370300200c2005290300370300200b200329030037" - "030020012004290300370300200220022903c80b3703c808200220022903" - "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" - "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" - "29030037030020192008290300370300200c2005290300370300200b2003" - "29030037030020012004290300370300200220022903c80b3703c8082002" - "20022903c00b3703c00820092011290300370300200a2012290300370300" - "200220022903c8063703880a200220022903c0063703800a200241800a6a" - "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" - "03002004200e2903003703002002200f2903003703c80b20022010290300" - "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" - "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" - "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" - "22122003290300370300200220022903880a3703880e200220022903800a" - "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" - "003703002011200729030037030020102008290300370300200f20052903" - "00370300200d2003290300370300200e2004290300370300200220022903" - "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" - "200241c0066a103020122006290300370300201120072903003703002010" - "2008290300370300200f2005290300370300200d2003290300370300200e" - "2004290300370300200220022903c80b3703880e200220022903c00b3703" - "800e20092016290300370300200a2017290300370300200220022903c804" - "3703880a200220022903c0043703800a200241800a6a2002290300200229" - "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" - "29030037030020042013290300370300200220142903003703c80b200220" - "152903003703c00b200241c00b6a20422903002041290300204029030020" - "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" - "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" - "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" - "22162004290300370300200241f80e6a2217200329030037030020022002" - "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" - "0e6a200241c00e6a10302017200629030037030020162007290300370300" - "201520082903003703002014200529030037030020182003290300370300" - "20132004290300370300200220022903c80b3703c80e200220022903c00b" - "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" - "003703002016200729030037030020152008290300370300201420052903" - "003703002018200329030037030020132004290300370300200241d0096a" - "2226201f290300370300200241d8096a221f202c290300370300200241e0" - "096a222c202d290300370300200241e8096a222d202e2903003703002002" - "41f0096a222e202f290300370300200241f8096a222f2039290300370300" - "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" - "80043703c00920022002290388043703c809200241c0096a20024180046a" - "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" - "2006290300370300202e2007290300370300202d2008290300370300202c" - "2005290300370300201f2003290300370300202620042903003703002002" - "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" - "41c0096a20024180046a1030202f2006290300370300202e200729030037" - "0300202d2008290300370300202c2005290300370300201f200329030037" - "030020262004290300370300200220022903c80b3703c809200220022903" - "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" - "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" - "03002009201c290300370300200a201d290300370300200220022903c80d" - "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" - "00200241d00a6a2013290300370300200241d80a6a201829030037030020" - "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" - "f00a6a2016290300370300200241f80a6a20172903003703002002200229" - "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" - "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" - "370300200241980b6a200d290300370300200241900b6a200e2903003703" - "00200241880b6a20022903880e370300200220022903800e3703800b2006" - "201b2903003703002007201a290300370300200820192903003703002005" - "200c2903003703002003200b290300370300200420012903003703002002" - "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" - "29038808370300200241900c6a2032290300370300200241980c6a202b29" - "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" - "370300200241b00c6a2028290300370300200241b80c6a20272903003703" - "0020022002290380083703800c200241f80c6a202f290300370300200241" - "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" - "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" - "26290300370300200241c80c6a20022903c809370300200220022903c009" - "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" - "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" - "024101712206450440200341386a200141386a290300370300200341306a" - "200141306a290300370300200341286a200141286a290300370300200341" - "206a200141206a290300370300200341186a200141186a29030037030020" - "0341106a200141106a290300370300200320012903003703002003200141" - "086a29030037030820034190016a200141d0006a29030037030020034198" - "016a200141d8006a290300370300200341a0016a200141e0006a29030037" - "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" - "006a290300370300200341b8016a200141f8006a29030037030020032001" - "290340370380012003200141c8006a290300370388010c010b200341d801" - "6a2204200141386a290300370300200341d0016a2205200141306a290300" - "370300200320012903203703c0012003200141286a2903003703c8012003" - "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f102b200341186a200141186a290300370300200341106a" - "200141106a290300370300200341286a20032903c801370300200341306a" - "2005290300370300200341386a20042903003703002003200141086a2903" - "0037030820032001290300370300200320032903c0013703202004200141" - "f8006a2903003703002005200141f0006a2903003703002003200141e800" - "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "20034198016a200141d8006a29030037030020034190016a200141d0006a" - "290300370300200341a8016a20032903c801370300200341b0016a200529" - "0300370300200341b8016a20042903003703002003200141c8006a290300" - "370388012003200129034037038001200320032903c0013703a0010b0240" - "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" - "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" - "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" - "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" - "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" - "3703c0010c020b200341e0016a22024200370300200241086a4200370300" - "200241106a4200370300200241186a4200370300200342a9c0c689aece93" - "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" - "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" - "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" - "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" - "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" - "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" - "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" - "200341c0016a102f02402006450440200341b8016a200241386a29030037" - "0300200341b0016a200241306a290300370300200341a8016a200241286a" - "290300370300200341a0016a200241206a29030037030020034198016a20" - "0241186a29030037030020034190016a200241106a290300370300200320" - "02290300370380012003200241086a290300370388010c010b200341d801" - "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" - "0300370300200320012903a0013703c0012003200141a8016a2903003703" - "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" - "20034190016a200241106a290300370300200341a8016a20032903c80137" - "0300200341b0016a2005290300370300200341b8016a2006290300370300" - "2003200241086a2903003703880120032002290300370380012003200329" - "03c0013703a0010b0240024002400240200441026b0e020102000b200342" - "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" - "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" - "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" - "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" - "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" - "00370300200141106a4200370300200141186a4200370300200342003703" - "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" - "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" - "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" - "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" - "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" - "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" - "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" - "6a200341386a290300370300200041306a200341306a2903003703002000" - "41286a200341286a290300370300200041206a200341206a290300370300" - "200041186a200341186a290300370300200041106a200341106a29030037" - "0300200041086a2003290308370300200020032903003703002000200329" - "0340370340200041c8006a2003290348370300200041d0006a200341d000" - "6a290300370300200041d8006a200341d8006a290300370300200041e000" - "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" - "00200041f0006a200341f0006a290300370300200041f8006a200341f800" - "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" - "052400200541b8016a2234200141b8016a2235290300370300200541b001" - "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" - "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" - "0020054198016a223c20014198016a223d29030037030020054190016a22" - "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" - "4f290300370300200541d8016a222f200141d8016a225029030037030020" - "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" - "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" - "0300370300200541f8016a2233200141f8016a2254290300370300200520" - "012903800137038001200520012903c0013703c001200520014188016a22" - "40290300370388012005200141c8016a22552903003703c801200541b802" - "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" - "6a2221290300370300200541a8026a2258200141e8026a22282903003703" - "00200541a0026a2259200141e0026a222929030037030020054198026a22" - "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" - "2b290300370300200541d0026a2241200141106a22062903003703002005" - "41d8026a2242200141186a2207290300370300200541e0026a2243200141" - "206a2208290300370300200541e8026a2244200141286a22092903003703" - "00200541f0026a2245200141306a220a290300370300200541f8026a2246" - "200141386a220b2903003703002005200141c8026a222c29030037038802" - "200520012903c00237038002200520012903003703c0022005200141086a" - "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" - "35290300370300200541b0036a225d2037290300370300200541a8036a22" - "5e2039290300370300200541a0036a225f203b2903003703002005419803" - "6a2260203d29030037030020054190036a2261203f290300370300200520" - "402903003703880320052001290380013703800320054180036a20014180" - "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" - "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" - "026a290300370300200541e0036a2265200141a0026a2903003703002005" - "41d8036a226620014198026a290300370300200541d0036a226720014190" - "026a290300370300200520014188026a2903003703c80320052001290380" - "023703c003200541c0036a20014180026a22472003102f200541b8046a22" - "68200b290300370300200541b0046a2269200a290300370300200541a804" - "6a226a2009290300370300200541a0046a226b2008290300370300200541" - "98046a226c200729030037030020054190046a226d200629030037030020" - "05200c29030037038804200520012903003703800420054180046a200120" - "471030200541f8046a226e200b290300370300200541f0046a226f200a29" - "0300370300200541e8046a22702009290300370300200541e0046a227120" - "08290300370300200541d8046a22722007290300370300200541d0046a22" - "7320062903003703002005200c2903003703c804200520012903003703c0" - "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" - "0300370300200541b0056a2249200141f0006a2213290300370300200541" - "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" - "e0006a221529030037030020054198056a224c200141d8006a221c290300" - "37030020054190056a224d200141d0006a221d2903003703002005200141" - "c8006a221e29030037038805200520012903403703800520054180056a20" - "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" - "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" - "096a220d290300370300204a200541e8096a220e290300370300204b2005" - "41e0096a220f290300370300204c200541d8096a2210290300370300204d" - "200541d0096a2211290300370300200520052903c8093703880520052005" - "2903c00937038005200541d0056a2222201d290300370300200541d8056a" - "2223201c290300370300200541e0056a22242015290300370300200541e8" - "056a22252014290300370300200541f0056a222620132903003703002005" - "41f8056a22272012290300370300200520012903403703c0052005201e29" - "03003703c805200541c0056a201f2004102f200541b8066a221620272903" - "00370300200541b0066a22172026290300370300200541a8066a22182025" - "290300370300200541a0066a2219202429030037030020054198066a221a" - "202329030037030020054190066a221b2022290300370300200520052903" - "c80537038806200520052903c0053703800620054180066a200541c0056a" - "200541c0036a1030200542003703b80b200542003703b00b200542003703" - "a80b200542013703a00b200542003703980b200542003703900b20054200" - "3703880b200542093703800b200541c0096a20054180066a200541800b6a" - "102f2016200c2903003703002017200d2903003703002018200e29030037" - "03002019200f290300370300201a2010290300370300201b201129030037" - "0300200520052903c80937038806200520052903c00937038006200541c0" - "096a20054180066a200541c0026a10302016200c29030022810137030020" - "17200d2903002282013703002018200e2903002283013703002019200f29" - "0300228401370300201a2010290300228501370300201b20112903002286" - "01370300200541106a2275208601370300200541186a2276208501370300" - "200541206a2277208401370300200541286a227820830137030020054130" - "6a2279208201370300200541386a227a208101370300200520052903c809" - "22810137038806200520052903c009228201370380062005208201370300" - "2005208101370308200541f8066a22062020290300370300200541f0066a" - "22072021290300370300200541e8066a22082028290300370300200541e0" - "066a22092029290300370300200541d8066a220a202a2903003703002005" - "41d0066a220b202b2903003703002005202c2903003703c8062005200129" - "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" - "6a200541c0066a10302027200c2903003703002026200d29030037030020" - "25200e2903003703002024200f2903003703002023201029030037030020" - "222011290300370300200520052903c8093703c805200520052903c00937" - "03c005200541c0096a200541c0066a20054180036a10302006200c290300" - "2281013703002007200d2903002282013703002008200e29030022830137" - "03002009200f290300228401370300200a2010290300228501370300200b" - "2011290300228601370300201b208601370300201a208501370300201920" - "840137030020182083013703002017208201370300201620810137030020" - "0520052903c8092281013703c806200520052903c0092282013703c00620" - "052082013703800620052081013703880620054180066a200541c0066a20" - "0541800b6a102f2006201229030037030020072013290300370300200820" - "1429030037030020092015290300370300200a201c290300370300200b20" - "1d2903003703002005201e2903003703c806200520012903403703c00620" - "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" - "302027200c2903003703002026200d2903003703002025200e2903003703" - "002024200f29030037030020232010290300370300202220112903003703" - "00200520052903c8093703c805200520052903c0093703c005200541c009" - "6a20054180066a200541c0066a10302016200c2903002281013703002017" - "200d2903002282013703002018200e2903002283013703002019200f2903" - "00228401370300201a2010290300228501370300201b2011290300228601" - "370300200541d0006a227b208601370300200541d8006a227c2085013703" - "00200541e0006a227d208401370300200541e8006a227e20830137030020" - "0541f0006a227f208201370300200541f8006a2280012081013703002005" - "20052903c80922810137038806200520052903c009228201370380062005" - "2082013703402005208101370348200541b8076a221c200241386a222829" - "0300370300200541b0076a221d200241306a2229290300370300200541a8" - "076a221e200241286a222a290300370300200541a0076a221f200241206a" - "222b29030037030020054198076a2220200241186a222c29030037030020" - "054190076a2221200241106a222d2903003703002005200241086a224e29" - "030037038807200520022903003703800720054180076a20022004103020" - "06206e2903003703002007206f2903003703002008207029030037030020" - "092071290300370300200a2072290300370300200b207329030037030020" - "0520052903c8043703c806200520052903c0043703c006200541c0066a20" - "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" - "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" - "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" - "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" - "0629030037030020054190086a2213200729030037030020052008290300" - "37038808200520092903003703800820054180086a204329030020442903" - "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" - "030022810137030020112015290300228201370300200f20052903800822" - "8301370300200d2013290300228401370300200e20052903880822850137" - "0300200c2012290300228601370300200520052903c80b2287013703c809" - "200520052903c00b2288013703c009200620860137030020072084013703" - "0020082085013703002009208301370300200a208101370300200b208201" - "37030020052087013703c80620052088013703c0062014200a2903003703" - "002015200b290300370300200520052903c8063703c80b200520052903c0" - "063703c00b200541c00b6a20052903800322810120052903880322820120" - "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" - "122006290300370300201320072903003703002005200829030037038808" - "200520092903003703800820054180086a205f290300228501205e290300" - "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d2010201429030022890137030020112015290300228a0137030020" - "0f200529038008228b01370300200d2013290300228c01370300200e2005" - "29038808228d01370300200c2012290300228e01370300200520052903c8" - "0b228f013703c809200520052903c00b2290013703c0092006208e013703" - "002007208c013703002008208d013703002009208b01370300200a208901" - "370300200b208a013703002005208f013703c80620052090013703c00620" - "162054290300370300201720532903003703002018205229030037030020" - "192051290300370300201a2050290300370300201b204f29030037030020" - "05205529030037038806200520012903c0013703800620054180066a2074" - "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" - "003703002026200d2903003703002025200e2903003703002024200f2903" - "003703002023201029030037030020222011290300370300200520052903" - "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" - "20054180066a10302006200c2903003703002007200d2903003703002008" - "200e2903003703002009200f290300370300200a2010290300370300200b" - "2011290300370300200520052903c8093703c806200520052903c0093703" - "c0062021203f2903003703002020203d290300370300201f203b29030037" - "0300201e2039290300370300201d2037290300370300201c203529030037" - "030020052001290380013703800720052040290300370388072005418007" - "6a20054180016a2047103020342006290300370300203620072903003703" - "0020382008290300370300203a2009290300370300203c200a2903003703" - "00203e200b290300370300200541d0076a200441106a2903003703002005" - "41d8076a200441186a290300370300200541e0076a200441206a29030037" - "0300200541e8076a200441286a290300370300200541f0076a200441306a" - "290300370300200541f8076a200441386a290300370300200520052903c8" - "0637038801200520052903c00637038001200520042903003703c0072005" - "200441086a2903003703c807200541c0076a2004200310302006201c2903" - "003703002007201d2903003703002008201e2903003703002009201f2903" - "00370300200a2020290300370300200b2021290300370300200520052903" - "88073703c80620052005290380073703c006200541c0066a20054180076a" - "200541c0076a102f2014200a2903003703002015200b2903003703002005" - "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" - "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" - "003703002013200729030037030020052008290300370388082005200929" - "03003703800820054180086a20850120860120870120880142c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d20102014290300228101370300201120152903002282" - "01370300200f200529038008228301370300200d20132903002284013703" - "00200e200529038808228501370300200c20122903002286013703002005" - "20052903c80b2287013703c809200520052903c00b2288013703c0092006" - "208601370300200720840137030020082085013703002009208301370300" - "200a208101370300200b20820137030020052087013703c8062005208801" - "3703c0062014200a2903003703002015200b290300370300200520052903" - "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" - "22810120052903c8032282012067290300228301206629030022840142c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d201220062903003703002013200729030037" - "03002005200829030037038808200520092903003703800820054180086a" - "206529030022850120642903002286012063290300228701206229030022" - "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" - "112015290300228a01370300200f200529038008228b01370300200d2013" - "290300228c01370300200e200529038808228d01370300200c2012290300" - "228e01370300200520052903c80b228f013703c809200520052903c00b22" - "90013703c0092006208e013703002007208c013703002008208d01370300" - "2009208b01370300200a208901370300200b208a013703002005208f0137" - "03c80620052090013703c006201620062903003703002017200729030037" - "03002018200829030037030020192009290300370300201a200a29030037" - "0300201b200b290300370300200520052903c80637038806200520052903" - "c0063703800620054180066a200541c0066a200541800b6a102f20062033" - "290300370300200720322903003703002008203129030037030020092030" - "290300370300200a202f290300370300200b202e29030037030020052005" - "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" - "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" - "2903003703002026200d2903003703002025200e2903003703002024200f" - "290300370300202320102903003703002022201129030037030020052005" - "2903c8093703c805200520052903c0093703c005200541c0096a20054180" - "066a200541c0066a10302016200c2903002289013703002017200d290300" - "228a013703002018200e290300228b013703002019200f290300228c0137" - "0300201a2010290300228d01370300201b2011290300228e01370300202e" - "208e01370300202f208d013703002030208c013703002031208b01370300" - "2032208a013703002033208901370300200520052903c809228901370388" - "06200520052903c009228a01370380062005208a013703c0012005208901" - "3703c8012006205629030037030020072057290300370300200820582903" - "0037030020092059290300370300200a205a290300370300200b205b2903" - "0037030020052005290388023703c80620052005290380023703c0062005" - "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" - "066a10302027200c2903003703002026200d2903003703002025200e2903" - "003703002024200f29030037030020232010290300370300202220112903" - "00370300201b200b290300370300201a200a290300370300201920092903" - "003703002018200829030037030020172007290300370300201620062903" - "00370300200520052903c8093703c805200520052903c0093703c0052005" - "20052903c00637038006200520052903c8063703880620054180066a2005" - "41c0066a200541800b6a102f201c2028290300370300201d202929030037" - "0300201e202a290300370300201f202b2903003703002020202c29030037" - "03002021202d2903003703002005204e2903003703880720052002290300" - "3703800720054180076a2002200310302006206829030037030020072069" - "2903003703002008206a2903003703002009206b290300370300200a206c" - "290300370300200b206d29030037030020052005290388043703c8062005" - "2005290380043703c006200541c0066a20054180046a20054180076a102f" - "2014200a2903003703002015200b290300370300200520052903c8063703" - "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" - "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" - "290300370300201320072903003703002005200829030037038808200520" - "092903003703800820054180086a20432903002044290300204529030020" - "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" - "0020112015290300228a01370300200f200529038008228b01370300200d" - "2013290300228c01370300200e200529038808228d01370300200c201229" - "0300228e01370300200520052903c80b228f013703c809200520052903c0" - "0b2290013703c0092006208e013703002007208c013703002008208d0137" - "03002009208b01370300200a208901370300200b208a013703002005208f" - "013703c80620052090013703c0062014200a2903003703002015200b2903" - "00370300200520052903c8063703c80b200520052903c0063703c00b2005" - "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "201220062903003703002013200729030037030020052008290300370388" - "08200520092903003703800820054180086a208501208601208701208801" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" - "15290300228201370300200f200529038008228301370300200d20132903" - "00228401370300200e200529038808228501370300200c20122903002286" - "01370300200520052903c80b2287013703c809200520052903c00b228801" - "3703c0092006208601370300200720840137030020082085013703002009" - "208301370300200a208101370300200b20820137030020052087013703c8" - "0620052088013703c006200541c0096a20054180066a200541c0066a1030" - "2016200c2903003703002017200d2903003703002018200e290300370300" - "2019200f290300370300201a2010290300370300201b2011290300370300" - "200520052903c80937038806200520052903c009370380062021202d2903" - "003703002020202c290300370300201f202b290300370300201e202a2903" - "00370300201d2029290300370300201c2028290300370300200520022903" - "00370380072005204e2903003703880720054180076a2002200410302005" - "41c0096a20054180076a20031030201c200c290300370300201d200d2903" - "00370300201e200e290300370300201f200f290300370300202020102903" - "0037030020212011290300370300200b204d290300370300200a204c2903" - "003703002009204b2903003703002008204a290300370300200720492903" - "0037030020062048290300370300200520052903c8093703880720052005" - "2903c0093703800720052005290380053703c00620052005290388053703" - "c806200541c0066a20054180056a20054180076a102f2014200a29030037" - "03002015200b290300370300200520052903c8063703c80b200520052903" - "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" - "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" - "200729030037030020052008290300370388082005200929030037038008" - "20054180086a202429030020252903002026290300202729030042c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" - "c0c689aece93b230102d2010201429030022810137030020112015290300" - "228201370300200f200529038008228301370300200d2013290300228401" - "370300200e200529038808228501370300200c2012290300228601370300" - "200520052903c80b2287013703c809200520052903c00b2288013703c009" - "200620860137030020072084013703002008208501370300200920830137" - "0300200a208101370300200b20820137030020052087013703c806200520" - "88013703c006200541b8086a207a290300370300200541b0086a20792903" - "00370300200541a8086a2078290300370300200541a0086a207729030037" - "030020122076290300370300201320752903003703002005200529030837" - "0388082005200529030037038008200541c8086a20052903483703002005" - "41d0086a207b290300370300200541d8086a207c290300370300200541e0" - "086a207d290300370300200541e8086a207e290300370300200541f0086a" - "207f290300370300200541f8086a20800129030037030020052005290340" - "3703c008200541b8096a2034290300370300200541b0096a203629030037" - "0300200541a8096a2038290300370300200541a0096a203a290300370300" - "20054198096a203c29030037030020054190096a203e2903003703002005" - "4188096a200529038801370300200520052903800137038009200c203329" - "0300370300200d2032290300370300200e2031290300370300200f203029" - "03003703002010202f2903003703002011202e2903003703002005200529" - "03c8013703c809200520052903c0013703c009200541880a6a2005290388" - "06370300200541900a6a201b290300370300200541980a6a201a29030037" - "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" - "200541b00a6a2017290300370300200541b80a6a20162903003703002005" - "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" - "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" - "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" - "00370300200541c80a6a20052903c806370300200520052903c0063703c0" - "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" - "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" - "046a20014180016a22162002102f20034198036a2204200141186a220c29" - "030037030020034190036a2205200141106a220d29030037030020032001" - "41086a220f29030037038803200320012903003703800320034180036a20" - "032903800420032903880420032903900420034198046a220929030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" - "370300200341d0036a2207200141306a2211290300370300200320014128" - "6a22122903003703c8032003200141206a22172903003703c003200341c0" - "036a20032903a004200341a8046a220a29030020032903b004200341b804" - "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" - "0300370300200341106a22082005290300370300200341206a2213200329" - "03c003370300200341286a221420032903c803370300200341306a221520" - "07290300370300200341386a221820062903003703002003200329038803" - "370308200320032903800337030020034180046a2016200241406b221f10" - "2f2004200141d8006a22202903003703002005200141d0006a2221290300" - "3703002003200141c8006a22222903003703880320032001290340370380" - "0320034180036a2003290380042003290388042003290390042009290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" - "2007200141f0006a22242903003703002003200141e8006a222529030037" - "03c8032003200141e0006a22262903003703c003200341c0036a20032903" - "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d200341d8006a22192004290300370300200341d0006a221a20052903" - "00370300200341e0006a221b20032903c003370300200341e8006a221c20" - "032903c803370300200341f0006a221d2007290300370300200341f8006a" - "221e20062903003703002003200329038803370348200320032903800337" - "0340200341f8046a2018290300370300200341f0046a2015290300370300" - "200341e8046a2014290300370300200341e0046a20132903003703002003" - "41d8046a200e290300370300200341d0046a200829030037030020032003" - "2903083703c804200320032903003703c004200341c0046a20032003102f" - "200341b8056a201e290300370300200341b0056a201d2903003703002003" - "41a8056a201c290300370300200341a0056a201b29030037030020034198" - "056a201929030037030020034190056a201a290300370300200320032903" - "4837038805200320032903403703800520034180056a200341406b200341" - "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" - "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" - "4180046a20034180016a103020034180046a200341c0016a200341c0016a" - "1030200341d8026a220e2006290300370300200341d0026a220820072903" - "00370300200320032903c8033703c802200320032903c0033703c0022003" - "41c0026a200329038004200329038804200329039004200929030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" - "0341f0036a22142903003703002003200341e8036a221529030037038803" - "200320032903e0033703800320034180036a20032903a004200a29030020" - "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" - "2218200e29030037030020034190026a22272008290300370300200341a8" - "026a2228200329038803370300200341b0026a2229200529030037030020" - "0341b8026a222a2004290300370300200320032903c80237038802200320" - "032903c0023703800220032003290380033703a00220034180046a200320" - "034180026a102f2010200b2903003703002011200341b0046a2210290300" - "3703002012200a2903003703002017200341a0046a222b29030037030020" - "0c2009290300370300200d20034190046a2211290300370300200f200329" - "03880437030020012003290380043703002004200341d8016a2903003703" - "002005200341d0016a290300370300200320032903c80137038803200320" - "032903c0013703800320034180036a200329038002200329038802202729" - "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" - "03003703002007200341f0016a2903003703002003200341e8016a290300" - "3703c803200320032903e0013703c003200341c0036a20032903a0022028" - "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" - "0429030037030020112005290300370300200a20032903c8033703002010" - "2007290300370300200b2006290300370300200320032903880337038804" - "200320032903800337038004200320032903c0033703a004200341c0036a" - "200341406b20034180046a102f20034180046a20034180016a200141406b" - "102f200341f8056a220c2006290300370300200341f0056a220d20072903" - "00370300200320032903c8033703e805200320032903c0033703e0052003" - "41e0056a200329038004200329038804200329039004200929030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d200e2013290300370300200820142903003703" - "00200320152903003703c802200320032903e0033703c002200341c0026a" - "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d2004200c2903003703002005200d290300370300200341a0" - "036a221720032903c002370300200341a8036a220f20032903c802370300" - "200341b0036a22122008290300370300200341b8036a2208200e29030037" - "0300200320032903e80537038803200320032903e0053703800320232008" - "290300370300202420122903003703002025200f29030037030020262017" - "290300370300202020042903003703002021200529030037030020222003" - "29038803370300200120032903800337034020034180046a201620034180" - "016a102f200141b8016a200b290300370300200141b0016a201029030037" - "0300200141a8016a200a290300370300200141a0016a202b290300370300" - "20014198016a200929030037030020014190016a20112903003703002001" - "4188016a2003290388043703002001200329038004370380012003420037" - "03f802200342003703f002200342003703e802200342013703e002200342" - "003703d802200342003703d002200342003703c802200342093703c00220" - "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" - "056a22012006290300370300200341d0056a220620072903003703002003" - "20032903c8033703c805200320032903c0033703c005200341c0056a2003" - "29038004200329038804200329039004200929030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d200c2013290300370300200d20142903003703002003201529" - "03003703e805200320032903e0033703e005200341e0056a20032903a004" - "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2004200129030037030020052006290300370300200f20032903e8053703" - "002012200d2903003703002008200c290300370300200320032903c80537" - "038803200320032903c00537038003200320032903e0053703a003200341" - "80046a200341c0026a20034180036a102f201e2903002136201d29030021" - "34201c290300212d201b2903002135201a29030022302003290340223184" - "201929030022382003290348223284844200520440427f4200427f420020" - "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" - "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" - "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" - "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" - "2f0b4200213042002131420021322034203584202d203684844200520440" - "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" - "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" - "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" - "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" - "ed82a3903c20357d212c0b20002003290380043703002000200329030037" - "0340200041086a200329038804370300200041c8006a2003290308370300" - "200041386a200341b8046a290300370300200041306a200341b0046a2903" - "00370300200041286a200341a8046a290300370300200041206a200341a0" - "046a290300370300200041186a20034198046a290300370300200041106a" - "20034190046a290300370300200041d0006a200341106a29030037030020" - "0041d8006a200341186a290300370300200041e0006a200341206a290300" - "370300200041e8006a200341286a290300370300200041f0006a20034130" - "6a290300370300200041f8006a200341386a290300370300200020323703" - "b801200020313703b001200020303703a8012000202c3703a00120002033" - "370398012000202e3703900120002037370388012000202f370380012003" - "4180066a24000b4201047f412021020240034020002d0000220320012d00" - "002204460440200041016a2100200141016a2101200241016b22020d010c" - "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" - "21020c010b02402000410020006b41037122046a220320004d0d00200021" - "0220040440200421050340200241003a0000200241016a2102200541016b" - "22050d000b0b200441016b4107490d000340200241003a0000200241076a" - "41003a0000200241066a41003a0000200241056a41003a0000200241046a" - "41003a0000200241036a41003a0000200241026a41003a0000200241016a" - "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" - "716a220220034b0440034020034100360200200341046a22032002490d00" - "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" - "042001410771220304400340200241003a0000200241016a210220034101" - "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" - "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" - "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" - "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" - "10490440200021030c010b02402000410020006b41037122066a22052000" - "4d0d00200641016b21082000210320012104200604402006210703402003" - "20042d00003a0000200441016a2104200341016a2103200741016b22070d" - "000b0b20084107490d000340200320042d00003a0000200341016a200441" - "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" - "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" - "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" - "41076a200441076a2d00003a0000200441086a2104200341086a22032005" - "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" - "04410371450440200320054d0d0120042101034020052001280200360200" - "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" - "2004410374220241187121062004417c71220941046a2101410020026b41" - "1871210a2009280200210203402005200220067620012802002202200a74" - "72360200200141046a2101200541046a22052003490d000b0b2007410371" - "2102200420086a21010b02402003200220036a22054f0d00200241016b21" - "072002410771220404400340200320012d00003a0000200141016a210120" - "0341016a2103200441016b22040d000b0b20074107490d00034020032001" - "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" - "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" - "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" - "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" - "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" - "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" - "20047e22042003200142208822017e7c22034220867c2206370300200020" - "05200656ad200120027e2003200454ad4220862003422088847c7c370308" - "0b5601017e0240200341c000714504402003450d012002410020036b413f" - "71ad8620012003413f71ad220488842101200220048821020c010b200220" - "03413f71ad882101420021020b20002001370300200020023703080b5a01" - "027e420121020240200141c000714504402001450d0142002001413f71ad" - "2202864201410020016b413f71ad88842103420120028621020c010b4201" - "2001413f71ad862103420021020b20002002370300200020033703080b0b" - "e1250100418080c0000bd725307830306165613865396338336337336437" - "343033363932336465316234613636643138353437643538656565346561" - "6366656537303233356564323931393534636361706163697479206f7665" - "72666c6f77004200100011000000010000000000000063616c6c65642060" - "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" - "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" - "6c656e20697320206275742074686520696e646578206973200000008f00" - "100020000000af001000120000003a2000000100000000000000d4001000" - "020000003030303130323033303430353036303730383039313031313132" - "313331343135313631373138313932303231323232333234323532363237" - "323832393330333133323333333433353336333733383339343034313432" - "343334343435343634373438343935303531353235333534353535363537" - "353835393630363136323633363436353636363736383639373037313732" - "373337343735373637373738373938303831383238333834383538363837" - "38383839393039313932393339343935393639373938393972616e676520" - "737461727420696e64657820206f7574206f662072616e676520666f7220" - "736c696365206f66206c656e67746820b001100012000000c20110002200" - "000072616e676520656e6420696e64657820f401100010000000c2011000" - "22000000736c69636520696e646578207374617274732061742020627574" - "20656e6473206174200014021000160000002a0210000d00000054726965" - "6420746f20736872696e6b20746f2061206c617267657220636170616369" - "74794802100024000000f40a10004c000000b3020000090000002f686f6d" - "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" - "7372632f696e6465782e6372617465732e696f2d31393439636638633662" - "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" - "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" - "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" - "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" - "0000ea0210006f000000890000001b000000a80c10006f00000057000000" - "09000000a80c10006f000000a3000000090000008402100066000000ad00" - "000013000000a80c10006f000000c40000001f000000a80c10006f000000" - "150100000e000000a80c10006f000000160100000e000000a80c10006f00" - "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" - "6f0000002001000021000000a80c10006f0000002101000018000000a80c" - "10006f000000420100003c000000040c10006e0000006d0200000d000000" - "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f6e756d" - "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" - "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" - "0000120000003c0410006c00000028000000190000002f72757374632f34" - "656231363132353065333430633866343866363665326239323965663461" - "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" - "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f6865782d302e342e33" - "2f7372632f6c69622e7273000000260510005b000000c700000025000000" - "260510005b000000c7000000410000004e6f744d656d626572496e76616c" - "6964536c6963654c656e677468496e76616c696455353132456e636f6469" - "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" - "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" - "6c696420636f6d7072657373656420706f696e7420666c61670000000806" - "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" - "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" - "313934396366386336623562353537662f7370312d76657269666965722d" - "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" - "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f7370312d7665726966" - "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" - "00000100000001000000060000004661696c656420746f20636f6e766572" - "74207820627974657320746f20467100ac0610006a0000001f0000003700" - "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" - "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" - "6366386336623562353537662f7370312d76657269666965722d342e312e" - "332f7372632f67726f746831362f636f6e7665727465722e727300005807" - "100072000000290000003e00000058071000720000002a0000003d000000" - "58071000720000002b0000003e00000058071000720000002c0000003e00" - "000058071000720000002e0000002500000058071000720000002e000000" - "3200000058071000720000002e0000003f00000058071000720000002e00" - "00004c0000005807100072000000320000003f0000005807100072000000" - "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" - "6f2d313934396366386336623562353537662f7370312d76657269666965" - "722d342e312e332f7372632f67726f746831362f7665726966792e727300" - "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f737031" - "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" - "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" - "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" - "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" - "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" - "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" - "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" - "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" - "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" - "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" - "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" - "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" - "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" - "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" - "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" - "74632f346562313631323530653334306338663438663636653262393239" - "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" - "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "500b100029000000ae0400000d0000000000000004000000000000002f68" - "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" - "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" - "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" - "62696775696e742f636f6e766572742e72730000040c10006e000000f001" - "000016000000617474656d707420746f20646976696465206279207a6572" - "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" - "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" - "65732e696f2d313934396366386336623562353537662f6e756d2d626967" - "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" - "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" - "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" - "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" - "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" - "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" - "726576696f75736c7920706f69736f6e656420627920612070616e69636b" - "65640000350d10005d0000004e010000250000002f72757374632f346562" - "313631323530653334306338663438663636653262393239656634613562" - "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" - "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" - "526573756c743a3a756e77726170282960206f6e20616e20604572726020" - "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" - "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" - "3934396366386336623562353537662f7375627374726174652d626e2d73" - "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" - "64732f66702e72730000630e10007b000000e9020000230000004661696c" - "656420746f20636f6d707574652074686520696e7665727365206f662074" - "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f737562737472617465" - "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" - "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" - "000000000100000001000000070000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f737562" - "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" - "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" - "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" - "416666696e654731b80f10007c0000000001000012000000b80f10007c00" - "00002001000012000000b80f10007c000000400100000d000000b80f1000" - "7c0000006b01000029000000010001000000030003000000030001000300" - "000300000000000100000300010000030000000003000100000003000300" - "00010000000300000300010001000000b80f10007c000000150300002600" - "0000b80f10007c0000001003000026000000b80f10007c00000008030000" - "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" - "000010000000b80f10007c0000009c03000010000000b80f10007c000000" - "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" - "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" - "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" - "10007c000000191100002a000000b80f10007c0000001911000017000000" - "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" - "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" - "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" - "6366386336623562353537662f7375627374726174652d626e2d73756363" - "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" - "0000e4111000750000003b0300000c000000e4111000750000003c030000" - "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" - "616c6964496e7075744c656e677468000000120000001300000009000000" - "ad051000bf051000a40510000a0000000d000000120000007c1210008612" - "1000931210004d0970726f64756365727302086c616e6775616765010452" - "757374000c70726f6365737365642d6279010572757374631d312e38352e" - "31202834656231363132353020323032352d30332d31352900490f746172" - "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" - "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" - "756c746976616c7565"; - -extern std::string const ledgerSqnWasmHex = - "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" - "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" - "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" - "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" - "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" - "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" - "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" - "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" - "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" - "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" - "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" - "62346235613264623538323935386166316565333038613739306366646234326264323437" - "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; - -extern std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" - "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" - "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" - "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" - "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" - "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" - "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" - "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" - "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" - "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" - "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" - "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" - "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" - "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" - "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" - "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" - "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" - "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" - "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" - "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" - "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" - "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" - "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" - "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" - "6a22044100360200200141106a220542003703002001420037030802404181802020014108" - "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" - "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" - "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" - "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" - "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" - "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" - "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" - "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" - "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" - "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" - "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" - "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" - "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" - "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" - "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" - "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" - "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" - "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" - "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" - "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" - "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" - "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" - "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" - "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" - "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" - "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" - "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" - "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" - "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" - "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" - "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" - "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" - "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" - "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" - "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" - "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" - "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" - "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" - "420037039001024002400240024002402001411420004190016a22024120100e2201412046" - "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" - "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" - "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" - "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" - "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" - "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" - "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" - "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" - "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" - "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" - "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" - "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" - "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" - "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" - "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" - "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" - "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" - "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" - "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" - "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" - "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" - "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" - "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" - "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" - "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" - "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" - "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" - "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" - "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" - "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" - "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" - "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" - "00370300200342003703002005420037030020004200370390010240200422032003410020" - "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" - "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" - "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" - "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" - "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" - "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" - "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" - "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" - "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" - "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" - "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" - "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" - "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" - "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" - "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" - "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" - "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" - "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" - "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" - "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" - "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" - "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" - "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" - "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" - "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" - "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" - "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" - "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" - "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" - "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" - "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" - "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" - "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" - "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" - "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" - "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" - "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" - "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" - "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" - "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" - "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" - "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" - "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" - "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" - "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" - "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" - "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" - "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" - "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" - "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" - "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" - "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" - "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" - "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" - "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" - "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" - "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" - "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" - "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" - "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" - "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" - "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" - "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" - "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" - "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" - "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" - "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" - "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" - "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" - "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" - "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" - "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" - "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" - "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" - "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" - "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" - "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" - "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" - "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" - "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" - "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" - "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" - "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" - "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" - "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" - "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" - "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" - "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" - "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" - "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" - "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" - "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" - "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" - "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" - "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" - "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" - "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" - "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" - "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" - "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" - "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" - "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" - "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" - "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" - "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" - "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; - -extern std::string const deepRecursionHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - -extern std::string const hfPerfTest = - "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" - "6000017f021d0203656e760974726163655f6e756d000003656e76057472" - "616365000103030202030503010002068601167f0041a0090b7f0041a011" - "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" - "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" - "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" - "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" - "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300020666696e6973680003036275660300076c6f635f6275660301" - "036d73670302086572725f686561640303096572725f646174613103040a" - "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" - "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" - "746103090753465f44617461030a1753465f417574686f72697a65437265" - "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" - "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" - "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" - "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" - "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" - "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" - "0300200041086a22000d000b41d811420037030041d011420037030041c8" - "11420037030041c011420037030041b811420037030041b0114200370300" - "41a811428d801c37030041a011429a803c3703000240034041e008411020" - "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" - "1441c0084113410010011a0b41010b0b840104004180080b340100080003" - "00080009000f000a000e000d0007001b0007001a000f0000000000676574" - "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" - "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" - "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" - "007f0970726f647563657273010c70726f6365737365642d62790105636c" - "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" - "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" - "346235613264623538323935386166316565333038613739306366646234" - "32626432343732302900490f7461726765745f6665617475726573042b0f" - "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" - "6572656e63652d74797065732b0a6d756c746976616c7565"; - -extern std::string const allKeyletsWasmHex = - "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" - "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" - "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" - "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" - "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" - "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" - "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" - "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" - "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" - "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" - "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" - "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" - "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" - "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" - "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" - "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" - "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" - "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" - "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" - "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" - "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" - "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" - "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" - "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" - "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" - "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" - "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" - "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" - "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" - "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" - "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" - "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" - "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" - "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" - "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" - "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" - "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" - "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" - "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" - "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" - "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" - "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" - "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" - "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" - "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" - "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" - "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" - "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" - "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" - "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" - "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" - "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" - "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" - "420037030020004200370388012008411420024120100622014120460d0102402001410048" - "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" - "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" - "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" - "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" - "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" - "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" - "420037030020004190016a220542003703002000420037038801200041046a411420004118" - "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" - "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" - "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" - "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" - "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" - "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" - "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" - "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" - "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" - "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" - "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" - "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" - "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" - "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" - "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" - "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" - "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" - "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" - "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" - "003703e001200041046a411441062004412010092204412047044002402004410048044020" - "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" - "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" - "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" - "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" - "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" - "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" - "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" - "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" - "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" - "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" - "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" - "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" - "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" - "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" - "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" - "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" - "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" - "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" - "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" - "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" - "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" - "200041186a2208411420034120100c22024120470440024020024100480440200120023602" - "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" - "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" - "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" - "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" - "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" - "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" - "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" - "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" - "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" - "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" - "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" - "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" - "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" - "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" - "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" - "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" - "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" - "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" - "03290300370001200141196a2006290300370000200141116a200729030037000020014109" - "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" - "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" - "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" - "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" - "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" - "02027f20054118200841142001412010102205412047044002402005410048044020022005" - "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" - "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" - "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" - "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" - "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" - "084114410620014120101122054120470440024020054100480440200220053602040c010b" - "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" - "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" - "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" - "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" - "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" - "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" - "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" - "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" - "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" - "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" - "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" - "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" - "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" - "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" - "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" - "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" - "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" - "022001290300370001200241196a2008290300370000200241116a20062903003700002002" - "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" - "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" - "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" - "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" - "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" - "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" - "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" - "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" - "370300200141106a22064200370300200141086a2207420037030020014200370300200041" - "90066a2202027f200441144112200141201016220541204704400240200541004804402002" - "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" - "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" - "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" - "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" - "7f20044114411320014120101722044120470440024020044100480440200220043602040c" - "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" - "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" - "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" - "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" - "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" - "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" - "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" - "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" - "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" - "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" - "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" - "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" - "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" - "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" - "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" - "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" - "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" - "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" - "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" - "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" - "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" - "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" - "200228020021020340200420022003762001280200220220057472360200200141046a2101" - "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" - "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" - "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" - "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" - "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" - "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" - "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" - "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" - "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" - "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" - "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" - "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" - "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" - "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" - "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" - "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" - "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" - "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" - "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" - "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" - "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" - "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" - "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" - "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" - "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" - "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" - "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" - "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" - "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" - "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" - "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" - "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" - "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; - -extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" - "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" - "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" - "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" - "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" - "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" - "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" - "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" - "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" - "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" - "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" - "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" - "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" - "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" - "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" - "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" - "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" - "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" - "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" - "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" - "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" - "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" - "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" - "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" - "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" - "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" - "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" - "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" - "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" - "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" - "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" - "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" - "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" - "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" - "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" - "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" - "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" - "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" - "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" - "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" - "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" - "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" - "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" - "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" - "002002420037030020004200370360200141201006412041918bc000411210341007410a41" - "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" - "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" - "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" - "c0004111103420034100360200200242003703002000420037036002404181802020014114" - "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" - "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" - "200028006336002f200020002903c801370033200442003703002003420037030020024200" - "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" - "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" - "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" - "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" - "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" - "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" - "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" - "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" - "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" - "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" - "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" - "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" - "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" - "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" - "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" - "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" - "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" - "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" - "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" - "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" - "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" - "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" - "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" - "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" - "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" - "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" - "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" - "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" - "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" - "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" - "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" - "00200020002903083703a801200241003b010020054200370300200042003703c801200341" - "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" - "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" - "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" - "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" - "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" - "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" - "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" - "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" - "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" - "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" - "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" - "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" - "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" - "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" - "34200742003703002002420037030020054200370300200042003703c801200620002802a0" - "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" - "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" - "42003703002002420037030020054200370300200042003703c80120034114200341142006" - "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" - "20054200370300200042003703c8012003411420034114200120002802a001200441201022" - "417141968ec000411e10342007420037030020024200370300200542003703002000420037" - "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" - "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" - "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" - "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" - "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" - "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" - "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" - "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" - "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" - "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" - "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" - "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" - "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" - "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" - "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" - "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" - "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" - "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" - "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" - "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" - "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" - "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" - "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" - "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" - "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" - "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" - "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" - "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" - "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" - "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" - "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" - "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" - "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" - "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" - "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" - "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" - "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" - "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" - "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" - "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" - "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" - "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" - "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" - "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" - "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" - "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" - "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" - "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" - "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" - "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" - "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" - "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" - "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" - "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" - "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" - "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" - "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" - "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" - "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" - "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" - "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" - "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" - "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" - "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" - "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" - "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" - "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" - "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" - "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" - "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" - "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" - "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" - "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" - "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" - "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" - "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" - "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" - "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" - "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" - "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" - "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" - "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" - "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" - "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" - "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" - "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" - "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" - "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" - "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" - "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" - "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" - "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" - "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" - "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" - "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" - "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" - "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" - "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" - "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" - "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" - "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" - "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" - "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" - "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" - "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" - "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" - "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" - "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" - "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" - "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" - "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" - "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" - "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" - "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" - "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" - "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" - "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" - "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" - "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" - "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" - "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" - "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" - "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" - "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" - "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" - "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" - "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" - "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" - "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; - -extern std::string const floatTestsWasmHex = - "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" - "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" - "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" - "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" - "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" - "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" - "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" - "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" - "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" - "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" - "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" - "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" - "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" - "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" - "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" - "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" - "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" - "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" - "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" - "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" - "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" - "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" - "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" - "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" - "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" - "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" - "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" - "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" - "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" - "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" - "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" - "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" - "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" - "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" - "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" - "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" - "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" - "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" - "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" - "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" - "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" - "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" - "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" - "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" - "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" - "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" - "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" - "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" - "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" - "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" - "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" - "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" - "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" - "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" - "41081083808080001a200042003703184200200041186a410841001081808080001a200041" - "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" - "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" - "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" - "084209200041086a410841001081808080001a20004200370310200041086a410841022000" - "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" - "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" - "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" - "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" - "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" - "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" - "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" - "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" - "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" - "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" - "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" - "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" - "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" - "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" - "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" - "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" - "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" - "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" - "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" - "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" - "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" - "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" - "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" - "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" - "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" - "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" - "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" - "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" - "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" - "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" - "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" - "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" - "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" - "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" - "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" - "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" - "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" - "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" - "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" - "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" - "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" - "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" - "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" - "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" - "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" - "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" - "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" - "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" - "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" - "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" - "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" - "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" - "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" - "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" - "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" - "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" - "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" - "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" - "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" - "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" - "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" - "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" - "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" - "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" - "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" - "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" - "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" - "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" - "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" - "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" - "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" - "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" - "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" - "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" - "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" - "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" - "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" - "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" - "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" - "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" - "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" - "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" - "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" - "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" - "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" - "2d74797065732b087369676e2d657874"; - -extern std::string const float0Hex = - "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" - "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" - "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" - "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" - "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" - "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" - "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" - "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" - "7f23808080800041206b2200248080808000418080c08000411541004100" - "41001080808080001a200042003703084200200041086a41084100108180" - "8080001a20004200370310420a200041106a410841001081808080001a20" - "0042003703180240200041106a4108200041106a4108200041186a410841" - "001082808080004108460d00419580c08000411541004100410010808080" - "80001a0b02400240200041086a4108200041186a41081083808080000d00" - "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" - "41164100410041001080808080001a0b02400240200041086a410841d780" - "c0800041081083808080000d0041df80c08000411a410041004100108080" - "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" - "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" - "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" - "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" - "642020666c6f6174203020636f6d706172653a2062616480000000000000" - "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" - "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" - "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" - "72706c5f73746434686f7374357472616365313768616338383262323664" - "656162656436364501355f5a4e387872706c5f73746434686f7374313466" - "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" - "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" - "737562747261637431376864363430633135323334353432393563450334" - "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" - "72653137683663386465656231323864393638386645040666696e697368" - "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" - "7461004d0970726f64756365727302086c616e6775616765010452757374" - "000c70726f6365737365642d6279010572757374631d312e38392e302028" - "32393438333838336520323032352d30382d3034290094010f7461726765" - "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" - "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" - "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" - "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" - "6572656e63652d74797065732b087369676e2d657874"; - -extern std::string const disabledFloatHex = - "0061736d010000000108026000006000017f03030200010503010002063e" - "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" - "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" - "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" - "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" - "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" - "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" - "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" - "090a150202000b100043000000c54300200045921a41010b"; diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h deleted file mode 100644 index 0e7e3785ea8..00000000000 --- a/src/test/app/wasm_fixtures/wasm_fixtures/fixtures.h +++ /dev/null @@ -1,52 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#pragma once - -// TODO: consider moving these to separate files (and figure out the build) - -#include - -extern std::string const ledgerSqnWasmHex; - -extern std::string const allHostFunctionsWasmHex; - -extern std::string const deepRecursionHex; - -extern std::string const fibWasmHex; - -extern std::string const b58WasmHex; - -extern std::string const sha512PureWasmHex; - -extern std::string const zkProofWasmHex; - -extern std::string const sp1WasmHex; - -extern std::string const hfPerfTest; - -extern std::string const allKeyletsWasmHex; - -extern std::string const codecovTestsWasmHex; - -extern std::string const floatTestsWasmHex; - -extern std::string const float0Hex; - -extern std::string const disabledFloatHex; diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.lock rename to src/test/app/wasm_fixtures/zk_proof/Cargo.lock diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/Cargo.toml rename to src/test/app/wasm_fixtures/zk_proof/Cargo.toml diff --git a/src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs similarity index 100% rename from src/test/app/wasm_fixtures/wasm_fixtures/zk_proof/src/lib.rs rename to src/test/app/wasm_fixtures/zk_proof/src/lib.rs From ffa21c27a7ad300420b23d42ddfad765762e1061 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 16:40:59 -0400 Subject: [PATCH 074/212] fix test --- src/test/app/HostFuncImpl_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index a198ba4af44..7ff06659c5b 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -264,8 +264,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); - // Use featureSmartEscrow for testing - auto const amendmentId = featureSmartEscrow; + // Use featureTokenEscrow for testing + auto const amendmentId = featureTokenEscrow; // Test by id { @@ -275,7 +275,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Test by name - std::string const amendmentName = "SmartEscrow"; + std::string const amendmentName = "TokenEscrow"; { auto const result = hfs.isAmendmentEnabled(amendmentName); BEAST_EXPECT(result.has_value()); From ba52d348287dd6635242bf18351259e19aa68f28 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 18:09:08 -0400 Subject: [PATCH 075/212] test: improve codecov in `HostFuncWrapper.cpp` (#5730) --- src/test/app/Wasm_test.cpp | 4 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 2 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../codecov_tests/src/host_bindings_loose.rs | 9 - .../wasm_fixtures/codecov_tests/src/lib.rs | 313 +++++++++- src/test/app/wasm_fixtures/copyFixtures.py | 4 +- src/test/app/wasm_fixtures/fixtures.cpp | 547 ++++++++++-------- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 30 +- 8 files changed, 615 insertions(+), 296 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a48e16f1eb0..bd4f7d4380a 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -649,7 +649,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 121'895; + auto const allowance = 148'406; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); @@ -709,7 +709,7 @@ struct Wasm_test : public beast::unit_test::suite testWasmSha(); testWasmB58(); - // runing too long + // running too long // testWasmSP1Verifier(); testWasmBG16Verifier(); diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 704846d35a6..28d4d656306 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -12,4 +12,4 @@ dependencies = [ [[package]] name = "xrpl-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" +source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#6b20669b20561b9d0f09678f44ccbddb84ef9f47" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index 52ca804bc0f..c9b4c53490b 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs index 706add2ed78..c99a0047d5e 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/host_bindings_loose.rs @@ -32,15 +32,6 @@ unsafe extern "C" { out_buff_len: usize, ) -> i32; - pub fn amm_keylet( - issue1_ptr: *const u8, - issue1_len: usize, - issue2_ptr: i32, - issue2_len: i32, - out_buff_ptr: *mut u8, - out_buff_len: usize, - ) -> i32; - pub fn line_keylet( account1_ptr: *const u8, account1_len: usize, diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 36c61fe439d..0e755ebb757 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -6,13 +6,13 @@ extern crate std; use core::panic; use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; use xrpl_std::core::current_tx::traits::TransactionCommonFields; -use xrpl_std::core::error_codes; use xrpl_std::core::locator::Locator; use xrpl_std::core::types::amount::asset::Asset; use xrpl_std::core::types::amount::asset::XrpAsset; use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; +use xrpl_std::host::error_codes; use xrpl_std::host::trace::{trace, trace_num as trace_number}; use xrpl_std::sfield; @@ -52,7 +52,8 @@ pub extern "C" fn finish() -> i32 { // ######################################## // Step #1: Test all host function happy paths // Note: not testing all the keylet functions, - // that's in a separate test file. + // that's in a separate test file (all_keylets). + // The float tests are also in a separate file (float_tests). // ######################################## check_result(unsafe { host::get_ledger_sqn() }, 12345, "get_ledger_sqn"); check_result( @@ -338,6 +339,38 @@ pub extern "C" fn finish() -> i32 { // Step #3: Test getData[Type] edge cases // ######################################## + // uint64 + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_from_uint( + locator.as_ptr().wrapping_add(1_000_000_000), + 8, + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_from_uint_len_oob", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_from_uint( + locator.as_ptr(), + locator.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::INVALID_PARAMS, + "float_from_uint_wrong_len", + ) + }); + // SField check_result( unsafe { host::get_tx_array_len(2) }, // not a valid SField value @@ -468,11 +501,11 @@ pub extern "C" fn finish() -> i32 { with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { - host_bindings_loose::amm_keylet( + host::amm_keylet( asset1_bytes.as_ptr(), asset1_bytes.len(), - locator.as_ptr() as i32 + 1_000_000_000, - locator.len() as i32, + locator.as_ptr().wrapping_add(1_000_000_000), + locator.len(), ptr, len, ) @@ -484,11 +517,11 @@ pub extern "C" fn finish() -> i32 { with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { - host_bindings_loose::amm_keylet( + host::amm_keylet( asset1_bytes.as_ptr(), asset1_bytes.len(), - locator.as_ptr() as i32, - locator.len() as i32, + locator.as_ptr(), + locator.len(), ptr, len, ) @@ -501,11 +534,11 @@ pub extern "C" fn finish() -> i32 { with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { - host_bindings_loose::amm_keylet( + host::amm_keylet( asset1_bytes.as_ptr(), asset1_bytes.len(), - currency.as_ptr() as i32, - currency.len() as i32, + currency.as_ptr(), + currency.len(), ptr, len, ) @@ -514,6 +547,23 @@ pub extern "C" fn finish() -> i32 { "amm_keylet_len_wrong_non_xrp_currency_len", ) }); + let xrpissue: &[u8] = &[0; 40]; // 40 bytes + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::amm_keylet( + xrpissue.as_ptr(), + xrpissue.len(), + asset1_bytes.as_ptr(), + asset1_bytes.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "amm_keylet_len_wrong_xrp_currency_len", + ) + }); let mptid = MptId::new(1, account); with_buffer::<2, _, _>(|ptr, len| { check_result( @@ -755,6 +805,19 @@ pub extern "C" fn finish() -> i32 { error_codes::POINTER_OUT_OF_BOUNDS, "trace_oob_slice", ); + let float: [u8; 8] = [0xD4, 0x83, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00]; + check_result( + unsafe { + host::trace_opaque_float( + message.as_ptr(), + message.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_opaque_float_oob_slice", + ); check_result( unsafe { host::trace_amount( @@ -767,6 +830,213 @@ pub extern "C" fn finish() -> i32 { error_codes::POINTER_OUT_OF_BOUNDS, "trace_amount_oob_slice", ); + check_result( + unsafe { + host::float_compare( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + float.as_ptr(), + float.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_compare_oob_slice1", + ); + check_result( + unsafe { + host::float_compare( + float.as_ptr(), + float.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_compare_oob_slice2", + ); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_add( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + float.as_ptr(), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_add_oob_slice1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_add( + float.as_ptr(), + float.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_add_oob_slice2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_subtract( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + float.as_ptr(), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_subtract_oob_slice1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_subtract( + float.as_ptr(), + float.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_subtract_oob_slice2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_multiply( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + float.as_ptr(), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_multiply_oob_slice1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_multiply( + float.as_ptr(), + float.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_multiply_oob_slice2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_divide( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + float.as_ptr(), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_divide_oob_slice1", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_divide( + float.as_ptr(), + float.len(), + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_divide_oob_slice2", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_root( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + 3, + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_root_oob_slice", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_pow( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + 3, + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_pow_oob_slice", + ) + }); + with_buffer::<2, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_log( + float.as_ptr().wrapping_add(1_000_000_000), + float.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_log_oob_slice", + ) + }); // invalid UInt256 @@ -1143,6 +1413,18 @@ pub extern "C" fn finish() -> i32 { error_codes::POINTER_OUT_OF_BOUNDS, "trace_oob_string", ); + check_result( + unsafe { + host::trace_opaque_float( + message.as_ptr().wrapping_add(1_000_000_000), + message.len(), + float.as_ptr(), + float.len(), + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "trace_opaque_float_oob_string", + ); check_result( unsafe { host::trace_account( @@ -1188,6 +1470,13 @@ pub extern "C" fn finish() -> i32 { error_codes::DATA_FIELD_TOO_LARGE, "trace_num_too_long", ); + check_result( + unsafe { + host::trace_opaque_float(message.as_ptr(), long_len, float.as_ptr(), float.len()) + }, + error_codes::DATA_FIELD_TOO_LARGE, + "trace_opaque_float_too_long", + ); check_result( unsafe { host::trace_account( @@ -1203,7 +1492,7 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::trace_amount(message.as_ptr(), long_len, amount.as_ptr(), amount.len()) }, error_codes::DATA_FIELD_TOO_LARGE, - "trace_account_too_long", + "trace_amount_too_long", ); // trace amount errors diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index eb1b6d0f9ec..b0c8ad1af28 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -85,8 +85,8 @@ def process_c(project_name): os.path.join(os.path.dirname(__file__), f"{project_name}.wasm") ) build_cmd = ( - f"$CC --sysroot=$SYSROOT -I$SYSROOT/include/wasm32-wasi " - f"-O3 -ffast-math --target=wasm32 -fno-exceptions -fno-threadsafe-statics -fvisibility=default -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -DNDEBUG --no-standard-libraries -fno-builtin-memset " + f"$CC --sysroot=$SYSROOT " + f"-O3 -ffast-math --target=wasm32 -fno-exceptions -fno-threadsafe-statics -fvisibility=default -Wl,--export-all -Wl,--no-entry -Wl,--allow-undefined -DNDEBUG --no-standard-libraries -fno-builtin-memset " f"-o {wasm_path} {project_path}" f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" ) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index ec91496428c..de2ad6291b8 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9854,277 +9854,316 @@ extern std::string const allKeyletsWasmHex = extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" - "7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f7f7f7f7f7f7f7f017f6003" - "7f7f7e017f60077f7f7f7f7f7f7f017f60047f7f7f7f0002e70b3408686f73745f6c696205" - "7472616365000108686f73745f6c69620974726163655f6e756d000808686f73745f6c6962" - "0e6765745f6c65646765725f73716e000408686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000408686f73745f6c6962166765745f706172656e745f6c65" + "7f7f7f7f7f017f60077f7f7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f" + "7f7f7f7f7f7f7f017f60037f7f7e017f60047f7f7f7f0002da0d3e08686f73745f6c696205" + "7472616365000108686f73745f6c69620974726163655f6e756d000908686f73745f6c6962" + "0e6765745f6c65646765725f73716e000508686f73745f6c6962166765745f706172656e74" + "5f6c65646765725f74696d65000508686f73745f6c6962166765745f706172656e745f6c65" "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" - "000208686f73745f6c69620c6765745f626173655f666565000408686f73745f6c69621161" + "000208686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" - "656c64000508686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" - "6c69621063616368655f6c65646765725f6f626a000508686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000508686f73745f6c6962146765" + "656c64000608686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" + "6c69621063616368655f6c65646765725f6f626a000608686f73745f6c69621c6765745f63" + "757272656e745f6c65646765725f6f626a5f6669656c64000608686f73745f6c6962146765" "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" - "65745f74785f61727261795f6c656e000608686f73745f6c6962206765745f63757272656e" - "745f6c65646765725f6f626a5f61727261795f6c656e000608686f73745f6c696218676574" + "65745f74785f61727261795f6c656e000708686f73745f6c6962206765745f63757272656e" + "745f6c65646765725f6f626a5f61727261795f6c656e000708686f73745f6c696218676574" "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000508686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" + "656e000608686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" - "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620b6c696e655f" - "6b65796c6574000708686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c" - "69621163726564656e7469616c5f6b65796c6574000708686f73745f6c69620e6d70746f6b" - "656e5f6b65796c6574000308686f73745f6c69620c636865636b5f6b65796c657400010868" - "6f73745f6c69620f64656c65676174655f6b65796c6574000308686f73745f6c6962166465" - "706f7369745f707265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b" - "65796c6574000008686f73745f6c69620d657363726f775f6b65796c6574000108686f7374" - "5f6c6962136d70745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e" - "66745f6f666665725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c" - "6574000108686f73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69" - "620e7061796368616e5f6b65796c6574000908686f73745f6c69621a7065726d697373696f" - "6e65645f646f6d61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f" - "6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73" - "745f6c69620c7661756c745f6b65796c657400010303020a0405030100110619037f014180" - "80c0000b7f0041959ac0000b7f0041a09ac0000b072e04066d656d6f727902000666696e69" - "736800350a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8026024600" - "0240200020014704402002200341004100410010001a20004100480d01418b80c000410b20" - "00ad1001000b200220032000ac10011a0f0b418b80c000410b2000ac1001000bb62502087f" - "027e230041f0016b22002400419680c000412341004100410010001a100241b9e00041b980" - "c000410e1034100341b2920441c780c00041161034200041f8006a22044200370300200041" - "f0006a22034200370300200041e8006a2202420037030020004200370360200041e0006a22" - "0141201004412041e48ac00041161034200442003703002003420037030020024200370300" - "20004200370360200141201005412041fa8ac0004117103420044200370300200342003703" - "002002420037030020004200370360200141201006412041918bc000411210341007410a41" - "dd80c000410c1034200041206a428182848890a0c08001370300200041186a428182848890" - "a0c08001370300200041106a428182848890a0c080013703002000428182848890a0c08001" - "37030841e980c000410e1008410141f780c00041111034200041086a41201008410141f780" - "c0004111103420034100360200200242003703002000420037036002404181802020014114" - "1009220541144604402000412e6a20002d00623a0000200020002900673703c80120002000" - "41ec006a2900003700cd01200041386a20002900cd01370000200020002f01603b012c2000" - "200028006336002f200020002903c801370033200442003703002003420037030020024200" - "370300200042003703602000412c6a411420014120100a22044120470d01200041c2006a20" - "002d00623a0000200041d0016a200041ef006a2900002208370300200041d8016a200041f7" - "006a2900002209370300200041cf006a2008370000200041d7006a2009370000200041df00" - "6a200041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000" - "290067370047200041406b41204100100b4101418881c00041101034200341003602002002" - "4200370300200042003703604181802020014114100c411441a38bc000411c103420034100" - "360200200242003703002000420037036041014181802020014114100d411441bf8bc00041" - "14103402402001410020016b41037122036a220220014d0d00200304402003210403402001" - "41003a0000200141016a2101200441016b22040d000b0b200341016b4107490d0003402001" - "41003a0000200141076a41003a0000200141066a41003a0000200141056a41003a00002001" - "41046a41003a0000200141036a41003a0000200141026a41003a0000200141016a41003a00" - "00200141086a22012002470d000b0b200241c40020036b2203417c716a220120024b044003" - "4020024100360200200241046a22022001490d000b0b024020012003410371220320016a22" - "044f0d002003220204400340200141003a0000200141016a2101200241016b22020d000b0b" - "200341016b4107490d000340200141003a0000200141076a41003a0000200141066a41003a" - "0000200141056a41003a0000200141046a41003a0000200141036a41003a0000200141026a" - "41003a0000200141016a41003a0000200141086a22012004470d000b0b2000418180203602" - "c801410021010340200741c000490440200041e0006a20076a200041c8016a20016a2d0000" - "3a0000200020002802a00141016a22073602a001200141016a22014104470d010b0b200041" - "d8016a22024100360200200041d0016a22054200370300200042003703c801200041e0006a" - "22012007200041c8016a22044114100e411441d38bc0004113103420024100360200200542" - "00370300200042003703c801200120002802a00120044114100f411441e68bc00041231034" - "2002410036020020054200370300200042003703c8014101200120002802a0012004411410" - "10411441898cc000411b10344189803c10114120419881c000411010344189803c10124120" - "41a881c0004120103441014189803c1013412041c881c00041181034200120002802a00110" - "14412041e081c00041171034200120002802a0011015412041f781c0004127103441012001" - "20002802a00110164120419e82c000411f10342000412c6a220341141017410041bd82c000" - "410b1034200041e0016a220742003703002002420037030020054200370300200042003703" - "c801200120002802a001200441201018412041a48cc0004113103441c882c000410c41d482" - "c000410b41df82c000410e1019410141ed82c00041091034200041c0016a200041206a2903" - "00370300200041b8016a200041186a290300370300200041b0016a200041106a2903003703" - "00200020002903083703a801200241003b010020054200370300200042003703c801200341" - "14200041a8016a2206412020044112101a411241b78cc00041071034200241003602002005" - "4200370300200042003703c8012006412020044114101b411441be8cc000410e1034200041" - "003602c8012006412020044104101c410441cc8cc000410d103420064120101d410841f682" - "c000410d103420064120101e410a418383c00041141034200041003602c801200641202004" - "4104101f410441d98cc000410e1034419783c000410d200341141020412f41a483c000410d" - "1034419783c000410d41b183c00041081021411341b983c000410c1034417f410410044171" - "41c583c000411e1034200041003602c8012004417f1004417141e78cc000411e1034200041" - "ca016a41003a0000200041003b01c801200441031004417d41858dc0004124103420004100" - "3602c8012004418094ebdc031004417341a98dc00041231034419783c000410d2003411410" - "20412f41a483c000410d1034419783c000410d41b183c00041081021411341b983c000410c" - "103441021011416f41e383c000411f1034417f20002802a00110144171418284c000411f10" - "342001417f1014417141a184c000411f103420014181201014417441c084c0004120103420" - "0041e094ebdc036a220620002802a0011014417341e084c000411f1034200620002802a001" - "4101100b417341ff84c00041181034200120002802a0014101100b4171419785c000411a10" - "34200742003703002002420037030020054200370300200042003703c801200620002802a0" - "0120044120100a417341cc8dc0004116103420074200370300200242003703002005420037" - "0300200042003703c801200120002802a00120044120100a417141e28dc000411810342007" - "42003703002002420037030020054200370300200042003703c80120034114200341142006" - "20002802a001200441201022417341fa8dc000411c10342007420037030020024200370300" - "20054200370300200042003703c8012003411420034114200120002802a001200441201022" - "417141968ec000411e10342007420037030020024200370300200542003703002000420037" - "03c80141819ac0004114200620002802a001200441201023417341b48ec000411910342007" - "42003703002002420037030020054200370300200042003703c80141819ac0004114200120" - "002802a001200441201023417141cd8ec000411f1034200742003703002002420037030020" - "054200370300200042003703c80141819ac000411441b185c0004114200441201023417141" - "ec8ec00041291034200041dc016a2000413c6a280100360200200041d4016a200041346a29" - "01003702002000200029012c3702cc01200041808080083602c801200041003b01ec012004" - "411841819ac0004114200041ec016a220241021023417141958fc000410e10342006200028" - "02a001422a1001417341c585c00041111034200041003b01ec014102200241021009416f41" - "a38fc000411b1034200041003b01ec01410220024102100c416f41be8fc000412b10342000" - "41003b01ec014101410220024102100d416f41e98fc0004123103441021011416f41e383c0" - "00411f103441021012416f41d685c000412f1034410141021013416f418586c00041271034" - "41e980c0004181201008417441ac86c000411f103441e980c00041c1001008417441cb86c0" - "00411a1034200041003b01ec01200141812020024102100e4174418c90c000412110342000" - "41003b01ec01200141812020024102100f417441ad90c00041311034200041003b01ec0141" - "012001418120200241021010417441de90c0004129103420014181201014417441e586c000" - "41251034200141812010154174418a87c00041351034410120014181201016417441bf87c0" - "00412d103420014181201017417441ec87c00041191034419783c00041812041d482c00041" - "0b41df82c000410e1019417441ed82c00041091034419783c000410d41d482c00041812041" - "df82c000410e1019417441ed82c00041091034419783c000410d41d482c000410b41df82c0" - "004181201019417441ed82c00041091034200041003b01ec01200141812020024102101841" - "74418791c00041211034200041003b01ec0141819ac00041812041819ac000411420024102" - "1023417441a891c00041181034200041003b01ec0120034114200341142001418120200241" - "021024417441c091c000411f1034200041003b01ec01200441812020034114200241021025" - "417441df91c00041221034419783c000410d200620002802a001410010004173418588c000" - "410f1034419783c000410d200620002802a00110214173419488c000411610342001200028" - "02a0014100100b417141aa88c00041231034200041003b01ec0120034114200120002802a0" - "0120024102101a4171418192c000411a1034200041003b01ec01200120002802a001200241" - "02101b4171419b92c00041211034200041003b01ec01200120002802a00120024102101c41" - "7141bc92c00041201034200120002802a001101d417141cd88c00041201034200120002802" - "a001101e417141ed88c00041271034200041003602ec01200120002802a00120024104101f" - "417141dc92c00041211034200041003b01ec01200120002802a00120024102100a417141fd" - "92c00041231034200041003b01ec01200120002802a0014101200241021026417141a093c0" - "0041211034200041003b01ec01200120002802a00122052003411420012005200241021024" - "417141c193c00041271034200041003b01ec0120034114200120002802a001220520012005" - "200241021024417141e893c00041271034200041003b01ec01200120002802a00120034114" - "2002410210274171418f94c00041251034200041003b01ec0120034114200120002802a001" - "200241021027417141b494c00041251034200041003b01ec01200120002802a00120034114" - "200241021028417141d994c000412c1034200041003b01ec0120034114200120002802a001" - "2002410210284171418595c000412c1034200041003b01ec01200120002802a00120024102" - "1029417141b195c000411f1034200041003b01ec01200120002802a001410120024102102a" - "417141d095c00041221034200041003b01ec01200120002802a0012003411441b185c00041" - "14200241021022417141f295c00041211034200041003b01ec0120034114200120002802a0" - "0141b185c00041142002410210224171419396c00041211034200041003b01ec0120012000" - "2802a001410120024102102b417141b496c00041281034200041003b01ec01200441182001" - "20002802a001200241021025417141dc96c00041231034200041003b01ec01200120002802" - "a001410120024102102c417141ff96c00041251034200041003b01ec01200120002802a001" - "410120024102102d417141a497c00041211034200041003b01ec01200120002802a0014101" - "20024102102e417141c597c00041221034200041003b01ec01200120002802a00120034114" - "410120024102102f417141e797c00041241034200041003b01ec0120034114200120002802" - "a001410120024102102f4171418b98c00041241034200041003b01ec01200120002802a001" - "4101200241021030417141af98c000412f1034200041003b01ec01200120002802a0012002" - "41021031417141de98c00041231034200041003b01ec01200120002802a001410120024102" - "10324171418199c00041221034200041003b01ec01200120002802a0014101200241021033" - "417141a399c00041211034200041003b01ec01200120002802a001419489c0004120200241" - "02101a417141c499c000411c1034419783c000410d200120002802a0011020417141b489c0" - "0041221034419797abdd03410d419489c000412041001000417341d689c000411010344197" - "97abdd03410d200341141020417341e689c00041181034419797abdd03410d41b183c00041" - "081021417341fe89c00041171034200120002802a001200141812041001000417441958ac0" - "00410e1034200141812042011001417441a38ac00041121034419783c00041812020034114" - "1020417441b58ac00041161034419783c00041812041b183c00041081021417441b58ac000" - "41161034419783c000410d200120002802a0011021417141cb8ac00041191034200041003b" - "01ec01200120002802a00120034114200241021025417141e099c00041211034200041f001" - "6a240041010f0b418080c000410b417f20052005417f4e1bac1001000b418080c000410b41" - "7f20042004417f4e1bac1001000b0b8b1a0100418080c0000b811a6572726f725f636f6465" - "3d54455354204641494c45442424242424205354415254494e47205741534d204558454355" - "54494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e745f6c65" - "646765725f74696d656765745f626173655f666565746573745f616d656e646d656e74616d" - "656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" - "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261" - "795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e" - "65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465" - "645f61727261795f6c656e7570646174655f6461746174657374206d657373616765746573" - "74207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66" - "745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67207472" - "61636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e7467" - "65745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f" - "61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f" - "6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f" - "6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f62" - "63616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" - "6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303074726163" - "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" - "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" - "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" - "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" - "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" - "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" - "6163655f616d6f756e745f6f6f625f736c69636563616368655f6c65646765725f6f626a5f" - "77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e67" - "5f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f" - "6e675f73697a655f75696e7432353630303030303030303030303030303030303030303030" - "3030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163" - "636f756e74696474726163655f6f6f625f737472696e6774726163655f6163636f756e745f" - "6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163" - "655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f616363" - "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774" - "686765745f706172656e745f6c65646765725f686173686765745f6c65646765725f616363" - "6f756e745f686173686765745f6c65646765725f74785f686173686765745f63757272656e" - "745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c" - "646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c65646765" - "725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e6674676574" - "5f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e66745f7365726961" - "6c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f7061" - "72656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172" - "656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e676163636f756e745f6b" - "65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e" - "6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c" - "65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f" - "6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373" - "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f6375727265" - "6e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76" - "616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f666965" - "6c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" - "5f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f" - "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573" - "7465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a" - "5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368" - "613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f" - "5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f73" - "6c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d707469" - "646765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973" - "737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f" - "77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e" - "675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" - "64317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964" - "327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "69646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e" - "5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f6475636572" - "7302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374" - "631d312e38352e31202834656231363132353020323032352d30332d31352900490f746172" - "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620f666c6f6174" + "5f66726f6d5f75696e74000108686f73745f6c69620b6c696e655f6b65796c657400080868" + "6f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c69621163726564656e74" + "69616c5f6b65796c6574000808686f73745f6c69620e6d70746f6b656e5f6b65796c657400" + "0308686f73745f6c69621274726163655f6f70617175655f666c6f6174000008686f73745f" + "6c69620d666c6f61745f636f6d70617265000008686f73745f6c696209666c6f61745f6164" + "64000408686f73745f6c69620e666c6f61745f7375627472616374000408686f73745f6c69" + "620e666c6f61745f6d756c7469706c79000408686f73745f6c69620c666c6f61745f646976" + "696465000408686f73745f6c69620a666c6f61745f726f6f74000308686f73745f6c696209" + "666c6f61745f706f77000308686f73745f6c696209666c6f61745f6c6f67000108686f7374" + "5f6c69620c636865636b5f6b65796c6574000108686f73745f6c69620f64656c6567617465" + "5f6b65796c6574000308686f73745f6c6962166465706f7369745f707265617574685f6b65" + "796c6574000308686f73745f6c69620a6469645f6b65796c6574000008686f73745f6c6962" + "0d657363726f775f6b65796c6574000108686f73745f6c6962136d70745f69737375616e63" + "655f6b65796c6574000108686f73745f6c6962106e66745f6f666665725f6b65796c657400" + "0108686f73745f6c69620c6f666665725f6b65796c6574000108686f73745f6c69620d6f72" + "61636c655f6b65796c6574000108686f73745f6c69620e7061796368616e5f6b65796c6574" + "000408686f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c65" + "74000108686f73745f6c69620e7369676e6572735f6b65796c6574000008686f73745f6c69" + "620d7469636b65745f6b65796c6574000108686f73745f6c69620c7661756c745f6b65796c" + "657400010303020a0505030100110619037f01418080c0000b7f00419f9ec0000b7f0041a0" + "9ec0000b072e04066d656d6f727902000666696e697368003f0a5f5f646174615f656e6403" + "010b5f5f686561705f6261736503020ab02b02460002402000200147044020022003410041" + "00410010001a20004100480d01418b80c000410b2000ad1001000b200220032000ac10011a" + "0f0b418b80c000410b2000ac1001000be62a02087f027e230041f0016b22002400419680c0" + "00412341004100410010001a100241b9e00041b980c000410e103e100341b2920441c780c0" + "004116103e200041f0006a22054200370300200041e8006a22034200370300200041e0006a" + "2202420037030020004200370358200041d8006a220141201004412041a58cc0004116103e" + "20054200370300200342003703002002420037030020004200370358200141201005412041" + "bb8cc0004117103e2005420037030020034200370300200242003703002000420037035820" + "0141201006412041d28cc0004112103e1007410a41dd80c000410c103e200041186a428182" + "848890a0c08001370300200041106a428182848890a0c08001370300200041086a42818284" + "8890a0c080013703002000428182848890a0c0800137030041e980c000410e1008410141f7" + "80c0004111103e200041201008410141f780c0004111103e20034100360200200242003703" + "002000420037035802404181802020014114100922044114460440200041266a20002d005a" + "3a00002000200029005f3703c8012000200041e4006a2900003700cd01200041306a200029" + "00cd01370000200020002f01583b01242000200028005b360027200020002903c80137002b" + "20054200370300200342003703002002420037030020004200370358200041246a41142001" + "4120100a22054120470d012000413a6a20002d005a3a0000200041d0016a200041e7006a29" + "00002208370300200041d8016a200041ef006a2900002209370300200041c7006a20083700" + "00200041cf006a2009370000200041d7006a200041f7006a2d00003a0000200020002f0158" + "3b01382000200028005b36003b2000200029005f37003f200041386a41204100100b410141" + "8881c0004110103e2003410036020020024200370300200042003703584181802020014114" + "100c411441e48cc000411c103e200341003602002002420037030020004200370358410141" + "81802020014114100d411441808dc0004114103e02402001410020016b41037122036a2202" + "20014d0d0020030440200321050340200141003a0000200141016a2101200541016b22050d" + "000b0b200341016b4107490d000340200141003a0000200141076a41003a0000200141066a" + "41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a00002001" + "41026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c400" + "20036b2203417c716a220120024b0440034020024100360200200241046a22022001490d00" + "0b0b024020012003410371220320016a22054f0d002003220204400340200141003a000020" + "0141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a000020" + "0141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a" + "0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141086a" + "22012005470d000b0b2000418180203602c801410021010340200641c000490440200041d8" + "006a20066a200041c8016a20016a2d00003a0000200020002802980141016a220636029801" + "200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a22044200" + "370300200042003703c801200041d8006a22012006200041c8016a22054114100e41144194" + "8dc0004113103e2002410036020020044200370300200042003703c8012001200028029801" + "20054114100f411441a78dc0004123103e2002410036020020044200370300200042003703" + "c80141012001200028029801200541141010411441ca8dc000411b103e4189803c10114120" + "419881c0004110103e4189803c1012412041a881c0004120103e41014189803c1013412041" + "c881c0004118103e20012000280298011014412041e081c0004117103e2001200028029801" + "1015412041f781c0004127103e4101200120002802980110164120419e82c000411f103e20" + "0041246a220341141017410041bd82c000410b103e200041e0016a22064200370300200242" + "0037030020044200370300200042003703c8012001200028029801200541201018412041e5" + "8dc0004113103e41c882c000410c41d482c000410b41df82c000410e1019410141ed82c000" + "4109103e200041b8016a200041186a290300370300200041b0016a200041106a2903003703" + "00200041a8016a200041086a290300370300200020002903003703a001200241003b010020" + "044200370300200042003703c80120034114200041a0016a2207412020054112101a411241" + "f88dc0004107103e2002410036020020044200370300200042003703c80120074120200541" + "14101b411441ff8dc000410e103e200041003602c8012007412020054104101c4104418d8e" + "c000410d103e20074120101d410841f682c000410d103e20074120101e410a418383c00041" + "14103e200041003602c8012007412020054104101f4104419a8ec000410e103e419783c000" + "410d200341141020412f41a483c000410d103e419783c000410d41b183c000410810214113" + "41b983c000410c103e417f41041004417141c583c000411e103e200041003602c801200541" + "7f1004417141a88ec000411e103e200041ca016a41003a0000200041003b01c80120054103" + "1004417d41c68ec0004124103e200041003602c8012005418094ebdc031004417341ea8ec0" + "004123103e419783c000410d200341141020412f41a483c000410d103e419783c000410d41" + "b183c00041081021411341b983c000410c103e200642003703002002420037030020044200" + "370300200042003703c801200041d894ebdc036a2207410820054120410010224173418d8f" + "c0004117103e200642003703002002420037030020044200370300200042003703c8012001" + "2000280298012005412041001022417141a48fc0004119103e41021011416f41e383c00041" + "1f103e417f20002802980110144171418284c000411f103e2001417f1014417141a184c000" + "411f103e20014181201014417441c084c0004120103e20072000280298011014417341e084" + "c000411f103e20072000280298014101100b417341ff84c0004118103e2001200028029801" + "4101100b4171419785c000411a103e20064200370300200242003703002004420037030020" + "0042003703c801200720002802980120054120100a417341bd8fc0004116103e2006420037" + "03002002420037030020044200370300200042003703c80120012000280298012005412010" + "0a417141d38fc0004118103e20064200370300200242003703002004420037030020004200" + "3703c80120034114200341142007200028029801200541201023417341eb8fc000411c103e" + "200642003703002002420037030020044200370300200042003703c8012003411420034114" + "20012000280298012005412010234171418790c000411e103e200642003703002002420037" + "030020044200370300200042003703c801418b9ec000411420072000280298012005412010" + "24417341a590c0004119103e20064200370300200242003703002004420037030020004200" + "3703c801418b9ec00041142001200028029801200541201024417141be90c000411f103e20" + "0642003703002002420037030020044200370300200042003703c801418b9ec000411441b1" + "85c0004114200541201024417141dd90c0004129103e200642003703002002420037030020" + "044200370300200042003703c80141c585c0004128418b9ec0004114200541201024417141" + "8691c0004125103e200041dc016a200041346a280100360200200041d4016a2000412c6a29" + "0100370200200020002901243702cc01200041808080083602c801200041003b01c0012005" + "4118418b9ec0004114200041c0016a220441021024417141ab91c000410e103e2007200028" + "029801422a1001417341ed85c0004111103e200041003b01c0014102200441021009416f41" + "b991c000411b103e200041003b01c001410220044102100c416f41d491c000412b103e2000" + "41003b01c0014101410220044102100d416f41ff91c0004123103e41021011416f41e383c0" + "00411f103e41021012416f41fe85c000412f103e410141021013416f41ad86c0004127103e" + "41e980c0004181201008417441d486c000411f103e41e980c00041c1001008417441f386c0" + "00411a103e200041003b01c001200141812020044102100e417441a292c0004121103e2000" + "41003b01c001200141812020044102100f417441c392c0004131103e200041003b01c00141" + "012001418120200441021010417441f492c0004129103e200141812010144174418d87c000" + "4125103e20014181201015417441b287c0004135103e410120014181201016417441e787c0" + "00412d103e200141812010174174419488c0004119103e419783c00041812041d482c00041" + "0b41df82c000410e1019417441ed82c0004109103e419783c000410d41d482c00041812041" + "df82c000410e1019417441ed82c0004109103e419783c000410d41d482c000410b41df82c0" + "004181201019417441ed82c0004109103e200041003b01c001200141812020044102101841" + "74419d93c0004121103e200041003b01c001418b9ec000418120418b9ec000411420044102" + "1024417441be93c0004118103e200041003b01c00120034114200341142001418120200441" + "021025417441d693c000411f103e200041003b01c001200541812020034114200441021026" + "417441f593c0004122103e419783c000410d200720002802980141001000417341ad88c000" + "410f103e200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22" + "0641081027417341bc88c000411c103e419783c000410d20072000280298011021417341d8" + "88c0004116103e20064108200441081028417341ee88c0004118103e200441082006410810" + "284173418689c0004118103e200041003b01ec012006410820044108200041ec016a220241" + "02410010294173419794c0004114103e200041003b01ec0120044108200641082002410241" + "001029417341ab94c0004114103e200041003b01ec01200641082004410820024102410010" + "2a417341bf94c0004119103e200041003b01ec012004410820064108200241024100102a41" + "7341d894c0004119103e200041003b01ec012006410820044108200241024100102b417341" + "f194c0004119103e200041003b01ec012004410820064108200241024100102b4173418a95" + "c0004119103e200041003b01ec012006410820044108200241024100102c417341a395c000" + "4117103e200041003b01ec012004410820064108200241024100102c417341ba95c0004117" + "103e200041003b01ec01200641084103200241024100102d417341d195c0004114103e2000" + "41003b01ec01200641084103200241024100102e417341e595c0004113103e200041003b01" + "ec0120064108200241024100102f417341f895c0004113103e20012000280298014100100b" + "4171419e89c0004123103e200041003b01ec0120034114200120002802980120024102101a" + "4171418b96c000411a103e200041003b01ec01200120002802980120024102101b417141a5" + "96c0004121103e200041003b01ec01200120002802980120024102101c417141c696c00041" + "20103e2001200028029801101d417141c189c0004120103e2001200028029801101e417141" + "e189c0004127103e200041003602ec01200120002802980120024104101f417141e696c000" + "4121103e200041003b01ec01200120002802980120024102100a4171418797c0004123103e" + "200041003b01ec0120012000280298014101200241021030417141aa97c0004121103e2000" + "41003b01ec01200120002802980122062003411420012006200241021025417141cb97c000" + "4127103e200041003b01ec0120034114200120002802980122062001200620024102102541" + "7141f297c0004127103e200041003b01ec0120012000280298012003411420024102103141" + "71419998c0004125103e200041003b01ec0120034114200120002802980120024102103141" + "7141be98c0004125103e200041003b01ec0120012000280298012003411420024102103241" + "7141e398c000412c103e200041003b01ec0120034114200120002802980120024102103241" + "71418f99c000412c103e200041003b01ec012001200028029801200241021033417141bb99" + "c000411f103e200041003b01ec0120012000280298014101200241021034417141da99c000" + "4122103e200041003b01ec0120012000280298012003411441b185c0004114200241021023" + "417141fc99c0004121103e200041003b01ec0120034114200120002802980141b185c00041" + "142002410210234171419d9ac0004121103e200041003b01ec012001200028029801410120" + "0241021035417141be9ac0004128103e200041003b01ec0120054118200120002802980120" + "0241021026417141e69ac0004123103e200041003b01ec0120012000280298014101200241" + "021036417141899bc0004125103e200041003b01ec01200120002802980141012002410210" + "37417141ae9bc0004121103e200041003b01ec012001200028029801410120024102103841" + "7141cf9bc0004122103e200041003b01ec0120012000280298012003411441012002410210" + "39417141f19bc0004124103e200041003b01ec012003411420012000280298014101200241" + "021039417141959cc0004124103e200041003b01ec01200120002802980141012002410210" + "3a417141b99cc000412f103e200041003b01ec01200120002802980120024102103b417141" + "e89cc0004123103e200041003b01ec012001200028029801410120024102103c4171418b9d" + "c0004122103e200041003b01ec012001200028029801410120024102103d417141ad9dc000" + "4121103e200041003b01ec01200120002802980141888ac000412020024102101a417141ce" + "9dc000411c103e419783c000410d20012000280298011020417141a88ac0004122103e4197" + "97abdd03410d41888ac000412041001000417341ca8ac0004110103e419797abdd03410d20" + "0441081027417341da8ac000411d103e419797abdd03410d200341141020417341f78ac000" + "4118103e419797abdd03410d41b183c000410810214173418f8bc0004117103e2001200028" + "029801200141812041001000417441a68bc000410e103e200141812042011001417441b48b" + "c0004112103e419783c000418120200441081027417441c68bc000411b103e419783c00041" + "8120200341141020417441e18bc0004116103e419783c00041812041b183c0004108102141" + "7441f78bc0004115103e419783c000410d200120002802980110214171418c8cc000411910" + "3e200041003b01ec01200120002802980120034114200241021026417141ea9dc000412110" + "3e200041f0016a240041010f0b418080c000410b417f20042004417f4e1bac1001000b4180" + "80c000410b417f20052005417f4e1bac1001000b0bf61d0200418080c0000bc5056572726f" + "725f636f64653d54455354204641494c45442424242424205354415254494e47205741534d" + "20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f706172" + "656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d656e64" + "6d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a" + "6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" + "6a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765" + "745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c656467" + "65725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d657373" + "61676574657374207075626b657974657374207369676e6174757265636865636b5f736967" + "6765745f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374" + "696e6720747261636574726163655f6163636f756e74400000000000005f74726163655f61" + "6d6f756e746765745f706172656e745f6c65646765725f686173685f6e65675f7074726765" + "745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e" + "65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f" + "61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f" + "6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f70" + "74725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c" + "65646765725f6f626a5f77726f6e675f6c656e555344303030303030303030303030303030" + "30300041ed85c0000b9e1874726163655f6e756d5f6f6f625f7374726765745f6375727265" + "6e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c" + "646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669" + "656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d65" + "6e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f" + "61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c65" + "646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c69" + "63656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f" + "5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c6963657472" + "6163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f73" + "6c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d7061" + "72655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c69636532" + "63616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e743235366765" + "745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e6674" + "5f7472616e736665725f6665655f77726f6e675f73697a655f75696e743235363030303030" + "30303030303030303030303030303030303030303030303030303174726163655f6163636f" + "756e745f77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f737472" + "696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e677472616365" + "5f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f73" + "7472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e67" + "74726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f" + "756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163" + "655f616d6f756e745f77726f6e675f6c656e6774686765745f706172656e745f6c65646765" + "725f686173686765745f6c65646765725f6163636f756e745f686173686765745f6c656467" + "65725f74785f686173686765745f63757272656e745f6c65646765725f6f626a5f6669656c" + "646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669" + "656c646765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c" + "646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f73" + "68613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66" + "745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765" + "725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f" + "6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c" + "656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f" + "61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f" + "6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" + "65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f" + "6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373" + "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d" + "5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c65" + "6e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c65" + "6e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f73" + "6669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76" + "616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c" + "69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f" + "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669" + "656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465" + "645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68" + "616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f73" + "6c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70" + "746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f6174" + "5f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c" + "6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f7375627472616374" + "5f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c6963653166" + "6c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f" + "6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61" + "745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c" + "6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75" + "696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e7432" + "35366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e74323536676574" + "5f6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e74" + "5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465" + "706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e74696465" + "7363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e65" + "5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69737375616e6365" + "5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e" + "675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f" + "6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c" + "656e677468004d0970726f64756365727302086c616e6775616765010452757374000c7072" + "6f6365737365642d6279010572757374631d312e38352e3120283465623136313235302032" + "3032352d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c" + "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b" + "0a6d756c746976616c7565"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 1bd9622a4c3..5293f1db785 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1647,12 +1647,12 @@ floatFromInt_wrap( int i = 0; auto const x = getDataInt64(runtime, params, i); if (!x) - return hfResult(results, x.error()); + return hfResult(results, x.error()); // LCOV_EXCL_LINE i = 3; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 1; return returnResult( @@ -1676,7 +1676,7 @@ floatFromUint_wrap( i = 4; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; return returnResult( @@ -1692,16 +1692,16 @@ floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) int i = 0; auto const exp = getDataInt32(runtime, params, i); if (!exp) - return hfResult(results, exp.error()); + return hfResult(results, exp.error()); // LCOV_EXCL_LINE auto const mant = getDataInt64(runtime, params, i); if (!mant) - return hfResult(results, mant.error()); + return hfResult(results, mant.error()); // LCOV_EXCL_LINE i = 4; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; return returnResult( @@ -1747,7 +1747,7 @@ floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) i = 6; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; return returnResult( @@ -1775,7 +1775,7 @@ floatSubtract_wrap( i = 6; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; return returnResult( @@ -1803,7 +1803,7 @@ floatMultiply_wrap( i = 6; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; return returnResult( @@ -1831,7 +1831,7 @@ floatDivide_wrap( i = 6; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; return returnResult( @@ -1851,12 +1851,12 @@ floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const n = getDataInt32(runtime, params, i); if (!n) - return hfResult(results, n.error()); + return hfResult(results, n.error()); // LCOV_EXCL_LINE i = 5; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 3; return returnResult( @@ -1879,12 +1879,12 @@ floatPower_wrap( auto const n = getDataInt32(runtime, params, i); if (!n) - return hfResult(results, n.error()); + return hfResult(results, n.error()); // LCOV_EXCL_LINE i = 5; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 3; return returnResult( @@ -1905,7 +1905,7 @@ floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) i = 4; auto const rounding = getDataInt32(runtime, params, i); if (!rounding) - return hfResult(results, rounding.error()); + return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; return returnResult( From ebd90c47423267459fbfaf73800ba8d637de1d6a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 11 Sep 2025 18:41:24 -0400 Subject: [PATCH 076/212] chore: remove unneeded float stuff (#5729) --- src/xrpld/app/wasm/ParamsHelper.h | 42 ++++++++++++---------------- src/xrpld/app/wasm/detail/WamrVM.cpp | 18 ------------ 2 files changed, 18 insertions(+), 42 deletions(-) diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index 8bdf11e6182..7f183895526 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -52,7 +52,7 @@ typedef WasmResult EscrowResult; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -enum WasmTypes { WT_I32, WT_I64, WT_F32, WT_F64, WT_U8V }; +enum WasmTypes { WT_I32, WT_I64, WT_U8V }; struct WasmImportFunc { @@ -86,10 +86,6 @@ WasmImpArgs(WasmImportFunc& e) e.params.push_back(WT_I32); else if constexpr (std::is_same_v) e.params.push_back(WT_I64); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F32); - else if constexpr (std::is_same_v) - e.params.push_back(WT_F64); else static_assert(std::is_pointer_v, "Unsupported argument type"); @@ -108,10 +104,6 @@ WasmImpRet(WasmImportFunc& e) e.result = WT_I32; else if constexpr (std::is_same_v) e.result = WT_I64; - else if constexpr (std::is_same_v) - e.result = WT_F32; - else if constexpr (std::is_same_v) - e.result = WT_F64; else if constexpr (std::is_void_v) e.result.reset(); #if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ @@ -189,21 +181,23 @@ wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) wasmParamsHlp(v, std::forward(args)...); } -template -inline void -wasmParamsHlp(std::vector& v, float p, Types&&... args) -{ - v.push_back({.type = WT_F32, .of = {.f32 = p}}); - wasmParamsHlp(v, std::forward(args)...); -} - -template -inline void -wasmParamsHlp(std::vector& v, double p, Types&&... args) -{ - v.push_back({.type = WT_F64, .of = {.f64 = p}}); - wasmParamsHlp(v, std::forward(args)...); -} +// We are not supporting float/double for now +// Leaving this code here so that it is easier to add later if needed +// template +// inline void +// wasmParamsHlp(std::vector& v, float p, Types&&... args) +// { +// v.push_back({.type = WT_F32, .of = {.f32 = p}}); +// wasmParamsHlp(v, std::forward(args)...); +// } + +// template +// inline void +// wasmParamsHlp(std::vector& v, double p, Types&&... args) +// { +// v.push_back({.type = WT_F64, .of = {.f64 = p}}); +// wasmParamsHlp(v, std::forward(args)...); +// } template inline void diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index e47a618f12a..4d94e1cb8fe 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -425,12 +425,6 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) case WT_I64: v.data[i] = wasm_valtype_new_i64(); break; - case WT_F32: - v.data[i] = wasm_valtype_new_f32(); - break; - case WT_F64: - v.data[i] = wasm_valtype_new_f64(); - break; default: throw std::runtime_error("invalid import type"); } @@ -452,12 +446,6 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) case WT_I64: v.data[0] = wasm_valtype_new_i64(); break; - case WT_F32: - v.data[0] = wasm_valtype_new_f32(); - break; - case WT_F64: - v.data[0] = wasm_valtype_new_f64(); - break; default: throw std::runtime_error("invalid return type"); } @@ -680,12 +668,6 @@ WamrEngine::convertParams(std::vector const& params) case WT_I64: v.push_back(WASM_I64_VAL(p.of.i64)); break; - case WT_F32: - v.push_back(WASM_F32_VAL(p.of.f32)); - break; - case WT_F64: - v.push_back(WASM_F64_VAL(p.of.f64)); - break; case WT_U8V: { auto const sz = p.of.u8v.sz; auto const ptr = allocate(sz); From edfed060017116f703c05ec11a5da3f0cf468519 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 18 Sep 2025 15:39:49 -0400 Subject: [PATCH 077/212] fix merge issues --- src/test/app/TestHostFunctions.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index ae4db59b0d0..ffa0bfb895b 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -24,7 +24,8 @@ #include #include #include -#include + +#include namespace ripple { From 6be8f2124cd1cdc3db3e59764a24e8925eaae7c5 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 18 Sep 2025 15:51:39 -0400 Subject: [PATCH 078/212] Latests HF perf test (#5789) --- src/test/app/HostFuncImpl_test.cpp | 54 +- src/test/app/TestHostFunctions.h | 626 ++++++++++++++---- src/test/app/Wasm_test.cpp | 15 +- src/test/app/wasm_fixtures/fixtures.cpp | 67 +- src/xrpld/app/wasm/HostFuncImpl.h | 10 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 13 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 20 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 36 +- 8 files changed, 609 insertions(+), 232 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index f75ad1aa723..60578c849ea 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1356,8 +1356,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.has_value() && result.value() == 0); // Should fail for too large data - std::vector bigData( - 1024 * 1024 + 1, 0x42); // > maxWasmDataLength + std::vector bigData(maxWasmDataLength + 1, 0x42); auto const tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); if (BEAST_EXPECT(!tooBig.has_value())) @@ -2102,6 +2101,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Bytes const float2 = {0xD4, 0x87, 0x1A, 0xFD, 0x49, 0x8D, 0x00, 0x00}; // 2 Bytes const float10 = {0xD4, 0xC3, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 10 Bytes const floatInvalidZero = {0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // INVALID + Bytes const floatPi = {0xD4, 0x8B, 0x29, 0x43, 0x0A, 0x25, 0x6D, 0x21}; // 3.141592653589793 std::string const invalid = "invalid_data"; @@ -2744,8 +2744,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const result = - hfs.floatPower(makeSlice(floatMaxIOU), 40000, 0); + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 81, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT( + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + + { + auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); BEAST_EXPECT(!result) && BEAST_EXPECT( result.error() == @@ -2809,6 +2815,46 @@ struct HostFuncImpl_test : public beast::unit_test::suite result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } + // perf test logs + // { + // auto const result = hfs.floatLog(makeSlice(floatPi), 0); + // if (BEAST_EXPECT(result)) + // { + // std::cout << "lg(" << floatToString(makeSlice(floatPi)) + // << ") = " << floatToString(makeSlice(*result)) + // << std::endl; + // } + // } + // { + // auto const result = hfs.floatLog(makeSlice(floatIntMax), 0); + // if (BEAST_EXPECT(result)) + // { + // std::cout << "lg(" << floatToString(makeSlice(floatIntMax)) + // << ") = " << floatToString(makeSlice(*result)) + // << std::endl; + // } + // } + + // { + // auto const result = hfs.floatLog(makeSlice(floatMaxExp), 0); + // if (BEAST_EXPECT(result)) + // { + // std::cout << "lg(" << floatToString(makeSlice(floatMaxExp)) + // << ") = " << floatToString(makeSlice(*result)) + // << std::endl; + // } + // } + + // { + // auto const result = hfs.floatLog(makeSlice(floatMaxIOU), 0); + // if (BEAST_EXPECT(result)) + // { + // std::cout << "lg(" << floatToString(makeSlice(floatMaxIOU)) + // << ") = " << floatToString(makeSlice(*result)) + // << std::endl; + // } + // } + { auto const x = hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index ffa0bfb895b..6973a107fee 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -605,13 +605,17 @@ struct TestHostFunctionsSink : public TestHostFunctions struct PerfHostFunctions : public TestHostFunctions { Keylet leKey; + std::shared_ptr currentLedgerObj = nullptr; + bool isLedgerObjCached = false; + static int constexpr MAX_CACHE = 256; std::array, MAX_CACHE> cache; + // std::optional data_; // deferred data update, not used in + // performance std::shared_ptr tx_; void const* rt_ = nullptr; -public: PerfHostFunctions( test::jtx::Env& env, Keylet const& k, @@ -620,9 +624,113 @@ struct PerfHostFunctions : public TestHostFunctions { } + Expected + getLedgerSqn() override + { + auto seq = env_.current()->seq(); + if (seq > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE + return static_cast(seq); + } + + Expected + getParentLedgerTime() override + { + auto time = + env_.current()->parentCloseTime().time_since_epoch().count(); + if (time > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(time); + } + + Expected + getParentLedgerHash() override + { + return env_.current()->info().parentHash; + } + + Expected + getLedgerAccountHash() override + { + return env_.current()->info().accountHash; + } + + Expected + getLedgerTransactionHash() override + { + return env_.current()->info().txHash; + } + + Expected + getBaseFee() override + { + auto fee = env_.current()->fees().base.drops(); + if (fee > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(fee); + } + + Expected + isAmendmentEnabled(uint256 const& amendmentId) override + { + return env_.current()->rules().enabled(amendmentId); + } + + Expected + isAmendmentEnabled(std::string_view const& amendmentName) override + { + auto const& table = env_.app().getAmendmentTable(); + auto const amendment = table.find(std::string(amendmentName)); + return env_.current()->rules().enabled(amendment); + } + + Expected, HostFunctionError> + getCurrentLedgerObj() + { + if (!isLedgerObjCached) + { + isLedgerObjCached = true; + currentLedgerObj = env_.le(leKey); + } + if (currentLedgerObj) + return currentLedgerObj; + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + } + + Expected, HostFunctionError> + peekCurrentLedgerObj(int32_t cacheIdx) + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (!cache[cacheIdx]) + { // return Unexpected(HostFunctionError::INVALID_SLOT); + auto const r = getCurrentLedgerObj(); + if (!r) + return Unexpected(r.error()); + cache[cacheIdx] = *r; + } + + return cache[cacheIdx]; + } + + Expected + normalizeCacheIndex(int32_t cacheIdx) + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::EMPTY_SLOT); + return cacheIdx; + } + virtual Expected cacheLedgerObj(uint256 const&, int32_t cacheIdx) override { + // auto const& keylet = keylet::unchecked(objId); + static int32_t intIdx = 0; if (cacheIdx < 0 || cacheIdx > MAX_CACHE) @@ -648,158 +756,157 @@ struct PerfHostFunctions : public TestHostFunctions return cacheIdx + 1; } - static Bytes - getAnyFieldData(STBase const& obj) + static Expected + getAnyFieldData(STBase const* obj) { // auto const& fname = obj.getFName(); - auto const stype = obj.getSType(); + if (!obj) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + auto const stype = obj->getSType(); switch (stype) { + // LCOV_EXCL_START case STI_UNKNOWN: case STI_NOTPRESENT: - return {}; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + break; + // LCOV_EXCL_STOP + case STI_OBJECT: + case STI_ARRAY: + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const* account(static_cast(obj)); + auto const& data = account->value(); + return Bytes{data.begin(), data.end()}; } break; - case STI_AMOUNT: { - auto const& super(static_cast(obj)); - int64_t const data = super.xrp().drops(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + case STI_AMOUNT: + // will be processed by serializer + break; + case STI_ISSUE: { + auto const* issue(static_cast(obj)); + Asset const& asset(issue->value()); + // XRP and IOU will be processed by serializer + if (asset.holds()) + { + // MPT + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; + } } break; case STI_VL: { - auto const& super(static_cast(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + auto const* vl(static_cast(obj)); + auto const& data = vl->value(); + return Bytes{data.begin(), data.end()}; } break; - case STI_UINT256: { - auto const& super(static_cast const&>(obj)); - auto const& data = super.value(); - return {data.begin(), data.end()}; + case STI_UINT16: { + auto const& num( + static_cast const*>(obj)); + std::uint16_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; } - break; case STI_UINT32: { - auto const& super( - static_cast const&>(obj)); - std::uint32_t const data = super.value(); + auto const* num( + static_cast const*>(obj)); + std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); - return {b, e}; + return Bytes{b, e}; } break; default: - break; + break; // default to serializer } Serializer msg; - obj.add(msg); + obj->add(msg); + auto const data = msg.getData(); - return msg.getData(); + return data; } Expected getTxField(SField const& fname) override { - auto const* field = tx_->peekAtPField(fname); - if (!field) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(tx_->peekAtPField(fname)); } Expected getCurrentLedgerObjField(SField const& fname) override { - auto const sle = env_.le(leKey); + auto const sle = getCurrentLedgerObj(); if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - - auto const* field = sle->peekAtPField(fname); - if (!field) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return Unexpected(sle.error()); + return getAnyFieldData((*sle)->peekAtPField(fname)); } Expected getLedgerObjField(int32_t cacheIdx, SField const& fname) override { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HostFunctionError::INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } - - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + auto const sle = peekCurrentLedgerObj(cacheIdx); + if (!sle) + return Unexpected(sle.error()); + return getAnyFieldData((*sle)->peekAtPField(fname)); + } - return getAnyFieldData(*field); + static inline bool + noField(STBase const* field) + { + return !field || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); } static Expected - locateField(STObject const& obj, Slice const& loc) + locateField(STObject const& obj, Slice const& locator) { - if (loc.empty() || (loc.size() & 3)) // must be multiple of 4 + if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - int32_t const* l = reinterpret_cast(loc.data()); - int32_t const sz = loc.size() / 4; + int32_t const* locPtr = + reinterpret_cast(locator.data()); + int32_t const locSize = locator.size() / 4; STBase const* field = nullptr; - auto const& m = SField::getKnownCodeToField(); + auto const& knownSFields = SField::getKnownCodeToField(); { - int32_t const c = l[0]; - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - auto const& fname(*it->second); + int32_t const sfieldCode = locPtr[0]; + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + auto const& fname(*it->second); field = obj.peekAtPField(fname); - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } - for (int i = 1; i < sz; ++i) + for (int i = 1; i < locSize; ++i) { - int32_t const c = l[i]; + int32_t const sfieldCode = locPtr[i]; if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); - if (c >= arr->size()) - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - field = &(arr->operator[](c)); + if (sfieldCode >= arr->size()) + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + field = &(arr->operator[](sfieldCode)); } else if (STI_OBJECT == field->getSType()) { auto const* o = static_cast(field); - auto const it = m.find(c); - if (it == m.end()) - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - auto const& fname(*it->second); + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + auto const& fname(*it->second); field = o->peekAtPField(fname); } else // simple field must be the last one @@ -807,7 +914,7 @@ struct PerfHostFunctions : public TestHostFunctions return Unexpected(HostFunctionError::LOCATOR_MALFORMED); } - if (!field || (STI_NOTPRESENT == field->getSType())) + if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } @@ -822,57 +929,35 @@ struct PerfHostFunctions : public TestHostFunctions auto const r = locateField(*tx_, locator); if (!r) return Unexpected(r.error()); - - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(*r); } Expected getCurrentLedgerObjNestedField(Slice const& locator) override { - auto const sle = env_.le(leKey); + auto const sle = getCurrentLedgerObj(); if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return Unexpected(sle.error()); - auto const r = locateField(*sle, locator); + auto const r = locateField(**sle, locator); if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(*r); } Expected getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HostFunctionError::INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } + auto const sle = peekCurrentLedgerObj(cacheIdx); + if (!sle) + return Unexpected(sle.error()); - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(**sle, locator); if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if ((STI_OBJECT == field->getSType()) || - (STI_ARRAY == field->getSType())) - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - - return getAnyFieldData(*field); + return getAnyFieldData(*r); } Expected @@ -882,7 +967,7 @@ struct PerfHostFunctions : public TestHostFunctions return Unexpected(HostFunctionError::NO_ARRAY); auto const* field = tx_->peekAtPField(fname); - if (!field) + if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) @@ -898,12 +983,12 @@ struct PerfHostFunctions : public TestHostFunctions if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - auto const sle = env_.le(leKey); + auto const sle = getCurrentLedgerObj(); if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return Unexpected(sle.error()); - auto const* field = sle->peekAtPField(fname); - if (!field) + auto const* field = (*sle)->peekAtPField(fname); + if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) @@ -919,17 +1004,12 @@ struct PerfHostFunctions : public TestHostFunctions if (fname.fieldType != STI_ARRAY) return Unexpected(HostFunctionError::NO_ARRAY); - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HostFunctionError::INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } + auto const sle = peekCurrentLedgerObj(cacheIdx); + if (!sle) + return Unexpected(sle.error()); - auto const* field = cache[cacheIdx]->peekAtPField(fname); - if (!field) + auto const* field = (*sle)->peekAtPField(fname); + if (noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); if (field->getSType() != STI_ARRAY) @@ -957,10 +1037,11 @@ struct PerfHostFunctions : public TestHostFunctions Expected getCurrentLedgerObjNestedArrayLen(Slice const& locator) override { - auto const sle = env_.le(leKey); + auto const sle = getCurrentLedgerObj(); if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - auto const r = locateField(*sle, locator); + return Unexpected(sle.error()); + + auto const r = locateField(**sle, locator); if (!r) return Unexpected(r.error()); auto const* field = r.value(); @@ -975,17 +1056,11 @@ struct PerfHostFunctions : public TestHostFunctions Expected getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { - // return Unexpected(HostFunctionError::INVALID_SLOT); - cache[cacheIdx] = env_.le(leKey); - } + auto const sle = peekCurrentLedgerObj(cacheIdx); + if (!sle) + return Unexpected(sle.error()); - auto const r = locateField(*cache[cacheIdx], locator); + auto const r = locateField(**sle, locator); if (!r) return Unexpected(r.error()); @@ -1001,6 +1076,9 @@ struct PerfHostFunctions : public TestHostFunctions Expected updateData(Slice const& data) override { + if (data.size() > maxWasmDataLength) + return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); + ripple::detail::ApplyViewBase v( env_.app().openLedger().current().get(), tapNONE); @@ -1014,6 +1092,19 @@ struct PerfHostFunctions : public TestHostFunctions return data.size(); } + Expected + checkSignature( + Slice const& message, + Slice const& signature, + Slice const& pubkey) override + { + if (!publicKeyType(pubkey)) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + PublicKey const pk(pubkey); + return verify(pk, message, signature, /*canonical*/ true); + } + Expected computeSha512HalfHash(Slice const& data) override { @@ -1021,6 +1112,215 @@ struct PerfHostFunctions : public TestHostFunctions return hash; } + Expected + accountKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + ammKeylet(Asset const& issue1, Asset const& issue2) override + { + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + // note: this should be removed with the MPT DEX amendment + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + checkKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) override + { + if (!subject || !issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + if (credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::credential(subject, issuer, credentialType); + + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + didKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::did(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + delegateKeylet(AccountID const& account, AccountID const& authorize) + override + { + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::delegate(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + override + { + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::depositPreauth(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + escrowKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) override + { + if (!account1 || !account2) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account1 == account2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (currency.isZero()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::line(account1, account2, currency); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override + { + if (!issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptIssuance(seq, issuer); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + mptokenKeylet(MPTID const& mptid, AccountID const& holder) override + { + if (!mptid) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!holder) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptoken(mptid, holder); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + nftOfferKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::nftoffer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + offerKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::offer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + oracleKeylet(AccountID const& account, std::uint32_t documentId) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) override + { + if (!account || !destination) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == destination) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::payChan(account, destination, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::permissionedDomain(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + signersKeylet(AccountID const& account) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::signers(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + ticketKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::ticket(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + + Expected + vaultKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::vault(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + Expected getNFT(AccountID const& account, uint256 const& nftId) override { @@ -1044,6 +1344,40 @@ struct PerfHostFunctions : public TestHostFunctions Slice const s = ouri->value(); return Bytes(s.begin(), s.end()); } + + Expected + getNFTIssuer(uint256 const& nftId) override + { + auto const issuer = nft::getIssuer(nftId); + if (!issuer) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Bytes{issuer.begin(), issuer.end()}; + } + + Expected + getNFTTaxon(uint256 const& nftId) override + { + return nft::toUInt32(nft::getTaxon(nftId)); + } + + Expected + getNFTFlags(uint256 const& nftId) override + { + return nft::getFlags(nftId); + } + + Expected + getNFTTransferFee(uint256 const& nftId) override + { + return nft::getTransferFee(nftId); + } + + Expected + getNFTSerial(uint256 const& nftId) override + { + return nft::getSerial(nftId); + } }; } // namespace test diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index bd4f7d4380a..4348e141309 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -519,7 +519,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 91'412, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 96'942, std::to_string(re->cost)); } env.close(); } @@ -534,7 +534,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 6'533, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 2'053, std::to_string(re->cost)); } env.close(); } @@ -550,13 +550,12 @@ struct Wasm_test : public beast::unit_test::suite // std::string const funcName("test"); auto const& wasmHex = hfPerfTest; - // auto const& wasmHex = opcCallPerfTest; std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); - std::string const credType = "abcde"; - std::string const credType2 = "fghijk"; - std::string const credType3 = "0123456"; + // std::string const credType = "abcde"; + // std::string const credType2 = "fghijk"; + // std::string const credType3 = "0123456"; // char const uri[] = "uri"; Account const alan{"alan"}; @@ -597,7 +596,7 @@ struct Wasm_test : public beast::unit_test::suite // {issuer, credType2}, // {issuer, credType3}})); - // cREATE nft + // create nft [[maybe_unused]] uint256 const nft0{ token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u)); @@ -649,7 +648,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 148'406; + auto const allowance = 153'296; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index de2ad6291b8..8fb6340bed1 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9571,41 +9571,38 @@ extern std::string const deepRecursionHex = "2d657874"; extern std::string const hfPerfTest = - "0061736d0100000001180460037f7f7e017f60057f7f7f7f7f017f600000" - "6000017f021d0203656e760974726163655f6e756d000003656e76057472" - "616365000103030202030503010002068601167f0041a0090b7f0041a011" - "0b7f0041e0080b7f0041a0080b7f0041c0080b7f004180080b7f00418408" - "0b7f004188080b7f00418c080b7f004190080b7f004194080b7f00419808" - "0b7f004180090b7f004180080b7f0041e0110b7f0041e0110b7f0041e091" - "040b7f004180080b7f0041e091040b7f00418080080b7f0041000b7f0041" - "010b07c50219066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300020666696e6973680003036275660300076c6f635f6275660301" - "036d73670302086572725f686561640303096572725f646174613103040a" - "53465f4163636f756e7403050e53465f44657374696e6174696f6e030608" - "53465f4d656d6f7303070753465f4d656d6f03080b53465f4d656d6f4461" - "746103090753465f44617461030a1753465f417574686f72697a65437265" - "64656e7469616c73030b066163635f6964030c0c5f5f64736f5f68616e64" - "6c65030d0a5f5f646174615f656e64030e0b5f5f737461636b5f6c6f7703" - "0f0c5f5f737461636b5f6869676803100d5f5f676c6f62616c5f62617365" - "03110b5f5f686561705f6261736503120a5f5f686561705f656e6403130d" - "5f5f6d656d6f72795f6261736503140c5f5f7461626c655f626173650315" - "0aa2010202000b9c0102017f017e41807821000340200041a0116a420037" - "0300200041086a22000d000b41d811420037030041d011420037030041c8" - "11420037030041c011420037030041b811420037030041b0114200370300" - "41a811428d801c37030041a011429a803c3703000240034041e008411020" - "0110004118460440200142017c220142c0843d520d010c020b0b41a00841" - "1441c0084113410010011a0b41010b0b840104004180080b340100080003" - "00080009000f000a000e000d0007001b0007001a000f0000000000676574" - "5f6c65646765725f73716e206572726f720041c0080b13696e76616c6964" - "2072657475726e2073697a650041e0080b104e6577206163636f756e7420" - "69643a20004180090b14fc4f9afac9f1a8db807fda7dc9247bb557569d58" - "007f0970726f647563657273010c70726f6365737365642d62790105636c" - "616e675f31392e312e352d776173692d73646b202868747470733a2f2f67" - "69746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162" - "346235613264623538323935386166316565333038613739306366646234" - "32626432343732302900490f7461726765745f6665617475726573042b0f" - "6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566" - "6572656e63652d74797065732b0a6d756c746976616c7565"; + "0061736d0100000001190460057f7f7f7f7f017f60047f7f7f7f017f6000006000017f0236" + "0303656e7609666c6f61745f6c6f67000003656e76057472616365000003656e7612747261" + "63655f6f70617175655f666c6f617400010303020203050301000206aa011c7f0041b0090b" + "7f004193090b7f0041b0080b7f0041c0080b7f0041e0080b7f004180090b7f004180080b7f" + "004184080b7f004188080b7f00418c080b7f004190080b7f004194080b7f004198080b7f00" + "419c080b7f0041a0080b7f0041a4080b7f0041a8080b7f0041ac080b7f00419b090b7f0041" + "80080b7f0041b0110b7f0041b0110b7f0041b091040b7f004180080b7f0041b091040b7f00" + "418080080b7f0041000b7f0041010b0785031f066d656d6f72790200115f5f7761736d5f63" + "616c6c5f63746f727300030666696e697368000403627566030001610301086572725f6865" + "61640302096572725f6461746131030305696e707574030406726573756c74030508495445" + "525f4d4158030609484153485f53495a450307084143435f53495a4503080d43555252454e" + "43595f53495a4503090b4b45594c45545f53495a45030a0a53465f4163636f756e74030b0e" + "53465f44657374696e6174696f6e030c0853465f4d656d6f73030d0753465f4d656d6f030e" + "0b53465f4d656d6f44617461030f0753465f4461746103101753465f417574686f72697a65" + "43726564656e7469616c730311016203120c5f5f64736f5f68616e646c6503130a5f5f6461" + "74615f656e6403140b5f5f737461636b5f6c6f7703150c5f5f737461636b5f686967680316" + "0d5f5f676c6f62616c5f6261736503170b5f5f686561705f6261736503180a5f5f68656170" + "5f656e6403190d5f5f6d656d6f72795f62617365031a0c5f5f7461626c655f62617365031b" + "0a7c0202000b7701017f41807821000340200041b0116a4200370300200041086a22000d00" + "0b41c0843d210002400340419309410841b009418008410010004108460440200041016b22" + "000d010c020b0b41b008410f41c0084113410010011a0b41e0084111419309410810021a41" + "8009411241b009410810021a41010b0b9f0104004180080b53809698002000000014000000" + "1400000020000000010008000300080009000f000a000e000d0007001b0007001a000f0066" + "6c6f61745f6c6f67206572726f7200696e76616c69642072657475726e2073697a650041e0" + "080b11666c6f61745f6c6f6720696e7075743a20004180090b12666c6f61745f6c6f672072" + "6573756c743a20004193090b10d48b29430a256d21d920c49ba5e353f8007f0970726f6475" + "63657273010c70726f6365737365642d62790105636c616e675f31392e312e352d77617369" + "2d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d7072" + "6f6a6563742061623462356132646235383239353861663165653330386137393063666462" + "3432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c" + "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b" + "0a6d756c746976616c7565"; extern std::string const allKeyletsWasmHex = "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 5539a5ef408..7c02e3160e2 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -50,7 +50,15 @@ class WasmHostFunctionsImpl : public HostFunctions } Expected - normalizeCacheIndex(int32_t cacheIdx); + normalizeCacheIndex(int32_t cacheIdx) + { + --cacheIdx; + if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::EMPTY_SLOT); + return cacheIdx; + } public: WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 4b585acdcd4..af8eff36eec 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -90,17 +90,6 @@ WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) return ctx.view().rules().enabled(amendment); } -Expected -WasmHostFunctionsImpl::normalizeCacheIndex(int32_t cacheIdx) -{ - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - return cacheIdx; -} - Expected WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) { @@ -1296,7 +1285,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { - if (n < 0) + if ((n < 0) || (n > IOUAmount::maxExponent)) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); SetRound rm(mode); diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 5293f1db785..304fc9eeda2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -107,7 +107,11 @@ getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +getDataSlice( + IW const* runtime, + wasm_val_vec_t const* params, + int32_t& i, + bool isUpdate = false) { auto const ptr = params->data[i].of.i32; auto const size = params->data[i + 1].of.i32; @@ -117,7 +121,7 @@ getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) if (!size) return Slice(); - if (size > maxWasmDataLength) + if (size > (isUpdate ? maxWasmDataLength : maxWasmParamLength)) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); auto memory = runtime ? runtime->getMem() : wmem(); @@ -751,7 +755,7 @@ updateData_wrap( auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - auto const bytes = getDataSlice(runtime, params, index); + auto const bytes = getDataSlice(runtime, params, index, true); if (!bytes) { return hfResult(results, bytes.error()); @@ -1491,7 +1495,7 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmDataLength) + if (params->data[1].of.i32 + params->data[3].of.i32 > maxWasmParamLength) { return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } @@ -1524,7 +1528,7 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = reinterpret_cast(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) + if (params->data[1].of.i32 > maxWasmParamLength) { return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } @@ -1554,7 +1558,7 @@ traceAccount_wrap( auto* hf = reinterpret_cast(env); auto const* runtime = reinterpret_cast(hf->getRT()); - if (params->data[1].of.i32 > maxWasmDataLength) + if (params->data[1].of.i32 > maxWasmParamLength) return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); int i = 0; @@ -1579,7 +1583,7 @@ traceFloat_wrap( auto* hf = reinterpret_cast(env); auto const* runtime = reinterpret_cast(hf->getRT()); - if (params->data[1].of.i32 > maxWasmDataLength) + if (params->data[1].of.i32 > maxWasmParamLength) return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); int i = 0; @@ -1604,7 +1608,7 @@ traceAmount_wrap( auto* hf = reinterpret_cast(env); auto const* runtime = reinterpret_cast(hf->getRT()); - if (params->data[1].of.i32 > maxWasmDataLength) + if (params->data[1].of.i32 > maxWasmParamLength) return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); int i = 0; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index d9dd67860d8..022d66f9820 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -44,9 +44,9 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); - WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 60); + WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 100); - WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5000); + WASM_IMPORT_FUNC2(i, cacheLedgerObj, "cache_ledger_obj", hfs, 5'000); WASM_IMPORT_FUNC2(i, getTxField, "get_tx_field", hfs, 70); WASM_IMPORT_FUNC2(i, getCurrentLedgerObjField, "get_current_ledger_obj_field", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjField, "get_ledger_obj_field", hfs, 70); @@ -60,20 +60,20 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 2000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 300); WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 450); WASM_IMPORT_FUNC2(i, checkKeylet, "check_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, credentialKeylet, "credential_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, delegateKeylet, "delegate_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, depositPreauthKeylet, "deposit_preauth_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, didKeylet, "did_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, escrowKeylet, "escrow_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, lineKeylet, "line_keylet", hfs, 400); WASM_IMPORT_FUNC2(i, mptIssuanceKeylet, "mpt_issuance_keylet", hfs, 350); - WASM_IMPORT_FUNC2(i, mptokenKeylet, "mptoken_keylet", hfs, 350); + WASM_IMPORT_FUNC2(i, mptokenKeylet, "mptoken_keylet", hfs, 500); WASM_IMPORT_FUNC2(i, nftOfferKeylet, "nft_offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, offerKeylet, "offer_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, oracleKeylet, "oracle_keylet", hfs, 350); @@ -84,7 +84,7 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, vaultKeylet, "vault_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, getNFT, "get_nft", hfs, 1000); - WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 60); + WASM_IMPORT_FUNC2(i, getNFTIssuer, "get_nft_issuer", hfs, 70); WASM_IMPORT_FUNC2(i, getNFTTaxon, "get_nft_taxon", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTFlags, "get_nft_flags", hfs, 60); WASM_IMPORT_FUNC2(i, getNFTTransferFee, "get_nft_transfer_fee", hfs, 60); @@ -96,17 +96,17 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, traceFloat, "trace_opaque_float", hfs, 500); WASM_IMPORT_FUNC2(i, traceAmount, "trace_amount", hfs, 500); - WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 1000); - WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 1000); + WASM_IMPORT_FUNC2(i, floatFromInt, "float_from_int", hfs, 100); + WASM_IMPORT_FUNC2(i, floatFromUint, "float_from_uint", hfs, 130); + WASM_IMPORT_FUNC2(i, floatSet, "float_set", hfs, 100); + WASM_IMPORT_FUNC2(i, floatCompare, "float_compare", hfs, 80); + WASM_IMPORT_FUNC2(i, floatAdd, "float_add", hfs, 160); + WASM_IMPORT_FUNC2(i, floatSubtract, "float_subtract", hfs, 160); + WASM_IMPORT_FUNC2(i, floatMultiply, "float_multiply", hfs, 300); + WASM_IMPORT_FUNC2(i, floatDivide, "float_divide", hfs, 300); + WASM_IMPORT_FUNC2(i, floatRoot, "float_root", hfs, 5'500); + WASM_IMPORT_FUNC2(i, floatPower, "float_pow", hfs, 5'500); + WASM_IMPORT_FUNC2(i, floatLog, "float_log", hfs, 12'000); // clang-format on } From 7420f47658c84d4aa13231000c0b3ebc9201fe25 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 22 Sep 2025 18:22:44 -0400 Subject: [PATCH 079/212] SmartEscrow fee voting changes --- cfg/rippled-example.cfg | 33 +++++++ include/xrpl/protocol/Fees.h | 6 ++ include/xrpl/protocol/detail/features.macro | 1 + .../xrpl/protocol/detail/ledger_entries.macro | 5 ++ include/xrpl/protocol/detail/sfields.macro | 3 + .../xrpl/protocol/detail/transactions.macro | 4 + include/xrpl/protocol/jss.h | 9 +- src/libxrpl/protocol/STValidation.cpp | 4 + src/test/app/FeeVote_test.cpp | 51 ++++++++++- src/test/app/PseudoTx_test.cpp | 8 ++ src/test/rpc/Subscribe_test.cpp | 19 ++++- src/xrpld/app/ledger/Ledger.cpp | 49 +++++++++-- src/xrpld/app/misc/FeeVoteImpl.cpp | 85 +++++++++++++++++-- src/xrpld/app/misc/NetworkOPs.cpp | 55 ++++++++++-- src/xrpld/app/tx/detail/Change.cpp | 20 +++++ src/xrpld/core/Config.h | 9 ++ src/xrpld/core/detail/Config.cpp | 6 ++ 17 files changed, 340 insertions(+), 27 deletions(-) diff --git a/cfg/rippled-example.cfg b/cfg/rippled-example.cfg index 8bffc150c1b..04d1bfb4f7b 100644 --- a/cfg/rippled-example.cfg +++ b/cfg/rippled-example.cfg @@ -1249,6 +1249,39 @@ # Example: # owner_reserve = 2000000 # 2 XRP # +# extension_compute_limit = +# +# The extension compute limit is the maximum amount of gas that can be +# consumed by a single transaction. The gas limit is used to prevent +# transactions from consuming too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_compute_limit = 1000000 # 1 million gas +# +# extension_size_limit = +# +# The extension size limit is the maximum size of a WASM extension in +# bytes. The size limit is used to prevent extensions from consuming +# too many resources. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# extension_size_limit = 100000 # 100 kb +# +# gas_price = +# +# The gas price is the conversion between WASM gas and its price in drops. +# +# If this parameter is unspecified, rippled will use an internal +# default. Don't change this without understanding the consequences. +# +# Example: +# gas_price = 1000000 # 1 drop per gas #------------------------------------------------------------------------------- # # 9. Misc Settings diff --git a/include/xrpl/protocol/Fees.h b/include/xrpl/protocol/Fees.h index 4393f1a1d9c..1a1ecacb362 100644 --- a/include/xrpl/protocol/Fees.h +++ b/include/xrpl/protocol/Fees.h @@ -24,6 +24,8 @@ namespace ripple { +constexpr std::uint32_t MICRO_DROPS_PER_DROP{1'000'000}; + /** Reflects the fee settings for a particular ledger. The fees are always the same for any transactions applied @@ -34,6 +36,10 @@ struct Fees XRPAmount base{0}; // Reference tx cost (drops) XRPAmount reserve{0}; // Reserve base (drops) XRPAmount increment{0}; // Reserve increment (drops) + std::uint32_t extensionComputeLimit{ + 0}; // Extension compute limit (instructions) + std::uint32_t extensionSizeLimit{0}; // Extension size limit (bytes) + std::uint32_t gasPrice{0}; // price of WASM gas (micro-drops) explicit Fees() = default; Fees(Fees const&) = default; diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 9dc40dc8e57..c826c147f60 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -32,6 +32,7 @@ // If you add an amendment here, then do not forget to increment `numFeatures` // in include/xrpl/protocol/Feature.h. +XRPL_FEATURE(SmartEscrow, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (IncludeKeyletFields, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(DynamicMPT, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (TokenEscrowV1, Supported::yes, VoteBehavior::DefaultNo) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index f76188095ec..bc78786d02a 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -320,6 +320,11 @@ LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({ {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // Smart Escrow fields + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, + {sfPreviousTxnID, soeOPTIONAL}, {sfPreviousTxnLgrSeq, soeOPTIONAL}, })) diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 10fe015dacf..138276b5144 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -115,6 +115,9 @@ TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) TYPED_SFIELD(sfPermissionValue, UINT32, 52) TYPED_SFIELD(sfMutableFlags, UINT32, 53) +TYPED_SFIELD(sfExtensionComputeLimit, UINT32, 54) +TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 55) +TYPED_SFIELD(sfGasPrice, UINT32, 56) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 3ea4a3bbec3..f6e4f792b87 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -978,6 +978,10 @@ TRANSACTION(ttFEE, 101, SetFee, {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // Smart Escrow fields + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, })) /** This system-generated transaction type is used to update the network's negative UNL diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 8609aedaefb..7e62409da9d 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -272,6 +272,9 @@ JSS(expected_date_UTC); // out: any (warnings) JSS(expected_ledger_size); // out: TxQ JSS(expiration); // out: AccountOffers, AccountChannels, // ValidatorList, amm_info +JSS(extension_compute); // out: NetworkOps +JSS(extension_size); // out: NetworkOps +JSS(gas_price); // out: NetworkOps JSS(fail_hard); // in: Sign, Submit JSS(failed); // out: InboundLedger JSS(feature); // in: Feature @@ -722,11 +725,11 @@ JSS(write_load); // out: GetCounts #pragma push_macro("LEDGER_ENTRY_DUPLICATE") #undef LEDGER_ENTRY_DUPLICATE -#define LEDGER_ENTRY(tag, value, name, rpcName, ...) \ - JSS(name); \ +#define LEDGER_ENTRY(tag, value, name, rpcName, fields) \ + JSS(name); \ JSS(rpcName); -#define LEDGER_ENTRY_DUPLICATE(tag, value, name, rpcName, ...) JSS(rpcName); +#define LEDGER_ENTRY_DUPLICATE(tag, value, name, rpcName, fields) JSS(rpcName); #include diff --git a/src/libxrpl/protocol/STValidation.cpp b/src/libxrpl/protocol/STValidation.cpp index 51246a1830b..3a9d16445e4 100644 --- a/src/libxrpl/protocol/STValidation.cpp +++ b/src/libxrpl/protocol/STValidation.cpp @@ -78,6 +78,10 @@ STValidation::validationFormat() {sfBaseFeeDrops, soeOPTIONAL}, {sfReserveBaseDrops, soeOPTIONAL}, {sfReserveIncrementDrops, soeOPTIONAL}, + // featureSmartEscrow + {sfExtensionComputeLimit, soeOPTIONAL}, + {sfExtensionSizeLimit, soeOPTIONAL}, + {sfGasPrice, soeOPTIONAL}, }; // clang-format on diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index ba3d3792196..6960ce7fa9f 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -29,6 +29,7 @@ class FeeVote_test : public beast::unit_test::suite void testSetup() { + testcase("FeeVote setup"); FeeSetup const defaultSetup; { // defaults @@ -37,36 +38,62 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; config.append( {"reference_fee = 50", "account_reserve = 1234567", - "owner_reserve = 1234"}); + "owner_reserve = 1234", + "extension_compute_limit = 100", + "extension_size_limit = 200", + " gas_price = 300"}); auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == 50); BEAST_EXPECT(setup.account_reserve == 1234567); BEAST_EXPECT(setup.owner_reserve == 1234); + BEAST_EXPECT(setup.extension_compute_limit == 100); + BEAST_EXPECT(setup.extension_size_limit == 200); + BEAST_EXPECT(setup.gas_price == 300); } { Section config; config.append( {"reference_fee = blah", "account_reserve = yada", - "owner_reserve = foo"}); + "owner_reserve = foo", + "extension_compute_limit = bar", + "extension_size_limit = baz", + "gas_price = qux"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } { Section config; config.append( {"reference_fee = -50", "account_reserve = -1234567", - "owner_reserve = -1234"}); + "owner_reserve = -1234", + "extension_compute_limit = -100", + "extension_size_limit = -200", + "gas_price = -300"}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); @@ -74,6 +101,12 @@ class FeeVote_test : public beast::unit_test::suite setup.account_reserve == static_cast(-1234567)); BEAST_EXPECT( setup.owner_reserve == static_cast(-1234)); + BEAST_EXPECT( + setup.extension_compute_limit == + static_cast(-100)); + BEAST_EXPECT( + setup.extension_size_limit == static_cast(-200)); + BEAST_EXPECT(setup.gas_price == static_cast(-300)); } { auto const big64 = std::to_string( @@ -84,12 +117,22 @@ class FeeVote_test : public beast::unit_test::suite config.append( {"reference_fee = " + big64, "account_reserve = " + big64, - "owner_reserve = " + big64}); + "owner_reserve = " + big64, + "extension_compute_limit = " + big64, + "extension_size_limit = " + big64, + "gas_price = " + big64}); // Illegal values are ignored, and the defaults left unchanged auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == defaultSetup.account_reserve); BEAST_EXPECT(setup.owner_reserve == defaultSetup.owner_reserve); + BEAST_EXPECT( + setup.extension_compute_limit == + defaultSetup.extension_compute_limit); + BEAST_EXPECT( + setup.extension_size_limit == + defaultSetup.extension_size_limit); + BEAST_EXPECT(setup.gas_price == defaultSetup.gas_price); } } diff --git a/src/test/app/PseudoTx_test.cpp b/src/test/app/PseudoTx_test.cpp index 53adf795c25..4b7edc79d9a 100644 --- a/src/test/app/PseudoTx_test.cpp +++ b/src/test/app/PseudoTx_test.cpp @@ -50,6 +50,12 @@ struct PseudoTx_test : public beast::unit_test::suite obj[sfReserveIncrement] = 0; obj[sfReferenceFeeUnits] = 0; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = 0; + obj[sfExtensionSizeLimit] = 0; + obj[sfGasPrice] = 0; + } })); res.emplace_back(STTx(ttAMENDMENT, [&](auto& obj) { @@ -118,7 +124,9 @@ struct PseudoTx_test : public beast::unit_test::suite FeatureBitset const all{testable_amendments()}; FeatureBitset const xrpFees{featureXRPFees}; + testPrevented(all - featureXRPFees - featureSmartEscrow); testPrevented(all - featureXRPFees); + testPrevented(all - featureSmartEscrow); testPrevented(all); testAllowed(); } diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 9ed02fa532b..ad5f0ca33a0 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -532,6 +532,22 @@ class Subscribe_test : public beast::unit_test::suite if (jv.isMember(jss::reserve_inc) != isFlagLedger) return false; + if (env.closed()->rules().enabled(featureSmartEscrow)) + { + if (jv.isMember(jss::extension_compute) != isFlagLedger) + return false; + + if (jv.isMember(jss::extension_size) != isFlagLedger) + return false; + } + else + { + if (jv.isMember(jss::extension_compute)) + return false; + + if (jv.isMember(jss::extension_size)) + return false; + } return true; }; @@ -1596,7 +1612,8 @@ class Subscribe_test : public beast::unit_test::suite testTransactions_APIv1(); testTransactions_APIv2(); testManifests(); - testValidations(all - xrpFees); + testValidations(all - featureXRPFees - featureSmartEscrow); + testValidations(all - featureSmartEscrow); testValidations(all); testSubErrors(true); testSubErrors(false); diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index 6de4f2cbdef..f3a5c42566a 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -221,6 +221,15 @@ Ledger::Ledger( sle->at(sfReserveIncrement) = *f; sle->at(sfReferenceFeeUnits) = Config::FEE_UNITS_DEPRECATED; } + if (std::find( + amendments.begin(), amendments.end(), featureSmartEscrow) != + amendments.end()) + { + sle->at(sfExtensionComputeLimit) = + config.FEES.extension_compute_limit; + sle->at(sfExtensionSizeLimit) = config.FEES.extension_size_limit; + sle->at(sfGasPrice) = config.FEES.gas_price; + } rawInsert(sle); } @@ -612,6 +621,7 @@ Ledger::setup() { bool oldFees = false; bool newFees = false; + bool extensionFees = false; { auto const baseFee = sle->at(~sfBaseFee); auto const reserveBase = sle->at(~sfReserveBase); @@ -629,6 +639,7 @@ Ledger::setup() auto const reserveBaseXRP = sle->at(~sfReserveBaseDrops); auto const reserveIncrementXRP = sle->at(~sfReserveIncrementDrops); + auto assign = [&ret]( XRPAmount& dest, std::optional const& src) { @@ -645,12 +656,35 @@ Ledger::setup() assign(fees_.increment, reserveIncrementXRP); newFees = baseFeeXRP || reserveBaseXRP || reserveIncrementXRP; } + { + auto const extensionComputeLimit = + sle->at(~sfExtensionComputeLimit); + auto const extensionSizeLimit = sle->at(~sfExtensionSizeLimit); + auto const gasPrice = sle->at(~sfGasPrice); + + auto assign = [](std::uint32_t& dest, + std::optional const& src) { + if (src) + { + dest = src.value(); + } + }; + assign(fees_.extensionComputeLimit, extensionComputeLimit); + assign(fees_.extensionSizeLimit, extensionSizeLimit); + assign(fees_.gasPrice, gasPrice); + extensionFees = + extensionComputeLimit || extensionSizeLimit || gasPrice; + } if (oldFees && newFees) // Should be all of one or the other, but not both ret = false; if (!rules_.enabled(featureXRPFees) && newFees) // Can't populate the new fees before the amendment is enabled ret = false; + if (!rules_.enabled(featureSmartEscrow) && extensionFees) + // Can't populate the extension fees before the amendment is + // enabled + ret = false; } } catch (SHAMapMissingNode const&) @@ -669,15 +703,20 @@ Ledger::setup() void Ledger::defaultFees(Config const& config) { - XRPL_ASSERT( - fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0, - "ripple::Ledger::defaultFees : zero fees"); + assert( + fees_.base == 0 && fees_.reserve == 0 && fees_.increment == 0 && + fees_.extensionComputeLimit == 0 && fees_.extensionSizeLimit == 0 && + fees_.gasPrice == 0); if (fees_.base == 0) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) fees_.reserve = config.FEES.account_reserve; - if (fees_.increment == 0) - fees_.increment = config.FEES.owner_reserve; + if (fees_.extensionComputeLimit == 0) + fees_.extensionComputeLimit = config.FEES.extension_compute_limit; + if (fees_.extensionSizeLimit == 0) + fees_.extensionSizeLimit = config.FEES.extension_size_limit; + if (fees_.gasPrice == 0) + fees_.gasPrice = config.FEES.gas_price; } std::shared_ptr diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 85b5791d675..ba8b1d5d5cb 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -28,10 +28,10 @@ namespace ripple { namespace detail { +template class VotableValue { private: - using value_type = XRPAmount; value_type const current_; // The current setting value_type const target_; // The setting we want std::map voteMap_; @@ -66,8 +66,9 @@ class VotableValue getVotes() const; }; -auto -VotableValue::getVotes() const -> std::pair +template +std::pair +VotableValue::getVotes() const { value_type ourVote = current_; int weight = 0; @@ -190,6 +191,33 @@ FeeVoteImpl::doValidation( "reserve increment", sfReserveIncrement); } + if (rules.enabled(featureSmartEscrow)) + { + auto vote = [&v, this]( + auto const current, + std::uint32_t target, + char const* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) + << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; + vote( + lastFees.extensionComputeLimit, + target_.extension_compute_limit, + "extension compute limit", + sfExtensionComputeLimit); + vote( + lastFees.extensionSizeLimit, + target_.extension_size_limit, + "extension size limit", + sfExtensionSizeLimit); + vote(lastFees.gasPrice, target_.gas_price, "gas price", sfGasPrice); + } } void @@ -212,11 +240,22 @@ FeeVoteImpl::doVoting( detail::VotableValue incReserveVote( lastClosedLedger->fees().increment, target_.owner_reserve); + detail::VotableValue extensionComputeVote( + lastClosedLedger->fees().extensionComputeLimit, + target_.extension_compute_limit); + + detail::VotableValue extensionSizeVote( + lastClosedLedger->fees().extensionSizeLimit, + target_.extension_size_limit); + + detail::VotableValue gasPriceVote( + lastClosedLedger->fees().gasPrice, target_.gas_price); + auto const& rules = lastClosedLedger->rules(); if (rules.enabled(featureXRPFees)) { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, SF_AMOUNT const& xrpField) { if (auto const field = ~val->at(~xrpField); field && field->native()) @@ -245,7 +284,7 @@ FeeVoteImpl::doVoting( else { auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, + detail::VotableValue& value, auto const& valueField) { if (auto const field = val->at(~valueField)) { @@ -276,6 +315,30 @@ FeeVoteImpl::doVoting( doVote(val, incReserveVote, sfReserveIncrement); } } + if (rules.enabled(featureSmartEscrow)) + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + SF_UINT32 const& extensionField) { + if (auto const field = ~val->at(~extensionField); field) + { + value.addVote(field.value()); + } + else + { + value.noVote(); + } + }; + + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, extensionComputeVote, sfExtensionComputeLimit); + doVote(val, extensionSizeVote, sfExtensionSizeLimit); + doVote(val, gasPriceVote, sfGasPrice); + } + } // choose our positions // TODO: Use structured binding once LLVM 16 is the minimum supported @@ -284,11 +347,15 @@ FeeVoteImpl::doVoting( auto const baseFee = baseFeeVote.getVotes(); auto const baseReserve = baseReserveVote.getVotes(); auto const incReserve = incReserveVote.getVotes(); + auto const extensionCompute = extensionComputeVote.getVotes(); + auto const extensionSize = extensionSizeVote.getVotes(); + auto const gasPrice = gasPriceVote.getVotes(); auto const seq = lastClosedLedger->info().seq + 1; // add transactions to our position - if (baseFee.second || baseReserve.second || incReserve.second) + if (baseFee.second || baseReserve.second || incReserve.second || + extensionCompute.second || extensionSize.second || gasPrice.second) { JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" @@ -316,6 +383,12 @@ FeeVoteImpl::doVoting( incReserveVote.current()); obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = extensionCompute.first; + obj[sfExtensionSizeLimit] = extensionSize.first; + obj[sfGasPrice] = gasPrice.first; + } }); uint256 txID = feeTx.getTransactionID(); diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index b9069442f8c..2443da10d21 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -1452,11 +1452,6 @@ NetworkOPsImp::processTransactionSet(CanonicalTXSet const& set) for (auto& t : transactions) mTransactions.push_back(std::move(t)); } - if (mTransactions.empty()) - { - JLOG(m_journal.debug()) << "No transaction to process!"; - return; - } doTransactionSyncBatch(lock, [&](std::unique_lock const&) { XRPL_ASSERT( @@ -2482,6 +2477,18 @@ NetworkOPsImp::pubValidation(std::shared_ptr const& val) reserveIncXRP && reserveIncXRP->native()) jvObj[jss::reserve_inc] = reserveIncXRP->xrp().jsonClipped(); + if (auto const extensionComputeLimit = + ~val->at(~sfExtensionComputeLimit); + extensionComputeLimit) + jvObj[jss::extension_compute] = *extensionComputeLimit; + + if (auto const extensionSizeLimit = ~val->at(~sfExtensionSizeLimit); + extensionSizeLimit) + jvObj[jss::extension_size] = *extensionSizeLimit; + + if (auto const gasPrice = ~val->at(~sfGasPrice); gasPrice) + jvObj[jss::gas_price] = *gasPrice; + // NOTE Use MultiApiJson to publish two slightly different JSON objects // for consumers supporting different API versions MultiApiJson multiObj{jvObj}; @@ -2931,12 +2938,22 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::seq] = Json::UInt(lpClosed->info().seq); l[jss::hash] = to_string(lpClosed->info().hash); + bool const smartEscrowEnabled = + m_ledgerMaster.getValidatedLedger()->rules().enabled( + featureSmartEscrow); if (!human) { l[jss::base_fee] = baseFee.jsonClipped(); l[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; + } l[jss::close_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); } @@ -2946,6 +2963,13 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::reserve_base_xrp] = lpClosed->fees().accountReserve(0).decimalXRP(); l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP(); + if (smartEscrowEnabled) + { + l[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + l[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + l[jss::gas_price] = lpClosed->fees().gasPrice; + } if (auto const closeOffset = app_.timeKeeper().closeOffset(); std::abs(closeOffset.count()) >= 60) @@ -3138,6 +3162,14 @@ NetworkOPsImp::pubLedger(std::shared_ptr const& lpAccepted) lpAccepted->fees().accountReserve(0).jsonClipped(); jvObj[jss::reserve_inc] = lpAccepted->fees().increment.jsonClipped(); + if (lpAccepted->rules().enabled(featureSmartEscrow)) + { + jvObj[jss::extension_compute] = + lpAccepted->fees().extensionComputeLimit; + jvObj[jss::extension_size] = + lpAccepted->fees().extensionSizeLimit; + jvObj[jss::gas_price] = lpAccepted->fees().gasPrice; + } jvObj[jss::txn_count] = Json::UInt(alpAccepted->size()); @@ -3508,8 +3540,8 @@ NetworkOPsImp::pubAccountTransaction( } JLOG(m_journal.trace()) - << "pubAccountTransaction: " - << "proposed=" << iProposed << ", accepted=" << iAccepted; + << "pubAccountTransaction: " << "proposed=" << iProposed + << ", accepted=" << iAccepted; if (!notify.empty() || !accountHistoryNotify.empty()) { @@ -4183,13 +4215,20 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::ledger_hash] = to_string(lpClosed->info().hash); jvResult[jss::ledger_time] = Json::Value::UInt( lpClosed->info().closeTime.time_since_epoch().count()); + jvResult[jss::network_id] = app_.config().NETWORK_ID; if (!lpClosed->rules().enabled(featureXRPFees)) jvResult[jss::fee_ref] = Config::FEE_UNITS_DEPRECATED; jvResult[jss::fee_base] = lpClosed->fees().base.jsonClipped(); jvResult[jss::reserve_base] = lpClosed->fees().accountReserve(0).jsonClipped(); jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); - jvResult[jss::network_id] = app_.config().NETWORK_ID; + if (lpClosed->rules().enabled(featureSmartEscrow)) + { + jvResult[jss::extension_compute] = + lpClosed->fees().extensionComputeLimit; + jvResult[jss::extension_size] = lpClosed->fees().extensionSizeLimit; + jvResult[jss::gas_price] = lpClosed->fees().gasPrice; + } } if ((mMode >= OperatingMode::SYNCING) && !isNeedNetworkLedger()) diff --git a/src/xrpld/app/tx/detail/Change.cpp b/src/xrpld/app/tx/detail/Change.cpp index de30ed5f62d..7b1f649c56f 100644 --- a/src/xrpld/app/tx/detail/Change.cpp +++ b/src/xrpld/app/tx/detail/Change.cpp @@ -130,6 +130,20 @@ Change::preclaim(PreclaimContext const& ctx) ctx.tx.isFieldPresent(sfReserveIncrementDrops)) return temDISABLED; } + if (ctx.view.rules().enabled(featureSmartEscrow)) + { + if (!ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + !ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + !ctx.tx.isFieldPresent(sfGasPrice)) + return temMALFORMED; + } + else + { + if (ctx.tx.isFieldPresent(sfExtensionComputeLimit) || + ctx.tx.isFieldPresent(sfExtensionSizeLimit) || + ctx.tx.isFieldPresent(sfGasPrice)) + return temDISABLED; + } return tesSUCCESS; case ttAMENDMENT: case ttUNL_MODIFY: @@ -377,6 +391,12 @@ Change::applyFee() set(feeObject, ctx_.tx, sfReserveBase); set(feeObject, ctx_.tx, sfReserveIncrement); } + if (view().rules().enabled(featureSmartEscrow)) + { + set(feeObject, ctx_.tx, sfExtensionComputeLimit); + set(feeObject, ctx_.tx, sfExtensionSizeLimit); + set(feeObject, ctx_.tx, sfGasPrice); + } view().update(feeObject); diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index a58867958b1..7a4b087403b 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -73,6 +73,15 @@ struct FeeSetup /** The per-owned item reserve requirement in drops. */ XRPAmount owner_reserve{2 * DROPS_PER_XRP}; + /** The compute limit for Feature Extensions. */ + std::uint32_t extension_compute_limit{1'000'000}; + + /** The WASM size limit for Feature Extensions. */ + std::uint32_t extension_size_limit{100'000}; + + /** The price of 1 WASM gas, in micro-drops. */ + std::uint32_t gas_price{1'000'000}; + /* (Remember to update the example cfg files when changing any of these * values.) */ }; diff --git a/src/xrpld/core/detail/Config.cpp b/src/xrpld/core/detail/Config.cpp index 95147e23d5f..994865732e9 100644 --- a/src/xrpld/core/detail/Config.cpp +++ b/src/xrpld/core/detail/Config.cpp @@ -1141,6 +1141,12 @@ setup_FeeVote(Section const& section) setup.account_reserve = temp; if (set(temp, "owner_reserve", section)) setup.owner_reserve = temp; + if (set(temp, "extension_compute_limit", section)) + setup.extension_compute_limit = temp; + if (set(temp, "extension_size_limit", section)) + setup.extension_size_limit = temp; + if (set(temp, "gas_price", section)) + setup.gas_price = temp; } return setup; } From 737fab54714bc2e0fd9652f855941484901068e5 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 22 Sep 2025 23:55:57 -0400 Subject: [PATCH 080/212] fix issues --- src/test/app/NetworkOPs_test.cpp | 8 ++++---- src/xrpld/app/ledger/Ledger.cpp | 3 +++ src/xrpld/app/misc/NetworkOPs.cpp | 5 +++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/test/app/NetworkOPs_test.cpp b/src/test/app/NetworkOPs_test.cpp index edea55105b5..966827e3ebd 100644 --- a/src/test/app/NetworkOPs_test.cpp +++ b/src/test/app/NetworkOPs_test.cpp @@ -38,7 +38,7 @@ class NetworkOPs_test : public beast::unit_test::suite void testAllBadHeldTransactions() { - // All trasactions are already marked as SF_BAD, and we should be able + // All transactions are already marked as SF_BAD, and we should be able // to handle the case properly without an assertion failure testcase("No valid transactions in batch"); @@ -57,14 +57,14 @@ class NetworkOPs_test : public beast::unit_test::suite auto const jtx = env.jt(ticket::create(alice, 1), seq(1), fee(10)); - auto transacionId = jtx.stx->getTransactionID(); + auto transactionId = jtx.stx->getTransactionID(); env.app().getHashRouter().setFlags( - transacionId, HashRouterFlags::HELD); + transactionId, HashRouterFlags::HELD); env(jtx, json(jss::Sequence, 1), ter(terNO_ACCOUNT)); env.app().getHashRouter().setFlags( - transacionId, HashRouterFlags::BAD); + transactionId, HashRouterFlags::BAD); env.close(); } diff --git a/src/xrpld/app/ledger/Ledger.cpp b/src/xrpld/app/ledger/Ledger.cpp index f3a5c42566a..d27ac1deb5a 100644 --- a/src/xrpld/app/ledger/Ledger.cpp +++ b/src/xrpld/app/ledger/Ledger.cpp @@ -711,6 +711,9 @@ Ledger::defaultFees(Config const& config) fees_.base = config.FEES.reference_fee; if (fees_.reserve == 0) fees_.reserve = config.FEES.account_reserve; + if (fees_.increment == 0) + fees_.increment = config.FEES.owner_reserve; + if (fees_.extensionComputeLimit == 0) fees_.extensionComputeLimit = config.FEES.extension_compute_limit; if (fees_.extensionSizeLimit == 0) diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 2443da10d21..988ba287d25 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -1452,6 +1452,11 @@ NetworkOPsImp::processTransactionSet(CanonicalTXSet const& set) for (auto& t : transactions) mTransactions.push_back(std::move(t)); } + if (mTransactions.empty()) + { + JLOG(m_journal.debug()) << "No transaction to process!"; + return; + } doTransactionSyncBatch(lock, [&](std::unique_lock const&) { XRPL_ASSERT( From d24cd50e6111f1fd0c21575c78bd908be0f34c94 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 23 Sep 2025 16:39:21 -0400 Subject: [PATCH 081/212] Switch to own wamr fork (#5808) --- external/wamr/conandata.yml | 6 - external/wamr/conanfile.py | 16 +- external/wamr/patches/ripp_metering.patch | 901 ---------------------- 3 files changed, 6 insertions(+), 917 deletions(-) delete mode 100644 external/wamr/conandata.yml delete mode 100644 external/wamr/patches/ripp_metering.patch diff --git a/external/wamr/conandata.yml b/external/wamr/conandata.yml deleted file mode 100644 index d475ad987c0..00000000000 --- a/external/wamr/conandata.yml +++ /dev/null @@ -1,6 +0,0 @@ -patches: - 2.4.1: - - patch_description: add metering to iwasm interpreter - patch_file: patches/ripp_metering.patch - patch_type: conan - diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py index 429c509795f..7057ef98084 100644 --- a/external/wamr/conanfile.py +++ b/external/wamr/conanfile.py @@ -1,10 +1,6 @@ from conan import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import ( - apply_conandata_patches, - export_conandata_patches, - # get, -) +#from conan.tools.files import (apply_conandata_patches, export_conandata_patches,) from conan.tools.scm import Git # import os @@ -16,7 +12,7 @@ class WamrConan(ConanFile): name = "wamr" version = "2.4.1" license = "Apache License v2.0" - url = "https://github.com/bytecodealliance/wasm-micro-runtime.git" + url = "https://github.com/ripple/wasm-micro-runtime.git" description = "Webassembly micro runtime" package_type = "library" settings = "os", "compiler", "build_type", "arch" @@ -25,7 +21,7 @@ class WamrConan(ConanFile): # requires = [("llvm/20.1.1@")] def export_sources(self): - export_conandata_patches(self) + #export_conandata_patches(self) pass # def build_requirements(self): @@ -41,8 +37,8 @@ def layout(self): def source(self): git = Git(self) git.fetch_commit( - url="https://github.com/bytecodealliance/wasm-micro-runtime.git", - commit="b124f70345d712bead5c0c2393acb2dc583511de", + url="https://github.com/ripple/wasm-micro-runtime.git", + commit="a87e56fe8042bbe3ed99a514333ddef42e6c2a41", ) # get(self, **self.conan_data["sources"][self.version], strip_root=True) @@ -71,7 +67,7 @@ def generate(self): deps.generate() def build(self): - apply_conandata_patches(self) + #apply_conandata_patches(self) cmake = CMake(self) cmake.verbose = True cmake.configure() diff --git a/external/wamr/patches/ripp_metering.patch b/external/wamr/patches/ripp_metering.patch deleted file mode 100644 index 2e8ec70d7a8..00000000000 --- a/external/wamr/patches/ripp_metering.patch +++ /dev/null @@ -1,901 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 4b28fa89..7d523a3d 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -1,7 +1,7 @@ - # Copyright (C) 2019 Intel Corporation. All rights reserved. - # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - --cmake_minimum_required (VERSION 3.14) -+cmake_minimum_required (VERSION 3.20) - - option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) - -@@ -170,7 +170,7 @@ if (MINGW) - endif () - - if (WIN32) -- target_link_libraries(vmlib PRIVATE ntdll) -+ target_link_libraries(vmlib PUBLIC ntdll) - endif() - - set (WAMR_PUBLIC_HEADERS -diff --git a/core/iwasm/aot/aot_runtime.c b/core/iwasm/aot/aot_runtime.c -index d2621fb2..6c96a844 100644 ---- a/core/iwasm/aot/aot_runtime.c -+++ b/core/iwasm/aot/aot_runtime.c -@@ -5611,7 +5611,7 @@ aot_resolve_import_func(AOTModule *module, AOTImportFunc *import_func) - import_func->func_ptr_linked = wasm_native_resolve_symbol( - import_func->module_name, import_func->func_name, - import_func->func_type, &import_func->signature, -- &import_func->attachment, &import_func->call_conv_raw); -+ &import_func->attachment, NULL, &import_func->call_conv_raw); - #if WASM_ENABLE_MULTI_MODULE != 0 - if (!import_func->func_ptr_linked) { - if (!wasm_runtime_is_built_in_module(import_func->module_name)) { -diff --git a/core/iwasm/common/wasm_c_api.c b/core/iwasm/common/wasm_c_api.c -index 269ec577..34eb7c34 100644 ---- a/core/iwasm/common/wasm_c_api.c -+++ b/core/iwasm/common/wasm_c_api.c -@@ -3242,10 +3242,20 @@ wasm_func_copy(const wasm_func_t *func) - - cloned->func_idx_rt = func->func_idx_rt; - cloned->inst_comm_rt = func->inst_comm_rt; -+ cloned->gas = func->gas; - - RETURN_OBJ(cloned, wasm_func_delete) - } - -+uint32_t -+wasm_func_set_gas(wasm_func_t *func, uint32_t gas) -+{ -+ if(!func) return 0; -+ -+ func->gas = gas; -+ return gas; -+} -+ - own wasm_functype_t * - wasm_func_type(const wasm_func_t *func) - { -@@ -4998,11 +5008,11 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, - goto failed; - } - -+ WASMModuleInstance *wasm_module_inst = NULL; - /* create the c-api func import list */ - #if WASM_ENABLE_INTERP != 0 - if (instance->inst_comm_rt->module_type == Wasm_Module_Bytecode) { -- WASMModuleInstance *wasm_module_inst = -- (WASMModuleInstance *)instance->inst_comm_rt; -+ wasm_module_inst = (WASMModuleInstance *)instance->inst_comm_rt; - p_func_imports = &(wasm_module_inst->c_api_func_imports); - import_func_count = MODULE_INTERP(module)->import_function_count; - } -@@ -5052,6 +5062,13 @@ wasm_instance_new_with_args_ex(wasm_store_t *store, const wasm_module_t *module, - } - bh_assert(func_import->func_ptr_linked); - -+ // fill gas -+ if(wasm_module_inst) { -+ WASMFunctionInstance *fi = wasm_module_inst->e->functions + func_host->func_idx_rt; -+ if(fi) fi->gas = func_host->gas; -+ } -+ -+ - func_import++; - } - -@@ -5389,3 +5406,8 @@ wasm_instance_get_wasm_func_exec_time(const wasm_instance_t *instance, - return -1.0; - #endif - } -+ -+wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t *instance) -+{ -+ return wasm_runtime_get_exec_env_singleton(instance->inst_comm_rt); -+} -diff --git a/core/iwasm/common/wasm_c_api_internal.h b/core/iwasm/common/wasm_c_api_internal.h -index 49a17a96..19a85980 100644 ---- a/core/iwasm/common/wasm_c_api_internal.h -+++ b/core/iwasm/common/wasm_c_api_internal.h -@@ -142,6 +142,10 @@ struct wasm_func_t { - void (*finalizer)(void *); - } cb_env; - } u; -+ -+ // gas cost for import func -+ uint32 gas; -+ - /* - * an index in both functions runtime instance lists - * of interpreter mode and aot mode -diff --git a/core/iwasm/common/wasm_exec_env.c b/core/iwasm/common/wasm_exec_env.c -index 47752950..5f26d886 100644 ---- a/core/iwasm/common/wasm_exec_env.c -+++ b/core/iwasm/common/wasm_exec_env.c -@@ -86,7 +86,7 @@ wasm_exec_env_create_internal(struct WASMModuleInstanceCommon *module_inst, - #endif - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 -- exec_env->instructions_to_execute = -1; -+ exec_env->instructions_to_execute = INT64_MAX; - #endif - - return exec_env; -diff --git a/core/iwasm/common/wasm_exec_env.h b/core/iwasm/common/wasm_exec_env.h -index 5d80312f..b2ecce2e 100644 ---- a/core/iwasm/common/wasm_exec_env.h -+++ b/core/iwasm/common/wasm_exec_env.h -@@ -89,7 +89,7 @@ typedef struct WASMExecEnv { - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 - /* instructions to execute */ -- int instructions_to_execute; -+ int64 instructions_to_execute; - #endif - - #if WASM_ENABLE_FAST_JIT != 0 -diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c -index 060bb2c3..9221c36a 100644 ---- a/core/iwasm/common/wasm_native.c -+++ b/core/iwasm/common/wasm_native.c -@@ -180,9 +180,9 @@ native_symbol_cmp(const void *native_symbol1, const void *native_symbol2) - ((const NativeSymbol *)native_symbol2)->symbol); - } - --static void * -+static NativeSymbol * - lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, -- const char *symbol, const char **p_signature, void **p_attachment) -+ const char *symbol) - { - NativeSymbol *native_symbol, key = { 0 }; - -@@ -190,9 +190,7 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, - - if ((native_symbol = bsearch(&key, native_symbols, n_native_symbols, - sizeof(NativeSymbol), native_symbol_cmp))) { -- *p_signature = native_symbol->signature; -- *p_attachment = native_symbol->attachment; -- return native_symbol->func_ptr; -+ return native_symbol; - } - - return NULL; -@@ -205,25 +203,36 @@ lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, - void * - wasm_native_resolve_symbol(const char *module_name, const char *field_name, - const WASMFuncType *func_type, -- const char **p_signature, void **p_attachment, -+ const char **p_signature, void **p_attachment, uint32_t *gas, - bool *p_call_conv_raw) - { - NativeSymbolsNode *node, *node_next; - const char *signature = NULL; - void *func_ptr = NULL, *attachment = NULL; -+ NativeSymbol *native_symbol = NULL; - - node = g_native_symbols_list; - while (node) { - node_next = node->next; - if (!strcmp(node->module_name, module_name)) { -- if ((func_ptr = -+ if ((native_symbol = - lookup_symbol(node->native_symbols, node->n_native_symbols, -- field_name, &signature, &attachment)) -+ field_name)) - || (field_name[0] == '_' -- && (func_ptr = lookup_symbol( -+ && (native_symbol = lookup_symbol( - node->native_symbols, node->n_native_symbols, -- field_name + 1, &signature, &attachment)))) -- break; -+ field_name + 1)))) -+ { -+ func_ptr = native_symbol->func_ptr; -+ if(func_ptr) -+ { -+ if(gas) -+ *gas = native_symbol->gas; -+ signature = native_symbol->signature; -+ attachment = native_symbol->attachment; -+ break; -+ } -+ } - } - node = node_next; - } -diff --git a/core/iwasm/common/wasm_native.h b/core/iwasm/common/wasm_native.h -index 9a6afee1..0fe4739f 100644 ---- a/core/iwasm/common/wasm_native.h -+++ b/core/iwasm/common/wasm_native.h -@@ -52,7 +52,7 @@ wasm_native_lookup_libc_builtin_global(const char *module_name, - void * - wasm_native_resolve_symbol(const char *module_name, const char *field_name, - const WASMFuncType *func_type, -- const char **p_signature, void **p_attachment, -+ const char **p_signature, void **p_attachment, uint32_t *gas, - bool *p_call_conv_raw); - - bool -diff --git a/core/iwasm/common/wasm_runtime_common.c b/core/iwasm/common/wasm_runtime_common.c -index 943b46fc..d026777e 100644 ---- a/core/iwasm/common/wasm_runtime_common.c -+++ b/core/iwasm/common/wasm_runtime_common.c -@@ -2344,10 +2344,18 @@ wasm_runtime_access_exce_check_guard_page() - #if WASM_ENABLE_INSTRUCTION_METERING != 0 - void - wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, -- int instructions_to_execute) -+ int64 instructions_to_execute) - { -+ if(instructions_to_execute == -1) -+ instructions_to_execute = INT64_MAX; - exec_env->instructions_to_execute = instructions_to_execute; - } -+ -+int64 -+wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env) -+{ -+ return exec_env->instructions_to_execute; -+} - #endif - - WASMFuncType * -@@ -7412,7 +7420,7 @@ wasm_runtime_is_import_func_linked(const char *module_name, - const char *func_name) - { - return wasm_native_resolve_symbol(module_name, func_name, NULL, NULL, NULL, -- NULL); -+ NULL, NULL); - } - - bool -@@ -7869,13 +7877,14 @@ wasm_runtime_get_module_name(wasm_module_t module) - bool - wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) - { -+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 - uint8 *boundary = exec_env->native_stack_boundary; - RECORD_STACK_USAGE(exec_env, (uint8 *)&boundary); - if (boundary == NULL) { - /* the platform doesn't support os_thread_get_stack_boundary */ - return true; - } --#if defined(OS_ENABLE_HW_BOUND_CHECK) && WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 -+#if defined(OS_ENABLE_HW_BOUND_CHECK) - uint32 page_size = os_getpagesize(); - uint32 guard_page_count = STACK_OVERFLOW_CHECK_GUARD_PAGE_COUNT; - boundary = boundary + page_size * guard_page_count; -@@ -7885,6 +7894,7 @@ wasm_runtime_detect_native_stack_overflow(WASMExecEnv *exec_env) - "native stack overflow"); - return false; - } -+#endif - return true; - } - -@@ -7907,7 +7917,7 @@ wasm_runtime_detect_native_stack_overflow_size(WASMExecEnv *exec_env, - boundary = boundary - WASM_STACK_GUARD_SIZE + requested_size; - if ((uint8 *)&boundary < boundary) { - wasm_runtime_set_exception(wasm_runtime_get_module_inst(exec_env), -- "native stack overflow"); -+ "native s stack overflow"); - return false; - } - return true; -diff --git a/core/iwasm/common/wasm_runtime_common.h b/core/iwasm/common/wasm_runtime_common.h -index 324620be..54155a0c 100644 ---- a/core/iwasm/common/wasm_runtime_common.h -+++ b/core/iwasm/common/wasm_runtime_common.h -@@ -833,7 +833,10 @@ wasm_runtime_set_native_stack_boundary(WASMExecEnv *exec_env, - /* See wasm_export.h for description */ - WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_instruction_count_limit(WASMExecEnv *exec_env, -- int instructions_to_execute); -+ int64 instructions_to_execute); -+WASM_RUNTIME_API_EXTERN int64 -+wasm_runtime_get_instruction_count_limit(WASMExecEnv *exec_env); -+ - #endif - - #if WASM_CONFIGURABLE_BOUNDS_CHECKS != 0 -diff --git a/core/iwasm/include/lib_export.h b/core/iwasm/include/lib_export.h -index 0ca668f5..93bcf807 100644 ---- a/core/iwasm/include/lib_export.h -+++ b/core/iwasm/include/lib_export.h -@@ -24,6 +24,8 @@ typedef struct NativeSymbol { - /* attachment which can be retrieved in native API by - calling wasm_runtime_get_function_attachment(exec_env) */ - void *attachment; -+ // gas cost for import func -+ uint32_t gas; - } NativeSymbol; - - /* clang-format off */ -diff --git a/core/iwasm/include/wasm_c_api.h b/core/iwasm/include/wasm_c_api.h -index 241a0eec..1141744c 100644 ---- a/core/iwasm/include/wasm_c_api.h -+++ b/core/iwasm/include/wasm_c_api.h -@@ -19,8 +19,10 @@ - #if defined(_MSC_BUILD) - #if defined(COMPILING_WASM_RUNTIME_API) - #define WASM_API_EXTERN __declspec(dllexport) --#else -+#elif defined(_DLL) - #define WASM_API_EXTERN __declspec(dllimport) -+#else -+#define WASM_API_EXTERN - #endif - #else - #define WASM_API_EXTERN -@@ -592,6 +594,8 @@ WASM_API_EXTERN size_t wasm_func_result_arity(const wasm_func_t*); - WASM_API_EXTERN own wasm_trap_t* wasm_func_call( - const wasm_func_t*, const wasm_val_vec_t* args, wasm_val_vec_t* results); - -+WASM_API_EXTERN own uint32_t wasm_func_set_gas(wasm_func_t*, uint32_t); -+ - - // Global Instances - -@@ -701,6 +705,11 @@ WASM_API_EXTERN double wasm_instance_sum_wasm_exec_time(const wasm_instance_t*); - // func_name. If the function is not found, return 0. - WASM_API_EXTERN double wasm_instance_get_wasm_func_exec_time(const wasm_instance_t*, const char *); - -+struct WASMExecEnv; -+typedef struct WASMExecEnv *wasm_exec_env_t; -+ -+WASM_API_EXTERN wasm_exec_env_t wasm_instance_exec_env(const wasm_instance_t*); -+ - /////////////////////////////////////////////////////////////////////////////// - // Convenience - -diff --git a/core/iwasm/include/wasm_export.h b/core/iwasm/include/wasm_export.h -index 81efb8f6..f752a970 100644 ---- a/core/iwasm/include/wasm_export.h -+++ b/core/iwasm/include/wasm_export.h -@@ -20,8 +20,10 @@ - #if defined(_MSC_BUILD) - #if defined(COMPILING_WASM_RUNTIME_API) - #define WASM_RUNTIME_API_EXTERN __declspec(dllexport) --#else -+#elif defined(_DLL) - #define WASM_RUNTIME_API_EXTERN __declspec(dllimport) -+#else -+#define WASM_RUNTIME_API_EXTERN - #endif - #elif defined(__GNUC__) || defined(__clang__) - #define WASM_RUNTIME_API_EXTERN __attribute__((visibility("default"))) -@@ -1874,7 +1876,14 @@ wasm_runtime_set_native_stack_boundary(wasm_exec_env_t exec_env, - */ - WASM_RUNTIME_API_EXTERN void - wasm_runtime_set_instruction_count_limit(wasm_exec_env_t exec_env, -- int instruction_count); -+ int64_t instruction_count); -+ -+WASM_RUNTIME_API_EXTERN int64_t -+wasm_runtime_get_instruction_count_limit(wasm_exec_env_t exec_env); -+ -+WASM_RUNTIME_API_EXTERN void -+wasm_runtime_set_instruction_schedule(wasm_exec_env_t exec_env, -+ int64_t const *instructions_schedule); - - /** - * Dump runtime memory consumption, including: -diff --git a/core/iwasm/interpreter/wasm.h b/core/iwasm/interpreter/wasm.h -index 0dd73958..b7cad5f2 100644 ---- a/core/iwasm/interpreter/wasm.h -+++ b/core/iwasm/interpreter/wasm.h -@@ -617,6 +617,9 @@ typedef struct WASMFunctionImport { - WASMModule *import_module; - WASMFunction *import_func_linked; - #endif -+ // gas cost for import func -+ uint32 gas; -+ - } WASMFunctionImport; - - #if WASM_ENABLE_TAGS != 0 -diff --git a/core/iwasm/interpreter/wasm_interp_classic.c b/core/iwasm/interpreter/wasm_interp_classic.c -index edc473f2..55071613 100644 ---- a/core/iwasm/interpreter/wasm_interp_classic.c -+++ b/core/iwasm/interpreter/wasm_interp_classic.c -@@ -1547,13 +1547,14 @@ get_global_addr(uint8 *global_data, WASMGlobalInstance *global) - } - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 --#define CHECK_INSTRUCTION_LIMIT() \ -- if (instructions_left == 0) { \ -- wasm_set_exception(module, "instruction limit exceeded"); \ -- goto got_exception; \ -- } \ -- else if (instructions_left > 0) \ -- instructions_left--; -+#define CHECK_INSTRUCTION_LIMIT() \ -+ do { \ -+ --instructions_left; \ -+ if (instructions_left < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ } while (0) - #else - #define CHECK_INSTRUCTION_LIMIT() (void)0 - #endif -@@ -1603,10 +1604,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint32 cache_index, type_index, param_cell_num, cell_num; - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 -- int instructions_left = -1; -- if (exec_env) { -+ int64 instructions_left = INT64_MAX; -+ if (exec_env) - instructions_left = exec_env->instructions_to_execute; -- } - #endif - - #if WASM_ENABLE_EXCE_HANDLING != 0 -@@ -6849,6 +6849,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - FREE_FRAME(exec_env, frame); - wasm_exec_env_set_cur_frame(exec_env, prev_frame); - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) -+ exec_env->instructions_to_execute = instructions_left; -+#endif -+ - if (!prev_frame->ip) { - /* Called from native. */ - return; -@@ -6889,6 +6894,12 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - } - #endif - SYNC_ALL_TO_FRAME(); -+ -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if(exec_env) -+ exec_env->instructions_to_execute = instructions_left; -+#endif -+ - return; - - #if WASM_ENABLE_LABELS_AS_VALUES == 0 -diff --git a/core/iwasm/interpreter/wasm_interp_fast.c b/core/iwasm/interpreter/wasm_interp_fast.c -index 36d4538f..4d03603e 100644 ---- a/core/iwasm/interpreter/wasm_interp_fast.c -+++ b/core/iwasm/interpreter/wasm_interp_fast.c -@@ -90,14 +90,14 @@ typedef float64 CellType_F64; - } while (0) - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 --#define CHECK_INSTRUCTION_LIMIT() \ -- if (instructions_left == 0) { \ -- wasm_set_exception(module, "instruction limit exceeded"); \ -- goto got_exception; \ -- } \ -- else if (instructions_left > 0) \ -- instructions_left--; -- -+#define CHECK_INSTRUCTION_LIMIT() \ -+ do { \ -+ --instructions_left; \ -+ if (instructions_left < 0) { \ -+ wasm_set_exception(module, "instruction limit exceeded"); \ -+ goto got_exception; \ -+ } \ -+ } while (0) - #else - #define CHECK_INSTRUCTION_LIMIT() (void)0 - #endif -@@ -1438,7 +1438,6 @@ wasm_interp_dump_op_count() - do { \ - const void *p_label_addr = *(void **)frame_ip; \ - frame_ip += sizeof(void *); \ -- CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1450,7 +1449,6 @@ wasm_interp_dump_op_count() - /* int32 relative offset was emitted in 64-bit target */ \ - p_label_addr = label_base + (int32)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -- CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #else -@@ -1461,17 +1459,18 @@ wasm_interp_dump_op_count() - /* uint32 label address was emitted in 32-bit target */ \ - p_label_addr = (void *)(uintptr_t)LOAD_U32_WITH_2U16S(frame_ip); \ - frame_ip += sizeof(int32); \ -- CHECK_INSTRUCTION_LIMIT(); \ - goto *p_label_addr; \ - } while (0) - #endif - #endif /* end of WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS */ --#define HANDLE_OP_END() FETCH_OPCODE_AND_DISPATCH() -+#define HANDLE_OP_END() CHECK_INSTRUCTION_LIMIT(); FETCH_OPCODE_AND_DISPATCH() - - #else /* else of WASM_ENABLE_LABELS_AS_VALUES */ - - #define HANDLE_OP(opcode) case opcode: --#define HANDLE_OP_END() continue -+#define HANDLE_OP_END() \ -+ CHECK_INSTRUCTION_LIMIT(); \ -+ continue - - #endif /* end of WASM_ENABLE_LABELS_AS_VALUES */ - -@@ -1540,10 +1539,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - uint8 opcode = 0, local_type, *global_addr; - - #if WASM_ENABLE_INSTRUCTION_METERING != 0 -- int instructions_left = -1; -- if (exec_env) { -+ int64 instructions_left = INT64_MAX; -+ if (exec_env) - instructions_left = exec_env->instructions_to_execute; -- } - #endif - #if !defined(OS_ENABLE_HW_BOUND_CHECK) \ - || WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS == 0 -@@ -4012,7 +4010,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - } - - /* constant instructions */ -+#ifdef ENABLE_FLOAT_POINT - HANDLE_OP(WASM_OP_F64_CONST) -+#else -+ HANDLE_OP(WASM_OP_F64_CONST) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+#endif - HANDLE_OP(WASM_OP_I64_CONST) - { - uint8 *orig_ip = frame_ip; -@@ -4025,7 +4031,15 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#ifdef ENABLE_FLOAT_POINT -+ HANDLE_OP(WASM_OP_F32_CONST) -+#else - HANDLE_OP(WASM_OP_F32_CONST) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+#endif - HANDLE_OP(WASM_OP_I32_CONST) - { - uint8 *orig_ip = frame_ip; -@@ -4172,6 +4186,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#ifdef ENABLE_FLOAT_POINT -+ - /* comparison instructions of f32 */ - HANDLE_OP(WASM_OP_F32_EQ) - { -@@ -4245,6 +4261,24 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - DEF_OP_CMP(float64, F64, >=); - HANDLE_OP_END(); - } -+#else -+ HANDLE_OP(WASM_OP_F32_EQ) -+ HANDLE_OP(WASM_OP_F32_NE) -+ HANDLE_OP(WASM_OP_F32_LT) -+ HANDLE_OP(WASM_OP_F32_GT) -+ HANDLE_OP(WASM_OP_F32_LE) -+ HANDLE_OP(WASM_OP_F32_GE) -+ HANDLE_OP(WASM_OP_F64_EQ) -+ HANDLE_OP(WASM_OP_F64_NE) -+ HANDLE_OP(WASM_OP_F64_LT) -+ HANDLE_OP(WASM_OP_F64_GT) -+ HANDLE_OP(WASM_OP_F64_LE) -+ HANDLE_OP(WASM_OP_F64_GE) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+#endif - - /* numeric instructions of i32 */ - HANDLE_OP(WASM_OP_I32_CLZ) -@@ -4573,6 +4607,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#ifdef ENABLE_FLOAT_POINT -+ - /* numeric instructions of f32 */ - HANDLE_OP(WASM_OP_F32_ABS) - { -@@ -4784,6 +4820,43 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#else -+ -+ HANDLE_OP(WASM_OP_F32_ABS) -+ HANDLE_OP(WASM_OP_F32_NEG) -+ HANDLE_OP(WASM_OP_F32_CEIL) -+ HANDLE_OP(WASM_OP_F32_FLOOR) -+ HANDLE_OP(WASM_OP_F32_TRUNC) -+ HANDLE_OP(WASM_OP_F32_NEAREST) -+ HANDLE_OP(WASM_OP_F32_SQRT) -+ HANDLE_OP(WASM_OP_F32_ADD) -+ HANDLE_OP(WASM_OP_F32_SUB) -+ HANDLE_OP(WASM_OP_F32_MUL) -+ HANDLE_OP(WASM_OP_F32_DIV) -+ HANDLE_OP(WASM_OP_F32_MIN) -+ HANDLE_OP(WASM_OP_F32_MAX) -+ HANDLE_OP(WASM_OP_F32_COPYSIGN) -+ HANDLE_OP(WASM_OP_F64_ABS) -+ HANDLE_OP(WASM_OP_F64_NEG) -+ HANDLE_OP(WASM_OP_F64_CEIL) -+ HANDLE_OP(WASM_OP_F64_FLOOR) -+ HANDLE_OP(WASM_OP_F64_TRUNC) -+ HANDLE_OP(WASM_OP_F64_NEAREST) -+ HANDLE_OP(WASM_OP_F64_SQRT) -+ HANDLE_OP(WASM_OP_F64_ADD) -+ HANDLE_OP(WASM_OP_F64_SUB) -+ HANDLE_OP(WASM_OP_F64_MUL) -+ HANDLE_OP(WASM_OP_F64_DIV) -+ HANDLE_OP(WASM_OP_F64_MIN) -+ HANDLE_OP(WASM_OP_F64_MAX) -+ HANDLE_OP(WASM_OP_F64_COPYSIGN) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+ -+#endif //ENABLE_FLOAT_POINT -+ - /* conversions of i32 */ - HANDLE_OP(WASM_OP_I32_WRAP_I64) - { -@@ -4792,6 +4865,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+ -+#ifdef ENABLE_FLOAT_POINT - HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) - { - /* We don't use INT32_MIN/INT32_MAX/UINT32_MIN/UINT32_MAX, -@@ -4821,6 +4896,19 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#else -+ -+ HANDLE_OP(WASM_OP_I32_TRUNC_S_F32) -+ HANDLE_OP(WASM_OP_I32_TRUNC_U_F32) -+ HANDLE_OP(WASM_OP_I32_TRUNC_S_F64) -+ HANDLE_OP(WASM_OP_I32_TRUNC_U_F64) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+ -+#endif //ENABLE_FLOAT_POINT -+ - /* conversions of i64 */ - HANDLE_OP(WASM_OP_I64_EXTEND_S_I32) - { -@@ -4834,6 +4922,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#ifdef ENABLE_FLOAT_POINT -+ - HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) - { - DEF_OP_TRUNC_F32(-9223373136366403584.0f, -@@ -4937,6 +5027,32 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - HANDLE_OP_END(); - } - -+#else -+ HANDLE_OP(WASM_OP_I64_TRUNC_S_F32) -+ HANDLE_OP(WASM_OP_I64_TRUNC_U_F32) -+ HANDLE_OP(WASM_OP_I64_TRUNC_S_F64) -+ HANDLE_OP(WASM_OP_I64_TRUNC_U_F64) -+ HANDLE_OP(WASM_OP_F32_CONVERT_S_I32) -+ HANDLE_OP(WASM_OP_F32_CONVERT_U_I32) -+ HANDLE_OP(WASM_OP_F32_CONVERT_S_I64) -+ HANDLE_OP(WASM_OP_F32_CONVERT_U_I64) -+ HANDLE_OP(WASM_OP_F32_DEMOTE_F64) -+ HANDLE_OP(WASM_OP_F64_CONVERT_S_I32) -+ HANDLE_OP(WASM_OP_F64_CONVERT_U_I32) -+ HANDLE_OP(WASM_OP_F64_CONVERT_S_I64) -+ HANDLE_OP(WASM_OP_F64_CONVERT_U_I64) -+ HANDLE_OP(WASM_OP_F64_PROMOTE_F32) -+ HANDLE_OP(WASM_OP_I32_REINTERPRET_F32) -+ HANDLE_OP(WASM_OP_F32_REINTERPRET_I32) -+ HANDLE_OP(WASM_OP_I64_REINTERPRET_F64) -+ HANDLE_OP(WASM_OP_F64_REINTERPRET_I64) -+ { -+ wasm_set_exception(module, "opcode disabled"); -+ goto got_exception; -+ } -+ -+#endif //ENABLE_FLOAT_POINT -+ - HANDLE_OP(EXT_OP_COPY_STACK_TOP) - { - addr1 = GET_OFFSET(); -@@ -5108,6 +5224,8 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - { - GET_OPCODE(); - switch (opcode) { -+ -+#ifdef ENABLE_FLOAT_POINT - case WASM_OP_I32_TRUNC_SAT_S_F32: - DEF_OP_TRUNC_SAT_F32(-2147483904.0f, 2147483648.0f, - true, true); -@@ -5140,6 +5258,9 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - DEF_OP_TRUNC_SAT_F64(-1.0, 18446744073709551616.0, - false, false); - break; -+ -+#endif -+ - #if WASM_ENABLE_BULK_MEMORY != 0 - case WASM_OP_MEMORY_INIT: - { -@@ -7672,6 +7793,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - { - wasm_interp_call_func_native(module, exec_env, cur_func, - prev_frame); -+ instructions_left -= cur_func->gas; - } - - #if WASM_ENABLE_TAIL_CALL != 0 || WASM_ENABLE_GC != 0 -@@ -7784,6 +7906,11 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - FREE_FRAME(exec_env, frame); - wasm_exec_env_set_cur_frame(exec_env, (WASMRuntimeFrame *)prev_frame); - -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if (exec_env) -+ exec_env->instructions_to_execute = instructions_left; -+#endif -+ - if (!prev_frame->ip) - /* Called from native. */ - return; -@@ -7812,6 +7939,10 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module, - - got_exception: - SYNC_ALL_TO_FRAME(); -+#if WASM_ENABLE_INSTRUCTION_METERING != 0 -+ if (exec_env) -+ exec_env->instructions_to_execute = instructions_left; -+#endif - return; - - #if WASM_ENABLE_LABELS_AS_VALUES == 0 -diff --git a/core/iwasm/interpreter/wasm_mini_loader.c b/core/iwasm/interpreter/wasm_mini_loader.c -index 771538a1..d6e6a6b8 100644 ---- a/core/iwasm/interpreter/wasm_mini_loader.c -+++ b/core/iwasm/interpreter/wasm_mini_loader.c -@@ -805,6 +805,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, - const char *linked_signature = NULL; - void *linked_attachment = NULL; - bool linked_call_conv_raw = false; -+ uint32_t gas = 0; - - read_leb_uint32(p, p_end, declare_type_index); - *p_buf = p; -@@ -816,7 +817,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, - /* check built-in modules */ - linked_func = wasm_native_resolve_symbol( - sub_module_name, function_name, declare_func_type, &linked_signature, -- &linked_attachment, &linked_call_conv_raw); -+ &linked_attachment, &gas, &linked_call_conv_raw); - - function->module_name = (char *)sub_module_name; - function->field_name = (char *)function_name; -@@ -825,6 +826,7 @@ load_function_import(const uint8 **p_buf, const uint8 *buf_end, - function->signature = linked_signature; - function->attachment = linked_attachment; - function->call_conv_raw = linked_call_conv_raw; -+ function->gas = gas; - return true; - } - -diff --git a/core/iwasm/interpreter/wasm_runtime.c b/core/iwasm/interpreter/wasm_runtime.c -index b4aa483d..2d74e469 100644 ---- a/core/iwasm/interpreter/wasm_runtime.c -+++ b/core/iwasm/interpreter/wasm_runtime.c -@@ -168,7 +168,7 @@ wasm_resolve_import_func(const WASMModule *module, WASMFunctionImport *function) - #endif - function->func_ptr_linked = wasm_native_resolve_symbol( - function->module_name, function->field_name, function->func_type, -- &function->signature, &function->attachment, &function->call_conv_raw); -+ &function->signature, &function->attachment, &function->gas, &function->call_conv_raw); - - if (function->func_ptr_linked) { - return true; -@@ -820,6 +820,7 @@ functions_instantiate(const WASMModule *module, WASMModuleInstance *module_inst, - function->param_count = - (uint16)function->u.func_import->func_type->param_count; - function->param_types = function->u.func_import->func_type->types; -+ function->gas = import->u.function.gas; - function->local_cell_num = 0; - function->local_count = 0; - function->local_types = NULL; -diff --git a/core/iwasm/interpreter/wasm_runtime.h b/core/iwasm/interpreter/wasm_runtime.h -index 16c670f0..5ddac567 100644 ---- a/core/iwasm/interpreter/wasm_runtime.h -+++ b/core/iwasm/interpreter/wasm_runtime.h -@@ -237,6 +237,10 @@ struct WASMFunctionInstance { - WASMFunctionImport *func_import; - WASMFunction *func; - } u; -+ -+ // gas cost for import func -+ uint32 gas; -+ - #if WASM_ENABLE_MULTI_MODULE != 0 - WASMModuleInstance *import_module_inst; - WASMFunctionInstance *import_func_inst; -diff --git a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c -index a68c0749..cafb6915 100644 ---- a/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c -+++ b/core/iwasm/libraries/libc-builtin/libc_builtin_wrapper.c -@@ -1038,16 +1038,16 @@ print_f64_wrapper(wasm_exec_env_t exec_env, double f64) - - /* clang-format off */ - #define REG_NATIVE_FUNC(func_name, signature) \ -- { #func_name, func_name##_wrapper, signature, NULL } -+ { #func_name, func_name##_wrapper, signature, NULL, 0 } - /* clang-format on */ - - static NativeSymbol native_symbols_libc_builtin[] = { - REG_NATIVE_FUNC(printf, "($*)i"), - REG_NATIVE_FUNC(sprintf, "($$*)i"), - REG_NATIVE_FUNC(snprintf, "(*~$*)i"), -- { "vprintf", printf_wrapper, "($*)i", NULL }, -- { "vsprintf", sprintf_wrapper, "($$*)i", NULL }, -- { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL }, -+ { "vprintf", printf_wrapper, "($*)i", NULL, 0 }, -+ { "vsprintf", sprintf_wrapper, "($$*)i", NULL, 0 }, -+ { "vsnprintf", snprintf_wrapper, "(*~$*)i", NULL, 0 }, - REG_NATIVE_FUNC(puts, "($)i"), - REG_NATIVE_FUNC(putchar, "(i)i"), - REG_NATIVE_FUNC(memcmp, "(**~)i"), -diff --git a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -index f7dfea0b..c01e80a9 100644 ---- a/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -+++ b/core/iwasm/libraries/libc-wasi/libc_wasi_wrapper.c -@@ -2269,7 +2269,7 @@ wasi_sched_yield(wasm_exec_env_t exec_env) - - /* clang-format off */ - #define REG_NATIVE_FUNC(func_name, signature) \ -- { #func_name, wasi_##func_name, signature, NULL } -+ { #func_name, wasi_##func_name, signature, NULL, 0 } - /* clang-format on */ - - static NativeSymbol native_symbols_libc_wasi[] = { -diff --git a/core/shared/platform/include/platform_wasi_types.h b/core/shared/platform/include/platform_wasi_types.h -index ac1a95ea..e23b500e 100644 ---- a/core/shared/platform/include/platform_wasi_types.h -+++ b/core/shared/platform/include/platform_wasi_types.h -@@ -36,7 +36,11 @@ extern "C" { - #if WASM_ENABLE_UVWASI != 0 || WASM_ENABLE_LIBC_WASI == 0 - #define assert_wasi_layout(expr, message) /* nothing */ - #else --#define assert_wasi_layout(expr, message) _Static_assert(expr, message) -+ #ifndef _MSC_VER -+ #define assert_wasi_layout(expr, message) _Static_assert(expr, message) -+ #else -+ #define assert_wasi_layout(expr, message) static_assert(expr, message) -+ #endif - #endif - - assert_wasi_layout(_Alignof(int8_t) == 1, "non-wasi data layout"); From e59f5f3b0193b2bb335cfdc88e066cf228cbffa6 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 26 Sep 2025 17:09:53 -0400 Subject: [PATCH 082/212] fix tests --- src/test/app/FeeVote_test.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 3164e4badc6..370c4b8a131 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -335,7 +335,10 @@ class FeeVote_test : public beast::unit_test::suite // Test with XRPFees disabled (legacy format) { - jtx::Env env(*this, jtx::testable_amendments() - featureXRPFees); + jtx::Env env( + *this, + jtx::testable_amendments() - featureXRPFees - + featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -365,7 +368,8 @@ class FeeVote_test : public beast::unit_test::suite // Test with XRPFees enabled (new format) { - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env( + *this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -398,7 +402,10 @@ class FeeVote_test : public beast::unit_test::suite testcase("Fee Transaction Validation"); { - jtx::Env env(*this, jtx::testable_amendments() - featureXRPFees); + jtx::Env env( + *this, + jtx::testable_amendments() - featureXRPFees - + featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -422,7 +429,8 @@ class FeeVote_test : public beast::unit_test::suite } { - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env( + *this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -451,7 +459,7 @@ class FeeVote_test : public beast::unit_test::suite { testcase("Pseudo Transaction Properties"); - jtx::Env env(*this, jtx::testable_amendments()); + jtx::Env env(*this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -490,7 +498,7 @@ class FeeVote_test : public beast::unit_test::suite { testcase("Multiple Fee Updates"); - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env(*this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -539,7 +547,7 @@ class FeeVote_test : public beast::unit_test::suite { testcase("Wrong Ledger Sequence"); - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env(*this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -570,7 +578,7 @@ class FeeVote_test : public beast::unit_test::suite { testcase("Partial Field Updates"); - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env(*this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -618,7 +626,7 @@ class FeeVote_test : public beast::unit_test::suite { testcase("Single Invalid Transaction"); - jtx::Env env(*this, jtx::testable_amendments() | featureXRPFees); + jtx::Env env(*this, jtx::testable_amendments() - featureSmartEscrow); auto ledger = std::make_shared( create_genesis, env.app().config(), @@ -658,7 +666,7 @@ class FeeVote_test : public beast::unit_test::suite // Test with XRPFees enabled { - Env env(*this, testable_amendments() | featureXRPFees); + Env env(*this, testable_amendments() - featureSmartEscrow); auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); auto ledger = std::make_shared( @@ -693,7 +701,9 @@ class FeeVote_test : public beast::unit_test::suite // Test with XRPFees disabled (legacy format) { - Env env(*this, testable_amendments() - featureXRPFees); + Env env( + *this, + testable_amendments() - featureXRPFees - featureSmartEscrow); auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); auto ledger = std::make_shared( @@ -736,7 +746,7 @@ class FeeVote_test : public beast::unit_test::suite setup.account_reserve = 1234567; setup.owner_reserve = 7654321; - Env env(*this, testable_amendments() | featureXRPFees); + Env env(*this, testable_amendments() - featureSmartEscrow); // establish what the current fees are BEAST_EXPECT( From 8d266d39414c49fa7c95c3faf2fedd7cd291e50d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 29 Sep 2025 15:43:10 -0400 Subject: [PATCH 083/212] remove STInt64 (#5815) --- include/xrpl/protocol/SField.h | 1 - include/xrpl/protocol/STInteger.h | 1 - include/xrpl/protocol/STObject.h | 4 --- src/libxrpl/protocol/STInteger.cpp | 49 ----------------------------- src/libxrpl/protocol/STObject.cpp | 12 ------- src/libxrpl/protocol/STVar.cpp | 3 -- src/libxrpl/protocol/Serializer.cpp | 6 ---- 7 files changed, 76 deletions(-) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index b6ae98b48f5..e25447c3945 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -359,7 +359,6 @@ using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; using SF_INT32 = TypedField>; -using SF_INT64 = TypedField>; using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; diff --git a/include/xrpl/protocol/STInteger.h b/include/xrpl/protocol/STInteger.h index f86d3023481..154ee7f2036 100644 --- a/include/xrpl/protocol/STInteger.h +++ b/include/xrpl/protocol/STInteger.h @@ -82,7 +82,6 @@ using STUInt32 = STInteger; using STUInt64 = STInteger; using STInt32 = STInteger; -using STInt64 = STInteger; template inline STInteger::STInteger(Integer v) : value_(v) diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 34f14254f83..1c22b08abaf 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -233,8 +233,6 @@ class STObject : public STBase, public CountedObject getFieldH256(SField const& field) const; std::int32_t getFieldI32(SField const& field) const; - std::int64_t - getFieldI64(SField const& field) const; AccountID getAccountID(SField const& field) const; @@ -371,8 +369,6 @@ class STObject : public STBase, public CountedObject void setFieldI32(SField const& field, std::int32_t); void - setFieldI64(SField const& field, std::int64_t); - void setFieldVL(SField const& field, Blob const&); void setFieldVL(SField const& field, Slice const&); diff --git a/src/libxrpl/protocol/STInteger.cpp b/src/libxrpl/protocol/STInteger.cpp index ca2e3b9c982..355fa4c113a 100644 --- a/src/libxrpl/protocol/STInteger.cpp +++ b/src/libxrpl/protocol/STInteger.cpp @@ -278,53 +278,4 @@ STInt32::getJson(JsonOptions) const return value_; } -//------------------------------------------------------------------------------ - -template <> -STInteger::STInteger(SerialIter& sit, SField const& name) - : STInteger(name, sit.get64()) -{ -} - -template <> -SerializedTypeID -STInt64::getSType() const -{ - return STI_INT64; -} - -template <> -std::string -STInt64::getText() const -{ - return std::to_string(value_); -} - -template <> -Json::Value -STInt64::getJson(JsonOptions) const -{ - auto convertToString = [](int64_t const value, int const base) { - XRPL_ASSERT( - base == 10 || base == 16, - "ripple::STInt64::getJson : base 10 or 16"); - std::string str( - base == 10 ? 20 : 16, 0); // Allocate space depending on base - auto ret = - std::to_chars(str.data(), str.data() + str.size(), value, base); - XRPL_ASSERT( - ret.ec == std::errc(), - "ripple::STInt64::getJson : to_chars succeeded"); - str.resize(std::distance(str.data(), ret.ptr)); - return str; - }; - - if (auto const& fName = getFName(); fName.shouldMeta(SField::sMD_BaseTen)) - { - return convertToString(value_, 10); // Convert to base 10 - } - - return convertToString(value_, 16); // Convert to base 16 -} - } // namespace ripple diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 384ab527701..77e5fd1ad95 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -653,12 +653,6 @@ STObject::getFieldI32(SField const& field) const return getFieldByValue(field); } -std::int64_t -STObject::getFieldI64(SField const& field) const -{ - return getFieldByValue(field); -} - AccountID STObject::getAccountID(SField const& field) const { @@ -779,12 +773,6 @@ STObject::setFieldI32(SField const& field, std::int32_t v) setFieldUsingSetValue(field, v); } -void -STObject::setFieldI64(SField const& field, std::int64_t v) -{ - setFieldUsingSetValue(field, v); -} - void STObject::setFieldV256(SField const& field, STVector256 const& v) { diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 72b348091c9..c46effb47ec 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -211,9 +211,6 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args) case STI_INT32: construct(std::forward(args)...); return; - case STI_INT64: - construct(std::forward(args)...); - return; case STI_VECTOR256: construct(std::forward(args)...); return; diff --git a/src/libxrpl/protocol/Serializer.cpp b/src/libxrpl/protocol/Serializer.cpp index d85f25ec8b2..098e68d2b21 100644 --- a/src/libxrpl/protocol/Serializer.cpp +++ b/src/libxrpl/protocol/Serializer.cpp @@ -89,12 +89,6 @@ Serializer::addInteger(std::int32_t i) { return add32(i); } -template <> -int -Serializer::addInteger(std::int64_t i) -{ - return add64(i); -} int Serializer::addRaw(Blob const& vector) From 57fc1df7d7cf35f3711a6e37726535899813bf24 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 29 Sep 2025 15:43:22 -0400 Subject: [PATCH 084/212] switch from wasm32-unknown-unknown to wasm32v1-none (#5814) --- src/test/app/Wasm_test.cpp | 2 +- src/test/app/wasm_fixtures/copyFixtures.py | 6 +- src/test/app/wasm_fixtures/fixtures.cpp | 1084 ++++++++++---------- 3 files changed, 529 insertions(+), 563 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 4348e141309..2b1259365a4 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -519,7 +519,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 96'942, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 97'411, std::to_string(re->cost)); } env.close(); } diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index b0c8ad1af28..cd53184b5e7 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -46,10 +46,10 @@ def process_rust(project_name): project_path = os.path.abspath( os.path.join(os.path.dirname(__file__), project_name) ) - wasm_location = f"target/wasm32-unknown-unknown/release/{project_name}.wasm" + wasm_location = f"target/wasm32v1-none/release/{project_name}.wasm" build_cmd = ( f"(cd {project_path} " - f"&& cargo build --target wasm32-unknown-unknown --release " + f"&& cargo build --target wasm32v1-none --release " f"&& wasm-opt {wasm_location} {OPT} -o {wasm_location}" ")" ) @@ -68,7 +68,7 @@ def process_rust(project_name): src_path = os.path.abspath( os.path.join( os.path.dirname(__file__), - f"{project_name}/target/wasm32-unknown-unknown/release/{project_name}.wasm", + f"{project_name}/target/wasm32v1-none/release/{project_name}.wasm", ) ) with open(src_path, "rb") as f: diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 8fb6340bed1..6ad3e336399 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8659,196 +8659,195 @@ extern std::string const allHostFunctionsWasmHex = "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a801c051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0aff1b051900200241094f0440000b20002002360204200020013602000b1900200241214f" "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" "6a22044100360200200141106a220542003703002001420037030802404181802020014108" "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" - "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" - "00000f0b418080c000410b20013402041001000bea1901097f230041b0036b22002400418b" - "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" - "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" - "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" - "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" - "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" - "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" - "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" - "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" - "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" - "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" - "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" - "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" - "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" - "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" - "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" - "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" - "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" - "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" - "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" - "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" - "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" - "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" - "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" - "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" - "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" - "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" - "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" - "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" - "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" - "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" - "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" - "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" - "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" - "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" - "420037039001024002400240024002402001411420004190016a22024120100e2201412046" - "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" - "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" - "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" - "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" - "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" - "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" - "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" - "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" - "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" - "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" - "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" - "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" - "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" - "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" - "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" - "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" - "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" - "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" - "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" - "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" - "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" - "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" - "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" - "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" - "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" - "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" - "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" - "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" - "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" - "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" - "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" - "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" - "00370300200342003703002005420037030020004200370390010240200422032003410020" - "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" - "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" - "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" - "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" - "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" - "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" - "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" - "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" - "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" - "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" - "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" - "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" - "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" - "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" - "004100410010021a41a898c00041281019220145044041d098c000412741a898c000412841" - "0110021a41f798c000411e41004100410010021a41bf80c000412841004100410010021a41" - "010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac10011a41" - "8b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10011a" - "41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c00041162001ac" - "10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b0bb9" - "190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e435449" - "4f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e73" - "535543434553533a20416c6c20686f73742066756e6374696f6e2074657374732070617373" - "6564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e63" - "74696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e" - "74206c65646765722074696d653a506172656e74206c656467657220686173683a53554343" - "4553533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765" - "745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a455252" - "4f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a455252" - "4f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f72" - "7920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472" - "616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e" - "6774683a5472616e73616374696f6e20466565202873657269616c697a6564205852502061" - "6d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e6573746564206669" - "656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f" - "6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e6572732061" - "72726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e6573746564" - "206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f617272" - "61795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e7361" - "6374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f666965" - "6c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f" - "74785f6669656c6428466565292077726f6e67206c656e6774682028657870656374656420" - "3820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" - "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a" - "2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43" - "757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f" - "756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a" - "65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" - "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a65" - "63742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f" - "626a5f6669656c642842616c616e636529206661696c656420286d61792062652065787065" - "63746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a49" - "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c6428416363" - "6f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e" - "6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f7420617070" - "6c696361626c653a43757272656e74206f626a656374205369676e65727320617272617920" - "6c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e" - "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" - "61795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e" - "74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f7279" - "20343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d5375" - "636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a43616368" - "6564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e7429" - "3a436163686564206f626a6563742062616c616e6365202873657269616c697a6564205852" - "5020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e6774" - "6820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c61" - "6e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e63" - "6529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a" - "436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a4361636865" - "64206f626a656374205369676e657273206172726179206c656e6774683a43616368656420" - "6e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53" - "5543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e" - "464f3a2063616368655f6c65646765725f6f626a206661696c656420286578706563746564" - "20776974682074657374206669787475726573293a494e464f3a206765745f6c6564676572" - "5f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163" - "686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64206661696c65642061732065787065637465643a494e464f3a20676574" - "5f6c65646765725f6f626a5f61727261795f6c656e206661696c6564206173206578706563" - "7465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6172726179" - "5f6c656e206661696c65642061732065787065637465643a535543434553533a20416e7920" - "6c6564676572206f626a6563742066756e6374696f6e732028696e74657266616365207465" - "73746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f72" - "2063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c657420" - "47656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65" - "743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a20637265" - "64656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e74" - "657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b65" - "796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374" - "696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f52" - "3a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e74" - "5f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c6974" - "792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" - "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461" - "206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c6564" - "20286578706563746564202d206e6f2073756368204e4654293a5465737420747261636520" - "6d6573736167657061796c6f616454726163652066756e6374696f6e206279746573207772" - "697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" - "74696f6e20737563636565646564535543434553533a205574696c6974792066756e637469" - "6f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a2074" - "726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68" - "616c66206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174" - "652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064" - "6174612066726f6d205741534d20746573745375636365737366756c6c7920757064617465" - "64206c656467657220656e74727920776974683a535543434553533a204461746120757064" - "6174652066756e6374696f6e734552524f523a207570646174655f64617461206661696c65" - "643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" - "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; + "20052903003700000b200020023a0000200141206a24000b460020012d0000410146044041" + "8080c000410b20013402041001000b20002001290001370000200041106a200141116a2800" + "00360000200041086a200141096a2900003700000be81901097f230041b0036b2200240041" + "8b80c000411b41004100410010021a41a680c000411941004100410010021a41e780c00041" + "2b41004100410010021a027f02400240024002400240024002401003220141004a04404192" + "81c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c8" + "016a22034200370300200041c0016a22054200370300200041b8016a220442003703002000" + "42003703b001200041b0016a22064120100522014120470d0241bc81c00041132006412041" + "0110021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a20" + "0041a0016a410036020020004198016a420037030020004200370390014181802020004190" + "016a22024114100022014114470d03418a83c00041142002411410061a2000420037037041" + "888018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583" + "c000412820024108410110021a2000410036025041848008200041d0006a22024104100022" + "014104470d0541dd83c000411520024104410110021a200041013b003c2003420037030020" + "05420037030020044200370300200042003703b00102402000413c6a410220064120100722" + "0141004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d" + "20002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c000" + "41154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a41" + "021009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac10" + "011a0b41a585c000412341004100410010021a41de86c000413341004100410010021a2000" + "420037037041828018200041f0006a22014108100a220241004c0d06200241084604404191" + "87c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f20" + "02ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c" + "410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac" + "10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001" + "ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b" + "2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a41003602" + "0020004198016a4200370300200042003703900102404181802020004190016a2202411410" + "0a220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac1001" + "1a0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a" + "4200370300200042003703b0010240200041d0006a4102200041b0016a22014120100b2202" + "41004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c000411520" + "002802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac00041" + "244183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c" + "2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc000412841004100410010" + "021a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a220120" + "02101d200041a8016a4200370300200041a0016a420037030020004198016a420037030020" + "00420037039001024002400240024002402001411420004190016a22024120100e22014120" + "460440200241204100100f220441004a044041858cc00041232004ad10011a200042003703" + "50200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc0" + "00412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad" + "10011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c4101" + "10021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a42" + "00370300200041b8016a4200370300200042003703b001410141828018200041b0016a4120" + "101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc00041" + "2b2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041" + "d0006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b41" + "014183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a41" + "0210132201410048044041ca91c00041392001ac10011a0b418392c0004137410041004100" + "10021a0c010b200041013b003c200041c8016a4200370300200041c0016a42003703002000" + "41b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a220141" + "201011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8e" + "c000411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41" + "cf8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e04" + "4041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc00041" + "2441004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c" + "2000413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d8" + "006a4200370300200042003703500240024002400240024020044114200041d0006a220241" + "20100e22014120460440419793c000410f20024120410110021a20004188016a4200370300" + "20004180016a4200370300200041f8006a4200370300200042003703700240200441142004" + "411441a693c0004109200041f0006a220141201014220241004a0440200041086a20012002" + "101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002ac" + "10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a22" + "05420037030020004200370390012000413c6a2202411441e80720004190016a2207412010" + "1522014120470d0141fc93c000410e20074120410110021a200041c8016a42003703002000" + "41c0016a4200370300200041b8016a4200370300200042003703b00120024114412a200041" + "b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c000" + "412441004100410010021a419195c000412541004100410010021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037041b695c0004117" + "200041f0006a22024120101722014120470d0341cd95c000410b41b695c000411741011002" + "1a41d895c000411120024120410110021a2004101c200041d0006a22062004101d20084200" + "3703002003420037030020054200370300200042003703900102404100200422036b410371" + "220220036a220520034d0d0020020440200221010340200341003a0000200341016a210320" + "0141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a41003a" + "0000200341066a41003a0000200341056a41003a0000200341046a41003a0000200341036a" + "41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d00" + "0b0b200541800220026b2201417c716a220320054b0440034020054100360200200541046a" + "22052003490d000b0b024020032001410371220120036a22024f0d00200122050440034020" + "0341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d00034020" + "0341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a000020" + "0341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a" + "0000200341086a22032002470d000b0b024020064114200741202004418002101822014100" + "4a044041e995c00041102001ad10011a20014181024f0d0641f995c0004109200420014101" + "10021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c0004107410110" + "0222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480440" + "41ad97c000411a42a47b10011a41a47b0c070b41f796c000411c420010011a419397c00041" + "1a41004100410010021a41ff97c000412941004100410010021a41a898c000412810192201" + "45044041d098c000412741a898c0004128410110021a41f798c000411e4100410041001002" + "1a41bf80c000412841004100410010021a41010c070b419599c000411a2001ac10011a41c3" + "7a0c060b41f494c000411d2001ac10011a418b7c0c050b41d894c000411c2001ac10011a41" + "897c0c040b41bc94c000411c2001ac10011a41887c0c030b41dd97c00041222001ac10011a" + "41a77b0c020b000b41c797c00041162001ac10011a41a57b0b200041b0036a24000b0bb919" + "0100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f" + "4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e7353" + "5543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061737365" + "64212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e6374" + "696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e74" + "206c65646765722074696d653a506172656e74206c656467657220686173683a5355434345" + "53533a204c6564676572206865616465722066756e6374696f6e734552524f523a20676574" + "5f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a4552524f" + "523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a4552524f" + "523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f7279" + "20323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d547261" + "6e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e67" + "74683a5472616e73616374696f6e20466565202873657269616c697a65642058525020616d" + "6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420666965" + "6c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e" + "65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273206172" + "726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374656420" + "6172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61727261" + "795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e736163" + "74696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f6669656c" + "642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" + "785f6669656c6428466565292077726f6e67206c656e677468202865787065637465642038" + "20627974657320666f7220585250293a4552524f523a206765745f74785f6669656c642841" + "63636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a20" + "43757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d4375" + "7272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f75" + "6e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a65" + "642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e636520" + "6c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563" + "742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f62" + "6a5f6669656c642842616c616e636529206661696c656420286d6179206265206578706563" + "746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a494e" + "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c64284163636f" + "756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e67" + "74683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f637572" + "72656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c" + "696361626c653a43757272656e74206f626a656374205369676e657273206172726179206c" + "656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e46" + "4f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e74" + "206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f727920" + "343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d537563" + "6365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361636865" + "64206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74293a" + "436163686564206f626a6563742062616c616e6365202873657269616c697a656420585250" + "20616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e677468" + "20286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e" + "63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e6365" + "29206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a43" + "6163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f6f" + "626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163686564" + "206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e" + "6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f6f" + "626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a5355" + "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e46" + "4f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374656420" + "776974682074657374206669787475726573293a494e464f3a206765745f6c65646765725f" + "6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063616368" + "6564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65737465" + "645f6669656c64206661696c65642061732065787065637465643a494e464f3a206765745f" + "6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870656374" + "65643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" + "6c656e206661696c65642061732065787065637465643a535543434553533a20416e79206c" + "6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520746573" + "746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f7220" + "63616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047" + "656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c6574" + "3a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063726564" + "656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e7465" + "7266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b6579" + "6c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e637469" + "6f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a" + "20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e745f" + "6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c697479" + "2046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c6421" + "496e70757420646174613a5348413531322068616c6620686173683a4e4654206461746120" + "6c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c656420" + "286578706563746564202d206e6f2073756368204e4654293a54657374207472616365206d" + "6573736167657061796c6f616454726163652066756e6374696f6e20627974657320777269" + "7474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e6374" + "696f6e20737563636565646564535543434553533a205574696c6974792066756e6374696f" + "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a207472" + "6163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f6861" + "6c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064617465" + "2046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279206461" + "74612066726f6d205741534d20746573745375636365737366756c6c792075706461746564" + "206c656467657220656e74727920776974683a535543434553533a20446174612075706461" + "74652066756e6374696f6e734552524f523a207570646174655f64617461206661696c6564" + "3a004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" + "7365642d6279010572757374631d312e39302e30202831313539653738633420323032352d" + "30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c" + "6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -9607,9 +9606,9 @@ extern std::string const hfPerfTest = extern std::string const allKeyletsWasmHex = "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" - "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" - "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620974726163" + "655f6e756d000508686f73745f6c6962057472616365000008686f73745f6c696210636163" + "68655f6c65646765725f6f626a000308686f73745f6c6962146765745f6c65646765725f6f" "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" @@ -9627,227 +9626,235 @@ extern std::string const allKeyletsWasmHex = "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" - "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a8d33038d0602057f" - "037e230041f0006b220524000240024020012d0000450440200541186a200141196a290000" - "370300200541106a200141116a290000370300200541086a200141096a2900003703002005" - "20012900013703002002200320054120410110001a2005412041001001220141004c0d0102" - "4002400240024002402004450440418b80c000410f4285801410021a200541d8006a420037" - "0300200541d0006a4200370300200541c8006a420037030020054200370340200141858014" - "200541406b22064120100322014120470d01200541286a200541cf006a2201290000220a37" - "0300200541306a200541d7006a2202290000220b370300200541386a200541df006a22032d" - "000022043a000020052005290047220c37032020052f014021072005280142210820052d00" - "4621092001200a3700002002200b370000200320043a0000200520093a0046200520083601" - "42200520073b01402005200c370047419a80c000410c20064120410110001a0c030b418b80" - "c000410f2004ac10021a200541d0006a4100360200200541c8006a42003703002005420037" - "034020012004200541406b411410032201417e47044020014114460d02200141004e0d0441" - "998ac00041172001ac10021a0c050b417e21010c040b41a680c0004115417f20012001417f" - "4e1b2201ac10021a200041013a0000200020013602040c060b200520052900473703602005" - "200541cc006a2201290000370065200520052f014022023b016e2005200529036037032020" - "05200529006537002520052800432103200520052d00423a0042200520023b014020052003" - "3600432001200529002537000020052005290320370047419a80c000410c200541406b4114" - "410110001a0b20004180023b01000c040b41b08ac0004131421410021a41e18ac000412020" - "01ad10021a417321010b41a680c00041152001ac10021a200041013a000020002001360204" - "0c020b41c280c000411620012802042201ac10021a200041013a0000200020013602040c01" - "0b41bb80c00041072001ac10021a200041013a0000200020013602040b200541f0006a2400" - "0bfc27020a7f027e23004180076b2200240041d880c000412341004100410010001a200041" - "98016a2204410036020020004190016a22034200370300200042003703880102402000027f" - "02404181802020004188016a22024114100422014114460440200041066a20002d008a013a" - "00002000200029008f013703e001200020004194016a22052900003700e501200041106a20" - "002900e501370000200020002f0188013b01042000200028008b01360007200020002903e0" - "0137000b41fb80c0004108200041046a2208411410051a2004410036020020034200370300" - "20004200370388014183802020024114100422014114470d032000411a6a20002d008a013a" - "00002000200029008f013703e001200020052900003700e501200041246a20002900e50137" - "0000200020002f0188013b01182000200028008b0136001b200020002903e00137001f4183" - "81c000410c200041186a411410051a200041a0016a22054200370300200442003703002003" - "420037030020004200370388012008411420024120100622014120460d0102402001410048" - "0440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a200529" - "03003700002000413d6a2004290300370000200041356a2003290300370000200020002903" - "880137002d41000b3a002c20004188016a22042000412c6a418f81c0004107418180201018" - "0240024020002d00880145044041002101419681c000413541004100410010001a200041de" - "006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a6013b" - "015c200042003703502000410036005f200041a0016a2203420037030020004198016a2202" - "420037030020004190016a220542003703002000420037038801200041046a411420004118" - "6a4114200041d0006a41142004412010072204412047044002402004410048044020002004" - "3602680c010b2000417f3602680b410121010c020b200041fd006a20032903003700002000" - "41f5006a2002290300370000200041ed006a20052903003700002000200029038801370065" - "0c010b200028028c01210141878ac0004112420510021a0c010b200020013a006420004188" - "016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c0004137" - "41004100410010001a200041f0016a200041286a2201280100360200200041e8016a200041" - "206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a20" - "0041e0006a2802002203360200200020002901183703e00120002000290350220b3702f401" - "200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d806200041" - "f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec0620" - "004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a200041" - "0136028801200041f0066a2202420037030020044200370300200342003703002000420037" - "03d80641818bc0004114200041b4016a412820014120100822014120470440024020014100" - "480440200020013602e4010c010b2000417f3602e4010b410121010c020b200041f9016a20" - "02290300370000200041f1016a2004290300370000200041e9016a20032903003700002000" - "20002903d8063700e101410021010c010b200028028c01210141878ac0004112420510021a" - "0c010b200020013a00e001200041b4026a200041e0016a2204418b82c00041034181802010" - "18024020002d00b40245044041002101418e82c000413141004100410010001a200041f801" - "6a22034200370300200041f0016a22024200370300200041e8016a22054200370300200042" - "003703e001200041046a411441062004412010092204412047044002402004410048044020" - "0020043602c0020c010b2000417f3602c0020b410121010c020b200041d5026a2003290300" - "370000200041cd026a2002290300370000200041c5026a2005290300370000200020002903" - "e0013700bd020c010b20002802b802210141878ac0004112420610021a0c010b200020013a" - "00bc02200041e0016a2204200041bc026a41bf82c0004105418180201018024020002d00e0" - "014504404100210141c482c000413341004100410010001a200041f8016a22034200370300" - "200041f0016a22024200370300200041e8016a22054200370300200042003703e001200041" - "046a220841142008411441f782c000411220044120100a2204412047044002402004410048" - "0440200020043602e4020c010b2000417f3602e4020b410121010c020b200041f9026a2003" - "290300370000200041f1026a2002290300370000200041e9026a2005290300370000200020" - "002903e0013700e1020c010b20002802e401210141878ac0004112420610021a0c010b2000" - "20013a00e002200041e0016a2204200041e0026a418983c000410a41988020101802402000" - "2d00e00145044041002101419383c000413841004100410010001a200041f8016a22034200" - "370300200041f0016a22024200370300200041e8016a22054200370300200042003703e001" - "200041046a4114200041186a411420044120100b2204412047044002402004410048044020" - "002004360288030c010b2000417f360288030b410121010c020b2000419d036a2003290300" - "37000020004195036a20022903003700002000418d036a2005290300370000200020002903" - "e001370085030c010b20002802e401210141878ac0004112420710021a0c010b200020013a" - "008403200041e0016a220520004184036a41cb83c000410841818020101802400240024002" - "40024002400240024002400240024020002d00e00145044041d383c0004136410041004100" - "10001a230041206b22032400200341186a22064200370300200341106a2207420037030020" - "0341086a2209420037030020034200370300200041a8036a2201027f200041046a22044114" - "200041186a2208411420034120100c22024120470440024020024100480440200120023602" - "040c010b2001417f3602040b41010c010b20012003290300370001200141196a2006290300" - "370000200141116a2007290300370000200141096a200929030037000041000b3a00002003" - "41206a240020052001418984c000410e41818020101820002d00e0010d01419784c000413c" - "41004100410010001a230041206b22032400200341186a22064200370300200341106a2207" - "4200370300200341086a2209420037030020034200370300200041cc036a2201027f200441" - "1420034120100d22024120470440024020024100480440200120023602040c010b2001417f" - "3602040b41010c010b20012003290300370001200141196a2006290300370000200141116a" - "2007290300370000200141096a200929030037000041000b3a0000200341206a2400200520" - "0141d384c000410341818020101820002d00e0010d0241d684c00041314100410041001000" - "1a230041206b22032400200341186a22064200370300200341106a22074200370300200341" - "086a2209420037030020034200370300200041f0036a2201027f20044114410b2003412010" - "0e22024120470440024020024100480440200120023602040c010b2001417f3602040b4101" - "0c010b20012003290300370001200141196a2006290300370000200141116a200729030037" - "0000200141096a200929030037000041000b3a0000200341206a240020052001418785c000" - "410641818020101820002d00e0010d03418d85c000413441004100410010001a230041206b" - "22032400200341186a22064200370300200341106a22074200370300200341086a22094200" - "3703002003420037030020004194046a2201027f20044114410c20034120100f2202412047" - "0440024020024100480440200120023602040c010b2001417f3602040b41010c010b200120" - "03290300370001200141196a2006290300370000200141116a200729030037000020014109" - "6a200929030037000041000b3a0000200341206a2400200041f4016a200041146a28010036" - "0200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0" - "003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d0441" - "cc85c000413941004100410010001a230041206b22012400200141186a2206420037030020" - "0141106a22074200370300200141086a2209420037030020014200370300200041b8046a22" - "02027f20054118200841142001412010102205412047044002402005410048044020022005" - "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200629" - "0300370000200241116a2007290300370000200241096a200929030037000041000b3a0000" - "200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c000" - "413541004100410010001a230041206b22012400200141186a22064200370300200141106a" - "22074200370300200141086a2209420037030020014200370300200041dc046a2202027f20" - "084114410620014120101122054120470440024020054100480440200220053602040c010b" - "2002417f3602040b41010c010b20022001290300370001200241196a200629030037000020" - "0241116a2007290300370000200241096a200929030037000041000b3a0000200141206a24" - "002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a41004100" - "410010001a230041206b22012400200141186a22064200370300200141106a220742003703" - "00200141086a220942003703002001420037030020004180056a2202027f20044114410d20" - "014120101222054120470440024020054100480440200220053602040c010b2002417f3602" - "040b41010c010b20022001290300370001200241196a2006290300370000200241116a2007" - "290300370000200241096a200929030037000041000b3a0000200141206a24002003200241" - "8787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a23" - "0041206b22012400200141186a22064200370300200141106a22074200370300200141086a" - "2209420037030020014200370300200041a4056a2202027f2004411420084114410e200141" - "20101322054120470440024020054100480440200220053602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2006290300370000200241116a20072903" - "00370000200241096a200929030037000041000b3a0000200141206a24002003200241bf87" - "c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a230041" - "206b22012400200141186a22084200370300200141106a22064200370300200141086a2207" - "420037030020014200370300200041c8056a2202027f20044114410f200141201014220541" - "20470440024020054100480440200220053602040c010b2002417f3602040b41010c010b20" - "022001290300370001200241196a2008290300370000200241116a20062903003700002002" - "41096a200729030037000041000b3a0000200141206a240020032002418188c00041124182" - "8020101820002d00d8060d09419388c00041c00041004100410010001a230041206b220124" - "00200141186a22084200370300200141106a22064200370300200141086a22074200370300" - "20014200370300200041ec056a2202027f2004411420014120101522054120470440024020" - "054100480440200220053602040c010b2002417f3602040b41010c010b2002200129030037" - "0001200241196a2008290300370000200241116a2006290300370000200241096a20072903" - "0037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00d8" - "060d0a41dd88c000413841004100410010001a230041206b22012400200141186a22084200" - "370300200141106a22064200370300200141086a2207420037030020014200370300200041" - "90066a2202027f200441144112200141201016220541204704400240200541004804402002" - "20053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "08290300370000200241116a2006290300370000200241096a200729030037000041000b3a" - "0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b89" - "c000413441004100410010001a230041206b22012400200141186a22054200370300200141" - "106a22084200370300200141086a2206420037030020014200370300200041b4066a220202" - "7f20044114411320014120101722044120470440024020044100480440200220043602040c" - "010b2002417f3602040b41010c010b20022001290300370001200241196a20052903003700" - "00200241116a2008290300370000200241096a200629030037000041000b3a000020014120" - "6a24002003200241cf89c000410541818020101820002d00d80645044041d489c000413341" - "004100410010001a410121010c0d0b20002802dc06210141878ac0004112421310021a0c0c" - "0b20002802e401210141878ac0004112420810021a0c0b0b20002802e401210141878ac000" - "4112420910021a0c0a0b20002802e401210141878ac0004112420a10021a0c090b20002802" - "e401210141878ac0004112420b10021a0c080b20002802dc06210141878ac0004112420c10" - "021a0c070b20002802dc06210141878ac0004112420d10021a0c060b20002802dc06210141" - "878ac0004112420d10021a0c050b20002802dc06210141878ac0004112420d10021a0c040b" - "20002802dc06210141878ac0004112420e10021a0c030b20002802dc06210141878ac00041" - "12420f10021a0c020b20002802dc06210141878ac0004112421010021a0c010b20002802dc" - "06210141878ac0004112421210021a0b20004180076a240020010f0b418080c000410b417f" - "20012001417f4e1bac1002000bfd0401067f200241104f044002402000410020006b410371" - "22056a220420004d0d002001210320050440200521060340200020032d00003a0000200341" - "016a2103200041016a2100200641016b22060d000b0b200541016b4107490d000340200020" - "032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a" - "0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041" - "056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a200341" - "076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b22" - "07417c7122086a21000240200120056a2206410371450440200020044d0d01200621010340" - "20042001280200360200200141046a2101200441046a22042000490d000b0c010b20002004" - "4d0d002006410374220541187121032006417c71220241046a2101410020056b4118712105" - "200228020021020340200420022003762001280200220220057472360200200141046a2101" - "200441046a22042000490d000b0b20074103712102200620086a21010b0240200020002002" - "6a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041" - "016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a0000" - "200041016a200141016a2d00003a0000200041026a200141026a2d00003a0000200041036a" - "200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a" - "2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a00" - "00200141086a2101200041086a22002006470d000b0b0b0b8b0b0100418080c0000b810b65" - "72726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a20" - "4572726f722067657474696e67206669656c643a204572726f723a204572726f7220676574" - "74696e67206b65796c65743a202424242424205354415254494e47205741534d2045584543" - "5554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e" - "744163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769" - "746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020ae53503900602047f" + "037e230041f0006b22052400024020012d0000410146044041c280c0004116200128020422" + "01ac10001a200041013a0000200020013602040c010b200541186a200141196a2900003703" + "00200541106a200141116a290000370300200541086a200141096a29000037030020052001" + "2900013703002002200320054120410110011a02402005412041001002220141004a044002" + "400240024002402004450440418b80c000410f4285801410001a200541d8006a4200370300" + "200541d0006a4200370300200541c8006a4200370300200542003703402001418580142005" + "41406b4120100322014120460d0141a680c0004115417f20012001417f4e1b2201ac10001a" + "200041013a0000200020013602040c070b418b80c000410f2004ac10001a200541d0006a41" + "00360200200541c8006a42003703002005420037034020012004200541406b411410032201" + "417e47044020014114460d04200141004e0d0241ad8ac00041172001ac10001a0c030b417e" + "21010c020b200541286a200541cf006a22012900002209370300200541306a200541d7006a" + "2202290000220a370300200541386a200541df006a22032d000022043a0000200520052900" + "47220b37032020052f014021062005280142210720052d0046210820012009370000200220" + "0a370000200320043a0000200520083a004620052007360142200520063b01402005200b37" + "0047419a80c000410c200541406b4120410110011a0c040b41c48ac0004131421410001a41" + "f58ac00041202001ad10001a417321010b41a680c00041152001ac10001a200041013a0000" + "200020013602040c030b200520052900473703602005200541cc006a220129000037006520" + "0520052f014022023b016e2005200529036037032020052005290065370025200528004321" + "03200520052d00423a0042200520023b014020052003360043200120052900253700002005" + "2005290320370047419a80c000410c200541406b4114410110011a0c010b41bb80c0004107" + "2001ac10001a200041013a0000200020013602040c010b20004180023b01000b200541f000" + "6a24000bd92802077f027e23004180076b2200240041d880c000412341004100410010011a" + "20004198016a2201410036020020004190016a220242003703002000420037038801024020" + "00027f02404181802020004188016a22044114100422034114460440200041066a20002d00" + "8a013a00002000200029008f013703e001200020004194016a22052900003700e501200041" + "106a20002900e501370000200020002f0188013b01042000200028008b0136000720002000" + "2903e00137000b41fb80c0004108200041046a2206411410051a2001410036020020024200" + "37030020004200370388014183802020044114100422034114470d032000411a6a20002d00" + "8a013a00002000200029008f013703e001200020052900003700e501200041246a20002900" + "e501370000200020002f0188013b01182000200028008b0136001b200020002903e0013700" + "1f418381c000410c200041186a411410051a200041a0016a22054200370300200142003703" + "002002420037030020004200370388012006411420044120100622034120460d0102402003" + "4100480440200020033602300c010b2000417f3602300b41010c020b0c020b200041c5006a" + "20052903003700002000413d6a2001290300370000200041356a2002290300370000200020" + "002903880137002d41000b3a002c20004188016a2000412c6a418f81c00041074181802010" + "18024020002d0088014101460440200028028c01210341878ac0004112420510001a0c010b" + "41002103419681c000413541004100410010011a200041de006a41c4003a0000200041d800" + "6a4100360200200041e3006a41003a0000200041d5a6013b015c2000420037035020004100" + "36005f200041a0016a2202420037030020004198016a2204420037030020004190016a2205" + "420037030020004200370388010240200041046a4114200041186a4114200041d0006a4114" + "20004188016a4120100722014120470440024020014100480440200020013602680c010b20" + "00417f3602680b410121030c010b200041fd006a2002290300370000200041f5006a200429" + "0300370000200041ed006a200529030037000020002000290388013700650b200020033a00" + "6420004188016a200041e4006a41cb81c00041094100101820002d00880141014604402000" + "28028c01210341878ac0004112420510001a0c010b41d481c000413741004100410010011a" + "200041f0016a200041286a2203280100360200200041e8016a200041206a22042901003703" + "00200041fc016a200041d8006a290300220737020020004184026a200041e0006a28020022" + "02360200200020002901183703e0012000200029035022083702f401200041e8066a220120" + "02360200200041e0066a22022007370300200020083703d806200041f4066a200429010037" + "0200200041fc066a2003280100360200200020002901183702ec0620004188026a200041d8" + "066a22034128101a2000418c016a200041e0016a41d000101a2000410136028801200041f0" + "066a220442003703002001420037030020024200370300200042003703d8062000027f4199" + "8ac0004114200041b4016a4128200341201008220341204704400240200341004804402000" + "20033602e4010c010b2000417f3602e4010b41010c010b200041f9016a2004290300370000" + "200041f1016a2001290300370000200041e9016a2002290300370000200020002903d80637" + "00e10141000b3a00e001200041b4026a200041e0016a418b82c00041034181802010182000" + "2d00b402410146044020002802b802210341878ac0004112420610001a0c010b4100210341" + "8e82c000413141004100410010011a200041f8016a22024200370300200041f0016a220442" + "00370300200041e8016a22054200370300200042003703e0010240200041046a4114410620" + "0041e0016a4120100922014120470440024020014100480440200020013602c0020c010b20" + "00417f3602c0020b410121030c010b200041d5026a2002290300370000200041cd026a2004" + "290300370000200041c5026a2005290300370000200020002903e0013700bd020b20002003" + "3a00bc02200041e0016a200041bc026a41bf82c000410541818020101820002d00e0014101" + "46044020002802e401210341878ac0004112420610001a0c010b4100210341c482c0004133" + "41004100410010011a200041f8016a22024200370300200041f0016a220442003703002000" + "41e8016a22054200370300200042003703e0010240200041046a220141142001411441f782" + "c0004112200041e0016a4120100a22014120470440024020014100480440200020013602e4" + "020c010b2000417f3602e4020b410121030c010b200041f9026a2002290300370000200041" + "f1026a2004290300370000200041e9026a2005290300370000200020002903e0013700e102" + "0b200020033a00e002200041e0016a200041e0026a418983c000410a41988020101820002d" + "00e001410146044020002802e401210341878ac0004112420710001a0c010b410021034193" + "83c000413841004100410010011a200041f8016a22024200370300200041f0016a22044200" + "370300200041e8016a22054200370300200042003703e0010240200041046a411420004118" + "6a4114200041e0016a4120100b220141204704400240200141004804402000200136028803" + "0c010b2000417f360288030b410121030c010b2000419d036a200229030037000020004195" + "036a20042903003700002000418d036a2005290300370000200020002903e001370085030b" + "200020033a008403200041e0016a20004184036a41cb83c000410841818020101820002d00" + "e001410146044020002802e401210341878ac0004112420810001a0c010b41d383c0004136" + "41004100410010011a230041206b22012400200141186a22044200370300200141106a2205" + "4200370300200141086a2206420037030020014200370300200041a8036a2202027f200041" + "046a4114200041186a411420014120100c2203412047044002402003410048044020022003" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200429" + "0300370000200241116a2005290300370000200241096a200629030037000041000b3a0000" + "200141206a2400200041e0016a2002418984c000410e41818020101820002d00e001410146" + "044020002802e401210341878ac0004112420910001a0c010b419784c000413c4100410041" + "0010011a230041206b22012400200141186a22044200370300200141106a22054200370300" + "200141086a2206420037030020014200370300200041cc036a2202027f200041046a411420" + "014120100d22034120470440024020034100480440200220033602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005" + "290300370000200241096a200629030037000041000b3a0000200141206a2400200041e001" + "6a200241d384c000410341818020101820002d00e001410146044020002802e40121034187" + "8ac0004112420a10001a0c010b41d684c000413141004100410010011a230041206b220124" + "00200141186a22044200370300200141106a22054200370300200141086a22064200370300" + "20014200370300200041f0036a2202027f200041046a4114410b20014120100e2203412047" + "0440024020034100480440200220033602040c010b2002417f3602040b41010c010b200220" + "01290300370001200241196a2004290300370000200241116a200529030037000020024109" + "6a200629030037000041000b3a0000200141206a2400200041e0016a2002418785c0004106" + "41818020101820002d00e001410146044020002802e401210341878ac0004112420b10001a" + "0c010b418d85c000413441004100410010011a230041206b22012400200141186a22044200" + "370300200141106a22054200370300200141086a2206420037030020014200370300200041" + "94046a2202027f200041046a4114410c20014120100f220341204704400240200341004804" + "40200220033602040c010b2002417f3602040b41010c010b20022001290300370001200241" + "196a2004290300370000200241116a2005290300370000200241096a200629030037000041" + "000b3a0000200141206a2400200041f4016a200041146a280100360200200041ec016a2000" + "410c6a290100370200200020002901043702e401200041808080e0003602e001200041d806" + "6a200241c185c000410b41848020101820002d00d806410146044020002802dc0621034187" + "8ac0004112420c10001a0c010b41cc85c000413941004100410010011a230041206b220124" + "00200141186a22044200370300200141106a22054200370300200141086a22064200370300" + "20014200370300200041b8046a2202027f200041e0016a4118200041186a41142001412010" + "1022034120470440024020034100480440200220033602040c010b2002417f3602040b4101" + "0c010b20022001290300370001200241196a2004290300370000200241116a200529030037" + "0000200241096a200629030037000041000b3a0000200141206a2400200041d8066a200241" + "8586c000410741818020101820002d00d806410146044020002802dc06210341878ac00041" + "12420d10001a0c010b418c86c000413541004100410010011a230041206b22012400200141" + "186a22044200370300200141106a22054200370300200141086a2206420037030020014200" + "370300200041dc046a2202027f200041186a41144106200141201011220341204704400240" + "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300" + "370001200241196a2004290300370000200241116a2005290300370000200241096a200629" + "030037000041000b3a0000200141206a2400200041d8066a200241c186c000410c41828020" + "101820002d00d806410146044020002802dc06210341878ac0004112420d10001a0c010b41" + "cd86c000413a41004100410010011a230041206b22012400200141186a2204420037030020" + "0141106a22054200370300200141086a220642003703002001420037030020004180056a22" + "02027f200041046a4114410d20014120101222034120470440024020034100480440200220" + "033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004" + "290300370000200241116a2005290300370000200241096a200629030037000041000b3a00" + "00200141206a2400200041d8066a2002418787c000410541818020101820002d00d8064101" + "46044020002802dc06210341878ac0004112420d10001a0c010b418c87c000413341004100" + "410010011a230041206b22012400200141186a22044200370300200141106a220542003703" + "00200141086a2206420037030020014200370300200041a4056a2202027f200041046a4114" + "200041186a4114410e20014120101322034120470440024020034100480440200220033602" + "040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004290300" + "370000200241116a2005290300370000200241096a200629030037000041000b3a00002001" + "41206a2400200041d8066a200241bf87c000410a41818020101820002d00d8064101460440" + "20002802dc06210341878ac0004112420e10001a0c010b41c987c000413841004100410010" + "011a230041206b22012400200141186a22044200370300200141106a220542003703002001" + "41086a2206420037030020014200370300200041c8056a2202027f200041046a4114410f20" + "014120101422034120470440024020034100480440200220033602040c010b2002417f3602" + "040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005" + "290300370000200241096a200629030037000041000b3a0000200141206a2400200041d806" + "6a2002418188c000411241828020101820002d00d806410146044020002802dc0621034187" + "8ac0004112420f10001a0c010b419388c00041c00041004100410010011a230041206b2201" + "2400200141186a22044200370300200141106a22054200370300200141086a220642003703" + "0020014200370300200041ec056a2202027f200041046a4114200141201015220341204704" + "40024020034100480440200220033602040c010b2002417f3602040b41010c010b20022001" + "290300370001200241196a2004290300370000200241116a2005290300370000200241096a" + "200629030037000041000b3a0000200141206a2400200041d8066a200241d388c000410a41" + "00101820002d00d806410146044020002802dc06210341878ac0004112421010001a0c010b" + "41dd88c000413841004100410010011a230041206b22012400200141186a22044200370300" + "200141106a22054200370300200141086a220642003703002001420037030020004190066a" + "2202027f200041046a41144112200141201016220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041d8066a2002419589c000410641818020101820002d00d80641" + "0146044020002802dc06210341878ac0004112421210001a0c010b419b89c0004134410041" + "00410010011a230041206b22012400200141186a22044200370300200141106a2205420037" + "0300200141086a2206420037030020014200370300200041b4066a2202027f200041046a41" + "14411320014120101722034120470440024020034100480440200220033602040c010b2002" + "417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241" + "116a2005290300370000200241096a200629030037000041000b3a0000200141206a240020" + "0041d8066a200241cf89c00041054181802010184101210320002d00d80641014604402000" + "2802dc06210341878ac0004112421310001a0c010b41d489c000413341004100410010011a" + "0b20004180076a240020030f0b418080c000410b417f20032003417f4e1bac1000000bf506" + "010b7f230041106b2106200241104f0440024020002000410020006b41037122056a22044f" + "0d002001210320050440200521070340200020032d00003a0000200341016a210320004101" + "6a2100200741016b22070d000b0b200541016b4107490d000340200020032d00003a000020" + "0041016a200341016a2d00003a0000200041026a200341026a2d00003a0000200041036a20" + "0341036a2d00003a0000200041046a200341046a2d00003a0000200041056a200341056a2d" + "00003a0000200041066a200341066a2d00003a0000200041076a200341076a2d00003a0000" + "200341086a2103200041086a22002004470d000b0b2004200220056b220b417c71220c6a21" + "000240200120056a22034103712201450440200020044d0d01200321010340200420012802" + "00360200200141046a2101200441046a22042000490d000b0c010b41002102200641003602" + "0c2006410c6a2001722105410420016b22074101710440200520032d00003a000041012102" + "0b20074102710440200220056a200220036a2f01003b01000b200320016b21022001410374" + "2107200628020c210902402000200441046a4d0440200421050c010b410020076b41187121" + "08034020042009200776200241046a2202280200220920087472360200200441086a210a20" + "0441046a220521042000200a4b0d000b0b41002104200641003a0008200641003a0006027f" + "200141014604404100210141002108200641086a0c010b200241056a2d0000200620024104" + "6a2d000022013a000841087421084102210d200641066a0b210a20052003410171047f200a" + "200241046a200d6a2d00003a000020062d0006411074210420062d00080520010b41ff0171" + "200420087272410020076b411871742009200776723602000b200b41037121022003200c6a" + "21010b02402000200020026a22044f0d002002410771220304400340200020012d00003a00" + "00200141016a2101200041016a2100200341016b22030d000b0b200241016b4107490d0003" + "40200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a" + "2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a00" + "00200041056a200141056a2d00003a0000200041066a200141066a2d00003a000020004107" + "6a200141076a2d00003a0000200141086a2101200041086a22002004470d000b0b0b0b930b" + "0200418080c0000b990a6572726f725f636f64653d47657474696e67206669656c643a2046" + "69656c6420646174613a204572726f722067657474696e67206669656c643a204572726f72" + "3a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e" + "47205741534d20455845435554494f4e2024242424244163636f756e743a44657374696e61" + "74696f6e3a4163636f756e744163636f756e74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e65" + "54727573746c696e65206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43686563" + "6b436865636b206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564" + "656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e44656c656761746544656c65" + "67617465206f626a656374206578697374732c2070726f63656564696e6720776974682065" + "7363726f772066696e6973682e4465706f736974507265617574684465706f736974507265" + "61757468206f626a656374206578697374732c2070726f63656564696e6720776974682065" + "7363726f772066696e6973682e444944444944206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e457363726f77457363" + "726f77206f626a656374206578697374732c2070726f63656564696e672077697468206573" + "63726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f62" + "6a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" + "696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070" + "726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f" + "666665724e46546f6b656e4f66666572206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e4f666665724f66666572206f" "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f6365656469" - "6e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a65" - "6374206578697374732c2070726f63656564696e67207769746820657363726f772066696e" - "6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c4372656465" - "6e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e44656c656761746544656c6567617465206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e4465706f736974507265617574684465706f73697450726561757468206f626a656374" + "66696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578" + "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" + "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" + "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e54" + "69636b65745469636b6574206f626a656374206578697374732c2070726f63656564696e67" + "207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374" "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e444944444944206f626a656374206578697374732c2070726f63656564696e67207769" - "746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" - "6578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" - "2e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" - "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b" - "656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e" - "4f66666572206f626a656374206578697374732c2070726f63656564696e67207769746820" - "657363726f772066696e6973682e4f666665724f66666572206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e50617943" - "68616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564" - "446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5369676e" - "65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574" - "206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" - "772066696e6973682e5661756c745661756c74206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e43757272656e742073" - "65712076616c75653a456e636f756e7465726564206572726f725f636f64653a4279746520" - "61727261792077617320657870656374656420746f20686176652074686973206d616e7920" - "62797465733a2042797465206172726179206861642074686973206d616e79206279746573" - "3a20004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" - "2d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d75" - "6c746976616c7565"; + "682e43757272656e74207365712076616c75653a0041ad8ac0000b68456e636f756e746572" + "6564206572726f725f636f64653a4279746520617272617920776173206578706563746564" + "20746f20686176652074686973206d616e792062797465733a204279746520617272617920" + "6861642074686973206d616e792062797465733a20004d0970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e39" + "302e30202831313539653738633420323032352d30392d313429002c0f7461726765745f66" + "65617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" @@ -9924,8 +9931,8 @@ extern std::string const codecovTestsWasmHex = "3b01382000200028005b36003b2000200029005f37003f200041386a41204100100b410141" "8881c0004110103e2003410036020020024200370300200042003703584181802020014114" "100c411441e48cc000411c103e200341003602002002420037030020004200370358410141" - "81802020014114100d411441808dc0004114103e02402001410020016b41037122036a2202" - "20014d0d0020030440200321050340200141003a0000200141016a2101200541016b22050d" + "81802020014114100d411441808dc0004114103e024020012001410020016b41037122036a" + "22024f0d0020030440200321050340200141003a0000200141016a2101200541016b22050d" "000b0b200341016b4107490d000340200141003a0000200141076a41003a0000200141066a" "41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a00002001" "41026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c400" @@ -10157,158 +10164,117 @@ extern std::string const codecovTestsWasmHex = "6f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f" "6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c" "656e677468004d0970726f64756365727302086c616e6775616765010452757374000c7072" - "6f6365737365642d6279010572757374631d312e38352e3120283465623136313235302032" - "3032352d30332d31352900490f7461726765745f6665617475726573042b0f6d757461626c" - "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b" - "0a6d756c746976616c7565"; + "6f6365737365642d6279010572757374631d312e39302e3020283131353965373863342032" + "3032352d30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c" + "652d676c6f62616c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = - "0061736d0100000001430860057f7f7f7f7f017f60047e7f7f7f017f60047f7f7f7f017f60" - "057f7e7f7f7f017f60077f7f7f7f7f7f7f017f60067f7f7f7f7f7f017f60037f7f7e017f60" - "00017f02c9020e08686f73745f6c6962057472616365000008686f73745f6c69620e666c6f" - "61745f66726f6d5f696e74000108686f73745f6c69620f666c6f61745f66726f6d5f75696e" - "74000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73" - "745f6c696209666c6f61745f736574000308686f73745f6c69620d666c6f61745f636f6d70" - "617265000208686f73745f6c696209666c6f61745f616464000408686f73745f6c69620e66" - "6c6f61745f7375627472616374000408686f73745f6c69620e666c6f61745f6d756c746970" - "6c79000408686f73745f6c69620c666c6f61745f646976696465000408686f73745f6c6962" - "09666c6f61745f706f77000508686f73745f6c69620974726163655f6e756d000608686f73" - "745f6c69620a666c6f61745f726f6f74000508686f73745f6c696209666c6f61745f6c6f67" - "00000302010705030100110619037f01418080c0000b7f0041b48ac0000b7f0041c08ac000" + "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" + "017f60067f7f7f7f7f7f017f60047e7f7f7f017f60057f7e7f7f7f017f60037f7f7e017f60" + "00017f02c9020e08686f73745f6c6962057472616365000108686f73745f6c69620e666c6f" + "61745f66726f6d5f696e74000408686f73745f6c69621274726163655f6f70617175655f66" + "6c6f6174000208686f73745f6c69620f666c6f61745f66726f6d5f75696e74000108686f73" + "745f6c696209666c6f61745f736574000508686f73745f6c69620d666c6f61745f636f6d70" + "617265000208686f73745f6c696209666c6f61745f616464000008686f73745f6c69620e66" + "6c6f61745f7375627472616374000008686f73745f6c69620e666c6f61745f6d756c746970" + "6c79000008686f73745f6c69620c666c6f61745f646976696465000008686f73745f6c6962" + "09666c6f61745f706f77000308686f73745f6c69620974726163655f6e756d000608686f73" + "745f6c69620a666c6f61745f726f6f74000308686f73745f6c696209666c6f61745f6c6f67" + "00010302010705030100110619037f01418080c0000b7f0041d28ac0000b7f0041e08ac000" "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020acf1301cc1301027f23808080800041206b22002480808080" - "00418080c08000411d4100410041001080808080001a2000420037031002400240428ce000" - "200041106a410841001081808080004108470d00419d80c080004117200041106a41084101" - "1080808080001a0c010b41b480c08000411e4100410041001080808080001a0b2000428ce0" - "0037031802400240200041186a4108200041106a410841001082808080004108470d0041d2" - "80c080004117200041106a41081083808080001a0c010b41e980c08000411e410041004100" - "1080808080001a0b02400240410242fb00200041106a410841001084808080004108470d00" - "418781c080004121200041106a41081083808080001a0c010b41a881c08000412641004100" - "41001080808080001a0b41ce81c08000411541e381c0800041081083808080001a41f381c0" - "8000411641eb81c0800041081083808080001a418982c08000411b41004100410010808080" - "80001a20004200370318024002404201200041186a410841001081808080004108470d0041" - "a482c08000410f200041186a41081083808080001a0c010b41b382c0800041164100410041" - "001080808080001a0b02400240200041186a410841e381c0800041081085808080000d0041" - "c982c08000411b4100410041001080808080001a0c010b41e482c08000411b410041004100" - "1080808080001a0b02400240200041186a410841eb81c0800041081085808080004101470d" - "0041ff82c0800041234100410041001080808080001a0c010b41a283c08000412441004100" - "41001080808080001a0b0240024041eb81c080004108200041186a41081085808080004102" - "470d0041c683c0800041234100410041001080808080001a0c010b41e983c0800041244100" - "410041001080808080001a0b418d84c0800041204100410041001080808080001a200042d4" - "87b6f4c7d4b1c000370310410921010340200041106a410841e381c080004108200041106a" - "410841001086808080001a2001417f6a22010d000b20004200370318420a200041186a4108" - "41001081808080001a02400240200041186a4108200041106a41081085808080000d0041ad" - "84c0800041144100410041001080808080001a0c010b41c184c08000411341004100410010" - "80808080001a0b410b21010340200041106a410841e381c080004108200041106a41084100" - "1087808080001a2001417f6a22010d000b02400240200041106a410841eb81c08000410810" - "85808080000d0041d484c0800041194100410041001080808080001a0c010b41ed84c08000" - "41184100410041001080808080001a0b418585c0800041234100410041001080808080001a" - "20004200370300420a2000410841001081808080001a200042d487b6f4c7d4b1c000370308" - "410621010340200041086a410820004108200041086a410841001088808080001a2001417f" - "6a22010d000b2000420037031042c0843d200041106a410841001081808080001a02400240" - "200041106a4108200041086a41081085808080000d0041a885c08000411941004100410010" - "80808080001a0c010b41c185c0800041184100410041001080808080001a0b410721010340" - "200041086a410820004108200041086a410841001089808080001a2001417f6a22010d000b" - "20004200370318417f4201200041186a410841001084808080001a02400240200041086a41" - "08200041186a41081085808080000d0041d985c0800041174100410041001080808080001a" - "0c010b41f085c0800041164100410041001080808080001a0b418686c08000411741004100" - "41001080808080001a2000420037030841e381c0800041084103200041086a41084100108a" - "808080001a419d86c080004112200041086a41081083808080001a41eb81c0800041084106" - "200041086a41084100108a808080001a41af86c080004118200041086a4108108380808000" - "1a200042003703104209200041106a410841001081808080001a200041106a410841022000" - "41086a41084100108a808080001a41c786c080004114200041086a41081083808080001a20" - "0041106a41084100200041086a41084100108a808080001a41db86c080004117200041086a" - "41081083808080001a200042003703184200200041186a410841001081808080001a200041" - "186a41084102200041086a41084100108a808080001a41f286c080004114200041086a4108" - "1083808080001a418687c080004138200041186a41084100200041086a41084100108a8080" - "8000ac108b808080001a41be87c0800041184100410041001080808080001a200042003703" - "084209200041086a410841001081808080001a20004200370310200041086a410841022000" - "41106a41084100108c808080001a41d687c080004112200041106a41081083808080001a20" - "0041086a41084103200041106a41084100108c808080001a41e887c080004112200041106a" - "41081083808080001a2000420037031842c0843d200041186a410841001081808080001a20" - "0041186a41084103200041106a41084100108c808080001a41fa87c080004118200041106a" - "41081083808080001a200041186a41084106200041106a41084100108c808080001a419288" - "c08000411c200041106a41081083808080001a41ae88c08000411741004100410010808080" - "80001a2000420037031042c0843d200041106a410841001081808080001a20004200370318" - "200041106a4108200041186a41084100108d808080001a41c588c080004114200041186a41" - "081083808080001a41d988c08000411a4100410041001080808080001a2000420037031841" - "e381c08000410841eb81c080004108200041186a410841001088808080001a0240024041eb" - "81c080004108200041186a41081085808080000d0041f388c0800041164100410041001080" - "808080001a0c010b418989c0800041154100410041001080808080001a0b41eb81c0800041" - "0841eb81c080004108200041186a410841001088808080001a0240024041e381c080004108" - "200041186a41081085808080000d00419e89c0800041174100410041001080808080001a0c" - "010b41b589c0800041164100410041001080808080001a0b41cb89c08000411a4100410041" - "001080808080001a2000420037031020004200370318420a200041186a4108410010818080" - "80001a41e381c080004108200041186a4108200041106a410841001089808080001a41e589" - "c080004119200041106a41081083808080001a41e381c080004108200041106a4108200041" - "106a410841001089808080001a41fe89c08000410f200041106a41081083808080001a0240" - "0240200041186a4108200041106a41081085808080000d00418d8ac0800041144100410041" - "001080808080001a0c010b41a18ac0800041134100410041001080808080001a0b20004120" - "6a24808080800041010b0bbe0a0100418080c0000bb40a0a24242420746573745f666c6f61" - "745f66726f6d5f7761736d202424242020666c6f61742066726f6d20693634203132333030" - "3a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61" - "742066726f6d207536342031323330303a2020666c6f61742066726f6d2075363420313233" - "30303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e74697373" - "61203132333a2020666c6f61742066726f6d2065787020322c206d616e746973736120333a" - "206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c6800094" - "838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573" - "745f666c6f61745f636f6d70617265202424242020666c6f61742066726f6d20313a202066" - "6c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d20" - "464c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e4520" - "20666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e45202066" - "6c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c" - "4f41545f4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41" - "545f4e454741544956455f4f4e4520213c20666c6f61742066726f6d20310a242424207465" - "73745f666c6f61745f6164645f737562747261637420242424202072657065617465642061" - "64643a20676f6f6420207265706561746564206164643a2062616420207265706561746564" - "2073756274726163743a20676f6f64202072657065617465642073756274726163743a2062" - "61640a24242420746573745f666c6f61745f6d756c7469706c795f64697669646520242424" - "20207265706561746564206d756c7469706c793a20676f6f6420207265706561746564206d" - "756c7469706c793a2062616420207265706561746564206469766964653a20676f6f642020" - "7265706561746564206469766964653a206261640a24242420746573745f666c6f61745f70" - "6f77202424242020666c6f61742063756265206f6620313a2020666c6f6174203674682070" - "6f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020666c6f61" - "742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a" - "2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" - "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f" - "6f74202424242020666c6f61742073717274206f6620393a2020666c6f6174206362727420" - "6f6620393a2020666c6f61742063627274206f6620313030303030303a2020666c6f617420" - "36746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c" - "6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f66" - "6c6f61745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f64" - "20206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d" - "313a20676f6f6420206e656761746520636f6e7374202d313a206261640a24242420746573" - "745f666c6f61745f696e76657274202424242020696e76657274206120666c6f6174206672" - "6f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20" - "676f6f642020696e766572742074776963653a20626164009c06046e616d65001110666c6f" - "61745f74657374732e7761736d01e1050f002b5f5a4e387872706c5f73746434686f737435" - "7472616365313768303332393563316538663365373233614501355f5a4e387872706c5f73" - "746434686f73743134666c6f61745f66726f6d5f696e743137683032306436373439326164" - "39346333304502365f5a4e387872706c5f73746434686f73743135666c6f61745f66726f6d" - "5f75696e74313768346166373638366538353062383432364503395f5a4e387872706c5f73" - "746434686f7374313874726163655f6f70617175655f666c6f617431376831396639386666" - "35663362313932336245042f5f5a4e387872706c5f73746434686f737439666c6f61745f73" - "6574313768323964346230383964626561326664624505345f5a4e387872706c5f73746434" - "686f73743133666c6f61745f636f6d70617265313768346362313239626634623330373233" - "6445062f5f5a4e387872706c5f73746434686f737439666c6f61745f616464313768383661" - "336165636435336234643937374507355f5a4e387872706c5f73746434686f73743134666c" - "6f61745f7375627472616374313768653033313036323931393464333931364508355f5a4e" - "387872706c5f73746434686f73743134666c6f61745f6d756c7469706c7931376830323839" - "3337633039656534323630644509335f5a4e387872706c5f73746434686f73743132666c6f" - "61745f64697669646531376834363036323038303562623237353632450a2f5f5a4e387872" - "706c5f73746434686f737439666c6f61745f706f7731376833326463303662646430303338" - "626331450b2f5f5a4e387872706c5f73746434686f73743974726163655f6e756d31376830" - "336535336633646539393463633033450c315f5a4e387872706c5f73746434686f73743130" - "666c6f61745f726f6f7431376863656632313139376565656136653630450d2f5f5a4e3878" - "72706c5f73746434686f737439666c6f61745f6c6f67313768323530663038303633353663" - "35653639450e0666696e697368071201000f5f5f737461636b5f706f696e746572090a0100" - "072e726f64617461004d0970726f64756365727302086c616e677561676501045275737400" - "0c70726f6365737365642d6279010572757374631d312e38382e3020283662303062633338" - "3820323032352d30362d3233290094010f7461726765745f6665617475726573082b0b6275" - "6c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469" - "726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c" - "6f62616c732b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e6365" - "2d74797065732b087369676e2d657874"; + "5f686561705f6261736503020af20e01ef0e01047f230041206b22012400418080c000411d" + "41004100410010001a200142003703100240428ce000200141106a22004108410010014108" + "460440419d80c00041172000410810021a41b480c000411e20004108410110001a0c010b41" + "d280c000411e41004100410010001a0b2001428ce0003703180240200141186a4108200141" + "106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000" + "411e41004100410010001a0b0240410242fb00200141106a22004108410010044108460440" + "41a581c00041212000410810021a0c010b41c681c000412641004100410010001a0b41ec81" + "c0004115418182c000410810021a419182c0004116418982c000410810021a41a782c00041" + "1b41004100410010001a2001420037031802404201200141186a2200410841001001410846" + "044041c282c000410f2000410810021a0c010b41d182c000411641004100410010001a0b02" + "40200141186a4108418182c0004108100545044041e782c000411b41004100410010001a0c" + "010b418283c000411b41004100410010001a0b0240200141186a4108418982c00041081005" + "4101460440419d83c000412341004100410010001a0c010b41c083c0004124410041004100" + "10001a0b0240418982c0004108200141186a41081005410246044041e483c0004123410041" + "00410010001a0c010b418784c000412441004100410010001a0b41ab84c000412041004100" + "410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a220241084181" + "82c000410820024108410010061a200041016b22000d000b20014200370318420a20014118" + "6a22004108410010011a02402000410820024108100545044041cb84c00041144100410041" + "0010001a0c010b41df84c000411341004100410010001a0b410b21000340200141106a2202" + "4108418182c000410820024108410010071a200041016b22000d000b024020024108418982" + "c0004108100545044041f284c000411941004100410010001a0c010b418b85c00041184100" + "4100410010001a0b41a385c000412341004100410010001a20014200370300420a20014108" + "410010011a200142d487b6f4c7d4b1c000370308410621000340200141086a220241082001" + "410820024108410010081a200041016b22000d000b2001420037031042c0843d200141106a" + "22004108410010011a02402000410820024108100545044041c685c0004119410041004100" + "10001a0c010b41df85c000411841004100410010001a0b410721000340200141086a220241" + "082001410820024108410010091a200041016b22000d000b20014200370318417f42012001" + "41186a22004108410010041a02402002410820004108100545044041f785c0004117410041" + "00410010001a0c010b418e86c000411641004100410010001a0b41a486c000411741004100" + "410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb" + "86c00041122000410810021a418982c00041084106200041084100100a1a41cd86c0004118" + "2000410810021a200142003703104209200141106a22024108410010011a20024108410220" + "0041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a" + "41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" + "200341084102200041084100100a1a419087c00041142000410810021a41a487c000413820" + "0341084100200041084100100aac100b1a41dc87c000411841004100410010001a20014200" + "370308420920004108410010011a20014200370310200041084102200241084100100c1a41" + "f487c00041122002410810021a200041084103200241084100100c1a418688c00041122002" + "410810021a2001420037031842c0843d20034108410010011a200341084103200241084100" + "100c1a419888c00041182002410810021a200341084106200241084100100c1a41b088c000" + "411c2002410810021a41cc88c000411741004100410010001a2001420037031042c0843d20" + "024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003" + "410810021a41f788c000411a41004100410010001a20014200370318418182c00041084189" + "82c000410820034108410010081a0240418982c0004108200341081005450440419189c000" + "411641004100410010001a0c010b41a789c000411541004100410010001a0b418982c00041" + "08418982c0004108200141186a22004108410010081a0240418182c0004108200041081005" + "45044041bc89c000411741004100410010001a0c010b41d389c00041164100410041001000" + "1a0b41e989c000411a41004100410010001a2001420037031020014200370318420a200141" + "186a22024108410010011a418182c000410820024108200141106a22004108410010091a41" + "838ac00041192000410810021a418182c00041082000410820004108410010091a419c8ac0" + "00410f2000410810021a02402002410820004108100545044041ab8ac00041144100410041" + "0010001a0c010b41bf8ac000411341004100410010001a0b200141206a240041010b0bdc0a" + "0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d2024" + "24242020666c6f61742066726f6d206936342031323330303a2020666c6f61742066726f6d" + "20693634203132333030206173204845583a2020666c6f61742066726f6d20693634203132" + "3330303a206661696c65642020666c6f61742066726f6d207536342031323330303a202066" + "6c6f61742066726f6d207536342031323330303a206661696c65642020666c6f6174206672" + "6f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065" + "787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20" + "636f6e737420313ad4838d7ea4c6800094838d7ea4c680002020666c6f61742066726f6d20" + "636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d706172652024242420" + "20666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c656420" + "20666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f" + "6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41" + "545f4e454741544956455f4f4e452020666c6f61742066726f6d203120213e20464c4f4154" + "5f4e454741544956455f4f4e452020464c4f41545f4e454741544956455f4f4e45203c2066" + "6c6f61742066726f6d20312020464c4f41545f4e454741544956455f4f4e4520213c20666c" + "6f61742066726f6d20310a24242420746573745f666c6f61745f6164645f73756274726163" + "742024242420207265706561746564206164643a20676f6f64202072657065617465642061" + "64643a20626164202072657065617465642073756274726163743a20676f6f642020726570" + "65617465642073756274726163743a206261640a24242420746573745f666c6f61745f6d75" + "6c7469706c795f6469766964652024242420207265706561746564206d756c7469706c793a" + "20676f6f6420207265706561746564206d756c7469706c793a206261642020726570656174" + "6564206469766964653a20676f6f6420207265706561746564206469766964653a20626164" + "0a24242420746573745f666c6f61745f706f77202424242020666c6f61742063756265206f" + "6620313a2020666c6f61742036746820706f776572206f66202d313a2020666c6f61742073" + "7175617265206f6620393a2020666c6f61742030746820706f776572206f6620393a202066" + "6c6f617420737175617265206f6620303a2020666c6f61742030746820706f776572206f66" + "20302028657870656374696e6720494e56414c49445f504152414d53206572726f72293a0a" + "24242420746573745f666c6f61745f726f6f74202424242020666c6f61742073717274206f" + "6620393a2020666c6f61742063627274206f6620393a2020666c6f61742063627274206f66" + "20313030303030303a2020666c6f61742036746820726f6f74206f6620313030303030303a" + "0a24242420746573745f666c6f61745f6c6f672024242420206c6f675f3130206f66203130" + "30303030303a0a24242420746573745f666c6f61745f6e65676174652024242420206e6567" + "61746520636f6e737420313a20676f6f6420206e656761746520636f6e737420313a206261" + "6420206e656761746520636f6e7374202d313a20676f6f6420206e656761746520636f6e73" + "74202d313a206261640a24242420746573745f666c6f61745f696e76657274202424242020" + "696e76657274206120666c6f61742066726f6d2031303a2020696e7665727420616761696e" + "3a2020696e766572742074776963653a20676f6f642020696e766572742074776963653a20" + "626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d6279010572757374631d312e39302e30202831313539653738633420323032" + "352d30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d" + "676c6f62616c732b087369676e2d657874"; extern std::string const float0Hex = "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" From 55772a0d07341c63182807e30c6e60d3c0b5bdcd Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Oct 2025 17:50:43 -0400 Subject: [PATCH 085/212] add sfData preflight checks + tests (#5839) --- src/test/app/Escrow_test.cpp | 113 ++++++++++++++++++ .../app/wasm_fixtures/all_keylets/src/lib.rs | 4 +- src/test/app/wasm_fixtures/fixtures.cpp | 18 +++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/test/app/wasm_fixtures/updateData.c | 13 ++ src/xrpld/app/tx/detail/Escrow.cpp | 20 +++- 6 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 src/test/app/wasm_fixtures/updateData.c diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 13e7471d656..3d64e0783a5 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -1730,6 +1730,14 @@ struct Escrow_test : public beast::unit_test::suite fee(txnFees), ter(temDISABLED)); env.close(); + + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + escrow::data("00112233"), + fee(txnFees), + ter(temDISABLED)); + env.close(); } { @@ -1757,6 +1765,44 @@ struct Escrow_test : public beast::unit_test::suite env.close(); } + { + // Data without FinishFunction + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + std::string longData(4, 'A'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data > max length + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // string of length maxWasmDataLength * 2 + 2 + std::string longData(maxWasmDataLength * 2 + 2, 'B'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + Env env( *this, envconfig([](std::unique_ptr cfg) { @@ -2286,6 +2332,72 @@ struct Escrow_test : public beast::unit_test::suite } } + void + testUpdateDataOnFailure(FeatureBitset features) + { + testcase("Update escrow data on failure"); + + using namespace jtx; + using namespace std::chrono; + + // wasm that always fails + static auto const wasmHex = updateDataWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, alice, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + + auto const allowance = 1'015; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == -256, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + auto const sle = env.le(keylet::escrow(alice, seq)); + if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) + BEAST_EXPECTS( + checkVL(sle, sfData, "Data"), + strHex(sle->getFieldVL(sfData))); + } + } + void testAllHostFunctions(FeatureBitset features) { @@ -2478,6 +2590,7 @@ struct Escrow_test : public beast::unit_test::suite testCreateFinishFunctionPreflight(features); testFinishWasmFailures(features); testFinishFunction(features); + testUpdateDataOnFailure(features); // TODO: Update module with new host functions testAllHostFunctions(features); diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs index 970db7bd50b..6171045522f 100644 --- a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -4,8 +4,8 @@ extern crate std; use crate::host::{Error, Result, Result::Err, Result::Ok}; -use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::ledger_object; use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; @@ -13,7 +13,7 @@ use xrpl_std::core::types::amount::currency_code::CurrencyCode; use xrpl_std::core::types::amount::mpt_id::MptId; use xrpl_std::core::types::keylets; use xrpl_std::host; -use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; +use xrpl_std::host::trace::{trace, trace_account, trace_data, trace_num, DataRepr}; use xrpl_std::sfield; #[unsafe(no_mangle)] diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6ad3e336399..727ddeb4fe1 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -10330,3 +10330,21 @@ extern std::string const disabledFloatHex = "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" "090a150202000b100043000000c54300200045921a41010b"; + +extern std::string const updateDataWasmHex = + "0061736d01000000010e0360027f7f017f6000006000017f02130103656e760b7570646174" + "655f64617461000003030201020503010002063f0a7f01419088040b7f004180080b7f0041" + "85080b7f004190080b7f00419088040b7f004180080b7f00419088040b7f00418080080b7f" + "0041000b7f0041010b07aa010c066d656d6f72790200115f5f7761736d5f63616c6c5f6374" + "6f727300010666696e69736800020c5f5f64736f5f68616e646c6503010a5f5f646174615f" + "656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f" + "676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e" + "6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a3f02" + "02000b3a01017f230041106b220024002000410c6a4184082d00003a000020004180082800" + "00360208200041086a410410001a200041106a240041807e0b0b0b01004180080b04446174" + "61007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f3139" + "2e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c76" + "6d2f6c6c766d2d70726f6a6563742061623462356132646235383239353861663165653330" + "3861373930636664623432626432343732302900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e" + "63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 0e7e3785ea8..f10b493900a 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -50,3 +50,5 @@ extern std::string const floatTestsWasmHex; extern std::string const float0Hex; extern std::string const disabledFloatHex; + +extern std::string const updateDataWasmHex; diff --git a/src/test/app/wasm_fixtures/updateData.c b/src/test/app/wasm_fixtures/updateData.c new file mode 100644 index 00000000000..8436f1c3905 --- /dev/null +++ b/src/test/app/wasm_fixtures/updateData.c @@ -0,0 +1,13 @@ +#include + +int32_t +update_data(uint8_t const*, int32_t); + +int +finish() +{ + uint8_t buf[] = "Data"; + update_data(buf, sizeof(buf) - 1); + + return -256; +} diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 25dcc0415a0..6f73faa3233 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -137,7 +137,8 @@ EscrowCreate::calculateBaseFee(ReadView const& view, STTx const& tx) bool EscrowCreate::checkExtraFeatures(PreflightContext const& ctx) { - if (ctx.tx.isFieldPresent(sfFinishFunction) && + if ((ctx.tx.isFieldPresent(sfFinishFunction) || + ctx.tx.isFieldPresent(sfData)) && !ctx.rules.enabled(featureSmartEscrow)) return false; @@ -225,6 +226,22 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temDISABLED; } + if (ctx.tx.isFieldPresent(sfData)) + { + if (!ctx.tx.isFieldPresent(sfFinishFunction)) + { + JLOG(ctx.j.debug()) + << "EscrowCreate with Data requires FinishFunction"; + return temMALFORMED; + } + auto const data = ctx.tx.getFieldVL(sfData); + if (data.size() > maxWasmDataLength) + { + JLOG(ctx.j.debug()) << "EscrowCreate.Data bad size " << data.size(); + return temMALFORMED; + } + } + if (ctx.tx.isFieldPresent(sfFinishFunction)) { auto const code = ctx.tx.getFieldVL(sfFinishFunction); @@ -1317,6 +1334,7 @@ EscrowFinish::doApply() if (auto const& data = ledgerDataProvider.getData(); data.has_value()) { slep->setFieldVL(sfData, makeSlice(*data)); + ctx_.view().update(slep); } if (re.has_value()) From c41e52f57a30ba1257244f9a33602ecb927b7d4e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 6 Oct 2025 16:27:21 -0400 Subject: [PATCH 086/212] Move Smart Escrow tests to separate file (#5849) --- src/test/app/EscrowSmart_test.cpp | 935 ++++++++++++++++++++++++++++++ src/test/app/Escrow_test.cpp | 881 +--------------------------- 2 files changed, 937 insertions(+), 879 deletions(-) create mode 100644 src/test/app/EscrowSmart_test.cpp diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp new file mode 100644 index 00000000000..6eaed01e2cd --- /dev/null +++ b/src/test/app/EscrowSmart_test.cpp @@ -0,0 +1,935 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +namespace ripple { +namespace test { + +struct EscrowSmart_test : public beast::unit_test::suite +{ + void + testCreateFinishFunctionPreflight(FeatureBitset features) + { + testcase("Test preflight checks involving FinishFunction"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + static auto wasmHex = ledgerSqnWasmHex; + + { + // featureSmartEscrow disabled + Env env(*this, features - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = env.current()->fees().base + 1000; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temDISABLED)); + env.close(); + + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + escrow::data("00112233"), + fee(txnFees), + ter(temDISABLED)); + env.close(); + } + + { + // FinishFunction > max length + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 10; // 10 bytes + return cfg; + }), + features); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // 11-byte string + std::string longWasmHex = "00112233445566778899AA"; + env(escrowCreate, + escrow::finish_function(longWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data without FinishFunction + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + std::string longData(4, 'A'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // Data > max length + Env env(*this, features); + XRPAmount const txnFees = env.current()->fees().base + 100000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // string of length maxWasmDataLength * 2 + 2 + std::string longData(maxWasmDataLength * 2 + 2, 'B'); + env(escrowCreate, + escrow::data(longData), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->START_UP = Config::FRESH; + return cfg; + }), + features); + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto escrowCreate = escrow::create(alice, carol, XRP(500)); + + // Success situations + { + // FinishFunction + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 20s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + Condition + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 30s), + escrow::condition(escrow::cb1), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 40s), + escrow::finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + CancelAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 50s), + escrow::condition(escrow::cb1), + escrow::finish_time(env.now() + 2s), + fee(txnFees)); + env.close(); + } + + // Failure situations (i.e. all other combinations) + { + // only FinishFunction + env(escrowCreate, + escrow::finish_function(wasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + Condition + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction + FinishAfter + Condition + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + escrow::finish_time(env.now() + 2s), + fee(txnFees), + ter(temBAD_EXPIRATION)); + env.close(); + } + { + // FinishFunction 0 length + env(escrowCreate, + escrow::finish_function(""), + escrow::cancel_time(env.now() + 60s), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + { + // Not enough fees + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 70s), + fee(txnFees - 1), + ter(telINSUF_FEE_P)); + env.close(); + } + + { + // FinishFunction nonexistent host function + // pub fn finish() -> bool { + // unsafe { host_lib::bad() >= 5 } + // } + auto const badWasmHex = + "0061736d010000000105016000017f02100108686f73745f6c696203626164" + "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" + "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" + "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" + "726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235" + "3020323032352d30332d31352900490f7461726765745f6665617475726573" + "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" + "65666572656e63652d74797065732b0a6d756c746976616c7565"; + env(escrowCreate, + escrow::finish_function(badWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temBAD_WASM)); + env.close(); + } + } + + void + testFinishWasmFailures(FeatureBitset features) + { + testcase("EscrowFinish Smart Escrow failures"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + static auto wasmHex = ledgerSqnWasmHex; + + { + // featureSmartEscrow disabled + Env env(*this, features - featureSmartEscrow); + env.fund(XRP(5000), alice, carol); + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrow::finish(carol, alice, 1), + fee(txnFees), + escrow::comp_allowance(4), + ter(temDISABLED)); + env.close(); + } + + { + // ComputationAllowance > max compute limit + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 1'000; // in gas + return cfg; + }), + features); + env.fund(XRP(5000), alice, carol); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + auto const allowance = 1'001; + env(escrow::finish(carol, alice, 1), + fee(env.current()->fees().base + allowance), + escrow::comp_allowance(allowance), + ter(temBAD_LIMIT)); + } + + Env env(*this, features); + + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + XRPAmount const txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env.fund(XRP(5000), alice, carol); + + // create escrow + auto const seq = env.seq(alice); + env(escrow::create(alice, carol, XRP(500)), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + + { + // no ComputationAllowance field + env(escrow::finish(carol, alice, seq), + ter(tefWASM_FIELD_NOT_INCLUDED)); + } + + { + // ComputationAllowance value of 0 + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(0), + ter(temBAD_LIMIT)); + } + + { + // not enough fees + // This function takes 4 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 3; + env(escrow::finish(carol, alice, seq), + fee(finishFee), + escrow::comp_allowance(4), + ter(telINSUF_FEE_P)); + } + + { + // not enough gas + // This function takes 4 gas + // In testing, 1 gas costs 1 drop + auto const finishFee = env.current()->fees().base + 4; + env(escrow::finish(carol, alice, seq), + fee(finishFee), + escrow::comp_allowance(2), + ter(tecFAILED_PROCESSING)); + } + + { + // ComputationAllowance field included w/no FinishFunction on + // escrow + auto const seq2 = env.seq(alice); + env(escrow::create(alice, carol, XRP(500)), + escrow::finish_time(env.now() + 10s), + escrow::cancel_time(env.now() + 100s)); + env.close(); + + auto const allowance = 100; + env(escrow::finish(carol, alice, seq2), + fee(env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1), + escrow::comp_allowance(allowance), + ter(tefNO_WASM)); + } + } + + void + testFinishFunction(FeatureBitset features) + { + testcase("Example escrow function"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + auto const& wasmHex = ledgerSqnWasmHex; + std::uint32_t const allowance = 66; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto [createFee, finishFee] = [&]() { + Env env(*this, features); + auto createFee = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + return std::make_pair(createFee, finishFee); + }(); + + { + // basic FinishFunction situation + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + env.close(); + + { + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + } + + env(escrow::finish(alice, alice, seq), + fee(finishFee), + escrow::comp_allowance(allowance), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 5, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + Condition + Env env(*this, features); + env.fund(XRP(5000), alice, carol); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto const seq = env.seq(alice); + // create escrow + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::condition(escrow::cb1), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + auto const conditionFinishFee = finishFee + + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // no fulfillment provided, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function fails + env(escrow::finish(carol, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + env.close(); + // no fulfillment provided, function succeeds + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // wrong fulfillment provided, function succeeds + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb2), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tecCRYPTOCONDITION_ERROR)); + // fulfillment provided, function succeeds, tx succeeds + env(escrow::finish(alice, alice, seq), + escrow::condition(escrow::cb1), + escrow::fulfillment(escrow::fb1), + escrow::comp_allowance(allowance), + fee(conditionFinishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + FinishAfter + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto const ts = env.now() + 97s; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(ts), + escrow::cancel_time(env.now() + 1000s), + fee(createFee)); + env.close(); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 1), + ter(tecNO_PERMISSION)); + env.close(); + // finish time hasn't passed, function succeeds + for (; env.now() < ts; env.close()) + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 2), + ter(tecNO_PERMISSION)); + + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee + 1), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 13, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + + { + // FinishFunction + FinishAfter #2 + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + // Don't close the ledger here + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + + // finish time hasn't passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecNO_PERMISSION)); + env.close(); + + // finish time has passed, function fails + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + env.meta()->getFieldU32(sfGasUsed) == allowance, + std::to_string(env.meta()->getFieldU32(sfGasUsed))); + env.close(); + // finish time has passed, function succeeds, tx succeeds + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 6, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + } + + void + testUpdateDataOnFailure(FeatureBitset features) + { + testcase("Update escrow data on failure"); + + using namespace jtx; + using namespace std::chrono; + + // wasm that always fails + static auto const wasmHex = updateDataWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, alice, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + + auto const allowance = 1'015; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecWASM_REJECTED)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == -256, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + auto const sle = env.le(keylet::escrow(alice, seq)); + if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) + BEAST_EXPECTS( + checkVL(sle, sfData, "Data"), + strHex(sle->getFieldVL(sfData))); + } + } + + void + testAllHostFunctions(FeatureBitset features) + { + testcase("Test all host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = allHostFunctionsWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env(*this, features); + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 11s), + escrow::cancel_time(env.now() + 100s), + escrow::data("1000000000"), // 1000 XRP in drops + fee(txnFees)); + env.close(); + + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + { + env.require(balance(alice, XRP(4000) - txnFees)); + env.require(balance(carol, XRP(5000))); + + auto const allowance = 1'000'000; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + + // FinishAfter time hasn't passed + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tecNO_PERMISSION)); + env.close(); + env.close(); + env.close(); + + // reduce the destination balance + env(pay(carol, alice, XRP(4500))); + env.close(); + env.close(); + + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == 38'571, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); + + env.close(); + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + } + + void + testKeyletHostFunctions(FeatureBitset features) + { + testcase("Test all keylet host functions"); + + using namespace jtx; + using namespace std::chrono; + + // TODO: create wasm module for all host functions + static auto wasmHex = allKeyletsWasmHex; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + { + Env env{*this}; + env.fund(XRP(10000), alice, carol); + + BEAST_EXPECT(env.seq(alice) == 4); + BEAST_EXPECT(env.ownerCount(alice) == 0); + + // base objects that need to be created first + auto const tokenId = + token::getNextID(env, alice, 0, tfTransferable); + env(token::mint(alice, 0u), txflags(tfTransferable)); + env(trust(alice, carol["USD"](1'000'000))); + env.close(); + BEAST_EXPECT(env.seq(alice) == 6); + BEAST_EXPECT(env.ownerCount(alice) == 2); + + // set up a bunch of objects to check their keylets + AMM amm(env, carol, XRP(10), carol["USD"](1000)); + env(check::create(alice, carol, XRP(100))); + env(credentials::create(alice, alice, "termsandconditions")); + env(delegate::set(alice, carol, {"TrustSet"})); + env(deposit::auth(alice, carol)); + env(did::set(alice), did::data("alice_did")); + env(escrow::create(alice, carol, XRP(100)), + escrow::finish_time(env.now() + 100s)); + MPTTester mptTester{env, alice, {.fund = false}}; + mptTester.create(); + mptTester.authorize({.account = carol}); + env(token::createOffer(carol, tokenId, XRP(100)), + token::owner(alice)); + env(offer(alice, carol["GBP"](0.1), XRP(100))); + env(create(alice, carol, XRP(1000), 100s, alice.pk())); + pdomain::Credentials credentials{{alice, "first credential"}}; + env(pdomain::setTx(alice, credentials)); + env(signers(alice, 1, {{carol, 1}})); + env(ticket::create(alice, 1)); + Vault vault{env}; + auto [tx, _keylet] = + vault.create({.owner = alice, .asset = xrpIssue()}); + env(tx); + env.close(); + + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); + if (BEAST_EXPECTS( + env.seq(alice) == 20, std::to_string(env.seq(alice)))) + { + auto const seq = env.seq(alice); + XRPAmount txnFees = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + env(escrow::create(alice, carol, XRP(1000)), + escrow::finish_function(wasmHex), + escrow::finish_time(env.now() + 2s), + escrow::cancel_time(env.now() + 100s), + fee(txnFees)); + env.close(); + env.close(); + env.close(); + + auto const allowance = 137'926; + auto const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / + MICRO_DROPS_PER_DROP + + 1; + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee)); + env.close(); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) + { + auto const gasUsed = txMeta->getFieldU32(sfGasUsed); + BEAST_EXPECTS( + gasUsed == allowance, std::to_string(gasUsed)); + } + BEAST_EXPECTS( + env.ownerCount(alice) == 16, + std::to_string(env.ownerCount(alice))); + } + } + } + + void + testWithFeats(FeatureBitset features) + { + testCreateFinishFunctionPreflight(features); + testFinishWasmFailures(features); + testFinishFunction(features); + testUpdateDataOnFailure(features); + + // TODO: Update module with new host functions + testAllHostFunctions(features); + testKeyletHostFunctions(features); + } + +public: + void + run() override + { + using namespace test::jtx; + FeatureBitset const all{testable_amendments()}; + testWithFeats(all); + } +}; + +BEAST_DEFINE_TESTSUITE(EscrowSmart, app, ripple); + +} // namespace test +} // namespace ripple diff --git a/src/test/app/Escrow_test.cpp b/src/test/app/Escrow_test.cpp index 3d64e0783a5..8b59b865361 100644 --- a/src/test/app/Escrow_test.cpp +++ b/src/test/app/Escrow_test.cpp @@ -17,11 +17,9 @@ */ //============================================================================== -#include #include #include -#include #include #include @@ -1703,875 +1701,6 @@ struct Escrow_test : public beast::unit_test::suite } } - void - testCreateFinishFunctionPreflight(FeatureBitset features) - { - testcase("Test preflight checks involving FinishFunction"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; - - { - // featureSmartEscrow disabled - Env env(*this, features - featureSmartEscrow); - env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base + 1000; - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temDISABLED)); - env.close(); - - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - escrow::data("00112233"), - fee(txnFees), - ter(temDISABLED)); - env.close(); - } - - { - // FinishFunction > max length - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_size_limit = 10; // 10 bytes - return cfg; - }), - features); - XRPAmount const txnFees = env.current()->fees().base + 1000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // 11-byte string - std::string longWasmHex = "00112233445566778899AA"; - env(escrowCreate, - escrow::finish_function(longWasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - { - // Data without FinishFunction - Env env(*this, features); - XRPAmount const txnFees = env.current()->fees().base + 100000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - std::string longData(4, 'A'); - env(escrowCreate, - escrow::data(longData), - escrow::finish_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - { - // Data > max length - Env env(*this, features); - XRPAmount const txnFees = env.current()->fees().base + 100000; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // string of length maxWasmDataLength * 2 + 2 - std::string longData(maxWasmDataLength * 2 + 2, 'B'); - env(escrowCreate, - escrow::data(longData), - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->START_UP = Config::FRESH; - return cfg; - }), - features); - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - // create escrow - env.fund(XRP(5000), alice, carol); - - auto escrowCreate = escrow::create(alice, carol, XRP(500)); - - // Success situations - { - // FinishFunction + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 20s), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + Condition + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 30s), - escrow::condition(escrow::cb1), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + FinishAfter + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 40s), - escrow::finish_time(env.now() + 2s), - fee(txnFees)); - env.close(); - } - { - // FinishFunction + FinishAfter + Condition + CancelAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 50s), - escrow::condition(escrow::cb1), - escrow::finish_time(env.now() + 2s), - fee(txnFees)); - env.close(); - } - - // Failure situations (i.e. all other combinations) - { - // only FinishFunction - env(escrowCreate, - escrow::finish_function(wasmHex), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + FinishAfter - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + Condition - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction + FinishAfter + Condition - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - escrow::finish_time(env.now() + 2s), - fee(txnFees), - ter(temBAD_EXPIRATION)); - env.close(); - } - { - // FinishFunction 0 length - env(escrowCreate, - escrow::finish_function(""), - escrow::cancel_time(env.now() + 60s), - fee(txnFees), - ter(temMALFORMED)); - env.close(); - } - { - // Not enough fees - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 70s), - fee(txnFees - 1), - ter(telINSUF_FEE_P)); - env.close(); - } - - { - // FinishFunction nonexistent host function - // pub fn finish() -> bool { - // unsafe { host_lib::bad() >= 5 } - // } - auto const badWasmHex = - "0061736d010000000105016000017f02100108686f73745f6c696203626164" - "00000302010005030100100611027f00418080c0000b7f00418080c0000b07" - "2e04066d656d6f727902000666696e69736800010a5f5f646174615f656e64" - "03000b5f5f686561705f6261736503010a09010700100041044a0b004d0970" - "726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235" - "3020323032352d30332d31352900490f7461726765745f6665617475726573" - "042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - env(escrowCreate, - escrow::finish_function(badWasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees), - ter(temBAD_WASM)); - env.close(); - } - } - - void - testFinishWasmFailures(FeatureBitset features) - { - testcase("EscrowFinish Smart Escrow failures"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; - - { - // featureSmartEscrow disabled - Env env(*this, features - featureSmartEscrow); - env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrow::finish(carol, alice, 1), - fee(txnFees), - escrow::comp_allowance(4), - ter(temDISABLED)); - env.close(); - } - - { - // ComputationAllowance > max compute limit - Env env( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->FEES.extension_compute_limit = 1'000; // in gas - return cfg; - }), - features); - env.fund(XRP(5000), alice, carol); - // Run past the flag ledger so that a Fee change vote occurs and - // updates FeeSettings. (It also activates all supported - // amendments.) - for (auto i = env.current()->seq(); i <= 257; ++i) - env.close(); - - auto const allowance = 1'001; - env(escrow::finish(carol, alice, 1), - fee(env.current()->fees().base + allowance), - escrow::comp_allowance(allowance), - ter(temBAD_LIMIT)); - } - - Env env(*this, features); - - // Run past the flag ledger so that a Fee change vote occurs and - // updates FeeSettings. (It also activates all supported - // amendments.) - for (auto i = env.current()->seq(); i <= 257; ++i) - env.close(); - - XRPAmount const txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env.fund(XRP(5000), alice, carol); - - // create escrow - auto const seq = env.seq(alice); - env(escrow::create(alice, carol, XRP(500)), - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - - { - // no ComputationAllowance field - env(escrow::finish(carol, alice, seq), - ter(tefWASM_FIELD_NOT_INCLUDED)); - } - - { - // ComputationAllowance value of 0 - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(0), - ter(temBAD_LIMIT)); - } - - { - // not enough fees - // This function takes 4 gas - // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 3; - env(escrow::finish(carol, alice, seq), - fee(finishFee), - escrow::comp_allowance(4), - ter(telINSUF_FEE_P)); - } - - { - // not enough gas - // This function takes 4 gas - // In testing, 1 gas costs 1 drop - auto const finishFee = env.current()->fees().base + 4; - env(escrow::finish(carol, alice, seq), - fee(finishFee), - escrow::comp_allowance(2), - ter(tecFAILED_PROCESSING)); - } - - { - // ComputationAllowance field included w/no FinishFunction on - // escrow - auto const seq2 = env.seq(alice); - env(escrow::create(alice, carol, XRP(500)), - escrow::finish_time(env.now() + 10s), - escrow::cancel_time(env.now() + 100s)); - env.close(); - - auto const allowance = 100; - env(escrow::finish(carol, alice, seq2), - fee(env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1), - escrow::comp_allowance(allowance), - ter(tefNO_WASM)); - } - } - - void - testFinishFunction(FeatureBitset features) - { - testcase("Example escrow function"); - - using namespace jtx; - using namespace std::chrono; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - // Tests whether the ledger index is >= 5 - // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 66; - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - auto [createFee, finishFee] = [&]() { - Env env(*this, features); - auto createFee = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - auto finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - return std::make_pair(createFee, finishFee); - }(); - - { - // basic FinishFunction situation - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - env.close(); - - { - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - } - - env(escrow::finish(alice, alice, seq), - fee(finishFee), - escrow::comp_allowance(allowance), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 5, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + Condition - Env env(*this, features); - env.fund(XRP(5000), alice, carol); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto const seq = env.seq(alice); - // create escrow - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::condition(escrow::cb1), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - env.close(); - auto const conditionFinishFee = finishFee + - env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // no fulfillment provided, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // fulfillment provided, function fails - env(escrow::finish(carol, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecWASM_REJECTED)); - if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - env.close(); - // no fulfillment provided, function succeeds - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // wrong fulfillment provided, function succeeds - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb2), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tecCRYPTOCONDITION_ERROR)); - // fulfillment provided, function succeeds, tx succeeds - env(escrow::finish(alice, alice, seq), - escrow::condition(escrow::cb1), - escrow::fulfillment(escrow::fb1), - escrow::comp_allowance(allowance), - fee(conditionFinishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + FinishAfter - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto const ts = env.now() + 97s; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(ts), - escrow::cancel_time(env.now() + 1000s), - fee(createFee)); - env.close(); - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // finish time hasn't passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 1), - ter(tecNO_PERMISSION)); - env.close(); - // finish time hasn't passed, function succeeds - for (; env.now() < ts; env.close()) - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 2), - ter(tecNO_PERMISSION)); - - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee + 1), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 13, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - - { - // FinishFunction + FinishAfter #2 - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(createFee)); - // Don't close the ledger here - - if (BEAST_EXPECT(env.ownerCount(alice) == 2)) - { - env.require(balance(alice, XRP(4000) - createFee)); - env.require(balance(carol, XRP(5000))); - - // finish time hasn't passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecNO_PERMISSION)); - env.close(); - - // finish time has passed, function fails - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - if (BEAST_EXPECT(env.meta()->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - env.meta()->getFieldU32(sfGasUsed) == allowance, - std::to_string(env.meta()->getFieldU32(sfGasUsed))); - env.close(); - // finish time has passed, function succeeds, tx succeeds - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - } - - void - testUpdateDataOnFailure(FeatureBitset features) - { - testcase("Update escrow data on failure"); - - using namespace jtx; - using namespace std::chrono; - - // wasm that always fails - static auto const wasmHex = updateDataWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto escrowCreate = escrow::create(alice, alice, XRP(1000)); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - env.close(); - env.close(); - - if (BEAST_EXPECT( - env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) - { - env.require(balance(alice, XRP(4000) - txnFees)); - - auto const allowance = 1'015; - XRPAmount const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - - // FinishAfter time hasn't passed - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecWASM_REJECTED)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == -256, - std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); - - auto const sle = env.le(keylet::escrow(alice, seq)); - if (BEAST_EXPECT(sle && sle->isFieldPresent(sfData))) - BEAST_EXPECTS( - checkVL(sle, sfData, "Data"), - strHex(sle->getFieldVL(sfData))); - } - } - - void - testAllHostFunctions(FeatureBitset features) - { - testcase("Test all host functions"); - - using namespace jtx; - using namespace std::chrono; - - // TODO: create wasm module for all host functions - static auto wasmHex = allHostFunctionsWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - { - Env env(*this, features); - // create escrow - env.fund(XRP(5000), alice, carol); - auto const seq = env.seq(alice); - BEAST_EXPECT(env.ownerCount(alice) == 0); - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrowCreate, - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 11s), - escrow::cancel_time(env.now() + 100s), - escrow::data("1000000000"), // 1000 XRP in drops - fee(txnFees)); - env.close(); - - if (BEAST_EXPECT( - env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) - { - env.require(balance(alice, XRP(4000) - txnFees)); - env.require(balance(carol, XRP(5000))); - - auto const allowance = 1'000'000; - XRPAmount const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - - // FinishAfter time hasn't passed - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tecNO_PERMISSION)); - env.close(); - env.close(); - env.close(); - - // reduce the destination balance - env(pay(carol, alice, XRP(4500))); - env.close(); - env.close(); - - env(escrow::finish(alice, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee), - ter(tesSUCCESS)); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 38'571, - std::to_string(txMeta->getFieldU32(sfGasUsed))); - if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) - BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); - - env.close(); - BEAST_EXPECT(env.ownerCount(alice) == 0); - } - } - } - - void - testKeyletHostFunctions(FeatureBitset features) - { - testcase("Test all keylet host functions"); - - using namespace jtx; - using namespace std::chrono; - - // TODO: create wasm module for all host functions - static auto wasmHex = allKeyletsWasmHex; - - Account const alice{"alice"}; - Account const carol{"carol"}; - - { - Env env{*this}; - env.fund(XRP(10000), alice, carol); - - BEAST_EXPECT(env.seq(alice) == 4); - BEAST_EXPECT(env.ownerCount(alice) == 0); - - // base objects that need to be created first - auto const tokenId = - token::getNextID(env, alice, 0, tfTransferable); - env(token::mint(alice, 0u), txflags(tfTransferable)); - env(trust(alice, carol["USD"](1'000'000))); - env.close(); - BEAST_EXPECT(env.seq(alice) == 6); - BEAST_EXPECT(env.ownerCount(alice) == 2); - - // set up a bunch of objects to check their keylets - AMM amm(env, carol, XRP(10), carol["USD"](1000)); - env(check::create(alice, carol, XRP(100))); - env(credentials::create(alice, alice, "termsandconditions")); - env(delegate::set(alice, carol, {"TrustSet"})); - env(deposit::auth(alice, carol)); - env(did::set(alice), did::data("alice_did")); - env(escrow::create(alice, carol, XRP(100)), - escrow::finish_time(env.now() + 100s)); - MPTTester mptTester{env, alice, {.fund = false}}; - mptTester.create(); - mptTester.authorize({.account = carol}); - env(token::createOffer(carol, tokenId, XRP(100)), - token::owner(alice)); - env(offer(alice, carol["GBP"](0.1), XRP(100))); - env(create(alice, carol, XRP(1000), 100s, alice.pk())); - pdomain::Credentials credentials{{alice, "first credential"}}; - env(pdomain::setTx(alice, credentials)); - env(signers(alice, 1, {{carol, 1}})); - env(ticket::create(alice, 1)); - Vault vault{env}; - auto [tx, _keylet] = - vault.create({.owner = alice, .asset = xrpIssue()}); - env(tx); - env.close(); - - BEAST_EXPECTS( - env.ownerCount(alice) == 16, - std::to_string(env.ownerCount(alice))); - if (BEAST_EXPECTS( - env.seq(alice) == 20, std::to_string(env.seq(alice)))) - { - auto const seq = env.seq(alice); - XRPAmount txnFees = - env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; - env(escrow::create(alice, carol, XRP(1000)), - escrow::finish_function(wasmHex), - escrow::finish_time(env.now() + 2s), - escrow::cancel_time(env.now() + 100s), - fee(txnFees)); - env.close(); - env.close(); - env.close(); - - auto const allowance = 137'926; - auto const finishFee = env.current()->fees().base + - (allowance * env.current()->fees().gasPrice) / - MICRO_DROPS_PER_DROP + - 1; - env(escrow::finish(carol, alice, seq), - escrow::comp_allowance(allowance), - fee(finishFee)); - env.close(); - - auto const txMeta = env.meta(); - if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) - { - auto const gasUsed = txMeta->getFieldU32(sfGasUsed); - BEAST_EXPECTS( - gasUsed == allowance, std::to_string(gasUsed)); - } - BEAST_EXPECTS( - env.ownerCount(alice) == 16, - std::to_string(env.ownerCount(alice))); - } - } - } - void testWithFeats(FeatureBitset features) { @@ -2587,14 +1716,6 @@ struct Escrow_test : public beast::unit_test::suite testConsequences(features); testEscrowWithTickets(features); testCredentials(features); - testCreateFinishFunctionPreflight(features); - testFinishWasmFailures(features); - testFinishFunction(features); - testUpdateDataOnFailure(features); - - // TODO: Update module with new host functions - testAllHostFunctions(features); - testKeyletHostFunctions(features); } public: @@ -2605,6 +1726,8 @@ struct Escrow_test : public beast::unit_test::suite FeatureBitset const all{testable_amendments()}; testWithFeats(all); testWithFeats(all - featureTokenEscrow); + testWithFeats(all - featureSmartEscrow); + testWithFeats(all - featureTokenEscrow - featureSmartEscrow); testTags(all - fixIncludeKeyletFields); } }; From 86525d858363d4df6a6ba7a41262b55e9abd49cb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 6 Oct 2025 16:32:04 -0400 Subject: [PATCH 087/212] test: add tests for fee voting (#5747) --- src/test/app/FeeVote_test.cpp | 299 ++++++++++++++++++++++++++++++++-- 1 file changed, 283 insertions(+), 16 deletions(-) diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 370c4b8a131..ec1c2b834f1 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -43,13 +43,17 @@ struct FeeSettingsFields std::optional baseFeeDrops = std::nullopt; std::optional reserveBaseDrops = std::nullopt; std::optional reserveIncrementDrops = std::nullopt; + std::optional extensionComputeLimit = std::nullopt; + std::optional extensionSizeLimit = std::nullopt; + std::optional gasPrice = std::nullopt; }; STTx createFeeTx( Rules const& rules, std::uint32_t seq, - FeeSettingsFields const& fields) + FeeSettingsFields const& fields, + bool forceAllFields = false) { auto fill = [&](auto& obj) { obj.setAccountID(sfAccount, AccountID()); @@ -83,6 +87,17 @@ createFeeTx( sfReferenceFeeUnits, fields.referenceFeeUnits ? *fields.referenceFeeUnits : 0); } + if (rules.enabled(featureSmartEscrow) || forceAllFields) + { + obj.setFieldU32( + sfExtensionComputeLimit, + fields.extensionComputeLimit ? *fields.extensionComputeLimit + : 0); + obj.setFieldU32( + sfExtensionSizeLimit, + fields.extensionSizeLimit ? *fields.extensionSizeLimit : 0); + obj.setFieldU32(sfGasPrice, fields.gasPrice ? *fields.gasPrice : 0); + } }; return STTx(ttFEE, fill); } @@ -131,6 +146,12 @@ createInvalidFeeTx( obj.setFieldU32(sfReserveIncrement, 50000); obj.setFieldU32(sfReferenceFeeUnits, 10); } + if (rules.enabled(featureSmartEscrow)) + { + obj.setFieldU32(sfExtensionComputeLimit, 100 + uniqueValue); + obj.setFieldU32(sfExtensionSizeLimit, 200 + uniqueValue); + obj.setFieldU32(sfGasPrice, 300 + uniqueValue); + } } // If missingRequiredFields is true, we don't add the required fields // (default behavior) @@ -138,12 +159,12 @@ createInvalidFeeTx( return STTx(ttFEE, fill); } -bool +TER applyFeeAndTestResult(jtx::Env& env, OpenView& view, STTx const& tx) { auto const res = apply(env.app(), view, tx, ApplyFlags::tapNONE, env.journal); - return res.ter == tesSUCCESS; + return res.ter; } bool @@ -199,6 +220,25 @@ verifyFeeObject( if (!checkEquality(sfReferenceFeeUnits, expected.referenceFeeUnits)) return false; } + if (rules.enabled(featureSmartEscrow)) + { + if (!checkEquality( + sfExtensionComputeLimit, + expected.extensionComputeLimit.value_or(0))) + return false; + if (!checkEquality( + sfExtensionSizeLimit, expected.extensionSizeLimit.value_or(0))) + return false; + if (!checkEquality(sfGasPrice, expected.gasPrice.value_or(0))) + return false; + } + else + { + if (feeObject->isFieldPresent(sfExtensionComputeLimit) || + feeObject->isFieldPresent(sfExtensionSizeLimit) || + feeObject->isFieldPresent(sfGasPrice)) + return false; + } return true; } @@ -359,7 +399,8 @@ class FeeVote_test : public beast::unit_test::suite auto feeTx = createFeeTx(ledger->rules(), ledger->seq(), fields); OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx))); accum.apply(*ledger); // Verify fee object was created/updated correctly @@ -388,12 +429,76 @@ class FeeVote_test : public beast::unit_test::suite auto feeTx = createFeeTx(ledger->rules(), ledger->seq(), fields); OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx))); accum.apply(*ledger); // Verify fee object was created/updated correctly BEAST_EXPECT(verifyFeeObject(ledger, ledger->rules(), fields)); } + + // Test with both XRPFees and SmartEscrow enabled + { + jtx::Env env(*this, jtx::testable_amendments()); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); + + // Create the next ledger to apply transaction to + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + + FeeSettingsFields fields{ + .baseFeeDrops = XRPAmount{10}, + .reserveBaseDrops = XRPAmount{200000}, + .reserveIncrementDrops = XRPAmount{50000}, + .extensionComputeLimit = 100, + .extensionSizeLimit = 200, + .gasPrice = 300}; + // Test successful fee transaction with new fields + auto feeTx = createFeeTx(ledger->rules(), ledger->seq(), fields); + + OpenView accum(ledger.get()); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx))); + accum.apply(*ledger); + + // Verify fee object was created/updated correctly + BEAST_EXPECT(verifyFeeObject(ledger, ledger->rules(), fields)); + } + + // Test that the Smart Escrow fields are rejected if the + // feature is disabled + { + jtx::Env env( + *this, jtx::testable_amendments() - featureSmartEscrow); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); + + // Create the next ledger to apply transaction to + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + + FeeSettingsFields fields{ + .baseFeeDrops = XRPAmount{10}, + .reserveBaseDrops = XRPAmount{200000}, + .reserveIncrementDrops = XRPAmount{50000}, + .extensionComputeLimit = 100, + .extensionSizeLimit = 200, + .gasPrice = 300}; + // Test successful fee transaction with new fields + auto feeTx = + createFeeTx(ledger->rules(), ledger->seq(), fields, true); + + OpenView accum(ledger.get()); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, feeTx))); + } } void @@ -420,12 +525,14 @@ class FeeVote_test : public beast::unit_test::suite auto invalidTx = createInvalidFeeTx( ledger->rules(), ledger->seq(), true, false, 1); OpenView accum(ledger.get()); - BEAST_EXPECT(!applyFeeAndTestResult(env, accum, invalidTx)); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, invalidTx))); // Test transaction with new format fields when XRPFees is disabled auto disallowedTx = createInvalidFeeTx( ledger->rules(), ledger->seq(), false, true, 2); - BEAST_EXPECT(!applyFeeAndTestResult(env, accum, disallowedTx)); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, disallowedTx))); } { @@ -445,12 +552,43 @@ class FeeVote_test : public beast::unit_test::suite auto invalidTx = createInvalidFeeTx( ledger->rules(), ledger->seq(), true, false, 3); OpenView accum(ledger.get()); - BEAST_EXPECT(!applyFeeAndTestResult(env, accum, invalidTx)); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, invalidTx))); // Test transaction with legacy fields when XRPFees is enabled auto disallowedTx = createInvalidFeeTx( ledger->rules(), ledger->seq(), false, true, 4); - BEAST_EXPECT(!applyFeeAndTestResult(env, accum, disallowedTx)); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, disallowedTx))); + } + + { + jtx::Env env( + *this, + jtx::testable_amendments() | featureXRPFees | + featureSmartEscrow); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); + + // Create the next ledger to apply transaction to + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + + // Test transaction with missing required new fields + auto invalidTx = createInvalidFeeTx( + ledger->rules(), ledger->seq(), true, false, 5); + OpenView accum(ledger.get()); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, invalidTx))); + + // Test transaction with legacy fields when XRPFees is enabled + auto disallowedTx = createInvalidFeeTx( + ledger->rules(), ledger->seq(), false, true, 6); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, disallowedTx))); } } @@ -489,7 +627,8 @@ class FeeVote_test : public beast::unit_test::suite // But can be applied to a closed ledger { OpenView closedAccum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, closedAccum, feeTx)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, closedAccum, feeTx))); } } @@ -516,7 +655,8 @@ class FeeVote_test : public beast::unit_test::suite { OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx1)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx1))); accum.apply(*ledger); } @@ -534,7 +674,8 @@ class FeeVote_test : public beast::unit_test::suite { OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx2)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx2))); accum.apply(*ledger); } @@ -570,7 +711,7 @@ class FeeVote_test : public beast::unit_test::suite // The transaction should still succeed as long as other fields are // valid // The ledger sequence field is only used for informational purposes - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx)); + BEAST_EXPECT(isTesSuccess(applyFeeAndTestResult(env, accum, feeTx))); } void @@ -596,7 +737,8 @@ class FeeVote_test : public beast::unit_test::suite { OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx1)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx1))); accum.apply(*ledger); } @@ -613,7 +755,8 @@ class FeeVote_test : public beast::unit_test::suite { OpenView accum(ledger.get()); - BEAST_EXPECT(applyFeeAndTestResult(env, accum, feeTx2)); + BEAST_EXPECT( + isTesSuccess(applyFeeAndTestResult(env, accum, feeTx2))); accum.apply(*ledger); } @@ -649,7 +792,8 @@ class FeeVote_test : public beast::unit_test::suite }); OpenView accum(ledger.get()); - BEAST_EXPECT(!applyFeeAndTestResult(env, accum, invalidTx)); + BEAST_EXPECT( + !isTesSuccess(applyFeeAndTestResult(env, accum, invalidTx))); } void @@ -836,6 +980,128 @@ class FeeVote_test : public beast::unit_test::suite XRPAmount{setup.owner_reserve}); } + void + testDoVotingSmartEscrow() + { + testcase("doVoting with Smart Escrow"); + + using namespace jtx; + + FeeSetup setup; + setup.reference_fee = 42; + setup.account_reserve = 1234567; + setup.owner_reserve = 7654321; + setup.extension_compute_limit = 100; + setup.extension_size_limit = 200; + setup.gas_price = 300; + + Env env( + *this, testable_amendments() | featureXRPFees | featureSmartEscrow); + + // establish what the current fees are + BEAST_EXPECT( + env.current()->fees().base == XRPAmount{UNIT_TEST_REFERENCE_FEE}); + BEAST_EXPECT(env.current()->fees().reserve == XRPAmount{200'000'000}); + BEAST_EXPECT(env.current()->fees().increment == XRPAmount{50'000'000}); + BEAST_EXPECT(env.current()->fees().extensionComputeLimit == 0); + BEAST_EXPECT(env.current()->fees().extensionSizeLimit == 0); + BEAST_EXPECT(env.current()->fees().gasPrice == 0); + + auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); + + // doVoting requires a flag ledger (every 256th ledger) + // We need to create a ledger at sequence 256 to make it a flag + // ledger + for (int i = 0; i < 256 - 1; ++i) + { + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + } + BEAST_EXPECT(ledger->isFlagLedger()); + + // Create some mock validations with fee votes + std::vector> validations; + + for (int i = 0; i < 5; i++) + { + auto sec = randomSecretKey(); + auto pub = derivePublicKey(KeyType::secp256k1, sec); + + auto val = std::make_shared( + env.app().timeKeeper().now(), + pub, + sec, + calcNodeID(pub), + [&](STValidation& v) { + v.setFieldU32(sfLedgerSequence, ledger->seq()); + // Vote for different fees than current + v.setFieldAmount( + sfBaseFeeDrops, XRPAmount{setup.reference_fee}); + v.setFieldAmount( + sfReserveBaseDrops, XRPAmount{setup.account_reserve}); + v.setFieldAmount( + sfReserveIncrementDrops, + XRPAmount{setup.owner_reserve}); + v.setFieldU32( + sfExtensionComputeLimit, setup.extension_compute_limit); + v.setFieldU32( + sfExtensionSizeLimit, setup.extension_size_limit); + v.setFieldU32(sfGasPrice, setup.gas_price); + }); + if (i % 2) + val->setTrusted(); + validations.push_back(val); + } + + auto txSet = std::make_shared( + SHAMapType::TRANSACTION, env.app().getNodeFamily()); + + // This should not throw since we have a flag ledger + feeVote->doVoting(ledger, validations, txSet); + + auto const txs = getTxs(txSet); + BEAST_EXPECT(txs.size() == 1); + auto const& feeTx = txs[0]; + + BEAST_EXPECT(feeTx.getTxnType() == ttFEE); + + BEAST_EXPECT(feeTx.getAccountID(sfAccount) == AccountID()); + BEAST_EXPECT(feeTx.getFieldU32(sfLedgerSequence) == ledger->seq() + 1); + + BEAST_EXPECT(feeTx.isFieldPresent(sfBaseFeeDrops)); + BEAST_EXPECT(feeTx.isFieldPresent(sfReserveBaseDrops)); + BEAST_EXPECT(feeTx.isFieldPresent(sfReserveIncrementDrops)); + + // The legacy fields should NOT be present + BEAST_EXPECT(!feeTx.isFieldPresent(sfBaseFee)); + BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveBase)); + BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveIncrement)); + BEAST_EXPECT(!feeTx.isFieldPresent(sfReferenceFeeUnits)); + + // Check the values + BEAST_EXPECT( + feeTx.getFieldAmount(sfBaseFeeDrops) == + XRPAmount{setup.reference_fee}); + BEAST_EXPECT( + feeTx.getFieldAmount(sfReserveBaseDrops) == + XRPAmount{setup.account_reserve}); + BEAST_EXPECT( + feeTx.getFieldAmount(sfReserveIncrementDrops) == + XRPAmount{setup.owner_reserve}); + BEAST_EXPECT( + feeTx.getFieldU32(sfExtensionComputeLimit) == + setup.extension_compute_limit); + BEAST_EXPECT( + feeTx.getFieldU32(sfExtensionSizeLimit) == + setup.extension_size_limit); + BEAST_EXPECT(feeTx.getFieldU32(sfGasPrice) == setup.gas_price); + } + void run() override { @@ -849,6 +1115,7 @@ class FeeVote_test : public beast::unit_test::suite testSingleInvalidTransaction(); testDoValidation(); testDoVoting(); + testDoVotingSmartEscrow(); } }; From da2b9455f21ef63be22394d02fbe2587dbaaebe4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 6 Oct 2025 16:38:40 -0400 Subject: [PATCH 088/212] fix: remove `get_ledger_account_hash` and `get_ledger_tx_hash` host functions (#5850) * remove `get_ledger_account_hash` and `get_ledger_tx_hash` * fix build+tests --- src/test/app/HostFuncImpl_test.cpp | 44 +- src/test/app/TestHostFunctions.h | 24 - src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 6 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 14 - src/test/app/wasm_fixtures/fixtures.cpp | 604 +++++++++--------- src/xrpld/app/wasm/HostFunc.h | 12 - src/xrpld/app/wasm/HostFuncImpl.h | 6 - src/xrpld/app/wasm/HostFuncWrapper.h | 14 - src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 12 - src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 28 - src/xrpld/app/wasm/detail/WasmVM.cpp | 2 - 13 files changed, 306 insertions(+), 464 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 60578c849ea..8dd83fc74ae 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -169,44 +169,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == env.current()->info().parentHash); } - void - testGetLedgerAccountHash() - { - testcase("getLedgerAccountHash"); - using namespace test::jtx; - - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - - auto const result = hfs.getLedgerAccountHash(); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(result.value() == env.current()->info().accountHash); - } - - void - testGetLedgerTransactionHash() - { - testcase("getLedgerTransactionHash"); - using namespace test::jtx; - - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - - auto const result = hfs.getLedgerTransactionHash(); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(result.value() == env.current()->info().txHash); - } - void testGetBaseFee() { @@ -2899,7 +2861,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloatNonIOU() { - testcase("Float Xrp+Mpt"); + testcase("float Xrp+Mpt"); using namespace test::jtx; Env env{*this}; @@ -2961,6 +2923,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloats() { + testFloatTrace(); testFloatFromInt(); testFloatFromUint(); testFloatSet(); @@ -2973,7 +2936,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite testFloatPower(); testFloatLog(); testFloatNonIOU(); - testFloatTrace(); } void @@ -2982,8 +2944,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite testGetLedgerSqn(); testGetParentLedgerTime(); testGetParentLedgerHash(); - testGetLedgerAccountHash(); - testGetLedgerTransactionHash(); testGetBaseFee(); testIsAmendmentEnabled(); testCacheLedgerObj(); diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 6973a107fee..11d613bc8dc 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -113,18 +113,6 @@ struct TestHostFunctions : public HostFunctions return env_.current()->info().parentHash; } - Expected - getLedgerAccountHash() override - { - return env_.current()->info().accountHash; - } - - Expected - getLedgerTransactionHash() override - { - return env_.current()->info().txHash; - } - Expected getBaseFee() override { @@ -649,18 +637,6 @@ struct PerfHostFunctions : public TestHostFunctions return env_.current()->info().parentHash; } - Expected - getLedgerAccountHash() override - { - return env_.current()->info().accountHash; - } - - Expected - getLedgerTransactionHash() override - { - return env_.current()->info().txHash; - } - Expected getBaseFee() override { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 2b1259365a4..00909bcbe3e 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -648,7 +648,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 153'296; + auto const allowance = 152'154; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 28d4d656306..000ecf39a86 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -6,10 +6,10 @@ version = 4 name = "codecov_tests" version = "0.0.1" dependencies = [ - "xrpl-std", + "xrpl-wasm-std", ] [[package]] -name = "xrpl-std" +name = "xrpl-wasm-std" version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#6b20669b20561b9d0f09678f44ccbddb84ef9f47" +source = "git+https://github.com/ripple/craft.git?branch=main#638276c92d790f5b738faa9f42855f02a2c7c7dc" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index c9b4c53490b..ea776999a9c 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-wasm-std" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 0e755ebb757..f02550ba967 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -68,20 +68,6 @@ pub extern "C" fn finish() -> i32 { "get_parent_ledger_hash", ); }); - with_buffer::<32, _, _>(|ptr, len| { - check_result( - unsafe { host::get_ledger_account_hash(ptr, len) }, - 32, - "get_ledger_account_hash", - ); - }); - with_buffer::<32, _, _>(|ptr, len| { - check_result( - unsafe { host::get_ledger_tx_hash(ptr, len) }, - 32, - "get_ledger_tx_hash", - ); - }); check_result(unsafe { host::get_base_fee() }, 10, "get_base_fee"); let amendment_name: &[u8] = b"test_amendment"; let amendment_id: [u8; 32] = [1; 32]; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6ad3e336399..ea46b49d398 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9859,314 +9859,308 @@ extern std::string const allKeyletsWasmHex = extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" "7f7f7f7f7f017f60077f7f7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f" - "7f7f7f7f7f7f7f017f60037f7f7e017f60047f7f7f7f0002da0d3e08686f73745f6c696205" + "7f7f7f7f7f7f7f017f60037f7f7e017f60047f7f7f7f0002990d3c08686f73745f6c696205" "7472616365000108686f73745f6c69620974726163655f6e756d000908686f73745f6c6962" "0e6765745f6c65646765725f73716e000508686f73745f6c6962166765745f706172656e74" "5f6c65646765725f74696d65000508686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000208686f73745f6c6962176765745f6c65646765725f6163636f75" - "6e745f68617368000208686f73745f6c6962126765745f6c65646765725f74785f68617368" - "000208686f73745f6c69620c6765745f626173655f666565000508686f73745f6c69621161" - "6d656e646d656e745f656e61626c6564000208686f73745f6c69620c6765745f74785f6669" - "656c64000608686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f" - "6c69621063616368655f6c65646765725f6f626a000608686f73745f6c69621c6765745f63" - "757272656e745f6c65646765725f6f626a5f6669656c64000608686f73745f6c6962146765" - "745f6c65646765725f6f626a5f6669656c64000008686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000008686f73745f6c6962236765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f6669656c64000008686f73745f6c69621b676574" - "5f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f73745f6c69621067" - "65745f74785f61727261795f6c656e000708686f73745f6c6962206765745f63757272656e" - "745f6c65646765725f6f626a5f61727261795f6c656e000708686f73745f6c696218676574" - "5f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f" - "74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962276765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e00020868" - "6f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e000608686f73745f6c69620b7570646174655f64617461000208686f73745f6c696213" - "636f6d707574655f7368613531325f68616c66000008686f73745f6c696209636865636b5f" - "736967000308686f73745f6c6962076765745f6e6674000308686f73745f6c69620e676574" - "5f6e66745f697373756572000008686f73745f6c69620d6765745f6e66745f7461786f6e00" - "0008686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c69621467" - "65745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66" - "745f73657269616c000008686f73745f6c69620d74726163655f6163636f756e7400000868" - "6f73745f6c69620c74726163655f616d6f756e74000008686f73745f6c69620f666c6f6174" - "5f66726f6d5f75696e74000108686f73745f6c69620b6c696e655f6b65796c657400080868" - "6f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c69621163726564656e74" - "69616c5f6b65796c6574000808686f73745f6c69620e6d70746f6b656e5f6b65796c657400" - "0308686f73745f6c69621274726163655f6f70617175655f666c6f6174000008686f73745f" - "6c69620d666c6f61745f636f6d70617265000008686f73745f6c696209666c6f61745f6164" - "64000408686f73745f6c69620e666c6f61745f7375627472616374000408686f73745f6c69" - "620e666c6f61745f6d756c7469706c79000408686f73745f6c69620c666c6f61745f646976" - "696465000408686f73745f6c69620a666c6f61745f726f6f74000308686f73745f6c696209" - "666c6f61745f706f77000308686f73745f6c696209666c6f61745f6c6f67000108686f7374" - "5f6c69620c636865636b5f6b65796c6574000108686f73745f6c69620f64656c6567617465" - "5f6b65796c6574000308686f73745f6c6962166465706f7369745f707265617574685f6b65" - "796c6574000308686f73745f6c69620a6469645f6b65796c6574000008686f73745f6c6962" - "0d657363726f775f6b65796c6574000108686f73745f6c6962136d70745f69737375616e63" - "655f6b65796c6574000108686f73745f6c6962106e66745f6f666665725f6b65796c657400" - "0108686f73745f6c69620c6f666665725f6b65796c6574000108686f73745f6c69620d6f72" - "61636c655f6b65796c6574000108686f73745f6c69620e7061796368616e5f6b65796c6574" - "000408686f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c65" - "74000108686f73745f6c69620e7369676e6572735f6b65796c6574000008686f73745f6c69" - "620d7469636b65745f6b65796c6574000108686f73745f6c69620c7661756c745f6b65796c" - "657400010303020a0505030100110619037f01418080c0000b7f00419f9ec0000b7f0041a0" - "9ec0000b072e04066d656d6f727902000666696e697368003f0a5f5f646174615f656e6403" - "010b5f5f686561705f6261736503020ab02b02460002402000200147044020022003410041" - "00410010001a20004100480d01418b80c000410b2000ad1001000b200220032000ac10011a" - "0f0b418b80c000410b2000ac1001000be62a02087f027e230041f0016b22002400419680c0" - "00412341004100410010001a100241b9e00041b980c000410e103e100341b2920441c780c0" - "004116103e200041f0006a22054200370300200041e8006a22034200370300200041e0006a" - "2202420037030020004200370358200041d8006a220141201004412041a58cc0004116103e" - "20054200370300200342003703002002420037030020004200370358200141201005412041" - "bb8cc0004117103e2005420037030020034200370300200242003703002000420037035820" - "0141201006412041d28cc0004112103e1007410a41dd80c000410c103e200041186a428182" - "848890a0c08001370300200041106a428182848890a0c08001370300200041086a42818284" - "8890a0c080013703002000428182848890a0c0800137030041e980c000410e1008410141f7" - "80c0004111103e200041201008410141f780c0004111103e20034100360200200242003703" - "002000420037035802404181802020014114100922044114460440200041266a20002d005a" - "3a00002000200029005f3703c8012000200041e4006a2900003700cd01200041306a200029" - "00cd01370000200020002f01583b01242000200028005b360027200020002903c80137002b" - "20054200370300200342003703002002420037030020004200370358200041246a41142001" - "4120100a22054120470d012000413a6a20002d005a3a0000200041d0016a200041e7006a29" - "00002208370300200041d8016a200041ef006a2900002209370300200041c7006a20083700" - "00200041cf006a2009370000200041d7006a200041f7006a2d00003a0000200020002f0158" - "3b01382000200028005b36003b2000200029005f37003f200041386a41204100100b410141" - "8881c0004110103e2003410036020020024200370300200042003703584181802020014114" - "100c411441e48cc000411c103e200341003602002002420037030020004200370358410141" - "81802020014114100d411441808dc0004114103e024020012001410020016b41037122036a" - "22024f0d0020030440200321050340200141003a0000200141016a2101200541016b22050d" - "000b0b200341016b4107490d000340200141003a0000200141076a41003a0000200141066a" - "41003a0000200141056a41003a0000200141046a41003a0000200141036a41003a00002001" - "41026a41003a0000200141016a41003a0000200141086a22012002470d000b0b200241c400" - "20036b2203417c716a220120024b0440034020024100360200200241046a22022001490d00" - "0b0b024020012003410371220320016a22054f0d002003220204400340200141003a000020" - "0141016a2101200241016b22020d000b0b200341016b4107490d000340200141003a000020" - "0141076a41003a0000200141066a41003a0000200141056a41003a0000200141046a41003a" - "0000200141036a41003a0000200141026a41003a0000200141016a41003a0000200141086a" - "22012005470d000b0b2000418180203602c801410021010340200641c000490440200041d8" - "006a20066a200041c8016a20016a2d00003a0000200020002802980141016a220636029801" - "200141016a22014104470d010b0b200041d8016a22024100360200200041d0016a22044200" - "370300200042003703c801200041d8006a22012006200041c8016a22054114100e41144194" - "8dc0004113103e2002410036020020044200370300200042003703c8012001200028029801" - "20054114100f411441a78dc0004123103e2002410036020020044200370300200042003703" - "c80141012001200028029801200541141010411441ca8dc000411b103e4189803c10114120" - "419881c0004110103e4189803c1012412041a881c0004120103e41014189803c1013412041" - "c881c0004118103e20012000280298011014412041e081c0004117103e2001200028029801" - "1015412041f781c0004127103e4101200120002802980110164120419e82c000411f103e20" - "0041246a220341141017410041bd82c000410b103e200041e0016a22064200370300200242" - "0037030020044200370300200042003703c8012001200028029801200541201018412041e5" - "8dc0004113103e41c882c000410c41d482c000410b41df82c000410e1019410141ed82c000" - "4109103e200041b8016a200041186a290300370300200041b0016a200041106a2903003703" - "00200041a8016a200041086a290300370300200020002903003703a001200241003b010020" - "044200370300200042003703c80120034114200041a0016a2207412020054112101a411241" - "f88dc0004107103e2002410036020020044200370300200042003703c80120074120200541" - "14101b411441ff8dc000410e103e200041003602c8012007412020054104101c4104418d8e" - "c000410d103e20074120101d410841f682c000410d103e20074120101e410a418383c00041" - "14103e200041003602c8012007412020054104101f4104419a8ec000410e103e419783c000" - "410d200341141020412f41a483c000410d103e419783c000410d41b183c000410810214113" - "41b983c000410c103e417f41041004417141c583c000411e103e200041003602c801200541" - "7f1004417141a88ec000411e103e200041ca016a41003a0000200041003b01c80120054103" - "1004417d41c68ec0004124103e200041003602c8012005418094ebdc031004417341ea8ec0" - "004123103e419783c000410d200341141020412f41a483c000410d103e419783c000410d41" - "b183c00041081021411341b983c000410c103e200642003703002002420037030020044200" - "370300200042003703c801200041d894ebdc036a2207410820054120410010224173418d8f" - "c0004117103e200642003703002002420037030020044200370300200042003703c8012001" - "2000280298012005412041001022417141a48fc0004119103e41021011416f41e383c00041" - "1f103e417f20002802980110144171418284c000411f103e2001417f1014417141a184c000" - "411f103e20014181201014417441c084c0004120103e20072000280298011014417341e084" - "c000411f103e20072000280298014101100b417341ff84c0004118103e2001200028029801" - "4101100b4171419785c000411a103e20064200370300200242003703002004420037030020" - "0042003703c801200720002802980120054120100a417341bd8fc0004116103e2006420037" - "03002002420037030020044200370300200042003703c80120012000280298012005412010" - "0a417141d38fc0004118103e20064200370300200242003703002004420037030020004200" - "3703c80120034114200341142007200028029801200541201023417341eb8fc000411c103e" - "200642003703002002420037030020044200370300200042003703c8012003411420034114" - "20012000280298012005412010234171418790c000411e103e200642003703002002420037" - "030020044200370300200042003703c801418b9ec000411420072000280298012005412010" - "24417341a590c0004119103e20064200370300200242003703002004420037030020004200" - "3703c801418b9ec00041142001200028029801200541201024417141be90c000411f103e20" - "0642003703002002420037030020044200370300200042003703c801418b9ec000411441b1" - "85c0004114200541201024417141dd90c0004129103e200642003703002002420037030020" - "044200370300200042003703c80141c585c0004128418b9ec0004114200541201024417141" - "8691c0004125103e200041dc016a200041346a280100360200200041d4016a2000412c6a29" - "0100370200200020002901243702cc01200041808080083602c801200041003b01c0012005" - "4118418b9ec0004114200041c0016a220441021024417141ab91c000410e103e2007200028" - "029801422a1001417341ed85c0004111103e200041003b01c0014102200441021009416f41" - "b991c000411b103e200041003b01c001410220044102100c416f41d491c000412b103e2000" - "41003b01c0014101410220044102100d416f41ff91c0004123103e41021011416f41e383c0" - "00411f103e41021012416f41fe85c000412f103e410141021013416f41ad86c0004127103e" - "41e980c0004181201008417441d486c000411f103e41e980c00041c1001008417441f386c0" - "00411a103e200041003b01c001200141812020044102100e417441a292c0004121103e2000" - "41003b01c001200141812020044102100f417441c392c0004131103e200041003b01c00141" - "012001418120200441021010417441f492c0004129103e200141812010144174418d87c000" - "4125103e20014181201015417441b287c0004135103e410120014181201016417441e787c0" - "00412d103e200141812010174174419488c0004119103e419783c00041812041d482c00041" - "0b41df82c000410e1019417441ed82c0004109103e419783c000410d41d482c00041812041" - "df82c000410e1019417441ed82c0004109103e419783c000410d41d482c000410b41df82c0" - "004181201019417441ed82c0004109103e200041003b01c001200141812020044102101841" - "74419d93c0004121103e200041003b01c001418b9ec000418120418b9ec000411420044102" - "1024417441be93c0004118103e200041003b01c00120034114200341142001418120200441" - "021025417441d693c000411f103e200041003b01c001200541812020034114200441021026" - "417441f593c0004122103e419783c000410d200720002802980141001000417341ad88c000" - "410f103e200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22" - "0641081027417341bc88c000411c103e419783c000410d20072000280298011021417341d8" - "88c0004116103e20064108200441081028417341ee88c0004118103e200441082006410810" - "284173418689c0004118103e200041003b01ec012006410820044108200041ec016a220241" - "02410010294173419794c0004114103e200041003b01ec0120044108200641082002410241" - "001029417341ab94c0004114103e200041003b01ec01200641082004410820024102410010" - "2a417341bf94c0004119103e200041003b01ec012004410820064108200241024100102a41" - "7341d894c0004119103e200041003b01ec012006410820044108200241024100102b417341" - "f194c0004119103e200041003b01ec012004410820064108200241024100102b4173418a95" - "c0004119103e200041003b01ec012006410820044108200241024100102c417341a395c000" - "4117103e200041003b01ec012004410820064108200241024100102c417341ba95c0004117" - "103e200041003b01ec01200641084103200241024100102d417341d195c0004114103e2000" - "41003b01ec01200641084103200241024100102e417341e595c0004113103e200041003b01" - "ec0120064108200241024100102f417341f895c0004113103e20012000280298014100100b" - "4171419e89c0004123103e200041003b01ec0120034114200120002802980120024102101a" - "4171418b96c000411a103e200041003b01ec01200120002802980120024102101b417141a5" - "96c0004121103e200041003b01ec01200120002802980120024102101c417141c696c00041" - "20103e2001200028029801101d417141c189c0004120103e2001200028029801101e417141" - "e189c0004127103e200041003602ec01200120002802980120024104101f417141e696c000" - "4121103e200041003b01ec01200120002802980120024102100a4171418797c0004123103e" - "200041003b01ec0120012000280298014101200241021030417141aa97c0004121103e2000" - "41003b01ec01200120002802980122062003411420012006200241021025417141cb97c000" - "4127103e200041003b01ec0120034114200120002802980122062001200620024102102541" - "7141f297c0004127103e200041003b01ec0120012000280298012003411420024102103141" - "71419998c0004125103e200041003b01ec0120034114200120002802980120024102103141" - "7141be98c0004125103e200041003b01ec0120012000280298012003411420024102103241" - "7141e398c000412c103e200041003b01ec0120034114200120002802980120024102103241" - "71418f99c000412c103e200041003b01ec012001200028029801200241021033417141bb99" - "c000411f103e200041003b01ec0120012000280298014101200241021034417141da99c000" - "4122103e200041003b01ec0120012000280298012003411441b185c0004114200241021023" - "417141fc99c0004121103e200041003b01ec0120034114200120002802980141b185c00041" - "142002410210234171419d9ac0004121103e200041003b01ec012001200028029801410120" - "0241021035417141be9ac0004128103e200041003b01ec0120054118200120002802980120" - "0241021026417141e69ac0004123103e200041003b01ec0120012000280298014101200241" - "021036417141899bc0004125103e200041003b01ec01200120002802980141012002410210" - "37417141ae9bc0004121103e200041003b01ec012001200028029801410120024102103841" - "7141cf9bc0004122103e200041003b01ec0120012000280298012003411441012002410210" - "39417141f19bc0004124103e200041003b01ec012003411420012000280298014101200241" - "021039417141959cc0004124103e200041003b01ec01200120002802980141012002410210" - "3a417141b99cc000412f103e200041003b01ec01200120002802980120024102103b417141" - "e89cc0004123103e200041003b01ec012001200028029801410120024102103c4171418b9d" - "c0004122103e200041003b01ec012001200028029801410120024102103d417141ad9dc000" - "4121103e200041003b01ec01200120002802980141888ac000412020024102101a417141ce" - "9dc000411c103e419783c000410d20012000280298011020417141a88ac0004122103e4197" - "97abdd03410d41888ac000412041001000417341ca8ac0004110103e419797abdd03410d20" - "0441081027417341da8ac000411d103e419797abdd03410d200341141020417341f78ac000" - "4118103e419797abdd03410d41b183c000410810214173418f8bc0004117103e2001200028" - "029801200141812041001000417441a68bc000410e103e200141812042011001417441b48b" - "c0004112103e419783c000418120200441081027417441c68bc000411b103e419783c00041" - "8120200341141020417441e18bc0004116103e419783c00041812041b183c0004108102141" - "7441f78bc0004115103e419783c000410d200120002802980110214171418c8cc000411910" - "3e200041003b01ec01200120002802980120034114200241021026417141ea9dc000412110" - "3e200041f0016a240041010f0b418080c000410b417f20042004417f4e1bac1001000b4180" - "80c000410b417f20052005417f4e1bac1001000b0bf61d0200418080c0000bc5056572726f" - "725f636f64653d54455354204641494c45442424242424205354415254494e47205741534d" - "20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f706172" - "656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d656e64" - "6d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a" - "6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f62" - "6a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765" - "745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d657373" - "61676574657374207075626b657974657374207369676e6174757265636865636b5f736967" - "6765745f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374" - "696e6720747261636574726163655f6163636f756e74400000000000005f74726163655f61" - "6d6f756e746765745f706172656e745f6c65646765725f686173685f6e65675f7074726765" - "745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e" - "65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f" - "61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f" - "6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f70" - "74725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c" - "65646765725f6f626a5f77726f6e675f6c656e555344303030303030303030303030303030" - "30300041ed85c0000b9e1874726163655f6e756d5f6f6f625f7374726765745f6375727265" - "6e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c" - "646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669" - "656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d65" - "6e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f" - "61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c65" - "646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c69" - "63656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f" - "5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c6963657472" - "6163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f73" - "6c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d7061" - "72655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c69636532" - "63616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e743235366765" - "745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e6674" - "5f7472616e736665725f6665655f77726f6e675f73697a655f75696e743235363030303030" - "30303030303030303030303030303030303030303030303030303174726163655f6163636f" - "756e745f77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f737472" - "696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e677472616365" - "5f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f73" - "7472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e67" - "74726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f" - "756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163" - "655f616d6f756e745f77726f6e675f6c656e6774686765745f706172656e745f6c65646765" - "725f686173686765745f6c65646765725f6163636f756e745f686173686765745f6c656467" - "65725f74785f686173686765745f63757272656e745f6c65646765725f6f626a5f6669656c" - "646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669" - "656c646765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c" - "646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f73" - "68613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66" - "745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765" - "725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f" - "6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c" - "656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f" - "61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f" - "6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b" - "65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f" - "6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373" - "657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d" - "5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c65" - "6e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c65" - "6e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f73" - "6669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76" - "616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c" - "69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f" - "736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669" - "656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465" - "645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68" - "616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f73" - "6c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70" - "746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f6174" - "5f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c" - "6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f7375627472616374" - "5f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c6963653166" - "6c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f" - "6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61" - "745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c" - "6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75" - "696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e7432" - "35366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e74323536676574" - "5f6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e74" - "5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f70" - "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465" - "706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e74696465" - "7363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e65" - "5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69737375616e6365" - "5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e" - "675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f" - "6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c" - "656e677468004d0970726f64756365727302086c616e6775616765010452757374000c7072" - "6f6365737365642d6279010572757374631d312e39302e3020283131353965373863342032" - "3032352d30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c" - "652d676c6f62616c732b087369676e2d657874"; + "646765725f68617368000208686f73745f6c69620c6765745f626173655f66656500050868" + "6f73745f6c696211616d656e646d656e745f656e61626c6564000208686f73745f6c69620c" + "6765745f74785f6669656c64000608686f73745f6c69620e6163636f756e745f6b65796c65" + "74000008686f73745f6c69621063616368655f6c65646765725f6f626a000608686f73745f" + "6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000608686f" + "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008686f73745f6c69" + "62136765745f74785f6e65737465645f6669656c64000008686f73745f6c6962236765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64000008686f73" + "745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c6400010868" + "6f73745f6c6962106765745f74785f61727261795f6c656e000708686f73745f6c69622067" + "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e000708686f73" + "745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e000208686f7374" + "5f6c6962176765745f74785f6e65737465645f61727261795f6c656e000208686f73745f6c" + "6962276765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e000208686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e000608686f73745f6c69620b7570646174655f64617461000208" + "686f73745f6c696213636f6d707574655f7368613531325f68616c66000008686f73745f6c" + "696209636865636b5f736967000308686f73745f6c6962076765745f6e6674000308686f73" + "745f6c69620e6765745f6e66745f697373756572000008686f73745f6c69620d6765745f6e" + "66745f7461786f6e000008686f73745f6c69620d6765745f6e66745f666c61677300020868" + "6f73745f6c6962146765745f6e66745f7472616e736665725f666565000208686f73745f6c" + "69620e6765745f6e66745f73657269616c000008686f73745f6c69620d74726163655f6163" + "636f756e74000008686f73745f6c69620c74726163655f616d6f756e74000008686f73745f" + "6c69620f666c6f61745f66726f6d5f75696e74000108686f73745f6c69620b6c696e655f6b" + "65796c6574000808686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c69" + "621163726564656e7469616c5f6b65796c6574000808686f73745f6c69620e6d70746f6b65" + "6e5f6b65796c6574000308686f73745f6c69621274726163655f6f70617175655f666c6f61" + "74000008686f73745f6c69620d666c6f61745f636f6d70617265000008686f73745f6c6962" + "09666c6f61745f616464000408686f73745f6c69620e666c6f61745f737562747261637400" + "0408686f73745f6c69620e666c6f61745f6d756c7469706c79000408686f73745f6c69620c" + "666c6f61745f646976696465000408686f73745f6c69620a666c6f61745f726f6f74000308" + "686f73745f6c696209666c6f61745f706f77000308686f73745f6c696209666c6f61745f6c" + "6f67000108686f73745f6c69620c636865636b5f6b65796c6574000108686f73745f6c6962" + "0f64656c65676174655f6b65796c6574000308686f73745f6c6962166465706f7369745f70" + "7265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b65796c65740000" + "08686f73745f6c69620d657363726f775f6b65796c6574000108686f73745f6c6962136d70" + "745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e66745f6f666665" + "725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c6574000108686f" + "73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69620e7061796368" + "616e5f6b65796c6574000408686f73745f6c69621a7065726d697373696f6e65645f646f6d" + "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" + "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" + "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" + "f69dc0000b7f0041809ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020ac12a02460002402000200147" + "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" + "0220032000ac10011a0f0b418b80c000410b2000ac1001000bf72902087f027e230041f001" + "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" + "0341b2920441c780c0004116103c200041f0006a22034200370300200041e8006a22044200" + "370300200041e0006a2202420037030020004200370358200041d8006a2201412010044120" + "41a58cc0004116103c1005410a41dd80c000410c103c200041186a428182848890a0c08001" + "370300200041106a428182848890a0c08001370300200041086a428182848890a0c0800137" + "03002000428182848890a0c0800137030041e980c000410e1006410141f780c0004111103c" + "200041201006410141f780c0004111103c2004410036020020024200370300200042003703" + "5841818020200141141007220541144604400240200041266a20002d005a3a000020002000" + "29005f3703c8012000200041e4006a2900003700cd01200041306a20002900cd0137000020" + "0020002f01583b01242000200028005b360027200020002903c80137002b20034200370300" + "200442003703002002420037030020004200370358200041246a4114200141201008220541" + "20470d002000413a6a20002d005a3a0000200041d0016a200041e7006a2900002208370300" + "200041d8016a200041ef006a2900002209370300200041c7006a2008370000200041cf006a" + "2009370000200041d7006a200041f7006a2d00003a0000200020002f01583b013820002000" + "28005b36003b2000200029005f37003f200041386a4120410010094101418881c000411010" + "3c2004410036020020024200370300200042003703584181802020014114100a411441bb8c" + "c000411c103c20044100360200200242003703002000420037035841014181802020014114" + "100b411441d78cc0004114103c02402001410020016b41037122046a220220014d0d002004" + "0440200421050340200141003a0000200141016a2101200541016b22050d000b0b20044101" + "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" + "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" + "00200141016a41003a0000200141086a22012002470d000b0b200241c40020046b2204417c" + "716a220120024b0440034020024100360200200241046a22022001490d000b0b0240200120" + "04410371220420016a22054f0d002004220204400340200141003a0000200141016a210120" + "0241016b22020d000b0b200441016b4107490d000340200141003a0000200141076a41003a" + "0000200141066a41003a0000200141056a41003a0000200141046a41003a0000200141036a" + "41003a0000200141026a41003a0000200141016a41003a0000200141086a22012005470d00" + "0b0b2000418180203602c801410021010340200641c000490440200041d8006a20066a2000" + "41c8016a20016a2d00003a0000200020002802980141016a220636029801200141016a2201" + "4104470d010b0b200041d8016a22024100360200200041d0016a2203420037030020004200" + "3703c801200041d8006a22012006200041c8016a22054114100c411441eb8cc0004113103c" + "2002410036020020034200370300200042003703c801200120002802980120054114100d41" + "1441fe8cc0004123103c2002410036020020034200370300200042003703c8014101200120" + "002802980120054114100e411441a18dc000411b103c4189803c100f4120419881c0004110" + "103c4189803c1010412041a881c0004120103c41014189803c1011412041c881c000411810" + "3c20012000280298011012412041e081c0004117103c20012000280298011013412041f781" + "c0004127103c4101200120002802980110144120419e82c000411f103c200041246a220441" + "141015410041bd82c000410b103c200041e0016a2206420037030020024200370300200342" + "00370300200042003703c8012001200028029801200541201016412041bc8dc0004113103c" + "41c882c000410c41d482c000410b41df82c000410e1017410141ed82c0004109103c200041" + "b8016a200041186a290300370300200041b0016a200041106a290300370300200041a8016a" + "200041086a290300370300200020002903003703a001200241003b01002003420037030020" + "0042003703c80120044114200041a0016a22074120200541121018411241cf8dc000410710" + "3c2002410036020020034200370300200042003703c80120074120200541141019411441d6" + "8dc000410e103c200041003602c8012007412020054104101a410441e48dc000410d103c20" + "074120101b410841f682c000410d103c20074120101c410a418383c0004114103c20004100" + "3602c8012007412020054104101d410441f18dc000410e103c419783c000410d2004411410" + "1e412f41a483c000410d103c419783c000410d41b183c0004108101f411341b983c000410c" + "103c417f41041004417141c583c000411e103c200041003602c8012005417f1004417141ff" + "8dc000411e103c200041ca016a41003a0000200041003b01c801200541031004417d419d8e" + "c0004124103c200041003602c8012005418094ebdc031004417341c18ec0004123103c4197" + "83c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c000410810" + "1f411341b983c000410c103c20064200370300200242003703002003420037030020004200" + "3703c801200041d894ebdc036a220741082005412041001020417341e48ec0004117103c20" + "0642003703002002420037030020034200370300200042003703c801200120002802980120" + "05412041001020417141fb8ec0004119103c4102100f416f41e383c000411f103c417f2000" + "2802980110124171418284c000411f103c2001417f1012417141a184c000411f103c200141" + "81201012417441c084c0004120103c20072000280298011012417341e084c000411f103c20" + "0720002802980141011009417341ff84c0004118103c200120002802980141011009417141" + "9785c000411a103c200642003703002002420037030020034200370300200042003703c801" + "2007200028029801200541201008417341948fc0004116103c200642003703002002420037" + "030020034200370300200042003703c8012001200028029801200541201008417141aa8fc0" + "004118103c200642003703002002420037030020034200370300200042003703c801200441" + "14200441142007200028029801200541201021417341c28fc000411c103c20064200370300" + "2002420037030020034200370300200042003703c801200441142004411420012000280298" + "01200541201021417141de8fc000411e103c20064200370300200242003703002003420037" + "0300200042003703c80141e29dc00041142007200028029801200541201022417341fc8fc0" + "004119103c200642003703002002420037030020034200370300200042003703c80141e29d" + "c000411420012000280298012005412010224171419590c000411f103c2006420037030020" + "02420037030020034200370300200042003703c80141e29dc000411441b185c00041142005" + "41201022417141b490c0004129103c20064200370300200242003703002003420037030020" + "0042003703c80141c585c000412841e29dc0004114200541201022417141dd90c000412510" + "3c200041dc016a200041346a280100360200200041d4016a2000412c6a2901003702002000" + "20002901243702cc01200041808080083602c801200041003b01c0012005411841e29dc000" + "4114200041c0016a2203410210224171418291c000410e103c2007200028029801422a1001" + "417341ed85c0004111103c200041003b01c0014102200341021007416f419091c000411b10" + "3c200041003b01c001410220034102100a416f41ab91c000412b103c200041003b01c00141" + "01410220034102100b416f41d691c0004123103c4102100f416f41e383c000411f103c4102" + "1010416f41fe85c000412f103c410141021011416f41ad86c0004127103c41e980c0004181" + "201006417441d486c000411f103c41e980c00041c1001006417441f386c000411a103c2000" + "41003b01c001200141812020034102100c417441f991c0004121103c200041003b01c00120" + "0141812020034102100d4174419a92c0004131103c200041003b01c0014101200141812020" + "034102100e417441cb92c0004129103c200141812010124174418d87c0004125103c200141" + "81201013417441b287c0004135103c410120014181201014417441e787c000412d103c2001" + "41812010154174419488c0004119103c419783c00041812041d482c000410b41df82c00041" + "0e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c000410e10" + "17417441ed82c0004109103c419783c000410d41d482c000410b41df82c000418120101741" + "7441ed82c0004109103c200041003b01c0012001418120200341021016417441f492c00041" + "21103c200041003b01c00141e29dc00041812041e29dc00041142003410210224174419593" + "c0004118103c200041003b01c00120044114200441142001418120200341021023417441ad" + "93c000411f103c200041003b01c001200541812020044114200341021024417441cc93c000" + "4122103c419783c000410d200720002802980141001000417341ad88c000410f103c200042" + "d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a2206410810254173" + "41bc88c000411c103c419783c000410d2007200028029801101f417341d888c0004116103c" + "20064108200341081026417341ee88c0004118103c200341082006410810264173418689c0" + "004118103c200041003b01ec012006410820034108200041ec016a22024102410010274173" + "41ee93c0004114103c200041003b01ec012003410820064108200241024100102741734182" + "94c0004114103c200041003b01ec01200641082003410820024102410010284173419694c0" + "004119103c200041003b01ec0120034108200641082002410241001028417341af94c00041" + "19103c200041003b01ec0120064108200341082002410241001029417341c894c000411910" + "3c200041003b01ec0120034108200641082002410241001029417341e194c0004119103c20" + "0041003b01ec012006410820034108200241024100102a417341fa94c0004117103c200041" + "003b01ec012003410820064108200241024100102a4173419195c0004117103c200041003b" + "01ec01200641084103200241024100102b417341a895c0004114103c200041003b01ec0120" + "0641084103200241024100102c417341bc95c0004113103c200041003b01ec012006410820" + "0241024100102d417341cf95c0004113103c2001200028029801410010094171419e89c000" + "4123103c200041003b01ec01200441142001200028029801200241021018417141e295c000" + "411a103c200041003b01ec012001200028029801200241021019417141fc95c0004121103c" + "200041003b01ec01200120002802980120024102101a4171419d96c0004120103c20012000" + "28029801101b417141c189c0004120103c2001200028029801101c417141e189c000412710" + "3c200041003602ec01200120002802980120024104101d417141bd96c0004121103c200041" + "003b01ec012001200028029801200241021008417141de96c0004123103c200041003b01ec" + "012001200028029801410120024102102e4171418197c0004121103c200041003b01ec0120" + "0120002802980122062004411420012006200241021023417141a297c0004127103c200041" + "003b01ec01200441142001200028029801220620012006200241021023417141c997c00041" + "27103c200041003b01ec0120012000280298012004411420024102102f417141f097c00041" + "25103c200041003b01ec0120044114200120002802980120024102102f4171419598c00041" + "25103c200041003b01ec01200120002802980120044114200241021030417141ba98c00041" + "2c103c200041003b01ec01200441142001200028029801200241021030417141e698c00041" + "2c103c200041003b01ec0120012000280298012002410210314171419299c000411f103c20" + "0041003b01ec0120012000280298014101200241021032417141b199c0004122103c200041" + "003b01ec0120012000280298012004411441b185c0004114200241021021417141d399c000" + "4121103c200041003b01ec0120044114200120002802980141b185c0004114200241021021" + "417141f499c0004121103c200041003b01ec01200120002802980141012002410210334171" + "41959ac0004128103c200041003b01ec012005411820012000280298012002410210244171" + "41bd9ac0004123103c200041003b01ec0120012000280298014101200241021034417141e0" + "9ac0004125103c200041003b01ec0120012000280298014101200241021035417141859bc0" + "004121103c200041003b01ec0120012000280298014101200241021036417141a69bc00041" + "22103c200041003b01ec012001200028029801200441144101200241021037417141c89bc0" + "004124103c200041003b01ec012004411420012000280298014101200241021037417141ec" + "9bc0004124103c200041003b01ec0120012000280298014101200241021038417141909cc0" + "00412f103c200041003b01ec012001200028029801200241021039417141bf9cc000412310" + "3c200041003b01ec012001200028029801410120024102103a417141e29cc0004122103c20" + "0041003b01ec012001200028029801410120024102103b417141849dc0004121103c200041" + "003b01ec01200120002802980141888ac0004120200241021018417141a59dc000411c103c" + "419783c000410d2001200028029801101e417141a88ac0004122103c419797abdd03410d41" + "888ac000412041001000417341ca8ac0004110103c419797abdd03410d2003410810254173" + "41da8ac000411d103c419797abdd03410d20044114101e417341f78ac0004118103c419797" + "abdd03410d41b183c0004108101f4173418f8bc0004117103c200120002802980120014181" + "2041001000417441a68bc000410e103c200141812042011001417441b48bc0004112103c41" + "9783c000418120200341081025417441c68bc000411b103c419783c0004181202004411410" + "1e417441e18bc0004116103c419783c00041812041b183c0004108101f417441f78bc00041" + "15103c419783c000410d2001200028029801101f4171418c8cc0004119103c200041003b01" + "ec01200120002802980120044114200241021024417141c19dc0004121103c200041f0016a" + "240041010f0b0b418080c000410b417f20052005417f4e1bac1001000b0bcd1d0200418080" + "c0000bc5056572726f725f636f64653d54455354204641494c454424242424242053544152" + "54494e47205741534d20455845435554494f4e2024242424246765745f6c65646765725f73" + "716e6765745f706172656e745f6c65646765725f74696d656765745f626173655f66656574" + "6573745f616d656e646d656e74616d656e646d656e745f656e61626c656463616368655f6c" + "65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272656e745f" + "6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f6172" + "7261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e6765745f637572" + "72656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c" + "65646765725f6f626a5f6e65737465645f61727261795f6c656e7570646174655f64617461" + "74657374206d65737361676574657374207075626b657974657374207369676e6174757265" + "636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f7472616e736665" + "725f66656574657374696e6720747261636574726163655f6163636f756e74400000000000" + "005f74726163655f616d6f756e746765745f706172656e745f6c65646765725f686173685f" + "6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c" + "646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74" + "785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e657374" + "65645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f6172" + "7261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f" + "6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e555344303030303030" + "30303030303030303030300041ed85c0000bf51774726163655f6e756d5f6f6f625f737472" + "6765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e7661" + "6c69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e" + "76616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f626967" + "5f736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74" + "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" + "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" + "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" + "675f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c" + "6f61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c" + "6f61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f" + "6f625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f" + "75696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e7432" + "35366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e" + "74323536303030303030303030303030303030303030303030303030303030303030303174" + "726163655f6163636f756e745f77726f6e675f73697a655f6163636f756e74696474726163" + "655f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f7374" + "72696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f" + "756e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d" + "5f746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774" + "726163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f" + "5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765745f706172" + "656e745f6c65646765725f686173686765745f63757272656e745f6c65646765725f6f626a" + "5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e657374" + "65645f6669656c646765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d70" + "7574655f7368613531325f68616c666765745f6e66746765745f6e66745f69737375657267" + "65745f6e66745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e745f" + "6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765725f" + "686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f68" + "6173685f6c656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f" + "6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65" + "796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c" + "696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65" + "745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f" + "625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f61737365" + "7432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e" + "63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e" + "63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e7661" + "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" + "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" + "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" + "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" + "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" + "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" + "3531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f" + "6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c" + "6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964" + "666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69" + "636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f737562" + "74726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c" + "69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469" + "766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c696365" + "32666c6f61745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c" + "696365666c6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73" + "697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f" + "75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e7432" + "35366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163" + "636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463686563" + "6b5f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469" + "616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e" + "7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65" + "676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65" + "676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f" + "7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "6964316465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "646c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e" + "655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f697373" + "75616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f" + "6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f66" + "6665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f" + "6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647369676e65" + "72735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f" + "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f7772" + "6f6e675f6c656e677468004d0970726f64756365727302086c616e67756167650104527573" + "74000c70726f6365737365642d6279010572757374631d312e38352e312028346562313631" + "32353020323032352d30332d313529002c0f7461726765745f6665617475726573022b0f6d" + "757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index f1332462a49..4478a8cd568 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -135,18 +135,6 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected - getLedgerAccountHash() - { - return Unexpected(HostFunctionError::INTERNAL); - } - - virtual Expected - getLedgerTransactionHash() - { - return Unexpected(HostFunctionError::INTERNAL); - } - virtual Expected getBaseFee() { diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 7c02e3160e2..f56aa102a5a 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -99,12 +99,6 @@ class WasmHostFunctionsImpl : public HostFunctions Expected getParentLedgerHash() override; - Expected - getLedgerAccountHash() override; - - Expected - getLedgerTransactionHash() override; - Expected getBaseFee() override; diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index dc0524d611a..6bfa576b9dc 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -44,20 +44,6 @@ getParentLedgerHash_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getLedgerAccountHash_proto = int32_t(uint8_t*, int32_t); -wasm_trap_t* -getLedgerAccountHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using getLedgerTransactionHash_proto = int32_t(uint8_t*, int32_t); -wasm_trap_t* -getLedgerTransactionHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - using getBaseFee_proto = int32_t(); wasm_trap_t* getBaseFee_wrap( diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index af8eff36eec..f6517767dcd 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -55,18 +55,6 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().info().parentHash; } -Expected -WasmHostFunctionsImpl::getLedgerAccountHash() -{ - return ctx.view().info().accountHash; -} - -Expected -WasmHostFunctionsImpl::getLedgerTransactionHash() -{ - return ctx.view().info().txHash; -} - Expected WasmHostFunctionsImpl::getBaseFee() { diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 304fc9eeda2..d7995f6b32a 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -358,34 +358,6 @@ getParentLedgerHash_wrap( runtime, params, results, hf->getParentLedgerHash(), index); } -wasm_trap_t* -getLedgerAccountHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) -{ - auto* hf = reinterpret_cast(env); - auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; - - return returnResult( - runtime, params, results, hf->getLedgerAccountHash(), index); -} - -wasm_trap_t* -getLedgerTransactionHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) -{ - auto* hf = reinterpret_cast(env); - auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; - - return returnResult( - runtime, params, results, hf->getLedgerTransactionHash(), index); -} - wasm_trap_t* getBaseFee_wrap( void* env, diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 022d66f9820..f2d3799ca86 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -41,8 +41,6 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerTime, "get_parent_ledger_time", hfs, 60); WASM_IMPORT_FUNC2(i, getParentLedgerHash, "get_parent_ledger_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerAccountHash, "get_ledger_account_hash", hfs, 60); - WASM_IMPORT_FUNC2(i, getLedgerTransactionHash, "get_ledger_tx_hash", hfs, 60); WASM_IMPORT_FUNC2(i, getBaseFee, "get_base_fee", hfs, 60); WASM_IMPORT_FUNC2(i, isAmendmentEnabled, "amendment_enabled", hfs, 100); From 9e14c14a26485150169d01b60605ba72299d39ef Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 13 Oct 2025 15:11:21 -0400 Subject: [PATCH 089/212] Use xrplf conan repo for wamr (#5862) --- BUILD.md | 1 - CMakeLists.txt | 2 +- cmake/RippledCore.cmake | 2 +- conan.lock | 4 +- conanfile.py | 4 +- external/wamr/conanfile.py | 88 -------------------------------------- 6 files changed, 6 insertions(+), 95 deletions(-) delete mode 100644 external/wamr/conanfile.py diff --git a/BUILD.md b/BUILD.md index 368400bf3ef..fd7a0b855df 100644 --- a/BUILD.md +++ b/BUILD.md @@ -147,7 +147,6 @@ git sparse-checkout set recipes/snappy git sparse-checkout add recipes/soci git fetch origin master git checkout master -conan export --version 2.4.1 external/wamr # TODO: needs to be added to the conan center index conan export --version 1.1.10 recipes/snappy/all conan export --version 4.0.3 recipes/soci/all rm -rf .git diff --git a/CMakeLists.txt b/CMakeLists.txt index 022f45e395d..073020da4f8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,7 +120,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) find_package(xxHash REQUIRED) -find_package(wamr REQUIRED) +find_package(wasm-xrplf REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index 98c0ef45608..2041886d21a 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -65,7 +65,7 @@ target_link_libraries(xrpl.imports.main xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> - wamr::wamr + wasm-xrplf::wasm-xrplf ) if (WIN32) diff --git a/conan.lock b/conan.lock index 6d0b0d3a799..82f2e939aff 100644 --- a/conan.lock +++ b/conan.lock @@ -3,7 +3,7 @@ "requires": [ "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", - "wamr/2.4.1#731b101bc8fa06d84e5c84edb4dc41a5%1756223745.11", + "wasm-xrplf/2.4.1-xrplf#dc67c558e283593ef0edd7eb00e9fa0d%1759862247.891", "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", @@ -54,4 +54,4 @@ ] }, "config_requires": [] -} +} \ No newline at end of file diff --git a/conanfile.py b/conanfile.py index bc3ab9c14b9..bfa256a66fe 100644 --- a/conanfile.py +++ b/conanfile.py @@ -31,7 +31,7 @@ class Xrpl(ConanFile): 'openssl/3.5.4', 'soci/4.0.3', 'zlib/1.3.1', - 'wamr/2.4.1', + 'wasm-xrplf/2.4.1-xrplf', ] test_requires = [ @@ -193,7 +193,7 @@ def package_info(self): 'protobuf::libprotobuf', 'soci::soci', 'sqlite3::sqlite', - 'wamr::wamr', + 'wasm-xrplf::wasm-xrplf', 'xxhash::xxhash', 'zlib::zlib', ] diff --git a/external/wamr/conanfile.py b/external/wamr/conanfile.py deleted file mode 100644 index 7057ef98084..00000000000 --- a/external/wamr/conanfile.py +++ /dev/null @@ -1,88 +0,0 @@ -from conan import ConanFile, tools -from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -#from conan.tools.files import (apply_conandata_patches, export_conandata_patches,) -from conan.tools.scm import Git - -# import os - -required_conan_version = ">=1.55.0" - - -class WamrConan(ConanFile): - name = "wamr" - version = "2.4.1" - license = "Apache License v2.0" - url = "https://github.com/ripple/wasm-micro-runtime.git" - description = "Webassembly micro runtime" - package_type = "library" - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False], "fPIC": [True, False]} - default_options = {"shared": False, "fPIC": True} - # requires = [("llvm/20.1.1@")] - - def export_sources(self): - #export_conandata_patches(self) - pass - - # def build_requirements(self): - # self.tool_requires("llvm/20.1.1") - - def config_options(self): - if self.settings.os == "Windows": - del self.options.fPIC - - def layout(self): - cmake_layout(self, src_folder="src") - - def source(self): - git = Git(self) - git.fetch_commit( - url="https://github.com/ripple/wasm-micro-runtime.git", - commit="a87e56fe8042bbe3ed99a514333ddef42e6c2a41", - ) - # get(self, **self.conan_data["sources"][self.version], strip_root=True) - - def generate(self): - tc = CMakeToolchain(self) - - tc.variables["WAMR_BUILD_INTERP"] = 1 - tc.variables["WAMR_BUILD_FAST_INTERP"] = 1 - tc.variables["WAMR_BUILD_INSTRUCTION_METERING"] = 1 - tc.variables["WAMR_BUILD_AOT"] = 0 - tc.variables["WAMR_BUILD_JIT"] = 0 - tc.variables["WAMR_BUILD_FAST_JIT"] = 0 - tc.variables["WAMR_BUILD_SIMD"] = 0 - tc.variables["WAMR_BUILD_LIB_PTHREAD"] = 0 - tc.variables["WAMR_BUILD_LIB_WASI_THREADS"] = 0 - tc.variables["WAMR_BUILD_TAIL_CALL"] = 1 - tc.variables["WAMR_BUILD_BULK_MEMORY"] = 0 - tc.variables["WAMR_DISABLE_HW_BOUND_CHECK"] = 1 - tc.variables["WAMR_DISABLE_STACK_HW_BOUND_CHECK"] = 1 - tc.variables["WAMR_BH_LOG"] = "wamr_log_to_rippled" - - tc.generate() - - # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder - deps = CMakeDeps(self) - deps.generate() - - def build(self): - #apply_conandata_patches(self) - cmake = CMake(self) - cmake.verbose = True - cmake.configure() - cmake.build() - # self.run(f'echo {self.source_folder}') - # Explicit way: - # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) - # self.run("cmake --build . %s" % cmake.build_config) - - def package(self): - cmake = CMake(self) - cmake.verbose = True - cmake.install() - - def package_info(self): - self.cpp_info.libs = ["iwasm"] - self.cpp_info.names["cmake_find_package"] = "wamr" - self.cpp_info.names["cmake_find_package_multi"] = "wamr" From 91455b6860d6fc62a9f1b868b1cf14315d3c67e4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 13 Oct 2025 15:20:03 -0400 Subject: [PATCH 090/212] respond to comments --- include/xrpl/protocol/TxMeta.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/xrpl/protocol/TxMeta.h b/include/xrpl/protocol/TxMeta.h index 6b1c24e9eb5..d4df384616e 100644 --- a/include/xrpl/protocol/TxMeta.h +++ b/include/xrpl/protocol/TxMeta.h @@ -152,7 +152,7 @@ class TxMeta } void - setGasUsed(std::uint32_t const& gasUsed) + setGasUsed(std::uint32_t const gasUsed) { gasUsed_ = gasUsed; } @@ -169,11 +169,11 @@ class TxMeta bool hasGasUsed() const { - return static_cast(gasUsed_); + return gasUsed_.has_value(); } void - setWasmReturnCode(std::int32_t const& wasmReturnCode) + setWasmReturnCode(std::int32_t const wasmReturnCode) { wasmReturnCode_ = wasmReturnCode; } @@ -190,7 +190,7 @@ class TxMeta bool hasWasmReturnCode() const { - return static_cast(wasmReturnCode_); + return wasmReturnCode_.has_value(); } private: From c6c54b3282e0cb70fe35fd96eb89b01677256925 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 17:54:54 -0400 Subject: [PATCH 091/212] resolve todos --- src/xrpld/app/tx/detail/Escrow.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 185b7c74135..b0b4bde58cc 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -695,7 +695,6 @@ EscrowCreate::doApply() } // increment owner count - // TODO: determine actual reserve based on FinishFunction size adjustOwnerCount(ctx_.view(), sle, reserveToAdd, ctx_.journal); ctx_.view().update(sle); return tesSUCCESS; @@ -1345,12 +1344,17 @@ EscrowFinish::doApply() if (re.has_value()) { + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << reCost; + auto reValue = re.value().result; ctx_.setWasmReturnCode(reValue); - // TODO: better error handling for this conversion - ctx_.setGasUsed(static_cast(re.value().cost)); - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) - << ", cost: " << re.value().cost; + + auto reCost = re.value().cost; + if (reCost < 0 || reCost > std::numeric_limits::max()) + return tecINTERNAL; // LCOV_EXCL_LINE + ctx_.setGasUsed(static_cast(reCost)); + if (reValue <= 0) { return tecWASM_REJECTED; From 17f401f374740e6a655af0fda0a5f08efc17f15c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 17:58:41 -0400 Subject: [PATCH 092/212] reduce diff --- include/xrpl/protocol/SField.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index e25447c3945..b6ae98b48f5 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -359,6 +359,7 @@ using SF_UINT384 = TypedField>; using SF_UINT512 = TypedField>; using SF_INT32 = TypedField>; +using SF_INT64 = TypedField>; using SF_ACCOUNT = TypedField; using SF_AMOUNT = TypedField; From c9c35780d29733bd3a945bbb1766004bff0de82e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 18:00:58 -0400 Subject: [PATCH 093/212] reduce diff more --- include/xrpl/protocol/MPTAmount.h | 3 +-- include/xrpl/protocol/XRPAmount.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/include/xrpl/protocol/MPTAmount.h b/include/xrpl/protocol/MPTAmount.h index 7ece7cc3b51..419450eeb9e 100644 --- a/include/xrpl/protocol/MPTAmount.h +++ b/include/xrpl/protocol/MPTAmount.h @@ -149,12 +149,11 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; - using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128 const amt128(amt.value()); + int128_t const amt128(amt.value()); auto const neg = amt.value() < 0; auto const m = amt128 * num; auto r = m / den; diff --git a/include/xrpl/protocol/XRPAmount.h b/include/xrpl/protocol/XRPAmount.h index b595ec0bc76..a7a013d6256 100644 --- a/include/xrpl/protocol/XRPAmount.h +++ b/include/xrpl/protocol/XRPAmount.h @@ -286,12 +286,11 @@ mulRatio( bool roundUp) { using namespace boost::multiprecision; - using int128 = boost::multiprecision::int128_t; if (!den) Throw("division by zero"); - int128 const amt128(amt.drops()); + int128_t const amt128(amt.drops()); auto const neg = amt.drops() < 0; auto const m = amt128 * num; auto r = m / den; From 3b6cd22e325bada0cc9988b73c6e1d133d4cdaef Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 14 Oct 2025 18:10:11 -0400 Subject: [PATCH 094/212] fix --- src/xrpld/app/tx/detail/Escrow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index b0b4bde58cc..d767ba80688 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1344,13 +1344,13 @@ EscrowFinish::doApply() if (re.has_value()) { + auto reValue = re.value().result; + auto reCost = re.value().cost; JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << reCost; - auto reValue = re.value().result; ctx_.setWasmReturnCode(reValue); - auto reCost = re.value().cost; if (reCost < 0 || reCost > std::numeric_limits::max()) return tecINTERNAL; // LCOV_EXCL_LINE ctx_.setGasUsed(static_cast(reCost)); From 9cfb7ac340e3f3b0a9dfef20750e477ed97ed2ef Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 20 Oct 2025 17:20:35 -0400 Subject: [PATCH 095/212] fix build issue --- src/test/app/EscrowSmart_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 6eaed01e2cd..f8f21c1cc01 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -853,7 +853,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); env(offer(alice, carol["GBP"](0.1), XRP(100))); - env(create(alice, carol, XRP(1000), 100s, alice.pk())); + env(paychan::create(alice, carol, XRP(1000), 100s, alice.pk())); pdomain::Credentials credentials{{alice, "first credential"}}; env(pdomain::setTx(alice, credentials)); env(signers(alice, 1, {{carol, 1}})); From af6beb1d7c9f51f62740ff151212f6aa2afa5f16 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 23 Oct 2025 15:41:32 -0400 Subject: [PATCH 096/212] fix ledger used for rules --- src/xrpld/app/misc/NetworkOPs.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 337ae49a118..eab22dba467 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2946,8 +2946,7 @@ NetworkOPsImp::getServerInfo(bool human, bool admin, bool counters) l[jss::hash] = to_string(lpClosed->info().hash); bool const smartEscrowEnabled = - m_ledgerMaster.getValidatedLedger()->rules().enabled( - featureSmartEscrow); + lpClosed->rules().enabled(featureSmartEscrow); if (!human) { l[jss::base_fee] = baseFee.jsonClipped(); From 101f285bcd64740b0bedd4a6164915c89ae64c16 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 16:01:45 -0400 Subject: [PATCH 097/212] return size from updateData --- src/test/app/HostFuncImpl_test.cpp | 2 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 8dd83fc74ae..3835b475a60 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1315,7 +1315,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should succeed for small data std::vector data(10, 0x42); auto const result = hfs.updateData(Slice(data.data(), data.size())); - BEAST_EXPECT(result.has_value() && result.value() == 0); + BEAST_EXPECT(result.has_value() && result.value() == data.size()); // Should fail for too large data std::vector bigData(maxWasmDataLength + 1, 0x42); diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index f6517767dcd..ca87b4fe307 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -431,7 +431,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } data_ = Bytes(data.begin(), data.end()); - return 0; + return data_.size(); } Expected From 29f5430881efc0de605e240e10a6a9337f2939ef Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 16:05:38 -0400 Subject: [PATCH 098/212] fix bug --- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index ca87b4fe307..b21a3d8b620 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -431,7 +431,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } data_ = Bytes(data.begin(), data.end()); - return data_.size(); + return data_->size(); } Expected From 079e251aca3fc9e44eeaad38d3a5cc1545c35899 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 16:05:38 -0400 Subject: [PATCH 099/212] fix bug --- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index ca87b4fe307..b21a3d8b620 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -431,7 +431,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); } data_ = Bytes(data.begin(), data.end()); - return data_.size(); + return data_->size(); } Expected From fc6ff6975218ba2b3ac3fbfa820f480efd8cb372 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 17:14:46 -0400 Subject: [PATCH 100/212] fix tests --- .../all_host_functions/src/lib.rs | 2 +- src/test/app/wasm_fixtures/fixtures.cpp | 370 +++++++++--------- 2 files changed, 186 insertions(+), 186 deletions(-) diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index c8a27aed876..942e1c67c6a 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -757,7 +757,7 @@ fn test_data_update_functions() -> i32 { let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; - if update_result != 0 { + if update_result != update_payload.len() as i32 { let _ = trace_num("ERROR: update_data failed:", update_result as i64); return -701; // Data update failed } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index b11fc95adc9..5f845fbe785 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8659,195 +8659,195 @@ extern std::string const allHostFunctionsWasmHex = "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0aff1b051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0a821c051900200241094f0440000b20002002360204200020013602000b1900200241214f" "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" "6a22044100360200200141106a220542003703002001420037030802404181802020014108" "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b460020012d0000410146044041" - "8080c000410b20013402041001000b20002001290001370000200041106a200141116a2800" - "00360000200041086a200141096a2900003700000be81901097f230041b0036b2200240041" - "8b80c000411b41004100410010021a41a680c000411941004100410010021a41e780c00041" - "2b41004100410010021a027f02400240024002400240024002401003220141004a04404192" - "81c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c8" - "016a22034200370300200041c0016a22054200370300200041b8016a220442003703002000" - "42003703b001200041b0016a22064120100522014120470d0241bc81c00041132006412041" - "0110021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a20" - "0041a0016a410036020020004198016a420037030020004200370390014181802020004190" - "016a22024114100022014114470d03418a83c00041142002411410061a2000420037037041" - "888018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583" - "c000412820024108410110021a2000410036025041848008200041d0006a22024104100022" - "014104470d0541dd83c000411520024104410110021a200041013b003c2003420037030020" - "05420037030020044200370300200042003703b00102402000413c6a410220064120100722" - "0141004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d" - "20002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c000" - "41154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a41" - "021009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac10" - "011a0b41a585c000412341004100410010021a41de86c000413341004100410010021a2000" - "420037037041828018200041f0006a22014108100a220241004c0d06200241084604404191" - "87c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f20" - "02ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c" - "410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac" - "10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001" - "ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b" - "2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a41003602" - "0020004198016a4200370300200042003703900102404181802020004190016a2202411410" - "0a220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac1001" - "1a0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a" - "4200370300200042003703b0010240200041d0006a4102200041b0016a22014120100b2202" - "41004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c000411520" - "002802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac00041" - "244183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c" - "2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc000412841004100410010" - "021a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a220120" - "02101d200041a8016a4200370300200041a0016a420037030020004198016a420037030020" - "00420037039001024002400240024002402001411420004190016a22024120100e22014120" - "460440200241204100100f220441004a044041858cc00041232004ad10011a200042003703" - "50200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc0" - "00412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad" - "10011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c4101" - "10021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a42" - "00370300200041b8016a4200370300200042003703b001410141828018200041b0016a4120" - "101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc00041" - "2b2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041" - "d0006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b41" - "014183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a41" - "0210132201410048044041ca91c00041392001ac10011a0b418392c0004137410041004100" - "10021a0c010b200041013b003c200041c8016a4200370300200041c0016a42003703002000" - "41b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a220141" - "201011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8e" - "c000411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41" - "cf8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e04" - "4041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc00041" - "2441004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c" - "2000413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d8" - "006a4200370300200042003703500240024002400240024020044114200041d0006a220241" - "20100e22014120460440419793c000410f20024120410110021a20004188016a4200370300" - "20004180016a4200370300200041f8006a4200370300200042003703700240200441142004" - "411441a693c0004109200041f0006a220141201014220241004a0440200041086a20012002" - "101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002ac" - "10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a22" - "05420037030020004200370390012000413c6a2202411441e80720004190016a2207412010" - "1522014120470d0141fc93c000410e20074120410110021a200041c8016a42003703002000" - "41c0016a4200370300200041b8016a4200370300200042003703b00120024114412a200041" - "b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c000" - "412441004100410010021a419195c000412541004100410010021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037041b695c0004117" - "200041f0006a22024120101722014120470d0341cd95c000410b41b695c000411741011002" - "1a41d895c000411120024120410110021a2004101c200041d0006a22062004101d20084200" - "3703002003420037030020054200370300200042003703900102404100200422036b410371" - "220220036a220520034d0d0020020440200221010340200341003a0000200341016a210320" - "0141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a41003a" - "0000200341066a41003a0000200341056a41003a0000200341046a41003a0000200341036a" - "41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d00" - "0b0b200541800220026b2201417c716a220320054b0440034020054100360200200541046a" - "22052003490d000b0b024020032001410371220120036a22024f0d00200122050440034020" - "0341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d00034020" - "0341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a000020" - "0341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a" - "0000200341086a22032002470d000b0b024020064114200741202004418002101822014100" - "4a044041e995c00041102001ad10011a20014181024f0d0641f995c0004109200420014101" - "10021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c0004107410110" - "0222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480440" - "41ad97c000411a42a47b10011a41a47b0c070b41f796c000411c420010011a419397c00041" - "1a41004100410010021a41ff97c000412941004100410010021a41a898c000412810192201" - "45044041d098c000412741a898c0004128410110021a41f798c000411e4100410041001002" - "1a41bf80c000412841004100410010021a41010c070b419599c000411a2001ac10011a41c3" - "7a0c060b41f494c000411d2001ac10011a418b7c0c050b41d894c000411c2001ac10011a41" - "897c0c040b41bc94c000411c2001ac10011a41887c0c030b41dd97c00041222001ac10011a" - "41a77b0c020b000b41c797c00041162001ac10011a41a57b0b200041b0036a24000b0bb919" - "0100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f" - "4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e7353" - "5543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061737365" - "64212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e6374" - "696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e74" - "206c65646765722074696d653a506172656e74206c656467657220686173683a5355434345" - "53533a204c6564676572206865616465722066756e6374696f6e734552524f523a20676574" - "5f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a4552524f" - "523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a4552524f" - "523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f7279" - "20323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d547261" - "6e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e67" - "74683a5472616e73616374696f6e20466565202873657269616c697a65642058525020616d" - "6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420666965" - "6c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e" - "65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273206172" - "726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374656420" - "6172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e736163" - "74696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f6669656c" - "642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" - "785f6669656c6428466565292077726f6e67206c656e677468202865787065637465642038" - "20627974657320666f7220585250293a4552524f523a206765745f74785f6669656c642841" - "63636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a20" - "43757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d4375" - "7272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f75" - "6e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a65" - "642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e636520" - "6c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563" - "742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f62" - "6a5f6669656c642842616c616e636529206661696c656420286d6179206265206578706563" - "746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a494e" - "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c64284163636f" - "756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e67" - "74683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f637572" - "72656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c" - "696361626c653a43757272656e74206f626a656374205369676e657273206172726179206c" - "656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e46" - "4f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e74" - "206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f727920" - "343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d537563" - "6365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361636865" - "64206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74293a" - "436163686564206f626a6563742062616c616e6365202873657269616c697a656420585250" - "20616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e677468" - "20286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e" - "63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e6365" - "29206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a43" - "6163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163686564" - "206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e" - "6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a5355" - "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e46" - "4f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374656420" - "776974682074657374206669787475726573293a494e464f3a206765745f6c65646765725f" - "6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063616368" - "6564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65737465" - "645f6669656c64206661696c65642061732065787065637465643a494e464f3a206765745f" - "6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870656374" - "65643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" - "6c656e206661696c65642061732065787065637465643a535543434553533a20416e79206c" - "6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520746573" - "746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f7220" - "63616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047" - "656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c6574" - "3a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063726564" - "656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e7465" - "7266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b6579" - "6c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e637469" - "6f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a" - "20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e745f" - "6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c697479" - "2046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c6421" - "496e70757420646174613a5348413531322068616c6620686173683a4e4654206461746120" - "6c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c656420" - "286578706563746564202d206e6f2073756368204e4654293a54657374207472616365206d" - "6573736167657061796c6f616454726163652066756e6374696f6e20627974657320777269" - "7474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e6374" - "696f6e20737563636565646564535543434553533a205574696c6974792066756e6374696f" - "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a207472" - "6163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f6861" - "6c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064617465" - "2046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279206461" - "74612066726f6d205741534d20746573745375636365737366756c6c792075706461746564" - "206c656467657220656e74727920776974683a535543434553533a20446174612075706461" - "74652066756e6374696f6e734552524f523a207570646174655f64617461206661696c6564" - "3a004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d6279010572757374631d312e39302e30202831313539653738633420323032352d" - "30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c" - "6f62616c732b087369676e2d657874"; + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bec1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c000412810192201412846044041d098c000412741a898c00041" + "28410110021a41f798c000411e41004100410010021a41bf80c00041284100410041001002" + "1a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac1001" + "1a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10" + "011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c000411620" + "01ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b" + "0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e43" + "54494f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f" + "6e73535543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061" + "73736564212d2d2d2043617465676f727920313a204c656467657220486561646572204675" + "6e6374696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172" + "656e74206c65646765722074696d653a506172656e74206c656467657220686173683a5355" + "43434553533a204c6564676572206865616465722066756e6374696f6e734552524f523a20" + "6765745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a45" + "52524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a45" + "52524f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d204361746567" + "6f727920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d" + "5472616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c" + "656e6774683a5472616e73616374696f6e20466565202873657269616c697a656420585250" + "20616d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420" + "6669656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74" + "785f6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273" + "206172726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374" + "6564206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e" + "73616374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f66" + "69656c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765" + "745f74785f6669656c6428466565292077726f6e67206c656e677468202865787065637465" + "64203820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c" + "64284163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920" + "333a2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d" + "2d43757272656e74206f626a6563742062616c616e6365206c656e67746820285852502061" + "6d6f756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c" + "697a65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e" + "6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f62" + "6a6563742062616c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c642842616c616e636529206661696c656420286d6179206265206578" + "706563746564293a43757272656e74206c6564676572206f626a656374206163636f756e74" + "3a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642841" + "63636f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c" + "656e6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f742061" + "70706c696361626c653a43757272656e74206f626a656374205369676e6572732061727261" + "79206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a" + "494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272" + "656e74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f" + "727920343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d" + "5375636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361" + "63686564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e" + "74293a436163686564206f626a6563742062616c616e6365202873657269616c697a656420" + "58525020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e" + "67746820286e6f6e2d58525020616d6f756e74293a436163686564206f626a656374206261" + "6c616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c61" + "6e636529206661696c65643a436163686564206e6573746564206669656c64206c656e6774" + "683a436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163" + "686564206f626a656374205369676e657273206172726179206c656e6774683a4361636865" + "64206e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c65" + "3a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73" + "494e464f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374" + "656420776974682074657374206669787475726573293a494e464f3a206765745f6c656467" + "65725f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063" + "6163686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65" + "737465645f6669656c64206661696c65642061732065787065637465643a494e464f3a2067" + "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870" + "65637465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206661696c65642061732065787065637465643a535543434553533a20416e" + "79206c6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520" + "746573746564294552524f523a206163636f756e745f6b65796c6574206661696c65642066" + "6f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65" + "742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b6579" + "6c65743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063" + "726564656e7469616c5f6b65796c6574206661696c656420286578706563746564202d2069" + "6e74657266616365206973737565293a457363726f77206b65796c65743a4f7261636c6520" + "6b65796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e" + "6374696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a455252" + "4f523a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f75" + "6e745f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c" + "6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f72" + "6c6421496e70757420646174613a5348413531322068616c6620686173683a4e4654206461" + "7461206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c" + "656420286578706563746564202d206e6f2073756368204e4654293a546573742074726163" + "65206d6573736167657061796c6f616454726163652066756e6374696f6e20627974657320" + "7772697474656e3a54657374206e756d62657220747261636554726163655f6e756d206675" + "6e6374696f6e20737563636565646564535543434553533a205574696c6974792066756e63" + "74696f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a" + "2074726163652829206661696c65643a4552524f523a20636f6d707574655f736861353132" + "5f68616c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064" + "6174652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279" + "20646174612066726f6d205741534d20746573745375636365737366756c6c792075706461" + "746564206c656467657220656e74727920776974683a535543434553533a20446174612075" + "70646174652066756e6374696f6e734552524f523a207570646174655f6461746120666169" + "6c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f" + "6365737365642d6279010572757374631d312e38352e312028346562313631323530203230" + "32352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c65" + "2d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" From 0c65a386b5df9f898c911adc2e0520d4e2aca777 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 24 Oct 2025 18:01:01 -0400 Subject: [PATCH 101/212] fix tests --- src/test/app/TestHostFunctions.h | 2 +- .../all_host_functions/src/lib.rs | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 2 +- src/test/app/wasm_fixtures/fixtures.cpp | 372 +++++++++--------- 4 files changed, 189 insertions(+), 189 deletions(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 11d613bc8dc..040db53f103 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -292,7 +292,7 @@ struct TestHostFunctions : public HostFunctions Expected updateData(Slice const& data) override { - return 0; + return data.size(); } Expected diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index c8a27aed876..942e1c67c6a 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -757,7 +757,7 @@ fn test_data_update_functions() -> i32 { let update_result = unsafe { host::update_data(update_payload.as_ptr(), update_payload.len()) }; - if update_result != 0 { + if update_result != update_payload.len() as i32 { let _ = trace_num("ERROR: update_data failed:", update_result as i64); return -701; // Data update failed } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index f02550ba967..8d72443fb79 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -162,7 +162,7 @@ pub extern "C" fn finish() -> i32 { ); check_result( unsafe { host::update_data(account.0.as_ptr(), account.0.len()) }, - 0, + 20, "update_data", ); with_buffer::<32, _, _>(|ptr, len| { diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index ea46b49d398..7db468bb2b8 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8659,195 +8659,195 @@ extern std::string const allHostFunctionsWasmHex = "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0aff1b051900200241094f0440000b20002002360204200020013602000b1900200241214f" + "0a821c051900200241094f0440000b20002002360204200020013602000b1900200241214f" "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" "6a22044100360200200141106a220542003703002001420037030802404181802020014108" "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b460020012d0000410146044041" - "8080c000410b20013402041001000b20002001290001370000200041106a200141116a2800" - "00360000200041086a200141096a2900003700000be81901097f230041b0036b2200240041" - "8b80c000411b41004100410010021a41a680c000411941004100410010021a41e780c00041" - "2b41004100410010021a027f02400240024002400240024002401003220141004a04404192" - "81c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c8" - "016a22034200370300200041c0016a22054200370300200041b8016a220442003703002000" - "42003703b001200041b0016a22064120100522014120470d0241bc81c00041132006412041" - "0110021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a20" - "0041a0016a410036020020004198016a420037030020004200370390014181802020004190" - "016a22024114100022014114470d03418a83c00041142002411410061a2000420037037041" - "888018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583" - "c000412820024108410110021a2000410036025041848008200041d0006a22024104100022" - "014104470d0541dd83c000411520024104410110021a200041013b003c2003420037030020" - "05420037030020044200370300200042003703b00102402000413c6a410220064120100722" - "0141004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d" - "20002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c000" - "41154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a41" - "021009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac10" - "011a0b41a585c000412341004100410010021a41de86c000413341004100410010021a2000" - "420037037041828018200041f0006a22014108100a220241004c0d06200241084604404191" - "87c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f20" - "02ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c" - "410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac" - "10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001" - "ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b" - "2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a41003602" - "0020004198016a4200370300200042003703900102404181802020004190016a2202411410" - "0a220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac1001" - "1a0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a" - "4200370300200042003703b0010240200041d0006a4102200041b0016a22014120100b2202" - "41004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c000411520" - "002802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac00041" - "244183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c" - "2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc000412841004100410010" - "021a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a220120" - "02101d200041a8016a4200370300200041a0016a420037030020004198016a420037030020" - "00420037039001024002400240024002402001411420004190016a22024120100e22014120" - "460440200241204100100f220441004a044041858cc00041232004ad10011a200042003703" - "50200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc0" - "00412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad" - "10011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c4101" - "10021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a42" - "00370300200041b8016a4200370300200042003703b001410141828018200041b0016a4120" - "101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc00041" - "2b2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041" - "d0006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b41" - "014183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a41" - "0210132201410048044041ca91c00041392001ac10011a0b418392c0004137410041004100" - "10021a0c010b200041013b003c200041c8016a4200370300200041c0016a42003703002000" - "41b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a220141" - "201011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8e" - "c000411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41" - "cf8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e04" - "4041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc00041" - "2441004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c" - "2000413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d8" - "006a4200370300200042003703500240024002400240024020044114200041d0006a220241" - "20100e22014120460440419793c000410f20024120410110021a20004188016a4200370300" - "20004180016a4200370300200041f8006a4200370300200042003703700240200441142004" - "411441a693c0004109200041f0006a220141201014220241004a0440200041086a20012002" - "101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002ac" - "10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a22" - "05420037030020004200370390012000413c6a2202411441e80720004190016a2207412010" - "1522014120470d0141fc93c000410e20074120410110021a200041c8016a42003703002000" - "41c0016a4200370300200041b8016a4200370300200042003703b00120024114412a200041" - "b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c000" - "412441004100410010021a419195c000412541004100410010021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037041b695c0004117" - "200041f0006a22024120101722014120470d0341cd95c000410b41b695c000411741011002" - "1a41d895c000411120024120410110021a2004101c200041d0006a22062004101d20084200" - "3703002003420037030020054200370300200042003703900102404100200422036b410371" - "220220036a220520034d0d0020020440200221010340200341003a0000200341016a210320" - "0141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a41003a" - "0000200341066a41003a0000200341056a41003a0000200341046a41003a0000200341036a" - "41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d00" - "0b0b200541800220026b2201417c716a220320054b0440034020054100360200200541046a" - "22052003490d000b0b024020032001410371220120036a22024f0d00200122050440034020" - "0341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d00034020" - "0341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a000020" - "0341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a" - "0000200341086a22032002470d000b0b024020064114200741202004418002101822014100" - "4a044041e995c00041102001ad10011a20014181024f0d0641f995c0004109200420014101" - "10021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c0004107410110" - "0222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480440" - "41ad97c000411a42a47b10011a41a47b0c070b41f796c000411c420010011a419397c00041" - "1a41004100410010021a41ff97c000412941004100410010021a41a898c000412810192201" - "45044041d098c000412741a898c0004128410110021a41f798c000411e4100410041001002" - "1a41bf80c000412841004100410010021a41010c070b419599c000411a2001ac10011a41c3" - "7a0c060b41f494c000411d2001ac10011a418b7c0c050b41d894c000411c2001ac10011a41" - "897c0c040b41bc94c000411c2001ac10011a41887c0c030b41dd97c00041222001ac10011a" - "41a77b0c020b000b41c797c00041162001ac10011a41a57b0b200041b0036a24000b0bb919" - "0100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f" - "4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f6e7353" - "5543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061737365" - "64212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e6374" - "696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e74" - "206c65646765722074696d653a506172656e74206c656467657220686173683a5355434345" - "53533a204c6564676572206865616465722066756e6374696f6e734552524f523a20676574" - "5f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a4552524f" - "523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a4552524f" - "523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f7279" - "20323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d547261" - "6e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e67" - "74683a5472616e73616374696f6e20466565202873657269616c697a65642058525020616d" - "6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420666965" - "6c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e" - "65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273206172" - "726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374656420" - "6172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e736163" - "74696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f6669656c" - "642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f74" - "785f6669656c6428466565292077726f6e67206c656e677468202865787065637465642038" - "20627974657320666f7220585250293a4552524f523a206765745f74785f6669656c642841" - "63636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a20" - "43757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d4375" - "7272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f75" - "6e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a65" - "642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e636520" - "6c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563" - "742062616c616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f62" - "6a5f6669656c642842616c616e636529206661696c656420286d6179206265206578706563" - "746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a494e" - "464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c64284163636f" - "756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e67" - "74683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f637572" - "72656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c" - "696361626c653a43757272656e74206f626a656374205369676e657273206172726179206c" - "656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e46" - "4f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272656e74" - "206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f727920" - "343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d537563" - "6365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361636865" - "64206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74293a" - "436163686564206f626a6563742062616c616e6365202873657269616c697a656420585250" - "20616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e677468" - "20286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e" - "63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e6365" - "29206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a43" - "6163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163686564" - "206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e" - "6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a5355" - "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e46" - "4f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374656420" - "776974682074657374206669787475726573293a494e464f3a206765745f6c65646765725f" - "6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063616368" - "6564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65737465" - "645f6669656c64206661696c65642061732065787065637465643a494e464f3a206765745f" - "6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870656374" - "65643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f" - "6c656e206661696c65642061732065787065637465643a535543434553533a20416e79206c" - "6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520746573" - "746564294552524f523a206163636f756e745f6b65796c6574206661696c656420666f7220" - "63616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047" - "656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c6574" - "3a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063726564" - "656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e7465" - "7266616365206973737565293a457363726f77206b65796c65743a4f7261636c65206b6579" - "6c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e637469" - "6f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a" - "20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f756e745f" - "6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c697479" - "2046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c6421" - "496e70757420646174613a5348413531322068616c6620686173683a4e4654206461746120" - "6c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c656420" - "286578706563746564202d206e6f2073756368204e4654293a54657374207472616365206d" - "6573736167657061796c6f616454726163652066756e6374696f6e20627974657320777269" - "7474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e6374" - "696f6e20737563636565646564535543434553533a205574696c6974792066756e6374696f" - "6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a207472" - "6163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f6861" - "6c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064617465" - "2046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279206461" - "74612066726f6d205741534d20746573745375636365737366756c6c792075706461746564" - "206c656467657220656e74727920776974683a535543434553533a20446174612075706461" - "74652066756e6374696f6e734552524f523a207570646174655f64617461206661696c6564" - "3a004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573" - "7365642d6279010572757374631d312e39302e30202831313539653738633420323032352d" - "30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c" - "6f62616c732b087369676e2d657874"; + "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" + "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" + "00000f0b418080c000410b20013402041001000bec1901097f230041b0036b22002400418b" + "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" + "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" + "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" + "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" + "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" + "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" + "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" + "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" + "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" + "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" + "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" + "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" + "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" + "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" + "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" + "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" + "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" + "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" + "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" + "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" + "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" + "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" + "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" + "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" + "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" + "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" + "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" + "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" + "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" + "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" + "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" + "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "420037039001024002400240024002402001411420004190016a22024120100e2201412046" + "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" + "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" + "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" + "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" + "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" + "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" + "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" + "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" + "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" + "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" + "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" + "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" + "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" + "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" + "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" + "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" + "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" + "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" + "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" + "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" + "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" + "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" + "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" + "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" + "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" + "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" + "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" + "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" + "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" + "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" + "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" + "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" + "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" + "00370300200342003703002005420037030020004200370390010240200422032003410020" + "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" + "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" + "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" + "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" + "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" + "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" + "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" + "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" + "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" + "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" + "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" + "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" + "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" + "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" + "004100410010021a41a898c000412810192201412846044041d098c000412741a898c00041" + "28410110021a41f798c000411e41004100410010021a41bf80c00041284100410041001002" + "1a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac1001" + "1a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10" + "011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c000411620" + "01ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b" + "0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e43" + "54494f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f" + "6e73535543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061" + "73736564212d2d2d2043617465676f727920313a204c656467657220486561646572204675" + "6e6374696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172" + "656e74206c65646765722074696d653a506172656e74206c656467657220686173683a5355" + "43434553533a204c6564676572206865616465722066756e6374696f6e734552524f523a20" + "6765745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a45" + "52524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a45" + "52524f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d204361746567" + "6f727920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d" + "5472616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c" + "656e6774683a5472616e73616374696f6e20466565202873657269616c697a656420585250" + "20616d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420" + "6669656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74" + "785f6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273" + "206172726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374" + "6564206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e" + "73616374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f66" + "69656c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765" + "745f74785f6669656c6428466565292077726f6e67206c656e677468202865787065637465" + "64203820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c" + "64284163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920" + "333a2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d" + "2d43757272656e74206f626a6563742062616c616e6365206c656e67746820285852502061" + "6d6f756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c" + "697a65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e" + "6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f62" + "6a6563742062616c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c642842616c616e636529206661696c656420286d6179206265206578" + "706563746564293a43757272656e74206c6564676572206f626a656374206163636f756e74" + "3a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642841" + "63636f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c" + "656e6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f742061" + "70706c696361626c653a43757272656e74206f626a656374205369676e6572732061727261" + "79206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a" + "494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61" + "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272" + "656e74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f" + "727920343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d" + "5375636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361" + "63686564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e" + "74293a436163686564206f626a6563742062616c616e6365202873657269616c697a656420" + "58525020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e" + "67746820286e6f6e2d58525020616d6f756e74293a436163686564206f626a656374206261" + "6c616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c61" + "6e636529206661696c65643a436163686564206e6573746564206669656c64206c656e6774" + "683a436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163" + "686564206f626a656374205369676e657273206172726179206c656e6774683a4361636865" + "64206e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c65" + "3a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73" + "494e464f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374" + "656420776974682074657374206669787475726573293a494e464f3a206765745f6c656467" + "65725f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063" + "6163686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65" + "737465645f6669656c64206661696c65642061732065787065637465643a494e464f3a2067" + "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870" + "65637465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e206661696c65642061732065787065637465643a535543434553533a20416e" + "79206c6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520" + "746573746564294552524f523a206163636f756e745f6b65796c6574206661696c65642066" + "6f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65" + "742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b6579" + "6c65743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063" + "726564656e7469616c5f6b65796c6574206661696c656420286578706563746564202d2069" + "6e74657266616365206973737565293a457363726f77206b65796c65743a4f7261636c6520" + "6b65796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e" + "6374696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a455252" + "4f523a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f75" + "6e745f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c" + "6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f72" + "6c6421496e70757420646174613a5348413531322068616c6620686173683a4e4654206461" + "7461206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c" + "656420286578706563746564202d206e6f2073756368204e4654293a546573742074726163" + "65206d6573736167657061796c6f616454726163652066756e6374696f6e20627974657320" + "7772697474656e3a54657374206e756d62657220747261636554726163655f6e756d206675" + "6e6374696f6e20737563636565646564535543434553533a205574696c6974792066756e63" + "74696f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a" + "2074726163652829206661696c65643a4552524f523a20636f6d707574655f736861353132" + "5f68616c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064" + "6174652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279" + "20646174612066726f6d205741534d20746573745375636365737366756c6c792075706461" + "746564206c656467657220656e74727920776974683a535543434553533a20446174612075" + "70646174652066756e6374696f6e734552524f523a207570646174655f6461746120666169" + "6c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f" + "6365737365642d6279010572757374631d312e38352e312028346562313631323530203230" + "32352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c65" + "2d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -9947,7 +9947,7 @@ extern std::string const codecovTestsWasmHex = "103c4189803c1010412041a881c0004120103c41014189803c1011412041c881c000411810" "3c20012000280298011012412041e081c0004117103c20012000280298011013412041f781" "c0004127103c4101200120002802980110144120419e82c000411f103c200041246a220441" - "141015410041bd82c000410b103c200041e0016a2206420037030020024200370300200342" + "141015411441bd82c000410b103c200041e0016a2206420037030020024200370300200342" "00370300200042003703c8012001200028029801200541201016412041bc8dc0004113103c" "41c882c000410c41d482c000410b41df82c000410e1017410141ed82c0004109103c200041" "b8016a200041186a290300370300200041b0016a200041106a290300370300200041a8016a" From d66e3c949e7e86c2eba68b600a0e8fb587a6b8a9 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 29 Oct 2025 12:55:07 -0400 Subject: [PATCH 102/212] Chores: Sort package list (#5963) --- CMakeLists.txt | 2 +- cmake/RippledCore.cmake | 2 +- conanfile.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 073020da4f8..7fd1a9b5292 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,8 +119,8 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) -find_package(xxHash REQUIRED) find_package(wasm-xrplf REQUIRED) +find_package(xxHash REQUIRED) target_link_libraries(ripple_libs INTERFACE ed25519::ed25519 diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index 2041886d21a..c3800c55861 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -62,10 +62,10 @@ target_link_libraries(xrpl.imports.main date::date ed25519::ed25519 secp256k1::secp256k1 + wasm-xrplf::wasm-xrplf xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> - wasm-xrplf::wasm-xrplf ) if (WIN32) diff --git a/conanfile.py b/conanfile.py index bfa256a66fe..5a24ac1988d 100644 --- a/conanfile.py +++ b/conanfile.py @@ -30,8 +30,8 @@ class Xrpl(ConanFile): 'nudb/2.0.9', 'openssl/3.5.4', 'soci/4.0.3', - 'zlib/1.3.1', 'wasm-xrplf/2.4.1-xrplf', + 'zlib/1.3.1', ] test_requires = [ From d0cc48c6d3022af9f5eab4445a111eb858328b93 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 29 Oct 2025 16:41:11 -0400 Subject: [PATCH 103/212] Update cmake/RippledCore.cmake Co-authored-by: Ayaz Salikhov --- cmake/RippledCore.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/RippledCore.cmake b/cmake/RippledCore.cmake index c3800c55861..6380a0bacb5 100644 --- a/cmake/RippledCore.cmake +++ b/cmake/RippledCore.cmake @@ -72,7 +72,6 @@ if (WIN32) target_link_libraries(xrpl.imports.main INTERFACE ntdll) endif() - include(add_module) include(target_link_modules) From 4021a7eb28dd4fc621f98ca629d492f19cd942c8 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 31 Oct 2025 10:34:31 -0400 Subject: [PATCH 104/212] Wamr and HF security review fixes (#5965) --- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 13 ++++++---- src/xrpld/app/wasm/detail/WamrVM.cpp | 24 ++++++++++++------- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index d7995f6b32a..95a8812f4f7 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -44,13 +44,16 @@ setData( if (dst < 0 || dstSize < 0 || !src || srcSize < 0) return HfErrorToInt(HostFunctionError::INVALID_PARAMS); - auto memory = runtime ? runtime->getMem() : wmem(); + if (srcSize > maxWasmDataLength) + return HfErrorToInt(HostFunctionError::DATA_FIELD_TOO_LARGE); + + auto const memory = runtime ? runtime->getMem() : wmem(); // LCOV_EXCL_START if (!memory.s) return HfErrorToInt(HostFunctionError::NO_MEM_EXPORTED); // LCOV_EXCL_STOP - if (dst + dstSize > memory.s) + if ((int64_t)dst + dstSize > memory.s) return HfErrorToInt(HostFunctionError::POINTER_OUT_OF_BOUNDS); if (srcSize > dstSize) return HfErrorToInt(HostFunctionError::BUFFER_TOO_SMALL); @@ -113,8 +116,8 @@ getDataSlice( int32_t& i, bool isUpdate = false) { - auto const ptr = params->data[i].of.i32; - auto const size = params->data[i + 1].of.i32; + int64_t const ptr = params->data[i].of.i32; + int64_t const size = params->data[i + 1].of.i32; if (ptr < 0 || size < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -124,7 +127,7 @@ getDataSlice( if (size > (isUpdate ? maxWasmDataLength : maxWasmParamLength)) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - auto memory = runtime ? runtime->getMem() : wmem(); + auto const memory = runtime ? runtime->getMem() : wmem(); // LCOV_EXCL_START if (!memory.s) return Unexpected(HostFunctionError::NO_MEM_EXPORTED); diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index 4d94e1cb8fe..af0a7df8000 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -30,6 +30,7 @@ #endif // #define SHOW_CALL_TIME 1 +#define DISABLE_WM_LOG 1 namespace ripple { @@ -95,8 +96,11 @@ wamr_log_to_rippled( char const* fmt, ...) { - beast::Journal j = WasmEngine::instance().getJournal(); +#ifdef DISABLE_WM_LOG + return; +#endif + beast::Journal j = WasmEngine::instance().getJournal(); std::ostringstream oss; // Format the variadic args @@ -142,15 +146,17 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) if (error_message.num_elems) { - error_message.data[error_message.num_elems - 1] = 0; // just in case - j << "WAMR Error: " << msg << ", " << error_message.data; + j << "WAMR Error: " << msg << ", " + << std::string_view(error_message.data, error_message.num_elems - 1); } else j << "WAMR Error: " << msg; if (error_message.size) wasm_byte_vec_delete(&error_message); - wasm_trap_delete(trap); + + if (trap) + wasm_trap_delete(trap); #ifdef DEBUG_OUTPUT j << std::endl; @@ -371,6 +377,7 @@ ModuleWrapper::ModuleWrapper( { auto wimports = buildImports(s, imports); addInstance(s, maxPages, gas, wimports); + wasm_extern_vec_delete(&wimports); } } @@ -409,7 +416,7 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) if (paramSize) { - wasm_valtype_vec_new(&v, paramSize, nullptr); + wasm_valtype_vec_new_uninitialized(&v, paramSize); v.num_elems = paramSize; } else @@ -436,7 +443,7 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) { if (imp.result) { - wasm_valtype_vec_new(&v, 1, nullptr); + wasm_valtype_vec_new_uninitialized(&v, 1); v.num_elems = 1; switch (*imp.result) { @@ -469,7 +476,7 @@ ModuleWrapper::buildImports( if (!importTypes.num_elems) return wimports; - wasm_extern_vec_new(&wimports, importTypes.size, nullptr); + wasm_extern_vec_new_uninitialized(&wimports, importTypes.size); wimports.num_elems = importTypes.num_elems; unsigned impCnt = 0; @@ -500,7 +507,8 @@ ModuleWrapper::buildImports( if (imp.name != fieldName) continue; - wasm_valtype_vec_t params, results; + wasm_valtype_vec_t params = WASM_EMPTY_VEC, + results = WASM_EMPTY_VEC; makeImpReturn(results, imp); makeImpParams(params, imp); From 3ffdcf8114b0563dadf15d9b7f68a7e608ab8b12 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 13:19:40 -0500 Subject: [PATCH 105/212] allow 0-value trace amounts --- src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 164 +++++- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 23 +- src/test/app/wasm_fixtures/fixtures.cpp | 495 +++++++++--------- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 2 +- 6 files changed, 423 insertions(+), 265 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 00909bcbe3e..1f011238298 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -648,7 +648,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 152'154; + auto const allowance = 152'981; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 000ecf39a86..101fe2eb067 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -2,14 +2,170 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + [[package]] name = "codecov_tests" version = "0.0.1" dependencies = [ - "xrpl-wasm-std", + "xrpl-wasm-stdlib", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "xrpl-wasm-std" -version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=main#638276c92d790f5b738faa9f42855f02a2c7c7dc" +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "xrpl-address-macro" +version = "0.1.0" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=main#57538e714ee1185e40391ff7ec7620d0e74d775b" +dependencies = [ + "bs58", + "quote", + "sha2", + "syn", +] + +[[package]] +name = "xrpl-wasm-stdlib" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=main#57538e714ee1185e40391ff7ec7620d0e74d775b" +dependencies = [ + "xrpl-address-macro", +] diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index ea776999a9c..bd67fd6c1a2 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-wasm-std" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", branch = "main", package = "xrpl-wasm-stdlib" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 8d72443fb79..a5624b1df01 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -7,10 +7,10 @@ use core::panic; use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::locator::Locator; -use xrpl_std::core::types::amount::asset::Asset; -use xrpl_std::core::types::amount::asset::XrpAsset; -use xrpl_std::core::types::amount::mpt_id::MptId; +use xrpl_std::core::types::issue::Issue; +use xrpl_std::core::types::issue::XrpIssue; use xrpl_std::core::types::keylets; +use xrpl_std::core::types::mpt_id::MptId; use xrpl_std::host; use xrpl_std::host::error_codes; use xrpl_std::host::trace::{trace, trace_num as trace_number}; @@ -264,6 +264,19 @@ pub extern "C" fn finish() -> i32 { 19, "trace_amount", ); + let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // 0 drops of XRP + check_result( + unsafe { + host::trace_amount( + message.as_ptr(), + message.len(), + amount.as_ptr(), + amount.len(), + ) + }, + 18, + "trace_amount_zero", + ); // ######################################## // Step #2: Test set_data edge cases @@ -482,8 +495,8 @@ pub extern "C" fn finish() -> i32 { ) }); - // Asset - let asset1_bytes = Asset::XRP(XrpAsset {}).as_bytes(); + // Issue + let asset1_bytes = Issue::XRP(XrpIssue {}).as_bytes(); with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 7db468bb2b8..c447ad5d181 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9906,261 +9906,250 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "f69dc0000b7f0041809ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020ac12a02460002402000200147" + "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020a892702460002402000200147" "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" - "0220032000ac10011a0f0b418b80c000410b2000ac1001000bf72902087f027e230041f001" + "0220032000ac10011a0f0b418b80c000410b2000ac1001000bbf26020a7f017e230041f001" "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" - "0341b2920441c780c0004116103c200041f0006a22034200370300200041e8006a22044200" - "370300200041e0006a2202420037030020004200370358200041d8006a2201412010044120" - "41a58cc0004116103c1005410a41dd80c000410c103c200041186a428182848890a0c08001" - "370300200041106a428182848890a0c08001370300200041086a428182848890a0c0800137" - "03002000428182848890a0c0800137030041e980c000410e1006410141f780c0004111103c" - "200041201006410141f780c0004111103c2004410036020020024200370300200042003703" - "5841818020200141141007220541144604400240200041266a20002d005a3a000020002000" - "29005f3703c8012000200041e4006a2900003700cd01200041306a20002900cd0137000020" - "0020002f01583b01242000200028005b360027200020002903c80137002b20034200370300" - "200442003703002002420037030020004200370358200041246a4114200141201008220541" - "20470d002000413a6a20002d005a3a0000200041d0016a200041e7006a2900002208370300" - "200041d8016a200041ef006a2900002209370300200041c7006a2008370000200041cf006a" - "2009370000200041d7006a200041f7006a2d00003a0000200020002f01583b013820002000" - "28005b36003b2000200029005f37003f200041386a4120410010094101418881c000411010" - "3c2004410036020020024200370300200042003703584181802020014114100a411441bb8c" - "c000411c103c20044100360200200242003703002000420037035841014181802020014114" - "100b411441d78cc0004114103c02402001410020016b41037122046a220220014d0d002004" - "0440200421050340200141003a0000200141016a2101200541016b22050d000b0b20044101" - "6b4107490d000340200141003a0000200141076a41003a0000200141066a41003a00002001" - "41056a41003a0000200141046a41003a0000200141036a41003a0000200141026a41003a00" - "00200141016a41003a0000200141086a22012002470d000b0b200241c40020046b2204417c" - "716a220120024b0440034020024100360200200241046a22022001490d000b0b0240200120" - "04410371220420016a22054f0d002004220204400340200141003a0000200141016a210120" - "0241016b22020d000b0b200441016b4107490d000340200141003a0000200141076a41003a" - "0000200141066a41003a0000200141056a41003a0000200141046a41003a0000200141036a" - "41003a0000200141026a41003a0000200141016a41003a0000200141086a22012005470d00" - "0b0b2000418180203602c801410021010340200641c000490440200041d8006a20066a2000" - "41c8016a20016a2d00003a0000200020002802980141016a220636029801200141016a2201" - "4104470d010b0b200041d8016a22024100360200200041d0016a2203420037030020004200" - "3703c801200041d8006a22012006200041c8016a22054114100c411441eb8cc0004113103c" - "2002410036020020034200370300200042003703c801200120002802980120054114100d41" - "1441fe8cc0004123103c2002410036020020034200370300200042003703c8014101200120" - "002802980120054114100e411441a18dc000411b103c4189803c100f4120419881c0004110" - "103c4189803c1010412041a881c0004120103c41014189803c1011412041c881c000411810" - "3c20012000280298011012412041e081c0004117103c20012000280298011013412041f781" - "c0004127103c4101200120002802980110144120419e82c000411f103c200041246a220441" - "141015411441bd82c000410b103c200041e0016a2206420037030020024200370300200342" - "00370300200042003703c8012001200028029801200541201016412041bc8dc0004113103c" - "41c882c000410c41d482c000410b41df82c000410e1017410141ed82c0004109103c200041" - "b8016a200041186a290300370300200041b0016a200041106a290300370300200041a8016a" - "200041086a290300370300200020002903003703a001200241003b01002003420037030020" - "0042003703c80120044114200041a0016a22074120200541121018411241cf8dc000410710" - "3c2002410036020020034200370300200042003703c80120074120200541141019411441d6" - "8dc000410e103c200041003602c8012007412020054104101a410441e48dc000410d103c20" - "074120101b410841f682c000410d103c20074120101c410a418383c0004114103c20004100" - "3602c8012007412020054104101d410441f18dc000410e103c419783c000410d2004411410" - "1e412f41a483c000410d103c419783c000410d41b183c0004108101f411341b983c000410c" - "103c417f41041004417141c583c000411e103c200041003602c8012005417f1004417141ff" - "8dc000411e103c200041ca016a41003a0000200041003b01c801200541031004417d419d8e" - "c0004124103c200041003602c8012005418094ebdc031004417341c18ec0004123103c4197" - "83c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c000410810" - "1f411341b983c000410c103c20064200370300200242003703002003420037030020004200" - "3703c801200041d894ebdc036a220741082005412041001020417341e48ec0004117103c20" - "0642003703002002420037030020034200370300200042003703c801200120002802980120" - "05412041001020417141fb8ec0004119103c4102100f416f41e383c000411f103c417f2000" - "2802980110124171418284c000411f103c2001417f1012417141a184c000411f103c200141" - "81201012417441c084c0004120103c20072000280298011012417341e084c000411f103c20" - "0720002802980141011009417341ff84c0004118103c200120002802980141011009417141" - "9785c000411a103c200642003703002002420037030020034200370300200042003703c801" - "2007200028029801200541201008417341948fc0004116103c200642003703002002420037" - "030020034200370300200042003703c8012001200028029801200541201008417141aa8fc0" - "004118103c200642003703002002420037030020034200370300200042003703c801200441" - "14200441142007200028029801200541201021417341c28fc000411c103c20064200370300" - "2002420037030020034200370300200042003703c801200441142004411420012000280298" - "01200541201021417141de8fc000411e103c20064200370300200242003703002003420037" - "0300200042003703c80141e29dc00041142007200028029801200541201022417341fc8fc0" - "004119103c200642003703002002420037030020034200370300200042003703c80141e29d" - "c000411420012000280298012005412010224171419590c000411f103c2006420037030020" - "02420037030020034200370300200042003703c80141e29dc000411441b185c00041142005" - "41201022417141b490c0004129103c20064200370300200242003703002003420037030020" - "0042003703c80141c585c000412841e29dc0004114200541201022417141dd90c000412510" - "3c200041dc016a200041346a280100360200200041d4016a2000412c6a2901003702002000" - "20002901243702cc01200041808080083602c801200041003b01c0012005411841e29dc000" - "4114200041c0016a2203410210224171418291c000410e103c2007200028029801422a1001" - "417341ed85c0004111103c200041003b01c0014102200341021007416f419091c000411b10" - "3c200041003b01c001410220034102100a416f41ab91c000412b103c200041003b01c00141" - "01410220034102100b416f41d691c0004123103c4102100f416f41e383c000411f103c4102" - "1010416f41fe85c000412f103c410141021011416f41ad86c0004127103c41e980c0004181" - "201006417441d486c000411f103c41e980c00041c1001006417441f386c000411a103c2000" - "41003b01c001200141812020034102100c417441f991c0004121103c200041003b01c00120" - "0141812020034102100d4174419a92c0004131103c200041003b01c0014101200141812020" - "034102100e417441cb92c0004129103c200141812010124174418d87c0004125103c200141" - "81201013417441b287c0004135103c410120014181201014417441e787c000412d103c2001" - "41812010154174419488c0004119103c419783c00041812041d482c000410b41df82c00041" - "0e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c000410e10" - "17417441ed82c0004109103c419783c000410d41d482c000410b41df82c000418120101741" - "7441ed82c0004109103c200041003b01c0012001418120200341021016417441f492c00041" - "21103c200041003b01c00141e29dc00041812041e29dc00041142003410210224174419593" - "c0004118103c200041003b01c00120044114200441142001418120200341021023417441ad" - "93c000411f103c200041003b01c001200541812020044114200341021024417441cc93c000" - "4122103c419783c000410d200720002802980141001000417341ad88c000410f103c200042" - "d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a2206410810254173" - "41bc88c000411c103c419783c000410d2007200028029801101f417341d888c0004116103c" - "20064108200341081026417341ee88c0004118103c200341082006410810264173418689c0" - "004118103c200041003b01ec012006410820034108200041ec016a22024102410010274173" - "41ee93c0004114103c200041003b01ec012003410820064108200241024100102741734182" - "94c0004114103c200041003b01ec01200641082003410820024102410010284173419694c0" - "004119103c200041003b01ec0120034108200641082002410241001028417341af94c00041" - "19103c200041003b01ec0120064108200341082002410241001029417341c894c000411910" - "3c200041003b01ec0120034108200641082002410241001029417341e194c0004119103c20" - "0041003b01ec012006410820034108200241024100102a417341fa94c0004117103c200041" - "003b01ec012003410820064108200241024100102a4173419195c0004117103c200041003b" - "01ec01200641084103200241024100102b417341a895c0004114103c200041003b01ec0120" - "0641084103200241024100102c417341bc95c0004113103c200041003b01ec012006410820" - "0241024100102d417341cf95c0004113103c2001200028029801410010094171419e89c000" - "4123103c200041003b01ec01200441142001200028029801200241021018417141e295c000" - "411a103c200041003b01ec012001200028029801200241021019417141fc95c0004121103c" - "200041003b01ec01200120002802980120024102101a4171419d96c0004120103c20012000" - "28029801101b417141c189c0004120103c2001200028029801101c417141e189c000412710" - "3c200041003602ec01200120002802980120024104101d417141bd96c0004121103c200041" - "003b01ec012001200028029801200241021008417141de96c0004123103c200041003b01ec" - "012001200028029801410120024102102e4171418197c0004121103c200041003b01ec0120" - "0120002802980122062004411420012006200241021023417141a297c0004127103c200041" - "003b01ec01200441142001200028029801220620012006200241021023417141c997c00041" - "27103c200041003b01ec0120012000280298012004411420024102102f417141f097c00041" - "25103c200041003b01ec0120044114200120002802980120024102102f4171419598c00041" - "25103c200041003b01ec01200120002802980120044114200241021030417141ba98c00041" - "2c103c200041003b01ec01200441142001200028029801200241021030417141e698c00041" - "2c103c200041003b01ec0120012000280298012002410210314171419299c000411f103c20" - "0041003b01ec0120012000280298014101200241021032417141b199c0004122103c200041" - "003b01ec0120012000280298012004411441b185c0004114200241021021417141d399c000" - "4121103c200041003b01ec0120044114200120002802980141b185c0004114200241021021" - "417141f499c0004121103c200041003b01ec01200120002802980141012002410210334171" - "41959ac0004128103c200041003b01ec012005411820012000280298012002410210244171" - "41bd9ac0004123103c200041003b01ec0120012000280298014101200241021034417141e0" - "9ac0004125103c200041003b01ec0120012000280298014101200241021035417141859bc0" - "004121103c200041003b01ec0120012000280298014101200241021036417141a69bc00041" - "22103c200041003b01ec012001200028029801200441144101200241021037417141c89bc0" - "004124103c200041003b01ec012004411420012000280298014101200241021037417141ec" - "9bc0004124103c200041003b01ec0120012000280298014101200241021038417141909cc0" - "00412f103c200041003b01ec012001200028029801200241021039417141bf9cc000412310" - "3c200041003b01ec012001200028029801410120024102103a417141e29cc0004122103c20" - "0041003b01ec012001200028029801410120024102103b417141849dc0004121103c200041" - "003b01ec01200120002802980141888ac0004120200241021018417141a59dc000411c103c" - "419783c000410d2001200028029801101e417141a88ac0004122103c419797abdd03410d41" - "888ac000412041001000417341ca8ac0004110103c419797abdd03410d2003410810254173" - "41da8ac000411d103c419797abdd03410d20044114101e417341f78ac0004118103c419797" - "abdd03410d41b183c0004108101f4173418f8bc0004117103c200120002802980120014181" - "2041001000417441a68bc000410e103c200141812042011001417441b48bc0004112103c41" - "9783c000418120200341081025417441c68bc000411b103c419783c0004181202004411410" - "1e417441e18bc0004116103c419783c00041812041b183c0004108101f417441f78bc00041" - "15103c419783c000410d2001200028029801101f4171418c8cc0004119103c200041003b01" - "ec01200120002802980120044114200241021024417141c19dc0004121103c200041f0016a" - "240041010f0b0b418080c000410b417f20052005417f4e1bac1001000b0bcd1d0200418080" - "c0000bc5056572726f725f636f64653d54455354204641494c454424242424242053544152" - "54494e47205741534d20455845435554494f4e2024242424246765745f6c65646765725f73" - "716e6765745f706172656e745f6c65646765725f74696d656765745f626173655f66656574" - "6573745f616d656e646d656e74616d656e646d656e745f656e61626c656463616368655f6c" - "65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272656e745f" - "6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f6172" - "7261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e6765745f637572" - "72656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c" - "65646765725f6f626a5f6e65737465645f61727261795f6c656e7570646174655f64617461" - "74657374206d65737361676574657374207075626b657974657374207369676e6174757265" - "636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f7472616e736665" - "725f66656574657374696e6720747261636574726163655f6163636f756e74400000000000" - "005f74726163655f616d6f756e746765745f706172656e745f6c65646765725f686173685f" - "6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c" - "646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74" - "785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e657374" - "65645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f6172" - "7261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f" - "6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e555344303030303030" - "30303030303030303030300041ed85c0000bf51774726163655f6e756d5f6f6f625f737472" - "6765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e7661" - "6c69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e" - "76616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f626967" - "5f736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74" - "785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63" - "757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" - "6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269" - "675f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c" - "6f61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c" - "6f61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f" - "6f625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f" - "75696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e7432" - "35366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e" - "74323536303030303030303030303030303030303030303030303030303030303030303174" - "726163655f6163636f756e745f77726f6e675f73697a655f6163636f756e74696474726163" - "655f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f7374" - "72696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f" - "756e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d" - "5f746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774" - "726163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f" - "5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774686765745f706172" - "656e745f6c65646765725f686173686765745f63757272656e745f6c65646765725f6f626a" - "5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e657374" - "65645f6669656c646765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d70" - "7574655f7368613531325f68616c666765745f6e66746765745f6e66745f69737375657267" - "65745f6e66745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e745f" - "6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765725f" - "686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f68" - "6173685f6c656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f" - "6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65" - "796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c" - "696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65" - "745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f" - "625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f61737365" - "7432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e" - "63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e" - "63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e7661" - "6c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669656c" - "645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f" - "696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f" - "5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e657374" - "65645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f" - "6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f736861" - "3531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f" - "6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c" - "6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964" - "666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69" - "636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f737562" - "74726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c" - "69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469" - "766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c696365" - "32666c6f61745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c" - "696365666c6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73" - "697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f" - "75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e7432" - "35366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163" - "636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463686563" - "6b5f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469" - "616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643163726564656e" - "7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65" - "676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643164656c65" - "676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465706f" - "7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "6964316465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" - "646c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c696e" - "655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f697373" - "75616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f" - "6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f66" - "6665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469647061796368616e5f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f" - "6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647369676e65" - "72735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f" - "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f7772" - "6f6e675f6c656e677468004d0970726f64756365727302086c616e67756167650104527573" - "74000c70726f6365737365642d6279010572757374631d312e38352e312028346562313631" - "32353020323032352d30332d313529002c0f7461726765745f6665617475726573022b0f6d" - "757461626c652d676c6f62616c732b087369676e2d657874"; + "0341b2920441c780c0004116103c200041f0006a22054200370300200041e8006a22064200" + "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" + "41be8cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" + "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" + "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" + "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" + "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" + "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" + "200028005b360027200020002903c80137002b200542003703002006420037030020034200" + "37030020004200370358200041246a2205411420014120100822024120470d002000413a6a" + "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" + "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" + "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" + "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" + "03584181802020014114100a411441d48cc000411c103c2006410036020020034200370300" + "2000420037035841014181802020014114100b411441f08cc0004114103c20004104360298" + "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" + "0120014104200041c8016a22064114100c411441848dc0004113103c200341003602002002" + "4200370300200042003703c801200120002802980120064114100d411441978dc000412310" + "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" + "100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" + "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" + "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" + "0120002802980110144120419e82c000411f103c200541141015411441bd82c000410b103c" + "200041e0016a220442003703002003420037030020024200370300200042003703c8012001" + "200028029801200641201016412041d58dc0004113103c41c882c000410c41d482c000410b" + "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" + "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" + "0341003b010020024200370300200042003703c80120054114200041a0016a220741202006" + "41121018411241e88dc0004107103c2003410036020020024200370300200042003703c801" + "20074120200641141019411441ef8dc000410e103c200041003602c8012007412020064104" + "101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120101c41" + "0a418383c0004114103c200041003602c8012007412020064104101d4104418a8ec000410e" + "103c419783c000410d20054114101e412f41a483c000410d103c419783c000410d41b183c0" + "004108101f411341b983c000410c103c419783c000410d41c583c0004108101f411241cd83" + "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" + "417141988ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" + "7d41b68ec0004124103c200041003602c8012006418094ebdc031004417341da8ec0004123" + "103c419783c000410d20054114101e412f41a483c000410d103c419783c000410d41b183c0" + "004108101f411341b983c000410c103c200442003703002003420037030020024200370300" + "200042003703c801200041d894ebdc036a220741082006412041001020417341fd8ec00041" + "17103c200442003703002003420037030020024200370300200042003703c8012001200028" + "0298012006412041001020417141948fc0004119103c4102100f416f41fc83c000411f103c" + "417f20002802980110124171419b84c000411f103c2001417f1012417141ba84c000411f10" + "3c20014181201012417441d984c0004120103c20072000280298011012417341f984c00041" + "1f103c2007200028029801410110094173419885c0004118103c2001200028029801410110" + "09417141b085c000411a103c20044200370300200342003703002002420037030020004200" + "3703c8012007200028029801200641201008417341ad8fc0004116103c2004420037030020" + "03420037030020024200370300200042003703c80120012000280298012006412010084171" + "41c38fc0004118103c200442003703002003420037030020024200370300200042003703c8" + "0120054114200541142007200028029801200641201021417341db8fc000411c103c200442" + "003703002003420037030020024200370300200042003703c8012005411420054114200120" + "0028029801200641201021417141f78fc000411e103c200442003703002003420037030020" + "024200370300200042003703c80141fb9dc000411420072000280298012006412010224173" + "419590c0004119103c200442003703002003420037030020024200370300200042003703c8" + "0141fb9dc00041142001200028029801200641201022417141ae90c000411f103c20044200" + "3703002003420037030020024200370300200042003703c80141fb9dc000411441ca85c000" + "4114200641201022417141cd90c0004129103c200442003703002003420037030020024200" + "370300200042003703c80141de85c000412841fb9dc0004114200641201022417141f690c0" + "004125103c200041dc016a200041346a280100360200200041d4016a2000412c6a29010037" + "0200200020002901243702cc01200041808080083602c801200041003b01c0012006411841" + "fb9dc0004114200041c0016a2203410210224171419b91c000410e103c2007200028029801" + "422a10014173418686c0004111103c200041003b01c0014102200341021007416f41a991c0" + "00411b103c200041003b01c001410220034102100a416f41c491c000412b103c200041003b" + "01c0014101410220034102100b416f41ef91c0004123103c4102100f416f41fc83c000411f" + "103c41021010416f419786c000412f103c410141021011416f41c686c0004127103c41e980" + "c0004181201006417441ed86c000411f103c41e980c00041c10010064174418c87c000411a" + "103c200041003b01c001200141812020034102100c4174419292c0004121103c200041003b" + "01c001200141812020034102100d417441b392c0004131103c200041003b01c00141012001" + "41812020034102100e417441e492c0004129103c20014181201012417441a687c000412510" + "3c20014181201013417441cb87c0004135103c4101200141812010144174418088c000412d" + "103c20014181201015417441ad88c0004119103c419783c00041812041d482c000410b41df" + "82c000410e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c0" + "00410e1017417441ed82c0004109103c419783c000410d41d482c000410b41df82c0004181" + "201017417441ed82c0004109103c200041003b01c00120014181202003410210164174418d" + "93c0004121103c200041003b01c00141fb9dc00041812041fb9dc000411420034102102241" + "7441ae93c0004118103c200041003b01c00120054114200541142001418120200341021023" + "417441c693c000411f103c200041003b01c001200641812020054114200341021024417441" + "e593c0004122103c419783c000410d200720002802980141001000417341c688c000410f10" + "3c200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22044108" + "1025417341d588c000411c103c419783c000410d2007200028029801101f417341f188c000" + "4116103c200441082003410810264173418789c0004118103c200341082004410810264173" + "419f89c0004118103c200041003b01ec012004410820034108200041ec016a220241024100" + "10274173418794c0004114103c200041003b01ec0120034108200441082002410241001027" + "4173419b94c0004114103c200041003b01ec01200441082003410820024102410010284173" + "41af94c0004119103c200041003b01ec0120034108200441082002410241001028417341c8" + "94c0004119103c200041003b01ec0120044108200341082002410241001029417341e194c0" + "004119103c200041003b01ec0120034108200441082002410241001029417341fa94c00041" + "19103c200041003b01ec012004410820034108200241024100102a4173419395c000411710" + "3c200041003b01ec012003410820044108200241024100102a417341aa95c0004117103c20" + "0041003b01ec01200441084103200241024100102b417341c195c0004114103c200041003b" + "01ec01200441084103200241024100102c417341d595c0004113103c200041003b01ec0120" + "044108200241024100102d417341e895c0004113103c200120002802980141001009417141" + "b789c0004123103c200041003b01ec01200541142001200028029801200241021018417141" + "fb95c000411a103c200041003b01ec0120012000280298012002410210194171419596c000" + "4121103c200041003b01ec01200120002802980120024102101a417141b696c0004120103c" + "2001200028029801101b417141da89c0004120103c2001200028029801101c417141fa89c0" + "004127103c200041003602ec01200120002802980120024104101d417141d696c000412110" + "3c200041003b01ec012001200028029801200241021008417141f796c0004123103c200041" + "003b01ec012001200028029801410120024102102e4171419a97c0004121103c200041003b" + "01ec01200120002802980122042005411420012004200241021023417141bb97c000412710" + "3c200041003b01ec01200541142001200028029801220420012004200241021023417141e2" + "97c0004127103c200041003b01ec0120012000280298012005411420024102102f41714189" + "98c0004125103c200041003b01ec0120054114200120002802980120024102102f417141ae" + "98c0004125103c200041003b01ec01200120002802980120054114200241021030417141d3" + "98c000412c103c200041003b01ec01200541142001200028029801200241021030417141ff" + "98c000412c103c200041003b01ec012001200028029801200241021031417141ab99c00041" + "1f103c200041003b01ec0120012000280298014101200241021032417141ca99c000412210" + "3c200041003b01ec0120012000280298012005411441ca85c0004114200241021021417141" + "ec99c0004121103c200041003b01ec0120054114200120002802980141ca85c00041142002" + "410210214171418d9ac0004121103c200041003b01ec012001200028029801410120024102" + "1033417141ae9ac0004128103c200041003b01ec0120064118200120002802980120024102" + "1024417141d69ac0004123103c200041003b01ec0120012000280298014101200241021034" + "417141f99ac0004125103c200041003b01ec01200120002802980141012002410210354171" + "419e9bc0004121103c200041003b01ec0120012000280298014101200241021036417141bf" + "9bc0004122103c200041003b01ec0120012000280298012005411441012002410210374171" + "41e19bc0004124103c200041003b01ec012005411420012000280298014101200241021037" + "417141859cc0004124103c200041003b01ec01200120002802980141012002410210384171" + "41a99cc000412f103c200041003b01ec012001200028029801200241021039417141d89cc0" + "004123103c200041003b01ec012001200028029801410120024102103a417141fb9cc00041" + "22103c200041003b01ec012001200028029801410120024102103b4171419d9dc000412110" + "3c200041003b01ec01200120002802980141a18ac0004120200241021018417141be9dc000" + "411c103c419783c000410d2001200028029801101e417141c18ac0004122103c419797abdd" + "03410d41a18ac000412041001000417341e38ac0004110103c419797abdd03410d20034108" + "1025417341f38ac000411d103c419797abdd03410d20054114101e417341908bc000411810" + "3c419797abdd03410d41b183c0004108101f417341a88bc0004117103c2001200028029801" + "200141812041001000417441bf8bc000410e103c200141812042011001417441cd8bc00041" + "12103c419783c000418120200341081025417441df8bc000411b103c419783c00041812020" + "054114101e417441fa8bc0004116103c419783c00041812041b183c0004108101f41744190" + "8cc0004115103c419783c000410d2001200028029801101f417141a58cc0004119103c2000" + "41003b01ec01200120002802980120054114200241021024417141da9dc0004121103c2000" + "41f0016a240041010f0b0b418080c000410b417f20022002417f4e1bac1001000b0be61d02" + "00418080c0000bde056572726f725f636f64653d54455354204641494c4544242424242420" + "5354415254494e47205741534d20455845435554494f4e2024242424246765745f6c656467" + "65725f73716e6765745f706172656e745f6c65646765725f74696d656765745f626173655f" + "666565746573745f616d656e646d656e74616d656e646d656e745f656e61626c6564636163" + "68655f6c65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272" + "656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f62" + "6a5f61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e676574" + "5f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e67" + "65745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e7570646174655f" + "6461746174657374206d65737361676574657374207075626b657974657374207369676e61" + "74757265636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f747261" + "6e736665725f66656574657374696e6720747261636574726163655f6163636f756e744000" + "00000000005f74726163655f616d6f756e74400000000000000074726163655f616d6f756e" + "745f7a65726f6765745f706172656e745f6c65646765725f686173685f6e65675f70747267" + "65745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f" + "6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e6573746564" + "5f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f6172726179" + "5f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" + "7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f" + "6c65646765725f6f626a5f77726f6e675f6c656e5553443030303030303030303030303030" + "30303000418686c0000bf51774726163655f6e756d5f6f6f625f7374726765745f63757272" + "656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f73666965" + "6c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f7366" + "69656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d" + "656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c" + "6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" + "6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c69636574" + "726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f" + "736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d70" + "6172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c696365" + "3263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e66" + "745f7472616e736665725f6665655f77726f6e675f73697a655f75696e7432353630303030" + "3030303030303030303030303030303030303030303030303030303174726163655f616363" + "6f756e745f77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f7374" + "72696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e6774726163" + "655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f" + "737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e" + "6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f616363" + "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e67747261" + "63655f616d6f756e745f77726f6e675f6c656e6774686765745f706172656e745f6c656467" + "65725f686173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765" + "745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c64" + "6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765" + "745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f73686135" + "31325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f74" + "61786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f68" + "6173685f6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f627566" + "5f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f" + "746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f" + "66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e" + "5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c" + "65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f" + "6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432" + "616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65" + "796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d" + "6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d" + "6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f73666965" + "6c646765745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69" + "645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f" + "736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c69" + "63656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64" + "5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f66" + "69656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c66" + "5f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f736c6963" + "6563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b" + "656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164" + "645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c6f6174" + "5f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f" + "625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61" + "745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f62" + "5f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f72" + "6f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f6174" + "5f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75696e74" + "3235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66" + "745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f70726561" + "7574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f73" + "69745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" + "64326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e74696465736372" + "6f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e" + "675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f616363" + "6f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e67" + "7468004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" + "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" + "2d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c652d67" + "6c6f62616c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 95a8812f4f7..03d56fe14f6 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1607,7 +1607,7 @@ traceAmount_wrap( { amount = std::nullopt; } - if (!amount || !amount.value()) + if (!amount) return hfResult(results, HostFunctionError::INVALID_PARAMS); return returnResult( From 106dea4559b8172abf0e0c5046895f8158b8febc Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 13:35:25 -0500 Subject: [PATCH 106/212] update fixtures to use the latest version of stdlib --- src/test/app/Wasm_test.cpp | 6 +- .../all_host_functions/Cargo.lock | 164 +++- .../all_host_functions/Cargo.toml | 2 +- .../app/wasm_fixtures/all_keylets/Cargo.lock | 164 +++- .../app/wasm_fixtures/all_keylets/Cargo.toml | 2 +- .../app/wasm_fixtures/all_keylets/src/lib.rs | 22 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 6 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- src/test/app/wasm_fixtures/fixtures.cpp | 852 +++++++++--------- .../app/wasm_fixtures/float_tests/Cargo.lock | 164 +++- .../app/wasm_fixtures/float_tests/Cargo.toml | 2 +- .../app/wasm_fixtures/float_tests/src/lib.rs | 3 +- 12 files changed, 921 insertions(+), 468 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 1f011238298..57e349b78f2 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -335,7 +335,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 847, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 838, std::to_string(re->cost)); } env.close(); @@ -369,7 +369,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 40'098, std::to_string(re->cost)); } env.close(); @@ -394,7 +394,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'107, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 40'098, std::to_string(re->cost)); } } diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock index 7f6a6bc7175..25ea64bbd24 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -6,10 +6,166 @@ version = 4 name = "all_host_functions" version = "0.1.0" dependencies = [ - "xrpl-std", + "xrpl-wasm-stdlib", ] [[package]] -name = "xrpl-std" -version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=last-hfs2#ec4a3fb2ea45a7f27b7190976d37d3596e2ec29e" +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "xrpl-address-macro" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "bs58", + "quote", + "sha2", + "syn", +] + +[[package]] +name = "xrpl-wasm-stdlib" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "xrpl-address-macro", +] diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml index 959056f374e..82f6ce05a35 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "last-hfs2", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index 3491dc00fa4..88a6e34459b 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -6,10 +6,166 @@ version = 4 name = "all_keylets" version = "0.0.1" dependencies = [ - "xrpl-std", + "xrpl-wasm-stdlib", ] [[package]] -name = "xrpl-std" -version = "0.5.1-devnet5" -source = "git+https://github.com/ripple/craft.git?branch=lastdevnet#c3a92273195a211ac9b41d641b0d20f60f982bb2" +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "xrpl-address-macro" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "bs58", + "quote", + "sha2", + "syn", +] + +[[package]] +name = "xrpl-wasm-stdlib" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "xrpl-address-macro", +] diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml index 620e28fceb1..823de4127d2 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "lastdevnet", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs index 970db7bd50b..e3d9ab1b190 100644 --- a/src/test/app/wasm_fixtures/all_keylets/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_keylets/src/lib.rs @@ -4,16 +4,18 @@ extern crate std; use crate::host::{Error, Result, Result::Err, Result::Ok}; -use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::current_escrow::get_current_escrow; +use xrpl_std::core::ledger_objects::current_escrow::CurrentEscrow; use xrpl_std::core::ledger_objects::ledger_object; use xrpl_std::core::ledger_objects::traits::CurrentEscrowFields; -use xrpl_std::core::types::amount::asset::{Asset, IouAsset, XrpAsset}; -use xrpl_std::core::types::amount::currency_code::CurrencyCode; -use xrpl_std::core::types::amount::mpt_id::MptId; +use xrpl_std::core::types::account_id::AccountID; +use xrpl_std::core::types::currency::Currency; +use xrpl_std::core::types::issue::{IouIssue, Issue, XrpIssue}; use xrpl_std::core::types::keylets; +use xrpl_std::core::types::mpt_id::MptId; +use xrpl_std::core::types::uint::Hash256; use xrpl_std::host; -use xrpl_std::host::trace::{DataRepr, trace, trace_account, trace_data, trace_num}; +use xrpl_std::host::trace::{trace, trace_account, trace_data, trace_num, DataRepr}; use xrpl_std::sfield; #[unsafe(no_mangle)] @@ -34,7 +36,7 @@ pub fn object_exists( if field == 0 { let new_field = sfield::PreviousTxnID; let _ = trace_num("Getting field: ", new_field.into()); - match ledger_object::get_hash_256_field(slot, new_field) { + match ledger_object::get_field::(slot, new_field) { Ok(data) => { let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); } @@ -45,7 +47,7 @@ pub fn object_exists( } } else { let _ = trace_num("Getting field: ", field.into()); - match ledger_object::get_account_id_field(slot, field) { + match ledger_object::get_field::(slot, field) { Ok(data) => { let _ = trace_data("Field data: ", &data.0, DataRepr::AsHex); } @@ -101,13 +103,13 @@ pub extern "C" fn finish() -> i32 { check_object_exists!(account_keylet, "Account", sfield::Account); let currency_code: &[u8; 3] = b"USD"; - let currency: CurrencyCode = CurrencyCode::from(*currency_code); + let currency: Currency = Currency::from(*currency_code); let line_keylet = keylets::line_keylet(&account, &destination, ¤cy); check_object_exists!(line_keylet, "Trustline", sfield::Generic); seq += 1; - let asset1 = Asset::XRP(XrpAsset {}); - let asset2 = Asset::IOU(IouAsset::new(destination, currency)); + let asset1 = Issue::XRP(XrpIssue {}); + let asset2 = Issue::IOU(IouIssue::new(destination, currency)); check_object_exists!( keylets::amm_keylet(&asset1, &asset2), "AMM", diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 101fe2eb067..e44fd147556 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -153,8 +153,8 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" -version = "0.1.0" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=main#57538e714ee1185e40391ff7ec7620d0e74d775b" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=main#57538e714ee1185e40391ff7ec7620d0e74d775b" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index bd67fd6c1a2..5031bcb5665 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", branch = "main", package = "xrpl-wasm-stdlib" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index c447ad5d181..6fc73f6b44d 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8656,198 +8656,197 @@ extern std::string const allHostFunctionsWasmHex = "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" - "08686f73745f6c69620b7570646174655f64617461000103060506060a0b04050301001106" + "08686f73745f6c69620b7570646174655f6461746100010306050a0b060604050301001106" "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0a821c051900200241094f0440000b20002002360204200020013602000b1900200241214f" - "0440000b20002002360204200020013602000b970101057f230041206b2201240020014118" - "6a22044100360200200141106a220542003703002001420037030802404181802020014108" - "6a4114100022034114470440024020034100480440200020033602040c010b2000417f3602" - "040b410121020c010b20002001290308370001200041116a2004280200360000200041096a" - "20052903003700000b200020023a0000200141206a24000b450020012d0000450440200020" - "01290001370000200041106a200141116a280000360000200041086a200141096a29000037" - "00000f0b418080c000410b20013402041001000bec1901097f230041b0036b22002400418b" - "80c000411b41004100410010021a41a680c000411941004100410010021a41e780c000412b" - "41004100410010021a027f02400240024002400240024002401003220141004a0440419281" - "c00041172001ad10011a1004220141004c0d0141a981c00041132001ad10011a200041c801" - "6a22034200370300200041c0016a22054200370300200041b8016a22044200370300200042" - "003703b001200041b0016a22064120100522014120470d0241bc81c0004113200641204101" - "10021a41cf81c000412041004100410010021a41dc82c000412e41004100410010021a2000" - "41a0016a410036020020004198016a42003703002000420037039001418180202000419001" - "6a22024114100022014114470d03418a83c00041142002411410061a200042003703704188" - "8018200041f0006a22024108100022014108470d04419e83c0004117420810011a41b583c0" - "00412820024108410110021a2000410036025041848008200041d0006a2202410410002201" - "4104470d0541dd83c000411520024104410110021a200041013b003c200342003703002005" - "420037030020044200370300200042003703b00102402000413c6a41022006412010072201" - "41004e044041f283c00041142001ad10011a200041306a20062001101b418684c000410d20" - "002802302000280234410110021a0c010b419384c00041292001ac10011a0b41bc84c00041" - "154183803c1008ac10011a41d184c00041134189803c1008ac10011a02402000413c6a4102" - "1009220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac1001" - "1a0b41a585c000412341004100410010021a41de86c000413341004100410010021a200042" - "0037037041828018200041f0006a22014108100a220241004c0d0620024108460440419187" - "c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2002" - "ad10011a200041286a200041f0006a2002101a419a88c00041172000280228200028022c41" - "0110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a82c00041252001ac10" - "011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41b486c000412a2001ac" - "10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c030b41c885c000412b20" - "01ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b200041a0016a4100360200" - "20004198016a4200370300200042003703900102404181802020004190016a22024114100a" - "220141004a044041f688c000411e2002411410061a0c010b419489c00041332001ac10011a" - "0b200041013b0050200041c8016a4200370300200041c0016a4200370300200041b8016a42" - "00370300200042003703b0010240200041d0006a4102200041b0016a22014120100b220241" - "004e044041c789c000411c2002ad10011a200041206a20012002101b41e389c00041152000" - "2802202000280224410110021a0c010b41f889c00041392002ac10011a0b41b18ac0004124" - "4183803c100cac10011a0240200041d0006a4102100d220141004e044041d58ac000411c20" - "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284100410041001002" - "1a41d68bc000412f41004100410010021a200041b0016a2202101c200041f0006a22012002" - "101d200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" - "420037039001024002400240024002402001411420004190016a22024120100e2201412046" - "0440200241204100100f220441004a044041858cc00041232004ad10011a20004200370350" - "200441828018200041d0006a220141081010220241004c0d022002410846044041a88cc000" - "412a420810011a41d28cc000412e20014108410110021a0c060b41808dc000412e2002ad10" - "011a200041186a200041d0006a2002101a41ae8dc00041162000280218200028021c410110" - "021a0c050b41e68fc000413c2004ac10011a200041c8016a4200370300200041c0016a4200" - "370300200041b8016a4200370300200042003703b001410141828018200041b0016a412010" - "1022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c050b41c48dc000412b" - "2002ac10011a0c020b41a290c00041c1002001ac10011a0b200041013b00504101200041d0" - "006a4102200041b0016a412010112201410048044041e390c00041352001ac10011a0b4101" - "4183803c101222014100480440419891c00041322001ac10011a0b4101200041d0006a4102" - "10132201410048044041ca91c00041392001ac10011a0b418392c000413741004100410010" - "021a0c010b200041013b003c200041c8016a4200370300200041c0016a4200370300200041" - "b8016a4200370300200042003703b001024020042000413c6a4102200041b0016a22014120" - "1011220241004e044041ef8dc000411b2002ad10011a200041106a20012002101b418a8ec0" - "00411420002802102000280214410110021a0c010b419e8ec00041312002ac10011a0b41cf" - "8ec000412320044183803c1012ac10011a024020042000413c6a41021013220141004e0440" - "41f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124" - "41004100410010021a0b41e892c000412f41004100410010021a200041b0016a2201101c20" - "00413c6a22042001101d200041e8006a4200370300200041e0006a4200370300200041d800" - "6a42003703002000420037035002400240024002400240024020044114200041d0006a2202" - "4120100e22014120460440419793c000410f20024120410110021a20004188016a42003703" - "0020004180016a4200370300200041f8006a42003703002000420037037002402004411420" - "04411441a693c0004109200041f0006a220141201014220241004a0440200041086a200120" - "02101b41ae93c00041122000280208200028020c410110021a0c010b41c093c000413c2002" - "ac10011a0b200041a8016a22084200370300200041a0016a2203420037030020004198016a" - "2205420037030020004200370390012000413c6a2202411441e80720004190016a22074120" - "101522014120470d0141fc93c000410e20074120410110021a200041c8016a420037030020" - "0041c0016a4200370300200041b8016a4200370300200042003703b00120024114412a2000" - "41b0016a22044120101622014120470d02418a94c000410e20044120410110021a419894c0" - "00412441004100410010021a419195c000412541004100410010021a20004188016a420037" - "030020004180016a4200370300200041f8006a42003703002000420037037041b695c00041" - "17200041f0006a22024120101722014120470d0341cd95c000410b41b695c0004117410110" - "021a41d895c000411120024120410110021a2004101c200041d0006a22062004101d200842" - "00370300200342003703002005420037030020004200370390010240200422032003410020" - "036b41037122026a22054f0d0020020440200221010340200341003a0000200341016a2103" - "200141016b22010d000b0b200241016b4107490d000340200341003a0000200341076a4100" - "3a0000200341066a41003a0000200341056a41003a0000200341046a41003a000020034103" - "6a41003a0000200341026a41003a0000200341016a41003a0000200341086a22032005470d" - "000b0b200541800220026b2201417c716a220320054b044003402005410036020020054104" - "6a22052003490d000b0b024020032001410371220120036a22024f0d002001220504400340" - "200341003a0000200341016a2103200541016b22050d000b0b200141016b4107490d000340" - "200341003a0000200341076a41003a0000200341066a41003a0000200341056a41003a0000" - "200341046a41003a0000200341036a41003a0000200341026a41003a0000200341016a4100" - "3a0000200341086a22032002470d000b0b0240200641142007412020044180021018220141" - "004a044041e995c00041102001ad10011a20014181024f0d0641f995c00041092004200141" - "0110021a0c010b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101" - "100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a10014100480d" - "0641f796c000411c420010011a419397c000411a41004100410010021a41ff97c000412941" - "004100410010021a41a898c000412810192201412846044041d098c000412741a898c00041" - "28410110021a41f798c000411e41004100410010021a41bf80c00041284100410041001002" - "1a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494c000411d2001ac1001" - "1a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc94c000411c2001ac10" - "011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b000b41c797c000411620" - "01ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b200041b0036a24000b" - "0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e43" - "54494f4e532054455354203d3d3d54657374696e6720323620686f73742066756e6374696f" - "6e73535543434553533a20416c6c20686f73742066756e6374696f6e207465737473207061" - "73736564212d2d2d2043617465676f727920313a204c656467657220486561646572204675" - "6e6374696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172" - "656e74206c65646765722074696d653a506172656e74206c656467657220686173683a5355" - "43434553533a204c6564676572206865616465722066756e6374696f6e734552524f523a20" - "6765745f706172656e745f6c65646765725f686173682077726f6e67206c656e6774683a45" - "52524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a45" - "52524f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d204361746567" - "6f727920323a205472616e73616374696f6e20446174612046756e6374696f6e73202d2d2d" - "5472616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c" - "656e6774683a5472616e73616374696f6e20466565202873657269616c697a656420585250" - "20616d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420" - "6669656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74" - "785f6e65737465645f6669656c64206e6f74206170706c696361626c653a5369676e657273" - "206172726179206c656e6774683a4d656d6f73206172726179206c656e6774683a4e657374" - "6564206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61" - "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e" - "73616374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f66" - "69656c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765" - "745f74785f6669656c6428466565292077726f6e67206c656e677468202865787065637465" - "64203820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c" - "64284163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920" - "333a2043757272656e74204c6564676572204f626a6563742046756e6374696f6e73202d2d" - "2d43757272656e74206f626a6563742062616c616e6365206c656e67746820285852502061" - "6d6f756e74293a43757272656e74206f626a6563742062616c616e6365202873657269616c" - "697a65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e" - "6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f62" - "6a6563742062616c616e63653a494e464f3a206765745f63757272656e745f6c6564676572" - "5f6f626a5f6669656c642842616c616e636529206661696c656420286d6179206265206578" - "706563746564293a43757272656e74206c6564676572206f626a656374206163636f756e74" - "3a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642841" - "63636f756e7429206661696c65643a43757272656e74206e6573746564206669656c64206c" - "656e6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f742061" - "70706c696361626c653a43757272656e74206f626a656374205369676e6572732061727261" - "79206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a" - "494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61" - "727261795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272" - "656e74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f" - "727920343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d" - "5375636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361" - "63686564206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e" - "74293a436163686564206f626a6563742062616c616e6365202873657269616c697a656420" - "58525020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e" - "67746820286e6f6e2d58525020616d6f756e74293a436163686564206f626a656374206261" - "6c616e63653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c61" - "6e636529206661696c65643a436163686564206e6573746564206669656c64206c656e6774" - "683a436163686564206e6573746564206669656c643a494e464f3a206765745f6c65646765" - "725f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a436163" - "686564206f626a656374205369676e657273206172726179206c656e6774683a4361636865" - "64206e6573746564206172726179206c656e6774683a494e464f3a206765745f6c65646765" - "725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c65" - "3a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73" - "494e464f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374" - "656420776974682074657374206669787475726573293a494e464f3a206765745f6c656467" - "65725f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f2063" - "6163686564206f626a656374293a494e464f3a206765745f6c65646765725f6f626a5f6e65" - "737465645f6669656c64206661696c65642061732065787065637465643a494e464f3a2067" - "65745f6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870" - "65637465643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f617272" - "61795f6c656e206661696c65642061732065787065637465643a535543434553533a20416e" - "79206c6564676572206f626a6563742066756e6374696f6e732028696e7465726661636520" - "746573746564294552524f523a206163636f756e745f6b65796c6574206661696c65642066" - "6f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65" - "742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b6579" - "6c65743a546573745479706543726564656e7469616c206b65796c65743a494e464f3a2063" - "726564656e7469616c5f6b65796c6574206661696c656420286578706563746564202d2069" - "6e74657266616365206973737565293a457363726f77206b65796c65743a4f7261636c6520" - "6b65796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e" - "6374696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a455252" - "4f523a20657363726f775f6b65796c6574206661696c65643a4552524f523a206163636f75" - "6e745f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a205574696c" - "6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f72" - "6c6421496e70757420646174613a5348413531322068616c6620686173683a4e4654206461" - "7461206c656e6774683a4e465420646174613a494e464f3a206765745f6e6674206661696c" - "656420286578706563746564202d206e6f2073756368204e4654293a546573742074726163" - "65206d6573736167657061796c6f616454726163652066756e6374696f6e20627974657320" - "7772697474656e3a54657374206e756d62657220747261636554726163655f6e756d206675" - "6e6374696f6e20737563636565646564535543434553533a205574696c6974792066756e63" - "74696f6e734552524f523a2074726163655f6e756d2829206661696c65643a4552524f523a" - "2074726163652829206661696c65643a4552524f523a20636f6d707574655f736861353132" - "5f68616c66206661696c65643a2d2d2d2043617465676f727920373a204461746120557064" - "6174652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e747279" - "20646174612066726f6d205741534d20746573745375636365737366756c6c792075706461" - "746564206c656467657220656e74727920776974683a535543434553533a20446174612075" - "70646174652066756e6374696f6e734552524f523a207570646174655f6461746120666169" - "6c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f" - "6365737365642d6279010572757374631d312e38352e312028346562313631323530203230" - "32352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c65" - "2d676c6f62616c732b087369676e2d657874"; + "0ae61b057c01027f230041206b220124002000027f418180202001410c6a41141000220241" + "14470440024020024100480440200020023602040c010b2000417f3602040b41010c010b20" + "00200129000c370001200041116a2001411c6a280000360000200041096a200141146a2900" + "0037000041000b3a0000200141206a24000b450020012d0000450440200020012900013700" + "00200041106a200141116a280000360000200041086a200141096a2900003700000f0b4180" + "80c000410b20013402041001000b1900200241214f0440000b200020023602042000200136" + "02000b1900200241094f0440000b20002002360204200020013602000bec1901097f230041" + "b0036b22002400418b80c000411b41004100410010021a41a680c000411941004100410010" + "021a41e780c000412b41004100410010021a027f0240024002400240024002400240100322" + "0141004a0440419281c00041172001ad10011a1004220141004c0d0141a981c00041132001" + "ad10011a200041c8016a22034200370300200041c0016a22054200370300200041b8016a22" + "044200370300200042003703b001200041b0016a22064120100522014120470d0241bc81c0" + "00411320064120410110021a41cf81c000412041004100410010021a41dc82c000412e4100" + "4100410010021a200041a0016a410036020020004198016a42003703002000420037039001" + "4181802020004190016a22024114100022014114470d03418a83c00041142002411410061a" + "2000420037037041888018200041f0006a22024108100022014108470d04419e83c0004117" + "420810011a41b583c000412820024108410110021a2000410036025041848008200041d000" + "6a22024104100022014104470d0541dd83c000411520024104410110021a200041013b003c" + "200342003703002005420037030020044200370300200042003703b00102402000413c6a41" + "02200641201007220141004e044041f283c00041142001ad10011a200041306a2006200110" + "1c418684c000410d20002802302000280234410110021a0c010b419384c00041292001ac10" + "011a0b41bc84c00041154183803c1008ac10011a41d184c00041134189803c1008ac10011a" + "02402000413c6a41021009220141004e044041e484c00041142001ad10011a0c010b41f884" + "c000412d2001ac10011a0b41a585c000412341004100410010021a41de86c0004133410041" + "00410010021a2000420037037041828018200041f0006a22014108100a220241004c0d0620" + "024108460440419187c000412b420810011a41bc87c000412f20014108410110021a0c080b" + "41eb87c000412f2002ad10011a200041286a200041f0006a2002101d419a88c00041172000" + "280228200028022c410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a" + "82c00041252001ac10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41" + "b486c000412a2001ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c03" + "0b41c885c000412b2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b2000" + "41a0016a410036020020004198016a42003703002000420037039001024041818020200041" + "90016a22024114100a220141004a044041f688c000411e2002411410061a0c010b419489c0" + "0041332001ac10011a0b200041013b0050200041c8016a4200370300200041c0016a420037" + "0300200041b8016a4200370300200042003703b0010240200041d0006a4102200041b0016a" + "22014120100b220241004e044041c789c000411c2002ad10011a200041206a20012002101c" + "41e389c000411520002802202000280224410110021a0c010b41f889c00041392002ac1001" + "1a0b41b18ac00041244183803c100cac10011a0240200041d0006a4102100d220141004e04" + "4041d58ac000411c2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041" + "2841004100410010021a41d68bc000412f41004100410010021a200041b0016a2202101a20" + "0041f0006a22012002101b200041a8016a4200370300200041a0016a420037030020004198" + "016a42003703002000420037039001024002400240024002402001411420004190016a2202" + "4120100e22014120460440200241204100100f220441004a044041858cc00041232004ad10" + "011a20004200370350200441828018200041d0006a220141081010220241004c0d02200241" + "0846044041a88cc000412a420810011a41d28cc000412e20014108410110021a0c060b4180" + "8dc000412e2002ad10011a200041186a200041d0006a2002101d41ae8dc000411620002802" + "18200028021c410110021a0c050b41e68fc000413c2004ac10011a200041c8016a42003703" + "00200041c0016a4200370300200041b8016a4200370300200042003703b001410141828018" + "200041b0016a4120101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c" + "050b41c48dc000412b2002ac10011a0c020b41a290c00041c1002001ac10011a0b20004101" + "3b00504101200041d0006a4102200041b0016a412010112201410048044041e390c0004135" + "2001ac10011a0b41014183803c101222014100480440419891c00041322001ac10011a0b41" + "01200041d0006a410210132201410048044041ca91c00041392001ac10011a0b418392c000" + "413741004100410010021a0c010b200041013b003c200041c8016a4200370300200041c001" + "6a4200370300200041b8016a4200370300200042003703b001024020042000413c6a410220" + "0041b0016a220141201011220241004e044041ef8dc000411b2002ad10011a200041106a20" + "012002101c418a8ec000411420002802102000280214410110021a0c010b419e8ec0004131" + "2002ac10011a0b41cf8ec000412320044183803c1012ac10011a024020042000413c6a4102" + "1013220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac1001" + "1a0b41c28fc000412441004100410010021a0b41e892c000412f41004100410010021a2000" + "41b0016a2201101a2000413c6a22042001101b200041e8006a4200370300200041e0006a42" + "00370300200041d8006a420037030020004200370350024002400240024002400240200441" + "14200041d0006a22024120100e22014120460440419793c000410f20024120410110021a20" + "004188016a420037030020004180016a4200370300200041f8006a42003703002000420037" + "03700240200441142004411441a693c0004109200041f0006a220141201014220241004a04" + "40200041086a20012002101c41ae93c00041122000280208200028020c410110021a0c010b" + "41c093c000413c2002ac10011a0b200041a8016a22084200370300200041a0016a22034200" + "37030020004198016a2205420037030020004200370390012000413c6a2202411441e80720" + "004190016a22074120101522014120470d0141fc93c000410e20074120410110021a200041" + "c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0" + "0120024114412a200041b0016a22044120101622014120470d02418a94c000410e20044120" + "410110021a419894c000412441004100410010021a419195c000412541004100410010021a" + "20004188016a420037030020004180016a4200370300200041f8006a420037030020004200" + "37037041b695c0004117200041f0006a22024120101722014120470d0341cd95c000410b41" + "b695c0004117410110021a41d895c000411120024120410110021a2004101a200041d0006a" + "22062004101b20084200370300200342003703002005420037030020004200370390010240" + "200422032003410020036b41037122026a22054f0d0020020440200221010340200341003a" + "0000200341016a2103200141016b22010d000b0b200241016b4107490d000340200341003a" + "0000200341076a41003a0000200341066a41003a0000200341056a41003a0000200341046a" + "41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a00002003" + "41086a22032005470d000b0b200541800220026b2201417c716a220320054b044003402005" + "4100360200200541046a22052003490d000b0b024020032001410371220120036a22024f0d" + "002001220504400340200341003a0000200341016a2103200541016b22050d000b0b200141" + "016b4107490d000340200341003a0000200341076a41003a0000200341066a41003a000020" + "0341056a41003a0000200341046a41003a0000200341036a41003a0000200341026a41003a" + "0000200341016a41003a0000200341086a22032002470d000b0b0240200641142007412020" + "044180021018220141004a044041e995c00041102001ad10011a20014181024f0d0641f995" + "c000410920042001410110021a0c010b418296c000412e2001ac10011a0b41b096c0004112" + "41c296c00041074101100222014100480d0541c996c000411d2001ad10011a41e696c00041" + "11422a10014100480d0641f796c000411c420010011a419397c000411a4100410041001002" + "1a41ff97c000412941004100410010021a41a898c000412810192201412846044041d098c0" + "00412741a898c0004128410110021a41f798c000411e41004100410010021a41bf80c00041" + "2841004100410010021a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494" + "c000411d2001ac10011a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc" + "94c000411c2001ac10011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b00" + "0b41c797c00041162001ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b" + "200041b0036a24000b0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20" + "484f53542046554e4354494f4e532054455354203d3d3d54657374696e6720323620686f73" + "742066756e6374696f6e73535543434553533a20416c6c20686f73742066756e6374696f6e" + "20746573747320706173736564212d2d2d2043617465676f727920313a204c656467657220" + "4865616465722046756e6374696f6e73202d2d2d4c65646765722073657175656e6365206e" + "756d6265723a506172656e74206c65646765722074696d653a506172656e74206c65646765" + "7220686173683a535543434553533a204c6564676572206865616465722066756e6374696f" + "6e734552524f523a206765745f706172656e745f6c65646765725f686173682077726f6e67" + "206c656e6774683a4552524f523a206765745f706172656e745f6c65646765725f74696d65" + "206661696c65643a4552524f523a206765745f6c65646765725f73716e206661696c65643a" + "2d2d2d2043617465676f727920323a205472616e73616374696f6e20446174612046756e63" + "74696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a5472616e73616374" + "696f6e20466565206c656e6774683a5472616e73616374696f6e2046656520287365726961" + "6c697a65642058525020616d6f756e74293a5472616e73616374696f6e2053657175656e63" + "653a4e6573746564206669656c64206c656e6774683a4e6573746564206669656c643a494e" + "464f3a206765745f74785f6e65737465645f6669656c64206e6f74206170706c696361626c" + "653a5369676e657273206172726179206c656e6774683a4d656d6f73206172726179206c65" + "6e6774683a4e6573746564206172726179206c656e6774683a494e464f3a206765745f7478" + "5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53554343" + "4553533a205472616e73616374696f6e20646174612066756e6374696f6e734552524f523a" + "206765745f74785f6669656c642853657175656e6365292077726f6e67206c656e6774683a" + "4552524f523a206765745f74785f6669656c6428466565292077726f6e67206c656e677468" + "20286578706563746564203820627974657320666f7220585250293a4552524f523a206765" + "745f74785f6669656c64284163636f756e74292077726f6e67206c656e6774683a2d2d2d20" + "43617465676f727920333a2043757272656e74204c6564676572204f626a6563742046756e" + "6374696f6e73202d2d2d43757272656e74206f626a6563742062616c616e6365206c656e67" + "7468202858525020616d6f756e74293a43757272656e74206f626a6563742062616c616e63" + "65202873657269616c697a65642058525020616d6f756e74293a43757272656e74206f626a" + "6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43" + "757272656e74206f626a6563742062616c616e63653a494e464f3a206765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c642842616c616e636529206661696c65642028" + "6d6179206265206578706563746564293a43757272656e74206c6564676572206f626a6563" + "74206163636f756e743a494e464f3a206765745f63757272656e745f6c65646765725f6f62" + "6a5f6669656c64284163636f756e7429206661696c65643a43757272656e74206e65737465" + "64206669656c64206c656e6774683a43757272656e74206e6573746564206669656c643a49" + "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669" + "656c64206e6f74206170706c696361626c653a43757272656e74206f626a65637420536967" + "6e657273206172726179206c656e6774683a43757272656e74206e65737465642061727261" + "79206c656e6774683a494e464f3a206765745f63757272656e745f6c65646765725f6f626a" + "5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53554343" + "4553533a2043757272656e74206c6564676572206f626a6563742066756e6374696f6e732d" + "2d2d2043617465676f727920343a20416e79204c6564676572204f626a6563742046756e63" + "74696f6e73202d2d2d5375636365737366756c6c7920636163686564206f626a6563742069" + "6e20736c6f743a436163686564206f626a6563742062616c616e6365206c656e6774682028" + "58525020616d6f756e74293a436163686564206f626a6563742062616c616e636520287365" + "7269616c697a65642058525020616d6f756e74293a436163686564206f626a656374206261" + "6c616e6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43616368656420" + "6f626a6563742062616c616e63653a494e464f3a206765745f6c65646765725f6f626a5f66" + "69656c642842616c616e636529206661696c65643a436163686564206e6573746564206669" + "656c64206c656e6774683a436163686564206e6573746564206669656c643a494e464f3a20" + "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c69" + "6361626c653a436163686564206f626a656374205369676e657273206172726179206c656e" + "6774683a436163686564206e6573746564206172726179206c656e6774683a494e464f3a20" + "6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f742061" + "70706c696361626c653a535543434553533a20416e79206c6564676572206f626a65637420" + "66756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f626a206661696c65" + "642028657870656374656420776974682074657374206669787475726573293a494e464f3a" + "206765745f6c65646765725f6f626a5f6669656c64206661696c6564206173206578706563" + "74656420286e6f20636163686564206f626a656374293a494e464f3a206765745f6c656467" + "65725f6f626a5f6e65737465645f6669656c64206661696c65642061732065787065637465" + "643a494e464f3a206765745f6c65646765725f6f626a5f61727261795f6c656e206661696c" + "65642061732065787065637465643a494e464f3a206765745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e206661696c65642061732065787065637465643a5355" + "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73202869" + "6e7465726661636520746573746564294552524f523a206163636f756e745f6b65796c6574" + "206661696c656420666f722063616368696e6720746573743a2d2d2d2043617465676f7279" + "20353a204b65796c65742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163" + "636f756e74206b65796c65743a546573745479706543726564656e7469616c206b65796c65" + "743a494e464f3a2063726564656e7469616c5f6b65796c6574206661696c65642028657870" + "6563746564202d20696e74657266616365206973737565293a457363726f77206b65796c65" + "743a4f7261636c65206b65796c65743a535543434553533a204b65796c65742067656e6572" + "6174696f6e2066756e6374696f6e734552524f523a206f7261636c655f6b65796c65742066" + "61696c65643a4552524f523a20657363726f775f6b65796c6574206661696c65643a455252" + "4f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f72" + "7920363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c" + "205741534d20776f726c6421496e70757420646174613a5348413531322068616c66206861" + "73683a4e46542064617461206c656e6774683a4e465420646174613a494e464f3a20676574" + "5f6e6674206661696c656420286578706563746564202d206e6f2073756368204e4654293a" + "54657374207472616365206d6573736167657061796c6f616454726163652066756e637469" + "6f6e206279746573207772697474656e3a54657374206e756d626572207472616365547261" + "63655f6e756d2066756e6374696f6e20737563636565646564535543434553533a20557469" + "6c6974792066756e6374696f6e734552524f523a2074726163655f6e756d2829206661696c" + "65643a4552524f523a2074726163652829206661696c65643a4552524f523a20636f6d7075" + "74655f7368613531325f68616c66206661696c65643a2d2d2d2043617465676f727920373a" + "2044617461205570646174652046756e6374696f6e73202d2d2d55706461746564206c6564" + "67657220656e74727920646174612066726f6d205741534d20746573745375636365737366" + "756c6c792075706461746564206c656467657220656e74727920776974683a535543434553" + "533a2044617461207570646174652066756e6374696f6e734552524f523a20757064617465" + "5f64617461206661696c65643a004d0970726f64756365727302086c616e67756167650104" + "52757374000c70726f6365737365642d6279010572757374631d312e38352e312028346562" + "31363132353020323032352d30332d313529002c0f7461726765745f666561747572657302" + "2b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" @@ -9606,9 +9605,9 @@ extern std::string const hfPerfTest = extern std::string const allKeyletsWasmHex = "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620974726163" - "655f6e756d000508686f73745f6c6962057472616365000008686f73745f6c696210636163" - "68655f6c65646765725f6f626a000308686f73745f6c6962146765745f6c65646765725f6f" + "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" + "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" + "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" @@ -9624,237 +9623,220 @@ extern std::string const allKeyletsWasmHex = "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" - "03040307080905030100110619037f01418080c0000b7f0041958bc0000b7f0041a08bc000" + "03040307080905030100110619037f01418080c0000b7f0041ad8ac0000b7f0041b08ac000" "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" - "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020ae53503900602047f" - "037e230041f0006b22052400024020012d0000410146044041c280c0004116200128020422" - "01ac10001a200041013a0000200020013602040c010b200541186a200141196a2900003703" - "00200541106a200141116a290000370300200541086a200141096a29000037030020052001" - "2900013703002002200320054120410110011a02402005412041001002220141004a044002" - "400240024002402004450440418b80c000410f4285801410001a200541d8006a4200370300" - "200541d0006a4200370300200541c8006a4200370300200542003703402001418580142005" - "41406b4120100322014120460d0141a680c0004115417f20012001417f4e1b2201ac10001a" - "200041013a0000200020013602040c070b418b80c000410f2004ac10001a200541d0006a41" - "00360200200541c8006a42003703002005420037034020012004200541406b411410032201" - "417e47044020014114460d04200141004e0d0241ad8ac00041172001ac10001a0c030b417e" - "21010c020b200541286a200541cf006a22012900002209370300200541306a200541d7006a" - "2202290000220a370300200541386a200541df006a22032d000022043a0000200520052900" - "47220b37032020052f014021062005280142210720052d0046210820012009370000200220" - "0a370000200320043a0000200520083a004620052007360142200520063b01402005200b37" - "0047419a80c000410c200541406b4120410110011a0c040b41c48ac0004131421410001a41" - "f58ac00041202001ad10001a417321010b41a680c00041152001ac10001a200041013a0000" - "200020013602040c030b200520052900473703602005200541cc006a220129000037006520" - "0520052f014022023b016e2005200529036037032020052005290065370025200528004321" - "03200520052d00423a0042200520023b014020052003360043200120052900253700002005" - "2005290320370047419a80c000410c200541406b4114410110011a0c010b41bb80c0004107" - "2001ac10001a200041013a0000200020013602040c010b20004180023b01000b200541f000" - "6a24000bd92802077f027e23004180076b2200240041d880c000412341004100410010011a" - "20004198016a2201410036020020004190016a220242003703002000420037038801024020" - "00027f02404181802020004188016a22044114100422034114460440200041066a20002d00" - "8a013a00002000200029008f013703e001200020004194016a22052900003700e501200041" - "106a20002900e501370000200020002f0188013b01042000200028008b0136000720002000" - "2903e00137000b41fb80c0004108200041046a2206411410051a2001410036020020024200" - "37030020004200370388014183802020044114100422034114470d032000411a6a20002d00" - "8a013a00002000200029008f013703e001200020052900003700e501200041246a20002900" - "e501370000200020002f0188013b01182000200028008b0136001b200020002903e0013700" - "1f418381c000410c200041186a411410051a200041a0016a22054200370300200142003703" - "002002420037030020004200370388012006411420044120100622034120460d0102402003" - "4100480440200020033602300c010b2000417f3602300b41010c020b0c020b200041c5006a" - "20052903003700002000413d6a2001290300370000200041356a2002290300370000200020" - "002903880137002d41000b3a002c20004188016a2000412c6a418f81c00041074181802010" - "18024020002d0088014101460440200028028c01210341878ac0004112420510001a0c010b" - "41002103419681c000413541004100410010011a200041de006a41c4003a0000200041d800" - "6a4100360200200041e3006a41003a0000200041d5a6013b015c2000420037035020004100" - "36005f200041a0016a2202420037030020004198016a2204420037030020004190016a2205" - "420037030020004200370388010240200041046a4114200041186a4114200041d0006a4114" - "20004188016a4120100722014120470440024020014100480440200020013602680c010b20" - "00417f3602680b410121030c010b200041fd006a2002290300370000200041f5006a200429" - "0300370000200041ed006a200529030037000020002000290388013700650b200020033a00" - "6420004188016a200041e4006a41cb81c00041094100101820002d00880141014604402000" - "28028c01210341878ac0004112420510001a0c010b41d481c000413741004100410010011a" - "200041f0016a200041286a2203280100360200200041e8016a200041206a22042901003703" - "00200041fc016a200041d8006a290300220737020020004184026a200041e0006a28020022" - "02360200200020002901183703e0012000200029035022083702f401200041e8066a220120" - "02360200200041e0066a22022007370300200020083703d806200041f4066a200429010037" - "0200200041fc066a2003280100360200200020002901183702ec0620004188026a200041d8" - "066a22034128101a2000418c016a200041e0016a41d000101a2000410136028801200041f0" - "066a220442003703002001420037030020024200370300200042003703d8062000027f4199" - "8ac0004114200041b4016a4128200341201008220341204704400240200341004804402000" - "20033602e4010c010b2000417f3602e4010b41010c010b200041f9016a2004290300370000" - "200041f1016a2001290300370000200041e9016a2002290300370000200020002903d80637" - "00e10141000b3a00e001200041b4026a200041e0016a418b82c00041034181802010182000" - "2d00b402410146044020002802b802210341878ac0004112420610001a0c010b4100210341" - "8e82c000413141004100410010011a200041f8016a22024200370300200041f0016a220442" - "00370300200041e8016a22054200370300200042003703e0010240200041046a4114410620" - "0041e0016a4120100922014120470440024020014100480440200020013602c0020c010b20" - "00417f3602c0020b410121030c010b200041d5026a2002290300370000200041cd026a2004" - "290300370000200041c5026a2005290300370000200020002903e0013700bd020b20002003" - "3a00bc02200041e0016a200041bc026a41bf82c000410541818020101820002d00e0014101" - "46044020002802e401210341878ac0004112420610001a0c010b4100210341c482c0004133" - "41004100410010011a200041f8016a22024200370300200041f0016a220442003703002000" - "41e8016a22054200370300200042003703e0010240200041046a220141142001411441f782" - "c0004112200041e0016a4120100a22014120470440024020014100480440200020013602e4" - "020c010b2000417f3602e4020b410121030c010b200041f9026a2002290300370000200041" - "f1026a2004290300370000200041e9026a2005290300370000200020002903e0013700e102" - "0b200020033a00e002200041e0016a200041e0026a418983c000410a41988020101820002d" - "00e001410146044020002802e401210341878ac0004112420710001a0c010b410021034193" - "83c000413841004100410010011a200041f8016a22024200370300200041f0016a22044200" - "370300200041e8016a22054200370300200042003703e0010240200041046a411420004118" - "6a4114200041e0016a4120100b220141204704400240200141004804402000200136028803" - "0c010b2000417f360288030b410121030c010b2000419d036a200229030037000020004195" - "036a20042903003700002000418d036a2005290300370000200020002903e001370085030b" - "200020033a008403200041e0016a20004184036a41cb83c000410841818020101820002d00" - "e001410146044020002802e401210341878ac0004112420810001a0c010b41d383c0004136" - "41004100410010011a230041206b22012400200141186a22044200370300200141106a2205" - "4200370300200141086a2206420037030020014200370300200041a8036a2202027f200041" - "046a4114200041186a411420014120100c2203412047044002402003410048044020022003" - "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200429" - "0300370000200241116a2005290300370000200241096a200629030037000041000b3a0000" - "200141206a2400200041e0016a2002418984c000410e41818020101820002d00e001410146" - "044020002802e401210341878ac0004112420910001a0c010b419784c000413c4100410041" - "0010011a230041206b22012400200141186a22044200370300200141106a22054200370300" - "200141086a2206420037030020014200370300200041cc036a2202027f200041046a411420" - "014120100d22034120470440024020034100480440200220033602040c010b2002417f3602" - "040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005" - "290300370000200241096a200629030037000041000b3a0000200141206a2400200041e001" - "6a200241d384c000410341818020101820002d00e001410146044020002802e40121034187" - "8ac0004112420a10001a0c010b41d684c000413141004100410010011a230041206b220124" - "00200141186a22044200370300200141106a22054200370300200141086a22064200370300" - "20014200370300200041f0036a2202027f200041046a4114410b20014120100e2203412047" - "0440024020034100480440200220033602040c010b2002417f3602040b41010c010b200220" - "01290300370001200241196a2004290300370000200241116a200529030037000020024109" - "6a200629030037000041000b3a0000200141206a2400200041e0016a2002418785c0004106" - "41818020101820002d00e001410146044020002802e401210341878ac0004112420b10001a" - "0c010b418d85c000413441004100410010011a230041206b22012400200141186a22044200" - "370300200141106a22054200370300200141086a2206420037030020014200370300200041" - "94046a2202027f200041046a4114410c20014120100f220341204704400240200341004804" - "40200220033602040c010b2002417f3602040b41010c010b20022001290300370001200241" - "196a2004290300370000200241116a2005290300370000200241096a200629030037000041" - "000b3a0000200141206a2400200041f4016a200041146a280100360200200041ec016a2000" - "410c6a290100370200200020002901043702e401200041808080e0003602e001200041d806" - "6a200241c185c000410b41848020101820002d00d806410146044020002802dc0621034187" - "8ac0004112420c10001a0c010b41cc85c000413941004100410010011a230041206b220124" - "00200141186a22044200370300200141106a22054200370300200141086a22064200370300" - "20014200370300200041b8046a2202027f200041e0016a4118200041186a41142001412010" - "1022034120470440024020034100480440200220033602040c010b2002417f3602040b4101" - "0c010b20022001290300370001200241196a2004290300370000200241116a200529030037" - "0000200241096a200629030037000041000b3a0000200141206a2400200041d8066a200241" - "8586c000410741818020101820002d00d806410146044020002802dc06210341878ac00041" - "12420d10001a0c010b418c86c000413541004100410010011a230041206b22012400200141" - "186a22044200370300200141106a22054200370300200141086a2206420037030020014200" - "370300200041dc046a2202027f200041186a41144106200141201011220341204704400240" - "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300" - "370001200241196a2004290300370000200241116a2005290300370000200241096a200629" - "030037000041000b3a0000200141206a2400200041d8066a200241c186c000410c41828020" - "101820002d00d806410146044020002802dc06210341878ac0004112420d10001a0c010b41" - "cd86c000413a41004100410010011a230041206b22012400200141186a2204420037030020" - "0141106a22054200370300200141086a220642003703002001420037030020004180056a22" - "02027f200041046a4114410d20014120101222034120470440024020034100480440200220" - "033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004" - "290300370000200241116a2005290300370000200241096a200629030037000041000b3a00" - "00200141206a2400200041d8066a2002418787c000410541818020101820002d00d8064101" - "46044020002802dc06210341878ac0004112420d10001a0c010b418c87c000413341004100" - "410010011a230041206b22012400200141186a22044200370300200141106a220542003703" - "00200141086a2206420037030020014200370300200041a4056a2202027f200041046a4114" - "200041186a4114410e20014120101322034120470440024020034100480440200220033602" - "040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004290300" - "370000200241116a2005290300370000200241096a200629030037000041000b3a00002001" - "41206a2400200041d8066a200241bf87c000410a41818020101820002d00d8064101460440" - "20002802dc06210341878ac0004112420e10001a0c010b41c987c000413841004100410010" - "011a230041206b22012400200141186a22044200370300200141106a220542003703002001" - "41086a2206420037030020014200370300200041c8056a2202027f200041046a4114410f20" - "014120101422034120470440024020034100480440200220033602040c010b2002417f3602" - "040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005" - "290300370000200241096a200629030037000041000b3a0000200141206a2400200041d806" - "6a2002418188c000411241828020101820002d00d806410146044020002802dc0621034187" - "8ac0004112420f10001a0c010b419388c00041c00041004100410010011a230041206b2201" - "2400200141186a22044200370300200141106a22054200370300200141086a220642003703" - "0020014200370300200041ec056a2202027f200041046a4114200141201015220341204704" - "40024020034100480440200220033602040c010b2002417f3602040b41010c010b20022001" - "290300370001200241196a2004290300370000200241116a2005290300370000200241096a" - "200629030037000041000b3a0000200141206a2400200041d8066a200241d388c000410a41" - "00101820002d00d806410146044020002802dc06210341878ac0004112421010001a0c010b" - "41dd88c000413841004100410010011a230041206b22012400200141186a22044200370300" - "200141106a22054200370300200141086a220642003703002001420037030020004190066a" - "2202027f200041046a41144112200141201016220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041d8066a2002419589c000410641818020101820002d00d80641" - "0146044020002802dc06210341878ac0004112421210001a0c010b419b89c0004134410041" - "00410010011a230041206b22012400200141186a22044200370300200141106a2205420037" - "0300200141086a2206420037030020014200370300200041b4066a2202027f200041046a41" - "14411320014120101722034120470440024020034100480440200220033602040c010b2002" - "417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241" - "116a2005290300370000200241096a200629030037000041000b3a0000200141206a240020" - "0041d8066a200241cf89c00041054181802010184101210320002d00d80641014604402000" - "2802dc06210341878ac0004112421310001a0c010b41d489c000413341004100410010011a" - "0b20004180076a240020030f0b418080c000410b417f20032003417f4e1bac1000000bf506" - "010b7f230041106b2106200241104f0440024020002000410020006b41037122056a22044f" - "0d002001210320050440200521070340200020032d00003a0000200341016a210320004101" - "6a2100200741016b22070d000b0b200541016b4107490d000340200020032d00003a000020" - "0041016a200341016a2d00003a0000200041026a200341026a2d00003a0000200041036a20" - "0341036a2d00003a0000200041046a200341046a2d00003a0000200041056a200341056a2d" - "00003a0000200041066a200341066a2d00003a0000200041076a200341076a2d00003a0000" - "200341086a2103200041086a22002004470d000b0b2004200220056b220b417c71220c6a21" - "000240200120056a22034103712201450440200020044d0d01200321010340200420012802" - "00360200200141046a2101200441046a22042000490d000b0c010b41002102200641003602" - "0c2006410c6a2001722105410420016b22074101710440200520032d00003a000041012102" - "0b20074102710440200220056a200220036a2f01003b01000b200320016b21022001410374" - "2107200628020c210902402000200441046a4d0440200421050c010b410020076b41187121" - "08034020042009200776200241046a2202280200220920087472360200200441086a210a20" - "0441046a220521042000200a4b0d000b0b41002104200641003a0008200641003a0006027f" - "200141014604404100210141002108200641086a0c010b200241056a2d0000200620024104" - "6a2d000022013a000841087421084102210d200641066a0b210a20052003410171047f200a" - "200241046a200d6a2d00003a000020062d0006411074210420062d00080520010b41ff0171" - "200420087272410020076b411871742009200776723602000b200b41037121022003200c6a" - "21010b02402000200020026a22044f0d002002410771220304400340200020012d00003a00" - "00200141016a2101200041016a2100200341016b22030d000b0b200241016b4107490d0003" - "40200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a" - "2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a00" - "00200041056a200141056a2d00003a0000200041066a200141066a2d00003a000020004107" - "6a200141076a2d00003a0000200141086a2101200041086a22002004470d000b0b0b0b930b" - "0200418080c0000b990a6572726f725f636f64653d47657474696e67206669656c643a2046" - "69656c6420646174613a204572726f722067657474696e67206669656c643a204572726f72" - "3a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e" - "47205741534d20455845435554494f4e2024242424244163636f756e743a44657374696e61" - "74696f6e3a4163636f756e744163636f756e74206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e65" - "54727573746c696e65206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43686563" - "6b436865636b206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564" - "656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e44656c656761746544656c65" - "67617465206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e4465706f736974507265617574684465706f736974507265" - "61757468206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e444944444944206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e457363726f77457363" - "726f77206f626a656374206578697374732c2070726f63656564696e672077697468206573" - "63726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f62" - "6a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" - "696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070" - "726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f" - "666665724e46546f6b656e4f66666572206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e4f666665724f66666572206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" - "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e54" - "69636b65745469636b6574206f626a656374206578697374732c2070726f63656564696e67" - "207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374" + "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020ad53103fb0402017f" + "027e23004180016b2205240002400240024020012d0000450440200541186a200141196a29" + "0000370300200541106a200141116a290000370300200541086a200141096a290000370300" + "200520012900013703002002200320054120410110001a2005412041001001220141004c0d" + "01024002402004450440418b80c000410f4285801410021a200141858014200541e0006a41" + "20100322014120460d0141a680c0004115417f20012001417f4e1b2201ac10021a20004101" + "3a0000200020013602040c060b418b80c000410f2004ac10021a20012004200541e0006a41" + "14100322014114460d0141a680c0004115417f20012001417f4e1b2201ac10021a20004101" + "3a0000200020013602040c050b200541c2006a200541e2006a2d00003a0000200541286a20" + "0541ef006a2900002206370300200541306a200541f7006a2900002207370300200541386a" + "200541ff006a2d000022013a0000200541cf006a2006370000200541d7006a200737000020" + "0541df006a20013a0000200520052f00603b01402005200529006722063703202005200528" + "006336004320052006370047419a80c000410c200541406b4120410110001a0c030b200541" + "c2006a200541e2006a2d00003a0000200520052900673703202005200541ec006a29000037" + "0025200541cc006a2005290025370000200520052f00603b01402005200528006336004320" + "052005290320370047419a80c000410c200541406b4114410110001a0c020b41c280c00041" + "1620012802042201ac10021a200041013a0000200020013602040c020b41bb80c000410720" + "01ac10021a200041013a0000200020013602040c010b20004180023b01000b20054180016a" + "24000bd627020a7f027e23004180076b2200240041d880c000412341004100410010001a02" + "402000027f02404181802020004188016a22034114100422044114460440200041066a2000" + "418a016a22012d00003a00002000200029008f013703e001200020004194016a2202290000" + "3700e501200041106a20002900e501370000200020002f0088013b01042000200028008b01" + "360007200020002903e00137000b41fb80c0004108200041046a2205411410051a41838020" + "20034114100422044114470d032000411a6a20012d00003a00002000200029008f013703e0" + "01200020022900003700e501200041246a20002900e501370000200020002f0088013b0118" + "2000200028008b0136001b200020002903e00137001f418381c000410c200041186a411410" + "051a200041a0016a2201420037030020004198016a2202420037030020004190016a420037" + "030020004200370388012005411420034120100622044120460d0102402004410048044020" + "0020043602300c010b2000417f3602300b41010c020b0c020b200041c5006a200129030037" + "00002000413d6a2002290300370000200041356a20004190016a2903003700002000200029" + "03880137002d41000b3a002c20004188016a22032000412c6a418f81c00041074181802010" + "180240024020002d00880145044041002104419681c000413541004100410010001a200041" + "de006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a601" + "3b015c200042003703502000410036005f200041a0016a2201420037030020004198016a22" + "02420037030020004190016a220542003703002000420037038801200041046a4114200041" + "186a4114200041d0006a411420034120100722034120470440024020034100480440200020" + "033602680c010b2000417f3602680b410121040c020b200041fd006a200129030037000020" + "0041f5006a2002290300370000200041ed006a200529030037000020002000290388013700" + "650c010b200028028c01210441878ac0004112420510021a0c010b200020043a0064200041" + "88016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c00041" + "3741004100410010001a200041f0016a200041286a2201280100360200200041e8016a2000" + "41206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a" + "200041e0006a2802002203360200200020002901183703e00120002000290350220b3702f4" + "01200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d8062000" + "41f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec06" + "20004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a2000" + "410136028801200041f0066a22024200370300200442003703002003420037030020004200" + "3703d80641998ac0004114200041b4016a4128200141201008220141204704400240200141" + "00480440200020013602e4010c010b2000417f3602e4010b410121040c020b200041f9016a" + "2002290300370000200041f1016a2004290300370000200041e9016a200329030037000020" + "0020002903d8063700e101410021040c010b200028028c01210441878ac000411242051002" + "1a0c010b200020043a00e001200041b4026a200041e0016a2203418b82c000410341818020" + "1018024020002d00b40245044041002104418e82c000413141004100410010001a200041f8" + "016a22014200370300200041f0016a22024200370300200041e8016a220542003703002000" + "42003703e001200041046a4114410620034120100922034120470440024020034100480440" + "200020033602c0020c010b2000417f3602c0020b410121040c020b200041d5026a20012903" + "00370000200041cd026a2002290300370000200041c5026a20052903003700002000200029" + "03e0013700bd020c010b20002802b802210441878ac0004112420610021a0c010b20002004" + "3a00bc02200041e0016a2203200041bc026a41bf82c0004105418180201018024020002d00" + "e0014504404100210441c482c000413341004100410010001a200041f8016a220142003703" + "00200041f0016a22024200370300200041e8016a22054200370300200042003703e0012000" + "41046a220941142009411441f782c000411220034120100a22034120470440024020034100" + "480440200020033602e4020c010b2000417f3602e4020b410121040c020b200041f9026a20" + "01290300370000200041f1026a2002290300370000200041e9026a20052903003700002000" + "20002903e0013700e1020c010b20002802e401210441878ac0004112420610021a0c010b20" + "0020043a00e002200041e0016a2203200041e0026a418983c000410a419880201018024020" + "002d00e00145044041002104419383c000413841004100410010001a200041f8016a220142" + "00370300200041f0016a22024200370300200041e8016a22054200370300200042003703e0" + "01200041046a4114200041186a411420034120100b22034120470440024020034100480440" + "20002003360288030c010b2000417f360288030b410121040c020b2000419d036a20012903" + "0037000020004195036a20022903003700002000418d036a20052903003700002000200029" + "03e001370085030c010b20002802e401210441878ac0004112420710021a0c010b20002004" + "3a008403200041e0016a220520004184036a41cb83c0004108418180201018024002400240" + "0240024002400240024002400240024020002d00e00145044041d383c00041364100410041" + "0010001a230041206b22032400200341186a22064200370300200341106a22074200370300" + "200341086a2208420037030020034200370300200041a8036a2201027f200041046a220441" + "14200041186a2209411420034120100c220241204704400240200241004804402001200236" + "02040c010b2001417f3602040b41010c010b20012003290300370001200141196a20062903" + "00370000200141116a2007290300370000200141096a200829030037000041000b3a000020" + "0341206a240020052001418984c000410e41818020101820002d00e0010d01419784c00041" + "3c41004100410010001a230041206b22032400200341186a22064200370300200341106a22" + "074200370300200341086a2208420037030020034200370300200041cc036a2201027f2004" + "411420034120100d22024120470440024020024100480440200120023602040c010b200141" + "7f3602040b41010c010b20012003290300370001200141196a200629030037000020014111" + "6a2007290300370000200141096a200829030037000041000b3a0000200341206a24002005" + "200141d384c000410341818020101820002d00e0010d0241d684c000413141004100410010" + "001a230041206b22032400200341186a22064200370300200341106a220742003703002003" + "41086a2208420037030020034200370300200041f0036a2201027f20044114410b20034120" + "100e22024120470440024020024100480440200120023602040c010b2001417f3602040b41" + "010c010b20012003290300370001200141196a2006290300370000200141116a2007290300" + "370000200141096a200829030037000041000b3a0000200341206a240020052001418785c0" + "00410641818020101820002d00e0010d03418d85c000413441004100410010001a23004120" + "6b22032400200341186a22064200370300200341106a22074200370300200341086a220842" + "003703002003420037030020004194046a2201027f20044114410c20034120100f22024120" + "470440024020024100480440200120023602040c010b2001417f3602040b41010c010b2001" + "2003290300370001200141196a2006290300370000200141116a2007290300370000200141" + "096a200829030037000041000b3a0000200341206a2400200041f4016a200041146a280100" + "360200200041ec016a2000410c6a290100370200200020002901043702e401200041808080" + "e0003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d04" + "41cc85c000413941004100410010001a230041206b22012400200141186a22064200370300" + "200141106a22074200370300200141086a2208420037030020014200370300200041b8046a" + "2202027f200541182009411420014120101022054120470440024020054100480440200220" + "053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a2006" + "290300370000200241116a2007290300370000200241096a200829030037000041000b3a00" + "00200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c0" + "00413541004100410010001a230041206b22012400200141186a2206420037030020014110" + "6a22074200370300200141086a2208420037030020014200370300200041dc046a2202027f" + "20094114410620014120101122054120470440024020054100480440200220053602040c01" + "0b2002417f3602040b41010c010b20022001290300370001200241196a2006290300370000" + "200241116a2007290300370000200241096a200829030037000041000b3a0000200141206a" + "24002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a410041" + "00410010001a230041206b22012400200141186a22064200370300200141106a2207420037" + "0300200141086a220842003703002001420037030020004180056a2202027f20044114410d" + "20014120101222054120470440024020054100480440200220053602040c010b2002417f36" + "02040b41010c010b20022001290300370001200241196a2006290300370000200241116a20" + "07290300370000200241096a200829030037000041000b3a0000200141206a240020032002" + "418787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a" + "230041206b22012400200141186a22064200370300200141106a2207420037030020014108" + "6a2208420037030020014200370300200041a4056a2202027f2004411420094114410e2001" + "4120101322054120470440024020054100480440200220053602040c010b2002417f360204" + "0b41010c010b20022001290300370001200241196a2006290300370000200241116a200729" + "0300370000200241096a200829030037000041000b3a0000200141206a24002003200241bf" + "87c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a2300" + "41206b22012400200141186a22094200370300200141106a22064200370300200141086a22" + "07420037030020014200370300200041c8056a2202027f20044114410f2001412010142205" + "4120470440024020054100480440200220053602040c010b2002417f3602040b41010c010b" + "20022001290300370001200241196a2009290300370000200241116a200629030037000020" + "0241096a200729030037000041000b3a0000200141206a240020032002418188c000411241" + "828020101820002d00d8060d09419388c00041c00041004100410010001a230041206b2201" + "2400200141186a22094200370300200141106a22064200370300200141086a220742003703" + "0020014200370300200041ec056a2202027f20044114200141201015220541204704400240" + "20054100480440200220053602040c010b2002417f3602040b41010c010b20022001290300" + "370001200241196a2009290300370000200241116a2006290300370000200241096a200729" + "030037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00" + "d8060d0a41dd88c000413841004100410010001a230041206b22012400200141186a220942" + "00370300200141106a22064200370300200141086a22074200370300200142003703002000" + "4190066a2202027f2004411441122001412010162205412047044002402005410048044020" + "0220053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a" + "2009290300370000200241116a2006290300370000200241096a200729030037000041000b" + "3a0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b" + "89c000413441004100410010001a230041206b22012400200141186a220542003703002001" + "41106a22094200370300200141086a2206420037030020014200370300200041b4066a2202" + "027f2004411441132001412010172204412047044002402004410048044020022004360204" + "0c010b2002417f3602040b41010c010b20022001290300370001200241196a200529030037" + "0000200241116a2009290300370000200241096a200629030037000041000b3a0000200141" + "206a24002003200241cf89c000410541818020101820002d00d80645044041d489c0004133" + "41004100410010001a410121040c0d0b20002802dc06210441878ac0004112421310021a0c" + "0c0b20002802e401210441878ac0004112420810021a0c0b0b20002802e401210441878ac0" + "004112420910021a0c0a0b20002802e401210441878ac0004112420a10021a0c090b200028" + "02e401210441878ac0004112420b10021a0c080b20002802dc06210441878ac0004112420c" + "10021a0c070b20002802dc06210441878ac0004112420d10021a0c060b20002802dc062104" + "41878ac0004112420d10021a0c050b20002802dc06210441878ac0004112420d10021a0c04" + "0b20002802dc06210441878ac0004112420e10021a0c030b20002802dc06210441878ac000" + "4112420f10021a0c020b20002802dc06210441878ac0004112421010021a0c010b20002802" + "dc06210441878ac0004112421210021a0b20004180076a240020040f0b418080c000410b41" + "7f20042004417f4e1bac1002000bfd0401067f200241104f044002402000410020006b4103" + "7122056a220420004d0d002001210320050440200521060340200020032d00003a00002003" + "41016a2103200041016a2100200641016b22060d000b0b200541016b4107490d0003402000" + "20032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d0000" + "3a0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a00002000" + "41056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a2003" + "41076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b" + "2207417c7122086a21000240200120056a2206410371450440200020044d0d012006210103" + "4020042001280200360200200141046a2101200441046a22042000490d000b0c010b200020" + "044d0d002006410374220541187121032006417c71220241046a2101410020056b41187121" + "05200228020021020340200420022003762001280200220220057472360200200141046a21" + "01200441046a22042000490d000b0b20074103712102200620086a21010b02402000200020" + "026a22064f0d002002410771220304400340200020012d00003a0000200141016a21012000" + "41016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a00" + "00200041016a200141016a2d00003a0000200041026a200141026a2d00003a000020004103" + "6a200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a20014105" + "6a2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a" + "0000200141086a2101200041086a22002006470d000b0b0b0ba30a0100418080c0000b990a" + "6572726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a" + "204572726f722067657474696e67206669656c643a204572726f723a204572726f72206765" + "7474696e67206b65796c65743a202424242424205354415254494e47205741534d20455845" + "435554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f75" + "6e744163636f756e74206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e54727573746c696e6554727573746c696e6520" + "6f626a656374206578697374732c2070726f63656564696e67207769746820657363726f77" + "2066696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f63656564" + "696e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a" + "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" + "6e6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c43726564" + "656e7469616c206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e44656c656761746544656c6567617465206f626a6563" + "74206578697374732c2070726f63656564696e67207769746820657363726f772066696e69" + "73682e4465706f736974507265617574684465706f73697450726561757468206f626a6563" + "74206578697374732c2070726f63656564696e67207769746820657363726f772066696e69" + "73682e444944444944206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e457363726f77457363726f77206f626a656374" "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e43757272656e74207365712076616c75653a0041ad8ac0000b68456e636f756e746572" - "6564206572726f725f636f64653a4279746520617272617920776173206578706563746564" - "20746f20686176652074686973206d616e792062797465733a204279746520617272617920" - "6861642074686973206d616e792062797465733a20004d0970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e39" - "302e30202831313539653738633420323032352d30392d313429002c0f7461726765745f66" - "65617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "682e4d505449737375616e63654d505449737375616e6365206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f" + "6b656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e6720" + "7769746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b65" + "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e4f666665724f66666572206f626a6563742065786973" + "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e506179" + "4368616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e65" + "64446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a6563742065786973" + "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e536967" + "6e65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f63" + "656564696e67207769746820657363726f772066696e6973682e5469636b65745469636b65" + "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" + "6f772066696e6973682e5661756c745661756c74206f626a656374206578697374732c2070" + "726f63656564696e67207769746820657363726f772066696e6973682e43757272656e7420" + "7365712076616c75653a004d0970726f64756365727302086c616e67756167650104527573" + "74000c70726f6365737365642d6279010572757374631d312e38352e312028346562313631" + "32353020323032352d30332d313529002c0f7461726765745f6665617475726573022b0f6d" + "757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" @@ -10172,19 +10154,19 @@ extern std::string const floatTestsWasmHex = "106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000" "411e41004100410010001a0b0240410242fb00200141106a22004108410010044108460440" "41a581c00041212000410810021a0c010b41c681c000412641004100410010001a0b41ec81" - "c0004115418182c000410810021a419182c0004116418982c000410810021a41a782c00041" + "c0004115418182c000410810021a418982c0004116419f82c000410810021a41a782c00041" "1b41004100410010001a2001420037031802404201200141186a2200410841001001410846" "044041c282c000410f2000410810021a0c010b41d182c000411641004100410010001a0b02" "40200141186a4108418182c0004108100545044041e782c000411b41004100410010001a0c" - "010b418283c000411b41004100410010001a0b0240200141186a4108418982c00041081005" + "010b418283c000411b41004100410010001a0b0240200141186a4108419f82c00041081005" "4101460440419d83c000412341004100410010001a0c010b41c083c0004124410041004100" - "10001a0b0240418982c0004108200141186a41081005410246044041e483c0004123410041" + "10001a0b0240419f82c0004108200141186a41081005410246044041e483c0004123410041" "00410010001a0c010b418784c000412441004100410010001a0b41ab84c000412041004100" "410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a220241084181" "82c000410820024108410010061a200041016b22000d000b20014200370318420a20014118" "6a22004108410010011a02402000410820024108100545044041cb84c00041144100410041" "0010001a0c010b41df84c000411341004100410010001a0b410b21000340200141106a2202" - "4108418182c000410820024108410010071a200041016b22000d000b024020024108418982" + "4108418182c000410820024108410010071a200041016b22000d000b024020024108419f82" "c0004108100545044041f284c000411941004100410010001a0c010b418b85c00041184100" "4100410010001a0b41a385c000412341004100410010001a20014200370300420a20014108" "410010011a200142d487b6f4c7d4b1c000370308410621000340200141086a220241082001" @@ -10195,7 +10177,7 @@ extern std::string const floatTestsWasmHex = "41186a22004108410010041a02402002410820004108100545044041f785c0004117410041" "00410010001a0c010b418e86c000411641004100410010001a0b41a486c000411741004100" "410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb" - "86c00041122000410810021a418982c00041084106200041084100100a1a41cd86c0004118" + "86c00041122000410810021a419f82c00041084106200041084100100a1a41cd86c0004118" "2000410810021a200142003703104209200141106a22024108410010011a20024108410220" "0041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a" "41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" @@ -10207,10 +10189,10 @@ extern std::string const floatTestsWasmHex = "100c1a419888c00041182002410810021a200341084106200241084100100c1a41b088c000" "411c2002410810021a41cc88c000411741004100410010001a2001420037031042c0843d20" "024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003" - "410810021a41f788c000411a41004100410010001a20014200370318418182c00041084189" - "82c000410820034108410010081a0240418982c0004108200341081005450440419189c000" - "411641004100410010001a0c010b41a789c000411541004100410010001a0b418982c00041" - "08418982c0004108200141186a22004108410010081a0240418182c0004108200041081005" + "410810021a41f788c000411a41004100410010001a20014200370318418182c0004108419f" + "82c000410820034108410010081a0240419f82c0004108200341081005450440419189c000" + "411641004100410010001a0c010b41a789c000411541004100410010001a0b419f82c00041" + "08419f82c0004108200141186a22004108410010081a0240418182c0004108200041081005" "45044041bc89c000411741004100410010001a0c010b41d389c00041164100410041001000" "1a0b41e989c000411a41004100410010001a2001420037031020014200370318420a200141" "186a22024108410010011a418182c000410820024108200141106a22004108410010091a41" @@ -10224,8 +10206,8 @@ extern std::string const floatTestsWasmHex = "6c6f61742066726f6d207536342031323330303a206661696c65642020666c6f6174206672" "6f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065" "787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20" - "636f6e737420313ad4838d7ea4c6800094838d7ea4c680002020666c6f61742066726f6d20" - "636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d706172652024242420" + "636f6e737420313ad4838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d31" + "3a94838d7ea4c680000a24242420746573745f666c6f61745f636f6d706172652024242420" "20666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c656420" "20666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f" "6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41" @@ -10255,8 +10237,8 @@ extern std::string const floatTestsWasmHex = "696e76657274206120666c6f61742066726f6d2031303a2020696e7665727420616761696e" "3a2020696e766572742074776963653a20676f6f642020696e766572742074776963653a20" "626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d6279010572757374631d312e39302e30202831313539653738633420323032" - "352d30392d313429002c0f7461726765745f6665617475726573022b0f6d757461626c652d" + "65737365642d6279010572757374631d312e38352e31202834656231363132353020323032" + "352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c652d" "676c6f62616c732b087369676e2d657874"; extern std::string const float0Hex = diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock index 972bf3ce61e..175adf02543 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.lock @@ -2,14 +2,170 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "float_tests" version = "0.0.1" dependencies = [ - "xrpl-std", + "xrpl-wasm-stdlib", ] [[package]] -name = "xrpl-std" -version = "0.0.1" -source = "git+https://github.com/ripple/craft.git?branch=main#94fb247e0c21b9e7fecb91ce71ef7f74ef4a7931" +name = "generic-array" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "syn" +version = "2.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "xrpl-address-macro" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "bs58", + "quote", + "sha2", + "syn", +] + +[[package]] +name = "xrpl-wasm-stdlib" +version = "0.7.1" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +dependencies = [ + "xrpl-address-macro", +] diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml index b4dec2aa504..b369cac5010 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/craft.git", branch = "main", package = "xrpl-std" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/float_tests/src/lib.rs b/src/test/app/wasm_fixtures/float_tests/src/lib.rs index 9688ebd6029..fc8a1ff5cbc 100644 --- a/src/test/app/wasm_fixtures/float_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/float_tests/src/lib.rs @@ -6,6 +6,7 @@ extern crate std; use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::opaque_float::{FLOAT_NEGATIVE_ONE, FLOAT_ONE}; use xrpl_std::decode_hex_32; use xrpl_std::host::trace::DataRepr::AsHex; use xrpl_std::host::trace::{trace, trace_data, trace_float, trace_num, DataRepr}; @@ -13,7 +14,7 @@ use xrpl_std::host::{ cache_ledger_obj, float_add, float_compare, float_divide, float_from_int, float_from_uint, float_log, float_multiply, float_pow, float_root, float_set, float_subtract, get_ledger_obj_array_len, get_ledger_obj_field, get_ledger_obj_nested_field, - trace_opaque_float, FLOAT_NEGATIVE_ONE, FLOAT_ONE, FLOAT_ROUNDING_MODES_TO_NEAREST, + trace_opaque_float, FLOAT_ROUNDING_MODES_TO_NEAREST, }; use xrpl_std::sfield; use xrpl_std::sfield::{ From 7bf6878b4b527143490854bedd5cdf439c2464bd Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 14:49:45 -0500 Subject: [PATCH 107/212] fix imports --- src/test/app/HostFuncImpl_test.cpp | 2 ++ src/test/app/TestHostFunctions.h | 1 + 2 files changed, 3 insertions(+) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 3835b475a60..94a1a57b748 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -21,6 +21,8 @@ #include +#include + namespace ripple { namespace test { diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 040db53f103..fd9e15f6b17 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -26,6 +26,7 @@ #include #include +#include namespace ripple { From 427b7ea10416cd585a8a159c0eeb94f84a381132 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 15:29:08 -0500 Subject: [PATCH 108/212] run rename script --- src/test/app/HostFuncImpl_test.cpp | 19 ------------------- src/test/app/TestHostFunctions.h | 19 ------------------- src/test/app/Wasm_test.cpp | 19 ------------------- src/test/app/wasm_fixtures/fixtures.cpp | 19 ------------------- src/test/app/wasm_fixtures/fixtures.h | 19 ------------------- src/xrpld/app/wasm/HostFunc.h | 19 ------------------- src/xrpld/app/wasm/HostFuncImpl.h | 19 ------------------- src/xrpld/app/wasm/HostFuncWrapper.h | 19 ------------------- src/xrpld/app/wasm/ParamsHelper.h | 18 ------------------ src/xrpld/app/wasm/WamrVM.h | 18 ------------------ src/xrpld/app/wasm/WasmVM.h | 18 ------------------ src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 19 ------------------- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 19 ------------------- src/xrpld/app/wasm/detail/WamrVM.cpp | 19 ------------------- src/xrpld/app/wasm/detail/WasmVM.cpp | 19 ------------------- 15 files changed, 282 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 94a1a57b748..6ada72b7654 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index fd9e15f6b17..4445f1ae730 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 57e349b78f2..d03dfb270b5 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #ifdef _DEBUG // #define DEBUG_OUTPUT 1 #endif diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6fc73f6b44d..e4c65c3d629 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - // TODO: consider moving these to separate files (and figure out the build) #include diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 0e7e3785ea8..f7c258326fd 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #pragma once // TODO: consider moving these to separate files (and figure out the build) diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 4478a8cd568..bff939e0a17 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #pragma once #include diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index f56aa102a5a..f1add087fb2 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #pragma once #include diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index 6bfa576b9dc..eed68f65d52 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #pragma once #include diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index 7f183895526..9d581c81581 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -1,21 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== #pragma once #include diff --git a/src/xrpld/app/wasm/WamrVM.h b/src/xrpld/app/wasm/WamrVM.h index a32257feb6c..41f12b9d5c6 100644 --- a/src/xrpld/app/wasm/WamrVM.h +++ b/src/xrpld/app/wasm/WamrVM.h @@ -1,21 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2023 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== #pragma once #include diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index 32eb239f609..4feb3850bef 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -1,21 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== #pragma once #include diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index b21a3d8b620..b48dd4bcf1a 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include #include diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 03d56fe14f6..566e7a4c982 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include #include diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WamrVM.cpp index af0a7df8000..d1b7fb694d0 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WamrVM.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2020 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index f2d3799ca86..e1d5f8e8b8b 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #ifdef _DEBUG // #define DEBUG_OUTPUT 1 #endif From 0db564d2616f4cdee531028706ae6dfd530c135f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 15:57:07 -0500 Subject: [PATCH 109/212] WASMI data --- BUILD.md | 1 + CMakeLists.txt | 1 + cmake/XrplCore.cmake | 6 ++ conanfile.py | 4 + external/wasmi/conandata.yml | 5 ++ external/wasmi/conanfile.py | 90 +++++++++++++++++++ external/wasmi/patches/static_only.patch | 15 ++++ external/wasmi/patches/wasmi.patch | 109 +++++++++++++++++++++++ 8 files changed, 231 insertions(+) create mode 100644 external/wasmi/conandata.yml create mode 100644 external/wasmi/conanfile.py create mode 100644 external/wasmi/patches/static_only.patch create mode 100644 external/wasmi/patches/wasmi.patch diff --git a/BUILD.md b/BUILD.md index f13204ea4c1..3a30caea578 100644 --- a/BUILD.md +++ b/BUILD.md @@ -144,6 +144,7 @@ git fetch origin master git checkout master conan export --version 1.1.10 recipes/snappy/all conan export --version 4.0.3 recipes/soci/all +conan export --version 0.42.1 external/wasmi rm -rf .git ``` diff --git a/CMakeLists.txt b/CMakeLists.txt index cedc41eae07..a7c450ce0ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,6 +119,7 @@ endif() find_package(nudb REQUIRED) find_package(date REQUIRED) +find_package(wasmi REQUIRED) find_package(xxHash REQUIRED) target_link_libraries(xrpl_libs INTERFACE diff --git a/cmake/XrplCore.cmake b/cmake/XrplCore.cmake index 164fc8523fa..cf9cdca2722 100644 --- a/cmake/XrplCore.cmake +++ b/cmake/XrplCore.cmake @@ -63,11 +63,17 @@ target_link_libraries(xrpl.imports.main Xrpl::opts Xrpl::syslibs secp256k1::secp256k1 + wasmi::wasmi xrpl.libpb xxHash::xxhash $<$:antithesis-sdk-cpp> ) +if (WIN32) + target_link_libraries(xrpl.imports.main INTERFACE ntdll) +endif() + + include(add_module) include(target_link_modules) diff --git a/conanfile.py b/conanfile.py index 7f8ab24fbd1..d7484615519 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,6 +2,7 @@ from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout import re + class Xrpl(ConanFile): name = 'xrpl' @@ -29,6 +30,7 @@ class Xrpl(ConanFile): 'nudb/2.0.9', 'openssl/3.5.4', 'soci/4.0.3', + 'wasmi/0.42.1', 'zlib/1.3.1', ] @@ -133,6 +135,7 @@ def layout(self): self.folders.generators = 'build/generators' generators = 'CMakeDeps' + def generate(self): tc = CMakeToolchain(self) tc.variables['tests'] = self.options.tests @@ -190,6 +193,7 @@ def package_info(self): 'protobuf::libprotobuf', 'soci::soci', 'sqlite3::sqlite', + 'wasmi::wasmi', 'xxhash::xxhash', 'zlib::zlib', ] diff --git a/external/wasmi/conandata.yml b/external/wasmi/conandata.yml new file mode 100644 index 00000000000..628590aea45 --- /dev/null +++ b/external/wasmi/conandata.yml @@ -0,0 +1,5 @@ +patches: + 0.42.1: + - patch_description: install only static lib (to prevent conflict with shared) + patch_file: patches/wasmi.patch + patch_type: conan diff --git a/external/wasmi/conanfile.py b/external/wasmi/conanfile.py new file mode 100644 index 00000000000..d6b1c0b259f --- /dev/null +++ b/external/wasmi/conanfile.py @@ -0,0 +1,90 @@ +from conan import ConanFile, tools +from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.files import ( + apply_conandata_patches, + export_conandata_patches, + # get, +) +from conan.tools.scm import Git + +import os +# import json + +required_conan_version = ">=1.55.0" + +class WasmiConan(ConanFile): + name = "wasmi" + license = "Apache License v2.0" + url = "https://github.com/wasmi-labs/wasmi.git" + description = "WebAssembly (Wasm) interpreter" + package_type = "library" + settings = "os", "compiler", "build_type", "arch" + options = {"shared": [True, False]} + default_options = {"shared": False} + # generators = "CMakeToolchain", "CMakeDeps" + #requires = [("llvm/20.1.1@")] + + def export_sources(self): + export_conandata_patches(self) + pass + + # def build_requirements(self): + # self.tool_requires("llvm/20.1.1") + + + def config_options(self): + #if self.settings.os == "Windows": + # del self.options.fPIC + pass + + + def layout(self): + cmake_layout(self, src_folder="src") + + + def source(self): + git = Git(self) + git.fetch_commit( + url="https://github.com/wasmi-labs/wasmi.git", + commit="f628a7a86c9715f2c306f6ef9aea1cc2bdca5fa7", + ) + #get(self, **self.conan_data["sources"][self.version], strip_root=True) + + + def generate(self): + tc = CMakeToolchain(self) + + tc.variables["CMAKE_CXX_STANDARD"] = 20 + tc.variables["BUILD_SHARED_LIBS"] = 0 + + tc.generate() + + # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder + deps = CMakeDeps(self) + deps.generate() + + + def build(self): + apply_conandata_patches(self) + cmake = CMake(self) + cmake.verbose = True + cmake.configure(build_script_folder=os.path.join(self.source_folder, "crates", "c_api")) + cmake.build() + #self.run(f'echo {self.source_folder}') + + # Explicit way: + # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) + # self.run("cmake --build . %s" % cmake.build_config) + + + def package(self): + cmake = CMake(self) + cmake.verbose = True + cmake.install() + + + def package_info(self): + self.cpp_info.libs = ["wasmi"] + self.cpp_info.names["cmake_find_package"] = "wasmi" + self.cpp_info.names["cmake_find_package_multi"] = "wasmi" + diff --git a/external/wasmi/patches/static_only.patch b/external/wasmi/patches/static_only.patch new file mode 100644 index 00000000000..aff4b408ea9 --- /dev/null +++ b/external/wasmi/patches/static_only.patch @@ -0,0 +1,15 @@ +diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt +index b15c787..97dd294 100644 +--- a/crates/c_api/CMakeLists.txt ++++ b/crates/c_api/CMakeLists.txt +@@ -43,6 +43,10 @@ endif() + list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) + list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) + ++if(NOT BUILD_SHARED_LIBS) ++ set(WASMI_SHARED_FILES ) ++endif() ++ + # Instructions on how to build and install the Wasmi Rust crate. + find_program(WASMI_CARGO_BINARY cargo REQUIRED) + include(ExternalProject) diff --git a/external/wasmi/patches/wasmi.patch b/external/wasmi/patches/wasmi.patch new file mode 100644 index 00000000000..d79d52d6dbf --- /dev/null +++ b/external/wasmi/patches/wasmi.patch @@ -0,0 +1,109 @@ +diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt +index b15c787a..0d0a04b7 100644 +--- a/crates/c_api/CMakeLists.txt ++++ b/crates/c_api/CMakeLists.txt +@@ -43,6 +43,11 @@ endif() + list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) + list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) + ++if(NOT BUILD_SHARED_LIBS) ++ set(WASMI_SHARED_FILES ) ++endif() ++ ++ + # Instructions on how to build and install the Wasmi Rust crate. + find_program(WASMI_CARGO_BINARY cargo REQUIRED) + include(ExternalProject) +diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h +index 5ee617ff..0199192d 100644 +--- a/crates/c_api/include/wasm.h ++++ b/crates/c_api/include/wasm.h +@@ -146,6 +146,13 @@ WASM_DECLARE_OWN(store) + + WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); + ++// Store fuel functions (forward declarations) ++struct wasmi_error; ++ ++WASM_API_EXTERN struct wasmi_error* wasm_store_get_fuel(const wasm_store_t*, uint64_t* fuel); ++WASM_API_EXTERN struct wasmi_error* wasm_store_set_fuel(wasm_store_t*, uint64_t fuel); ++//WASM_API_EXTERN void *wasm_store_get_data(const wasm_store_t*); ++//WASM_API_EXTERN void wasm_store_set_data(wasm_store_t*, void *data); + + /////////////////////////////////////////////////////////////////////////////// + // Type Representations +diff --git a/crates/c_api/include/wasmi.h b/crates/c_api/include/wasmi.h +index 2caffa37..0c0584ec 100644 +--- a/crates/c_api/include/wasmi.h ++++ b/crates/c_api/include/wasmi.h +@@ -10,7 +10,7 @@ + /** + * \brief Wasmi version string. + */ +-#define WASMI_VERSION "0.35.0" ++#define WASMI_VERSION "0.42.1" + /** + * \brief Wasmi major version number. + */ +@@ -18,10 +18,10 @@ + /** + * \brief Wasmi minor version number. + */ +-#define WASMI_VERSION_MINOR 35 ++#define WASMI_VERSION_MINOR 42 + /** + * \brief Wasmi patch version number. + */ +-#define WASMI_VERSION_PATCH 0 ++#define WASMI_VERSION_PATCH 1 + + #endif // WASMI_H +diff --git a/crates/c_api/src/store.rs b/crates/c_api/src/store.rs +index 56d4898f..543dbff8 100644 +--- a/crates/c_api/src/store.rs ++++ b/crates/c_api/src/store.rs +@@ -175,3 +175,44 @@ pub extern "C" fn wasmi_context_set_fuel( + ) -> Option> { + crate::handle_result(store.set_fuel(fuel), |()| {}) + } ++ ++//////////////////////////////////////////////////////////////////////////////////////// ++//////////////////////////////////////////////////////////////////////////////////////// ++//////////////////////////////////////////////////////////////////////////////////////// ++//////////////////////////////////////////////////////////////////////////////////////// ++ ++/// Returns the current fuel of the wasm store context in `fuel`. ++/// ++/// Wraps [`Store::get_fuel`]. ++/// ++/// # Errors ++/// ++/// If [`Store::get_fuel`] errors. ++#[no_mangle] ++pub extern "C" fn wasm_store_get_fuel( ++ store: &wasm_store_t, ++ fuel: &mut u64, ++) -> Option> { ++ let context = unsafe { store.inner.context() }; ++ crate::handle_result(context.get_fuel(), |amt| { ++ *fuel = amt; ++ }) ++} ++ ++/// Sets the current fuel of the wasm store context to `fuel`. ++/// ++/// Wraps [`Store::set_fuel`]. ++/// ++/// # Errors ++/// ++/// If [`Store::set_fuel`] errors. ++#[no_mangle] ++pub extern "C" fn wasm_store_set_fuel( ++ store: &mut wasm_store_t, ++ fuel: u64, ++) -> Option> { ++ ++ let mut context = unsafe { store.inner.context_mut() }; ++ crate::handle_result(context.set_fuel(fuel), |()| {}) ++} ++ From def7758a23aa6c9a256af6c94d3f685b36b21d09 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 4 Nov 2025 17:53:13 -0500 Subject: [PATCH 110/212] remove copyright stuff --- src/test/app/EscrowSmart_test.cpp | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 7aad37c328b..3bff14f9e1f 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include From 35f7cbf772399c092eb9b0dcf28e6dfdef976f2c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 02:31:51 +0530 Subject: [PATCH 111/212] update --- .github/actions/build-deps/action.yml | 1 + .github/scripts/strategy-matrix/linux.json | 48 ++--- .../workflows/reusable-build-test-config.yml | 188 +++++++++++++++--- .github/workflows/upload-conan-deps.yml | 2 +- conanfile.py | 4 +- external/wasmi/conandata.yml | 14 +- external/wasmi/conanfile.py | 56 +----- .../{wasmi.patch => 0001-xrplf-0.42.1.patch} | 43 +++- external/wasmi/patches/static_only.patch | 15 -- 9 files changed, 248 insertions(+), 123 deletions(-) rename external/wasmi/patches/{wasmi.patch => 0001-xrplf-0.42.1.patch} (71%) delete mode 100644 external/wasmi/patches/static_only.patch diff --git a/.github/actions/build-deps/action.yml b/.github/actions/build-deps/action.yml index f20eb3a595b..9ac6d657806 100644 --- a/.github/actions/build-deps/action.yml +++ b/.github/actions/build-deps/action.yml @@ -35,6 +35,7 @@ runs: LOG_VERBOSITY: ${{ inputs.log_verbosity }} run: | echo 'Installing dependencies.' + conan export --version 0.42.1 external/wasmi #TODO Switch to conan package mkdir -p "${BUILD_DIR}" cd "${BUILD_DIR}" conan install \ diff --git a/.github/scripts/strategy-matrix/linux.json b/.github/scripts/strategy-matrix/linux.json index 85a78c96dca..f6d176c57ce 100644 --- a/.github/scripts/strategy-matrix/linux.json +++ b/.github/scripts/strategy-matrix/linux.json @@ -15,168 +15,168 @@ "distro_version": "bookworm", "compiler_name": "gcc", "compiler_version": "12", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "gcc", "compiler_version": "13", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "gcc", "compiler_version": "14", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "gcc", "compiler_version": "15", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "clang", "compiler_version": "16", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "clang", "compiler_version": "17", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "clang", "compiler_version": "18", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "clang", "compiler_version": "19", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "debian", "distro_version": "bookworm", "compiler_name": "clang", "compiler_version": "20", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "8", "compiler_name": "gcc", "compiler_version": "14", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "8", "compiler_name": "clang", "compiler_version": "any", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "9", "compiler_name": "gcc", "compiler_version": "12", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "9", "compiler_name": "gcc", "compiler_version": "13", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "9", "compiler_name": "gcc", "compiler_version": "14", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "9", "compiler_name": "clang", "compiler_version": "any", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "10", "compiler_name": "gcc", "compiler_version": "14", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "rhel", "distro_version": "10", "compiler_name": "clang", "compiler_version": "any", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "jammy", "compiler_name": "gcc", "compiler_version": "12", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "gcc", "compiler_version": "13", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "gcc", "compiler_version": "14", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "clang", "compiler_version": "16", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "clang", "compiler_version": "17", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "clang", "compiler_version": "18", - "image_sha": "97ba375" + "image_sha": "ca4517d" }, { "distro_name": "ubuntu", "distro_version": "noble", "compiler_name": "clang", "compiler_version": "19", - "image_sha": "97ba375" + "image_sha": "ca4517d" } ], "build_type": ["Debug", "Release"], diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index a59dbda71bd..746fde22411 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -7,19 +7,23 @@ on: description: "The directory where to build." required: true type: string + build_only: description: 'Whether to only build or to build and test the code ("true", "false").' required: true type: boolean + build_type: description: 'The build type to use ("Debug", "Release").' type: string required: true + cmake_args: description: "Additional arguments to pass to CMake." required: false type: string default: "" + cmake_target: description: "The CMake target to build." type: string @@ -29,6 +33,7 @@ on: description: Runner to run the job on as a JSON string required: true type: string + image: description: "The image to run in (leave empty to run natively)" required: true @@ -51,27 +56,162 @@ on: required: true jobs: - build: - uses: ./.github/workflows/reusable-build.yml - with: - build_dir: ${{ inputs.build_dir }} - build_type: ${{ inputs.build_type }} - cmake_args: ${{ inputs.cmake_args }} - cmake_target: ${{ inputs.cmake_target }} - runs_on: ${{ inputs.runs_on }} - image: ${{ inputs.image }} - config_name: ${{ inputs.config_name }} - nproc_subtract: ${{ inputs.nproc_subtract }} - secrets: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} - - test: - needs: build - uses: ./.github/workflows/reusable-test.yml - with: - run_tests: ${{ !inputs.build_only }} - verify_voidstar: ${{ contains(inputs.cmake_args, '-Dvoidstar=ON') }} - runs_on: ${{ inputs.runs_on }} - image: ${{ inputs.image }} - config_name: ${{ inputs.config_name }} - nproc_subtract: ${{ inputs.nproc_subtract }} + build-and-test: + name: ${{ inputs.config_name }} + runs-on: ${{ fromJSON(inputs.runs_on) }} + container: ${{ inputs.image != '' && inputs.image || null }} + timeout-minutes: 60 + env: + ENABLED_VOIDSTAR: ${{ contains(inputs.cmake_args, '-Dvoidstar=ON') }} + ENABLED_COVERAGE: ${{ contains(inputs.cmake_args, '-Dcoverage=ON') }} + steps: + - name: Cleanup workspace + if: ${{ runner.os == 'macOS' }} + uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e + + - name: Checkout repository + uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 + + - name: Prepare runner + uses: XRPLF/actions/.github/actions/prepare-runner@ff9f8f649df5855ffe1a1ae715df43e51807f2e0 + with: + disable_ccache: false + + - name: Print build environment + uses: ./.github/actions/print-env + + - name: Get number of processors + uses: XRPLF/actions/.github/actions/get-nproc@046b1620f6bfd6cd0985dc82c3df02786801fe0a + id: nproc + with: + subtract: ${{ inputs.nproc_subtract }} + + - name: Setup Conan + uses: ./.github/actions/setup-conan + + - name: Build dependencies + uses: ./.github/actions/build-deps + with: + build_dir: ${{ inputs.build_dir }} + build_nproc: ${{ steps.nproc.outputs.nproc }} + build_type: ${{ inputs.build_type }} + # Set the verbosity to "quiet" for Windows to avoid an excessive + # amount of logs. For other OSes, the "verbose" logs are more useful. + log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }} + + - name: Configure CMake + shell: bash + working-directory: ${{ inputs.build_dir }} + env: + BUILD_TYPE: ${{ inputs.build_type }} + CMAKE_ARGS: ${{ inputs.cmake_args }} + run: | + cmake \ + -G '${{ runner.os == 'Windows' && 'Visual Studio 17 2022' || 'Ninja' }}' \ + -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + ${CMAKE_ARGS} \ + .. + + - name: Build the binary + shell: bash + working-directory: ${{ inputs.build_dir }} + env: + BUILD_NPROC: ${{ steps.nproc.outputs.nproc }} + BUILD_TYPE: ${{ inputs.build_type }} + CMAKE_TARGET: ${{ inputs.cmake_target }} + run: | + cmake \ + --build . \ + --config "${BUILD_TYPE}" \ + --parallel "${BUILD_NPROC}" \ + --target "${CMAKE_TARGET}" + + - name: Upload rippled artifact (Linux) + if: ${{ runner.os == 'Linux' }} + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + env: + BUILD_DIR: ${{ inputs.build_dir }} + with: + name: rippled-${{ inputs.config_name }} + path: ${{ env.BUILD_DIR }}/rippled + retention-days: 3 + if-no-files-found: error + + - name: Check linking (Linux) + if: ${{ runner.os == 'Linux' }} + working-directory: ${{ inputs.build_dir }} + shell: bash + run: | + ldd ./rippled + if [ "$(ldd ./rippled | grep -E '(libstdc\+\+|libgcc)' | wc -l)" -eq 0 ]; then + echo 'The binary is statically linked.' + else + echo 'The binary is dynamically linked.' + exit 1 + fi + + - name: Verify presence of instrumentation (Linux) + if: ${{ runner.os == 'Linux' && env.ENABLED_VOIDSTAR == 'true' }} + working-directory: ${{ inputs.build_dir }} + shell: bash + run: | + ./rippled --version | grep libvoidstar + + - name: Run the separate tests + if: ${{ !inputs.build_only }} + working-directory: ${{ inputs.build_dir }} + # Windows locks some of the build files while running tests, and parallel jobs can collide + env: + BUILD_TYPE: ${{ inputs.build_type }} + PARALLELISM: ${{ runner.os == 'Windows' && '1' || steps.nproc.outputs.nproc }} + shell: bash + run: | + ctest \ + --output-on-failure \ + -C "${BUILD_TYPE}" \ + -j "${PARALLELISM}" + + - name: Run the embedded tests + if: ${{ !inputs.build_only }} + working-directory: ${{ runner.os == 'Windows' && format('{0}/{1}', inputs.build_dir, inputs.build_type) || inputs.build_dir }} + shell: bash + env: + BUILD_NPROC: ${{ steps.nproc.outputs.nproc }} + run: | + ./rippled --unittest --unittest-jobs "${BUILD_NPROC}" + + - name: Debug failure (Linux) + if: ${{ failure() && runner.os == 'Linux' && !inputs.build_only }} + shell: bash + run: | + echo "IPv4 local port range:" + cat /proc/sys/net/ipv4/ip_local_port_range + echo "Netstat:" + netstat -an + + - name: Prepare coverage report + if: ${{ !inputs.build_only && env.ENABLED_COVERAGE == 'true' }} + working-directory: ${{ inputs.build_dir }} + env: + BUILD_NPROC: ${{ steps.nproc.outputs.nproc }} + BUILD_TYPE: ${{ inputs.build_type }} + shell: bash + run: | + cmake \ + --build . \ + --config "${BUILD_TYPE}" \ + --parallel "${BUILD_NPROC}" \ + --target coverage + + - name: Upload coverage report + if: ${{ github.repository_owner == 'XRPLF' && !inputs.build_only && env.ENABLED_COVERAGE == 'true' }} + uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3 + with: + disable_search: true + disable_telem: true + fail_ci_if_error: true + files: ${{ inputs.build_dir }}/coverage.xml + plugins: noop + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true diff --git a/.github/workflows/upload-conan-deps.yml b/.github/workflows/upload-conan-deps.yml index f6262a2f1ff..10d5597fa20 100644 --- a/.github/workflows/upload-conan-deps.yml +++ b/.github/workflows/upload-conan-deps.yml @@ -66,7 +66,7 @@ jobs: uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Prepare runner - uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a + uses: XRPLF/actions/.github/actions/prepare-runner@ff9f8f649df5855ffe1a1ae715df43e51807f2e0 with: disable_ccache: false diff --git a/conanfile.py b/conanfile.py index d7484615519..d01a0f0969f 100644 --- a/conanfile.py +++ b/conanfile.py @@ -35,7 +35,7 @@ class Xrpl(ConanFile): ] test_requires = [ - 'doctest/2.4.11', + 'doctest/2.4.12', ] tool_requires = [ @@ -116,7 +116,7 @@ def requirements(self): if self.options.jemalloc: self.requires('jemalloc/5.3.0') if self.options.rocksdb: - self.requires('rocksdb/10.0.1') + self.requires('rocksdb/10.5.1') self.requires('xxhash/0.8.3', **transitive_headers_opt) exports_sources = ( diff --git a/external/wasmi/conandata.yml b/external/wasmi/conandata.yml index 628590aea45..032c12753c4 100644 --- a/external/wasmi/conandata.yml +++ b/external/wasmi/conandata.yml @@ -1,5 +1,11 @@ +# Do not update. Maintained by programmability team. + +sources: + "0.42.1": + sha256: 2a5697be33c7afce8f671af4a5a3621d9e93ce55d253d31bd8201458e465fbb8 + url: https://github.com/wasmi-labs/wasmi/archive/refs/tags/v0.42.1.tar.gz patches: - 0.42.1: - - patch_description: install only static lib (to prevent conflict with shared) - patch_file: patches/wasmi.patch - patch_type: conan + "0.42.1": + - patch_file: "patches/0001-xrplf-0.42.1.patch" + patch_type: conan + patch_description: Integration patch. Make wasmi lib to be able to build with existing smart-escrow branch. diff --git a/external/wasmi/conanfile.py b/external/wasmi/conanfile.py index d6b1c0b259f..e245d62eb0a 100644 --- a/external/wasmi/conanfile.py +++ b/external/wasmi/conanfile.py @@ -1,16 +1,9 @@ from conan import ConanFile, tools from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import ( - apply_conandata_patches, - export_conandata_patches, - # get, -) -from conan.tools.scm import Git - +from conan.tools.files import apply_conandata_patches, export_conandata_patches, get import os -# import json -required_conan_version = ">=1.55.0" +required_conan_version = ">=2.0.0" class WasmiConan(ConanFile): name = "wasmi" @@ -18,73 +11,38 @@ class WasmiConan(ConanFile): url = "https://github.com/wasmi-labs/wasmi.git" description = "WebAssembly (Wasm) interpreter" package_type = "library" - settings = "os", "compiler", "build_type", "arch" - options = {"shared": [True, False]} + settings = "os", "arch", "compiler", "build_type" + options = {"shared": [False]} default_options = {"shared": False} - # generators = "CMakeToolchain", "CMakeDeps" - #requires = [("llvm/20.1.1@")] def export_sources(self): export_conandata_patches(self) - pass - - # def build_requirements(self): - # self.tool_requires("llvm/20.1.1") - - - def config_options(self): - #if self.settings.os == "Windows": - # del self.options.fPIC - pass - def layout(self): cmake_layout(self, src_folder="src") - def source(self): - git = Git(self) - git.fetch_commit( - url="https://github.com/wasmi-labs/wasmi.git", - commit="f628a7a86c9715f2c306f6ef9aea1cc2bdca5fa7", - ) - #get(self, **self.conan_data["sources"][self.version], strip_root=True) - + get(self, **self.conan_data["sources"][self.version], strip_root=True) + apply_conandata_patches(self) def generate(self): tc = CMakeToolchain(self) - - tc.variables["CMAKE_CXX_STANDARD"] = 20 - tc.variables["BUILD_SHARED_LIBS"] = 0 - + tc.variables["BUILD_SHARED_LIBS"] = self.options.shared tc.generate() - # This generates "foo-config.cmake" and "bar-config.cmake" in self.generators_folder deps = CMakeDeps(self) deps.generate() - def build(self): - apply_conandata_patches(self) cmake = CMake(self) - cmake.verbose = True cmake.configure(build_script_folder=os.path.join(self.source_folder, "crates", "c_api")) cmake.build() - #self.run(f'echo {self.source_folder}') - - # Explicit way: - # self.run('cmake %s/hello %s' % (self.source_folder, cmake.command_line)) - # self.run("cmake --build . %s" % cmake.build_config) - def package(self): cmake = CMake(self) - cmake.verbose = True cmake.install() - def package_info(self): self.cpp_info.libs = ["wasmi"] self.cpp_info.names["cmake_find_package"] = "wasmi" self.cpp_info.names["cmake_find_package_multi"] = "wasmi" - diff --git a/external/wasmi/patches/wasmi.patch b/external/wasmi/patches/0001-xrplf-0.42.1.patch similarity index 71% rename from external/wasmi/patches/wasmi.patch rename to external/wasmi/patches/0001-xrplf-0.42.1.patch index d79d52d6dbf..656c5aff65f 100644 --- a/external/wasmi/patches/wasmi.patch +++ b/external/wasmi/patches/0001-xrplf-0.42.1.patch @@ -1,19 +1,54 @@ diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt -index b15c787a..0d0a04b7 100644 +index b15c787a..4e6de690 100644 --- a/crates/c_api/CMakeLists.txt +++ b/crates/c_api/CMakeLists.txt -@@ -43,6 +43,11 @@ endif() +@@ -43,6 +43,10 @@ endif() list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) +if(NOT BUILD_SHARED_LIBS) -+ set(WASMI_SHARED_FILES ) ++ set(WASMI_SHARED_FILES) +endif() -+ + # Instructions on how to build and install the Wasmi Rust crate. find_program(WASMI_CARGO_BINARY cargo REQUIRED) include(ExternalProject) +@@ -112,6 +116,7 @@ install( + DESTINATION ${CMAKE_INSTALL_LIBDIR} + ) + ++if(BUILD_SHARED_LIBS) + if(WASMI_TARGET MATCHES "darwin") + set(INSTALLED_LIB "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libwasmi.dylib") + install( +@@ -131,6 +136,7 @@ if(WASMI_TARGET MATCHES "darwin") + install(CODE "execute_process(COMMAND ${install_name_tool_cmd})") + endif() + endif() ++endif() + + # Documentation Generation via Doxygen: + set(DOXYGEN_CONF_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf.in) +@@ -141,19 +147,3 @@ add_custom_target(doc + DEPENDS ${WASMI_GENERATED_CONF_H} ${DOXYGEN_CONF_OUT} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) +- +-# C-Header Formatting via clang-format: +-find_program(CLANG_FORMAT clang-format REQUIRED) +-file(GLOB_RECURSE HEADER_FILES +- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi.h +- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi/*.h +- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi/*.hh +-) +-add_custom_target(check-format +- COMMAND ${CLANG_FORMAT} -style=llvm -Werror --dry-run ${HEADER_FILES} +- COMMENT "clang-format: Check formatting for Wasmi C-API header files" +-) +-add_custom_target(format +- COMMAND ${CLANG_FORMAT} -style=llvm -i ${HEADER_FILES} +- COMMENT "clang-format: Apply formatting rules for Wasmi C-API header files" +-) diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h index 5ee617ff..0199192d 100644 --- a/crates/c_api/include/wasm.h diff --git a/external/wasmi/patches/static_only.patch b/external/wasmi/patches/static_only.patch deleted file mode 100644 index aff4b408ea9..00000000000 --- a/external/wasmi/patches/static_only.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt -index b15c787..97dd294 100644 ---- a/crates/c_api/CMakeLists.txt -+++ b/crates/c_api/CMakeLists.txt -@@ -43,6 +43,10 @@ endif() - list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) - list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) - -+if(NOT BUILD_SHARED_LIBS) -+ set(WASMI_SHARED_FILES ) -+endif() -+ - # Instructions on how to build and install the Wasmi Rust crate. - find_program(WASMI_CARGO_BINARY cargo REQUIRED) - include(ExternalProject) From 25c3060fef979145a106d917922f44a64ab510c0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 02:40:57 +0530 Subject: [PATCH 112/212] remove conan.lock (temporary) --- conan.lock | 62 ------------------------------------------------------ 1 file changed, 62 deletions(-) delete mode 100644 conan.lock diff --git a/conan.lock b/conan.lock deleted file mode 100644 index 67c4dd8a107..00000000000 --- a/conan.lock +++ /dev/null @@ -1,62 +0,0 @@ -{ - "version": "0.5", - "requires": [ - "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", - "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", - "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", - "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", - "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", - "rocksdb/10.5.1#4a197eca381a3e5ae8adf8cffa5aacd0%1762797952.535", - "re2/20230301#dfd6e2bf050eb90ddd8729cfb4c844a4%1756234257.976", - "protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614", - "openssl/3.5.4#a1d5835cc6ed5c5b8f3cd5b9b5d24205%1760106486.594", - "nudb/2.0.9#fb8dfd1a5557f5e0528114c2da17721e%1763150366.909", - "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999", - "libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64", - "libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1756230911.03", - "libarchive/3.8.1#5cf685686322e906cb42706ab7e099a8%1756234256.696", - "jemalloc/5.3.0#e951da9cf599e956cebc117880d2d9f8%1729241615.244", - "grpc/1.50.1#02291451d1e17200293a409410d1c4e1%1756234248.958", - "doctest/2.4.12#eb9fb352fb2fdfc8abb17ec270945165%1762797941.757", - "date/3.0.4#f74bbba5a08fa388256688743136cb6f%1756234217.493", - "c-ares/1.34.5#b78b91e7cfb1f11ce777a285bbf169c6%1756234217.915", - "bzip2/1.0.8#00b4a4658791c1f06914e087f0e792f5%1756234261.716", - "boost/1.88.0#8852c0b72ce8271fb8ff7c53456d4983%1756223752.326", - "abseil/20230802.1#f0f91485b111dc9837a68972cb19ca7b%1756234220.907" - ], - "build_requires": [ - "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", - "strawberryperl/5.32.1.1#707032463aa0620fa17ec0d887f5fe41%1756234281.733", - "protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614", - "nasm/2.16.01#31e26f2ee3c4346ecd347911bd126904%1756234232.901", - "msys2/cci.latest#5b73b10144f73cc5bfe0572ed9be39e1%1751977009.857", - "m4/1.4.19#f119296e5c4772b3bb7ab060ae8f417b%1760707875.678", - "cmake/3.31.8#dde3bde00bb843687e55aea5afa0e220%1756234232.89", - "b2/5.3.3#107c15377719889654eb9a162a673975%1756234226.28", - "automake/1.16.5#b91b7c384c3deaa9d535be02da14d04f%1755524470.56", - "autoconf/2.71#51077f068e61700d65bb05541ea1e4b0%1731054366.86" - ], - "python_requires": [], - "overrides": { - "protobuf/3.21.12": [ - null, - "protobuf/3.21.12" - ], - "lz4/1.9.4": [ - "lz4/1.10.0" - ], - "boost/1.83.0": [ - "boost/1.88.0" - ], - "sqlite3/[>=3.44 <4]": [ - "sqlite3/3.49.1" - ], - "lz4/[>=1.9.4 <2]": [ - "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504" - ], - "sqlite3/3.44.2": [ - "sqlite3/3.49.1" - ] - }, - "config_requires": [] -} From ef5d335e09ba71c72fa2829b8d2f58489e3aad35 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 02:44:18 +0530 Subject: [PATCH 113/212] update --- src/test/app/Wasm_test.cpp | 40 +- src/xrpld/app/wasm/HostFuncWrapper.h | 2 +- src/xrpld/app/wasm/WasmVM.h | 8 +- src/xrpld/app/wasm/{WamrVM.h => WasmiVM.h} | 63 ++- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 14 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 21 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 14 +- .../wasm/detail/{WamrVM.cpp => WasmiVM.cpp} | 366 ++++++------------ 8 files changed, 187 insertions(+), 341 deletions(-) rename src/xrpld/app/wasm/{WamrVM.h => WasmiVM.h} (86%) rename src/xrpld/app/wasm/detail/{WamrVM.cpp => WasmiVM.cpp} (71%) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index d03dfb270b5..7b738fe8f21 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -5,7 +5,6 @@ #include #include -#include namespace ripple { namespace test { @@ -79,7 +78,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 3, std::to_string(re->cost)); } } @@ -169,7 +168,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 39, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 5, std::to_string(re->cost)); } env.close(); @@ -183,7 +182,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 78, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 10, std::to_string(re->cost)); } } @@ -201,7 +200,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 755, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 696, std::to_string(re->cost)); } } @@ -220,7 +219,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 157'452, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 145'573, std::to_string(re->cost)); } } @@ -245,7 +244,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 3'066'129, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 2'701'528, std::to_string(re->cost)); } } @@ -280,7 +279,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 332'205'984, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 270'282'552, std::to_string(re->cost)); } } @@ -316,7 +315,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 838, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); } env.close(); @@ -350,7 +349,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'098, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); } env.close(); @@ -375,7 +374,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'098, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); } } @@ -397,7 +396,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 262, std::to_string(re->cost)); } } @@ -410,7 +409,7 @@ struct Wasm_test : public beast::unit_test::suite Expected getTxField(SField const& fname) override { - return Bytes((MAX_PAGES + 1) * 64 * 1024, 1); + return Bytes((128 + 1) * 64 * 1024, 1); } }; BadTestHostFunctions nfs(env); @@ -419,7 +418,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 4'806, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 262, std::to_string(re->cost)); } } @@ -450,9 +449,8 @@ struct Wasm_test : public beast::unit_test::suite auto const s = sink.messages().str(); BEAST_EXPECT( - countSubstr(s, "WAMR Error: failure to call func") == 1); - BEAST_EXPECT( - countSubstr(s, "Exception: wasm operand stack overflow") > 0); + countSubstr(s, "WASMI Error: failure to call func") == 1); + BEAST_EXPECT(countSubstr(s, "exception: failure") > 0); } { @@ -500,7 +498,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 97'411, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 326, std::to_string(re->cost)); } env.close(); } @@ -515,7 +513,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2'053, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 34, std::to_string(re->cost)); } env.close(); } @@ -629,7 +627,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 152'981; + auto const allowance = 1'814; auto re = runEscrowWasm( wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); @@ -699,7 +697,7 @@ struct Wasm_test : public beast::unit_test::suite testFloat(); testCodecovWasm(); - testDisabledFloat(); + // testDisabledFloat(); // perfTest(); } diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index eed68f65d52..13ed916e82f 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -1,6 +1,6 @@ #pragma once -#include +#include namespace ripple { diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index 4feb3850bef..18379d6d4d9 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -18,12 +18,11 @@ static std::string_view const W_PROC_EXIT = "proc_exit"; static std::string_view const ESCROW_FUNCTION_NAME = "finish"; -uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 +class WasmiEngine; -class WamrEngine; class WasmEngine { - std::unique_ptr const impl; + std::unique_ptr const impl; WasmEngine(); @@ -57,9 +56,6 @@ class WasmEngine std::vector const& imports = {}, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); - std::int32_t - initMaxPages(std::int32_t def); - // Host functions helper functionality void* newTrap(std::string_view msg = {}); diff --git a/src/xrpld/app/wasm/WamrVM.h b/src/xrpld/app/wasm/WasmiVM.h similarity index 86% rename from src/xrpld/app/wasm/WamrVM.h rename to src/xrpld/app/wasm/WasmiVM.h index 41f12b9d5c6..967a9319a63 100644 --- a/src/xrpld/app/wasm/WamrVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -2,42 +2,42 @@ #include -#include -#include +#include +#include namespace ripple { -struct WamrResult +struct WasmiResult { wasm_val_vec_t r; bool f; // failure flag - WamrResult(unsigned N = 0) : r{0, nullptr, 0, 0, nullptr}, f(false) + WasmiResult(unsigned N = 0) : r{0, nullptr}, f(false) { if (N) wasm_val_vec_new_uninitialized(&r, N); } - ~WamrResult() + ~WasmiResult() { if (r.size) wasm_val_vec_delete(&r); } - WamrResult(WamrResult const&) = delete; - WamrResult& - operator=(WamrResult const&) = delete; + WasmiResult(WasmiResult const&) = delete; + WasmiResult& + operator=(WasmiResult const&) = delete; - WamrResult(WamrResult&& o) + WasmiResult(WasmiResult&& o) { *this = std::move(o); } - WamrResult& - operator=(WamrResult&& o) + WasmiResult& + operator=(WasmiResult&& o) { r = o.r; - o.r = {0, nullptr, 0, 0, nullptr}; + o.r = {0, nullptr}; f = o.f; o.f = false; return *this; @@ -55,7 +55,6 @@ struct InstanceWrapper { wasm_extern_vec_t exports_; InstancePtr instance_; - wasm_exec_env_t execEnv_ = nullptr; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: @@ -63,7 +62,6 @@ struct InstanceWrapper init( wasm_store_t* s, wasm_module_t* m, - int32_t maxPages, wasm_extern_vec_t* expt, wasm_extern_vec_t const& imports, beast::Journal j); @@ -79,8 +77,6 @@ struct InstanceWrapper InstanceWrapper( wasm_store_t* s, wasm_module_t* m, - int32_t maxPages, - int64_t gas, wasm_extern_vec_t const& imports, beast::Journal j); @@ -95,13 +91,11 @@ struct InstanceWrapper wmem getMem() const; - - std::int64_t - getGas() const; }; struct ModuleWrapper { + wasm_store_t* store_ = nullptr; ModulePtr module_; InstanceWrapper instanceWrap_; wasm_exporttype_vec_t exportTypes_; @@ -120,8 +114,6 @@ struct ModuleWrapper wasm_store_t* s, Bytes const& wasmBin, bool instantiate, - int32_t maxPages, - int64_t gas, std::vector const& imports, beast::Journal j); ~ModuleWrapper(); @@ -139,8 +131,6 @@ struct ModuleWrapper int addInstance( wasm_store_t* s, - int32_t maxPages, - int64_t gas, wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); std::int64_t @@ -155,19 +145,21 @@ struct ModuleWrapper buildImports(wasm_store_t* s, std::vector const& imports); }; -class WamrEngine +class WasmiEngine { std::unique_ptr engine_; std::unique_ptr store_; std::unique_ptr moduleWrap_; - std::int32_t defMaxPages_ = -1; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); std::mutex m_; // 1 instance mutex public: - WamrEngine(); - ~WamrEngine() = default; + WasmiEngine(); + ~WasmiEngine() = default; + + static std::unique_ptr + init(); Expected, TER> run(Bytes const& wasmCode, @@ -186,9 +178,6 @@ class WamrEngine std::vector const& imports, beast::Journal j); - std::int32_t - initMaxPages(std::int32_t def); - std::int64_t getGas(); @@ -261,19 +250,19 @@ class WamrEngine add_param(std::vector& in, int64_t p); template - inline WamrResult + inline WasmiResult call(std::string_view func, Types&&... args); template - inline WamrResult + inline WasmiResult call(FuncInfo const& f, Types&&... args); template - inline WamrResult + inline WasmiResult call(FuncInfo const& f, std::vector& in); template - inline WamrResult + inline WasmiResult call( FuncInfo const& f, std::vector& in, @@ -281,7 +270,7 @@ class WamrEngine Types&&... args); template - inline WamrResult + inline WasmiResult call( FuncInfo const& f, std::vector& in, @@ -289,7 +278,7 @@ class WamrEngine Types&&... args); template - inline WamrResult + inline WasmiResult call( FuncInfo const& f, std::vector& in, @@ -298,7 +287,7 @@ class WamrEngine Types&&... args); template - inline WamrResult + inline WasmiResult call( FuncInfo const& f, std::vector& in, diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index b48dd4bcf1a..e61d39f9aaf 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -7,7 +7,6 @@ #ifdef _DEBUG // #define DEBUG_OUTPUT 1 -// #define DEBUG_OUTPUT_WAMR 1 #endif namespace ripple { @@ -723,7 +722,7 @@ WasmHostFunctionsImpl::trace( #endif if (!asHex) { - j << "WAMR TRACE (" << leKey.key << "): " << msg << " " + j << "HF TRACE (" << leKey.key << "): " << msg << " " << std::string_view( reinterpret_cast(data.data()), data.size()); } @@ -733,7 +732,7 @@ WasmHostFunctionsImpl::trace( hex.reserve(data.size() * 2); boost::algorithm::hex( data.begin(), data.end(), std::back_inserter(hex)); - j << "WAMR DEV TRACE (" << leKey.key << "): " << msg << " " << hex; + j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; } return msg.size() + data.size() * (asHex ? 2 : 1); @@ -747,7 +746,7 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) #else auto j = getJournal().trace(); #endif - j << "WAMR TRACE NUM(" << leKey.key << "): " << msg << " " << data; + j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; return msg.size() + sizeof(data); } @@ -764,8 +763,7 @@ WasmHostFunctionsImpl::traceAccount( auto const accountStr = toBase58(account); - j << "WAMR TRACE ACCOUNT(" << leKey.key << "): " << msg << " " - << accountStr; + j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; return msg.size() + accountStr.size(); } @@ -780,7 +778,7 @@ WasmHostFunctionsImpl::traceFloat( auto j = getJournal().trace(); #endif auto const s = floatToString(data); - j << "WAMR TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; + j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; return msg.size() + s.size(); } @@ -795,7 +793,7 @@ WasmHostFunctionsImpl::traceAmount( auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); - j << "WAMR TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; + j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; return msg.size() + amountStr.size(); } diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 566e7a4c982..6e849fe867c 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include #include @@ -229,7 +228,7 @@ std::nullptr_t hfResult(wasm_val_vec_t* results, int32_t value) { results->data[0] = WASM_I32_VAL(value); - results->num_elems = 1; + // results->size = 1; return nullptr; } @@ -237,7 +236,7 @@ std::nullptr_t hfResult(wasm_val_vec_t* results, HostFunctionError value) { results->data[0] = WASM_I32_VAL(HfErrorToInt(value)); - results->num_elems = 1; + // results->size = 1; return nullptr; } @@ -1903,7 +1902,7 @@ testGetDataIncrement() { // test int32_t - wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {1, &values[0]}; values[0] = WASM_I32_VAL(42); @@ -1915,7 +1914,7 @@ testGetDataIncrement() { // test int64_t - wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {1, &values[0]}; values[0] = WASM_I64_VAL(1234); @@ -1927,7 +1926,7 @@ testGetDataIncrement() { // test SFieldCRef - wasm_val_vec_t params = {1, &values[0], 1, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {1, &values[0]}; values[0] = WASM_I32_VAL(sfAccount.fieldCode); @@ -1939,7 +1938,7 @@ testGetDataIncrement() { // test Slice - wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(3); @@ -1952,7 +1951,7 @@ testGetDataIncrement() { // test string - wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(5); @@ -1972,7 +1971,7 @@ testGetDataIncrement() AccountID const id(calcAccountID( generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); - wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(id.bytes); @@ -1988,7 +1987,7 @@ testGetDataIncrement() // test uint256 Hash h1 = sha512Half(Slice(buffer.data(), 8)); - wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(h1.bytes); @@ -2004,7 +2003,7 @@ testGetDataIncrement() // test Currency Currency const c = xrpCurrency(); - wasm_val_vec_t params = {2, &values[0], 2, sizeof(wasm_val_t), nullptr}; + wasm_val_vec_t params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(c.bytes); diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index e1d5f8e8b8b..d87b1444f6e 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -4,7 +4,7 @@ #include #include -#include +#include #include #include @@ -114,7 +114,7 @@ runEscrowWasm( { // create VM and set cost limit auto& vm = WasmEngine::instance(); - vm.initMaxPages(MAX_PAGES); + // vm.initMaxPages(MAX_PAGES); auto const ret = vm.run( wasmCode, @@ -153,7 +153,7 @@ preflightEscrowWasm( { // create VM and set cost limit auto& vm = WasmEngine::instance(); - vm.initMaxPages(MAX_PAGES); + // vm.initMaxPages(MAX_PAGES); auto const ret = vm.check( wasmCode, @@ -167,7 +167,7 @@ preflightEscrowWasm( //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -WasmEngine::WasmEngine() : impl(std::make_unique()) +WasmEngine::WasmEngine() : impl(std::make_unique()) { } @@ -202,12 +202,6 @@ WasmEngine::check( return impl->check(wasmCode, funcName, params, imports, j); } -std::int32_t -WasmEngine::initMaxPages(std::int32_t def) -{ - return impl->initMaxPages(def); -} - void* WasmEngine::newTrap(std::string_view msg) { diff --git a/src/xrpld/app/wasm/detail/WamrVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp similarity index 71% rename from src/xrpld/app/wasm/detail/WamrVM.cpp rename to src/xrpld/app/wasm/detail/WasmiVM.cpp index d1b7fb694d0..c3c1e300e45 100644 --- a/src/xrpld/app/wasm/detail/WamrVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -1,116 +1,18 @@ -#include +#include #include -#include #include #ifdef _DEBUG // #define DEBUG_OUTPUT 1 -// #define DEBUG_OUTPUT_WAMR 1 #endif - // #define SHOW_CALL_TIME 1 -#define DISABLE_WM_LOG 1 namespace ripple { namespace { -// LCOV_EXCL_START -static log_level_t -getLogLevel(beast::severities::Severity severity) -{ - using namespace beast::severities; - switch (severity) - { - case kTrace: - return WASM_LOG_LEVEL_VERBOSE; - case kDebug: - return WASM_LOG_LEVEL_DEBUG; - case kInfo: - case kWarning: - return WASM_LOG_LEVEL_WARNING; - case kError: - return WASM_LOG_LEVEL_ERROR; - default: - UNREACHABLE("WAMR invalid severity"); - [[fallthrough]]; - case kFatal: - case kNone: - break; - } - - return WASM_LOG_LEVEL_FATAL; -} - -static beast::severities::Severity -getLogLevel(uint32_t severity) -{ - using namespace beast::severities; - switch (severity) - { - case WASM_LOG_LEVEL_VERBOSE: - return kTrace; - case WASM_LOG_LEVEL_DEBUG: - return kDebug; - case WASM_LOG_LEVEL_WARNING: - return kWarning; - case WASM_LOG_LEVEL_ERROR: - return kError; - default: - UNREACHABLE("WAMR invalid reverse severity"); - [[fallthrough]]; - case WASM_LOG_LEVEL_FATAL: - break; - } - - return kFatal; -} - -// This function is called from WAMR to log messages. -extern "C" void -wamr_log_to_rippled( - uint32_t logLevel, - char const* file, - int line, - char const* fmt, - ...) -{ -#ifdef DISABLE_WM_LOG - return; -#endif - - beast::Journal j = WasmEngine::instance().getJournal(); - std::ostringstream oss; - - // Format the variadic args - if (file) - { - oss << "WAMR (" << file << ":" << line << "): "; - } - else - { - oss << "WAMR: "; - } - - va_list args; - va_start(args, fmt); - - char formatted[4096]; - vsnprintf(formatted, sizeof(formatted), fmt, args); - formatted[sizeof(formatted) - 1] = '\0'; - - va_end(args); - - oss << formatted; - - j.stream(getLogLevel(logLevel)) << oss.str(); -#ifdef DEBUG_OUTPUT_WAMR - std::cerr << oss.str() << std::endl; -#endif -} - void print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) { @@ -125,13 +27,13 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) if (trap) wasm_trap_message(trap, &error_message); - if (error_message.num_elems) + if (error_message.size) { - j << "WAMR Error: " << msg << ", " - << std::string_view(error_message.data, error_message.num_elems - 1); + j << "WASMI Error: " << msg << ", " + << std::string_view(error_message.data, error_message.size - 1); } else - j << "WAMR Error: " << msg; + j << "WASMI Error: " << msg; if (error_message.size) wasm_byte_vec_delete(&error_message); @@ -151,20 +53,13 @@ InstancePtr InstanceWrapper::init( wasm_store_t* s, wasm_module_t* m, - int32_t maxPages, wasm_extern_vec_t* expt, wasm_extern_vec_t const& imports, beast::Journal j) { wasm_trap_t* trap = nullptr; - InstantiationArgs inst_args{ - 128 * 1024, - 256 * 1024, - static_cast(maxPages > 0 ? maxPages : 0)}; - InstancePtr mi = InstancePtr( - wasm_instance_new_with_args_ex(s, m, &imports, &trap, &inst_args), - &wasm_instance_delete); + wasm_instance_new(s, m, &imports, &trap), &wasm_instance_delete); if (!mi || trap) { @@ -176,14 +71,12 @@ InstanceWrapper::init( } InstanceWrapper::InstanceWrapper() - : exports_{0, nullptr, 0, 0, nullptr} - , instance_(nullptr, &wasm_instance_delete) + : exports_{0, nullptr}, instance_(nullptr, &wasm_instance_delete) { } InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) - : exports_{0, nullptr, 0, 0, nullptr} - , instance_(nullptr, &wasm_instance_delete) + : exports_{0, nullptr}, instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } @@ -191,16 +84,12 @@ InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) InstanceWrapper::InstanceWrapper( wasm_store_t* s, wasm_module_t* m, - int32_t maxPages, - int64_t gas, wasm_extern_vec_t const& imports, beast::Journal j) : exports_ WASM_EMPTY_VEC - , instance_(init(s, m, maxPages, &exports_, imports, j)) - , execEnv_(wasm_instance_exec_env(instance_.get())) + , instance_(init(s, m, &exports_, imports, j)) , j_(j) { - wasm_runtime_set_instruction_count_limit(execEnv_, gas); } InstanceWrapper::~InstanceWrapper() @@ -218,11 +107,9 @@ InstanceWrapper::operator=(InstanceWrapper&& o) if (exports_.size) wasm_extern_vec_delete(&exports_); exports_ = o.exports_; - o.exports_ = {0, nullptr, 0, 0, nullptr}; + o.exports_ = {0, nullptr}; instance_ = std::move(o.instance_); - execEnv_ = o.execEnv_; - o.execEnv_ = nullptr; j_ = o.j_; @@ -245,12 +132,12 @@ InstanceWrapper::getFunc( if (!instance_) throw std::runtime_error("no instance"); - if (!export_types.num_elems) + if (!export_types.size) throw std::runtime_error("no export"); - if (export_types.num_elems != exports_.num_elems) + if (export_types.size != exports_.size) throw std::runtime_error("invalid export"); - for (unsigned i = 0; i < export_types.num_elems; ++i) + for (unsigned i = 0; i < export_types.size; ++i) { auto const* exp_type(export_types.data[i]); @@ -258,7 +145,7 @@ InstanceWrapper::getFunc( wasm_externtype_t const* exn_type = wasm_exporttype_type(exp_type); if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) { - if (funcName == std::string_view(name->data, name->size - 1)) + if (funcName == std::string_view(name->data, name->size)) { auto* exn(exports_.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) @@ -286,7 +173,7 @@ InstanceWrapper::getMem() const throw std::runtime_error("no instance"); wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports_.num_elems; ++i) + for (unsigned i = 0; i < exports_.size; ++i) { auto* e(exports_.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) @@ -304,23 +191,12 @@ InstanceWrapper::getMem() const wasm_memory_data_size(mem)}; } -std::int64_t -InstanceWrapper::getGas() const -{ - return execEnv_ ? wasm_runtime_get_instruction_count_limit(execEnv_) : 0; -} - ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ModulePtr ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) { - wasm_byte_vec_t const code{ - wasmBin.size(), - (char*)(wasmBin.data()), - wasmBin.size(), - sizeof(std::remove_reference_t::value_type), - nullptr}; + wasm_byte_vec_t const code{wasmBin.size(), (char*)(wasmBin.data())}; ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); if (!m) throw std::runtime_error("can't create module"); @@ -329,14 +205,12 @@ ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) } ModuleWrapper::ModuleWrapper() - : module_(nullptr, &wasm_module_delete) - , exportTypes_{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete), exportTypes_{0, nullptr} { } ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) - : module_(nullptr, &wasm_module_delete) - , exportTypes_{0, nullptr, 0, 0, nullptr} + : module_(nullptr, &wasm_module_delete), exportTypes_{0, nullptr} { *this = std::move(o); } @@ -345,19 +219,15 @@ ModuleWrapper::ModuleWrapper( wasm_store_t* s, Bytes const& wasmBin, bool instantiate, - int32_t maxPages, - int64_t gas, std::vector const& imports, beast::Journal j) - : module_(init(s, wasmBin, j)) - , exportTypes_{0, nullptr, 0, 0, nullptr} - , j_(j) + : store_(s), module_(init(s, wasmBin, j)), exportTypes_{0, nullptr}, j_(j) { wasm_module_exports(module_.get(), &exportTypes_); if (instantiate) { auto wimports = buildImports(s, imports); - addInstance(s, maxPages, gas, wimports); + addInstance(s, wimports); wasm_extern_vec_delete(&wimports); } } @@ -374,12 +244,14 @@ ModuleWrapper::operator=(ModuleWrapper&& o) if (this == &o) return *this; + store_ = o.store_; + o.store_ = nullptr; module_ = std::move(o.module_); instanceWrap_ = std::move(o.instanceWrap_); if (exportTypes_.size) wasm_exporttype_vec_delete(&exportTypes_); exportTypes_ = o.exportTypes_; - o.exportTypes_ = {0, nullptr, 0, 0, nullptr}; + o.exportTypes_ = {0, nullptr}; j_ = o.j_; return *this; @@ -398,7 +270,6 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) if (paramSize) { wasm_valtype_vec_new_uninitialized(&v, paramSize); - v.num_elems = paramSize; } else v = WASM_EMPTY_VEC; @@ -425,7 +296,6 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) if (imp.result) { wasm_valtype_vec_new_uninitialized(&v, 1); - v.num_elems = 1; switch (*imp.result) { case WT_I32: @@ -454,29 +324,26 @@ ModuleWrapper::buildImports( itDeleter(&importTypes, &wasm_importtype_vec_delete); wasm_extern_vec_t wimports = WASM_EMPTY_VEC; - if (!importTypes.num_elems) + if (!importTypes.size) return wimports; wasm_extern_vec_new_uninitialized(&wimports, importTypes.size); - wimports.num_elems = importTypes.num_elems; unsigned impCnt = 0; - for (unsigned i = 0; i < importTypes.num_elems; ++i) + for (unsigned i = 0; i < importTypes.size; ++i) { wasm_importtype_t const* importtype = importTypes.data[i]; - if (wasm_importtype_is_linked(importtype)) - { - // create a placeholder - wimports.data[i] = wasm_extern_new_empty( - s, wasm_externtype_kind(wasm_importtype_type(importtype))); - ++impCnt; - continue; - } // wasm_name_t const* mn = wasm_importtype_module(importtype); - // auto modName = std::string_view(mn->data, mn->num_elems - 1); + // auto modName = std::string_view(mn->data, mn->num_elems); wasm_name_t const* fn = wasm_importtype_name(importtype); - auto fieldName = std::string_view(fn->data, fn->num_elems - 1); + auto fieldName = std::string_view(fn->data, fn->size); + + wasm_externkind_t const itype = + wasm_externtype_kind(wasm_importtype_type(importtype)); + if ((itype) != WASM_EXTERN_FUNC) + throw std::runtime_error( + "Invalid import type " + std::to_string(itype)); // for multi-module support // if ((W_ENV != modName) && (W_HOST_LIB != modName)) @@ -511,13 +378,13 @@ ModuleWrapper::buildImports( // LCOV_EXCL_STOP } - if (imp.gas && !wasm_func_set_gas(func, imp.gas)) - { - // LCOV_EXCL_START - throw std::runtime_error( - "can't set gas for import function " + imp.name); - // LCOV_EXCL_STOP - } + // if (imp.gas && !wasm_func_set_gas(func, imp.gas)) + // { + // // LCOV_EXCL_START + // throw std::runtime_error( + // "can't set gas for import function " + imp.name); + // // LCOV_EXCL_STOP + // } wimports.data[i] = wasm_func_as_extern(func); ++impCnt; @@ -535,11 +402,11 @@ ModuleWrapper::buildImports( } } - if (impCnt != importTypes.num_elems) + if (impCnt != importTypes.size) { print_wasm_error( std::string("Imports not finished: ") + std::to_string(impCnt) + - "/" + std::to_string(importTypes.num_elems), + "/" + std::to_string(importTypes.size), nullptr, j_); } @@ -566,13 +433,9 @@ ModuleWrapper::getInstance(int) const } int -ModuleWrapper::addInstance( - wasm_store_t* s, - int32_t maxPages, - int64_t gas, - wasm_extern_vec_t const& imports) +ModuleWrapper::addInstance(wasm_store_t* s, wasm_extern_vec_t const& imports) { - instanceWrap_ = {s, module_.get(), maxPages, gas, imports, j_}; + instanceWrap_ = {s, module_.get(), imports, j_}; return 0; } @@ -589,30 +452,43 @@ ModuleWrapper::addInstance( std::int64_t ModuleWrapper::getGas() { - return instanceWrap_.getGas(); + if (!store_) + return 0; + std::uint64_t gas = 0; + wasm_store_get_fuel(store_, &gas); + return static_cast(gas); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // void -// WamrEngine::clearModules() +// WasmiEngine::clearModules() // { // modules.clear(); // store.reset(); // to free the memory before creating new store // store = {wasm_store_new(engine.get()), &wasm_store_delete}; // } -WamrEngine::WamrEngine() - : engine_(wasm_engine_new(), &wasm_engine_delete) - , store_(nullptr, &wasm_store_delete) +std::unique_ptr +WasmiEngine::init() +{ + wasm_config_t* config = wasm_config_new(); + if (!config) + return std::unique_ptr{ + nullptr, &wasm_engine_delete}; + wasmi_config_consume_fuel_set(config, true); + + return std::unique_ptr( + wasm_engine_new_with_config(config), &wasm_engine_delete); +} + +WasmiEngine::WasmiEngine() + : engine_(init()), store_(nullptr, &wasm_store_delete) { - wasm_runtime_set_default_running_mode(Mode_Interp); - wasm_runtime_set_log_level(WASM_LOG_LEVEL_FATAL); - // wasm_runtime_set_log_level(WASM_LOG_LEVEL_VERBOSE); } int -WamrEngine::addModule( +WasmiEngine::addModule( Bytes const& wasmCode, bool instantiate, int64_t gas, @@ -621,8 +497,19 @@ WamrEngine::addModule( moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store store_ = {wasm_store_new(engine_.get()), &wasm_store_delete}; + + if (gas < 0) + gas = std::numeric_limits::max(); + wasmi_error_t* err = + wasm_store_set_fuel(store_.get(), static_cast(gas)); + if (err) + { + print_wasm_error("Error setting gas", nullptr, j_); + throw std::runtime_error("can't set gas"); + } + moduleWrap_ = std::make_unique( - store_.get(), wasmCode, instantiate, defMaxPages_, gas, imports, j_); + store_.get(), wasmCode, instantiate, imports, j_); if (!moduleWrap_) throw std::runtime_error("can't create module wrapper"); @@ -631,19 +518,19 @@ WamrEngine::addModule( } // int -// WamrEngine::addInstance() +// WasmiEngine::addInstance() // { -// return module->addInstance(store.get(), defMaxPages); +// return module->addInstance(store.get()); // } FuncInfo -WamrEngine::getFunc(std::string_view funcName) +WasmiEngine::getFunc(std::string_view funcName) { return moduleWrap_->getFunc(funcName); } std::vector -WamrEngine::convertParams(std::vector const& params) +WasmiEngine::convertParams(std::vector const& params) { std::vector v; v.reserve(params.size()); @@ -678,14 +565,14 @@ WamrEngine::convertParams(std::vector const& params) } int -WamrEngine::compareParamTypes( +WasmiEngine::compareParamTypes( wasm_valtype_vec_t const* ftp, std::vector const& p) { - if (ftp->num_elems != p.size()) - return std::min(ftp->num_elems, p.size()); + if (ftp->size != p.size()) + return std::min(ftp->size, p.size()); - for (unsigned i = 0; i < ftp->num_elems; ++i) + for (unsigned i = 0; i < ftp->size; ++i) { auto const t1 = wasm_valtype_kind(ftp->data[i]); auto const t2 = p[i].kind; @@ -697,7 +584,7 @@ WamrEngine::compareParamTypes( } void -WamrEngine::add_param(std::vector& in, int32_t p) +WasmiEngine::add_param(std::vector& in, int32_t p) { in.emplace_back(); auto& el(in.back()); @@ -706,7 +593,7 @@ WamrEngine::add_param(std::vector& in, int32_t p) } void -WamrEngine::add_param(std::vector& in, int64_t p) +WasmiEngine::add_param(std::vector& in, int64_t p) { in.emplace_back(); auto& el(in.back()); @@ -714,8 +601,8 @@ WamrEngine::add_param(std::vector& in, int64_t p) } template -WamrResult -WamrEngine::call(std::string_view func, Types&&... args) +WasmiResult +WasmiEngine::call(std::string_view func, Types&&... args) { // Lookup our export function auto f = getFunc(func); @@ -723,8 +610,8 @@ WamrEngine::call(std::string_view func, Types&&... args) } template -WamrResult -WamrEngine::call(FuncInfo const& f, Types&&... args) +WasmiResult +WasmiEngine::call(FuncInfo const& f, Types&&... args) { std::vector in; return call(f, in, std::forward(args)...); @@ -743,22 +630,17 @@ usecs() #endif template -WamrResult -WamrEngine::call(FuncInfo const& f, std::vector& in) +WasmiResult +WasmiEngine::call(FuncInfo const& f, std::vector& in) { // wasm_val_t rs[1] = {WASM_I32_VAL(0)}; - WamrResult ret(NR); + WasmiResult ret(NR); // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC - : wasm_val_vec_t{ - in.size(), - in.data(), - in.size(), - sizeof(std::remove_reference_t::value_type), - nullptr}; + : wasm_val_vec_t{in.size(), in.data()}; #ifdef SHOW_CALL_TIME auto const start = usecs(); @@ -785,8 +667,8 @@ WamrEngine::call(FuncInfo const& f, std::vector& in) } template -WamrResult -WamrEngine::call( +WasmiResult +WasmiEngine::call( FuncInfo const& f, std::vector& in, std::int32_t p, @@ -797,8 +679,8 @@ WamrEngine::call( } template -WamrResult -WamrEngine::call( +WasmiResult +WasmiEngine::call( FuncInfo const& f, std::vector& in, std::int64_t p, @@ -809,8 +691,8 @@ WamrEngine::call( } template -WamrResult -WamrEngine::call( +WasmiResult +WasmiEngine::call( FuncInfo const& f, std::vector& in, uint8_t const* d, @@ -827,8 +709,8 @@ WamrEngine::call( } template -WamrResult -WamrEngine::call( +WasmiResult +WasmiEngine::call( FuncInfo const& f, std::vector& in, Bytes const& p, @@ -838,7 +720,7 @@ WamrEngine::call( } Expected, TER> -WamrEngine::run( +WasmiEngine::run( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, @@ -848,8 +730,6 @@ WamrEngine::run( beast::Journal j) { j_ = j; - wasm_runtime_set_log_level( - std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); try { return runHlp(wasmCode, funcName, params, imports, hfs, gas); @@ -866,7 +746,7 @@ WamrEngine::run( } Expected, TER> -WamrEngine::runHlp( +WasmiEngine::runHlp( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, @@ -893,7 +773,7 @@ WamrEngine::runHlp( auto const f = getFunc(!funcName.empty() ? funcName : "_start"); auto const* ftp = wasm_functype_params(f.second); - // not const because passed directly to wamr function (which accept non + // not const because passed directly to VM function (which accept non // const) auto p = convertParams(params); @@ -905,7 +785,7 @@ WamrEngine::runHlp( if (res.f) throw std::runtime_error("<" + std::string(funcName) + "> failure"); - else if (!res.r.num_elems) + else if (!res.r.size) throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); @@ -920,13 +800,13 @@ WamrEngine::runHlp( // #else // auto j = j_.debug(); // #endif - // j << "WAMR Res: " << ret.result << " cost: " << ret.cost << std::endl; + // j << "WASMI Res: " << ret.result << " cost: " << ret.cost << std::endl; return ret; } NotTEC -WamrEngine::check( +WasmiEngine::check( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, @@ -934,8 +814,7 @@ WamrEngine::check( beast::Journal j) { j_ = j; - wasm_runtime_set_log_level( - std::min(getLogLevel(j_.sink().threshold()), WASM_LOG_LEVEL_ERROR)); + try { return checkHlp(wasmCode, funcName, params, imports); @@ -953,7 +832,7 @@ WamrEngine::check( } NotTEC -WamrEngine::checkHlp( +WasmiEngine::checkHlp( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, @@ -982,27 +861,20 @@ WamrEngine::checkHlp( return tesSUCCESS; } -std::int32_t -WamrEngine::initMaxPages(std::int32_t def) -{ - defMaxPages_ = def; - return def; -} - std::int64_t -WamrEngine::getGas() +WasmiEngine::getGas() { return moduleWrap_ ? moduleWrap_->getGas() : 0; } wmem -WamrEngine::getMem() const +WasmiEngine::getMem() const { return moduleWrap_ ? moduleWrap_->getMem() : wmem(); } InstanceWrapper const& -WamrEngine::getRT(int m, int i) +WasmiEngine::getRT(int m, int i) { if (!moduleWrap_) throw std::runtime_error("no module"); @@ -1010,11 +882,11 @@ WamrEngine::getRT(int m, int i) } int32_t -WamrEngine::allocate(int32_t sz) +WasmiEngine::allocate(int32_t sz) { auto res = call<1>(W_ALLOC, static_cast(sz)); - if (res.f || !res.r.num_elems || (res.r.data[0].kind != WASM_I32) || + if (res.f || !res.r.size || (res.r.data[0].kind != WASM_I32) || !res.r.data[0].of.i32) throw std::runtime_error( "can't allocate memory, " + std::to_string(sz) + " bytes"); @@ -1022,7 +894,7 @@ WamrEngine::allocate(int32_t sz) } wasm_trap_t* -WamrEngine::newTrap(std::string_view txt) +WasmiEngine::newTrap(std::string_view txt) { wasm_message_t msg = WASM_EMPTY_VEC; @@ -1033,7 +905,7 @@ WamrEngine::newTrap(std::string_view txt) } beast::Journal -WamrEngine::getJournal() const +WasmiEngine::getJournal() const { return j_; } From 16087c96802a589ec37153c286dc30a328186835 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 02:57:47 +0530 Subject: [PATCH 114/212] fix merge issue --- cmake/XrplCore.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cmake/XrplCore.cmake b/cmake/XrplCore.cmake index b3bc47790b7..7837a8f3eea 100644 --- a/cmake/XrplCore.cmake +++ b/cmake/XrplCore.cmake @@ -69,11 +69,6 @@ target_link_libraries(xrpl.imports.main $<$:antithesis-sdk-cpp> ) -if (WIN32) - target_link_libraries(xrpl.imports.main INTERFACE ntdll) -endif() - - include(add_module) include(target_link_modules) From c33b0ae4638668d711c76e7a247795b48d028d2f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 02:58:57 +0530 Subject: [PATCH 115/212] fix build issue --- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index e61d39f9aaf..a0b81a2df37 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -424,7 +424,7 @@ WasmHostFunctionsImpl::checkSignature( return Unexpected(HostFunctionError::INVALID_PARAMS); PublicKey const pk(pubkey); - return verify(pk, message, signature, /*canonical*/ true); + return verify(pk, message, signature); } Expected From 53eb0f60bc3bbc5b9456e043a1ff26b74a941ebe Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 03:10:58 +0530 Subject: [PATCH 116/212] fix another build issue --- src/test/app/TestHostFunctions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 4445f1ae730..fe0cc6f289c 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -1060,7 +1060,7 @@ struct PerfHostFunctions : public TestHostFunctions return Unexpected(HostFunctionError::INVALID_PARAMS); PublicKey const pk(pubkey); - return verify(pk, message, signature, /*canonical*/ true); + return verify(pk, message, signature); } Expected From 500bb68831e0b050f34bee8b909ae9e0a7ce11cf Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:56:23 -0500 Subject: [PATCH 117/212] Fix win build (#6076) --- .../wasmi/patches/0001-xrplf-0.42.1.patch | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/external/wasmi/patches/0001-xrplf-0.42.1.patch b/external/wasmi/patches/0001-xrplf-0.42.1.patch index 656c5aff65f..cecab3f8c2f 100644 --- a/external/wasmi/patches/0001-xrplf-0.42.1.patch +++ b/external/wasmi/patches/0001-xrplf-0.42.1.patch @@ -1,8 +1,17 @@ diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt -index b15c787a..4e6de690 100644 +index b15c787a..54eaed2d 100644 --- a/crates/c_api/CMakeLists.txt +++ b/crates/c_api/CMakeLists.txt -@@ -43,6 +43,10 @@ endif() +@@ -6,6 +6,8 @@ option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) + option(WASMI_ALWAYS_BUILD "If cmake should always invoke cargo to build Wasmi" ON) + set(WASMI_TARGET "" CACHE STRING "Rust target to build for") + ++add_compile_definitions(COMPILING_WASM_RUNTIME_API=1) ++ + if(NOT WASMI_TARGET) + execute_process( + COMMAND rustc -vV +@@ -43,6 +45,10 @@ endif() list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) @@ -13,7 +22,15 @@ index b15c787a..4e6de690 100644 # Instructions on how to build and install the Wasmi Rust crate. find_program(WASMI_CARGO_BINARY cargo REQUIRED) include(ExternalProject) -@@ -112,6 +116,7 @@ install( +@@ -79,7 +85,6 @@ else() + target_link_libraries(wasmi INTERFACE ${WASMI_STATIC_FILES}) + + if(WASMI_TARGET MATCHES "windows") +- target_compile_options(wasmi INTERFACE -DWASM_API_EXTERN= -DWASI_API_EXTERN=) + target_link_libraries(wasmi INTERFACE ws2_32 advapi32 userenv ntdll shell32 ole32 bcrypt) + elseif(NOT WASMI_TARGET MATCHES "darwin") + target_link_libraries(wasmi INTERFACE pthread dl m) +@@ -112,6 +117,7 @@ install( DESTINATION ${CMAKE_INSTALL_LIBDIR} ) @@ -21,7 +38,7 @@ index b15c787a..4e6de690 100644 if(WASMI_TARGET MATCHES "darwin") set(INSTALLED_LIB "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libwasmi.dylib") install( -@@ -131,6 +136,7 @@ if(WASMI_TARGET MATCHES "darwin") +@@ -131,6 +137,7 @@ if(WASMI_TARGET MATCHES "darwin") install(CODE "execute_process(COMMAND ${install_name_tool_cmd})") endif() endif() @@ -29,7 +46,7 @@ index b15c787a..4e6de690 100644 # Documentation Generation via Doxygen: set(DOXYGEN_CONF_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf.in) -@@ -141,19 +147,3 @@ add_custom_target(doc +@@ -141,19 +148,3 @@ add_custom_target(doc DEPENDS ${WASMI_GENERATED_CONF_H} ${DOXYGEN_CONF_OUT} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) @@ -50,10 +67,29 @@ index b15c787a..4e6de690 100644 - COMMENT "clang-format: Apply formatting rules for Wasmi C-API header files" -) diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h -index 5ee617ff..0199192d 100644 +index 5ee617ff..37809a6f 100644 --- a/crates/c_api/include/wasm.h +++ b/crates/c_api/include/wasm.h -@@ -146,6 +146,13 @@ WASM_DECLARE_OWN(store) +@@ -13,11 +13,17 @@ + #include + + #ifndef WASM_API_EXTERN +-#if defined(_WIN32) && !defined(__MINGW32__) && !defined(LIBWASM_STATIC) ++#if defined(_MSC_BUILD) ++#if defined(COMPILING_WASM_RUNTIME_API) ++#define WASM_API_EXTERN __declspec(dllexport) ++#elif defined(_DLL) + #define WASM_API_EXTERN __declspec(dllimport) + #else + #define WASM_API_EXTERN + #endif ++#else ++#define WASM_API_EXTERN ++#endif + #endif + + #ifdef __cplusplus +@@ -146,6 +152,13 @@ WASM_DECLARE_OWN(store) WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); From 8f2f8d53b42fe76fd1ece54c84af9784ef82bb97 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 03:32:01 +0530 Subject: [PATCH 118/212] update gas amounts for wasmi --- src/test/app/EscrowSmart_test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 3bff14f9e1f..3dc97437fd0 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -390,7 +390,7 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 66; + std::uint32_t const allowance = 5; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto [createFee, finishFee] = [&]() { Env env(*this, features); @@ -683,7 +683,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { env.require(balance(alice, XRP(4000) - txnFees)); - auto const allowance = 1'015; + auto const allowance = 14; XRPAmount const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + @@ -778,7 +778,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 38'562, + txMeta->getFieldU32(sfGasUsed) == 794, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); @@ -863,7 +863,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 137'704; + auto const allowance = 2'985; auto const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + From dba187f8c587227833181770028783816c1223bb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 03:41:18 +0530 Subject: [PATCH 119/212] fix build issues --- src/xrpld/app/tx/detail/Escrow.cpp | 564 ++++++++++++++--------------- 1 file changed, 276 insertions(+), 288 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 025dc81f6ff..5dd7b486c3d 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -17,7 +17,6 @@ #include #include -#include namespace ripple { // During an EscrowFinish, the transaction must specify both @@ -1185,17 +1184,6 @@ EscrowFinish::doApply() return tecCRYPTOCONDITION_ERROR; } - // NOTE: Escrow payments cannot be used to fund accounts. - AccountID const destID = (*slep)[sfDestination]; - auto const sled = ctx_.view().peek(keylet::account(destID)); - if (!sled) - return tecNO_DST; - - if (auto err = verifyDepositPreauth( - ctx_.tx, ctx_.view(), account_, destID, sled, ctx_.journal); - !isTesSuccess(err)) - return err; - if (!ctx_.view().rules().enabled(featureSmartEscrow)) { // NOTE: Escrow payments cannot be used to fund accounts. @@ -1206,80 +1194,125 @@ EscrowFinish::doApply() ctx_.tx, ctx_.view(), account_, destID, sled, ctx_.journal); !isTesSuccess(err)) return err; + } - // Execute custom release function - if ((*slep)[~sfFinishFunction]) - { - JLOG(j_.trace()) - << "The escrow has a finish function, running WASM code..."; - // WASM execution - auto const wasmStr = slep->getFieldVL(sfFinishFunction); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + // Execute custom release function + if ((*slep)[~sfFinishFunction]) + { + JLOG(j_.trace()) + << "The escrow has a finish function, running WASM code..."; + // WASM execution + auto const wasmStr = slep->getFieldVL(sfFinishFunction); + std::vector wasm(wasmStr.begin(), wasmStr.end()); - WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); + WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); - if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) - { - // already checked above, this check is just in case - return tecINTERNAL; - } - std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = runEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); - JLOG(j_.trace()) << "Escrow WASM ran"; + if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) + { + // already checked above, this check is just in case + return tecINTERNAL; + } + std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm( + wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); + JLOG(j_.trace()) << "Escrow WASM ran"; - if (auto const& data = ledgerDataProvider.getData(); - data.has_value()) - { - slep->setFieldVL(sfData, makeSlice(*data)); - ctx_.view().update(slep); - } + if (auto const& data = ledgerDataProvider.getData(); data.has_value()) + { + slep->setFieldVL(sfData, makeSlice(*data)); + ctx_.view().update(slep); + } - if (re.has_value()) - { - auto reValue = re.value().result; - auto reCost = re.value().cost; - JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) - << ", cost: " << reCost; + if (re.has_value()) + { + auto reValue = re.value().result; + auto reCost = re.value().cost; + JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) + << ", cost: " << reCost; - ctx_.setWasmReturnCode(reValue); + ctx_.setWasmReturnCode(reValue); - if (reCost < 0 || reCost > std::numeric_limits::max()) - return tecINTERNAL; // LCOV_EXCL_LINE - ctx_.setGasUsed(static_cast(reCost)); + if (reCost < 0 || reCost > std::numeric_limits::max()) + return tecINTERNAL; // LCOV_EXCL_LINE + ctx_.setGasUsed(static_cast(reCost)); - if (reValue <= 0) - { - return tecWASM_REJECTED; - } - } - else + if (reValue <= 0) { - JLOG(j_.debug()) << "WASM Failure: " + transHuman(re.error()); - return re.error(); + return tecWASM_REJECTED; } } + else + { + JLOG(j_.debug()) << "WASM Failure: " + transHuman(re.error()); + return re.error(); + } + } - AccountID const account = (*slep)[sfAccount]; + AccountID const account = (*slep)[sfAccount]; - // Remove escrow from owner directory + // Remove escrow from owner directory + { + auto const page = (*slep)[sfOwnerNode]; + if (!ctx_.view().dirRemove( + keylet::ownerDir(account), page, k.key, true)) { - auto const page = (*slep)[sfOwnerNode]; - if (!ctx_.view().dirRemove( - keylet::ownerDir(account), page, k.key, true)) - { - // LCOV_EXCL_START - JLOG(j_.fatal()) << "Unable to delete Escrow from owner."; - return tefBAD_LEDGER; - // LCOV_EXCL_STOP - } + // LCOV_EXCL_START + JLOG(j_.fatal()) << "Unable to delete Escrow from owner."; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP } + } - // Remove escrow from recipient's owner directory, if present. - if (auto const optPage = (*slep)[~sfDestinationNode]) + // Remove escrow from recipient's owner directory, if present. + if (auto const optPage = (*slep)[~sfDestinationNode]) + { + if (!ctx_.view().dirRemove( + keylet::ownerDir(destID), *optPage, k.key, true)) + { + // LCOV_EXCL_START + JLOG(j_.fatal()) << "Unable to delete Escrow from recipient."; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP + } + } + + STAmount const amount = slep->getFieldAmount(sfAmount); + // Transfer amount to destination + if (isXRP(amount)) + (*sled)[sfBalance] = (*sled)[sfBalance] + amount; + else + { + if (!ctx_.view().rules().enabled(featureTokenEscrow)) + return temDISABLED; // LCOV_EXCL_LINE + + Rate lockedRate = slep->isFieldPresent(sfTransferRate) + ? ripple::Rate(slep->getFieldU32(sfTransferRate)) + : parityRate; + auto const issuer = amount.getIssuer(); + bool const createAsset = destID == account_; + if (auto const ret = std::visit( + [&](T const&) { + return escrowUnlockApplyHelper( + ctx_.view(), + lockedRate, + sled, + mPriorBalance, + amount, + issuer, + account, + destID, + createAsset, + j_); + }, + amount.asset().value()); + !isTesSuccess(ret)) + return ret; + + // Remove escrow from issuers owner directory, if present. + if (auto const optPage = (*slep)[~sfIssuerNode]; optPage) { if (!ctx_.view().dirRemove( - keylet::ownerDir(destID), *optPage, k.key, true)) + keylet::ownerDir(issuer), *optPage, k.key, true)) { // LCOV_EXCL_START JLOG(j_.fatal()) << "Unable to delete Escrow from recipient."; @@ -1287,205 +1320,206 @@ EscrowFinish::doApply() // LCOV_EXCL_STOP } } + } - STAmount const amount = slep->getFieldAmount(sfAmount); - // Transfer amount to destination - if (isXRP(amount)) - (*sled)[sfBalance] = (*sled)[sfBalance] + amount; - else - { - if (!ctx_.view().rules().enabled(featureTokenEscrow)) - return temDISABLED; // LCOV_EXCL_LINE - - Rate lockedRate = slep->isFieldPresent(sfTransferRate) - ? ripple::Rate(slep->getFieldU32(sfTransferRate)) - : parityRate; - auto const issuer = amount.getIssuer(); - bool const createAsset = destID == account_; - if (auto const ret = std::visit( - [&](T const&) { - return escrowUnlockApplyHelper( - ctx_.view(), - lockedRate, - sled, - mPriorBalance, - amount, - issuer, - account, - destID, - createAsset, - j_); - }, - amount.asset().value()); - !isTesSuccess(ret)) - return ret; + ctx_.view().update(sled); - // Remove escrow from issuers owner directory, if present. - if (auto const optPage = (*slep)[~sfIssuerNode]; optPage) - { - if (!ctx_.view().dirRemove( - keylet::ownerDir(issuer), *optPage, k.key, true)) - { - // LCOV_EXCL_START - JLOG(j_.fatal()) - << "Unable to delete Escrow from recipient."; - return tefBAD_LEDGER; - // LCOV_EXCL_STOP - } - } - } + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); - ctx_.view().update(sled); + // Adjust source owner count + auto const sle = ctx_.view().peek(keylet::account(account)); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); + ctx_.view().update(sle); - auto const reserveToSubtract = - calculateAdditionalReserve((*slep)[~sfFinishFunction]); + // Remove escrow from ledger + ctx_.view().erase(slep); + return tesSUCCESS; +} - // Adjust source owner count - auto const sle = ctx_.view().peek(keylet::account(account)); - adjustOwnerCount( - ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); - ctx_.view().update(sle); +//------------------------------------------------------------------------------ - // Remove escrow from ledger - ctx_.view().erase(slep); - return tesSUCCESS; - } +NotTEC +EscrowCancel::preflight(PreflightContext const& ctx) +{ + return tesSUCCESS; +} - //------------------------------------------------------------------------------ +template +static TER +escrowCancelPreclaimHelper( + PreclaimContext const& ctx, + AccountID const& account, + STAmount const& amount); - NotTEC EscrowCancel::preflight(PreflightContext const& ctx) - { - return tesSUCCESS; - } +template <> +TER +escrowCancelPreclaimHelper( + PreclaimContext const& ctx, + AccountID const& account, + STAmount const& amount) +{ + AccountID issuer = amount.getIssuer(); + // If the issuer is the same as the account, return tecINTERNAL + if (issuer == account) + return tecINTERNAL; // LCOV_EXCL_LINE + + // If the issuer has requireAuth set, check if the account is authorized + if (auto const ter = requireAuth(ctx.view, amount.issue(), account); + ter != tesSUCCESS) + return ter; + + return tesSUCCESS; +} + +template <> +TER +escrowCancelPreclaimHelper( + PreclaimContext const& ctx, + AccountID const& account, + STAmount const& amount) +{ + AccountID issuer = amount.getIssuer(); + // If the issuer is the same as the account, return tecINTERNAL + if (issuer == account) + return tecINTERNAL; // LCOV_EXCL_LINE + + // If the mpt does not exist, return tecOBJECT_NOT_FOUND + auto const issuanceKey = + keylet::mptIssuance(amount.get().getMptID()); + auto const sleIssuance = ctx.view.read(issuanceKey); + if (!sleIssuance) + return tecOBJECT_NOT_FOUND; + + // If the issuer has requireAuth set, check if the account is + // authorized + auto const& mptIssue = amount.get(); + if (auto const ter = + requireAuth(ctx.view, mptIssue, account, AuthType::WeakAuth); + ter != tesSUCCESS) + return ter; + + return tesSUCCESS; +} - template - static TER escrowCancelPreclaimHelper( - PreclaimContext const& ctx, - AccountID const& account, - STAmount const& amount); - - template <> - TER escrowCancelPreclaimHelper( - PreclaimContext const& ctx, - AccountID const& account, - STAmount const& amount) +TER +EscrowCancel::preclaim(PreclaimContext const& ctx) +{ + if (ctx.view.rules().enabled(featureTokenEscrow)) { - AccountID issuer = amount.getIssuer(); - // If the issuer is the same as the account, return tecINTERNAL - if (issuer == account) - return tecINTERNAL; // LCOV_EXCL_LINE + auto const k = keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); + auto const slep = ctx.view.read(k); + if (!slep) + return tecNO_TARGET; - // If the issuer has requireAuth set, check if the account is authorized - if (auto const ter = requireAuth(ctx.view, amount.issue(), account); - ter != tesSUCCESS) - return ter; + AccountID const account = (*slep)[sfAccount]; + STAmount const amount = (*slep)[sfAmount]; - return tesSUCCESS; + if (!isXRP(amount)) + { + if (auto const ret = std::visit( + [&](T const&) { + return escrowCancelPreclaimHelper( + ctx, account, amount); + }, + amount.asset().value()); + !isTesSuccess(ret)) + return ret; + } } + return tesSUCCESS; +} - template <> - TER escrowCancelPreclaimHelper( - PreclaimContext const& ctx, - AccountID const& account, - STAmount const& amount) +TER +EscrowCancel::doApply() +{ + auto const k = keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); + auto const slep = ctx_.view().peek(k); + if (!slep) { - AccountID issuer = amount.getIssuer(); - // If the issuer is the same as the account, return tecINTERNAL - if (issuer == account) + if (ctx_.view().rules().enabled(featureTokenEscrow)) return tecINTERNAL; // LCOV_EXCL_LINE - // If the mpt does not exist, return tecOBJECT_NOT_FOUND - auto const issuanceKey = - keylet::mptIssuance(amount.get().getMptID()); - auto const sleIssuance = ctx.view.read(issuanceKey); - if (!sleIssuance) - return tecOBJECT_NOT_FOUND; + return tecNO_TARGET; + } - // If the issuer has requireAuth set, check if the account is - // authorized - auto const& mptIssue = amount.get(); - if (auto const ter = - requireAuth(ctx.view, mptIssue, account, AuthType::WeakAuth); - ter != tesSUCCESS) - return ter; + auto const now = ctx_.view().info().parentCloseTime; - return tesSUCCESS; - } + // No cancel time specified: can't execute at all. + if (!(*slep)[~sfCancelAfter]) + return tecNO_PERMISSION; - TER EscrowCancel::preclaim(PreclaimContext const& ctx) - { - if (ctx.view.rules().enabled(featureTokenEscrow)) - { - auto const k = - keylet::escrow(ctx.tx[sfOwner], ctx.tx[sfOfferSequence]); - auto const slep = ctx.view.read(k); - if (!slep) - return tecNO_TARGET; + // Too soon: can't execute before the cancel time. + if (!after(now, (*slep)[sfCancelAfter])) + return tecNO_PERMISSION; - AccountID const account = (*slep)[sfAccount]; - STAmount const amount = (*slep)[sfAmount]; + AccountID const account = (*slep)[sfAccount]; - if (!isXRP(amount)) - { - if (auto const ret = std::visit( - [&](T const&) { - return escrowCancelPreclaimHelper( - ctx, account, amount); - }, - amount.asset().value()); - !isTesSuccess(ret)) - return ret; - } + // Remove escrow from owner directory + { + auto const page = (*slep)[sfOwnerNode]; + if (!ctx_.view().dirRemove( + keylet::ownerDir(account), page, k.key, true)) + { + // LCOV_EXCL_START + JLOG(j_.fatal()) << "Unable to delete Escrow from owner."; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP } - return tesSUCCESS; } - TER EscrowCancel::doApply() + // Remove escrow from recipient's owner directory, if present. + if (auto const optPage = (*slep)[~sfDestinationNode]; optPage) { - auto const k = - keylet::escrow(ctx_.tx[sfOwner], ctx_.tx[sfOfferSequence]); - auto const slep = ctx_.view().peek(k); - if (!slep) + if (!ctx_.view().dirRemove( + keylet::ownerDir((*slep)[sfDestination]), + *optPage, + k.key, + true)) { - if (ctx_.view().rules().enabled(featureTokenEscrow)) - return tecINTERNAL; // LCOV_EXCL_LINE - - return tecNO_TARGET; + // LCOV_EXCL_START + JLOG(j_.fatal()) << "Unable to delete Escrow from recipient."; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP } + } - auto const now = ctx_.view().info().parentCloseTime; - - // No cancel time specified: can't execute at all. - if (!(*slep)[~sfCancelAfter]) - return tecNO_PERMISSION; - - // Too soon: can't execute before the cancel time. - if (!after(now, (*slep)[sfCancelAfter])) - return tecNO_PERMISSION; + auto const sle = ctx_.view().peek(keylet::account(account)); + STAmount const amount = slep->getFieldAmount(sfAmount); - AccountID const account = (*slep)[sfAccount]; + // Transfer amount back to the owner + if (isXRP(amount)) + (*sle)[sfBalance] = (*sle)[sfBalance] + amount; + else + { + if (!ctx_.view().rules().enabled(featureTokenEscrow)) + return temDISABLED; // LCOV_EXCL_LINE - // Remove escrow from owner directory - { - auto const page = (*slep)[sfOwnerNode]; - if (!ctx_.view().dirRemove( - keylet::ownerDir(account), page, k.key, true)) - { - // LCOV_EXCL_START - JLOG(j_.fatal()) << "Unable to delete Escrow from owner."; - return tefBAD_LEDGER; - // LCOV_EXCL_STOP - } - } + auto const issuer = amount.getIssuer(); + bool const createAsset = account == account_; + if (auto const ret = std::visit( + [&](T const&) { + return escrowUnlockApplyHelper( + ctx_.view(), + parityRate, + slep, + mPriorBalance, + amount, + issuer, + account, // sender and receiver are the same + account, + createAsset, + j_); + }, + amount.asset().value()); + !isTesSuccess(ret)) + return ret; // LCOV_EXCL_LINE - // Remove escrow from recipient's owner directory, if present. - if (auto const optPage = (*slep)[~sfDestinationNode]; optPage) + // Remove escrow from issuers owner directory, if present. + if (auto const optPage = (*slep)[~sfIssuerNode]; optPage) { if (!ctx_.view().dirRemove( - keylet::ownerDir((*slep)[sfDestination]), - *optPage, - k.key, - true)) + keylet::ownerDir(issuer), *optPage, k.key, true)) { // LCOV_EXCL_START JLOG(j_.fatal()) << "Unable to delete Escrow from recipient."; @@ -1493,63 +1527,17 @@ EscrowFinish::doApply() // LCOV_EXCL_STOP } } + } - auto const sle = ctx_.view().peek(keylet::account(account)); - STAmount const amount = slep->getFieldAmount(sfAmount); - - // Transfer amount back to the owner - if (isXRP(amount)) - (*sle)[sfBalance] = (*sle)[sfBalance] + amount; - else - { - if (!ctx_.view().rules().enabled(featureTokenEscrow)) - return temDISABLED; // LCOV_EXCL_LINE - - auto const issuer = amount.getIssuer(); - bool const createAsset = account == account_; - if (auto const ret = std::visit( - [&](T const&) { - return escrowUnlockApplyHelper( - ctx_.view(), - parityRate, - slep, - mPriorBalance, - amount, - issuer, - account, // sender and receiver are the same - account, - createAsset, - j_); - }, - amount.asset().value()); - !isTesSuccess(ret)) - return ret; // LCOV_EXCL_LINE - - // Remove escrow from issuers owner directory, if present. - if (auto const optPage = (*slep)[~sfIssuerNode]; optPage) - { - if (!ctx_.view().dirRemove( - keylet::ownerDir(issuer), *optPage, k.key, true)) - { - // LCOV_EXCL_START - JLOG(j_.fatal()) - << "Unable to delete Escrow from recipient."; - return tefBAD_LEDGER; - // LCOV_EXCL_STOP - } - } - } - - auto const reserveToSubtract = - calculateAdditionalReserve((*slep)[~sfFinishFunction]); - adjustOwnerCount( - ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); - ctx_.view().update(sle); + auto const reserveToSubtract = + calculateAdditionalReserve((*slep)[~sfFinishFunction]); + adjustOwnerCount(ctx_.view(), sle, -1 * reserveToSubtract, ctx_.journal); + ctx_.view().update(sle); - // Remove escrow from ledger - ctx_.view().erase(slep); + // Remove escrow from ledger + ctx_.view().erase(slep); - return tesSUCCESS; - } + return tesSUCCESS; +} } // namespace ripple From abfcc4ef678e8fab40398832f42a818ff1487b76 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 25 Nov 2025 04:17:42 +0530 Subject: [PATCH 120/212] fix tests --- src/test/app/EscrowSmart_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 3dc97437fd0..5bbae451b35 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -846,7 +846,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); BEAST_EXPECTS( - env.ownerCount(alice) == 16, + env.ownerCount(alice) == 17, std::to_string(env.ownerCount(alice))); if (BEAST_EXPECTS( env.seq(alice) == 20, std::to_string(env.seq(alice)))) @@ -881,7 +881,7 @@ struct EscrowSmart_test : public beast::unit_test::suite gasUsed == allowance, std::to_string(gasUsed)); } BEAST_EXPECTS( - env.ownerCount(alice) == 16, + env.ownerCount(alice) == 17, std::to_string(env.ownerCount(alice))); } } From 50e5608d8643e02f332f6a13c4feeee99e0511f7 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:21:52 -0500 Subject: [PATCH 121/212] wasmi HF cost --- external/wasmi/conandata.yml | 4 +- external/wasmi/conanfile.py | 7 +- .../wasmi/patches/0001-xrplf-0.42.1.patch | 6 +- src/test/app/TestHostFunctions.h | 47 ++- src/test/app/Wasm_test.cpp | 157 +++++++--- src/xrpld/app/wasm/HostFunc.h | 26 +- src/xrpld/app/wasm/HostFuncImpl.h | 10 +- src/xrpld/app/wasm/ParamsHelper.h | 10 +- src/xrpld/app/wasm/WasmVM.h | 21 +- src/xrpld/app/wasm/WasmiVM.h | 32 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 + src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 285 ++++++++++++++---- src/xrpld/app/wasm/detail/WasmVM.cpp | 43 ++- src/xrpld/app/wasm/detail/WasmiVM.cpp | 162 +++++++--- 14 files changed, 559 insertions(+), 253 deletions(-) diff --git a/external/wasmi/conandata.yml b/external/wasmi/conandata.yml index 032c12753c4..7bf94fff7f0 100644 --- a/external/wasmi/conandata.yml +++ b/external/wasmi/conandata.yml @@ -2,10 +2,10 @@ sources: "0.42.1": - sha256: 2a5697be33c7afce8f671af4a5a3621d9e93ce55d253d31bd8201458e465fbb8 url: https://github.com/wasmi-labs/wasmi/archive/refs/tags/v0.42.1.tar.gz + sha256: 2a5697be33c7afce8f671af4a5a3621d9e93ce55d253d31bd8201458e465fbb8 patches: "0.42.1": - patch_file: "patches/0001-xrplf-0.42.1.patch" + patch_description: Integrate wasmi lib into smart-escrow. patch_type: conan - patch_description: Integration patch. Make wasmi lib to be able to build with existing smart-escrow branch. diff --git a/external/wasmi/conanfile.py b/external/wasmi/conanfile.py index e245d62eb0a..6f72298558e 100644 --- a/external/wasmi/conanfile.py +++ b/external/wasmi/conanfile.py @@ -1,5 +1,5 @@ from conan import ConanFile, tools -from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout +from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout from conan.tools.files import apply_conandata_patches, export_conandata_patches, get import os @@ -30,9 +30,6 @@ def generate(self): tc.variables["BUILD_SHARED_LIBS"] = self.options.shared tc.generate() - deps = CMakeDeps(self) - deps.generate() - def build(self): cmake = CMake(self) cmake.configure(build_script_folder=os.path.join(self.source_folder, "crates", "c_api")) @@ -44,5 +41,3 @@ def package(self): def package_info(self): self.cpp_info.libs = ["wasmi"] - self.cpp_info.names["cmake_find_package"] = "wasmi" - self.cpp_info.names["cmake_find_package_multi"] = "wasmi" diff --git a/external/wasmi/patches/0001-xrplf-0.42.1.patch b/external/wasmi/patches/0001-xrplf-0.42.1.patch index cecab3f8c2f..0fbcb4408b3 100644 --- a/external/wasmi/patches/0001-xrplf-0.42.1.patch +++ b/external/wasmi/patches/0001-xrplf-0.42.1.patch @@ -67,7 +67,7 @@ index b15c787a..54eaed2d 100644 - COMMENT "clang-format: Apply formatting rules for Wasmi C-API header files" -) diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h -index 5ee617ff..37809a6f 100644 +index 5ee617ff..5c79bde3 100644 --- a/crates/c_api/include/wasm.h +++ b/crates/c_api/include/wasm.h @@ -13,11 +13,17 @@ @@ -89,7 +89,7 @@ index 5ee617ff..37809a6f 100644 #endif #ifdef __cplusplus -@@ -146,6 +152,13 @@ WASM_DECLARE_OWN(store) +@@ -146,6 +152,11 @@ WASM_DECLARE_OWN(store) WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); @@ -98,8 +98,6 @@ index 5ee617ff..37809a6f 100644 + +WASM_API_EXTERN struct wasmi_error* wasm_store_get_fuel(const wasm_store_t*, uint64_t* fuel); +WASM_API_EXTERN struct wasmi_error* wasm_store_set_fuel(wasm_store_t*, uint64_t fuel); -+//WASM_API_EXTERN void *wasm_store_get_data(const wasm_store_t*); -+//WASM_API_EXTERN void wasm_store_set_data(wasm_store_t*, void *data); /////////////////////////////////////////////////////////////////////////////// // Type Representations diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index fe0cc6f289c..128bfa446f9 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -15,11 +15,12 @@ namespace test { struct TestLedgerDataProvider : public HostFunctions { - jtx::Env* env_; + jtx::Env& env_; void const* rt_ = nullptr; public: - TestLedgerDataProvider(jtx::Env* env) : env_(env) + TestLedgerDataProvider(jtx::Env& env) + : HostFunctions(env.journal), env_(env) { } @@ -38,7 +39,7 @@ struct TestLedgerDataProvider : public HostFunctions Expected getLedgerSqn() override { - return env_->current()->seq(); + return env_.current()->seq(); } }; @@ -52,7 +53,7 @@ struct TestHostFunctions : public HostFunctions public: TestHostFunctions(test::jtx::Env& env, int cd = 0) - : env_(env), clock_drift_(cd) + : HostFunctions(env.journal), env_(env), clock_drift_(cd) { accountID_ = env_.master.id(); std::string t = "10000"; @@ -71,12 +72,6 @@ struct TestHostFunctions : public HostFunctions return rt_; } - beast::Journal - getJournal() override - { - return env_.journal; - } - Expected getLedgerSqn() override { @@ -395,7 +390,7 @@ struct TestHostFunctions : public HostFunctions #endif if (!asHex) { - j << "WAMR TRACE: " << msg << " " + j << "WASM TRACE: " << msg << " " << std::string_view( reinterpret_cast(data.data()), data.size()); } @@ -405,7 +400,7 @@ struct TestHostFunctions : public HostFunctions hex.reserve(data.size() * 2); boost::algorithm::hex( data.begin(), data.end(), std::back_inserter(hex)); - j << "WAMR DEV TRACE: " << msg << " " << hex; + j << "WASM DEV TRACE: " << msg << " " << hex; } #ifdef DEBUG_OUTPUT @@ -423,7 +418,7 @@ struct TestHostFunctions : public HostFunctions #else auto j = getJournal().trace(); #endif - j << "WAMR TRACE NUM: " << msg << " " << data; + j << "WASM TRACE NUM: " << msg << " " << data; #ifdef DEBUG_OUTPUT j << std::endl; @@ -435,7 +430,7 @@ struct TestHostFunctions : public HostFunctions traceAccount(std::string_view const& msg, AccountID const& account) override { #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else auto j = getJournal().trace(); #endif @@ -444,7 +439,7 @@ struct TestHostFunctions : public HostFunctions auto const accountStr = toBase58(account); - j << "WAMR TRACE ACCOUNT: " << msg << " " << accountStr; + j << "WASM TRACE ACCOUNT: " << msg << " " << accountStr; return msg.size() + accountStr.size(); } @@ -457,7 +452,7 @@ struct TestHostFunctions : public HostFunctions auto j = getJournal().trace(); #endif auto const s = floatToString(data); - j << "WAMR TRACE FLOAT: " << msg << " " << s; + j << "WASM TRACE FLOAT: " << msg << " " << s; #ifdef DEBUG_OUTPUT j << std::endl; @@ -469,12 +464,12 @@ struct TestHostFunctions : public HostFunctions traceAmount(std::string_view const& msg, STAmount const& amount) override { #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); - j << "WAMR TRACE AMOUNT: " << msg << " " << amountStr; + j << "WASM TRACE AMOUNT: " << msg << " " << amountStr; return msg.size() + amountStr.size(); } @@ -548,15 +543,13 @@ struct TestHostFunctions : public HostFunctions struct TestHostFunctionsSink : public TestHostFunctions { test::StreamSink sink_; - beast::Journal jlog_; void const* rt_ = nullptr; public: explicit TestHostFunctionsSink(test::jtx::Env& env, int cd = 0) - : TestHostFunctions(env, cd) - , sink_(beast::severities::kDebug) - , jlog_(sink_) + : TestHostFunctions(env, cd), sink_(beast::severities::kDebug) { + j_ = beast::Journal(sink_); } test::StreamSink& @@ -564,12 +557,6 @@ struct TestHostFunctionsSink : public TestHostFunctions { return sink_; } - - beast::Journal - getJournal() override - { - return jlog_; - } }; struct PerfHostFunctions : public TestHostFunctions @@ -1284,14 +1271,14 @@ struct PerfHostFunctions : public TestHostFunctions { if (!account || !nftId) { - getJournal().trace() << "WAMR getNFT: Invalid account or NFT ID"; + getJournal().trace() << "WASM getNFT: Invalid account or NFT ID"; return Unexpected(HostFunctionError::INVALID_PARAMS); } auto obj = nft::findToken(*env_.current(), account, nftId); if (!obj) { - getJournal().trace() << "WAMR getNFT: NFT not found"; + getJournal().trace() << "WASM getNFT: NFT not found"; return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); } diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 7b738fe8f21..bcec0442f3e 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -67,7 +67,7 @@ struct Wasm_test : public beast::unit_test::suite // clang-format on auto& vm = WasmEngine::instance(); - std::vector imports; + ImportVec imports; WasmImpFunc( imports, "func-add", reinterpret_cast(&Add)); @@ -90,7 +90,7 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - HostFunctions hfs; + HostFunctions hfs(env.journal); { auto wasmHex = "00000000"; @@ -98,7 +98,7 @@ struct Wasm_test : public beast::unit_test::suite std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, funcName, {}, &hfs, 15, env.journal); + auto re = runEscrowWasm(wasm, hfs, funcName, {}, 15); BEAST_EXPECT(!re); } @@ -108,8 +108,7 @@ struct Wasm_test : public beast::unit_test::suite std::vector wasm(wasmStr.begin(), wasmStr.end()); std::string funcName("mock_escrow"); - auto const re = - preflightEscrowWasm(wasm, funcName, {}, &hfs, env.journal); + auto const re = preflightEscrowWasm(wasm, hfs, funcName); BEAST_EXPECT(!isTesSuccess(re)); } @@ -132,8 +131,8 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); std::vector wasm(wasmStr.begin(), wasmStr.end()); - auto const re = preflightEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &hfs, env.journal); + auto const re = + preflightEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME); BEAST_EXPECT(!isTesSuccess(re)); } } @@ -149,9 +148,9 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestLedgerDataProvider hf(&env); + TestLedgerDataProvider hf(env); - std::vector imports; + ImportVec imports; WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); auto& engine = WasmEngine::instance(); @@ -164,11 +163,10 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - // code takes 11 gas + 1 getLedgerSqn call if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 38, std::to_string(re->cost)); } env.close(); @@ -178,11 +176,10 @@ struct Wasm_test : public beast::unit_test::suite re = engine.run( {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); - // code takes 22 gas + 2 getLedgerSqn calls if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 10, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 76, std::to_string(re->cost)); } } @@ -299,9 +296,9 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); TestHostFunctions hfs(env, 0); - std::vector imp = createWasmImport(&hfs); + ImportVec imp = createWasmImport(hfs); for (auto& i : imp) - i.gas = 0; + i.second.gas = 0; auto re = engine.run( wasm, @@ -335,7 +332,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); TestHostFunctions hfs(env, 0); - std::vector const imp = createWasmImport(&hfs); + ImportVec const imp = createWasmImport(hfs); auto re = engine.run( wasm, @@ -349,7 +346,31 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + } + + env.close(); + } + + // not enough gas + { + std::string const wasmHex = allHostFunctionsWasmHex; + std::string const wasmStr = boost::algorithm::unhex(wasmHex); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); + + auto& engine = WasmEngine::instance(); + + TestHostFunctions hfs(env, 0); + ImportVec const imp = createWasmImport(hfs); + + auto re = engine.run( + wasm, ESCROW_FUNCTION_NAME, {}, imp, &hfs, 200, env.journal); + + if (BEAST_EXPECT(!re)) + { + BEAST_EXPECTS( + re.error() == tecFAILED_PROCESSING, + std::to_string(TERtoInt(re.error()))); } env.close(); @@ -370,11 +391,22 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions nfs(env, 0); auto re = - runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + } + } + + { + // max() gas + TestHostFunctions nfs(env, 0); + auto re = runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, -1); + if (BEAST_EXPECT(re.has_value())) + { + BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); } } @@ -392,11 +424,11 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); auto re = - runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 262, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 5'012, std::to_string(re->cost)); } } @@ -414,11 +446,11 @@ struct Wasm_test : public beast::unit_test::suite }; BadTestHostFunctions nfs(env); auto re = - runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs, 100'000); + runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 262, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 5'012, std::to_string(re->cost)); } } @@ -429,7 +461,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctionsSink nfs(env); std::string funcName("recursive"); - auto re = runEscrowWasm(wasm, funcName, {}, &nfs, 1'000'000'000); + auto re = runEscrowWasm(wasm, nfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -454,11 +486,12 @@ struct Wasm_test : public beast::unit_test::suite } { + // expected import not provided auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - TestLedgerDataProvider ledgerDataProvider(&env); + TestLedgerDataProvider ledgerDataProvider(env); - std::vector imports; + ImportVec imports; WASM_IMPORT_FUNC2( imports, getLedgerSqn, "get_ledger_sqn2", &ledgerDataProvider); @@ -469,11 +502,58 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imports, - nullptr, + &ledgerDataProvider, + 1'000'000, + env.journal); + + BEAST_EXPECT(!re); + } + + { + // bad import format + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + TestLedgerDataProvider ledgerDataProvider(env); + + ImportVec imports; + WASM_IMPORT_FUNC2( + imports, getLedgerSqn, "get_ledger_sqn", &ledgerDataProvider); + imports[0].first = nullptr; + + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &ledgerDataProvider, + 1'000'000, + env.journal); + + BEAST_EXPECT(!re); + } + + { + // bad function name + auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + TestLedgerDataProvider ledgerDataProvider(env); + + ImportVec imports; + WASM_IMPORT_FUNC2( + imports, getLedgerSqn, "get_ledger_sqn", &ledgerDataProvider); + + auto& engine = WasmEngine::instance(); + auto re = engine.run( + wasm, + "func1", + {}, + imports, + &ledgerDataProvider, 1'000'000, env.journal); - // expected import not provided BEAST_EXPECT(!re); } } @@ -494,11 +574,11 @@ struct Wasm_test : public beast::unit_test::suite std::vector const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hf(env, 0); - auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + auto re = runEscrowWasm(wasm, hf, funcName, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 326, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 97'356, std::to_string(re->cost)); } env.close(); } @@ -509,11 +589,11 @@ struct Wasm_test : public beast::unit_test::suite std::vector const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hf(env, 0); - auto re = runEscrowWasm(wasm, funcName, {}, &hf, 100'000); + auto re = runEscrowWasm(wasm, hf, funcName, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 34, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 2'054, std::to_string(re->cost)); } env.close(); } @@ -597,7 +677,7 @@ struct Wasm_test : public beast::unit_test::suite PerfHostFunctions nfs(env, k, env.tx()); - auto re = runEscrowWasm(wasm, ESCROW_FUNCTION_NAME, {}, &nfs); + auto re = runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); @@ -627,9 +707,8 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 1'814; - auto re = runEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &hfs, allowance, env.journal); + auto const allowance = 153'534; + auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) { @@ -653,8 +732,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 set constant, opcode disabled exception - auto const re = - runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -664,8 +742,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 add, can't create module exception wasm[0x117] = 0x92; - auto const re = - runEscrowWasm(wasm, funcName, {}, &hfs, 1'000'000, env.journal); + auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index bff939e0a17..9963754bfb1 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -34,6 +34,8 @@ enum class HostFunctionError : int32_t { INDEX_OUT_OF_BOUNDS = -18, FLOAT_INPUT_MALFORMED = -19, FLOAT_COMPUTATION_ERROR = -20, + NO_RUNTIME = -21, + OUT_OF_GAS = -22, }; inline int32_t @@ -80,6 +82,14 @@ floatLogImpl(Slice const& x, int32_t mode); struct HostFunctions { + beast::Journal j_; + + HostFunctions( + beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) + : j_(j) + { + } + // LCOV_EXCL_START virtual void setRT(void const*) @@ -92,10 +102,22 @@ struct HostFunctions return nullptr; } - virtual beast::Journal + std::int64_t + getGas() + { + return -1; + } + + void + setGas(std::int64_t) + { + return; + } + + beast::Journal getJournal() { - return beast::Journal{beast::Journal::getNullSink()}; + return j_; } virtual Expected diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index f1add087fb2..f5ed1902309 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -42,8 +42,8 @@ class WasmHostFunctionsImpl : public HostFunctions } public: - WasmHostFunctionsImpl(ApplyContext& ctx, Keylet const& leKey) - : ctx(ctx), leKey(leKey) + WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) + : HostFunctions(ct.journal), ctx(ct), leKey(leKey) { } @@ -59,12 +59,6 @@ class WasmHostFunctionsImpl : public HostFunctions return rt_; } - beast::Journal - getJournal() override - { - return ctx.journal; - } - std::optional const& getData() const { diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index 9d581c81581..a0eece79318 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -41,12 +41,15 @@ struct WasmImportFunc std::string name; std::optional result; std::vector params; - void* udata = nullptr; + // void* udata = nullptr; // wasm_func_callback_with_env_t void* wrap = nullptr; uint32_t gas = 0; }; +typedef std::pair WasmUserData; +typedef std::vector ImportVec; + #define WASM_IMPORT_FUNC(v, f, ...) \ WasmImpFunc( \ v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) @@ -111,7 +114,7 @@ WasmImpFuncHelper(WasmImportFunc& e) template void WasmImpFunc( - std::vector& v, + ImportVec& v, std::string_view imp_name, void* f_wrap, void* data = nullptr, @@ -119,11 +122,10 @@ WasmImpFunc( { WasmImportFunc e; e.name = imp_name; - e.udata = data; e.wrap = f_wrap; e.gas = gas; WasmImpFuncHelper(e); - v.push_back(std::move(e)); + v.push_back(std::make_pair(data, std::move(e))); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index 18379d6d4d9..5309ed8f86e 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -43,7 +43,7 @@ class WasmEngine run(Bytes const& wasmCode, std::string_view funcName = {}, std::vector const& params = {}, - std::vector const& imports = {}, + ImportVec const& imports = {}, HostFunctions* hfs = nullptr, int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); @@ -53,12 +53,13 @@ class WasmEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params = {}, - std::vector const& imports = {}, + ImportVec const& imports = {}, + HostFunctions* hfs = nullptr, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); // Host functions helper functionality void* - newTrap(std::string_view msg = {}); + newTrap(std::string const& txt = std::string()); beast::Journal getJournal() const; @@ -66,24 +67,22 @@ class WasmEngine //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -std::vector -createWasmImport(HostFunctions* hfs); +ImportVec +createWasmImport(HostFunctions& hfs); Expected runEscrowWasm( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, - HostFunctions* hfs = nullptr, - int64_t gasLimit = -1, - beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + int64_t gasLimit = -1); NotTEC preflightEscrowWasm( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, - std::vector const& params = {}, - HostFunctions* hfs = nullptr, - beast::Journal j = beast::Journal(beast::Journal::getNullSink())); + std::vector const& params = {}); } // namespace ripple diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index 967a9319a63..a9b8a94332c 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -48,11 +48,14 @@ struct WasmiResult using ModulePtr = std::unique_ptr; using InstancePtr = std::unique_ptr; +using EnginePtr = std::unique_ptr; +using StorePtr = std::unique_ptr; using FuncInfo = std::pair; struct InstanceWrapper { + wasm_store_t* store_ = nullptr; wasm_extern_vec_t exports_; InstancePtr instance_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); @@ -91,11 +94,15 @@ struct InstanceWrapper wmem getMem() const; + + std::int64_t + getGas() const; + + std::int64_t setGas(std::int64_t) const; }; struct ModuleWrapper { - wasm_store_t* store_ = nullptr; ModulePtr module_; InstanceWrapper instanceWrap_; wasm_exporttype_vec_t exportTypes_; @@ -114,7 +121,7 @@ struct ModuleWrapper wasm_store_t* s, Bytes const& wasmBin, bool instantiate, - std::vector const& imports, + ImportVec const& imports, beast::Journal j); ~ModuleWrapper(); @@ -142,13 +149,13 @@ struct ModuleWrapper static void makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); wasm_extern_vec_t - buildImports(wasm_store_t* s, std::vector const& imports); + buildImports(wasm_store_t* s, ImportVec const& imports); }; class WasmiEngine { - std::unique_ptr engine_; - std::unique_ptr store_; + EnginePtr engine_; + StorePtr store_; std::unique_ptr moduleWrap_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); @@ -158,14 +165,14 @@ class WasmiEngine WasmiEngine(); ~WasmiEngine() = default; - static std::unique_ptr + static EnginePtr init(); Expected, TER> run(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, HostFunctions* hfs, int64_t gas, beast::Journal j); @@ -175,7 +182,8 @@ class WasmiEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, + HostFunctions* hfs, beast::Journal j); std::int64_t @@ -183,7 +191,7 @@ class WasmiEngine // Host functions helper functionality wasm_trap_t* - newTrap(std::string_view msg); + newTrap(std::string const& msg); beast::Journal getJournal() const; @@ -203,7 +211,7 @@ class WasmiEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, HostFunctions* hfs, int64_t gas); @@ -212,14 +220,14 @@ class WasmiEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports); + ImportVec const& imports); int addModule( Bytes const& wasmCode, bool instantiate, int64_t gas, - std::vector const& imports); + ImportVec const& imports); void clearModules(); diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index a0b81a2df37..59c4cbfc847 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -1269,10 +1269,12 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) return res.toBytes(); } + // LCOV_EXCL_START catch (...) { } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP } Expected diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 6e849fe867c..90369e3a8d9 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -300,13 +300,52 @@ returnResult( } } +static inline HostFunctions* +getHF(void* env) +{ + auto const* udata = reinterpret_cast(env); + HostFunctions* hf = reinterpret_cast(udata->first); + return hf; +} + +static inline Expected +checkGas(void* env) +{ + auto const* udata = reinterpret_cast(env); + HostFunctions* hf = reinterpret_cast(udata->first); + + auto const* runtime = reinterpret_cast(hf->getRT()); + if (!runtime) + { + wasm_trap_t* trap = reinterpret_cast( + WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE + return Unexpected(trap); // LCOV_EXCL_LINE + } + + int64_t const gas = runtime->getGas(); + WasmImportFunc const& impFunc = udata->second; + int64_t const x = gas >= impFunc.gas ? gas - impFunc.gas : 0; + runtime->setGas(x); + if (gas < impFunc.gas) + { + wasm_trap_t* trap = reinterpret_cast( + WasmEngine::instance().newTrap("hf out of gas")); + return Unexpected(trap); + } + + return x; +} + +//---------------------------------------------------------------------------------------------------------------------- wasm_trap_t* getLedgerSqn_wrap( void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -319,7 +358,9 @@ getParentLedgerTime_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -333,7 +374,9 @@ getParentLedgerHash_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -347,7 +390,9 @@ getBaseFee_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -360,7 +405,9 @@ isAmendmentEnabled_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -396,7 +443,9 @@ cacheLedgerObj_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -422,7 +471,9 @@ getTxField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -441,7 +492,9 @@ getCurrentLedgerObjField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -461,7 +514,9 @@ getLedgerObjField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -487,7 +542,9 @@ getTxNestedField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -507,7 +564,9 @@ getCurrentLedgerObjNestedField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -530,7 +589,9 @@ getLedgerObjNestedField_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -560,7 +621,9 @@ getTxArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -580,7 +643,9 @@ getCurrentLedgerObjArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -604,7 +669,9 @@ getLedgerObjArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -634,7 +701,9 @@ getTxNestedArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -654,7 +723,9 @@ getCurrentLedgerObjNestedArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -677,7 +748,9 @@ getLedgerObjNestedArrayLen_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -706,7 +779,9 @@ updateData_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -726,7 +801,9 @@ checkSignature_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -762,7 +839,9 @@ computeSha512HalfHash_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -781,7 +860,9 @@ accountKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -798,7 +879,9 @@ accountKeylet_wrap( wasm_trap_t* ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -828,7 +911,9 @@ checkKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -854,7 +939,9 @@ credentialKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -890,7 +977,9 @@ delegateKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -920,7 +1009,9 @@ depositPreauthKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -947,7 +1038,9 @@ depositPreauthKeylet_wrap( wasm_trap_t* didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -967,7 +1060,9 @@ escrowKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -993,7 +1088,9 @@ lineKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1029,7 +1126,9 @@ mptIssuanceKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1059,7 +1158,9 @@ mptokenKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1095,7 +1196,9 @@ nftOfferKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1125,7 +1228,9 @@ offerKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1155,7 +1260,9 @@ oracleKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1180,7 +1287,9 @@ paychanKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1216,7 +1325,9 @@ permissionedDomainKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1246,7 +1357,9 @@ signersKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1266,7 +1379,9 @@ ticketKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1296,7 +1411,9 @@ vaultKeylet_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1323,7 +1440,9 @@ vaultKeylet_wrap( wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1349,7 +1468,9 @@ getNFTIssuer_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1369,7 +1490,9 @@ getNFTTaxon_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1389,7 +1512,9 @@ getNFTFlags_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1409,7 +1534,9 @@ getNFTTransferFee_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1429,7 +1556,9 @@ getNFTSerial_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1446,7 +1575,9 @@ getNFTSerial_wrap( wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; @@ -1480,7 +1611,9 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; if (params->data[1].of.i32 > maxWasmParamLength) @@ -1510,7 +1643,9 @@ traceAccount_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); if (params->data[1].of.i32 > maxWasmParamLength) @@ -1535,7 +1670,9 @@ traceFloat_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); if (params->data[1].of.i32 > maxWasmParamLength) @@ -1560,7 +1697,9 @@ traceAmount_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); if (params->data[1].of.i32 > maxWasmParamLength) @@ -1600,7 +1739,9 @@ floatFromInt_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1624,7 +1765,9 @@ floatFromUint_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1645,7 +1788,9 @@ floatFromUint_wrap( wasm_trap_t* floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1673,7 +1818,9 @@ floatCompare_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1691,7 +1838,9 @@ floatCompare_wrap( wasm_trap_t* floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1719,7 +1868,9 @@ floatSubtract_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1747,7 +1898,9 @@ floatMultiply_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1775,7 +1928,9 @@ floatDivide_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1800,7 +1955,9 @@ floatDivide_wrap( wasm_trap_t* floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1828,7 +1985,9 @@ floatPower_wrap( wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; @@ -1853,7 +2012,9 @@ floatPower_wrap( wasm_trap_t* floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - auto* hf = reinterpret_cast(env); + if (auto g = checkGas(env); !g) + return g.error(); // LCOV_EXCL_LINE + auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); int i = 0; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index d87b1444f6e..9ac91358dc3 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -16,7 +16,7 @@ namespace ripple { static void -setCommonHostFunctions(HostFunctions* hfs, std::vector& i) +setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) { // clang-format off WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); @@ -89,16 +89,13 @@ setCommonHostFunctions(HostFunctions* hfs, std::vector& i) // clang-format on } -std::vector -createWasmImport(HostFunctions* hfs) +ImportVec +createWasmImport(HostFunctions& hfs) { - std::vector i; + ImportVec i; - if (hfs) - { - setCommonHostFunctions(hfs, i); - WASM_IMPORT_FUNC2(i, updateData, "update_data", hfs, 1000); - } + setCommonHostFunctions(&hfs, i); + WASM_IMPORT_FUNC2(i, updateData, "update_data", &hfs, 1000); return i; } @@ -106,11 +103,10 @@ createWasmImport(HostFunctions* hfs) Expected runEscrowWasm( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - HostFunctions* hfs, - int64_t gasLimit, - beast::Journal j) + int64_t gasLimit) { // create VM and set cost limit auto& vm = WasmEngine::instance(); @@ -121,9 +117,9 @@ runEscrowWasm( funcName, params, createWasmImport(hfs), - hfs, + &hfs, gasLimit, - hfs ? hfs->getJournal() : j); + hfs.getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -146,10 +142,9 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, - std::vector const& params, - HostFunctions* hfs, - beast::Journal j) + std::vector const& params) { // create VM and set cost limit auto& vm = WasmEngine::instance(); @@ -160,7 +155,8 @@ preflightEscrowWasm( funcName, params, createWasmImport(hfs), - hfs ? hfs->getJournal() : j); + &hfs, + hfs.getJournal()); return ret; } @@ -183,7 +179,7 @@ WasmEngine::run( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, HostFunctions* hfs, int64_t gasLimit, beast::Journal j) @@ -196,22 +192,25 @@ WasmEngine::check( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, + HostFunctions* hfs, beast::Journal j) { - return impl->check(wasmCode, funcName, params, imports, j); + return impl->check(wasmCode, funcName, params, imports, hfs, j); } void* -WasmEngine::newTrap(std::string_view msg) +WasmEngine::newTrap(std::string const& msg) { return impl->newTrap(msg); } +// LCOV_EXCL_START beast::Journal WasmEngine::getJournal() const { return impl->getJournal(); } +// LCOV_EXCL_STOP } // namespace ripple diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index c3c1e300e45..fe3a5629f71 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -75,18 +75,21 @@ InstanceWrapper::InstanceWrapper() { } +// LCOV_EXCL_START InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) : exports_{0, nullptr}, instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } +// LCOV_EXCL_STOP InstanceWrapper::InstanceWrapper( wasm_store_t* s, wasm_module_t* m, wasm_extern_vec_t const& imports, beast::Journal j) - : exports_ WASM_EMPTY_VEC + : store_(s) + , exports_ WASM_EMPTY_VEC , instance_(init(s, m, &exports_, imports, j)) , j_(j) { @@ -102,10 +105,12 @@ InstanceWrapper& InstanceWrapper::operator=(InstanceWrapper&& o) { if (this == &o) - return *this; + return *this; // LCOV_EXCL_LINE + store_ = o.store_; + o.store_ = nullptr; if (exports_.size) - wasm_extern_vec_delete(&exports_); + wasm_extern_vec_delete(&exports_); // LCOV_EXCL_LINE exports_ = o.exports_; o.exports_ = {0, nullptr}; @@ -130,12 +135,12 @@ InstanceWrapper::getFunc( wasm_functype_t* ft = nullptr; if (!instance_) - throw std::runtime_error("no instance"); + throw std::runtime_error("no instance"); // LCOV_EXCL_LINE if (!export_types.size) - throw std::runtime_error("no export"); + throw std::runtime_error("no export"); // LCOV_EXCL_LINE if (export_types.size != exports_.size) - throw std::runtime_error("invalid export"); + throw std::runtime_error("invalid export"); // LCOV_EXCL_LINE for (unsigned i = 0; i < export_types.size; ++i) { @@ -149,7 +154,8 @@ InstanceWrapper::getFunc( { auto* exn(exports_.data[i]); if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error("invalid export"); + throw std::runtime_error( + "invalid export"); // LCOV_EXCL_LINE ft = wasm_externtype_as_functype( const_cast(exn_type)); @@ -170,7 +176,7 @@ wmem InstanceWrapper::getMem() const { if (!instance_) - throw std::runtime_error("no instance"); + throw std::runtime_error("no instance"); // LCOV_EXCL_LINE wasm_memory_t* mem = nullptr; for (unsigned i = 0; i < exports_.size; ++i) @@ -184,13 +190,43 @@ InstanceWrapper::getMem() const } if (!mem) - throw std::runtime_error("no memory exported"); + throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE return { reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; } +std::int64_t +InstanceWrapper::getGas() const +{ + if (!store_) + return -1; // LCOV_EXCL_LINE + std::uint64_t gas = 0; + wasm_store_get_fuel(store_, &gas); + return static_cast(gas); +} + +std::int64_t +InstanceWrapper::setGas(std::int64_t gas) const +{ + if (!store_) + return -1; // LCOV_EXCL_LINE + + if (gas < 0) + gas = std::numeric_limits::max(); + wasmi_error_t* err = + wasm_store_set_fuel(store_, static_cast(gas)); + if (err) + { + print_wasm_error( + "Can't set instance gas", nullptr, j_); // LCOV_EXCL_LINE + throw std::runtime_error("Can't set instance gas"); // LCOV_EXCL_LINE + } + + return gas; +} + ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ModulePtr @@ -204,6 +240,7 @@ ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) return m; } +// LCOV_EXCL_START ModuleWrapper::ModuleWrapper() : module_(nullptr, &wasm_module_delete), exportTypes_{0, nullptr} { @@ -214,14 +251,15 @@ ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) { *this = std::move(o); } +// LCOV_EXCL_STOP ModuleWrapper::ModuleWrapper( wasm_store_t* s, Bytes const& wasmBin, bool instantiate, - std::vector const& imports, + ImportVec const& imports, beast::Journal j) - : store_(s), module_(init(s, wasmBin, j)), exportTypes_{0, nullptr}, j_(j) + : module_(init(s, wasmBin, j)), exportTypes_{0, nullptr}, j_(j) { wasm_module_exports(module_.get(), &exportTypes_); if (instantiate) @@ -238,14 +276,13 @@ ModuleWrapper::~ModuleWrapper() wasm_exporttype_vec_delete(&exportTypes_); } +// LCOV_EXCL_START ModuleWrapper& ModuleWrapper::operator=(ModuleWrapper&& o) { if (this == &o) return *this; - store_ = o.store_; - o.store_ = nullptr; module_ = std::move(o.module_); instanceWrap_ = std::move(o.instanceWrap_); if (exportTypes_.size) @@ -262,6 +299,8 @@ ModuleWrapper::operator bool() const return instanceWrap_; } +// LCOV_EXCL_STOP + void ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) { @@ -284,8 +323,10 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) case WT_I64: v.data[i] = wasm_valtype_new_i64(); break; + // LCOV_EXCL_START default: throw std::runtime_error("invalid import type"); + // LCOV_EXCL_STOP } } } @@ -301,21 +342,21 @@ ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) case WT_I32: v.data[0] = wasm_valtype_new_i32(); break; + // LCOV_EXCL_START case WT_I64: v.data[0] = wasm_valtype_new_i64(); break; default: throw std::runtime_error("invalid return type"); + // LCOV_EXCL_STOP } } else - v = WASM_EMPTY_VEC; + v = WASM_EMPTY_VEC; // LCOV_EXCL_LINE } wasm_extern_vec_t -ModuleWrapper::buildImports( - wasm_store_t* s, - std::vector const& imports) +ModuleWrapper::buildImports(wasm_store_t* s, ImportVec const& imports) { wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; wasm_module_imports(module_.get(), &importTypes); @@ -343,15 +384,17 @@ ModuleWrapper::buildImports( wasm_externtype_kind(wasm_importtype_type(importtype)); if ((itype) != WASM_EXTERN_FUNC) throw std::runtime_error( - "Invalid import type " + std::to_string(itype)); + "Invalid import type " + + std::to_string(itype)); // LCOV_EXCL_LINE // for multi-module support // if ((W_ENV != modName) && (W_HOST_LIB != modName)) // continue; bool impSet = false; - for (auto const& imp : imports) + for (auto const& obj : imports) { + auto const& imp = obj.second; if (imp.name != fieldName) continue; @@ -368,7 +411,7 @@ ModuleWrapper::buildImports( s, ftype.get(), reinterpret_cast(imp.wrap), - imp.udata, + (void*)&obj, nullptr); if (!func) { @@ -378,14 +421,6 @@ ModuleWrapper::buildImports( // LCOV_EXCL_STOP } - // if (imp.gas && !wasm_func_set_gas(func, imp.gas)) - // { - // // LCOV_EXCL_START - // throw std::runtime_error( - // "can't set gas for import function " + imp.name); - // // LCOV_EXCL_STOP - // } - wimports.data[i] = wasm_func_as_extern(func); ++impCnt; impSet = true; @@ -396,9 +431,7 @@ ModuleWrapper::buildImports( if (!impSet) { print_wasm_error( - std::string("Import not found: ") + fieldName.data(), - nullptr, - j_); + "Import not found: " + std::string(fieldName), nullptr, j_); } } @@ -452,11 +485,7 @@ ModuleWrapper::addInstance(wasm_store_t* s, wasm_extern_vec_t const& imports) std::int64_t ModuleWrapper::getGas() { - if (!store_) - return 0; - std::uint64_t gas = 0; - wasm_store_get_fuel(store_, &gas); - return static_cast(gas); + return instanceWrap_ ? instanceWrap_.getGas() : -1; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -475,7 +504,7 @@ WasmiEngine::init() wasm_config_t* config = wasm_config_new(); if (!config) return std::unique_ptr{ - nullptr, &wasm_engine_delete}; + nullptr, &wasm_engine_delete}; // LCOV_EXCL_LINE wasmi_config_consume_fuel_set(config, true); return std::unique_ptr( @@ -492,7 +521,7 @@ WasmiEngine::addModule( Bytes const& wasmCode, bool instantiate, int64_t gas, - std::vector const& imports) + ImportVec const& imports) { moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store @@ -504,15 +533,18 @@ WasmiEngine::addModule( wasm_store_set_fuel(store_.get(), static_cast(gas)); if (err) { + // LCOV_EXCL_START print_wasm_error("Error setting gas", nullptr, j_); throw std::runtime_error("can't set gas"); + // LCOV_EXCL_STOP } moduleWrap_ = std::make_unique( store_.get(), wasmCode, instantiate, imports, j_); if (!moduleWrap_) - throw std::runtime_error("can't create module wrapper"); + throw std::runtime_error( + "can't create module wrapper"); // LCOV_EXCL_LINE return moduleWrap_ ? 0 : -1; } @@ -541,9 +573,11 @@ WasmiEngine::convertParams(std::vector const& params) case WT_I32: v.push_back(WASM_I32_VAL(p.of.i32)); break; + // LCOV_EXCL_START case WT_I64: v.push_back(WASM_I64_VAL(p.of.i64)); break; + // LCOV_EXCL_STOP case WT_U8V: { auto const sz = p.of.u8v.sz; auto const ptr = allocate(sz); @@ -554,10 +588,12 @@ WasmiEngine::convertParams(std::vector const& params) v.push_back(WASM_I32_VAL(sz)); } break; + // LCOV_EXCL_START default: throw std::runtime_error( "unknown parameter type: " + std::to_string(p.type)); break; + // LCOV_EXCL_STOP } } @@ -583,6 +619,7 @@ WasmiEngine::compareParamTypes( return -1; } +// LCOV_EXCL_START void WasmiEngine::add_param(std::vector& in, int32_t p) { @@ -592,6 +629,8 @@ WasmiEngine::add_param(std::vector& in, int32_t p) el = WASM_I32_VAL(p); // WASM_I32; } +// LCOV_EXCL_STOP + void WasmiEngine::add_param(std::vector& in, int64_t p) { @@ -719,12 +758,22 @@ WasmiEngine::call( return call(f, in, p.data(), p.size(), std::forward(args)...); } +static inline void +checkImports(ImportVec const& imports, HostFunctions* hfs) +{ + for (auto const& obj : imports) + { + if (hfs != obj.first) + Throw("Imports hf unsync"); + } +} + Expected, TER> WasmiEngine::run( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, HostFunctions* hfs, int64_t gas, beast::Journal j) @@ -732,16 +781,19 @@ WasmiEngine::run( j_ = j; try { + checkImports(imports, hfs); return runHlp(wasmCode, funcName, params, imports, hfs, gas); } catch (std::exception const& e) { print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); } + // LCOV_EXCL_START catch (...) { print_wasm_error(std::string("exception: unknown"), nullptr, j_); } + // LCOV_EXCL_STOP return Unexpected(tecFAILED_PROCESSING); } @@ -750,7 +802,7 @@ WasmiEngine::runHlp( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, HostFunctions* hfs, int64_t gas) { @@ -764,7 +816,7 @@ WasmiEngine::runHlp( } if (!moduleWrap_ || !moduleWrap_->instanceWrap_) - throw std::runtime_error("no instance"); + throw std::runtime_error("no instance"); // LCOV_EXCL_LINE if (hfs) hfs->setRT(&getRT()); @@ -787,7 +839,8 @@ WasmiEngine::runHlp( throw std::runtime_error("<" + std::string(funcName) + "> failure"); else if (!res.r.size) throw std::runtime_error( - "<" + std::string(funcName) + "> return nothing"); + "<" + std::string(funcName) + + "> return nothing"); // LCOV_EXCL_LINE assert(res.r.data[0].kind == WASM_I32); if (gas == -1) @@ -810,23 +863,27 @@ WasmiEngine::check( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports, + ImportVec const& imports, + HostFunctions* hfs, beast::Journal j) { j_ = j; try { + checkImports(imports, hfs); return checkHlp(wasmCode, funcName, params, imports); } catch (std::exception const& e) { print_wasm_error(std::string("exception: ") + e.what(), nullptr, j_); } + // LCOV_EXCL_START catch (...) { print_wasm_error(std::string("exception: unknown"), nullptr, j_); } + // LCOV_EXCL_STOP return temBAD_WASM; } @@ -836,7 +893,7 @@ WasmiEngine::checkHlp( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - std::vector const& imports) + ImportVec const& imports) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); @@ -847,7 +904,7 @@ WasmiEngine::checkHlp( int const m = addModule(wasmCode, true, -1, imports); if ((m < 0) || !moduleWrap_ || !moduleWrap_->instanceWrap_) - throw std::runtime_error("no instance"); + throw std::runtime_error("no instance"); // LCOV_EXCL_LINE // Looking for a func and compare parameter types auto const f = getFunc(!funcName.empty() ? funcName : "_start"); @@ -861,11 +918,13 @@ WasmiEngine::checkHlp( return tesSUCCESS; } +// LCOV_EXCL_START std::int64_t WasmiEngine::getGas() { - return moduleWrap_ ? moduleWrap_->getGas() : 0; + return moduleWrap_ ? moduleWrap_->getGas() : -1; } +// LCOV_EXCL_STOP wmem WasmiEngine::getMem() const @@ -894,20 +953,23 @@ WasmiEngine::allocate(int32_t sz) } wasm_trap_t* -WasmiEngine::newTrap(std::string_view txt) +WasmiEngine::newTrap(std::string const& txt) { - wasm_message_t msg = WASM_EMPTY_VEC; + static char empty[1] = {0}; + wasm_message_t msg = {1, empty}; if (!txt.empty()) - wasm_name_new(&msg, txt.size(), txt.data()); + wasm_name_new(&msg, txt.size() + 1, txt.c_str()); // include 0 return wasm_trap_new(store_.get(), &msg); } +// LCOV_EXCL_START beast::Journal WasmiEngine::getJournal() const { return j_; } +// LCOV_EXCL_STOP } // namespace ripple From c145598ff9fd23ab04a96d5af728408479987f81 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Tue, 2 Dec 2025 00:09:20 -0500 Subject: [PATCH 122/212] add memory limit and disable float and other advanced instructions --- .../wasmi/patches/0001-xrplf-0.42.1.patch | 133 +- src/test/app/Wasm_test.cpp | 46 +- src/test/app/wasm_fixtures/fixtures.cpp | 9212 +---------------- src/test/app/wasm_fixtures/fixtures.h | 4 - src/test/app/wasm_fixtures/sp1/Cargo.lock | 1384 --- src/test/app/wasm_fixtures/sp1/Cargo.toml | 16 - src/test/app/wasm_fixtures/sp1/src/lib.rs | 37 - .../app/wasm_fixtures/wat/deep_recursion.wat | 29 + .../app/wasm_fixtures/zk_proof/Cargo.lock | 106 - .../app/wasm_fixtures/zk_proof/Cargo.toml | 19 - .../app/wasm_fixtures/zk_proof/src/lib.rs | 254 - src/xrpld/app/wasm/WasmVM.h | 2 + src/xrpld/app/wasm/detail/WasmiVM.cpp | 14 +- 13 files changed, 170 insertions(+), 11086 deletions(-) delete mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.lock delete mode 100644 src/test/app/wasm_fixtures/sp1/Cargo.toml delete mode 100644 src/test/app/wasm_fixtures/sp1/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/wat/deep_recursion.wat delete mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.lock delete mode 100644 src/test/app/wasm_fixtures/zk_proof/Cargo.toml delete mode 100644 src/test/app/wasm_fixtures/zk_proof/src/lib.rs diff --git a/external/wasmi/patches/0001-xrplf-0.42.1.patch b/external/wasmi/patches/0001-xrplf-0.42.1.patch index 0fbcb4408b3..c8a7a374a11 100644 --- a/external/wasmi/patches/0001-xrplf-0.42.1.patch +++ b/external/wasmi/patches/0001-xrplf-0.42.1.patch @@ -1,5 +1,5 @@ diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt -index b15c787a..54eaed2d 100644 +index b15c787..54eaed2 100644 --- a/crates/c_api/CMakeLists.txt +++ b/crates/c_api/CMakeLists.txt @@ -6,6 +6,8 @@ option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) @@ -67,7 +67,7 @@ index b15c787a..54eaed2d 100644 - COMMENT "clang-format: Apply formatting rules for Wasmi C-API header files" -) diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h -index 5ee617ff..5c79bde3 100644 +index 5ee617f..a76f10e 100644 --- a/crates/c_api/include/wasm.h +++ b/crates/c_api/include/wasm.h @@ -13,11 +13,17 @@ @@ -89,20 +89,22 @@ index 5ee617ff..5c79bde3 100644 #endif #ifdef __cplusplus -@@ -146,6 +152,11 @@ WASM_DECLARE_OWN(store) +@@ -145,7 +151,13 @@ WASM_API_EXTERN own wasm_engine_t* wasm_engine_new_with_config(own wasm_config_t + WASM_DECLARE_OWN(store) WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); - ++WASM_API_EXTERN own wasm_store_t* wasm_store_new_with_memory_max_pages(wasm_engine_t*, uint32_t max_pages); ++ +// Store fuel functions (forward declarations) +struct wasmi_error; -+ + +WASM_API_EXTERN struct wasmi_error* wasm_store_get_fuel(const wasm_store_t*, uint64_t* fuel); +WASM_API_EXTERN struct wasmi_error* wasm_store_set_fuel(wasm_store_t*, uint64_t fuel); /////////////////////////////////////////////////////////////////////////////// // Type Representations diff --git a/crates/c_api/include/wasmi.h b/crates/c_api/include/wasmi.h -index 2caffa37..0c0584ec 100644 +index 2caffa3..0c0584e 100644 --- a/crates/c_api/include/wasmi.h +++ b/crates/c_api/include/wasmi.h @@ -10,7 +10,7 @@ @@ -128,18 +130,127 @@ index 2caffa37..0c0584ec 100644 #endif // WASMI_H diff --git a/crates/c_api/src/store.rs b/crates/c_api/src/store.rs -index 56d4898f..543dbff8 100644 +index 56d4898..9abda8e 100644 --- a/crates/c_api/src/store.rs +++ b/crates/c_api/src/store.rs -@@ -175,3 +175,44 @@ pub extern "C" fn wasmi_context_set_fuel( +@@ -1,7 +1,7 @@ + use crate::{wasm_engine_t, wasmi_error_t, ForeignData}; + use alloc::{boxed::Box, sync::Arc}; + use core::{cell::UnsafeCell, ffi}; +-use wasmi::{AsContext, AsContextMut, Store, StoreContext, StoreContextMut}; ++use wasmi::{AsContext, AsContextMut, Store, StoreContext, StoreContextMut, StoreLimits, StoreLimitsBuilder}; + + /// This representation of a `Store` is used to implement the `wasm.h` API (and + /// *not* the `wasmi.h` API!) +@@ -16,7 +16,7 @@ use wasmi::{AsContext, AsContextMut, Store, StoreContext, StoreContextMut}; + /// least Wasmi's implementation). + #[derive(Clone)] + pub struct WasmStoreRef { +- inner: Arc>>, ++ inner: Arc>>, + } + + impl WasmStoreRef { +@@ -27,7 +27,7 @@ impl WasmStoreRef { + /// # Safety + /// + /// It is the callers responsibility to provide a valid `self`. +- pub unsafe fn context(&self) -> StoreContext<'_, ()> { ++ pub unsafe fn context(&self) -> StoreContext<'_, StoreLimits> { + (*self.inner.get()).as_context() + } + +@@ -38,7 +38,7 @@ impl WasmStoreRef { + /// # Safety + /// + /// It is the callers responsibility to provide a valid `self`. +- pub unsafe fn context_mut(&mut self) -> StoreContextMut<'_, ()> { ++ pub unsafe fn context_mut(&mut self) -> StoreContextMut<'_, StoreLimits> { + (*self.inner.get()).as_context_mut() + } + } +@@ -56,17 +56,71 @@ pub struct wasm_store_t { + + wasmi_c_api_macros::declare_own!(wasm_store_t); + +-/// Creates a new [`Store<()>`](wasmi::Store) for the given `engine`. ++/// Creates a new [`Store`](wasmi::Store) for the given `engine`. ++/// ++/// The store is created with no resource limits (original behavior). ++/// For memory-limited stores, use [`wasm_store_new_with_memory_max_pages`]. + /// + /// The returned [`wasm_store_t`] must be freed using [`wasm_store_delete`]. + /// +-/// Wraps [`>::new`](wasmi::Store::new). ++/// Wraps [`>::new`](wasmi::Store::new). + #[cfg_attr(not(feature = "prefix-symbols"), no_mangle)] + #[allow(clippy::arc_with_non_send_sync)] + #[cfg_attr(feature = "prefix-symbols", wasmi_c_api_macros::prefix_symbol)] + pub extern "C" fn wasm_store_new(engine: &wasm_engine_t) -> Box { + let engine = &engine.inner; +- let store = Store::new(engine, ()); ++ ++ // Create store with no resource limits (original behavior) ++ let limits = StoreLimitsBuilder::new().build(); ++ let store = Store::new(engine, limits); ++ ++ Box::new(wasm_store_t { ++ inner: WasmStoreRef { ++ inner: Arc::new(UnsafeCell::new(store)), ++ }, ++ }) ++} ++ ++/// Creates a new [`Store`](wasmi::Store) for the given `engine` with memory limits. ++/// ++/// This function creates a store with resource limits suitable for blockchain smart contracts. ++/// The memory limit is enforced during WebAssembly execution. ++/// ++/// If `max_pages` exceeds 1024 (64MB), this function will panic. ++/// ++/// The returned [`wasm_store_t`] must be freed using [`wasm_store_delete`]. ++/// ++/// Wraps [`>::new`](wasmi::Store::new). ++#[cfg_attr(not(feature = "prefix-symbols"), no_mangle)] ++#[allow(clippy::arc_with_non_send_sync)] ++#[cfg_attr(feature = "prefix-symbols", wasmi_c_api_macros::prefix_symbol)] ++pub extern "C" fn wasm_store_new_with_memory_max_pages( ++ engine: &wasm_engine_t, ++ max_pages: u32, ++) -> Box { ++ // Validate max_pages limit (64MB = 1024 pages) ++ if max_pages > 1024 { ++ panic!("max_pages ({}) exceeds maximum allowed value of 1024 pages (64MB)", max_pages); ++ } ++ ++ // Convert pages to bytes (each page is 64KB) ++ let max_memory_bytes = (max_pages as usize) * (64 * 1024); ++ ++ // Create store limits with blockchain-suitable defaults ++ let limits = StoreLimitsBuilder::new() ++ .memory_size(max_memory_bytes) // User-specified memory limit ++ .instances(1) // Single instance for blockchain ++ .tables(1) // Single table for blockchain ++ .memories(1) // Single memory for blockchain ++ .table_elements(64) // Limited table elements for blockchain ++ .trap_on_grow_failure(false) // Return -1 on growth failure instead of trapping ++ .build(); ++ ++ let mut store = Store::new(&engine.inner, limits); ++ ++ // Install the resource limiter ++ store.limiter(|limits| limits); ++ + Box::new(wasm_store_t { + inner: WasmStoreRef { + inner: Arc::new(UnsafeCell::new(store)), +@@ -175,3 +229,40 @@ pub extern "C" fn wasmi_context_set_fuel( ) -> Option> { crate::handle_result(store.set_fuel(fuel), |()| {}) } + +//////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////////////////// + +/// Returns the current fuel of the wasm store context in `fuel`. +/// @@ -171,8 +282,6 @@ index 56d4898f..543dbff8 100644 + store: &mut wasm_store_t, + fuel: u64, +) -> Option> { -+ + let mut context = unsafe { store.inner.context_mut() }; + crate::handle_result(context.set_fuel(fuel), |()| {}) +} -+ diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index bcec0442f3e..b7ad172f2f6 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -245,41 +245,6 @@ struct Wasm_test : public beast::unit_test::suite } } - void - testWasmSP1Verifier() - { - testcase("Wasm sp1 zkproof verifier"); - auto const ws = boost::algorithm::unhex(sp1WasmHex); - Bytes const wasm(ws.begin(), ws.end()); - auto& engine = WasmEngine::instance(); - - auto const re = engine.run(wasm, "sp1_groth16_verifier"); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS( - re->cost == 4'191'711'969ll, std::to_string(re->cost)); - } - } - - void - testWasmBG16Verifier() - { - testcase("Wasm BG16 zkproof verifier"); - auto const ws = boost::algorithm::unhex(zkProofWasmHex); - Bytes const wasm(ws.begin(), ws.end()); - auto& engine = WasmEngine::instance(); - - auto const re = engine.run(wasm, "bellman_groth16_test"); - - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 270'282'552, std::to_string(re->cost)); - } - } - void testHFCost() { @@ -460,7 +425,7 @@ struct Wasm_test : public beast::unit_test::suite std::vector wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctionsSink nfs(env); - std::string funcName("recursive"); + std::string funcName("finish"); auto re = runEscrowWasm(wasm, nfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() @@ -482,7 +447,7 @@ struct Wasm_test : public beast::unit_test::suite auto const s = sink.messages().str(); BEAST_EXPECT( countSubstr(s, "WASMI Error: failure to call func") == 1); - BEAST_EXPECT(countSubstr(s, "exception: failure") > 0); + BEAST_EXPECT(countSubstr(s, "exception: failure") > 0); } { @@ -764,17 +729,12 @@ struct Wasm_test : public beast::unit_test::suite testWasmSha(); testWasmB58(); - // running too long - // testWasmSP1Verifier(); - testWasmBG16Verifier(); - testHFCost(); - testEscrowWasmDN(); testFloat(); testCodecovWasm(); - // testDisabledFloat(); + testDisabledFloat(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index e4c65c3d629..160a4549fa0 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -103,8498 +103,6 @@ extern std::string const sha512PureWasmHex = "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" "7065732b0a6d756c746976616c7565"; -extern std::string const zkProofWasmHex = - "0061736d0100000001600f60037f7f7f017f60027f7f017f60027f7f0060" - "037f7f7f0060000060057f7f7f7f7f0060047f7f7f7f0060067f7f7f7f7f" - "7f0060017f017f6000017f60017f0060047f7f7f7f017f60027e7e017f60" - "057f7f7f7f7f017f60057f7e7e7e7e00038c018a01030402030202020302" - "030505030206020601000006010606070303080202020302090208020202" - "030a0806020a030b06060202030302020303030203030203020202010302" - "030203060a02000202080a020c0807010d02030206060102020803080302" - "030202020a02060303020a03020301010a0d030101010001010301020604" - "0a0a020200000e000004050170010e0e05030100110619037f01418080c0" - "000b7f0041bd97c0000b7f0041c097c0000b075d06066d656d6f72790200" - "08616c6c6f63617465001b13646573657269616c697a655f67315f776173" - "6d001c1462656c6c6d616e5f67726f746831365f7465737400210a5f5f64" - "6174615f656e6403010b5f5f686561705f6261736503020914010041010b" - "0d15767778717e830111547d137a7b0ad6f3048a014b01017f0240024002" - "4020010d00410021010c010b2002450d01200120026e2203200320026c20" - "01476a21010b2000200136020820004101360204200020013602000f0b10" - "8180808000000b4701017f23808080800041206b22002480808080002000" - "41003602182000410136020c200041e090c0800036020820004204370210" - "200041086a41fc82c0800010a480808000000b0f002000200141e8001083" - "808080000b170002402000450d002001200020026c108d808080000b0b0e" - "002000200141011083808080000b0f002000200141a0021083808080000b" - "0e002000200141201083808080000b4201017f0240200028020822032000" - "280200470d00200020021088808080000b2000280204200341e8006c6a20" - "0141e8001086818080001a2000200341016a3602080b5a01017f23808080" - "800041106b2202248080808000200241086a20002000280200410141e800" - "108b80808000024020022802082200418180808078460d00200020022802" - "0c2001108c80808000000b200241106a2480808080000b6401027f238080" - "80800041106b2203248080808000200341086a20024101410141f081c080" - "00108a8080800020032802082104200328020c2001200210868180800021" - "01200020023602082000200136020420002004360200200341106a248080" - "8080000b6401017f23808080800041106b2205248080808000200541046a" - "200120022003108e8080800020052802082103024020052802040d002000" - "200528020c36020420002003360200200541106a2480808080000f0b2003" - "200528020c2004108c80808000000bfd0102037f017e2380808080004110" - "6b22052480808080004100210602400240200220036a22032002490d0020" - "0441076a417871ad2001280200220741017422022003200220034b1b2202" - "4104200241044b1b2203ad7e2208422088a70d002008a7220241f8ffffff" - "074b0d01024002402007450d00024020040d00200541086a4108200210d7" - "80808000200528020821040c020b2001280204200720046c200210cb8080" - "800021040c010b20054108200210d780808000200528020021040b024020" - "040d00410821060c020b2001200336020020012004360204418180808078" - "21060b0b2000200236020420002006360200200541106a2480808080000b" - "1200024020000d00200210cf808080000b000b6c01027f02400240200041" - "7c6a2802002202417871220341044108200241037122021b20016a490d00" - "02402002450d002003200141276a4b0d020b200010c9808080000f0b41e9" - "92c08000419893c0800010ca80808000000b41a893c0800041d893c08000" - "10ca80808000000bc70103017f017e017f23808080800041106b22042480" - "8080800002400240200220036a417f6a410020026b71ad2001ad7e220542" - "2088a70d002005a7220341808080807820026b4b0d00024020030d002000" - "200236020841002102200041003602040c020b200441086a2002200310d7" - "80808000024020042802082206450d002000200636020820002001360204" - "410021020c020b2000200336020820002002360204410121020c010b2000" - "4100360204410121020b20002002360200200441106a2480808080000b88" - "0303017f097e017f23808080800041306b22022480808080002002420042" - "002001290330220342abd5feffffffbfffb97f56ad7d2204200129033822" - "057d220642ffffcf8aebffffd51e7c220720052003842001290340220884" - "20012903482209842001290350220a842001290358220b8450220c1b3703" - "082002420042abd5feffffffbfffb97f20037d200c1b3703002002420020" - "042004200554ad7d2007200654ad7c423f87220320087d220442a4ecc3b5" - "8fd4b498e7007c2205200c1b3703102002420020032003200854ad7d2005" - "200454ad7c423f87220320097d220442bfa5949ccff0d2bbe4007c220520" - "0c1b3703182002420020032003200954ad7d2005200454ad7c423f872203" - "200a7d220442d7d9ae9ae4f6e98dcb007c2205200c1b3703202002420020" - "032003200a54ad7d2005200454ad7c423f87200b7d429acdffcba3bdc480" - "1a7c200c1b370328200041306a200241e086c0800020012d0060220c1090" - "80808000200020014130108681808000200c3a0060200241306a24808080" - "80000b9e0101027e20002002290328200129032822048542002003ad42ff" - "01837d220583200485370328200020022903202001290320220485200583" - "200485370320200020022903182001290318220485200583200485370318" - "200020022903102001290310220485200583200485370310200020022903" - "082001290308220485200583200485370308200020022903002001290300" - "2204852005832004853703000bec0201057f23808080800041c0006b2202" - "248080808000410121030240200128021c2204418082c080004111200128" - "0220220528020c220611808080800080808080000d000240024020012d00" - "144104710d0041012103200441fa8ec08000410120061180808080008080" - "8080000d02200141e091c080004102109280808000450d010c020b200441" - "fb8ec080004102200611808080800080808080000d014101210320024101" - "3a0017200241186a41086a200141086a290200370300200241186a41106a" - "200141106a290200370300200241186a41186a200141186a280200360200" - "2002200536020c20022004360208200241dc8ec080003602382002200129" - "02003703182002200241176a3602102002200241086a360234200241186a" - "41e091c0800041021092808080000d01200241086a41f88ec08000410210" - "93808080000d010b200441ec8cc080004101200611808080800080808080" - "0021030b200241c0006a24808080800020030bbf0b010b7f024002400240" - "200028020022032000280208220472450d0002402004410171450d002001" - "20026a210502400240200028020c22060d0041002107200121080c010b41" - "00210741002109200121080340200822042005460d020240024020042c00" - "002208417f4c0d00200441016a21080c010b0240200841604f0d00200441" - "026a21080c010b0240200841704f0d00200441036a21080c010b20044104" - "6a21080b200820046b20076a21072006200941016a2209470d000b0b2008" - "2005460d00024020082c00002204417f4a0d0020044160491a0b02400240" - "2007450d00024020072002490d0020072002460d01410021040c020b2001" - "20076a2c000041404e0d00410021040c010b200121040b2007200220041b" - "21022004200120041b21010b024020030d00200028021c20012002200028" - "022028020c11808080800080808080000f0b2000280204210a0240200241" - "10490d0020022001200141036a417c7122076b22096a220b410371210341" - "00210641002104024020012007460d004100210402402009417c4b0d0041" - "0021044100210503402004200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c0000" - "41bf7f4a6a2104200541046a22050d000b0b200121080340200420082c00" - "0041bf7f4a6a2104200841016a2108200941016a22090d000b0b02402003" - "450d002007200b417c716a22082c000041bf7f4a210620034101460d0020" - "0620082c000141bf7f4a6a210620034102460d00200620082c000241bf7f" - "4a6a21060b200b4102762105200620046a21060340200721032005450d04" - "200541c001200541c001491b220b410371210c200b410274210d41002108" - "024020054104490d002003200d41f007716a210941002108200321040340" - "200428020c2207417f734107762007410676724181828408712004280208" - "2207417f7341077620074106767241818284087120042802042207417f73" - "41077620074106767241818284087120042802002207417f734107762007" - "4106767241818284087120086a6a6a6a2108200441106a22042009470d00" - "0b0b2005200b6b21052003200d6a2107200841087641ff81fc0771200841" - "ff81fc07716a418180046c41107620066a2106200c450d000b2003200b41" - "fc01714102746a22082802002204417f7341077620044106767241818284" - "08712104200c4101460d0220082802042207417f73410776200741067672" - "41818284087120046a2104200c4102460d0220082802082208417f734107" - "7620084106767241818284087120046a21040c020b024020020d00410021" - "060c030b2002410371210802400240200241044f0d004100210641002109" - "0c010b41002106200121042002410c71220921070340200620042c000041" - "bf7f4a6a200441016a2c000041bf7f4a6a200441026a2c000041bf7f4a6a" - "200441036a2c000041bf7f4a6a2106200441046a21042007417c6a22070d" - "000b0b2008450d02200120096a21040340200620042c000041bf7f4a6a21" - "06200441016a21042008417f6a22080d000c030b0b200028021c20012002" - "200028022028020c11808080800080808080000f0b200441087641ff811c" - "71200441ff81fc07716a418180046c41107620066a21060b02400240200a" - "20064d0d00200a20066b2105024002400240410020002d00182204200441" - "03461b22040e03020001020b20052104410021050c010b20054101762104" - "200541016a41017621050b200441016a2104200028021021092000280220" - "2108200028021c210703402004417f6a2204450d02200720092008280210" - "1181808080008080808000450d000b41010f0b200028021c200120022000" - "28022028020c11808080800080808080000f0b0240200720012002200828" - "020c1180808080008080808000450d0041010f0b41002104034002402005" - "2004470d0020052005490f0b200441016a21042007200920082802101181" - "808080008080808000450d000b2004417f6a2005490bdf04010c7f200141" - "7f6a21032000280204210420002802002105200028020821064100210741" - "002108410021094100210a02400340200a4101710d010240024020092002" - "4b0d000340200120096a210a0240024002400240200220096b220b41074b" - "0d0020022009470d01200221090c050b02400240200a41036a417c71220c" - "200a6b220d450d00410021000340200a20006a2d0000410a460d05200d20" - "0041016a2200470d000b200d200b41786a220e4d0d010c030b200b41786a" - "210e0b03404180828408200c2802002200418a94a8d000736b2000724180" - "828408200c41046a2802002200418a94a8d000736b200072714180818284" - "7871418081828478470d02200c41086a210c200d41086a220d200e4d0d00" - "0c020b0b410021000340200a20006a2d0000410a460d02200b200041016a" - "2200470d000b200221090c030b0240200d200b470d00200221090c030b20" - "0a200d6a210c2002200d6b20096b210b4100210002400340200c20006a2d" - "0000410a460d01200b200041016a2200470d000b200221090c030b200020" - "0d6a21000b200020096a220c41016a21090240200c20024f0d00200a2000" - "6a2d0000410a470d004100210a2009210d200921000c030b200920024d0d" - "000b0b20082002460d024101210a2008210d200221000b0240024020062d" - "0000450d00200541f48ec080004104200428020c11808080800080808080" - "000d010b200020086b210b4100210c024020002008460d00200320006a2d" - "0000410a46210c0b200120086a21002006200c3a0000200d210820052000" - "200b200428020c1180808080008080808000450d010b0b410121070b2007" - "0ba80101017f23808080800041306b220424808080800020042003360208" - "20042002360204200420012d00c80122033a000f024020034101460d0020" - "04420137021c200441013602142004419482c08000360210200441818080" - "800036022c2004200441286a3602182004200441046a3602282004410f6a" - "41c886c08000200441106a419c82c08000109680808000000b2000200141" - "c8011086818080001a200441306a2480808080000b140020012000280200" - "20002802041092808080000b4401017f23808080800041106b2204248080" - "8080002004200136020c20042000360208200441086a41b886c080002004" - "410c6a41b886c080002002200310d380808000000ba70101017f23808080" - "800041306b22042480808080002004200336020820042002360204200420" - "012d006822033a000f024020034101460d002004420137021c2004410136" - "02142004419482c08000360210200441818080800036022c200420044128" - "6a3602182004200441046a3602282004410f6a41c886c08000200441106a" - "419c82c08000109680808000000b2000200141e8001086818080001a2004" - "41306a2480808080000b45000240024020042003490d0020022004490d01" - "2000200420036b3602042000200120036a3602000f0b2003200420051099" - "80808000000b200420022005109a80808000000b0f0020002001200210fc" - "80808000000b0f0020002001200210f580808000000b4001017f23808080" - "800041106b2201248080808000200141086a200041014101419883c08000" - "108a80808000200128020c2100200141106a24808080800020000b9a0101" - "017f23808080800041b0016b2202248080808000200241086a2001280204" - "20012802084100413041a883c080001098808080000240200228020c4130" - "460d00200241106a41b883c08000109d80808000000b20024180016a2002" - "28020841301089818080001a200241106a20024180016a109e8080800020" - "00200241106a41c883c080004118109780808000200241b0016a24808080" - "80000b970101017f23808080800041c0006b22022480808080002002412b" - "36020c200241f880c08000360208200241e880c080003602142002200036" - "02102002410236021c200241cc8ec0800036021820024202370224200241" - "8280808000ad422086200241106aad843703382002418380808000ad4220" - "86200241086aad843703302002200241306a360220200241186a200110a4" - "80808000000ba50801077f23808080800041c0086b220224808080800020" - "012d0000220341077610a3808080002104200341067641017110a3808080" - "002105200341057641017110a3808080002106200241a0066a2001413010" - "86818080001a200220022d00a006411f713a00a006200241e8006a200241" - "a0066a10dc80808000200241b0076a410041301085818080001a200241c0" - "026a200241b0076a200241e8006a20022d00980122071090808080002002" - "4190056a10a8808080002002200520047110a380808000200610d2808080" - "007110a380808000200241c0026a10a9808080007110a38080800022013a" - "00f805200110d2808080002108200241a0066a200241c0026a10bd808080" - "0020024180046a200241a0066a200241c0026a10a780808000200241e007" - "6a20024180046a418089c0800010b98080800020024180046a200241e007" - "6a41c087c0800010df80808000200241a0066a20024180046a10bd808080" - "00200241a0066a200241e0076a10db808080002103200241f0026a200241" - "80046a41301086818080001a200220033a00a00320024100413010858180" - "800022024190086a2002200241f0026a2003109080808000200241a0066a" - "20024190086a10b28080800020024180046a41306a20024190086a200241" - "a0066a200620024190086a10de808080007310a380808000109080808000" - "20024180046a200241c0026a41301086818080001a20032004200510d280" - "8080007110a3808080007110a3808080002103200241a0066a2002418004" - "6a41e0001086818080001a200220033a008807200220053a008007200241" - "d0016a20024190056a200241a0066a200810aa8080800020022007200120" - "03200173410020086b71737110a3808080003a00b802200241e8006a10a8" - "808080002002200241e8006a200241d0016a20022d00b802220310aa8080" - "8000200241a0066a200210a58080800020024190056a200241a0066a10e4" - "8080800020024180046a20024190056a10e480808000200241f0026a2002" - "4180046a10e58080800020024190056a200241e8001086818080001a2002" - "4190056a41b089c0800010dd80808000200241a0066a20024190056a10a5" - "80808000200241b0076a200241f0026a200241a0066a41e0006a220510a7" - "80808000200241e0076a200241a0066a200241f0026a41e0006a220110a7" - "8080800020024190086a200241f0026a41306a200510a780808000200241" - "80046a200241a0066a41306a200110a7808080002003200110a980808000" - "2201200510a98080800022057110a380808000200110d280808000200510" - "d2808080007110a380808000200241b0076a200241e0076a10db80808000" - "7110a38080800020024190086a20024180046a10db808080007110a38080" - "80007210a3808080007110a38080800021052000200241e8001086818080" - "0020053a0068200241c0086a2480808080000b970101017f238080808000" - "41c0026b2203248080808000200341086a20012002410041e00041e083c0" - "80001098808080000240200328020c41e000460d00200341106a41f083c0" - "8000109d80808000000b200341e0016a200328020841e000108981808000" - "1a200341106a200341e0016a10a0808080002000200341106a41c883c080" - "004118109480808000200341c0026a2480808080000bff1d02137f017e23" - "808080800041a0276b220224808080800020012d0000220341077610a380" - "8080002104200341067641017110a3808080002105200341057641017110" - "a380808000210620024180106a200141301086818080001a200220022d00" - "8010411f713a008010200241a0216a20024180106a10dc80808000200241" - "80226a200141306a10dc80808000200241e01f6a41004130108581808000" - "1a200241801f6a200241e01f6a200241a0216a20022d00d0212207109080" - "80800020022d00b0222101200241c0206a410041301085818080001a2002" - "41e0226a200241c0206a20024180226a2001109080808000200241e0226a" - "41306a200241801f6a41301086818080001a200241e00d6a10e780808000" - "2002200520047110a380808000200610d2808080007110a3808080002002" - "41e0226a10e0808080007110a38080800022033a00a80f200310d2808080" - "00210820024180106a200241e0226a10ba80808000200241c00b6a200241" - "80106a200241e0226a10b380808000200241c0236a200241c00b6a41e089" - "c0800010bc80808000200241c0236a10e08080800021032002410041e000" - "108581808000220220033a0060200310d2808080002109200241a0246a20" - "0241c0236a41a088c0800010e38080800020024180106a200241a0246a10" - "ba8080800020024180256a20024180106a200241c0236a10b38080800020" - "0241e0256a200241a0246a200241c0236a10b38080800020024180106a20" - "0241e0256a41306a10b28080800020024180106a41306a200241e0256a41" - "30108681808000210a200241d0016a41306a410041301085818080001a20" - "0241d0016a41e086c0800041301086818080001a200241c0266a200241d0" - "016a10e28080800020024180256a200241c0266a10c28080800021032002" - "41c00b6a20024180106a41e0001086818080001a200220033a00a00c2003" - "10d280808000210b200a41004130108581808000210320024180106a41e0" - "86c0800041301086818080001a20024180076a20024180256a2002418010" - "6a10bc8080800020024198036a20024180076a41d088c0800010e3808080" - "0020024180106a20024198036a200241e0256a10b3808080002002410110" - "a3808080003a00e01020024180076a200241c00b6a20024180106a200b10" - "da80808000200241c00b6a410041e0001085818080001a20024198036a20" - "0241c00b6a20024180076a20022d00e007220a10b0808080002002418010" - "6a20024198036a10ba80808000200a20024180106a200241c0236a10c280" - "8080007110a380808000210a20024180106a20024198036a41e000108681" - "8080001a2002200a3a00e01020024180076a200220024180106a200910da" - "808080002002410041e00010858180800022024198036a20022002418007" - "6a20022d00e007220910b08080800020024180106a20024198036a10e280" - "808000200241c00b6a41e0006a220b20024198036a20024180106a200620" - "024198036a41306a220a10de80808000200a10a98080800020024198036a" - "10de808080007110a3808080007210a3808080007310a38080800010b080" - "808000200241c00b6a200241e0226a41e0001086818080001a2009200420" - "0510d2808080007110a3808080007110a380808000210420024180106a20" - "0241c00b6a41c0011086818080001a200220043a00c811200220053a00c0" - "11200241c00b6a200241e00d6a20024180106a200810d980808000200120" - "0420022d00a80f220573410020086b712005737110a38080800021012002" - "200241c00b6a41c801108681808000220241cc016a200241c00b6a41cc01" - "6a280000360000200220022800890d3600c9012002200120077110a38080" - "8000220c3a00c80120024198036a10e780808000200241d0016a20024198" - "036a2002200c10d980808000200241e0046a200241d0016a10e880808000" - "200241c00b6a410041301085818080001a200242ba8a92abf1a7dbf21437" - "03980c200242e8a0ee96fe89bcf2143703900c200242a4a0a0f4c7f1c686" - "a27f3703880c200242acfced84e38c82c4d0003703800c200242d5cb9694" - "b3cac8f92a3703f80b200242c38bd5b3c8bcf286897f3703f00b200242d2" - "8ff6dfdbdddf950e3703b80e2002429df8bab6e9ac96d12d3703b00e2002" - "42a7a9d3d3fd9088e5513703a80e200242f1fdbada86bba3842f3703a00e" - "200242fcfcc9d492d8f78b5c3703980e200242da9f8cd5a5f4e9e7fb0037" - "03900e200242c8bd89ecc7dfe4ea0b3703880e200242b9e1f3e3fac9d3bc" - "1d3703800e20024298fcc0c8d1dfcad6927f3703f80d200242b2ee88db88" - "999194383703f00d200242838386b6d8a788cac2003703e80d200242d1b5" - "f2aada8bd6973e3703e00d2003200241e0046a41306a10b2808080002002" - "4180106a200241e0046a41301086818080001a20024180076a2002418010" - "6a200241c00b6a10b3808080002003200241f0056a10b280808000200241" - "80106a200241e0046a41e0006a220141301086818080001a20024180076a" - "41e0006a220d20024180106a200241e00d6a10b3808080002003200241d0" - "066a10b28080800020024180106a200241e0046a41c0016a220541301086" - "818080001a20024180076a41c0016a20024180106a41e000108681808000" - "210e2003410041301085818080001a20024180106a41e086c08000413010" - "86818080001a200241a0096a410041e0001085818080001a200241a0096a" - "41e0006a20024180106a41e0001086818080002109200241a0096a41c001" - "6a410041e000108581808000210a200241c0266a41306a210f2002418010" - "6a41e0006a2110200241e00d6a41e0006a211120024180106a41c0016a21" - "12200241c00b6a41c0016a2113200241e00d6a41c0016a21144280808280" - "8080a080e9002115024003402015500d01200241e0196a200110ba808080" - "00200241c01a6a200241e0196a200241e0196a10bc80808000200241a01b" - "6a200241c01a6a200241c01a6a10bc80808000200241801c6a200241a01b" - "6a200241a01b6a10bc80808000200241e01c6a2001200510b38080800020" - "0241c01d6a200510ba80808000200241a01e6a200241c01d6a41c08ac080" - "0010b380808000200241801f6a200241a01e6a200241801c6a10b3808080" - "00200241e01f6a200241e0196a200241a01e6a10bc80808000200241c020" - "6a200241e01c6a200241801c6a10b380808000200241a0216a200241a01e" - "6a200241a01e6a10bc8080800020024180226a200241a0216a200241a01e" - "6a10bc80808000200241e0226a200241e0196a20024180226a10bb808080" - "00200241c0236a200241e0226a200241e01f6a10b380808000200241a024" - "6a200241801f6a200241c0236a10bc8080800020024180256a200241e004" - "6a200110b380808000200241e0256a200241e0226a20024180256a10b380" - "808000200241e00d6a200241e0256a200241e0256a10bc80808000201120" - "0241a0246a41e00010868180800021082014200241c0206a41e000108681" - "8080002107200f410041301085818080001a200241c0266a41e086c08000" - "41301086818080001a20024180106a410041e0001085818080001a201020" - "0241c0266a41e00010868180800021042012410041e00010858180800021" - "06200241c00b6a200241e00d6a20024180106a200510e080808000220310" - "b080808000200b20082004200310b080808000201320072006200310b080" - "808000200241e0046a200241c00b6a41a0021086818080001a0240201542" - "0183500d00200241a0126a200241a0096a200241e0046a10b38080800020" - "024180136a2009200110b380808000200241e0136a200a200510b3808080" - "00200241c0146a200241a0096a200910bc80808000200241a0156a200241" - "e0046a200110bc8080800020024180166a200241c0146a200241a0156a10" - "b380808000200241e0166a200241a0126a20024180136a10bc8080800020" - "0241c0176a20024180166a200241e0166a10bb80808000200241a0186a20" - "09200a10bc8080800020024180196a2001200510bc80808000200241e019" - "6a200241a0186a20024180196a10b380808000200241c01a6a2002418013" - "6a200241e0136a10bc80808000200241a01b6a200241e0196a200241c01a" - "6a10bb80808000200241801c6a200241a0096a200a10bc80808000200241" - "e01c6a200241e0046a200510bc80808000200241c01d6a200241801c6a20" - "0241e01c6a10b380808000200241a01e6a200241a0126a200241e0136a10" - "bc80808000200241801f6a200241c01d6a200241a01e6a10bb8080800020" - "0241e01f6a200241a0126a200241a0126a10bc80808000200241c0206a20" - "0241e01f6a200241a0126a10bc80808000200241a0216a200241e0136a41" - "c08ac0800010b38080800020024180226a20024180136a200241a0216a10" - "bc80808000200241e0226a20024180136a200241a0216a10bb8080800020" - "0241c0236a200241801f6a41c08ac0800010b380808000200241a0246a20" - "0241a01b6a200241c0236a10b38080800020024180256a200241c0176a20" - "0241e0226a10b38080800020024180106a20024180256a200241a0246a10" - "bb80808000200241e0256a200241c0236a200241c0206a10b38080800020" - "0241c0266a200241e0226a20024180226a10b3808080002004200241c026" - "6a200241e0256a10bc80808000200241c00b6a200241c0206a200241c017" - "6a10b380808000200241e00d6a20024180226a200241a01b6a10b3808080" - "002006200241e00d6a200241c00b6a10bc80808000200241a0096a200241" - "80106a41a0021086818080001a0b201542018821150c000b0b2002418010" - "6a41e0006a200910e28080800020024180106a41c0016a200a41e0001086" - "818080001a20024180106a200241a0096a41e0001086818080001a200241" - "a0096a20024180106a41a0021086818080001a200241c0266a2002418007" - "6a200241a0096a41c0016a220110b380808000200241c00b6a200241a009" - "6a200e10b380808000200241e00d6a200d200110b3808080002002418010" - "6a200241a0096a41e0006a200e10b380808000200e10e080808000220520" - "0110e08080800022017110a380808000200510d280808000200110d28080" - "80007110a380808000200241c0266a200241c00b6a10c2808080007110a3" - "80808000200241e00d6a20024180106a10c2808080007110a38080800072" - "10a380808000200c7110a38080800021012000200241d0016a41c8011086" - "8180800020013a00c801200241a0276a2480808080000ba0d50103097f25" - "7e347f23808080800041e0ec006b2200248080808000200042d2b4bbf88c" - "a0d28d053700f40c2000428dcfdee5fd81c2bb0c3700ec0c200042afbed3" - "efd9fc81acea003700e40c20004283c4c699c3e0e5bf313700dc0c200042" - "869e99a9baa4ebe5e5003700d40c2000428dbfe3e0ae86d0a7b27f3700cc" - "0c200042908484d9e8fa99f80e3700c40c2000428bdfe7adc3a8cae04f37" - "00bc0c200042d687f295e888f880cd003700b40c20004281ddcf86b5f2d0" - "cf633700ac0c200042aef2a7aaae91d5accb003700a40c200042eb8fbebf" - "aee5caf4967f37009c0c200042b9b3d69fbf86ace8bb7f3700940c200042" - "d4fa86d5a0e3d296a87f37008c0c200042c5eddc9291a0c9e3a27f370084" - "0c2000428594fecef0de91d0643700fc0b20004289ae81b0d7a1feb5d300" - "3700f40b200042d4f18391eaffb8ed2e3700ec0b2000428cc8d9c6afddd3" - "d2ca003700e40b200042bca4908cdbc4caa54e3700dc0b200042b9cfe7bf" - "d99fbcbd563700d40b200042a4f788c3999fcac2c6003700cc0b200042b7" - "93c2cbbcbec3ee8e7f3700c40b200042a188aeeaaf8e90ba9b7f3700bc0b" - "200042c1fb969fd3cb97a0f5003700b40b200042ff9ce790fc9fe0fa6837" - "00ac0b200042b2dcb096dfcda7b9293700a40b200042a9e3f3c0c2c5cf85" - "2a37009c0b200042ad95c395bdd085ec393700940b200042c1f0c9e1f6d5" - "88e04537008c0b200042cfe1a7fed79ab1b2da003700840b200042d38490" - "85a5b6dff17d3700fc0a200042daf4a7a781f39dc7f8003700f40a200042" - "b88d9b949dd3aa86713700ec0a20004286b08ace96d5b8e0493700e40a20" - "0042e291f4f2d7e689e0443700dc0a200042c188fdead38de5d7f1003700" - "d40a200042fec2c2f2fb858b84283700cc0a200042fe8ebfddfaafafefec" - "003700c40a20004291f5b996b996cbc8bf7f3700bc0a200042b497cfc0d9" - "e3f284043700b40a2000428c9691f2e7bca4ec2d3700ac0a20004287e0c3" - "c29eccb3d21c3700a40a200042c8bbf68fceb0ad9eda0037009c0a200042" - "85c5e3e89284a997fd003700940a20004297bd8ec1effea3935437008c0a" - "200042eea8f8adc2cdbed9bb7f3700840a200042f5a3a4828bfd9ac1ac7f" - "3700fc09200042a087bbac98e0e282827f3700f4092000429a8683e6d8cc" - "ddd7113700ec09200042f0e1a982ee8890e33b3700e40920004286f6f2ba" - "80bf8bc3d5003700dc0920004297cfaad29bac9ec8243700d409200042c9" - "d3b292ffc082e01e3700cc09200042a9a3ffacc691beef6a3700c4092000" - "42a2d1f7c2ff94dce2543700bc09200042c78cfef2b8eabef8713700b409" - "20004286edaddda1fbf6baa37f3700ac09200042fdddbb9dedd1e9ef3337" - "00a409200042c6b2d8f2a9dae59d9f7f37009c09200042b59fb2d0b3e4cf" - "e32337009409200042c5c8c2fe9f869487c00037008c09200042ee91eb8f" - "c9a9c69cd1003700840920004283afa5ac9ded86b7253700fc08200042be" - "b9e4bccb88c99f3c3700f408200042c4d7d7c08b8db9e7f5003700ec0820" - "0042bf948bc7d7b1b0fcc1003700e4082000429a9ed5eea2d281c0e70037" - "00dc08200042acf185b19c87b3c3dd003700d40820004294bcf3c5dec192" - "ebb67f3700cc082000429db89ddb8fc9add13b3700c408200042e99baac8" - "a8faa582817f3700bc08200042daccdaad88c1f9b35b3700b408200042b5" - "d48be3dada8f8b223700ac08200042bdfdafd8a0e7aee4d8003700a40820" - "0042b9a7fddeeba08a8a3e37009c08200042e893cdd1ffdb94af08370094" - "08200042b58bef84d587bf842937008c08200042f4d8c597c3f6bd9f5a37" - "008408200042b3ccedc1b3d5cb987f3700fc07200042e0a38ecbbad9b6b8" - "b97f3700f407200042918cc8bfb089f7ab2f3700ec07200042dca8f8e4f3" - "82aee38f7f3700e407200042a3bfc29bc5d8edebca003700dc072000428e" - "81e4d981f589f1283700d40720004296f48083b9fcdab5b67f3700cc0720" - "0042cf938386a9d3d78a023700c4072000429687f1eff8ebacafef003700" - "bc072000429ef0afffc392fc88163700b407200042dbcda6cadfc8f38797" - "7f3700ac07200042cec2c1f9b5a7ec8e773700a407200042a5c192ecc6ad" - "99ef8f7f37009c07200042fd908df7cd8eeaab1837009407200042b18585" - "d2b981fac47637008c072000428af4e7cfa4fac8c4d70037008407200042" - "d6e7eeadc1c4f395a07f3700fc06200042a394d5b790978ebcec003700f4" - "0620004284f5dcaa92b5c09f663700ec06200042dcbedda48ae58eebe000" - "3700e406200042ac8bc7ea9baff0cf1b3700dc06200041940d6a42003700" - "002000418c0d6a4200370000200041840d6a4200370000200042003700fc" - "0c2000419c0d6a200041dc066a4130108980808000200041a80d6a200041" - "9c0d6a109c80808000200041940e6a200041dc066a41306a413010898080" - "8000200041a00e6a200041940e6a109c808080002000418c0f6a200041dc" - "066a41e0006a41e000108980808000200041980f6a20002802900f200028" - "02940f109f80808000200041e4106a2000419c086a41e000108980808000" - "200041f0106a20002802e81020002802ec10109f80808000200041bc126a" - "200041fc086a4130108980808000200041c8126a200041bc126a109c8080" - "8000200041b4136a200041ac096a41e000108980808000200041c0136a20" - "002802b81320002802bc13109f8080800020004188156a2000418c0a6a41" - "900110898080800020004194156a41086a22014100360200200042808080" - "80800137029415200041d0066a200028028c152202200028029015220341" - "004130418084c08000109880808000200041a0156a20002802d006200028" - "02d406108980808000200041b0156a200041a0156a109c80808000200041" - "94156a200041b0156a419084c08000108780808000200041c8066a200220" - "03413041e00041a084c08000109880808000200041b0156a20002802c806" - "20002802cc0610898080800020002802a01520002802a415108480808000" - "200041a0156a41086a2204200041b0156a41086a22052802003602002000" - "20002902b0153703a015200041b0156a200041a0156a109c808080002000" - "4194156a200041b0156a41b084c08000108780808000200041c0066a2002" - "200341e00041900141c084c08000109880808000200041b0156a20002802" - "c00620002802c40610898080800020002802a01520002802a41510848080" - "800020042005280200360200200020002902b0153703a015200041b0156a" - "200041a0156a109c8080800020004194156a200041b0156a41d084c08000" - "108780808000200041c81c6a200128020036020020002000290294153703" - "c01c200041b0156a200041a80d6a41e8001086818080001a200041b0156a" - "41e8006a200041a00e6a41e8001086818080001a20004180176a20004198" - "0f6a41c8011086818080002106200041c8186a200041f0106a41c8011086" - "818080002107200041901a6a200041c8126a41e8001086818080001a2000" - "41f81a6a200041c0136a41c8011086818080002108200041f8326a200041" - "9c0b6a109e80808000200041d01c6a200041f8326a41e084c08000411710" - "9780808000200041f8326a200041cc0b6a10a080808000200041b81d6a20" - "0041f8326a41f784c080004117109480808000200041f8326a200041ac0c" - "6a109e80808000200041801f6a200041f8326a418e85c080004117109780" - "808000200041e81f6a200041d01c6a41e8001086818080001a200041e81f" - "6a41e8006a200041b81d6a41c8011086818080001a20004198226a200041" - "801f6a41e8001086818080001a200041a0e8006a41c00041201080808080" - "0002400240024002400240024020002802a4684101470d00200041b8066a" - "20002802a8684108412041d880c08000108a80808000200041003602c85b" - "200020002802bc0622033602c45b200020002802b80622023602c05b2000" - "41f8326a41c0004120108080808000024020002802fc324101470d004100" - "21050240200220002802803322014f0d00200041b0066a200041c0db006a" - "410020014120108b8080800020002802b0062202418180808078470d0520" - "002802c45b210320002802c85b21050b200041dc0c6a2102200320054105" - "746a210341c000210103402001450d03200041b0046a2002290000220942" - "0042edb8ca9f8fb2facc494200108781808000200041c0046a2009420042" - "a3b8c9bcb8b9bbb62b4200108781808000200041d0046a20094200428ff3" - "d092e792c5e9054200108781808000200041e0046a200942004291fee7fa" - "99bbb6a4074200108781808000200041f0056a2002290008220a420042ed" - "b8ca9f8fb2facc49420010878180800020004180066a200a420042a3b8c9" - "bcb8b9bbb62b420010878180800020004190066a200a4200428ff3d092e7" - "92c5e9054200108781808000200041a0066a200a42004291fee7fa99bbb6" - "a4074200108781808000200041b0056a2002290010220b420042edb8ca9f" - "8fb2facc494200108781808000200041c0056a200b420042a3b8c9bcb8b9" - "bbb62b4200108781808000200041d0056a200b4200428ff3d092e792c5e9" - "054200108781808000200041e0056a200b42004291fee7fa99bbb6a40742" - "00108781808000200041f0046a2002290018220c420042edb8ca9f8fb2fa" - "cc49420010878180800020004180056a200c420042a3b8c9bcb8b9bbb62b" - "420010878180800020004190056a200c4200428ff3d092e792c5e9054200" - "108781808000200041a0056a200c42004291fee7fa99bbb6a40742001087" - "81808000200041a0046a20002903b004220d42ffffffff6f7e220e420042" - "8180808070420010878180800020004190046a200e420042feb7f9ffaf80" - "e9ded3004200108781808000200041c0036a200e42004285b087cd8081f6" - "9c334200108781808000200041f0026a200e420042c8faf5ccb2eae9f6f3" - "00420010878180800020004180046a20002903f005220f20002903c00422" - "10200041b0046a41086a2903007c22117c22122000290390047c22132000" - "41a0046a41086a290300200d20002903a004220e7c200e54ad7c7c220d42" - "ffffffff6f7e220e42004281808080704200108781808000200041f0036a" - "200e420042feb7f9ffaf80e9ded3004200108781808000200041e0036a20" - "0e42004285b087cd8081f69c334200108781808000200041d0036a200e42" - "0042c8faf5ccb2eae9f6f3004200108781808000200041b0036a20004190" - "046a41086a2903002013201254ad7c200d201354ad7c221420002903c003" - "7c2213200041c0046a41086a2903002011201054ad7c221520002903d004" - "7c22102000290380067c2211200041f0056a41086a2903002012200f54ad" - "7c7c221220002903b0057c22167c220f20002903f0037c22172000418004" - "6a41086a290300200029038004220e200d7c200e54ad7c7c220d42ffffff" - "ff6f7e220e42004281808080704200108781808000200041a0036a200e42" - "0042feb7f9ffaf80e9ded300420010878180800020004190036a200e4200" - "4285b087cd8081f69c33420010878180800020004180036a200e420042c8" - "faf5ccb2eae9f6f3004200108781808000200041e0026a200041f0036a41" - "086a2903002017200f54ad7c200d201754ad7c221820002903e0037c2217" - "200041c0036a41086a2903002013201454ad7c200f201354ad7c22192000" - "2903f0027c2213200041d0046a41086a2903002010201554ad7c221a2000" - "2903e0047c220f2000290390067c221420004180066a41086a2903002011" - "201054ad7c2012201154ad7c7c221020002903c0057c2211200041b0056a" - "41086a2903002016201254ad7c7c221220002903f0047c221b7c221c7c22" - "1520002903a0037c2216200041b0036a41086a29030020002903b003220e" - "200d7c200e54ad7c7c220d42ffffffff6f7e220e42004281808080704200" - "108781808000200041d0026a200e420042feb7f9ffaf80e9ded300420010" - "8781808000200041c0026a200e42004285b087cd8081f69c334200108781" - "808000200041b0026a200e420042c8faf5ccb2eae9f6f300420010878180" - "8000200041d0036a41086a290300211d20004180056a41086a290300211e" - "200041d0056a41086a290300211f200041a0066a41086a29030021202000" - "2903e00521212000290390052122200029038003212320004180036a4108" - "6a290300212420004190036a41086a290300212520004190056a41086a29" - "03002126200041e0056a41086a290300212720002903a005212820002903" - "b0022129200041b0026a41086a290300212a20002903c002212b200041c0" - "026a41086a290300212c200020002903d002222d200041e0046a41086a29" - "0300200f201a54ad7c221a20002903a0067c220e20004190066a41086a29" - "03002014200f54ad7c2010201454ad7c7c220f20002903d0057c22142000" - "41c0056a41086a2903002011201054ad7c2012201154ad7c7c2210200029" - "0380057c2211200041f0046a41086a290300201b201254ad7c7c22122000" - "41f0026a41086a2903002013201954ad7c201c201354ad7c7c2213200029" - "03d0037c2219200041e0036a41086a2903002017201854ad7c2015201754" - "ad7c7c22172000290390037c2218200041a0036a41086a29030020162015" - "54ad7c200d201654ad7c7c22167c2215200041e0026a41086a2903002000" - "2903e002221b200d7c201b54ad7c7c221b3703f8322000202b2023202220" - "212020200e201a54ad7c200f200e54ad7c221a7c220e201f2014200f54ad" - "7c2010201454ad7c7c220d7c220f201e2011201054ad7c2012201154ad7c" - "7c22102013201254ad7c2212201d2019201354ad7c2017201954ad7c7c22" - "137c221120252018201754ad7c2016201854ad7c7c22177c2214200041d0" - "026a41086a2903002015202d54ad7c201b201554ad7c7c22153703803320" - "0020292012201054ad2013201254ad7c221620282027200e201a54ad7c20" - "0d200e54ad7c22197c220e2026200f200d54ad7c2010200f54ad7c7c2210" - "7c221220242011201354ad7c2017201154ad7c7c22137c220d202c201420" - "1754ad7c2015201454ad7c7c22113703883320002012201654ad20132012" - "54ad7c200041a0056a41086a290300200e201954ad7c2010200e54ad7c7c" - "202a200d201354ad7c2011200d54ad7c7c37039033200041a0e8006a2000" - "41f8326a10a28080800020002903a068210e20002903a868211220002903" - "b068211320002903b868210d200942ffffffff0f7c200954ad427f7c2209" - "2009200a7c220a200954ad7c200a4282c88680d0ff96a1ac7f7c200a54ad" - "7c427f7c423f872209200b20097c2209200b54ad7c200942fbcff8b2fffe" - "89e34c7c200954ad7c427f7c423f872209200c20097c2209200c54ad7c20" - "0942b8858ab3cd9596898c7f7c200954ad7ca741016a41017110a3808080" - "0021042000411836028457200041a585c0800036028057200020043a00c0" - "52200441ff01714101470d04200341186a200d370300200341106a201337" - "0300200341086a20123703002003200e370300200341206a210320054101" - "6a210520022001412020014120491b22046a2102200120046b21010c000b" - "0b2000410036028833200041013602fc32200041d085c080003602f83220" - "00420437028033200041f8326a41d880c0800010a480808000000b200041" - "0036028833200041013602fc32200041d085c080003602f8322000420437" - "028033200041f8326a41d880c0800010a480808000000b20002802c45b21" - "2e20002802c05b212f200541016a20002802c81c470d0220004180236a20" - "002802c41c220210a580808000200241e8006a2130200041d4d2006a2131" - "200041c0d2006a41086a2132200041a0ce006a2133200041c0db006a4130" - "6a2134200041a0dc006a2135410021040340024020042005470d00200041" - "f8326a20004180236a41e0006a10a68080800041002102200041a0e8006a" - "410041301085818080001a200041c0db006a200041a0e8006a200041f832" - "6a20002d00a833109080808000200041a0e8006a20004180236a200041c0" - "db006a10a780808000200041a0e8006a41306a20004180236a41306a2000" - "41c0db006a10a7808080002000410010a3808080003a008069200041f832" - "6a10a88080800020004190246a200041a0e8006a200041f8326a200041c0" - "db006a10a98080800010aa80808000200041f8246a200041b81d6a10ab80" - "80800020004188256a200710ab8080800020004198256a200810ab808080" - "00200041a8256a200610ab80808000200041b82e6a20004190246a108f80" - "808000200041c0376a200041801f6a108f80808000200041803c6a200041" - "b0156a108f808080002000200041a8256a3602942a2000200041803c6a36" - "02902a200020004198256a36028c2a2000200041c0376a3602882a200020" - "004188256a3602842a2000200041b82e6a3602802a2000200041f8246a36" - "02fc292000200041e81f6a3602f829200042043702c4642000200041f829" - "6a3602c064200041b8256a10ac80808000200041f8326a41a0026a210520" - "0041b8256a41a0026a213620004180d7006a41c0016a213320004180d700" - "6a41e0006a2134200041c0db006a41e0036a2135200041a0e8006a41e003" - "6a2132200041c0db006a4180036a2106200041a0e8006a4180036a210720" - "0041c0db006a41a0026a2108200041a0e8006a41a0026a2131200041c0d2" - "006a41c0016a2137200041c0d2006a41e0006a2138200041c0db006a41c0" - "016a2139200041a0e8006a41c0016a213a200041c0db006a41e0006a213b" - "200041a0e8006a41e0006a213c41c000213d034002400240203d450d0020" - "02410171210342808082808080a080e900203d417f6a223d413f71ad88a7" - "21022003450d02200041f8326a200041b8256a41c0041086818080001a20" - "0041b8256a200041c0e4006a200041f8326a10ad80808000200241017145" - "0d01200041c0db006a200041b8256a41c0041086818080001a20002802c4" - "64410374210120002802c064210320002802c8642130024003402001450d" - "01200328020422042d000c20032802002d00607210a38080800021022000" - "41a0e8006a200041c0db006a200441046a280200200441086a2802002030" - "41dc8cc0800010ae80808000200328020010af80808000200041c0d2006a" - "200041a0e8006a200041c0db006a200210b0808080002038203c203b2002" - "10b0808080002037203a2039200210b08080800020004180d7006a203120" - "08200210b080808000203420072006200210b08080800020332032203520" - "0210b080808000200041f8326a200041c0d2006a41a0021086818080001a" - "200520004180d7006a41a0021086818080001a200041c0db006a200041f8" - "326a41c0041086818080001a200141786a2101200341086a21030c000b0b" - "2000203041016a3602c864200041b8256a200041c0db006a41c004108681" - "8080001a0c010b200041f8326a200041b8256a41c0041086818080001a20" - "0041b8256a200041c0e4006a200041f8326a10ad80808000200041f8326a" - "41a0026a223e203610b180808000200041f8326a200041b8256a41a00210" - "86818080001a200041b8256a200041f8326a41c0041086818080001a2000" - "41f8296a200041b8256a41c0041086818080001a200041c0d2006a41306a" - "2230200041b8256a41306a10b280808000200041c0d2006a200041b8256a" - "41301086818080001a200041c0db006a41306a2201200041b8256a419001" - "6a10b280808000200041c0db006a200041b8256a41e0006a413010868180" - "80001a200041a0e8006a41306a2203200041b8256a41f0016a10b2808080" - "00200041a0e8006a200041b8256a41c0016a41301086818080001a200041" - "f8326a410041301085818080001a200042c18e8ea3d58c88f8183703d033" - "200042d2a1c19ee8addffc033703c8332000429e97eb8de0d783db8e7f37" - "03c03320004295b7949cfdd590b8d8003703b833200042d2cbb6fee1c8c8" - "d5dd003703b033200042f1e0c7b3c8bcf2814d3703a83320004180d7006a" - "41e0006a2232200041c0db006a200041f8326a10b380808000200041f832" - "6a41306a410041301085818080002105200042ba8a92abf1a7dbf2143703" - "a033200042e8a0ee96fe89bcf21437039833200042a4a0a0f4c7f1c686a2" - "7f37039033200042acfced84e38c82c4d00037038833200042d5cb9694b3" - "cac8f92a37038033200042c38bd5b3c8bcf286897f3703f83220004180d7" - "006a41c0016a2204200041a0e8006a200041f8326a10b380808000200041" - "80d7006a200041c0d2006a41e0001086818080001a20004180ce006a4130" - "6a2202200041b8256a41d0026a10b28080800020004180ce006a200041b8" - "256a41a0026a41301086818080001a2030200041b8256a41b0036a10b280" - "808000200041c0d2006a200041b8256a4180036a41301086818080001a20" - "03200041b8256a4190046a10b280808000200041a0e8006a200041b8256a" - "41e0036a41301086818080001a200041f8326a410041301085818080001a" - "200042c18e8ea3d58c88f8183703d033200042d2a1c19ee8addffc033703" - "c8332000429e97eb8de0d783db8e7f3703c03320004295b7949cfdd590b8" - "d8003703b833200042d2cbb6fee1c8c8d5dd003703b033200042f1e0c7b3" - "c8bcf2814d3703a833200041c0db006a41e0006a2235200041c0d2006a20" - "0041f8326a10b3808080002005410041301085818080002133200042ba8a" - "92abf1a7dbf2143703a033200042e8a0ee96fe89bcf21437039833200042" - "a4a0a0f4c7f1c686a27f37039033200042acfced84e38c82c4d000370388" - "33200042d5cb9694b3cac8f92a37038033200042c38bd5b3c8bcf286897f" - "3703f832200041c0db006a41c0016a223b200041a0e8006a200041f8326a" - "10b380808000200041c0db006a20004180ce006a41e0001086818080001a" - "200042afff91c4a8fbbb87113703f86820004289bd83adbef9849c2e3703" - "f068200042d0d1a385a497e78d413703e86820004294a7e7acc2baa5a44f" - "3703e068200042ecf9a5e2bf8da8a1d8003703d868200042c6ac97e7d4d5" - "9afbb27f3703d068200042ebcded87fbc188f9083703c868200042cd9cab" - "eda5fde4f11c3703c068200042eed3f096abd9ebada37f3703b868200042" - "8fc5dc88cd998ff4977f3703b0682000429386aaa8abf2d7b4463703a868" - "200042e5a8e798abaaa584073703a068200041a0e8006a41e0006a410041" - "c0011085818080002108203e200041c0db006a200041a0e8006a10b48080" - "8000200041f8326a20004180d7006a41a0021086818080001a2002203310" - "b28080800020004180ce006a200041f8326a41301086818080001a200041" - "80d7006a41306a2207200041f8326a4190016a10b28080800020004180d7" - "006a200041f8326a41e0006a223f41301086818080001a2001200041f832" - "6a41f0016a10b280808000200041c0db006a200041f8326a41c0016a2240" - "41301086818080001a200041a0e8006a410041301085818080001a200042" - "c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f06820" - "00429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d80037" - "03e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf2" - "814d3703d068200041c0d2006a41e0006a223820004180d7006a200041a0" - "e8006a10b3808080002003410041301085818080002103200042ba8a92ab" - "f1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0" - "a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b06820" - "0042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703" - "a068200041c0d2006a41c0016a2234200041c0db006a200041a0e8006a10" - "b380808000200041c0d2006a20004180ce006a41e0001086818080001a20" - "0041c0c9006a41306a2205200041f8326a41d0026a10b280808000200041" - "c0c9006a203e41301086818080001a2002200041f8326a41b0036a10b280" - "80800020004180ce006a200041f8326a4180036a22414130108681808000" - "1a2001200041f8326a4190046a10b280808000200041c0db006a200041f8" - "326a41e0036a224241301086818080001a200041a0e8006a410041301085" - "818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8ad" - "dffc033703f0682000429e97eb8de0d783db8e7f3703e86820004295b794" - "9cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8682000" - "42f1e0c7b3c8bcf2814d3703d068203220004180ce006a200041a0e8006a" - "10b3808080002003410041301085818080002143200042ba8a92abf1a7db" - "f2143703c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7" - "f1c686a27f3703b868200042acfced84e38c82c4d0003703b068200042d5" - "cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820" - "04200041c0db006a200041a0e8006a10b38080800020004180d7006a2000" - "41c0c9006a41e0001086818080001a200042afff91c4a8fbbb8711370398" - "5c20004289bd83adbef9849c2e3703905c200042d0d1a385a497e78d4137" - "03885c20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1" - "d8003703f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87" - "fbc188f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3" - "f096abd9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20" - "00429386aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c0" - "5b2035410041c001108581808000213c200041a0e8006a41a0026a220320" - "004180d7006a200041c0db006a10b480808000200041a0e8006a200041c0" - "d2006a41a0021086818080001a2005204310b280808000200041c0c9006a" - "200041a0e8006a41301086818080001a2030200041a0e8006a4190016a22" - "4410b280808000200041c0d2006a200841301086818080001a2007200041" - "a0e8006a41f0016a224510b28080800020004180d7006a200041a0e8006a" - "41c0016a223a41301086818080001a200041c0db006a4100413010858180" - "80001a200042c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc" - "033703905c2000429e97eb8de0d783db8e7f3703885c20004295b7949cfd" - "d590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1" - "e0c7b3c8bcf2814d3703f05b20004180ce006a41e0006a2236200041c0d2" - "006a200041c0db006a10b380808000200141004130108581808000210120" - "0042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e0" - "5b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0" - "003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bc" - "f286897f3703c05b20004180ce006a41c0016a224620004180d7006a2000" - "41c0db006a10b38080800020004180ce006a200041c0c9006a41e0001086" - "818080001a20004180c5006a41306a2231200041a0e8006a41d0026a2247" - "10b28080800020004180c5006a200341301086818080001a2005200041a0" - "e8006a41b0036a224810b280808000200041c0c9006a200041a0e8006a41" - "80036a224941301086818080001a2007200041a0e8006a4190046a224a10" - "b28080800020004180d7006a200041a0e8006a41e0036a224b4130108681" - "8080001a200041c0db006a410041301085818080001a200042c18e8ea3d5" - "8c88f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb" - "8de0d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c2000" - "42d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f0" - "5b2038200041c0c9006a200041c0db006a10b38080800020014100413010" - "85818080002135200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96" - "fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042ac" - "fced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b20" - "0042c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db" - "006a10b380808000200041c0d2006a20004180c5006a41e0001086818080" - "001a200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e" - "3703d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5" - "a44f3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7" - "d4d59afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd" - "9cabeda5fde4f11c3703a057200042eed3f096abd9ebada37f3703985720" - "00428fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b4463703" - "8857200042e5a8e798abaaa58407370380572032410041c0011085818080" - "00213d200041c0db006a41a0026a2232200041c0d2006a20004180d7006a" - "10b480808000200041c0db006a20004180ce006a41a0021086818080001a" - "2031203510b28080800020004180c5006a200041c0db006a413010868180" - "80001a2002200041c0db006a4190016a224c10b28080800020004180ce00" - "6a203c41301086818080001a2030200041c0db006a41f0016a224d10b280" - "808000200041c0d2006a203b41301086818080001a20004180d7006a4100" - "41301085818080001a200042c18e8ea3d58c88f8183703d857200042d2a1" - "c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8572000" - "4295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd003703" - "b857200042f1e0c7b3c8bcf2814d3703b057200041c0c9006a41e0006a22" - "0620004180ce006a20004180d7006a10b380808000200741004130108581" - "8080002101200042ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89" - "bcf2143703a057200042a4a0a0f4c7f1c686a27f37039857200042acfced" - "84e38c82c4d00037039057200042d5cb9694b3cac8f92a37038857200042" - "c38bd5b3c8bcf286897f37038057200041c0c9006a41c0016a2207200041" - "c0d2006a20004180d7006a10b380808000200041c0c9006a20004180c500" - "6a41e0001086818080001a200041c0c0006a41306a2237200041c0db006a" - "41d0026a224e10b280808000200041c0c0006a203241301086818080001a" - "2031200041c0db006a41b0036a224f10b28080800020004180c5006a2000" - "41c0db006a4180036a225041301086818080001a2030200041c0db006a41" - "90046a225110b280808000200041c0d2006a200041c0db006a41e0036a22" - "5241301086818080001a20004180d7006a410041301085818080001a2000" - "42c18e8ea3d58c88f8183703d857200042d2a1c19ee8addffc033703d057" - "2000429e97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d800" - "3703c057200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bc" - "f2814d3703b057203620004180c5006a20004180d7006a10b38080800020" - "01410041301085818080002101200042ba8a92abf1a7dbf2143703a85720" - "0042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c686a27f3703" - "9857200042acfced84e38c82c4d00037039057200042d5cb9694b3cac8f9" - "2a37038857200042c38bd5b3c8bcf286897f370380572046200041c0d200" - "6a20004180d7006a10b38080800020004180ce006a200041c0c0006a41e0" - "001086818080001a200042afff91c4a8fbbb87113703985320004289bd83" - "adbef9849c2e37039053200042d0d1a385a497e78d413703885320004294" - "a7e7acc2baa5a44f37038053200042ecf9a5e2bf8da8a1d8003703f85220" - "0042c6ac97e7d4d59afbb27f3703f052200042ebcded87fbc188f9083703" - "e852200042cd9cabeda5fde4f11c3703e052200042eed3f096abd9ebada3" - "7f3703d8522000428fc5dc88cd998ff4977f3703d0522000429386aaa8ab" - "f2d7b4463703c852200042e5a8e798abaaa584073703c0522038410041c0" - "01108581808000213820004180d7006a41a0026a225320004180ce006a20" - "0041c0d2006a10b48080800020004180d7006a200041c0c9006a41a00210" - "86818080001a2037200110b280808000200041c0c0006a20004180d7006a" - "41301086818080001a200520004180d7006a4190016a10b2808080002000" - "41c0c9006a203d41301086818080001a200220004180d7006a41f0016a10" - "b28080800020004180ce006a200441301086818080001a200041c0d2006a" - "410041301085818080001a200042c18e8ea3d58c88f81837039853200042" - "d2a1c19ee8addffc03370390532000429e97eb8de0d783db8e7f37038853" - "20004295b7949cfdd590b8d80037038053200042d2cbb6fee1c8c8d5dd00" - "3703f852200042f1e0c7b3c8bcf2814d3703f05220004180c5006a41e000" - "6a2254200041c0c9006a200041c0d2006a10b38080800020304100413010" - "85818080002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96" - "fe89bcf2143703e052200042a4a0a0f4c7f1c686a27f3703d852200042ac" - "fced84e38c82c4d0003703d052200042d5cb9694b3cac8f92a3703c85220" - "0042c38bd5b3c8bcf286897f3703c05220004180c5006a41c0016a225520" - "004180ce006a200041c0d2006a10b38080800020004180c5006a200041c0" - "c0006a41e0001086818080001a200041803c6a41306a223020004180d700" - "6a41d0026a10b280808000200041803c6a205341301086818080001a2037" - "20004180d7006a41b0036a10b280808000200041c0c0006a20004180d700" - "6a4180036a41301086818080001a200220004180d7006a4190046a10b280" - "80800020004180ce006a20004180d7006a41e0036a41301086818080001a" - "200041c0d2006a410041301085818080001a200042c18e8ea3d58c88f818" - "37039853200042d2a1c19ee8addffc03370390532000429e97eb8de0d783" - "db8e7f3703885320004295b7949cfdd590b8d80037038053200042d2cbb6" - "fee1c8c8d5dd003703f852200042f1e0c7b3c8bcf2814d3703f052200620" - "0041c0c0006a200041c0d2006a10b3808080002039410041301085818080" - "002139200042ba8a92abf1a7dbf2143703e852200042e8a0ee96fe89bcf2" - "143703e052200042a4a0a0f4c7f1c686a27f3703d852200042acfced84e3" - "8c82c4d0003703d052200042d5cb9694b3cac8f92a3703c852200042c38b" - "d5b3c8bcf286897f3703c052200720004180ce006a200041c0d2006a10b3" - "80808000200041c0c9006a200041803c6a41e0001086818080001a200042" - "afff91c4a8fbbb87113703d84e20004289bd83adbef9849c2e3703d04e20" - "0042d0d1a385a497e78d413703c84e20004294a7e7acc2baa5a44f3703c0" - "4e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac97e7d4d59afbb2" - "7f3703b04e200042ebcded87fbc188f9083703a84e200042cd9cabeda5fd" - "e4f11c3703a04e200042eed3f096abd9ebada37f3703984e2000428fc5dc" - "88cd998ff4977f3703904e2000429386aaa8abf2d7b4463703884e200042" - "e5a8e798abaaa584073703804e2036410041c00110858180800021362000" - "41c0d2006a41a0026a2256200041c0c9006a20004180ce006a10b4808080" - "00200041c0d2006a20004180c5006a41a0021086818080001a2030203910" - "b280808000200041803c6a200041c0d2006a41301086818080001a203720" - "0041c0d2006a4190016a225710b280808000200041c0c0006a2038413010" - "86818080001a2005200041c0d2006a41f0016a225810b280808000200041" - "c0c9006a203441301086818080001a20004180ce006a4100413010858180" - "80001a200042c18e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc" - "033703d04e2000429e97eb8de0d783db8e7f3703c84e20004295b7949cfd" - "d590b8d8003703c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1" - "e0c7b3c8bcf2814d3703b04e2054200041c0c0006a20004180ce006a10b3" - "808080002002410041301085818080002102200042ba8a92abf1a7dbf214" - "3703a84e200042e8a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c6" - "86a27f3703984e200042acfced84e38c82c4d0003703904e200042d5cb96" - "94b3cac8f92a3703884e200042c38bd5b3c8bcf286897f3703804e205520" - "0041c0c9006a20004180ce006a10b38080800020004180c5006a20004180" - "3c6a41e0001086818080001a200041c0376a41306a2259200041c0d2006a" - "41d0026a225a10b280808000200041c0376a205641301086818080001a20" - "30200041c0d2006a41b0036a225b10b280808000200041803c6a200041c0" - "d2006a4180036a225c41301086818080001a2037200041c0d2006a419004" - "6a225d10b280808000200041c0c0006a200041c0d2006a41e0036a225e41" - "301086818080001a20004180ce006a410041301085818080001a200042c1" - "8e8ea3d58c88f8183703d84e200042d2a1c19ee8addffc033703d04e2000" - "429e97eb8de0d783db8e7f3703c84e20004295b7949cfdd590b8d8003703" - "c04e200042d2cbb6fee1c8c8d5dd003703b84e200042f1e0c7b3c8bcf281" - "4d3703b04e2006200041803c6a20004180ce006a10b38080800020024100" - "4130108581808000215f200042ba8a92abf1a7dbf2143703a84e200042e8" - "a0ee96fe89bcf2143703a04e200042a4a0a0f4c7f1c686a27f3703984e20" - "0042acfced84e38c82c4d0003703904e200042d5cb9694b3cac8f92a3703" - "884e200042c38bd5b3c8bcf286897f3703804e2007200041c0c0006a2000" - "4180ce006a10b380808000200041c0c9006a200041c0376a41e000108681" - "8080001a200042afff91c4a8fbbb87113703d84e20004289bd83adbef984" - "9c2e3703d04e200042d0d1a385a497e78d413703c84e20004294a7e7acc2" - "baa5a44f3703c04e200042ecf9a5e2bf8da8a1d8003703b84e200042c6ac" - "97e7d4d59afbb27f3703b04e200042ebcded87fbc188f9083703a84e2000" - "42cd9cabeda5fde4f11c3703a04e200042eed3f096abd9ebada37f370398" - "4e2000428fc5dc88cd998ff4977f3703904e2000429386aaa8abf2d7b446" - "3703884e200042e5a8e798abaaa584073703804e2036410041c001108581" - "8080002160200041b82e6a41a0026a200041c0c9006a20004180ce006a10" - "b480808000200041b82e6a20004180c5006a41a0021086818080001a2000" - "41a0e8006a200041f8296a10b58080800020004180ce006a200041f8296a" - "41a0026a226110b580808000200041f8326a20004180ce006a10b6808080" - "00200041c0c9006a200041a0e8006a200041f8326a10b780808000200041" - "f8326a2006200710b38080800020004180e0006a200041f8326a203310b8" - "8080800020004180e0006a41306a2230200041f8326a203310b980808000" - "200041f8326a200041c0c9006a10ba80808000200041a0e2006a200041f8" - "326a20004180e0006a10bb80808000200041f8326a200710ba8080800020" - "0041c0e4006a200041f8326a203310b880808000200041c0e4006a41306a" - "2236200041f8326a203310b980808000200041f8326a200041c0c9006a20" - "0610b380808000200041c0376a200041c0e4006a200041f8326a10bb8080" - "8000200041803c6a200610ba80808000200041f8326a200041c0c9006a20" - "0710b380808000200041c0c0006a200041803c6a200041f8326a10bb8080" - "8000200041a0e8006a2006200041c0c0006a10b380808000200041f8326a" - "2007200041c0376a10b380808000200041c0db006a200041a0e8006a2000" - "41f8326a10bc8080800020004180c5006a200041c0db006a203510b88080" - "80002031200041c0db006a203510b980808000200041f8326a200041c0c9" - "006a200041a0e2006a10b380808000200041c0d2006a20004180c5006a20" - "0041f8326a10bc80808000200041a0e8006a200041c0d2006a10bd808080" - "00200041f8326a203910bd80808000200041e0e6006a200041a0e8006a20" - "0041f8326a10b980808000200041c0db006a200041e0e6006a10a6808080" - "0020004180d7006a410041301085818080001a200041c0e7006a20004180" - "d7006a200041c0db006a20002d00f05b2202109080808000200041f8326a" - "200041c0d2006a200041c0e7006a10a780808000200041a0e8006a200041" - "c0e7006a10b28080800020332039200041a0e8006a10a780808000200041" - "a0e8006a200041f8326a41e0001086818080001a200020023a0080692000" - "4180d7006a410041e0001085818080001a200041c0db006a20004180d700" - "6a200041a0e8006a200210b080808000200041f8326a200041c0db006a20" - "0041a0e2006a10b380808000203f200041c0db006a200041c0376a10b380" - "8080002040200041c0db006a200041c0c0006a10b380808000200041c0db" - "006a200041f8326a41a0021086818080001a200020023a00e05d20004180" - "d7006a410041a0021085818080001a200041c0d2006a20004180d7006a20" - "0041c0db006a200210b0808080002038203d203c200210b0808080002034" - "2004203b200210b080808000200041a0e8006a200041f8296a200041c0d2" - "006a10b480808000200041f8326a200041c0d2006a10b180808000200320" - "61200041f8326a10b480808000200041f8326a200041a0e8006a41c00410" - "86818080001a200020023a00b837200041803c6a410041c0041085818080" - "001a200041c0db006a200041803c6a200041f8326a200210b08080800020" - "3c200041803c6a41e0006a203f200210b080808000203b200041803c6a41" - "c0016a2040200210b080808000200041a0e8006a200041803c6a41a0026a" - "203e200210b0808080002008200041803c6a4180036a2041200210b08080" - "8000203a200041803c6a41e0036a2042200210b080808000200041c0376a" - "200041c0db006a41a0021086818080001a200041c0376a41a0026a200041" - "a0e8006a41a0021086818080002161200041c0c0006a200041b82e6a2000" - "41c0376a10be80808000200041c0376a200041c0c0006a41c00410868180" - "80001a205f203710b28080800020004180ce006a200041c0c0006a413010" - "86818080001a2001200041c0c0006a4190016a10b28080800020004180d7" - "006a200041c0c0006a41e0006a41301086818080001a2035200041c0c000" - "6a41f0016a10b280808000200041c0db006a200041c0c0006a41c0016a41" - "301086818080001a200041a0e8006a410041301085818080001a200042c1" - "8e8ea3d58c88f8183703f868200042d2a1c19ee8addffc033703f0682000" - "429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590b8d8003703" - "e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7b3c8bcf281" - "4d3703d068203820004180d7006a200041a0e8006a10b380808000204341" - "0041301085818080002133200042ba8a92abf1a7dbf2143703c868200042" - "e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a27f3703b868" - "200042acfced84e38c82c4d0003703b068200042d5cb9694b3cac8f92a37" - "03a868200042c38bd5b3c8bcf286897f3703a0682034200041c0db006a20" - "0041a0e8006a10b380808000200041c0d2006a20004180ce006a41e00010" - "86818080001a2005200041c0c0006a41d0026a10b280808000200041c0c9" - "006a200041c0c0006a41a0026a223741301086818080001a205f200041c0" - "c0006a41b0036a10b28080800020004180ce006a200041c0c0006a418003" - "6a41301086818080001a2035200041c0c0006a4190046a10b28080800020" - "0041c0db006a200041c0c0006a41e0036a41301086818080001a200041a0" - "e8006a410041301085818080001a200042c18e8ea3d58c88f8183703f868" - "200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e7f37" - "03e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8" - "d5dd003703d868200042f1e0c7b3c8bcf2814d3703d068203d20004180ce" - "006a200041a0e8006a10b380808000203341004130108581808000210620" - "0042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c0" - "68200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0" - "003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bc" - "f286897f3703a0682004200041c0db006a200041a0e8006a10b380808000" - "20004180d7006a200041c0c9006a41e0001086818080001a200042afff91" - "c4a8fbbb87113703985c20004289bd83adbef9849c2e3703905c200042d0" - "d1a385a497e78d413703885c20004294a7e7acc2baa5a44f3703805c2000" - "42ecf9a5e2bf8da8a1d8003703f85b200042c6ac97e7d4d59afbb27f3703" - "f05b200042ebcded87fbc188f9083703e85b200042cd9cabeda5fde4f11c" - "3703e05b200042eed3f096abd9ebada37f3703d85b2000428fc5dc88cd99" - "8ff4977f3703d05b2000429386aaa8abf2d7b4463703c85b200042e5a8e7" - "98abaaa584073703c05b203c410041c00110858180800021432003200041" - "80d7006a200041c0db006a10b480808000200041a0e8006a200041c0d200" - "6a41a0021086818080001a2005200610b280808000200041c0c9006a2000" - "41a0e8006a41301086818080001a2039204410b280808000200041c0d200" - "6a200841301086818080001a2001204510b28080800020004180d7006a20" - "3a41301086818080001a200041c0db006a410041301085818080001a2000" - "42c18e8ea3d58c88f8183703985c200042d2a1c19ee8addffc033703905c" - "2000429e97eb8de0d783db8e7f3703885c20004295b7949cfdd590b8d800" - "3703805c200042d2cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bc" - "f2814d3703f05b2060200041c0d2006a200041c0db006a10b38080800020" - "35410041301085818080002133200042ba8a92abf1a7dbf2143703e85b20" - "0042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703" - "d85b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f9" - "2a3703c85b200042c38bd5b3c8bcf286897f3703c05b204620004180d700" - "6a200041c0db006a10b38080800020004180ce006a200041c0c9006a41e0" - "001086818080001a2031204710b28080800020004180c5006a2003413010" - "86818080001a2005204810b280808000200041c0c9006a20494130108681" - "8080001a2001204a10b28080800020004180d7006a204b41301086818080" - "001a200041c0db006a410041301085818080001a200042c18e8ea3d58c88" - "f8183703985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0" - "d783db8e7f3703885c20004295b7949cfdd590b8d8003703805c200042d2" - "cbb6fee1c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b20" - "38200041c0c9006a200041c0db006a10b380808000203341004130108581" - "8080002133200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89" - "bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced" - "84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042" - "c38bd5b3c8bcf286897f3703c05b203420004180d7006a200041c0db006a" - "10b380808000200041c0d2006a20004180c5006a41e0001086818080001a" - "200042afff91c4a8fbbb87113703d85720004289bd83adbef9849c2e3703" - "d057200042d0d1a385a497e78d413703c85720004294a7e7acc2baa5a44f" - "3703c057200042ecf9a5e2bf8da8a1d8003703b857200042c6ac97e7d4d5" - "9afbb27f3703b057200042ebcded87fbc188f9083703a857200042cd9cab" - "eda5fde4f11c3703a057200042eed3f096abd9ebada37f37039857200042" - "8fc5dc88cd998ff4977f370390572000429386aaa8abf2d7b44637038857" - "200042e5a8e798abaaa5840737038057203d410041c00110858180800021" - "072032200041c0d2006a20004180d7006a10b480808000200041c0db006a" - "20004180ce006a41a0021086818080001a200041c0c0006a200041c0db00" - "6a41c0041086818080001a200041c0c0006a200041c0376a10bf80808000" - "200041a0e8006a200041c0c0006a10c0808080002032200310b180808000" - "200041c0db006a200041a0e8006a41a0021086818080001a200041c0376a" - "200041c0db006a41c0041086818080001a20004180c5006a200041c0c000" - "6a10c180808000200041c0c9006a20004180c5006a10c080808000200041" - "80ce006a200041c0376a20004180c5006a10be80808000200041c0376a20" - "004180ce006a10c180808000200041b82e6a200041c0376a10c180808000" - "200041c0d2006a200041b82e6a10c180808000200041c0d2006a200041c0" - "c9006a10bf80808000200041c0c9006a200041c0d2006a10c18080800020" - "0320004180ce006a41a0026a10b180808000200041a0e8006a20004180ce" - "006a41a0021086818080001a20004180ce006a200041a0e8006a41c00410" - "86818080001a200041a0e8006a20004180ce006a200041c0c0006a10be80" - "808000200041c0c9006a200041a0e8006a10bf808080002003203710b180" - "808000200041a0e8006a200041c0c0006a41a0021086818080001a200041" - "80ce006a200041a0e8006a41c0041086818080001a200041c0376a200041" - "c0c0006a10bf80808000200041a0e2006a41306a2205205910b280808000" - "200041a0e2006a200041c0376a41301086818080001a2001200041c0376a" - "4190016a10b28080800020004180d7006a200041c0376a41e0006a413010" - "86818080001a2033200041c0376a41f0016a10b280808000200041c0db00" - "6a200041c0376a41c0016a41301086818080001a200041a0e8006a410041" - "301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1c1" - "9ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e868200042" - "95b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d8" - "68200042f1e0c7b3c8bcf2814d3703d068200041c0e4006a41e0006a2237" - "20004180d7006a200041a0e8006a10b38080800020064100413010858180" - "80002106200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bc" - "f2143703c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84" - "e38c82c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c3" - "8bd5b3c8bcf286897f3703a068200041c0e4006a41c0016a2235200041c0" - "db006a200041a0e8006a10b380808000200041c0e4006a200041a0e2006a" - "41e0001086818080001a2030200041c0376a41d0026a10b2808080002000" - "4180e0006a206141301086818080001a2005200041c0376a41b0036a10b2" - "80808000200041a0e2006a200041c0376a4180036a41301086818080001a" - "2033200041c0376a4190046a10b280808000200041c0db006a200041c037" - "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" - "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" - "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" - "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" - "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" - "808000200641004130108581808000213c200042ba8a92abf1a7dbf21437" - "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" - "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" - "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" - "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" - "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" - "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" - "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" - "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" - "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" - "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" - "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2043" - "410041c001108581808000213d200320004180d7006a200041c0db006a10" - "b480808000200041a0e8006a200041c0e4006a41a0021086818080001a20" - "30203c10b28080800020004180e0006a200041a0e8006a41301086818080" - "001a2036204410b280808000200041c0e4006a200841301086818080001a" - "2001204510b28080800020004180d7006a203a41301086818080001a2000" - "41c0db006a410041301085818080001a200042c18e8ea3d58c88f8183703" - "985c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e" - "7f3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1" - "c8c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b200041a0e2" - "006a41e0006a2243200041c0e4006a200041c0db006a10b3808080002033" - "410041301085818080002133200042ba8a92abf1a7dbf2143703e85b2000" - "42e8a0ee96fe89bcf2143703e05b200042a4a0a0f4c7f1c686a27f3703d8" - "5b200042acfced84e38c82c4d0003703d05b200042d5cb9694b3cac8f92a" - "3703c85b200042c38bd5b3c8bcf286897f3703c05b200041a0e2006a41c0" - "016a224620004180d7006a200041c0db006a10b380808000200041a0e200" - "6a20004180e0006a41e0001086818080001a200041c0e7006a41306a2206" - "204710b280808000200041c0e7006a200341301086818080001a20302048" - "10b28080800020004180e0006a204941301086818080001a2001204a10b2" - "8080800020004180d7006a204b41301086818080001a200041c0db006a41" - "0041301085818080001a200042c18e8ea3d58c88f8183703985c200042d2" - "a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20" - "004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd0037" - "03f85b200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a2000" - "41c0db006a10b3808080002033410041301085818080002133200042ba8a" - "92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042" - "a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d0" - "5b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f" - "3703c05b203520004180d7006a200041c0db006a10b380808000200041c0" - "e4006a200041c0e7006a41e0001086818080001a200042afff91c4a8fbbb" - "87113703d85720004289bd83adbef9849c2e3703d057200042d0d1a385a4" - "97e78d413703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5" - "e2bf8da8a1d8003703b857200042c6ac97e7d4d59afbb27f3703b0572000" - "42ebcded87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057" - "200042eed3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f" - "370390572000429386aaa8abf2d7b44637038857200042e5a8e798abaaa5" - "8407370380572007410041c00110858180800021072032200041c0e4006a" - "20004180d7006a10b480808000200041c0db006a200041a0e2006a41a002" - "1086818080001a2006203310b280808000200041c0e7006a200041c0db00" - "6a41301086818080001a2005204c10b280808000200041a0e2006a203d41" - "301086818080001a2036204d10b280808000200041c0e4006a203b413010" - "86818080001a20004180d7006a410041301085818080001a200042c18e8e" - "a3d58c88f8183703d857200042d2a1c19ee8addffc033703d0572000429e" - "97eb8de0d783db8e7f3703c85720004295b7949cfdd590b8d8003703c057" - "200042d2cbb6fee1c8c8d5dd003703b857200042f1e0c7b3c8bcf2814d37" - "03b05720004180e0006a41e0006a200041a0e2006a20004180d7006a10b3" - "808080002001410041301085818080002101200042ba8a92abf1a7dbf214" - "3703a857200042e8a0ee96fe89bcf2143703a057200042a4a0a0f4c7f1c6" - "86a27f37039857200042acfced84e38c82c4d00037039057200042d5cb96" - "94b3cac8f92a37038857200042c38bd5b3c8bcf286897f37038057200041" - "80e0006a41c0016a200041c0e4006a20004180d7006a10b3808080002000" - "4180e0006a200041c0e7006a41e0001086818080001a200041e0e6006a41" - "306a204e10b280808000200041e0e6006a203241301086818080001a2006" - "204f10b280808000200041c0e7006a205041301086818080001a20362051" - "10b280808000200041c0e4006a205241301086818080001a20004180d700" - "6a410041301085818080001a200042c18e8ea3d58c88f8183703d8572000" - "42d2a1c19ee8addffc033703d0572000429e97eb8de0d783db8e7f3703c8" - "5720004295b7949cfdd590b8d8003703c057200042d2cbb6fee1c8c8d5dd" - "003703b857200042f1e0c7b3c8bcf2814d3703b0572043200041c0e7006a" - "20004180d7006a10b3808080002001410041301085818080002101200042" - "ba8a92abf1a7dbf2143703a857200042e8a0ee96fe89bcf2143703a05720" - "0042a4a0a0f4c7f1c686a27f37039857200042acfced84e38c82c4d00037" - "039057200042d5cb9694b3cac8f92a37038857200042c38bd5b3c8bcf286" - "897f370380572046200041c0e4006a20004180d7006a10b3808080002000" - "41a0e2006a200041e0e6006a41e0001086818080001a200042afff91c4a8" - "fbbb87113703986520004289bd83adbef9849c2e37039065200042d0d1a3" - "85a497e78d413703886520004294a7e7acc2baa5a44f37038065200042ec" - "f9a5e2bf8da8a1d8003703f864200042c6ac97e7d4d59afbb27f3703f064" - "200042ebcded87fbc188f9083703e864200042cd9cabeda5fde4f11c3703" - "e064200042eed3f096abd9ebada37f3703d8642000428fc5dc88cd998ff4" - "977f3703d0642000429386aaa8abf2d7b4463703c864200042e5a8e798ab" - "aaa584073703c0642037410041c00110858180800021372053200041a0e2" - "006a200041c0e4006a10b48080800020004180d7006a20004180e0006a41" - "a0021086818080001a200041c0376a20004180d7006a41c0041086818080" - "001a200041c0d2006a20004180ce006a10bf808080002005203910b28080" - "8000200041a0e2006a200041c0d2006a41301086818080001a2001205710" - "b28080800020004180d7006a203841301086818080001a2033205810b280" - "808000200041c0db006a203441301086818080001a200041a0e8006a4100" - "41301085818080001a200042c18e8ea3d58c88f8183703f868200042d2a1" - "c19ee8addffc033703f0682000429e97eb8de0d783db8e7f3703e8682000" - "4295b7949cfdd590b8d8003703e068200042d2cbb6fee1c8c8d5dd003703" - "d868200042f1e0c7b3c8bcf2814d3703d068203720004180d7006a200041" - "a0e8006a10b380808000203c410041301085818080002134200042ba8a92" - "abf1a7dbf2143703c868200042e8a0ee96fe89bcf2143703c068200042a4" - "a0a0f4c7f1c686a27f3703b868200042acfced84e38c82c4d0003703b068" - "200042d5cb9694b3cac8f92a3703a868200042c38bd5b3c8bcf286897f37" - "03a0682035200041c0db006a200041a0e8006a10b380808000200041c0e4" - "006a200041a0e2006a41e0001086818080001a2030205a10b28080800020" - "004180e0006a205641301086818080001a2005205b10b280808000200041" - "a0e2006a205c41301086818080001a2033205d10b280808000200041c0db" - "006a205e41301086818080001a200041a0e8006a41004130108581808000" - "1a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc0337" - "03f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd590" - "b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0c7" - "b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b38080" - "80002034410041301085818080002134200042ba8a92abf1a7dbf2143703" - "c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686a2" - "7f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694b3" - "cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a0682004200041" - "c0db006a200041a0e8006a10b38080800020004180d7006a20004180e000" - "6a41e0001086818080001a200042afff91c4a8fbbb87113703985c200042" - "89bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c20" - "004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d8003703" - "f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188f9" - "083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096abd9" - "ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b2000429386" - "aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b203d41" - "0041c0011085818080002138200320004180d7006a200041c0db006a10b4" - "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2000" - "41c0d2006a200041a0e8006a41c0041086818080001a20004180c5006a20" - "0041b82e6a10bf808080002005203110b280808000200041a0e2006a2000" - "4180c5006a41301086818080001a200120004180c5006a4190016a10b280" - "80800020004180d7006a205441301086818080001a203320004180c5006a" - "41f0016a10b280808000200041c0db006a205541301086818080001a2000" - "41a0e8006a410041301085818080001a200042c18e8ea3d58c88f8183703" - "f868200042d2a1c19ee8addffc033703f0682000429e97eb8de0d783db8e" - "7f3703e86820004295b7949cfdd590b8d8003703e068200042d2cbb6fee1" - "c8c8d5dd003703d868200042f1e0c7b3c8bcf2814d3703d0682037200041" - "80d7006a200041a0e8006a10b38080800020344100413010858180800021" - "34200042ba8a92abf1a7dbf2143703c868200042e8a0ee96fe89bcf21437" - "03c068200042a4a0a0f4c7f1c686a27f3703b868200042acfced84e38c82" - "c4d0003703b068200042d5cb9694b3cac8f92a3703a868200042c38bd5b3" - "c8bcf286897f3703a0682035200041c0db006a200041a0e8006a10b38080" - "8000200041c0e4006a200041a0e2006a41e0001086818080001a20302000" - "4180c5006a41d0026a10b28080800020004180e0006a20004180c5006a41" - "a0026a41301086818080001a200520004180c5006a41b0036a10b2808080" - "00200041a0e2006a20004180c5006a4180036a41301086818080001a2033" - "20004180c5006a4190046a10b280808000200041c0db006a20004180c500" - "6a41e0036a41301086818080001a200041a0e8006a410041301085818080" - "001a200042c18e8ea3d58c88f8183703f868200042d2a1c19ee8addffc03" - "3703f0682000429e97eb8de0d783db8e7f3703e86820004295b7949cfdd5" - "90b8d8003703e068200042d2cbb6fee1c8c8d5dd003703d868200042f1e0" - "c7b3c8bcf2814d3703d0682007200041a0e2006a200041a0e8006a10b380" - "8080002034410041301085818080002105200042ba8a92abf1a7dbf21437" - "03c868200042e8a0ee96fe89bcf2143703c068200042a4a0a0f4c7f1c686" - "a27f3703b868200042acfced84e38c82c4d0003703b068200042d5cb9694" - "b3cac8f92a3703a868200042c38bd5b3c8bcf286897f3703a06820042000" - "41c0db006a200041a0e8006a10b38080800020004180d7006a20004180e0" - "006a41e0001086818080001a200042afff91c4a8fbbb87113703985c2000" - "4289bd83adbef9849c2e3703905c200042d0d1a385a497e78d413703885c" - "20004294a7e7acc2baa5a44f3703805c200042ecf9a5e2bf8da8a1d80037" - "03f85b200042c6ac97e7d4d59afbb27f3703f05b200042ebcded87fbc188" - "f9083703e85b200042cd9cabeda5fde4f11c3703e05b200042eed3f096ab" - "d9ebada37f3703d85b2000428fc5dc88cd998ff4977f3703d05b20004293" - "86aaa8abf2d7b4463703c85b200042e5a8e798abaaa584073703c05b2038" - "410041c0011085818080001a200320004180d7006a200041c0db006a10b4" - "80808000200041a0e8006a200041c0e4006a41a0021086818080001a2030" - "200510b28080800020004180e0006a200041a0e8006a4130108681808000" - "1a2036204410b280808000200041c0e4006a200841301086818080001a20" - "01204510b28080800020004180d7006a203a41301086818080001a200041" - "c0db006a410041301085818080001a200042c18e8ea3d58c88f818370398" - "5c200042d2a1c19ee8addffc033703905c2000429e97eb8de0d783db8e7f" - "3703885c20004295b7949cfdd590b8d8003703805c200042d2cbb6fee1c8" - "c8d5dd003703f85b200042f1e0c7b3c8bcf2814d3703f05b2043200041c0" - "e4006a200041c0db006a10b3808080002033410041301085818080002104" - "200042ba8a92abf1a7dbf2143703e85b200042e8a0ee96fe89bcf2143703" - "e05b200042a4a0a0f4c7f1c686a27f3703d85b200042acfced84e38c82c4" - "d0003703d05b200042d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8" - "bcf286897f3703c05b204620004180d7006a200041c0db006a10b3808080" - "00200041a0e2006a20004180e0006a41e0001086818080001a2006204710" - "b280808000200041c0e7006a200341301086818080001a2030204810b280" - "80800020004180e0006a204941301086818080001a2001204a10b2808080" - "0020004180d7006a204b41301086818080001a200041c0db006a41004130" - "1085818080001a200042c18e8ea3d58c88f8183703985c200042d2a1c19e" - "e8addffc033703905c2000429e97eb8de0d783db8e7f3703885c20004295" - "b7949cfdd590b8d8003703805c200042d2cbb6fee1c8c8d5dd003703f85b" - "200042f1e0c7b3c8bcf2814d3703f05b203720004180e0006a200041c0db" - "006a10b3808080002004410041301085818080001a200042ba8a92abf1a7" - "dbf2143703e85b200042e8a0ee96fe89bcf2143703e05b200042a4a0a0f4" - "c7f1c686a27f3703d85b200042acfced84e38c82c4d0003703d05b200042" - "d5cb9694b3cac8f92a3703c85b200042c38bd5b3c8bcf286897f3703c05b" - "203520004180d7006a200041c0db006a10b380808000200041c0e4006a20" - "0041c0e7006a41e0001086818080001a200042afff91c4a8fbbb87113703" - "d85720004289bd83adbef9849c2e3703d057200042d0d1a385a497e78d41" - "3703c85720004294a7e7acc2baa5a44f3703c057200042ecf9a5e2bf8da8" - "a1d8003703b857200042c6ac97e7d4d59afbb27f3703b057200042ebcded" - "87fbc188f9083703a857200042cd9cabeda5fde4f11c3703a057200042ee" - "d3f096abd9ebada37f370398572000428fc5dc88cd998ff4977f37039057" - "2000429386aaa8abf2d7b44637038857200042e5a8e798abaaa584073703" - "80572007410041c0011085818080001a2032200041c0e4006a20004180d7" - "006a10b480808000200041c0db006a200041a0e2006a41a0021086818080" - "001a20004180c5006a200041c0db006a41c0041086818080001a20004180" - "c5006a200041c0376a10bf8080800020004180c5006a200041c0d2006a10" - "bf80808000200041f8296a20004180c5006a200041c0c9006a10be808080" - "00200020023a00a068024020024101470d00200041a0e8006a200041f829" - "6a41c0041086818080001a200041f8326a10ac80808000200041a0e8006a" - "200041f8326a10c2808080002008203f10c2808080007110a38080800020" - "3a204010c2808080007110a3808080002003203e10c28080800020492041" - "10c2808080007110a380808000204b204210c2808080007110a380808000" - "7110a380808000210220002802a82520002802ac25108580808000200028" - "029825200028029c25108580808000200028028825200028028c25108580" - "80800020002802f82420002802fc24108580808000202f202e1086808080" - "0020002802c01c20002802c41c10828080800020002802a01520002802a4" - "15108480808000200028028815200028028c1510848080800020002802b4" - "1320002802b81310848080800020002802bc1220002802c0121084808080" - "0020002802e41020002802e810108480808000200028028c0f2000280290" - "0f10848080800020002802940e20002802980e108480808000200028029c" - "0d20002802a00d108480808000200241ff017141004721020c080b200041" - "003602f832200041a0e8006a41c886c08000200041f8326a41cc86c08000" - "109680808000000b200041c0c0006a200041b8256a203610b48080800020" - "004180c5006a200041b8256a203610c380808000200041c0c9006a203610" - "b68080800020004180ce006a200041c0c9006a200041b8256a10c3808080" - "00200041c0d2006a20004180ce006a20004180c5006a10b4808080002000" - "4180d7006a200041c0d2006a200041c0c0006a10b780808000200041c0db" - "006a200041c0c0006a200041c0c0006a10c380808000200041a0e8006a20" - "0041c0c0006a10b680808000200041f8326a20004180d7006a200041a0e8" - "006a10b7808080002005200041c0db006a41a0021086818080001a200041" - "b8256a200041f8326a41c0041086818080001a410121020c000b0b200041" - "80d7006a2030200441e8006c6a10a580808000200041a0026a202e200441" - "05746a2202290300220c42ffffffff6f7e22094200428180808070420010" - "878180800020004190026a2009420042feb7f9ffaf80e9ded30042001087" - "8180800020004180026a200942004285b087cd8081f69c33420010878180" - "8000200041f0016a2009420042c8faf5ccb2eae9f6f30042001087818080" - "00200041e0016a200029039002220e20022903087c220b200041a0026a41" - "086a290300200c20002903a00222097c200954ad7c7c220c42ffffffff6f" - "7e220942004281808080704200108781808000200041d0016a2009420042" - "feb7f9ffaf80e9ded300420010878180800020004180016a200942004285" - "b087cd8081f69c334200108781808000200041306a2009420042c8faf5cc" - "b2eae9f6f3004200108781808000200041c0016a20002903d00122132000" - "29038002221220022903107c220a20004190026a41086a290300200b200e" - "54ad7c200c200b54ad7c7c220d7c220b200041e0016a41086a2903002000" - "2903e0012209200c7c200954ad7c7c220c42ffffffff6f7e220942004281" - "808080704200108781808000200041b0016a2009420042feb7f9ffaf80e9" - "ded3004200108781808000200041a0016a200942004285b087cd8081f69c" - "33420010878180800020004190016a2009420042c8faf5ccb2eae9f6f300" - "4200108781808000200041f0006a20002903b001221020002903f0012211" - "20022903187c220e20004180026a41086a290300200a201254ad7c200d20" - "0a54ad7c7c220a2000290380017c2212200041d0016a41086a290300200b" - "201354ad7c200c200b54ad7c7c22137c220b200041c0016a41086a290300" - "20002903c0012209200c7c200954ad7c7c220c42ffffffff6f7e22094200" - "4281808080704200108781808000200041e0006a2009420042feb7f9ffaf" - "80e9ded3004200108781808000200041d0006a200942004285b087cd8081" - "f69c334200108781808000200041c0006a2009420042c8faf5ccb2eae9f6" - "f3004200108781808000200041a0016a41086a290300210d200041306a41" - "086a290300210f200029039001211720002903502114200041d0006a4108" - "6a2903002115200020002903602216200041f0016a41086a290300200e20" - "1154ad7c200a200e54ad7c221120002903307c220920004180016a41086a" - "2903002012200a54ad7c2013201254ad7c7c220a20002903a0017c220e20" - "0041b0016a41086a290300200b201054ad7c200c200b54ad7c7c22127c22" - "0b200041f0006a41086a29030020002903702213200c7c201354ad7c7c22" - "133703f832200020142017200f2009201154ad7c200a200954ad7c22107c" - "2209200d200e200a54ad7c2012200e54ad7c7c220c7c220a200041e0006a" - "41086a290300200b201654ad7c2013200b54ad7c7c220b37038033200020" - "004190016a41086a2903002009201054ad7c200c200954ad7c220e200029" - "03407c22092015200a200c54ad7c200b200a54ad7c7c220b370388332000" - "200041c0006a41086a2903002009200e54ad7c200b200954ad7c37039033" - "200041a0e8006a200041f8326a10a280808000200020002903b868370398" - "4e200020002903b0683703904e200020002903a8683703884e2000200029" - "03a0683703804e200041c0db006a410041301085818080001a2035410041" - "301085818080001a203441e086c0800041301086818080001a4101210220" - "0041013602e052200041003602d452200041003602c852200020333602c4" - "52200020004180ce006a3602c05203400240024020020d00200041086a20" - "0041c0d2006a10c48080800020002d0009210120002d000821030c010b20" - "0041003602e0520240024020002802c852450d00200041286a2002203210" - "c58080800020002802280d01200028022c21020b024020002802c0522201" - "450d0020002802c45221030340024020032001470d00200020033602c452" - "0c020b2000428080808080013702cc5220002003417f6a22033602c85220" - "0041206a2002203210c580808000024020002802200d0020002802242102" - "0c010b0b200020033602c4520c010b200041003602c852024020002802d4" - "52450d00200041186a2002203110c58080800020002802180d0120002802" - "1c21020b41002103200041003602d45220020d010b200041106a200041c0" - "d2006a10c48080800020002d0011210120002d001021030b024020034101" - "71450d00200041f8326a200041c0db006a10c680808000200041c0db006a" - "200041f8326a4190011086818080001a200041f8326a200041c0db006a20" - "004180d7006a10c780808000200041a0e8006a200041c0db006a200041f8" - "326a200110c880808000200041c0db006a200041a0e8006a419001108681" - "8080001a20002802e05221020c010b0b200041a0e8006a200041c0db006a" - "4190011086818080001a200041f8326a20004180236a200041a0e8006a10" - "c78080800020004180236a200041f8326a4190011086818080001a200441" - "016a21040c000b0b2000420137028433200041013602fc322000419482c0" - "80003602f83220004181808080003602a4682000200041a0e8006a360280" - "33200020004180d7006a3602a068200041c0d2006a41c886c08000200041" - "f8326a419c82c08000109680808000000b200220002802b40641b092c080" - "00108c80808000000b202f202e10868080800020002802c01c20002802c4" - "1c10828080800020002802a01520002802a4151084808080002000280288" - "15200028028c1510848080800020002802b41320002802b8131084808080" - "0020002802bc1220002802c01210848080800020002802e41020002802e8" - "10108480808000200028028c0f20002802900f1084808080002000280294" - "0e20002802980e108480808000200028029c0d20002802a00d1084808080" - "00410021020b200041e0ec006a24808080800020020ba60201087e200020" - "01290300220242ffffffff0f7c2203200254ad427f7c2202200220012903" - "0822047c2202200454ad7c20024282c88680d0ff96a1ac7f7c2204200254" - "ad7c427f7c423f8722022002200129031022057c2202200554ad7c200242" - "fbcff8b2fffe89e34c7c2205200254ad7c427f7c423f8722022002200129" - "031822067c2202200654ad7c200242b8858ab3cd9596898c7f7c22062002" - "54ad7c427f7c220242818080807083220720037c22083703002000200242" - "feb7f9ffaf80e9ded30083220920047c22032008200754ad7c2207370308" - "200020024285b087cd8081f69c3383220820057c22042003200954ad2007" - "200354ad7c7c22033703102000200242c8faf5ccb2eae9f6f3008320067c" - "2004200854ad2003200454ad7c7c3703180b1901017f2380808080004110" - "6b220120003a000f20012d000f0b3601017f23808080800041106b220224" - "8080808000200241013b010c200220013602082002200036020420024104" - "6a10f380808000000b6501017f23808080800041306b2202248080808000" - "200041306a200141306a41301086818080001a200041e0006a41e086c080" - "00200241004130108581808000220220012d006010908080800020002001" - "41301086818080001a200241306a2480808080000b25002000200141f087" - "c0800010df808080002000200110a98080800010d2808080003a00300be7" - "2502017f4c7e23808080800041b0096b2203248080808000200341c0046a" - "200229030022044200200129030022054200108781808000200341d0046a" - "20022903082206420020054200108781808000200341e0046a2002290310" - "2207420020054200108781808000200341f0046a20022903182208420020" - "05420010878180800020034180056a200229032022094200200542001087" - "8180800020034190056a2002290328220a42002005420010878180800020" - "0341a0056a20012903082205420020044200108781808000200341f0056a" - "2005420020064200108781808000200341c0066a20054200200742001087" - "8180800020034190076a2005420020084200108781808000200341e0076a" - "2005420020094200108781808000200341b0086a20054200200a42001087" - "81808000200341b0056a2001290310220542002004420010878180800020" - "034180066a2005420020064200108781808000200341d0066a2005420020" - "074200108781808000200341a0076a200542002008420010878180800020" - "0341f0076a2005420020094200108781808000200341c0086a2005420020" - "0a4200108781808000200341c0056a200129031822054200200442001087" - "8180800020034190066a2005420020064200108781808000200341e0066a" - "2005420020074200108781808000200341b0076a20054200200842001087" - "8180800020034180086a2005420020094200108781808000200341d0086a" - "20054200200a4200108781808000200341d0056a20012903202205420020" - "044200108781808000200341a0066a200542002006420010878180800020" - "0341f0066a2005420020074200108781808000200341c0076a2005420020" - "08420010878180800020034190086a200542002009420010878180800020" - "0341e0086a20054200200a4200108781808000200341e0056a2001290328" - "2205420020044200108781808000200341b0066a20054200200642001087" - "8180800020034180076a2005420020074200108781808000200341d0076a" - "2005420020084200108781808000200341a0086a20054200200942001087" - "81808000200341f0086a20054200200a4200108781808000200341b0046a" - "20032903c004220542fdfff3ffcffffff9897f7e2204420042abd5feffff" - "ffbfffb97f4200108781808000200341a0046a2004420042ffffcf8aebff" - "ffd51e4200108781808000200341b0036a2004420042a4ecc3b58fd4b498" - "e7004200108781808000200341c0026a2004420042bfa5949ccff0d2bbe4" - "004200108781808000200341d0016a2004420042d7d9ae9ae4f6e98dcb00" - "4200108781808000200341e0006a20044200429acdffcba3bdc4801a4200" - "10878180800020034190046a200341b0046a41086a290300200520032903" - "b00422047c200454ad7c220720032903a0047c220520032903a005220820" - "032903d0042209200341c0046a41086a2903007c220a7c220b7c220642fd" - "fff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f4200108781" - "80800020034180046a2004420042ffffcf8aebffffd51e42001087818080" - "00200341f0036a2004420042a4ecc3b58fd4b498e7004200108781808000" - "200341e0036a2004420042bfa5949ccff0d2bbe400420010878180800020" - "0341d0036a2004420042d7d9ae9ae4f6e98dcb0042001087818080002003" - "41c0036a20044200429acdffcba3bdc4801a4200108781808000200341a0" - "036a200341a0046a41086a2903002005200754ad7c2006200554ad7c220c" - "20032903b0037c220520032903f005220d200341d0046a41086a29030020" - "0a200954ad7c220e20032903e0047c220f7c2207200341a0056a41086a29" - "0300200b200854ad7c7c220820032903b0057c22107c2209200329038004" - "7c220a20034190046a41086a290300200329039004220420067c200454ad" - "7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb9" - "7f420010878180800020034190036a2004420042ffffcf8aebffffd51e42" - "0010878180800020034180036a2004420042a4ecc3b58fd4b498e7004200" - "108781808000200341f0026a2004420042bfa5949ccff0d2bbe400420010" - "8781808000200341e0026a2004420042d7d9ae9ae4f6e98dcb0042001087" - "81808000200341d0026a20044200429acdffcba3bdc4801a420010878180" - "8000200341b0026a20034180046a41086a290300200a200954ad7c200620" - "0a54ad7c221120032903f0037c220a200341b0036a41086a290300200520" - "0c54ad7c2009200554ad7c221220032903c0027c2205200341e0046a4108" - "6a290300200f200e54ad7c220f20032903f0047c220920032903c0067c22" - "0b200341f0056a41086a2903002007200d54ad7c2008200754ad7c7c2207" - "2003290380067c220c200341b0056a41086a2903002010200854ad7c7c22" - "0820032903c0057c22107c22137c220d2003290390037c220e200341a003" - "6a41086a29030020032903a003220420067c200454ad7c7c220642fdfff3" - "ffcffffff9897f7e2204420042abd5feffffffbfffb97f42001087818080" - "00200341a0026a2004420042ffffcf8aebffffd51e420010878180800020" - "034190026a2004420042a4ecc3b58fd4b498e70042001087818080002003" - "4180026a2004420042bfa5949ccff0d2bbe4004200108781808000200341" - "f0016a2004420042d7d9ae9ae4f6e98dcb004200108781808000200341e0" - "016a20044200429acdffcba3bdc4801a4200108781808000200341c0016a" - "20034190036a41086a290300200e200d54ad7c2006200e54ad7c22142003" - "290380037c220e200341f0036a41086a290300200a201154ad7c200d200a" - "54ad7c221520032903e0037c220a200341c0026a41086a29030020052012" - "54ad7c2013200554ad7c221220032903d0017c2205200341f0046a41086a" - "2903002009200f54ad7c22132003290380057c220d2003290390077c220f" - "200341c0066a41086a290300200b200954ad7c2007200b54ad7c7c220920" - "032903d0067c220b20034180066a41086a290300200c200754ad7c200820" - "0c54ad7c7c22072003290390067c220c200341c0056a41086a2903002010" - "200854ad7c7c220820032903d0057c22167c22177c22187c221020032903" - "a0027c2211200341b0026a41086a29030020032903b002220420067c2004" - "54ad7c7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbf" - "ffb97f4200108781808000200341b0016a2004420042ffffcf8aebffffd5" - "1e4200108781808000200341a0016a2004420042a4ecc3b58fd4b498e700" - "420010878180800020034190016a2004420042bfa5949ccff0d2bbe40042" - "0010878180800020034180016a2004420042d7d9ae9ae4f6e98dcb004200" - "108781808000200341f0006a20044200429acdffcba3bdc4801a42001087" - "81808000200341d0006a200341a0026a41086a2903002011201054ad7c20" - "06201154ad7c22192003290390027c221120034180036a41086a29030020" - "0e201454ad7c2010200e54ad7c221a20032903f0027c220e200341e0036a" - "41086a290300200a201554ad7c2018200a54ad7c221820032903d0037c22" - "0a200341d0016a41086a2903002005201254ad7c2017200554ad7c221520" - "032903607c220520034180056a41086a290300200d201354ad7c22172003" - "290390057c221020032903e0077c221220034190076a41086a290300200f" - "200d54ad7c2009200f54ad7c7c220d20032903a0077c220f200341d0066a" - "41086a290300200b200954ad7c2007200b54ad7c7c220920032903e0067c" - "220b20034190066a41086a290300200c200754ad7c2008200c54ad7c7c22" - "0720032903a0067c220c200341d0056a41086a2903002016200854ad7c7c" - "220820032903e0057c22167c221b7c221c7c221d7c221320032903b0017c" - "2214200341c0016a41086a29030020032903c001220420067c200454ad7c" - "7c220642fdfff3ffcffffff9897f7e2204420042abd5feffffffbfffb97f" - "4200108781808000200341c0006a2004420042ffffcf8aebffffd51e4200" - "108781808000200341306a2004420042a4ecc3b58fd4b498e70042001087" - "81808000200341206a2004420042bfa5949ccff0d2bbe400420010878180" - "8000200341106a2004420042d7d9ae9ae4f6e98dcb004200108781808000" - "200320044200429acdffcba3bdc4801a4200108781808000200341c0036a" - "41086a290300211e200341b0066a41086a290300211f200341f0066a4108" - "6a2903002120200341b0076a41086a2903002121200341f0076a41086a29" - "03002122200341b0086a41086a290300212320032903c008212420032903" - "8008212520032903c0072126200329038007212720032903d00221282003" - "41d0026a41086a2903002129200341e0026a41086a290300212a20034180" - "076a41086a290300212b200341c0076a41086a290300212c20034180086a" - "41086a290300212d200341c0086a41086a290300212e20032903d008212f" - "200329039008213020032903d007213120032903e0012132200341e0016a" - "41086a290300213320032903f0012134200341f0016a41086a2903002135" - "20034180026a41086a2903002136200341d0076a41086a29030021372003" - "4190086a41086a2903002138200341d0086a41086a290300213920032903" - "e008213a20032903a008213b2003290370213c200341f0006a41086a2903" - "00213d200329038001213e20034180016a41086a290300213f2003290390" - "01214020034190016a41086a2903002141200341a0016a41086a29030021" - "42200341a0086a41086a2903002143200341e0086a41086a290300214420" - "032903f008214520032903002146200341086a2903002147200329031021" - "48200341106a41086a29030021492003290320214a200341206a41086a29" - "0300214b2003290330214c200341306a41086a290300214d200320032903" - "40224e20034190056a41086a2903002010201754ad7c224f20032903b008" - "7c2204200341e0076a41086a2903002012201054ad7c200d201254ad7c7c" - "221020032903f0077c2212200341a0076a41086a290300200f200d54ad7c" - "2009200f54ad7c7c220d20032903b0077c220f200341e0066a41086a2903" - "00200b200954ad7c2007200b54ad7c7c220920032903f0067c220b200341" - "a0066a41086a290300200c200754ad7c2008200c54ad7c7c220720032903" - "b0067c220c200341e0056a41086a2903002016200854ad7c7c2208200341" - "e0006a41086a2903002005201554ad7c201b200554ad7c7c220520032903" - "c0037c2215200341d0036a41086a290300200a201854ad7c201c200a54ad" - "7c7c220a20032903e0027c2216200341f0026a41086a290300200e201a54" - "ad7c201d200e54ad7c7c220e2003290380027c221720034190026a41086a" - "2903002011201954ad7c2013201154ad7c7c221120032903a0017c221820" - "0341b0016a41086a2903002014201354ad7c2006201454ad7c7c22197c22" - "13200341d0006a41086a2903002003290350221420067c201454ad7c7c22" - "1a370380092003204c204020342028202720262025202420232004204f54" - "ad7c2010200454ad7c221b7c220420222012201054ad7c200d201254ad7c" - "7c22067c22102021200f200d54ad7c2009200f54ad7c7c220d7c220f2020" - "200b200954ad7c2007200b54ad7c7c22097c220b201f200c200754ad7c20" - "08200c54ad7c7c22072005200854ad7c2208201e2015200554ad7c200a20" - "1554ad7c7c22057c220c202a2016200a54ad7c200e201654ad7c7c220a7c" - "221220362017200e54ad7c2011201754ad7c7c220e7c2214204220182011" - "54ad7c2019201854ad7c7c22117c2215200341c0006a41086a2903002013" - "204e54ad7c201a201354ad7c7c2213370388092003204a203e2032200820" - "0754ad2005200854ad7c221620312030202f202e2004201b54ad7c200620" - "0454ad7c22177c2204202d2010200654ad7c200d201054ad7c7c22067c22" - "08202c200f200d54ad7c2009200f54ad7c7c220d7c220f202b200b200954" - "ad7c2007200b54ad7c7c22107c22072029200c200554ad7c200a200c54ad" - "7c7c22057c220920352012200a54ad7c200e201254ad7c7c220a7c220b20" - "412014200e54ad7c2011201454ad7c7c220c7c220e204d2015201154ad7c" - "2013201554ad7c7c22113703900920032048203c2007201654ad20052007" - "54ad7c2212203b203a20392004201754ad7c2006200454ad7c22137c2204" - "20382008200654ad7c200d200854ad7c7c22067c22072037200f200d54ad" - "7c2010200f54ad7c7c220d7c220820332009200554ad7c200a200954ad7c" - "7c22057c2209203f200b200a54ad7c200c200b54ad7c7c220a7c220b204b" - "200e200c54ad7c2011200e54ad7c7c220c37039809200320462008201254" - "ad2005200854ad7c2208204520442004201354ad7c2006200454ad7c220e" - "7c220420432007200654ad7c200d200754ad7c7c220d7c2206203d200920" - "0554ad7c200a200954ad7c7c22057c22072049200b200a54ad7c200c200b" - "54ad7c7c22093703a00920032006200854ad2005200654ad7c200341f008" - "6a41086a2903002004200e54ad7c200d200454ad7c7c20472007200554ad" - "7c2009200754ad7c7c3703a809200020034180096a10d680808000200341" - "b0096a2480808080000b3701017f20004100413010858180800021004101" - "10a3808080002101200041306a41e086c0800041301086818080001a2000" - "20013a00600b3a01017f23808080800041306b2201248080808000200020" - "0141004130108581808000220110db808080002100200141306a24808080" - "800020000b42002000200120022003109080808000200041306a20014130" - "6a200241306a2003109080808000200020022d006020012d006022027341" - "0020036b712002733a00600bd80d010b7f23808080800041c0176b220224" - "808080800020012d00c0012103410021042002410010a3808080003a0088" - "03200242f2b7f89e96d4f0950b37038003200242ed95f3a18a8ad68b6737" - "03f802200242bac6f6c9ec89d7a4f9003703f002200242a0d793dfa38deb" - "d6867f3703e802200242dcc3d1d8a2e189d5183703e002200242dde092fb" - "ad92bfe0ad7f3703d802200242e5b583f4e7b1ffc1003703d002200242a2" - "cbbc87dfaeeae9073703c802200242df92b5f096bdedf7bb7f3703c00220" - "0242dac6a9d0caada1f3673703b802200242dab8daf1f5c3bebed9003703" - "b002200242ca98a58286dfc2b9cc003703a802200242f3db839b97c18ac9" - "113703a002200242c78ad690efa1bbdb4237039802200242e7e686aac8d9" - "ad8d1b3703900220024286f099948ec3dfd83b37038802200242c3c1b5e6" - "dbb3b1d0aa7f3703800220024286ec8ff1d98ef0d4a57f3703f801200242" - "d7f9c29aa4b2e4c0053703f001200242ebec8cc3b1ecedb3ef003703e801" - "200242e9ddf2d1d1b3a6ca987f3703e00120024280cbabf1d3f6a4d4a17f" - "3703d8012002429aacd2bde8e4fefab37f3703d0012002429094d094a0f4" - "a3f9753703c80120022001200241c8016a200310d980808000200241c005" - "6a200210e880808000200241c8016a41c400410841a002108e8080800020" - "022802cc0121010240024020022802c8014101460d0020022802d0012105" - "200241c8016a200241c0056a41a0021086818080001a200241c8016a41a0" - "026a200241c8011086818080002106200241003602b805200220053602b4" - "05200220013602b005200241c0056a41c0016a2107200241c0056a41e000" - "6a2108200241c8016a41e0006a2109200241c8046a210a200241c8016a41" - "c0016a2105200241b0056a210b413f2101024003402001417f460d014280" - "8082808080a080e9002001413f71ad88a7210c0240024020044101710d00" - "200c21040c010b41012104200241c8016a10ed80808000200c410171450d" - "00200241e0076a200510ba80808000200241c0086a200a10ba8080800020" - "0241a0096a200241e0076a200610b380808000200241e0166a200a200510" - "bc8080800020024180166a200241e0166a10ba80808000200241a0156a20" - "024180166a200241c0086a10bb8080800020024180166a200241a0156a20" - "0241e0076a10bb80808000200241800a6a20024180166a200241e0076a10" - "b380808000200241e00a6a200241a0096a200241c8016a10bb8080800020" - "0241c00b6a200241e00a6a10ba80808000200241a00c6a200241c00b6a20" - "0241c00b6a10bc80808000200241800d6a200241a00c6a200241a00c6a10" - "bc80808000200241e00d6a200241800d6a200241e00a6a10b38080800020" - "0241e0166a200241800a6a200910bb80808000200241c00e6a200241e016" - "6a200910bb80808000200241a00f6a200241c00e6a200610b38080800020" - "024180106a200241800d6a200241c8016a10b380808000200241e0166a20" - "0241c00e6a10ba8080800020024180166a200241e0166a200241e00d6a10" - "bb80808000200241e0166a20024180166a20024180106a10bb8080800020" - "0241c8016a200241e0166a20024180106a10bb80808000200241e0166a20" - "05200241e00a6a10bc8080800020024180166a200241e0166a10ba808080" - "00200241a0156a20024180166a200241e0076a10bb808080002005200241" - "a0156a200241c00b6a10bb80808000200241e0106a200a200510bc808080" - "00200241e0166a20024180106a200241c8016a10bb80808000200241c011" - "6a200241e0166a200241c00e6a10b380808000200241a0126a2009200241" - "e00d6a10b38080800020024180136a200241a0126a200241a0126a10bc80" - "8080002009200241c0116a20024180136a10bb80808000200241e0166a20" - "0241e0106a10ba80808000200241e0136a200241e0166a200241c0086a10" - "bb80808000200241c0146a200510ba80808000200241a0156a200241e013" - "6a200241c0146a10bb80808000200241e0166a200241a00f6a200241a00f" - "6a10bc8080800020024180166a200241e0166a200241a0156a10bb808080" - "00200241c0056a2005200510bc80808000200241e0166a200241c00e6a10" - "e2808080002008200241e0166a200241e0166a10bc808080002007200241" - "80166a41e0001086818080001a200b200241c0056a41bc8cc0800010ee80" - "8080000b2001417f6a21010c000b0b200241c8016a10ed80808000200220" - "022802b80522013602e016200141c400470d01200020033a000c2000200b" - "290200370200200041086a200b41086a280200360200200241c0176a2480" - "808080000f0b200120022802d00141888cc08000108c80808000000b2002" - "41003602c005200241e0166a200241c0056a10ef80808000000b8e010101" - "7f2380808080004180036b2201248080808000200141a0026a41306a4100" - "41301085818080001a200141a0026a41e086c0800041301086818080001a" - "2001200141a0026a41e000108681808000220141e0006a410041c0011085" - "818080001a200041a0026a410041a0021085818080001a2000200141a002" - "1086818080001a20014180036a2480808080000bd70301157f2380808080" - "0041c00d6b2203248080808000200241e0036a210420024180036a210520" - "0241a0026a2106200241c0016a2107200241e0006a210820012802044103" - "742109200341c0046a41a0026a210a200341a00b6a41c0016a210b200341" - "a00b6a41e0006a210c200341e0036a210d20034180036a210e200341a002" - "6a210f20034180096a41c0016a211020034180096a41e0006a2111200341" - "c0016a2112200341e0006a21132001280200211420012802082115034002" - "4020090d002001201541016a3602082000200241c0041086818080001a20" - "0341c00d6a2480808080000f0b201428020422162d000c20142802002d00" - "607210a380808000211720032002201641046a280200201641086a280200" - "201541cc8cc0800010ae80808000201428020010af808080002003418009" - "6a20032002201710b080808000201120132008201710b080808000201020" - "122007201710b080808000200341a00b6a200f2006201710b08080800020" - "0c200e2005201710b080808000200b200d2004201710b080808000200341" - "c0046a20034180096a41a0021086818080001a200a200341a00b6a41a002" - "1086818080001a2002200341c0046a41c0041086818080001a200941786a" - "2109201441086a21140c000b0b22000240200120024b0d00200220012003" - "10f080808000000b2000200241a0026c6a0bd60301027f23808080800041" - "e00f6b22042480808080002004200241e000108681808000220441e0006a" - "200241e0006a41e0001086818080001a2004200341306a220510dd808080" - "00200441306a200510dd80808000200441e0006a200310dd808080002004" - "41e0006a41306a200310dd80808000200441c0016a2001200241c0016a22" - "02200441e0006a10e980808000200441c00d6a200141e0036a200410b380" - "808000200441a00b6a200441c00d6a200441c00d6a41306a220310b88080" - "8000200441a00b6a41306a200441c00d6a200310b980808000200441e003" - "6a41e0006a200141a0026a2203200410b380808000200441e0036a41c001" - "6a20014180036a200410b380808000200441e0036a200441a00b6a41e000" - "1086818080001a20044180066a200441e0006a200410bc80808000200441" - "e0066a2003200110c38080800020044180096a200441e0066a2002200441" - "80066a10e980808000200441c00d6a20044180096a200441c0016a10b780" - "808000200441a00b6a200441c00d6a200441e0036a10b780808000200441" - "c00d6a200441e0036a10b6808080002000200441c00d6a200441c0016a10" - "c380808000200041a0026a200441a00b6a41a0021086818080001a200441" - "e00f6a2480808080000b2700200020012002200310908080800020004130" - "6a200141306a200241306a20031090808080000b30002000200110e28080" - "8000200041e0006a200141e0006a10e280808000200041c0016a200141c0" - "016a10e2808080000bbd0201097e2000420042002001290300220242abd5" - "feffffffbfffb97f56ad7d2203200129030822047d220542ffffcf8aebff" - "ffd51e7c2206200420028420012903102207842001290318220884200129" - "03202209842001290328220a845022011b3703082000420042abd5feffff" - "ffbfffb97f20027d20011b3703002000420020032003200454ad7d200620" - "0554ad7c423f87220220077d220342a4ecc3b58fd4b498e7007c22042001" - "1b3703102000420020022002200754ad7d2004200354ad7c423f87220220" - "087d220342bfa5949ccff0d2bbe4007c220420011b370318200042002002" - "2002200854ad7d2004200354ad7c423f87220220097d220342d7d9ae9ae4" - "f6e98dcb007c220420011b3703202000420020022002200954ad7d200420" - "0354ad7c423f87200a7d429acdffcba3bdc4801a7c20011b3703280bc701" - "01057f23808080800041c0016b2203248080808000200341306a22042001" - "41306a220510b280808000200320014130108681808000220341e0006a41" - "306a200241306a220641301086818080002107200341e0006a2002413010" - "86818080001a20002003200341e0006a10e1808080002004200541301086" - "818080001a200320014130108681808000220341e0006a20064130108681" - "8080001a2007200241301086818080001a200041306a2003200341e0006a" - "10e180808000200341c0016a2480808080000bcd0b01167f238080808000" - "41a0086b22032480808080002003200241e0006a220420024190016a2205" - "10b980808000200341306a2004200510b880808000200341e0006a200241" - "c0016a2206200241f0016a220710b98080800020034190016a2006200710" - "b880808000200341e0036a41306a2208200141306a220910b28080800020" - "0341e0036a41e0006a200141e0006a220a4130108681808000210b200341" - "e0036a4190016a220c20014190016a220d10b280808000200341e0036a41" - "c0016a200141c0016a220e4130108681808000210f200341e0036a41f001" - "6a2210200141f0016a221110b280808000200341e0036a20014130108681" - "8080001a20034180066a41306a200241306a221241301086818080002113" - "20034180066a200241301086818080001a20034180066a41e0006a200341" - "90016a4130108681808000211420034180066a4190016a200341e0006a41" - "30108681808000211520034180066a41c0016a200341306a413010868180" - "8000211620034180066a41f0016a200341301086818080002117200341c0" - "016a200341e0036a20034180066a10ea8080800020082009413010868180" - "80002108200b200a41301086818080002118200c200d4130108681808000" - "210b200f200e4130108681808000210f201020114130108681808000210c" - "200341e0036a200141301086818080001a20034180066a20124130108681" - "8080001a20132002413010868180800021102014200341e0006a41301086" - "818080002113201520034190016a41301086818080002114201620034130" - "10868180800021152017200341306a41301086818080002116200341c001" - "6a41306a200341e0036a20034180066a10ea808080002008200910b28080" - "80002018200a41301086818080002117200b200d10b280808000200f200e" - "4130108681808000210f200c201110b280808000200341e0036a20014130" - "1086818080001a20034180066a200441301086818080001a201020054130" - "108681808000211020142012413010868180800021142013200241301086" - "818080002113201520034190016a413010868180800021152016200341e0" - "006a41301086818080002116200341a0026a200341e0036a20034180066a" - "10ea8080800020082009413010868180800021082017200a413010868180" - "80002117200b200d4130108681808000210b200f200e4130108681808000" - "210f200c20114130108681808000210c200341e0036a2001413010868180" - "80001a20034180066a200541301086818080001a20102004413010868180" - "800021102013201241301086818080002113201420024130108681808000" - "21142015200341e0006a41301086818080002115201620034190016a4130" - "1086818080002116200341a0026a41306a200341e0036a20034180066a10" - "ea808080002008200910b2808080002017200a4130108681808000211720" - "0b200d10b280808000200f200e4130108681808000210f200c201110b280" - "808000200341e0036a200141301086818080001a20034180066a20064130" - "1086818080001a2010200741301086818080002110201320044130108681" - "808000211320142005413010868180800021142016201241301086818080" - "002116201520024130108681808000211520034180036a200341e0036a20" - "034180066a10ea808080002008200941301086818080001a2017200a4130" - "1086818080001a200b200d41301086818080001a200f200e413010868180" - "80001a200c201141301086818080001a200341e0036a2001413010868180" - "80001a20034180066a200741301086818080001a20102006413010868180" - "80001a2013200541301086818080001a2014200441301086818080001a20" - "15201241301086818080001a2016200241301086818080001a2003418003" - "6a41306a200341e0036a20034180066a10ea808080002000200341c0016a" - "41e000108681808000220241e0006a200341a0026a41e000108681808000" - "1a200241c0016a20034180036a41e0001086818080001a200341a0086a24" - "80808080000bb30301027f23808080800041e0066b220224808080800020" - "02200110ba80808000200241e0006a2001200141e0006a220310b3808080" - "00200241c0016a200241e0006a200241e0006a10bc808080002002418006" - "6a2001200310bb80808000200241a0056a20024180066a200141c0016a22" - "0110bc80808000200241a0026a200241a0056a10ba808080002002418003" - "6a2003200110b380808000200241e0036a20024180036a20024180036a10" - "bc80808000200241c0046a200110ba8080800020024180066a200241e003" - "6a200241e0036a41306a220110b88080800020024180066a41306a220320" - "0241e0036a200110b980808000200020024180066a200210bc8080800020" - "024180066a200241c0046a200241c0046a41306a220110b8808080002003" - "200241c0046a200110b980808000200041e0006a20024180066a200241c0" - "016a10bc8080800020024180066a200241c0016a200241a0026a10bc8080" - "8000200241a0056a20024180066a200241e0036a10bc8080800020024180" - "066a200241a0056a200210bb80808000200041c0016a20024180066a2002" - "41c0046a10bb80808000200241e0066a2480808080000b7c01037f238080" - "80800041e0006b22022480808080002002200141c0016a2203200141f001" - "6a220410b880808000200241306a2003200410b980808000200041c0016a" - "200141e0006a41e0001086818080001a2000200241e00010868180800041" - "e0006a200141e0001086818080001a200241e0006a2480808080000b3e00" - "20002001200210bb80808000200041e0006a200141e0006a200241e0006a" - "10bb80808000200041c0016a200141c0016a200241c0016a10bb80808000" - "0b3601017f23808080800041306b22032480808080002003200210b28080" - "800020002003200110b980808000200341306a2480808080000b87020201" - "7f0c7e23808080800041306b220324808080800020012903082104200229" - "030821052002290328210620012903282107200229032021082001290320" - "21092002290318210a2001290318210b2002290310210c2001290310210d" - "20032002290300220e20012903007c220f3703002003200520047c220420" - "0f200e54ad7c220e3703082003200c200d7c220d2004200554ad200e2004" - "54ad7c7c22043703102003200a200b7c2205200d200c54ad2004200d54ad" - "7c7c22043703182003200820097c220c2005200a54ad2004200554ad7c7c" - "22053703202003200620077c200c200854ad2005200c54ad7c7c37032820" - "00200310d680808000200341306a2480808080000b7401027f2380808080" - "004190016b220224808080800020022001200141306a220310b980808000" - "200241306a2001200310b880808000200241e0006a2001200110b9808080" - "0020002002200241306a10a780808000200041306a200241e0006a200310" - "a78080800020024190016a2480808080000b230020002001200210b88080" - "8000200041306a200141306a200241306a10b8808080000b230020002001" - "200210b980808000200041306a200141306a200241306a10b9808080000b" - "c71f02017f3b7e23808080800041c0076b2202248080808000200241c004" - "6a200129030822034200200129030022044200108781808000200241d004" - "6a20012903102205420020044200108781808000200241e0046a20012903" - "182206420020044200108781808000200241f0046a200129032022074200" - "2004420010878180800020024180056a2001290328220842002004420010" - "8781808000200241a0056a2005420020034200108781808000200241b005" - "6a2006420020034200108781808000200241c0056a200742002003420010" - "8781808000200241d0056a2008420020034200108781808000200241f005" - "6a200642002005420010878180800020024180066a200742002005420010" - "878180800020024190066a2008420020054200108781808000200241b006" - "6a2007420020064200108781808000200241c0066a200842002006420010" - "8781808000200241e0066a20084200200742001087818080002002419005" - "6a2004420020044200108781808000200241e0056a200342002003420010" - "8781808000200241a0066a2005420020054200108781808000200241d006" - "6a2006420020064200108781808000200241f0066a200742002007420010" - "878180800020024180076a2008420020084200108781808000200241b004" - "6a200229039005220642fdfff3ffcffffff9897f7e2203420042abd5feff" - "ffffbfffb97f4200108781808000200241a0046a2003420042ffffcf8aeb" - "ffffd51e420010878180800020024190046a2003420042a4ecc3b58fd4b4" - "98e700420010878180800020024180046a2003420042bfa5949ccff0d2bb" - "e4004200108781808000200241f0036a2003420042d7d9ae9ae4f6e98dcb" - "004200108781808000200241e0036a20034200429acdffcba3bdc4801a42" - "00108781808000200241d0036a20024190056a41086a2903002209200229" - "03c00422084201867c220420022903a0047c2205200241b0046a41086a29" - "030020022903b00422032006427d837c200354ad7c7c220642fdfff3ffcf" - "fffff9897f7e2203420042abd5feffffffbfffb97f420010878180800020" - "0241c0036a2003420042ffffcf8aebffffd51e4200108781808000200241" - "d0026a2003420042a4ecc3b58fd4b498e7004200108781808000200241e0" - "016a2003420042bfa5949ccff0d2bbe4004200108781808000200241f000" - "6a2003420042d7d9ae9ae4f6e98dcb004200108781808000200220034200" - "429acdffcba3bdc4801a4200108781808000200241b0036a20022903c003" - "220a20022903e005220b20022903d004220c200241c0046a41086a290300" - "7c22074201862008423f88847c22082004200954ad7c2209200229039004" - "7c220d200241a0046a41086a2903002005200454ad7c2006200554ad7c7c" - "220e7c2204200241d0036a41086a29030020022903d003220320067c2003" - "54ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5feffffffbf" - "ffb97f4200108781808000200241a0036a2003420042ffffcf8aebffffd5" - "1e420010878180800020024190036a2003420042a4ecc3b58fd4b498e700" - "420010878180800020024180036a2003420042bfa5949ccff0d2bbe40042" - "00108781808000200241f0026a2003420042d7d9ae9ae4f6e98dcb004200" - "108781808000200241e0026a20034200429acdffcba3bdc4801a42001087" - "81808000200241c0026a20022903a003220f200241e0056a41086a290300" - "2008200b54ad7c2009200854ad7c2210200241d0046a41086a2903002007" - "200c54ad7c220c20022903e0047c220620022903a0057c22084201862007" - "423f88847c22072002290380047c220b20024190046a41086a290300200d" - "200954ad7c200e200d54ad7c7c220920022903d0027c220d200241c0036a" - "41086a2903002004200a54ad7c2005200454ad7c7c220a7c2204200241b0" - "036a41086a29030020022903b003220320057c200354ad7c7c220542fdff" - "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" - "8000200241b0026a2003420042ffffcf8aebffffd51e4200108781808000" - "200241a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" - "024190026a2003420042bfa5949ccff0d2bbe40042001087818080002002" - "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200241" - "f0016a20034200429acdffcba3bdc4801a4200108781808000200241d001" - "6a20022903b0022211200241d0026a41086a290300200d200954ad7c200a" - "200d54ad7c221220022903e0017c220d20024180046a41086a290300200b" - "200754ad7c2009200b54ad7c221320022903f0037c22092007201054ad22" - "0e20022903a0067c2207200241e0046a41086a2903002006200c54ad7c22" - "1020022903f0047c220b20022903b0057c220a200241a0056a41086a2903" - "002008200654ad7c7c22064201862008423f88847c22147c22157c220820" - "02290390037c220c200241a0036a41086a2903002004200f54ad7c200520" - "0454ad7c7c22167c2204200241c0026a41086a29030020022903c0022203" - "20057c200354ad7c7c220542fdfff3ffcffffff9897f7e2203420042abd5" - "feffffffbfffb97f4200108781808000200241c0016a2003420042ffffcf" - "8aebffffd51e4200108781808000200241b0016a2003420042a4ecc3b58f" - "d4b498e7004200108781808000200241a0016a2003420042bfa5949ccff0" - "d2bbe400420010878180800020024190016a2003420042d7d9ae9ae4f6e9" - "8dcb00420010878180800020024180016a20034200429acdffcba3bdc480" - "1a4200108781808000200241e0006a20022903c0012217200241a0066a41" - "086a2903002007200e54ad7c2014200754ad7c2214200241f0046a41086a" - "290300200b201054ad7c22182002290380057c220720022903c0057c220e" - "200241b0056a41086a290300200a200b54ad7c2006200a54ad7c7c220b20" - "022903f0057c220a4201862006423f88847c220620022903e0037c220f20" - "0241f0036a41086a2903002009201354ad7c2015200954ad7c7c22092002" - "2903707c2210200241e0016a41086a290300200d201254ad7c2008200d54" - "ad7c7c220d2002290380037c221220024190036a41086a290300200c2008" - "54ad7c2016200c54ad7c7c220820022903a0027c220c200241b0026a4108" - "6a2903002004201154ad7c2005200454ad7c7c22157c2204200241d0016a" - "41086a29030020022903d001220320057c200354ad7c7c220542fdfff3ff" - "cffffff9897f7e2203420042abd5feffffffbfffb97f4200108781808000" - "200241d0006a2003420042ffffcf8aebffffd51e42001087818080002002" - "41c0006a2003420042a4ecc3b58fd4b498e7004200108781808000200241" - "306a2003420042bfa5949ccff0d2bbe4004200108781808000200241206a" - "2003420042d7d9ae9ae4f6e98dcb004200108781808000200241106a2003" - "4200429acdffcba3bdc4801a4200108781808000200241086a2903002116" - "200241d0066a41086a290300211920024180066a41086a290300211a2002" - "41d0056a41086a290300211b200229039006211c20022903b006211d2002" - "2903e002211e200241e0026a41086a290300211f200241f0026a41086a29" - "03002120200241b0066a41086a290300212120024190066a41086a290300" - "212220022903c006212320022903f006210320022903f0012124200241f0" - "016a41086a2903002125200229038002212620024180026a41086a290300" - "212720024190026a41086a2903002128200241c0066a41086a2903002129" - "20022903e006212a200241f0066a41086a290300212b200229038001212c" - "20024180016a41086a290300212d200229039001212e20024190016a4108" - "6a290300212f20022903a0012130200241a0016a41086a29030021312002" - "41b0016a41086a2903002132200241e0066a41086a290300213320022903" - "8007211120022903102134200241106a41086a2903002135200229032021" - "36200241206a41086a290300213720022903302138200241306a41086a29" - "030021392002290340213a200241c0006a41086a290300213b2002200229" - "0350223c2006201454ad223d20022903d0067c221320024180056a41086a" - "2903002007201854ad7c221820022903d0057c2214200241c0056a41086a" - "290300200e200754ad7c200b200e54ad7c7c22072002290380067c220e20" - "0241f0056a41086a290300200a200b54ad7c7c220b420186200a423f8884" - "7c220a200241e0036a41086a290300200f200654ad7c2009200f54ad7c7c" - "220620022903007c220f200241f0006a41086a2903002010200954ad7c20" - "0d201054ad7c7c220920022903f0027c221020024180036a41086a290300" - "2012200d54ad7c2008201254ad7c7c220d2002290390027c2212200241a0" - "026a41086a290300200c200854ad7c2015200c54ad7c7c220820022903b0" - "017c220c200241c0016a41086a2903002004201754ad7c2005200454ad7c" - "7c22157c2204200241e0006a41086a2903002002290360221720057c2017" - "54ad7c7c2217370390072002203a20302026201e20192013203d54ad7c20" - "0a201354ad7c2213201d201c201b2014201854ad7c2007201454ad7c2214" - "7c2205201a200e200754ad7c200b200e54ad7c7c22077c220e420186200b" - "423f88847c220b2006200a54ad7c220a2016200f200654ad7c2009200f54" - "ad7c7c22067c220f20202010200954ad7c200d201054ad7c7c22097c2210" - "20282012200d54ad7c2008201254ad7c7c220d7c22122032200c200854ad" - "7c2015200c54ad7c7c22087c220c200241d0006a41086a2903002004203c" - "54ad7c2017200454ad7c7c22153703980720022038202e2024200a200b54" - "ad2006200a54ad7c22162003202320222005201454ad7c2007200554ad7c" - "22147c22042021200e200754ad7c7c2205420186200e423f88847c220720" - "0b201354ad7c22137c220b201f200f200654ad7c2009200f54ad7c7c2206" - "7c220a20272010200954ad7c200d201054ad7c7c22097c220e2031201220" - "0d54ad7c2008201254ad7c7c220d7c220f203b200c200854ad7c2015200c" - "54ad7c7c220c3703a00720022036202c200b201654ad2006200b54ad7c22" - "0b202b2007200354ad7c2013200754ad7c2210202a20292004201454ad7c" - "2005200454ad7c22127c22034201862005423f88847c22137c2204202520" - "0a200654ad7c2009200a54ad7c7c22057c2206202f200e200954ad7c200d" - "200e54ad7c7c22077c22082039200f200d54ad7c200c200f54ad7c7c2209" - "3703a807200220342004200b54ad2005200454ad7c220d20112033200320" - "1254ad7c220b4201862003423f88847c22032013201054ad7c220a7c2204" - "202d2006200554ad7c2007200654ad7c7c22057c220620372008200754ad" - "7c2009200854ad7c7c22073703b00720022004200d54ad2005200454ad7c" - "200b423f8820024180076a41086a2903002003201154ad7c200a200354ad" - "7c7c7c20352006200554ad7c2007200654ad7c7c3703b807200020024190" - "076a10d680808000200241c0076a2480808080000be60101037f23808080" - "80004180126b220324808080800020032001200210b480808000200341a0" - "026a200141a0026a2204200241a0026a220510b480808000200341c0046a" - "2002200510c380808000200341e0066a2004200110c38080800020034180" - "096a200341e0066a200341c0046a10b480808000200341a00b6a20034180" - "096a200310b780808000200341c00d6a200341a00b6a200341a0026a10b7" - "80808000200341e00f6a200341a0026a10b6808080002000200341e00f6a" - "200310c380808000200041a0026a200341c00d6a41a0021086818080001a" - "20034180126a2480808080000b3c01017f23808080800041c0046b220224" - "808080800020022000200110be808080002000200241c004108681808000" - "1a200241c0046a2480808080000bd80701077f23808080800041c00d6b22" - "022480808080002002200141e000108681808000220241e0006a200141e0" - "006a220341e0001086818080001a200241c0016a200141c0016a220441e0" - "001086818080001a200241a0026a200141a0026a220541e0001086818080" - "001a20024180036a20014180036a220641e0001086818080001a200241e0" - "036a200141e0036a220741e0001086818080001a200241a00b6a20012006" - "10eb80808000200241c0046a200241a00b6a41e0001086818080001a2002" - "41a0056a200241a00b6a41e0006a220841e0001086818080001a20022002" - "41c0046a200110bb80808000200241a00b6a2002200210bc808080002002" - "200241a00b6a200241c0046a10bc8080800020024180036a200241a0056a" - "200610bc80808000200241a00b6a20024180036a20024180036a10bc8080" - "800020024180036a200241a00b6a200241a0056a10bc80808000200241a0" - "0b6a2005200410eb8080800020024180066a200241a00b6a41e000108681" - "8080001a200241e0066a200841e0001086818080001a200241a00b6a2003" - "200710eb80808000200241c0076a200241a00b6a41e0001086818080001a" - "200241a0086a200841e0001086818080001a200241e0006a20024180066a" - "200310bb80808000200241a00b6a200241e0006a200241e0006a10bc8080" - "8000200241e0006a200241a00b6a20024180066a10bc80808000200241e0" - "036a200241e0066a200710bc80808000200241a00b6a200241e0036a2002" - "41e0036a10bc80808000200241e0036a200241a00b6a200241e0066a10bc" - "80808000200241a00b6a200241a0086a200241a0086a41306a220110b880" - "808000200241a00b6a41306a200241a0086a200110b98080800020024180" - "066a200241a00b6a41e0001086818080001a200241a0026a20024180066a" - "200510bc80808000200241a00b6a200241a0026a200241a0026a10bc8080" - "8000200241a0026a200241a00b6a20024180066a10bc80808000200241c0" - "016a200241c0076a200410bb80808000200241a00b6a200241c0016a2002" - "41c0016a10bc80808000200241c0016a200241a00b6a200241c0076a10bc" - "8080800020024180096a200241e0001086818080001a20024180096a41e0" - "006a200241e0006a41e0001086818080001a20024180096a41c0016a2002" - "41c0016a41e0001086818080001a200241a00b6a200241a0026a41e00010" - "86818080001a200820024180036a41e0001086818080001a200241a00b6a" - "41c0016a200241e0036a41e0001086818080001a200020024180096a41a0" - "0210868180800041a0026a200241a00b6a41a0021086818080001a200241" - "c00d6a2480808080000bcd0102037f017e2380808080004180096b220224" - "8080808000200210ac8080800041002103413f2104034002400240024020" - "04417f460d0042012004413f71ad8642808084808080c080528321052003" - "4101710d01200542005221030c020b200041a0026a200241a0026a10b180" - "8080002000200241a0021086818080001a20024180096a2480808080000f" - "0b200241c0046a200210c0808080002002200241c0046a41c00410868180" - "80001a410121030b02402005500d002002200110bf808080000b2004417f" - "6a21040c000b0b23002000200110db80808000200041306a200141306a10" - "db808080007110a3808080000b3e0020002001200210bc80808000200041" - "e0006a200141e0006a200241e0006a10bc80808000200041c0016a200141" - "c0016a200241c0016a10bc808080000bbc0101047f23808080800041106b" - "2202248080808000200141086a21030340200241086a200310e680808000" - "02400240024020022d0008450d0020022d00092101410121040c010b0240" - "20012802002204450d00200420012802042205470d020b2002200141146a" - "10e68080800020022d0001210120022d000021040b200020013a00012000" - "20044101713a0000200241106a2480808080000f0b200142808080808001" - "37020c20012005417f6a2204360208200120043602040c000b0b6f01057f" - "23808080800041106b220324808080800041002104410121054100210602" - "400340200120062207460d01200341086a200210d080808000200741016a" - "210620032d00080d000b200120076b2104410021050b2000200436020420" - "002005360200200341106a2480808080000bf50401037f23808080800041" - "b0096b22022480808080002002200141306a220310bd8080800020024130" - "6a2002200210b980808000200241e0006a200241306a200241306a10b980" - "80800020024190016a200241e0006a200241e0006a10b980808000200241" - "c0016a2003200141e0006a220410a780808000200241f0016a200410bd80" - "808000200241d0086a200241f0016a200241f0016a10b980808000200241" - "80096a200241d0086a200241d0086a10b980808000200241c0076a200241" - "80096a20024180096a10b980808000200241a0026a200241c0076a200241" - "80096a10b980808000200241d0026a200241a0026a20024190016a10a780" - "80800020024180036a2002200241a0026a10b980808000200241b0036a20" - "0241c0016a20024190016a10a780808000200241e0036a200241a0026a20" - "0241a0026a10b98080800020024190046a200241e0036a200241a0026a10" - "b980808000200241c0046a200220024190046a10b880808000200241f004" - "6a200241c0046a20024180036a10a780808000200241a0056a200241d002" - "6a200241f0046a10b980808000200241d0056a2001200310a78080800020" - "024180066a200241c0046a200241d0056a10a780808000200241b0066a20" - "024180066a20024180066a10b980808000200241b0066a41306a200241a0" - "056a41301086818080001a200241b0066a41e0006a200241b0036a413010" - "86818080001a200241c0076a410041301085818080001a200241c0076a41" - "e0006a410041301085818080001a200241c0076a41306a41e086c0800041" - "301086818080001a2000200241b0066a200241c0076a200410a980808000" - "10c880808000200241b0096a2480808080000bf60601057f238080808000" - "41900d6b220324808080800020032001200210a780808000200341306a20" - "0141306a2204200241306a220510a780808000200341e0006a200141e000" - "6a2206200241e0006a220710a78080800020034190016a2001200410b980" - "808000200341c0016a2002200510b980808000200341f0016a2003419001" - "6a200341c0016a10a780808000200341a0026a2003200341306a10b98080" - "8000200341d0026a200341f0016a200341a0026a10b88080800020034180" - "036a2004200610b980808000200341b0036a2005200710b9808080002003" - "41e0036a20034180036a200341b0036a10a78080800020034190046a2003" - "41306a200341e0006a10b980808000200341c0046a200341e0036a200341" - "90046a10b880808000200341f0046a2001200610b980808000200341a005" - "6a2002200710b980808000200341d0056a200341f0046a200341a0056a10" - "a78080800020034180066a2003200341e0006a10b980808000200341b006" - "6a200341d0056a20034180066a10b880808000200341e0066a2003200310" - "b98080800020034190076a200341e0066a200310b980808000200341800c" - "6a200341e0006a200341e0006a10b980808000200341b00c6a200341800c" - "6a200341800c6a10b980808000200341e00c6a200341b00c6a200341b00c" - "6a10b980808000200341c0076a200341e00c6a200341b00c6a10b9808080" - "00200341f0076a200341306a200341c0076a10b980808000200341a0086a" - "200341306a200341c0076a10b880808000200341a00b6a200341b0066a20" - "0341b0066a10b980808000200341d00b6a200341a00b6a200341a00b6a10" - "b980808000200341e00c6a200341d00b6a200341d00b6a10b98080800020" - "0341d0086a200341e00c6a200341d00b6a10b98080800020034180096a20" - "0341c0046a200341d0086a10a780808000200341b0096a200341d0026a20" - "0341a0086a10a7808080002000200341b0096a20034180096a10b8808080" - "00200341e0096a200341d0086a20034190076a10a780808000200341900a" - "6a200341a0086a200341f0076a10a780808000200041306a200341900a6a" - "200341e0096a10b980808000200341c00a6a20034190076a200341d0026a" - "10a780808000200341f00a6a200341f0076a200341c0046a10a780808000" - "200041e0006a200341f00a6a200341c00a6a10b980808000200341900d6a" - "2480808080000b41002000200120022003109080808000200041306a2001" - "41306a200241306a2003109080808000200041e0006a200141e0006a2002" - "41e0006a20031090808080000bbe0601057f200041786a22012000417c6a" - "280200220241787122006a21030240024020024101710d00200241027145" - "0d012001280200220220006a21000240200120026b2201410028029c97c0" - "8000470d0020032802044103714103470d014100200036029497c0800020" - "032003280204417e7136020420012000410172360204200320003602000f" - "0b2001200210cc808080000b024002400240024002400240200328020422" - "024102710d00200341002802a097c08000460d022003410028029c97c080" - "00460d0320032002417871220210cc808080002001200220006a22004101" - "72360204200120006a20003602002001410028029c97c08000470d014100" - "200036029497c080000f0b20032002417e71360204200120004101723602" - "04200120006a20003602000b2000418002490d0220012000108481808000" - "41002101410041002802b497c08000417f6a22003602b497c0800020000d" - "04024041002802fc94c080002200450d00410021010340200141016a2101" - "200028020822000d000b0b4100200141ff1f200141ff1f4b1b3602b497c0" - "80000f0b410020013602a097c080004100410028029897c0800020006a22" - "0036029897c080002001200041017236020402402001410028029c97c080" - "00470d004100410036029497c080004100410036029c97c080000b200041" - "002802ac97c0800022044d0d0341002802a097c080002200450d03410021" - "02410028029897c0800022054129490d0241f494c0800021010340024020" - "01280200220320004b0d002000200320012802046a490d040b2001280208" - "21010c000b0b4100200136029c97c080004100410028029497c080002000" - "6a220036029497c0800020012000410172360204200120006a2000360200" - "0f0b200041f80171418495c080006a210302400240410028028c97c08000" - "220241012000410376742200710d004100200220007236028c97c0800020" - "0321000c010b200328020821000b200320013602082000200136020c2001" - "200336020c200120003602080f0b024041002802fc94c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff" - "1f200241ff1f4b1b3602b497c08000200520044d0d004100417f3602ac97" - "c080000b0b4d01017f23808080800041206b220224808080800020024100" - "36021020024101360204200242043702082002412e36021c200220003602" - "182002200241186a3602002002200110a480808000000b800601057f0240" - "024002402000417c6a220328020022044178712205410441082004410371" - "22061b20016a490d0002402006450d002005200141276a4b0d020b411020" - "02410b6a4178712002410b491b210102400240024020060d002001418002" - "490d0120052001410472490d01200520016b418180084f0d010c020b2000" - "41786a220720056a21060240024002400240200520014f0d002006410028" - "02a097c08000460d032006410028029c97c08000460d0220062802042204" - "4102710d042004417871220420056a22052001490d042006200410cc8080" - "8000200520016b22024110490d0120032001200328020041017172410272" - "360200200720016a22012002410372360204200720056a22052005280204" - "4101723602042001200210cd8080800020000f0b200520016b2202410f4d" - "0d0420032001200441017172410272360200200720016a22052002410372" - "360204200620062802044101723602042005200210cd8080800020000f0b" - "20032005200328020041017172410272360200200720056a220220022802" - "0441017236020420000f0b410028029497c0800020056a22052001490d01" - "02400240200520016b2202410f4b0d002003200441017120057241027236" - "0200200720056a2202200228020441017236020441002102410021010c01" - "0b20032001200441017172410272360200200720016a2201200241017236" - "0204200720056a2205200236020020052005280204417e713602040b4100" - "200136029c97c080004100200236029497c0800020000f0b410028029897" - "c0800020056a220520014b0d040b0240200210ce8080800022050d004100" - "0f0b20052000417c4178200328020022014103711b20014178716a220120" - "0220012002491b1086818080002102200010c980808000200221000b2000" - "0f0b41e992c08000419893c0800010ca80808000000b41a893c0800041d8" - "93c0800010ca80808000000b200320012004410171724102723602002007" - "20016a2202200520016b22054101723602044100200536029897c0800041" - "0020023602a097c0800020000b820301047f200028020c21020240024002" - "402001418002490d002000280218210302400240024020022000470d0020" - "0041144110200028021422021b6a28020022010d01410021020c020b2000" - "2802082201200236020c200220013602080c010b200041146a200041106a" - "20021b21040340200421052001220241146a200241106a20022802142201" - "1b210420024114411020011b6a28020022010d000b200541003602000b20" - "03450d020240200028021c41027441f493c080006a22012802002000460d" - "0020034110411420032802102000461b6a20023602002002450d030c020b" - "2001200236020020020d014100410028029097c08000417e200028021c77" - "7136029097c080000c020b0240200220002802082204460d002004200236" - "020c200220043602080f0b4100410028028c97c08000417e200141037677" - "7136028c97c080000f0b20022003360218024020002802102201450d0020" - "022001360210200120023602180b20002802142201450d00200220013602" - "14200120023602180f0b0ba00401027f200020016a210202400240200028" - "020422034101710d002003410271450d012000280200220320016a210102" - "40200020036b2200410028029c97c08000470d0020022802044103714103" - "470d014100200136029497c0800020022002280204417e71360204200020" - "01410172360204200220013602000c020b2000200310cc808080000b0240" - "024002400240200228020422034102710d00200241002802a097c0800046" - "0d022002410028029c97c08000460d0320022003417871220310cc808080" - "002000200320016a2201410172360204200020016a200136020020004100" - "28029c97c08000470d014100200136029497c080000f0b20022003417e71" - "36020420002001410172360204200020016a20013602000b024020014180" - "02490d00200020011084818080000f0b200141f80171418495c080006a21" - "0202400240410028028c97c08000220341012001410376742201710d0041" - "00200320017236028c97c08000200221010c010b200228020821010b2002" - "20003602082001200036020c2000200236020c200020013602080f0b4100" - "20003602a097c080004100410028029897c0800020016a220136029897c0" - "8000200020014101723602042000410028029c97c08000470d0141004100" - "36029497c080004100410036029c97c080000f0b4100200036029c97c080" - "004100410028029497c0800020016a220136029497c08000200020014101" - "72360204200020016a20013602000f0b0bc12502087f017e024002400240" - "02400240024002400240200041f4014b0d00410028028c97c08000220141" - "102000410b6a41f803712000410b491b220241037622037622004103710d" - "012002410028029497c080004d0d0720000d02410028029097c080002200" - "0d030c070b2000410b6a22034178712102410028029097c080002204450d" - "06411f21050240200041f4ffff074b0d002002410620034108766722006b" - "7641017120004101746b413e6a21050b410020026b210302402005410274" - "41f493c080006a28020022010d0041002100410021060c040b4100210020" - "024100411920054101766b2005411f461b74210741002106034002402001" - "220128020441787122082002490d00200820026b220820034f0d00200821" - "032001210620080d004100210320012106200121000c060b200128021422" - "082000200820012007411d764104716a41106a2802002201471b20002008" - "1b2100200741017421072001450d040c000b0b024002402000417f734101" - "7120036a22074103742200418495c080006a22022000418c95c080006a28" - "020022032802082206460d002006200236020c200220063602080c010b41" - "002001417e2007777136028c97c080000b20032000410372360204200320" - "006a22002000280204410172360204200341086a0f0b0240024020002003" - "7441022003742200410020006b72716822084103742203418495c080006a" - "22062003418c95c080006a28020022002802082207460d00200720063602" - "0c200620073602080c010b41002001417e2008777136028c97c080000b20" - "002002410372360204200020026a2207200320026b220241017236020420" - "0020036a20023602000240410028029497c080002201450d002001417871" - "418495c080006a2106410028029c97c08000210302400240410028028c97" - "c08000220841012001410376742201710d004100200820017236028c97c0" - "8000200621010c010b200628020821010b20062003360208200120033602" - "0c2003200636020c200320013602080b4100200736029c97c08000410020" - "0236029497c08000200041086a0f0b20006841027441f493c080006a2802" - "00220628020441787120026b210320062101024002400340024020062802" - "1022000d00200628021422000d0020012802182105024002400240200128" - "020c22002001470d00200141144110200128021422001b6a28020022060d" - "01410021000c020b20012802082206200036020c200020063602080c010b" - "200141146a200141106a20001b21070340200721082006220041146a2000" - "41106a200028021422061b210720004114411020061b6a28020022060d00" - "0b200841003602000b2005450d030240200128021c41027441f493c08000" - "6a22062802002001460d0020054110411420052802102001461b6a200036" - "02002000450d040c030b2006200036020020000d024100410028029097c0" - "8000417e200128021c777136029097c080000c030b200028020441787120" - "026b22062003200620034922061b21032000200120061b2101200021060c" - "000b0b20002005360218024020012802102206450d002000200636021020" - "0620003602180b20012802142206450d0020002006360214200620003602" - "180b02400240024020034110490d0020012002410372360204200120026a" - "22022003410172360204200220036a2003360200410028029497c0800022" - "07450d012007417871418495c080006a2106410028029c97c08000210002" - "400240410028028c97c08000220841012007410376742207710d00410020" - "0820077236028c97c08000200621070c010b200628020821070b20062000" - "3602082007200036020c2000200636020c200020073602080c010b200120" - "0320026a2200410372360204200120006a22002000280204410172360204" - "0c010b4100200236029c97c080004100200336029497c080000b20014108" - "6a0f0b024020002006720d004100210641022005742200410020006b7220" - "04712200450d0320006841027441f493c080006a28020021000b2000450d" - "010b0340200020062000280204417871220120026b220820034922051b21" - "04200120024921072008200320051b21080240200028021022010d002000" - "28021421010b2006200420071b21062003200820071b2103200121002001" - "0d000b0b2006450d000240410028029497c0800022002002490d00200320" - "0020026b4f0d010b20062802182105024002400240200628020c22002006" - "470d00200641144110200628021422001b6a28020022010d01410021000c" - "020b20062802082201200036020c200020013602080c010b200641146a20" - "0641106a20001b21070340200721082001220041146a200041106a200028" - "021422011b210720004114411020011b6a28020022010d000b2008410036" - "02000b02402005450d0002400240200628021c41027441f493c080006a22" - "012802002006460d0020054110411420052802102006461b6a2000360200" - "2000450d020c010b2001200036020020000d004100410028029097c08000" - "417e200628021c777136029097c080000c010b2000200536021802402006" - "2802102201450d0020002001360210200120003602180b20062802142201" - "450d0020002001360214200120003602180b0240024020034110490d0020" - "062002410372360204200620026a22002003410172360204200020036a20" - "0336020002402003418002490d00200020031084818080000c020b200341" - "f80171418495c080006a210202400240410028028c97c080002201410120" - "03410376742203710d004100200120037236028c97c08000200221030c01" - "0b200228020821030b200220003602082003200036020c2000200236020c" - "200020033602080c010b2006200320026a2200410372360204200620006a" - "220020002802044101723602040b200641086a0f0b024002400240024002" - "4002400240410028029497c08000220020024f0d000240410028029897c0" - "8000220020024b0d0041002100200241af80046a22064110764000220341" - "7f4622070d0720034110742201450d07410041002802a497c08000410020" - "064180807c7120071b22086a22003602a497c08000410041002802a897c0" - "800022032000200320004b1b3602a897c0800002400240024041002802a0" - "97c080002203450d0041f494c08000210003402000280200220620002802" - "0422076a2001460d02200028020822000d000c030b0b0240024041002802" - "b097c080002200450d00200020014d0d010b410020013602b097c080000b" - "410041ff1f3602b497c08000410020083602f894c08000410020013602f4" - "94c080004100418495c0800036029095c080004100418c95c08000360298" - "95c080004100418495c0800036028c95c080004100419495c080003602a0" - "95c080004100418c95c0800036029495c080004100419c95c080003602a8" - "95c080004100419495c0800036029c95c08000410041a495c080003602b0" - "95c080004100419c95c080003602a495c08000410041ac95c080003602b8" - "95c08000410041a495c080003602ac95c08000410041b495c080003602c0" - "95c08000410041ac95c080003602b495c08000410041bc95c080003602c8" - "95c08000410041b495c080003602bc95c080004100410036028095c08000" - "410041c495c080003602d095c08000410041bc95c080003602c495c08000" - "410041c495c080003602cc95c08000410041cc95c080003602d895c08000" - "410041cc95c080003602d495c08000410041d495c080003602e095c08000" - "410041d495c080003602dc95c08000410041dc95c080003602e895c08000" - "410041dc95c080003602e495c08000410041e495c080003602f095c08000" - "410041e495c080003602ec95c08000410041ec95c080003602f895c08000" - "410041ec95c080003602f495c08000410041f495c0800036028096c08000" - "410041f495c080003602fc95c08000410041fc95c0800036028896c08000" - "410041fc95c0800036028496c080004100418496c0800036029096c08000" - "4100418c96c0800036029896c080004100418496c0800036028c96c08000" - "4100419496c080003602a096c080004100418c96c0800036029496c08000" - "4100419c96c080003602a896c080004100419496c0800036029c96c08000" - "410041a496c080003602b096c080004100419c96c080003602a496c08000" - "410041ac96c080003602b896c08000410041a496c080003602ac96c08000" - "410041b496c080003602c096c08000410041ac96c080003602b496c08000" - "410041bc96c080003602c896c08000410041b496c080003602bc96c08000" - "410041c496c080003602d096c08000410041bc96c080003602c496c08000" - "410041cc96c080003602d896c08000410041c496c080003602cc96c08000" - "410041d496c080003602e096c08000410041cc96c080003602d496c08000" - "410041dc96c080003602e896c08000410041d496c080003602dc96c08000" - "410041e496c080003602f096c08000410041dc96c080003602e496c08000" - "410041ec96c080003602f896c08000410041e496c080003602ec96c08000" - "410041f496c0800036028097c08000410041ec96c080003602f496c08000" - "410041fc96c0800036028897c08000410041f496c080003602fc96c08000" - "410020013602a097c08000410041fc96c0800036028497c0800041002008" - "41586a220036029897c0800020012000410172360204200120006a412836" - "0204410041808080013602ac97c080000c080b200320014f0d0020062003" - "4b0d00200028020c450d030b410041002802b097c0800022002001200020" - "01491b3602b097c08000200120086a210641f494c0800021000240024002" - "400340200028020022072006460d01200028020822000d000c020b0b2000" - "28020c450d010b41f494c080002100024003400240200028020022062003" - "4b0d002003200620002802046a2206490d020b200028020821000c000b0b" - "410020013602a097c080004100200841586a220036029897c08000200120" - "00410172360204200120006a4128360204410041808080013602ac97c080" - "002003200641606a41787141786a22002000200341106a491b2207411b36" - "020441002902f494c080002109200741106a41002902fc94c08000370200" - "20072009370208410020083602f894c08000410020013602f494c0800041" - "00200741086a3602fc94c080004100410036028095c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072003460d07" - "20072007280204417e713602042003200720036b22004101723602042007" - "200036020002402000418002490d00200320001084818080000c080b2000" - "41f80171418495c080006a210602400240410028028c97c0800022014101" - "2000410376742200710d004100200120007236028c97c08000200621000c" - "010b200628020821000b200620033602082000200336020c200320063602" - "0c200320003602080c070b200020013602002000200028020420086a3602" - "04200120024103723602042007410f6a41787141786a2206200120026a22" - "006b2103200641002802a097c08000460d032006410028029c97c0800046" - "0d040240200628020422024103714101470d0020062002417871220210cc" - "80808000200220036a2103200620026a220628020421020b20062002417e" - "7136020420002003410172360204200020036a2003360200024020034180" - "02490d00200020031084818080000c060b200341f80171418495c080006a" - "210202400240410028028c97c08000220641012003410376742203710d00" - "4100200620037236028c97c08000200221030c010b200228020821030b20" - "0220003602082003200036020c2000200236020c200020033602080c050b" - "4100200020026b220336029897c08000410041002802a097c08000220020" - "026a22063602a097c0800020062003410172360204200020024103723602" - "04200041086a21000c060b410028029c97c0800021030240024020002002" - "6b2206410f4b0d004100410036029c97c080004100410036029497c08000" - "20032000410372360204200320006a220020002802044101723602040c01" - "0b4100200636029497c080004100200320026a220136029c97c080002001" - "2006410172360204200320006a2006360200200320024103723602040b20" - "0341086a0f0b2000200720086a360204410041002802a097c08000220041" - "0f6a417871220341786a22063602a097c080004100200020036b41002802" - "9897c0800020086a22036a41086a220136029897c0800020062001410172" - "360204200020036a4128360204410041808080013602ac97c080000c030b" - "410020003602a097c080004100410028029897c0800020036a2203360298" - "97c08000200020034101723602040c010b4100200036029c97c080004100" - "410028029497c0800020036a220336029497c08000200020034101723602" - "04200020036a20033602000b200141086a0f0b41002100410028029897c0" - "8000220320024d0d004100200320026b220336029897c080004100410028" - "02a097c08000220020026a22063602a097c0800020062003410172360204" - "20002002410372360204200041086a0f0b20000b4301017f238080808000" - "41206b2201248080808000200141003602182001410136020c200141d085" - "c0800036020820014204370210200141086a200010a480808000000b4e01" - "037f024020012802042202200128020822034e0d0020012003417f6a2204" - "36020820012802002d000020044107717641017110a38080800021040b20" - "0020043a0001200020022003483a00000b18002001200085220042002000" - "7d84427f5510a3808080000b10002000417f7341017110a3808080000bf2" - "0202017f017e23808080800041f0006b2206248080808000200620013602" - "0c2006200036020820062003360214200620023602102006410236021c20" - "0641c08dc08000360218024020042802000d002006410336025c200641f4" - "8dc08000360258200642033702642006418280808000ad42208622072006" - "41106aad8437034820062007200641086aad843703402006418380808000" - "ad422086200641186aad843703382006200641386a360260200641d8006a" - "200510a480808000000b200641206a41106a200441106a29020037030020" - "0641206a41086a200441086a290200370300200620042902003703202006" - "410436025c200641a88ec080003602582006420437026420064182808080" - "00ad4220862207200641106aad8437035020062007200641086aad843703" - "482006418480808000ad422086200641206aad8437034020064183808080" - "00ad422086200641186aad843703382006200641386a360260200641d800" - "6a200510a480808000000bb30301037f2380808080004180016b22022480" - "8080800020002802002100024002400240200128021422034110710d0020" - "03412071450d0120002d0000210341810121000340200220006a417e6a20" - "03410f712204413072200441376a2004410a491b3a0000200341ff017122" - "0441047621032000417f6a21002004410f4b0d000b200141fd8ec0800041" - "02200220006a417f6a41810120006b10d58080800021000c020b20002d00" - "00210341810121000340200220006a417e6a2003410f7122044130722004" - "41d7006a2004410a491b3a0000200341ff0171220441047621032000417f" - "6a21002004410f4b0d000b200141fd8ec080004102200220006a417f6a41" - "810120006b10d58080800021000c010b024002400240024020002d000022" - "0341e400490d002002200341e4006e2204419c7f6c20036a41ff01714101" - "7441ff8ec080006a2f00003b0001410021000c010b410221002003410a4f" - "0d01200321040b200220006a20044130723a00000c010b41012100200220" - "0341017441ff8ec080006a2f00003b00010b200141014100200220006a20" - "0041037310d58080800021000b20024180016a24808080800020000bb605" - "01087f20002802142205410171220620046a21070240024020054104710d" - "00410021010c010b0240024020020d00410021080c010b02402002410371" - "22090d000c010b410021082001210a03402008200a2c000041bf7f4a6a21" - "08200a41016a210a2009417f6a22090d000b0b200820076a21070b412b41" - "8080c40020061b2106024020002802000d000240200028021c220a200028" - "0220220820062001200210f480808000450d0041010f0b200a2003200420" - "0828020c11808080800080808080000f0b02400240024002402000280204" - "220a20074b0d00200028021c220a2000280220220820062001200210f480" - "808000450d0141010f0b2005410871450d01200028021021052000413036" - "021020002d0018210b4101210c200041013a0018200028021c2208200028" - "0220220920062001200210f4808080000d02200a20076b41016a210a0240" - "0340200a417f6a220a450d01200841302009280210118180808000808080" - "8000450d000b41010f0b0240200820032004200928020c11808080800080" - "80808000450d0041010f0b2000200b3a00182000200536021041000f0b20" - "0a20032004200828020c1180808080008080808000210c0c010b200a2007" - "6b2105024002400240410120002d0018220a200a4103461b220a0e030200" - "01020b2005210a410021050c010b2005410176210a200541016a41017621" - "050b200a41016a210a2000280210210720002802202108200028021c2109" - "02400340200a417f6a220a450d0120092007200828021011818080800080" - "80808000450d000b41010f0b4101210c2009200820062001200210f48080" - "80000d00200920032004200828020c11808080800080808080000d004100" - "210a034002402005200a470d0020052005490f0b200a41016a210a200920" - "0720082802101181808080008080808000450d000b200a417f6a2005490f" - "0b200c0be802010d7e2000200129032822022001290300220342d5aa8180" - "8080c080c6007c2204200354ad427f7c22052005200129030822067c2205" - "200654ad7c2005428180b0f5948080aa617c2207200554ad7c427f7c423f" - "8722052005200129031022087c2205200854ad7c200542dc93bccaf0abcb" - "e7987f7c2209200554ad7c427f7c423f87220520052001290318220a7c22" - "05200a54ad7c200542c1daebe3b08fadc49b7f7c220b200554ad7c427f7c" - "423f87220520052001290320220c7c2205200c54ad7c200542a9a6d1e59b" - "8996f2b47f7c220d200554ad7c427f7c423f872205200220057c22052002" - "54ad7c200542e6b280b4dcc2bbff657c220e200554ad7c2205427f7c2202" - "83420020057d2205200e83843703282000200c2002832005200d83843703" - "202000200a2002832005200b838437031820002008200283200520098384" - "370310200020062002832005200783843703082000200320028320052004" - "83843703000b2c0002402002450d0041002d00e893c080001a200210ce80" - "80800021010b20002002360204200020013602000b5a01017f2380808080" - "0041106b2202248080808000200241086a20002000280200410141a00210" - "8b80808000024020022802082200418180808078460d002000200228020c" - "2001108c80808000000b200241106a2480808080000b4800200020012002" - "200310b080808000200041e0006a200141e0006a200241e0006a200310b0" - "80808000200020022d00c00120012d00c001220273410020036b71200273" - "3a00c0010b2b00200020012002200310b080808000200020022d00602001" - "2d0060220273410020036b712002733a00600b8501002000290300200129" - "030010d1808080002000290308200129030810d1808080007110a3808080" - "002000290310200129031010d1808080007110a380808000200029031820" - "0129031810d1808080007110a3808080002000290320200129032010d180" - "8080007110a3808080002000290328200129032810d1808080007110a380" - "8080000bda0602017f067e23808080800041306b22022480808080002002" - "2001290000220342388620034280fe0383422886842003428080fc078342" - "1886200342808080f80f834208868484200342088842808080f80f832003" - "421888428080fc07838420034228884280fe038320034238888484842204" - "37032820022001290008220342388620034280fe03834228868420034280" - "80fc0783421886200342808080f80f834208868484200342088842808080" - "f80f832003421888428080fc07838420034228884280fe03832003423888" - "848484220537032020022001290010220342388620034280fe0383422886" - "842003428080fc0783421886200342808080f80f83420886848420034208" - "8842808080f80f832003421888428080fc07838420034228884280fe0383" - "2003423888848484220637031820022001290018220342388620034280fe" - "0383422886842003428080fc0783421886200342808080f80f8342088684" - "84200342088842808080f80f832003421888428080fc0783842003422888" - "4280fe038320034238888484842207370310200220012900202203423886" - "20034280fe0383422886842003428080fc0783421886200342808080f80f" - "834208868484200342088842808080f80f832003421888428080fc078384" - "20034228884280fe03832003423888848484220837030820022001290028" - "220342388620034280fe0383422886842003428080fc0783421886200342" - "808080f80f834208868484200342088842808080f80f8320034218884280" - "80fc07838420034228884280fe0383200342388884848422033703002002" - "419087c0800010dd80808000200342d5aa81808080c080c6007c200354ad" - "427f7c2203200820037c2203200854ad7c2003428180b0f5948080aa617c" - "200354ad7c427f7c423f872203200720037c2203200754ad7c200342dc93" - "bccaf0abcbe7987f7c200354ad7c427f7c423f872203200620037c220320" - "0654ad7c200342c1daebe3b08fadc49b7f7c200354ad7c427f7c423f8722" - "03200520037c2203200554ad7c200342a9a6d1e59b8996f2b47f7c200354" - "ad7c427f7c423f872203200420037c2203200454ad7c200342e6b280b4dc" - "c2bbff657c200354ad7ca741016a41017110a38080800021012000200241" - "3010868180800020013a0030200241306a2480808080000b3901017f2380" - "8080800041306b220224808080800020022000200110a780808000200020" - "0241301086818080001a200241306a2480808080000b9b1602017f177e23" - "808080800041a0056b2201248080808000200141b0046a20002903002202" - "42fdfff3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010" - "8781808000200141a0046a2003420042ffffcf8aebffffd51e4200108781" - "80800020014190046a2003420042a4ecc3b58fd4b498e700420010878180" - "800020014180046a2003420042bfa5949ccff0d2bbe40042001087818080" - "00200141f0036a2003420042d7d9ae9ae4f6e98dcb004200108781808000" - "200141e0036a20034200429acdffcba3bdc4801a42001087818080002001" - "41d0036a20012903a004220420002903087c2205200141b0046a41086a29" - "0300200220012903b00422037c200354ad7c7c220242fdfff3ffcffffff9" - "897f7e2203420042abd5feffffffbfffb97f4200108781808000200141c0" - "036a2003420042ffffcf8aebffffd51e4200108781808000200141d0026a" - "2003420042a4ecc3b58fd4b498e7004200108781808000200141e0016a20" - "03420042bfa5949ccff0d2bbe4004200108781808000200141f0006a2003" - "420042d7d9ae9ae4f6e98dcb004200108781808000200120034200429acd" - "ffcba3bdc4801a4200108781808000200141b0036a20012903c003220620" - "0129039004220720002903107c2208200141a0046a41086a290300200520" - "0454ad7c2002200554ad7c7c22097c2205200141d0036a41086a29030020" - "012903d003220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e" - "2203420042abd5feffffffbfffb97f4200108781808000200141a0036a20" - "03420042ffffcf8aebffffd51e420010878180800020014190036a200342" - "0042a4ecc3b58fd4b498e700420010878180800020014180036a20034200" - "42bfa5949ccff0d2bbe4004200108781808000200141f0026a2003420042" - "d7d9ae9ae4f6e98dcb004200108781808000200141e0026a20034200429a" - "cdffcba3bdc4801a4200108781808000200141c0026a20012903a003220a" - "200129038004220b20002903187c220420014190046a41086a2903002008" - "200754ad7c2009200854ad7c7c220820012903d0027c2207200141c0036a" - "41086a2903002005200654ad7c2002200554ad7c7c220c7c2205200141b0" - "036a41086a29030020012903b003220320027c200354ad7c7c220242fdff" - "f3ffcffffff9897f7e2203420042abd5feffffffbfffb97f420010878180" - "8000200141b0026a2003420042ffffcf8aebffffd51e4200108781808000" - "200141a0026a2003420042a4ecc3b58fd4b498e700420010878180800020" - "014190026a2003420042bfa5949ccff0d2bbe40042001087818080002001" - "4180026a2003420042d7d9ae9ae4f6e98dcb004200108781808000200141" - "f0016a20034200429acdffcba3bdc4801a4200108781808000200141d001" - "6a20012903b002220d20012903f003220e20002903207c22062001418004" - "6a41086a2903002004200b54ad7c2008200454ad7c7c220420012903e001" - "7c2209200141d0026a41086a2903002007200854ad7c200c200754ad7c7c" - "22082001290390037c2207200141a0036a41086a2903002005200a54ad7c" - "2002200554ad7c7c220c7c2205200141c0026a41086a29030020012903c0" - "02220320027c200354ad7c7c220242fdfff3ffcffffff9897f7e22034200" - "42abd5feffffffbfffb97f4200108781808000200141c0016a2003420042" - "ffffcf8aebffffd51e4200108781808000200141b0016a2003420042a4ec" - "c3b58fd4b498e7004200108781808000200141a0016a2003420042bfa594" - "9ccff0d2bbe400420010878180800020014190016a2003420042d7d9ae9a" - "e4f6e98dcb00420010878180800020014180016a20034200429acdffcba3" - "bdc4801a4200108781808000200141e0006a20012903c001220f20012903" - "e003221020002903287c220a200141f0036a41086a2903002006200e54ad" - "7c2004200654ad7c7c220620012903707c220b200141e0016a41086a2903" - "002009200454ad7c2008200954ad7c7c22042001290380037c2209200141" - "90036a41086a2903002007200854ad7c200c200754ad7c7c220820012903" - "a0027c2207200141b0026a41086a2903002005200d54ad7c2002200554ad" - "7c7c220c7c2205200141d0016a41086a29030020012903d001220320027c" - "200354ad7c7c220242fdfff3ffcffffff9897f7e2203420042abd5feffff" - "ffbfffb97f4200108781808000200141d0006a2003420042ffffcf8aebff" - "ffd51e4200108781808000200141c0006a2003420042a4ecc3b58fd4b498" - "e7004200108781808000200141306a2003420042bfa5949ccff0d2bbe400" - "4200108781808000200141206a2003420042d7d9ae9ae4f6e98dcb004200" - "108781808000200141106a20034200429acdffcba3bdc4801a4200108781" - "808000200141b0016a41086a290300210d20014190026a41086a29030021" - "0e200141f0026a41086a2903002111200141086a290300211220012903e0" - "022113200129038002211420012903a001211520012903402116200141c0" - "006a41086a2903002117200120012903502218200141e0036a41086a2903" - "00200a201054ad7c2006200a54ad7c221020012903007c2203200141f000" - "6a41086a290300200b200654ad7c2004200b54ad7c7c220620012903f002" - "7c220a20014180036a41086a2903002009200454ad7c2008200954ad7c7c" - "22042001290390027c2209200141a0026a41086a2903002007200854ad7c" - "200c200754ad7c7c220820012903b0017c2207200141c0016a41086a2903" - "002005200f54ad7c2002200554ad7c7c220b7c2205200141e0006a41086a" - "2903002001290360220c20027c200c54ad7c7c220c3703f0042001201620" - "152014201320122003201054ad7c2006200354ad7c220f7c22032011200a" - "200654ad7c2004200a54ad7c7c22027c2206200e2009200454ad7c200820" - "0954ad7c7c22047c2209200d2007200854ad7c200b200754ad7c7c22087c" - "2207200141d0006a41086a2903002005201854ad7c200c200554ad7c7c22" - "0a3703f8042001200141e0026a41086a2903002003200f54ad7c20022003" - "54ad7c220b20012903f0017c220320014180026a41086a29030020062002" - "54ad7c2004200654ad7c7c22052001290390017c2202200141a0016a4108" - "6a2903002009200454ad7c2008200954ad7c7c220420012903307c220620" - "172007200854ad7c200a200754ad7c7c2208370380052001200141f0016a" - "41086a2903002003200b54ad7c2005200354ad7c22072001290380017c22" - "0320014190016a41086a2903002002200554ad7c2004200254ad7c7c2205" - "20012903207c2202200141306a41086a2903002006200454ad7c20082006" - "54ad7c7c220837038805200120014180016a41086a2903002003200754ad" - "7c2005200354ad7c220420012903107c2203200141206a41086a29030020" - "02200554ad7c2008200254ad7c7c2205370390052001200141106a41086a" - "2903002003200454ad7c2005200354ad7c37039805200141c0046a200141" - "f0046a10d68080800020012903c004220342aad580808080a080237c2003" - "54ad427f7c2203200320012903c80422057c2203200554ad7c2003428180" - "d8ba8a8080d5707c200354ad7c427f7c423f872203200320012903d00422" - "057c2203200554ad7c200342ee899ea5f8d5e5b3cc007c200354ad7c427f" - "7c423f872203200320012903d80422057c2203200554ad7c200342a1edf5" - "b1d8c796e2cd007c200354ad7c427f7c423f872203200320012903e00422" - "057c2203200554ad7c20034295d3e8f2cd848bb95a7c200354ad7c427f7c" - "423f872203200320012903e80422057c2203200554ad7c200342b399809a" - "aee1ddff727c200354ad7ca741016a41017110a38080800010d280808000" - "2100200141a0056a24808080800020000bb60103037f017e017f23808080" - "800041e0006b2203248080808000200341e086c080004130108681808000" - "2104200241306a21050240034020052002460d01200541786a2205290300" - "2106413f210303402003417f460d01200441306a200410bd808080002004" - "200441306a41301086818080002107024020062003413f71ad8842018350" - "0d002007200110dd808080000b2003417f6a21030c000b0b0b2000200441" - "301086818080001a200441e0006a2480808080000b1c00200010a9808080" - "00200041306a10a9808080007110a3808080000bf50706027f067e027f01" - "7e017f027e23808080800041f0016b220324808080800041002104420021" - "05420021064200210742002108420021094200210a02400340200441054b" - "0d01200420044106496a210b200120044103746a210c4200210d41a07f21" - "0e02400340200e450d01200341b0016a2002200e6a220441e0006a290300" - "4200200c200e6a41e0006a290300220f4200108781808000200341a0016a" - "200441e8006a2903004200200f420010878180800020034190016a200441" - "f0006a2903004200200f420010878180800020034180016a200441f8006a" - "2903004200200f4200108781808000200341f0006a20044180016a290300" - "4200200f4200108781808000200341e0006a20044188016a290300420020" - "0f4200108781808000200d200341e0006a41086a29030020032903602210" - "200a7c220f201054ad7c200f200341f0006a41086a290300200329037022" - "1020097c220a201054ad7c200a20034180016a41086a2903002003290380" - "01221020087c2209201054ad7c200920034190016a41086a290300200329" - "039001221020077c2208201054ad7c2008200341a0016a41086a29030020" - "032903a001221020067c2207201054ad7c2007200341b0016a41086a2903" - "0020032903b001220620057c2205200654ad7c7c2206200754ad7c7c2207" - "200854ad7c7c2208200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c" - "210d200e41306a210e0c000b0b200341d0006a200542fdfff3ffcffffff9" - "897f7e220f420042abd5feffffffbfffb97f4200108781808000200341c0" - "006a200f420042ffffcf8aebffffd51e4200108781808000200341306a20" - "0f420042a4ecc3b58fd4b498e7004200108781808000200341206a200f42" - "0042bfa5949ccff0d2bbe4004200108781808000200341106a200f420042" - "d7d9ae9ae4f6e98dcb0042001087818080002003200f4200429acdffcba3" - "bdc4801a4200108781808000200d200341086a2903002003290300221020" - "0a7c220f201054ad7c200f200341106a41086a2903002003290310221020" - "097c220a201054ad7c200a200341206a41086a2903002003290320221020" - "087c2209201054ad7c2009200341306a41086a2903002003290330221020" - "077c2208201054ad7c2008200341c0006a41086a29030020032903402210" - "20067c2207201054ad7c2007200341d0006a41086a290300200329035022" - "0620057c200654ad7c7c2205200754ad7c7c2206200854ad7c7c22072009" - "54ad7c7c2208200a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b" - "2003200a3703e801200320093703e001200320083703d801200320073703" - "d001200320063703c801200320053703c0012000200341c0016a10d68080" - "8000200341f0016a2480808080000b1c002000200110b280808000200041" - "306a200141306a10b2808080000be20103037f017e017f23808080800041" - "c0016b2203248080808000200341306a410041301085818080001a200341" - "e086c0800041301086818080002104200241306a21050240034020052002" - "460d01200541786a22052903002106413f210303402003417f460d012004" - "41e0006a200410ba808080002004200441e0006a41e00010868180800021" - "07024020062003413f71ad88420183500d00200741e0006a2007200110b3" - "808080002007200741e0006a41e0001086818080001a0b2003417f6a2103" - "0c000b0b0b2000200441e0001086818080001a200441c0016a2480808080" - "000b900202017f017e23808080800041b0036b2202248080808000200241" - "004130108581808000220241e0006a410041301085818080001a20024130" - "6a41e086c0800041301086818080001a20024190016a2001419001108681" - "8080001a42808082808080a080e90021030240034020034200510d012002" - "41a0026a20024190016a10c68080800020024190016a200241a0026a4190" - "011086818080001a02402003420183500d00200241a0026a200220024190" - "016a10c7808080002002200241a0026a4190011086818080001a0b200342" - "018821030c000b0b200241a0026a200210e58080800020002002200241a0" - "026a41900110868180800022024190011086818080001a200241b0036a24" - "80808080000b3400200041306a200141306a10b280808000200041e0006a" - "200141e0006a41301086818080001a2000200141301086818080001a0b6b" - "01037f23808080800041106b22022480808080000240024020012802000d" - "00410021030c010b200241086a200110d0808080004101210320022d0009" - "210420022d00080d0041002103200141003602000b200020043a00012000" - "20033a0000200241106a2480808080000b7501027f23808080800041e000" - "6b2201248080808000200141306a410041301085818080001a200141e086" - "c0800041301086818080002101410110a38080800021022000410041e000" - "108581808000220041e0006a200141e0001086818080001a200020023a00" - "c001200141e0006a2480808080000b920101017f23808080800041c0016b" - "2202248080808000200041e0006a200141e0006a41e0001086818080001a" - "200241306a410041301085818080001a200241e086c08000413010868180" - "8000220241e0006a410041e0001085818080001a200041c0016a20022002" - "41e0006a20012d00c00110b0808080002000200141e0001086818080001a" - "200241c0016a2480808080000baa0201047f23808080800041e0036b2204" - "24808080800020042001200210b380808000200441e0006a200141e0006a" - "2205200310b38080800020044180036a200141c0016a2206200310b38080" - "8000200441a0026a20044180036a20044180036a41306a220710b8808080" - "00200441a0026a41306a20044180036a200710b9808080002000200441a0" - "026a200410bc80808000200441a0026a2002200310bc8080800020044180" - "036a2001200510bc80808000200441c0016a200441a0026a20044180036a" - "10b38080800020044180036a200441c0016a200410bb80808000200041e0" - "006a20044180036a200441e0006a10bb8080800020044180036a20062002" - "10b380808000200041c0016a20044180036a200441e0006a10bc80808000" - "200441e0036a2480808080000bf50706027f067e027f017e017f027e2380" - "8080800041f0016b22032480808080004100210442002105420021064200" - "210742002108420021094200210a02400340200441054b0d012004200441" - "06496a210b200120044103746a210c4200210d41e07d210e02400340200e" - "450d01200341b0016a2002200e6a220441a0026a2903004200200c200e6a" - "41a0026a290300220f4200108781808000200341a0016a200441a8026a29" - "03004200200f420010878180800020034190016a200441b0026a29030042" - "00200f420010878180800020034180016a200441b8026a2903004200200f" - "4200108781808000200341f0006a200441c0026a2903004200200f420010" - "8781808000200341e0006a200441c8026a2903004200200f420010878180" - "8000200d200341e0006a41086a29030020032903602210200a7c220f2010" - "54ad7c200f200341f0006a41086a2903002003290370221020097c220a20" - "1054ad7c200a20034180016a41086a290300200329038001221020087c22" - "09201054ad7c200920034190016a41086a29030020032903900122102007" - "7c2208201054ad7c2008200341a0016a41086a29030020032903a0012210" - "20067c2207201054ad7c2007200341b0016a41086a29030020032903b001" - "220620057c2205200654ad7c7c2206200754ad7c7c2207200854ad7c7c22" - "08200954ad7c7c2209200a54ad7c7c220a200f54ad7c7c210d200e41306a" - "210e0c000b0b200341d0006a200542fdfff3ffcffffff9897f7e220f4200" - "42abd5feffffffbfffb97f4200108781808000200341c0006a200f420042" - "ffffcf8aebffffd51e4200108781808000200341306a200f420042a4ecc3" - "b58fd4b498e7004200108781808000200341206a200f420042bfa5949ccf" - "f0d2bbe4004200108781808000200341106a200f420042d7d9ae9ae4f6e9" - "8dcb0042001087818080002003200f4200429acdffcba3bdc4801a420010" - "8781808000200d200341086a29030020032903002210200a7c220f201054" - "ad7c200f200341106a41086a2903002003290310221020097c220a201054" - "ad7c200a200341206a41086a2903002003290320221020087c2209201054" - "ad7c2009200341306a41086a2903002003290330221020077c2208201054" - "ad7c2008200341c0006a41086a2903002003290340221020067c22072010" - "54ad7c2007200341d0006a41086a2903002003290350220620057c200654" - "ad7c7c2205200754ad7c7c2206200854ad7c7c2207200954ad7c7c220820" - "0a54ad7c7c2209200f54ad7c7c210a200b21040c000b0b2003200a3703e8" - "01200320093703e001200320083703d801200320073703d0012003200637" - "03c801200320053703c0012000200341c0016a10d680808000200341f001" - "6a2480808080000bdc0101027f2380808080004180036b22032480808080" - "002003200110ba80808000200341e0006a200210ba80808000200341c001" - "6a200341e0006a200341e0006a41306a220410b880808000200341c0016a" - "41306a200341e0006a200410b9808080002000200341c0016a200310bc80" - "808000200341c0016a2001200210bc80808000200341a0026a200341c001" - "6a10ba80808000200341c0016a200341a0026a41e0001086818080001a20" - "0341c0016a200310ec80808000200041e0006a200341c0016a200341e000" - "6a10bb8080800020034180036a2480808080000b3c01017f238080808000" - "41e0006b220224808080800020022000200110bb808080002000200241e0" - "001086818080001a200241e0006a2480808080000b9f0701037f23808080" - "800041a0116b2201248080808000200141a0026a200010ba808080002001" - "4180036a200041e0006a220210ba80808000200141e0036a20014180036a" - "10ba80808000200141c0106a20014180036a200010bc80808000200141e0" - "0f6a200141c0106a10ba80808000200141800f6a200141e00f6a200141a0" - "026a10bb80808000200141c0046a200141800f6a200141e0036a10bb8080" - "8000200141a0056a200141c0046a200141c0046a10bc80808000200141c0" - "106a200141a0026a200141a0026a10bc8080800020014180066a200141c0" - "106a200141a0026a10bc80808000200141e0066a200020014180066a10bc" - "80808000200141c0076a20014180066a10ba80808000200141a0086a2000" - "41c0016a220310ba80808000200141c0106a200141c0076a200141a0056a" - "10bb80808000200141e00f6a200141c0106a200141a0056a10bb80808000" - "2000200141e00f6a41e0001086818080002100200141c0106a2003200210" - "bc80808000200141e00f6a200141c0106a10ba80808000200141800f6a20" - "0141e00f6a20014180036a10bb80808000200141e00f6a200141800f6a20" - "0141a0086a10bb808080002003200141e00f6a41e0001086818080002103" - "200141c0106a200141a0056a200010bb80808000200141e00f6a200141c0" - "106a20014180066a10b3808080002002200141e00f6a41e0001086818080" - "00210220014180096a200141e0036a200141e0036a10bc80808000200141" - "e0096a20014180096a20014180096a10bc80808000200141c00a6a200141" - "e0096a200141e0096a10bc808080002002200141c00a6a10ec8080800020" - "0141a00b6a20014180066a200141a0086a10b380808000200141800c6a20" - "0141a00b6a200141a00b6a10bc80808000200141e00c6a200141800c6a10" - "e280808000200141c0106a200141e0066a10ba80808000200141e00f6a20" - "0141c0106a200141a0026a10bb80808000200141c00d6a200141e00f6a20" - "0141c0076a10bb80808000200141a00e6a20014180036a20014180036a10" - "bc80808000200141800f6a200141a00e6a200141a00e6a10bc8080800020" - "0141e00f6a200141c00d6a200141800f6a10bb80808000200141c0106a20" - "03200141a0086a10b3808080002001200141c0106a200141c0106a10bc80" - "808000200141e0006a200141e00c6a41e0001086818080001a200141c001" - "6a200141e00f6a41e0001086818080001a200041e8036a200141ac8cc080" - "0010ee80808000200141a0116a2480808080000b4201017f024020002802" - "0822032000280200470d002000200210d8808080000b2000280204200341" - "a0026c6a200141a0021086818080001a2000200341016a3602080b4c0101" - "7f23808080800041106b2202248080808000200241988cc0800036020c20" - "022000360208200241086a41b08dc080002002410c6a41b08dc080002001" - "419c8cc0800010d380808000000b7902017f017e23808080800041306b22" - "0324808080800020032001360204200320003602002003410236020c2003" - "41a08dc08000360208200342023702142003418580808000ad4220862204" - "2003ad8437032820032004200341046aad843703202003200341206a3602" - "10200341086a200210a480808000000b0f002000280200200110f2808080" - "000be10201067f23808080800041106b2202248080808000410a21030240" - "024020004190ce004f0d00200021040c010b410a21030340200241066a20" - "036a2205417c6a20004190ce006e220441f0b1036c20006a220641ffff03" - "7141e4006e220741017441ff8ec080006a2f00003b00002005417e6a2007" - "419c7f6c20066a41ffff037141017441ff8ec080006a2f00003b00002003" - "417c6a2103200041ffc1d72f4b21052004210020050d000b0b0240024020" - "0441e3004b0d00200421000c010b200241066a2003417e6a22036a200441" - "ffff037141e4006e2200419c7f6c20046a41ffff037141017441ff8ec080" - "006a2f00003b00000b024002402000410a490d00200241066a2003417e6a" - "22036a200041017441ff8ec080006a2f00003b00000c010b200241066a20" - "03417f6a22036a20004130723a00000b200141014100200241066a20036a" - "410a20036b10d5808080002100200241106a24808080800020000b380201" - "7f017e23808080800041106b220124808080800020002902002102200120" - "0036020c20012002370204200141046a108181808000000b490002402002" - "418080c400460d002000200220012802101181808080008080808000450d" - "0041010f0b024020030d0041000f0b200020032004200128020c11808080" - "800080808080000b7902017f017e23808080800041306b22032480808080" - "0020032001360204200320003602002003410236020c2003419c91c08000" - "360208200342023702142003418580808000ad4220862204200341046aad" - "84370328200320042003ad843703202003200341206a360210200341086a" - "200210a480808000000b1c0020002802002001200028020428020c118180" - "80800080808080000b14002001200028020020002802041092808080000b" - "1400200128021c2001280220200010f9808080000bbb05010a7f23808080" - "800041306b22032480808080002003200136022c20032000360228200341" - "033a00242003422037021c41002104200341003602142003410036020c02" - "400240024002400240200228021022050d00200228020c2200450d012002" - "280208220120004103746a21062000417f6a41ffffffff017141016a2104" - "2002280200210003400240200041046a2802002207450d00200328022820" - "002802002007200328022c28020c11808080800080808080000d040b2001" - "2802002003410c6a200141046a28020011818080800080808080000d0320" - "0041086a2100200141086a22012006470d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a21042002280208" - "2109200228020021004100210703400240200041046a2802002201450d00" - "200328022820002802002001200328022c28020c11808080800080808080" - "000d030b2003200520076a220141106a28020036021c20032001411c6a2d" - "00003a00242003200141186a2802003602202001410c6a28020021064100" - "210a4100210b024002400240200141086a2802000e03010002010b200641" - "0374210c4100210b2009200c6a220c2802000d01200c28020421060b4101" - "210b0b200320063602102003200b36020c200141046a2802002106024002" - "40024020012802000e03010002010b2006410374210b2009200b6a220b28" - "02000d01200b28020421060b4101210a0b200320063602182003200a3602" - "142009200141146a2802004103746a22012802002003410c6a200141046a" - "28020011818080800080808080000d02200041086a21002008200741206a" - "2207470d000b0b200420022802044f0d0120032802282002280200200441" - "03746a22012802002001280204200328022c28020c118080808000808080" - "8000450d010b410121010c010b410021010b200341306a24808080800020" - "010b6001027f20002802042102200028020021030240200028020822002d" - "0000450d00200341f48ec080004104200228020c11808080800080808080" - "00450d0041010f0b20002001410a463a0000200320012002280210118180" - "80800080808080000b1200200041dc8ec08000200110f9808080000b7902" - "017f017e23808080800041306b2203248080808000200320013602042003" - "20003602002003410236020c200341d091c0800036020820034202370214" - "2003418580808000ad4220862204200341046aad84370328200320042003" - "ad843703202003200341206a360210200341086a200210a480808000000b" - "ab0201037f2380808080004180016b220224808080800020002802002100" - "024002400240200128021422034110710d0020034120710d012000280200" - "200110f28080800021000c020b2000280200210041810121030340200220" - "036a417e6a2000410f712204413072200441d7006a2004410a491b3a0000" - "2003417f6a21032000410f4b21042000410476210020040d000b200141fd" - "8ec080004102200220036a417f6a41810120036b10d58080800021000c01" - "0b2000280200210041810121030340200220036a417e6a2000410f712204" - "413072200441376a2004410a491b3a00002003417f6a21032000410f4b21" - "042000410476210020040d000b200141fd8ec080004102200220036a417f" - "6a41810120036b10d58080800021000b20024180016a2480808080002000" - "0b0900200041003602000b990101027f23808080800041106b2204248080" - "808000410041002802f093c08000220541016a3602f093c0800002402005" - "4100480d000240024041002d00bc97c080000d00410041002802b897c080" - "0041016a3602b897c0800041002802ec93c08000417f4a0d010c020b2004" - "41086a200020011182808080008080808000000b410041003a00bc97c080" - "002002450d00108081808000000b000b0300000b0b002000108281808000" - "000bba0101037f23808080800041106b2201248080808000200028020022" - "0228020c2103024002400240024020022802040e020001020b20030d0141" - "012102410021030c020b20030d0020022802002202280204210320022802" - "0021020c010b20014180808080783602002001200036020c200141868080" - "8000200028020822002d000820002d000910ff80808000000b2001200336" - "0204200120023602002001418780808000200028020822002d000820002d" - "000910ff80808000000b0c00200020012902003703000bc30201047f411f" - "21020240200141ffffff074b0d002001410620014108766722026b764101" - "7120024101746b413e6a21020b200042003702102000200236021c200241" - "027441f493c080006a21030240410028029097c080004101200274220471" - "0d0020032000360200200020033602182000200036020c20002000360208" - "4100410028029097c0800020047236029097c080000f0b02400240024020" - "0328020022042802044178712001470d00200421020c010b200141004119" - "20024101766b2002411f461b742103034020042003411d764104716a4110" - "6a22052802002202450d0220034101742103200221042002280204417871" - "2001470d000b0b20022802082203200036020c2002200036020820004100" - "3602182000200236020c200020033602080f0b2005200036020020002004" - "3602182000200036020c200020003602080baa0301057f02400240200241" - "104f0d00200021030c010b02402000410020006b41037122046a22052000" - "4d0d002004417f6a21062000210302402004450d00200421072000210303" - "40200320013a0000200341016a21032007417f6a22070d000b0b20064107" - "490d000340200320013a0000200341076a20013a0000200341066a20013a" - "0000200341056a20013a0000200341046a20013a0000200341036a20013a" - "0000200341026a20013a0000200341016a20013a0000200341086a220320" - "05470d000b0b024020052005200220046b2202417c716a22034f0d002001" - "41ff017141818284086c2107034020052007360200200541046a22052003" - "490d000b0b200241037121020b02402003200320026a22074f0d00200241" - "7f6a2104024020024107712205450d000340200320013a0000200341016a" - "21032005417f6a22050d000b0b20044107490d000340200320013a000020" - "0341076a20013a0000200341066a20013a0000200341056a20013a000020" - "0341046a20013a0000200341036a20013a0000200341026a20013a000020" - "0341016a20013a0000200341086a22032007470d000b0b20000ba5050108" - "7f02400240200241104f0d00200021030c010b02402000410020006b4103" - "7122046a220520004d0d002004417f6a2106200021032001210702402004" - "450d002004210820002103200121070340200320072d00003a0000200741" - "016a2107200341016a21032008417f6a22080d000b0b20064107490d0003" - "40200320072d00003a0000200341016a200741016a2d00003a0000200341" - "026a200741026a2d00003a0000200341036a200741036a2d00003a000020" - "0341046a200741046a2d00003a0000200341056a200741056a2d00003a00" - "00200341066a200741066a2d00003a0000200341076a200741076a2d0000" - "3a0000200741086a2107200341086a22032005470d000b0b200520022004" - "6b2208417c7122066a210302400240200120046a22074103710d00200520" - "034f0d0120072101034020052001280200360200200141046a2101200541" - "046a22052003490d000c020b0b200520034f0d0020074103742202411871" - "21042007417c71220941046a2101410020026b411871210a200928020021" - "0203402005200220047620012802002202200a7472360200200141046a21" - "01200541046a22052003490d000b0b20084103712102200720066a21010b" - "02402003200320026a22054f0d002002417f6a2108024020024107712207" - "450d000340200320012d00003a0000200141016a2101200341016a210320" - "07417f6a22070d000b0b20084107490d000340200320012d00003a000020" - "0341016a200141016a2d00003a0000200341026a200141026a2d00003a00" - "00200341036a200141036a2d00003a0000200341046a200141046a2d0000" - "3a0000200341056a200141056a2d00003a0000200341066a200141066a2d" - "00003a0000200341076a200141076a2d00003a0000200141086a21012003" - "41086a22032005470d000b0b20000b6e01067e2000200342ffffffff0f83" - "2205200142ffffffff0f8322067e22072003422088220820067e22062005" - "200142208822097e7c22054220867c220a3703002000200820097e200520" - "0654ad4220862005422088847c200a200754ad7c200420017e200320027e" - "7c7c3703080bea0901087f024002400240200020016b20024f0d00200120" - "026a2103200020026a210420024110490d014100200441037122056b2106" - "02402004417c71220720044f0d002005417f6a21080240024020050d0020" - "0321090c010b2005210a2003210903402004417f6a22042009417f6a2209" - "2d00003a0000200a417f6a220a0d000b0b20084103490d002009417c6a21" - "0903402004417f6a200941036a2d00003a00002004417e6a200941026a2d" - "00003a00002004417d6a200941016a2d00003a00002004417c6a22042009" - "2d00003a00002009417c6a210920072004490d000b0b2007200220056b22" - "09417c7122026b2104410020026b210a02400240200320066a2203410371" - "0d00200420074f0d01200920016a417c6a210103402007417c6a22072001" - "2802003602002001417c6a210120042007490d000c020b0b200420074f0d" - "002003410374220241187121052003417c712208417c6a2101410020026b" - "41187121062008280200210203402007417c6a2207200220067420012802" - "002202200576723602002001417c6a210120042007490d000b0b20094103" - "7121022003200a6a21030c010b02400240200241104f0d00200021040c01" - "0b02402000410020006b410371220a6a220920004d0d00200a417f6a2105" - "20002104200121070240200a450d00200a21032000210420012107034020" - "0420072d00003a0000200741016a2107200441016a21042003417f6a2203" - "0d000b0b20054107490d000340200420072d00003a0000200441016a2007" - "41016a2d00003a0000200441026a200741026a2d00003a0000200441036a" - "200741036a2d00003a0000200441046a200741046a2d00003a0000200441" - "056a200741056a2d00003a0000200441066a200741066a2d00003a000020" - "0441076a200741076a2d00003a0000200741086a2107200441086a220420" - "09470d000b0b20092002200a6b2203417c7122056a210402400240200120" - "0a6a22074103710d00200920044f0d012007210103402009200128020036" - "0200200141046a2101200941046a22092004490d000c020b0b200920044f" - "0d0020074103742202411871210a2007417c71220841046a210141002002" - "6b411871210620082802002102034020092002200a762001280200220220" - "067472360200200141046a2101200941046a22092004490d000b0b200341" - "03712102200720056a21010b2004200420026a22094f0d012002417f6a21" - "03024020024107712207450d000340200420012d00003a0000200141016a" - "2101200441016a21042007417f6a22070d000b0b20034107490d01034020" - "0420012d00003a0000200441016a200141016a2d00003a0000200441026a" - "200141026a2d00003a0000200441036a200141036a2d00003a0000200441" - "046a200141046a2d00003a0000200441056a200141056a2d00003a000020" - "0441066a200141066a2d00003a0000200441076a200141076a2d00003a00" - "00200141086a2101200441086a22042009470d000c020b0b200420026b22" - "0720044f0d002002417f6a2109024020024103712201450d000340200441" - "7f6a22042003417f6a22032d00003a00002001417f6a22010d000b0b2009" - "4103490d002003417c6a210103402004417f6a200141036a2d00003a0000" - "2004417e6a200141026a2d00003a00002004417d6a200141016a2d00003a" - "00002004417c6a220420012d00003a00002001417c6a210120072004490d" - "000b0b20000b0e002000200120021088818080000b0bf2130100418080c0" - "000be8132f72757374632f34656231363132353065333430633866343866" - "3636653262393239656634613562656437633138312f6c6962726172792f" - "636f72652f7372632f697465722f7472616974732f6974657261746f722e" - "72730000100058000000b307000009000000000000000000000001000000" - "0800000063616c6c65642060526573756c743a3a756e7772617028296020" - "6f6e20616e2060457272602076616c75652f72757374632f346562313631" - "323530653334306338663438663636653262393239656634613562656437" - "633138312f6c6962726172792f616c6c6f632f7372632f736c6963652e72" - "73000000a30010004a000000a10000001900000054727946726f6d536c69" - "63654572726f720000000100000000000000d80210005e000000b4020000" - "090000002f72757374632f34656231363132353065333430633866343866" - "3636653262393239656634613562656437633138312f6c6962726172792f" - "636f72652f7372632f736c6963652f697465722e727300002c0110004e00" - "0000f6050000150000007372632f6c69622e727300008c0110000a000000" - "1f000000160000008c0110000a00000028000000310000008c0110000a00" - "000028000000440000004661696c656420746f20646573657269616c697a" - "6520766b8c0110000a0000002f000000310000008c0110000a0000002f00" - "0000440000008c0110000a000000620000001f0000008c0110000a000000" - "630000000a0000008c0110000a00000064000000170000008c0110000a00" - "0000650000000a0000008c0110000a00000066000000170000008c011000" - "0a000000670000000a0000004661696c656420746f20646573657269616c" - "697a6520614661696c656420746f20646573657269616c697a6520624661" - "696c656420746f20646573657269616c697a652063496e76616c69642062" - "7974657320666f72205363616c61726361706163697479206f766572666c" - "6f770000bd021000110000002f686f6d652f6f706964736b6f706e79692f" - "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" - "65732e696f2d313934396366386336623562353537662f737562746c652d" - "322e362e312f7372632f6c69622e72730000000000000400000004000000" - "0900000001000000d80210005e000000bd0200000900000000000000fdff" - "02000000097602000cc40b00f4ebba58c7535798485f455752705358ce77" - "6dec56a2971a075c93e480fac35ef6154617341c341fdff4f104d109a6e6" - "760ad5b6954c6c47e58dc0839d93a988eb672d9519b5853e799aaae3ca92" - "e58f9811abeaffffffbf7feeffff54acffffaa07893dac3da834ccd9af44" - "e13ce1d21dd935ebd290ede9c692a6f95f8e7a448006a9aafffffffffeb9" - "ffff53b1feffab1e24f6b0f6a0d23067bf1285f3844b7764d7ac4b43b6a7" - "1b4b9ae67f39ea11011aaaeaffffffbf7feeffff54acffffaa07893dac3d" - "a834ccd9af44e13ce1d21dd935ebd290ede9c692a6f95f8e7a44800655d5" - "ffffff7fffdcffffa958ffff550f127b587b506998b35f89c279c2a53bb2" - "6bd6a521dbd38d254df3bf1cf588000df3ff0c00000027aa0a0034fc3200" - "cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d" - "5145d609e8648a791b36f1302a5ace7eabddb8f3f77715c63acaa8169b02" - "fd74f82f6ac26e1c706066b7363660611b24aba41b05f3ff0c00000027aa" - "0a0034fc3200cc537f800a6b7ae98f47d724bae6be7ed3b12fab78bf3b73" - "c98e7ede833d5145d609f3ff0c00000027aa0a0034fc3200cc537f800a6b" - "7ae98f47d724bae6be7ed3b12fab78bf3b73c98e7ede833d5145d6092e55" - "270000007644200048439a00b8dc598b6e4acee97e6fc65ba9c0b73003b1" - "b7541efbfcb14061e1b40b7f09be81032e55270000007644200048439a00" - "b8dc598b6e4acee97e6fc65ba9c0b73003b1b7541efbfcb14061e1b40b7f" - "09be81032f686f6d652f6f706964736b6f706e79692f2e636172676f2f72" - "656769737472792f7372632f696e6465782e6372617465732e696f2d3139" - "34396366386336623562353537662f626c7331325f3338312d302e382e30" - "2f7372632f70616972696e67732e72730000a00510006600000016020000" - "1500000044000000a0051000660000001b02000009000000a00510006600" - "0000050200001d000000a005100066000000090200001d000000a0051000" - "660000003802000032000000a00510006600000044020000320000002969" - "6e646578206f7574206f6620626f756e64733a20746865206c656e206973" - "20206275742074686520696e64657820697320006d061000200000008d06" - "1000120000000000000004000000040000000a0000003d3d617373657274" - "696f6e20606c6566742020726967687460206661696c65640a20206c6566" - "743a200a2072696768743a200000c206100010000000d206100017000000" - "e90610000900000020726967687460206661696c65643a200a20206c6566" - "743a20000000c2061000100000000c071000100000001c07100009000000" - "e9061000090000003a200000010000000000000048071000020000000000" - "00000c000000040000000b0000000c0000000d000000202020202c0a2828" - "0a3078303030313032303330343035303630373038303931303131313231" - "333134313531363137313831393230323132323233323432353236323732" - "383239333033313332333333343335333633373338333934303431343234" - "333434343534363437343834393530353135323533353435353536353735" - "383539363036313632363336343635363636373638363937303731373237" - "333734373537363737373837393830383138323833383438353836383738" - "3838393930393139323933393439353936393739383939617474656d7074" - "20746f20646976696465206279207a65726f4708100019000000206f7574" - "206f662072616e676520666f7220736c696365206f66206c656e67746820" - "72616e676520656e6420696e6465782000008a0810001000000068081000" - "22000000736c69636520696e646578207374617274732061742020627574" - "20656e64732061742000ac08100016000000c20810000d00000028292f72" - "757374632f34656231363132353065333430633866343866363665326239" - "3239656634613562656437633138312f6c6962726172792f616c6c6f632f" - "7372632f7261775f7665632e72730000e20810004c000000280200001100" - "00002f727573742f646570732f646c6d616c6c6f632d302e322e372f7372" - "632f646c6d616c6c6f632e7273617373657274696f6e206661696c65643a" - "207073697a65203e3d2073697a65202b206d696e5f6f7665726865616400" - "4009100029000000a804000009000000617373657274696f6e206661696c" - "65643a207073697a65203c3d2073697a65202b206d61785f6f7665726865" - "616400004009100029000000ae0400000d00000000c94e046e616d65000e" - "0d7761736d5f6c69622e7761736d01914e8a01008a015f5a4e3130325f24" - "4c5424636f72652e2e697465722e2e61646170746572732e2e6d61702e2e" - "4d6170244c5424492443244624475424247532302461732475323024636f" - "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" - "657261746f72244754243973697a655f68696e7431376833383630386236" - "62663263303736666145014c5f5a4e34636f72653970616e69636b696e67" - "313170616e69635f636f6e7374323370616e69635f636f6e73745f646976" - "5f62795f7a65726f3137683033346433623765633138373166373545024d" - "5f5a4e34636f726533707472343364726f705f696e5f706c616365244c54" - "247761736d5f6c69622e2e566572696679696e674b657924475424313768" - "393064303131346662343063613937644503475f5a4e35616c6c6f633772" - "61775f7665633230526177566563496e6e6572244c542441244754243130" - "6465616c6c6f636174653137683235303163353461663065323831336145" - "04505f5a4e34636f726533707472343664726f705f696e5f706c61636524" - "4c5424616c6c6f632e2e7665632e2e566563244c54247538244754242447" - "5424313768663462323737666433376462353031654505565f5a4e34636f" - "726533707472353264726f705f696e5f706c616365244c5424626c733132" - "5f3338312e2e70616972696e67732e2e4732507265706172656424475424" - "313768623964653634383231343939353539344506675f5a4e34636f7265" - "33707472363964726f705f696e5f706c616365244c5424616c6c6f632e2e" - "7665632e2e566563244c5424626c7331325f3338312e2e7363616c61722e" - "2e5363616c61722447542424475424313768376265333235646130373238" - "386634384507385f5a4e35616c6c6f63337665633136566563244c542454" - "244324412447542434707573683137686236356465366561306165303964" - "31374508435f5a4e35616c6c6f63377261775f7665633139526177566563" - "244c54245424432441244754243867726f775f6f6e653137686531306535" - "65303538376531393262664509495f5a4e35616c6c6f6335736c69636532" - "395f244c5424696d706c2475323024247535622454247535642424475424" - "36746f5f76656331376836333665656464383765653761373437450a4d5f" - "5a4e35616c6c6f63377261775f7665633230526177566563496e6e657224" - "4c542441244754243136776974685f63617061636974795f696e31376861" - "653336636161393636356566343833450b4b5f5a4e35616c6c6f63377261" - "775f7665633230526177566563496e6e6572244c54244124475424313467" - "726f775f616d6f7274697a65643137686439353064656131373163323030" - "3035450c335f5a4e35616c6c6f63377261775f766563313268616e646c65" - "5f6572726f7231376863613161646630343635323765396532450d0e5f5f" - "727573745f6465616c6c6f630e4c5f5a4e35616c6c6f63377261775f7665" - "633230526177566563496e6e6572244c5424412447542431357472795f61" - "6c6c6f636174655f696e3137686534626630623334333637646136646345" - "0f5e5f5a4e36355f244c5424626c7331325f3338312e2e67312e2e473141" - "6666696e65247532302461732475323024636f72652e2e6f70732e2e6172" - "6974682e2e4e656724475424336e65673137683434323138626332316532" - "65356663314510725f5a4e36395f244c5424626c7331325f3338312e2e66" - "702e2e4670247532302461732475323024737562746c652e2e436f6e6469" - "74696f6e616c6c7953656c65637461626c65244754243138636f6e646974" - "696f6e616c5f73656c656374313768386165306466613830666434313139" - "364511605f5a4e36375f244c5424636f72652e2e61727261792e2e547279" - "46726f6d536c6963654572726f72247532302461732475323024636f7265" - "2e2e666d742e2e44656275672447542433666d7431376863303634386262" - "31393264393231376545122e5f5a4e34636f726533666d7439466f726d61" - "747465723370616431376833316663303133336231396665333065451367" - "5f5a4e36385f244c5424636f72652e2e666d742e2e6275696c646572732e" - "2e50616441646170746572247532302461732475323024636f72652e2e66" - "6d742e2e5772697465244754243977726974655f73747231376834353537" - "3732653638643462343039364514385f5a4e36737562746c65313743744f" - "7074696f6e244c5424542447542436657870656374313768623863663632" - "323139313530313333334515495f5a4e34345f244c542424524624542475" - "32302461732475323024636f72652e2e666d742e2e446973706c61792447" - "542433666d74313768353633396538653836623831393165364516355f5a" - "4e34636f72653970616e69636b696e6731336173736572745f6661696c65" - "64313768393337633632373834633734396537664517385f5a4e36737562" - "746c65313743744f7074696f6e244c542454244754243665787065637431" - "3768633764316533383030323138386237654518705f5a4e38315f244c54" - "24616c6c6f632e2e7665632e2e566563244c542454244324412447542424" - "7532302461732475323024636f72652e2e6f70732e2e696e6465782e2e49" - "6e646578244c542449244754242447542435696e64657831376862376565" - "6135613738316438393239374519405f5a4e34636f726535736c69636535" - "696e6465783232736c6963655f696e6465785f6f726465725f6661696c31" - "376866663036393161306536326561633864451a425f5a4e34636f726535" - "736c69636535696e6465783234736c6963655f656e645f696e6465785f6c" - "656e5f6661696c31376861383936346133343065666132346537451b0861" - "6c6c6f636174651c13646573657269616c697a655f67315f7761736d1d32" - "5f5a4e34636f726536726573756c743133756e777261705f6661696c6564" - "31376861313838333239383461636266333830451e3e5f5a4e39626c7331" - "325f333831326731384731416666696e65313566726f6d5f636f6d707265" - "7373656431376832333963336331363436646339303436451f355f5a4e38" - "7761736d5f6c69623139646573657269616c697a655f67325f7761736d31" - "37683530336430613839336365653362666645203e5f5a4e39626c733132" - "5f333831326732384732416666696e65313566726f6d5f636f6d70726573" - "7365643137686333616566303334336638323663626245211462656c6c6d" - "616e5f67726f746831365f7465737422335f5a4e39626c7331325f333831" - "367363616c6172365363616c617233737562313768656363643066636134" - "373035653937364523285f5a4e36737562746c6539626c61636b5f626f78" - "313768633661663135363636663731396234384524305f5a4e34636f7265" - "3970616e69636b696e673970616e69635f666d7431376862393162616461" - "636536656538323837452585015f5a4e3130325f244c5424626c7331325f" - "3338312e2e67312e2e473150726f6a656374697665247532302461732475" - "323024636f72652e2e636f6e766572742e2e46726f6d244c542424524624" - "626c7331325f3338312e2e67312e2e4731416666696e6524475424244754" - "243466726f6d3137686634356430353636343237373335316445262e5f5a" - "4e39626c7331325f33383132667032467036696e76657274313768366335" - "3632643539653638646633633245272b5f5a4e39626c7331325f33383132" - "6670324670336d756c313768646666623336663036373139613633374528" - "365f5a4e39626c7331325f333831326731384731416666696e6538696465" - "6e746974793137686236366162643638326233626339356345292f5f5a4e" - "39626c7331325f3338313266703246703769735f7a65726f313768333962" - "31303634343730313433376536452a785f5a4e37355f244c5424626c7331" - "325f3338312e2e67312e2e4731416666696e652475323024617324753230" - "24737562746c652e2e436f6e646974696f6e616c6c7953656c6563746162" - "6c65244754243138636f6e646974696f6e616c5f73656c65637431376833" - "323735393935653930646636613863452b85015f5a4e3130325f244c5424" - "626c7331325f3338312e2e70616972696e67732e2e473250726570617265" - "64247532302461732475323024636f72652e2e636f6e766572742e2e4672" - "6f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e6524" - "475424244754243466726f6d313768353930643863663565363536346465" - "66452c2f5f5a4e39626c7331325f33383134667031323446703132336f6e" - "6531376839346666616330666264306163343332452d90015f5a4e313033" - "5f244c5424626c7331325f3338312e2e70616972696e67732e2e6d756c74" - "695f6d696c6c65725f6c6f6f702e2e416464657224753230246173247532" - "3024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65724c" - "6f6f70447269766572244754243133646f75626c696e675f737465703137" - "6833346536393232613038346336343933452e705f5a4e38315f244c5424" - "616c6c6f632e2e7665632e2e566563244c54245424432441244754242475" - "32302461732475323024636f72652e2e6f70732e2e696e6465782e2e496e" - "646578244c542449244754242447542435696e6465783137686539346538" - "6262303063326535366564452f2e5f5a4e39626c7331325f333831387061" - "6972696e677333656c6c3137683264393865303762336132336635313345" - "30745f5a4e37315f244c5424626c7331325f3338312e2e6670322e2e4670" - "32247532302461732475323024737562746c652e2e436f6e646974696f6e" - "616c6c7953656c65637461626c65244754243138636f6e646974696f6e61" - "6c5f73656c6563743137686366633738633362393036656661383945315a" - "5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e46703624" - "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e4e" - "656724475424336e65673137686230666536353636326461326334343345" - "322b5f5a4e39626c7331325f333831326670324670336e65673137683861" - "363566633733316133386134393745332d5f5a4e39626c7331325f333831" - "3366703233467032336d756c313768326433373464346666306563343037" - "6245345a5f5a4e36315f244c5424626c7331325f3338312e2e6670362e2e" - "467036247532302461732475323024636f72652e2e6f70732e2e61726974" - "682e2e4d756c24475424336d756c31376865613934393735323931313764" - "3166634535305f5a4e39626c7331325f3338313366703633467036367371" - "756172653137683866633831663539663666313530643145363c5f5a4e39" - "626c7331325f333831336670363346703631376d756c5f62795f6e6f6e72" - "6573696475653137686432663865613131393236643732653945375a5f5a" - "4e36315f244c5424626c7331325f3338312e2e6670362e2e467036247532" - "302461732475323024636f72652e2e6f70732e2e61726974682e2e537562" - "24475424337375623137686137396663636566323762323631323445382b" - "5f5a4e39626c7331325f3338313266703246703373756231376865646439" - "32336439323032346633366445392b5f5a4e39626c7331325f3338313266" - "703246703361646431376863366562626430363731666432643965453a30" - "5f5a4e39626c7331325f3338313366703233467032367371756172653137" - "6865663238666434623836356230653732453b2d5f5a4e39626c7331325f" - "333831336670323346703233737562313768636330663365343532313765" - "61393964453c2d5f5a4e39626c7331325f33383133667032334670323361" - "646431376864363030363832376137333934646563453d2e5f5a4e39626c" - "7331325f3338313266703246703673717561726531376835616337663530" - "666666393136623065453e605f5a4e36375f244c542424524624626c7331" - "325f3338312e2e667031322e2e4670313224753230246173247532302463" - "6f72652e2e6f70732e2e61726974682e2e4d756c24475424336d756c3137" - "6863613137343239383666636366353565453f6a5f5a4e36395f244c5424" - "626c7331325f3338312e2e667031322e2e46703132247532302461732475" - "323024636f72652e2e6f70732e2e61726974682e2e4d756c41737369676e" - "2447542431306d756c5f61737369676e3137683037326534616130343436" - "63356334314540655f5a4e39626c7331325f3338313870616972696e6773" - "31364d696c6c65724c6f6f70526573756c74323066696e616c5f6578706f" - "6e656e74696174696f6e31376379636c6f746f6d69635f73717561726531" - "3768613463633461633966316338323538644541635f5a4e39626c733132" - "5f3338313870616972696e677331364d696c6c65724c6f6f70526573756c" - "74323066696e616c5f6578706f6e656e74696174696f6e31356379636f6c" - "6f746f6d69635f6578703137686166636437313637356662666432373645" - "425d5f5a4e36325f244c5424626c7331325f3338312e2e6670322e2e4670" - "32247532302461732475323024737562746c652e2e436f6e7374616e7454" - "696d654571244754243563745f6571313768316264323735363036643361" - "6461366445435a5f5a4e36315f244c5424626c7331325f3338312e2e6670" - "362e2e467036247532302461732475323024636f72652e2e6f70732e2e61" - "726974682e2e416464244754243361646431376835343330336164316564" - "646333613837454491015f5a4e3131345f244c5424636f72652e2e697465" - "722e2e61646170746572732e2e666c617474656e2e2e466c61744d617024" - "4c542449244324552443244624475424247532302461732475323024636f" - "72652e2e697465722e2e7472616974732e2e6974657261746f722e2e4974" - "657261746f7224475424346e657874313768633964373737363930666232" - "373033334545385f5a4e34636f7265336f70733866756e6374696f6e3546" - "6e4d75743863616c6c5f6d75743137686638313366653737616237633761" - "35634546395f5a4e39626c7331325f3338313267313132473150726f6a65" - "637469766536646f75626c65313768386366636435343461313633326664" - "384547365f5a4e39626c7331325f3338313267313132473150726f6a6563" - "74697665336164643137686338666437656633383137383263636145487c" - "5f5a4e37395f244c5424626c7331325f3338312e2e67312e2e473150726f" - "6a656374697665247532302461732475323024737562746c652e2e436f6e" - "646974696f6e616c6c7953656c65637461626c65244754243138636f6e64" - "6974696f6e616c5f73656c65637431376839346663383463303336386533" - "3262334549415f5a4e38646c6d616c6c6f6338646c6d616c6c6f63313744" - "6c6d616c6c6f63244c542441244754243466726565313768623937643238" - "61316165313165356635454a2c5f5a4e34636f72653970616e69636b696e" - "673570616e696331376832323065356136376635653365303666454b0e5f" - "5f727573745f7265616c6c6f634c4a5f5a4e38646c6d616c6c6f6338646c" - "6d616c6c6f633137446c6d616c6c6f63244c542441244754243132756e6c" - "696e6b5f6368756e6b31376831623634356162376339333032303939454d" - "4b5f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c" - "6f63244c542441244754243133646973706f73655f6368756e6b31376832" - "633732313930393066616265323362454e435f5a4e38646c6d616c6c6f63" - "38646c6d616c6c6f633137446c6d616c6c6f63244c54244124475424366d" - "616c6c6f6331376863663263663139323661376530646165454f385f5a4e" - "35616c6c6f63377261775f766563313763617061636974795f6f76657266" - "6c6f7731376863393936333961626361313337633131455085015f5a4e31" - "30325f244c5424636f72652e2e697465722e2e61646170746572732e2e6d" - "61702e2e4d6170244c542449244324462447542424753230246173247532" - "3024636f72652e2e697465722e2e7472616974732e2e6974657261746f72" - "2e2e4974657261746f7224475424346e6578743137683161356136633566" - "303263666237373445514d5f5a4e34365f244c5424753634247532302461" - "732475323024737562746c652e2e436f6e7374616e7454696d6545712447" - "54243563745f657131376839613065366130383065643661303532455253" - "5f5a4e35345f244c5424737562746c652e2e43686f696365247532302461" - "732475323024636f72652e2e6f70732e2e6269742e2e4e6f742447542433" - "6e6f743137686532353261643837343163616538663445533b5f5a4e3463" - "6f72653970616e69636b696e6731396173736572745f6661696c65645f69" - "6e6e6572313768363939386636356530343630623966324554475f5a4e34" - "325f244c54242452462454247532302461732475323024636f72652e2e66" - "6d742e2e44656275672447542433666d7431376866396562386538303434" - "3436393737334555385f5a4e34636f726533666d7439466f726d61747465" - "7231327061645f696e74656772616c313768336538303336383966363939" - "303466334556335f5a4e39626c7331325f33383132667032467031307375" - "6274726163745f7031376833353337643137643839306564373430455736" - "5f5a4e35616c6c6f6335616c6c6f6336476c6f62616c3130616c6c6f635f" - "696d706c313768636263383565313966363066396565314558435f5a4e35" - "616c6c6f63377261775f7665633139526177566563244c54245424432441" - "244754243867726f775f6f6e653137683761366133613131343862316565" - "66624559785f5a4e37355f244c5424626c7331325f3338312e2e67322e2e" - "4732416666696e65247532302461732475323024737562746c652e2e436f" - "6e646974696f6e616c6c7953656c65637461626c65244754243138636f6e" - "646974696f6e616c5f73656c656374313768346631633532376163323663" - "39393332455a7a5f5a4e37375f244c5424737562746c652e2e43744f7074" - "696f6e244c54245424475424247532302461732475323024737562746c65" - "2e2e436f6e646974696f6e616c6c7953656c65637461626c652447542431" - "38636f6e646974696f6e616c5f73656c6563743137686230353564346638" - "6331363261313862455b5b5f5a4e36305f244c5424626c7331325f333831" - "2e2e66702e2e4670247532302461732475323024737562746c652e2e436f" - "6e7374616e7454696d654571244754243563745f65713137683764613737" - "3038613961336631623237455c335f5a4e39626c7331325f333831326670" - "324670313066726f6d5f6279746573313768663632643265653863383835" - "61616633455d665f5a4e36355f244c5424626c7331325f3338312e2e6670" - "2e2e4670247532302461732475323024636f72652e2e6f70732e2e617269" - "74682e2e4d756c41737369676e2447542431306d756c5f61737369676e31" - "376862613864393933386331336334313962455e425f5a4e39626c733132" - "5f33383132667032467032356c657869636f67726170686963616c6c795f" - "6c61726765737431376864623239383362653765626662373630455f345f" - "5a4e39626c7331325f3338313266703246703131706f775f76617274696d" - "65313768386339643861353637336531663765654560315f5a4e39626c73" - "31325f33383133667032334670323769735f7a65726f3137683232633162" - "33626231383039373337664561385f5a4e39626c7331325f333831326670" - "324670313573756d5f6f665f70726f647563747331376864373831613962" - "66366162336638386645622d5f5a4e39626c7331325f3338313366703233" - "467032336e6567313768336535623432323139303537623839334563365f" - "5a4e39626c7331325f33383133667032334670323131706f775f76617274" - "696d653137683839356266623030643732663461646145643b5f5a4e3962" - "6c7331325f3338313267313132473150726f6a656374697665386d756c5f" - "62795f78313768313830336335636330383333313036354565665f5a4e37" - "335f244c542424524624626c7331325f3338312e2e67312e2e473150726f" - "6a656374697665247532302461732475323024636f72652e2e6f70732e2e" - "61726974682e2e4e656724475424336e6567313768363961333962383136" - "613036626237614566455f5a4e34636f7265346974657238616461707465" - "727337666c617474656e3137616e645f7468656e5f6f725f636c65617231" - "3768373932316661373530366638613637624567365f5a4e39626c733132" - "5f333831326732384732416666696e65386964656e746974793137683532" - "3261303037353662633832613639456885015f5a4e3130325f244c542462" - "6c7331325f3338312e2e67322e2e473250726f6a65637469766524753230" - "2461732475323024636f72652e2e636f6e766572742e2e46726f6d244c54" - "2424524624626c7331325f3338312e2e67322e2e4732416666696e652447" - "5424244754243466726f6d31376831393034396666373534383632623533" - "4569335f5a4e39626c7331325f3338313366703633467036396d756c5f62" - "795f303131376837316231356266356135313961376133456a385f5a4e39" - "626c7331325f333831326670324670313573756d5f6f665f70726f647563" - "747331376862306665663033383436356461336561456b5e5f5a4e39626c" - "7331325f3338313870616972696e677331364d696c6c65724c6f6f705265" - "73756c74323066696e616c5f6578706f6e656e74696174696f6e31306670" - "345f73717561726531376835333530613232303537323261303037456c68" - "5f5a4e36375f244c5424626c7331325f3338312e2e6670322e2e46703224" - "7532302461732475323024636f72652e2e6f70732e2e61726974682e2e53" - "756241737369676e2447542431307375625f61737369676e313768656138" - "64663864303262303833343633456dd5015f5a4e3137325f244c5424244c" - "5424626c7331325f3338312e2e70616972696e67732e2e47325072657061" - "726564247532302461732475323024636f72652e2e636f6e766572742e2e" - "46726f6d244c5424626c7331325f3338312e2e67322e2e4732416666696e" - "6524475424244754242e2e66726f6d2e2e41646465722475323024617324" - "75323024626c7331325f3338312e2e70616972696e67732e2e4d696c6c65" - "724c6f6f70447269766572244754243133646f75626c696e675f73746570" - "31376833303230646632373566636537643064456e385f5a4e35616c6c6f" - "63337665633136566563244c542454244324412447542434707573683137" - "6836633466633030383766393064366561456f355f5a4e34636f72653970" - "616e69636b696e6731336173736572745f6661696c656431376838396134" - "30623862613963643736636345703a5f5a4e34636f72653970616e69636b" - "696e67313870616e69635f626f756e64735f636865636b31376835613339" - "3334316633393435306165354571625f5a4e34636f726533666d74336e75" - "6d33696d7035325f244c5424696d706c2475323024636f72652e2e666d74" - "2e2e446973706c61792475323024666f7224753230247533322447542433" - "666d74313768646131373032323936653330396138624572445f5a4e3463" - "6f726533666d74336e756d33696d7032315f244c5424696d706c24753230" - "2475333224475424345f666d743137686531613333633761616434313031" - "3465457311727573745f626567696e5f756e77696e6474465f5a4e34636f" - "726533666d7439466f726d617474657231327061645f696e74656772616c" - "313277726974655f70726566697831376865323164633232613535336139" - "3935324575535f5a4e34636f726535736c69636535696e6465783234736c" - "6963655f656e645f696e6465785f6c656e5f6661696c38646f5f70616e69" - "633772756e74696d65313768623465303239633465666136373431314576" - "475f5a4e34325f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e44656275672447542433666d743137683763663234" - "64633163663734653663354577495f5a4e34345f244c5424245246245424" - "7532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768363963313766643162653433346236384578585f" - "5a4e35395f244c5424636f72652e2e666d742e2e417267756d656e747324" - "7532302461732475323024636f72652e2e666d742e2e446973706c617924" - "47542433666d74313768356530663632333530333933336330664579265f" - "5a4e34636f726533666d7435777269746531376862633530306361396130" - "663033323632457a695f5a4e36385f244c5424636f72652e2e666d742e2e" - "6275696c646572732e2e5061644164617074657224753230246173247532" - "3024636f72652e2e666d742e2e577269746524475424313077726974655f" - "6368617231376837323761393336343062616631636662457b305f5a4e34" - "636f726533666d743557726974653977726974655f666d74313768653264" - "32326663306535326231396336457c515f5a4e34636f726535736c696365" - "35696e6465783232736c6963655f696e6465785f6f726465725f6661696c" - "38646f5f70616e69633772756e74696d6531376836346563303433376262" - "666263656363457d475f5a4e34325f244c54242452462454247532302461" - "732475323024636f72652e2e666d742e2e44656275672447542433666d74" - "31376837396432393730376137363931633337457e375f5a4e34636f7265" - "3570616e6963313250616e69635061796c6f61643661735f737472313768" - "33653762626665396537333233373036457f3b5f5a4e337374643970616e" - "69636b696e673230727573745f70616e69635f776974685f686f6f6b3137" - "68396561303139313462356439323635394580010a727573745f70616e69" - "638101455f5a4e3373746433737973396261636b747261636532365f5f72" - "7573745f656e645f73686f72745f6261636b747261636531376865376239" - "323038656534343338376436458201585f5a4e337374643970616e69636b" - "696e673139626567696e5f70616e69635f68616e646c657232385f247537" - "62242475376224636c6f7375726524753764242475376424313768393666" - "3161333534313164393334366245830183015f5a4e39395f244c54247374" - "642e2e70616e69636b696e672e2e626567696e5f70616e69635f68616e64" - "6c65722e2e5374617469635374725061796c6f6164247532302461732475" - "323024636f72652e2e70616e69632e2e50616e69635061796c6f61642447" - "54243661735f737472313768653362376630636337353061633833394584" - "01505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f636875" - "6e6b31376866646432333135363766663933346634458501066d656d7365" - "748601066d656d6370798701085f5f6d756c7469338801365f5a4e313763" - "6f6d70696c65725f6275696c74696e73336d656d376d656d6d6f76653137" - "6830343030366431613866396435653532458901076d656d6d6f76650712" - "01000f5f5f737461636b5f706f696e746572090a0100072e726f64617461" - "004d0970726f64756365727302086c616e6775616765010452757374000c" - "70726f6365737365642d6279010572757374631d312e38352e3120283465" - "6231363132353020323032352d30332d31352900490f7461726765745f66" - "65617475726573042b0a6d756c746976616c75652b0f6d757461626c652d" - "676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; - -extern std::string const sp1WasmHex = - "0061736d0100000001630f60027f7f0060037f7f7f0060027f7f017f6003" - "7f7f7f017f60017f0060047f7f7f7f0060017f017f60057f7f7f7f7f0060" - "047f7f7f7f017f6000017f60077f7e7e7e7e7e7e0060000060097f7e7e7e" - "7e7e7e7e7e0060037f7e7e0060047f7e7e7f000351500906010004010001" - "000000060100000001010107040800000000000102080202040101000505" - "00010502000a0b0c00010100000100000401040000010100000101000200" - "0100000107010202030d0e000405017001080805030100110619037f0141" - "8080c0000b7f0041b0abc0000b7f0041b0abc0000b073c04066d656d6f72" - "790200147370315f67726f746831365f766572696669657200000a5f5f64" - "6174615f656e6403010b5f5f686561705f626173650302090d010041010b" - "071c1f1e323429420a81c10950add60202537f2d7e230041c0206b220124" - "0041e8a5c0002d0000410247044041e8a5c00041e8a5c0002d0000220541" - "0120051b3a00000240200504400340024002400240200541016b0e030005" - "01020b034041e8a5c0002d000022054101460d000b02400240200541016b" - "0e03000601030b000b41a49bc000412641cc9bc0001011000b41a89ac000" - "410d41949bc0001011000b41e8a5c00041e8a5c0002d0000220541012005" - "1b3a000020050d000b0b41e8a5c00041023a000041e4a5c000418c033602" - "0041e0a5c00041e892c0003602000b0b41bda9c0002d00001a41e4a5c000" - "280200211241e0a5c000280200211f024002400240024002400240024002" - "400240024002400240024002400240024002400240024002400240024002" - "400240024002404184021001220a450d00200a41c1befe827c3600800220" - "0a42e5979c9b97e3c7eb897f3700f801200a42cbb091f7e585f1e3d30037" - "00f001200a4285cca8c2988cc0acd0003700e801200a42c29391f580c1f3" - "da093700e001200a42d1f9cfc9da8dc8bcb37f3700d801200a42c1a5a5db" - "99d68fcfc8003700d001200a42a4e6aeaa96968ae30c3700c801200a42bb" - "86f4fee5c1aa8eab7f3700c001200a42ecff83a2ceee9ae7173700b80120" - "0a429fc5d69be5fafb80763700b001200a42bcd1e08deea2cfa58b7f3700" - "a801200a42aeb3eac1cda3e3c0bf7f3700a001200a42e2d8abdbae8cd3ae" - "5c37009801200a42eafbbf9fa891deb20437009001200a42afd29dfa8281" - "ecce9f7f37008801200a42b799d9dcb883f8df3b37008001200a42b3c1c2" - "a8e0a2cbc0cc00370078200a4295af8cdda2f981d269370070200a42f4eb" - "86b4cfc69bc339370068200a42f8e5b7c0c1e199bff000370060200a42c1" - "e7c485b4aac3c28c7f370058200a42f3e7ec98bff992d83b370050200a42" - "e880deac81addbc8967f370048200a4288c5f6c6eba0ef9844370040200a" - "42bdb2cf80ada892e5ec00370038200a42f887b4d9f0accbdb4c37003020" - "0a42e1c6ffa3c2dec48dcb00370028200a42fc81d7948085c1fc2c370020" - "200a42f79d8ff3bcb283ece500370018200a42beb6d5a58deadbe2d90037" - "0010200a4291c09b97b2989bf3b97f370008200a4291ec82edf9a3afba48" - "37000041bda9c0002d00001a41e0001001221d450d00201d420037000020" - "1d4200370020201d41053a001f201d4200370040201d41053a003f201d41" - "083a005f201d41176a4200370000201d41106a4200370000201d41086a42" - "00370000201d41286a4200370000201d41306a4200370000201d41376a42" - "00370000201d41c8006a4200370000201d41d0006a4200370000201d41d7" - "006a420037000041bda9c0002d00001a41c20010012205450d0020054180" - "80c00041c200104c2152200141a00f6a201f20121002024020012802a00f" - "200a280000470d002001418280c4003602e01c2001410036029c03200142" - "c080808020370294032001205241026a360290032001200141e01c6a3602" - "a003200141106a20014190036a100320012d0010044020012d0011210502" - "4020012802a003280200418280c400470d00200128029403450d00200128" - "029803450d040b41bda9c0002d00001a410810012202450d02200141d000" - "6a2116200a41e4016a2109200a41c4016a2122200a41a4016a2120200220" - "053a0000200141013602a80c200120023602a40c200141083602a00c2001" - "41b00f6a200141a0036a280200360200200141a80f6a20014198036a2902" - "0037030020012001290290033703a00f4101210503400240200141086a20" - "0141a00f6a100320012d0008450d0020012d0009210620012802a00c2005" - "460440024020012802b00f280200418280c400470d0020012802a40f450d" - "0020012802a80f450d070b230041206b220f240002404108200141a00c6a" - "220e280200220c4101742208200541016a220220022008491b2202200241" - "084d1b220241004e047f200f200c047f200f200c36021c200f200e280204" - "36021441010541000b360218200f41086a41012002200f41146a1028200f" - "2802084101470d01200f2802101a200f28020c0541000b41c096c0001019" - "000b200f28020c210c200e2002360200200e200c360204200f41206a2400" - "20012802a40c21020b200220056a20063a00002001200541016a22053602" - "a80c0c010b0b20012802a00c210220012802a40c210620012802e01c4182" - "80c4004704402002450d02200641046b2802002205417871221241044108" - "200541037122051b20026a490d05200541002012200241276a4b1b0d0620" - "0610040c020b2002418080808078460d0102400240024002402005412046" - "0440200141a80f6a2205200641176a290000370300200141b00f6a222320" - "06411f6a2d00003a00002001200629000f3703a00f200628000b21242006" - "28000721262006280003213520062d0002212d20062d0001214720062d00" - "00214820020440200641046b2802002208417871220c4104410820084103" - "7122081b20026a490d0c20084100200c200241276a4b1b0d0d200610040b" - "200141206a22062005290300370300200141286a220520232d00003a0000" - "200120012903a00f370318200141f0006a201d41e0001002200141c7006a" - "2006290300370000200141cf006a20052d00003a0000201641086a200141" - "f8006a290000370000201641106a20014180016a29000037000020164118" - "6a20014188016a290000370000200120012d0070411f713a007020162001" - "2900703700002001202436003b2001202636003720012035360033200120" - "2d3a0032200120473a0031200120483a00302001200129031837003f200a" - "290014225742388620574280fe0383422886842057428080fc0783421886" - "205742808080f80f834208868484205742088842808080f80f8320574218" - "88428080fc07838420574228884280fe03832057423888848484215e200a" - "411c6a290000225742388620574280fe0383422886842057428080fc0783" - "421886205742808080f80f834208868484205742088842808080f80f8320" - "57421888428080fc07838420574228884280fe0383205742388884848421" - "65417f200a290004225742b0c8b99297bc8cd02985200a410c6a29000022" - "5842b8a195b29bb0a0acdd008584420052205842388620584280fe038342" - "2886842058428080fc0783421886205842808080f80f8342088684842058" - "42088842808080f80f832058421888428080fc07838420584228884280fe" - "03832058423888848484225842ddb0858ce8b691a8b87f54205742388620" - "574280fe0383422886842057428080fc0783421886205742808080f80f83" - "4208868484205742088842808080f80f832057421888428080fc07838420" - "574228884280fe03832057423888848484225742a9c0c689aece93b23054" - "205742a9c0c689aece93b230511b1b2205417f470440200541ff01710d07" - "206542c6faf3c3ed82a3903c56205e428d95c7c396d2dac0977f56205e42" - "8d95c7c396d2dac0977f511b0d070b200120583703b018200120653703a0" - "18200120573703b8182001205e3703a818200a2900342257423886205742" - "80fe0383422886842057428080fc0783421886205742808080f80f834208" - "868484205742088842808080f80f832057421888428080fc078384205742" - "28884280fe03832057423888848484215e200a413c6a2900002257423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe038320574238888484842165417f200a290024225742" - "b0c8b99297bc8cd02985200a412c6a290000225842b8a195b29bb0a0acdd" - "008584420052205842388620584280fe0383422886842058428080fc0783" - "421886205842808080f80f834208868484205842088842808080f80f8320" - "58421888428080fc07838420584228884280fe0383205842388884848422" - "5842ddb0858ce8b691a8b87f54205742388620574280fe03834228868420" - "57428080fc0783421886205742808080f80f834208868484205742088842" - "808080f80f832057421888428080fc07838420574228884280fe03832057" - "423888848484225742a9c0c689aece93b23054205742a9c0c689aece93b2" - "30511b1b2205417f470440200541ff01710d07206542c6faf3c3ed82a390" - "3c56205e428d95c7c396d2dac0977f56205e428d95c7c396d2dac0977f51" - "1b0d070b200120583703d01a200120653703c01a200120573703d81a2001" - "205e3703c81a200141e0066a200141a0186a200141c01a6a100520012d00" - "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" - "2206200141a0076a290300370000200141d50c6a220220014198076a2903" - "00370000200141cd0c6a222320014190076a290300370000200141c50c6a" - "222420014188076a290300370000200141bd0c6a222620014180076a2903" - "00370000200141b50c6a2235200141f8066a290300370000200120012903" - "f0063700ad0c200141a51d6a222d20052900003700002001419d1d6a2205" - "2006290000370000200141951d6a220620022900003700002001418d1d6a" - "22022023290000370000200141851d6a22232024290000370000200141fd" - "1c6a22242026290000370000200141f51c6a222620352900003700002001" - "20012900ad0c3700ed1c200141d80a6a202d290000370300200141d00a6a" - "2005290000370300200141c80a6a2006290000370300200141c00a6a2002" - "290000370300200141b80a6a2023290000370300200141b00a6a20242900" - "00370300200120262900003703a80a200120012900ed1c3703a00a200a29" - "0054225742388620574280fe0383422886842057428080fc078342188620" - "5742808080f80f834208868484205742088842808080f80f832057421888" - "428080fc07838420574228884280fe038320574238888484842165200a41" - "dc006a290000225742388620574280fe0383422886842057428080fc0783" - "421886205742808080f80f834208868484205742088842808080f80f8320" - "57421888428080fc07838420574228884280fe0383205742388884848421" - "6a417f200a290044225742b0c8b99297bc8cd02985200a41cc006a290000" - "225842b8a195b29bb0a0acdd008584420052205842388620584280fe0383" - "422886842058428080fc0783421886205842808080f80f83420886848420" - "5842088842808080f80f832058421888428080fc07838420584228884280" - "fe03832058423888848484226242ddb0858ce8b691a8b87f542057423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe03832057423888848484225e42a9c0c689aece93b230" - "54205e42a9c0c689aece93b230511b1b2205417f470440200541ff01710d" - "07206a42c6faf3c3ed82a3903c562065428d95c7c396d2dac0977f562065" - "428d95c7c396d2dac0977f511b0d070b200a290074225742388620574280" - "fe0383422886842057428080fc0783421886205742808080f80f83420886" - "8484205742088842808080f80f832057421888428080fc07838420574228" - "884280fe03832057423888848484215a200a41fc006a2900002257423886" - "20574280fe0383422886842057428080fc0783421886205742808080f80f" - "834208868484205742088842808080f80f832057421888428080fc078384" - "20574228884280fe03832057423888848484215c417f200a290064225742" - "b0c8b99297bc8cd02985200a41ec006a290000225842b8a195b29bb0a0ac" - "dd008584420052205842388620584280fe0383422886842058428080fc07" - "83421886205842808080f80f834208868484205842088842808080f80f83" - "2058421888428080fc07838420584228884280fe03832058423888848484" - "225942ddb0858ce8b691a8b87f54205742388620574280fe038342288684" - "2057428080fc0783421886205742808080f80f8342088684842057420888" - "42808080f80f832057421888428080fc07838420574228884280fe038320" - "57423888848484225442a9c0c689aece93b23054205442a9c0c689aece93" - "b230511b1b2205417f470440200541ff01710d07205c42c6faf3c3ed82a3" - "903c56205a428d95c7c396d2dac0977f56205a428d95c7c396d2dac0977f" - "511b0d070b200a29009401225742388620574280fe038342288684205742" - "8080fc0783421886205742808080f80f8342088684842057420888428080" - "80f80f832057421888428080fc07838420574228884280fe038320574238" - "88848484215b200a419c016a290000225742388620574280fe0383422886" - "842057428080fc0783421886205742808080f80f83420886848420574208" - "8842808080f80f832057421888428080fc07838420574228884280fe0383" - "20574238888484842161417f200a29008401225742b0c8b99297bc8cd029" - "85200a418c016a290000225842b8a195b29bb0a0acdd0085844200522058" - "42388620584280fe0383422886842058428080fc07834218862058428080" - "80f80f834208868484205842088842808080f80f832058421888428080fc" - "07838420584228884280fe03832058423888848484225842ddb0858ce8b6" - "91a8b87f54205742388620574280fe0383422886842057428080fc078342" - "1886205742808080f80f834208868484205742088842808080f80f832057" - "421888428080fc07838420574228884280fe038320574238888484842257" - "42a9c0c689aece93b23054205742a9c0c689aece93b230511b1b2205417f" - "470440200541ff01710d07206142c6faf3c3ed82a3903c56205b428d95c7" - "c396d2dac0977f56205b428d95c7c396d2dac0977f511b0d070b200141e0" - "066a2020100620012d00e0060d06200141f51c6a200141f8066a29030022" - "53370000200141b80b6a20014188076a290300370300200141b00b6a2001" - "4180076a290300370300200120012903f0063703a00b200120533703a80b" - "200120623703900b2001206a3703800b200120593703f00a2001205c3703" - "e00a2001205e3703980b200120653703880b200120543703f80a2001205a" - "3703e80a200120573703d80b200120583703d00b2001205b3703c80b2001" - "20613703c00b200141e0066a200141e00a6a200141a00b6a100720012d00" - "e0060d06200141801f6a200141ad186a200141cd1a6a200141ee1c6a2001" - "41ae0c6a200141f0066a418001104c418001104c418001104c418001104c" - "418001104c1a200141e0066a2022100620012d00e0060d06200141b5186a" - "2205200141f8066a22062903002257370000200141f80a6a20014188076a" - "2202290300370300200141f00a6a20014180076a22202903003703002001" - "20012903f0063703e00a200120573703e80a200141e0066a200910062001" - "2d00e0060d06200520062903002257370000200141b80b6a200229030037" - "0300200141b00b6a2020290300370300200120012903f0063703a00b2001" - "20573703a80b200141e0066a200141e00a6a200141a00b6a100520012d00" - "e0060d06200141e50c6a2205200141a8076a290300370000200141dd0c6a" - "2206200141a0076a290300370000200141d50c6a220220014198076a2903" - "00370000200141cd0c6a222020014190076a290300370000200141c50c6a" - "222220014188076a290300370000200141bd0c6a220920014180076a2903" - "00370000200141b50c6a2223200141f8066a290300370000200120012903" - "f0063700ad0c200141a51d6a222420052900003700002001419d1d6a2205" - "2006290000370000200141951d6a220620022900003700002001418d1d6a" - "22022020290000370000200141851d6a22202022290000370000200141fd" - "1c6a22222009290000370000200141f51c6a220920232900003700002001" - "20012900ad0c3700ed1c200141d8086a2024290000370300200141d0086a" - "2005290000370300200141c8086a2006290000370300200141c0086a2002" - "290000370300200141b8086a2020290000370300200141b0086a20222900" - "00370300200141a8086a2009290000370300200120012900ed1c3703a008" - "200141e8076a20012903a80a370300200141f0076a200141b00a6a290300" - "370300200141f8076a200141b80a6a29030037030020014180086a200141" - "c00a6a29030037030020014188086a200141c80a6a290300370300200141" - "90086a200141d00a6a29030037030020014198086a200141d80a6a290300" - "370300200120012903a00a3703e007200141e0066a200141801f6a418001" - "104c1a20014190016a2001419d036a200141ad0f6a200141e0066a418002" - "104c418002104c418002104c1a2012411f4d0d0f200141a00f6a201f1008" - "20012d00a00f0d06200141e50c6a200141e80f6a29030022573700002001" - "41dd0c6a200141e00f6a2903002258370000200141d50c6a200141d80f6a" - "290300225e370000200141cd0c6a200141d00f6a29030022653700002001" - "41f00b6a200141c00f6a290300370300200141f80b6a200141c80f6a2903" - "00370300200141800c6a2065370300200141880c6a205e37030020014190" - "0c6a2058370300200141980c6a2057370300200120012903b00f3703e00b" - "2001200141b80f6a2903003703e80b201241ff004d0d10200141a00f6a20" - "1f41406b100920012d00a00f0d06200141a0186a200141ad0c6a200141b0" - "0f6a418001104c418001104c1a201241bf014d0d11200141a00f6a201f41" - "80016a100920012d00a00f0d06200141c01a6a200141ad0c6a200141b00f" - "6a418001104c418001104c1a2012419f024d0d12200141a00f6a201f41e0" - "016a100920012d00a00f0d06200141e01c6a200141ad0c6a200141b00f6a" - "418001104c418001104c1a201241a002460d13201241a102460d14201241" - "a2024d0d15201241a302460d16201f2d00a0022105201f2d00a102210620" - "1f2d00a3022102201f2d00a202212041002126200141003602a80b200142" - "8080808080023702a00b2005200641087472202041107472200241187472" - "220504404101200541187420054180fe03714108747220054108764180fe" - "0371200541187672722205200541014d1b210c200141ad0c6a2105200141" - "b00f6a210641a40221024100212241102108410021200340202041f6ffff" - "3f460d19200241206a220920124b0d1a200141a00f6a2002201f6a100820" - "012d00a00f0d0320052006290000370000200541386a2202200641386a29" - "0000370000200541306a2223200641306a290000370000200541286a2224" - "200641286a290000370000200541206a2226200641206a29000037000020" - "0541186a2235200641186a290000370000200541106a222d200641106a29" - "0000370000200541086a2247200641086a290000370000200141901f6a22" - "48202d290000370300200141981f6a222d2035290000370300200141a01f" - "6a22352026290000370300200141a81f6a22262024290000370300200141" - "b01f6a22242023290000370300200141b81f6a2223200229000037030020" - "0120052900003703801f200120472900003703881f20012802a00b202046" - "044041002108230041206b2203240002400240200141a00b6a221b280200" - "220f417f460d00200f4101742202200f41016a220e2002200e4b1b220241" - "ffffff1f4b0d0041042002200241044d1b2202410674220e41f0ffffff07" - "4b0d002003200f047f2003200f41067436021c2003201b28020436021441" - "100541000b360218200341086a4110200e200341146a1028200328020841" - "01470d0120032802101a200328020c21080b200841dc90c0001019000b20" - "0328020c210f201b2002360200201b200f360204200341206a2400200128" - "02a40b21080b200820226a220220012903801f370300200241386a202329" - "0300370300200241306a2024290300370300200241286a20262903003703" - "00200241206a2035290300370300200241186a202d290300370300200241" - "106a2048290300370300200241086a20012903881f370300200120204101" - "6a22203602a80b202241406b212220092102200c2020470d000b20012802" - "a00b21260b20012902a40b216a200141a00c6a200141a0186a100a200141" - "a00d6a200141e01c6a418001104c1a200141a00e6a200141c01a6a418001" - "104c1a200141d6126a200141980c6a290300370100200141ce126a200141" - "900c6a290300370100200141c6126a200141880c6a290300370100200141" - "be126a200141800c6a290300370100200141b6126a200141f80b6a290300" - "370100200141ae126a200141f00b6a290300370100200141a6126a200129" - "03e80b370100200120012903e00b37019e1220012d00a00c210520012d00" - "a10c2106200141a00f6a200141a00c6a41027241fe02104c1a200141e006" - "6a200141a00f6a41be03104c1a2026418080808078460d0620014190036a" - "410272200141e0066a41be03104c1a200120263602d006200120063a0091" - "03200120053a0090034100210241bda9c0002d00001a2001206a3702d406" - "41c000100b2220450d07206a4220882262a72122206aa72135200141b00f" - "6a2105200141306a2106410021120340230041206b22092400200941186a" - "221b2006290000225342388620534280fe0383422886842053428080fc07" - "83421886205342808080f80f834208868484205342088842808080f80f83" - "2053421888428080fc07838420534228884280fe03832053423888848484" - "370300200941106a2208200641086a290000225342388620534280fe0383" - "422886842053428080fc0783421886205342808080f80f83420886848420" - "5342088842808080f80f832053421888428080fc07838420534228884280" - "fe0383205342388884848437030020092006290010225342388620534280" - "fe0383422886842053428080fc0783421886205342808080f80f83420886" - "8484205342088842808080f80f832053421888428080fc07838420534228" - "884280fe038320534238888484843703082009200641186a290000225342" - "388620534280fe0383422886842053428080fc0783421886205342808080" - "f80f834208868484205342088842808080f80f832053421888428080fc07" - "838420534228884280fe0383205342388884848437030020094201420042" - "0042004281808080bfb2fdf0c3004291e1e5cd8789fa9928102b200141a0" - "0f6a220c41003a0000200c41286a201b290300370300200c41206a200829" - "0300370300200c41186a2009290308370300200c20092903003703102009" - "41206a240020012d00a00f4101460d1a200141f8066a200541186a290300" - "2257370300200141f0066a200541106a2903002258370300200120052903" - "00225e3703e0062001200541086a29030022653703e80620202012410574" - "6a220641186a2057370300200641106a2058370300200641086a20653703" - "002006205e370300410121122002410171211f4101210220162106201f45" - "0d000b206a42ffffffffffffffff03560d1a2022410674220541f1ffffff" - "074f0d1a2005450d0341bda9c0002d00001a2005100b2206450d07200620" - "352005104c211220624203520d02206a428080808010540d042001419006" - "6a212d20014190056a214720014190046a2148200141f81a6a221f201241" - "386a290300370300200141f01a6a2216201241306a290300370300200141" - "e81a6a2222201241286a290300370300200141e01a6a2209201241206a29" - "0300370300200141d81a6a2223201241186a290300370300200141d01a6a" - "2224201241106a290300370300200120122903003703c01a200120124108" - "6a2903003703c81a2020210541c00021060340200141d80c6a201f290300" - "370300200141d00c6a2016290300370300200141c80c6a20222903003703" - "00200141c00c6a2009290300370300200141b80c6a202329030037030020" - "0141b00c6a2024290300370300200120012903c81a3703a80c2001200129" - "03c01a3703a00c200120053602e00c2001200620126a22023602e40c2001" - "41e01c6a21312002210c4100212e41002136230041a0046b220424002004" - "41306a212b20044180036a2137200441e0036a210f200441f0016a210e20" - "0441c0026a211b200441e0026a2108200441b0026a2149200441d0026a21" - "4a41ff012141034002402004204141ff0071104f2005204141037641f0ff" - "ffff01716a22422903002004290300832159204241086a29030020044108" - "6a29030083215302400240027f0240024002400240024020364101714504" - "4041002053205984500d061a200441e0006a200441206a29030037030020" - "0441e8006a200441286a290300370300200441f0006a202b290300370300" - "200441f8006a200441386a29030037030020044180016a200441406b2903" - "0037030020044188016a200441c8006a2903003703002004200429031037" - "035020042004290318370358202e0d010c030b202e450d0120044188026a" - "200441c8006a222e29030037030020044180026a200441406b2250290300" - "370300200441f8016a200441386a2203290300370300200e202b29030037" - "0300200441e8016a200441286a2236290300370300200441e0016a200441" - "206a2242290300370300200420042903183703d801200420042903103703" - "d001200441d8036a224b4200370300200441d0036a220242003703002004" - "42003703f803200442003703f003200442003703e803200442013703e003" - "200442003703c803200442003703c003024002400240200441d0016a2004" - "41c0036a104a450440200e200f104a450d010b204b420037030020024200" - "370300200442003703f803200442003703f003200442003703e803200442" - "013703e003200442003703c803200442003703c003027f0240200441d001" - "6a200441c0036a104a450440200e200f104a450d010b2049202b29030037" - "0300204941186a202b41186a290300370300204941106a202b41106a2903" - "00370300204941086a202b41086a290300370300200441a0026a20422903" - "00370300200441a8026a2036290300370300200420042903103703900220" - "0420042903183703980220082102204a0c010b204a4200370300200441a0" - "026a4200370300200441a8026a4200370300204a41086a4200370300204a" - "41106a4200370300204a41186a4200370300200442003703900220044200" - "37039802201b210220490b214b2002420037030820024200370300204b42" - "00370308204b4201370300200441c0036a20044190026a20044190026a10" - "40200441f0026a200441c0036a104120042802f002410171450d01200441" - "c8016a203741386a290300370300200441c0016a203741306a2903003703" - "00200441b8016a203741286a290300370300200441b0016a203741206a29" - "0300370300200441a8016a203741186a290300370300200441a0016a2037" - "41106a29030037030020042037290300370390012004203741086a290300" - "370398010c020b200441a0016a2042290300370300200441a8016a203629" - "0300370300200441b0016a202b290300370300200441b8016a2003290300" - "370300200441c0016a2050290300370300200441c8016a202e2903003703" - "00200420042903103703900120042004290318370398010c010b41c4a0c0" - "00412041e4a0c0001021000b2042200441a0016a29030037030020362004" - "41a8016a290300370300202b200441b0016a2903003703002003200441b8" - "016a2903003703002050200441c0016a290300370300202e200441c8016a" - "290300370300200420042903900137031020042004290398013703182053" - "205984500d04200441e0006a2042290300370300200441e8006a20362903" - "00370300200441f0006a202b290300370300200441f8006a200329030037" - "030020044180016a205029030037030020044188016a202e290300370300" - "20042004290310370350200420042903183703580b200441c0036a200441" - "d0006a200c100c0c020b20532059844200520d002041450d044101213641" - "00212e0c050b200441f8036a200c41386a290300370300200441f0036a20" - "0c41306a290300370300200441e8036a200c41286a290300370300200f20" - "0c41206a290300370300200441d8036a200c41186a290300370300200441" - "d0036a200c41106a2903003703002004200c2903003703c0032004200c41" - "086a2903003703c8030b200441c8006a200441f8036a2903003703002004" - "41406b200441f0036a290300370300200441386a200441e8036a29030037" - "0300202b200f290300370300200441286a200441d8036a29030037030020" - "0441206a200441d0036a290300370300200420042903c803370318200420" - "042903c0033703100b4101212e41010b213620410d01202e0d020b4184a1" - "c0001020000b204141016b21410c010b0b20312004290310370300203141" - "086a2004290318370300203141386a200441c8006a290300370300203141" - "306a200441406b290300370300203141286a200441386a29030037030020" - "3141206a200441306a290300370300203141186a200441286a2903003703" - "00203141106a200441206a290300370300200441a0046a2400200541206a" - "2105200141c01a6a200141a00c6a200141e01c6a100c200641406b220641" - "c001470d000b200141b00f6a2205200141c01a6a100d201241c001100e20" - "0141c01a6a200141ed066a200541e000104c41e000104c1a200141e0066a" - "20014190026a100d200141a0186a21024200215c42002154420021532001" - "41e0066a220541386a2903002161200541286a290300215b200529033021" - "592005290320215e027e200529034022652005290350226a84200541c800" - "6a2903002262200541d8006a290300225a84845004402059215c20612154" - "205b2153205e0c010b42002059205e84205b20618484500d001a427f4200" - "427f4200205e42788342c7faf3c3ed82a3903c561b225c205b205c56ad7d" - "205c205b7d225b42f3eab8bce9ada5bfe8007d2253205b54ad7c42017c22" - "5b20597d225442a4cffaf397c9eed7c7007d225c205454ad2059205b56ad" - "7d427f511b20617d42a9c0c689aece93b2307c215442c7faf3c3ed82a390" - "3c205e7d0b21612002206a370350200220653703402002205c3703302002" - "20613703202002205a370358200220623703482002205437033820022053" - "37032820022005290300370300200241186a200541186a29030037030020" - "0241106a200541106a290300370300200241086a200541086a2903003703" - "0020014180196a20014190016a100f200141a01b6a2047100f200141e01c" - "6a200141d0026a100d200141c01d6a2048100f200141e0066a202d100d20" - "0141801f6a20014190036a100f200141c0076a2108420021654200215b42" - "00215c42002153024002400240200141801f6a2202290380012002418801" - "6a290300844200520d0020022903900120024198016a290300844200520d" - "0020022903a001200241a8016a290300844200520d0020022903b0012002" - "41b8016a29030084500d010b200241f8006a2903002159200241e8006a29" - "0300215e2002290370215420022903602161200229035022582002290340" - "226a84200241d8006a290300225a200241c8006a29030022628484420052" - "0440427f4200427f4200206a42788342c7faf3c3ed82a3903c561b226520" - "62206556ad7d206520627d226542f3eab8bce9ada5bfe8007d2253206554" - "ad7c42017c225c20587d225b42a4cffaf397c9eed7c7007d2265205b54ad" - "2058205c56ad7d427f511b205a7d42a9c0c689aece93b2307c215c42c7fa" - "f3c3ed82a3903c206a7d215b0b420021584200216a420021624200215a20" - "542061842059205e84844200520440427f4200427f4200206142788342c7" - "faf3c3ed82a3903c561b22582058205e54ad7d2058205e7d225e42f3eab8" - "bce9ada5bfe8007d226a205e54ad7c42017c225e20547d225842a4cffaf3" - "97c9eed7c7007d2262205854ad2054205e56ad7d427f511b20597d42a9c0" - "c689aece93b2307c215a42c7faf3c3ed82a3903c20617d21580b20082002" - "4180016a22052903003703800120082002290300370300200841b8016a20" - "0541386a290300370300200841b0016a200541306a290300370300200841" - "a8016a200541286a290300370300200841a0016a200541206a2903003703" - "0020084198016a200541186a29030037030020084190016a200541106a29" - "030037030020084188016a200541086a290300370300200841086a200241" - "086a290300370300200841106a200241106a290300370300200841186a20" - "0241186a290300370300200841206a200241206a29030037030020084128" - "6a200241286a290300370300200841306a200241306a2903003703002008" - "41386a200241386a2903003703002008205a370378200820623703702008" - "206a370368200820583703602008205c3703582008206537035020082053" - "3703482008205b3703400c010b2008200241c001104c1a0b200141a00f6a" - "200141a0186a41a002104c1a200141c0116a200141c01a6a41a002104c1a" - "200141e0136a200141e01c6a41a002104c1a20014180166a200141e0066a" - "41a002104c1a200141a00c6a2131230041b0d1006b220024002000410036" - "023820004280808080800237023020004100360244200042808080808002" - "37023c41102133200041306a10362000280234223b200141a00f6a220341" - "e000104c1a20004101360238200341e0006a2102200028023c4504402000" - "413c6a1038200028024021330b2033200241c001104c1a200341a0026a21" - "022000410136024420002802304101460440200041306a10362000280234" - "213b0b203b41e0006a200241e000104c1a2000410236023820034180036a" - "2102200028023c41014604402000413c6a1038200028024021330b203341" - "c0016a200241c001104c1a200341c0046a21022000410236024420002802" - "304102460440200041306a10362000280234213b0b203b41c0016a200241" - "e000104c1a20004103360238200341a0056a2102200028023c4102460440" - "2000413c6a1038200028024021330b20334180036a200241c001104c1a20" - "0341e0066a21022000410336024420002802304103460440200041306a10" - "362000280234213b0b203b41a0026a200241e000104c1a20004104360238" - "200341c0076a2103200028023c41034604402000413c6a10382000280240" - "21330b203341c0046a200341c001104c1a20004104360244200041003602" - "502000428080808080023702482000410036025c20004280808080800237" - "025420004180046a2151200041e00d6a2104200041b0076a212c20004190" - "c1006a2143200041d0c0006a2128200041f0c0006a2144200041c00d6a21" - "0b200041d0286a2106200041d01f6a211820004180c7006a212b200041b0" - "c7006a2107200041c0c7006a213c200041f0c6006a2102200041800e6a21" - "2d200041903b6a213d200041f03a6a2127200041d03a6a213e200041f00d" - "6a213f200041b00d6a221041086a212e200041f8c6006a214c200041b8c7" - "006a214d20004188c7006a214e200041c8c7006a211220004198c7006a21" - "1f200041d8c7006a2122200041a8c7006a2123200041e8c7006a21244110" - "2138411021050340200041e0006a203b204f41e0006c6a22031041200041" - "b0016a2033204f41c0016c6a220d104502402000280260410171450d0020" - "002802b001410171450d00200041a00d6a2003104120002802a00d410171" - "45044041a4a3c0001020000b200041f8026a2211201041386a2903003703" - "00200041f0026a2213201041306a290300370300200041e8026a22092010" - "41286a290300370300200041e0026a2215201041206a2903003703002000" - "41d8026a220f201041186a290300370300200041d0026a2225201041106a" - "290300370300200020102903003703c0022000202e2903003703c8022000" - "280248203946044041002108230041206b220e240002400240200041c800" - "6a221b280200220c417f460d00200c4101742205200c41016a2216200520" - "164b1b220541ffffff1f4b0d0041042005200541044d1b22054106742216" - "41f0ffffff074b0d00200e200c047f200e200c41067436021c200e201b28" - "020436021441100541000b360218200e41086a2016200e41146a1037200e" - "2802084101470d01200e2802101a200e28020c21080b200841b4a3c00010" - "19000b200e28020c210c201b2005360200201b200c360204200e41206a24" - "00200028024c21050b200520394106746a220320002903c0023703002003" - "41386a2011290300370300200341306a2013290300370300200341286a20" - "09290300370300200341206a2015290300370300200341186a200f290300" - "370300200341106a2025290300370300200341086a20002903c802370300" - "2000203941016a2239360250200041a00d6a200d10450240024020002802" - "a00d4101710440200041b03a6a2010418001104c1a200041d80d6a222542" - "00370300200041d00d6a223a4200370300200041c80d6a22294200370300" - "200b4200370300200041b80d6a220d420037030020104200370300203f42" - "00370300203f41086a4200370300203f41106a4200370300203f41186a42" - "00370300203f41206a4200370300203f41286a4200370300200042003703" - "e80d200042013703e00d200042003703a80d200042003703a00d027f0240" - "0240200041b03a6a200041a00d6a104a0d00203e200b104a0d0020272004" - "104a0d00203d202d104a450d010b203c4200370300200220272903003703" - "00203c41086a4200370300203c41106a4200370300203c41186a42003703" - "00203c41206a4200370300203c41286a4200370300200241386a20274138" - "6a290300370300200241306a202741306a290300370300200241286a2027" - "41286a290300370300200241206a202741206a290300370300200241186a" - "202741186a290300370300200241106a202741106a290300370300200241" - "086a202741086a290300370300200041e8c6006a200041e83a6a29030037" - "0300200041e0c6006a200041e03a6a290300370300200041d8c6006a2000" - "41d83a6a290300370300200041d0c6006a203e290300370300200041c8c6" - "006a200041c83a6a290300370300200041c0c6006a200041c03a6a290300" - "370300200020002903b83a3703b846200020002903b03a3703b04620070c" - "010b200041c0c6006a4200370300200041c8c6006a4200370300200041d0" - "c6006a4200370300200041d8c6006a4200370300200041e0c6006a420037" - "0300200041e8c6006a4200370300200042003703b046200042003703b846" - "202b41f000104b1a20020b220342003703082003420137030041bda9c000" - "2d00001a41809901100b221e450d0141002109200041003602b819200020" - "1e3602b419200041e6003602b019200041b03d6a200041b03a6a100a4140" - "212a0340200041a00d6a200041b0c6006a2002102f200041c8c3006a2215" - "200d290300370300200041c0c3006a220f20102903003703002000200029" - "03a80d3703b843200020002903a00d3703b043200041b0c3006a42a4fdf9" - "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" - "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "200041a8076a2211200b41186a221b290300370300200041a0076a221320" - "0b41106a22342903003703002000200b41086a2240290300370398072000" - "200b2903003703900720004190076a42a4fdf9e1b6c191889e7f42c6cae3" - "a18ba9ade04b42aed88286b4db88945c4294a0e38497e789991842c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f102b200041c81f6a2015290300" - "370300200041c01f6a200f29030037030020182000290390073703002018" - "41086a200029039807370300201841106a2013290300370300201841186a" - "2011290300370300200020002903b8433703b81f200020002903b0433703" - "b01f200041e8346a2203200241386a290300370300200041e0346a200241" - "306a290300370300200041d8346a2232200241286a290300370300200041" - "d0346a200241206a290300370300200041c8346a220e200241186a290300" - "370300200041c0346a200241106a2903003703002000200241086a290300" - "3703b834200020022903003703b034200041b0346a20022002102f200041" - "e8376a2219200741386a290300370300200041e0376a200741306a290300" - "370300200041d8376a221a200741286a290300370300200041d0376a2007" - "41206a290300370300200041c8376a222f200741186a2903003703002000" - "41c0376a2230200741106a2903003703002000200741086a2903003703b8" - "37200020072903003703b037200041b0376a20072007102f20002903b837" - "226942018620002903b037226b423f88842155206b420186215402400240" - "027e203029030022664201862069423f8884225342ddb0858ce8b691a8b8" - "7f85202f290300227820787c2066423f887c225642a9c0c689aece93b230" - "8584500440205442c7faf3c3ed82a3903c542055428d95c7c396d2dac097" - "7f542055428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230" - "215642ddb0858ce8b691a8b87f0c010b205342deb0858ce8b691a8b87f54" - "205642a9c0c689aece93b23054205642a9c0c689aece93b230511b450d01" - "20530b215a2054215f205521580c010b205620532055205442c7faf3c3ed" - "82a3903c7d225f20545aad22547d225942f3eab8bce9ada5bfe8007c2258" - "205954ad2054205556ad7d7c2255205354ad205542a2cffaf397c9eed7c7" - "007c225a205554ad7c50ad7d42a9c0c689aece93b2307d21560b201a2903" - "00226742018620002903d037226f423f88842154206f4201862153024002" - "4020002903e037225e4201862067423f8884225942ddb0858ce8b691a8b8" - "7f852019290300227720777c205e423f887c225542a9c0c689aece93b230" - "8584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2dac097" - "7f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230" - "215542ddb0858ce8b691a8b87f21602053215b205421700c020b205942de" - "b0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689" - "aece93b230511b450d002053215b20542170205921600c010b2055205920" - "54205342c7faf3c3ed82a3903c7d225b20535aad22537d226042f3eab8bc" - "e9ada5bfe8007c2270206054ad2053205456ad7d7c2254205954ad205442" - "a2cffaf397c9eed7c7007c2260205454ad7c50ad7d42a9c0c689aece93b2" - "307d21550b02400240027e205a20667c225a205820697c2254206954ad20" - "54205f206b7c2259206b54ad7c2253205454ad7c7c225442ddb0858ce8b6" - "91a8b87f85205a206654ad2054205a54ad7c205620787c7c225642a9c0c6" - "89aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95c7" - "c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c6" - "89aece93b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8" - "b691a8b87f54205642a9c0c689aece93b23054205642a9c0c689aece93b2" - "30511b450d0120540b215f205921582053215c0c010b2056205420532059" - "42c7faf3c3ed82a3903c7d225820595aad22597d225a42f3eab8bce9ada5" - "bfe8007c225c205a54ad2053205954ad7d7c2253205454ad205342a2cffa" - "f397c9eed7c7007c225f205354ad7c50ad7d42a9c0c689aece93b2307d21" - "560b02400240205e20607c225a206720707c2254206754ad2054205b206f" - "7c2259206f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f85" - "205a205e54ad2054205a54ad7c205520777c7c225542a9c0c689aece93b2" - "308584500440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0" - "977f542053428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" - "30215542ddb0858ce8b691a8b87f21542059215a205321590c020b205442" - "deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c6" - "89aece93b230511b450d002059215a205321590c010b2055205420532059" - "42c7faf3c3ed82a3903c7d225a20595aad22607d225b42f3eab8bce9ada5" - "bfe8007c2259205b54ad2053206054ad7d7c2253205454ad205342a2cffa" - "f397c9eed7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21" - "550b200020543703e0222000205a3703d0222000205f3703c02220002058" - "3703b022200020553703e822200020593703d822200020563703c8222000" - "205c3703b822200042d4fdc3d783f6c4cb003703d80d200042f4fbe3f6de" - "f5ab964d3703d00d200042d2b0b4a9ce90e8a7a77f3703c80d200042d2ab" - "8caee8a0afd1643703c00d200042aed5e2f58ca8a78a2b3703b80d200042" - "c3d581df919386df817f3703b00d200042a3dfefced5bcb1dab57f3703a8" - "0d200042e5f184a5c2dbf9b3323703a00d200041b0256a200041a00d6a20" - "0041b0226a102f20002903b825226442018620002903b025226e423f8884" - "2155206e420186215402400240027e20002903c02522704201862064423f" - "8884225342ddb0858ce8b691a8b87f85200041c8256a2219290300226020" - "607c2070423f887c225642a9c0c689aece93b2308584500440205442c7fa" - "f3c3ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396" - "d2dac0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691" - "a8b87f0c010b205342deb0858ce8b691a8b87f54205642a9c0c689aece93" - "b23054205642a9c0c689aece93b230511b450d0120530b215a2054215f20" - "5521580c010b205620532055205442c7faf3c3ed82a3903c7d225f20545a" - "ad22547d225942f3eab8bce9ada5bfe8007c2258205954ad2054205556ad" - "7d7c2255205354ad205542a2cffaf397c9eed7c7007c225a205554ad7c50" - "ad7d42a9c0c689aece93b2307d21560b200041d8256a221a290300227142" - "018620002903d0252265423f888421542065420186215302400240200029" - "03e025225c4201862071423f8884225942ddb0858ce8b691a8b87f852000" - "41e8256a2217290300225b205b7c205c423f887c225542a9c0c689aece93" - "b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2da" - "c0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230215542ddb0858ce8b691a8b87f21682053216c205421730c020b2059" - "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" - "c689aece93b230511b450d002053216c20542173205921680c010b205520" - "592054205342c7faf3c3ed82a3903c7d226c20535aad22537d226842f3ea" - "b8bce9ada5bfe8007c2273206854ad2053205456ad7d7c2254205954ad20" - "5442a2cffaf397c9eed7c7007c2268205454ad7c50ad7d42a9c0c689aece" - "93b2307d21550b02400240027e205a20707c225a205820647c2254206454" - "ad2054205f206e7c2259206e54ad7c2253205454ad7c7c225442ddb0858c" - "e8b691a8b87f85205a207054ad2054205a54ad7c205620607c7c225a42a9" - "c0c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d" - "95c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0242a9" - "c0c689aece93b230215a42ddb0858ce8b691a8b87f0c010b205442deb085" - "8ce8b691a8b87f54205a42a9c0c689aece93b23054205a42a9c0c689aece" - "93b230511b450d0120540b21742059217d2053216a0c010b205a20542053" - "205942c7faf3c3ed82a3903c7d227d20595aad22567d225942f3eab8bce9" - "ada5bfe8007c226a205954ad2053205654ad7d7c2256205454ad205642a2" - "cffaf397c9eed7c7007c2274205654ad7c50ad7d42a9c0c689aece93b230" - "7d215a0b02400240205c20687c2259207120737c2256207154ad20562065" - "206c7c2253206554ad7c2254205654ad7c7c225642ddb0858ce8b691a8b8" - "7f852059205c54ad2056205954ad7c2055205b7c7c225f42a9c0c689aece" - "93b2308584500440205342c7faf3c3ed82a3903c542054428d95c7c396d2" - "dac0977f542054428d95c7c396d2dac0977f511b450d0142a9c0c689aece" - "93b230215f42ddb0858ce8b691a8b87f21732053217b205421790c020b20" - "5642deb0858ce8b691a8b87f54205f42a9c0c689aece93b23054205f42a9" - "c0c689aece93b230511b450d002053217b20542179205621730c010b205f" - "20562054205342c7faf3c3ed82a3903c7d227b20535aad22557d225342f3" - "eab8bce9ada5bfe8007c2279205354ad2054205554ad7d7c2255205654ad" - "205542a2cffaf397c9eed7c7007c2273205554ad7c50ad7d42a9c0c689ae" - "ce93b2307d215f0b02400240027e207420002903c03422547c2256206a20" - "002903b83422537c2255206a54ad2055207d20002903b03422587c226820" - "7d54ad7c2259205554ad7c7c225542ddb0858ce8b691a8b87f8520562074" - "54ad2055205654ad7c205a200e29030022567c7c226d42a9c0c689aece93" - "b2308584500440206842c7faf3c3ed82a3903c542059428d95c7c396d2da" - "c0977f542059428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230216d42ddb0858ce8b691a8b87f0c010b205542deb0858ce8b691a8b8" - "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" - "0d0120550b2172206821752059217a0c010b206d20552059206842c7faf3" - "c3ed82a3903c7d227520685aad22687d226c42f3eab8bce9ada5bfe8007c" - "227a206c54ad2059206854ad7d7c2259205554ad205942a2cffaf397c9ee" - "d7c7007c2272205954ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" - "0240207320002903e03422597c22552079203229030022687c2263207954" - "ad2063207b20002903d034226c7c2261207b54ad7c2262206354ad7c7c22" - "5d42ddb0858ce8b691a8b87f852055207354ad2055205d56ad7c205f2003" - "29030022557c7c226342a9c0c689aece93b2308584500440206142c7faf3" - "c3ed82a3903c542062428d95c7c396d2dac0977f542062428d95c7c396d2" - "dac0977f511b450d0142a9c0c689aece93b230216342ddb0858ce8b691a8" - "b87f215d20612157206221610c020b205d42deb0858ce8b691a8b87f5420" - "6342a9c0c689aece93b23054206342a9c0c689aece93b230511b450d0020" - "612157206221610c010b2063205d2062206142c7faf3c3ed82a3903c7d22" - "5720615aad227c7d227642f3eab8bce9ada5bfe8007c2261207654ad2062" - "207c54ad7d7c2262205d54ad206242a2cffaf397c9eed7c7007c225d2062" - "54ad7c50ad7d42a9c0c689aece93b2307d21630b2011206d370300201320" - "723703002000207a37039807200020753703900720004190076a42a4fdf9" - "e1b6c191889e7f42c6cae3a18ba9ade04b42aed88286b4db88945c4294a0" - "e38497e789991842c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "200d20633703002010205d370300200020613703a80d200020573703a00d" - "200041a00d6a42a4fdf9e1b6c191889e7f42c6cae3a18ba9ade04b42aed8" - "8286b4db88945c4294a0e38497e789991842c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b200041c8286a22032011290300370300200041c0" - "286a220e2013290300370300200620002903a00d370300200641086a2000" - "2903a80d370300200641106a2010290300370300200641186a200d290300" - "37030020002000290398073703b82820002000290390073703b028024002" - "40027e20002903c04722612000290380477c226d204d290300225d204c29" - "03007c2263205d54ad206320002903b047225d20002903f0467c2262205d" - "54ad7c225d206354ad7c7c226342ddb0858ce8b691a8b87f852061206d56" - "ad2063206d54ad7c2012290300204e2903007c7c226d42a9c0c689aece93" - "b2308584500440206242c7faf3c3ed82a3903c54205d428d95c7c396d2da" - "c0977f54205d428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230216d42ddb0858ce8b691a8b87f0c010b206342deb0858ce8b691a8b8" - "7f54206d42a9c0c689aece93b23054206d42a9c0c689aece93b230511b45" - "0d0120630b217220622175205d217a0c010b206d2063205d206242c7faf3" - "c3ed82a3903c7d227520625aad22627d226142f3eab8bce9ada5bfe8007c" - "227a206154ad205d206254ad7d7c225d206354ad205d42a2cffaf397c9ee" - "d7c7007c2272205d54ad7c50ad7d42a9c0c689aece93b2307d216d0b0240" - "024020002903e047225720002903a0477c226320222903002262201f2903" - "007c225d206254ad205d20002903d04722622000290390477c2261206254" - "ad7c2262205d54ad7c7c225d42ddb0858ce8b691a8b87f852057206356ad" - "205d206354ad7c202429030020232903007c7c226342a9c0c689aece93b2" - "308584500440206142c7faf3c3ed82a3903c542062428d95c7c396d2dac0" - "977f542062428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b2" - "30216342ddb0858ce8b691a8b87f215d20612157206221610c020b205d42" - "deb0858ce8b691a8b87f54206342a9c0c689aece93b23054206342a9c0c6" - "89aece93b230511b450d0020612157206221610c010b2063205d20622061" - "42c7faf3c3ed82a3903c7d225720615aad227c7d227642f3eab8bce9ada5" - "bfe8007c2261207654ad2062207c54ad7d7c2262205d54ad206242a2cffa" - "f397c9eed7c7007c225d206254ad7c50ad7d42a9c0c689aece93b2307d21" - "630b200d206d3703002010207237030020292061370300200b2057370300" - "203a205d37030020252063370300200041c0c0006a224520723703002000" - "41c8c0006a2232206d37030020282057370300200041d8c0006a22142061" - "370300200041e0c0006a205d370300200041e8c0006a221c206337030020" - "0020753703a00d200020753703b0402000207a3703a80d2000207a3703b8" - "40200041b0c0006a200041a00d6a200041a00d6a102f02400240027e2054" - "20667c226d205320697c2262206954ad20622058206b7c2263206b54ad7c" - "225d206254ad7c7c226b42ddb0858ce8b691a8b87f852066206d56ad206b" - "206d54ad7c205620787c7c226942a9c0c689aece93b23085845004402063" - "42c7faf3c3ed82a3903c54205d428d95c7c396d2dac0977f54205d428d95" - "c7c396d2dac0977f511b450d0242a9c0c689aece93b230216942ddb0858c" - "e8b691a8b87f0c010b206b42deb0858ce8b691a8b87f54206942a9c0c689" - "aece93b23054206942a9c0c689aece93b230511b450d01206b0b216d2063" - "2178205d21630c010b2069206b205d206342c7faf3c3ed82a3903c7d2278" - "20635aad22667d226d42f3eab8bce9ada5bfe8007c2263206d54ad205d20" - "6654ad7d7c2266206b54ad206642a2cffaf397c9eed7c7007c226d206654" - "ad7c50ad7d42a9c0c689aece93b2307d21690b024002402059205e7c226b" - "206720687c2266206754ad2066206c206f7c225d206f54ad7c2267206654" - "ad7c7c226642ddb0858ce8b691a8b87f85205e206b56ad2066206b54ad7c" - "205520777c7c226b42a9c0c689aece93b2308584500440205d42c7faf3c3" - "ed82a3903c542067428d95c7c396d2dac0977f542067428d95c7c396d2da" - "c0977f511b450d0142a9c0c689aece93b230216b42ddb0858ce8b691a8b8" - "7f216f205d21772067215e0c020b206642deb0858ce8b691a8b87f54206b" - "42a9c0c689aece93b23054206b42a9c0c689aece93b230511b450d00205d" - "21772067215e2066216f0c010b206b20662067205d42c7faf3c3ed82a390" - "3c7d2277205d5aad226f7d225d42f3eab8bce9ada5bfe8007c225e205d54" - "ad2067206f54ad7d7c2267206654ad206742a2cffaf397c9eed7c7007c22" - "6f206754ad7c50ad7d42a9c0c689aece93b2307d216b0b20002903b84021" - "5d20002903b040216102400240417f20002903c0402267206d8520322903" - "002266206985844200522067206d54206620695420662069511b1b222141" - "7f470440202141ff01710d01206120785a205d20635a205d2063511b0d01" - "0b20662067205d206142c7faf3c3ed82a3903c7c2262206154ad7c226120" - "5d54ad206142f3eab8bce9ada5bfe8007d225d206154ad7c7c2261206754" - "ad7c206142a3cffaf397c9eed7c7007d2275206154ad7c42a9c0c689aece" - "93b2307c21660c010b20672175206121620b205d20637d227a2062207854" - "ad225754ad217c205d206354ad21762014290300215d20002903d0402172" - "02400240417f20002903e0402263206f85201c2903002267206b85844200" - "522063206f542067206b542067206b511b1b2214417f470440201441ff01" - "710d01207220775a205d205e5a205d205e511b0d010b20672063205d2072" - "42c7faf3c3ed82a3903c7c2261207254ad7c2272205d54ad207242f3eab8" - "bce9ada5bfe8007d225d207254ad7c7c2272206354ad7c207242a3cffaf3" - "97c9eed7c7007d227e207254ad7c42a9c0c689aece93b2307c21670c010b" - "2063217e207221610b206d427f85216d2076207c7c2172206f427f852163" - "205d205e54ad205d205e7d225d2061207754ad227c54ad7c217602400240" - "417f20542070852056206085844200522054207056205620605620562060" - "511b1b2214417f470440201441ff01710d012058206e5820532064582053" - "2064511b0d010b206020702064206e42c7faf3c3ed82a3903c7c225e206e" - "54ad7c226f206454ad206f42f3eab8bce9ada5bfe8007d226e206f54ad7c" - "7c2264207054ad206442a3cffaf397c9eed7c7007d2270206454ad7c7c42" - "a9c0c689aece93b2307c21600c010b206e215e2064216e0b206d20757c21" - "64420120727d21722063207e7c216f420120767d2175206020567d205442" - "7f85227620707c2260207654ad206042012053206e56ad7d206e20537d22" - "702058205e56ad226e54ad7d7c227f206054ad7c50ad7d21762070206e7d" - "216e205e20587d217e02400240417f2059205c852055205b858442005220" - "59205c562055205b562055205b511b1b2214417f470440201441ff01710d" - "012065206c5a206820715820682071511b0d010b205b205c2071206542c7" - "faf3c3ed82a3903c7c225e206554ad7c2260207154ad206042f3eab8bce9" - "ada5bfe8007d2271206054ad7c7c2260205c54ad206042a3cffaf397c9ee" - "d7c7007d225c206054ad7c7c42a9c0c689aece93b2307c215b0c010b2065" - "215e0b206420727c2160206f20757c2170200f200041c0c6006a29030037" - "03002015200041c8c6006a290300370300200041d0c3006a200041d0c600" - "6a290300370300200041d8c3006a2214200041d8c6006a29030037030020" - "0041e0c3006a200041e0c6006a290300370300200041e8c3006a221c2000" - "41e8c6006a2903003703002000207f3703c02b2000207e3703b02b200020" - "002903b0463703b043200020002903b8463703b8432000205e206c7d3703" - "d02b200020763703c82b2000206e3703b82b2000207120687d226e205e20" - "6c54ad225e7d3703d82b20002059427f852265205c7c225c420120682071" - "56ad7d205e206e56ad7d7c22713703e02b2000205b20557d205c207156ad" - "205c206554ad7c50ad7d3703e82b200041b0c3006a200041b0c6006a2000" - "41b0c6006a102f200041c8076a22212017290300370300200041c0076a20" - "0041e0256a290300370300200041b8076a2217201a290300370300202c20" - "0041d0256a290300370300201120192903003703002013200041c0256a29" - "0300370300200020002903b82537039807200020002903b0253703900720" - "004190076a200041b0256a200041b0256a102f0240417f20542074852056" - "205a858442005220542074542056205a542056205a511b1b2219417f4704" - "40201941ff01710d012058207d5a2053206a5a2053206a511b0d010b2056" - "20542053205842c7faf3c3ed82a3903c7c225b205854ad7c2258205354ad" - "205842f3eab8bce9ada5bfe8007d225c205854ad7c7c2253205454ad2053" - "42a3cffaf397c9eed7c7007d2254205354ad7c7c42a9c0c689aece93b230" - "7c2156205b2158205c21530b2064206d5421192060206454211a2063206f" - "56210c206f20705621162056205a7d2074427f85225a20547c2256205a54" - "ad205642012053206a54ad7d2053206a7d22542058207d54ad225354ad7d" - "7c225a205654ad7c50ad7d215b205420537d21532058207d7d2158024002" - "40417f20592073852055205f858442005220592073542055205f54205520" - "5f511b1b2208417f470440200841ff01710d01206c207b5a206820795a20" - "682079511b0d010b205520592068206c42c7faf3c3ed82a3903c7c225620" - "6c54ad7c225c206854ad205c42f3eab8bce9ada5bfe8007d2254205c54ad" - "7c7c225c205954ad205c42a3cffaf397c9eed7c7007d2259205c54ad7c7c" - "42a9c0c689aece93b2307c21550c010b206c2156206821540b2019ad215c" - "201aad2164200cad21712016ad216c2000205a3703c031200020583703b0" - "3120002056207b7d3703d0312000205b3703c831200020533703b8312000" - "205420797d22532056207b54ad225a7d3703d83120002073427f85225820" - "597c225642012054207954ad7d2053205a54ad7d7c22543703e031200020" - "55205f7d2054205654ad2056205854ad7c50ad7d3703e831200041b0c600" - "6a200041b01f6a200041b0316a102f2010200e290300370300200d200329" - "0300370300200b20062903003703002029200041d8286a29030037030020" - "3a200041e0286a2903003703002025200041e8286a290300370300200020" - "002903b0283703a00d200020002903b8283703a80d200041a00d6a200041" - "b0286a200041b0286a102f20002903980722544201862000290390072253" - "423f888421552053420186215a02400240027e20002903a0072259420186" - "2054423f8884225f42ddb0858ce8b691a8b87f852011290300226820687c" - "2059423f887c225642a9c0c689aece93b2308584500440205a42c7faf3c3" - "ed82a3903c542055428d95c7c396d2dac0977f542055428d95c7c396d2da" - "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" - "7f0c010b205f42deb0858ce8b691a8b87f54205642a9c0c689aece93b230" - "54205642a9c0c689aece93b230511b450d01205f0b216f205a215e205521" - "740c010b2056205f2055205a42c7faf3c3ed82a3903c7d225e205a5aad22" - "5a7d225842f3eab8bce9ada5bfe8007c2274205854ad2055205a54ad7d7c" - "2255205f54ad205542a2cffaf397c9eed7c7007c226f205554ad7c50ad7d" - "42a9c0c689aece93b2307d21560b205c20647c2173206c20717c216c2017" - "290300225a42018620002903b007225f423f8884215b205f420186215c02" - "40024020002903c0072258420186205a423f8884226442ddb0858ce8b691" - "a8b87f852021290300227120717c2058423f887c225542a9c0c689aece93" - "b2308584500440205c42c7faf3c3ed82a3903c54205b428d95c7c396d2da" - "c0977f54205b428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230215542ddb0858ce8b691a8b87f216e205c2165205b216a0c020b2064" - "42deb0858ce8b691a8b87f54205542a9c0c689aece93b23054205542a9c0" - "c689aece93b230511b450d00205c2165205b216a2064216e0c010b205520" - "64205b205c42c7faf3c3ed82a3903c7d2265205c5aad225c7d226e42f3ea" - "b8bce9ada5bfe8007c226a206e54ad205b205c54ad7d7c225b206454ad20" - "5b42a2cffaf397c9eed7c7007c226e205b54ad7c50ad7d42a9c0c689aece" - "93b2307d21550b2073502103206c50210e02400240027e2059206f7c225b" - "205420747c2264205454ad20642053205e7c225c205354ad7c2253206454" - "ad7c7c225442ddb0858ce8b691a8b87f852059205b56ad2054205b54ad7c" - "205620687c7c225642a9c0c689aece93b2308584500440205c42c7faf3c3" - "ed82a3903c542053428d95c7c396d2dac0977f542053428d95c7c396d2da" - "c0977f511b450d0242a9c0c689aece93b230215642ddb0858ce8b691a8b8" - "7f0c010b205442deb0858ce8b691a8b87f54205642a9c0c689aece93b230" - "54205642a9c0c689aece93b230511b450d0120540b215b205c2164205321" - "5c0c010b205620542053205c42c7faf3c3ed82a3903c7d2264205c5aad22" - "597d225b42f3eab8bce9ada5bfe8007c225c205b54ad2053205954ad7d7c" - "2253205454ad205342a2cffaf397c9eed7c7007c225b205354ad7c50ad7d" - "42a9c0c689aece93b2307d21560b2003ad2168206620697d216c200ead21" - "662067206b7d2167024002402058206e7c2269205a206a7c2254205a54ad" - "2054205f20657c2259205f54ad7c2253205454ad7c7c225442ddb0858ce8" - "b691a8b87f852058206956ad2054206954ad7c205520717c7c225542a9c0" - "c689aece93b2308584500440205942c7faf3c3ed82a3903c542053428d95" - "c7c396d2dac0977f542053428d95c7c396d2dac0977f511b450d0142a9c0" - "c689aece93b230215542ddb0858ce8b691a8b87f215a2059217120532169" - "0c020b205442deb0858ce8b691a8b87f54205542a9c0c689aece93b23054" - "205542a9c0c689aece93b230511b450d0020592171205321692054215a0c" - "010b205520542053205942c7faf3c3ed82a3903c7d227120595aad22597d" - "225a42f3eab8bce9ada5bfe8007c2269205a54ad2053205954ad7d7c2253" - "205454ad205342a2cffaf397c9eed7c7007c225a205354ad7c50ad7d42a9" - "c0c689aece93b2307d21550b206c20687d216b207a20577d215320672066" - "7d2168205d207c7d215920002903a80d215820002903a00d216602400240" - "417f20002903b00d225f205b85200d290300225420568584420052205b20" - "5f56205420565420542056511b1b2203417f470440200341ff01710d0120" - "642066582058205c5a2058205c511b0d010b2054205f2058206642c7faf3" - "c3ed82a3903c7c226c206654ad7c2267205854ad206742f3eab8bce9ada5" - "bfe8007d2266206754ad7c7c2258205f54ad7c205842a3cffaf397c9eed7" - "c7007d2267205854ad7c42a9c0c689aece93b2307c21540c010b205f2167" - "2066216c205821660b206220787d215f206120777d2158205420567d205b" - "427f85225420677c2256205454ad2056205c206656ad2066205c7d225420" - "64206c56ad225b54ad7c7d42017c2266205654ad7c50ad7d21672054205b" - "7d216f206c20647d216c2029290300215b20002903c00d21640240024041" - "7f20002903d00d2254205a8520252903002256205585844200522054205a" - "54205520565620552056511b1b2203417f470440200341ff01710d012064" - "20715a205b20695a205b2069511b0d010b20562054205b206442c7faf3c3" - "ed82a3903c7c225c206454ad7c2264205b54ad206442f3eab8bce9ada5bf" - "e8007d225b206454ad7c7c2264205454ad7c206442a3cffaf397c9eed7c7" - "007d2254206454ad7c42a9c0c689aece93b2307c21560c010b2064215c0b" - "20002066370380472000206c3703f0462000205c20717d37039047200020" - "67370388472000206f3703f8462000205b20697d2264205c207154ad225c" - "7d370398472000205a427f85225a20547c2254205b206954ad205c206456" - "ad7c7d42017c225b3703a0472000205620557d2054205a54ad2054205b56" - "ad7c50ad7d3703a847200020683703e831200020703703e0312000205937" - "03d831200020583703d031200020603703c0312000206b3703c831200020" - "5f3703b031200020533703b8312007200041b0346a200041b0316a102f42" - "002164200042003703e831200042003703e031200042003703d831200042" - "013703d031200042003703c831200042003703c031200042003703b83120" - "0042093703b031200041b02e6a200041b0316a200041b02b6a102f420021" - "714200216c4200216642002167205f2060842053206b8484420052044042" - "c7faf3c3ed82a3903c205f7d2166427f4200427f4200205f42788342c7fa" - "f3c3ed82a3903c561b22562053205656ad7d205620537d225642f3eab8bc" - "e9ada5bfe8007d2267205654ad7c42017c225620607d225542a4cffaf397" - "c9eed7c7007d2271205554ad2056206054ad7d427f511b206b7d42a9c0c6" - "89aece93b2307c216c0b4200216b4200216f4200215e2058207084205920" - "688484420052044042c7faf3c3ed82a3903c20587d2164427f4200427f42" - "00205842788342c7faf3c3ed82a3903c561b22562056205954ad7d205620" - "597d225642f3eab8bce9ada5bfe8007d226b205654ad7c42017c22562070" - "7d225542a4cffaf397c9eed7c7007d226f205554ad2056207054ad7d427f" - "511b20687d42a9c0c689aece93b2307c215e0b20002903b8432254420186" - "20002903b0432253423f888421552053420186215a02400240027e200029" - "03c04322594201862054423f8884225f42ddb0858ce8b691a8b87f852015" - "290300227020707c2059423f887c225642a9c0c689aece93b23085845004" - "40205a42c7faf3c3ed82a3903c542055428d95c7c396d2dac0977f542055" - "428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b230215642dd" - "b0858ce8b691a8b87f0c010b205f42deb0858ce8b691a8b87f54205642a9" - "c0c689aece93b23054205642a9c0c689aece93b230511b450d01205f0b21" - "68205a2174205521730c010b2056205f2055205a42c7faf3c3ed82a3903c" - "7d2274205a5aad225a7d225842f3eab8bce9ada5bfe8007c2273205854ad" - "2055205a54ad7d7c2255205f54ad205542a2cffaf397c9eed7c7007c2268" - "205554ad7c50ad7d42a9c0c689aece93b2307d21560b2014290300225a42" - "018620002903d043225f423f88842160205f420186215b02400240200029" - "03e0432258420186205a423f8884226942ddb0858ce8b691a8b87f85201c" - "290300225c205c7c2058423f887c225542a9c0c689aece93b23085845004" - "40205b42c7faf3c3ed82a3903c542060428d95c7c396d2dac0977f542060" - "428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542dd" - "b0858ce8b691a8b87f216e205b21652060216a0c020b206942deb0858ce8" - "b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93b2" - "30511b450d00205b21652060216a2069216e0c010b205520692060205b42" - "c7faf3c3ed82a3903c7d2265205b5aad225b7d226e42f3eab8bce9ada5bf" - "e8007c226a206e54ad205b206056ad7d7c2260206954ad206042a2cffaf3" - "97c9eed7c7007c226e206054ad7c50ad7d42a9c0c689aece93b2307d2155" - "0b02400240027e205920687c225b205420737c2269205454ad2069205320" - "747c2260205354ad7c2253206954ad7c7c225442ddb0858ce8b691a8b87f" - "852059205b56ad2054205b54ad7c205620707c7c225642a9c0c689aece93" - "b2308584500440206042c7faf3c3ed82a3903c542053428d95c7c396d2da" - "c0977f542053428d95c7c396d2dac0977f511b450d0242a9c0c689aece93" - "b230215642ddb0858ce8b691a8b87f0c010b205442deb0858ce8b691a8b8" - "7f54205642a9c0c689aece93b23054205642a9c0c689aece93b230511b45" - "0d0120540b215b20602170205321690c010b205620542053206042c7faf3" - "c3ed82a3903c7d227020605aad22597d226042f3eab8bce9ada5bfe8007c" - "2269206054ad2053205954ad7d7c2253205454ad205342a2cffaf397c9ee" - "d7c7007c225b205354ad7c50ad7d42a9c0c689aece93b2307d21560b0240" - "02402058206e7c2260205a206a7c2254205a54ad2054205f20657c225920" - "5f54ad7c2253205454ad7c7c225442ddb0858ce8b691a8b87f8520582060" - "56ad2054206054ad7c2055205c7c7c225542a9c0c689aece93b230858450" - "0440205942c7faf3c3ed82a3903c542053428d95c7c396d2dac0977f5420" - "53428d95c7c396d2dac0977f511b450d0142a9c0c689aece93b230215542" - "ddb0858ce8b691a8b87f21542059215a205321590c020b205442deb0858c" - "e8b691a8b87f54205542a9c0c689aece93b23054205542a9c0c689aece93" - "b230511b450d002059215a205321590c010b205520542053205942c7faf3" - "c3ed82a3903c7d225a20595aad225f7d225842f3eab8bce9ada5bfe8007c" - "2259205854ad2053205f54ad7d7c2253205454ad205342a2cffaf397c9ee" - "d7c7007c2254205354ad7c50ad7d42a9c0c689aece93b2307d21550b2000" - "41e81c6a2203200041e82e6a290300370300200041e01c6a220e200041e0" - "2e6a290300370300200041d81c6a2219200041d82e6a2903003703002000" - "41d01c6a221a200041d02e6a290300370300200041c81c6a2217200041c8" - "2e6a290300370300200041c01c6a2214200041c02e6a2903003703002000" - "20002903b82e3703b81c200020002903b02e3703b01c20002802b0192009" - "460440200041b0196a41c4a2c000103920002802b419211e0b2017290300" - "21532019290300215f2003290300215820002903b81c2160201e200941c0" - "016c6a220320553703b80120142903002155201a290300215c200e290300" - "216820002903b01c2174200320543703b001200320593703a8012003205a" - "3703a00120032056370398012003205b3703900120032069370388012003" - "2070370380012003205e3703782003206f3703702003206b370368200320" - "643703602003206c37035820032071370350200320673703482003206637" - "034020032074370300200341386a2058370300200341306a206837030020" - "0341286a205f370300200341206a205c370300200341186a205337030020" - "0341106a2055370300200341086a20603703002000200941016a22033602" - "b81902400240200041b0196a027f02400240202a41e4a1c0006a2d000041" - "016b0e03000401040b200041b0c9006a200041b0c6006a200041b03a6a10" - "49200041b0c9006a210e200320002802b019470d0241d4a2c0000c010b20" - "0041b0ce006a200041b0c6006a200041b03d6a1049200041b0ce006a210e" - "200320002802b019470d0141e4a2c0000b103920002802b419211e0b201e" - "200341c0016c6a200e41c001104c1a2000200941026a22033602b8190b20" - "032109202a41016a222a0d000b200042a0dcae8f86aaf9e4163703c80720" - "0042948fe8babd91b3d2cb003703c007200042cebbf2dbd0c38ad7323703" - "b807200042a297bfa0c6a3f5b2163703b007200042f7a3e4fb84f3d1d92f" - "3703a807200042c3e2e6aacf87fb85cc003703a0072000428ce68c968ce2" - "b0c6b77f37039807200042bdaabdbbf1aae5f1997f370390072015203e41" - "186a290300370300200f203e41106a2903003703002000203e41086a2903" - "003703b8432000203e2903003703b043200041b0c3006a42c6faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200d" - "200041c83a6a2903003703002010200041c03a6a290300370300200b2000" - "2903b043370300204020002903b8433703002034200f290300370300201b" - "2015290300370300200020002903b83a3703a80d200020002903b03a3703" - "a00d200041b0c0006a20004190076a200041a00d6a102f2000429a8984e2" - "ca978fe0073703c807200042abdee5e3feb4ad82073703c007200042d2b7" - "89fd98b99fc0213703b807200042e3e18eb1b2ecdfe9827f3703b0072000" - "42dcebebc4d4e0bc9e063703a807200042b9f38bb78bd3b1af5c3703a007" - "20004298b3a5ceda9db8d55b37039807200042daa6808de7a880aa5c3703" - "90072015203d41186a290300370300200f203d41106a2903003703002000" - "203d41086a2903003703b8432000203d2903003703b043200041b0c3006a" - "42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200d202741186a2903003703002010202741106a2903003703" - "00200b20002903b043370300204020002903b8433703002034200f290300" - "370300201b20152903003703002000202741086a2903003703a80d200020" - "272903003703a00d204420004190076a200041a00d6a102f200042a0dcae" - "8f86aaf9e4163703e843200042948fe8babd91b3d2cb003703e043200042" - "cebbf2dbd0c38ad7323703d843200042a297bfa0c6a3f5b2163703d04320" - "0042f7a3e4fb84f3d1d92f3703c843200042c3e2e6aacf87fb85cc003703" - "c0432000428ce68c968ce2b0c6b77f3703b843200042bdaabdbbf1aae5f1" - "997f3703b043202f202841186a2903003703002030202841106a29030037" - "03002000202841086a2903003703b837200020282903003703b037200041" - "b0376a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b2011203229030037030020132045290300370300202c" - "20002903b037370300202c41086a220d20002903b837370300202c41106a" - "22092030290300370300202c41186a2215202f2903003703002000200029" - "03b84037039807200020002903b04037039007200041a00d6a200041b0c3" - "006a20004190076a102f2000429a8984e2ca978fe0073703e843200042ab" - "dee5e3feb4ad82073703e043200042d2b789fd98b99fc0213703d8432000" - "42e3e18eb1b2ecdfe9827f3703d043200042dcebebc4d4e0bc9e063703c8" - "43200042b9f38bb78bd3b1af5c3703c04320004298b3a5ceda9db8d55b37" - "03b843200042daa6808de7a880aa5c3703b043202f204341186a29030037" - "03002030204341106a2903003703002000204341086a2903003703b83720" - "0020432903003703b037200041b0376a42c6faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2011204441186a2903" - "003703002013204441106a290300370300202c20002903b037370300200d" - "20002903b837370300200920302903003703002015202f29030037030020" - "00204441086a2903003703980720002044290300370390072004200041b0" - "c3006a20004190076a102f200041b0c3006a200041a00d6a100a20004190" - "076a200041b0c6006a200041b0c0006a104920002802b019221120034604" - "40200041b0196a41a4a2c000103920002802b019211120002802b419211e" - "0b201e200341c0016c6a20004190076a41c001104c1a2000200341016a22" - "0d3602b819200041a00d6a200041b0c6006a200041b0c3006a1049200d20" - "11470d02200041b0196a41b4a2c000103920002802b419211e0c020b41c4" - "a3c00010200b000b201e200d41c0016c6a200041a00d6a41c001104c1a20" - "0041b8196a220d200341026a36020020004180036a200041b03a6a418001" - "104c1a205141086a200d280200360200205120002902b019370200200028" - "025420464604404100211b230041206b220e240002400240200041d4006a" - "22162802002209417f460d00410420094101742208200941016a220c2008" - "200c4b1b2208200841044d1b220cad4290017e22534220884200520d0020" - "53a7220841f0ffffff074b0d00200e2009047f200e20094190016c36021c" - "200e201628020436021441100541000b360218200e41086a2008200e4114" - "6a1037200e2802084101470d01200e2802101a200e28020c211b0b201b41" - "d4a3c0001019000b200e28020c21092016200c3602002016200936020420" - "0e41206a2400200028025821380b203820464190016c6a20004180036a41" - "9001104c1a2000204641016a224636025c0b204f41016a224f4104470d00" - "0b0240024002400240024002400240024002400240024002402046450440" - "2000280254210320004190076a41f002104b1a20030d010c020b41002118" - "200041a0076a41f002104b1a200042003703980720004201370390072046" - "2039203920464b1b210820384184016a211b200041e00e6a2134200041b0" - "cf006a2119200041f0ce006a211a200041f0c3006a2114200041b0c4006a" - "2121200041b0ca006a2140200041f0c9006a2145200041b0c7006a214c20" - "004190086a212c200041f0c6006a214d200041d0076a212820004190096a" - "211c200041d0096a214e200041d0086a2117200041d0ce006a2110200041" - "d0c9006a21134100210c0240024002400340200041b0c3006a2000419007" - "6a2017103b200042003703e849200042003703e049200042003703d84920" - "0042013703d049200042003703c849200042003703c049200042003703b8" - "49200042093703b049200041b0ce006a204e200041b0c9006a102f201941" - "386a2203201c41386a290300370300201941306a2202201c41306a290300" - "370300201941286a2207201c41286a290300370300201941206a220b201c" - "41206a290300370300201941186a220d201c41186a290300370300201941" - "106a2211201c41106a290300370300201941086a2206201c41086a290300" - "3703002019201c290300370300201a2017290300370300201a41086a2209" - "201741086a290300370300201a41106a2215201741106a29030037030020" - "1a41186a220f201741186a290300370300201a41206a2225201741206a29" - "0300370300201a41286a2229201741286a290300370300201a41306a222a" - "201741306a290300370300201a41386a221e201741386a29030037030020" - "0041b0c6006a200041b0ce006a20004190076a1030204d201a2028103020" - "4c2019202c1030200041b0ce006a201741c001104c1a200041b0c9006a20" - "004190076a2017103020452028201a10302040202c20191030200041b0ce" - "006a200041b0c6006a200041b0c9006a103b200041b0c9006a200041b0ce" - "006a200041b0c3006a103c200042003703e846200042003703e046200042" - "003703d846200042013703d046200042003703c846200042003703c04620" - "0042003703b846200042093703b046200041b0ce006a2021200041b0c600" - "6a102f201a20002903b043370300200920002903b8433703002015200041" - "c0c3006a290300370300200f200041c8c3006a2903003703002025200041" - "d0c3006a2903003703002029200041d8c3006a290300370300202a200041" - "e0c3006a290300370300201e200041e8c3006a2903003703002003201441" - "386a2903003703002002201441306a2903003703002007201441286a2903" - "00370300200b201441206a290300370300200d201441186a290300370300" - "2011201441106a2903003703002006201441086a29030037030020192014" - "290300370300200041a00d6a200041b0c9006a200041b0ce006a103c2000" - "41b0ce006a200041b0c3006a200041b0c3006a1030201a20142014103020" - "192021202110302034200041b0ce006a41c001104c1a20004190076a2000" - "41a00d6a418003104c1a200c41016a2116201b2106200521022008210f02" - "7f02402039450440200c41a4a1c0006a2d00000d01201841016a21182016" - "220c41c000460d040c030b02400340200641046a280200220320184b0440" - "200241386a2903002156200241306a2903002155200241286a2903002154" - "200241206a2903002153200041c8ce006a220d2006280200201841c0016c" - "6a220341d8006a290300370300200041c0ce006a2211200341d0006a2903" - "003703002000200341c8006a2903003703b84e200020032903403703b04e" - "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b200041b80d6a2207200341f8006a2903003703002000" - "41b00d6a220b200341f0006a2903003703002000200341e8006a29030037" - "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2225" - "200d290300370300200041c0c9006a222920112903003703002013200029" - "03a00d370300201341086a222a20002903a80d370300201341106a221e20" - "0b290300370300201341186a222f2007290300370300200020002903b84e" - "3703b849200020002903b04e3703b049200241186a290300215620024110" - "6a2903002155200241086a290300215420022903002153200041c8c6006a" - "220920034198016a290300370300200041c0c6006a221520034190016a29" - "0300370300200020034188016a2903003703b84620002003290380013703" - "b046200041b0c6006a205320542055205642c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b2007200341b8016a290300370300200b200341b0" - "016a2903003703002000200341a8016a2903003703a80d200020032903a0" - "013703a00d200041a00d6a205320542055205642c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b200d20092903003703002011201529030037" - "0300201020002903a00d370300201041086a223020002903a80d37030020" - "1041106a223a200b290300370300201041186a2232200729030037030020" - "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" - "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" - "0041a00d6a418003104c1a20064190016a2106200241406b2102200f4101" - "6b220f0d010c020b0b201820034194a2c0001010000b201b210620052102" - "2008210e201841016a220f200c41a4a1c0006a2d0000450d011a03402006" - "41046a2802002203200f4b0440200241386a2903002156200241306a2903" - "002155200241286a2903002154200241206a2903002153200d2006280200" - "200f41c0016c6a220341d8006a2903003703002011200341d0006a290300" - "3703002000200341c8006a2903003703b84e200020032903403703b04e20" - "0041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b2007200341f8006a290300370300200b200341f0006a29" - "03003703002000200341e8006a2903003703a80d200020032903603703a0" - "0d200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b2025200d290300370300202920112903003703002013" - "20002903a00d370300202a20002903a80d370300201e200b290300370300" - "202f2007290300370300200020002903b84e3703b849200020002903b04e" - "3703b049200241186a2903002156200241106a2903002155200241086a29" - "0300215420022903002153200920034198016a2903003703002015200341" - "90016a290300370300200020034188016a2903003703b846200020032903" - "80013703b046200041b0c6006a205320542055205642c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f102b2007200341b8016a290300370300200b" - "200341b0016a2903003703002000200341a8016a2903003703a80d200020" - "032903a0013703a00d200041a00d6a205320542055205642c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b200d200929030037030020112015" - "290300370300201020002903a00d370300203020002903a80d370300203a" - "200b29030037030020322007290300370300200020002903b8463703b84e" - "200020002903b0463703b04e200041a00d6a20004190076a2003200041b0" - "c9006a200041b0ce006a104820004190076a200041a00d6a418003104c1a" - "20064190016a2106200241406b2102200e41016b220e0d010c020b0b200f" - "20034184a2c0001010000b201841026a0b21182016220c41c000470d000b" - "2039450d0020384184016a2107200041d0ce006a210b200041d0c9006a21" - "0d201841c0016c2125200521022008210903402018200741046a28020022" - "034f0d02200241386a2903002156200241306a2903002155200241286a29" - "03002154200241206a2903002153200041c8ce006a221320072802002025" - "6a220341d8006a290300370300200041c0ce006a2206200341d0006a2903" - "003703002000200341c8006a2903003703b84e200020032903403703b04e" - "200041b0ce006a205320542055205642c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f102b200041b80d6a2211200341f8006a2903003703002000" - "41b00d6a2210200341f0006a2903003703002000200341e8006a29030037" - "03a80d200020032903603703a00d200041a00d6a205320542055205642c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041c8c9006a2013" - "290300370300200041c0c9006a2006290300370300200d20002903a00d37" - "0300200d41086a20002903a80d370300200d41106a201029030037030020" - "0d41186a2011290300370300200020002903b84e3703b849200020002903" - "b04e3703b049200241186a2903002156200241106a290300215520024108" - "6a290300215420022903002153200041c8c6006a221520034198016a2903" - "00370300200041c0c6006a220f20034190016a2903003703002000200341" - "88016a2903003703b84620002003290380013703b046200041b0c6006a20" - "5320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "2011200341b8016a2903003703002010200341b0016a2903003703002000" - "200341a8016a2903003703a80d200020032903a0013703a00d200041a00d" - "6a205320542055205642c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b201320152903003703002006200f290300370300200b20002903a00d" - "370300200b41086a20002903a80d370300200b41106a2010290300370300" - "200b41186a2011290300370300200020002903b8463703b84e2000200029" - "03b0463703b04e200041a00d6a20004190076a2003200041b0c9006a2000" - "41b0ce006a104820004190076a200041a00d6a418003104c1a2007419001" - "6a2107200241406b2102200941016b22090d000b20384184016a21072000" - "41d0ce006a210b200041d0c9006a210d201841016a221841c0016c210f20" - "05210203402018200741046a28020022034f0d03200241386a2903002156" - "200241306a2903002155200241286a2903002154200241206a2903002153" - "200041c8ce006a22132007280200200f6a220341d8006a29030037030020" - "0041c0ce006a2206200341d0006a2903003703002000200341c8006a2903" - "003703b84e200020032903403703b04e200041b0ce006a20532054205520" - "5642c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200041b80d6a" - "2211200341f8006a290300370300200041b00d6a2210200341f0006a2903" - "003703002000200341e8006a2903003703a80d200020032903603703a00d" - "200041a00d6a205320542055205642c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b200041c8c9006a2013290300370300200041c0c9006a20" - "06290300370300200d20002903a00d370300200d41086a20002903a80d37" - "0300200d41106a2010290300370300200d41186a20112903003703002000" - "20002903b84e3703b849200020002903b04e3703b049200241186a290300" - "2156200241106a2903002155200241086a29030021542002290300215320" - "0041c8c6006a220920034198016a290300370300200041c0c6006a221520" - "034190016a290300370300200020034188016a2903003703b84620002003" - "290380013703b046200041b0c6006a205320542055205642c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b2011200341b8016a290300370300" - "2010200341b0016a2903003703002000200341a8016a2903003703a80d20" - "0020032903a0013703a00d200041a00d6a205320542055205642c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f102b201320092903003703002006" - "2015290300370300200b20002903a00d370300200b41086a20002903a80d" - "370300200b41106a2010290300370300200b41186a201129030037030020" - "0020002903b8463703b84e200020002903b0463703b04e200041a00d6a20" - "004190076a2003200041b0c9006a200041b0ce006a104820004190076a20" - "0041a00d6a418003104c1a20074190016a2107200241406b210220084101" - "6b22080d000b0b20004190046a20004190076a418003104c1a200041b03d" - "6a20004190046a103d200041b03a6a200041d0056a221f103d2000420037" - "03e834200042003703e034200042003703d834200042013703d034200042" - "003703c834200042003703c034200042003703b834200042093703b03420" - "0041b0ce006a200041b03b6a200041b0346a102f200041b8cf006a223620" - "0041f83a6a290300370300200041c0cf006a2237200041803b6a29030037" - "0300200041c8cf006a2242200041883b6a290300370300200041d0cf006a" - "2241200041903b6a290300370300200041d8cf006a2247200041983b6a29" - "0300370300200041e0cf006a2248200041a03b6a290300370300200041e8" - "cf006a224b200041a83b6a290300370300200041f8ce006a222220002903" - "b83a37030020004180cf006a2223200041c03a6a22492903003703002000" - "4188cf006a2224200041c83a6a224a29030037030020004190cf006a224f" - "200041d03a6a225029030037030020004198cf006a2227200041d83a6a22" - "39290300370300200041a0cf006a223f200041e03a6a223c290300370300" - "200041a8cf006a223e200041e83a6a2244290300370300200020002903f0" - "3a3703b04f200020002903b03a3703f04e200041b0376a200041b03d6a20" - "0041b0ce006a103c200041e8106a2217200041e8376a220f290300370300" - "200041e0106a2214200041e0376a2225290300370300200041d8106a221c" - "200041d8376a2229290300370300200041d0106a2221200041d0376a222a" - "290300370300200041c8106a220c200041c8376a221e2903003703002000" - "41c0106a2216200041c0376a222f290300370300200020002903b8373703" - "b810200020002903b0373703b010200041b0106a200041b0376a200041b0" - "376a102f200041e8136a2208200041a8386a222c290300370300200041e0" - "136a2228200041a0386a221b290300370300200041d8136a223420004198" - "386a2240290300370300200041d0136a224520004190386a224c29030037" - "0300200041c8136a221020004188386a224d290300370300200041c0136a" - "221320004180386a224e290300370300200041c0316a2230200041c0386a" - "223d290300370300200041c8316a223a200041c8386a2243290300370300" - "200041d0316a2232200041d0386a2251290300370300200041d8316a220e" - "200041d8386a2204290300370300200041e0316a2219200041e0386a222e" - "290300370300200041e8316a221a200041e8386a222d2903003703002000" - "200041f8376a22122903003703b813200020002903f0373703b013200020" - "002903b0383703b0312000200041b8386a222b2903003703b831200041b0" - "136a200041f0376a2215200041b0386a2218102f200042003703e8342000" - "42003703e034200042003703d834200042013703d034200042003703c834" - "200042003703c034200042003703b834200042093703b034200041b0ce00" - "6a200041b0136a200041b0346a102f2008200041e8ce006a220329030037" - "03002028200041e0ce006a22022903003703002034200041d8ce006a2207" - "2903003703002045200041d0ce006a220d2903003703002010200041c8ce" - "006a22112903003703002013200041c0ce006a220b290300370300200020" - "002903b84e3703b813200020002903b04e3703b013200041b80a6a220620" - "0c290300370300200041b00a6a22092016290300370300200020002903b8" - "103703a80a200020002903b0103703a00a200041a00a6a20002903b01320" - "002903b8132013290300201029030042c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" - "0041c83d6a22132017290300370300200041c03d6a221020142903003703" - "002000201c2903003703b83d200020212903003703b03d200041b03d6a20" - "4529030020342903002028290300200829030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d201120062903002256370300200b20092903002255370300200d20" - "002903b03d2254370300200220102903002253370300200720002903b83d" - "225937030020032013290300225a370300200020002903a80a225f3703b8" - "4e200020002903a00a22583703b04e2017205a3703002014205337030020" - "1c205937030020212054370300200c205637030020162055370300200020" - "5f3703b810200020583703b010200041e8166a2217202d29030037030020" - "0041e0166a2214202e290300370300200041d8166a221c20042903003703" - "00200041d0166a22212051290300370300200041c8166a220c2043290300" - "370300200041c0166a2216203d2903003703002000202b2903003703b816" - "200020002903b0383703b016200041b0166a20182018102f200041b0ce00" - "6a200041b0166a200041b0346a102f201720032903003703002014200229" - "0300370300201c20072903003703002021200d290300370300200c201129" - "03003703002016200b290300370300200041c0196a2208202f2903003703" - "00200041c8196a2228201e290300370300200041d0196a2234202a290300" - "370300200041d8196a22452029290300370300200041e0196a223d202529" - "0300370300200041e8196a2243200f290300370300200020002903b84e37" - "03b816200020002903b04e3703b016200020002903b0373703b019200020" - "002903b8373703b819200041e8226a202c290300370300200041e0226a20" - "1b290300370300200041d8226a2040290300370300200041d0226a204c29" - "0300370300200041c8226a204d290300370300200041c0226a204e290300" - "370300200020122903003703b822200020002903f0373703b022200041b0" - "196a200041b0376a2015102f2006200c2903003703002009201629030037" - "0300200020002903b8163703a80a200020002903b0163703a00a200041a0" - "0a6a20002903b01920002903b8192008290300202829030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d20132017290300370300201020142903003703002000" - "201c2903003703b83d200020212903003703b03d200041b03d6a20342903" - "002045290300203d290300204329030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "201120062903002256370300200b20092903002255370300200d20002903" - "b03d2254370300200220102903002253370300200720002903b83d225937" - "030020032013290300225a370300200020002903a80a225f3703b84e2000" - "20002903a00a22583703b04e2017205a37030020142053370300201c2059" - "37030020212054370300200c2056370300201620553703002000205f3703" - "b816200020583703b016200041e81c6a2217202c290300370300200041e0" - "1c6a2214201b290300370300200041d81c6a221c20402903003703002000" - "41d01c6a2221204c290300370300200041c81c6a220c204d290300370300" - "200041c01c6a2216204e290300370300200020122903003703b81c200020" - "002903f0373703b01c200041b01c6a20152015102f200041e81f6a220820" - "0f290300370300200041e01f6a222c2025290300370300200041d81f6a22" - "282029290300370300200041d01f6a221b202a290300370300200041c81f" - "6a2234201e290300370300200041c01f6a2240202f290300370300200020" - "002903b8373703b81f200020002903b0373703b01f200041b01f6a200041" - "b0376a2018102f2006200c29030037030020092016290300370300200020" - "002903b81c3703a80a200020002903b01c3703a00a200041a00a6a200029" - "03b01f20002903b81f2040290300203429030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d20132017290300370300201020142903003703002000201c290300" - "3703b83d200020212903003703b03d200041b03d6a201b29030020282903" - "00202c290300200829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2011200629" - "03002256370300200b20092903002255370300200d20002903b03d225437" - "0300200220102903002253370300200720002903b83d2259370300200320" - "13290300225a370300200020002903a80a225f3703b84e200020002903a0" - "0a22583703b04e2017205a37030020142053370300201c20593703002021" - "2054370300200c2056370300201620553703002000205f3703b81c200020" - "583703b01c200041b0316a2018200041b0166a102f200041b0226a201520" - "0041b01c6a102f200041b0ce006a200041b0316a200041b0226a1030201a" - "200329030037030020192002290300370300200e20072903003703002032" - "200d290300370300203a20112903003703002030200b2903003703002000" - "20002903b84e3703b831200020002903b04e3703b031200041b0ce006a20" - "0041b0316a200041b0346a102f201a200329030037030020192002290300" - "370300200e20072903003703002032200d290300370300203a2011290300" - "3703002030200b290300370300200041c0256a202f290300370300200041" - "c8256a201e290300370300200041d0256a202a290300370300200041d825" - "6a2029290300370300200041e0256a2025290300370300200041e8256a20" - "0f290300370300200020002903b84e3703b831200020002903b04e3703b0" - "31200020002903b0373703b025200020002903b8373703b825200041b025" - "6a200041b0376a200041b0106a102f200041b0ce006a200041b0316a2000" - "41b0256a1030201a200329030037030020192002290300370300200e2007" - "2903003703002032200d290300370300203a20112903003703002030200b" - "290300370300200020002903b84e3703b831200020002903b04e3703b031" - "200041b03d6a200041b0316a103120002802b03d4101710440200041e82e" - "6a2206200041f83d6a22092903002256370300200041e02e6a2229200041" - "f03d6a222a2903002255370300200041d82e6a221e200041e83d6a221529" - "03002254370300200041d02e6a222f200041e03d6a221829030022533703" - "00200041c82e6a2230200041d83d6a220f2903002259370300200041c02e" - "6a223a200041d03d6a2225290300225a370300200041c0286a2232205a37" - "0300200041c8286a220e2059370300200041d0286a221920533703002000" - "41d8286a221a2054370300200041e0286a22172055370300200041e8286a" - "22142056370300200020002903c03d22563703b02e200020563703b02820" - "00201329030022563703b82e200020563703b828200041b0286a20102000" - "41b0106a102f200041e82b6a221c2009290300370300200041e02b6a2221" - "202a290300370300200041d82b6a222a2015290300370300200041d02b6a" - "220c2018290300370300200041c82b6a2216200f290300370300200041c0" - "2b6a22082025290300370300200020132903003703b82b200020002903c0" - "3d3703b02b200041b02b6a2010200041b0166a102f200041b02e6a201020" - "0041b01c6a102f2003201429030037030020022017290300370300200720" - "1a290300370300200d20192903003703002011200e290300370300200b20" - "32290300370300202220002903b82b370300202320082903003703002024" - "2016290300370300204f200c2903003703002027202a290300370300203f" - "2021290300370300203e201c290300370300200020002903b8283703b84e" - "200020002903b0283703b04e200020002903b02b3703f04e204b20062903" - "00370300204820292903003703002047201e2903003703002041202f2903" - "00370300204220302903003703002037203a290300370300203620002903" - "b82e370300200020002903b02e3703b04f200041c0c0006a200041b0ce00" - "6a41c001104c2106200042003703b840200042013703b040200041b0ce00" - "6a20004190046a2006103b200041b03d6a201f2006103b200041f0cf006a" - "200041b03d6a103e200041b00d6a200041b0ce006a418003104c21292000" - "42003703a80d200042013703a00d200041f0c4006a201f103e200041b0c3" - "006a20004190046a41c001104c1a200041b0c6006a200041b0c3006a2029" - "103f200742003703002002420037030020034200370300200042a9c0c689" - "aece93b2303703c84e200042b099b385febcf6b6de003703c04e200042bd" - "dcd9dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e2000" - "42003703d04e200041b0c0006a200041f0c6006a200041b0ce006a102f20" - "0742003703002002420037030020034200370300200042003703c84e2000" - "42ac97d286eaf99af1d9003703c04e200042cfb8ede69afe98f9543703b8" - "4e200042feffffbf97e6d1b1d7003703b04e200042003703d04e200041b0" - "3e6a200041b0c7006a200041b0ce006a102f2010200041c0c6006a290300" - "3703002013200041c8c6006a2903003703002025200041d0c6006a290300" - "370300200f200041d8c6006a2903003703002018200041e0c6006a290300" - "3703002015200041e8c6006a290300370300200920002903b84037030020" - "0041803e6a2006290300370300200041883e6a200041c8c0006a29030037" - "0300200041903e6a200041d0c0006a290300370300200041983e6a200041" - "d8c0006a2210290300370300200041a03e6a200041e0c0006a2213290300" - "370300200041a83e6a200041e8c0006a2206290300370300200020002903" - "b0463703b03d200020002903b8463703b83d200020002903b0403703f03d" - "200742003703002002420037030020034200370300200042a9c0c689aece" - "93b2303703c84e200042b099b385febcf6b6de003703c04e200042bddcd9" - "dcfbd3c1c7423703b84e200042c8faf383d69cd1de643703b04e20004200" - "3703d04e200041b03a6a200041b0c8006a200041b0ce006a102f20104200" - "3703002013420037030020064200370300200042003703c840200042ac97" - "d286eaf99af1d9003703c040200042cfb8ede69afe98f9543703b8402000" - "42feffffbf97e6d1b1d7003703b040200042003703d040200041b0cf006a" - "2210200041f0c8006a200041b0c0006a102f200b20004180c8006a290300" - "370300201120004188c8006a290300370300200d20004190c8006a290300" - "370300200720004198c8006a2903003703002002200041a0c8006a290300" - "3703002003200041a8c8006a290300370300202220002903b83a37030020" - "2320492903003703002024204a290300370300204f205029030037030020" - "272039290300370300203f203c290300370300203e204429030037030020" - "0020002903f0473703b04e2000200041f8c7006a2903003703b84e200020" - "002903b03a3703f04e20394200370300203c420037030020444200370300" - "200042a9c0c689aece93b2303703c83a200042b099b385febcf6b6de0037" - "03c03a200042bddcd9dcfbd3c1c7423703b83a200042c9faf383d69cd1de" - "643703b03a200042003703d03a200041b0c0006a200041b0ce006a200041" - "b03a6a102f200041f0c0006a200041f0ce006a200041b03a6a102f200041" - "b0c1006a2010200041b03a6a102f200041b0c9006a200041b03d6a41c001" - "104c1a200041f0ca006a200041b0c0006a41c001104c1a200041a0076a22" - "0d200041b0c9006a200041b0c6006a103f20004200370398072000420137" - "039007200041a00a6a200d418003104c1a200042003703c8492000420037" - "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" - "2107200b41f002104b1a200042003703b84e200042013703b04e41ff0121" - "03200041286a210b0340200041206a200341ff0071104f200b2903002000" - "41b0c9006a200341037641f0ffffff01716a220229030883215620002903" - "20200229030083215520074101710440200041a00d6a200041b0ce006a10" - "46200041b0ce006a200041a00d6a418003104c1a0b205520568442005204" - "40200041a00d6a200d200041b0ce006a103f200041b0ce006a200041a00d" - "6a418003104c1a410121070b200341016b2203417f470d000b200041f011" - "6a200041f0cf006a103e200041b0106a200041b0ce006a41c001104c1a20" - "0041b0136a200041b0106a1046200041b0166a200041b0136a1046200041" - "b0196a200041b0166a200041b0136a103f200042003703c8492000420037" - "03c049200042003703b849200042f193a4d3c4d6e4f4c4003703b0494100" - "2107200041c0ce006a41f002104b1a200042003703b84e200042013703b0" - "4e41ff012103200041186a210b0340200041106a200341ff0071104f200b" - "290300200041b0c9006a200341037641f0ffffff01716a22022903088321" - "562000290310200229030083215520074101710440200041a00d6a200041" - "b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b20552056" - "844200520440200041a00d6a200041b0196a200041b0ce006a103f200041" - "b0ce006a200041a00d6a418003104c1a410121070b200341016b2203417f" - "470d000b200041f01d6a200041f0cf006a103e200041b01c6a200041b0ce" - "006a41c001104c1a200041b01f6a200041b01c6a1046200042003703c849" - "200042003703c049200042003703b849200042f193a4d3c4d6e4f4c40037" - "03b04941002107200041c0ce006a41f002104b1a200042003703b84e2000" - "42013703b04e41ff012103200041086a210b03402000200341ff0071104f" - "200b290300200041b0c9006a200341037641f0ffffff01716a2202290308" - "8321562000290300200229030083215520074101710440200041a00d6a20" - "0041b0ce006a1046200041b0ce006a200041a00d6a418003104c1a0b2055" - "2056844200520440200041a00d6a200041b01f6a200041b0ce006a103f20" - "0041b0ce006a200041a00d6a418003104c1a410121070b200341016b2203" - "417f470d000b200041f0236a2203200041f0cf006a2211103e200041b022" - "6a200041b0ce006a41c001104c1a200041f0266a200041f01a6a103e2000" - "41b0256a200041b0196a41c001104c1a200041f0296a2003103e200041b0" - "286a200041b0226a41c001104c1a200041b02b6a200041b0286a200041b0" - "1c6a103f200041b02e6a200041b02b6a200041b0256a103f200041b0316a" - "200041b02e6a200041b0136a103f200041b0346a200041b02e6a200041b0" - "1c6a103f200041b0376a200d200041b0346a103f200041b03a6a200041b0" - "316a41011047200041a00d6a200041f0326a41011047200042e6cfeba7bb" - "dee5b4243703e8492000428e97d490e19f9f99a67f3703e049200042e58f" - "bbf7f8cee4bcf4003703d849200042acc5cd87f88bbcae4a3703d0492000" - "42dfcf96c3c2e3adc2123703c849200042e0969ab7d7fbe7dc683703c049" - "200042f6c2bcc982c187a9dc003703b849200042f0c8a7e6adbbcd855637" - "03b049200041b0ce006a200041a00d6a200041b0c9006a102f200041f0ce" - "006a2210200041e00d6a220d200041b0c9006a102f200041b0cf006a2213" - "200041a00e6a2203200041b0c9006a102f200041f03b6a200041b0ce006a" - "41c001104c1a200041b03d6a200041b03a6a200041b0376a103f200041c8" - "0d6a22024200370300200041d00d6a22074200370300200041d80d6a220b" - "4200370300200042a9c0c689aece93b2303703b80d200042b099b385febc" - "f6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d200042c8faf3" - "83d69cd1de643703a00d200042003703c00d200041b0ce006a200041f02e" - "6a200041a00d6a102f2002420037030020074200370300200b4200370300" - "200042003703b80d200042ac97d286eaf99af1d9003703b00d200042cfb8" - "ede69afe98f9543703a80d200042feffffbf97e6d1b1d7003703a00d2000" - "42003703c00d200041b0ca006a200041b02f6a200041a00d6a102f200041" - "c0c9006a200041c02e6a290300370300200041c8c9006a200041c82e6a29" - "0300370300200041d0c9006a200041d02e6a290300370300200041d8c900" - "6a200041d82e6a290300370300200041e0c9006a200041e02e6a29030037" - "0300200041e8c9006a200041e82e6a290300370300200041f8c9006a2000" - "2903b84e37030020004180ca006a200041c0ce006a290300370300200041" - "88ca006a200041c8ce006a29030037030020004190ca006a200041d0ce00" - "6a29030037030020004198ca006a200041d8ce006a220629030037030020" - "0041a0ca006a200041e0ce006a2209290300370300200041a8ca006a2000" - "41e8ce006a2215290300370300200020002903b02e3703b0492000200029" - "03b82e3703b849200020002903b04e3703f0492002420037030020074200" - "370300200b4200370300200042a9c0c689aece93b2303703b80d200042b0" - "99b385febcf6b6de003703b00d200042bddcd9dcfbd3c1c7423703a80d20" - "0042c8faf383d69cd1de643703a00d200042003703c00d200041b0c6006a" - "200041b0306a200041a00d6a102f20064200370300200942003703002015" - "4200370300200042003703c84e200042ac97d286eaf99af1d9003703c04e" - "200042cfb8ede69afe98f9543703b84e200042feffffbf97e6d1b1d70037" - "03b04e200042003703d04e2003200041f0306a200041b0ce006a102f2000" - "41b00d6a220620004180306a290300370300200041b80d6a220920004188" - "306a290300370300200041c00d6a221520004190306a2903003703002002" - "20004198306a2903003703002007200041a0306a290300370300200b2000" - "41a8306a290300370300200041e80d6a20002903b846370300200041f00d" - "6a200041c0c6006a290300370300200041f80d6a200041c8c6006a290300" - "370300200041800e6a200041d0c6006a290300370300200041880e6a2000" - "41d8c6006a2202290300370300200041900e6a200041e0c6006a22072903" - "00370300200041980e6a200041e8c6006a220b2903003703002000200029" - "03f02f3703a00d2000200041f82f6a2903003703a80d200020002903b046" - "3703e00d2002420037030020074200370300200b4200370300200042a9c0" - "c689aece93b2303703c846200042b099b385febcf6b6de003703c0462000" - "42bddcd9dcfbd3c1c7423703b846200042c9faf383d69cd1de643703b046" - "200042003703d046200041b0ce006a200041a00d6a200041b0c6006a102f" - "2010200d200041b0c6006a102f20132003200041b0c6006a102f200041b0" - "c0006a200041b0c9006a41c001104c1a200041f0c1006a200041b0ce006a" - "41c001104c1a200041b0c3006a200041b0c0006a200041b03d6a103f2000" - "41f0c7006a200041e00b6a103e200041b0c6006a200041a00a6a41c00110" - "4c1a200041b0c9006a200041b0c6006a200041b0316a103f200041b0ce00" - "6a200041b0c9006a41031047200041a00d6a200041f0ca006a4103104720" - "0042f3fa9ddfe096fed5003703a84e2000429da7d8abb3dcfbe5063703a0" - "4e200042ecf3d0beb9bce981ff003703984e200042818283a6bfc5aacaf6" - "003703904e200042bbc98be4fcb9a0ee193703884e20004290d5b285cd91" - "d8f46f3703804e200042caa4d7f2dbf1aca6897f3703f84d200042ffccd2" - "f691a7dfb7683703f04d200041b0cc006a200041a00d6a200041f0cd006a" - "102f200041f0cc006a200d200041f0cd006a102f200041b0cd006a200320" - "0041f0cd006a102f2011200041b0cc006a41c001104c1a2006200041b0ce" - "006a200041b0c3006a103f2009290300215620002903b00d215520004190" - "076a201541f002104c1a20384184016a2103024002400240024002400240" - "0340200341046b280200220204402003280200220b41046b280200220741" - "7871220d200241c0016c220241044108200741037122071b72490d022007" - "4100200d20024127724b1b0d03200b10040b20034190016a210320464101" - "6b22460d000b200028025422030440203841046b28020022024178712207" - "20034190016c220341044108200241037122021b72490d03200241002007" - "200341276a4b1b0d04203810040b20002802482203450d0b200541046b28" - "0200220241787122072003410674220341044108200241037122021b7249" - "0d0420024100200720034127724b1b0d05200510040c0b0b41f996c00041" - "2e41a897c0001011000b41b897c000412e41e897c0001011000b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f4a2c000411f4194a3c0001021000b2018200341f4a1c0001010000b20" - "18200341e4a1c0001010000b203841046b28020022024178712207200341" - "90016c220341044108200241037122021b72490d02200241002007200341" - "276a4b1b0d03203810040b200028024822030440200541046b2802002202" - "41787122072003410674220341044108200241037122021b72490d042002" - "4100200720034127724b1b0d05200510040b42002156420121550b203120" - "5637030820312055370300203141106a20004190076a41f002104c1a2000" - "28023c22030440203341046b28020022024178712207200341c0016c2203" - "41044108200241037122021b72490d0520024100200720034127724b1b0d" - "06203310040b200028023022030440203b41046b28020022024178712207" - "200341e0006c220341044108200241037122021b72490d07200241002007" - "200341276a4b1b0d08203b10040b200041b0d1006a24000c080b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" - "000b41f996c000412e41a897c0001011000b41b897c000412e41e897c000" - "1011000b200141f0066a41f002104b1a200142003703e806200142013703" - "e006200141a00c6a200141e0066a104a0d03200141c00c6a20014180076a" - "104a0d03200141e00c6a200141a0076a104a0d03200141800d6a200141c0" - "076a104a0d03200141a00d6a200141e0076a104a0d03200141c00d6a2001" - "4180086a104a0d03200141e00d6a200141a0086a104a0d03200141800e6a" - "200141c0086a104a0d03200141a00e6a200141e0086a104a0d03200141c0" - "0e6a20014180096a104a0d03200141e00e6a200141a0096a104a0d032001" - "41800f6a200141c0096a104a1a0c030b2002450d05200641046b28020022" - "05417871221241044108200541037122051b20026a490d0c200541002012" - "200241276a4b1b0d0d200610040c050b20012802a00b2205450d04200820" - "05410674100e0c040b206a428080808010540d0020122005100e0b202041" - "c000100e2026450d0220352026410674100e0c020b4100410041dc91c000" - "1010000b20012802e01c1a0b205241046b2802002205417871220641c600" - "41ca00200541037122051b490d1420054100200641ea004f1b0d15205210" - "04201d41046b280200220541787141e40041e800200541037122061b490d" - "162006410020054188014f1b0d17201d1004200a41046b28020022054178" - "71221d418802418c02200541037122051b490d1820054100201d41ac024f" - "1b0d19200a1004200141c0206a240041010f0b000b230041206b22052400" - "200541003602182005410136020c200541a099c000360208200542043702" - "10200541086a41f88bc000101a000b41f996c000412e41a897c000101100" - "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" - "11000b41b897c000412e41e897c0001011000b41f996c000412e41a897c0" - "001011000b41b897c000412e41e897c0001011000b4120201241cc8fc000" - "1012000b418001201241dc8fc0001012000b41c001201241ec8fc0001012" - "000b41a002201241fc8fc0001012000b41a00241a002418c90c000101000" - "0b41a10241a102419c90c0001010000b41a20241a20241ac90c000101000" - "0b41a30241a30241bc90c0001010000b230041306b220224002002410436" - "0204200241643602002002410236020c200241b884c00036020820024202" - "3702142002200241046aad4280808080108437032820022002ad42808080" - "8010843703202002200241206a360210200241086a41cc90c000101a000b" - "2009201241cc90c0001012000b200120012d00a10f3a00e00641b89cc000" - "412b200141e0066a41988ec00041d892c0001013000b41a89cc000101400" - "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" - "11000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" - "001011000b41f996c000412e41a897c0001011000b41b897c000412e41e8" - "97c0001011000b962502087f017e02400240024002400240024002402000" - "41f4014d0440418ca9c000280200220341102000410b6a41f80371200041" - "0b491b220441037622017622004103710d0120044194a9c0002802004d0d" - "0720000d024190a9c00028020022000d030c070b2000410b6a2201417871" - "21044190a9c0002802002208450d06411f2107200041f4ffff074d044020" - "04410620014108766722006b7641017120004101746b413e6a21070b4100" - "20046b2101200741027441f4a5c0006a2802002203450440410021000c04" - "0b410021002004411920074101766b41002007411f471b74210503400240" - "200328020441787122062004490d00200620046b220620014f0d00200321" - "02200622010d0041002101200321000c060b200328021422062000200620" - "032005411d764104716a41106a2802002203471b200020061b2100200541" - "0174210520030d000b0c030b02402000417f7341017120016a2205410374" - "22004184a7c0006a22042000418ca7c0006a280200220128020822024704" - "402002200436020c200420023602080c010b418ca9c0002003417e200577" - "713602000b20012000410372360204200020016a22002000280204410172" - "360204200141086a0f0b0240200020017441022001742200410020006b72" - "7168220641037422014184a7c0006a22022001418ca7c0006a2802002200" - "28020822054704402005200236020c200220053602080c010b418ca9c000" - "2003417e200677713602000b20002004410372360204200020046a220520" - "0120046b2204410172360204200020016a20043602004194a9c000280200" - "2203044020034178714184a7c0006a2102419ca9c0002802002101027f41" - "8ca9c00028020022064101200341037674220371450440418ca9c0002003" - "20067236020020020c010b20022802080b21032002200136020820032001" - "36020c2001200236020c200120033602080b419ca9c00020053602004194" - "a9c0002004360200200041086a0f0b20006841027441f4a5c0006a280200" - "220228020441787120046b21012002210302400340024002402002280210" - "22000d00200228021422000d002003280218210702400240200320032802" - "0c2200460440200341144110200328021422001b6a28020022020d014100" - "21000c020b20032802082202200036020c200020023602080c010b200341" - "146a200341106a20001b21050340200521062002220041146a200041106a" - "200028021422021b210520004114411020021b6a28020022020d000b2006" - "41003602000b2007450d032003200328021c41027441f4a5c0006a220228" - "020047044020074110411420072802102003461b6a20003602002000450d" - "040c020b2002200036020020000d014190a9c0004190a9c000280200417e" - "200328021c77713602000c030b200028020441787120046b220220012001" - "20024b22021b21012000200320021b2103200021020c010b0b2000200736" - "021820032802102202044020002002360210200220003602180b20032802" - "142202450d0020002002360214200220003602180b02400240200141104f" - "044020032004410372360204200320046a22042001410172360204200120" - "046a20013602004194a9c0002802002205450d0120054178714184a7c000" - "6a2102419ca9c0002802002100027f418ca9c00028020022064101200541" - "037674220571450440418ca9c000200520067236020020020c010b200228" - "02080b2105200220003602082005200036020c2000200236020c20002005" - "3602080c010b2003200120046a2200410372360204200020036a22002000" - "2802044101723602040c010b419ca9c00020043602004194a9c000200136" - "02000b200341086a0f0b2000200272450440410021024102200774220041" - "0020006b722008712200450d0320006841027441f4a5c0006a2802002100" - "0b2000450d010b03402002200020022000280204417871220320046b2206" - "20014922071b200320044922051b210220012006200120071b20051b2101" - "20002802102203047f20030520002802140b22000d000b0b2002450d0020" - "044194a9c00028020022004d2001200020046b4f710d0020022802182107" - "024002402002200228020c2200460440200241144110200228021422001b" - "6a28020022030d01410021000c020b20022802082203200036020c200020" - "033602080c010b200241146a200241106a20001b21050340200521062003" - "220041146a200041106a200028021422031b210520004114411020031b6a" - "28020022030d000b200641003602000b02402007450d0002402002200228" - "021c41027441f4a5c0006a22032802004704402007411041142007280210" - "2002461b6a20003602002000450d020c010b2003200036020020000d0041" - "90a9c0004190a9c000280200417e200228021c77713602000c010b200020" - "0736021820022802102203044020002003360210200320003602180b2002" - "2802142203450d0020002003360214200320003602180b0240200141104f" - "044020022004410372360204200220046a22042001410172360204200120" - "046a200136020020014180024f0440411f210020044200370210200141ff" - "ffff074d04402001410620014108766722006b7641017120004101746b41" - "3e6a21000b2004200036021c200041027441f4a5c0006a21034101200074" - "22054190a9c0002802007145044020032004360200200420033602182004" - "200436020c200420043602084190a9c0004190a9c0002802002005723602" - "000c030b0240024020012003280200220528020441787146044020052100" - "0c010b2001411920004101766b41002000411f471b742103034020052003" - "411d764104716a41106a22062802002200450d0220034101742103200021" - "0520002802044178712001470d000b0b20002802082201200436020c2000" - "2004360208200441003602182004200036020c200420013602080c030b20" - "062004360200200420053602182004200436020c200420043602080c020b" - "200141f801714184a7c0006a2100027f418ca9c000280200220341012001" - "41037674220171450440418ca9c000200120037236020020000c010b2000" - "2802080b2101200020043602082001200436020c2004200036020c200420" - "013602080c010b2002200120046a2200410372360204200020026a220020" - "002802044101723602040b200241086a0f0b024002400240024002400240" - "20044194a9c00028020022004b044020044198a9c00028020022004f0440" - "41002100200441af80046a220241107640002201417f4622050d07200141" - "10742203450d0741a4a9c000410020024180807c7120051b220641a4a9c0" - "002802006a220036020041a8a9c00041a8a9c00028020022012000200020" - "01491b3602000240024041a0a9c0002802002201044041f4a6c000210003" - "4020002802002202200028020422056a2003460d02200028020822000d00" - "0b0c020b41b0a9c00028020022004100200020034d1b45044041b0a9c000" - "20033602000b41b4a9c00041ff1f36020041f8a6c000200636020041f4a6" - "c00020033602004190a7c0004184a7c0003602004198a7c000418ca7c000" - "360200418ca7c0004184a7c00036020041a0a7c0004194a7c00036020041" - "94a7c000418ca7c00036020041a8a7c000419ca7c000360200419ca7c000" - "4194a7c00036020041b0a7c00041a4a7c00036020041a4a7c000419ca7c0" - "0036020041b8a7c00041aca7c00036020041aca7c00041a4a7c000360200" - "41c0a7c00041b4a7c00036020041b4a7c00041aca7c00036020041c8a7c0" - "0041bca7c00036020041bca7c00041b4a7c0003602004180a7c000410036" - "020041d0a7c00041c4a7c00036020041c4a7c00041bca7c00036020041cc" - "a7c00041c4a7c00036020041d8a7c00041cca7c00036020041d4a7c00041" - "cca7c00036020041e0a7c00041d4a7c00036020041dca7c00041d4a7c000" - "36020041e8a7c00041dca7c00036020041e4a7c00041dca7c00036020041" - "f0a7c00041e4a7c00036020041eca7c00041e4a7c00036020041f8a7c000" - "41eca7c00036020041f4a7c00041eca7c0003602004180a8c00041f4a7c0" - "0036020041fca7c00041f4a7c0003602004188a8c00041fca7c000360200" - "4184a8c00041fca7c0003602004190a8c0004184a8c0003602004198a8c0" - "00418ca8c000360200418ca8c0004184a8c00036020041a0a8c0004194a8" - "c0003602004194a8c000418ca8c00036020041a8a8c000419ca8c0003602" - "00419ca8c0004194a8c00036020041b0a8c00041a4a8c00036020041a4a8" - "c000419ca8c00036020041b8a8c00041aca8c00036020041aca8c00041a4" - "a8c00036020041c0a8c00041b4a8c00036020041b4a8c00041aca8c00036" - "020041c8a8c00041bca8c00036020041bca8c00041b4a8c00036020041d0" - "a8c00041c4a8c00036020041c4a8c00041bca8c00036020041d8a8c00041" - "cca8c00036020041cca8c00041c4a8c00036020041e0a8c00041d4a8c000" - "36020041d4a8c00041cca8c00036020041e8a8c00041dca8c00036020041" - "dca8c00041d4a8c00036020041f0a8c00041e4a8c00036020041e4a8c000" - "41dca8c00036020041f8a8c00041eca8c00036020041eca8c00041e4a8c0" - "003602004180a9c00041f4a8c00036020041f4a8c00041eca8c000360200" - "4188a9c00041fca8c00036020041fca8c00041f4a8c00036020041a0a9c0" - "0020033602004184a9c00041fca8c0003602004198a9c000200641286b22" - "0036020020032000410172360204200020036a412836020441aca9c00041" - "808080013602000c080b200120034f0d0020012002490d00200028020c45" - "0d030b41b0a9c00041b0a9c0002802002200200320002003491b36020020" - "0320066a210241f4a6c00021000240024003402002200028020022054704" - "40200028020822000d010c020b0b200028020c450d010b41f4a6c0002100" - "034002402001200028020022024f04402001200220002802046a2202490d" - "010b200028020821000c010b0b41a0a9c00020033602004198a9c0002006" - "41286b220036020020032000410172360204200020036a412836020441ac" - "a9c00041808080013602002001200241206b41787141086b220020002001" - "41106a491b2205411b36020441f4a6c0002902002109200541106a41fca6" - "c0002902003702002005200937020841f8a6c000200636020041f4a6c000" - "200336020041fca6c000200541086a3602004180a7c00041003602002005" - "411c6a2100034020004107360200200041046a22002002490d000b200120" - "05460d0720052005280204417e713602042001200520016b220041017236" - "02042005200036020020004180024f04402001200010350c080b200041f8" - "01714184a7c0006a2102027f418ca9c00028020022034101200041037674" - "220071450440418ca9c000200020037236020020020c010b20022802080b" - "2100200220013602082000200136020c2001200236020c20012000360208" - "0c070b200020033602002000200028020420066a36020420032004410372" - "3602042005410f6a41787141086b2202200320046a22006b2101200241a0" - "a9c000280200460d032002419ca9c000280200460d042002280204220441" - "037141014604402002200441787122041016200120046a2101200220046a" - "220228020421040b20022004417e71360204200020014101723602042000" - "20016a200136020020014180024f04402000200110350c060b200141f801" - "714184a7c0006a2104027f418ca9c0002802002202410120014103767422" - "0171450440418ca9c000200120027236020020040c010b20042802080b21" - "01200420003602082001200036020c2000200436020c200020013602080c" - "050b4198a9c000200020046b220136020041a0a9c00041a0a9c000280200" - "220020046a22023602002002200141017236020420002004410372360204" - "200041086a21000c060b419ca9c00028020021010240200020046b220241" - "0f4d0440419ca9c00041003602004194a9c0004100360200200120004103" - "72360204200020016a220020002802044101723602040c010b4194a9c000" - "2002360200419ca9c000200120046a220336020020032002410172360204" - "200020016a2002360200200120044103723602040b200141086a0f0b2000" - "200520066a36020441a0a9c00041a0a9c0002802002200410f6a41787122" - "0141086b22023602004198a9c000200020016b4198a9c00028020020066a" - "22016a41086a220336020020022003410172360204200020016a41283602" - "0441aca9c00041808080013602000c030b41a0a9c00020003602004198a9" - "c0004198a9c00028020020016a2201360200200020014101723602040c01" - "0b419ca9c00020003602004194a9c0004194a9c00028020020016a220136" - "020020002001410172360204200020016a20013602000b200341086a0f0b" - "410021004198a9c000280200220120044d0d004198a9c000200120046b22" - "0136020041a0a9c00041a0a9c000280200220020046a2202360200200220" - "0141017236020420002004410372360204200041086a0f0b20000bc60602" - "037f037e230041a0026b22032400200341286a41c100104b210420034118" - "6a41f08bc000290300370300200341106a41e88bc0002903003703002003" - "41086a41e08bc00029030037030020034200370320200341d88bc0002903" - "003703000240200241c0004f0440200320024106762205ad370320200320" - "01200510272004200120024140716a2002413f712202104c1a0c010b2004" - "20012002104c1a0b200320023a0068200341f0006a200341f000104c1a20" - "034198016a220120032d00d80122026a22044180013a00002002ad220742" - "3b862003290390012206420986220820074203868422074280fe03834228" - "86842007428080fc0783421886200742808080f80f834208868484200642" - "018642808080f80f832006420f88428080fc0783842006421f884280fe03" - "8320084238888484842106024002402002413f470440200441016a200241" - "3f73104b1a200241387341074b0d010b200341f0006a2001410110272003" - "4190026a420037030020034188026a420037030020034180026a42003703" - "00200341f8016a4200370300200341f0016a4200370300200341e8016a42" - "00370300200342003703e0012003200637039802200341f0006a200341e0" - "016a410110270c010b200320063703d001200341f0006a2001410110270b" - "2000200328028c01220241187420024180fe037141087472200241087641" - "80fe03712002411876727236001c20002003280288012202411874200241" - "80fe03714108747220024108764180fe0371200241187672723600182000" - "200328028401220241187420024180fe03714108747220024108764180fe" - "0371200241187672723600142000200328028001220241187420024180fe" - "03714108747220024108764180fe03712002411876727236001020002003" - "28027c220241187420024180fe03714108747220024108764180fe037120" - "02411876727236000c20002003280278220241187420024180fe03714108" - "747220024108764180fe0371200241187672723600082000200328027422" - "0241187420024180fe03714108747220024108764180fe03712002411876" - "727236000420002003280270220241187420024180fe0371410874722002" - "4108764180fe037120024118767272360000200341a0026a24000bee0201" - "077f024020012802042202450440410021020c010b200128021021062001" - "200220022001280208220320022003491b22046b36020420012001280200" - "220720046a360200027f0240024002400240027f02400240024020030440" - "200128020c2208410174210520072d0000220241c1006b41ff0171410649" - "0d01200241e1006b41ff01714106490d02200241306b220341ff0171410a" - "490d0320050c040b4100410041848bc0001010000b200241376b21030c01" - "0b200241d7006b21030b20044101460d0320072d0001220241c1006b41ff" - "01714106490d01200241e1006b41ff01714106490d02200241306b220441" - "ff0171410a490d0420054101720b21032006200241ff0171360200200620" - "0541807e71200341ff01717236020441000c040b200241376b21040c020b" - "200241d7006b21040c010b4101410141948bc0001010000b200420034104" - "7472210341010b21022001200841016a36020c0b200020033a0001200020" - "023a00000bb40801057f200041086b2201200041046b2802002203417871" - "22006a21020240024020034101710d002003410271450d01200128020022" - "0320006a2100200120036b2201419ca9c000280200460440200228020441" - "03714103470d014194a9c000200036020020022002280204417e71360204" - "20012000410172360204200220003602000f0b2001200310160b02400240" - "0240024002400240024020022802042203410271450440200241a0a9c000" - "280200460d022002419ca9c000280200460d032002200341787122031016" - "2001200020036a2200410172360204200020016a20003602002001419ca9" - "c000280200470d014194a9c00020003602000f0b20022003417e71360204" - "20012000410172360204200020016a20003602000b2000418002490d0241" - "1f210220014200370210200041ffffff074d044020004106200041087667" - "22026b7641017120024101746b413e6a21020b2001200236021c20024102" - "7441f4a5c0006a2103410120027422044190a9c000280200710d03200320" - "01360200200120033602182001200136020c200120013602084190a9c000" - "4190a9c0002802002004723602000c040b41a0a9c00020013602004198a9" - "c0004198a9c00028020020006a220036020020012000410172360204419c" - "a9c00028020020014604404194a9c0004100360200419ca9c00041003602" - "000b200041aca9c00028020022044d0d0541a0a9c0002802002200450d05" - "410021034198a9c00028020022054129490d0441f4a6c000210103402000" - "200128020022024f04402000200220012802046a490d060b200128020821" - "010c000b000b419ca9c00020013602004194a9c0004194a9c00028020020" - "006a220036020020012000410172360204200020016a20003602000f0b20" - "0041f801714184a7c0006a2102027f418ca9c00028020022034101200041" - "037674220071450440418ca9c000200020037236020020020c010b200228" - "02080b2100200220013602082000200136020c2001200236020c20012000" - "3602080f0b02400240200020032802002204280204417871460440200421" - "020c010b2000411920024101766b41002002411f471b7421030340200420" - "03411d764104716a41106a22052802002202450d02200341017421032002" - "210420022802044178712000470d000b0b20022802082200200136020c20" - "022001360208200141003602182001200236020c200120003602080c010b" - "20052001360200200120043602182001200136020c200120013602080b41" - "00210141b4a9c00041b4a9c00028020041016b220036020020000d0141fc" - "a6c000280200220004400340200141016a2101200028020822000d000b0b" - "41b4a9c00041ff1f2001200141ff1f4d1b3602000f0b41fca6c000280200" - "220104400340200341016a2103200128020822010d000b0b41b4a9c00041" - "ff1f2003200341ff1f4d1b360200200420054f0d0041aca9c000417f3602" - "000b0b810802077f067e230041c0026b2203240020034198026a20024118" - "6a290300220a37030020034190026a200241106a290300220d3703002003" - "200241086a290300220b3703880220032002290300220c3703800242ddb0" - "858ce8b691a8b87f210e20034180026a200c200b200d200a42c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f102b200341b0026a2204200141106a" - "290300220a370300200341b8026a2205200141186a290300220d37030020" - "032001290300220b3703a0022003200141086a290300220c3703a8022003" - "41a0026a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200341a0026a200b200c200a200d42c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b02400240024020032903a002220a42037c22" - "0c200a54ad220a20032903a8027c220b200a54ad220a20042903007c220d" - "42ddb0858ce8b691a8b87f852005290300200a200d56ad7c220a42a9c0c6" - "89aece93b2308584500440200c42c7faf3c3ed82a3903c54200b428d95c7" - "c396d2dac0977f54200b428d95c7c396d2dac0977f511b450d0242a9c0c6" - "89aece93b230210a0c010b200d42deb0858ce8b691a8b87f54200a42a9c0" - "c689aece93b23054200a42a9c0c689aece93b230511b450d01200d210e0b" - "200c210f200b210c0c010b200a200d200b200c42c7faf3c3ed82a3903c7d" - "220f200c5aad220e7d220a42f3eab8bce9ada5bfe8007c220c200a54ad20" - "0b200e54ad7d7c220b200d54ad200b42a2cffaf397c9eed7c7007c220e20" - "0b54ad7c50ad7d42a9c0c689aece93b2307d210a0b2003200e3703b00120" - "03200f3703a0012003200a3703b8012003200c3703a8012000027f200341" - "80026a200341a0016a104a45044020034180016a22042002290300370100" - "20034198016a2205200241186a29030037010020034190016a2206200241" - "106a29030037010020034188016a2207200241086a290300370100200341" - "f8006a2202200141186a290300370100200341f0006a2208200141106a29" - "0300370100200341e8006a2209200141086a290300370100200320012903" - "00370160200341ca006a22012005290100370100200341c2006a22052006" - "2901003701002003413a6a22062007290100370100200341326a22072004" - "2901003701002003412a6a22042002290100370100200341226a22022008" - "2901003701002003411a6a22082009290100370100200320032901603701" - "12200041c8006a2001290100370100200041406b20052901003701002000" - "41386a2006290100370100200041306a2007290100370100200041286a20" - "04290100370100200041206a2002290100370100200041186a2008290100" - "3701002000200329011237011041000c010b200041003a000141010b3a00" - "00200341c0026a24000baa0401047e2001290010220242388620024280fe" - "0383422886842002428080fc0783421886200242808080f80f8342088684" - "84200242088842808080f80f832002421888428080fc0783842002422888" - "4280fe038320024238888484842104200141186a29000022024238862002" - "4280fe0383422886842002428080fc0783421886200242808080f80f8342" - "08868484200242088842808080f80f832002421888428080fc0783842002" - "4228884280fe0383200242388884848421050240417f2001290000220242" - "b0c8b99297bc8cd02985200141086a290000220342b8a195b29bb0a0acdd" - "008584420052200342388620034280fe0383422886842003428080fc0783" - "421886200342808080f80f834208868484200342088842808080f80f8320" - "03421888428080fc07838420034228884280fe0383200342388884848422" - "0342ddb0858ce8b691a8b87f54200242388620024280fe03834228868420" - "02428080fc0783421886200242808080f80f834208868484200242088842" - "808080f80f832002421888428080fc07838420024228884280fe03832002" - "423888848484220242a9c0c689aece93b23054200242a9c0c689aece93b2" - "30511b1b2201417f470440200141ff01710d01200542c6faf3c3ed82a390" - "3c562004428d95c7c396d2dac0977f562004428d95c7c396d2dac0977f51" - "1b0d010b2000200337032020002005370310200020023703282000200437" - "0318200041003a00000f0b200041023a0001200041013a00000bb40c0204" - "7f027e230041d0066b2203240020034188036a200241386a290300370300" - "20034180036a200241306a290300370300200341f8026a200241286a2903" - "00370300200341f0026a2204200241206a290300370300200341e8026a20" - "0241186a290300370300200341e0026a200241106a290300370300200320" - "022903003703d0022003200241086a2903003703d802200341d0026a2002" - "2002102f200341a0036a200141106a290300370300200341a8036a200141" - "186a290300370300200341b0036a200141206a290300370300200341b803" - "6a200141286a290300370300200341c0036a200141306a29030037030020" - "0341c8036a200141386a2903003703002003200129030037039003200320" - "0141086a2903003703980320034190036a20012001102f200341d0006a20" - "034190036a2001102f200342d4fdc3d783f6c4cb003703c805200342f4fb" - "e3f6def5ab964d3703c005200342d2b0b4a9ce90e8a7a77f3703b8052003" - "42d2ab8caee8a0afd1643703b005200342aed5e2f58ca8a78a2b3703a805" - "200342c3d581df919386df817f3703a005200342a3dfefced5bcb1dab57f" - "37039805200342e5f184a5c2dbf9b33237039005200341106a200341d000" - "6a20034190056a103002400240200341d0026a200341106a104a45044020" - "04200341306a104a450d010b200041013b01000c010b200341c8026a4200" - "370300200341c0026a4200370300200341b8026a4200370300200341b002" - "6a4200370300200341a8026a4200370300200341a0016a200141106a2903" - "00370300200341a8016a200141186a290300370300200341b0016a200141" - "206a290300370300200341b8016a200141286a290300370300200341c001" - "6a200141306a290300370300200341c8016a200141386a29030037030020" - "0342003703a00220032001290300370390012003200141086a2903003703" - "980120034188026a200241386a29030037030020034180026a200241306a" - "290300370300200341f8016a200241286a290300370300200341f0016a20" - "0241206a290300370300200341e8016a200241186a290300370300200341" - "e0016a200241106a290300370300200341d8016a200241086a2903003703" - "0020034201370390022003420037039802200320022903003703d0012003" - "41e0036a4200370300200341e8036a4200370300200341f0036a42003703" - "00200341f8036a420037030020034180046a420037030020034188046a42" - "00370300200342003703d003200342003703d803200342a9c0c689aece93" - "b230370368200342ddb0858ce8b691a8b87f37036020034291e1e5cd8789" - "fa992837035820034280808080bfb2fdf0c300370350200341a0046a41f0" - "00104b1a2003420037039804200342013703900441ff0121040340200320" - "0441ff0071104f200341086a290300200341d0006a200441037641f0ffff" - "ff01716a2206290308832107200329030020062903008321082005044020" - "034190056a200341d0036a1043200341d0036a20034190056a41c001104c" - "1a0b2007200884420052044020034190056a200341d0036a20034190016a" - "1044200341d0036a20034190056a41c001104c1a410121050b200441016b" - "2204417f470d000b20034190056a200341d0036a20034190016a10440240" - "20032903900620034198066a290300844200520d0020032903a006200341" - "a8066a290300844200520d0020032903b006200341b8066a290300844200" - "520d0020032903c006200341c8066a290300844200520d00200341c8056a" - "200141386a290300370300200341c0056a200141306a2903003703002003" - "41b8056a200141286a290300370300200341b0056a200141206a29030037" - "0300200341a8056a200141186a290300370300200341a0056a200141106a" - "290300370300200341d8056a200241086a290300370300200341e0056a20" - "0241106a290300370300200341e8056a200241186a290300370300200341" - "f0056a200241206a290300370300200341f8056a200241286a2903003703" - "0020034180066a200241306a29030037030020034188066a200241386a29" - "03003703002003200129030037039005200320022903003703d005200320" - "0141086a29030037039805200041106a20034190056a418001104c1a2000" - "41003a00000c010b20004181023b01000b200341d0066a24000ba8150207" - "7f137e230041a0016b22022400200241106a2001102a20022d0011210620" - "022d001021072000027f024020022d0030220841c101470440200235011a" - "2109200233011e210a2002290112211620022903202114200241d8006a22" - "01200241286a29030022173703002002201437035020022009200a422086" - "842219421086201642308884220937034820022007ad42ff018320164210" - "862006ad42ff01834208868484220a37034042ddb0858ce8b691a8b87f21" - "0f200241406b200a20092014201742c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b200241406b200a20092014201742c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b0240024002402002290340220942037c22" - "0b200954ad220920022903487c220a200954ad220c20022903507c220942" - "ddb0858ce8b691a8b87f8520012903002009200c54ad7c220e42a9c0c689" - "aece93b2308584500440200b42c7faf3c3ed82a3903c54200a428d95c7c3" - "96d2dac0977f54200a428d95c7c396d2dac0977f511b450d0242a9c0c689" - "aece93b230210e0c010b200942deb0858ce8b691a8b87f54200e42a9c0c6" - "89aece93b23054200e42a9c0c689aece93b230511b450d012009210f0b20" - "0b2110200a210d0c010b200e2009200a200b42c7faf3c3ed82a3903c7d22" - "10200b5aad220b7d220c42f3eab8bce9ada5bfe8007c220d200c54ad200a" - "200b54ad7d7c220a200954ad200a42a2cffaf397c9eed7c7007c220f200a" - "54ad7c50ad7d42a9c0c689aece93b2307d210e0b4190aac0002d00004102" - "470440230041e0006b220324004190aac0004190aac0002d000022044101" - "20041b3a00000240200404400340024002400240200441ff017141016b0e" - "03000501020b03404190aac0002d000022044101460d000b024002402004" - "41016b0e03000601030b000b41a49bc000412641cc9bc0001011000b41a8" - "9ac000410d41949bc0001011000b4190aac0004190aac0002d0000220441" - "0120041b3a000020040d000b0b200341186a220442a9c0c689aece93b230" - "370300200341106a220542ddb0858ce8b691a8b87f3703002003428d95c7" - "c396d2dac0977f370308200342c4faf3c3ed82a3903c370300200341386a" - "220142003703002003420037033020034200370328200342043703202003" - "42a9c0c689aece93b230370358200342ddb0858ce8b691a8b87f37035020" - "03428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3903c370340" - "200341206a200341406b103a200320032903202003290328200329033020" - "0129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b4190aa" - "c00041023a00004188aac00020042903003703004180aac0002005290300" - "37030041f8a9c000200329030837030041f0a9c00020032903003703000b" - "200341e0006a24000b20024198016a4188aac00029030037030020024190" - "016a4180aac000290300370300200241f8a9c00029030037038801200241" - "f0a9c00029030037038001420021094201210a41ff0121014200210b4200" - "210c0340200220024180016a200141037641f0ffffff01716a2205290300" - "2005290308200141ff0071104e200241286a2205200b3703002002200937" - "03202002200c3703182002200a370310200241106a200a200c2009200b42" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2005290300210b20" - "0229032021092002290318210c2002290310210a20022802004101710440" - "2005200b370300200220093703202002200a3703102002200c3703182002" - "41106a2010200d200f200e42c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f102b2005290300210b2002290318210c200229032021092002290310" - "210a0b200141016b2201417f470d000b200241286a2201200b3703002002" - "20093703202002200c3703182002200a370310200241106a2010200d200f" - "200e42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200b37" - "0378200220093703702002200c3703682002200a370360200241e0006a20" - "02290310220e2002290318220b2002290320220c2001290300220a42c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f102b41e0a9c0002d00004102" - "470440102c0b20024198016a41d8a9c00029030037030020024190016a41" - "d0a9c000290300370300200241c8a9c00029030037038801200241c0a9c0" - "002903003703800141e0a9c0002d00004102470440102c0b20024180016a" - "420142004200420041c0a9c00029030041c8a9c00029030041d0a9c00029" - "030041d8a9c000290300102d2002290388012110200229038001210d0240" - "0240417f200229039001220f42ddb0858ce8b691a8b87f8520024198016a" - "290300220942a9c0c689aece93b2308584420052200f42ddb0858ce8b691" - "a8b87f54200942a9c0c689aece93b23054200942a9c0c689aece93b23051" - "1b1b2201417f470440200141ff01710d01200d42c7faf3c3ed82a3903c54" - "2010428d95c7c396d2dac0977f542010428d95c7c396d2dac0977f511b45" - "0d010b2002200f3703202002200d37031020022009370328200220103703" - "18027e0240200241e0006a200241106a104a0440420021104200210f4200" - "2109200c200e84200a200b8484420052044042c7faf3c3ed82a3903c200e" - "7d2115427f4200427f4200200e42788342c7faf3c3ed82a3903c561b2209" - "2009200b54ad7d2009200b7d220942f3eab8bce9ada5bfe8007d22102009" - "54ad7c42017c2209200c7d220d42a4cffaf397c9eed7c7007d220f200d54" - "ad2009200c54ad7d427f511b200a7d42a9c0c689aece93b2307c21090b20" - "0e201554200b201054200b2010511b200c200f542009200a562009200a51" - "1b200c200f852009200a8584221b501b4101460d0120152111200f211220" - "09210d200e211a200b2118200c210f200a210920100c020b200041033a00" - "010c050b200e2111200c2112200a210d2015211a20102118200b0b211302" - "40024002400240417f201b420052200f2012562009200d562009200d511b" - "1b2201047f2001052011201a54201320185420132018511b0d01200e2015" - "85200b201085844200520b4101460d010b200841c001470d014200210942" - "00210a4200210b4200210c2011201284200d20138484500d04427f420042" - "7f4200201142788342c7faf3c3ed82a3903c561b22092009201354ad7d20" - "0920137d220942f3eab8bce9ada5bfe8007d220a200954ad7c42017c2209" - "20127d220c42a4cffaf397c9eed7c7007d220b200c54ad2009201254ad7d" - "427f511b200d7d42a9c0c689aece93b2307c210c42c7faf3c3ed82a3903c" - "20117d21090c040b2008418001460d010b201121092013210a2012210b20" - "0d210c0c020b420021094200210a4200210b4200210c2011201284200d20" - "138484500d01427f4200427f4200201142788342c7faf3c3ed82a3903c56" - "1b22092009201354ad7d200920137d220942f3eab8bce9ada5bfe8007d22" - "0a200954ad7c42017c220920127d220c42a4cffaf397c9eed7c7007d220b" - "200c54ad2009201254ad7d427f511b200d7d42a9c0c689aece93b2307c21" - "0c42c7faf3c3ed82a3903c20117d21090c010b41e09dc0001020000b2000" - "2014370320200020163701122000200b3703402000200937033020002006" - "3a0011200020073a0010200020193e011a200020173703282000200c3703" - "482000200a3703382000411e6a20194220883d010041000c020b20002006" - "3a0002200020073a00010b41010b3a0000200241a0016a24000ba02f0208" - "7f187e230041c0086b22022400200241f0046a2001102a20022d00f10421" - "0620022d00f0042107024002400240024020022d009005220941c1014704" - "4020024198016a220520022901fa04370300200241a6016a220420024188" - "056a2203290100370100200241a0016a220820024182056a290100370300" - "200220022901f20437039001200241f0046a200141206a102e20022d00f0" - "04450440200241d5076a2003290300220c37000020024188016a20024198" - "056a290300220b37030020024180016a20024190056a290300220a370300" - "200241c8006a200b370300200241406b200a370300200220022903800522" - "0b3703702002200c3703782002200b3703302002200c370338200220063a" - "0051200220073a0050200241e8006a22012004290100370100200241e200" - "6a2008290300370100200241da006a200529030037010020022002290390" - "01370152200941c000460d0220024180026a200241406b29030037030020" - "024188026a200241c8006a29030037030020024190026a200241d0006a29" - "030037030020024198026a200241d8006a290300370300200241a0026a20" - "0241e0006a290300370300200241a8026a20012903003703002002200229" - "03303703f001200220022903383703f801200241f0016a200241306a2002" - "41306a102f20024180086a200241f0016a200241306a102f200242d4fdc3" - "d783f6c4cb003703a805200242f4fbe3f6def5ab964d3703a005200242d2" - "b0b4a9ce90e8a7a77f37039805200242d2ab8caee8a0afd1643703900520" - "0242aed5e2f58ca8a78a2b37038805200242c3d581df919386df817f3703" - "8005200242a3dfefced5bcb1dab57f3703f804200242e5f184a5c2dbf9b3" - "323703f004200241b0016a20024180086a200241f0046a103041f0aac000" - "2d00004102470440230041e0006b2203240041f0aac00041f0aac0002d00" - "002204410120041b3a00000240200404400340024002400240200441ff01" - "7141016b0e03000501020b034041f0aac0002d000022044101460d000b02" - "400240200441016b0e03000601030b000b41a49bc000412641cc9bc00010" - "11000b41a89ac000410d41949bc0001011000b41f0aac00041f0aac0002d" - "00002204410120041b3a000020040d000b0b200341186a220442a9c0c689" - "aece93b230370300200341106a220842ddb0858ce8b691a8b87f37030020" - "03428d95c7c396d2dac0977f370308200342c4faf3c3ed82a3903c370300" - "200341386a22014200370300200342003703302003420037032820034204" - "370320200342a9c0c689aece93b230370358200342ddb0858ce8b691a8b8" - "7f3703502003428d95c7c396d2dac0977f370348200342c7faf3c3ed82a3" - "903c370340200341206a200341406b103a20032003290320200329032820" - "03290330200129030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b41f0aac00041023a000041e8aac000200429030037030041e0aac000" - "200829030037030041d8aac000200329030837030041d0aac00020032903" - "003703000b200341e0006a24000b200241c8046a41e8aac0002903003703" - "00200241c0046a41e0aac000290300370300200241d8aac0002903003703" - "b804200241d0aac0002903003703b0044200210c4201210b41ff01210120" - "0241a8076a2104200241b8076a21034200210a0340200241206a200241b0" - "046a200141037641f0ffffff01716a22052903002005290308200141ff00" - "71104e2002200a3703f8072002200c3703f0072002200f3703e807200220" - "0e3703e0072002200d3703d807200220103703d007200220113703c80720" - "02200b3703c0072002200a3703b8082002200c3703b0082002200f3703a8" - "082002200e3703a0082002200d3703980820022010370390082002201137" - "0388082002200b370380082002280220210520024180076a200241c0076a" - "20024180086a102f20024198076a290300210d2004290300210f20032903" - "00210a2002290388072111200229038007210b2002290390072110200229" - "03a007210e20022903b007210c200541017104402002200a3703b8082002" - "200c3703b0082002200f3703a8082002200e3703a0082002200d37039808" - "200220103703900820022011370388082002200b37038008200241c0076a" - "20024180086a200241b0016a102f200241e8076a290300210f200241f807" - "6a290300210a20022903c007210b20022903d007211020022903e007210e" - "20022903f007210c20022903c8072111200241d8076a290300210d0b2001" - "41016b2201417f470d000b2002200c3703e0022002200e3703d002200220" - "103703c0022002200b3703b0022002200a3703e8022002200f3703d80220" - "02200d3703c802200220113703b802200241f0026a200241b0026a200241" - "b0016a102f200241b0036a200241b0026a200241f0026a102f41c0aac000" - "2d0000410247044041c0aac00041c0aac0002d00002201410120011b3a00" - "000240200104400340024002400240200141016b0e03000501020b034041" - "c0aac0002d000022014101460d000b02400240200141016b0e0300060103" - "0b000b41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0" - "001011000b41c0aac00041c0aac0002d00002201410120011b3a00002001" - "0d000b0b41b8aac00042a9c0c689aece93b23037030041b0aac00042ddb0" - "858ce8b691a8b87f37030041a8aac000428d95c7c396d2dac0977f370300" - "41a0aac00042c7faf3c3ed82a3903c37030041c0aac00041023a00000b0b" - "200241d8066a41b8aac000290300370300200241d0066a41b0aac0002903" - "00370300200241a8aac0002903003703c806200241a0aac0002903003703" - "c0064200210c4201210b41ff012101200241a8076a2104200241b8076a21" - "034200210a4200210e4200210f420021104200210d420021110340200241" - "106a200241c0066a200141037641f0ffffff01716a220529030020052903" - "08200141ff0071104e2002200a3703f8072002200c3703f0072002200f37" - "03e8072002200e3703e0072002200d3703d807200220103703d007200220" - "113703c8072002200b3703c0072002200a3703b8082002200c3703b00820" - "02200f3703a8082002200e3703a0082002200d3703980820022010370390" - "0820022011370388082002200b370380082002280210210520024180076a" - "200241c0076a20024180086a102f20024198076a290300210d2004290300" - "210f2003290300210a2002290388072111200229038007210b2002290390" - "07211020022903a007210e20022903b007210c200541017104402002200a" - "3703b8082002200c3703b0082002200f3703a8082002200e3703a0082002" - "200d37039808200220103703900820022011370388082002200b37038008" - "200241c0076a20024180086a200241b0036a102f200241e8076a29030021" - "0f200241f8076a290300210a20022903c007210b20022903d00721102002" - "2903e007210e20022903f007210c20022903c8072111200241d8076a2903" - "00210d0b200141016b2201417f470d000b2002200c3703b0082002200e37" - "03a00820022010370390082002200b370380082002200a3703b808200220" - "0f3703a8082002200d370398082002201137038808200241f0036a200241" - "80086a200241b0036a102f200241a8086a22014200370300200241b0086a" - "22054200370300200241b8086a22044200370300200242a9c0c689aece93" - "b23037039808200242ddb0858ce8b691a8b87f370390082002428d95c7c3" - "96d2dac0977f37038808200242c6faf3c3ed82a3903c3703800820024200" - "3703a008200241a0086a21030240200241f0036a20024180086a104a4504" - "4020024190046a2003104a450d010b200142003703002005420037030020" - "044200370300200242a9c0c689aece93b23037039808200242ddb0858ce8" - "b691a8b87f370390082002428d95c7c396d2dac0977f37038808200242c6" - "faf3c3ed82a3903c37038008200242003703a008200241b0036a20024180" - "086a104a450440200241d0036a2003104a450d050b4200210c2002419808" - "6a4200370300200241a0086a4200370300200241a8086a42003703002002" - "41b0086a4200370300200241b8086a420037030020024200370388084201" - "210b20024201370380082002420037039008200241c0066a200241b0036a" - "20024180086a103041a0abc0002d00004102470440230041e0006b220324" - "0041a0abc00041a0abc0002d00002204410120041b3a0000024020040440" - "0340024002400240200441ff017141016b0e03000501020b034041a0abc0" - "002d000022044101460d000b02400240200441016b0e03000601030b000b" - "41a49bc000412641cc9bc0001011000b41a89ac000410d41949bc0001011" - "000b41a0abc00041a0abc0002d00002204410120041b3a000020040d000b" - "0b200341186a220442a9c0c689aece93b230370300200341106a220842dd" - "b0858ce8b691a8b87f3703002003428d95c7c396d2dac0977f3703082003" - "42c6faf3c3ed82a3903c370300200341386a220142003703002003420037" - "03302003420037032820034202370320200342a9c0c689aece93b2303703" - "58200342ddb0858ce8b691a8b87f3703502003428d95c7c396d2dac0977f" - "370348200342c7faf3c3ed82a3903c370340200341206a200341406b103a" - "2003200329032020032903282003290330200129030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b41a0abc00041023a00004198abc000" - "20042903003703004190abc00020082903003703004188abc00020032903" - "083703004180abc00020032903003703000b200341e0006a24000b200241" - "e8046a4198abc000290300370300200241e0046a4190abc0002903003703" - "0020024188abc0002903003703d80420024180abc0002903003703d00441" - "ff012101200241a8076a2104200241b8076a21034200210a4200210e4200" - "210f420021104200210d4200211103402002200241d0046a200141037641" - "f0ffffff01716a22052903002005290308200141ff0071104e2002200a37" - "03f8072002200c3703f0072002200f3703e8072002200e3703e007200220" - "0d3703d807200220103703d007200220113703c8072002200b3703c00720" - "02200a3703b8082002200c3703b0082002200f3703a8082002200e3703a0" - "082002200d37039808200220103703900820022011370388082002200b37" - "0380082002280200210520024180076a200241c0076a20024180086a102f" - "20024198076a290300210d2004290300210f2003290300210a2002290388" - "072111200229038007210b200229039007211020022903a007210e200229" - "03b007210c200541017104402002200a3703b8082002200c3703b0082002" - "200f3703a8082002200e3703a0082002200d370398082002201037039008" - "20022011370388082002200b37038008200241c0076a20024180086a2002" - "41c0066a102f200241e8076a290300210f200241f8076a290300210a2002" - "2903c007210b20022903d007211020022903e007210e20022903f007210c" - "20022903c8072111200241d8076a290300210d0b200141016b2201417f47" - "0d000b2002200c3703b0062002200e3703a0062002201037039006200220" - "0b370380062002200a3703b8062002200f3703a8062002200d3703980620" - "0220113703880620024180056a20024180066a200241f0026a102f0c050b" - "20004181063b01000c050b200020022d00f1043a0002200041810a3b0100" - "0c040b200020063a0002200020073a0001200041013a00000c030b200241" - "f8066a4200370300200241f0066a4200370300200241e8066a4200370300" - "200241e0066a4200370300200241d8066a4200370300200242003703d006" - "200242003703c806200242013703c006200242ba90b590b9f2a4c7193703" - "f807200242a5baed8ff3f6afb0f2003703f00720024292cea7adb3a692d5" - "713703e807200242c2a5ccf7fab6a1f2977f3703e007200242f6bcfc90f1" - "ddb780183703d807200242f988f1f2e58c80b5c2003703d007200242ddb5" - "fbbacfdac8a1e7003703c807200242ededcbcccdabafefc6003703c00720" - "0241f0046a200241c0066a10310240024020022802f00441017104402002" - "41b8086a2201200241b8056a2205290300370300200241b0086a200241b0" - "056a2204290300370300200241a8086a2203200241a8056a220629030037" - "0300200241a0086a200241a0056a29030037030020024198086a20024198" - "056a220729030037030020024190086a20024190056a2903003703002002" - "20022903800537038008200220024188056a290300370388082002418006" - "6a200241c0076a20024180086a102f200242f5e0ffc285baa283093703f8" - "0720024295e7b0c8d6b5a6cf6c3703f007200242f39dce85b7a6cca5bc7f" - "3703e807200242dbae8a89cddbb6d6d5003703e007200242ebdbb1dcddd4" - "97e4123703d8072002428f81adee88b0dcd5ca003703d007200242fba68f" - "e290edf9e8633703c807200242aafbe9b79680b3f3cc003703c007200241" - "f0046a200241c0066a103120022802f004410171450d0120012005290300" - "370300200241b0086a200429030037030020032006290300370300200241" - "a0086a200241a0056a29030037030020024198086a200729030037030020" - "024190086a20024190056a29030037030020022002290380053703800820" - "0220024188056a2903003703880820024180076a200241c0076a20024180" - "086a102f200241f0046a20024180066a20024180076a100720022d00f004" - "4101460d02200041106a20024180056a418001104c1a200041003a00000c" - "050b41f09dc000412c41989fc0001021000b41f09dc000412c41989fc000" - "1021000b200220022d00f1043a00800841b89cc000412b20024180086a41" - "a89fc00041b4a0c0001013000b20024198086a420037030020024190086a" - "4200370300200242003703b808200242003703b008200242003703a80820" - "0242013703a0082002420037038808200242003703800820024180056a20" - "024180086a200241f0026a102f0b200241a8056a290300210e200241b805" - "6a290300210c20022903a005210f20022903b005210b200229039005220d" - "20022903800522158420024198056a290300221220024188056a29030022" - "1384844200520440427f4200427f4200201542788342c7faf3c3ed82a390" - "3c561b220a200a201354ad7d200a20137d220a42f3eab8bce9ada5bfe800" - "7d2217200a54ad7c42017c220a200d7d221042a4cffaf397c9eed7c7007d" - "2218201054ad200a200d54ad7d427f511b20127d42a9c0c689aece93b230" - "7c211642c7faf3c3ed82a3903c20157d21190b4200211142002110420021" - "0a200b200f84200c200e84844200520440427f4200427f4200200f427883" - "42c7faf3c3ed82a3903c561b220a200a200e54ad7d200a200e7d220a42f3" - "eab8bce9ada5bfe8007d2211200a54ad7c42017c220a200b7d221442a4cf" - "faf397c9eed7c7007d2210201454ad200a200b54ad7d427f511b200c7d42" - "a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c200f7d21140b0240" - "0240417f200b201085200a200c8584420052200b201054200a200c56200a" - "200c511b1b2201450440200f201454200e201154200e2011511b0d01200f" - "201485200e2011858442005221010b2019211c2017211d2018211a201621" - "1b2014211e2011211f20102120200a21210240200141ff01710e02000201" - "0b027e200d20188520122016858450044020152019542013201754201320" - "17511b0d02200d211a20120c010b200d20185a201220165a20122016511b" - "450d0120160b211b0c010b2015211c2013211d200d211a2012211b200f21" - "1e200e211f200b2120200c212120192115201721132018210d2016211220" - "14210f2011210e2010210b200a210c0b200041186a200229037837030020" - "0020022903703703102000200229039001370132200041286a2002418801" - "6a290300370300200041206a20024180016a2903003703002000413a6a20" - "024198016a290300370100200041c2006a200241a0016a29030037010020" - "0041c8006a200241a6016a29010037010020094180014604402000202037" - "0380012000201e3703702000201a3703602000201c370350200020063a00" - "31200020073a0030200041003a000020002021370388012000201f370378" - "2000201b3703682000201d3703580c010b2000200b370380012000200f37" - "03702000200d37036020002015370350200020063a0031200020073a0030" - "200041003a00002000200c370388012000200e3703782000201237036820" - "0020133703580b200241c0086a24000b9f0602027f0c7e23004180016b22" - "022400200241386a4200370300200241306a4200370300200241286a4200" - "370300200241206a22034200370300200241186a4200370300200241106a" - "4200370300200241d8006a4200370300200241e0006a4200370300200241" - "e8006a4200370300200241f0006a4200370300200241f8006a4200370300" - "200242003703482002420137034020024200370308200242003703002002" - "420037035002400240024020012002104a0d00200141206a2003104a0d00" - "200141406b200241406b104a0d00200141e0006a200241e0006a104a450d" - "010b200141f8006a290300210e200141e8006a2903002106200129037021" - "0c2001290360210d200129035022042001290340220884200141d8006a29" - "0300220b200141c8006a290300220984844200520440427f4200427f4200" - "200842788342c7faf3c3ed82a3903c561b22052005200954ad7d20052009" - "7d220542f3eab8bce9ada5bfe8007d220f200554ad7c42017c220a20047d" - "220742a4cffaf397c9eed7c7007d2205200754ad2004200a56ad7d427f51" - "1b200b7d42a9c0c689aece93b2307c210a42c7faf3c3ed82a3903c20087d" - "21070b4200210442002108420021094200210b200c200d842006200e8484" - "4200520440427f4200427f4200200d42788342c7faf3c3ed82a3903c561b" - "22042004200654ad7d200420067d220642f3eab8bce9ada5bfe8007d2208" - "200654ad7c42017c2206200c7d220442a4cffaf397c9eed7c7007d220920" - "0454ad2006200c54ad7d427f511b200e7d42a9c0c689aece93b2307c210b" - "42c7faf3c3ed82a3903c200d7d21040b2000200937037020002004370360" - "20002005370350200020073703402000200b370378200020083703682000" - "200a3703582000200f37034820002001290300370300200041386a200141" - "386a290300370300200041306a200141306a290300370300200041286a20" - "0141286a290300370300200041206a200141206a29030037030020004118" - "6a200141186a290300370300200041106a200141106a2903003703002000" - "41086a200141086a2903003703000c010b20002001418001104c1a0b2002" - "4180016a24000bc10201067f41102000410b6a4178712000410b491b2204" - "411c6a1001220045044041000f0b200041086b210102402000410f714504" - "40200121000c010b200041046b220528020022064178712000410f6a4170" - "7141086b2200200020016b4111494104746a220020016b22026b21032006" - "410371044020002003200028020441017172410272360204200020036a22" - "032003280204410172360204200520022005280200410171724102723602" - "00200120026a220320032802044101723602042001200210170c010b2001" - "2802002101200020033602042000200120026a3602000b02402000280204" - "2201410371450d0020014178712202200441106a4d0d0020002004200141" - "017172410272360204200020046a2201200220046b220441037236020420" - "0020026a220220022802044101723602042001200410170b200041086a0b" - "de0a01047f230041f0026b22032400200341a8026a220442003703002003" - "41a0026a22054200370300200342003703c802200342003703c002200342" - "003703b802200342013703b0022003420037039802200342003703900220" - "0341b0026a21060240024002400240200120034190026a104a4504402001" - "41206a2006104a450d010b20044200370300200542003703002003420037" - "03c802200342003703c002200342003703b802200342013703b002200342" - "00370398022003420037039002200220034190026a104a45044020024120" - "6a2006104a450d020b200341206a2104200341406b2105200341a8026a42" - "00370300200341a0026a4200370300200342003703c802200342003703c0" - "02200342003703b802200342013703b00220034200370398022003420037" - "039002027f0240200120034190026a104a450440200141206a200341b002" - "6a104a450d010b20042001290320370300200441186a200141386a290300" - "370300200441106a200141306a290300370300200441086a200141286a29" - "0300370300200341106a200141106a290300370300200341186a20014118" - "6a290300370300200320012903003703002003200141086a290300370308" - "200341d0006a0c010b20054200370300200341106a420037030020034118" - "6a4200370300200541086a4200370300200541106a420037030020054118" - "6a4200370300200342003703002003420037030820042105200341306a0b" - "210620034180016a2101200341a0016a2104200642003703082006420037" - "03002005420037030820054201370300200341a8026a4200370300200341" - "a0026a4200370300200342003703c802200342003703c002200342003703" - "b802200342013703b00220034200370398022003420037039002027f0240" - "200220034190026a104a450440200241206a200341b0026a104a450d010b" - "20012002290320370300200141186a200241386a29030037030020014110" - "6a200241306a290300370300200141086a200241286a2903003703002003" - "41f0006a200241106a290300370300200341f8006a200241186a29030037" - "0300200320022903003703602003200241086a290300370368200341b001" - "6a0c010b20044200370300200341f0006a4200370300200341f8006a4200" - "370300200441086a4200370300200441106a4200370300200441186a4200" - "37030020034200370360200342003703682001210420034190016a0b2205" - "420037030820054200370300200442003703082004420137030020034190" - "026a2003200341e0006a1040200341c0016a20034190026a104120032802" - "c001410171450d02200020032903d001370300200041386a20034188026a" - "290300370300200041306a20034180026a290300370300200041286a2003" - "41f8016a290300370300200041206a200341f0016a290300370300200041" - "186a200341e8016a290300370300200041106a200341e0016a2903003703" - "00200041086a200341d8016a2903003703000c030b200020022903003703" - "00200041386a200241386a290300370300200041306a200241306a290300" - "370300200041286a200241286a290300370300200041206a200241206a29" - "0300370300200041186a200241186a290300370300200041106a20024110" - "6a290300370300200041086a200241086a2903003703000c020b20002001" - "290300370300200041386a200141386a290300370300200041306a200141" - "306a290300370300200041286a200141286a290300370300200041206a20" - "0141206a290300370300200041186a200141186a29030037030020004110" - "6a200141106a290300370300200041086a200141086a2903003703000c01" - "0b41c4a0c000412041f4a0c0001021000b200341f0026a24000bf2020201" - "7f067e230041e0006b22022400200241386a4200370300200241306a4200" - "370300200242003703582002420037035020024200370348420121042002" - "42013703402002420037032820024200370320027e02402001200241206a" - "104a450440200141206a200241406b104a450d010b200241106a20014110" - "6a290300370300200241186a200141186a29030037030020022001290300" - "3703002002200141086a290300370308200141286a290300210520012903" - "30210620012903202107200141386a2903000c010b42002104200241106a" - "4200370300200241186a4200370300200242003703002002420037030842" - "01210742000b210820004200370358200042003703502000200437034020" - "002006370330200020073703202000200229030037030020002003370348" - "2000200837033820002005370328200041086a2002290308370300200041" - "186a200241186a290300370300200041106a200241106a29030037030020" - "0241e0006a24000b5b01027f0240200041046b2802002202417871220341" - "044108200241037122021b20016a4f0440200241002003200141276a4b1b" - "0d01200010040f0b41f996c000412e41a897c0001011000b41b897c00041" - "2e41e897c0001011000bc30802027f047e230041a0026b22022400200241" - "d8016a4200370300200241d0016a4200370300200241c8016a4200370300" - "200241c0016a22034200370300200241b8016a4200370300200241b0016a" - "4200370300200241f8016a420037030020024180026a4200370300200241" - "88026a420037030020024190026a420037030020024198026a4200370300" - "200242003703e80142012105200242013703e001200242003703a8012002" - "42003703a001200242003703f0010240024002402001200241a0016a104a" - "0d00200141206a2003104a0d00200141406b200241e0016a104a0d002001" - "41e0006a20024180026a104a450d010b200241106a420037030020024118" - "6a4200370300200241206a4200370300200241286a420037030020024140" - "6b200141e0006a290300370300200241c8006a200141e8006a2903003703" - "00200241d0006a200141f0006a290300370300200241d8006a200141f800" - "6a2903003703002002420037030020024200370308200220012903503703" - "302002200141d8006a290300370338200141c8006a290300210620012903" - "40210720024198016a200141386a29030037030020024190016a20014130" - "6a29030037030020024188016a200141286a29030037030020024180016a" - "200141206a290300370300200241f8006a200141186a2903003703002002" - "41f0006a200141106a2903003703002002200141086a2903003703682002" - "20012903003703600c010b42002105200241f0006a4200370300200241f8" - "006a420037030020024180016a420037030020024188016a420037030020" - "024190016a420037030020024198016a4200370300200241406b42003703" - "00200241c8006a4200370300200241d0006a4200370300200241d8006a42" - "00370300200241106a4200370300200241186a4200370300200241206a42" - "00370300200241286a420037030020024200370360200242003703682002" - "420037033020024200370338200242003703002002420037030842012107" - "0b2000200737034020002002290360370300200020022903303703502000" - "2006370348200041086a2002290368370300200041d8006a200229033837" - "0300200041386a20024198016a290300370300200041306a20024190016a" - "290300370300200041286a20024188016a290300370300200041206a2002" - "4180016a290300370300200041186a200241f8006a290300370300200041" - "106a200241f0006a290300370300200041e0006a200241406b2903003703" - "00200041e8006a200241c8006a290300370300200041f0006a200241d000" - "6a290300370300200041f8006a200241d8006a2903003703002000200437" - "0388012000200537038001200020022903003703900120004198016a2002" - "290308370300200041a0016a200241106a290300370300200041a8016a20" - "0241186a290300370300200041b0016a200241206a290300370300200041" - "b8016a200241286a290300370300200241a0026a24000b6802017f017e23" - "0041306b2203240020032001360204200320003602002003410236020c20" - "0341c481c00036020820034202370214200342808080801022042003ad84" - "37032820032004200341046aad843703202003200341206a360210200341" - "086a2002101a000b4101017f230041206b22032400200341003602102003" - "4101360204200342043702082003200136021c2003200036021820032003" - "41186a36020020032002101a000b6801017f230041306b22032400200320" - "01360204200320003602002003410236020c2003418484c0003602082003" - "42023702142003200341046aad4280808080108437032820032003ad4280" - "80808010843703202003200341206a360210200341086a2002101a000b79" - "01017f230041406a220524002005200136020c2005200036020820052003" - "360214200520023602102005410236021c200541d881c000360218200542" - "023702242005200541106aad428080808020843703382005200541086aad" - "428080808030843703302005200541306a360220200541186a2004101a00" - "0b3601017f230041206b22012400200141003602182001410136020c2001" - "41d480c00036020820014204370210200141086a2000101a000bcc060105" - "7f0240024002400240200041046b22062802002207417871220441044108" - "200741037122051b20016a4f044020054100200141276a22082004491b0d" - "0102400240200241094f04402003100b22040d0141000f0b41102003410b" - "6a4178712003410b491b2101024020054504402001418002490d01200420" - "01410472490d01200420016b418180084f0d010c030b200041086b220220" - "046a2105024002400240200120044b0440200541a0a9c000280200460d03" - "2005419ca9c000280200460d02200528020422074102710d042007417871" - "220720046a22042001490d04200520071016200420016b22034110490d01" - "20062001200628020041017172410272360200200120026a220120034103" - "72360204200220046a220420042802044101723602042001200310172000" - "0f0b200420016b2203410f4d0d0520062001200741017172410272360200" - "200120026a22012003410372360204200520052802044101723602042001" - "2003101720000f0b20062004200628020041017172410272360200200220" - "046a2201200128020441017236020420000f0b4194a9c00028020020046a" - "22042001490d010240200420016b2203410f4d0440200620074101712004" - "72410272360200200220046a220120012802044101723602044100210341" - "0021010c010b20062001200741017172410272360200200120026a220120" - "03410172360204200220046a2204200336020020042004280204417e7136" - "02040b419ca9c00020013602004194a9c000200336020020000f0b4198a9" - "c00028020020046a220420014b0d070b20031001220145044041000f0b20" - "012000417c4178200628020022044103711b20044178716a220420032003" - "20044b1b104c21012000100420010f0b200420002001200320012003491b" - "104c210420062802002203417871220541044108200341037122031b2001" - "6a490d0320034100200520084b1b0d0420001004200421000b20000f0b41" - "f996c000412e41a897c0001011000b41b897c000412e41e897c000101100" - "0b41f996c000412e41a897c0001011000b41b897c000412e41e897c00010" - "11000b20062001200741017172410272360200200120026a220320042001" - "6b22014101723602044198a9c000200136020041a0a9c000200336020020" - "000bf10201047f200028020c21020240024020014180024f044020002802" - "1821040240024020002002460440200041144110200028021422021b6a28" - "020022010d01410021020c020b20002802082201200236020c2002200136" - "02080c010b200041146a200041106a20021b210303402003210520012202" - "41146a200241106a200228021422011b210320024114411020011b6a2802" - "0022010d000b200541003602000b2004450d022000200028021c41027441" - "f4a5c0006a220128020047044020044110411420042802102000461b6a20" - "023602002002450d030c020b2001200236020020020d014190a9c0004190" - "a9c000280200417e200028021c77713602000c020b200028020822032002" - "4704402003200236020c200220033602080f0b418ca9c000418ca9c00028" - "0200417e200141037677713602000f0b2002200436021820002802102201" - "044020022001360210200120023602180b20002802142201450d00200220" - "01360214200120023602180b0ba90601047f200020016a21020240024020" - "0028020422034101710d002003410271450d012000280200220320016a21" - "01200020036b2200419ca9c0002802004604402002280204410371410347" - "0d014194a9c000200136020020022002280204417e713602042000200141" - "0172360204200220013602000c020b2000200310160b0240024002402002" - "2802042203410271450440200241a0a9c000280200460d022002419ca9c0" - "00280200460d0320022003417871220310162000200120036a2201410172" - "360204200020016a20013602002000419ca9c000280200470d014194a9c0" - "0020013602000f0b20022003417e71360204200020014101723602042000" - "20016a20013602000b20014180024f0440411f2102200042003702102001" - "41ffffff074d04402001410620014108766722026b764101712002410174" - "6b413e6a21020b2000200236021c200241027441f4a5c0006a2103410120" - "027422044190a9c000280200714504402003200036020020002003360218" - "2000200036020c200020003602084190a9c0004190a9c000280200200472" - "3602000f0b02400240200120032802002204280204417871460440200421" - "020c010b2001411920024101766b41002002411f471b7421030340200420" - "03411d764104716a41106a22052802002202450d02200341017421032002" - "210420022802044178712001470d000b0b20022802082201200036020c20" - "022000360208200041003602182000200236020c200020013602080f0b20" - "052000360200200020043602182000200036020c200020003602080f0b20" - "0141f801714184a7c0006a2102027f418ca9c00028020022034101200141" - "037674220171450440418ca9c000200120037236020020020c010b200228" - "02080b2101200220003602082001200036020c2000200236020c20002001" - "3602080f0b41a0a9c00020003602004198a9c0004198a9c0002802002001" - "6a2201360200200020014101723602042000419ca9c000280200470d0141" - "94a9c0004100360200419ca9c00041003602000f0b419ca9c00020003602" - "004194a9c0004194a9c00028020020016a22013602002000200141017236" - "0204200020016a20013602000b0b8e0201057f230041206b220324002000" - "2802002202417f460440410020011019000b410820024101742204200241" - "016a2205200420054b1b2204200441084d1b220441004804404100200110" - "19000b20032002047f2003200236021c2003200028020436021441010541" - "000b360218200341086a2105027f0240200341146a220228020404402002" - "280208220645044041bda9c0002d00001a0c020b20022802002006410120" - "0410150c020b41bda9c0002d00001a0b200410010b210220052004360208" - "20052002410120021b360204200520024536020020032802084101460440" - "20032802101a200328020c20011019000b200328020c2102200020043602" - "0020002002360204200341206a24000b0d002000450440200110140b000b" - "f40102027f017e230041106b22022400200241013b010c20022001360208" - "20022000360204230041106b22002400200241046a220129020021042000" - "200136020c20002004370204230041106b22022400200041046a22012802" - "00220028020c2103024002400240024020002802040e020001020b20030d" - "0141012100410021030c020b20030d002000280200220028020421032000" - "28020021000c010b20024180808080783602002002200136020c20012802" - "0822012d0008210020012d00091a2002410420001033000b200220033602" - "0420022000360200200128020822012d0008210020012d00091a20024105" - "20001033000b6801017f230041306b220324002003200136020420032000" - "3602002003410236020c200341e483c00036020820034202370214200320" - "0341046aad4280808080108437032820032003ad42808080801084370320" - "2003200341206a360210200341086a2002101a000bcf06010b7f20002802" - "002102230041106b22072400410a2103024020024190ce00490440200221" - "000c010b0340200741066a20036a220441046b20024190ce006e220041f0" - "b1036c20026a220541ffff037141e4006e220641017441e881c0006a2f00" - "003b0000200441026b2006419c7f6c20056a41ffff037141017441e881c0" - "006a2f00003b0000200341046b2103200241ffc1d72f4b21042000210220" - "040d000b0b0240200041e3004d0440200021020c010b200341026b220320" - "0741066a6a200041ffff037141e4006e2202419c7f6c20006a41ffff0371" - "41017441e881c0006a2f00003b00000b02402002410a4f0440200341026b" - "2203200741066a6a200241017441e881c0006a2f00003b00000c010b2003" - "41016b2203200741066a6a20024130723a00000b027f200741066a20036a" - "210941012108410a20036b220a2001280214220241017122056a21062008" - "410020024104711b2108412b418080c40020051b21052001280200450440" - "4101200128021c22002001280220220320052008101d0d011a2000200920" - "0a200328020c1103000c010b0240024002402006200128020422004f0440" - "200128021c22002001280220220320052008101d450d0141010c040b2002" - "410871450d01200128021021022001413036021020012d0018210c410121" - "0b200141013a0018200128021c22032001280220220420052008101d0d02" - "200020066b41016a210002400340200041016b2200450d01200341302004" - "280210110200450d000b41010c040b410120032009200a200428020c1103" - "000d031a2001200c3a00182001200236021041000c030b20002009200a20" - "0328020c110300210b0c010b200020066b2102024002400240410120012d" - "0018220020004103461b220041016b0e020001020b20022100410021020c" - "010b20024101762100200241016a41017621020b200041016a2100200128" - "0210210620012802202103200128021c210402400340200041016b220045" - "0d01200420062003280210110200450d000b41010c020b4101210b200420" - "0320052008101d0d0020042009200a200328020c1103000d004100210003" - "40410020002002460d021a200041016a2100200420062003280210110200" - "450d000b200041016b2002490c010b200b0b2102200741106a240020020b" - "380002402002418080c400460d00200020022001280210110200450d0041" - "010f0b200345044041000f0b200020034100200128020c1103000bfd0a01" - "0c7f20002802042107200028020021030240024020012802002209200128" - "0208220072044002402000410171450d00200320076a2106024020012802" - "0c2205450440200321020c010b200321020340200222002006460d02027f" - "200041016a20002c0000220241004e0d001a200041026a20024160490d00" - "1a200041036a20024170490d001a200041046a0b220220006b20046a2104" - "2005200841016a2208470d000b0b20022006460d0020022c00001a200420" - "07027f02402004450d00200420074f044020042007460d0141000c020b20" - "0320046a2c000041404e0d0041000c010b20030b22001b21072000200320" - "001b21030b2009450440200128021c20032007200128022028020c110300" - "0f0b2001280204210c200741104f044020072003200341036a417c712204" - "6b22086a220a41037121094100210541002100200320044704402008417c" - "4d04404100210603402000200320066a22022c000041bf7f4a6a20024101" - "6a2c000041bf7f4a6a200241026a2c000041bf7f4a6a200241036a2c0000" - "41bf7f4a6a2100200641046a22060d000b0b200321020340200020022c00" - "0041bf7f4a6a2100200241016a2102200841016a22080d000b0b02402009" - "450d002004200a417c716a22022c000041bf7f4a210520094101460d0020" - "0520022c000141bf7f4a6a210520094102460d00200520022c000241bf7f" - "4a6a21050b200a4102762106200020056a21050340200421092006450d04" - "41c0012006200641c0014f1b220a410371210b200a410274210d41002102" - "200641044f04402004200d41f007716a2108200421000340200028020c22" - "04417f7341077620044106767241818284087120002802082204417f7341" - "077620044106767241818284087120002802042204417f73410776200441" - "06767241818284087120002802002204417f734107762004410676724181" - "8284087120026a6a6a6a2102200041106a22002008470d000b0b2006200a" - "6b21062009200d6a2104200241087641ff81fc0771200241ff81fc07716a" - "418180046c41107620056a2105200b450d000b2009200a41fc0171410274" - "6a22022802002200417f734107762000410676724181828408712100200b" - "4101460d0220022802042204417f73410776200441067672418182840871" - "20006a2100200b4102460d0220022802082202417f734107762002410676" - "7241818284087120006a21000c020b2007450440410021050c030b200741" - "03712102027f200741044904404100210041000c010b20032c000041bf7f" - "4a20032c000141bf7f4a6a20032c000241bf7f4a6a20032c000341bf7f4a" - "6a22052007410c7122004104460d001a200520032c000441bf7f4a6a2003" - "2c000541bf7f4a6a20032c000641bf7f4a6a20032c000741bf7f4a6a2205" - "20004108460d001a200520032c000841bf7f4a6a20032c000941bf7f4a6a" - "20032c000a41bf7f4a6a20032c000b41bf7f4a6a0b21052002450d022000" - "20036a21000340200520002c000041bf7f4a6a2105200041016a21002002" - "41016b22020d000b0c020b200128021c20032007200128022028020c1103" - "000f0b200041087641ff811c71200041ff81fc07716a418180046c411076" - "20056a21050b02402005200c490440200c20056b21060240024002402001" - "2d00182200410020004103471b220041016b0e020001020b200621004100" - "21060c010b20064101762100200641016a41017621060b200041016a2100" - "2001280210210820012802202102200128021c21040340200041016b2200" - "450d02200420082002280210110200450d000b41010f0b200128021c2003" - "2007200128022028020c1103000f0b200420032007200228020c11030004" - "4041010f0b4100210003402000200646044041000f0b200041016a210020" - "0420082002280210110200450d000b200041016b2006490b140020002802" - "002001200028020428020c1102000b0e0041e480c000412b20001011000b" - "5901017f230041306b220324002003200136020c20032000360208200341" - "01360214200341dc80c0003602102003420137021c2003200341086aad42" - "8080808030843703282003200341286a360218200341106a2002101a000b" - "7f01017f027f0240027f0240200228020404402002280208220345044020" - "01450d0441bda9c0002d00001a0c020b200228020020034104200110150c" - "020b2001450d0241bda9c0002d00001a0b200110010b2202410420021b21" - "032002450c010b4104210341000b21022000200136020820002003360204" - "200020023602000bdd0101087f230041206b220224002000280200220341" - "7f460440410020011019000b20034101742204200341016a220620042006" - "4b1b220441ffffffff034b0440410020011019000b024041042004200441" - "044d1b2207410274220641fcffffff074d047f4100210420022003047f20" - "02200341027436021c2002200028020436021441040520040b3602182002" - "41086a2006200241146a102220022802084101470d012002280210210520" - "0228020c0520050b210820052109200820011019000b200228020c210320" - "00200736020020002003360204200241206a24000bd10d021c7f077e2300" - "41206b220c2400200341016b211102400240024002402003044020034102" - "6b210520034101460d0402402001280208221420036b221941016a220e41" - "ffffffff034b0d00200e410274220441fdffffff074f0d00200220114102" - "746a2802002115200220054102746a3502002123027f2004450440410421" - "0b41000c010b41bda9c0002d00001a20041001220b450d05200b41046b2d" - "00004103710440200b2004104b1a0b200e0b21102001280200211a201421" - "09200e044020012802042212200941027420034102746b6a211320034101" - "7121162003417e71210d201241086b211b201241046b211c42002015ad22" - "2242208622247d2125200e210f0340024020090440201c20094102742204" - "6a22050d010b41ec87c0001020000b027f0240200941024f044020052802" - "0021052004201b6a350200212120082015490d012005ad2008ad7c212041" - "7f0c020b417f417e20141b410141fc87c0001010000b2005ad2008ad4220" - "868422202020202280222620227e7d21202026a70b21070240202042ffff" - "ffff0f560d00202520204220867c20217c21210340202120247c22212007" - "ad20237e5a0d01200741016b2107202020227c2220428080808010540d00" - "0b0b02400240024002402009200f41016b220f4f0440200f410274211720" - "09200f460d04201220176a21182007ad212102400240201145044042ffff" - "ffff0f2120410021060c010b4100210642ffffffff0f2120201321042002" - "210503402004202020043502007c202120053502007e7d42ffffffff1f7d" - "22203e0200200441046a220a200a35020020204220887c2021200541046a" - "3502007e7d42ffffffff1f7d22203e020020204220882120200441086a21" - "04200541086a2105200d200641026a2206470d000b2016450d010b201820" - "0641027422046a2205202020053502007c2021200220046a3502007e7d42" - "ffffffff1f7d22203e0200202042208821200b20082020a7417f734f0d04" - "20114504404100210a410021080c030b41002104410021084100210a0340" - "200420136a22052005280200221d200220046a221e2802006a220620086a" - "2208360200200541046a22052005280200221f201e41046a2802006a2205" - "2006201d49200620084b726a22063602002005201f49200520064b722108" - "200441086a2104200d200a41026a220a470d000b0c010b200f2009418c88" - "c000101b000b2016450d010b2018200a41027422046a2205200528020020" - "0220046a2802006a20086a3602000b200741016b21070b200b20176a2007" - "3602002001200941016b2209360208201341046b2113201220094102746a" - "2802002108200f0d000b0b2009201a460440200141dc87c00010230b2001" - "200941016a220d3602082001280204220a200941027422046a2008360200" - "20080d03200d41ffffffff0371210702400340200721052004417c460d01" - "200541016b21072004200a6a2106200441046b21042006280200450d000b" - "2005200d4b0d040c030b410021050c020b41cc87c0001014000b20114100" - "41ac87c0001010000b200120053602082005210d0b024002400240024002" - "40200d200128020022044102764f0d002004200d490d012004450d002004" - "41027421040240200d450440200a41046b28020022054178712207410441" - "08200541037122051b20046a490d04200541002007200441276a4b1b0d05" - "200a1004410421040c010b200a20044104200d41027410152204450d060b" - "2001200d360200200120043602040b41002106200e450d03200b200e4102" - "746a41046b2802000440200e21060c040b201441027420034102746b2104" - "201941026a210503402004417c460d04200541016b21052004200b6a2107" - "200441046b21042007280200450d000b200e20052005200e4b1b21060c03" - "0b200c4100360218200c410136020c200c41ec84c000360208200c420437" - "0210200c41086a41f484c000101a000b41f996c000412e41a897c0001011" - "000b41b897c000412e41e897c0001011000b024002400240024020104102" - "7620064d0440201021040c010b200620104b0d01410021042010450d0020" - "1041027421052006450440200b41046b2802002207417871220a41044108" - "200741037122071b20056a490d0320074100200a200541276a4b1b0d0420" - "0b10044104210b0c010b200b20054104200622044102741015220b450d04" - "0b200020063602082000200b360204200020043602002000200129020037" - "020c200041146a200141086a280200360200200c41206a24000f0b200c41" - "00360218200c410136020c200c41ec84c000360208200c4204370210200c" - "41086a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" - "97c000412e41e897c00010110b000b2005410141bc87c0001010000be609" - "010c7f230041306b220724002001280200210c0240024002400240024002" - "400240024002400240024002400240024020024504402001280204210b20" - "0c418080808078470d02200b41086a280200220441ffffffff034d044020" - "04410274220641fdffffff07490d020b41a89cc0001014000b2001280204" - "220b2001200c418080808078461b2208280208220941feffffff014f0d04" - "41bda9c0002d00001a200941026a220141027410012205450d0720054100" - "360200200720053602102007200136020c41012101200741013602142008" - "2802082206410274210d200828020421082006200941016a4b0440200741" - "0c6a2105230041206b22042400024002402006417f460d00200528020022" - "09410174220a200641016a22012001200a491b220141ffffffff034b0d00" - "41042001200141044d1b220f410274220a41fcffffff074b0d0020042009" - "047f2004200941027436021c2004200528020436021441040541000b3602" - "18200441086a200a200441146a102220042802084101470d012004280210" - "1a200428020c210e0b200e41c096c0001019000b200428020c2101200520" - "0f36020020052001360204200441206a2400200728021021052007280214" - "21010b200520014102746a2008200d104c1a2007200120066a2204360214" - "0c030b200b41046a28020021092006450440410421054100210141042009" - "2006104c1a0c020b41bda9c0002d00001a20042101200610012205450d06" - "200520092006104c1a0c010b20012802082104200c2101200b21050b2007" - "2004360214200720053602102007200136020c0b200341ff0171450d0202" - "40200220044d044020022004470d01200221040c040b2002410041c889c0" - "00101b000b20044102742109200241027421012003411f71210841002003" - "6b411f71210d410021030340200120056a22062006280200220620087420" - "03723602002006200d7621032009200141046a2201470d000b0c010b41a8" - "89c00010140c020b2003450d00200728020c20044604402007410c6a41b8" - "89c0001023200728021021050b200520044102746a200336020020072004" - "41016a22043602140b41002108200728020c210a02402004450d00200520" - "0441027422016a41046b2802000440200421080c010b200541046b210d20" - "0441ffffffff037121030340200321062001450d01200641016b21032001" - "200d6a2109200141046b21012009280200450d000b200420062004200649" - "1b21080b0240200a41027620084d0440200a21010c010b2008200a4b0d02" - "41002101200a450d00200a41027421032008450440200541046b28020022" - "06417871220941044108200641037122061b20036a490d04200641002009" - "200341276a4b1b0d0520051004410421050c010b20052003410420082201" - "41027410152205450d010b20002008360208200020053602042000200136" - "02002002450d06200c41808080807872418080808078460d06200b41046b" - "28020022014178712203200c410274220641044108200141037122011b6a" - "490d04200141002003200641276a4b1b0d05200b10040c060b000b200741" - "003602282007410136021c200741ec84c000360218200742043702202007" - "41186a41f484c000101a000b41f996c000412e41a897c0001011000b41b8" - "97c000412e41e897c0001011000b41f996c000412e41a897c0001011000b" - "41b897c000412e41e897c0001011000b200741306a24000bc60201027f41" - "bda9c0002d00001a024002400240412010012202450d0020022001290000" - "370200200220012900083702082002200129001037021020022001280018" - "3602182002200128001c220336021c410821012000027f410820030d001a" - "41082002411c6a2802000d001a4107200241186a2802000d001a41062002" - "41146a2802000d001a4105200241106a2802000d001a41042002410c6a28" - "02000d001a4103200241086a2802000d001a4102200241046a2802000d00" - "1a2002280200450440200241046b28020022014178714124412820014103" - "7122031b490d0320034100200141c8004f1b0d0420021004410421024100" - "210141000c010b200241204104410410152202450d014101210141010b36" - "020820002002360204200020013602000f0b000b41f996c000412e41a897" - "c0001011000b41b897c000412e41e897c0001011000bcc3e01227f200120" - "024106746a2124200028021c21222000280218211f2000280214211e2000" - "280210211b200028020c2123200028020821202000280204211d20002802" - "002102034020022001280000220341187420034180fe0371410874722003" - "4108764180fe03712003411876727222152022201b411a77201b41157773" - "201b410777736a201e201f73201b71201f736a6a4198dfa894046a220420" - "1d202073200271201d202071732002411e772002411377732002410a7773" - "6a6a2203411e772003411377732003410a777320032002201d7371200220" - "1d71736a201f2001280004220541187420054180fe037141087472200541" - "08764180fe03712005411876727222136a200420236a2207201b201e7371" - "201e736a2007411a772007411577732007410777736a419189dd89076a22" - "066a2205411e772005411377732005410a77732005200220037371200220" - "0371736a201e2001280008220441187420044180fe037141087472200441" - "08764180fe03712004411876727222146a200620206a220c2007201b7371" - "201b736a200c411a77200c41157773200c410777736a41b188fcd1046b22" - "0d6a2204411e772004411377732004410a77732004200320057371200320" - "0571736a201b200128000c220641187420064180fe037141087472200641" - "08764180fe03712006411876727222116a200d201d6a220d2007200c7371" - "2007736a200d411a77200d41157773200d410777736a41dbc8a8b2016b22" - "086a2206411e772006411377732006410a77732006200420057371200420" - "0571736a20072001280010220f411874200f4180fe037141087472200f41" - "08764180fe0371200f411876727222166a200220086a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41db84dbca036a22" - "096a2207411e772007411377732007410a77732007200420067371200420" - "0671736a2001280014220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722218200c6a200320096a220c200d200f7371" - "200d736a200c411a77200c41157773200c410777736a41f1a3c4cf056a22" - "096a2203411e772003411377732003410a77732003200620077371200620" - "0771736a2001280018220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722219200d6a200520096a220d200c200f7371" - "200f736a200d411a77200d41157773200d410777736a41dcfa81ee066b22" - "096a2205411e772005411377732005410a77732005200320077371200320" - "0771736a200128001c220841187420084180fe0371410874722008410876" - "4180fe037120084118767272221a200f6a200420096a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41abc28ea7056b22" - "096a2204411e772004411377732004410a77732004200320057371200320" - "0571736a2001280020220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722202200c6a200620096a220c200d200f7371" - "200d736a200c411a77200c41157773200c410777736a41e8aae1bf026b22" - "096a2206411e772006411377732006410a77732006200420057371200420" - "0571736a2001280024220841187420084180fe0371410874722008410876" - "4180fe037120084118767272220a200d6a200720096a220d200c200f7371" - "200f736a200d411a77200d41157773200d410777736a4181b68d94016a22" - "096a2207411e772007411377732007410a77732007200420067371200420" - "0671736a2001280028220841187420084180fe0371410874722008410876" - "4180fe037120084118767272220b200f6a200320096a220f200c200d7371" - "200c736a200f411a77200f41157773200f410777736a41be8bc6a1026a22" - "096a2203411e772003411377732003410a77732003200620077371200620" - "0771736a200128002c220841187420084180fe0371410874722008410876" - "4180fe0371200841187672722210200c6a200520096a2208200d200f7371" - "200d736a2008411a772008411577732008410777736a41c3fbb1a8056a22" - "096a2205411e772005411377732005410a77732005200320077371200320" - "0771736a2001280030220c411874200c4180fe037141087472200c410876" - "4180fe0371200c4118767272221c200d6a200420096a22092008200f7371" - "200f736a2009411a772009411577732009410777736a41f4baf995076a22" - "0d6a2204411e772004411377732004410a77732004200320057371200320" - "0571736a2001280034220c411874200c4180fe037141087472200c410876" - "4180fe0371200c41187672722221200f6a2006200d6a220e200820097371" - "2008736a200e411a77200e41157773200e410777736a41829c85f9076b22" - "0d6a2206411e772006411377732006410a77732006200420057371200420" - "0571736a2001280038220c411874200c4180fe037141087472200c410876" - "4180fe0371200c4118767272220c20086a2007200d6a22122009200e7371" - "2009736a2012411a772012411577732012410777736a41d9f28fa1066b22" - "0f6a2207411e772007411377732007410a77732007200420067371200420" - "0671736a200128003c220d411874200d4180fe037141087472200d410876" - "4180fe0371200d4118767272220d20096a2003200f6a2217200e20127371" - "200e736a2017411a772017411577732017410777736a418c9d90f3036b22" - "086a2203411e772003411377732003410a77732003200620077371200620" - "0771736a20134119772013410e777320134103767320156a200a6a200c41" - "0f77200c410d7773200c410a76736a220f200e6a200520086a2215201220" - "1773712012736a2015411a772015411577732015410777736a41bfac92db" - "016b22096a2205411e772005411377732005410a77732005200320077371" - "2003200771736a20144119772014410e777320144103767320136a200b6a" - "200d410f77200d410d7773200d410a76736a220820126a200420096a2213" - "2015201773712017736a2013411a772013411577732013410777736a41fa" - "f08682016b220e6a2204411e772004411377732004410a77732004200320" - "0573712003200571736a20114119772011410e777320114103767320146a" - "20106a200f410f77200f410d7773200f410a76736a220920176a2006200e" - "6a22142013201573712015736a2014411a77201441157773201441077773" - "6a41c6bb86fe006a22126a2206411e772006411377732006410a77732006" - "2004200573712004200571736a20164119772016410e7773201641037673" - "20116a201c6a2008410f772008410d77732008410a76736a220e20156a20" - "0720126a22112013201473712013736a2011411a77201141157773201141" - "0777736a41ccc3b2a0026a22176a2207411e772007411377732007410a77" - "7320072004200673712004200671736a20184119772018410e7773201841" - "03767320166a20216a2009410f772009410d77732009410a76736a221220" - "136a200320176a22162011201473712014736a2016411a77201641157773" - "2016410777736a41efd8a4ef026a22156a2203411e772003411377732003" - "410a777320032006200773712006200771736a20194119772019410e7773" - "20194103767320186a200c6a200e410f77200e410d7773200e410a76736a" - "221720146a200520156a22182011201673712011736a2018411a77201841" - "1577732018410777736a41aa89d2d3046a22136a2205411e772005411377" - "732005410a777320052003200773712003200771736a201a411977201a41" - "0e7773201a4103767320196a200d6a2012410f772012410d77732012410a" - "76736a221520116a200420136a22192016201873712016736a2019411a77" - "2019411577732019410777736a41dcd3c2e5056a22146a2204411e772004" - "411377732004410a777320042003200573712003200571736a2002411977" - "2002410e7773200241037673201a6a200f6a2017410f772017410d777320" - "17410a76736a221320166a200620146a221a2018201973712018736a201a" - "411a77201a41157773201a410777736a41da91e6b7076a22116a2206411e" - "772006411377732006410a777320062004200573712004200571736a200a" - "411977200a410e7773200a4103767320026a20086a2015410f772015410d" - "77732015410a76736a221420186a200720116a22022019201a7371201973" - "6a2002411a772002411577732002410777736a41aedd86be066b22166a22" - "07411e772007411377732007410a77732007200420067371200420067173" - "6a200b411977200b410e7773200b41037673200a6a20096a2013410f7720" - "13410d77732013410a76736a221120196a200320166a220a2002201a7371" - "201a736a200a411a77200a41157773200a410777736a4193f3b8be056b22" - "186a2203411e772003411377732003410a77732003200620077371200620" - "0771736a20104119772010410e7773201041037673200b6a200e6a201441" - "0f772014410d77732014410a76736a2216201a6a200520186a220b200220" - "0a73712002736a200b411a77200b41157773200b410777736a41b8b0f3ff" - "046b22196a2205411e772005411377732005410a77732005200320077371" - "2003200771736a201c411977201c410e7773201c4103767320106a20126a" - "2011410f772011410d77732011410a76736a221820026a200420196a2202" - "200a200b7371200a736a2002411a772002411577732002410777736a41b9" - "809a85046b221a6a2204411e772004411377732004410a77732004200320" - "0573712003200571736a20214119772021410e7773202141037673201c6a" - "20176a2016410f772016410d77732016410a76736a2219200a6a2006201a" - "6a220a2002200b7371200b736a200a411a77200a41157773200a41077773" - "6a418de8ffc8036b22106a2206411e772006411377732006410a77732006" - "2004200573712004200571736a200c411977200c410e7773200c41037673" - "20216a20156a2018410f772018410d77732018410a76736a221a200b6a20" - "0720106a220b2002200a73712002736a200b411a77200b41157773200b41" - "0777736a41b9dde1d2026b22106a2207411e772007411377732007410a77" - "7320072004200673712004200671736a200d411977200d410e7773200d41" - "037673200c6a20136a2019410f772019410d77732019410a76736a220c20" - "026a200320106a2202200a200b7371200a736a2002411a77200241157773" - "2002410777736a41d1c6a9366a22106a2203411e77200341137773200341" - "0a777320032006200773712006200771736a200f411977200f410e777320" - "0f41037673200d6a20146a201a410f77201a410d7773201a410a76736a22" - "0d200a6a200520106a220a2002200b7371200b736a200a411a77200a4115" - "7773200a410777736a41e7d2a4a1016a22106a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20084119772008410e" - "7773200841037673200f6a20116a200c410f77200c410d7773200c410a76" - "736a220f200b6a200420106a220b2002200a73712002736a200b411a7720" - "0b41157773200b410777736a418595dcbd026a22106a2204411e77200441" - "1377732004410a777320042003200573712003200571736a200941197720" - "09410e777320094103767320086a20166a200d410f77200d410d7773200d" - "410a76736a220820026a200620106a2202200a200b7371200a736a200241" - "1a772002411577732002410777736a41b8c2ecf0026a22106a2206411e77" - "2006411377732006410a777320062004200573712004200571736a200e41" - "1977200e410e7773200e4103767320096a20186a200f410f77200f410d77" - "73200f410a76736a2209200a6a200720106a220a2002200b7371200b736a" - "200a411a77200a41157773200a410777736a41fcdbb1e9046a22106a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "20124119772012410e7773201241037673200e6a20196a2008410f772008" - "410d77732008410a76736a220e200b6a200320106a220b2002200a737120" - "02736a200b411a77200b41157773200b410777736a41939ae099056a2210" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a20174119772017410e777320174103767320126a201a6a2009410f" - "772009410d77732009410a76736a221220026a200520106a2202200a200b" - "7371200a736a2002411a772002411577732002410777736a41d4e6a9a806" - "6a22106a2205411e772005411377732005410a7773200520032007737120" - "03200771736a20154119772015410e777320154103767320176a200c6a20" - "0e410f77200e410d7773200e410a76736a2217200a6a200420106a220a20" - "02200b7371200b736a200a411a77200a41157773200a410777736a41bb95" - "a8b3076a22106a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20134119772013410e777320134103767320156a20" - "0d6a2012410f772012410d77732012410a76736a2215200b6a200620106a" - "220b2002200a73712002736a200b411a77200b41157773200b410777736a" - "41d2edf4f1076b22106a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20144119772014410e777320144103767320" - "136a200f6a2017410f772017410d77732017410a76736a221320026a2007" - "20106a2202200a200b7371200a736a2002411a7720024115777320024107" - "77736a41fba6b7ec066b22106a2207411e772007411377732007410a7773" - "20072004200673712004200671736a20114119772011410e777320114103" - "767320146a20086a2015410f772015410d77732015410a76736a2214200a" - "6a200320106a220a2002200b7371200b736a200a411a77200a4115777320" - "0a410777736a41dfae80ea056b22106a2203411e77200341137773200341" - "0a777320032006200773712006200771736a20164119772016410e777320" - "164103767320116a20096a2013410f772013410d77732013410a76736a22" - "11200b6a200520106a220b2002200a73712002736a200b411a77200b4115" - "7773200b410777736a41b5b396bf056b22106a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20184119772018410e" - "777320184103767320166a200e6a2014410f772014410d77732014410a76" - "736a221620026a200420106a2202200a200b7371200a736a2002411a7720" - "02411577732002410777736a4190e9d1ed036b22106a2204411e77200441" - "1377732004410a777320042003200573712003200571736a201941197720" - "19410e777320194103767320186a20126a2011410f772011410d77732011" - "410a76736a2218200a6a200620106a220a2002200b7371200b736a200a41" - "1a77200a41157773200a410777736a41dddccec4036b22106a2206411e77" - "2006411377732006410a777320062004200573712004200571736a201a41" - "1977201a410e7773201a4103767320196a20176a2016410f772016410d77" - "732016410a76736a2219200b6a200720106a220b2002200a73712002736a" - "200b411a77200b41157773200b410777736a41e7afb4f3026b22106a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "200c411977200c410e7773200c41037673201a6a20156a2018410f772018" - "410d77732018410a76736a221a20026a200320106a2202200a200b737120" - "0a736a2002411a772002411577732002410777736a41dcf39bcb026b2210" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a200d411977200d410e7773200d41037673200c6a20136a2019410f" - "772019410d77732019410a76736a220c200a6a200520106a220a2002200b" - "7371200b736a200a411a77200a41157773200a410777736a41fb94c7df00" - "6b22106a2205411e772005411377732005410a7773200520032007737120" - "03200771736a200f411977200f410e7773200f41037673200d6a20146a20" - "1a410f77201a410d7773201a410a76736a220d200b6a200420106a220b20" - "02200a73712002736a200b411a77200b41157773200b410777736a41f0c0" - "aa83016a22106a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20084119772008410e7773200841037673200f6a20" - "116a200c410f77200c410d7773200c410a76736a220f20026a200620106a" - "2202200a200b7371200a736a2002411a772002411577732002410777736a" - "41968293cd016a221c6a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20094119772009410e777320094103767320" - "086a20166a200d410f77200d410d7773200d410a76736a2210200a6a2007" - "201c6a22082002200b7371200b736a2008411a7720084115777320084107" - "77736a4188d8ddf1016a221c6a2207411e772007411377732007410a7773" - "20072004200673712004200671736a200e411977200e410e7773200e4103" - "767320096a20186a200f410f77200f410d7773200f410a76736a220a200b" - "6a2003201c6a22092002200873712002736a2009411a7720094115777320" - "09410777736a41cceea1ba026a221c6a2203411e77200341137773200341" - "0a777320032006200773712006200771736a20124119772012410e777320" - "1241037673200e6a20196a2010410f772010410d77732010410a76736a22" - "0b20026a2005201c6a220e2008200973712008736a200e411a77200e4115" - "7773200e410777736a41b5f9c2a5036a22026a2205411e77200541137773" - "2005410a777320052003200773712003200771736a20174119772017410e" - "777320174103767320126a201a6a200a410f77200a410d7773200a410a76" - "736a221220086a200220046a22082009200e73712009736a2008411a7720" - "08411577732008410777736a41b399f0c8036a22026a2204411e77200441" - "1377732004410a777320042003200573712003200571736a201541197720" - "15410e777320154103767320176a200c6a200b410f77200b410d7773200b" - "410a76736a221720096a200220066a22092008200e7371200e736a200941" - "1a772009411577732009410777736a41cad4e2f6046a22026a2206411e77" - "2006411377732006410a777320062004200573712004200571736a201341" - "19772013410e777320134103767320156a200d6a2012410f772012410d77" - "732012410a76736a2215200e6a200220076a220e2008200973712008736a" - "200e411a77200e41157773200e410777736a41cf94f3dc056a22026a2207" - "411e772007411377732007410a777320072004200673712004200671736a" - "20144119772014410e777320144103767320136a200f6a2017410f772017" - "410d77732017410a76736a221320086a200220036a22082009200e737120" - "09736a2008411a772008411577732008410777736a41f3dfb9c1066a2202" - "6a2203411e772003411377732003410a7773200320062007737120062007" - "71736a20114119772011410e777320114103767320146a20106a2015410f" - "772015410d77732015410a76736a221420096a200220056a22092008200e" - "7371200e736a2009411a772009411577732009410777736a41ee85bea407" - "6a22026a2205411e772005411377732005410a7773200520032007737120" - "03200771736a20164119772016410e777320164103767320116a200a6a20" - "13410f772013410d77732013410a76736a2211200e6a200220046a220e20" - "08200973712008736a200e411a77200e41157773200e410777736a41efc6" - "95c5076a22026a2204411e772004411377732004410a7773200420032005" - "73712003200571736a20184119772018410e777320184103767320166a20" - "0b6a2014410f772014410d77732014410a76736a221620086a200220066a" - "22082009200e73712009736a2008411a772008411577732008410777736a" - "41ec8fded9076b22026a2206411e772006411377732006410a7773200620" - "04200573712004200571736a20194119772019410e777320194103767320" - "186a20126a2011410f772011410d77732011410a76736a221220096a2002" - "20076a22092008200e7371200e736a2009411a7720094115777320094107" - "77736a41f8fbe399076b22116a2207411e772007411377732007410a7773" - "20072004200673712004200671736a201a411977201a410e7773201a4103" - "767320196a20176a2016410f772016410d77732016410a76736a2217200e" - "6a200320116a220e2008200973712008736a200e411a77200e4115777320" - "0e410777736a41868084fa066b22116a2203411e77200341137773200341" - "0a777320032006200773712006200771736a200c411977200c410e777320" - "0c41037673201a6a20156a2012410f772012410d77732012410a76736a22" - "1220086a200520116a22052009200e73712009736a2005411a7720054115" - "77732005410777736a4195a6bedd056b22156a2208411e77200841137773" - "2008410a777320082003200773712003200771736a200c200d411977200d" - "410e7773200d410376736a20136a2017410f772017410d77732017410a76" - "736a20096a200420156a22042005200e7371200e736a2004411a77200441" - "1577732004410777736a4189b89988046b22096a220c2003200873712003" - "200871736a200c411e77200c41137773200c410a77736a200d200f411977" - "200f410e7773200f410376736a20146a2012410f772012410d7773201241" - "0a76736a200e6a200620096a22062004200573712005736a2006411a7720" - "06411577732006410777736a418e8ebacc036b220d6a2102200c201d6a21" - "1d2007201b6a200d6a211b200820206a21202006201e6a211e200320236a" - "21232004201f6a211f200520226a2122200141406b22012024470d000b20" - "00202236021c2000201f3602182000201e3602142000201b360210200020" - "2336020c200020203602082000201d360204200020023602000b89010101" - "7f027f0240200328020404402003280208220445044020012002450d031a" - "41bda9c0002d00001a20014109490d022002100b0c030b20032802002004" - "2001200210150c020b20012002450d011a41bda9c0002d00001a20014109" - "490d002002100b0c010b200210010b210320002002360208200020032001" - "20031b36020420002003453602000b3000200128021c20002d0000410274" - "220041b4a5c0006a280200200041a8a5c0006a280200200128022028020c" - "1103000bfc0402037f017e23004180016b220224000240024020012d0000" - "220441c00171220341c000470440200241186a200141186a290000370300" - "200241106a200141106a290000370300200241086a200141086a29000037" - "030020022001290000220537030020022005a7413f713a0000200241406b" - "2002102e20022d0040450d01200220022d00413a007f41a88ec000411f20" - "0241ff006a41988ec00041c88ec0001013000b02402004413f710d002001" - "2d00010d0020012d00020d0020012d00030d0020012d00040d0020012d00" - "050d0020012d00060d0020012d00070d0020012d00080d0020012d00090d" - "0020012d000a0d0020012d000b0d0020012d000c0d0020012d000d0d0020" - "012d000e0d0020012d000f0d0020012d00100d0020012d00110d0020012d" - "00120d0020012d00130d0020012d00140d0020012d00150d0020012d0016" - "0d0020012d00170d0020012d00180d0020012d00190d0020012d001a0d00" - "20012d001b0d0020012d001c0d0020012d001d0d0020012d001e0d002001" - "2d001f0d00200041c1013a0020200041033a00000c020b20004200370300" - "200041c0003a0020200041186a4200370300200041106a42003703002000" - "41086a42003703000c010b200241386a200241e8006a2903003703002002" - "41306a200241e0006a290300370300200220022903503703202002200241" - "d8006a2903003703282003044020002002290320370300200020033a0020" - "200041086a2002290328370300200041186a200241386a29030037030020" - "0041106a200241306a2903003703000c010b200241003602502002410136" - "0244200241a88cc00036024020024204370248200241406b419c8dc00010" - "1a000b20024180016a24000bf90a02057f097e23004190036b2207240020" - "00290300220c200041086a290300220d8450047e420005200741f0016a20" - "0c2001104d20074190026a200d2001104d200741e0016a200c2002104d20" - "074180026a200d2002104d200741b0016a200c2003104d200741a0016a20" - "0d2003104d200741d0016a200c2004104d200741c0016a200d2004104d20" - "072903f0012112200741c8016a290300200741a8016a290300220d200729" - "03c0017c220c200d54ad7c200c200741d8016a2903007c220d200c54ad7c" - "200d20072903d001220e20072903a0017c220c200e54ad200c2007418802" - "6a29030020074198026a290300220f2007290380027c220e200f54ad7c20" - "0e200741e8016a2903007c220f200e54ad7c200f20072903e00122102007" - "290390027c220e201054ad200e200741f8016a2903007c2213200e54ad7c" - "7c2210200f54ad7c7c2211200c54ad7c2011200741b8016a290300201020" - "072903b0017c220e201054ad7c7c220f201154ad7c7c2210200d54ad7c0b" - "21112000290310220c200041186a290300220d8450047e420005200741f0" - "006a200c2001104d20074190016a200d2001104d200741e0006a200c2002" - "104d20074180016a200d2002104d200741306a200c2003104d200741206a" - "200d2003104d200741d0006a200c2004104d200741406b200d2004104d20" - "0741c8006a290300200741286a290300220320072903407c2204200354ad" - "7c2004200741d8006a2903007c2203200454ad7c20032007290350220220" - "117c2204200254ad200420072903207c2202200454ad7c20022007418801" - "6a29030020074198016a29030022012007290380017c2204200154ad7c20" - "04200741e8006a2903007c2201200454ad7c20012007290360220c200f7c" - "2204200c54ad20042007290390017c220c200454ad7c200c200741f8006a" - "29030020072903702204200e7c220e200454ad7c7c220f200c54ad7c7c22" - "0c200154ad7c7c2204200254ad7c2004200741386a290300200729033022" - "0120107c2202200154ad7c2002200c7c2210200254ad7c7c2211200454ad" - "7c7c2214200354ad7c0b2104200720143703d002200720103703c0022007" - "200e3703b002200720123703a002200720043703d802200720113703c802" - "2007200f3703b802200720133703a80220074188036a4200370300200741" - "80036a4200370300200741f8026a4200370300200742003703f002200741" - "f0026a210a41ff032109420021034200210442002101420021024201210d" - "0340200741106a2009410776410474220b200741a0026a6a220829030020" - "08290308200941ff00712208104e2004423f88210c20044201862003423f" - "888421042007290310420183200342018684210302400240024002400240" - "200c200142018684220c42ddb0858ce8b691a8b87f852002420186200142" - "3f8884220242a9c0c689aece93b230858450044020032005542004200654" - "20042006511b450d0142ddb0858ce8b691a8b87f210142a9c0c689aece93" - "b23021020c020b200c42ddb0858ce8b691a8b87f58200242a9c0c689aece" - "93b23058200242a9c0c689aece93b230511b450d00200c21010c010b2002" - "42a9c0c689aece93b2307d200c42a3cffaf397c9eed7c7007c2202200420" - "0654ad200420067d22042003200554ad220f54ad7c7d220142017c221020" - "0254ad200c42ddb0858ce8b691a8b87f54ad7d2010420052ad7c50ad7d21" - "022004200f7d2104200320057d2103200941016a41810249200d42005271" - "0d014200210d0b2009450d010c020b4201210d20072008104f200a200b6a" - "22082008290300200729030084370300200841086a220820082903002007" - "41086a2903008437030020090d010b200020023703182000200137031020" - "0020043703082000200337030020074190036a24000f0b200941016b2109" - "0c000b000beb0101017f41e0a9c00041e0a9c0002d00002200410120001b" - "3a00000240200004400340024002400240200041016b0e03000501020b03" - "4041e0a9c0002d000022004101460d000b02400240200041016b0e030006" - "01030b000b41a49bc000412641cc9bc0001011000b41a89ac000410d4194" - "9bc0001011000b41e0a9c00041e0a9c0002d00002200410120001b3a0000" - "20000d000b0b41d8a9c00042a9c0c689aece93b23037030041d0a9c00042" - "ddb0858ce8b691a8b87f37030041c8a9c000428d95c7c396d2dac0977f37" - "030041c0a9c00042c7faf3c3ed82a3903c37030041e0a9c00041023a0000" - "0b0b840202047e017f200041086a29030021092000290300210a0240417f" - "2000290310220b200385200041186a290300220c20048584420052200320" - "0b562004200c562004200c511b1b220d417f470440200d41ff01710d0120" - "01200a58200220095820022009511b0d010b20072007200b7c220756ad20" - "07200620097c220b200654ad200b2005200a7c220a200554ad7c2209200b" - "54ad7c7c220b200754ad7c2008200c7c7c210c0b2000200a20017d370300" - "2000200920027d22072001200a56ad22017d37030820002003427f852203" - "200b7c220a2002200956ad2001200756ad7c7d42017c2209370310200020" - "0c20047d2003200a56ad2009200a54ad7c50ad7d3703180bbe3c020e7f04" - "7e23004180016b2203240041bda9c0002d00001a0240412010012202450d" - "00200242a9c0c689aece93b230370018200242ddb0858ce8b691a8b87f37" - "00102002428d95c7c396d2dac0977f370008200242c7faf3c3ed82a3903c" - "3700002003200210262000027f0240024002400240024002400240024002" - "40024002400240024002400240027f024002400240024002400240024002" - "7f02400240027f0240024002400240024002400240024002400240024002" - "400240024002400240024002400240200241046b28020022044178714124" - "4128200441037122051b4f044020054100200441c8004f1b0d0120021004" - "41bda9c0002d00001a412010012202450d30200241186a2204200141186a" - "290000370000200220012900002210370000200241106a2205200141106a" - "290000370000200241086a2208200141086a29000037000020022002411f" - "6a22012d00003a0000200120103c000020022d0001210120022002411e6a" - "22072d00003a0001200720013a00002002411d6a22012d00002107200120" - "022d00023a0000200220073a00022002411c6a22012d0000210720012002" - "2d00033a0000200220073a00032002411b6a22012d00002107200120022d" - "00043a0000200220073a00042002411a6a22012d00002107200120022d00" - "053a0000200220073a0005200241196a22012d00002107200120022d0006" - "3a0000200220073a000620042d00002101200420022d00073a0000200220" - "013a0007200241176a22012d00002104200120082d00003a000020082004" - "3a0000200241166a22012d00002104200120022d00093a0000200220043a" - "0009200241156a22012d00002104200120022d000a3a0000200220043a00" - "0a200241146a22012d00002104200120022d000b3a0000200220043a000b" - "200241136a22012d00002104200120022d000c3a0000200220043a000c20" - "0241126a22012d00002104200120022d000d3a0000200220043a000d2002" - "41116a22012d00002104200120022d000e3a0000200220043a000e20052d" - "00002101200520022d000f3a0000200220013a000f2003410c6a20021026" - "200241046b280200220141787141244128200141037122041b490d022004" - "4100200141c8004f1b0d032002100420032802082202450d120240024002" - "40200241016b220241feffffff0371450440200241ffffffff0371220441" - "016a2205410371210142002110200328020422082102200441034f044020" - "0541fcffffff07712104034020104280017c2110200241106a2102200441" - "046b22040d000b0b2001450d020340200235020020108620117c21112010" - "42207c2110200241046a2102200141016b22010d000b2011428080808010" - "540d010b200341406b200341146a2802003602002003200329020c370338" - "200341d0006a200341086a28020022043602002003200329020037034820" - "04450d0720032802402207450440200341206a418098c000280200220236" - "02002003412c6a2002360200200341f897c0002902002210370318200320" - "10370224200328024822020440200328024c220441046b28020022014178" - "7122052002410274220241044108200141037122011b6a490d0a20014100" - "2005200241276a4b1b0d0b200410040b20032802382202450d2520032802" - "3c220441046b280200220141787122052002410274220241044108200141" - "037122011b6a490d0b200141002005200241276a4b1b0d0c200410040c25" - "0b0240027f02400240024020044101460440200328024c220c2802002202" - "4101470d012003412c6a418098c000280200360200200341206a20034114" - "6a2802003602002003200329020c370318200341f897c000290200370224" - "20032802482202450d2a200c41046b280200220141787122042002410274" - "220241044108200141037122011b6a490d12200141002004200241276a4b" - "1b0d13200c10040c2a0b200328024c210c200328023c210b0240417f2004" - "200747200420074b1b22050d0020074102742102200b41046b2106200441" - "02742101200c41046b2109200420076b21070340200204402001450d0720" - "0220066a2105200120096a2108200241046b2102200141046b2101417f20" - "082802002208200528020022054720052008491b2205450d010c020b0b41" - "7f4100200741ffffffff03711b21050b200541ff01710e020204010b2002" - "450d1220074102742101200328023c2109200241ffff034d044020094104" - "6b2106410021040340200120066a22052005280200220541107622082008" - "20044110747220026e220420026c6b411074200541ffff03717222052002" - "6e22082004411074723602002005200220086c6b2104200141046b22010d" - "000b0c280b2002ad2110200741ffffffff036a220541ffffffff03712202" - "45044042002111200120096a0c270b200241016a41feffffff0771210120" - "0741027420096a41086b2102420021110340200241046a22042004350200" - "201142208684221120108022123e0200200220023502002011201020127e" - "7d42208684221120108022123e02002011201020127e7d2111200241086b" - "2102200141026b22010d000b0c250b2003412c6a200341146a2802003602" - "002003200329020c370224200341186a0c010b2003410036024020032802" - "38047f200b05200341386a418c87c0001023200328023c0b410136020020" - "0341406b4101360200200341206a41013602002003200329033837031820" - "0341246a0b220241086a418098c000280200360200200241f897c0002902" - "0037020020032802482202450d25200c41046b2802002201417871220420" - "02410274220241044108200141037122011b6a490d102001410020042002" - "41276a4b1b0d11200c10040c250b200c20044102746a41046b2202450d20" - "20022802002202672208450440200341f8006a200341146a280200360200" - "2003200329020c370370200341186a200341f0006a200c20041024200328" - "02482202450d25200c41046b280200220141787122042002410274220241" - "044108200141037122011b6a490d12200141002004200241276a4b1b0d13" - "200c10040c250b024002402003280238418080808078470d00200b280208" - "0d002003410036026c20034280808080c0003702640c010b200341e4006a" - "2003410c6a2002452008411f7110250b200341186a200341e4006a027f02" - "402003280248418080808078470d00200c2802080d004100210420034100" - "3602704100210541040c010b200341f0006a20032002452008411f711025" - "200328027021042003280278210520032802740b220120051024200341e0" - "006a200341206a28020036020020032003290218370358200328022c2105" - "200328022821092003280224210c20040440200141046b28020022074178" - "7122062004410274220441044108200741037122071b6a490d1420074100" - "2006200441276a4b1b0d15200110040b02400240200c4180808080784604" - "404100210120092802080d0141042105410021040c220b41002101200545" - "0d20200520024522044d0d20200520046b210b20020d0102400240200b41" - "0274220a20092206200620044102746a22056b4b04402005200a6a210120" - "06200a6a2106200a4110490d0141002006410371220d6b210e0240200641" - "7c71220220064f0d00200d41016b210f0240200d450440200121040c010b" - "200d2107200121040340200641016b2206200441016b22042d00003a0000" - "200741016b22070d000b0b200f4103490d00200441046b21040340200641" - "016b200441036a2d00003a0000200641026b200441026a2d00003a000020" - "0641036b200441016a2d00003a0000200641046b220620042d00003a0000" - "200441046b210420022006490d000b0b2002200a200d6b2204417c71220a" - "6b21064100200a6b210702402001200e6a2201410371450440200220064d" - "0d01200420056a41046b21050340200241046b2202200528020036020020" - "0541046b2105200220064b0d000b0c010b200220064d0d00200141037422" - "0a411871210d2001417c71220f41046b21054100200a6b411871210e200f" - "280200210a0340200241046b2202200a200e742005280200220a200d7672" - "360200200541046b2105200220064b0d000b0b2004410371210a20012007" - "6a21010c010b200a41104f044002402006410020066b41037122076a2204" - "20064d0d00200741016b210d200521022007044020072101034020062002" - "2d00003a0000200241016a2102200641016a2106200141016b22010d000b" - "0b200d4107490d000340200620022d00003a0000200641016a200241016a" - "2d00003a0000200641026a200241026a2d00003a0000200641036a200241" - "036a2d00003a0000200641046a200241046a2d00003a0000200641056a20" - "0241056a2d00003a0000200641066a200241066a2d00003a000020064107" - "6a200241076a2d00003a0000200241086a2102200641086a22062004470d" - "000b0b2004200a20076b2201417c71220d6a21060240200520076a220241" - "0371450440200420064f0d01200221050340200420052802003602002005" - "41046a2105200441046a22042006490d000b0c010b200420064f0d002002" - "410374220a41187121072002417c71220f41046a21054100200a6b411871" - "210e200f280200210a03402004200a2007762005280200220a200e747236" - "0200200541046a2105200441046a22042006490d000b0b2001410371210a" - "2002200d6a21050b20062006200a6a22044f0d01200a41016b2101200a41" - "0771220204400340200620052d00003a0000200541016a2105200641016a" - "2106200241016b22020d000b0b20014107490d010340200620052d00003a" - "0000200641016a200541016a2d00003a0000200641026a200541026a2d00" - "003a0000200641036a200541036a2d00003a0000200641046a200541046a" - "2d00003a0000200641056a200541056a2d00003a0000200641066a200541" - "066a2d00003a0000200641076a200541076a2d00003a0000200541086a21" - "05200641086a22062004470d000b0c010b2006200a6b220220064f0d0020" - "0a41016b2104200a410371220504400340200641016b2206200141016b22" - "012d00003a0000200541016b22050d000b0b20044103490d00200141046b" - "21050340200641016b200541036a2d00003a0000200641026b200541026a" - "2d00003a0000200641036b200541016a2d00003a0000200641046b220620" - "052d00003a0000200541046b210520022006490d000b0b0c010b41042105" - "200941046a28020021072009280208220420024522024d04402004410274" - "21022004044041bda9c0002d00001a200210012205450d360b2005200720" - "02104c1a0c210b41bda9c0002d00001a200420026b220b41027422011001" - "2209450d342009200720024102746a2001104c1a200b210c0b2008411f71" - "2201450d1c200b450440410021010c1e0b41002105410020086b411f7121" - "042009200b4102746a2102200b41016b41ffffffff0371220741016a2206" - "410371210820074103490d1b200641fcffffff077121070340200241046b" - "220620062802002206200176200572360200200241086b22052006200474" - "20052802002205200176723602002002410c6b2206200520047420062802" - "00220620017672360200200241106b220220062004742002280200220520" - "01767236020020052004742105200741046b22070d000b0c1b0b2011500d" - "14200328021421022003280210210502402011428080045a04402002450d" - "0320024102742104200241ffffffff036a220741ffffffff037122020d01" - "42002110200420056a0c180b2002450d022011a721040c180b200241016a" - "41feffffff07712101200420056a41086b21024200211003402002350200" - "200241046a35020020104220868420118242208684201182211020024108" - "6b2102200141026b22010d000b0c150b2003280210210520032802142202" - "0d160b410421074100210241000c170b41f996c000412e41a897c0001011" - "000b41b897c000412e41e897c0001011000b41f996c000412e41a897c000" - "1011000b41b897c000412e41e897c0001011000b20034100360228200341" - "0136021c200341a099c00036021820034204370220200341186a41fc86c0" - "00101a000b41f996c000412e41a897c0001011000b41b897c000412e41e8" - "97c0001011000b41f996c000412e41a897c0001011000b41b897c000412e" - "41e897c0001011000b41f996c000412e41a897c0001011000b41b897c000" - "412e41e897c0001011000b200341003602282003410136021c200341a099" - "c00036021820034204370220200341186a41ec86c000101a000b41f996c0" - "00412e41a897c0001011000b41b897c000412e41e897c0001011000b41f9" - "96c000412e41a897c0001011000b41b897c000412e41e897c0001011000b" - "41f996c000412e41a897c0001011000b41b897c000412e41e897c0001011" - "000b200341003602282003410136021c200341a099c00036021820034204" - "370220200341186a41989ac000101a000b200241086a0b21022007410171" - "047e201005200241046b3502002010422086842011820ba721010c010b20" - "0241027421024100210103402001411074200241046b220220056a280200" - "220141107672200470411074200141ffff037172200470210120020d000b" - "0b41002102200341206a418098c000280200360200200341f897c0002902" - "0037031820014504404104210741000c010b200341186a41f498c0001023" - "200328021c220720013602004101210220032802180b210a024002400240" - "0240200328020022010440200841046b2802002204417871220620014102" - "74220141044108200441037122041b6a490d01200441002006200141276a" - "4b1b0d02200810040b200328020c2201450d0e200541046b280200220441" - "787122082001410274220141044108200441037122041b6a490d02200441" - "002008200141276a4b1b0d03200510040c0e0b41f996c000412e41a897c0" - "001011000b41b897c000412e41e897c0001011000b41f996c000412e41a8" - "97c0001011000b41b897c000412e41e897c0001011000b2008450d002002" - "41046b21020340200220022802002207200176200572360200200241046b" - "210220072004742105200841016b22080d000b0b41002101200b450d0020" - "09200b41027422026a41046b2802000440200b21010c010b200941046b21" - "07200b41ffffffff037121040340200421052002450d01200441016b2104" - "200220076a2108200241046b21022008280200450d000b200b2005200520" - "0b4b1b21010b2001200c4102764f0d00024002402001200c4d0440410021" - "04200c450440200921050c050b200c41027421022001450440200941046b" - "2802002205417871220841044108200541037122051b20026a490d022005" - "41002008200241276a4b1b0d0320091004410421050c050b200121042009" - "200241042001410274101522050d040c180b200341003602282003410136" - "021c200341ec84c00036021820034204370220200341186a41f484c00010" - "1a000b41f996c000412e41a897c0001011000b41b897c000412e41e897c0" - "001011000b200c2104200921050b200341206a200341e0006a2802003602" - "00200320032903583703182003200136022c200320053602282003200436" - "02240c040b419c87c0001020000b200241086a0b21022005410171047e20" - "1105200241046b22022002350200201142208684221120108022123e0200" - "2011201020127e7d0ba721040b2003280238210b02402009200741027422" - "026a41046b2802000d00200941046b210620072101034020012105200245" - "0440410021070c020b200541016b2101200220066a2108200241046b2102" - "2008280200450d000b20072005200520074b1b21070b0240200b41027620" - "074d0440200b21020c010b2007200b4b0d0341002102200b450d00200b41" - "027421012007450440200941046b28020022054178712208410441082005" - "41037122051b20016a490d05200541002008200141276a4b1b0d06200910" - "04410421090c010b2009200141042007220241027410152209450d100b20" - "034100360250200404402003280248047f200c05200341c8006a41dc86c0" - "001023200328024c0b2004360200200341013602500b2003412c6a200341" - "d0006a280200360200200320032903483702242003200936021c20032002" - "3602180b200328022c2102200328022821072003280224210a2003280218" - "2201450d00200328021c220541046b280200220441787122082001410274" - "220141044108200441037122041b6a490d04200441002008200141276a4b" - "1b0d05200510040b200245044041bda9c0002d00001a4101210d41011001" - "2204450d0e200441003a0000410121010c080b4100210102402002ad4205" - "86200720024102746a41046b28020067ad7d221042038820104207834200" - "52ad7c221050044041012104410021050c010b41bda9c0002d00001a2010" - "a7220510012204450d0e0b200341003602202003200436021c2003200536" - "02182007200241016b22054102746a210920050440200241027441046b21" - "06410021020340200220076a280200210120032802182002460440200341" - "186a41ac88c0001018200328021c21040b200220046a20013a0000200320" - "0241016a2205360220200141087621082003280218200546044020034118" - "6a41ac88c0001018200328021c21040b200220046a41016a20083a000020" - "03200541016a220536022020014110762108200328021820054604402003" - "41186a41ac88c0001018200328021c21040b200220046a41026a20083a00" - "002003200541016a22053602202001411876210120032802182005460440" - "200341186a41ac88c0001018200328021c21040b200220046a41036a2001" - "3a00002003200541016a2205360220200241046a21012005210220012006" - "470d000b0b20092802002202450d05034020032802182001460440200341" - "186a419c88c00010180b200328021c220420016a20023a00002003200141" - "016a2201360220200241ff014b21052002410876210220050d000b0c060b" - "200341003602282003410136021c200341ec84c000360218200342043702" - "20200341186a41f484c000101a000b41f996c000412e41a897c000101100" - "0b41b897c000412e41e897c0001011000b41f996c000412e41a897c00010" - "11000b41b897c000412e41e897c0001011000b200328021c21040b200328" - "0218210d200141014b0d010b200341306a4200370300200341286a420037" - "0300200341206a4200370300200342003703180c010b200120046a210c41" - "002102200141017622084101470440200141016b2105200841feffffff07" - "71210b0340200420056a22062d000021092006200220046a22082d00003a" - "0000200820093a0000200c2002417e736a22062d00002109200620084101" - "6a22082d00003a0000200820093a0000200541026b2105200b200241026a" - "2202470d000b0b20014102710440200220046a22052d000021082005200c" - "2002417f736a22022d00003a0000200220083a00000b200341306a420037" - "0300200341286a4200370300200341206a42003703002003420037031820" - "0141204b0d010b200320016b41386a20042001104c1a2003290328221042" - "388620104280fe0383422886842010428080fc0783421886201042808080" - "f80f834208868484201042088842808080f80f832010421888428080fc07" - "838420104228884280fe038320104238888484842112200341306a290300" - "221042388620104280fe0383422886842010428080fc0783421886201042" - "808080f80f834208868484201042088842808080f80f8320104218884280" - "80fc07838420104228884280fe038320104238888484842113417f200329" - "0318221042b0c8b99297bc8cd02985200341206a290300221142b8a195b2" - "9bb0a0acdd008584420052201142388620114280fe038342288684201142" - "8080fc0783421886201142808080f80f8342088684842011420888428080" - "80f80f832011421888428080fc07838420114228884280fe038320114238" - "88848484221142ddb0858ce8b691a8b87f54201042388620104280fe0383" - "422886842010428080fc0783421886201042808080f80f83420886848420" - "1042088842808080f80f832010421888428080fc07838420104228884280" - "fe03832010423888848484221042a9c0c689aece93b23054201042a9c0c6" - "89aece93b230511b1b2202417f47044041022101200241ff01710d022013" - "42c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95" - "c7c396d2dac0977f511b450d020b20002011370320200020133703102000" - "20103703282000201237031841000c020b410021010b200020013a000141" - "010b3a00000240024002400240200a0440200741046b2802002202417871" - "2201200a410274220541044108200241037122021b6a490d012002410020" - "01200541276a4b1b0d02200710040b200d0440200441046b280200220241" - "7871220141044108200241037122021b200d6a490d03200241002001200d" - "41276a4b1b0d04200410040b20034180016a24000f0b41f996c000412e41" - "a897c0001011000b41b897c000412e41e897c0001011000b41f996c00041" - "2e41a897c0001011000b41b897c000412e41e897c0001011000b000bc80d" - "02057f167e230041e0006b22032400200341386a2204200141186a290300" - "370300200341306a2205200141106a290300370300200320012903003703" - "202003200141086a29030037032842ddb0858ce8b691a8b87f2112200341" - "206a20022903002219200241086a290300221a2002290310221b20024118" - "6a290300221c42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" - "042903002113200529030021142003290320211520032903282116200341" - "106a2206200141306a290300370300200341186a2207200141386a290300" - "370300200320012903203703002003200141286a29030037030820032002" - "290320220e200241286a290300220c20022903302211200241386a290300" - "221d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004200729" - "030037030020052006290300370300200320032903083703282003200329" - "0300370320200341206a42c6faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b02400240024020142005290300220b" - "7c220d2016200329032822087c2209200854ad2009201520032903202208" - "7c220a200854ad7c2208200954ad7c7c220942ddb0858ce8b691a8b87f85" - "200b200d56ad2009200d54ad7c201320042903007c7c220d42a9c0c689ae" - "ce93b2308584500440200a42c7faf3c3ed82a3903c542008428d95c7c396" - "d2dac0977f542008428d95c7c396d2dac0977f511b450d0242a9c0c689ae" - "ce93b230210d0c010b200942deb0858ce8b691a8b87f54200d42a9c0c689" - "aece93b23054200d42a9c0c689aece93b230511b450d01200921120b200a" - "2117200821180c010b200d20092008200a42c7faf3c3ed82a3903c7d2217" - "200a5aad220a7d220b42f3eab8bce9ada5bfe8007c2218200b54ad200820" - "0a54ad7d7c2208200954ad200842a2cffaf397c9eed7c7007c2212200854" - "ad7c50ad7d42a9c0c689aece93b2307d210d0b42ddb0858ce8b691a8b87f" - "210f024002402001290330221020012903107c2209200141286a29030022" - "0a200141086a2903007c2208200a54ad20082001290320220a2001290300" - "7c220b200a54ad7c220a200854ad7c7c220842ddb0858ce8b691a8b87f85" - "2009201054ad2008200954ad7c200141386a290300200141186a2903007c" - "7c220942a9c0c689aece93b2308584500440200b42c7faf3c3ed82a3903c" - "54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f511b" - "450d01200b2110200a210b42a9c0c689aece93b23021090c020b200842de" - "b0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0c689" - "aece93b230511b450d00200b2110200a210b2008210f0c010b2009200820" - "0a200b42c7faf3c3ed82a3903c7d2210200b5aad220f7d220942f3eab8bc" - "e9ada5bfe8007c220b200954ad200a200f54ad7d7c220a200854ad200a42" - "a2cffaf397c9eed7c7007c220f200a54ad7c50ad7d42a9c0c689aece93b2" - "307d21090b2003200f37035020032010370340200320093703582003200b" - "37034842ddb0858ce8b691a8b87f210b024002402011201b7c2209200c20" - "1a7c2208200c54ad2008200e20197c220c200e54ad7c220a200854ad7c7c" - "220842ddb0858ce8b691a8b87f852009201154ad2008200954ad7c201c20" - "1d7c7c220942a9c0c689aece93b2308584500440200c42c7faf3c3ed82a3" - "903c54200a428d95c7c396d2dac0977f54200a428d95c7c396d2dac0977f" - "511b450d01200c210e200a210c42a9c0c689aece93b23021090c020b2008" - "42deb0858ce8b691a8b87f54200942a9c0c689aece93b23054200942a9c0" - "c689aece93b230511b450d00200c210e200a210c2008210b0c010b200920" - "08200a200c42c7faf3c3ed82a3903c7d220e200c5aad22117d220b42f3ea" - "b8bce9ada5bfe8007c220c200b54ad200a201154ad7d7c220a200854ad20" - "0a42a2cffaf397c9eed7c7007c220b200a54ad7c50ad7d42a9c0c689aece" - "93b2307d21090b200341406b200e200c200b200942c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b200341406b201520162014201342c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" - "c0c689aece93b230102d200341406b200329030020032903082003290310" - "200341186a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2000200d37031820" - "002012370310200020183703082000201737030020002003290340370320" - "200041286a2003290348370300200041306a200341d0006a290300370300" - "200041386a200341d8006a290300370300200341e0006a24000ba706010a" - "7e42ddb0858ce8b691a8b87f210a02400240024020022903102206200129" - "03107c2207200241086a2903002203200141086a2903007c2204200354ad" - "20042002290300220320012903007c2205200354ad7c2203200454ad7c7c" - "220442ddb0858ce8b691a8b87f852006200756ad2004200754ad7c200241" - "186a290300200141186a2903007c7c220742a9c0c689aece93b230858450" - "0440200542c7faf3c3ed82a3903c542003428d95c7c396d2dac0977f5420" - "03428d95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021070c" - "010b200442deb0858ce8b691a8b87f54200742a9c0c689aece93b2305420" - "0742a9c0c689aece93b230511b450d012004210a0b2005210b2003210c0c" - "010b200720042003200542c7faf3c3ed82a3903c7d220b20055aad22057d" - "220642f3eab8bce9ada5bfe8007c220c200654ad2003200554ad7d7c2203" - "200454ad200342a2cffaf397c9eed7c7007c220a200354ad7c50ad7d42a9" - "c0c689aece93b2307d21070b42ddb0858ce8b691a8b87f21080240024020" - "02290330220920012903307c2204200241286a2903002205200141286a29" - "03007c2203200554ad20032002290320220520012903207c2206200554ad" - "7c2205200354ad7c7c220342ddb0858ce8b691a8b87f852004200954ad20" - "03200454ad7c200241386a290300200141386a2903007c7c220442a9c0c6" - "89aece93b2308584500440200642c7faf3c3ed82a3903c542005428d95c7" - "c396d2dac0977f542005428d95c7c396d2dac0977f511b450d0120062109" - "2005210642a9c0c689aece93b23021040c020b200342deb0858ce8b691a8" - "b87f54200442a9c0c689aece93b23054200442a9c0c689aece93b230511b" - "450d002006210920052106200321080c010b200420032005200642c7faf3" - "c3ed82a3903c7d220920065aad22087d220442f3eab8bce9ada5bfe8007c" - "2206200454ad2005200854ad7d7c2205200354ad200542a2cffaf397c9ee" - "d7c7007c2208200554ad7c50ad7d42a9c0c689aece93b2307d21040b2000" - "2008370330200020093703202000200a3703102000200b37030020002004" - "37033820002006370328200020073703182000200c3703080bf10802087f" - "087e23004180016b22022400200141386a290300210e200141286a290300" - "210b200141186a2203290300210d2001290330210f2001290320210a2001" - "290310210c02400240024020012903002210200141086a22042903002211" - "844200520d00200c200d844200520d00200a200b844200520d00200e200f" - "84500d010b200241186a22052003290300370300200241106a2206200141" - "106a22072903003703002002200429030037030820022001290300370300" - "200220102011200c200d42c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f102b200241386a2204200141206a220341186a29030037030020024130" - "6a2208200341106a22092903003703002002200341086a29030037032820" - "022003290300370320200241206a200a200b200f200e42c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f102b200241206a42c6faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2002200229" - "032020022903282008290300200429030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d2000027e2002290300220d2006290300220c842002290308220b200529" - "0300220a84845004404200210f42000c010b200241d8006a2204200a3703" - "002002200c3703502002200d3703402002200b370348200242a9c0c689ae" - "ce93b230370378200242ddb0858ce8b691a8b87f3703702002428d95c7c3" - "96d2dac0977f370368200242c7faf3c3ed82a3903c370360200241406b20" - "0241e0006a103a2004290300210d2002290348210c2002290340210b2002" - "290350210a200241d0006a20072903003703002004200141186a29030037" - "0300200220012903003703402002200141086a290300370348200241406b" - "200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b200241f8006a2201200341186a290300370300200241f0006a22042009" - "2903003703002002200341086a2903003703682002200329030037036020" - "0241e0006a200b200c200a200d42c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f102b2004290300220c20022903602210842001290300220e2002" - "290368220b84845004404200210c4200210b4200210a4200210e4200210f" - "42010c010b4200210f427f4200427f4200201042788342c7faf3c3ed82a3" - "903c561b220a200a200b54ad7d200a200b7d220a42f3eab8bce9ada5bfe8" - "007d220b200a54ad7c42017c2211200c7d220d42a4cffaf397c9eed7c700" - "7d220a200d54ad200c201156ad7d427f511b200e7d42a9c0c689aece93b2" - "307c210e42c7faf3c3ed82a3903c20107d210c42010b3703002000200a37" - "03402000200c370330200020022903403703102000200f3703082000200e" - "3703482000200b370338200041186a2002290348370300200041206a2002" - "41d0006a290300370300200041286a200241d8006a2903003703000c010b" - "20004200370308200042003703000b20024180016a24000b090020004100" - "3602000b7b01027f230041106b2203240041f0a5c00041f0a5c000280200" - "220441016a360200024020044100480d00024041bca9c0002d0000450440" - "41b8a9c00041b8a9c00028020041016a36020041eca5c00028020041004e" - "0d010c020b200341086a20002001110000000b41bca9c00041003a000020" - "02450d00000b000b0c00200020012902003703000bba0201047f411f2102" - "20004200370210200141ffffff074d04402001410620014108766722026b" - "7641017120024101746b413e6a21020b2000200236021c200241027441f4" - "a5c0006a2103410120027422044190a9c000280200714504402003200036" - "0200200020033602182000200036020c200020003602084190a9c0004190" - "a9c0002802002004723602000f0b02400240200120032802002204280204" - "417871460440200421020c010b2001411920024101766b41002002411f47" - "1b742103034020042003411d764104716a41106a22052802002202450d02" - "200341017421032002210420022802044178712001470d000b0b20022802" - "082203200036020c20022000360208200041003602182000200236020c20" - "0020033602080f0b20052000360200200020043602182000200036020c20" - "0020003602080bd20102067f017e230041206b2201240002400240200028" - "02002203417f460d00410420034101742202200341016a2204200220044b" - "1b2202200241044d1b2204ad42e0007e22074220884200520d002007a722" - "0641f0ffffff074b0d004100210220012003047f2001200341e0006c3602" - "1c2001200028020436021441100520020b360218200141086a2006200141" - "146a103720012802084101470d0120012802102102200128020c21050b20" - "0541dca4c0001019000b200128020c210320002004360200200020033602" - "04200141206a24000b7f01017f027f0240027f0240200228020404402002" - "28020822034504402001450d0441bda9c0002d00001a0c020b2002280200" - "20034110200110150c020b2001450d0241bda9c0002d00001a0b2001100b" - "0b2202411020021b21032002450c010b4110210341000b21022000200136" - "020820002003360204200020023602000bd20102067f017e230041206b22" - "0124000240024020002802002203417f460d004104200341017422022003" - "41016a2204200220044b1b2202200241044d1b2204ad42c0017e22074220" - "884200520d002007a7220641f0ffffff074b0d004100210220012003047f" - "2001200341c0016c36021c2001200028020436021441100520020b360218" - "200141086a2006200141146a103720012802084101470d01200128021021" - "02200128020c21050b200541eca4c0001019000b200128020c2103200020" - "0436020020002003360204200141206a24000bdd0102067f017e23004120" - "6b2202240020002802002204417f460440410020011019000b4104200441" - "01742203200441016a2205200320054b1b2203200341044d1b2205ad42c0" - "017e22084220884200520440410020011019000b02402008a7220741f0ff" - "ffff074d04404100210320022004047f2002200441c0016c36021c200220" - "0028020436021441100520030b360218200241086a2007200241146a1037" - "20022802084101470d01200228020c2106200228021021030b2006200110" - "19000b200228020c21042000200536020020002004360204200241206a24" - "000b830b02037f167e230041c0016b22022400200241186a220320004118" - "6a290300370300200241106a2204200041106a2903003703002002200029" - "03003703002002200041086a290300370308200241386a200141186a2903" - "002218370300200241306a200141106a2903002213370300200220014108" - "6a2903002214370328200220012903002215370320200242003703582002" - "42003703502002420037034820024201370340200241f8006a2201420037" - "0300200241f0006a42003703002002420037036820024200370360200329" - "0300210e2004290300210f2002290308210a200229030021072013211020" - "182111201521082014210b03400240200242003703980120024200370390" - "0120024200370388012002420137038001200220024180016a104a450440" - "200241406b21010c010b200241b8016a20024198016a2903003703002002" - "41b0016a20024190016a29030037030020022002290388013703a8012002" - "2002290380013703a001200241206a200241a0016a104a450440200241e0" - "006a21010c010b200241d8006a2903002112200229035021052002290348" - "21162002290340210d2007a74101714504400340200a423f862007420188" - "8421070240200da74101714504402016423f86200d42018884210d200542" - "3f8620164201888421160c010b200520137c2209201420167c2205201454" - "ad2005200d20157c220d201554ad7c2206200554ad7c7c2205423f862006" - "4201888421162006423f86200d42018884210d2009201354ad2005200954" - "ad7c201220187c7c21120b200f423f86200a42018884210a200e423f8620" - "0f42018884210f200e420188210e2012423f862005420188842105201242" - "018821122007420183500d000b2002200f3703102002200e3703180b2002" - "20053703502002200d370340200220073703002002201237035820022016" - "3703482002200a3703082001290300210920022903702106200229036821" - "172002290360210c2008a74101714504400340200b423f86200842018884" - "21080240200c420183a70440200620137c2219201420177c2206201454ad" - "2006200c20157c221a201554ad7c220c200654ad7c7c2206423f86200c42" - "0188842117200c423f86201a42018884210c2013201956ad2006201954ad" - "7c200920187c7c21090c010b2017423f86200c42018884210c2006423f86" - "20174201888421170b2010423f86200b42018884210b2011423f86201042" - "0188842110201142018821112009423f8620064201888421062009420188" - "21092008420183500d000b20022010370330200220113703380b20022006" - "3703702002200c3703602002200837032020022009370378200220173703" - "682002200b37032802400240200f201085200e2011858450044020072008" - "54200a200b54200a200b511b0d010c020b200f201056200e201156200e20" - "11511b0d010b2002200820077d427e8322063703202002200b200a7d2209" - "2007200856ad22087d220c37032820024201200a200b56ad2008200956ad" - "7c7d2208200f7d220b20107c220942017d221037033020022011200e7d20" - "09420052ad2009200b54ad2008200f54ad7d7c50ad7d2211370338200241" - "e0006a200d2016200520122015201420132018102d20062108200c210b0c" - "020b2002200720087d427e8322123703002002200a200b7d220520072008" - "54ad22077d220d37030820024201200a200b54ad2005200754ad7c7d2207" - "200f7c220520107d220a42017d220f3703102002200e20117d200a420052" - "ad2005200754ad2005201054ad7d7c50ad7d220e370318200241406b200c" - "2017200620092015201420132018102d20122107200d210a0c010b0b2000" - "2001290300370300200041186a200141186a290300370300200041106a20" - "0141106a290300370300200041086a200141086a290300370300200241c0" - "016a24000bc92602357f187e230041c0066b22032400200341386a222b20" - "0141386a2226290300370300200341306a222c200141306a220e29030037" - "0300200341286a222d200141286a220f290300370300200341206a222e20" - "0141206a2210290300370300200341186a222f200141186a221129030037" - "0300200341106a2230200141106a22122903003703002003200129030037" - "03002003200141086a2227290300370308200320012002102f200341f800" - "6a2214200141f8006a2204290300370300200341f0006a2215200141f000" - "6a2205290300370300200341e8006a2216200141e8006a22062903003703" - "00200341e0006a2217200141e0006a2207290300370300200341d8006a22" - "0a200141d8006a2208290300370300200341d0006a220b200141d0006a22" - "092903003703002003200141c8006a220c29030037034820032001290340" - "370340200341406b200141406b2213200241406b2228102f200341b8016a" - "2220200141b8016a290300370300200341b0016a2221200141b0016a2903" - "00370300200341a8016a2222200141a8016a290300370300200341a0016a" - "2223200141a0016a29030037030020034198016a222420014198016a2903" - "0037030020034190016a222520014190016a290300370300200320014188" - "016a2903003703880120032001290380013703800120034180016a200141" - "80016a222920024180016a222a102f200341f8016a221820042903003703" - "00200341f0016a22192005290300370300200341e8016a221a2006290300" - "370300200341e0016a221b2007290300370300200341d8016a221c200829" - "0300370300200341d0016a221d20092903003703002003200c2903003703" - "c801200320012903403703c001200341c0016a201320291030200341b802" - "6a200241f8006a290300370300200341b0026a200241f0006a2903003703" - "00200341a8026a200241e8006a290300370300200341a0026a200241e000" - "6a29030037030020034198026a200241d8006a2903003703002003419002" - "6a200241d0006a2903003703002003200241c8006a290300370388022003" - "20022903403703800220034180026a2028202a1030200341c0056a200341" - "c0016a20034180026a102f2018200341f8056a2204290300370300201920" - "0341f0056a2205290300370300201a200341e8056a220629030037030020" - "1b200341e0056a2207290300370300201c200341d8056a22082903003703" - "00201d200341d0056a2209290300370300200320032903c8053703c80120" - "0320032903c0053703c00120034198066a220c201c290300370300200341" - "90066a220d201d290300370300200320032903c801370388062003200329" - "03c0013703800620034180066a2003290340223820032903482239200b29" - "0300223a200a290300223b42c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341b806" - "6a220a2018290300370300200341b0066a220b2019290300370300200320" - "1a2903003703a8062003201b2903003703a006200341a0066a2017290300" - "223c2016290300223d2015290300223e2014290300223f42c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008200c29030022403703002009200d29030022413703" - "00200720032903a00622423703002005200b290300224337030020062003" - "2903a80622443703002004200a2903002245370300200320032903880622" - "463703c805200320032903800622473703c0052018204537030020192043" - "370300201a2044370300201b2042370300201c2040370300201d20413703" - "00200320463703c801200320473703c001200c201c290300370300200d20" - "1d290300370300200320032903c80137038806200320032903c001370380" - "0620034180066a2003290380012003290388012025290300202429030042" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b8" - "7f42a9c0c689aece93b230102d200a2018290300370300200b2019290300" - "3703002003201a2903003703a8062003201b2903003703a006200341a006" - "6a202329030020222903002021290300202029030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d2008200c29030022403703002009200d290300224137030020" - "0720032903a00622423703002005200b2903002243370300200620032903" - "a80622443703002004200a29030022453703002003200329038806224637" - "03c805200320032903800622473703c00520182045370300201920433703" - "00201a2044370300201b2042370300201c2040370300201d204137030020" - "0320463703c801200320473703c001200342003703b805200342003703b0" - "05200342003703a805200342013703a00520034200370398052003420037" - "03900520034200370388052003420937038005200341c0056a200341c001" - "6a20034180056a102f201820042903003703002019200529030037030020" - "1a2006290300370300201b2007290300370300201c200829030037030020" - "1d2009290300370300200320032903c8053703c801200320032903c00537" - "03c001200341c0056a200341c0016a200310302018200429030037030020" - "192005290300370300201a2006290300370300201b200729030037030020" - "1c2008290300370300201d2009290300370300200320032903c8053703c8" - "01200320032903c0053703c001200341d0026a2214201229030037030020" - "0341d8026a22152011290300370300200341e0026a221620102903003703" - "00200341e8026a2217200f290300370300200341f0026a221e200e290300" - "370300200341f8026a221f2026290300370300200320012903003703c002" - "200320272903003703c802200341c0026a200120131030200341b8036a20" - "0241386a2231290300370300200341b0036a200241306a22322903003703" - "00200341a8036a200241286a2233290300370300200341a0036a20024120" - "6a223429030037030020034198036a200241186a22352903003703002003" - "4190036a200241106a22362903003703002003200241086a223729030037" - "038803200320022903003703800320034180036a200220281030200341c0" - "056a200341c0026a20034180036a102f201f2004290300370300201e2005" - "290300370300201720062903003703002016200729030037030020152008" - "29030037030020142009290300370300200320032903c8053703c8022003" - "20032903c0053703c002200c2015290300370300200d2014290300370300" - "200320032903c80237038806200320032903c0023703800620034180066a" - "200329030022402003290308224120302903002242202f290300224342c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200a201f290300370300200b201e29030037" - "0300200320172903003703a806200320162903003703a006200341a0066a" - "202e2903002244202d2903002245202c2903002246202b290300224742c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d2008200c29030022483703002009200d2903" - "002249370300200720032903a006224a3703002005200b290300224b3703" - "00200620032903a806224c3703002004200a290300224d37030020032003" - "29038806224e3703c8052003200329038006224f3703c005201f204d3703" - "00201e204b3703002017204c3703002016204a3703002015204837030020" - "1420493703002003204e3703c8022003204f3703c002200c201529030037" - "0300200d2014290300370300200320032903c80237038806200320032903" - "c0023703800620034180066a20382039203a203b42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b230102d200a201f290300370300200b201e290300370300200320172903" - "003703a806200320162903003703a006200341a0066a203c203d203e203f" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2008200c29030022383703002009200d" - "2903002239370300200720032903a006223a3703002005200b290300223b" - "370300200620032903a806223c3703002004200a290300223d3703002003" - "200329038806223e3703c8052003200329038006223f3703c005201f203d" - "370300201e203b3703002017203c3703002016203a370300201520383703" - "00201420393703002003203e3703c8022003203f3703c002200341f8036a" - "2020290300370300200341f0036a2021290300370300200341e8036a2022" - "290300370300200341e0036a2023290300370300200341d8036a20242903" - "00370300200341d0036a202529030037030020032003290388013703c803" - "20032003290380013703c003200341c0036a20034180016a20034180056a" - "102f200341c0056a200341c0026a200341c0036a1030201f200429030037" - "0300201e2005290300370300201720062903003703002016200729030037" - "03002015200829030037030020142009290300370300200320032903c805" - "3703c802200320032903c0053703c00220034190046a2213201229030037" - "030020034198046a22122011290300370300200341a0046a221120102903" - "00370300200341a8046a2210200f290300370300200341b0046a220f200e" - "290300370300200341b8046a220e20262903003703002003200129030037" - "038004200320272903003703880420034180046a200120291030200341f8" - "046a2031290300370300200341f0046a2032290300370300200341e8046a" - "2033290300370300200341e0046a2034290300370300200341d8046a2035" - "290300370300200341d0046a2036290300370300200320372903003703c8" - "04200320022903003703c004200341c0046a2002202a1030200341c0056a" - "20034180046a200341c0046a102f200e2004290300370300200f20052903" - "003703002010200629030037030020112007290300370300201220082903" - "0037030020132009290300370300200320032903c8053703880420032003" - "2903c00537038004200c2012290300370300200d20132903003703002003" - "2003290388043703880620032003290380043703800620034180066a2040" - "20412042204342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200a200e290300370300" - "200b200f290300370300200320102903003703a806200320112903003703" - "a006200341a0066a204420452046204742c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2008200c29030022383703002009200d2903002239370300200720032903" - "a006223a3703002005200b290300223b370300200620032903a806223c37" - "03002004200a290300223d3703002003200329038806223e3703c8052003" - "200329038006223f3703c005200e203d370300200f203b3703002010203c" - "3703002011203a37030020122038370300201320393703002003203e3703" - "88042003203f37038004200341c0056a20034180046a200341406b103020" - "0e2004290300370300200f20052903003703002010200629030037030020" - "112007290300370300201220082903003703002013200929030037030020" - "0320032903c80537038804200320032903c00537038004200c2012290300" - "370300200d20132903003703002003200329038804370388062003200329" - "0380043703800620034180066a2003290380012003290388012025290300" - "202429030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d200a200e29030037030020" - "0b200f290300370300200320102903003703a806200320112903003703a0" - "06200341a0066a202329030020222903002021290300202029030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2008200c29030022383703002009200d290300" - "2239370300200720032903a006223a3703002005200b290300223b370300" - "200620032903a806223c3703002004200a290300223d3703002003200329" - "038806223e3703c8052003200329038006223f3703c005200e203d370300" - "200f203b3703002010203c3703002011203a370300201220383703002013" - "20393703002003203e370388042003203f37038004200041386a20182903" - "00370300200041306a2019290300370300200041286a201a290300370300" - "200041206a201b290300370300200041186a201c29030037030020004110" - "6a201d290300370300200041086a20032903c801370300200020032903c0" - "01370300200020032903c002370340200041c8006a20032903c802370300" - "200041d0006a2014290300370300200041d8006a20152903003703002000" - "41e0006a2016290300370300200041e8006a2017290300370300200041f0" - "006a201e290300370300200041f8006a201f290300370300200041b8016a" - "200e290300370300200041b0016a200f290300370300200041a8016a2010" - "290300370300200041a0016a201129030037030020004198016a20122903" - "0037030020004190016a201329030037030020004188016a200329038804" - "370300200020032903800437038001200341c0066a24000b830c02137f04" - "7e23004180026b22032400200341d8006a2207200141186a290300370300" - "200341d0006a2208200141106a2903003703002003200141086a29030037" - "034820032001290300370340200341406b2002290300200241086a290300" - "2002290310200241186a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" - "98016a2204200141386a29030037030020034190016a2205200141306a29" - "03003703002003200141286a290300370388012003200129032037038001" - "20034180016a2002290320200241286a2903002002290330200241386a29" - "030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d200341186a220b20072903003703" - "00200341106a220c2008290300370300200341206a220d20032903800137" - "0300200341286a220e200329038801370300200341306a220f2005290300" - "370300200341386a22102004290300370300200320032903483703082003" - "2003290340370300200241f8006a2903002116200241e8006a2903002117" - "2002290370211820022903602119200341f8016a2209200141d8006a2903" - "00370300200341f0016a2206200141d0006a2903003703002003200141c8" - "006a2903003703e801200320012903403703e001200341e0016a20022903" - "40200241c8006a2903002002290350200241d8006a29030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d2004200141f8006a2903003703002005200141f0006a" - "2903003703002003200141e8006a29030037038801200320012903603703" - "800120034180016a201920172018201642c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2007200929030037030020082006290300370300200341e0006a22112003" - "29038001370300200341e8006a2212200329038801370300200341f0006a" - "22132005290300370300200341f8006a2214200429030037030020032003" - "2903e801370348200320032903e001370340200241b8016a290300211620" - "0241a8016a290300211720022903b001211820022903a0012119200341d8" - "016a220a20014198016a290300370300200341d0016a221520014190016a" - "290300370300200320014188016a2903003703c801200320012903800137" - "03c001200341c0016a20022903800120024188016a290300200229039001" - "20024198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200141b801" - "6a2903003703002006200141b0016a2903003703002003200141a8016a29" - "03003703e801200320012903a0013703e001200341e0016a201920172018" - "201642c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d2004200a29030037030020052015" - "290300370300200341a0016a220120032903e001370300200341a8016a22" - "0220032903e801370300200341b0016a220a2006290300370300200341b8" - "016a22062009290300370300200320032903c80137038801200320032903" - "c00137038001200041386a2010290300370300200041306a200f29030037" - "0300200041286a200e290300370300200041206a200d2903003703002000" - "41186a200b290300370300200041106a200c290300370300200041086a20" - "032903083703002000200329030037030020002003290340370340200041" - "c8006a2003290348370300200041d0006a2008290300370300200041d800" - "6a2007290300370300200041e0006a2011290300370300200041e8006a20" - "12290300370300200041f0006a2013290300370300200041f8006a201429" - "0300370300200041b8016a2006290300370300200041b0016a200a290300" - "370300200041a8016a2002290300370300200041a0016a20012903003703" - "0020004198016a200429030037030020004190016a200529030037030020" - "004188016a20032903880137030020002003290380013703800120034180" - "026a24000bf11902287f087e23004180056b22022400200241386a222420" - "0141386a220a290300370300200241306a2225200141306a220329030037" - "0300200241286a2226200141286a2204290300370300200241206a222720" - "0141206a2205290300370300200241186a2228200141186a220f29030037" - "0300200241106a2229200141106a22062903003703002002200129030037" - "03002002200141086a2207290300370308200220012001102f200241f800" - "6a2210200a290300370300200241f0006a22112003290300370300200241" - "e8006a22122004290300370300200241e0006a2213200529030037030020" - "0241d8006a2214200f290300370300200241d0006a221520062903003703" - "002002200729030037034820022001290300370340200241406b20012001" - "41406b2218102f20024180046a200241406b200241406b10302010200241" - "b8046a220b2903003703002011200241b0046a220c290300370300201220" - "0241a8046a220d2903003703002013200241a0046a220e29030037030020" - "1420024198046a2208290300370300201520024190046a22092903003703" - "0020022002290388043703482002200229038004370340200141f8006a22" - "19290300212a200141f0006a221a290300212b200141e8006a221b290300" - "212c200141e0006a221c290300212d200241f8046a2217200f2903003703" - "00200241f0046a220f2006290300370300200220072903003703e8042002" - "20012903003703e004200241e0046a2001290340200141c8006a221d2903" - "00200141d0006a221e290300200141d8006a221f29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008200a29030037030020092003290300370300200220" - "0429030037038804200220052903003703800420024180046a202d202c20" - "2b202a42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20024198036a22032017290300" - "37030020024190036a2204200f290300370300200241a0036a2205200229" - "038004370300200241a8036a2206200229038804370300200241b0036a22" - "072009290300370300200241b8036a221620082903003703002002200229" - "03e80437038803200220022903e0043703800320024180046a2002418003" - "6a20014180016a220a10302016200b2903003703002007200c2903003703" - "002006200d2903003703002005200e290300370300200320082903003703" - "002004200929030037030020022002290388043703880320022002290380" - "043703800320024180046a20024180036a20024180036a102f2016200b29" - "03003703002007200c2903003703002006200d2903003703002005200e29" - "030037030020032008290300370300200420092903003703002002200229" - "0388043703880320022002290380043703800320024190016a2203201e29" - "030037030020024198016a2204201f290300370300200241a0016a220520" - "1c290300370300200241a8016a2206201b290300370300200241b0016a22" - "07201a290300370300200241b8016a221620192903003703002002200129" - "0340370380012002201d2903003703880120024180016a2018200a102f20" - "024180046a20024180016a20024180016a10302016200b29030037030020" - "07200c2903003703002006200d2903003703002005200e29030037030020" - "042008290300370300200320092903003703002002200229038804370388" - "01200220022903800437038001200241d0016a221820014190016a290300" - "370300200241d8016a221920014198016a290300370300200241e0016a22" - "1a200141a0016a290300370300200241e8016a221b200141a8016a290300" - "370300200241f0016a221c200141b0016a290300370300200241f8016a22" - "1d200141b8016a29030037030020022001290380013703c0012002200141" - "88016a2903003703c801200241c0016a200a200a102f200241b8026a221e" - "2016290300370300200241b0026a22162007290300370300200241a8026a" - "22072006290300370300200241a0026a2206200529030037030020024198" - "026a2205200429030037030020024190026a220420032903003703002002" - "42003703f803200242003703f003200242003703e803200242013703e003" - "200242003703d803200242003703d003200242003703c803200242093703" - "c00320022002290388013703880220022002290380013703800220024180" - "026a20024180016a200241c0036a102f20024180046a20024180026a2002" - "1030201e200b2903003703002016200c2903003703002007200d29030037" - "03002006200e290300370300200520082903003703002004200929030037" - "0300200241d0026a22032018290300370300200241d8026a221f20192903" - "00370300200241e0026a2220201a290300370300200241e8026a2221201b" - "290300370300200241f0026a2222201c290300370300200241f8026a2223" - "201d29030037030020022002290388043703880220022002290380043703" - "8002200220022903c0013703c002200220022903c8013703c802200241c0" - "026a200241c0016a200241c0036a102f20024180046a200241c0026a2002" - "41406b10302023200b2903003703002022200c2903003703002021200d29" - "03003703002020200e290300370300201f20082903003703002003200929" - "030037030020022002290388043703c80220022002290380043703c00220" - "024180046a200241406b20024180036a10302010200b2903003703002011" - "200c2903003703002012200d2903003703002013200e2903003703002014" - "200829030037030020152009290300370300200220022903880437034820" - "0220022903800437034020024180046a200241406b20024180016a103020" - "10200b2903003703002011200c2903003703002012200d29030037030020" - "13200e290300370300201420082903003703002015200929030037030020" - "022002290388043703482002200229038004370340200241d8046a220120" - "14290300370300200241d0046a220a201529030037030020022002290348" - "3703c804200220022903403703c004200241c0046a200229030020022903" - "082029290300202829030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2017201029" - "0300370300200f2011290300370300200220122903003703e80420022013" - "2903003703e004200241e0046a2027290300202629030020252903002024" - "29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20082001290300222a37030020" - "09200a290300222b370300200e20022903e004222c370300200c200f2903" - "00222d370300200d20022903e804222e370300200b2017290300222f3703" - "00200220022903c804223037038804200220022903c00422313703800420" - "10202f3703002011202d3703002012202e3703002013202c370300201420" - "2a3703002015202b37030020022030370348200220313703402001201429" - "0300370300200a2015290300370300200220022903483703c80420022002" - "2903403703c004200241c0046a20022903c00120022903c8012018290300" - "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2017201029030037030020" - "0f2011290300370300200220122903003703e804200220132903003703e0" - "04200241e0046a201a290300201b290300201c290300201d29030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d20082001290300222a3703002009200a290300" - "222b370300200e20022903e004222c370300200c200f290300222d370300" - "200d20022903e804222e370300200b2017290300222f3703002002200229" - "03c804223037038804200220022903c0042231370380042010202f370300" - "2011202d3703002012202e3703002013202c3703002014202a3703002015" - "202b3703002002203037034820022031370340200041386a201e29030037" - "0300200041306a2016290300370300200041286a20072903003703002000" - "41206a2006290300370300200041186a2005290300370300200041106a20" - "04290300370300200041086a200229038802370300200020022903800237" - "0300200020022903c002370340200041c8006a20022903c8023703002000" - "41d0006a2003290300370300200041d8006a201f290300370300200041e0" - "006a2020290300370300200041e8006a2021290300370300200041f0006a" - "2022290300370300200041f8006a2023290300370300200041b8016a2010" - "290300370300200041b0016a2011290300370300200041a8016a20122903" - "00370300200041a0016a201329030037030020004198016a201429030037" - "030020004190016a201529030037030020004188016a2002290348370300" - "200020022903403703800120024180056a24000bfe09011d7e2001290310" - "22022001290300220484200141186a2903002215200141086a2903002203" - "8484420052044042c7faf3c3ed82a3903c20047d2118427f4200427f4200" - "200442788342c7faf3c3ed82a3903c561b220b2003200b56ad7d200b2003" - "7d220342f3eab8bce9ada5bfe8007d2219200354ad7c42017c220320027d" - "220c42a4cffaf397c9eed7c7007d220b200c54ad2002200356ad7d427f51" - "1b20157d42a9c0c689aece93b2307c210c0b420021152001290330220220" - "01290320220484200141386a2903002208200141286a2903002203848442" - "00520440427f4200427f4200200442788342c7faf3c3ed82a3903c561b22" - "062003200656ad7d200620037d220342f3eab8bce9ada5bfe8007d221520" - "0354ad7c42017c220320027d220642a4cffaf397c9eed7c7007d221a2006" - "54ad2002200356ad7d427f511b20087d42a9c0c689aece93b2307c211b42" - "c7faf3c3ed82a3903c20047d21060b200141f8006a2903002108200141e8" - "006a290300210220012903702104200129036021032001290350220e2001" - "290340220f84200141d8006a2903002205200141c8006a29030022108484" - "4200520440427f4200427f4200200f42788342c7faf3c3ed82a3903c561b" - "22092009201054ad7d200920107d220942f3eab8bce9ada5bfe8007d221c" - "200954ad7c42017c2216200e7d220d42a4cffaf397c9eed7c7007d220920" - "0d54ad200e201656ad7d427f511b20057d42a9c0c689aece93b2307c2116" - "42c7faf3c3ed82a3903c200f7d210d0b4200210e4200210f420021102003" - "2004842002200884844200520440427f4200427f4200200342788342c7fa" - "f3c3ed82a3903c561b22072002200756ad7d200720027d220242f3eab8bc" - "e9ada5bfe8007d220e200254ad7c42017c220220047d220742a4cffaf397" - "c9eed7c7007d220f200754ad2002200454ad7d427f511b20087d42a9c0c6" - "89aece93b2307c211042c7faf3c3ed82a3903c20037d21070b200141b801" - "6a2903002108200141a8016a290300210220012903b001210420012903a0" - "01210342002105200129039001221220012903800122138420014198016a" - "290300221e20014188016a290300221484844200520440427f4200427f42" - "00201342788342c7faf3c3ed82a3903c561b220a200a201454ad7d200a20" - "147d220a42f3eab8bce9ada5bfe8007d221d200a54ad7c42017c22172012" - "7d221142a4cffaf397c9eed7c7007d220a201154ad2012201756ad7d427f" - "511b201e7d42a9c0c689aece93b2307c211742c7faf3c3ed82a3903c2013" - "7d21110b4200211242002113420021142003200484200220088484420052" - "0440427f4200427f4200200342788342c7faf3c3ed82a3903c561b220520" - "02200556ad7d200520027d220242f3eab8bce9ada5bfe8007d2212200254" - "ad7c42017c220220047d220542a4cffaf397c9eed7c7007d2213200554ad" - "2002200454ad7d427f511b20087d42a9c0c689aece93b2307c211442c7fa" - "f3c3ed82a3903c20037d21050b200020133703b001200020053703a00120" - "00200a3703900120002011370380012000200f3703702000200737036020" - "0020093703502000200d3703402000201a37033020002006370320200020" - "0b37031020002018370300200020143703b801200020123703a801200020" - "17370398012000201d37038801200020103703782000200e370368200020" - "163703582000201c3703482000201b370338200020153703282000200c37" - "0318200020193703080b960501057f230041800c6b220324002003200120" - "02103b20034180036a200141c0016a220441c001104c1a200341c0046a20" - "0241c0016a220541c001104c1a200341c0016a20042005103b2003420037" - "03b809200342003703b009200342003703a809200342013703a009200342" - "003703980920034200370390092003420037038809200342093703800920" - "0341c00a6a200341c0026a20034180096a102f200341c80b6a2003418802" - "6a290300370300200341d00b6a20034190026a290300370300200341d80b" - "6a20034198026a290300370300200341e00b6a200341a0026a2903003703" - "00200341e80b6a200341a8026a290300370300200341f00b6a200341b002" - "6a290300370300200341f80b6a200341b8026a290300370300200341880b" - "6a20032903c801370300200341900b6a200341d0016a2903003703002003" - "41980b6a200341d8016a290300370300200341a00b6a200341e0016a2903" - "00370300200341a80b6a200341e8016a290300370300200341b00b6a2003" - "41f0016a290300370300200341b80b6a200341f8016a2903003703002003" - "2003290380023703c00b200320032903c0013703800b20034180066a2003" - "41c00a6a20031030200341c0066a200341800b6a2206200341406b103020" - "034180076a200341c00b6a220720034180016a103020034180096a200120" - "041030200341c0096a200141406b200341c0036a1030200341800a6a2001" - "4180016a20034180046a1030200341c00a6a200220051030200620024140" - "6b20034180056a1030200720024180016a200341c0056a1030200341c007" - "6a20034180096a200341c00a6a103b200341c00a6a200341c0076a200310" - "3c200041c0016a200341c00a6a200341c0016a103c200020034180066a41" - "c001104c1a200341800c6a24000bd741020e7f227e230041c0036b220324" - "0002400240200129034022212001290350222084200141c8006a29030022" - "23200141d8006a2903002222848442005204402002290340221d20022903" - "50221584200241c8006a2903002224200241d8006a290300221e8484500d" - "01200341f8016a2204200141406b220641186a2205290300370300200341" - "f0016a2208200641106a220b290300370300200320062903003703e00120" - "03200641086a220c2903003703e801200341e0016a202120232020202242" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20034198026a2209" - "200241406b220741186a220d29030037030020034190026a220a20074110" - "6a220e2903003703002003200741086a220f290300370388022003200729" - "03003703800220034180026a201d20242015201e42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b200341186a2210200141186a2903003703" - "00200341106a200141106a2903003703002003200141086a290300370308" - "20032001290300370300200320032903800222162003290388022219200a" - "29030022252009290300222842c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b200341386a2209200241186a290300370300200341306a220a" - "200241106a2903003703002003200241086a290300370328200320022903" - "00370320200341206a20032903e001222c20032903e80122302008290300" - "22312004290300223242c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b200341b8036a22042005290300370300200341b0036a2205200b2903" - "003703002003200c2903003703a803200320062903003703a003200341a0" - "036a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f102b200429030021132005290300211f20032903a803211c20032903a0" - "0321172004200d2903003703002005200e2903003703002003200f290300" - "3703a803200320072903003703a003200341a0036a201620192025202842" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211220" - "05290300211420032903a803211120032903a003211a200341d0006a2001" - "41306a290300370300200341d8006a2206200141386a2903003703002003" - "20012903203703402003200141286a290300370348200341406b201a2011" - "2014201242c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341" - "f8006a2207200241386a290300370300200341f0006a2208200241306a29" - "03003703002003200241286a290300370368200320022903203703602003" - "41e0006a2017201c201f201342c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b02402003200341206a104a450440200341406b200341e0006a" - "104a450d010b200420092903003703002005200a29030037030020032003" - "2903283703a803200320032903203703a003200341a0036a200329030020" - "032903082003290310201029030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2004" - "290300211f2005290300211c20032903a003211720032903a80321122004" - "200729030037030020052008290300370300200320032903683703a80320" - "0320032903603703a003200341a0036a2003290340200329034820032903" - "50200629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20124201862017423f88" - "842114201742018621112004290300211a2005290300211b20032903a803" - "211820032903a003212602400240201c4201862012423f8884222942ddb0" - "858ce8b691a8b87f85201f201f7c201c423f887c221342a9c0c689aece93" - "b2308584500440201142c7faf3c3ed82a3903c542014428d95c7c396d2da" - "c0977f542014428d95c7c396d2dac0977f511b450d0142a9c0c689aece93" - "b230211342ddb0858ce8b691a8b87f21292011212a201421110c020b2029" - "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" - "c689aece93b230511b450d002011212a201421110c010b20132029201420" - "1142c7faf3c3ed82a3903c7d222a20115aad222d7d222742f3eab8bce9ad" - "a5bfe8007c2211202754ad2014202d54ad7d7c2214202954ad201442a2cf" - "faf397c9eed7c7007c2229201454ad7c50ad7d42a9c0c689aece93b2307d" - "21130b200341b8036a22012013370300200320293703b0032003202a3703" - "a003200320113703a80342ddb0858ce8b691a8b87f2114200341a0036a20" - "2a20112029201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "2003201f3703d8012003201c3703d001200320123703c801200320173703" - "c001200341c0016a20032903a003222920032903a803222a20032903b003" - "222d2001290300222742c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b20184201862026423f888421112026420186212602400240201b4201" - "862018423f8884221842ddb0858ce8b691a8b87f85201a201a7c201b423f" - "887c221342a9c0c689aece93b2308584500440202642c7faf3c3ed82a390" - "3c542011428d95c7c396d2dac0977f542011428d95c7c396d2dac0977f51" - "1b450d012026211a2011211b42a9c0c689aece93b23021130c020b201842" - "deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c6" - "89aece93b230511b450d002026211a2011211b201821140c010b20132018" - "2011202642c7faf3c3ed82a3903c7d221a20265aad22147d222642f3eab8" - "bce9ada5bfe8007c221b202654ad2011201454ad7d7c2211201854ad2011" - "42a2cffaf397c9eed7c7007c2214201154ad7c50ad7d42a9c0c689aece93" - "b2307d21130b20034198016a2201200341186a2903003703002003419001" - "6a2202200341106a29030037030020032003290308370388012003200329" - "03003703800142ddb0858ce8b691a8b87f212e20034180016a2029202a20" - "2d202742c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341b8" - "036a2204200341d8006a290300370300200341b0036a2205200341d0006a" - "290300370300200320032903483703a803200320032903403703a0032003" - "41a0036a20032903c001221120032903c801221820032903d00122272003" - "41d8016a290300222b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "102b200320133703b802200320143703b0022003201b3703a8022003201a" - "3703a002200429030021262005290300212920032903a803212a20032903" - "a003212d200341a0026a201a201b2014201342c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f102b200341a0026a201120182027202b42c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b230102d200329038801222b4201862003290380012211423f" - "88842118201142018621270240024020022903002211420186202b423f88" - "84222b42ddb0858ce8b691a8b87f852011423f882001290300221120117c" - "7c221142a9c0c689aece93b2308584500440202742c7faf3c3ed82a3903c" - "542018428d95c7c396d2dac0977f542018428d95c7c396d2dac0977f511b" - "450d012027212f2018212742a9c0c689aece93b23021110c020b202b42de" - "b0858ce8b691a8b87f54201142a9c0c689aece93b23054201142a9c0c689" - "aece93b230511b450d002027212f20182127202b212e0c010b2011202b20" - "18202742c7faf3c3ed82a3903c7d222f20275aad222e7d221142f3eab8bc" - "e9ada5bfe8007c2227201154ad2018202e54ad7d7c2218202b54ad201842" - "a2cffaf397c9eed7c7007c222e201854ad7c50ad7d42a9c0c689aece93b2" - "307d21110b42ddb0858ce8b691a8b87f2118200341a0026a202f2027202e" - "201142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d200320133703b801200320143703" - "b0012003201b3703a8012003201a3703a00120034180016a20032903a002" - "20032903a80220032903b002200341b8026a29030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d200341a0016a20032903800120032903880120032903900120" - "034198016a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b202a420186202d423f88842114202d4201862111024002402029420186" - "202a423f8884221a42ddb0858ce8b691a8b87f85202620267c2029423f88" - "7c221342a9c0c689aece93b2308584500440201142c7faf3c3ed82a3903c" - "542014428d95c7c396d2dac0977f542014428d95c7c396d2dac0977f511b" - "450d012011211b2014211142a9c0c689aece93b23021130c020b201a42de" - "b0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0c689" - "aece93b230511b450d002011211b20142111201a21180c010b2013201a20" - "14201142c7faf3c3ed82a3903c7d221b20115aad22187d222642f3eab8bc" - "e9ada5bfe8007c2211202654ad2014201854ad7d7c2214201a54ad201442" - "a2cffaf397c9eed7c7007c2218201454ad7c50ad7d42a9c0c689aece93b2" - "307d21130b42ddb0858ce8b691a8b87f2114200341a0016a201b20112018" - "201342c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d02400240201520207c2213202320" - "247c2220202454ad2020201d20217c2224201d54ad7c2223202054ad7c7c" - "222042ddb0858ce8b691a8b87f852013201554ad2013202056ad7c201e20" - "227c7c222142a9c0c689aece93b2308584500440202442c7faf3c3ed82a3" - "903c542023428d95c7c396d2dac0977f542023428d95c7c396d2dac0977f" - "511b450d01202421222023211342a9c0c689aece93b23021210c020b2020" - "42deb0858ce8b691a8b87f54202142a9c0c689aece93b23054202142a9c0" - "c689aece93b230511b450d002024212220232113202021140c010b202120" - "202023202442c7faf3c3ed82a3903c7d222220245aad221d7d221542f3ea" - "b8bce9ada5bfe8007c2213201554ad201d202356ad7d7c2223202054ad20" - "2342a2cffaf397c9eed7c7007c2214202354ad7c50ad7d42a9c0c689aece" - "93b2307d21210b200341d8026a22012021370300200341d0026a22022014" - "370300200320223703c002200320133703c802200341c0026a2022201320" - "14202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b200341c0" - "026a202c20302031203242c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a" - "201620192025202842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341c0026a2017" - "2012201c201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b20" - "0041186a200341b8026a290300370300200041106a200341b0026a290300" - "370300200041086a20032903a802370300200020032903a0023703002000" - "20032903a001370320200041286a20032903a801370300200041306a2003" - "41b0016a290300370300200041386a200341b8016a290300370300200020" - "032903c002370340200041c8006a20032903c802370300200041d0006a20" - "02290300370300200041d8006a20012903003703000c030b200341b8036a" - "2204200141186a290300221b370300200341b0036a2205200141106a2903" - "0022183703002003200141086a29030022163703a8032003200129030022" - "193703a00342ddb0858ce8b691a8b87f2112200341a0036a201920162018" - "201b42c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300" - "211d2005290300211520032903a803212420032903a003211f2004200141" - "206a220241186a2903003703002005200241106a29030037030020032002" - "41086a2903003703a803200320022903003703a003200341a0036a200129" - "0320200141286a2903002001290330200141386a29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f102b2005290300211320032903a00321" - "1c20032903a8032117200420042903002225370300200320133703b00320" - "0320173703a8032003201c3703a003200341a0036a201c20172013202542" - "c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b2004290300211420" - "032903b003211e20032903a803211120032903a003211a02400240024020" - "1320187c2218201620177c2216201754ad20162019201c7c2219201c54ad" - "7c2217201654ad7c7c221c42ddb0858ce8b691a8b87f852013201856ad20" - "18201c56ad7c201b20257c7c221342a9c0c689aece93b230858450044020" - "1942c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d" - "95c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b20" - "1c42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9" - "c0c689aece93b230511b450d01201c21120b2019211b201721180c010b20" - "13201c2017201942c7faf3c3ed82a3903c7d221b20195aad22127d221642" - "f3eab8bce9ada5bfe8007c2218201654ad2012201756ad7d7c2217201c54" - "ad201742a2cffaf397c9eed7c7007c2212201754ad7c50ad7d42a9c0c689" - "aece93b2307d21130b200341b8036a22012013370300200341b0036a2204" - "20123703002003201b3703a003200320183703a80342ddb0858ce8b691a8" - "b87f211c200341a0036a201b20182012201342c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f102b20034198036a22052001290300370300200341" - "90036a22062004290300370300200320032903a803370388032003200329" - "03a0033703800320034180036a201f20242015201d42c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d20012005290300370300200420062903003703002003200329" - "0388033703a80320032003290380033703a003200341a0036a201a201120" - "1e201442c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d20032903a803221b4201862003" - "2903a0032213423f88842117201342018621120240024002402004290300" - "2213420186201b423f8884221642ddb0858ce8b691a8b87f852013423f88" - "2001290300221320137c7c221342a9c0c689aece93b23085845004402012" - "42c7faf3c3ed82a3903c542017428d95c7c396d2dac0977f542017428d95" - "c7c396d2dac0977f511b450d0242a9c0c689aece93b23021130c010b2016" - "42deb0858ce8b691a8b87f54201342a9c0c689aece93b23054201342a9c0" - "c689aece93b230511b450d012016211c0b2012211b201721180c010b2013" - "20162017201242c7faf3c3ed82a3903c7d221b20125aad221c7d221242f3" - "eab8bce9ada5bfe8007c2218201254ad2017201c54ad7d7c2217201654ad" - "201742a2cffaf397c9eed7c7007c221c201754ad7c50ad7d42a9c0c689ae" - "ce93b2307d21130b2024420186201f423f8884211742ddb0858ce8b691a8" - "b87f2116201f42018621190240024020154201862024423f8884222842dd" - "b0858ce8b691a8b87f85201d201d7c2015423f887c221242a9c0c689aece" - "93b2308584500440201942c7faf3c3ed82a3903c542017428d95c7c396d2" - "dac0977f542017428d95c7c396d2dac0977f511b450d0120192125201721" - "1942a9c0c689aece93b23021120c020b202842deb0858ce8b691a8b87f54" - "201242a9c0c689aece93b23054201242a9c0c689aece93b230511b450d00" - "2019212520172119202821160c010b201220282017201942c7faf3c3ed82" - "a3903c7d222520195aad22167d222c42f3eab8bce9ada5bfe8007c221920" - "2c54ad2016201756ad7d7c2217202854ad201742a2cffaf397c9eed7c700" - "7c2216201754ad7c50ad7d42a9c0c689aece93b2307d21120b42ddb0858c" - "e8b691a8b87f211702400240201520167c2228201920247c2215201954ad" - "2015201f20257c221f202554ad7c2219201554ad7c7c221542ddb0858ce8" - "b691a8b87f852016202856ad2015202854ad7c2012201d7c7c221d42a9c0" - "c689aece93b2308584500440201f42c7faf3c3ed82a3903c542019428d95" - "c7c396d2dac0977f542019428d95c7c396d2dac0977f511b450d01201f21" - "242019211f42a9c0c689aece93b230211d0c020b201542deb0858ce8b691" - "a8b87f54201d42a9c0c689aece93b23054201d42a9c0c689aece93b23051" - "1b450d00201f21242019211f201521170c010b201d20152019201f42c7fa" - "f3c3ed82a3903c7d2224201f5aad22177d221242f3eab8bce9ada5bfe800" - "7c221f201254ad2017201956ad7d7c2212201554ad201242a2cffaf397c9" - "eed7c7007c2217201254ad7c50ad7d42a9c0c689aece93b2307d211d0b20" - "0320173703b003200320243703a0032003201d3703b8032003201f3703a8" - "0342ddb0858ce8b691a8b87f2119200341a0036a2024201f2017201d42c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f102b2018420186201b423f" - "88842112201b420186211602400240201c4201862018423f8884222542dd" - "b0858ce8b691a8b87f85201320137c201c423f887c221542a9c0c689aece" - "93b2308584500440201642c7faf3c3ed82a3903c542012428d95c7c396d2" - "dac0977f542012428d95c7c396d2dac0977f511b450d0120162128201221" - "1642a9c0c689aece93b23021150c020b202542deb0858ce8b691a8b87f54" - "201542a9c0c689aece93b23054201542a9c0c689aece93b230511b450d00" - "2016212820122116202521190c010b201520252012201642c7faf3c3ed82" - "a3903c7d222820165aad22197d222c42f3eab8bce9ada5bfe8007c221620" - "2c54ad2012201954ad7d7c2212202554ad201242a2cffaf397c9eed7c700" - "7c2219201254ad7c50ad7d42a9c0c689aece93b2307d21150b42ddb0858c" - "e8b691a8b87f2112200341a0036a202820162019201542c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d2011420186201a423f88842116201a420186211a02400240" - "201e4201862011423f8884221942ddb0858ce8b691a8b87f85201420147c" - "201e423f887c221542a9c0c689aece93b2308584500440201a42c7faf3c3" - "ed82a3903c542016428d95c7c396d2dac0977f542016428d95c7c396d2da" - "c0977f511b450d01201a21112016211a42a9c0c689aece93b23021150c02" - "0b201942deb0858ce8b691a8b87f54201542a9c0c689aece93b230542015" - "42a9c0c689aece93b230511b450d00201a21112016211a201921120c010b" - "201520192016201a42c7faf3c3ed82a3903c7d2211201a5aad22127d2214" - "42f3eab8bce9ada5bfe8007c221a201454ad2012201656ad7d7c22142019" - "54ad201442a2cffaf397c9eed7c7007c2212201454ad7c50ad7d42a9c0c6" - "89aece93b2307d21150b201a4201862011423f8884211e42ddb0858ce8b6" - "91a8b87f211420114201862111024002402012420186201a423f88842216" - "42ddb0858ce8b691a8b87f85201520157c2012423f887c221542a9c0c689" - "aece93b2308584500440201142c7faf3c3ed82a3903c54201e428d95c7c3" - "96d2dac0977f54201e428d95c7c396d2dac0977f511b450d012011211a20" - "1e211142a9c0c689aece93b23021150c020b201642deb0858ce8b691a8b8" - "7f54201542a9c0c689aece93b23054201542a9c0c689aece93b230511b45" - "0d002011211a201e2111201621140c010b20152016201e201142c7faf3c3" - "ed82a3903c7d221a20115aad22127d221442f3eab8bce9ada5bfe8007c22" - "11201454ad2012201e56ad7d7c2212201654ad201242a2cffaf397c9eed7" - "c7007c2214201254ad7c50ad7d42a9c0c689aece93b2307d21150b201142" - "0186201a423f8884211242ddb0858ce8b691a8b87f2116201a420186211e" - "0240024020144201862011423f8884221142ddb0858ce8b691a8b87f8520" - "1520157c2014423f887c221542a9c0c689aece93b2308584500440201e42" - "c7faf3c3ed82a3903c542012428d95c7c396d2dac0977f542012428d95c7" - "c396d2dac0977f511b450d01201e21142012211e42a9c0c689aece93b230" - "21150c020b201142deb0858ce8b691a8b87f54201542a9c0c689aece93b2" - "3054201542a9c0c689aece93b230511b450d00201e21142012211e201121" - "160c010b201520112012201e42c7faf3c3ed82a3903c7d2214201e5aad22" - "1a7d221642f3eab8bce9ada5bfe8007c221e201654ad2012201a54ad7d7c" - "2212201154ad201242a2cffaf397c9eed7c7007c2216201254ad7c50ad7d" - "42a9c0c689aece93b2307d21150b20034198036a2201200241186a290300" - "37030020034190036a2204200241106a2903003703002003200229030037" - "0380032003200241086a2903003703880342ddb0858ce8b691a8b87f2112" - "20034180036a202120232020202242c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f102b2003201d3703f802200320173703f0022003201f3703e8" - "02200320243703e002200129030021212004290300212320032903800321" - "22200329038803211d200120133703002003201c37039003200320183703" - "88032003201b3703800320034180036a20032903a00320032903a8032003" - "2903b003200341b8036a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200341" - "e0026a200329038003200329038803200329039003200129030042c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f102b200341e0026a2014201e20" - "16201542c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8" - "b691a8b87f42a9c0c689aece93b230102d201d4201862022423f88842120" - "20224201862122024002402023420186201d423f8884221342ddb0858ce8" - "b691a8b87f85202120217c2023423f887c222142a9c0c689aece93b23085" - "84500440202242c7faf3c3ed82a3903c542020428d95c7c396d2dac0977f" - "542020428d95c7c396d2dac0977f511b450d01202221232020212242a9c0" - "c689aece93b23021210c020b201342deb0858ce8b691a8b87f54202142a9" - "c0c689aece93b23054202142a9c0c689aece93b230511b450d0020222123" - "20202122201321120c010b202120132020202242c7faf3c3ed82a3903c7d" - "222320225aad221d7d221542f3eab8bce9ada5bfe8007c2222201554ad20" - "1d202056ad7d7c2220201354ad202042a2cffaf397c9eed7c7007c221220" - "2054ad7c50ad7d42a9c0c689aece93b2307d21210b200020123703502000" - "2023370340200020032903a003370300200020032903e002370320200020" - "2137035820002022370348200041086a20032903a803370300200041286a" - "20032903e802370300200041186a200341b8036a29030037030020004110" - "6a200341b0036a290300370300200041306a200341f0026a290300370300" - "200041386a200341f8026a2903003703000c020b2000200241e000104c1a" - "0c010b2000200141e000104c1a0b200341c0036a24000b970802067f087e" - "230041a0016b220224000240200129034022082001290350220984200141" - "c8006a290300220a200141d8006a290300220b8484420052044020024200" - "370318200242003703102002420037030820024201370300024020014140" - "6b2002104a450440200241206a2001290320220837030020002001290300" - "2209370310200041306a2008370300200241386a200141386a2903002208" - "370300200241306a200141306a290300220a370300200241286a20014128" - "6a290300220b370300200241106a200141106a290300220c370300200241" - "186a200141186a290300220d370300200041186a200141086a290300220e" - "370300200041206a200c370300200041286a200d370300200041386a200b" - "370300200041406b200a370300200041c8006a2008370300200220093703" - "002002200e3703080c010b20024198016a2204200b370300200220093703" - "900120022008370380012002200a37038801200242a9c0c689aece93b230" - "370318200242ddb0858ce8b691a8b87f3703102002428d95c7c396d2dac0" - "977f370308200242c7faf3c3ed82a3903c37030020024180016a2002103a" - "20022903800121082002290388012109200229039001210a200241186a22" - "032004290300220b3703002002200a370310200220093703082002200837" - "0300200220082009200a200b42c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f102b2003290300210c2002290310210d2002290308210e20022903" - "00210f200241d0006a2204200141106a290300370300200241d8006a2205" - "200141186a290300370300200220012903003703402002200141086a2903" - "00370348200241406b200f200e200d200c42c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f102b200241f8006a2206200141386a29030037030020" - "0241f0006a2207200141306a2903003703002002200141286a2903003703" - "68200220012903203703602003200b3703002002200a3703102002200937" - "0308200220083703002002200f200e200d200c42c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f102b200241e0006a200229030020022903082002" - "290310200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f10" - "2b200320052903002208370300200241106a200429030022093703002002" - "41206a2002290360220a370300200241286a2002290368220b3703002002" - "41306a2007290300220c370300200241386a2006290300220d3703002000" - "2002290340220e370310200041186a2002290348220f370300200041206a" - "2009370300200041286a2008370300200041306a200a370300200041386a" - "200b370300200041406b200c370300200041c8006a200d3703002002200f" - "3703082002200e3703000b20004200370308200042013703000c010b2000" - "4200370308200042003703000b200241a0016a24000b3000200128021c20" - "002d0000410274220041cca5c0006a280200200041c0a5c0006a28020020" - "0128022028020c1103000bf917021d7f087e23004180066b220224002002" - "41b8036a2208200141386a290300370300200241b0036a2209200141306a" - "290300370300200241a8036a2213200141286a290300370300200241a003" - "6a2214200141206a29030037030020024198036a2203200141186a290300" - "37030020024190036a2204200141106a2903003703002002200129030037" - "0380032002200141086a2903003703880320024180036a20012001102f20" - "0241f8036a2205200141f8006a290300370300200241f0036a2206200141" - "f0006a290300370300200241e8036a2207200141e8006a29030037030020" - "0241e0036a220a200141e0006a290300370300200241d8036a220b200141" - "d8006a290300370300200241d0036a220c200141d0006a29030037030020" - "02200141c8006a2903003703c803200220012903403703c003200241c003" - "6a200141406b221e201e102f200241b8046a221520052903003703002002" - "41b0046a22162006290300370300200241a8046a22172007290300370300" - "200241a0046a2218200a29030037030020024198046a2219200b29030037" - "030020024190046a221a200c290300370300200220022903c80337038804" - "200220022903c0033703800420024180046a200241c0036a200241c0036a" - "102f200241c0026a2001200241c0036a1030200241f8046a221b200241f8" - "026a2205290300370300200241f0046a220e200241f0026a220a29030037" - "0300200241e8046a220f200241e8026a2206290300370300200241e0046a" - "2210200241e0026a220c290300370300200241d8046a220d200241d8026a" - "2207290300370300200241d0046a2211200241d0026a220b290300370300" - "200220022903c8023703c804200220022903c0023703c004200241c0046a" - "200241c0026a200241c0026a102f200241d8056a2212200d290300370300" - "200241d0056a220d2011290300370300200220022903c8043703c8052002" - "20022903c0043703c005200241c0056a2002290380032002290388032004" - "290300200329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241f8056a2203" - "201b290300370300200241f0056a2204200e2903003703002002200f2903" - "003703e805200220102903003703e005200241e0056a2014290300201329" - "03002009290300200829030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20024198" - "026a2208201229030037030020024190026a2209200d2903003703002002" - "41a8026a221320022903e805370300200241b0026a221420042903003703" - "00200241b8026a221b2003290300370300200220022903c8053703880220" - "0220022903c00537038002200220022903e0053703a00220122008290300" - "370300200d200929030037030020022002290388023703c8052002200229" - "0380023703c005200241c0056a200229038004200229038804201a290300" - "201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2003201b29030037030020" - "042014290300370300200220132903003703e805200220022903a0023703" - "e005200241e0056a201829030020172903002016290300201529030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200241186a22152012290300370300200241" - "106a2216200d290300370300200241206a221720022903e0053703002002" - "41286a221820022903e805370300200241306a2219200429030037030020" - "0241386a221a2003290300370300200220022903c8053703082002200229" - "03c005370300200241c0026a200220021030201a20052903003703002019" - "200a290300370300201820062903003703002017200c2903003703002015" - "20072903003703002016200b290300370300200220022903c80237030820" - "0220022903c002370300200241c0026a20024180036a20024180036a1030" - "200241406b200241c0026a20024180036a103020024190056a220e200241" - "d0006a29030037030020024198056a220f200241d8006a29030037030020" - "0241a0056a2210200241e0006a290300370300200241a8056a2211200241" - "e8006a290300370300200241b0056a221c200241f0006a29030037030020" - "0241b8056a221d200241f8006a2903003703002002200229034037038005" - "200220022903483703880520024180056a200241406b200241406b102f20" - "0241c0026a2002200210302003200f2903003703002004200e2903003703" - "0020022002290388053703e80520022002290380053703e005200241e005" - "6a20022903c00220022903c80220022903d002200729030042c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d2008201d2903003703002009201c2903003703002002" - "201129030037038802200220102903003703800220024180026a20022903" - "e002200629030020022903f002200529030042c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d2008290300211f200929030021202003290300212120042903002122" - "2002290388022123200229038002212420022903e805212520022903e005" - "212620024180016a20024180046a20024180046a1030200241c0026a2002" - "4180016a20024180016a1030200241b8016a220e20052903003703002002" - "41b0016a220f200a290300370300200241a8016a22102006290300370300" - "200241a0016a2211200c29030037030020024198016a221c200729030037" - "030020024190016a221d200b290300370300200220022903c80237038801" - "200220022903c00237038001200241c0026a20024180016a20024180016a" - "1030200e2005290300370300200f200a2903003703002010200629030037" - "03002011200c290300370300201c2007290300370300201d200b29030037" - "0300200220022903c80237038801200220022903c00237038001200241c0" - "016a201e20014180016a102f200320152903003703002004201629030037" - "0300200220022903083703e805200220022903003703e005200241e0056a" - "202620252022202142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2008201a29030037" - "030020092019290300370300200220182903003703880220022017290300" - "3703800220024180026a202420232020201f42c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d20072003290300370300200b20042903003703002006200229038802" - "370300200a200929030037030020052008290300370300200220022903e8" - "053703c802200220022903e0053703c00220022002290380023703e00220" - "024180026a200241406b200241c0026a102f20122008290300370300200d" - "200929030037030020022002290388023703c80520022002290380023703" - "c005200241c0056a200229038001200229038801201d290300201c290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2003201b290300370300200420142903" - "00370300200220132903003703e805200220022903a0023703e005200241" - "e0056a20112903002010290300200f290300200e29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d20072012290300370300200b200d290300370300200c20" - "022903e005370300200620022903e805370300200a200429030037030020" - "052003290300370300200220022903c8053703c802200220022903c00537" - "03c00220004180016a200241c0016a200241c0016a10302000201f370338" - "200020203703302000202337032820002024370320200020213703182000" - "20223703102000202537030820002026370300200020022903c002370340" - "200041c8006a20022903c802370300200041d0006a200b29030037030020" - "0041d8006a2007290300370300200041e0006a200c290300370300200041" - "e8006a2006290300370300200041f0006a200a290300370300200041f800" - "6a200529030037030020024180066a24000bbd21021c7f087e230041800b" - "6b22032400024002400240024020012903800120014188016a2903008442" - "00520d0020012903900120014198016a290300844200520d0020012903a0" - "01200141a8016a290300844200520d0020012903b001200141b8016a2903" - "0084500d010b024020022903800120024188016a290300844200520d0020" - "022903900120024198016a290300844200520d0020022903a001200241a8" - "016a290300844200520d0020022903b001200241b8016a29030084500d02" - "0b200341b8086a221420014180016a220441386a290300370300200341b0" - "086a200441306a290300370300200341a8086a2215200441286a29030037" - "0300200341a0086a200441206a29030037030020034198086a2216200441" - "186a29030037030020034190086a200441106a2903003703002003200429" - "0300370380082003200441086a2903003703880820034180086a20042004" - "102f200341f8086a221720024180016a220541386a290300370300200341" - "f0086a200541306a290300370300200341e8086a2218200541286a290300" - "370300200341e0086a200541206a290300370300200341d8086a22192005" - "41186a290300370300200341d0086a200541106a29030037030020032005" - "41086a2903003703c808200320052903003703c008200341c0086a200520" - "05102f20032001200341c0086a102f200341406b200220034180086a102f" - "20034180016a200420034180086a102f200341c0016a2005200341c0086a" - "102f20034180026a200141406b200341c0016a102f200341c0026a200241" - "406b20034180016a102f024002402003200341406b104a0d00200341206a" - "200341e0006a104a0d0020034180026a200341c0026a104a0d00200341a0" - "026a200341e0026a104a450d010b200341386a290300211f200341286a29" - "03002120200329033021212003290320212220034198076a2201200341d8" - "006a29030037030020034190076a2202200341d0006a2903003703002003" - "200329034837038807200320032903403703800720034180076a20032903" - "0020032903082003290310200341186a29030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d200341d8076a2206200341f8006a290300370300200341d0076a22" - "09200341f0006a2903003703002003200341e8006a2903003703c8072003" - "20032903603703c007200341c0076a202220202021201f42c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d20034198036a200129030037030020034190036a200229" - "0300370300200341a8036a20032903c807370300200341b0036a20092903" - "00370300200341b8036a2006290300370300200320032903880737038803" - "200320032903800737038003200320032903c0073703a003200341b8026a" - "290300211f200341a8026a290300212020032903b002212120032903a002" - "21222001200341d8026a2903003703002002200341d0026a290300370300" - "200320032903c80237038807200320032903c0023703800720034180076a" - "20032903800220032903880220032903900220034198026a29030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2006200341f8026a2903003703002009200341" - "f0026a2903003703002003200341e8026a2903003703c807200320032903" - "e0023703c007200341c0076a202220202021201f42c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93" - "b230102d200341d8036a2001290300370300200341d0036a200229030037" - "0300200341e8036a20032903c807370300200341f0036a20092903003703" - "00200341f8036a200629030037030020032003290388073703c803200320" - "03290380073703c003200320032903c0073703e003200341c0076a200341" - "80036a20034180036a1030200341b8096a200341f8076a220c2903003703" - "00200341b0096a200341f0076a2211290300370300200341a8096a200341" - "e8076a220d290300370300200341a0096a200341e0076a221a2903003703" - "0020034198096a200629030037030020034190096a200929030037030020" - "0320032903c80737038809200320032903c0073703800920034180096a20" - "0341c0076a200341c0076a102f20034180046a20034180036a2003418009" - "6a102f200341c0046a200341c0036a200341c0036a103020034180056a20" - "0320034180096a102f200341c0056a20034180026a20034180046a102f20" - "0341d0096a220a200341d0046a290300370300200341d8096a2207200341" - "d8046a290300370300200341e0096a220b200341e0046a29030037030020" - "0341e8096a220e200341e8046a290300370300200341f0096a220f200341" - "f0046a290300370300200341f8096a2210200341f8046a29030037030020" - "0320032903c0043703c009200320032903c8043703c809200341c0096a20" - "0341c0046a200341c0046a102f200341d8066a2208200729030037030020" - "0341d0066a2207200a290300370300200320032903c8093703c806200320" - "032903c0093703c006200341c0066a200329038004200329038804200329" - "03900420034198046a29030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20062010" - "2903003703002009200f2903003703002003200e2903003703c807200320" - "0b2903003703c007200341c0076a20032903a004200341a8046a29030020" - "032903b004200341b8046a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2001" - "200829030037030020022007290300370300200341a8076a220e20032903" - "c807370300200341b0076a220f2009290300370300200341b8076a221020" - "06290300370300200320032903c80637038807200320032903c006370380" - "07200320032903c0073703a007200341c0076a20034180056a2003418005" - "6a103020034198066a2212200129030037030020034190066a2213200229" - "030037030020032003290388073703880620032003290380073703800620" - "034180066a20032903c00720032903c80720032903d007200629030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200820102903003703002007200f29030037" - "03002003200e2903003703c806200320032903a0073703c006200341c006" - "6a20032903e007200d29030020032903f007200c29030042c7faf3c3ed82" - "a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689" - "aece93b230102d2008290300211f20072903002120201229030021212013" - "290300212220032903c806212320032903c0062124200329038806212520" - "03290380062126200820034198056a290300370300200720034190056a29" - "030037030020032003290388053703c80620032003290380053703c00620" - "0341c0066a202620252022202142c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200120" - "0341b8056a2903003703002002200341b0056a2903003703002003200341" - "a8056a29030037038807200320032903a0053703800720034180076a2024" - "20232020201f42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20062008290300370300" - "20092007290300370300200d200329038807370300201120022903003703" - "00200c2001290300370300200320032903c8063703c807200320032903c0" - "063703c00720032003290380073703e00720034180076a200341c0046a20" - "0341c0076a102f200341c0076a200341c0056a200341c0056a1030200341" - "f80a6a220a2001290300370300200341f00a6a220b200229030037030020" - "032003290388073703e80a20032003290380073703e00a200341e00a6a20" - "032903c00720032903c80720032903d007200629030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d200820102903003703002007200f2903003703002003200e" - "2903003703c806200320032903a0073703c006200341c0066a20032903e0" - "07200d29030020032903f007200c29030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d2012200a2903003703002013200b290300370300200341a0066a221b20" - "032903c006370300200341a8066a221c20032903c806370300200341b006" - "6a221d2007290300370300200341b8066a221e2008290300370300200320" - "032903e80a37038806200320032903e00a37038006200341c0076a200420" - "051030200341b80a6a2204200c290300370300200341b00a6a2205201129" - "0300370300200341a80a6a220c200d290300370300200341a00a6a220d20" - "1a290300370300200341980a6a22112006290300370300200341900a6a22" - "062009290300370300200320032903c8073703880a200320032903c00737" - "03800a200341800a6a200341c0076a200341c0076a102f200a2011290300" - "370300200b2006290300370300200320032903880a3703e80a2003200329" - "03800a3703e00a200341e00a6a2003290380082003290388082003290390" - "08201629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d20082004290300370300" - "200720052903003703002003200c2903003703c8062003200d2903003703" - "c006200341c0066a20032903a008201529030020032903b0082014290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2001200a2903003703002002200b2903" - "00370300200e20032903c806370300200f20072903003703002010200829" - "0300370300200320032903e80a37038807200320032903e00a3703800720" - "0320032903c0063703a007200341d80a6a22042001290300370300200341" - "d00a6a2201200229030037030020032003290388073703c80a2003200329" - "0380073703c00a200341c00a6a20032903c00820032903c80820032903d0" - "08201929030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200a2010290300370300" - "200b200f2903003703002003200e2903003703e80a200320032903a00737" - "03e00a200341e00a6a20032903e008201829030020032903f00820172903" - "0042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691" - "a8b87f42a9c0c689aece93b230102d200820042903003703002007200129" - "0300370300200341e8066a20032903e80a370300200341f0066a200b2903" - "00370300200341f8066a200a290300370300200320032903c80a3703c806" - "200320032903c00a3703c006200320032903e00a3703e00620004180016a" - "200341c0066a20034180036a102f2000201f370338200020203703302000" - "202337032820002024370320200020213703182000202237031020002025" - "370308200020263703002000200329038006370340200041c8006a200329" - "038806370300200041d0006a2013290300370300200041d8006a20122903" - "00370300200041e0006a201b290300370300200041e8006a201c29030037" - "0300200041f0006a201d290300370300200041f8006a201e290300370300" - "0c030b2000200110430c020b2000200241c001104c1a0c010b2000200141" - "c001104c1a0b200341800b6a24000bf50602037f067e230041c0026b2202" - "24000240024002400240024020012903800120014188016a290300844200" - "520d0020012903900120014198016a290300844200520d0020012903a001" - "200141a8016a290300844200520d0020012903b001200141b8016a290300" - "84500d010b200241d8006a4200370300200241e0006a2204420037030020" - "0241e8006a4200370300200241f0006a4200370300200241f8006a420037" - "030020024200370348200242013703402002420037035020014180016a22" - "03200241406b104a450440200141a0016a2004104a450d020b200241406b" - "200310312002280240410171450d02200241386a20024188016a29030022" - "05370300200241306a20024180016a22032903002206370300200241286a" - "200241f8006a2903002207370300200241206a200241f0006a2903002208" - "370300200241186a200241e8006a2903002209370300200241106a200241" - "e0006a290300220a37030020024190026a200a37030020024198026a2009" - "370300200241a0026a2008370300200241a8026a2007370300200241b002" - "6a2006370300200241b8026a200537030020022002290350220537030020" - "02200241d8006a2903002206370308200220053703800220022006370388" - "0220024180026a20022002102f200241406b200120024180026a102f2002" - "41c0016a200220024180026a102f2003200141406b200241c0016a102f20" - "0041106a200241406b418001104c1a20004200370308200042013703000c" - "030b20004200370308200042003703000c020b200241b8016a200141f800" - "6a290300370300200241b0016a200141f0006a290300370300200241a801" - "6a200141e8006a290300370300200241a0016a200141e0006a2903003703" - "0020024198016a200141d8006a29030037030020024190016a200141d000" - "6a29030037030020024188016a200141c8006a290300370300200241d000" - "6a200141106a290300370300200241d8006a200141186a29030037030020" - "0241e0006a200141206a290300370300200241e8006a200141286a290300" - "370300200241f0006a200141306a290300370300200241f8006a20014138" - "6a2903003703002002200129034037038001200220012903003703402002" - "200141086a290300370348200041106a200241406b418001104c1a200042" - "00370308200042013703000c010b4194a1c0001020000b200241c0026a24" - "000bd64502497f107e230041a00f6b22022400200241386a223f200141f8" - "006a220e290300370300200241306a2240200141f0006a220f2903003703" - "00200241286a2241200141e8006a2210290300370300200241206a224220" - "0141e0006a2211290300370300200241186a2243200141d8006a22122903" - "00370300200241106a2244200141d0006a22202903003703002002200129" - "03403703002002200141c8006a2221290300370308200141a8016a222329" - "03002153200141a0016a22242903002154200141b8016a22252903002155" - "200141b0016a2230290300215620014188016a2235290300215720014198" - "016a2236290300215820014190016a22372903002159200129038001215a" - "200241f8006a200141f8016a2213290300370300200241f0006a200141f0" - "016a2214290300370300200241e8006a200141e8016a2215290300370300" - "200241e0006a200141e0016a2216290300370300200241d8006a200141d8" - "016a2217290300370300200241d0006a200141d0016a220d290300370300" - "20024190016a20014190026a220429030037030020024198016a20014198" - "026a2206290300370300200241a0016a200141a0026a2207290300370300" - "200241a8016a200141a8026a2208290300370300200241b0016a200141b0" - "026a2205290300370300200241b8016a200141b8026a2209290300370300" - "2002200141c8016a2222290300370348200220012903c001370340200220" - "012903800237038001200220014188026a220a29030037038801200241f8" - "016a200141f8026a2238290300370300200241f0016a200141f0026a2245" - "290300370300200241e8016a200141e8026a2246290300370300200241e0" - "016a200141e0026a2247290300370300200241d8016a200141d8026a2248" - "290300370300200241d0016a200141d0026a2249290300370300200241b8" - "026a2226200141386a2231290300370300200241b0026a2227200141306a" - "2232290300370300200241a8026a2228200141286a223a29030037030020" - "0241a0026a2229200141206a223b29030037030020024198026a222a2001" - "41186a223c29030037030020024190026a222b200141106a223d29030037" - "03002002200141c8026a224a2903003703c801200220012903c0023703c0" - "012002200141086a223e2903003703880220022001290300370380022002" - "4180026a200120014180026a2203102f200241f8026a2219203129030037" - "0300200241f0026a221a2032290300370300200241e8026a221b203a2903" - "00370300200241e0026a221c203b290300370300200241d8026a221d203c" - "290300370300200241d0026a221e203d2903003703002002203e29030037" - "03c802200220012903003703c002200241c0026a200120031030200241b8" - "036a220b2009290300370300200241b0036a220920052903003703002002" - "41a8036a22052008290300370300200241a0036a220c2007290300370300" - "20024198036a2218200629030037030020024190036a221f200429030037" - "0300200242003703b80d200242003703b00d200242003703a80d20024201" - "3703a00d200242003703980d200242003703900d200242003703880d2002" - "42093703800d2002200a2903003703880320022001290380023703800320" - "024180036a2003200241800d6a102f200241c00b6a20024180036a200110" - "30200b200241f80b6a22062903003703002009200241f00b6a2207290300" - "3703002005200241e80b6a2208290300370300200c200241e00b6a220529" - "03003703002018200241d80b6a2203290300370300201f200241d00b6a22" - "04290300370300200220022903c80b37038803200220022903c00b370380" - "03200241c00b6a200241c0026a20024180036a102f201920062903003703" - "00201a2007290300370300201b2008290300370300201c20052903003703" - "00201d2003290300370300201e2004290300370300200220022903c80b37" - "03c802200220022903c00b3703c002200241980f6a220b201d2903003703" - "00200241900f6a220c201e290300370300200220022903c8023703880f20" - "0220022903c0023703800f200241800f6a20022903800220022903880220" - "2b290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f" - "42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200241980a6a22" - "092019290300370300200241900a6a220a201a2903003703002002201b29" - "03003703880a2002201c2903003703800a200241800a6a20292903002028" - "2903002027290300202629030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200320" - "0b290300224b3703002004200c290300224c370300200520022903800a22" - "4d3703002007200a290300224e370300200820022903880a224f37030020" - "0620092903002250370300200220022903880f22513703c80b2002200229" - "03800f22523703c00b20192050370300201a204e370300201b204f370300" - "201c204d370300201d204b370300201e204c370300200220513703c80220" - "0220523703c002200241c0036a20024180026a200241800d6a102f200b20" - "1d290300370300200c201e290300370300200220022903c8023703880f20" - "0220022903c0023703800f200241800f6a20022903c00320022903c80320" - "022903d003200241d8036a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009" - "2019290300370300200a201a2903003703002002201b2903003703880a20" - "02201c2903003703800a200241800a6a20022903e003200241e8036a2903" - "0020022903f003200241f8036a29030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2003200b290300224b3703002004200c290300224c370300200520022903" - "800a224d3703002007200a290300224e370300200820022903880a224f37" - "0300200620092903002250370300200220022903880f22513703c80b2002" - "20022903800f22523703c00b20192050370300201a204e370300201b204f" - "370300201c204d370300201d204b370300201e204c370300200220513703" - "c802200220523703c002200241c00b6a20024180026a20024180026a1030" - "202620062903003703002027200729030037030020282008290300370300" - "20292005290300370300202a2003290300370300202b2004290300370300" - "200220022903c80b37038802200220022903c00b3703800220024190046a" - "221f200d29030037030020024198046a222c2017290300370300200241a0" - "046a222d2016290300370300200241a8046a222e20152903003703002002" - "41b0046a222f2014290300370300200241b8046a22392013290300370300" - "200220012903c00137038004200220222903003703880420024180046a20" - "0141c0016a223320014180016a2234102f200241f8046a22182013290300" - "370300200241f0046a22132014290300370300200241e8046a2214201529" - "0300370300200241e0046a22152016290300370300200241d8046a221620" - "17290300370300200241d0046a2217200d29030037030020022022290300" - "3703c804200220012903c0013703c004200241c0046a2033203410302002" - "41b8056a220d2025290300370300200241b0056a22222030290300370300" - "200241a8056a22252023290300370300200241a0056a2223202429030037" - "030020024198056a2224203629030037030020024190056a223020372903" - "003703002002203529030037038805200220012903800137038005200241" - "80056a2034200241800d6a102f200241c00b6a20024180056a2033103020" - "0d2006290300370300202220072903003703002025200829030037030020" - "232005290300370300202420032903003703002030200429030037030020" - "0220022903c80b37038805200220022903c00b37038005200241c00b6a20" - "0241c0046a20024180056a102f2018200629030037030020132007290300" - "370300201420082903003703002015200529030037030020162003290300" - "37030020172004290300370300200220022903c80b3703c8042002200229" - "03c00b3703c004200b2016290300370300200c2017290300370300200220" - "022903c8043703880f200220022903c0043703800f200241800f6a200229" - "038004200229038804201f290300202c29030042c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d20092018290300370300200a201329030037030020022014290300" - "3703880a200220152903003703800a200241800a6a202d290300202e2903" - "00202f290300203929030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b29" - "0300224b3703002004200c290300224c370300200520022903800a224d37" - "03002007200a290300224e370300200820022903880a224f370300200620" - "092903002250370300200220022903880f22513703c80b20022002290380" - "0f22523703c00b201820503703002013204e3703002014204f3703002015" - "204d3703002016204b3703002017204c370300200220513703c804200220" - "523703c004200241c0056a20024180046a200241800d6a102f200b201629" - "0300370300200c2017290300370300200220022903c8043703880f200220" - "022903c0043703800f200241800f6a20022903c00520022903c805200229" - "03d005200241d8056a29030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20092018" - "290300370300200a2013290300370300200220142903003703880a200220" - "152903003703800a200241800a6a20022903e005200241e8056a29030020" - "022903f005200241f8056a29030042c7faf3c3ed82a3903c428d95c7c396" - "d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003" - "200b290300224b3703002004200c290300224c370300200520022903800a" - "224d3703002007200a290300224e370300200820022903880a224f370300" - "200620092903002250370300200220022903880f22513703c80b20022002" - "2903800f22523703c00b201820503703002013204e3703002014204f3703" - "002015204d3703002016204b3703002017204c370300200220513703c804" - "200220523703c004200241c00b6a20024180046a20024180046a10302039" - "2006290300370300202f2007290300370300202e2008290300370300202d" - "2005290300370300202c2003290300370300201f20042903003703002002" - "20022903c80b37038804200220022903c00b3703800420024190066a2222" - "202029030037030020024198066a22332012290300370300200241a0066a" - "22342011290300370300200241a8066a22232010290300370300200241b0" - "066a2224200f290300370300200241b8066a2225200e2903003703002002" - "200129034037038006200220212903003703880620024180066a20014140" - "6b200141c0026a2230102f200241f8066a220d200e290300370300200241" - "f0066a220e200f290300370300200241e8066a220f201029030037030020" - "0241e0066a22102011290300370300200241d8066a221120122903003703" - "00200241d0066a22122020290300370300200220212903003703c8062002" - "20012903403703c006200241c0066a200220301030200241b8076a222020" - "38290300370300200241b0076a22212045290300370300200241a8076a22" - "352046290300370300200241a0076a223620472903003703002002419807" - "6a2237204829030037030020024190076a22382049290300370300200220" - "4a29030037038807200220012903c0023703800720024180076a20302002" - "41800d6a102f200241c00b6a20024180076a200210302020200629030037" - "030020212007290300370300203520082903003703002036200529030037" - "03002037200329030037030020382004290300370300200220022903c80b" - "37038807200220022903c00b37038007200241c00b6a200241c0066a2002" - "4180076a102f200d2006290300370300200e2007290300370300200f2008" - "290300370300201020052903003703002011200329030037030020122004" - "290300370300200220022903c80b3703c806200220022903c00b3703c006" - "200b2011290300370300200c2012290300370300200220022903c8063703" - "880f200220022903c0063703800f200241800f6a20022903800620022903" - "88062022290300203329030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2009200d" - "290300370300200a200e2903003703002002200f2903003703880a200220" - "102903003703800a200241800a6a20342903002023290300202429030020" - "2529030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b370300" - "2004200c290300224c370300200520022903800a224d3703002007200a29" - "0300224e370300200820022903880a224f37030020062009290300225037" - "0300200220022903880f22513703c80b200220022903800f22523703c00b" - "200d2050370300200e204e370300200f204f3703002010204d3703002011" - "204b3703002012204c370300200220513703c806200220523703c0062002" - "41c0076a20024180066a200241800d6a102f200b2011290300370300200c" - "2012290300370300200220022903c8063703880f200220022903c0063703" - "800f200241800f6a20022903c00720022903c80720022903d007200241d8" - "076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb085" - "8ce8b691a8b87f42a9c0c689aece93b230102d2009200d29030037030020" - "0a200e2903003703002002200f2903003703880a20022010290300370380" - "0a200241800a6a20022903e007200241e8076a29030020022903f0072002" - "41f8076a29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d2003200b290300224b" - "3703002004200c290300224c370300200520022903800a224d3703002007" - "200a290300224e370300200820022903880a224f37030020062009290300" - "2250370300200220022903880f22513703c80b200220022903800f225237" - "03c00b200d2050370300200e204e370300200f204f3703002010204d3703" - "002011204b3703002012204c370300200220513703c806200220523703c0" - "06200241c00b6a20024180066a20024180066a1030202520062903003703" - "002024200729030037030020232008290300370300203420052903003703" - "002033200329030037030020222004290300370300200220022903c80b37" - "038806200220022903c00b370380062009201d290300370300200a201e29" - "0300370300200220022903c8023703880a200220022903c0023703800a20" - "0241800a6a2001290300203e290300203d290300203c29030042c7faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b230102d200320192903003703002004201a29030037030020" - "02201b2903003703c80b2002201c2903003703c00b200241c00b6a203b29" - "0300203a2903002032290300203129030042c7faf3c3ed82a3903c428d95" - "c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b23010" - "2d200241d80d6a221c2009290300370300200241d00d6a221d200a290300" - "370300200241e00d6a221e20022903c00b370300200241e80d6a22202002" - "2903c80b370300200241f00d6a22212004290300370300200241f80d6a22" - "312003290300370300200220022903880a3703c80d200220022903800a37" - "03c00d200241c00b6a200241c00d6a200241c00d6a103020312006290300" - "3703002021200729030037030020202008290300370300201e2005290300" - "370300201c2003290300370300201d2004290300370300200220022903c8" - "0b3703c80d200220022903c00b3703c00d200241c00b6a200241c00d6a20" - "0241c0026a10302031200629030037030020212007290300370300202020" - "08290300370300201e2005290300370300201c2003290300370300201d20" - "0429030037030020024190086a2232202b29030037030020024198086a22" - "2b202a290300370300200241a0086a222a2029290300370300200241a808" - "6a22292028290300370300200241b0086a22282027290300370300200241" - "b8086a22272026290300370300200220022903c80b3703c80d2002200229" - "03c00b3703c00d2002200229038002370380082002200229038802370388" - "0820024180086a20024180026a20024180016a1030200241c00b6a200241" - "80086a20024180086a103020272006290300370300202820072903003703" - "0020292008290300370300202a2005290300370300202b20032903003703" - "0020322004290300370300200220022903c80b37038808200220022903c0" - "0b37038008200241c00b6a20024180086a20024180026a10302027200629" - "03003703002028200729030037030020292008290300370300202a200529" - "0300370300202b200329030037030020322004290300370300200241d008" - "6a22012022290300370300200241d8086a220b2033290300370300200241" - "e0086a220c2034290300370300200241e8086a2219202329030037030020" - "0241f0086a221a2024290300370300200241f8086a221b20252903003703" - "00200220022903c80b37038808200220022903c00b370380082002200229" - "0380063703c00820022002290388063703c808200241c0086a2002418006" - "6a200241800d6a102f200241c00b6a200241c0086a200241406b1030201b" - "2006290300370300201a200729030037030020192008290300370300200c" - "2005290300370300200b2003290300370300200120042903003703002002" - "20022903c80b3703c808200220022903c00b3703c008200241c00b6a2002" - "41c0086a200241c0086a1030201b2006290300370300201a200729030037" - "030020192008290300370300200c2005290300370300200b200329030037" - "030020012004290300370300200220022903c80b3703c808200220022903" - "c00b3703c00820024180096a20024180066a200241800d6a102f200241c0" - "0b6a200241c0086a20024180096a1030201b2006290300370300201a2007" - "29030037030020192008290300370300200c2005290300370300200b2003" - "29030037030020012004290300370300200220022903c80b3703c8082002" - "20022903c00b3703c00820092011290300370300200a2012290300370300" - "200220022903c8063703880a200220022903c0063703800a200241800a6a" - "205a20572059205842c7faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2003200d29030037" - "03002004200e2903003703002002200f2903003703c80b20022010290300" - "3703c00b200241c00b6a205420532056205542c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d200241980e6a220d2009290300370300200241900e6a220e200a2903" - "00370300200241a00e6a220f20022903c00b370300200241a80e6a221020" - "022903c80b370300200241b00e6a22112004290300370300200241b80e6a" - "22122003290300370300200220022903880a3703880e200220022903800a" - "3703800e200241c00b6a200241800e6a200241800e6a1030201220062903" - "003703002011200729030037030020102008290300370300200f20052903" - "00370300200d2003290300370300200e2004290300370300200220022903" - "c80b3703880e200220022903c00b3703800e200241c00b6a200241800e6a" - "200241c0066a103020122006290300370300201120072903003703002010" - "2008290300370300200f2005290300370300200d2003290300370300200e" - "2004290300370300200220022903c80b3703880e200220022903c00b3703" - "800e20092016290300370300200a2017290300370300200220022903c804" - "3703880a200220022903c0043703800a200241800a6a2002290300200229" - "03082044290300204329030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20032018" - "29030037030020042013290300370300200220142903003703c80b200220" - "152903003703c00b200241c00b6a20422903002041290300204029030020" - "3f29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d200241d80e6a221820092903" - "00370300200241d00e6a2213200a290300370300200241e00e6a22142002" - "2903c00b370300200241e80e6a221520022903c80b370300200241f00e6a" - "22162004290300370300200241f80e6a2217200329030037030020022002" - "2903880a3703c80e200220022903800a3703c00e200241c00b6a200241c0" - "0e6a200241c00e6a10302017200629030037030020162007290300370300" - "201520082903003703002014200529030037030020182003290300370300" - "20132004290300370300200220022903c80b3703c80e200220022903c00b" - "3703c00e200241c00b6a200241c00e6a200241c0046a1030201720062903" - "003703002016200729030037030020152008290300370300201420052903" - "003703002018200329030037030020132004290300370300200241d0096a" - "2226201f290300370300200241d8096a221f202c290300370300200241e0" - "096a222c202d290300370300200241e8096a222d202e2903003703002002" - "41f0096a222e202f290300370300200241f8096a222f2039290300370300" - "200220022903c80b3703c80e200220022903c00b3703c00e200220022903" - "80043703c00920022002290388043703c809200241c0096a20024180046a" - "200241c0016a1030200241c00b6a200241c0096a200241c0096a1030202f" - "2006290300370300202e2007290300370300202d2008290300370300202c" - "2005290300370300201f2003290300370300202620042903003703002002" - "20022903c80b3703c809200220022903c00b3703c009200241c00b6a2002" - "41c0096a20024180046a1030202f2006290300370300202e200729030037" - "0300202d2008290300370300202c2005290300370300201f200329030037" - "030020262004290300370300200220022903c80b3703c809200220022903" - "c00b3703c009200241b80a6a2031290300370300200241b00a6a20212903" - "00370300200241a80a6a2020290300370300200241a00a6a201e29030037" - "03002009201c290300370300200a201d290300370300200220022903c80d" - "3703880a200220022903c00d3703800a200241c80a6a20022903c80e3703" - "00200241d00a6a2013290300370300200241d80a6a201829030037030020" - "0241e00a6a2014290300370300200241e80a6a2015290300370300200241" - "f00a6a2016290300370300200241f80a6a20172903003703002002200229" - "03c00e3703c00a200241b80b6a2012290300370300200241b00b6a201129" - "0300370300200241a80b6a2010290300370300200241a00b6a200f290300" - "370300200241980b6a200d290300370300200241900b6a200e2903003703" - "00200241880b6a20022903880e370300200220022903800e3703800b2006" - "201b2903003703002007201a290300370300200820192903003703002005" - "200c2903003703002003200b290300370300200420012903003703002002" - "20022903c8083703c80b200220022903c0083703c00b200241880c6a2002" - "29038808370300200241900c6a2032290300370300200241980c6a202b29" - "0300370300200241a00c6a202a290300370300200241a80c6a2029290300" - "370300200241b00c6a2028290300370300200241b80c6a20272903003703" - "0020022002290380083703800c200241f80c6a202f290300370300200241" - "f00c6a202e290300370300200241e80c6a202d290300370300200241e00c" - "6a202c290300370300200241d80c6a201f290300370300200241d00c6a20" - "26290300370300200241c80c6a20022903c809370300200220022903c009" - "3703c00c2000200241800a6a41c001104c41c0016a200241c00b6a41c001" - "104c1a200241a00f6a24000bcc1101047f23004180026b22032400024020" - "024101712206450440200341386a200141386a290300370300200341306a" - "200141306a290300370300200341286a200141286a290300370300200341" - "206a200141206a290300370300200341186a200141186a29030037030020" - "0341106a200141106a290300370300200320012903003703002003200141" - "086a29030037030820034190016a200141d0006a29030037030020034198" - "016a200141d8006a290300370300200341a0016a200141e0006a29030037" - "0300200341a8016a200141e8006a290300370300200341b0016a200141f0" - "006a290300370300200341b8016a200141f8006a29030037030020032001" - "290340370380012003200141c8006a290300370388010c010b200341d801" - "6a2204200141386a290300370300200341d0016a2205200141306a290300" - "370300200320012903203703c0012003200141286a2903003703c8012003" - "41c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f102b200341186a200141186a290300370300200341106a" - "200141106a290300370300200341286a20032903c801370300200341306a" - "2005290300370300200341386a20042903003703002003200141086a2903" - "0037030820032001290300370300200320032903c0013703202004200141" - "f8006a2903003703002005200141f0006a2903003703002003200141e800" - "6a2903003703c801200320012903603703c001200341c0016a42c6faf3c3" - "ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0" - "c689aece93b23042c7faf3c3ed82a3903c428d95c7c396d2dac0977f102b" - "20034198016a200141d8006a29030037030020034190016a200141d0006a" - "290300370300200341a8016a20032903c801370300200341b0016a200529" - "0300370300200341b8016a20042903003703002003200141c8006a290300" - "370388012003200129034037038001200320032903c0013703a0010b0240" - "0240024002402002410670220441026b0e020102000b200342a0dcae8f86" - "aaf9e4163703f801200342948fe8babd91b3d2cb003703f001200342cebb" - "f2dbd0c38ad7323703e801200342a297bfa0c6a3f5b2163703e001200342" - "f7a3e4fb84f3d1d92f3703d801200342c3e2e6aacf87fb85cc003703d001" - "2003428ce68c968ce2b0c6b77f3703c801200342bdaabdbbf1aae5f1997f" - "3703c0010c020b200341e0016a22024200370300200241086a4200370300" - "200241106a4200370300200241186a4200370300200342a9c0c689aece93" - "b2303703d801200342b099b385febcf6b6de003703d001200342bddcd9dc" - "fbd3c1c7423703c801200342c8faf383d69cd1de643703c0010c010b2003" - "42efecc59e9bc8f7f8043703f801200342cf9298e1decdc3f9a97f3703f0" - "01200342b1ccfcc7f9b7ccef0f3703e801200342de8d96d5bae5aa863837" - "03e0012003428aded7ba8b8fb8ab083703d801200342accbfcacf98ec7ff" - "ba7f3703d001200342d385a5ebd5a7ffaf807f3703c801200342edf6f3de" - "87dd9bbafb003703c0010b20014180016a2102200341406b20034180016a" - "200341c0016a102f02402006450440200341b8016a200241386a29030037" - "0300200341b0016a200241306a290300370300200341a8016a200241286a" - "290300370300200341a0016a200241206a29030037030020034198016a20" - "0241186a29030037030020034190016a200241106a290300370300200320" - "02290300370380012003200241086a290300370388010c010b200341d801" - "6a2206200141b8016a290300370300200341d0016a2205200141b0016a29" - "0300370300200320012903a0013703c0012003200141a8016a2903003703" - "c801200341c0016a42c6faf3c3ed82a3903c428d95c7c396d2dac0977f42" - "ddb0858ce8b691a8b87f42a9c0c689aece93b23042c7faf3c3ed82a3903c" - "428d95c7c396d2dac0977f102b20034198016a200241186a290300370300" - "20034190016a200241106a290300370300200341a8016a20032903c80137" - "0300200341b0016a2005290300370300200341b8016a2006290300370300" - "2003200241086a2903003703880120032002290300370380012003200329" - "03c0013703a0010b0240024002400240200441026b0e020102000b200342" - "ee95f6bfbedb978a2c3703f80120034292b9acd88396a09d9f7f3703f001" - "200342e38efbdea1ddf4c2363703e801200342a682aee99ce2d19d413703" - "e00120034281d0baa7e6ebd3da053703d80120034284bde0d0f596f0f980" - "7f3703d001200342f2d8d3f4fbbed999533703c801200342e2cefa90d9ea" - "87c5847f3703c0010c020b200341e0016a22014200370300200141086a42" - "00370300200141106a4200370300200141186a4200370300200342003703" - "d801200342ac97d286eaf99af1d9003703d001200342cfb8ede69afe98f9" - "543703c801200342feffffbf97e6d1b1d7003703c0010c010b2003429294" - "c48c9eb3faea233703f80120034284bac8e6f0ddbdd87e3703f001200342" - "e5adfe9b87c1a7a5a47f3703e8012003429fc7b098d7b3fbf1df003703e0" - "01200342ab9b828ee18ce3e20b3703d801200342ce88c9adfb9eb8df1937" - "03d001200342cbd7c1add7a8c299663703c801200342e6e0afe6c3d7a48d" - "0e3703c0010b20004180016a20034180016a200341c0016a102f20004138" - "6a200341386a290300370300200041306a200341306a2903003703002000" - "41286a200341286a290300370300200041206a200341206a290300370300" - "200041186a200341186a290300370300200041106a200341106a29030037" - "0300200041086a2003290308370300200020032903003703002000200329" - "0340370340200041c8006a2003290348370300200041d0006a200341d000" - "6a290300370300200041d8006a200341d8006a290300370300200041e000" - "6a200341e0006a290300370300200041e8006a200341e8006a2903003703" - "00200041f0006a200341f0006a290300370300200041f8006a200341f800" - "6a29030037030020034180026a24000bbd46027c7f107e230041e00b6b22" - "052400200541b8016a2234200141b8016a2235290300370300200541b001" - "6a2236200141b0016a2237290300370300200541a8016a2238200141a801" - "6a2239290300370300200541a0016a223a200141a0016a223b2903003703" - "0020054198016a223c20014198016a223d29030037030020054190016a22" - "3e20014190016a223f290300370300200541d0016a222e200141d0016a22" - "4f290300370300200541d8016a222f200141d8016a225029030037030020" - "0541e0016a2230200141e0016a2251290300370300200541e8016a223120" - "0141e8016a2252290300370300200541f0016a2232200141f0016a225329" - "0300370300200541f8016a2233200141f8016a2254290300370300200520" - "012903800137038001200520012903c0013703c001200520014188016a22" - "40290300370388012005200141c8016a22552903003703c801200541b802" - "6a2256200141f8026a2220290300370300200541b0026a2257200141f002" - "6a2221290300370300200541a8026a2258200141e8026a22282903003703" - "00200541a0026a2259200141e0026a222929030037030020054198026a22" - "5a200141d8026a222a29030037030020054190026a225b200141d0026a22" - "2b290300370300200541d0026a2241200141106a22062903003703002005" - "41d8026a2242200141186a2207290300370300200541e0026a2243200141" - "206a2208290300370300200541e8026a2244200141286a22092903003703" - "00200541f0026a2245200141306a220a290300370300200541f8026a2246" - "200141386a220b2903003703002005200141c8026a222c29030037038802" - "200520012903c00237038002200520012903003703c0022005200141086a" - "220c2903003703c802200541c0026a20012002102f200541b8036a225c20" - "35290300370300200541b0036a225d2037290300370300200541a8036a22" - "5e2039290300370300200541a0036a225f203b2903003703002005419803" - "6a2260203d29030037030020054190036a2261203f290300370300200520" - "402903003703880320052001290380013703800320054180036a20014180" - "016a220d2004102f200541f8036a2262200141b8026a2903003703002005" - "41f0036a2263200141b0026a290300370300200541e8036a2264200141a8" - "026a290300370300200541e0036a2265200141a0026a2903003703002005" - "41d8036a226620014198026a290300370300200541d0036a226720014190" - "026a290300370300200520014188026a2903003703c80320052001290380" - "023703c003200541c0036a20014180026a22472003102f200541b8046a22" - "68200b290300370300200541b0046a2269200a290300370300200541a804" - "6a226a2009290300370300200541a0046a226b2008290300370300200541" - "98046a226c200729030037030020054190046a226d200629030037030020" - "05200c29030037038804200520012903003703800420054180046a200120" - "471030200541f8046a226e200b290300370300200541f0046a226f200a29" - "0300370300200541e8046a22702009290300370300200541e0046a227120" - "08290300370300200541d8046a22722007290300370300200541d0046a22" - "7320062903003703002005200c2903003703c804200520012903003703c0" - "04200541c0046a2001200d1030200541b8056a2248200141f8006a221229" - "0300370300200541b0056a2249200141f0006a2213290300370300200541" - "a8056a224a200141e8006a2214290300370300200541a0056a224b200141" - "e0006a221529030037030020054198056a224c200141d8006a221c290300" - "37030020054190056a224d200141d0006a221d2903003703002005200141" - "c8006a221e29030037038805200520012903403703800520054180056a20" - "0141406b221f200141c0016a22741030200541c0096a20054180056a2001" - "41c0026a222d10302048200541f8096a220c2903003703002049200541f0" - "096a220d290300370300204a200541e8096a220e290300370300204b2005" - "41e0096a220f290300370300204c200541d8096a2210290300370300204d" - "200541d0096a2211290300370300200520052903c8093703880520052005" - "2903c00937038005200541d0056a2222201d290300370300200541d8056a" - "2223201c290300370300200541e0056a22242015290300370300200541e8" - "056a22252014290300370300200541f0056a222620132903003703002005" - "41f8056a22272012290300370300200520012903403703c0052005201e29" - "03003703c805200541c0056a201f2004102f200541b8066a221620272903" - "00370300200541b0066a22172026290300370300200541a8066a22182025" - "290300370300200541a0066a2219202429030037030020054198066a221a" - "202329030037030020054190066a221b2022290300370300200520052903" - "c80537038806200520052903c0053703800620054180066a200541c0056a" - "200541c0036a1030200542003703b80b200542003703b00b200542003703" - "a80b200542013703a00b200542003703980b200542003703900b20054200" - "3703880b200542093703800b200541c0096a20054180066a200541800b6a" - "102f2016200c2903003703002017200d2903003703002018200e29030037" - "03002019200f290300370300201a2010290300370300201b201129030037" - "0300200520052903c80937038806200520052903c00937038006200541c0" - "096a20054180066a200541c0026a10302016200c29030022810137030020" - "17200d2903002282013703002018200e2903002283013703002019200f29" - "0300228401370300201a2010290300228501370300201b20112903002286" - "01370300200541106a2275208601370300200541186a2276208501370300" - "200541206a2277208401370300200541286a227820830137030020054130" - "6a2279208201370300200541386a227a208101370300200520052903c809" - "22810137038806200520052903c009228201370380062005208201370300" - "2005208101370308200541f8066a22062020290300370300200541f0066a" - "22072021290300370300200541e8066a22082028290300370300200541e0" - "066a22092029290300370300200541d8066a220a202a2903003703002005" - "41d0066a220b202b2903003703002005202c2903003703c8062005200129" - "03c0023703c006200541c0066a202d2003102f200541c0096a200541c005" - "6a200541c0066a10302027200c2903003703002026200d29030037030020" - "25200e2903003703002024200f2903003703002023201029030037030020" - "222011290300370300200520052903c8093703c805200520052903c00937" - "03c005200541c0096a200541c0066a20054180036a10302006200c290300" - "2281013703002007200d2903002282013703002008200e29030022830137" - "03002009200f290300228401370300200a2010290300228501370300200b" - "2011290300228601370300201b208601370300201a208501370300201920" - "840137030020182083013703002017208201370300201620810137030020" - "0520052903c8092281013703c806200520052903c0092282013703c00620" - "052082013703800620052081013703880620054180066a200541c0066a20" - "0541800b6a102f2006201229030037030020072013290300370300200820" - "1429030037030020092015290300370300200a201c290300370300200b20" - "1d2903003703002005201e2903003703c806200520012903403703c00620" - "0541c0066a201f2002102f200541c0096a200541c0056a200541c0066a10" - "302027200c2903003703002026200d2903003703002025200e2903003703" - "002024200f29030037030020232010290300370300202220112903003703" - "00200520052903c8093703c805200520052903c0093703c005200541c009" - "6a20054180066a200541c0066a10302016200c2903002281013703002017" - "200d2903002282013703002018200e2903002283013703002019200f2903" - "00228401370300201a2010290300228501370300201b2011290300228601" - "370300200541d0006a227b208601370300200541d8006a227c2085013703" - "00200541e0006a227d208401370300200541e8006a227e20830137030020" - "0541f0006a227f208201370300200541f8006a2280012081013703002005" - "20052903c80922810137038806200520052903c009228201370380062005" - "2082013703402005208101370348200541b8076a221c200241386a222829" - "0300370300200541b0076a221d200241306a2229290300370300200541a8" - "076a221e200241286a222a290300370300200541a0076a221f200241206a" - "222b29030037030020054198076a2220200241186a222c29030037030020" - "054190076a2221200241106a222d2903003703002005200241086a224e29" - "030037038807200520022903003703800720054180076a20022004103020" - "06206e2903003703002007206f2903003703002008207029030037030020" - "092071290300370300200a2072290300370300200b207329030037030020" - "0520052903c8043703c806200520052903c0043703c006200541c0066a20" - "0541c0046a20054180076a102f200541d80b6a2214200a29030037030020" - "0541d00b6a2215200b290300370300200520052903c8063703c80b200520" - "052903c0063703c00b200541c00b6a20052903c00220052903c802204129" - "0300204229030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d20054198086a221220" - "0629030037030020054190086a2213200729030037030020052008290300" - "37038808200520092903003703800820054180086a204329030020442903" - "002045290300204629030042c7faf3c3ed82a3903c428d95c7c396d2dac0" - "977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d2010201429" - "030022810137030020112015290300228201370300200f20052903800822" - "8301370300200d2013290300228401370300200e20052903880822850137" - "0300200c2012290300228601370300200520052903c80b2287013703c809" - "200520052903c00b2288013703c009200620860137030020072084013703" - "0020082085013703002009208301370300200a208101370300200b208201" - "37030020052087013703c80620052088013703c0062014200a2903003703" - "002015200b290300370300200520052903c8063703c80b200520052903c0" - "063703c00b200541c00b6a20052903800322810120052903880322820120" - "61290300228301206029030022840142c7faf3c3ed82a3903c428d95c7c3" - "96d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20" - "122006290300370300201320072903003703002005200829030037038808" - "200520092903003703800820054180086a205f290300228501205e290300" - "228601205d290300228701205c29030022880142c7faf3c3ed82a3903c42" - "8d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b2" - "30102d2010201429030022890137030020112015290300228a0137030020" - "0f200529038008228b01370300200d2013290300228c01370300200e2005" - "29038808228d01370300200c2012290300228e01370300200520052903c8" - "0b228f013703c809200520052903c00b2290013703c0092006208e013703" - "002007208c013703002008208d013703002009208b01370300200a208901" - "370300200b208a013703002005208f013703c80620052090013703c00620" - "162054290300370300201720532903003703002018205229030037030020" - "192051290300370300201a2050290300370300201b204f29030037030020" - "05205529030037038806200520012903c0013703800620054180066a2074" - "2003102f200541c0096a200541c0056a20054180066a10302027200c2903" - "003703002026200d2903003703002025200e2903003703002024200f2903" - "003703002023201029030037030020222011290300370300200520052903" - "c8093703c805200520052903c0093703c005200541c0096a200541c0066a" - "20054180066a10302006200c2903003703002007200d2903003703002008" - "200e2903003703002009200f290300370300200a2010290300370300200b" - "2011290300370300200520052903c8093703c806200520052903c0093703" - "c0062021203f2903003703002020203d290300370300201f203b29030037" - "0300201e2039290300370300201d2037290300370300201c203529030037" - "030020052001290380013703800720052040290300370388072005418007" - "6a20054180016a2047103020342006290300370300203620072903003703" - "0020382008290300370300203a2009290300370300203c200a2903003703" - "00203e200b290300370300200541d0076a200441106a2903003703002005" - "41d8076a200441186a290300370300200541e0076a200441206a29030037" - "0300200541e8076a200441286a290300370300200541f0076a200441306a" - "290300370300200541f8076a200441386a290300370300200520052903c8" - "0637038801200520052903c00637038001200520042903003703c0072005" - "200441086a2903003703c807200541c0076a2004200310302006201c2903" - "003703002007201d2903003703002008201e2903003703002009201f2903" - "00370300200a2020290300370300200b2021290300370300200520052903" - "88073703c80620052005290380073703c006200541c0066a20054180076a" - "200541c0076a102f2014200a2903003703002015200b2903003703002005" - "20052903c8063703c80b200520052903c0063703c00b200541c00b6a2081" - "0120820120830120840142c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d201220062903" - "003703002013200729030037030020052008290300370388082005200929" - "03003703800820054180086a20850120860120870120880142c7faf3c3ed" - "82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c6" - "89aece93b230102d20102014290300228101370300201120152903002282" - "01370300200f200529038008228301370300200d20132903002284013703" - "00200e200529038808228501370300200c20122903002286013703002005" - "20052903c80b2287013703c809200520052903c00b2288013703c0092006" - "208601370300200720840137030020082085013703002009208301370300" - "200a208101370300200b20820137030020052087013703c8062005208801" - "3703c0062014200a2903003703002015200b290300370300200520052903" - "c8063703c80b200520052903c0063703c00b200541c00b6a20052903c003" - "22810120052903c8032282012067290300228301206629030022840142c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d201220062903003703002013200729030037" - "03002005200829030037038808200520092903003703800820054180086a" - "206529030022850120642903002286012063290300228701206229030022" - "880142c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b6" - "91a8b87f42a9c0c689aece93b230102d2010201429030022890137030020" - "112015290300228a01370300200f200529038008228b01370300200d2013" - "290300228c01370300200e200529038808228d01370300200c2012290300" - "228e01370300200520052903c80b228f013703c809200520052903c00b22" - "90013703c0092006208e013703002007208c013703002008208d01370300" - "2009208b01370300200a208901370300200b208a013703002005208f0137" - "03c80620052090013703c006201620062903003703002017200729030037" - "03002018200829030037030020192009290300370300201a200a29030037" - "0300201b200b290300370300200520052903c80637038806200520052903" - "c0063703800620054180066a200541c0066a200541800b6a102f20062033" - "290300370300200720322903003703002008203129030037030020092030" - "290300370300200a202f290300370300200b202e29030037030020052005" - "2903c8013703c806200520052903c0013703c006200541c0066a200541c0" - "016a2002102f200541c0096a200541c0056a200541c0066a10302027200c" - "2903003703002026200d2903003703002025200e2903003703002024200f" - "290300370300202320102903003703002022201129030037030020052005" - "2903c8093703c805200520052903c0093703c005200541c0096a20054180" - "066a200541c0066a10302016200c2903002289013703002017200d290300" - "228a013703002018200e290300228b013703002019200f290300228c0137" - "0300201a2010290300228d01370300201b2011290300228e01370300202e" - "208e01370300202f208d013703002030208c013703002031208b01370300" - "2032208a013703002033208901370300200520052903c809228901370388" - "06200520052903c009228a01370380062005208a013703c0012005208901" - "3703c8012006205629030037030020072057290300370300200820582903" - "0037030020092059290300370300200a205a290300370300200b205b2903" - "0037030020052005290388023703c80620052005290380023703c0062005" - "41c0066a20054180026a2004102f200541c0096a200541c0056a200541c0" - "066a10302027200c2903003703002026200d2903003703002025200e2903" - "003703002024200f29030037030020232010290300370300202220112903" - "00370300201b200b290300370300201a200a290300370300201920092903" - "003703002018200829030037030020172007290300370300201620062903" - "00370300200520052903c8093703c805200520052903c0093703c0052005" - "20052903c00637038006200520052903c8063703880620054180066a2005" - "41c0066a200541800b6a102f201c2028290300370300201d202929030037" - "0300201e202a290300370300201f202b2903003703002020202c29030037" - "03002021202d2903003703002005204e2903003703880720052002290300" - "3703800720054180076a2002200310302006206829030037030020072069" - "2903003703002008206a2903003703002009206b290300370300200a206c" - "290300370300200b206d29030037030020052005290388043703c8062005" - "2005290380043703c006200541c0066a20054180046a20054180076a102f" - "2014200a2903003703002015200b290300370300200520052903c8063703" - "c80b200520052903c0063703c00b200541c00b6a20052903c00220052903" - "c8022041290300204229030042c7faf3c3ed82a3903c428d95c7c396d2da" - "c0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20122006" - "290300370300201320072903003703002005200829030037038808200520" - "092903003703800820054180086a20432903002044290300204529030020" - "4629030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d201020142903002289013703" - "0020112015290300228a01370300200f200529038008228b01370300200d" - "2013290300228c01370300200e200529038808228d01370300200c201229" - "0300228e01370300200520052903c80b228f013703c809200520052903c0" - "0b2290013703c0092006208e013703002007208c013703002008208d0137" - "03002009208b01370300200a208901370300200b208a013703002005208f" - "013703c80620052090013703c0062014200a2903003703002015200b2903" - "00370300200520052903c8063703c80b200520052903c0063703c00b2005" - "41c00b6a20810120820120830120840142c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "201220062903003703002013200729030037030020052008290300370388" - "08200520092903003703800820054180086a208501208601208701208801" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d20102014290300228101370300201120" - "15290300228201370300200f200529038008228301370300200d20132903" - "00228401370300200e200529038808228501370300200c20122903002286" - "01370300200520052903c80b2287013703c809200520052903c00b228801" - "3703c0092006208601370300200720840137030020082085013703002009" - "208301370300200a208101370300200b20820137030020052087013703c8" - "0620052088013703c006200541c0096a20054180066a200541c0066a1030" - "2016200c2903003703002017200d2903003703002018200e290300370300" - "2019200f290300370300201a2010290300370300201b2011290300370300" - "200520052903c80937038806200520052903c009370380062021202d2903" - "003703002020202c290300370300201f202b290300370300201e202a2903" - "00370300201d2029290300370300201c2028290300370300200520022903" - "00370380072005204e2903003703880720054180076a2002200410302005" - "41c0096a20054180076a20031030201c200c290300370300201d200d2903" - "00370300201e200e290300370300201f200f290300370300202020102903" - "0037030020212011290300370300200b204d290300370300200a204c2903" - "003703002009204b2903003703002008204a290300370300200720492903" - "0037030020062048290300370300200520052903c8093703880720052005" - "2903c0093703800720052005290380053703c00620052005290388053703" - "c806200541c0066a20054180056a20054180076a102f2014200a29030037" - "03002015200b290300370300200520052903c8063703c80b200520052903" - "c0063703c00b200541c00b6a20052903c00520052903c805202229030020" - "2329030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858c" - "e8b691a8b87f42a9c0c689aece93b230102d201220062903003703002013" - "200729030037030020052008290300370388082005200929030037038008" - "20054180086a202429030020252903002026290300202729030042c7faf3" - "c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9" - "c0c689aece93b230102d2010201429030022810137030020112015290300" - "228201370300200f200529038008228301370300200d2013290300228401" - "370300200e200529038808228501370300200c2012290300228601370300" - "200520052903c80b2287013703c809200520052903c00b2288013703c009" - "200620860137030020072084013703002008208501370300200920830137" - "0300200a208101370300200b20820137030020052087013703c806200520" - "88013703c006200541b8086a207a290300370300200541b0086a20792903" - "00370300200541a8086a2078290300370300200541a0086a207729030037" - "030020122076290300370300201320752903003703002005200529030837" - "0388082005200529030037038008200541c8086a20052903483703002005" - "41d0086a207b290300370300200541d8086a207c290300370300200541e0" - "086a207d290300370300200541e8086a207e290300370300200541f0086a" - "207f290300370300200541f8086a20800129030037030020052005290340" - "3703c008200541b8096a2034290300370300200541b0096a203629030037" - "0300200541a8096a2038290300370300200541a0096a203a290300370300" - "20054198096a203c29030037030020054190096a203e2903003703002005" - "4188096a200529038801370300200520052903800137038009200c203329" - "0300370300200d2032290300370300200e2031290300370300200f203029" - "03003703002010202f2903003703002011202e2903003703002005200529" - "03c8013703c809200520052903c0013703c009200541880a6a2005290388" - "06370300200541900a6a201b290300370300200541980a6a201a29030037" - "0300200541a00a6a2019290300370300200541a80a6a2018290300370300" - "200541b00a6a2017290300370300200541b80a6a20162903003703002005" - "2005290380063703800a200541f80a6a2006290300370300200541f00a6a" - "2007290300370300200541e80a6a2008290300370300200541e00a6a2009" - "290300370300200541d80a6a200a290300370300200541d00a6a200b2903" - "00370300200541c80a6a20052903c806370300200520052903c0063703c0" - "0a200020054180086a41c001104c41c0016a200541c0096a41c001104c1a" - "200541e00b6a24000ba21d02297f0d7e23004180066b2203240020034180" - "046a20014180016a22162002102f20034198036a2204200141186a220c29" - "030037030020034190036a2205200141106a220d29030037030020032001" - "41086a220f29030037038803200320012903003703800320034180036a20" - "032903800420032903880420032903900420034198046a220929030042c7" - "faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f" - "42a9c0c689aece93b230102d200341d8036a2206200141386a2210290300" - "370300200341d0036a2207200141306a2211290300370300200320014128" - "6a22122903003703c8032003200141206a22172903003703c003200341c0" - "036a20032903a004200341a8046a220a29030020032903b004200341b804" - "6a220b29030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0" - "858ce8b691a8b87f42a9c0c689aece93b230102d200341186a220e200429" - "0300370300200341106a22082005290300370300200341206a2213200329" - "03c003370300200341286a221420032903c803370300200341306a221520" - "07290300370300200341386a221820062903003703002003200329038803" - "370308200320032903800337030020034180046a2016200241406b221f10" - "2f2004200141d8006a22202903003703002005200141d0006a2221290300" - "3703002003200141c8006a22222903003703880320032001290340370380" - "0320034180036a2003290380042003290388042003290390042009290300" - "42c7faf3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8" - "b87f42a9c0c689aece93b230102d2006200141f8006a2223290300370300" - "2007200141f0006a22242903003703002003200141e8006a222529030037" - "03c8032003200141e0006a22262903003703c003200341c0036a20032903" - "a004200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d" - "95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230" - "102d200341d8006a22192004290300370300200341d0006a221a20052903" - "00370300200341e0006a221b20032903c003370300200341e8006a221c20" - "032903c803370300200341f0006a221d2007290300370300200341f8006a" - "221e20062903003703002003200329038803370348200320032903800337" - "0340200341f8046a2018290300370300200341f0046a2015290300370300" - "200341e8046a2014290300370300200341e0046a20132903003703002003" - "41d8046a200e290300370300200341d0046a200829030037030020032003" - "2903083703c804200320032903003703c004200341c0046a20032003102f" - "200341b8056a201e290300370300200341b0056a201d2903003703002003" - "41a8056a201c290300370300200341a0056a201b29030037030020034198" - "056a201929030037030020034190056a201a290300370300200320032903" - "4837038805200320032903403703800520034180056a200341406b200341" - "406b102f20034180016a2003200341c0046a102f200341c0016a20012003" - "41c0046a102f20034180046a201620034180056a102f200341c0036a2003" - "4180046a20034180016a103020034180046a200341c0016a200341c0016a" - "1030200341d8026a220e2006290300370300200341d0026a220820072903" - "00370300200320032903c8033703c802200320032903c0033703c0022003" - "41c0026a200329038004200329038804200329039004200929030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d2004200341f8036a2213290300370300200520" - "0341f0036a22142903003703002003200341e8036a221529030037038803" - "200320032903e0033703800320034180036a20032903a004200a29030020" - "032903b004200b29030042c7faf3c3ed82a3903c428d95c7c396d2dac097" - "7f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d20034198026a" - "2218200e29030037030020034190026a22272008290300370300200341a8" - "026a2228200329038803370300200341b0026a2229200529030037030020" - "0341b8026a222a2004290300370300200320032903c80237038802200320" - "032903c0023703800220032003290380033703a00220034180046a200320" - "034180026a102f2010200b2903003703002011200341b0046a2210290300" - "3703002012200a2903003703002017200341a0046a222b29030037030020" - "0c2009290300370300200d20034190046a2211290300370300200f200329" - "03880437030020012003290380043703002004200341d8016a2903003703" - "002005200341d0016a290300370300200320032903c80137038803200320" - "032903c0013703800320034180036a200329038002200329038802202729" - "0300201829030042c7faf3c3ed82a3903c428d95c7c396d2dac0977f42dd" - "b0858ce8b691a8b87f42a9c0c689aece93b230102d2006200341f8016a29" - "03003703002007200341f0016a2903003703002003200341e8016a290300" - "3703c803200320032903e0013703c003200341c0036a20032903a0022028" - "2903002029290300202a29030042c7faf3c3ed82a3903c428d95c7c396d2" - "dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d200920" - "0429030037030020112005290300370300200a20032903c8033703002010" - "2007290300370300200b2006290300370300200320032903880337038804" - "200320032903800337038004200320032903c0033703a004200341c0036a" - "200341406b20034180046a102f20034180046a20034180016a200141406b" - "102f200341f8056a220c2006290300370300200341f0056a220d20072903" - "00370300200320032903c8033703e805200320032903c0033703e0052003" - "41e0056a200329038004200329038804200329039004200929030042c7fa" - "f3c3ed82a3903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42" - "a9c0c689aece93b230102d200e2013290300370300200820142903003703" - "00200320152903003703c802200320032903e0033703c002200341c0026a" - "20032903a004200a29030020032903b004200b29030042c7faf3c3ed82a3" - "903c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689ae" - "ce93b230102d2004200c2903003703002005200d290300370300200341a0" - "036a221720032903c002370300200341a8036a220f20032903c802370300" - "200341b0036a22122008290300370300200341b8036a2208200e29030037" - "0300200320032903e80537038803200320032903e0053703800320232008" - "290300370300202420122903003703002025200f29030037030020262017" - "290300370300202020042903003703002021200529030037030020222003" - "29038803370300200120032903800337034020034180046a201620034180" - "016a102f200141b8016a200b290300370300200141b0016a201029030037" - "0300200141a8016a200a290300370300200141a0016a202b290300370300" - "20014198016a200929030037030020014190016a20112903003703002001" - "4188016a2003290388043703002001200329038004370380012003420037" - "03f802200342003703f002200342003703e802200342013703e002200342" - "003703d802200342003703d002200342003703c802200342093703c00220" - "0341c0036a200341406b2002102f20034180046a2003201f102f200341d8" - "056a22012006290300370300200341d0056a220620072903003703002003" - "20032903c8033703c805200320032903c0033703c005200341c0056a2003" - "29038004200329038804200329039004200929030042c7faf3c3ed82a390" - "3c428d95c7c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece" - "93b230102d200c2013290300370300200d20142903003703002003201529" - "03003703e805200320032903e0033703e005200341e0056a20032903a004" - "200a29030020032903b004200b29030042c7faf3c3ed82a3903c428d95c7" - "c396d2dac0977f42ddb0858ce8b691a8b87f42a9c0c689aece93b230102d" - "2004200129030037030020052006290300370300200f20032903e8053703" - "002012200d2903003703002008200c290300370300200320032903c80537" - "038803200320032903c00537038003200320032903e0053703a003200341" - "80046a200341c0026a20034180036a102f201e2903002136201d29030021" - "34201c290300212d201b2903002135201a29030022302003290340223184" - "201929030022382003290348223284844200520440427f4200427f420020" - "3142788342c7faf3c3ed82a3903c561b222e202e203254ad7d202e20327d" - "222e42f3eab8bce9ada5bfe8007d2237202e54ad7c42017c223320307d22" - "2f42a4cffaf397c9eed7c7007d222e202f54ad2030203356ad7d427f511b" - "20387d42a9c0c689aece93b2307c213342c7faf3c3ed82a3903c20317d21" - "2f0b4200213042002131420021322034203584202d203684844200520440" - "427f4200427f4200203542788342c7faf3c3ed82a3903c561b222c202c20" - "2d54ad7d202c202d7d222d42f3eab8bce9ada5bfe8007d2230202d54ad7c" - "42017c222d20347d222c42a4cffaf397c9eed7c7007d2231202c54ad202d" - "203454ad7d427f511b20367d42a9c0c689aece93b2307c213242c7faf3c3" - "ed82a3903c20357d212c0b20002003290380043703002000200329030037" - "0340200041086a200329038804370300200041c8006a2003290308370300" - "200041386a200341b8046a290300370300200041306a200341b0046a2903" - "00370300200041286a200341a8046a290300370300200041206a200341a0" - "046a290300370300200041186a20034198046a290300370300200041106a" - "20034190046a290300370300200041d0006a200341106a29030037030020" - "0041d8006a200341186a290300370300200041e0006a200341206a290300" - "370300200041e8006a200341286a290300370300200041f0006a20034130" - "6a290300370300200041f8006a200341386a290300370300200020323703" - "b801200020313703b001200020303703a8012000202c3703a00120002033" - "370398012000202e3703900120002037370388012000202f370380012003" - "4180066a24000b4201047f412021020240034020002d0000220320012d00" - "002204460440200041016a2100200141016a2101200241016b22020d010c" - "020b0b200320046b21050b20050b8a0301047f0240200141104904402000" - "21020c010b02402000410020006b41037122046a220320004d0d00200021" - "0220040440200421050340200241003a0000200241016a2102200541016b" - "22050d000b0b200441016b4107490d000340200241003a0000200241076a" - "41003a0000200241066a41003a0000200241056a41003a0000200241046a" - "41003a0000200241036a41003a0000200241026a41003a0000200241016a" - "41003a0000200241086a22022003470d000b0b2003200120046b2201417c" - "716a220220034b0440034020034100360200200341046a22032002490d00" - "0b0b200141037121010b02402002200120026a22054f0d00200141016b21" - "042001410771220304400340200241003a0000200241016a210220034101" - "6b22030d000b0b20044107490d000340200241003a0000200241076a4100" - "3a0000200241066a41003a0000200241056a41003a0000200241046a4100" - "3a0000200241036a41003a0000200241026a41003a0000200241016a4100" - "3a0000200241086a22022005470d000b0b20000b940501087f0240200241" - "10490440200021030c010b02402000410020006b41037122066a22052000" - "4d0d00200641016b21082000210320012104200604402006210703402003" - "20042d00003a0000200441016a2104200341016a2103200741016b22070d" - "000b0b20084107490d000340200320042d00003a0000200341016a200441" - "016a2d00003a0000200341026a200441026a2d00003a0000200341036a20" - "0441036a2d00003a0000200341046a200441046a2d00003a000020034105" - "6a200441056a2d00003a0000200341066a200441066a2d00003a00002003" - "41076a200441076a2d00003a0000200441086a2104200341086a22032005" - "470d000b0b2005200220066b2207417c7122086a21030240200120066a22" - "04410371450440200320054d0d0120042101034020052001280200360200" - "200141046a2101200541046a22052003490d000b0c010b200320054d0d00" - "2004410374220241187121062004417c71220941046a2101410020026b41" - "1871210a2009280200210203402005200220067620012802002202200a74" - "72360200200141046a2101200541046a22052003490d000b0b2007410371" - "2102200420086a21010b02402003200220036a22054f0d00200241016b21" - "072002410771220404400340200320012d00003a0000200141016a210120" - "0341016a2103200441016b22040d000b0b20074107490d00034020032001" - "2d00003a0000200341016a200141016a2d00003a0000200341026a200141" - "026a2d00003a0000200341036a200141036a2d00003a0000200341046a20" - "0141046a2d00003a0000200341056a200141056a2d00003a000020034106" - "6a200141066a2d00003a0000200341076a200141076a2d00003a00002001" - "41086a2101200341086a22032005470d000b0b20000b6201047e20002002" - "42ffffffff0f832203200142ffffffff0f8322047e220520024220882202" - "20047e22042003200142208822017e7c22034220867c2206370300200020" - "05200656ad200120027e2003200454ad4220862003422088847c7c370308" - "0b5601017e0240200341c000714504402003450d012002410020036b413f" - "71ad8620012003413f71ad220488842101200220048821020c010b200220" - "03413f71ad882101420021020b20002001370300200020023703080b5a01" - "027e420121020240200141c000714504402001450d0142002001413f71ad" - "2202864201410020016b413f71ad88842103420120028621020c010b4201" - "2001413f71ad862103420021020b20002002370300200020033703080b0b" - "e1250100418080c0000bd725307830306165613865396338336337336437" - "343033363932336465316234613636643138353437643538656565346561" - "6366656537303233356564323931393534636361706163697479206f7665" - "72666c6f77004200100011000000010000000000000063616c6c65642060" - "4f7074696f6e3a3a756e77726170282960206f6e206120604e6f6e656020" - "76616c7565696e646578206f7574206f6620626f756e64733a2074686520" - "6c656e20697320206275742074686520696e646578206973200000008f00" - "100020000000af001000120000003a2000000100000000000000d4001000" - "020000003030303130323033303430353036303730383039313031313132" - "313331343135313631373138313932303231323232333234323532363237" - "323832393330333133323333333433353336333733383339343034313432" - "343334343435343634373438343935303531353235333534353535363537" - "353835393630363136323633363436353636363736383639373037313732" - "373337343735373637373738373938303831383238333834383538363837" - "38383839393039313932393339343935393639373938393972616e676520" - "737461727420696e64657820206f7574206f662072616e676520666f7220" - "736c696365206f66206c656e67746820b001100012000000c20110002200" - "000072616e676520656e6420696e64657820f401100010000000c2011000" - "22000000736c69636520696e646578207374617274732061742020627574" - "20656e6473206174200014021000160000002a0210000d00000054726965" - "6420746f20736872696e6b20746f2061206c617267657220636170616369" - "74794802100024000000f40a10004c000000b3020000090000002f686f6d" - "652f6f706964736b6f706e79692f2e636172676f2f72656769737472792f" - "7372632f696e6465782e6372617465732e696f2d31393439636638633662" - "3562353537662f6e756d2d626967696e742d302e342e362f7372632f6269" - "6775696e742e72732f686f6d652f6f706964736b6f706e79692f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" - "6f2d313934396366386336623562353537662f6e756d2d626967696e742d" - "302e342e362f7372632f62696775696e742f6164646974696f6e2e727300" - "0000ea0210006f000000890000001b000000a80c10006f00000057000000" - "09000000a80c10006f000000a3000000090000008402100066000000ad00" - "000013000000a80c10006f000000c40000001f000000a80c10006f000000" - "150100000e000000a80c10006f000000160100000e000000a80c10006f00" - "00001a0100000f000000a80c10006f000000510100000c000000a80c1000" - "6f0000002001000021000000a80c10006f0000002101000018000000a80c" - "10006f000000420100003c000000040c10006e0000006d0200000d000000" - "040c10006e00000066020000110000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f6e756d" - "2d626967696e742d302e342e362f7372632f62696775696e742f73686966" - "742e72733c0410006c0000001e0000001c0000003c0410006c0000002e00" - "0000120000003c0410006c00000028000000190000002f72757374632f34" - "656231363132353065333430633866343866363665326239323965663461" - "3562656437633138312f6c6962726172792f636f72652f7372632f736c69" - "63652f697465722e72732f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f6865782d302e342e33" - "2f7372632f6c69622e7273000000260510005b000000c700000025000000" - "260510005b000000c7000000410000004e6f744d656d626572496e76616c" - "6964536c6963654c656e677468496e76616c696455353132456e636f6469" - "6e6700000000000067e6096a85ae67bb72f36e3c3af54fa57f520e518c68" - "059babd9831f19cde05bd80410004e000000f605000015000000496e7661" - "6c696420636f6d7072657373656420706f696e7420666c61670000000806" - "10001d0000002f686f6d652f6f706964736b6f706e79692f2e636172676f" - "2f72656769737472792f7372632f696e6465782e6372617465732e696f2d" - "313934396366386336623562353537662f7370312d76657269666965722d" - "342e312e332f7372632f636f6e7374616e74732e72730000300610006a00" - "00001f000000120000002f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f7370312d7665726966" - "6965722d342e312e332f7372632f636f6e7665727465722e727300000000" - "00000100000001000000060000004661696c656420746f20636f6e766572" - "74207820627974657320746f20467100ac0610006a0000001f0000003700" - "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" - "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" - "6366386336623562353537662f7370312d76657269666965722d342e312e" - "332f7372632f67726f746831362f636f6e7665727465722e727300005807" - "100072000000290000003e00000058071000720000002a0000003d000000" - "58071000720000002b0000003e00000058071000720000002c0000003e00" - "000058071000720000002e0000002500000058071000720000002e000000" - "3200000058071000720000002e0000003f00000058071000720000002e00" - "00004c0000005807100072000000320000003f0000005807100072000000" - "330000000b0000002f686f6d652f6f706964736b6f706e79692f2e636172" - "676f2f72656769737472792f7372632f696e6465782e6372617465732e69" - "6f2d313934396366386336623562353537662f7370312d76657269666965" - "722d342e312e332f7372632f67726f746831362f7665726966792e727300" - "6c0810006f0000002d000000160000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f737031" - "2d76657269666965722d342e312e332f7372632f67726f746831362f6d6f" - "642e7273ec0810006c0000006d00000044000000ad4d9aa7e302d9df4174" - "9d5507949d05dbea33fbb16c643b22f599a2be6df2e2e1a1575c2e494d36" - "13e95e43b622318d9225c820e46acd08e8c987b44051195bc967032fcbf7" - "76d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c0e187847" - "ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab998e" - "9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2" - "1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992" - "f6edc980d3486a83b99e6c876acec4d309746e28cd96fa8e01864daa8459" - "9384f354a62eabe81511aa8e3034cbd75d42e708aa4ed80303fb0e4fb90c" - "d0ff6e9092132b65c9ae2605f3ef5540d3a64503c84fe5e1d9ec6eb1bd3a" - "906bbc80830e8e5400000003ced6e0c13f353262ae2dbbe49ce6a0b67576" - "d38aaf5958564be7648356830ef7db611b8f696f28ffb6250c7ffac66efb" - "d638d97f0d6c843c23691c3af532c9e3a974086bde6c91267b201137cfe6" - "ee8cd50ff0a3da861e808503e7df4da87b8d00000000000000002f727573" - "74632f346562313631323530653334306338663438663636653262393239" - "656634613562656437633138312f6c6962726172792f616c6c6f632f7372" - "632f7261775f7665632e7273f40a10004c00000028020000110000002f72" - "7573742f646570732f646c6d616c6c6f632d302e322e372f7372632f646c" - "6d616c6c6f632e7273617373657274696f6e206661696c65643a20707369" - "7a65203e3d2073697a65202b206d696e5f6f7665726865616400500b1000" - "29000000a804000009000000617373657274696f6e206661696c65643a20" - "7073697a65203c3d2073697a65202b206d61785f6f766572686561640000" - "500b100029000000ae0400000d0000000000000004000000000000002f68" - "6f6d652f6f706964736b6f706e79692f2e636172676f2f72656769737472" - "792f7372632f696e6465782e6372617465732e696f2d3139343963663863" - "36623562353537662f6e756d2d626967696e742d302e342e362f7372632f" - "62696775696e742f636f6e766572742e72730000040c10006e000000f001" - "000016000000617474656d707420746f20646976696465206279207a6572" - "6f000000840c1000190000002f686f6d652f6f706964736b6f706e79692f" - "2e636172676f2f72656769737472792f7372632f696e6465782e63726174" - "65732e696f2d313934396366386336623562353537662f6e756d2d626967" - "696e742d302e342e362f7372632f62696775696e742f6469766973696f6e" - "2e727300a80c10006f00000070000000090000004f6e63652070616e6963" - "6b65642f686f6d652f6f706964736b6f706e79692f2e636172676f2f7265" - "6769737472792f7372632f696e6465782e6372617465732e696f2d313934" - "396366386336623562353537662f7370696e2d302e392e382f7372632f6f" - "6e63652e72730000350d10005d000000e60000002a0000004f6e63652070" - "726576696f75736c7920706f69736f6e656420627920612070616e69636b" - "65640000350d10005d0000004e010000250000002f72757374632f346562" - "313631323530653334306338663438663636653262393239656634613562" - "656437633138312f6c6962726172792f616c6c6f632f7372632f736c6963" - "652e72730000dc0d10004a000000a10000001900000063616c6c65642060" - "526573756c743a3a756e77726170282960206f6e20616e20604572726020" - "76616c75652f686f6d652f6f706964736b6f706e79692f2e636172676f2f" - "72656769737472792f7372632f696e6465782e6372617465732e696f2d31" - "3934396366386336623562353537662f7375627374726174652d626e2d73" - "756363696e63742d302e362e302d76342d72632e382f7372632f6669656c" - "64732f66702e72730000630e10007b000000e9020000230000004661696c" - "656420746f20636f6d707574652074686520696e7665727365206f662074" - "68652064697669736f722f686f6d652f6f706964736b6f706e79692f2e63" - "6172676f2f72656769737472792f7372632f696e6465782e637261746573" - "2e696f2d313934396366386336623562353537662f737562737472617465" - "2d626e2d73756363696e63742d302e362e302d76342d72632e382f737263" - "2f6669656c64732f6671322e72731c0f10007c000000430100000e000000" - "000000000100000001000000070000002f686f6d652f6f706964736b6f70" - "6e79692f2e636172676f2f72656769737472792f7372632f696e6465782e" - "6372617465732e696f2d313934396366386336623562353537662f737562" - "7374726174652d626e2d73756363696e63742d302e362e302d76342d7263" - "2e382f7372632f67726f7570732f6d6f642e7273b80f10007c000000b100" - "00002c000000556e61626c6520746f20636f6e7665727420473120746f20" - "416666696e654731b80f10007c0000000001000012000000b80f10007c00" - "00002001000012000000b80f10007c000000400100000d000000b80f1000" - "7c0000006b01000029000000010001000000030003000000030001000300" - "000300000000000100000300010000030000000003000100000003000300" - "00010000000300000300010001000000b80f10007c000000150300002600" - "0000b80f10007c0000001003000026000000b80f10007c00000008030000" - "2e000000b80f10007c000000020300002a000000b80f10007c0000009b03" - "000010000000b80f10007c0000009c03000010000000b80f10007c000000" - "8f03000014000000b80f10007c0000009203000018000000b80f10007c00" - "000095030000180000006d696c6c6572206c6f6f702063616e6e6f742070" - "726f64756365207a65726f00b80f10007c000000221100000a000000b80f" - "10007c000000191100002a000000b80f10007c0000001911000017000000" - "b80f10007c0000001a1100002e000000b80f10007c0000001a1100001b00" - "00002f686f6d652f6f706964736b6f706e79692f2e636172676f2f726567" - "69737472792f7372632f696e6465782e6372617465732e696f2d31393439" - "6366386336623562353537662f7375627374726174652d626e2d73756363" - "696e63742d302e362e302d76342d72632e382f7372632f6c69622e727300" - "0000e4111000750000003b0300000c000000e4111000750000003c030000" - "0c0000004e6f744f6e43757276654e6f74496e53756267726f7570496e76" - "616c6964496e7075744c656e677468000000120000001300000009000000" - "ad051000bf051000a40510000a0000000d000000120000007c1210008612" - "1000931210004d0970726f64756365727302086c616e6775616765010452" - "757374000c70726f6365737365642d6279010572757374631d312e38352e" - "31202834656231363132353020323032352d30332d31352900490f746172" - "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" - "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d" - "756c746976616c7565"; - extern std::string const ledgerSqnWasmHex = "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" @@ -8830,724 +338,8 @@ extern std::string const allHostFunctionsWasmHex = "2b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = - "0061736d01000000013f0b60017f0060037f7f7f017f60027f7f017f60027f" - "7f0060000060037f7f7f006000017f60037e7f7f017f60047f7f7f7f017f60" - "017f017f60047f7f7f7f00032f2e0302040400030501030302020600030302" - "0700080301050202020404090202000a0a0102020403030300000a03010405" - "017001101005030100110619037f01418080c0000b7f0041b49ac0000b7f00" - "41c09ac0000b073905066d656d6f7279020005726563757200000972656375" - "7273697665000c0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020915010041010b0f010a0b1e10171819262c1d1f2223240a927c2ea7" - "0704017f017e027f017e23808080800041e0006b2202248080808000200220" - "003602040240200041004c0d002001200128020041016a3602002000417f6a" - "20011080808080000b2002410236020c2002418480c0800036020820024201" - "37021420024181808080003602242002200241206a3602102002200241046a" - "3602202002410636022c2002419490c08000360228024041002d00c096c080" - "004103460d001082808080000b0240024002400240024041002903a89ac080" - "0022034200520d00024041002802b09ac0800022000d001083808080004100" - "2802b09ac0800021000b20002000280200220141016a3602002001417f4c0d" - "012000450d02200020002802002201417f6a36020020002903082103200141" - "01470d0020001084808080000b0240024002402003410029039896c0800051" - "0d0041002d00a496c08000210141012100410041013a00a496c08000200220" - "013a00382001450d012002420037025420024281808080c00037024c200241" - "bc91c08000360248200241386a200241c8006a108580808000000b02404100" - "2802a096c080002200417f460d00200041016a21000c020b419c92c0800041" - "2641e092c08000108680808000000b4100200337039896c080000b41002000" - "3602a096c080002002419896c0800036023041042100200241043a00382002" - "200241306a360240200241386a41c085c08000200241086a10878080800021" - "0120022d003821040240024020010d00420021034117200441ff0171764101" - "710d01200228023c220028020021010240200041046a280200220428020022" - "05450d002001200511808080800080808080000b024020042802042204450d" - "00200120041088808080000b2000410c108880808000410421000c010b2004" - "41ff01714104460d032002290338220642807e8321032006a721000b200228" - "023022012001280208417f6a2204360208024020040d00200141003a000c20" - "0142003703000b200041ff01714104470d03200241e0006a2480808080000f" - "0b000b418087c0800041de0041f487c08000108680808000000b2002410036" - "02582002410136024c2002418491c0800036024820024204370250200241c8" - "006a418c91c08000108980808000000b200220032000ad42ff018384370330" - "2002410236024c200241f48fc0800036024820024202370254200241828080" - "8000ad422086200241306aad843703402002418380808000ad422086200241" - "286aad843703382002200241386a360250200241c8006a418490c080001089" - "80808000000b2701017f200028020022002000411f7522027320026bad2000" - "417f73411f7620011091808080000bf10101027f23808080800041206b2200" - "248080808000024002400240024041002d00c096c080000e0400000301000b" - "410041023a00c096c0800041002d009096c080001a418008109c8080800022" - "01450d01410041033a00c096c08000410020013602b096c080004100428080" - "80808080013703a896c080004100420037039896c08000410041003a00b896" - "c08000410041003602b496c08000410041003a00a496c08000410041003602" - "a096c080000b200041206a2480808080000f0b000b20004100360218200041" - "0136020c200041bc93c0800036020820004204370210200041086a418c92c0" - "8000108980808000000bf90103027f037e017f23808080800041206b220024" - "808080800041002d009096c080001a0240024002404120109c808080002201" - "450d0020014102360210200142818080801037030041002903d096c0800021" - "0203402002427f510d024100200242017c220341002903d096c08000220420" - "0420025122051b3703d096c08000200421022005450d000b410020033703a8" - "9ac080002001200337030841002802b09ac08000450d022000410036021820" - "00410136020c200041c484c0800036020820004204370210200041086a419c" - "85c080001089808080000b000b109b80808000000b410020013602b09ac080" - "00200041206a2480808080000b5b01027f024020002802104101470d002000" - "280214220141003a000020002802182202450d00200120021088808080000b" - "02402000417f460d00200020002802042201417f6a36020420014101470d00" - "200041201088808080000b0b3a01017f23808080800041106b220224808080" - "8000200241ac85c0800036020c20022000360208200241086a2002410c6a20" - "01109680808000000b6a01017f23808080800041306b220324808080800020" - "03200136020c2003200036020820034101360214200341d488c08000360210" - "2003420137021c2003418380808000ad422086200341086aad843703282003" - "200341286a360218200341106a2002108980808000000bbf05010a7f238080" - "80800041306b2203248080808000200341033a002c2003412036021c410021" - "04200341003602282003200136022420032000360220200341003602142003" - "410036020c02400240024002400240200228021022050d00200228020c2200" - "450d0120022802082101200041037421062000417f6a41ffffffff01714101" - "6a21042002280200210003400240200041046a2802002207450d0020032802" - "2020002802002007200328022428020c11818080800080808080000d040b20" - "012802002003410c6a200128020411828080800080808080000d0320014108" - "6a2101200041086a2100200641786a22060d000c020b0b2002280214220145" - "0d00200141057421082001417f6a41ffffff3f7141016a2104200228020821" - "09200228020021004100210603400240200041046a2802002201450d002003" - "28022020002802002001200328022428020c11818080800080808080000d03" - "0b2003200520066a220141106a28020036021c20032001411c6a2d00003a00" - "2c2003200141186a2802003602282001410c6a28020021074100210a410021" - "0b024002400240200141086a2802000e03010002010b2007410374210c4100" - "210b2009200c6a220c2802040d01200c28020021070b4101210b0b20032007" - "3602102003200b36020c200141046a28020021070240024002402001280200" - "0e03010002010b2007410374210b2009200b6a220b2802040d01200b280200" - "21070b4101210a0b200320073602182003200a3602142009200141146a2802" - "004103746a22012802002003410c6a20012802041182808080008080808000" - "0d02200041086a21002008200641206a2206470d000b0b200420022802044f" - "0d012003280220200228020020044103746a22012802002001280204200328" - "022428020c1181808080008080808000450d010b410121010c010b41002101" - "0b200341306a24808080800020010b6c01027f024002402000417c6a280200" - "2202417871220341044108200241037122021b20016a490d0002402002450d" - "002003200141276a4b0d020b2000108d808080000f0b418186c0800041b086" - "c08000108e80808000000b41c086c0800041f086c08000108e80808000000b" - "5601017f23808080800041206b2202248080808000200241106a200041106a" - "290200370300200241086a200041086a290200370300200241013b011c2002" - "2001360218200220002902003703002002109280808000000be50301017f23" - "808080800041c0006b22022480808080000240024002400240024002402000" - "2d00000e0400010203000b2002200028020436020441002d009096c080001a" - "4114109c808080002200450d04200041106a410028008093c0800036000020" - "0041086a41002900f892c08000370000200041002900f092c0800037000020" - "0241143602102002200036020c200241143602082002410336022c200241a0" - "8fc08000360228200242023702342002418180808000ad422086200241046a" - "ad843703202002418480808000ad422086200241086aad8437031820022002" - "41186a36023020012802142001280218200241286a10878080800021002002" - "2802082201450d03200228020c20011088808080000c030b20002d00012100" - "2002410136022c200241d488c0800036022820024201370234200241838080" - "8000ad422086200241186aad8437030820022000410274220041c493c08000" - "6a28020036021c2002200041e894c080006a2802003602182002200241086a" - "36023020012802142001280218200241286a10878080800021000c020b2001" - "20002802042200280200200028020410958080800021000c010b2000280204" - "220028020020012000280204280210118280808000808080800021000b2002" - "41c0006a24808080800020000f0b000b140020012000280200200028020410" - "95808080000b3f01027f23808080800041106b220024808080800020004100" - "36020c41a08d062000410c6a108080808000200028020c2101200041106a24" - "808080800020010bbe0601057f200041786a22012000417c6a280200220241" - "787122006a21030240024020024101710d002002410271450d012001280200" - "220220006a21000240200120026b220141002802809ac08000470d00200328" - "02044103714103470d01410020003602f899c0800020032003280204417e71" - "36020420012000410172360204200320003602000f0b2001200210a8808080" - "000b024002400240024002400240200328020422024102710d002003410028" - "02849ac08000460d02200341002802809ac08000460d032003200241787122" - "0210a8808080002001200220006a2200410172360204200120006a20003602" - "00200141002802809ac08000470d01410020003602f899c080000f0b200320" - "02417e7136020420012000410172360204200120006a20003602000b200041" - "8002490d022001200010a78080800041002101410041002802989ac0800041" - "7f6a22003602989ac0800020000d04024041002802e097c080002200450d00" - "410021010340200141016a2101200028020822000d000b0b4100200141ff1f" - "200141ff1f4b1b3602989ac080000f0b410020013602849ac0800041004100" - "2802fc99c0800020006a22003602fc99c08000200120004101723602040240" - "200141002802809ac08000470d00410041003602f899c08000410041003602" - "809ac080000b200041002802909ac0800022044d0d0341002802849ac08000" - "2200450d034100210241002802fc99c0800022054129490d0241d897c08000" - "2101034002402001280200220320004b0d002000200320012802046a490d04" - "0b200128020821010c000b0b410020013602809ac08000410041002802f899" - "c0800020006a22003602f899c0800020012000410172360204200120006a20" - "003602000f0b200041f8017141e897c080006a21030240024041002802f099" - "c08000220241012000410376742200710d00410020022000723602f099c080" - "00200321000c010b200328020821000b200320013602082000200136020c20" - "01200336020c200120003602080f0b024041002802e097c080002201450d00" - "410021020340200241016a2102200128020822010d000b0b4100200241ff1f" - "200241ff1f4b1b3602989ac08000200520044d0d004100417f3602909ac080" - "000b0b4d01017f23808080800041206b220224808080800020024100360210" - "20024101360204200242043702082002412e36021c20022000360218200220" - "0241186a36020020022001108980808000000b7d02017f017e238080808000" - "41306b22022480808080002002200036020020022001360204200241023602" - "0c2002418484c08000360208200242023702142002418580808000ad422086" - "2203200241046aad84370328200220032002ad843703202002200241206a36" - "0210200241086a41b083c08000108980808000000b11002000350200410120" - "011091808080000bdf0703027f017e097f23808080800041306b2203248080" - "808000412721040240024020004290ce005a0d00200021050c010b41272104" - "0340200341096a20046a2206417c6a20004290ce0080220542f0b1037e2000" - "7ca7220741ffff037141e4006e220841017441c481c080006a2f00003b0000" - "2006417e6a2008419c7f6c20076a41ffff037141017441c481c080006a2f00" - "003b00002004417c6a2104200042ffc1d72f5621062005210020060d000b0b" - "02400240200542e300560d002005a721060c010b200341096a2004417e6a22" - "046a2005a7220741ffff037141e4006e2206419c7f6c20076a41ffff037141" - "017441c481c080006a2f00003b00000b024002402006410a490d0020034109" - "6a2004417e6a22046a200641017441c481c080006a2f00003b00000c010b20" - "0341096a2004417f6a22046a20064130723a00000b412720046b2109024002" - "4020010d00412820046b2107200228021c2106412d21010c010b412b418080" - "c400200228021c220641017122071b2101200720096a21070b200341096a20" - "046a210a2006410471410276210b0240024020022802000d00024020022802" - "142204200228021822062001200b109380808000450d00410121040c020b20" - "04200a2009200628020c118180808000808080800021040c010b0240024002" - "402002280204220c20074b0d0020022802142204200228021822062001200b" - "109380808000450d01410121040c030b2006410871450d012002280210210d" - "2002413036021020022d0020210e41012104200241013a0020200228021422" - "06200228021822082001200b1093808080000d02200c20076b41016a210402" - "4003402004417f6a2204450d01200641302008280210118280808000808080" - "8000450d000b410121040c030b02402006200a2009200828020c1181808080" - "008080808000450d00410121040c030b2002200e3a00202002200d36021041" - "0021040c020b2004200a2009200628020c118180808000808080800021040c" - "010b200c20076b210c02400240024020022d002022040e0402000100020b20" - "0c21044100210c0c010b200c4101762104200c41016a410176210c0b200441" - "016a2104200228021021082002280218210620022802142107024003402004" - "417f6a2204450d012007200820062802101182808080008080808000450d00" - "0b410121040c010b41012104200720062001200b1093808080000d00200720" - "0a2009200628020c11818080800080808080000d004100210403400240200c" - "2004470d00200c200c4921040c020b200441016a2104200720082006280210" - "1182808080008080808000450d000b2004417f6a200c4921040b200341306a" - "24808080800020040b5d01027f23808080800041206b220124808080800020" - "002802182102200141106a200041106a290200370300200141086a20004108" - "6a2902003703002001200036021c2001200236021820012000290200370300" - "200110a980808000000b490002402002418080c400460d0020002002200128" - "02101182808080008080808000450d0041010f0b024020030d0041000f0b20" - "0020034100200128020c11818080800080808080000b7d02017f017e238080" - "80800041306b22022480808080002002200036020020022001360204200241" - "0236020c200241a484c08000360208200242023702142002418580808000ad" - "4220862203200241046aad84370328200220032002ad843703202002200241" - "206a360210200241086a41c083c08000108980808000000bc20b010b7f2000" - "28020821030240024002400240200028020022040d002003410171450d010b" - "02402003410171450d00200120026a210502400240200028020c22060d0041" - "002107200121080c010b410021074100210920012108034020082203200546" - "0d020240024020032c00002208417f4c0d00200341016a21080c010b024020" - "0841604f0d00200341026a21080c010b0240200841704f0d00200341036a21" - "080c010b200341046a21080b200820036b20076a21072006200941016a2209" - "470d000b0b20082005460d00024020082c00002203417f4a0d002003416049" - "1a0b024002402007450d000240200720024f0d00200120076a2c000041bf7f" - "4a0d01410021030c020b20072002460d00410021030c010b200121030b2007" - "200220031b21022003200120031b21010b024020040d002000280214200120" - "02200028021828020c11818080800080808080000f0b2000280204210a0240" - "20024110490d0020022001200141036a417c7122076b22096a220b41037121" - "044100210641002103024020012007460d004100210302402009417c4b0d00" - "410021034100210503402003200120056a22082c000041bf7f4a6a20084101" - "6a2c000041bf7f4a6a200841026a2c000041bf7f4a6a200841036a2c000041" - "bf7f4a6a2103200541046a22050d000b0b200121080340200320082c000041" - "bf7f4a6a2103200841016a2108200941016a22090d000b0b02402004450d00" - "2007200b417c716a22082c000041bf7f4a210620044101460d00200620082c" - "000141bf7f4a6a210620044102460d00200620082c000241bf7f4a6a21060b" - "200b4102762105200620036a21060340200721042005450d04200541c00120" - "0541c001491b220b410371210c200b410274210d4100210802402005410449" - "0d002004200d41f007716a210941002108200421030340200328020c220741" - "7f7341077620074106767241818284087120032802082207417f7341077620" - "074106767241818284087120032802042207417f7341077620074106767241" - "818284087120032802002207417f7341077620074106767241818284087120" - "086a6a6a6a2108200341106a22032009470d000b0b2005200b6b2105200420" - "0d6a2107200841087641ff81fc0771200841ff81fc07716a418180046c4110" - "7620066a2106200c450d000b2004200b41fc01714102746a22082802002203" - "417f734107762003410676724181828408712103200c4101460d0220082802" - "042207417f7341077620074106767241818284087120036a2103200c410246" - "0d0220082802082208417f7341077620084106767241818284087120036a21" - "030c020b024020020d00410021060c030b2002410371210802400240200241" - "044f0d0041002106410021090c010b41002106200121032002410c71220921" - "070340200620032c000041bf7f4a6a200341016a2c000041bf7f4a6a200341" - "026a2c000041bf7f4a6a200341036a2c000041bf7f4a6a2106200341046a21" - "032007417c6a22070d000b0b2008450d02200120096a21030340200620032c" - "000041bf7f4a6a2106200341016a21032008417f6a22080d000c030b0b2000" - "28021420012002200028021828020c11818080800080808080000f0b200341" - "087641ff811c71200341ff81fc07716a418180046c41107620066a21060b02" - "400240200a20064d0d00200a20066b21054100210302400240024020002d00" - "200e0402000102020b20052103410021050c010b2005410176210320054101" - "6a41017621050b200341016a21032000280210210920002802182108200028" - "0214210703402003417f6a2203450d02200720092008280210118280808000" - "8080808000450d000b41010f0b200028021420012002200028021828020c11" - "818080800080808080000f0b0240200720012002200828020c118180808000" - "8080808000450d0041010f0b410021030340024020052003470d0020052005" - "490f0b200341016a2103200720092008280210118280808000808080800045" - "0d000b2003417f6a2005490b820302017f017e23808080800041f0006b2203" - "248080808000200341b085c0800036020c20032000360208200341b085c080" - "00360214200320013602102003410236021c200341bc80c080003602180240" - "20022802000d002003410336025c200341f080c08000360258200342033702" - "642003418680808000ad4220862204200341106aad84370348200320042003" - "41086aad843703402003418380808000ad422086200341186aad8437033820" - "03200341386a360260200341d8006a41e891c08000108980808000000b2003" - "41206a41106a200241106a290200370300200341206a41086a200241086a29" - "0200370300200320022902003703202003410436025c200341a481c0800036" - "0258200342043702642003418680808000ad4220862204200341106aad8437" - "035020032004200341086aad843703482003418780808000ad422086200341" - "206aad843703402003418380808000ad422086200341186aad843703382003" - "200341386a360260200341d8006a41e891c08000108980808000000b1c0020" - "002802002001200028020428020c11828080800080808080000b1400200128" - "0214200128021820001087808080000b22002001280214419480c08000410e" - "200128021828020c11818080800080808080000b6001017f23808080800041" - "306b22002480808080002000410136020c200041b480c08000360208200042" - "013702142000418880808000ad4220862000412f6aad843703202000200041" - "206a360210200041086a41cc8fc08000108980808000000b4701017f238080" - "80800041206b2200248080808000200041003602182000410136020c200041" - "bc88c0800036020820004204370210200041086a41c488c080001089808080" - "00000bcb2502087f017e02400240024002400240024002400240200041f501" - "490d0041002101200041cdff7b4f0d052000410b6a22014178712102410028" - "02f499c080002203450d04411f21040240200041f4ffff074b0d0020024106" - "20014108766722006b7641017120004101746b413e6a21040b410020026b21" - "010240200441027441d896c080006a28020022050d0041002100410021060c" - "020b4100210020024100411920044101766b2004411f461b74210741002106" - "034002402005220528020441787122082002490d00200820026b220820014f" - "0d00200821012005210620080d004100210120052106200521000c040b2005" - "28021422082000200820052007411d764104716a41106a2802002205471b20" - "0020081b2100200741017421072005450d020c000b0b024041002802f099c0" - "8000220541102000410b6a41f803712000410b491b22024103762201762200" - "410371450d00024002402000417f7341017120016a2207410374220041e897" - "c080006a2201200041f097c080006a28020022022802082206460d00200620" - "0136020c200120063602080c010b41002005417e200777713602f099c08000" - "0b20022000410372360204200220006a220020002802044101723602042002" - "41086a0f0b200241002802f899c080004d0d0302400240024020000d004100" - "2802f499c080002200450d0620006841027441d896c080006a280200220628" - "020441787120026b21012006210503400240200628021022000d0020062802" - "1422000d0020052802182104024002400240200528020c22002005470d0020" - "0541144110200528021422001b6a28020022060d01410021000c020b200528" - "02082206200036020c200020063602080c010b200541146a200541106a2000" - "1b21070340200721082006220041146a200041106a200028021422061b2107" - "20004114411020061b6a28020022060d000b200841003602000b2004450d04" - "0240200528021c41027441d896c080006a22062802002005460d0020044110" - "411420042802102005461b6a20003602002000450d050c040b200620003602" - "0020000d03410041002802f499c08000417e200528021c77713602f499c080" - "000c040b200028020441787120026b22062001200620014922061b21012000" - "200520061b2105200021060c000b0b02400240200020017441022001742200" - "410020006b7271682208410374220141e897c080006a2206200141f097c080" - "006a28020022002802082207460d002007200636020c200620073602080c01" - "0b41002005417e200877713602f099c080000b200020024103723602042000" - "20026a2207200120026b2206410172360204200020016a2006360200024041" - "002802f899c080002205450d00200541787141e897c080006a210141002802" - "809ac0800021020240024041002802f099c080002208410120054103767422" - "05710d00410020082005723602f099c08000200121050c010b200128020821" - "050b200120023602082005200236020c2002200136020c200220053602080b" - "410020073602809ac08000410020063602f899c08000200041086a0f0b2000" - "2004360218024020052802102206450d002000200636021020062000360218" - "0b20052802142206450d0020002006360214200620003602180b0240024002" - "4020014110490d0020052002410372360204200520026a2202200141017236" - "0204200220016a200136020041002802f899c080002207450d012007417871" - "41e897c080006a210641002802809ac0800021000240024041002802f099c0" - "8000220841012007410376742207710d00410020082007723602f099c08000" - "200621070c010b200628020821070b200620003602082007200036020c2000" - "200636020c200020073602080c010b2005200120026a220041037236020420" - "0520006a220020002802044101723602040c010b410020023602809ac08000" - "410020013602f899c080000b200541086a0f0b024020002006720d00410021" - "0641022004742200410020006b722003712200450d0320006841027441d896" - "c080006a28020021000b2000450d010b034020002006200028020441787122" - "0520026b220820014922041b2103200520024921072008200120041b210802" - "40200028021022050d00200028021421050b2006200320071b210620012008" - "20071b21012005210020050d000b0b2006450d00024041002802f899c08000" - "22002002490d002001200020026b4f0d010b20062802182104024002400240" - "200628020c22002006470d00200641144110200628021422001b6a28020022" - "050d01410021000c020b20062802082205200036020c200020053602080c01" - "0b200641146a200641106a20001b21070340200721082005220041146a2000" - "41106a200028021422051b210720004114411020051b6a28020022050d000b" - "200841003602000b2004450d030240200628021c41027441d896c080006a22" - "052802002006460d0020044110411420042802102006461b6a200036020020" - "00450d040c030b2005200036020020000d02410041002802f499c08000417e" - "200628021c77713602f499c080000c030b0240024002400240024002404100" - "2802f899c08000220020024f0d00024041002802fc99c08000220020024b0d" - "0041002101200241af80046a220641107640002200417f4622070d07200041" - "10742205450d07410041002802889ac08000410020064180807c7120071b22" - "086a22003602889ac080004100410028028c9ac0800022012000200120004b" - "1b36028c9ac0800002400240024041002802849ac080002201450d0041d897" - "c080002100034020002802002206200028020422076a2005460d0220002802" - "0822000d000c030b0b0240024041002802949ac080002200450d0020002005" - "4d0d010b410020053602949ac080000b410041ff1f3602989ac08000410020" - "083602dc97c08000410020053602d897c08000410041e897c080003602f497" - "c08000410041f097c080003602fc97c08000410041e897c080003602f097c0" - "8000410041f897c0800036028498c08000410041f097c080003602f897c080" - "004100418098c0800036028c98c08000410041f897c0800036028098c08000" - "4100418898c0800036029498c080004100418098c0800036028898c0800041" - "00419098c0800036029c98c080004100418898c0800036029098c080004100" - "419898c080003602a498c080004100419098c0800036029898c08000410041" - "a098c080003602ac98c080004100419898c080003602a098c0800041004100" - "3602e497c08000410041a898c080003602b498c08000410041a098c0800036" - "02a898c08000410041a898c080003602b098c08000410041b098c080003602" - "bc98c08000410041b098c080003602b898c08000410041b898c080003602c4" - "98c08000410041b898c080003602c098c08000410041c098c080003602cc98" - "c08000410041c098c080003602c898c08000410041c898c080003602d498c0" - "8000410041c898c080003602d098c08000410041d098c080003602dc98c080" - "00410041d098c080003602d898c08000410041d898c080003602e498c08000" - "410041d898c080003602e098c08000410041e098c080003602ec98c0800041" - "0041e098c080003602e898c08000410041e898c080003602f498c080004100" - "41f098c080003602fc98c08000410041e898c080003602f098c08000410041" - "f898c0800036028499c08000410041f098c080003602f898c0800041004180" - "99c0800036028c99c08000410041f898c0800036028099c080004100418899" - "c0800036029499c080004100418099c0800036028899c080004100419099c0" - "800036029c99c080004100418899c0800036029099c080004100419899c080" - "003602a499c080004100419099c0800036029899c08000410041a099c08000" - "3602ac99c080004100419899c080003602a099c08000410041a899c0800036" - "02b499c08000410041a099c080003602a899c08000410041b099c080003602" - "bc99c08000410041a899c080003602b099c08000410041b899c080003602c4" - "99c08000410041b099c080003602b899c08000410041c099c080003602cc99" - "c08000410041b899c080003602c099c08000410041c899c080003602d499c0" - "8000410041c099c080003602c899c08000410041d099c080003602dc99c080" - "00410041c899c080003602d099c08000410041d899c080003602e499c08000" - "410041d099c080003602d899c08000410041e099c080003602ec99c0800041" - "0041d899c080003602e099c08000410020053602849ac08000410041e099c0" - "80003602e899c080004100200841586a22003602fc99c08000200520004101" - "72360204200520006a4128360204410041808080013602909ac080000c080b" - "200120054f0d00200620014b0d00200028020c450d030b410041002802949a" - "c080002200200520002005491b3602949ac08000200520086a210641d897c0" - "800021000240024002400340200028020022072006460d0120002802082200" - "0d000c020b0b200028020c450d010b41d897c0800021000240034002402000" - "280200220620014b0d002001200620002802046a2206490d020b2000280208" - "21000c000b0b410020053602849ac080004100200841586a22003602fc99c0" - "800020052000410172360204200520006a4128360204410041808080013602" - "909ac080002001200641606a41787141786a22002000200141106a491b2207" - "411b36020441002902d897c080002109200741106a41002902e097c0800037" - "020020072009370208410020083602dc97c08000410020053602d897c08000" - "4100200741086a3602e097c08000410041003602e497c080002007411c6a21" - "00034020004107360200200041046a22002006490d000b20072001460d0720" - "072007280204417e713602042001200720016b220041017236020420072000" - "36020002402000418002490d002001200010a7808080000c080b200041f801" - "7141e897c080006a21060240024041002802f099c080002205410120004103" - "76742200710d00410020052000723602f099c08000200621000c010b200628" - "020821000b200620013602082000200136020c2001200636020c2001200036" - "02080c070b200020053602002000200028020420086a360204200520024103" - "723602042007410f6a41787141786a2201200520026a22006b210220014100" - "2802849ac08000460d03200141002802809ac08000460d0402402001280204" - "22064103714101470d0020012006417871220610a880808000200620026a21" - "02200120066a220128020421060b20012006417e7136020420002002410172" - "360204200020026a200236020002402002418002490d002000200210a78080" - "80000c060b200241f8017141e897c080006a21010240024041002802f099c0" - "8000220641012002410376742202710d00410020062002723602f099c08000" - "200121020c010b200128020821020b200120003602082002200036020c2000" - "200136020c200020023602080c050b4100200020026b22013602fc99c08000" - "410041002802849ac08000220020026a22063602849ac08000200620014101" - "7236020420002002410372360204200041086a21010c060b41002802809ac0" - "8000210102400240200020026b2206410f4b0d00410041003602809ac08000" - "410041003602f899c0800020012000410372360204200120006a2200200028" - "02044101723602040c010b410020063602f899c080004100200120026a2205" - "3602809ac0800020052006410172360204200120006a200636020020012002" - "4103723602040b200141086a0f0b2000200720086a36020441004100280284" - "9ac080002200410f6a417871220141786a22063602849ac080004100200020" - "016b41002802fc99c0800020086a22016a41086a22053602fc99c080002006" - "2005410172360204200020016a4128360204410041808080013602909ac080" - "000c030b410020003602849ac08000410041002802fc99c0800020026a2202" - "3602fc99c08000200020024101723602040c010b410020003602809ac08000" - "410041002802f899c0800020026a22023602f899c080002000200241017236" - "0204200020026a20023602000b200541086a0f0b4100210141002802fc99c0" - "8000220020024d0d004100200020026b22013602fc99c08000410041002802" - "849ac08000220020026a22063602849ac08000200620014101723602042000" - "2002410372360204200041086a0f0b20010f0b200020043602180240200628" - "02102205450d0020002005360210200520003602180b20062802142205450d" - "0020002005360214200520003602180b0240024020014110490d0020062002" - "410372360204200620026a22002001410172360204200020016a2001360200" - "02402001418002490d002000200110a7808080000c020b200141f8017141e8" - "97c080006a21020240024041002802f099c080002205410120014103767422" - "01710d00410020052001723602f099c08000200221010c010b200228020821" - "010b200220003602082001200036020c2000200236020c200020013602080c" - "010b2006200120026a2200410372360204200620006a220020002802044101" - "723602040b200641086a0b3000024020002802002d00000d002001418c83c0" - "800041051095808080000f0b2001419183c0800041041095808080000b1400" - "2001200028020420002802081095808080000b7001037f2000280204210102" - "40024020002d0000220041044b0d0020004103470d010b2001280200210002" - "40200141046a28020022022802002203450d00200020031180808080008080" - "8080000b024020022802042202450d00200020021088808080000b2001410c" - "1088808080000b0bab08010a7f23808080800041206b220424808080800002" - "40024002400240024020012802100d002001417f3602102003410020032002" - "41036a417c7120026b22056b41077120032005491b22066b21072003200649" - "0d0102402006450d0002400240200220036a2208417f6a22092d0000410a47" - "0d002006417f6a21060c010b200220076a220a2009460d0102402008417e6a" - "22092d0000410a470d002006417e6a21060c010b200a2009460d0102402008" - "417d6a22092d0000410a470d002006417d6a21060c010b200a2009460d0102" - "402008417c6a22092d0000410a470d002006417c6a21060c010b200a200946" - "0d0102402008417b6a22092d0000410a470d002006417b6a21060c010b200a" - "2009460d0102402008417a6a22092d0000410a470d002006417a6a21060c01" - "0b200a2009460d010240200841796a22092d0000410a470d00200641796a21" - "060c010b200a2009460d01200641787221060b200620076a41016a21060c04" - "0b20052003200320054b1b210b410020066b21082002417c6a210c2006417f" - "7320026a210a02400340200a21052008210620072209200b4d0d0120064178" - "6a2108200541786a210a41808284082002200941786a22076a280200220d41" - "8a94a8d000736b200d724180828408200c20096a280200220d418a94a8d000" - "736b200d727141808182847871418081828478460d000b0b200920034b0d02" - "02400340200320066a450d012006417f6a2106200520036a21092005417f6a" - "210520092d0000410a470d000b200320066a41016a21060c040b0240024020" - "01411c6a28020022060d00410021060c010b2006200141186a2802006a417f" - "6a2d0000410a470d0041002106200141003a00202001411c6a41003602000b" - "0240200128021420066b20034b0d002000200141146a2002200310a1808080" - "000c050b200128021820066a2002200310ad808080001a200041043a000020" - "01411c6a200620036a3602000c040b109a80808000000b20072003108f8080" - "8000000b20092003109480808000000b0240200320064f0d00200441003602" - "182004410136020c2004418c89c0800036020820044204370210200441086a" - "419489c08000108980808000000b02402001411c6a2802002205450d000240" - "0240200128021420056b20064d0d00200141186a28020020056a2002200610" - "ad808080001a2001411c6a200520066a22053602000c010b200441086a2001" - "41146a2002200610a180808000024020042d00084104460d00200020042903" - "083702000c030b2001411c6a28020021050b2005450d00200141003a002020" - "01411c6a41003602000b200220066a210502402001280214200320066b2206" - "4b0d002000200141146a2005200610a1808080000c010b200141186a280200" - "2005200610ad808080001a200041043a00002001411c6a20063602000b2001" - "200128021041016a360210200441206a2480808080000b7101027f20012802" - "002104024020012802082205450d00200420056b20034f0d00410021052001" - "4100360208200141003a000c0b0240200420034d0d00200128020420056a20" - "02200310ad808080001a200041043a00002001200520036a3602080f0b2000" - "4204370200200141003a000c0bc90103027f017e027f23808080800041106b" - "2203248080808000200341086a20002802082802002001200210a080808000" - "024020032d000822024104460d002000280204210420032903082105024002" - "4020002d0000220141044b0d0020014103470d010b20042802002101024020" - "0441046a28020022062802002207450d002001200711808080800080808080" - "000b024020062802042206450d00200120061088808080000b2004410c1088" - "808080000b200020053702000b200341106a24808080800020024104470b9c" - "0303027f017e037f23808080800041106b2202248080808000200241003602" - "0402400240024002402001418001490d002001418010490d01200141808004" - "4f0d0220022001413f71418001723a000620022001410c7641e001723a0004" - "20022001410676413f71418001723a0005410321010c030b200220013a0004" - "410121010c020b20022001413f71418001723a00052002200141067641c001" - "723a0004410221010c010b20022001413f71418001723a0007200220014112" - "7641f001723a000420022001410676413f71418001723a000620022001410c" - "76413f71418001723a0005410421010b200241086a20002802082802002002" - "41046a200110a080808000024020022d000822014104460d00200028020421" - "03200229030821040240024020002d0000220541044b0d0020054103470d01" - "0b200328020021050240200341046a28020022062802002207450d00200520" - "0711808080800080808080000b024020062802042206450d00200520061088" - "808080000b2003410c1088808080000b200020043702000b200241106a2480" - "8080800020014104470b1200200041c085c0800020011087808080000b0300" - "000b0900200041003602000bc30201047f411f21020240200141ffffff074b" - "0d002001410620014108766722026b7641017120024101746b413e6a21020b" - "200042003702102000200236021c200241027441d896c080006a2103024041" - "002802f499c0800041012002742204710d0020032000360200200020033602" - "182000200036020c20002000360208410041002802f499c080002004723602" - "f499c080000f0b024002400240200328020022042802044178712001470d00" - "200421020c010b20014100411920024101766b2002411f461b742103034020" - "042003411d764104716a41106a22052802002202450d022003410174210320" - "02210420022802044178712001470d000b0b20022802082203200036020c20" - "022000360208200041003602182000200236020c200020033602080f0b2005" - "2000360200200020043602182000200036020c200020003602080b82030104" - "7f200028020c21020240024002402001418002490d00200028021821030240" - "0240024020022000470d00200041144110200028021422021b6a2802002201" - "0d01410021020c020b20002802082201200236020c200220013602080c010b" - "200041146a200041106a20021b21040340200421052001220241146a200241" - "106a200228021422011b210420024114411020011b6a28020022010d000b20" - "0541003602000b2003450d020240200028021c41027441d896c080006a2201" - "2802002000460d0020034110411420032802102000461b6a20023602002002" - "450d030c020b2001200236020020020d01410041002802f499c08000417e20" - "0028021c77713602f499c080000c020b0240200220002802082204460d0020" - "04200236020c200220043602080f0b410041002802f099c08000417e200141" - "037677713602f099c080000f0b20022003360218024020002802102201450d" - "0020022001360210200120023602180b20002802142201450d002002200136" - "0214200120023602180f0b0b0b00200010aa80808000000bb50101037f2380" - "8080800041106b2201248080808000200028020c2102024002400240024020" - "002802040e020001020b20020d0141012102410021030c020b20020d002000" - "28020022022802042103200228020021020c010b2001418080808078360200" - "2001200036020c2001418980808000200028021c22002d001c20002d001d10" - "ab80808000000b20012003360204200120023602002001418a808080002000" - "28021c22002d001c20002d001d10ab80808000000b990101027f2380808080" - "0041106b2204248080808000410041002802cc96c08000220541016a3602cc" - "96c08000024020054100480d000240024041002d00a09ac080000d00410041" - "0028029c9ac0800041016a36029c9ac0800041002802c896c08000417f4a0d" - "010c020b200441086a200020011183808080008080808000000b410041003a" - "00a09ac080002002450d0010a580808000000b000b0c002000200129020037" - "03000bc10201087f02400240200241104f0d00200021030c010b2000410020" - "006b41037122046a210502402004450d002000210320012106034020032006" - "2d00003a0000200641016a2106200341016a22032005490d000b0b20052002" - "20046b2207417c7122086a210302400240200120046a2209410371450d0020" - "084101480d012009410374220641187121022009417c71220a41046a210141" - "0020066b4118712104200a2802002106034020052006200276200128020022" - "0620047472360200200141046a2101200541046a22052003490d000c020b0b" - "20084101480d0020092101034020052001280200360200200141046a210120" - "0541046a22052003490d000b0b20074103712102200920086a21010b024020" - "02450d00200320026a21050340200320012d00003a0000200141016a210120" - "0341016a22032005490d000b0b20000b0b96160100418080c0000b8c160a00" - "000001000000000000000000100001000000426f72726f774d75744572726f" - "72616c726561647920626f72726f7765643a2022001000120000003d3d6173" - "73657274696f6e20606c6566742020726967687460206661696c65640a2020" - "6c6566743a200a2072696768743a2000003e001000100000004e0010001700" - "0000650010000900000020726967687460206661696c65643a200a20206c65" - "66743a200000003e0010001000000088001000100000009800100009000000" - "65001000090000003030303130323033303430353036303730383039313031" - "31313231333134313531363137313831393230323132323233323432353236" - "32373238323933303331333233333334333533363337333833393430343134" - "32343334343435343634373438343935303531353235333534353535363537" - "35383539363036313632363336343635363636373638363937303731373237" - "33373437353736373737383739383038313832383338343835383638373838" - "3839393039313932393339343935393639373938393966616c736574727565" - "636f72652f7372632f736c6963652f6d656d6368722e727300000095011000" - "18000000830000001e00000095011000180000009f0000000900000072616e" - "676520737461727420696e64657820206f7574206f662072616e676520666f" - "7220736c696365206f66206c656e67746820d001100012000000e201100022" - "00000072616e676520656e6420696e646578201402100010000000e2011000" - "220000007265656e7472616e7420696e69740000340210000e0000002f7275" - "7374632f633266373463336639323861656235303366313562346539656635" - "373738653737663330353862382f6c6962726172792f636f72652f7372632f" - "63656c6c2f6f6e63652e72730000004c0210004d0000002301000042000000" - "000000000000000004000000040000000b0000000c0000000c000000040000" - "000d0000000e0000000f0000002f727573742f646570732f646c6d616c6c6f" - "632d302e322e362f7372632f646c6d616c6c6f632e7273617373657274696f" - "6e206661696c65643a207073697a65203e3d2073697a65202b206d696e5f6f" - "7665726865616400d802100029000000a80400000900000061737365727469" - "6f6e206661696c65643a207073697a65203c3d2073697a65202b206d61785f" - "6f766572686561640000d802100029000000ae0400000d000000757365206f" - "66207374643a3a7468726561643a3a63757272656e742829206973206e6f74" - "20706f737369626c6520616674657220746865207468726561642773206c6f" - "63616c206461746120686173206265656e2064657374726f7965647374642f" - "7372632f7468726561642f6d6f642e727300de03100015000000f102000013" - "0000006661696c656420746f2067656e657261746520756e69717565207468" - "726561642049443a2062697473706163652065786861757374656400040410" - "0037000000de03100015000000c40400000d00000001000000000000007374" - "642f7372632f696f2f62756666657265642f6c696e65777269746572736869" - "6d2e72736d6964203e206c656e000081041000090000005c04100025000000" - "0f01000029000000656e74697479206e6f7420666f756e647065726d697373" - "696f6e2064656e696564636f6e6e656374696f6e2072656675736564636f6e" - "6e656374696f6e207265736574686f737420756e726561636861626c656e65" - "74776f726b20756e726561636861626c65636f6e6e656374696f6e2061626f" - "727465646e6f7420636f6e6e65637465646164647265737320696e20757365" - "61646472657373206e6f7420617661696c61626c656e6574776f726b20646f" - "776e62726f6b656e2070697065656e7469747920616c726561647920657869" - "7374736f7065726174696f6e20776f756c6420626c6f636b6e6f7420612064" - "69726563746f727969732061206469726563746f72796469726563746f7279" - "206e6f7420656d707479726561642d6f6e6c792066696c6573797374656d20" - "6f722073746f72616765206d656469756d66696c6573797374656d206c6f6f" - "70206f7220696e646972656374696f6e206c696d69742028652e672e207379" - "6d6c696e6b206c6f6f70297374616c65206e6574776f726b2066696c652068" - "616e646c65696e76616c696420696e70757420706172616d65746572696e76" - "616c6964206461746174696d6564206f75747772697465207a65726f6e6f20" - "73746f726167652073706163657365656b206f6e20756e7365656b61626c65" - "2066696c6566696c6573797374656d2071756f746120657863656564656466" - "696c6520746f6f206c617267657265736f7572636520627573796578656375" - "7461626c652066696c652062757379646561646c6f636b63726f73732d6465" - "76696365206c696e6b206f722072656e616d65746f6f206d616e79206c696e" - "6b73696e76616c69642066696c656e616d65617267756d656e74206c697374" - "20746f6f206c6f6e676f7065726174696f6e20696e74657272757074656475" - "6e737570706f72746564756e657870656374656420656e64206f662066696c" - "656f7574206f66206d656d6f72796f74686572206572726f72756e63617465" - "676f72697a6564206572726f7220286f73206572726f722029000000010000" - "0000000000910710000b0000009c071000010000007374642f7372632f696f" - "2f737464696f2e727300b8071000130000002c030000140000006661696c65" - "64207072696e74696e6720746f203a20000000dc07100013000000ef071000" - "02000000b8071000130000005d040000090000007374646f75747374642f73" - "72632f696f2f6d6f642e72736120666f726d617474696e6720747261697420" - "696d706c656d656e746174696f6e2072657475726e656420616e206572726f" - "72207768656e2074686520756e6465726c79696e672073747265616d206469" - "64206e6f740000002b081000560000001a0810001100000028070000150000" - "0063616e6e6f74207265637572736976656c792061637175697265206d7574" - "65789c081000200000007374642f7372632f7379732f73796e632f6d757465" - "782f6e6f5f746872656164732e7273c4081000240000001400000009000000" - "7374642f7372632f73796e632f6f6e63652e7273f808100014000000d90000" - "00140000006c6f636b20636f756e74206f766572666c6f7720696e20726565" - "6e7472616e74206d757465787374642f7372632f73796e632f7265656e7472" - "616e745f6c6f636b2e7273420910001e000000220100002d0000006f706572" - "6174696f6e207375636365737366756c6f6e652d74696d6520696e69746961" - "6c697a6174696f6e206d6179206e6f7420626520706572666f726d65642072" - "65637572736976656c79840910003800000010000000110000001200000010" - "0000001000000013000000120000000d0000000e000000150000000c000000" - "0b00000015000000150000000f0000000e0000001300000026000000380000" - "0019000000170000000c000000090000000a00000010000000170000001900" - "00000e0000000d00000014000000080000001b0000000e0000001000000016" - "000000150000000b000000160000000d0000000b00000013000000a4041000" - "b4041000c5041000d7041000e7041000f70410000a0510001c051000290510" - "00370510004c0510005805100063051000780510008d0510009c051000aa05" - "1000bd051000e30510001b061000340610004b06100057061000600610006a" - "0610007a06100091061000aa061000b8061000c5061000d9061000e1061000" - "fc0610000a0710001a07100030071000450710005007100066071000730710" - "007e071000009118046e616d65000e0d7761736d5f6c69622e7761736d01d9" - "172e0005726563757201625f5a4e34636f726533666d74336e756d33696d70" - "35325f244c5424696d706c2475323024636f72652e2e666d742e2e44697370" - "6c61792475323024666f7224753230246933322447542433666d7431376863" - "6564393063376136333963303164644502495f5a4e337374643473796e6339" - "6f6e63655f6c6f636b31374f6e63654c6f636b244c54245424475424313069" - "6e697469616c697a6531376837663563353038646139653162303962450342" - "5f5a4e34636f72653463656c6c346f6e636531374f6e636543656c6c244c54" - "245424475424387472795f696e697431376863653633626632323835313931" - "65373145043e5f5a4e35616c6c6f633473796e633136417263244c54245424" - "432441244754243964726f705f736c6f773137686565396163636361643963" - "63313036394505355f5a4e34636f72653970616e69636b696e673133617373" - "6572745f6661696c6564313768323332363266326333633738623661624506" - "325f5a4e34636f7265366f7074696f6e31336578706563745f6661696c6564" - "313768663038613939653264373333366336614507265f5a4e34636f726533" - "666d743577726974653137683933353534653462653731663263376145080e" - "5f5f727573745f6465616c6c6f6309305f5a4e34636f72653970616e69636b" - "696e673970616e69635f666d74313768363534306363623264356664633361" - "62450a595f5a4e36305f244c54247374642e2e696f2e2e6572726f722e2e45" - "72726f72247532302461732475323024636f72652e2e666d742e2e44697370" - "6c61792447542433666d743137683930323731633762326136636538333945" - "0b495f5a4e34345f244c54242452462454247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376837666634" - "643062383630396332343732450c097265637572736976650d415f5a4e3864" - "6c6d616c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441" - "24475424346672656531376833393833346161616165336538393436450e2c" - "5f5a4e34636f72653970616e69636b696e673570616e696331376830346565" - "623931376464393363323239450f445f5a4e34636f726535736c6963653569" - "6e6465783236736c6963655f73746172745f696e6465785f6c656e5f666169" - "6c313768663931613361666538376231643434334510625f5a4e34636f7265" - "33666d74336e756d33696d7035325f244c5424696d706c2475323024636f72" - "652e2e666d742e2e446973706c61792475323024666f722475323024753332" - "2447542433666d74313768626633653032323834383365333735614511305f" - "5a4e34636f726533666d74336e756d33696d7037666d745f75363431376864" - "353231666136656636613036373261451211727573745f626567696e5f756e" - "77696e6413465f5a4e34636f726533666d7439466f726d6174746572313270" - "61645f696e74656772616c313277726974655f707265666978313768613961" - "343332383062363030366431324514425f5a4e34636f726535736c69636535" - "696e6465783234736c6963655f656e645f696e6465785f6c656e5f6661696c" - "3137683038386235366532393962656161616645152e5f5a4e34636f726533" - "666d7439466f726d6174746572337061643137683437363961653338393337" - "346363353145163b5f5a4e34636f72653970616e69636b696e673139617373" - "6572745f6661696c65645f696e6e6572313768366637653332353764383461" - "353034324517475f5a4e34325f244c54242452462454247532302461732475" - "323024636f72652e2e666d742e2e44656275672447542433666d7431376833" - "6136626161316262343761643230344518585f5a4e35395f244c5424636f72" - "652e2e666d742e2e417267756d656e7473247532302461732475323024636f" - "72652e2e666d742e2e446973706c61792447542433666d7431376836386133" - "65386535303963616663363445195c5f5a4e36335f244c5424636f72652e2e" - "63656c6c2e2e426f72726f774d75744572726f722475323024617324753230" - "24636f72652e2e666d742e2e44656275672447542433666d74313768313564" - "33643334333462646463636338451a395f5a4e34636f72653463656c6c3232" - "70616e69635f616c72656164795f626f72726f776564313768333134623532" - "61316263343662666534451b395f5a4e337374643674687265616438546872" - "6561644964336e657739657868617573746564313768333336626637613134" - "38383034346338451c435f5a4e38646c6d616c6c6f6338646c6d616c6c6f63" - "3137446c6d616c6c6f63244c54244124475424366d616c6c6f633137686536" - "3539333961346338393763633135451d475f5a4e34325f244c542424524624" - "54247532302461732475323024636f72652e2e666d742e2e44656275672447" - "542433666d7431376865313837343338386530376266653235451e595f5a4e" - "36305f244c5424616c6c6f632e2e737472696e672e2e537472696e67247532" - "302461732475323024636f72652e2e666d742e2e446973706c617924475424" - "33666d7431376863653432323661613166373236633163451f7a5f5a4e3463" - "6f726533707472383864726f705f696e5f706c616365244c54247374642e2e" - "696f2e2e57726974652e2e77726974655f666d742e2e41646170746572244c" - "5424616c6c6f632e2e7665632e2e566563244c542475382447542424475424" - "24475424313768313636646336316162303333346331654520605f5a4e3631" - "5f244c54247374642e2e696f2e2e737464696f2e2e5374646f75744c6f636b" - "2475323024617324753230247374642e2e696f2e2e57726974652447542439" - "77726974655f616c6c31376832346238323631303436316432353666452155" - "5f5a4e3373746432696f386275666665726564396275667772697465723138" - "427566577269746572244c54245724475424313477726974655f616c6c5f63" - "6f6c64313768353834626462626165623066623162624522735f5a4e38305f" - "244c54247374642e2e696f2e2e57726974652e2e77726974655f666d742e2e" - "41646170746572244c54245424475424247532302461732475323024636f72" - "652e2e666d742e2e5772697465244754243977726974655f73747231376837" - "6661636635626330656663643830384523325f5a4e34636f726533666d7435" - "5772697465313077726974655f636861723137686630623362653165633139" - "64653565374524305f5a4e34636f726533666d743557726974653977726974" - "655f666d743137686638383038663064663065343531336445250a72757374" - "5f70616e696326375f5a4e34636f72653570616e6963313250616e69635061" - "796c6f61643661735f73747231376836313439663134326439613265303265" - "4527505f5a4e38646c6d616c6c6f6338646c6d616c6c6f633137446c6d616c" - "6c6f63244c542441244754243138696e736572745f6c617267655f6368756e" - "6b3137686566653835316132373538326461376245284a5f5a4e38646c6d61" - "6c6c6f6338646c6d616c6c6f633137446c6d616c6c6f63244c542441244754" - "243132756e6c696e6b5f6368756e6b31376839333465336463333833626235" - "3861334529455f5a4e3373746433737973396261636b747261636532365f5f" - "727573745f656e645f73686f72745f6261636b747261636531376834646333" - "646534376432323032316239452a585f5a4e337374643970616e69636b696e" - "673139626567696e5f70616e69635f68616e646c657232385f247537622424" - "75376224636c6f737572652475376424247537642431376865313761333937" - "376638396331313738452b3b5f5a4e337374643970616e69636b696e673230" - "727573745f70616e69635f776974685f686f6f6b3137683737366537396339" - "6636353931626535452c83015f5a4e39395f244c54247374642e2e70616e69" - "636b696e672e2e626567696e5f70616e69635f68616e646c65722e2e537461" - "7469635374725061796c6f6164247532302461732475323024636f72652e2e" - "70616e69632e2e50616e69635061796c6f6164244754243661735f73747231" - "376865623366373232643232346534326638452d066d656d63707907120100" - "0f5f5f737461636b5f706f696e746572090a0100072e726f64617461005509" - "70726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d62790105727573746325312e38332e302d6e696768746c7920" - "2863326637346333663920323032342d30392d30392900490f746172676574" - "5f6665617475726573042b0a6d756c746976616c75652b0f6d757461626c65" - "2d676c6f62616c732b0f7265666572656e63652d74797065732b087369676e" - "2d657874"; + "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69" + "736800000a16011400230045044041010f0b230041016b240010000b"; extern std::string const hfPerfTest = "0061736d0100000001190460057f7f7f7f7f017f60047f7f7f7f017f6000006000017f0236" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index f7c258326fd..abde376763f 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -16,10 +16,6 @@ extern std::string const b58WasmHex; extern std::string const sha512PureWasmHex; -extern std::string const zkProofWasmHex; - -extern std::string const sp1WasmHex; - extern std::string const hfPerfTest; extern std::string const allKeyletsWasmHex; diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.lock b/src/test/app/wasm_fixtures/sp1/Cargo.lock deleted file mode 100644 index 4374624cd2c..00000000000 --- a/src/test/app/wasm_fixtures/sp1/Cargo.lock +++ /dev/null @@ -1,1384 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anstream" -version = "0.6.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" - -[[package]] -name = "anstyle-parse" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" -dependencies = [ - "windows-sys 0.60.2", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" -dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.60.2", -] - -[[package]] -name = "anyhow" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" - -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" - -[[package]] -name = "blake3" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytemuck" -version = "1.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "camino" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[package]] -name = "cc" -version = "1.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" -dependencies = [ - "shlex", -] - -[[package]] -name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "chrono" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "windows-link", -] - -[[package]] -name = "clap" -version = "4.5.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.48.0", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "elliptic-curve" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" -dependencies = [ - "base16ct", - "crypto-bigint", - "digest", - "ff", - "generic-array", - "group", - "hkdf", - "rand_core", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "rand_core", - "subtle", -] - -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hkdf" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.63" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "js-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libredox" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" -dependencies = [ - "bitflags", - "libc", -] - -[[package]] -name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "memchr" -version = "2.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "p3-baby-bear" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ecc3edc6fb8186268e05031c26a8b2b1e567957d63adcae1026d55d6bb189b" -dependencies = [ - "num-bigint", - "p3-field", - "p3-mds", - "p3-poseidon2", - "p3-symmetric", - "rand", - "serde", -] - -[[package]] -name = "p3-dft" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eece7b035978976138622b116fefe6c4cc372b1ce70739c40e7a351a9bb68f1f" -dependencies = [ - "p3-field", - "p3-matrix", - "p3-maybe-rayon", - "p3-util", - "tracing", -] - -[[package]] -name = "p3-field" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6f0edf3fde4fd0d1455e901fc871c558010ae18db6e68f1b0fa111391855316" -dependencies = [ - "itertools", - "num-bigint", - "num-traits", - "p3-util", - "rand", - "serde", -] - -[[package]] -name = "p3-matrix" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60961b4d7ffd2e8412ce4e66e213de610356df71cc4e396519c856a664138a27" -dependencies = [ - "itertools", - "p3-field", - "p3-maybe-rayon", - "p3-util", - "rand", - "serde", - "tracing", -] - -[[package]] -name = "p3-maybe-rayon" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bbe762738c382c9483410f52348ab9de41bb42c391e8171643a71486cf1ef8f" - -[[package]] -name = "p3-mds" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4127956cc6c783b7d021c5c42d5d89456d5f3bda4a7b165fcc2a3fd4e78fbede" -dependencies = [ - "itertools", - "p3-dft", - "p3-field", - "p3-matrix", - "p3-symmetric", - "p3-util", - "rand", -] - -[[package]] -name = "p3-poseidon2" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be09497da406a98e89dc05c1ce539eeef29541bad61a5b2108a44ffe94dd0b4c" -dependencies = [ - "gcd", - "p3-field", - "p3-mds", - "p3-symmetric", - "rand", - "serde", -] - -[[package]] -name = "p3-symmetric" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7d954033f657d48490344ca4b3dbcc054962a0e92831b736666bb2f5e5820b" -dependencies = [ - "itertools", - "p3-field", - "serde", -] - -[[package]] -name = "p3-util" -version = "0.2.2-succinct" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a6ce0b6bee23fd54e05306f6752ae80b0b71a91166553ab39d7899801497237" -dependencies = [ - "serde", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_users" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" -dependencies = [ - "getrandom", - "libredox", - "thiserror 1.0.69", -] - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "subtle", - "zeroize", -] - -[[package]] -name = "semver" -version = "1.0.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.219" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.142" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "sp1" -version = "0.0.1" -dependencies = [ - "sp1-verifier", -] - -[[package]] -name = "sp1-build" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05372b4e3eecca255ba8e385f8dc294861a3b4ea0b0a9946873e39941011db4c" -dependencies = [ - "anyhow", - "cargo_metadata", - "chrono", - "clap", - "dirs", -] - -[[package]] -name = "sp1-lib" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e166e94b13146c65de433cf29acc1030f021414fbebfc24cd4eeaeb787ba3443" -dependencies = [ - "bincode", - "elliptic-curve", - "serde", - "sp1-primitives", -] - -[[package]] -name = "sp1-primitives" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a85ffe9606bd2cc93575ce608f063ca08521cee9bdebf611914c5b2d90d7412" -dependencies = [ - "bincode", - "blake3", - "cfg-if", - "hex", - "lazy_static", - "num-bigint", - "p3-baby-bear", - "p3-field", - "p3-poseidon2", - "p3-symmetric", - "serde", - "sha2", -] - -[[package]] -name = "sp1-verifier" -version = "4.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d94a7db4a54984acf4d64c6ba55c4698104f02ef213cc21882e233b4409e7155" -dependencies = [ - "blake3", - "cfg-if", - "hex", - "lazy_static", - "sha2", - "sp1-build", - "substrate-bn-succinct", - "thiserror 2.0.12", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "substrate-bn-succinct" -version = "0.6.0-v4.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ac8ce0a40e721f790e2ef99beab32b99b3121c58edaaa140ffd8f1795a6af7" -dependencies = [ - "bytemuck", - "byteorder", - "cfg-if", - "crunchy", - "lazy_static", - "num-bigint", - "rand", - "rustc-hex", - "sp1-lib", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "2.0.104" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing" -version = "0.1.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" -dependencies = [ - "once_cell", -] - -[[package]] -name = "typenum" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-interface" -version = "0.59.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.3", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "zerocopy" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zeroize" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" diff --git a/src/test/app/wasm_fixtures/sp1/Cargo.toml b/src/test/app/wasm_fixtures/sp1/Cargo.toml deleted file mode 100644 index d730160aeaa..00000000000 --- a/src/test/app/wasm_fixtures/sp1/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -edition = "2021" -name = "sp1" -version = "0.0.1" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -sp1-verifier = "4.1.3" - -[profile.release] -opt-level = 3 # "z" for size or "3" for speed -lto = true # Link Time Optimization -codegen-units = 1 # Single unit = better optimization -panic = "abort" # Smaller binary, faster execution diff --git a/src/test/app/wasm_fixtures/sp1/src/lib.rs b/src/test/app/wasm_fixtures/sp1/src/lib.rs deleted file mode 100644 index f918e4f42df..00000000000 --- a/src/test/app/wasm_fixtures/sp1/src/lib.rs +++ /dev/null @@ -1,37 +0,0 @@ -use sp1_verifier::Groth16Verifier; - -#[no_mangle] -pub fn sp1_groth16_verifier() -> bool { - let groth16_vk = *sp1_verifier::GROTH16_VK_BYTES; - - let proof: Vec = vec![ - 17, 182, 160, 157, 31, 189, 116, 200, 17, 224, 230, 34, 195, 108, 230, 185, 62, 91, 181, - 212, 80, 111, 197, 89, 247, 206, 99, 206, 147, 13, 216, 101, 252, 192, 149, 2, 40, 4, 249, - 44, 97, 227, 127, 36, 244, 18, 27, 75, 248, 3, 45, 11, 103, 45, 183, 204, 61, 217, 19, 208, - 66, 73, 202, 108, 136, 162, 221, 184, 6, 189, 49, 196, 104, 128, 151, 21, 104, 109, 145, - 150, 243, 51, 27, 243, 203, 75, 176, 59, 193, 51, 177, 64, 83, 13, 133, 140, 248, 242, 13, - 24, 12, 103, 126, 112, 244, 181, 129, 246, 52, 110, 134, 57, 149, 23, 163, 43, 202, 7, 164, - 233, 179, 160, 16, 5, 22, 45, 129, 76, 183, 76, 150, 139, 27, 224, 191, 59, 47, 105, 71, - 47, 8, 176, 157, 159, 234, 253, 239, 131, 138, 120, 101, 4, 98, 236, 106, 235, 98, 76, 93, - 220, 174, 153, 58, 216, 28, 141, 129, 191, 188, 40, 184, 225, 22, 61, 75, 139, 159, 162, - 117, 83, 214, 239, 1, 246, 236, 255, 64, 228, 116, 107, 206, 23, 59, 3, 221, 95, 14, 170, - 28, 171, 36, 179, 75, 101, 177, 40, 198, 12, 193, 82, 105, 155, 177, 62, 158, 72, 209, 252, - 51, 169, 109, 32, 121, 179, 194, 73, 164, 14, 8, 206, 181, 9, 5, 38, 74, 136, 97, 0, 89, - 80, 75, 88, 228, 94, 46, 196, 199, 83, 229, 11, 103, 115, 25, 31, 215, 137, 65, 159, 95, - 192, - ]; - - let sp1_public_values = vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, - ]; - - let sp1_vkey_hash: String = - "0x00aea8e9c83c73d74036923de1b4a66d18547d58eee4eacfee70235ed291954c".to_string(); - - let _ = Groth16Verifier::verify(&proof, &sp1_public_values, &sp1_vkey_hash, groth16_vk); - - true -} diff --git a/src/test/app/wasm_fixtures/wat/deep_recursion.wat b/src/test/app/wasm_fixtures/wat/deep_recursion.wat new file mode 100644 index 00000000000..8e1f02c0012 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/deep_recursion.wat @@ -0,0 +1,29 @@ +(module + ;; Define a Mutable Global Variable to act as our counter. + ;; We initialize it to 1,000,000. + (global $counter (mut i32) (i32.const 1000000)) + + (func $finish (result i32) + ;; 1. Check if counter == 0 (Base Case) + global.get $counter + i32.eqz + if + ;; If counter is 0, we are done. Return 1. + i32.const 1 + return + end + + ;; 2. Decrement the Global Counter + global.get $counter + i32.const 1 + i32.sub + global.set $counter + + ;; 3. Recursive Step: Call SELF + ;; This puts an i32 (1) on the stack when it returns. + call $finish + ) + + ;; Export the only function we have + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.lock b/src/test/app/wasm_fixtures/zk_proof/Cargo.lock deleted file mode 100644 index f042837723f..00000000000 --- a/src/test/app/wasm_fixtures/zk_proof/Cargo.lock +++ /dev/null @@ -1,106 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "ff", - "group", - "pairing", - "rand_core", - "subtle", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "bitvec", - "rand_core", - "subtle", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "rand_core", - "subtle", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zk_proof" -version = "0.0.1" -dependencies = [ - "bls12_381", - "group", -] diff --git a/src/test/app/wasm_fixtures/zk_proof/Cargo.toml b/src/test/app/wasm_fixtures/zk_proof/Cargo.toml deleted file mode 100644 index 3e556d43176..00000000000 --- a/src/test/app/wasm_fixtures/zk_proof/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -edition = "2021" -name = "zk_proof" -version = "0.0.1" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -# bellman = "=0.14.0" -bls12_381 = "=0.8.0" -group = "0.13.0" - -[profile.release] -# opt-level = 3 # Optimize for time -opt-level = "z" # Optimize for size -lto = true # Enable Link Time Optimization -codegen-units = 1 -panic = "abort" # Remove unnecessary panic machinery diff --git a/src/test/app/wasm_fixtures/zk_proof/src/lib.rs b/src/test/app/wasm_fixtures/zk_proof/src/lib.rs deleted file mode 100644 index 4d44d8e3424..00000000000 --- a/src/test/app/wasm_fixtures/zk_proof/src/lib.rs +++ /dev/null @@ -1,254 +0,0 @@ -use bls12_381::multi_miller_loop; -use bls12_381::Scalar; -use bls12_381::{G1Affine, G2Affine, G2Prepared}; -use group::prime::PrimeCurveAffine; -use group::Curve; - -use std::mem; -use std::os::raw::c_void; -// use std::time::{Instant}; - -// Groth16 proof struct -pub struct Proof { - pub a: G1Affine, - pub b: G2Affine, - pub c: G1Affine, -} - -// Groth16 verification key struct -pub struct VerifyingKey { - pub alpha_g1: G1Affine, - pub beta_g1: G1Affine, - pub beta_g2: G2Affine, - pub gamma_g2: G2Affine, - pub delta_g1: G1Affine, - pub delta_g2: G2Affine, - pub ic: Vec, -} - -#[no_mangle] -pub extern "C" fn allocate(size: usize) -> *mut c_void { - let mut buffer = Vec::with_capacity(size); - let pointer = buffer.as_mut_ptr(); - mem::forget(buffer); - pointer as *mut c_void - // } -} - -#[no_mangle] -fn deserialize_g1_wasm(buffer: &mut Vec) -> G1Affine { - let d_g1 = G1Affine::from_compressed(&buffer[0..48].try_into().unwrap()) - .expect("Failed to deserialize vk"); - - d_g1 -} - -fn deserialize_g2_wasm(buffer: &mut Vec) -> G2Affine { - let d_g2 = G2Affine::from_compressed(&buffer[0..96].try_into().unwrap()) - .expect("Failed to deserialize vk"); - - d_g2 -} - -#[no_mangle] -// pub extern fn bellman_groth16_test(pointer: *mut u8, capacity: usize) -> bool { -pub extern "C" fn bellman_groth16_test() -> bool { - // let mut bytes = Vec::new(); - // unsafe { - // // println!("Test in vm {:?}", pointer); - // let v = Vec::from_raw_parts(pointer, capacity, capacity); //TODO no need to deallocate?? - // bytes.extend_from_slice(&v); - // } - - // Hardcode the input bytes for testing in different WASM VMs - // let bytes = [172, 197, 81, 189, 121, 193, 159, 27, 92, 95, 151, 164, 40, 59, 214, 96, 132, 58, 87, 37, 169, 1, 63, 230, 35, 74, 245, 6, 185, 56, 120, 108, 214, 179, 187, 21, 36, 206, 43, 160, 10, 250, 249, 73, 210, 35, 137, 87, 177, 66, 65, 154, 11, 232, 137, 246, 125, 72, 227, 222, 116, 168, 87, 24, 165, 160, 132, 109, 108, 101, 222, 143, 78, 97, 48, 95, 59, 177, 29, 247, 219, 166, 73, 249, 69, 206, 15, 151, 30, 248, 235, 63, 148, 240, 17, 22, 150, 67, 252, 141, 95, 179, 94, 111, 207, 201, 192, 144, 154, 94, 21, 2, 22, 58, 96, 144, 227, 107, 107, 182, 142, 0, 57, 27, 168, 39, 226, 40, 163, 159, 112, 83, 196, 182, 215, 74, 92, 20, 158, 60, 23, 184, 198, 143, 17, 6, 242, 7, 75, 220, 87, 47, 224, 145, 99, 169, 203, 218, 112, 185, 51, 102, 59, 56, 171, 46, 49, 255, 116, 108, 241, 50, 180, 247, 62, 218, 181, 197, 155, 80, 61, 252, 8, 41, 232, 73, 51, 250, 223, 82, 94, 8, 185, 83, 223, 187, 6, 41, 20, 62, 189, 254, 11, 11, 58, 187, 200, 88, 53, 234, 98, 172, 213, 62, 22, 34, 90, 166, 182, 133, 8, 230, 103, 219, 233, 141, 10, 137, 210, 151, 4, 129, 29, 92, 103, 251, 72, 182, 162, 59, 20, 222, 188, 232, 13, 74, 214, 182, 172, 120, 33, 198, 57, 204, 134, 93, 26, 79, 213, 45, 146, 6, 128, 103, 63, 202, 226, 120, 141, 193, 248, 65, 196, 235, 21, 184, 104, 228, 206, 117, 190, 28, 153, 183, 68, 36, 63, 60, 131, 87, 137, 213, 105, 27, 110, 37, 238, 200, 250, 145, 76, 25, 57, 81, 69, 164, 208, 255, 49, 80, 14, 64, 181, 143, 12, 58, 35, 63, 199, 35, 70, 25, 86, 158, 210, 150, 59, 159, 253, 238, 174, 211, 142, 166, 223, 51, 134, 118, 171, 27, 218, 219, 117, 163, 71, 134, 95, 142, 83, 251, 240, 241, 162, 232, 93, 248, 167, 112, 197, 212, 169, 209, 159, 101, 140, 248, 222, 234, 201, 169, 76, 242, 7, 10, 192, 30, 151, 167, 74, 186, 97, 121, 144, 36, 6, 187, 92, 7, 248, 45, 134, 85, 240, 112, 74, 224, 70, 64, 198, 59, 26, 195, 192, 140, 101, 118, 175, 17, 160, 195, 142, 133, 1, 139, 5, 130, 245, 17, 73, 176, 232, 107, 130, 172, 110, 20, 190, 37, 108, 250, 178, 187, 151, 158, 35, 248, 246, 143, 38, 212, 133, 226, 24, 45, 33, 164, 46, 125, 200, 157, 253, 225, 132, 181, 60, 90, 7, 240, 80, 232, 97, 206, 164, 28, 12, 75, 68, 126, 230, 145, 216, 45, 180, 203, 19, 152, 29, 203, 9, 4, 145, 122, 206, 146, 179, 44, 145, 191, 126, 199, 175, 171, 127, 189, 222, 108, 126, 161, 80, 190, 47, 44, 8, 40, 65, 68, 95, 61, 109, 148, 175, 113, 226, 8, 93, 126, 53, 39, 192, 196, 6, 152, 194, 105, 169, 226, 192, 201, 184, 198, 134, 210, 153, 170, 12, 241, 90, 250, 233, 20, 152, 119, 142, 120, 83, 2, 164, 80, 178, 125, 227, 253, 207, 240, 201, 127, 213, 196, 100, 90, 65, 120, 50, 108, 175, 34, 192, 197, 173, 202, 176, 210, 131, 22, 216, 57, 169, 241, 28, 40, 44, 62, 11, 42, 50, 46, 204, 242, 109, 158, 114, 41, 127, 206, 25, 194, 255, 128, 245, 232, 193, 189, 229, 51, 93, 94, 64, 117, 33, 132, 75, 253, 114, 64, 116, 155, 183, 137, 112, 201, 243, 13, 221, 142, 164, 59, 98, 152, 249, 40, 133, 70, 185, 231, 249, 151, 253, 240, 122, 214, 60, 18, 132, 177, 37, 42, 75, 206, 12, 100, 214, 248, 234, 78, 165, 74, 212, 248, 32, 162, 254, 227, 218, 46, 9, 87, 0, 118, 13, 249, 107, 83, 5, 138, 223, 9, 247, 70, 160, 228, 197, 54, 87, 18, 1, 37, 199, 162, 84, 189, 161, 10, 26, 75, 45, 168, 185, 153, 245, 243, 51, 176, 208, 187, 235, 135, 239, 231, 42, 43, 233, 150, 46, 249, 73, 229, 138, 84, 89, 75, 129, 238, 211, 80, 147, 67, 159, 227, 214, 131, 188, 130, 70, 224, 1, 77, 139, 239, 185, 53, 68, 41, 193, 207, 16, 2, 33, 139, 214, 103, 240, 14, 141, 223, 24, 236, 50, 64, 79, 178, 6, 79, 38, 165, 35, 173, 203, 101, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; - let bytes = [ - 147, 235, 138, 182, 249, 146, 149, 28, 58, 36, 144, 99, 188, 155, 153, 135, 239, 79, 76, - 109, 152, 156, 202, 1, 153, 84, 239, 184, 69, 145, 133, 48, 156, 80, 122, 227, 231, 161, - 137, 232, 67, 183, 34, 186, 230, 135, 25, 90, 136, 201, 110, 134, 208, 93, 78, 82, 153, - 239, 208, 236, 160, 231, 192, 150, 215, 128, 193, 255, 107, 39, 133, 12, 136, 148, 119, 17, - 59, 198, 100, 49, 37, 89, 132, 205, 45, 79, 151, 112, 247, 140, 94, 179, 215, 165, 52, 182, - 153, 68, 204, 210, 218, 156, 69, 74, 192, 30, 160, 13, 80, 188, 23, 112, 21, 124, 91, 147, - 21, 140, 217, 226, 248, 60, 182, 119, 18, 34, 32, 41, 181, 128, 165, 97, 168, 76, 98, 44, - 114, 122, 128, 215, 68, 156, 18, 91, 5, 33, 22, 141, 249, 137, 49, 252, 82, 122, 206, 58, - 183, 108, 176, 15, 38, 183, 87, 254, 34, 102, 195, 78, 166, 227, 96, 180, 137, 173, 131, - 178, 179, 25, 89, 159, 5, 73, 125, 24, 25, 86, 227, 19, 184, 117, 228, 173, 150, 1, 82, - 142, 48, 251, 236, 132, 73, 79, 201, 165, 192, 191, 195, 60, 100, 198, 251, 187, 161, 220, - 63, 143, 38, 21, 189, 219, 194, 100, 64, 186, 102, 7, 186, 213, 227, 92, 228, 52, 181, 171, - 223, 222, 218, 206, 221, 22, 15, 46, 77, 175, 34, 43, 221, 110, 21, 89, 149, 213, 68, 242, - 140, 185, 176, 73, 88, 216, 75, 237, 209, 10, 75, 251, 152, 101, 15, 146, 168, 27, 81, 8, - 61, 76, 103, 230, 171, 23, 144, 171, 6, 118, 157, 233, 234, 214, 132, 106, 30, 171, 121, - 77, 147, 175, 170, 62, 48, 251, 12, 221, 202, 109, 80, 97, 180, 27, 45, 87, 162, 19, 168, - 152, 27, 205, 113, 91, 83, 52, 99, 109, 17, 149, 189, 244, 174, 164, 192, 79, 133, 111, - 195, 215, 232, 129, 166, 204, 3, 169, 248, 49, 18, 190, 198, 145, 177, 169, 10, 4, 66, 134, - 46, 11, 163, 170, 94, 230, 234, 234, 43, 122, 51, 230, 100, 106, 149, 228, 208, 217, 87, - 231, 125, 170, 47, 143, 151, 45, 208, 64, 91, 10, 188, 136, 15, 155, 131, 200, 141, 243, - 200, 5, 109, 22, 98, 189, 193, 44, 40, 95, 126, 145, 234, 190, 205, 179, 172, 224, 147, - 253, 238, 162, 157, 60, 126, 9, 174, 34, 16, 161, 197, 60, 243, 211, 241, 78, 114, 51, 167, - 214, 53, 149, 172, 56, 149, 32, 66, 123, 48, 240, 179, 53, 154, 29, 134, 34, 141, 204, 168, - 184, 158, 165, 115, 241, 119, 228, 11, 35, 82, 186, 132, 103, 65, 243, 215, 31, 105, 201, - 191, 155, 210, 53, 194, 76, 63, 199, 181, 28, 138, 181, 181, 211, 145, 15, 139, 244, 38, - 56, 159, 161, 95, 46, 147, 141, 163, 221, 88, 167, 134, 73, 45, 70, 98, 98, 167, 55, 52, - 234, 110, 150, 79, 248, 157, 167, 84, 210, 89, 10, 193, 169, 32, 40, 218, 7, 236, 206, 85, - 178, 174, 157, 132, 181, 192, 119, 60, 205, 46, 217, 120, 97, 59, 82, 121, 11, 189, 21, - 213, 176, 255, 225, 57, 76, 239, 38, 99, 226, 55, 98, 227, 10, 45, 193, 69, 255, 247, 39, - 121, 86, 150, 6, 220, 98, 41, 132, 237, 189, 169, 110, 213, 115, 33, 228, 197, 61, 219, - 202, 58, 54, 70, 223, 179, 208, 139, 232, 103, 76, 165, 169, 68, 6, 148, 47, 244, 26, 203, - 186, 110, 69, 44, 175, 128, 119, 212, 188, 167, 223, 87, 119, 238, 199, 201, 61, 78, 96, - 175, 0, 156, 145, 196, 253, 162, 175, 172, 227, 80, 251, 96, 61, 189, 35, 13, 97, 22, 157, - 86, 249, 128, 148, 172, 66, 80, 172, 208, 222, 131, 0, 207, 80, 163, 27, 155, 113, 57, 186, - 246, 139, 111, 71, 117, 152, 184, 60, 1, 230, 44, 169, 213, 88, 82, 156, 194, 234, 41, 183, - 87, 36, 175, 154, 156, 128, 59, 187, 208, 101, 9, 51, 205, 42, 174, 29, 215, 43, 150, 183, - 129, 125, 2, 84, 210, 149, 245, 126, 140, 166, 255, 134, 116, 162, 107, 82, 178, 158, 38, - 11, 135, 91, 224, 157, 112, 189, 164, 250, 1, 215, 49, 21, 214, 211, 73, 243, 251, 58, 198, - 1, 165, 196, 122, 13, 238, 252, 227, 229, 149, 47, 13, 173, 171, 176, 185, 220, 82, 96, - 163, 4, 36, 199, 152, 88, 3, 162, 49, 51, 4, 151, 127, 49, 47, 223, 244, 157, 229, 7, 88, - 106, 141, 167, 183, 220, 15, 8, 119, 12, 82, 218, 14, 207, 0, 73, 27, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - ]; - - // ***** Test deserialization and reconstruction of vk ***** - // let start_key_recons = Instant::now(); - // println!("Start verification key reconstruction"); - - // alpha_g1 - let mut vec_alpha_g1 = bytes[0..48].to_vec(); - let r_alpha_g1 = deserialize_g1_wasm(&mut vec_alpha_g1); - - // beta_g1 - let mut vec_beta_g1 = bytes[48..96].to_vec(); - let r_beta_g1 = deserialize_g1_wasm(&mut vec_beta_g1); - - // beta_g2 - let mut vec_beta_g2 = bytes[96..192].to_vec(); - let r_beta_g2 = deserialize_g2_wasm(&mut vec_beta_g2); - - // gamma_g2 - let mut vec_gamma_g2 = bytes[192..288].to_vec(); - let r_gamma_g2 = deserialize_g2_wasm(&mut vec_gamma_g2); - - // delta_g1 - let mut vec_delta_g1 = bytes[288..336].to_vec(); - let r_delta_g1 = deserialize_g1_wasm(&mut vec_delta_g1); - - // delta_g2 - let mut vec_delta_g2 = bytes[336..432].to_vec(); - let r_delta_g2 = deserialize_g2_wasm(&mut vec_delta_g2); - - // ic - let vec_ic = bytes[432..576].to_vec(); - // println!("\nic vector: {:?}", vec_ic); - let mut r_ic: Vec = Vec::new(); - let mut vec_ic_de = vec_ic[0..48].to_vec(); - r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); - vec_ic_de = vec_ic[48..96].to_vec(); - r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); - vec_ic_de = vec_ic[96..144].to_vec(); - r_ic.push(deserialize_g1_wasm(&mut vec_ic_de)); - - // Reconstruct vk - // replace following if using bellman::{groth16, groth16::Proof}; - // let deserialized_vk = groth16::VerifyingKey:: { - let deserialized_vk = VerifyingKey { - alpha_g1: r_alpha_g1, - beta_g1: r_beta_g1, - beta_g2: r_beta_g2, - gamma_g2: r_gamma_g2, - delta_g1: r_delta_g1, - delta_g2: r_delta_g2, - ic: r_ic, - }; - - // Uncomment following if using bellman::{groth16, groth16::Proof}; - // let pvk = groth16::prepare_verifying_key(&deserialized_vk); - // println!("Key reconstruction time: {:?}", start_key_recons.elapsed()); - - // ***** Reconstruct proof ***** - // let start_proof_recons = Instant::now(); - - // proof.g1 - let r_a = G1Affine::from_compressed(&bytes[576..624].try_into().unwrap()) - .expect("Failed to deserialize a"); - // proof.g2 - let r_b = G2Affine::from_compressed(&bytes[624..720].try_into().unwrap()) - .expect("Failed to deserialize b"); - // proof.g1 - let r_c = G1Affine::from_compressed(&bytes[720..768].try_into().unwrap()) - .expect("Failed to deserialize c"); - - // Replace following if using bellman::{groth16, groth16::Proof}; - // let r_proof: Proof = Proof{a: r_a, b: r_b, c: r_c}; - let r_proof: Proof = Proof { - a: r_a, - b: r_b, - c: r_c, - }; - // println!("Proof reconstruction time: {:?}", start_proof_recons.elapsed()); - - // ***** Reconstruct input ***** - // let start_input_recons = Instant::now(); - - let last_64_bytes = &bytes[bytes.len() - 64..]; - - let r_inputs: Vec = last_64_bytes - .chunks(32) // Each Scalar in bls12_381 uses 32 bytes - .map(|chunk| { - Scalar::from_bytes(chunk.try_into().unwrap()).expect("Invalid bytes for Scalar") - }) - .collect(); - - // println!("Input reconstruction time: {:?}", start_input_recons.elapsed()); - - /***** proof verification *****/ - // uncomment following if bellman groth16 is used - // assert!(groth16::verify_proof(&pvk, &r_proof, &r_inputs).is_ok()); - // let start_verify = Instant::now(); - - // Ensure the number of inputs matches the vk.ic length minus 1 (for IC[0]) - if (r_inputs.len() + 1) != deserialized_vk.ic.len() { - return false; - } - - /***** Compute linear combination: input_acc = IC[0] + sum(input[i] * IC[i+1]) *****/ - let mut acc = deserialized_vk.ic[0].to_curve(); // Convert G1Affine to G1Projective - - // Computes multi-scalar multiplication, - // which is a weighted sum of elliptic curve points. - // In Groth16, this builds the point: - // acc = IC₀ + input₁ × IC₁ + input₂ × IC₂ + ... + inputₙ × ICₙ - // Where: ICᵢ are fixed elliptic curve points (from the verifying key). - // inputᵢ are the public inputs to the circuit. - // Example: public_inputs = [x₁, x₂], vk.ic = [IC₀, IC₁, IC₂], acc = IC₀ + x₁ * IC₁ + x₂ * IC₂ - // This binds the public inputs to the proof - for (input, ic_point) in r_inputs.iter().zip(&deserialized_vk.ic[1..]) { - acc += ic_point.to_curve() * input; - } - - let acc_affine = acc.to_affine(); // converts the point acc from projective form back to affine form. - - // Preparing G2 elements for pairing by converting them into G2Prepared format. - let proof_b_prepared = G2Prepared::from(r_proof.b); - let gamma_g2_prepared = G2Prepared::from(deserialized_vk.gamma_g2); - let delta_g2_prepared = G2Prepared::from(deserialized_vk.delta_g2); - let beta_g2_prepared = G2Prepared::from(deserialized_vk.beta_g2); - - // Compute required product of pairings in their Miller loop form - // Groth16 verifier checks if e(A, B) * e(acc, γ)⁻¹ * e(C, δ)⁻¹ * e(α, β)⁻¹ == 1 - // which boils down to - // let start_miller = Instant::now(); - let ml_result = multi_miller_loop(&[ - (&r_proof.a, &proof_b_prepared), // e(A,B) - (&(-acc_affine), &gamma_g2_prepared), // e(acc, γ)⁻¹ - (&(-r_proof.c), &delta_g2_prepared), // e(C, δ)⁻¹ - (&(-deserialized_vk.alpha_g1), &beta_g2_prepared), //e(α, β)⁻¹ - ]); - // println!("Miller time: {:?}", start_miller.elapsed()); - - // let start_final = Instant::now(); - let result = ml_result.final_exponentiation(); - // println!("Final time: {:?}", start_final.elapsed()); - // println!("Proof verification time: {:?}", start_verify.elapsed()); - - // true - result == bls12_381::Gt::identity() -} diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index 5309ed8f86e..e8230175a44 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -18,6 +18,8 @@ static std::string_view const W_PROC_EXIT = "proc_exit"; static std::string_view const ESCROW_FUNCTION_NAME = "finish"; +uint32_t const MAX_PAGES = 128; // 8MB = 64KB*128 + class WasmiEngine; class WasmEngine diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index fe3a5629f71..6e79827060f 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -506,6 +506,16 @@ WasmiEngine::init() return std::unique_ptr{ nullptr, &wasm_engine_delete}; // LCOV_EXCL_LINE wasmi_config_consume_fuel_set(config, true); + wasmi_config_ignore_custom_sections_set(config, true); + wasmi_config_wasm_mutable_globals_set(config, false); + wasmi_config_wasm_multi_value_set(config, false); + wasmi_config_wasm_sign_extension_set(config, false); + wasmi_config_wasm_saturating_float_to_int_set(config, false); + wasmi_config_wasm_bulk_memory_set(config, false); + wasmi_config_wasm_reference_types_set(config, false); + wasmi_config_wasm_tail_call_set(config, false); + wasmi_config_wasm_extended_const_set(config, false); + wasmi_config_floats_set(config, false); return std::unique_ptr( wasm_engine_new_with_config(config), &wasm_engine_delete); @@ -525,7 +535,9 @@ WasmiEngine::addModule( { moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store - store_ = {wasm_store_new(engine_.get()), &wasm_store_delete}; + store_ = { + wasm_store_new_with_memory_max_pages(engine_.get(), MAX_PAGES), + &wasm_store_delete}; if (gas < 0) gas = std::numeric_limits::max(); From c5d178f152ea8fdbaa007e11642175424788e43b Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 2 Dec 2025 13:12:15 -0500 Subject: [PATCH 123/212] HF cost for smart escrow (#6097) --- src/test/app/EscrowSmart_test.cpp | 8 ++++---- src/xrpld/app/tx/detail/Escrow.cpp | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 5bbae451b35..b7cd48d2424 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -390,7 +390,7 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 5; + std::uint32_t const allowance = 65; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto [createFee, finishFee] = [&]() { Env env(*this, features); @@ -683,7 +683,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { env.require(balance(alice, XRP(4000) - txnFees)); - auto const allowance = 14; + auto const allowance = 1014; XRPAmount const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + @@ -778,7 +778,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 794, + txMeta->getFieldU32(sfGasUsed) == 38'554, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); @@ -863,7 +863,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 2'985; + auto const allowance = 138'485; auto const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 5dd7b486c3d..2fd44b33cb8 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -217,9 +217,8 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temMALFORMED; } - HostFunctions mock; - auto const re = - preflightEscrowWasm(code, ESCROW_FUNCTION_NAME, {}, &mock, ctx.j); + HostFunctions mock(ctx.j); + auto const re = preflightEscrowWasm(code, mock, ESCROW_FUNCTION_NAME); if (!isTesSuccess(re)) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; @@ -1214,7 +1213,7 @@ EscrowFinish::doApply() } std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; auto re = runEscrowWasm( - wasm, ESCROW_FUNCTION_NAME, {}, &ledgerDataProvider, allowance); + wasm, ledgerDataProvider, ESCROW_FUNCTION_NAME, {}, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; if (auto const& data = ledgerDataProvider.getData(); data.has_value()) From 1e0741690da5da7a7f0ea023831caccf9e9b0c6a Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 3 Dec 2025 18:27:06 -0500 Subject: [PATCH 124/212] Fix sign cost (#6103) --- src/test/app/EscrowSmart_test.cpp | 2 +- src/test/app/Wasm_test.cpp | 8 ++++---- src/xrpld/app/wasm/detail/WasmVM.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index b7cd48d2424..0add560524d 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -778,7 +778,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 38'554, + txMeta->getFieldU32(sfGasUsed) == 38'054, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b7ad172f2f6..d07adf4f0e0 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -311,7 +311,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 39'602, std::to_string(re->cost)); } env.close(); @@ -360,7 +360,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 39'602, std::to_string(re->cost)); } } @@ -371,7 +371,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 39'602, std::to_string(re->cost)); } } @@ -672,7 +672,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 153'534; + auto const allowance = 291'334; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 9ac91358dc3..fba69c7fe48 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -39,8 +39,8 @@ setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) WASM_IMPORT_FUNC2(i, getCurrentLedgerObjNestedArrayLen, "get_current_ledger_obj_nested_array_len", hfs, 70); WASM_IMPORT_FUNC2(i, getLedgerObjNestedArrayLen, "get_ledger_obj_nested_array_len", hfs, 70); - WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 300); - WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 2000); + WASM_IMPORT_FUNC2(i, checkSignature, "check_sig", hfs, 35'000); + WASM_IMPORT_FUNC2(i, computeSha512HalfHash, "compute_sha512_half", hfs, 1'500); WASM_IMPORT_FUNC2(i, accountKeylet, "account_keylet", hfs, 350); WASM_IMPORT_FUNC2(i, ammKeylet, "amm_keylet", hfs, 450); From b57df290def6de7b63f6ed48a8dbbe9061b13763 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 8 Dec 2025 13:02:01 -0500 Subject: [PATCH 125/212] Use conan repo for wasmi lib (#6109) * Use conan repo for wasmi lib * Generate lockfile --- .github/actions/build-deps/action.yml | 1 - conan.lock | 63 ++++++ external/wasmi/conandata.yml | 11 -- external/wasmi/conanfile.py | 48 ----- .../wasmi/patches/0001-xrplf-0.42.1.patch | 180 ------------------ 5 files changed, 63 insertions(+), 240 deletions(-) create mode 100644 conan.lock delete mode 100644 external/wasmi/conandata.yml delete mode 100644 external/wasmi/conanfile.py delete mode 100644 external/wasmi/patches/0001-xrplf-0.42.1.patch diff --git a/.github/actions/build-deps/action.yml b/.github/actions/build-deps/action.yml index 9ac6d657806..f20eb3a595b 100644 --- a/.github/actions/build-deps/action.yml +++ b/.github/actions/build-deps/action.yml @@ -35,7 +35,6 @@ runs: LOG_VERBOSITY: ${{ inputs.log_verbosity }} run: | echo 'Installing dependencies.' - conan export --version 0.42.1 external/wasmi #TODO Switch to conan package mkdir -p "${BUILD_DIR}" cd "${BUILD_DIR}" conan install \ diff --git a/conan.lock b/conan.lock new file mode 100644 index 00000000000..53fd85f3661 --- /dev/null +++ b/conan.lock @@ -0,0 +1,63 @@ +{ + "version": "0.5", + "requires": [ + "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", + "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", + "wasmi/0.42.1#2a96357d4e6bf40dfe201106d849c24f%1764802092.014", + "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", + "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", + "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", + "secp256k1/0.7.0#d01848b436efd0efaeec1bff7d9df847%1764270192.06", + "rocksdb/10.5.1#4a197eca381a3e5ae8adf8cffa5aacd0%1762797952.535", + "re2/20230301#ca3b241baec15bd31ea9187150e0b333%1764175362.029", + "protobuf/6.32.1#f481fd276fc23a33b85a3ed1e898b693%1764863245.83", + "openssl/3.5.4#a1d5835cc6ed5c5b8f3cd5b9b5d24205%1760106486.594", + "nudb/2.0.9#fb8dfd1a5557f5e0528114c2da17721e%1763150366.909", + "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999", + "libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64", + "libbacktrace/cci.20210118#a7691bfccd8caaf66309df196790a5a1%1756230911.03", + "libarchive/3.8.1#ffee18995c706e02bf96e7a2f7042e0d%1764175360.142", + "jemalloc/5.3.0#e951da9cf599e956cebc117880d2d9f8%1729241615.244", + "grpc/1.72.0#f244a57bff01e708c55a1100b12e1589%1763158050.628", + "ed25519/2015.03#ae761bdc52730a843f0809bdf6c1b1f6%1764270189.893", + "doctest/2.4.12#eb9fb352fb2fdfc8abb17ec270945165%1762797941.757", + "date/3.0.4#862e11e80030356b53c2c38599ceb32b%1763584497.32", + "c-ares/1.34.5#5581c2b62a608b40bb85d965ab3ec7c8%1764175359.429", + "bzip2/1.0.8#c470882369c2d95c5c77e970c0c7e321%1764175359.429", + "boost/1.88.0#8852c0b72ce8271fb8ff7c53456d4983%1756223752.326", + "abseil/20250127.0#9e8e8cfc89a1324139fc0ee3bd4d8c8c%1753819045.301" + ], + "build_requires": [ + "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", + "strawberryperl/5.32.1.1#707032463aa0620fa17ec0d887f5fe41%1756234281.733", + "protobuf/6.32.1#f481fd276fc23a33b85a3ed1e898b693%1764863245.83", + "nasm/2.16.01#31e26f2ee3c4346ecd347911bd126904%1756234232.901", + "msys2/cci.latest#1996656c3c98e5765b25b60ff5cf77b4%1764840888.758", + "m4/1.4.19#70dc8bbb33e981d119d2acc0175cf381%1763158052.846", + "cmake/4.2.0#ae0a44f44a1ef9ab68fd4b3e9a1f8671%1764175359.44", + "cmake/3.31.10#313d16a1aa16bbdb2ca0792467214b76%1764175359.429", + "b2/5.3.3#107c15377719889654eb9a162a673975%1756234226.28", + "automake/1.16.5#b91b7c384c3deaa9d535be02da14d04f%1755524470.56", + "autoconf/2.71#51077f068e61700d65bb05541ea1e4b0%1731054366.86", + "abseil/20250127.0#9e8e8cfc89a1324139fc0ee3bd4d8c8c%1753819045.301" + ], + "python_requires": [], + "overrides": { + "protobuf/5.27.0": [ + "protobuf/6.32.1" + ], + "lz4/1.9.4": [ + "lz4/1.10.0" + ], + "boost/1.83.0": [ + "boost/1.88.0" + ], + "sqlite3/3.44.2": [ + "sqlite3/3.49.1" + ], + "lz4/[>=1.9.4 <2]": [ + "lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504" + ] + }, + "config_requires": [] +} diff --git a/external/wasmi/conandata.yml b/external/wasmi/conandata.yml deleted file mode 100644 index 032c12753c4..00000000000 --- a/external/wasmi/conandata.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Do not update. Maintained by programmability team. - -sources: - "0.42.1": - sha256: 2a5697be33c7afce8f671af4a5a3621d9e93ce55d253d31bd8201458e465fbb8 - url: https://github.com/wasmi-labs/wasmi/archive/refs/tags/v0.42.1.tar.gz -patches: - "0.42.1": - - patch_file: "patches/0001-xrplf-0.42.1.patch" - patch_type: conan - patch_description: Integration patch. Make wasmi lib to be able to build with existing smart-escrow branch. diff --git a/external/wasmi/conanfile.py b/external/wasmi/conanfile.py deleted file mode 100644 index e245d62eb0a..00000000000 --- a/external/wasmi/conanfile.py +++ /dev/null @@ -1,48 +0,0 @@ -from conan import ConanFile, tools -from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps, cmake_layout -from conan.tools.files import apply_conandata_patches, export_conandata_patches, get -import os - -required_conan_version = ">=2.0.0" - -class WasmiConan(ConanFile): - name = "wasmi" - license = "Apache License v2.0" - url = "https://github.com/wasmi-labs/wasmi.git" - description = "WebAssembly (Wasm) interpreter" - package_type = "library" - settings = "os", "arch", "compiler", "build_type" - options = {"shared": [False]} - default_options = {"shared": False} - - def export_sources(self): - export_conandata_patches(self) - - def layout(self): - cmake_layout(self, src_folder="src") - - def source(self): - get(self, **self.conan_data["sources"][self.version], strip_root=True) - apply_conandata_patches(self) - - def generate(self): - tc = CMakeToolchain(self) - tc.variables["BUILD_SHARED_LIBS"] = self.options.shared - tc.generate() - - deps = CMakeDeps(self) - deps.generate() - - def build(self): - cmake = CMake(self) - cmake.configure(build_script_folder=os.path.join(self.source_folder, "crates", "c_api")) - cmake.build() - - def package(self): - cmake = CMake(self) - cmake.install() - - def package_info(self): - self.cpp_info.libs = ["wasmi"] - self.cpp_info.names["cmake_find_package"] = "wasmi" - self.cpp_info.names["cmake_find_package_multi"] = "wasmi" diff --git a/external/wasmi/patches/0001-xrplf-0.42.1.patch b/external/wasmi/patches/0001-xrplf-0.42.1.patch deleted file mode 100644 index cecab3f8c2f..00000000000 --- a/external/wasmi/patches/0001-xrplf-0.42.1.patch +++ /dev/null @@ -1,180 +0,0 @@ -diff --git a/crates/c_api/CMakeLists.txt b/crates/c_api/CMakeLists.txt -index b15c787a..54eaed2d 100644 ---- a/crates/c_api/CMakeLists.txt -+++ b/crates/c_api/CMakeLists.txt -@@ -6,6 +6,8 @@ option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) - option(WASMI_ALWAYS_BUILD "If cmake should always invoke cargo to build Wasmi" ON) - set(WASMI_TARGET "" CACHE STRING "Rust target to build for") - -+add_compile_definitions(COMPILING_WASM_RUNTIME_API=1) -+ - if(NOT WASMI_TARGET) - execute_process( - COMMAND rustc -vV -@@ -43,6 +45,10 @@ endif() - list(TRANSFORM WASMI_SHARED_FILES PREPEND ${WASMI_TARGET_DIR}/) - list(TRANSFORM WASMI_STATIC_FILES PREPEND ${WASMI_TARGET_DIR}/) - -+if(NOT BUILD_SHARED_LIBS) -+ set(WASMI_SHARED_FILES) -+endif() -+ - # Instructions on how to build and install the Wasmi Rust crate. - find_program(WASMI_CARGO_BINARY cargo REQUIRED) - include(ExternalProject) -@@ -79,7 +85,6 @@ else() - target_link_libraries(wasmi INTERFACE ${WASMI_STATIC_FILES}) - - if(WASMI_TARGET MATCHES "windows") -- target_compile_options(wasmi INTERFACE -DWASM_API_EXTERN= -DWASI_API_EXTERN=) - target_link_libraries(wasmi INTERFACE ws2_32 advapi32 userenv ntdll shell32 ole32 bcrypt) - elseif(NOT WASMI_TARGET MATCHES "darwin") - target_link_libraries(wasmi INTERFACE pthread dl m) -@@ -112,6 +117,7 @@ install( - DESTINATION ${CMAKE_INSTALL_LIBDIR} - ) - -+if(BUILD_SHARED_LIBS) - if(WASMI_TARGET MATCHES "darwin") - set(INSTALLED_LIB "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/libwasmi.dylib") - install( -@@ -131,6 +137,7 @@ if(WASMI_TARGET MATCHES "darwin") - install(CODE "execute_process(COMMAND ${install_name_tool_cmd})") - endif() - endif() -+endif() - - # Documentation Generation via Doxygen: - set(DOXYGEN_CONF_IN ${CMAKE_CURRENT_SOURCE_DIR}/doxygen.conf.in) -@@ -141,19 +148,3 @@ add_custom_target(doc - DEPENDS ${WASMI_GENERATED_CONF_H} ${DOXYGEN_CONF_OUT} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) -- --# C-Header Formatting via clang-format: --find_program(CLANG_FORMAT clang-format REQUIRED) --file(GLOB_RECURSE HEADER_FILES -- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi.h -- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi/*.h -- ${CMAKE_CURRENT_SOURCE_DIR}/include/wasmi/*.hh --) --add_custom_target(check-format -- COMMAND ${CLANG_FORMAT} -style=llvm -Werror --dry-run ${HEADER_FILES} -- COMMENT "clang-format: Check formatting for Wasmi C-API header files" --) --add_custom_target(format -- COMMAND ${CLANG_FORMAT} -style=llvm -i ${HEADER_FILES} -- COMMENT "clang-format: Apply formatting rules for Wasmi C-API header files" --) -diff --git a/crates/c_api/include/wasm.h b/crates/c_api/include/wasm.h -index 5ee617ff..37809a6f 100644 ---- a/crates/c_api/include/wasm.h -+++ b/crates/c_api/include/wasm.h -@@ -13,11 +13,17 @@ - #include - - #ifndef WASM_API_EXTERN --#if defined(_WIN32) && !defined(__MINGW32__) && !defined(LIBWASM_STATIC) -+#if defined(_MSC_BUILD) -+#if defined(COMPILING_WASM_RUNTIME_API) -+#define WASM_API_EXTERN __declspec(dllexport) -+#elif defined(_DLL) - #define WASM_API_EXTERN __declspec(dllimport) - #else - #define WASM_API_EXTERN - #endif -+#else -+#define WASM_API_EXTERN -+#endif - #endif - - #ifdef __cplusplus -@@ -146,6 +152,13 @@ WASM_DECLARE_OWN(store) - - WASM_API_EXTERN own wasm_store_t* wasm_store_new(wasm_engine_t*); - -+// Store fuel functions (forward declarations) -+struct wasmi_error; -+ -+WASM_API_EXTERN struct wasmi_error* wasm_store_get_fuel(const wasm_store_t*, uint64_t* fuel); -+WASM_API_EXTERN struct wasmi_error* wasm_store_set_fuel(wasm_store_t*, uint64_t fuel); -+//WASM_API_EXTERN void *wasm_store_get_data(const wasm_store_t*); -+//WASM_API_EXTERN void wasm_store_set_data(wasm_store_t*, void *data); - - /////////////////////////////////////////////////////////////////////////////// - // Type Representations -diff --git a/crates/c_api/include/wasmi.h b/crates/c_api/include/wasmi.h -index 2caffa37..0c0584ec 100644 ---- a/crates/c_api/include/wasmi.h -+++ b/crates/c_api/include/wasmi.h -@@ -10,7 +10,7 @@ - /** - * \brief Wasmi version string. - */ --#define WASMI_VERSION "0.35.0" -+#define WASMI_VERSION "0.42.1" - /** - * \brief Wasmi major version number. - */ -@@ -18,10 +18,10 @@ - /** - * \brief Wasmi minor version number. - */ --#define WASMI_VERSION_MINOR 35 -+#define WASMI_VERSION_MINOR 42 - /** - * \brief Wasmi patch version number. - */ --#define WASMI_VERSION_PATCH 0 -+#define WASMI_VERSION_PATCH 1 - - #endif // WASMI_H -diff --git a/crates/c_api/src/store.rs b/crates/c_api/src/store.rs -index 56d4898f..543dbff8 100644 ---- a/crates/c_api/src/store.rs -+++ b/crates/c_api/src/store.rs -@@ -175,3 +175,44 @@ pub extern "C" fn wasmi_context_set_fuel( - ) -> Option> { - crate::handle_result(store.set_fuel(fuel), |()| {}) - } -+ -+//////////////////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////////////////// -+//////////////////////////////////////////////////////////////////////////////////////// -+ -+/// Returns the current fuel of the wasm store context in `fuel`. -+/// -+/// Wraps [`Store::get_fuel`]. -+/// -+/// # Errors -+/// -+/// If [`Store::get_fuel`] errors. -+#[no_mangle] -+pub extern "C" fn wasm_store_get_fuel( -+ store: &wasm_store_t, -+ fuel: &mut u64, -+) -> Option> { -+ let context = unsafe { store.inner.context() }; -+ crate::handle_result(context.get_fuel(), |amt| { -+ *fuel = amt; -+ }) -+} -+ -+/// Sets the current fuel of the wasm store context to `fuel`. -+/// -+/// Wraps [`Store::set_fuel`]. -+/// -+/// # Errors -+/// -+/// If [`Store::set_fuel`] errors. -+#[no_mangle] -+pub extern "C" fn wasm_store_set_fuel( -+ store: &mut wasm_store_t, -+ fuel: u64, -+) -> Option> { -+ -+ let mut context = unsafe { store.inner.context_mut() }; -+ crate::handle_result(context.set_fuel(fuel), |()| {}) -+} -+ From 6a54ed7f14c6130b53d6ab4daab95742548726ac Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 12 Dec 2025 15:12:43 -0800 Subject: [PATCH 126/212] fix fee overflow issue in `EscrowFinish` (#6130) --- src/test/app/EscrowSmart_test.cpp | 96 ++++++++++++++++++++++++++++++ src/xrpld/app/tx/detail/Escrow.cpp | 6 +- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 0add560524d..497b4847f89 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -713,6 +713,101 @@ struct EscrowSmart_test : public beast::unit_test::suite } } + void + testFees(FeatureBitset features) + { + testcase("Fees"); + + using namespace jtx; + using namespace std::chrono; + + Account const alice{"alice"}; + Account const carol{"carol"}; + + // Tests whether the ledger index is >= 5 + // getLedgerSqn() >= 5} + auto const& wasmHex = ledgerSqnWasmHex; + uint64_t const allowance = 65; + auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto createFee = [&]() { + Env env(*this, features); + auto createFee = + env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + return createFee; + }(); + + { + // ensure fees don't overflow + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.gas_price = 1'000'000; // in gas + return cfg; + }), + features); + // Run past the flag ledger so that a Fee change vote occurs and + // updates FeeSettings. (It also activates all supported + // amendments.) + for (auto i = env.current()->seq(); i <= 257; ++i) + env.close(); + + // create escrow + env.fund(XRP(5000), alice, carol); + auto const seq = env.seq(alice); + BEAST_EXPECT(env.ownerCount(alice) == 0); + env(escrowCreate, + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); + env.close(); + + if (BEAST_EXPECT(env.ownerCount(alice) == 2)) + { + env.require(balance(alice, XRP(4000) - createFee)); + env.require(balance(carol, XRP(5000))); + env.close(); + + auto const bigAllowance = 996'433; + uint64_t partialFeeCalc = + (static_cast(bigAllowance) * 1'000'000) / + MICRO_DROPS_PER_DROP + + 1; // to avoid an overflow + auto finishFee = env.current()->fees().base + partialFeeCalc; + BEAST_EXPECT(finishFee.drops() > bigAllowance); + + // Intentional low value to test overflow handling + auto finishFeeOverflow = drops(30); + + env(escrow::finish(alice, alice, seq), + fee(finishFeeOverflow), // enough if there's an overflow + escrow::comp_allowance(bigAllowance), + ter(telINSUF_FEE_P)); + + env(escrow::finish(alice, alice, seq), + fee(finishFee - 1), + escrow::comp_allowance(bigAllowance), + ter(telINSUF_FEE_P)); + + env(escrow::finish(alice, alice, seq), + fee(finishFee), + escrow::comp_allowance(bigAllowance), + ter(tesSUCCESS)); + + auto const txMeta = env.meta(); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); + if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) + BEAST_EXPECTS( + txMeta->getFieldI32(sfWasmReturnCode) == 260, + std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); + + BEAST_EXPECT(env.ownerCount(alice) == 0); + } + } + } + void testAllHostFunctions(FeatureBitset features) { @@ -894,6 +989,7 @@ struct EscrowSmart_test : public beast::unit_test::suite testFinishWasmFailures(features); testFinishFunction(features); testUpdateDataOnFailure(features); + testFees(features); // TODO: Update module with new host functions testAllHostFunctions(features); diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 2fd44b33cb8..4add0504e52 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -734,13 +734,15 @@ EscrowFinish::calculateBaseFee(ReadView const& view, STTx const& tx) { extraFee += view.fees().base * (32 + (fb->size() / 16)); } - if (auto const allowance = tx[~sfComputationAllowance]; allowance) + if (std::optional const allowance = tx[~sfComputationAllowance]; + allowance) { // The extra fee is the allowance in drops, rounded up to the nearest // whole drop. // Integer math rounds down by default, so we add 1 to round up. - extraFee += + uint64_t const allowanceFee = ((*allowance) * view.fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; + extraFee += allowanceFee; } return Transactor::calculateBaseFee(view, tx) + extraFee; } From b9eb66eecc020f4ba3a88b41e584cfba13806b56 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 17 Dec 2025 14:19:34 -0800 Subject: [PATCH 127/212] fix parameter index desynchronization (#6148) --- src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 15 + src/test/app/wasm_fixtures/fixtures.cpp | 409 +++++++++--------- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 4 +- 4 files changed, 223 insertions(+), 207 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b7ad172f2f6..0a8cacca427 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -672,7 +672,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 153'534; + auto const allowance = 154'545; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index a5624b1df01..4cbc7e17070 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -1528,5 +1528,20 @@ pub extern "C" fn finish() -> i32 { ) }); + // ensure that the Slice index desync issue is fixed + let empty: &[u8] = b""; + check_result( + unsafe { + host::trace_account( + empty.as_ptr(), + empty.len(), + account.0.as_ptr(), + account.0.len(), + ) + }, + 34, + "trace_account_check_desync", + ); + 1 // <-- If we get here, finish the escrow. } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 160a4549fa0..54584364f19 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -661,250 +661,251 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020a892702460002402000200147" + "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020a9e2702460002402000200147" "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" - "0220032000ac10011a0f0b418b80c000410b2000ac1001000bbf26020a7f017e230041f001" + "0220032000ac10011a0f0b418b80c000410b2000ac1001000bd426020a7f017e230041f001" "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" - "0341b2920441c780c0004116103c200041f0006a22054200370300200041e8006a22064200" + "0341b2920441c780c0004116103c200041f0006a22044200370300200041e8006a22064200" "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" - "41be8cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" + "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" - "200028005b360027200020002903c80137002b200542003703002006420037030020034200" - "37030020004200370358200041246a2205411420014120100822024120470d002000413a6a" + "200028005b360027200020002903c80137002b200442003703002006420037030020034200" + "37030020004200370358200041246a2204411420014120100822024120470d002000413a6a" "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" - "03584181802020014114100a411441d48cc000411c103c2006410036020020034200370300" - "2000420037035841014181802020014114100b411441f08cc0004114103c20004104360298" + "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" + "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" - "0120014104200041c8016a22064114100c411441848dc0004113103c200341003602002002" - "4200370300200042003703c801200120002802980120064114100d411441978dc000412310" + "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" + "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" - "100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" + "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" - "0120002802980110144120419e82c000411f103c200541141015411441bd82c000410b103c" - "200041e0016a220442003703002003420037030020024200370300200042003703c8012001" - "200028029801200641201016412041d58dc0004113103c41c882c000410c41d482c000410b" + "0120002802980110144120419e82c000411f103c200441141015411441bd82c000410b103c" + "200041e0016a220542003703002003420037030020024200370300200042003703c8012001" + "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" - "0341003b010020024200370300200042003703c80120054114200041a0016a220741202006" - "41121018411241e88dc0004107103c2003410036020020024200370300200042003703c801" - "20074120200641141019411441ef8dc000410e103c200041003602c8012007412020064104" - "101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120101c41" - "0a418383c0004114103c200041003602c8012007412020064104101d4104418a8ec000410e" - "103c419783c000410d20054114101e412f41a483c000410d103c419783c000410d41b183c0" + "0341003b010020024200370300200042003703c80120044114200041a0016a220741202006" + "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" + "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" + "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" + "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" + "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" "004108101f411341b983c000410c103c419783c000410d41c583c0004108101f411241cd83" "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" - "417141988ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" - "7d41b68ec0004124103c200041003602c8012006418094ebdc031004417341da8ec0004123" - "103c419783c000410d20054114101e412f41a483c000410d103c419783c000410d41b183c0" - "004108101f411341b983c000410c103c200442003703002003420037030020024200370300" - "200042003703c801200041d894ebdc036a220741082006412041001020417341fd8ec00041" - "17103c200442003703002003420037030020024200370300200042003703c8012001200028" - "0298012006412041001020417141948fc0004119103c4102100f416f41fc83c000411f103c" + "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" + "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" + "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" + "004108101f411341b983c000410c103c200542003703002003420037030020024200370300" + "200042003703c801200041d894ebdc036a220741082006412041001020417341978fc00041" + "17103c200542003703002003420037030020024200370300200042003703c8012001200028" + "0298012006412041001020417141ae8fc0004119103c4102100f416f41fc83c000411f103c" "417f20002802980110124171419b84c000411f103c2001417f1012417141ba84c000411f10" "3c20014181201012417441d984c0004120103c20072000280298011012417341f984c00041" "1f103c2007200028029801410110094173419885c0004118103c2001200028029801410110" - "09417141b085c000411a103c20044200370300200342003703002002420037030020004200" - "3703c8012007200028029801200641201008417341ad8fc0004116103c2004420037030020" + "09417141b085c000411a103c20054200370300200342003703002002420037030020004200" + "3703c8012007200028029801200641201008417341c78fc0004116103c2005420037030020" "03420037030020024200370300200042003703c80120012000280298012006412010084171" - "41c38fc0004118103c200442003703002003420037030020024200370300200042003703c8" - "0120054114200541142007200028029801200641201021417341db8fc000411c103c200442" - "003703002003420037030020024200370300200042003703c8012005411420054114200120" - "0028029801200641201021417141f78fc000411e103c200442003703002003420037030020" - "024200370300200042003703c80141fb9dc000411420072000280298012006412010224173" - "419590c0004119103c200442003703002003420037030020024200370300200042003703c8" - "0141fb9dc00041142001200028029801200641201022417141ae90c000411f103c20044200" - "3703002003420037030020024200370300200042003703c80141fb9dc000411441ca85c000" - "4114200641201022417141cd90c0004129103c200442003703002003420037030020024200" - "370300200042003703c80141de85c000412841fb9dc0004114200641201022417141f690c0" + "41dd8fc0004118103c200542003703002003420037030020024200370300200042003703c8" + "0120044114200441142007200028029801200641201021417341f58fc000411c103c200542" + "003703002003420037030020024200370300200042003703c8012004411420044114200120" + "00280298012006412010214171419190c000411e103c200542003703002003420037030020" + "024200370300200042003703c80141959ec000411420072000280298012006412010224173" + "41af90c0004119103c200542003703002003420037030020024200370300200042003703c8" + "0141959ec00041142001200028029801200641201022417141c890c000411f103c20054200" + "3703002003420037030020024200370300200042003703c80141959ec000411441ca85c000" + "4114200641201022417141e790c0004129103c200542003703002003420037030020024200" + "370300200042003703c80141de85c000412841959ec00041142006412010224171419091c0" "004125103c200041dc016a200041346a280100360200200041d4016a2000412c6a29010037" "0200200020002901243702cc01200041808080083602c801200041003b01c0012006411841" - "fb9dc0004114200041c0016a2203410210224171419b91c000410e103c2007200028029801" - "422a10014173418686c0004111103c200041003b01c0014102200341021007416f41a991c0" - "00411b103c200041003b01c001410220034102100a416f41c491c000412b103c200041003b" - "01c0014101410220034102100b416f41ef91c0004123103c4102100f416f41fc83c000411f" + "959ec0004114200041c0016a220341021022417141b591c000410e103c2007200028029801" + "422a10014173418686c0004111103c200041003b01c0014102200341021007416f41c391c0" + "00411b103c200041003b01c001410220034102100a416f41de91c000412b103c200041003b" + "01c0014101410220034102100b416f418992c0004123103c4102100f416f41fc83c000411f" "103c41021010416f419786c000412f103c410141021011416f41c686c0004127103c41e980" "c0004181201006417441ed86c000411f103c41e980c00041c10010064174418c87c000411a" - "103c200041003b01c001200141812020034102100c4174419292c0004121103c200041003b" - "01c001200141812020034102100d417441b392c0004131103c200041003b01c00141012001" - "41812020034102100e417441e492c0004129103c20014181201012417441a687c000412510" + "103c200041003b01c001200141812020034102100c417441ac92c0004121103c200041003b" + "01c001200141812020034102100d417441cd92c0004131103c200041003b01c00141012001" + "41812020034102100e417441fe92c0004129103c20014181201012417441a687c000412510" "3c20014181201013417441cb87c0004135103c4101200141812010144174418088c000412d" "103c20014181201015417441ad88c0004119103c419783c00041812041d482c000410b41df" "82c000410e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c0" "00410e1017417441ed82c0004109103c419783c000410d41d482c000410b41df82c0004181" - "201017417441ed82c0004109103c200041003b01c00120014181202003410210164174418d" - "93c0004121103c200041003b01c00141fb9dc00041812041fb9dc000411420034102102241" - "7441ae93c0004118103c200041003b01c00120054114200541142001418120200341021023" - "417441c693c000411f103c200041003b01c001200641812020054114200341021024417441" - "e593c0004122103c419783c000410d200720002802980141001000417341c688c000410f10" - "3c200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22044108" + "201017417441ed82c0004109103c200041003b01c0012001418120200341021016417441a7" + "93c0004121103c200041003b01c00141959ec00041812041959ec000411420034102102241" + "7441c893c0004118103c200041003b01c00120044114200441142001418120200341021023" + "417441e093c000411f103c200041003b01c001200641812020044114200341021024417441" + "ff93c0004122103c419783c000410d200720002802980141001000417341c688c000410f10" + "3c200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22054108" "1025417341d588c000411c103c419783c000410d2007200028029801101f417341f188c000" - "4116103c200441082003410810264173418789c0004118103c200341082004410810264173" - "419f89c0004118103c200041003b01ec012004410820034108200041ec016a220241024100" - "10274173418794c0004114103c200041003b01ec0120034108200441082002410241001027" - "4173419b94c0004114103c200041003b01ec01200441082003410820024102410010284173" - "41af94c0004119103c200041003b01ec0120034108200441082002410241001028417341c8" - "94c0004119103c200041003b01ec0120044108200341082002410241001029417341e194c0" - "004119103c200041003b01ec0120034108200441082002410241001029417341fa94c00041" - "19103c200041003b01ec012004410820034108200241024100102a4173419395c000411710" - "3c200041003b01ec012003410820044108200241024100102a417341aa95c0004117103c20" - "0041003b01ec01200441084103200241024100102b417341c195c0004114103c200041003b" - "01ec01200441084103200241024100102c417341d595c0004113103c200041003b01ec0120" - "044108200241024100102d417341e895c0004113103c200120002802980141001009417141" - "b789c0004123103c200041003b01ec01200541142001200028029801200241021018417141" - "fb95c000411a103c200041003b01ec0120012000280298012002410210194171419596c000" - "4121103c200041003b01ec01200120002802980120024102101a417141b696c0004120103c" + "4116103c200541082003410810264173418789c0004118103c200341082005410810264173" + "419f89c0004118103c200041003b01ec012005410820034108200041ec016a220241024100" + "1027417341a194c0004114103c200041003b01ec0120034108200541082002410241001027" + "417341b594c0004114103c200041003b01ec01200541082003410820024102410010284173" + "41c994c0004119103c200041003b01ec0120034108200541082002410241001028417341e2" + "94c0004119103c200041003b01ec0120054108200341082002410241001029417341fb94c0" + "004119103c200041003b01ec01200341082005410820024102410010294173419495c00041" + "19103c200041003b01ec012005410820034108200241024100102a417341ad95c000411710" + "3c200041003b01ec012003410820054108200241024100102a417341c495c0004117103c20" + "0041003b01ec01200541084103200241024100102b417341db95c0004114103c200041003b" + "01ec01200541084103200241024100102c417341ef95c0004113103c200041003b01ec0120" + "054108200241024100102d4173418296c0004113103c200120002802980141001009417141" + "b789c0004123103c200041003b01ec01200441142001200028029801200241021018417141" + "9596c000411a103c200041003b01ec012001200028029801200241021019417141af96c000" + "4121103c200041003b01ec01200120002802980120024102101a417141d096c0004120103c" "2001200028029801101b417141da89c0004120103c2001200028029801101c417141fa89c0" - "004127103c200041003602ec01200120002802980120024104101d417141d696c000412110" - "3c200041003b01ec012001200028029801200241021008417141f796c0004123103c200041" - "003b01ec012001200028029801410120024102102e4171419a97c0004121103c200041003b" - "01ec01200120002802980122042005411420012004200241021023417141bb97c000412710" - "3c200041003b01ec01200541142001200028029801220420012004200241021023417141e2" - "97c0004127103c200041003b01ec0120012000280298012005411420024102102f41714189" - "98c0004125103c200041003b01ec0120054114200120002802980120024102102f417141ae" - "98c0004125103c200041003b01ec01200120002802980120054114200241021030417141d3" - "98c000412c103c200041003b01ec01200541142001200028029801200241021030417141ff" - "98c000412c103c200041003b01ec012001200028029801200241021031417141ab99c00041" - "1f103c200041003b01ec0120012000280298014101200241021032417141ca99c000412210" - "3c200041003b01ec0120012000280298012005411441ca85c0004114200241021021417141" - "ec99c0004121103c200041003b01ec0120054114200120002802980141ca85c00041142002" - "410210214171418d9ac0004121103c200041003b01ec012001200028029801410120024102" - "1033417141ae9ac0004128103c200041003b01ec0120064118200120002802980120024102" - "1024417141d69ac0004123103c200041003b01ec0120012000280298014101200241021034" - "417141f99ac0004125103c200041003b01ec01200120002802980141012002410210354171" - "419e9bc0004121103c200041003b01ec0120012000280298014101200241021036417141bf" - "9bc0004122103c200041003b01ec0120012000280298012005411441012002410210374171" - "41e19bc0004124103c200041003b01ec012005411420012000280298014101200241021037" - "417141859cc0004124103c200041003b01ec01200120002802980141012002410210384171" - "41a99cc000412f103c200041003b01ec012001200028029801200241021039417141d89cc0" - "004123103c200041003b01ec012001200028029801410120024102103a417141fb9cc00041" - "22103c200041003b01ec012001200028029801410120024102103b4171419d9dc000412110" - "3c200041003b01ec01200120002802980141a18ac0004120200241021018417141be9dc000" + "004127103c200041003602ec01200120002802980120024104101d417141f096c000412110" + "3c200041003b01ec0120012000280298012002410210084171419197c0004123103c200041" + "003b01ec012001200028029801410120024102102e417141b497c0004121103c200041003b" + "01ec01200120002802980122052004411420012005200241021023417141d597c000412710" + "3c200041003b01ec01200441142001200028029801220520012005200241021023417141fc" + "97c0004127103c200041003b01ec0120012000280298012004411420024102102f417141a3" + "98c0004125103c200041003b01ec0120044114200120002802980120024102102f417141c8" + "98c0004125103c200041003b01ec01200120002802980120044114200241021030417141ed" + "98c000412c103c200041003b01ec0120044114200120002802980120024102103041714199" + "99c000412c103c200041003b01ec012001200028029801200241021031417141c599c00041" + "1f103c200041003b01ec0120012000280298014101200241021032417141e499c000412210" + "3c200041003b01ec0120012000280298012004411441ca85c0004114200241021021417141" + "869ac0004121103c200041003b01ec0120044114200120002802980141ca85c00041142002" + "41021021417141a79ac0004121103c200041003b01ec012001200028029801410120024102" + "1033417141c89ac0004128103c200041003b01ec0120064118200120002802980120024102" + "1024417141f09ac0004123103c200041003b01ec0120012000280298014101200241021034" + "417141939bc0004125103c200041003b01ec01200120002802980141012002410210354171" + "41b89bc0004121103c200041003b01ec0120012000280298014101200241021036417141d9" + "9bc0004122103c200041003b01ec0120012000280298012004411441012002410210374171" + "41fb9bc0004124103c200041003b01ec012004411420012000280298014101200241021037" + "4171419f9cc0004124103c200041003b01ec01200120002802980141012002410210384171" + "41c39cc000412f103c200041003b01ec012001200028029801200241021039417141f29cc0" + "004123103c200041003b01ec012001200028029801410120024102103a417141959dc00041" + "22103c200041003b01ec012001200028029801410120024102103b417141b79dc000412110" + "3c200041003b01ec01200120002802980141a18ac0004120200241021018417141d89dc000" "411c103c419783c000410d2001200028029801101e417141c18ac0004122103c419797abdd" "03410d41a18ac000412041001000417341e38ac0004110103c419797abdd03410d20034108" - "1025417341f38ac000411d103c419797abdd03410d20054114101e417341908bc000411810" + "1025417341f38ac000411d103c419797abdd03410d20044114101e417341908bc000411810" "3c419797abdd03410d41b183c0004108101f417341a88bc0004117103c2001200028029801" "200141812041001000417441bf8bc000410e103c200141812042011001417441cd8bc00041" "12103c419783c000418120200341081025417441df8bc000411b103c419783c00041812020" - "054114101e417441fa8bc0004116103c419783c00041812041b183c0004108101f41744190" + "044114101e417441fa8bc0004116103c419783c00041812041b183c0004108101f41744190" "8cc0004115103c419783c000410d2001200028029801101f417141a58cc0004119103c2000" - "41003b01ec01200120002802980120054114200241021024417141da9dc0004121103c2000" - "41f0016a240041010f0b0b418080c000410b417f20022002417f4e1bac1001000b0be61d02" - "00418080c0000bde056572726f725f636f64653d54455354204641494c4544242424242420" - "5354415254494e47205741534d20455845435554494f4e2024242424246765745f6c656467" - "65725f73716e6765745f706172656e745f6c65646765725f74696d656765745f626173655f" - "666565746573745f616d656e646d656e74616d656e646d656e745f656e61626c6564636163" - "68655f6c65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272" - "656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f62" - "6a5f61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e676574" - "5f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e67" - "65745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e7570646174655f" - "6461746174657374206d65737361676574657374207075626b657974657374207369676e61" - "74757265636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f747261" - "6e736665725f66656574657374696e6720747261636574726163655f6163636f756e744000" - "00000000005f74726163655f616d6f756e74400000000000000074726163655f616d6f756e" - "745f7a65726f6765745f706172656e745f6c65646765725f686173685f6e65675f70747267" - "65745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f" - "6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e6573746564" - "5f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f6172726179" - "5f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" - "7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f" - "6c65646765725f6f626a5f77726f6e675f6c656e5553443030303030303030303030303030" - "30303000418686c0000bf51774726163655f6e756d5f6f6f625f7374726765745f63757272" - "656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f73666965" - "6c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f7366" - "69656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d" - "656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c" - "6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f" - "6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c69636574" - "726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f" - "736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d70" - "6172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c696365" - "3263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e7432353667" - "65745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e66" - "745f7472616e736665725f6665655f77726f6e675f73697a655f75696e7432353630303030" - "3030303030303030303030303030303030303030303030303030303174726163655f616363" - "6f756e745f77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f7374" - "72696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e6774726163" - "655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f" - "737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e" - "6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f616363" - "6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e67747261" - "63655f616d6f756e745f77726f6e675f6c656e6774686765745f706172656e745f6c656467" - "65725f686173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765" - "745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c64" - "6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765" - "745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f73686135" - "31325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f74" - "61786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f68" - "6173685f6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f627566" - "5f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f" - "746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f" - "66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e" - "5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c" - "65745f6c656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f" - "6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432" - "616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65" - "796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d" - "6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d" - "6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f73666965" - "6c646765745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69" - "645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f" - "736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c69" - "63656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64" - "5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f66" - "69656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c66" - "5f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f736c6963" - "6563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b" - "656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164" - "645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c6f6174" - "5f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f" - "625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61" - "745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f62" - "5f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f72" - "6f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f6174" - "5f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75696e74" - "3235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e7432353667" - "65745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66" - "745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964326465706f7369745f70726561" - "7574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f73" - "69745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e7469" - "64326469645f6b65796c65745f77726f6e675f73697a655f6163636f756e74696465736372" - "6f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e" - "675f73697a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f616363" - "6f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e67" - "7468004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365" - "737365642d6279010572757374631d312e38352e3120283465623136313235302032303235" - "2d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d657874"; + "41003b01ec01200120002802980120044114200241021024417141f49dc0004121103c4101" + "410020044114101e412241be8cc000411a103c200041f0016a240041010f0b0b418080c000" + "410b417f20022002417f4e1bac1001000b0b801e0200418080c0000bde056572726f725f63" + "6f64653d54455354204641494c45442424242424205354415254494e47205741534d204558" + "45435554494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e74" + "5f6c65646765725f74696d656765745f626173655f666565746573745f616d656e646d656e" + "74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a676574" + "5f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74" + "785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f" + "6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65" + "737465645f61727261795f6c656e7570646174655f6461746174657374206d657373616765" + "74657374207075626b657974657374207369676e6174757265636865636b5f736967676574" + "5f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67" + "20747261636574726163655f6163636f756e74400000000000005f74726163655f616d6f75" + "6e74400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e74" + "5f6c65646765725f686173685f6e65675f7074726765745f74785f61727261795f6c656e5f" + "696e76616c69645f736669656c646765745f74785f6e65737465645f61727261795f6c656e" + "5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c" + "656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e67676574" + "5f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c6564" + "6765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e67" + "5f6c656e555344303030303030303030303030303030303000418686c0000b8f1874726163" + "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" + "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" + "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" + "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" + "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" + "6163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f616d6f756e" + "745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c" + "6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f62" + "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" + "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" + "726f6e675f73697a655f75696e743235363030303030303030303030303030303030303030" + "30303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f" + "6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f7061717565" + "5f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f6f625f7374" + "72696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f746f6f5f" + "6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f666c" + "6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f6e67747261" + "63655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f" + "6c656e67746874726163655f6163636f756e745f636865636b5f646573796e636765745f70" + "6172656e745f6c65646765725f686173686765745f63757272656e745f6c65646765725f6f" + "626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65" + "737465645f6669656c646765745f63757272656e745f6c65646765725f6f626a5f6e657374" + "65645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f" + "6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565" + "726765745f6e66745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e" + "745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765" + "725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c6564676572" + "5f686173685f6c656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e" + "5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f" + "6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c65" + "6e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b6579" + "6c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f" + "6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f6173" + "73657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272" + "656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272" + "656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e" + "76616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669" + "656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c" + "645f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f74" + "6f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65" + "737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f73" + "68613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f" + "6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f" + "736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d7074" + "6964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f73" + "6c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73" + "756274726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f" + "736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f" + "6469766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69" + "636532666c6f61745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f" + "736c696365666c6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e67" + "5f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a" + "655f75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e" + "743235366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e74323536" + "6163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646368" + "65636b5f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463726564656e" + "7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643163726564" + "656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" + "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465" + "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" + "706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e746964316465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f616363" + "6f756e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469646c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c" + "696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69" + "737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70" + "746f6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f" + "6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665" + "725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469647061796368616e5f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f" + "646f6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964736967" + "6e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65" + "745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e" + "675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f" + "77726f6e675f6c656e677468004d0970726f64756365727302086c616e6775616765010452" + "757374000c70726f6365737365642d6279010572757374631d312e38352e31202834656231" + "363132353020323032352d30332d313529002c0f7461726765745f6665617475726573022b" + "0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 90369e3a8d9..5dc935735cb 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -80,11 +80,11 @@ getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) { auto const& m = SField::getKnownCodeToField(); auto const it = m.find(params->data[i].of.i32); + i++; if (it == m.end()) { return Unexpected(HostFunctionError::INVALID_FIELD); } - i++; return *it->second; } @@ -98,6 +98,7 @@ getDataSlice( { int64_t const ptr = params->data[i].of.i32; int64_t const size = params->data[i + 1].of.i32; + i += 2; if (ptr < 0 || size < 0) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -117,7 +118,6 @@ getDataSlice( return Unexpected(HostFunctionError::POINTER_OUT_OF_BOUNDS); Slice data(memory.p + ptr, size); - i += 2; return data; } From 69ab39d6585b8cd2ffb2618ece3e4867bb59b9e6 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:13:48 -0500 Subject: [PATCH 128/212] Fix potential memory leaks found by srlabs (#6145) --- src/xrpld/app/wasm/WasmiVM.h | 140 +++++++++----- src/xrpld/app/wasm/detail/WasmiVM.cpp | 259 ++++++++++++-------------- 2 files changed, 210 insertions(+), 189 deletions(-) diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index a9b8a94332c..b4148b7dea5 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -7,42 +7,93 @@ namespace ripple { -struct WasmiResult +template +struct WasmVec { - wasm_val_vec_t r; - bool f; // failure flag + T vec_; - WasmiResult(unsigned N = 0) : r{0, nullptr}, f(false) + WasmVec(size_t s = 0) : vec_ WASM_EMPTY_VEC { - if (N) - wasm_val_vec_new_uninitialized(&r, N); + if (s > 0) + Create(&vec_, s); // zeroes memory } - ~WasmiResult() + ~WasmVec() { - if (r.size) - wasm_val_vec_delete(&r); + clear(); } - WasmiResult(WasmiResult const&) = delete; - WasmiResult& - operator=(WasmiResult const&) = delete; + WasmVec(WasmVec const&) = delete; + WasmVec& + operator=(WasmVec const&) = delete; - WasmiResult(WasmiResult&& o) + WasmVec(WasmVec&& other) noexcept : vec_ WASM_EMPTY_VEC { - *this = std::move(o); + *this = std::move(other); } - WasmiResult& - operator=(WasmiResult&& o) + WasmVec& + operator=(WasmVec&& other) noexcept { - r = o.r; - o.r = {0, nullptr}; - f = o.f; - o.f = false; + if (this != &other) + { + clear(); + vec_ = other.vec_; + other.vec_ = WASM_EMPTY_VEC; + } return *this; } - // operator wasm_val_vec_t &() {return r;} + + void + clear() + { + Destroy(&vec_); // call destructor for every elements too + vec_ = WASM_EMPTY_VEC; + } + + T + release() + { + T result = vec_; + vec_ = WASM_EMPTY_VEC; + return result; + } +}; + +using WasmValtypeVec = WasmVec< + wasm_valtype_vec_t, + &wasm_valtype_vec_new_uninitialized, + &wasm_valtype_vec_delete>; +using WasmValVec = WasmVec< + wasm_val_vec_t, + &wasm_val_vec_new_uninitialized, + &wasm_val_vec_delete>; +using WasmExternVec = WasmVec< + wasm_extern_vec_t, + &wasm_extern_vec_new_uninitialized, + &wasm_extern_vec_delete>; +using WasmExporttypeVec = WasmVec< + wasm_exporttype_vec_t, + &wasm_exporttype_vec_new_uninitialized, + &wasm_exporttype_vec_delete>; +using WasmImporttypeVec = WasmVec< + wasm_importtype_vec_t, + &wasm_importtype_vec_new_uninitialized, + &wasm_importtype_vec_delete>; + +struct WasmiResult +{ + WasmValVec r; + bool f; // failure flag + + WasmiResult(unsigned N = 0) : r(N), f(false) + { + } + + ~WasmiResult() = default; + WasmiResult(WasmiResult&& o) = default; + WasmiResult& + operator=(WasmiResult&& o) = default; }; using ModulePtr = std::unique_ptr; @@ -56,17 +107,17 @@ using FuncInfo = std::pair; struct InstanceWrapper { wasm_store_t* store_ = nullptr; - wasm_extern_vec_t exports_; + WasmExternVec exports_; InstancePtr instance_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static InstancePtr init( - wasm_store_t* s, - wasm_module_t* m, - wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports, + StorePtr& s, + ModulePtr& m, + WasmExternVec& expt, + WasmExternVec const& imports, beast::Journal j); public: @@ -78,19 +129,18 @@ struct InstanceWrapper operator=(InstanceWrapper&& o); InstanceWrapper( - wasm_store_t* s, - wasm_module_t* m, - wasm_extern_vec_t const& imports, + StorePtr& s, + ModulePtr& m, + WasmExternVec const& imports, beast::Journal j); - ~InstanceWrapper(); + ~InstanceWrapper() = default; operator bool() const; FuncInfo - getFunc( - std::string_view funcName, - wasm_exporttype_vec_t const& export_types) const; + getFunc(std::string_view funcName, WasmExporttypeVec const& exportTypes) + const; wmem getMem() const; @@ -105,12 +155,12 @@ struct ModuleWrapper { ModulePtr module_; InstanceWrapper instanceWrap_; - wasm_exporttype_vec_t exportTypes_; + WasmExporttypeVec exportTypes_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); private: static ModulePtr - init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j); + init(StorePtr& s, Bytes const& wasmBin, beast::Journal j); public: ModuleWrapper(); @@ -118,12 +168,12 @@ struct ModuleWrapper ModuleWrapper& operator=(ModuleWrapper&& o); ModuleWrapper( - wasm_store_t* s, + StorePtr& s, Bytes const& wasmBin, bool instantiate, ImportVec const& imports, beast::Journal j); - ~ModuleWrapper(); + ~ModuleWrapper() = default; operator bool() const; @@ -136,20 +186,14 @@ struct ModuleWrapper getInstance(int i = 0) const; int - addInstance( - wasm_store_t* s, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + addInstance(StorePtr& s, WasmExternVec const& imports); std::int64_t getGas(); private: - static void - makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp); - static void - makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp); - wasm_extern_vec_t - buildImports(wasm_store_t* s, ImportVec const& imports); + WasmExternVec + buildImports(StorePtr& s, ImportVec const& imports); }; class WasmiEngine @@ -237,9 +281,7 @@ class WasmiEngine runFunc(std::string_view const funcName, int32_t p); int32_t - makeModule( - Bytes const& wasmCode, - wasm_extern_vec_t const& imports = WASM_EMPTY_VEC); + makeModule(Bytes const& wasmCode, WasmExternVec const& imports = {}); FuncInfo getFunc(std::string_view funcName); diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 6e79827060f..1a379101057 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -51,56 +51,47 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) InstancePtr InstanceWrapper::init( - wasm_store_t* s, - wasm_module_t* m, - wasm_extern_vec_t* expt, - wasm_extern_vec_t const& imports, + StorePtr& s, + ModulePtr& m, + WasmExternVec& expt, + WasmExternVec const& imports, beast::Journal j) { wasm_trap_t* trap = nullptr; InstancePtr mi = InstancePtr( - wasm_instance_new(s, m, &imports, &trap), &wasm_instance_delete); + wasm_instance_new(s.get(), m.get(), &imports.vec_, &trap), + &wasm_instance_delete); if (!mi || trap) { print_wasm_error("can't create instance", trap, j); throw std::runtime_error("can't create instance"); } - wasm_instance_exports(mi.get(), expt); + wasm_instance_exports(mi.get(), &expt.vec_); return mi; } -InstanceWrapper::InstanceWrapper() - : exports_{0, nullptr}, instance_(nullptr, &wasm_instance_delete) +InstanceWrapper::InstanceWrapper() : instance_(nullptr, &wasm_instance_delete) { } // LCOV_EXCL_START InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) - : exports_{0, nullptr}, instance_(nullptr, &wasm_instance_delete) + : instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } // LCOV_EXCL_STOP InstanceWrapper::InstanceWrapper( - wasm_store_t* s, - wasm_module_t* m, - wasm_extern_vec_t const& imports, + StorePtr& s, + ModulePtr& m, + WasmExternVec const& imports, beast::Journal j) - : store_(s) - , exports_ WASM_EMPTY_VEC - , instance_(init(s, m, &exports_, imports, j)) - , j_(j) + : store_(s.get()), instance_(init(s, m, exports_, imports, j)), j_(j) { } -InstanceWrapper::~InstanceWrapper() -{ - if (exports_.size) - wasm_extern_vec_delete(&exports_); -} - InstanceWrapper& InstanceWrapper::operator=(InstanceWrapper&& o) { @@ -109,11 +100,7 @@ InstanceWrapper::operator=(InstanceWrapper&& o) store_ = o.store_; o.store_ = nullptr; - if (exports_.size) - wasm_extern_vec_delete(&exports_); // LCOV_EXCL_LINE - exports_ = o.exports_; - o.exports_ = {0, nullptr}; - + exports_ = std::move(o.exports_); instance_ = std::move(o.instance_); j_ = o.j_; @@ -129,39 +116,37 @@ InstanceWrapper::operator bool() const FuncInfo InstanceWrapper::getFunc( std::string_view funcName, - wasm_exporttype_vec_t const& export_types) const + WasmExporttypeVec const& exportTypes) const { - wasm_func_t* f = nullptr; - wasm_functype_t* ft = nullptr; + wasm_func_t const* f = nullptr; + wasm_functype_t const* ft = nullptr; if (!instance_) throw std::runtime_error("no instance"); // LCOV_EXCL_LINE - if (!export_types.size) + if (!exportTypes.vec_.size) throw std::runtime_error("no export"); // LCOV_EXCL_LINE - if (export_types.size != exports_.size) + if (exportTypes.vec_.size != exports_.vec_.size) throw std::runtime_error("invalid export"); // LCOV_EXCL_LINE - for (unsigned i = 0; i < export_types.size; ++i) + for (unsigned i = 0; i < exportTypes.vec_.size; ++i) { - auto const* exp_type(export_types.data[i]); + auto const* expType(exportTypes.vec_.data[i]); - wasm_name_t const* name = wasm_exporttype_name(exp_type); - wasm_externtype_t const* exn_type = wasm_exporttype_type(exp_type); - if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC) + wasm_name_t const* name = wasm_exporttype_name(expType); + wasm_externtype_t const* exnType = wasm_exporttype_type(expType); + if (wasm_externtype_kind(exnType) == WASM_EXTERN_FUNC) { - if (funcName == std::string_view(name->data, name->size)) - { - auto* exn(exports_.data[i]); - if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) - throw std::runtime_error( - "invalid export"); // LCOV_EXCL_LINE - - ft = wasm_externtype_as_functype( - const_cast(exn_type)); - f = wasm_extern_as_func(exn); - break; - } + if (funcName != std::string_view(name->data, name->size)) + continue; + + auto const* exn(exports_.vec_.data[i]); + if (wasm_extern_kind(exn) != WASM_EXTERN_FUNC) + throw std::runtime_error("invalid export"); // LCOV_EXCL_LINE + + ft = wasm_externtype_as_functype_const(exnType); + f = wasm_extern_as_func_const(exn); + break; } } @@ -179,9 +164,9 @@ InstanceWrapper::getMem() const throw std::runtime_error("no instance"); // LCOV_EXCL_LINE wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports_.size; ++i) + for (unsigned i = 0; i < exports_.vec_.size; ++i) { - auto* e(exports_.data[i]); + auto* e(exports_.vec_.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) { mem = wasm_extern_as_memory(e); @@ -219,9 +204,11 @@ InstanceWrapper::setGas(std::int64_t gas) const wasm_store_set_fuel(store_, static_cast(gas)); if (err) { - print_wasm_error( - "Can't set instance gas", nullptr, j_); // LCOV_EXCL_LINE - throw std::runtime_error("Can't set instance gas"); // LCOV_EXCL_LINE + // LCOV_EXCL_START + print_wasm_error("Can't set instance gas", nullptr, j_); + wasmi_error_delete(err); + throw std::runtime_error("Can't set instance gas"); + // LCOV_EXCL_STOP } return gas; @@ -230,10 +217,11 @@ InstanceWrapper::setGas(std::int64_t gas) const ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ModulePtr -ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) +ModuleWrapper::init(StorePtr& s, Bytes const& wasmBin, beast::Journal j) { wasm_byte_vec_t const code{wasmBin.size(), (char*)(wasmBin.data())}; - ModulePtr m = ModulePtr(wasm_module_new(s, &code), &wasm_module_delete); + ModulePtr m = + ModulePtr(wasm_module_new(s.get(), &code), &wasm_module_delete); if (!m) throw std::runtime_error("can't create module"); @@ -241,41 +229,33 @@ ModuleWrapper::init(wasm_store_t* s, Bytes const& wasmBin, beast::Journal j) } // LCOV_EXCL_START -ModuleWrapper::ModuleWrapper() - : module_(nullptr, &wasm_module_delete), exportTypes_{0, nullptr} +ModuleWrapper::ModuleWrapper() : module_(nullptr, &wasm_module_delete) { } ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) - : module_(nullptr, &wasm_module_delete), exportTypes_{0, nullptr} + : module_(nullptr, &wasm_module_delete) { *this = std::move(o); } // LCOV_EXCL_STOP ModuleWrapper::ModuleWrapper( - wasm_store_t* s, + StorePtr& s, Bytes const& wasmBin, bool instantiate, ImportVec const& imports, beast::Journal j) - : module_(init(s, wasmBin, j)), exportTypes_{0, nullptr}, j_(j) + : module_(init(s, wasmBin, j)), j_(j) { - wasm_module_exports(module_.get(), &exportTypes_); + wasm_module_exports(module_.get(), &exportTypes_.vec_); if (instantiate) { auto wimports = buildImports(s, imports); addInstance(s, wimports); - wasm_extern_vec_delete(&wimports); } } -ModuleWrapper::~ModuleWrapper() -{ - if (exportTypes_.size) - wasm_exporttype_vec_delete(&exportTypes_); -} - // LCOV_EXCL_START ModuleWrapper& ModuleWrapper::operator=(ModuleWrapper&& o) @@ -285,10 +265,7 @@ ModuleWrapper::operator=(ModuleWrapper&& o) module_ = std::move(o.module_); instanceWrap_ = std::move(o.instanceWrap_); - if (exportTypes_.size) - wasm_exporttype_vec_delete(&exportTypes_); - exportTypes_ = o.exportTypes_; - o.exportTypes_ = {0, nullptr}; + exportTypes_ = std::move(o.exportTypes_); j_ = o.j_; return *this; @@ -301,27 +278,25 @@ ModuleWrapper::operator bool() const // LCOV_EXCL_STOP -void -ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +static WasmValtypeVec +makeImpParams(WasmImportFunc const& imp) { auto const paramSize = imp.params.size(); + if (!paramSize) + return {}; + + WasmValtypeVec v(paramSize); - if (paramSize) - { - wasm_valtype_vec_new_uninitialized(&v, paramSize); - } - else - v = WASM_EMPTY_VEC; for (unsigned i = 0; i < paramSize; ++i) { auto const vt = imp.params[i]; switch (vt) { case WT_I32: - v.data[i] = wasm_valtype_new_i32(); + v.vec_.data[i] = wasm_valtype_new_i32(); break; case WT_I64: - v.data[i] = wasm_valtype_new_i64(); + v.vec_.data[i] = wasm_valtype_new_i64(); break; // LCOV_EXCL_START default: @@ -329,59 +304,55 @@ ModuleWrapper::makeImpParams(wasm_valtype_vec_t& v, WasmImportFunc const& imp) // LCOV_EXCL_STOP } } + return v; } -void -ModuleWrapper::makeImpReturn(wasm_valtype_vec_t& v, WasmImportFunc const& imp) +static WasmValtypeVec +makeImpReturn(WasmImportFunc const& imp) { - if (imp.result) + if (!imp.result) + return {}; // LCOV_EXCL_LINE + + WasmValtypeVec v(1); + switch (*imp.result) { - wasm_valtype_vec_new_uninitialized(&v, 1); - switch (*imp.result) - { - case WT_I32: - v.data[0] = wasm_valtype_new_i32(); - break; - // LCOV_EXCL_START - case WT_I64: - v.data[0] = wasm_valtype_new_i64(); - break; - default: - throw std::runtime_error("invalid return type"); - // LCOV_EXCL_STOP - } + case WT_I32: + v.vec_.data[0] = wasm_valtype_new_i32(); + break; + // LCOV_EXCL_START + case WT_I64: + v.vec_.data[0] = wasm_valtype_new_i64(); + break; + default: + throw std::runtime_error("invalid return type"); + // LCOV_EXCL_STOP } - else - v = WASM_EMPTY_VEC; // LCOV_EXCL_LINE + return v; } -wasm_extern_vec_t -ModuleWrapper::buildImports(wasm_store_t* s, ImportVec const& imports) +WasmExternVec +ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) { - wasm_importtype_vec_t importTypes = WASM_EMPTY_VEC; - wasm_module_imports(module_.get(), &importTypes); - std:: - unique_ptr - itDeleter(&importTypes, &wasm_importtype_vec_delete); + WasmImporttypeVec importTypes; + wasm_module_imports(module_.get(), &importTypes.vec_); - wasm_extern_vec_t wimports = WASM_EMPTY_VEC; - if (!importTypes.size) - return wimports; + if (!importTypes.vec_.size) + return {}; - wasm_extern_vec_new_uninitialized(&wimports, importTypes.size); + WasmExternVec wimports(importTypes.vec_.size); unsigned impCnt = 0; - for (unsigned i = 0; i < importTypes.size; ++i) + for (unsigned i = 0; i < importTypes.vec_.size; ++i) { - wasm_importtype_t const* importtype = importTypes.data[i]; + wasm_importtype_t const* importType = importTypes.vec_.data[i]; // wasm_name_t const* mn = wasm_importtype_module(importtype); // auto modName = std::string_view(mn->data, mn->num_elems); - wasm_name_t const* fn = wasm_importtype_name(importtype); + wasm_name_t const* fn = wasm_importtype_name(importType); auto fieldName = std::string_view(fn->data, fn->size); wasm_externkind_t const itype = - wasm_externtype_kind(wasm_importtype_type(importtype)); + wasm_externtype_kind(wasm_importtype_type(importType)); if ((itype) != WASM_EXTERN_FUNC) throw std::runtime_error( "Invalid import type " + @@ -398,17 +369,19 @@ ModuleWrapper::buildImports(wasm_store_t* s, ImportVec const& imports) if (imp.name != fieldName) continue; - wasm_valtype_vec_t params = WASM_EMPTY_VEC, - results = WASM_EMPTY_VEC; - makeImpReturn(results, imp); - makeImpParams(params, imp); + WasmValtypeVec params(makeImpParams(imp)); + WasmValtypeVec results(makeImpReturn(imp)); + + std::unique_ptr + ftype( + wasm_functype_new(¶ms.vec_, &results.vec_), + &wasm_functype_delete); + + params.release(); + results.release(); - using ftype_ptr = std:: - unique_ptr; - ftype_ptr ftype( - wasm_functype_new(¶ms, &results), &wasm_functype_delete); wasm_func_t* func = wasm_func_new_with_env( - s, + s.get(), ftype.get(), reinterpret_cast(imp.wrap), (void*)&obj, @@ -421,7 +394,7 @@ ModuleWrapper::buildImports(wasm_store_t* s, ImportVec const& imports) // LCOV_EXCL_STOP } - wimports.data[i] = wasm_func_as_extern(func); + wimports.vec_.data[i] = wasm_func_as_extern(func); ++impCnt; impSet = true; @@ -435,11 +408,11 @@ ModuleWrapper::buildImports(wasm_store_t* s, ImportVec const& imports) } } - if (impCnt != importTypes.size) + if (impCnt != importTypes.vec_.size) { print_wasm_error( std::string("Imports not finished: ") + std::to_string(impCnt) + - "/" + std::to_string(importTypes.size), + "/" + std::to_string(importTypes.vec_.size), nullptr, j_); } @@ -466,9 +439,9 @@ ModuleWrapper::getInstance(int) const } int -ModuleWrapper::addInstance(wasm_store_t* s, wasm_extern_vec_t const& imports) +ModuleWrapper::addInstance(StorePtr& s, WasmExternVec const& imports) { - instanceWrap_ = {s, module_.get(), imports, j_}; + instanceWrap_ = {s, module_, imports, j_}; return 0; } @@ -547,12 +520,13 @@ WasmiEngine::addModule( { // LCOV_EXCL_START print_wasm_error("Error setting gas", nullptr, j_); + wasmi_error_delete(err); throw std::runtime_error("can't set gas"); // LCOV_EXCL_STOP } moduleWrap_ = std::make_unique( - store_.get(), wasmCode, instantiate, imports, j_); + store_, wasmCode, instantiate, imports, j_); if (!moduleWrap_) throw std::runtime_error( @@ -697,7 +671,7 @@ WasmiEngine::call(FuncInfo const& f, std::vector& in) auto const start = usecs(); #endif - wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r); + wasm_trap_t* trap = wasm_func_call(f.first, &inv, &ret.r.vec_); #ifdef SHOW_CALL_TIME auto const finish = usecs(); @@ -849,16 +823,16 @@ WasmiEngine::runHlp( if (res.f) throw std::runtime_error("<" + std::string(funcName) + "> failure"); - else if (!res.r.size) + else if (!res.r.vec_.size) throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE - assert(res.r.data[0].kind == WASM_I32); + assert(res.r.vec_.data[0].kind == WASM_I32); if (gas == -1) gas = std::numeric_limits::max(); WasmResult const ret{ - res.r.data[0].of.i32, gas - moduleWrap_->getGas()}; + res.r.vec_.data[0].of.i32, gas - moduleWrap_->getGas()}; // #ifdef DEBUG_OUTPUT // auto& j = std::cerr; @@ -957,11 +931,11 @@ WasmiEngine::allocate(int32_t sz) { auto res = call<1>(W_ALLOC, static_cast(sz)); - if (res.f || !res.r.size || (res.r.data[0].kind != WASM_I32) || - !res.r.data[0].of.i32) + if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32) || + !res.r.vec_.data[0].of.i32) throw std::runtime_error( "can't allocate memory, " + std::to_string(sz) + " bytes"); - return res.r.data[0].of.i32; + return res.r.vec_.data[0].of.i32; } wasm_trap_t* @@ -973,7 +947,12 @@ WasmiEngine::newTrap(std::string const& txt) if (!txt.empty()) wasm_name_new(&msg, txt.size() + 1, txt.c_str()); // include 0 - return wasm_trap_new(store_.get(), &msg); + wasm_trap_t* trap = wasm_trap_new(store_.get(), &msg); + + if (!txt.empty()) + wasm_byte_vec_delete(&msg); + + return trap; } // LCOV_EXCL_START From 6ffbef09c2e4fe2a748142106d042d34eb2dc3f9 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 23 Dec 2025 11:00:57 -0800 Subject: [PATCH 129/212] fix gas in test --- src/test/app/Wasm_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index d07adf4f0e0..a5fa2f4aa65 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -672,7 +672,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 291'334; + auto const allowance = 292'345; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) From 1d8994065398234318cdada96c63c290822e466a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 5 Jan 2026 18:48:09 -0500 Subject: [PATCH 130/212] merge fixes --- src/test/app/HostFuncImpl_test.cpp | 4 ++-- src/test/app/TestHostFunctions.h | 6 +++--- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 6ada72b7654..956c93a6531 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -92,7 +92,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.getLedgerSqn(); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(result.value() == env.current()->info().seq); + BEAST_EXPECT(result.value() == env.current()->header().seq); } void @@ -149,7 +149,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.getParentLedgerHash(); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(result.value() == env.current()->info().parentHash); + BEAST_EXPECT(result.value() == env.current()->header().parentHash); } void diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 128bfa446f9..5eb81cc0cb6 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -87,7 +87,7 @@ struct TestHostFunctions : public HostFunctions Expected getParentLedgerHash() override { - return env_.current()->info().parentHash; + return env_.current()->header().parentHash; } Expected @@ -284,7 +284,7 @@ struct TestHostFunctions : public HostFunctions Expected computeSha512HalfHash(Slice const& data) override { - return env_.current()->info().parentHash; + return env_.current()->header().parentHash; } Expected @@ -603,7 +603,7 @@ struct PerfHostFunctions : public TestHostFunctions Expected getParentLedgerHash() override { - return env_.current()->info().parentHash; + return env_.current()->header().parentHash; } Expected diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 59c4cbfc847..d9f3550a7c2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -32,7 +32,7 @@ WasmHostFunctionsImpl::getParentLedgerTime() Expected WasmHostFunctionsImpl::getParentLedgerHash() { - return ctx.view().info().parentHash; + return ctx.view().header().parentHash; } Expected From 0e9c7458bb5d52901755c982e20a297c1f22911b Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 5 Jan 2026 18:53:14 -0500 Subject: [PATCH 131/212] fix more merge issues --- include/xrpl/protocol/detail/ledger_entries.macro | 2 +- src/test/app/HostFuncImpl_test.cpp | 4 ++-- src/test/app/TestHostFunctions.h | 6 +++--- src/test/app/Wasm_test.cpp | 4 ++-- src/xrpld/app/wasm/HostFunc.h | 4 ++-- src/xrpld/app/wasm/HostFuncImpl.h | 4 ++-- src/xrpld/app/wasm/HostFuncWrapper.h | 4 ++-- src/xrpld/app/wasm/ParamsHelper.h | 6 +++--- src/xrpld/app/wasm/WasmVM.h | 4 ++-- src/xrpld/app/wasm/WasmiVM.h | 4 ++-- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 4 ++-- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 4 ++-- src/xrpld/app/wasm/detail/WasmVM.cpp | 4 ++-- src/xrpld/app/wasm/detail/WasmiVM.cpp | 4 ++-- 14 files changed, 29 insertions(+), 29 deletions(-) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index 1034c358951..e11099dcf94 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -578,7 +578,7 @@ LEDGER_ENTRY(ltLOAN, 0x0089, Loan, loan, ({ // The unrounded true total value of the loan. // // - TrueTotalPrincialOutstanding can be computed using the algorithm - // in the ripple::detail::loanPrincipalFromPeriodicPayment function. + // in the xrpl::detail::loanPrincipalFromPeriodicPayment function. // // - TrueTotalInterestOutstanding = TrueTotalLoanValue - // TrueTotalPrincipalOutstanding diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 956c93a6531..8eeca41b7c4 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -4,7 +4,7 @@ #include -namespace ripple { +namespace xrpl { namespace test { static Bytes @@ -2963,4 +2963,4 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, ripple); } // namespace test -} // namespace ripple +} // namespace xrpl diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 5eb81cc0cb6..0cb010b0e94 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -9,7 +9,7 @@ #include #include -namespace ripple { +namespace xrpl { namespace test { @@ -1024,7 +1024,7 @@ struct PerfHostFunctions : public TestHostFunctions if (data.size() > maxWasmDataLength) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - ripple::detail::ApplyViewBase v( + xrpl::detail::ApplyViewBase v( env_.app().openLedger().current().get(), tapNONE); auto sle = v.peek(leKey); @@ -1326,4 +1326,4 @@ struct PerfHostFunctions : public TestHostFunctions }; } // namespace test -} // namespace ripple +} // namespace xrpl diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 0a8cacca427..2fc2952e2db 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -6,7 +6,7 @@ #include -namespace ripple { +namespace xrpl { namespace test { bool @@ -743,4 +743,4 @@ struct Wasm_test : public beast::unit_test::suite BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); } // namespace test -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 9963754bfb1..e59507757cf 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -11,7 +11,7 @@ #include #include -namespace ripple { +namespace xrpl { enum class HostFunctionError : int32_t { INTERNAL = -1, @@ -514,4 +514,4 @@ struct HostFunctions // LCOV_EXCL_STOP }; -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index f5ed1902309..fccea112520 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -3,7 +3,7 @@ #include #include -namespace ripple { +namespace xrpl { class WasmHostFunctionsImpl : public HostFunctions { ApplyContext& ctx; @@ -271,4 +271,4 @@ class WasmHostFunctionsImpl : public HostFunctions floatLog(Slice const& x, int32_t mode) override; }; -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index 13ed916e82f..745bbe9a2c9 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -2,7 +2,7 @@ #include -namespace ripple { +namespace xrpl { using getLedgerSqn_proto = int32_t(); wasm_trap_t* @@ -531,4 +531,4 @@ using floatLog_proto = wasm_trap_t* floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index a0eece79318..508a9438b0b 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -13,10 +13,10 @@ namespace bft = boost::function_types; -namespace ripple { +namespace xrpl { using Bytes = std::vector; -using Hash = ripple::uint256; +using Hash = xrpl::uint256; struct wmem { @@ -247,4 +247,4 @@ wasmParams(Types&&... args) return v; } -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index e8230175a44..c9c8d9c8e01 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -4,7 +4,7 @@ #include -namespace ripple { +namespace xrpl { static std::string_view const W_ENV = "env"; static std::string_view const W_HOST_LIB = "host_lib"; @@ -87,4 +87,4 @@ preflightEscrowWasm( std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}); -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index b4148b7dea5..06e18ef29e7 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -5,7 +5,7 @@ #include #include -namespace ripple { +namespace xrpl { template struct WasmVec @@ -345,4 +345,4 @@ class WasmiEngine Types&&... args); }; -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index d9f3550a7c2..7d2136f4f7a 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -9,7 +9,7 @@ // #define DEBUG_OUTPUT 1 #endif -namespace ripple { +namespace xrpl { Expected WasmHostFunctionsImpl::getLedgerSqn() @@ -1302,4 +1302,4 @@ floatLogImpl(Slice const& x, int32_t mode) // LCOV_EXCL_STOP } -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 5dc935735cb..b5da69f71d8 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -6,7 +6,7 @@ #include #include -namespace ripple { +namespace xrpl { using SFieldCRef = std::reference_wrapper; @@ -2182,4 +2182,4 @@ testGetDataIncrement() } // namespace test // LCOV_EXCL_STOP -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 9ac91358dc3..062e50ba938 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -13,7 +13,7 @@ #include -namespace ripple { +namespace xrpl { static void setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) @@ -213,4 +213,4 @@ WasmEngine::getJournal() const } // LCOV_EXCL_STOP -} // namespace ripple +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 1a379101057..82c502f63fc 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -9,7 +9,7 @@ #endif // #define SHOW_CALL_TIME 1 -namespace ripple { +namespace xrpl { namespace { @@ -963,4 +963,4 @@ WasmiEngine::getJournal() const } // LCOV_EXCL_STOP -} // namespace ripple +} // namespace xrpl From b66bc47ca9df478f9389cfeadb5f5f88812b6147 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 6 Jan 2026 13:30:30 -0500 Subject: [PATCH 132/212] fix more merge issues --- src/test/app/HostFuncImpl_test.cpp | 2 +- src/test/app/Wasm_test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 8eeca41b7c4..692b0851021 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2960,7 +2960,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } }; -BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, ripple); +BEAST_DEFINE_TESTSUITE(HostFuncImpl, app, xrpl); } // namespace test } // namespace xrpl diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 2fc2952e2db..c22054fac01 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -740,7 +740,7 @@ struct Wasm_test : public beast::unit_test::suite } }; -BEAST_DEFINE_TESTSUITE(Wasm, app, ripple); +BEAST_DEFINE_TESTSUITE(Wasm, app, xrpl); } // namespace test } // namespace xrpl From a98269f049f15cecb49cc7e5a8cef51f6af3478a Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Tue, 6 Jan 2026 14:03:18 -0500 Subject: [PATCH 133/212] a batch of memory, table, and trap tests (#6100) wasm memory, table, and trap unit tests --- clang_format.sh | 18 +++ src/test/app/Wasm_test.cpp | 104 +++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 139 ++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 37 +++++ .../wat/memory_end_of_word_over_limit.wat | 28 ++++ .../wat/memory_grow_0_page_more_than_8MB.wat | 29 ++++ .../wasm_fixtures/wat/memory_grow_0_to_1.wat | 26 ++++ .../wat/memory_grow_1_page_more_than_8MB.wat | 29 ++++ .../wasm_fixtures/wat/memory_grow_1_to_0.wat | 33 +++++ .../wat/memory_init_1_page_more_than_8MB.wat | 27 ++++ .../wat/memory_last_byte_of_8MB.wat | 26 ++++ .../wat/memory_negative_address.wat | 23 +++ .../wat/memory_offset_over_limit.wat | 27 ++++ .../wat/memory_pointer_at_limit.wat | 22 +++ .../wat/memory_pointer_over_limit.wat | 23 +++ .../wat/proposal_bulk_memory.wat | 25 ++++ .../wat/proposal_extended_const.wat | 15 ++ .../wat/proposal_float_to_int.wat | 18 +++ .../wat/proposal_gc_struct_new.wat | 12 ++ .../wat/proposal_multi_value.wat | 22 +++ .../wat/proposal_mutable_global.wat | 25 ++++ .../wasm_fixtures/wat/proposal_ref_types.wat | 18 +++ .../wasm_fixtures/wat/proposal_sign_ext.wat | 18 +++ .../wasm_fixtures/wat/proposal_stringref.wat | 1 + .../wasm_fixtures/wat/proposal_tail_call.wat | 15 ++ .../wasm_fixtures/wat/table_0_elements.wat | 10 ++ .../app/wasm_fixtures/wat/table_2_tables.wat | 24 +++ .../wasm_fixtures/wat/table_64_elements.wat | 25 ++++ .../wasm_fixtures/wat/table_65_elements.wat | 25 ++++ .../app/wasm_fixtures/wat/table_uint_max.wat | 15 ++ .../wasm_fixtures/wat/trap_divide_by_0.wat | 15 ++ .../wat/trap_func_signature_mismatch.wat | 33 +++++ .../wasm_fixtures/wat/trap_int_overflow.wat | 18 +++ .../app/wasm_fixtures/wat/trap_null_call.wat | 22 +++ .../wasm_fixtures/wat/trap_unreachable.wat | 12 ++ .../app/wasm_fixtures/wat/wasi_get_time.wat | 38 +++++ src/test/app/wasm_fixtures/wat/wasi_print.wat | 59 ++++++++ 37 files changed, 1056 insertions(+) create mode 100755 clang_format.sh create mode 100644 src/test/app/wasm_fixtures/wat/memory_end_of_word_over_limit.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_grow_0_page_more_than_8MB.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_grow_0_to_1.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_grow_1_page_more_than_8MB.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_grow_1_to_0.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_init_1_page_more_than_8MB.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_last_byte_of_8MB.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_negative_address.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_offset_over_limit.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_pointer_at_limit.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory_pointer_over_limit.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_bulk_memory.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_extended_const.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_float_to_int.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_gc_struct_new.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_multi_value.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_mutable_global.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_ref_types.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_sign_ext.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_stringref.wat create mode 100644 src/test/app/wasm_fixtures/wat/proposal_tail_call.wat create mode 100644 src/test/app/wasm_fixtures/wat/table_0_elements.wat create mode 100644 src/test/app/wasm_fixtures/wat/table_2_tables.wat create mode 100644 src/test/app/wasm_fixtures/wat/table_64_elements.wat create mode 100644 src/test/app/wasm_fixtures/wat/table_65_elements.wat create mode 100644 src/test/app/wasm_fixtures/wat/table_uint_max.wat create mode 100644 src/test/app/wasm_fixtures/wat/trap_divide_by_0.wat create mode 100644 src/test/app/wasm_fixtures/wat/trap_func_signature_mismatch.wat create mode 100644 src/test/app/wasm_fixtures/wat/trap_int_overflow.wat create mode 100644 src/test/app/wasm_fixtures/wat/trap_null_call.wat create mode 100644 src/test/app/wasm_fixtures/wat/trap_unreachable.wat create mode 100644 src/test/app/wasm_fixtures/wat/wasi_get_time.wat create mode 100644 src/test/app/wasm_fixtures/wat/wasi_print.wat diff --git a/clang_format.sh b/clang_format.sh new file mode 100755 index 00000000000..f9aeb0af66b --- /dev/null +++ b/clang_format.sh @@ -0,0 +1,18 @@ +#!/bin/bash +modified=$1 +dir=`pwd` +clangf=clang-format-10 +clangf=clang-format +if [ "$1" = "--all" ] +then + modified=`git status|egrep "modified|new file"|egrep "(cpp|h)$" | sed -E -e 's/modified://' -e 's/new file://' -e 's/^[[:space:]]+//'` +fi +for i in $modified +do + basedir=$(dirname "$i") + file=$(basename "$i") + echo "$basedir $file" + cd $basedir + $clangf -style=file -i "$file" + cd $dir +done diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c22054fac01..e6e39019581 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -23,6 +23,23 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } +std::optional +runFinishFunction(std::string const& code) +{ + auto& engine = WasmEngine::instance(); + auto const ws = boost::algorithm::unhex(code); + Bytes const wasm(ws.begin(), ws.end()); + auto const re = engine.run(wasm, "finish"); + if (re.has_value()) + { + return std::optional(re->result); + } + else + { + return std::nullopt; + } +} + struct Wasm_test : public beast::unit_test::suite { void @@ -715,6 +732,88 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testWasmMemory() + { + testcase("Wasm additional memory limit tests"); + BEAST_EXPECT(runFinishFunction(memoryPointerAtLimitHex).value() == 1); + BEAST_EXPECT( + runFinishFunction(memoryPointerOverLimitHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(memoryOffsetOverLimitHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(memoryEndOfWordOverLimitHex).has_value() == + false); + BEAST_EXPECT(runFinishFunction(memoryGrow0To1PageHex).value() == 1); + BEAST_EXPECT(runFinishFunction(memoryGrow1To0PageHex).value() == -1); + BEAST_EXPECT(runFinishFunction(memoryLastByteOf8MBHex).value() == 1); + BEAST_EXPECT( + runFinishFunction(memoryGrow1MoreThan8MBHex).value() == -1); + BEAST_EXPECT(runFinishFunction(memoryGrow0MoreThan8MBHex).value() == 1); + BEAST_EXPECT( + runFinishFunction(memoryInit1MoreThan8MBHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(memoryNegativeAddressHex).has_value() == false); + } + + void + testWasmTable() + { + testcase("Wasm table limit tests"); + BEAST_EXPECT(runFinishFunction(table64ElementsHex).value() == 1); + BEAST_EXPECT( + runFinishFunction(table65ElementsHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(table2TablesHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(table0ElementsHex).value() == 1); + BEAST_EXPECT(runFinishFunction(tableUintMaxHex).has_value() == false); + } + + void + testWasmProposal() + { + testcase("Wasm disabled proposal tests"); + BEAST_EXPECT( + runFinishFunction(proposalMutableGlobalHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalGcStructNewHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalMultiValueHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalSignExtHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalFloatToIntHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalBulkMemoryHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalRefTypesHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalTailCallHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalExtendedConstHex).has_value() == false); + } + + void + testWasmTrap() + { + testcase("Wasm trap tests"); + BEAST_EXPECT(runFinishFunction(trapDivideBy0Hex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(trapIntOverflowHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(trapUnreachableHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(trapNullCallHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(trapFuncSigMismatchHex).has_value() == false); + } + + void + testWasmWasi() + { + testcase("Wasm Wasi tests"); + BEAST_EXPECT(runFinishFunction(wasiGetTimeHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(wasiPrintHex).has_value() == false); + } + void run() override { @@ -736,6 +835,11 @@ struct Wasm_test : public beast::unit_test::suite testCodecovWasm(); testDisabledFloat(); + testWasmMemory(); + testWasmTable(); + testWasmProposal(); + testWasmTrap(); + testWasmWasi(); // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 54584364f19..6a6ae2e686e 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1069,3 +1069,142 @@ extern std::string const disabledFloatHex = "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" "090a150202000b100043000000c54300200045921a41010b"; + +extern std::string const memoryPointerAtLimitHex = + "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a" + "0e010c0041ffff032d00001a41010b"; + +extern std::string const memoryPointerOverLimitHex = + "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a" + "0e010c00418080042d00001a41010b"; + +extern std::string const memoryOffsetOverLimitHex = + "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" + "66696e69736800000a0e010c00410028028080041a41010b"; + +extern std::string const memoryEndOfWordOverLimitHex = + "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" + "66696e69736800000a0e010c0041feff032802001a41010b"; + +extern std::string const memoryGrow0To1PageHex = + "0061736d010000000105016000017f030201000503010000071302066d656d6f7279020006" + "66696e69736800000a0b010900410140001a41010b"; + +extern std::string const memoryGrow1To0PageHex = + "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" + "66696e69736800000a13011100417f4000417f460440417f0f0b41010b"; + +extern std::string const memoryLastByteOf8MBHex = + "0061736d010000000105016000017f030201000506010180018001071302066d656d6f7279" + "02000666696e69736800000a0f010d0041ffffff032d00001a41010b"; + +extern std::string const memoryGrow1MoreThan8MBHex = + "0061736d010000000105016000017f03020100050401008001071302066d656d6f72790200" + "0666696e69736800000a1301110041014000417f460440417f0f0b41010b"; + +extern std::string const memoryGrow0MoreThan8MBHex = + "0061736d010000000105016000017f03020100050401008001071302066d656d6f72790200" + "0666696e69736800000a1301110041004000417f460440417f0f0b41010b"; + +extern std::string const memoryInit1MoreThan8MBHex = + "0061736d010000000105016000017f030201000506010181018101071302066d656d6f7279" + "02000666696e69736800000a0f010d0041ffffff032d00001a41010b"; + +extern std::string const memoryNegativeAddressHex = + "0061736d010000000105016000017f030201000506010180018001071302066d656d6f7279" + "02000666696e69736800000a0c010a00417f2d00001a41010b"; + +extern std::string const table64ElementsHex = + "0061736d010000000108026000006000017f0303020001040401700040070a010666696e69" + "736800010946010041000b4000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000000" + "00000a090202000b040041010b"; + +extern std::string const table65ElementsHex = + "0061736d010000000108026000006000017f0303020001040401700041070a010666696e69" + "736800010947010041000b4100000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000a090202000b040041010b"; + +extern std::string const table2TablesHex = + "0061736d010000000108026000006000017f03030200010409027001010170010101070a01" + "0666696e6973680001090f020041000b0100020141000b0001000a090202000b040041010" + "b"; + +extern std::string const table0ElementsHex = + "0061736d010000000105016000017f03020100040401700000070a010666696e6973680000" + "0a0601040041010b"; + +extern std::string const tableUintMaxHex = + "0061736d010000000105016000017f030201000408017000ffffffff0f070a010666696e69" + "736800000a0601040041010b"; + +extern std::string const proposalMutableGlobalHex = + "0061736d010000000105016000017f030201000606017f0141000b07140207636f756e7465" + "7203000666696e69736800000a0d010b00230041016a240041010b"; + +extern std::string const proposalGcStructNewHex = + "0061736d01000000010b026000017f5f027f017f0103020100070a010666696e6973680000" + "0a0a010800fb01011a41010b"; + +extern std::string const proposalMultiValueHex = + "0061736d010000000110036000027f7f6000017f60027f7f017f0303020001070a01066669" + "6e69736800010a14020600410a41140b0b00100002026a411e460b0b"; + +extern std::string const proposalSignExtHex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a0b01090041" + "ff01c0417f460b"; + +extern std::string const proposalFloatToIntHex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a1201100043" + "f9021550fc0041ffffffff07460b"; + +extern std::string const proposalBulkMemoryHex = + "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" + "66696e69736800000a1f011d004100412a3a000041e40041004101fc0a000041e4002d0000" + "412a460b"; + +extern std::string const proposalRefTypesHex = + "0061736d010000000105016000017f020f0103656e76057461626c65016f00010302010007" + "0a010666696e69736800000a0c010a004100d06f260041010b"; + +extern std::string const proposalTailCallHex = + "0061736d010000000105016000017f0303020000070a010666696e69736800010a0b020400" + "41010b040012000b"; + +extern std::string const proposalExtendedConstHex = + "0061736d010000000105016000017f030201000609017f00410a41206a0b070a010666696e" + "69736800000a090107002300412a460b"; + +extern std::string const trapDivideBy0Hex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a0c010a0041" + "2a41006d1a41010b"; + +extern std::string const trapIntOverflowHex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a0d010b0041" + "8080808078417f6d0b"; + +extern std::string const trapUnreachableHex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a0701050000" + "41010b"; + +extern std::string const trapNullCallHex = + "0061736d010000000105016000017f03020100040401700001070a010666696e6973680000" + "0a0901070041001100000b"; + +extern std::string const trapFuncSigMismatchHex = + "0061736d010000000108026000006000017f0303020001040401700001070a010666696e69" + "736800010907010041000b01000a0d020300010b070041001101000b"; + +extern std::string const wasiGetTimeHex = + "0061736d01000000010c0260037f7e7f017f6000017f02290116776173695f736e61707368" + "6f745f70726576696577310e636c6f636b5f74696d655f6765740000030201010503010001" + "071302066d656d6f727902000666696e69736800010a16011400410042e807410010004504" + "7f410105417f0b0b"; + +extern std::string const wasiPrintHex = + "0061736d01000000010d0260047f7f7f7f017f6000017f02230116776173695f736e617073" + "686f745f70726576696577310866645f77726974650000030201010503010001071302066d" + "656d6f727902000666696e69736800010a1d011b01017f4118210041014100410120001000" + "45047f410105417f0b0b0b1e030041100b0648656c6c6f0a0041000b04100000000041040b" + "0406000000"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index abde376763f..cb4f6e69d65 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -27,3 +27,40 @@ extern std::string const floatTestsWasmHex; extern std::string const float0Hex; extern std::string const disabledFloatHex; + +extern std::string const memoryPointerAtLimitHex; +extern std::string const memoryPointerOverLimitHex; +extern std::string const memoryOffsetOverLimitHex; +extern std::string const memoryEndOfWordOverLimitHex; +extern std::string const memoryGrow0To1PageHex; +extern std::string const memoryGrow1To0PageHex; +extern std::string const memoryLastByteOf8MBHex; +extern std::string const memoryGrow1MoreThan8MBHex; +extern std::string const memoryGrow0MoreThan8MBHex; +extern std::string const memoryInit1MoreThan8MBHex; +extern std::string const memoryNegativeAddressHex; + +extern std::string const table64ElementsHex; +extern std::string const table65ElementsHex; +extern std::string const table2TablesHex; +extern std::string const table0ElementsHex; +extern std::string const tableUintMaxHex; + +extern std::string const proposalMutableGlobalHex; +extern std::string const proposalGcStructNewHex; +extern std::string const proposalMultiValueHex; +extern std::string const proposalSignExtHex; +extern std::string const proposalFloatToIntHex; +extern std::string const proposalBulkMemoryHex; +extern std::string const proposalRefTypesHex; +extern std::string const proposalTailCallHex; +extern std::string const proposalExtendedConstHex; + +extern std::string const trapDivideBy0Hex; +extern std::string const trapIntOverflowHex; +extern std::string const trapUnreachableHex; +extern std::string const trapNullCallHex; +extern std::string const trapFuncSigMismatchHex; + +extern std::string const wasiGetTimeHex; +extern std::string const wasiPrintHex; diff --git a/src/test/app/wasm_fixtures/wat/memory_end_of_word_over_limit.wat b/src/test/app/wasm_fixtures/wat/memory_end_of_word_over_limit.wat new file mode 100644 index 00000000000..dc5427563fc --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_end_of_word_over_limit.wat @@ -0,0 +1,28 @@ +(module + ;; 1. Define Memory: 1 Page = 64KB = 65,536 bytes + (memory 1) + + ;; Export memory so the host can inspect it if needed + (export "memory" (memory 0)) + + (func $test_straddle (result i32) + ;; Push the address onto the stack. + ;; 65534 is valid, but it is only 2 bytes away from the end. + i32.const 65534 + + ;; Attempt to load an i32 (4 bytes) from that address. + ;; This requires bytes 65534, 65535, 65536, and 65537. + ;; Since 65536 is the first invalid byte, this MUST trap. + i32.load + + ;; Clean up the stack. + ;; The load pushed a value, but we don't care what it is. + drop + + ;; Return 1 to signal "I survived the memory access" + i32.const 1 + ) + + ;; Export the function so you can call it from your host (JS, Python, etc.) + (export "finish" (func $test_straddle)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_grow_0_page_more_than_8MB.wat b/src/test/app/wasm_fixtures/wat/memory_grow_0_page_more_than_8MB.wat new file mode 100644 index 00000000000..d9c149530f8 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_grow_0_page_more_than_8MB.wat @@ -0,0 +1,29 @@ +(module + ;; Start at your limit: 128 pages (8MB) + (memory 128) + (export "memory" (memory 0)) + + (func $try_grow_beyond_limit (result i32) + ;; Attempt to grow by 0 page + i32.const 0 + memory.grow + + ;; memory.grow returns: + ;; -1 if the growth failed (Correct behavior for your limit) + ;; 128 (old size) if growth succeeded (Means limit was bypassed) + + ;; Check if result == -1 + i32.const -1 + i32.eq + if + ;; Growth FAILED (Host blocked it). Return -1. + i32.const -1 + return + end + + ;; Growth SUCCEEDED (Host allowed it). Return 1. + i32.const 1 + ) + + (export "finish" (func $try_grow_beyond_limit)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_grow_0_to_1.wat b/src/test/app/wasm_fixtures/wat/memory_grow_0_to_1.wat new file mode 100644 index 00000000000..ff822ffbdce --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_grow_0_to_1.wat @@ -0,0 +1,26 @@ +(module + ;; 1. Define Memory: Start with 0 pages + (memory 0) + + ;; Export memory to host + (export "memory" (memory 0)) + + (func $grow_from_zero (result i32) + ;; We have 0 pages. We want to add 1 page. + ;; Push delta (1) onto stack. + i32.const 1 + + ;; Grow the memory. + ;; If successful: memory becomes 64KB, returns old size (0). + ;; If failed: memory stays 0, returns -1. + memory.grow + + ;; Drop the return value of memory.grow + drop + + ;; Return 1 (as requested) + i32.const 1 + ) + + (export "finish" (func $grow_from_zero)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_grow_1_page_more_than_8MB.wat b/src/test/app/wasm_fixtures/wat/memory_grow_1_page_more_than_8MB.wat new file mode 100644 index 00000000000..4a245a521c2 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_grow_1_page_more_than_8MB.wat @@ -0,0 +1,29 @@ +(module + ;; Start at your limit: 128 pages (8MB) + (memory 128) + (export "memory" (memory 0)) + + (func $try_grow_beyond_limit (result i32) + ;; Attempt to grow by 1 page + i32.const 1 + memory.grow + + ;; memory.grow returns: + ;; -1 if the growth failed (Correct behavior for your limit) + ;; 128 (old size) if growth succeeded (Means limit was bypassed) + + ;; Check if result == -1 + i32.const -1 + i32.eq + if + ;; Growth FAILED (Host blocked it). Return -1. + i32.const -1 + return + end + + ;; Growth SUCCEEDED (Host allowed it). Return 1. + i32.const 1 + ) + + (export "finish" (func $try_grow_beyond_limit)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_grow_1_to_0.wat b/src/test/app/wasm_fixtures/wat/memory_grow_1_to_0.wat new file mode 100644 index 00000000000..fa25154f099 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_grow_1_to_0.wat @@ -0,0 +1,33 @@ +(module + ;; 1. Define Memory: Start with 1 page (64KB) + (memory 1) + + ;; Export memory to host + (export "memory" (memory 0)) + + (func $grow_negative (result i32) + ;; The user pushed -1. In Wasm, this is interpreted as unsigned MAX_UINT32. + ;; This is requesting to add 4,294,967,295 pages (approx 256 TB). + ;; A secure runtime MUST fail this request (return -1) without crashing. + i32.const -1 + + ;; Grow the memory. + ;; Returns: old_size if success, -1 if failure. + memory.grow + + ;; Check if result == -1 (Failure) + i32.const -1 + i32.eq + if + ;; If memory.grow returned -1, we return -1 to signal "Correctly failed". + i32.const -1 + return + end + + ;; If we are here, memory.grow somehow SUCCEEDED (Vulnerability). + ;; We return 1 to signal "Unexpected Success". + i32.const 1 + ) + + (export "finish" (func $grow_negative)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_init_1_page_more_than_8MB.wat b/src/test/app/wasm_fixtures/wat/memory_init_1_page_more_than_8MB.wat new file mode 100644 index 00000000000..5fd1d09ed14 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_init_1_page_more_than_8MB.wat @@ -0,0 +1,27 @@ +(module + ;; Define memory: 129 pages (> 8MB limit) min, 129 pages max + (memory 129 129) + + ;; Export memory so host can verify size + (export "memory" (memory 0)) + + ;; access last byte of 8MB limit + (func $access_last_byte (result i32) + ;; Math: 128 pages * 64,536 bytes/page = 8,388,608 bytes + ;; Valid indices: 0 to 8,388,607 + + ;; Push the address of the LAST valid byte + i32.const 8388607 + + ;; Load byte from that address + i32.load8_u + + ;; Drop the value (we don't care what it is, just that we could read it) + drop + + ;; Return 1 to indicate success + i32.const 1 + ) + + (export "finish" (func $access_last_byte)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_last_byte_of_8MB.wat b/src/test/app/wasm_fixtures/wat/memory_last_byte_of_8MB.wat new file mode 100644 index 00000000000..a59ec062947 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_last_byte_of_8MB.wat @@ -0,0 +1,26 @@ +(module + ;; Define memory: 128 pages (8MB) min, 128 pages max + (memory 128 128) + + ;; Export memory so host can verify size + (export "memory" (memory 0)) + + (func $access_last_byte (result i32) + ;; Math: 128 pages * 64,536 bytes/page = 8,388,608 bytes + ;; Valid indices: 0 to 8,388,607 + + ;; Push the address of the LAST valid byte + i32.const 8388607 + + ;; Load byte from that address + i32.load8_u + + ;; Drop the value (we don't care what it is, just that we could read it) + drop + + ;; Return 1 to indicate success + i32.const 1 + ) + + (export "finish" (func $access_last_byte)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_negative_address.wat b/src/test/app/wasm_fixtures/wat/memory_negative_address.wat new file mode 100644 index 00000000000..02c9cb5a3bb --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_negative_address.wat @@ -0,0 +1,23 @@ +(module + ;; Define memory: 128 pages (8MB) min, 128 pages max + (memory 128 128) + + ;; Export memory so host can verify size + (export "memory" (memory 0)) + + (func $access_last_byte (result i32) + ;; Push a negative address + i32.const -1 + + ;; Load byte from that address + i32.load8_u + + ;; Drop the value + drop + + ;; Return 1 to indicate success + i32.const 1 + ) + + (export "finish" (func $access_last_byte)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_offset_over_limit.wat b/src/test/app/wasm_fixtures/wat/memory_offset_over_limit.wat new file mode 100644 index 00000000000..d502ddf2919 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_offset_over_limit.wat @@ -0,0 +1,27 @@ +(module + ;; 1. Define Memory: 1 Page = 64KB + (memory 1) + + (export "memory" (memory 0)) + + (func $test_offset_overflow (result i32) + ;; 1. Push the base address onto the stack. + ;; We use '0', which is the safest, most valid address possible. + i32.const 0 + + ;; 2. Attempt to load using a static offset. + ;; syntax: i32.load offset=N align=N + ;; We set the offset to 65536 (the size of the memory). + ;; The effective address becomes 0 + 65536 = 65536. + i32.load offset=65536 + + ;; Clean up the stack. + ;; The load pushed a value, but we don't care what it is. + drop + + ;; Return 1 to signal "I survived the memory access" + i32.const 1 + ) + + (export "finish" (func $test_offset_overflow)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_pointer_at_limit.wat b/src/test/app/wasm_fixtures/wat/memory_pointer_at_limit.wat new file mode 100644 index 00000000000..c72cd437398 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_pointer_at_limit.wat @@ -0,0 +1,22 @@ +(module + ;; Define 1 page of memory (64KB = 65,536 bytes) + (memory 1) + + (func $read_edge (result i32) + ;; Push the index of the LAST valid byte + i32.const 65535 + + ;; Load 1 byte (unsigned) + i32.load8_u + + ;; Clean up the stack. + ;; The load pushed a value, but we don't care what it is. + drop + + ;; Return 1 to signal "I survived the memory access" + i32.const 1 + ) + + ;; Export as "finish" as requested + (export "finish" (func $read_edge)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory_pointer_over_limit.wat b/src/test/app/wasm_fixtures/wat/memory_pointer_over_limit.wat new file mode 100644 index 00000000000..12f6ea01a22 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory_pointer_over_limit.wat @@ -0,0 +1,23 @@ +(module + ;; Define 1 page of memory (64KB = 65,536 bytes) + (memory 1) + + (func $read_overflow (result i32) + ;; Push the index of the FIRST invalid byte + ;; Memory is 0..65535, so 65536 is out of bounds. + i32.const 65536 + + ;; Load 1 byte (unsigned) + i32.load8_u + + ;; Clean up the stack. + ;; The load pushed a value, but we don't care what it is. + drop + + ;; Return 1 to signal "I survived the memory access" + i32.const 1 + ) + + ;; Export as "finish" as requested + (export "finish" (func $read_overflow)) + ) diff --git a/src/test/app/wasm_fixtures/wat/proposal_bulk_memory.wat b/src/test/app/wasm_fixtures/wat/proposal_bulk_memory.wat new file mode 100644 index 00000000000..1010c60a613 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_bulk_memory.wat @@ -0,0 +1,25 @@ +(module + ;; Define 1 page of memory + (memory 1) + (export "memory" (memory 0)) + + (func $test_bulk_ops (result i32) + ;; Setup: Write value 42 at index 0 so we have something to copy + (i32.store8 (i32.const 0) (i32.const 42)) + + ;; Test memory.copy (Opcode 0xFC 0x0A) + ;; Copy 1 byte from offset 0 to offset 100 + (memory.copy + (i32.const 100) ;; Destination Offset + (i32.const 0) ;; Source Offset + (i32.const 1) ;; Size (bytes) + ) + + ;; Verify: Read byte at offset 100. Should be 42. + (i32.load8_u (i32.const 100)) + (i32.const 42) + i32.eq + ) + + (export "finish" (func $test_bulk_ops)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_extended_const.wat b/src/test/app/wasm_fixtures/wat/proposal_extended_const.wat new file mode 100644 index 00000000000..1b24f8ff450 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_extended_const.wat @@ -0,0 +1,15 @@ +(module + ;; 1. Define a global using an EXTENDED constant expression. + ;; MVP only allows (i32.const X). + ;; This proposal allows (i32.add (i32.const X) (i32.const Y)). + (global $g i32 (i32.add (i32.const 10) (i32.const 32))) + + (func $finish (result i32) + ;; 2. verify the global equals 42 + global.get $g + i32.const 42 + i32.eq + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_float_to_int.wat b/src/test/app/wasm_fixtures/wat/proposal_float_to_int.wat new file mode 100644 index 00000000000..3d52bfa3996 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_float_to_int.wat @@ -0,0 +1,18 @@ +(module + (func $test_saturation (result i32) + ;; 1. Push a float that is too big for a 32-bit integer + ;; 1e10 (10 billion) > 2.14 billion (Max i32) + f32.const 1.0e10 + + ;; 2. Attempt saturating conversion (Opcode 0xFC 0x00) + ;; If supported: Clamps to MAX_I32. + ;; If disabled: Validation error (unknown instruction). + i32.trunc_sat_f32_s + + ;; 3. Check if result is MAX_I32 (2147483647) + i32.const 2147483647 + i32.eq + ) + + (export "finish" (func $test_saturation)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_gc_struct_new.wat b/src/test/app/wasm_fixtures/wat/proposal_gc_struct_new.wat new file mode 100644 index 00000000000..b9a1e5c5198 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_gc_struct_new.wat @@ -0,0 +1,12 @@ +;; generated by wasm-tools print gc_test.wasm that has the following hex +;; 0061736d01000000010b026000017f5f027f017f0103020100070a010666696e69736800000a0a010800fb01011a41010b +(module + (type (;0;) (func (result i32))) + (type (;1;) (struct (field (mut i32)) (field (mut i32)))) + (export "finish" (func 0)) + (func (;0;) (type 0) (result i32) + struct.new_default 1 + drop + i32.const 1 + ) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_multi_value.wat b/src/test/app/wasm_fixtures/wat/proposal_multi_value.wat new file mode 100644 index 00000000000..30dda4ce125 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_multi_value.wat @@ -0,0 +1,22 @@ +(module + ;; 1. Function returning TWO values (Multi-Value feature) + (func $get_numbers (result i32 i32) + i32.const 10 + i32.const 20 + ) + + (func $finish (result i32) + ;; Call pushes [10, 20] onto the stack + call $get_numbers + + ;; 2. Block taking TWO parameters (Multi-Value feature) + ;; It consumes the [10, 20] from the stack. + block (param i32 i32) (result i32) + i32.add ;; 10 + 20 = 30 + i32.const 30 ;; Expected result + i32.eq ;; Compare: returns 1 if equal + end + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_mutable_global.wat b/src/test/app/wasm_fixtures/wat/proposal_mutable_global.wat new file mode 100644 index 00000000000..2b1b5ff6483 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_mutable_global.wat @@ -0,0 +1,25 @@ +(module + ;; Define a mutable global initialized to 0 + (global $counter (mut i32) (i32.const 0)) + + ;; EXPORTING a mutable global is the key feature of this proposal. + ;; In strict MVP, exported globals had to be immutable (const). + (export "counter" (global $counter)) + + (func $finish (result i32) + ;; 1. Get current value + global.get $counter + + ;; 2. Add 1 + i32.const 1 + i32.add + + ;; 3. Set new value (Mutation) + global.set $counter + + ;; 4. Return 1 for success + i32.const 1 + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_ref_types.wat b/src/test/app/wasm_fixtures/wat/proposal_ref_types.wat new file mode 100644 index 00000000000..c339b9176fe --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_ref_types.wat @@ -0,0 +1,18 @@ +(module + ;; Import a table from the host that holds externrefs + (import "env" "table" (table 1 externref)) + + (func $test_ref_types (result i32) + ;; Store a null externref into the table at index 0 + ;; If reference_types is disabled, 'externref' and 'ref.null' will fail parsing. + (table.set + (i32.const 0) ;; Index + (ref.null extern) ;; Value (Null External Reference) + ) + + ;; Return 1 (Success) + i32.const 1 + ) + + (export "finish" (func $test_ref_types)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_sign_ext.wat b/src/test/app/wasm_fixtures/wat/proposal_sign_ext.wat new file mode 100644 index 00000000000..ab9061fbb15 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_sign_ext.wat @@ -0,0 +1,18 @@ +(module + (func $test_sign_ext (result i32) + ;; Push 255 (0x000000FF) onto the stack + i32.const 255 + + ;; Sign-extend from 8-bit to 32-bit + ;; If 255 is treated as an i8, it is -1. + ;; Result should be -1 (0xFFFFFFFF). + ;; Without this proposal, this opcode (0xC0) causes a validation error. + i32.extend8_s + + ;; Check if result is -1 + i32.const -1 + i32.eq + ) + + (export "finish" (func $test_sign_ext)) +) diff --git a/src/test/app/wasm_fixtures/wat/proposal_stringref.wat b/src/test/app/wasm_fixtures/wat/proposal_stringref.wat new file mode 100644 index 00000000000..c9f8030fafd --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_stringref.wat @@ -0,0 +1 @@ +;;hard to generate diff --git a/src/test/app/wasm_fixtures/wat/proposal_tail_call.wat b/src/test/app/wasm_fixtures/wat/proposal_tail_call.wat new file mode 100644 index 00000000000..f2c883931a5 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/proposal_tail_call.wat @@ -0,0 +1,15 @@ +(module + ;; Define a simple function we can tail-call + (func $target (result i32) + i32.const 1 + ) + + (func $finish (result i32) + ;; Try to use the 'return_call' instruction (Opcode 0x12) + ;; If Tail Call proposal is disabled, this fails to Compile/Validate. + ;; If enabled, it jumps to $target, which returns 1. + return_call $target + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/table_0_elements.wat b/src/test/app/wasm_fixtures/wat/table_0_elements.wat new file mode 100644 index 00000000000..7f2d1abc648 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/table_0_elements.wat @@ -0,0 +1,10 @@ +(module + ;; Define a table with exactly 0 entries + (table 0 funcref) + + ;; Standard finish function + (func $finish (result i32) + i32.const 1 + ) + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/table_2_tables.wat b/src/test/app/wasm_fixtures/wat/table_2_tables.wat new file mode 100644 index 00000000000..fd007f410ac --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/table_2_tables.wat @@ -0,0 +1,24 @@ +(module + ;; Define a dummy function to put in the tables + (func $dummy) + + ;; TABLE 0: The default table (allowed in MVP) + ;; Size: 1 initial, 1 max + (table $t0 1 1 funcref) + + ;; Initialize Table 0 at index 0 + (elem (table $t0) (i32.const 0) $dummy) + + ;; TABLE 1: The second table (Requires Reference Types proposal) + ;; If strict MVP is enforced, the parser should error here. + (table $t1 1 1 funcref) + + ;; Initialize Table 1 at index 0 + (elem (table $t1) (i32.const 0) $dummy) + + (func $finish (result i32) + ;; If we successfully loaded a module with 2 tables, return 1. + i32.const 1 + ) + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/table_64_elements.wat b/src/test/app/wasm_fixtures/wat/table_64_elements.wat new file mode 100644 index 00000000000..3ff990b2282 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/table_64_elements.wat @@ -0,0 +1,25 @@ +(module + ;; Define a table with exactly 64 entries + (table 64 funcref) + + ;; A dummy function to reference + (func $dummy) + + ;; Initialize the table at offset 0 with 64 references to $dummy + (elem (i32.const 0) + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 8 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 16 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 24 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 32 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 40 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 48 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 56 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 64 + ) + + ;; Standard finish function + (func $finish (result i32) + i32.const 1 + ) + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/table_65_elements.wat b/src/test/app/wasm_fixtures/wat/table_65_elements.wat new file mode 100644 index 00000000000..db3efa0a18f --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/table_65_elements.wat @@ -0,0 +1,25 @@ +(module + ;; Define a table with exactly 65 entries + (table 65 funcref) + + ;; A dummy function to reference + (func $dummy) + + ;; Initialize the table at offset 0 with 65 references to $dummy + (elem (i32.const 0) + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 8 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 16 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 24 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 32 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 40 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 48 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 56 + $dummy $dummy $dummy $dummy $dummy $dummy $dummy $dummy ;; 64 + $dummy ;; 65 (The one that breaks the camel's back) + ) + + (func $finish (result i32) + i32.const 1 + ) + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/table_uint_max.wat b/src/test/app/wasm_fixtures/wat/table_uint_max.wat new file mode 100644 index 00000000000..31c15b8be22 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/table_uint_max.wat @@ -0,0 +1,15 @@ +(module + ;; Definition: (table ) + ;; We use 0xFFFFFFFF (4,294,967,295), which is the unsigned equivalent of -1. + ;; This tests if the runtime handles the maximum possible u32 value + ;; without integer overflows or attempting a massive allocation. + ;; + ;; Note that using -1 as the table size cannot be parsed by wasm-tools or wat2wasm + (table 0xFFFFFFFF funcref) + + (func $finish (result i32) + ;; If the module loads despite the massive table, return 1. + i32.const 1 + ) + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/trap_divide_by_0.wat b/src/test/app/wasm_fixtures/wat/trap_divide_by_0.wat new file mode 100644 index 00000000000..8fda7bdae07 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/trap_divide_by_0.wat @@ -0,0 +1,15 @@ +(module + (func $finish (export "finish") (result i32) + ;; Setup for Requirement 2: Divide an i32 by 0 + i32.const 42 ;; Push numerator + i32.const 0 ;; Push denominator (0) + i32.div_s ;; Perform signed division (42 / 0) + + ;; --- NOTE: Execution usually traps (crashes) at the line above --- + + ;; Logic to satisfy Requirement 1: Return i32 = 1 + ;; If execution continued, we would drop the division result and return 1 + drop ;; Clear the stack + i32.const 1 ;; Push the return value + ) +) diff --git a/src/test/app/wasm_fixtures/wat/trap_func_signature_mismatch.wat b/src/test/app/wasm_fixtures/wat/trap_func_signature_mismatch.wat new file mode 100644 index 00000000000..a712d1ac8dd --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/trap_func_signature_mismatch.wat @@ -0,0 +1,33 @@ +(module + ;; Define a table with 1 slot + (table 1 funcref) + + ;; Define Type A: Takes nothing, returns nothing + (type $type_void (func)) + + ;; Define Type B: Takes nothing, returns i32 + (type $type_i32 (func (result i32))) + + ;; Define a function of Type A + (func $void_func (type $type_void) + nop + ) + + ;; Put Type A function into Table[0] + (elem (i32.const 0) $void_func) + + (func $finish (result i32) + ;; Attempt to call Index 0, but CLAIM we expect Type B (result i32). + ;; The function at Index 0 matches Type A. + ;; TRAP: "indirect call type mismatch" + + ;; 1. Push the table index (0) onto the stack + i32.const 0 + + ;; 2. Call indirect using Type B signature. + ;; This pops the index (0) from the stack. + call_indirect (type $type_i32) + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/trap_int_overflow.wat b/src/test/app/wasm_fixtures/wat/trap_int_overflow.wat new file mode 100644 index 00000000000..810236df791 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/trap_int_overflow.wat @@ -0,0 +1,18 @@ +(module + (func $test_int_overflow (result i32) + ;; 1. Push INT_MIN (-2147483648) + ;; In Hex: 0x80000000 + i32.const -2147483648 + + ;; 2. Push -1 + i32.const -1 + + ;; 3. Signed Division + ;; This specific case is the ONLY integer arithmetic operation + ;; (besides divide by zero) that traps in the spec. + ;; Result would be +2147483648, which is too big for signed i32. + i32.div_s + ) + + (export "finish" (func $test_int_overflow)) +) diff --git a/src/test/app/wasm_fixtures/wat/trap_null_call.wat b/src/test/app/wasm_fixtures/wat/trap_null_call.wat new file mode 100644 index 00000000000..f806d922f7e --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/trap_null_call.wat @@ -0,0 +1,22 @@ +(module + ;; Table size is 1, so Index 0 is VALID bounds. + ;; However, we do NOT initialize it, so it contains 'ref.null'. + (table 1 funcref) + + (type $t (func (result i32))) + + (func $finish (result i32) + ;; Call Index 0. + ;; Bounds check passes (0 < 1). + ;; Null check fails. + ;; TRAP: "uninitialized element" or "undefined element" + + ;; 1. Push the index (0) onto the stack first + i32.const 0 + + ;; 2. Perform the call. This pops the index. + call_indirect (type $t) + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/trap_unreachable.wat b/src/test/app/wasm_fixtures/wat/trap_unreachable.wat new file mode 100644 index 00000000000..4bc15569fc3 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/trap_unreachable.wat @@ -0,0 +1,12 @@ +(module + (func $finish (result i32) + ;; This instruction explicitly causes a trap. + ;; It consumes no fuel (beyond the instruction itself) and stops execution. + unreachable + + ;; This code is dead and never reached + i32.const 1 + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/wasi_get_time.wat b/src/test/app/wasm_fixtures/wat/wasi_get_time.wat new file mode 100644 index 00000000000..049ecf0be10 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/wasi_get_time.wat @@ -0,0 +1,38 @@ +(module + ;; Import clock_time_get from WASI + ;; Signature: (param clock_id precision return_ptr) (result errno) + (import "wasi_snapshot_preview1" "clock_time_get" + (func $clock_time_get (param i32 i64 i32) (result i32)) + ) + + (memory 1) + (export "memory" (memory 0)) + + (func $finish (result i32) + ;; We will store the timestamp (a 64-bit integer) at address 0. + ;; No setup required in memory beforehand! + + ;; Call the function + (call $clock_time_get + (i32.const 0) ;; clock_id: 0 = Realtime (Wallclock) + (i64.const 1000) ;; precision: 1000ns (hint to OS) + (i32.const 0) ;; result_ptr: Write the time to address 0 + ) + + ;; The function returns an 'errno' (error code). + ;; 0 = Success. Anything else = Error. + + ;; Check if errno (top of stack) is 0 + i32.eqz + if (result i32) + ;; Success! The time is now stored in heap[0..8]. + ;; We return 1 as requested. + i32.const 1 + else + ;; Failed (maybe WASI is disabled or clock is missing) + i32.const -1 + end + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/wasi_print.wat b/src/test/app/wasm_fixtures/wat/wasi_print.wat new file mode 100644 index 00000000000..18e8a088f48 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/wasi_print.wat @@ -0,0 +1,59 @@ +(module + ;; Import WASI fd_write + ;; Signature: (fd, iovs_ptr, iovs_len, nwritten_ptr) -> errno + (import "wasi_snapshot_preview1" "fd_write" + (func $fd_write (param i32 i32 i32 i32) (result i32)) + ) + + (memory 1) + (export "memory" (memory 0)) + + ;; --- DATA SEGMENTS --- + + ;; 1. The String Data "Hello\n" placed at offset 16 + ;; We assume offset 0-16 is reserved for the IOVec struct + (data (i32.const 16) "Hello\n") + + ;; 2. The IO Vector (struct iovec) placed at offset 0 + ;; Structure: { buf_ptr: u32, buf_len: u32 } + + ;; Field 1: buf_ptr = 16 (Location of "Hello\n") + ;; Encoded in little-endian: 10 00 00 00 + (data (i32.const 0) "\10\00\00\00") + + ;; Field 2: buf_len = 6 (Length of "Hello\n") + ;; Encoded in little-endian: 06 00 00 00 + (data (i32.const 4) "\06\00\00\00") + + (func $finish (result i32) + (local $nwritten_ptr i32) + + ;; We will ask WASI to write the "number of bytes written" to address 24 + ;; (safely after our string data) + i32.const 24 + local.set $nwritten_ptr + + ;; Call fd_write + (call $fd_write + (i32.const 1) ;; fd: 1 = STDOUT + (i32.const 0) ;; iovs_ptr: Address 0 (where we defined the struct) + (i32.const 1) ;; iovs_len: We are passing 1 vector + (local.get $nwritten_ptr) ;; nwritten_ptr: Address 24 + ) + + ;; The function returns an 'errno' (i32). + ;; 0 means Success. + + ;; Check if errno == 0 + i32.eqz + if (result i32) + ;; Success: Return 1 + i32.const 1 + else + ;; Failure: Return -1 + i32.const -1 + end + ) + + (export "finish" (func $finish)) +) From 397bc8781ed2a7841f1a098b1a779124868a458e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 6 Jan 2026 14:27:46 -0500 Subject: [PATCH 134/212] fix more merge issues --- cfg/xrpld-example.cfg | 6 +++--- src/xrpld/app/misc/NetworkOPs.cpp | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cfg/xrpld-example.cfg b/cfg/xrpld-example.cfg index c57d8d8e6fc..b8ba33fec72 100644 --- a/cfg/xrpld-example.cfg +++ b/cfg/xrpld-example.cfg @@ -1296,7 +1296,7 @@ # consumed by a single transaction. The gas limit is used to prevent # transactions from consuming too many resources. # -# If this parameter is unspecified, rippled will use an internal +# If this parameter is unspecified, xrpld will use an internal # default. Don't change this without understanding the consequences. # # Example: @@ -1308,7 +1308,7 @@ # bytes. The size limit is used to prevent extensions from consuming # too many resources. # -# If this parameter is unspecified, rippled will use an internal +# If this parameter is unspecified, xrpld will use an internal # default. Don't change this without understanding the consequences. # # Example: @@ -1318,7 +1318,7 @@ # # The gas price is the conversion between WASM gas and its price in drops. # -# If this parameter is unspecified, rippled will use an internal +# If this parameter is unspecified, xrpld will use an internal # default. Don't change this without understanding the consequences. # # Example: diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index e29eedb3360..34315ae6c69 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -4236,6 +4236,7 @@ NetworkOPsImp::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult[jss::fee_base] = lpClosed->fees().base.jsonClipped(); jvResult[jss::reserve_base] = lpClosed->fees().reserve.jsonClipped(); jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped(); + jvResult[jss::network_id] = app_.config().NETWORK_ID; if (lpClosed->rules().enabled(featureSmartEscrow)) { jvResult[jss::extension_compute] = From 61b2fe4f64d1e42a3f2c9caa12ab42e1e796270d Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 6 Jan 2026 17:58:22 -0500 Subject: [PATCH 135/212] fix test --- src/test/app/EscrowSmart_test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 497b4847f89..1ff82dff408 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -13,7 +13,7 @@ #include #include -namespace ripple { +namespace xrpl { namespace test { struct EscrowSmart_test : public beast::unit_test::suite @@ -1006,7 +1006,7 @@ struct EscrowSmart_test : public beast::unit_test::suite } }; -BEAST_DEFINE_TESTSUITE(EscrowSmart, app, ripple); +BEAST_DEFINE_TESTSUITE(EscrowSmart, app, xrpl); } // namespace test -} // namespace ripple +} // namespace xrpl From f57f67a8ae3eda930eeed101e2ecab85c00f606b Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 7 Jan 2026 11:51:58 -0500 Subject: [PATCH 136/212] infinite loop test (#6064) --- src/test/app/Wasm_test.cpp | 14 ++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 16 ++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 2 ++ src/test/app/wasm_fixtures/infiniteLoop.c | 8 ++++++++ 4 files changed, 40 insertions(+) create mode 100644 src/test/app/wasm_fixtures/infiniteLoop.c diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index e6e39019581..59961fded8b 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -467,6 +467,20 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(countSubstr(s, "exception: failure") > 0); } + { // infinite loop + auto const wasmStr = boost::algorithm::unhex(infiniteLoopWasmHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + std::string const funcName("loop"); + TestHostFunctions hfs(env, 0); + + // infinite loop should be caught and fail + auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); + if (BEAST_EXPECT(!re.has_value())) + { + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + } + { // expected import not provided auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6a6ae2e686e..20b98f8647e 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1208,3 +1208,19 @@ extern std::string const wasiPrintHex = "656d6f727902000666696e69736800010a1d011b01017f4118210041014100410120001000" "45047f410105417f0b0b0b1e030041100b0648656c6c6f0a0041000b04100000000041040b" "0406000000"; + +extern std::string const infiniteLoopWasmHex = + "0061736d010000000108026000006000017f030302000105030100020638097f004180080b" + "7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080" + "080b7f0041000b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c" + "5f63746f72730000046c6f6f7000010c5f5f64736f5f68616e646c6503000a5f5f64617461" + "5f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f" + "5f676c6f62616c5f6261736503040b5f5f686561705f6261736503050a5f5f686561705f65" + "6e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f6261736503080a27" + "0202000b220041fc87044100360200034041fc870441fc870428020041016a3602000c000b" + "000b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31" + "392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c" + "766d2f6c6c766d2d70726f6a65637420616234623561326462353832393538616631656533" + "303861373930636664623432626432343732302900490f7461726765745f66656174757265" + "73042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" + "6e63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index cb4f6e69d65..431ee612e71 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -64,3 +64,5 @@ extern std::string const trapFuncSigMismatchHex; extern std::string const wasiGetTimeHex; extern std::string const wasiPrintHex; + +extern std::string const infiniteLoopWasmHex; diff --git a/src/test/app/wasm_fixtures/infiniteLoop.c b/src/test/app/wasm_fixtures/infiniteLoop.c new file mode 100644 index 00000000000..037a843cac3 --- /dev/null +++ b/src/test/app/wasm_fixtures/infiniteLoop.c @@ -0,0 +1,8 @@ +int +loop() +{ + int volatile x = 0; + while (1) + x++; + return x; +} From 2c30e4119105e0e15218e27a408cbf243b3ab64f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 7 Jan 2026 16:50:29 -0500 Subject: [PATCH 137/212] use the develop hashes --- .github/workflows/reusable-build-test-config.yml | 2 +- .github/workflows/upload-conan-deps.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index dff0a1c9d57..575984162ef 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -100,7 +100,7 @@ jobs: uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Prepare runner - uses: XRPLF/actions/.github/actions/prepare-runner@ff9f8f649df5855ffe1a1ae715df43e51807f2e0 + uses: XRPLF/actions/prepare-runner@2ece4ec6ab7de266859a6f053571425b2bd684b6 with: disable_ccache: ${{ !inputs.ccache_enabled }} diff --git a/.github/workflows/upload-conan-deps.yml b/.github/workflows/upload-conan-deps.yml index 3f5e8a324e7..8a9993d37ac 100644 --- a/.github/workflows/upload-conan-deps.yml +++ b/.github/workflows/upload-conan-deps.yml @@ -70,7 +70,7 @@ jobs: uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0 - name: Prepare runner - uses: XRPLF/actions/.github/actions/prepare-runner@ff9f8f649df5855ffe1a1ae715df43e51807f2e0 + uses: XRPLF/actions/prepare-runner@2ece4ec6ab7de266859a6f053571425b2bd684b6 with: disable_ccache: true From d5c53dcfd2cd4e26d14604ebff8d67d9e16d3211 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:14:49 -0500 Subject: [PATCH 138/212] fix Uninitialized import entries lead to undefined behavior During WASM Instantiation --- src/xrpld/app/wasm/detail/WasmiVM.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 82c502f63fc..40ec5f81b6f 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -415,6 +415,7 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) "/" + std::to_string(importTypes.vec_.size), nullptr, j_); + throw std::runtime_error("Missing imports"); } return wimports; From 9ed60b45f8547078aec8a339a209b84d4ae447bb Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Thu, 8 Jan 2026 16:15:36 -0500 Subject: [PATCH 139/212] section corruption unit tests --- src/test/app/Wasm_test.cpp | 24 +++++ src/test/app/wasm_fixtures/fixtures.cpp | 116 ++++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 11 +++ 3 files changed, 151 insertions(+) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 59961fded8b..367afbafd0a 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -828,6 +828,28 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(runFinishFunction(wasiPrintHex).has_value() == false); } + void + testWasmSectionCorruption() + { + testcase("Wasm Section Corruption tests"); + BEAST_EXPECT(runFinishFunction(badMagicNumberHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(badVersionNumberHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(lyingHeaderHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(neverEndingNumberHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(vectorLieHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(sectionOrderingHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(ghostPayloadHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(junkAfterSectionHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(invalidSectionIdHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(localVariableBombHex).has_value() == false); + } + void run() override { @@ -854,6 +876,8 @@ struct Wasm_test : public beast::unit_test::suite testWasmProposal(); testWasmTrap(); testWasmWasi(); + testWasmSectionCorruption(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 20b98f8647e..aa30cf08e78 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1209,6 +1209,122 @@ extern std::string const wasiPrintHex = "45047f410105417f0b0b0b1e030041100b0648656c6c6f0a0041000b04100000000041040b" "0406000000"; +// The following several wasm hex strings are for testing wasm section +// corruption cases. They are illegal hence do not have corresponding +// rust or wat sources. +// Wasm code magic number is "0061736d", and the only valid version is 1. + +extern std::string const badMagicNumberHex = "1061736d01000000"; +extern std::string const badVersionNumberHex = "0061736d02000000"; + +// Corruption Test: lyingHeader +// Scenario: A section declares it is 2GB long, but the file ends immediately. +// Attack: Buffer pre-allocation DoS (OOM). +// # Magic (00 61 73 6d) + Version (01 00 00 00) +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Type Section (ID 1) +// # Size: LEB128 encoded 2GB (0x80 0x80 0x80 0x80 0x08) +// data += b'\x01\x80\x80\x80\x80\x08' +extern std::string const lyingHeaderHex = "0061736d01000000018080808008"; + +// Corruption Test: neverEndingNumber +// Scenario: An LEB128 integer that never has a stop bit (byte < 0x80). +// Attack: Infinite loop in parser or read out of bounds. +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Type Section (ID 1), Size 5 +// data += b'\x01\x05' +// # Vector count: Infinite stream of 0x80 (100 bytes) +// data += b'\x80' * 100 +extern std::string const neverEndingNumberHex = + "0061736d010000000105808080808080808080808080808080808080808080808080808080" + "80808080808080808080808080808080808080808080808080808080808080808080808080" + "808080808080808080808080808080808080808080808080808080808080808080808080"; + +// Corruption Test: vectorLie +// Scenario: A vector declares it has 4 billion items, but provides none. +// Attack: Vector pre-allocation DoS (OOM). +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Type Section (ID 1) +// # Size 5 (just enough for the count bytes) +// data += b'\x01\x05' +// # Vector Count: 0xFF 0xFF 0xFF 0xFF 0x0F (4,294,967,295 items) +// data += b'\xff\xff\xff\xff\x0f' +// # No actual items follow... +extern std::string const vectorLieHex = "0061736d010000000105ffffffff0f"; + +// Corruption Test: sectionOrdering +// Scenario: Sections appear out of order +// (Code section before Function section). +// Attack: Parser state confusion / potential null pointer deref. +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Code Section (ID 10) - usually last +// # Size 2, Count 0 +// data += b'\x0a\x02\x00\x0b' +// # Function Section (ID 3) - usually 3rd +// data += b'\x03\x02\x00\x00' +extern std::string const sectionOrderingHex = + "0061736d010000000a02000b03020000"; + +// Corruption Test: ghostPayload +// Scenario: Valid headers, but file is truncated in the middle of a payload. +// Attack: Read out of bounds panic. +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Type Section (ID 1), Size 10 +// data += b'\x01\x0a' +// # Content: Count 1 +// data += b'\x01' +// # Start of a type definition (0x60 = func) +// data += b'\x60' +// # File ends abruptly here (missing params/results) +extern std::string const ghostPayloadHex = "0061736d01000000010a0160"; + +// Corruption Test: junkAfterSection +// Scenario: Section declares size X, but logical content finishes at X-5. +// Attack: Validation bypass if parser stops early, +// or panic if strict check missing. +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Type Section (ID 1), Size 10 bytes +// data += b'\x01\x0a' +// # Real content: Count 1, (func -> void) = 4 bytes +// # \x01 (count) \x60 (func) \x00 (0 params) \x00 (0 results) +// data += b'\x01\x60\x00\x00' +// # Remaining 6 bytes are junk padding within the section size +// data += b'\x00' * 6 +extern std::string const junkAfterSectionHex = + "0061736d01000000010a01600000000000000000"; + +// Corruption Test: invalidSectionId +// Scenario: A section ID that doesn't exist (0xFF). +// Attack: Default case handling / unhandled enum variant. +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # Section ID 0xFF, Size 1 +// data += b'\xff\x01\x00' +extern std::string const invalidSectionIdHex = "0061736d01000000ff0100"; + +// Corruption Test: localVariableBomb +// Scenario: A function declares 4 billion local variables. +// Attack: Stack Overflow / OOM during function init (memset). +// data = b'\x00\x61\x73\x6d\x01\x00\x00\x00' +// # 1. Type Section: (func) -> () +// data += b'\x01\x04\x01\x60\x00\x00' +// # 3. Function Section: 1 function of type 0 +// data += b'\x03\x02\x01\x00' +// # 10. Code Section +// # ID 10, Size 15 (estimated), Count 1 +// data += b'\x0a\x0f\x01' +// # Function Body Size: 13 bytes +// data += b'\x0d' +// # Local Declarations Count: 1 entry +// data += b'\x01' +// # The Bomb: 4,294,967,295 locals of type i32 +// # Count: 0xFF 0xFF 0xFF 0xFF 0x0F +// # Type: 0x7F (i32) +// data += b'\xff\xff\xff\xff\x0f\x7f' +// # Instruction: end (0x0b) +// data += b'\x0b' +extern std::string const localVariableBombHex = + "0061736d01000000010401600000030201000a0f010d01ffffffff0f7f0b"; + extern std::string const infiniteLoopWasmHex = "0061736d010000000108026000006000017f030302000105030100020638097f004180080b" "7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 431ee612e71..ef1ecd9de5c 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -65,4 +65,15 @@ extern std::string const trapFuncSigMismatchHex; extern std::string const wasiGetTimeHex; extern std::string const wasiPrintHex; +extern std::string const badMagicNumberHex; +extern std::string const badVersionNumberHex; +extern std::string const lyingHeaderHex; +extern std::string const neverEndingNumberHex; +extern std::string const vectorLieHex; +extern std::string const sectionOrderingHex; +extern std::string const ghostPayloadHex; +extern std::string const junkAfterSectionHex; +extern std::string const invalidSectionIdHex; +extern std::string const localVariableBombHex; + extern std::string const infiniteLoopWasmHex; From 91f3d51f3d296ffa41ae70ea23578e3adfefaf85 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Fri, 9 Jan 2026 11:38:54 -0500 Subject: [PATCH 140/212] fix start function loop --- src/test/app/Wasm_test.cpp | 33 +++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 4 +++ src/test/app/wasm_fixtures/fixtures.h | 1 + src/test/app/wasm_fixtures/wat/start_loop.wat | 22 +++++++++++++ src/xrpld/app/wasm/WasmiVM.h | 4 +++ src/xrpld/app/wasm/detail/WasmiVM.cpp | 33 +++++++++++++++---- 6 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 src/test/app/wasm_fixtures/wat/start_loop.wat diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 367afbafd0a..dba390c93e4 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -850,6 +850,38 @@ struct Wasm_test : public beast::unit_test::suite runFinishFunction(localVariableBombHex).has_value() == false); } + void + testStartFunctionLoop() + { + testcase("infinite loop in start function"); + + using namespace test::jtx; + Env env(*this); + + auto wasmStr = boost::algorithm::unhex(startLoopHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + TestLedgerDataProvider ledgerDataProvider(env); + ImportVec imports; + + auto& engine = WasmEngine::instance(); + auto checkRes = engine.check( + wasm, "finish", {}, imports, &ledgerDataProvider, env.journal); + BEAST_EXPECTS( + checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); + + auto re = engine.run( + wasm, + ESCROW_FUNCTION_NAME, + {}, + imports, + &ledgerDataProvider, + 1'000'000, + env.journal); + BEAST_EXPECTS( + re.error() == tecFAILED_PROCESSING, + std::to_string(TERtoInt(re.error()))); + } + void run() override { @@ -878,6 +910,7 @@ struct Wasm_test : public beast::unit_test::suite testWasmWasi(); testWasmSectionCorruption(); + testStartFunctionLoop(); // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index aa30cf08e78..740638ba610 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1340,3 +1340,7 @@ extern std::string const infiniteLoopWasmHex = "303861373930636664623432626432343732302900490f7461726765745f66656174757265" "73042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" "6e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const startLoopHex = + "0061736d010000000108026000006000017f03030200010712020573746172740000066669" + "6e69736800010801000a0e02070003400c000b0b040041010b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index ef1ecd9de5c..7da8fcb4dc6 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -77,3 +77,4 @@ extern std::string const invalidSectionIdHex; extern std::string const localVariableBombHex; extern std::string const infiniteLoopWasmHex; +extern std::string const startLoopHex; diff --git a/src/test/app/wasm_fixtures/wat/start_loop.wat b/src/test/app/wasm_fixtures/wat/start_loop.wat new file mode 100644 index 00000000000..c00d173ea45 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/start_loop.wat @@ -0,0 +1,22 @@ +(module + ;; Function 1: The Infinite Loop + (func $run_forever + (loop $infinite + br $infinite + ) + ) + + ;; Function 2: Finish + (func $finish (result i32) + i32.const 1 + ) + + ;; 1. EXPORT the functions (optional, if you want to call them later) + (export "start" (func $run_forever)) + (export "finish" (func $finish)) + + ;; 2. The special start section + ;; This tells the VM: "Run function $run_forever immediately + ;; when this module is instantiated." + (start $run_forever) +) diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index 06e18ef29e7..c39b577c46f 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -179,6 +179,10 @@ struct ModuleWrapper FuncInfo getFunc(std::string_view funcName) const; + + wasm_functype_t* + getFuncType(std::string_view funcName) const; + wmem getMem() const; diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 40ec5f81b6f..016adeac5a6 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -249,9 +249,9 @@ ModuleWrapper::ModuleWrapper( : module_(init(s, wasmBin, j)), j_(j) { wasm_module_exports(module_.get(), &exportTypes_.vec_); + auto wimports = buildImports(s, imports); if (instantiate) { - auto wimports = buildImports(s, imports); addInstance(s, wimports); } } @@ -427,6 +427,26 @@ ModuleWrapper::getFunc(std::string_view funcName) const return instanceWrap_.getFunc(funcName, exportTypes_); } +wasm_functype_t* +ModuleWrapper::getFuncType(std::string_view funcName) const +{ + for (size_t i = 0; i < exportTypes_.vec_.size; i++) + { + auto const* exp_type(exportTypes_.vec_.data[i]); + wasm_name_t const* name = wasm_exporttype_name(exp_type); + wasm_externtype_t const* exn_type = wasm_exporttype_type(exp_type); + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC && + funcName == std::string_view(name->data, name->size)) + { + return wasm_externtype_as_functype( + const_cast(exn_type)); + } + } + + throw std::runtime_error( + "can't find function <" + std::string(funcName) + ">"); +} + wmem ModuleWrapper::getMem() const { @@ -889,13 +909,14 @@ WasmiEngine::checkHlp( if (wasmCode.empty()) throw std::runtime_error("empty nodule"); - int const m = addModule(wasmCode, true, -1, imports); - if ((m < 0) || !moduleWrap_ || !moduleWrap_->instanceWrap_) - throw std::runtime_error("no instance"); // LCOV_EXCL_LINE + int const m = addModule(wasmCode, false, -1, imports); + if ((m < 0) || !moduleWrap_) + throw std::runtime_error("no module"); // LCOV_EXCL_LINE // Looking for a func and compare parameter types - auto const f = getFunc(!funcName.empty() ? funcName : "_start"); - auto const* ftp = wasm_functype_params(f.second); + auto const f = + moduleWrap_->getFuncType(!funcName.empty() ? funcName : "_start"); + auto const* ftp = wasm_functype_params(f); auto const p = convertParams(params); if (int const comp = compareParamTypes(ftp, p); comp >= 0) From 6ab15f8377019b8b29fd0a3035d766040a6ca695 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:49:09 -0500 Subject: [PATCH 141/212] Add checks to allocate (#6185) --- src/test/app/Wasm_test.cpp | 77 +++++++++++++++++++++++++ src/test/app/wasm_fixtures/bad_alloc.c | 27 +++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 18 ++++++ src/test/app/wasm_fixtures/fixtures.h | 2 + src/xrpld/app/wasm/detail/WasmiVM.cpp | 19 ++++-- 5 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 src/test/app/wasm_fixtures/bad_alloc.c diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index dba390c93e4..95986f5a767 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -882,6 +882,81 @@ struct Wasm_test : public beast::unit_test::suite std::to_string(TERtoInt(re.error()))); } + void + testBadAlloc() + { + testcase("Wasm Bad Alloc"); + + // bad_alloc.c + auto wasmStr = boost::algorithm::unhex(badAllocHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider hf(env); + + // ImportVec imports; + uint8_t buf1[8] = {7, 8, 9, 10, 11, 12, 13, 14}; + { // forged "allocate" return valid address + std::vector params = { + {.type = WT_U8V, + .of = {.u8v = {.d = buf1, .sz = sizeof(buf1)}}}}; + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, "test", params, {}, &hf, 1'000'000, env.journal); + if (BEAST_EXPECT(re)) + { + BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 10, std::to_string(re->result)); + } + } + + { // return 0 whithout calling wasm + std::vector params = { + {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; + auto& engine = WasmEngine::instance(); + auto re = engine.run( + wasm, "test", params, {}, &hf, 1'000'000, env.journal); + BEAST_EXPECT(!re) && + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + + { // forged "allocate" return 8Mb (which is more than memory limit) + std::vector params = { + {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; + auto& engine = WasmEngine::instance(); + auto re = engine.run( + wasm, "test", params, {}, &hf, 1'000'000, env.journal); + BEAST_EXPECT(!re) && + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + + { // forged "allocate" return 0 + std::vector params = { + {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; + auto& engine = WasmEngine::instance(); + auto re = engine.run( + wasm, "test", params, {}, &hf, 1'000'000, env.journal); + BEAST_EXPECT(!re) && + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + + { // forged "allocate" return -1 + std::vector params = { + {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; + auto& engine = WasmEngine::instance(); + auto re = engine.run( + wasm, "test", params, {}, &hf, 1'000'000, env.journal); + + BEAST_EXPECT(!re) && + BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + } + + env.close(); + } + void run() override { @@ -911,6 +986,8 @@ struct Wasm_test : public beast::unit_test::suite testWasmSectionCorruption(); testStartFunctionLoop(); + testBadAlloc(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/bad_alloc.c b/src/test/app/wasm_fixtures/bad_alloc.c new file mode 100644 index 00000000000..9a0233e8a55 --- /dev/null +++ b/src/test/app/wasm_fixtures/bad_alloc.c @@ -0,0 +1,27 @@ +#include + +char buf[1024]; + +void* +allocate(int sz) +{ + if (!sz) + return 0; + + if (sz == 1) + return ((void*)(8 * 1024 * 1024)); + if (sz == 2) + return 0; + if (sz == 3) + return ((void*)(0xFFFFFFFF)); + + return &buf[sz]; +} + +int32_t +test(char* p, int32_t sz) +{ + if (!sz) + return 0; + return p[0]; +} diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 740638ba610..97143f1f615 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1344,3 +1344,21 @@ extern std::string const infiniteLoopWasmHex = extern std::string const startLoopHex = "0061736d010000000108026000006000017f03030200010712020573746172740000066669" "6e69736800010801000a0e02070003400c000b0b040041010b"; + +extern std::string const badAllocHex = + "0061736d01000000010f0360000060017f017f60027f7f017f030403000102050301000206" + "3e0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090040b7f004180" + "080b7f00418090040b7f00418080080b7f0041000b7f0041010b07b9010e066d656d6f7279" + "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63617465000103627566" + "0300047465737400020c5f5f64736f5f68616e646c6503010a5f5f646174615f656e640302" + "0b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f676c6f6261" + "6c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e6403070d5f" + "5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a420302000b2c01" + "017f024002400240024020000e0403000301020b41808080040f0b417f0f0b20004180086a" + "21010b20010b1000200145044041000f0b20002c00000b007f0970726f647563657273010c" + "70726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b2028" + "68747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420" + "61623462356132646235383239353861663165653330386137393063666462343262643234" + "3732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62" + "616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c7469" + "76616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 7da8fcb4dc6..32f71883f8b 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -78,3 +78,5 @@ extern std::string const localVariableBombHex; extern std::string const infiniteLoopWasmHex; extern std::string const startLoopHex; + +extern std::string const badAllocHex; diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 016adeac5a6..9d3dded78b0 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -951,13 +951,24 @@ WasmiEngine::getRT(int m, int i) int32_t WasmiEngine::allocate(int32_t sz) { + if (sz <= 0) + throw std::runtime_error( + "can't allocate memory, " + std::to_string(sz) + " bytes"); + auto res = call<1>(W_ALLOC, static_cast(sz)); - if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32) || - !res.r.vec_.data[0].of.i32) + if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32)) throw std::runtime_error( - "can't allocate memory, " + std::to_string(sz) + " bytes"); - return res.r.vec_.data[0].of.i32; + "can't allocate memory, " + std::to_string(sz) + + " bytes"); // LCOV_EXCL_LINE + + int32_t const p = res.r.vec_.data[0].of.i32; + auto const mem = getMem(); + if (p <= 0 || p + sz > mem.s) + throw std::runtime_error( + "invalid memory allocation, " + std::to_string(sz) + " bytes"); + + return p; } wasm_trap_t* From d83ec96848063fc88d13b2392f18123257439698 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 12 Jan 2026 13:36:02 -0500 Subject: [PATCH 142/212] Switch to wasmi v1.0.6 (#6204) --- conan.lock | 2 +- conanfile.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conan.lock b/conan.lock index 3215456b63a..64f1b0b046d 100644 --- a/conan.lock +++ b/conan.lock @@ -3,7 +3,7 @@ "requires": [ "zlib/1.3.1#b8bc2603263cf7eccbd6e17e66b0ed76%1756234269.497", "xxhash/0.8.3#681d36a0a6111fc56e5e45ea182c19cc%1756234289.683", - "wasmi/0.42.1#2a96357d4e6bf40dfe201106d849c24f%1764802092.014", + "wasmi/1.0.6#407c9db14601a8af1c7dd3b388f3e4cd%1768164779.349", "sqlite3/3.49.1#8631739a4c9b93bd3d6b753bac548a63%1756234266.869", "soci/4.0.3#a9f8d773cd33e356b5879a4b0564f287%1756234262.318", "snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246", diff --git a/conanfile.py b/conanfile.py index 797e5beee5a..a786b4ddbdc 100644 --- a/conanfile.py +++ b/conanfile.py @@ -35,7 +35,7 @@ class Xrpl(ConanFile): "openssl/3.5.4", "secp256k1/0.7.0", "soci/4.0.3", - "wasmi/0.42.1", + "wasmi/1.0.6", "zlib/1.3.1", ] From 1c812a6c4d07617c2bd61fa0674c1e592abe7de3 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Mon, 12 Jan 2026 22:04:33 -0500 Subject: [PATCH 143/212] disable Wasm features added in Wasmi 1.0, and fix unit test fuel cost due to Wasmi 1.0 fuel changes (#6173) * disable 4 more wasm features * unit tests for disabled Wasmi 1.0 features * fix unit tests failed due to fuel changes * rearrange wasm feature unit tests * fix gas costs * Update src/test/app/wasm_fixtures/wat/custom_page_sizes.wat --------- Co-authored-by: Mayukha Vadari --- src/test/app/Wasm_test.cpp | 42 +++++++++++-------- src/test/app/wasm_fixtures/fixtures.cpp | 16 +++++++ src/test/app/wasm_fixtures/fixtures.h | 4 ++ .../wasm_fixtures/wat/custom_page_sizes.wat | 13 ++++++ src/test/app/wasm_fixtures/wat/memory64.wat | 21 ++++++++++ .../app/wasm_fixtures/wat/multi_memory.wat | 16 +++++++ .../app/wasm_fixtures/wat/wide_arithmetic.wat | 22 ++++++++++ src/xrpld/app/wasm/detail/WasmiVM.cpp | 4 ++ 8 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 src/test/app/wasm_fixtures/wat/custom_page_sizes.wat create mode 100644 src/test/app/wasm_fixtures/wat/memory64.wat create mode 100644 src/test/app/wasm_fixtures/wat/multi_memory.wat create mode 100644 src/test/app/wasm_fixtures/wat/wide_arithmetic.wat diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 95986f5a767..543f57cccd1 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -95,7 +95,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 3, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 59, std::to_string(re->cost)); } } @@ -183,7 +183,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 38, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 151, std::to_string(re->cost)); } env.close(); @@ -196,7 +196,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 76, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 190, std::to_string(re->cost)); } } @@ -214,7 +214,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 696, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 1'137, std::to_string(re->cost)); } } @@ -233,7 +233,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 145'573, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 151'155, std::to_string(re->cost)); } } @@ -258,7 +258,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2'701'528, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 2'886'069, std::to_string(re->cost)); } } @@ -294,7 +294,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 842, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 25'503, std::to_string(re->cost)); } env.close(); @@ -328,7 +328,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); } env.close(); @@ -377,7 +377,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); } } @@ -388,7 +388,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 40'102, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); } } @@ -410,7 +410,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'012, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); } } @@ -432,7 +432,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 5'012, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); } } @@ -570,11 +570,11 @@ struct Wasm_test : public beast::unit_test::suite std::vector const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hf(env, 0); - auto re = runEscrowWasm(wasm, hf, funcName, {}, 100'000); + auto re = runEscrowWasm(wasm, hf, funcName, {}, 200'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 97'356, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 110'699, std::to_string(re->cost)); } env.close(); } @@ -589,7 +589,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2'054, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 4'259, std::to_string(re->cost)); } env.close(); } @@ -703,7 +703,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 154'545; + auto const allowance = 189'508; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) @@ -804,6 +804,14 @@ struct Wasm_test : public beast::unit_test::suite runFinishFunction(proposalTailCallHex).has_value() == false); BEAST_EXPECT( runFinishFunction(proposalExtendedConstHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalMultiMemoryHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalCustomPageSizesHex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalMemory64Hex).has_value() == false); + BEAST_EXPECT( + runFinishFunction(proposalWideArithmeticHex).has_value() == false); } void @@ -909,7 +917,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re)) { BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 10, std::to_string(re->result)); + BEAST_EXPECTS(re->cost == 430, std::to_string(re->cost)); } } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 97143f1f615..493d5aca8a8 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1176,6 +1176,22 @@ extern std::string const proposalExtendedConstHex = "0061736d010000000105016000017f030201000609017f00410a41206a0b070a010666696e" "69736800000a090107002300412a460b"; +extern std::string const proposalMultiMemoryHex = + "0061736d010000000105016000017f0302010005050200000001070a010666696e69736800" + "000a060104003f010b"; + +extern std::string const proposalCustomPageSizesHex = + "0061736d010000000105016000017f0302010005040108010a070a010666696e6973680000" + "0a0601040041010b0010046e616d65010901000666696e697368"; + +extern std::string const proposalMemory64Hex = + "0061736d010000000105016000017f030201000503010401070a010666696e69736800000a" + "10010e004200412a3a00003f004201510b0010046e616d65010901000666696e697368"; + +extern std::string const proposalWideArithmeticHex = + "0061736d010000000105016000017f03020100070a010666696e69736800000a0e010c0042" + "014202fc161a1a41010b0010046e616d65010901000666696e697368"; + extern std::string const trapDivideBy0Hex = "0061736d010000000105016000017f03020100070a010666696e69736800000a0c010a0041" "2a41006d1a41010b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 32f71883f8b..bb7a80f7918 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -55,6 +55,10 @@ extern std::string const proposalBulkMemoryHex; extern std::string const proposalRefTypesHex; extern std::string const proposalTailCallHex; extern std::string const proposalExtendedConstHex; +extern std::string const proposalMultiMemoryHex; +extern std::string const proposalCustomPageSizesHex; +extern std::string const proposalMemory64Hex; +extern std::string const proposalWideArithmeticHex; extern std::string const trapDivideBy0Hex; extern std::string const trapIntOverflowHex; diff --git a/src/test/app/wasm_fixtures/wat/custom_page_sizes.wat b/src/test/app/wasm_fixtures/wat/custom_page_sizes.wat new file mode 100644 index 00000000000..a9d404fadc0 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/custom_page_sizes.wat @@ -0,0 +1,13 @@ +(module + ;; Define a memory with 1 initial page. + ;; CRITICAL: We explicitly set the page size to 1 kilobyte. + ;; Standard Wasm implies (pagesize 65536). + (memory 1 (pagesize 1024)) + + (func $finish (result i32) + ;; If this module instantiates, the runtime accepted the custom page size. + i32.const 1 + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/memory64.wat b/src/test/app/wasm_fixtures/wat/memory64.wat new file mode 100644 index 00000000000..02c8f4f5901 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/memory64.wat @@ -0,0 +1,21 @@ +(module + ;; Define a 64-bit memory (index type i64) + ;; Start with 1 page. + (memory i64 1) + + (func $finish (result i32) + ;; 1. Perform a store using a 64-bit address. + ;; Even if the value is small (0), the type MUST be i64. + i64.const 0 ;; Address (64-bit) + i32.const 42 ;; Value (32-bit) + i32.store8 ;; Opcode doesn't change, but validation rules do. + + ;; 2. check memory size + ;; memory.size now returns an i64. + memory.size + i64.const 1 + i64.eq ;; Returns i32 (1 if true) + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/multi_memory.wat b/src/test/app/wasm_fixtures/wat/multi_memory.wat new file mode 100644 index 00000000000..c2f36e253ff --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/multi_memory.wat @@ -0,0 +1,16 @@ +(module + ;; Memory 0: Index 0 (Empty) + (memory 0) + + ;; Memory 1: Index 1 (Size 1 page) + ;; If multi-memory is disabled, this line causes a validation error (max 1 memory). + (memory 1) + + (func $finish (result i32) + ;; Query size of Memory Index 1. + ;; Should return 1 (success). + memory.size 1 + ) + + (export "finish" (func $finish)) +) diff --git a/src/test/app/wasm_fixtures/wat/wide_arithmetic.wat b/src/test/app/wasm_fixtures/wat/wide_arithmetic.wat new file mode 100644 index 00000000000..cd796162ae1 --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/wide_arithmetic.wat @@ -0,0 +1,22 @@ +(module + (func $finish (result i32) + ;; 1. Push operands + i64.const 1 + i64.const 2 + + ;; 2. Execute Wide Multiplication + ;; If the feature is DISABLED, the parser/validator will trap here + ;; with "unknown instruction" or "invalid opcode". + ;; Input: [i64, i64] -> Output: [i64, i64] + i64.mul_wide_u + + ;; 3. Clean up the stack (drop the two i64 results) + drop + drop + + ;; 4. Return 1 to signal that validation passed + i32.const 1 + ) + + (export "finish" (func $finish)) +) diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 9d3dded78b0..fa61ec2679f 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -510,6 +510,10 @@ WasmiEngine::init() wasmi_config_wasm_tail_call_set(config, false); wasmi_config_wasm_extended_const_set(config, false); wasmi_config_floats_set(config, false); + wasmi_config_wasm_multi_memory_set(config, false); + wasmi_config_wasm_custom_page_sizes_set(config, false); + wasmi_config_wasm_memory64_set(config, false); + wasmi_config_wasm_wide_arithmetic_set(config, false); return std::unique_ptr( wasm_engine_new_with_config(config), &wasm_engine_delete); From 81cbc9192704bfcc2bf405c77ce73de089db1006 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:38:48 -0500 Subject: [PATCH 144/212] Fix traces (#6127) * Fix traces * More tests for codecov * Review fixes * trace float test * Fix return value for traces * Remove SuiteJournalSink2 * Add explicit severity * Move logs to ApplyView * Add check for output strings * Merging fix --- src/test/app/HostFuncImpl_test.cpp | 333 ++++++++---- src/test/app/TestHostFunctions.h | 36 +- src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 32 +- src/test/app/wasm_fixtures/fixtures.cpp | 490 +++++++++--------- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 61 ++- src/xrpld/app/wasm/detail/WasmiVM.cpp | 26 +- 7 files changed, 585 insertions(+), 395 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 692b0851021..9a5326e18d0 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -62,19 +62,23 @@ static ApplyContext createApplyContext( test::jtx::Env& env, OpenView& ov, + beast::Journal j, STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) { ApplyContext ac{ - env.app(), - ov, - tx, - tesSUCCESS, - env.current()->fees().base, - tapNONE, - env.journal}; + env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, j}; return ac; } +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +{ + return createApplyContext(env, ov, env.journal, tx); +} + struct HostFuncImpl_test : public beast::unit_test::suite { void @@ -1912,24 +1916,63 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("trace"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "test trace"; - std::string data = "abc"; - auto const slice = Slice(data.data(), data.size()); - auto const result = hfs.trace(msg, slice, false); - BEAST_EXPECT(result.has_value()); - BEAST_EXPECT(result.value() == msg.size() + data.size()); + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto const result = hfs.trace(msg, slice, false); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(result.value() == msg.size() + data.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + } + + auto const resultHex = hfs.trace(msg, slice, true); + if (BEAST_EXPECT(resultHex.has_value())) + { + BEAST_EXPECT(resultHex.has_value()); + BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + auto const messages = sink.messages().str(); + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT(messages.find(hex) != std::string::npos); + } + } + + { + // logs disabled (trace < error) + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const resultHex = hfs.trace(msg, slice, true); - BEAST_EXPECT(resultHex.has_value()); - BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "test trace"; + std::string data = "abc"; + auto const slice = Slice(data.data(), data.size()); + auto const result = hfs.trace(msg, slice, false); + BEAST_EXPECT(result && *result == msg.size() + data.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); + } } void @@ -1938,19 +1981,49 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceNum"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace number"; - int64_t num = 123456789; - auto const result = hfs.traceNum(msg, num); - BEAST_EXPECT(result.has_value()); - BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + std::string msg = "trace number"; + int64_t num = 123456789; + auto const result = hfs.traceNum(msg, num); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(std::to_string(num)) != std::string::npos); + } + } + + { + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace number"; + int64_t num = 123456789; + auto const result = hfs.traceNum(msg, num); + BEAST_EXPECT(result && *result == msg.size() + sizeof(int64_t)); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); + } } void @@ -1959,22 +2032,47 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceAccount"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace account"; - // Valid account - { + std::string msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); if (BEAST_EXPECT(result.has_value())) + { BEAST_EXPECT( - result.value() == - msg.size() + toBase58(env.master.id()).size()); + result.value() == msg.size() + env.master.id().size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(env.master.human()) != std::string::npos); + } + } + + { + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + std::string msg = "trace account"; + auto const result = hfs.traceAccount(msg, env.master.id()); + BEAST_EXPECT( + result && *result == msg.size() + env.master.id().size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } @@ -1984,46 +2082,72 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("traceAmount"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kTrace}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace amount"; - STAmount amount = XRP(12345); - { - auto const result = hfs.traceAmount(msg, amount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == msg.size() + amount.getFullText().size()); - } + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + { + auto const result = hfs.traceAmount(msg, amount); + if (BEAST_EXPECT(result.has_value())) + { + BEAST_EXPECT(*result == msg.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.find(msg) != std::string::npos); + BEAST_EXPECT( + messages.find(amount.getFullText()) != + std::string::npos); + } + } - // IOU amount - Account const alice("alice"); - env.fund(XRP(1000), alice); - env.close(); - STAmount iouAmount = env.master["USD"](100); - { - auto const result = hfs.traceAmount(msg, iouAmount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - msg.size() + iouAmount.getFullText().size()); + // IOU amount + Account const alice("alice"); + env.fund(XRP(1000), alice); + env.close(); + STAmount iouAmount = env.master["USD"](100); + { + auto const result = hfs.traceAmount(msg, iouAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(*result == msg.size()); + } + + // MPT amount + { + auto const mptId = makeMptID(42, env.master.id()); + Asset mptAsset = Asset(mptId); + STAmount mptAmount(mptAsset, 123456); + auto const result = hfs.traceAmount(msg, mptAmount); + if (BEAST_EXPECT(result.has_value())) + BEAST_EXPECT(*result == msg.size()); + } } - // MPT amount { - auto const mptId = makeMptID(42, env.master.id()); - Asset mptAsset = Asset(mptId); - STAmount mptAmount(mptAsset, 123456); - auto const result = hfs.traceAmount(msg, mptAmount); - if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - msg.size() + mptAmount.getFullText().size()); + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace amount"; + STAmount amount = XRP(12345); + auto const result = hfs.traceAmount(msg, amount); + BEAST_EXPECT(result && *result == msg.size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } @@ -2058,28 +2182,51 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("FloatTrace"); using namespace test::jtx; - Env env{*this}; - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); + { + Env env{*this}; + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace float"; + std::string msg = "trace float"; - { - auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && - *result == - msg.size() + 14 /* error msg size*/ + invalid.size() * 2); + { + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); + BEAST_EXPECT( + result && + *result == msg.size() + makeSlice(invalid).size()); + } + + { + auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + BEAST_EXPECT( + result && + *result == msg.size() + makeSlice(floatMaxExp).size()); + } } { - auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); + // logs disabled + Env env(*this); + OpenView ov{*env.current()}; + test::StreamSink sink{beast::severities::kError}; + beast::Journal jlog{sink}; + ApplyContext ac = createApplyContext(env, ov, jlog); + + auto const dummyEscrow = + keylet::escrow(env.master, env.seq(env.master)); + WasmHostFunctionsImpl hfs(ac, dummyEscrow); + + std::string msg = "trace float"; + + auto const result = hfs.traceFloat(msg, makeSlice(invalid)); BEAST_EXPECT( - result && *result == msg.size() + 19 /* string represenation*/); + result && *result == msg.size() + makeSlice(invalid).size()); + auto const messages = sink.messages().str(); + BEAST_EXPECT(messages.empty()); } } diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0cb010b0e94..a7f4c8038b5 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -383,9 +383,12 @@ struct TestHostFunctions : public HostFunctions Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif if (!asHex) @@ -407,15 +410,18 @@ struct TestHostFunctions : public HostFunctions j << std::endl; #endif - return msg.size() + data.size() * (asHex ? 2 : 1); + return ret; } Expected traceNum(std::string_view const& msg, int64_t data) override { + auto const ret = msg.size() + sizeof(data); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif j << "WASM TRACE NUM: " << msg << " " << data; @@ -423,15 +429,18 @@ struct TestHostFunctions : public HostFunctions #ifdef DEBUG_OUTPUT j << std::endl; #endif - return msg.size() + sizeof(data); + return ret; } Expected traceAccount(std::string_view const& msg, AccountID const& account) override { + auto const ret = msg.size() + account.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif if (!account) @@ -440,15 +449,23 @@ struct TestHostFunctions : public HostFunctions auto const accountStr = toBase58(account); j << "WASM TRACE ACCOUNT: " << msg << " " << accountStr; - return msg.size() + accountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected traceFloat(std::string_view const& msg, Slice const& data) override { + auto const ret = msg.size() + data.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const s = floatToString(data); @@ -457,20 +474,29 @@ struct TestHostFunctions : public HostFunctions #ifdef DEBUG_OUTPUT j << std::endl; #endif - return msg.size() + s.size(); + + return ret; } Expected traceAmount(std::string_view const& msg, STAmount const& amount) override { + auto const ret = msg.size(); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); j << "WASM TRACE AMOUNT: " << msg << " " << amountStr; - return msg.size() + amountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 543f57cccd1..c61482a0573 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -703,7 +703,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 189'508; + auto const allowance = 185'974; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 4cbc7e17070..a5aa2eb6e51 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -248,7 +248,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - 47, + (message.len() + 20) as i32, "trace_account", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP @@ -261,7 +261,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - 19, + message.len() as i32, "trace_amount", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // 0 drops of XRP @@ -274,7 +274,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - 18, + message.len() as i32, "trace_amount_zero", ); @@ -307,32 +307,6 @@ pub extern "C" fn finish() -> i32 { "get_parent_ledger_hash_len_too_long", ) }); - let message = "testing trace"; - check_result( - unsafe { - host::trace_account( - message.as_ptr(), - message.len(), - account.0.as_ptr(), - account.0.len(), - ) - }, - 47, - "trace_account", - ); - let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP - check_result( - unsafe { - host::trace_amount( - message.as_ptr(), - message.len(), - amount.as_ptr(), - amount.len(), - ) - }, - 19, - "trace_amount", - ); // ######################################## // Step #3: Test getData[Type] edge cases diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 493d5aca8a8..3f339e7a0dd 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -661,251 +661,251 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020a9e2702460002402000200147" - "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" - "0220032000ac10011a0f0b418b80c000410b2000ac1001000bd426020a7f017e230041f001" - "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" - "0341b2920441c780c0004116103c200041f0006a22044200370300200041e8006a22064200" - "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" - "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" - "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" - "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" - "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" - "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" - "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" - "200028005b360027200020002903c80137002b200442003703002006420037030020034200" - "37030020004200370358200041246a2204411420014120100822024120470d002000413a6a" - "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" - "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" - "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" - "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" - "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" - "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" - "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" - "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" - "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" - "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" - "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" - "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" - "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" - "0120002802980110144120419e82c000411f103c200441141015411441bd82c000410b103c" - "200041e0016a220542003703002003420037030020024200370300200042003703c8012001" - "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" - "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" - "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" - "0341003b010020024200370300200042003703c80120044114200041a0016a220741202006" - "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" - "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" - "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" - "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" - "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" - "004108101f411341b983c000410c103c419783c000410d41c583c0004108101f411241cd83" - "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" - "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" - "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" - "103c419783c000410d20044114101e412f41a483c000410d103c419783c000410d41b183c0" - "004108101f411341b983c000410c103c200542003703002003420037030020024200370300" - "200042003703c801200041d894ebdc036a220741082006412041001020417341978fc00041" - "17103c200542003703002003420037030020024200370300200042003703c8012001200028" - "0298012006412041001020417141ae8fc0004119103c4102100f416f41fc83c000411f103c" - "417f20002802980110124171419b84c000411f103c2001417f1012417141ba84c000411f10" - "3c20014181201012417441d984c0004120103c20072000280298011012417341f984c00041" - "1f103c2007200028029801410110094173419885c0004118103c2001200028029801410110" - "09417141b085c000411a103c20054200370300200342003703002002420037030020004200" - "3703c8012007200028029801200641201008417341c78fc0004116103c2005420037030020" - "03420037030020024200370300200042003703c80120012000280298012006412010084171" - "41dd8fc0004118103c200542003703002003420037030020024200370300200042003703c8" - "0120044114200441142007200028029801200641201021417341f58fc000411c103c200542" - "003703002003420037030020024200370300200042003703c8012004411420044114200120" - "00280298012006412010214171419190c000411e103c200542003703002003420037030020" - "024200370300200042003703c80141959ec000411420072000280298012006412010224173" - "41af90c0004119103c200542003703002003420037030020024200370300200042003703c8" - "0141959ec00041142001200028029801200641201022417141c890c000411f103c20054200" - "3703002003420037030020024200370300200042003703c80141959ec000411441ca85c000" - "4114200641201022417141e790c0004129103c200542003703002003420037030020024200" - "370300200042003703c80141de85c000412841959ec00041142006412010224171419091c0" - "004125103c200041dc016a200041346a280100360200200041d4016a2000412c6a29010037" - "0200200020002901243702cc01200041808080083602c801200041003b01c0012006411841" - "959ec0004114200041c0016a220341021022417141b591c000410e103c2007200028029801" - "422a10014173418686c0004111103c200041003b01c0014102200341021007416f41c391c0" - "00411b103c200041003b01c001410220034102100a416f41de91c000412b103c200041003b" - "01c0014101410220034102100b416f418992c0004123103c4102100f416f41fc83c000411f" - "103c41021010416f419786c000412f103c410141021011416f41c686c0004127103c41e980" - "c0004181201006417441ed86c000411f103c41e980c00041c10010064174418c87c000411a" - "103c200041003b01c001200141812020034102100c417441ac92c0004121103c200041003b" - "01c001200141812020034102100d417441cd92c0004131103c200041003b01c00141012001" - "41812020034102100e417441fe92c0004129103c20014181201012417441a687c000412510" - "3c20014181201013417441cb87c0004135103c4101200141812010144174418088c000412d" - "103c20014181201015417441ad88c0004119103c419783c00041812041d482c000410b41df" - "82c000410e1017417441ed82c0004109103c419783c000410d41d482c00041812041df82c0" - "00410e1017417441ed82c0004109103c419783c000410d41d482c000410b41df82c0004181" - "201017417441ed82c0004109103c200041003b01c0012001418120200341021016417441a7" - "93c0004121103c200041003b01c00141959ec00041812041959ec000411420034102102241" - "7441c893c0004118103c200041003b01c00120044114200441142001418120200341021023" - "417441e093c000411f103c200041003b01c001200641812020044114200341021024417441" - "ff93c0004122103c419783c000410d200720002802980141001000417341c688c000410f10" - "3c200042d487b6f4c7d4b1c0003700c001419783c000410d200041c095ebdc036a22054108" - "1025417341d588c000411c103c419783c000410d2007200028029801101f417341f188c000" - "4116103c200541082003410810264173418789c0004118103c200341082005410810264173" - "419f89c0004118103c200041003b01ec012005410820034108200041ec016a220241024100" - "1027417341a194c0004114103c200041003b01ec0120034108200541082002410241001027" - "417341b594c0004114103c200041003b01ec01200541082003410820024102410010284173" - "41c994c0004119103c200041003b01ec0120034108200541082002410241001028417341e2" - "94c0004119103c200041003b01ec0120054108200341082002410241001029417341fb94c0" - "004119103c200041003b01ec01200341082005410820024102410010294173419495c00041" - "19103c200041003b01ec012005410820034108200241024100102a417341ad95c000411710" - "3c200041003b01ec012003410820054108200241024100102a417341c495c0004117103c20" - "0041003b01ec01200541084103200241024100102b417341db95c0004114103c200041003b" - "01ec01200541084103200241024100102c417341ef95c0004113103c200041003b01ec0120" - "054108200241024100102d4173418296c0004113103c200120002802980141001009417141" - "b789c0004123103c200041003b01ec01200441142001200028029801200241021018417141" - "9596c000411a103c200041003b01ec012001200028029801200241021019417141af96c000" - "4121103c200041003b01ec01200120002802980120024102101a417141d096c0004120103c" - "2001200028029801101b417141da89c0004120103c2001200028029801101c417141fa89c0" - "004127103c200041003602ec01200120002802980120024104101d417141f096c000412110" - "3c200041003b01ec0120012000280298012002410210084171419197c0004123103c200041" - "003b01ec012001200028029801410120024102102e417141b497c0004121103c200041003b" - "01ec01200120002802980122052004411420012005200241021023417141d597c000412710" - "3c200041003b01ec01200441142001200028029801220520012005200241021023417141fc" - "97c0004127103c200041003b01ec0120012000280298012004411420024102102f417141a3" - "98c0004125103c200041003b01ec0120044114200120002802980120024102102f417141c8" - "98c0004125103c200041003b01ec01200120002802980120044114200241021030417141ed" - "98c000412c103c200041003b01ec0120044114200120002802980120024102103041714199" - "99c000412c103c200041003b01ec012001200028029801200241021031417141c599c00041" - "1f103c200041003b01ec0120012000280298014101200241021032417141e499c000412210" - "3c200041003b01ec0120012000280298012004411441ca85c0004114200241021021417141" - "869ac0004121103c200041003b01ec0120044114200120002802980141ca85c00041142002" - "41021021417141a79ac0004121103c200041003b01ec012001200028029801410120024102" - "1033417141c89ac0004128103c200041003b01ec0120064118200120002802980120024102" - "1024417141f09ac0004123103c200041003b01ec0120012000280298014101200241021034" - "417141939bc0004125103c200041003b01ec01200120002802980141012002410210354171" - "41b89bc0004121103c200041003b01ec0120012000280298014101200241021036417141d9" - "9bc0004122103c200041003b01ec0120012000280298012004411441012002410210374171" - "41fb9bc0004124103c200041003b01ec012004411420012000280298014101200241021037" - "4171419f9cc0004124103c200041003b01ec01200120002802980141012002410210384171" - "41c39cc000412f103c200041003b01ec012001200028029801200241021039417141f29cc0" - "004123103c200041003b01ec012001200028029801410120024102103a417141959dc00041" - "22103c200041003b01ec012001200028029801410120024102103b417141b79dc000412110" - "3c200041003b01ec01200120002802980141a18ac0004120200241021018417141d89dc000" - "411c103c419783c000410d2001200028029801101e417141c18ac0004122103c419797abdd" - "03410d41a18ac000412041001000417341e38ac0004110103c419797abdd03410d20034108" - "1025417341f38ac000411d103c419797abdd03410d20044114101e417341908bc000411810" - "3c419797abdd03410d41b183c0004108101f417341a88bc0004117103c2001200028029801" - "200141812041001000417441bf8bc000410e103c200141812042011001417441cd8bc00041" - "12103c419783c000418120200341081025417441df8bc000411b103c419783c00041812020" - "044114101e417441fa8bc0004116103c419783c00041812041b183c0004108101f41744190" - "8cc0004115103c419783c000410d2001200028029801101f417141a58cc0004119103c2000" - "41003b01ec01200120002802980120044114200241021024417141f49dc0004121103c4101" - "410020044114101e412241be8cc000411a103c200041f0016a240041010f0b0b418080c000" - "410b417f20022002417f4e1bac1001000b0b801e0200418080c0000bde056572726f725f63" - "6f64653d54455354204641494c45442424242424205354415254494e47205741534d204558" - "45435554494f4e2024242424246765745f6c65646765725f73716e6765745f706172656e74" - "5f6c65646765725f74696d656765745f626173655f666565746573745f616d656e646d656e" - "74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a676574" - "5f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74" - "785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f" - "6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65" - "737465645f61727261795f6c656e7570646174655f6461746174657374206d657373616765" - "74657374207075626b657974657374207369676e6174757265636865636b5f736967676574" - "5f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e67" - "20747261636574726163655f6163636f756e74400000000000005f74726163655f616d6f75" - "6e74400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e74" - "5f6c65646765725f686173685f6e65675f7074726765745f74785f61727261795f6c656e5f" - "696e76616c69645f736669656c646765745f74785f6e65737465645f61727261795f6c656e" - "5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c" - "656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e67676574" - "5f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c6564" - "6765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e67" - "5f6c656e555344303030303030303030303030303030303000418686c0000b8f1874726163" - "655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f61" - "727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a" - "5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e" - "61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f" - "746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f62" - "69675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" - "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c6963657472" - "6163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f616d6f756e" - "745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c" - "6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f62" - "6a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f" - "6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77" - "726f6e675f73697a655f75696e743235363030303030303030303030303030303030303030" - "30303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f" - "6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f7061717565" - "5f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f6f625f7374" - "72696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f746f6f5f" - "6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f666c" - "6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f6e67747261" - "63655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f" - "6c656e67746874726163655f6163636f756e745f636865636b5f646573796e636765745f70" - "6172656e745f6c65646765725f686173686765745f63757272656e745f6c65646765725f6f" - "626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65" - "737465645f6669656c646765745f63757272656e745f6c65646765725f6f626a5f6e657374" - "65645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f" - "6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565" - "726765745f6e66745f7461786f6e6765745f6e66745f73657269616c6765745f706172656e" - "745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c65646765" - "725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c6564676572" - "5f686173685f6c656e5f746f6f5f6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e" - "5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e6163636f756e745f" - "6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c65" - "6e6c696e655f6b65796c65745f6c656e5f6f6f625f63757272656e63796c696e655f6b6579" - "6c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f" - "6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f6173" - "73657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272" - "656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272" - "656e63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e" - "76616c69645f736669656c646765745f63757272656e745f6c65646765725f6f626a5f6669" - "656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c" - "645f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f74" - "6f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65" - "737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f6d707574655f73" - "68613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f" - "6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f" - "736c6963656d70746f6b656e5f6b65796c65745f746f6f5f6269675f736c6963655f6d7074" - "6964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f73" - "6c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73" - "756274726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f" - "736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f" - "6469766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69" - "636532666c6f61745f726f6f745f6f6f625f736c696365666c6f61745f706f775f6f6f625f" - "736c696365666c6f61745f6c6f675f6f6f625f736c6963656765745f6e66745f77726f6e67" - "5f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a" - "655f75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e" - "743235366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e74323536" - "6163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646368" - "65636b5f6b65796c65745f77726f6e675f73697a655f6163636f756e74696463726564656e" - "7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643163726564" - "656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" - "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465" - "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326465" - "706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e746964316465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f616363" - "6f756e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "7469646c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316c" - "696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69" - "737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70" - "746f6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646e66745f" - "6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665" - "725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469647061796368616e5f6b6579" - "6c65745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f" - "646f6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964736967" - "6e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65" - "745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647661756c745f6b65" - "796c65745f77726f6e675f73697a655f6163636f756e7469646765745f6e66745f77726f6e" - "675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f" - "77726f6e675f6c656e677468004d0970726f64756365727302086c616e6775616765010452" - "757374000c70726f6365737365642d6279010572757374631d312e38352e31202834656231" - "363132353020323032352d30332d313529002c0f7461726765745f6665617475726573022b" - "0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020c01020ad62602460002402000" + "20014704402002200341004100410010001a20004100480d01418b80c000410b2000ad1001" + "000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b8c26020a7f017e2300" + "41f0016b22002400419680c000412341004100410010001a100241b9e00041b980c000410e" + "103c100341b2920441c780c0004116103c200041f0006a22064200370300200041e8006a22" + "054200370300200041e0006a2203420037030020004200370358200041d8006a2201412010" + "04412041be8cc0004116103c1005410a41dd80c000410c103c200041186a22074281828488" + "90a0c08001370300200041106a2208428182848890a0c08001370300200041086a22094281" + "82848890a0c080013703002000428182848890a0c0800137030041e980c000410e10064101" + "41f780c0004111103c200041201006410141f780c0004111103c4181802020014114100722" + "0241144604400240200041266a200041da006a2d00003a00002000200029005f3703c80120" + "00200041e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01" + "242000200028005b360027200020002903c80137002b200642003703002005420037030020" + "03420037030020004200370358200041246a2206411420014120100822024120470d002000" + "413a6a20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7" + "006a200a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a" + "2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20" + "0041386a4120410010094101418881c0004110103c20054100360200200342003703002000" + "42003703584181802020014114100a411441d48cc000411c103c2005410036020020034200" + "3703002000420037035841014181802020014114100b411441f08cc0004114103c20004104" + "36029801200041818020360258200041d8016a220341003602002002420037030020004200" + "3703c80120014104200041c8016a22054114100c411441848dc0004113103c200341003602" + "0020024200370300200042003703c801200120002802980120054114100d411441978dc000" + "4123103c2003410036020020024200370300200042003703c8014101200120002802980120" + "054114100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c" + "1010412041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028" + "0298011012412041e081c0004117103c20012000280298011013412041f781c0004127103c" + "4101200120002802980110144120419e82c000411f103c200641141015411441bd82c00041" + "0b103c200041e0016a220442003703002003420037030020024200370300200042003703c8" + "012001200028029801200541201016412041d58dc0004113103c41c882c000410c41d482c0" + "00410b41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300" + "200041b0016a2008290300370300200041a8016a2009290300370300200020002903003703" + "a001200341003b010020024200370300200042003703c80120064114200041a0016a220741" + "20200541121018411241e88dc0004107103c20034100360200200242003703002000420037" + "03c80120074120200541141019411441ef8dc000410e103c200041003602c8012007412020" + "054104101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120" + "101c410a418383c0004114103c200041003602c8012007412020054104101d4104418a8ec0" + "00410e103c419783c000410d20064114101e412141a483c000410d103c419783c000410d41" + "b183c0004108101f410d41b983c000410c103c419783c000410d41c583c0004108101f410d" + "41cd83c0004111103c417f41041004417141de83c000411e103c200041003602c801200541" + "7f1004417141988ec000411e103c200041ca016a41003a0000200041003b01c80120054103" + "1004417d41b68ec0004124103c200041003602c8012005418094ebdc031004417341da8ec0" + "004123103c200442003703002003420037030020024200370300200042003703c801200041" + "d894ebdc036a220741082005412041001020417341fd8ec0004117103c2004420037030020" + "03420037030020024200370300200042003703c80120012000280298012005412041001020" + "417141948fc0004119103c4102100f416f41fc83c000411f103c417f200028029801101241" + "71419b84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441" + "d984c0004120103c20072000280298011012417341f984c000411f103c2007200028029801" + "410110094173419885c0004118103c200120002802980141011009417141b085c000411a10" + "3c200442003703002003420037030020024200370300200042003703c80120072000280298" + "01200541201008417341ad8fc0004116103c20044200370300200342003703002002420037" + "0300200042003703c8012001200028029801200541201008417141c38fc0004118103c2004" + "42003703002003420037030020024200370300200042003703c80120064114200641142007" + "200028029801200541201021417341db8fc000411c103c2004420037030020034200370300" + "20024200370300200042003703c80120064114200641142001200028029801200541201021" + "417141f78fc000411e103c2004420037030020034200370300200242003703002000420037" + "03c80141fb9dc000411420072000280298012005412010224173419590c0004119103c2004" + "42003703002003420037030020024200370300200042003703c80141fb9dc0004114200120" + "0028029801200541201022417141ae90c000411f103c200442003703002003420037030020" + "024200370300200042003703c80141fb9dc000411441ca85c0004114200541201022417141" + "cd90c0004129103c200442003703002003420037030020024200370300200042003703c801" + "41de85c000412841fb9dc0004114200541201022417141f690c0004125103c200041dc016a" + "200041346a280100360200200041d4016a2000412c6a290100370200200020002901243702" + "cc01200041808080083602c801200041003b01c0012005411841fb9dc0004114200041c001" + "6a2203410210224171419b91c000410e103c2007200028029801422a10014173418686c000" + "4111103c200041003b01c0014102200341021007416f41a991c000411b103c200041003b01" + "c001410220034102100a416f41c491c000412b103c200041003b01c0014101410220034102" + "100b416f41ef91c0004123103c4102100f416f41fc83c000411f103c41021010416f419786" + "c000412f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed" + "86c000411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120" + "0141812020034102100c4174419292c0004121103c200041003b01c0012001418120200341" + "02100d417441b392c0004131103c200041003b01c0014101200141812020034102100e4174" + "41e492c0004129103c20014181201012417441a687c0004125103c20014181201013417441" + "cb87c0004135103c4101200141812010144174418088c000412d103c200141812010154174" + "41ad88c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed" + "82c0004109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0" + "004109103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c00041" + "09103c200041003b01c00120014181202003410210164174418d93c0004121103c20004100" + "3b01c00141fb9dc00041812041fb9dc0004114200341021022417441ae93c0004118103c20" + "0041003b01c00120064114200641142001418120200341021023417441c693c000411f103c" + "200041003b01c001200541812020064114200341021024417441e593c0004122103c419783" + "c000410d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1" + "c0003700c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c" + "103c419783c000410d2007200028029801101f417341f188c0004116103c20044108200341" + "0810264173418789c0004118103c200341082004410810264173419f89c0004118103c2000" + "41003b01ec012004410820034108200041ec016a22024102410010274173418794c0004114" + "103c200041003b01ec01200341082004410820024102410010274173419b94c0004114103c" + "200041003b01ec0120044108200341082002410241001028417341af94c0004119103c2000" + "41003b01ec0120034108200441082002410241001028417341c894c0004119103c20004100" + "3b01ec0120044108200341082002410241001029417341e194c0004119103c200041003b01" + "ec0120034108200441082002410241001029417341fa94c0004119103c200041003b01ec01" + "2004410820034108200241024100102a4173419395c0004117103c200041003b01ec012003" + "410820044108200241024100102a417341aa95c0004117103c200041003b01ec0120044108" + "4103200241024100102b417341c195c0004114103c200041003b01ec012004410841032002" + "41024100102c417341d595c0004113103c200041003b01ec0120044108200241024100102d" + "417341e895c0004113103c200120002802980141001009417141b789c0004123103c200041" + "003b01ec01200641142001200028029801200241021018417141fb95c000411a103c200041" + "003b01ec0120012000280298012002410210194171419596c0004121103c200041003b01ec" + "01200120002802980120024102101a417141b696c0004120103c2001200028029801101b41" + "7141da89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602" + "ec01200120002802980120024104101d417141d696c0004121103c200041003b01ec012001" + "200028029801200241021008417141f796c0004123103c200041003b01ec01200120002802" + "9801410120024102102e4171419a97c0004121103c200041003b01ec012001200028029801" + "22042006411420012004200241021023417141bb97c0004127103c200041003b01ec012006" + "41142001200028029801220420012004200241021023417141e297c0004127103c20004100" + "3b01ec0120012000280298012006411420024102102f4171418998c0004125103c20004100" + "3b01ec0120064114200120002802980120024102102f417141ae98c0004125103c20004100" + "3b01ec01200120002802980120064114200241021030417141d398c000412c103c20004100" + "3b01ec01200641142001200028029801200241021030417141ff98c000412c103c20004100" + "3b01ec012001200028029801200241021031417141ab99c000411f103c200041003b01ec01" + "20012000280298014101200241021032417141ca99c0004122103c200041003b01ec012001" + "2000280298012006411441ca85c0004114200241021021417141ec99c0004121103c200041" + "003b01ec0120064114200120002802980141ca85c00041142002410210214171418d9ac000" + "4121103c200041003b01ec0120012000280298014101200241021033417141ae9ac0004128" + "103c200041003b01ec01200541182001200028029801200241021024417141d69ac0004123" + "103c200041003b01ec0120012000280298014101200241021034417141f99ac0004125103c" + "200041003b01ec01200120002802980141012002410210354171419e9bc0004121103c2000" + "41003b01ec0120012000280298014101200241021036417141bf9bc0004122103c20004100" + "3b01ec012001200028029801200641144101200241021037417141e19bc0004124103c2000" + "41003b01ec012006411420012000280298014101200241021037417141859cc0004124103c" + "200041003b01ec0120012000280298014101200241021038417141a99cc000412f103c2000" + "41003b01ec012001200028029801200241021039417141d89cc0004123103c200041003b01" + "ec012001200028029801410120024102103a417141fb9cc0004122103c200041003b01ec01" + "2001200028029801410120024102103b4171419d9dc0004121103c200041003b01ec012001" + "20002802980141a18ac0004120200241021018417141be9dc000411c103c419783c000410d" + "2001200028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041" + "001000417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d" + "103c419797abdd03410d20064114101e417341908bc0004118103c419797abdd03410d41c5" + "83c0004108101f417341a88bc0004117103c20012000280298012001418120410010004174" + "41bf8bc000410e103c200141812042011001417441cd8bc0004112103c419783c000418120" + "200341081025417441df8bc000411b103c419783c00041812020064114101e417441fa8bc0" + "004116103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c0" + "00410d2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028" + "02980120064114200241021024417141da9dc0004121103c200041f0016a240041010f0b0b" + "418080c000410b417f20022002417f4e1bac1001000b0be61d0200418080c0000bde056572" + "726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741" + "534d20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f70" + "6172656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d65" + "6e646d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f" + "626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f" + "6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e" + "6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65" + "646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f" + "626a5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65" + "737361676574657374207075626b657974657374207369676e6174757265636865636b5f73" + "69676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665657465" + "7374696e6720747261636574726163655f6163636f756e74400000000000005f7472616365" + "5f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f70" + "6172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f6172726179" + "5f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f61727261" + "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f" + "6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f" + "6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368" + "655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f" + "77726f6e675f6c656e555344303030303030303030303030303030303000418686c0000bf5" + "1774726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f" + "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765" + "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d65" + "6e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61" + "626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" + "746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c656467" + "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c696365" + "7570646174655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c" + "69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f" + "616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69" + "636531666c6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c656467" + "65725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167" + "735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f" + "6665655f77726f6e675f73697a655f75696e74323536303030303030303030303030303030" + "303030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f" + "73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f" + "70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f" + "6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472616365" + "5f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f706171" + "75655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f" + "6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" + "726f6e675f6c656e6774686765745f706172656e745f6c65646765725f686173686765745f" + "63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f62" + "6a5f6669656c646765745f74785f6e65737465645f6669656c646765745f63757272656e74" + "5f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f62" + "6a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765745f" + "6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e6674" + "5f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e" + "6765745f706172656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c67" + "65745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e67666c6f" + "61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77" + "726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e74" + "5f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f" + "63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e63" + "79616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f" + "6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f7772" + "6f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c65" + "6e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70" + "746765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375727265" + "6e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64676574" + "5f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f74" + "785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c" + "6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269" + "675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c" + "696365616d6d5f6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c" + "5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f74" + "6f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c696365" + "31666c6f61745f6164645f6f6f625f736c69636532666c6f61745f73756274726163745f6f" + "6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c69636532666c6f" + "61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f" + "6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69636531666c6f61" + "745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c69" + "6365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c" + "6963656765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f" + "6973737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f" + "6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f7772" + "6f6e675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f" + "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f" + "756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "6964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b" + "656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f647563" + "65727302086c616e6775616765010452757374000c70726f6365737365642d627901057275" + "7374631d312e38392e30202832393438333838336520323032352d30382d3034290094010f" + "7461726765745f6665617475726573082b0f6d757461626c652d676c6f62616c732b136e6f" + "6e7472617070696e672d6670746f696e742b0b62756c6b2d6d656d6f72792b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c75652b0f62756c" + "6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665726c6f6e67"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 7d2136f4f7a..3fda13424ac 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -715,11 +715,15 @@ WasmHostFunctionsImpl::trace( Slice const& data, bool asHex) { + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif + if (!asHex) { j << "HF TRACE (" << leKey.key << "): " << msg << " " @@ -735,19 +739,32 @@ WasmHostFunctionsImpl::trace( j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; } - return msg.size() + data.size() * (asHex ? 2 : 1); +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { + auto const ret = msg.size() + sizeof(data); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif + j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; - return msg.size() + sizeof(data); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -755,16 +772,24 @@ WasmHostFunctionsImpl::traceAccount( std::string_view const& msg, AccountID const& account) { + auto const ret = msg.size() + account.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const accountStr = toBase58(account); j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; - return msg.size() + accountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -772,14 +797,22 @@ WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, Slice const& data) { + auto const ret = msg.size() + data.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const s = floatToString(data); j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; - return msg.size() + s.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected @@ -787,14 +820,22 @@ WasmHostFunctionsImpl::traceAmount( std::string_view const& msg, STAmount const& amount) { + auto const ret = msg.size(); #ifdef DEBUG_OUTPUT - auto j = getJournal().error(); + auto& j = std::cerr; #else + if (!getJournal().active(beast::severities::kTrace)) + return ret; auto j = getJournal().trace(); #endif auto const amountStr = amount.getFullText(); j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; - return msg.size() + amountStr.size(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; } Expected diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index fa61ec2679f..3c56f885dd6 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -20,23 +20,25 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) auto& j = std::cerr; #else auto j = jlog.warn(); + if (jlog.active(beast::severities::kWarning)) #endif + { + wasm_byte_vec_t error_message WASM_EMPTY_VEC; - wasm_byte_vec_t error_message WASM_EMPTY_VEC; + if (trap) + wasm_trap_message(trap, &error_message); - if (trap) - wasm_trap_message(trap, &error_message); + if (error_message.size) + { + j << "WASMI Error: " << msg << ", " + << std::string_view(error_message.data, error_message.size - 1); + } + else + j << "WASMI Error: " << msg; - if (error_message.size) - { - j << "WASMI Error: " << msg << ", " - << std::string_view(error_message.data, error_message.size - 1); + if (error_message.size) + wasm_byte_vec_delete(&error_message); } - else - j << "WASMI Error: " << msg; - - if (error_message.size) - wasm_byte_vec_delete(&error_message); if (trap) wasm_trap_delete(trap); From c626b6403a580286593a6bcd1f0c0386a529bfaa Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:40:42 -0500 Subject: [PATCH 145/212] Fix unaligned access (#6208) --- src/test/app/HostFuncImpl_test.cpp | 18 ++++++++++++ src/test/app/Wasm_test.cpp | 28 +++++++++++++++++++ src/test/app/wasm_fixtures/bad_align.c | 23 +++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 17 +++++++++++ src/test/app/wasm_fixtures/fixtures.h | 1 + src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 12 ++++++-- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 9 +++++- 7 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 src/test/app/wasm_fixtures/bad_align.c diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 9a5326e18d0..b53126671b4 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -594,6 +594,24 @@ struct HostFuncImpl_test : public beast::unit_test::suite } } + { + // unaligned locator + std::vector locatorVec(sizeof(int32_t) + 1); + memcpy( + locatorVec.data() + 1, &sfAccount.fieldCode, sizeof(int32_t)); + Slice locator( + reinterpret_cast(locatorVec.data() + 1), + sizeof(int32_t)); + + auto const account = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + account.has_value(), + std::to_string(static_cast(account.error())))) + { + BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); + } + } + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError) { Slice locator( diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c61482a0573..0eca654335c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -965,6 +965,33 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } + void + testBadAlign() + { + testcase("Wasm Bad Align"); + + // bad_align.c + auto wasmStr = boost::algorithm::unhex(badAlignHex); + Bytes wasm(wasmStr.begin(), wasmStr.end()); + + using namespace test::jtx; + + Env env{*this}; + TestHostFunctions hf(env); + ImportVec imports = createWasmImport(hf); + + { // Calls float_from_uint with bad aligment. + // Can be checked through codecov + auto& engine = WasmEngine::instance(); + + auto re = engine.run( + wasm, "test", {}, imports, &hf, 1'000'000, env.journal); + BEAST_EXPECT(re && re->result == 0xbab88d46); + } + + env.close(); + } + void run() override { @@ -995,6 +1022,7 @@ struct Wasm_test : public beast::unit_test::suite testStartFunctionLoop(); testBadAlloc(); + testBadAlign(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/bad_align.c b/src/test/app/wasm_fixtures/bad_align.c new file mode 100644 index 00000000000..ff29456c2a5 --- /dev/null +++ b/src/test/app/wasm_fixtures/bad_align.c @@ -0,0 +1,23 @@ +#include + +int32_t +float_from_uint(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +int32_t +get_tx_nested_field(uint8_t const*, int32_t, uint8_t*, int32_t); + +uint8_t e_data[32 * 1024]; + +int32_t +test() +{ + e_data[1] = 0xFF; + e_data[2] = 0xFF; + e_data[3] = 0xFF; + e_data[4] = 0xFF; + e_data[5] = 0xFF; + e_data[6] = 0xFF; + e_data[7] = 0xFF; + e_data[8] = 0xFF; + float_from_uint(&e_data[1], 8, &e_data[35], 12, 0); + return *((int32_t*)(&e_data[36])); +} diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 3f339e7a0dd..44d44033821 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1378,3 +1378,20 @@ extern std::string const badAllocHex = "3732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62" "616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c7469" "76616c7565"; + +extern std::string const badAlignHex = + "0061736d0100000001110360057f7f7f7f7f017f6000006000017f02170103656e760f666c" + "6f61745f66726f6d5f75696e7400000303020102050301000206400a7f004180080b7f0041" + "80080b7f00418088020b7f00418088020b7f00418088060b7f004180080b7f00418088060b" + "7f00418080080b7f0041000b7f0041010b07b1010d066d656d6f72790200115f5f7761736d" + "5f63616c6c5f63746f727300010474657374000206655f6461746103000c5f5f64736f5f68" + "616e646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f" + "737461636b5f6869676803040d5f5f676c6f62616c5f6261736503050b5f5f686561705f62" + "61736503060a5f5f686561705f656e6403070d5f5f6d656d6f72795f6261736503080c5f5f" + "7461626c655f6261736503090a240202000b1f00418108427f370000418108410841a30841" + "0c410010001a41a4082802000b007f0970726f647563657273010c70726f6365737365642d" + "62790105636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769" + "746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061623462356132646235" + "3832393538616631656533303861373930636664623432626432343732302900490f746172" + "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index bb7a80f7918..ff72711000a 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -84,3 +84,4 @@ extern std::string const infiniteLoopWasmHex; extern std::string const startLoopHex; extern std::string const badAllocHex; +extern std::string const badAlignHex; diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index 3fda13424ac..b57dae7f7c7 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -196,8 +196,16 @@ locateField(STObject const& obj, Slice const& locator) if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - int32_t const* locPtr = reinterpret_cast(locator.data()); - int32_t const locSize = locator.size() / 4; + int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; + int32_t const* locPtr = &locBuf[0]; + int32_t const locSize = locator.size() / sizeof(int32_t); + + uintptr_t p = reinterpret_cast(locator.data()); + if (p & (alignof(int32_t) - 1)) // unaligned + memcpy(&locBuf[0], locator.data(), locator.size()); + else + locPtr = reinterpret_cast(locator.data()); + STBase const* field = nullptr; auto const& knownSFields = SField::getKnownCodeToField(); diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index b5da69f71d8..ee284fa6e9f 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -71,7 +71,14 @@ getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) if (r->size() != sizeof(uint64_t)) return Unexpected(HostFunctionError::INVALID_PARAMS); - return *reinterpret_cast(r->data()); + uint64_t x; + uintptr_t p = reinterpret_cast(r->data()); + if (p & (alignof(uint64_t) - 1)) // unaligned + memcpy(&x, r->data(), sizeof(uint64_t)); + else + x = *reinterpret_cast(r->data()); + + return x; } template From fb97f7b596b433525cbc982c74d3c3c30d290832 Mon Sep 17 00:00:00 2001 From: pwang200 <354723+pwang200@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:48:25 -0500 Subject: [PATCH 146/212] fix unit tests failed due to fuel changes (#6174) * fix unit tests failed due to fuel changes * fix tests * fix tests --------- Co-authored-by: Mayukha Vadari --- src/test/app/EscrowSmart_test.cpp | 10 +++++----- src/test/app/Wasm_test.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 1ff82dff408..ec173b2cbd4 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -390,7 +390,7 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 65; + std::uint32_t const allowance = 178; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto [createFee, finishFee] = [&]() { Env env(*this, features); @@ -683,7 +683,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { env.require(balance(alice, XRP(4000) - txnFees)); - auto const allowance = 1014; + auto const allowance = 1420; XRPAmount const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + @@ -727,7 +727,7 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} auto const& wasmHex = ledgerSqnWasmHex; - uint64_t const allowance = 65; + uint64_t const allowance = 178; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto createFee = [&]() { Env env(*this, features); @@ -873,7 +873,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 38'054, + txMeta->getFieldU32(sfGasUsed) == 62'715, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); @@ -958,7 +958,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 138'485; + auto const allowance = 182'903; auto const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 543f57cccd1..c6e1b25d6ca 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -328,7 +328,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); } env.close(); @@ -377,7 +377,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); } } @@ -388,7 +388,7 @@ struct Wasm_test : public beast::unit_test::suite if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); + BEAST_EXPECTS(re->cost == 64'263, std::to_string(re->cost)); } } @@ -703,7 +703,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); TestHostFunctions hfs(env, 0); - auto const allowance = 189'508; + auto const allowance = 327'308; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); if (BEAST_EXPECT(re.has_value())) From 409c67494a413f434807e084ac82abf08139d6ca Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 13 Jan 2026 20:34:57 -0500 Subject: [PATCH 147/212] move helper functions to separate file (#6178) * move helper functions to separate file * break it up into sections, split out float helpers * split impls into multiple cpp files * namespace detail * fix build issue * fix tests * clean up * put float helpers into wasm_float namespace --- src/test/app/TestHostFunctions.h | 24 +- src/xrpld/app/wasm/HostFunc.h | 4 + src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 1321 +---------------- .../app/wasm/detail/HostFuncImplFloat.cpp | 529 +++++++ .../app/wasm/detail/HostFuncImplGetter.cpp | 374 +++++ .../app/wasm/detail/HostFuncImplKeylet.cpp | 228 +++ .../wasm/detail/HostFuncImplLedgerHeader.cpp | 59 + src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp | 68 + .../app/wasm/detail/HostFuncImplTrace.cpp | 141 ++ 9 files changed, 1422 insertions(+), 1326 deletions(-) create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp create mode 100644 src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index a7f4c8038b5..cbc75f1ed94 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -468,7 +468,7 @@ struct TestHostFunctions : public HostFunctions return ret; auto j = getJournal().trace(); #endif - auto const s = floatToString(data); + auto const s = wasm_float::floatToString(data); j << "WASM TRACE FLOAT: " << msg << " " << s; #ifdef DEBUG_OUTPUT @@ -502,67 +502,67 @@ struct TestHostFunctions : public HostFunctions Expected floatFromInt(int64_t x, int32_t mode) override { - return floatFromIntImpl(x, mode); + return wasm_float::floatFromIntImpl(x, mode); } Expected floatFromUint(uint64_t x, int32_t mode) override { - return floatFromUintImpl(x, mode); + return wasm_float::floatFromUintImpl(x, mode); } Expected floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override { - return floatSetImpl(mantissa, exponent, mode); + return wasm_float::floatSetImpl(mantissa, exponent, mode); } Expected floatCompare(Slice const& x, Slice const& y) override { - return floatCompareImpl(x, y); + return wasm_float::floatCompareImpl(x, y); } Expected floatAdd(Slice const& x, Slice const& y, int32_t mode) override { - return floatAddImpl(x, y, mode); + return wasm_float::floatAddImpl(x, y, mode); } Expected floatSubtract(Slice const& x, Slice const& y, int32_t mode) override { - return floatSubtractImpl(x, y, mode); + return wasm_float::floatSubtractImpl(x, y, mode); } Expected floatMultiply(Slice const& x, Slice const& y, int32_t mode) override { - return floatMultiplyImpl(x, y, mode); + return wasm_float::floatMultiplyImpl(x, y, mode); } Expected floatDivide(Slice const& x, Slice const& y, int32_t mode) override { - return floatDivideImpl(x, y, mode); + return wasm_float::floatDivideImpl(x, y, mode); } Expected floatRoot(Slice const& x, int32_t n, int32_t mode) override { - return floatRootImpl(x, n, mode); + return wasm_float::floatRootImpl(x, n, mode); } Expected floatPower(Slice const& x, int32_t n, int32_t mode) override { - return floatPowerImpl(x, n, mode); + return wasm_float::floatPowerImpl(x, n, mode); } Expected floatLog(Slice const& x, int32_t mode) override { - return floatLogImpl(x, mode); + return wasm_float::floatLogImpl(x, mode); } }; diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index e59507757cf..0ee4a615ced 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -44,6 +44,8 @@ HfErrorToInt(HostFunctionError e) return static_cast(e); } +namespace wasm_float { + std::string floatToString(Slice const& data); @@ -80,6 +82,8 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode); Expected floatLogImpl(Slice const& x, int32_t mode); +} // namespace wasm_float + struct HostFunctions { beast::Journal j_; diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index b57dae7f7c7..c0c514129f0 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -1,415 +1,13 @@ -#include -#include #include #include #include -#ifdef _DEBUG -// #define DEBUG_OUTPUT 1 -#endif - namespace xrpl { -Expected -WasmHostFunctionsImpl::getLedgerSqn() -{ - auto seq = ctx.view().seq(); - if (seq > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE - return static_cast(seq); -} - -Expected -WasmHostFunctionsImpl::getParentLedgerTime() -{ - auto time = ctx.view().parentCloseTime().time_since_epoch().count(); - if (time > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(time); -} - -Expected -WasmHostFunctionsImpl::getParentLedgerHash() -{ - return ctx.view().header().parentHash; -} - -Expected -WasmHostFunctionsImpl::getBaseFee() -{ - auto fee = ctx.view().fees().base.drops(); - if (fee > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(fee); -} - -Expected -WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) -{ - return ctx.view().rules().enabled(amendmentId); -} - -Expected -WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) -{ - auto const& table = ctx.app.getAmendmentTable(); - auto const amendment = table.find(std::string(amendmentName)); - return ctx.view().rules().enabled(amendment); -} - -Expected -WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) -{ - auto const& keylet = keylet::unchecked(objId); - if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (cacheIdx == 0) - { - for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) - if (!cache[cacheIdx]) - break; - } - else - { - cacheIdx--; // convert to 0-based index - } - - if (cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOTS_FULL); - - cache[cacheIdx] = ctx.view().read(keylet); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return cacheIdx + 1; // return 1-based index -} - -static Expected -getAnyFieldData(STBase const* obj) -{ - // auto const& fname = obj.getFName(); - if (!obj) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - auto const stype = obj->getSType(); - switch (stype) - { - // LCOV_EXCL_START - case STI_UNKNOWN: - case STI_NOTPRESENT: - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - break; - // LCOV_EXCL_STOP - case STI_OBJECT: - case STI_ARRAY: - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - break; - case STI_ACCOUNT: { - auto const* account(static_cast(obj)); - auto const& data = account->value(); - return Bytes{data.begin(), data.end()}; - } - break; - case STI_AMOUNT: - // will be processed by serializer - break; - case STI_ISSUE: { - auto const* issue(static_cast(obj)); - Asset const& asset(issue->value()); - // XRP and IOU will be processed by serializer - if (asset.holds()) - { - // MPT - auto const& mptIssue = asset.get(); - auto const& mptID = mptIssue.getMptID(); - return Bytes{mptID.cbegin(), mptID.cend()}; - } - } - break; - case STI_VL: { - auto const* vl(static_cast(obj)); - auto const& data = vl->value(); - return Bytes{data.begin(), data.end()}; - } - break; - case STI_UINT16: { - auto const& num(static_cast const*>(obj)); - std::uint16_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; - } - case STI_UINT32: { - auto const* num(static_cast const*>(obj)); - std::uint32_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; - } - break; - default: - break; // default to serializer - } - - Serializer msg; - obj->add(msg); - auto const data = msg.getData(); - - return data; -} - -Expected -WasmHostFunctionsImpl::getTxField(SField const& fname) -{ - return getAnyFieldData(ctx.tx.peekAtPField(fname)); -} - -Expected -WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) -{ - auto const sle = getCurrentLedgerObj(); - if (!sle.has_value()) - return Unexpected(sle.error()); - return getAnyFieldData(sle.value()->peekAtPField(fname)); -} - -Expected -WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) -{ - auto const normalizedIdx = normalizeCacheIndex(cacheIdx); - if (!normalizedIdx.has_value()) - return Unexpected(normalizedIdx.error()); - return getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); -} - -static inline bool -noField(STBase const* field) -{ - return !field || (STI_NOTPRESENT == field->getSType()) || - (STI_UNKNOWN == field->getSType()); -} - -static Expected -locateField(STObject const& obj, Slice const& locator) -{ - if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - - int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; - int32_t const* locPtr = &locBuf[0]; - int32_t const locSize = locator.size() / sizeof(int32_t); - - uintptr_t p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) // unaligned - memcpy(&locBuf[0], locator.data(), locator.size()); - else - locPtr = reinterpret_cast(locator.data()); - - STBase const* field = nullptr; - auto const& knownSFields = SField::getKnownCodeToField(); - - { - int32_t const sfieldCode = locPtr[0]; - auto const it = knownSFields.find(sfieldCode); - if (it == knownSFields.end()) - return Unexpected(HostFunctionError::INVALID_FIELD); - - auto const& fname(*it->second); - field = obj.peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - } - - for (int i = 1; i < locSize; ++i) - { - int32_t const sfieldCode = locPtr[i]; - - if (STI_ARRAY == field->getSType()) - { - auto const* arr = static_cast(field); - if (sfieldCode >= arr->size()) - return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); - field = &(arr->operator[](sfieldCode)); - } - else if (STI_OBJECT == field->getSType()) - { - auto const* o = static_cast(field); - - auto const it = knownSFields.find(sfieldCode); - if (it == knownSFields.end()) - return Unexpected(HostFunctionError::INVALID_FIELD); - - auto const& fname(*it->second); - field = o->peekAtPField(fname); - } - else // simple field must be the last one - { - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - } - - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - } - - return field; -} - -Expected -WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) -{ - auto const r = locateField(ctx.tx, locator); - if (!r) - return Unexpected(r.error()); - - return getAnyFieldData(r.value()); -} - -Expected -WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) -{ - auto const sle = getCurrentLedgerObj(); - if (!sle.has_value()) - return Unexpected(sle.error()); - - auto const r = locateField(*sle.value(), locator); - if (!r) - return Unexpected(r.error()); - - return getAnyFieldData(r.value()); -} - -Expected -WasmHostFunctionsImpl::getLedgerObjNestedField( - int32_t cacheIdx, - Slice const& locator) -{ - auto const normalizedIdx = normalizeCacheIndex(cacheIdx); - if (!normalizedIdx.has_value()) - return Unexpected(normalizedIdx.error()); - - auto const r = locateField(*cache[normalizedIdx.value()], locator); - if (!r) - return Unexpected(r.error()); - - return getAnyFieldData(r.value()); -} - -Expected -WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) -{ - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const* field = ctx.tx.peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - int32_t const sz = static_cast(field)->size(); - - return sz; -} - -Expected -WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) -{ - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const sle = getCurrentLedgerObj(); - if (!sle.has_value()) - return Unexpected(sle.error()); - - auto const* field = sle.value()->peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - int32_t const sz = static_cast(field)->size(); - - return sz; -} - -Expected -WasmHostFunctionsImpl::getLedgerObjArrayLen( - int32_t cacheIdx, - SField const& fname) -{ - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const normalizedIdx = normalizeCacheIndex(cacheIdx); - if (!normalizedIdx.has_value()) - return Unexpected(normalizedIdx.error()); - - auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - - int32_t const sz = static_cast(field)->size(); - - return sz; -} - -Expected -WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) -{ - auto const r = locateField(ctx.tx, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; -} - -Expected -WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) -{ - auto const sle = getCurrentLedgerObj(); - if (!sle.has_value()) - return Unexpected(sle.error()); - auto const r = locateField(*sle.value(), locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; -} - -Expected -WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( - int32_t cacheIdx, - Slice const& locator) -{ - auto const normalizedIdx = normalizeCacheIndex(cacheIdx); - if (!normalizedIdx.has_value()) - return Unexpected(normalizedIdx.error()); - - auto const r = locateField(*cache[normalizedIdx.value()], locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; -} +// ========================================================= +// SECTION: WRITE FUNCTION +// ========================================================= Expected WasmHostFunctionsImpl::updateData(Slice const& data) @@ -422,6 +20,10 @@ WasmHostFunctionsImpl::updateData(Slice const& data) return data_->size(); } +// ========================================================= +// SECTION: UTILS +// ========================================================= + Expected WasmHostFunctionsImpl::checkSignature( Slice const& message, @@ -442,913 +44,4 @@ WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) return hash; } -Expected -WasmHostFunctionsImpl::accountKeylet(AccountID const& account) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) -{ - if (issue1 == issue2) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - // note: this should be removed with the MPT DEX amendment - if (issue1.holds() || issue2.holds()) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::amm(issue1, issue2); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::check(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) -{ - if (!subject || !issuer) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - if (credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::credential(subject, issuer, credentialType); - - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::didKeylet(AccountID const& account) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::did(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::delegateKeylet( - AccountID const& account, - AccountID const& authorize) -{ - if (!account || !authorize) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == authorize) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::delegate(account, authorize); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::depositPreauthKeylet( - AccountID const& account, - AccountID const& authorize) -{ - if (!account || !authorize) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == authorize) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::depositPreauth(account, authorize); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::lineKeylet( - AccountID const& account1, - AccountID const& account2, - Currency const& currency) -{ - if (!account1 || !account2) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account1 == account2) - return Unexpected(HostFunctionError::INVALID_PARAMS); - if (currency.isZero()) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::line(account1, account2, currency); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::mptIssuanceKeylet( - AccountID const& issuer, - std::uint32_t seq) -{ - if (!issuer) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - auto const keylet = keylet::mptIssuance(seq, issuer); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::mptokenKeylet( - MPTID const& mptid, - AccountID const& holder) -{ - if (!mptid) - return Unexpected(HostFunctionError::INVALID_PARAMS); - if (!holder) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - auto const keylet = keylet::mptoken(mptid, holder); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::nftOfferKeylet( - AccountID const& account, - std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::nftoffer(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::offer(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::oracleKeylet( - AccountID const& account, - std::uint32_t documentId) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::paychanKeylet( - AccountID const& account, - AccountID const& destination, - std::uint32_t seq) -{ - if (!account || !destination) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == destination) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::payChan(account, destination, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::permissionedDomainKeylet( - AccountID const& account, - std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::permissionedDomain(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::signersKeylet(AccountID const& account) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::signers(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::ticket(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::vault(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; -} - -Expected -WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) -{ - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - if (!nftId) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto obj = nft::findToken(ctx.view(), account, nftId); - if (!obj) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - - auto ouri = obj->at(~sfURI); - if (!ouri) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - Slice const s = ouri->value(); - return Bytes(s.begin(), s.end()); -} - -Expected -WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) -{ - auto const issuer = nft::getIssuer(nftId); - if (!issuer) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - return Bytes{issuer.begin(), issuer.end()}; -} - -Expected -WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) -{ - return nft::toUInt32(nft::getTaxon(nftId)); -} - -Expected -WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) -{ - return nft::getFlags(nftId); -} - -Expected -WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) -{ - return nft::getTransferFee(nftId); -} - -Expected -WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) -{ - return nft::getSerial(nftId); -} - -Expected -WasmHostFunctionsImpl::trace( - std::string_view const& msg, - Slice const& data, - bool asHex) -{ - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - - if (!asHex) - { - j << "HF TRACE (" << leKey.key << "): " << msg << " " - << std::string_view( - reinterpret_cast(data.data()), data.size()); - } - else - { - std::string hex; - hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); - j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; - } - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return ret; -} - -Expected -WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) -{ - auto const ret = msg.size() + sizeof(data); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - - j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return ret; -} - -Expected -WasmHostFunctionsImpl::traceAccount( - std::string_view const& msg, - AccountID const& account) -{ - auto const ret = msg.size() + account.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - - auto const accountStr = toBase58(account); - - j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return ret; -} - -Expected -WasmHostFunctionsImpl::traceFloat( - std::string_view const& msg, - Slice const& data) -{ - auto const ret = msg.size() + data.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const s = floatToString(data); - j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return ret; -} - -Expected -WasmHostFunctionsImpl::traceAmount( - std::string_view const& msg, - STAmount const& amount) -{ - auto const ret = msg.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const amountStr = amount.getFullText(); - j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - - return ret; -} - -Expected -WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) -{ - return floatFromIntImpl(x, mode); -} - -Expected -WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) -{ - return floatFromUintImpl(x, mode); -} - -Expected -WasmHostFunctionsImpl::floatSet( - int64_t mantissa, - int32_t exponent, - int32_t mode) -{ - return floatSetImpl(mantissa, exponent, mode); -} - -Expected -WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) -{ - return floatCompareImpl(x, y); -} - -Expected -WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) -{ - return floatAddImpl(x, y, mode); -} - -Expected -WasmHostFunctionsImpl::floatSubtract( - Slice const& x, - Slice const& y, - int32_t mode) -{ - return floatSubtractImpl(x, y, mode); -} - -Expected -WasmHostFunctionsImpl::floatMultiply( - Slice const& x, - Slice const& y, - int32_t mode) -{ - return floatMultiplyImpl(x, y, mode); -} - -Expected -WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) -{ - return floatDivideImpl(x, y, mode); -} - -Expected -WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) -{ - return floatRootImpl(x, n, mode); -} - -Expected -WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) -{ - return floatPowerImpl(x, n, mode); -} - -Expected -WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) -{ - return floatLogImpl(x, mode); -} - -class Number2 : public Number -{ -protected: - static Bytes const FLOAT_NULL; - - bool good_; - -public: - Number2(Slice const& data) : Number(), good_(false) - { - if (data.size() != 8) - return; - - if (std::ranges::equal(FLOAT_NULL, data)) - { - good_ = true; - return; - } - - uint64_t const v = SerialIter(data).get64(); - if (!(v & STAmount::cIssuedCurrency)) - return; - - int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; - int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); - if (e < 1 || e > 177) - return; - - int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); - if (!m) - return; - - Number x(m, e + IOUAmount::minExponent - 1); - *static_cast(this) = x; - good_ = true; - } - - Number2() : Number(), good_(true) - { - } - - Number2(int64_t x) : Number(x), good_(true) - { - } - - Number2(uint64_t x) : Number(0), good_(false) - { - using mtype = std::invoke_result_t; - if (x <= std::numeric_limits::max()) - *this = Number(x); - else - *this = Number(x / 10, 1) + Number(x % 10); - - good_ = true; - } - - Number2(int64_t mantissa, int32_t exponent) - : Number(mantissa, exponent), good_(true) - { - } - - Number2(Number const& n) : Number(n), good_(true) - { - } - - operator bool() const - { - return good_; - } - - Expected - toBytes() const - { - uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; - v |= STAmount::cIssuedCurrency; - - uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); - if (!absM) - { - using etype = - std::invoke_result_t; - if (exponent() != std::numeric_limits::lowest()) - { - return Unexpected( - HostFunctionError:: - FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - } - return FLOAT_NULL; - } - else if (absM > ((1ull << 54) - 1)) - { - return Unexpected( - HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - } - else if (exponent() > IOUAmount::maxExponent) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < IOUAmount::minExponent) - return FLOAT_NULL; - - int const e = exponent() - IOUAmount::minExponent + 1; //+97 - v |= absM; - v |= ((uint64_t)e) << 54; - - Serializer msg; - msg.add64(v); - auto const data = msg.getData(); - -#ifdef DEBUG_OUTPUT - std::cout << "m: " << std::setw(20) << mantissa() - << ", e: " << std::setw(12) << exponent() << ", hex: "; - std::cout << std::hex << std::uppercase << std::setfill('0'); - for (auto const& c : data) - std::cout << std::setw(2) << (unsigned)c << " "; - std::cout << std::dec << std::setfill(' ') << std::endl; -#endif - - return data; - } -}; - -Bytes const Number2::FLOAT_NULL = - {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -struct SetRound -{ - Number::rounding_mode oldMode_; - bool good_; - - SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) - { - if (mode < Number::rounding_mode::to_nearest || - mode > Number::rounding_mode::upward) - return; - - Number::setround(static_cast(mode)); - good_ = true; - } - - ~SetRound() - { - Number::setround(oldMode_); - } - - operator bool() const - { - return good_; - } -}; - -std::string -floatToString(Slice const& data) -{ - Number2 const num(data); - if (!num) - { - std::string hex; - hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); - return "Invalid data: " + hex; - } - - auto const s = to_string(num); - return s; -} - -Expected -floatFromIntImpl(int64_t x, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 num(x); - return num.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatFromUintImpl(uint64_t x, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 num(x); - return num.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 num(mantissa, exponent); - return num.toBytes(); - } - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); -} - -Expected -floatCompareImpl(Slice const& x, Slice const& y) -{ - try - { - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 yy(y); - if (!yy) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return xx < yy ? 2 : (xx == yy ? 0 : 1); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatAddImpl(Slice const& x, Slice const& y, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 yy(y); - if (!yy) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 res = xx + yy; - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 yy(y); - if (!yy) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 res = xx - yy; - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 yy(y); - if (!yy) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 res = xx * yy; - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 yy(y); - if (!yy) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - Number2 res = xx / yy; - - return res.toBytes(); - } - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); -} - -Expected -floatRootImpl(Slice const& x, int32_t n, int32_t mode) -{ - try - { - if (n < 1) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 res(root(xx, n)); - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatPowerImpl(Slice const& x, int32_t n, int32_t mode) -{ - try - { - if ((n < 0) || (n > IOUAmount::maxExponent)) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - if (xx == Number() && !n) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - Number2 res(power(xx, n, 1)); - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - -Expected -floatLogImpl(Slice const& x, int32_t mode) -{ - try - { - SetRound rm(mode); - if (!rm) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 xx(x); - if (!xx) - return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - - Number2 res(lg(xx)); - - return res.toBytes(); - } - // LCOV_EXCL_START - catch (...) - { - } - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - // LCOV_EXCL_STOP -} - } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp new file mode 100644 index 00000000000..05b21d5e092 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -0,0 +1,529 @@ +#include + +#include +#include + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + +namespace xrpl { + +namespace wasm_float { + +namespace detail { + +class Number2 : public Number +{ +protected: + static Bytes const FLOAT_NULL; + + bool good_; + +public: + Number2(Slice const& data) : Number(), good_(false) + { + if (data.size() != 8) + return; + + if (std::ranges::equal(FLOAT_NULL, data)) + { + good_ = true; + return; + } + + uint64_t const v = SerialIter(data).get64(); + if (!(v & STAmount::cIssuedCurrency)) + return; + + int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); + if (e < 1 || e > 177) + return; + + int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); + if (!m) + return; + + Number x(m, e + IOUAmount::minExponent - 1); + *static_cast(this) = x; + good_ = true; + } + + Number2() : Number(), good_(true) + { + } + + Number2(int64_t x) : Number(x), good_(true) + { + } + + Number2(uint64_t x) : Number(0), good_(false) + { + using mtype = std::invoke_result_t; + if (x <= std::numeric_limits::max()) + *this = Number(x); + else + *this = Number(x / 10, 1) + Number(x % 10); + + good_ = true; + } + + Number2(int64_t mantissa, int32_t exponent) + : Number(mantissa, exponent), good_(true) + { + } + + Number2(Number const& n) : Number(n), good_(true) + { + } + + operator bool() const + { + return good_; + } + + Expected + toBytes() const + { + uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + v |= STAmount::cIssuedCurrency; + + uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); + if (!absM) + { + using etype = + std::invoke_result_t; + if (exponent() != std::numeric_limits::lowest()) + { + return Unexpected( + HostFunctionError:: + FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE + } + return FLOAT_NULL; + } + else if (absM > ((1ull << 54) - 1)) + { + return Unexpected( + HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE + } + else if (exponent() > IOUAmount::maxExponent) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (exponent() < IOUAmount::minExponent) + return FLOAT_NULL; + + int const e = exponent() - IOUAmount::minExponent + 1; //+97 + v |= absM; + v |= ((uint64_t)e) << 54; + + Serializer msg; + msg.add64(v); + auto const data = msg.getData(); + +#ifdef DEBUG_OUTPUT + std::cout << "m: " << std::setw(20) << mantissa() + << ", e: " << std::setw(12) << exponent() << ", hex: "; + std::cout << std::hex << std::uppercase << std::setfill('0'); + for (auto const& c : data) + std::cout << std::setw(2) << (unsigned)c << " "; + std::cout << std::dec << std::setfill(' ') << std::endl; +#endif + + return data; + } +}; + +Bytes const Number2::FLOAT_NULL = + {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + +struct SetRound +{ + Number::rounding_mode oldMode_; + bool good_; + + SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) + { + if (mode < Number::rounding_mode::to_nearest || + mode > Number::rounding_mode::upward) + return; + + Number::setround(static_cast(mode)); + good_ = true; + } + + ~SetRound() + { + Number::setround(oldMode_); + } + + operator bool() const + { + return good_; + } +}; + +} // namespace detail + +std::string +floatToString(Slice const& data) +{ + detail::Number2 const num(data); + if (!num) + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return "Invalid data: " + hex; + } + + auto const s = to_string(num); + return s; +} + +Expected +floatFromIntImpl(int64_t x, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 num(x); + return num.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatFromUintImpl(uint64_t x, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 num(x); + return num.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 num(mantissa, exponent); + return num.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatCompareImpl(Slice const& x, Slice const& y) +{ + try + { + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + return xx < yy ? 2 : (xx == yy ? 0 : 1); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatAddImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 res = xx + yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 res = xx - yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 res = xx * yy; + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 yy(y); + if (!yy) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + detail::Number2 res = xx / yy; + + return res.toBytes(); + } + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); +} + +Expected +floatRootImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + if (n < 1) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 res(root(xx, n)); + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatPowerImpl(Slice const& x, int32_t n, int32_t mode) +{ + try + { + if ((n < 0) || (n > IOUAmount::maxExponent)) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + if (xx == Number() && !n) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + detail::Number2 res(power(xx, n, 1)); + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +Expected +floatLogImpl(Slice const& x, int32_t mode) +{ + try + { + detail::SetRound rm(mode); + if (!rm) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 xx(x); + if (!xx) + return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); + + detail::Number2 res(lg(xx)); + + return res.toBytes(); + } + // LCOV_EXCL_START + catch (...) + { + } + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + // LCOV_EXCL_STOP +} + +} // namespace wasm_float + +// ========================================================= +// ACTUAL HOST FUNCTIONS +// ========================================================= + +Expected +WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) +{ + return wasm_float::floatFromIntImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) +{ + return wasm_float::floatFromUintImpl(x, mode); +} + +Expected +WasmHostFunctionsImpl::floatSet( + int64_t mantissa, + int32_t exponent, + int32_t mode) +{ + return wasm_float::floatSetImpl(mantissa, exponent, mode); +} + +Expected +WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) +{ + return wasm_float::floatCompareImpl(x, y); +} + +Expected +WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) +{ + return wasm_float::floatAddImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatSubtract( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return wasm_float::floatSubtractImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatMultiply( + Slice const& x, + Slice const& y, + int32_t mode) +{ + return wasm_float::floatMultiplyImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) +{ + return wasm_float::floatDivideImpl(x, y, mode); +} + +Expected +WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) +{ + return wasm_float::floatRootImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) +{ + return wasm_float::floatPowerImpl(x, n, mode); +} + +Expected +WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) +{ + return wasm_float::floatLogImpl(x, mode); +} + +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp new file mode 100644 index 00000000000..d137ec1fef4 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -0,0 +1,374 @@ +#include + +#include +#include + +namespace xrpl { + +namespace detail { + +static Expected +getAnyFieldData(STBase const* obj) +{ + // auto const& fname = obj.getFName(); + if (!obj) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + auto const stype = obj->getSType(); + switch (stype) + { + // LCOV_EXCL_START + case STI_UNKNOWN: + case STI_NOTPRESENT: + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + break; + // LCOV_EXCL_STOP + case STI_OBJECT: + case STI_ARRAY: + return Unexpected(HostFunctionError::NOT_LEAF_FIELD); + break; + case STI_ACCOUNT: { + auto const* account(static_cast(obj)); + auto const& data = account->value(); + return Bytes{data.begin(), data.end()}; + } + break; + case STI_AMOUNT: + // will be processed by serializer + break; + case STI_ISSUE: { + auto const* issue(static_cast(obj)); + Asset const& asset(issue->value()); + // XRP and IOU will be processed by serializer + if (asset.holds()) + { + // MPT + auto const& mptIssue = asset.get(); + auto const& mptID = mptIssue.getMptID(); + return Bytes{mptID.cbegin(), mptID.cend()}; + } + } + break; + case STI_VL: { + auto const* vl(static_cast(obj)); + auto const& data = vl->value(); + return Bytes{data.begin(), data.end()}; + } + break; + case STI_UINT16: { + auto const& num(static_cast const*>(obj)); + std::uint16_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + case STI_UINT32: { + auto const* num(static_cast const*>(obj)); + std::uint32_t const data = num->value(); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; + } + break; + default: + break; // default to serializer + } + + Serializer msg; + obj->add(msg); + auto const data = msg.getData(); + + return data; +} + +static inline bool +noField(STBase const* field) +{ + return !field || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); +} + +static Expected +locateField(STObject const& obj, Slice const& locator) +{ + if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + + int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; + int32_t const* locPtr = &locBuf[0]; + int32_t const locSize = locator.size() / sizeof(int32_t); + + uintptr_t p = reinterpret_cast(locator.data()); + if (p & (alignof(int32_t) - 1)) // unaligned + memcpy(&locBuf[0], locator.data(), locator.size()); + else + locPtr = reinterpret_cast(locator.data()); + + STBase const* field = nullptr; + auto const& knownSFields = SField::getKnownCodeToField(); + + { + int32_t const sfieldCode = locPtr[0]; + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + + auto const& fname(*it->second); + field = obj.peekAtPField(fname); + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + for (int i = 1; i < locSize; ++i) + { + int32_t const sfieldCode = locPtr[i]; + + if (STI_ARRAY == field->getSType()) + { + auto const* arr = static_cast(field); + if (sfieldCode >= arr->size()) + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + field = &(arr->operator[](sfieldCode)); + } + else if (STI_OBJECT == field->getSType()) + { + auto const* o = static_cast(field); + + auto const it = knownSFields.find(sfieldCode); + if (it == knownSFields.end()) + return Unexpected(HostFunctionError::INVALID_FIELD); + + auto const& fname(*it->second); + field = o->peekAtPField(fname); + } + else // simple field must be the last one + { + return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + } + + if (noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + return field; +} + +} // namespace detail + +Expected +WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) +{ + auto const& keylet = keylet::unchecked(objId); + if (cacheIdx < 0 || cacheIdx > MAX_CACHE) + return Unexpected(HostFunctionError::SLOT_OUT_RANGE); + + if (cacheIdx == 0) + { + for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + if (!cache[cacheIdx]) + break; + } + else + { + cacheIdx--; // convert to 0-based index + } + + if (cacheIdx >= MAX_CACHE) + return Unexpected(HostFunctionError::SLOTS_FULL); + + cache[cacheIdx] = ctx.view().read(keylet); + if (!cache[cacheIdx]) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + return cacheIdx + 1; // return 1-based index +} + +// Subsection: top level getters + +Expected +WasmHostFunctionsImpl::getTxField(SField const& fname) +{ + return detail::getAnyFieldData(ctx.tx.peekAtPField(fname)); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + return detail::getAnyFieldData(sle.value()->peekAtPField(fname)); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + return detail::getAnyFieldData( + cache[normalizedIdx.value()]->peekAtPField(fname)); +} + +// Subsection: nested getters + +Expected +WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) +{ + auto const r = detail::locateField(ctx.tx, locator); + if (!r) + return Unexpected(r.error()); + + return detail::getAnyFieldData(r.value()); +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + + auto const r = detail::locateField(*sle.value(), locator); + if (!r) + return Unexpected(r.error()); + + return detail::getAnyFieldData(r.value()); +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedField( + int32_t cacheIdx, + Slice const& locator) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const r = detail::locateField(*cache[normalizedIdx.value()], locator); + if (!r) + return Unexpected(r.error()); + + return detail::getAnyFieldData(r.value()); +} + +// Subsection: array length getters + +Expected +WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const* field = ctx.tx.peekAtPField(fname); + if (detail::noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + + auto const* field = sle.value()->peekAtPField(fname); + if (detail::noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getLedgerObjArrayLen( + int32_t cacheIdx, + SField const& fname) +{ + if (fname.fieldType != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); + if (detail::noField(field)) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE + + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +// Subsection: nested array length getters + +Expected +WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) +{ + auto const r = detail::locateField(ctx.tx, locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) +{ + auto const sle = getCurrentLedgerObj(); + if (!sle.has_value()) + return Unexpected(sle.error()); + auto const r = detail::locateField(*sle.value(), locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +Expected +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( + int32_t cacheIdx, + Slice const& locator) +{ + auto const normalizedIdx = normalizeCacheIndex(cacheIdx); + if (!normalizedIdx.has_value()) + return Unexpected(normalizedIdx.error()); + + auto const r = detail::locateField(*cache[normalizedIdx.value()], locator); + if (!r) + return Unexpected(r.error()); + + auto const* field = r.value(); + if (field->getSType() != STI_ARRAY) + return Unexpected(HostFunctionError::NO_ARRAY); + int32_t const sz = static_cast(field)->size(); + + return sz; +} + +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp new file mode 100644 index 00000000000..89ec35cd3b2 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp @@ -0,0 +1,228 @@ +#include + +#include +#include + +namespace xrpl { + +Expected +WasmHostFunctionsImpl::accountKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::account(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) +{ + if (issue1 == issue2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + // note: this should be removed with the MPT DEX amendment + if (issue1.holds() || issue2.holds()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::amm(issue1, issue2); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::credentialKeylet( + AccountID const& subject, + AccountID const& issuer, + Slice const& credentialType) +{ + if (!subject || !issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + if (credentialType.empty() || + credentialType.size() > maxCredentialTypeLength) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::credential(subject, issuer, credentialType); + + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::didKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::did(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::delegateKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::delegate(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::depositPreauthKeylet( + AccountID const& account, + AccountID const& authorize) +{ + if (!account || !authorize) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == authorize) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::depositPreauth(account, authorize); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::escrow(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::lineKeylet( + AccountID const& account1, + AccountID const& account2, + Currency const& currency) +{ + if (!account1 || !account2) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account1 == account2) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (currency.isZero()) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto const keylet = keylet::line(account1, account2, currency); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptIssuanceKeylet( + AccountID const& issuer, + std::uint32_t seq) +{ + if (!issuer) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptIssuance(seq, issuer); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::mptokenKeylet( + MPTID const& mptid, + AccountID const& holder) +{ + if (!mptid) + return Unexpected(HostFunctionError::INVALID_PARAMS); + if (!holder) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + auto const keylet = keylet::mptoken(mptid, holder); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::nftOfferKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::nftoffer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::offer(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::oracleKeylet( + AccountID const& account, + std::uint32_t documentId) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::oracle(account, documentId); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::paychanKeylet( + AccountID const& account, + AccountID const& destination, + std::uint32_t seq) +{ + if (!account || !destination) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + if (account == destination) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto const keylet = keylet::payChan(account, destination, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::permissionedDomainKeylet( + AccountID const& account, + std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::permissionedDomain(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::signersKeylet(AccountID const& account) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::signers(account); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::ticket(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +Expected +WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::vault(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; +} + +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp new file mode 100644 index 00000000000..1889341ebe3 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp @@ -0,0 +1,59 @@ +#include +#include + +#include + +namespace xrpl { + +// ========================================================= +// SECTION: LEDGER HEADER FUNCTIONS +// ========================================================= + +Expected +WasmHostFunctionsImpl::getLedgerSqn() +{ + auto seq = ctx.view().seq(); + if (seq > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE + return static_cast(seq); +} + +Expected +WasmHostFunctionsImpl::getParentLedgerTime() +{ + auto time = ctx.view().parentCloseTime().time_since_epoch().count(); + if (time > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(time); +} + +Expected +WasmHostFunctionsImpl::getParentLedgerHash() +{ + return ctx.view().header().parentHash; +} + +Expected +WasmHostFunctionsImpl::getBaseFee() +{ + auto fee = ctx.view().fees().base.drops(); + if (fee > std::numeric_limits::max()) + return Unexpected(HostFunctionError::INTERNAL); + return static_cast(fee); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) +{ + return ctx.view().rules().enabled(amendmentId); +} + +Expected +WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) +{ + auto const& table = ctx.app.getAmendmentTable(); + auto const amendment = table.find(std::string(amendmentName)); + return ctx.view().rules().enabled(amendment); +} + +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp new file mode 100644 index 00000000000..7c4ee00406d --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp @@ -0,0 +1,68 @@ +#include +#include + +#include +#include + +namespace xrpl { + +// ========================================================= +// SECTION: NFT UTILS +// ========================================================= + +Expected +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +{ + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + + if (!nftId) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + auto obj = nft::findToken(ctx.view(), account, nftId); + if (!obj) + return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); + + auto objUri = obj->at(~sfURI); + if (!objUri) + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + + Slice const s = objUri->value(); + return Bytes(s.begin(), s.end()); +} + +Expected +WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) +{ + auto const issuer = nft::getIssuer(nftId); + if (!issuer) + return Unexpected(HostFunctionError::INVALID_PARAMS); + + return Bytes{issuer.begin(), issuer.end()}; +} + +Expected +WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) +{ + return nft::toUInt32(nft::getTaxon(nftId)); +} + +Expected +WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) +{ + return nft::getFlags(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) +{ + return nft::getTransferFee(nftId); +} + +Expected +WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) +{ + return nft::getSerial(nftId); +} + +} // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp new file mode 100644 index 00000000000..d597a54f541 --- /dev/null +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -0,0 +1,141 @@ +#include + +#include +#include + +#ifdef _DEBUG +// #define DEBUG_OUTPUT 1 +#endif + +namespace xrpl { + +Expected +WasmHostFunctionsImpl::trace( + std::string_view const& msg, + Slice const& data, + bool asHex) +{ + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return ret; + auto j = getJournal().trace(); +#endif + + if (!asHex) + { + j << "HF TRACE (" << leKey.key << "): " << msg << " " + << std::string_view( + reinterpret_cast(data.data()), data.size()); + } + else + { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; + } + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; +} + +Expected +WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) +{ + auto const ret = msg.size() + sizeof(data); +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return ret; + auto j = getJournal().trace(); +#endif + + j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; +} + +Expected +WasmHostFunctionsImpl::traceAccount( + std::string_view const& msg, + AccountID const& account) +{ + auto const ret = msg.size() + account.size(); +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return ret; + auto j = getJournal().trace(); +#endif + + auto const accountStr = toBase58(account); + + j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; +} + +Expected +WasmHostFunctionsImpl::traceFloat( + std::string_view const& msg, + Slice const& data) +{ + auto const ret = msg.size() + data.size(); +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return ret; + auto j = getJournal().trace(); +#endif + auto const s = wasm_float::floatToString(data); + j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; +} + +Expected +WasmHostFunctionsImpl::traceAmount( + std::string_view const& msg, + STAmount const& amount) +{ + auto const ret = msg.size(); +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return ret; + auto j = getJournal().trace(); +#endif + auto const amountStr = amount.getFullText(); + j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + + return ret; +} + +} // namespace xrpl From 1809fe07f2510e1c00785da4c366af31fbbfd11c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 14 Jan 2026 12:43:12 -0500 Subject: [PATCH 148/212] remove test file --- clang_format.sh | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100755 clang_format.sh diff --git a/clang_format.sh b/clang_format.sh deleted file mode 100755 index 2d834b515d5..00000000000 --- a/clang_format.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# cspell: ignore clangf -modified=$1 -dir=`pwd` -clangf=clang-format-10 -clangf=clang-format -if [ "$1" = "--all" ] -then - modified=`git status|egrep "modified|new file"|egrep "(cpp|h)$" | sed -E -e 's/modified://' -e 's/new file://' -e 's/^[[:space:]]+//'` -fi -for i in $modified -do - basedir=$(dirname "$i") - file=$(basename "$i") - echo "$basedir $file" - cd $basedir - $clangf -style=file -i "$file" - cd $dir -done From c5e50aa221010d76b793f78b20506687c37f0229 Mon Sep 17 00:00:00 2001 From: Oleksandr <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 14 Jan 2026 14:46:29 -0500 Subject: [PATCH 149/212] Fix merge issues --- include/xrpl/protocol/IOUAmount.h | 9 --------- src/libxrpl/protocol/IOUAmount.cpp | 12 ++++++++++-- src/test/app/HostFuncImpl_test.cpp | 18 +++++++++--------- src/xrpld/app/wasm/HostFuncImpl.h | 10 ++++++++++ .../app/wasm/detail/HostFuncImplFloat.cpp | 10 +++++----- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/include/xrpl/protocol/IOUAmount.h b/include/xrpl/protocol/IOUAmount.h index 1d1a7f06b58..405de18e291 100644 --- a/include/xrpl/protocol/IOUAmount.h +++ b/include/xrpl/protocol/IOUAmount.h @@ -44,15 +44,6 @@ class IOUAmount : private boost::totally_ordered, fromNumber(Number const& number); public: - /* The range for the mantissa when normalized */ - // log(2^63,10) ~ 18.96 - // - static std::int64_t constexpr minMantissa = STAmount::cMinValue; - static std::int64_t constexpr maxMantissa = STAmount::cMaxValue; - /* The range for the exponent when normalized */ - static int constexpr minExponent = STAmount::cMinOffset; - static int constexpr maxExponent = STAmount::cMaxOffset; - IOUAmount() = default; explicit IOUAmount(Number const& other); IOUAmount(beast::Zero); diff --git a/src/libxrpl/protocol/IOUAmount.cpp b/src/libxrpl/protocol/IOUAmount.cpp index 07767cd9e10..297c2bac12d 100644 --- a/src/libxrpl/protocol/IOUAmount.cpp +++ b/src/libxrpl/protocol/IOUAmount.cpp @@ -42,6 +42,15 @@ setSTNumberSwitchover(bool v) *getStaticSTNumberSwitchover() = v; } +/* The range for the mantissa when normalized */ +// log(2^63,10) ~ 18.96 +// +static std::int64_t constexpr minMantissa = STAmount::cMinValue; +static std::int64_t constexpr maxMantissa = STAmount::cMaxValue; +/* The range for the exponent when normalized */ +static int constexpr minExponent = STAmount::cMinOffset; +static int constexpr maxExponent = STAmount::cMaxOffset; + IOUAmount IOUAmount::fromNumber(Number const& number) { @@ -298,8 +307,7 @@ mulRatio( { if (!result) { - return IOUAmount( - -IOUAmount::minMantissa, IOUAmount::minExponent); + return IOUAmount(-minMantissa, minExponent); } // This subtraction cannot underflow because `result` is not zero return IOUAmount(result.mantissa() - 1, result.exponent()); diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index b53126671b4..520342629a5 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2374,7 +2374,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = - hfs.floatSet(1, IOUAmount::maxExponent + normalExp + 1, 0); + hfs.floatSet(1, wasm_float::maxExponent + normalExp + 1, 0); BEAST_EXPECT(!result) && BEAST_EXPECT( result.error() == @@ -2383,37 +2383,37 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = - hfs.floatSet(1, IOUAmount::minExponent + normalExp - 1, 0); + hfs.floatSet(1, wasm_float::minExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } { auto const result = - hfs.floatSet(1, IOUAmount::maxExponent + normalExp, 0); + hfs.floatSet(1, wasm_float::maxExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); } { auto const result = - hfs.floatSet(-1, IOUAmount::maxExponent + normalExp, 0); + hfs.floatSet(-1, wasm_float::maxExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); } { auto const result = - hfs.floatSet(1, IOUAmount::maxExponent + normalExp - 1, 0); + hfs.floatSet(1, wasm_float::maxExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); } { - auto const result = - hfs.floatSet(IOUAmount::maxMantissa, IOUAmount::maxExponent, 0); + auto const result = hfs.floatSet( + wasm_float::maxMantissa, wasm_float::maxExponent, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); } { auto const result = - hfs.floatSet(1, IOUAmount::minExponent + normalExp, 0); + hfs.floatSet(1, wasm_float::minExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinExp); } @@ -2713,7 +2713,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const y = hfs.floatSet( - IOUAmount::maxMantissa, -normalExp - 1, 0); // 0.9999999... + wasm_float::maxMantissa, -normalExp - 1, 0); // 0.9999999... if (BEAST_EXPECT(y)) { auto const result = diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index fccea112520..7688eaf7246 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -271,4 +271,14 @@ class WasmHostFunctionsImpl : public HostFunctions floatLog(Slice const& x, int32_t mode) override; }; +namespace wasm_float { + +// The range for the mantissa and exponent when normalized +static std::int64_t constexpr minMantissa = STAmount::cMinValue; +static std::int64_t constexpr maxMantissa = STAmount::cMaxValue; +static int constexpr minExponent = STAmount::cMinOffset; +static int constexpr maxExponent = STAmount::cMaxOffset; + +} // namespace wasm_float + } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index 05b21d5e092..4e6c45ccf0e 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -45,7 +45,7 @@ class Number2 : public Number if (!m) return; - Number x(m, e + IOUAmount::minExponent - 1); + Number x(m, e + minExponent - 1); *static_cast(this) = x; good_ = true; } @@ -107,12 +107,12 @@ class Number2 : public Number return Unexpected( HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } - else if (exponent() > IOUAmount::maxExponent) + else if (exponent() > maxExponent) return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < IOUAmount::minExponent) + else if (exponent() < minExponent) return FLOAT_NULL; - int const e = exponent() - IOUAmount::minExponent + 1; //+97 + int const e = exponent() - minExponent + 1; //+97 v |= absM; v |= ((uint64_t)e) << 54; @@ -395,7 +395,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { - if ((n < 0) || (n > IOUAmount::maxExponent)) + if ((n < 0) || (n > maxExponent)) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::SetRound rm(mode); From fc35a9f9c82d70fab2be964e9f798d59269cfc62 Mon Sep 17 00:00:00 2001 From: Oleksandr <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 14 Jan 2026 19:36:44 -0500 Subject: [PATCH 150/212] Fix usage of the Number class --- src/test/app/HostFuncImpl_test.cpp | 10 +-- src/xrpld/app/wasm/HostFuncImpl.h | 8 +- .../app/wasm/detail/HostFuncImplFloat.cpp | 73 ++++++++++++------- 3 files changed, 56 insertions(+), 35 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 520342629a5..de1468ca858 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2176,7 +2176,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Bytes const floatIntMin = {0x99, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // -2^63 Bytes const floatIntZero = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; // 0 Bytes const floatIntMax = {0xd9, 0x20, 0xc4, 0x9b, 0xa5, 0xe3, 0x53, 0xf8}; // 2^63-1 - Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64 + Bytes const floatUIntMax = {0xd9, 0x46, 0x8d, 0xb8, 0xba, 0xc7, 0x10, 0xcb}; // 2^64-1 Bytes const floatMaxExp = {0xEC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(80+15) Bytes const floatPreMaxExp = {0xEC, 0x03, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // 1e(79+15) Bytes const floatMinusMaxExp = {0xAC, 0x43, 0x8D, 0x7E, 0xA4, 0xC6, 0x80, 0x00}; // -1e(80+15) @@ -2365,7 +2365,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = - hfs.floatSet(1, Number::maxExponent + normalExp + 1, 0); + hfs.floatSet(1, wasm_float::maxExponent + normalExp + 1, 0); BEAST_EXPECT(!result) && BEAST_EXPECT( result.error() == @@ -2406,8 +2406,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const result = hfs.floatSet( - wasm_float::maxMantissa, wasm_float::maxExponent, 0); + auto const result = + hfs.floatSet(STAmount::cMaxValue, wasm_float::maxExponent, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); } @@ -2713,7 +2713,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const y = hfs.floatSet( - wasm_float::maxMantissa, -normalExp - 1, 0); // 0.9999999... + STAmount::cMaxValue, -normalExp - 1, 0); // 0.9999999... if (BEAST_EXPECT(y)) { auto const result = diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 7688eaf7246..0183a74a124 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -274,10 +274,10 @@ class WasmHostFunctionsImpl : public HostFunctions namespace wasm_float { // The range for the mantissa and exponent when normalized -static std::int64_t constexpr minMantissa = STAmount::cMinValue; -static std::int64_t constexpr maxMantissa = STAmount::cMaxValue; -static int constexpr minExponent = STAmount::cMinOffset; -static int constexpr maxExponent = STAmount::cMaxOffset; +static std::int64_t constexpr minMantissa = 1'000'000'000'000'000ll; +static std::int64_t constexpr maxMantissa = (1ull << 54) - 1; +static int constexpr minExponent = -96; +static int constexpr maxExponent = 80; } // namespace wasm_float diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index 4e6c45ccf0e..e424e3cedf7 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -45,7 +45,7 @@ class Number2 : public Number if (!m) return; - Number x(m, e + minExponent - 1); + Number x(makeNumber(m, e + wasm_float::minExponent - 1)); *static_cast(this) = x; good_ = true; } @@ -54,7 +54,7 @@ class Number2 : public Number { } - Number2(int64_t x) : Number(x), good_(true) + Number2(int64_t x) : Number(makeNumber(x, 0)), good_(true) { } @@ -62,20 +62,34 @@ class Number2 : public Number { using mtype = std::invoke_result_t; if (x <= std::numeric_limits::max()) - *this = Number(x); + *this = makeNumber(x, 0); else - *this = Number(x / 10, 1) + Number(x % 10); - + *this = makeNumber(x / 10, 1); good_ = true; } Number2(int64_t mantissa, int32_t exponent) - : Number(mantissa, exponent), good_(true) + : Number(makeNumber(mantissa, exponent)), good_(true) + { + } + + Number2(Number const& n) + : Number(makeNumber(n.mantissa(), n.exponent())), good_(true) { } - Number2(Number const& n) : Number(n), good_(true) + static Number + makeNumber(int64_t mantissa, int32_t exponent) { + if (mantissa < 0) + return Number(true, -mantissa, exponent, Number::normalized()); + return Number(false, mantissa, exponent, Number::normalized()); + } + + static Number + makeNumber(uint64_t mantissa, int32_t exponent) + { + return Number(false, mantissa, exponent, Number::normalized()); } operator bool() const @@ -102,17 +116,17 @@ class Number2 : public Number } return FLOAT_NULL; } - else if (absM > ((1ull << 54) - 1)) + else if (absM > wasm_float::maxMantissa) { return Unexpected( HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } - else if (exponent() > maxExponent) + else if (exponent() > wasm_float::maxExponent) return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < minExponent) + else if (exponent() < wasm_float::minExponent) return FLOAT_NULL; - int const e = exponent() - minExponent + 1; //+97 + int const e = exponent() - wasm_float::minExponent + 1; //+97 v |= absM; v |= ((uint64_t)e) << 54; @@ -136,24 +150,30 @@ class Number2 : public Number Bytes const Number2::FLOAT_NULL = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -struct SetRound +struct FloatState { Number::rounding_mode oldMode_; + MantissaRange::mantissa_scale oldScale_; bool good_; - SetRound(int32_t mode) : oldMode_(Number::getround()), good_(false) + FloatState(int32_t mode) + : oldMode_(Number::getround()) + , oldScale_(Number::getMantissaScale()) + , good_(false) { if (mode < Number::rounding_mode::to_nearest || mode > Number::rounding_mode::upward) return; Number::setround(static_cast(mode)); + Number::setMantissaScale(MantissaRange::mantissa_scale::small); good_ = true; } - ~SetRound() + ~FloatState() { Number::setround(oldMode_); + Number::setMantissaScale(oldScale_); } operator bool() const @@ -186,7 +206,7 @@ floatFromIntImpl(int64_t x, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -206,12 +226,13 @@ floatFromUintImpl(uint64_t x, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 num(x); - return num.toBytes(); + auto r = num.toBytes(); + return r; } // LCOV_EXCL_START catch (...) @@ -226,7 +247,7 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 num(mantissa, exponent); @@ -264,7 +285,7 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -291,7 +312,7 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 xx(x); @@ -317,7 +338,7 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 xx(x); @@ -343,7 +364,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 xx(x); @@ -370,7 +391,7 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) if (n < 1) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -395,10 +416,10 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { - if ((n < 0) || (n > maxExponent)) + if ((n < 0) || (n > wasm_float::maxExponent)) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -425,7 +446,7 @@ floatLogImpl(Slice const& x, int32_t mode) { try { - detail::SetRound rm(mode); + detail::FloatState rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); From 209a1a6ffa5c60128b1a759f090facdfa08e6b91 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 15 Jan 2026 19:52:22 -0500 Subject: [PATCH 151/212] Don't throw from hostfunctions stack (#6221) --- src/xrpld/app/wasm/WasmiVM.h | 1 + src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 9 +++++- src/xrpld/app/wasm/detail/WasmiVM.cpp | 30 ++++++++++++++----- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index c39b577c46f..0d051ea49b0 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -108,6 +108,7 @@ struct InstanceWrapper { wasm_store_t* store_ = nullptr; WasmExternVec exports_; + mutable int memIdx_ = -1; InstancePtr instance_; beast::Journal j_ = beast::Journal(beast::Journal::getNullSink()); diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index ee284fa6e9f..8910f22aa13 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -332,7 +332,14 @@ checkGas(void* env) int64_t const gas = runtime->getGas(); WasmImportFunc const& impFunc = udata->second; int64_t const x = gas >= impFunc.gas ? gas - impFunc.gas : 0; - runtime->setGas(x); + + if (runtime->setGas(x) < 0) + { + wasm_trap_t* trap = reinterpret_cast( + WasmEngine::instance().newTrap("can't set gas")); // LCOV_EXCL_LINE + return Unexpected(trap); // LCOV_EXCL_LINE + } + if (gas < impFunc.gas) { wasm_trap_t* trap = reinterpret_cast( diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 3c56f885dd6..8bd4a7b8b8c 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -103,6 +103,8 @@ InstanceWrapper::operator=(InstanceWrapper&& o) store_ = o.store_; o.store_ = nullptr; exports_ = std::move(o.exports_); + memIdx_ = o.memIdx_; + o.memIdx_ = -1; instance_ = std::move(o.instance_); j_ = o.j_; @@ -162,22 +164,29 @@ InstanceWrapper::getFunc( wmem InstanceWrapper::getMem() const { - if (!instance_) - throw std::runtime_error("no instance"); // LCOV_EXCL_LINE + if (memIdx_ >= 0) + { + auto* e(exports_.vec_.data[memIdx_]); + wasm_memory_t* mem = wasm_extern_as_memory(e); + return { + reinterpret_cast(wasm_memory_data(mem)), + wasm_memory_data_size(mem)}; + } wasm_memory_t* mem = nullptr; - for (unsigned i = 0; i < exports_.vec_.size; ++i) + for (int i = 0; i < exports_.vec_.size; ++i) { auto* e(exports_.vec_.data[i]); if (wasm_extern_kind(e) == WASM_EXTERN_MEMORY) { + memIdx_ = i; mem = wasm_extern_as_memory(e); break; } } if (!mem) - throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE + return {}; // LCOV_EXCL_LINE return { reinterpret_cast(wasm_memory_data(mem)), @@ -209,7 +218,7 @@ InstanceWrapper::setGas(std::int64_t gas) const // LCOV_EXCL_START print_wasm_error("Can't set instance gas", nullptr, j_); wasmi_error_delete(err); - throw std::runtime_error("Can't set instance gas"); + return -1; // LCOV_EXCL_STOP } @@ -592,11 +601,13 @@ WasmiEngine::convertParams(std::vector const& params) break; // LCOV_EXCL_STOP case WT_U8V: { + auto mem = getMem(); + if (!mem.s) + throw std::runtime_error( + "no memory exported"); // LCOV_EXCL_LINE auto const sz = p.of.u8v.sz; auto const ptr = allocate(sz); - auto mem = getMem(); memcpy(mem.p + ptr, p.of.u8v.d, sz); - v.push_back(WASM_I32_VAL(ptr)); v.push_back(WASM_I32_VAL(sz)); } @@ -751,8 +762,11 @@ WasmiEngine::call( std::size_t sz, Types&&... args) { - auto const ptr = allocate(sz); auto mem = getMem(); + if (!mem.s) + throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE + + auto const ptr = allocate(sz); memcpy(mem.p + ptr, d, sz); add_param(in, ptr); From 9a9a7aab01369d5ec4e093d6009698f1cf73c722 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 15 Jan 2026 20:14:42 -0500 Subject: [PATCH 152/212] Add `Vector256` support to the locator (#6131) * add Vector256 nesting/length support * [WIP] add tests * fix tests * simplify with helper function * oops typo * remove static variable * respond to comments * STBaseOrUInt256->FieldValue * oops * add more tests for coverage * respond to comments --- src/test/app/HostFuncImpl_test.cpp | 91 ++++++++++++++-- .../app/wasm/detail/HostFuncImplGetter.cpp | 101 +++++++++++------- 2 files changed, 145 insertions(+), 47 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index de1468ca858..769c7741e82 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -29,6 +29,12 @@ toBytes(std::uint32_t value) return Bytes{b, e}; } +static Bytes +toBytes(uint256 const& value) +{ + return Bytes{value.begin(), value.end()}; +} + static Bytes toBytes(Asset const& asset) { @@ -303,6 +309,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("getTxField"); using namespace test::jtx; + std::string const credIdHex = + "0011223344556677889900112233445566778899001122334455667788990011"; + uint256 credId; + BEAST_EXPECT(credId.parseHex(credIdHex)); + Env env{*this}; OpenView ov{*env.current()}; STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { @@ -310,6 +321,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setAccountID(sfOwner, env.master.id()); obj.setFieldU32(sfOfferSequence, env.seq(env.master)); obj.setFieldArray(sfMemos, STArray{}); + STVector256 credIds; + credIds.push_back(credId); + obj.setFieldV256(sfCredentialIDs, credIds); }); ApplyContext ac = createApplyContext(env, ov, stx); auto const dummyEscrow = @@ -340,6 +354,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT( memos.error() == HostFunctionError::NOT_LEAF_FIELD); + auto const credentialIds = hfs.getTxField(sfCredentialIDs); + if (BEAST_EXPECT(!credentialIds.has_value())) + BEAST_EXPECTS( + credentialIds.error() == HostFunctionError::NOT_LEAF_FIELD, + std::to_string(HfErrorToInt(credentialIds.error()))); + auto const nonField = hfs.getTxField(sfInvalid); if (BEAST_EXPECT(!nonField.has_value())) BEAST_EXPECT( @@ -450,6 +470,15 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(*amountField == toBytes(XRP(100))); } + // Should return the PreviousTxnID field from the escrow ledger object + auto const previousTxnId = + hfs.getCurrentLedgerObjField(sfPreviousTxnID); + if (BEAST_EXPECT(previousTxnId.has_value())) + { + BEAST_EXPECT( + *previousTxnId == toBytes(env.tx()->getTransactionID())); + } + // Should return nullopt for a field not present auto const notPresent = hfs.getCurrentLedgerObjField(sfOwner); BEAST_EXPECT( @@ -541,6 +570,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; + std::string const credIdHex = + "0011223344556677889900112233445566778899001122334455667788990011"; + uint256 credId; + BEAST_EXPECT(credId.parseHex(credIdHex)); + // Create a transaction with a nested array field STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { obj.setAccountID(sfAccount, env.master.id()); @@ -549,6 +583,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); memos.push_back(memoObj); obj.setFieldArray(sfMemos, memos); + STVector256 credIds; + credIds.push_back(credId); + obj.setFieldV256(sfCredentialIDs, credIds); }); ApplyContext ac = createApplyContext(env, ov, stx); @@ -578,6 +615,24 @@ struct HostFuncImpl_test : public beast::unit_test::suite } } + { + // Locator for sfCredentialIDs[0] + std::vector locatorVec = {sfCredentialIDs.fieldCode, 0}; + Slice locator( + reinterpret_cast(locatorVec.data()), + locatorVec.size() * sizeof(int32_t)); + + auto const result = hfs.getTxNestedField(locator); + if (BEAST_EXPECTS( + result.has_value(), + std::to_string(static_cast(result.error())))) + { + std::string credIdResult( + result.value().begin(), result.value().end()); + BEAST_EXPECT(strHex(credIdResult) == credIdHex); + } + } + { // can use the nested locator for base fields too std::vector locatorVec = {sfAccount.fieldCode}; @@ -637,6 +692,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite sfMemoData.fieldCode}, HostFunctionError::INDEX_OUT_OF_BOUNDS); + // Locator for non-existent index + expectError( + {sfCredentialIDs.fieldCode, 1}, // index 1 does not exist + HostFunctionError::INDEX_OUT_OF_BOUNDS); + // Locator for non-existent nested field expectError( {sfMemos.fieldCode, @@ -661,6 +721,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for STArray expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + // Locator for STVector256 + expectError( + {sfCredentialIDs.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + // Locator for nesting into non-array/object field expectError( {sfAccount.fieldCode, // sfAccount is not an array or object @@ -956,6 +1020,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("getTxArrayLen"); using namespace test::jtx; + std::string const credIdHex = + "0011223344556677889900112233445566778899001122334455667788990011"; + uint256 credId; + BEAST_EXPECT(credId.parseHex(credIdHex)); + Env env{*this}; OpenView ov{*env.current()}; @@ -974,6 +1043,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite memos.push_back(memoObj); } obj.setFieldArray(sfMemos, memos); + STVector256 credIds; + credIds.push_back(credId); + obj.setFieldV256(sfCredentialIDs, credIds); }); ApplyContext ac = createApplyContext(env, ov, stx); @@ -996,6 +1068,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(!missingArray.has_value())) BEAST_EXPECT( missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + + // Should return 1 for sfCredentialIDs + auto const credIdsLen = hfs.getTxArrayLen(sfCredentialIDs); + if (BEAST_EXPECT(credIdsLen.has_value())) + BEAST_EXPECT(credIdsLen.value() == 1); } void @@ -2195,9 +2272,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite // clang-format on void - testFloatTrace() + testTraceFloat() { - testcase("FloatTrace"); + testcase("traceFloat"); using namespace test::jtx; { @@ -2251,7 +2328,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloatFromInt() { - testcase("FloatFromInt"); + testcase("floatFromInt"); using namespace test::jtx; Env env{*this}; @@ -2298,7 +2375,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloatFromUint() { - testcase("FloatFromUint"); + testcase("floatFromUint"); using namespace test::jtx; Env env{*this}; @@ -2339,7 +2416,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloatSet() { - testcase("FloatSet"); + testcase("floatSet"); using namespace test::jtx; Env env{*this}; @@ -2426,7 +2503,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloatCompare() { - testcase("FloatCompare"); + testcase("floatCompare"); using namespace test::jtx; Env env{*this}; @@ -3071,7 +3148,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite void testFloats() { - testFloatTrace(); + testTraceFloat(); testFloatFromInt(); testFloatFromUint(); testFloatSet(); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index d137ec1fef4..10f0d4a03ed 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -5,12 +5,13 @@ namespace xrpl { +typedef std::variant FieldValue; + namespace detail { static Expected getAnyFieldData(STBase const* obj) { - // auto const& fname = obj.getFName(); if (!obj) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); @@ -25,6 +26,7 @@ getAnyFieldData(STBase const* obj) // LCOV_EXCL_STOP case STI_OBJECT: case STI_ARRAY: + case STI_VECTOR256: return Unexpected(HostFunctionError::NOT_LEAF_FIELD); break; case STI_ACCOUNT: { @@ -62,6 +64,7 @@ getAnyFieldData(STBase const* obj) auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; } + break; case STI_UINT32: { auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); @@ -70,6 +73,12 @@ getAnyFieldData(STBase const* obj) return Bytes{b, e}; } break; + case STI_UINT256: { + auto const* uint256Obj(static_cast(obj)); + auto const& data = uint256Obj->value(); + return Bytes{data.begin(), data.end()}; + } + break; default: break; // default to serializer } @@ -81,6 +90,21 @@ getAnyFieldData(STBase const* obj) return data; } +static Expected +getAnyFieldData(FieldValue const& variantObj) +{ + if (STBase const* const* obj = std::get_if(&variantObj)) + { + return getAnyFieldData(*obj); + } + else if (uint256 const* const* u = std::get_if(&variantObj)) + { + return Bytes((*u)->begin(), (*u)->end()); + } + + return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE +} + static inline bool noField(STBase const* field) { @@ -88,7 +112,7 @@ noField(STBase const* field) (STI_UNKNOWN == field->getSType()); } -static Expected +static Expected locateField(STObject const& obj, Slice const& locator) { if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 @@ -141,6 +165,13 @@ locateField(STObject const& obj, Slice const& locator) auto const& fname(*it->second); field = o->peekAtPField(fname); } + else if (STI_VECTOR256 == field->getSType()) + { + auto const* v = static_cast(field); + if (sfieldCode >= v->size()) + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + return FieldValue(&(v->operator[](sfieldCode))); + } else // simple field must be the last one { return Unexpected(HostFunctionError::LOCATOR_MALFORMED); @@ -150,7 +181,22 @@ locateField(STObject const& obj, Slice const& locator) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } - return field; + return FieldValue(field); +} + +static inline Expected +getArrayLen(FieldValue const& variantField) +{ + if (STBase const* const* field = std::get_if(&variantField)) + { + if ((*field)->getSType() == STI_VECTOR256) + return static_cast(*field)->size(); + if ((*field)->getSType() == STI_ARRAY) + return static_cast(*field)->size(); + } + // uint256 is not an array so that variant should still return NO_ARRAY + + return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE } } // namespace detail @@ -256,24 +302,20 @@ WasmHostFunctionsImpl::getLedgerObjNestedField( Expected WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) { - if (fname.fieldType != STI_ARRAY) + if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); auto const* field = ctx.tx.peekAtPField(fname); if (detail::noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - int32_t const sz = static_cast(field)->size(); - - return sz; + return detail::getArrayLen(field); } Expected WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) { - if (fname.fieldType != STI_ARRAY) + if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); auto const sle = getCurrentLedgerObj(); @@ -284,11 +326,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) if (detail::noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - int32_t const sz = static_cast(field)->size(); - - return sz; + return detail::getArrayLen(field); } Expected @@ -296,7 +334,7 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( int32_t cacheIdx, SField const& fname) { - if (fname.fieldType != STI_ARRAY) + if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); auto const normalizedIdx = normalizeCacheIndex(cacheIdx); @@ -307,12 +345,7 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen( if (detail::noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); // LCOV_EXCL_LINE - - int32_t const sz = static_cast(field)->size(); - - return sz; + return detail::getArrayLen(field); } // Subsection: nested array length getters @@ -324,12 +357,8 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; + auto const& field = r.value(); + return detail::getArrayLen(field); } Expected @@ -342,12 +371,8 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; + auto const& field = r.value(); + return detail::getArrayLen(field); } Expected @@ -363,12 +388,8 @@ WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( if (!r) return Unexpected(r.error()); - auto const* field = r.value(); - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; + auto const& field = r.value(); + return detail::getArrayLen(field); } } // namespace xrpl From ce84cc8b44c5bb8fb23cf339a76f630b06cbb272 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 15 Jan 2026 20:50:55 -0500 Subject: [PATCH 153/212] improve trace hf code (#6190) * adjust trace statements * add helper function * use lambda instead * use same paradigm in TestHostFunctions * oops --- src/test/app/TestHostFunctions.h | 105 ++++++------------ src/xrpld/app/wasm/HostFuncImpl.h | 19 ++++ .../app/wasm/detail/HostFuncImplTrace.cpp | 92 +++------------ 3 files changed, 65 insertions(+), 151 deletions(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index cbc75f1ed94..17a210441d6 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -380,36 +380,47 @@ struct TestHostFunctions : public HostFunctions return 4; } - Expected - trace(std::string_view const& msg, Slice const& data, bool asHex) override + template + void + log(std::string_view const& msg, F&& dataFn) { - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); #ifdef DEBUG_OUTPUT auto& j = std::cerr; #else if (!getJournal().active(beast::severities::kTrace)) - return ret; + return; auto j = getJournal().trace(); #endif + j << "WasmTrace: " << msg << " " << dataFn(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + } + + Expected + trace(std::string_view const& msg, Slice const& data, bool asHex) override + { + auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); + if (!asHex) { - j << "WASM TRACE: " << msg << " " - << std::string_view( - reinterpret_cast(data.data()), data.size()); + log(msg, [&data] { + return std::string_view( + reinterpret_cast(data.data()), data.size()); + }); } else { - std::string hex; - hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); - j << "WASM DEV TRACE: " << msg << " " << hex; + log(msg, [&data] { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return hex; + }); } -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return ret; } @@ -417,18 +428,7 @@ struct TestHostFunctions : public HostFunctions traceNum(std::string_view const& msg, int64_t data) override { auto const ret = msg.size() + sizeof(data); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - j << "WASM TRACE NUM: " << msg << " " << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif + log(msg, [data] { return data; }); return ret; } @@ -436,24 +436,7 @@ struct TestHostFunctions : public HostFunctions traceAccount(std::string_view const& msg, AccountID const& account) override { auto const ret = msg.size() + account.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - auto const accountStr = toBase58(account); - - j << "WASM TRACE ACCOUNT: " << msg << " " << accountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&account] { return toBase58(account); }); return ret; } @@ -461,20 +444,7 @@ struct TestHostFunctions : public HostFunctions traceFloat(std::string_view const& msg, Slice const& data) override { auto const ret = msg.size() + data.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const s = wasm_float::floatToString(data); - j << "WASM TRACE FLOAT: " << msg << " " << s; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&data] { return wasm_float::floatToString(data); }); return ret; } @@ -482,20 +452,7 @@ struct TestHostFunctions : public HostFunctions traceAmount(std::string_view const& msg, STAmount const& amount) override { auto const ret = msg.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const amountStr = amount.getFullText(); - j << "WASM TRACE AMOUNT: " << msg << " " << amountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&amount] { return amount.getFullText(); }); return ret; } diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 0183a74a124..26c55328db6 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -41,6 +41,25 @@ class WasmHostFunctionsImpl : public HostFunctions return cacheIdx; } + template + void + log(std::string_view const& msg, F&& dataFn) + { +#ifdef DEBUG_OUTPUT + auto& j = std::cerr; +#else + if (!getJournal().active(beast::severities::kTrace)) + return; + auto j = getJournal().trace(); +#endif + j << "WasmTrace[" << to_short_string(leKey.key) << "]: " << msg << " " + << dataFn(); + +#ifdef DEBUG_OUTPUT + j << std::endl; +#endif + } + public: WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) : HostFunctions(ct.journal), ctx(ct), leKey(leKey) diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp index d597a54f541..ddf4cde0e51 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -16,33 +16,25 @@ WasmHostFunctionsImpl::trace( bool asHex) { auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif if (!asHex) { - j << "HF TRACE (" << leKey.key << "): " << msg << " " - << std::string_view( - reinterpret_cast(data.data()), data.size()); + log(msg, [&data] { + return std::string_view( + reinterpret_cast(data.data()), data.size()); + }); } else { - std::string hex; - hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); - j << "HF DEV TRACE (" << leKey.key << "): " << msg << " " << hex; + log(msg, [&data] { + std::string hex; + hex.reserve(data.size() * 2); + boost::algorithm::hex( + data.begin(), data.end(), std::back_inserter(hex)); + return hex; + }); } -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - return ret; } @@ -50,20 +42,7 @@ Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { auto const ret = msg.size() + sizeof(data); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - - j << "HF TRACE NUM(" << leKey.key << "): " << msg << " " << data; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [data] { return data; }); return ret; } @@ -73,22 +52,7 @@ WasmHostFunctionsImpl::traceAccount( AccountID const& account) { auto const ret = msg.size() + account.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - - auto const accountStr = toBase58(account); - - j << "HF TRACE ACCOUNT(" << leKey.key << "): " << msg << " " << accountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&account] { return toBase58(account); }); return ret; } @@ -98,20 +62,7 @@ WasmHostFunctionsImpl::traceFloat( Slice const& data) { auto const ret = msg.size() + data.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const s = wasm_float::floatToString(data); - j << "HF TRACE FLOAT(" << leKey.key << "): " << msg << " " << s; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&data] { return wasm_float::floatToString(data); }); return ret; } @@ -121,20 +72,7 @@ WasmHostFunctionsImpl::traceAmount( STAmount const& amount) { auto const ret = msg.size(); -#ifdef DEBUG_OUTPUT - auto& j = std::cerr; -#else - if (!getJournal().active(beast::severities::kTrace)) - return ret; - auto j = getJournal().trace(); -#endif - auto const amountStr = amount.getFullText(); - j << "HF TRACE AMOUNT(" << leKey.key << "): " << msg << " " << amountStr; - -#ifdef DEBUG_OUTPUT - j << std::endl; -#endif - + log(msg, [&amount] { return amount.getFullText(); }); return ret; } From 42494dd4cf3fd2bc3d54c733c49df32a2e9aa4e1 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:43:12 -0500 Subject: [PATCH 154/212] Ensure lifetime of imports (#6230) --- src/test/app/Wasm_test.cpp | 147 +++++++++++++------------- src/xrpld/app/wasm/WasmVM.h | 14 +-- src/xrpld/app/wasm/WasmiVM.h | 27 +++-- src/xrpld/app/wasm/detail/WasmVM.cpp | 32 +++--- src/xrpld/app/wasm/detail/WasmiVM.cpp | 62 ++++++----- 5 files changed, 143 insertions(+), 139 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 0eca654335c..2ac06804221 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -84,9 +84,9 @@ struct Wasm_test : public beast::unit_test::suite // clang-format on auto& vm = WasmEngine::instance(); - ImportVec imports; + std::shared_ptr imports(std::make_shared()); WasmImpFunc( - imports, "func-add", reinterpret_cast(&Add)); + *imports, "func-add", reinterpret_cast(&Add)); auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); @@ -107,7 +107,7 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - HostFunctions hfs(env.journal); + std::shared_ptr hfs(new HostFunctions(env.journal)); { auto wasmHex = "00000000"; @@ -165,10 +165,10 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestLedgerDataProvider hf(env); - - ImportVec imports; - WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hf, 33); + std::shared_ptr hfs(new TestLedgerDataProvider(env)); + auto imports = std::make_shared(); + WASM_IMPORT_FUNC2( + *imports, getLedgerSqn, "get_ledger_sqn", hfs.get(), 33); auto& engine = WasmEngine::instance(); auto re = engine.run( @@ -176,7 +176,7 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imports, - &hf, + hfs, 1'000'000, env.journal); @@ -191,7 +191,7 @@ struct Wasm_test : public beast::unit_test::suite // empty module - run the same instance re = engine.run( - {}, ESCROW_FUNCTION_NAME, {}, imports, &hf, 1'000'000, env.journal); + {}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re.has_value())) { @@ -277,9 +277,9 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - TestHostFunctions hfs(env, 0); - ImportVec imp = createWasmImport(hfs); - for (auto& i : imp) + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto imp = createWasmImport(*hfs); + for (auto& i : *imp) i.second.gas = 0; auto re = engine.run( @@ -287,7 +287,7 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imp, - &hfs, + hfs, 1'000'000, env.journal); @@ -313,15 +313,15 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - TestHostFunctions hfs(env, 0); - ImportVec const imp = createWasmImport(hfs); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto const imp = createWasmImport(*hfs); auto re = engine.run( wasm, ESCROW_FUNCTION_NAME, {}, imp, - &hfs, + hfs, 1'000'000, env.journal); @@ -342,11 +342,11 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - TestHostFunctions hfs(env, 0); - ImportVec const imp = createWasmImport(hfs); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto const imp = createWasmImport(*hfs); auto re = engine.run( - wasm, ESCROW_FUNCTION_NAME, {}, imp, &hfs, 200, env.journal); + wasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 200, env.journal); if (BEAST_EXPECT(!re)) { @@ -371,9 +371,9 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; { - TestHostFunctions nfs(env, 0); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = - runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); @@ -383,8 +383,8 @@ struct Wasm_test : public beast::unit_test::suite { // max() gas - TestHostFunctions nfs(env, 0); - auto re = runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, -1); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); @@ -404,9 +404,10 @@ struct Wasm_test : public beast::unit_test::suite return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } }; - BadTestHostFunctions nfs(env); + + std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = - runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); @@ -426,9 +427,10 @@ struct Wasm_test : public beast::unit_test::suite return Bytes((128 + 1) * 64 * 1024, 1); } }; - BadTestHostFunctions nfs(env); + + std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = - runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME, {}, 100'000); + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); @@ -441,14 +443,15 @@ struct Wasm_test : public beast::unit_test::suite auto const wasmStr = boost::algorithm::unhex(deepRecursionHex); std::vector wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctionsSink nfs(env); + std::shared_ptr hfs( + new TestHostFunctionsSink(env)); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, nfs, funcName, {}, 1'000'000'000); + auto re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; - auto const& sink = nfs.getSink(); + auto const& sink = hfs->getSink(); auto countSubstr = [](std::string const& str, std::string const& substr) { std::size_t pos = 0; @@ -471,7 +474,7 @@ struct Wasm_test : public beast::unit_test::suite auto const wasmStr = boost::algorithm::unhex(infiniteLoopWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); std::string const funcName("loop"); - TestHostFunctions hfs(env, 0); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); // infinite loop should be caught and fail auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); @@ -485,11 +488,10 @@ struct Wasm_test : public beast::unit_test::suite // expected import not provided auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - TestLedgerDataProvider ledgerDataProvider(env); - - ImportVec imports; + std::shared_ptr hfs(new TestLedgerDataProvider(env)); + std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( - imports, getLedgerSqn, "get_ledger_sqn2", &ledgerDataProvider); + *imports, getLedgerSqn, "get_ledger_sqn2", hfs.get()); auto& engine = WasmEngine::instance(); @@ -498,7 +500,7 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imports, - &ledgerDataProvider, + hfs, 1'000'000, env.journal); @@ -509,12 +511,11 @@ struct Wasm_test : public beast::unit_test::suite // bad import format auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - TestLedgerDataProvider ledgerDataProvider(env); - - ImportVec imports; + std::shared_ptr hfs(new TestLedgerDataProvider(env)); + std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( - imports, getLedgerSqn, "get_ledger_sqn", &ledgerDataProvider); - imports[0].first = nullptr; + *imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); + (*imports)[0].first = nullptr; auto& engine = WasmEngine::instance(); @@ -523,7 +524,7 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imports, - &ledgerDataProvider, + hfs, 1'000'000, env.journal); @@ -534,21 +535,14 @@ struct Wasm_test : public beast::unit_test::suite // bad function name auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - TestLedgerDataProvider ledgerDataProvider(env); - - ImportVec imports; + std::shared_ptr hfs(new TestLedgerDataProvider(env)); + std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( - imports, getLedgerSqn, "get_ledger_sqn", &ledgerDataProvider); + *imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, - "func1", - {}, - imports, - &ledgerDataProvider, - 1'000'000, - env.journal); + wasm, "func1", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -569,8 +563,8 @@ struct Wasm_test : public beast::unit_test::suite std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctions hf(env, 0); - auto re = runEscrowWasm(wasm, hf, funcName, {}, 200'000); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto re = runEscrowWasm(wasm, hfs, funcName, {}, 200'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); @@ -584,8 +578,8 @@ struct Wasm_test : public beast::unit_test::suite std::string const wasmStr = boost::algorithm::unhex(wasmHex); std::vector const wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctions hf(env, 0); - auto re = runEscrowWasm(wasm, hf, funcName, {}, 100'000); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto re = runEscrowWasm(wasm, hfs, funcName, {}, 100'000); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); @@ -671,9 +665,10 @@ struct Wasm_test : public beast::unit_test::suite env(token::mint(alan, 0u)); env.close(); - PerfHostFunctions nfs(env, k, env.tx()); + std::shared_ptr hfs( + new PerfHostFunctions(env, k, env.tx())); - auto re = runEscrowWasm(wasm, nfs, ESCROW_FUNCTION_NAME); + auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); @@ -701,7 +696,7 @@ struct Wasm_test : public beast::unit_test::suite auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); Bytes const wasm(wasmStr.begin(), wasmStr.end()); - TestHostFunctions hfs(env, 0); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto const allowance = 185'974; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); @@ -724,7 +719,7 @@ struct Wasm_test : public beast::unit_test::suite auto const wasmStr = boost::algorithm::unhex(disabledFloatHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); std::string const funcName("finish"); - TestHostFunctions hfs(env, 0); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); { // f32 set constant, opcode disabled exception @@ -868,12 +863,12 @@ struct Wasm_test : public beast::unit_test::suite auto wasmStr = boost::algorithm::unhex(startLoopHex); Bytes wasm(wasmStr.begin(), wasmStr.end()); - TestLedgerDataProvider ledgerDataProvider(env); - ImportVec imports; + std::shared_ptr hfs(new TestLedgerDataProvider(env)); + std::shared_ptr imports(std::make_shared()); auto& engine = WasmEngine::instance(); - auto checkRes = engine.check( - wasm, "finish", {}, imports, &ledgerDataProvider, env.journal); + auto checkRes = + engine.check(wasm, "finish", {}, imports, hfs, env.journal); BEAST_EXPECTS( checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); @@ -882,7 +877,7 @@ struct Wasm_test : public beast::unit_test::suite ESCROW_FUNCTION_NAME, {}, imports, - &ledgerDataProvider, + hfs, 1'000'000, env.journal); BEAST_EXPECTS( @@ -902,9 +897,9 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestLedgerDataProvider hf(env); + std::shared_ptr hfs(new TestLedgerDataProvider(env)); - // ImportVec imports; + // std::shared_ptr imports(std::make_shared()); uint8_t buf1[8] = {7, 8, 9, 10, 11, 12, 13, 14}; { // forged "allocate" return valid address std::vector params = { @@ -913,7 +908,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, &hf, 1'000'000, env.journal); + wasm, "test", params, {}, hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re)) { BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); @@ -926,7 +921,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, &hf, 1'000'000, env.journal); + wasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -936,7 +931,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, &hf, 1'000'000, env.journal); + wasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -946,7 +941,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, &hf, 1'000'000, env.journal); + wasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -956,7 +951,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, &hf, 1'000'000, env.journal); + wasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -977,15 +972,15 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - TestHostFunctions hf(env); - ImportVec imports = createWasmImport(hf); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto imports = createWasmImport(*hfs); { // Calls float_from_uint with bad aligment. // Can be checked through codecov auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", {}, imports, &hf, 1'000'000, env.journal); + wasm, "test", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 0xbab88d46); } diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index c9c8d9c8e01..f14c475dc56 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -45,8 +45,8 @@ class WasmEngine run(Bytes const& wasmCode, std::string_view funcName = {}, std::vector const& params = {}, - ImportVec const& imports = {}, - HostFunctions* hfs = nullptr, + std::shared_ptr const& imports = {}, + std::shared_ptr const& hfs = {}, int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); @@ -55,8 +55,8 @@ class WasmEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params = {}, - ImportVec const& imports = {}, - HostFunctions* hfs = nullptr, + std::shared_ptr const& imports = {}, + std::shared_ptr const& hfs = {}, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); // Host functions helper functionality @@ -69,13 +69,13 @@ class WasmEngine //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -ImportVec +std::shared_ptr createWasmImport(HostFunctions& hfs); Expected runEscrowWasm( Bytes const& wasmCode, - HostFunctions& hfs, + std::shared_ptr const& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, int64_t gasLimit = -1); @@ -83,7 +83,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - HostFunctions& hfs, + std::shared_ptr const& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}); diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index 0d051ea49b0..d7e52d6a0e3 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -172,7 +172,7 @@ struct ModuleWrapper StorePtr& s, Bytes const& wasmBin, bool instantiate, - ImportVec const& imports, + std::shared_ptr const& imports, beast::Journal j); ~ModuleWrapper() = default; @@ -198,7 +198,7 @@ struct ModuleWrapper private: WasmExternVec - buildImports(StorePtr& s, ImportVec const& imports); + buildImports(StorePtr& s, std::shared_ptr const& imports); }; class WasmiEngine @@ -210,6 +210,10 @@ class WasmiEngine std::mutex m_; // 1 instance mutex + // to ensure lifetime during next executions with the same module + std::shared_ptr imports_; + std::shared_ptr hfs_; + public: WasmiEngine(); ~WasmiEngine() = default; @@ -221,8 +225,8 @@ class WasmiEngine run(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, int64_t gas, beast::Journal j); @@ -231,8 +235,8 @@ class WasmiEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, beast::Journal j); std::int64_t @@ -260,23 +264,16 @@ class WasmiEngine Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, int64_t gas); NotTEC checkHlp( Bytes const& wasmCode, std::string_view funcName, - std::vector const& params, - ImportVec const& imports); + std::vector const& params); int - addModule( - Bytes const& wasmCode, - bool instantiate, - int64_t gas, - ImportVec const& imports); + addModule(Bytes const& wasmCode, bool instantiate, int64_t gas); void clearModules(); diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 062e50ba938..c7fa3bbb5b9 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -89,13 +89,13 @@ setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) // clang-format on } -ImportVec +std::shared_ptr createWasmImport(HostFunctions& hfs) { - ImportVec i; + std::shared_ptr i(std::make_shared()); - setCommonHostFunctions(&hfs, i); - WASM_IMPORT_FUNC2(i, updateData, "update_data", &hfs, 1000); + setCommonHostFunctions(&hfs, *i); + WASM_IMPORT_FUNC2(*i, updateData, "update_data", &hfs, 1000); return i; } @@ -103,7 +103,7 @@ createWasmImport(HostFunctions& hfs) Expected runEscrowWasm( Bytes const& wasmCode, - HostFunctions& hfs, + std::shared_ptr const& hfs, std::string_view funcName, std::vector const& params, int64_t gasLimit) @@ -116,10 +116,10 @@ runEscrowWasm( wasmCode, funcName, params, - createWasmImport(hfs), - &hfs, + createWasmImport(*hfs), + hfs, gasLimit, - hfs.getJournal()); + hfs->getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -142,7 +142,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - HostFunctions& hfs, + std::shared_ptr const& hfs, std::string_view funcName, std::vector const& params) { @@ -154,9 +154,9 @@ preflightEscrowWasm( wasmCode, funcName, params, - createWasmImport(hfs), - &hfs, - hfs.getJournal()); + createWasmImport(*hfs), + hfs, + hfs->getJournal()); return ret; } @@ -179,8 +179,8 @@ WasmEngine::run( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, int64_t gasLimit, beast::Journal j) { @@ -192,8 +192,8 @@ WasmEngine::check( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, beast::Journal j) { return impl->check(wasmCode, funcName, params, imports, hfs, j); diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 8bd4a7b8b8c..037f787a26d 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -255,7 +255,7 @@ ModuleWrapper::ModuleWrapper( StorePtr& s, Bytes const& wasmBin, bool instantiate, - ImportVec const& imports, + std::shared_ptr const& imports, beast::Journal j) : module_(init(s, wasmBin, j)), j_(j) { @@ -342,13 +342,17 @@ makeImpReturn(WasmImportFunc const& imp) } WasmExternVec -ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) +ModuleWrapper::buildImports( + StorePtr& s, + std::shared_ptr const& imports) { WasmImporttypeVec importTypes; wasm_module_imports(module_.get(), &importTypes.vec_); if (!importTypes.vec_.size) return {}; + if (!imports) + throw std::runtime_error("Missing imports"); WasmExternVec wimports(importTypes.vec_.size); @@ -374,7 +378,7 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) // continue; bool impSet = false; - for (auto const& obj : imports) + for (auto const& obj : *imports) { auto const& imp = obj.second; if (imp.name != fieldName) @@ -536,11 +540,7 @@ WasmiEngine::WasmiEngine() } int -WasmiEngine::addModule( - Bytes const& wasmCode, - bool instantiate, - int64_t gas, - ImportVec const& imports) +WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) { moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store @@ -562,7 +562,7 @@ WasmiEngine::addModule( } moduleWrap_ = std::make_unique( - store_, wasmCode, instantiate, imports, j_); + store_, wasmCode, instantiate, imports_, j_); if (!moduleWrap_) throw std::runtime_error( @@ -800,16 +800,24 @@ WasmiEngine::run( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, int64_t gas, beast::Journal j) { j_ = j; + + if (!wasmCode.empty()) + { // save values for reuse + imports_ = imports; + hfs_ = hfs; + } + try { - checkImports(imports, hfs); - return runHlp(wasmCode, funcName, params, imports, hfs, gas); + if (imports_) + checkImports(*imports_, hfs.get()); + return runHlp(wasmCode, funcName, params, gas); } catch (std::exception const& e) { @@ -829,8 +837,6 @@ WasmiEngine::runHlp( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, int64_t gas) { // currently only 1 module support, possible parallel UT run @@ -839,14 +845,14 @@ WasmiEngine::runHlp( // Create and instantiate the module. if (!wasmCode.empty()) { - [[maybe_unused]] int const m = addModule(wasmCode, true, gas, imports); + [[maybe_unused]] int const m = addModule(wasmCode, true, gas); } if (!moduleWrap_ || !moduleWrap_->instanceWrap_) throw std::runtime_error("no instance"); // LCOV_EXCL_LINE - if (hfs) - hfs->setRT(&getRT()); + if (hfs_) + hfs_->setRT(&getRT()); // Call main auto const f = getFunc(!funcName.empty() ? funcName : "_start"); @@ -890,16 +896,23 @@ WasmiEngine::check( Bytes const& wasmCode, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - HostFunctions* hfs, + std::shared_ptr const& imports, + std::shared_ptr const& hfs, beast::Journal j) { j_ = j; + if (!wasmCode.empty()) + { + imports_ = imports; + hfs_ = hfs; + } + try { - checkImports(imports, hfs); - return checkHlp(wasmCode, funcName, params, imports); + if (imports_) + checkImports(*imports_, hfs_.get()); + return checkHlp(wasmCode, funcName, params); } catch (std::exception const& e) { @@ -919,8 +932,7 @@ NotTEC WasmiEngine::checkHlp( Bytes const& wasmCode, std::string_view funcName, - std::vector const& params, - ImportVec const& imports) + std::vector const& params) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); @@ -929,7 +941,7 @@ WasmiEngine::checkHlp( if (wasmCode.empty()) throw std::runtime_error("empty nodule"); - int const m = addModule(wasmCode, false, -1, imports); + int const m = addModule(wasmCode, false, -1); if ((m < 0) || !moduleWrap_) throw std::runtime_error("no module"); // LCOV_EXCL_LINE From 94b35a234e683abd83824a0d966ee7276f53ff4d Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 21 Jan 2026 15:27:06 -0500 Subject: [PATCH 155/212] Make hostfunctions object shared (#6252) --- src/xrpld/app/tx/detail/Escrow.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 595e573041f..b19cbacbe69 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -217,7 +217,7 @@ EscrowCreate::preflight(PreflightContext const& ctx) return temMALFORMED; } - HostFunctions mock(ctx.j); + auto mock(std::make_shared(ctx.j)); auto const re = preflightEscrowWasm(code, mock, ESCROW_FUNCTION_NAME); if (!isTesSuccess(re)) { @@ -1206,7 +1206,8 @@ EscrowFinish::doApply() auto const wasmStr = slep->getFieldVL(sfFinishFunction); std::vector wasm(wasmStr.begin(), wasmStr.end()); - WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); + auto ledgerDataProvider( + std::make_shared(ctx_, k)); if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) { @@ -1218,7 +1219,7 @@ EscrowFinish::doApply() wasm, ledgerDataProvider, ESCROW_FUNCTION_NAME, {}, allowance); JLOG(j_.trace()) << "Escrow WASM ran"; - if (auto const& data = ledgerDataProvider.getData(); data.has_value()) + if (auto const& data = ledgerDataProvider->getData(); data.has_value()) { slep->setFieldVL(sfData, makeSlice(*data)); ctx_.view().update(slep); From fd1cb318e39023f7179e40df11a46e82e40d9ace Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 21 Jan 2026 17:22:47 -0500 Subject: [PATCH 156/212] Check that max parameters length is multiple of sizeof(int32) (#6253) --- src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 10f0d4a03ed..6b956de8a00 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -118,15 +118,18 @@ locateField(STObject const& obj, Slice const& locator) if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); + static_assert(maxWasmParamLength % sizeof(int32_t) == 0); int32_t locBuf[maxWasmParamLength / sizeof(int32_t)]; int32_t const* locPtr = &locBuf[0]; int32_t const locSize = locator.size() / sizeof(int32_t); - uintptr_t p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) // unaligned - memcpy(&locBuf[0], locator.data(), locator.size()); - else - locPtr = reinterpret_cast(locator.data()); + { + uintptr_t const p = reinterpret_cast(locator.data()); + if (p & (alignof(int32_t) - 1)) // unaligned + memcpy(&locBuf[0], locator.data(), locator.size()); + else + locPtr = reinterpret_cast(locator.data()); + } STBase const* field = nullptr; auto const& knownSFields = SField::getKnownCodeToField(); From f4a27c9b6d58b5e6997614ee532537e960061613 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 21 Jan 2026 18:05:48 -0500 Subject: [PATCH 157/212] minor refactor of Wasm_test (#6229) --- src/test/app/Wasm_test.cpp | 116 +++++++++++++------------------------ 1 file changed, 41 insertions(+), 75 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 2ac06804221..b79f5576919 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -6,6 +6,14 @@ #include +#if (defined(__clang_major__) && __clang_major__ < 15) +#include +using source_location = std::experimental::source_location; +#else +#include +using std::source_location; +#endif + namespace xrpl { namespace test { @@ -42,6 +50,24 @@ runFinishFunction(std::string const& code) struct Wasm_test : public beast::unit_test::suite { + void + checkResult( + Expected, TER> re, + int32_t expectedResult, + int64_t expectedCost, + source_location const location = source_location::current()) + { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + if (BEAST_EXPECTS(re.has_value(), transToken(re.error()) + lineStr)) + { + BEAST_EXPECTS( + re->result == expectedResult, + std::to_string(re->result) + lineStr); + BEAST_EXPECTS( + re->cost == expectedCost, std::to_string(re->cost) + lineStr); + } + } + void testGetDataHelperFunctions() { @@ -92,11 +118,7 @@ struct Wasm_test : public beast::unit_test::suite // if (res) printf("invokeAdd get the result: %d\n", res.value()); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 6'912, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 59, std::to_string(re->cost)); - } + checkResult(re, 6'912, 59); } void @@ -180,11 +202,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 0, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 151, std::to_string(re->cost)); - } + checkResult(re, 0, 151); env.close(); env.close(); @@ -193,11 +211,7 @@ struct Wasm_test : public beast::unit_test::suite re = engine.run( {}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 5, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 190, std::to_string(re->cost)); - } + checkResult(re, 5, 190); } void @@ -211,11 +225,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "fib", wasmParams(10)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 55, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 1'137, std::to_string(re->cost)); - } + checkResult(re, 55, 1'137); } void @@ -230,11 +240,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 34'432, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 151'155, std::to_string(re->cost)); - } + checkResult(re, 34'432, 151'155); } void @@ -255,11 +261,7 @@ struct Wasm_test : public beast::unit_test::suite auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 700, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 2'886'069, std::to_string(re->cost)); - } + checkResult(re, 700, 2'886'069); } void @@ -291,11 +293,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 25'503, std::to_string(re->cost)); - } + checkResult(re, 1, 25'503); env.close(); } @@ -325,11 +323,7 @@ struct Wasm_test : public beast::unit_test::suite 1'000'000, env.journal); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); - } + checkResult(re, 1, 64'763); env.close(); } @@ -374,22 +368,14 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); - } + checkResult(re, 1, 64'763); } { // max() gas std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 64'763, std::to_string(re->cost)); - } + checkResult(re, 1, 64'763); } { // fail because trying to access nonexistent field @@ -408,11 +394,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); - } + checkResult(re, -201, 28'148); } { // fail because trying to allocate more than MAX_PAGES memory @@ -431,11 +413,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == -201, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 28'148, std::to_string(re->cost)); - } + checkResult(re, -201, 28'148); } { // fail because recursion too deep @@ -565,11 +543,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, funcName, {}, 200'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 110'699, std::to_string(re->cost)); - } + checkResult(re, 1, 110'699); env.close(); } @@ -580,11 +554,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(wasm, hfs, funcName, {}, 100'000); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECTS(re->result == 1, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 4'259, std::to_string(re->cost)); - } + checkResult(re, 1, 4'259); env.close(); } } @@ -701,11 +671,7 @@ struct Wasm_test : public beast::unit_test::suite auto const allowance = 185'974; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result); - BEAST_EXPECTS(re->cost == allowance, std::to_string(re->cost)); - } + checkResult(re, 1, allowance); } void From ba5debfecd6ba0144d2b4a9423d54742e80e767f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 22 Jan 2026 17:01:56 -0500 Subject: [PATCH 158/212] update return calculation (#6250) --- src/test/app/HostFuncImpl_test.cpp | 35 +- src/test/app/TestHostFunctions.h | 16 +- src/test/app/Wasm_test.cpp | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 8 +- src/test/app/wasm_fixtures/fixtures.cpp | 489 +++++++++--------- .../app/wasm/detail/HostFuncImplTrace.cpp | 16 +- 6 files changed, 273 insertions(+), 293 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 769c7741e82..fae904c0ec5 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2028,7 +2028,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.trace(msg, slice, false); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(result.value() == msg.size() + data.size()); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); } @@ -2037,7 +2037,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(resultHex.has_value())) { BEAST_EXPECT(resultHex.has_value()); - BEAST_EXPECT(resultHex.value() == msg.size() + data.size() * 2); + BEAST_EXPECT(resultHex.value() == 0); auto const messages = sink.messages().str(); std::string hex; hex.reserve(data.size() * 2); @@ -2064,7 +2064,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); auto const result = hfs.trace(msg, slice, false); - BEAST_EXPECT(result && *result == msg.size() + data.size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2092,7 +2092,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceNum(msg, num); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(result.value() == msg.size() + sizeof(num)); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2115,7 +2115,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace number"; int64_t num = 123456789; auto const result = hfs.traceNum(msg, num); - BEAST_EXPECT(result && *result == msg.size() + sizeof(int64_t)); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2142,8 +2142,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceAccount(msg, env.master.id()); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT( - result.value() == msg.size() + env.master.id().size()); + BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2164,8 +2163,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); - BEAST_EXPECT( - result && *result == msg.size() + env.master.id().size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2194,7 +2192,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.traceAmount(msg, amount); if (BEAST_EXPECT(result.has_value())) { - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT( @@ -2211,7 +2209,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.traceAmount(msg, iouAmount); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); } // MPT amount @@ -2221,7 +2219,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite STAmount mptAmount(mptAsset, 123456); auto const result = hfs.traceAmount(msg, mptAmount); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT(*result == msg.size()); + BEAST_EXPECT(*result == 0); } } @@ -2240,7 +2238,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace amount"; STAmount amount = XRP(12345); auto const result = hfs.traceAmount(msg, amount); - BEAST_EXPECT(result && *result == msg.size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } @@ -2290,16 +2288,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && - *result == msg.size() + makeSlice(invalid).size()); + BEAST_EXPECT(result && *result == 0); } { auto const result = hfs.traceFloat(msg, makeSlice(floatMaxExp)); - BEAST_EXPECT( - result && - *result == msg.size() + makeSlice(floatMaxExp).size()); + BEAST_EXPECT(result && *result == 0); } } @@ -2318,8 +2312,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite std::string msg = "trace float"; auto const result = hfs.traceFloat(msg, makeSlice(invalid)); - BEAST_EXPECT( - result && *result == msg.size() + makeSlice(invalid).size()); + BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.empty()); } diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 17a210441d6..0938243cffa 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -401,8 +401,6 @@ struct TestHostFunctions : public HostFunctions Expected trace(std::string_view const& msg, Slice const& data, bool asHex) override { - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); - if (!asHex) { log(msg, [&data] { @@ -421,39 +419,35 @@ struct TestHostFunctions : public HostFunctions }); } - return ret; + return 0; } Expected traceNum(std::string_view const& msg, int64_t data) override { - auto const ret = msg.size() + sizeof(data); log(msg, [data] { return data; }); - return ret; + return 0; } Expected traceAccount(std::string_view const& msg, AccountID const& account) override { - auto const ret = msg.size() + account.size(); log(msg, [&account] { return toBase58(account); }); - return ret; + return 0; } Expected traceFloat(std::string_view const& msg, Slice const& data) override { - auto const ret = msg.size() + data.size(); log(msg, [&data] { return wasm_float::floatToString(data); }); - return ret; + return 0; } Expected traceAmount(std::string_view const& msg, STAmount const& amount) override { - auto const ret = msg.size(); log(msg, [&amount] { return amount.getFullText(); }); - return ret; + return 0; } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b79f5576919..699178cac2f 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -668,7 +668,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes const wasm(wasmStr.begin(), wasmStr.end()); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const allowance = 185'974; + auto const allowance = 187'131; auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); checkResult(re, 1, allowance); diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index a5aa2eb6e51..aa05eec9d98 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -248,7 +248,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - (message.len() + 20) as i32, + 0, "trace_account", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F]; // 95 drops of XRP @@ -261,7 +261,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - message.len() as i32, + 0, "trace_amount", ); let amount = &[0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]; // 0 drops of XRP @@ -274,7 +274,7 @@ pub extern "C" fn finish() -> i32 { amount.len(), ) }, - message.len() as i32, + 0, "trace_amount_zero", ); @@ -1513,7 +1513,7 @@ pub extern "C" fn finish() -> i32 { account.0.len(), ) }, - 34, + 0, "trace_account_check_desync", ); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 44d44033821..e826f621c3c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -661,251 +661,250 @@ extern std::string const codecovTestsWasmHex = "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "8f9ec0000b7f0041909ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020c01020ad62602460002402000" - "20014704402002200341004100410010001a20004100480d01418b80c000410b2000ad1001" - "000b200220032000ac10011a0f0b418b80c000410b2000ac1001000b8c26020a7f017e2300" - "41f0016b22002400419680c000412341004100410010001a100241b9e00041b980c000410e" - "103c100341b2920441c780c0004116103c200041f0006a22064200370300200041e8006a22" - "054200370300200041e0006a2203420037030020004200370358200041d8006a2201412010" - "04412041be8cc0004116103c1005410a41dd80c000410c103c200041186a22074281828488" - "90a0c08001370300200041106a2208428182848890a0c08001370300200041086a22094281" - "82848890a0c080013703002000428182848890a0c0800137030041e980c000410e10064101" - "41f780c0004111103c200041201006410141f780c0004111103c4181802020014114100722" - "0241144604400240200041266a200041da006a2d00003a00002000200029005f3703c80120" - "00200041e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01" - "242000200028005b360027200020002903c80137002b200642003703002005420037030020" - "03420037030020004200370358200041246a2206411420014120100822024120470d002000" - "413a6a20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7" - "006a200a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a" - "2d00003a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20" - "0041386a4120410010094101418881c0004110103c20054100360200200342003703002000" - "42003703584181802020014114100a411441d48cc000411c103c2005410036020020034200" - "3703002000420037035841014181802020014114100b411441f08cc0004114103c20004104" - "36029801200041818020360258200041d8016a220341003602002002420037030020004200" - "3703c80120014104200041c8016a22054114100c411441848dc0004113103c200341003602" - "0020024200370300200042003703c801200120002802980120054114100d411441978dc000" - "4123103c2003410036020020024200370300200042003703c8014101200120002802980120" - "054114100e411441ba8dc000411b103c4189803c100f4120419881c0004110103c4189803c" - "1010412041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028" - "0298011012412041e081c0004117103c20012000280298011013412041f781c0004127103c" - "4101200120002802980110144120419e82c000411f103c200641141015411441bd82c00041" - "0b103c200041e0016a220442003703002003420037030020024200370300200042003703c8" - "012001200028029801200541201016412041d58dc0004113103c41c882c000410c41d482c0" - "00410b41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300" - "200041b0016a2008290300370300200041a8016a2009290300370300200020002903003703" - "a001200341003b010020024200370300200042003703c80120064114200041a0016a220741" - "20200541121018411241e88dc0004107103c20034100360200200242003703002000420037" - "03c80120074120200541141019411441ef8dc000410e103c200041003602c8012007412020" - "054104101a410441fd8dc000410d103c20074120101b410841f682c000410d103c20074120" - "101c410a418383c0004114103c200041003602c8012007412020054104101d4104418a8ec0" - "00410e103c419783c000410d20064114101e412141a483c000410d103c419783c000410d41" - "b183c0004108101f410d41b983c000410c103c419783c000410d41c583c0004108101f410d" - "41cd83c0004111103c417f41041004417141de83c000411e103c200041003602c801200541" - "7f1004417141988ec000411e103c200041ca016a41003a0000200041003b01c80120054103" - "1004417d41b68ec0004124103c200041003602c8012005418094ebdc031004417341da8ec0" - "004123103c200442003703002003420037030020024200370300200042003703c801200041" - "d894ebdc036a220741082005412041001020417341fd8ec0004117103c2004420037030020" - "03420037030020024200370300200042003703c80120012000280298012005412041001020" - "417141948fc0004119103c4102100f416f41fc83c000411f103c417f200028029801101241" - "71419b84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441" - "d984c0004120103c20072000280298011012417341f984c000411f103c2007200028029801" - "410110094173419885c0004118103c200120002802980141011009417141b085c000411a10" - "3c200442003703002003420037030020024200370300200042003703c80120072000280298" - "01200541201008417341ad8fc0004116103c20044200370300200342003703002002420037" - "0300200042003703c8012001200028029801200541201008417141c38fc0004118103c2004" - "42003703002003420037030020024200370300200042003703c80120064114200641142007" - "200028029801200541201021417341db8fc000411c103c2004420037030020034200370300" - "20024200370300200042003703c80120064114200641142001200028029801200541201021" - "417141f78fc000411e103c2004420037030020034200370300200242003703002000420037" - "03c80141fb9dc000411420072000280298012005412010224173419590c0004119103c2004" - "42003703002003420037030020024200370300200042003703c80141fb9dc0004114200120" - "0028029801200541201022417141ae90c000411f103c200442003703002003420037030020" - "024200370300200042003703c80141fb9dc000411441ca85c0004114200541201022417141" - "cd90c0004129103c200442003703002003420037030020024200370300200042003703c801" - "41de85c000412841fb9dc0004114200541201022417141f690c0004125103c200041dc016a" - "200041346a280100360200200041d4016a2000412c6a290100370200200020002901243702" - "cc01200041808080083602c801200041003b01c0012005411841fb9dc0004114200041c001" - "6a2203410210224171419b91c000410e103c2007200028029801422a10014173418686c000" - "4111103c200041003b01c0014102200341021007416f41a991c000411b103c200041003b01" - "c001410220034102100a416f41c491c000412b103c200041003b01c0014101410220034102" - "100b416f41ef91c0004123103c4102100f416f41fc83c000411f103c41021010416f419786" - "c000412f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed" - "86c000411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120" - "0141812020034102100c4174419292c0004121103c200041003b01c0012001418120200341" - "02100d417441b392c0004131103c200041003b01c0014101200141812020034102100e4174" - "41e492c0004129103c20014181201012417441a687c0004125103c20014181201013417441" - "cb87c0004135103c4101200141812010144174418088c000412d103c200141812010154174" - "41ad88c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed" - "82c0004109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0" - "004109103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c00041" - "09103c200041003b01c00120014181202003410210164174418d93c0004121103c20004100" - "3b01c00141fb9dc00041812041fb9dc0004114200341021022417441ae93c0004118103c20" - "0041003b01c00120064114200641142001418120200341021023417441c693c000411f103c" - "200041003b01c001200541812020064114200341021024417441e593c0004122103c419783" - "c000410d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1" - "c0003700c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c" - "103c419783c000410d2007200028029801101f417341f188c0004116103c20044108200341" - "0810264173418789c0004118103c200341082004410810264173419f89c0004118103c2000" - "41003b01ec012004410820034108200041ec016a22024102410010274173418794c0004114" - "103c200041003b01ec01200341082004410820024102410010274173419b94c0004114103c" - "200041003b01ec0120044108200341082002410241001028417341af94c0004119103c2000" - "41003b01ec0120034108200441082002410241001028417341c894c0004119103c20004100" - "3b01ec0120044108200341082002410241001029417341e194c0004119103c200041003b01" - "ec0120034108200441082002410241001029417341fa94c0004119103c200041003b01ec01" - "2004410820034108200241024100102a4173419395c0004117103c200041003b01ec012003" - "410820044108200241024100102a417341aa95c0004117103c200041003b01ec0120044108" - "4103200241024100102b417341c195c0004114103c200041003b01ec012004410841032002" - "41024100102c417341d595c0004113103c200041003b01ec0120044108200241024100102d" - "417341e895c0004113103c200120002802980141001009417141b789c0004123103c200041" - "003b01ec01200641142001200028029801200241021018417141fb95c000411a103c200041" - "003b01ec0120012000280298012002410210194171419596c0004121103c200041003b01ec" - "01200120002802980120024102101a417141b696c0004120103c2001200028029801101b41" - "7141da89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602" - "ec01200120002802980120024104101d417141d696c0004121103c200041003b01ec012001" - "200028029801200241021008417141f796c0004123103c200041003b01ec01200120002802" - "9801410120024102102e4171419a97c0004121103c200041003b01ec012001200028029801" - "22042006411420012004200241021023417141bb97c0004127103c200041003b01ec012006" - "41142001200028029801220420012004200241021023417141e297c0004127103c20004100" - "3b01ec0120012000280298012006411420024102102f4171418998c0004125103c20004100" - "3b01ec0120064114200120002802980120024102102f417141ae98c0004125103c20004100" - "3b01ec01200120002802980120064114200241021030417141d398c000412c103c20004100" - "3b01ec01200641142001200028029801200241021030417141ff98c000412c103c20004100" - "3b01ec012001200028029801200241021031417141ab99c000411f103c200041003b01ec01" - "20012000280298014101200241021032417141ca99c0004122103c200041003b01ec012001" - "2000280298012006411441ca85c0004114200241021021417141ec99c0004121103c200041" - "003b01ec0120064114200120002802980141ca85c00041142002410210214171418d9ac000" - "4121103c200041003b01ec0120012000280298014101200241021033417141ae9ac0004128" - "103c200041003b01ec01200541182001200028029801200241021024417141d69ac0004123" - "103c200041003b01ec0120012000280298014101200241021034417141f99ac0004125103c" - "200041003b01ec01200120002802980141012002410210354171419e9bc0004121103c2000" - "41003b01ec0120012000280298014101200241021036417141bf9bc0004122103c20004100" - "3b01ec012001200028029801200641144101200241021037417141e19bc0004124103c2000" - "41003b01ec012006411420012000280298014101200241021037417141859cc0004124103c" - "200041003b01ec0120012000280298014101200241021038417141a99cc000412f103c2000" - "41003b01ec012001200028029801200241021039417141d89cc0004123103c200041003b01" - "ec012001200028029801410120024102103a417141fb9cc0004122103c200041003b01ec01" - "2001200028029801410120024102103b4171419d9dc0004121103c200041003b01ec012001" - "20002802980141a18ac0004120200241021018417141be9dc000411c103c419783c000410d" - "2001200028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041" - "001000417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d" - "103c419797abdd03410d20064114101e417341908bc0004118103c419797abdd03410d41c5" - "83c0004108101f417341a88bc0004117103c20012000280298012001418120410010004174" - "41bf8bc000410e103c200141812042011001417441cd8bc0004112103c419783c000418120" - "200341081025417441df8bc000411b103c419783c00041812020064114101e417441fa8bc0" - "004116103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c0" - "00410d2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028" - "02980120064114200241021024417141da9dc0004121103c200041f0016a240041010f0b0b" - "418080c000410b417f20022002417f4e1bac1001000b0be61d0200418080c0000bde056572" - "726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741" - "534d20455845435554494f4e2024242424246765745f6c65646765725f73716e6765745f70" - "6172656e745f6c65646765725f74696d656765745f626173655f666565746573745f616d65" - "6e646d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f" - "626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f" - "6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e" - "6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65" - "646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f" - "626a5f6e65737465645f61727261795f6c656e7570646174655f6461746174657374206d65" - "737361676574657374207075626b657974657374207369676e6174757265636865636b5f73" - "69676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665657465" - "7374696e6720747261636574726163655f6163636f756e74400000000000005f7472616365" - "5f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f70" - "6172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f6172726179" - "5f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f61727261" - "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f" - "6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f" - "6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368" - "655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f" - "77726f6e675f6c656e555344303030303030303030303030303030303000418686c0000bf5" - "1774726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f" - "6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765" - "725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d65" - "6e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61" - "626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f" - "746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c696365" - "7570646174655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c" - "69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f" - "616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69" - "636531666c6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c656467" - "65725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167" - "735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f" - "6665655f77726f6e675f73697a655f75696e74323536303030303030303030303030303030" - "303030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f" - "73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f" - "70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f" - "6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472616365" - "5f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f706171" - "75655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f" - "6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" - "726f6e675f6c656e6774686765745f706172656e745f6c65646765725f686173686765745f" - "63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f62" - "6a5f6669656c646765745f74785f6e65737465645f6669656c646765745f63757272656e74" - "5f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68616c666765745f" - "6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e6765745f6e6674" - "5f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e" - "6765745f706172656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c67" - "65745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e67666c6f" - "61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77" - "726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f626163636f756e74" - "5f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f" - "63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e63" - "79616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f" - "6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f7772" - "6f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c65" - "6e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6d70" - "746765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c64676574" - "5f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f74" - "785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c" - "6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269" - "675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c" - "696365616d6d5f6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c" - "5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c65745f74" - "6f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c696365" - "31666c6f61745f6164645f6f6f625f736c69636532666c6f61745f73756274726163745f6f" - "6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c69636532666c6f" - "61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f" - "6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69636531666c6f61" - "745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c69" - "6365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c" - "6963656765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f" - "6973737565725f77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f" - "6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f7772" - "6f6e675f73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469643264656c65676174655f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e746964326465706f7369745f707265617574685f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964316465706f7369745f707265617574685f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e746964326d70745f69737375616e63655f6b65796c65745f77726f6e675f" - "73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f" - "756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "6964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b" - "656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d0970726f647563" - "65727302086c616e6775616765010452757374000c70726f6365737365642d627901057275" - "7374631d312e38392e30202832393438333838336520323032352d30382d3034290094010f" - "7461726765745f6665617475726573082b0f6d757461626c652d676c6f62616c732b136e6f" - "6e7472617070696e672d6670746f696e742b0b62756c6b2d6d656d6f72792b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c75652b0f62756c" - "6b2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665726c6f6e67"; + "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" + "646174615f656e6403010b5f5f686561705f6261736503020aeb2602460002402000200147" + "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" + "0220032000ac10011a0f0b418b80c000410b2000ac1001000ba126020a7f017e230041f001" + "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" + "0341b2920441c780c0004116103c200041f0006a22054200370300200041e8006a22064200" + "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" + "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" + "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" + "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" + "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" + "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" + "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" + "200028005b360027200020002903c80137002b200542003703002006420037030020034200" + "37030020004200370358200041246a2205411420014120100822024120470d002000413a6a" + "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" + "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" + "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" + "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" + "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" + "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" + "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" + "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" + "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" + "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" + "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" + "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" + "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" + "0120002802980110144120419e82c000411f103c200541141015411441bd82c000410b103c" + "200041e0016a220442003703002003420037030020024200370300200042003703c8012001" + "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" + "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" + "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" + "0341003b010020024200370300200042003703c80120054114200041a0016a220741202006" + "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" + "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" + "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" + "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" + "103c419783c000410d20054114101e410041a483c000410d103c419783c000410d41b183c0" + "004108101f410041b983c000410c103c419783c000410d41c583c0004108101f410041cd83" + "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" + "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" + "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" + "103c200442003703002003420037030020024200370300200042003703c801200041d894eb" + "dc036a220741082006412041001020417341978fc0004117103c2004420037030020034200" + "37030020024200370300200042003703c80120012000280298012006412041001020417141" + "ae8fc0004119103c4102100f416f41fc83c000411f103c417f20002802980110124171419b" + "84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441d984c0" + "004120103c20072000280298011012417341f984c000411f103c2007200028029801410110" + "094173419885c0004118103c200120002802980141011009417141b085c000411a103c2004" + "42003703002003420037030020024200370300200042003703c80120072000280298012006" + "41201008417341c78fc0004116103c20044200370300200342003703002002420037030020" + "0042003703c8012001200028029801200641201008417141dd8fc0004118103c2004420037" + "03002003420037030020024200370300200042003703c80120054114200541142007200028" + "029801200641201021417341f58fc000411c103c2004420037030020034200370300200242" + "00370300200042003703c80120054114200541142001200028029801200641201021417141" + "9190c000411e103c200442003703002003420037030020024200370300200042003703c801" + "41959ec00041142007200028029801200641201022417341af90c0004119103c2004420037" + "03002003420037030020024200370300200042003703c80141959ec0004114200120002802" + "9801200641201022417141c890c000411f103c200442003703002003420037030020024200" + "370300200042003703c80141959ec000411441ca85c0004114200641201022417141e790c0" + "004129103c200442003703002003420037030020024200370300200042003703c80141de85" + "c000412841959ec00041142006412010224171419091c0004125103c200041dc016a200041" + "346a280100360200200041d4016a2000412c6a290100370200200020002901243702cc0120" + "0041808080083602c801200041003b01c0012006411841959ec0004114200041c0016a2203" + "41021022417141b591c000410e103c2007200028029801422a10014173418686c000411110" + "3c200041003b01c0014102200341021007416f41c391c000411b103c200041003b01c00141" + "0220034102100a416f41de91c000412b103c200041003b01c0014101410220034102100b41" + "6f418992c0004123103c4102100f416f41fc83c000411f103c41021010416f419786c00041" + "2f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed86c000" + "411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120014181" + "2020034102100c417441ac92c0004121103c200041003b01c001200141812020034102100d" + "417441cd92c0004131103c200041003b01c0014101200141812020034102100e417441fe92" + "c0004129103c20014181201012417441a687c0004125103c20014181201013417441cb87c0" + "004135103c4101200141812010144174418088c000412d103c20014181201015417441ad88" + "c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed82c000" + "4109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0004109" + "103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c0004109103c" + "200041003b01c0012001418120200341021016417441a793c0004121103c200041003b01c0" + "0141959ec00041812041959ec0004114200341021022417441c893c0004118103c20004100" + "3b01c00120054114200541142001418120200341021023417441e093c000411f103c200041" + "003b01c001200641812020054114200341021024417441ff93c0004122103c419783c00041" + "0d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1c00037" + "00c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c103c41" + "9783c000410d2007200028029801101f417341f188c0004116103c20044108200341081026" + "4173418789c0004118103c200341082004410810264173419f89c0004118103c200041003b" + "01ec012004410820034108200041ec016a2202410241001027417341a194c0004114103c20" + "0041003b01ec0120034108200441082002410241001027417341b594c0004114103c200041" + "003b01ec0120044108200341082002410241001028417341c994c0004119103c200041003b" + "01ec0120034108200441082002410241001028417341e294c0004119103c200041003b01ec" + "0120044108200341082002410241001029417341fb94c0004119103c200041003b01ec0120" + "0341082004410820024102410010294173419495c0004119103c200041003b01ec01200441" + "0820034108200241024100102a417341ad95c0004117103c200041003b01ec012003410820" + "044108200241024100102a417341c495c0004117103c200041003b01ec0120044108410320" + "0241024100102b417341db95c0004114103c200041003b01ec012004410841032002410241" + "00102c417341ef95c0004113103c200041003b01ec0120044108200241024100102d417341" + "8296c0004113103c200120002802980141001009417141b789c0004123103c200041003b01" + "ec012005411420012000280298012002410210184171419596c000411a103c200041003b01" + "ec012001200028029801200241021019417141af96c0004121103c200041003b01ec012001" + "20002802980120024102101a417141d096c0004120103c2001200028029801101b417141da" + "89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602ec0120" + "0120002802980120024104101d417141f096c0004121103c200041003b01ec012001200028" + "0298012002410210084171419197c0004123103c200041003b01ec01200120002802980141" + "0120024102102e417141b497c0004121103c200041003b01ec012001200028029801220420" + "05411420012004200241021023417141d597c0004127103c200041003b01ec012005411420" + "01200028029801220420012004200241021023417141fc97c0004127103c200041003b01ec" + "0120012000280298012005411420024102102f417141a398c0004125103c200041003b01ec" + "0120054114200120002802980120024102102f417141c898c0004125103c200041003b01ec" + "01200120002802980120054114200241021030417141ed98c000412c103c200041003b01ec" + "012005411420012000280298012002410210304171419999c000412c103c200041003b01ec" + "012001200028029801200241021031417141c599c000411f103c200041003b01ec01200120" + "00280298014101200241021032417141e499c0004122103c200041003b01ec012001200028" + "0298012005411441ca85c0004114200241021021417141869ac0004121103c200041003b01" + "ec0120054114200120002802980141ca85c0004114200241021021417141a79ac000412110" + "3c200041003b01ec0120012000280298014101200241021033417141c89ac0004128103c20" + "0041003b01ec01200641182001200028029801200241021024417141f09ac0004123103c20" + "0041003b01ec0120012000280298014101200241021034417141939bc0004125103c200041" + "003b01ec0120012000280298014101200241021035417141b89bc0004121103c200041003b" + "01ec0120012000280298014101200241021036417141d99bc0004122103c200041003b01ec" + "012001200028029801200541144101200241021037417141fb9bc0004124103c200041003b" + "01ec0120054114200120002802980141012002410210374171419f9cc0004124103c200041" + "003b01ec0120012000280298014101200241021038417141c39cc000412f103c200041003b" + "01ec012001200028029801200241021039417141f29cc0004123103c200041003b01ec0120" + "01200028029801410120024102103a417141959dc0004122103c200041003b01ec01200120" + "0028029801410120024102103b417141b79dc0004121103c200041003b01ec012001200028" + "02980141a18ac0004120200241021018417141d89dc000411c103c419783c000410d200120" + "0028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041001000" + "417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d103c41" + "9797abdd03410d20054114101e417341908bc0004118103c419797abdd03410d41c583c000" + "4108101f417341a88bc0004117103c2001200028029801200141812041001000417441bf8b" + "c000410e103c200141812042011001417441cd8bc0004112103c419783c000418120200341" + "081025417441df8bc000411b103c419783c00041812020054114101e417441fa8bc0004116" + "103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c000410d" + "2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028029801" + "20054114200241021024417141f49dc0004121103c4101410020054114101e410041be8cc0" + "00411a103c200041f0016a240041010f0b0b418080c000410b417f20022002417f4e1bac10" + "01000b0b801e0200418080c0000bde056572726f725f636f64653d54455354204641494c45" + "442424242424205354415254494e47205741534d20455845435554494f4e20242424242467" + "65745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d656765" + "745f626173655f666565746573745f616d656e646d656e74616d656e646d656e745f656e61" + "626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e67" + "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65" + "646765725f6f626a5f61727261795f6c656e6765745f74785f6e65737465645f6172726179" + "5f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" + "61795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e" + "7570646174655f6461746174657374206d65737361676574657374207075626b6579746573" + "74207369676e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f" + "6e66745f7472616e736665725f66656574657374696e6720747261636574726163655f6163" + "636f756e74400000000000005f74726163655f616d6f756e74400000000000000074726163" + "655f616d6f756e745f7a65726f6765745f706172656e745f6c65646765725f686173685f6e" + "65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c64" + "6765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f7478" + "5f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465" + "645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f617272" + "61795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f" + "6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e55534430303030303030" + "3030303030303030303000418686c0000b8f1874726163655f6e756d5f6f6f625f73747267" + "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c" + "69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76" + "616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f" + "736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f7478" + "5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375" + "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f" + "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f626967" + "5f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f" + "61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f" + "61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f" + "625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75" + "696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235" + "366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e74" + "32353630303030303030303030303030303030303030303030303030303030303030317472" + "6163655f6163636f756e745f77726f6e675f73697a655f6163636f756e7469647472616365" + "5f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472" + "696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f75" + "6e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f" + "746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e677472" + "6163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f" + "6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e67746874726163655f6163" + "636f756e745f636865636b5f646573796e636765745f706172656e745f6c65646765725f68" + "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" + "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" + "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" + "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" + "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" + "6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f" + "6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f6275665f746f6f" + "5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f" + "6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d" + "5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f62" + "6163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c" + "656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f" + "63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f" + "6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c6574" + "5f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65" + "796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65" + "796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f7366" + "69656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f73666965" + "6c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765" + "745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" + "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c64" + "5f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f" + "5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f736c696365637265" + "64656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b" + "65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f" + "625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c6f61745f737562" + "74726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c" + "69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d75" + "6c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69" + "636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f" + "6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f67" + "5f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75696e7432353667" + "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" + "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" + "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" + "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" + "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" + "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" + "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" + "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d" + "303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f6261" + "6c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp index ddf4cde0e51..31e90df7ab2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -15,8 +15,6 @@ WasmHostFunctionsImpl::trace( Slice const& data, bool asHex) { - auto const ret = msg.size() + data.size() * (asHex ? 2 : 1); - if (!asHex) { log(msg, [&data] { @@ -35,15 +33,14 @@ WasmHostFunctionsImpl::trace( }); } - return ret; + return 0; } Expected WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) { - auto const ret = msg.size() + sizeof(data); log(msg, [data] { return data; }); - return ret; + return 0; } Expected @@ -51,9 +48,8 @@ WasmHostFunctionsImpl::traceAccount( std::string_view const& msg, AccountID const& account) { - auto const ret = msg.size() + account.size(); log(msg, [&account] { return toBase58(account); }); - return ret; + return 0; } Expected @@ -61,9 +57,8 @@ WasmHostFunctionsImpl::traceFloat( std::string_view const& msg, Slice const& data) { - auto const ret = msg.size() + data.size(); log(msg, [&data] { return wasm_float::floatToString(data); }); - return ret; + return 0; } Expected @@ -71,9 +66,8 @@ WasmHostFunctionsImpl::traceAmount( std::string_view const& msg, STAmount const& amount) { - auto const ret = msg.size(); log(msg, [&amount] { return amount.getFullText(); }); - return ret; + return 0; } } // namespace xrpl From 57d2a91ad5881fd8725305dfffa8764aca4f62b9 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 Jan 2026 14:45:09 -0500 Subject: [PATCH 159/212] test large WASM modules (#6206) * [WIP] first attempt at large wasm test * finish large WASM modules * fix windows build (hopefully) * Apply suggestions from code review * respond to comments * add file and line to fail * clean up test * add source_location * simplify * fix windows --- src/test/app/EscrowSmart_test.cpp | 126 ++++++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 110 +++++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.h | 56 +++++++++++ 3 files changed, 292 insertions(+) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index ec173b2cbd4..f499db78939 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -12,6 +12,7 @@ #include #include +#include namespace xrpl { namespace test { @@ -982,6 +983,129 @@ struct EscrowSmart_test : public beast::unit_test::suite } } + void + testLargeWasmModules(FeatureBitset features) + { + testcase("Test large wasm modules"); + + using namespace jtx; + using namespace std::chrono; + using namespace wasm_constants; + + enum class ExpectedStatus { Success, Malformed, Crash }; + + auto runTest = [&](std::vector const& wasm, + std::optional sizeLimit, + ExpectedStatus expectedStatus, + std::source_location const& loc = + std::source_location::current()) { + auto makeEnv = [&]() -> Env { + if (sizeLimit) + return Env( + *this, + envconfig([&sizeLimit](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = *sizeLimit; + return cfg; + }), + features); + else + return Env(*this, features); + }; + Env env = makeEnv(); + + auto const alice = Account("alice"); + env.fund(XRP(1'000'000), alice); + env.close(); + + auto const wasmHex = strHex(wasm); + try + { + env(escrow::create(alice, alice, XRP(1000)), + escrow::finish_function(wasmHex), + escrow::cancel_time(env.now() + 100s), + fee(env.current()->fees().base * 10 + + wasmHex.size() / 2 * 5), + ter(expectedStatus == ExpectedStatus::Success + ? TER{tesSUCCESS} + : TER{temMALFORMED})); + if (expectedStatus == ExpectedStatus::Crash) + fail("Expected crash", loc.file_name(), loc.line()); + else + pass(); + } + catch (std::exception const& e) + { + if (expectedStatus == ExpectedStatus::Crash) + pass(); + else + fail(e.what(), loc.file_name(), loc.line()); + } + }; + + // Table-driven test cases + struct TestCase + { + enum class BlobType { Code, Data }; + BlobType type; + uint32_t size; + std::optional sizeLimit; + ExpectedStatus expected; + }; + + std::vector const testCases = { + // Code blob tests + {TestCase::BlobType::Code, + 99'959, + std::nullopt, + ExpectedStatus::Success}, // just under 100kb + {TestCase::BlobType::Code, + 99'961, + std::nullopt, + ExpectedStatus::Malformed}, // just over 100kb + {TestCase::BlobType::Code, + 200'000, + 10'000'000, + ExpectedStatus::Success}, // ~200kb + {TestCase::BlobType::Code, + 490'000, + 10'000'000, + ExpectedStatus::Success}, // just under 1MB JSON + {TestCase::BlobType::Code, + 999'999, + 10'000'000, + ExpectedStatus::Crash}, // just over 1MB JSON + // Data blob tests + {TestCase::BlobType::Data, + 99'946, + std::nullopt, + ExpectedStatus::Success}, // just under 100kb + {TestCase::BlobType::Data, + 99'948, + std::nullopt, + ExpectedStatus::Malformed}, // just over 100kb + {TestCase::BlobType::Data, + 200'000, + 10'000'000, + ExpectedStatus::Success}, // ~200kb + {TestCase::BlobType::Data, + 490'000, + 10'000'000, + ExpectedStatus::Success}, // just under 1MB JSON + {TestCase::BlobType::Data, + 999'950, + 10'000'000, + ExpectedStatus::Crash}, // just over 1MB JSON + }; + + for (auto const& tc : testCases) + { + auto const wasm = tc.type == TestCase::BlobType::Code + ? generateCodeBlob(tc.size) + : generateDataBlob(tc.size); + runTest(wasm, tc.sizeLimit, tc.expected); + } + } + void testWithFeats(FeatureBitset features) { @@ -994,6 +1118,8 @@ struct EscrowSmart_test : public beast::unit_test::suite // TODO: Update module with new host functions testAllHostFunctions(features); testKeyletHostFunctions(features); + + testLargeWasmModules(features); } public: diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 43f0bb5db47..748d262d227 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -2,6 +2,116 @@ #include +#include + +namespace wasm_constants { + +namespace { + +// Helper: Variable-length integer encoding (LEB128) +void +pushLeb128(std::vector& buf, uint32_t val) +{ + do + { + uint8_t byte = val & 0x7F; + val >>= 7; + if (val != 0) + byte |= 0x80; + buf.push_back(byte); + } while (val != 0); +} + +// Helper: append bytes from an array to a vector +template +void +appendBytes(std::vector& buf, T const& arr) +{ + buf.insert(buf.end(), std::begin(arr), std::end(arr)); +} + +// Helper: append a WASM section (ID + LEB128 size + content) +// extraSize is added to the encoded size (for trailing fill bytes) +void +appendSection( + std::vector& wasm, + uint8_t sectionId, + std::vector const& content, + uint32_t extraSize = 0) +{ + wasm.push_back(sectionId); + pushLeb128(wasm, static_cast(content.size() + extraSize)); + appendBytes(wasm, content); +} + +} // namespace + +std::vector +generateCodeBlob(uint32_t num_instructions) +{ + std::vector wasm; + appendBytes(wasm, WASM_HEADER); + appendBytes(wasm, TYPE_EMPTY_FUNC); + appendBytes(wasm, FUNC_TYPE0); + appendBytes(wasm, EXPORT_FINISH); + + std::vector body; + pushLeb128(body, 0); // No locals + body.insert(body.end(), num_instructions, INSTR_NOP); + body.push_back(INSTR_END); + + std::vector section; + pushLeb128(section, 1); // 1 function + pushLeb128(section, static_cast(body.size())); + appendBytes(section, body); + + appendSection(wasm, SECTION_CODE, section); + return wasm; +} + +std::vector +generateDataBlob(uint32_t data_size) +{ + std::vector wasm; + appendBytes(wasm, WASM_HEADER); + appendBytes(wasm, TYPE_EMPTY_FUNC); + appendBytes(wasm, FUNC_TYPE0); + + // Memory Section: must be large enough for data_size + uint32_t pages = (data_size + 65535) / 65536; + std::vector mem_p; + pushLeb128(mem_p, 1); // 1 memory defined + mem_p.push_back(0x00); // Flags (minimum only) + pushLeb128(mem_p, pages); // Page count + appendSection(wasm, SECTION_MEMORY, mem_p); + + appendBytes(wasm, EXPORT_FINISH); + + // Code Section: MUST come before Data Section per WASM spec + std::vector code_p; + pushLeb128(code_p, 1); // 1 function body + pushLeb128(code_p, static_cast(std::size(EMPTY_BODY))); + appendBytes(code_p, EMPTY_BODY); + appendSection(wasm, SECTION_CODE, code_p); + + // Data Section: the actual bloat + std::vector data_seg; + data_seg.push_back(0x00); // Memory index 0 + appendBytes(data_seg, DATA_OFFSET_ZERO); + pushLeb128(data_seg, data_size); + + std::vector data_p; + pushLeb128(data_p, 1); // 1 data segment + appendBytes(data_p, data_seg); + + appendSection(wasm, SECTION_DATA, data_p, data_size); + wasm.insert(wasm.end(), data_size, DATA_FILL_BYTE); + + return wasm; +} + +} // namespace wasm_constants + extern std::string const fibWasmHex = "0061736d0100000001090260000060017f017f0303020001071b02115f5f" "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 91eadba0d37..bba34e63537 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -2,7 +2,63 @@ // TODO: consider moving these to separate files (and figure out the build) +#include #include +#include + +// WASM binary format constants and helpers for building test modules +namespace wasm_constants { + +// Magic + version header +static constexpr uint8_t WASM_HEADER[] = { + 0x00, + 0x61, + 0x73, + 0x6d, // magic: \0asm + 0x01, + 0x00, + 0x00, + 0x00 // version: 1 +}; + +// Type section: () -> () +static constexpr uint8_t TYPE_EMPTY_FUNC[] = + {0x01, 0x04, 0x01, 0x60, 0x00, 0x00}; + +// Function section: one function using type 0 +static constexpr uint8_t FUNC_TYPE0[] = {0x03, 0x02, 0x01, 0x00}; + +// Export section: export func 0 as "finish" +static constexpr uint8_t EXPORT_FINISH[] = + {0x07, 0x0a, 0x01, 0x06, 'f', 'i', 'n', 'i', 's', 'h', 0x00, 0x00}; + +// Empty function body: 0 locals, end +static constexpr uint8_t EMPTY_BODY[] = {0x00, 0x0b}; + +// Data segment offset: i32.const 0, end +static constexpr uint8_t DATA_OFFSET_ZERO[] = {0x41, 0x00, 0x0b}; + +// Section IDs +static constexpr uint8_t SECTION_MEMORY = 0x05; +static constexpr uint8_t SECTION_CODE = 0x0a; +static constexpr uint8_t SECTION_DATA = 0x0b; + +// Instructions +static constexpr uint8_t INSTR_NOP = 0x01; +static constexpr uint8_t INSTR_END = 0x0b; + +// Fill byte for data section bloat +static constexpr uint8_t DATA_FILL_BYTE = 0xEE; + +// Generator for WASM module with large code section (many NOPs) +std::vector +generateCodeBlob(uint32_t num_instructions); + +// Generator for WASM module with large data section +std::vector +generateDataBlob(uint32_t data_size); + +} // namespace wasm_constants extern std::string const ledgerSqnWasmHex; From 981ac7abf4c19ea04fa1ae163bc6ceab548f5e62 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 23 Jan 2026 15:14:24 -0500 Subject: [PATCH 160/212] simplify fee code (#6249) * simplify lambda * clean up fee code * fix tests, better error handling * simplify source_location --- src/test/app/FeeVote_test.cpp | 229 +++++++++++++++++------------ src/test/jtx/impl/envconfig.cpp | 3 + src/xrpld/app/misc/FeeVoteImpl.cpp | 57 +++---- 3 files changed, 159 insertions(+), 130 deletions(-) diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 71aa84eda2f..ee577d7a996 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -12,6 +12,8 @@ #include #include +#include + namespace xrpl { namespace test { @@ -968,14 +970,6 @@ class FeeVote_test : public beast::unit_test::suite using namespace jtx; - FeeSetup setup; - setup.reference_fee = 42; - setup.account_reserve = 1234567; - setup.owner_reserve = 7654321; - setup.extension_compute_limit = 100; - setup.extension_size_limit = 200; - setup.gas_price = 300; - Env env( *this, testable_amendments() | featureXRPFees | featureSmartEscrow); @@ -988,99 +982,144 @@ class FeeVote_test : public beast::unit_test::suite BEAST_EXPECT(env.current()->fees().extensionSizeLimit == 0); BEAST_EXPECT(env.current()->fees().gasPrice == 0); - auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); - auto ledger = std::make_shared( - create_genesis, - env.app().config(), - std::vector{}, - env.app().getNodeFamily()); - - // doVoting requires a flag ledger (every 256th ledger) - // We need to create a ledger at sequence 256 to make it a flag - // ledger - for (int i = 0; i < 256 - 1; ++i) - { - ledger = std::make_shared( - *ledger, env.app().timeKeeper().closeTime()); - } - BEAST_EXPECT(ledger->isFlagLedger()); - - // Create some mock validations with fee votes - std::vector> validations; - - for (int i = 0; i < 5; i++) - { - auto sec = randomSecretKey(); - auto pub = derivePublicKey(KeyType::secp256k1, sec); - - auto val = std::make_shared( - env.app().timeKeeper().now(), - pub, - sec, - calcNodeID(pub), - [&](STValidation& v) { - v.setFieldU32(sfLedgerSequence, ledger->seq()); - // Vote for different fees than current - v.setFieldAmount( - sfBaseFeeDrops, XRPAmount{setup.reference_fee}); - v.setFieldAmount( - sfReserveBaseDrops, XRPAmount{setup.account_reserve}); - v.setFieldAmount( - sfReserveIncrementDrops, - XRPAmount{setup.owner_reserve}); - v.setFieldU32( - sfExtensionComputeLimit, setup.extension_compute_limit); - v.setFieldU32( - sfExtensionSizeLimit, setup.extension_size_limit); - v.setFieldU32(sfGasPrice, setup.gas_price); - }); - if (i % 2) - val->setTrusted(); - validations.push_back(val); - } - - auto txSet = std::make_shared( - SHAMapType::TRANSACTION, env.app().getNodeFamily()); + auto const createFeeTxFromVoting = [&](FeeSetup const& setup) + -> std::pair> { + auto feeVote = make_FeeVote(setup, env.app().journal("FeeVote")); + auto ledger = std::make_shared( + create_genesis, + env.app().config(), + std::vector{}, + env.app().getNodeFamily()); - // This should not throw since we have a flag ledger - feeVote->doVoting(ledger, validations, txSet); + // doVoting requires a flag ledger (every 256th ledger) + // We need to create a ledger at sequence 256 to make it a flag + // ledger + for (int i = 0; i < 256 - 1; ++i) + { + ledger = std::make_shared( + *ledger, env.app().timeKeeper().closeTime()); + } + BEAST_EXPECT(ledger->isFlagLedger()); - auto const txs = getTxs(txSet); - BEAST_EXPECT(txs.size() == 1); - auto const& feeTx = txs[0]; + // Create some mock validations with fee votes + std::vector> validations; - BEAST_EXPECT(feeTx.getTxnType() == ttFEE); + for (int i = 0; i < 5; i++) + { + auto sec = randomSecretKey(); + auto pub = derivePublicKey(KeyType::secp256k1, sec); + + auto val = std::make_shared( + env.app().timeKeeper().now(), + pub, + sec, + calcNodeID(pub), + [&](STValidation& v) { + v.setFieldU32(sfLedgerSequence, ledger->seq()); + // Vote for different fees than current + v.setFieldAmount( + sfBaseFeeDrops, XRPAmount{setup.reference_fee}); + v.setFieldAmount( + sfReserveBaseDrops, + XRPAmount{setup.account_reserve}); + v.setFieldAmount( + sfReserveIncrementDrops, + XRPAmount{setup.owner_reserve}); + v.setFieldU32( + sfExtensionComputeLimit, + setup.extension_compute_limit); + v.setFieldU32( + sfExtensionSizeLimit, setup.extension_size_limit); + v.setFieldU32(sfGasPrice, setup.gas_price); + }); + if (i % 2) + val->setTrusted(); + validations.push_back(val); + } - BEAST_EXPECT(feeTx.getAccountID(sfAccount) == AccountID()); - BEAST_EXPECT(feeTx.getFieldU32(sfLedgerSequence) == ledger->seq() + 1); + auto txSet = std::make_shared( + SHAMapType::TRANSACTION, env.app().getNodeFamily()); + + // This should not throw since we have a flag ledger + feeVote->doVoting(ledger, validations, txSet); + + auto const txs = getTxs(txSet); + BEAST_EXPECT(txs.size() == 1); + return {txs[0], ledger}; + }; + + auto checkFeeTx = [&](FeeSetup const& setup, + STTx const& feeTx, + std::shared_ptr const& ledger, + std::source_location const loc = + std::source_location::current()) { + auto const line = " (" + std::to_string(loc.line()) + ")"; + BEAST_EXPECTS(feeTx.getTxnType() == ttFEE, line); + + BEAST_EXPECTS(feeTx.getAccountID(sfAccount) == AccountID(), line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfLedgerSequence) == ledger->seq() + 1, line); + + BEAST_EXPECTS(feeTx.isFieldPresent(sfBaseFeeDrops), line); + BEAST_EXPECTS(feeTx.isFieldPresent(sfReserveBaseDrops), line); + BEAST_EXPECTS(feeTx.isFieldPresent(sfReserveIncrementDrops), line); + + // The legacy fields should NOT be present + BEAST_EXPECTS(!feeTx.isFieldPresent(sfBaseFee), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReserveBase), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReserveIncrement), line); + BEAST_EXPECTS(!feeTx.isFieldPresent(sfReferenceFeeUnits), line); + + // Check the values + BEAST_EXPECTS( + feeTx.getFieldAmount(sfBaseFeeDrops) == + XRPAmount{setup.reference_fee}, + line); + BEAST_EXPECTS( + feeTx.getFieldAmount(sfReserveBaseDrops) == + XRPAmount{setup.account_reserve}, + line); + BEAST_EXPECTS( + feeTx.getFieldAmount(sfReserveIncrementDrops) == + XRPAmount{setup.owner_reserve}, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfExtensionComputeLimit) == + setup.extension_compute_limit, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfExtensionSizeLimit) == + setup.extension_size_limit, + line); + BEAST_EXPECTS( + feeTx.getFieldU32(sfGasPrice) == setup.gas_price, line); + }; - BEAST_EXPECT(feeTx.isFieldPresent(sfBaseFeeDrops)); - BEAST_EXPECT(feeTx.isFieldPresent(sfReserveBaseDrops)); - BEAST_EXPECT(feeTx.isFieldPresent(sfReserveIncrementDrops)); - - // The legacy fields should NOT be present - BEAST_EXPECT(!feeTx.isFieldPresent(sfBaseFee)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveBase)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReserveIncrement)); - BEAST_EXPECT(!feeTx.isFieldPresent(sfReferenceFeeUnits)); + { + FeeSetup setup; + setup.reference_fee = 42; + setup.account_reserve = 1234567; + setup.owner_reserve = 7654321; + setup.extension_compute_limit = 100; + setup.extension_size_limit = 200; + setup.gas_price = 300; + auto const [feeTx, ledger] = createFeeTxFromVoting(setup); + + checkFeeTx(setup, feeTx, ledger); + } - // Check the values - BEAST_EXPECT( - feeTx.getFieldAmount(sfBaseFeeDrops) == - XRPAmount{setup.reference_fee}); - BEAST_EXPECT( - feeTx.getFieldAmount(sfReserveBaseDrops) == - XRPAmount{setup.account_reserve}); - BEAST_EXPECT( - feeTx.getFieldAmount(sfReserveIncrementDrops) == - XRPAmount{setup.owner_reserve}); - BEAST_EXPECT( - feeTx.getFieldU32(sfExtensionComputeLimit) == - setup.extension_compute_limit); - BEAST_EXPECT( - feeTx.getFieldU32(sfExtensionSizeLimit) == - setup.extension_size_limit); - BEAST_EXPECT(feeTx.getFieldU32(sfGasPrice) == setup.gas_price); + { + FeeSetup setup; + setup.reference_fee = 42; + setup.account_reserve = 1234567; + setup.owner_reserve = 7654321; + setup.extension_compute_limit = 0; + setup.extension_size_limit = 0; + setup.gas_price = 300; + auto const [feeTx, ledger] = createFeeTxFromVoting(setup); + + checkFeeTx(setup, feeTx, ledger); + } } void diff --git a/src/test/jtx/impl/envconfig.cpp b/src/test/jtx/impl/envconfig.cpp index 67bbe3b457a..99f35a2dca4 100644 --- a/src/test/jtx/impl/envconfig.cpp +++ b/src/test/jtx/impl/envconfig.cpp @@ -17,6 +17,9 @@ setupConfigForUnitTests(Config& cfg) cfg.FEES.reference_fee = UNIT_TEST_REFERENCE_FEE; cfg.FEES.account_reserve = XRP(200).value().xrp().drops(); cfg.FEES.owner_reserve = XRP(50).value().xrp().drops(); + cfg.FEES.extension_compute_limit = 1'000'000; + cfg.FEES.extension_size_limit = 1'000'000; + cfg.FEES.gas_price = 1'000; // The Beta API (currently v2) is always available to tests cfg.BETA_RPC_API = true; diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index 35cc735a8ee..767dbc1c912 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -107,21 +107,20 @@ FeeVoteImpl::doValidation( // Values should always be in a valid range (because the voting process // will ignore out-of-range values) but if we detect such a case, we do // not send a value. + auto vote = [&v, this]( + auto const current, + auto target, + char const* name, + auto const& sfield) { + if (current != target) + { + JLOG(journal_.info()) << "Voting for " << name << " of " << target; + + v[sfield] = target; + } + }; if (rules.enabled(featureXRPFees)) { - auto vote = [&v, this]( - auto const current, - XRPAmount target, - char const* name, - auto const& sfield) { - if (current != target) - { - JLOG(journal_.info()) - << "Voting for " << name << " of " << target; - - v[sfield] = target; - } - }; vote(lastFees.base, target_.reference_fee, "base fee", sfBaseFeeDrops); vote( lastFees.reserve, @@ -142,12 +141,12 @@ FeeVoteImpl::doValidation( auto to64 = [](XRPAmount target) { return target.dropsAs(); }; - auto vote = [&v, this]( - auto const current, - XRPAmount target, - auto const& convertCallback, - char const* name, - auto const& sfield) { + auto voteAndConvert = [&v, this]( + auto const current, + XRPAmount target, + auto const& convertCallback, + char const* name, + auto const& sfield) { if (current != target) { JLOG(journal_.info()) @@ -158,14 +157,15 @@ FeeVoteImpl::doValidation( } }; - vote(lastFees.base, target_.reference_fee, to64, "base fee", sfBaseFee); - vote( + voteAndConvert( + lastFees.base, target_.reference_fee, to64, "base fee", sfBaseFee); + voteAndConvert( lastFees.reserve, target_.account_reserve, to32, "base reserve", sfReserveBase); - vote( + voteAndConvert( lastFees.increment, target_.owner_reserve, to32, @@ -174,19 +174,6 @@ FeeVoteImpl::doValidation( } if (rules.enabled(featureSmartEscrow)) { - auto vote = [&v, this]( - auto const current, - std::uint32_t target, - char const* name, - auto const& sfield) { - if (current != target) - { - JLOG(journal_.info()) - << "Voting for " << name << " of " << target; - - v[sfield] = target; - } - }; vote( lastFees.extensionComputeLimit, target_.extension_compute_limit, From df98db14528eb825b26c6180a7404bb033b04993 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 23 Jan 2026 16:12:14 -0500 Subject: [PATCH 161/212] Check wasm return type (#6240) * Check wasm return type * Add more tests --- src/test/app/Wasm_test.cpp | 60 +++++++++++++++++++++++++++ src/xrpld/app/wasm/detail/WasmiVM.cpp | 5 ++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 699178cac2f..aee7968f782 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -953,6 +953,65 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } + void + testReturnType() + { + using namespace test::jtx; + Env env(*this); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + + // return int64. + { // (module + // (memory (export "memory") 1) + // (func (export "finish") (result i64) + // i64.const 0x100000000)) + auto const wasmHex = + "0061736d010000000105016000017e030201000503010001" + "071302066d656d6f727902000666696e69736800000a0a01" + "08004280808080100b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + + // return void. wasmi return execution error + { //(module + // (type (;0;) (func)) + // (func (;0;) (type 0) + // return) + // (memory (;0;) 1) + // (export "memory" (memory 0)) + // (export "finish" (func 0))) + auto const wasmHex = + "0061736d01000000010401600000030201000503010001071302066d656d6f" + "727902000666696e69736800000a050103000f0b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + + // return i32, i32. wasmi doesn't create module + { //(module + // (memory (export "memory") 1) + // (func (export "finish") (result i32 i32) + // i32.const 0x10000000 + // i32.const 0x100000FF)) + auto const wasmHex = + "0061736d010000000106016000027f7f030201000503010001071302066d65" + "6d6f727902000666696e69736800000a10010e0041808080800141ff818080" + "010b"; + auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); + Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const re = + runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + BEAST_EXPECT(!re); + } + } + void run() override { @@ -984,6 +1043,7 @@ struct Wasm_test : public beast::unit_test::suite testStartFunctionLoop(); testBadAlloc(); testBadAlign(); + testReturnType(); // perfTest(); } diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 037f787a26d..fa2e2fe085e 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -874,8 +874,11 @@ WasmiEngine::runHlp( throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE + else if (res.r.vec_.data[0].kind != WASM_I32) + throw std::runtime_error( + "<" + std::string(funcName) + "> return type mismatch, ret: " + + std::to_string(static_cast(res.r.vec_.data[0].kind))); - assert(res.r.vec_.data[0].kind == WASM_I32); if (gas == -1) gas = std::numeric_limits::max(); WasmResult const ret{ From 4160677878c52e50e2e9546134e8bfc61c18f29f Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Mon, 26 Jan 2026 14:04:03 -0500 Subject: [PATCH 162/212] Switch to series expansion method for ln() (#6268) * Switch to series expansion method for ln() Add float lg() tests to Number tests; * Rename lg -> log10 * Add check for 0 to log10() --- include/xrpl/basics/Number.h | 2 +- src/libxrpl/basics/Number.cpp | 65 +++++++++----- src/test/app/HostFuncImpl_test.cpp | 2 +- src/test/basics/Number_test.cpp | 84 +++++++++++++++++++ .../app/wasm/detail/HostFuncImplFloat.cpp | 2 +- 5 files changed, 132 insertions(+), 23 deletions(-) diff --git a/include/xrpl/basics/Number.h b/include/xrpl/basics/Number.h index 846607066b4..a012251cc29 100644 --- a/include/xrpl/basics/Number.h +++ b/include/xrpl/basics/Number.h @@ -753,7 +753,7 @@ power(Number const& f, unsigned n); // logarithm with base 10 Number -lg(Number const& value); +log10(Number const& value, int iterations = 50); // Returns f^(1/d) // Uses Newton–Raphson iterations until the result stops changing diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 2fcd88f3b07..6dd7713235c 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -984,46 +984,71 @@ power(Number const& f, unsigned n) return r; } -// Continued fraction approximation of ln(x) +// Series expansion method approximation of ln(x) static Number -ln(Number const& x, unsigned iterations = 50) +ln(Number const& x, int iterations = 50) { + static Number const N0(0); + static Number const N2(2, 0); + static Number const N05(5, -1); + static Number const LN2(693'147'180'559'945'309ll, -18); + if (x <= 0) - throw std::runtime_error("Not positive value"); + throw std::runtime_error("Not a positive value"); + else if (x == 1) + return N0; + + int exponent = 0; + Number mantissa = x; + + while (mantissa >= N2) + { + mantissa /= 2; + exponent += 1; + } + while (mantissa < N05) + { + mantissa *= 2; + exponent -= 1; + } - Number const z = (x - 1) / (x + 1); + Number z = (mantissa - 1) / (mantissa + 1); Number const zz = z * z; - Number denom = Number(1, -10); + Number sum; - // Construct the fraction from the bottom up - for (int i = iterations; i > 0; --i) + for (int i = 1; i <= iterations; ++i) { - Number k(2 * i - 1); - denom = k - (i * i * zz / denom); + sum = sum + z / (2 * i - 1); + z = z * zz; } - auto const r = 2 * z / denom; - return r; + return 2 * sum + exponent * LN2; } Number -lg(Number const& x) +log10(Number const& x, int iterations) { - static Number const ln10 = ln(Number(10)); + static Number const N0(0); + static Number const LN10(2'302'585'092'994'046ll, -15); + + if (x <= 0) + throw std::runtime_error("Not a positive value"); + else if (x == 1) + return N0; if (x <= Number(10)) { - auto const r = ln(x) / ln10; + auto const r = ln(x, iterations) / LN10; return r; } - // ln(x) = ln(normX * 10^norm) = ln(normX) + norm * ln(10) + // (1 <= normalX < 10) + // ln(x) = ln(normalX * 10^norm) = ln(normalX) + norm * ln(10) int diffExp = 15 + x.exponent(); - Number const normalX = x / Number(1, diffExp); // (1 <= normalX < 10) - auto const lnX = ln(normalX) + diffExp * ln10; - - auto const r = lnX / ln10; - return r; + Number const normalX = x / Number(1, diffExp); + auto const lnX = ln(normalX, iterations) + diffExp * LN10; + auto const lgX = lnX / LN10; + return lgX; } // Returns f^(1/d) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index fae904c0ec5..80dcd2970d2 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -3067,7 +3067,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const x = hfs.floatSet(1, -2, 0); // 0.01 auto const y = - hfs.floatSet(-1999999993734431, -15, 0); // almost -2 + hfs.floatSet(-2'000'000'000'000'000ll, -15, 0); // -2 if (BEAST_EXPECT(x && y)) { auto const result = hfs.floatLog(makeSlice(*x), 0); diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 1fa5ae6e8fb..f647a7abd0c 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -1712,6 +1712,89 @@ class Number_test : public beast::unit_test::suite } } + void + test_log10() + { + auto const scale = Number::getMantissaScale(); + testcase << "test_lg " << to_string(scale); + + using Case = std::tuple; + auto test = [this](auto const& c) { + for (auto const& [x, z] : c) + { + auto const result = log10(x); + std::stringstream ss; + ss << "lg(" << x << ") = " << result << ". Expected: " << z; + // std::cout << ss.str() << std::endl; + BEAST_EXPECTS(result == z, ss.str()); + } + }; + + auto const cSmall = std::to_array( + {{Number{2}, Number{3'010'299'956'639'811ll, -16}}, + {Number{2'000'000}, Number{6'301'029'995'663'985ll, -15}}, + {Number{2, -30}, Number{-2'969'897'000'433'602ll, -14}}, + {Number{1}, Number{0}}, + {Number{1'000'000'000'000'000ll}, Number{15}}, + {Number{5625, -4}, Number{-2'498'774'732'165'998, -16}}}); + + auto const cLarge = std::to_array( + {{Number{ + false, Number::maxMantissa() - 9, -1, Number::normalized{}}, + Number{ + false, + 1'746'901'684'478'673'451ll, + -17, + Number::normalized{}}}, + {Number{false, Number::maxMantissa() - 9, 0, Number::normalized{}}, + Number{ + false, + 1'846'901'684'478'673'451ll, + -17, + Number::normalized{}}}, + {Number{Number::maxRep}, + Number{ + false, + 1'861'728'612'932'620'011ll, + -17, + Number::normalized{}}}}); + + if (Number::getMantissaScale() == MantissaRange::small) + { + test(cSmall); + } + else + { + NumberRoundModeGuard mg(Number::towards_zero); + test(cLarge); + } + + { + bool caught = false; + try + { + log10(Number{-2}); + } + catch (std::runtime_error const&) + { + caught = true; + } + BEAST_EXPECT(caught); + caught = false; + + try + { + log10(Number()); + } + catch (std::runtime_error const&) + { + caught = true; + } + BEAST_EXPECT(caught); + caught = false; + } + } + void run() override { @@ -1739,6 +1822,7 @@ class Number_test : public beast::unit_test::suite test_truncate(); testRounding(); testInt64(); + test_log10(); } } }; diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index e424e3cedf7..d0f8f1e8e95 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -454,7 +454,7 @@ floatLogImpl(Slice const& x, int32_t mode) if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res(lg(xx)); + detail::Number2 res(log10(xx)); return res.toBytes(); } From 317e533d812f002736341cde16b1913581cfa04a Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 26 Jan 2026 15:21:15 -0500 Subject: [PATCH 163/212] clean up Wasm_test.cpp more (#6278) --- src/test/app/Wasm_test.cpp | 196 ++++++++++++++++--------------------- 1 file changed, 85 insertions(+), 111 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index aee7968f782..2399809b0c3 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -6,13 +6,7 @@ #include -#if (defined(__clang_major__) && __clang_major__ < 15) -#include -using source_location = std::experimental::source_location; -#else #include -using std::source_location; -#endif namespace xrpl { namespace test { @@ -31,12 +25,18 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } +std::vector const +hexToBytes(std::string const& hex) +{ + auto const ws = boost::algorithm::unhex(hex); + return Bytes(ws.begin(), ws.end()); +} + std::optional runFinishFunction(std::string const& code) { auto& engine = WasmEngine::instance(); - auto const ws = boost::algorithm::unhex(code); - Bytes const wasm(ws.begin(), ws.end()); + auto const wasm = hexToBytes(code); auto const re = engine.run(wasm, "finish"); if (re.has_value()) { @@ -55,7 +55,7 @@ struct Wasm_test : public beast::unit_test::suite Expected, TER> re, int32_t expectedResult, int64_t expectedCost, - source_location const location = source_location::current()) + std::source_location const location = std::source_location::current()) { auto const lineStr = " (" + std::to_string(location.line()) + ")"; if (BEAST_EXPECTS(re.has_value(), transToken(re.error()) + lineStr)) @@ -132,9 +132,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new HostFunctions(env.journal)); { - auto wasmHex = "00000000"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + auto wasm = hexToBytes("00000000"); std::string funcName("mock_escrow"); auto re = runEscrowWasm(wasm, hfs, funcName, {}, 15); @@ -142,9 +140,7 @@ struct Wasm_test : public beast::unit_test::suite } { - auto wasmHex = "00112233445566778899AA"; - auto wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + auto wasm = hexToBytes("00112233445566778899AA"); std::string funcName("mock_escrow"); auto const re = preflightEscrowWasm(wasm, hfs, funcName); @@ -156,7 +152,7 @@ struct Wasm_test : public beast::unit_test::suite // pub fn bad() -> bool { // unsafe { host_lib::getLedgerSqn() >= 5 } // } - auto const badWasmHex = + auto const badWasm = hexToBytes( "0061736d010000000105016000017f02190108686f73745f6c69620c6765" "744c656467657253716e00000302010005030100100611027f00418080c0" "000b7f00418080c0000b072b04066d656d6f727902000362616400010a5f" @@ -166,12 +162,10 @@ struct Wasm_test : public beast::unit_test::suite "2e31202834656231363132353020323032352d30332d31352900490f7461" "726765745f6665617475726573042b0f6d757461626c652d676c6f62616c" "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" - "6d756c746976616c7565"; - auto wasmStr = boost::algorithm::unhex(std::string(badWasmHex)); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + "6d756c746976616c7565"); auto const re = - preflightEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME); + preflightEscrowWasm(badWasm, hfs, ESCROW_FUNCTION_NAME); BEAST_EXPECT(!isTesSuccess(re)); } } @@ -181,8 +175,7 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm get ledger sequence"); - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto ledgerSqnWasm = hexToBytes(ledgerSqnWasmHex); using namespace test::jtx; @@ -194,7 +187,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, + ledgerSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, @@ -219,11 +212,10 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm fibo"); - auto const ws = boost::algorithm::unhex(fibWasmHex); - Bytes const wasm(ws.begin(), ws.end()); + auto const fibWasm = hexToBytes(fibWasmHex); auto& engine = WasmEngine::instance(); - auto const re = engine.run(wasm, "fib", wasmParams(10)); + auto const re = engine.run(fibWasm, "fib", wasmParams(10)); checkResult(re, 55, 1'137); } @@ -233,12 +225,11 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm sha"); - auto const ws = boost::algorithm::unhex(sha512PureWasmHex); - Bytes const wasm(ws.begin(), ws.end()); + auto const sha512Wasm = hexToBytes(sha512PureWasmHex); auto& engine = WasmEngine::instance(); - auto const re = - engine.run(wasm, "sha512_process", wasmParams(sha512PureWasmHex)); + auto const re = engine.run( + sha512Wasm, "sha512_process", wasmParams(sha512PureWasmHex)); checkResult(re, 34'432, 151'155); } @@ -247,8 +238,7 @@ struct Wasm_test : public beast::unit_test::suite testWasmB58() { testcase("Wasm base58"); - auto const ws = boost::algorithm::unhex(b58WasmHex); - Bytes const wasm(ws.begin(), ws.end()); + auto const b58Wasm = hexToBytes(b58WasmHex); auto& engine = WasmEngine::instance(); Bytes outb; @@ -259,7 +249,7 @@ struct Wasm_test : public beast::unit_test::suite static_cast(b58WasmHex.size())); auto const s = std::string_view(b58WasmHex.c_str(), minsz); - auto const re = engine.run(wasm, "b58enco", wasmParams(outb, s)); + auto const re = engine.run(b58Wasm, "b58enco", wasmParams(outb, s)); checkResult(re, 700, 2'886'069); } @@ -273,9 +263,7 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const allHostFuncWasm = hexToBytes(allHostFunctionsWasmHex); auto& engine = WasmEngine::instance(); @@ -285,7 +273,7 @@ struct Wasm_test : public beast::unit_test::suite i.second.gas = 0; auto re = engine.run( - wasm, + allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, @@ -305,9 +293,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const allHostFuncWasm = hexToBytes(allHostFunctionsWasmHex); auto& engine = WasmEngine::instance(); @@ -315,7 +301,7 @@ struct Wasm_test : public beast::unit_test::suite auto const imp = createWasmImport(*hfs); auto re = engine.run( - wasm, + allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, @@ -330,9 +316,7 @@ struct Wasm_test : public beast::unit_test::suite // not enough gas { - std::string const wasmHex = allHostFunctionsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const allHostFuncWasm = hexToBytes(allHostFunctionsWasmHex); auto& engine = WasmEngine::instance(); @@ -340,7 +324,13 @@ struct Wasm_test : public beast::unit_test::suite auto const imp = createWasmImport(*hfs); auto re = engine.run( - wasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 200, env.journal); + allHostFuncWasm, + ESCROW_FUNCTION_NAME, + {}, + imp, + hfs, + 200, + env.journal); if (BEAST_EXPECT(!re)) { @@ -358,23 +348,22 @@ struct Wasm_test : public beast::unit_test::suite { testcase("escrow wasm devnet test"); - std::string const wasmStr = - boost::algorithm::unhex(allHostFunctionsWasmHex); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + auto const allHFWasm = hexToBytes(allHostFunctionsWasmHex); using namespace test::jtx; Env env{*this}; { std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm( + allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, 1, 64'763); } { // max() gas std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); + auto re = + runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); checkResult(re, 1, 64'763); } @@ -392,8 +381,8 @@ struct Wasm_test : public beast::unit_test::suite }; std::shared_ptr hfs(new BadTestHostFunctions(env)); - auto re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm( + allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'148); } @@ -411,20 +400,19 @@ struct Wasm_test : public beast::unit_test::suite }; std::shared_ptr hfs(new BadTestHostFunctions(env)); - auto re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm( + allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'148); } { // fail because recursion too deep - auto const wasmStr = boost::algorithm::unhex(deepRecursionHex); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + auto const deepWasm = hexToBytes(deepRecursionHex); std::shared_ptr hfs( new TestHostFunctionsSink(env)); std::string funcName("finish"); - auto re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000'000); + auto re = runEscrowWasm(deepWasm, hfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -449,13 +437,13 @@ struct Wasm_test : public beast::unit_test::suite } { // infinite loop - auto const wasmStr = boost::algorithm::unhex(infiniteLoopWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const infiniteLoopWasm = hexToBytes(infiniteLoopWasmHex); std::string const funcName("loop"); std::shared_ptr hfs(new TestHostFunctions(env, 0)); // infinite loop should be caught and fail - auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); + auto const re = + runEscrowWasm(infiniteLoopWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -464,8 +452,7 @@ struct Wasm_test : public beast::unit_test::suite { // expected import not provided - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( @@ -474,7 +461,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, + lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, @@ -487,8 +474,7 @@ struct Wasm_test : public beast::unit_test::suite { // bad import format - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( @@ -498,7 +484,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, + lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, @@ -511,8 +497,7 @@ struct Wasm_test : public beast::unit_test::suite { // bad function name - auto wasmStr = boost::algorithm::unhex(ledgerSqnWasmHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); WASM_IMPORT_FUNC2( @@ -520,7 +505,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "func1", {}, imports, hfs, 1'000'000, env.journal); + lgrSqnWasm, "func1", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -537,23 +522,19 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); { - std::string const wasmHex = floatTestsWasmHex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const floatTestWasm = hexToBytes(floatTestsWasmHex); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = runEscrowWasm(wasm, hfs, funcName, {}, 200'000); + auto re = runEscrowWasm(floatTestWasm, hfs, funcName, {}, 200'000); checkResult(re, 1, 110'699); env.close(); } { - std::string const wasmHex = float0Hex; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const float0Wasm = hexToBytes(float0Hex); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = runEscrowWasm(wasm, hfs, funcName, {}, 100'000); + auto re = runEscrowWasm(float0Wasm, hfs, funcName, {}, 100'000); checkResult(re, 1, 4'259); env.close(); } @@ -568,9 +549,7 @@ struct Wasm_test : public beast::unit_test::suite using namespace std::chrono; // std::string const funcName("test"); - auto const& wasmHex = hfPerfTest; - std::string const wasmStr = boost::algorithm::unhex(wasmHex); - std::vector const wasm(wasmStr.begin(), wasmStr.end()); + auto const perfWasm = hexToBytes(hfPerfTest); // std::string const credType = "abcde"; // std::string const credType2 = "fghijk"; @@ -638,7 +617,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs( new PerfHostFunctions(env, k, env.tx())); - auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME); + auto re = runEscrowWasm(perfWasm, hfs, ESCROW_FUNCTION_NAME); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); @@ -664,12 +643,12 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; - auto const wasmStr = boost::algorithm::unhex(codecovTestsWasmHex); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const codecovWasm = hexToBytes(codecovTestsWasmHex); std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto const allowance = 187'131; - auto re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); + auto re = runEscrowWasm( + codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); checkResult(re, 1, allowance); } @@ -682,14 +661,14 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - auto const wasmStr = boost::algorithm::unhex(disabledFloatHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto disabledFloatWasm = hexToBytes(disabledFloatHex); std::string const funcName("finish"); std::shared_ptr hfs(new TestHostFunctions(env, 0)); { // f32 set constant, opcode disabled exception - auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); + auto const re = + runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -698,8 +677,9 @@ struct Wasm_test : public beast::unit_test::suite { // f32 add, can't create module exception - wasm[0x117] = 0x92; - auto const re = runEscrowWasm(wasm, hfs, funcName, {}, 1'000'000); + disabledFloatWasm[0x117] = 0x92; + auto const re = + runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -827,19 +807,18 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env(*this); - auto wasmStr = boost::algorithm::unhex(startLoopHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const startLoopWasm = hexToBytes(startLoopHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); auto& engine = WasmEngine::instance(); - auto checkRes = - engine.check(wasm, "finish", {}, imports, hfs, env.journal); + auto checkRes = engine.check( + startLoopWasm, "finish", {}, imports, hfs, env.journal); BEAST_EXPECTS( checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); auto re = engine.run( - wasm, + startLoopWasm, ESCROW_FUNCTION_NAME, {}, imports, @@ -857,8 +836,7 @@ struct Wasm_test : public beast::unit_test::suite testcase("Wasm Bad Alloc"); // bad_alloc.c - auto wasmStr = boost::algorithm::unhex(badAllocHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const badAllocWasm = hexToBytes(badAllocHex); using namespace test::jtx; @@ -874,7 +852,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, hfs, 1'000'000, env.journal); + badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re)) { BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); @@ -887,7 +865,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, hfs, 1'000'000, env.journal); + badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -897,7 +875,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, hfs, 1'000'000, env.journal); + badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -907,7 +885,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, hfs, 1'000'000, env.journal); + badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } @@ -917,7 +895,7 @@ struct Wasm_test : public beast::unit_test::suite {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", params, {}, hfs, 1'000'000, env.journal); + badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -932,8 +910,7 @@ struct Wasm_test : public beast::unit_test::suite testcase("Wasm Bad Align"); // bad_align.c - auto wasmStr = boost::algorithm::unhex(badAlignHex); - Bytes wasm(wasmStr.begin(), wasmStr.end()); + auto const badAlignWasm = hexToBytes(badAlignHex); using namespace test::jtx; @@ -946,7 +923,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - wasm, "test", {}, imports, hfs, 1'000'000, env.journal); + badAlignWasm, "test", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 0xbab88d46); } @@ -969,8 +946,7 @@ struct Wasm_test : public beast::unit_test::suite "0061736d010000000105016000017e030201000503010001" "071302066d656d6f727902000666696e69736800000a0a01" "08004280808080100b"; - auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const wasm = hexToBytes(wasmHex); auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); @@ -987,8 +963,7 @@ struct Wasm_test : public beast::unit_test::suite auto const wasmHex = "0061736d01000000010401600000030201000503010001071302066d656d6f" "727902000666696e69736800000a050103000f0b"; - auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const wasm = hexToBytes(wasmHex); auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); @@ -1004,8 +979,7 @@ struct Wasm_test : public beast::unit_test::suite "0061736d010000000106016000027f7f030201000503010001071302066d65" "6d6f727902000666696e69736800000a10010e0041808080800141ff818080" "010b"; - auto const wasmStr = boost::algorithm::unhex(std::string(wasmHex)); - Bytes const wasm(wasmStr.begin(), wasmStr.end()); + auto const wasm = hexToBytes(wasmHex); auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); From 917c610f963b11c0a89aa0b4942bcb31abe9093f Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 27 Jan 2026 12:37:47 -0500 Subject: [PATCH 164/212] Ensure request size less than int limit (#6239) * Ensure request size less than int limit * Move size check to wasmParams function --- src/test/app/Wasm_test.cpp | 17 +++++++++++++++++ src/xrpld/app/wasm/ParamsHelper.h | 14 ++++++++++++++ src/xrpld/app/wasm/WasmiVM.h | 2 +- src/xrpld/app/wasm/detail/WasmiVM.cpp | 4 ++-- 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 2399809b0c3..b5e5d7fc73d 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -901,6 +901,23 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } + { + std::string what; + try + { + char const test[] = "test"; + std::size_t sz = std::numeric_limits::max() + 1ull; + auto p = wasmParams(std::string_view(test, sz)); + } + catch (std::exception const& e) + { + what = e.what(); + } + BEAST_EXPECT( + what.find("can't allocate memory, size: 2147483648") != + std::string::npos); + } + env.close(); } diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index 508a9438b0b..fb0b7f45ddd 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -199,6 +199,11 @@ template inline void wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) { + if (p.size() > std::numeric_limits::max()) + throw std::runtime_error( + "can't allocate memory, size: " + + std::to_string(p.size())); // LCOV_EXCL_LINE + wasmParamsHlp( v, p.data(), @@ -213,6 +218,10 @@ wasmParamsHlp( std::string_view const& p, Types&&... args) { + if (p.size() > std::numeric_limits::max()) + throw std::runtime_error( + "can't allocate memory, size: " + std::to_string(p.size())); + wasmParamsHlp( v, reinterpret_cast(p.data()), @@ -224,6 +233,11 @@ template inline void wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) { + if (p.size() > std::numeric_limits::max()) + throw std::runtime_error( + "can't allocate memory, size: " + + std::to_string(p.size())); // LCOV_EXCL_LINE + wasmParamsHlp( v, reinterpret_cast(p.c_str()), diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index d7e52d6a0e3..c64e7951c01 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -335,7 +335,7 @@ class WasmiEngine FuncInfo const& f, std::vector& in, uint8_t const* d, - std::size_t sz, + int32_t sz, Types&&... args); template diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index fa2e2fe085e..a0f8b612da8 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -759,7 +759,7 @@ WasmiEngine::call( FuncInfo const& f, std::vector& in, uint8_t const* d, - std::size_t sz, + int32_t sz, Types&&... args) { auto mem = getMem(); @@ -990,7 +990,7 @@ WasmiEngine::allocate(int32_t sz) throw std::runtime_error( "can't allocate memory, " + std::to_string(sz) + " bytes"); - auto res = call<1>(W_ALLOC, static_cast(sz)); + auto res = call<1>(W_ALLOC, sz); if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32)) throw std::runtime_error( From f1f2e2629fac77cb67dacc3693a7b332f105c204 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 27 Jan 2026 13:05:54 -0500 Subject: [PATCH 165/212] Fix for Big-Endian machines (#6245) --- src/test/app/Wasm_test.cpp | 55 +++++++++++++++++++ src/xrpld/app/wasm/ParamsHelper.h | 31 +++++++++++ .../app/wasm/detail/HostFuncImplGetter.cpp | 42 ++++++++++---- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 3 +- 4 files changed, 118 insertions(+), 13 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index b5e5d7fc73d..a26328039b8 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1003,6 +1003,60 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testSwapBytes() + { + testcase("Wasm swap bytes"); + + uint64_t const SWAP_DATAU64 = 0x123456789abcdeffull; + uint64_t const REVERSE_SWAP_DATAU64 = 0xffdebc9a78563412ull; + int64_t const SWAP_DATAI64 = 0x123456789abcdeffll; + int64_t const REVERSE_SWAP_DATAI64 = 0xffdebc9a78563412ll; + + uint32_t const SWAP_DATAU32 = 0x12789aff; + uint32_t const REVERSE_SWAP_DATAU32 = 0xff9a7812; + int32_t const SWAP_DATAI32 = 0x12789aff; + int32_t const REVERSE_SWAP_DATAI32 = 0xff9a7812; + + uint16_t const SWAP_DATAU16 = 0x12ff; + uint16_t const REVERSE_SWAP_DATAU16 = 0xff12; + int16_t const SWAP_DATAI16 = 0x12ff; + int16_t const REVERSE_SWAP_DATAI16 = 0xff12; + + uint64_t b1 = SWAP_DATAU64; + int64_t b2 = SWAP_DATAI64; + b1 = adjustWasmEndianessHlp(b1); + b2 = adjustWasmEndianessHlp(b2); + BEAST_EXPECT(b1 == REVERSE_SWAP_DATAU64); + BEAST_EXPECT(b2 == REVERSE_SWAP_DATAI64); + b1 = adjustWasmEndianessHlp(b1); + b2 = adjustWasmEndianessHlp(b2); + BEAST_EXPECT(b1 == SWAP_DATAU64); + BEAST_EXPECT(b2 == SWAP_DATAI64); + + uint32_t b3 = SWAP_DATAU32; + int32_t b4 = SWAP_DATAI32; + b3 = adjustWasmEndianessHlp(b3); + b4 = adjustWasmEndianessHlp(b4); + BEAST_EXPECT(b3 == REVERSE_SWAP_DATAU32); + BEAST_EXPECT(b4 == REVERSE_SWAP_DATAI32); + b3 = adjustWasmEndianessHlp(b3); + b4 = adjustWasmEndianessHlp(b4); + BEAST_EXPECT(b3 == SWAP_DATAU32); + BEAST_EXPECT(b4 == SWAP_DATAI32); + + uint16_t b5 = SWAP_DATAU16; + int16_t b6 = SWAP_DATAI16; + b5 = adjustWasmEndianessHlp(b5); + b6 = adjustWasmEndianessHlp(b6); + BEAST_EXPECT(b5 == REVERSE_SWAP_DATAU16); + BEAST_EXPECT(b6 == REVERSE_SWAP_DATAI16); + b5 = adjustWasmEndianessHlp(b5); + b6 = adjustWasmEndianessHlp(b6); + BEAST_EXPECT(b5 == SWAP_DATAU16); + BEAST_EXPECT(b6 == SWAP_DATAI16); + } + void run() override { @@ -1035,6 +1089,7 @@ struct Wasm_test : public beast::unit_test::suite testBadAlloc(); testBadAlign(); testReturnType(); + testSwapBytes(); // perfTest(); } diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index fb0b7f45ddd..a7546ce0923 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -261,4 +261,35 @@ wasmParams(Types&&... args) return v; } +template +inline constexpr T +adjustWasmEndianessHlp(T x) +{ + static_assert(std::is_integral::value, "Only integral types"); + if constexpr (size > 1) + { + using U = std::make_unsigned::type; + U u = static_cast(x); + U const low = (u & 0xFF) << ((size - 1) << 3); + u = adjustWasmEndianessHlp(u >> 8); + return static_cast(low | u); + } + + return x; +} + +template +inline constexpr T +adjustWasmEndianess(T x) +{ + // LCOV_EXCL_START + static_assert(std::is_integral::value, "Only integral types"); + if constexpr (std::endian::native == std::endian::big) + { + return adjustWasmEndianessHlp(x); + } + return x; + // LCOV_EXCL_STOP +} + } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 6b956de8a00..70fb1b5304b 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -9,6 +9,19 @@ typedef std::variant FieldValue; namespace detail { +template +Bytes +getIntBytes(STBase const* obj) +{ + static_assert(std::is_integral::value, "Only integral types"); + + auto const& num(static_cast const*>(obj)); + T const data = adjustWasmEndianess(num->value()); + auto const* b = reinterpret_cast(&data); + auto const* e = reinterpret_cast(&data + 1); + return Bytes{b, e}; +} + static Expected getAnyFieldData(STBase const* obj) { @@ -58,21 +71,26 @@ getAnyFieldData(STBase const* obj) } break; case STI_UINT16: { - auto const& num(static_cast const*>(obj)); - std::uint16_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; + return getIntBytes(obj); } break; case STI_UINT32: { - auto const* num(static_cast const*>(obj)); - std::uint32_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; + return getIntBytes(obj); + } + // LCOV_EXCL_START + case STI_UINT64: { + return getIntBytes(obj); } break; + case STI_INT32: { + return getIntBytes(obj); + } + break; + case STI_INT64: { + return getIntBytes(obj); + } + // LCOV_EXCL_STOP + break; case STI_UINT256: { auto const* uint256Obj(static_cast(obj)); auto const& data = uint256Obj->value(); @@ -135,7 +153,7 @@ locateField(STObject const& obj, Slice const& locator) auto const& knownSFields = SField::getKnownCodeToField(); { - int32_t const sfieldCode = locPtr[0]; + int32_t const sfieldCode = adjustWasmEndianess(locPtr[0]); auto const it = knownSFields.find(sfieldCode); if (it == knownSFields.end()) return Unexpected(HostFunctionError::INVALID_FIELD); @@ -148,7 +166,7 @@ locateField(STObject const& obj, Slice const& locator) for (int i = 1; i < locSize; ++i) { - int32_t const sfieldCode = locPtr[i]; + int32_t const sfieldCode = adjustWasmEndianess(locPtr[i]); if (STI_ARRAY == field->getSType()) { diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 8910f22aa13..da768ff6eb2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -77,6 +77,7 @@ getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) memcpy(&x, r->data(), sizeof(uint64_t)); else x = *reinterpret_cast(r->data()); + x = adjustWasmEndianess(x); return x; } @@ -290,7 +291,7 @@ returnResult( } else if constexpr (std::is_same_v) { - auto const resultValue = res.value(); + auto const resultValue = adjustWasmEndianess(res.value()); return hfResult( results, setData( From c1c1b4ea674a2e925e8071bf9a0620e0be39d507 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 27 Jan 2026 16:30:51 -0500 Subject: [PATCH 166/212] Reject non-canonical binaries (#6277) * Reject non-canonical binaries * Review fixes * Cleanup Number2 class * Use enum instead of 0 --- src/test/app/HostFuncImpl_test.cpp | 44 ++++--- src/xrpld/app/wasm/HostFuncImpl.h | 8 +- .../app/wasm/detail/HostFuncImplFloat.cpp | 114 ++++++++++-------- 3 files changed, 95 insertions(+), 71 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 80dcd2970d2..5c9aa54dc8f 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2411,6 +2411,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { testcase("floatSet"); using namespace test::jtx; + using namespace wasm_float; Env env{*this}; OpenView ov{*env.current()}; @@ -2435,7 +2436,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = - hfs.floatSet(1, wasm_float::maxExponent + normalExp + 1, 0); + hfs.floatSet(1, wasmMaxExponent + normalExp + 1, 0); BEAST_EXPECT(!result) && BEAST_EXPECT( result.error() == @@ -2444,46 +2445,35 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = - hfs.floatSet(1, wasm_float::maxExponent + normalExp + 1, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); - } - - { - auto const result = - hfs.floatSet(1, wasm_float::minExponent + normalExp - 1, 0); + hfs.floatSet(1, wasmMinExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } { - auto const result = - hfs.floatSet(1, wasm_float::maxExponent + normalExp, 0); + auto const result = hfs.floatSet(1, wasmMaxExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); } { auto const result = - hfs.floatSet(-1, wasm_float::maxExponent + normalExp, 0); + hfs.floatSet(-1, wasmMaxExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); } { auto const result = - hfs.floatSet(1, wasm_float::maxExponent + normalExp - 1, 0); + hfs.floatSet(1, wasmMaxExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); } { auto const result = - hfs.floatSet(STAmount::cMaxValue, wasm_float::maxExponent, 0); + hfs.floatSet(STAmount::cMaxValue, wasmMaxExponent, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); } { - auto const result = - hfs.floatSet(1, wasm_float::minExponent + normalExp, 0); + auto const result = hfs.floatSet(1, wasmMinExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinExp); } @@ -3077,7 +3067,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } void - testFloatNonIOU() + testFloatSpecialCases() { testcase("float Xrp+Mpt"); using namespace test::jtx; @@ -3136,6 +3126,20 @@ struct HostFuncImpl_test : public beast::unit_test::suite !result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } + + testcase("float non-canonical"); + + { // non-canonical mantissa 10 000 000 000 000 000 + Bytes x = float1; + *reinterpret_cast(x.data()) = 0x0000C16FF286A3D4ull; + { + auto const result = + hfs.floatCompare(makeSlice(x), makeSlice(float1)); + BEAST_EXPECT( + !result && + result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + } + } } void @@ -3153,7 +3157,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite testFloatRoot(); testFloatPower(); testFloatLog(); - testFloatNonIOU(); + testFloatSpecialCases(); } void diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 26c55328db6..4acdc85dfb1 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -293,10 +293,10 @@ class WasmHostFunctionsImpl : public HostFunctions namespace wasm_float { // The range for the mantissa and exponent when normalized -static std::int64_t constexpr minMantissa = 1'000'000'000'000'000ll; -static std::int64_t constexpr maxMantissa = (1ull << 54) - 1; -static int constexpr minExponent = -96; -static int constexpr maxExponent = 80; +static std::int64_t constexpr wasmMinMantissa = 1'000'000'000'000'000ll; +static std::int64_t constexpr wasmMaxMantissa = wasmMinMantissa * 10 - 1; +static int constexpr wasmMinExponent = -96; +static int constexpr wasmMaxExponent = 80; } // namespace wasm_float diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index d0f8f1e8e95..29a0dd545f2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -16,17 +16,25 @@ namespace detail { class Number2 : public Number { protected: - static Bytes const FLOAT_NULL; + static Bytes const floatNull; + static unsigned constexpr encodedFloatSize = 8; + static int32_t constexpr encodedMantissaBits = 54; + static int32_t constexpr encodedExponentBits = 8; + + static_assert(wasmMinExponent < 0); + + static uint64_t constexpr maxEncodedMantissa = + (1ull << (encodedMantissaBits + 1)) - 1; bool good_; public: Number2(Slice const& data) : Number(), good_(false) { - if (data.size() != 8) + if (data.size() != encodedFloatSize) return; - if (std::ranges::equal(FLOAT_NULL, data)) + if (std::ranges::equal(floatNull, data)) { good_ = true; return; @@ -36,45 +44,53 @@ class Number2 : public Number if (!(v & STAmount::cIssuedCurrency)) return; - int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; - int32_t const e = static_cast((v >> (64 - 10)) & 0xFFull); - if (e < 1 || e > 177) + int32_t const e = + static_cast((v >> encodedMantissaBits) & 0xFFull); + int32_t const decodedExponent = e + wasmMinExponent - 1; // e - 97 + if (decodedExponent < wasmMinExponent || + decodedExponent > wasmMaxExponent) return; - int64_t const m = neg * static_cast(v & ((1ull << 54) - 1)); + int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int64_t const m = + neg * static_cast(v & ((1ull << encodedMantissaBits) - 1)); if (!m) return; - Number x(makeNumber(m, e + wasm_float::minExponent - 1)); + Number x(makeNumber(m, decodedExponent)); + if (m != x.mantissa() || decodedExponent != x.exponent()) + return; // not canonical *static_cast(this) = x; + good_ = true; } - Number2() : Number(), good_(true) + template + Number2(T mantissa = 0, int32_t exponent = 0) : Number(), good_(false) { - } + if (!mantissa) + { + good_ = true; + return; + } - Number2(int64_t x) : Number(makeNumber(x, 0)), good_(true) - { - } + auto const n = makeNumber(mantissa, exponent); + auto const e = n.exponent(); + if (e < wasmMinExponent) + { + good_ = true; // value is zero(as in Numbers behavior) + return; + } - Number2(uint64_t x) : Number(0), good_(false) - { - using mtype = std::invoke_result_t; - if (x <= std::numeric_limits::max()) - *this = makeNumber(x, 0); - else - *this = makeNumber(x / 10, 1); - good_ = true; - } + if (e > wasmMaxExponent) + return; - Number2(int64_t mantissa, int32_t exponent) - : Number(makeNumber(mantissa, exponent)), good_(true) - { + *static_cast(this) = n; + good_ = true; } Number2(Number const& n) - : Number(makeNumber(n.mantissa(), n.exponent())), good_(true) + : Number2(n.mantissa(), n.exponent()) // ensure Number canonized { } @@ -100,35 +116,33 @@ class Number2 : public Number Expected toBytes() const { - uint64_t v = mantissa() >= 0 ? STAmount::cPositive : 0; + if (!good_) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + + auto const m = mantissa(); + auto const e = exponent(); + + uint64_t v = m >= 0 ? STAmount::cPositive : 0; v |= STAmount::cIssuedCurrency; - uint64_t const absM = mantissa() >= 0 ? mantissa() : -mantissa(); + uint64_t const absM = std::abs(m); if (!absM) { - using etype = - std::invoke_result_t; - if (exponent() != std::numeric_limits::lowest()) - { - return Unexpected( - HostFunctionError:: - FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE - } - return FLOAT_NULL; + return floatNull; } - else if (absM > wasm_float::maxMantissa) + else if (absM > maxEncodedMantissa) { return Unexpected( HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } - else if (exponent() > wasm_float::maxExponent) - return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (exponent() < wasm_float::minExponent) - return FLOAT_NULL; - - int const e = exponent() - wasm_float::minExponent + 1; //+97 v |= absM; - v |= ((uint64_t)e) << 54; + + if (e > wasmMaxExponent) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); + else if (e < wasmMinExponent) + return floatNull; + uint64_t const normExp = e - wasmMinExponent + 1; //+97 + v |= normExp << encodedMantissaBits; Serializer msg; msg.add64(v); @@ -147,7 +161,7 @@ class Number2 : public Number } }; -Bytes const Number2::FLOAT_NULL = +Bytes const Number2::floatNull = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; struct FloatState @@ -187,6 +201,8 @@ struct FloatState std::string floatToString(Slice const& data) { + // set default mode as we don't expect it will be used here + detail::FloatState rm(Number::rounding_mode::to_nearest); detail::Number2 const num(data); if (!num) { @@ -251,6 +267,8 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::Number2 num(mantissa, exponent); + if (!num) + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); return num.toBytes(); } catch (...) @@ -264,6 +282,8 @@ floatCompareImpl(Slice const& x, Slice const& y) { try { + // set default mode as we don't expect it will be used here + detail::FloatState rm(Number::rounding_mode::to_nearest); detail::Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); @@ -416,7 +436,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) { try { - if ((n < 0) || (n > wasm_float::maxExponent)) + if ((n < 0) || (n > wasmMaxExponent)) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); detail::FloatState rm(mode); From 803a344c65361607c18badede43b36eac9c4f43f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 Jan 2026 16:35:02 -0500 Subject: [PATCH 167/212] fix clang-format --- src/test/app/HostFuncImpl_test.cpp | 1132 +++++------------ src/test/app/TestHostFunctions.h | 106 +- src/test/app/Wasm_test.cpp | 323 ++--- src/test/app/wasm_fixtures/b58.c | 3 +- src/test/app/wasm_fixtures/fixtures.cpp | 9 +- src/test/app/wasm_fixtures/sha512Pure.c | 48 +- src/test/basics/Number_test.cpp | 22 +- src/xrpld/app/wasm/HostFunc.h | 24 +- src/xrpld/app/wasm/HostFuncImpl.h | 38 +- src/xrpld/app/wasm/HostFuncWrapper.h | 543 ++------ src/xrpld/app/wasm/ParamsHelper.h | 46 +- src/xrpld/app/wasm/WasmiVM.h | 86 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 5 +- .../app/wasm/detail/HostFuncImplFloat.cpp | 50 +- .../app/wasm/detail/HostFuncImplGetter.cpp | 18 +- .../app/wasm/detail/HostFuncImplKeylet.cpp | 46 +- .../app/wasm/detail/HostFuncImplTrace.cpp | 25 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 592 ++------- src/xrpld/app/wasm/detail/WasmVM.cpp | 20 +- src/xrpld/app/wasm/detail/WasmiVM.cpp | 192 +-- 20 files changed, 870 insertions(+), 2458 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 5c9aa54dc8f..811166c0138 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -71,16 +71,12 @@ createApplyContext( beast::Journal j, STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) { - ApplyContext ac{ - env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, j}; + ApplyContext ac{env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, j}; return ac; } static ApplyContext -createApplyContext( - test::jtx::Env& env, - OpenView& ov, - STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) +createApplyContext(test::jtx::Env& env, OpenView& ov, STTx const& tx = STTx(ttESCROW_FINISH, [](STObject&) {})) { return createApplyContext(env, ov, env.journal, tx); } @@ -96,8 +92,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const result = hfs.getLedgerSqn(); @@ -112,8 +107,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); { OpenView ov{*env.current()}; @@ -121,24 +115,16 @@ struct HostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const result = hfs.getParentLedgerTime(); if (BEAST_EXPECT(result.has_value())) - BEAST_EXPECT( - result.value() == - env.current() - ->parentCloseTime() - .time_since_epoch() - .count()); + BEAST_EXPECT(result.value() == env.current()->parentCloseTime().time_since_epoch().count()); } - env.close( - env.now() + - std::chrono::seconds(std::numeric_limits::max() - 1)); + env.close(env.now() + std::chrono::seconds(std::numeric_limits::max() - 1)); { OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const result = hfs.getParentLedgerTime(); - if (BEAST_EXPECTS( - !result.has_value(), std::to_string(result.value()))) + if (BEAST_EXPECTS(!result.has_value(), std::to_string(result.value()))) BEAST_EXPECT(result.error() == HostFunctionError::INTERNAL); } } @@ -152,8 +138,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); @@ -171,8 +156,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); @@ -184,10 +168,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env2( *this, envconfig([](std::unique_ptr cfg) { - cfg->FEES.reference_fee = - static_cast( - std::numeric_limits::max()) + - 1; + cfg->FEES.reference_fee = static_cast(std::numeric_limits::max()) + 1; return cfg; }), testable_amendments()); @@ -215,8 +196,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Use featureTokenEscrow for testing @@ -268,15 +248,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite { WasmHostFunctionsImpl hfs(ac, dummyEscrow); - BEAST_EXPECT( - hfs.cacheLedgerObj(accountKeylet.key, -1).error() == - HostFunctionError::SLOT_OUT_RANGE); - BEAST_EXPECT( - hfs.cacheLedgerObj(accountKeylet.key, 257).error() == - HostFunctionError::SLOT_OUT_RANGE); - BEAST_EXPECT( - hfs.cacheLedgerObj(dummyEscrow.key, 0).error() == - HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, -1).error() == HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 257).error() == HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT(hfs.cacheLedgerObj(dummyEscrow.key, 0).error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).value() == 1); for (int i = 1; i <= 256; ++i) @@ -284,9 +258,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.cacheLedgerObj(accountKeylet.key, i); BEAST_EXPECT(result.has_value() && result.value() == i); } - BEAST_EXPECT( - hfs.cacheLedgerObj(accountKeylet.key, 0).error() == - HostFunctionError::SLOTS_FULL); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).error() == HostFunctionError::SLOTS_FULL); } { @@ -297,9 +269,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.cacheLedgerObj(accountKeylet.key, 0); BEAST_EXPECT(result.has_value() && result.value() == i); } - BEAST_EXPECT( - hfs.cacheLedgerObj(accountKeylet.key, 0).error() == - HostFunctionError::SLOTS_FULL); + BEAST_EXPECT(hfs.cacheLedgerObj(accountKeylet.key, 0).error() == HostFunctionError::SLOTS_FULL); } } @@ -309,8 +279,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("getTxField"); using namespace test::jtx; - std::string const credIdHex = - "0011223344556677889900112233445566778899001122334455667788990011"; + std::string const credIdHex = "0011223344556677889900112233445566778899001122334455667788990011"; uint256 credId; BEAST_EXPECT(credId.parseHex(credIdHex)); @@ -326,14 +295,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setFieldV256(sfCredentialIDs, credIds); }); ApplyContext ac = createApplyContext(env, ov, stx); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); { WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const account = hfs.getTxField(sfAccount); - BEAST_EXPECT( - account && std::ranges::equal(*account, env.master.id())); + BEAST_EXPECT(account && std::ranges::equal(*account, env.master.id())); auto const owner = hfs.getTxField(sfOwner); BEAST_EXPECT(owner && std::ranges::equal(*owner, env.master.id())); @@ -346,13 +313,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const notPresent = hfs.getTxField(sfDestination); if (BEAST_EXPECT(!notPresent.has_value())) - BEAST_EXPECT( - notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); auto const memos = hfs.getTxField(sfMemos); if (BEAST_EXPECT(!memos.has_value())) - BEAST_EXPECT( - memos.error() == HostFunctionError::NOT_LEAF_FIELD); + BEAST_EXPECT(memos.error() == HostFunctionError::NOT_LEAF_FIELD); auto const credentialIds = hfs.getTxField(sfCredentialIDs); if (BEAST_EXPECT(!credentialIds.has_value())) @@ -362,13 +327,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const nonField = hfs.getTxField(sfInvalid); if (BEAST_EXPECT(!nonField.has_value())) - BEAST_EXPECT( - nonField.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(nonField.error() == HostFunctionError::FIELD_NOT_FOUND); auto const nonField2 = hfs.getTxField(sfGeneric); if (BEAST_EXPECT(!nonField2.has_value())) - BEAST_EXPECT( - nonField2.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(nonField2.error() == HostFunctionError::FIELD_NOT_FOUND); } { @@ -376,8 +339,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite STTx const stx2 = STTx(ttAMM_DEPOSIT, [&](auto& obj) { obj.setAccountID(sfAccount, env.master.id()); obj.setFieldIssue(sfAsset, STIssue{sfAsset, xrpIssue()}); - obj.setFieldIssue( - sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); + obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); }); ApplyContext ac2 = createApplyContext(env, ov, stx2); WasmHostFunctionsImpl hfs(ac2, dummyEscrow); @@ -426,8 +388,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const actualScale = hfs.getTxField(sfAssetScale); if (BEAST_EXPECT(actualScale.has_value())) { - BEAST_EXPECT( - std::ranges::equal(*actualScale, toBytes(expectedScale))); + BEAST_EXPECT(std::ranges::equal(*actualScale, toBytes(expectedScale))); } } } @@ -442,25 +403,21 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; // Fund the account and create an escrow so the ledger object exists - env(escrow::create(env.master, env.master, XRP(100)), - escrow::finish_time(env.now() + 1s)); + env(escrow::create(env.master, env.master, XRP(100)), escrow::finish_time(env.now() + 1s)); env.close(); OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); // Find the escrow ledger object - auto const escrowKeylet = - keylet::escrow(env.master, env.seq(env.master) - 1); + auto const escrowKeylet = keylet::escrow(env.master, env.seq(env.master) - 1); BEAST_EXPECT(env.le(escrowKeylet)); WasmHostFunctionsImpl hfs(ac, escrowKeylet); // Should return the Account field from the escrow ledger object auto const account = hfs.getCurrentLedgerObjField(sfAccount); - if (BEAST_EXPECTS( - account.has_value(), - std::to_string(static_cast(account.error())))) + if (BEAST_EXPECTS(account.has_value(), std::to_string(static_cast(account.error())))) BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Amount field from the escrow ledger object @@ -471,29 +428,23 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Should return the PreviousTxnID field from the escrow ledger object - auto const previousTxnId = - hfs.getCurrentLedgerObjField(sfPreviousTxnID); + auto const previousTxnId = hfs.getCurrentLedgerObjField(sfPreviousTxnID); if (BEAST_EXPECT(previousTxnId.has_value())) { - BEAST_EXPECT( - *previousTxnId == toBytes(env.tx()->getTransactionID())); + BEAST_EXPECT(*previousTxnId == toBytes(env.tx()->getTransactionID())); } // Should return nullopt for a field not present auto const notPresent = hfs.getCurrentLedgerObjField(sfOwner); - BEAST_EXPECT( - !notPresent.has_value() && - notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(!notPresent.has_value() && notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); { - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master) + 5); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); WasmHostFunctionsImpl hfs2(ac, dummyEscrow); auto const account = hfs2.getCurrentLedgerObjField(sfAccount); if (BEAST_EXPECT(!account.has_value())) { - BEAST_EXPECT( - account.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(account.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } } } @@ -507,16 +458,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; // Fund the account and create an escrow so the ledger object exists - env(escrow::create(env.master, env.master, XRP(100)), - escrow::finish_time(env.now() + 1s)); + env(escrow::create(env.master, env.master, XRP(100)), escrow::finish_time(env.now() + 1s)); env.close(); OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const accountKeylet = keylet::account(env.master.id()); - auto const escrowKeylet = - keylet::escrow(env.master.id(), env.seq(env.master) - 1); + auto const escrowKeylet = keylet::escrow(env.master.id(), env.seq(env.master) - 1); WasmHostFunctionsImpl hfs(ac, escrowKeylet); // Cache the escrow ledger object in slot 1 @@ -525,9 +474,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should return the Account field from the cached ledger object auto const account = hfs.getLedgerObjField(1, sfAccount); - if (BEAST_EXPECTS( - account.has_value(), - std::to_string(static_cast(account.error())))) + if (BEAST_EXPECTS(account.has_value(), std::to_string(static_cast(account.error())))) BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); // Should return the Balance field from the cached ledger object @@ -539,26 +486,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should return error for slot out of range auto const outOfRange = hfs.getLedgerObjField(0, sfAccount); - BEAST_EXPECT( - !outOfRange.has_value() && - outOfRange.error() == HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT(!outOfRange.has_value() && outOfRange.error() == HostFunctionError::SLOT_OUT_RANGE); auto const tooHigh = hfs.getLedgerObjField(257, sfAccount); - BEAST_EXPECT( - !tooHigh.has_value() && - tooHigh.error() == HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT(!tooHigh.has_value() && tooHigh.error() == HostFunctionError::SLOT_OUT_RANGE); // Should return error for empty slot auto const emptySlot = hfs.getLedgerObjField(2, sfAccount); - BEAST_EXPECT( - !emptySlot.has_value() && - emptySlot.error() == HostFunctionError::EMPTY_SLOT); + BEAST_EXPECT(!emptySlot.has_value() && emptySlot.error() == HostFunctionError::EMPTY_SLOT); // Should return error for field not present auto const notPresent = hfs.getLedgerObjField(1, sfOwner); - BEAST_EXPECT( - !notPresent.has_value() && - notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(!notPresent.has_value() && notPresent.error() == HostFunctionError::FIELD_NOT_FOUND); } void @@ -570,8 +509,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; - std::string const credIdHex = - "0011223344556677889900112233445566778899001122334455667788990011"; + std::string const credIdHex = "0011223344556677889900112233445566778899001122334455667788990011"; uint256 credId; BEAST_EXPECT(credId.parseHex(credIdHex)); @@ -589,8 +527,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite }); ApplyContext ac = createApplyContext(env, ov, stx); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); @@ -598,19 +535,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfMemos[0].sfMemo.sfMemoData // Locator is a sequence of int32_t codes: // [sfMemos.fieldCode, 0, sfMemoData.fieldCode] - std::vector locatorVec = { - sfMemos.fieldCode, 0, sfMemoData.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + std::vector locatorVec = {sfMemos.fieldCode, 0, sfMemoData.fieldCode}; + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); - if (BEAST_EXPECTS( - result.has_value(), - std::to_string(static_cast(result.error())))) + if (BEAST_EXPECTS(result.has_value(), std::to_string(static_cast(result.error())))) { - std::string memoData( - result.value().begin(), result.value().end()); + std::string memoData(result.value().begin(), result.value().end()); BEAST_EXPECT(memoData == "hello"); } } @@ -618,17 +549,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite { // Locator for sfCredentialIDs[0] std::vector locatorVec = {sfCredentialIDs.fieldCode, 0}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); - if (BEAST_EXPECTS( - result.has_value(), - std::to_string(static_cast(result.error())))) + if (BEAST_EXPECTS(result.has_value(), std::to_string(static_cast(result.error())))) { - std::string credIdResult( - result.value().begin(), result.value().end()); + std::string credIdResult(result.value().begin(), result.value().end()); BEAST_EXPECT(strHex(credIdResult) == credIdHex); } } @@ -636,14 +562,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite { // can use the nested locator for base fields too std::vector locatorVec = {sfAccount.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const account = hfs.getTxNestedField(locator); - if (BEAST_EXPECTS( - account.has_value(), - std::to_string(static_cast(account.error())))) + if (BEAST_EXPECTS(account.has_value(), std::to_string(static_cast(account.error())))) { BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); } @@ -652,31 +574,21 @@ struct HostFuncImpl_test : public beast::unit_test::suite { // unaligned locator std::vector locatorVec(sizeof(int32_t) + 1); - memcpy( - locatorVec.data() + 1, &sfAccount.fieldCode, sizeof(int32_t)); - Slice locator( - reinterpret_cast(locatorVec.data() + 1), - sizeof(int32_t)); + memcpy(locatorVec.data() + 1, &sfAccount.fieldCode, sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data() + 1), sizeof(int32_t)); auto const account = hfs.getTxNestedField(locator); - if (BEAST_EXPECTS( - account.has_value(), - std::to_string(static_cast(account.error())))) + if (BEAST_EXPECTS(account.has_value(), std::to_string(static_cast(account.error())))) { BEAST_EXPECT(std::ranges::equal(*account, env.master.id())); } } - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError) { - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError) { + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Locator for non-existent base field expectError( @@ -699,9 +611,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for non-existent nested field expectError( - {sfMemos.fieldCode, - 0, - sfURI.fieldCode}, // sfURI does not exist in the memo + {sfMemos.fieldCode, 0, sfURI.fieldCode}, // sfURI does not exist in the memo HostFunctionError::FIELD_NOT_FOUND); // Locator for non-existent base sfield @@ -722,8 +632,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); // Locator for STVector256 - expectError( - {sfCredentialIDs.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + expectError({sfCredentialIDs.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); // Locator for nesting into non-array/object field expectError( @@ -738,13 +647,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for malformed locator (not multiple of 4) { std::vector locatorVec = {sfMemos.fieldCode}; - Slice malformedLocator( - reinterpret_cast(locatorVec.data()), 3); + Slice malformedLocator(reinterpret_cast(locatorVec.data()), 3); auto const malformedResult = hfs.getTxNestedField(malformedLocator); BEAST_EXPECT( - !malformedResult.has_value() && - malformedResult.error() == - HostFunctionError::LOCATOR_MALFORMED); + !malformedResult.has_value() && malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); } } @@ -772,27 +678,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for base field std::vector baseLocator = {sfSignerQuorum.fieldCode}; Slice baseLocatorSlice( - reinterpret_cast(baseLocator.data()), - baseLocator.size() * sizeof(int32_t)); - auto const signerQuorum = - hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); - if (BEAST_EXPECTS( - signerQuorum.has_value(), - std::to_string(static_cast(signerQuorum.error())))) + reinterpret_cast(baseLocator.data()), baseLocator.size() * sizeof(int32_t)); + auto const signerQuorum = hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); + if (BEAST_EXPECTS(signerQuorum.has_value(), std::to_string(static_cast(signerQuorum.error())))) { BEAST_EXPECT(*signerQuorum == toBytes(static_cast(2))); } - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError) { - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError) { + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getCurrentLedgerObjNestedField(locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Locator for non-existent base field expectError( @@ -802,40 +699,28 @@ struct HostFuncImpl_test : public beast::unit_test::suite HostFunctionError::FIELD_NOT_FOUND); // Locator for nesting into non-array/object field expectError( - {sfSignerQuorum - .fieldCode, // sfSignerQuorum is not an array or object + {sfSignerQuorum.fieldCode, // sfSignerQuorum is not an array or object 0, sfAccount.fieldCode}, HostFunctionError::LOCATOR_MALFORMED); // Locator for empty locator Slice emptyLocator(nullptr, 0); - auto const emptyResult = - hfs.getCurrentLedgerObjNestedField(emptyLocator); - BEAST_EXPECT( - !emptyResult.has_value() && - emptyResult.error() == HostFunctionError::LOCATOR_MALFORMED); + auto const emptyResult = hfs.getCurrentLedgerObjNestedField(emptyLocator); + BEAST_EXPECT(!emptyResult.has_value() && emptyResult.error() == HostFunctionError::LOCATOR_MALFORMED); // Locator for malformed locator (not multiple of 4) std::vector malformedLocatorVec = {sfMemos.fieldCode}; - Slice malformedLocator( - reinterpret_cast(malformedLocatorVec.data()), 3); - auto const malformedResult = - hfs.getCurrentLedgerObjNestedField(malformedLocator); - BEAST_EXPECT( - !malformedResult.has_value() && - malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); + Slice malformedLocator(reinterpret_cast(malformedLocatorVec.data()), 3); + auto const malformedResult = hfs.getCurrentLedgerObjNestedField(malformedLocator); + BEAST_EXPECT(!malformedResult.has_value() && malformedResult.error() == HostFunctionError::LOCATOR_MALFORMED); { - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master) + 5); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); std::vector const locatorVec = {sfAccount.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); - auto const result = - dummyHfs.getCurrentLedgerObjNestedField(locator); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); + auto const result = dummyHfs.getCurrentLedgerObjNestedField(locator); if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECTS( result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, @@ -859,8 +744,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Cache the SignerList ledger object in slot 1 @@ -870,16 +754,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries[0].sfAccount { - std::vector const locatorVec = { - sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + std::vector const locatorVec = {sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getLedgerObjNestedField(1, locator); - if (BEAST_EXPECTS( - result.has_value(), - std::to_string(static_cast(result.error())))) + if (BEAST_EXPECTS(result.has_value(), std::to_string(static_cast(result.error())))) { BEAST_EXPECT(std::ranges::equal(*result, alice.id())); } @@ -887,15 +766,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries[1].sfAccount { - std::vector const locatorVec = { - sfSignerEntries.fieldCode, 1, sfAccount.fieldCode}; - Slice const locator = Slice( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + std::vector const locatorVec = {sfSignerEntries.fieldCode, 1, sfAccount.fieldCode}; + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result2 = hfs.getLedgerObjNestedField(1, locator); - if (BEAST_EXPECTS( - result2.has_value(), - std::to_string(static_cast(result2.error())))) + if (BEAST_EXPECTS(result2.has_value(), std::to_string(static_cast(result2.error())))) { BEAST_EXPECT(std::ranges::equal(*result2, becky.id())); } @@ -903,15 +778,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries[0].sfSignerWeight { - std::vector const locatorVec = { - sfSignerEntries.fieldCode, 0, sfSignerWeight.fieldCode}; - Slice const locator = Slice( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + std::vector const locatorVec = {sfSignerEntries.fieldCode, 0, sfSignerWeight.fieldCode}; + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const weightResult = hfs.getLedgerObjNestedField(1, locator); - if (BEAST_EXPECTS( - weightResult.has_value(), - std::to_string(static_cast(weightResult.error())))) + if (BEAST_EXPECTS(weightResult.has_value(), std::to_string(static_cast(weightResult.error())))) { // Should be 1 auto const expected = toBytes(static_cast(1)); @@ -922,13 +793,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for base field sfSignerQuorum { std::vector const locatorVec = {sfSignerQuorum.fieldCode}; - Slice const locator = Slice( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice const locator = + Slice(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const quorumResult = hfs.getLedgerObjNestedField(1, locator); - if (BEAST_EXPECTS( - quorumResult.has_value(), - std::to_string(static_cast(quorumResult.error())))) + if (BEAST_EXPECTS(quorumResult.has_value(), std::to_string(static_cast(quorumResult.error())))) { auto const expected = toBytes(static_cast(2)); BEAST_EXPECT(*quorumResult == expected); @@ -936,17 +804,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Helper for error checks - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError, - int slot = 1) { + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError, int slot = 1) { Slice const locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getLedgerObjNestedField(slot, locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Error: base field not found @@ -973,45 +836,32 @@ struct HostFuncImpl_test : public beast::unit_test::suite HostFunctionError::FIELD_NOT_FOUND); // Error: invalid field code - expectError( - {field_code(99999, 99999), 0, sfAccount.fieldCode}, - HostFunctionError::INVALID_FIELD); + expectError({field_code(99999, 99999), 0, sfAccount.fieldCode}, HostFunctionError::INVALID_FIELD); // Error: invalid nested field code - expectError( - {sfSignerEntries.fieldCode, 0, field_code(99999, 99999)}, - HostFunctionError::INVALID_FIELD); + expectError({sfSignerEntries.fieldCode, 0, field_code(99999, 99999)}, HostFunctionError::INVALID_FIELD); // Error: slot out of range - expectError( - {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 0); - expectError( - {sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 257); + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 0); + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::SLOT_OUT_RANGE, 257); // Error: empty slot - expectError( - {sfSignerQuorum.fieldCode}, HostFunctionError::EMPTY_SLOT, 2); + expectError({sfSignerQuorum.fieldCode}, HostFunctionError::EMPTY_SLOT, 2); // Error: locator for STArray (not leaf field) - expectError( - {sfSignerEntries.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); + expectError({sfSignerEntries.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); // Error: nesting into non-array/object field - expectError( - {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, - HostFunctionError::LOCATOR_MALFORMED); + expectError({sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, HostFunctionError::LOCATOR_MALFORMED); // Error: empty locator expectError({}, HostFunctionError::LOCATOR_MALFORMED); // Error: locator malformed (not multiple of 4) std::vector const locatorVec = {sfSignerEntries.fieldCode}; - Slice const locator = - Slice(reinterpret_cast(locatorVec.data()), 3); + Slice const locator = Slice(reinterpret_cast(locatorVec.data()), 3); auto const malformed = hfs.getLedgerObjNestedField(1, locator); - BEAST_EXPECT( - !malformed.has_value() && - malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + BEAST_EXPECT(!malformed.has_value() && malformed.error() == HostFunctionError::LOCATOR_MALFORMED); } void @@ -1020,8 +870,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite testcase("getTxArrayLen"); using namespace test::jtx; - std::string const credIdHex = - "0011223344556677889900112233445566778899001122334455667788990011"; + std::string const credIdHex = "0011223344556677889900112233445566778899001122334455667788990011"; uint256 credId; BEAST_EXPECT(credId.parseHex(credIdHex)); @@ -1049,8 +898,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite }); ApplyContext ac = createApplyContext(env, ov, stx); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Should return 1 for sfMemos @@ -1066,8 +914,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should return error for missing array field auto const missingArray = hfs.getTxArrayLen(sfSigners); if (BEAST_EXPECT(!missingArray.has_value())) - BEAST_EXPECT( - missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); // Should return 1 for sfCredentialIDs auto const credIdsLen = hfs.getTxArrayLen(sfCredentialIDs); @@ -1094,8 +941,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const signerKeylet = keylet::signers(env.master.id()); WasmHostFunctionsImpl hfs(ac, signerKeylet); - auto const entriesLen = - hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); + auto const entriesLen = hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); if (BEAST_EXPECT(entriesLen.has_value())) BEAST_EXPECT(entriesLen.value() == 2); @@ -1109,13 +955,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(notArray.error() == HostFunctionError::NO_ARRAY); { - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master) + 5); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); auto const len = dummyHfs.getCurrentLedgerObjArrayLen(sfMemos); if (BEAST_EXPECT(!len.has_value())) - BEAST_EXPECT( - len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } } @@ -1135,8 +979,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const signerListKeylet = keylet::signers(env.master.id()); @@ -1152,8 +995,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const arrLen = hfs.getLedgerObjArrayLen(0, sfSignerEntries); if (BEAST_EXPECT(!arrLen.has_value())) - BEAST_EXPECT( - arrLen.error() == HostFunctionError::SLOT_OUT_RANGE); + BEAST_EXPECT(arrLen.error() == HostFunctionError::SLOT_OUT_RANGE); } { @@ -1167,16 +1009,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should return error for empty slot auto const emptySlot = hfs.getLedgerObjArrayLen(2, sfSignerEntries); if (BEAST_EXPECT(!emptySlot.has_value())) - BEAST_EXPECT( - emptySlot.error() == HostFunctionError::EMPTY_SLOT); + BEAST_EXPECT(emptySlot.error() == HostFunctionError::EMPTY_SLOT); } { // Should return error for missing array field auto const missingArray = hfs.getLedgerObjArrayLen(1, sfMemos); if (BEAST_EXPECT(!missingArray.has_value())) - BEAST_EXPECT( - missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(missingArray.error() == HostFunctionError::FIELD_NOT_FOUND); } } @@ -1198,30 +1038,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite }); ApplyContext ac = createApplyContext(env, ov, stx); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Helper for error checks - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError, - int slot = 1) { + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError, int slot = 1) { Slice const locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Locator for sfMemos { std::vector locatorVec = {sfMemos.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getTxNestedArrayLen(locator); BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 1); } @@ -1253,25 +1085,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, signerKeylet); // Helper for error checks - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError, - int slot = 1) { + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError, int slot = 1) { Slice const locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getCurrentLedgerObjNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Locator for sfSignerEntries { std::vector locatorVec = {sfSignerEntries.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getCurrentLedgerObjNestedArrayLen(locator); BEAST_EXPECT(arrLen.has_value() && arrLen.value() == 2); } @@ -1283,15 +1108,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite expectError({sfSigners.fieldCode}, HostFunctionError::FIELD_NOT_FOUND); { - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master) + 5); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); std::vector locatorVec = {sfAccount.fieldCode}; Slice const locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); - auto const result = - dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); + reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); + auto const result = dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) BEAST_EXPECTS( result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, @@ -1314,8 +1136,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const signerListKeylet = keylet::signers(env.master.id()); @@ -1324,25 +1145,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries std::vector locatorVec = {sfSignerEntries.fieldCode}; - Slice locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + Slice locator(reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getLedgerObjNestedArrayLen(1, locator); if (BEAST_EXPECT(arrLen.has_value())) BEAST_EXPECT(arrLen.value() == 2); // Helper for error checks - auto expectError = [&](std::vector const& locatorVec, - HostFunctionError expectedError, - int slot = 1) { + auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError, int slot = 1) { Slice const locator( - reinterpret_cast(locatorVec.data()), - locatorVec.size() * sizeof(int32_t)); + reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getLedgerObjNestedArrayLen(slot, locator); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECTS( - result.error() == expectedError, - std::to_string(static_cast(result.error()))); + BEAST_EXPECTS(result.error() == expectedError, std::to_string(static_cast(result.error()))); }; // Error: non-array field @@ -1362,18 +1176,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite expectError({}, HostFunctionError::LOCATOR_MALFORMED); // Error: locator malformed (not multiple of 4) - Slice malformedLocator( - reinterpret_cast(locator.data()), 3); - auto const malformed = - hfs.getLedgerObjNestedArrayLen(1, malformedLocator); - BEAST_EXPECT( - !malformed.has_value() && - malformed.error() == HostFunctionError::LOCATOR_MALFORMED); + Slice malformedLocator(reinterpret_cast(locator.data()), 3); + auto const malformed = hfs.getLedgerObjNestedArrayLen(1, malformedLocator); + BEAST_EXPECT(!malformed.has_value() && malformed.error() == HostFunctionError::LOCATOR_MALFORMED); // Error: locator for non-STArray field - expectError( - {sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, - HostFunctionError::LOCATOR_MALFORMED); + expectError({sfSignerQuorum.fieldCode, 0, sfAccount.fieldCode}, HostFunctionError::LOCATOR_MALFORMED); } void @@ -1383,15 +1191,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - env(escrow::create(env.master, env.master, XRP(100)), - escrow::finish_time(env.now() + std::chrono::seconds(1))); + env(escrow::create(env.master, env.master, XRP(100)), escrow::finish_time(env.now() + std::chrono::seconds(1))); env.close(); OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const escrowKeylet = - keylet::escrow(env.master, env.seq(env.master) - 1); + auto const escrowKeylet = keylet::escrow(env.master, env.seq(env.master) - 1); WasmHostFunctionsImpl hfs(ac, escrowKeylet); // Should succeed for small data @@ -1401,11 +1207,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should fail for too large data std::vector bigData(maxWasmDataLength + 1, 0x42); - auto const tooBig = - hfs.updateData(Slice(bigData.data(), bigData.size())); + auto const tooBig = hfs.updateData(Slice(bigData.data(), bigData.size())); if (BEAST_EXPECT(!tooBig.has_value())) - BEAST_EXPECT( - tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); + BEAST_EXPECT(tooBig.error() == HostFunctionError::DATA_FIELD_TOO_LARGE); } void @@ -1418,8 +1222,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Generate a keypair and sign a message @@ -1432,9 +1235,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should succeed for valid signature { auto const result = hfs.checkSignature( - Slice(message.data(), message.size()), - Slice(sig.data(), sig.size()), - Slice(pk.data(), pk.size())); + Slice(message.data(), message.size()), Slice(sig.data(), sig.size()), Slice(pk.data(), pk.size())); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == 1); } @@ -1464,9 +1265,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should fail for empty public key { auto const result = hfs.checkSignature( - Slice(message.data(), message.size()), - Slice(sig.data(), sig.size()), - Slice(nullptr, 0)); + Slice(message.data(), message.size()), Slice(sig.data(), sig.size()), Slice(nullptr, 0)); BEAST_EXPECT(!result.has_value()); BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); } @@ -1474,19 +1273,15 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Should fail for empty signature { auto const result = hfs.checkSignature( - Slice(message.data(), message.size()), - Slice(nullptr, 0), - Slice(pk.data(), pk.size())); + Slice(message.data(), message.size()), Slice(nullptr, 0), Slice(pk.data(), pk.size())); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == 0); } // Should fail for empty message { - auto const result = hfs.checkSignature( - Slice(nullptr, 0), - Slice(sig.data(), sig.size()), - Slice(pk.data(), pk.size())); + auto const result = + hfs.checkSignature(Slice(nullptr, 0), Slice(sig.data(), sig.size()), Slice(pk.data(), pk.size())); BEAST_EXPECT(result.has_value()); BEAST_EXPECT(result.value() == 0); } @@ -1502,13 +1297,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string data = "hello world"; - auto const result = - hfs.computeSha512HalfHash(Slice(data.data(), data.size())); + auto const result = hfs.computeSha512HalfHash(Slice(data.data(), data.size())); BEAST_EXPECT(result.has_value()); // Should match direct call to sha512Half @@ -1526,12 +1319,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); - auto compareKeylet = [](std::vector const& bytes, - Keylet const& kl) { + auto compareKeylet = [](std::vector const& bytes, Keylet const& kl) { return std::ranges::equal(bytes, kl.key); }; // Lambda to compare a Bytes (std::vector) to a keylet @@ -1544,37 +1335,24 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(compareKeylet(actual.value(), expected)); \ } \ } -#define COMPARE_KEYLET_FAIL(hfsFunc, expected, ...) \ - { \ - auto actual = hfs.hfsFunc(__VA_ARGS__); \ - if (BEAST_EXPECT(!actual.has_value())) \ - { \ - BEAST_EXPECTS( \ - actual.error() == expected, \ - std::to_string(HfErrorToInt(actual.error()))); \ - } \ +#define COMPARE_KEYLET_FAIL(hfsFunc, expected, ...) \ + { \ + auto actual = hfs.hfsFunc(__VA_ARGS__); \ + if (BEAST_EXPECT(!actual.has_value())) \ + { \ + BEAST_EXPECTS(actual.error() == expected, std::to_string(HfErrorToInt(actual.error()))); \ + } \ } COMPARE_KEYLET(accountKeylet, keylet::account, env.master.id()); - COMPARE_KEYLET_FAIL( - accountKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + COMPARE_KEYLET_FAIL(accountKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); - COMPARE_KEYLET( - ammKeylet, keylet::amm, xrpIssue(), env.master["USD"].issue()); - COMPARE_KEYLET_FAIL( - ammKeylet, - HostFunctionError::INVALID_PARAMS, - xrpIssue(), - xrpIssue()); - COMPARE_KEYLET_FAIL( - ammKeylet, - HostFunctionError::INVALID_PARAMS, - makeMptID(1, env.master.id()), - xrpIssue()); + COMPARE_KEYLET(ammKeylet, keylet::amm, xrpIssue(), env.master["USD"].issue()); + COMPARE_KEYLET_FAIL(ammKeylet, HostFunctionError::INVALID_PARAMS, xrpIssue(), xrpIssue()); + COMPARE_KEYLET_FAIL(ammKeylet, HostFunctionError::INVALID_PARAMS, makeMptID(1, env.master.id()), xrpIssue()); COMPARE_KEYLET(checkKeylet, keylet::check, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - checkKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(checkKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); std::string const credType = "test"; COMPARE_KEYLET( @@ -1609,79 +1387,28 @@ struct HostFuncImpl_test : public beast::unit_test::suite Slice(credType.data(), credType.size())); COMPARE_KEYLET(didKeylet, keylet::did, env.master.id()); - COMPARE_KEYLET_FAIL( - didKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + COMPARE_KEYLET_FAIL(didKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); - COMPARE_KEYLET( - delegateKeylet, keylet::delegate, env.master.id(), alice.id()); - COMPARE_KEYLET_FAIL( - delegateKeylet, - HostFunctionError::INVALID_PARAMS, - env.master.id(), - env.master.id()); - COMPARE_KEYLET_FAIL( - delegateKeylet, - HostFunctionError::INVALID_ACCOUNT, - env.master.id(), - xrpAccount()); - COMPARE_KEYLET_FAIL( - delegateKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - env.master.id()); + COMPARE_KEYLET(delegateKeylet, keylet::delegate, env.master.id(), alice.id()); + COMPARE_KEYLET_FAIL(delegateKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); + COMPARE_KEYLET_FAIL(delegateKeylet, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); + COMPARE_KEYLET_FAIL(delegateKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); - COMPARE_KEYLET( - depositPreauthKeylet, - keylet::depositPreauth, - env.master.id(), - alice.id()); - COMPARE_KEYLET_FAIL( - depositPreauthKeylet, - HostFunctionError::INVALID_PARAMS, - env.master.id(), - env.master.id()); - COMPARE_KEYLET_FAIL( - depositPreauthKeylet, - HostFunctionError::INVALID_ACCOUNT, - env.master.id(), - xrpAccount()); - COMPARE_KEYLET_FAIL( - depositPreauthKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - env.master.id()); + COMPARE_KEYLET(depositPreauthKeylet, keylet::depositPreauth, env.master.id(), alice.id()); + COMPARE_KEYLET_FAIL(depositPreauthKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id()); + COMPARE_KEYLET_FAIL(depositPreauthKeylet, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount()); + COMPARE_KEYLET_FAIL(depositPreauthKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id()); COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); Currency usd = to_currency("USD"); - COMPARE_KEYLET( - lineKeylet, keylet::line, env.master.id(), alice.id(), usd); - COMPARE_KEYLET_FAIL( - lineKeylet, - HostFunctionError::INVALID_PARAMS, - env.master.id(), - env.master.id(), - usd); + COMPARE_KEYLET(lineKeylet, keylet::line, env.master.id(), alice.id(), usd); + COMPARE_KEYLET_FAIL(lineKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), usd); + COMPARE_KEYLET_FAIL(lineKeylet, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), usd); + COMPARE_KEYLET_FAIL(lineKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), usd); COMPARE_KEYLET_FAIL( - lineKeylet, - HostFunctionError::INVALID_ACCOUNT, - env.master.id(), - xrpAccount(), - usd); - COMPARE_KEYLET_FAIL( - lineKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - env.master.id(), - usd); - COMPARE_KEYLET_FAIL( - lineKeylet, - HostFunctionError::INVALID_PARAMS, - env.master.id(), - alice.id(), - to_currency("")); + lineKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), alice.id(), to_currency("")); { auto actual = hfs.mptIssuanceKeylet(env.master.id(), 1); @@ -1694,81 +1421,39 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto actual = hfs.mptIssuanceKeylet(xrpAccount(), 1); if (BEAST_EXPECT(!actual.has_value())) - BEAST_EXPECT( - actual.error() == HostFunctionError::INVALID_ACCOUNT); + BEAST_EXPECT(actual.error() == HostFunctionError::INVALID_ACCOUNT); } auto const sampleMPTID = makeMptID(1, env.master.id()); COMPARE_KEYLET(mptokenKeylet, keylet::mptoken, sampleMPTID, alice.id()); - COMPARE_KEYLET_FAIL( - mptokenKeylet, - HostFunctionError::INVALID_PARAMS, - MPTID{}, - alice.id()); - COMPARE_KEYLET_FAIL( - mptokenKeylet, - HostFunctionError::INVALID_ACCOUNT, - sampleMPTID, - xrpAccount()); + COMPARE_KEYLET_FAIL(mptokenKeylet, HostFunctionError::INVALID_PARAMS, MPTID{}, alice.id()); + COMPARE_KEYLET_FAIL(mptokenKeylet, HostFunctionError::INVALID_ACCOUNT, sampleMPTID, xrpAccount()); COMPARE_KEYLET(nftOfferKeylet, keylet::nftoffer, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - nftOfferKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + COMPARE_KEYLET_FAIL(nftOfferKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); COMPARE_KEYLET(offerKeylet, keylet::offer, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - offerKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(offerKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); COMPARE_KEYLET(oracleKeylet, keylet::oracle, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - oracleKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(oracleKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); - COMPARE_KEYLET( - paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); - COMPARE_KEYLET_FAIL( - paychanKeylet, - HostFunctionError::INVALID_PARAMS, - env.master.id(), - env.master.id(), - 1); - COMPARE_KEYLET_FAIL( - paychanKeylet, - HostFunctionError::INVALID_ACCOUNT, - env.master.id(), - xrpAccount(), - 1); - COMPARE_KEYLET_FAIL( - paychanKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - env.master.id(), - 1); + COMPARE_KEYLET(paychanKeylet, keylet::payChan, env.master.id(), alice.id(), 1); + COMPARE_KEYLET_FAIL(paychanKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), 1); + COMPARE_KEYLET_FAIL(paychanKeylet, HostFunctionError::INVALID_ACCOUNT, env.master.id(), xrpAccount(), 1); + COMPARE_KEYLET_FAIL(paychanKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), env.master.id(), 1); - COMPARE_KEYLET( - permissionedDomainKeylet, - keylet::permissionedDomain, - env.master.id(), - 1); - COMPARE_KEYLET_FAIL( - permissionedDomainKeylet, - HostFunctionError::INVALID_ACCOUNT, - xrpAccount(), - 1); + COMPARE_KEYLET(permissionedDomainKeylet, keylet::permissionedDomain, env.master.id(), 1); + COMPARE_KEYLET_FAIL(permissionedDomainKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); COMPARE_KEYLET(signersKeylet, keylet::signers, env.master.id()); - COMPARE_KEYLET_FAIL( - signersKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); + COMPARE_KEYLET_FAIL(signersKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount()); COMPARE_KEYLET(ticketKeylet, keylet::ticket, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - ticketKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(ticketKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); COMPARE_KEYLET(vaultKeylet, keylet::vault, env.master.id(), 1); - COMPARE_KEYLET_FAIL( - vaultKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); + COMPARE_KEYLET_FAIL(vaultKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); } void @@ -1808,16 +1493,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFT(xrpAccount(), nftId); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECT( - result.error() == HostFunctionError::INVALID_ACCOUNT); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_ACCOUNT); } // Should fail for invalid nftId { auto const result = hfs.getNFT(alice.id(), uint256()); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECT( - result.error() == HostFunctionError::INVALID_PARAMS); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); } // Should fail for invalid nftId @@ -1825,15 +1508,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const badId = token::getNextID(env, alice, 0u, 1u); auto const result = hfs.getNFT(alice.id(), badId); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECT( - result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); + BEAST_EXPECT(result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); } { auto const result = hfs.getNFT(alice.id(), nftId2); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECT( - result.error() == HostFunctionError::FIELD_NOT_FOUND); + BEAST_EXPECT(result.error() == HostFunctionError::FIELD_NOT_FOUND); } } @@ -1853,8 +1534,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); // Should succeed for valid NFT id @@ -1868,8 +1548,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const result = hfs.getNFTIssuer(uint256()); if (BEAST_EXPECT(!result.has_value())) - BEAST_EXPECT( - result.error() == HostFunctionError::INVALID_PARAMS); + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); } } @@ -1889,8 +1568,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const result = hfs.getNFTTaxon(nftId); @@ -1907,16 +1585,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; // Mint NFT with default flags - uint256 const nftId = - token::getNextID(env, env.master, 0u, tfTransferable); + uint256 const nftId = token::getNextID(env, env.master, 0u, tfTransferable); env(token::mint(env.master, 0), txflags(tfTransferable)); env.close(); OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { @@ -1942,18 +1618,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; uint16_t const transferFee = 250; - uint256 const nftId = - token::getNextID(env, env.master, 0u, tfTransferable, transferFee); - env(token::mint(env.master, 0), - token::xferFee(transferFee), - txflags(tfTransferable)); + uint256 const nftId = token::getNextID(env, env.master, 0u, tfTransferable, transferFee); + env(token::mint(env.master, 0), token::xferFee(transferFee), txflags(tfTransferable)); env.close(); OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { @@ -1987,8 +1659,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { @@ -2018,8 +1689,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "test trace"; @@ -2041,8 +1711,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const messages = sink.messages().str(); std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); + boost::algorithm::hex(data.begin(), data.end(), std::back_inserter(hex)); BEAST_EXPECT(messages.find(msg) != std::string::npos); BEAST_EXPECT(messages.find(hex) != std::string::npos); } @@ -2056,8 +1725,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "test trace"; @@ -2083,8 +1751,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace number"; @@ -2095,8 +1762,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); - BEAST_EXPECT( - messages.find(std::to_string(num)) != std::string::npos); + BEAST_EXPECT(messages.find(std::to_string(num)) != std::string::npos); } } @@ -2108,8 +1774,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace number"; @@ -2134,8 +1799,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace account"; @@ -2145,8 +1809,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(result.value() == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); - BEAST_EXPECT( - messages.find(env.master.human()) != std::string::npos); + BEAST_EXPECT(messages.find(env.master.human()) != std::string::npos); } } @@ -2158,8 +1821,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); @@ -2182,8 +1844,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace amount"; @@ -2195,9 +1856,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(*result == 0); auto const messages = sink.messages().str(); BEAST_EXPECT(messages.find(msg) != std::string::npos); - BEAST_EXPECT( - messages.find(amount.getFullText()) != - std::string::npos); + BEAST_EXPECT(messages.find(amount.getFullText()) != std::string::npos); } } @@ -2231,8 +1890,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace amount"; @@ -2280,8 +1938,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace float"; @@ -2305,8 +1962,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite beast::Journal jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); std::string msg = "trace float"; @@ -2327,29 +1983,21 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { - auto const result = - hfs.floatFromInt(std::numeric_limits::min(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatFromInt(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatFromInt(std::numeric_limits::min(), 4); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatFromInt(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatFromInt(std::numeric_limits::min(), 0); + auto const result = hfs.floatFromInt(std::numeric_limits::min(), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); } @@ -2359,8 +2007,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const result = - hfs.floatFromInt(std::numeric_limits::max(), 0); + auto const result = hfs.floatFromInt(std::numeric_limits::max(), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMax); } } @@ -2374,24 +2021,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { - auto const result = - hfs.floatFromUint(std::numeric_limits::min(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatFromUint(std::numeric_limits::min(), -1); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatFromUint(std::numeric_limits::min(), 4); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatFromUint(std::numeric_limits::min(), 4); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { @@ -2400,8 +2040,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const result = - hfs.floatFromUint(std::numeric_limits::max(), 0); + auto const result = hfs.floatFromUint(std::numeric_limits::max(), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatUIntMax); } } @@ -2416,36 +2055,26 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatSet(1, 0, -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatSet(1, 0, 4); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatSet(1, wasmMaxExponent + normalExp + 1, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatSet(1, wasmMaxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { - auto const result = - hfs.floatSet(1, wasmMinExponent + normalExp - 1, 0); + auto const result = hfs.floatSet(1, wasmMinExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } @@ -2455,20 +2084,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const result = - hfs.floatSet(-1, wasmMaxExponent + normalExp, 0); + auto const result = hfs.floatSet(-1, wasmMaxExponent + normalExp, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinusMaxExp); } { - auto const result = - hfs.floatSet(1, wasmMaxExponent + normalExp - 1, 0); + auto const result = hfs.floatSet(1, wasmMaxExponent + normalExp - 1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); } { - auto const result = - hfs.floatSet(STAmount::cMaxValue, wasmMaxExponent, 0); + auto const result = hfs.floatSet(STAmount::cMaxValue, wasmMaxExponent, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxIOU); } @@ -2492,31 +2118,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatCompare(Slice(), Slice()); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatCompare(makeSlice(floatInvalidZero), Slice()); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(floatInvalidZero), Slice()); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(float1), makeSlice(invalid)); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { @@ -2524,28 +2141,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite // exp = 81 + 97 = 178 x[1] |= 0x80; x[1] &= 0xBF; - auto const result = - hfs.floatCompare(makeSlice(x), makeSlice(floatMaxExp)); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(x), makeSlice(floatMaxExp)); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = hfs.floatCompare( - makeSlice(floatIntMin), makeSlice(floatIntZero)); + auto const result = hfs.floatCompare(makeSlice(floatIntMin), makeSlice(floatIntZero)); BEAST_EXPECT(result) && BEAST_EXPECT(*result == 2); } { - auto const result = hfs.floatCompare( - makeSlice(floatIntMax), makeSlice(floatIntZero)); + auto const result = hfs.floatCompare(makeSlice(floatIntMax), makeSlice(floatIntZero)); BEAST_EXPECT(result) && BEAST_EXPECT(*result == 1); } { - auto const result = - hfs.floatCompare(makeSlice(float1), makeSlice(float1)); + auto const result = hfs.floatCompare(makeSlice(float1), makeSlice(float1)); BEAST_EXPECT(result) && BEAST_EXPECT(*result == 0); } } @@ -2559,50 +2170,36 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatAdd(Slice(), Slice(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatAdd(Slice(), Slice(), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatAdd(makeSlice(float1), makeSlice(invalid), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatAdd(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatAdd(makeSlice(floatMaxIOU), makeSlice(floatMaxExp), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatAdd(makeSlice(floatMaxIOU), makeSlice(floatMaxExp), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { - auto const result = hfs.floatAdd( - makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + auto const result = hfs.floatAdd(makeSlice(floatIntMin), makeSlice(floatIntZero), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); } { - auto const result = - hfs.floatAdd(makeSlice(floatIntMax), makeSlice(floatIntMin), 0); + auto const result = hfs.floatAdd(makeSlice(floatIntMax), makeSlice(floatIntMin), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } } @@ -2616,50 +2213,36 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatSubtract(Slice(), Slice(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatSubtract(Slice(), Slice(), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatSubtract(makeSlice(float1), makeSlice(invalid), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatSubtract(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = hfs.floatSubtract( - makeSlice(floatMaxIOU), makeSlice(floatMinusMaxExp), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatSubtract(makeSlice(floatMaxIOU), makeSlice(floatMinusMaxExp), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { - auto const result = hfs.floatSubtract( - makeSlice(floatIntMin), makeSlice(floatIntZero), 0); + auto const result = hfs.floatSubtract(makeSlice(floatIntMin), makeSlice(floatIntZero), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntMin); } { - auto const result = hfs.floatSubtract( - makeSlice(floatIntZero), makeSlice(float1), 0); + auto const result = hfs.floatSubtract(makeSlice(floatIntZero), makeSlice(float1), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMinus1); } } @@ -2673,56 +2256,41 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatMultiply(Slice(), Slice(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatMultiply(Slice(), Slice(), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatMultiply(makeSlice(float1), makeSlice(invalid), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatMultiply(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = hfs.floatMultiply( - makeSlice(floatMaxIOU), makeSlice(float1More), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatMultiply(makeSlice(floatMaxIOU), makeSlice(float1More), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { - auto const result = - hfs.floatMultiply(makeSlice(float1), makeSlice(float1), 0); + auto const result = hfs.floatMultiply(makeSlice(float1), makeSlice(float1), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); } { - auto const result = hfs.floatMultiply( - makeSlice(floatIntZero), makeSlice(floatMaxIOU), 0); + auto const result = hfs.floatMultiply(makeSlice(floatIntZero), makeSlice(floatMaxIOU), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } { - auto const result = hfs.floatMultiply( - makeSlice(float10), makeSlice(floatPreMaxExp), 0); + auto const result = hfs.floatMultiply(makeSlice(float10), makeSlice(floatPreMaxExp), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatMaxExp); } } @@ -2736,64 +2304,45 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatDivide(Slice(), Slice(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatDivide(Slice(), Slice(), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatDivide(makeSlice(float1), makeSlice(invalid), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatDivide(makeSlice(float1), makeSlice(invalid), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatDivide(makeSlice(float1), makeSlice(floatIntZero), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatDivide(makeSlice(float1), makeSlice(floatIntZero), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { - auto const y = hfs.floatSet( - STAmount::cMaxValue, -normalExp - 1, 0); // 0.9999999... + auto const y = hfs.floatSet(STAmount::cMaxValue, -normalExp - 1, 0); // 0.9999999... if (BEAST_EXPECT(y)) { - auto const result = - hfs.floatDivide(makeSlice(floatMaxIOU), makeSlice(*y), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + auto const result = hfs.floatDivide(makeSlice(floatMaxIOU), makeSlice(*y), 0); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } } { - auto const result = - hfs.floatDivide(makeSlice(floatIntZero), makeSlice(float1), 0); + auto const result = hfs.floatDivide(makeSlice(floatIntZero), makeSlice(float1), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatIntZero); } { - auto const result = - hfs.floatDivide(makeSlice(floatMaxExp), makeSlice(float10), 0); + auto const result = hfs.floatDivide(makeSlice(floatMaxExp), makeSlice(float10), 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == floatPreMaxExp); } } @@ -2807,29 +2356,22 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatRoot(Slice(), 2, -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatRoot(makeSlice(invalid), 3, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatRoot(makeSlice(float1), -2, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { @@ -2880,52 +2422,37 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatPower(Slice(), 2, -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatPower(makeSlice(invalid), 3, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatPower(makeSlice(float1), -2, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 81, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatPower(makeSlice(floatMaxIOU), 2, 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == - HostFunctionError::FLOAT_COMPUTATION_ERROR); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); } { @@ -2967,22 +2494,17 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); { auto const result = hfs.floatLog(Slice(), -1); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { auto const result = hfs.floatLog(makeSlice(invalid), 0); - BEAST_EXPECT(!result) && - BEAST_EXPECT( - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + BEAST_EXPECT(!result) && BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } // perf test logs @@ -3026,8 +2548,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // } { - auto const x = - hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 + auto const x = hfs.floatSet(9'500'000'000'000'001, -14, 0); // almost 80+15 if (BEAST_EXPECT(x)) { auto const result = hfs.floatLog(makeSlice(floatMaxExp), 0); @@ -3055,9 +2576,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite } { - auto const x = hfs.floatSet(1, -2, 0); // 0.01 - auto const y = - hfs.floatSet(-2'000'000'000'000'000ll, -15, 0); // -2 + auto const x = hfs.floatSet(1, -2, 0); // 0.01 + auto const y = hfs.floatSet(-2'000'000'000'000'000ll, -15, 0); // -2 if (BEAST_EXPECT(x && y)) { auto const result = hfs.floatLog(makeSlice(*x), 0); @@ -3075,8 +2595,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - auto const dummyEscrow = - keylet::escrow(env.master, env.seq(env.master)); + auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const y = hfs.floatSet(20, 0, 0); @@ -3091,19 +2610,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite x[7] = 10; { - auto const result = - hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } // MPT @@ -3112,19 +2625,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite x[7] = 10; { - auto const result = - hfs.floatCompare(makeSlice(x), makeSlice(float10)); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float10)); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } { - auto const result = - hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatAdd(makeSlice(float10), makeSlice(x), 0); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } testcase("float non-canonical"); @@ -3133,11 +2640,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite Bytes x = float1; *reinterpret_cast(x.data()) = 0x0000C16FF286A3D4ull; { - auto const result = - hfs.floatCompare(makeSlice(x), makeSlice(float1)); - BEAST_EXPECT( - !result && - result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); + auto const result = hfs.floatCompare(makeSlice(x), makeSlice(float1)); + BEAST_EXPECT(!result && result.error() == HostFunctionError::FLOAT_INPUT_MALFORMED); } } } diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0938243cffa..85f8049e94c 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -19,8 +19,7 @@ struct TestLedgerDataProvider : public HostFunctions void const* rt_ = nullptr; public: - TestLedgerDataProvider(jtx::Env& env) - : HostFunctions(env.journal), env_(env) + TestLedgerDataProvider(jtx::Env& env) : HostFunctions(env.journal), env_(env) { } @@ -52,8 +51,7 @@ struct TestHostFunctions : public HostFunctions void const* rt_ = nullptr; public: - TestHostFunctions(test::jtx::Env& env, int cd = 0) - : HostFunctions(env.journal), env_(env), clock_drift_(cd) + TestHostFunctions(test::jtx::Env& env, int cd = 0) : HostFunctions(env.journal), env_(env), clock_drift_(cd) { accountID_ = env_.master.id(); std::string t = "10000"; @@ -148,8 +146,7 @@ struct TestHostFunctions : public HostFunctions return data_; else if (sn == "FinishAfter") { - auto t = - env_.current()->parentCloseTime().time_since_epoch().count(); + auto t = env_.current()->parentCloseTime().time_since_epoch().count(); std::string s = std::to_string(t); return Bytes{s.begin(), s.end()}; } @@ -185,10 +182,9 @@ struct TestHostFunctions : public HostFunctions return Bytes(accountID_.begin(), accountID_.end()); } } - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, + 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, + 0xfc, 0xee, 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; return Bytes(&a[0], &a[sizeof(a)]); } @@ -204,10 +200,9 @@ struct TestHostFunctions : public HostFunctions return Bytes(accountID_.begin(), accountID_.end()); } } - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, + 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, + 0xfc, 0xee, 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; return Bytes(&a[0], &a[sizeof(a)]); } @@ -223,10 +218,9 @@ struct TestHostFunctions : public HostFunctions return Bytes(accountID_.begin(), accountID_.end()); } } - uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, - 0xbf, 0x49, 0xd2, 0x45, 0x9f, 0xa4, 0xa0, 0x34, - 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, 0xfc, 0xee, - 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; + uint8_t const a[] = {0x2b, 0x6a, 0x23, 0x2a, 0xa4, 0xc4, 0xbe, 0x41, 0xbf, 0x49, 0xd2, + 0x45, 0x9f, 0xa4, 0xa0, 0x34, 0x7e, 0x1b, 0x54, 0x3a, 0x4c, 0x92, + 0xfc, 0xee, 0x08, 0x21, 0xc0, 0x20, 0x1e, 0x2e, 0x9a, 0x00}; return Bytes(&a[0], &a[sizeof(a)]); } @@ -273,10 +267,7 @@ struct TestHostFunctions : public HostFunctions } Expected - checkSignature( - Slice const& message, - Slice const& signature, - Slice const& pubkey) override + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override { return 1; } @@ -308,13 +299,9 @@ struct TestHostFunctions : public HostFunctions } Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) override + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override { - if (!subject || !issuer || credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) + if (!subject || !issuer || credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HostFunctionError::INVALID_ACCOUNT); auto const keylet = keylet::credential(subject, issuer, credentialType); return Bytes{keylet.key.begin(), keylet.key.end()}; @@ -403,18 +390,14 @@ struct TestHostFunctions : public HostFunctions { if (!asHex) { - log(msg, [&data] { - return std::string_view( - reinterpret_cast(data.data()), data.size()); - }); + log(msg, [&data] { return std::string_view(reinterpret_cast(data.data()), data.size()); }); } else { log(msg, [&data] { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); + boost::algorithm::hex(data.begin(), data.end(), std::back_inserter(hex)); return hex; }); } @@ -550,10 +533,7 @@ struct PerfHostFunctions : public TestHostFunctions void const* rt_ = nullptr; - PerfHostFunctions( - test::jtx::Env& env, - Keylet const& k, - std::shared_ptr&& tx) + PerfHostFunctions(test::jtx::Env& env, Keylet const& k, std::shared_ptr&& tx) : TestHostFunctions(env), leKey(k), tx_(std::move(tx)) { } @@ -570,8 +550,7 @@ struct PerfHostFunctions : public TestHostFunctions Expected getParentLedgerTime() override { - auto time = - env_.current()->parentCloseTime().time_since_epoch().count(); + auto time = env_.current()->parentCloseTime().time_since_epoch().count(); if (time > std::numeric_limits::max()) return Unexpected(HostFunctionError::INTERNAL); return static_cast(time); @@ -727,16 +706,14 @@ struct PerfHostFunctions : public TestHostFunctions } break; case STI_UINT16: { - auto const& num( - static_cast const*>(obj)); + auto const& num(static_cast const*>(obj)); std::uint16_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); return Bytes{b, e}; } case STI_UINT32: { - auto const* num( - static_cast const*>(obj)); + auto const* num(static_cast const*>(obj)); std::uint32_t const data = num->value(); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); @@ -781,8 +758,7 @@ struct PerfHostFunctions : public TestHostFunctions static inline bool noField(STBase const* field) { - return !field || (STI_NOTPRESENT == field->getSType()) || - (STI_UNKNOWN == field->getSType()); + return !field || (STI_NOTPRESENT == field->getSType()) || (STI_UNKNOWN == field->getSType()); } static Expected @@ -791,8 +767,7 @@ struct PerfHostFunctions : public TestHostFunctions if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - int32_t const* locPtr = - reinterpret_cast(locator.data()); + int32_t const* locPtr = reinterpret_cast(locator.data()); int32_t const locSize = locator.size() / 4; STBase const* field = nullptr; auto const& knownSFields = SField::getKnownCodeToField(); @@ -1001,8 +976,7 @@ struct PerfHostFunctions : public TestHostFunctions if (data.size() > maxWasmDataLength) return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - xrpl::detail::ApplyViewBase v( - env_.app().openLedger().current().get(), tapNONE); + xrpl::detail::ApplyViewBase v(env_.app().openLedger().current().get(), tapNONE); auto sle = v.peek(leKey); if (!sle) @@ -1015,10 +989,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - checkSignature( - Slice const& message, - Slice const& signature, - Slice const& pubkey) override + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override { if (!publicKeyType(pubkey)) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -1067,16 +1038,12 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) override + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override { if (!subject || !issuer) return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) + if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HostFunctionError::INVALID_PARAMS); auto const keylet = keylet::credential(subject, issuer, credentialType); @@ -1094,8 +1061,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - delegateKeylet(AccountID const& account, AccountID const& authorize) - override + delegateKeylet(AccountID const& account, AccountID const& authorize) override { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -1106,8 +1072,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - depositPreauthKeylet(AccountID const& account, AccountID const& authorize) - override + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) override { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -1127,10 +1092,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - lineKeylet( - AccountID const& account1, - AccountID const& account2, - Currency const& currency) override + lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) override { if (!account1 || !account2) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -1193,10 +1155,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - paychanKeylet( - AccountID const& account, - AccountID const& destination, - std::uint32_t seq) override + paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) override { if (!account || !destination) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -1207,8 +1166,7 @@ struct PerfHostFunctions : public TestHostFunctions } Expected - permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) - override + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) override { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a26328039b8..3305ca03b89 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -60,11 +60,8 @@ struct Wasm_test : public beast::unit_test::suite auto const lineStr = " (" + std::to_string(location.line()) + ")"; if (BEAST_EXPECTS(re.has_value(), transToken(re.error()) + lineStr)) { - BEAST_EXPECTS( - re->result == expectedResult, - std::to_string(re->result) + lineStr); - BEAST_EXPECTS( - re->cost == expectedCost, std::to_string(re->cost) + lineStr); + BEAST_EXPECTS(re->result == expectedResult, std::to_string(re->result) + lineStr); + BEAST_EXPECTS(re->cost == expectedCost, std::to_string(re->cost) + lineStr); } } @@ -111,8 +108,7 @@ struct Wasm_test : public beast::unit_test::suite auto& vm = WasmEngine::instance(); std::shared_ptr imports(std::make_shared()); - WasmImpFunc( - *imports, "func-add", reinterpret_cast(&Add)); + WasmImpFunc(*imports, "func-add", reinterpret_cast(&Add)); auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); @@ -164,8 +160,7 @@ struct Wasm_test : public beast::unit_test::suite "732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a" "6d756c746976616c7565"); - auto const re = - preflightEscrowWasm(badWasm, hfs, ESCROW_FUNCTION_NAME); + auto const re = preflightEscrowWasm(badWasm, hfs, ESCROW_FUNCTION_NAME); BEAST_EXPECT(!isTesSuccess(re)); } } @@ -182,18 +177,10 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; std::shared_ptr hfs(new TestLedgerDataProvider(env)); auto imports = std::make_shared(); - WASM_IMPORT_FUNC2( - *imports, getLedgerSqn, "get_ledger_sqn", hfs.get(), 33); + WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get(), 33); auto& engine = WasmEngine::instance(); - auto re = engine.run( - ledgerSqnWasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - hfs, - 1'000'000, - env.journal); + auto re = engine.run(ledgerSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); checkResult(re, 0, 151); @@ -201,8 +188,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module - run the same instance - re = engine.run( - {}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + re = engine.run({}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); checkResult(re, 5, 190); } @@ -228,8 +214,7 @@ struct Wasm_test : public beast::unit_test::suite auto const sha512Wasm = hexToBytes(sha512PureWasmHex); auto& engine = WasmEngine::instance(); - auto const re = engine.run( - sha512Wasm, "sha512_process", wasmParams(sha512PureWasmHex)); + auto const re = engine.run(sha512Wasm, "sha512_process", wasmParams(sha512PureWasmHex)); checkResult(re, 34'432, 151'155); } @@ -244,9 +229,7 @@ struct Wasm_test : public beast::unit_test::suite Bytes outb; outb.resize(1024); - auto const minsz = std::min( - static_cast(512), - static_cast(b58WasmHex.size())); + auto const minsz = std::min(static_cast(512), static_cast(b58WasmHex.size())); auto const s = std::string_view(b58WasmHex.c_str(), minsz); auto const re = engine.run(b58Wasm, "b58enco", wasmParams(outb, s)); @@ -272,14 +255,7 @@ struct Wasm_test : public beast::unit_test::suite for (auto& i : *imp) i.second.gas = 0; - auto re = engine.run( - allHostFuncWasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - hfs, - 1'000'000, - env.journal); + auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); checkResult(re, 1, 25'503); @@ -300,14 +276,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto const imp = createWasmImport(*hfs); - auto re = engine.run( - allHostFuncWasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - hfs, - 1'000'000, - env.journal); + auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); checkResult(re, 1, 64'763); @@ -323,20 +292,11 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto const imp = createWasmImport(*hfs); - auto re = engine.run( - allHostFuncWasm, - ESCROW_FUNCTION_NAME, - {}, - imp, - hfs, - 200, - env.journal); + auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 200, env.journal); if (BEAST_EXPECT(!re)) { - BEAST_EXPECTS( - re.error() == tecFAILED_PROCESSING, - std::to_string(TERtoInt(re.error()))); + BEAST_EXPECTS(re.error() == tecFAILED_PROCESSING, std::to_string(TERtoInt(re.error()))); } env.close(); @@ -354,16 +314,14 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = runEscrowWasm( - allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, 1, 64'763); } { // max() gas std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto re = - runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); + auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); checkResult(re, 1, 64'763); } @@ -381,8 +339,7 @@ struct Wasm_test : public beast::unit_test::suite }; std::shared_ptr hfs(new BadTestHostFunctions(env)); - auto re = runEscrowWasm( - allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'148); } @@ -400,8 +357,7 @@ struct Wasm_test : public beast::unit_test::suite }; std::shared_ptr hfs(new BadTestHostFunctions(env)); - auto re = runEscrowWasm( - allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'148); } @@ -409,8 +365,7 @@ struct Wasm_test : public beast::unit_test::suite auto const deepWasm = hexToBytes(deepRecursionHex); - std::shared_ptr hfs( - new TestHostFunctionsSink(env)); + std::shared_ptr hfs(new TestHostFunctionsSink(env)); std::string funcName("finish"); auto re = runEscrowWasm(deepWasm, hfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); @@ -418,8 +373,7 @@ struct Wasm_test : public beast::unit_test::suite // << std::endl; auto const& sink = hfs->getSink(); - auto countSubstr = [](std::string const& str, - std::string const& substr) { + auto countSubstr = [](std::string const& str, std::string const& substr) { std::size_t pos = 0; int occurrences = 0; while ((pos = str.find(substr, pos)) != std::string::npos) @@ -431,8 +385,7 @@ struct Wasm_test : public beast::unit_test::suite }; auto const s = sink.messages().str(); - BEAST_EXPECT( - countSubstr(s, "WASMI Error: failure to call func") == 1); + BEAST_EXPECT(countSubstr(s, "WASMI Error: failure to call func") == 1); BEAST_EXPECT(countSubstr(s, "exception: failure") > 0); } @@ -442,8 +395,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); // infinite loop should be caught and fail - auto const re = - runEscrowWasm(infiniteLoopWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(infiniteLoopWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -455,19 +407,11 @@ struct Wasm_test : public beast::unit_test::suite auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2( - *imports, getLedgerSqn, "get_ledger_sqn2", hfs.get()); + WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn2", hfs.get()); auto& engine = WasmEngine::instance(); - auto re = engine.run( - lgrSqnWasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - hfs, - 1'000'000, - env.journal); + auto re = engine.run(lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -477,20 +421,12 @@ struct Wasm_test : public beast::unit_test::suite auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2( - *imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); + WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); (*imports)[0].first = nullptr; auto& engine = WasmEngine::instance(); - auto re = engine.run( - lgrSqnWasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - hfs, - 1'000'000, - env.journal); + auto re = engine.run(lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -500,12 +436,10 @@ struct Wasm_test : public beast::unit_test::suite auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); std::shared_ptr hfs(new TestLedgerDataProvider(env)); std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2( - *imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); + WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); auto& engine = WasmEngine::instance(); - auto re = engine.run( - lgrSqnWasm, "func1", {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(lgrSqnWasm, "func1", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -595,34 +529,28 @@ struct Wasm_test : public beast::unit_test::suite // {issuer, credType3}})); // create nft - [[maybe_unused]] uint256 const nft0{ - token::getNextID(env, alan, 0u)}; + [[maybe_unused]] uint256 const nft0{token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u)); auto const k = keylet::nftoffer(alan, 0); - [[maybe_unused]] uint256 const nft1{ - token::getNextID(env, alan, 0u)}; + [[maybe_unused]] uint256 const nft1{token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u), - token::uri( - "https://github.com/XRPLF/XRPL-Standards/discussions/" - "279?id=github.com/XRPLF/XRPL-Standards/discussions/" - "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" - "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" - "279&aot=github.com/XRPLF/XRPL-Standards/disc")); - [[maybe_unused]] uint256 const nft2{ - token::getNextID(env, alan, 0u)}; + token::uri("https://github.com/XRPLF/XRPL-Standards/discussions/" + "279?id=github.com/XRPLF/XRPL-Standards/discussions/" + "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" + "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" + "279&aot=github.com/XRPLF/XRPL-Standards/disc")); + [[maybe_unused]] uint256 const nft2{token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u)); env.close(); - std::shared_ptr hfs( - new PerfHostFunctions(env, k, env.tx())); + std::shared_ptr hfs(new PerfHostFunctions(env, k, env.tx())); auto re = runEscrowWasm(perfWasm, hfs, ESCROW_FUNCTION_NAME); if (BEAST_EXPECT(re.has_value())) { BEAST_EXPECT(re->result); - std::cout << "Res: " << re->result << " cost: " << re->cost - << std::endl; + std::cout << "Res: " << re->result << " cost: " << re->cost << std::endl; } // env(escrow::finish(alan, alan, seq), @@ -647,8 +575,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto const allowance = 187'131; - auto re = runEscrowWasm( - codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); + auto re = runEscrowWasm(codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); checkResult(re, 1, allowance); } @@ -667,8 +594,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 set constant, opcode disabled exception - auto const re = - runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -678,8 +604,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 add, can't create module exception disabledFloatWasm[0x117] = 0x92; - auto const re = - runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -692,23 +617,16 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm additional memory limit tests"); BEAST_EXPECT(runFinishFunction(memoryPointerAtLimitHex).value() == 1); - BEAST_EXPECT( - runFinishFunction(memoryPointerOverLimitHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(memoryOffsetOverLimitHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(memoryEndOfWordOverLimitHex).has_value() == - false); + BEAST_EXPECT(runFinishFunction(memoryPointerOverLimitHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(memoryOffsetOverLimitHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(memoryEndOfWordOverLimitHex).has_value() == false); BEAST_EXPECT(runFinishFunction(memoryGrow0To1PageHex).value() == 1); BEAST_EXPECT(runFinishFunction(memoryGrow1To0PageHex).value() == -1); BEAST_EXPECT(runFinishFunction(memoryLastByteOf8MBHex).value() == 1); - BEAST_EXPECT( - runFinishFunction(memoryGrow1MoreThan8MBHex).value() == -1); + BEAST_EXPECT(runFinishFunction(memoryGrow1MoreThan8MBHex).value() == -1); BEAST_EXPECT(runFinishFunction(memoryGrow0MoreThan8MBHex).value() == 1); - BEAST_EXPECT( - runFinishFunction(memoryInit1MoreThan8MBHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(memoryNegativeAddressHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(memoryInit1MoreThan8MBHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(memoryNegativeAddressHex).has_value() == false); } void @@ -716,8 +634,7 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm table limit tests"); BEAST_EXPECT(runFinishFunction(table64ElementsHex).value() == 1); - BEAST_EXPECT( - runFinishFunction(table65ElementsHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(table65ElementsHex).has_value() == false); BEAST_EXPECT(runFinishFunction(table2TablesHex).has_value() == false); BEAST_EXPECT(runFinishFunction(table0ElementsHex).value() == 1); BEAST_EXPECT(runFinishFunction(tableUintMaxHex).has_value() == false); @@ -727,32 +644,19 @@ struct Wasm_test : public beast::unit_test::suite testWasmProposal() { testcase("Wasm disabled proposal tests"); - BEAST_EXPECT( - runFinishFunction(proposalMutableGlobalHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalGcStructNewHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalMultiValueHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalSignExtHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalFloatToIntHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalBulkMemoryHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalRefTypesHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalTailCallHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalExtendedConstHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalMultiMemoryHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalCustomPageSizesHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalMemory64Hex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(proposalWideArithmeticHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalMutableGlobalHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalGcStructNewHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalMultiValueHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalSignExtHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalFloatToIntHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalBulkMemoryHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalRefTypesHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalTailCallHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalExtendedConstHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalMultiMemoryHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalCustomPageSizesHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalMemory64Hex).has_value() == false); + BEAST_EXPECT(runFinishFunction(proposalWideArithmeticHex).has_value() == false); } void @@ -760,13 +664,10 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm trap tests"); BEAST_EXPECT(runFinishFunction(trapDivideBy0Hex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(trapIntOverflowHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(trapUnreachableHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(trapIntOverflowHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(trapUnreachableHex).has_value() == false); BEAST_EXPECT(runFinishFunction(trapNullCallHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(trapFuncSigMismatchHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(trapFuncSigMismatchHex).has_value() == false); } void @@ -782,21 +683,15 @@ struct Wasm_test : public beast::unit_test::suite { testcase("Wasm Section Corruption tests"); BEAST_EXPECT(runFinishFunction(badMagicNumberHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(badVersionNumberHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(badVersionNumberHex).has_value() == false); BEAST_EXPECT(runFinishFunction(lyingHeaderHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(neverEndingNumberHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(neverEndingNumberHex).has_value() == false); BEAST_EXPECT(runFinishFunction(vectorLieHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(sectionOrderingHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(sectionOrderingHex).has_value() == false); BEAST_EXPECT(runFinishFunction(ghostPayloadHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(junkAfterSectionHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(invalidSectionIdHex).has_value() == false); - BEAST_EXPECT( - runFinishFunction(localVariableBombHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(junkAfterSectionHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(invalidSectionIdHex).has_value() == false); + BEAST_EXPECT(runFinishFunction(localVariableBombHex).has_value() == false); } void @@ -812,22 +707,11 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr imports(std::make_shared()); auto& engine = WasmEngine::instance(); - auto checkRes = engine.check( - startLoopWasm, "finish", {}, imports, hfs, env.journal); - BEAST_EXPECTS( - checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); - - auto re = engine.run( - startLoopWasm, - ESCROW_FUNCTION_NAME, - {}, - imports, - hfs, - 1'000'000, - env.journal); - BEAST_EXPECTS( - re.error() == tecFAILED_PROCESSING, - std::to_string(TERtoInt(re.error()))); + auto checkRes = engine.check(startLoopWasm, "finish", {}, imports, hfs, env.journal); + BEAST_EXPECTS(checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); + + auto re = engine.run(startLoopWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + BEAST_EXPECTS(re.error() == tecFAILED_PROCESSING, std::to_string(TERtoInt(re.error()))); } void @@ -846,13 +730,10 @@ struct Wasm_test : public beast::unit_test::suite // std::shared_ptr imports(std::make_shared()); uint8_t buf1[8] = {7, 8, 9, 10, 11, 12, 13, 14}; { // forged "allocate" return valid address - std::vector params = { - {.type = WT_U8V, - .of = {.u8v = {.d = buf1, .sz = sizeof(buf1)}}}}; + std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = sizeof(buf1)}}}}; auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); + auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); if (BEAST_EXPECT(re)) { BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); @@ -861,44 +742,32 @@ struct Wasm_test : public beast::unit_test::suite } { // return 0 whithout calling wasm - std::vector params = { - {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; + std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && - BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } { // forged "allocate" return 8Mb (which is more than memory limit) - std::vector params = { - {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; + std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && - BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } { // forged "allocate" return 0 - std::vector params = { - {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; + std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && - BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } { // forged "allocate" return -1 - std::vector params = { - {.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; + std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); + auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && - BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); + BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); } { @@ -913,9 +782,7 @@ struct Wasm_test : public beast::unit_test::suite { what = e.what(); } - BEAST_EXPECT( - what.find("can't allocate memory, size: 2147483648") != - std::string::npos); + BEAST_EXPECT(what.find("can't allocate memory, size: 2147483648") != std::string::npos); } env.close(); @@ -939,8 +806,7 @@ struct Wasm_test : public beast::unit_test::suite // Can be checked through codecov auto& engine = WasmEngine::instance(); - auto re = engine.run( - badAlignWasm, "test", {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(badAlignWasm, "test", {}, imports, hfs, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 0xbab88d46); } @@ -964,8 +830,7 @@ struct Wasm_test : public beast::unit_test::suite "071302066d656d6f727902000666696e69736800000a0a01" "08004280808080100b"; auto const wasm = hexToBytes(wasmHex); - auto const re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); } @@ -981,8 +846,7 @@ struct Wasm_test : public beast::unit_test::suite "0061736d01000000010401600000030201000503010001071302066d656d6f" "727902000666696e69736800000a050103000f0b"; auto const wasm = hexToBytes(wasmHex); - auto const re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); } @@ -997,8 +861,7 @@ struct Wasm_test : public beast::unit_test::suite "6d6f727902000666696e69736800000a10010e0041808080800141ff818080" "010b"; auto const wasm = hexToBytes(wasmHex); - auto const re = - runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); BEAST_EXPECT(!re); } } diff --git a/src/test/app/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c index 00b6178ec05..56defdbb322 100644 --- a/src/test/app/wasm_fixtures/b58.c +++ b/src/test/app/wasm_fixtures/b58.c @@ -1,7 +1,6 @@ #include -static char const b58digits_ordered[] = - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +static char const b58digits_ordered[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; uint8_t e_data[32 * 1024]; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index e826f621c3c..6bff4527057 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1277,8 +1277,7 @@ extern std::string const vectorLieHex = "0061736d010000000105ffffffff0f"; // data += b'\x0a\x02\x00\x0b' // # Function Section (ID 3) - usually 3rd // data += b'\x03\x02\x00\x00' -extern std::string const sectionOrderingHex = - "0061736d010000000a02000b03020000"; +extern std::string const sectionOrderingHex = "0061736d010000000a02000b03020000"; // Corruption Test: ghostPayload // Scenario: Valid headers, but file is truncated in the middle of a payload. @@ -1305,8 +1304,7 @@ extern std::string const ghostPayloadHex = "0061736d01000000010a0160"; // data += b'\x01\x60\x00\x00' // # Remaining 6 bytes are junk padding within the section size // data += b'\x00' * 6 -extern std::string const junkAfterSectionHex = - "0061736d01000000010a01600000000000000000"; +extern std::string const junkAfterSectionHex = "0061736d01000000010a01600000000000000000"; // Corruption Test: invalidSectionId // Scenario: A section ID that doesn't exist (0xFF). @@ -1337,8 +1335,7 @@ extern std::string const invalidSectionIdHex = "0061736d01000000ff0100"; // data += b'\xff\xff\xff\xff\x0f\x7f' // # Instruction: end (0x0b) // data += b'\x0b' -extern std::string const localVariableBombHex = - "0061736d01000000010401600000030201000a0f010d01ffffffff0f7f0b"; +extern std::string const localVariableBombHex = "0061736d01000000010401600000030201000a0f010d01ffffffff0f7f0b"; extern std::string const infiniteLoopWasmHex = "0061736d010000000108026000006000017f030302000105030100020638097f004180080b" diff --git a/src/test/app/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c index fe82aa2a659..2c736bb218c 100644 --- a/src/test/app/wasm_fixtures/sha512Pure.c +++ b/src/test/app/wasm_fixtures/sha512Pure.c @@ -2,33 +2,22 @@ #include static uint64_t const K512[] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, - 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, - 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, - 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, - 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, - 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, - 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, - 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, - 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, - 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, - 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, - 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, - 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, - 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, - 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, - 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, - 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, - 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, - 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, - 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, - 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, - 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, - 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, - 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, - 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, - 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, + 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, + 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, + 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, + 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, + 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, + 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, + 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, + 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, + 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, + 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; #define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) #define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) @@ -81,9 +70,8 @@ sha512_process(uint8_t const* data, int32_t length) unsigned i; for (i = 0; i < 16; i++) { - X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | - B2U64(data[2], 40) | B2U64(data[3], 32) | B2U64(data[4], 24) | - B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); + X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | B2U64(data[2], 40) | B2U64(data[3], 32) | + B2U64(data[4], 24) | B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); data += 8; T1 = h; diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index b7170b9e006..5838a98a158 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -1361,25 +1361,11 @@ class Number_test : public beast::unit_test::suite {Number{5625, -4}, Number{-2'498'774'732'165'998, -16}}}); auto const cLarge = std::to_array( - {{Number{ - false, Number::maxMantissa() - 9, -1, Number::normalized{}}, - Number{ - false, - 1'746'901'684'478'673'451ll, - -17, - Number::normalized{}}}, + {{Number{false, Number::maxMantissa() - 9, -1, Number::normalized{}}, + Number{false, 1'746'901'684'478'673'451ll, -17, Number::normalized{}}}, {Number{false, Number::maxMantissa() - 9, 0, Number::normalized{}}, - Number{ - false, - 1'846'901'684'478'673'451ll, - -17, - Number::normalized{}}}, - {Number{Number::maxRep}, - Number{ - false, - 1'861'728'612'932'620'011ll, - -17, - Number::normalized{}}}}); + Number{false, 1'846'901'684'478'673'451ll, -17, Number::normalized{}}}, + {Number{Number::maxRep}, Number{false, 1'861'728'612'932'620'011ll, -17, Number::normalized{}}}}); if (Number::getMantissaScale() == MantissaRange::small) { diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index 0ee4a615ced..c49e58eb384 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -88,9 +88,7 @@ struct HostFunctions { beast::Journal j_; - HostFunctions( - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) - : j_(j) + HostFunctions(beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) : j_(j) { } @@ -245,10 +243,7 @@ struct HostFunctions } virtual Expected - checkSignature( - Slice const& message, - Slice const& signature, - Slice const& pubkey) + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) { return Unexpected(HostFunctionError::INTERNAL); } @@ -278,10 +273,7 @@ struct HostFunctions } virtual Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) { return Unexpected(HostFunctionError::INTERNAL); } @@ -311,10 +303,7 @@ struct HostFunctions } virtual Expected - lineKeylet( - AccountID const& account1, - AccountID const& account2, - Currency const& currency) + lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) { return Unexpected(HostFunctionError::INTERNAL); } @@ -350,10 +339,7 @@ struct HostFunctions } virtual Expected - paychanKeylet( - AccountID const& account, - AccountID const& destination, - std::uint32_t seq) + paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) { return Unexpected(HostFunctionError::INTERNAL); } diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 4acdc85dfb1..b5ce367004a 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -52,8 +52,7 @@ class WasmHostFunctionsImpl : public HostFunctions return; auto j = getJournal().trace(); #endif - j << "WasmTrace[" << to_short_string(leKey.key) << "]: " << msg << " " - << dataFn(); + j << "WasmTrace[" << to_short_string(leKey.key) << "]: " << msg << " " << dataFn(); #ifdef DEBUG_OUTPUT j << std::endl; @@ -61,8 +60,7 @@ class WasmHostFunctionsImpl : public HostFunctions } public: - WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) - : HostFunctions(ct.journal), ctx(ct), leKey(leKey) + WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) : HostFunctions(ct.journal), ctx(ct), leKey(leKey) { } @@ -145,10 +143,7 @@ class WasmHostFunctionsImpl : public HostFunctions updateData(Slice const& data) override; Expected - checkSignature( - Slice const& message, - Slice const& signature, - Slice const& pubkey) override; + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override; Expected computeSha512HalfHash(Slice const& data) override; @@ -163,30 +158,22 @@ class WasmHostFunctionsImpl : public HostFunctions checkKeylet(AccountID const& account, std::uint32_t seq) override; Expected - credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) override; + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override; Expected didKeylet(AccountID const& account) override; Expected - delegateKeylet(AccountID const& account, AccountID const& authorize) - override; + delegateKeylet(AccountID const& account, AccountID const& authorize) override; Expected - depositPreauthKeylet(AccountID const& account, AccountID const& authorize) - override; + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) override; Expected escrowKeylet(AccountID const& account, std::uint32_t seq) override; Expected - lineKeylet( - AccountID const& account1, - AccountID const& account2, - Currency const& currency) override; + lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) override; Expected mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override; @@ -204,14 +191,10 @@ class WasmHostFunctionsImpl : public HostFunctions oracleKeylet(AccountID const& account, std::uint32_t docId) override; Expected - paychanKeylet( - AccountID const& account, - AccountID const& destination, - std::uint32_t seq) override; + paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) override; Expected - permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) - override; + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) override; Expected signersKeylet(AccountID const& account) override; @@ -247,8 +230,7 @@ class WasmHostFunctionsImpl : public HostFunctions traceNum(std::string_view const& msg, int64_t data) override; Expected - traceAccount(std::string_view const& msg, AccountID const& account) - override; + traceAccount(std::string_view const& msg, AccountID const& account) override; Expected traceFloat(std::string_view const& msg, Slice const& data) override; diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index 745bbe9a2c9..8555fd69a1c 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -6,399 +6,191 @@ namespace xrpl { using getLedgerSqn_proto = int32_t(); wasm_trap_t* -getLedgerSqn_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getLedgerSqn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getParentLedgerTime_proto = int32_t(); wasm_trap_t* -getParentLedgerTime_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getParentLedgerTime_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getParentLedgerHash_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* -getParentLedgerHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getParentLedgerHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getBaseFee_proto = int32_t(); wasm_trap_t* -getBaseFee_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getBaseFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using isAmendmentEnabled_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -isAmendmentEnabled_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +isAmendmentEnabled_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using cacheLedgerObj_proto = int32_t(uint8_t const*, int32_t, int32_t); wasm_trap_t* -cacheLedgerObj_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +cacheLedgerObj_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getTxField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* -getTxField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getTxField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getCurrentLedgerObjField_proto = int32_t(int32_t, uint8_t*, int32_t); wasm_trap_t* -getCurrentLedgerObjField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getCurrentLedgerObjField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getLedgerObjField_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* -getLedgerObjField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getLedgerObjField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getTxNestedField_proto = - int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +using getTxNestedField_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getTxNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getTxNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getCurrentLedgerObjNestedField_proto = - int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +using getCurrentLedgerObjNestedField_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getCurrentLedgerObjNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getCurrentLedgerObjNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getLedgerObjNestedField_proto = - int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +using getLedgerObjNestedField_proto = int32_t(int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getLedgerObjNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getLedgerObjNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getTxArrayLen_proto = int32_t(int32_t); wasm_trap_t* -getTxArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getTxArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getCurrentLedgerObjArrayLen_proto = int32_t(int32_t); wasm_trap_t* -getCurrentLedgerObjArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getCurrentLedgerObjArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getLedgerObjArrayLen_proto = int32_t(int32_t, int32_t); wasm_trap_t* -getLedgerObjArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getLedgerObjArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getTxNestedArrayLen_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -getTxNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getTxNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getCurrentLedgerObjNestedArrayLen_proto = - int32_t(uint8_t const*, int32_t); +using getCurrentLedgerObjNestedArrayLen_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -getCurrentLedgerObjNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getCurrentLedgerObjNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getLedgerObjNestedArrayLen_proto = - int32_t(int32_t, uint8_t const*, int32_t); +using getLedgerObjNestedArrayLen_proto = int32_t(int32_t, uint8_t const*, int32_t); wasm_trap_t* -getLedgerObjNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getLedgerObjNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using updateData_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -updateData_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +updateData_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using checkSignature_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t const*, - int32_t); +using checkSignature_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* -checkSignature_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +checkSignature_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using computeSha512HalfHash_proto = - int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); +using computeSha512HalfHash_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -computeSha512HalfHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +computeSha512HalfHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using accountKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -accountKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using ammKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -ammKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using checkKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -checkKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using credentialKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -credentialKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using delegateKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -delegateKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using depositPreauthKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -depositPreauthKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +accountKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using ammKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using checkKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +checkKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using credentialKeylet_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +credentialKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using delegateKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +delegateKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using depositPreauthKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +depositPreauthKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using didKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -didKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using escrowKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -escrowKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using lineKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -lineKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using mptIssuanceKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -mptIssuanceKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using mptokenKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -mptokenKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using nftOfferKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -nftOfferKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using offerKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -offerKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using oracleKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -oracleKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using paychanKeylet_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - int32_t, - uint8_t*, - int32_t); -wasm_trap_t* -paychanKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using permissionedDomainKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); -wasm_trap_t* -permissionedDomainKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using escrowKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +escrowKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using lineKeylet_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +lineKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using mptIssuanceKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +mptIssuanceKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using mptokenKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +mptokenKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using nftOfferKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +nftOfferKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using offerKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +offerKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using oracleKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +oracleKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using paychanKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +paychanKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using permissionedDomainKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +permissionedDomainKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -signersKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +signersKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using ticketKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using ticketKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* -ticketKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +ticketKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using vaultKeylet_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using vaultKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); wasm_trap_t* -vaultKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +vaultKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getNFT_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t); +using getNFT_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getNFTIssuer_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getNFTIssuer_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getNFTIssuer_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getNFTTaxon_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getNFTTaxon_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getNFTTaxon_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getNFTFlags_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -getNFTFlags_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getNFTFlags_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getNFTTransferFee_proto = int32_t(uint8_t const*, int32_t); wasm_trap_t* -getNFTTransferFee_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getNFTTransferFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using getNFTSerial_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* -getNFTSerial_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +getNFTSerial_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using trace_proto = - int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); +using trace_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); wasm_trap_t* trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -406,128 +198,59 @@ using traceNum_proto = int32_t(uint8_t const*, int32_t, int64_t); wasm_trap_t* traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using traceAccount_proto = - int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +using traceAccount_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* -traceAccount_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +traceAccount_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using traceFloat_proto = - int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +using traceFloat_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* -traceFloat_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +traceFloat_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using traceAmount_proto = - int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +using traceAmount_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* -traceAmount_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +traceAmount_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using floatFromInt_proto = int32_t(int64_t, uint8_t*, int32_t, int32_t); wasm_trap_t* -floatFromInt_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +floatFromInt_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using floatFromUint_proto = - int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +using floatFromUint_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); wasm_trap_t* -floatFromUint_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +floatFromUint_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); using floatSet_proto = int32_t(int32_t, int64_t, uint8_t*, int32_t, int32_t); wasm_trap_t* floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using floatCompare_proto = - int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +using floatCompare_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); wasm_trap_t* -floatCompare_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); +floatCompare_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using floatAdd_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t, - int32_t); +using floatAdd_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); wasm_trap_t* floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using floatSubtract_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t, - int32_t); -wasm_trap_t* -floatSubtract_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using floatMultiply_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t, - int32_t); -wasm_trap_t* -floatMultiply_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using floatDivide_proto = int32_t( - uint8_t const*, - int32_t, - uint8_t const*, - int32_t, - uint8_t*, - int32_t, - int32_t); -wasm_trap_t* -floatDivide_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using floatRoot_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); -wasm_trap_t* -floatRoot_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using floatPower_proto = - int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); -wasm_trap_t* -floatPower_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results); - -using floatLog_proto = - int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +using floatSubtract_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatSubtract_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatMultiply_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatMultiply_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatDivide_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatDivide_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatRoot_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatPower_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t, int32_t); +wasm_trap_t* +floatPower_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using floatLog_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); wasm_trap_t* floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index a7546ce0923..90ecb4caa52 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -50,13 +50,9 @@ struct WasmImportFunc typedef std::pair WasmUserData; typedef std::vector ImportVec; -#define WASM_IMPORT_FUNC(v, f, ...) \ - WasmImpFunc( \ - v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) +#define WASM_IMPORT_FUNC(v, f, ...) WasmImpFunc(v, #f, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) -#define WASM_IMPORT_FUNC2(v, f, n, ...) \ - WasmImpFunc( \ - v, n, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) +#define WASM_IMPORT_FUNC2(v, f, n, ...) WasmImpFunc(v, n, reinterpret_cast(&f##_wrap), ##__VA_ARGS__) template void @@ -91,8 +87,7 @@ WasmImpRet(WasmImportFunc& e) e.result = WT_I64; else if constexpr (std::is_void_v) e.result.reset(); -#if (defined(__GNUC__) && (__GNUC__ >= 14)) || \ - ((defined(__clang_major__)) && (__clang_major__ >= 18)) +#if (defined(__GNUC__) && (__GNUC__ >= 14)) || ((defined(__clang_major__)) && (__clang_major__ >= 18)) else static_assert(false, "Unsupported return type"); #endif @@ -113,12 +108,7 @@ WasmImpFuncHelper(WasmImportFunc& e) template void -WasmImpFunc( - ImportVec& v, - std::string_view imp_name, - void* f_wrap, - void* data = nullptr, - uint32_t gas = 0) +WasmImpFunc(ImportVec& v, std::string_view imp_name, void* f_wrap, void* data = nullptr, uint32_t gas = 0) { WasmImportFunc e; e.name = imp_name; @@ -185,11 +175,7 @@ wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) template inline void -wasmParamsHlp( - std::vector& v, - std::uint8_t const* dt, - std::int32_t sz, - Types&&... args) +wasmParamsHlp(std::vector& v, std::uint8_t const* dt, std::int32_t sz, Types&&... args) { v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); wasmParamsHlp(v, std::forward(args)...); @@ -200,27 +186,17 @@ inline void wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) { if (p.size() > std::numeric_limits::max()) - throw std::runtime_error( - "can't allocate memory, size: " + - std::to_string(p.size())); // LCOV_EXCL_LINE + throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); // LCOV_EXCL_LINE - wasmParamsHlp( - v, - p.data(), - static_cast(p.size()), - std::forward(args)...); + wasmParamsHlp(v, p.data(), static_cast(p.size()), std::forward(args)...); } template inline void -wasmParamsHlp( - std::vector& v, - std::string_view const& p, - Types&&... args) +wasmParamsHlp(std::vector& v, std::string_view const& p, Types&&... args) { if (p.size() > std::numeric_limits::max()) - throw std::runtime_error( - "can't allocate memory, size: " + std::to_string(p.size())); + throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); wasmParamsHlp( v, @@ -234,9 +210,7 @@ inline void wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) { if (p.size() > std::numeric_limits::max()) - throw std::runtime_error( - "can't allocate memory, size: " + - std::to_string(p.size())); // LCOV_EXCL_LINE + throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); // LCOV_EXCL_LINE wasmParamsHlp( v, diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index c64e7951c01..d4ea0bfaa94 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -60,26 +60,13 @@ struct WasmVec } }; -using WasmValtypeVec = WasmVec< - wasm_valtype_vec_t, - &wasm_valtype_vec_new_uninitialized, - &wasm_valtype_vec_delete>; -using WasmValVec = WasmVec< - wasm_val_vec_t, - &wasm_val_vec_new_uninitialized, - &wasm_val_vec_delete>; -using WasmExternVec = WasmVec< - wasm_extern_vec_t, - &wasm_extern_vec_new_uninitialized, - &wasm_extern_vec_delete>; -using WasmExporttypeVec = WasmVec< - wasm_exporttype_vec_t, - &wasm_exporttype_vec_new_uninitialized, - &wasm_exporttype_vec_delete>; -using WasmImporttypeVec = WasmVec< - wasm_importtype_vec_t, - &wasm_importtype_vec_new_uninitialized, - &wasm_importtype_vec_delete>; +using WasmValtypeVec = WasmVec; +using WasmValVec = WasmVec; +using WasmExternVec = WasmVec; +using WasmExporttypeVec = + WasmVec; +using WasmImporttypeVec = + WasmVec; struct WasmiResult { @@ -97,8 +84,7 @@ struct WasmiResult }; using ModulePtr = std::unique_ptr; -using InstancePtr = - std::unique_ptr; +using InstancePtr = std::unique_ptr; using EnginePtr = std::unique_ptr; using StorePtr = std::unique_ptr; @@ -114,12 +100,7 @@ struct InstanceWrapper private: static InstancePtr - init( - StorePtr& s, - ModulePtr& m, - WasmExternVec& expt, - WasmExternVec const& imports, - beast::Journal j); + init(StorePtr& s, ModulePtr& m, WasmExternVec& expt, WasmExternVec const& imports, beast::Journal j); public: InstanceWrapper(); @@ -129,19 +110,14 @@ struct InstanceWrapper InstanceWrapper& operator=(InstanceWrapper&& o); - InstanceWrapper( - StorePtr& s, - ModulePtr& m, - WasmExternVec const& imports, - beast::Journal j); + InstanceWrapper(StorePtr& s, ModulePtr& m, WasmExternVec const& imports, beast::Journal j); ~InstanceWrapper() = default; operator bool() const; FuncInfo - getFunc(std::string_view funcName, WasmExporttypeVec const& exportTypes) - const; + getFunc(std::string_view funcName, WasmExporttypeVec const& exportTypes) const; wmem getMem() const; @@ -260,17 +236,10 @@ class WasmiEngine allocate(int32_t size); Expected, TER> - runHlp( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params, - int64_t gas); + runHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, int64_t gas); NotTEC - checkHlp( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params); + checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params); int addModule(Bytes const& wasmCode, bool instantiate, int64_t gas); @@ -292,9 +261,7 @@ class WasmiEngine convertParams(std::vector const& params); static int - compareParamTypes( - wasm_valtype_vec_t const* ftp, - std::vector const& p); + compareParamTypes(wasm_valtype_vec_t const* ftp, std::vector const& p); static void add_param(std::vector& in, int32_t p); @@ -315,36 +282,19 @@ class WasmiEngine template inline WasmiResult - call( - FuncInfo const& f, - std::vector& in, - std::int32_t p, - Types&&... args); + call(FuncInfo const& f, std::vector& in, std::int32_t p, Types&&... args); template inline WasmiResult - call( - FuncInfo const& f, - std::vector& in, - std::int64_t p, - Types&&... args); + call(FuncInfo const& f, std::vector& in, std::int64_t p, Types&&... args); template inline WasmiResult - call( - FuncInfo const& f, - std::vector& in, - uint8_t const* d, - int32_t sz, - Types&&... args); + call(FuncInfo const& f, std::vector& in, uint8_t const* d, int32_t sz, Types&&... args); template inline WasmiResult - call( - FuncInfo const& f, - std::vector& in, - Bytes const& p, - Types&&... args); + call(FuncInfo const& f, std::vector& in, Bytes const& p, Types&&... args); }; } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index c0c514129f0..dfff35727f1 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -25,10 +25,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) // ========================================================= Expected -WasmHostFunctionsImpl::checkSignature( - Slice const& message, - Slice const& signature, - Slice const& pubkey) +WasmHostFunctionsImpl::checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) { if (!publicKeyType(pubkey)) return Unexpected(HostFunctionError::INVALID_PARAMS); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index 29a0dd545f2..36231ec37dc 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -23,8 +23,7 @@ class Number2 : public Number static_assert(wasmMinExponent < 0); - static uint64_t constexpr maxEncodedMantissa = - (1ull << (encodedMantissaBits + 1)) - 1; + static uint64_t constexpr maxEncodedMantissa = (1ull << (encodedMantissaBits + 1)) - 1; bool good_; @@ -44,16 +43,13 @@ class Number2 : public Number if (!(v & STAmount::cIssuedCurrency)) return; - int32_t const e = - static_cast((v >> encodedMantissaBits) & 0xFFull); + int32_t const e = static_cast((v >> encodedMantissaBits) & 0xFFull); int32_t const decodedExponent = e + wasmMinExponent - 1; // e - 97 - if (decodedExponent < wasmMinExponent || - decodedExponent > wasmMaxExponent) + if (decodedExponent < wasmMinExponent || decodedExponent > wasmMaxExponent) return; int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; - int64_t const m = - neg * static_cast(v & ((1ull << encodedMantissaBits) - 1)); + int64_t const m = neg * static_cast(v & ((1ull << encodedMantissaBits) - 1)); if (!m) return; @@ -89,8 +85,7 @@ class Number2 : public Number good_ = true; } - Number2(Number const& n) - : Number2(n.mantissa(), n.exponent()) // ensure Number canonized + Number2(Number const& n) : Number2(n.mantissa(), n.exponent()) // ensure Number canonized { } @@ -132,8 +127,7 @@ class Number2 : public Number } else if (absM > maxEncodedMantissa) { - return Unexpected( - HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } v |= absM; @@ -149,8 +143,7 @@ class Number2 : public Number auto const data = msg.getData(); #ifdef DEBUG_OUTPUT - std::cout << "m: " << std::setw(20) << mantissa() - << ", e: " << std::setw(12) << exponent() << ", hex: "; + std::cout << "m: " << std::setw(20) << mantissa() << ", e: " << std::setw(12) << exponent() << ", hex: "; std::cout << std::hex << std::uppercase << std::setfill('0'); for (auto const& c : data) std::cout << std::setw(2) << (unsigned)c << " "; @@ -161,8 +154,7 @@ class Number2 : public Number } }; -Bytes const Number2::floatNull = - {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +Bytes const Number2::floatNull = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; struct FloatState { @@ -170,13 +162,9 @@ struct FloatState MantissaRange::mantissa_scale oldScale_; bool good_; - FloatState(int32_t mode) - : oldMode_(Number::getround()) - , oldScale_(Number::getMantissaScale()) - , good_(false) + FloatState(int32_t mode) : oldMode_(Number::getround()), oldScale_(Number::getMantissaScale()), good_(false) { - if (mode < Number::rounding_mode::to_nearest || - mode > Number::rounding_mode::upward) + if (mode < Number::rounding_mode::to_nearest || mode > Number::rounding_mode::upward) return; Number::setround(static_cast(mode)); @@ -208,8 +196,7 @@ floatToString(Slice const& data) { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); + boost::algorithm::hex(data.begin(), data.end(), std::back_inserter(hex)); return "Invalid data: " + hex; } @@ -505,10 +492,7 @@ WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) } Expected -WasmHostFunctionsImpl::floatSet( - int64_t mantissa, - int32_t exponent, - int32_t mode) +WasmHostFunctionsImpl::floatSet(int64_t mantissa, int32_t exponent, int32_t mode) { return wasm_float::floatSetImpl(mantissa, exponent, mode); } @@ -526,19 +510,13 @@ WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) } Expected -WasmHostFunctionsImpl::floatSubtract( - Slice const& x, - Slice const& y, - int32_t mode) +WasmHostFunctionsImpl::floatSubtract(Slice const& x, Slice const& y, int32_t mode) { return wasm_float::floatSubtractImpl(x, y, mode); } Expected -WasmHostFunctionsImpl::floatMultiply( - Slice const& x, - Slice const& y, - int32_t mode) +WasmHostFunctionsImpl::floatMultiply(Slice const& x, Slice const& y, int32_t mode) { return wasm_float::floatMultiplyImpl(x, y, mode); } diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 70fb1b5304b..0a3247604ab 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -126,8 +126,7 @@ getAnyFieldData(FieldValue const& variantObj) static inline bool noField(STBase const* field) { - return !field || (STI_NOTPRESENT == field->getSType()) || - (STI_UNKNOWN == field->getSType()); + return !field || (STI_NOTPRESENT == field->getSType()) || (STI_UNKNOWN == field->getSType()); } static Expected @@ -272,8 +271,7 @@ WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) return Unexpected(normalizedIdx.error()); - return detail::getAnyFieldData( - cache[normalizedIdx.value()]->peekAtPField(fname)); + return detail::getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); } // Subsection: nested getters @@ -303,9 +301,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) } Expected -WasmHostFunctionsImpl::getLedgerObjNestedField( - int32_t cacheIdx, - Slice const& locator) +WasmHostFunctionsImpl::getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) { auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) @@ -351,9 +347,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) } Expected -WasmHostFunctionsImpl::getLedgerObjArrayLen( - int32_t cacheIdx, - SField const& fname) +WasmHostFunctionsImpl::getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) { if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); @@ -397,9 +391,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) } Expected -WasmHostFunctionsImpl::getLedgerObjNestedArrayLen( - int32_t cacheIdx, - Slice const& locator) +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) { auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) diff --git a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp index 89ec35cd3b2..a006b584e41 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp @@ -38,16 +38,12 @@ WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::credentialKeylet( - AccountID const& subject, - AccountID const& issuer, - Slice const& credentialType) +WasmHostFunctionsImpl::credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) { if (!subject || !issuer) return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (credentialType.empty() || - credentialType.size() > maxCredentialTypeLength) + if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HostFunctionError::INVALID_PARAMS); auto const keylet = keylet::credential(subject, issuer, credentialType); @@ -65,9 +61,7 @@ WasmHostFunctionsImpl::didKeylet(AccountID const& account) } Expected -WasmHostFunctionsImpl::delegateKeylet( - AccountID const& account, - AccountID const& authorize) +WasmHostFunctionsImpl::delegateKeylet(AccountID const& account, AccountID const& authorize) { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -78,9 +72,7 @@ WasmHostFunctionsImpl::delegateKeylet( } Expected -WasmHostFunctionsImpl::depositPreauthKeylet( - AccountID const& account, - AccountID const& authorize) +WasmHostFunctionsImpl::depositPreauthKeylet(AccountID const& account, AccountID const& authorize) { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -100,10 +92,7 @@ WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::lineKeylet( - AccountID const& account1, - AccountID const& account2, - Currency const& currency) +WasmHostFunctionsImpl::lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) { if (!account1 || !account2) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -117,9 +106,7 @@ WasmHostFunctionsImpl::lineKeylet( } Expected -WasmHostFunctionsImpl::mptIssuanceKeylet( - AccountID const& issuer, - std::uint32_t seq) +WasmHostFunctionsImpl::mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) { if (!issuer) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -129,9 +116,7 @@ WasmHostFunctionsImpl::mptIssuanceKeylet( } Expected -WasmHostFunctionsImpl::mptokenKeylet( - MPTID const& mptid, - AccountID const& holder) +WasmHostFunctionsImpl::mptokenKeylet(MPTID const& mptid, AccountID const& holder) { if (!mptid) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -143,9 +128,7 @@ WasmHostFunctionsImpl::mptokenKeylet( } Expected -WasmHostFunctionsImpl::nftOfferKeylet( - AccountID const& account, - std::uint32_t seq) +WasmHostFunctionsImpl::nftOfferKeylet(AccountID const& account, std::uint32_t seq) { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -163,9 +146,7 @@ WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::oracleKeylet( - AccountID const& account, - std::uint32_t documentId) +WasmHostFunctionsImpl::oracleKeylet(AccountID const& account, std::uint32_t documentId) { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -174,10 +155,7 @@ WasmHostFunctionsImpl::oracleKeylet( } Expected -WasmHostFunctionsImpl::paychanKeylet( - AccountID const& account, - AccountID const& destination, - std::uint32_t seq) +WasmHostFunctionsImpl::paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) { if (!account || !destination) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -188,9 +166,7 @@ WasmHostFunctionsImpl::paychanKeylet( } Expected -WasmHostFunctionsImpl::permissionedDomainKeylet( - AccountID const& account, - std::uint32_t seq) +WasmHostFunctionsImpl::permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp index 31e90df7ab2..c3b0b955298 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -10,25 +10,18 @@ namespace xrpl { Expected -WasmHostFunctionsImpl::trace( - std::string_view const& msg, - Slice const& data, - bool asHex) +WasmHostFunctionsImpl::trace(std::string_view const& msg, Slice const& data, bool asHex) { if (!asHex) { - log(msg, [&data] { - return std::string_view( - reinterpret_cast(data.data()), data.size()); - }); + log(msg, [&data] { return std::string_view(reinterpret_cast(data.data()), data.size()); }); } else { log(msg, [&data] { std::string hex; hex.reserve(data.size() * 2); - boost::algorithm::hex( - data.begin(), data.end(), std::back_inserter(hex)); + boost::algorithm::hex(data.begin(), data.end(), std::back_inserter(hex)); return hex; }); } @@ -44,27 +37,21 @@ WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) } Expected -WasmHostFunctionsImpl::traceAccount( - std::string_view const& msg, - AccountID const& account) +WasmHostFunctionsImpl::traceAccount(std::string_view const& msg, AccountID const& account) { log(msg, [&account] { return toBase58(account); }); return 0; } Expected -WasmHostFunctionsImpl::traceFloat( - std::string_view const& msg, - Slice const& data) +WasmHostFunctionsImpl::traceFloat(std::string_view const& msg, Slice const& data) { log(msg, [&data] { return wasm_float::floatToString(data); }); return 0; } Expected -WasmHostFunctionsImpl::traceAmount( - std::string_view const& msg, - STAmount const& amount) +WasmHostFunctionsImpl::traceAmount(std::string_view const& msg, STAmount const& amount) { log(msg, [&amount] { return amount.getFullText(); }); return 0; diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index da768ff6eb2..ffae4de7eda 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -11,12 +11,7 @@ namespace xrpl { using SFieldCRef = std::reference_wrapper; static int32_t -setData( - InstanceWrapper const* runtime, - int32_t dst, - int32_t dstSize, - uint8_t const* src, - int32_t srcSize) +setData(InstanceWrapper const* runtime, int32_t dst, int32_t dstSize, uint8_t const* src, int32_t srcSize) { if (!srcSize) return 0; // LCOV_EXCL_LINE @@ -98,11 +93,7 @@ getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) template Expected -getDataSlice( - IW const* runtime, - wasm_val_vec_t const* params, - int32_t& i, - bool isUpdate = false) +getDataSlice(IW const* runtime, wasm_val_vec_t const* params, int32_t& i, bool isUpdate = false) { int64_t const ptr = params->data[i].of.i32; int64_t const size = params->data[i + 1].of.i32; @@ -209,9 +200,8 @@ getDataAsset(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) if (slice->size() == (AccountID::bytes + Currency::bytes)) { - auto const issue = Issue( - Currency::fromVoid(slice->data()), - AccountID::fromVoid(slice->data() + Currency::bytes)); + auto const issue = + Issue(Currency::fromVoid(slice->data()), AccountID::fromVoid(slice->data() + Currency::bytes)); if (issue.native()) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -228,8 +218,7 @@ getDataString(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) auto const slice = getDataSlice(runtime, params, i); if (!slice) return Unexpected(slice.error()); - return std::string_view( - reinterpret_cast(slice->data()), slice->size()); + return std::string_view(reinterpret_cast(slice->data()), slice->size()); } std::nullptr_t @@ -267,23 +256,13 @@ returnResult( { return hfResult( results, - setData( - runtime, - params->data[index].of.i32, - params->data[index + 1].of.i32, - res->data(), - res->size())); + setData(runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), res->size())); } else if constexpr (std::is_same_v) { return hfResult( results, - setData( - runtime, - params->data[index].of.i32, - params->data[index + 1].of.i32, - res->data(), - res->size())); + setData(runtime, params->data[index].of.i32, params->data[index + 1].of.i32, res->data(), res->size())); } else if constexpr (std::is_same_v) { @@ -303,8 +282,7 @@ returnResult( } else { - static_assert( - [] { return false; }(), "Unhandled return type in returnResult"); + static_assert([] { return false; }(), "Unhandled return type in returnResult"); } } @@ -325,9 +303,9 @@ checkGas(void* env) auto const* runtime = reinterpret_cast(hf->getRT()); if (!runtime) { - wasm_trap_t* trap = reinterpret_cast( - WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE - return Unexpected(trap); // LCOV_EXCL_LINE + wasm_trap_t* trap = + reinterpret_cast(WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE + return Unexpected(trap); // LCOV_EXCL_LINE } int64_t const gas = runtime->getGas(); @@ -336,15 +314,14 @@ checkGas(void* env) if (runtime->setGas(x) < 0) { - wasm_trap_t* trap = reinterpret_cast( - WasmEngine::instance().newTrap("can't set gas")); // LCOV_EXCL_LINE - return Unexpected(trap); // LCOV_EXCL_LINE + wasm_trap_t* trap = + reinterpret_cast(WasmEngine::instance().newTrap("can't set gas")); // LCOV_EXCL_LINE + return Unexpected(trap); // LCOV_EXCL_LINE } if (gas < impFunc.gas) { - wasm_trap_t* trap = reinterpret_cast( - WasmEngine::instance().newTrap("hf out of gas")); + wasm_trap_t* trap = reinterpret_cast(WasmEngine::instance().newTrap("hf out of gas")); return Unexpected(trap); } @@ -353,10 +330,7 @@ checkGas(void* env) //---------------------------------------------------------------------------------------------------------------------- wasm_trap_t* -getLedgerSqn_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getLedgerSqn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -368,10 +342,7 @@ getLedgerSqn_wrap( } wasm_trap_t* -getParentLedgerTime_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getParentLedgerTime_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -379,15 +350,11 @@ getParentLedgerTime_wrap( auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult( - runtime, params, results, hf->getParentLedgerTime(), index); + return returnResult(runtime, params, results, hf->getParentLedgerTime(), index); } wasm_trap_t* -getParentLedgerHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getParentLedgerHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -395,15 +362,11 @@ getParentLedgerHash_wrap( auto const* runtime = reinterpret_cast(hf->getRT()); int index = 0; - return returnResult( - runtime, params, results, hf->getParentLedgerHash(), index); + return returnResult(runtime, params, results, hf->getParentLedgerHash(), index); } wasm_trap_t* -getBaseFee_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getBaseFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -415,10 +378,7 @@ getBaseFee_wrap( } wasm_trap_t* -isAmendmentEnabled_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +isAmendmentEnabled_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -434,8 +394,7 @@ isAmendmentEnabled_wrap( if (slice->size() == uint256::bytes) { - if (auto ret = hf->isAmendmentEnabled(uint256::fromVoid(slice->data())); - *ret == 1) + if (auto ret = hf->isAmendmentEnabled(uint256::fromVoid(slice->data())); *ret == 1) { return returnResult(runtime, params, results, ret, index); } @@ -446,17 +405,12 @@ isAmendmentEnabled_wrap( return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); } - auto const str = std::string_view( - reinterpret_cast(slice->data()), slice->size()); - return returnResult( - runtime, params, results, hf->isAmendmentEnabled(str), index); + auto const str = std::string_view(reinterpret_cast(slice->data()), slice->size()); + return returnResult(runtime, params, results, hf->isAmendmentEnabled(str), index); } wasm_trap_t* -cacheLedgerObj_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +cacheLedgerObj_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -476,15 +430,11 @@ cacheLedgerObj_wrap( return hfResult(results, cache.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->cacheLedgerObj(*id, *cache), index); + return returnResult(runtime, params, results, hf->cacheLedgerObj(*id, *cache), index); } wasm_trap_t* -getTxField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getTxField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -497,15 +447,11 @@ getTxField_wrap( { return hfResult(results, fname.error()); } - return returnResult( - runtime, params, results, hf->getTxField(*fname), index); + return returnResult(runtime, params, results, hf->getTxField(*fname), index); } wasm_trap_t* -getCurrentLedgerObjField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getCurrentLedgerObjField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -519,15 +465,11 @@ getCurrentLedgerObjField_wrap( return hfResult(results, fname.error()); } - return returnResult( - runtime, params, results, hf->getCurrentLedgerObjField(*fname), index); + return returnResult(runtime, params, results, hf->getCurrentLedgerObjField(*fname), index); } wasm_trap_t* -getLedgerObjField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getLedgerObjField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -547,15 +489,11 @@ getLedgerObjField_wrap( return hfResult(results, fname.error()); } - return returnResult( - runtime, params, results, hf->getLedgerObjField(*cache, *fname), index); + return returnResult(runtime, params, results, hf->getLedgerObjField(*cache, *fname), index); } wasm_trap_t* -getTxNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getTxNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -569,15 +507,11 @@ getTxNestedField_wrap( return hfResult(results, bytes.error()); } - return returnResult( - runtime, params, results, hf->getTxNestedField(*bytes), index); + return returnResult(runtime, params, results, hf->getTxNestedField(*bytes), index); } wasm_trap_t* -getCurrentLedgerObjNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getCurrentLedgerObjNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -590,19 +524,11 @@ getCurrentLedgerObjNestedField_wrap( { return hfResult(results, bytes.error()); } - return returnResult( - runtime, - params, - results, - hf->getCurrentLedgerObjNestedField(*bytes), - index); + return returnResult(runtime, params, results, hf->getCurrentLedgerObjNestedField(*bytes), index); } wasm_trap_t* -getLedgerObjNestedField_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getLedgerObjNestedField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -622,19 +548,11 @@ getLedgerObjNestedField_wrap( return hfResult(results, bytes.error()); } - return returnResult( - runtime, - params, - results, - hf->getLedgerObjNestedField(*cache, *bytes), - index); + return returnResult(runtime, params, results, hf->getLedgerObjNestedField(*cache, *bytes), index); } wasm_trap_t* -getTxArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getTxArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -648,15 +566,11 @@ getTxArrayLen_wrap( return hfResult(results, fname.error()); } - return returnResult( - runtime, params, results, hf->getTxArrayLen(*fname), index); + return returnResult(runtime, params, results, hf->getTxArrayLen(*fname), index); } wasm_trap_t* -getCurrentLedgerObjArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getCurrentLedgerObjArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -670,19 +584,11 @@ getCurrentLedgerObjArrayLen_wrap( return hfResult(results, fname.error()); } - return returnResult( - runtime, - params, - results, - hf->getCurrentLedgerObjArrayLen(*fname), - index); + return returnResult(runtime, params, results, hf->getCurrentLedgerObjArrayLen(*fname), index); } wasm_trap_t* -getLedgerObjArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getLedgerObjArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -702,19 +608,11 @@ getLedgerObjArrayLen_wrap( return hfResult(results, fname.error()); } - return returnResult( - runtime, - params, - results, - hf->getLedgerObjArrayLen(*cache, *fname), - index); + return returnResult(runtime, params, results, hf->getLedgerObjArrayLen(*cache, *fname), index); } wasm_trap_t* -getTxNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getTxNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -728,15 +626,11 @@ getTxNestedArrayLen_wrap( return hfResult(results, bytes.error()); } - return returnResult( - runtime, params, results, hf->getTxNestedArrayLen(*bytes), index); + return returnResult(runtime, params, results, hf->getTxNestedArrayLen(*bytes), index); } wasm_trap_t* -getCurrentLedgerObjNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getCurrentLedgerObjNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -750,18 +644,10 @@ getCurrentLedgerObjNestedArrayLen_wrap( return hfResult(results, bytes.error()); } - return returnResult( - runtime, - params, - results, - hf->getCurrentLedgerObjNestedArrayLen(*bytes), - index); + return returnResult(runtime, params, results, hf->getCurrentLedgerObjNestedArrayLen(*bytes), index); } wasm_trap_t* -getLedgerObjNestedArrayLen_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getLedgerObjNestedArrayLen_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -780,19 +666,11 @@ getLedgerObjNestedArrayLen_wrap( { return hfResult(results, bytes.error()); } - return returnResult( - runtime, - params, - results, - hf->getLedgerObjNestedArrayLen(*cache, *bytes), - index); + return returnResult(runtime, params, results, hf->getLedgerObjNestedArrayLen(*cache, *bytes), index); } wasm_trap_t* -updateData_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +updateData_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -806,15 +684,11 @@ updateData_wrap( return hfResult(results, bytes.error()); } - return returnResult( - runtime, params, results, hf->updateData(*bytes), index); + return returnResult(runtime, params, results, hf->updateData(*bytes), index); } wasm_trap_t* -checkSignature_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +checkSignature_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -840,19 +714,11 @@ checkSignature_wrap( return hfResult(results, pubkey.error()); } - return returnResult( - runtime, - params, - results, - hf->checkSignature(*message, *signature, *pubkey), - index); + return returnResult(runtime, params, results, hf->checkSignature(*message, *signature, *pubkey), index); } wasm_trap_t* -computeSha512HalfHash_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +computeSha512HalfHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -865,15 +731,11 @@ computeSha512HalfHash_wrap( { return hfResult(results, bytes.error()); } - return returnResult( - runtime, params, results, hf->computeSha512HalfHash(*bytes), index); + return returnResult(runtime, params, results, hf->computeSha512HalfHash(*bytes), index); } wasm_trap_t* -accountKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +accountKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -887,8 +749,7 @@ accountKeylet_wrap( return hfResult(results, acc.error()); } - return returnResult( - runtime, params, results, hf->accountKeylet(*acc), index); + return returnResult(runtime, params, results, hf->accountKeylet(*acc), index); } wasm_trap_t* @@ -912,19 +773,11 @@ ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, issue2.error()); } - return returnResult( - runtime, - params, - results, - hf->ammKeylet(issue1.value(), issue2.value()), - index); + return returnResult(runtime, params, results, hf->ammKeylet(issue1.value(), issue2.value()), index); } wasm_trap_t* -checkKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +checkKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -944,15 +797,11 @@ checkKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); + return returnResult(runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); } wasm_trap_t* -credentialKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +credentialKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -978,19 +827,11 @@ credentialKeylet_wrap( return hfResult(results, credType.error()); } - return returnResult( - runtime, - params, - results, - hf->credentialKeylet(*subj, *iss, *credType), - index); + return returnResult(runtime, params, results, hf->credentialKeylet(*subj, *iss, *credType), index); } wasm_trap_t* -delegateKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +delegateKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1010,19 +851,11 @@ delegateKeylet_wrap( return hfResult(results, authorize.error()); } - return returnResult( - runtime, - params, - results, - hf->delegateKeylet(acc.value(), authorize.value()), - index); + return returnResult(runtime, params, results, hf->delegateKeylet(acc.value(), authorize.value()), index); } wasm_trap_t* -depositPreauthKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +depositPreauthKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1042,12 +875,7 @@ depositPreauthKeylet_wrap( return hfResult(results, authorize.error()); } - return returnResult( - runtime, - params, - results, - hf->depositPreauthKeylet(acc.value(), authorize.value()), - index); + return returnResult(runtime, params, results, hf->depositPreauthKeylet(acc.value(), authorize.value()), index); } wasm_trap_t* @@ -1065,15 +893,11 @@ didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, acc.error()); } - return returnResult( - runtime, params, results, hf->didKeylet(acc.value()), index); + return returnResult(runtime, params, results, hf->didKeylet(acc.value()), index); } wasm_trap_t* -escrowKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +escrowKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1093,15 +917,11 @@ escrowKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->escrowKeylet(*acc, *seq), index); + return returnResult(runtime, params, results, hf->escrowKeylet(*acc, *seq), index); } wasm_trap_t* -lineKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +lineKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1127,19 +947,11 @@ lineKeylet_wrap( return hfResult(results, currency.error()); } - return returnResult( - runtime, - params, - results, - hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), - index); + return returnResult(runtime, params, results, hf->lineKeylet(acc1.value(), acc2.value(), currency.value()), index); } wasm_trap_t* -mptIssuanceKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +mptIssuanceKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1159,19 +971,11 @@ mptIssuanceKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->mptIssuanceKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->mptIssuanceKeylet(acc.value(), seq.value()), index); } wasm_trap_t* -mptokenKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +mptokenKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1197,19 +1001,11 @@ mptokenKeylet_wrap( return hfResult(results, holder.error()); } - return returnResult( - runtime, - params, - results, - hf->mptokenKeylet(mptid, holder.value()), - index); + return returnResult(runtime, params, results, hf->mptokenKeylet(mptid, holder.value()), index); } wasm_trap_t* -nftOfferKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +nftOfferKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1229,19 +1025,11 @@ nftOfferKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->nftOfferKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->nftOfferKeylet(acc.value(), seq.value()), index); } wasm_trap_t* -offerKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +offerKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1261,19 +1049,11 @@ offerKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->offerKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->offerKeylet(acc.value(), seq.value()), index); } wasm_trap_t* -oracleKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +oracleKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1292,15 +1072,11 @@ oracleKeylet_wrap( { return hfResult(results, documentId.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); + return returnResult(runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); } wasm_trap_t* -paychanKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +paychanKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1326,19 +1102,11 @@ paychanKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->paychanKeylet(acc.value(), dest.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->paychanKeylet(acc.value(), dest.value(), seq.value()), index); } wasm_trap_t* -permissionedDomainKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +permissionedDomainKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1358,19 +1126,11 @@ permissionedDomainKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->permissionedDomainKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->permissionedDomainKeylet(acc.value(), seq.value()), index); } wasm_trap_t* -signersKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +signersKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1384,15 +1144,11 @@ signersKeylet_wrap( return hfResult(results, acc.error()); } - return returnResult( - runtime, params, results, hf->signersKeylet(acc.value()), index); + return returnResult(runtime, params, results, hf->signersKeylet(acc.value()), index); } wasm_trap_t* -ticketKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +ticketKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1412,19 +1168,11 @@ ticketKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->ticketKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); } wasm_trap_t* -vaultKeylet_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +vaultKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1444,12 +1192,7 @@ vaultKeylet_wrap( return hfResult(results, seq.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, - params, - results, - hf->vaultKeylet(acc.value(), seq.value()), - index); + return returnResult(runtime, params, results, hf->vaultKeylet(acc.value(), seq.value()), index); } wasm_trap_t* @@ -1473,15 +1216,11 @@ getNFT_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFT(*acc, *nftId), index); + return returnResult(runtime, params, results, hf->getNFT(*acc, *nftId), index); } wasm_trap_t* -getNFTIssuer_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getNFTIssuer_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1495,15 +1234,11 @@ getNFTIssuer_wrap( return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFTIssuer(*nftId), index); + return returnResult(runtime, params, results, hf->getNFTIssuer(*nftId), index); } wasm_trap_t* -getNFTTaxon_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getNFTTaxon_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1517,15 +1252,11 @@ getNFTTaxon_wrap( return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFTTaxon(*nftId), index); + return returnResult(runtime, params, results, hf->getNFTTaxon(*nftId), index); } wasm_trap_t* -getNFTFlags_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getNFTFlags_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1539,15 +1270,11 @@ getNFTFlags_wrap( return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFTFlags(*nftId), index); + return returnResult(runtime, params, results, hf->getNFTFlags(*nftId), index); } wasm_trap_t* -getNFTTransferFee_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getNFTTransferFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1561,15 +1288,11 @@ getNFTTransferFee_wrap( return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFTTransferFee(*nftId), index); + return returnResult(runtime, params, results, hf->getNFTTransferFee(*nftId), index); } wasm_trap_t* -getNFTSerial_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +getNFTSerial_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1583,8 +1306,7 @@ getNFTSerial_wrap( return hfResult(results, nftId.error()); } - return returnResult( - runtime, params, results, hf->getNFTSerial(*nftId), index); + return returnResult(runtime, params, results, hf->getNFTSerial(*nftId), index); } wasm_trap_t* @@ -1619,8 +1341,7 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, asHex.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->trace(*msg, *data, *asHex), index); + return returnResult(runtime, params, results, hf->trace(*msg, *data, *asHex), index); } wasm_trap_t* @@ -1648,15 +1369,11 @@ traceNum_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, number.error()); // LCOV_EXCL_LINE } - return returnResult( - runtime, params, results, hf->traceNum(*msg, *number), index); + return returnResult(runtime, params, results, hf->traceNum(*msg, *number), index); } wasm_trap_t* -traceAccount_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +traceAccount_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1675,15 +1392,11 @@ traceAccount_wrap( if (!account) return hfResult(results, account.error()); - return returnResult( - runtime, params, results, hf->traceAccount(*msg, *account), i); + return returnResult(runtime, params, results, hf->traceAccount(*msg, *account), i); } wasm_trap_t* -traceFloat_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +traceFloat_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1702,15 +1415,11 @@ traceFloat_wrap( if (!number) return hfResult(results, number.error()); - return returnResult( - runtime, params, results, hf->traceFloat(*msg, *number), i); + return returnResult(runtime, params, results, hf->traceFloat(*msg, *number), i); } wasm_trap_t* -traceAmount_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +traceAmount_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1744,15 +1453,11 @@ traceAmount_wrap( if (!amount) return hfResult(results, HostFunctionError::INVALID_PARAMS); - return returnResult( - runtime, params, results, hf->traceAmount(*msg, *amount), i); + return returnResult(runtime, params, results, hf->traceAmount(*msg, *amount), i); } wasm_trap_t* -floatFromInt_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatFromInt_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1770,15 +1475,11 @@ floatFromInt_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 1; - return returnResult( - runtime, params, results, hf->floatFromInt(*x, *rounding), i); + return returnResult(runtime, params, results, hf->floatFromInt(*x, *rounding), i); } wasm_trap_t* -floatFromUint_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatFromUint_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1796,8 +1497,7 @@ floatFromUint_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; - return returnResult( - runtime, params, results, hf->floatFromUint(*x, *rounding), i); + return returnResult(runtime, params, results, hf->floatFromUint(*x, *rounding), i); } wasm_trap_t* @@ -1823,15 +1523,11 @@ floatSet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; - return returnResult( - runtime, params, results, hf->floatSet(*mant, *exp, *rounding), i); + return returnResult(runtime, params, results, hf->floatSet(*mant, *exp, *rounding), i); } wasm_trap_t* -floatCompare_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatCompare_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1873,15 +1569,11 @@ floatAdd_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; - return returnResult( - runtime, params, results, hf->floatAdd(*x, *y, *rounding), i); + return returnResult(runtime, params, results, hf->floatAdd(*x, *y, *rounding), i); } wasm_trap_t* -floatSubtract_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatSubtract_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1903,15 +1595,11 @@ floatSubtract_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; - return returnResult( - runtime, params, results, hf->floatSubtract(*x, *y, *rounding), i); + return returnResult(runtime, params, results, hf->floatSubtract(*x, *y, *rounding), i); } wasm_trap_t* -floatMultiply_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatMultiply_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1933,15 +1621,11 @@ floatMultiply_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; - return returnResult( - runtime, params, results, hf->floatMultiply(*x, *y, *rounding), i); + return returnResult(runtime, params, results, hf->floatMultiply(*x, *y, *rounding), i); } wasm_trap_t* -floatDivide_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatDivide_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -1963,8 +1647,7 @@ floatDivide_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 4; - return returnResult( - runtime, params, results, hf->floatDivide(*x, *y, *rounding), i); + return returnResult(runtime, params, results, hf->floatDivide(*x, *y, *rounding), i); } wasm_trap_t* @@ -1990,15 +1673,11 @@ floatRoot_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 3; - return returnResult( - runtime, params, results, hf->floatRoot(*x, *n, *rounding), i); + return returnResult(runtime, params, results, hf->floatRoot(*x, *n, *rounding), i); } wasm_trap_t* -floatPower_wrap( - void* env, - wasm_val_vec_t const* params, - wasm_val_vec_t* results) +floatPower_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { if (auto g = checkGas(env); !g) return g.error(); // LCOV_EXCL_LINE @@ -2020,8 +1699,7 @@ floatPower_wrap( return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 3; - return returnResult( - runtime, params, results, hf->floatPower(*x, *n, *rounding), i); + return returnResult(runtime, params, results, hf->floatPower(*x, *n, *rounding), i); } wasm_trap_t* @@ -2043,8 +1721,7 @@ floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, rounding.error()); // LCOV_EXCL_LINE i = 2; - return returnResult( - runtime, params, results, hf->floatLog(*x, *rounding), i); + return returnResult(runtime, params, results, hf->floatLog(*x, *rounding), i); } // LCOV_EXCL_START @@ -2072,8 +1749,7 @@ testGetDataIncrement() { wasm_val_t values[4]; - std::array buffer = { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; + std::array buffer = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; MockInstanceWrapper runtime(wmem{buffer.data(), buffer.size()}); { @@ -2134,18 +1810,14 @@ testGetDataIncrement() int index = 0; auto const result = getDataString(&runtime, ¶ms, index); - if (!result || - result.value() != - std::string_view( - reinterpret_cast(buffer.data()), 5) || + if (!result || result.value() != std::string_view(reinterpret_cast(buffer.data()), 5) || index != 2) return false; } { // test account - AccountID const id(calcAccountID( - generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); + AccountID const id(calcAccountID(generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); wasm_val_vec_t params = {2, &values[0]}; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index c7fa3bbb5b9..23edbd2370b 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -112,14 +112,7 @@ runEscrowWasm( auto& vm = WasmEngine::instance(); // vm.initMaxPages(MAX_PAGES); - auto const ret = vm.run( - wasmCode, - funcName, - params, - createWasmImport(*hfs), - hfs, - gasLimit, - hfs->getJournal()); + auto const ret = vm.run(wasmCode, funcName, params, createWasmImport(*hfs), hfs, gasLimit, hfs->getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -133,8 +126,7 @@ runEscrowWasm( } #ifdef DEBUG_OUTPUT - std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost - << std::endl; + std::cout << ", ret: " << ret->result << ", gas spent: " << ret->cost << std::endl; #endif return EscrowResult{ret->result, ret->cost}; } @@ -150,13 +142,7 @@ preflightEscrowWasm( auto& vm = WasmEngine::instance(); // vm.initMaxPages(MAX_PAGES); - auto const ret = vm.check( - wasmCode, - funcName, - params, - createWasmImport(*hfs), - hfs, - hfs->getJournal()); + auto const ret = vm.check(wasmCode, funcName, params, createWasmImport(*hfs), hfs, hfs->getJournal()); return ret; } diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index a0f8b612da8..6ef0315b975 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -30,8 +30,7 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) if (error_message.size) { - j << "WASMI Error: " << msg << ", " - << std::string_view(error_message.data, error_message.size - 1); + j << "WASMI Error: " << msg << ", " << std::string_view(error_message.data, error_message.size - 1); } else j << "WASMI Error: " << msg; @@ -52,17 +51,10 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) } // namespace InstancePtr -InstanceWrapper::init( - StorePtr& s, - ModulePtr& m, - WasmExternVec& expt, - WasmExternVec const& imports, - beast::Journal j) +InstanceWrapper::init(StorePtr& s, ModulePtr& m, WasmExternVec& expt, WasmExternVec const& imports, beast::Journal j) { wasm_trap_t* trap = nullptr; - InstancePtr mi = InstancePtr( - wasm_instance_new(s.get(), m.get(), &imports.vec_, &trap), - &wasm_instance_delete); + InstancePtr mi = InstancePtr(wasm_instance_new(s.get(), m.get(), &imports.vec_, &trap), &wasm_instance_delete); if (!mi || trap) { @@ -78,18 +70,13 @@ InstanceWrapper::InstanceWrapper() : instance_(nullptr, &wasm_instance_delete) } // LCOV_EXCL_START -InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) - : instance_(nullptr, &wasm_instance_delete) +InstanceWrapper::InstanceWrapper(InstanceWrapper&& o) : instance_(nullptr, &wasm_instance_delete) { *this = std::move(o); } // LCOV_EXCL_STOP -InstanceWrapper::InstanceWrapper( - StorePtr& s, - ModulePtr& m, - WasmExternVec const& imports, - beast::Journal j) +InstanceWrapper::InstanceWrapper(StorePtr& s, ModulePtr& m, WasmExternVec const& imports, beast::Journal j) : store_(s.get()), instance_(init(s, m, exports_, imports, j)), j_(j) { } @@ -118,9 +105,7 @@ InstanceWrapper::operator bool() const } FuncInfo -InstanceWrapper::getFunc( - std::string_view funcName, - WasmExporttypeVec const& exportTypes) const +InstanceWrapper::getFunc(std::string_view funcName, WasmExporttypeVec const& exportTypes) const { wasm_func_t const* f = nullptr; wasm_functype_t const* ft = nullptr; @@ -155,8 +140,7 @@ InstanceWrapper::getFunc( } if (!f || !ft) - throw std::runtime_error( - "can't find function <" + std::string(funcName) + ">"); + throw std::runtime_error("can't find function <" + std::string(funcName) + ">"); return {f, ft}; } @@ -168,9 +152,7 @@ InstanceWrapper::getMem() const { auto* e(exports_.vec_.data[memIdx_]); wasm_memory_t* mem = wasm_extern_as_memory(e); - return { - reinterpret_cast(wasm_memory_data(mem)), - wasm_memory_data_size(mem)}; + return {reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; } wasm_memory_t* mem = nullptr; @@ -188,9 +170,7 @@ InstanceWrapper::getMem() const if (!mem) return {}; // LCOV_EXCL_LINE - return { - reinterpret_cast(wasm_memory_data(mem)), - wasm_memory_data_size(mem)}; + return {reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; } std::int64_t @@ -211,8 +191,7 @@ InstanceWrapper::setGas(std::int64_t gas) const if (gas < 0) gas = std::numeric_limits::max(); - wasmi_error_t* err = - wasm_store_set_fuel(store_, static_cast(gas)); + wasmi_error_t* err = wasm_store_set_fuel(store_, static_cast(gas)); if (err) { // LCOV_EXCL_START @@ -231,8 +210,7 @@ ModulePtr ModuleWrapper::init(StorePtr& s, Bytes const& wasmBin, beast::Journal j) { wasm_byte_vec_t const code{wasmBin.size(), (char*)(wasmBin.data())}; - ModulePtr m = - ModulePtr(wasm_module_new(s.get(), &code), &wasm_module_delete); + ModulePtr m = ModulePtr(wasm_module_new(s.get(), &code), &wasm_module_delete); if (!m) throw std::runtime_error("can't create module"); @@ -244,8 +222,7 @@ ModuleWrapper::ModuleWrapper() : module_(nullptr, &wasm_module_delete) { } -ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) - : module_(nullptr, &wasm_module_delete) +ModuleWrapper::ModuleWrapper(ModuleWrapper&& o) : module_(nullptr, &wasm_module_delete) { *this = std::move(o); } @@ -342,9 +319,7 @@ makeImpReturn(WasmImportFunc const& imp) } WasmExternVec -ModuleWrapper::buildImports( - StorePtr& s, - std::shared_ptr const& imports) +ModuleWrapper::buildImports(StorePtr& s, std::shared_ptr const& imports) { WasmImporttypeVec importTypes; wasm_module_imports(module_.get(), &importTypes.vec_); @@ -366,12 +341,9 @@ ModuleWrapper::buildImports( wasm_name_t const* fn = wasm_importtype_name(importType); auto fieldName = std::string_view(fn->data, fn->size); - wasm_externkind_t const itype = - wasm_externtype_kind(wasm_importtype_type(importType)); + wasm_externkind_t const itype = wasm_externtype_kind(wasm_importtype_type(importType)); if ((itype) != WASM_EXTERN_FUNC) - throw std::runtime_error( - "Invalid import type " + - std::to_string(itype)); // LCOV_EXCL_LINE + throw std::runtime_error("Invalid import type " + std::to_string(itype)); // LCOV_EXCL_LINE // for multi-module support // if ((W_ENV != modName) && (W_HOST_LIB != modName)) @@ -387,25 +359,18 @@ ModuleWrapper::buildImports( WasmValtypeVec params(makeImpParams(imp)); WasmValtypeVec results(makeImpReturn(imp)); - std::unique_ptr - ftype( - wasm_functype_new(¶ms.vec_, &results.vec_), - &wasm_functype_delete); + std::unique_ptr ftype( + wasm_functype_new(¶ms.vec_, &results.vec_), &wasm_functype_delete); params.release(); results.release(); wasm_func_t* func = wasm_func_new_with_env( - s.get(), - ftype.get(), - reinterpret_cast(imp.wrap), - (void*)&obj, - nullptr); + s.get(), ftype.get(), reinterpret_cast(imp.wrap), (void*)&obj, nullptr); if (!func) { // LCOV_EXCL_START - throw std::runtime_error( - "can't create import function " + imp.name); + throw std::runtime_error("can't create import function " + imp.name); // LCOV_EXCL_STOP } @@ -418,16 +383,15 @@ ModuleWrapper::buildImports( if (!impSet) { - print_wasm_error( - "Import not found: " + std::string(fieldName), nullptr, j_); + print_wasm_error("Import not found: " + std::string(fieldName), nullptr, j_); } } if (impCnt != importTypes.vec_.size) { print_wasm_error( - std::string("Imports not finished: ") + std::to_string(impCnt) + - "/" + std::to_string(importTypes.vec_.size), + std::string("Imports not finished: ") + std::to_string(impCnt) + "/" + + std::to_string(importTypes.vec_.size), nullptr, j_); throw std::runtime_error("Missing imports"); @@ -450,16 +414,13 @@ ModuleWrapper::getFuncType(std::string_view funcName) const auto const* exp_type(exportTypes_.vec_.data[i]); wasm_name_t const* name = wasm_exporttype_name(exp_type); wasm_externtype_t const* exn_type = wasm_exporttype_type(exp_type); - if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC && - funcName == std::string_view(name->data, name->size)) + if (wasm_externtype_kind(exn_type) == WASM_EXTERN_FUNC && funcName == std::string_view(name->data, name->size)) { - return wasm_externtype_as_functype( - const_cast(exn_type)); + return wasm_externtype_as_functype(const_cast(exn_type)); } } - throw std::runtime_error( - "can't find function <" + std::string(funcName) + ">"); + throw std::runtime_error("can't find function <" + std::string(funcName) + ">"); } wmem @@ -534,8 +495,7 @@ WasmiEngine::init() wasm_engine_new_with_config(config), &wasm_engine_delete); } -WasmiEngine::WasmiEngine() - : engine_(init()), store_(nullptr, &wasm_store_delete) +WasmiEngine::WasmiEngine() : engine_(init()), store_(nullptr, &wasm_store_delete) { } @@ -544,14 +504,11 @@ WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) { moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store - store_ = { - wasm_store_new_with_memory_max_pages(engine_.get(), MAX_PAGES), - &wasm_store_delete}; + store_ = {wasm_store_new_with_memory_max_pages(engine_.get(), MAX_PAGES), &wasm_store_delete}; if (gas < 0) gas = std::numeric_limits::max(); - wasmi_error_t* err = - wasm_store_set_fuel(store_.get(), static_cast(gas)); + wasmi_error_t* err = wasm_store_set_fuel(store_.get(), static_cast(gas)); if (err) { // LCOV_EXCL_START @@ -561,12 +518,10 @@ WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) // LCOV_EXCL_STOP } - moduleWrap_ = std::make_unique( - store_, wasmCode, instantiate, imports_, j_); + moduleWrap_ = std::make_unique(store_, wasmCode, instantiate, imports_, j_); if (!moduleWrap_) - throw std::runtime_error( - "can't create module wrapper"); // LCOV_EXCL_LINE + throw std::runtime_error("can't create module wrapper"); // LCOV_EXCL_LINE return moduleWrap_ ? 0 : -1; } @@ -603,8 +558,7 @@ WasmiEngine::convertParams(std::vector const& params) case WT_U8V: { auto mem = getMem(); if (!mem.s) - throw std::runtime_error( - "no memory exported"); // LCOV_EXCL_LINE + throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE auto const sz = p.of.u8v.sz; auto const ptr = allocate(sz); memcpy(mem.p + ptr, p.of.u8v.d, sz); @@ -614,8 +568,7 @@ WasmiEngine::convertParams(std::vector const& params) break; // LCOV_EXCL_START default: - throw std::runtime_error( - "unknown parameter type: " + std::to_string(p.type)); + throw std::runtime_error("unknown parameter type: " + std::to_string(p.type)); break; // LCOV_EXCL_STOP } @@ -625,9 +578,7 @@ WasmiEngine::convertParams(std::vector const& params) } int -WasmiEngine::compareParamTypes( - wasm_valtype_vec_t const* ftp, - std::vector const& p) +WasmiEngine::compareParamTypes(wasm_valtype_vec_t const* ftp, std::vector const& p) { if (ftp->size != p.size()) return std::min(ftp->size, p.size()); @@ -684,10 +635,9 @@ WasmiEngine::call(FuncInfo const& f, Types&&... args) static inline uint64_t usecs() { - uint64_t x = - std::chrono::duration_cast( - std::chrono::high_resolution_clock::now().time_since_epoch()) - .count(); + uint64_t x = std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count(); return x; } #endif @@ -701,9 +651,7 @@ WasmiEngine::call(FuncInfo const& f, std::vector& in) // if (NR) { wasm_val_vec_new_uninitialized(&ret, NR); // // wasm_val_vec_new(&ret, NR, &rs[0]); // ret = WASM_ARRAY_VEC(rs); } - wasm_val_vec_t const inv = in.empty() - ? wasm_val_vec_t WASM_EMPTY_VEC - : wasm_val_vec_t{in.size(), in.data()}; + wasm_val_vec_t const inv = in.empty() ? wasm_val_vec_t WASM_EMPTY_VEC : wasm_val_vec_t{in.size(), in.data()}; #ifdef SHOW_CALL_TIME auto const start = usecs(); @@ -731,11 +679,7 @@ WasmiEngine::call(FuncInfo const& f, std::vector& in) template WasmiResult -WasmiEngine::call( - FuncInfo const& f, - std::vector& in, - std::int32_t p, - Types&&... args) +WasmiEngine::call(FuncInfo const& f, std::vector& in, std::int32_t p, Types&&... args) { add_param(in, p); return call(f, in, std::forward(args)...); @@ -743,11 +687,7 @@ WasmiEngine::call( template WasmiResult -WasmiEngine::call( - FuncInfo const& f, - std::vector& in, - std::int64_t p, - Types&&... args) +WasmiEngine::call(FuncInfo const& f, std::vector& in, std::int64_t p, Types&&... args) { add_param(in, p); return call(f, in, std::forward(args)...); @@ -755,12 +695,7 @@ WasmiEngine::call( template WasmiResult -WasmiEngine::call( - FuncInfo const& f, - std::vector& in, - uint8_t const* d, - int32_t sz, - Types&&... args) +WasmiEngine::call(FuncInfo const& f, std::vector& in, uint8_t const* d, int32_t sz, Types&&... args) { auto mem = getMem(); if (!mem.s) @@ -776,11 +711,7 @@ WasmiEngine::call( template WasmiResult -WasmiEngine::call( - FuncInfo const& f, - std::vector& in, - Bytes const& p, - Types&&... args) +WasmiEngine::call(FuncInfo const& f, std::vector& in, Bytes const& p, Types&&... args) { return call(f, in, p.data(), p.size(), std::forward(args)...); } @@ -833,11 +764,7 @@ WasmiEngine::run( } Expected, TER> -WasmiEngine::runHlp( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params, - int64_t gas) +WasmiEngine::runHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, int64_t gas) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); @@ -863,26 +790,22 @@ WasmiEngine::runHlp( auto p = convertParams(params); if (int const comp = compareParamTypes(ftp, p); comp >= 0) - throw std::runtime_error( - "invalid parameter type #" + std::to_string(comp)); + throw std::runtime_error("invalid parameter type #" + std::to_string(comp)); auto const res = call<1>(f, p); if (res.f) throw std::runtime_error("<" + std::string(funcName) + "> failure"); else if (!res.r.vec_.size) - throw std::runtime_error( - "<" + std::string(funcName) + - "> return nothing"); // LCOV_EXCL_LINE + throw std::runtime_error("<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE else if (res.r.vec_.data[0].kind != WASM_I32) throw std::runtime_error( - "<" + std::string(funcName) + "> return type mismatch, ret: " + - std::to_string(static_cast(res.r.vec_.data[0].kind))); + "<" + std::string(funcName) + + "> return type mismatch, ret: " + std::to_string(static_cast(res.r.vec_.data[0].kind))); if (gas == -1) gas = std::numeric_limits::max(); - WasmResult const ret{ - res.r.vec_.data[0].of.i32, gas - moduleWrap_->getGas()}; + WasmResult const ret{res.r.vec_.data[0].of.i32, gas - moduleWrap_->getGas()}; // #ifdef DEBUG_OUTPUT // auto& j = std::cerr; @@ -932,10 +855,7 @@ WasmiEngine::check( } NotTEC -WasmiEngine::checkHlp( - Bytes const& wasmCode, - std::string_view funcName, - std::vector const& params) +WasmiEngine::checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); @@ -949,14 +869,12 @@ WasmiEngine::checkHlp( throw std::runtime_error("no module"); // LCOV_EXCL_LINE // Looking for a func and compare parameter types - auto const f = - moduleWrap_->getFuncType(!funcName.empty() ? funcName : "_start"); + auto const f = moduleWrap_->getFuncType(!funcName.empty() ? funcName : "_start"); auto const* ftp = wasm_functype_params(f); auto const p = convertParams(params); if (int const comp = compareParamTypes(ftp, p); comp >= 0) - throw std::runtime_error( - "invalid parameter type #" + std::to_string(comp)); + throw std::runtime_error("invalid parameter type #" + std::to_string(comp)); return tesSUCCESS; } @@ -987,21 +905,17 @@ int32_t WasmiEngine::allocate(int32_t sz) { if (sz <= 0) - throw std::runtime_error( - "can't allocate memory, " + std::to_string(sz) + " bytes"); + throw std::runtime_error("can't allocate memory, " + std::to_string(sz) + " bytes"); auto res = call<1>(W_ALLOC, sz); if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32)) - throw std::runtime_error( - "can't allocate memory, " + std::to_string(sz) + - " bytes"); // LCOV_EXCL_LINE + throw std::runtime_error("can't allocate memory, " + std::to_string(sz) + " bytes"); // LCOV_EXCL_LINE int32_t const p = res.r.vec_.data[0].of.i32; auto const mem = getMem(); if (p <= 0 || p + sz > mem.s) - throw std::runtime_error( - "invalid memory allocation, " + std::to_string(sz) + " bytes"); + throw std::runtime_error("invalid memory allocation, " + std::to_string(sz) + " bytes"); return p; } From 69c61b22351553d27a0398c2f557caa1d0bd4347 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 28 Jan 2026 16:52:27 -0500 Subject: [PATCH 168/212] fix merge issues --- src/xrpld/app/misc/FeeVoteImpl.cpp | 246 +++++++++++++++-------------- 1 file changed, 129 insertions(+), 117 deletions(-) diff --git a/src/xrpld/app/misc/FeeVoteImpl.cpp b/src/xrpld/app/misc/FeeVoteImpl.cpp index eedfb9d0c8f..41b70cfcfc0 100644 --- a/src/xrpld/app/misc/FeeVoteImpl.cpp +++ b/src/xrpld/app/misc/FeeVoteImpl.cpp @@ -184,135 +184,147 @@ FeeVoteImpl::doVoting( if (isLegalAmountSigned(vote)) value.addVote(vote); else - { value.noVote(); - } - }; - - for (auto const& val : set) + } + else { - if (!val->isTrusted()) - continue; - doVote(val, baseFeeVote, sfBaseFeeDrops); - doVote(val, baseReserveVote, sfReserveBaseDrops); - doVote(val, incReserveVote, sfReserveIncrementDrops); + value.noVote(); } - } else + }; + + for (auto const& val : set) { - auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, - auto const& valueField) { - if (auto const field = val->at(~valueField)) - { - using XRPType = XRPAmount::value_type; - auto const vote = *field; - if (vote <= std::numeric_limits::max() && - isLegalAmountSigned(XRPAmount{unsafe_cast(vote)})) - value.addVote(XRPAmount{unsafe_cast(vote)}); - else - { - value.noVote(); - } - }; - - for (auto const& val : set) - { - if (!val->isTrusted()) - continue; - doVote(val, baseFeeVote, sfBaseFee); - doVote(val, baseReserveVote, sfReserveBase); - doVote(val, incReserveVote, sfReserveIncrement); - } - } if (rules.enabled(featureSmartEscrow)) + if (!val->isTrusted()) + continue; + doVote(val, baseFeeVote, sfBaseFeeDrops); + doVote(val, baseReserveVote, sfReserveBaseDrops); + doVote(val, incReserveVote, sfReserveIncrementDrops); + } + } + else + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + auto const& valueField) { + if (auto const field = val->at(~valueField)) { - auto doVote = [](std::shared_ptr const& val, - detail::VotableValue& value, - SF_UINT32 const& extensionField) { - if (auto const field = ~val->at(~extensionField); field) - { - value.addVote(field.value()); - } - else - { - value.noVote(); - } - }; - - for (auto const& val : set) - { - if (!val->isTrusted()) - continue; - doVote(val, extensionComputeVote, sfExtensionComputeLimit); - doVote(val, extensionSizeVote, sfExtensionSizeLimit); - doVote(val, gasPriceVote, sfGasPrice); - } + using XRPType = XRPAmount::value_type; + auto const vote = *field; + if (vote <= std::numeric_limits::max() && + isLegalAmountSigned(XRPAmount{unsafe_cast(vote)})) + value.addVote(XRPAmount{unsafe_cast(vote)}); + else + // Invalid amounts will be treated as if they're + // not provided. Don't throw because this value is + // provided by an external entity. + value.noVote(); } + else + { + value.noVote(); + } + }; - // choose our positions - // TODO: Use structured binding once LLVM 16 is the minimum supported - // version. See also: https://github.com/llvm/llvm-project/issues/48582 - // https://github.com/llvm/llvm-project/commit/127bf44385424891eb04cff8e52d3f157fc2cb7c - auto const baseFee = baseFeeVote.getVotes(); - auto const baseReserve = baseReserveVote.getVotes(); - auto const incReserve = incReserveVote.getVotes(); - auto const extensionCompute = extensionComputeVote.getVotes(); - auto const extensionSize = extensionSizeVote.getVotes(); - auto const gasPrice = gasPriceVote.getVotes(); - - auto const seq = lastClosedLedger->header().seq + 1; - - // add transactions to our position - if (baseFee.second || baseReserve.second || incReserve.second || extensionCompute.second || - extensionSize.second || gasPrice.second) + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, baseFeeVote, sfBaseFee); + doVote(val, baseReserveVote, sfReserveBase); + doVote(val, incReserveVote, sfReserveIncrement); + } + } + if (rules.enabled(featureSmartEscrow)) + { + auto doVote = [](std::shared_ptr const& val, + detail::VotableValue& value, + SF_UINT32 const& extensionField) { + if (auto const field = ~val->at(~extensionField); field) + { + value.addVote(field.value()); + } + else { - JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" << baseReserve.first - << "/" << incReserve.first; - - STTx feeTx(ttFEE, [=, &rules](auto& obj) { - obj[sfAccount] = AccountID(); - obj[sfLedgerSequence] = seq; - if (rules.enabled(featureXRPFees)) - { - obj[sfBaseFeeDrops] = baseFee.first; - obj[sfReserveBaseDrops] = baseReserve.first; - obj[sfReserveIncrementDrops] = incReserve.first; - } - else - { - // Without the featureXRPFees amendment, these fields are - // required. - obj[sfBaseFee] = baseFee.first.dropsAs(baseFeeVote.current()); - obj[sfReserveBase] = baseReserve.first.dropsAs(baseReserveVote.current()); - obj[sfReserveIncrement] = incReserve.first.dropsAs(incReserveVote.current()); - obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; - } - if (rules.enabled(featureSmartEscrow)) - { - obj[sfExtensionComputeLimit] = extensionCompute.first; - obj[sfExtensionSizeLimit] = extensionSize.first; - obj[sfGasPrice] = gasPrice.first; - } - }); - - uint256 txID = feeTx.getTransactionID(); - - JLOG(journal_.warn()) << "Vote: " << txID; - - Serializer s; - feeTx.add(s); - - if (!initialPosition->addGiveItem(SHAMapNodeType::tnTRANSACTION_NM, make_shamapitem(txID, s.slice()))) - { - JLOG(journal_.warn()) << "Ledger already had fee change"; - } + value.noVote(); } + }; + + for (auto const& val : set) + { + if (!val->isTrusted()) + continue; + doVote(val, extensionComputeVote, sfExtensionComputeLimit); + doVote(val, extensionSizeVote, sfExtensionSizeLimit); + doVote(val, gasPriceVote, sfGasPrice); } + } + + // choose our positions + // TODO: Use structured binding once LLVM 16 is the minimum supported + // version. See also: https://github.com/llvm/llvm-project/issues/48582 + // https://github.com/llvm/llvm-project/commit/127bf44385424891eb04cff8e52d3f157fc2cb7c + auto const baseFee = baseFeeVote.getVotes(); + auto const baseReserve = baseReserveVote.getVotes(); + auto const incReserve = incReserveVote.getVotes(); + auto const extensionCompute = extensionComputeVote.getVotes(); + auto const extensionSize = extensionSizeVote.getVotes(); + auto const gasPrice = gasPriceVote.getVotes(); + + auto const seq = lastClosedLedger->header().seq + 1; + + // add transactions to our position + if (baseFee.second || baseReserve.second || incReserve.second || extensionCompute.second || extensionSize.second || + gasPrice.second) + { + JLOG(journal_.warn()) << "We are voting for a fee change: " << baseFee.first << "/" << baseReserve.first << "/" + << incReserve.first; + + STTx feeTx(ttFEE, [=, &rules](auto& obj) { + obj[sfAccount] = AccountID(); + obj[sfLedgerSequence] = seq; + if (rules.enabled(featureXRPFees)) + { + obj[sfBaseFeeDrops] = baseFee.first; + obj[sfReserveBaseDrops] = baseReserve.first; + obj[sfReserveIncrementDrops] = incReserve.first; + } + else + { + // Without the featureXRPFees amendment, these fields are + // required. + obj[sfBaseFee] = baseFee.first.dropsAs(baseFeeVote.current()); + obj[sfReserveBase] = baseReserve.first.dropsAs(baseReserveVote.current()); + obj[sfReserveIncrement] = incReserve.first.dropsAs(incReserveVote.current()); + obj[sfReferenceFeeUnits] = Config::FEE_UNITS_DEPRECATED; + } + if (rules.enabled(featureSmartEscrow)) + { + obj[sfExtensionComputeLimit] = extensionCompute.first; + obj[sfExtensionSizeLimit] = extensionSize.first; + obj[sfGasPrice] = gasPrice.first; + } + }); + + uint256 txID = feeTx.getTransactionID(); - //------------------------------------------------------------------------------ + JLOG(journal_.warn()) << "Vote: " << txID; - std::unique_ptr make_FeeVote(FeeSetup const& setup, beast::Journal journal) + Serializer s; + feeTx.add(s); + + if (!initialPosition->addGiveItem(SHAMapNodeType::tnTRANSACTION_NM, make_shamapitem(txID, s.slice()))) { - return std::make_unique(setup, journal); + JLOG(journal_.warn()) << "Ledger already had fee change"; } + } +} + +//------------------------------------------------------------------------------ + +std::unique_ptr +make_FeeVote(FeeSetup const& setup, beast::Journal journal) +{ + return std::make_unique(setup, journal); +} - } // namespace xrpl +} // namespace xrpl From 7c8279ec83d5c0246568b75de44a305e14ad6b0c Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 3 Feb 2026 16:08:46 -0500 Subject: [PATCH 169/212] use buffers for uint32 WASM params (#6291) --- src/test/app/HostFuncImpl_test.cpp | 32 - src/test/app/TestHostFunctions.h | 38 +- src/test/app/Wasm_test.cpp | 25 +- .../all_host_functions/Cargo.lock | 4 +- .../all_host_functions/Cargo.toml | 2 +- .../all_host_functions/src/lib.rs | 23 +- .../app/wasm_fixtures/all_keylets/Cargo.lock | 4 +- .../app/wasm_fixtures/all_keylets/Cargo.toml | 2 +- src/test/app/wasm_fixtures/bad_align.c | 48 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 4 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 376 +++- src/test/app/wasm_fixtures/copyFixtures.py | 14 +- src/test/app/wasm_fixtures/fixtures.cpp | 1543 ++++++++--------- src/test/app/wasm_fixtures/fixtures.h | 2 +- .../app/wasm_fixtures/float_tests/Cargo.lock | 4 +- .../app/wasm_fixtures/float_tests/Cargo.toml | 2 +- src/test/app/wasm_fixtures/ledgerSqn.c | 23 +- src/xrpld/app/wasm/HostFunc.h | 6 +- src/xrpld/app/wasm/HostFuncImpl.h | 6 +- src/xrpld/app/wasm/HostFuncWrapper.h | 27 +- .../wasm/detail/HostFuncImplLedgerHeader.cpp | 21 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 71 +- 23 files changed, 1237 insertions(+), 1042 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 811166c0138..d786c4498a1 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -117,16 +117,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->parentCloseTime().time_since_epoch().count()); } - - env.close(env.now() + std::chrono::seconds(std::numeric_limits::max() - 1)); - { - OpenView ov{*env.current()}; - ApplyContext ac = createApplyContext(env, ov); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - auto const result = hfs.getParentLedgerTime(); - if (BEAST_EXPECTS(!result.has_value(), std::to_string(result.value()))) - BEAST_EXPECT(result.error() == HostFunctionError::INTERNAL); - } } void @@ -163,28 +153,6 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.getBaseFee(); if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(result.value() == env.current()->fees().base.drops()); - - { - Env env2( - *this, - envconfig([](std::unique_ptr cfg) { - cfg->FEES.reference_fee = static_cast(std::numeric_limits::max()) + 1; - return cfg; - }), - testable_amendments()); - // Run past the flag ledger so that a Fee change vote occurs and - // updates FeeSettings. (It also activates all supported - // amendments.) - for (auto i = env.current()->seq(); i <= 257; ++i) - env.close(); - - OpenView ov2{*env2.current()}; - ApplyContext ac2 = createApplyContext(env2, ov2); - WasmHostFunctionsImpl hfs2(ac2, dummyEscrow); - auto const result2 = hfs2.getBaseFee(); - if (BEAST_EXPECT(!result2.has_value())) - BEAST_EXPECT(result2.error() == HostFunctionError::INTERNAL); - } } void diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 85f8049e94c..68cf42b362b 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -35,7 +35,7 @@ struct TestLedgerDataProvider : public HostFunctions return rt_; } - Expected + Expected getLedgerSqn() override { return env_.current()->seq(); @@ -70,13 +70,13 @@ struct TestHostFunctions : public HostFunctions return rt_; } - Expected + Expected getLedgerSqn() override { return 12345; } - Expected + Expected getParentLedgerTime() override { return 67890; @@ -88,7 +88,7 @@ struct TestHostFunctions : public HostFunctions return env_.current()->header().parentHash; } - Expected + Expected getBaseFee() override { return 10; @@ -298,6 +298,15 @@ struct TestHostFunctions : public HostFunctions return Bytes{keylet.key.begin(), keylet.key.end()}; } + Expected + checkKeylet(AccountID const& account, std::uint32_t seq) override + { + if (!account) + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + auto const keylet = keylet::check(account, seq); + return Bytes{keylet.key.begin(), keylet.key.end()}; + } + Expected credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override { @@ -538,22 +547,16 @@ struct PerfHostFunctions : public TestHostFunctions { } - Expected + Expected getLedgerSqn() override { - auto seq = env_.current()->seq(); - if (seq > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE - return static_cast(seq); + return env_.current()->seq(); } - Expected + Expected getParentLedgerTime() override { - auto time = env_.current()->parentCloseTime().time_since_epoch().count(); - if (time > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(time); + return env_.current()->parentCloseTime().time_since_epoch().count(); } Expected @@ -562,13 +565,10 @@ struct PerfHostFunctions : public TestHostFunctions return env_.current()->header().parentHash; } - Expected + Expected getBaseFee() override { - auto fee = env_.current()->fees().base.drops(); - if (fee > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(fee); + return env_.current()->fees().base.drops(); } Expected diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 3305ca03b89..c4ca26250ca 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -182,7 +182,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = engine.run(ledgerSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); - checkResult(re, 0, 151); + checkResult(re, 0, 440); env.close(); env.close(); @@ -190,7 +190,7 @@ struct Wasm_test : public beast::unit_test::suite // empty module - run the same instance re = engine.run({}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); - checkResult(re, 5, 190); + checkResult(re, 5, 488); } void @@ -257,7 +257,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); - checkResult(re, 1, 25'503); + checkResult(re, 1, 27'080); env.close(); } @@ -278,7 +278,7 @@ struct Wasm_test : public beast::unit_test::suite auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); - checkResult(re, 1, 64'763); + checkResult(re, 1, 66'340); env.close(); } @@ -315,14 +315,14 @@ struct Wasm_test : public beast::unit_test::suite { std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - checkResult(re, 1, 64'763); + checkResult(re, 1, 66'340); } { // max() gas std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); - checkResult(re, 1, 64'763); + checkResult(re, 1, 66'340); } { // fail because trying to access nonexistent field @@ -340,7 +340,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - checkResult(re, -201, 28'148); + checkResult(re, -201, 28'965); } { // fail because trying to allocate more than MAX_PAGES memory @@ -358,7 +358,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new BadTestHostFunctions(env)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); - checkResult(re, -201, 28'148); + checkResult(re, -201, 28'965); } { // fail because recursion too deep @@ -574,7 +574,7 @@ struct Wasm_test : public beast::unit_test::suite auto const codecovWasm = hexToBytes(codecovTestsWasmHex); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const allowance = 187'131; + auto const allowance = 201'503; auto re = runEscrowWasm(codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); checkResult(re, 1, allowance); @@ -794,7 +794,7 @@ struct Wasm_test : public beast::unit_test::suite testcase("Wasm Bad Align"); // bad_align.c - auto const badAlignWasm = hexToBytes(badAlignHex); + auto const badAlignWasm = hexToBytes(badAlignWasmHex); using namespace test::jtx; @@ -807,7 +807,10 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run(badAlignWasm, "test", {}, imports, hfs, 1'000'000, env.journal); - BEAST_EXPECT(re && re->result == 0xbab88d46); + if (BEAST_EXPECTS(re, transToken(re.error()))) + { + BEAST_EXPECTS(re->result == 0x684f7941, std::to_string(re->result)); + } } env.close(); diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock index 25ea64bbd24..dc4aa73edb7 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml index 82f6ce05a35..102eb32cc04 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs index 942e1c67c6a..444fcaddfa2 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs +++ b/src/test/app/wasm_fixtures/all_host_functions/src/lib.rs @@ -97,22 +97,27 @@ fn test_ledger_header_functions() -> i32 { let _ = trace("--- Category 1: Ledger Header Functions ---"); // Test 1.1: get_ledger_sqn() - should return current ledger sequence number - let sqn_result = unsafe { host::get_ledger_sqn() }; + let mut sqn_buffer = [0u8; 4]; + let sqn_result = unsafe { host::get_ledger_sqn(sqn_buffer.as_mut_ptr(), sqn_buffer.len()) }; if sqn_result <= 0 { let _ = trace_num("ERROR: get_ledger_sqn failed:", sqn_result as i64); return -101; // Ledger sequence number test failed } - let _ = trace_num("Ledger sequence number:", sqn_result as i64); + let ledger_sqn = u32::from_be_bytes(sqn_buffer); + let _ = trace_num("Ledger sequence number:", ledger_sqn as i64); // Test 1.2: get_parent_ledger_time() - should return parent ledger timestamp - let time_result = unsafe { host::get_parent_ledger_time() }; + let mut time_buffer = [0u8; 4]; + let time_result = + unsafe { host::get_parent_ledger_time(time_buffer.as_mut_ptr(), time_buffer.len()) }; if time_result <= 0 { let _ = trace_num("ERROR: get_parent_ledger_time failed:", time_result as i64); return -102; // Parent ledger time test failed } - let _ = trace_num("Parent ledger time:", time_result as i64); + let parent_ledger_time = u32::from_be_bytes(time_buffer); + let _ = trace_num("Parent ledger time:", parent_ledger_time as i64); // Test 1.3: get_parent_ledger_hash() - should return parent ledger hash (32 bytes) let mut hash_buffer = [0u8; 32]; @@ -616,11 +621,14 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.3: escrow_keylet() - Generate keylet for escrow let mut escrow_keylet_buffer = [0u8; 32]; + let sequence_number: i32 = 1000; + let sequence_number_bytes = sequence_number.to_be_bytes(); let escrow_keylet_result = unsafe { host::escrow_keylet( account_id.0.as_ptr(), account_id.0.len(), - 1000, // Sequence number + sequence_number_bytes.as_ptr(), + sequence_number_bytes.len(), escrow_keylet_buffer.as_mut_ptr(), escrow_keylet_buffer.len(), ) @@ -634,11 +642,14 @@ fn test_keylet_generation_functions() -> i32 { // Test 5.4: oracle_keylet() - Generate keylet for oracle let mut oracle_keylet_buffer = [0u8; 32]; + let document_id: i32 = 42; + let document_id_bytes = document_id.to_be_bytes(); let oracle_keylet_result = unsafe { host::oracle_keylet( account_id.0.as_ptr(), account_id.0.len(), - 42, // Document ID + document_id_bytes.as_ptr(), + document_id_bytes.len(), oracle_keylet_buffer.as_mut_ptr(), oracle_keylet_buffer.len(), ) diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index 88a6e34459b..d45ec0df789 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml index 823de4127d2..abd232e636e 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/bad_align.c b/src/test/app/wasm_fixtures/bad_align.c index ff29456c2a5..edb045560d8 100644 --- a/src/test/app/wasm_fixtures/bad_align.c +++ b/src/test/app/wasm_fixtures/bad_align.c @@ -3,21 +3,45 @@ int32_t float_from_uint(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); int32_t -get_tx_nested_field(uint8_t const*, int32_t, uint8_t*, int32_t); +check_keylet(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); -uint8_t e_data[32 * 1024]; +uint8_t e_data1[32 * 1024]; +uint8_t e_data2[32 * 1024]; + +int32_t +test1() +{ + e_data1[1] = 0xFF; + e_data1[2] = 0xFF; + e_data1[3] = 0xFF; + e_data1[4] = 0xFF; + e_data1[5] = 0xFF; + e_data1[6] = 0xFF; + e_data1[7] = 0xFF; + e_data1[8] = 0xFF; + int32_t result = float_from_uint(&e_data1[1], 8, &e_data1[35], 12, 0); + return result >= 0 ? *((int32_t*)(&e_data1[36])) : result; +} + +int32_t +test2() +{ + // Set up misaligned uint32 (seq) at offset 1 + e_data2[1] = 0xFF; + e_data2[2] = 0xFF; + e_data2[3] = 0xFF; + e_data2[4] = 0xFF; + // Set up valid non-zero AccountID (20 bytes) at offset 10 + for (int i = 0; i < 20; i++) + e_data2[10 + i] = i + 1; + // Call check_keylet with misaligned uint32 at &e_data2[1] to hit line 72 in HostFuncWrapper.cpp + int32_t result = check_keylet(&e_data2[10], 20, &e_data2[1], 4, &e_data2[35], 32); + // Return the misaligned value directly to validate it was read correctly (-1 if all 0xFF) + return result >= 0 ? *((int32_t*)(&e_data2[36])) : result; +} int32_t test() { - e_data[1] = 0xFF; - e_data[2] = 0xFF; - e_data[3] = 0xFF; - e_data[4] = 0xFF; - e_data[5] = 0xFF; - e_data[6] = 0xFF; - e_data[7] = 0xFF; - e_data[8] = 0xFF; - float_from_uint(&e_data[1], 8, &e_data[35], 12, 0); - return *((int32_t*)(&e_data[36])); + return test1() + test2(); } diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index e44fd147556..4a4b71bdcce 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index 5031bcb5665..81a682bb379 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index aa05eec9d98..5e58d13ecdf 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -55,12 +55,20 @@ pub extern "C" fn finish() -> i32 { // that's in a separate test file (all_keylets). // The float tests are also in a separate file (float_tests). // ######################################## - check_result(unsafe { host::get_ledger_sqn() }, 12345, "get_ledger_sqn"); - check_result( - unsafe { host::get_parent_ledger_time() }, - 67890, - "get_parent_ledger_time", - ); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_ledger_sqn(ptr, len) }, + 4, + "get_ledger_sqn", + ); + }); + with_buffer::<4, _, _>(|ptr, len| { + check_result( + unsafe { host::get_parent_ledger_time(ptr, len) }, + 4, + "get_parent_ledger_time", + ); + }); with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { host::get_parent_ledger_hash(ptr, len) }, @@ -68,7 +76,9 @@ pub extern "C" fn finish() -> i32 { "get_parent_ledger_hash", ); }); - check_result(unsafe { host::get_base_fee() }, 10, "get_base_fee"); + with_buffer::<4, _, _>(|ptr, len| { + check_result(unsafe { host::get_base_fee(ptr, len) }, 4, "get_base_fee"); + }); let amendment_name: &[u8] = b"test_amendment"; let amendment_id: [u8; 32] = [1; 32]; check_result( @@ -312,38 +322,6 @@ pub extern "C" fn finish() -> i32 { // Step #3: Test getData[Type] edge cases // ######################################## - // uint64 - with_buffer::<32, _, _>(|ptr, len| { - check_result( - unsafe { - host::float_from_uint( - locator.as_ptr().wrapping_add(1_000_000_000), - 8, - ptr, - len, - FLOAT_ROUNDING_MODES_TO_NEAREST, - ) - }, - error_codes::POINTER_OUT_OF_BOUNDS, - "float_from_uint_len_oob", - ) - }); - with_buffer::<32, _, _>(|ptr, len| { - check_result( - unsafe { - host::float_from_uint( - locator.as_ptr(), - locator.len(), - ptr, - len, - FLOAT_ROUNDING_MODES_TO_NEAREST, - ) - }, - error_codes::INVALID_PARAMS, - "float_from_uint_wrong_len", - ) - }); - // SField check_result( unsafe { host::get_tx_array_len(2) }, // not a valid SField value @@ -381,6 +359,72 @@ pub extern "C" fn finish() -> i32 { "get_tx_nested_array_len_ptr_oob", ); + // uint32 + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::check_keylet( + account.0.as_ptr(), + account.0.len(), + locator.as_ptr().wrapping_add(1_000_000_000), + 8, + ptr, + len, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "check_keylet_oob_len_u32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::check_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "check_keylet_wrong_len_u32", + ) + }); + + // uint64 + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_from_uint( + locator.as_ptr().wrapping_add(1_000_000_000), + 8, + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::POINTER_OUT_OF_BOUNDS, + "float_from_uint_len_oob", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::float_from_uint( + locator.as_ptr(), + locator.len(), + ptr, + len, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }, + error_codes::INVALID_PARAMS, + "float_from_uint_wrong_len_uint64", + ) + }); + // uint256 check_result( unsafe { @@ -1011,6 +1055,155 @@ pub extern "C" fn finish() -> i32 { ) }); + // invalid UInt32 + + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::escrow_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "escrow_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::mpt_issuance_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "mpt_issuance_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::nft_offer_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "nft_offer_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::offer_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "offer_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::oracle_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "oracle_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::paychan_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "paychan_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::permissioned_domain_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "permissioned_domain_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::ticket_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "ticket_keylet_wrong_size_uint32", + ) + }); + with_buffer::<32, _, _>(|ptr, len| { + check_result( + unsafe { + host::vault_keylet( + account.0.as_ptr(), + account.0.len(), + account.0.as_ptr(), + account.0.len(), + ptr, + len, + ) + }, + error_codes::INVALID_PARAMS, + "vault_keylet_wrong_size_uint32", + ) + }); + // invalid UInt256 check_result( @@ -1075,9 +1268,20 @@ pub extern "C" fn finish() -> i32 { "account_keylet_wrong_size_accountid", ) }); + let seq: i32 = 1; + let seq_bytes = seq.to_be_bytes(); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::check_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::check_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "check_keylet_wrong_size_accountid", ) @@ -1191,7 +1395,16 @@ pub extern "C" fn finish() -> i32 { }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::escrow_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::escrow_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "escrow_keylet_wrong_size_accountid", ) @@ -1234,7 +1447,16 @@ pub extern "C" fn finish() -> i32 { }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::mpt_issuance_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::mpt_issuance_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "mpt_issuance_keylet_wrong_size_accountid", ) @@ -1257,21 +1479,48 @@ pub extern "C" fn finish() -> i32 { }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::nft_offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::nft_offer_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "nft_offer_keylet_wrong_size_accountid", ) }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::offer_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::offer_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "offer_keylet_wrong_size_accountid", ) }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::oracle_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::oracle_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "oracle_keylet_wrong_size_accountid", ) @@ -1284,7 +1533,8 @@ pub extern "C" fn finish() -> i32 { locator.len(), account.0.as_ptr(), account.0.len(), - 1, + seq_bytes.as_ptr(), + seq_bytes.len(), ptr, len, ) @@ -1301,7 +1551,8 @@ pub extern "C" fn finish() -> i32 { account.0.len(), locator.as_ptr(), // invalid AccountID size locator.len(), - 1, + seq_bytes.as_ptr(), + seq_bytes.len(), ptr, len, ) @@ -1313,7 +1564,14 @@ pub extern "C" fn finish() -> i32 { with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { - host::permissioned_domain_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) + host::permissioned_domain_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) }, error_codes::INVALID_PARAMS, "permissioned_domain_keylet_wrong_size_accountid", @@ -1328,14 +1586,32 @@ pub extern "C" fn finish() -> i32 { }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::ticket_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::ticket_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "ticket_keylet_wrong_size_accountid", ) }); with_buffer::<2, _, _>(|ptr, len| { check_result( - unsafe { host::vault_keylet(locator.as_ptr(), locator.len(), 1, ptr, len) }, + unsafe { + host::vault_keylet( + locator.as_ptr(), + locator.len(), + seq_bytes.as_ptr(), + seq_bytes.len(), + ptr, + len, + ) + }, error_codes::INVALID_PARAMS, "vault_keylet_wrong_size_accountid", ) diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index cd53184b5e7..2c0abc560d0 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -54,12 +54,7 @@ def process_rust(project_name): ")" ) try: - result = subprocess.run( - build_cmd, shell=True, check=True, capture_output=True, text=True - ) - print(f"stdout: {result.stdout}") - if result.stderr: - print(f"stderr: {result.stderr}") + subprocess.run(build_cmd, shell=True, check=True) print(f"WASM file for {project_name} has been built and optimized.") except subprocess.CalledProcessError as e: print(f"exec error: {e}") @@ -91,12 +86,7 @@ def process_c(project_name): f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" ) try: - result = subprocess.run( - build_cmd, shell=True, check=True, capture_output=True, text=True - ) - print(f"stdout: {result.stdout}") - if result.stderr: - print(f"stderr: {result.stderr}") + subprocess.run(build_cmd, shell=True, check=True) print( f"WASM file for {project_name} has been built with WASI support using clang." ) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 6bff4527057..9df5201e9ff 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -104,238 +104,239 @@ extern std::string const sha512PureWasmHex = "7065732b0a6d756c746976616c7565"; extern std::string const ledgerSqnWasmHex = - "0061736d010000000108026000017f60000002160103656e760e6765745f6c65646765725f" - "73716e000003030201000503010002063e0a7f004180080b7f004180080b7f004180100b7f" - "004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b" - "7f0041010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300" - "010666696e69736800020362756603000c5f5f64736f5f68616e646c6503010a5f5f646174" - "615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d" - "5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" - "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a" - "150202000b1001017f100022004100200041044b1b0b007f0970726f647563657273010c70" - "726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868" - "747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061" - "62346235613264623538323935386166316565333038613739306366646234326264323437" - "32302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976" - "616c7565"; + "0061736d01000000010e0360027f7f017f6000006000017f02160103656e760e6765745f6c65646765725f73716e0000030302010205030100" + "02063f0a7f01418088040b7f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f" + "0041000b7f0041010b07aa010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300010666696e69736800020c5f5f64736f" + "5f68616e646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f676c6f" + "62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e6403070d5f5f6d656d6f72795f6261736503080c5f5f74" + "61626c655f6261736503090a3d0202000b3801037f230041106b220024002000410c6a410410002101200028020c2102200041106a24002001" + "41054100200241054f1b20014100481b0b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31392e312e35" + "2d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420616234623561326462" + "353832393538616631656533303861373930636664623432626432343732302900490f7461726765745f6665617475726573042b0f6d757461" + "626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60047f7f7f7f017f60027f7f017f60037f7f7f017f60057f7f7f" - "7f7f017f6000017f60017f017f60037f7f7f0060037f7f7e017f60087f7f7f7f7f7f7f7f01" - "7f60067f7f7f7f7f7f017f60017f0060027f7f0002ae061a08686f73745f6c69620c676574" - "5f74785f6669656c64000208686f73745f6c69620974726163655f6e756d000708686f7374" - "5f6c6962057472616365000308686f73745f6c69620e6765745f6c65646765725f73716e00" - "0408686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500040868" - "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000108686f7374" - "5f6c69620d74726163655f6163636f756e74000008686f73745f6c6962136765745f74785f" - "6e65737465645f6669656c64000008686f73745f6c6962106765745f74785f61727261795f" - "6c656e000508686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c65" - "6e000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f66" - "69656c64000208686f73745f6c6962236765745f63757272656e745f6c65646765725f6f62" - "6a5f6e65737465645f6669656c64000008686f73745f6c6962206765745f63757272656e74" - "5f6c65646765725f6f626a5f61727261795f6c656e000508686f73745f6c6962276765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e0001" - "08686f73745f6c69620e6163636f756e745f6b65796c6574000008686f73745f6c69621063" - "616368655f6c65646765725f6f626a000208686f73745f6c6962146765745f6c6564676572" - "5f6f626a5f6669656c64000008686f73745f6c69621b6765745f6c65646765725f6f626a5f" - "6e65737465645f6669656c64000308686f73745f6c6962186765745f6c65646765725f6f62" - "6a5f61727261795f6c656e000108686f73745f6c69621f6765745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e000208686f73745f6c69621163726564656e7469" - "616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000308" - "686f73745f6c69620d6f7261636c655f6b65796c6574000308686f73745f6c696213636f6d" - "707574655f7368613531325f68616c66000008686f73745f6c6962076765745f6e66740009" - "08686f73745f6c69620b7570646174655f6461746100010306050a0b060604050301001106" - "19037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902" - "000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f626173650302" - "0ae61b057c01027f230041206b220124002000027f418180202001410c6a41141000220241" - "14470440024020024100480440200020023602040c010b2000417f3602040b41010c010b20" - "00200129000c370001200041116a2001411c6a280000360000200041096a200141146a2900" - "0037000041000b3a0000200141206a24000b450020012d0000450440200020012900013700" - "00200041106a200141116a280000360000200041086a200141096a2900003700000f0b4180" - "80c000410b20013402041001000b1900200241214f0440000b200020023602042000200136" - "02000b1900200241094f0440000b20002002360204200020013602000bec1901097f230041" - "b0036b22002400418b80c000411b41004100410010021a41a680c000411941004100410010" - "021a41e780c000412b41004100410010021a027f0240024002400240024002400240100322" - "0141004a0440419281c00041172001ad10011a1004220141004c0d0141a981c00041132001" - "ad10011a200041c8016a22034200370300200041c0016a22054200370300200041b8016a22" - "044200370300200042003703b001200041b0016a22064120100522014120470d0241bc81c0" - "00411320064120410110021a41cf81c000412041004100410010021a41dc82c000412e4100" - "4100410010021a200041a0016a410036020020004198016a42003703002000420037039001" - "4181802020004190016a22024114100022014114470d03418a83c00041142002411410061a" - "2000420037037041888018200041f0006a22024108100022014108470d04419e83c0004117" - "420810011a41b583c000412820024108410110021a2000410036025041848008200041d000" - "6a22024104100022014104470d0541dd83c000411520024104410110021a200041013b003c" - "200342003703002005420037030020044200370300200042003703b00102402000413c6a41" - "02200641201007220141004e044041f283c00041142001ad10011a200041306a2006200110" - "1c418684c000410d20002802302000280234410110021a0c010b419384c00041292001ac10" - "011a0b41bc84c00041154183803c1008ac10011a41d184c00041134189803c1008ac10011a" - "02402000413c6a41021009220141004e044041e484c00041142001ad10011a0c010b41f884" - "c000412d2001ac10011a0b41a585c000412341004100410010021a41de86c0004133410041" - "00410010021a2000420037037041828018200041f0006a22014108100a220241004c0d0620" - "024108460440419187c000412b420810011a41bc87c000412f20014108410110021a0c080b" - "41eb87c000412f2002ad10011a200041286a200041f0006a2002101d419a88c00041172000" - "280228200028022c410110021a0c070b41bf82c000411d2001ac10011a419b7f0c070b419a" - "82c00041252001ac10011a419a7f0c060b41ef81c000412b2001ac10011a41997f0c050b41" - "b486c000412a2001ac10011a41b77e0c040b41f385c00041c1002001ac10011a41b67e0c03" - "0b41c885c000412b2001ac10011a41b57e0c020b41b188c00041c5002002ac10011a0b2000" - "41a0016a410036020020004198016a42003703002000420037039001024041818020200041" - "90016a22024114100a220141004a044041f688c000411e2002411410061a0c010b419489c0" - "0041332001ac10011a0b200041013b0050200041c8016a4200370300200041c0016a420037" - "0300200041b8016a4200370300200042003703b0010240200041d0006a4102200041b0016a" - "22014120100b220241004e044041c789c000411c2002ad10011a200041206a20012002101c" - "41e389c000411520002802202000280224410110021a0c010b41f889c00041392002ac1001" - "1a0b41b18ac00041244183803c100cac10011a0240200041d0006a4102100d220141004e04" - "4041d58ac000411c2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041" - "2841004100410010021a41d68bc000412f41004100410010021a200041b0016a2202101a20" - "0041f0006a22012002101b200041a8016a4200370300200041a0016a420037030020004198" - "016a42003703002000420037039001024002400240024002402001411420004190016a2202" - "4120100e22014120460440200241204100100f220441004a044041858cc00041232004ad10" - "011a20004200370350200441828018200041d0006a220141081010220241004c0d02200241" - "0846044041a88cc000412a420810011a41d28cc000412e20014108410110021a0c060b4180" - "8dc000412e2002ad10011a200041186a200041d0006a2002101d41ae8dc000411620002802" - "18200028021c410110021a0c050b41e68fc000413c2004ac10011a200041c8016a42003703" - "00200041c0016a4200370300200041b8016a4200370300200042003703b001410141828018" - "200041b0016a4120101022014100480d020c030b41ba92c000412e2001ac10011a41ef7c0c" - "050b41c48dc000412b2002ac10011a0c020b41a290c00041c1002001ac10011a0b20004101" - "3b00504101200041d0006a4102200041b0016a412010112201410048044041e390c0004135" - "2001ac10011a0b41014183803c101222014100480440419891c00041322001ac10011a0b41" - "01200041d0006a410210132201410048044041ca91c00041392001ac10011a0b418392c000" - "413741004100410010021a0c010b200041013b003c200041c8016a4200370300200041c001" - "6a4200370300200041b8016a4200370300200042003703b001024020042000413c6a410220" - "0041b0016a220141201011220241004e044041ef8dc000411b2002ad10011a200041106a20" - "012002101c418a8ec000411420002802102000280214410110021a0c010b419e8ec0004131" - "2002ac10011a0b41cf8ec000412320044183803c1012ac10011a024020042000413c6a4102" - "1013220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac1001" - "1a0b41c28fc000412441004100410010021a0b41e892c000412f41004100410010021a2000" - "41b0016a2201101a2000413c6a22042001101b200041e8006a4200370300200041e0006a42" - "00370300200041d8006a420037030020004200370350024002400240024002400240200441" - "14200041d0006a22024120100e22014120460440419793c000410f20024120410110021a20" - "004188016a420037030020004180016a4200370300200041f8006a42003703002000420037" - "03700240200441142004411441a693c0004109200041f0006a220141201014220241004a04" - "40200041086a20012002101c41ae93c00041122000280208200028020c410110021a0c010b" - "41c093c000413c2002ac10011a0b200041a8016a22084200370300200041a0016a22034200" - "37030020004198016a2205420037030020004200370390012000413c6a2202411441e80720" - "004190016a22074120101522014120470d0141fc93c000410e20074120410110021a200041" - "c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0" - "0120024114412a200041b0016a22044120101622014120470d02418a94c000410e20044120" - "410110021a419894c000412441004100410010021a419195c000412541004100410010021a" - "20004188016a420037030020004180016a4200370300200041f8006a420037030020004200" - "37037041b695c0004117200041f0006a22024120101722014120470d0341cd95c000410b41" - "b695c0004117410110021a41d895c000411120024120410110021a2004101a200041d0006a" - "22062004101b20084200370300200342003703002005420037030020004200370390010240" - "200422032003410020036b41037122026a22054f0d0020020440200221010340200341003a" - "0000200341016a2103200141016b22010d000b0b200241016b4107490d000340200341003a" - "0000200341076a41003a0000200341066a41003a0000200341056a41003a0000200341046a" - "41003a0000200341036a41003a0000200341026a41003a0000200341016a41003a00002003" - "41086a22032005470d000b0b200541800220026b2201417c716a220320054b044003402005" - "4100360200200541046a22052003490d000b0b024020032001410371220120036a22024f0d" - "002001220504400340200341003a0000200341016a2103200541016b22050d000b0b200141" - "016b4107490d000340200341003a0000200341076a41003a0000200341066a41003a000020" - "0341056a41003a0000200341046a41003a0000200341036a41003a0000200341026a41003a" - "0000200341016a41003a0000200341086a22032002470d000b0b0240200641142007412020" - "044180021018220141004a044041e995c00041102001ad10011a20014181024f0d0641f995" - "c000410920042001410110021a0c010b418296c000412e2001ac10011a0b41b096c0004112" - "41c296c00041074101100222014100480d0541c996c000411d2001ad10011a41e696c00041" - "11422a10014100480d0641f796c000411c420010011a419397c000411a4100410041001002" - "1a41ff97c000412941004100410010021a41a898c000412810192201412846044041d098c0" - "00412741a898c0004128410110021a41f798c000411e41004100410010021a41bf80c00041" - "2841004100410010021a41010c080b419599c000411a2001ac10011a41c37a0c070b41f494" - "c000411d2001ac10011a418b7c0c060b41d894c000411c2001ac10011a41897c0c050b41bc" - "94c000411c2001ac10011a41887c0c040b41dd97c00041222001ac10011a41a77b0c030b00" - "0b41c797c00041162001ac10011a41a57b0c010b41ad97c000411a42a47b10011a41a47b0b" - "200041b0036a24000b0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20" - "484f53542046554e4354494f4e532054455354203d3d3d54657374696e6720323620686f73" - "742066756e6374696f6e73535543434553533a20416c6c20686f73742066756e6374696f6e" - "20746573747320706173736564212d2d2d2043617465676f727920313a204c656467657220" - "4865616465722046756e6374696f6e73202d2d2d4c65646765722073657175656e6365206e" - "756d6265723a506172656e74206c65646765722074696d653a506172656e74206c65646765" - "7220686173683a535543434553533a204c6564676572206865616465722066756e6374696f" - "6e734552524f523a206765745f706172656e745f6c65646765725f686173682077726f6e67" - "206c656e6774683a4552524f523a206765745f706172656e745f6c65646765725f74696d65" - "206661696c65643a4552524f523a206765745f6c65646765725f73716e206661696c65643a" - "2d2d2d2043617465676f727920323a205472616e73616374696f6e20446174612046756e63" - "74696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a5472616e73616374" - "696f6e20466565206c656e6774683a5472616e73616374696f6e2046656520287365726961" - "6c697a65642058525020616d6f756e74293a5472616e73616374696f6e2053657175656e63" - "653a4e6573746564206669656c64206c656e6774683a4e6573746564206669656c643a494e" - "464f3a206765745f74785f6e65737465645f6669656c64206e6f74206170706c696361626c" - "653a5369676e657273206172726179206c656e6774683a4d656d6f73206172726179206c65" - "6e6774683a4e6573746564206172726179206c656e6774683a494e464f3a206765745f7478" - "5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53554343" - "4553533a205472616e73616374696f6e20646174612066756e6374696f6e734552524f523a" - "206765745f74785f6669656c642853657175656e6365292077726f6e67206c656e6774683a" - "4552524f523a206765745f74785f6669656c6428466565292077726f6e67206c656e677468" - "20286578706563746564203820627974657320666f7220585250293a4552524f523a206765" - "745f74785f6669656c64284163636f756e74292077726f6e67206c656e6774683a2d2d2d20" - "43617465676f727920333a2043757272656e74204c6564676572204f626a6563742046756e" - "6374696f6e73202d2d2d43757272656e74206f626a6563742062616c616e6365206c656e67" - "7468202858525020616d6f756e74293a43757272656e74206f626a6563742062616c616e63" - "65202873657269616c697a65642058525020616d6f756e74293a43757272656e74206f626a" - "6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43" - "757272656e74206f626a6563742062616c616e63653a494e464f3a206765745f6375727265" - "6e745f6c65646765725f6f626a5f6669656c642842616c616e636529206661696c65642028" - "6d6179206265206578706563746564293a43757272656e74206c6564676572206f626a6563" - "74206163636f756e743a494e464f3a206765745f63757272656e745f6c65646765725f6f62" - "6a5f6669656c64284163636f756e7429206661696c65643a43757272656e74206e65737465" - "64206669656c64206c656e6774683a43757272656e74206e6573746564206669656c643a49" - "4e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669" - "656c64206e6f74206170706c696361626c653a43757272656e74206f626a65637420536967" - "6e657273206172726179206c656e6774683a43757272656e74206e65737465642061727261" - "79206c656e6774683a494e464f3a206765745f63757272656e745f6c65646765725f6f626a" - "5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a53554343" - "4553533a2043757272656e74206c6564676572206f626a6563742066756e6374696f6e732d" - "2d2d2043617465676f727920343a20416e79204c6564676572204f626a6563742046756e63" - "74696f6e73202d2d2d5375636365737366756c6c7920636163686564206f626a6563742069" - "6e20736c6f743a436163686564206f626a6563742062616c616e6365206c656e6774682028" - "58525020616d6f756e74293a436163686564206f626a6563742062616c616e636520287365" - "7269616c697a65642058525020616d6f756e74293a436163686564206f626a656374206261" - "6c616e6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43616368656420" - "6f626a6563742062616c616e63653a494e464f3a206765745f6c65646765725f6f626a5f66" - "69656c642842616c616e636529206661696c65643a436163686564206e6573746564206669" - "656c64206c656e6774683a436163686564206e6573746564206669656c643a494e464f3a20" - "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c69" - "6361626c653a436163686564206f626a656374205369676e657273206172726179206c656e" - "6774683a436163686564206e6573746564206172726179206c656e6774683a494e464f3a20" - "6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f742061" - "70706c696361626c653a535543434553533a20416e79206c6564676572206f626a65637420" - "66756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f626a206661696c65" - "642028657870656374656420776974682074657374206669787475726573293a494e464f3a" - "206765745f6c65646765725f6f626a5f6669656c64206661696c6564206173206578706563" - "74656420286e6f20636163686564206f626a656374293a494e464f3a206765745f6c656467" - "65725f6f626a5f6e65737465645f6669656c64206661696c65642061732065787065637465" - "643a494e464f3a206765745f6c65646765725f6f626a5f61727261795f6c656e206661696c" - "65642061732065787065637465643a494e464f3a206765745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e206661696c65642061732065787065637465643a5355" - "43434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73202869" - "6e7465726661636520746573746564294552524f523a206163636f756e745f6b65796c6574" - "206661696c656420666f722063616368696e6720746573743a2d2d2d2043617465676f7279" - "20353a204b65796c65742047656e65726174696f6e2046756e6374696f6e73202d2d2d4163" - "636f756e74206b65796c65743a546573745479706543726564656e7469616c206b65796c65" - "743a494e464f3a2063726564656e7469616c5f6b65796c6574206661696c65642028657870" - "6563746564202d20696e74657266616365206973737565293a457363726f77206b65796c65" - "743a4f7261636c65206b65796c65743a535543434553533a204b65796c65742067656e6572" - "6174696f6e2066756e6374696f6e734552524f523a206f7261636c655f6b65796c65742066" - "61696c65643a4552524f523a20657363726f775f6b65796c6574206661696c65643a455252" - "4f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f72" - "7920363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c" - "205741534d20776f726c6421496e70757420646174613a5348413531322068616c66206861" - "73683a4e46542064617461206c656e6774683a4e465420646174613a494e464f3a20676574" - "5f6e6674206661696c656420286578706563746564202d206e6f2073756368204e4654293a" - "54657374207472616365206d6573736167657061796c6f616454726163652066756e637469" - "6f6e206279746573207772697474656e3a54657374206e756d626572207472616365547261" - "63655f6e756d2066756e6374696f6e20737563636565646564535543434553533a20557469" - "6c6974792066756e6374696f6e734552524f523a2074726163655f6e756d2829206661696c" - "65643a4552524f523a2074726163652829206661696c65643a4552524f523a20636f6d7075" - "74655f7368613531325f68616c66206661696c65643a2d2d2d2043617465676f727920373a" - "2044617461205570646174652046756e6374696f6e73202d2d2d55706461746564206c6564" - "67657220656e74727920646174612066726f6d205741534d20746573745375636365737366" - "756c6c792075706461746564206c656467657220656e74727920776974683a535543434553" - "533a2044617461207570646174652066756e6374696f6e734552524f523a20757064617465" - "5f64617461206661696c65643a004d0970726f64756365727302086c616e67756167650104" - "52757374000c70726f6365737365642d6279010572757374631d312e38352e312028346562" - "31363132353020323032352d30332d313529002c0f7461726765745f666561747572657302" - "2b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "0061736d0100000001540c60027f7f017f60037f7f7f017f60047f7f7f7f017f60017f017f" + "60067f7f7f7f7f7f017f60037f7f7f0060057f7f7f7f7f017f60037f7f7e017f60087f7f7f" + "7f7f7f7f7f017f60017f0060027f7f006000017f02ae061a08686f73745f6c69620c676574" + "5f74785f6669656c64000108686f73745f6c69620974726163655f6e756d000708686f7374" + "5f6c6962057472616365000608686f73745f6c69620e6765745f6c65646765725f73716e00" + "0008686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500000868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000008686f7374" + "5f6c6962136765745f74785f6e65737465645f6669656c64000208686f73745f6c69621067" + "65745f74785f61727261795f6c656e000308686f73745f6c6962176765745f74785f6e6573" + "7465645f61727261795f6c656e000008686f73745f6c69621c6765745f63757272656e745f" + "6c65646765725f6f626a5f6669656c64000108686f73745f6c6962236765745f6375727265" + "6e745f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c6962" + "206765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e00030868" + "6f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f61727261795f6c656e000008686f73745f6c69621063616368655f6c65646765725f6f62" + "6a000108686f73745f6c69621163726564656e7469616c5f6b65796c6574000808686f7374" + "5f6c69620d657363726f775f6b65796c6574000408686f73745f6c69620d6f7261636c655f" + "6b65796c6574000408686f73745f6c696213636f6d707574655f7368613531325f68616c66" + "000208686f73745f6c6962076765745f6e6674000408686f73745f6c69620b757064617465" + "5f64617461000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64" + "000208686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f666965" + "6c64000608686f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c65" + "6e000008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f6172" + "7261795f6c656e000108686f73745f6c69620e6163636f756e745f6b65796c657400020868" + "6f73745f6c69620d74726163655f6163636f756e740002030c0b090a05050b050001010300" + "05030100110619037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d" + "656d6f727902000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f" + "6261736503020ac61d0b990101027f230041306b220124002000027f418180202001411c6a" + "4114100022024114470440417f20022002417f4e1b210241010c010b200020012f001c3b00" + "01200041036a2001411e6a2d00003a0000200120012900233703082001200141286a290000" + "37000d200128001f21022000410d6a200129000d3700002000200129030837020841000b3a" + "000020002002360204200141306a24000b460020012d00004101460440418080c000410b20" + "013402041001000b20002001290001370000200041106a200141116a280000360000200041" + "086a200141096a2900003700000b1900200241214f0440000b200020023602042000200136" + "02000b1900200241094f0440000b20002002360204200020013602000bde1a01097f230041" + "b0036b22002400418b80c000411b41014100410010021a41a680c000411941014100410010" + "021a41e780c000412b41014100410010021a20004100360270024002400240024002400240" + "02400240200041f0006a220741041003220141004a0440419281c000411720002802702201" + "41187420014180fe03714108747220014108764180fe037120014118767272ad10011a2000" + "41003602900120004190016a220341041004220141004c0d0141a981c00041132000280290" + "01220141187420014180fe03714108747220014108764180fe037120014118767272ad1001" + "1a200041c8016a22024200370300200041c0016a22054200370300200041b8016a22044200" + "370300200042003703b001200041b0016a22064120100522014120470d0241bc81c0004113" + "20064120410110021a41cf81c000412041014100410010021a41dc82c000412e4101410041" + "0010021a200041a0016a410036020020004198016a42003703002000420037039001418180" + "2020034114100022014114470d03418a83c00041142003101f200042003703704188801820" + "074108100022014108470d04419e83c0004117420810011a41b583c0004128200741084101" + "10021a2000410036024841848008200041c8006a22034104100022014104470d0541dd83c0" + "00411520034104410110021a200041013b0034200242003703002005420037030020044200" + "370300200042003703b0010240200041346a4102200641201006220141004e044041f283c0" + "0041142001ad10011a200041286a20062001101c418684c000410d2000280228200028022c" + "410110021a0c010b419384c00041292001ac10011a0b41bc84c00041154183803c1007ac10" + "011a41d184c00041134189803c1007ac10011a0240200041346a41021008220141004e0440" + "41e484c00041142001ad10011a0c010b41f884c000412d2001ac10011a0b41a585c0004123" + "41014100410010021a41de86c000413341014100410010021a200042003703704182801820" + "0041f0006a220141081009220341004c0d0620034108460440419187c000412b420810011a" + "41bc87c000412f20014108410110021a0c080b41eb87c000412f2003ad10011a200041206a" + "200041f0006a2003101d419a88c000411720002802202000280224410110021a0c070b41bf" + "82c000411d2001ac10011a419b7f21020c070b419a82c00041252001ac10011a419a7f2102" + "0c060b41ef81c000412b2001ac10011a41997f21020c050b41b486c000412a2001ac10011a" + "41b77e21020c040b41f385c00041c1002001ac10011a41b67e21020c030b41c885c000412b" + "2001ac10011a41b57e21020c020b41b188c00041c5002003ac10011a0b200041a0016a4100" + "36020020004198016a4200370300200042003703900102404181802020004190016a220341" + "141009220141004a044041f688c000411e2003101f0c010b419489c00041332001ac10011a" + "0b200041013b0048200041c8016a4200370300200041c0016a4200370300200041b8016a42" + "00370300200042003703b0010240200041c8006a4102200041b0016a22014120100a220341" + "004e044041c789c000411c2003ad10011a200041186a20012003101c41e389c00041152000" + "280218200028021c410110021a0c010b41f889c00041392003ac10011a0b41b18ac0004124" + "4183803c100bac10011a0240200041c8006a4102100c220141004e044041d58ac000411c20" + "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284101410041001002" + "1a41d68bc000412f41014100410010021a200041b0016a2203101a200041f0006a22012003" + "101b200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" + "42003703900102400240024002400240200120004190016a22031020220141204604402003" + "41204100100d220441004a044041858cc00041232004ad10011a2000420037034820042000" + "41c8006a220141081021220341004c0d022003410846044041a88cc000412a420810011a41" + "d28cc000412e20014108410110021a0c060b41808dc000412e2003ad10011a200041106a20" + "0041c8006a2003101d41ae8dc000411620002802102000280214410110021a0c050b41e68f" + "c000413c2004ac10011a200041c8016a4200370300200041c0016a4200370300200041b801" + "6a4200370300200042003703b0014101200041b0016a4120102122014100480d020c030b41" + "ba92c000412e2001ac10011a41ef7c21020c050b41c48dc000412b2003ac10011a0c020b41" + "a290c00041c1002001ac10011a0b200041013b00484101200041c8006a200041b0016a1022" + "2201410048044041e390c00041352001ac10011a0b4101102322014100480440419891c000" + "41322001ac10011a0b4101200041c8006a10242201410048044041ca91c00041392001ac10" + "011a0b418392c000413741014100410010021a0c010b200041013b0034200041c8016a4200" + "370300200041c0016a4200370300200041b8016a4200370300200042003703b00102402004" + "200041346a200041b0016a22011022220341004e044041ef8dc000411b2003ad10011a2000" + "41086a20012003101c418a8ec00041142000280208200028020c410110021a0c010b419e8e" + "c00041312003ac10011a0b41cf8ec000412320041023ac10011a02402004200041346a1024" + "220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b" + "41c28fc000412441014100410010021a0b41e892c000412f41014100410010021a200041b0" + "016a2201101a200041346a22042001101b200041e0006a4200370300200041d8006a420037" + "0300200041d0006a420037030020004200370348024002400240024002402004200041c800" + "6a2203102022014120460440419793c000410f20034120410110021a20004188016a420037" + "030020004180016a4200370300200041f8006a420037030020004200370370024020044114" + "2004411441a693c0004109200041f0006a22014120100e220341004a044020002001200310" + "1c41ae93c000411220002802002000280204410110021a0c010b41c093c000413c2003ac10" + "011a0b200041a8016a22064200370300200041a0016a2202420037030020004198016a2205" + "4200370300200042003703900120004180808cc07e360268200041346a22034114200041e8" + "006a410420004190016a22084120100f22014120470d0141fc93c000410e20084120410110" + "021a200041c8016a4200370300200041c0016a4200370300200041b8016a42003703002000" + "42003703b001200041808080d00236026c20034114200041ec006a4104200041b0016a2204" + "4120101022014120470d02418a94c000410e20044120410110021a419894c0004124410141" + "00410010021a419195c000412541014100410010021a20004188016a420037030020004180" + "016a4200370300200041f8006a42003703002000420037037041b695c0004117200041f000" + "6a22034120101122014120470d0341cd95c000410b41b695c0004117410110021a41d895c0" + "00411120034120410110021a2004101a200041c8006a22072004101b200642003703002002" + "420037030020054200370300200042003703900102404100200422026b410371220320026a" + "220520024d0d0020030440200321010340200241003a0000200241016a2102200141016b22" + "010d000b0b200341016b4107490d000340200241003a0000200241076a41003a0000200241" + "066a41003a0000200241056a41003a0000200241046a41003a0000200241036a41003a0000" + "200241026a41003a0000200241016a41003a0000200241086a22022005470d000b0b200541" + "800220036b2201417c716a220220054b0440034020054100360200200541046a2205200249" + "0d000b0b024020022001410371220120026a22034f0d002001220504400340200241003a00" + "00200241016a2102200541016b22050d000b0b200141016b4107490d000340200241003a00" + "00200241076a41003a0000200241066a41003a0000200241056a41003a0000200241046a41" + "003a0000200241036a41003a0000200241026a41003a0000200241016a41003a0000200241" + "086a22022003470d000b0b0240200741142008412020044180021012220141004a044041e9" + "95c00041102001ad10011a20014181024f0d0641f995c000410920042001410110021a0c01" + "0b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101100222014100" + "480d0541c996c000411d2001ad10011a41e696c0004111422a1001410048044041ad97c000" + "411a42a47b10011a41a47b21020c070b41f796c000411c420010011a41012102419397c000" + "411a41014100410010021a41ff97c000412941014100410010021a41a898c0004128101322" + "01412846044041d098c000412741a898c0004128410110021a41f798c000411e4101410041" + "0010021a41bf80c000412841014100410010021a0c070b419599c000411a2001ac10011a41" + "c37a21020c060b41f494c000411d2001ac10011a418b7c21020c050b41d894c000411c2001" + "ac10011a41897c21020c040b41bc94c000411c2001ac10011a41887c21020c030b41dd97c0" + "0041222001ac10011a41a77b21020c020b000b41c797c00041162001ac10011a41a57b2102" + "0b200041b0036a240020020b0d00200020012002411410191a0b0c00200041142001412010" + "180b0e002000418280182001200210140b0e002000200141022002412010150b0a00200041" + "83803c10160b0a0020002001410210170b0bb9190100418080c0000baf196572726f725f63" + "6f64653d3d3d3d20484f53542046554e4354494f4e532054455354203d3d3d54657374696e" + "6720323620686f73742066756e6374696f6e73535543434553533a20416c6c20686f737420" + "66756e6374696f6e20746573747320706173736564212d2d2d2043617465676f727920313a" + "204c6564676572204865616465722046756e6374696f6e73202d2d2d4c6564676572207365" + "7175656e6365206e756d6265723a506172656e74206c65646765722074696d653a50617265" + "6e74206c656467657220686173683a535543434553533a204c656467657220686561646572" + "2066756e6374696f6e734552524f523a206765745f706172656e745f6c65646765725f6861" + "73682077726f6e67206c656e6774683a4552524f523a206765745f706172656e745f6c6564" + "6765725f74696d65206661696c65643a4552524f523a206765745f6c65646765725f73716e" + "206661696c65643a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" + "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a" + "5472616e73616374696f6e20466565206c656e6774683a5472616e73616374696f6e204665" + "65202873657269616c697a65642058525020616d6f756e74293a5472616e73616374696f6e" + "2053657175656e63653a4e6573746564206669656c64206c656e6774683a4e657374656420" + "6669656c643a494e464f3a206765745f74785f6e65737465645f6669656c64206e6f742061" + "70706c696361626c653a5369676e657273206172726179206c656e6774683a4d656d6f7320" + "6172726179206c656e6774683a4e6573746564206172726179206c656e6774683a494e464f" + "3a206765745f74785f6e65737465645f61727261795f6c656e206e6f74206170706c696361" + "626c653a535543434553533a205472616e73616374696f6e20646174612066756e6374696f" + "6e734552524f523a206765745f74785f6669656c642853657175656e6365292077726f6e67" + "206c656e6774683a4552524f523a206765745f74785f6669656c6428466565292077726f6e" + "67206c656e67746820286578706563746564203820627974657320666f7220585250293a45" + "52524f523a206765745f74785f6669656c64284163636f756e74292077726f6e67206c656e" + "6774683a2d2d2d2043617465676f727920333a2043757272656e74204c6564676572204f62" + "6a6563742046756e6374696f6e73202d2d2d43757272656e74206f626a6563742062616c61" + "6e6365206c656e677468202858525020616d6f756e74293a43757272656e74206f626a6563" + "742062616c616e6365202873657269616c697a65642058525020616d6f756e74293a437572" + "72656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e2d5852502061" + "6d6f756e74293a43757272656e74206f626a6563742062616c616e63653a494e464f3a2067" + "65745f63757272656e745f6c65646765725f6f626a5f6669656c642842616c616e63652920" + "6661696c656420286d6179206265206578706563746564293a43757272656e74206c656467" + "6572206f626a656374206163636f756e743a494e464f3a206765745f63757272656e745f6c" + "65646765725f6f626a5f6669656c64284163636f756e7429206661696c65643a4375727265" + "6e74206e6573746564206669656c64206c656e6774683a43757272656e74206e6573746564" + "206669656c643a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e" + "65737465645f6669656c64206e6f74206170706c696361626c653a43757272656e74206f62" + "6a656374205369676e657273206172726179206c656e6774683a43757272656e74206e6573" + "746564206172726179206c656e6774683a494e464f3a206765745f63757272656e745f6c65" + "646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361" + "626c653a535543434553533a2043757272656e74206c6564676572206f626a656374206675" + "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564676572204f626a" + "6563742046756e6374696f6e73202d2d2d5375636365737366756c6c792063616368656420" + "6f626a65637420696e20736c6f743a436163686564206f626a6563742062616c616e636520" + "6c656e677468202858525020616d6f756e74293a436163686564206f626a6563742062616c" + "616e6365202873657269616c697a65642058525020616d6f756e74293a436163686564206f" + "626a6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e7429" + "3a436163686564206f626a6563742062616c616e63653a494e464f3a206765745f6c656467" + "65725f6f626a5f6669656c642842616c616e636529206661696c65643a436163686564206e" + "6573746564206669656c64206c656e6774683a436163686564206e6573746564206669656c" + "643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e" + "6f74206170706c696361626c653a436163686564206f626a656374205369676e6572732061" + "72726179206c656e6774683a436163686564206e6573746564206172726179206c656e6774" + "683a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" + "656e206e6f74206170706c696361626c653a535543434553533a20416e79206c6564676572" + "206f626a6563742066756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f" + "626a206661696c656420286578706563746564207769746820746573742066697874757265" + "73293a494e464f3a206765745f6c65646765725f6f626a5f6669656c64206661696c656420" + "617320657870656374656420286e6f20636163686564206f626a656374293a494e464f3a20" + "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206661696c6564206173" + "2065787065637465643a494e464f3a206765745f6c65646765725f6f626a5f61727261795f" + "6c656e206661696c65642061732065787065637465643a494e464f3a206765745f6c656467" + "65725f6f626a5f6e65737465645f61727261795f6c656e206661696c656420617320657870" + "65637465643a535543434553533a20416e79206c6564676572206f626a6563742066756e63" + "74696f6e732028696e7465726661636520746573746564294552524f523a206163636f756e" + "745f6b65796c6574206661696c656420666f722063616368696e6720746573743a2d2d2d20" + "43617465676f727920353a204b65796c65742047656e65726174696f6e2046756e6374696f" + "6e73202d2d2d4163636f756e74206b65796c65743a546573745479706543726564656e7469" + "616c206b65796c65743a494e464f3a2063726564656e7469616c5f6b65796c657420666169" + "6c656420286578706563746564202d20696e74657266616365206973737565293a45736372" + "6f77206b65796c65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" + "65742067656e65726174696f6e2066756e6374696f6e734552524f523a206f7261636c655f" + "6b65796c6574206661696c65643a4552524f523a20657363726f775f6b65796c6574206661" + "696c65643a4552524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d" + "2043617465676f727920363a205574696c6974792046756e6374696f6e73202d2d2d48656c" + "6c6f2c205852504c205741534d20776f726c6421496e70757420646174613a534841353132" + "2068616c6620686173683a4e46542064617461206c656e6774683a4e465420646174613a49" + "4e464f3a206765745f6e6674206661696c656420286578706563746564202d206e6f207375" + "6368204e4654293a54657374207472616365206d6573736167657061796c6f616454726163" + "652066756e6374696f6e206279746573207772697474656e3a54657374206e756d62657220" + "747261636554726163655f6e756d2066756e6374696f6e2073756363656564656453554343" + "4553533a205574696c6974792066756e6374696f6e734552524f523a2074726163655f6e75" + "6d2829206661696c65643a4552524f523a2074726163652829206661696c65643a4552524f" + "523a20636f6d707574655f7368613531325f68616c66206661696c65643a2d2d2d20436174" + "65676f727920373a2044617461205570646174652046756e6374696f6e73202d2d2d557064" + "61746564206c656467657220656e74727920646174612066726f6d205741534d2074657374" + "5375636365737366756c6c792075706461746564206c656467657220656e74727920776974" + "683a535543434553533a2044617461207570646174652066756e6374696f6e734552524f52" + "3a207570646174655f64617461206661696c65643a004d0970726f64756365727302086c61" + "6e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38" + "372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f66" + "65617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69" @@ -376,535 +377,460 @@ extern std::string const hfPerfTest = "0a6d756c746976616c7565"; extern std::string const allKeyletsWasmHex = - "0061736d0100000001530a60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f01" - "7f60037f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7e017f60077f7f7f7f7f7f7f01" - "7f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620574726163" - "65000008686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f" - "6c69620974726163655f6e756d000508686f73745f6c6962146765745f6c65646765725f6f" - "626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765" - "725f6f626a5f6669656c64000308686f73745f6c69620d74726163655f6163636f756e7400" - "0108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" - "6c696e655f6b65796c6574000408686f73745f6c69620a616d6d5f6b65796c657400020868" - "6f73745f6c69620c636865636b5f6b65796c6574000008686f73745f6c6962116372656465" - "6e7469616c5f6b65796c6574000408686f73745f6c69620f64656c65676174655f6b65796c" - "6574000208686f73745f6c6962166465706f7369745f707265617574685f6b65796c657400" - "0208686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" - "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b6579" - "6c6574000008686f73745f6c69620e6d70746f6b656e5f6b65796c6574000208686f73745f" - "6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f66666572" - "5f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c657400060868" - "6f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008" - "686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469" - "636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000" - "03040307080905030100110619037f01418080c0000b7f0041ad8ac0000b7f0041b08ac000" - "0b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e69736800" - "190a5f5f646174615f656e6403010b5f5f686561705f6261736503020ad53103fb0402017f" - "027e23004180016b2205240002400240024020012d0000450440200541186a200141196a29" - "0000370300200541106a200141116a290000370300200541086a200141096a290000370300" - "200520012900013703002002200320054120410110001a2005412041001001220141004c0d" - "01024002402004450440418b80c000410f4285801410021a200141858014200541e0006a41" - "20100322014120460d0141a680c0004115417f20012001417f4e1b2201ac10021a20004101" - "3a0000200020013602040c060b418b80c000410f2004ac10021a20012004200541e0006a41" - "14100322014114460d0141a680c0004115417f20012001417f4e1b2201ac10021a20004101" - "3a0000200020013602040c050b200541c2006a200541e2006a2d00003a0000200541286a20" - "0541ef006a2900002206370300200541306a200541f7006a2900002207370300200541386a" - "200541ff006a2d000022013a0000200541cf006a2006370000200541d7006a200737000020" - "0541df006a20013a0000200520052f00603b01402005200529006722063703202005200528" - "006336004320052006370047419a80c000410c200541406b4120410110001a0c030b200541" - "c2006a200541e2006a2d00003a0000200520052900673703202005200541ec006a29000037" - "0025200541cc006a2005290025370000200520052f00603b01402005200528006336004320" - "052005290320370047419a80c000410c200541406b4114410110001a0c020b41c280c00041" - "1620012802042201ac10021a200041013a0000200020013602040c020b41bb80c000410720" - "01ac10021a200041013a0000200020013602040c010b20004180023b01000b20054180016a" - "24000bd627020a7f027e23004180076b2200240041d880c000412341004100410010001a02" - "402000027f02404181802020004188016a22034114100422044114460440200041066a2000" - "418a016a22012d00003a00002000200029008f013703e001200020004194016a2202290000" - "3700e501200041106a20002900e501370000200020002f0088013b01042000200028008b01" - "360007200020002903e00137000b41fb80c0004108200041046a2205411410051a41838020" - "20034114100422044114470d032000411a6a20012d00003a00002000200029008f013703e0" - "01200020022900003700e501200041246a20002900e501370000200020002f0088013b0118" - "2000200028008b0136001b200020002903e00137001f418381c000410c200041186a411410" - "051a200041a0016a2201420037030020004198016a2202420037030020004190016a420037" - "030020004200370388012005411420034120100622044120460d0102402004410048044020" - "0020043602300c010b2000417f3602300b41010c020b0c020b200041c5006a200129030037" - "00002000413d6a2002290300370000200041356a20004190016a2903003700002000200029" - "03880137002d41000b3a002c20004188016a22032000412c6a418f81c00041074181802010" - "180240024020002d00880145044041002104419681c000413541004100410010001a200041" - "de006a41c4003a0000200041d8006a4100360200200041e3006a41003a0000200041d5a601" - "3b015c200042003703502000410036005f200041a0016a2201420037030020004198016a22" - "02420037030020004190016a220542003703002000420037038801200041046a4114200041" - "186a4114200041d0006a411420034120100722034120470440024020034100480440200020" - "033602680c010b2000417f3602680b410121040c020b200041fd006a200129030037000020" - "0041f5006a2002290300370000200041ed006a200529030037000020002000290388013700" - "650c010b200028028c01210441878ac0004112420510021a0c010b200020043a0064200041" - "88016a200041e4006a41cb81c000410941001018024020002d00880145044041d481c00041" - "3741004100410010001a200041f0016a200041286a2201280100360200200041e8016a2000" - "41206a2202290100370300200041fc016a200041d8006a290300220a37020020004184026a" - "200041e0006a2802002203360200200020002901183703e00120002000290350220b3702f4" - "01200041e8066a22042003360200200041e0066a2203200a3703002000200b3703d8062000" - "41f4066a2002290100370200200041fc066a2001280100360200200020002901183702ec06" - "20004188026a200041d8066a22014128101a2000418c016a200041e0016a41d000101a2000" - "410136028801200041f0066a22024200370300200442003703002003420037030020004200" - "3703d80641998ac0004114200041b4016a4128200141201008220141204704400240200141" - "00480440200020013602e4010c010b2000417f3602e4010b410121040c020b200041f9016a" - "2002290300370000200041f1016a2004290300370000200041e9016a200329030037000020" - "0020002903d8063700e101410021040c010b200028028c01210441878ac000411242051002" - "1a0c010b200020043a00e001200041b4026a200041e0016a2203418b82c000410341818020" - "1018024020002d00b40245044041002104418e82c000413141004100410010001a200041f8" - "016a22014200370300200041f0016a22024200370300200041e8016a220542003703002000" - "42003703e001200041046a4114410620034120100922034120470440024020034100480440" - "200020033602c0020c010b2000417f3602c0020b410121040c020b200041d5026a20012903" - "00370000200041cd026a2002290300370000200041c5026a20052903003700002000200029" - "03e0013700bd020c010b20002802b802210441878ac0004112420610021a0c010b20002004" - "3a00bc02200041e0016a2203200041bc026a41bf82c0004105418180201018024020002d00" - "e0014504404100210441c482c000413341004100410010001a200041f8016a220142003703" - "00200041f0016a22024200370300200041e8016a22054200370300200042003703e0012000" - "41046a220941142009411441f782c000411220034120100a22034120470440024020034100" - "480440200020033602e4020c010b2000417f3602e4020b410121040c020b200041f9026a20" - "01290300370000200041f1026a2002290300370000200041e9026a20052903003700002000" - "20002903e0013700e1020c010b20002802e401210441878ac0004112420610021a0c010b20" - "0020043a00e002200041e0016a2203200041e0026a418983c000410a419880201018024020" - "002d00e00145044041002104419383c000413841004100410010001a200041f8016a220142" - "00370300200041f0016a22024200370300200041e8016a22054200370300200042003703e0" - "01200041046a4114200041186a411420034120100b22034120470440024020034100480440" - "20002003360288030c010b2000417f360288030b410121040c020b2000419d036a20012903" - "0037000020004195036a20022903003700002000418d036a20052903003700002000200029" - "03e001370085030c010b20002802e401210441878ac0004112420710021a0c010b20002004" - "3a008403200041e0016a220520004184036a41cb83c0004108418180201018024002400240" - "0240024002400240024002400240024020002d00e00145044041d383c00041364100410041" - "0010001a230041206b22032400200341186a22064200370300200341106a22074200370300" - "200341086a2208420037030020034200370300200041a8036a2201027f200041046a220441" - "14200041186a2209411420034120100c220241204704400240200241004804402001200236" - "02040c010b2001417f3602040b41010c010b20012003290300370001200141196a20062903" - "00370000200141116a2007290300370000200141096a200829030037000041000b3a000020" - "0341206a240020052001418984c000410e41818020101820002d00e0010d01419784c00041" - "3c41004100410010001a230041206b22032400200341186a22064200370300200341106a22" - "074200370300200341086a2208420037030020034200370300200041cc036a2201027f2004" - "411420034120100d22024120470440024020024100480440200120023602040c010b200141" - "7f3602040b41010c010b20012003290300370001200141196a200629030037000020014111" - "6a2007290300370000200141096a200829030037000041000b3a0000200341206a24002005" - "200141d384c000410341818020101820002d00e0010d0241d684c000413141004100410010" - "001a230041206b22032400200341186a22064200370300200341106a220742003703002003" - "41086a2208420037030020034200370300200041f0036a2201027f20044114410b20034120" - "100e22024120470440024020024100480440200120023602040c010b2001417f3602040b41" - "010c010b20012003290300370001200141196a2006290300370000200141116a2007290300" - "370000200141096a200829030037000041000b3a0000200341206a240020052001418785c0" - "00410641818020101820002d00e0010d03418d85c000413441004100410010001a23004120" - "6b22032400200341186a22064200370300200341106a22074200370300200341086a220842" - "003703002003420037030020004194046a2201027f20044114410c20034120100f22024120" - "470440024020024100480440200120023602040c010b2001417f3602040b41010c010b2001" - "2003290300370001200141196a2006290300370000200141116a2007290300370000200141" - "096a200829030037000041000b3a0000200341206a2400200041f4016a200041146a280100" - "360200200041ec016a2000410c6a290100370200200020002901043702e401200041808080" - "e0003602e001200041d8066a2203200141c185c000410b41848020101820002d00d8060d04" - "41cc85c000413941004100410010001a230041206b22012400200141186a22064200370300" - "200141106a22074200370300200141086a2208420037030020014200370300200041b8046a" - "2202027f200541182009411420014120101022054120470440024020054100480440200220" - "053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a2006" - "290300370000200241116a2007290300370000200241096a200829030037000041000b3a00" - "00200141206a240020032002418586c000410741818020101820002d00d8060d05418c86c0" - "00413541004100410010001a230041206b22012400200141186a2206420037030020014110" - "6a22074200370300200141086a2208420037030020014200370300200041dc046a2202027f" - "20094114410620014120101122054120470440024020054100480440200220053602040c01" - "0b2002417f3602040b41010c010b20022001290300370001200241196a2006290300370000" - "200241116a2007290300370000200241096a200829030037000041000b3a0000200141206a" - "24002003200241c186c000410c41828020101820002d00d8060d0641cd86c000413a410041" - "00410010001a230041206b22012400200141186a22064200370300200141106a2207420037" - "0300200141086a220842003703002001420037030020004180056a2202027f20044114410d" - "20014120101222054120470440024020054100480440200220053602040c010b2002417f36" - "02040b41010c010b20022001290300370001200241196a2006290300370000200241116a20" - "07290300370000200241096a200829030037000041000b3a0000200141206a240020032002" - "418787c000410541818020101820002d00d8060d07418c87c000413341004100410010001a" - "230041206b22012400200141186a22064200370300200141106a2207420037030020014108" - "6a2208420037030020014200370300200041a4056a2202027f2004411420094114410e2001" - "4120101322054120470440024020054100480440200220053602040c010b2002417f360204" - "0b41010c010b20022001290300370001200241196a2006290300370000200241116a200729" - "0300370000200241096a200829030037000041000b3a0000200141206a24002003200241bf" - "87c000410a41818020101820002d00d8060d0841c987c000413841004100410010001a2300" - "41206b22012400200141186a22094200370300200141106a22064200370300200141086a22" - "07420037030020014200370300200041c8056a2202027f20044114410f2001412010142205" - "4120470440024020054100480440200220053602040c010b2002417f3602040b41010c010b" - "20022001290300370001200241196a2009290300370000200241116a200629030037000020" - "0241096a200729030037000041000b3a0000200141206a240020032002418188c000411241" - "828020101820002d00d8060d09419388c00041c00041004100410010001a230041206b2201" - "2400200141186a22094200370300200141106a22064200370300200141086a220742003703" - "0020014200370300200041ec056a2202027f20044114200141201015220541204704400240" - "20054100480440200220053602040c010b2002417f3602040b41010c010b20022001290300" - "370001200241196a2009290300370000200241116a2006290300370000200241096a200729" - "030037000041000b3a0000200141206a24002003200241d388c000410a4100101820002d00" - "d8060d0a41dd88c000413841004100410010001a230041206b22012400200141186a220942" - "00370300200141106a22064200370300200141086a22074200370300200142003703002000" - "4190066a2202027f2004411441122001412010162205412047044002402005410048044020" - "0220053602040c010b2002417f3602040b41010c010b20022001290300370001200241196a" - "2009290300370000200241116a2006290300370000200241096a200729030037000041000b" - "3a0000200141206a240020032002419589c000410641818020101820002d00d8060d0b419b" - "89c000413441004100410010001a230041206b22012400200141186a220542003703002001" - "41106a22094200370300200141086a2206420037030020014200370300200041b4066a2202" - "027f2004411441132001412010172204412047044002402004410048044020022004360204" - "0c010b2002417f3602040b41010c010b20022001290300370001200241196a200529030037" - "0000200241116a2009290300370000200241096a200629030037000041000b3a0000200141" - "206a24002003200241cf89c000410541818020101820002d00d80645044041d489c0004133" - "41004100410010001a410121040c0d0b20002802dc06210441878ac0004112421310021a0c" - "0c0b20002802e401210441878ac0004112420810021a0c0b0b20002802e401210441878ac0" - "004112420910021a0c0a0b20002802e401210441878ac0004112420a10021a0c090b200028" - "02e401210441878ac0004112420b10021a0c080b20002802dc06210441878ac0004112420c" - "10021a0c070b20002802dc06210441878ac0004112420d10021a0c060b20002802dc062104" - "41878ac0004112420d10021a0c050b20002802dc06210441878ac0004112420d10021a0c04" - "0b20002802dc06210441878ac0004112420e10021a0c030b20002802dc06210441878ac000" - "4112420f10021a0c020b20002802dc06210441878ac0004112421010021a0c010b20002802" - "dc06210441878ac0004112421210021a0b20004180076a240020040f0b418080c000410b41" - "7f20042004417f4e1bac1002000bfd0401067f200241104f044002402000410020006b4103" - "7122056a220420004d0d002001210320050440200521060340200020032d00003a00002003" - "41016a2103200041016a2100200641016b22060d000b0b200541016b4107490d0003402000" - "20032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d0000" - "3a0000200041036a200341036a2d00003a0000200041046a200341046a2d00003a00002000" - "41056a200341056a2d00003a0000200041066a200341066a2d00003a0000200041076a2003" - "41076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b" - "2207417c7122086a21000240200120056a2206410371450440200020044d0d012006210103" - "4020042001280200360200200141046a2101200441046a22042000490d000b0c010b200020" - "044d0d002006410374220541187121032006417c71220241046a2101410020056b41187121" - "05200228020021020340200420022003762001280200220220057472360200200141046a21" - "01200441046a22042000490d000b0b20074103712102200620086a21010b02402000200020" - "026a22064f0d002002410771220304400340200020012d00003a0000200141016a21012000" - "41016a2100200341016b22030d000b0b200241016b4107490d000340200020012d00003a00" - "00200041016a200141016a2d00003a0000200041026a200141026a2d00003a000020004103" - "6a200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a20014105" - "6a2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d00003a" - "0000200141086a2101200041086a22002006470d000b0b0b0ba30a0100418080c0000b990a" - "6572726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a" - "204572726f722067657474696e67206669656c643a204572726f723a204572726f72206765" - "7474696e67206b65796c65743a202424242424205354415254494e47205741534d20455845" - "435554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f75" - "6e744163636f756e74206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e54727573746c696e6554727573746c696e6520" - "6f626a656374206578697374732c2070726f63656564696e67207769746820657363726f77" - "2066696e6973682e414d4d414d4d206f626a656374206578697374732c2070726f63656564" - "696e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a" - "656374206578697374732c2070726f63656564696e67207769746820657363726f77206669" - "6e6973682e7465726d73616e64636f6e646974696f6e7343726564656e7469616c43726564" - "656e7469616c206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e44656c656761746544656c6567617465206f626a6563" - "74206578697374732c2070726f63656564696e67207769746820657363726f772066696e69" - "73682e4465706f736974507265617574684465706f73697450726561757468206f626a6563" - "74206578697374732c2070726f63656564696e67207769746820657363726f772066696e69" - "73682e444944444944206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e457363726f77457363726f77206f626a656374" + "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f" + "7f7f017f60037f7f7f017f60037f7f7e017f60057f7f7f7f7f017f60057f7f7f7f7f006000" + "017f60037f7f7f000284051808686f73745f6c69620974726163655f6e756d000408686f73" + "745f6c6962057472616365000508686f73745f6c69621063616368655f6c65646765725f6f" + "626a000308686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108" + "686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64" + "000308686f73745f6c69620d74726163655f6163636f756e74000108686f73745f6c69620e" + "6163636f756e745f6b65796c6574000108686f73745f6c69620b6c696e655f6b65796c6574" + "000208686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69620c636865" + "636b5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c65" + "74000208686f73745f6c69620f64656c65676174655f6b65796c6574000008686f73745f6c" + "6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a" + "6469645f6b65796c6574000108686f73745f6c69620d657363726f775f6b65796c65740000" + "08686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008686f73745f" + "6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c6962106e66745f6f6666" + "65725f6b65796c6574000008686f73745f6c69620c6f666665725f6b65796c657400000868" + "6f73745f6c69620e7061796368616e5f6b65796c6574000208686f73745f6c69621a706572" + "6d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620e7369" + "676e6572735f6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574" + "000008686f73745f6c69620c7661756c745f6b65796c657400000304030607080503010011" + "0619037f01418080c0000b7f0041ad8ac0000b7f0041b08ac0000b073e05066d656d6f7279" + "02000d6f626a6563745f65786973747300180666696e69736800190a5f5f646174615f656e" + "6403010b5f5f686561705f6261736503020ab73403a80502017f017e230041a0016b220524" + "00024020012d0000410146044041c280c000411620012802042201ac10001a200041013a00" + "00200020013602040c010b200541186a200141196a290000370300200541106a200141116a" + "290000370300200541086a200141096a290000370300200520012900013703002002200320" + "054120410110011a02402005412041001002220141004a04402004450440418b80c000410f" + "4285801410001a20014185801420054180016a412010032201412047044041a680c0004115" + "417f20012001417f4e1b2201ac10001a200041013a0000200020013602040c040b200541c2" + "006a20054182016a2d00003a0000200541f0006a20054197016a2900002206370300200541" + "286a22012005418f016a290000370300200541306a22022006370300200541386a22032005" + "419f016a2d00003a0000200520052f0080013b014020052005290087013703202005200528" + "008301360043200541df006a20032d00003a0000200541d7006a2002290300370000200541" + "cf006a200129030037000020052005290320370047419a80c000410c200541406b41204101" + "10011a0c020b418b80c000410f2004ac10001a2001200420054180016a4114100322014114" + "47044041a680c0004115417f20012001417f4e1b2201ac10001a200041013a000020002001" + "3602040c030b200541c2006a20054182016a2d00003a000020052005290087013703602005" + "2005418c016a290000370065200520052f0080013b01402005200529036037032020052005" + "2900653700252005200528008301360043200541cc006a2005290025370000200520052903" + "20370047419a80c000410c200541406b4114410110011a0c010b41bb80c00041072001ac10" + "001a200041013a0000200020013602040c010b20004180023b01000b200541a0016a24000b" + "8b2a02087f027e23004180076b2200240041d880c000412341014100410010011a02402000" + "027f02404181802020004188016a22024114100422014114460440200041066a2000418a01" + "6a22032d00003a00002000200029008f013703e001200020004194016a22042900003700e5" + "01200020002f0088013b0104200020002903e0013703d806200020002900e5013700dd0620" + "00200028008b01360007200041106a20002900dd06370000200020002903d80637000b41fb" + "80c0004108200041046a2205411410051a4183802020024114100422014114470d03200041" + "1a6a20032d00003a00002000200029008f013703e001200020042900003700e50120002000" + "2f0088013b0118200020002903e0013703d806200020002900e5013700dd06200020002800" + "8b0136001b200041246a20002900dd06370000200020002903d80637001f418381c000410c" + "200041186a411410051a200041a0016a2203420037030020004198016a2204420037030020" + "004190016a420037030020004200370388012005411420024120100622014120460d010240" + "20014100480440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5" + "006a20032903003700002000413d6a2004290300370000200041356a20004190016a290300" + "370000200020002903880137002d41000b3a002c20004188016a2000412c6a418f81c00041" + "07418180201018024020002d0088014101460440200028028c01210141878ac00041124205" + "10001a0c010b41002101419681c000413541014100410010011a200041de006a41c4003a00" + "00200041d8006a4100360200200041e3006a41003a0000200041d5a6013b015c2000420037" + "03502000410036005f200041a0016a2203420037030020004198016a220442003703002000" + "4190016a2205420037030020004200370388010240200041046a4114200041186a41142000" + "41d0006a411420004188016a41201007220241204704400240200241004804402000200236" + "02680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000200041" + "f5006a2004290300370000200041ed006a200529030037000020002000290388013700650b" + "200020013a006420004188016a200041e4006a41cb81c00041094100101820002d00880141" + "01460440200028028c01210141878ac0004112420510001a0c010b41d481c0004137410141" + "00410010011a200041f0016a200041286a2203280100360200200041e8016a200041206a22" + "04290100370300200041fc016a200041d8006a290300220837020020004184026a200041e0" + "006a2802002202360200200020002901183703e0012000200029035022093702f401200041" + "e8066a22012002360200200041e0066a22022008370300200020093703d806200041f4066a" + "2004290100370200200041fc066a2003280100360200200020002901183702ec0620004188" + "026a200041d8066a22034128101a2000418c016a200041e0016a41d000101a200041013602" + "8801200041f0066a220442003703002001420037030020024200370300200042003703d806" + "2000027f41998ac0004114200041b4016a4128200341201008220341204704400240200341" + "00480440200020033602e4010c010b2000417f3602e4010b41010c010b200041f9016a2004" + "290300370000200041f1016a2001290300370000200041e9016a2002290300370000200020" + "002903d8063700e10141000b3a00e001200041b4026a200041e0016a418b82c00041034181" + "8020101820002d00b402410146044020002802b802210141878ac0004112420610001a0c01" + "0b41002101418e82c000413141014100410010011a200041808080303602d806200041f801" + "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" + "003703e0010240200041046a4114200041d8066a4104200041e0016a412010092202412047" + "0440024020024100480440200020023602c0020c010b2000417f3602c0020b410121010c01" + "0b200041d5026a2003290300370000200041cd026a2004290300370000200041c5026a2005" + "290300370000200020002903e0013700bd020b200020013a00bc02200041e0016a200041bc" + "026a41bf82c000410541818020101820002d00e001410146044020002802e401210141878a" + "c0004112420610001a0c010b4100210141c482c000413341014100410010011a200041f801" + "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" + "003703e0010240200041046a220241142002411441f782c0004112200041e0016a4120100a" + "22024120470440024020024100480440200020023602e4020c010b2000417f3602e4020b41" + "0121010c010b200041f9026a2003290300370000200041f1026a2004290300370000200041" + "e9026a2005290300370000200020002903e0013700e1020b200020013a00e002200041e001" + "6a200041e0026a418983c000410a41988020101820002d00e001410146044020002802e401" + "210141878ac0004112420710001a0c010b41002101419383c000413841014100410010011a" + "200041f8016a22034200370300200041f0016a22044200370300200041e8016a2205420037" + "0300200042003703e0010240200041046a4114200041186a4114200041e0016a4120100b22" + "02412047044002402002410048044020002002360288030c010b2000417f360288030b4101" + "21010c010b2000419d036a200329030037000020004195036a20042903003700002000418d" + "036a2005290300370000200020002903e001370085030b200020013a008403200041e0016a" + "20004184036a41cb83c000410841818020101820002d00e001410146044020002802e40121" + "0141878ac0004112420810001a0c010b41d383c000413641014100410010011a230041206b" + "22012400200141186a22044200370300200141106a22054200370300200141086a22064200" + "37030020014200370300200041a8036a2202027f200041046a4114200041186a4114200141" + "20100c22034120470440024020034100480440200220033602040c010b2002417f3602040b" + "41010c010b20022001290300370001200241196a2004290300370000200241116a20052903" + "00370000200241096a200629030037000041000b3a0000200141206a2400200041e0016a20" + "02418984c000410e41818020101820002d00e001410146044020002802e401210141878ac0" + "004112420910001a0c010b419784c000413c41014100410010011a230041206b2201240020" + "0141186a22044200370300200141106a22054200370300200141086a220642003703002001" + "4200370300200041cc036a2202027f200041046a411420014120100d220341204704400240" + "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300" + "370001200241196a2004290300370000200241116a2005290300370000200241096a200629" + "030037000041000b3a0000200141206a2400200041e0016a200241d384c000410341818020" + "101820002d00e001410146044020002802e401210141878ac0004112420a10001a0c010b41" + "d684c000413141014100410010011a230041306b22012400200141808080d80036020c2001" + "41286a22044200370300200141206a22054200370300200141186a22064200370300200142" + "00370310200041f0036a2202027f200041046a41142001410c6a4104200141106a4120100e" + "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" + "010b20022001290310370001200241196a2004290300370000200241116a20052903003700" + "00200241096a200629030037000041000b3a0000200141306a2400200041e0016a20024187" + "85c000410641818020101820002d00e001410146044020002802e401210141878ac0004112" + "420b10001a0c010b418d85c000413441014100410010011a230041306b2201240020014180" + "8080e00036020c200141286a22044200370300200141206a22054200370300200141186a22" + "0642003703002001420037031020004194046a2202027f200041046a41142001410c6a4104" + "200141106a4120100f22034120470440024020034100480440200220033602040c010b2002" + "417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241" + "116a2005290300370000200241096a200629030037000041000b3a0000200141306a240020" + "0041f4016a200041146a280100360200200041ec016a2000410c6a29010037020020002000" + "2901043702e401200041808080e0003602e001200041d8066a200241c185c000410b418480" + "20101820002d00d806410146044020002802dc06210141878ac0004112420c10001a0c010b" + "41cc85c000413941014100410010011a230041206b22012400200141186a22044200370300" + "200141106a22054200370300200141086a2206420037030020014200370300200041b8046a" + "2202027f200041e0016a4118200041186a4114200141201010220341204704400240200341" + "00480440200220033602040c010b2002417f3602040b41010c010b20022001290300370001" + "200241196a2004290300370000200241116a2005290300370000200241096a200629030037" + "000041000b3a0000200141206a2400200041d8066a2002418586c000410741818020101820" + "002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b418c86c0" + "00413541014100410010011a230041306b220124002001418080803036020c200141286a22" + "044200370300200141206a22054200370300200141186a2206420037030020014200370310" + "200041dc046a2202027f200041186a41142001410c6a4104200141106a4120101122034120" + "470440024020034100480440200220033602040c010b2002417f3602040b41010c010b2002" + "2001290310370001200241196a2004290300370000200241116a2005290300370000200241" + "096a200629030037000041000b3a0000200141306a2400200041d8066a200241c186c00041" + "0c41828020101820002d00d806410146044020002802dc06210141878ac0004112420d1000" + "1a0c010b41cd86c000413a41014100410010011a230041306b22012400200141808080e800" + "36020c200141286a22044200370300200141206a22054200370300200141186a2206420037" + "03002001420037031020004180056a2202027f200041046a41142001410c6a410420014110" + "6a4120101222034120470440024020034100480440200220033602040c010b2002417f3602" + "040b41010c010b20022001290310370001200241196a2004290300370000200241116a2005" + "290300370000200241096a200629030037000041000b3a0000200141306a2400200041d806" + "6a2002418787c000410541818020101820002d00d806410146044020002802dc0621014187" + "8ac0004112420d10001a0c010b418c87c000413341014100410010011a230041306b220124" + "00200141808080f00036020c200141286a22044200370300200141206a2205420037030020" + "0141186a2206420037030020014200370310200041a4056a2202027f200041046a41142000" + "41186a41142001410c6a4104200141106a4120101322034120470440024020034100480440" + "200220033602040c010b2002417f3602040b41010c010b2002200129031037000120024119" + "6a2004290300370000200241116a2005290300370000200241096a20062903003700004100" + "0b3a0000200141306a2400200041d8066a200241bf87c000410a41818020101820002d00d8" + "06410146044020002802dc06210141878ac0004112420e10001a0c010b41c987c000413841" + "014100410010011a230041306b22012400200141808080f80036020c200141286a22044200" + "370300200141206a22054200370300200141186a2206420037030020014200370310200041" + "c8056a2202027f200041046a41142001410c6a4104200141106a4120101422034120470440" + "024020034100480440200220033602040c010b2002417f3602040b41010c010b2002200129" + "0310370001200241196a2004290300370000200241116a2005290300370000200241096a20" + "0629030037000041000b3a0000200141306a2400200041d8066a2002418188c00041124182" + "8020101820002d00d806410146044020002802dc06210141878ac0004112420f10001a0c01" + "0b419388c00041c00041014100410010011a230041206b22012400200141186a2204420037" + "0300200141106a22054200370300200141086a2206420037030020014200370300200041ec" + "056a2202027f200041046a4114200141201015220341204704400240200341004804402002" + "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a" + "0000200141206a2400200041d8066a200241d388c000410a4100101820002d00d806410146" + "044020002802dc06210141878ac0004112421010001a0c010b41dd88c00041384101410041" + "0010011a230041306b22012400200141808080900136020c200141286a2204420037030020" + "0141206a22054200370300200141186a220642003703002001420037031020004190066a22" + "02027f200041046a41142001410c6a4104200141106a412010162203412047044002402003" + "4100480440200220033602040c010b2002417f3602040b41010c010b200220012903103700" + "01200241196a2004290300370000200241116a2005290300370000200241096a2006290300" + "37000041000b3a0000200141306a2400200041d8066a2002419589c0004106418180201018" + "20002d00d806410146044020002802dc06210141878ac0004112421210001a0c010b410121" + "01419b89c000413441014100410010011a230041306b22022400200241808080980136020c" + "200241286a22054200370300200241206a22064200370300200241186a2207420037030020" + "024200370310200041b4066a2203027f200041046a41142002410c6a4104200241106a4120" + "101722044120470440024020044100480440200320043602040c010b2003417f3602040b41" + "010c010b20032002290310370001200341196a2005290300370000200341116a2006290300" + "370000200341096a200729030037000041000b3a0000200241306a2400200041d8066a2003" + "41cf89c000410541818020101820002d00d806410146044020002802dc06210141878ac000" + "4112421310001a0c010b41d489c000413341014100410010011a0b20004180076a24002001" + "0f0b418080c000410b417f20012001417f4e1bac1000000bfd0401067f200241104f044002" + "4020002000410020006b41037122056a22044f0d0020012103200504402005210603402000" + "20032d00003a0000200341016a2103200041016a2100200641016b22060d000b0b20054101" + "6b4107490d000340200020032d00003a0000200041016a200341016a2d00003a0000200041" + "026a200341026a2d00003a0000200041036a200341036a2d00003a0000200041046a200341" + "046a2d00003a0000200041056a200341056a2d00003a0000200041066a200341066a2d0000" + "3a0000200041076a200341076a2d00003a0000200341086a2103200041086a22002004470d" + "000b0b2004200220056b2207417c7122086a21000240200120056a22064103714504402000" + "20044d0d0120062101034020042001280200360200200141046a2101200441046a22042000" + "490d000b0c010b200020044d0d002006410374220541187121032006417c71220241046a21" + "01410020056b41187121052002280200210203402004200220037620012802002202200574" + "72360200200141046a2101200441046a22042000490d000b0b20074103712102200620086a" + "21010b02402000200020026a22064f0d002002410771220304400340200020012d00003a00" + "00200141016a2101200041016a2100200341016b22030d000b0b200241016b4107490d0003" + "40200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a" + "2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a00" + "00200041056a200141056a2d00003a0000200041066a200141066a2d00003a000020004107" + "6a200141076a2d00003a0000200141086a2101200041086a22002006470d000b0b0b0ba30a" + "0100418080c0000b990a6572726f725f636f64653d47657474696e67206669656c643a2046" + "69656c6420646174613a204572726f722067657474696e67206669656c643a204572726f72" + "3a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e" + "47205741534d20455845435554494f4e2024242424244163636f756e743a44657374696e61" + "74696f6e3a4163636f756e744163636f756e74206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e65" + "54727573746c696e65206f626a656374206578697374732c2070726f63656564696e672077" + "69746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43686563" + "6b436865636b206f626a656374206578697374732c2070726f63656564696e672077697468" + "20657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564" + "656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e44656c656761746544656c65" + "67617465206f626a656374206578697374732c2070726f63656564696e6720776974682065" + "7363726f772066696e6973682e4465706f736974507265617574684465706f736974507265" + "61757468206f626a656374206578697374732c2070726f63656564696e6720776974682065" + "7363726f772066696e6973682e444944444944206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e457363726f77457363" + "726f77206f626a656374206578697374732c2070726f63656564696e672077697468206573" + "63726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f62" + "6a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" + "696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070" + "726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f" + "666665724e46546f6b656e4f66666572206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e4f666665724f66666572206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578" + "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" + "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f" + "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" + "66696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" + "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e54" + "69636b65745469636b6574206f626a656374206578697374732c2070726f63656564696e67" + "207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374" "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e4d505449737375616e63654d505449737375616e6365206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f" - "6b656e4d50546f6b656e206f626a656374206578697374732c2070726f63656564696e6720" - "7769746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b65" - "6e4f66666572206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e4f666665724f66666572206f626a6563742065786973" - "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e506179" - "4368616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e65" - "64446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a6563742065786973" - "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e536967" - "6e65724c6973745369676e65724c697374206f626a656374206578697374732c2070726f63" - "656564696e67207769746820657363726f772066696e6973682e5469636b65745469636b65" - "74206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" - "6f772066696e6973682e5661756c745661756c74206f626a656374206578697374732c2070" - "726f63656564696e67207769746820657363726f772066696e6973682e43757272656e7420" - "7365712076616c75653a004d0970726f64756365727302086c616e67756167650104527573" - "74000c70726f6365737365642d6279010572757374631d312e38352e312028346562313631" - "32353020323032352d30332d313529002c0f7461726765745f6665617475726573022b0f6d" - "757461626c652d676c6f62616c732b087369676e2d657874"; + "682e43757272656e74207365712076616c75653a004d0970726f64756365727302086c616e" + "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3837" + "2e30202831373036376539616320323032352d30352d303929002c0f7461726765745f6665" + "617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const codecovTestsWasmHex = - "0061736d0100000001570b60047f7f7f7f017f60057f7f7f7f7f017f60027f7f017f60067f" - "7f7f7f7f7f017f60077f7f7f7f7f7f7f017f6000017f60037f7f7f017f60017f017f60087f" - "7f7f7f7f7f7f7f017f60037f7f7e017f60047f7f7f7f0002990d3c08686f73745f6c696205" - "7472616365000108686f73745f6c69620974726163655f6e756d000908686f73745f6c6962" - "0e6765745f6c65646765725f73716e000508686f73745f6c6962166765745f706172656e74" - "5f6c65646765725f74696d65000508686f73745f6c6962166765745f706172656e745f6c65" - "646765725f68617368000208686f73745f6c69620c6765745f626173655f66656500050868" - "6f73745f6c696211616d656e646d656e745f656e61626c6564000208686f73745f6c69620c" - "6765745f74785f6669656c64000608686f73745f6c69620e6163636f756e745f6b65796c65" - "74000008686f73745f6c69621063616368655f6c65646765725f6f626a000608686f73745f" - "6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000608686f" - "73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000008686f73745f6c69" - "62136765745f74785f6e65737465645f6669656c64000008686f73745f6c6962236765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64000008686f73" - "745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c6400010868" - "6f73745f6c6962106765745f74785f61727261795f6c656e000708686f73745f6c69622067" - "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e000708686f73" - "745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e000208686f7374" - "5f6c6962176765745f74785f6e65737465645f61727261795f6c656e000208686f73745f6c" - "6962276765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261" - "795f6c656e000208686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465" - "645f61727261795f6c656e000608686f73745f6c69620b7570646174655f64617461000208" - "686f73745f6c696213636f6d707574655f7368613531325f68616c66000008686f73745f6c" - "696209636865636b5f736967000308686f73745f6c6962076765745f6e6674000308686f73" - "745f6c69620e6765745f6e66745f697373756572000008686f73745f6c69620d6765745f6e" - "66745f7461786f6e000008686f73745f6c69620d6765745f6e66745f666c61677300020868" - "6f73745f6c6962146765745f6e66745f7472616e736665725f666565000208686f73745f6c" - "69620e6765745f6e66745f73657269616c000008686f73745f6c69620d74726163655f6163" - "636f756e74000008686f73745f6c69620c74726163655f616d6f756e74000008686f73745f" - "6c69620f666c6f61745f66726f6d5f75696e74000108686f73745f6c69620b6c696e655f6b" - "65796c6574000808686f73745f6c69620a616d6d5f6b65796c6574000308686f73745f6c69" - "621163726564656e7469616c5f6b65796c6574000808686f73745f6c69620e6d70746f6b65" - "6e5f6b65796c6574000308686f73745f6c69621274726163655f6f70617175655f666c6f61" - "74000008686f73745f6c69620d666c6f61745f636f6d70617265000008686f73745f6c6962" - "09666c6f61745f616464000408686f73745f6c69620e666c6f61745f737562747261637400" - "0408686f73745f6c69620e666c6f61745f6d756c7469706c79000408686f73745f6c69620c" - "666c6f61745f646976696465000408686f73745f6c69620a666c6f61745f726f6f74000308" - "686f73745f6c696209666c6f61745f706f77000308686f73745f6c696209666c6f61745f6c" - "6f67000108686f73745f6c69620c636865636b5f6b65796c6574000108686f73745f6c6962" - "0f64656c65676174655f6b65796c6574000308686f73745f6c6962166465706f7369745f70" - "7265617574685f6b65796c6574000308686f73745f6c69620a6469645f6b65796c65740000" - "08686f73745f6c69620d657363726f775f6b65796c6574000108686f73745f6c6962136d70" - "745f69737375616e63655f6b65796c6574000108686f73745f6c6962106e66745f6f666665" - "725f6b65796c6574000108686f73745f6c69620c6f666665725f6b65796c6574000108686f" - "73745f6c69620d6f7261636c655f6b65796c6574000108686f73745f6c69620e7061796368" - "616e5f6b65796c6574000408686f73745f6c69621a7065726d697373696f6e65645f646f6d" - "61696e5f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c657400" - "0008686f73745f6c69620d7469636b65745f6b65796c6574000108686f73745f6c69620c76" - "61756c745f6b65796c657400010303020a0505030100110619037f01418080c0000b7f0041" - "a99ec0000b7f0041b09ec0000b072e04066d656d6f727902000666696e697368003d0a5f5f" - "646174615f656e6403010b5f5f686561705f6261736503020aeb2602460002402000200147" - "04402002200341004100410010001a20004100480d01418b80c000410b2000ad1001000b20" - "0220032000ac10011a0f0b418b80c000410b2000ac1001000ba126020a7f017e230041f001" - "6b22002400419680c000412341004100410010001a100241b9e00041b980c000410e103c10" - "0341b2920441c780c0004116103c200041f0006a22054200370300200041e8006a22064200" - "370300200041e0006a2203420037030020004200370358200041d8006a2201412010044120" - "41d88cc0004116103c1005410a41dd80c000410c103c200041186a2207428182848890a0c0" - "8001370300200041106a2208428182848890a0c08001370300200041086a22094281828488" - "90a0c080013703002000428182848890a0c0800137030041e980c000410e1006410141f780" - "c0004111103c200041201006410141f780c0004111103c4181802020014114100722024114" - "4604400240200041266a200041da006a2d00003a00002000200029005f3703c80120002000" - "41e4006a2900003700cd01200041306a20002900cd01370000200020002f00583b01242000" - "200028005b360027200020002903c80137002b200542003703002006420037030020034200" - "37030020004200370358200041246a2205411420014120100822024120470d002000413a6a" - "20002d005a3a0000200041d0016a2202200041e7006a290000220a370300200041c7006a20" - "0a370000200041cf006a200041ef006a290000370000200041d7006a200041f7006a2d0000" - "3a0000200020002f01583b01382000200028005b36003b2000200029005f37003f20004138" - "6a4120410010094101418881c0004110103c20064100360200200342003703002000420037" - "03584181802020014114100a411441ee8cc000411c103c2006410036020020034200370300" - "2000420037035841014181802020014114100b4114418a8dc0004114103c20004104360298" - "01200041818020360258200041d8016a2203410036020020024200370300200042003703c8" - "0120014104200041c8016a22064114100c4114419e8dc0004113103c200341003602002002" - "4200370300200042003703c801200120002802980120064114100d411441b18dc000412310" - "3c2003410036020020024200370300200042003703c8014101200120002802980120064114" - "100e411441d48dc000411b103c4189803c100f4120419881c0004110103c4189803c101041" - "2041a881c0004120103c41014189803c1011412041c881c0004118103c2001200028029801" - "1012412041e081c0004117103c20012000280298011013412041f781c0004127103c410120" - "0120002802980110144120419e82c000411f103c200541141015411441bd82c000410b103c" - "200041e0016a220442003703002003420037030020024200370300200042003703c8012001" - "200028029801200641201016412041ef8dc0004113103c41c882c000410c41d482c000410b" - "41df82c000410e1017410141ed82c0004109103c200041b8016a2007290300370300200041" - "b0016a2008290300370300200041a8016a2009290300370300200020002903003703a00120" - "0341003b010020024200370300200042003703c80120054114200041a0016a220741202006" - "41121018411241828ec0004107103c2003410036020020024200370300200042003703c801" - "20074120200641141019411441898ec000410e103c200041003602c8012007412020064104" - "101a410441978ec000410d103c20074120101b410841f682c000410d103c20074120101c41" - "0a418383c0004114103c200041003602c8012007412020064104101d410441a48ec000410e" - "103c419783c000410d20054114101e410041a483c000410d103c419783c000410d41b183c0" - "004108101f410041b983c000410c103c419783c000410d41c583c0004108101f410041cd83" - "c0004111103c417f41041004417141de83c000411e103c200041003602c8012006417f1004" - "417141b28ec000411e103c200041ca016a41003a0000200041003b01c80120064103100441" - "7d41d08ec0004124103c200041003602c8012006418094ebdc031004417341f48ec0004123" - "103c200442003703002003420037030020024200370300200042003703c801200041d894eb" - "dc036a220741082006412041001020417341978fc0004117103c2004420037030020034200" - "37030020024200370300200042003703c80120012000280298012006412041001020417141" - "ae8fc0004119103c4102100f416f41fc83c000411f103c417f20002802980110124171419b" - "84c000411f103c2001417f1012417141ba84c000411f103c20014181201012417441d984c0" - "004120103c20072000280298011012417341f984c000411f103c2007200028029801410110" - "094173419885c0004118103c200120002802980141011009417141b085c000411a103c2004" - "42003703002003420037030020024200370300200042003703c80120072000280298012006" - "41201008417341c78fc0004116103c20044200370300200342003703002002420037030020" - "0042003703c8012001200028029801200641201008417141dd8fc0004118103c2004420037" - "03002003420037030020024200370300200042003703c80120054114200541142007200028" - "029801200641201021417341f58fc000411c103c2004420037030020034200370300200242" - "00370300200042003703c80120054114200541142001200028029801200641201021417141" - "9190c000411e103c200442003703002003420037030020024200370300200042003703c801" - "41959ec00041142007200028029801200641201022417341af90c0004119103c2004420037" - "03002003420037030020024200370300200042003703c80141959ec0004114200120002802" - "9801200641201022417141c890c000411f103c200442003703002003420037030020024200" - "370300200042003703c80141959ec000411441ca85c0004114200641201022417141e790c0" - "004129103c200442003703002003420037030020024200370300200042003703c80141de85" - "c000412841959ec00041142006412010224171419091c0004125103c200041dc016a200041" - "346a280100360200200041d4016a2000412c6a290100370200200020002901243702cc0120" - "0041808080083602c801200041003b01c0012006411841959ec0004114200041c0016a2203" - "41021022417141b591c000410e103c2007200028029801422a10014173418686c000411110" - "3c200041003b01c0014102200341021007416f41c391c000411b103c200041003b01c00141" - "0220034102100a416f41de91c000412b103c200041003b01c0014101410220034102100b41" - "6f418992c0004123103c4102100f416f41fc83c000411f103c41021010416f419786c00041" - "2f103c410141021011416f41c686c0004127103c41e980c0004181201006417441ed86c000" - "411f103c41e980c00041c10010064174418c87c000411a103c200041003b01c00120014181" - "2020034102100c417441ac92c0004121103c200041003b01c001200141812020034102100d" - "417441cd92c0004131103c200041003b01c0014101200141812020034102100e417441fe92" - "c0004129103c20014181201012417441a687c0004125103c20014181201013417441cb87c0" - "004135103c4101200141812010144174418088c000412d103c20014181201015417441ad88" - "c0004119103c419783c00041812041d482c000410b41df82c000410e1017417441ed82c000" - "4109103c419783c000410d41d482c00041812041df82c000410e1017417441ed82c0004109" - "103c419783c000410d41d482c000410b41df82c0004181201017417441ed82c0004109103c" - "200041003b01c0012001418120200341021016417441a793c0004121103c200041003b01c0" - "0141959ec00041812041959ec0004114200341021022417441c893c0004118103c20004100" - "3b01c00120054114200541142001418120200341021023417441e093c000411f103c200041" - "003b01c001200641812020054114200341021024417441ff93c0004122103c419783c00041" - "0d200720002802980141001000417341c688c000410f103c200042d487b6f4c7d4b1c00037" - "00c001419783c000410d200041c095ebdc036a220441081025417341d588c000411c103c41" - "9783c000410d2007200028029801101f417341f188c0004116103c20044108200341081026" - "4173418789c0004118103c200341082004410810264173419f89c0004118103c200041003b" - "01ec012004410820034108200041ec016a2202410241001027417341a194c0004114103c20" - "0041003b01ec0120034108200441082002410241001027417341b594c0004114103c200041" - "003b01ec0120044108200341082002410241001028417341c994c0004119103c200041003b" - "01ec0120034108200441082002410241001028417341e294c0004119103c200041003b01ec" - "0120044108200341082002410241001029417341fb94c0004119103c200041003b01ec0120" - "0341082004410820024102410010294173419495c0004119103c200041003b01ec01200441" - "0820034108200241024100102a417341ad95c0004117103c200041003b01ec012003410820" - "044108200241024100102a417341c495c0004117103c200041003b01ec0120044108410320" - "0241024100102b417341db95c0004114103c200041003b01ec012004410841032002410241" - "00102c417341ef95c0004113103c200041003b01ec0120044108200241024100102d417341" - "8296c0004113103c200120002802980141001009417141b789c0004123103c200041003b01" - "ec012005411420012000280298012002410210184171419596c000411a103c200041003b01" - "ec012001200028029801200241021019417141af96c0004121103c200041003b01ec012001" - "20002802980120024102101a417141d096c0004120103c2001200028029801101b417141da" - "89c0004120103c2001200028029801101c417141fa89c0004127103c200041003602ec0120" - "0120002802980120024104101d417141f096c0004121103c200041003b01ec012001200028" - "0298012002410210084171419197c0004123103c200041003b01ec01200120002802980141" - "0120024102102e417141b497c0004121103c200041003b01ec012001200028029801220420" - "05411420012004200241021023417141d597c0004127103c200041003b01ec012005411420" - "01200028029801220420012004200241021023417141fc97c0004127103c200041003b01ec" - "0120012000280298012005411420024102102f417141a398c0004125103c200041003b01ec" - "0120054114200120002802980120024102102f417141c898c0004125103c200041003b01ec" - "01200120002802980120054114200241021030417141ed98c000412c103c200041003b01ec" - "012005411420012000280298012002410210304171419999c000412c103c200041003b01ec" - "012001200028029801200241021031417141c599c000411f103c200041003b01ec01200120" - "00280298014101200241021032417141e499c0004122103c200041003b01ec012001200028" - "0298012005411441ca85c0004114200241021021417141869ac0004121103c200041003b01" - "ec0120054114200120002802980141ca85c0004114200241021021417141a79ac000412110" - "3c200041003b01ec0120012000280298014101200241021033417141c89ac0004128103c20" - "0041003b01ec01200641182001200028029801200241021024417141f09ac0004123103c20" - "0041003b01ec0120012000280298014101200241021034417141939bc0004125103c200041" - "003b01ec0120012000280298014101200241021035417141b89bc0004121103c200041003b" - "01ec0120012000280298014101200241021036417141d99bc0004122103c200041003b01ec" - "012001200028029801200541144101200241021037417141fb9bc0004124103c200041003b" - "01ec0120054114200120002802980141012002410210374171419f9cc0004124103c200041" - "003b01ec0120012000280298014101200241021038417141c39cc000412f103c200041003b" - "01ec012001200028029801200241021039417141f29cc0004123103c200041003b01ec0120" - "01200028029801410120024102103a417141959dc0004122103c200041003b01ec01200120" - "0028029801410120024102103b417141b79dc0004121103c200041003b01ec012001200028" - "02980141a18ac0004120200241021018417141d89dc000411c103c419783c000410d200120" - "0028029801101e417141c18ac0004122103c419797abdd03410d41a18ac000412041001000" - "417341e38ac0004110103c419797abdd03410d200341081025417341f38ac000411d103c41" - "9797abdd03410d20054114101e417341908bc0004118103c419797abdd03410d41c583c000" - "4108101f417341a88bc0004117103c2001200028029801200141812041001000417441bf8b" - "c000410e103c200141812042011001417441cd8bc0004112103c419783c000418120200341" - "081025417441df8bc000411b103c419783c00041812020054114101e417441fa8bc0004116" - "103c419783c00041812041c583c0004108101f417441908cc0004115103c419783c000410d" - "2001200028029801101f417141a58cc0004119103c200041003b01ec012001200028029801" - "20054114200241021024417141f49dc0004121103c4101410020054114101e410041be8cc0" - "00411a103c200041f0016a240041010f0b0b418080c000410b417f20022002417f4e1bac10" - "01000b0b801e0200418080c0000bde056572726f725f636f64653d54455354204641494c45" - "442424242424205354415254494e47205741534d20455845435554494f4e20242424242467" - "65745f6c65646765725f73716e6765745f706172656e745f6c65646765725f74696d656765" - "745f626173655f666565746573745f616d656e646d656e74616d656e646d656e745f656e61" - "626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e67" - "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65" - "646765725f6f626a5f61727261795f6c656e6765745f74785f6e65737465645f6172726179" - "5f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f617272" - "61795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e" - "7570646174655f6461746174657374206d65737361676574657374207075626b6579746573" - "74207369676e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f" - "6e66745f7472616e736665725f66656574657374696e6720747261636574726163655f6163" - "636f756e74400000000000005f74726163655f616d6f756e74400000000000000074726163" - "655f616d6f756e745f7a65726f6765745f706172656e745f6c65646765725f686173685f6e" - "65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c64" - "6765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f7478" - "5f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e65737465" - "645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f617272" - "61795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f" - "6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e55534430303030303030" - "3030303030303030303000418686c0000b8f1874726163655f6e756d5f6f6f625f73747267" - "65745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c" - "69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76" - "616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f" - "736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f7478" - "5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375" - "7272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f" - "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6172726179" - "5f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f626967" - "5f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f" - "61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f" - "61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f" - "625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75" - "696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235" - "366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e74" - "32353630303030303030303030303030303030303030303030303030303030303030317472" - "6163655f6163636f756e745f77726f6e675f73697a655f6163636f756e7469647472616365" - "5f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472" - "696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f75" - "6e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f" - "746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e677472" - "6163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f" - "6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e67746874726163655f6163" - "636f756e745f636865636b5f646573796e636765745f706172656e745f6c65646765725f68" - "6173686765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c65" - "646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f" - "63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65" - "646765725f6f626a5f6e65737465645f6669656c64636f6d707574655f7368613531325f68" - "616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e" - "6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f" - "6e65675f6c656e6765745f706172656e745f6c65646765725f686173685f6275665f746f6f" - "5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f" - "6c6f6e67666c6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d" - "5f75696e745f77726f6e675f6c656e6163636f756e745f6b65796c65745f6c656e5f6f6f62" - "6163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c" - "656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f" - "63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f" - "6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c6574" - "5f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65" - "796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65" - "796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765" - "745f63757272656e745f6c65646765725f6f626a5f6669656c645f696e76616c69645f7366" - "69656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f73666965" - "6c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765" - "745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f" - "5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c64" - "5f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f" - "5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f6269675f736c696365637265" - "64656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b" - "65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f" - "625f736c69636531666c6f61745f6164645f6f6f625f736c69636532666c6f61745f737562" - "74726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c" - "69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d75" - "6c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c69" - "636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f" - "6f6f625f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f67" - "5f6f6f625f736c6963656765745f6e66745f77726f6e675f73697a655f75696e7432353667" - "65745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765745f6e" - "66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f7365" - "7269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469643163726564656e7469616c5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e746964326465706f7369745f707265617574685f" - "6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" - "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469" - "645f6b65796c65745f77726f6e675f73697a655f6163636f756e746964657363726f775f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e746964326d70745f69737375616e63655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77" - "726f6e675f73697a655f6163636f756e7469646f666665725f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e7469647061796368616e5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e746964317061796368616e5f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469647369676e6572735f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f77726f6e67" - "5f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e7469646765745f6e66745f77726f6e675f73697a655f6163636f756e74" - "69646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468004d" - "0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" - "2d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d" - "303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f6261" - "6c732b087369676e2d657874"; + "0061736d0100000001570b60067f7f7f7f7f7f017f60047f7f7f7f017f60027f7f017f60057f7f7f7f7f017f60037f7f7f017f60077f7f7f7f" + "7f7f7f017f60087f7f7f7f7f7f7f7f017f60017f017f60037f7f7e017f60047f7f7f7f006000017f02990d3c08686f73745f6c696205747261" + "6365000308686f73745f6c69620974726163655f6e756d000808686f73745f6c69620e6765745f6c65646765725f73716e000208686f73745f" + "6c6962166765745f706172656e745f6c65646765725f74696d65000208686f73745f6c6962166765745f706172656e745f6c65646765725f68" + "617368000208686f73745f6c69620c6765745f626173655f666565000208686f73745f6c696211616d656e646d656e745f656e61626c656400" + "0208686f73745f6c69620c6765745f74785f6669656c64000408686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f" + "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669" + "656c64000408686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f6e6573" + "7465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c6400" + "0108686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c64000308686f73745f6c6962106765745f74785f" + "61727261795f6c656e000708686f73745f6c6962206765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e00070868" + "6f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c6962176765745f74785f6e6573746564" + "5f61727261795f6c656e000208686f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6172726179" + "5f6c656e000208686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000408686f73745f6c69" + "620b7570646174655f64617461000208686f73745f6c696213636f6d707574655f7368613531325f68616c66000108686f73745f6c69620963" + "6865636b5f736967000008686f73745f6c6962076765745f6e6674000008686f73745f6c69620e6765745f6e66745f69737375657200010868" + "6f73745f6c69620d6765745f6e66745f7461786f6e000108686f73745f6c69620d6765745f6e66745f666c616773000208686f73745f6c6962" + "146765745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66745f73657269616c000108686f73745f6c69" + "620d74726163655f6163636f756e74000108686f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620c636865636b5f" + "6b65796c6574000008686f73745f6c69620f666c6f61745f66726f6d5f75696e74000308686f73745f6c69620b6c696e655f6b65796c657400" + "0608686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c6574000608686f7374" + "5f6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c69621274726163655f6f70617175655f666c6f6174000108686f73745f" + "6c69620d666c6f61745f636f6d70617265000108686f73745f6c696209666c6f61745f616464000508686f73745f6c69620e666c6f61745f73" + "75627472616374000508686f73745f6c69620e666c6f61745f6d756c7469706c79000508686f73745f6c69620c666c6f61745f646976696465" + "000508686f73745f6c69620a666c6f61745f726f6f74000008686f73745f6c696209666c6f61745f706f77000008686f73745f6c696209666c" + "6f61745f6c6f67000308686f73745f6c69620d657363726f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f" + "6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f666665725f6b65796c65" + "74000008686f73745f6c69620d6f7261636c655f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608686f" + "73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c65" + "74000008686f73745f6c69620c7661756c745f6b65796c6574000008686f73745f6c69620f64656c65676174655f6b65796c6574000008686f" + "73745f6c6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a6469645f6b65796c6574000108686f73" + "745f6c69620e7369676e6572735f6b65796c65740001030302090a05030100110619037f01418080c0000b7f00418ea1c0000b7f004190a1c0" + "000b072e04066d656d6f727902000666696e697368003d0a5f5f646174615f656e6403010b5f5f686561705f6261736503020aa12c02460002" + "40200020014704402002200341014100410010001a20004100480d01418b80c000410b2000ad1001000b200220032000ac10011a0f0b418b80" + "c000410b2000ac1001000bd72b020a7f017e23004190026b22002400419680c000412341014100410010001a20004100360260200041e0006a" + "220241041002410441a88cc000410e103c20004100360260200241041003410441b68cc0004116103c200041f8006a22044200370300200041" + "f0006a22014200370300200041e8006a2205420037030020004200370360200241201004412041cc8cc0004116103c20004100360260200241" + "041005410441e28cc000410c103c200041106a2207428182848890a0c08001370300200041186a2206428182848890a0c08001370300200041" + "206a2209428182848890a0c080013703002000428182848890a0c0800137030841b980c000410e1006410141c780c0004111103c200041086a" + "41201006410141c780c0004111103c418180202002411410072203411446044002402000412e6a200041e2006a2d00003a0000200020002900" + "673703e8012000200041ec006a2900003700ed01200020002f00603b012c200020002903e8013703a801200020002900ed013700ad01200020" + "0028006336002f200041386a20002900ad01370000200020002903a80137003320044200370300200142003703002005420037030020004200" + "3703602000412c6a2204411420024120100822034120470d00200041c2006a20002d00623a0000200041f0016a2203200041ef006a29000022" + "0a370300200041cf006a200a370000200041d7006a200041f7006a290000370000200041df006a200041ff006a2d00003a0000200020002f01" + "603b01402000200028006336004320002000290067370047200041406b412041001009410141d880c0004110103c2001410036020020054200" + "370300200042003703604181802020024114100a411441ee8cc000411c103c2001410036020020054200370300200042003703604101418180" + "2020024114100b4114418a8dc0004114103c200041043602a001200041818020360260200041f8016a22054100360200200342003703002000" + "42003703e80120024104200041e8016a22014114100c4114419e8dc0004113103c2005410036020020034200370300200042003703e8012002" + "20002802a00120014114100d411441b18dc0004123103c2005410036020020034200370300200042003703e8014101200220002802a0012001" + "4114100e411441d48dc000411b103c4189803c100f412041e880c0004110103c4189803c1010412041f880c0004120103c41014189803c1011" + "4120419881c0004118103c200220002802a0011012412041b081c0004117103c200220002802a0011013412041c781c0004127103c41012002" + "20002802a0011014412041ee81c000411f103c2004411410154114418d82c000410b103c20004180026a220842003703002005420037030020" + "034200370300200042003703e801200220002802a001200141201016412041ef8dc0004113103c419882c000410c41a482c000410b41af82c0" + "00410e1017410141bd82c0004109103c200041c0016a2009290300370300200041b8016a2006290300370300200041b0016a20072903003703" + "00200020002903083703a801200541003b010020034200370300200042003703e80120044114200041a8016a22074120200141121018411241" + "828ec0004107103c2005410036020020034200370300200042003703e80120074120200141141019411441898ec000410e103c200041003602" + "e8012007412020014104101a410441978ec000410d103c20074120101b410841c682c000410d103c20074120101c410a41d382c0004114103c" + "200041003602e8012007412020014104101d410441a48ec000410e103c41e782c000410d20044114101e410041f482c000410d103c41e782c0" + "00410d418183c0004108101f4100418983c000410c103c41e782c000410d419583c0004108101f4100419d83c0004111103c417f4104100441" + "7141ae83c000411e103c200041003602e8012001417f1004417141b28ec000411e103c200041ea016a41003a0000200041003b01e801200141" + "031004417d41d08ec0004124103c200041003602e8012001418094ebdc031004417341f48ec0004123103c4102100f416f41cc83c000411f10" + "3c417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c20024181201012417441a984c0004120103c" + "200041e094ebdc036a220620002802a0011012417341c984c000411f103c200842003703002005420037030020034200370300200042003703" + "e8012004411420064108200141201020417341978fc0004118103c200842003703002005420037030020034200370300200042003703e80120" + "04411420044114200141201020417141af8fc000411a103c200842003703002005420037030020034200370300200042003703e80120064108" + "2001412041001021417341c98fc0004117103c200842003703002005420037030020034200370300200042003703e801200220002802a00120" + "01412041001021417141e08fc0004120103c200620002802a00141011009417341e884c0004118103c200220002802a0014101100941714180" + "85c000411a103c200842003703002005420037030020034200370300200042003703e801200620002802a0012001412010084173418090c000" + "4116103c200842003703002005420037030020034200370300200042003703e801200220002802a0012001412010084171419690c000411810" + "3c200842003703002005420037030020034200370300200042003703e8012004411420044114200620002802a001200141201022417341ae90" + "c000411c103c200842003703002005420037030020034200370300200042003703e8012004411420044114200220002802a001200141201022" + "417141ca90c000411e103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114200620002802a0012001" + "41201023417341e890c0004119103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114200220002802" + "a0012001412010234171418191c000411f103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114419a" + "85c0004114200141201023417141a091c0004129103c200842003703002005420037030020034200370300200042003703e80141ae85c00041" + "2841faa0c0004114200141201023417141c991c0004125103c200041dc016a2000413c6a280100360200200041d4016a200041346a29010037" + "02002000200029012c3702cc01200041808080083602c801200041003b01e801200041c8016a2209411841faa0c00041142001410210234171" + "41ee91c000410e103c200620002802a001422a1001417341d685c0004111103c200041003b01e8014102200141021007416f41fc91c000411b" + "103c200041003b01e801410220014102100a416f419792c000412b103c200041003b01e8014101410220014102100b416f41c292c000412310" + "3c4102100f416f41cc83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c0004127103c41b980c00041812010" + "06417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e801200241812020014102100c417441e592" + "c0004121103c200041003b01e801200241812020014102100d4174418693c0004131103c200041003b01e8014101200241812020014102100e" + "417441b793c0004129103c20024181201012417441f686c0004125103c200241812010134174419b87c0004135103c41012002418120101441" + "7441d087c000412d103c20024181201015417441fd87c0004119103c41e782c00041812041a482c000410b41af82c000410e1017417441bd82" + "c0004109103c41e782c000410d41a482c00041812041af82c000410e1017417441bd82c0004109103c41e782c000410d41a482c000410b41af" + "82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441e093c0004121103c200041003b01e801" + "41faa0c00041812041faa0c00041142001410210234174418194c0004118103c200041003b01e8012004411420044114200241812020014102" + "10244174419994c000411f103c200041003b01e801200941812020044114200141021025417441b894c0004122103c41e782c000410d200620" + "002802a001410010004173419688c000410f103c200042d487b6f4c7d4b1c0003700e00141e782c000410d200041e095ebdc036a2207410810" + "26417341a588c000411c103c41e782c000410d200620002802a001101f417341c188c0004116103c20074108200041e0016a22064108102741" + "7341d788c0004118103c20064108200741081027417341ef88c0004118103c200041003b01e801200741082006410820014102410010284173" + "41da94c0004114103c200041003b01e80120064108200741082001410241001028417341ee94c0004114103c200041003b01e8012007410820" + "06410820014102410010294173418295c0004119103c200041003b01e801200641082007410820014102410010294173419b95c0004119103c" + "200041003b01e8012007410820064108200141024100102a417341b495c0004119103c200041003b01e8012006410820074108200141024100" + "102a417341cd95c0004119103c200041003b01e8012007410820064108200141024100102b417341e695c0004117103c200041003b01e80120" + "06410820074108200141024100102b417341fd95c0004117103c200041003b01e801200741084103200141024100102c4173419496c0004114" + "103c200041003b01e801200741084103200141024100102d417341a896c0004113103c200041003b01e80120074108200141024100102e4173" + "41bb96c0004113103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120102f417141ce96" + "c000411f103c200842003703002005420037030020034200370300200042003703e8012004411420044114200141201030417141ed96c00041" + "25103c200842003703002005420037030020034200370300200042003703e80120044114200441142001412010314171419297c0004122103c" + "200842003703002005420037030020034200370300200042003703e8012004411420044114200141201032417141b497c000411e103c200842" + "003703002005420037030020034200370300200042003703e8012004411420044114200141201033417141d297c000411f103c200842003703" + "002005420037030020034200370300200042003703e801200441142004411420044114200141201034417141f197c0004120103c2008420037" + "03002005420037030020034200370300200042003703e80120044114200441142001412010354171419198c000412c103c2008420037030020" + "05420037030020034200370300200042003703e8012004411420044114200141201036417141bd98c000411f103c2008420037030020054200" + "37030020034200370300200042003703e8012004411420044114200141201037417141dc98c000411e103c200220002802a001410010094171" + "418789c0004123103c200041003b01e80120044114200220002802a001200141021018417141fa98c000411a103c200041003b01e801200220" + "002802a0012001410210194171419499c0004121103c200041003b01e801200220002802a00120014102101a417141b599c0004120103c2002" + "20002802a001101b417141aa89c0004120103c200220002802a001101c417141ca89c0004127103c200041003602e801200220002802a00120" + "014104101d417141d599c0004121103c200041003b01e801200220002802a001200141021008417141f699c0004123103c2000418080800836" + "02e801200041003b018e02200220002802a001200141042000418e026a220341021020417141999ac0004121103c200041003b018e02200220" + "002802a00122052004411420022005200341021024417141ba9ac0004127103c200041003b018e0220044114200220002802a0012205200220" + "05200341021024417141e19ac0004127103c200041003b018e02200220002802a00120044114200341021038417141889bc0004125103c2000" + "41003b018e0220044114200220002802a001200341021038417141ad9bc0004125103c200041003b018e02200220002802a001200441142003" + "41021039417141d29bc000412c103c200041003b018e0220044114200220002802a001200341021039417141fe9bc000412c103c200041003b" + "018e02200220002802a00120034102103a417141aa9cc000411f103c200041003b018e02200220002802a0012001410420034102102f417141" + "c99cc0004122103c200041003b018e02200220002802a00120044114419a85c0004114200341021022417141eb9cc0004121103c200041003b" + "018e0220044114200220002802a001419a85c00041142003410210224171418c9dc0004121103c200041003b018e02200220002802a0012001" + "4104200341021030417141ad9dc0004128103c200041003b018e0220094118200220002802a001200341021025417141d59dc0004123103c20" + "0041003b018e02200220002802a00120014104200341021031417141f89dc0004125103c200041003b018e02200220002802a0012001410420" + "03410210324171419d9ec0004121103c200041003b018e02200220002802a00120014104200341021033417141be9ec0004122103c20004100" + "3b018e02200220002802a0012004411420014104200341021034417141e09ec0004124103c200041003b018e0220044114200220002802a001" + "20014104200341021034417141849fc0004124103c200041003b018e02200220002802a00120014104200341021035417141a89fc000412f10" + "3c200041003b018e02200220002802a00120034102103b417141d79fc0004123103c200041003b018e02200220002802a00120014104200341" + "021036417141fa9fc0004122103c200041003b018e02200220002802a001200141042003410210374171419ca0c0004121103c200041003b01" + "8e02200220002802a00141f189c0004120200341021018417141bda0c000411c103c41e782c000410d200220002802a001101e417141918ac0" + "004122103c41e796abdd03410d41f189c000412041001000417341b38ac0004110103c41e796abdd03410d200641081026417341c38ac00041" + "1d103c41e796abdd03410d20044114101e417341e08ac0004118103c41e796abdd03410d419583c0004108101f417341f88ac0004117103c20" + "0220002802a0012002418120410010004174418f8bc000410e103c2002418120420110014174419d8bc0004112103c41e782c0004181202006" + "41081026417441af8bc000411b103c41e782c00041812020044114101e417441ca8bc0004116103c41e782c000418120419583c0004108101f" + "417441e08bc0004115103c41e782c000410d200220002802a001101f417141f58bc0004119103c200041003b018e02200220002802a0012004" + "4114200341021025417141d9a0c0004121103c4101410020044114101e4100418e8cc000411a103c20004190026a240041010f0b0b418080c0" + "00410b417f20032003417f4e1bac1001000b0be5200200418080c0000bae056572726f725f636f64653d54455354204641494c454424242424" + "24205354415254494e47205741534d20455845435554494f4e202424242424746573745f616d656e646d656e74616d656e646d656e745f656e" + "61626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" + "626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c" + "656e6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361676574657374207075626b65797465737420736967" + "6e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e672074" + "7261636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e74400000000000000074726163655f616d6f756e74" + "5f7a65726f6765745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c" + "69645f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f617272" + "61795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e657374" + "65645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" + "6f626a5f77726f6e675f6c656e55534430303030303030303030303030303030300041d685c0000ba41b74726163655f6e756d5f6f6f625f73" + "74726765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c656467" + "65725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f" + "736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f" + "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" + "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" + "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f62" + "5f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c6f6174" + "5f636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e74323536676574" + "5f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f73" + "697a655f75696e74323536303030303030303030303030303030303030303030303030303030303030303174726163655f6163636f756e745f" + "77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f" + "625f737472696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472" + "6163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e67" + "74726163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" + "726f6e675f6c656e67746874726163655f6163636f756e745f636865636b5f646573796e636765745f6c65646765725f73716e6765745f7061" + "72656e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765745f626173655f6665656765745f637572" + "72656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669" + "656c646765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" + "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f74" + "61786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e" + "745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f" + "5f6c6f6e67636865636b5f6b65796c65745f6f6f625f6c656e5f753332636865636b5f6b65796c65745f77726f6e675f6c656e5f753332666c" + "6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e5f75696e7436346163636f" + "756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e" + "5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e" + "5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f" + "77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e" + "63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765745f63757272656e" + "745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76" + "616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c" + "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e6573746564" + "5f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f" + "6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b65" + "6e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f616464" + "5f6f6f625f736c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c" + "69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f" + "61745f6469766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f62" + "5f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c696365657363726f775f6b65796c6574" + "5f77726f6e675f73697a655f75696e7433326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f75696e7433326e66" + "745f6f666665725f6b65796c65745f77726f6e675f73697a655f75696e7433326f666665725f6b65796c65745f77726f6e675f73697a655f75" + "696e7433326f7261636c655f6b65796c65745f77726f6e675f73697a655f75696e7433327061796368616e5f6b65796c65745f77726f6e675f" + "73697a655f75696e7433327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f75696e7433327469" + "636b65745f6b65796c65745f77726f6e675f73697a655f75696e7433327661756c745f6b65796c65745f77726f6e675f73697a655f75696e74" + "33326765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e" + "743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e675f" + "73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "746964326465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" + "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f" + "6163636f756e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69" + "737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b" + "65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f61" + "63636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646765745f" + "6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468" + "004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38372e3020" + "2831373036376539616320323032352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c" + "732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" @@ -921,57 +847,57 @@ extern std::string const floatTestsWasmHex = "00010302010705030100110619037f01418080c0000b7f0041d28ac0000b7f0041e08ac000" "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" "5f686561705f6261736503020af20e01ef0e01047f230041206b22012400418080c000411d" - "41004100410010001a200142003703100240428ce000200141106a22004108410010014108" + "41014100410010001a200142003703100240428ce000200141106a22004108410010014108" "460440419d80c00041172000410810021a41b480c000411e20004108410110001a0c010b41" - "d280c000411e41004100410010001a0b2001428ce0003703180240200141186a4108200141" + "d280c000411e41014100410010001a0b2001428ce0003703180240200141186a4108200141" "106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000" - "411e41004100410010001a0b0240410242fb00200141106a22004108410010044108460440" - "41a581c00041212000410810021a0c010b41c681c000412641004100410010001a0b41ec81" - "c0004115418182c000410810021a418982c0004116419f82c000410810021a41a782c00041" - "1b41004100410010001a2001420037031802404201200141186a2200410841001001410846" - "044041c282c000410f2000410810021a0c010b41d182c000411641004100410010001a0b02" - "40200141186a4108418182c0004108100545044041e782c000411b41004100410010001a0c" - "010b418283c000411b41004100410010001a0b0240200141186a4108419f82c00041081005" - "4101460440419d83c000412341004100410010001a0c010b41c083c0004124410041004100" - "10001a0b0240419f82c0004108200141186a41081005410246044041e483c0004123410041" - "00410010001a0c010b418784c000412441004100410010001a0b41ab84c000412041004100" + "411e41014100410010001a0b0240410242fb00200141106a22004108410010044108460440" + "41a581c00041212000410810021a0c010b41c681c000412641014100410010001a0b41ec81" + "c0004115418182c000410810021a419182c0004116418982c000410810021a41a782c00041" + "1b41014100410010001a2001420037031802404201200141186a2200410841001001410846" + "044041c282c000410f2000410810021a0c010b41d182c000411641014100410010001a0b02" + "40200141186a4108418182c0004108100545044041e782c000411b41014100410010001a0c" + "010b418283c000411b41014100410010001a0b0240200141186a4108418982c00041081005" + "4101460440419d83c000412341014100410010001a0c010b41c083c0004124410141004100" + "10001a0b0240418982c0004108200141186a41081005410246044041e483c0004123410141" + "00410010001a0c010b418784c000412441014100410010001a0b41ab84c000412041014100" "410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a220241084181" "82c000410820024108410010061a200041016b22000d000b20014200370318420a20014118" - "6a22004108410010011a02402000410820024108100545044041cb84c00041144100410041" - "0010001a0c010b41df84c000411341004100410010001a0b410b21000340200141106a2202" - "4108418182c000410820024108410010071a200041016b22000d000b024020024108419f82" - "c0004108100545044041f284c000411941004100410010001a0c010b418b85c00041184100" - "4100410010001a0b41a385c000412341004100410010001a20014200370300420a20014108" + "6a22004108410010011a02402000410820024108100545044041cb84c00041144101410041" + "0010001a0c010b41df84c000411341014100410010001a0b410b21000340200141106a2202" + "4108418182c000410820024108410010071a200041016b22000d000b024020024108418982" + "c0004108100545044041f284c000411941014100410010001a0c010b418b85c00041184101" + "4100410010001a0b41a385c000412341014100410010001a20014200370300420a20014108" "410010011a200142d487b6f4c7d4b1c000370308410621000340200141086a220241082001" "410820024108410010081a200041016b22000d000b2001420037031042c0843d200141106a" - "22004108410010011a02402000410820024108100545044041c685c0004119410041004100" - "10001a0c010b41df85c000411841004100410010001a0b410721000340200141086a220241" + "22004108410010011a02402000410820024108100545044041c685c0004119410141004100" + "10001a0c010b41df85c000411841014100410010001a0b410721000340200141086a220241" "082001410820024108410010091a200041016b22000d000b20014200370318417f42012001" - "41186a22004108410010041a02402002410820004108100545044041f785c0004117410041" - "00410010001a0c010b418e86c000411641004100410010001a0b41a486c000411741004100" + "41186a22004108410010041a02402002410820004108100545044041f785c0004117410141" + "00410010001a0c010b418e86c000411641014100410010001a0b41a486c000411741014100" "410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb" - "86c00041122000410810021a419f82c00041084106200041084100100a1a41cd86c0004118" + "86c00041122000410810021a418982c00041084106200041084100100a1a41cd86c0004118" "2000410810021a200142003703104209200141106a22024108410010011a20024108410220" "0041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a" "41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" "200341084102200041084100100a1a419087c00041142000410810021a41a487c000413820" - "0341084100200041084100100aac100b1a41dc87c000411841004100410010001a20014200" + "0341084100200041084100100aac100b1a41dc87c000411841014100410010001a20014200" "370308420920004108410010011a20014200370310200041084102200241084100100c1a41" "f487c00041122002410810021a200041084103200241084100100c1a418688c00041122002" "410810021a2001420037031842c0843d20034108410010011a200341084103200241084100" "100c1a419888c00041182002410810021a200341084106200241084100100c1a41b088c000" - "411c2002410810021a41cc88c000411741004100410010001a2001420037031042c0843d20" + "411c2002410810021a41cc88c000411741014100410010001a2001420037031042c0843d20" "024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003" - "410810021a41f788c000411a41004100410010001a20014200370318418182c0004108419f" - "82c000410820034108410010081a0240419f82c0004108200341081005450440419189c000" - "411641004100410010001a0c010b41a789c000411541004100410010001a0b419f82c00041" - "08419f82c0004108200141186a22004108410010081a0240418182c0004108200041081005" - "45044041bc89c000411741004100410010001a0c010b41d389c00041164100410041001000" - "1a0b41e989c000411a41004100410010001a2001420037031020014200370318420a200141" + "410810021a41f788c000411a41014100410010001a20014200370318418182c00041084189" + "82c000410820034108410010081a0240418982c0004108200341081005450440419189c000" + "411641014100410010001a0c010b41a789c000411541014100410010001a0b418982c00041" + "08418982c0004108200141186a22004108410010081a0240418182c0004108200041081005" + "45044041bc89c000411741014100410010001a0c010b41d389c00041164101410041001000" + "1a0b41e989c000411a41014100410010001a2001420037031020014200370318420a200141" "186a22024108410010011a418182c000410820024108200141106a22004108410010091a41" "838ac00041192000410810021a418182c00041082000410820004108410010091a419c8ac0" - "00410f2000410810021a02402002410820004108100545044041ab8ac00041144100410041" - "0010001a0c010b41bf8ac000411341004100410010001a0b200141206a240041010b0bdc0a" + "00410f2000410810021a02402002410820004108100545044041ab8ac00041144101410041" + "0010001a0c010b41bf8ac000411341014100410010001a0b200141206a240041010b0bdc0a" "0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d2024" "24242020666c6f61742066726f6d206936342031323330303a2020666c6f61742066726f6d" "20693634203132333030206173204845583a2020666c6f61742066726f6d20693634203132" @@ -979,8 +905,8 @@ extern std::string const floatTestsWasmHex = "6c6f61742066726f6d207536342031323330303a206661696c65642020666c6f6174206672" "6f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065" "787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20" - "636f6e737420313ad4838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d31" - "3a94838d7ea4c680000a24242420746573745f666c6f61745f636f6d706172652024242420" + "636f6e737420313ad4838d7ea4c6800094838d7ea4c680002020666c6f61742066726f6d20" + "636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d706172652024242420" "20666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c656420" "20666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f" "6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41" @@ -1010,8 +936,8 @@ extern std::string const floatTestsWasmHex = "696e76657274206120666c6f61742066726f6d2031303a2020696e7665727420616761696e" "3a2020696e766572742074776963653a20676f6f642020696e766572742074776963653a20" "626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d6279010572757374631d312e38352e31202834656231363132353020323032" - "352d30332d313529002c0f7461726765745f6665617475726573022b0f6d757461626c652d" + "65737365642d6279010572757374631d312e38372e30202831373036376539616320323032" + "352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d" "676c6f62616c732b087369676e2d657874"; extern std::string const float0Hex = @@ -1375,19 +1301,20 @@ extern std::string const badAllocHex = "616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c7469" "76616c7565"; -extern std::string const badAlignHex = - "0061736d0100000001110360057f7f7f7f7f017f6000006000017f02170103656e760f666c" - "6f61745f66726f6d5f75696e7400000303020102050301000206400a7f004180080b7f0041" - "80080b7f00418088020b7f00418088020b7f00418088060b7f004180080b7f00418088060b" - "7f00418080080b7f0041000b7f0041010b07b1010d066d656d6f72790200115f5f7761736d" - "5f63616c6c5f63746f727300010474657374000206655f6461746103000c5f5f64736f5f68" - "616e646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f" - "737461636b5f6869676803040d5f5f676c6f62616c5f6261736503050b5f5f686561705f62" - "61736503060a5f5f686561705f656e6403070d5f5f6d656d6f72795f6261736503080c5f5f" - "7461626c655f6261736503090a240202000b1f00418108427f370000418108410841a30841" - "0c410010001a41a4082802000b007f0970726f647563657273010c70726f6365737365642d" - "62790105636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769" - "746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061623462356132646235" - "3832393538616631656533303861373930636664623432626432343732302900490f746172" - "6765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" - "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; +extern std::string const badAlignWasmHex = + "0061736d01000000011b046000017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f600000022a0203656e760f666c6f61745f66726f6d5f75" + "696e74000103656e760c636865636b5f6b65796c6574000203050403000000050301000306470b7f004180080b7f00418088020b7f00418008" + "0b7f00418088040b7f00418088040b7f00418088080b7f004180080b7f00418088080b7f004180800c0b7f0041000b7f0041010b07cc011006" + "6d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730002057465737431000307655f64617461310300057465737432000407655f" + "64617461320301047465737400050c5f5f64736f5f68616e646c6503020a5f5f646174615f656e6403030b5f5f737461636b5f6c6f7703040c" + "5f5f737461636b5f6869676803050d5f5f676c6f62616c5f6261736503060b5f5f686561705f6261736503070a5f5f686561705f656e640308" + "0d5f5f6d656d6f72795f6261736503090c5f5f7461626c655f62617365030a0a99020402000b2801017f418108427f370000418108410841a3" + "08410c41001000220041a40828020020004100481b0b5f01017f419a88024191a4cca00136010041928802428994ace0d0c1c3871037010041" + "8a88024281848ca0d0c0c1830837010041818802417f360000418a8802411441818802410441a3880241201001220041a48802280200200041" + "00481b0b8a0101037f418108427f370000418108410841a308410c410010002100419a88024191a4cca00136010041928802428994ace0d0c1" + "c38710370100418a88024281848ca0d0c0c1830837010041818802417f36000041a4082802002101418a8802411441818802410441a3880241" + "201001220241a4880228020020024100481b2000200120004100481b6a0b007f0970726f647563657273010c70726f6365737365642d627901" + "05636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a" + "65637420616234623561326462353832393538616631656533303861373930636664623432626432343732302900490f7461726765745f6665" + "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c74" + "6976616c7565"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index ff72711000a..12f7b2ee6c8 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -84,4 +84,4 @@ extern std::string const infiniteLoopWasmHex; extern std::string const startLoopHex; extern std::string const badAllocHex; -extern std::string const badAlignHex; +extern std::string const badAlignWasmHex; diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock index 175adf02543..efad3253e70 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#d27d3e0b4abf3c0215aade729d89053805efe48e" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml index b369cac5010..a115dc006ff 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c index 3458b02872c..020fafc78fa 100644 --- a/src/test/app/wasm_fixtures/ledgerSqn.c +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -1,27 +1,16 @@ #include int32_t -get_ledger_sqn(); -// int32_t trace(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t); -// int32_t trace_num(uint8_t const*, int32_t, int64_t); - -// uint8_t buf[1024]; - -// char const test_res[] = "sqn: "; -// char const test_name[] = "TEST get_ledger_sqn"; +get_ledger_sqn(uint8_t*, int32_t); int finish() { - // trace((uint8_t const *)test_name, sizeof(test_name) - 1, 0, 0, 0); - - // memset(buf, 0, sizeof(buf)); - // for(int i = 0; i < sizeof(buf); ++i) buf[i] = 0; + uint32_t sqn; + int32_t result = get_ledger_sqn((uint8_t*)&sqn, sizeof(sqn)); - int x = get_ledger_sqn(); - // if (x >= 0) - // x = *((int32_t*)buf); - // trace_num((uint8_t const *)test`_res, sizeof(test_res) - 1, x); + if (result < 0) + return result; - return x < 0 ? x : (x >= 5 ? x : 0); + return sqn >= 5 ? 5 : 0; } diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index c49e58eb384..f3ed5ad6f96 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -122,13 +122,13 @@ struct HostFunctions return j_; } - virtual Expected + virtual Expected getLedgerSqn() { return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getParentLedgerTime() { return Unexpected(HostFunctionError::INTERNAL); @@ -140,7 +140,7 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } - virtual Expected + virtual Expected getBaseFee() { return Unexpected(HostFunctionError::INTERNAL); diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index b5ce367004a..d8e080a8ef9 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -82,16 +82,16 @@ class WasmHostFunctionsImpl : public HostFunctions return data_; } - Expected + Expected getLedgerSqn() override; - Expected + Expected getParentLedgerTime() override; Expected getParentLedgerHash() override; - Expected + Expected getBaseFee() override; Expected diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/src/xrpld/app/wasm/HostFuncWrapper.h index 8555fd69a1c..601e9372ddb 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/src/xrpld/app/wasm/HostFuncWrapper.h @@ -4,11 +4,11 @@ namespace xrpl { -using getLedgerSqn_proto = int32_t(); +using getLedgerSqn_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getLedgerSqn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getParentLedgerTime_proto = int32_t(); +using getParentLedgerTime_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getParentLedgerTime_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -16,7 +16,7 @@ using getParentLedgerHash_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getParentLedgerHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using getBaseFee_proto = int32_t(); +using getBaseFee_proto = int32_t(uint8_t*, int32_t); wasm_trap_t* getBaseFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -96,7 +96,7 @@ using ammKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t wasm_trap_t* ammKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using checkKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using checkKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* checkKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -117,7 +117,7 @@ using didKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* didKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using escrowKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using escrowKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* escrowKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -126,7 +126,7 @@ using lineKeylet_proto = wasm_trap_t* lineKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using mptIssuanceKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using mptIssuanceKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* mptIssuanceKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -134,23 +134,24 @@ using mptokenKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int wasm_trap_t* mptokenKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using nftOfferKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using nftOfferKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* nftOfferKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using offerKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using offerKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* offerKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using oracleKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using oracleKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* oracleKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using paychanKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using paychanKeylet_proto = + int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* paychanKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using permissionedDomainKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using permissionedDomainKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* permissionedDomainKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); @@ -158,11 +159,11 @@ using signersKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* signersKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using ticketKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using ticketKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* ticketKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); -using vaultKeylet_proto = int32_t(uint8_t const*, int32_t, int32_t, uint8_t*, int32_t); +using vaultKeylet_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); wasm_trap_t* vaultKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp index 1889341ebe3..57ef79e11a6 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp @@ -9,22 +9,16 @@ namespace xrpl { // SECTION: LEDGER HEADER FUNCTIONS // ========================================================= -Expected +Expected WasmHostFunctionsImpl::getLedgerSqn() { - auto seq = ctx.view().seq(); - if (seq > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); // LCOV_EXCL_LINE - return static_cast(seq); + return ctx.view().seq(); } -Expected +Expected WasmHostFunctionsImpl::getParentLedgerTime() { - auto time = ctx.view().parentCloseTime().time_since_epoch().count(); - if (time > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(time); + return ctx.view().parentCloseTime().time_since_epoch().count(); } Expected @@ -33,13 +27,10 @@ WasmHostFunctionsImpl::getParentLedgerHash() return ctx.view().header().parentHash; } -Expected +Expected WasmHostFunctionsImpl::getBaseFee() { - auto fee = ctx.view().fees().base.drops(); - if (fee > std::numeric_limits::max()) - return Unexpected(HostFunctionError::INTERNAL); - return static_cast(fee); + return ctx.view().fees().base.drops(); } Expected diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index ffae4de7eda..34cfac416ec 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -56,27 +56,42 @@ getDataInt64(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) return result; } -template -Expected -getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +template +Expected +getDataUnsigned(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) { + static_assert(std::is_unsigned_v); auto const r = getDataSlice(runtime, params, i); if (!r) return Unexpected(r.error()); - if (r->size() != sizeof(uint64_t)) + if (r->size() != sizeof(T)) return Unexpected(HostFunctionError::INVALID_PARAMS); - uint64_t x; + T x; uintptr_t p = reinterpret_cast(r->data()); - if (p & (alignof(uint64_t) - 1)) // unaligned - memcpy(&x, r->data(), sizeof(uint64_t)); + if (p & (alignof(T) - 1)) // unaligned + memcpy(&x, r->data(), sizeof(T)); else - x = *reinterpret_cast(r->data()); + x = *reinterpret_cast(r->data()); x = adjustWasmEndianess(x); return x; } +template +Expected +getDataUInt32(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + return getDataUnsigned(runtime, params, i); +} + +template +Expected +getDataUInt64(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) +{ + return getDataUnsigned(runtime, params, i); +} + template Expected getDataSField(IW const* _runtime, wasm_val_vec_t const* params, int32_t& i) @@ -791,10 +806,10 @@ checkKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* result return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->checkKeylet(acc.value(), *seq), index); @@ -911,10 +926,10 @@ escrowKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resul return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->escrowKeylet(*acc, *seq), index); @@ -965,10 +980,10 @@ mptIssuanceKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->mptIssuanceKeylet(acc.value(), seq.value()), index); @@ -1019,10 +1034,10 @@ nftOfferKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* res return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->nftOfferKeylet(acc.value(), seq.value()), index); @@ -1043,10 +1058,10 @@ offerKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* result return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->offerKeylet(acc.value(), seq.value()), index); @@ -1067,10 +1082,10 @@ oracleKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resul return hfResult(results, acc.error()); } - auto const documentId = getDataInt32(runtime, params, index); + auto const documentId = getDataUInt32(runtime, params, index); if (!documentId) { - return hfResult(results, documentId.error()); // LCOV_EXCL_LINE + return hfResult(results, documentId.error()); } return returnResult(runtime, params, results, hf->oracleKeylet(*acc, *documentId), index); } @@ -1096,10 +1111,10 @@ paychanKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resu return hfResult(results, dest.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->paychanKeylet(acc.value(), dest.value(), seq.value()), index); @@ -1120,10 +1135,10 @@ permissionedDomainKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_ return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->permissionedDomainKeylet(acc.value(), seq.value()), index); @@ -1162,10 +1177,10 @@ ticketKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resul return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->ticketKeylet(acc.value(), seq.value()), index); @@ -1186,10 +1201,10 @@ vaultKeylet_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* result return hfResult(results, acc.error()); } - auto const seq = getDataInt32(runtime, params, index); + auto const seq = getDataUInt32(runtime, params, index); if (!seq) { - return hfResult(results, seq.error()); // LCOV_EXCL_LINE + return hfResult(results, seq.error()); } return returnResult(runtime, params, results, hf->vaultKeylet(acc.value(), seq.value()), index); From ba03a8a9d29a0f4bcd9f351832239cef50bb398b Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 3 Feb 2026 17:43:54 -0500 Subject: [PATCH 170/212] Fix negation of int64_t (#6296) --- src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index 36231ec37dc..abff96a08d4 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -93,7 +93,7 @@ class Number2 : public Number makeNumber(int64_t mantissa, int32_t exponent) { if (mantissa < 0) - return Number(true, -mantissa, exponent, Number::normalized()); + return Number(true, -static_cast(mantissa), exponent, Number::normalized()); return Number(false, mantissa, exponent, Number::normalized()); } From a9a94fbf1a3b5eb97050066b1c6d2dd154cd0154 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Feb 2026 13:24:50 -0500 Subject: [PATCH 171/212] fix tests --- src/test/app/EscrowSmart_test.cpp | 63 +- .../all_host_functions/Cargo.lock | 4 +- .../all_host_functions/Cargo.toml | 2 +- .../app/wasm_fixtures/all_keylets/Cargo.lock | 28 +- .../app/wasm_fixtures/all_keylets/Cargo.toml | 2 +- .../wasm_fixtures/codecov_tests/Cargo.lock | 4 +- .../wasm_fixtures/codecov_tests/Cargo.toml | 2 +- src/test/app/wasm_fixtures/fixtures.cpp | 941 +++++++----------- .../app/wasm_fixtures/float_tests/Cargo.lock | 4 +- .../app/wasm_fixtures/float_tests/Cargo.toml | 2 +- 10 files changed, 426 insertions(+), 626 deletions(-) diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 2df38c76175..093e65cb1bf 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -370,12 +370,11 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnWasmHex; - std::uint32_t const allowance = 178; + std::uint32_t const allowance = 467; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto [createFee, finishFee] = [&]() { Env env(*this, features); - auto createFee = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto createFee = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; auto finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; return std::make_pair(createFee, finishFee); @@ -388,7 +387,10 @@ struct EscrowSmart_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), fee(createFee)); + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); env.close(); if (BEAST_EXPECT(env.ownerCount(alice) == 2)) @@ -452,7 +454,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); // create escrow env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::condition(escrow::cb1), escrow::cancel_time(env.now() + 100s), fee(createFee)); @@ -503,10 +505,11 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) - BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); + BEAST_EXPECTS( + txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, + txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); @@ -523,7 +526,7 @@ struct EscrowSmart_test : public beast::unit_test::suite BEAST_EXPECT(env.ownerCount(alice) == 0); auto const ts = env.now() + 97s; env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::finish_time(ts), escrow::cancel_time(env.now() + 1000s), fee(createFee)); @@ -557,7 +560,7 @@ struct EscrowSmart_test : public beast::unit_test::suite BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 13, + txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT(env.ownerCount(alice) == 0); @@ -572,7 +575,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::finish_time(env.now() + 2s), escrow::cancel_time(env.now() + 100s), fee(createFee)); @@ -611,7 +614,7 @@ struct EscrowSmart_test : public beast::unit_test::suite BEAST_EXPECT(txMeta->getFieldU32(sfGasUsed) == allowance); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 6, + txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); env.close(); @@ -629,8 +632,6 @@ struct EscrowSmart_test : public beast::unit_test::suite using namespace std::chrono; // wasm that always fails - static auto const wasmHex = updateDataWasmHex; - Account const alice{"alice"}; Account const carol{"carol"}; @@ -640,9 +641,9 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, alice, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount txnFees = env.current()->fees().base * 10 + updateDataWasmHex.size() / 2 * 5; env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(updateDataWasmHex), escrow::finish_time(env.now() + 2s), escrow::cancel_time(env.now() + 100s), fee(txnFees)); @@ -650,7 +651,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); env.close(); - if (BEAST_EXPECT(env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + if (BEAST_EXPECT(env.ownerCount(alice) == (1 + updateDataWasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); @@ -692,12 +693,11 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - auto const& wasmHex = ledgerSqnWasmHex; - uint64_t const allowance = 178; + uint64_t const allowance = 467; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto createFee = [&]() { Env env(*this, features); - auto createFee = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + auto createFee = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; return createFee; }(); @@ -720,7 +720,10 @@ struct EscrowSmart_test : public beast::unit_test::suite env.fund(XRP(5000), alice, carol); auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); - env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), fee(createFee)); + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(createFee)); env.close(); if (BEAST_EXPECT(env.ownerCount(alice) == 2)) @@ -759,7 +762,7 @@ struct EscrowSmart_test : public beast::unit_test::suite txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( - txMeta->getFieldI32(sfWasmReturnCode) == 260, + txMeta->getFieldI32(sfWasmReturnCode) == 5, std::to_string(txMeta->getFieldI32(sfWasmReturnCode))); BEAST_EXPECT(env.ownerCount(alice) == 0); @@ -776,8 +779,6 @@ struct EscrowSmart_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = allHostFunctionsWasmHex; - Account const alice{"alice"}; Account const carol{"carol"}; @@ -788,16 +789,16 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount txnFees = env.current()->fees().base * 10 + allHostFunctionsWasmHex.size() / 2 * 5; env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(allHostFunctionsWasmHex), escrow::finish_time(env.now() + 11s), escrow::cancel_time(env.now() + 100s), escrow::data("1000000000"), // 1000 XRP in drops fee(txnFees)); env.close(); - if (BEAST_EXPECT(env.ownerCount(alice) == (1 + wasmHex.size() / 2 / 500))) + if (BEAST_EXPECT(env.ownerCount(alice) == (1 + allHostFunctionsWasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); @@ -828,7 +829,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 62'715, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == 64'292, std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); @@ -847,8 +848,6 @@ struct EscrowSmart_test : public beast::unit_test::suite using namespace std::chrono; // TODO: create wasm module for all host functions - static auto wasmHex = allKeyletsWasmHex; - Account const alice{"alice"}; Account const carol{"carol"}; @@ -894,9 +893,9 @@ struct EscrowSmart_test : public beast::unit_test::suite if (BEAST_EXPECTS(env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); - XRPAmount txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount txnFees = env.current()->fees().base * 10 + allKeyletsWasmHex.size() / 2 * 5; env(escrow::create(alice, carol, XRP(1000)), - escrow::finish_function(wasmHex), + escrow::finish_function(allKeyletsWasmHex), escrow::finish_time(env.now() + 2s), escrow::cancel_time(env.now() + 100s), fee(txnFees)); @@ -904,7 +903,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); env.close(); - auto const allowance = 182'903; + auto const allowance = 184'444; auto const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), fee(finishFee)); diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock index dc4aa73edb7..c3cd0e33420 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml index 102eb32cc04..82f6ce05a35 100644 --- a/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_host_functions/Cargo.toml @@ -10,7 +10,7 @@ edition = "2024" crate-type = ["cdylib"] [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock index d45ec0df789..ae759c2b09a 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.lock +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.lock @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -64,9 +64,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -74,24 +74,24 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.177" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] name = "proc-macro2" -version = "1.0.103" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.41" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.108" +version = "2.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" dependencies = [ "proc-macro2", "quote", @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=fix-keylets#591160f2dc794b7894e7402dc0c956fca746eedb" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=fix-keylets#591160f2dc794b7894e7402dc0c956fca746eedb" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml index abd232e636e..f3e36c1646b 100644 --- a/src/test/app/wasm_fixtures/all_keylets/Cargo.toml +++ b/src/test/app/wasm_fixtures/all_keylets/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "fix-keylets" } [profile.dev] panic = "abort" diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock index 4a4b71bdcce..c2996b48cb4 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml index 81a682bb379..5031bcb5665 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/codecov_tests/Cargo.toml @@ -15,4 +15,4 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 1c37ca70bb0..345b56f9730 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -226,227 +226,150 @@ extern std::string const ledgerSqnWasmHex = "626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60027f7f017f60037f7f7f017f60047f7f7f7f017f60017f017f" - "60067f7f7f7f7f7f017f60037f7f7f0060057f7f7f7f7f017f60037f7f7e017f60087f7f7f" - "7f7f7f7f7f017f60017f0060027f7f006000017f02ae061a08686f73745f6c69620c676574" - "5f74785f6669656c64000108686f73745f6c69620974726163655f6e756d000708686f7374" - "5f6c6962057472616365000608686f73745f6c69620e6765745f6c65646765725f73716e00" - "0008686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500000868" - "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000008686f7374" - "5f6c6962136765745f74785f6e65737465645f6669656c64000208686f73745f6c69621067" - "65745f74785f61727261795f6c656e000308686f73745f6c6962176765745f74785f6e6573" - "7465645f61727261795f6c656e000008686f73745f6c69621c6765745f63757272656e745f" - "6c65646765725f6f626a5f6669656c64000108686f73745f6c6962236765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c6962" - "206765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e00030868" - "6f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e000008686f73745f6c69621063616368655f6c65646765725f6f62" - "6a000108686f73745f6c69621163726564656e7469616c5f6b65796c6574000808686f7374" - "5f6c69620d657363726f775f6b65796c6574000408686f73745f6c69620d6f7261636c655f" - "6b65796c6574000408686f73745f6c696213636f6d707574655f7368613531325f68616c66" - "000208686f73745f6c6962076765745f6e6674000408686f73745f6c69620b757064617465" - "5f64617461000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64" - "000208686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f666965" - "6c64000608686f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c65" - "6e000008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f6172" - "7261795f6c656e000108686f73745f6c69620e6163636f756e745f6b65796c657400020868" - "6f73745f6c69620d74726163655f6163636f756e740002030c0b090a05050b050001010300" - "05030100110619037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d" - "656d6f727902000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f" - "6261736503020ac61d0b990101027f230041306b220124002000027f418180202001411c6a" - "4114100022024114470440417f20022002417f4e1b210241010c010b200020012f001c3b00" - "01200041036a2001411e6a2d00003a0000200120012900233703082001200141286a290000" - "37000d200128001f21022000410d6a200129000d3700002000200129030837020841000b3a" - "000020002002360204200141306a24000b460020012d00004101460440418080c000410b20" - "013402041001000b20002001290001370000200041106a200141116a280000360000200041" - "086a200141096a2900003700000b1900200241214f0440000b200020023602042000200136" - "02000b1900200241094f0440000b20002002360204200020013602000bde1a01097f230041" - "b0036b22002400418b80c000411b41014100410010021a41a680c000411941014100410010" - "021a41e780c000412b41014100410010021a20004100360270024002400240024002400240" - "02400240200041f0006a220741041003220141004a0440419281c000411720002802702201" - "41187420014180fe03714108747220014108764180fe037120014118767272ad10011a2000" - "41003602900120004190016a220341041004220141004c0d0141a981c00041132000280290" - "01220141187420014180fe03714108747220014108764180fe037120014118767272ad1001" - "1a200041c8016a22024200370300200041c0016a22054200370300200041b8016a22044200" - "370300200042003703b001200041b0016a22064120100522014120470d0241bc81c0004113" - "20064120410110021a41cf81c000412041014100410010021a41dc82c000412e4101410041" - "0010021a200041a0016a410036020020004198016a42003703002000420037039001418180" - "2020034114100022014114470d03418a83c00041142003101f200042003703704188801820" - "074108100022014108470d04419e83c0004117420810011a41b583c0004128200741084101" - "10021a2000410036024841848008200041c8006a22034104100022014104470d0541dd83c0" - "00411520034104410110021a200041013b0034200242003703002005420037030020044200" - "370300200042003703b0010240200041346a4102200641201006220141004e044041f283c0" - "0041142001ad10011a200041286a20062001101c418684c000410d2000280228200028022c" - "410110021a0c010b419384c00041292001ac10011a0b41bc84c00041154183803c1007ac10" - "011a41d184c00041134189803c1007ac10011a0240200041346a41021008220141004e0440" - "41e484c00041142001ad10011a0c010b41f884c000412d2001ac10011a0b41a585c0004123" - "41014100410010021a41de86c000413341014100410010021a200042003703704182801820" - "0041f0006a220141081009220341004c0d0620034108460440419187c000412b420810011a" - "41bc87c000412f20014108410110021a0c080b41eb87c000412f2003ad10011a200041206a" - "200041f0006a2003101d419a88c000411720002802202000280224410110021a0c070b41bf" - "82c000411d2001ac10011a419b7f21020c070b419a82c00041252001ac10011a419a7f2102" - "0c060b41ef81c000412b2001ac10011a41997f21020c050b41b486c000412a2001ac10011a" - "41b77e21020c040b41f385c00041c1002001ac10011a41b67e21020c030b41c885c000412b" - "2001ac10011a41b57e21020c020b41b188c00041c5002003ac10011a0b200041a0016a4100" - "36020020004198016a4200370300200042003703900102404181802020004190016a220341" - "141009220141004a044041f688c000411e2003101f0c010b419489c00041332001ac10011a" - "0b200041013b0048200041c8016a4200370300200041c0016a4200370300200041b8016a42" - "00370300200042003703b0010240200041c8006a4102200041b0016a22014120100a220341" - "004e044041c789c000411c2003ad10011a200041186a20012003101c41e389c00041152000" - "280218200028021c410110021a0c010b41f889c00041392003ac10011a0b41b18ac0004124" - "4183803c100bac10011a0240200041c8006a4102100c220141004e044041d58ac000411c20" - "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284101410041001002" - "1a41d68bc000412f41014100410010021a200041b0016a2203101a200041f0006a22012003" - "101b200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" - "42003703900102400240024002400240200120004190016a22031020220141204604402003" - "41204100100d220441004a044041858cc00041232004ad10011a2000420037034820042000" - "41c8006a220141081021220341004c0d022003410846044041a88cc000412a420810011a41" - "d28cc000412e20014108410110021a0c060b41808dc000412e2003ad10011a200041106a20" - "0041c8006a2003101d41ae8dc000411620002802102000280214410110021a0c050b41e68f" - "c000413c2004ac10011a200041c8016a4200370300200041c0016a4200370300200041b801" - "6a4200370300200042003703b0014101200041b0016a4120102122014100480d020c030b41" - "ba92c000412e2001ac10011a41ef7c21020c050b41c48dc000412b2003ac10011a0c020b41" - "a290c00041c1002001ac10011a0b200041013b00484101200041c8006a200041b0016a1022" - "2201410048044041e390c00041352001ac10011a0b4101102322014100480440419891c000" - "41322001ac10011a0b4101200041c8006a10242201410048044041ca91c00041392001ac10" - "011a0b418392c000413741014100410010021a0c010b200041013b0034200041c8016a4200" - "370300200041c0016a4200370300200041b8016a4200370300200042003703b00102402004" - "200041346a200041b0016a22011022220341004e044041ef8dc000411b2003ad10011a2000" - "41086a20012003101c418a8ec00041142000280208200028020c410110021a0c010b419e8e" - "c00041312003ac10011a0b41cf8ec000412320041023ac10011a02402004200041346a1024" - "220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b" - "41c28fc000412441014100410010021a0b41e892c000412f41014100410010021a200041b0" - "016a2201101a200041346a22042001101b200041e0006a4200370300200041d8006a420037" - "0300200041d0006a420037030020004200370348024002400240024002402004200041c800" - "6a2203102022014120460440419793c000410f20034120410110021a20004188016a420037" - "030020004180016a4200370300200041f8006a420037030020004200370370024020044114" - "2004411441a693c0004109200041f0006a22014120100e220341004a044020002001200310" - "1c41ae93c000411220002802002000280204410110021a0c010b41c093c000413c2003ac10" - "011a0b200041a8016a22064200370300200041a0016a2202420037030020004198016a2205" - "4200370300200042003703900120004180808cc07e360268200041346a22034114200041e8" - "006a410420004190016a22084120100f22014120470d0141fc93c000410e20084120410110" - "021a200041c8016a4200370300200041c0016a4200370300200041b8016a42003703002000" - "42003703b001200041808080d00236026c20034114200041ec006a4104200041b0016a2204" - "4120101022014120470d02418a94c000410e20044120410110021a419894c0004124410141" - "00410010021a419195c000412541014100410010021a20004188016a420037030020004180" - "016a4200370300200041f8006a42003703002000420037037041b695c0004117200041f000" - "6a22034120101122014120470d0341cd95c000410b41b695c0004117410110021a41d895c0" - "00411120034120410110021a2004101a200041c8006a22072004101b200642003703002002" - "420037030020054200370300200042003703900102404100200422026b410371220320026a" - "220520024d0d0020030440200321010340200241003a0000200241016a2102200141016b22" - "010d000b0b200341016b4107490d000340200241003a0000200241076a41003a0000200241" - "066a41003a0000200241056a41003a0000200241046a41003a0000200241036a41003a0000" - "200241026a41003a0000200241016a41003a0000200241086a22022005470d000b0b200541" - "800220036b2201417c716a220220054b0440034020054100360200200541046a2205200249" - "0d000b0b024020022001410371220120026a22034f0d002001220504400340200241003a00" - "00200241016a2102200541016b22050d000b0b200141016b4107490d000340200241003a00" - "00200241076a41003a0000200241066a41003a0000200241056a41003a0000200241046a41" - "003a0000200241036a41003a0000200241026a41003a0000200241016a41003a0000200241" - "086a22022003470d000b0b0240200741142008412020044180021012220141004a044041e9" - "95c00041102001ad10011a20014181024f0d0641f995c000410920042001410110021a0c01" - "0b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101100222014100" - "480d0541c996c000411d2001ad10011a41e696c0004111422a1001410048044041ad97c000" - "411a42a47b10011a41a47b21020c070b41f796c000411c420010011a41012102419397c000" - "411a41014100410010021a41ff97c000412941014100410010021a41a898c0004128101322" - "01412846044041d098c000412741a898c0004128410110021a41f798c000411e4101410041" - "0010021a41bf80c000412841014100410010021a0c070b419599c000411a2001ac10011a41" - "c37a21020c060b41f494c000411d2001ac10011a418b7c21020c050b41d894c000411c2001" - "ac10011a41897c21020c040b41bc94c000411c2001ac10011a41887c21020c030b41dd97c0" - "0041222001ac10011a41a77b21020c020b000b41c797c00041162001ac10011a41a57b2102" - "0b200041b0036a240020020b0d00200020012002411410191a0b0c00200041142001412010" - "180b0e002000418280182001200210140b0e002000200141022002412010150b0a00200041" - "83803c10160b0a0020002001410210170b0bb9190100418080c0000baf196572726f725f63" - "6f64653d3d3d3d20484f53542046554e4354494f4e532054455354203d3d3d54657374696e" - "6720323620686f73742066756e6374696f6e73535543434553533a20416c6c20686f737420" - "66756e6374696f6e20746573747320706173736564212d2d2d2043617465676f727920313a" - "204c6564676572204865616465722046756e6374696f6e73202d2d2d4c6564676572207365" - "7175656e6365206e756d6265723a506172656e74206c65646765722074696d653a50617265" - "6e74206c656467657220686173683a535543434553533a204c656467657220686561646572" - "2066756e6374696f6e734552524f523a206765745f706172656e745f6c65646765725f6861" - "73682077726f6e67206c656e6774683a4552524f523a206765745f706172656e745f6c6564" - "6765725f74696d65206661696c65643a4552524f523a206765745f6c65646765725f73716e" - "206661696c65643a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" - "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a" - "5472616e73616374696f6e20466565206c656e6774683a5472616e73616374696f6e204665" - "65202873657269616c697a65642058525020616d6f756e74293a5472616e73616374696f6e" - "2053657175656e63653a4e6573746564206669656c64206c656e6774683a4e657374656420" - "6669656c643a494e464f3a206765745f74785f6e65737465645f6669656c64206e6f742061" - "70706c696361626c653a5369676e657273206172726179206c656e6774683a4d656d6f7320" - "6172726179206c656e6774683a4e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f74785f6e65737465645f61727261795f6c656e206e6f74206170706c696361" - "626c653a535543434553533a205472616e73616374696f6e20646174612066756e6374696f" - "6e734552524f523a206765745f74785f6669656c642853657175656e6365292077726f6e67" - "206c656e6774683a4552524f523a206765745f74785f6669656c6428466565292077726f6e" - "67206c656e67746820286578706563746564203820627974657320666f7220585250293a45" - "52524f523a206765745f74785f6669656c64284163636f756e74292077726f6e67206c656e" - "6774683a2d2d2d2043617465676f727920333a2043757272656e74204c6564676572204f62" - "6a6563742046756e6374696f6e73202d2d2d43757272656e74206f626a6563742062616c61" - "6e6365206c656e677468202858525020616d6f756e74293a43757272656e74206f626a6563" - "742062616c616e6365202873657269616c697a65642058525020616d6f756e74293a437572" - "72656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e2d5852502061" - "6d6f756e74293a43757272656e74206f626a6563742062616c616e63653a494e464f3a2067" - "65745f63757272656e745f6c65646765725f6f626a5f6669656c642842616c616e63652920" - "6661696c656420286d6179206265206578706563746564293a43757272656e74206c656467" - "6572206f626a656374206163636f756e743a494e464f3a206765745f63757272656e745f6c" - "65646765725f6f626a5f6669656c64284163636f756e7429206661696c65643a4375727265" - "6e74206e6573746564206669656c64206c656e6774683a43757272656e74206e6573746564" - "206669656c643a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e" - "65737465645f6669656c64206e6f74206170706c696361626c653a43757272656e74206f62" - "6a656374205369676e657273206172726179206c656e6774683a43757272656e74206e6573" - "746564206172726179206c656e6774683a494e464f3a206765745f63757272656e745f6c65" - "646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361" - "626c653a535543434553533a2043757272656e74206c6564676572206f626a656374206675" - "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564676572204f626a" - "6563742046756e6374696f6e73202d2d2d5375636365737366756c6c792063616368656420" - "6f626a65637420696e20736c6f743a436163686564206f626a6563742062616c616e636520" - "6c656e677468202858525020616d6f756e74293a436163686564206f626a6563742062616c" - "616e6365202873657269616c697a65642058525020616d6f756e74293a436163686564206f" - "626a6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e7429" - "3a436163686564206f626a6563742062616c616e63653a494e464f3a206765745f6c656467" - "65725f6f626a5f6669656c642842616c616e636529206661696c65643a436163686564206e" - "6573746564206669656c64206c656e6774683a436163686564206e6573746564206669656c" - "643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e" - "6f74206170706c696361626c653a436163686564206f626a656374205369676e6572732061" - "72726179206c656e6774683a436163686564206e6573746564206172726179206c656e6774" - "683a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e206e6f74206170706c696361626c653a535543434553533a20416e79206c6564676572" - "206f626a6563742066756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f" - "626a206661696c656420286578706563746564207769746820746573742066697874757265" - "73293a494e464f3a206765745f6c65646765725f6f626a5f6669656c64206661696c656420" - "617320657870656374656420286e6f20636163686564206f626a656374293a494e464f3a20" - "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206661696c6564206173" - "2065787065637465643a494e464f3a206765745f6c65646765725f6f626a5f61727261795f" - "6c656e206661696c65642061732065787065637465643a494e464f3a206765745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e206661696c656420617320657870" - "65637465643a535543434553533a20416e79206c6564676572206f626a6563742066756e63" - "74696f6e732028696e7465726661636520746573746564294552524f523a206163636f756e" - "745f6b65796c6574206661696c656420666f722063616368696e6720746573743a2d2d2d20" - "43617465676f727920353a204b65796c65742047656e65726174696f6e2046756e6374696f" - "6e73202d2d2d4163636f756e74206b65796c65743a546573745479706543726564656e7469" - "616c206b65796c65743a494e464f3a2063726564656e7469616c5f6b65796c657420666169" - "6c656420286578706563746564202d20696e74657266616365206973737565293a45736372" - "6f77206b65796c65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" - "65742067656e65726174696f6e2066756e6374696f6e734552524f523a206f7261636c655f" - "6b65796c6574206661696c65643a4552524f523a20657363726f775f6b65796c6574206661" - "696c65643a4552524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d" - "2043617465676f727920363a205574696c6974792046756e6374696f6e73202d2d2d48656c" - "6c6f2c205852504c205741534d20776f726c6421496e70757420646174613a534841353132" - "2068616c6620686173683a4e46542064617461206c656e6774683a4e465420646174613a49" - "4e464f3a206765745f6e6674206661696c656420286578706563746564202d206e6f207375" - "6368204e4654293a54657374207472616365206d6573736167657061796c6f616454726163" - "652066756e6374696f6e206279746573207772697474656e3a54657374206e756d62657220" - "747261636554726163655f6e756d2066756e6374696f6e2073756363656564656453554343" - "4553533a205574696c6974792066756e6374696f6e734552524f523a2074726163655f6e75" - "6d2829206661696c65643a4552524f523a2074726163652829206661696c65643a4552524f" - "523a20636f6d707574655f7368613531325f68616c66206661696c65643a2d2d2d20436174" - "65676f727920373a2044617461205570646174652046756e6374696f6e73202d2d2d557064" - "61746564206c656467657220656e74727920646174612066726f6d205741534d2074657374" - "5375636365737366756c6c792075706461746564206c656467657220656e74727920776974" - "683a535543434553533a2044617461207570646174652066756e6374696f6e734552524f52" - "3a207570646174655f64617461206661696c65643a004d0970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38" - "372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f66" - "65617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "0061736d0100000001540c60027f7f017f60037f7f7f017f60047f7f7f7f017f60017f017f60067f7f7f7f7f7f017f60037f7f7f0060057f7f" + "7f7f7f017f60037f7f7e017f60087f7f7f7f7f7f7f7f017f60017f0060027f7f006000017f02ae061a08686f73745f6c69620c6765745f7478" + "5f6669656c64000108686f73745f6c69620974726163655f6e756d000708686f73745f6c6962057472616365000608686f73745f6c69620e67" + "65745f6c65646765725f73716e000008686f73745f6c6962166765745f706172656e745f6c65646765725f74696d65000008686f73745f6c69" + "62166765745f706172656e745f6c65646765725f68617368000008686f73745f6c6962136765745f74785f6e65737465645f6669656c640002" + "08686f73745f6c6962106765745f74785f61727261795f6c656e000308686f73745f6c6962176765745f74785f6e65737465645f6172726179" + "5f6c656e000008686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000108686f73745f6c69622367" + "65745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c6962206765745f63757272656e74" + "5f6c65646765725f6f626a5f61727261795f6c656e000308686f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e" + "65737465645f61727261795f6c656e000008686f73745f6c69621063616368655f6c65646765725f6f626a000108686f73745f6c6962116372" + "6564656e7469616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c6574000408686f73745f6c69620d6f7261636c" + "655f6b65796c6574000408686f73745f6c696213636f6d707574655f7368613531325f68616c66000208686f73745f6c6962076765745f6e66" + "74000408686f73745f6c69620b7570646174655f64617461000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c6400" + "0208686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c64000608686f73745f6c6962186765745f6c6564" + "6765725f6f626a5f61727261795f6c656e000008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f" + "6c656e000108686f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c69620d74726163655f6163636f756e74000203" + "0c0b090a05050b05000101030005030100110619037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f72790200" + "0666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f6261736503020ac61d0b990101027f230041306b22012400200002" + "7f418180202001411c6a4114100022024114470440417f20022002417f4e1b210241010c010b200020012f001c3b0001200041036a2001411e" + "6a2d00003a0000200120012900233703082001200141286a29000037000d200128001f21022000410d6a200129000d37000020002001290308" + "37020841000b3a000020002002360204200141306a24000b460020012d00004101460440418080c000410b20013402041001000b2000200129" + "0001370000200041106a200141116a280000360000200041086a200141096a2900003700000b1900200241094f0440000b2000200236020420" + "0020013602000b1900200241214f0440000b20002002360204200020013602000bde1a01097f230041b0036b22002400418b80c000411b4101" + "4100410010021a41a680c000411941014100410010021a41e780c000412b41014100410010021a200041003602700240024002400240024002" + "4002400240200041f0006a220741041003220141004a0440419281c00041172000280270220141187420014180fe0371410874722001410876" + "4180fe037120014118767272ad10011a200041003602900120004190016a220341041004220141004c0d0141a981c000411320002802900122" + "0141187420014180fe03714108747220014108764180fe037120014118767272ad10011a200041c8016a22024200370300200041c0016a2205" + "4200370300200041b8016a22044200370300200042003703b001200041b0016a22064120100522014120470d0241bc81c00041132006412041" + "0110021a41cf81c000412041014100410010021a41dc82c000412e41014100410010021a200041a0016a410036020020004198016a42003703" + "0020004200370390014181802020034114100022014114470d03418a83c00041142003101f2000420037037041888018200741081000220141" + "08470d04419e83c0004117420810011a41b583c000412820074108410110021a2000410036024841848008200041c8006a2203410410002201" + "4104470d0541dd83c000411520034104410110021a200041013b0034200242003703002005420037030020044200370300200042003703b001" + "0240200041346a4102200641201006220141004e044041f283c00041142001ad10011a200041286a20062001101d418684c000410d20002802" + "28200028022c410110021a0c010b419384c00041292001ac10011a0b41bc84c00041154183803c1007ac10011a41d184c00041134189803c10" + "07ac10011a0240200041346a41021008220141004e044041e484c00041142001ad10011a0c010b41f884c000412d2001ac10011a0b41a585c0" + "00412341014100410010021a41de86c000413341014100410010021a2000420037037041828018200041f0006a220141081009220341004c0d" + "0620034108460440419187c000412b420810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2003ad10011a200041206a" + "200041f0006a2003101c419a88c000411720002802202000280224410110021a0c070b41bf82c000411d2001ac10011a419b7f21020c070b41" + "9a82c00041252001ac10011a419a7f21020c060b41ef81c000412b2001ac10011a41997f21020c050b41b486c000412a2001ac10011a41b77e" + "21020c040b41f385c00041c1002001ac10011a41b67e21020c030b41c885c000412b2001ac10011a41b57e21020c020b41b188c00041c50020" + "03ac10011a0b200041a0016a410036020020004198016a4200370300200042003703900102404181802020004190016a220341141009220141" + "004a044041f688c000411e2003101f0c010b419489c00041332001ac10011a0b200041013b0048200041c8016a4200370300200041c0016a42" + "00370300200041b8016a4200370300200042003703b0010240200041c8006a4102200041b0016a22014120100a220341004e044041c789c000" + "411c2003ad10011a200041186a20012003101d41e389c00041152000280218200028021c410110021a0c010b41f889c00041392003ac10011a" + "0b41b18ac00041244183803c100bac10011a0240200041c8006a4102100c220141004e044041d58ac000411c2001ad10011a0c010b41f18ac0" + "00413d2001ac10011a0b41ae8bc000412841014100410010021a41d68bc000412f41014100410010021a200041b0016a2203101a200041f000" + "6a22012003101b200041a8016a4200370300200041a0016a420037030020004198016a42003703002000420037039001024002400240024002" + "40200120004190016a2203102022014120460440200341204100100d220441004a044041858cc00041232004ad10011a200042003703482004" + "200041c8006a220141081021220341004c0d022003410846044041a88cc000412a420810011a41d28cc000412e20014108410110021a0c060b" + "41808dc000412e2003ad10011a200041106a200041c8006a2003101c41ae8dc000411620002802102000280214410110021a0c050b41e68fc0" + "00413c2004ac10011a200041c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0014101200041b001" + "6a4120102122014100480d020c030b41ba92c000412e2001ac10011a41ef7c21020c050b41c48dc000412b2003ac10011a0c020b41a290c000" + "41c1002001ac10011a0b200041013b00484101200041c8006a200041b0016a10222201410048044041e390c00041352001ac10011a0b410110" + "2322014100480440419891c00041322001ac10011a0b4101200041c8006a10242201410048044041ca91c00041392001ac10011a0b418392c0" + "00413741014100410010021a0c010b200041013b0034200041c8016a4200370300200041c0016a4200370300200041b8016a42003703002000" + "42003703b00102402004200041346a200041b0016a22011022220341004e044041ef8dc000411b2003ad10011a200041086a20012003101d41" + "8a8ec00041142000280208200028020c410110021a0c010b419e8ec00041312003ac10011a0b41cf8ec000412320041023ac10011a02402004" + "200041346a1024220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b41c28fc0004124410141004100" + "10021a0b41e892c000412f41014100410010021a200041b0016a2201101a200041346a22042001101b200041e0006a4200370300200041d800" + "6a4200370300200041d0006a420037030020004200370348024002400240024002402004200041c8006a2203102022014120460440419793c0" + "00410f20034120410110021a20004188016a420037030020004180016a4200370300200041f8006a4200370300200042003703700240200441" + "142004411441a693c0004109200041f0006a22014120100e220341004a0440200020012003101d41ae93c00041122000280200200028020441" + "0110021a0c010b41c093c000413c2003ac10011a0b200041a8016a22064200370300200041a0016a2202420037030020004198016a22054200" + "370300200042003703900120004180808cc07e360268200041346a22034114200041e8006a410420004190016a22084120100f22014120470d" + "0141fc93c000410e20084120410110021a200041c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0" + "01200041808080d00236026c20034114200041ec006a4104200041b0016a22044120101022014120470d02418a94c000410e20044120410110" + "021a419894c000412441014100410010021a419195c000412541014100410010021a20004188016a420037030020004180016a420037030020" + "0041f8006a42003703002000420037037041b695c0004117200041f0006a22034120101122014120470d0341cd95c000410b41b695c0004117" + "410110021a41d895c000411120034120410110021a2004101a200041c8006a22072004101b2006420037030020024200370300200542003703" + "00200042003703900102404100200422026b410371220320026a220520024d0d0020030440200321010340200241003a0000200241016a2102" + "200141016b22010d000b0b200341016b4107490d000340200241003a0000200241076a41003a0000200241066a41003a0000200241056a4100" + "3a0000200241046a41003a0000200241036a41003a0000200241026a41003a0000200241016a41003a0000200241086a22022005470d000b0b" + "200541800220036b2201417c716a220220054b0440034020054100360200200541046a22052002490d000b0b02402002200141037122012002" + "6a22034f0d002001220504400340200241003a0000200241016a2102200541016b22050d000b0b200141016b4107490d000340200241003a00" + "00200241076a41003a0000200241066a41003a0000200241056a41003a0000200241046a41003a0000200241036a41003a0000200241026a41" + "003a0000200241016a41003a0000200241086a22022003470d000b0b0240200741142008412020044180021012220141004a044041e995c000" + "41102001ad10011a20014181024f0d0641f995c000410920042001410110021a0c010b418296c000412e2001ac10011a0b41b096c000411241" + "c296c00041074101100222014100480d0541c996c000411d2001ad10011a41e696c0004111422a1001410048044041ad97c000411a42a47b10" + "011a41a47b21020c070b41f796c000411c420010011a41012102419397c000411a41014100410010021a41ff97c00041294101410041001002" + "1a41a898c000412810132201412846044041d098c000412741a898c0004128410110021a41f798c000411e41014100410010021a41bf80c000" + "412841014100410010021a0c070b419599c000411a2001ac10011a41c37a21020c060b41f494c000411d2001ac10011a418b7c21020c050b41" + "d894c000411c2001ac10011a41897c21020c040b41bc94c000411c2001ac10011a41887c21020c030b41dd97c00041222001ac10011a41a77b" + "21020c020b000b41c797c00041162001ac10011a41a57b21020b200041b0036a240020020b0d00200020012002411410191a0b0c0020004114" + "2001412010180b0e002000418280182001200210140b0e002000200141022002412010150b0a0020004183803c10160b0a0020002001410210" + "170b0bb9190100418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f4e532054455354203d3d3d54657374" + "696e6720323620686f73742066756e6374696f6e73535543434553533a20416c6c20686f73742066756e6374696f6e20746573747320706173" + "736564212d2d2d2043617465676f727920313a204c6564676572204865616465722046756e6374696f6e73202d2d2d4c656467657220736571" + "75656e6365206e756d6265723a506172656e74206c65646765722074696d653a506172656e74206c656467657220686173683a535543434553" + "533a204c6564676572206865616465722066756e6374696f6e734552524f523a206765745f706172656e745f6c65646765725f686173682077" + "726f6e67206c656e6774683a4552524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a4552524f523a2067" + "65745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f727920323a205472616e73616374696f6e20446174612046756e" + "6374696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a5472616e73616374696f6e20466565206c656e6774683a5472616e" + "73616374696f6e20466565202873657269616c697a65642058525020616d6f756e74293a5472616e73616374696f6e2053657175656e63653a" + "4e6573746564206669656c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e65737465645f6669656c" + "64206e6f74206170706c696361626c653a5369676e657273206172726179206c656e6774683a4d656d6f73206172726179206c656e6774683a" + "4e6573746564206172726179206c656e6774683a494e464f3a206765745f74785f6e65737465645f61727261795f6c656e206e6f7420617070" + "6c696361626c653a535543434553533a205472616e73616374696f6e20646174612066756e6374696f6e734552524f523a206765745f74785f" + "6669656c642853657175656e6365292077726f6e67206c656e6774683a4552524f523a206765745f74785f6669656c6428466565292077726f" + "6e67206c656e67746820286578706563746564203820627974657320666f7220585250293a4552524f523a206765745f74785f6669656c6428" + "4163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a2043757272656e74204c6564676572204f626a65" + "63742046756e6374696f6e73202d2d2d43757272656e74206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74" + "293a43757272656e74206f626a6563742062616c616e6365202873657269616c697a65642058525020616d6f756e74293a43757272656e7420" + "6f626a6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563742062616c" + "616e63653a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642842616c616e636529206661696c65642028" + "6d6179206265206578706563746564293a43757272656e74206c6564676572206f626a656374206163636f756e743a494e464f3a206765745f" + "63757272656e745f6c65646765725f6f626a5f6669656c64284163636f756e7429206661696c65643a43757272656e74206e65737465642066" + "69656c64206c656e6774683a43757272656e74206e6573746564206669656c643a494e464f3a206765745f63757272656e745f6c6564676572" + "5f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a43757272656e74206f626a656374205369676e6572732061" + "72726179206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e464f3a206765745f63757272656e74" + "5f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361626c653a535543434553533a2043757272" + "656e74206c6564676572206f626a6563742066756e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564676572204f626a" + "6563742046756e6374696f6e73202d2d2d5375636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a4361636865" + "64206f626a6563742062616c616e6365206c656e677468202858525020616d6f756e74293a436163686564206f626a6563742062616c616e63" + "65202873657269616c697a65642058525020616d6f756e74293a436163686564206f626a6563742062616c616e6365206c656e67746820286e" + "6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e63653a494e464f3a206765745f6c65646765725f6f626a" + "5f6669656c642842616c616e636529206661696c65643a436163686564206e6573746564206669656c64206c656e6774683a43616368656420" + "6e6573746564206669656c643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c6963" + "61626c653a436163686564206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e657374656420617272" + "6179206c656e6774683a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c69" + "6361626c653a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f6e73494e464f3a2063616368655f6c6564" + "6765725f6f626a206661696c65642028657870656374656420776974682074657374206669787475726573293a494e464f3a206765745f6c65" + "646765725f6f626a5f6669656c64206661696c656420617320657870656374656420286e6f20636163686564206f626a656374293a494e464f" + "3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206661696c65642061732065787065637465643a494e464f3a206765" + "745f6c65646765725f6f626a5f61727261795f6c656e206661696c65642061732065787065637465643a494e464f3a206765745f6c65646765" + "725f6f626a5f6e65737465645f61727261795f6c656e206661696c65642061732065787065637465643a535543434553533a20416e79206c65" + "64676572206f626a6563742066756e6374696f6e732028696e7465726661636520746573746564294552524f523a206163636f756e745f6b65" + "796c6574206661696c656420666f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047656e6572" + "6174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65743a546573745479706543726564656e7469616c206b65796c" + "65743a494e464f3a2063726564656e7469616c5f6b65796c6574206661696c656420286578706563746564202d20696e746572666163652069" + "73737565293a457363726f77206b65796c65743a4f7261636c65206b65796c65743a535543434553533a204b65796c65742067656e65726174" + "696f6e2066756e6374696f6e734552524f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a20657363726f775f6b65" + "796c6574206661696c65643a4552524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f727920363a20" + "5574696c6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c6421496e70757420646174613a5348" + "413531322068616c6620686173683a4e46542064617461206c656e6774683a4e465420646174613a494e464f3a206765745f6e667420666169" + "6c656420286578706563746564202d206e6f2073756368204e4654293a54657374207472616365206d6573736167657061796c6f6164547261" + "63652066756e6374696f6e206279746573207772697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e63" + "74696f6e20737563636565646564535543434553533a205574696c6974792066756e6374696f6e734552524f523a2074726163655f6e756d28" + "29206661696c65643a4552524f523a2074726163652829206661696c65643a4552524f523a20636f6d707574655f7368613531325f68616c66" + "206661696c65643a2d2d2d2043617465676f727920373a2044617461205570646174652046756e6374696f6e73202d2d2d5570646174656420" + "6c656467657220656e74727920646174612066726f6d205741534d20746573745375636365737366756c6c792075706461746564206c656467" + "657220656e74727920776974683a535543434553533a2044617461207570646174652066756e6374696f6e734552524f523a20757064617465" + "5f64617461206661696c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d62790105" + "72757374631d312e38372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f6665617475726573022b0f6d" + "757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69" @@ -487,249 +410,164 @@ extern std::string const hfPerfTest = "0a6d756c746976616c7565"; extern std::string const allKeyletsWasmHex = - "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f" - "7f7f017f60037f7f7f017f60037f7f7e017f60057f7f7f7f7f017f60057f7f7f7f7f006000" - "017f60037f7f7f000284051808686f73745f6c69620974726163655f6e756d000408686f73" - "745f6c6962057472616365000508686f73745f6c69621063616368655f6c65646765725f6f" - "626a000308686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108" - "686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64" - "000308686f73745f6c69620d74726163655f6163636f756e74000108686f73745f6c69620e" - "6163636f756e745f6b65796c6574000108686f73745f6c69620b6c696e655f6b65796c6574" - "000208686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69620c636865" - "636b5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c65" - "74000208686f73745f6c69620f64656c65676174655f6b65796c6574000008686f73745f6c" - "6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a" - "6469645f6b65796c6574000108686f73745f6c69620d657363726f775f6b65796c65740000" - "08686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008686f73745f" - "6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c6962106e66745f6f6666" - "65725f6b65796c6574000008686f73745f6c69620c6f666665725f6b65796c657400000868" - "6f73745f6c69620e7061796368616e5f6b65796c6574000208686f73745f6c69621a706572" - "6d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620e7369" - "676e6572735f6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574" - "000008686f73745f6c69620c7661756c745f6b65796c657400000304030607080503010011" - "0619037f01418080c0000b7f0041ad8ac0000b7f0041b08ac0000b073e05066d656d6f7279" - "02000d6f626a6563745f65786973747300180666696e69736800190a5f5f646174615f656e" - "6403010b5f5f686561705f6261736503020ab73403a80502017f017e230041a0016b220524" - "00024020012d0000410146044041c280c000411620012802042201ac10001a200041013a00" - "00200020013602040c010b200541186a200141196a290000370300200541106a200141116a" - "290000370300200541086a200141096a290000370300200520012900013703002002200320" - "054120410110011a02402005412041001002220141004a04402004450440418b80c000410f" - "4285801410001a20014185801420054180016a412010032201412047044041a680c0004115" - "417f20012001417f4e1b2201ac10001a200041013a0000200020013602040c040b200541c2" - "006a20054182016a2d00003a0000200541f0006a20054197016a2900002206370300200541" - "286a22012005418f016a290000370300200541306a22022006370300200541386a22032005" - "419f016a2d00003a0000200520052f0080013b014020052005290087013703202005200528" - "008301360043200541df006a20032d00003a0000200541d7006a2002290300370000200541" - "cf006a200129030037000020052005290320370047419a80c000410c200541406b41204101" - "10011a0c020b418b80c000410f2004ac10001a2001200420054180016a4114100322014114" - "47044041a680c0004115417f20012001417f4e1b2201ac10001a200041013a000020002001" - "3602040c030b200541c2006a20054182016a2d00003a000020052005290087013703602005" - "2005418c016a290000370065200520052f0080013b01402005200529036037032020052005" - "2900653700252005200528008301360043200541cc006a2005290025370000200520052903" - "20370047419a80c000410c200541406b4114410110011a0c010b41bb80c00041072001ac10" - "001a200041013a0000200020013602040c010b20004180023b01000b200541a0016a24000b" - "8b2a02087f027e23004180076b2200240041d880c000412341014100410010011a02402000" - "027f02404181802020004188016a22024114100422014114460440200041066a2000418a01" - "6a22032d00003a00002000200029008f013703e001200020004194016a22042900003700e5" - "01200020002f0088013b0104200020002903e0013703d806200020002900e5013700dd0620" - "00200028008b01360007200041106a20002900dd06370000200020002903d80637000b41fb" - "80c0004108200041046a2205411410051a4183802020024114100422014114470d03200041" - "1a6a20032d00003a00002000200029008f013703e001200020042900003700e50120002000" - "2f0088013b0118200020002903e0013703d806200020002900e5013700dd06200020002800" - "8b0136001b200041246a20002900dd06370000200020002903d80637001f418381c000410c" - "200041186a411410051a200041a0016a2203420037030020004198016a2204420037030020" - "004190016a420037030020004200370388012005411420024120100622014120460d010240" - "20014100480440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5" - "006a20032903003700002000413d6a2004290300370000200041356a20004190016a290300" - "370000200020002903880137002d41000b3a002c20004188016a2000412c6a418f81c00041" - "07418180201018024020002d0088014101460440200028028c01210141878ac00041124205" - "10001a0c010b41002101419681c000413541014100410010011a200041de006a41c4003a00" - "00200041d8006a4100360200200041e3006a41003a0000200041d5a6013b015c2000420037" - "03502000410036005f200041a0016a2203420037030020004198016a220442003703002000" - "4190016a2205420037030020004200370388010240200041046a4114200041186a41142000" - "41d0006a411420004188016a41201007220241204704400240200241004804402000200236" - "02680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000200041" - "f5006a2004290300370000200041ed006a200529030037000020002000290388013700650b" - "200020013a006420004188016a200041e4006a41cb81c00041094100101820002d00880141" - "01460440200028028c01210141878ac0004112420510001a0c010b41d481c0004137410141" - "00410010011a200041f0016a200041286a2203280100360200200041e8016a200041206a22" - "04290100370300200041fc016a200041d8006a290300220837020020004184026a200041e0" - "006a2802002202360200200020002901183703e0012000200029035022093702f401200041" - "e8066a22012002360200200041e0066a22022008370300200020093703d806200041f4066a" - "2004290100370200200041fc066a2003280100360200200020002901183702ec0620004188" - "026a200041d8066a22034128101a2000418c016a200041e0016a41d000101a200041013602" - "8801200041f0066a220442003703002001420037030020024200370300200042003703d806" - "2000027f41998ac0004114200041b4016a4128200341201008220341204704400240200341" - "00480440200020033602e4010c010b2000417f3602e4010b41010c010b200041f9016a2004" - "290300370000200041f1016a2001290300370000200041e9016a2002290300370000200020" - "002903d8063700e10141000b3a00e001200041b4026a200041e0016a418b82c00041034181" - "8020101820002d00b402410146044020002802b802210141878ac0004112420610001a0c01" - "0b41002101418e82c000413141014100410010011a200041808080303602d806200041f801" - "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" - "003703e0010240200041046a4114200041d8066a4104200041e0016a412010092202412047" - "0440024020024100480440200020023602c0020c010b2000417f3602c0020b410121010c01" - "0b200041d5026a2003290300370000200041cd026a2004290300370000200041c5026a2005" - "290300370000200020002903e0013700bd020b200020013a00bc02200041e0016a200041bc" - "026a41bf82c000410541818020101820002d00e001410146044020002802e401210141878a" - "c0004112420610001a0c010b4100210141c482c000413341014100410010011a200041f801" - "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" - "003703e0010240200041046a220241142002411441f782c0004112200041e0016a4120100a" - "22024120470440024020024100480440200020023602e4020c010b2000417f3602e4020b41" - "0121010c010b200041f9026a2003290300370000200041f1026a2004290300370000200041" - "e9026a2005290300370000200020002903e0013700e1020b200020013a00e002200041e001" - "6a200041e0026a418983c000410a41988020101820002d00e001410146044020002802e401" - "210141878ac0004112420710001a0c010b41002101419383c000413841014100410010011a" - "200041f8016a22034200370300200041f0016a22044200370300200041e8016a2205420037" - "0300200042003703e0010240200041046a4114200041186a4114200041e0016a4120100b22" - "02412047044002402002410048044020002002360288030c010b2000417f360288030b4101" - "21010c010b2000419d036a200329030037000020004195036a20042903003700002000418d" - "036a2005290300370000200020002903e001370085030b200020013a008403200041e0016a" - "20004184036a41cb83c000410841818020101820002d00e001410146044020002802e40121" - "0141878ac0004112420810001a0c010b41d383c000413641014100410010011a230041206b" - "22012400200141186a22044200370300200141106a22054200370300200141086a22064200" - "37030020014200370300200041a8036a2202027f200041046a4114200041186a4114200141" - "20100c22034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2004290300370000200241116a20052903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041e0016a20" - "02418984c000410e41818020101820002d00e001410146044020002802e401210141878ac0" - "004112420910001a0c010b419784c000413c41014100410010011a230041206b2201240020" - "0141186a22044200370300200141106a22054200370300200141086a220642003703002001" - "4200370300200041cc036a2202027f200041046a411420014120100d220341204704400240" - "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300" - "370001200241196a2004290300370000200241116a2005290300370000200241096a200629" - "030037000041000b3a0000200141206a2400200041e0016a200241d384c000410341818020" - "101820002d00e001410146044020002802e401210141878ac0004112420a10001a0c010b41" - "d684c000413141014100410010011a230041306b22012400200141808080d80036020c2001" - "41286a22044200370300200141206a22054200370300200141186a22064200370300200142" - "00370310200041f0036a2202027f200041046a41142001410c6a4104200141106a4120100e" - "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" - "010b20022001290310370001200241196a2004290300370000200241116a20052903003700" - "00200241096a200629030037000041000b3a0000200141306a2400200041e0016a20024187" - "85c000410641818020101820002d00e001410146044020002802e401210141878ac0004112" - "420b10001a0c010b418d85c000413441014100410010011a230041306b2201240020014180" - "8080e00036020c200141286a22044200370300200141206a22054200370300200141186a22" - "0642003703002001420037031020004194046a2202027f200041046a41142001410c6a4104" - "200141106a4120100f22034120470440024020034100480440200220033602040c010b2002" - "417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241" - "116a2005290300370000200241096a200629030037000041000b3a0000200141306a240020" - "0041f4016a200041146a280100360200200041ec016a2000410c6a29010037020020002000" - "2901043702e401200041808080e0003602e001200041d8066a200241c185c000410b418480" - "20101820002d00d806410146044020002802dc06210141878ac0004112420c10001a0c010b" - "41cc85c000413941014100410010011a230041206b22012400200141186a22044200370300" - "200141106a22054200370300200141086a2206420037030020014200370300200041b8046a" - "2202027f200041e0016a4118200041186a4114200141201010220341204704400240200341" - "00480440200220033602040c010b2002417f3602040b41010c010b20022001290300370001" - "200241196a2004290300370000200241116a2005290300370000200241096a200629030037" - "000041000b3a0000200141206a2400200041d8066a2002418586c000410741818020101820" - "002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b418c86c0" - "00413541014100410010011a230041306b220124002001418080803036020c200141286a22" - "044200370300200141206a22054200370300200141186a2206420037030020014200370310" - "200041dc046a2202027f200041186a41142001410c6a4104200141106a4120101122034120" - "470440024020034100480440200220033602040c010b2002417f3602040b41010c010b2002" - "2001290310370001200241196a2004290300370000200241116a2005290300370000200241" - "096a200629030037000041000b3a0000200141306a2400200041d8066a200241c186c00041" - "0c41828020101820002d00d806410146044020002802dc06210141878ac0004112420d1000" - "1a0c010b41cd86c000413a41014100410010011a230041306b22012400200141808080e800" - "36020c200141286a22044200370300200141206a22054200370300200141186a2206420037" - "03002001420037031020004180056a2202027f200041046a41142001410c6a410420014110" - "6a4120101222034120470440024020034100480440200220033602040c010b2002417f3602" - "040b41010c010b20022001290310370001200241196a2004290300370000200241116a2005" - "290300370000200241096a200629030037000041000b3a0000200141306a2400200041d806" - "6a2002418787c000410541818020101820002d00d806410146044020002802dc0621014187" - "8ac0004112420d10001a0c010b418c87c000413341014100410010011a230041306b220124" - "00200141808080f00036020c200141286a22044200370300200141206a2205420037030020" - "0141186a2206420037030020014200370310200041a4056a2202027f200041046a41142000" - "41186a41142001410c6a4104200141106a4120101322034120470440024020034100480440" - "200220033602040c010b2002417f3602040b41010c010b2002200129031037000120024119" - "6a2004290300370000200241116a2005290300370000200241096a20062903003700004100" - "0b3a0000200141306a2400200041d8066a200241bf87c000410a41818020101820002d00d8" - "06410146044020002802dc06210141878ac0004112420e10001a0c010b41c987c000413841" - "014100410010011a230041306b22012400200141808080f80036020c200141286a22044200" - "370300200141206a22054200370300200141186a2206420037030020014200370310200041" - "c8056a2202027f200041046a41142001410c6a4104200141106a4120101422034120470440" - "024020034100480440200220033602040c010b2002417f3602040b41010c010b2002200129" - "0310370001200241196a2004290300370000200241116a2005290300370000200241096a20" - "0629030037000041000b3a0000200141306a2400200041d8066a2002418188c00041124182" - "8020101820002d00d806410146044020002802dc06210141878ac0004112420f10001a0c01" - "0b419388c00041c00041014100410010011a230041206b22012400200141186a2204420037" - "0300200141106a22054200370300200141086a2206420037030020014200370300200041ec" - "056a2202027f200041046a4114200141201015220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041d8066a200241d388c000410a4100101820002d00d806410146" - "044020002802dc06210141878ac0004112421010001a0c010b41dd88c00041384101410041" - "0010011a230041306b22012400200141808080900136020c200141286a2204420037030020" - "0141206a22054200370300200141186a220642003703002001420037031020004190066a22" - "02027f200041046a41142001410c6a4104200141106a412010162203412047044002402003" - "4100480440200220033602040c010b2002417f3602040b41010c010b200220012903103700" - "01200241196a2004290300370000200241116a2005290300370000200241096a2006290300" - "37000041000b3a0000200141306a2400200041d8066a2002419589c0004106418180201018" - "20002d00d806410146044020002802dc06210141878ac0004112421210001a0c010b410121" - "01419b89c000413441014100410010011a230041306b22022400200241808080980136020c" - "200241286a22054200370300200241206a22064200370300200241186a2207420037030020" - "024200370310200041b4066a2203027f200041046a41142002410c6a4104200241106a4120" - "101722044120470440024020044100480440200320043602040c010b2003417f3602040b41" - "010c010b20032002290310370001200341196a2005290300370000200341116a2006290300" - "370000200341096a200729030037000041000b3a0000200241306a2400200041d8066a2003" - "41cf89c000410541818020101820002d00d806410146044020002802dc06210141878ac000" - "4112421310001a0c010b41d489c000413341014100410010011a0b20004180076a24002001" - "0f0b418080c000410b417f20012001417f4e1bac1000000bfd0401067f200241104f044002" - "4020002000410020006b41037122056a22044f0d0020012103200504402005210603402000" - "20032d00003a0000200341016a2103200041016a2100200641016b22060d000b0b20054101" - "6b4107490d000340200020032d00003a0000200041016a200341016a2d00003a0000200041" - "026a200341026a2d00003a0000200041036a200341036a2d00003a0000200041046a200341" - "046a2d00003a0000200041056a200341056a2d00003a0000200041066a200341066a2d0000" - "3a0000200041076a200341076a2d00003a0000200341086a2103200041086a22002004470d" - "000b0b2004200220056b2207417c7122086a21000240200120056a22064103714504402000" - "20044d0d0120062101034020042001280200360200200141046a2101200441046a22042000" - "490d000b0c010b200020044d0d002006410374220541187121032006417c71220241046a21" - "01410020056b41187121052002280200210203402004200220037620012802002202200574" - "72360200200141046a2101200441046a22042000490d000b0b20074103712102200620086a" - "21010b02402000200020026a22064f0d002002410771220304400340200020012d00003a00" - "00200141016a2101200041016a2100200341016b22030d000b0b200241016b4107490d0003" - "40200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a" - "2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a00" - "00200041056a200141056a2d00003a0000200041066a200141066a2d00003a000020004107" - "6a200141076a2d00003a0000200141086a2101200041086a22002006470d000b0b0b0ba30a" - "0100418080c0000b990a6572726f725f636f64653d47657474696e67206669656c643a2046" - "69656c6420646174613a204572726f722067657474696e67206669656c643a204572726f72" - "3a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e" - "47205741534d20455845435554494f4e2024242424244163636f756e743a44657374696e61" - "74696f6e3a4163636f756e744163636f756e74206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e65" - "54727573746c696e65206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43686563" - "6b436865636b206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564" - "656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e44656c656761746544656c65" - "67617465206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e4465706f736974507265617574684465706f736974507265" - "61757468206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e444944444944206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e457363726f77457363" - "726f77206f626a656374206578697374732c2070726f63656564696e672077697468206573" - "63726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f62" - "6a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" - "696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070" - "726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f" - "666665724e46546f6b656e4f66666572206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e4f666665724f66666572206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" - "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e54" - "69636b65745469636b6574206f626a656374206578697374732c2070726f63656564696e67" - "207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e43757272656e74207365712076616c75653a004d0970726f64756365727302086c616e" - "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3837" - "2e30202831373036376539616320323032352d30352d303929002c0f7461726765745f6665" - "617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7f017f60037f7f7e017f6005" + "7f7f7f7f7f017f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69620974726163655f6e756d000408686f73745f6c" + "6962057472616365000508686f73745f6c69621063616368655f6c65646765725f6f626a000308686f73745f6c6962146765745f6c65646765" + "725f6f626a5f6669656c64000108686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000308686f73" + "745f6c69620d74726163655f6163636f756e74000108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c69620b" + "6c696e655f6b65796c6574000208686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69620c636865636b5f6b65796c6574" + "000008686f73745f6c69621163726564656e7469616c5f6b65796c6574000208686f73745f6c69620f64656c65676174655f6b65796c657400" + "0008686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a6469645f6b65796c65740001" + "08686f73745f6c69620d657363726f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008" + "686f73745f6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c6574000008686f73" + "745f6c69620c6f666665725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000208686f73745f6c69621a70" + "65726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620e7369676e6572735f6b65796c6574000108686f73" + "745f6c69620d7469636b65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c65740000030403060708050301001106" + "19037f01418080c0000b7f0041ad8ac0000b7f0041b08ac0000b073e05066d656d6f727902000d6f626a6563745f6578697374730018066669" + "6e69736800190a5f5f646174615f656e6403010b5f5f686561705f6261736503020a953403a80502017f017e230041a0016b22052400024020" + "012d0000410146044041c280c000411620012802042201ac10001a200041013a0000200020013602040c010b200541186a200141196a290000" + "370300200541106a200141116a290000370300200541086a200141096a29000037030020052001290001370300200220032005412041011001" + "1a02402005412041001002220141004a04402004450440418b80c000410f4285801410001a20014185801420054180016a4120100322014120" + "47044041a680c0004115417f20012001417f4e1b2201ac10001a200041013a0000200020013602040c040b200541c2006a20054182016a2d00" + "003a0000200541f0006a20054197016a2900002206370300200541286a22012005418f016a290000370300200541306a220220063703002005" + "41386a22032005419f016a2d00003a0000200520052f0080013b014020052005290087013703202005200528008301360043200541df006a20" + "032d00003a0000200541d7006a2002290300370000200541cf006a200129030037000020052005290320370047419a80c000410c200541406b" + "4120410110011a0c020b418b80c000410f2004ac10001a2001200420054180016a411410032201411447044041a680c0004115417f20012001" + "417f4e1b2201ac10001a200041013a0000200020013602040c030b200541c2006a20054182016a2d00003a0000200520052900870137036020" + "052005418c016a290000370065200520052f0080013b0140200520052903603703202005200529006537002520052005280083013600432005" + "41cc006a200529002537000020052005290320370047419a80c000410c200541406b4114410110011a0c010b41bb80c00041072001ac10001a" + "200041013a0000200020013602040c010b20004180023b01000b200541a0016a24000be92902087f027e23004180076b2200240041d880c000" + "412341014100410010011a02402000027f02404181802020004188016a22024114100422014114460440200041066a2000418a016a22032d00" + "003a00002000200029008f013703e001200020004194016a22042900003700e501200020002f0088013b0104200020002903e0013703d80620" + "0020002900e5013700dd062000200028008b01360007200041106a20002900dd06370000200020002903d80637000b41fb80c0004108200041" + "046a2205411410051a4183802020024114100422014114470d032000411a6a20032d00003a00002000200029008f013703e001200020042900" + "003700e501200020002f0088013b0118200020002903e0013703d806200020002900e5013700dd062000200028008b0136001b200041246a20" + "002900dd06370000200020002903d80637001f418381c000410c200041186a411410051a200041a0016a2203420037030020004198016a2204" + "420037030020004190016a420037030020004200370388012005411420024120100622014120460d0102402001410048044020002001360230" + "0c010b2000417f3602300b41010c020b0c020b200041c5006a20032903003700002000413d6a2004290300370000200041356a20004190016a" + "290300370000200020002903880137002d41000b3a002c20004188016a2000412c6a418f81c0004107418180201018024020002d0088014101" + "460440200028028c01210141878ac0004112420510001a0c010b41002101419681c000413541014100410010011a200041de006a41c4003a00" + "00200041d8006a4100360200200041e3006a41003a0000200041d5a6013b015c200042003703502000410036005f200041a0016a2203420037" + "030020004198016a2204420037030020004190016a2205420037030020004200370388010240200041046a4114200041186a4114200041d000" + "6a411420004188016a4120100722024120470440024020024100480440200020023602680c010b2000417f3602680b410121010c010b200041" + "fd006a2003290300370000200041f5006a2004290300370000200041ed006a200529030037000020002000290388013700650b200020013a00" + "6420004188016a200041e4006a41cb81c00041094100101820002d0088014101460440200028028c01210141878ac0004112420510001a0c01" + "0b41d481c000413741014100410010011a200041f0016a200041286a2203280100360200200041e8016a200041206a22042901003703002000" + "41fc016a200041d8006a290300220837020020004184026a200041e0006a2802002202360200200020002901183703e0012000200029035022" + "093702f401200041e8066a22012002360200200041e0066a22022008370300200020093703d806200041f4066a2004290100370200200041fc" + "066a2003280100360200200020002901183702ec0620004188026a200041d8066a22034128101a2000418c016a200041e0016a41d000101a20" + "00410136028801200041f0066a220442003703002001420037030020024200370300200042003703d8062000027f41998ac0004114200041b4" + "016a412820034120100822034120470440024020034100480440200020033602e4010c010b2000417f3602e4010b41010c010b200041f9016a" + "2004290300370000200041f1016a2001290300370000200041e9016a2002290300370000200020002903d8063700e10141000b3a00e0012000" + "41b4026a200041e0016a418b82c000410341818020101820002d00b402410146044020002802b802210141878ac0004112420610001a0c010b" + "41002101418e82c000413141014100410010011a200041063602d806200041f8016a22034200370300200041f0016a22044200370300200041" + "e8016a22054200370300200042003703e0010240200041046a4114200041d8066a4104200041e0016a41201009220241204704400240200241" + "00480440200020023602c0020c010b2000417f3602c0020b410121010c010b200041d5026a2003290300370000200041cd026a200429030037" + "0000200041c5026a2005290300370000200020002903e0013700bd020b200020013a00bc02200041e0016a200041bc026a41bf82c000410541" + "818020101820002d00e001410146044020002802e401210141878ac0004112420610001a0c010b4100210141c482c000413341014100410010" + "011a200041f8016a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042003703e0010240200041046a22" + "0241142002411441f782c0004112200041e0016a4120100a22024120470440024020024100480440200020023602e4020c010b2000417f3602" + "e4020b410121010c010b200041f9026a2003290300370000200041f1026a2004290300370000200041e9026a20052903003700002000200029" + "03e0013700e1020b200020013a00e002200041e0016a200041e0026a418983c000410a41988020101820002d00e001410146044020002802e4" + "01210141878ac0004112420710001a0c010b41002101419383c000413841014100410010011a200041f8016a22034200370300200041f0016a" + "22044200370300200041e8016a22054200370300200042003703e0010240200041046a4114200041186a4114200041e0016a4120100b220241" + "2047044002402002410048044020002002360288030c010b2000417f360288030b410121010c010b2000419d036a2003290300370000200041" + "95036a20042903003700002000418d036a2005290300370000200020002903e001370085030b200020013a008403200041e0016a2000418403" + "6a41cb83c000410841818020101820002d00e001410146044020002802e401210141878ac0004112420810001a0c010b41d383c00041364101" + "4100410010011a230041206b22012400200141186a22044200370300200141106a22054200370300200141086a220642003703002001420037" + "0300200041a8036a2202027f200041046a4114200041186a411420014120100c22034120470440024020034100480440200220033602040c01" + "0b2002417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005290300370000200241096a2006" + "29030037000041000b3a0000200141206a2400200041e0016a2002418984c000410e41818020101820002d00e001410146044020002802e401" + "210141878ac0004112420910001a0c010b419784c000413c41014100410010011a230041206b22012400200141186a22044200370300200141" + "106a22054200370300200141086a2206420037030020014200370300200041cc036a2202027f200041046a411420014120100d220341204704" + "40024020034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a200429030037000020" + "0241116a2005290300370000200241096a200629030037000041000b3a0000200141206a2400200041e0016a200241d384c000410341818020" + "101820002d00e001410146044020002802e401210141878ac0004112420a10001a0c010b41d684c000413141014100410010011a230041306b" + "220124002001410b36020c200141286a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041" + "f0036a2202027f200041046a41142001410c6a4104200141106a4120100e22034120470440024020034100480440200220033602040c010b20" + "02417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241116a2005290300370000200241096a20062903" + "0037000041000b3a0000200141306a2400200041e0016a2002418785c000410641818020101820002d00e001410146044020002802e4012101" + "41878ac0004112420b10001a0c010b418d85c000413441014100410010011a230041306b220124002001410c36020c200141286a2204420037" + "0300200141206a22054200370300200141186a220642003703002001420037031020004194046a2202027f200041046a41142001410c6a4104" + "200141106a4120100f22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b200220012903103700" + "01200241196a2004290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141306a2400200041f4" + "016a200041146a280100360200200041ec016a2000410c6a290100370200200020002901043702e401200041808080e0003602e001200041d8" + "066a200241c185c000410b41848020101820002d00d806410146044020002802dc06210141878ac0004112420c10001a0c010b41cc85c00041" + "3941014100410010011a230041206b22012400200141186a22044200370300200141106a22054200370300200141086a220642003703002001" + "4200370300200041b8046a2202027f200041e0016a4118200041186a4114200141201010220341204704400240200341004804402002200336" + "02040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005290300370000200241" + "096a200629030037000041000b3a0000200141206a2400200041d8066a2002418586c000410741818020101820002d00d80641014604402000" + "2802dc06210141878ac0004112420d10001a0c010b418c86c000413541014100410010011a230041306b220124002001410636020c20014128" + "6a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041dc046a2202027f200041186a411420" + "01410c6a4104200141106a4120101122034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b200220" + "01290310370001200241196a2004290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141306a" + "2400200041d8066a200241c186c000410c41828020101820002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b" + "41cd86c000413a41014100410010011a230041306b220124002001410d36020c200141286a22044200370300200141206a2205420037030020" + "0141186a220642003703002001420037031020004180056a2202027f200041046a41142001410c6a4104200141106a41201012220341204704" + "40024020034100480440200220033602040c010b2002417f3602040b41010c010b20022001290310370001200241196a200429030037000020" + "0241116a2005290300370000200241096a200629030037000041000b3a0000200141306a2400200041d8066a2002418787c000410541818020" + "101820002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b418c87c000413341014100410010011a230041306b" + "220124002001410e36020c200141286a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041" + "a4056a2202027f200041046a4114200041186a41142001410c6a4104200141106a412010132203412047044002402003410048044020022003" + "3602040c010b2002417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241116a20052903003700002002" + "41096a200629030037000041000b3a0000200141306a2400200041d8066a200241bf87c000410a41818020101820002d00d806410146044020" + "002802dc06210141878ac0004112420e10001a0c010b41c987c000413841014100410010011a230041306b220124002001410f36020c200141" + "286a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041c8056a2202027f200041046a4114" + "2001410c6a4104200141106a4120101422034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b2002" + "2001290310370001200241196a2004290300370000200241116a2005290300370000200241096a200629030037000041000b3a000020014130" + "6a2400200041d8066a2002418188c000411241828020101820002d00d806410146044020002802dc06210141878ac0004112420f10001a0c01" + "0b419388c00041c00041014100410010011a230041206b22012400200141186a22044200370300200141106a22054200370300200141086a22" + "06420037030020014200370300200041ec056a2202027f200041046a4114200141201015220341204704400240200341004804402002200336" + "02040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241116a2005290300370000200241" + "096a200629030037000041000b3a0000200141206a2400200041d8066a200241d388c000410a4100101820002d00d806410146044020002802" + "dc06210141878ac0004112421010001a0c010b41dd88c000413841014100410010011a230041306b220124002001411236020c200141286a22" + "044200370300200141206a22054200370300200141186a220642003703002001420037031020004190066a2202027f200041046a4114200141" + "0c6a4104200141106a4120101622034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b2002200129" + "0310370001200241196a2004290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141306a2400" + "200041d8066a2002419589c000410641818020101820002d00d806410146044020002802dc06210141878ac0004112421210001a0c010b4101" + "2101419b89c000413441014100410010011a230041306b220224002002411336020c200241286a22054200370300200241206a220642003703" + "00200241186a2207420037030020024200370310200041b4066a2203027f200041046a41142002410c6a4104200241106a4120101722044120" + "470440024020044100480440200320043602040c010b2003417f3602040b41010c010b20032002290310370001200341196a20052903003700" + "00200341116a2006290300370000200341096a200729030037000041000b3a0000200241306a2400200041d8066a200341cf89c00041054181" + "8020101820002d00d806410146044020002802dc06210141878ac0004112421310001a0c010b41d489c000413341014100410010011a0b2000" + "4180076a240020010f0b418080c000410b417f20012001417f4e1bac1000000bfd0401067f200241104f0440024020002000410020006b4103" + "7122056a22044f0d002001210320050440200521060340200020032d00003a0000200341016a2103200041016a2100200641016b22060d000b" + "0b200541016b4107490d000340200020032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a00002000" + "41036a200341036a2d00003a0000200041046a200341046a2d00003a0000200041056a200341056a2d00003a0000200041066a200341066a2d" + "00003a0000200041076a200341076a2d00003a0000200341086a2103200041086a22002004470d000b0b2004200220056b2207417c7122086a" + "21000240200120056a2206410371450440200020044d0d0120062101034020042001280200360200200141046a2101200441046a2204200049" + "0d000b0c010b200020044d0d002006410374220541187121032006417c71220241046a2101410020056b411871210520022802002102034020" + "0420022003762001280200220220057472360200200141046a2101200441046a22042000490d000b0b20074103712102200620086a21010b02" + "402000200020026a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041016a2100200341016b22030d00" + "0b0b200241016b4107490d000340200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a2d00003a000020" + "0041036a200141036a2d00003a0000200041046a200141046a2d00003a0000200041056a200141056a2d00003a0000200041066a200141066a" + "2d00003a0000200041076a200141076a2d00003a0000200141086a2101200041086a22002006470d000b0b0b0ba30a0100418080c0000b990a" + "6572726f725f636f64653d47657474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e67206669656c64" + "3a204572726f723a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e47205741534d20455845435554" + "494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e744163636f756e74206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e6554727573746c696e65206f626a656374" + "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e414d4d414d4d206f626a6563742065786973" + "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564656e" + "7469616c43726564656e7469616c206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e69" + "73682e44656c656761746544656c6567617465206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f77" + "2066696e6973682e4465706f736974507265617574684465706f73697450726561757468206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e444944444944206f626a656374206578697374732c2070726f63656564696e67" + "207769746820657363726f772066696e6973682e457363726f77457363726f77206f626a656374206578697374732c2070726f63656564696e" + "67207769746820657363726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f626a65637420657869737473" + "2c2070726f63656564696e67207769746820657363726f772066696e6973682e4d50546f6b656e4d50546f6b656e206f626a65637420657869" + "7374732c2070726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e4f6666" + "6572206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e4f666665724f666665" + "72206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e5061794368616e6e656c" + "5061794368616e6e656c206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" + "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f626a656374206578697374732c2070726f636565" + "64696e67207769746820657363726f772066696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e5469636b65745469636b6574206f626a6563742065786973" + "74732c2070726f63656564696e67207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374206578697374" + "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43757272656e74207365712076616c75653a004d0970726f" + "64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38372e3020283137303637" + "6539616320323032352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b08736967" + "6e2d657874"; extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60067f7f7f7f7f7f017f60047f7f7f7f017f60027f7f017f60057f7f7f7f7f017f60037f7f7f017f60077f7f7f7f" @@ -943,112 +781,75 @@ extern std::string const codecovTestsWasmHex = "732b087369676e2d657874"; extern std::string const floatTestsWasmHex = - "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" - "017f60067f7f7f7f7f7f017f60047e7f7f7f017f60057f7e7f7f7f017f60037f7f7e017f60" - "00017f02c9020e08686f73745f6c6962057472616365000108686f73745f6c69620e666c6f" - "61745f66726f6d5f696e74000408686f73745f6c69621274726163655f6f70617175655f66" - "6c6f6174000208686f73745f6c69620f666c6f61745f66726f6d5f75696e74000108686f73" - "745f6c696209666c6f61745f736574000508686f73745f6c69620d666c6f61745f636f6d70" - "617265000208686f73745f6c696209666c6f61745f616464000008686f73745f6c69620e66" - "6c6f61745f7375627472616374000008686f73745f6c69620e666c6f61745f6d756c746970" - "6c79000008686f73745f6c69620c666c6f61745f646976696465000008686f73745f6c6962" - "09666c6f61745f706f77000308686f73745f6c69620974726163655f6e756d000608686f73" - "745f6c69620a666c6f61745f726f6f74000308686f73745f6c696209666c6f61745f6c6f67" - "00010302010705030100110619037f01418080c0000b7f0041d28ac0000b7f0041e08ac000" - "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020af20e01ef0e01047f230041206b22012400418080c000411d" - "41014100410010001a200142003703100240428ce000200141106a22004108410010014108" - "460440419d80c00041172000410810021a41b480c000411e20004108410110001a0c010b41" - "d280c000411e41014100410010001a0b2001428ce0003703180240200141186a4108200141" - "106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000" - "411e41014100410010001a0b0240410242fb00200141106a22004108410010044108460440" - "41a581c00041212000410810021a0c010b41c681c000412641014100410010001a0b41ec81" - "c0004115418182c000410810021a419182c0004116418982c000410810021a41a782c00041" - "1b41014100410010001a2001420037031802404201200141186a2200410841001001410846" - "044041c282c000410f2000410810021a0c010b41d182c000411641014100410010001a0b02" - "40200141186a4108418182c0004108100545044041e782c000411b41014100410010001a0c" - "010b418283c000411b41014100410010001a0b0240200141186a4108418982c00041081005" - "4101460440419d83c000412341014100410010001a0c010b41c083c0004124410141004100" - "10001a0b0240418982c0004108200141186a41081005410246044041e483c0004123410141" - "00410010001a0c010b418784c000412441014100410010001a0b41ab84c000412041014100" - "410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a220241084181" - "82c000410820024108410010061a200041016b22000d000b20014200370318420a20014118" - "6a22004108410010011a02402000410820024108100545044041cb84c00041144101410041" - "0010001a0c010b41df84c000411341014100410010001a0b410b21000340200141106a2202" - "4108418182c000410820024108410010071a200041016b22000d000b024020024108418982" - "c0004108100545044041f284c000411941014100410010001a0c010b418b85c00041184101" - "4100410010001a0b41a385c000412341014100410010001a20014200370300420a20014108" - "410010011a200142d487b6f4c7d4b1c000370308410621000340200141086a220241082001" - "410820024108410010081a200041016b22000d000b2001420037031042c0843d200141106a" - "22004108410010011a02402000410820024108100545044041c685c0004119410141004100" - "10001a0c010b41df85c000411841014100410010001a0b410721000340200141086a220241" - "082001410820024108410010091a200041016b22000d000b20014200370318417f42012001" - "41186a22004108410010041a02402002410820004108100545044041f785c0004117410141" - "00410010001a0c010b418e86c000411641014100410010001a0b41a486c000411741014100" - "410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb" - "86c00041122000410810021a418982c00041084106200041084100100a1a41cd86c0004118" - "2000410810021a200142003703104209200141106a22024108410010011a20024108410220" - "0041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a" - "41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" - "200341084102200041084100100a1a419087c00041142000410810021a41a487c000413820" - "0341084100200041084100100aac100b1a41dc87c000411841014100410010001a20014200" - "370308420920004108410010011a20014200370310200041084102200241084100100c1a41" - "f487c00041122002410810021a200041084103200241084100100c1a418688c00041122002" - "410810021a2001420037031842c0843d20034108410010011a200341084103200241084100" - "100c1a419888c00041182002410810021a200341084106200241084100100c1a41b088c000" - "411c2002410810021a41cc88c000411741014100410010001a2001420037031042c0843d20" - "024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003" - "410810021a41f788c000411a41014100410010001a20014200370318418182c00041084189" - "82c000410820034108410010081a0240418982c0004108200341081005450440419189c000" - "411641014100410010001a0c010b41a789c000411541014100410010001a0b418982c00041" - "08418982c0004108200141186a22004108410010081a0240418182c0004108200041081005" - "45044041bc89c000411741014100410010001a0c010b41d389c00041164101410041001000" - "1a0b41e989c000411a41014100410010001a2001420037031020014200370318420a200141" - "186a22024108410010011a418182c000410820024108200141106a22004108410010091a41" - "838ac00041192000410810021a418182c00041082000410820004108410010091a419c8ac0" - "00410f2000410810021a02402002410820004108100545044041ab8ac00041144101410041" - "0010001a0c010b41bf8ac000411341014100410010001a0b200141206a240041010b0bdc0a" - "0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d2024" - "24242020666c6f61742066726f6d206936342031323330303a2020666c6f61742066726f6d" - "20693634203132333030206173204845583a2020666c6f61742066726f6d20693634203132" - "3330303a206661696c65642020666c6f61742066726f6d207536342031323330303a202066" - "6c6f61742066726f6d207536342031323330303a206661696c65642020666c6f6174206672" - "6f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065" - "787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20" - "636f6e737420313ad4838d7ea4c6800094838d7ea4c680002020666c6f61742066726f6d20" - "636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d706172652024242420" - "20666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c656420" - "20666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f" - "6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41" - "545f4e454741544956455f4f4e452020666c6f61742066726f6d203120213e20464c4f4154" - "5f4e454741544956455f4f4e452020464c4f41545f4e454741544956455f4f4e45203c2066" - "6c6f61742066726f6d20312020464c4f41545f4e454741544956455f4f4e4520213c20666c" - "6f61742066726f6d20310a24242420746573745f666c6f61745f6164645f73756274726163" - "742024242420207265706561746564206164643a20676f6f64202072657065617465642061" - "64643a20626164202072657065617465642073756274726163743a20676f6f642020726570" - "65617465642073756274726163743a206261640a24242420746573745f666c6f61745f6d75" - "6c7469706c795f6469766964652024242420207265706561746564206d756c7469706c793a" - "20676f6f6420207265706561746564206d756c7469706c793a206261642020726570656174" - "6564206469766964653a20676f6f6420207265706561746564206469766964653a20626164" - "0a24242420746573745f666c6f61745f706f77202424242020666c6f61742063756265206f" - "6620313a2020666c6f61742036746820706f776572206f66202d313a2020666c6f61742073" - "7175617265206f6620393a2020666c6f61742030746820706f776572206f6620393a202066" - "6c6f617420737175617265206f6620303a2020666c6f61742030746820706f776572206f66" - "20302028657870656374696e6720494e56414c49445f504152414d53206572726f72293a0a" - "24242420746573745f666c6f61745f726f6f74202424242020666c6f61742073717274206f" - "6620393a2020666c6f61742063627274206f6620393a2020666c6f61742063627274206f66" - "20313030303030303a2020666c6f61742036746820726f6f74206f6620313030303030303a" - "0a24242420746573745f666c6f61745f6c6f672024242420206c6f675f3130206f66203130" - "30303030303a0a24242420746573745f666c6f61745f6e65676174652024242420206e6567" - "61746520636f6e737420313a20676f6f6420206e656761746520636f6e737420313a206261" - "6420206e656761746520636f6e7374202d313a20676f6f6420206e656761746520636f6e73" - "74202d313a206261640a24242420746573745f666c6f61745f696e76657274202424242020" - "696e76657274206120666c6f61742066726f6d2031303a2020696e7665727420616761696e" - "3a2020696e766572742074776963653a20676f6f642020696e766572742074776963653a20" - "626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d6279010572757374631d312e38372e30202831373036376539616320323032" - "352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d" - "676c6f62616c732b087369676e2d657874"; + "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f017f60047e7f7f7f017f" + "60057f7e7f7f7f017f60037f7f7e017f6000017f02c9020e08686f73745f6c6962057472616365000108686f73745f6c69620e666c6f61745f" + "66726f6d5f696e74000408686f73745f6c69621274726163655f6f70617175655f666c6f6174000208686f73745f6c69620f666c6f61745f66" + "726f6d5f75696e74000108686f73745f6c696209666c6f61745f736574000508686f73745f6c69620d666c6f61745f636f6d70617265000208" + "686f73745f6c696209666c6f61745f616464000008686f73745f6c69620e666c6f61745f7375627472616374000008686f73745f6c69620e66" + "6c6f61745f6d756c7469706c79000008686f73745f6c69620c666c6f61745f646976696465000008686f73745f6c696209666c6f61745f706f" + "77000308686f73745f6c69620974726163655f6e756d000608686f73745f6c69620a666c6f61745f726f6f74000308686f73745f6c69620966" + "6c6f61745f6c6f6700010302010705030100110619037f01418080c0000b7f0041d28ac0000b7f0041e08ac0000b072e04066d656d6f727902" + "000666696e697368000e0a5f5f646174615f656e6403010b5f5f686561705f6261736503020af20e01ef0e01047f230041206b220124004180" + "80c000411d41014100410010001a200142003703100240428ce000200141106a22004108410010014108460440419d80c00041172000410810" + "021a41b480c000411e20004108410110001a0c010b41d280c000411e41014100410010001a0b2001428ce0003703180240200141186a410820" + "0141106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000411e41014100410010001a0b0240410242fb" + "00200141106a2200410841001004410846044041a581c00041212000410810021a0c010b41c681c000412641014100410010001a0b41ec81c0" + "004115418182c000410810021a419182c0004116418982c000410810021a41a782c000411b41014100410010001a2001420037031802404201" + "200141186a2200410841001001410846044041c282c000410f2000410810021a0c010b41d182c000411641014100410010001a0b0240200141" + "186a4108418182c0004108100545044041e782c000411b41014100410010001a0c010b418283c000411b41014100410010001a0b0240200141" + "186a4108418982c000410810054101460440419d83c000412341014100410010001a0c010b41c083c000412441014100410010001a0b024041" + "8982c0004108200141186a41081005410246044041e483c000412341014100410010001a0c010b418784c000412441014100410010001a0b41" + "ab84c000412041014100410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a22024108418182c00041082002410841" + "0010061a200041016b22000d000b20014200370318420a200141186a22004108410010011a02402000410820024108100545044041cb84c000" + "411441014100410010001a0c010b41df84c000411341014100410010001a0b410b21000340200141106a22024108418182c000410820024108" + "410010071a200041016b22000d000b024020024108418982c0004108100545044041f284c000411941014100410010001a0c010b418b85c000" + "411841014100410010001a0b41a385c000412341014100410010001a20014200370300420a20014108410010011a200142d487b6f4c7d4b1c0" + "00370308410621000340200141086a220241082001410820024108410010081a200041016b22000d000b2001420037031042c0843d20014110" + "6a22004108410010011a02402000410820024108100545044041c685c000411941014100410010001a0c010b41df85c0004118410141004100" + "10001a0b410721000340200141086a220241082001410820024108410010091a200041016b22000d000b20014200370318417f420120014118" + "6a22004108410010041a02402002410820004108100545044041f785c000411741014100410010001a0c010b418e86c0004116410141004100" + "10001a0b41a486c000411741014100410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb86c0004112" + "2000410810021a418982c00041084106200041084100100a1a41cd86c00041182000410810021a200142003703104209200141106a22024108" + "410010011a200241084102200041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a41f986c000411720" + "00410810021a200142003703184200200141186a22034108410010011a200341084102200041084100100a1a419087c0004114200041081002" + "1a41a487c0004138200341084100200041084100100aac100b1a41dc87c000411841014100410010001a200142003703084209200041084100" + "10011a20014200370310200041084102200241084100100c1a41f487c00041122002410810021a200041084103200241084100100c1a418688" + "c00041122002410810021a2001420037031842c0843d20034108410010011a200341084103200241084100100c1a419888c000411820024108" + "10021a200341084106200241084100100c1a41b088c000411c2002410810021a41cc88c000411741014100410010001a2001420037031042c0" + "843d20024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003410810021a41f788c000411a4101410041" + "0010001a20014200370318418182c0004108418982c000410820034108410010081a0240418982c0004108200341081005450440419189c000" + "411641014100410010001a0c010b41a789c000411541014100410010001a0b418982c0004108418982c0004108200141186a22004108410010" + "081a0240418182c000410820004108100545044041bc89c000411741014100410010001a0c010b41d389c000411641014100410010001a0b41" + "e989c000411a41014100410010001a2001420037031020014200370318420a200141186a22024108410010011a418182c00041082002410820" + "0141106a22004108410010091a41838ac00041192000410810021a418182c00041082000410820004108410010091a419c8ac000410f200041" + "0810021a02402002410820004108100545044041ab8ac000411441014100410010001a0c010b41bf8ac000411341014100410010001a0b2001" + "41206a240041010b0bdc0a0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d202424242020666c6f6174" + "2066726f6d206936342031323330303a2020666c6f61742066726f6d20693634203132333030206173204845583a2020666c6f61742066726f" + "6d206936342031323330303a206661696c65642020666c6f61742066726f6d207536342031323330303a2020666c6f61742066726f6d207536" + "342031323330303a206661696c65642020666c6f61742066726f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066" + "726f6d2065787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c680" + "0094838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d70617265202424" + "242020666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c65642020666c6f61742066726f6d2031203d3d2046" + "4c4f41545f4f4e452020666c6f61742066726f6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f4154" + "5f4e454741544956455f4f4e452020666c6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c4f41545f" + "4e454741544956455f4f4e45203c20666c6f61742066726f6d20312020464c4f41545f4e454741544956455f4f4e4520213c20666c6f617420" + "66726f6d20310a24242420746573745f666c6f61745f6164645f73756274726163742024242420207265706561746564206164643a20676f6f" + "6420207265706561746564206164643a20626164202072657065617465642073756274726163743a20676f6f64202072657065617465642073" + "756274726163743a206261640a24242420746573745f666c6f61745f6d756c7469706c795f6469766964652024242420207265706561746564" + "206d756c7469706c793a20676f6f6420207265706561746564206d756c7469706c793a2062616420207265706561746564206469766964653a" + "20676f6f6420207265706561746564206469766964653a206261640a24242420746573745f666c6f61745f706f77202424242020666c6f6174" + "2063756265206f6620313a2020666c6f61742036746820706f776572206f66202d313a2020666c6f617420737175617265206f6620393a2020" + "666c6f61742030746820706f776572206f6620393a2020666c6f617420737175617265206f6620303a2020666c6f61742030746820706f7765" + "72206f6620302028657870656374696e6720494e56414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f72" + "6f6f74202424242020666c6f61742073717274206f6620393a2020666c6f61742063627274206f6620393a2020666c6f61742063627274206f" + "6620313030303030303a2020666c6f61742036746820726f6f74206f6620313030303030303a0a24242420746573745f666c6f61745f6c6f67" + "2024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f666c6f61745f6e65676174652024242420206e65676174" + "6520636f6e737420313a20676f6f6420206e656761746520636f6e737420313a2062616420206e656761746520636f6e7374202d313a20676f" + "6f6420206e656761746520636f6e7374202d313a206261640a24242420746573745f666c6f61745f696e76657274202424242020696e766572" + "74206120666c6f61742066726f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20676f6f642020696e" + "766572742074776963653a20626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279" + "010572757374631d312e38372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f6665617475726573022b" + "0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const float0Hex = "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.lock b/src/test/app/wasm_fixtures/float_tests/Cargo.lock index efad3253e70..0b9def91300 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.lock +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.lock @@ -154,7 +154,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "xrpl-address-macro" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "bs58", "quote", @@ -165,7 +165,7 @@ dependencies = [ [[package]] name = "xrpl-wasm-stdlib" version = "0.7.1" -source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git?branch=u32-buffer#1e5d096f46742ef7fcf1cb6f28a2526a72ed59d8" +source = "git+https://github.com/ripple/xrpl-wasm-stdlib.git#1b27d310dedb4d1279407cf3a40f6858be0e3f14" dependencies = [ "xrpl-address-macro", ] diff --git a/src/test/app/wasm_fixtures/float_tests/Cargo.toml b/src/test/app/wasm_fixtures/float_tests/Cargo.toml index a115dc006ff..b369cac5010 100644 --- a/src/test/app/wasm_fixtures/float_tests/Cargo.toml +++ b/src/test/app/wasm_fixtures/float_tests/Cargo.toml @@ -15,7 +15,7 @@ opt-level = 's' panic = "abort" [dependencies] -xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib", branch = "u32-buffer" } +xrpl-std = { git = "https://github.com/ripple/xrpl-wasm-stdlib.git", package = "xrpl-wasm-stdlib" } [profile.dev] panic = "abort" From d4510147d1450bb1cbc6e0bb6d66c7e9480631e7 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Feb 2026 14:42:14 -0500 Subject: [PATCH 172/212] fix build issue --- src/test/app/wasm_fixtures/fixtures.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 345b56f9730..fdd56a9e10c 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -22,12 +22,19 @@ pushLeb128(std::vector& buf, uint32_t val) } while (val != 0); } -// Helper: append bytes from an array to a vector -template +// Helper: append bytes from a C-style array to a vector +template void -appendBytes(std::vector& buf, T const& arr) +appendBytes(std::vector& buf, uint8_t const (&arr)[N]) { - buf.insert(buf.end(), std::begin(arr), std::end(arr)); + buf.insert(buf.end(), arr, arr + N); +} + +// Helper: append bytes from a vector to a vector +void +appendBytes(std::vector& buf, std::vector const& src) +{ + buf.insert(buf.end(), src.begin(), src.end()); } // Helper: append a WASM section (ID + LEB128 size + content) From e6ee492822b024e0b9a76aae4e5274dc2d76d21e Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Feb 2026 16:27:44 -0500 Subject: [PATCH 173/212] try again --- src/test/app/wasm_fixtures/fixtures.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index fdd56a9e10c..f5d4ac53ecd 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -23,11 +23,13 @@ pushLeb128(std::vector& buf, uint32_t val) } // Helper: append bytes from a C-style array to a vector +// Uses a loop to avoid GCC false positive -Werror=stringop-overflow with insert() template void appendBytes(std::vector& buf, uint8_t const (&arr)[N]) { - buf.insert(buf.end(), arr, arr + N); + for (std::size_t i = 0; i < N; ++i) + buf.push_back(arr[i]); } // Helper: append bytes from a vector to a vector From 4318b2ebf7031d472833459bf1a34b42cf12db3f Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 6 Feb 2026 12:44:05 -0500 Subject: [PATCH 174/212] fix build issue --- src/test/app/wasm_fixtures/fixtures.cpp | 6 +++--- src/test/app/wasm_fixtures/fixtures.h | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index f5d4ac53ecd..9e1783ef504 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -23,13 +23,11 @@ pushLeb128(std::vector& buf, uint32_t val) } // Helper: append bytes from a C-style array to a vector -// Uses a loop to avoid GCC false positive -Werror=stringop-overflow with insert() template void appendBytes(std::vector& buf, uint8_t const (&arr)[N]) { - for (std::size_t i = 0; i < N; ++i) - buf.push_back(arr[i]); + buf.insert(buf.end(), &arr[0], &arr[N]); } // Helper: append bytes from a vector to a vector @@ -59,6 +57,7 @@ std::vector generateCodeBlob(uint32_t num_instructions) { std::vector wasm; + wasm.reserve(sizeof(WASM_HEADER) + sizeof(TYPE_EMPTY_FUNC) + sizeof(FUNC_TYPE0) + sizeof(EXPORT_FINISH)); appendBytes(wasm, WASM_HEADER); appendBytes(wasm, TYPE_EMPTY_FUNC); appendBytes(wasm, FUNC_TYPE0); @@ -82,6 +81,7 @@ std::vector generateDataBlob(uint32_t data_size) { std::vector wasm; + wasm.reserve(sizeof(WASM_HEADER) + sizeof(TYPE_EMPTY_FUNC) + sizeof(FUNC_TYPE0)); appendBytes(wasm, WASM_HEADER); appendBytes(wasm, TYPE_EMPTY_FUNC); appendBytes(wasm, FUNC_TYPE0); diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 7dcba6eb890..50ab5d653e4 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -10,7 +10,7 @@ namespace wasm_constants { // Magic + version header -static constexpr uint8_t WASM_HEADER[] = { +uint8_t const WASM_HEADER[] = { 0x00, 0x61, 0x73, @@ -22,31 +22,31 @@ static constexpr uint8_t WASM_HEADER[] = { }; // Type section: () -> () -static constexpr uint8_t TYPE_EMPTY_FUNC[] = {0x01, 0x04, 0x01, 0x60, 0x00, 0x00}; +uint8_t const TYPE_EMPTY_FUNC[] = {0x01, 0x04, 0x01, 0x60, 0x00, 0x00}; // Function section: one function using type 0 -static constexpr uint8_t FUNC_TYPE0[] = {0x03, 0x02, 0x01, 0x00}; +uint8_t const FUNC_TYPE0[] = {0x03, 0x02, 0x01, 0x00}; // Export section: export func 0 as "finish" -static constexpr uint8_t EXPORT_FINISH[] = {0x07, 0x0a, 0x01, 0x06, 'f', 'i', 'n', 'i', 's', 'h', 0x00, 0x00}; +uint8_t const EXPORT_FINISH[] = {0x07, 0x0a, 0x01, 0x06, 'f', 'i', 'n', 'i', 's', 'h', 0x00, 0x00}; // Empty function body: 0 locals, end -static constexpr uint8_t EMPTY_BODY[] = {0x00, 0x0b}; +uint8_t const EMPTY_BODY[] = {0x00, 0x0b}; // Data segment offset: i32.const 0, end -static constexpr uint8_t DATA_OFFSET_ZERO[] = {0x41, 0x00, 0x0b}; +uint8_t const DATA_OFFSET_ZERO[] = {0x41, 0x00, 0x0b}; // Section IDs -static constexpr uint8_t SECTION_MEMORY = 0x05; -static constexpr uint8_t SECTION_CODE = 0x0a; -static constexpr uint8_t SECTION_DATA = 0x0b; +uint8_t const SECTION_MEMORY = 0x05; +uint8_t const SECTION_CODE = 0x0a; +uint8_t const SECTION_DATA = 0x0b; // Instructions -static constexpr uint8_t INSTR_NOP = 0x01; -static constexpr uint8_t INSTR_END = 0x0b; +uint8_t const INSTR_NOP = 0x01; +uint8_t const INSTR_END = 0x0b; // Fill byte for data section bloat -static constexpr uint8_t DATA_FILL_BYTE = 0xEE; +uint8_t const DATA_FILL_BYTE = 0xEE; // Generator for WASM module with large code section (many NOPs) std::vector From 65f9cf80c083f95fe0436195e4dc24cad8be07c4 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 9 Feb 2026 12:13:39 -0500 Subject: [PATCH 175/212] add readme to src/xrpld/app/wasm (#6340) * add readme to src/xrpl/app/wasm * important block * respond to copilot --- src/xrpld/app/wasm/README.md | 189 +++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 src/xrpld/app/wasm/README.md diff --git a/src/xrpld/app/wasm/README.md b/src/xrpld/app/wasm/README.md new file mode 100644 index 00000000000..3275011b497 --- /dev/null +++ b/src/xrpld/app/wasm/README.md @@ -0,0 +1,189 @@ +# WASM Module for Programmable Escrows + +This module provides WebAssembly (WASM) execution capabilities for programmable +escrows on the XRP Ledger. When an escrow is finished, the WASM code runs to +determine whether the escrow conditions are met, enabling custom programmable +logic for escrow release conditions. + +For the full specification, see +[XLS-0102: WASM VM](https://xls.xrpl.org/xls/XLS-0102-wasm-vm.html). + +## Architecture + +The module follows a layered architecture: + +``` +┌─────────────────────────────────────────────────────────────┐ +│ WasmEngine (WasmVM.h) │ +│ runEscrowWasm(), preflightEscrowWasm() │ +│ Host function registration │ +├─────────────────────────────────────────────────────────────┤ +│ WasmiEngine (WasmiVM.h) │ +│ Low-level wasmi interpreter integration │ +├─────────────────────────────────────────────────────────────┤ +│ HostFuncWrapper │ HostFuncImpl │ +│ C-style WASM bridges │ C++ implementations │ +├─────────────────────────────────────────────────────────────┤ +│ HostFunc (Interface) │ +│ Abstract base class for host functions │ +└─────────────────────────────────────────────────────────────┘ +``` + +### Key Components + +- **`WasmVM.h` / `detail/WasmVM.cpp`** - High-level facade providing: + - `WasmEngine` singleton that wraps the underlying WASM interpreter + - `runEscrowWasm()` - Execute WASM code for escrow finish + - `preflightEscrowWasm()` - Validate WASM code during preflight + - `createWasmImport()` - Register all host functions + +- **`WasmiVM.h` / `detail/WasmiVM.cpp`** - Low-level integration with the + [wasmi](https://github.com/wasmi-labs/wasmi) WebAssembly interpreter: + - `WasmiEngine` - Manages WASM modules, instances, and execution + - Memory management and gas metering + - Function invocation and result handling + +- **`HostFunc.h`** - Abstract `HostFunctions` base class defining the interface + for all callable host functions. Each method returns + `Expected`. + +- **`HostFuncImpl.h` / `detail/HostFuncImpl*.cpp`** - Concrete + `WasmHostFunctionsImpl` class that implements host functions with access to + `ApplyContext` for ledger state queries. Implementation split across files: + - `HostFuncImpl.cpp` - Core utilities (updateData, checkSignature, etc.) + - `HostFuncImplFloat.cpp` - Float/number arithmetic operations + - `HostFuncImplGetter.cpp` - Field access (transaction, ledger objects) + - `HostFuncImplKeylet.cpp` - Keylet construction functions + - `HostFuncImplLedgerHeader.cpp` - Ledger header info access + - `HostFuncImplNFT.cpp` - NFT-related queries + - `HostFuncImplTrace.cpp` - Debugging/tracing functions + +- **`HostFuncWrapper.h` / `detail/HostFuncWrapper.cpp`** - C-style wrapper + functions that bridge WASM calls to C++ `HostFunctions` methods. Each host + function has: + - A `_proto` type alias defining the function signature + - A `_wrap` function that extracts parameters and calls the implementation + +- **`ParamsHelper.h`** - Utilities for WASM parameter handling: + - `WASM_IMPORT_FUNC` / `WASM_IMPORT_FUNC2` macros for registration + - `wasmParams()` helper for building parameter vectors + - Type conversion between WASM and C++ types + +## Host Functions + +Host functions allow WASM code to interact with the XRP Ledger. They are +organized into categories: + +- **Ledger Information** - Access ledger sequence, timestamps, hashes, fees +- **Transaction & Ledger Object Access** - Read fields from the transaction + and ledger objects (including the current escrow object) +- **Keylet Construction** - Build keylets to look up various ledger object types +- **Cryptography** - Signature verification and hashing +- **Float Arithmetic** - Mathematical operations for amount calculations +- **NFT Operations** - Query NFT properties +- **Tracing/Debugging** - Log messages for debugging + +For the complete list of available host functions, their WASM names, and gas +costs, see the [XLS-0102 specification](https://xls.xrpl.org/xls/XLS-0102-wasm-vm.html) +or `detail/WasmVM.cpp` where they are registered via `WASM_IMPORT_FUNC2` macros. +For method signatures, see `HostFunc.h`. + +## Gas Model + +Each host function has an associated gas cost. The gas cost is specified when +registering the function in `detail/WasmVM.cpp`: + +```cpp +WASM_IMPORT_FUNC2(i, getLedgerSqn, "get_ledger_sqn", hfs, 60); +// ^^ gas cost +``` + +WASM execution is metered, and if the gas limit is exceeded, execution fails. + +## Entry Point + +The WASM module must export a function with the name defined by +`ESCROW_FUNCTION_NAME` (currently `"finish"`). This function: + +- Takes no parameters (or parameters passed via host function calls) +- Returns an `int32_t`: + - `1` (or positive): Escrow conditions are met, allow finish + - `0` (or negative): Escrow conditions are not met, reject finish + +## Adding a New Host Function + +To add a new host function, follow these steps: + +### 1. Add to HostFunc.h (Base Class) + +Add a virtual method declaration with a default implementation that returns an +error: + +```cpp +virtual Expected +myNewFunction(ParamType1 param1, ParamType2 param2) +{ + return Unexpected(HostFunctionError::INTERNAL); +} +``` + +### 2. Add to HostFuncImpl.h (Declaration) + +Add the method override declaration in `WasmHostFunctionsImpl`: + +```cpp +Expected +myNewFunction(ParamType1 param1, ParamType2 param2) override; +``` + +### 3. Implement in detail/HostFuncImpl\*.cpp + +Add the implementation in the appropriate file: + +```cpp +Expected +WasmHostFunctionsImpl::myNewFunction(ParamType1 param1, ParamType2 param2) +{ + // Implementation using ctx (ApplyContext) for ledger access + return result; +} +``` + +### 4. Add Wrapper to HostFuncWrapper.h + +Add the prototype and wrapper declaration: + +```cpp +using myNewFunction_proto = int32_t(uint8_t const*, int32_t, ...); +wasm_trap_t* +myNewFunction_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +``` + +### 5. Implement Wrapper in detail/HostFuncWrapper.cpp + +Implement the C-style wrapper that bridges WASM to C++: + +```cpp +wasm_trap_t* +myNewFunction_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + // Extract parameters from params + // Call hfs->myNewFunction(...) + // Set results and return +} +``` + +### 6. Register in WasmVM.cpp + +Add the function registration in `setCommonHostFunctions()` or +`createWasmImport()`: + +```cpp +WASM_IMPORT_FUNC2(i, myNewFunction, "my_new_function", hfs, 100); +// ^^ WASM name ^^ gas cost +``` + +> [!IMPORTANT] +> New host functions MUST be amendment-gated in `WasmVM.cpp`. +> Wrap the registration in an amendment check to ensure the function is only +> available after the corresponding amendment is enabled on the network. From fd14054f173c60cc7b3a41eb483e2a109c7dffa5 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 9 Feb 2026 17:36:02 -0500 Subject: [PATCH 176/212] update preflight checks (#6094) --- include/xrpl/protocol/TER.h | 1 + src/libxrpl/protocol/TER.cpp | 1 + src/test/app/EscrowSmart_test.cpp | 158 ++++++++++++++++++++++++----- src/xrpld/app/tx/detail/Escrow.cpp | 57 ++++++++--- src/xrpld/app/tx/detail/Escrow.h | 3 + 5 files changed, 178 insertions(+), 42 deletions(-) diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index fcc123a05f5..e5be836a0f0 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -123,6 +123,7 @@ enum TEMcodes : TERUnderlyingType { temINVALID_INNER_BATCH, temBAD_WASM, + temTEMP_DISABLED, }; //------------------------------------------------------------------------------ diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 46f1c82bc96..1e33ee54901 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -202,6 +202,7 @@ transResults() MAKE_ERROR(temBAD_TRANSFER_FEE, "Malformed: Transfer fee is outside valid range."), MAKE_ERROR(temINVALID_INNER_BATCH, "Malformed: Invalid inner batch transaction."), MAKE_ERROR(temBAD_WASM, "Malformed: Provided WASM code is invalid."), + MAKE_ERROR(temTEMP_DISABLED, "The transaction requires logic that is currently temporarily disabled."), MAKE_ERROR(terRETRY, "Retry transaction."), MAKE_ERROR(terFUNDS_SPENT, "DEPRECATED."), diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 093e65cb1bf..465d934f9b6 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -32,23 +32,22 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); XRPAmount const txnFees = env.current()->fees().base + 1000; - auto escrowCreate = escrow::create(alice, carol, XRP(1000)); + auto const escrowCreate = escrow::create(alice, carol, XRP(1000)); env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 100s), fee(txnFees), ter(temDISABLED)); env.close(); env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 100s), escrow::data("00112233"), fee(txnFees), @@ -69,10 +68,10 @@ struct EscrowSmart_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow::create(alice, carol, XRP(500)); + auto const escrowCreate = escrow::create(alice, carol, XRP(500)); // 11-byte string - std::string longWasmHex = "00112233445566778899AA"; + std::string const longWasmHex = "00112233445566778899AA"; env(escrowCreate, escrow::finish_function(longWasmHex), escrow::cancel_time(env.now() + 100s), @@ -81,6 +80,62 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); } + { + // compute limit set to 0 + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + // WASM runtime disabled + cfg->FEES.extension_compute_limit = 0; + return cfg; + }), + features); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto const escrowCreate = escrow::create(alice, carol, XRP(500)); + + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + escrow::cancel_time(env.now() + 100s), + escrow::comp_allowance(100), + fee(txnFees), + ter(temMALFORMED)); + env.close(); + } + + { + // size limit set to 0 + Env env( + *this, + envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_size_limit = 0; // WASM upload disabled + return cfg; + }), + features); + XRPAmount const txnFees = env.current()->fees().base + 1000; + // create escrow + env.fund(XRP(5000), alice, carol); + + auto const escrowCreate = escrow::create(alice, carol, XRP(500)); + + // 2-byte string + env(escrowCreate, + escrow::finish_function("AA"), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temTEMP_DISABLED)); + env.close(); + + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + escrow::cancel_time(env.now() + 100s), + fee(txnFees), + ter(temTEMP_DISABLED)); + env.close(); + } + { // Data without FinishFunction Env env(*this, features); @@ -88,9 +143,9 @@ struct EscrowSmart_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow::create(alice, carol, XRP(500)); + auto const escrowCreate = escrow::create(alice, carol, XRP(500)); - std::string longData(4, 'A'); + std::string const longData(4, 'A'); env(escrowCreate, escrow::data(longData), escrow::finish_time(env.now() + 100s), @@ -106,13 +161,13 @@ struct EscrowSmart_test : public beast::unit_test::suite // create escrow env.fund(XRP(5000), alice, carol); - auto escrowCreate = escrow::create(alice, carol, XRP(500)); + auto const escrowCreate = escrow::create(alice, carol, XRP(500)); // string of length maxWasmDataLength * 2 + 2 - std::string longData(maxWasmDataLength * 2 + 2, 'B'); + std::string const longData((maxWasmDataLength + 1) * 2, 'B'); env(escrowCreate, escrow::data(longData), - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 100s), fee(txnFees), ter(temMALFORMED)); @@ -126,7 +181,7 @@ struct EscrowSmart_test : public beast::unit_test::suite return cfg; }), features); - XRPAmount const txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount const txnFees = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; // create escrow env.fund(XRP(5000), alice, carol); @@ -135,13 +190,16 @@ struct EscrowSmart_test : public beast::unit_test::suite // Success situations { // FinishFunction + CancelAfter - env(escrowCreate, escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 20s), fee(txnFees)); + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + escrow::cancel_time(env.now() + 20s), + fee(txnFees)); env.close(); } { // FinishFunction + Condition + CancelAfter env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 30s), escrow::condition(escrow::cb1), fee(txnFees)); @@ -150,7 +208,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { // FinishFunction + FinishAfter + CancelAfter env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 40s), escrow::finish_time(env.now() + 2s), fee(txnFees)); @@ -159,7 +217,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { // FinishFunction + FinishAfter + Condition + CancelAfter env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 50s), escrow::condition(escrow::cb1), escrow::finish_time(env.now() + 2s), @@ -170,13 +228,13 @@ struct EscrowSmart_test : public beast::unit_test::suite // Failure situations (i.e. all other combinations) { // only FinishFunction - env(escrowCreate, escrow::finish_function(wasmHex), fee(txnFees), ter(temBAD_EXPIRATION)); + env(escrowCreate, escrow::finish_function(ledgerSqnWasmHex), fee(txnFees), ter(temBAD_EXPIRATION)); env.close(); } { // FinishFunction + FinishAfter env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::finish_time(env.now() + 2s), fee(txnFees), ter(temBAD_EXPIRATION)); @@ -185,7 +243,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { // FinishFunction + Condition env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::condition(escrow::cb1), fee(txnFees), ter(temBAD_EXPIRATION)); @@ -194,7 +252,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { // FinishFunction + FinishAfter + Condition env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::condition(escrow::cb1), escrow::finish_time(env.now() + 2s), fee(txnFees), @@ -213,7 +271,7 @@ struct EscrowSmart_test : public beast::unit_test::suite { // Not enough fees env(escrowCreate, - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 70s), fee(txnFees - 1), ter(telINSUF_FEE_P)); @@ -257,13 +315,12 @@ struct EscrowSmart_test : public beast::unit_test::suite // Tests whether the ledger index is >= 5 // getLedgerSqn() >= 5} - static auto wasmHex = ledgerSqnWasmHex; { // featureSmartEscrow disabled Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount const txnFees = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; env(escrow::finish(carol, alice, 1), fee(txnFees), escrow::comp_allowance(4), ter(temDISABLED)); env.close(); } @@ -291,6 +348,56 @@ struct EscrowSmart_test : public beast::unit_test::suite ter(temBAD_LIMIT)); } + { + // WASM compute disabled + using namespace test::jtx; + using namespace std::chrono; + Env env{*this, envconfig([](std::unique_ptr cfg) { + cfg->FEES.extension_compute_limit = 0; + return cfg; + })}; + + Account const alice{"alice"}; + env.fund(XRP(1000), alice); + env.close(); + + auto const seq = env.seq(alice); + auto const keylet = keylet::escrow(alice.id(), seq); + env(noop(alice)); // to align sequence numbers + + // This adds the Escrow ledger object by hand, bypassing normal + // transaction processing This is necessary because the config + // cannot be updated in the middle of a test, and we cannot easily + // create a Smart Escrow while the compute limit is set to 0 + env.app().openLedger().modify([&](OpenView& view, beast::Journal j) { + auto sle = std::make_shared(keylet); + + sle->setAccountID(sfAccount, alice.id()); + sle->setFieldAmount(sfAmount, XRP(100)); + sle->setFieldU32(sfCancelAfter, 110); + sle->setAccountID(sfDestination, alice.id()); + sle->setFieldVL(sfFinishFunction, strUnHex(ledgerSqnWasmHex).value()); + sle->setFieldU32(sfFlags, 0); + sle->setFieldU64(sfOwnerNode, 0); + uint256 tmp; + BEAST_EXPECT( + tmp.parseHex("F63D1A452A96C19EFD77901FB37D236C59EAA746771A6" + "85D1BBA57A2238B9401")); + sle->setFieldH256(sfPreviousTxnID, tmp); + sle->setFieldU32(sfPreviousTxnLgrSeq, 4); + sle->setFieldU32(sfSequence, seq); + + view.rawInsert(sle); + return true; + }); + BEAST_EXPECT(env.le(keylet)); + + env(escrow::finish(alice, alice, seq), + escrow::comp_allowance(1000), + fee(env.current()->fees().base + 1000), + ter(temTEMP_DISABLED)); + } + Env env(*this, features); // Run past the flag ledger so that a Fee change vote occurs and @@ -299,13 +406,13 @@ struct EscrowSmart_test : public beast::unit_test::suite for (auto i = env.current()->seq(); i <= 257; ++i) env.close(); - XRPAmount const txnFees = env.current()->fees().base * 10 + wasmHex.size() / 2 * 5; + XRPAmount const txnFees = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; env.fund(XRP(5000), alice, carol); // create escrow auto const seq = env.seq(alice); env(escrow::create(alice, carol, XRP(500)), - escrow::finish_function(wasmHex), + escrow::finish_function(ledgerSqnWasmHex), escrow::cancel_time(env.now() + 100s), fee(txnFees)); env.close(); @@ -778,7 +885,6 @@ struct EscrowSmart_test : public beast::unit_test::suite using namespace jtx; using namespace std::chrono; - // TODO: create wasm module for all host functions Account const alice{"alice"}; Account const carol{"carol"}; diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index 20cb83b64fc..bfce567f555 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -197,12 +197,32 @@ EscrowCreate::preflight(PreflightContext const& ctx) if (ctx.tx.isFieldPresent(sfFinishFunction)) { + if (ctx.app.config().FEES.extension_size_limit == 0 || ctx.app.config().FEES.extension_compute_limit == 0) + { + JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; + return temTEMP_DISABLED; + } + auto const code = ctx.tx.getFieldVL(sfFinishFunction); if (code.size() == 0 || code.size() > ctx.app.config().FEES.extension_size_limit) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad size " << code.size(); return temMALFORMED; } + // actual validity of WASM code happens in `preflightSigValidated` + // (after the signature is checked) + } + + return tesSUCCESS; +} + +NotTEC +EscrowCreate::preflightSigValidated(PreflightContext const& ctx) +{ + if (ctx.tx.isFieldPresent(sfFinishFunction)) + { + auto const code = ctx.tx.getFieldVL(sfFinishFunction); + // basic checks happen in `preflight` auto mock(std::make_shared(ctx.j)); auto const re = preflightEscrowWasm(code, mock, ESCROW_FUNCTION_NAME); @@ -622,6 +642,27 @@ EscrowFinish::preflight(PreflightContext const& ctx) return temMALFORMED; } + if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) + { + if (ctx.app.config().FEES.extension_compute_limit == 0) + { + JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; + return temTEMP_DISABLED; + } + if (*allowance == 0) + { + return temBAD_LIMIT; + } + if (*allowance > ctx.app.config().FEES.extension_compute_limit) + { + JLOG(ctx.j.debug()) << "ComputationAllowance too large: " << *allowance; + return temBAD_LIMIT; + } + } + + if (auto const err = credentials::checkFields(ctx.tx, ctx.j); !isTesSuccess(err)) + return err; + return tesSUCCESS; } @@ -650,22 +691,6 @@ EscrowFinish::preflightSigValidated(PreflightContext const& ctx) } } - if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) - { - if (*allowance == 0) - { - return temBAD_LIMIT; - } - if (*allowance > ctx.app.config().FEES.extension_compute_limit) - { - JLOG(ctx.j.debug()) << "ComputationAllowance too large: " << *allowance; - return temBAD_LIMIT; - } - } - - if (auto const err = credentials::checkFields(ctx.tx, ctx.j); !isTesSuccess(err)) - return err; - return tesSUCCESS; } diff --git a/src/xrpld/app/tx/detail/Escrow.h b/src/xrpld/app/tx/detail/Escrow.h index 60501163119..c501f6bd1d8 100644 --- a/src/xrpld/app/tx/detail/Escrow.h +++ b/src/xrpld/app/tx/detail/Escrow.h @@ -25,6 +25,9 @@ class EscrowCreate : public Transactor static NotTEC preflight(PreflightContext const& ctx); + static NotTEC + preflightSigValidated(PreflightContext const& ctx); + static TER preclaim(PreclaimContext const& ctx); From 77673663cad4ddca4a921df8a32d008fa7f37869 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 10 Feb 2026 17:42:41 -0500 Subject: [PATCH 177/212] fix cspell issues in tests (#6348) --- cspell.config.yaml | 3 + src/test/app/Wasm_test.cpp | 6 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 56 +++++++++---------- src/test/app/wasm_fixtures/copyFixtures.py | 1 + 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/cspell.config.yaml b/cspell.config.yaml index a4f5e52cf88..d03eda58f9b 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -6,6 +6,8 @@ ignorePaths: - docs/**/*.puml - cmake/** - LICENSE.md + - src/test/app/wasm_fixtures/**/*.wat + - src/test/app/wasm_fixtures/*.c language: en allowCompoundWords: true # TODO (#6334) ignoreRandomStrings: true @@ -59,6 +61,7 @@ words: - Britto - Btrfs - canonicality + - cdylib - changespq - checkme - choco diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index c4ca26250ca..1802cd9d44b 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -229,8 +229,8 @@ struct Wasm_test : public beast::unit_test::suite Bytes outb; outb.resize(1024); - auto const minsz = std::min(static_cast(512), static_cast(b58WasmHex.size())); - auto const s = std::string_view(b58WasmHex.c_str(), minsz); + auto const minSize = std::min(static_cast(512), static_cast(b58WasmHex.size())); + auto const s = std::string_view(b58WasmHex.c_str(), minSize); auto const re = engine.run(b58Wasm, "b58enco", wasmParams(outb, s)); @@ -802,7 +802,7 @@ struct Wasm_test : public beast::unit_test::suite std::shared_ptr hfs(new TestHostFunctions(env, 0)); auto imports = createWasmImport(*hfs); - { // Calls float_from_uint with bad aligment. + { // Calls float_from_uint with bad alignment. // Can be checked through codecov auto& engine = WasmEngine::instance(); diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 5e58d13ecdf..59ff5bc164f 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -564,13 +564,13 @@ pub extern "C" fn finish() -> i32 { "amm_keylet_len_wrong_non_xrp_currency_len", ) }); - let xrpissue: &[u8] = &[0; 40]; // 40 bytes + let xrp_issue: &[u8] = &[0; 40]; // 40 bytes with_buffer::<32, _, _>(|ptr, len| { check_result( unsafe { host::amm_keylet( - xrpissue.as_ptr(), - xrpissue.len(), + xrp_issue.as_ptr(), + xrp_issue.len(), asset1_bytes.as_ptr(), asset1_bytes.len(), ptr, @@ -1265,7 +1265,7 @@ pub extern "C" fn finish() -> i32 { check_result( unsafe { host::account_keylet(locator.as_ptr(), locator.len(), ptr, len) }, error_codes::INVALID_PARAMS, - "account_keylet_wrong_size_accountid", + "account_keylet_wrong_size_account_id", ) }); let seq: i32 = 1; @@ -1283,7 +1283,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "check_keylet_wrong_size_accountid", + "check_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1301,7 +1301,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "credential_keylet_wrong_size_accountid1", + "credential_keylet_wrong_size_account_id1", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1319,7 +1319,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "credential_keylet_wrong_size_accountid2", + "credential_keylet_wrong_size_account_id2", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1335,7 +1335,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "delegate_keylet_wrong_size_accountid1", + "delegate_keylet_wrong_size_account_id1", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1351,7 +1351,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "delegate_keylet_wrong_size_accountid2", + "delegate_keylet_wrong_size_account_id2", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1367,7 +1367,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "deposit_preauth_keylet_wrong_size_accountid1", + "deposit_preauth_keylet_wrong_size_account_id1", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1383,14 +1383,14 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "deposit_preauth_keylet_wrong_size_accountid2", + "deposit_preauth_keylet_wrong_size_account_id2", ) }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::did_keylet(locator.as_ptr(), locator.len(), ptr, len) }, error_codes::INVALID_PARAMS, - "did_keylet_wrong_size_accountid", + "did_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1406,7 +1406,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "escrow_keylet_wrong_size_accountid", + "escrow_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1424,7 +1424,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "line_keylet_wrong_size_accountid1", + "line_keylet_wrong_size_account_id1", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1442,7 +1442,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "line_keylet_wrong_size_accountid2", + "line_keylet_wrong_size_account_id2", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1458,7 +1458,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "mpt_issuance_keylet_wrong_size_accountid", + "mpt_issuance_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1474,7 +1474,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "mptoken_keylet_wrong_size_accountid", + "mptoken_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1490,7 +1490,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "nft_offer_keylet_wrong_size_accountid", + "nft_offer_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1506,7 +1506,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "offer_keylet_wrong_size_accountid", + "offer_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1522,7 +1522,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "oracle_keylet_wrong_size_accountid", + "oracle_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1540,7 +1540,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "paychan_keylet_wrong_size_accountid1", + "paychan_keylet_wrong_size_account_id1", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1558,7 +1558,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "paychan_keylet_wrong_size_accountid2", + "paychan_keylet_wrong_size_account_id2", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1574,14 +1574,14 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "permissioned_domain_keylet_wrong_size_accountid", + "permissioned_domain_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { check_result( unsafe { host::signers_keylet(locator.as_ptr(), locator.len(), ptr, len) }, error_codes::INVALID_PARAMS, - "signers_keylet_wrong_size_accountid", + "signers_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1597,7 +1597,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "ticket_keylet_wrong_size_accountid", + "ticket_keylet_wrong_size_account_id", ) }); with_buffer::<2, _, _>(|ptr, len| { @@ -1613,7 +1613,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "vault_keylet_wrong_size_accountid", + "vault_keylet_wrong_size_account_id", ) }); let uint256: &[u8] = b"00000000000000000000000000000001"; @@ -1630,7 +1630,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "get_nft_wrong_size_accountid", + "get_nft_wrong_size_account_id", ) }); check_result( @@ -1643,7 +1643,7 @@ pub extern "C" fn finish() -> i32 { ) }, error_codes::INVALID_PARAMS, - "trace_account_wrong_size_accountid", + "trace_account_wrong_size_account_id", ); // invalid Currency was already tested above diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index 2c0abc560d0..3d9faddbed5 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -1,3 +1,4 @@ +# cspell: disable import os import sys import subprocess From 6728ab52b76a9e0baca57694422ce4c8d53e60c3 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 10 Feb 2026 18:10:33 -0500 Subject: [PATCH 178/212] Add tests for wasm functions with many parameters (#6343) * Add functions with many parameters * Add 10k locals function * Module with 5k functions * fix typo Co-authored-by: Mayukha Vadari --------- Co-authored-by: Mayukha Vadari --- src/test/app/Wasm_test.cpp | 50 + src/test/app/wasm_fixtures/fixtures.cpp | 3786 ++ src/test/app/wasm_fixtures/fixtures.h | 5 + src/test/app/wasm_fixtures/thousand1_params.c | 264 + src/test/app/wasm_fixtures/thousand_params.c | 262 + .../app/wasm_fixtures/wat/functions_5k.wat | 45002 ++++++++++++++ src/test/app/wasm_fixtures/wat/locals_10k.wat | 50000 ++++++++++++++++ 7 files changed, 99369 insertions(+) create mode 100644 src/test/app/wasm_fixtures/thousand1_params.c create mode 100644 src/test/app/wasm_fixtures/thousand_params.c create mode 100644 src/test/app/wasm_fixtures/wat/functions_5k.wat create mode 100644 src/test/app/wasm_fixtures/wat/locals_10k.wat diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 1802cd9d44b..d781875cc6e 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -923,6 +923,55 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECT(b6 == SWAP_DATAI16); } + void + testManyParams() + { + testcase("Wasm Many params"); + + auto const params1k = hexToBytes(thousandParamsHex); + auto const params1k1 = hexToBytes(thousand1ParamsHex); + + using namespace test::jtx; + + Env env{*this}; + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto imports = createWasmImport(*hfs); + + // add 1k parameter (max that wasmi support) + std::vector params; + for (int i = 0; i < 1000; ++i) + params.push_back({.type = WT_I32, .of = {.i32 = 2 * i}}); + + auto& engine = WasmEngine::instance(); + { + auto re = engine.run(params1k, "test", params, imports, hfs, 1'000'000, env.journal); + BEAST_EXPECT(re && re->result == 999000); + } + + // add 1 more parameter, module can't be created now + params.push_back({.type = WT_I32, .of = {.i32 = 2 * 1000}}); + { + auto re = engine.run(params1k1, "test", params, imports, hfs, 1'000'000, env.journal); + BEAST_EXPECT(!re); + } + + // function that create 10k local variables + auto const locals10k = hexToBytes(locals10kHex); + { + auto re = engine.run(locals10k, "test", wasmParams(0, 1), imports, hfs, 1'000'000, env.journal); + BEAST_EXPECT(re && re->result == 890'489'442); + } + + // module has 5k functions + auto const functions5k = hexToBytes(functions5kHex); + { + auto re = engine.run(functions5k, "test0001", wasmParams(2, 3), imports, hfs, 1'000'000, env.journal); + BEAST_EXPECT(re && re->result == 5); + } + + env.close(); + } + void run() override { @@ -956,6 +1005,7 @@ struct Wasm_test : public beast::unit_test::suite testBadAlign(); testReturnType(); testSwapBytes(); + testManyParams(); // perfTest(); } diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 9df5201e9ff..db77313a42b 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1318,3 +1318,3789 @@ extern std::string const badAlignWasmHex = "65637420616234623561326462353832393538616631656533303861373930636664623432626432343732302900490f7461726765745f6665" "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c74" "6976616c7565"; + +extern std::string const thousandParamsHex = + "0061736d0100000001f1070260000060e8077f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f017f030302000105" + "030100020638097f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f0041000b" + "7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730000047465737400010c5f5f64736f5f68616e646c" + "6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f5f676c6f62616c5f6261" + "736503040b5f5f686561705f6261736503050a5f5f686561705f656e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f62" + "61736503080aa71e0202000ba11e00200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a6a200b6a200c6a200d6a20" + "0e6a200f6a20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d6a201e6a201f6a20206a20" + "216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a202f6a20306a20316a20326a20336a20" + "346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e6a203f6a20406a20416a20426a20436a20446a20456a20466a20" + "476a20486a20496a204a6a204b6a204c6a204d6a204e6a204f6a20506a20516a20526a20536a20546a20556a20566a20576a20586a20596a20" + "5a6a205b6a205c6a205d6a205e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a20696a206a6a206b6a206c6a20" + "6d6a206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c6a207d6a207e6a207f6a20" + "80016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a2089016a208a016a208b016a208c016a208d016a208e" + "016a208f016a2090016a2091016a2092016a2093016a2094016a2095016a2096016a2097016a2098016a2099016a209a016a209b016a209c01" + "6a209d016a209e016a209f016a20a0016a20a1016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20a8016a20a9016a20aa016a" + "20ab016a20ac016a20ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b6016a20b7016a20b8016a20" + "b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c4016a20c5016a20c6016a20c7" + "016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20d0016a20d1016a20d2016a20d3016a20d4016a20d501" + "6a20d6016a20d7016a20d8016a20d9016a20da016a20db016a20dc016a20dd016a20de016a20df016a20e0016a20e1016a20e2016a20e3016a" + "20e4016a20e5016a20e6016a20e7016a20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef016a20f0016a20f1016a20" + "f2016a20f3016a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd016a20fe016a20ff016a2080" + "026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a208b026a208c026a208d026a208e02" + "6a208f026a2090026a2091026a2092026a2093026a2094026a2095026a2096026a2097026a2098026a2099026a209a026a209b026a209c026a" + "209d026a209e026a209f026a20a0026a20a1026a20a2026a20a3026a20a4026a20a5026a20a6026a20a7026a20a8026a20a9026a20aa026a20" + "ab026a20ac026a20ad026a20ae026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b6026a20b7026a20b8026a20b9" + "026a20ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a20c5026a20c6026a20c702" + "6a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d1026a20d2026a20d3026a20d4026a20d5026a" + "20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20dd026a20de026a20df026a20e0026a20e1026a20e2026a20e3026a20" + "e4026a20e5026a20e6026a20e7026a20e8026a20e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef026a20f0026a20f1026a20f2" + "026a20f3026a20f4026a20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a20fe026a20ff026a208003" + "6a2081036a2082036a2083036a2084036a2085036a2086036a2087036a2088036a2089036a208a036a208b036a208c036a208d036a208e036a" + "208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a2098036a2099036a209a036a209b036a209c036a20" + "9d036a209e036a209f036a20a0036a20a1036a20a2036a20a3036a20a4036a20a5036a20a6036a20a7036a20a8036a20a9036a20aa036a20ab" + "036a20ac036a20ad036a20ae036a20af036a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a20b7036a20b8036a20b903" + "6a20ba036a20bb036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20c5036a20c6036a20c7036a" + "20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d2036a20d3036a20d4036a20d5036a20" + "d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de036a20df036a20e0036a20e1036a20e2036a20e3036a20e4" + "036a20e5036a20e6036a20e7036a20e8036a20e9036a20ea036a20eb036a20ec036a20ed036a20ee036a20ef036a20f0036a20f1036a20f203" + "6a20f3036a20f4036a20f5036a20f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20fe036a20ff036a2080046a" + "2081046a2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c046a208d046a208e046a20" + "8f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a2099046a209a046a209b046a209c046a209d" + "046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a20a5046a20a6046a20a7046a20a8046a20a9046a20aa046a20ab04" + "6a20ac046a20ad046a20ae046a20af046a20b0046a20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20b7046a20b8046a20b9046a" + "20ba046a20bb046a20bc046a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c5046a20c6046a20c7046a20" + "c8046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d3046a20d4046a20d5046a20d6" + "046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df046a20e0046a20e1046a20e2046a20e3046a20e404" + "6a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb046a20ec046a20ed046a20ee046a20ef046a20f0046a20f1046a20f2046a" + "20f3046a20f4046a20f5046a20f6046a20f7046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe046a20ff046a2080056a20" + "81056a2082056a2083056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c056a208d056a208e056a208f" + "056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a056a209b056a209c056a209d05" + "6a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20a6056a20a7056a20a8056a20a9056a20aa056a20ab056a" + "20ac056a20ad056a20ae056a20af056a20b0056a20b1056a20b2056a20b3056a20b4056a20b5056a20b6056a20b7056a20b8056a20b9056a20" + "ba056a20bb056a20bc056a20bd056a20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c5056a20c6056a20c7056a20c8" + "056a20c9056a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a20d4056a20d5056a20d605" + "6a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a20e1056a20e2056a20e3056a20e4056a" + "20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec056a20ed056a20ee056a20ef056a20f0056a20f1056a20f2056a20" + "f3056a20f4056a20f5056a20f6056a20f7056a20f8056a20f9056a20fa056a20fb056a20fc056a20fd056a20fe056a20ff056a2080066a2081" + "066a2082066a2083066a2084066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a208d066a208e066a208f06" + "6a2090066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a209b066a209c066a209d066a" + "209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a7066a20a8066a20a9066a20aa066a20ab066a20" + "ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20b3066a20b4066a20b5066a20b6066a20b7066a20b8066a20b9066a20ba" + "066a20bb066a20bc066a20bd066a20be066a20bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a20c6066a20c7066a20c806" + "6a20c9066a20ca066a20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20d4066a20d5066a20d6066a" + "20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20e2066a20e3066a20e4066a20" + "e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a20ee066a20ef066a20f0066a20f1066a20f2066a20f3" + "066a20f4066a20f5066a20f6066a20f7066a20f8066a20f9066a20fa066a20fb066a20fc066a20fd066a20fe066a20ff066a2080076a208107" + "6a2082076a2083076a2084076a2085076a2086076a2087076a2088076a2089076a208a076a208b076a208c076a208d076a208e076a208f076a" + "2090076a2091076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b076a209c076a209d076a20" + "9e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a8076a20a9076a20aa076a20ab076a20ac" + "076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b4076a20b5076a20b6076a20b7076a20b8076a20b9076a20ba07" + "6a20bb076a20bc076a20bd076a20be076a20bf076a20c0076a20c1076a20c2076a20c3076a20c4076a20c5076a20c6076a20c7076a20c8076a" + "20c9076a20ca076a20cb076a20cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d4076a20d5076a20d6076a20" + "d7076a20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e2076a20e3076a20e4076a20e5" + "076a20e6076a20e7076a0b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31392e312e352d776173692d" + "73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420616234623561326462353832393538" + "616631656533303861373930636664623432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c" + "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const thousand1ParamsHex = + "0061736d0100000001f2070260000060e9077f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f017f0303020001" + "05030100020638097f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f004100" + "0b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730000047465737400010c5f5f64736f5f68616e64" + "6c6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f5f676c6f62616c5f62" + "61736503040b5f5f686561705f6261736503050a5f5f686561705f656e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f" + "6261736503080aab1e0202000ba51e00200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a6a200b6a200c6a200d6a" + "200e6a200f6a20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d6a201e6a201f6a20206a" + "20216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a202f6a20306a20316a20326a20336a" + "20346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e6a203f6a20406a20416a20426a20436a20446a20456a20466a" + "20476a20486a20496a204a6a204b6a204c6a204d6a204e6a204f6a20506a20516a20526a20536a20546a20556a20566a20576a20586a20596a" + "205a6a205b6a205c6a205d6a205e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a20696a206a6a206b6a206c6a" + "206d6a206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c6a207d6a207e6a207f6a" + "2080016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a2089016a208a016a208b016a208c016a208d016a20" + "8e016a208f016a2090016a2091016a2092016a2093016a2094016a2095016a2096016a2097016a2098016a2099016a209a016a209b016a209c" + "016a209d016a209e016a209f016a20a0016a20a1016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20a8016a20a9016a20aa01" + "6a20ab016a20ac016a20ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b6016a20b7016a20b8016a" + "20b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c4016a20c5016a20c6016a20" + "c7016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20d0016a20d1016a20d2016a20d3016a20d4016a20d5" + "016a20d6016a20d7016a20d8016a20d9016a20da016a20db016a20dc016a20dd016a20de016a20df016a20e0016a20e1016a20e2016a20e301" + "6a20e4016a20e5016a20e6016a20e7016a20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef016a20f0016a20f1016a" + "20f2016a20f3016a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd016a20fe016a20ff016a20" + "80026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a208b026a208c026a208d026a208e" + "026a208f026a2090026a2091026a2092026a2093026a2094026a2095026a2096026a2097026a2098026a2099026a209a026a209b026a209c02" + "6a209d026a209e026a209f026a20a0026a20a1026a20a2026a20a3026a20a4026a20a5026a20a6026a20a7026a20a8026a20a9026a20aa026a" + "20ab026a20ac026a20ad026a20ae026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b6026a20b7026a20b8026a20" + "b9026a20ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a20c5026a20c6026a20c7" + "026a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d1026a20d2026a20d3026a20d4026a20d502" + "6a20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20dd026a20de026a20df026a20e0026a20e1026a20e2026a20e3026a" + "20e4026a20e5026a20e6026a20e7026a20e8026a20e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef026a20f0026a20f1026a20" + "f2026a20f3026a20f4026a20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a20fe026a20ff026a2080" + "036a2081036a2082036a2083036a2084036a2085036a2086036a2087036a2088036a2089036a208a036a208b036a208c036a208d036a208e03" + "6a208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a2098036a2099036a209a036a209b036a209c036a" + "209d036a209e036a209f036a20a0036a20a1036a20a2036a20a3036a20a4036a20a5036a20a6036a20a7036a20a8036a20a9036a20aa036a20" + "ab036a20ac036a20ad036a20ae036a20af036a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a20b7036a20b8036a20b9" + "036a20ba036a20bb036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20c5036a20c6036a20c703" + "6a20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d2036a20d3036a20d4036a20d5036a" + "20d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de036a20df036a20e0036a20e1036a20e2036a20e3036a20" + "e4036a20e5036a20e6036a20e7036a20e8036a20e9036a20ea036a20eb036a20ec036a20ed036a20ee036a20ef036a20f0036a20f1036a20f2" + "036a20f3036a20f4036a20f5036a20f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20fe036a20ff036a208004" + "6a2081046a2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c046a208d046a208e046a" + "208f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a2099046a209a046a209b046a209c046a20" + "9d046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a20a5046a20a6046a20a7046a20a8046a20a9046a20aa046a20ab" + "046a20ac046a20ad046a20ae046a20af046a20b0046a20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20b7046a20b8046a20b904" + "6a20ba046a20bb046a20bc046a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c5046a20c6046a20c7046a" + "20c8046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d3046a20d4046a20d5046a20" + "d6046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df046a20e0046a20e1046a20e2046a20e3046a20e4" + "046a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb046a20ec046a20ed046a20ee046a20ef046a20f0046a20f1046a20f204" + "6a20f3046a20f4046a20f5046a20f6046a20f7046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe046a20ff046a2080056a" + "2081056a2082056a2083056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c056a208d056a208e056a20" + "8f056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a056a209b056a209c056a209d" + "056a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20a6056a20a7056a20a8056a20a9056a20aa056a20ab05" + "6a20ac056a20ad056a20ae056a20af056a20b0056a20b1056a20b2056a20b3056a20b4056a20b5056a20b6056a20b7056a20b8056a20b9056a" + "20ba056a20bb056a20bc056a20bd056a20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c5056a20c6056a20c7056a20" + "c8056a20c9056a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a20d4056a20d5056a20d6" + "056a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a20e1056a20e2056a20e3056a20e405" + "6a20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec056a20ed056a20ee056a20ef056a20f0056a20f1056a20f2056a" + "20f3056a20f4056a20f5056a20f6056a20f7056a20f8056a20f9056a20fa056a20fb056a20fc056a20fd056a20fe056a20ff056a2080066a20" + "81066a2082066a2083066a2084066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a208d066a208e066a208f" + "066a2090066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a209b066a209c066a209d06" + "6a209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a7066a20a8066a20a9066a20aa066a20ab066a" + "20ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20b3066a20b4066a20b5066a20b6066a20b7066a20b8066a20b9066a20" + "ba066a20bb066a20bc066a20bd066a20be066a20bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a20c6066a20c7066a20c8" + "066a20c9066a20ca066a20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20d4066a20d5066a20d606" + "6a20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20e2066a20e3066a20e4066a" + "20e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a20ee066a20ef066a20f0066a20f1066a20f2066a20" + "f3066a20f4066a20f5066a20f6066a20f7066a20f8066a20f9066a20fa066a20fb066a20fc066a20fd066a20fe066a20ff066a2080076a2081" + "076a2082076a2083076a2084076a2085076a2086076a2087076a2088076a2089076a208a076a208b076a208c076a208d076a208e076a208f07" + "6a2090076a2091076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b076a209c076a209d076a" + "209e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a8076a20a9076a20aa076a20ab076a20" + "ac076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b4076a20b5076a20b6076a20b7076a20b8076a20b9076a20ba" + "076a20bb076a20bc076a20bd076a20be076a20bf076a20c0076a20c1076a20c2076a20c3076a20c4076a20c5076a20c6076a20c7076a20c807" + "6a20c9076a20ca076a20cb076a20cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d4076a20d5076a20d6076a" + "20d7076a20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e2076a20e3076a20e4076a20" + "e5076a20e6076a20e7076a20e8076a0b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31392e312e352d" + "776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061623462356132646235" + "3832393538616631656533303861373930636664623432626432343732302900490f7461726765745f6665617475726573042b0f6d75746162" + "6c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + +extern std::string const locals10kHex = + "0061736d0100000001070160027f7f017f03020100070801047465737400000a9b8a0601978a06018e4e7f200020016a2102200120026a2103" + "200220036a2104200320046a2105200420056a2106200520066a2107200620076a2108200720086a2109200820096a210a2009200a6a210b20" + "0a200b6a210c200b200c6a210d200c200d6a210e200d200e6a210f200e200f6a2110200f20106a2111201020116a2112201120126a21132012" + "20136a2114201320146a2115201420156a2116201520166a2117201620176a2118201720186a2119201820196a211a2019201a6a211b201a20" + "1b6a211c201b201c6a211d201c201d6a211e201d201e6a211f201e201f6a2120201f20206a2121202020216a2122202120226a212320222023" + "6a2124202320246a2125202420256a2126202520266a2127202620276a2128202720286a2129202820296a212a2029202a6a212b202a202b6a" + "212c202b202c6a212d202c202d6a212e202d202e6a212f202e202f6a2130202f20306a2131203020316a2132203120326a2133203220336a21" + "34203320346a2135203420356a2136203520366a2137203620376a2138203720386a2139203820396a213a2039203a6a213b203a203b6a213c" + "203b203c6a213d203c203d6a213e203d203e6a213f203e203f6a2140203f20406a2141204020416a2142204120426a2143204220436a214420" + "4320446a2145204420456a2146204520466a2147204620476a2148204720486a2149204820496a214a2049204a6a214b204a204b6a214c204b" + "204c6a214d204c204d6a214e204d204e6a214f204e204f6a2150204f20506a2151205020516a2152205120526a2153205220536a2154205320" + "546a2155205420556a2156205520566a2157205620576a2158205720586a2159205820596a215a2059205a6a215b205a205b6a215c205b205c" + "6a215d205c205d6a215e205d205e6a215f205e205f6a2160205f20606a2161206020616a2162206120626a2163206220636a2164206320646a" + "2165206420656a2166206520666a2167206620676a2168206720686a2169206820696a216a2069206a6a216b206a206b6a216c206b206c6a21" + "6d206c206d6a216e206d206e6a216f206e206f6a2170206f20706a2171207020716a2172207120726a2173207220736a2174207320746a2175" + "207420756a2176207520766a2177207620776a2178207720786a2179207820796a217a2079207a6a217b207a207b6a217c207b207c6a217d20" + "7c207d6a217e207d207e6a217f207e207f6a218001207f2080016a2181012080012081016a2182012081012082016a2183012082012083016a" + "2184012083012084016a2185012084012085016a2186012085012086016a2187012086012087016a2188012087012088016a21890120880120" + "89016a218a01208901208a016a218b01208a01208b016a218c01208b01208c016a218d01208c01208d016a218e01208d01208e016a218f0120" + "8e01208f016a219001208f012090016a2191012090012091016a2192012091012092016a2193012092012093016a2194012093012094016a21" + "95012094012095016a2196012095012096016a2197012096012097016a2198012097012098016a2199012098012099016a219a01209901209a" + "016a219b01209a01209b016a219c01209b01209c016a219d01209c01209d016a219e01209d01209e016a219f01209e01209f016a21a001209f" + "0120a0016a21a10120a00120a1016a21a20120a10120a2016a21a30120a20120a3016a21a40120a30120a4016a21a50120a40120a5016a21a6" + "0120a50120a6016a21a70120a60120a7016a21a80120a70120a8016a21a90120a80120a9016a21aa0120a90120aa016a21ab0120aa0120ab01" + "6a21ac0120ab0120ac016a21ad0120ac0120ad016a21ae0120ad0120ae016a21af0120ae0120af016a21b00120af0120b0016a21b10120b001" + "20b1016a21b20120b10120b2016a21b30120b20120b3016a21b40120b30120b4016a21b50120b40120b5016a21b60120b50120b6016a21b701" + "20b60120b7016a21b80120b70120b8016a21b90120b80120b9016a21ba0120b90120ba016a21bb0120ba0120bb016a21bc0120bb0120bc016a" + "21bd0120bc0120bd016a21be0120bd0120be016a21bf0120be0120bf016a21c00120bf0120c0016a21c10120c00120c1016a21c20120c10120" + "c2016a21c30120c20120c3016a21c40120c30120c4016a21c50120c40120c5016a21c60120c50120c6016a21c70120c60120c7016a21c80120" + "c70120c8016a21c90120c80120c9016a21ca0120c90120ca016a21cb0120ca0120cb016a21cc0120cb0120cc016a21cd0120cc0120cd016a21" + "ce0120cd0120ce016a21cf0120ce0120cf016a21d00120cf0120d0016a21d10120d00120d1016a21d20120d10120d2016a21d30120d20120d3" + "016a21d40120d30120d4016a21d50120d40120d5016a21d60120d50120d6016a21d70120d60120d7016a21d80120d70120d8016a21d90120d8" + "0120d9016a21da0120d90120da016a21db0120da0120db016a21dc0120db0120dc016a21dd0120dc0120dd016a21de0120dd0120de016a21df" + "0120de0120df016a21e00120df0120e0016a21e10120e00120e1016a21e20120e10120e2016a21e30120e20120e3016a21e40120e30120e401" + "6a21e50120e40120e5016a21e60120e50120e6016a21e70120e60120e7016a21e80120e70120e8016a21e90120e80120e9016a21ea0120e901" + "20ea016a21eb0120ea0120eb016a21ec0120eb0120ec016a21ed0120ec0120ed016a21ee0120ed0120ee016a21ef0120ee0120ef016a21f001" + "20ef0120f0016a21f10120f00120f1016a21f20120f10120f2016a21f30120f20120f3016a21f40120f30120f4016a21f50120f40120f5016a" + "21f60120f50120f6016a21f70120f60120f7016a21f80120f70120f8016a21f90120f80120f9016a21fa0120f90120fa016a21fb0120fa0120" + "fb016a21fc0120fb0120fc016a21fd0120fc0120fd016a21fe0120fd0120fe016a21ff0120fe0120ff016a21800220ff012080026a21810220" + "80022081026a2182022081022082026a2183022082022083026a2184022083022084026a2185022084022085026a2186022085022086026a21" + "87022086022087026a2188022087022088026a2189022088022089026a218a02208902208a026a218b02208a02208b026a218c02208b02208c" + "026a218d02208c02208d026a218e02208d02208e026a218f02208e02208f026a219002208f022090026a2191022090022091026a2192022091" + "022092026a2193022092022093026a2194022093022094026a2195022094022095026a2196022095022096026a2197022096022097026a2198" + "022097022098026a2199022098022099026a219a02209902209a026a219b02209a02209b026a219c02209b02209c026a219d02209c02209d02" + "6a219e02209d02209e026a219f02209e02209f026a21a002209f0220a0026a21a10220a00220a1026a21a20220a10220a2026a21a30220a202" + "20a3026a21a40220a30220a4026a21a50220a40220a5026a21a60220a50220a6026a21a70220a60220a7026a21a80220a70220a8026a21a902" + "20a80220a9026a21aa0220a90220aa026a21ab0220aa0220ab026a21ac0220ab0220ac026a21ad0220ac0220ad026a21ae0220ad0220ae026a" + "21af0220ae0220af026a21b00220af0220b0026a21b10220b00220b1026a21b20220b10220b2026a21b30220b20220b3026a21b40220b30220" + "b4026a21b50220b40220b5026a21b60220b50220b6026a21b70220b60220b7026a21b80220b70220b8026a21b90220b80220b9026a21ba0220" + "b90220ba026a21bb0220ba0220bb026a21bc0220bb0220bc026a21bd0220bc0220bd026a21be0220bd0220be026a21bf0220be0220bf026a21" + "c00220bf0220c0026a21c10220c00220c1026a21c20220c10220c2026a21c30220c20220c3026a21c40220c30220c4026a21c50220c40220c5" + "026a21c60220c50220c6026a21c70220c60220c7026a21c80220c70220c8026a21c90220c80220c9026a21ca0220c90220ca026a21cb0220ca" + "0220cb026a21cc0220cb0220cc026a21cd0220cc0220cd026a21ce0220cd0220ce026a21cf0220ce0220cf026a21d00220cf0220d0026a21d1" + "0220d00220d1026a21d20220d10220d2026a21d30220d20220d3026a21d40220d30220d4026a21d50220d40220d5026a21d60220d50220d602" + "6a21d70220d60220d7026a21d80220d70220d8026a21d90220d80220d9026a21da0220d90220da026a21db0220da0220db026a21dc0220db02" + "20dc026a21dd0220dc0220dd026a21de0220dd0220de026a21df0220de0220df026a21e00220df0220e0026a21e10220e00220e1026a21e202" + "20e10220e2026a21e30220e20220e3026a21e40220e30220e4026a21e50220e40220e5026a21e60220e50220e6026a21e70220e60220e7026a" + "21e80220e70220e8026a21e90220e80220e9026a21ea0220e90220ea026a21eb0220ea0220eb026a21ec0220eb0220ec026a21ed0220ec0220" + "ed026a21ee0220ed0220ee026a21ef0220ee0220ef026a21f00220ef0220f0026a21f10220f00220f1026a21f20220f10220f2026a21f30220" + "f20220f3026a21f40220f30220f4026a21f50220f40220f5026a21f60220f50220f6026a21f70220f60220f7026a21f80220f70220f8026a21" + "f90220f80220f9026a21fa0220f90220fa026a21fb0220fa0220fb026a21fc0220fb0220fc026a21fd0220fc0220fd026a21fe0220fd0220fe" + "026a21ff0220fe0220ff026a21800320ff022080036a2181032080032081036a2182032081032082036a2183032082032083036a2184032083" + "032084036a2185032084032085036a2186032085032086036a2187032086032087036a2188032087032088036a2189032088032089036a218a" + "03208903208a036a218b03208a03208b036a218c03208b03208c036a218d03208c03208d036a218e03208d03208e036a218f03208e03208f03" + "6a219003208f032090036a2191032090032091036a2192032091032092036a2193032092032093036a2194032093032094036a219503209403" + "2095036a2196032095032096036a2197032096032097036a2198032097032098036a2199032098032099036a219a03209903209a036a219b03" + "209a03209b036a219c03209b03209c036a219d03209c03209d036a219e03209d03209e036a219f03209e03209f036a21a003209f0320a0036a" + "21a10320a00320a1036a21a20320a10320a2036a21a30320a20320a3036a21a40320a30320a4036a21a50320a40320a5036a21a60320a50320" + "a6036a21a70320a60320a7036a21a80320a70320a8036a21a90320a80320a9036a21aa0320a90320aa036a21ab0320aa0320ab036a21ac0320" + "ab0320ac036a21ad0320ac0320ad036a21ae0320ad0320ae036a21af0320ae0320af036a21b00320af0320b0036a21b10320b00320b1036a21" + "b20320b10320b2036a21b30320b20320b3036a21b40320b30320b4036a21b50320b40320b5036a21b60320b50320b6036a21b70320b60320b7" + "036a21b80320b70320b8036a21b90320b80320b9036a21ba0320b90320ba036a21bb0320ba0320bb036a21bc0320bb0320bc036a21bd0320bc" + "0320bd036a21be0320bd0320be036a21bf0320be0320bf036a21c00320bf0320c0036a21c10320c00320c1036a21c20320c10320c2036a21c3" + "0320c20320c3036a21c40320c30320c4036a21c50320c40320c5036a21c60320c50320c6036a21c70320c60320c7036a21c80320c70320c803" + "6a21c90320c80320c9036a21ca0320c90320ca036a21cb0320ca0320cb036a21cc0320cb0320cc036a21cd0320cc0320cd036a21ce0320cd03" + "20ce036a21cf0320ce0320cf036a21d00320cf0320d0036a21d10320d00320d1036a21d20320d10320d2036a21d30320d20320d3036a21d403" + "20d30320d4036a21d50320d40320d5036a21d60320d50320d6036a21d70320d60320d7036a21d80320d70320d8036a21d90320d80320d9036a" + "21da0320d90320da036a21db0320da0320db036a21dc0320db0320dc036a21dd0320dc0320dd036a21de0320dd0320de036a21df0320de0320" + "df036a21e00320df0320e0036a21e10320e00320e1036a21e20320e10320e2036a21e30320e20320e3036a21e40320e30320e4036a21e50320" + "e40320e5036a21e60320e50320e6036a21e70320e60320e7036a21e80320e70320e8036a21e90320e80320e9036a21ea0320e90320ea036a21" + "eb0320ea0320eb036a21ec0320eb0320ec036a21ed0320ec0320ed036a21ee0320ed0320ee036a21ef0320ee0320ef036a21f00320ef0320f0" + "036a21f10320f00320f1036a21f20320f10320f2036a21f30320f20320f3036a21f40320f30320f4036a21f50320f40320f5036a21f60320f5" + "0320f6036a21f70320f60320f7036a21f80320f70320f8036a21f90320f80320f9036a21fa0320f90320fa036a21fb0320fa0320fb036a21fc" + "0320fb0320fc036a21fd0320fc0320fd036a21fe0320fd0320fe036a21ff0320fe0320ff036a21800420ff032080046a218104208004208104" + "6a2182042081042082046a2183042082042083046a2184042083042084046a2185042084042085046a2186042085042086046a218704208604" + "2087046a2188042087042088046a2189042088042089046a218a04208904208a046a218b04208a04208b046a218c04208b04208c046a218d04" + "208c04208d046a218e04208d04208e046a218f04208e04208f046a219004208f042090046a2191042090042091046a2192042091042092046a" + "2193042092042093046a2194042093042094046a2195042094042095046a2196042095042096046a2197042096042097046a21980420970420" + "98046a2199042098042099046a219a04209904209a046a219b04209a04209b046a219c04209b04209c046a219d04209c04209d046a219e0420" + "9d04209e046a219f04209e04209f046a21a004209f0420a0046a21a10420a00420a1046a21a20420a10420a2046a21a30420a20420a3046a21" + "a40420a30420a4046a21a50420a40420a5046a21a60420a50420a6046a21a70420a60420a7046a21a80420a70420a8046a21a90420a80420a9" + "046a21aa0420a90420aa046a21ab0420aa0420ab046a21ac0420ab0420ac046a21ad0420ac0420ad046a21ae0420ad0420ae046a21af0420ae" + "0420af046a21b00420af0420b0046a21b10420b00420b1046a21b20420b10420b2046a21b30420b20420b3046a21b40420b30420b4046a21b5" + "0420b40420b5046a21b60420b50420b6046a21b70420b60420b7046a21b80420b70420b8046a21b90420b80420b9046a21ba0420b90420ba04" + "6a21bb0420ba0420bb046a21bc0420bb0420bc046a21bd0420bc0420bd046a21be0420bd0420be046a21bf0420be0420bf046a21c00420bf04" + "20c0046a21c10420c00420c1046a21c20420c10420c2046a21c30420c20420c3046a21c40420c30420c4046a21c50420c40420c5046a21c604" + "20c50420c6046a21c70420c60420c7046a21c80420c70420c8046a21c90420c80420c9046a21ca0420c90420ca046a21cb0420ca0420cb046a" + "21cc0420cb0420cc046a21cd0420cc0420cd046a21ce0420cd0420ce046a21cf0420ce0420cf046a21d00420cf0420d0046a21d10420d00420" + "d1046a21d20420d10420d2046a21d30420d20420d3046a21d40420d30420d4046a21d50420d40420d5046a21d60420d50420d6046a21d70420" + "d60420d7046a21d80420d70420d8046a21d90420d80420d9046a21da0420d90420da046a21db0420da0420db046a21dc0420db0420dc046a21" + "dd0420dc0420dd046a21de0420dd0420de046a21df0420de0420df046a21e00420df0420e0046a21e10420e00420e1046a21e20420e10420e2" + "046a21e30420e20420e3046a21e40420e30420e4046a21e50420e40420e5046a21e60420e50420e6046a21e70420e60420e7046a21e80420e7" + "0420e8046a21e90420e80420e9046a21ea0420e90420ea046a21eb0420ea0420eb046a21ec0420eb0420ec046a21ed0420ec0420ed046a21ee" + "0420ed0420ee046a21ef0420ee0420ef046a21f00420ef0420f0046a21f10420f00420f1046a21f20420f10420f2046a21f30420f20420f304" + "6a21f40420f30420f4046a21f50420f40420f5046a21f60420f50420f6046a21f70420f60420f7046a21f80420f70420f8046a21f90420f804" + "20f9046a21fa0420f90420fa046a21fb0420fa0420fb046a21fc0420fb0420fc046a21fd0420fc0420fd046a21fe0420fd0420fe046a21ff04" + "20fe0420ff046a21800520ff042080056a2181052080052081056a2182052081052082056a2183052082052083056a2184052083052084056a" + "2185052084052085056a2186052085052086056a2187052086052087056a2188052087052088056a2189052088052089056a218a0520890520" + "8a056a218b05208a05208b056a218c05208b05208c056a218d05208c05208d056a218e05208d05208e056a218f05208e05208f056a21900520" + "8f052090056a2191052090052091056a2192052091052092056a2193052092052093056a2194052093052094056a2195052094052095056a21" + "96052095052096056a2197052096052097056a2198052097052098056a2199052098052099056a219a05209905209a056a219b05209a05209b" + "056a219c05209b05209c056a219d05209c05209d056a219e05209d05209e056a219f05209e05209f056a21a005209f0520a0056a21a10520a0" + "0520a1056a21a20520a10520a2056a21a30520a20520a3056a21a40520a30520a4056a21a50520a40520a5056a21a60520a50520a6056a21a7" + "0520a60520a7056a21a80520a70520a8056a21a90520a80520a9056a21aa0520a90520aa056a21ab0520aa0520ab056a21ac0520ab0520ac05" + "6a21ad0520ac0520ad056a21ae0520ad0520ae056a21af0520ae0520af056a21b00520af0520b0056a21b10520b00520b1056a21b20520b105" + "20b2056a21b30520b20520b3056a21b40520b30520b4056a21b50520b40520b5056a21b60520b50520b6056a21b70520b60520b7056a21b805" + "20b70520b8056a21b90520b80520b9056a21ba0520b90520ba056a21bb0520ba0520bb056a21bc0520bb0520bc056a21bd0520bc0520bd056a" + "21be0520bd0520be056a21bf0520be0520bf056a21c00520bf0520c0056a21c10520c00520c1056a21c20520c10520c2056a21c30520c20520" + "c3056a21c40520c30520c4056a21c50520c40520c5056a21c60520c50520c6056a21c70520c60520c7056a21c80520c70520c8056a21c90520" + "c80520c9056a21ca0520c90520ca056a21cb0520ca0520cb056a21cc0520cb0520cc056a21cd0520cc0520cd056a21ce0520cd0520ce056a21" + "cf0520ce0520cf056a21d00520cf0520d0056a21d10520d00520d1056a21d20520d10520d2056a21d30520d20520d3056a21d40520d30520d4" + "056a21d50520d40520d5056a21d60520d50520d6056a21d70520d60520d7056a21d80520d70520d8056a21d90520d80520d9056a21da0520d9" + "0520da056a21db0520da0520db056a21dc0520db0520dc056a21dd0520dc0520dd056a21de0520dd0520de056a21df0520de0520df056a21e0" + "0520df0520e0056a21e10520e00520e1056a21e20520e10520e2056a21e30520e20520e3056a21e40520e30520e4056a21e50520e40520e505" + "6a21e60520e50520e6056a21e70520e60520e7056a21e80520e70520e8056a21e90520e80520e9056a21ea0520e90520ea056a21eb0520ea05" + "20eb056a21ec0520eb0520ec056a21ed0520ec0520ed056a21ee0520ed0520ee056a21ef0520ee0520ef056a21f00520ef0520f0056a21f105" + "20f00520f1056a21f20520f10520f2056a21f30520f20520f3056a21f40520f30520f4056a21f50520f40520f5056a21f60520f50520f6056a" + "21f70520f60520f7056a21f80520f70520f8056a21f90520f80520f9056a21fa0520f90520fa056a21fb0520fa0520fb056a21fc0520fb0520" + "fc056a21fd0520fc0520fd056a21fe0520fd0520fe056a21ff0520fe0520ff056a21800620ff052080066a2181062080062081066a21820620" + "81062082066a2183062082062083066a2184062083062084066a2185062084062085066a2186062085062086066a2187062086062087066a21" + "88062087062088066a2189062088062089066a218a06208906208a066a218b06208a06208b066a218c06208b06208c066a218d06208c06208d" + "066a218e06208d06208e066a218f06208e06208f066a219006208f062090066a2191062090062091066a2192062091062092066a2193062092" + "062093066a2194062093062094066a2195062094062095066a2196062095062096066a2197062096062097066a2198062097062098066a2199" + "062098062099066a219a06209906209a066a219b06209a06209b066a219c06209b06209c066a219d06209c06209d066a219e06209d06209e06" + "6a219f06209e06209f066a21a006209f0620a0066a21a10620a00620a1066a21a20620a10620a2066a21a30620a20620a3066a21a40620a306" + "20a4066a21a50620a40620a5066a21a60620a50620a6066a21a70620a60620a7066a21a80620a70620a8066a21a90620a80620a9066a21aa06" + "20a90620aa066a21ab0620aa0620ab066a21ac0620ab0620ac066a21ad0620ac0620ad066a21ae0620ad0620ae066a21af0620ae0620af066a" + "21b00620af0620b0066a21b10620b00620b1066a21b20620b10620b2066a21b30620b20620b3066a21b40620b30620b4066a21b50620b40620" + "b5066a21b60620b50620b6066a21b70620b60620b7066a21b80620b70620b8066a21b90620b80620b9066a21ba0620b90620ba066a21bb0620" + "ba0620bb066a21bc0620bb0620bc066a21bd0620bc0620bd066a21be0620bd0620be066a21bf0620be0620bf066a21c00620bf0620c0066a21" + "c10620c00620c1066a21c20620c10620c2066a21c30620c20620c3066a21c40620c30620c4066a21c50620c40620c5066a21c60620c50620c6" + "066a21c70620c60620c7066a21c80620c70620c8066a21c90620c80620c9066a21ca0620c90620ca066a21cb0620ca0620cb066a21cc0620cb" + "0620cc066a21cd0620cc0620cd066a21ce0620cd0620ce066a21cf0620ce0620cf066a21d00620cf0620d0066a21d10620d00620d1066a21d2" + "0620d10620d2066a21d30620d20620d3066a21d40620d30620d4066a21d50620d40620d5066a21d60620d50620d6066a21d70620d60620d706" + "6a21d80620d70620d8066a21d90620d80620d9066a21da0620d90620da066a21db0620da0620db066a21dc0620db0620dc066a21dd0620dc06" + "20dd066a21de0620dd0620de066a21df0620de0620df066a21e00620df0620e0066a21e10620e00620e1066a21e20620e10620e2066a21e306" + "20e20620e3066a21e40620e30620e4066a21e50620e40620e5066a21e60620e50620e6066a21e70620e60620e7066a21e80620e70620e8066a" + "21e90620e80620e9066a21ea0620e90620ea066a21eb0620ea0620eb066a21ec0620eb0620ec066a21ed0620ec0620ed066a21ee0620ed0620" + "ee066a21ef0620ee0620ef066a21f00620ef0620f0066a21f10620f00620f1066a21f20620f10620f2066a21f30620f20620f3066a21f40620" + "f30620f4066a21f50620f40620f5066a21f60620f50620f6066a21f70620f60620f7066a21f80620f70620f8066a21f90620f80620f9066a21" + "fa0620f90620fa066a21fb0620fa0620fb066a21fc0620fb0620fc066a21fd0620fc0620fd066a21fe0620fd0620fe066a21ff0620fe0620ff" + "066a21800720ff062080076a2181072080072081076a2182072081072082076a2183072082072083076a2184072083072084076a2185072084" + "072085076a2186072085072086076a2187072086072087076a2188072087072088076a2189072088072089076a218a07208907208a076a218b" + "07208a07208b076a218c07208b07208c076a218d07208c07208d076a218e07208d07208e076a218f07208e07208f076a219007208f07209007" + "6a2191072090072091076a2192072091072092076a2193072092072093076a2194072093072094076a2195072094072095076a219607209507" + "2096076a2197072096072097076a2198072097072098076a2199072098072099076a219a07209907209a076a219b07209a07209b076a219c07" + "209b07209c076a219d07209c07209d076a219e07209d07209e076a219f07209e07209f076a21a007209f0720a0076a21a10720a00720a1076a" + "21a20720a10720a2076a21a30720a20720a3076a21a40720a30720a4076a21a50720a40720a5076a21a60720a50720a6076a21a70720a60720" + "a7076a21a80720a70720a8076a21a90720a80720a9076a21aa0720a90720aa076a21ab0720aa0720ab076a21ac0720ab0720ac076a21ad0720" + "ac0720ad076a21ae0720ad0720ae076a21af0720ae0720af076a21b00720af0720b0076a21b10720b00720b1076a21b20720b10720b2076a21" + "b30720b20720b3076a21b40720b30720b4076a21b50720b40720b5076a21b60720b50720b6076a21b70720b60720b7076a21b80720b70720b8" + "076a21b90720b80720b9076a21ba0720b90720ba076a21bb0720ba0720bb076a21bc0720bb0720bc076a21bd0720bc0720bd076a21be0720bd" + "0720be076a21bf0720be0720bf076a21c00720bf0720c0076a21c10720c00720c1076a21c20720c10720c2076a21c30720c20720c3076a21c4" + "0720c30720c4076a21c50720c40720c5076a21c60720c50720c6076a21c70720c60720c7076a21c80720c70720c8076a21c90720c80720c907" + "6a21ca0720c90720ca076a21cb0720ca0720cb076a21cc0720cb0720cc076a21cd0720cc0720cd076a21ce0720cd0720ce076a21cf0720ce07" + "20cf076a21d00720cf0720d0076a21d10720d00720d1076a21d20720d10720d2076a21d30720d20720d3076a21d40720d30720d4076a21d507" + "20d40720d5076a21d60720d50720d6076a21d70720d60720d7076a21d80720d70720d8076a21d90720d80720d9076a21da0720d90720da076a" + "21db0720da0720db076a21dc0720db0720dc076a21dd0720dc0720dd076a21de0720dd0720de076a21df0720de0720df076a21e00720df0720" + "e0076a21e10720e00720e1076a21e20720e10720e2076a21e30720e20720e3076a21e40720e30720e4076a21e50720e40720e5076a21e60720" + "e50720e6076a21e70720e60720e7076a21e80720e70720e8076a21e90720e80720e9076a21ea0720e90720ea076a21eb0720ea0720eb076a21" + "ec0720eb0720ec076a21ed0720ec0720ed076a21ee0720ed0720ee076a21ef0720ee0720ef076a21f00720ef0720f0076a21f10720f00720f1" + "076a21f20720f10720f2076a21f30720f20720f3076a21f40720f30720f4076a21f50720f40720f5076a21f60720f50720f6076a21f70720f6" + "0720f7076a21f80720f70720f8076a21f90720f80720f9076a21fa0720f90720fa076a21fb0720fa0720fb076a21fc0720fb0720fc076a21fd" + "0720fc0720fd076a21fe0720fd0720fe076a21ff0720fe0720ff076a21800820ff072080086a2181082080082081086a218208208108208208" + "6a2183082082082083086a2184082083082084086a2185082084082085086a2186082085082086086a2187082086082087086a218808208708" + "2088086a2189082088082089086a218a08208908208a086a218b08208a08208b086a218c08208b08208c086a218d08208c08208d086a218e08" + "208d08208e086a218f08208e08208f086a219008208f082090086a2191082090082091086a2192082091082092086a2193082092082093086a" + "2194082093082094086a2195082094082095086a2196082095082096086a2197082096082097086a2198082097082098086a21990820980820" + "99086a219a08209908209a086a219b08209a08209b086a219c08209b08209c086a219d08209c08209d086a219e08209d08209e086a219f0820" + "9e08209f086a21a008209f0820a0086a21a10820a00820a1086a21a20820a10820a2086a21a30820a20820a3086a21a40820a30820a4086a21" + "a50820a40820a5086a21a60820a50820a6086a21a70820a60820a7086a21a80820a70820a8086a21a90820a80820a9086a21aa0820a90820aa" + "086a21ab0820aa0820ab086a21ac0820ab0820ac086a21ad0820ac0820ad086a21ae0820ad0820ae086a21af0820ae0820af086a21b00820af" + "0820b0086a21b10820b00820b1086a21b20820b10820b2086a21b30820b20820b3086a21b40820b30820b4086a21b50820b40820b5086a21b6" + "0820b50820b6086a21b70820b60820b7086a21b80820b70820b8086a21b90820b80820b9086a21ba0820b90820ba086a21bb0820ba0820bb08" + "6a21bc0820bb0820bc086a21bd0820bc0820bd086a21be0820bd0820be086a21bf0820be0820bf086a21c00820bf0820c0086a21c10820c008" + "20c1086a21c20820c10820c2086a21c30820c20820c3086a21c40820c30820c4086a21c50820c40820c5086a21c60820c50820c6086a21c708" + "20c60820c7086a21c80820c70820c8086a21c90820c80820c9086a21ca0820c90820ca086a21cb0820ca0820cb086a21cc0820cb0820cc086a" + "21cd0820cc0820cd086a21ce0820cd0820ce086a21cf0820ce0820cf086a21d00820cf0820d0086a21d10820d00820d1086a21d20820d10820" + "d2086a21d30820d20820d3086a21d40820d30820d4086a21d50820d40820d5086a21d60820d50820d6086a21d70820d60820d7086a21d80820" + "d70820d8086a21d90820d80820d9086a21da0820d90820da086a21db0820da0820db086a21dc0820db0820dc086a21dd0820dc0820dd086a21" + "de0820dd0820de086a21df0820de0820df086a21e00820df0820e0086a21e10820e00820e1086a21e20820e10820e2086a21e30820e20820e3" + "086a21e40820e30820e4086a21e50820e40820e5086a21e60820e50820e6086a21e70820e60820e7086a21e80820e70820e8086a21e90820e8" + "0820e9086a21ea0820e90820ea086a21eb0820ea0820eb086a21ec0820eb0820ec086a21ed0820ec0820ed086a21ee0820ed0820ee086a21ef" + "0820ee0820ef086a21f00820ef0820f0086a21f10820f00820f1086a21f20820f10820f2086a21f30820f20820f3086a21f40820f30820f408" + "6a21f50820f40820f5086a21f60820f50820f6086a21f70820f60820f7086a21f80820f70820f8086a21f90820f80820f9086a21fa0820f908" + "20fa086a21fb0820fa0820fb086a21fc0820fb0820fc086a21fd0820fc0820fd086a21fe0820fd0820fe086a21ff0820fe0820ff086a218009" + "20ff082080096a2181092080092081096a2182092081092082096a2183092082092083096a2184092083092084096a2185092084092085096a" + "2186092085092086096a2187092086092087096a2188092087092088096a2189092088092089096a218a09208909208a096a218b09208a0920" + "8b096a218c09208b09208c096a218d09208c09208d096a218e09208d09208e096a218f09208e09208f096a219009208f092090096a21910920" + "90092091096a2192092091092092096a2193092092092093096a2194092093092094096a2195092094092095096a2196092095092096096a21" + "97092096092097096a2198092097092098096a2199092098092099096a219a09209909209a096a219b09209a09209b096a219c09209b09209c" + "096a219d09209c09209d096a219e09209d09209e096a219f09209e09209f096a21a009209f0920a0096a21a10920a00920a1096a21a20920a1" + "0920a2096a21a30920a20920a3096a21a40920a30920a4096a21a50920a40920a5096a21a60920a50920a6096a21a70920a60920a7096a21a8" + "0920a70920a8096a21a90920a80920a9096a21aa0920a90920aa096a21ab0920aa0920ab096a21ac0920ab0920ac096a21ad0920ac0920ad09" + "6a21ae0920ad0920ae096a21af0920ae0920af096a21b00920af0920b0096a21b10920b00920b1096a21b20920b10920b2096a21b30920b209" + "20b3096a21b40920b30920b4096a21b50920b40920b5096a21b60920b50920b6096a21b70920b60920b7096a21b80920b70920b8096a21b909" + "20b80920b9096a21ba0920b90920ba096a21bb0920ba0920bb096a21bc0920bb0920bc096a21bd0920bc0920bd096a21be0920bd0920be096a" + "21bf0920be0920bf096a21c00920bf0920c0096a21c10920c00920c1096a21c20920c10920c2096a21c30920c20920c3096a21c40920c30920" + "c4096a21c50920c40920c5096a21c60920c50920c6096a21c70920c60920c7096a21c80920c70920c8096a21c90920c80920c9096a21ca0920" + "c90920ca096a21cb0920ca0920cb096a21cc0920cb0920cc096a21cd0920cc0920cd096a21ce0920cd0920ce096a21cf0920ce0920cf096a21" + "d00920cf0920d0096a21d10920d00920d1096a21d20920d10920d2096a21d30920d20920d3096a21d40920d30920d4096a21d50920d40920d5" + "096a21d60920d50920d6096a21d70920d60920d7096a21d80920d70920d8096a21d90920d80920d9096a21da0920d90920da096a21db0920da" + "0920db096a21dc0920db0920dc096a21dd0920dc0920dd096a21de0920dd0920de096a21df0920de0920df096a21e00920df0920e0096a21e1" + "0920e00920e1096a21e20920e10920e2096a21e30920e20920e3096a21e40920e30920e4096a21e50920e40920e5096a21e60920e50920e609" + "6a21e70920e60920e7096a21e80920e70920e8096a21e90920e80920e9096a21ea0920e90920ea096a21eb0920ea0920eb096a21ec0920eb09" + "20ec096a21ed0920ec0920ed096a21ee0920ed0920ee096a21ef0920ee0920ef096a21f00920ef0920f0096a21f10920f00920f1096a21f209" + "20f10920f2096a21f30920f20920f3096a21f40920f30920f4096a21f50920f40920f5096a21f60920f50920f6096a21f70920f60920f7096a" + "21f80920f70920f8096a21f90920f80920f9096a21fa0920f90920fa096a21fb0920fa0920fb096a21fc0920fb0920fc096a21fd0920fc0920" + "fd096a21fe0920fd0920fe096a21ff0920fe0920ff096a21800a20ff0920800a6a21810a20800a20810a6a21820a20810a20820a6a21830a20" + "820a20830a6a21840a20830a20840a6a21850a20840a20850a6a21860a20850a20860a6a21870a20860a20870a6a21880a20870a20880a6a21" + "890a20880a20890a6a218a0a20890a208a0a6a218b0a208a0a208b0a6a218c0a208b0a208c0a6a218d0a208c0a208d0a6a218e0a208d0a208e" + "0a6a218f0a208e0a208f0a6a21900a208f0a20900a6a21910a20900a20910a6a21920a20910a20920a6a21930a20920a20930a6a21940a2093" + "0a20940a6a21950a20940a20950a6a21960a20950a20960a6a21970a20960a20970a6a21980a20970a20980a6a21990a20980a20990a6a219a" + "0a20990a209a0a6a219b0a209a0a209b0a6a219c0a209b0a209c0a6a219d0a209c0a209d0a6a219e0a209d0a209e0a6a219f0a209e0a209f0a" + "6a21a00a209f0a20a00a6a21a10a20a00a20a10a6a21a20a20a10a20a20a6a21a30a20a20a20a30a6a21a40a20a30a20a40a6a21a50a20a40a" + "20a50a6a21a60a20a50a20a60a6a21a70a20a60a20a70a6a21a80a20a70a20a80a6a21a90a20a80a20a90a6a21aa0a20a90a20aa0a6a21ab0a" + "20aa0a20ab0a6a21ac0a20ab0a20ac0a6a21ad0a20ac0a20ad0a6a21ae0a20ad0a20ae0a6a21af0a20ae0a20af0a6a21b00a20af0a20b00a6a" + "21b10a20b00a20b10a6a21b20a20b10a20b20a6a21b30a20b20a20b30a6a21b40a20b30a20b40a6a21b50a20b40a20b50a6a21b60a20b50a20" + "b60a6a21b70a20b60a20b70a6a21b80a20b70a20b80a6a21b90a20b80a20b90a6a21ba0a20b90a20ba0a6a21bb0a20ba0a20bb0a6a21bc0a20" + "bb0a20bc0a6a21bd0a20bc0a20bd0a6a21be0a20bd0a20be0a6a21bf0a20be0a20bf0a6a21c00a20bf0a20c00a6a21c10a20c00a20c10a6a21" + "c20a20c10a20c20a6a21c30a20c20a20c30a6a21c40a20c30a20c40a6a21c50a20c40a20c50a6a21c60a20c50a20c60a6a21c70a20c60a20c7" + "0a6a21c80a20c70a20c80a6a21c90a20c80a20c90a6a21ca0a20c90a20ca0a6a21cb0a20ca0a20cb0a6a21cc0a20cb0a20cc0a6a21cd0a20cc" + "0a20cd0a6a21ce0a20cd0a20ce0a6a21cf0a20ce0a20cf0a6a21d00a20cf0a20d00a6a21d10a20d00a20d10a6a21d20a20d10a20d20a6a21d3" + "0a20d20a20d30a6a21d40a20d30a20d40a6a21d50a20d40a20d50a6a21d60a20d50a20d60a6a21d70a20d60a20d70a6a21d80a20d70a20d80a" + "6a21d90a20d80a20d90a6a21da0a20d90a20da0a6a21db0a20da0a20db0a6a21dc0a20db0a20dc0a6a21dd0a20dc0a20dd0a6a21de0a20dd0a" + "20de0a6a21df0a20de0a20df0a6a21e00a20df0a20e00a6a21e10a20e00a20e10a6a21e20a20e10a20e20a6a21e30a20e20a20e30a6a21e40a" + "20e30a20e40a6a21e50a20e40a20e50a6a21e60a20e50a20e60a6a21e70a20e60a20e70a6a21e80a20e70a20e80a6a21e90a20e80a20e90a6a" + "21ea0a20e90a20ea0a6a21eb0a20ea0a20eb0a6a21ec0a20eb0a20ec0a6a21ed0a20ec0a20ed0a6a21ee0a20ed0a20ee0a6a21ef0a20ee0a20" + "ef0a6a21f00a20ef0a20f00a6a21f10a20f00a20f10a6a21f20a20f10a20f20a6a21f30a20f20a20f30a6a21f40a20f30a20f40a6a21f50a20" + "f40a20f50a6a21f60a20f50a20f60a6a21f70a20f60a20f70a6a21f80a20f70a20f80a6a21f90a20f80a20f90a6a21fa0a20f90a20fa0a6a21" + "fb0a20fa0a20fb0a6a21fc0a20fb0a20fc0a6a21fd0a20fc0a20fd0a6a21fe0a20fd0a20fe0a6a21ff0a20fe0a20ff0a6a21800b20ff0a2080" + "0b6a21810b20800b20810b6a21820b20810b20820b6a21830b20820b20830b6a21840b20830b20840b6a21850b20840b20850b6a21860b2085" + "0b20860b6a21870b20860b20870b6a21880b20870b20880b6a21890b20880b20890b6a218a0b20890b208a0b6a218b0b208a0b208b0b6a218c" + "0b208b0b208c0b6a218d0b208c0b208d0b6a218e0b208d0b208e0b6a218f0b208e0b208f0b6a21900b208f0b20900b6a21910b20900b20910b" + "6a21920b20910b20920b6a21930b20920b20930b6a21940b20930b20940b6a21950b20940b20950b6a21960b20950b20960b6a21970b20960b" + "20970b6a21980b20970b20980b6a21990b20980b20990b6a219a0b20990b209a0b6a219b0b209a0b209b0b6a219c0b209b0b209c0b6a219d0b" + "209c0b209d0b6a219e0b209d0b209e0b6a219f0b209e0b209f0b6a21a00b209f0b20a00b6a21a10b20a00b20a10b6a21a20b20a10b20a20b6a" + "21a30b20a20b20a30b6a21a40b20a30b20a40b6a21a50b20a40b20a50b6a21a60b20a50b20a60b6a21a70b20a60b20a70b6a21a80b20a70b20" + "a80b6a21a90b20a80b20a90b6a21aa0b20a90b20aa0b6a21ab0b20aa0b20ab0b6a21ac0b20ab0b20ac0b6a21ad0b20ac0b20ad0b6a21ae0b20" + "ad0b20ae0b6a21af0b20ae0b20af0b6a21b00b20af0b20b00b6a21b10b20b00b20b10b6a21b20b20b10b20b20b6a21b30b20b20b20b30b6a21" + "b40b20b30b20b40b6a21b50b20b40b20b50b6a21b60b20b50b20b60b6a21b70b20b60b20b70b6a21b80b20b70b20b80b6a21b90b20b80b20b9" + "0b6a21ba0b20b90b20ba0b6a21bb0b20ba0b20bb0b6a21bc0b20bb0b20bc0b6a21bd0b20bc0b20bd0b6a21be0b20bd0b20be0b6a21bf0b20be" + "0b20bf0b6a21c00b20bf0b20c00b6a21c10b20c00b20c10b6a21c20b20c10b20c20b6a21c30b20c20b20c30b6a21c40b20c30b20c40b6a21c5" + "0b20c40b20c50b6a21c60b20c50b20c60b6a21c70b20c60b20c70b6a21c80b20c70b20c80b6a21c90b20c80b20c90b6a21ca0b20c90b20ca0b" + "6a21cb0b20ca0b20cb0b6a21cc0b20cb0b20cc0b6a21cd0b20cc0b20cd0b6a21ce0b20cd0b20ce0b6a21cf0b20ce0b20cf0b6a21d00b20cf0b" + "20d00b6a21d10b20d00b20d10b6a21d20b20d10b20d20b6a21d30b20d20b20d30b6a21d40b20d30b20d40b6a21d50b20d40b20d50b6a21d60b" + "20d50b20d60b6a21d70b20d60b20d70b6a21d80b20d70b20d80b6a21d90b20d80b20d90b6a21da0b20d90b20da0b6a21db0b20da0b20db0b6a" + "21dc0b20db0b20dc0b6a21dd0b20dc0b20dd0b6a21de0b20dd0b20de0b6a21df0b20de0b20df0b6a21e00b20df0b20e00b6a21e10b20e00b20" + "e10b6a21e20b20e10b20e20b6a21e30b20e20b20e30b6a21e40b20e30b20e40b6a21e50b20e40b20e50b6a21e60b20e50b20e60b6a21e70b20" + "e60b20e70b6a21e80b20e70b20e80b6a21e90b20e80b20e90b6a21ea0b20e90b20ea0b6a21eb0b20ea0b20eb0b6a21ec0b20eb0b20ec0b6a21" + "ed0b20ec0b20ed0b6a21ee0b20ed0b20ee0b6a21ef0b20ee0b20ef0b6a21f00b20ef0b20f00b6a21f10b20f00b20f10b6a21f20b20f10b20f2" + "0b6a21f30b20f20b20f30b6a21f40b20f30b20f40b6a21f50b20f40b20f50b6a21f60b20f50b20f60b6a21f70b20f60b20f70b6a21f80b20f7" + "0b20f80b6a21f90b20f80b20f90b6a21fa0b20f90b20fa0b6a21fb0b20fa0b20fb0b6a21fc0b20fb0b20fc0b6a21fd0b20fc0b20fd0b6a21fe" + "0b20fd0b20fe0b6a21ff0b20fe0b20ff0b6a21800c20ff0b20800c6a21810c20800c20810c6a21820c20810c20820c6a21830c20820c20830c" + "6a21840c20830c20840c6a21850c20840c20850c6a21860c20850c20860c6a21870c20860c20870c6a21880c20870c20880c6a21890c20880c" + "20890c6a218a0c20890c208a0c6a218b0c208a0c208b0c6a218c0c208b0c208c0c6a218d0c208c0c208d0c6a218e0c208d0c208e0c6a218f0c" + "208e0c208f0c6a21900c208f0c20900c6a21910c20900c20910c6a21920c20910c20920c6a21930c20920c20930c6a21940c20930c20940c6a" + "21950c20940c20950c6a21960c20950c20960c6a21970c20960c20970c6a21980c20970c20980c6a21990c20980c20990c6a219a0c20990c20" + "9a0c6a219b0c209a0c209b0c6a219c0c209b0c209c0c6a219d0c209c0c209d0c6a219e0c209d0c209e0c6a219f0c209e0c209f0c6a21a00c20" + "9f0c20a00c6a21a10c20a00c20a10c6a21a20c20a10c20a20c6a21a30c20a20c20a30c6a21a40c20a30c20a40c6a21a50c20a40c20a50c6a21" + "a60c20a50c20a60c6a21a70c20a60c20a70c6a21a80c20a70c20a80c6a21a90c20a80c20a90c6a21aa0c20a90c20aa0c6a21ab0c20aa0c20ab" + "0c6a21ac0c20ab0c20ac0c6a21ad0c20ac0c20ad0c6a21ae0c20ad0c20ae0c6a21af0c20ae0c20af0c6a21b00c20af0c20b00c6a21b10c20b0" + "0c20b10c6a21b20c20b10c20b20c6a21b30c20b20c20b30c6a21b40c20b30c20b40c6a21b50c20b40c20b50c6a21b60c20b50c20b60c6a21b7" + "0c20b60c20b70c6a21b80c20b70c20b80c6a21b90c20b80c20b90c6a21ba0c20b90c20ba0c6a21bb0c20ba0c20bb0c6a21bc0c20bb0c20bc0c" + "6a21bd0c20bc0c20bd0c6a21be0c20bd0c20be0c6a21bf0c20be0c20bf0c6a21c00c20bf0c20c00c6a21c10c20c00c20c10c6a21c20c20c10c" + "20c20c6a21c30c20c20c20c30c6a21c40c20c30c20c40c6a21c50c20c40c20c50c6a21c60c20c50c20c60c6a21c70c20c60c20c70c6a21c80c" + "20c70c20c80c6a21c90c20c80c20c90c6a21ca0c20c90c20ca0c6a21cb0c20ca0c20cb0c6a21cc0c20cb0c20cc0c6a21cd0c20cc0c20cd0c6a" + "21ce0c20cd0c20ce0c6a21cf0c20ce0c20cf0c6a21d00c20cf0c20d00c6a21d10c20d00c20d10c6a21d20c20d10c20d20c6a21d30c20d20c20" + "d30c6a21d40c20d30c20d40c6a21d50c20d40c20d50c6a21d60c20d50c20d60c6a21d70c20d60c20d70c6a21d80c20d70c20d80c6a21d90c20" + "d80c20d90c6a21da0c20d90c20da0c6a21db0c20da0c20db0c6a21dc0c20db0c20dc0c6a21dd0c20dc0c20dd0c6a21de0c20dd0c20de0c6a21" + "df0c20de0c20df0c6a21e00c20df0c20e00c6a21e10c20e00c20e10c6a21e20c20e10c20e20c6a21e30c20e20c20e30c6a21e40c20e30c20e4" + "0c6a21e50c20e40c20e50c6a21e60c20e50c20e60c6a21e70c20e60c20e70c6a21e80c20e70c20e80c6a21e90c20e80c20e90c6a21ea0c20e9" + "0c20ea0c6a21eb0c20ea0c20eb0c6a21ec0c20eb0c20ec0c6a21ed0c20ec0c20ed0c6a21ee0c20ed0c20ee0c6a21ef0c20ee0c20ef0c6a21f0" + "0c20ef0c20f00c6a21f10c20f00c20f10c6a21f20c20f10c20f20c6a21f30c20f20c20f30c6a21f40c20f30c20f40c6a21f50c20f40c20f50c" + "6a21f60c20f50c20f60c6a21f70c20f60c20f70c6a21f80c20f70c20f80c6a21f90c20f80c20f90c6a21fa0c20f90c20fa0c6a21fb0c20fa0c" + "20fb0c6a21fc0c20fb0c20fc0c6a21fd0c20fc0c20fd0c6a21fe0c20fd0c20fe0c6a21ff0c20fe0c20ff0c6a21800d20ff0c20800d6a21810d" + "20800d20810d6a21820d20810d20820d6a21830d20820d20830d6a21840d20830d20840d6a21850d20840d20850d6a21860d20850d20860d6a" + "21870d20860d20870d6a21880d20870d20880d6a21890d20880d20890d6a218a0d20890d208a0d6a218b0d208a0d208b0d6a218c0d208b0d20" + "8c0d6a218d0d208c0d208d0d6a218e0d208d0d208e0d6a218f0d208e0d208f0d6a21900d208f0d20900d6a21910d20900d20910d6a21920d20" + "910d20920d6a21930d20920d20930d6a21940d20930d20940d6a21950d20940d20950d6a21960d20950d20960d6a21970d20960d20970d6a21" + "980d20970d20980d6a21990d20980d20990d6a219a0d20990d209a0d6a219b0d209a0d209b0d6a219c0d209b0d209c0d6a219d0d209c0d209d" + "0d6a219e0d209d0d209e0d6a219f0d209e0d209f0d6a21a00d209f0d20a00d6a21a10d20a00d20a10d6a21a20d20a10d20a20d6a21a30d20a2" + "0d20a30d6a21a40d20a30d20a40d6a21a50d20a40d20a50d6a21a60d20a50d20a60d6a21a70d20a60d20a70d6a21a80d20a70d20a80d6a21a9" + "0d20a80d20a90d6a21aa0d20a90d20aa0d6a21ab0d20aa0d20ab0d6a21ac0d20ab0d20ac0d6a21ad0d20ac0d20ad0d6a21ae0d20ad0d20ae0d" + "6a21af0d20ae0d20af0d6a21b00d20af0d20b00d6a21b10d20b00d20b10d6a21b20d20b10d20b20d6a21b30d20b20d20b30d6a21b40d20b30d" + "20b40d6a21b50d20b40d20b50d6a21b60d20b50d20b60d6a21b70d20b60d20b70d6a21b80d20b70d20b80d6a21b90d20b80d20b90d6a21ba0d" + "20b90d20ba0d6a21bb0d20ba0d20bb0d6a21bc0d20bb0d20bc0d6a21bd0d20bc0d20bd0d6a21be0d20bd0d20be0d6a21bf0d20be0d20bf0d6a" + "21c00d20bf0d20c00d6a21c10d20c00d20c10d6a21c20d20c10d20c20d6a21c30d20c20d20c30d6a21c40d20c30d20c40d6a21c50d20c40d20" + "c50d6a21c60d20c50d20c60d6a21c70d20c60d20c70d6a21c80d20c70d20c80d6a21c90d20c80d20c90d6a21ca0d20c90d20ca0d6a21cb0d20" + "ca0d20cb0d6a21cc0d20cb0d20cc0d6a21cd0d20cc0d20cd0d6a21ce0d20cd0d20ce0d6a21cf0d20ce0d20cf0d6a21d00d20cf0d20d00d6a21" + "d10d20d00d20d10d6a21d20d20d10d20d20d6a21d30d20d20d20d30d6a21d40d20d30d20d40d6a21d50d20d40d20d50d6a21d60d20d50d20d6" + "0d6a21d70d20d60d20d70d6a21d80d20d70d20d80d6a21d90d20d80d20d90d6a21da0d20d90d20da0d6a21db0d20da0d20db0d6a21dc0d20db" + "0d20dc0d6a21dd0d20dc0d20dd0d6a21de0d20dd0d20de0d6a21df0d20de0d20df0d6a21e00d20df0d20e00d6a21e10d20e00d20e10d6a21e2" + "0d20e10d20e20d6a21e30d20e20d20e30d6a21e40d20e30d20e40d6a21e50d20e40d20e50d6a21e60d20e50d20e60d6a21e70d20e60d20e70d" + "6a21e80d20e70d20e80d6a21e90d20e80d20e90d6a21ea0d20e90d20ea0d6a21eb0d20ea0d20eb0d6a21ec0d20eb0d20ec0d6a21ed0d20ec0d" + "20ed0d6a21ee0d20ed0d20ee0d6a21ef0d20ee0d20ef0d6a21f00d20ef0d20f00d6a21f10d20f00d20f10d6a21f20d20f10d20f20d6a21f30d" + "20f20d20f30d6a21f40d20f30d20f40d6a21f50d20f40d20f50d6a21f60d20f50d20f60d6a21f70d20f60d20f70d6a21f80d20f70d20f80d6a" + "21f90d20f80d20f90d6a21fa0d20f90d20fa0d6a21fb0d20fa0d20fb0d6a21fc0d20fb0d20fc0d6a21fd0d20fc0d20fd0d6a21fe0d20fd0d20" + "fe0d6a21ff0d20fe0d20ff0d6a21800e20ff0d20800e6a21810e20800e20810e6a21820e20810e20820e6a21830e20820e20830e6a21840e20" + "830e20840e6a21850e20840e20850e6a21860e20850e20860e6a21870e20860e20870e6a21880e20870e20880e6a21890e20880e20890e6a21" + "8a0e20890e208a0e6a218b0e208a0e208b0e6a218c0e208b0e208c0e6a218d0e208c0e208d0e6a218e0e208d0e208e0e6a218f0e208e0e208f" + "0e6a21900e208f0e20900e6a21910e20900e20910e6a21920e20910e20920e6a21930e20920e20930e6a21940e20930e20940e6a21950e2094" + "0e20950e6a21960e20950e20960e6a21970e20960e20970e6a21980e20970e20980e6a21990e20980e20990e6a219a0e20990e209a0e6a219b" + "0e209a0e209b0e6a219c0e209b0e209c0e6a219d0e209c0e209d0e6a219e0e209d0e209e0e6a219f0e209e0e209f0e6a21a00e209f0e20a00e" + "6a21a10e20a00e20a10e6a21a20e20a10e20a20e6a21a30e20a20e20a30e6a21a40e20a30e20a40e6a21a50e20a40e20a50e6a21a60e20a50e" + "20a60e6a21a70e20a60e20a70e6a21a80e20a70e20a80e6a21a90e20a80e20a90e6a21aa0e20a90e20aa0e6a21ab0e20aa0e20ab0e6a21ac0e" + "20ab0e20ac0e6a21ad0e20ac0e20ad0e6a21ae0e20ad0e20ae0e6a21af0e20ae0e20af0e6a21b00e20af0e20b00e6a21b10e20b00e20b10e6a" + "21b20e20b10e20b20e6a21b30e20b20e20b30e6a21b40e20b30e20b40e6a21b50e20b40e20b50e6a21b60e20b50e20b60e6a21b70e20b60e20" + "b70e6a21b80e20b70e20b80e6a21b90e20b80e20b90e6a21ba0e20b90e20ba0e6a21bb0e20ba0e20bb0e6a21bc0e20bb0e20bc0e6a21bd0e20" + "bc0e20bd0e6a21be0e20bd0e20be0e6a21bf0e20be0e20bf0e6a21c00e20bf0e20c00e6a21c10e20c00e20c10e6a21c20e20c10e20c20e6a21" + "c30e20c20e20c30e6a21c40e20c30e20c40e6a21c50e20c40e20c50e6a21c60e20c50e20c60e6a21c70e20c60e20c70e6a21c80e20c70e20c8" + "0e6a21c90e20c80e20c90e6a21ca0e20c90e20ca0e6a21cb0e20ca0e20cb0e6a21cc0e20cb0e20cc0e6a21cd0e20cc0e20cd0e6a21ce0e20cd" + "0e20ce0e6a21cf0e20ce0e20cf0e6a21d00e20cf0e20d00e6a21d10e20d00e20d10e6a21d20e20d10e20d20e6a21d30e20d20e20d30e6a21d4" + "0e20d30e20d40e6a21d50e20d40e20d50e6a21d60e20d50e20d60e6a21d70e20d60e20d70e6a21d80e20d70e20d80e6a21d90e20d80e20d90e" + "6a21da0e20d90e20da0e6a21db0e20da0e20db0e6a21dc0e20db0e20dc0e6a21dd0e20dc0e20dd0e6a21de0e20dd0e20de0e6a21df0e20de0e" + "20df0e6a21e00e20df0e20e00e6a21e10e20e00e20e10e6a21e20e20e10e20e20e6a21e30e20e20e20e30e6a21e40e20e30e20e40e6a21e50e" + "20e40e20e50e6a21e60e20e50e20e60e6a21e70e20e60e20e70e6a21e80e20e70e20e80e6a21e90e20e80e20e90e6a21ea0e20e90e20ea0e6a" + "21eb0e20ea0e20eb0e6a21ec0e20eb0e20ec0e6a21ed0e20ec0e20ed0e6a21ee0e20ed0e20ee0e6a21ef0e20ee0e20ef0e6a21f00e20ef0e20" + "f00e6a21f10e20f00e20f10e6a21f20e20f10e20f20e6a21f30e20f20e20f30e6a21f40e20f30e20f40e6a21f50e20f40e20f50e6a21f60e20" + "f50e20f60e6a21f70e20f60e20f70e6a21f80e20f70e20f80e6a21f90e20f80e20f90e6a21fa0e20f90e20fa0e6a21fb0e20fa0e20fb0e6a21" + "fc0e20fb0e20fc0e6a21fd0e20fc0e20fd0e6a21fe0e20fd0e20fe0e6a21ff0e20fe0e20ff0e6a21800f20ff0e20800f6a21810f20800f2081" + "0f6a21820f20810f20820f6a21830f20820f20830f6a21840f20830f20840f6a21850f20840f20850f6a21860f20850f20860f6a21870f2086" + "0f20870f6a21880f20870f20880f6a21890f20880f20890f6a218a0f20890f208a0f6a218b0f208a0f208b0f6a218c0f208b0f208c0f6a218d" + "0f208c0f208d0f6a218e0f208d0f208e0f6a218f0f208e0f208f0f6a21900f208f0f20900f6a21910f20900f20910f6a21920f20910f20920f" + "6a21930f20920f20930f6a21940f20930f20940f6a21950f20940f20950f6a21960f20950f20960f6a21970f20960f20970f6a21980f20970f" + "20980f6a21990f20980f20990f6a219a0f20990f209a0f6a219b0f209a0f209b0f6a219c0f209b0f209c0f6a219d0f209c0f209d0f6a219e0f" + "209d0f209e0f6a219f0f209e0f209f0f6a21a00f209f0f20a00f6a21a10f20a00f20a10f6a21a20f20a10f20a20f6a21a30f20a20f20a30f6a" + "21a40f20a30f20a40f6a21a50f20a40f20a50f6a21a60f20a50f20a60f6a21a70f20a60f20a70f6a21a80f20a70f20a80f6a21a90f20a80f20" + "a90f6a21aa0f20a90f20aa0f6a21ab0f20aa0f20ab0f6a21ac0f20ab0f20ac0f6a21ad0f20ac0f20ad0f6a21ae0f20ad0f20ae0f6a21af0f20" + "ae0f20af0f6a21b00f20af0f20b00f6a21b10f20b00f20b10f6a21b20f20b10f20b20f6a21b30f20b20f20b30f6a21b40f20b30f20b40f6a21" + "b50f20b40f20b50f6a21b60f20b50f20b60f6a21b70f20b60f20b70f6a21b80f20b70f20b80f6a21b90f20b80f20b90f6a21ba0f20b90f20ba" + "0f6a21bb0f20ba0f20bb0f6a21bc0f20bb0f20bc0f6a21bd0f20bc0f20bd0f6a21be0f20bd0f20be0f6a21bf0f20be0f20bf0f6a21c00f20bf" + "0f20c00f6a21c10f20c00f20c10f6a21c20f20c10f20c20f6a21c30f20c20f20c30f6a21c40f20c30f20c40f6a21c50f20c40f20c50f6a21c6" + "0f20c50f20c60f6a21c70f20c60f20c70f6a21c80f20c70f20c80f6a21c90f20c80f20c90f6a21ca0f20c90f20ca0f6a21cb0f20ca0f20cb0f" + "6a21cc0f20cb0f20cc0f6a21cd0f20cc0f20cd0f6a21ce0f20cd0f20ce0f6a21cf0f20ce0f20cf0f6a21d00f20cf0f20d00f6a21d10f20d00f" + "20d10f6a21d20f20d10f20d20f6a21d30f20d20f20d30f6a21d40f20d30f20d40f6a21d50f20d40f20d50f6a21d60f20d50f20d60f6a21d70f" + "20d60f20d70f6a21d80f20d70f20d80f6a21d90f20d80f20d90f6a21da0f20d90f20da0f6a21db0f20da0f20db0f6a21dc0f20db0f20dc0f6a" + "21dd0f20dc0f20dd0f6a21de0f20dd0f20de0f6a21df0f20de0f20df0f6a21e00f20df0f20e00f6a21e10f20e00f20e10f6a21e20f20e10f20" + "e20f6a21e30f20e20f20e30f6a21e40f20e30f20e40f6a21e50f20e40f20e50f6a21e60f20e50f20e60f6a21e70f20e60f20e70f6a21e80f20" + "e70f20e80f6a21e90f20e80f20e90f6a21ea0f20e90f20ea0f6a21eb0f20ea0f20eb0f6a21ec0f20eb0f20ec0f6a21ed0f20ec0f20ed0f6a21" + "ee0f20ed0f20ee0f6a21ef0f20ee0f20ef0f6a21f00f20ef0f20f00f6a21f10f20f00f20f10f6a21f20f20f10f20f20f6a21f30f20f20f20f3" + "0f6a21f40f20f30f20f40f6a21f50f20f40f20f50f6a21f60f20f50f20f60f6a21f70f20f60f20f70f6a21f80f20f70f20f80f6a21f90f20f8" + "0f20f90f6a21fa0f20f90f20fa0f6a21fb0f20fa0f20fb0f6a21fc0f20fb0f20fc0f6a21fd0f20fc0f20fd0f6a21fe0f20fd0f20fe0f6a21ff" + "0f20fe0f20ff0f6a21801020ff0f2080106a2181102080102081106a2182102081102082106a2183102082102083106a218410208310208410" + "6a2185102084102085106a2186102085102086106a2187102086102087106a2188102087102088106a2189102088102089106a218a10208910" + "208a106a218b10208a10208b106a218c10208b10208c106a218d10208c10208d106a218e10208d10208e106a218f10208e10208f106a219010" + "208f102090106a2191102090102091106a2192102091102092106a2193102092102093106a2194102093102094106a2195102094102095106a" + "2196102095102096106a2197102096102097106a2198102097102098106a2199102098102099106a219a10209910209a106a219b10209a1020" + "9b106a219c10209b10209c106a219d10209c10209d106a219e10209d10209e106a219f10209e10209f106a21a010209f1020a0106a21a11020" + "a01020a1106a21a21020a11020a2106a21a31020a21020a3106a21a41020a31020a4106a21a51020a41020a5106a21a61020a51020a6106a21" + "a71020a61020a7106a21a81020a71020a8106a21a91020a81020a9106a21aa1020a91020aa106a21ab1020aa1020ab106a21ac1020ab1020ac" + "106a21ad1020ac1020ad106a21ae1020ad1020ae106a21af1020ae1020af106a21b01020af1020b0106a21b11020b01020b1106a21b21020b1" + "1020b2106a21b31020b21020b3106a21b41020b31020b4106a21b51020b41020b5106a21b61020b51020b6106a21b71020b61020b7106a21b8" + "1020b71020b8106a21b91020b81020b9106a21ba1020b91020ba106a21bb1020ba1020bb106a21bc1020bb1020bc106a21bd1020bc1020bd10" + "6a21be1020bd1020be106a21bf1020be1020bf106a21c01020bf1020c0106a21c11020c01020c1106a21c21020c11020c2106a21c31020c210" + "20c3106a21c41020c31020c4106a21c51020c41020c5106a21c61020c51020c6106a21c71020c61020c7106a21c81020c71020c8106a21c910" + "20c81020c9106a21ca1020c91020ca106a21cb1020ca1020cb106a21cc1020cb1020cc106a21cd1020cc1020cd106a21ce1020cd1020ce106a" + "21cf1020ce1020cf106a21d01020cf1020d0106a21d11020d01020d1106a21d21020d11020d2106a21d31020d21020d3106a21d41020d31020" + "d4106a21d51020d41020d5106a21d61020d51020d6106a21d71020d61020d7106a21d81020d71020d8106a21d91020d81020d9106a21da1020" + "d91020da106a21db1020da1020db106a21dc1020db1020dc106a21dd1020dc1020dd106a21de1020dd1020de106a21df1020de1020df106a21" + "e01020df1020e0106a21e11020e01020e1106a21e21020e11020e2106a21e31020e21020e3106a21e41020e31020e4106a21e51020e41020e5" + "106a21e61020e51020e6106a21e71020e61020e7106a21e81020e71020e8106a21e91020e81020e9106a21ea1020e91020ea106a21eb1020ea" + "1020eb106a21ec1020eb1020ec106a21ed1020ec1020ed106a21ee1020ed1020ee106a21ef1020ee1020ef106a21f01020ef1020f0106a21f1" + "1020f01020f1106a21f21020f11020f2106a21f31020f21020f3106a21f41020f31020f4106a21f51020f41020f5106a21f61020f51020f610" + "6a21f71020f61020f7106a21f81020f71020f8106a21f91020f81020f9106a21fa1020f91020fa106a21fb1020fa1020fb106a21fc1020fb10" + "20fc106a21fd1020fc1020fd106a21fe1020fd1020fe106a21ff1020fe1020ff106a21801120ff102080116a2181112080112081116a218211" + "2081112082116a2183112082112083116a2184112083112084116a2185112084112085116a2186112085112086116a2187112086112087116a" + "2188112087112088116a2189112088112089116a218a11208911208a116a218b11208a11208b116a218c11208b11208c116a218d11208c1120" + "8d116a218e11208d11208e116a218f11208e11208f116a219011208f112090116a2191112090112091116a2192112091112092116a21931120" + "92112093116a2194112093112094116a2195112094112095116a2196112095112096116a2197112096112097116a2198112097112098116a21" + "99112098112099116a219a11209911209a116a219b11209a11209b116a219c11209b11209c116a219d11209c11209d116a219e11209d11209e" + "116a219f11209e11209f116a21a011209f1120a0116a21a11120a01120a1116a21a21120a11120a2116a21a31120a21120a3116a21a41120a3" + "1120a4116a21a51120a41120a5116a21a61120a51120a6116a21a71120a61120a7116a21a81120a71120a8116a21a91120a81120a9116a21aa" + "1120a91120aa116a21ab1120aa1120ab116a21ac1120ab1120ac116a21ad1120ac1120ad116a21ae1120ad1120ae116a21af1120ae1120af11" + "6a21b01120af1120b0116a21b11120b01120b1116a21b21120b11120b2116a21b31120b21120b3116a21b41120b31120b4116a21b51120b411" + "20b5116a21b61120b51120b6116a21b71120b61120b7116a21b81120b71120b8116a21b91120b81120b9116a21ba1120b91120ba116a21bb11" + "20ba1120bb116a21bc1120bb1120bc116a21bd1120bc1120bd116a21be1120bd1120be116a21bf1120be1120bf116a21c01120bf1120c0116a" + "21c11120c01120c1116a21c21120c11120c2116a21c31120c21120c3116a21c41120c31120c4116a21c51120c41120c5116a21c61120c51120" + "c6116a21c71120c61120c7116a21c81120c71120c8116a21c91120c81120c9116a21ca1120c91120ca116a21cb1120ca1120cb116a21cc1120" + "cb1120cc116a21cd1120cc1120cd116a21ce1120cd1120ce116a21cf1120ce1120cf116a21d01120cf1120d0116a21d11120d01120d1116a21" + "d21120d11120d2116a21d31120d21120d3116a21d41120d31120d4116a21d51120d41120d5116a21d61120d51120d6116a21d71120d61120d7" + "116a21d81120d71120d8116a21d91120d81120d9116a21da1120d91120da116a21db1120da1120db116a21dc1120db1120dc116a21dd1120dc" + "1120dd116a21de1120dd1120de116a21df1120de1120df116a21e01120df1120e0116a21e11120e01120e1116a21e21120e11120e2116a21e3" + "1120e21120e3116a21e41120e31120e4116a21e51120e41120e5116a21e61120e51120e6116a21e71120e61120e7116a21e81120e71120e811" + "6a21e91120e81120e9116a21ea1120e91120ea116a21eb1120ea1120eb116a21ec1120eb1120ec116a21ed1120ec1120ed116a21ee1120ed11" + "20ee116a21ef1120ee1120ef116a21f01120ef1120f0116a21f11120f01120f1116a21f21120f11120f2116a21f31120f21120f3116a21f411" + "20f31120f4116a21f51120f41120f5116a21f61120f51120f6116a21f71120f61120f7116a21f81120f71120f8116a21f91120f81120f9116a" + "21fa1120f91120fa116a21fb1120fa1120fb116a21fc1120fb1120fc116a21fd1120fc1120fd116a21fe1120fd1120fe116a21ff1120fe1120" + "ff116a21801220ff112080126a2181122080122081126a2182122081122082126a2183122082122083126a2184122083122084126a21851220" + "84122085126a2186122085122086126a2187122086122087126a2188122087122088126a2189122088122089126a218a12208912208a126a21" + "8b12208a12208b126a218c12208b12208c126a218d12208c12208d126a218e12208d12208e126a218f12208e12208f126a219012208f122090" + "126a2191122090122091126a2192122091122092126a2193122092122093126a2194122093122094126a2195122094122095126a2196122095" + "122096126a2197122096122097126a2198122097122098126a2199122098122099126a219a12209912209a126a219b12209a12209b126a219c" + "12209b12209c126a219d12209c12209d126a219e12209d12209e126a219f12209e12209f126a21a012209f1220a0126a21a11220a01220a112" + "6a21a21220a11220a2126a21a31220a21220a3126a21a41220a31220a4126a21a51220a41220a5126a21a61220a51220a6126a21a71220a612" + "20a7126a21a81220a71220a8126a21a91220a81220a9126a21aa1220a91220aa126a21ab1220aa1220ab126a21ac1220ab1220ac126a21ad12" + "20ac1220ad126a21ae1220ad1220ae126a21af1220ae1220af126a21b01220af1220b0126a21b11220b01220b1126a21b21220b11220b2126a" + "21b31220b21220b3126a21b41220b31220b4126a21b51220b41220b5126a21b61220b51220b6126a21b71220b61220b7126a21b81220b71220" + "b8126a21b91220b81220b9126a21ba1220b91220ba126a21bb1220ba1220bb126a21bc1220bb1220bc126a21bd1220bc1220bd126a21be1220" + "bd1220be126a21bf1220be1220bf126a21c01220bf1220c0126a21c11220c01220c1126a21c21220c11220c2126a21c31220c21220c3126a21" + "c41220c31220c4126a21c51220c41220c5126a21c61220c51220c6126a21c71220c61220c7126a21c81220c71220c8126a21c91220c81220c9" + "126a21ca1220c91220ca126a21cb1220ca1220cb126a21cc1220cb1220cc126a21cd1220cc1220cd126a21ce1220cd1220ce126a21cf1220ce" + "1220cf126a21d01220cf1220d0126a21d11220d01220d1126a21d21220d11220d2126a21d31220d21220d3126a21d41220d31220d4126a21d5" + "1220d41220d5126a21d61220d51220d6126a21d71220d61220d7126a21d81220d71220d8126a21d91220d81220d9126a21da1220d91220da12" + "6a21db1220da1220db126a21dc1220db1220dc126a21dd1220dc1220dd126a21de1220dd1220de126a21df1220de1220df126a21e01220df12" + "20e0126a21e11220e01220e1126a21e21220e11220e2126a21e31220e21220e3126a21e41220e31220e4126a21e51220e41220e5126a21e612" + "20e51220e6126a21e71220e61220e7126a21e81220e71220e8126a21e91220e81220e9126a21ea1220e91220ea126a21eb1220ea1220eb126a" + "21ec1220eb1220ec126a21ed1220ec1220ed126a21ee1220ed1220ee126a21ef1220ee1220ef126a21f01220ef1220f0126a21f11220f01220" + "f1126a21f21220f11220f2126a21f31220f21220f3126a21f41220f31220f4126a21f51220f41220f5126a21f61220f51220f6126a21f71220" + "f61220f7126a21f81220f71220f8126a21f91220f81220f9126a21fa1220f91220fa126a21fb1220fa1220fb126a21fc1220fb1220fc126a21" + "fd1220fc1220fd126a21fe1220fd1220fe126a21ff1220fe1220ff126a21801320ff122080136a2181132080132081136a2182132081132082" + "136a2183132082132083136a2184132083132084136a2185132084132085136a2186132085132086136a2187132086132087136a2188132087" + "132088136a2189132088132089136a218a13208913208a136a218b13208a13208b136a218c13208b13208c136a218d13208c13208d136a218e" + "13208d13208e136a218f13208e13208f136a219013208f132090136a2191132090132091136a2192132091132092136a219313209213209313" + "6a2194132093132094136a2195132094132095136a2196132095132096136a2197132096132097136a2198132097132098136a219913209813" + "2099136a219a13209913209a136a219b13209a13209b136a219c13209b13209c136a219d13209c13209d136a219e13209d13209e136a219f13" + "209e13209f136a21a013209f1320a0136a21a11320a01320a1136a21a21320a11320a2136a21a31320a21320a3136a21a41320a31320a4136a" + "21a51320a41320a5136a21a61320a51320a6136a21a71320a61320a7136a21a81320a71320a8136a21a91320a81320a9136a21aa1320a91320" + "aa136a21ab1320aa1320ab136a21ac1320ab1320ac136a21ad1320ac1320ad136a21ae1320ad1320ae136a21af1320ae1320af136a21b01320" + "af1320b0136a21b11320b01320b1136a21b21320b11320b2136a21b31320b21320b3136a21b41320b31320b4136a21b51320b41320b5136a21" + "b61320b51320b6136a21b71320b61320b7136a21b81320b71320b8136a21b91320b81320b9136a21ba1320b91320ba136a21bb1320ba1320bb" + "136a21bc1320bb1320bc136a21bd1320bc1320bd136a21be1320bd1320be136a21bf1320be1320bf136a21c01320bf1320c0136a21c11320c0" + "1320c1136a21c21320c11320c2136a21c31320c21320c3136a21c41320c31320c4136a21c51320c41320c5136a21c61320c51320c6136a21c7" + "1320c61320c7136a21c81320c71320c8136a21c91320c81320c9136a21ca1320c91320ca136a21cb1320ca1320cb136a21cc1320cb1320cc13" + "6a21cd1320cc1320cd136a21ce1320cd1320ce136a21cf1320ce1320cf136a21d01320cf1320d0136a21d11320d01320d1136a21d21320d113" + "20d2136a21d31320d21320d3136a21d41320d31320d4136a21d51320d41320d5136a21d61320d51320d6136a21d71320d61320d7136a21d813" + "20d71320d8136a21d91320d81320d9136a21da1320d91320da136a21db1320da1320db136a21dc1320db1320dc136a21dd1320dc1320dd136a" + "21de1320dd1320de136a21df1320de1320df136a21e01320df1320e0136a21e11320e01320e1136a21e21320e11320e2136a21e31320e21320" + "e3136a21e41320e31320e4136a21e51320e41320e5136a21e61320e51320e6136a21e71320e61320e7136a21e81320e71320e8136a21e91320" + "e81320e9136a21ea1320e91320ea136a21eb1320ea1320eb136a21ec1320eb1320ec136a21ed1320ec1320ed136a21ee1320ed1320ee136a21" + "ef1320ee1320ef136a21f01320ef1320f0136a21f11320f01320f1136a21f21320f11320f2136a21f31320f21320f3136a21f41320f31320f4" + "136a21f51320f41320f5136a21f61320f51320f6136a21f71320f61320f7136a21f81320f71320f8136a21f91320f81320f9136a21fa1320f9" + "1320fa136a21fb1320fa1320fb136a21fc1320fb1320fc136a21fd1320fc1320fd136a21fe1320fd1320fe136a21ff1320fe1320ff136a2180" + "1420ff132080146a2181142080142081146a2182142081142082146a2183142082142083146a2184142083142084146a218514208414208514" + "6a2186142085142086146a2187142086142087146a2188142087142088146a2189142088142089146a218a14208914208a146a218b14208a14" + "208b146a218c14208b14208c146a218d14208c14208d146a218e14208d14208e146a218f14208e14208f146a219014208f142090146a219114" + "2090142091146a2192142091142092146a2193142092142093146a2194142093142094146a2195142094142095146a2196142095142096146a" + "2197142096142097146a2198142097142098146a2199142098142099146a219a14209914209a146a219b14209a14209b146a219c14209b1420" + "9c146a219d14209c14209d146a219e14209d14209e146a219f14209e14209f146a21a014209f1420a0146a21a11420a01420a1146a21a21420" + "a11420a2146a21a31420a21420a3146a21a41420a31420a4146a21a51420a41420a5146a21a61420a51420a6146a21a71420a61420a7146a21" + "a81420a71420a8146a21a91420a81420a9146a21aa1420a91420aa146a21ab1420aa1420ab146a21ac1420ab1420ac146a21ad1420ac1420ad" + "146a21ae1420ad1420ae146a21af1420ae1420af146a21b01420af1420b0146a21b11420b01420b1146a21b21420b11420b2146a21b31420b2" + "1420b3146a21b41420b31420b4146a21b51420b41420b5146a21b61420b51420b6146a21b71420b61420b7146a21b81420b71420b8146a21b9" + "1420b81420b9146a21ba1420b91420ba146a21bb1420ba1420bb146a21bc1420bb1420bc146a21bd1420bc1420bd146a21be1420bd1420be14" + "6a21bf1420be1420bf146a21c01420bf1420c0146a21c11420c01420c1146a21c21420c11420c2146a21c31420c21420c3146a21c41420c314" + "20c4146a21c51420c41420c5146a21c61420c51420c6146a21c71420c61420c7146a21c81420c71420c8146a21c91420c81420c9146a21ca14" + "20c91420ca146a21cb1420ca1420cb146a21cc1420cb1420cc146a21cd1420cc1420cd146a21ce1420cd1420ce146a21cf1420ce1420cf146a" + "21d01420cf1420d0146a21d11420d01420d1146a21d21420d11420d2146a21d31420d21420d3146a21d41420d31420d4146a21d51420d41420" + "d5146a21d61420d51420d6146a21d71420d61420d7146a21d81420d71420d8146a21d91420d81420d9146a21da1420d91420da146a21db1420" + "da1420db146a21dc1420db1420dc146a21dd1420dc1420dd146a21de1420dd1420de146a21df1420de1420df146a21e01420df1420e0146a21" + "e11420e01420e1146a21e21420e11420e2146a21e31420e21420e3146a21e41420e31420e4146a21e51420e41420e5146a21e61420e51420e6" + "146a21e71420e61420e7146a21e81420e71420e8146a21e91420e81420e9146a21ea1420e91420ea146a21eb1420ea1420eb146a21ec1420eb" + "1420ec146a21ed1420ec1420ed146a21ee1420ed1420ee146a21ef1420ee1420ef146a21f01420ef1420f0146a21f11420f01420f1146a21f2" + "1420f11420f2146a21f31420f21420f3146a21f41420f31420f4146a21f51420f41420f5146a21f61420f51420f6146a21f71420f61420f714" + "6a21f81420f71420f8146a21f91420f81420f9146a21fa1420f91420fa146a21fb1420fa1420fb146a21fc1420fb1420fc146a21fd1420fc14" + "20fd146a21fe1420fd1420fe146a21ff1420fe1420ff146a21801520ff142080156a2181152080152081156a2182152081152082156a218315" + "2082152083156a2184152083152084156a2185152084152085156a2186152085152086156a2187152086152087156a2188152087152088156a" + "2189152088152089156a218a15208915208a156a218b15208a15208b156a218c15208b15208c156a218d15208c15208d156a218e15208d1520" + "8e156a218f15208e15208f156a219015208f152090156a2191152090152091156a2192152091152092156a2193152092152093156a21941520" + "93152094156a2195152094152095156a2196152095152096156a2197152096152097156a2198152097152098156a2199152098152099156a21" + "9a15209915209a156a219b15209a15209b156a219c15209b15209c156a219d15209c15209d156a219e15209d15209e156a219f15209e15209f" + "156a21a015209f1520a0156a21a11520a01520a1156a21a21520a11520a2156a21a31520a21520a3156a21a41520a31520a4156a21a51520a4" + "1520a5156a21a61520a51520a6156a21a71520a61520a7156a21a81520a71520a8156a21a91520a81520a9156a21aa1520a91520aa156a21ab" + "1520aa1520ab156a21ac1520ab1520ac156a21ad1520ac1520ad156a21ae1520ad1520ae156a21af1520ae1520af156a21b01520af1520b015" + "6a21b11520b01520b1156a21b21520b11520b2156a21b31520b21520b3156a21b41520b31520b4156a21b51520b41520b5156a21b61520b515" + "20b6156a21b71520b61520b7156a21b81520b71520b8156a21b91520b81520b9156a21ba1520b91520ba156a21bb1520ba1520bb156a21bc15" + "20bb1520bc156a21bd1520bc1520bd156a21be1520bd1520be156a21bf1520be1520bf156a21c01520bf1520c0156a21c11520c01520c1156a" + "21c21520c11520c2156a21c31520c21520c3156a21c41520c31520c4156a21c51520c41520c5156a21c61520c51520c6156a21c71520c61520" + "c7156a21c81520c71520c8156a21c91520c81520c9156a21ca1520c91520ca156a21cb1520ca1520cb156a21cc1520cb1520cc156a21cd1520" + "cc1520cd156a21ce1520cd1520ce156a21cf1520ce1520cf156a21d01520cf1520d0156a21d11520d01520d1156a21d21520d11520d2156a21" + "d31520d21520d3156a21d41520d31520d4156a21d51520d41520d5156a21d61520d51520d6156a21d71520d61520d7156a21d81520d71520d8" + "156a21d91520d81520d9156a21da1520d91520da156a21db1520da1520db156a21dc1520db1520dc156a21dd1520dc1520dd156a21de1520dd" + "1520de156a21df1520de1520df156a21e01520df1520e0156a21e11520e01520e1156a21e21520e11520e2156a21e31520e21520e3156a21e4" + "1520e31520e4156a21e51520e41520e5156a21e61520e51520e6156a21e71520e61520e7156a21e81520e71520e8156a21e91520e81520e915" + "6a21ea1520e91520ea156a21eb1520ea1520eb156a21ec1520eb1520ec156a21ed1520ec1520ed156a21ee1520ed1520ee156a21ef1520ee15" + "20ef156a21f01520ef1520f0156a21f11520f01520f1156a21f21520f11520f2156a21f31520f21520f3156a21f41520f31520f4156a21f515" + "20f41520f5156a21f61520f51520f6156a21f71520f61520f7156a21f81520f71520f8156a21f91520f81520f9156a21fa1520f91520fa156a" + "21fb1520fa1520fb156a21fc1520fb1520fc156a21fd1520fc1520fd156a21fe1520fd1520fe156a21ff1520fe1520ff156a21801620ff1520" + "80166a2181162080162081166a2182162081162082166a2183162082162083166a2184162083162084166a2185162084162085166a21861620" + "85162086166a2187162086162087166a2188162087162088166a2189162088162089166a218a16208916208a166a218b16208a16208b166a21" + "8c16208b16208c166a218d16208c16208d166a218e16208d16208e166a218f16208e16208f166a219016208f162090166a2191162090162091" + "166a2192162091162092166a2193162092162093166a2194162093162094166a2195162094162095166a2196162095162096166a2197162096" + "162097166a2198162097162098166a2199162098162099166a219a16209916209a166a219b16209a16209b166a219c16209b16209c166a219d" + "16209c16209d166a219e16209d16209e166a219f16209e16209f166a21a016209f1620a0166a21a11620a01620a1166a21a21620a11620a216" + "6a21a31620a21620a3166a21a41620a31620a4166a21a51620a41620a5166a21a61620a51620a6166a21a71620a61620a7166a21a81620a716" + "20a8166a21a91620a81620a9166a21aa1620a91620aa166a21ab1620aa1620ab166a21ac1620ab1620ac166a21ad1620ac1620ad166a21ae16" + "20ad1620ae166a21af1620ae1620af166a21b01620af1620b0166a21b11620b01620b1166a21b21620b11620b2166a21b31620b21620b3166a" + "21b41620b31620b4166a21b51620b41620b5166a21b61620b51620b6166a21b71620b61620b7166a21b81620b71620b8166a21b91620b81620" + "b9166a21ba1620b91620ba166a21bb1620ba1620bb166a21bc1620bb1620bc166a21bd1620bc1620bd166a21be1620bd1620be166a21bf1620" + "be1620bf166a21c01620bf1620c0166a21c11620c01620c1166a21c21620c11620c2166a21c31620c21620c3166a21c41620c31620c4166a21" + "c51620c41620c5166a21c61620c51620c6166a21c71620c61620c7166a21c81620c71620c8166a21c91620c81620c9166a21ca1620c91620ca" + "166a21cb1620ca1620cb166a21cc1620cb1620cc166a21cd1620cc1620cd166a21ce1620cd1620ce166a21cf1620ce1620cf166a21d01620cf" + "1620d0166a21d11620d01620d1166a21d21620d11620d2166a21d31620d21620d3166a21d41620d31620d4166a21d51620d41620d5166a21d6" + "1620d51620d6166a21d71620d61620d7166a21d81620d71620d8166a21d91620d81620d9166a21da1620d91620da166a21db1620da1620db16" + "6a21dc1620db1620dc166a21dd1620dc1620dd166a21de1620dd1620de166a21df1620de1620df166a21e01620df1620e0166a21e11620e016" + "20e1166a21e21620e11620e2166a21e31620e21620e3166a21e41620e31620e4166a21e51620e41620e5166a21e61620e51620e6166a21e716" + "20e61620e7166a21e81620e71620e8166a21e91620e81620e9166a21ea1620e91620ea166a21eb1620ea1620eb166a21ec1620eb1620ec166a" + "21ed1620ec1620ed166a21ee1620ed1620ee166a21ef1620ee1620ef166a21f01620ef1620f0166a21f11620f01620f1166a21f21620f11620" + "f2166a21f31620f21620f3166a21f41620f31620f4166a21f51620f41620f5166a21f61620f51620f6166a21f71620f61620f7166a21f81620" + "f71620f8166a21f91620f81620f9166a21fa1620f91620fa166a21fb1620fa1620fb166a21fc1620fb1620fc166a21fd1620fc1620fd166a21" + "fe1620fd1620fe166a21ff1620fe1620ff166a21801720ff162080176a2181172080172081176a2182172081172082176a2183172082172083" + "176a2184172083172084176a2185172084172085176a2186172085172086176a2187172086172087176a2188172087172088176a2189172088" + "172089176a218a17208917208a176a218b17208a17208b176a218c17208b17208c176a218d17208c17208d176a218e17208d17208e176a218f" + "17208e17208f176a219017208f172090176a2191172090172091176a2192172091172092176a2193172092172093176a219417209317209417" + "6a2195172094172095176a2196172095172096176a2197172096172097176a2198172097172098176a2199172098172099176a219a17209917" + "209a176a219b17209a17209b176a219c17209b17209c176a219d17209c17209d176a219e17209d17209e176a219f17209e17209f176a21a017" + "209f1720a0176a21a11720a01720a1176a21a21720a11720a2176a21a31720a21720a3176a21a41720a31720a4176a21a51720a41720a5176a" + "21a61720a51720a6176a21a71720a61720a7176a21a81720a71720a8176a21a91720a81720a9176a21aa1720a91720aa176a21ab1720aa1720" + "ab176a21ac1720ab1720ac176a21ad1720ac1720ad176a21ae1720ad1720ae176a21af1720ae1720af176a21b01720af1720b0176a21b11720" + "b01720b1176a21b21720b11720b2176a21b31720b21720b3176a21b41720b31720b4176a21b51720b41720b5176a21b61720b51720b6176a21" + "b71720b61720b7176a21b81720b71720b8176a21b91720b81720b9176a21ba1720b91720ba176a21bb1720ba1720bb176a21bc1720bb1720bc" + "176a21bd1720bc1720bd176a21be1720bd1720be176a21bf1720be1720bf176a21c01720bf1720c0176a21c11720c01720c1176a21c21720c1" + "1720c2176a21c31720c21720c3176a21c41720c31720c4176a21c51720c41720c5176a21c61720c51720c6176a21c71720c61720c7176a21c8" + "1720c71720c8176a21c91720c81720c9176a21ca1720c91720ca176a21cb1720ca1720cb176a21cc1720cb1720cc176a21cd1720cc1720cd17" + "6a21ce1720cd1720ce176a21cf1720ce1720cf176a21d01720cf1720d0176a21d11720d01720d1176a21d21720d11720d2176a21d31720d217" + "20d3176a21d41720d31720d4176a21d51720d41720d5176a21d61720d51720d6176a21d71720d61720d7176a21d81720d71720d8176a21d917" + "20d81720d9176a21da1720d91720da176a21db1720da1720db176a21dc1720db1720dc176a21dd1720dc1720dd176a21de1720dd1720de176a" + "21df1720de1720df176a21e01720df1720e0176a21e11720e01720e1176a21e21720e11720e2176a21e31720e21720e3176a21e41720e31720" + "e4176a21e51720e41720e5176a21e61720e51720e6176a21e71720e61720e7176a21e81720e71720e8176a21e91720e81720e9176a21ea1720" + "e91720ea176a21eb1720ea1720eb176a21ec1720eb1720ec176a21ed1720ec1720ed176a21ee1720ed1720ee176a21ef1720ee1720ef176a21" + "f01720ef1720f0176a21f11720f01720f1176a21f21720f11720f2176a21f31720f21720f3176a21f41720f31720f4176a21f51720f41720f5" + "176a21f61720f51720f6176a21f71720f61720f7176a21f81720f71720f8176a21f91720f81720f9176a21fa1720f91720fa176a21fb1720fa" + "1720fb176a21fc1720fb1720fc176a21fd1720fc1720fd176a21fe1720fd1720fe176a21ff1720fe1720ff176a21801820ff172080186a2181" + "182080182081186a2182182081182082186a2183182082182083186a2184182083182084186a2185182084182085186a218618208518208618" + "6a2187182086182087186a2188182087182088186a2189182088182089186a218a18208918208a186a218b18208a18208b186a218c18208b18" + "208c186a218d18208c18208d186a218e18208d18208e186a218f18208e18208f186a219018208f182090186a2191182090182091186a219218" + "2091182092186a2193182092182093186a2194182093182094186a2195182094182095186a2196182095182096186a2197182096182097186a" + "2198182097182098186a2199182098182099186a219a18209918209a186a219b18209a18209b186a219c18209b18209c186a219d18209c1820" + "9d186a219e18209d18209e186a219f18209e18209f186a21a018209f1820a0186a21a11820a01820a1186a21a21820a11820a2186a21a31820" + "a21820a3186a21a41820a31820a4186a21a51820a41820a5186a21a61820a51820a6186a21a71820a61820a7186a21a81820a71820a8186a21" + "a91820a81820a9186a21aa1820a91820aa186a21ab1820aa1820ab186a21ac1820ab1820ac186a21ad1820ac1820ad186a21ae1820ad1820ae" + "186a21af1820ae1820af186a21b01820af1820b0186a21b11820b01820b1186a21b21820b11820b2186a21b31820b21820b3186a21b41820b3" + "1820b4186a21b51820b41820b5186a21b61820b51820b6186a21b71820b61820b7186a21b81820b71820b8186a21b91820b81820b9186a21ba" + "1820b91820ba186a21bb1820ba1820bb186a21bc1820bb1820bc186a21bd1820bc1820bd186a21be1820bd1820be186a21bf1820be1820bf18" + "6a21c01820bf1820c0186a21c11820c01820c1186a21c21820c11820c2186a21c31820c21820c3186a21c41820c31820c4186a21c51820c418" + "20c5186a21c61820c51820c6186a21c71820c61820c7186a21c81820c71820c8186a21c91820c81820c9186a21ca1820c91820ca186a21cb18" + "20ca1820cb186a21cc1820cb1820cc186a21cd1820cc1820cd186a21ce1820cd1820ce186a21cf1820ce1820cf186a21d01820cf1820d0186a" + "21d11820d01820d1186a21d21820d11820d2186a21d31820d21820d3186a21d41820d31820d4186a21d51820d41820d5186a21d61820d51820" + "d6186a21d71820d61820d7186a21d81820d71820d8186a21d91820d81820d9186a21da1820d91820da186a21db1820da1820db186a21dc1820" + "db1820dc186a21dd1820dc1820dd186a21de1820dd1820de186a21df1820de1820df186a21e01820df1820e0186a21e11820e01820e1186a21" + "e21820e11820e2186a21e31820e21820e3186a21e41820e31820e4186a21e51820e41820e5186a21e61820e51820e6186a21e71820e61820e7" + "186a21e81820e71820e8186a21e91820e81820e9186a21ea1820e91820ea186a21eb1820ea1820eb186a21ec1820eb1820ec186a21ed1820ec" + "1820ed186a21ee1820ed1820ee186a21ef1820ee1820ef186a21f01820ef1820f0186a21f11820f01820f1186a21f21820f11820f2186a21f3" + "1820f21820f3186a21f41820f31820f4186a21f51820f41820f5186a21f61820f51820f6186a21f71820f61820f7186a21f81820f71820f818" + "6a21f91820f81820f9186a21fa1820f91820fa186a21fb1820fa1820fb186a21fc1820fb1820fc186a21fd1820fc1820fd186a21fe1820fd18" + "20fe186a21ff1820fe1820ff186a21801920ff182080196a2181192080192081196a2182192081192082196a2183192082192083196a218419" + "2083192084196a2185192084192085196a2186192085192086196a2187192086192087196a2188192087192088196a2189192088192089196a" + "218a19208919208a196a218b19208a19208b196a218c19208b19208c196a218d19208c19208d196a218e19208d19208e196a218f19208e1920" + "8f196a219019208f192090196a2191192090192091196a2192192091192092196a2193192092192093196a2194192093192094196a21951920" + "94192095196a2196192095192096196a2197192096192097196a2198192097192098196a2199192098192099196a219a19209919209a196a21" + "9b19209a19209b196a219c19209b19209c196a219d19209c19209d196a219e19209d19209e196a219f19209e19209f196a21a019209f1920a0" + "196a21a11920a01920a1196a21a21920a11920a2196a21a31920a21920a3196a21a41920a31920a4196a21a51920a41920a5196a21a61920a5" + "1920a6196a21a71920a61920a7196a21a81920a71920a8196a21a91920a81920a9196a21aa1920a91920aa196a21ab1920aa1920ab196a21ac" + "1920ab1920ac196a21ad1920ac1920ad196a21ae1920ad1920ae196a21af1920ae1920af196a21b01920af1920b0196a21b11920b01920b119" + "6a21b21920b11920b2196a21b31920b21920b3196a21b41920b31920b4196a21b51920b41920b5196a21b61920b51920b6196a21b71920b619" + "20b7196a21b81920b71920b8196a21b91920b81920b9196a21ba1920b91920ba196a21bb1920ba1920bb196a21bc1920bb1920bc196a21bd19" + "20bc1920bd196a21be1920bd1920be196a21bf1920be1920bf196a21c01920bf1920c0196a21c11920c01920c1196a21c21920c11920c2196a" + "21c31920c21920c3196a21c41920c31920c4196a21c51920c41920c5196a21c61920c51920c6196a21c71920c61920c7196a21c81920c71920" + "c8196a21c91920c81920c9196a21ca1920c91920ca196a21cb1920ca1920cb196a21cc1920cb1920cc196a21cd1920cc1920cd196a21ce1920" + "cd1920ce196a21cf1920ce1920cf196a21d01920cf1920d0196a21d11920d01920d1196a21d21920d11920d2196a21d31920d21920d3196a21" + "d41920d31920d4196a21d51920d41920d5196a21d61920d51920d6196a21d71920d61920d7196a21d81920d71920d8196a21d91920d81920d9" + "196a21da1920d91920da196a21db1920da1920db196a21dc1920db1920dc196a21dd1920dc1920dd196a21de1920dd1920de196a21df1920de" + "1920df196a21e01920df1920e0196a21e11920e01920e1196a21e21920e11920e2196a21e31920e21920e3196a21e41920e31920e4196a21e5" + "1920e41920e5196a21e61920e51920e6196a21e71920e61920e7196a21e81920e71920e8196a21e91920e81920e9196a21ea1920e91920ea19" + "6a21eb1920ea1920eb196a21ec1920eb1920ec196a21ed1920ec1920ed196a21ee1920ed1920ee196a21ef1920ee1920ef196a21f01920ef19" + "20f0196a21f11920f01920f1196a21f21920f11920f2196a21f31920f21920f3196a21f41920f31920f4196a21f51920f41920f5196a21f619" + "20f51920f6196a21f71920f61920f7196a21f81920f71920f8196a21f91920f81920f9196a21fa1920f91920fa196a21fb1920fa1920fb196a" + "21fc1920fb1920fc196a21fd1920fc1920fd196a21fe1920fd1920fe196a21ff1920fe1920ff196a21801a20ff1920801a6a21811a20801a20" + "811a6a21821a20811a20821a6a21831a20821a20831a6a21841a20831a20841a6a21851a20841a20851a6a21861a20851a20861a6a21871a20" + "861a20871a6a21881a20871a20881a6a21891a20881a20891a6a218a1a20891a208a1a6a218b1a208a1a208b1a6a218c1a208b1a208c1a6a21" + "8d1a208c1a208d1a6a218e1a208d1a208e1a6a218f1a208e1a208f1a6a21901a208f1a20901a6a21911a20901a20911a6a21921a20911a2092" + "1a6a21931a20921a20931a6a21941a20931a20941a6a21951a20941a20951a6a21961a20951a20961a6a21971a20961a20971a6a21981a2097" + "1a20981a6a21991a20981a20991a6a219a1a20991a209a1a6a219b1a209a1a209b1a6a219c1a209b1a209c1a6a219d1a209c1a209d1a6a219e" + "1a209d1a209e1a6a219f1a209e1a209f1a6a21a01a209f1a20a01a6a21a11a20a01a20a11a6a21a21a20a11a20a21a6a21a31a20a21a20a31a" + "6a21a41a20a31a20a41a6a21a51a20a41a20a51a6a21a61a20a51a20a61a6a21a71a20a61a20a71a6a21a81a20a71a20a81a6a21a91a20a81a" + "20a91a6a21aa1a20a91a20aa1a6a21ab1a20aa1a20ab1a6a21ac1a20ab1a20ac1a6a21ad1a20ac1a20ad1a6a21ae1a20ad1a20ae1a6a21af1a" + "20ae1a20af1a6a21b01a20af1a20b01a6a21b11a20b01a20b11a6a21b21a20b11a20b21a6a21b31a20b21a20b31a6a21b41a20b31a20b41a6a" + "21b51a20b41a20b51a6a21b61a20b51a20b61a6a21b71a20b61a20b71a6a21b81a20b71a20b81a6a21b91a20b81a20b91a6a21ba1a20b91a20" + "ba1a6a21bb1a20ba1a20bb1a6a21bc1a20bb1a20bc1a6a21bd1a20bc1a20bd1a6a21be1a20bd1a20be1a6a21bf1a20be1a20bf1a6a21c01a20" + "bf1a20c01a6a21c11a20c01a20c11a6a21c21a20c11a20c21a6a21c31a20c21a20c31a6a21c41a20c31a20c41a6a21c51a20c41a20c51a6a21" + "c61a20c51a20c61a6a21c71a20c61a20c71a6a21c81a20c71a20c81a6a21c91a20c81a20c91a6a21ca1a20c91a20ca1a6a21cb1a20ca1a20cb" + "1a6a21cc1a20cb1a20cc1a6a21cd1a20cc1a20cd1a6a21ce1a20cd1a20ce1a6a21cf1a20ce1a20cf1a6a21d01a20cf1a20d01a6a21d11a20d0" + "1a20d11a6a21d21a20d11a20d21a6a21d31a20d21a20d31a6a21d41a20d31a20d41a6a21d51a20d41a20d51a6a21d61a20d51a20d61a6a21d7" + "1a20d61a20d71a6a21d81a20d71a20d81a6a21d91a20d81a20d91a6a21da1a20d91a20da1a6a21db1a20da1a20db1a6a21dc1a20db1a20dc1a" + "6a21dd1a20dc1a20dd1a6a21de1a20dd1a20de1a6a21df1a20de1a20df1a6a21e01a20df1a20e01a6a21e11a20e01a20e11a6a21e21a20e11a" + "20e21a6a21e31a20e21a20e31a6a21e41a20e31a20e41a6a21e51a20e41a20e51a6a21e61a20e51a20e61a6a21e71a20e61a20e71a6a21e81a" + "20e71a20e81a6a21e91a20e81a20e91a6a21ea1a20e91a20ea1a6a21eb1a20ea1a20eb1a6a21ec1a20eb1a20ec1a6a21ed1a20ec1a20ed1a6a" + "21ee1a20ed1a20ee1a6a21ef1a20ee1a20ef1a6a21f01a20ef1a20f01a6a21f11a20f01a20f11a6a21f21a20f11a20f21a6a21f31a20f21a20" + "f31a6a21f41a20f31a20f41a6a21f51a20f41a20f51a6a21f61a20f51a20f61a6a21f71a20f61a20f71a6a21f81a20f71a20f81a6a21f91a20" + "f81a20f91a6a21fa1a20f91a20fa1a6a21fb1a20fa1a20fb1a6a21fc1a20fb1a20fc1a6a21fd1a20fc1a20fd1a6a21fe1a20fd1a20fe1a6a21" + "ff1a20fe1a20ff1a6a21801b20ff1a20801b6a21811b20801b20811b6a21821b20811b20821b6a21831b20821b20831b6a21841b20831b2084" + "1b6a21851b20841b20851b6a21861b20851b20861b6a21871b20861b20871b6a21881b20871b20881b6a21891b20881b20891b6a218a1b2089" + "1b208a1b6a218b1b208a1b208b1b6a218c1b208b1b208c1b6a218d1b208c1b208d1b6a218e1b208d1b208e1b6a218f1b208e1b208f1b6a2190" + "1b208f1b20901b6a21911b20901b20911b6a21921b20911b20921b6a21931b20921b20931b6a21941b20931b20941b6a21951b20941b20951b" + "6a21961b20951b20961b6a21971b20961b20971b6a21981b20971b20981b6a21991b20981b20991b6a219a1b20991b209a1b6a219b1b209a1b" + "209b1b6a219c1b209b1b209c1b6a219d1b209c1b209d1b6a219e1b209d1b209e1b6a219f1b209e1b209f1b6a21a01b209f1b20a01b6a21a11b" + "20a01b20a11b6a21a21b20a11b20a21b6a21a31b20a21b20a31b6a21a41b20a31b20a41b6a21a51b20a41b20a51b6a21a61b20a51b20a61b6a" + "21a71b20a61b20a71b6a21a81b20a71b20a81b6a21a91b20a81b20a91b6a21aa1b20a91b20aa1b6a21ab1b20aa1b20ab1b6a21ac1b20ab1b20" + "ac1b6a21ad1b20ac1b20ad1b6a21ae1b20ad1b20ae1b6a21af1b20ae1b20af1b6a21b01b20af1b20b01b6a21b11b20b01b20b11b6a21b21b20" + "b11b20b21b6a21b31b20b21b20b31b6a21b41b20b31b20b41b6a21b51b20b41b20b51b6a21b61b20b51b20b61b6a21b71b20b61b20b71b6a21" + "b81b20b71b20b81b6a21b91b20b81b20b91b6a21ba1b20b91b20ba1b6a21bb1b20ba1b20bb1b6a21bc1b20bb1b20bc1b6a21bd1b20bc1b20bd" + "1b6a21be1b20bd1b20be1b6a21bf1b20be1b20bf1b6a21c01b20bf1b20c01b6a21c11b20c01b20c11b6a21c21b20c11b20c21b6a21c31b20c2" + "1b20c31b6a21c41b20c31b20c41b6a21c51b20c41b20c51b6a21c61b20c51b20c61b6a21c71b20c61b20c71b6a21c81b20c71b20c81b6a21c9" + "1b20c81b20c91b6a21ca1b20c91b20ca1b6a21cb1b20ca1b20cb1b6a21cc1b20cb1b20cc1b6a21cd1b20cc1b20cd1b6a21ce1b20cd1b20ce1b" + "6a21cf1b20ce1b20cf1b6a21d01b20cf1b20d01b6a21d11b20d01b20d11b6a21d21b20d11b20d21b6a21d31b20d21b20d31b6a21d41b20d31b" + "20d41b6a21d51b20d41b20d51b6a21d61b20d51b20d61b6a21d71b20d61b20d71b6a21d81b20d71b20d81b6a21d91b20d81b20d91b6a21da1b" + "20d91b20da1b6a21db1b20da1b20db1b6a21dc1b20db1b20dc1b6a21dd1b20dc1b20dd1b6a21de1b20dd1b20de1b6a21df1b20de1b20df1b6a" + "21e01b20df1b20e01b6a21e11b20e01b20e11b6a21e21b20e11b20e21b6a21e31b20e21b20e31b6a21e41b20e31b20e41b6a21e51b20e41b20" + "e51b6a21e61b20e51b20e61b6a21e71b20e61b20e71b6a21e81b20e71b20e81b6a21e91b20e81b20e91b6a21ea1b20e91b20ea1b6a21eb1b20" + "ea1b20eb1b6a21ec1b20eb1b20ec1b6a21ed1b20ec1b20ed1b6a21ee1b20ed1b20ee1b6a21ef1b20ee1b20ef1b6a21f01b20ef1b20f01b6a21" + "f11b20f01b20f11b6a21f21b20f11b20f21b6a21f31b20f21b20f31b6a21f41b20f31b20f41b6a21f51b20f41b20f51b6a21f61b20f51b20f6" + "1b6a21f71b20f61b20f71b6a21f81b20f71b20f81b6a21f91b20f81b20f91b6a21fa1b20f91b20fa1b6a21fb1b20fa1b20fb1b6a21fc1b20fb" + "1b20fc1b6a21fd1b20fc1b20fd1b6a21fe1b20fd1b20fe1b6a21ff1b20fe1b20ff1b6a21801c20ff1b20801c6a21811c20801c20811c6a2182" + "1c20811c20821c6a21831c20821c20831c6a21841c20831c20841c6a21851c20841c20851c6a21861c20851c20861c6a21871c20861c20871c" + "6a21881c20871c20881c6a21891c20881c20891c6a218a1c20891c208a1c6a218b1c208a1c208b1c6a218c1c208b1c208c1c6a218d1c208c1c" + "208d1c6a218e1c208d1c208e1c6a218f1c208e1c208f1c6a21901c208f1c20901c6a21911c20901c20911c6a21921c20911c20921c6a21931c" + "20921c20931c6a21941c20931c20941c6a21951c20941c20951c6a21961c20951c20961c6a21971c20961c20971c6a21981c20971c20981c6a" + "21991c20981c20991c6a219a1c20991c209a1c6a219b1c209a1c209b1c6a219c1c209b1c209c1c6a219d1c209c1c209d1c6a219e1c209d1c20" + "9e1c6a219f1c209e1c209f1c6a21a01c209f1c20a01c6a21a11c20a01c20a11c6a21a21c20a11c20a21c6a21a31c20a21c20a31c6a21a41c20" + "a31c20a41c6a21a51c20a41c20a51c6a21a61c20a51c20a61c6a21a71c20a61c20a71c6a21a81c20a71c20a81c6a21a91c20a81c20a91c6a21" + "aa1c20a91c20aa1c6a21ab1c20aa1c20ab1c6a21ac1c20ab1c20ac1c6a21ad1c20ac1c20ad1c6a21ae1c20ad1c20ae1c6a21af1c20ae1c20af" + "1c6a21b01c20af1c20b01c6a21b11c20b01c20b11c6a21b21c20b11c20b21c6a21b31c20b21c20b31c6a21b41c20b31c20b41c6a21b51c20b4" + "1c20b51c6a21b61c20b51c20b61c6a21b71c20b61c20b71c6a21b81c20b71c20b81c6a21b91c20b81c20b91c6a21ba1c20b91c20ba1c6a21bb" + "1c20ba1c20bb1c6a21bc1c20bb1c20bc1c6a21bd1c20bc1c20bd1c6a21be1c20bd1c20be1c6a21bf1c20be1c20bf1c6a21c01c20bf1c20c01c" + "6a21c11c20c01c20c11c6a21c21c20c11c20c21c6a21c31c20c21c20c31c6a21c41c20c31c20c41c6a21c51c20c41c20c51c6a21c61c20c51c" + "20c61c6a21c71c20c61c20c71c6a21c81c20c71c20c81c6a21c91c20c81c20c91c6a21ca1c20c91c20ca1c6a21cb1c20ca1c20cb1c6a21cc1c" + "20cb1c20cc1c6a21cd1c20cc1c20cd1c6a21ce1c20cd1c20ce1c6a21cf1c20ce1c20cf1c6a21d01c20cf1c20d01c6a21d11c20d01c20d11c6a" + "21d21c20d11c20d21c6a21d31c20d21c20d31c6a21d41c20d31c20d41c6a21d51c20d41c20d51c6a21d61c20d51c20d61c6a21d71c20d61c20" + "d71c6a21d81c20d71c20d81c6a21d91c20d81c20d91c6a21da1c20d91c20da1c6a21db1c20da1c20db1c6a21dc1c20db1c20dc1c6a21dd1c20" + "dc1c20dd1c6a21de1c20dd1c20de1c6a21df1c20de1c20df1c6a21e01c20df1c20e01c6a21e11c20e01c20e11c6a21e21c20e11c20e21c6a21" + "e31c20e21c20e31c6a21e41c20e31c20e41c6a21e51c20e41c20e51c6a21e61c20e51c20e61c6a21e71c20e61c20e71c6a21e81c20e71c20e8" + "1c6a21e91c20e81c20e91c6a21ea1c20e91c20ea1c6a21eb1c20ea1c20eb1c6a21ec1c20eb1c20ec1c6a21ed1c20ec1c20ed1c6a21ee1c20ed" + "1c20ee1c6a21ef1c20ee1c20ef1c6a21f01c20ef1c20f01c6a21f11c20f01c20f11c6a21f21c20f11c20f21c6a21f31c20f21c20f31c6a21f4" + "1c20f31c20f41c6a21f51c20f41c20f51c6a21f61c20f51c20f61c6a21f71c20f61c20f71c6a21f81c20f71c20f81c6a21f91c20f81c20f91c" + "6a21fa1c20f91c20fa1c6a21fb1c20fa1c20fb1c6a21fc1c20fb1c20fc1c6a21fd1c20fc1c20fd1c6a21fe1c20fd1c20fe1c6a21ff1c20fe1c" + "20ff1c6a21801d20ff1c20801d6a21811d20801d20811d6a21821d20811d20821d6a21831d20821d20831d6a21841d20831d20841d6a21851d" + "20841d20851d6a21861d20851d20861d6a21871d20861d20871d6a21881d20871d20881d6a21891d20881d20891d6a218a1d20891d208a1d6a" + "218b1d208a1d208b1d6a218c1d208b1d208c1d6a218d1d208c1d208d1d6a218e1d208d1d208e1d6a218f1d208e1d208f1d6a21901d208f1d20" + "901d6a21911d20901d20911d6a21921d20911d20921d6a21931d20921d20931d6a21941d20931d20941d6a21951d20941d20951d6a21961d20" + "951d20961d6a21971d20961d20971d6a21981d20971d20981d6a21991d20981d20991d6a219a1d20991d209a1d6a219b1d209a1d209b1d6a21" + "9c1d209b1d209c1d6a219d1d209c1d209d1d6a219e1d209d1d209e1d6a219f1d209e1d209f1d6a21a01d209f1d20a01d6a21a11d20a01d20a1" + "1d6a21a21d20a11d20a21d6a21a31d20a21d20a31d6a21a41d20a31d20a41d6a21a51d20a41d20a51d6a21a61d20a51d20a61d6a21a71d20a6" + "1d20a71d6a21a81d20a71d20a81d6a21a91d20a81d20a91d6a21aa1d20a91d20aa1d6a21ab1d20aa1d20ab1d6a21ac1d20ab1d20ac1d6a21ad" + "1d20ac1d20ad1d6a21ae1d20ad1d20ae1d6a21af1d20ae1d20af1d6a21b01d20af1d20b01d6a21b11d20b01d20b11d6a21b21d20b11d20b21d" + "6a21b31d20b21d20b31d6a21b41d20b31d20b41d6a21b51d20b41d20b51d6a21b61d20b51d20b61d6a21b71d20b61d20b71d6a21b81d20b71d" + "20b81d6a21b91d20b81d20b91d6a21ba1d20b91d20ba1d6a21bb1d20ba1d20bb1d6a21bc1d20bb1d20bc1d6a21bd1d20bc1d20bd1d6a21be1d" + "20bd1d20be1d6a21bf1d20be1d20bf1d6a21c01d20bf1d20c01d6a21c11d20c01d20c11d6a21c21d20c11d20c21d6a21c31d20c21d20c31d6a" + "21c41d20c31d20c41d6a21c51d20c41d20c51d6a21c61d20c51d20c61d6a21c71d20c61d20c71d6a21c81d20c71d20c81d6a21c91d20c81d20" + "c91d6a21ca1d20c91d20ca1d6a21cb1d20ca1d20cb1d6a21cc1d20cb1d20cc1d6a21cd1d20cc1d20cd1d6a21ce1d20cd1d20ce1d6a21cf1d20" + "ce1d20cf1d6a21d01d20cf1d20d01d6a21d11d20d01d20d11d6a21d21d20d11d20d21d6a21d31d20d21d20d31d6a21d41d20d31d20d41d6a21" + "d51d20d41d20d51d6a21d61d20d51d20d61d6a21d71d20d61d20d71d6a21d81d20d71d20d81d6a21d91d20d81d20d91d6a21da1d20d91d20da" + "1d6a21db1d20da1d20db1d6a21dc1d20db1d20dc1d6a21dd1d20dc1d20dd1d6a21de1d20dd1d20de1d6a21df1d20de1d20df1d6a21e01d20df" + "1d20e01d6a21e11d20e01d20e11d6a21e21d20e11d20e21d6a21e31d20e21d20e31d6a21e41d20e31d20e41d6a21e51d20e41d20e51d6a21e6" + "1d20e51d20e61d6a21e71d20e61d20e71d6a21e81d20e71d20e81d6a21e91d20e81d20e91d6a21ea1d20e91d20ea1d6a21eb1d20ea1d20eb1d" + "6a21ec1d20eb1d20ec1d6a21ed1d20ec1d20ed1d6a21ee1d20ed1d20ee1d6a21ef1d20ee1d20ef1d6a21f01d20ef1d20f01d6a21f11d20f01d" + "20f11d6a21f21d20f11d20f21d6a21f31d20f21d20f31d6a21f41d20f31d20f41d6a21f51d20f41d20f51d6a21f61d20f51d20f61d6a21f71d" + "20f61d20f71d6a21f81d20f71d20f81d6a21f91d20f81d20f91d6a21fa1d20f91d20fa1d6a21fb1d20fa1d20fb1d6a21fc1d20fb1d20fc1d6a" + "21fd1d20fc1d20fd1d6a21fe1d20fd1d20fe1d6a21ff1d20fe1d20ff1d6a21801e20ff1d20801e6a21811e20801e20811e6a21821e20811e20" + "821e6a21831e20821e20831e6a21841e20831e20841e6a21851e20841e20851e6a21861e20851e20861e6a21871e20861e20871e6a21881e20" + "871e20881e6a21891e20881e20891e6a218a1e20891e208a1e6a218b1e208a1e208b1e6a218c1e208b1e208c1e6a218d1e208c1e208d1e6a21" + "8e1e208d1e208e1e6a218f1e208e1e208f1e6a21901e208f1e20901e6a21911e20901e20911e6a21921e20911e20921e6a21931e20921e2093" + "1e6a21941e20931e20941e6a21951e20941e20951e6a21961e20951e20961e6a21971e20961e20971e6a21981e20971e20981e6a21991e2098" + "1e20991e6a219a1e20991e209a1e6a219b1e209a1e209b1e6a219c1e209b1e209c1e6a219d1e209c1e209d1e6a219e1e209d1e209e1e6a219f" + "1e209e1e209f1e6a21a01e209f1e20a01e6a21a11e20a01e20a11e6a21a21e20a11e20a21e6a21a31e20a21e20a31e6a21a41e20a31e20a41e" + "6a21a51e20a41e20a51e6a21a61e20a51e20a61e6a21a71e20a61e20a71e6a21a81e20a71e20a81e6a21a91e20a81e20a91e6a21aa1e20a91e" + "20aa1e6a21ab1e20aa1e20ab1e6a21ac1e20ab1e20ac1e6a21ad1e20ac1e20ad1e6a21ae1e20ad1e20ae1e6a21af1e20ae1e20af1e6a21b01e" + "20af1e20b01e6a21b11e20b01e20b11e6a21b21e20b11e20b21e6a21b31e20b21e20b31e6a21b41e20b31e20b41e6a21b51e20b41e20b51e6a" + "21b61e20b51e20b61e6a21b71e20b61e20b71e6a21b81e20b71e20b81e6a21b91e20b81e20b91e6a21ba1e20b91e20ba1e6a21bb1e20ba1e20" + "bb1e6a21bc1e20bb1e20bc1e6a21bd1e20bc1e20bd1e6a21be1e20bd1e20be1e6a21bf1e20be1e20bf1e6a21c01e20bf1e20c01e6a21c11e20" + "c01e20c11e6a21c21e20c11e20c21e6a21c31e20c21e20c31e6a21c41e20c31e20c41e6a21c51e20c41e20c51e6a21c61e20c51e20c61e6a21" + "c71e20c61e20c71e6a21c81e20c71e20c81e6a21c91e20c81e20c91e6a21ca1e20c91e20ca1e6a21cb1e20ca1e20cb1e6a21cc1e20cb1e20cc" + "1e6a21cd1e20cc1e20cd1e6a21ce1e20cd1e20ce1e6a21cf1e20ce1e20cf1e6a21d01e20cf1e20d01e6a21d11e20d01e20d11e6a21d21e20d1" + "1e20d21e6a21d31e20d21e20d31e6a21d41e20d31e20d41e6a21d51e20d41e20d51e6a21d61e20d51e20d61e6a21d71e20d61e20d71e6a21d8" + "1e20d71e20d81e6a21d91e20d81e20d91e6a21da1e20d91e20da1e6a21db1e20da1e20db1e6a21dc1e20db1e20dc1e6a21dd1e20dc1e20dd1e" + "6a21de1e20dd1e20de1e6a21df1e20de1e20df1e6a21e01e20df1e20e01e6a21e11e20e01e20e11e6a21e21e20e11e20e21e6a21e31e20e21e" + "20e31e6a21e41e20e31e20e41e6a21e51e20e41e20e51e6a21e61e20e51e20e61e6a21e71e20e61e20e71e6a21e81e20e71e20e81e6a21e91e" + "20e81e20e91e6a21ea1e20e91e20ea1e6a21eb1e20ea1e20eb1e6a21ec1e20eb1e20ec1e6a21ed1e20ec1e20ed1e6a21ee1e20ed1e20ee1e6a" + "21ef1e20ee1e20ef1e6a21f01e20ef1e20f01e6a21f11e20f01e20f11e6a21f21e20f11e20f21e6a21f31e20f21e20f31e6a21f41e20f31e20" + "f41e6a21f51e20f41e20f51e6a21f61e20f51e20f61e6a21f71e20f61e20f71e6a21f81e20f71e20f81e6a21f91e20f81e20f91e6a21fa1e20" + "f91e20fa1e6a21fb1e20fa1e20fb1e6a21fc1e20fb1e20fc1e6a21fd1e20fc1e20fd1e6a21fe1e20fd1e20fe1e6a21ff1e20fe1e20ff1e6a21" + "801f20ff1e20801f6a21811f20801f20811f6a21821f20811f20821f6a21831f20821f20831f6a21841f20831f20841f6a21851f20841f2085" + "1f6a21861f20851f20861f6a21871f20861f20871f6a21881f20871f20881f6a21891f20881f20891f6a218a1f20891f208a1f6a218b1f208a" + "1f208b1f6a218c1f208b1f208c1f6a218d1f208c1f208d1f6a218e1f208d1f208e1f6a218f1f208e1f208f1f6a21901f208f1f20901f6a2191" + "1f20901f20911f6a21921f20911f20921f6a21931f20921f20931f6a21941f20931f20941f6a21951f20941f20951f6a21961f20951f20961f" + "6a21971f20961f20971f6a21981f20971f20981f6a21991f20981f20991f6a219a1f20991f209a1f6a219b1f209a1f209b1f6a219c1f209b1f" + "209c1f6a219d1f209c1f209d1f6a219e1f209d1f209e1f6a219f1f209e1f209f1f6a21a01f209f1f20a01f6a21a11f20a01f20a11f6a21a21f" + "20a11f20a21f6a21a31f20a21f20a31f6a21a41f20a31f20a41f6a21a51f20a41f20a51f6a21a61f20a51f20a61f6a21a71f20a61f20a71f6a" + "21a81f20a71f20a81f6a21a91f20a81f20a91f6a21aa1f20a91f20aa1f6a21ab1f20aa1f20ab1f6a21ac1f20ab1f20ac1f6a21ad1f20ac1f20" + "ad1f6a21ae1f20ad1f20ae1f6a21af1f20ae1f20af1f6a21b01f20af1f20b01f6a21b11f20b01f20b11f6a21b21f20b11f20b21f6a21b31f20" + "b21f20b31f6a21b41f20b31f20b41f6a21b51f20b41f20b51f6a21b61f20b51f20b61f6a21b71f20b61f20b71f6a21b81f20b71f20b81f6a21" + "b91f20b81f20b91f6a21ba1f20b91f20ba1f6a21bb1f20ba1f20bb1f6a21bc1f20bb1f20bc1f6a21bd1f20bc1f20bd1f6a21be1f20bd1f20be" + "1f6a21bf1f20be1f20bf1f6a21c01f20bf1f20c01f6a21c11f20c01f20c11f6a21c21f20c11f20c21f6a21c31f20c21f20c31f6a21c41f20c3" + "1f20c41f6a21c51f20c41f20c51f6a21c61f20c51f20c61f6a21c71f20c61f20c71f6a21c81f20c71f20c81f6a21c91f20c81f20c91f6a21ca" + "1f20c91f20ca1f6a21cb1f20ca1f20cb1f6a21cc1f20cb1f20cc1f6a21cd1f20cc1f20cd1f6a21ce1f20cd1f20ce1f6a21cf1f20ce1f20cf1f" + "6a21d01f20cf1f20d01f6a21d11f20d01f20d11f6a21d21f20d11f20d21f6a21d31f20d21f20d31f6a21d41f20d31f20d41f6a21d51f20d41f" + "20d51f6a21d61f20d51f20d61f6a21d71f20d61f20d71f6a21d81f20d71f20d81f6a21d91f20d81f20d91f6a21da1f20d91f20da1f6a21db1f" + "20da1f20db1f6a21dc1f20db1f20dc1f6a21dd1f20dc1f20dd1f6a21de1f20dd1f20de1f6a21df1f20de1f20df1f6a21e01f20df1f20e01f6a" + "21e11f20e01f20e11f6a21e21f20e11f20e21f6a21e31f20e21f20e31f6a21e41f20e31f20e41f6a21e51f20e41f20e51f6a21e61f20e51f20" + "e61f6a21e71f20e61f20e71f6a21e81f20e71f20e81f6a21e91f20e81f20e91f6a21ea1f20e91f20ea1f6a21eb1f20ea1f20eb1f6a21ec1f20" + "eb1f20ec1f6a21ed1f20ec1f20ed1f6a21ee1f20ed1f20ee1f6a21ef1f20ee1f20ef1f6a21f01f20ef1f20f01f6a21f11f20f01f20f11f6a21" + "f21f20f11f20f21f6a21f31f20f21f20f31f6a21f41f20f31f20f41f6a21f51f20f41f20f51f6a21f61f20f51f20f61f6a21f71f20f61f20f7" + "1f6a21f81f20f71f20f81f6a21f91f20f81f20f91f6a21fa1f20f91f20fa1f6a21fb1f20fa1f20fb1f6a21fc1f20fb1f20fc1f6a21fd1f20fc" + "1f20fd1f6a21fe1f20fd1f20fe1f6a21ff1f20fe1f20ff1f6a21802020ff1f2080206a2181202080202081206a2182202081202082206a2183" + "202082202083206a2184202083202084206a2185202084202085206a2186202085202086206a2187202086202087206a218820208720208820" + "6a2189202088202089206a218a20208920208a206a218b20208a20208b206a218c20208b20208c206a218d20208c20208d206a218e20208d20" + "208e206a218f20208e20208f206a219020208f202090206a2191202090202091206a2192202091202092206a2193202092202093206a219420" + "2093202094206a2195202094202095206a2196202095202096206a2197202096202097206a2198202097202098206a2199202098202099206a" + "219a20209920209a206a219b20209a20209b206a219c20209b20209c206a219d20209c20209d206a219e20209d20209e206a219f20209e2020" + "9f206a21a020209f2020a0206a21a12020a02020a1206a21a22020a12020a2206a21a32020a22020a3206a21a42020a32020a4206a21a52020" + "a42020a5206a21a62020a52020a6206a21a72020a62020a7206a21a82020a72020a8206a21a92020a82020a9206a21aa2020a92020aa206a21" + "ab2020aa2020ab206a21ac2020ab2020ac206a21ad2020ac2020ad206a21ae2020ad2020ae206a21af2020ae2020af206a21b02020af2020b0" + "206a21b12020b02020b1206a21b22020b12020b2206a21b32020b22020b3206a21b42020b32020b4206a21b52020b42020b5206a21b62020b5" + "2020b6206a21b72020b62020b7206a21b82020b72020b8206a21b92020b82020b9206a21ba2020b92020ba206a21bb2020ba2020bb206a21bc" + "2020bb2020bc206a21bd2020bc2020bd206a21be2020bd2020be206a21bf2020be2020bf206a21c02020bf2020c0206a21c12020c02020c120" + "6a21c22020c12020c2206a21c32020c22020c3206a21c42020c32020c4206a21c52020c42020c5206a21c62020c52020c6206a21c72020c620" + "20c7206a21c82020c72020c8206a21c92020c82020c9206a21ca2020c92020ca206a21cb2020ca2020cb206a21cc2020cb2020cc206a21cd20" + "20cc2020cd206a21ce2020cd2020ce206a21cf2020ce2020cf206a21d02020cf2020d0206a21d12020d02020d1206a21d22020d12020d2206a" + "21d32020d22020d3206a21d42020d32020d4206a21d52020d42020d5206a21d62020d52020d6206a21d72020d62020d7206a21d82020d72020" + "d8206a21d92020d82020d9206a21da2020d92020da206a21db2020da2020db206a21dc2020db2020dc206a21dd2020dc2020dd206a21de2020" + "dd2020de206a21df2020de2020df206a21e02020df2020e0206a21e12020e02020e1206a21e22020e12020e2206a21e32020e22020e3206a21" + "e42020e32020e4206a21e52020e42020e5206a21e62020e52020e6206a21e72020e62020e7206a21e82020e72020e8206a21e92020e82020e9" + "206a21ea2020e92020ea206a21eb2020ea2020eb206a21ec2020eb2020ec206a21ed2020ec2020ed206a21ee2020ed2020ee206a21ef2020ee" + "2020ef206a21f02020ef2020f0206a21f12020f02020f1206a21f22020f12020f2206a21f32020f22020f3206a21f42020f32020f4206a21f5" + "2020f42020f5206a21f62020f52020f6206a21f72020f62020f7206a21f82020f72020f8206a21f92020f82020f9206a21fa2020f92020fa20" + "6a21fb2020fa2020fb206a21fc2020fb2020fc206a21fd2020fc2020fd206a21fe2020fd2020fe206a21ff2020fe2020ff206a21802120ff20" + "2080216a2181212080212081216a2182212081212082216a2183212082212083216a2184212083212084216a2185212084212085216a218621" + "2085212086216a2187212086212087216a2188212087212088216a2189212088212089216a218a21208921208a216a218b21208a21208b216a" + "218c21208b21208c216a218d21208c21208d216a218e21208d21208e216a218f21208e21208f216a219021208f212090216a21912120902120" + "91216a2192212091212092216a2193212092212093216a2194212093212094216a2195212094212095216a2196212095212096216a21972120" + "96212097216a2198212097212098216a2199212098212099216a219a21209921209a216a219b21209a21209b216a219c21209b21209c216a21" + "9d21209c21209d216a219e21209d21209e216a219f21209e21209f216a21a021209f2120a0216a21a12120a02120a1216a21a22120a12120a2" + "216a21a32120a22120a3216a21a42120a32120a4216a21a52120a42120a5216a21a62120a52120a6216a21a72120a62120a7216a21a82120a7" + "2120a8216a21a92120a82120a9216a21aa2120a92120aa216a21ab2120aa2120ab216a21ac2120ab2120ac216a21ad2120ac2120ad216a21ae" + "2120ad2120ae216a21af2120ae2120af216a21b02120af2120b0216a21b12120b02120b1216a21b22120b12120b2216a21b32120b22120b321" + "6a21b42120b32120b4216a21b52120b42120b5216a21b62120b52120b6216a21b72120b62120b7216a21b82120b72120b8216a21b92120b821" + "20b9216a21ba2120b92120ba216a21bb2120ba2120bb216a21bc2120bb2120bc216a21bd2120bc2120bd216a21be2120bd2120be216a21bf21" + "20be2120bf216a21c02120bf2120c0216a21c12120c02120c1216a21c22120c12120c2216a21c32120c22120c3216a21c42120c32120c4216a" + "21c52120c42120c5216a21c62120c52120c6216a21c72120c62120c7216a21c82120c72120c8216a21c92120c82120c9216a21ca2120c92120" + "ca216a21cb2120ca2120cb216a21cc2120cb2120cc216a21cd2120cc2120cd216a21ce2120cd2120ce216a21cf2120ce2120cf216a21d02120" + "cf2120d0216a21d12120d02120d1216a21d22120d12120d2216a21d32120d22120d3216a21d42120d32120d4216a21d52120d42120d5216a21" + "d62120d52120d6216a21d72120d62120d7216a21d82120d72120d8216a21d92120d82120d9216a21da2120d92120da216a21db2120da2120db" + "216a21dc2120db2120dc216a21dd2120dc2120dd216a21de2120dd2120de216a21df2120de2120df216a21e02120df2120e0216a21e12120e0" + "2120e1216a21e22120e12120e2216a21e32120e22120e3216a21e42120e32120e4216a21e52120e42120e5216a21e62120e52120e6216a21e7" + "2120e62120e7216a21e82120e72120e8216a21e92120e82120e9216a21ea2120e92120ea216a21eb2120ea2120eb216a21ec2120eb2120ec21" + "6a21ed2120ec2120ed216a21ee2120ed2120ee216a21ef2120ee2120ef216a21f02120ef2120f0216a21f12120f02120f1216a21f22120f121" + "20f2216a21f32120f22120f3216a21f42120f32120f4216a21f52120f42120f5216a21f62120f52120f6216a21f72120f62120f7216a21f821" + "20f72120f8216a21f92120f82120f9216a21fa2120f92120fa216a21fb2120fa2120fb216a21fc2120fb2120fc216a21fd2120fc2120fd216a" + "21fe2120fd2120fe216a21ff2120fe2120ff216a21802220ff212080226a2181222080222081226a2182222081222082226a21832220822220" + "83226a2184222083222084226a2185222084222085226a2186222085222086226a2187222086222087226a2188222087222088226a21892220" + "88222089226a218a22208922208a226a218b22208a22208b226a218c22208b22208c226a218d22208c22208d226a218e22208d22208e226a21" + "8f22208e22208f226a219022208f222090226a2191222090222091226a2192222091222092226a2193222092222093226a2194222093222094" + "226a2195222094222095226a2196222095222096226a2197222096222097226a2198222097222098226a2199222098222099226a219a222099" + "22209a226a219b22209a22209b226a219c22209b22209c226a219d22209c22209d226a219e22209d22209e226a219f22209e22209f226a21a0" + "22209f2220a0226a21a12220a02220a1226a21a22220a12220a2226a21a32220a22220a3226a21a42220a32220a4226a21a52220a42220a522" + "6a21a62220a52220a6226a21a72220a62220a7226a21a82220a72220a8226a21a92220a82220a9226a21aa2220a92220aa226a21ab2220aa22" + "20ab226a21ac2220ab2220ac226a21ad2220ac2220ad226a21ae2220ad2220ae226a21af2220ae2220af226a21b02220af2220b0226a21b122" + "20b02220b1226a21b22220b12220b2226a21b32220b22220b3226a21b42220b32220b4226a21b52220b42220b5226a21b62220b52220b6226a" + "21b72220b62220b7226a21b82220b72220b8226a21b92220b82220b9226a21ba2220b92220ba226a21bb2220ba2220bb226a21bc2220bb2220" + "bc226a21bd2220bc2220bd226a21be2220bd2220be226a21bf2220be2220bf226a21c02220bf2220c0226a21c12220c02220c1226a21c22220" + "c12220c2226a21c32220c22220c3226a21c42220c32220c4226a21c52220c42220c5226a21c62220c52220c6226a21c72220c62220c7226a21" + "c82220c72220c8226a21c92220c82220c9226a21ca2220c92220ca226a21cb2220ca2220cb226a21cc2220cb2220cc226a21cd2220cc2220cd" + "226a21ce2220cd2220ce226a21cf2220ce2220cf226a21d02220cf2220d0226a21d12220d02220d1226a21d22220d12220d2226a21d32220d2" + "2220d3226a21d42220d32220d4226a21d52220d42220d5226a21d62220d52220d6226a21d72220d62220d7226a21d82220d72220d8226a21d9" + "2220d82220d9226a21da2220d92220da226a21db2220da2220db226a21dc2220db2220dc226a21dd2220dc2220dd226a21de2220dd2220de22" + "6a21df2220de2220df226a21e02220df2220e0226a21e12220e02220e1226a21e22220e12220e2226a21e32220e22220e3226a21e42220e322" + "20e4226a21e52220e42220e5226a21e62220e52220e6226a21e72220e62220e7226a21e82220e72220e8226a21e92220e82220e9226a21ea22" + "20e92220ea226a21eb2220ea2220eb226a21ec2220eb2220ec226a21ed2220ec2220ed226a21ee2220ed2220ee226a21ef2220ee2220ef226a" + "21f02220ef2220f0226a21f12220f02220f1226a21f22220f12220f2226a21f32220f22220f3226a21f42220f32220f4226a21f52220f42220" + "f5226a21f62220f52220f6226a21f72220f62220f7226a21f82220f72220f8226a21f92220f82220f9226a21fa2220f92220fa226a21fb2220" + "fa2220fb226a21fc2220fb2220fc226a21fd2220fc2220fd226a21fe2220fd2220fe226a21ff2220fe2220ff226a21802320ff222080236a21" + "81232080232081236a2182232081232082236a2183232082232083236a2184232083232084236a2185232084232085236a2186232085232086" + "236a2187232086232087236a2188232087232088236a2189232088232089236a218a23208923208a236a218b23208a23208b236a218c23208b" + "23208c236a218d23208c23208d236a218e23208d23208e236a218f23208e23208f236a219023208f232090236a2191232090232091236a2192" + "232091232092236a2193232092232093236a2194232093232094236a2195232094232095236a2196232095232096236a219723209623209723" + "6a2198232097232098236a2199232098232099236a219a23209923209a236a219b23209a23209b236a219c23209b23209c236a219d23209c23" + "209d236a219e23209d23209e236a219f23209e23209f236a21a023209f2320a0236a21a12320a02320a1236a21a22320a12320a2236a21a323" + "20a22320a3236a21a42320a32320a4236a21a52320a42320a5236a21a62320a52320a6236a21a72320a62320a7236a21a82320a72320a8236a" + "21a92320a82320a9236a21aa2320a92320aa236a21ab2320aa2320ab236a21ac2320ab2320ac236a21ad2320ac2320ad236a21ae2320ad2320" + "ae236a21af2320ae2320af236a21b02320af2320b0236a21b12320b02320b1236a21b22320b12320b2236a21b32320b22320b3236a21b42320" + "b32320b4236a21b52320b42320b5236a21b62320b52320b6236a21b72320b62320b7236a21b82320b72320b8236a21b92320b82320b9236a21" + "ba2320b92320ba236a21bb2320ba2320bb236a21bc2320bb2320bc236a21bd2320bc2320bd236a21be2320bd2320be236a21bf2320be2320bf" + "236a21c02320bf2320c0236a21c12320c02320c1236a21c22320c12320c2236a21c32320c22320c3236a21c42320c32320c4236a21c52320c4" + "2320c5236a21c62320c52320c6236a21c72320c62320c7236a21c82320c72320c8236a21c92320c82320c9236a21ca2320c92320ca236a21cb" + "2320ca2320cb236a21cc2320cb2320cc236a21cd2320cc2320cd236a21ce2320cd2320ce236a21cf2320ce2320cf236a21d02320cf2320d023" + "6a21d12320d02320d1236a21d22320d12320d2236a21d32320d22320d3236a21d42320d32320d4236a21d52320d42320d5236a21d62320d523" + "20d6236a21d72320d62320d7236a21d82320d72320d8236a21d92320d82320d9236a21da2320d92320da236a21db2320da2320db236a21dc23" + "20db2320dc236a21dd2320dc2320dd236a21de2320dd2320de236a21df2320de2320df236a21e02320df2320e0236a21e12320e02320e1236a" + "21e22320e12320e2236a21e32320e22320e3236a21e42320e32320e4236a21e52320e42320e5236a21e62320e52320e6236a21e72320e62320" + "e7236a21e82320e72320e8236a21e92320e82320e9236a21ea2320e92320ea236a21eb2320ea2320eb236a21ec2320eb2320ec236a21ed2320" + "ec2320ed236a21ee2320ed2320ee236a21ef2320ee2320ef236a21f02320ef2320f0236a21f12320f02320f1236a21f22320f12320f2236a21" + "f32320f22320f3236a21f42320f32320f4236a21f52320f42320f5236a21f62320f52320f6236a21f72320f62320f7236a21f82320f72320f8" + "236a21f92320f82320f9236a21fa2320f92320fa236a21fb2320fa2320fb236a21fc2320fb2320fc236a21fd2320fc2320fd236a21fe2320fd" + "2320fe236a21ff2320fe2320ff236a21802420ff232080246a2181242080242081246a2182242081242082246a2183242082242083246a2184" + "242083242084246a2185242084242085246a2186242085242086246a2187242086242087246a2188242087242088246a218924208824208924" + "6a218a24208924208a246a218b24208a24208b246a218c24208b24208c246a218d24208c24208d246a218e24208d24208e246a218f24208e24" + "208f246a219024208f242090246a2191242090242091246a2192242091242092246a2193242092242093246a2194242093242094246a219524" + "2094242095246a2196242095242096246a2197242096242097246a2198242097242098246a2199242098242099246a219a24209924209a246a" + "219b24209a24209b246a219c24209b24209c246a219d24209c24209d246a219e24209d24209e246a219f24209e24209f246a21a024209f2420" + "a0246a21a12420a02420a1246a21a22420a12420a2246a21a32420a22420a3246a21a42420a32420a4246a21a52420a42420a5246a21a62420" + "a52420a6246a21a72420a62420a7246a21a82420a72420a8246a21a92420a82420a9246a21aa2420a92420aa246a21ab2420aa2420ab246a21" + "ac2420ab2420ac246a21ad2420ac2420ad246a21ae2420ad2420ae246a21af2420ae2420af246a21b02420af2420b0246a21b12420b02420b1" + "246a21b22420b12420b2246a21b32420b22420b3246a21b42420b32420b4246a21b52420b42420b5246a21b62420b52420b6246a21b72420b6" + "2420b7246a21b82420b72420b8246a21b92420b82420b9246a21ba2420b92420ba246a21bb2420ba2420bb246a21bc2420bb2420bc246a21bd" + "2420bc2420bd246a21be2420bd2420be246a21bf2420be2420bf246a21c02420bf2420c0246a21c12420c02420c1246a21c22420c12420c224" + "6a21c32420c22420c3246a21c42420c32420c4246a21c52420c42420c5246a21c62420c52420c6246a21c72420c62420c7246a21c82420c724" + "20c8246a21c92420c82420c9246a21ca2420c92420ca246a21cb2420ca2420cb246a21cc2420cb2420cc246a21cd2420cc2420cd246a21ce24" + "20cd2420ce246a21cf2420ce2420cf246a21d02420cf2420d0246a21d12420d02420d1246a21d22420d12420d2246a21d32420d22420d3246a" + "21d42420d32420d4246a21d52420d42420d5246a21d62420d52420d6246a21d72420d62420d7246a21d82420d72420d8246a21d92420d82420" + "d9246a21da2420d92420da246a21db2420da2420db246a21dc2420db2420dc246a21dd2420dc2420dd246a21de2420dd2420de246a21df2420" + "de2420df246a21e02420df2420e0246a21e12420e02420e1246a21e22420e12420e2246a21e32420e22420e3246a21e42420e32420e4246a21" + "e52420e42420e5246a21e62420e52420e6246a21e72420e62420e7246a21e82420e72420e8246a21e92420e82420e9246a21ea2420e92420ea" + "246a21eb2420ea2420eb246a21ec2420eb2420ec246a21ed2420ec2420ed246a21ee2420ed2420ee246a21ef2420ee2420ef246a21f02420ef" + "2420f0246a21f12420f02420f1246a21f22420f12420f2246a21f32420f22420f3246a21f42420f32420f4246a21f52420f42420f5246a21f6" + "2420f52420f6246a21f72420f62420f7246a21f82420f72420f8246a21f92420f82420f9246a21fa2420f92420fa246a21fb2420fa2420fb24" + "6a21fc2420fb2420fc246a21fd2420fc2420fd246a21fe2420fd2420fe246a21ff2420fe2420ff246a21802520ff242080256a218125208025" + "2081256a2182252081252082256a2183252082252083256a2184252083252084256a2185252084252085256a2186252085252086256a218725" + "2086252087256a2188252087252088256a2189252088252089256a218a25208925208a256a218b25208a25208b256a218c25208b25208c256a" + "218d25208c25208d256a218e25208d25208e256a218f25208e25208f256a219025208f252090256a2191252090252091256a21922520912520" + "92256a2193252092252093256a2194252093252094256a2195252094252095256a2196252095252096256a2197252096252097256a21982520" + "97252098256a2199252098252099256a219a25209925209a256a219b25209a25209b256a219c25209b25209c256a219d25209c25209d256a21" + "9e25209d25209e256a219f25209e25209f256a21a025209f2520a0256a21a12520a02520a1256a21a22520a12520a2256a21a32520a22520a3" + "256a21a42520a32520a4256a21a52520a42520a5256a21a62520a52520a6256a21a72520a62520a7256a21a82520a72520a8256a21a92520a8" + "2520a9256a21aa2520a92520aa256a21ab2520aa2520ab256a21ac2520ab2520ac256a21ad2520ac2520ad256a21ae2520ad2520ae256a21af" + "2520ae2520af256a21b02520af2520b0256a21b12520b02520b1256a21b22520b12520b2256a21b32520b22520b3256a21b42520b32520b425" + "6a21b52520b42520b5256a21b62520b52520b6256a21b72520b62520b7256a21b82520b72520b8256a21b92520b82520b9256a21ba2520b925" + "20ba256a21bb2520ba2520bb256a21bc2520bb2520bc256a21bd2520bc2520bd256a21be2520bd2520be256a21bf2520be2520bf256a21c025" + "20bf2520c0256a21c12520c02520c1256a21c22520c12520c2256a21c32520c22520c3256a21c42520c32520c4256a21c52520c42520c5256a" + "21c62520c52520c6256a21c72520c62520c7256a21c82520c72520c8256a21c92520c82520c9256a21ca2520c92520ca256a21cb2520ca2520" + "cb256a21cc2520cb2520cc256a21cd2520cc2520cd256a21ce2520cd2520ce256a21cf2520ce2520cf256a21d02520cf2520d0256a21d12520" + "d02520d1256a21d22520d12520d2256a21d32520d22520d3256a21d42520d32520d4256a21d52520d42520d5256a21d62520d52520d6256a21" + "d72520d62520d7256a21d82520d72520d8256a21d92520d82520d9256a21da2520d92520da256a21db2520da2520db256a21dc2520db2520dc" + "256a21dd2520dc2520dd256a21de2520dd2520de256a21df2520de2520df256a21e02520df2520e0256a21e12520e02520e1256a21e22520e1" + "2520e2256a21e32520e22520e3256a21e42520e32520e4256a21e52520e42520e5256a21e62520e52520e6256a21e72520e62520e7256a21e8" + "2520e72520e8256a21e92520e82520e9256a21ea2520e92520ea256a21eb2520ea2520eb256a21ec2520eb2520ec256a21ed2520ec2520ed25" + "6a21ee2520ed2520ee256a21ef2520ee2520ef256a21f02520ef2520f0256a21f12520f02520f1256a21f22520f12520f2256a21f32520f225" + "20f3256a21f42520f32520f4256a21f52520f42520f5256a21f62520f52520f6256a21f72520f62520f7256a21f82520f72520f8256a21f925" + "20f82520f9256a21fa2520f92520fa256a21fb2520fa2520fb256a21fc2520fb2520fc256a21fd2520fc2520fd256a21fe2520fd2520fe256a" + "21ff2520fe2520ff256a21802620ff252080266a2181262080262081266a2182262081262082266a2183262082262083266a21842620832620" + "84266a2185262084262085266a2186262085262086266a2187262086262087266a2188262087262088266a2189262088262089266a218a2620" + "8926208a266a218b26208a26208b266a218c26208b26208c266a218d26208c26208d266a218e26208d26208e266a218f26208e26208f266a21" + "9026208f262090266a2191262090262091266a2192262091262092266a2193262092262093266a2194262093262094266a2195262094262095" + "266a2196262095262096266a2197262096262097266a2198262097262098266a2199262098262099266a219a26209926209a266a219b26209a" + "26209b266a219c26209b26209c266a219d26209c26209d266a219e26209d26209e266a219f26209e26209f266a21a026209f2620a0266a21a1" + "2620a02620a1266a21a22620a12620a2266a21a32620a22620a3266a21a42620a32620a4266a21a52620a42620a5266a21a62620a52620a626" + "6a21a72620a62620a7266a21a82620a72620a8266a21a92620a82620a9266a21aa2620a92620aa266a21ab2620aa2620ab266a21ac2620ab26" + "20ac266a21ad2620ac2620ad266a21ae2620ad2620ae266a21af2620ae2620af266a21b02620af2620b0266a21b12620b02620b1266a21b226" + "20b12620b2266a21b32620b22620b3266a21b42620b32620b4266a21b52620b42620b5266a21b62620b52620b6266a21b72620b62620b7266a" + "21b82620b72620b8266a21b92620b82620b9266a21ba2620b92620ba266a21bb2620ba2620bb266a21bc2620bb2620bc266a21bd2620bc2620" + "bd266a21be2620bd2620be266a21bf2620be2620bf266a21c02620bf2620c0266a21c12620c02620c1266a21c22620c12620c2266a21c32620" + "c22620c3266a21c42620c32620c4266a21c52620c42620c5266a21c62620c52620c6266a21c72620c62620c7266a21c82620c72620c8266a21" + "c92620c82620c9266a21ca2620c92620ca266a21cb2620ca2620cb266a21cc2620cb2620cc266a21cd2620cc2620cd266a21ce2620cd2620ce" + "266a21cf2620ce2620cf266a21d02620cf2620d0266a21d12620d02620d1266a21d22620d12620d2266a21d32620d22620d3266a21d42620d3" + "2620d4266a21d52620d42620d5266a21d62620d52620d6266a21d72620d62620d7266a21d82620d72620d8266a21d92620d82620d9266a21da" + "2620d92620da266a21db2620da2620db266a21dc2620db2620dc266a21dd2620dc2620dd266a21de2620dd2620de266a21df2620de2620df26" + "6a21e02620df2620e0266a21e12620e02620e1266a21e22620e12620e2266a21e32620e22620e3266a21e42620e32620e4266a21e52620e426" + "20e5266a21e62620e52620e6266a21e72620e62620e7266a21e82620e72620e8266a21e92620e82620e9266a21ea2620e92620ea266a21eb26" + "20ea2620eb266a21ec2620eb2620ec266a21ed2620ec2620ed266a21ee2620ed2620ee266a21ef2620ee2620ef266a21f02620ef2620f0266a" + "21f12620f02620f1266a21f22620f12620f2266a21f32620f22620f3266a21f42620f32620f4266a21f52620f42620f5266a21f62620f52620" + "f6266a21f72620f62620f7266a21f82620f72620f8266a21f92620f82620f9266a21fa2620f92620fa266a21fb2620fa2620fb266a21fc2620" + "fb2620fc266a21fd2620fc2620fd266a21fe2620fd2620fe266a21ff2620fe2620ff266a21802720ff262080276a2181272080272081276a21" + "82272081272082276a2183272082272083276a2184272083272084276a2185272084272085276a2186272085272086276a2187272086272087" + "276a2188272087272088276a2189272088272089276a218a27208927208a276a218b27208a27208b276a218c27208b27208c276a218d27208c" + "27208d276a218e27208d27208e276a218f27208e27208f276a219027208f272090276a2191272090272091276a2192272091272092276a2193" + "272092272093276a2194272093272094276a2195272094272095276a2196272095272096276a2197272096272097276a219827209727209827" + "6a2199272098272099276a219a27209927209a276a219b27209a27209b276a219c27209b27209c276a219d27209c27209d276a219e27209d27" + "209e276a219f27209e27209f276a21a027209f2720a0276a21a12720a02720a1276a21a22720a12720a2276a21a32720a22720a3276a21a427" + "20a32720a4276a21a52720a42720a5276a21a62720a52720a6276a21a72720a62720a7276a21a82720a72720a8276a21a92720a82720a9276a" + "21aa2720a92720aa276a21ab2720aa2720ab276a21ac2720ab2720ac276a21ad2720ac2720ad276a21ae2720ad2720ae276a21af2720ae2720" + "af276a21b02720af2720b0276a21b12720b02720b1276a21b22720b12720b2276a21b32720b22720b3276a21b42720b32720b4276a21b52720" + "b42720b5276a21b62720b52720b6276a21b72720b62720b7276a21b82720b72720b8276a21b92720b82720b9276a21ba2720b92720ba276a21" + "bb2720ba2720bb276a21bc2720bb2720bc276a21bd2720bc2720bd276a21be2720bd2720be276a21bf2720be2720bf276a21c02720bf2720c0" + "276a21c12720c02720c1276a21c22720c12720c2276a21c32720c22720c3276a21c42720c32720c4276a21c52720c42720c5276a21c62720c5" + "2720c6276a21c72720c62720c7276a21c82720c72720c8276a21c92720c82720c9276a21ca2720c92720ca276a21cb2720ca2720cb276a21cc" + "2720cb2720cc276a21cd2720cc2720cd276a21ce2720cd2720ce276a21cf2720ce2720cf276a21d02720cf2720d0276a21d12720d02720d127" + "6a21d22720d12720d2276a21d32720d22720d3276a21d42720d32720d4276a21d52720d42720d5276a21d62720d52720d6276a21d72720d627" + "20d7276a21d82720d72720d8276a21d92720d82720d9276a21da2720d92720da276a21db2720da2720db276a21dc2720db2720dc276a21dd27" + "20dc2720dd276a21de2720dd2720de276a21df2720de2720df276a21e02720df2720e0276a21e12720e02720e1276a21e22720e12720e2276a" + "21e32720e22720e3276a21e42720e32720e4276a21e52720e42720e5276a21e62720e52720e6276a21e72720e62720e7276a21e82720e72720" + "e8276a21e92720e82720e9276a21ea2720e92720ea276a21eb2720ea2720eb276a21ec2720eb2720ec276a21ed2720ec2720ed276a21ee2720" + "ed2720ee276a21ef2720ee2720ef276a21f02720ef2720f0276a21f12720f02720f1276a21f22720f12720f2276a21f32720f22720f3276a21" + "f42720f32720f4276a21f52720f42720f5276a21f62720f52720f6276a21f72720f62720f7276a21f82720f72720f8276a21f92720f82720f9" + "276a21fa2720f92720fa276a21fb2720fa2720fb276a21fc2720fb2720fc276a21fd2720fc2720fd276a21fe2720fd2720fe276a21ff2720fe" + "2720ff276a21802820ff272080286a2181282080282081286a2182282081282082286a2183282082282083286a2184282083282084286a2185" + "282084282085286a2186282085282086286a2187282086282087286a2188282087282088286a2189282088282089286a218a28208928208a28" + "6a218b28208a28208b286a218c28208b28208c286a218d28208c28208d286a218e28208d28208e286a218f28208e28208f286a219028208f28" + "2090286a2191282090282091286a2192282091282092286a2193282092282093286a2194282093282094286a2195282094282095286a219628" + "2095282096286a2197282096282097286a2198282097282098286a2199282098282099286a219a28209928209a286a219b28209a28209b286a" + "219c28209b28209c286a219d28209c28209d286a219e28209d28209e286a219f28209e28209f286a21a028209f2820a0286a21a12820a02820" + "a1286a21a22820a12820a2286a21a32820a22820a3286a21a42820a32820a4286a21a52820a42820a5286a21a62820a52820a6286a21a72820" + "a62820a7286a21a82820a72820a8286a21a92820a82820a9286a21aa2820a92820aa286a21ab2820aa2820ab286a21ac2820ab2820ac286a21" + "ad2820ac2820ad286a21ae2820ad2820ae286a21af2820ae2820af286a21b02820af2820b0286a21b12820b02820b1286a21b22820b12820b2" + "286a21b32820b22820b3286a21b42820b32820b4286a21b52820b42820b5286a21b62820b52820b6286a21b72820b62820b7286a21b82820b7" + "2820b8286a21b92820b82820b9286a21ba2820b92820ba286a21bb2820ba2820bb286a21bc2820bb2820bc286a21bd2820bc2820bd286a21be" + "2820bd2820be286a21bf2820be2820bf286a21c02820bf2820c0286a21c12820c02820c1286a21c22820c12820c2286a21c32820c22820c328" + "6a21c42820c32820c4286a21c52820c42820c5286a21c62820c52820c6286a21c72820c62820c7286a21c82820c72820c8286a21c92820c828" + "20c9286a21ca2820c92820ca286a21cb2820ca2820cb286a21cc2820cb2820cc286a21cd2820cc2820cd286a21ce2820cd2820ce286a21cf28" + "20ce2820cf286a21d02820cf2820d0286a21d12820d02820d1286a21d22820d12820d2286a21d32820d22820d3286a21d42820d32820d4286a" + "21d52820d42820d5286a21d62820d52820d6286a21d72820d62820d7286a21d82820d72820d8286a21d92820d82820d9286a21da2820d92820" + "da286a21db2820da2820db286a21dc2820db2820dc286a21dd2820dc2820dd286a21de2820dd2820de286a21df2820de2820df286a21e02820" + "df2820e0286a21e12820e02820e1286a21e22820e12820e2286a21e32820e22820e3286a21e42820e32820e4286a21e52820e42820e5286a21" + "e62820e52820e6286a21e72820e62820e7286a21e82820e72820e8286a21e92820e82820e9286a21ea2820e92820ea286a21eb2820ea2820eb" + "286a21ec2820eb2820ec286a21ed2820ec2820ed286a21ee2820ed2820ee286a21ef2820ee2820ef286a21f02820ef2820f0286a21f12820f0" + "2820f1286a21f22820f12820f2286a21f32820f22820f3286a21f42820f32820f4286a21f52820f42820f5286a21f62820f52820f6286a21f7" + "2820f62820f7286a21f82820f72820f8286a21f92820f82820f9286a21fa2820f92820fa286a21fb2820fa2820fb286a21fc2820fb2820fc28" + "6a21fd2820fc2820fd286a21fe2820fd2820fe286a21ff2820fe2820ff286a21802920ff282080296a2181292080292081296a218229208129" + "2082296a2183292082292083296a2184292083292084296a2185292084292085296a2186292085292086296a2187292086292087296a218829" + "2087292088296a2189292088292089296a218a29208929208a296a218b29208a29208b296a218c29208b29208c296a218d29208c29208d296a" + "218e29208d29208e296a218f29208e29208f296a219029208f292090296a2191292090292091296a2192292091292092296a21932920922920" + "93296a2194292093292094296a2195292094292095296a2196292095292096296a2197292096292097296a2198292097292098296a21992920" + "98292099296a219a29209929209a296a219b29209a29209b296a219c29209b29209c296a219d29209c29209d296a219e29209d29209e296a21" + "9f29209e29209f296a21a029209f2920a0296a21a12920a02920a1296a21a22920a12920a2296a21a32920a22920a3296a21a42920a32920a4" + "296a21a52920a42920a5296a21a62920a52920a6296a21a72920a62920a7296a21a82920a72920a8296a21a92920a82920a9296a21aa2920a9" + "2920aa296a21ab2920aa2920ab296a21ac2920ab2920ac296a21ad2920ac2920ad296a21ae2920ad2920ae296a21af2920ae2920af296a21b0" + "2920af2920b0296a21b12920b02920b1296a21b22920b12920b2296a21b32920b22920b3296a21b42920b32920b4296a21b52920b42920b529" + "6a21b62920b52920b6296a21b72920b62920b7296a21b82920b72920b8296a21b92920b82920b9296a21ba2920b92920ba296a21bb2920ba29" + "20bb296a21bc2920bb2920bc296a21bd2920bc2920bd296a21be2920bd2920be296a21bf2920be2920bf296a21c02920bf2920c0296a21c129" + "20c02920c1296a21c22920c12920c2296a21c32920c22920c3296a21c42920c32920c4296a21c52920c42920c5296a21c62920c52920c6296a" + "21c72920c62920c7296a21c82920c72920c8296a21c92920c82920c9296a21ca2920c92920ca296a21cb2920ca2920cb296a21cc2920cb2920" + "cc296a21cd2920cc2920cd296a21ce2920cd2920ce296a21cf2920ce2920cf296a21d02920cf2920d0296a21d12920d02920d1296a21d22920" + "d12920d2296a21d32920d22920d3296a21d42920d32920d4296a21d52920d42920d5296a21d62920d52920d6296a21d72920d62920d7296a21" + "d82920d72920d8296a21d92920d82920d9296a21da2920d92920da296a21db2920da2920db296a21dc2920db2920dc296a21dd2920dc2920dd" + "296a21de2920dd2920de296a21df2920de2920df296a21e02920df2920e0296a21e12920e02920e1296a21e22920e12920e2296a21e32920e2" + "2920e3296a21e42920e32920e4296a21e52920e42920e5296a21e62920e52920e6296a21e72920e62920e7296a21e82920e72920e8296a21e9" + "2920e82920e9296a21ea2920e92920ea296a21eb2920ea2920eb296a21ec2920eb2920ec296a21ed2920ec2920ed296a21ee2920ed2920ee29" + "6a21ef2920ee2920ef296a21f02920ef2920f0296a21f12920f02920f1296a21f22920f12920f2296a21f32920f22920f3296a21f42920f329" + "20f4296a21f52920f42920f5296a21f62920f52920f6296a21f72920f62920f7296a21f82920f72920f8296a21f92920f82920f9296a21fa29" + "20f92920fa296a21fb2920fa2920fb296a21fc2920fb2920fc296a21fd2920fc2920fd296a21fe2920fd2920fe296a21ff2920fe2920ff296a" + "21802a20ff2920802a6a21812a20802a20812a6a21822a20812a20822a6a21832a20822a20832a6a21842a20832a20842a6a21852a20842a20" + "852a6a21862a20852a20862a6a21872a20862a20872a6a21882a20872a20882a6a21892a20882a20892a6a218a2a20892a208a2a6a218b2a20" + "8a2a208b2a6a218c2a208b2a208c2a6a218d2a208c2a208d2a6a218e2a208d2a208e2a6a218f2a208e2a208f2a6a21902a208f2a20902a6a21" + "912a20902a20912a6a21922a20912a20922a6a21932a20922a20932a6a21942a20932a20942a6a21952a20942a20952a6a21962a20952a2096" + "2a6a21972a20962a20972a6a21982a20972a20982a6a21992a20982a20992a6a219a2a20992a209a2a6a219b2a209a2a209b2a6a219c2a209b" + "2a209c2a6a219d2a209c2a209d2a6a219e2a209d2a209e2a6a219f2a209e2a209f2a6a21a02a209f2a20a02a6a21a12a20a02a20a12a6a21a2" + "2a20a12a20a22a6a21a32a20a22a20a32a6a21a42a20a32a20a42a6a21a52a20a42a20a52a6a21a62a20a52a20a62a6a21a72a20a62a20a72a" + "6a21a82a20a72a20a82a6a21a92a20a82a20a92a6a21aa2a20a92a20aa2a6a21ab2a20aa2a20ab2a6a21ac2a20ab2a20ac2a6a21ad2a20ac2a" + "20ad2a6a21ae2a20ad2a20ae2a6a21af2a20ae2a20af2a6a21b02a20af2a20b02a6a21b12a20b02a20b12a6a21b22a20b12a20b22a6a21b32a" + "20b22a20b32a6a21b42a20b32a20b42a6a21b52a20b42a20b52a6a21b62a20b52a20b62a6a21b72a20b62a20b72a6a21b82a20b72a20b82a6a" + "21b92a20b82a20b92a6a21ba2a20b92a20ba2a6a21bb2a20ba2a20bb2a6a21bc2a20bb2a20bc2a6a21bd2a20bc2a20bd2a6a21be2a20bd2a20" + "be2a6a21bf2a20be2a20bf2a6a21c02a20bf2a20c02a6a21c12a20c02a20c12a6a21c22a20c12a20c22a6a21c32a20c22a20c32a6a21c42a20" + "c32a20c42a6a21c52a20c42a20c52a6a21c62a20c52a20c62a6a21c72a20c62a20c72a6a21c82a20c72a20c82a6a21c92a20c82a20c92a6a21" + "ca2a20c92a20ca2a6a21cb2a20ca2a20cb2a6a21cc2a20cb2a20cc2a6a21cd2a20cc2a20cd2a6a21ce2a20cd2a20ce2a6a21cf2a20ce2a20cf" + "2a6a21d02a20cf2a20d02a6a21d12a20d02a20d12a6a21d22a20d12a20d22a6a21d32a20d22a20d32a6a21d42a20d32a20d42a6a21d52a20d4" + "2a20d52a6a21d62a20d52a20d62a6a21d72a20d62a20d72a6a21d82a20d72a20d82a6a21d92a20d82a20d92a6a21da2a20d92a20da2a6a21db" + "2a20da2a20db2a6a21dc2a20db2a20dc2a6a21dd2a20dc2a20dd2a6a21de2a20dd2a20de2a6a21df2a20de2a20df2a6a21e02a20df2a20e02a" + "6a21e12a20e02a20e12a6a21e22a20e12a20e22a6a21e32a20e22a20e32a6a21e42a20e32a20e42a6a21e52a20e42a20e52a6a21e62a20e52a" + "20e62a6a21e72a20e62a20e72a6a21e82a20e72a20e82a6a21e92a20e82a20e92a6a21ea2a20e92a20ea2a6a21eb2a20ea2a20eb2a6a21ec2a" + "20eb2a20ec2a6a21ed2a20ec2a20ed2a6a21ee2a20ed2a20ee2a6a21ef2a20ee2a20ef2a6a21f02a20ef2a20f02a6a21f12a20f02a20f12a6a" + "21f22a20f12a20f22a6a21f32a20f22a20f32a6a21f42a20f32a20f42a6a21f52a20f42a20f52a6a21f62a20f52a20f62a6a21f72a20f62a20" + "f72a6a21f82a20f72a20f82a6a21f92a20f82a20f92a6a21fa2a20f92a20fa2a6a21fb2a20fa2a20fb2a6a21fc2a20fb2a20fc2a6a21fd2a20" + "fc2a20fd2a6a21fe2a20fd2a20fe2a6a21ff2a20fe2a20ff2a6a21802b20ff2a20802b6a21812b20802b20812b6a21822b20812b20822b6a21" + "832b20822b20832b6a21842b20832b20842b6a21852b20842b20852b6a21862b20852b20862b6a21872b20862b20872b6a21882b20872b2088" + "2b6a21892b20882b20892b6a218a2b20892b208a2b6a218b2b208a2b208b2b6a218c2b208b2b208c2b6a218d2b208c2b208d2b6a218e2b208d" + "2b208e2b6a218f2b208e2b208f2b6a21902b208f2b20902b6a21912b20902b20912b6a21922b20912b20922b6a21932b20922b20932b6a2194" + "2b20932b20942b6a21952b20942b20952b6a21962b20952b20962b6a21972b20962b20972b6a21982b20972b20982b6a21992b20982b20992b" + "6a219a2b20992b209a2b6a219b2b209a2b209b2b6a219c2b209b2b209c2b6a219d2b209c2b209d2b6a219e2b209d2b209e2b6a219f2b209e2b" + "209f2b6a21a02b209f2b20a02b6a21a12b20a02b20a12b6a21a22b20a12b20a22b6a21a32b20a22b20a32b6a21a42b20a32b20a42b6a21a52b" + "20a42b20a52b6a21a62b20a52b20a62b6a21a72b20a62b20a72b6a21a82b20a72b20a82b6a21a92b20a82b20a92b6a21aa2b20a92b20aa2b6a" + "21ab2b20aa2b20ab2b6a21ac2b20ab2b20ac2b6a21ad2b20ac2b20ad2b6a21ae2b20ad2b20ae2b6a21af2b20ae2b20af2b6a21b02b20af2b20" + "b02b6a21b12b20b02b20b12b6a21b22b20b12b20b22b6a21b32b20b22b20b32b6a21b42b20b32b20b42b6a21b52b20b42b20b52b6a21b62b20" + "b52b20b62b6a21b72b20b62b20b72b6a21b82b20b72b20b82b6a21b92b20b82b20b92b6a21ba2b20b92b20ba2b6a21bb2b20ba2b20bb2b6a21" + "bc2b20bb2b20bc2b6a21bd2b20bc2b20bd2b6a21be2b20bd2b20be2b6a21bf2b20be2b20bf2b6a21c02b20bf2b20c02b6a21c12b20c02b20c1" + "2b6a21c22b20c12b20c22b6a21c32b20c22b20c32b6a21c42b20c32b20c42b6a21c52b20c42b20c52b6a21c62b20c52b20c62b6a21c72b20c6" + "2b20c72b6a21c82b20c72b20c82b6a21c92b20c82b20c92b6a21ca2b20c92b20ca2b6a21cb2b20ca2b20cb2b6a21cc2b20cb2b20cc2b6a21cd" + "2b20cc2b20cd2b6a21ce2b20cd2b20ce2b6a21cf2b20ce2b20cf2b6a21d02b20cf2b20d02b6a21d12b20d02b20d12b6a21d22b20d12b20d22b" + "6a21d32b20d22b20d32b6a21d42b20d32b20d42b6a21d52b20d42b20d52b6a21d62b20d52b20d62b6a21d72b20d62b20d72b6a21d82b20d72b" + "20d82b6a21d92b20d82b20d92b6a21da2b20d92b20da2b6a21db2b20da2b20db2b6a21dc2b20db2b20dc2b6a21dd2b20dc2b20dd2b6a21de2b" + "20dd2b20de2b6a21df2b20de2b20df2b6a21e02b20df2b20e02b6a21e12b20e02b20e12b6a21e22b20e12b20e22b6a21e32b20e22b20e32b6a" + "21e42b20e32b20e42b6a21e52b20e42b20e52b6a21e62b20e52b20e62b6a21e72b20e62b20e72b6a21e82b20e72b20e82b6a21e92b20e82b20" + "e92b6a21ea2b20e92b20ea2b6a21eb2b20ea2b20eb2b6a21ec2b20eb2b20ec2b6a21ed2b20ec2b20ed2b6a21ee2b20ed2b20ee2b6a21ef2b20" + "ee2b20ef2b6a21f02b20ef2b20f02b6a21f12b20f02b20f12b6a21f22b20f12b20f22b6a21f32b20f22b20f32b6a21f42b20f32b20f42b6a21" + "f52b20f42b20f52b6a21f62b20f52b20f62b6a21f72b20f62b20f72b6a21f82b20f72b20f82b6a21f92b20f82b20f92b6a21fa2b20f92b20fa" + "2b6a21fb2b20fa2b20fb2b6a21fc2b20fb2b20fc2b6a21fd2b20fc2b20fd2b6a21fe2b20fd2b20fe2b6a21ff2b20fe2b20ff2b6a21802c20ff" + "2b20802c6a21812c20802c20812c6a21822c20812c20822c6a21832c20822c20832c6a21842c20832c20842c6a21852c20842c20852c6a2186" + "2c20852c20862c6a21872c20862c20872c6a21882c20872c20882c6a21892c20882c20892c6a218a2c20892c208a2c6a218b2c208a2c208b2c" + "6a218c2c208b2c208c2c6a218d2c208c2c208d2c6a218e2c208d2c208e2c6a218f2c208e2c208f2c6a21902c208f2c20902c6a21912c20902c" + "20912c6a21922c20912c20922c6a21932c20922c20932c6a21942c20932c20942c6a21952c20942c20952c6a21962c20952c20962c6a21972c" + "20962c20972c6a21982c20972c20982c6a21992c20982c20992c6a219a2c20992c209a2c6a219b2c209a2c209b2c6a219c2c209b2c209c2c6a" + "219d2c209c2c209d2c6a219e2c209d2c209e2c6a219f2c209e2c209f2c6a21a02c209f2c20a02c6a21a12c20a02c20a12c6a21a22c20a12c20" + "a22c6a21a32c20a22c20a32c6a21a42c20a32c20a42c6a21a52c20a42c20a52c6a21a62c20a52c20a62c6a21a72c20a62c20a72c6a21a82c20" + "a72c20a82c6a21a92c20a82c20a92c6a21aa2c20a92c20aa2c6a21ab2c20aa2c20ab2c6a21ac2c20ab2c20ac2c6a21ad2c20ac2c20ad2c6a21" + "ae2c20ad2c20ae2c6a21af2c20ae2c20af2c6a21b02c20af2c20b02c6a21b12c20b02c20b12c6a21b22c20b12c20b22c6a21b32c20b22c20b3" + "2c6a21b42c20b32c20b42c6a21b52c20b42c20b52c6a21b62c20b52c20b62c6a21b72c20b62c20b72c6a21b82c20b72c20b82c6a21b92c20b8" + "2c20b92c6a21ba2c20b92c20ba2c6a21bb2c20ba2c20bb2c6a21bc2c20bb2c20bc2c6a21bd2c20bc2c20bd2c6a21be2c20bd2c20be2c6a21bf" + "2c20be2c20bf2c6a21c02c20bf2c20c02c6a21c12c20c02c20c12c6a21c22c20c12c20c22c6a21c32c20c22c20c32c6a21c42c20c32c20c42c" + "6a21c52c20c42c20c52c6a21c62c20c52c20c62c6a21c72c20c62c20c72c6a21c82c20c72c20c82c6a21c92c20c82c20c92c6a21ca2c20c92c" + "20ca2c6a21cb2c20ca2c20cb2c6a21cc2c20cb2c20cc2c6a21cd2c20cc2c20cd2c6a21ce2c20cd2c20ce2c6a21cf2c20ce2c20cf2c6a21d02c" + "20cf2c20d02c6a21d12c20d02c20d12c6a21d22c20d12c20d22c6a21d32c20d22c20d32c6a21d42c20d32c20d42c6a21d52c20d42c20d52c6a" + "21d62c20d52c20d62c6a21d72c20d62c20d72c6a21d82c20d72c20d82c6a21d92c20d82c20d92c6a21da2c20d92c20da2c6a21db2c20da2c20" + "db2c6a21dc2c20db2c20dc2c6a21dd2c20dc2c20dd2c6a21de2c20dd2c20de2c6a21df2c20de2c20df2c6a21e02c20df2c20e02c6a21e12c20" + "e02c20e12c6a21e22c20e12c20e22c6a21e32c20e22c20e32c6a21e42c20e32c20e42c6a21e52c20e42c20e52c6a21e62c20e52c20e62c6a21" + "e72c20e62c20e72c6a21e82c20e72c20e82c6a21e92c20e82c20e92c6a21ea2c20e92c20ea2c6a21eb2c20ea2c20eb2c6a21ec2c20eb2c20ec" + "2c6a21ed2c20ec2c20ed2c6a21ee2c20ed2c20ee2c6a21ef2c20ee2c20ef2c6a21f02c20ef2c20f02c6a21f12c20f02c20f12c6a21f22c20f1" + "2c20f22c6a21f32c20f22c20f32c6a21f42c20f32c20f42c6a21f52c20f42c20f52c6a21f62c20f52c20f62c6a21f72c20f62c20f72c6a21f8" + "2c20f72c20f82c6a21f92c20f82c20f92c6a21fa2c20f92c20fa2c6a21fb2c20fa2c20fb2c6a21fc2c20fb2c20fc2c6a21fd2c20fc2c20fd2c" + "6a21fe2c20fd2c20fe2c6a21ff2c20fe2c20ff2c6a21802d20ff2c20802d6a21812d20802d20812d6a21822d20812d20822d6a21832d20822d" + "20832d6a21842d20832d20842d6a21852d20842d20852d6a21862d20852d20862d6a21872d20862d20872d6a21882d20872d20882d6a21892d" + "20882d20892d6a218a2d20892d208a2d6a218b2d208a2d208b2d6a218c2d208b2d208c2d6a218d2d208c2d208d2d6a218e2d208d2d208e2d6a" + "218f2d208e2d208f2d6a21902d208f2d20902d6a21912d20902d20912d6a21922d20912d20922d6a21932d20922d20932d6a21942d20932d20" + "942d6a21952d20942d20952d6a21962d20952d20962d6a21972d20962d20972d6a21982d20972d20982d6a21992d20982d20992d6a219a2d20" + "992d209a2d6a219b2d209a2d209b2d6a219c2d209b2d209c2d6a219d2d209c2d209d2d6a219e2d209d2d209e2d6a219f2d209e2d209f2d6a21" + "a02d209f2d20a02d6a21a12d20a02d20a12d6a21a22d20a12d20a22d6a21a32d20a22d20a32d6a21a42d20a32d20a42d6a21a52d20a42d20a5" + "2d6a21a62d20a52d20a62d6a21a72d20a62d20a72d6a21a82d20a72d20a82d6a21a92d20a82d20a92d6a21aa2d20a92d20aa2d6a21ab2d20aa" + "2d20ab2d6a21ac2d20ab2d20ac2d6a21ad2d20ac2d20ad2d6a21ae2d20ad2d20ae2d6a21af2d20ae2d20af2d6a21b02d20af2d20b02d6a21b1" + "2d20b02d20b12d6a21b22d20b12d20b22d6a21b32d20b22d20b32d6a21b42d20b32d20b42d6a21b52d20b42d20b52d6a21b62d20b52d20b62d" + "6a21b72d20b62d20b72d6a21b82d20b72d20b82d6a21b92d20b82d20b92d6a21ba2d20b92d20ba2d6a21bb2d20ba2d20bb2d6a21bc2d20bb2d" + "20bc2d6a21bd2d20bc2d20bd2d6a21be2d20bd2d20be2d6a21bf2d20be2d20bf2d6a21c02d20bf2d20c02d6a21c12d20c02d20c12d6a21c22d" + "20c12d20c22d6a21c32d20c22d20c32d6a21c42d20c32d20c42d6a21c52d20c42d20c52d6a21c62d20c52d20c62d6a21c72d20c62d20c72d6a" + "21c82d20c72d20c82d6a21c92d20c82d20c92d6a21ca2d20c92d20ca2d6a21cb2d20ca2d20cb2d6a21cc2d20cb2d20cc2d6a21cd2d20cc2d20" + "cd2d6a21ce2d20cd2d20ce2d6a21cf2d20ce2d20cf2d6a21d02d20cf2d20d02d6a21d12d20d02d20d12d6a21d22d20d12d20d22d6a21d32d20" + "d22d20d32d6a21d42d20d32d20d42d6a21d52d20d42d20d52d6a21d62d20d52d20d62d6a21d72d20d62d20d72d6a21d82d20d72d20d82d6a21" + "d92d20d82d20d92d6a21da2d20d92d20da2d6a21db2d20da2d20db2d6a21dc2d20db2d20dc2d6a21dd2d20dc2d20dd2d6a21de2d20dd2d20de" + "2d6a21df2d20de2d20df2d6a21e02d20df2d20e02d6a21e12d20e02d20e12d6a21e22d20e12d20e22d6a21e32d20e22d20e32d6a21e42d20e3" + "2d20e42d6a21e52d20e42d20e52d6a21e62d20e52d20e62d6a21e72d20e62d20e72d6a21e82d20e72d20e82d6a21e92d20e82d20e92d6a21ea" + "2d20e92d20ea2d6a21eb2d20ea2d20eb2d6a21ec2d20eb2d20ec2d6a21ed2d20ec2d20ed2d6a21ee2d20ed2d20ee2d6a21ef2d20ee2d20ef2d" + "6a21f02d20ef2d20f02d6a21f12d20f02d20f12d6a21f22d20f12d20f22d6a21f32d20f22d20f32d6a21f42d20f32d20f42d6a21f52d20f42d" + "20f52d6a21f62d20f52d20f62d6a21f72d20f62d20f72d6a21f82d20f72d20f82d6a21f92d20f82d20f92d6a21fa2d20f92d20fa2d6a21fb2d" + "20fa2d20fb2d6a21fc2d20fb2d20fc2d6a21fd2d20fc2d20fd2d6a21fe2d20fd2d20fe2d6a21ff2d20fe2d20ff2d6a21802e20ff2d20802e6a" + "21812e20802e20812e6a21822e20812e20822e6a21832e20822e20832e6a21842e20832e20842e6a21852e20842e20852e6a21862e20852e20" + "862e6a21872e20862e20872e6a21882e20872e20882e6a21892e20882e20892e6a218a2e20892e208a2e6a218b2e208a2e208b2e6a218c2e20" + "8b2e208c2e6a218d2e208c2e208d2e6a218e2e208d2e208e2e6a218f2e208e2e208f2e6a21902e208f2e20902e6a21912e20902e20912e6a21" + "922e20912e20922e6a21932e20922e20932e6a21942e20932e20942e6a21952e20942e20952e6a21962e20952e20962e6a21972e20962e2097" + "2e6a21982e20972e20982e6a21992e20982e20992e6a219a2e20992e209a2e6a219b2e209a2e209b2e6a219c2e209b2e209c2e6a219d2e209c" + "2e209d2e6a219e2e209d2e209e2e6a219f2e209e2e209f2e6a21a02e209f2e20a02e6a21a12e20a02e20a12e6a21a22e20a12e20a22e6a21a3" + "2e20a22e20a32e6a21a42e20a32e20a42e6a21a52e20a42e20a52e6a21a62e20a52e20a62e6a21a72e20a62e20a72e6a21a82e20a72e20a82e" + "6a21a92e20a82e20a92e6a21aa2e20a92e20aa2e6a21ab2e20aa2e20ab2e6a21ac2e20ab2e20ac2e6a21ad2e20ac2e20ad2e6a21ae2e20ad2e" + "20ae2e6a21af2e20ae2e20af2e6a21b02e20af2e20b02e6a21b12e20b02e20b12e6a21b22e20b12e20b22e6a21b32e20b22e20b32e6a21b42e" + "20b32e20b42e6a21b52e20b42e20b52e6a21b62e20b52e20b62e6a21b72e20b62e20b72e6a21b82e20b72e20b82e6a21b92e20b82e20b92e6a" + "21ba2e20b92e20ba2e6a21bb2e20ba2e20bb2e6a21bc2e20bb2e20bc2e6a21bd2e20bc2e20bd2e6a21be2e20bd2e20be2e6a21bf2e20be2e20" + "bf2e6a21c02e20bf2e20c02e6a21c12e20c02e20c12e6a21c22e20c12e20c22e6a21c32e20c22e20c32e6a21c42e20c32e20c42e6a21c52e20" + "c42e20c52e6a21c62e20c52e20c62e6a21c72e20c62e20c72e6a21c82e20c72e20c82e6a21c92e20c82e20c92e6a21ca2e20c92e20ca2e6a21" + "cb2e20ca2e20cb2e6a21cc2e20cb2e20cc2e6a21cd2e20cc2e20cd2e6a21ce2e20cd2e20ce2e6a21cf2e20ce2e20cf2e6a21d02e20cf2e20d0" + "2e6a21d12e20d02e20d12e6a21d22e20d12e20d22e6a21d32e20d22e20d32e6a21d42e20d32e20d42e6a21d52e20d42e20d52e6a21d62e20d5" + "2e20d62e6a21d72e20d62e20d72e6a21d82e20d72e20d82e6a21d92e20d82e20d92e6a21da2e20d92e20da2e6a21db2e20da2e20db2e6a21dc" + "2e20db2e20dc2e6a21dd2e20dc2e20dd2e6a21de2e20dd2e20de2e6a21df2e20de2e20df2e6a21e02e20df2e20e02e6a21e12e20e02e20e12e" + "6a21e22e20e12e20e22e6a21e32e20e22e20e32e6a21e42e20e32e20e42e6a21e52e20e42e20e52e6a21e62e20e52e20e62e6a21e72e20e62e" + "20e72e6a21e82e20e72e20e82e6a21e92e20e82e20e92e6a21ea2e20e92e20ea2e6a21eb2e20ea2e20eb2e6a21ec2e20eb2e20ec2e6a21ed2e" + "20ec2e20ed2e6a21ee2e20ed2e20ee2e6a21ef2e20ee2e20ef2e6a21f02e20ef2e20f02e6a21f12e20f02e20f12e6a21f22e20f12e20f22e6a" + "21f32e20f22e20f32e6a21f42e20f32e20f42e6a21f52e20f42e20f52e6a21f62e20f52e20f62e6a21f72e20f62e20f72e6a21f82e20f72e20" + "f82e6a21f92e20f82e20f92e6a21fa2e20f92e20fa2e6a21fb2e20fa2e20fb2e6a21fc2e20fb2e20fc2e6a21fd2e20fc2e20fd2e6a21fe2e20" + "fd2e20fe2e6a21ff2e20fe2e20ff2e6a21802f20ff2e20802f6a21812f20802f20812f6a21822f20812f20822f6a21832f20822f20832f6a21" + "842f20832f20842f6a21852f20842f20852f6a21862f20852f20862f6a21872f20862f20872f6a21882f20872f20882f6a21892f20882f2089" + "2f6a218a2f20892f208a2f6a218b2f208a2f208b2f6a218c2f208b2f208c2f6a218d2f208c2f208d2f6a218e2f208d2f208e2f6a218f2f208e" + "2f208f2f6a21902f208f2f20902f6a21912f20902f20912f6a21922f20912f20922f6a21932f20922f20932f6a21942f20932f20942f6a2195" + "2f20942f20952f6a21962f20952f20962f6a21972f20962f20972f6a21982f20972f20982f6a21992f20982f20992f6a219a2f20992f209a2f" + "6a219b2f209a2f209b2f6a219c2f209b2f209c2f6a219d2f209c2f209d2f6a219e2f209d2f209e2f6a219f2f209e2f209f2f6a21a02f209f2f" + "20a02f6a21a12f20a02f20a12f6a21a22f20a12f20a22f6a21a32f20a22f20a32f6a21a42f20a32f20a42f6a21a52f20a42f20a52f6a21a62f" + "20a52f20a62f6a21a72f20a62f20a72f6a21a82f20a72f20a82f6a21a92f20a82f20a92f6a21aa2f20a92f20aa2f6a21ab2f20aa2f20ab2f6a" + "21ac2f20ab2f20ac2f6a21ad2f20ac2f20ad2f6a21ae2f20ad2f20ae2f6a21af2f20ae2f20af2f6a21b02f20af2f20b02f6a21b12f20b02f20" + "b12f6a21b22f20b12f20b22f6a21b32f20b22f20b32f6a21b42f20b32f20b42f6a21b52f20b42f20b52f6a21b62f20b52f20b62f6a21b72f20" + "b62f20b72f6a21b82f20b72f20b82f6a21b92f20b82f20b92f6a21ba2f20b92f20ba2f6a21bb2f20ba2f20bb2f6a21bc2f20bb2f20bc2f6a21" + "bd2f20bc2f20bd2f6a21be2f20bd2f20be2f6a21bf2f20be2f20bf2f6a21c02f20bf2f20c02f6a21c12f20c02f20c12f6a21c22f20c12f20c2" + "2f6a21c32f20c22f20c32f6a21c42f20c32f20c42f6a21c52f20c42f20c52f6a21c62f20c52f20c62f6a21c72f20c62f20c72f6a21c82f20c7" + "2f20c82f6a21c92f20c82f20c92f6a21ca2f20c92f20ca2f6a21cb2f20ca2f20cb2f6a21cc2f20cb2f20cc2f6a21cd2f20cc2f20cd2f6a21ce" + "2f20cd2f20ce2f6a21cf2f20ce2f20cf2f6a21d02f20cf2f20d02f6a21d12f20d02f20d12f6a21d22f20d12f20d22f6a21d32f20d22f20d32f" + "6a21d42f20d32f20d42f6a21d52f20d42f20d52f6a21d62f20d52f20d62f6a21d72f20d62f20d72f6a21d82f20d72f20d82f6a21d92f20d82f" + "20d92f6a21da2f20d92f20da2f6a21db2f20da2f20db2f6a21dc2f20db2f20dc2f6a21dd2f20dc2f20dd2f6a21de2f20dd2f20de2f6a21df2f" + "20de2f20df2f6a21e02f20df2f20e02f6a21e12f20e02f20e12f6a21e22f20e12f20e22f6a21e32f20e22f20e32f6a21e42f20e32f20e42f6a" + "21e52f20e42f20e52f6a21e62f20e52f20e62f6a21e72f20e62f20e72f6a21e82f20e72f20e82f6a21e92f20e82f20e92f6a21ea2f20e92f20" + "ea2f6a21eb2f20ea2f20eb2f6a21ec2f20eb2f20ec2f6a21ed2f20ec2f20ed2f6a21ee2f20ed2f20ee2f6a21ef2f20ee2f20ef2f6a21f02f20" + "ef2f20f02f6a21f12f20f02f20f12f6a21f22f20f12f20f22f6a21f32f20f22f20f32f6a21f42f20f32f20f42f6a21f52f20f42f20f52f6a21" + "f62f20f52f20f62f6a21f72f20f62f20f72f6a21f82f20f72f20f82f6a21f92f20f82f20f92f6a21fa2f20f92f20fa2f6a21fb2f20fa2f20fb" + "2f6a21fc2f20fb2f20fc2f6a21fd2f20fc2f20fd2f6a21fe2f20fd2f20fe2f6a21ff2f20fe2f20ff2f6a21803020ff2f2080306a2181302080" + "302081306a2182302081302082306a2183302082302083306a2184302083302084306a2185302084302085306a2186302085302086306a2187" + "302086302087306a2188302087302088306a2189302088302089306a218a30208930208a306a218b30208a30208b306a218c30208b30208c30" + "6a218d30208c30208d306a218e30208d30208e306a218f30208e30208f306a219030208f302090306a2191302090302091306a219230209130" + "2092306a2193302092302093306a2194302093302094306a2195302094302095306a2196302095302096306a2197302096302097306a219830" + "2097302098306a2199302098302099306a219a30209930209a306a219b30209a30209b306a219c30209b30209c306a219d30209c30209d306a" + "219e30209d30209e306a219f30209e30209f306a21a030209f3020a0306a21a13020a03020a1306a21a23020a13020a2306a21a33020a23020" + "a3306a21a43020a33020a4306a21a53020a43020a5306a21a63020a53020a6306a21a73020a63020a7306a21a83020a73020a8306a21a93020" + "a83020a9306a21aa3020a93020aa306a21ab3020aa3020ab306a21ac3020ab3020ac306a21ad3020ac3020ad306a21ae3020ad3020ae306a21" + "af3020ae3020af306a21b03020af3020b0306a21b13020b03020b1306a21b23020b13020b2306a21b33020b23020b3306a21b43020b33020b4" + "306a21b53020b43020b5306a21b63020b53020b6306a21b73020b63020b7306a21b83020b73020b8306a21b93020b83020b9306a21ba3020b9" + "3020ba306a21bb3020ba3020bb306a21bc3020bb3020bc306a21bd3020bc3020bd306a21be3020bd3020be306a21bf3020be3020bf306a21c0" + "3020bf3020c0306a21c13020c03020c1306a21c23020c13020c2306a21c33020c23020c3306a21c43020c33020c4306a21c53020c43020c530" + "6a21c63020c53020c6306a21c73020c63020c7306a21c83020c73020c8306a21c93020c83020c9306a21ca3020c93020ca306a21cb3020ca30" + "20cb306a21cc3020cb3020cc306a21cd3020cc3020cd306a21ce3020cd3020ce306a21cf3020ce3020cf306a21d03020cf3020d0306a21d130" + "20d03020d1306a21d23020d13020d2306a21d33020d23020d3306a21d43020d33020d4306a21d53020d43020d5306a21d63020d53020d6306a" + "21d73020d63020d7306a21d83020d73020d8306a21d93020d83020d9306a21da3020d93020da306a21db3020da3020db306a21dc3020db3020" + "dc306a21dd3020dc3020dd306a21de3020dd3020de306a21df3020de3020df306a21e03020df3020e0306a21e13020e03020e1306a21e23020" + "e13020e2306a21e33020e23020e3306a21e43020e33020e4306a21e53020e43020e5306a21e63020e53020e6306a21e73020e63020e7306a21" + "e83020e73020e8306a21e93020e83020e9306a21ea3020e93020ea306a21eb3020ea3020eb306a21ec3020eb3020ec306a21ed3020ec3020ed" + "306a21ee3020ed3020ee306a21ef3020ee3020ef306a21f03020ef3020f0306a21f13020f03020f1306a21f23020f13020f2306a21f33020f2" + "3020f3306a21f43020f33020f4306a21f53020f43020f5306a21f63020f53020f6306a21f73020f63020f7306a21f83020f73020f8306a21f9" + "3020f83020f9306a21fa3020f93020fa306a21fb3020fa3020fb306a21fc3020fb3020fc306a21fd3020fc3020fd306a21fe3020fd3020fe30" + "6a21ff3020fe3020ff306a21803120ff302080316a2181312080312081316a2182312081312082316a2183312082312083316a218431208331" + "2084316a2185312084312085316a2186312085312086316a2187312086312087316a2188312087312088316a2189312088312089316a218a31" + "208931208a316a218b31208a31208b316a218c31208b31208c316a218d31208c31208d316a218e31208d31208e316a218f31208e31208f316a" + "219031208f312090316a2191312090312091316a2192312091312092316a2193312092312093316a2194312093312094316a21953120943120" + "95316a2196312095312096316a2197312096312097316a2198312097312098316a2199312098312099316a219a31209931209a316a219b3120" + "9a31209b316a219c31209b31209c316a219d31209c31209d316a219e31209d31209e316a219f31209e31209f316a21a031209f3120a0316a21" + "a13120a03120a1316a21a23120a13120a2316a21a33120a23120a3316a21a43120a33120a4316a21a53120a43120a5316a21a63120a53120a6" + "316a21a73120a63120a7316a21a83120a73120a8316a21a93120a83120a9316a21aa3120a93120aa316a21ab3120aa3120ab316a21ac3120ab" + "3120ac316a21ad3120ac3120ad316a21ae3120ad3120ae316a21af3120ae3120af316a21b03120af3120b0316a21b13120b03120b1316a21b2" + "3120b13120b2316a21b33120b23120b3316a21b43120b33120b4316a21b53120b43120b5316a21b63120b53120b6316a21b73120b63120b731" + "6a21b83120b73120b8316a21b93120b83120b9316a21ba3120b93120ba316a21bb3120ba3120bb316a21bc3120bb3120bc316a21bd3120bc31" + "20bd316a21be3120bd3120be316a21bf3120be3120bf316a21c03120bf3120c0316a21c13120c03120c1316a21c23120c13120c2316a21c331" + "20c23120c3316a21c43120c33120c4316a21c53120c43120c5316a21c63120c53120c6316a21c73120c63120c7316a21c83120c73120c8316a" + "21c93120c83120c9316a21ca3120c93120ca316a21cb3120ca3120cb316a21cc3120cb3120cc316a21cd3120cc3120cd316a21ce3120cd3120" + "ce316a21cf3120ce3120cf316a21d03120cf3120d0316a21d13120d03120d1316a21d23120d13120d2316a21d33120d23120d3316a21d43120" + "d33120d4316a21d53120d43120d5316a21d63120d53120d6316a21d73120d63120d7316a21d83120d73120d8316a21d93120d83120d9316a21" + "da3120d93120da316a21db3120da3120db316a21dc3120db3120dc316a21dd3120dc3120dd316a21de3120dd3120de316a21df3120de3120df" + "316a21e03120df3120e0316a21e13120e03120e1316a21e23120e13120e2316a21e33120e23120e3316a21e43120e33120e4316a21e53120e4" + "3120e5316a21e63120e53120e6316a21e73120e63120e7316a21e83120e73120e8316a21e93120e83120e9316a21ea3120e93120ea316a21eb" + "3120ea3120eb316a21ec3120eb3120ec316a21ed3120ec3120ed316a21ee3120ed3120ee316a21ef3120ee3120ef316a21f03120ef3120f031" + "6a21f13120f03120f1316a21f23120f13120f2316a21f33120f23120f3316a21f43120f33120f4316a21f53120f43120f5316a21f63120f531" + "20f6316a21f73120f63120f7316a21f83120f73120f8316a21f93120f83120f9316a21fa3120f93120fa316a21fb3120fa3120fb316a21fc31" + "20fb3120fc316a21fd3120fc3120fd316a21fe3120fd3120fe316a21ff3120fe3120ff316a21803220ff312080326a2181322080322081326a" + "2182322081322082326a2183322082322083326a2184322083322084326a2185322084322085326a2186322085322086326a21873220863220" + "87326a2188322087322088326a2189322088322089326a218a32208932208a326a218b32208a32208b326a218c32208b32208c326a218d3220" + "8c32208d326a218e32208d32208e326a218f32208e32208f326a219032208f322090326a2191322090322091326a2192322091322092326a21" + "93322092322093326a2194322093322094326a2195322094322095326a2196322095322096326a2197322096322097326a2198322097322098" + "326a2199322098322099326a219a32209932209a326a219b32209a32209b326a219c32209b32209c326a219d32209c32209d326a219e32209d" + "32209e326a219f32209e32209f326a21a032209f3220a0326a21a13220a03220a1326a21a23220a13220a2326a21a33220a23220a3326a21a4" + "3220a33220a4326a21a53220a43220a5326a21a63220a53220a6326a21a73220a63220a7326a21a83220a73220a8326a21a93220a83220a932" + "6a21aa3220a93220aa326a21ab3220aa3220ab326a21ac3220ab3220ac326a21ad3220ac3220ad326a21ae3220ad3220ae326a21af3220ae32" + "20af326a21b03220af3220b0326a21b13220b03220b1326a21b23220b13220b2326a21b33220b23220b3326a21b43220b33220b4326a21b532" + "20b43220b5326a21b63220b53220b6326a21b73220b63220b7326a21b83220b73220b8326a21b93220b83220b9326a21ba3220b93220ba326a" + "21bb3220ba3220bb326a21bc3220bb3220bc326a21bd3220bc3220bd326a21be3220bd3220be326a21bf3220be3220bf326a21c03220bf3220" + "c0326a21c13220c03220c1326a21c23220c13220c2326a21c33220c23220c3326a21c43220c33220c4326a21c53220c43220c5326a21c63220" + "c53220c6326a21c73220c63220c7326a21c83220c73220c8326a21c93220c83220c9326a21ca3220c93220ca326a21cb3220ca3220cb326a21" + "cc3220cb3220cc326a21cd3220cc3220cd326a21ce3220cd3220ce326a21cf3220ce3220cf326a21d03220cf3220d0326a21d13220d03220d1" + "326a21d23220d13220d2326a21d33220d23220d3326a21d43220d33220d4326a21d53220d43220d5326a21d63220d53220d6326a21d73220d6" + "3220d7326a21d83220d73220d8326a21d93220d83220d9326a21da3220d93220da326a21db3220da3220db326a21dc3220db3220dc326a21dd" + "3220dc3220dd326a21de3220dd3220de326a21df3220de3220df326a21e03220df3220e0326a21e13220e03220e1326a21e23220e13220e232" + "6a21e33220e23220e3326a21e43220e33220e4326a21e53220e43220e5326a21e63220e53220e6326a21e73220e63220e7326a21e83220e732" + "20e8326a21e93220e83220e9326a21ea3220e93220ea326a21eb3220ea3220eb326a21ec3220eb3220ec326a21ed3220ec3220ed326a21ee32" + "20ed3220ee326a21ef3220ee3220ef326a21f03220ef3220f0326a21f13220f03220f1326a21f23220f13220f2326a21f33220f23220f3326a" + "21f43220f33220f4326a21f53220f43220f5326a21f63220f53220f6326a21f73220f63220f7326a21f83220f73220f8326a21f93220f83220" + "f9326a21fa3220f93220fa326a21fb3220fa3220fb326a21fc3220fb3220fc326a21fd3220fc3220fd326a21fe3220fd3220fe326a21ff3220" + "fe3220ff326a21803320ff322080336a2181332080332081336a2182332081332082336a2183332082332083336a2184332083332084336a21" + "85332084332085336a2186332085332086336a2187332086332087336a2188332087332088336a2189332088332089336a218a33208933208a" + "336a218b33208a33208b336a218c33208b33208c336a218d33208c33208d336a218e33208d33208e336a218f33208e33208f336a219033208f" + "332090336a2191332090332091336a2192332091332092336a2193332092332093336a2194332093332094336a2195332094332095336a2196" + "332095332096336a2197332096332097336a2198332097332098336a2199332098332099336a219a33209933209a336a219b33209a33209b33" + "6a219c33209b33209c336a219d33209c33209d336a219e33209d33209e336a219f33209e33209f336a21a033209f3320a0336a21a13320a033" + "20a1336a21a23320a13320a2336a21a33320a23320a3336a21a43320a33320a4336a21a53320a43320a5336a21a63320a53320a6336a21a733" + "20a63320a7336a21a83320a73320a8336a21a93320a83320a9336a21aa3320a93320aa336a21ab3320aa3320ab336a21ac3320ab3320ac336a" + "21ad3320ac3320ad336a21ae3320ad3320ae336a21af3320ae3320af336a21b03320af3320b0336a21b13320b03320b1336a21b23320b13320" + "b2336a21b33320b23320b3336a21b43320b33320b4336a21b53320b43320b5336a21b63320b53320b6336a21b73320b63320b7336a21b83320" + "b73320b8336a21b93320b83320b9336a21ba3320b93320ba336a21bb3320ba3320bb336a21bc3320bb3320bc336a21bd3320bc3320bd336a21" + "be3320bd3320be336a21bf3320be3320bf336a21c03320bf3320c0336a21c13320c03320c1336a21c23320c13320c2336a21c33320c23320c3" + "336a21c43320c33320c4336a21c53320c43320c5336a21c63320c53320c6336a21c73320c63320c7336a21c83320c73320c8336a21c93320c8" + "3320c9336a21ca3320c93320ca336a21cb3320ca3320cb336a21cc3320cb3320cc336a21cd3320cc3320cd336a21ce3320cd3320ce336a21cf" + "3320ce3320cf336a21d03320cf3320d0336a21d13320d03320d1336a21d23320d13320d2336a21d33320d23320d3336a21d43320d33320d433" + "6a21d53320d43320d5336a21d63320d53320d6336a21d73320d63320d7336a21d83320d73320d8336a21d93320d83320d9336a21da3320d933" + "20da336a21db3320da3320db336a21dc3320db3320dc336a21dd3320dc3320dd336a21de3320dd3320de336a21df3320de3320df336a21e033" + "20df3320e0336a21e13320e03320e1336a21e23320e13320e2336a21e33320e23320e3336a21e43320e33320e4336a21e53320e43320e5336a" + "21e63320e53320e6336a21e73320e63320e7336a21e83320e73320e8336a21e93320e83320e9336a21ea3320e93320ea336a21eb3320ea3320" + "eb336a21ec3320eb3320ec336a21ed3320ec3320ed336a21ee3320ed3320ee336a21ef3320ee3320ef336a21f03320ef3320f0336a21f13320" + "f03320f1336a21f23320f13320f2336a21f33320f23320f3336a21f43320f33320f4336a21f53320f43320f5336a21f63320f53320f6336a21" + "f73320f63320f7336a21f83320f73320f8336a21f93320f83320f9336a21fa3320f93320fa336a21fb3320fa3320fb336a21fc3320fb3320fc" + "336a21fd3320fc3320fd336a21fe3320fd3320fe336a21ff3320fe3320ff336a21803420ff332080346a2181342080342081346a2182342081" + "342082346a2183342082342083346a2184342083342084346a2185342084342085346a2186342085342086346a2187342086342087346a2188" + "342087342088346a2189342088342089346a218a34208934208a346a218b34208a34208b346a218c34208b34208c346a218d34208c34208d34" + "6a218e34208d34208e346a218f34208e34208f346a219034208f342090346a2191342090342091346a2192342091342092346a219334209234" + "2093346a2194342093342094346a2195342094342095346a2196342095342096346a2197342096342097346a2198342097342098346a219934" + "2098342099346a219a34209934209a346a219b34209a34209b346a219c34209b34209c346a219d34209c34209d346a219e34209d34209e346a" + "219f34209e34209f346a21a034209f3420a0346a21a13420a03420a1346a21a23420a13420a2346a21a33420a23420a3346a21a43420a33420" + "a4346a21a53420a43420a5346a21a63420a53420a6346a21a73420a63420a7346a21a83420a73420a8346a21a93420a83420a9346a21aa3420" + "a93420aa346a21ab3420aa3420ab346a21ac3420ab3420ac346a21ad3420ac3420ad346a21ae3420ad3420ae346a21af3420ae3420af346a21" + "b03420af3420b0346a21b13420b03420b1346a21b23420b13420b2346a21b33420b23420b3346a21b43420b33420b4346a21b53420b43420b5" + "346a21b63420b53420b6346a21b73420b63420b7346a21b83420b73420b8346a21b93420b83420b9346a21ba3420b93420ba346a21bb3420ba" + "3420bb346a21bc3420bb3420bc346a21bd3420bc3420bd346a21be3420bd3420be346a21bf3420be3420bf346a21c03420bf3420c0346a21c1" + "3420c03420c1346a21c23420c13420c2346a21c33420c23420c3346a21c43420c33420c4346a21c53420c43420c5346a21c63420c53420c634" + "6a21c73420c63420c7346a21c83420c73420c8346a21c93420c83420c9346a21ca3420c93420ca346a21cb3420ca3420cb346a21cc3420cb34" + "20cc346a21cd3420cc3420cd346a21ce3420cd3420ce346a21cf3420ce3420cf346a21d03420cf3420d0346a21d13420d03420d1346a21d234" + "20d13420d2346a21d33420d23420d3346a21d43420d33420d4346a21d53420d43420d5346a21d63420d53420d6346a21d73420d63420d7346a" + "21d83420d73420d8346a21d93420d83420d9346a21da3420d93420da346a21db3420da3420db346a21dc3420db3420dc346a21dd3420dc3420" + "dd346a21de3420dd3420de346a21df3420de3420df346a21e03420df3420e0346a21e13420e03420e1346a21e23420e13420e2346a21e33420" + "e23420e3346a21e43420e33420e4346a21e53420e43420e5346a21e63420e53420e6346a21e73420e63420e7346a21e83420e73420e8346a21" + "e93420e83420e9346a21ea3420e93420ea346a21eb3420ea3420eb346a21ec3420eb3420ec346a21ed3420ec3420ed346a21ee3420ed3420ee" + "346a21ef3420ee3420ef346a21f03420ef3420f0346a21f13420f03420f1346a21f23420f13420f2346a21f33420f23420f3346a21f43420f3" + "3420f4346a21f53420f43420f5346a21f63420f53420f6346a21f73420f63420f7346a21f83420f73420f8346a21f93420f83420f9346a21fa" + "3420f93420fa346a21fb3420fa3420fb346a21fc3420fb3420fc346a21fd3420fc3420fd346a21fe3420fd3420fe346a21ff3420fe3420ff34" + "6a21803520ff342080356a2181352080352081356a2182352081352082356a2183352082352083356a2184352083352084356a218535208435" + "2085356a2186352085352086356a2187352086352087356a2188352087352088356a2189352088352089356a218a35208935208a356a218b35" + "208a35208b356a218c35208b35208c356a218d35208c35208d356a218e35208d35208e356a218f35208e35208f356a219035208f352090356a" + "2191352090352091356a2192352091352092356a2193352092352093356a2194352093352094356a2195352094352095356a21963520953520" + "96356a2197352096352097356a2198352097352098356a2199352098352099356a219a35209935209a356a219b35209a35209b356a219c3520" + "9b35209c356a219d35209c35209d356a219e35209d35209e356a219f35209e35209f356a21a035209f3520a0356a21a13520a03520a1356a21" + "a23520a13520a2356a21a33520a23520a3356a21a43520a33520a4356a21a53520a43520a5356a21a63520a53520a6356a21a73520a63520a7" + "356a21a83520a73520a8356a21a93520a83520a9356a21aa3520a93520aa356a21ab3520aa3520ab356a21ac3520ab3520ac356a21ad3520ac" + "3520ad356a21ae3520ad3520ae356a21af3520ae3520af356a21b03520af3520b0356a21b13520b03520b1356a21b23520b13520b2356a21b3" + "3520b23520b3356a21b43520b33520b4356a21b53520b43520b5356a21b63520b53520b6356a21b73520b63520b7356a21b83520b73520b835" + "6a21b93520b83520b9356a21ba3520b93520ba356a21bb3520ba3520bb356a21bc3520bb3520bc356a21bd3520bc3520bd356a21be3520bd35" + "20be356a21bf3520be3520bf356a21c03520bf3520c0356a21c13520c03520c1356a21c23520c13520c2356a21c33520c23520c3356a21c435" + "20c33520c4356a21c53520c43520c5356a21c63520c53520c6356a21c73520c63520c7356a21c83520c73520c8356a21c93520c83520c9356a" + "21ca3520c93520ca356a21cb3520ca3520cb356a21cc3520cb3520cc356a21cd3520cc3520cd356a21ce3520cd3520ce356a21cf3520ce3520" + "cf356a21d03520cf3520d0356a21d13520d03520d1356a21d23520d13520d2356a21d33520d23520d3356a21d43520d33520d4356a21d53520" + "d43520d5356a21d63520d53520d6356a21d73520d63520d7356a21d83520d73520d8356a21d93520d83520d9356a21da3520d93520da356a21" + "db3520da3520db356a21dc3520db3520dc356a21dd3520dc3520dd356a21de3520dd3520de356a21df3520de3520df356a21e03520df3520e0" + "356a21e13520e03520e1356a21e23520e13520e2356a21e33520e23520e3356a21e43520e33520e4356a21e53520e43520e5356a21e63520e5" + "3520e6356a21e73520e63520e7356a21e83520e73520e8356a21e93520e83520e9356a21ea3520e93520ea356a21eb3520ea3520eb356a21ec" + "3520eb3520ec356a21ed3520ec3520ed356a21ee3520ed3520ee356a21ef3520ee3520ef356a21f03520ef3520f0356a21f13520f03520f135" + "6a21f23520f13520f2356a21f33520f23520f3356a21f43520f33520f4356a21f53520f43520f5356a21f63520f53520f6356a21f73520f635" + "20f7356a21f83520f73520f8356a21f93520f83520f9356a21fa3520f93520fa356a21fb3520fa3520fb356a21fc3520fb3520fc356a21fd35" + "20fc3520fd356a21fe3520fd3520fe356a21ff3520fe3520ff356a21803620ff352080366a2181362080362081366a2182362081362082366a" + "2183362082362083366a2184362083362084366a2185362084362085366a2186362085362086366a2187362086362087366a21883620873620" + "88366a2189362088362089366a218a36208936208a366a218b36208a36208b366a218c36208b36208c366a218d36208c36208d366a218e3620" + "8d36208e366a218f36208e36208f366a219036208f362090366a2191362090362091366a2192362091362092366a2193362092362093366a21" + "94362093362094366a2195362094362095366a2196362095362096366a2197362096362097366a2198362097362098366a2199362098362099" + "366a219a36209936209a366a219b36209a36209b366a219c36209b36209c366a219d36209c36209d366a219e36209d36209e366a219f36209e" + "36209f366a21a036209f3620a0366a21a13620a03620a1366a21a23620a13620a2366a21a33620a23620a3366a21a43620a33620a4366a21a5" + "3620a43620a5366a21a63620a53620a6366a21a73620a63620a7366a21a83620a73620a8366a21a93620a83620a9366a21aa3620a93620aa36" + "6a21ab3620aa3620ab366a21ac3620ab3620ac366a21ad3620ac3620ad366a21ae3620ad3620ae366a21af3620ae3620af366a21b03620af36" + "20b0366a21b13620b03620b1366a21b23620b13620b2366a21b33620b23620b3366a21b43620b33620b4366a21b53620b43620b5366a21b636" + "20b53620b6366a21b73620b63620b7366a21b83620b73620b8366a21b93620b83620b9366a21ba3620b93620ba366a21bb3620ba3620bb366a" + "21bc3620bb3620bc366a21bd3620bc3620bd366a21be3620bd3620be366a21bf3620be3620bf366a21c03620bf3620c0366a21c13620c03620" + "c1366a21c23620c13620c2366a21c33620c23620c3366a21c43620c33620c4366a21c53620c43620c5366a21c63620c53620c6366a21c73620" + "c63620c7366a21c83620c73620c8366a21c93620c83620c9366a21ca3620c93620ca366a21cb3620ca3620cb366a21cc3620cb3620cc366a21" + "cd3620cc3620cd366a21ce3620cd3620ce366a21cf3620ce3620cf366a21d03620cf3620d0366a21d13620d03620d1366a21d23620d13620d2" + "366a21d33620d23620d3366a21d43620d33620d4366a21d53620d43620d5366a21d63620d53620d6366a21d73620d63620d7366a21d83620d7" + "3620d8366a21d93620d83620d9366a21da3620d93620da366a21db3620da3620db366a21dc3620db3620dc366a21dd3620dc3620dd366a21de" + "3620dd3620de366a21df3620de3620df366a21e03620df3620e0366a21e13620e03620e1366a21e23620e13620e2366a21e33620e23620e336" + "6a21e43620e33620e4366a21e53620e43620e5366a21e63620e53620e6366a21e73620e63620e7366a21e83620e73620e8366a21e93620e836" + "20e9366a21ea3620e93620ea366a21eb3620ea3620eb366a21ec3620eb3620ec366a21ed3620ec3620ed366a21ee3620ed3620ee366a21ef36" + "20ee3620ef366a21f03620ef3620f0366a21f13620f03620f1366a21f23620f13620f2366a21f33620f23620f3366a21f43620f33620f4366a" + "21f53620f43620f5366a21f63620f53620f6366a21f73620f63620f7366a21f83620f73620f8366a21f93620f83620f9366a21fa3620f93620" + "fa366a21fb3620fa3620fb366a21fc3620fb3620fc366a21fd3620fc3620fd366a21fe3620fd3620fe366a21ff3620fe3620ff366a21803720" + "ff362080376a2181372080372081376a2182372081372082376a2183372082372083376a2184372083372084376a2185372084372085376a21" + "86372085372086376a2187372086372087376a2188372087372088376a2189372088372089376a218a37208937208a376a218b37208a37208b" + "376a218c37208b37208c376a218d37208c37208d376a218e37208d37208e376a218f37208e37208f376a219037208f372090376a2191372090" + "372091376a2192372091372092376a2193372092372093376a2194372093372094376a2195372094372095376a2196372095372096376a2197" + "372096372097376a2198372097372098376a2199372098372099376a219a37209937209a376a219b37209a37209b376a219c37209b37209c37" + "6a219d37209c37209d376a219e37209d37209e376a219f37209e37209f376a21a037209f3720a0376a21a13720a03720a1376a21a23720a137" + "20a2376a21a33720a23720a3376a21a43720a33720a4376a21a53720a43720a5376a21a63720a53720a6376a21a73720a63720a7376a21a837" + "20a73720a8376a21a93720a83720a9376a21aa3720a93720aa376a21ab3720aa3720ab376a21ac3720ab3720ac376a21ad3720ac3720ad376a" + "21ae3720ad3720ae376a21af3720ae3720af376a21b03720af3720b0376a21b13720b03720b1376a21b23720b13720b2376a21b33720b23720" + "b3376a21b43720b33720b4376a21b53720b43720b5376a21b63720b53720b6376a21b73720b63720b7376a21b83720b73720b8376a21b93720" + "b83720b9376a21ba3720b93720ba376a21bb3720ba3720bb376a21bc3720bb3720bc376a21bd3720bc3720bd376a21be3720bd3720be376a21" + "bf3720be3720bf376a21c03720bf3720c0376a21c13720c03720c1376a21c23720c13720c2376a21c33720c23720c3376a21c43720c33720c4" + "376a21c53720c43720c5376a21c63720c53720c6376a21c73720c63720c7376a21c83720c73720c8376a21c93720c83720c9376a21ca3720c9" + "3720ca376a21cb3720ca3720cb376a21cc3720cb3720cc376a21cd3720cc3720cd376a21ce3720cd3720ce376a21cf3720ce3720cf376a21d0" + "3720cf3720d0376a21d13720d03720d1376a21d23720d13720d2376a21d33720d23720d3376a21d43720d33720d4376a21d53720d43720d537" + "6a21d63720d53720d6376a21d73720d63720d7376a21d83720d73720d8376a21d93720d83720d9376a21da3720d93720da376a21db3720da37" + "20db376a21dc3720db3720dc376a21dd3720dc3720dd376a21de3720dd3720de376a21df3720de3720df376a21e03720df3720e0376a21e137" + "20e03720e1376a21e23720e13720e2376a21e33720e23720e3376a21e43720e33720e4376a21e53720e43720e5376a21e63720e53720e6376a" + "21e73720e63720e7376a21e83720e73720e8376a21e93720e83720e9376a21ea3720e93720ea376a21eb3720ea3720eb376a21ec3720eb3720" + "ec376a21ed3720ec3720ed376a21ee3720ed3720ee376a21ef3720ee3720ef376a21f03720ef3720f0376a21f13720f03720f1376a21f23720" + "f13720f2376a21f33720f23720f3376a21f43720f33720f4376a21f53720f43720f5376a21f63720f53720f6376a21f73720f63720f7376a21" + "f83720f73720f8376a21f93720f83720f9376a21fa3720f93720fa376a21fb3720fa3720fb376a21fc3720fb3720fc376a21fd3720fc3720fd" + "376a21fe3720fd3720fe376a21ff3720fe3720ff376a21803820ff372080386a2181382080382081386a2182382081382082386a2183382082" + "382083386a2184382083382084386a2185382084382085386a2186382085382086386a2187382086382087386a2188382087382088386a2189" + "382088382089386a218a38208938208a386a218b38208a38208b386a218c38208b38208c386a218d38208c38208d386a218e38208d38208e38" + "6a218f38208e38208f386a219038208f382090386a2191382090382091386a2192382091382092386a2193382092382093386a219438209338" + "2094386a2195382094382095386a2196382095382096386a2197382096382097386a2198382097382098386a2199382098382099386a219a38" + "209938209a386a219b38209a38209b386a219c38209b38209c386a219d38209c38209d386a219e38209d38209e386a219f38209e38209f386a" + "21a038209f3820a0386a21a13820a03820a1386a21a23820a13820a2386a21a33820a23820a3386a21a43820a33820a4386a21a53820a43820" + "a5386a21a63820a53820a6386a21a73820a63820a7386a21a83820a73820a8386a21a93820a83820a9386a21aa3820a93820aa386a21ab3820" + "aa3820ab386a21ac3820ab3820ac386a21ad3820ac3820ad386a21ae3820ad3820ae386a21af3820ae3820af386a21b03820af3820b0386a21" + "b13820b03820b1386a21b23820b13820b2386a21b33820b23820b3386a21b43820b33820b4386a21b53820b43820b5386a21b63820b53820b6" + "386a21b73820b63820b7386a21b83820b73820b8386a21b93820b83820b9386a21ba3820b93820ba386a21bb3820ba3820bb386a21bc3820bb" + "3820bc386a21bd3820bc3820bd386a21be3820bd3820be386a21bf3820be3820bf386a21c03820bf3820c0386a21c13820c03820c1386a21c2" + "3820c13820c2386a21c33820c23820c3386a21c43820c33820c4386a21c53820c43820c5386a21c63820c53820c6386a21c73820c63820c738" + "6a21c83820c73820c8386a21c93820c83820c9386a21ca3820c93820ca386a21cb3820ca3820cb386a21cc3820cb3820cc386a21cd3820cc38" + "20cd386a21ce3820cd3820ce386a21cf3820ce3820cf386a21d03820cf3820d0386a21d13820d03820d1386a21d23820d13820d2386a21d338" + "20d23820d3386a21d43820d33820d4386a21d53820d43820d5386a21d63820d53820d6386a21d73820d63820d7386a21d83820d73820d8386a" + "21d93820d83820d9386a21da3820d93820da386a21db3820da3820db386a21dc3820db3820dc386a21dd3820dc3820dd386a21de3820dd3820" + "de386a21df3820de3820df386a21e03820df3820e0386a21e13820e03820e1386a21e23820e13820e2386a21e33820e23820e3386a21e43820" + "e33820e4386a21e53820e43820e5386a21e63820e53820e6386a21e73820e63820e7386a21e83820e73820e8386a21e93820e83820e9386a21" + "ea3820e93820ea386a21eb3820ea3820eb386a21ec3820eb3820ec386a21ed3820ec3820ed386a21ee3820ed3820ee386a21ef3820ee3820ef" + "386a21f03820ef3820f0386a21f13820f03820f1386a21f23820f13820f2386a21f33820f23820f3386a21f43820f33820f4386a21f53820f4" + "3820f5386a21f63820f53820f6386a21f73820f63820f7386a21f83820f73820f8386a21f93820f83820f9386a21fa3820f93820fa386a21fb" + "3820fa3820fb386a21fc3820fb3820fc386a21fd3820fc3820fd386a21fe3820fd3820fe386a21ff3820fe3820ff386a21803920ff38208039" + "6a2181392080392081396a2182392081392082396a2183392082392083396a2184392083392084396a2185392084392085396a218639208539" + "2086396a2187392086392087396a2188392087392088396a2189392088392089396a218a39208939208a396a218b39208a39208b396a218c39" + "208b39208c396a218d39208c39208d396a218e39208d39208e396a218f39208e39208f396a219039208f392090396a2191392090392091396a" + "2192392091392092396a2193392092392093396a2194392093392094396a2195392094392095396a2196392095392096396a21973920963920" + "97396a2198392097392098396a2199392098392099396a219a39209939209a396a219b39209a39209b396a219c39209b39209c396a219d3920" + "9c39209d396a219e39209d39209e396a219f39209e39209f396a21a039209f3920a0396a21a13920a03920a1396a21a23920a13920a2396a21" + "a33920a23920a3396a21a43920a33920a4396a21a53920a43920a5396a21a63920a53920a6396a21a73920a63920a7396a21a83920a73920a8" + "396a21a93920a83920a9396a21aa3920a93920aa396a21ab3920aa3920ab396a21ac3920ab3920ac396a21ad3920ac3920ad396a21ae3920ad" + "3920ae396a21af3920ae3920af396a21b03920af3920b0396a21b13920b03920b1396a21b23920b13920b2396a21b33920b23920b3396a21b4" + "3920b33920b4396a21b53920b43920b5396a21b63920b53920b6396a21b73920b63920b7396a21b83920b73920b8396a21b93920b83920b939" + "6a21ba3920b93920ba396a21bb3920ba3920bb396a21bc3920bb3920bc396a21bd3920bc3920bd396a21be3920bd3920be396a21bf3920be39" + "20bf396a21c03920bf3920c0396a21c13920c03920c1396a21c23920c13920c2396a21c33920c23920c3396a21c43920c33920c4396a21c539" + "20c43920c5396a21c63920c53920c6396a21c73920c63920c7396a21c83920c73920c8396a21c93920c83920c9396a21ca3920c93920ca396a" + "21cb3920ca3920cb396a21cc3920cb3920cc396a21cd3920cc3920cd396a21ce3920cd3920ce396a21cf3920ce3920cf396a21d03920cf3920" + "d0396a21d13920d03920d1396a21d23920d13920d2396a21d33920d23920d3396a21d43920d33920d4396a21d53920d43920d5396a21d63920" + "d53920d6396a21d73920d63920d7396a21d83920d73920d8396a21d93920d83920d9396a21da3920d93920da396a21db3920da3920db396a21" + "dc3920db3920dc396a21dd3920dc3920dd396a21de3920dd3920de396a21df3920de3920df396a21e03920df3920e0396a21e13920e03920e1" + "396a21e23920e13920e2396a21e33920e23920e3396a21e43920e33920e4396a21e53920e43920e5396a21e63920e53920e6396a21e73920e6" + "3920e7396a21e83920e73920e8396a21e93920e83920e9396a21ea3920e93920ea396a21eb3920ea3920eb396a21ec3920eb3920ec396a21ed" + "3920ec3920ed396a21ee3920ed3920ee396a21ef3920ee3920ef396a21f03920ef3920f0396a21f13920f03920f1396a21f23920f13920f239" + "6a21f33920f23920f3396a21f43920f33920f4396a21f53920f43920f5396a21f63920f53920f6396a21f73920f63920f7396a21f83920f739" + "20f8396a21f93920f83920f9396a21fa3920f93920fa396a21fb3920fa3920fb396a21fc3920fb3920fc396a21fd3920fc3920fd396a21fe39" + "20fd3920fe396a21ff3920fe3920ff396a21803a20ff3920803a6a21813a20803a20813a6a21823a20813a20823a6a21833a20823a20833a6a" + "21843a20833a20843a6a21853a20843a20853a6a21863a20853a20863a6a21873a20863a20873a6a21883a20873a20883a6a21893a20883a20" + "893a6a218a3a20893a208a3a6a218b3a208a3a208b3a6a218c3a208b3a208c3a6a218d3a208c3a208d3a6a218e3a208d3a208e3a6a218f3a20" + "8e3a208f3a6a21903a208f3a20903a6a21913a20903a20913a6a21923a20913a20923a6a21933a20923a20933a6a21943a20933a20943a6a21" + "953a20943a20953a6a21963a20953a20963a6a21973a20963a20973a6a21983a20973a20983a6a21993a20983a20993a6a219a3a20993a209a" + "3a6a219b3a209a3a209b3a6a219c3a209b3a209c3a6a219d3a209c3a209d3a6a219e3a209d3a209e3a6a219f3a209e3a209f3a6a21a03a209f" + "3a20a03a6a21a13a20a03a20a13a6a21a23a20a13a20a23a6a21a33a20a23a20a33a6a21a43a20a33a20a43a6a21a53a20a43a20a53a6a21a6" + "3a20a53a20a63a6a21a73a20a63a20a73a6a21a83a20a73a20a83a6a21a93a20a83a20a93a6a21aa3a20a93a20aa3a6a21ab3a20aa3a20ab3a" + "6a21ac3a20ab3a20ac3a6a21ad3a20ac3a20ad3a6a21ae3a20ad3a20ae3a6a21af3a20ae3a20af3a6a21b03a20af3a20b03a6a21b13a20b03a" + "20b13a6a21b23a20b13a20b23a6a21b33a20b23a20b33a6a21b43a20b33a20b43a6a21b53a20b43a20b53a6a21b63a20b53a20b63a6a21b73a" + "20b63a20b73a6a21b83a20b73a20b83a6a21b93a20b83a20b93a6a21ba3a20b93a20ba3a6a21bb3a20ba3a20bb3a6a21bc3a20bb3a20bc3a6a" + "21bd3a20bc3a20bd3a6a21be3a20bd3a20be3a6a21bf3a20be3a20bf3a6a21c03a20bf3a20c03a6a21c13a20c03a20c13a6a21c23a20c13a20" + "c23a6a21c33a20c23a20c33a6a21c43a20c33a20c43a6a21c53a20c43a20c53a6a21c63a20c53a20c63a6a21c73a20c63a20c73a6a21c83a20" + "c73a20c83a6a21c93a20c83a20c93a6a21ca3a20c93a20ca3a6a21cb3a20ca3a20cb3a6a21cc3a20cb3a20cc3a6a21cd3a20cc3a20cd3a6a21" + "ce3a20cd3a20ce3a6a21cf3a20ce3a20cf3a6a21d03a20cf3a20d03a6a21d13a20d03a20d13a6a21d23a20d13a20d23a6a21d33a20d23a20d3" + "3a6a21d43a20d33a20d43a6a21d53a20d43a20d53a6a21d63a20d53a20d63a6a21d73a20d63a20d73a6a21d83a20d73a20d83a6a21d93a20d8" + "3a20d93a6a21da3a20d93a20da3a6a21db3a20da3a20db3a6a21dc3a20db3a20dc3a6a21dd3a20dc3a20dd3a6a21de3a20dd3a20de3a6a21df" + "3a20de3a20df3a6a21e03a20df3a20e03a6a21e13a20e03a20e13a6a21e23a20e13a20e23a6a21e33a20e23a20e33a6a21e43a20e33a20e43a" + "6a21e53a20e43a20e53a6a21e63a20e53a20e63a6a21e73a20e63a20e73a6a21e83a20e73a20e83a6a21e93a20e83a20e93a6a21ea3a20e93a" + "20ea3a6a21eb3a20ea3a20eb3a6a21ec3a20eb3a20ec3a6a21ed3a20ec3a20ed3a6a21ee3a20ed3a20ee3a6a21ef3a20ee3a20ef3a6a21f03a" + "20ef3a20f03a6a21f13a20f03a20f13a6a21f23a20f13a20f23a6a21f33a20f23a20f33a6a21f43a20f33a20f43a6a21f53a20f43a20f53a6a" + "21f63a20f53a20f63a6a21f73a20f63a20f73a6a21f83a20f73a20f83a6a21f93a20f83a20f93a6a21fa3a20f93a20fa3a6a21fb3a20fa3a20" + "fb3a6a21fc3a20fb3a20fc3a6a21fd3a20fc3a20fd3a6a21fe3a20fd3a20fe3a6a21ff3a20fe3a20ff3a6a21803b20ff3a20803b6a21813b20" + "803b20813b6a21823b20813b20823b6a21833b20823b20833b6a21843b20833b20843b6a21853b20843b20853b6a21863b20853b20863b6a21" + "873b20863b20873b6a21883b20873b20883b6a21893b20883b20893b6a218a3b20893b208a3b6a218b3b208a3b208b3b6a218c3b208b3b208c" + "3b6a218d3b208c3b208d3b6a218e3b208d3b208e3b6a218f3b208e3b208f3b6a21903b208f3b20903b6a21913b20903b20913b6a21923b2091" + "3b20923b6a21933b20923b20933b6a21943b20933b20943b6a21953b20943b20953b6a21963b20953b20963b6a21973b20963b20973b6a2198" + "3b20973b20983b6a21993b20983b20993b6a219a3b20993b209a3b6a219b3b209a3b209b3b6a219c3b209b3b209c3b6a219d3b209c3b209d3b" + "6a219e3b209d3b209e3b6a219f3b209e3b209f3b6a21a03b209f3b20a03b6a21a13b20a03b20a13b6a21a23b20a13b20a23b6a21a33b20a23b" + "20a33b6a21a43b20a33b20a43b6a21a53b20a43b20a53b6a21a63b20a53b20a63b6a21a73b20a63b20a73b6a21a83b20a73b20a83b6a21a93b" + "20a83b20a93b6a21aa3b20a93b20aa3b6a21ab3b20aa3b20ab3b6a21ac3b20ab3b20ac3b6a21ad3b20ac3b20ad3b6a21ae3b20ad3b20ae3b6a" + "21af3b20ae3b20af3b6a21b03b20af3b20b03b6a21b13b20b03b20b13b6a21b23b20b13b20b23b6a21b33b20b23b20b33b6a21b43b20b33b20" + "b43b6a21b53b20b43b20b53b6a21b63b20b53b20b63b6a21b73b20b63b20b73b6a21b83b20b73b20b83b6a21b93b20b83b20b93b6a21ba3b20" + "b93b20ba3b6a21bb3b20ba3b20bb3b6a21bc3b20bb3b20bc3b6a21bd3b20bc3b20bd3b6a21be3b20bd3b20be3b6a21bf3b20be3b20bf3b6a21" + "c03b20bf3b20c03b6a21c13b20c03b20c13b6a21c23b20c13b20c23b6a21c33b20c23b20c33b6a21c43b20c33b20c43b6a21c53b20c43b20c5" + "3b6a21c63b20c53b20c63b6a21c73b20c63b20c73b6a21c83b20c73b20c83b6a21c93b20c83b20c93b6a21ca3b20c93b20ca3b6a21cb3b20ca" + "3b20cb3b6a21cc3b20cb3b20cc3b6a21cd3b20cc3b20cd3b6a21ce3b20cd3b20ce3b6a21cf3b20ce3b20cf3b6a21d03b20cf3b20d03b6a21d1" + "3b20d03b20d13b6a21d23b20d13b20d23b6a21d33b20d23b20d33b6a21d43b20d33b20d43b6a21d53b20d43b20d53b6a21d63b20d53b20d63b" + "6a21d73b20d63b20d73b6a21d83b20d73b20d83b6a21d93b20d83b20d93b6a21da3b20d93b20da3b6a21db3b20da3b20db3b6a21dc3b20db3b" + "20dc3b6a21dd3b20dc3b20dd3b6a21de3b20dd3b20de3b6a21df3b20de3b20df3b6a21e03b20df3b20e03b6a21e13b20e03b20e13b6a21e23b" + "20e13b20e23b6a21e33b20e23b20e33b6a21e43b20e33b20e43b6a21e53b20e43b20e53b6a21e63b20e53b20e63b6a21e73b20e63b20e73b6a" + "21e83b20e73b20e83b6a21e93b20e83b20e93b6a21ea3b20e93b20ea3b6a21eb3b20ea3b20eb3b6a21ec3b20eb3b20ec3b6a21ed3b20ec3b20" + "ed3b6a21ee3b20ed3b20ee3b6a21ef3b20ee3b20ef3b6a21f03b20ef3b20f03b6a21f13b20f03b20f13b6a21f23b20f13b20f23b6a21f33b20" + "f23b20f33b6a21f43b20f33b20f43b6a21f53b20f43b20f53b6a21f63b20f53b20f63b6a21f73b20f63b20f73b6a21f83b20f73b20f83b6a21" + "f93b20f83b20f93b6a21fa3b20f93b20fa3b6a21fb3b20fa3b20fb3b6a21fc3b20fb3b20fc3b6a21fd3b20fc3b20fd3b6a21fe3b20fd3b20fe" + "3b6a21ff3b20fe3b20ff3b6a21803c20ff3b20803c6a21813c20803c20813c6a21823c20813c20823c6a21833c20823c20833c6a21843c2083" + "3c20843c6a21853c20843c20853c6a21863c20853c20863c6a21873c20863c20873c6a21883c20873c20883c6a21893c20883c20893c6a218a" + "3c20893c208a3c6a218b3c208a3c208b3c6a218c3c208b3c208c3c6a218d3c208c3c208d3c6a218e3c208d3c208e3c6a218f3c208e3c208f3c" + "6a21903c208f3c20903c6a21913c20903c20913c6a21923c20913c20923c6a21933c20923c20933c6a21943c20933c20943c6a21953c20943c" + "20953c6a21963c20953c20963c6a21973c20963c20973c6a21983c20973c20983c6a21993c20983c20993c6a219a3c20993c209a3c6a219b3c" + "209a3c209b3c6a219c3c209b3c209c3c6a219d3c209c3c209d3c6a219e3c209d3c209e3c6a219f3c209e3c209f3c6a21a03c209f3c20a03c6a" + "21a13c20a03c20a13c6a21a23c20a13c20a23c6a21a33c20a23c20a33c6a21a43c20a33c20a43c6a21a53c20a43c20a53c6a21a63c20a53c20" + "a63c6a21a73c20a63c20a73c6a21a83c20a73c20a83c6a21a93c20a83c20a93c6a21aa3c20a93c20aa3c6a21ab3c20aa3c20ab3c6a21ac3c20" + "ab3c20ac3c6a21ad3c20ac3c20ad3c6a21ae3c20ad3c20ae3c6a21af3c20ae3c20af3c6a21b03c20af3c20b03c6a21b13c20b03c20b13c6a21" + "b23c20b13c20b23c6a21b33c20b23c20b33c6a21b43c20b33c20b43c6a21b53c20b43c20b53c6a21b63c20b53c20b63c6a21b73c20b63c20b7" + "3c6a21b83c20b73c20b83c6a21b93c20b83c20b93c6a21ba3c20b93c20ba3c6a21bb3c20ba3c20bb3c6a21bc3c20bb3c20bc3c6a21bd3c20bc" + "3c20bd3c6a21be3c20bd3c20be3c6a21bf3c20be3c20bf3c6a21c03c20bf3c20c03c6a21c13c20c03c20c13c6a21c23c20c13c20c23c6a21c3" + "3c20c23c20c33c6a21c43c20c33c20c43c6a21c53c20c43c20c53c6a21c63c20c53c20c63c6a21c73c20c63c20c73c6a21c83c20c73c20c83c" + "6a21c93c20c83c20c93c6a21ca3c20c93c20ca3c6a21cb3c20ca3c20cb3c6a21cc3c20cb3c20cc3c6a21cd3c20cc3c20cd3c6a21ce3c20cd3c" + "20ce3c6a21cf3c20ce3c20cf3c6a21d03c20cf3c20d03c6a21d13c20d03c20d13c6a21d23c20d13c20d23c6a21d33c20d23c20d33c6a21d43c" + "20d33c20d43c6a21d53c20d43c20d53c6a21d63c20d53c20d63c6a21d73c20d63c20d73c6a21d83c20d73c20d83c6a21d93c20d83c20d93c6a" + "21da3c20d93c20da3c6a21db3c20da3c20db3c6a21dc3c20db3c20dc3c6a21dd3c20dc3c20dd3c6a21de3c20dd3c20de3c6a21df3c20de3c20" + "df3c6a21e03c20df3c20e03c6a21e13c20e03c20e13c6a21e23c20e13c20e23c6a21e33c20e23c20e33c6a21e43c20e33c20e43c6a21e53c20" + "e43c20e53c6a21e63c20e53c20e63c6a21e73c20e63c20e73c6a21e83c20e73c20e83c6a21e93c20e83c20e93c6a21ea3c20e93c20ea3c6a21" + "eb3c20ea3c20eb3c6a21ec3c20eb3c20ec3c6a21ed3c20ec3c20ed3c6a21ee3c20ed3c20ee3c6a21ef3c20ee3c20ef3c6a21f03c20ef3c20f0" + "3c6a21f13c20f03c20f13c6a21f23c20f13c20f23c6a21f33c20f23c20f33c6a21f43c20f33c20f43c6a21f53c20f43c20f53c6a21f63c20f5" + "3c20f63c6a21f73c20f63c20f73c6a21f83c20f73c20f83c6a21f93c20f83c20f93c6a21fa3c20f93c20fa3c6a21fb3c20fa3c20fb3c6a21fc" + "3c20fb3c20fc3c6a21fd3c20fc3c20fd3c6a21fe3c20fd3c20fe3c6a21ff3c20fe3c20ff3c6a21803d20ff3c20803d6a21813d20803d20813d" + "6a21823d20813d20823d6a21833d20823d20833d6a21843d20833d20843d6a21853d20843d20853d6a21863d20853d20863d6a21873d20863d" + "20873d6a21883d20873d20883d6a21893d20883d20893d6a218a3d20893d208a3d6a218b3d208a3d208b3d6a218c3d208b3d208c3d6a218d3d" + "208c3d208d3d6a218e3d208d3d208e3d6a218f3d208e3d208f3d6a21903d208f3d20903d6a21913d20903d20913d6a21923d20913d20923d6a" + "21933d20923d20933d6a21943d20933d20943d6a21953d20943d20953d6a21963d20953d20963d6a21973d20963d20973d6a21983d20973d20" + "983d6a21993d20983d20993d6a219a3d20993d209a3d6a219b3d209a3d209b3d6a219c3d209b3d209c3d6a219d3d209c3d209d3d6a219e3d20" + "9d3d209e3d6a219f3d209e3d209f3d6a21a03d209f3d20a03d6a21a13d20a03d20a13d6a21a23d20a13d20a23d6a21a33d20a23d20a33d6a21" + "a43d20a33d20a43d6a21a53d20a43d20a53d6a21a63d20a53d20a63d6a21a73d20a63d20a73d6a21a83d20a73d20a83d6a21a93d20a83d20a9" + "3d6a21aa3d20a93d20aa3d6a21ab3d20aa3d20ab3d6a21ac3d20ab3d20ac3d6a21ad3d20ac3d20ad3d6a21ae3d20ad3d20ae3d6a21af3d20ae" + "3d20af3d6a21b03d20af3d20b03d6a21b13d20b03d20b13d6a21b23d20b13d20b23d6a21b33d20b23d20b33d6a21b43d20b33d20b43d6a21b5" + "3d20b43d20b53d6a21b63d20b53d20b63d6a21b73d20b63d20b73d6a21b83d20b73d20b83d6a21b93d20b83d20b93d6a21ba3d20b93d20ba3d" + "6a21bb3d20ba3d20bb3d6a21bc3d20bb3d20bc3d6a21bd3d20bc3d20bd3d6a21be3d20bd3d20be3d6a21bf3d20be3d20bf3d6a21c03d20bf3d" + "20c03d6a21c13d20c03d20c13d6a21c23d20c13d20c23d6a21c33d20c23d20c33d6a21c43d20c33d20c43d6a21c53d20c43d20c53d6a21c63d" + "20c53d20c63d6a21c73d20c63d20c73d6a21c83d20c73d20c83d6a21c93d20c83d20c93d6a21ca3d20c93d20ca3d6a21cb3d20ca3d20cb3d6a" + "21cc3d20cb3d20cc3d6a21cd3d20cc3d20cd3d6a21ce3d20cd3d20ce3d6a21cf3d20ce3d20cf3d6a21d03d20cf3d20d03d6a21d13d20d03d20" + "d13d6a21d23d20d13d20d23d6a21d33d20d23d20d33d6a21d43d20d33d20d43d6a21d53d20d43d20d53d6a21d63d20d53d20d63d6a21d73d20" + "d63d20d73d6a21d83d20d73d20d83d6a21d93d20d83d20d93d6a21da3d20d93d20da3d6a21db3d20da3d20db3d6a21dc3d20db3d20dc3d6a21" + "dd3d20dc3d20dd3d6a21de3d20dd3d20de3d6a21df3d20de3d20df3d6a21e03d20df3d20e03d6a21e13d20e03d20e13d6a21e23d20e13d20e2" + "3d6a21e33d20e23d20e33d6a21e43d20e33d20e43d6a21e53d20e43d20e53d6a21e63d20e53d20e63d6a21e73d20e63d20e73d6a21e83d20e7" + "3d20e83d6a21e93d20e83d20e93d6a21ea3d20e93d20ea3d6a21eb3d20ea3d20eb3d6a21ec3d20eb3d20ec3d6a21ed3d20ec3d20ed3d6a21ee" + "3d20ed3d20ee3d6a21ef3d20ee3d20ef3d6a21f03d20ef3d20f03d6a21f13d20f03d20f13d6a21f23d20f13d20f23d6a21f33d20f23d20f33d" + "6a21f43d20f33d20f43d6a21f53d20f43d20f53d6a21f63d20f53d20f63d6a21f73d20f63d20f73d6a21f83d20f73d20f83d6a21f93d20f83d" + "20f93d6a21fa3d20f93d20fa3d6a21fb3d20fa3d20fb3d6a21fc3d20fb3d20fc3d6a21fd3d20fc3d20fd3d6a21fe3d20fd3d20fe3d6a21ff3d" + "20fe3d20ff3d6a21803e20ff3d20803e6a21813e20803e20813e6a21823e20813e20823e6a21833e20823e20833e6a21843e20833e20843e6a" + "21853e20843e20853e6a21863e20853e20863e6a21873e20863e20873e6a21883e20873e20883e6a21893e20883e20893e6a218a3e20893e20" + "8a3e6a218b3e208a3e208b3e6a218c3e208b3e208c3e6a218d3e208c3e208d3e6a218e3e208d3e208e3e6a218f3e208e3e208f3e6a21903e20" + "8f3e20903e6a21913e20903e20913e6a21923e20913e20923e6a21933e20923e20933e6a21943e20933e20943e6a21953e20943e20953e6a21" + "963e20953e20963e6a21973e20963e20973e6a21983e20973e20983e6a21993e20983e20993e6a219a3e20993e209a3e6a219b3e209a3e209b" + "3e6a219c3e209b3e209c3e6a219d3e209c3e209d3e6a219e3e209d3e209e3e6a219f3e209e3e209f3e6a21a03e209f3e20a03e6a21a13e20a0" + "3e20a13e6a21a23e20a13e20a23e6a21a33e20a23e20a33e6a21a43e20a33e20a43e6a21a53e20a43e20a53e6a21a63e20a53e20a63e6a21a7" + "3e20a63e20a73e6a21a83e20a73e20a83e6a21a93e20a83e20a93e6a21aa3e20a93e20aa3e6a21ab3e20aa3e20ab3e6a21ac3e20ab3e20ac3e" + "6a21ad3e20ac3e20ad3e6a21ae3e20ad3e20ae3e6a21af3e20ae3e20af3e6a21b03e20af3e20b03e6a21b13e20b03e20b13e6a21b23e20b13e" + "20b23e6a21b33e20b23e20b33e6a21b43e20b33e20b43e6a21b53e20b43e20b53e6a21b63e20b53e20b63e6a21b73e20b63e20b73e6a21b83e" + "20b73e20b83e6a21b93e20b83e20b93e6a21ba3e20b93e20ba3e6a21bb3e20ba3e20bb3e6a21bc3e20bb3e20bc3e6a21bd3e20bc3e20bd3e6a" + "21be3e20bd3e20be3e6a21bf3e20be3e20bf3e6a21c03e20bf3e20c03e6a21c13e20c03e20c13e6a21c23e20c13e20c23e6a21c33e20c23e20" + "c33e6a21c43e20c33e20c43e6a21c53e20c43e20c53e6a21c63e20c53e20c63e6a21c73e20c63e20c73e6a21c83e20c73e20c83e6a21c93e20" + "c83e20c93e6a21ca3e20c93e20ca3e6a21cb3e20ca3e20cb3e6a21cc3e20cb3e20cc3e6a21cd3e20cc3e20cd3e6a21ce3e20cd3e20ce3e6a21" + "cf3e20ce3e20cf3e6a21d03e20cf3e20d03e6a21d13e20d03e20d13e6a21d23e20d13e20d23e6a21d33e20d23e20d33e6a21d43e20d33e20d4" + "3e6a21d53e20d43e20d53e6a21d63e20d53e20d63e6a21d73e20d63e20d73e6a21d83e20d73e20d83e6a21d93e20d83e20d93e6a21da3e20d9" + "3e20da3e6a21db3e20da3e20db3e6a21dc3e20db3e20dc3e6a21dd3e20dc3e20dd3e6a21de3e20dd3e20de3e6a21df3e20de3e20df3e6a21e0" + "3e20df3e20e03e6a21e13e20e03e20e13e6a21e23e20e13e20e23e6a21e33e20e23e20e33e6a21e43e20e33e20e43e6a21e53e20e43e20e53e" + "6a21e63e20e53e20e63e6a21e73e20e63e20e73e6a21e83e20e73e20e83e6a21e93e20e83e20e93e6a21ea3e20e93e20ea3e6a21eb3e20ea3e" + "20eb3e6a21ec3e20eb3e20ec3e6a21ed3e20ec3e20ed3e6a21ee3e20ed3e20ee3e6a21ef3e20ee3e20ef3e6a21f03e20ef3e20f03e6a21f13e" + "20f03e20f13e6a21f23e20f13e20f23e6a21f33e20f23e20f33e6a21f43e20f33e20f43e6a21f53e20f43e20f53e6a21f63e20f53e20f63e6a" + "21f73e20f63e20f73e6a21f83e20f73e20f83e6a21f93e20f83e20f93e6a21fa3e20f93e20fa3e6a21fb3e20fa3e20fb3e6a21fc3e20fb3e20" + "fc3e6a21fd3e20fc3e20fd3e6a21fe3e20fd3e20fe3e6a21ff3e20fe3e20ff3e6a21803f20ff3e20803f6a21813f20803f20813f6a21823f20" + "813f20823f6a21833f20823f20833f6a21843f20833f20843f6a21853f20843f20853f6a21863f20853f20863f6a21873f20863f20873f6a21" + "883f20873f20883f6a21893f20883f20893f6a218a3f20893f208a3f6a218b3f208a3f208b3f6a218c3f208b3f208c3f6a218d3f208c3f208d" + "3f6a218e3f208d3f208e3f6a218f3f208e3f208f3f6a21903f208f3f20903f6a21913f20903f20913f6a21923f20913f20923f6a21933f2092" + "3f20933f6a21943f20933f20943f6a21953f20943f20953f6a21963f20953f20963f6a21973f20963f20973f6a21983f20973f20983f6a2199" + "3f20983f20993f6a219a3f20993f209a3f6a219b3f209a3f209b3f6a219c3f209b3f209c3f6a219d3f209c3f209d3f6a219e3f209d3f209e3f" + "6a219f3f209e3f209f3f6a21a03f209f3f20a03f6a21a13f20a03f20a13f6a21a23f20a13f20a23f6a21a33f20a23f20a33f6a21a43f20a33f" + "20a43f6a21a53f20a43f20a53f6a21a63f20a53f20a63f6a21a73f20a63f20a73f6a21a83f20a73f20a83f6a21a93f20a83f20a93f6a21aa3f" + "20a93f20aa3f6a21ab3f20aa3f20ab3f6a21ac3f20ab3f20ac3f6a21ad3f20ac3f20ad3f6a21ae3f20ad3f20ae3f6a21af3f20ae3f20af3f6a" + "21b03f20af3f20b03f6a21b13f20b03f20b13f6a21b23f20b13f20b23f6a21b33f20b23f20b33f6a21b43f20b33f20b43f6a21b53f20b43f20" + "b53f6a21b63f20b53f20b63f6a21b73f20b63f20b73f6a21b83f20b73f20b83f6a21b93f20b83f20b93f6a21ba3f20b93f20ba3f6a21bb3f20" + "ba3f20bb3f6a21bc3f20bb3f20bc3f6a21bd3f20bc3f20bd3f6a21be3f20bd3f20be3f6a21bf3f20be3f20bf3f6a21c03f20bf3f20c03f6a21" + "c13f20c03f20c13f6a21c23f20c13f20c23f6a21c33f20c23f20c33f6a21c43f20c33f20c43f6a21c53f20c43f20c53f6a21c63f20c53f20c6" + "3f6a21c73f20c63f20c73f6a21c83f20c73f20c83f6a21c93f20c83f20c93f6a21ca3f20c93f20ca3f6a21cb3f20ca3f20cb3f6a21cc3f20cb" + "3f20cc3f6a21cd3f20cc3f20cd3f6a21ce3f20cd3f20ce3f6a21cf3f20ce3f20cf3f6a21d03f20cf3f20d03f6a21d13f20d03f20d13f6a21d2" + "3f20d13f20d23f6a21d33f20d23f20d33f6a21d43f20d33f20d43f6a21d53f20d43f20d53f6a21d63f20d53f20d63f6a21d73f20d63f20d73f" + "6a21d83f20d73f20d83f6a21d93f20d83f20d93f6a21da3f20d93f20da3f6a21db3f20da3f20db3f6a21dc3f20db3f20dc3f6a21dd3f20dc3f" + "20dd3f6a21de3f20dd3f20de3f6a21df3f20de3f20df3f6a21e03f20df3f20e03f6a21e13f20e03f20e13f6a21e23f20e13f20e23f6a21e33f" + "20e23f20e33f6a21e43f20e33f20e43f6a21e53f20e43f20e53f6a21e63f20e53f20e63f6a21e73f20e63f20e73f6a21e83f20e73f20e83f6a" + "21e93f20e83f20e93f6a21ea3f20e93f20ea3f6a21eb3f20ea3f20eb3f6a21ec3f20eb3f20ec3f6a21ed3f20ec3f20ed3f6a21ee3f20ed3f20" + "ee3f6a21ef3f20ee3f20ef3f6a21f03f20ef3f20f03f6a21f13f20f03f20f13f6a21f23f20f13f20f23f6a21f33f20f23f20f33f6a21f43f20" + "f33f20f43f6a21f53f20f43f20f53f6a21f63f20f53f20f63f6a21f73f20f63f20f73f6a21f83f20f73f20f83f6a21f93f20f83f20f93f6a21" + "fa3f20f93f20fa3f6a21fb3f20fa3f20fb3f6a21fc3f20fb3f20fc3f6a21fd3f20fc3f20fd3f6a21fe3f20fd3f20fe3f6a21ff3f20fe3f20ff" + "3f6a21804020ff3f2080406a2181402080402081406a2182402081402082406a2183402082402083406a2184402083402084406a2185402084" + "402085406a2186402085402086406a2187402086402087406a2188402087402088406a2189402088402089406a218a40208940208a406a218b" + "40208a40208b406a218c40208b40208c406a218d40208c40208d406a218e40208d40208e406a218f40208e40208f406a219040208f40209040" + "6a2191402090402091406a2192402091402092406a2193402092402093406a2194402093402094406a2195402094402095406a219640209540" + "2096406a2197402096402097406a2198402097402098406a2199402098402099406a219a40209940209a406a219b40209a40209b406a219c40" + "209b40209c406a219d40209c40209d406a219e40209d40209e406a219f40209e40209f406a21a040209f4020a0406a21a14020a04020a1406a" + "21a24020a14020a2406a21a34020a24020a3406a21a44020a34020a4406a21a54020a44020a5406a21a64020a54020a6406a21a74020a64020" + "a7406a21a84020a74020a8406a21a94020a84020a9406a21aa4020a94020aa406a21ab4020aa4020ab406a21ac4020ab4020ac406a21ad4020" + "ac4020ad406a21ae4020ad4020ae406a21af4020ae4020af406a21b04020af4020b0406a21b14020b04020b1406a21b24020b14020b2406a21" + "b34020b24020b3406a21b44020b34020b4406a21b54020b44020b5406a21b64020b54020b6406a21b74020b64020b7406a21b84020b74020b8" + "406a21b94020b84020b9406a21ba4020b94020ba406a21bb4020ba4020bb406a21bc4020bb4020bc406a21bd4020bc4020bd406a21be4020bd" + "4020be406a21bf4020be4020bf406a21c04020bf4020c0406a21c14020c04020c1406a21c24020c14020c2406a21c34020c24020c3406a21c4" + "4020c34020c4406a21c54020c44020c5406a21c64020c54020c6406a21c74020c64020c7406a21c84020c74020c8406a21c94020c84020c940" + "6a21ca4020c94020ca406a21cb4020ca4020cb406a21cc4020cb4020cc406a21cd4020cc4020cd406a21ce4020cd4020ce406a21cf4020ce40" + "20cf406a21d04020cf4020d0406a21d14020d04020d1406a21d24020d14020d2406a21d34020d24020d3406a21d44020d34020d4406a21d540" + "20d44020d5406a21d64020d54020d6406a21d74020d64020d7406a21d84020d74020d8406a21d94020d84020d9406a21da4020d94020da406a" + "21db4020da4020db406a21dc4020db4020dc406a21dd4020dc4020dd406a21de4020dd4020de406a21df4020de4020df406a21e04020df4020" + "e0406a21e14020e04020e1406a21e24020e14020e2406a21e34020e24020e3406a21e44020e34020e4406a21e54020e44020e5406a21e64020" + "e54020e6406a21e74020e64020e7406a21e84020e74020e8406a21e94020e84020e9406a21ea4020e94020ea406a21eb4020ea4020eb406a21" + "ec4020eb4020ec406a21ed4020ec4020ed406a21ee4020ed4020ee406a21ef4020ee4020ef406a21f04020ef4020f0406a21f14020f04020f1" + "406a21f24020f14020f2406a21f34020f24020f3406a21f44020f34020f4406a21f54020f44020f5406a21f64020f54020f6406a21f74020f6" + "4020f7406a21f84020f74020f8406a21f94020f84020f9406a21fa4020f94020fa406a21fb4020fa4020fb406a21fc4020fb4020fc406a21fd" + "4020fc4020fd406a21fe4020fd4020fe406a21ff4020fe4020ff406a21804120ff402080416a2181412080412081416a218241208141208241" + "6a2183412082412083416a2184412083412084416a2185412084412085416a2186412085412086416a2187412086412087416a218841208741" + "2088416a2189412088412089416a218a41208941208a416a218b41208a41208b416a218c41208b41208c416a218d41208c41208d416a218e41" + "208d41208e416a218f41208e41208f416a219041208f412090416a2191412090412091416a2192412091412092416a2193412092412093416a" + "2194412093412094416a2195412094412095416a2196412095412096416a2197412096412097416a2198412097412098416a21994120984120" + "99416a219a41209941209a416a219b41209a41209b416a219c41209b41209c416a219d41209c41209d416a219e41209d41209e416a219f4120" + "9e41209f416a21a041209f4120a0416a21a14120a04120a1416a21a24120a14120a2416a21a34120a24120a3416a21a44120a34120a4416a21" + "a54120a44120a5416a21a64120a54120a6416a21a74120a64120a7416a21a84120a74120a8416a21a94120a84120a9416a21aa4120a94120aa" + "416a21ab4120aa4120ab416a21ac4120ab4120ac416a21ad4120ac4120ad416a21ae4120ad4120ae416a21af4120ae4120af416a21b04120af" + "4120b0416a21b14120b04120b1416a21b24120b14120b2416a21b34120b24120b3416a21b44120b34120b4416a21b54120b44120b5416a21b6" + "4120b54120b6416a21b74120b64120b7416a21b84120b74120b8416a21b94120b84120b9416a21ba4120b94120ba416a21bb4120ba4120bb41" + "6a21bc4120bb4120bc416a21bd4120bc4120bd416a21be4120bd4120be416a21bf4120be4120bf416a21c04120bf4120c0416a21c14120c041" + "20c1416a21c24120c14120c2416a21c34120c24120c3416a21c44120c34120c4416a21c54120c44120c5416a21c64120c54120c6416a21c741" + "20c64120c7416a21c84120c74120c8416a21c94120c84120c9416a21ca4120c94120ca416a21cb4120ca4120cb416a21cc4120cb4120cc416a" + "21cd4120cc4120cd416a21ce4120cd4120ce416a21cf4120ce4120cf416a21d04120cf4120d0416a21d14120d04120d1416a21d24120d14120" + "d2416a21d34120d24120d3416a21d44120d34120d4416a21d54120d44120d5416a21d64120d54120d6416a21d74120d64120d7416a21d84120" + "d74120d8416a21d94120d84120d9416a21da4120d94120da416a21db4120da4120db416a21dc4120db4120dc416a21dd4120dc4120dd416a21" + "de4120dd4120de416a21df4120de4120df416a21e04120df4120e0416a21e14120e04120e1416a21e24120e14120e2416a21e34120e24120e3" + "416a21e44120e34120e4416a21e54120e44120e5416a21e64120e54120e6416a21e74120e64120e7416a21e84120e74120e8416a21e94120e8" + "4120e9416a21ea4120e94120ea416a21eb4120ea4120eb416a21ec4120eb4120ec416a21ed4120ec4120ed416a21ee4120ed4120ee416a21ef" + "4120ee4120ef416a21f04120ef4120f0416a21f14120f04120f1416a21f24120f14120f2416a21f34120f24120f3416a21f44120f34120f441" + "6a21f54120f44120f5416a21f64120f54120f6416a21f74120f64120f7416a21f84120f74120f8416a21f94120f84120f9416a21fa4120f941" + "20fa416a21fb4120fa4120fb416a21fc4120fb4120fc416a21fd4120fc4120fd416a21fe4120fd4120fe416a21ff4120fe4120ff416a218042" + "20ff412080426a2181422080422081426a2182422081422082426a2183422082422083426a2184422083422084426a2185422084422085426a" + "2186422085422086426a2187422086422087426a2188422087422088426a2189422088422089426a218a42208942208a426a218b42208a4220" + "8b426a218c42208b42208c426a218d42208c42208d426a218e42208d42208e426a218f42208e42208f426a219042208f422090426a21914220" + "90422091426a2192422091422092426a2193422092422093426a2194422093422094426a2195422094422095426a2196422095422096426a21" + "97422096422097426a2198422097422098426a2199422098422099426a219a42209942209a426a219b42209a42209b426a219c42209b42209c" + "426a219d42209c42209d426a219e42209d42209e426a219f42209e42209f426a21a042209f4220a0426a21a14220a04220a1426a21a24220a1" + "4220a2426a21a34220a24220a3426a21a44220a34220a4426a21a54220a44220a5426a21a64220a54220a6426a21a74220a64220a7426a21a8" + "4220a74220a8426a21a94220a84220a9426a21aa4220a94220aa426a21ab4220aa4220ab426a21ac4220ab4220ac426a21ad4220ac4220ad42" + "6a21ae4220ad4220ae426a21af4220ae4220af426a21b04220af4220b0426a21b14220b04220b1426a21b24220b14220b2426a21b34220b242" + "20b3426a21b44220b34220b4426a21b54220b44220b5426a21b64220b54220b6426a21b74220b64220b7426a21b84220b74220b8426a21b942" + "20b84220b9426a21ba4220b94220ba426a21bb4220ba4220bb426a21bc4220bb4220bc426a21bd4220bc4220bd426a21be4220bd4220be426a" + "21bf4220be4220bf426a21c04220bf4220c0426a21c14220c04220c1426a21c24220c14220c2426a21c34220c24220c3426a21c44220c34220" + "c4426a21c54220c44220c5426a21c64220c54220c6426a21c74220c64220c7426a21c84220c74220c8426a21c94220c84220c9426a21ca4220" + "c94220ca426a21cb4220ca4220cb426a21cc4220cb4220cc426a21cd4220cc4220cd426a21ce4220cd4220ce426a21cf4220ce4220cf426a21" + "d04220cf4220d0426a21d14220d04220d1426a21d24220d14220d2426a21d34220d24220d3426a21d44220d34220d4426a21d54220d44220d5" + "426a21d64220d54220d6426a21d74220d64220d7426a21d84220d74220d8426a21d94220d84220d9426a21da4220d94220da426a21db4220da" + "4220db426a21dc4220db4220dc426a21dd4220dc4220dd426a21de4220dd4220de426a21df4220de4220df426a21e04220df4220e0426a21e1" + "4220e04220e1426a21e24220e14220e2426a21e34220e24220e3426a21e44220e34220e4426a21e54220e44220e5426a21e64220e54220e642" + "6a21e74220e64220e7426a21e84220e74220e8426a21e94220e84220e9426a21ea4220e94220ea426a21eb4220ea4220eb426a21ec4220eb42" + "20ec426a21ed4220ec4220ed426a21ee4220ed4220ee426a21ef4220ee4220ef426a21f04220ef4220f0426a21f14220f04220f1426a21f242" + "20f14220f2426a21f34220f24220f3426a21f44220f34220f4426a21f54220f44220f5426a21f64220f54220f6426a21f74220f64220f7426a" + "21f84220f74220f8426a21f94220f84220f9426a21fa4220f94220fa426a21fb4220fa4220fb426a21fc4220fb4220fc426a21fd4220fc4220" + "fd426a21fe4220fd4220fe426a21ff4220fe4220ff426a21804320ff422080436a2181432080432081436a2182432081432082436a21834320" + "82432083436a2184432083432084436a2185432084432085436a2186432085432086436a2187432086432087436a2188432087432088436a21" + "89432088432089436a218a43208943208a436a218b43208a43208b436a218c43208b43208c436a218d43208c43208d436a218e43208d43208e" + "436a218f43208e43208f436a219043208f432090436a2191432090432091436a2192432091432092436a2193432092432093436a2194432093" + "432094436a2195432094432095436a2196432095432096436a2197432096432097436a2198432097432098436a2199432098432099436a219a" + "43209943209a436a219b43209a43209b436a219c43209b43209c436a219d43209c43209d436a219e43209d43209e436a219f43209e43209f43" + "6a21a043209f4320a0436a21a14320a04320a1436a21a24320a14320a2436a21a34320a24320a3436a21a44320a34320a4436a21a54320a443" + "20a5436a21a64320a54320a6436a21a74320a64320a7436a21a84320a74320a8436a21a94320a84320a9436a21aa4320a94320aa436a21ab43" + "20aa4320ab436a21ac4320ab4320ac436a21ad4320ac4320ad436a21ae4320ad4320ae436a21af4320ae4320af436a21b04320af4320b0436a" + "21b14320b04320b1436a21b24320b14320b2436a21b34320b24320b3436a21b44320b34320b4436a21b54320b44320b5436a21b64320b54320" + "b6436a21b74320b64320b7436a21b84320b74320b8436a21b94320b84320b9436a21ba4320b94320ba436a21bb4320ba4320bb436a21bc4320" + "bb4320bc436a21bd4320bc4320bd436a21be4320bd4320be436a21bf4320be4320bf436a21c04320bf4320c0436a21c14320c04320c1436a21" + "c24320c14320c2436a21c34320c24320c3436a21c44320c34320c4436a21c54320c44320c5436a21c64320c54320c6436a21c74320c64320c7" + "436a21c84320c74320c8436a21c94320c84320c9436a21ca4320c94320ca436a21cb4320ca4320cb436a21cc4320cb4320cc436a21cd4320cc" + "4320cd436a21ce4320cd4320ce436a21cf4320ce4320cf436a21d04320cf4320d0436a21d14320d04320d1436a21d24320d14320d2436a21d3" + "4320d24320d3436a21d44320d34320d4436a21d54320d44320d5436a21d64320d54320d6436a21d74320d64320d7436a21d84320d74320d843" + "6a21d94320d84320d9436a21da4320d94320da436a21db4320da4320db436a21dc4320db4320dc436a21dd4320dc4320dd436a21de4320dd43" + "20de436a21df4320de4320df436a21e04320df4320e0436a21e14320e04320e1436a21e24320e14320e2436a21e34320e24320e3436a21e443" + "20e34320e4436a21e54320e44320e5436a21e64320e54320e6436a21e74320e64320e7436a21e84320e74320e8436a21e94320e84320e9436a" + "21ea4320e94320ea436a21eb4320ea4320eb436a21ec4320eb4320ec436a21ed4320ec4320ed436a21ee4320ed4320ee436a21ef4320ee4320" + "ef436a21f04320ef4320f0436a21f14320f04320f1436a21f24320f14320f2436a21f34320f24320f3436a21f44320f34320f4436a21f54320" + "f44320f5436a21f64320f54320f6436a21f74320f64320f7436a21f84320f74320f8436a21f94320f84320f9436a21fa4320f94320fa436a21" + "fb4320fa4320fb436a21fc4320fb4320fc436a21fd4320fc4320fd436a21fe4320fd4320fe436a21ff4320fe4320ff436a21804420ff432080" + "446a2181442080442081446a2182442081442082446a2183442082442083446a2184442083442084446a2185442084442085446a2186442085" + "442086446a2187442086442087446a2188442087442088446a2189442088442089446a218a44208944208a446a218b44208a44208b446a218c" + "44208b44208c446a218d44208c44208d446a218e44208d44208e446a218f44208e44208f446a219044208f442090446a219144209044209144" + "6a2192442091442092446a2193442092442093446a2194442093442094446a2195442094442095446a2196442095442096446a219744209644" + "2097446a2198442097442098446a2199442098442099446a219a44209944209a446a219b44209a44209b446a219c44209b44209c446a219d44" + "209c44209d446a219e44209d44209e446a219f44209e44209f446a21a044209f4420a0446a21a14420a04420a1446a21a24420a14420a2446a" + "21a34420a24420a3446a21a44420a34420a4446a21a54420a44420a5446a21a64420a54420a6446a21a74420a64420a7446a21a84420a74420" + "a8446a21a94420a84420a9446a21aa4420a94420aa446a21ab4420aa4420ab446a21ac4420ab4420ac446a21ad4420ac4420ad446a21ae4420" + "ad4420ae446a21af4420ae4420af446a21b04420af4420b0446a21b14420b04420b1446a21b24420b14420b2446a21b34420b24420b3446a21" + "b44420b34420b4446a21b54420b44420b5446a21b64420b54420b6446a21b74420b64420b7446a21b84420b74420b8446a21b94420b84420b9" + "446a21ba4420b94420ba446a21bb4420ba4420bb446a21bc4420bb4420bc446a21bd4420bc4420bd446a21be4420bd4420be446a21bf4420be" + "4420bf446a21c04420bf4420c0446a21c14420c04420c1446a21c24420c14420c2446a21c34420c24420c3446a21c44420c34420c4446a21c5" + "4420c44420c5446a21c64420c54420c6446a21c74420c64420c7446a21c84420c74420c8446a21c94420c84420c9446a21ca4420c94420ca44" + "6a21cb4420ca4420cb446a21cc4420cb4420cc446a21cd4420cc4420cd446a21ce4420cd4420ce446a21cf4420ce4420cf446a21d04420cf44" + "20d0446a21d14420d04420d1446a21d24420d14420d2446a21d34420d24420d3446a21d44420d34420d4446a21d54420d44420d5446a21d644" + "20d54420d6446a21d74420d64420d7446a21d84420d74420d8446a21d94420d84420d9446a21da4420d94420da446a21db4420da4420db446a" + "21dc4420db4420dc446a21dd4420dc4420dd446a21de4420dd4420de446a21df4420de4420df446a21e04420df4420e0446a21e14420e04420" + "e1446a21e24420e14420e2446a21e34420e24420e3446a21e44420e34420e4446a21e54420e44420e5446a21e64420e54420e6446a21e74420" + "e64420e7446a21e84420e74420e8446a21e94420e84420e9446a21ea4420e94420ea446a21eb4420ea4420eb446a21ec4420eb4420ec446a21" + "ed4420ec4420ed446a21ee4420ed4420ee446a21ef4420ee4420ef446a21f04420ef4420f0446a21f14420f04420f1446a21f24420f14420f2" + "446a21f34420f24420f3446a21f44420f34420f4446a21f54420f44420f5446a21f64420f54420f6446a21f74420f64420f7446a21f84420f7" + "4420f8446a21f94420f84420f9446a21fa4420f94420fa446a21fb4420fa4420fb446a21fc4420fb4420fc446a21fd4420fc4420fd446a21fe" + "4420fd4420fe446a21ff4420fe4420ff446a21804520ff442080456a2181452080452081456a2182452081452082456a218345208245208345" + "6a2184452083452084456a2185452084452085456a2186452085452086456a2187452086452087456a2188452087452088456a218945208845" + "2089456a218a45208945208a456a218b45208a45208b456a218c45208b45208c456a218d45208c45208d456a218e45208d45208e456a218f45" + "208e45208f456a219045208f452090456a2191452090452091456a2192452091452092456a2193452092452093456a2194452093452094456a" + "2195452094452095456a2196452095452096456a2197452096452097456a2198452097452098456a2199452098452099456a219a4520994520" + "9a456a219b45209a45209b456a219c45209b45209c456a219d45209c45209d456a219e45209d45209e456a219f45209e45209f456a21a04520" + "9f4520a0456a21a14520a04520a1456a21a24520a14520a2456a21a34520a24520a3456a21a44520a34520a4456a21a54520a44520a5456a21" + "a64520a54520a6456a21a74520a64520a7456a21a84520a74520a8456a21a94520a84520a9456a21aa4520a94520aa456a21ab4520aa4520ab" + "456a21ac4520ab4520ac456a21ad4520ac4520ad456a21ae4520ad4520ae456a21af4520ae4520af456a21b04520af4520b0456a21b14520b0" + "4520b1456a21b24520b14520b2456a21b34520b24520b3456a21b44520b34520b4456a21b54520b44520b5456a21b64520b54520b6456a21b7" + "4520b64520b7456a21b84520b74520b8456a21b94520b84520b9456a21ba4520b94520ba456a21bb4520ba4520bb456a21bc4520bb4520bc45" + "6a21bd4520bc4520bd456a21be4520bd4520be456a21bf4520be4520bf456a21c04520bf4520c0456a21c14520c04520c1456a21c24520c145" + "20c2456a21c34520c24520c3456a21c44520c34520c4456a21c54520c44520c5456a21c64520c54520c6456a21c74520c64520c7456a21c845" + "20c74520c8456a21c94520c84520c9456a21ca4520c94520ca456a21cb4520ca4520cb456a21cc4520cb4520cc456a21cd4520cc4520cd456a" + "21ce4520cd4520ce456a21cf4520ce4520cf456a21d04520cf4520d0456a21d14520d04520d1456a21d24520d14520d2456a21d34520d24520" + "d3456a21d44520d34520d4456a21d54520d44520d5456a21d64520d54520d6456a21d74520d64520d7456a21d84520d74520d8456a21d94520" + "d84520d9456a21da4520d94520da456a21db4520da4520db456a21dc4520db4520dc456a21dd4520dc4520dd456a21de4520dd4520de456a21" + "df4520de4520df456a21e04520df4520e0456a21e14520e04520e1456a21e24520e14520e2456a21e34520e24520e3456a21e44520e34520e4" + "456a21e54520e44520e5456a21e64520e54520e6456a21e74520e64520e7456a21e84520e74520e8456a21e94520e84520e9456a21ea4520e9" + "4520ea456a21eb4520ea4520eb456a21ec4520eb4520ec456a21ed4520ec4520ed456a21ee4520ed4520ee456a21ef4520ee4520ef456a21f0" + "4520ef4520f0456a21f14520f04520f1456a21f24520f14520f2456a21f34520f24520f3456a21f44520f34520f4456a21f54520f44520f545" + "6a21f64520f54520f6456a21f74520f64520f7456a21f84520f74520f8456a21f94520f84520f9456a21fa4520f94520fa456a21fb4520fa45" + "20fb456a21fc4520fb4520fc456a21fd4520fc4520fd456a21fe4520fd4520fe456a21ff4520fe4520ff456a21804620ff452080466a218146" + "2080462081466a2182462081462082466a2183462082462083466a2184462083462084466a2185462084462085466a2186462085462086466a" + "2187462086462087466a2188462087462088466a2189462088462089466a218a46208946208a466a218b46208a46208b466a218c46208b4620" + "8c466a218d46208c46208d466a218e46208d46208e466a218f46208e46208f466a219046208f462090466a2191462090462091466a21924620" + "91462092466a2193462092462093466a2194462093462094466a2195462094462095466a2196462095462096466a2197462096462097466a21" + "98462097462098466a2199462098462099466a219a46209946209a466a219b46209a46209b466a219c46209b46209c466a219d46209c46209d" + "466a219e46209d46209e466a219f46209e46209f466a21a046209f4620a0466a21a14620a04620a1466a21a24620a14620a2466a21a34620a2" + "4620a3466a21a44620a34620a4466a21a54620a44620a5466a21a64620a54620a6466a21a74620a64620a7466a21a84620a74620a8466a21a9" + "4620a84620a9466a21aa4620a94620aa466a21ab4620aa4620ab466a21ac4620ab4620ac466a21ad4620ac4620ad466a21ae4620ad4620ae46" + "6a21af4620ae4620af466a21b04620af4620b0466a21b14620b04620b1466a21b24620b14620b2466a21b34620b24620b3466a21b44620b346" + "20b4466a21b54620b44620b5466a21b64620b54620b6466a21b74620b64620b7466a21b84620b74620b8466a21b94620b84620b9466a21ba46" + "20b94620ba466a21bb4620ba4620bb466a21bc4620bb4620bc466a21bd4620bc4620bd466a21be4620bd4620be466a21bf4620be4620bf466a" + "21c04620bf4620c0466a21c14620c04620c1466a21c24620c14620c2466a21c34620c24620c3466a21c44620c34620c4466a21c54620c44620" + "c5466a21c64620c54620c6466a21c74620c64620c7466a21c84620c74620c8466a21c94620c84620c9466a21ca4620c94620ca466a21cb4620" + "ca4620cb466a21cc4620cb4620cc466a21cd4620cc4620cd466a21ce4620cd4620ce466a21cf4620ce4620cf466a21d04620cf4620d0466a21" + "d14620d04620d1466a21d24620d14620d2466a21d34620d24620d3466a21d44620d34620d4466a21d54620d44620d5466a21d64620d54620d6" + "466a21d74620d64620d7466a21d84620d74620d8466a21d94620d84620d9466a21da4620d94620da466a21db4620da4620db466a21dc4620db" + "4620dc466a21dd4620dc4620dd466a21de4620dd4620de466a21df4620de4620df466a21e04620df4620e0466a21e14620e04620e1466a21e2" + "4620e14620e2466a21e34620e24620e3466a21e44620e34620e4466a21e54620e44620e5466a21e64620e54620e6466a21e74620e64620e746" + "6a21e84620e74620e8466a21e94620e84620e9466a21ea4620e94620ea466a21eb4620ea4620eb466a21ec4620eb4620ec466a21ed4620ec46" + "20ed466a21ee4620ed4620ee466a21ef4620ee4620ef466a21f04620ef4620f0466a21f14620f04620f1466a21f24620f14620f2466a21f346" + "20f24620f3466a21f44620f34620f4466a21f54620f44620f5466a21f64620f54620f6466a21f74620f64620f7466a21f84620f74620f8466a" + "21f94620f84620f9466a21fa4620f94620fa466a21fb4620fa4620fb466a21fc4620fb4620fc466a21fd4620fc4620fd466a21fe4620fd4620" + "fe466a21ff4620fe4620ff466a21804720ff462080476a2181472080472081476a2182472081472082476a2183472082472083476a21844720" + "83472084476a2185472084472085476a2186472085472086476a2187472086472087476a2188472087472088476a2189472088472089476a21" + "8a47208947208a476a218b47208a47208b476a218c47208b47208c476a218d47208c47208d476a218e47208d47208e476a218f47208e47208f" + "476a219047208f472090476a2191472090472091476a2192472091472092476a2193472092472093476a2194472093472094476a2195472094" + "472095476a2196472095472096476a2197472096472097476a2198472097472098476a2199472098472099476a219a47209947209a476a219b" + "47209a47209b476a219c47209b47209c476a219d47209c47209d476a219e47209d47209e476a219f47209e47209f476a21a047209f4720a047" + "6a21a14720a04720a1476a21a24720a14720a2476a21a34720a24720a3476a21a44720a34720a4476a21a54720a44720a5476a21a64720a547" + "20a6476a21a74720a64720a7476a21a84720a74720a8476a21a94720a84720a9476a21aa4720a94720aa476a21ab4720aa4720ab476a21ac47" + "20ab4720ac476a21ad4720ac4720ad476a21ae4720ad4720ae476a21af4720ae4720af476a21b04720af4720b0476a21b14720b04720b1476a" + "21b24720b14720b2476a21b34720b24720b3476a21b44720b34720b4476a21b54720b44720b5476a21b64720b54720b6476a21b74720b64720" + "b7476a21b84720b74720b8476a21b94720b84720b9476a21ba4720b94720ba476a21bb4720ba4720bb476a21bc4720bb4720bc476a21bd4720" + "bc4720bd476a21be4720bd4720be476a21bf4720be4720bf476a21c04720bf4720c0476a21c14720c04720c1476a21c24720c14720c2476a21" + "c34720c24720c3476a21c44720c34720c4476a21c54720c44720c5476a21c64720c54720c6476a21c74720c64720c7476a21c84720c74720c8" + "476a21c94720c84720c9476a21ca4720c94720ca476a21cb4720ca4720cb476a21cc4720cb4720cc476a21cd4720cc4720cd476a21ce4720cd" + "4720ce476a21cf4720ce4720cf476a21d04720cf4720d0476a21d14720d04720d1476a21d24720d14720d2476a21d34720d24720d3476a21d4" + "4720d34720d4476a21d54720d44720d5476a21d64720d54720d6476a21d74720d64720d7476a21d84720d74720d8476a21d94720d84720d947" + "6a21da4720d94720da476a21db4720da4720db476a21dc4720db4720dc476a21dd4720dc4720dd476a21de4720dd4720de476a21df4720de47" + "20df476a21e04720df4720e0476a21e14720e04720e1476a21e24720e14720e2476a21e34720e24720e3476a21e44720e34720e4476a21e547" + "20e44720e5476a21e64720e54720e6476a21e74720e64720e7476a21e84720e74720e8476a21e94720e84720e9476a21ea4720e94720ea476a" + "21eb4720ea4720eb476a21ec4720eb4720ec476a21ed4720ec4720ed476a21ee4720ed4720ee476a21ef4720ee4720ef476a21f04720ef4720" + "f0476a21f14720f04720f1476a21f24720f14720f2476a21f34720f24720f3476a21f44720f34720f4476a21f54720f44720f5476a21f64720" + "f54720f6476a21f74720f64720f7476a21f84720f74720f8476a21f94720f84720f9476a21fa4720f94720fa476a21fb4720fa4720fb476a21" + "fc4720fb4720fc476a21fd4720fc4720fd476a21fe4720fd4720fe476a21ff4720fe4720ff476a21804820ff472080486a2181482080482081" + "486a2182482081482082486a2183482082482083486a2184482083482084486a2185482084482085486a2186482085482086486a2187482086" + "482087486a2188482087482088486a2189482088482089486a218a48208948208a486a218b48208a48208b486a218c48208b48208c486a218d" + "48208c48208d486a218e48208d48208e486a218f48208e48208f486a219048208f482090486a2191482090482091486a219248209148209248" + "6a2193482092482093486a2194482093482094486a2195482094482095486a2196482095482096486a2197482096482097486a219848209748" + "2098486a2199482098482099486a219a48209948209a486a219b48209a48209b486a219c48209b48209c486a219d48209c48209d486a219e48" + "209d48209e486a219f48209e48209f486a21a048209f4820a0486a21a14820a04820a1486a21a24820a14820a2486a21a34820a24820a3486a" + "21a44820a34820a4486a21a54820a44820a5486a21a64820a54820a6486a21a74820a64820a7486a21a84820a74820a8486a21a94820a84820" + "a9486a21aa4820a94820aa486a21ab4820aa4820ab486a21ac4820ab4820ac486a21ad4820ac4820ad486a21ae4820ad4820ae486a21af4820" + "ae4820af486a21b04820af4820b0486a21b14820b04820b1486a21b24820b14820b2486a21b34820b24820b3486a21b44820b34820b4486a21" + "b54820b44820b5486a21b64820b54820b6486a21b74820b64820b7486a21b84820b74820b8486a21b94820b84820b9486a21ba4820b94820ba" + "486a21bb4820ba4820bb486a21bc4820bb4820bc486a21bd4820bc4820bd486a21be4820bd4820be486a21bf4820be4820bf486a21c04820bf" + "4820c0486a21c14820c04820c1486a21c24820c14820c2486a21c34820c24820c3486a21c44820c34820c4486a21c54820c44820c5486a21c6" + "4820c54820c6486a21c74820c64820c7486a21c84820c74820c8486a21c94820c84820c9486a21ca4820c94820ca486a21cb4820ca4820cb48" + "6a21cc4820cb4820cc486a21cd4820cc4820cd486a21ce4820cd4820ce486a21cf4820ce4820cf486a21d04820cf4820d0486a21d14820d048" + "20d1486a21d24820d14820d2486a21d34820d24820d3486a21d44820d34820d4486a21d54820d44820d5486a21d64820d54820d6486a21d748" + "20d64820d7486a21d84820d74820d8486a21d94820d84820d9486a21da4820d94820da486a21db4820da4820db486a21dc4820db4820dc486a" + "21dd4820dc4820dd486a21de4820dd4820de486a21df4820de4820df486a21e04820df4820e0486a21e14820e04820e1486a21e24820e14820" + "e2486a21e34820e24820e3486a21e44820e34820e4486a21e54820e44820e5486a21e64820e54820e6486a21e74820e64820e7486a21e84820" + "e74820e8486a21e94820e84820e9486a21ea4820e94820ea486a21eb4820ea4820eb486a21ec4820eb4820ec486a21ed4820ec4820ed486a21" + "ee4820ed4820ee486a21ef4820ee4820ef486a21f04820ef4820f0486a21f14820f04820f1486a21f24820f14820f2486a21f34820f24820f3" + "486a21f44820f34820f4486a21f54820f44820f5486a21f64820f54820f6486a21f74820f64820f7486a21f84820f74820f8486a21f94820f8" + "4820f9486a21fa4820f94820fa486a21fb4820fa4820fb486a21fc4820fb4820fc486a21fd4820fc4820fd486a21fe4820fd4820fe486a21ff" + "4820fe4820ff486a21804920ff482080496a2181492080492081496a2182492081492082496a2183492082492083496a218449208349208449" + "6a2185492084492085496a2186492085492086496a2187492086492087496a2188492087492088496a2189492088492089496a218a49208949" + "208a496a218b49208a49208b496a218c49208b49208c496a218d49208c49208d496a218e49208d49208e496a218f49208e49208f496a219049" + "208f492090496a2191492090492091496a2192492091492092496a2193492092492093496a2194492093492094496a2195492094492095496a" + "2196492095492096496a2197492096492097496a2198492097492098496a2199492098492099496a219a49209949209a496a219b49209a4920" + "9b496a219c49209b49209c496a219d49209c49209d496a219e49209d49209e496a219f49209e49209f496a21a049209f4920a0496a21a14920" + "a04920a1496a21a24920a14920a2496a21a34920a24920a3496a21a44920a34920a4496a21a54920a44920a5496a21a64920a54920a6496a21" + "a74920a64920a7496a21a84920a74920a8496a21a94920a84920a9496a21aa4920a94920aa496a21ab4920aa4920ab496a21ac4920ab4920ac" + "496a21ad4920ac4920ad496a21ae4920ad4920ae496a21af4920ae4920af496a21b04920af4920b0496a21b14920b04920b1496a21b24920b1" + "4920b2496a21b34920b24920b3496a21b44920b34920b4496a21b54920b44920b5496a21b64920b54920b6496a21b74920b64920b7496a21b8" + "4920b74920b8496a21b94920b84920b9496a21ba4920b94920ba496a21bb4920ba4920bb496a21bc4920bb4920bc496a21bd4920bc4920bd49" + "6a21be4920bd4920be496a21bf4920be4920bf496a21c04920bf4920c0496a21c14920c04920c1496a21c24920c14920c2496a21c34920c249" + "20c3496a21c44920c34920c4496a21c54920c44920c5496a21c64920c54920c6496a21c74920c64920c7496a21c84920c74920c8496a21c949" + "20c84920c9496a21ca4920c94920ca496a21cb4920ca4920cb496a21cc4920cb4920cc496a21cd4920cc4920cd496a21ce4920cd4920ce496a" + "21cf4920ce4920cf496a21d04920cf4920d0496a21d14920d04920d1496a21d24920d14920d2496a21d34920d24920d3496a21d44920d34920" + "d4496a21d54920d44920d5496a21d64920d54920d6496a21d74920d64920d7496a21d84920d74920d8496a21d94920d84920d9496a21da4920" + "d94920da496a21db4920da4920db496a21dc4920db4920dc496a21dd4920dc4920dd496a21de4920dd4920de496a21df4920de4920df496a21" + "e04920df4920e0496a21e14920e04920e1496a21e24920e14920e2496a21e34920e24920e3496a21e44920e34920e4496a21e54920e44920e5" + "496a21e64920e54920e6496a21e74920e64920e7496a21e84920e74920e8496a21e94920e84920e9496a21ea4920e94920ea496a21eb4920ea" + "4920eb496a21ec4920eb4920ec496a21ed4920ec4920ed496a21ee4920ed4920ee496a21ef4920ee4920ef496a21f04920ef4920f0496a21f1" + "4920f04920f1496a21f24920f14920f2496a21f34920f24920f3496a21f44920f34920f4496a21f54920f44920f5496a21f64920f54920f649" + "6a21f74920f64920f7496a21f84920f74920f8496a21f94920f84920f9496a21fa4920f94920fa496a21fb4920fa4920fb496a21fc4920fb49" + "20fc496a21fd4920fc4920fd496a21fe4920fd4920fe496a21ff4920fe4920ff496a21804a20ff4920804a6a21814a20804a20814a6a21824a" + "20814a20824a6a21834a20824a20834a6a21844a20834a20844a6a21854a20844a20854a6a21864a20854a20864a6a21874a20864a20874a6a" + "21884a20874a20884a6a21894a20884a20894a6a218a4a20894a208a4a6a218b4a208a4a208b4a6a218c4a208b4a208c4a6a218d4a208c4a20" + "8d4a6a218e4a208d4a208e4a6a218f4a208e4a208f4a6a21904a208f4a20904a6a21914a20904a20914a6a21924a20914a20924a6a21934a20" + "924a20934a6a21944a20934a20944a6a21954a20944a20954a6a21964a20954a20964a6a21974a20964a20974a6a21984a20974a20984a6a21" + "994a20984a20994a6a219a4a20994a209a4a6a219b4a209a4a209b4a6a219c4a209b4a209c4a6a219d4a209c4a209d4a6a219e4a209d4a209e" + "4a6a219f4a209e4a209f4a6a21a04a209f4a20a04a6a21a14a20a04a20a14a6a21a24a20a14a20a24a6a21a34a20a24a20a34a6a21a44a20a3" + "4a20a44a6a21a54a20a44a20a54a6a21a64a20a54a20a64a6a21a74a20a64a20a74a6a21a84a20a74a20a84a6a21a94a20a84a20a94a6a21aa" + "4a20a94a20aa4a6a21ab4a20aa4a20ab4a6a21ac4a20ab4a20ac4a6a21ad4a20ac4a20ad4a6a21ae4a20ad4a20ae4a6a21af4a20ae4a20af4a" + "6a21b04a20af4a20b04a6a21b14a20b04a20b14a6a21b24a20b14a20b24a6a21b34a20b24a20b34a6a21b44a20b34a20b44a6a21b54a20b44a" + "20b54a6a21b64a20b54a20b64a6a21b74a20b64a20b74a6a21b84a20b74a20b84a6a21b94a20b84a20b94a6a21ba4a20b94a20ba4a6a21bb4a" + "20ba4a20bb4a6a21bc4a20bb4a20bc4a6a21bd4a20bc4a20bd4a6a21be4a20bd4a20be4a6a21bf4a20be4a20bf4a6a21c04a20bf4a20c04a6a" + "21c14a20c04a20c14a6a21c24a20c14a20c24a6a21c34a20c24a20c34a6a21c44a20c34a20c44a6a21c54a20c44a20c54a6a21c64a20c54a20" + "c64a6a21c74a20c64a20c74a6a21c84a20c74a20c84a6a21c94a20c84a20c94a6a21ca4a20c94a20ca4a6a21cb4a20ca4a20cb4a6a21cc4a20" + "cb4a20cc4a6a21cd4a20cc4a20cd4a6a21ce4a20cd4a20ce4a6a21cf4a20ce4a20cf4a6a21d04a20cf4a20d04a6a21d14a20d04a20d14a6a21" + "d24a20d14a20d24a6a21d34a20d24a20d34a6a21d44a20d34a20d44a6a21d54a20d44a20d54a6a21d64a20d54a20d64a6a21d74a20d64a20d7" + "4a6a21d84a20d74a20d84a6a21d94a20d84a20d94a6a21da4a20d94a20da4a6a21db4a20da4a20db4a6a21dc4a20db4a20dc4a6a21dd4a20dc" + "4a20dd4a6a21de4a20dd4a20de4a6a21df4a20de4a20df4a6a21e04a20df4a20e04a6a21e14a20e04a20e14a6a21e24a20e14a20e24a6a21e3" + "4a20e24a20e34a6a21e44a20e34a20e44a6a21e54a20e44a20e54a6a21e64a20e54a20e64a6a21e74a20e64a20e74a6a21e84a20e74a20e84a" + "6a21e94a20e84a20e94a6a21ea4a20e94a20ea4a6a21eb4a20ea4a20eb4a6a21ec4a20eb4a20ec4a6a21ed4a20ec4a20ed4a6a21ee4a20ed4a" + "20ee4a6a21ef4a20ee4a20ef4a6a21f04a20ef4a20f04a6a21f14a20f04a20f14a6a21f24a20f14a20f24a6a21f34a20f24a20f34a6a21f44a" + "20f34a20f44a6a21f54a20f44a20f54a6a21f64a20f54a20f64a6a21f74a20f64a20f74a6a21f84a20f74a20f84a6a21f94a20f84a20f94a6a" + "21fa4a20f94a20fa4a6a21fb4a20fa4a20fb4a6a21fc4a20fb4a20fc4a6a21fd4a20fc4a20fd4a6a21fe4a20fd4a20fe4a6a21ff4a20fe4a20" + "ff4a6a21804b20ff4a20804b6a21814b20804b20814b6a21824b20814b20824b6a21834b20824b20834b6a21844b20834b20844b6a21854b20" + "844b20854b6a21864b20854b20864b6a21874b20864b20874b6a21884b20874b20884b6a21894b20884b20894b6a218a4b20894b208a4b6a21" + "8b4b208a4b208b4b6a218c4b208b4b208c4b6a218d4b208c4b208d4b6a218e4b208d4b208e4b6a218f4b208e4b208f4b6a21904b208f4b2090" + "4b6a21914b20904b20914b6a21924b20914b20924b6a21934b20924b20934b6a21944b20934b20944b6a21954b20944b20954b6a21964b2095" + "4b20964b6a21974b20964b20974b6a21984b20974b20984b6a21994b20984b20994b6a219a4b20994b209a4b6a219b4b209a4b209b4b6a219c" + "4b209b4b209c4b6a219d4b209c4b209d4b6a219e4b209d4b209e4b6a219f4b209e4b209f4b6a21a04b209f4b20a04b6a21a14b20a04b20a14b" + "6a21a24b20a14b20a24b6a21a34b20a24b20a34b6a21a44b20a34b20a44b6a21a54b20a44b20a54b6a21a64b20a54b20a64b6a21a74b20a64b" + "20a74b6a21a84b20a74b20a84b6a21a94b20a84b20a94b6a21aa4b20a94b20aa4b6a21ab4b20aa4b20ab4b6a21ac4b20ab4b20ac4b6a21ad4b" + "20ac4b20ad4b6a21ae4b20ad4b20ae4b6a21af4b20ae4b20af4b6a21b04b20af4b20b04b6a21b14b20b04b20b14b6a21b24b20b14b20b24b6a" + "21b34b20b24b20b34b6a21b44b20b34b20b44b6a21b54b20b44b20b54b6a21b64b20b54b20b64b6a21b74b20b64b20b74b6a21b84b20b74b20" + "b84b6a21b94b20b84b20b94b6a21ba4b20b94b20ba4b6a21bb4b20ba4b20bb4b6a21bc4b20bb4b20bc4b6a21bd4b20bc4b20bd4b6a21be4b20" + "bd4b20be4b6a21bf4b20be4b20bf4b6a21c04b20bf4b20c04b6a21c14b20c04b20c14b6a21c24b20c14b20c24b6a21c34b20c24b20c34b6a21" + "c44b20c34b20c44b6a21c54b20c44b20c54b6a21c64b20c54b20c64b6a21c74b20c64b20c74b6a21c84b20c74b20c84b6a21c94b20c84b20c9" + "4b6a21ca4b20c94b20ca4b6a21cb4b20ca4b20cb4b6a21cc4b20cb4b20cc4b6a21cd4b20cc4b20cd4b6a21ce4b20cd4b20ce4b6a21cf4b20ce" + "4b20cf4b6a21d04b20cf4b20d04b6a21d14b20d04b20d14b6a21d24b20d14b20d24b6a21d34b20d24b20d34b6a21d44b20d34b20d44b6a21d5" + "4b20d44b20d54b6a21d64b20d54b20d64b6a21d74b20d64b20d74b6a21d84b20d74b20d84b6a21d94b20d84b20d94b6a21da4b20d94b20da4b" + "6a21db4b20da4b20db4b6a21dc4b20db4b20dc4b6a21dd4b20dc4b20dd4b6a21de4b20dd4b20de4b6a21df4b20de4b20df4b6a21e04b20df4b" + "20e04b6a21e14b20e04b20e14b6a21e24b20e14b20e24b6a21e34b20e24b20e34b6a21e44b20e34b20e44b6a21e54b20e44b20e54b6a21e64b" + "20e54b20e64b6a21e74b20e64b20e74b6a21e84b20e74b20e84b6a21e94b20e84b20e94b6a21ea4b20e94b20ea4b6a21eb4b20ea4b20eb4b6a" + "21ec4b20eb4b20ec4b6a21ed4b20ec4b20ed4b6a21ee4b20ed4b20ee4b6a21ef4b20ee4b20ef4b6a21f04b20ef4b20f04b6a21f14b20f04b20" + "f14b6a21f24b20f14b20f24b6a21f34b20f24b20f34b6a21f44b20f34b20f44b6a21f54b20f44b20f54b6a21f64b20f54b20f64b6a21f74b20" + "f64b20f74b6a21f84b20f74b20f84b6a21f94b20f84b20f94b6a21fa4b20f94b20fa4b6a21fb4b20fa4b20fb4b6a21fc4b20fb4b20fc4b6a21" + "fd4b20fc4b20fd4b6a21fe4b20fd4b20fe4b6a21ff4b20fe4b20ff4b6a21804c20ff4b20804c6a21814c20804c20814c6a21824c20814c2082" + "4c6a21834c20824c20834c6a21844c20834c20844c6a21854c20844c20854c6a21864c20854c20864c6a21874c20864c20874c6a21884c2087" + "4c20884c6a21894c20884c20894c6a218a4c20894c208a4c6a218b4c208a4c208b4c6a218c4c208b4c208c4c6a218d4c208c4c208d4c6a218e" + "4c208d4c208e4c6a218f4c208e4c208f4c6a21904c208f4c20904c6a21914c20904c20914c6a21924c20914c20924c6a21934c20924c20934c" + "6a21944c20934c20944c6a21954c20944c20954c6a21964c20954c20964c6a21974c20964c20974c6a21984c20974c20984c6a21994c20984c" + "20994c6a219a4c20994c209a4c6a219b4c209a4c209b4c6a219c4c209b4c209c4c6a219d4c209c4c209d4c6a219e4c209d4c209e4c6a219f4c" + "209e4c209f4c6a21a04c209f4c20a04c6a21a14c20a04c20a14c6a21a24c20a14c20a24c6a21a34c20a24c20a34c6a21a44c20a34c20a44c6a" + "21a54c20a44c20a54c6a21a64c20a54c20a64c6a21a74c20a64c20a74c6a21a84c20a74c20a84c6a21a94c20a84c20a94c6a21aa4c20a94c20" + "aa4c6a21ab4c20aa4c20ab4c6a21ac4c20ab4c20ac4c6a21ad4c20ac4c20ad4c6a21ae4c20ad4c20ae4c6a21af4c20ae4c20af4c6a21b04c20" + "af4c20b04c6a21b14c20b04c20b14c6a21b24c20b14c20b24c6a21b34c20b24c20b34c6a21b44c20b34c20b44c6a21b54c20b44c20b54c6a21" + "b64c20b54c20b64c6a21b74c20b64c20b74c6a21b84c20b74c20b84c6a21b94c20b84c20b94c6a21ba4c20b94c20ba4c6a21bb4c20ba4c20bb" + "4c6a21bc4c20bb4c20bc4c6a21bd4c20bc4c20bd4c6a21be4c20bd4c20be4c6a21bf4c20be4c20bf4c6a21c04c20bf4c20c04c6a21c14c20c0" + "4c20c14c6a21c24c20c14c20c24c6a21c34c20c24c20c34c6a21c44c20c34c20c44c6a21c54c20c44c20c54c6a21c64c20c54c20c64c6a21c7" + "4c20c64c20c74c6a21c84c20c74c20c84c6a21c94c20c84c20c94c6a21ca4c20c94c20ca4c6a21cb4c20ca4c20cb4c6a21cc4c20cb4c20cc4c" + "6a21cd4c20cc4c20cd4c6a21ce4c20cd4c20ce4c6a21cf4c20ce4c20cf4c6a21d04c20cf4c20d04c6a21d14c20d04c20d14c6a21d24c20d14c" + "20d24c6a21d34c20d24c20d34c6a21d44c20d34c20d44c6a21d54c20d44c20d54c6a21d64c20d54c20d64c6a21d74c20d64c20d74c6a21d84c" + "20d74c20d84c6a21d94c20d84c20d94c6a21da4c20d94c20da4c6a21db4c20da4c20db4c6a21dc4c20db4c20dc4c6a21dd4c20dc4c20dd4c6a" + "21de4c20dd4c20de4c6a21df4c20de4c20df4c6a21e04c20df4c20e04c6a21e14c20e04c20e14c6a21e24c20e14c20e24c6a21e34c20e24c20" + "e34c6a21e44c20e34c20e44c6a21e54c20e44c20e54c6a21e64c20e54c20e64c6a21e74c20e64c20e74c6a21e84c20e74c20e84c6a21e94c20" + "e84c20e94c6a21ea4c20e94c20ea4c6a21eb4c20ea4c20eb4c6a21ec4c20eb4c20ec4c6a21ed4c20ec4c20ed4c6a21ee4c20ed4c20ee4c6a21" + "ef4c20ee4c20ef4c6a21f04c20ef4c20f04c6a21f14c20f04c20f14c6a21f24c20f14c20f24c6a21f34c20f24c20f34c6a21f44c20f34c20f4" + "4c6a21f54c20f44c20f54c6a21f64c20f54c20f64c6a21f74c20f64c20f74c6a21f84c20f74c20f84c6a21f94c20f84c20f94c6a21fa4c20f9" + "4c20fa4c6a21fb4c20fa4c20fb4c6a21fc4c20fb4c20fc4c6a21fd4c20fc4c20fd4c6a21fe4c20fd4c20fe4c6a21ff4c20fe4c20ff4c6a2180" + "4d20ff4c20804d6a21814d20804d20814d6a21824d20814d20824d6a21834d20824d20834d6a21844d20834d20844d6a21854d20844d20854d" + "6a21864d20854d20864d6a21874d20864d20874d6a21884d20874d20884d6a21894d20884d20894d6a218a4d20894d208a4d6a218b4d208a4d" + "208b4d6a218c4d208b4d208c4d6a218d4d208c4d208d4d6a218e4d208d4d208e4d6a218f4d208e4d208f4d6a21904d208f4d20904d6a21914d" + "20904d20914d6a21924d20914d20924d6a21934d20924d20934d6a21944d20934d20944d6a21954d20944d20954d6a21964d20954d20964d6a" + "21974d20964d20974d6a21984d20974d20984d6a21994d20984d20994d6a219a4d20994d209a4d6a219b4d209a4d209b4d6a219c4d209b4d20" + "9c4d6a219d4d209c4d209d4d6a219e4d209d4d209e4d6a219f4d209e4d209f4d6a21a04d209f4d20a04d6a21a14d20a04d20a14d6a21a24d20" + "a14d20a24d6a21a34d20a24d20a34d6a21a44d20a34d20a44d6a21a54d20a44d20a54d6a21a64d20a54d20a64d6a21a74d20a64d20a74d6a21" + "a84d20a74d20a84d6a21a94d20a84d20a94d6a21aa4d20a94d20aa4d6a21ab4d20aa4d20ab4d6a21ac4d20ab4d20ac4d6a21ad4d20ac4d20ad" + "4d6a21ae4d20ad4d20ae4d6a21af4d20ae4d20af4d6a21b04d20af4d20b04d6a21b14d20b04d20b14d6a21b24d20b14d20b24d6a21b34d20b2" + "4d20b34d6a21b44d20b34d20b44d6a21b54d20b44d20b54d6a21b64d20b54d20b64d6a21b74d20b64d20b74d6a21b84d20b74d20b84d6a21b9" + "4d20b84d20b94d6a21ba4d20b94d20ba4d6a21bb4d20ba4d20bb4d6a21bc4d20bb4d20bc4d6a21bd4d20bc4d20bd4d6a21be4d20bd4d20be4d" + "6a21bf4d20be4d20bf4d6a21c04d20bf4d20c04d6a21c14d20c04d20c14d6a21c24d20c14d20c24d6a21c34d20c24d20c34d6a21c44d20c34d" + "20c44d6a21c54d20c44d20c54d6a21c64d20c54d20c64d6a21c74d20c64d20c74d6a21c84d20c74d20c84d6a21c94d20c84d20c94d6a21ca4d" + "20c94d20ca4d6a21cb4d20ca4d20cb4d6a21cc4d20cb4d20cc4d6a21cd4d20cc4d20cd4d6a21ce4d20cd4d20ce4d6a21cf4d20ce4d20cf4d6a" + "21d04d20cf4d20d04d6a21d14d20d04d20d14d6a21d24d20d14d20d24d6a21d34d20d24d20d34d6a21d44d20d34d20d44d6a21d54d20d44d20" + "d54d6a21d64d20d54d20d64d6a21d74d20d64d20d74d6a21d84d20d74d20d84d6a21d94d20d84d20d94d6a21da4d20d94d20da4d6a21db4d20" + "da4d20db4d6a21dc4d20db4d20dc4d6a21dd4d20dc4d20dd4d6a21de4d20dd4d20de4d6a21df4d20de4d20df4d6a21e04d20df4d20e04d6a21" + "e14d20e04d20e14d6a21e24d20e14d20e24d6a21e34d20e24d20e34d6a21e44d20e34d20e44d6a21e54d20e44d20e54d6a21e64d20e54d20e6" + "4d6a21e74d20e64d20e74d6a21e84d20e74d20e84d6a21e94d20e84d20e94d6a21ea4d20e94d20ea4d6a21eb4d20ea4d20eb4d6a21ec4d20eb" + "4d20ec4d6a21ed4d20ec4d20ed4d6a21ee4d20ed4d20ee4d6a21ef4d20ee4d20ef4d6a21f04d20ef4d20f04d6a21f14d20f04d20f14d6a21f2" + "4d20f14d20f24d6a21f34d20f24d20f34d6a21f44d20f34d20f44d6a21f54d20f44d20f54d6a21f64d20f54d20f64d6a21f74d20f64d20f74d" + "6a21f84d20f74d20f84d6a21f94d20f84d20f94d6a21fa4d20f94d20fa4d6a21fb4d20fa4d20fb4d6a21fc4d20fb4d20fc4d6a21fd4d20fc4d" + "20fd4d6a21fe4d20fd4d20fe4d6a21ff4d20fe4d20ff4d6a21804e20ff4d20804e6a21814e20804e20814e6a21824e20814e20824e6a21834e" + "20824e20834e6a21844e20834e20844e6a21854e20844e20854e6a21864e20854e20864e6a21874e20864e20874e6a21884e20874e20884e6a" + "21894e20884e20894e6a218a4e20894e208a4e6a218b4e208a4e208b4e6a218c4e208b4e208c4e6a218d4e208c4e208d4e6a218e4e208d4e20" + "8e4e6a218f4e208f4e0b"; + +extern std::string const functions5kHex = + "0061736d0100000001070160027f7f017f038a2788270000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000007e2d3038827087465737430303030000008746573743030303100010874657374303030320002087465737430303033000308" + "746573743030303400040874657374303030350005087465737430303036000608746573743030303700070874657374303030380008087465" + "7374303030390009087465737430303130000a087465737430303131000b087465737430303132000c087465737430303133000d0874657374" + "30303134000e087465737430303135000f08746573743030313600100874657374303031370011087465737430303138001208746573743030" + "313900130874657374303032300014087465737430303231001508746573743030323200160874657374303032330017087465737430303234" + "00180874657374303032350019087465737430303236001a087465737430303237001b087465737430303238001c087465737430303239001d" + "087465737430303330001e087465737430303331001f0874657374303033320020087465737430303333002108746573743030333400220874" + "657374303033350023087465737430303336002408746573743030333700250874657374303033380026087465737430303339002708746573" + "743030343000280874657374303034310029087465737430303432002a087465737430303433002b087465737430303434002c087465737430" + "303435002d087465737430303436002e087465737430303437002f087465737430303438003008746573743030343900310874657374303035" + "300032087465737430303531003308746573743030353200340874657374303035330035087465737430303534003608746573743030353500" + "3708746573743030353600380874657374303035370039087465737430303538003a087465737430303539003b087465737430303630003c08" + "7465737430303631003d087465737430303632003e087465737430303633003f08746573743030363400400874657374303036350041087465" + "737430303636004208746573743030363700430874657374303036380044087465737430303639004508746573743030373000460874657374" + "30303731004708746573743030373200480874657374303037330049087465737430303734004a087465737430303735004b08746573743030" + "3736004c087465737430303737004d087465737430303738004e087465737430303739004f0874657374303038300050087465737430303831" + "005108746573743030383200520874657374303038330053087465737430303834005408746573743030383500550874657374303038360056" + "087465737430303837005708746573743030383800580874657374303038390059087465737430303930005a087465737430303931005b0874" + "65737430303932005c087465737430303933005d087465737430303934005e087465737430303935005f087465737430303936006008746573" + "743030393700610874657374303039380062087465737430303939006308746573743031303000640874657374303130310065087465737430" + "3130320066087465737430313033006708746573743031303400680874657374303130350069087465737430313036006a0874657374303130" + "37006b087465737430313038006c087465737430313039006d087465737430313130006e087465737430313131006f08746573743031313200" + "700874657374303131330071087465737430313134007208746573743031313500730874657374303131360074087465737430313137007508" + "74657374303131380076087465737430313139007708746573743031323000780874657374303132310079087465737430313232007a087465" + "737430313233007b087465737430313234007c087465737430313235007d087465737430313236007e087465737430313237007f0874657374" + "303132380080010874657374303132390081010874657374303133300082010874657374303133310083010874657374303133320084010874" + "657374303133330085010874657374303133340086010874657374303133350087010874657374303133360088010874657374303133370089" + "01087465737430313338008a01087465737430313339008b01087465737430313430008c01087465737430313431008d010874657374303134" + "32008e01087465737430313433008f010874657374303134340090010874657374303134350091010874657374303134360092010874657374" + "303134370093010874657374303134380094010874657374303134390095010874657374303135300096010874657374303135310097010874" + "65737430313532009801087465737430313533009901087465737430313534009a01087465737430313535009b01087465737430313536009c" + "01087465737430313537009d01087465737430313538009e01087465737430313539009f0108746573743031363000a0010874657374303136" + "3100a10108746573743031363200a20108746573743031363300a30108746573743031363400a40108746573743031363500a5010874657374" + "3031363600a60108746573743031363700a70108746573743031363800a80108746573743031363900a90108746573743031373000aa010874" + "6573743031373100ab0108746573743031373200ac0108746573743031373300ad0108746573743031373400ae0108746573743031373500af" + "0108746573743031373600b00108746573743031373700b10108746573743031373800b20108746573743031373900b3010874657374303138" + "3000b40108746573743031383100b50108746573743031383200b60108746573743031383300b70108746573743031383400b8010874657374" + "3031383500b90108746573743031383600ba0108746573743031383700bb0108746573743031383800bc0108746573743031383900bd010874" + "6573743031393000be0108746573743031393100bf0108746573743031393200c00108746573743031393300c10108746573743031393400c2" + "0108746573743031393500c30108746573743031393600c40108746573743031393700c50108746573743031393800c6010874657374303139" + "3900c70108746573743032303000c80108746573743032303100c90108746573743032303200ca0108746573743032303300cb010874657374" + "3032303400cc0108746573743032303500cd0108746573743032303600ce0108746573743032303700cf0108746573743032303800d0010874" + "6573743032303900d10108746573743032313000d20108746573743032313100d30108746573743032313200d40108746573743032313300d5" + "0108746573743032313400d60108746573743032313500d70108746573743032313600d80108746573743032313700d9010874657374303231" + "3800da0108746573743032313900db0108746573743032323000dc0108746573743032323100dd0108746573743032323200de010874657374" + "3032323300df0108746573743032323400e00108746573743032323500e10108746573743032323600e20108746573743032323700e3010874" + "6573743032323800e40108746573743032323900e50108746573743032333000e60108746573743032333100e70108746573743032333200e8" + "0108746573743032333300e90108746573743032333400ea0108746573743032333500eb0108746573743032333600ec010874657374303233" + "3700ed0108746573743032333800ee0108746573743032333900ef0108746573743032343000f00108746573743032343100f1010874657374" + "3032343200f20108746573743032343300f30108746573743032343400f40108746573743032343500f50108746573743032343600f6010874" + "6573743032343700f70108746573743032343800f80108746573743032343900f90108746573743032353000fa0108746573743032353100fb" + "0108746573743032353200fc0108746573743032353300fd0108746573743032353400fe0108746573743032353500ff010874657374303235" + "360080020874657374303235370081020874657374303235380082020874657374303235390083020874657374303236300084020874657374" + "303236310085020874657374303236320086020874657374303236330087020874657374303236340088020874657374303236350089020874" + "65737430323636008a02087465737430323637008b02087465737430323638008c02087465737430323639008d02087465737430323730008e" + "02087465737430323731008f020874657374303237320090020874657374303237330091020874657374303237340092020874657374303237" + "350093020874657374303237360094020874657374303237370095020874657374303237380096020874657374303237390097020874657374" + "30323830009802087465737430323831009902087465737430323832009a02087465737430323833009b02087465737430323834009c020874" + "65737430323835009d02087465737430323836009e02087465737430323837009f0208746573743032383800a00208746573743032383900a1" + "0208746573743032393000a20208746573743032393100a30208746573743032393200a40208746573743032393300a5020874657374303239" + "3400a60208746573743032393500a70208746573743032393600a80208746573743032393700a90208746573743032393800aa020874657374" + "3032393900ab0208746573743033303000ac0208746573743033303100ad0208746573743033303200ae0208746573743033303300af020874" + "6573743033303400b00208746573743033303500b10208746573743033303600b20208746573743033303700b30208746573743033303800b4" + "0208746573743033303900b50208746573743033313000b60208746573743033313100b70208746573743033313200b8020874657374303331" + "3300b90208746573743033313400ba0208746573743033313500bb0208746573743033313600bc0208746573743033313700bd020874657374" + "3033313800be0208746573743033313900bf0208746573743033323000c00208746573743033323100c10208746573743033323200c2020874" + "6573743033323300c30208746573743033323400c40208746573743033323500c50208746573743033323600c60208746573743033323700c7" + "0208746573743033323800c80208746573743033323900c90208746573743033333000ca0208746573743033333100cb020874657374303333" + "3200cc0208746573743033333300cd0208746573743033333400ce0208746573743033333500cf0208746573743033333600d0020874657374" + "3033333700d10208746573743033333800d20208746573743033333900d30208746573743033343000d40208746573743033343100d5020874" + "6573743033343200d60208746573743033343300d70208746573743033343400d80208746573743033343500d90208746573743033343600da" + "0208746573743033343700db0208746573743033343800dc0208746573743033343900dd0208746573743033353000de020874657374303335" + "3100df0208746573743033353200e00208746573743033353300e10208746573743033353400e20208746573743033353500e3020874657374" + "3033353600e40208746573743033353700e50208746573743033353800e60208746573743033353900e70208746573743033363000e8020874" + "6573743033363100e90208746573743033363200ea0208746573743033363300eb0208746573743033363400ec0208746573743033363500ed" + "0208746573743033363600ee0208746573743033363700ef0208746573743033363800f00208746573743033363900f1020874657374303337" + "3000f20208746573743033373100f30208746573743033373200f40208746573743033373300f50208746573743033373400f6020874657374" + "3033373500f70208746573743033373600f80208746573743033373700f90208746573743033373800fa0208746573743033373900fb020874" + "6573743033383000fc0208746573743033383100fd0208746573743033383200fe0208746573743033383300ff020874657374303338340080" + "030874657374303338350081030874657374303338360082030874657374303338370083030874657374303338380084030874657374303338" + "390085030874657374303339300086030874657374303339310087030874657374303339320088030874657374303339330089030874657374" + "30333934008a03087465737430333935008b03087465737430333936008c03087465737430333937008d03087465737430333938008e030874" + "65737430333939008f030874657374303430300090030874657374303430310091030874657374303430320092030874657374303430330093" + "030874657374303430340094030874657374303430350095030874657374303430360096030874657374303430370097030874657374303430" + "38009803087465737430343039009903087465737430343130009a03087465737430343131009b03087465737430343132009c030874657374" + "30343133009d03087465737430343134009e03087465737430343135009f0308746573743034313600a00308746573743034313700a1030874" + "6573743034313800a20308746573743034313900a30308746573743034323000a40308746573743034323100a50308746573743034323200a6" + "0308746573743034323300a70308746573743034323400a80308746573743034323500a90308746573743034323600aa030874657374303432" + "3700ab0308746573743034323800ac0308746573743034323900ad0308746573743034333000ae0308746573743034333100af030874657374" + "3034333200b00308746573743034333300b10308746573743034333400b20308746573743034333500b30308746573743034333600b4030874" + "6573743034333700b50308746573743034333800b60308746573743034333900b70308746573743034343000b80308746573743034343100b9" + "0308746573743034343200ba0308746573743034343300bb0308746573743034343400bc0308746573743034343500bd030874657374303434" + "3600be0308746573743034343700bf0308746573743034343800c00308746573743034343900c10308746573743034353000c2030874657374" + "3034353100c30308746573743034353200c40308746573743034353300c50308746573743034353400c60308746573743034353500c7030874" + "6573743034353600c80308746573743034353700c90308746573743034353800ca0308746573743034353900cb0308746573743034363000cc" + "0308746573743034363100cd0308746573743034363200ce0308746573743034363300cf0308746573743034363400d0030874657374303436" + "3500d10308746573743034363600d20308746573743034363700d30308746573743034363800d40308746573743034363900d5030874657374" + "3034373000d60308746573743034373100d70308746573743034373200d80308746573743034373300d90308746573743034373400da030874" + "6573743034373500db0308746573743034373600dc0308746573743034373700dd0308746573743034373800de0308746573743034373900df" + "0308746573743034383000e00308746573743034383100e10308746573743034383200e20308746573743034383300e3030874657374303438" + "3400e40308746573743034383500e50308746573743034383600e60308746573743034383700e70308746573743034383800e8030874657374" + "3034383900e90308746573743034393000ea0308746573743034393100eb0308746573743034393200ec0308746573743034393300ed030874" + "6573743034393400ee0308746573743034393500ef0308746573743034393600f00308746573743034393700f10308746573743034393800f2" + "0308746573743034393900f30308746573743035303000f40308746573743035303100f50308746573743035303200f6030874657374303530" + "3300f70308746573743035303400f80308746573743035303500f90308746573743035303600fa0308746573743035303700fb030874657374" + "3035303800fc0308746573743035303900fd0308746573743035313000fe0308746573743035313100ff030874657374303531320080040874" + "657374303531330081040874657374303531340082040874657374303531350083040874657374303531360084040874657374303531370085" + "040874657374303531380086040874657374303531390087040874657374303532300088040874657374303532310089040874657374303532" + "32008a04087465737430353233008b04087465737430353234008c04087465737430353235008d04087465737430353236008e040874657374" + "30353237008f040874657374303532380090040874657374303532390091040874657374303533300092040874657374303533310093040874" + "657374303533320094040874657374303533330095040874657374303533340096040874657374303533350097040874657374303533360098" + "04087465737430353337009904087465737430353338009a04087465737430353339009b04087465737430353430009c040874657374303534" + "31009d04087465737430353432009e04087465737430353433009f0408746573743035343400a00408746573743035343500a1040874657374" + "3035343600a20408746573743035343700a30408746573743035343800a40408746573743035343900a50408746573743035353000a6040874" + "6573743035353100a70408746573743035353200a80408746573743035353300a90408746573743035353400aa0408746573743035353500ab" + "0408746573743035353600ac0408746573743035353700ad0408746573743035353800ae0408746573743035353900af040874657374303536" + "3000b00408746573743035363100b10408746573743035363200b20408746573743035363300b30408746573743035363400b4040874657374" + "3035363500b50408746573743035363600b60408746573743035363700b70408746573743035363800b80408746573743035363900b9040874" + "6573743035373000ba0408746573743035373100bb0408746573743035373200bc0408746573743035373300bd0408746573743035373400be" + "0408746573743035373500bf0408746573743035373600c00408746573743035373700c10408746573743035373800c2040874657374303537" + "3900c30408746573743035383000c40408746573743035383100c50408746573743035383200c60408746573743035383300c7040874657374" + "3035383400c80408746573743035383500c90408746573743035383600ca0408746573743035383700cb0408746573743035383800cc040874" + "6573743035383900cd0408746573743035393000ce0408746573743035393100cf0408746573743035393200d00408746573743035393300d1" + "0408746573743035393400d20408746573743035393500d30408746573743035393600d40408746573743035393700d5040874657374303539" + "3800d60408746573743035393900d70408746573743036303000d80408746573743036303100d90408746573743036303200da040874657374" + "3036303300db0408746573743036303400dc0408746573743036303500dd0408746573743036303600de0408746573743036303700df040874" + "6573743036303800e00408746573743036303900e10408746573743036313000e20408746573743036313100e30408746573743036313200e4" + "0408746573743036313300e50408746573743036313400e60408746573743036313500e70408746573743036313600e8040874657374303631" + "3700e90408746573743036313800ea0408746573743036313900eb0408746573743036323000ec0408746573743036323100ed040874657374" + "3036323200ee0408746573743036323300ef0408746573743036323400f00408746573743036323500f10408746573743036323600f2040874" + "6573743036323700f30408746573743036323800f40408746573743036323900f50408746573743036333000f60408746573743036333100f7" + "0408746573743036333200f80408746573743036333300f90408746573743036333400fa0408746573743036333500fb040874657374303633" + "3600fc0408746573743036333700fd0408746573743036333800fe0408746573743036333900ff040874657374303634300080050874657374" + "303634310081050874657374303634320082050874657374303634330083050874657374303634340084050874657374303634350085050874" + "65737430363436008605087465737430363437008705087465737430363438008805087465737430363439008905087465737430363530008a" + "05087465737430363531008b05087465737430363532008c05087465737430363533008d05087465737430363534008e050874657374303635" + "35008f050874657374303635360090050874657374303635370091050874657374303635380092050874657374303635390093050874657374" + "303636300094050874657374303636310095050874657374303636320096050874657374303636330097050874657374303636340098050874" + "65737430363635009905087465737430363636009a05087465737430363637009b05087465737430363638009c05087465737430363639009d" + "05087465737430363730009e05087465737430363731009f0508746573743036373200a00508746573743036373300a1050874657374303637" + "3400a20508746573743036373500a30508746573743036373600a40508746573743036373700a50508746573743036373800a6050874657374" + "3036373900a70508746573743036383000a80508746573743036383100a90508746573743036383200aa0508746573743036383300ab050874" + "6573743036383400ac0508746573743036383500ad0508746573743036383600ae0508746573743036383700af0508746573743036383800b0" + "0508746573743036383900b10508746573743036393000b20508746573743036393100b30508746573743036393200b4050874657374303639" + "3300b50508746573743036393400b60508746573743036393500b70508746573743036393600b80508746573743036393700b9050874657374" + "3036393800ba0508746573743036393900bb0508746573743037303000bc0508746573743037303100bd0508746573743037303200be050874" + "6573743037303300bf0508746573743037303400c00508746573743037303500c10508746573743037303600c20508746573743037303700c3" + "0508746573743037303800c40508746573743037303900c50508746573743037313000c60508746573743037313100c7050874657374303731" + "3200c80508746573743037313300c90508746573743037313400ca0508746573743037313500cb0508746573743037313600cc050874657374" + "3037313700cd0508746573743037313800ce0508746573743037313900cf0508746573743037323000d00508746573743037323100d1050874" + "6573743037323200d20508746573743037323300d30508746573743037323400d40508746573743037323500d50508746573743037323600d6" + "0508746573743037323700d70508746573743037323800d80508746573743037323900d90508746573743037333000da050874657374303733" + "3100db0508746573743037333200dc0508746573743037333300dd0508746573743037333400de0508746573743037333500df050874657374" + "3037333600e00508746573743037333700e10508746573743037333800e20508746573743037333900e30508746573743037343000e4050874" + "6573743037343100e50508746573743037343200e60508746573743037343300e70508746573743037343400e80508746573743037343500e9" + "0508746573743037343600ea0508746573743037343700eb0508746573743037343800ec0508746573743037343900ed050874657374303735" + "3000ee0508746573743037353100ef0508746573743037353200f00508746573743037353300f10508746573743037353400f2050874657374" + "3037353500f30508746573743037353600f40508746573743037353700f50508746573743037353800f60508746573743037353900f7050874" + "6573743037363000f80508746573743037363100f90508746573743037363200fa0508746573743037363300fb0508746573743037363400fc" + "0508746573743037363500fd0508746573743037363600fe0508746573743037363700ff050874657374303736380080060874657374303736" + "390081060874657374303737300082060874657374303737310083060874657374303737320084060874657374303737330085060874657374" + "30373734008606087465737430373735008706087465737430373736008806087465737430373737008906087465737430373738008a060874" + "65737430373739008b06087465737430373830008c06087465737430373831008d06087465737430373832008e06087465737430373833008f" + "060874657374303738340090060874657374303738350091060874657374303738360092060874657374303738370093060874657374303738" + "380094060874657374303738390095060874657374303739300096060874657374303739310097060874657374303739320098060874657374" + "30373933009906087465737430373934009a06087465737430373935009b06087465737430373936009c06087465737430373937009d060874" + "65737430373938009e06087465737430373939009f0608746573743038303000a00608746573743038303100a10608746573743038303200a2" + "0608746573743038303300a30608746573743038303400a40608746573743038303500a50608746573743038303600a6060874657374303830" + "3700a70608746573743038303800a80608746573743038303900a90608746573743038313000aa0608746573743038313100ab060874657374" + "3038313200ac0608746573743038313300ad0608746573743038313400ae0608746573743038313500af0608746573743038313600b0060874" + "6573743038313700b10608746573743038313800b20608746573743038313900b30608746573743038323000b40608746573743038323100b5" + "0608746573743038323200b60608746573743038323300b70608746573743038323400b80608746573743038323500b9060874657374303832" + "3600ba0608746573743038323700bb0608746573743038323800bc0608746573743038323900bd0608746573743038333000be060874657374" + "3038333100bf0608746573743038333200c00608746573743038333300c10608746573743038333400c20608746573743038333500c3060874" + "6573743038333600c40608746573743038333700c50608746573743038333800c60608746573743038333900c70608746573743038343000c8" + "0608746573743038343100c90608746573743038343200ca0608746573743038343300cb0608746573743038343400cc060874657374303834" + "3500cd0608746573743038343600ce0608746573743038343700cf0608746573743038343800d00608746573743038343900d1060874657374" + "3038353000d20608746573743038353100d30608746573743038353200d40608746573743038353300d50608746573743038353400d6060874" + "6573743038353500d70608746573743038353600d80608746573743038353700d90608746573743038353800da0608746573743038353900db" + "0608746573743038363000dc0608746573743038363100dd0608746573743038363200de0608746573743038363300df060874657374303836" + "3400e00608746573743038363500e10608746573743038363600e20608746573743038363700e30608746573743038363800e4060874657374" + "3038363900e50608746573743038373000e60608746573743038373100e70608746573743038373200e80608746573743038373300e9060874" + "6573743038373400ea0608746573743038373500eb0608746573743038373600ec0608746573743038373700ed0608746573743038373800ee" + "0608746573743038373900ef0608746573743038383000f00608746573743038383100f10608746573743038383200f2060874657374303838" + "3300f30608746573743038383400f40608746573743038383500f50608746573743038383600f60608746573743038383700f7060874657374" + "3038383800f80608746573743038383900f90608746573743038393000fa0608746573743038393100fb0608746573743038393200fc060874" + "6573743038393300fd0608746573743038393400fe0608746573743038393500ff060874657374303839360080070874657374303839370081" + "070874657374303839380082070874657374303839390083070874657374303930300084070874657374303930310085070874657374303930" + "32008607087465737430393033008707087465737430393034008807087465737430393035008907087465737430393036008a070874657374" + "30393037008b07087465737430393038008c07087465737430393039008d07087465737430393130008e07087465737430393131008f070874" + "657374303931320090070874657374303931330091070874657374303931340092070874657374303931350093070874657374303931360094" + "070874657374303931370095070874657374303931380096070874657374303931390097070874657374303932300098070874657374303932" + "31009907087465737430393232009a07087465737430393233009b07087465737430393234009c07087465737430393235009d070874657374" + "30393236009e07087465737430393237009f0708746573743039323800a00708746573743039323900a10708746573743039333000a2070874" + "6573743039333100a30708746573743039333200a40708746573743039333300a50708746573743039333400a60708746573743039333500a7" + "0708746573743039333600a80708746573743039333700a90708746573743039333800aa0708746573743039333900ab070874657374303934" + "3000ac0708746573743039343100ad0708746573743039343200ae0708746573743039343300af0708746573743039343400b0070874657374" + "3039343500b10708746573743039343600b20708746573743039343700b30708746573743039343800b40708746573743039343900b5070874" + "6573743039353000b60708746573743039353100b70708746573743039353200b80708746573743039353300b90708746573743039353400ba" + "0708746573743039353500bb0708746573743039353600bc0708746573743039353700bd0708746573743039353800be070874657374303935" + "3900bf0708746573743039363000c00708746573743039363100c10708746573743039363200c20708746573743039363300c3070874657374" + "3039363400c40708746573743039363500c50708746573743039363600c60708746573743039363700c70708746573743039363800c8070874" + "6573743039363900c90708746573743039373000ca0708746573743039373100cb0708746573743039373200cc0708746573743039373300cd" + "0708746573743039373400ce0708746573743039373500cf0708746573743039373600d00708746573743039373700d1070874657374303937" + "3800d20708746573743039373900d30708746573743039383000d40708746573743039383100d50708746573743039383200d6070874657374" + "3039383300d70708746573743039383400d80708746573743039383500d90708746573743039383600da0708746573743039383700db070874" + "6573743039383800dc0708746573743039383900dd0708746573743039393000de0708746573743039393100df0708746573743039393200e0" + "0708746573743039393300e10708746573743039393400e20708746573743039393500e30708746573743039393600e4070874657374303939" + "3700e50708746573743039393800e60708746573743039393900e70708746573743130303000e80708746573743130303100e9070874657374" + "3130303200ea0708746573743130303300eb0708746573743130303400ec0708746573743130303500ed0708746573743130303600ee070874" + "6573743130303700ef0708746573743130303800f00708746573743130303900f10708746573743130313000f20708746573743130313100f3" + "0708746573743130313200f40708746573743130313300f50708746573743130313400f60708746573743130313500f7070874657374313031" + "3600f80708746573743130313700f90708746573743130313800fa0708746573743130313900fb0708746573743130323000fc070874657374" + "3130323100fd0708746573743130323200fe0708746573743130323300ff070874657374313032340080080874657374313032350081080874" + "657374313032360082080874657374313032370083080874657374313032380084080874657374313032390085080874657374313033300086" + "08087465737431303331008708087465737431303332008808087465737431303333008908087465737431303334008a080874657374313033" + "35008b08087465737431303336008c08087465737431303337008d08087465737431303338008e08087465737431303339008f080874657374" + "313034300090080874657374313034310091080874657374313034320092080874657374313034330093080874657374313034340094080874" + "657374313034350095080874657374313034360096080874657374313034370097080874657374313034380098080874657374313034390099" + "08087465737431303530009a08087465737431303531009b08087465737431303532009c08087465737431303533009d080874657374313035" + "34009e08087465737431303535009f0808746573743130353600a00808746573743130353700a10808746573743130353800a2080874657374" + "3130353900a30808746573743130363000a40808746573743130363100a50808746573743130363200a60808746573743130363300a7080874" + "6573743130363400a80808746573743130363500a90808746573743130363600aa0808746573743130363700ab0808746573743130363800ac" + "0808746573743130363900ad0808746573743130373000ae0808746573743130373100af0808746573743130373200b0080874657374313037" + "3300b10808746573743130373400b20808746573743130373500b30808746573743130373600b40808746573743130373700b5080874657374" + "3130373800b60808746573743130373900b70808746573743130383000b80808746573743130383100b90808746573743130383200ba080874" + "6573743130383300bb0808746573743130383400bc0808746573743130383500bd0808746573743130383600be0808746573743130383700bf" + "0808746573743130383800c00808746573743130383900c10808746573743130393000c20808746573743130393100c3080874657374313039" + "3200c40808746573743130393300c50808746573743130393400c60808746573743130393500c70808746573743130393600c8080874657374" + "3130393700c90808746573743130393800ca0808746573743130393900cb0808746573743131303000cc0808746573743131303100cd080874" + "6573743131303200ce0808746573743131303300cf0808746573743131303400d00808746573743131303500d10808746573743131303600d2" + "0808746573743131303700d30808746573743131303800d40808746573743131303900d50808746573743131313000d6080874657374313131" + "3100d70808746573743131313200d80808746573743131313300d90808746573743131313400da0808746573743131313500db080874657374" + "3131313600dc0808746573743131313700dd0808746573743131313800de0808746573743131313900df0808746573743131323000e0080874" + "6573743131323100e10808746573743131323200e20808746573743131323300e30808746573743131323400e40808746573743131323500e5" + "0808746573743131323600e60808746573743131323700e70808746573743131323800e80808746573743131323900e9080874657374313133" + "3000ea0808746573743131333100eb0808746573743131333200ec0808746573743131333300ed0808746573743131333400ee080874657374" + "3131333500ef0808746573743131333600f00808746573743131333700f10808746573743131333800f20808746573743131333900f3080874" + "6573743131343000f40808746573743131343100f50808746573743131343200f60808746573743131343300f70808746573743131343400f8" + "0808746573743131343500f90808746573743131343600fa0808746573743131343700fb0808746573743131343800fc080874657374313134" + "3900fd0808746573743131353000fe0808746573743131353100ff080874657374313135320080090874657374313135330081090874657374" + "313135340082090874657374313135350083090874657374313135360084090874657374313135370085090874657374313135380086090874" + "65737431313539008709087465737431313630008809087465737431313631008909087465737431313632008a09087465737431313633008b" + "09087465737431313634008c09087465737431313635008d09087465737431313636008e09087465737431313637008f090874657374313136" + "380090090874657374313136390091090874657374313137300092090874657374313137310093090874657374313137320094090874657374" + "313137330095090874657374313137340096090874657374313137350097090874657374313137360098090874657374313137370099090874" + "65737431313738009a09087465737431313739009b09087465737431313830009c09087465737431313831009d09087465737431313832009e" + "09087465737431313833009f0908746573743131383400a00908746573743131383500a10908746573743131383600a2090874657374313138" + "3700a30908746573743131383800a40908746573743131383900a50908746573743131393000a60908746573743131393100a7090874657374" + "3131393200a80908746573743131393300a90908746573743131393400aa0908746573743131393500ab0908746573743131393600ac090874" + "6573743131393700ad0908746573743131393800ae0908746573743131393900af0908746573743132303000b00908746573743132303100b1" + "0908746573743132303200b20908746573743132303300b30908746573743132303400b40908746573743132303500b5090874657374313230" + "3600b60908746573743132303700b70908746573743132303800b80908746573743132303900b90908746573743132313000ba090874657374" + "3132313100bb0908746573743132313200bc0908746573743132313300bd0908746573743132313400be0908746573743132313500bf090874" + "6573743132313600c00908746573743132313700c10908746573743132313800c20908746573743132313900c30908746573743132323000c4" + "0908746573743132323100c50908746573743132323200c60908746573743132323300c70908746573743132323400c8090874657374313232" + "3500c90908746573743132323600ca0908746573743132323700cb0908746573743132323800cc0908746573743132323900cd090874657374" + "3132333000ce0908746573743132333100cf0908746573743132333200d00908746573743132333300d10908746573743132333400d2090874" + "6573743132333500d30908746573743132333600d40908746573743132333700d50908746573743132333800d60908746573743132333900d7" + "0908746573743132343000d80908746573743132343100d90908746573743132343200da0908746573743132343300db090874657374313234" + "3400dc0908746573743132343500dd0908746573743132343600de0908746573743132343700df0908746573743132343800e0090874657374" + "3132343900e10908746573743132353000e20908746573743132353100e30908746573743132353200e40908746573743132353300e5090874" + "6573743132353400e60908746573743132353500e70908746573743132353600e80908746573743132353700e90908746573743132353800ea" + "0908746573743132353900eb0908746573743132363000ec0908746573743132363100ed0908746573743132363200ee090874657374313236" + "3300ef0908746573743132363400f00908746573743132363500f10908746573743132363600f20908746573743132363700f3090874657374" + "3132363800f40908746573743132363900f50908746573743132373000f60908746573743132373100f70908746573743132373200f8090874" + "6573743132373300f90908746573743132373400fa0908746573743132373500fb0908746573743132373600fc0908746573743132373700fd" + "0908746573743132373800fe0908746573743132373900ff0908746573743132383000800a08746573743132383100810a0874657374313238" + "3200820a08746573743132383300830a08746573743132383400840a08746573743132383500850a08746573743132383600860a0874657374" + "3132383700870a08746573743132383800880a08746573743132383900890a087465737431323930008a0a087465737431323931008b0a0874" + "65737431323932008c0a087465737431323933008d0a087465737431323934008e0a087465737431323935008f0a0874657374313239360090" + "0a08746573743132393700910a08746573743132393800920a08746573743132393900930a08746573743133303000940a0874657374313330" + "3100950a08746573743133303200960a08746573743133303300970a08746573743133303400980a08746573743133303500990a0874657374" + "31333036009a0a087465737431333037009b0a087465737431333038009c0a087465737431333039009d0a087465737431333130009e0a0874" + "65737431333131009f0a08746573743133313200a00a08746573743133313300a10a08746573743133313400a20a08746573743133313500a3" + "0a08746573743133313600a40a08746573743133313700a50a08746573743133313800a60a08746573743133313900a70a0874657374313332" + "3000a80a08746573743133323100a90a08746573743133323200aa0a08746573743133323300ab0a08746573743133323400ac0a0874657374" + "3133323500ad0a08746573743133323600ae0a08746573743133323700af0a08746573743133323800b00a08746573743133323900b10a0874" + "6573743133333000b20a08746573743133333100b30a08746573743133333200b40a08746573743133333300b50a08746573743133333400b6" + "0a08746573743133333500b70a08746573743133333600b80a08746573743133333700b90a08746573743133333800ba0a0874657374313333" + "3900bb0a08746573743133343000bc0a08746573743133343100bd0a08746573743133343200be0a08746573743133343300bf0a0874657374" + "3133343400c00a08746573743133343500c10a08746573743133343600c20a08746573743133343700c30a08746573743133343800c40a0874" + "6573743133343900c50a08746573743133353000c60a08746573743133353100c70a08746573743133353200c80a08746573743133353300c9" + "0a08746573743133353400ca0a08746573743133353500cb0a08746573743133353600cc0a08746573743133353700cd0a0874657374313335" + "3800ce0a08746573743133353900cf0a08746573743133363000d00a08746573743133363100d10a08746573743133363200d20a0874657374" + "3133363300d30a08746573743133363400d40a08746573743133363500d50a08746573743133363600d60a08746573743133363700d70a0874" + "6573743133363800d80a08746573743133363900d90a08746573743133373000da0a08746573743133373100db0a08746573743133373200dc" + "0a08746573743133373300dd0a08746573743133373400de0a08746573743133373500df0a08746573743133373600e00a0874657374313337" + "3700e10a08746573743133373800e20a08746573743133373900e30a08746573743133383000e40a08746573743133383100e50a0874657374" + "3133383200e60a08746573743133383300e70a08746573743133383400e80a08746573743133383500e90a08746573743133383600ea0a0874" + "6573743133383700eb0a08746573743133383800ec0a08746573743133383900ed0a08746573743133393000ee0a08746573743133393100ef" + "0a08746573743133393200f00a08746573743133393300f10a08746573743133393400f20a08746573743133393500f30a0874657374313339" + "3600f40a08746573743133393700f50a08746573743133393800f60a08746573743133393900f70a08746573743134303000f80a0874657374" + "3134303100f90a08746573743134303200fa0a08746573743134303300fb0a08746573743134303400fc0a08746573743134303500fd0a0874" + "6573743134303600fe0a08746573743134303700ff0a08746573743134303800800b08746573743134303900810b0874657374313431300082" + "0b08746573743134313100830b08746573743134313200840b08746573743134313300850b08746573743134313400860b0874657374313431" + "3500870b08746573743134313600880b08746573743134313700890b087465737431343138008a0b087465737431343139008b0b0874657374" + "31343230008c0b087465737431343231008d0b087465737431343232008e0b087465737431343233008f0b08746573743134323400900b0874" + "6573743134323500910b08746573743134323600920b08746573743134323700930b08746573743134323800940b0874657374313432390095" + "0b08746573743134333000960b08746573743134333100970b08746573743134333200980b08746573743134333300990b0874657374313433" + "34009a0b087465737431343335009b0b087465737431343336009c0b087465737431343337009d0b087465737431343338009e0b0874657374" + "31343339009f0b08746573743134343000a00b08746573743134343100a10b08746573743134343200a20b08746573743134343300a30b0874" + "6573743134343400a40b08746573743134343500a50b08746573743134343600a60b08746573743134343700a70b08746573743134343800a8" + "0b08746573743134343900a90b08746573743134353000aa0b08746573743134353100ab0b08746573743134353200ac0b0874657374313435" + "3300ad0b08746573743134353400ae0b08746573743134353500af0b08746573743134353600b00b08746573743134353700b10b0874657374" + "3134353800b20b08746573743134353900b30b08746573743134363000b40b08746573743134363100b50b08746573743134363200b60b0874" + "6573743134363300b70b08746573743134363400b80b08746573743134363500b90b08746573743134363600ba0b08746573743134363700bb" + "0b08746573743134363800bc0b08746573743134363900bd0b08746573743134373000be0b08746573743134373100bf0b0874657374313437" + "3200c00b08746573743134373300c10b08746573743134373400c20b08746573743134373500c30b08746573743134373600c40b0874657374" + "3134373700c50b08746573743134373800c60b08746573743134373900c70b08746573743134383000c80b08746573743134383100c90b0874" + "6573743134383200ca0b08746573743134383300cb0b08746573743134383400cc0b08746573743134383500cd0b08746573743134383600ce" + "0b08746573743134383700cf0b08746573743134383800d00b08746573743134383900d10b08746573743134393000d20b0874657374313439" + "3100d30b08746573743134393200d40b08746573743134393300d50b08746573743134393400d60b08746573743134393500d70b0874657374" + "3134393600d80b08746573743134393700d90b08746573743134393800da0b08746573743134393900db0b08746573743135303000dc0b0874" + "6573743135303100dd0b08746573743135303200de0b08746573743135303300df0b08746573743135303400e00b08746573743135303500e1" + "0b08746573743135303600e20b08746573743135303700e30b08746573743135303800e40b08746573743135303900e50b0874657374313531" + "3000e60b08746573743135313100e70b08746573743135313200e80b08746573743135313300e90b08746573743135313400ea0b0874657374" + "3135313500eb0b08746573743135313600ec0b08746573743135313700ed0b08746573743135313800ee0b08746573743135313900ef0b0874" + "6573743135323000f00b08746573743135323100f10b08746573743135323200f20b08746573743135323300f30b08746573743135323400f4" + "0b08746573743135323500f50b08746573743135323600f60b08746573743135323700f70b08746573743135323800f80b0874657374313532" + "3900f90b08746573743135333000fa0b08746573743135333100fb0b08746573743135333200fc0b08746573743135333300fd0b0874657374" + "3135333400fe0b08746573743135333500ff0b08746573743135333600800c08746573743135333700810c08746573743135333800820c0874" + "6573743135333900830c08746573743135343000840c08746573743135343100850c08746573743135343200860c0874657374313534330087" + "0c08746573743135343400880c08746573743135343500890c087465737431353436008a0c087465737431353437008b0c0874657374313534" + "38008c0c087465737431353439008d0c087465737431353530008e0c087465737431353531008f0c08746573743135353200900c0874657374" + "3135353300910c08746573743135353400920c08746573743135353500930c08746573743135353600940c08746573743135353700950c0874" + "6573743135353800960c08746573743135353900970c08746573743135363000980c08746573743135363100990c087465737431353632009a" + "0c087465737431353633009b0c087465737431353634009c0c087465737431353635009d0c087465737431353636009e0c0874657374313536" + "37009f0c08746573743135363800a00c08746573743135363900a10c08746573743135373000a20c08746573743135373100a30c0874657374" + "3135373200a40c08746573743135373300a50c08746573743135373400a60c08746573743135373500a70c08746573743135373600a80c0874" + "6573743135373700a90c08746573743135373800aa0c08746573743135373900ab0c08746573743135383000ac0c08746573743135383100ad" + "0c08746573743135383200ae0c08746573743135383300af0c08746573743135383400b00c08746573743135383500b10c0874657374313538" + "3600b20c08746573743135383700b30c08746573743135383800b40c08746573743135383900b50c08746573743135393000b60c0874657374" + "3135393100b70c08746573743135393200b80c08746573743135393300b90c08746573743135393400ba0c08746573743135393500bb0c0874" + "6573743135393600bc0c08746573743135393700bd0c08746573743135393800be0c08746573743135393900bf0c08746573743136303000c0" + "0c08746573743136303100c10c08746573743136303200c20c08746573743136303300c30c08746573743136303400c40c0874657374313630" + "3500c50c08746573743136303600c60c08746573743136303700c70c08746573743136303800c80c08746573743136303900c90c0874657374" + "3136313000ca0c08746573743136313100cb0c08746573743136313200cc0c08746573743136313300cd0c08746573743136313400ce0c0874" + "6573743136313500cf0c08746573743136313600d00c08746573743136313700d10c08746573743136313800d20c08746573743136313900d3" + "0c08746573743136323000d40c08746573743136323100d50c08746573743136323200d60c08746573743136323300d70c0874657374313632" + "3400d80c08746573743136323500d90c08746573743136323600da0c08746573743136323700db0c08746573743136323800dc0c0874657374" + "3136323900dd0c08746573743136333000de0c08746573743136333100df0c08746573743136333200e00c08746573743136333300e10c0874" + "6573743136333400e20c08746573743136333500e30c08746573743136333600e40c08746573743136333700e50c08746573743136333800e6" + "0c08746573743136333900e70c08746573743136343000e80c08746573743136343100e90c08746573743136343200ea0c0874657374313634" + "3300eb0c08746573743136343400ec0c08746573743136343500ed0c08746573743136343600ee0c08746573743136343700ef0c0874657374" + "3136343800f00c08746573743136343900f10c08746573743136353000f20c08746573743136353100f30c08746573743136353200f40c0874" + "6573743136353300f50c08746573743136353400f60c08746573743136353500f70c08746573743136353600f80c08746573743136353700f9" + "0c08746573743136353800fa0c08746573743136353900fb0c08746573743136363000fc0c08746573743136363100fd0c0874657374313636" + "3200fe0c08746573743136363300ff0c08746573743136363400800d08746573743136363500810d08746573743136363600820d0874657374" + "3136363700830d08746573743136363800840d08746573743136363900850d08746573743136373000860d08746573743136373100870d0874" + "6573743136373200880d08746573743136373300890d087465737431363734008a0d087465737431363735008b0d087465737431363736008c" + "0d087465737431363737008d0d087465737431363738008e0d087465737431363739008f0d08746573743136383000900d0874657374313638" + "3100910d08746573743136383200920d08746573743136383300930d08746573743136383400940d08746573743136383500950d0874657374" + "3136383600960d08746573743136383700970d08746573743136383800980d08746573743136383900990d087465737431363930009a0d0874" + "65737431363931009b0d087465737431363932009c0d087465737431363933009d0d087465737431363934009e0d087465737431363935009f" + "0d08746573743136393600a00d08746573743136393700a10d08746573743136393800a20d08746573743136393900a30d0874657374313730" + "3000a40d08746573743137303100a50d08746573743137303200a60d08746573743137303300a70d08746573743137303400a80d0874657374" + "3137303500a90d08746573743137303600aa0d08746573743137303700ab0d08746573743137303800ac0d08746573743137303900ad0d0874" + "6573743137313000ae0d08746573743137313100af0d08746573743137313200b00d08746573743137313300b10d08746573743137313400b2" + "0d08746573743137313500b30d08746573743137313600b40d08746573743137313700b50d08746573743137313800b60d0874657374313731" + "3900b70d08746573743137323000b80d08746573743137323100b90d08746573743137323200ba0d08746573743137323300bb0d0874657374" + "3137323400bc0d08746573743137323500bd0d08746573743137323600be0d08746573743137323700bf0d08746573743137323800c00d0874" + "6573743137323900c10d08746573743137333000c20d08746573743137333100c30d08746573743137333200c40d08746573743137333300c5" + "0d08746573743137333400c60d08746573743137333500c70d08746573743137333600c80d08746573743137333700c90d0874657374313733" + "3800ca0d08746573743137333900cb0d08746573743137343000cc0d08746573743137343100cd0d08746573743137343200ce0d0874657374" + "3137343300cf0d08746573743137343400d00d08746573743137343500d10d08746573743137343600d20d08746573743137343700d30d0874" + "6573743137343800d40d08746573743137343900d50d08746573743137353000d60d08746573743137353100d70d08746573743137353200d8" + "0d08746573743137353300d90d08746573743137353400da0d08746573743137353500db0d08746573743137353600dc0d0874657374313735" + "3700dd0d08746573743137353800de0d08746573743137353900df0d08746573743137363000e00d08746573743137363100e10d0874657374" + "3137363200e20d08746573743137363300e30d08746573743137363400e40d08746573743137363500e50d08746573743137363600e60d0874" + "6573743137363700e70d08746573743137363800e80d08746573743137363900e90d08746573743137373000ea0d08746573743137373100eb" + "0d08746573743137373200ec0d08746573743137373300ed0d08746573743137373400ee0d08746573743137373500ef0d0874657374313737" + "3600f00d08746573743137373700f10d08746573743137373800f20d08746573743137373900f30d08746573743137383000f40d0874657374" + "3137383100f50d08746573743137383200f60d08746573743137383300f70d08746573743137383400f80d08746573743137383500f90d0874" + "6573743137383600fa0d08746573743137383700fb0d08746573743137383800fc0d08746573743137383900fd0d08746573743137393000fe" + "0d08746573743137393100ff0d08746573743137393200800e08746573743137393300810e08746573743137393400820e0874657374313739" + "3500830e08746573743137393600840e08746573743137393700850e08746573743137393800860e08746573743137393900870e0874657374" + "3138303000880e08746573743138303100890e087465737431383032008a0e087465737431383033008b0e087465737431383034008c0e0874" + "65737431383035008d0e087465737431383036008e0e087465737431383037008f0e08746573743138303800900e0874657374313830390091" + "0e08746573743138313000920e08746573743138313100930e08746573743138313200940e08746573743138313300950e0874657374313831" + "3400960e08746573743138313500970e08746573743138313600980e08746573743138313700990e087465737431383138009a0e0874657374" + "31383139009b0e087465737431383230009c0e087465737431383231009d0e087465737431383232009e0e087465737431383233009f0e0874" + "6573743138323400a00e08746573743138323500a10e08746573743138323600a20e08746573743138323700a30e08746573743138323800a4" + "0e08746573743138323900a50e08746573743138333000a60e08746573743138333100a70e08746573743138333200a80e0874657374313833" + "3300a90e08746573743138333400aa0e08746573743138333500ab0e08746573743138333600ac0e08746573743138333700ad0e0874657374" + "3138333800ae0e08746573743138333900af0e08746573743138343000b00e08746573743138343100b10e08746573743138343200b20e0874" + "6573743138343300b30e08746573743138343400b40e08746573743138343500b50e08746573743138343600b60e08746573743138343700b7" + "0e08746573743138343800b80e08746573743138343900b90e08746573743138353000ba0e08746573743138353100bb0e0874657374313835" + "3200bc0e08746573743138353300bd0e08746573743138353400be0e08746573743138353500bf0e08746573743138353600c00e0874657374" + "3138353700c10e08746573743138353800c20e08746573743138353900c30e08746573743138363000c40e08746573743138363100c50e0874" + "6573743138363200c60e08746573743138363300c70e08746573743138363400c80e08746573743138363500c90e08746573743138363600ca" + "0e08746573743138363700cb0e08746573743138363800cc0e08746573743138363900cd0e08746573743138373000ce0e0874657374313837" + "3100cf0e08746573743138373200d00e08746573743138373300d10e08746573743138373400d20e08746573743138373500d30e0874657374" + "3138373600d40e08746573743138373700d50e08746573743138373800d60e08746573743138373900d70e08746573743138383000d80e0874" + "6573743138383100d90e08746573743138383200da0e08746573743138383300db0e08746573743138383400dc0e08746573743138383500dd" + "0e08746573743138383600de0e08746573743138383700df0e08746573743138383800e00e08746573743138383900e10e0874657374313839" + "3000e20e08746573743138393100e30e08746573743138393200e40e08746573743138393300e50e08746573743138393400e60e0874657374" + "3138393500e70e08746573743138393600e80e08746573743138393700e90e08746573743138393800ea0e08746573743138393900eb0e0874" + "6573743139303000ec0e08746573743139303100ed0e08746573743139303200ee0e08746573743139303300ef0e08746573743139303400f0" + "0e08746573743139303500f10e08746573743139303600f20e08746573743139303700f30e08746573743139303800f40e0874657374313930" + "3900f50e08746573743139313000f60e08746573743139313100f70e08746573743139313200f80e08746573743139313300f90e0874657374" + "3139313400fa0e08746573743139313500fb0e08746573743139313600fc0e08746573743139313700fd0e08746573743139313800fe0e0874" + "6573743139313900ff0e08746573743139323000800f08746573743139323100810f08746573743139323200820f0874657374313932330083" + "0f08746573743139323400840f08746573743139323500850f08746573743139323600860f08746573743139323700870f0874657374313932" + "3800880f08746573743139323900890f087465737431393330008a0f087465737431393331008b0f087465737431393332008c0f0874657374" + "31393333008d0f087465737431393334008e0f087465737431393335008f0f08746573743139333600900f08746573743139333700910f0874" + "6573743139333800920f08746573743139333900930f08746573743139343000940f08746573743139343100950f0874657374313934320096" + "0f08746573743139343300970f08746573743139343400980f08746573743139343500990f087465737431393436009a0f0874657374313934" + "37009b0f087465737431393438009c0f087465737431393439009d0f087465737431393530009e0f087465737431393531009f0f0874657374" + "3139353200a00f08746573743139353300a10f08746573743139353400a20f08746573743139353500a30f08746573743139353600a40f0874" + "6573743139353700a50f08746573743139353800a60f08746573743139353900a70f08746573743139363000a80f08746573743139363100a9" + "0f08746573743139363200aa0f08746573743139363300ab0f08746573743139363400ac0f08746573743139363500ad0f0874657374313936" + "3600ae0f08746573743139363700af0f08746573743139363800b00f08746573743139363900b10f08746573743139373000b20f0874657374" + "3139373100b30f08746573743139373200b40f08746573743139373300b50f08746573743139373400b60f08746573743139373500b70f0874" + "6573743139373600b80f08746573743139373700b90f08746573743139373800ba0f08746573743139373900bb0f08746573743139383000bc" + "0f08746573743139383100bd0f08746573743139383200be0f08746573743139383300bf0f08746573743139383400c00f0874657374313938" + "3500c10f08746573743139383600c20f08746573743139383700c30f08746573743139383800c40f08746573743139383900c50f0874657374" + "3139393000c60f08746573743139393100c70f08746573743139393200c80f08746573743139393300c90f08746573743139393400ca0f0874" + "6573743139393500cb0f08746573743139393600cc0f08746573743139393700cd0f08746573743139393800ce0f08746573743139393900cf" + "0f08746573743230303000d00f08746573743230303100d10f08746573743230303200d20f08746573743230303300d30f0874657374323030" + "3400d40f08746573743230303500d50f08746573743230303600d60f08746573743230303700d70f08746573743230303800d80f0874657374" + "3230303900d90f08746573743230313000da0f08746573743230313100db0f08746573743230313200dc0f08746573743230313300dd0f0874" + "6573743230313400de0f08746573743230313500df0f08746573743230313600e00f08746573743230313700e10f08746573743230313800e2" + "0f08746573743230313900e30f08746573743230323000e40f08746573743230323100e50f08746573743230323200e60f0874657374323032" + "3300e70f08746573743230323400e80f08746573743230323500e90f08746573743230323600ea0f08746573743230323700eb0f0874657374" + "3230323800ec0f08746573743230323900ed0f08746573743230333000ee0f08746573743230333100ef0f08746573743230333200f00f0874" + "6573743230333300f10f08746573743230333400f20f08746573743230333500f30f08746573743230333600f40f08746573743230333700f5" + "0f08746573743230333800f60f08746573743230333900f70f08746573743230343000f80f08746573743230343100f90f0874657374323034" + "3200fa0f08746573743230343300fb0f08746573743230343400fc0f08746573743230343500fd0f08746573743230343600fe0f0874657374" + "3230343700ff0f0874657374323034380080100874657374323034390081100874657374323035300082100874657374323035310083100874" + "657374323035320084100874657374323035330085100874657374323035340086100874657374323035350087100874657374323035360088" + "10087465737432303537008910087465737432303538008a10087465737432303539008b10087465737432303630008c100874657374323036" + "31008d10087465737432303632008e10087465737432303633008f100874657374323036340090100874657374323036350091100874657374" + "323036360092100874657374323036370093100874657374323036380094100874657374323036390095100874657374323037300096100874" + "65737432303731009710087465737432303732009810087465737432303733009910087465737432303734009a10087465737432303735009b" + "10087465737432303736009c10087465737432303737009d10087465737432303738009e10087465737432303739009f100874657374323038" + "3000a01008746573743230383100a11008746573743230383200a21008746573743230383300a31008746573743230383400a4100874657374" + "3230383500a51008746573743230383600a61008746573743230383700a71008746573743230383800a81008746573743230383900a9100874" + "6573743230393000aa1008746573743230393100ab1008746573743230393200ac1008746573743230393300ad1008746573743230393400ae" + "1008746573743230393500af1008746573743230393600b01008746573743230393700b11008746573743230393800b2100874657374323039" + "3900b31008746573743231303000b41008746573743231303100b51008746573743231303200b61008746573743231303300b7100874657374" + "3231303400b81008746573743231303500b91008746573743231303600ba1008746573743231303700bb1008746573743231303800bc100874" + "6573743231303900bd1008746573743231313000be1008746573743231313100bf1008746573743231313200c01008746573743231313300c1" + "1008746573743231313400c21008746573743231313500c31008746573743231313600c41008746573743231313700c5100874657374323131" + "3800c61008746573743231313900c71008746573743231323000c81008746573743231323100c91008746573743231323200ca100874657374" + "3231323300cb1008746573743231323400cc1008746573743231323500cd1008746573743231323600ce1008746573743231323700cf100874" + "6573743231323800d01008746573743231323900d11008746573743231333000d21008746573743231333100d31008746573743231333200d4" + "1008746573743231333300d51008746573743231333400d61008746573743231333500d71008746573743231333600d8100874657374323133" + "3700d91008746573743231333800da1008746573743231333900db1008746573743231343000dc1008746573743231343100dd100874657374" + "3231343200de1008746573743231343300df1008746573743231343400e01008746573743231343500e11008746573743231343600e2100874" + "6573743231343700e31008746573743231343800e41008746573743231343900e51008746573743231353000e61008746573743231353100e7" + "1008746573743231353200e81008746573743231353300e91008746573743231353400ea1008746573743231353500eb100874657374323135" + "3600ec1008746573743231353700ed1008746573743231353800ee1008746573743231353900ef1008746573743231363000f0100874657374" + "3231363100f11008746573743231363200f21008746573743231363300f31008746573743231363400f41008746573743231363500f5100874" + "6573743231363600f61008746573743231363700f71008746573743231363800f81008746573743231363900f91008746573743231373000fa" + "1008746573743231373100fb1008746573743231373200fc1008746573743231373300fd1008746573743231373400fe100874657374323137" + "3500ff100874657374323137360080110874657374323137370081110874657374323137380082110874657374323137390083110874657374" + "323138300084110874657374323138310085110874657374323138320086110874657374323138330087110874657374323138340088110874" + "65737432313835008911087465737432313836008a11087465737432313837008b11087465737432313838008c11087465737432313839008d" + "11087465737432313930008e11087465737432313931008f110874657374323139320090110874657374323139330091110874657374323139" + "340092110874657374323139350093110874657374323139360094110874657374323139370095110874657374323139380096110874657374" + "32313939009711087465737432323030009811087465737432323031009911087465737432323032009a11087465737432323033009b110874" + "65737432323034009c11087465737432323035009d11087465737432323036009e11087465737432323037009f1108746573743232303800a0" + "1108746573743232303900a11108746573743232313000a21108746573743232313100a31108746573743232313200a4110874657374323231" + "3300a51108746573743232313400a61108746573743232313500a71108746573743232313600a81108746573743232313700a9110874657374" + "3232313800aa1108746573743232313900ab1108746573743232323000ac1108746573743232323100ad1108746573743232323200ae110874" + "6573743232323300af1108746573743232323400b01108746573743232323500b11108746573743232323600b21108746573743232323700b3" + "1108746573743232323800b41108746573743232323900b51108746573743232333000b61108746573743232333100b7110874657374323233" + "3200b81108746573743232333300b91108746573743232333400ba1108746573743232333500bb1108746573743232333600bc110874657374" + "3232333700bd1108746573743232333800be1108746573743232333900bf1108746573743232343000c01108746573743232343100c1110874" + "6573743232343200c21108746573743232343300c31108746573743232343400c41108746573743232343500c51108746573743232343600c6" + "1108746573743232343700c71108746573743232343800c81108746573743232343900c91108746573743232353000ca110874657374323235" + "3100cb1108746573743232353200cc1108746573743232353300cd1108746573743232353400ce1108746573743232353500cf110874657374" + "3232353600d01108746573743232353700d11108746573743232353800d21108746573743232353900d31108746573743232363000d4110874" + "6573743232363100d51108746573743232363200d61108746573743232363300d71108746573743232363400d81108746573743232363500d9" + "1108746573743232363600da1108746573743232363700db1108746573743232363800dc1108746573743232363900dd110874657374323237" + "3000de1108746573743232373100df1108746573743232373200e01108746573743232373300e11108746573743232373400e2110874657374" + "3232373500e31108746573743232373600e41108746573743232373700e51108746573743232373800e61108746573743232373900e7110874" + "6573743232383000e81108746573743232383100e91108746573743232383200ea1108746573743232383300eb1108746573743232383400ec" + "1108746573743232383500ed1108746573743232383600ee1108746573743232383700ef1108746573743232383800f0110874657374323238" + "3900f11108746573743232393000f21108746573743232393100f31108746573743232393200f41108746573743232393300f5110874657374" + "3232393400f61108746573743232393500f71108746573743232393600f81108746573743232393700f91108746573743232393800fa110874" + "6573743232393900fb1108746573743233303000fc1108746573743233303100fd1108746573743233303200fe1108746573743233303300ff" + "110874657374323330340080120874657374323330350081120874657374323330360082120874657374323330370083120874657374323330" + "380084120874657374323330390085120874657374323331300086120874657374323331310087120874657374323331320088120874657374" + "32333133008912087465737432333134008a12087465737432333135008b12087465737432333136008c12087465737432333137008d120874" + "65737432333138008e12087465737432333139008f120874657374323332300090120874657374323332310091120874657374323332320092" + "120874657374323332330093120874657374323332340094120874657374323332350095120874657374323332360096120874657374323332" + "37009712087465737432333238009812087465737432333239009912087465737432333330009a12087465737432333331009b120874657374" + "32333332009c12087465737432333333009d12087465737432333334009e12087465737432333335009f1208746573743233333600a0120874" + "6573743233333700a11208746573743233333800a21208746573743233333900a31208746573743233343000a41208746573743233343100a5" + "1208746573743233343200a61208746573743233343300a71208746573743233343400a81208746573743233343500a9120874657374323334" + "3600aa1208746573743233343700ab1208746573743233343800ac1208746573743233343900ad1208746573743233353000ae120874657374" + "3233353100af1208746573743233353200b01208746573743233353300b11208746573743233353400b21208746573743233353500b3120874" + "6573743233353600b41208746573743233353700b51208746573743233353800b61208746573743233353900b71208746573743233363000b8" + "1208746573743233363100b91208746573743233363200ba1208746573743233363300bb1208746573743233363400bc120874657374323336" + "3500bd1208746573743233363600be1208746573743233363700bf1208746573743233363800c01208746573743233363900c1120874657374" + "3233373000c21208746573743233373100c31208746573743233373200c41208746573743233373300c51208746573743233373400c6120874" + "6573743233373500c71208746573743233373600c81208746573743233373700c91208746573743233373800ca1208746573743233373900cb" + "1208746573743233383000cc1208746573743233383100cd1208746573743233383200ce1208746573743233383300cf120874657374323338" + "3400d01208746573743233383500d11208746573743233383600d21208746573743233383700d31208746573743233383800d4120874657374" + "3233383900d51208746573743233393000d61208746573743233393100d71208746573743233393200d81208746573743233393300d9120874" + "6573743233393400da1208746573743233393500db1208746573743233393600dc1208746573743233393700dd1208746573743233393800de" + "1208746573743233393900df1208746573743234303000e01208746573743234303100e11208746573743234303200e2120874657374323430" + "3300e31208746573743234303400e41208746573743234303500e51208746573743234303600e61208746573743234303700e7120874657374" + "3234303800e81208746573743234303900e91208746573743234313000ea1208746573743234313100eb1208746573743234313200ec120874" + "6573743234313300ed1208746573743234313400ee1208746573743234313500ef1208746573743234313600f01208746573743234313700f1" + "1208746573743234313800f21208746573743234313900f31208746573743234323000f41208746573743234323100f5120874657374323432" + "3200f61208746573743234323300f71208746573743234323400f81208746573743234323500f91208746573743234323600fa120874657374" + "3234323700fb1208746573743234323800fc1208746573743234323900fd1208746573743234333000fe1208746573743234333100ff120874" + "657374323433320080130874657374323433330081130874657374323433340082130874657374323433350083130874657374323433360084" + "130874657374323433370085130874657374323433380086130874657374323433390087130874657374323434300088130874657374323434" + "31008913087465737432343432008a13087465737432343433008b13087465737432343434008c13087465737432343435008d130874657374" + "32343436008e13087465737432343437008f130874657374323434380090130874657374323434390091130874657374323435300092130874" + "657374323435310093130874657374323435320094130874657374323435330095130874657374323435340096130874657374323435350097" + "13087465737432343536009813087465737432343537009913087465737432343538009a13087465737432343539009b130874657374323436" + "30009c13087465737432343631009d13087465737432343632009e13087465737432343633009f1308746573743234363400a0130874657374" + "3234363500a11308746573743234363600a21308746573743234363700a31308746573743234363800a41308746573743234363900a5130874" + "6573743234373000a61308746573743234373100a71308746573743234373200a81308746573743234373300a91308746573743234373400aa" + "1308746573743234373500ab1308746573743234373600ac1308746573743234373700ad1308746573743234373800ae130874657374323437" + "3900af1308746573743234383000b01308746573743234383100b11308746573743234383200b21308746573743234383300b3130874657374" + "3234383400b41308746573743234383500b51308746573743234383600b61308746573743234383700b71308746573743234383800b8130874" + "6573743234383900b91308746573743234393000ba1308746573743234393100bb1308746573743234393200bc1308746573743234393300bd" + "1308746573743234393400be1308746573743234393500bf1308746573743234393600c01308746573743234393700c1130874657374323439" + "3800c21308746573743234393900c31308746573743235303000c41308746573743235303100c51308746573743235303200c6130874657374" + "3235303300c71308746573743235303400c81308746573743235303500c91308746573743235303600ca1308746573743235303700cb130874" + "6573743235303800cc1308746573743235303900cd1308746573743235313000ce1308746573743235313100cf1308746573743235313200d0" + "1308746573743235313300d11308746573743235313400d21308746573743235313500d31308746573743235313600d4130874657374323531" + "3700d51308746573743235313800d61308746573743235313900d71308746573743235323000d81308746573743235323100d9130874657374" + "3235323200da1308746573743235323300db1308746573743235323400dc1308746573743235323500dd1308746573743235323600de130874" + "6573743235323700df1308746573743235323800e01308746573743235323900e11308746573743235333000e21308746573743235333100e3" + "1308746573743235333200e41308746573743235333300e51308746573743235333400e61308746573743235333500e7130874657374323533" + "3600e81308746573743235333700e91308746573743235333800ea1308746573743235333900eb1308746573743235343000ec130874657374" + "3235343100ed1308746573743235343200ee1308746573743235343300ef1308746573743235343400f01308746573743235343500f1130874" + "6573743235343600f21308746573743235343700f31308746573743235343800f41308746573743235343900f51308746573743235353000f6" + "1308746573743235353100f71308746573743235353200f81308746573743235353300f91308746573743235353400fa130874657374323535" + "3500fb1308746573743235353600fc1308746573743235353700fd1308746573743235353800fe1308746573743235353900ff130874657374" + "323536300080140874657374323536310081140874657374323536320082140874657374323536330083140874657374323536340084140874" + "657374323536350085140874657374323536360086140874657374323536370087140874657374323536380088140874657374323536390089" + "14087465737432353730008a14087465737432353731008b14087465737432353732008c14087465737432353733008d140874657374323537" + "34008e14087465737432353735008f140874657374323537360090140874657374323537370091140874657374323537380092140874657374" + "323537390093140874657374323538300094140874657374323538310095140874657374323538320096140874657374323538330097140874" + "65737432353834009814087465737432353835009914087465737432353836009a14087465737432353837009b14087465737432353838009c" + "14087465737432353839009d14087465737432353930009e14087465737432353931009f1408746573743235393200a0140874657374323539" + "3300a11408746573743235393400a21408746573743235393500a31408746573743235393600a41408746573743235393700a5140874657374" + "3235393800a61408746573743235393900a71408746573743236303000a81408746573743236303100a91408746573743236303200aa140874" + "6573743236303300ab1408746573743236303400ac1408746573743236303500ad1408746573743236303600ae1408746573743236303700af" + "1408746573743236303800b01408746573743236303900b11408746573743236313000b21408746573743236313100b3140874657374323631" + "3200b41408746573743236313300b51408746573743236313400b61408746573743236313500b71408746573743236313600b8140874657374" + "3236313700b91408746573743236313800ba1408746573743236313900bb1408746573743236323000bc1408746573743236323100bd140874" + "6573743236323200be1408746573743236323300bf1408746573743236323400c01408746573743236323500c11408746573743236323600c2" + "1408746573743236323700c31408746573743236323800c41408746573743236323900c51408746573743236333000c6140874657374323633" + "3100c71408746573743236333200c81408746573743236333300c91408746573743236333400ca1408746573743236333500cb140874657374" + "3236333600cc1408746573743236333700cd1408746573743236333800ce1408746573743236333900cf1408746573743236343000d0140874" + "6573743236343100d11408746573743236343200d21408746573743236343300d31408746573743236343400d41408746573743236343500d5" + "1408746573743236343600d61408746573743236343700d71408746573743236343800d81408746573743236343900d9140874657374323635" + "3000da1408746573743236353100db1408746573743236353200dc1408746573743236353300dd1408746573743236353400de140874657374" + "3236353500df1408746573743236353600e01408746573743236353700e11408746573743236353800e21408746573743236353900e3140874" + "6573743236363000e41408746573743236363100e51408746573743236363200e61408746573743236363300e71408746573743236363400e8" + "1408746573743236363500e91408746573743236363600ea1408746573743236363700eb1408746573743236363800ec140874657374323636" + "3900ed1408746573743236373000ee1408746573743236373100ef1408746573743236373200f01408746573743236373300f1140874657374" + "3236373400f21408746573743236373500f31408746573743236373600f41408746573743236373700f51408746573743236373800f6140874" + "6573743236373900f71408746573743236383000f81408746573743236383100f91408746573743236383200fa1408746573743236383300fb" + "1408746573743236383400fc1408746573743236383500fd1408746573743236383600fe1408746573743236383700ff140874657374323638" + "380080150874657374323638390081150874657374323639300082150874657374323639310083150874657374323639320084150874657374" + "323639330085150874657374323639340086150874657374323639350087150874657374323639360088150874657374323639370089150874" + "65737432363938008a15087465737432363939008b15087465737432373030008c15087465737432373031008d15087465737432373032008e" + "15087465737432373033008f150874657374323730340090150874657374323730350091150874657374323730360092150874657374323730" + "370093150874657374323730380094150874657374323730390095150874657374323731300096150874657374323731310097150874657374" + "32373132009815087465737432373133009915087465737432373134009a15087465737432373135009b15087465737432373136009c150874" + "65737432373137009d15087465737432373138009e15087465737432373139009f1508746573743237323000a01508746573743237323100a1" + "1508746573743237323200a21508746573743237323300a31508746573743237323400a41508746573743237323500a5150874657374323732" + "3600a61508746573743237323700a71508746573743237323800a81508746573743237323900a91508746573743237333000aa150874657374" + "3237333100ab1508746573743237333200ac1508746573743237333300ad1508746573743237333400ae1508746573743237333500af150874" + "6573743237333600b01508746573743237333700b11508746573743237333800b21508746573743237333900b31508746573743237343000b4" + "1508746573743237343100b51508746573743237343200b61508746573743237343300b71508746573743237343400b8150874657374323734" + "3500b91508746573743237343600ba1508746573743237343700bb1508746573743237343800bc1508746573743237343900bd150874657374" + "3237353000be1508746573743237353100bf1508746573743237353200c01508746573743237353300c11508746573743237353400c2150874" + "6573743237353500c31508746573743237353600c41508746573743237353700c51508746573743237353800c61508746573743237353900c7" + "1508746573743237363000c81508746573743237363100c91508746573743237363200ca1508746573743237363300cb150874657374323736" + "3400cc1508746573743237363500cd1508746573743237363600ce1508746573743237363700cf1508746573743237363800d0150874657374" + "3237363900d11508746573743237373000d21508746573743237373100d31508746573743237373200d41508746573743237373300d5150874" + "6573743237373400d61508746573743237373500d71508746573743237373600d81508746573743237373700d91508746573743237373800da" + "1508746573743237373900db1508746573743237383000dc1508746573743237383100dd1508746573743237383200de150874657374323738" + "3300df1508746573743237383400e01508746573743237383500e11508746573743237383600e21508746573743237383700e3150874657374" + "3237383800e41508746573743237383900e51508746573743237393000e61508746573743237393100e71508746573743237393200e8150874" + "6573743237393300e91508746573743237393400ea1508746573743237393500eb1508746573743237393600ec1508746573743237393700ed" + "1508746573743237393800ee1508746573743237393900ef1508746573743238303000f01508746573743238303100f1150874657374323830" + "3200f21508746573743238303300f31508746573743238303400f41508746573743238303500f51508746573743238303600f6150874657374" + "3238303700f71508746573743238303800f81508746573743238303900f91508746573743238313000fa1508746573743238313100fb150874" + "6573743238313200fc1508746573743238313300fd1508746573743238313400fe1508746573743238313500ff150874657374323831360080" + "160874657374323831370081160874657374323831380082160874657374323831390083160874657374323832300084160874657374323832" + "310085160874657374323832320086160874657374323832330087160874657374323832340088160874657374323832350089160874657374" + "32383236008a16087465737432383237008b16087465737432383238008c16087465737432383239008d16087465737432383330008e160874" + "65737432383331008f160874657374323833320090160874657374323833330091160874657374323833340092160874657374323833350093" + "160874657374323833360094160874657374323833370095160874657374323833380096160874657374323833390097160874657374323834" + "30009816087465737432383431009916087465737432383432009a16087465737432383433009b16087465737432383434009c160874657374" + "32383435009d16087465737432383436009e16087465737432383437009f1608746573743238343800a01608746573743238343900a1160874" + "6573743238353000a21608746573743238353100a31608746573743238353200a41608746573743238353300a51608746573743238353400a6" + "1608746573743238353500a71608746573743238353600a81608746573743238353700a91608746573743238353800aa160874657374323835" + "3900ab1608746573743238363000ac1608746573743238363100ad1608746573743238363200ae1608746573743238363300af160874657374" + "3238363400b01608746573743238363500b11608746573743238363600b21608746573743238363700b31608746573743238363800b4160874" + "6573743238363900b51608746573743238373000b61608746573743238373100b71608746573743238373200b81608746573743238373300b9" + "1608746573743238373400ba1608746573743238373500bb1608746573743238373600bc1608746573743238373700bd160874657374323837" + "3800be1608746573743238373900bf1608746573743238383000c01608746573743238383100c11608746573743238383200c2160874657374" + "3238383300c31608746573743238383400c41608746573743238383500c51608746573743238383600c61608746573743238383700c7160874" + "6573743238383800c81608746573743238383900c91608746573743238393000ca1608746573743238393100cb1608746573743238393200cc" + "1608746573743238393300cd1608746573743238393400ce1608746573743238393500cf1608746573743238393600d0160874657374323839" + "3700d11608746573743238393800d21608746573743238393900d31608746573743239303000d41608746573743239303100d5160874657374" + "3239303200d61608746573743239303300d71608746573743239303400d81608746573743239303500d91608746573743239303600da160874" + "6573743239303700db1608746573743239303800dc1608746573743239303900dd1608746573743239313000de1608746573743239313100df" + "1608746573743239313200e01608746573743239313300e11608746573743239313400e21608746573743239313500e3160874657374323931" + "3600e41608746573743239313700e51608746573743239313800e61608746573743239313900e71608746573743239323000e8160874657374" + "3239323100e91608746573743239323200ea1608746573743239323300eb1608746573743239323400ec1608746573743239323500ed160874" + "6573743239323600ee1608746573743239323700ef1608746573743239323800f01608746573743239323900f11608746573743239333000f2" + "1608746573743239333100f31608746573743239333200f41608746573743239333300f51608746573743239333400f6160874657374323933" + "3500f71608746573743239333600f81608746573743239333700f91608746573743239333800fa1608746573743239333900fb160874657374" + "3239343000fc1608746573743239343100fd1608746573743239343200fe1608746573743239343300ff160874657374323934340080170874" + "657374323934350081170874657374323934360082170874657374323934370083170874657374323934380084170874657374323934390085" + "170874657374323935300086170874657374323935310087170874657374323935320088170874657374323935330089170874657374323935" + "34008a17087465737432393535008b17087465737432393536008c17087465737432393537008d17087465737432393538008e170874657374" + "32393539008f170874657374323936300090170874657374323936310091170874657374323936320092170874657374323936330093170874" + "657374323936340094170874657374323936350095170874657374323936360096170874657374323936370097170874657374323936380098" + "17087465737432393639009917087465737432393730009a17087465737432393731009b17087465737432393732009c170874657374323937" + "33009d17087465737432393734009e17087465737432393735009f1708746573743239373600a01708746573743239373700a1170874657374" + "3239373800a21708746573743239373900a31708746573743239383000a41708746573743239383100a51708746573743239383200a6170874" + "6573743239383300a71708746573743239383400a81708746573743239383500a91708746573743239383600aa1708746573743239383700ab" + "1708746573743239383800ac1708746573743239383900ad1708746573743239393000ae1708746573743239393100af170874657374323939" + "3200b01708746573743239393300b11708746573743239393400b21708746573743239393500b31708746573743239393600b4170874657374" + "3239393700b51708746573743239393800b61708746573743239393900b71708746573743330303000b81708746573743330303100b9170874" + "6573743330303200ba1708746573743330303300bb1708746573743330303400bc1708746573743330303500bd1708746573743330303600be" + "1708746573743330303700bf1708746573743330303800c01708746573743330303900c11708746573743330313000c2170874657374333031" + "3100c31708746573743330313200c41708746573743330313300c51708746573743330313400c61708746573743330313500c7170874657374" + "3330313600c81708746573743330313700c91708746573743330313800ca1708746573743330313900cb1708746573743330323000cc170874" + "6573743330323100cd1708746573743330323200ce1708746573743330323300cf1708746573743330323400d01708746573743330323500d1" + "1708746573743330323600d21708746573743330323700d31708746573743330323800d41708746573743330323900d5170874657374333033" + "3000d61708746573743330333100d71708746573743330333200d81708746573743330333300d91708746573743330333400da170874657374" + "3330333500db1708746573743330333600dc1708746573743330333700dd1708746573743330333800de1708746573743330333900df170874" + "6573743330343000e01708746573743330343100e11708746573743330343200e21708746573743330343300e31708746573743330343400e4" + "1708746573743330343500e51708746573743330343600e61708746573743330343700e71708746573743330343800e8170874657374333034" + "3900e91708746573743330353000ea1708746573743330353100eb1708746573743330353200ec1708746573743330353300ed170874657374" + "3330353400ee1708746573743330353500ef1708746573743330353600f01708746573743330353700f11708746573743330353800f2170874" + "6573743330353900f31708746573743330363000f41708746573743330363100f51708746573743330363200f61708746573743330363300f7" + "1708746573743330363400f81708746573743330363500f91708746573743330363600fa1708746573743330363700fb170874657374333036" + "3800fc1708746573743330363900fd1708746573743330373000fe1708746573743330373100ff170874657374333037320080180874657374" + "333037330081180874657374333037340082180874657374333037350083180874657374333037360084180874657374333037370085180874" + "65737433303738008618087465737433303739008718087465737433303830008818087465737433303831008918087465737433303832008a" + "18087465737433303833008b18087465737433303834008c18087465737433303835008d18087465737433303836008e180874657374333038" + "37008f180874657374333038380090180874657374333038390091180874657374333039300092180874657374333039310093180874657374" + "333039320094180874657374333039330095180874657374333039340096180874657374333039350097180874657374333039360098180874" + "65737433303937009918087465737433303938009a18087465737433303939009b18087465737433313030009c18087465737433313031009d" + "18087465737433313032009e18087465737433313033009f1808746573743331303400a01808746573743331303500a1180874657374333130" + "3600a21808746573743331303700a31808746573743331303800a41808746573743331303900a51808746573743331313000a6180874657374" + "3331313100a71808746573743331313200a81808746573743331313300a91808746573743331313400aa1808746573743331313500ab180874" + "6573743331313600ac1808746573743331313700ad1808746573743331313800ae1808746573743331313900af1808746573743331323000b0" + "1808746573743331323100b11808746573743331323200b21808746573743331323300b31808746573743331323400b4180874657374333132" + "3500b51808746573743331323600b61808746573743331323700b71808746573743331323800b81808746573743331323900b9180874657374" + "3331333000ba1808746573743331333100bb1808746573743331333200bc1808746573743331333300bd1808746573743331333400be180874" + "6573743331333500bf1808746573743331333600c01808746573743331333700c11808746573743331333800c21808746573743331333900c3" + "1808746573743331343000c41808746573743331343100c51808746573743331343200c61808746573743331343300c7180874657374333134" + "3400c81808746573743331343500c91808746573743331343600ca1808746573743331343700cb1808746573743331343800cc180874657374" + "3331343900cd1808746573743331353000ce1808746573743331353100cf1808746573743331353200d01808746573743331353300d1180874" + "6573743331353400d21808746573743331353500d31808746573743331353600d41808746573743331353700d51808746573743331353800d6" + "1808746573743331353900d71808746573743331363000d81808746573743331363100d91808746573743331363200da180874657374333136" + "3300db1808746573743331363400dc1808746573743331363500dd1808746573743331363600de1808746573743331363700df180874657374" + "3331363800e01808746573743331363900e11808746573743331373000e21808746573743331373100e31808746573743331373200e4180874" + "6573743331373300e51808746573743331373400e61808746573743331373500e71808746573743331373600e81808746573743331373700e9" + "1808746573743331373800ea1808746573743331373900eb1808746573743331383000ec1808746573743331383100ed180874657374333138" + "3200ee1808746573743331383300ef1808746573743331383400f01808746573743331383500f11808746573743331383600f2180874657374" + "3331383700f31808746573743331383800f41808746573743331383900f51808746573743331393000f61808746573743331393100f7180874" + "6573743331393200f81808746573743331393300f91808746573743331393400fa1808746573743331393500fb1808746573743331393600fc" + "1808746573743331393700fd1808746573743331393800fe1808746573743331393900ff180874657374333230300080190874657374333230" + "310081190874657374333230320082190874657374333230330083190874657374333230340084190874657374333230350085190874657374" + "33323036008619087465737433323037008719087465737433323038008819087465737433323039008919087465737433323130008a190874" + "65737433323131008b19087465737433323132008c19087465737433323133008d19087465737433323134008e19087465737433323135008f" + "190874657374333231360090190874657374333231370091190874657374333231380092190874657374333231390093190874657374333232" + "300094190874657374333232310095190874657374333232320096190874657374333232330097190874657374333232340098190874657374" + "33323235009919087465737433323236009a19087465737433323237009b19087465737433323238009c19087465737433323239009d190874" + "65737433323330009e19087465737433323331009f1908746573743332333200a01908746573743332333300a11908746573743332333400a2" + "1908746573743332333500a31908746573743332333600a41908746573743332333700a51908746573743332333800a6190874657374333233" + "3900a71908746573743332343000a81908746573743332343100a91908746573743332343200aa1908746573743332343300ab190874657374" + "3332343400ac1908746573743332343500ad1908746573743332343600ae1908746573743332343700af1908746573743332343800b0190874" + "6573743332343900b11908746573743332353000b21908746573743332353100b31908746573743332353200b41908746573743332353300b5" + "1908746573743332353400b61908746573743332353500b71908746573743332353600b81908746573743332353700b9190874657374333235" + "3800ba1908746573743332353900bb1908746573743332363000bc1908746573743332363100bd1908746573743332363200be190874657374" + "3332363300bf1908746573743332363400c01908746573743332363500c11908746573743332363600c21908746573743332363700c3190874" + "6573743332363800c41908746573743332363900c51908746573743332373000c61908746573743332373100c71908746573743332373200c8" + "1908746573743332373300c91908746573743332373400ca1908746573743332373500cb1908746573743332373600cc190874657374333237" + "3700cd1908746573743332373800ce1908746573743332373900cf1908746573743332383000d01908746573743332383100d1190874657374" + "3332383200d21908746573743332383300d31908746573743332383400d41908746573743332383500d51908746573743332383600d6190874" + "6573743332383700d71908746573743332383800d81908746573743332383900d91908746573743332393000da1908746573743332393100db" + "1908746573743332393200dc1908746573743332393300dd1908746573743332393400de1908746573743332393500df190874657374333239" + "3600e01908746573743332393700e11908746573743332393800e21908746573743332393900e31908746573743333303000e4190874657374" + "3333303100e51908746573743333303200e61908746573743333303300e71908746573743333303400e81908746573743333303500e9190874" + "6573743333303600ea1908746573743333303700eb1908746573743333303800ec1908746573743333303900ed1908746573743333313000ee" + "1908746573743333313100ef1908746573743333313200f01908746573743333313300f11908746573743333313400f2190874657374333331" + "3500f31908746573743333313600f41908746573743333313700f51908746573743333313800f61908746573743333313900f7190874657374" + "3333323000f81908746573743333323100f91908746573743333323200fa1908746573743333323300fb1908746573743333323400fc190874" + "6573743333323500fd1908746573743333323600fe1908746573743333323700ff1908746573743333323800801a0874657374333332390081" + "1a08746573743333333000821a08746573743333333100831a08746573743333333200841a08746573743333333300851a0874657374333333" + "3400861a08746573743333333500871a08746573743333333600881a08746573743333333700891a087465737433333338008a1a0874657374" + "33333339008b1a087465737433333430008c1a087465737433333431008d1a087465737433333432008e1a087465737433333433008f1a0874" + "6573743333343400901a08746573743333343500911a08746573743333343600921a08746573743333343700931a0874657374333334380094" + "1a08746573743333343900951a08746573743333353000961a08746573743333353100971a08746573743333353200981a0874657374333335" + "3300991a087465737433333534009a1a087465737433333535009b1a087465737433333536009c1a087465737433333537009d1a0874657374" + "33333538009e1a087465737433333539009f1a08746573743333363000a01a08746573743333363100a11a08746573743333363200a21a0874" + "6573743333363300a31a08746573743333363400a41a08746573743333363500a51a08746573743333363600a61a08746573743333363700a7" + "1a08746573743333363800a81a08746573743333363900a91a08746573743333373000aa1a08746573743333373100ab1a0874657374333337" + "3200ac1a08746573743333373300ad1a08746573743333373400ae1a08746573743333373500af1a08746573743333373600b01a0874657374" + "3333373700b11a08746573743333373800b21a08746573743333373900b31a08746573743333383000b41a08746573743333383100b51a0874" + "6573743333383200b61a08746573743333383300b71a08746573743333383400b81a08746573743333383500b91a08746573743333383600ba" + "1a08746573743333383700bb1a08746573743333383800bc1a08746573743333383900bd1a08746573743333393000be1a0874657374333339" + "3100bf1a08746573743333393200c01a08746573743333393300c11a08746573743333393400c21a08746573743333393500c31a0874657374" + "3333393600c41a08746573743333393700c51a08746573743333393800c61a08746573743333393900c71a08746573743334303000c81a0874" + "6573743334303100c91a08746573743334303200ca1a08746573743334303300cb1a08746573743334303400cc1a08746573743334303500cd" + "1a08746573743334303600ce1a08746573743334303700cf1a08746573743334303800d01a08746573743334303900d11a0874657374333431" + "3000d21a08746573743334313100d31a08746573743334313200d41a08746573743334313300d51a08746573743334313400d61a0874657374" + "3334313500d71a08746573743334313600d81a08746573743334313700d91a08746573743334313800da1a08746573743334313900db1a0874" + "6573743334323000dc1a08746573743334323100dd1a08746573743334323200de1a08746573743334323300df1a08746573743334323400e0" + "1a08746573743334323500e11a08746573743334323600e21a08746573743334323700e31a08746573743334323800e41a0874657374333432" + "3900e51a08746573743334333000e61a08746573743334333100e71a08746573743334333200e81a08746573743334333300e91a0874657374" + "3334333400ea1a08746573743334333500eb1a08746573743334333600ec1a08746573743334333700ed1a08746573743334333800ee1a0874" + "6573743334333900ef1a08746573743334343000f01a08746573743334343100f11a08746573743334343200f21a08746573743334343300f3" + "1a08746573743334343400f41a08746573743334343500f51a08746573743334343600f61a08746573743334343700f71a0874657374333434" + "3800f81a08746573743334343900f91a08746573743334353000fa1a08746573743334353100fb1a08746573743334353200fc1a0874657374" + "3334353300fd1a08746573743334353400fe1a08746573743334353500ff1a08746573743334353600801b08746573743334353700811b0874" + "6573743334353800821b08746573743334353900831b08746573743334363000841b08746573743334363100851b0874657374333436320086" + "1b08746573743334363300871b08746573743334363400881b08746573743334363500891b087465737433343636008a1b0874657374333436" + "37008b1b087465737433343638008c1b087465737433343639008d1b087465737433343730008e1b087465737433343731008f1b0874657374" + "3334373200901b08746573743334373300911b08746573743334373400921b08746573743334373500931b08746573743334373600941b0874" + "6573743334373700951b08746573743334373800961b08746573743334373900971b08746573743334383000981b0874657374333438310099" + "1b087465737433343832009a1b087465737433343833009b1b087465737433343834009c1b087465737433343835009d1b0874657374333438" + "36009e1b087465737433343837009f1b08746573743334383800a01b08746573743334383900a11b08746573743334393000a21b0874657374" + "3334393100a31b08746573743334393200a41b08746573743334393300a51b08746573743334393400a61b08746573743334393500a71b0874" + "6573743334393600a81b08746573743334393700a91b08746573743334393800aa1b08746573743334393900ab1b08746573743335303000ac" + "1b08746573743335303100ad1b08746573743335303200ae1b08746573743335303300af1b08746573743335303400b01b0874657374333530" + "3500b11b08746573743335303600b21b08746573743335303700b31b08746573743335303800b41b08746573743335303900b51b0874657374" + "3335313000b61b08746573743335313100b71b08746573743335313200b81b08746573743335313300b91b08746573743335313400ba1b0874" + "6573743335313500bb1b08746573743335313600bc1b08746573743335313700bd1b08746573743335313800be1b08746573743335313900bf" + "1b08746573743335323000c01b08746573743335323100c11b08746573743335323200c21b08746573743335323300c31b0874657374333532" + "3400c41b08746573743335323500c51b08746573743335323600c61b08746573743335323700c71b08746573743335323800c81b0874657374" + "3335323900c91b08746573743335333000ca1b08746573743335333100cb1b08746573743335333200cc1b08746573743335333300cd1b0874" + "6573743335333400ce1b08746573743335333500cf1b08746573743335333600d01b08746573743335333700d11b08746573743335333800d2" + "1b08746573743335333900d31b08746573743335343000d41b08746573743335343100d51b08746573743335343200d61b0874657374333534" + "3300d71b08746573743335343400d81b08746573743335343500d91b08746573743335343600da1b08746573743335343700db1b0874657374" + "3335343800dc1b08746573743335343900dd1b08746573743335353000de1b08746573743335353100df1b08746573743335353200e01b0874" + "6573743335353300e11b08746573743335353400e21b08746573743335353500e31b08746573743335353600e41b08746573743335353700e5" + "1b08746573743335353800e61b08746573743335353900e71b08746573743335363000e81b08746573743335363100e91b0874657374333536" + "3200ea1b08746573743335363300eb1b08746573743335363400ec1b08746573743335363500ed1b08746573743335363600ee1b0874657374" + "3335363700ef1b08746573743335363800f01b08746573743335363900f11b08746573743335373000f21b08746573743335373100f31b0874" + "6573743335373200f41b08746573743335373300f51b08746573743335373400f61b08746573743335373500f71b08746573743335373600f8" + "1b08746573743335373700f91b08746573743335373800fa1b08746573743335373900fb1b08746573743335383000fc1b0874657374333538" + "3100fd1b08746573743335383200fe1b08746573743335383300ff1b08746573743335383400801c08746573743335383500811c0874657374" + "3335383600821c08746573743335383700831c08746573743335383800841c08746573743335383900851c08746573743335393000861c0874" + "6573743335393100871c08746573743335393200881c08746573743335393300891c087465737433353934008a1c087465737433353935008b" + "1c087465737433353936008c1c087465737433353937008d1c087465737433353938008e1c087465737433353939008f1c0874657374333630" + "3000901c08746573743336303100911c08746573743336303200921c08746573743336303300931c08746573743336303400941c0874657374" + "3336303500951c08746573743336303600961c08746573743336303700971c08746573743336303800981c08746573743336303900991c0874" + "65737433363130009a1c087465737433363131009b1c087465737433363132009c1c087465737433363133009d1c087465737433363134009e" + "1c087465737433363135009f1c08746573743336313600a01c08746573743336313700a11c08746573743336313800a21c0874657374333631" + "3900a31c08746573743336323000a41c08746573743336323100a51c08746573743336323200a61c08746573743336323300a71c0874657374" + "3336323400a81c08746573743336323500a91c08746573743336323600aa1c08746573743336323700ab1c08746573743336323800ac1c0874" + "6573743336323900ad1c08746573743336333000ae1c08746573743336333100af1c08746573743336333200b01c08746573743336333300b1" + "1c08746573743336333400b21c08746573743336333500b31c08746573743336333600b41c08746573743336333700b51c0874657374333633" + "3800b61c08746573743336333900b71c08746573743336343000b81c08746573743336343100b91c08746573743336343200ba1c0874657374" + "3336343300bb1c08746573743336343400bc1c08746573743336343500bd1c08746573743336343600be1c08746573743336343700bf1c0874" + "6573743336343800c01c08746573743336343900c11c08746573743336353000c21c08746573743336353100c31c08746573743336353200c4" + "1c08746573743336353300c51c08746573743336353400c61c08746573743336353500c71c08746573743336353600c81c0874657374333635" + "3700c91c08746573743336353800ca1c08746573743336353900cb1c08746573743336363000cc1c08746573743336363100cd1c0874657374" + "3336363200ce1c08746573743336363300cf1c08746573743336363400d01c08746573743336363500d11c08746573743336363600d21c0874" + "6573743336363700d31c08746573743336363800d41c08746573743336363900d51c08746573743336373000d61c08746573743336373100d7" + "1c08746573743336373200d81c08746573743336373300d91c08746573743336373400da1c08746573743336373500db1c0874657374333637" + "3600dc1c08746573743336373700dd1c08746573743336373800de1c08746573743336373900df1c08746573743336383000e01c0874657374" + "3336383100e11c08746573743336383200e21c08746573743336383300e31c08746573743336383400e41c08746573743336383500e51c0874" + "6573743336383600e61c08746573743336383700e71c08746573743336383800e81c08746573743336383900e91c08746573743336393000ea" + "1c08746573743336393100eb1c08746573743336393200ec1c08746573743336393300ed1c08746573743336393400ee1c0874657374333639" + "3500ef1c08746573743336393600f01c08746573743336393700f11c08746573743336393800f21c08746573743336393900f31c0874657374" + "3337303000f41c08746573743337303100f51c08746573743337303200f61c08746573743337303300f71c08746573743337303400f81c0874" + "6573743337303500f91c08746573743337303600fa1c08746573743337303700fb1c08746573743337303800fc1c08746573743337303900fd" + "1c08746573743337313000fe1c08746573743337313100ff1c08746573743337313200801d08746573743337313300811d0874657374333731" + "3400821d08746573743337313500831d08746573743337313600841d08746573743337313700851d08746573743337313800861d0874657374" + "3337313900871d08746573743337323000881d08746573743337323100891d087465737433373232008a1d087465737433373233008b1d0874" + "65737433373234008c1d087465737433373235008d1d087465737433373236008e1d087465737433373237008f1d0874657374333732380090" + "1d08746573743337323900911d08746573743337333000921d08746573743337333100931d08746573743337333200941d0874657374333733" + "3300951d08746573743337333400961d08746573743337333500971d08746573743337333600981d08746573743337333700991d0874657374" + "33373338009a1d087465737433373339009b1d087465737433373430009c1d087465737433373431009d1d087465737433373432009e1d0874" + "65737433373433009f1d08746573743337343400a01d08746573743337343500a11d08746573743337343600a21d08746573743337343700a3" + "1d08746573743337343800a41d08746573743337343900a51d08746573743337353000a61d08746573743337353100a71d0874657374333735" + "3200a81d08746573743337353300a91d08746573743337353400aa1d08746573743337353500ab1d08746573743337353600ac1d0874657374" + "3337353700ad1d08746573743337353800ae1d08746573743337353900af1d08746573743337363000b01d08746573743337363100b11d0874" + "6573743337363200b21d08746573743337363300b31d08746573743337363400b41d08746573743337363500b51d08746573743337363600b6" + "1d08746573743337363700b71d08746573743337363800b81d08746573743337363900b91d08746573743337373000ba1d0874657374333737" + "3100bb1d08746573743337373200bc1d08746573743337373300bd1d08746573743337373400be1d08746573743337373500bf1d0874657374" + "3337373600c01d08746573743337373700c11d08746573743337373800c21d08746573743337373900c31d08746573743337383000c41d0874" + "6573743337383100c51d08746573743337383200c61d08746573743337383300c71d08746573743337383400c81d08746573743337383500c9" + "1d08746573743337383600ca1d08746573743337383700cb1d08746573743337383800cc1d08746573743337383900cd1d0874657374333739" + "3000ce1d08746573743337393100cf1d08746573743337393200d01d08746573743337393300d11d08746573743337393400d21d0874657374" + "3337393500d31d08746573743337393600d41d08746573743337393700d51d08746573743337393800d61d08746573743337393900d71d0874" + "6573743338303000d81d08746573743338303100d91d08746573743338303200da1d08746573743338303300db1d08746573743338303400dc" + "1d08746573743338303500dd1d08746573743338303600de1d08746573743338303700df1d08746573743338303800e01d0874657374333830" + "3900e11d08746573743338313000e21d08746573743338313100e31d08746573743338313200e41d08746573743338313300e51d0874657374" + "3338313400e61d08746573743338313500e71d08746573743338313600e81d08746573743338313700e91d08746573743338313800ea1d0874" + "6573743338313900eb1d08746573743338323000ec1d08746573743338323100ed1d08746573743338323200ee1d08746573743338323300ef" + "1d08746573743338323400f01d08746573743338323500f11d08746573743338323600f21d08746573743338323700f31d0874657374333832" + "3800f41d08746573743338323900f51d08746573743338333000f61d08746573743338333100f71d08746573743338333200f81d0874657374" + "3338333300f91d08746573743338333400fa1d08746573743338333500fb1d08746573743338333600fc1d08746573743338333700fd1d0874" + "6573743338333800fe1d08746573743338333900ff1d08746573743338343000801e08746573743338343100811e0874657374333834320082" + "1e08746573743338343300831e08746573743338343400841e08746573743338343500851e08746573743338343600861e0874657374333834" + "3700871e08746573743338343800881e08746573743338343900891e087465737433383530008a1e087465737433383531008b1e0874657374" + "33383532008c1e087465737433383533008d1e087465737433383534008e1e087465737433383535008f1e08746573743338353600901e0874" + "6573743338353700911e08746573743338353800921e08746573743338353900931e08746573743338363000941e0874657374333836310095" + "1e08746573743338363200961e08746573743338363300971e08746573743338363400981e08746573743338363500991e0874657374333836" + "36009a1e087465737433383637009b1e087465737433383638009c1e087465737433383639009d1e087465737433383730009e1e0874657374" + "33383731009f1e08746573743338373200a01e08746573743338373300a11e08746573743338373400a21e08746573743338373500a31e0874" + "6573743338373600a41e08746573743338373700a51e08746573743338373800a61e08746573743338373900a71e08746573743338383000a8" + "1e08746573743338383100a91e08746573743338383200aa1e08746573743338383300ab1e08746573743338383400ac1e0874657374333838" + "3500ad1e08746573743338383600ae1e08746573743338383700af1e08746573743338383800b01e08746573743338383900b11e0874657374" + "3338393000b21e08746573743338393100b31e08746573743338393200b41e08746573743338393300b51e08746573743338393400b61e0874" + "6573743338393500b71e08746573743338393600b81e08746573743338393700b91e08746573743338393800ba1e08746573743338393900bb" + "1e08746573743339303000bc1e08746573743339303100bd1e08746573743339303200be1e08746573743339303300bf1e0874657374333930" + "3400c01e08746573743339303500c11e08746573743339303600c21e08746573743339303700c31e08746573743339303800c41e0874657374" + "3339303900c51e08746573743339313000c61e08746573743339313100c71e08746573743339313200c81e08746573743339313300c91e0874" + "6573743339313400ca1e08746573743339313500cb1e08746573743339313600cc1e08746573743339313700cd1e08746573743339313800ce" + "1e08746573743339313900cf1e08746573743339323000d01e08746573743339323100d11e08746573743339323200d21e0874657374333932" + "3300d31e08746573743339323400d41e08746573743339323500d51e08746573743339323600d61e08746573743339323700d71e0874657374" + "3339323800d81e08746573743339323900d91e08746573743339333000da1e08746573743339333100db1e08746573743339333200dc1e0874" + "6573743339333300dd1e08746573743339333400de1e08746573743339333500df1e08746573743339333600e01e08746573743339333700e1" + "1e08746573743339333800e21e08746573743339333900e31e08746573743339343000e41e08746573743339343100e51e0874657374333934" + "3200e61e08746573743339343300e71e08746573743339343400e81e08746573743339343500e91e08746573743339343600ea1e0874657374" + "3339343700eb1e08746573743339343800ec1e08746573743339343900ed1e08746573743339353000ee1e08746573743339353100ef1e0874" + "6573743339353200f01e08746573743339353300f11e08746573743339353400f21e08746573743339353500f31e08746573743339353600f4" + "1e08746573743339353700f51e08746573743339353800f61e08746573743339353900f71e08746573743339363000f81e0874657374333936" + "3100f91e08746573743339363200fa1e08746573743339363300fb1e08746573743339363400fc1e08746573743339363500fd1e0874657374" + "3339363600fe1e08746573743339363700ff1e08746573743339363800801f08746573743339363900811f08746573743339373000821f0874" + "6573743339373100831f08746573743339373200841f08746573743339373300851f08746573743339373400861f0874657374333937350087" + "1f08746573743339373600881f08746573743339373700891f087465737433393738008a1f087465737433393739008b1f0874657374333938" + "30008c1f087465737433393831008d1f087465737433393832008e1f087465737433393833008f1f08746573743339383400901f0874657374" + "3339383500911f08746573743339383600921f08746573743339383700931f08746573743339383800941f08746573743339383900951f0874" + "6573743339393000961f08746573743339393100971f08746573743339393200981f08746573743339393300991f087465737433393934009a" + "1f087465737433393935009b1f087465737433393936009c1f087465737433393937009d1f087465737433393938009e1f0874657374333939" + "39009f1f08746573743430303000a01f08746573743430303100a11f08746573743430303200a21f08746573743430303300a31f0874657374" + "3430303400a41f08746573743430303500a51f08746573743430303600a61f08746573743430303700a71f08746573743430303800a81f0874" + "6573743430303900a91f08746573743430313000aa1f08746573743430313100ab1f08746573743430313200ac1f08746573743430313300ad" + "1f08746573743430313400ae1f08746573743430313500af1f08746573743430313600b01f08746573743430313700b11f0874657374343031" + "3800b21f08746573743430313900b31f08746573743430323000b41f08746573743430323100b51f08746573743430323200b61f0874657374" + "3430323300b71f08746573743430323400b81f08746573743430323500b91f08746573743430323600ba1f08746573743430323700bb1f0874" + "6573743430323800bc1f08746573743430323900bd1f08746573743430333000be1f08746573743430333100bf1f08746573743430333200c0" + "1f08746573743430333300c11f08746573743430333400c21f08746573743430333500c31f08746573743430333600c41f0874657374343033" + "3700c51f08746573743430333800c61f08746573743430333900c71f08746573743430343000c81f08746573743430343100c91f0874657374" + "3430343200ca1f08746573743430343300cb1f08746573743430343400cc1f08746573743430343500cd1f08746573743430343600ce1f0874" + "6573743430343700cf1f08746573743430343800d01f08746573743430343900d11f08746573743430353000d21f08746573743430353100d3" + "1f08746573743430353200d41f08746573743430353300d51f08746573743430353400d61f08746573743430353500d71f0874657374343035" + "3600d81f08746573743430353700d91f08746573743430353800da1f08746573743430353900db1f08746573743430363000dc1f0874657374" + "3430363100dd1f08746573743430363200de1f08746573743430363300df1f08746573743430363400e01f08746573743430363500e11f0874" + "6573743430363600e21f08746573743430363700e31f08746573743430363800e41f08746573743430363900e51f08746573743430373000e6" + "1f08746573743430373100e71f08746573743430373200e81f08746573743430373300e91f08746573743430373400ea1f0874657374343037" + "3500eb1f08746573743430373600ec1f08746573743430373700ed1f08746573743430373800ee1f08746573743430373900ef1f0874657374" + "3430383000f01f08746573743430383100f11f08746573743430383200f21f08746573743430383300f31f08746573743430383400f41f0874" + "6573743430383500f51f08746573743430383600f61f08746573743430383700f71f08746573743430383800f81f08746573743430383900f9" + "1f08746573743430393000fa1f08746573743430393100fb1f08746573743430393200fc1f08746573743430393300fd1f0874657374343039" + "3400fe1f08746573743430393500ff1f0874657374343039360080200874657374343039370081200874657374343039380082200874657374" + "343039390083200874657374343130300084200874657374343130310085200874657374343130320086200874657374343130330087200874" + "65737434313034008820087465737434313035008920087465737434313036008a20087465737434313037008b20087465737434313038008c" + "20087465737434313039008d20087465737434313130008e20087465737434313131008f200874657374343131320090200874657374343131" + "330091200874657374343131340092200874657374343131350093200874657374343131360094200874657374343131370095200874657374" + "34313138009620087465737434313139009720087465737434313230009820087465737434313231009920087465737434313232009a200874" + "65737434313233009b20087465737434313234009c20087465737434313235009d20087465737434313236009e20087465737434313237009f" + "2008746573743431323800a02008746573743431323900a12008746573743431333000a22008746573743431333100a3200874657374343133" + "3200a42008746573743431333300a52008746573743431333400a62008746573743431333500a72008746573743431333600a8200874657374" + "3431333700a92008746573743431333800aa2008746573743431333900ab2008746573743431343000ac2008746573743431343100ad200874" + "6573743431343200ae2008746573743431343300af2008746573743431343400b02008746573743431343500b12008746573743431343600b2" + "2008746573743431343700b32008746573743431343800b42008746573743431343900b52008746573743431353000b6200874657374343135" + "3100b72008746573743431353200b82008746573743431353300b92008746573743431353400ba2008746573743431353500bb200874657374" + "3431353600bc2008746573743431353700bd2008746573743431353800be2008746573743431353900bf2008746573743431363000c0200874" + "6573743431363100c12008746573743431363200c22008746573743431363300c32008746573743431363400c42008746573743431363500c5" + "2008746573743431363600c62008746573743431363700c72008746573743431363800c82008746573743431363900c9200874657374343137" + "3000ca2008746573743431373100cb2008746573743431373200cc2008746573743431373300cd2008746573743431373400ce200874657374" + "3431373500cf2008746573743431373600d02008746573743431373700d12008746573743431373800d22008746573743431373900d3200874" + "6573743431383000d42008746573743431383100d52008746573743431383200d62008746573743431383300d72008746573743431383400d8" + "2008746573743431383500d92008746573743431383600da2008746573743431383700db2008746573743431383800dc200874657374343138" + "3900dd2008746573743431393000de2008746573743431393100df2008746573743431393200e02008746573743431393300e1200874657374" + "3431393400e22008746573743431393500e32008746573743431393600e42008746573743431393700e52008746573743431393800e6200874" + "6573743431393900e72008746573743432303000e82008746573743432303100e92008746573743432303200ea2008746573743432303300eb" + "2008746573743432303400ec2008746573743432303500ed2008746573743432303600ee2008746573743432303700ef200874657374343230" + "3800f02008746573743432303900f12008746573743432313000f22008746573743432313100f32008746573743432313200f4200874657374" + "3432313300f52008746573743432313400f62008746573743432313500f72008746573743432313600f82008746573743432313700f9200874" + "6573743432313800fa2008746573743432313900fb2008746573743432323000fc2008746573743432323100fd2008746573743432323200fe" + "2008746573743432323300ff200874657374343232340080210874657374343232350081210874657374343232360082210874657374343232" + "370083210874657374343232380084210874657374343232390085210874657374343233300086210874657374343233310087210874657374" + "34323332008821087465737434323333008921087465737434323334008a21087465737434323335008b21087465737434323336008c210874" + "65737434323337008d21087465737434323338008e21087465737434323339008f210874657374343234300090210874657374343234310091" + "210874657374343234320092210874657374343234330093210874657374343234340094210874657374343234350095210874657374343234" + "36009621087465737434323437009721087465737434323438009821087465737434323439009921087465737434323530009a210874657374" + "34323531009b21087465737434323532009c21087465737434323533009d21087465737434323534009e21087465737434323535009f210874" + "6573743432353600a02108746573743432353700a12108746573743432353800a22108746573743432353900a32108746573743432363000a4" + "2108746573743432363100a52108746573743432363200a62108746573743432363300a72108746573743432363400a8210874657374343236" + "3500a92108746573743432363600aa2108746573743432363700ab2108746573743432363800ac2108746573743432363900ad210874657374" + "3432373000ae2108746573743432373100af2108746573743432373200b02108746573743432373300b12108746573743432373400b2210874" + "6573743432373500b32108746573743432373600b42108746573743432373700b52108746573743432373800b62108746573743432373900b7" + "2108746573743432383000b82108746573743432383100b92108746573743432383200ba2108746573743432383300bb210874657374343238" + "3400bc2108746573743432383500bd2108746573743432383600be2108746573743432383700bf2108746573743432383800c0210874657374" + "3432383900c12108746573743432393000c22108746573743432393100c32108746573743432393200c42108746573743432393300c5210874" + "6573743432393400c62108746573743432393500c72108746573743432393600c82108746573743432393700c92108746573743432393800ca" + "2108746573743432393900cb2108746573743433303000cc2108746573743433303100cd2108746573743433303200ce210874657374343330" + "3300cf2108746573743433303400d02108746573743433303500d12108746573743433303600d22108746573743433303700d3210874657374" + "3433303800d42108746573743433303900d52108746573743433313000d62108746573743433313100d72108746573743433313200d8210874" + "6573743433313300d92108746573743433313400da2108746573743433313500db2108746573743433313600dc2108746573743433313700dd" + "2108746573743433313800de2108746573743433313900df2108746573743433323000e02108746573743433323100e1210874657374343332" + "3200e22108746573743433323300e32108746573743433323400e42108746573743433323500e52108746573743433323600e6210874657374" + "3433323700e72108746573743433323800e82108746573743433323900e92108746573743433333000ea2108746573743433333100eb210874" + "6573743433333200ec2108746573743433333300ed2108746573743433333400ee2108746573743433333500ef2108746573743433333600f0" + "2108746573743433333700f12108746573743433333800f22108746573743433333900f32108746573743433343000f4210874657374343334" + "3100f52108746573743433343200f62108746573743433343300f72108746573743433343400f82108746573743433343500f9210874657374" + "3433343600fa2108746573743433343700fb2108746573743433343800fc2108746573743433343900fd2108746573743433353000fe210874" + "6573743433353100ff210874657374343335320080220874657374343335330081220874657374343335340082220874657374343335350083" + "220874657374343335360084220874657374343335370085220874657374343335380086220874657374343335390087220874657374343336" + "30008822087465737434333631008922087465737434333632008a22087465737434333633008b22087465737434333634008c220874657374" + "34333635008d22087465737434333636008e22087465737434333637008f220874657374343336380090220874657374343336390091220874" + "657374343337300092220874657374343337310093220874657374343337320094220874657374343337330095220874657374343337340096" + "22087465737434333735009722087465737434333736009822087465737434333737009922087465737434333738009a220874657374343337" + "39009b22087465737434333830009c22087465737434333831009d22087465737434333832009e22087465737434333833009f220874657374" + "3433383400a02208746573743433383500a12208746573743433383600a22208746573743433383700a32208746573743433383800a4220874" + "6573743433383900a52208746573743433393000a62208746573743433393100a72208746573743433393200a82208746573743433393300a9" + "2208746573743433393400aa2208746573743433393500ab2208746573743433393600ac2208746573743433393700ad220874657374343339" + "3800ae2208746573743433393900af2208746573743434303000b02208746573743434303100b12208746573743434303200b2220874657374" + "3434303300b32208746573743434303400b42208746573743434303500b52208746573743434303600b62208746573743434303700b7220874" + "6573743434303800b82208746573743434303900b92208746573743434313000ba2208746573743434313100bb2208746573743434313200bc" + "2208746573743434313300bd2208746573743434313400be2208746573743434313500bf2208746573743434313600c0220874657374343431" + "3700c12208746573743434313800c22208746573743434313900c32208746573743434323000c42208746573743434323100c5220874657374" + "3434323200c62208746573743434323300c72208746573743434323400c82208746573743434323500c92208746573743434323600ca220874" + "6573743434323700cb2208746573743434323800cc2208746573743434323900cd2208746573743434333000ce2208746573743434333100cf" + "2208746573743434333200d02208746573743434333300d12208746573743434333400d22208746573743434333500d3220874657374343433" + "3600d42208746573743434333700d52208746573743434333800d62208746573743434333900d72208746573743434343000d8220874657374" + "3434343100d92208746573743434343200da2208746573743434343300db2208746573743434343400dc2208746573743434343500dd220874" + "6573743434343600de2208746573743434343700df2208746573743434343800e02208746573743434343900e12208746573743434353000e2" + "2208746573743434353100e32208746573743434353200e42208746573743434353300e52208746573743434353400e6220874657374343435" + "3500e72208746573743434353600e82208746573743434353700e92208746573743434353800ea2208746573743434353900eb220874657374" + "3434363000ec2208746573743434363100ed2208746573743434363200ee2208746573743434363300ef2208746573743434363400f0220874" + "6573743434363500f12208746573743434363600f22208746573743434363700f32208746573743434363800f42208746573743434363900f5" + "2208746573743434373000f62208746573743434373100f72208746573743434373200f82208746573743434373300f9220874657374343437" + "3400fa2208746573743434373500fb2208746573743434373600fc2208746573743434373700fd2208746573743434373800fe220874657374" + "3434373900ff220874657374343438300080230874657374343438310081230874657374343438320082230874657374343438330083230874" + "657374343438340084230874657374343438350085230874657374343438360086230874657374343438370087230874657374343438380088" + "23087465737434343839008923087465737434343930008a23087465737434343931008b23087465737434343932008c230874657374343439" + "33008d23087465737434343934008e23087465737434343935008f230874657374343439360090230874657374343439370091230874657374" + "343439380092230874657374343439390093230874657374343530300094230874657374343530310095230874657374343530320096230874" + "65737434353033009723087465737434353034009823087465737434353035009923087465737434353036009a23087465737434353037009b" + "23087465737434353038009c23087465737434353039009d23087465737434353130009e23087465737434353131009f230874657374343531" + "3200a02308746573743435313300a12308746573743435313400a22308746573743435313500a32308746573743435313600a4230874657374" + "3435313700a52308746573743435313800a62308746573743435313900a72308746573743435323000a82308746573743435323100a9230874" + "6573743435323200aa2308746573743435323300ab2308746573743435323400ac2308746573743435323500ad2308746573743435323600ae" + "2308746573743435323700af2308746573743435323800b02308746573743435323900b12308746573743435333000b2230874657374343533" + "3100b32308746573743435333200b42308746573743435333300b52308746573743435333400b62308746573743435333500b7230874657374" + "3435333600b82308746573743435333700b92308746573743435333800ba2308746573743435333900bb2308746573743435343000bc230874" + "6573743435343100bd2308746573743435343200be2308746573743435343300bf2308746573743435343400c02308746573743435343500c1" + "2308746573743435343600c22308746573743435343700c32308746573743435343800c42308746573743435343900c5230874657374343535" + "3000c62308746573743435353100c72308746573743435353200c82308746573743435353300c92308746573743435353400ca230874657374" + "3435353500cb2308746573743435353600cc2308746573743435353700cd2308746573743435353800ce2308746573743435353900cf230874" + "6573743435363000d02308746573743435363100d12308746573743435363200d22308746573743435363300d32308746573743435363400d4" + "2308746573743435363500d52308746573743435363600d62308746573743435363700d72308746573743435363800d8230874657374343536" + "3900d92308746573743435373000da2308746573743435373100db2308746573743435373200dc2308746573743435373300dd230874657374" + "3435373400de2308746573743435373500df2308746573743435373600e02308746573743435373700e12308746573743435373800e2230874" + "6573743435373900e32308746573743435383000e42308746573743435383100e52308746573743435383200e62308746573743435383300e7" + "2308746573743435383400e82308746573743435383500e92308746573743435383600ea2308746573743435383700eb230874657374343538" + "3800ec2308746573743435383900ed2308746573743435393000ee2308746573743435393100ef2308746573743435393200f0230874657374" + "3435393300f12308746573743435393400f22308746573743435393500f32308746573743435393600f42308746573743435393700f5230874" + "6573743435393800f62308746573743435393900f72308746573743436303000f82308746573743436303100f92308746573743436303200fa" + "2308746573743436303300fb2308746573743436303400fc2308746573743436303500fd2308746573743436303600fe230874657374343630" + "3700ff230874657374343630380080240874657374343630390081240874657374343631300082240874657374343631310083240874657374" + "343631320084240874657374343631330085240874657374343631340086240874657374343631350087240874657374343631360088240874" + "65737434363137008924087465737434363138008a24087465737434363139008b24087465737434363230008c24087465737434363231008d" + "24087465737434363232008e24087465737434363233008f240874657374343632340090240874657374343632350091240874657374343632" + "360092240874657374343632370093240874657374343632380094240874657374343632390095240874657374343633300096240874657374" + "34363331009724087465737434363332009824087465737434363333009924087465737434363334009a24087465737434363335009b240874" + "65737434363336009c24087465737434363337009d24087465737434363338009e24087465737434363339009f2408746573743436343000a0" + "2408746573743436343100a12408746573743436343200a22408746573743436343300a32408746573743436343400a4240874657374343634" + "3500a52408746573743436343600a62408746573743436343700a72408746573743436343800a82408746573743436343900a9240874657374" + "3436353000aa2408746573743436353100ab2408746573743436353200ac2408746573743436353300ad2408746573743436353400ae240874" + "6573743436353500af2408746573743436353600b02408746573743436353700b12408746573743436353800b22408746573743436353900b3" + "2408746573743436363000b42408746573743436363100b52408746573743436363200b62408746573743436363300b7240874657374343636" + "3400b82408746573743436363500b92408746573743436363600ba2408746573743436363700bb2408746573743436363800bc240874657374" + "3436363900bd2408746573743436373000be2408746573743436373100bf2408746573743436373200c02408746573743436373300c1240874" + "6573743436373400c22408746573743436373500c32408746573743436373600c42408746573743436373700c52408746573743436373800c6" + "2408746573743436373900c72408746573743436383000c82408746573743436383100c92408746573743436383200ca240874657374343638" + "3300cb2408746573743436383400cc2408746573743436383500cd2408746573743436383600ce2408746573743436383700cf240874657374" + "3436383800d02408746573743436383900d12408746573743436393000d22408746573743436393100d32408746573743436393200d4240874" + "6573743436393300d52408746573743436393400d62408746573743436393500d72408746573743436393600d82408746573743436393700d9" + "2408746573743436393800da2408746573743436393900db2408746573743437303000dc2408746573743437303100dd240874657374343730" + "3200de2408746573743437303300df2408746573743437303400e02408746573743437303500e12408746573743437303600e2240874657374" + "3437303700e32408746573743437303800e42408746573743437303900e52408746573743437313000e62408746573743437313100e7240874" + "6573743437313200e82408746573743437313300e92408746573743437313400ea2408746573743437313500eb2408746573743437313600ec" + "2408746573743437313700ed2408746573743437313800ee2408746573743437313900ef2408746573743437323000f0240874657374343732" + "3100f12408746573743437323200f22408746573743437323300f32408746573743437323400f42408746573743437323500f5240874657374" + "3437323600f62408746573743437323700f72408746573743437323800f82408746573743437323900f92408746573743437333000fa240874" + "6573743437333100fb2408746573743437333200fc2408746573743437333300fd2408746573743437333400fe2408746573743437333500ff" + "240874657374343733360080250874657374343733370081250874657374343733380082250874657374343733390083250874657374343734" + "300084250874657374343734310085250874657374343734320086250874657374343734330087250874657374343734340088250874657374" + "34373435008925087465737434373436008a25087465737434373437008b25087465737434373438008c25087465737434373439008d250874" + "65737434373530008e25087465737434373531008f250874657374343735320090250874657374343735330091250874657374343735340092" + "250874657374343735350093250874657374343735360094250874657374343735370095250874657374343735380096250874657374343735" + "39009725087465737434373630009825087465737434373631009925087465737434373632009a25087465737434373633009b250874657374" + "34373634009c25087465737434373635009d25087465737434373636009e25087465737434373637009f2508746573743437363800a0250874" + "6573743437363900a12508746573743437373000a22508746573743437373100a32508746573743437373200a42508746573743437373300a5" + "2508746573743437373400a62508746573743437373500a72508746573743437373600a82508746573743437373700a9250874657374343737" + "3800aa2508746573743437373900ab2508746573743437383000ac2508746573743437383100ad2508746573743437383200ae250874657374" + "3437383300af2508746573743437383400b02508746573743437383500b12508746573743437383600b22508746573743437383700b3250874" + "6573743437383800b42508746573743437383900b52508746573743437393000b62508746573743437393100b72508746573743437393200b8" + "2508746573743437393300b92508746573743437393400ba2508746573743437393500bb2508746573743437393600bc250874657374343739" + "3700bd2508746573743437393800be2508746573743437393900bf2508746573743438303000c02508746573743438303100c1250874657374" + "3438303200c22508746573743438303300c32508746573743438303400c42508746573743438303500c52508746573743438303600c6250874" + "6573743438303700c72508746573743438303800c82508746573743438303900c92508746573743438313000ca2508746573743438313100cb" + "2508746573743438313200cc2508746573743438313300cd2508746573743438313400ce2508746573743438313500cf250874657374343831" + "3600d02508746573743438313700d12508746573743438313800d22508746573743438313900d32508746573743438323000d4250874657374" + "3438323100d52508746573743438323200d62508746573743438323300d72508746573743438323400d82508746573743438323500d9250874" + "6573743438323600da2508746573743438323700db2508746573743438323800dc2508746573743438323900dd2508746573743438333000de" + "2508746573743438333100df2508746573743438333200e02508746573743438333300e12508746573743438333400e2250874657374343833" + "3500e32508746573743438333600e42508746573743438333700e52508746573743438333800e62508746573743438333900e7250874657374" + "3438343000e82508746573743438343100e92508746573743438343200ea2508746573743438343300eb2508746573743438343400ec250874" + "6573743438343500ed2508746573743438343600ee2508746573743438343700ef2508746573743438343800f02508746573743438343900f1" + "2508746573743438353000f22508746573743438353100f32508746573743438353200f42508746573743438353300f5250874657374343835" + "3400f62508746573743438353500f72508746573743438353600f82508746573743438353700f92508746573743438353800fa250874657374" + "3438353900fb2508746573743438363000fc2508746573743438363100fd2508746573743438363200fe2508746573743438363300ff250874" + "657374343836340080260874657374343836350081260874657374343836360082260874657374343836370083260874657374343836380084" + "260874657374343836390085260874657374343837300086260874657374343837310087260874657374343837320088260874657374343837" + "33008926087465737434383734008a26087465737434383735008b26087465737434383736008c26087465737434383737008d260874657374" + "34383738008e26087465737434383739008f260874657374343838300090260874657374343838310091260874657374343838320092260874" + "657374343838330093260874657374343838340094260874657374343838350095260874657374343838360096260874657374343838370097" + "26087465737434383838009826087465737434383839009926087465737434383930009a26087465737434383931009b260874657374343839" + "32009c26087465737434383933009d26087465737434383934009e26087465737434383935009f2608746573743438393600a0260874657374" + "3438393700a12608746573743438393800a22608746573743438393900a32608746573743439303000a42608746573743439303100a5260874" + "6573743439303200a62608746573743439303300a72608746573743439303400a82608746573743439303500a92608746573743439303600aa" + "2608746573743439303700ab2608746573743439303800ac2608746573743439303900ad2608746573743439313000ae260874657374343931" + "3100af2608746573743439313200b02608746573743439313300b12608746573743439313400b22608746573743439313500b3260874657374" + "3439313600b42608746573743439313700b52608746573743439313800b62608746573743439313900b72608746573743439323000b8260874" + "6573743439323100b92608746573743439323200ba2608746573743439323300bb2608746573743439323400bc2608746573743439323500bd" + "2608746573743439323600be2608746573743439323700bf2608746573743439323800c02608746573743439323900c1260874657374343933" + "3000c22608746573743439333100c32608746573743439333200c42608746573743439333300c52608746573743439333400c6260874657374" + "3439333500c72608746573743439333600c82608746573743439333700c92608746573743439333800ca2608746573743439333900cb260874" + "6573743439343000cc2608746573743439343100cd2608746573743439343200ce2608746573743439343300cf2608746573743439343400d0" + "2608746573743439343500d12608746573743439343600d22608746573743439343700d32608746573743439343800d4260874657374343934" + "3900d52608746573743439353000d62608746573743439353100d72608746573743439353200d82608746573743439353300d9260874657374" + "3439353400da2608746573743439353500db2608746573743439353600dc2608746573743439353700dd2608746573743439353800de260874" + "6573743439353900df2608746573743439363000e02608746573743439363100e12608746573743439363200e22608746573743439363300e3" + "2608746573743439363400e42608746573743439363500e52608746573743439363600e62608746573743439363700e7260874657374343936" + "3800e82608746573743439363900e92608746573743439373000ea2608746573743439373100eb2608746573743439373200ec260874657374" + "3439373300ed2608746573743439373400ee2608746573743439373500ef2608746573743439373600f02608746573743439373700f1260874" + "6573743439373800f22608746573743439373900f32608746573743439383000f42608746573743439383100f52608746573743439383200f6" + "2608746573743439383300f72608746573743439383400f82608746573743439383500f92608746573743439383600fa260874657374343938" + "3700fb2608746573743439383800fc2608746573743439383900fd2608746573743439393000fe2608746573743439393100ff260874657374" + "343939320080270874657374343939330081270874657374343939340082270874657374343939350083270874657374343939360084270874" + "657374343939370085270874657374343939380086270874657374343939390087270ac2b80288270700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 12f7b2ee6c8..b453446a4cd 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -85,3 +85,8 @@ extern std::string const startLoopHex; extern std::string const badAllocHex; extern std::string const badAlignWasmHex; + +extern std::string const thousandParamsHex; +extern std::string const thousand1ParamsHex; +extern std::string const locals10kHex; +extern std::string const functions5kHex; diff --git a/src/test/app/wasm_fixtures/thousand1_params.c b/src/test/app/wasm_fixtures/thousand1_params.c new file mode 100644 index 00000000000..1a281461c4c --- /dev/null +++ b/src/test/app/wasm_fixtures/thousand1_params.c @@ -0,0 +1,264 @@ +// clang-format off + +#include + +int32_t test( + int32_t p0, int32_t p1, int32_t p2, int32_t p3, int32_t p4, int32_t p5, int32_t p6, int32_t p7 +, int32_t p8, int32_t p9, int32_t p10, int32_t p11, int32_t p12, int32_t p13, int32_t p14, int32_t p15 +, int32_t p16, int32_t p17, int32_t p18, int32_t p19, int32_t p20, int32_t p21, int32_t p22, int32_t p23 +, int32_t p24, int32_t p25, int32_t p26, int32_t p27, int32_t p28, int32_t p29, int32_t p30, int32_t p31 +, int32_t p32, int32_t p33, int32_t p34, int32_t p35, int32_t p36, int32_t p37, int32_t p38, int32_t p39 +, int32_t p40, int32_t p41, int32_t p42, int32_t p43, int32_t p44, int32_t p45, int32_t p46, int32_t p47 +, int32_t p48, int32_t p49, int32_t p50, int32_t p51, int32_t p52, int32_t p53, int32_t p54, int32_t p55 +, int32_t p56, int32_t p57, int32_t p58, int32_t p59, int32_t p60, int32_t p61, int32_t p62, int32_t p63 +, int32_t p64, int32_t p65, int32_t p66, int32_t p67, int32_t p68, int32_t p69, int32_t p70, int32_t p71 +, int32_t p72, int32_t p73, int32_t p74, int32_t p75, int32_t p76, int32_t p77, int32_t p78, int32_t p79 +, int32_t p80, int32_t p81, int32_t p82, int32_t p83, int32_t p84, int32_t p85, int32_t p86, int32_t p87 +, int32_t p88, int32_t p89, int32_t p90, int32_t p91, int32_t p92, int32_t p93, int32_t p94, int32_t p95 +, int32_t p96, int32_t p97, int32_t p98, int32_t p99, int32_t p100, int32_t p101, int32_t p102, int32_t p103 +, int32_t p104, int32_t p105, int32_t p106, int32_t p107, int32_t p108, int32_t p109, int32_t p110, int32_t p111 +, int32_t p112, int32_t p113, int32_t p114, int32_t p115, int32_t p116, int32_t p117, int32_t p118, int32_t p119 +, int32_t p120, int32_t p121, int32_t p122, int32_t p123, int32_t p124, int32_t p125, int32_t p126, int32_t p127 +, int32_t p128, int32_t p129, int32_t p130, int32_t p131, int32_t p132, int32_t p133, int32_t p134, int32_t p135 +, int32_t p136, int32_t p137, int32_t p138, int32_t p139, int32_t p140, int32_t p141, int32_t p142, int32_t p143 +, int32_t p144, int32_t p145, int32_t p146, int32_t p147, int32_t p148, int32_t p149, int32_t p150, int32_t p151 +, int32_t p152, int32_t p153, int32_t p154, int32_t p155, int32_t p156, int32_t p157, int32_t p158, int32_t p159 +, int32_t p160, int32_t p161, int32_t p162, int32_t p163, int32_t p164, int32_t p165, int32_t p166, int32_t p167 +, int32_t p168, int32_t p169, int32_t p170, int32_t p171, int32_t p172, int32_t p173, int32_t p174, int32_t p175 +, int32_t p176, int32_t p177, int32_t p178, int32_t p179, int32_t p180, int32_t p181, int32_t p182, int32_t p183 +, int32_t p184, int32_t p185, int32_t p186, int32_t p187, int32_t p188, int32_t p189, int32_t p190, int32_t p191 +, int32_t p192, int32_t p193, int32_t p194, int32_t p195, int32_t p196, int32_t p197, int32_t p198, int32_t p199 +, int32_t p200, int32_t p201, int32_t p202, int32_t p203, int32_t p204, int32_t p205, int32_t p206, int32_t p207 +, int32_t p208, int32_t p209, int32_t p210, int32_t p211, int32_t p212, int32_t p213, int32_t p214, int32_t p215 +, int32_t p216, int32_t p217, int32_t p218, int32_t p219, int32_t p220, int32_t p221, int32_t p222, int32_t p223 +, int32_t p224, int32_t p225, int32_t p226, int32_t p227, int32_t p228, int32_t p229, int32_t p230, int32_t p231 +, int32_t p232, int32_t p233, int32_t p234, int32_t p235, int32_t p236, int32_t p237, int32_t p238, int32_t p239 +, int32_t p240, int32_t p241, int32_t p242, int32_t p243, int32_t p244, int32_t p245, int32_t p246, int32_t p247 +, int32_t p248, int32_t p249, int32_t p250, int32_t p251, int32_t p252, int32_t p253, int32_t p254, int32_t p255 +, int32_t p256, int32_t p257, int32_t p258, int32_t p259, int32_t p260, int32_t p261, int32_t p262, int32_t p263 +, int32_t p264, int32_t p265, int32_t p266, int32_t p267, int32_t p268, int32_t p269, int32_t p270, int32_t p271 +, int32_t p272, int32_t p273, int32_t p274, int32_t p275, int32_t p276, int32_t p277, int32_t p278, int32_t p279 +, int32_t p280, int32_t p281, int32_t p282, int32_t p283, int32_t p284, int32_t p285, int32_t p286, int32_t p287 +, int32_t p288, int32_t p289, int32_t p290, int32_t p291, int32_t p292, int32_t p293, int32_t p294, int32_t p295 +, int32_t p296, int32_t p297, int32_t p298, int32_t p299, int32_t p300, int32_t p301, int32_t p302, int32_t p303 +, int32_t p304, int32_t p305, int32_t p306, int32_t p307, int32_t p308, int32_t p309, int32_t p310, int32_t p311 +, int32_t p312, int32_t p313, int32_t p314, int32_t p315, int32_t p316, int32_t p317, int32_t p318, int32_t p319 +, int32_t p320, int32_t p321, int32_t p322, int32_t p323, int32_t p324, int32_t p325, int32_t p326, int32_t p327 +, int32_t p328, int32_t p329, int32_t p330, int32_t p331, int32_t p332, int32_t p333, int32_t p334, int32_t p335 +, int32_t p336, int32_t p337, int32_t p338, int32_t p339, int32_t p340, int32_t p341, int32_t p342, int32_t p343 +, int32_t p344, int32_t p345, int32_t p346, int32_t p347, int32_t p348, int32_t p349, int32_t p350, int32_t p351 +, int32_t p352, int32_t p353, int32_t p354, int32_t p355, int32_t p356, int32_t p357, int32_t p358, int32_t p359 +, int32_t p360, int32_t p361, int32_t p362, int32_t p363, int32_t p364, int32_t p365, int32_t p366, int32_t p367 +, int32_t p368, int32_t p369, int32_t p370, int32_t p371, int32_t p372, int32_t p373, int32_t p374, int32_t p375 +, int32_t p376, int32_t p377, int32_t p378, int32_t p379, int32_t p380, int32_t p381, int32_t p382, int32_t p383 +, int32_t p384, int32_t p385, int32_t p386, int32_t p387, int32_t p388, int32_t p389, int32_t p390, int32_t p391 +, int32_t p392, int32_t p393, int32_t p394, int32_t p395, int32_t p396, int32_t p397, int32_t p398, int32_t p399 +, int32_t p400, int32_t p401, int32_t p402, int32_t p403, int32_t p404, int32_t p405, int32_t p406, int32_t p407 +, int32_t p408, int32_t p409, int32_t p410, int32_t p411, int32_t p412, int32_t p413, int32_t p414, int32_t p415 +, int32_t p416, int32_t p417, int32_t p418, int32_t p419, int32_t p420, int32_t p421, int32_t p422, int32_t p423 +, int32_t p424, int32_t p425, int32_t p426, int32_t p427, int32_t p428, int32_t p429, int32_t p430, int32_t p431 +, int32_t p432, int32_t p433, int32_t p434, int32_t p435, int32_t p436, int32_t p437, int32_t p438, int32_t p439 +, int32_t p440, int32_t p441, int32_t p442, int32_t p443, int32_t p444, int32_t p445, int32_t p446, int32_t p447 +, int32_t p448, int32_t p449, int32_t p450, int32_t p451, int32_t p452, int32_t p453, int32_t p454, int32_t p455 +, int32_t p456, int32_t p457, int32_t p458, int32_t p459, int32_t p460, int32_t p461, int32_t p462, int32_t p463 +, int32_t p464, int32_t p465, int32_t p466, int32_t p467, int32_t p468, int32_t p469, int32_t p470, int32_t p471 +, int32_t p472, int32_t p473, int32_t p474, int32_t p475, int32_t p476, int32_t p477, int32_t p478, int32_t p479 +, int32_t p480, int32_t p481, int32_t p482, int32_t p483, int32_t p484, int32_t p485, int32_t p486, int32_t p487 +, int32_t p488, int32_t p489, int32_t p490, int32_t p491, int32_t p492, int32_t p493, int32_t p494, int32_t p495 +, int32_t p496, int32_t p497, int32_t p498, int32_t p499, int32_t p500, int32_t p501, int32_t p502, int32_t p503 +, int32_t p504, int32_t p505, int32_t p506, int32_t p507, int32_t p508, int32_t p509, int32_t p510, int32_t p511 +, int32_t p512, int32_t p513, int32_t p514, int32_t p515, int32_t p516, int32_t p517, int32_t p518, int32_t p519 +, int32_t p520, int32_t p521, int32_t p522, int32_t p523, int32_t p524, int32_t p525, int32_t p526, int32_t p527 +, int32_t p528, int32_t p529, int32_t p530, int32_t p531, int32_t p532, int32_t p533, int32_t p534, int32_t p535 +, int32_t p536, int32_t p537, int32_t p538, int32_t p539, int32_t p540, int32_t p541, int32_t p542, int32_t p543 +, int32_t p544, int32_t p545, int32_t p546, int32_t p547, int32_t p548, int32_t p549, int32_t p550, int32_t p551 +, int32_t p552, int32_t p553, int32_t p554, int32_t p555, int32_t p556, int32_t p557, int32_t p558, int32_t p559 +, int32_t p560, int32_t p561, int32_t p562, int32_t p563, int32_t p564, int32_t p565, int32_t p566, int32_t p567 +, int32_t p568, int32_t p569, int32_t p570, int32_t p571, int32_t p572, int32_t p573, int32_t p574, int32_t p575 +, int32_t p576, int32_t p577, int32_t p578, int32_t p579, int32_t p580, int32_t p581, int32_t p582, int32_t p583 +, int32_t p584, int32_t p585, int32_t p586, int32_t p587, int32_t p588, int32_t p589, int32_t p590, int32_t p591 +, int32_t p592, int32_t p593, int32_t p594, int32_t p595, int32_t p596, int32_t p597, int32_t p598, int32_t p599 +, int32_t p600, int32_t p601, int32_t p602, int32_t p603, int32_t p604, int32_t p605, int32_t p606, int32_t p607 +, int32_t p608, int32_t p609, int32_t p610, int32_t p611, int32_t p612, int32_t p613, int32_t p614, int32_t p615 +, int32_t p616, int32_t p617, int32_t p618, int32_t p619, int32_t p620, int32_t p621, int32_t p622, int32_t p623 +, int32_t p624, int32_t p625, int32_t p626, int32_t p627, int32_t p628, int32_t p629, int32_t p630, int32_t p631 +, int32_t p632, int32_t p633, int32_t p634, int32_t p635, int32_t p636, int32_t p637, int32_t p638, int32_t p639 +, int32_t p640, int32_t p641, int32_t p642, int32_t p643, int32_t p644, int32_t p645, int32_t p646, int32_t p647 +, int32_t p648, int32_t p649, int32_t p650, int32_t p651, int32_t p652, int32_t p653, int32_t p654, int32_t p655 +, int32_t p656, int32_t p657, int32_t p658, int32_t p659, int32_t p660, int32_t p661, int32_t p662, int32_t p663 +, int32_t p664, int32_t p665, int32_t p666, int32_t p667, int32_t p668, int32_t p669, int32_t p670, int32_t p671 +, int32_t p672, int32_t p673, int32_t p674, int32_t p675, int32_t p676, int32_t p677, int32_t p678, int32_t p679 +, int32_t p680, int32_t p681, int32_t p682, int32_t p683, int32_t p684, int32_t p685, int32_t p686, int32_t p687 +, int32_t p688, int32_t p689, int32_t p690, int32_t p691, int32_t p692, int32_t p693, int32_t p694, int32_t p695 +, int32_t p696, int32_t p697, int32_t p698, int32_t p699, int32_t p700, int32_t p701, int32_t p702, int32_t p703 +, int32_t p704, int32_t p705, int32_t p706, int32_t p707, int32_t p708, int32_t p709, int32_t p710, int32_t p711 +, int32_t p712, int32_t p713, int32_t p714, int32_t p715, int32_t p716, int32_t p717, int32_t p718, int32_t p719 +, int32_t p720, int32_t p721, int32_t p722, int32_t p723, int32_t p724, int32_t p725, int32_t p726, int32_t p727 +, int32_t p728, int32_t p729, int32_t p730, int32_t p731, int32_t p732, int32_t p733, int32_t p734, int32_t p735 +, int32_t p736, int32_t p737, int32_t p738, int32_t p739, int32_t p740, int32_t p741, int32_t p742, int32_t p743 +, int32_t p744, int32_t p745, int32_t p746, int32_t p747, int32_t p748, int32_t p749, int32_t p750, int32_t p751 +, int32_t p752, int32_t p753, int32_t p754, int32_t p755, int32_t p756, int32_t p757, int32_t p758, int32_t p759 +, int32_t p760, int32_t p761, int32_t p762, int32_t p763, int32_t p764, int32_t p765, int32_t p766, int32_t p767 +, int32_t p768, int32_t p769, int32_t p770, int32_t p771, int32_t p772, int32_t p773, int32_t p774, int32_t p775 +, int32_t p776, int32_t p777, int32_t p778, int32_t p779, int32_t p780, int32_t p781, int32_t p782, int32_t p783 +, int32_t p784, int32_t p785, int32_t p786, int32_t p787, int32_t p788, int32_t p789, int32_t p790, int32_t p791 +, int32_t p792, int32_t p793, int32_t p794, int32_t p795, int32_t p796, int32_t p797, int32_t p798, int32_t p799 +, int32_t p800, int32_t p801, int32_t p802, int32_t p803, int32_t p804, int32_t p805, int32_t p806, int32_t p807 +, int32_t p808, int32_t p809, int32_t p810, int32_t p811, int32_t p812, int32_t p813, int32_t p814, int32_t p815 +, int32_t p816, int32_t p817, int32_t p818, int32_t p819, int32_t p820, int32_t p821, int32_t p822, int32_t p823 +, int32_t p824, int32_t p825, int32_t p826, int32_t p827, int32_t p828, int32_t p829, int32_t p830, int32_t p831 +, int32_t p832, int32_t p833, int32_t p834, int32_t p835, int32_t p836, int32_t p837, int32_t p838, int32_t p839 +, int32_t p840, int32_t p841, int32_t p842, int32_t p843, int32_t p844, int32_t p845, int32_t p846, int32_t p847 +, int32_t p848, int32_t p849, int32_t p850, int32_t p851, int32_t p852, int32_t p853, int32_t p854, int32_t p855 +, int32_t p856, int32_t p857, int32_t p858, int32_t p859, int32_t p860, int32_t p861, int32_t p862, int32_t p863 +, int32_t p864, int32_t p865, int32_t p866, int32_t p867, int32_t p868, int32_t p869, int32_t p870, int32_t p871 +, int32_t p872, int32_t p873, int32_t p874, int32_t p875, int32_t p876, int32_t p877, int32_t p878, int32_t p879 +, int32_t p880, int32_t p881, int32_t p882, int32_t p883, int32_t p884, int32_t p885, int32_t p886, int32_t p887 +, int32_t p888, int32_t p889, int32_t p890, int32_t p891, int32_t p892, int32_t p893, int32_t p894, int32_t p895 +, int32_t p896, int32_t p897, int32_t p898, int32_t p899, int32_t p900, int32_t p901, int32_t p902, int32_t p903 +, int32_t p904, int32_t p905, int32_t p906, int32_t p907, int32_t p908, int32_t p909, int32_t p910, int32_t p911 +, int32_t p912, int32_t p913, int32_t p914, int32_t p915, int32_t p916, int32_t p917, int32_t p918, int32_t p919 +, int32_t p920, int32_t p921, int32_t p922, int32_t p923, int32_t p924, int32_t p925, int32_t p926, int32_t p927 +, int32_t p928, int32_t p929, int32_t p930, int32_t p931, int32_t p932, int32_t p933, int32_t p934, int32_t p935 +, int32_t p936, int32_t p937, int32_t p938, int32_t p939, int32_t p940, int32_t p941, int32_t p942, int32_t p943 +, int32_t p944, int32_t p945, int32_t p946, int32_t p947, int32_t p948, int32_t p949, int32_t p950, int32_t p951 +, int32_t p952, int32_t p953, int32_t p954, int32_t p955, int32_t p956, int32_t p957, int32_t p958, int32_t p959 +, int32_t p960, int32_t p961, int32_t p962, int32_t p963, int32_t p964, int32_t p965, int32_t p966, int32_t p967 +, int32_t p968, int32_t p969, int32_t p970, int32_t p971, int32_t p972, int32_t p973, int32_t p974, int32_t p975 +, int32_t p976, int32_t p977, int32_t p978, int32_t p979, int32_t p980, int32_t p981, int32_t p982, int32_t p983 +, int32_t p984, int32_t p985, int32_t p986, int32_t p987, int32_t p988, int32_t p989, int32_t p990, int32_t p991 +, int32_t p992, int32_t p993, int32_t p994, int32_t p995, int32_t p996, int32_t p997, int32_t p998, int32_t p999 +, int32_t p1000 +) +{ + int32_t x; + x = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + + p8 + p9 + p10 + p11 + p12 + p13 + p14 + p15 + + p16 + p17 + p18 + p19 + p20 + p21 + p22 + p23 + + p24 + p25 + p26 + p27 + p28 + p29 + p30 + p31 + + p32 + p33 + p34 + p35 + p36 + p37 + p38 + p39 + + p40 + p41 + p42 + p43 + p44 + p45 + p46 + p47 + + p48 + p49 + p50 + p51 + p52 + p53 + p54 + p55 + + p56 + p57 + p58 + p59 + p60 + p61 + p62 + p63 + + p64 + p65 + p66 + p67 + p68 + p69 + p70 + p71 + + p72 + p73 + p74 + p75 + p76 + p77 + p78 + p79 + + p80 + p81 + p82 + p83 + p84 + p85 + p86 + p87 + + p88 + p89 + p90 + p91 + p92 + p93 + p94 + p95 + + p96 + p97 + p98 + p99 + p100 + p101 + p102 + p103 + + p104 + p105 + p106 + p107 + p108 + p109 + p110 + p111 + + p112 + p113 + p114 + p115 + p116 + p117 + p118 + p119 + + p120 + p121 + p122 + p123 + p124 + p125 + p126 + p127 + + p128 + p129 + p130 + p131 + p132 + p133 + p134 + p135 + + p136 + p137 + p138 + p139 + p140 + p141 + p142 + p143 + + p144 + p145 + p146 + p147 + p148 + p149 + p150 + p151 + + p152 + p153 + p154 + p155 + p156 + p157 + p158 + p159 + + p160 + p161 + p162 + p163 + p164 + p165 + p166 + p167 + + p168 + p169 + p170 + p171 + p172 + p173 + p174 + p175 + + p176 + p177 + p178 + p179 + p180 + p181 + p182 + p183 + + p184 + p185 + p186 + p187 + p188 + p189 + p190 + p191 + + p192 + p193 + p194 + p195 + p196 + p197 + p198 + p199 + + p200 + p201 + p202 + p203 + p204 + p205 + p206 + p207 + + p208 + p209 + p210 + p211 + p212 + p213 + p214 + p215 + + p216 + p217 + p218 + p219 + p220 + p221 + p222 + p223 + + p224 + p225 + p226 + p227 + p228 + p229 + p230 + p231 + + p232 + p233 + p234 + p235 + p236 + p237 + p238 + p239 + + p240 + p241 + p242 + p243 + p244 + p245 + p246 + p247 + + p248 + p249 + p250 + p251 + p252 + p253 + p254 + p255 + + p256 + p257 + p258 + p259 + p260 + p261 + p262 + p263 + + p264 + p265 + p266 + p267 + p268 + p269 + p270 + p271 + + p272 + p273 + p274 + p275 + p276 + p277 + p278 + p279 + + p280 + p281 + p282 + p283 + p284 + p285 + p286 + p287 + + p288 + p289 + p290 + p291 + p292 + p293 + p294 + p295 + + p296 + p297 + p298 + p299 + p300 + p301 + p302 + p303 + + p304 + p305 + p306 + p307 + p308 + p309 + p310 + p311 + + p312 + p313 + p314 + p315 + p316 + p317 + p318 + p319 + + p320 + p321 + p322 + p323 + p324 + p325 + p326 + p327 + + p328 + p329 + p330 + p331 + p332 + p333 + p334 + p335 + + p336 + p337 + p338 + p339 + p340 + p341 + p342 + p343 + + p344 + p345 + p346 + p347 + p348 + p349 + p350 + p351 + + p352 + p353 + p354 + p355 + p356 + p357 + p358 + p359 + + p360 + p361 + p362 + p363 + p364 + p365 + p366 + p367 + + p368 + p369 + p370 + p371 + p372 + p373 + p374 + p375 + + p376 + p377 + p378 + p379 + p380 + p381 + p382 + p383 + + p384 + p385 + p386 + p387 + p388 + p389 + p390 + p391 + + p392 + p393 + p394 + p395 + p396 + p397 + p398 + p399 + + p400 + p401 + p402 + p403 + p404 + p405 + p406 + p407 + + p408 + p409 + p410 + p411 + p412 + p413 + p414 + p415 + + p416 + p417 + p418 + p419 + p420 + p421 + p422 + p423 + + p424 + p425 + p426 + p427 + p428 + p429 + p430 + p431 + + p432 + p433 + p434 + p435 + p436 + p437 + p438 + p439 + + p440 + p441 + p442 + p443 + p444 + p445 + p446 + p447 + + p448 + p449 + p450 + p451 + p452 + p453 + p454 + p455 + + p456 + p457 + p458 + p459 + p460 + p461 + p462 + p463 + + p464 + p465 + p466 + p467 + p468 + p469 + p470 + p471 + + p472 + p473 + p474 + p475 + p476 + p477 + p478 + p479 + + p480 + p481 + p482 + p483 + p484 + p485 + p486 + p487 + + p488 + p489 + p490 + p491 + p492 + p493 + p494 + p495 + + p496 + p497 + p498 + p499 + p500 + p501 + p502 + p503 + + p504 + p505 + p506 + p507 + p508 + p509 + p510 + p511 + + p512 + p513 + p514 + p515 + p516 + p517 + p518 + p519 + + p520 + p521 + p522 + p523 + p524 + p525 + p526 + p527 + + p528 + p529 + p530 + p531 + p532 + p533 + p534 + p535 + + p536 + p537 + p538 + p539 + p540 + p541 + p542 + p543 + + p544 + p545 + p546 + p547 + p548 + p549 + p550 + p551 + + p552 + p553 + p554 + p555 + p556 + p557 + p558 + p559 + + p560 + p561 + p562 + p563 + p564 + p565 + p566 + p567 + + p568 + p569 + p570 + p571 + p572 + p573 + p574 + p575 + + p576 + p577 + p578 + p579 + p580 + p581 + p582 + p583 + + p584 + p585 + p586 + p587 + p588 + p589 + p590 + p591 + + p592 + p593 + p594 + p595 + p596 + p597 + p598 + p599 + + p600 + p601 + p602 + p603 + p604 + p605 + p606 + p607 + + p608 + p609 + p610 + p611 + p612 + p613 + p614 + p615 + + p616 + p617 + p618 + p619 + p620 + p621 + p622 + p623 + + p624 + p625 + p626 + p627 + p628 + p629 + p630 + p631 + + p632 + p633 + p634 + p635 + p636 + p637 + p638 + p639 + + p640 + p641 + p642 + p643 + p644 + p645 + p646 + p647 + + p648 + p649 + p650 + p651 + p652 + p653 + p654 + p655 + + p656 + p657 + p658 + p659 + p660 + p661 + p662 + p663 + + p664 + p665 + p666 + p667 + p668 + p669 + p670 + p671 + + p672 + p673 + p674 + p675 + p676 + p677 + p678 + p679 + + p680 + p681 + p682 + p683 + p684 + p685 + p686 + p687 + + p688 + p689 + p690 + p691 + p692 + p693 + p694 + p695 + + p696 + p697 + p698 + p699 + p700 + p701 + p702 + p703 + + p704 + p705 + p706 + p707 + p708 + p709 + p710 + p711 + + p712 + p713 + p714 + p715 + p716 + p717 + p718 + p719 + + p720 + p721 + p722 + p723 + p724 + p725 + p726 + p727 + + p728 + p729 + p730 + p731 + p732 + p733 + p734 + p735 + + p736 + p737 + p738 + p739 + p740 + p741 + p742 + p743 + + p744 + p745 + p746 + p747 + p748 + p749 + p750 + p751 + + p752 + p753 + p754 + p755 + p756 + p757 + p758 + p759 + + p760 + p761 + p762 + p763 + p764 + p765 + p766 + p767 + + p768 + p769 + p770 + p771 + p772 + p773 + p774 + p775 + + p776 + p777 + p778 + p779 + p780 + p781 + p782 + p783 + + p784 + p785 + p786 + p787 + p788 + p789 + p790 + p791 + + p792 + p793 + p794 + p795 + p796 + p797 + p798 + p799 + + p800 + p801 + p802 + p803 + p804 + p805 + p806 + p807 + + p808 + p809 + p810 + p811 + p812 + p813 + p814 + p815 + + p816 + p817 + p818 + p819 + p820 + p821 + p822 + p823 + + p824 + p825 + p826 + p827 + p828 + p829 + p830 + p831 + + p832 + p833 + p834 + p835 + p836 + p837 + p838 + p839 + + p840 + p841 + p842 + p843 + p844 + p845 + p846 + p847 + + p848 + p849 + p850 + p851 + p852 + p853 + p854 + p855 + + p856 + p857 + p858 + p859 + p860 + p861 + p862 + p863 + + p864 + p865 + p866 + p867 + p868 + p869 + p870 + p871 + + p872 + p873 + p874 + p875 + p876 + p877 + p878 + p879 + + p880 + p881 + p882 + p883 + p884 + p885 + p886 + p887 + + p888 + p889 + p890 + p891 + p892 + p893 + p894 + p895 + + p896 + p897 + p898 + p899 + p900 + p901 + p902 + p903 + + p904 + p905 + p906 + p907 + p908 + p909 + p910 + p911 + + p912 + p913 + p914 + p915 + p916 + p917 + p918 + p919 + + p920 + p921 + p922 + p923 + p924 + p925 + p926 + p927 + + p928 + p929 + p930 + p931 + p932 + p933 + p934 + p935 + + p936 + p937 + p938 + p939 + p940 + p941 + p942 + p943 + + p944 + p945 + p946 + p947 + p948 + p949 + p950 + p951 + + p952 + p953 + p954 + p955 + p956 + p957 + p958 + p959 + + p960 + p961 + p962 + p963 + p964 + p965 + p966 + p967 + + p968 + p969 + p970 + p971 + p972 + p973 + p974 + p975 + + p976 + p977 + p978 + p979 + p980 + p981 + p982 + p983 + + p984 + p985 + p986 + p987 + p988 + p989 + p990 + p991 + + p992 + p993 + p994 + p995 + p996 + p997 + p998 + p999 + + p1000; + return x; +} + +// clang-format on diff --git a/src/test/app/wasm_fixtures/thousand_params.c b/src/test/app/wasm_fixtures/thousand_params.c new file mode 100644 index 00000000000..d934ca38c83 --- /dev/null +++ b/src/test/app/wasm_fixtures/thousand_params.c @@ -0,0 +1,262 @@ +// clang-format off + +#include + +int32_t test( + int32_t p0, int32_t p1, int32_t p2, int32_t p3, int32_t p4, int32_t p5, int32_t p6, int32_t p7 +, int32_t p8, int32_t p9, int32_t p10, int32_t p11, int32_t p12, int32_t p13, int32_t p14, int32_t p15 +, int32_t p16, int32_t p17, int32_t p18, int32_t p19, int32_t p20, int32_t p21, int32_t p22, int32_t p23 +, int32_t p24, int32_t p25, int32_t p26, int32_t p27, int32_t p28, int32_t p29, int32_t p30, int32_t p31 +, int32_t p32, int32_t p33, int32_t p34, int32_t p35, int32_t p36, int32_t p37, int32_t p38, int32_t p39 +, int32_t p40, int32_t p41, int32_t p42, int32_t p43, int32_t p44, int32_t p45, int32_t p46, int32_t p47 +, int32_t p48, int32_t p49, int32_t p50, int32_t p51, int32_t p52, int32_t p53, int32_t p54, int32_t p55 +, int32_t p56, int32_t p57, int32_t p58, int32_t p59, int32_t p60, int32_t p61, int32_t p62, int32_t p63 +, int32_t p64, int32_t p65, int32_t p66, int32_t p67, int32_t p68, int32_t p69, int32_t p70, int32_t p71 +, int32_t p72, int32_t p73, int32_t p74, int32_t p75, int32_t p76, int32_t p77, int32_t p78, int32_t p79 +, int32_t p80, int32_t p81, int32_t p82, int32_t p83, int32_t p84, int32_t p85, int32_t p86, int32_t p87 +, int32_t p88, int32_t p89, int32_t p90, int32_t p91, int32_t p92, int32_t p93, int32_t p94, int32_t p95 +, int32_t p96, int32_t p97, int32_t p98, int32_t p99, int32_t p100, int32_t p101, int32_t p102, int32_t p103 +, int32_t p104, int32_t p105, int32_t p106, int32_t p107, int32_t p108, int32_t p109, int32_t p110, int32_t p111 +, int32_t p112, int32_t p113, int32_t p114, int32_t p115, int32_t p116, int32_t p117, int32_t p118, int32_t p119 +, int32_t p120, int32_t p121, int32_t p122, int32_t p123, int32_t p124, int32_t p125, int32_t p126, int32_t p127 +, int32_t p128, int32_t p129, int32_t p130, int32_t p131, int32_t p132, int32_t p133, int32_t p134, int32_t p135 +, int32_t p136, int32_t p137, int32_t p138, int32_t p139, int32_t p140, int32_t p141, int32_t p142, int32_t p143 +, int32_t p144, int32_t p145, int32_t p146, int32_t p147, int32_t p148, int32_t p149, int32_t p150, int32_t p151 +, int32_t p152, int32_t p153, int32_t p154, int32_t p155, int32_t p156, int32_t p157, int32_t p158, int32_t p159 +, int32_t p160, int32_t p161, int32_t p162, int32_t p163, int32_t p164, int32_t p165, int32_t p166, int32_t p167 +, int32_t p168, int32_t p169, int32_t p170, int32_t p171, int32_t p172, int32_t p173, int32_t p174, int32_t p175 +, int32_t p176, int32_t p177, int32_t p178, int32_t p179, int32_t p180, int32_t p181, int32_t p182, int32_t p183 +, int32_t p184, int32_t p185, int32_t p186, int32_t p187, int32_t p188, int32_t p189, int32_t p190, int32_t p191 +, int32_t p192, int32_t p193, int32_t p194, int32_t p195, int32_t p196, int32_t p197, int32_t p198, int32_t p199 +, int32_t p200, int32_t p201, int32_t p202, int32_t p203, int32_t p204, int32_t p205, int32_t p206, int32_t p207 +, int32_t p208, int32_t p209, int32_t p210, int32_t p211, int32_t p212, int32_t p213, int32_t p214, int32_t p215 +, int32_t p216, int32_t p217, int32_t p218, int32_t p219, int32_t p220, int32_t p221, int32_t p222, int32_t p223 +, int32_t p224, int32_t p225, int32_t p226, int32_t p227, int32_t p228, int32_t p229, int32_t p230, int32_t p231 +, int32_t p232, int32_t p233, int32_t p234, int32_t p235, int32_t p236, int32_t p237, int32_t p238, int32_t p239 +, int32_t p240, int32_t p241, int32_t p242, int32_t p243, int32_t p244, int32_t p245, int32_t p246, int32_t p247 +, int32_t p248, int32_t p249, int32_t p250, int32_t p251, int32_t p252, int32_t p253, int32_t p254, int32_t p255 +, int32_t p256, int32_t p257, int32_t p258, int32_t p259, int32_t p260, int32_t p261, int32_t p262, int32_t p263 +, int32_t p264, int32_t p265, int32_t p266, int32_t p267, int32_t p268, int32_t p269, int32_t p270, int32_t p271 +, int32_t p272, int32_t p273, int32_t p274, int32_t p275, int32_t p276, int32_t p277, int32_t p278, int32_t p279 +, int32_t p280, int32_t p281, int32_t p282, int32_t p283, int32_t p284, int32_t p285, int32_t p286, int32_t p287 +, int32_t p288, int32_t p289, int32_t p290, int32_t p291, int32_t p292, int32_t p293, int32_t p294, int32_t p295 +, int32_t p296, int32_t p297, int32_t p298, int32_t p299, int32_t p300, int32_t p301, int32_t p302, int32_t p303 +, int32_t p304, int32_t p305, int32_t p306, int32_t p307, int32_t p308, int32_t p309, int32_t p310, int32_t p311 +, int32_t p312, int32_t p313, int32_t p314, int32_t p315, int32_t p316, int32_t p317, int32_t p318, int32_t p319 +, int32_t p320, int32_t p321, int32_t p322, int32_t p323, int32_t p324, int32_t p325, int32_t p326, int32_t p327 +, int32_t p328, int32_t p329, int32_t p330, int32_t p331, int32_t p332, int32_t p333, int32_t p334, int32_t p335 +, int32_t p336, int32_t p337, int32_t p338, int32_t p339, int32_t p340, int32_t p341, int32_t p342, int32_t p343 +, int32_t p344, int32_t p345, int32_t p346, int32_t p347, int32_t p348, int32_t p349, int32_t p350, int32_t p351 +, int32_t p352, int32_t p353, int32_t p354, int32_t p355, int32_t p356, int32_t p357, int32_t p358, int32_t p359 +, int32_t p360, int32_t p361, int32_t p362, int32_t p363, int32_t p364, int32_t p365, int32_t p366, int32_t p367 +, int32_t p368, int32_t p369, int32_t p370, int32_t p371, int32_t p372, int32_t p373, int32_t p374, int32_t p375 +, int32_t p376, int32_t p377, int32_t p378, int32_t p379, int32_t p380, int32_t p381, int32_t p382, int32_t p383 +, int32_t p384, int32_t p385, int32_t p386, int32_t p387, int32_t p388, int32_t p389, int32_t p390, int32_t p391 +, int32_t p392, int32_t p393, int32_t p394, int32_t p395, int32_t p396, int32_t p397, int32_t p398, int32_t p399 +, int32_t p400, int32_t p401, int32_t p402, int32_t p403, int32_t p404, int32_t p405, int32_t p406, int32_t p407 +, int32_t p408, int32_t p409, int32_t p410, int32_t p411, int32_t p412, int32_t p413, int32_t p414, int32_t p415 +, int32_t p416, int32_t p417, int32_t p418, int32_t p419, int32_t p420, int32_t p421, int32_t p422, int32_t p423 +, int32_t p424, int32_t p425, int32_t p426, int32_t p427, int32_t p428, int32_t p429, int32_t p430, int32_t p431 +, int32_t p432, int32_t p433, int32_t p434, int32_t p435, int32_t p436, int32_t p437, int32_t p438, int32_t p439 +, int32_t p440, int32_t p441, int32_t p442, int32_t p443, int32_t p444, int32_t p445, int32_t p446, int32_t p447 +, int32_t p448, int32_t p449, int32_t p450, int32_t p451, int32_t p452, int32_t p453, int32_t p454, int32_t p455 +, int32_t p456, int32_t p457, int32_t p458, int32_t p459, int32_t p460, int32_t p461, int32_t p462, int32_t p463 +, int32_t p464, int32_t p465, int32_t p466, int32_t p467, int32_t p468, int32_t p469, int32_t p470, int32_t p471 +, int32_t p472, int32_t p473, int32_t p474, int32_t p475, int32_t p476, int32_t p477, int32_t p478, int32_t p479 +, int32_t p480, int32_t p481, int32_t p482, int32_t p483, int32_t p484, int32_t p485, int32_t p486, int32_t p487 +, int32_t p488, int32_t p489, int32_t p490, int32_t p491, int32_t p492, int32_t p493, int32_t p494, int32_t p495 +, int32_t p496, int32_t p497, int32_t p498, int32_t p499, int32_t p500, int32_t p501, int32_t p502, int32_t p503 +, int32_t p504, int32_t p505, int32_t p506, int32_t p507, int32_t p508, int32_t p509, int32_t p510, int32_t p511 +, int32_t p512, int32_t p513, int32_t p514, int32_t p515, int32_t p516, int32_t p517, int32_t p518, int32_t p519 +, int32_t p520, int32_t p521, int32_t p522, int32_t p523, int32_t p524, int32_t p525, int32_t p526, int32_t p527 +, int32_t p528, int32_t p529, int32_t p530, int32_t p531, int32_t p532, int32_t p533, int32_t p534, int32_t p535 +, int32_t p536, int32_t p537, int32_t p538, int32_t p539, int32_t p540, int32_t p541, int32_t p542, int32_t p543 +, int32_t p544, int32_t p545, int32_t p546, int32_t p547, int32_t p548, int32_t p549, int32_t p550, int32_t p551 +, int32_t p552, int32_t p553, int32_t p554, int32_t p555, int32_t p556, int32_t p557, int32_t p558, int32_t p559 +, int32_t p560, int32_t p561, int32_t p562, int32_t p563, int32_t p564, int32_t p565, int32_t p566, int32_t p567 +, int32_t p568, int32_t p569, int32_t p570, int32_t p571, int32_t p572, int32_t p573, int32_t p574, int32_t p575 +, int32_t p576, int32_t p577, int32_t p578, int32_t p579, int32_t p580, int32_t p581, int32_t p582, int32_t p583 +, int32_t p584, int32_t p585, int32_t p586, int32_t p587, int32_t p588, int32_t p589, int32_t p590, int32_t p591 +, int32_t p592, int32_t p593, int32_t p594, int32_t p595, int32_t p596, int32_t p597, int32_t p598, int32_t p599 +, int32_t p600, int32_t p601, int32_t p602, int32_t p603, int32_t p604, int32_t p605, int32_t p606, int32_t p607 +, int32_t p608, int32_t p609, int32_t p610, int32_t p611, int32_t p612, int32_t p613, int32_t p614, int32_t p615 +, int32_t p616, int32_t p617, int32_t p618, int32_t p619, int32_t p620, int32_t p621, int32_t p622, int32_t p623 +, int32_t p624, int32_t p625, int32_t p626, int32_t p627, int32_t p628, int32_t p629, int32_t p630, int32_t p631 +, int32_t p632, int32_t p633, int32_t p634, int32_t p635, int32_t p636, int32_t p637, int32_t p638, int32_t p639 +, int32_t p640, int32_t p641, int32_t p642, int32_t p643, int32_t p644, int32_t p645, int32_t p646, int32_t p647 +, int32_t p648, int32_t p649, int32_t p650, int32_t p651, int32_t p652, int32_t p653, int32_t p654, int32_t p655 +, int32_t p656, int32_t p657, int32_t p658, int32_t p659, int32_t p660, int32_t p661, int32_t p662, int32_t p663 +, int32_t p664, int32_t p665, int32_t p666, int32_t p667, int32_t p668, int32_t p669, int32_t p670, int32_t p671 +, int32_t p672, int32_t p673, int32_t p674, int32_t p675, int32_t p676, int32_t p677, int32_t p678, int32_t p679 +, int32_t p680, int32_t p681, int32_t p682, int32_t p683, int32_t p684, int32_t p685, int32_t p686, int32_t p687 +, int32_t p688, int32_t p689, int32_t p690, int32_t p691, int32_t p692, int32_t p693, int32_t p694, int32_t p695 +, int32_t p696, int32_t p697, int32_t p698, int32_t p699, int32_t p700, int32_t p701, int32_t p702, int32_t p703 +, int32_t p704, int32_t p705, int32_t p706, int32_t p707, int32_t p708, int32_t p709, int32_t p710, int32_t p711 +, int32_t p712, int32_t p713, int32_t p714, int32_t p715, int32_t p716, int32_t p717, int32_t p718, int32_t p719 +, int32_t p720, int32_t p721, int32_t p722, int32_t p723, int32_t p724, int32_t p725, int32_t p726, int32_t p727 +, int32_t p728, int32_t p729, int32_t p730, int32_t p731, int32_t p732, int32_t p733, int32_t p734, int32_t p735 +, int32_t p736, int32_t p737, int32_t p738, int32_t p739, int32_t p740, int32_t p741, int32_t p742, int32_t p743 +, int32_t p744, int32_t p745, int32_t p746, int32_t p747, int32_t p748, int32_t p749, int32_t p750, int32_t p751 +, int32_t p752, int32_t p753, int32_t p754, int32_t p755, int32_t p756, int32_t p757, int32_t p758, int32_t p759 +, int32_t p760, int32_t p761, int32_t p762, int32_t p763, int32_t p764, int32_t p765, int32_t p766, int32_t p767 +, int32_t p768, int32_t p769, int32_t p770, int32_t p771, int32_t p772, int32_t p773, int32_t p774, int32_t p775 +, int32_t p776, int32_t p777, int32_t p778, int32_t p779, int32_t p780, int32_t p781, int32_t p782, int32_t p783 +, int32_t p784, int32_t p785, int32_t p786, int32_t p787, int32_t p788, int32_t p789, int32_t p790, int32_t p791 +, int32_t p792, int32_t p793, int32_t p794, int32_t p795, int32_t p796, int32_t p797, int32_t p798, int32_t p799 +, int32_t p800, int32_t p801, int32_t p802, int32_t p803, int32_t p804, int32_t p805, int32_t p806, int32_t p807 +, int32_t p808, int32_t p809, int32_t p810, int32_t p811, int32_t p812, int32_t p813, int32_t p814, int32_t p815 +, int32_t p816, int32_t p817, int32_t p818, int32_t p819, int32_t p820, int32_t p821, int32_t p822, int32_t p823 +, int32_t p824, int32_t p825, int32_t p826, int32_t p827, int32_t p828, int32_t p829, int32_t p830, int32_t p831 +, int32_t p832, int32_t p833, int32_t p834, int32_t p835, int32_t p836, int32_t p837, int32_t p838, int32_t p839 +, int32_t p840, int32_t p841, int32_t p842, int32_t p843, int32_t p844, int32_t p845, int32_t p846, int32_t p847 +, int32_t p848, int32_t p849, int32_t p850, int32_t p851, int32_t p852, int32_t p853, int32_t p854, int32_t p855 +, int32_t p856, int32_t p857, int32_t p858, int32_t p859, int32_t p860, int32_t p861, int32_t p862, int32_t p863 +, int32_t p864, int32_t p865, int32_t p866, int32_t p867, int32_t p868, int32_t p869, int32_t p870, int32_t p871 +, int32_t p872, int32_t p873, int32_t p874, int32_t p875, int32_t p876, int32_t p877, int32_t p878, int32_t p879 +, int32_t p880, int32_t p881, int32_t p882, int32_t p883, int32_t p884, int32_t p885, int32_t p886, int32_t p887 +, int32_t p888, int32_t p889, int32_t p890, int32_t p891, int32_t p892, int32_t p893, int32_t p894, int32_t p895 +, int32_t p896, int32_t p897, int32_t p898, int32_t p899, int32_t p900, int32_t p901, int32_t p902, int32_t p903 +, int32_t p904, int32_t p905, int32_t p906, int32_t p907, int32_t p908, int32_t p909, int32_t p910, int32_t p911 +, int32_t p912, int32_t p913, int32_t p914, int32_t p915, int32_t p916, int32_t p917, int32_t p918, int32_t p919 +, int32_t p920, int32_t p921, int32_t p922, int32_t p923, int32_t p924, int32_t p925, int32_t p926, int32_t p927 +, int32_t p928, int32_t p929, int32_t p930, int32_t p931, int32_t p932, int32_t p933, int32_t p934, int32_t p935 +, int32_t p936, int32_t p937, int32_t p938, int32_t p939, int32_t p940, int32_t p941, int32_t p942, int32_t p943 +, int32_t p944, int32_t p945, int32_t p946, int32_t p947, int32_t p948, int32_t p949, int32_t p950, int32_t p951 +, int32_t p952, int32_t p953, int32_t p954, int32_t p955, int32_t p956, int32_t p957, int32_t p958, int32_t p959 +, int32_t p960, int32_t p961, int32_t p962, int32_t p963, int32_t p964, int32_t p965, int32_t p966, int32_t p967 +, int32_t p968, int32_t p969, int32_t p970, int32_t p971, int32_t p972, int32_t p973, int32_t p974, int32_t p975 +, int32_t p976, int32_t p977, int32_t p978, int32_t p979, int32_t p980, int32_t p981, int32_t p982, int32_t p983 +, int32_t p984, int32_t p985, int32_t p986, int32_t p987, int32_t p988, int32_t p989, int32_t p990, int32_t p991 +, int32_t p992, int32_t p993, int32_t p994, int32_t p995, int32_t p996, int32_t p997, int32_t p998, int32_t p999 +) +{ + int32_t x; + x = p0 + p1 + p2 + p3 + p4 + p5 + p6 + p7 + + p8 + p9 + p10 + p11 + p12 + p13 + p14 + p15 + + p16 + p17 + p18 + p19 + p20 + p21 + p22 + p23 + + p24 + p25 + p26 + p27 + p28 + p29 + p30 + p31 + + p32 + p33 + p34 + p35 + p36 + p37 + p38 + p39 + + p40 + p41 + p42 + p43 + p44 + p45 + p46 + p47 + + p48 + p49 + p50 + p51 + p52 + p53 + p54 + p55 + + p56 + p57 + p58 + p59 + p60 + p61 + p62 + p63 + + p64 + p65 + p66 + p67 + p68 + p69 + p70 + p71 + + p72 + p73 + p74 + p75 + p76 + p77 + p78 + p79 + + p80 + p81 + p82 + p83 + p84 + p85 + p86 + p87 + + p88 + p89 + p90 + p91 + p92 + p93 + p94 + p95 + + p96 + p97 + p98 + p99 + p100 + p101 + p102 + p103 + + p104 + p105 + p106 + p107 + p108 + p109 + p110 + p111 + + p112 + p113 + p114 + p115 + p116 + p117 + p118 + p119 + + p120 + p121 + p122 + p123 + p124 + p125 + p126 + p127 + + p128 + p129 + p130 + p131 + p132 + p133 + p134 + p135 + + p136 + p137 + p138 + p139 + p140 + p141 + p142 + p143 + + p144 + p145 + p146 + p147 + p148 + p149 + p150 + p151 + + p152 + p153 + p154 + p155 + p156 + p157 + p158 + p159 + + p160 + p161 + p162 + p163 + p164 + p165 + p166 + p167 + + p168 + p169 + p170 + p171 + p172 + p173 + p174 + p175 + + p176 + p177 + p178 + p179 + p180 + p181 + p182 + p183 + + p184 + p185 + p186 + p187 + p188 + p189 + p190 + p191 + + p192 + p193 + p194 + p195 + p196 + p197 + p198 + p199 + + p200 + p201 + p202 + p203 + p204 + p205 + p206 + p207 + + p208 + p209 + p210 + p211 + p212 + p213 + p214 + p215 + + p216 + p217 + p218 + p219 + p220 + p221 + p222 + p223 + + p224 + p225 + p226 + p227 + p228 + p229 + p230 + p231 + + p232 + p233 + p234 + p235 + p236 + p237 + p238 + p239 + + p240 + p241 + p242 + p243 + p244 + p245 + p246 + p247 + + p248 + p249 + p250 + p251 + p252 + p253 + p254 + p255 + + p256 + p257 + p258 + p259 + p260 + p261 + p262 + p263 + + p264 + p265 + p266 + p267 + p268 + p269 + p270 + p271 + + p272 + p273 + p274 + p275 + p276 + p277 + p278 + p279 + + p280 + p281 + p282 + p283 + p284 + p285 + p286 + p287 + + p288 + p289 + p290 + p291 + p292 + p293 + p294 + p295 + + p296 + p297 + p298 + p299 + p300 + p301 + p302 + p303 + + p304 + p305 + p306 + p307 + p308 + p309 + p310 + p311 + + p312 + p313 + p314 + p315 + p316 + p317 + p318 + p319 + + p320 + p321 + p322 + p323 + p324 + p325 + p326 + p327 + + p328 + p329 + p330 + p331 + p332 + p333 + p334 + p335 + + p336 + p337 + p338 + p339 + p340 + p341 + p342 + p343 + + p344 + p345 + p346 + p347 + p348 + p349 + p350 + p351 + + p352 + p353 + p354 + p355 + p356 + p357 + p358 + p359 + + p360 + p361 + p362 + p363 + p364 + p365 + p366 + p367 + + p368 + p369 + p370 + p371 + p372 + p373 + p374 + p375 + + p376 + p377 + p378 + p379 + p380 + p381 + p382 + p383 + + p384 + p385 + p386 + p387 + p388 + p389 + p390 + p391 + + p392 + p393 + p394 + p395 + p396 + p397 + p398 + p399 + + p400 + p401 + p402 + p403 + p404 + p405 + p406 + p407 + + p408 + p409 + p410 + p411 + p412 + p413 + p414 + p415 + + p416 + p417 + p418 + p419 + p420 + p421 + p422 + p423 + + p424 + p425 + p426 + p427 + p428 + p429 + p430 + p431 + + p432 + p433 + p434 + p435 + p436 + p437 + p438 + p439 + + p440 + p441 + p442 + p443 + p444 + p445 + p446 + p447 + + p448 + p449 + p450 + p451 + p452 + p453 + p454 + p455 + + p456 + p457 + p458 + p459 + p460 + p461 + p462 + p463 + + p464 + p465 + p466 + p467 + p468 + p469 + p470 + p471 + + p472 + p473 + p474 + p475 + p476 + p477 + p478 + p479 + + p480 + p481 + p482 + p483 + p484 + p485 + p486 + p487 + + p488 + p489 + p490 + p491 + p492 + p493 + p494 + p495 + + p496 + p497 + p498 + p499 + p500 + p501 + p502 + p503 + + p504 + p505 + p506 + p507 + p508 + p509 + p510 + p511 + + p512 + p513 + p514 + p515 + p516 + p517 + p518 + p519 + + p520 + p521 + p522 + p523 + p524 + p525 + p526 + p527 + + p528 + p529 + p530 + p531 + p532 + p533 + p534 + p535 + + p536 + p537 + p538 + p539 + p540 + p541 + p542 + p543 + + p544 + p545 + p546 + p547 + p548 + p549 + p550 + p551 + + p552 + p553 + p554 + p555 + p556 + p557 + p558 + p559 + + p560 + p561 + p562 + p563 + p564 + p565 + p566 + p567 + + p568 + p569 + p570 + p571 + p572 + p573 + p574 + p575 + + p576 + p577 + p578 + p579 + p580 + p581 + p582 + p583 + + p584 + p585 + p586 + p587 + p588 + p589 + p590 + p591 + + p592 + p593 + p594 + p595 + p596 + p597 + p598 + p599 + + p600 + p601 + p602 + p603 + p604 + p605 + p606 + p607 + + p608 + p609 + p610 + p611 + p612 + p613 + p614 + p615 + + p616 + p617 + p618 + p619 + p620 + p621 + p622 + p623 + + p624 + p625 + p626 + p627 + p628 + p629 + p630 + p631 + + p632 + p633 + p634 + p635 + p636 + p637 + p638 + p639 + + p640 + p641 + p642 + p643 + p644 + p645 + p646 + p647 + + p648 + p649 + p650 + p651 + p652 + p653 + p654 + p655 + + p656 + p657 + p658 + p659 + p660 + p661 + p662 + p663 + + p664 + p665 + p666 + p667 + p668 + p669 + p670 + p671 + + p672 + p673 + p674 + p675 + p676 + p677 + p678 + p679 + + p680 + p681 + p682 + p683 + p684 + p685 + p686 + p687 + + p688 + p689 + p690 + p691 + p692 + p693 + p694 + p695 + + p696 + p697 + p698 + p699 + p700 + p701 + p702 + p703 + + p704 + p705 + p706 + p707 + p708 + p709 + p710 + p711 + + p712 + p713 + p714 + p715 + p716 + p717 + p718 + p719 + + p720 + p721 + p722 + p723 + p724 + p725 + p726 + p727 + + p728 + p729 + p730 + p731 + p732 + p733 + p734 + p735 + + p736 + p737 + p738 + p739 + p740 + p741 + p742 + p743 + + p744 + p745 + p746 + p747 + p748 + p749 + p750 + p751 + + p752 + p753 + p754 + p755 + p756 + p757 + p758 + p759 + + p760 + p761 + p762 + p763 + p764 + p765 + p766 + p767 + + p768 + p769 + p770 + p771 + p772 + p773 + p774 + p775 + + p776 + p777 + p778 + p779 + p780 + p781 + p782 + p783 + + p784 + p785 + p786 + p787 + p788 + p789 + p790 + p791 + + p792 + p793 + p794 + p795 + p796 + p797 + p798 + p799 + + p800 + p801 + p802 + p803 + p804 + p805 + p806 + p807 + + p808 + p809 + p810 + p811 + p812 + p813 + p814 + p815 + + p816 + p817 + p818 + p819 + p820 + p821 + p822 + p823 + + p824 + p825 + p826 + p827 + p828 + p829 + p830 + p831 + + p832 + p833 + p834 + p835 + p836 + p837 + p838 + p839 + + p840 + p841 + p842 + p843 + p844 + p845 + p846 + p847 + + p848 + p849 + p850 + p851 + p852 + p853 + p854 + p855 + + p856 + p857 + p858 + p859 + p860 + p861 + p862 + p863 + + p864 + p865 + p866 + p867 + p868 + p869 + p870 + p871 + + p872 + p873 + p874 + p875 + p876 + p877 + p878 + p879 + + p880 + p881 + p882 + p883 + p884 + p885 + p886 + p887 + + p888 + p889 + p890 + p891 + p892 + p893 + p894 + p895 + + p896 + p897 + p898 + p899 + p900 + p901 + p902 + p903 + + p904 + p905 + p906 + p907 + p908 + p909 + p910 + p911 + + p912 + p913 + p914 + p915 + p916 + p917 + p918 + p919 + + p920 + p921 + p922 + p923 + p924 + p925 + p926 + p927 + + p928 + p929 + p930 + p931 + p932 + p933 + p934 + p935 + + p936 + p937 + p938 + p939 + p940 + p941 + p942 + p943 + + p944 + p945 + p946 + p947 + p948 + p949 + p950 + p951 + + p952 + p953 + p954 + p955 + p956 + p957 + p958 + p959 + + p960 + p961 + p962 + p963 + p964 + p965 + p966 + p967 + + p968 + p969 + p970 + p971 + p972 + p973 + p974 + p975 + + p976 + p977 + p978 + p979 + p980 + p981 + p982 + p983 + + p984 + p985 + p986 + p987 + p988 + p989 + p990 + p991 + + p992 + p993 + p994 + p995 + p996 + p997 + p998 + p999; + return x; +} + +// clang-format on diff --git a/src/test/app/wasm_fixtures/wat/functions_5k.wat b/src/test/app/wasm_fixtures/wat/functions_5k.wat new file mode 100644 index 00000000000..819472726db --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/functions_5k.wat @@ -0,0 +1,45002 @@ +(module + (func $test0000 (export "test0000") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0001 (export "test0001") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0002 (export "test0002") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0003 (export "test0003") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0004 (export "test0004") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0005 (export "test0005") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0006 (export "test0006") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0007 (export "test0007") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0008 (export "test0008") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0009 (export "test0009") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0010 (export "test0010") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0011 (export "test0011") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0012 (export "test0012") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0013 (export "test0013") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0014 (export "test0014") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0015 (export "test0015") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0016 (export "test0016") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0017 (export "test0017") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0018 (export "test0018") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0019 (export "test0019") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0020 (export "test0020") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0021 (export "test0021") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0022 (export "test0022") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0023 (export "test0023") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0024 (export "test0024") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0025 (export "test0025") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0026 (export "test0026") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0027 (export "test0027") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0028 (export "test0028") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0029 (export "test0029") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0030 (export "test0030") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0031 (export "test0031") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0032 (export "test0032") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0033 (export "test0033") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0034 (export "test0034") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0035 (export "test0035") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0036 (export "test0036") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0037 (export "test0037") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0038 (export "test0038") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0039 (export "test0039") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0040 (export "test0040") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0041 (export "test0041") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0042 (export "test0042") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0043 (export "test0043") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0044 (export "test0044") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0045 (export "test0045") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0046 (export "test0046") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0047 (export "test0047") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0048 (export "test0048") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0049 (export "test0049") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0050 (export "test0050") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0051 (export "test0051") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0052 (export "test0052") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0053 (export "test0053") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0054 (export "test0054") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0055 (export "test0055") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0056 (export "test0056") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0057 (export "test0057") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0058 (export "test0058") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0059 (export "test0059") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0060 (export "test0060") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0061 (export "test0061") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0062 (export "test0062") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0063 (export "test0063") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0064 (export "test0064") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0065 (export "test0065") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0066 (export "test0066") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0067 (export "test0067") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0068 (export "test0068") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0069 (export "test0069") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0070 (export "test0070") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0071 (export "test0071") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0072 (export "test0072") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0073 (export "test0073") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0074 (export "test0074") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0075 (export "test0075") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0076 (export "test0076") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0077 (export "test0077") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0078 (export "test0078") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0079 (export "test0079") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0080 (export "test0080") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0081 (export "test0081") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0082 (export "test0082") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0083 (export "test0083") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0084 (export "test0084") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0085 (export "test0085") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0086 (export "test0086") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0087 (export "test0087") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0088 (export "test0088") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0089 (export "test0089") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0090 (export "test0090") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0091 (export "test0091") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0092 (export "test0092") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0093 (export "test0093") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0094 (export "test0094") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0095 (export "test0095") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0096 (export "test0096") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0097 (export "test0097") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0098 (export "test0098") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0099 (export "test0099") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0100 (export "test0100") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0101 (export "test0101") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0102 (export "test0102") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0103 (export "test0103") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0104 (export "test0104") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0105 (export "test0105") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0106 (export "test0106") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0107 (export "test0107") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0108 (export "test0108") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0109 (export "test0109") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0110 (export "test0110") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0111 (export "test0111") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0112 (export "test0112") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0113 (export "test0113") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0114 (export "test0114") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0115 (export "test0115") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0116 (export "test0116") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0117 (export "test0117") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0118 (export "test0118") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0119 (export "test0119") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0120 (export "test0120") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0121 (export "test0121") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0122 (export "test0122") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0123 (export "test0123") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0124 (export "test0124") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0125 (export "test0125") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0126 (export "test0126") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0127 (export "test0127") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0128 (export "test0128") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0129 (export "test0129") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0130 (export "test0130") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0131 (export "test0131") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0132 (export "test0132") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0133 (export "test0133") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0134 (export "test0134") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0135 (export "test0135") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0136 (export "test0136") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0137 (export "test0137") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0138 (export "test0138") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0139 (export "test0139") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0140 (export "test0140") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0141 (export "test0141") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0142 (export "test0142") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0143 (export "test0143") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0144 (export "test0144") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0145 (export "test0145") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0146 (export "test0146") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0147 (export "test0147") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0148 (export "test0148") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0149 (export "test0149") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0150 (export "test0150") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0151 (export "test0151") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0152 (export "test0152") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0153 (export "test0153") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0154 (export "test0154") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0155 (export "test0155") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0156 (export "test0156") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0157 (export "test0157") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0158 (export "test0158") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0159 (export "test0159") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0160 (export "test0160") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0161 (export "test0161") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0162 (export "test0162") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0163 (export "test0163") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0164 (export "test0164") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0165 (export "test0165") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0166 (export "test0166") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0167 (export "test0167") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0168 (export "test0168") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0169 (export "test0169") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0170 (export "test0170") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0171 (export "test0171") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0172 (export "test0172") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0173 (export "test0173") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0174 (export "test0174") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0175 (export "test0175") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0176 (export "test0176") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0177 (export "test0177") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0178 (export "test0178") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0179 (export "test0179") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0180 (export "test0180") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0181 (export "test0181") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0182 (export "test0182") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0183 (export "test0183") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0184 (export "test0184") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0185 (export "test0185") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0186 (export "test0186") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0187 (export "test0187") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0188 (export "test0188") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0189 (export "test0189") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0190 (export "test0190") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0191 (export "test0191") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0192 (export "test0192") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0193 (export "test0193") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0194 (export "test0194") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0195 (export "test0195") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0196 (export "test0196") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0197 (export "test0197") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0198 (export "test0198") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0199 (export "test0199") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0200 (export "test0200") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0201 (export "test0201") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0202 (export "test0202") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0203 (export "test0203") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0204 (export "test0204") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0205 (export "test0205") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0206 (export "test0206") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0207 (export "test0207") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0208 (export "test0208") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0209 (export "test0209") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0210 (export "test0210") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0211 (export "test0211") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0212 (export "test0212") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0213 (export "test0213") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0214 (export "test0214") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0215 (export "test0215") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0216 (export "test0216") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0217 (export "test0217") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0218 (export "test0218") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0219 (export "test0219") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0220 (export "test0220") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0221 (export "test0221") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0222 (export "test0222") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0223 (export "test0223") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0224 (export "test0224") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0225 (export "test0225") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0226 (export "test0226") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0227 (export "test0227") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0228 (export "test0228") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0229 (export "test0229") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0230 (export "test0230") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0231 (export "test0231") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0232 (export "test0232") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0233 (export "test0233") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0234 (export "test0234") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0235 (export "test0235") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0236 (export "test0236") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0237 (export "test0237") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0238 (export "test0238") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0239 (export "test0239") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0240 (export "test0240") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0241 (export "test0241") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0242 (export "test0242") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0243 (export "test0243") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0244 (export "test0244") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0245 (export "test0245") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0246 (export "test0246") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0247 (export "test0247") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0248 (export "test0248") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0249 (export "test0249") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0250 (export "test0250") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0251 (export "test0251") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0252 (export "test0252") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0253 (export "test0253") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0254 (export "test0254") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0255 (export "test0255") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0256 (export "test0256") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0257 (export "test0257") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0258 (export "test0258") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0259 (export "test0259") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0260 (export "test0260") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0261 (export "test0261") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0262 (export "test0262") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0263 (export "test0263") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0264 (export "test0264") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0265 (export "test0265") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0266 (export "test0266") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0267 (export "test0267") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0268 (export "test0268") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0269 (export "test0269") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0270 (export "test0270") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0271 (export "test0271") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0272 (export "test0272") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0273 (export "test0273") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0274 (export "test0274") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0275 (export "test0275") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0276 (export "test0276") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0277 (export "test0277") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0278 (export "test0278") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0279 (export "test0279") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0280 (export "test0280") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0281 (export "test0281") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0282 (export "test0282") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0283 (export "test0283") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0284 (export "test0284") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0285 (export "test0285") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0286 (export "test0286") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0287 (export "test0287") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0288 (export "test0288") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0289 (export "test0289") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0290 (export "test0290") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0291 (export "test0291") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0292 (export "test0292") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0293 (export "test0293") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0294 (export "test0294") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0295 (export "test0295") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0296 (export "test0296") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0297 (export "test0297") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0298 (export "test0298") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0299 (export "test0299") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0300 (export "test0300") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0301 (export "test0301") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0302 (export "test0302") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0303 (export "test0303") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0304 (export "test0304") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0305 (export "test0305") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0306 (export "test0306") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0307 (export "test0307") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0308 (export "test0308") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0309 (export "test0309") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0310 (export "test0310") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0311 (export "test0311") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0312 (export "test0312") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0313 (export "test0313") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0314 (export "test0314") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0315 (export "test0315") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0316 (export "test0316") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0317 (export "test0317") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0318 (export "test0318") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0319 (export "test0319") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0320 (export "test0320") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0321 (export "test0321") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0322 (export "test0322") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0323 (export "test0323") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0324 (export "test0324") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0325 (export "test0325") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0326 (export "test0326") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0327 (export "test0327") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0328 (export "test0328") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0329 (export "test0329") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0330 (export "test0330") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0331 (export "test0331") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0332 (export "test0332") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0333 (export "test0333") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0334 (export "test0334") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0335 (export "test0335") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0336 (export "test0336") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0337 (export "test0337") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0338 (export "test0338") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0339 (export "test0339") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0340 (export "test0340") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0341 (export "test0341") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0342 (export "test0342") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0343 (export "test0343") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0344 (export "test0344") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0345 (export "test0345") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0346 (export "test0346") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0347 (export "test0347") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0348 (export "test0348") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0349 (export "test0349") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0350 (export "test0350") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0351 (export "test0351") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0352 (export "test0352") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0353 (export "test0353") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0354 (export "test0354") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0355 (export "test0355") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0356 (export "test0356") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0357 (export "test0357") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0358 (export "test0358") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0359 (export "test0359") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0360 (export "test0360") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0361 (export "test0361") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0362 (export "test0362") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0363 (export "test0363") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0364 (export "test0364") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0365 (export "test0365") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0366 (export "test0366") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0367 (export "test0367") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0368 (export "test0368") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0369 (export "test0369") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0370 (export "test0370") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0371 (export "test0371") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0372 (export "test0372") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0373 (export "test0373") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0374 (export "test0374") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0375 (export "test0375") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0376 (export "test0376") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0377 (export "test0377") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0378 (export "test0378") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0379 (export "test0379") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0380 (export "test0380") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0381 (export "test0381") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0382 (export "test0382") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0383 (export "test0383") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0384 (export "test0384") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0385 (export "test0385") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0386 (export "test0386") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0387 (export "test0387") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0388 (export "test0388") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0389 (export "test0389") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0390 (export "test0390") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0391 (export "test0391") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0392 (export "test0392") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0393 (export "test0393") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0394 (export "test0394") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0395 (export "test0395") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0396 (export "test0396") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0397 (export "test0397") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0398 (export "test0398") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0399 (export "test0399") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0400 (export "test0400") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0401 (export "test0401") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0402 (export "test0402") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0403 (export "test0403") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0404 (export "test0404") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0405 (export "test0405") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0406 (export "test0406") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0407 (export "test0407") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0408 (export "test0408") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0409 (export "test0409") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0410 (export "test0410") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0411 (export "test0411") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0412 (export "test0412") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0413 (export "test0413") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0414 (export "test0414") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0415 (export "test0415") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0416 (export "test0416") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0417 (export "test0417") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0418 (export "test0418") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0419 (export "test0419") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0420 (export "test0420") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0421 (export "test0421") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0422 (export "test0422") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0423 (export "test0423") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0424 (export "test0424") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0425 (export "test0425") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0426 (export "test0426") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0427 (export "test0427") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0428 (export "test0428") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0429 (export "test0429") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0430 (export "test0430") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0431 (export "test0431") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0432 (export "test0432") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0433 (export "test0433") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0434 (export "test0434") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0435 (export "test0435") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0436 (export "test0436") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0437 (export "test0437") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0438 (export "test0438") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0439 (export "test0439") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0440 (export "test0440") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0441 (export "test0441") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0442 (export "test0442") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0443 (export "test0443") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0444 (export "test0444") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0445 (export "test0445") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0446 (export "test0446") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0447 (export "test0447") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0448 (export "test0448") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0449 (export "test0449") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0450 (export "test0450") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0451 (export "test0451") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0452 (export "test0452") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0453 (export "test0453") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0454 (export "test0454") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0455 (export "test0455") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0456 (export "test0456") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0457 (export "test0457") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0458 (export "test0458") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0459 (export "test0459") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0460 (export "test0460") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0461 (export "test0461") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0462 (export "test0462") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0463 (export "test0463") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0464 (export "test0464") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0465 (export "test0465") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0466 (export "test0466") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0467 (export "test0467") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0468 (export "test0468") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0469 (export "test0469") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0470 (export "test0470") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0471 (export "test0471") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0472 (export "test0472") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0473 (export "test0473") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0474 (export "test0474") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0475 (export "test0475") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0476 (export "test0476") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0477 (export "test0477") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0478 (export "test0478") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0479 (export "test0479") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0480 (export "test0480") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0481 (export "test0481") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0482 (export "test0482") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0483 (export "test0483") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0484 (export "test0484") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0485 (export "test0485") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0486 (export "test0486") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0487 (export "test0487") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0488 (export "test0488") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0489 (export "test0489") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0490 (export "test0490") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0491 (export "test0491") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0492 (export "test0492") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0493 (export "test0493") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0494 (export "test0494") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0495 (export "test0495") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0496 (export "test0496") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0497 (export "test0497") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0498 (export "test0498") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0499 (export "test0499") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0500 (export "test0500") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0501 (export "test0501") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0502 (export "test0502") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0503 (export "test0503") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0504 (export "test0504") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0505 (export "test0505") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0506 (export "test0506") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0507 (export "test0507") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0508 (export "test0508") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0509 (export "test0509") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0510 (export "test0510") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0511 (export "test0511") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0512 (export "test0512") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0513 (export "test0513") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0514 (export "test0514") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0515 (export "test0515") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0516 (export "test0516") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0517 (export "test0517") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0518 (export "test0518") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0519 (export "test0519") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0520 (export "test0520") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0521 (export "test0521") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0522 (export "test0522") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0523 (export "test0523") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0524 (export "test0524") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0525 (export "test0525") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0526 (export "test0526") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0527 (export "test0527") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0528 (export "test0528") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0529 (export "test0529") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0530 (export "test0530") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0531 (export "test0531") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0532 (export "test0532") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0533 (export "test0533") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0534 (export "test0534") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0535 (export "test0535") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0536 (export "test0536") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0537 (export "test0537") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0538 (export "test0538") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0539 (export "test0539") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0540 (export "test0540") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0541 (export "test0541") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0542 (export "test0542") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0543 (export "test0543") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0544 (export "test0544") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0545 (export "test0545") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0546 (export "test0546") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0547 (export "test0547") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0548 (export "test0548") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0549 (export "test0549") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0550 (export "test0550") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0551 (export "test0551") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0552 (export "test0552") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0553 (export "test0553") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0554 (export "test0554") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0555 (export "test0555") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0556 (export "test0556") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0557 (export "test0557") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0558 (export "test0558") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0559 (export "test0559") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0560 (export "test0560") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0561 (export "test0561") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0562 (export "test0562") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0563 (export "test0563") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0564 (export "test0564") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0565 (export "test0565") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0566 (export "test0566") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0567 (export "test0567") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0568 (export "test0568") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0569 (export "test0569") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0570 (export "test0570") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0571 (export "test0571") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0572 (export "test0572") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0573 (export "test0573") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0574 (export "test0574") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0575 (export "test0575") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0576 (export "test0576") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0577 (export "test0577") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0578 (export "test0578") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0579 (export "test0579") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0580 (export "test0580") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0581 (export "test0581") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0582 (export "test0582") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0583 (export "test0583") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0584 (export "test0584") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0585 (export "test0585") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0586 (export "test0586") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0587 (export "test0587") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0588 (export "test0588") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0589 (export "test0589") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0590 (export "test0590") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0591 (export "test0591") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0592 (export "test0592") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0593 (export "test0593") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0594 (export "test0594") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0595 (export "test0595") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0596 (export "test0596") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0597 (export "test0597") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0598 (export "test0598") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0599 (export "test0599") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0600 (export "test0600") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0601 (export "test0601") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0602 (export "test0602") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0603 (export "test0603") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0604 (export "test0604") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0605 (export "test0605") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0606 (export "test0606") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0607 (export "test0607") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0608 (export "test0608") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0609 (export "test0609") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0610 (export "test0610") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0611 (export "test0611") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0612 (export "test0612") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0613 (export "test0613") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0614 (export "test0614") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0615 (export "test0615") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0616 (export "test0616") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0617 (export "test0617") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0618 (export "test0618") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0619 (export "test0619") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0620 (export "test0620") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0621 (export "test0621") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0622 (export "test0622") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0623 (export "test0623") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0624 (export "test0624") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0625 (export "test0625") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0626 (export "test0626") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0627 (export "test0627") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0628 (export "test0628") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0629 (export "test0629") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0630 (export "test0630") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0631 (export "test0631") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0632 (export "test0632") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0633 (export "test0633") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0634 (export "test0634") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0635 (export "test0635") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0636 (export "test0636") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0637 (export "test0637") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0638 (export "test0638") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0639 (export "test0639") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0640 (export "test0640") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0641 (export "test0641") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0642 (export "test0642") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0643 (export "test0643") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0644 (export "test0644") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0645 (export "test0645") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0646 (export "test0646") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0647 (export "test0647") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0648 (export "test0648") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0649 (export "test0649") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0650 (export "test0650") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0651 (export "test0651") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0652 (export "test0652") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0653 (export "test0653") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0654 (export "test0654") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0655 (export "test0655") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0656 (export "test0656") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0657 (export "test0657") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0658 (export "test0658") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0659 (export "test0659") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0660 (export "test0660") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0661 (export "test0661") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0662 (export "test0662") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0663 (export "test0663") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0664 (export "test0664") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0665 (export "test0665") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0666 (export "test0666") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0667 (export "test0667") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0668 (export "test0668") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0669 (export "test0669") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0670 (export "test0670") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0671 (export "test0671") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0672 (export "test0672") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0673 (export "test0673") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0674 (export "test0674") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0675 (export "test0675") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0676 (export "test0676") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0677 (export "test0677") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0678 (export "test0678") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0679 (export "test0679") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0680 (export "test0680") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0681 (export "test0681") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0682 (export "test0682") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0683 (export "test0683") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0684 (export "test0684") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0685 (export "test0685") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0686 (export "test0686") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0687 (export "test0687") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0688 (export "test0688") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0689 (export "test0689") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0690 (export "test0690") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0691 (export "test0691") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0692 (export "test0692") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0693 (export "test0693") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0694 (export "test0694") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0695 (export "test0695") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0696 (export "test0696") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0697 (export "test0697") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0698 (export "test0698") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0699 (export "test0699") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0700 (export "test0700") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0701 (export "test0701") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0702 (export "test0702") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0703 (export "test0703") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0704 (export "test0704") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0705 (export "test0705") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0706 (export "test0706") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0707 (export "test0707") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0708 (export "test0708") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0709 (export "test0709") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0710 (export "test0710") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0711 (export "test0711") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0712 (export "test0712") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0713 (export "test0713") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0714 (export "test0714") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0715 (export "test0715") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0716 (export "test0716") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0717 (export "test0717") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0718 (export "test0718") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0719 (export "test0719") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0720 (export "test0720") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0721 (export "test0721") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0722 (export "test0722") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0723 (export "test0723") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0724 (export "test0724") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0725 (export "test0725") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0726 (export "test0726") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0727 (export "test0727") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0728 (export "test0728") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0729 (export "test0729") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0730 (export "test0730") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0731 (export "test0731") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0732 (export "test0732") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0733 (export "test0733") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0734 (export "test0734") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0735 (export "test0735") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0736 (export "test0736") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0737 (export "test0737") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0738 (export "test0738") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0739 (export "test0739") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0740 (export "test0740") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0741 (export "test0741") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0742 (export "test0742") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0743 (export "test0743") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0744 (export "test0744") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0745 (export "test0745") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0746 (export "test0746") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0747 (export "test0747") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0748 (export "test0748") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0749 (export "test0749") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0750 (export "test0750") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0751 (export "test0751") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0752 (export "test0752") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0753 (export "test0753") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0754 (export "test0754") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0755 (export "test0755") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0756 (export "test0756") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0757 (export "test0757") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0758 (export "test0758") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0759 (export "test0759") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0760 (export "test0760") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0761 (export "test0761") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0762 (export "test0762") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0763 (export "test0763") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0764 (export "test0764") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0765 (export "test0765") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0766 (export "test0766") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0767 (export "test0767") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0768 (export "test0768") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0769 (export "test0769") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0770 (export "test0770") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0771 (export "test0771") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0772 (export "test0772") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0773 (export "test0773") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0774 (export "test0774") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0775 (export "test0775") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0776 (export "test0776") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0777 (export "test0777") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0778 (export "test0778") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0779 (export "test0779") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0780 (export "test0780") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0781 (export "test0781") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0782 (export "test0782") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0783 (export "test0783") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0784 (export "test0784") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0785 (export "test0785") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0786 (export "test0786") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0787 (export "test0787") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0788 (export "test0788") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0789 (export "test0789") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0790 (export "test0790") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0791 (export "test0791") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0792 (export "test0792") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0793 (export "test0793") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0794 (export "test0794") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0795 (export "test0795") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0796 (export "test0796") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0797 (export "test0797") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0798 (export "test0798") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0799 (export "test0799") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0800 (export "test0800") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0801 (export "test0801") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0802 (export "test0802") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0803 (export "test0803") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0804 (export "test0804") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0805 (export "test0805") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0806 (export "test0806") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0807 (export "test0807") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0808 (export "test0808") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0809 (export "test0809") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0810 (export "test0810") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0811 (export "test0811") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0812 (export "test0812") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0813 (export "test0813") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0814 (export "test0814") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0815 (export "test0815") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0816 (export "test0816") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0817 (export "test0817") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0818 (export "test0818") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0819 (export "test0819") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0820 (export "test0820") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0821 (export "test0821") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0822 (export "test0822") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0823 (export "test0823") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0824 (export "test0824") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0825 (export "test0825") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0826 (export "test0826") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0827 (export "test0827") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0828 (export "test0828") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0829 (export "test0829") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0830 (export "test0830") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0831 (export "test0831") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0832 (export "test0832") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0833 (export "test0833") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0834 (export "test0834") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0835 (export "test0835") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0836 (export "test0836") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0837 (export "test0837") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0838 (export "test0838") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0839 (export "test0839") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0840 (export "test0840") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0841 (export "test0841") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0842 (export "test0842") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0843 (export "test0843") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0844 (export "test0844") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0845 (export "test0845") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0846 (export "test0846") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0847 (export "test0847") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0848 (export "test0848") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0849 (export "test0849") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0850 (export "test0850") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0851 (export "test0851") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0852 (export "test0852") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0853 (export "test0853") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0854 (export "test0854") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0855 (export "test0855") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0856 (export "test0856") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0857 (export "test0857") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0858 (export "test0858") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0859 (export "test0859") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0860 (export "test0860") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0861 (export "test0861") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0862 (export "test0862") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0863 (export "test0863") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0864 (export "test0864") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0865 (export "test0865") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0866 (export "test0866") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0867 (export "test0867") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0868 (export "test0868") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0869 (export "test0869") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0870 (export "test0870") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0871 (export "test0871") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0872 (export "test0872") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0873 (export "test0873") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0874 (export "test0874") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0875 (export "test0875") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0876 (export "test0876") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0877 (export "test0877") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0878 (export "test0878") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0879 (export "test0879") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0880 (export "test0880") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0881 (export "test0881") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0882 (export "test0882") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0883 (export "test0883") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0884 (export "test0884") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0885 (export "test0885") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0886 (export "test0886") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0887 (export "test0887") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0888 (export "test0888") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0889 (export "test0889") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0890 (export "test0890") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0891 (export "test0891") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0892 (export "test0892") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0893 (export "test0893") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0894 (export "test0894") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0895 (export "test0895") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0896 (export "test0896") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0897 (export "test0897") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0898 (export "test0898") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0899 (export "test0899") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0900 (export "test0900") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0901 (export "test0901") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0902 (export "test0902") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0903 (export "test0903") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0904 (export "test0904") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0905 (export "test0905") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0906 (export "test0906") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0907 (export "test0907") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0908 (export "test0908") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0909 (export "test0909") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0910 (export "test0910") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0911 (export "test0911") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0912 (export "test0912") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0913 (export "test0913") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0914 (export "test0914") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0915 (export "test0915") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0916 (export "test0916") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0917 (export "test0917") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0918 (export "test0918") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0919 (export "test0919") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0920 (export "test0920") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0921 (export "test0921") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0922 (export "test0922") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0923 (export "test0923") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0924 (export "test0924") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0925 (export "test0925") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0926 (export "test0926") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0927 (export "test0927") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0928 (export "test0928") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0929 (export "test0929") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0930 (export "test0930") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0931 (export "test0931") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0932 (export "test0932") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0933 (export "test0933") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0934 (export "test0934") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0935 (export "test0935") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0936 (export "test0936") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0937 (export "test0937") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0938 (export "test0938") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0939 (export "test0939") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0940 (export "test0940") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0941 (export "test0941") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0942 (export "test0942") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0943 (export "test0943") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0944 (export "test0944") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0945 (export "test0945") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0946 (export "test0946") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0947 (export "test0947") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0948 (export "test0948") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0949 (export "test0949") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0950 (export "test0950") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0951 (export "test0951") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0952 (export "test0952") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0953 (export "test0953") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0954 (export "test0954") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0955 (export "test0955") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0956 (export "test0956") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0957 (export "test0957") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0958 (export "test0958") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0959 (export "test0959") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0960 (export "test0960") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0961 (export "test0961") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0962 (export "test0962") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0963 (export "test0963") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0964 (export "test0964") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0965 (export "test0965") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0966 (export "test0966") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0967 (export "test0967") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0968 (export "test0968") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0969 (export "test0969") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0970 (export "test0970") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0971 (export "test0971") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0972 (export "test0972") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0973 (export "test0973") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0974 (export "test0974") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0975 (export "test0975") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0976 (export "test0976") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0977 (export "test0977") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0978 (export "test0978") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0979 (export "test0979") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0980 (export "test0980") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0981 (export "test0981") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0982 (export "test0982") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0983 (export "test0983") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0984 (export "test0984") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0985 (export "test0985") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0986 (export "test0986") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0987 (export "test0987") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0988 (export "test0988") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0989 (export "test0989") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0990 (export "test0990") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0991 (export "test0991") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0992 (export "test0992") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0993 (export "test0993") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0994 (export "test0994") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0995 (export "test0995") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0996 (export "test0996") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0997 (export "test0997") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0998 (export "test0998") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test0999 (export "test0999") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1000 (export "test1000") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1001 (export "test1001") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1002 (export "test1002") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1003 (export "test1003") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1004 (export "test1004") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1005 (export "test1005") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1006 (export "test1006") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1007 (export "test1007") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1008 (export "test1008") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1009 (export "test1009") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1010 (export "test1010") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1011 (export "test1011") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1012 (export "test1012") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1013 (export "test1013") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1014 (export "test1014") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1015 (export "test1015") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1016 (export "test1016") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1017 (export "test1017") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1018 (export "test1018") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1019 (export "test1019") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1020 (export "test1020") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1021 (export "test1021") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1022 (export "test1022") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1023 (export "test1023") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1024 (export "test1024") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1025 (export "test1025") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1026 (export "test1026") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1027 (export "test1027") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1028 (export "test1028") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1029 (export "test1029") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1030 (export "test1030") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1031 (export "test1031") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1032 (export "test1032") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1033 (export "test1033") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1034 (export "test1034") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1035 (export "test1035") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1036 (export "test1036") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1037 (export "test1037") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1038 (export "test1038") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1039 (export "test1039") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1040 (export "test1040") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1041 (export "test1041") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1042 (export "test1042") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1043 (export "test1043") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1044 (export "test1044") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1045 (export "test1045") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1046 (export "test1046") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1047 (export "test1047") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1048 (export "test1048") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1049 (export "test1049") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1050 (export "test1050") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1051 (export "test1051") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1052 (export "test1052") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1053 (export "test1053") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1054 (export "test1054") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1055 (export "test1055") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1056 (export "test1056") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1057 (export "test1057") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1058 (export "test1058") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1059 (export "test1059") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1060 (export "test1060") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1061 (export "test1061") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1062 (export "test1062") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1063 (export "test1063") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1064 (export "test1064") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1065 (export "test1065") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1066 (export "test1066") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1067 (export "test1067") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1068 (export "test1068") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1069 (export "test1069") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1070 (export "test1070") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1071 (export "test1071") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1072 (export "test1072") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1073 (export "test1073") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1074 (export "test1074") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1075 (export "test1075") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1076 (export "test1076") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1077 (export "test1077") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1078 (export "test1078") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1079 (export "test1079") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1080 (export "test1080") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1081 (export "test1081") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1082 (export "test1082") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1083 (export "test1083") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1084 (export "test1084") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1085 (export "test1085") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1086 (export "test1086") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1087 (export "test1087") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1088 (export "test1088") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1089 (export "test1089") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1090 (export "test1090") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1091 (export "test1091") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1092 (export "test1092") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1093 (export "test1093") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1094 (export "test1094") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1095 (export "test1095") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1096 (export "test1096") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1097 (export "test1097") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1098 (export "test1098") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1099 (export "test1099") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1100 (export "test1100") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1101 (export "test1101") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1102 (export "test1102") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1103 (export "test1103") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1104 (export "test1104") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1105 (export "test1105") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1106 (export "test1106") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1107 (export "test1107") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1108 (export "test1108") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1109 (export "test1109") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1110 (export "test1110") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1111 (export "test1111") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1112 (export "test1112") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1113 (export "test1113") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1114 (export "test1114") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1115 (export "test1115") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1116 (export "test1116") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1117 (export "test1117") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1118 (export "test1118") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1119 (export "test1119") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1120 (export "test1120") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1121 (export "test1121") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1122 (export "test1122") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1123 (export "test1123") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1124 (export "test1124") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1125 (export "test1125") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1126 (export "test1126") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1127 (export "test1127") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1128 (export "test1128") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1129 (export "test1129") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1130 (export "test1130") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1131 (export "test1131") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1132 (export "test1132") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1133 (export "test1133") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1134 (export "test1134") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1135 (export "test1135") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1136 (export "test1136") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1137 (export "test1137") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1138 (export "test1138") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1139 (export "test1139") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1140 (export "test1140") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1141 (export "test1141") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1142 (export "test1142") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1143 (export "test1143") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1144 (export "test1144") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1145 (export "test1145") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1146 (export "test1146") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1147 (export "test1147") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1148 (export "test1148") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1149 (export "test1149") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1150 (export "test1150") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1151 (export "test1151") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1152 (export "test1152") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1153 (export "test1153") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1154 (export "test1154") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1155 (export "test1155") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1156 (export "test1156") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1157 (export "test1157") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1158 (export "test1158") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1159 (export "test1159") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1160 (export "test1160") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1161 (export "test1161") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1162 (export "test1162") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1163 (export "test1163") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1164 (export "test1164") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1165 (export "test1165") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1166 (export "test1166") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1167 (export "test1167") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1168 (export "test1168") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1169 (export "test1169") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1170 (export "test1170") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1171 (export "test1171") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1172 (export "test1172") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1173 (export "test1173") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1174 (export "test1174") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1175 (export "test1175") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1176 (export "test1176") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1177 (export "test1177") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1178 (export "test1178") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1179 (export "test1179") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1180 (export "test1180") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1181 (export "test1181") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1182 (export "test1182") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1183 (export "test1183") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1184 (export "test1184") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1185 (export "test1185") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1186 (export "test1186") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1187 (export "test1187") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1188 (export "test1188") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1189 (export "test1189") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1190 (export "test1190") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1191 (export "test1191") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1192 (export "test1192") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1193 (export "test1193") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1194 (export "test1194") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1195 (export "test1195") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1196 (export "test1196") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1197 (export "test1197") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1198 (export "test1198") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1199 (export "test1199") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1200 (export "test1200") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1201 (export "test1201") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1202 (export "test1202") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1203 (export "test1203") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1204 (export "test1204") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1205 (export "test1205") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1206 (export "test1206") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1207 (export "test1207") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1208 (export "test1208") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1209 (export "test1209") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1210 (export "test1210") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1211 (export "test1211") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1212 (export "test1212") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1213 (export "test1213") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1214 (export "test1214") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1215 (export "test1215") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1216 (export "test1216") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1217 (export "test1217") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1218 (export "test1218") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1219 (export "test1219") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1220 (export "test1220") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1221 (export "test1221") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1222 (export "test1222") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1223 (export "test1223") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1224 (export "test1224") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1225 (export "test1225") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1226 (export "test1226") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1227 (export "test1227") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1228 (export "test1228") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1229 (export "test1229") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1230 (export "test1230") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1231 (export "test1231") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1232 (export "test1232") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1233 (export "test1233") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1234 (export "test1234") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1235 (export "test1235") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1236 (export "test1236") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1237 (export "test1237") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1238 (export "test1238") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1239 (export "test1239") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1240 (export "test1240") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1241 (export "test1241") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1242 (export "test1242") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1243 (export "test1243") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1244 (export "test1244") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1245 (export "test1245") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1246 (export "test1246") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1247 (export "test1247") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1248 (export "test1248") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1249 (export "test1249") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1250 (export "test1250") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1251 (export "test1251") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1252 (export "test1252") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1253 (export "test1253") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1254 (export "test1254") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1255 (export "test1255") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1256 (export "test1256") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1257 (export "test1257") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1258 (export "test1258") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1259 (export "test1259") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1260 (export "test1260") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1261 (export "test1261") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1262 (export "test1262") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1263 (export "test1263") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1264 (export "test1264") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1265 (export "test1265") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1266 (export "test1266") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1267 (export "test1267") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1268 (export "test1268") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1269 (export "test1269") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1270 (export "test1270") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1271 (export "test1271") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1272 (export "test1272") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1273 (export "test1273") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1274 (export "test1274") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1275 (export "test1275") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1276 (export "test1276") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1277 (export "test1277") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1278 (export "test1278") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1279 (export "test1279") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1280 (export "test1280") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1281 (export "test1281") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1282 (export "test1282") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1283 (export "test1283") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1284 (export "test1284") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1285 (export "test1285") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1286 (export "test1286") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1287 (export "test1287") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1288 (export "test1288") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1289 (export "test1289") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1290 (export "test1290") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1291 (export "test1291") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1292 (export "test1292") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1293 (export "test1293") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1294 (export "test1294") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1295 (export "test1295") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1296 (export "test1296") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1297 (export "test1297") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1298 (export "test1298") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1299 (export "test1299") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1300 (export "test1300") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1301 (export "test1301") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1302 (export "test1302") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1303 (export "test1303") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1304 (export "test1304") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1305 (export "test1305") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1306 (export "test1306") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1307 (export "test1307") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1308 (export "test1308") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1309 (export "test1309") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1310 (export "test1310") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1311 (export "test1311") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1312 (export "test1312") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1313 (export "test1313") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1314 (export "test1314") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1315 (export "test1315") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1316 (export "test1316") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1317 (export "test1317") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1318 (export "test1318") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1319 (export "test1319") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1320 (export "test1320") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1321 (export "test1321") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1322 (export "test1322") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1323 (export "test1323") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1324 (export "test1324") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1325 (export "test1325") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1326 (export "test1326") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1327 (export "test1327") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1328 (export "test1328") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1329 (export "test1329") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1330 (export "test1330") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1331 (export "test1331") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1332 (export "test1332") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1333 (export "test1333") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1334 (export "test1334") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1335 (export "test1335") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1336 (export "test1336") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1337 (export "test1337") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1338 (export "test1338") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1339 (export "test1339") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1340 (export "test1340") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1341 (export "test1341") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1342 (export "test1342") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1343 (export "test1343") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1344 (export "test1344") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1345 (export "test1345") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1346 (export "test1346") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1347 (export "test1347") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1348 (export "test1348") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1349 (export "test1349") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1350 (export "test1350") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1351 (export "test1351") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1352 (export "test1352") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1353 (export "test1353") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1354 (export "test1354") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1355 (export "test1355") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1356 (export "test1356") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1357 (export "test1357") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1358 (export "test1358") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1359 (export "test1359") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1360 (export "test1360") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1361 (export "test1361") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1362 (export "test1362") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1363 (export "test1363") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1364 (export "test1364") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1365 (export "test1365") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1366 (export "test1366") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1367 (export "test1367") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1368 (export "test1368") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1369 (export "test1369") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1370 (export "test1370") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1371 (export "test1371") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1372 (export "test1372") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1373 (export "test1373") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1374 (export "test1374") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1375 (export "test1375") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1376 (export "test1376") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1377 (export "test1377") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1378 (export "test1378") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1379 (export "test1379") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1380 (export "test1380") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1381 (export "test1381") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1382 (export "test1382") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1383 (export "test1383") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1384 (export "test1384") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1385 (export "test1385") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1386 (export "test1386") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1387 (export "test1387") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1388 (export "test1388") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1389 (export "test1389") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1390 (export "test1390") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1391 (export "test1391") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1392 (export "test1392") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1393 (export "test1393") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1394 (export "test1394") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1395 (export "test1395") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1396 (export "test1396") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1397 (export "test1397") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1398 (export "test1398") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1399 (export "test1399") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1400 (export "test1400") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1401 (export "test1401") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1402 (export "test1402") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1403 (export "test1403") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1404 (export "test1404") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1405 (export "test1405") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1406 (export "test1406") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1407 (export "test1407") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1408 (export "test1408") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1409 (export "test1409") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1410 (export "test1410") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1411 (export "test1411") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1412 (export "test1412") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1413 (export "test1413") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1414 (export "test1414") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1415 (export "test1415") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1416 (export "test1416") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1417 (export "test1417") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1418 (export "test1418") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1419 (export "test1419") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1420 (export "test1420") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1421 (export "test1421") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1422 (export "test1422") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1423 (export "test1423") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1424 (export "test1424") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1425 (export "test1425") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1426 (export "test1426") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1427 (export "test1427") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1428 (export "test1428") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1429 (export "test1429") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1430 (export "test1430") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1431 (export "test1431") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1432 (export "test1432") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1433 (export "test1433") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1434 (export "test1434") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1435 (export "test1435") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1436 (export "test1436") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1437 (export "test1437") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1438 (export "test1438") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1439 (export "test1439") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1440 (export "test1440") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1441 (export "test1441") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1442 (export "test1442") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1443 (export "test1443") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1444 (export "test1444") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1445 (export "test1445") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1446 (export "test1446") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1447 (export "test1447") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1448 (export "test1448") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1449 (export "test1449") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1450 (export "test1450") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1451 (export "test1451") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1452 (export "test1452") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1453 (export "test1453") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1454 (export "test1454") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1455 (export "test1455") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1456 (export "test1456") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1457 (export "test1457") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1458 (export "test1458") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1459 (export "test1459") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1460 (export "test1460") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1461 (export "test1461") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1462 (export "test1462") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1463 (export "test1463") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1464 (export "test1464") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1465 (export "test1465") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1466 (export "test1466") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1467 (export "test1467") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1468 (export "test1468") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1469 (export "test1469") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1470 (export "test1470") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1471 (export "test1471") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1472 (export "test1472") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1473 (export "test1473") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1474 (export "test1474") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1475 (export "test1475") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1476 (export "test1476") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1477 (export "test1477") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1478 (export "test1478") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1479 (export "test1479") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1480 (export "test1480") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1481 (export "test1481") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1482 (export "test1482") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1483 (export "test1483") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1484 (export "test1484") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1485 (export "test1485") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1486 (export "test1486") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1487 (export "test1487") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1488 (export "test1488") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1489 (export "test1489") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1490 (export "test1490") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1491 (export "test1491") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1492 (export "test1492") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1493 (export "test1493") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1494 (export "test1494") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1495 (export "test1495") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1496 (export "test1496") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1497 (export "test1497") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1498 (export "test1498") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1499 (export "test1499") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1500 (export "test1500") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1501 (export "test1501") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1502 (export "test1502") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1503 (export "test1503") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1504 (export "test1504") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1505 (export "test1505") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1506 (export "test1506") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1507 (export "test1507") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1508 (export "test1508") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1509 (export "test1509") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1510 (export "test1510") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1511 (export "test1511") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1512 (export "test1512") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1513 (export "test1513") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1514 (export "test1514") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1515 (export "test1515") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1516 (export "test1516") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1517 (export "test1517") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1518 (export "test1518") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1519 (export "test1519") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1520 (export "test1520") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1521 (export "test1521") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1522 (export "test1522") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1523 (export "test1523") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1524 (export "test1524") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1525 (export "test1525") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1526 (export "test1526") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1527 (export "test1527") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1528 (export "test1528") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1529 (export "test1529") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1530 (export "test1530") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1531 (export "test1531") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1532 (export "test1532") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1533 (export "test1533") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1534 (export "test1534") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1535 (export "test1535") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1536 (export "test1536") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1537 (export "test1537") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1538 (export "test1538") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1539 (export "test1539") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1540 (export "test1540") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1541 (export "test1541") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1542 (export "test1542") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1543 (export "test1543") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1544 (export "test1544") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1545 (export "test1545") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1546 (export "test1546") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1547 (export "test1547") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1548 (export "test1548") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1549 (export "test1549") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1550 (export "test1550") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1551 (export "test1551") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1552 (export "test1552") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1553 (export "test1553") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1554 (export "test1554") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1555 (export "test1555") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1556 (export "test1556") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1557 (export "test1557") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1558 (export "test1558") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1559 (export "test1559") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1560 (export "test1560") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1561 (export "test1561") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1562 (export "test1562") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1563 (export "test1563") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1564 (export "test1564") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1565 (export "test1565") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1566 (export "test1566") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1567 (export "test1567") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1568 (export "test1568") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1569 (export "test1569") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1570 (export "test1570") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1571 (export "test1571") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1572 (export "test1572") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1573 (export "test1573") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1574 (export "test1574") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1575 (export "test1575") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1576 (export "test1576") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1577 (export "test1577") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1578 (export "test1578") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1579 (export "test1579") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1580 (export "test1580") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1581 (export "test1581") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1582 (export "test1582") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1583 (export "test1583") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1584 (export "test1584") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1585 (export "test1585") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1586 (export "test1586") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1587 (export "test1587") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1588 (export "test1588") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1589 (export "test1589") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1590 (export "test1590") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1591 (export "test1591") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1592 (export "test1592") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1593 (export "test1593") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1594 (export "test1594") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1595 (export "test1595") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1596 (export "test1596") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1597 (export "test1597") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1598 (export "test1598") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1599 (export "test1599") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1600 (export "test1600") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1601 (export "test1601") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1602 (export "test1602") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1603 (export "test1603") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1604 (export "test1604") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1605 (export "test1605") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1606 (export "test1606") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1607 (export "test1607") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1608 (export "test1608") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1609 (export "test1609") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1610 (export "test1610") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1611 (export "test1611") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1612 (export "test1612") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1613 (export "test1613") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1614 (export "test1614") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1615 (export "test1615") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1616 (export "test1616") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1617 (export "test1617") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1618 (export "test1618") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1619 (export "test1619") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1620 (export "test1620") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1621 (export "test1621") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1622 (export "test1622") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1623 (export "test1623") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1624 (export "test1624") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1625 (export "test1625") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1626 (export "test1626") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1627 (export "test1627") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1628 (export "test1628") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1629 (export "test1629") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1630 (export "test1630") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1631 (export "test1631") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1632 (export "test1632") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1633 (export "test1633") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1634 (export "test1634") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1635 (export "test1635") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1636 (export "test1636") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1637 (export "test1637") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1638 (export "test1638") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1639 (export "test1639") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1640 (export "test1640") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1641 (export "test1641") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1642 (export "test1642") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1643 (export "test1643") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1644 (export "test1644") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1645 (export "test1645") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1646 (export "test1646") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1647 (export "test1647") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1648 (export "test1648") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1649 (export "test1649") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1650 (export "test1650") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1651 (export "test1651") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1652 (export "test1652") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1653 (export "test1653") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1654 (export "test1654") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1655 (export "test1655") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1656 (export "test1656") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1657 (export "test1657") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1658 (export "test1658") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1659 (export "test1659") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1660 (export "test1660") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1661 (export "test1661") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1662 (export "test1662") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1663 (export "test1663") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1664 (export "test1664") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1665 (export "test1665") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1666 (export "test1666") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1667 (export "test1667") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1668 (export "test1668") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1669 (export "test1669") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1670 (export "test1670") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1671 (export "test1671") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1672 (export "test1672") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1673 (export "test1673") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1674 (export "test1674") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1675 (export "test1675") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1676 (export "test1676") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1677 (export "test1677") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1678 (export "test1678") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1679 (export "test1679") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1680 (export "test1680") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1681 (export "test1681") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1682 (export "test1682") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1683 (export "test1683") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1684 (export "test1684") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1685 (export "test1685") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1686 (export "test1686") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1687 (export "test1687") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1688 (export "test1688") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1689 (export "test1689") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1690 (export "test1690") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1691 (export "test1691") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1692 (export "test1692") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1693 (export "test1693") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1694 (export "test1694") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1695 (export "test1695") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1696 (export "test1696") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1697 (export "test1697") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1698 (export "test1698") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1699 (export "test1699") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1700 (export "test1700") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1701 (export "test1701") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1702 (export "test1702") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1703 (export "test1703") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1704 (export "test1704") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1705 (export "test1705") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1706 (export "test1706") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1707 (export "test1707") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1708 (export "test1708") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1709 (export "test1709") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1710 (export "test1710") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1711 (export "test1711") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1712 (export "test1712") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1713 (export "test1713") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1714 (export "test1714") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1715 (export "test1715") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1716 (export "test1716") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1717 (export "test1717") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1718 (export "test1718") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1719 (export "test1719") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1720 (export "test1720") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1721 (export "test1721") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1722 (export "test1722") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1723 (export "test1723") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1724 (export "test1724") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1725 (export "test1725") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1726 (export "test1726") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1727 (export "test1727") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1728 (export "test1728") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1729 (export "test1729") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1730 (export "test1730") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1731 (export "test1731") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1732 (export "test1732") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1733 (export "test1733") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1734 (export "test1734") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1735 (export "test1735") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1736 (export "test1736") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1737 (export "test1737") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1738 (export "test1738") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1739 (export "test1739") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1740 (export "test1740") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1741 (export "test1741") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1742 (export "test1742") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1743 (export "test1743") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1744 (export "test1744") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1745 (export "test1745") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1746 (export "test1746") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1747 (export "test1747") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1748 (export "test1748") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1749 (export "test1749") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1750 (export "test1750") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1751 (export "test1751") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1752 (export "test1752") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1753 (export "test1753") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1754 (export "test1754") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1755 (export "test1755") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1756 (export "test1756") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1757 (export "test1757") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1758 (export "test1758") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1759 (export "test1759") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1760 (export "test1760") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1761 (export "test1761") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1762 (export "test1762") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1763 (export "test1763") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1764 (export "test1764") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1765 (export "test1765") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1766 (export "test1766") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1767 (export "test1767") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1768 (export "test1768") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1769 (export "test1769") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1770 (export "test1770") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1771 (export "test1771") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1772 (export "test1772") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1773 (export "test1773") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1774 (export "test1774") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1775 (export "test1775") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1776 (export "test1776") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1777 (export "test1777") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1778 (export "test1778") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1779 (export "test1779") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1780 (export "test1780") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1781 (export "test1781") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1782 (export "test1782") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1783 (export "test1783") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1784 (export "test1784") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1785 (export "test1785") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1786 (export "test1786") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1787 (export "test1787") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1788 (export "test1788") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1789 (export "test1789") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1790 (export "test1790") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1791 (export "test1791") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1792 (export "test1792") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1793 (export "test1793") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1794 (export "test1794") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1795 (export "test1795") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1796 (export "test1796") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1797 (export "test1797") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1798 (export "test1798") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1799 (export "test1799") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1800 (export "test1800") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1801 (export "test1801") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1802 (export "test1802") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1803 (export "test1803") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1804 (export "test1804") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1805 (export "test1805") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1806 (export "test1806") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1807 (export "test1807") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1808 (export "test1808") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1809 (export "test1809") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1810 (export "test1810") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1811 (export "test1811") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1812 (export "test1812") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1813 (export "test1813") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1814 (export "test1814") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1815 (export "test1815") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1816 (export "test1816") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1817 (export "test1817") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1818 (export "test1818") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1819 (export "test1819") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1820 (export "test1820") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1821 (export "test1821") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1822 (export "test1822") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1823 (export "test1823") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1824 (export "test1824") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1825 (export "test1825") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1826 (export "test1826") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1827 (export "test1827") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1828 (export "test1828") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1829 (export "test1829") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1830 (export "test1830") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1831 (export "test1831") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1832 (export "test1832") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1833 (export "test1833") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1834 (export "test1834") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1835 (export "test1835") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1836 (export "test1836") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1837 (export "test1837") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1838 (export "test1838") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1839 (export "test1839") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1840 (export "test1840") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1841 (export "test1841") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1842 (export "test1842") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1843 (export "test1843") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1844 (export "test1844") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1845 (export "test1845") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1846 (export "test1846") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1847 (export "test1847") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1848 (export "test1848") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1849 (export "test1849") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1850 (export "test1850") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1851 (export "test1851") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1852 (export "test1852") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1853 (export "test1853") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1854 (export "test1854") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1855 (export "test1855") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1856 (export "test1856") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1857 (export "test1857") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1858 (export "test1858") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1859 (export "test1859") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1860 (export "test1860") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1861 (export "test1861") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1862 (export "test1862") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1863 (export "test1863") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1864 (export "test1864") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1865 (export "test1865") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1866 (export "test1866") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1867 (export "test1867") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1868 (export "test1868") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1869 (export "test1869") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1870 (export "test1870") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1871 (export "test1871") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1872 (export "test1872") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1873 (export "test1873") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1874 (export "test1874") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1875 (export "test1875") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1876 (export "test1876") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1877 (export "test1877") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1878 (export "test1878") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1879 (export "test1879") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1880 (export "test1880") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1881 (export "test1881") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1882 (export "test1882") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1883 (export "test1883") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1884 (export "test1884") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1885 (export "test1885") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1886 (export "test1886") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1887 (export "test1887") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1888 (export "test1888") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1889 (export "test1889") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1890 (export "test1890") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1891 (export "test1891") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1892 (export "test1892") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1893 (export "test1893") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1894 (export "test1894") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1895 (export "test1895") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1896 (export "test1896") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1897 (export "test1897") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1898 (export "test1898") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1899 (export "test1899") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1900 (export "test1900") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1901 (export "test1901") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1902 (export "test1902") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1903 (export "test1903") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1904 (export "test1904") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1905 (export "test1905") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1906 (export "test1906") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1907 (export "test1907") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1908 (export "test1908") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1909 (export "test1909") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1910 (export "test1910") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1911 (export "test1911") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1912 (export "test1912") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1913 (export "test1913") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1914 (export "test1914") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1915 (export "test1915") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1916 (export "test1916") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1917 (export "test1917") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1918 (export "test1918") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1919 (export "test1919") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1920 (export "test1920") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1921 (export "test1921") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1922 (export "test1922") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1923 (export "test1923") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1924 (export "test1924") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1925 (export "test1925") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1926 (export "test1926") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1927 (export "test1927") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1928 (export "test1928") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1929 (export "test1929") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1930 (export "test1930") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1931 (export "test1931") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1932 (export "test1932") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1933 (export "test1933") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1934 (export "test1934") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1935 (export "test1935") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1936 (export "test1936") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1937 (export "test1937") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1938 (export "test1938") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1939 (export "test1939") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1940 (export "test1940") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1941 (export "test1941") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1942 (export "test1942") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1943 (export "test1943") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1944 (export "test1944") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1945 (export "test1945") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1946 (export "test1946") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1947 (export "test1947") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1948 (export "test1948") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1949 (export "test1949") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1950 (export "test1950") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1951 (export "test1951") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1952 (export "test1952") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1953 (export "test1953") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1954 (export "test1954") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1955 (export "test1955") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1956 (export "test1956") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1957 (export "test1957") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1958 (export "test1958") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1959 (export "test1959") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1960 (export "test1960") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1961 (export "test1961") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1962 (export "test1962") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1963 (export "test1963") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1964 (export "test1964") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1965 (export "test1965") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1966 (export "test1966") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1967 (export "test1967") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1968 (export "test1968") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1969 (export "test1969") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1970 (export "test1970") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1971 (export "test1971") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1972 (export "test1972") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1973 (export "test1973") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1974 (export "test1974") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1975 (export "test1975") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1976 (export "test1976") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1977 (export "test1977") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1978 (export "test1978") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1979 (export "test1979") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1980 (export "test1980") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1981 (export "test1981") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1982 (export "test1982") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1983 (export "test1983") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1984 (export "test1984") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1985 (export "test1985") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1986 (export "test1986") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1987 (export "test1987") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1988 (export "test1988") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1989 (export "test1989") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1990 (export "test1990") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1991 (export "test1991") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1992 (export "test1992") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1993 (export "test1993") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1994 (export "test1994") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1995 (export "test1995") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1996 (export "test1996") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1997 (export "test1997") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1998 (export "test1998") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test1999 (export "test1999") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2000 (export "test2000") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2001 (export "test2001") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2002 (export "test2002") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2003 (export "test2003") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2004 (export "test2004") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2005 (export "test2005") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2006 (export "test2006") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2007 (export "test2007") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2008 (export "test2008") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2009 (export "test2009") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2010 (export "test2010") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2011 (export "test2011") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2012 (export "test2012") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2013 (export "test2013") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2014 (export "test2014") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2015 (export "test2015") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2016 (export "test2016") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2017 (export "test2017") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2018 (export "test2018") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2019 (export "test2019") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2020 (export "test2020") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2021 (export "test2021") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2022 (export "test2022") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2023 (export "test2023") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2024 (export "test2024") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2025 (export "test2025") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2026 (export "test2026") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2027 (export "test2027") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2028 (export "test2028") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2029 (export "test2029") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2030 (export "test2030") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2031 (export "test2031") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2032 (export "test2032") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2033 (export "test2033") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2034 (export "test2034") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2035 (export "test2035") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2036 (export "test2036") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2037 (export "test2037") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2038 (export "test2038") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2039 (export "test2039") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2040 (export "test2040") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2041 (export "test2041") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2042 (export "test2042") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2043 (export "test2043") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2044 (export "test2044") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2045 (export "test2045") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2046 (export "test2046") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2047 (export "test2047") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2048 (export "test2048") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2049 (export "test2049") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2050 (export "test2050") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2051 (export "test2051") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2052 (export "test2052") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2053 (export "test2053") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2054 (export "test2054") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2055 (export "test2055") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2056 (export "test2056") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2057 (export "test2057") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2058 (export "test2058") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2059 (export "test2059") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2060 (export "test2060") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2061 (export "test2061") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2062 (export "test2062") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2063 (export "test2063") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2064 (export "test2064") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2065 (export "test2065") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2066 (export "test2066") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2067 (export "test2067") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2068 (export "test2068") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2069 (export "test2069") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2070 (export "test2070") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2071 (export "test2071") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2072 (export "test2072") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2073 (export "test2073") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2074 (export "test2074") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2075 (export "test2075") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2076 (export "test2076") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2077 (export "test2077") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2078 (export "test2078") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2079 (export "test2079") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2080 (export "test2080") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2081 (export "test2081") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2082 (export "test2082") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2083 (export "test2083") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2084 (export "test2084") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2085 (export "test2085") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2086 (export "test2086") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2087 (export "test2087") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2088 (export "test2088") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2089 (export "test2089") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2090 (export "test2090") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2091 (export "test2091") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2092 (export "test2092") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2093 (export "test2093") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2094 (export "test2094") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2095 (export "test2095") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2096 (export "test2096") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2097 (export "test2097") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2098 (export "test2098") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2099 (export "test2099") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2100 (export "test2100") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2101 (export "test2101") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2102 (export "test2102") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2103 (export "test2103") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2104 (export "test2104") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2105 (export "test2105") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2106 (export "test2106") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2107 (export "test2107") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2108 (export "test2108") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2109 (export "test2109") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2110 (export "test2110") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2111 (export "test2111") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2112 (export "test2112") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2113 (export "test2113") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2114 (export "test2114") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2115 (export "test2115") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2116 (export "test2116") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2117 (export "test2117") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2118 (export "test2118") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2119 (export "test2119") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2120 (export "test2120") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2121 (export "test2121") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2122 (export "test2122") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2123 (export "test2123") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2124 (export "test2124") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2125 (export "test2125") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2126 (export "test2126") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2127 (export "test2127") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2128 (export "test2128") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2129 (export "test2129") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2130 (export "test2130") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2131 (export "test2131") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2132 (export "test2132") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2133 (export "test2133") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2134 (export "test2134") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2135 (export "test2135") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2136 (export "test2136") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2137 (export "test2137") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2138 (export "test2138") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2139 (export "test2139") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2140 (export "test2140") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2141 (export "test2141") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2142 (export "test2142") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2143 (export "test2143") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2144 (export "test2144") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2145 (export "test2145") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2146 (export "test2146") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2147 (export "test2147") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2148 (export "test2148") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2149 (export "test2149") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2150 (export "test2150") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2151 (export "test2151") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2152 (export "test2152") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2153 (export "test2153") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2154 (export "test2154") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2155 (export "test2155") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2156 (export "test2156") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2157 (export "test2157") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2158 (export "test2158") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2159 (export "test2159") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2160 (export "test2160") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2161 (export "test2161") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2162 (export "test2162") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2163 (export "test2163") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2164 (export "test2164") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2165 (export "test2165") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2166 (export "test2166") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2167 (export "test2167") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2168 (export "test2168") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2169 (export "test2169") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2170 (export "test2170") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2171 (export "test2171") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2172 (export "test2172") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2173 (export "test2173") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2174 (export "test2174") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2175 (export "test2175") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2176 (export "test2176") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2177 (export "test2177") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2178 (export "test2178") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2179 (export "test2179") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2180 (export "test2180") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2181 (export "test2181") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2182 (export "test2182") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2183 (export "test2183") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2184 (export "test2184") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2185 (export "test2185") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2186 (export "test2186") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2187 (export "test2187") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2188 (export "test2188") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2189 (export "test2189") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2190 (export "test2190") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2191 (export "test2191") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2192 (export "test2192") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2193 (export "test2193") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2194 (export "test2194") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2195 (export "test2195") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2196 (export "test2196") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2197 (export "test2197") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2198 (export "test2198") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2199 (export "test2199") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2200 (export "test2200") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2201 (export "test2201") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2202 (export "test2202") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2203 (export "test2203") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2204 (export "test2204") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2205 (export "test2205") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2206 (export "test2206") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2207 (export "test2207") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2208 (export "test2208") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2209 (export "test2209") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2210 (export "test2210") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2211 (export "test2211") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2212 (export "test2212") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2213 (export "test2213") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2214 (export "test2214") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2215 (export "test2215") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2216 (export "test2216") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2217 (export "test2217") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2218 (export "test2218") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2219 (export "test2219") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2220 (export "test2220") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2221 (export "test2221") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2222 (export "test2222") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2223 (export "test2223") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2224 (export "test2224") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2225 (export "test2225") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2226 (export "test2226") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2227 (export "test2227") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2228 (export "test2228") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2229 (export "test2229") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2230 (export "test2230") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2231 (export "test2231") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2232 (export "test2232") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2233 (export "test2233") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2234 (export "test2234") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2235 (export "test2235") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2236 (export "test2236") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2237 (export "test2237") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2238 (export "test2238") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2239 (export "test2239") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2240 (export "test2240") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2241 (export "test2241") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2242 (export "test2242") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2243 (export "test2243") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2244 (export "test2244") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2245 (export "test2245") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2246 (export "test2246") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2247 (export "test2247") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2248 (export "test2248") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2249 (export "test2249") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2250 (export "test2250") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2251 (export "test2251") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2252 (export "test2252") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2253 (export "test2253") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2254 (export "test2254") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2255 (export "test2255") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2256 (export "test2256") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2257 (export "test2257") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2258 (export "test2258") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2259 (export "test2259") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2260 (export "test2260") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2261 (export "test2261") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2262 (export "test2262") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2263 (export "test2263") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2264 (export "test2264") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2265 (export "test2265") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2266 (export "test2266") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2267 (export "test2267") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2268 (export "test2268") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2269 (export "test2269") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2270 (export "test2270") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2271 (export "test2271") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2272 (export "test2272") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2273 (export "test2273") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2274 (export "test2274") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2275 (export "test2275") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2276 (export "test2276") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2277 (export "test2277") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2278 (export "test2278") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2279 (export "test2279") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2280 (export "test2280") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2281 (export "test2281") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2282 (export "test2282") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2283 (export "test2283") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2284 (export "test2284") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2285 (export "test2285") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2286 (export "test2286") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2287 (export "test2287") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2288 (export "test2288") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2289 (export "test2289") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2290 (export "test2290") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2291 (export "test2291") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2292 (export "test2292") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2293 (export "test2293") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2294 (export "test2294") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2295 (export "test2295") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2296 (export "test2296") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2297 (export "test2297") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2298 (export "test2298") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2299 (export "test2299") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2300 (export "test2300") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2301 (export "test2301") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2302 (export "test2302") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2303 (export "test2303") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2304 (export "test2304") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2305 (export "test2305") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2306 (export "test2306") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2307 (export "test2307") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2308 (export "test2308") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2309 (export "test2309") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2310 (export "test2310") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2311 (export "test2311") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2312 (export "test2312") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2313 (export "test2313") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2314 (export "test2314") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2315 (export "test2315") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2316 (export "test2316") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2317 (export "test2317") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2318 (export "test2318") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2319 (export "test2319") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2320 (export "test2320") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2321 (export "test2321") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2322 (export "test2322") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2323 (export "test2323") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2324 (export "test2324") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2325 (export "test2325") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2326 (export "test2326") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2327 (export "test2327") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2328 (export "test2328") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2329 (export "test2329") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2330 (export "test2330") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2331 (export "test2331") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2332 (export "test2332") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2333 (export "test2333") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2334 (export "test2334") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2335 (export "test2335") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2336 (export "test2336") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2337 (export "test2337") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2338 (export "test2338") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2339 (export "test2339") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2340 (export "test2340") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2341 (export "test2341") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2342 (export "test2342") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2343 (export "test2343") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2344 (export "test2344") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2345 (export "test2345") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2346 (export "test2346") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2347 (export "test2347") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2348 (export "test2348") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2349 (export "test2349") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2350 (export "test2350") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2351 (export "test2351") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2352 (export "test2352") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2353 (export "test2353") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2354 (export "test2354") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2355 (export "test2355") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2356 (export "test2356") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2357 (export "test2357") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2358 (export "test2358") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2359 (export "test2359") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2360 (export "test2360") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2361 (export "test2361") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2362 (export "test2362") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2363 (export "test2363") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2364 (export "test2364") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2365 (export "test2365") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2366 (export "test2366") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2367 (export "test2367") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2368 (export "test2368") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2369 (export "test2369") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2370 (export "test2370") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2371 (export "test2371") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2372 (export "test2372") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2373 (export "test2373") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2374 (export "test2374") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2375 (export "test2375") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2376 (export "test2376") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2377 (export "test2377") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2378 (export "test2378") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2379 (export "test2379") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2380 (export "test2380") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2381 (export "test2381") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2382 (export "test2382") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2383 (export "test2383") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2384 (export "test2384") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2385 (export "test2385") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2386 (export "test2386") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2387 (export "test2387") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2388 (export "test2388") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2389 (export "test2389") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2390 (export "test2390") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2391 (export "test2391") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2392 (export "test2392") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2393 (export "test2393") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2394 (export "test2394") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2395 (export "test2395") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2396 (export "test2396") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2397 (export "test2397") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2398 (export "test2398") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2399 (export "test2399") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2400 (export "test2400") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2401 (export "test2401") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2402 (export "test2402") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2403 (export "test2403") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2404 (export "test2404") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2405 (export "test2405") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2406 (export "test2406") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2407 (export "test2407") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2408 (export "test2408") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2409 (export "test2409") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2410 (export "test2410") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2411 (export "test2411") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2412 (export "test2412") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2413 (export "test2413") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2414 (export "test2414") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2415 (export "test2415") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2416 (export "test2416") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2417 (export "test2417") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2418 (export "test2418") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2419 (export "test2419") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2420 (export "test2420") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2421 (export "test2421") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2422 (export "test2422") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2423 (export "test2423") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2424 (export "test2424") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2425 (export "test2425") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2426 (export "test2426") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2427 (export "test2427") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2428 (export "test2428") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2429 (export "test2429") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2430 (export "test2430") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2431 (export "test2431") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2432 (export "test2432") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2433 (export "test2433") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2434 (export "test2434") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2435 (export "test2435") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2436 (export "test2436") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2437 (export "test2437") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2438 (export "test2438") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2439 (export "test2439") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2440 (export "test2440") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2441 (export "test2441") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2442 (export "test2442") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2443 (export "test2443") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2444 (export "test2444") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2445 (export "test2445") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2446 (export "test2446") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2447 (export "test2447") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2448 (export "test2448") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2449 (export "test2449") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2450 (export "test2450") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2451 (export "test2451") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2452 (export "test2452") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2453 (export "test2453") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2454 (export "test2454") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2455 (export "test2455") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2456 (export "test2456") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2457 (export "test2457") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2458 (export "test2458") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2459 (export "test2459") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2460 (export "test2460") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2461 (export "test2461") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2462 (export "test2462") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2463 (export "test2463") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2464 (export "test2464") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2465 (export "test2465") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2466 (export "test2466") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2467 (export "test2467") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2468 (export "test2468") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2469 (export "test2469") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2470 (export "test2470") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2471 (export "test2471") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2472 (export "test2472") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2473 (export "test2473") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2474 (export "test2474") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2475 (export "test2475") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2476 (export "test2476") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2477 (export "test2477") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2478 (export "test2478") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2479 (export "test2479") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2480 (export "test2480") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2481 (export "test2481") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2482 (export "test2482") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2483 (export "test2483") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2484 (export "test2484") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2485 (export "test2485") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2486 (export "test2486") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2487 (export "test2487") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2488 (export "test2488") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2489 (export "test2489") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2490 (export "test2490") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2491 (export "test2491") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2492 (export "test2492") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2493 (export "test2493") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2494 (export "test2494") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2495 (export "test2495") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2496 (export "test2496") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2497 (export "test2497") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2498 (export "test2498") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2499 (export "test2499") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2500 (export "test2500") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2501 (export "test2501") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2502 (export "test2502") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2503 (export "test2503") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2504 (export "test2504") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2505 (export "test2505") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2506 (export "test2506") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2507 (export "test2507") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2508 (export "test2508") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2509 (export "test2509") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2510 (export "test2510") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2511 (export "test2511") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2512 (export "test2512") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2513 (export "test2513") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2514 (export "test2514") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2515 (export "test2515") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2516 (export "test2516") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2517 (export "test2517") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2518 (export "test2518") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2519 (export "test2519") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2520 (export "test2520") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2521 (export "test2521") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2522 (export "test2522") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2523 (export "test2523") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2524 (export "test2524") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2525 (export "test2525") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2526 (export "test2526") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2527 (export "test2527") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2528 (export "test2528") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2529 (export "test2529") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2530 (export "test2530") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2531 (export "test2531") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2532 (export "test2532") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2533 (export "test2533") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2534 (export "test2534") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2535 (export "test2535") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2536 (export "test2536") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2537 (export "test2537") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2538 (export "test2538") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2539 (export "test2539") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2540 (export "test2540") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2541 (export "test2541") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2542 (export "test2542") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2543 (export "test2543") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2544 (export "test2544") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2545 (export "test2545") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2546 (export "test2546") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2547 (export "test2547") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2548 (export "test2548") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2549 (export "test2549") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2550 (export "test2550") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2551 (export "test2551") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2552 (export "test2552") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2553 (export "test2553") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2554 (export "test2554") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2555 (export "test2555") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2556 (export "test2556") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2557 (export "test2557") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2558 (export "test2558") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2559 (export "test2559") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2560 (export "test2560") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2561 (export "test2561") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2562 (export "test2562") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2563 (export "test2563") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2564 (export "test2564") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2565 (export "test2565") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2566 (export "test2566") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2567 (export "test2567") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2568 (export "test2568") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2569 (export "test2569") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2570 (export "test2570") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2571 (export "test2571") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2572 (export "test2572") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2573 (export "test2573") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2574 (export "test2574") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2575 (export "test2575") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2576 (export "test2576") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2577 (export "test2577") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2578 (export "test2578") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2579 (export "test2579") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2580 (export "test2580") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2581 (export "test2581") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2582 (export "test2582") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2583 (export "test2583") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2584 (export "test2584") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2585 (export "test2585") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2586 (export "test2586") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2587 (export "test2587") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2588 (export "test2588") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2589 (export "test2589") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2590 (export "test2590") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2591 (export "test2591") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2592 (export "test2592") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2593 (export "test2593") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2594 (export "test2594") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2595 (export "test2595") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2596 (export "test2596") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2597 (export "test2597") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2598 (export "test2598") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2599 (export "test2599") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2600 (export "test2600") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2601 (export "test2601") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2602 (export "test2602") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2603 (export "test2603") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2604 (export "test2604") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2605 (export "test2605") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2606 (export "test2606") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2607 (export "test2607") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2608 (export "test2608") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2609 (export "test2609") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2610 (export "test2610") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2611 (export "test2611") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2612 (export "test2612") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2613 (export "test2613") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2614 (export "test2614") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2615 (export "test2615") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2616 (export "test2616") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2617 (export "test2617") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2618 (export "test2618") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2619 (export "test2619") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2620 (export "test2620") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2621 (export "test2621") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2622 (export "test2622") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2623 (export "test2623") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2624 (export "test2624") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2625 (export "test2625") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2626 (export "test2626") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2627 (export "test2627") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2628 (export "test2628") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2629 (export "test2629") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2630 (export "test2630") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2631 (export "test2631") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2632 (export "test2632") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2633 (export "test2633") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2634 (export "test2634") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2635 (export "test2635") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2636 (export "test2636") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2637 (export "test2637") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2638 (export "test2638") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2639 (export "test2639") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2640 (export "test2640") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2641 (export "test2641") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2642 (export "test2642") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2643 (export "test2643") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2644 (export "test2644") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2645 (export "test2645") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2646 (export "test2646") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2647 (export "test2647") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2648 (export "test2648") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2649 (export "test2649") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2650 (export "test2650") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2651 (export "test2651") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2652 (export "test2652") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2653 (export "test2653") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2654 (export "test2654") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2655 (export "test2655") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2656 (export "test2656") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2657 (export "test2657") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2658 (export "test2658") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2659 (export "test2659") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2660 (export "test2660") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2661 (export "test2661") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2662 (export "test2662") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2663 (export "test2663") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2664 (export "test2664") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2665 (export "test2665") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2666 (export "test2666") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2667 (export "test2667") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2668 (export "test2668") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2669 (export "test2669") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2670 (export "test2670") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2671 (export "test2671") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2672 (export "test2672") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2673 (export "test2673") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2674 (export "test2674") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2675 (export "test2675") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2676 (export "test2676") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2677 (export "test2677") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2678 (export "test2678") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2679 (export "test2679") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2680 (export "test2680") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2681 (export "test2681") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2682 (export "test2682") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2683 (export "test2683") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2684 (export "test2684") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2685 (export "test2685") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2686 (export "test2686") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2687 (export "test2687") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2688 (export "test2688") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2689 (export "test2689") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2690 (export "test2690") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2691 (export "test2691") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2692 (export "test2692") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2693 (export "test2693") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2694 (export "test2694") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2695 (export "test2695") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2696 (export "test2696") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2697 (export "test2697") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2698 (export "test2698") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2699 (export "test2699") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2700 (export "test2700") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2701 (export "test2701") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2702 (export "test2702") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2703 (export "test2703") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2704 (export "test2704") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2705 (export "test2705") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2706 (export "test2706") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2707 (export "test2707") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2708 (export "test2708") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2709 (export "test2709") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2710 (export "test2710") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2711 (export "test2711") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2712 (export "test2712") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2713 (export "test2713") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2714 (export "test2714") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2715 (export "test2715") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2716 (export "test2716") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2717 (export "test2717") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2718 (export "test2718") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2719 (export "test2719") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2720 (export "test2720") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2721 (export "test2721") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2722 (export "test2722") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2723 (export "test2723") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2724 (export "test2724") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2725 (export "test2725") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2726 (export "test2726") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2727 (export "test2727") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2728 (export "test2728") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2729 (export "test2729") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2730 (export "test2730") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2731 (export "test2731") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2732 (export "test2732") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2733 (export "test2733") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2734 (export "test2734") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2735 (export "test2735") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2736 (export "test2736") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2737 (export "test2737") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2738 (export "test2738") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2739 (export "test2739") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2740 (export "test2740") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2741 (export "test2741") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2742 (export "test2742") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2743 (export "test2743") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2744 (export "test2744") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2745 (export "test2745") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2746 (export "test2746") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2747 (export "test2747") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2748 (export "test2748") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2749 (export "test2749") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2750 (export "test2750") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2751 (export "test2751") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2752 (export "test2752") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2753 (export "test2753") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2754 (export "test2754") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2755 (export "test2755") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2756 (export "test2756") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2757 (export "test2757") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2758 (export "test2758") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2759 (export "test2759") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2760 (export "test2760") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2761 (export "test2761") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2762 (export "test2762") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2763 (export "test2763") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2764 (export "test2764") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2765 (export "test2765") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2766 (export "test2766") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2767 (export "test2767") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2768 (export "test2768") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2769 (export "test2769") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2770 (export "test2770") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2771 (export "test2771") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2772 (export "test2772") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2773 (export "test2773") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2774 (export "test2774") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2775 (export "test2775") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2776 (export "test2776") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2777 (export "test2777") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2778 (export "test2778") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2779 (export "test2779") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2780 (export "test2780") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2781 (export "test2781") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2782 (export "test2782") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2783 (export "test2783") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2784 (export "test2784") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2785 (export "test2785") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2786 (export "test2786") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2787 (export "test2787") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2788 (export "test2788") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2789 (export "test2789") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2790 (export "test2790") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2791 (export "test2791") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2792 (export "test2792") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2793 (export "test2793") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2794 (export "test2794") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2795 (export "test2795") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2796 (export "test2796") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2797 (export "test2797") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2798 (export "test2798") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2799 (export "test2799") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2800 (export "test2800") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2801 (export "test2801") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2802 (export "test2802") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2803 (export "test2803") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2804 (export "test2804") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2805 (export "test2805") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2806 (export "test2806") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2807 (export "test2807") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2808 (export "test2808") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2809 (export "test2809") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2810 (export "test2810") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2811 (export "test2811") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2812 (export "test2812") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2813 (export "test2813") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2814 (export "test2814") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2815 (export "test2815") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2816 (export "test2816") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2817 (export "test2817") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2818 (export "test2818") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2819 (export "test2819") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2820 (export "test2820") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2821 (export "test2821") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2822 (export "test2822") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2823 (export "test2823") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2824 (export "test2824") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2825 (export "test2825") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2826 (export "test2826") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2827 (export "test2827") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2828 (export "test2828") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2829 (export "test2829") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2830 (export "test2830") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2831 (export "test2831") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2832 (export "test2832") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2833 (export "test2833") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2834 (export "test2834") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2835 (export "test2835") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2836 (export "test2836") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2837 (export "test2837") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2838 (export "test2838") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2839 (export "test2839") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2840 (export "test2840") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2841 (export "test2841") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2842 (export "test2842") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2843 (export "test2843") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2844 (export "test2844") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2845 (export "test2845") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2846 (export "test2846") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2847 (export "test2847") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2848 (export "test2848") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2849 (export "test2849") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2850 (export "test2850") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2851 (export "test2851") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2852 (export "test2852") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2853 (export "test2853") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2854 (export "test2854") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2855 (export "test2855") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2856 (export "test2856") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2857 (export "test2857") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2858 (export "test2858") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2859 (export "test2859") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2860 (export "test2860") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2861 (export "test2861") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2862 (export "test2862") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2863 (export "test2863") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2864 (export "test2864") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2865 (export "test2865") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2866 (export "test2866") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2867 (export "test2867") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2868 (export "test2868") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2869 (export "test2869") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2870 (export "test2870") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2871 (export "test2871") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2872 (export "test2872") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2873 (export "test2873") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2874 (export "test2874") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2875 (export "test2875") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2876 (export "test2876") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2877 (export "test2877") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2878 (export "test2878") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2879 (export "test2879") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2880 (export "test2880") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2881 (export "test2881") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2882 (export "test2882") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2883 (export "test2883") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2884 (export "test2884") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2885 (export "test2885") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2886 (export "test2886") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2887 (export "test2887") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2888 (export "test2888") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2889 (export "test2889") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2890 (export "test2890") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2891 (export "test2891") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2892 (export "test2892") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2893 (export "test2893") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2894 (export "test2894") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2895 (export "test2895") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2896 (export "test2896") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2897 (export "test2897") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2898 (export "test2898") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2899 (export "test2899") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2900 (export "test2900") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2901 (export "test2901") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2902 (export "test2902") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2903 (export "test2903") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2904 (export "test2904") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2905 (export "test2905") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2906 (export "test2906") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2907 (export "test2907") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2908 (export "test2908") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2909 (export "test2909") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2910 (export "test2910") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2911 (export "test2911") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2912 (export "test2912") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2913 (export "test2913") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2914 (export "test2914") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2915 (export "test2915") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2916 (export "test2916") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2917 (export "test2917") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2918 (export "test2918") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2919 (export "test2919") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2920 (export "test2920") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2921 (export "test2921") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2922 (export "test2922") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2923 (export "test2923") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2924 (export "test2924") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2925 (export "test2925") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2926 (export "test2926") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2927 (export "test2927") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2928 (export "test2928") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2929 (export "test2929") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2930 (export "test2930") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2931 (export "test2931") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2932 (export "test2932") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2933 (export "test2933") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2934 (export "test2934") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2935 (export "test2935") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2936 (export "test2936") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2937 (export "test2937") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2938 (export "test2938") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2939 (export "test2939") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2940 (export "test2940") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2941 (export "test2941") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2942 (export "test2942") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2943 (export "test2943") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2944 (export "test2944") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2945 (export "test2945") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2946 (export "test2946") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2947 (export "test2947") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2948 (export "test2948") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2949 (export "test2949") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2950 (export "test2950") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2951 (export "test2951") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2952 (export "test2952") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2953 (export "test2953") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2954 (export "test2954") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2955 (export "test2955") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2956 (export "test2956") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2957 (export "test2957") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2958 (export "test2958") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2959 (export "test2959") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2960 (export "test2960") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2961 (export "test2961") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2962 (export "test2962") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2963 (export "test2963") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2964 (export "test2964") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2965 (export "test2965") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2966 (export "test2966") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2967 (export "test2967") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2968 (export "test2968") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2969 (export "test2969") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2970 (export "test2970") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2971 (export "test2971") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2972 (export "test2972") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2973 (export "test2973") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2974 (export "test2974") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2975 (export "test2975") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2976 (export "test2976") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2977 (export "test2977") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2978 (export "test2978") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2979 (export "test2979") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2980 (export "test2980") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2981 (export "test2981") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2982 (export "test2982") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2983 (export "test2983") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2984 (export "test2984") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2985 (export "test2985") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2986 (export "test2986") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2987 (export "test2987") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2988 (export "test2988") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2989 (export "test2989") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2990 (export "test2990") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2991 (export "test2991") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2992 (export "test2992") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2993 (export "test2993") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2994 (export "test2994") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2995 (export "test2995") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2996 (export "test2996") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2997 (export "test2997") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2998 (export "test2998") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test2999 (export "test2999") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3000 (export "test3000") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3001 (export "test3001") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3002 (export "test3002") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3003 (export "test3003") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3004 (export "test3004") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3005 (export "test3005") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3006 (export "test3006") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3007 (export "test3007") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3008 (export "test3008") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3009 (export "test3009") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3010 (export "test3010") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3011 (export "test3011") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3012 (export "test3012") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3013 (export "test3013") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3014 (export "test3014") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3015 (export "test3015") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3016 (export "test3016") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3017 (export "test3017") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3018 (export "test3018") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3019 (export "test3019") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3020 (export "test3020") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3021 (export "test3021") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3022 (export "test3022") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3023 (export "test3023") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3024 (export "test3024") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3025 (export "test3025") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3026 (export "test3026") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3027 (export "test3027") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3028 (export "test3028") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3029 (export "test3029") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3030 (export "test3030") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3031 (export "test3031") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3032 (export "test3032") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3033 (export "test3033") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3034 (export "test3034") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3035 (export "test3035") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3036 (export "test3036") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3037 (export "test3037") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3038 (export "test3038") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3039 (export "test3039") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3040 (export "test3040") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3041 (export "test3041") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3042 (export "test3042") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3043 (export "test3043") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3044 (export "test3044") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3045 (export "test3045") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3046 (export "test3046") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3047 (export "test3047") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3048 (export "test3048") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3049 (export "test3049") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3050 (export "test3050") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3051 (export "test3051") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3052 (export "test3052") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3053 (export "test3053") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3054 (export "test3054") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3055 (export "test3055") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3056 (export "test3056") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3057 (export "test3057") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3058 (export "test3058") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3059 (export "test3059") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3060 (export "test3060") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3061 (export "test3061") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3062 (export "test3062") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3063 (export "test3063") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3064 (export "test3064") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3065 (export "test3065") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3066 (export "test3066") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3067 (export "test3067") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3068 (export "test3068") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3069 (export "test3069") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3070 (export "test3070") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3071 (export "test3071") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3072 (export "test3072") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3073 (export "test3073") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3074 (export "test3074") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3075 (export "test3075") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3076 (export "test3076") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3077 (export "test3077") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3078 (export "test3078") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3079 (export "test3079") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3080 (export "test3080") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3081 (export "test3081") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3082 (export "test3082") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3083 (export "test3083") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3084 (export "test3084") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3085 (export "test3085") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3086 (export "test3086") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3087 (export "test3087") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3088 (export "test3088") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3089 (export "test3089") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3090 (export "test3090") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3091 (export "test3091") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3092 (export "test3092") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3093 (export "test3093") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3094 (export "test3094") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3095 (export "test3095") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3096 (export "test3096") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3097 (export "test3097") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3098 (export "test3098") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3099 (export "test3099") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3100 (export "test3100") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3101 (export "test3101") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3102 (export "test3102") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3103 (export "test3103") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3104 (export "test3104") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3105 (export "test3105") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3106 (export "test3106") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3107 (export "test3107") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3108 (export "test3108") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3109 (export "test3109") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3110 (export "test3110") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3111 (export "test3111") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3112 (export "test3112") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3113 (export "test3113") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3114 (export "test3114") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3115 (export "test3115") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3116 (export "test3116") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3117 (export "test3117") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3118 (export "test3118") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3119 (export "test3119") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3120 (export "test3120") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3121 (export "test3121") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3122 (export "test3122") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3123 (export "test3123") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3124 (export "test3124") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3125 (export "test3125") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3126 (export "test3126") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3127 (export "test3127") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3128 (export "test3128") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3129 (export "test3129") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3130 (export "test3130") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3131 (export "test3131") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3132 (export "test3132") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3133 (export "test3133") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3134 (export "test3134") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3135 (export "test3135") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3136 (export "test3136") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3137 (export "test3137") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3138 (export "test3138") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3139 (export "test3139") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3140 (export "test3140") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3141 (export "test3141") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3142 (export "test3142") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3143 (export "test3143") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3144 (export "test3144") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3145 (export "test3145") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3146 (export "test3146") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3147 (export "test3147") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3148 (export "test3148") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3149 (export "test3149") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3150 (export "test3150") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3151 (export "test3151") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3152 (export "test3152") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3153 (export "test3153") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3154 (export "test3154") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3155 (export "test3155") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3156 (export "test3156") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3157 (export "test3157") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3158 (export "test3158") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3159 (export "test3159") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3160 (export "test3160") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3161 (export "test3161") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3162 (export "test3162") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3163 (export "test3163") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3164 (export "test3164") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3165 (export "test3165") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3166 (export "test3166") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3167 (export "test3167") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3168 (export "test3168") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3169 (export "test3169") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3170 (export "test3170") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3171 (export "test3171") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3172 (export "test3172") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3173 (export "test3173") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3174 (export "test3174") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3175 (export "test3175") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3176 (export "test3176") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3177 (export "test3177") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3178 (export "test3178") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3179 (export "test3179") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3180 (export "test3180") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3181 (export "test3181") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3182 (export "test3182") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3183 (export "test3183") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3184 (export "test3184") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3185 (export "test3185") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3186 (export "test3186") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3187 (export "test3187") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3188 (export "test3188") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3189 (export "test3189") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3190 (export "test3190") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3191 (export "test3191") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3192 (export "test3192") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3193 (export "test3193") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3194 (export "test3194") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3195 (export "test3195") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3196 (export "test3196") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3197 (export "test3197") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3198 (export "test3198") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3199 (export "test3199") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3200 (export "test3200") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3201 (export "test3201") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3202 (export "test3202") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3203 (export "test3203") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3204 (export "test3204") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3205 (export "test3205") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3206 (export "test3206") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3207 (export "test3207") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3208 (export "test3208") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3209 (export "test3209") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3210 (export "test3210") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3211 (export "test3211") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3212 (export "test3212") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3213 (export "test3213") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3214 (export "test3214") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3215 (export "test3215") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3216 (export "test3216") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3217 (export "test3217") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3218 (export "test3218") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3219 (export "test3219") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3220 (export "test3220") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3221 (export "test3221") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3222 (export "test3222") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3223 (export "test3223") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3224 (export "test3224") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3225 (export "test3225") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3226 (export "test3226") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3227 (export "test3227") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3228 (export "test3228") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3229 (export "test3229") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3230 (export "test3230") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3231 (export "test3231") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3232 (export "test3232") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3233 (export "test3233") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3234 (export "test3234") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3235 (export "test3235") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3236 (export "test3236") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3237 (export "test3237") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3238 (export "test3238") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3239 (export "test3239") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3240 (export "test3240") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3241 (export "test3241") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3242 (export "test3242") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3243 (export "test3243") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3244 (export "test3244") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3245 (export "test3245") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3246 (export "test3246") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3247 (export "test3247") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3248 (export "test3248") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3249 (export "test3249") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3250 (export "test3250") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3251 (export "test3251") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3252 (export "test3252") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3253 (export "test3253") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3254 (export "test3254") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3255 (export "test3255") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3256 (export "test3256") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3257 (export "test3257") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3258 (export "test3258") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3259 (export "test3259") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3260 (export "test3260") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3261 (export "test3261") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3262 (export "test3262") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3263 (export "test3263") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3264 (export "test3264") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3265 (export "test3265") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3266 (export "test3266") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3267 (export "test3267") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3268 (export "test3268") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3269 (export "test3269") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3270 (export "test3270") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3271 (export "test3271") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3272 (export "test3272") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3273 (export "test3273") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3274 (export "test3274") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3275 (export "test3275") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3276 (export "test3276") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3277 (export "test3277") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3278 (export "test3278") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3279 (export "test3279") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3280 (export "test3280") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3281 (export "test3281") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3282 (export "test3282") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3283 (export "test3283") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3284 (export "test3284") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3285 (export "test3285") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3286 (export "test3286") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3287 (export "test3287") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3288 (export "test3288") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3289 (export "test3289") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3290 (export "test3290") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3291 (export "test3291") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3292 (export "test3292") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3293 (export "test3293") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3294 (export "test3294") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3295 (export "test3295") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3296 (export "test3296") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3297 (export "test3297") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3298 (export "test3298") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3299 (export "test3299") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3300 (export "test3300") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3301 (export "test3301") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3302 (export "test3302") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3303 (export "test3303") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3304 (export "test3304") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3305 (export "test3305") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3306 (export "test3306") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3307 (export "test3307") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3308 (export "test3308") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3309 (export "test3309") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3310 (export "test3310") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3311 (export "test3311") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3312 (export "test3312") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3313 (export "test3313") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3314 (export "test3314") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3315 (export "test3315") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3316 (export "test3316") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3317 (export "test3317") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3318 (export "test3318") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3319 (export "test3319") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3320 (export "test3320") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3321 (export "test3321") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3322 (export "test3322") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3323 (export "test3323") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3324 (export "test3324") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3325 (export "test3325") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3326 (export "test3326") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3327 (export "test3327") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3328 (export "test3328") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3329 (export "test3329") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3330 (export "test3330") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3331 (export "test3331") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3332 (export "test3332") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3333 (export "test3333") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3334 (export "test3334") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3335 (export "test3335") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3336 (export "test3336") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3337 (export "test3337") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3338 (export "test3338") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3339 (export "test3339") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3340 (export "test3340") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3341 (export "test3341") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3342 (export "test3342") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3343 (export "test3343") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3344 (export "test3344") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3345 (export "test3345") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3346 (export "test3346") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3347 (export "test3347") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3348 (export "test3348") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3349 (export "test3349") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3350 (export "test3350") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3351 (export "test3351") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3352 (export "test3352") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3353 (export "test3353") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3354 (export "test3354") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3355 (export "test3355") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3356 (export "test3356") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3357 (export "test3357") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3358 (export "test3358") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3359 (export "test3359") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3360 (export "test3360") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3361 (export "test3361") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3362 (export "test3362") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3363 (export "test3363") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3364 (export "test3364") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3365 (export "test3365") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3366 (export "test3366") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3367 (export "test3367") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3368 (export "test3368") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3369 (export "test3369") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3370 (export "test3370") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3371 (export "test3371") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3372 (export "test3372") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3373 (export "test3373") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3374 (export "test3374") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3375 (export "test3375") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3376 (export "test3376") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3377 (export "test3377") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3378 (export "test3378") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3379 (export "test3379") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3380 (export "test3380") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3381 (export "test3381") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3382 (export "test3382") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3383 (export "test3383") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3384 (export "test3384") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3385 (export "test3385") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3386 (export "test3386") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3387 (export "test3387") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3388 (export "test3388") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3389 (export "test3389") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3390 (export "test3390") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3391 (export "test3391") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3392 (export "test3392") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3393 (export "test3393") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3394 (export "test3394") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3395 (export "test3395") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3396 (export "test3396") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3397 (export "test3397") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3398 (export "test3398") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3399 (export "test3399") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3400 (export "test3400") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3401 (export "test3401") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3402 (export "test3402") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3403 (export "test3403") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3404 (export "test3404") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3405 (export "test3405") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3406 (export "test3406") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3407 (export "test3407") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3408 (export "test3408") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3409 (export "test3409") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3410 (export "test3410") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3411 (export "test3411") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3412 (export "test3412") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3413 (export "test3413") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3414 (export "test3414") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3415 (export "test3415") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3416 (export "test3416") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3417 (export "test3417") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3418 (export "test3418") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3419 (export "test3419") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3420 (export "test3420") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3421 (export "test3421") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3422 (export "test3422") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3423 (export "test3423") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3424 (export "test3424") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3425 (export "test3425") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3426 (export "test3426") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3427 (export "test3427") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3428 (export "test3428") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3429 (export "test3429") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3430 (export "test3430") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3431 (export "test3431") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3432 (export "test3432") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3433 (export "test3433") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3434 (export "test3434") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3435 (export "test3435") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3436 (export "test3436") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3437 (export "test3437") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3438 (export "test3438") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3439 (export "test3439") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3440 (export "test3440") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3441 (export "test3441") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3442 (export "test3442") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3443 (export "test3443") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3444 (export "test3444") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3445 (export "test3445") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3446 (export "test3446") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3447 (export "test3447") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3448 (export "test3448") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3449 (export "test3449") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3450 (export "test3450") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3451 (export "test3451") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3452 (export "test3452") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3453 (export "test3453") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3454 (export "test3454") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3455 (export "test3455") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3456 (export "test3456") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3457 (export "test3457") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3458 (export "test3458") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3459 (export "test3459") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3460 (export "test3460") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3461 (export "test3461") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3462 (export "test3462") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3463 (export "test3463") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3464 (export "test3464") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3465 (export "test3465") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3466 (export "test3466") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3467 (export "test3467") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3468 (export "test3468") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3469 (export "test3469") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3470 (export "test3470") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3471 (export "test3471") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3472 (export "test3472") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3473 (export "test3473") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3474 (export "test3474") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3475 (export "test3475") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3476 (export "test3476") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3477 (export "test3477") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3478 (export "test3478") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3479 (export "test3479") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3480 (export "test3480") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3481 (export "test3481") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3482 (export "test3482") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3483 (export "test3483") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3484 (export "test3484") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3485 (export "test3485") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3486 (export "test3486") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3487 (export "test3487") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3488 (export "test3488") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3489 (export "test3489") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3490 (export "test3490") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3491 (export "test3491") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3492 (export "test3492") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3493 (export "test3493") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3494 (export "test3494") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3495 (export "test3495") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3496 (export "test3496") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3497 (export "test3497") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3498 (export "test3498") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3499 (export "test3499") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3500 (export "test3500") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3501 (export "test3501") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3502 (export "test3502") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3503 (export "test3503") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3504 (export "test3504") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3505 (export "test3505") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3506 (export "test3506") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3507 (export "test3507") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3508 (export "test3508") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3509 (export "test3509") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3510 (export "test3510") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3511 (export "test3511") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3512 (export "test3512") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3513 (export "test3513") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3514 (export "test3514") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3515 (export "test3515") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3516 (export "test3516") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3517 (export "test3517") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3518 (export "test3518") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3519 (export "test3519") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3520 (export "test3520") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3521 (export "test3521") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3522 (export "test3522") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3523 (export "test3523") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3524 (export "test3524") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3525 (export "test3525") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3526 (export "test3526") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3527 (export "test3527") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3528 (export "test3528") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3529 (export "test3529") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3530 (export "test3530") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3531 (export "test3531") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3532 (export "test3532") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3533 (export "test3533") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3534 (export "test3534") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3535 (export "test3535") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3536 (export "test3536") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3537 (export "test3537") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3538 (export "test3538") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3539 (export "test3539") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3540 (export "test3540") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3541 (export "test3541") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3542 (export "test3542") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3543 (export "test3543") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3544 (export "test3544") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3545 (export "test3545") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3546 (export "test3546") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3547 (export "test3547") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3548 (export "test3548") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3549 (export "test3549") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3550 (export "test3550") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3551 (export "test3551") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3552 (export "test3552") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3553 (export "test3553") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3554 (export "test3554") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3555 (export "test3555") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3556 (export "test3556") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3557 (export "test3557") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3558 (export "test3558") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3559 (export "test3559") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3560 (export "test3560") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3561 (export "test3561") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3562 (export "test3562") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3563 (export "test3563") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3564 (export "test3564") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3565 (export "test3565") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3566 (export "test3566") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3567 (export "test3567") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3568 (export "test3568") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3569 (export "test3569") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3570 (export "test3570") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3571 (export "test3571") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3572 (export "test3572") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3573 (export "test3573") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3574 (export "test3574") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3575 (export "test3575") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3576 (export "test3576") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3577 (export "test3577") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3578 (export "test3578") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3579 (export "test3579") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3580 (export "test3580") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3581 (export "test3581") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3582 (export "test3582") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3583 (export "test3583") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3584 (export "test3584") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3585 (export "test3585") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3586 (export "test3586") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3587 (export "test3587") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3588 (export "test3588") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3589 (export "test3589") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3590 (export "test3590") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3591 (export "test3591") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3592 (export "test3592") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3593 (export "test3593") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3594 (export "test3594") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3595 (export "test3595") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3596 (export "test3596") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3597 (export "test3597") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3598 (export "test3598") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3599 (export "test3599") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3600 (export "test3600") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3601 (export "test3601") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3602 (export "test3602") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3603 (export "test3603") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3604 (export "test3604") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3605 (export "test3605") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3606 (export "test3606") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3607 (export "test3607") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3608 (export "test3608") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3609 (export "test3609") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3610 (export "test3610") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3611 (export "test3611") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3612 (export "test3612") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3613 (export "test3613") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3614 (export "test3614") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3615 (export "test3615") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3616 (export "test3616") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3617 (export "test3617") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3618 (export "test3618") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3619 (export "test3619") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3620 (export "test3620") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3621 (export "test3621") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3622 (export "test3622") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3623 (export "test3623") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3624 (export "test3624") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3625 (export "test3625") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3626 (export "test3626") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3627 (export "test3627") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3628 (export "test3628") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3629 (export "test3629") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3630 (export "test3630") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3631 (export "test3631") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3632 (export "test3632") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3633 (export "test3633") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3634 (export "test3634") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3635 (export "test3635") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3636 (export "test3636") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3637 (export "test3637") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3638 (export "test3638") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3639 (export "test3639") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3640 (export "test3640") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3641 (export "test3641") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3642 (export "test3642") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3643 (export "test3643") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3644 (export "test3644") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3645 (export "test3645") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3646 (export "test3646") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3647 (export "test3647") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3648 (export "test3648") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3649 (export "test3649") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3650 (export "test3650") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3651 (export "test3651") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3652 (export "test3652") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3653 (export "test3653") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3654 (export "test3654") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3655 (export "test3655") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3656 (export "test3656") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3657 (export "test3657") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3658 (export "test3658") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3659 (export "test3659") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3660 (export "test3660") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3661 (export "test3661") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3662 (export "test3662") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3663 (export "test3663") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3664 (export "test3664") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3665 (export "test3665") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3666 (export "test3666") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3667 (export "test3667") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3668 (export "test3668") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3669 (export "test3669") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3670 (export "test3670") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3671 (export "test3671") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3672 (export "test3672") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3673 (export "test3673") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3674 (export "test3674") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3675 (export "test3675") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3676 (export "test3676") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3677 (export "test3677") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3678 (export "test3678") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3679 (export "test3679") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3680 (export "test3680") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3681 (export "test3681") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3682 (export "test3682") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3683 (export "test3683") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3684 (export "test3684") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3685 (export "test3685") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3686 (export "test3686") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3687 (export "test3687") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3688 (export "test3688") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3689 (export "test3689") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3690 (export "test3690") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3691 (export "test3691") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3692 (export "test3692") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3693 (export "test3693") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3694 (export "test3694") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3695 (export "test3695") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3696 (export "test3696") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3697 (export "test3697") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3698 (export "test3698") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3699 (export "test3699") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3700 (export "test3700") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3701 (export "test3701") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3702 (export "test3702") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3703 (export "test3703") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3704 (export "test3704") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3705 (export "test3705") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3706 (export "test3706") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3707 (export "test3707") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3708 (export "test3708") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3709 (export "test3709") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3710 (export "test3710") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3711 (export "test3711") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3712 (export "test3712") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3713 (export "test3713") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3714 (export "test3714") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3715 (export "test3715") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3716 (export "test3716") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3717 (export "test3717") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3718 (export "test3718") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3719 (export "test3719") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3720 (export "test3720") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3721 (export "test3721") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3722 (export "test3722") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3723 (export "test3723") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3724 (export "test3724") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3725 (export "test3725") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3726 (export "test3726") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3727 (export "test3727") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3728 (export "test3728") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3729 (export "test3729") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3730 (export "test3730") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3731 (export "test3731") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3732 (export "test3732") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3733 (export "test3733") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3734 (export "test3734") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3735 (export "test3735") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3736 (export "test3736") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3737 (export "test3737") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3738 (export "test3738") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3739 (export "test3739") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3740 (export "test3740") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3741 (export "test3741") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3742 (export "test3742") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3743 (export "test3743") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3744 (export "test3744") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3745 (export "test3745") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3746 (export "test3746") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3747 (export "test3747") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3748 (export "test3748") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3749 (export "test3749") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3750 (export "test3750") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3751 (export "test3751") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3752 (export "test3752") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3753 (export "test3753") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3754 (export "test3754") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3755 (export "test3755") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3756 (export "test3756") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3757 (export "test3757") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3758 (export "test3758") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3759 (export "test3759") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3760 (export "test3760") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3761 (export "test3761") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3762 (export "test3762") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3763 (export "test3763") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3764 (export "test3764") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3765 (export "test3765") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3766 (export "test3766") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3767 (export "test3767") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3768 (export "test3768") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3769 (export "test3769") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3770 (export "test3770") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3771 (export "test3771") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3772 (export "test3772") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3773 (export "test3773") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3774 (export "test3774") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3775 (export "test3775") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3776 (export "test3776") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3777 (export "test3777") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3778 (export "test3778") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3779 (export "test3779") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3780 (export "test3780") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3781 (export "test3781") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3782 (export "test3782") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3783 (export "test3783") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3784 (export "test3784") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3785 (export "test3785") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3786 (export "test3786") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3787 (export "test3787") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3788 (export "test3788") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3789 (export "test3789") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3790 (export "test3790") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3791 (export "test3791") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3792 (export "test3792") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3793 (export "test3793") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3794 (export "test3794") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3795 (export "test3795") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3796 (export "test3796") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3797 (export "test3797") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3798 (export "test3798") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3799 (export "test3799") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3800 (export "test3800") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3801 (export "test3801") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3802 (export "test3802") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3803 (export "test3803") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3804 (export "test3804") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3805 (export "test3805") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3806 (export "test3806") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3807 (export "test3807") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3808 (export "test3808") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3809 (export "test3809") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3810 (export "test3810") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3811 (export "test3811") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3812 (export "test3812") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3813 (export "test3813") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3814 (export "test3814") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3815 (export "test3815") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3816 (export "test3816") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3817 (export "test3817") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3818 (export "test3818") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3819 (export "test3819") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3820 (export "test3820") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3821 (export "test3821") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3822 (export "test3822") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3823 (export "test3823") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3824 (export "test3824") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3825 (export "test3825") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3826 (export "test3826") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3827 (export "test3827") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3828 (export "test3828") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3829 (export "test3829") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3830 (export "test3830") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3831 (export "test3831") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3832 (export "test3832") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3833 (export "test3833") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3834 (export "test3834") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3835 (export "test3835") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3836 (export "test3836") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3837 (export "test3837") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3838 (export "test3838") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3839 (export "test3839") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3840 (export "test3840") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3841 (export "test3841") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3842 (export "test3842") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3843 (export "test3843") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3844 (export "test3844") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3845 (export "test3845") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3846 (export "test3846") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3847 (export "test3847") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3848 (export "test3848") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3849 (export "test3849") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3850 (export "test3850") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3851 (export "test3851") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3852 (export "test3852") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3853 (export "test3853") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3854 (export "test3854") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3855 (export "test3855") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3856 (export "test3856") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3857 (export "test3857") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3858 (export "test3858") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3859 (export "test3859") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3860 (export "test3860") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3861 (export "test3861") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3862 (export "test3862") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3863 (export "test3863") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3864 (export "test3864") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3865 (export "test3865") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3866 (export "test3866") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3867 (export "test3867") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3868 (export "test3868") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3869 (export "test3869") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3870 (export "test3870") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3871 (export "test3871") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3872 (export "test3872") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3873 (export "test3873") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3874 (export "test3874") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3875 (export "test3875") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3876 (export "test3876") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3877 (export "test3877") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3878 (export "test3878") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3879 (export "test3879") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3880 (export "test3880") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3881 (export "test3881") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3882 (export "test3882") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3883 (export "test3883") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3884 (export "test3884") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3885 (export "test3885") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3886 (export "test3886") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3887 (export "test3887") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3888 (export "test3888") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3889 (export "test3889") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3890 (export "test3890") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3891 (export "test3891") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3892 (export "test3892") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3893 (export "test3893") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3894 (export "test3894") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3895 (export "test3895") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3896 (export "test3896") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3897 (export "test3897") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3898 (export "test3898") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3899 (export "test3899") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3900 (export "test3900") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3901 (export "test3901") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3902 (export "test3902") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3903 (export "test3903") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3904 (export "test3904") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3905 (export "test3905") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3906 (export "test3906") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3907 (export "test3907") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3908 (export "test3908") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3909 (export "test3909") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3910 (export "test3910") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3911 (export "test3911") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3912 (export "test3912") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3913 (export "test3913") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3914 (export "test3914") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3915 (export "test3915") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3916 (export "test3916") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3917 (export "test3917") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3918 (export "test3918") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3919 (export "test3919") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3920 (export "test3920") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3921 (export "test3921") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3922 (export "test3922") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3923 (export "test3923") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3924 (export "test3924") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3925 (export "test3925") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3926 (export "test3926") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3927 (export "test3927") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3928 (export "test3928") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3929 (export "test3929") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3930 (export "test3930") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3931 (export "test3931") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3932 (export "test3932") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3933 (export "test3933") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3934 (export "test3934") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3935 (export "test3935") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3936 (export "test3936") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3937 (export "test3937") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3938 (export "test3938") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3939 (export "test3939") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3940 (export "test3940") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3941 (export "test3941") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3942 (export "test3942") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3943 (export "test3943") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3944 (export "test3944") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3945 (export "test3945") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3946 (export "test3946") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3947 (export "test3947") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3948 (export "test3948") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3949 (export "test3949") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3950 (export "test3950") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3951 (export "test3951") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3952 (export "test3952") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3953 (export "test3953") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3954 (export "test3954") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3955 (export "test3955") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3956 (export "test3956") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3957 (export "test3957") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3958 (export "test3958") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3959 (export "test3959") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3960 (export "test3960") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3961 (export "test3961") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3962 (export "test3962") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3963 (export "test3963") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3964 (export "test3964") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3965 (export "test3965") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3966 (export "test3966") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3967 (export "test3967") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3968 (export "test3968") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3969 (export "test3969") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3970 (export "test3970") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3971 (export "test3971") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3972 (export "test3972") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3973 (export "test3973") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3974 (export "test3974") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3975 (export "test3975") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3976 (export "test3976") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3977 (export "test3977") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3978 (export "test3978") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3979 (export "test3979") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3980 (export "test3980") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3981 (export "test3981") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3982 (export "test3982") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3983 (export "test3983") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3984 (export "test3984") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3985 (export "test3985") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3986 (export "test3986") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3987 (export "test3987") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3988 (export "test3988") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3989 (export "test3989") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3990 (export "test3990") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3991 (export "test3991") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3992 (export "test3992") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3993 (export "test3993") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3994 (export "test3994") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3995 (export "test3995") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3996 (export "test3996") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3997 (export "test3997") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3998 (export "test3998") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test3999 (export "test3999") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4000 (export "test4000") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4001 (export "test4001") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4002 (export "test4002") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4003 (export "test4003") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4004 (export "test4004") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4005 (export "test4005") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4006 (export "test4006") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4007 (export "test4007") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4008 (export "test4008") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4009 (export "test4009") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4010 (export "test4010") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4011 (export "test4011") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4012 (export "test4012") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4013 (export "test4013") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4014 (export "test4014") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4015 (export "test4015") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4016 (export "test4016") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4017 (export "test4017") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4018 (export "test4018") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4019 (export "test4019") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4020 (export "test4020") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4021 (export "test4021") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4022 (export "test4022") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4023 (export "test4023") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4024 (export "test4024") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4025 (export "test4025") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4026 (export "test4026") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4027 (export "test4027") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4028 (export "test4028") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4029 (export "test4029") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4030 (export "test4030") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4031 (export "test4031") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4032 (export "test4032") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4033 (export "test4033") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4034 (export "test4034") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4035 (export "test4035") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4036 (export "test4036") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4037 (export "test4037") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4038 (export "test4038") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4039 (export "test4039") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4040 (export "test4040") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4041 (export "test4041") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4042 (export "test4042") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4043 (export "test4043") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4044 (export "test4044") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4045 (export "test4045") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4046 (export "test4046") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4047 (export "test4047") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4048 (export "test4048") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4049 (export "test4049") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4050 (export "test4050") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4051 (export "test4051") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4052 (export "test4052") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4053 (export "test4053") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4054 (export "test4054") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4055 (export "test4055") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4056 (export "test4056") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4057 (export "test4057") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4058 (export "test4058") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4059 (export "test4059") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4060 (export "test4060") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4061 (export "test4061") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4062 (export "test4062") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4063 (export "test4063") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4064 (export "test4064") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4065 (export "test4065") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4066 (export "test4066") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4067 (export "test4067") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4068 (export "test4068") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4069 (export "test4069") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4070 (export "test4070") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4071 (export "test4071") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4072 (export "test4072") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4073 (export "test4073") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4074 (export "test4074") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4075 (export "test4075") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4076 (export "test4076") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4077 (export "test4077") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4078 (export "test4078") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4079 (export "test4079") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4080 (export "test4080") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4081 (export "test4081") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4082 (export "test4082") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4083 (export "test4083") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4084 (export "test4084") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4085 (export "test4085") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4086 (export "test4086") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4087 (export "test4087") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4088 (export "test4088") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4089 (export "test4089") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4090 (export "test4090") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4091 (export "test4091") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4092 (export "test4092") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4093 (export "test4093") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4094 (export "test4094") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4095 (export "test4095") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4096 (export "test4096") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4097 (export "test4097") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4098 (export "test4098") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4099 (export "test4099") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4100 (export "test4100") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4101 (export "test4101") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4102 (export "test4102") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4103 (export "test4103") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4104 (export "test4104") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4105 (export "test4105") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4106 (export "test4106") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4107 (export "test4107") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4108 (export "test4108") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4109 (export "test4109") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4110 (export "test4110") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4111 (export "test4111") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4112 (export "test4112") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4113 (export "test4113") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4114 (export "test4114") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4115 (export "test4115") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4116 (export "test4116") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4117 (export "test4117") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4118 (export "test4118") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4119 (export "test4119") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4120 (export "test4120") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4121 (export "test4121") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4122 (export "test4122") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4123 (export "test4123") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4124 (export "test4124") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4125 (export "test4125") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4126 (export "test4126") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4127 (export "test4127") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4128 (export "test4128") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4129 (export "test4129") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4130 (export "test4130") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4131 (export "test4131") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4132 (export "test4132") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4133 (export "test4133") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4134 (export "test4134") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4135 (export "test4135") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4136 (export "test4136") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4137 (export "test4137") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4138 (export "test4138") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4139 (export "test4139") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4140 (export "test4140") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4141 (export "test4141") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4142 (export "test4142") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4143 (export "test4143") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4144 (export "test4144") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4145 (export "test4145") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4146 (export "test4146") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4147 (export "test4147") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4148 (export "test4148") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4149 (export "test4149") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4150 (export "test4150") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4151 (export "test4151") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4152 (export "test4152") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4153 (export "test4153") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4154 (export "test4154") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4155 (export "test4155") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4156 (export "test4156") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4157 (export "test4157") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4158 (export "test4158") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4159 (export "test4159") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4160 (export "test4160") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4161 (export "test4161") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4162 (export "test4162") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4163 (export "test4163") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4164 (export "test4164") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4165 (export "test4165") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4166 (export "test4166") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4167 (export "test4167") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4168 (export "test4168") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4169 (export "test4169") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4170 (export "test4170") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4171 (export "test4171") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4172 (export "test4172") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4173 (export "test4173") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4174 (export "test4174") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4175 (export "test4175") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4176 (export "test4176") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4177 (export "test4177") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4178 (export "test4178") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4179 (export "test4179") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4180 (export "test4180") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4181 (export "test4181") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4182 (export "test4182") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4183 (export "test4183") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4184 (export "test4184") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4185 (export "test4185") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4186 (export "test4186") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4187 (export "test4187") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4188 (export "test4188") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4189 (export "test4189") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4190 (export "test4190") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4191 (export "test4191") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4192 (export "test4192") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4193 (export "test4193") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4194 (export "test4194") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4195 (export "test4195") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4196 (export "test4196") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4197 (export "test4197") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4198 (export "test4198") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4199 (export "test4199") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4200 (export "test4200") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4201 (export "test4201") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4202 (export "test4202") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4203 (export "test4203") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4204 (export "test4204") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4205 (export "test4205") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4206 (export "test4206") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4207 (export "test4207") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4208 (export "test4208") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4209 (export "test4209") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4210 (export "test4210") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4211 (export "test4211") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4212 (export "test4212") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4213 (export "test4213") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4214 (export "test4214") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4215 (export "test4215") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4216 (export "test4216") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4217 (export "test4217") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4218 (export "test4218") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4219 (export "test4219") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4220 (export "test4220") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4221 (export "test4221") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4222 (export "test4222") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4223 (export "test4223") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4224 (export "test4224") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4225 (export "test4225") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4226 (export "test4226") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4227 (export "test4227") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4228 (export "test4228") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4229 (export "test4229") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4230 (export "test4230") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4231 (export "test4231") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4232 (export "test4232") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4233 (export "test4233") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4234 (export "test4234") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4235 (export "test4235") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4236 (export "test4236") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4237 (export "test4237") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4238 (export "test4238") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4239 (export "test4239") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4240 (export "test4240") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4241 (export "test4241") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4242 (export "test4242") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4243 (export "test4243") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4244 (export "test4244") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4245 (export "test4245") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4246 (export "test4246") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4247 (export "test4247") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4248 (export "test4248") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4249 (export "test4249") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4250 (export "test4250") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4251 (export "test4251") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4252 (export "test4252") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4253 (export "test4253") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4254 (export "test4254") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4255 (export "test4255") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4256 (export "test4256") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4257 (export "test4257") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4258 (export "test4258") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4259 (export "test4259") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4260 (export "test4260") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4261 (export "test4261") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4262 (export "test4262") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4263 (export "test4263") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4264 (export "test4264") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4265 (export "test4265") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4266 (export "test4266") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4267 (export "test4267") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4268 (export "test4268") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4269 (export "test4269") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4270 (export "test4270") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4271 (export "test4271") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4272 (export "test4272") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4273 (export "test4273") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4274 (export "test4274") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4275 (export "test4275") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4276 (export "test4276") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4277 (export "test4277") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4278 (export "test4278") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4279 (export "test4279") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4280 (export "test4280") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4281 (export "test4281") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4282 (export "test4282") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4283 (export "test4283") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4284 (export "test4284") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4285 (export "test4285") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4286 (export "test4286") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4287 (export "test4287") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4288 (export "test4288") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4289 (export "test4289") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4290 (export "test4290") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4291 (export "test4291") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4292 (export "test4292") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4293 (export "test4293") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4294 (export "test4294") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4295 (export "test4295") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4296 (export "test4296") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4297 (export "test4297") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4298 (export "test4298") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4299 (export "test4299") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4300 (export "test4300") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4301 (export "test4301") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4302 (export "test4302") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4303 (export "test4303") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4304 (export "test4304") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4305 (export "test4305") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4306 (export "test4306") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4307 (export "test4307") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4308 (export "test4308") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4309 (export "test4309") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4310 (export "test4310") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4311 (export "test4311") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4312 (export "test4312") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4313 (export "test4313") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4314 (export "test4314") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4315 (export "test4315") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4316 (export "test4316") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4317 (export "test4317") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4318 (export "test4318") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4319 (export "test4319") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4320 (export "test4320") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4321 (export "test4321") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4322 (export "test4322") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4323 (export "test4323") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4324 (export "test4324") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4325 (export "test4325") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4326 (export "test4326") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4327 (export "test4327") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4328 (export "test4328") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4329 (export "test4329") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4330 (export "test4330") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4331 (export "test4331") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4332 (export "test4332") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4333 (export "test4333") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4334 (export "test4334") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4335 (export "test4335") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4336 (export "test4336") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4337 (export "test4337") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4338 (export "test4338") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4339 (export "test4339") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4340 (export "test4340") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4341 (export "test4341") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4342 (export "test4342") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4343 (export "test4343") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4344 (export "test4344") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4345 (export "test4345") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4346 (export "test4346") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4347 (export "test4347") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4348 (export "test4348") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4349 (export "test4349") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4350 (export "test4350") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4351 (export "test4351") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4352 (export "test4352") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4353 (export "test4353") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4354 (export "test4354") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4355 (export "test4355") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4356 (export "test4356") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4357 (export "test4357") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4358 (export "test4358") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4359 (export "test4359") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4360 (export "test4360") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4361 (export "test4361") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4362 (export "test4362") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4363 (export "test4363") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4364 (export "test4364") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4365 (export "test4365") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4366 (export "test4366") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4367 (export "test4367") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4368 (export "test4368") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4369 (export "test4369") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4370 (export "test4370") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4371 (export "test4371") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4372 (export "test4372") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4373 (export "test4373") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4374 (export "test4374") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4375 (export "test4375") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4376 (export "test4376") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4377 (export "test4377") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4378 (export "test4378") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4379 (export "test4379") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4380 (export "test4380") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4381 (export "test4381") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4382 (export "test4382") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4383 (export "test4383") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4384 (export "test4384") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4385 (export "test4385") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4386 (export "test4386") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4387 (export "test4387") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4388 (export "test4388") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4389 (export "test4389") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4390 (export "test4390") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4391 (export "test4391") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4392 (export "test4392") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4393 (export "test4393") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4394 (export "test4394") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4395 (export "test4395") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4396 (export "test4396") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4397 (export "test4397") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4398 (export "test4398") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4399 (export "test4399") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4400 (export "test4400") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4401 (export "test4401") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4402 (export "test4402") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4403 (export "test4403") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4404 (export "test4404") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4405 (export "test4405") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4406 (export "test4406") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4407 (export "test4407") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4408 (export "test4408") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4409 (export "test4409") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4410 (export "test4410") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4411 (export "test4411") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4412 (export "test4412") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4413 (export "test4413") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4414 (export "test4414") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4415 (export "test4415") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4416 (export "test4416") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4417 (export "test4417") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4418 (export "test4418") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4419 (export "test4419") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4420 (export "test4420") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4421 (export "test4421") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4422 (export "test4422") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4423 (export "test4423") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4424 (export "test4424") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4425 (export "test4425") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4426 (export "test4426") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4427 (export "test4427") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4428 (export "test4428") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4429 (export "test4429") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4430 (export "test4430") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4431 (export "test4431") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4432 (export "test4432") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4433 (export "test4433") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4434 (export "test4434") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4435 (export "test4435") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4436 (export "test4436") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4437 (export "test4437") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4438 (export "test4438") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4439 (export "test4439") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4440 (export "test4440") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4441 (export "test4441") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4442 (export "test4442") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4443 (export "test4443") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4444 (export "test4444") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4445 (export "test4445") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4446 (export "test4446") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4447 (export "test4447") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4448 (export "test4448") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4449 (export "test4449") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4450 (export "test4450") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4451 (export "test4451") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4452 (export "test4452") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4453 (export "test4453") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4454 (export "test4454") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4455 (export "test4455") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4456 (export "test4456") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4457 (export "test4457") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4458 (export "test4458") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4459 (export "test4459") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4460 (export "test4460") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4461 (export "test4461") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4462 (export "test4462") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4463 (export "test4463") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4464 (export "test4464") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4465 (export "test4465") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4466 (export "test4466") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4467 (export "test4467") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4468 (export "test4468") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4469 (export "test4469") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4470 (export "test4470") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4471 (export "test4471") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4472 (export "test4472") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4473 (export "test4473") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4474 (export "test4474") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4475 (export "test4475") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4476 (export "test4476") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4477 (export "test4477") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4478 (export "test4478") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4479 (export "test4479") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4480 (export "test4480") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4481 (export "test4481") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4482 (export "test4482") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4483 (export "test4483") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4484 (export "test4484") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4485 (export "test4485") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4486 (export "test4486") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4487 (export "test4487") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4488 (export "test4488") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4489 (export "test4489") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4490 (export "test4490") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4491 (export "test4491") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4492 (export "test4492") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4493 (export "test4493") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4494 (export "test4494") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4495 (export "test4495") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4496 (export "test4496") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4497 (export "test4497") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4498 (export "test4498") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4499 (export "test4499") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4500 (export "test4500") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4501 (export "test4501") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4502 (export "test4502") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4503 (export "test4503") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4504 (export "test4504") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4505 (export "test4505") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4506 (export "test4506") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4507 (export "test4507") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4508 (export "test4508") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4509 (export "test4509") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4510 (export "test4510") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4511 (export "test4511") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4512 (export "test4512") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4513 (export "test4513") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4514 (export "test4514") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4515 (export "test4515") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4516 (export "test4516") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4517 (export "test4517") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4518 (export "test4518") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4519 (export "test4519") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4520 (export "test4520") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4521 (export "test4521") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4522 (export "test4522") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4523 (export "test4523") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4524 (export "test4524") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4525 (export "test4525") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4526 (export "test4526") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4527 (export "test4527") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4528 (export "test4528") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4529 (export "test4529") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4530 (export "test4530") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4531 (export "test4531") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4532 (export "test4532") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4533 (export "test4533") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4534 (export "test4534") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4535 (export "test4535") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4536 (export "test4536") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4537 (export "test4537") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4538 (export "test4538") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4539 (export "test4539") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4540 (export "test4540") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4541 (export "test4541") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4542 (export "test4542") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4543 (export "test4543") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4544 (export "test4544") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4545 (export "test4545") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4546 (export "test4546") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4547 (export "test4547") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4548 (export "test4548") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4549 (export "test4549") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4550 (export "test4550") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4551 (export "test4551") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4552 (export "test4552") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4553 (export "test4553") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4554 (export "test4554") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4555 (export "test4555") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4556 (export "test4556") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4557 (export "test4557") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4558 (export "test4558") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4559 (export "test4559") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4560 (export "test4560") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4561 (export "test4561") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4562 (export "test4562") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4563 (export "test4563") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4564 (export "test4564") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4565 (export "test4565") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4566 (export "test4566") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4567 (export "test4567") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4568 (export "test4568") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4569 (export "test4569") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4570 (export "test4570") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4571 (export "test4571") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4572 (export "test4572") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4573 (export "test4573") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4574 (export "test4574") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4575 (export "test4575") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4576 (export "test4576") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4577 (export "test4577") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4578 (export "test4578") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4579 (export "test4579") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4580 (export "test4580") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4581 (export "test4581") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4582 (export "test4582") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4583 (export "test4583") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4584 (export "test4584") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4585 (export "test4585") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4586 (export "test4586") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4587 (export "test4587") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4588 (export "test4588") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4589 (export "test4589") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4590 (export "test4590") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4591 (export "test4591") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4592 (export "test4592") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4593 (export "test4593") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4594 (export "test4594") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4595 (export "test4595") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4596 (export "test4596") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4597 (export "test4597") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4598 (export "test4598") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4599 (export "test4599") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4600 (export "test4600") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4601 (export "test4601") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4602 (export "test4602") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4603 (export "test4603") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4604 (export "test4604") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4605 (export "test4605") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4606 (export "test4606") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4607 (export "test4607") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4608 (export "test4608") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4609 (export "test4609") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4610 (export "test4610") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4611 (export "test4611") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4612 (export "test4612") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4613 (export "test4613") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4614 (export "test4614") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4615 (export "test4615") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4616 (export "test4616") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4617 (export "test4617") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4618 (export "test4618") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4619 (export "test4619") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4620 (export "test4620") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4621 (export "test4621") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4622 (export "test4622") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4623 (export "test4623") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4624 (export "test4624") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4625 (export "test4625") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4626 (export "test4626") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4627 (export "test4627") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4628 (export "test4628") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4629 (export "test4629") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4630 (export "test4630") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4631 (export "test4631") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4632 (export "test4632") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4633 (export "test4633") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4634 (export "test4634") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4635 (export "test4635") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4636 (export "test4636") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4637 (export "test4637") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4638 (export "test4638") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4639 (export "test4639") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4640 (export "test4640") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4641 (export "test4641") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4642 (export "test4642") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4643 (export "test4643") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4644 (export "test4644") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4645 (export "test4645") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4646 (export "test4646") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4647 (export "test4647") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4648 (export "test4648") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4649 (export "test4649") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4650 (export "test4650") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4651 (export "test4651") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4652 (export "test4652") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4653 (export "test4653") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4654 (export "test4654") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4655 (export "test4655") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4656 (export "test4656") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4657 (export "test4657") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4658 (export "test4658") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4659 (export "test4659") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4660 (export "test4660") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4661 (export "test4661") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4662 (export "test4662") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4663 (export "test4663") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4664 (export "test4664") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4665 (export "test4665") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4666 (export "test4666") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4667 (export "test4667") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4668 (export "test4668") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4669 (export "test4669") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4670 (export "test4670") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4671 (export "test4671") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4672 (export "test4672") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4673 (export "test4673") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4674 (export "test4674") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4675 (export "test4675") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4676 (export "test4676") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4677 (export "test4677") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4678 (export "test4678") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4679 (export "test4679") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4680 (export "test4680") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4681 (export "test4681") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4682 (export "test4682") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4683 (export "test4683") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4684 (export "test4684") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4685 (export "test4685") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4686 (export "test4686") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4687 (export "test4687") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4688 (export "test4688") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4689 (export "test4689") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4690 (export "test4690") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4691 (export "test4691") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4692 (export "test4692") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4693 (export "test4693") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4694 (export "test4694") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4695 (export "test4695") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4696 (export "test4696") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4697 (export "test4697") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4698 (export "test4698") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4699 (export "test4699") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4700 (export "test4700") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4701 (export "test4701") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4702 (export "test4702") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4703 (export "test4703") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4704 (export "test4704") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4705 (export "test4705") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4706 (export "test4706") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4707 (export "test4707") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4708 (export "test4708") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4709 (export "test4709") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4710 (export "test4710") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4711 (export "test4711") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4712 (export "test4712") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4713 (export "test4713") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4714 (export "test4714") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4715 (export "test4715") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4716 (export "test4716") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4717 (export "test4717") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4718 (export "test4718") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4719 (export "test4719") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4720 (export "test4720") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4721 (export "test4721") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4722 (export "test4722") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4723 (export "test4723") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4724 (export "test4724") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4725 (export "test4725") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4726 (export "test4726") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4727 (export "test4727") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4728 (export "test4728") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4729 (export "test4729") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4730 (export "test4730") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4731 (export "test4731") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4732 (export "test4732") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4733 (export "test4733") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4734 (export "test4734") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4735 (export "test4735") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4736 (export "test4736") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4737 (export "test4737") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4738 (export "test4738") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4739 (export "test4739") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4740 (export "test4740") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4741 (export "test4741") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4742 (export "test4742") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4743 (export "test4743") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4744 (export "test4744") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4745 (export "test4745") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4746 (export "test4746") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4747 (export "test4747") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4748 (export "test4748") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4749 (export "test4749") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4750 (export "test4750") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4751 (export "test4751") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4752 (export "test4752") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4753 (export "test4753") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4754 (export "test4754") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4755 (export "test4755") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4756 (export "test4756") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4757 (export "test4757") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4758 (export "test4758") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4759 (export "test4759") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4760 (export "test4760") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4761 (export "test4761") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4762 (export "test4762") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4763 (export "test4763") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4764 (export "test4764") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4765 (export "test4765") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4766 (export "test4766") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4767 (export "test4767") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4768 (export "test4768") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4769 (export "test4769") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4770 (export "test4770") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4771 (export "test4771") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4772 (export "test4772") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4773 (export "test4773") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4774 (export "test4774") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4775 (export "test4775") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4776 (export "test4776") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4777 (export "test4777") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4778 (export "test4778") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4779 (export "test4779") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4780 (export "test4780") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4781 (export "test4781") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4782 (export "test4782") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4783 (export "test4783") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4784 (export "test4784") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4785 (export "test4785") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4786 (export "test4786") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4787 (export "test4787") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4788 (export "test4788") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4789 (export "test4789") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4790 (export "test4790") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4791 (export "test4791") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4792 (export "test4792") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4793 (export "test4793") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4794 (export "test4794") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4795 (export "test4795") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4796 (export "test4796") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4797 (export "test4797") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4798 (export "test4798") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4799 (export "test4799") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4800 (export "test4800") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4801 (export "test4801") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4802 (export "test4802") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4803 (export "test4803") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4804 (export "test4804") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4805 (export "test4805") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4806 (export "test4806") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4807 (export "test4807") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4808 (export "test4808") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4809 (export "test4809") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4810 (export "test4810") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4811 (export "test4811") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4812 (export "test4812") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4813 (export "test4813") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4814 (export "test4814") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4815 (export "test4815") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4816 (export "test4816") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4817 (export "test4817") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4818 (export "test4818") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4819 (export "test4819") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4820 (export "test4820") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4821 (export "test4821") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4822 (export "test4822") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4823 (export "test4823") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4824 (export "test4824") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4825 (export "test4825") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4826 (export "test4826") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4827 (export "test4827") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4828 (export "test4828") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4829 (export "test4829") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4830 (export "test4830") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4831 (export "test4831") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4832 (export "test4832") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4833 (export "test4833") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4834 (export "test4834") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4835 (export "test4835") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4836 (export "test4836") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4837 (export "test4837") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4838 (export "test4838") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4839 (export "test4839") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4840 (export "test4840") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4841 (export "test4841") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4842 (export "test4842") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4843 (export "test4843") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4844 (export "test4844") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4845 (export "test4845") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4846 (export "test4846") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4847 (export "test4847") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4848 (export "test4848") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4849 (export "test4849") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4850 (export "test4850") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4851 (export "test4851") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4852 (export "test4852") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4853 (export "test4853") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4854 (export "test4854") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4855 (export "test4855") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4856 (export "test4856") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4857 (export "test4857") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4858 (export "test4858") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4859 (export "test4859") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4860 (export "test4860") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4861 (export "test4861") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4862 (export "test4862") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4863 (export "test4863") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4864 (export "test4864") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4865 (export "test4865") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4866 (export "test4866") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4867 (export "test4867") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4868 (export "test4868") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4869 (export "test4869") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4870 (export "test4870") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4871 (export "test4871") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4872 (export "test4872") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4873 (export "test4873") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4874 (export "test4874") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4875 (export "test4875") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4876 (export "test4876") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4877 (export "test4877") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4878 (export "test4878") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4879 (export "test4879") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4880 (export "test4880") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4881 (export "test4881") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4882 (export "test4882") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4883 (export "test4883") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4884 (export "test4884") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4885 (export "test4885") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4886 (export "test4886") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4887 (export "test4887") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4888 (export "test4888") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4889 (export "test4889") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4890 (export "test4890") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4891 (export "test4891") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4892 (export "test4892") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4893 (export "test4893") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4894 (export "test4894") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4895 (export "test4895") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4896 (export "test4896") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4897 (export "test4897") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4898 (export "test4898") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4899 (export "test4899") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4900 (export "test4900") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4901 (export "test4901") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4902 (export "test4902") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4903 (export "test4903") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4904 (export "test4904") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4905 (export "test4905") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4906 (export "test4906") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4907 (export "test4907") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4908 (export "test4908") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4909 (export "test4909") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4910 (export "test4910") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4911 (export "test4911") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4912 (export "test4912") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4913 (export "test4913") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4914 (export "test4914") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4915 (export "test4915") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4916 (export "test4916") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4917 (export "test4917") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4918 (export "test4918") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4919 (export "test4919") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4920 (export "test4920") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4921 (export "test4921") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4922 (export "test4922") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4923 (export "test4923") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4924 (export "test4924") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4925 (export "test4925") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4926 (export "test4926") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4927 (export "test4927") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4928 (export "test4928") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4929 (export "test4929") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4930 (export "test4930") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4931 (export "test4931") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4932 (export "test4932") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4933 (export "test4933") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4934 (export "test4934") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4935 (export "test4935") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4936 (export "test4936") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4937 (export "test4937") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4938 (export "test4938") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4939 (export "test4939") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4940 (export "test4940") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4941 (export "test4941") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4942 (export "test4942") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4943 (export "test4943") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4944 (export "test4944") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4945 (export "test4945") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4946 (export "test4946") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4947 (export "test4947") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4948 (export "test4948") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4949 (export "test4949") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4950 (export "test4950") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4951 (export "test4951") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4952 (export "test4952") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4953 (export "test4953") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4954 (export "test4954") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4955 (export "test4955") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4956 (export "test4956") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4957 (export "test4957") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4958 (export "test4958") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4959 (export "test4959") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4960 (export "test4960") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4961 (export "test4961") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4962 (export "test4962") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4963 (export "test4963") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4964 (export "test4964") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4965 (export "test4965") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4966 (export "test4966") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4967 (export "test4967") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4968 (export "test4968") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4969 (export "test4969") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4970 (export "test4970") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4971 (export "test4971") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4972 (export "test4972") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4973 (export "test4973") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4974 (export "test4974") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4975 (export "test4975") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4976 (export "test4976") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4977 (export "test4977") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4978 (export "test4978") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4979 (export "test4979") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4980 (export "test4980") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4981 (export "test4981") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4982 (export "test4982") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4983 (export "test4983") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4984 (export "test4984") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4985 (export "test4985") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4986 (export "test4986") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4987 (export "test4987") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4988 (export "test4988") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4989 (export "test4989") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4990 (export "test4990") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4991 (export "test4991") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4992 (export "test4992") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4993 (export "test4993") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4994 (export "test4994") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4995 (export "test4995") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4996 (export "test4996") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4997 (export "test4997") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4998 (export "test4998") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) + (func $test4999 (export "test4999") + (param $p0 i32) + (param $p1 i32) + (result i32) + ;; Return sum of p0 + p1 + local.get $p0 + local.get $p1 + i32.add + ) +) diff --git a/src/test/app/wasm_fixtures/wat/locals_10k.wat b/src/test/app/wasm_fixtures/wat/locals_10k.wat new file mode 100644 index 00000000000..6cd6d4baf4f --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/locals_10k.wat @@ -0,0 +1,50000 @@ +(module + (func $test (export "test") + (param $p0 i32) + (param $p1 i32) + (result i32) + (local $l2 i32) + (local $l3 i32) + (local $l4 i32) + (local $l5 i32) + (local $l6 i32) + (local $l7 i32) + (local $l8 i32) + (local $l9 i32) + (local $l10 i32) + (local $l11 i32) + (local $l12 i32) + (local $l13 i32) + (local $l14 i32) + (local $l15 i32) + (local $l16 i32) + (local $l17 i32) + (local $l18 i32) + (local $l19 i32) + (local $l20 i32) + (local $l21 i32) + (local $l22 i32) + (local $l23 i32) + (local $l24 i32) + (local $l25 i32) + (local $l26 i32) + (local $l27 i32) + (local $l28 i32) + (local $l29 i32) + (local $l30 i32) + (local $l31 i32) + (local $l32 i32) + (local $l33 i32) + (local $l34 i32) + (local $l35 i32) + (local $l36 i32) + (local $l37 i32) + (local $l38 i32) + (local $l39 i32) + (local $l40 i32) + (local $l41 i32) + (local $l42 i32) + (local $l43 i32) + (local $l44 i32) + (local $l45 i32) + (local $l46 i32) + (local $l47 i32) + (local $l48 i32) + (local $l49 i32) + (local $l50 i32) + (local $l51 i32) + (local $l52 i32) + (local $l53 i32) + (local $l54 i32) + (local $l55 i32) + (local $l56 i32) + (local $l57 i32) + (local $l58 i32) + (local $l59 i32) + (local $l60 i32) + (local $l61 i32) + (local $l62 i32) + (local $l63 i32) + (local $l64 i32) + (local $l65 i32) + (local $l66 i32) + (local $l67 i32) + (local $l68 i32) + (local $l69 i32) + (local $l70 i32) + (local $l71 i32) + (local $l72 i32) + (local $l73 i32) + (local $l74 i32) + (local $l75 i32) + (local $l76 i32) + (local $l77 i32) + (local $l78 i32) + (local $l79 i32) + (local $l80 i32) + (local $l81 i32) + (local $l82 i32) + (local $l83 i32) + (local $l84 i32) + (local $l85 i32) + (local $l86 i32) + (local $l87 i32) + (local $l88 i32) + (local $l89 i32) + (local $l90 i32) + (local $l91 i32) + (local $l92 i32) + (local $l93 i32) + (local $l94 i32) + (local $l95 i32) + (local $l96 i32) + (local $l97 i32) + (local $l98 i32) + (local $l99 i32) + (local $l100 i32) + (local $l101 i32) + (local $l102 i32) + (local $l103 i32) + (local $l104 i32) + (local $l105 i32) + (local $l106 i32) + (local $l107 i32) + (local $l108 i32) + (local $l109 i32) + (local $l110 i32) + (local $l111 i32) + (local $l112 i32) + (local $l113 i32) + (local $l114 i32) + (local $l115 i32) + (local $l116 i32) + (local $l117 i32) + (local $l118 i32) + (local $l119 i32) + (local $l120 i32) + (local $l121 i32) + (local $l122 i32) + (local $l123 i32) + (local $l124 i32) + (local $l125 i32) + (local $l126 i32) + (local $l127 i32) + (local $l128 i32) + (local $l129 i32) + (local $l130 i32) + (local $l131 i32) + (local $l132 i32) + (local $l133 i32) + (local $l134 i32) + (local $l135 i32) + (local $l136 i32) + (local $l137 i32) + (local $l138 i32) + (local $l139 i32) + (local $l140 i32) + (local $l141 i32) + (local $l142 i32) + (local $l143 i32) + (local $l144 i32) + (local $l145 i32) + (local $l146 i32) + (local $l147 i32) + (local $l148 i32) + (local $l149 i32) + (local $l150 i32) + (local $l151 i32) + (local $l152 i32) + (local $l153 i32) + (local $l154 i32) + (local $l155 i32) + (local $l156 i32) + (local $l157 i32) + (local $l158 i32) + (local $l159 i32) + (local $l160 i32) + (local $l161 i32) + (local $l162 i32) + (local $l163 i32) + (local $l164 i32) + (local $l165 i32) + (local $l166 i32) + (local $l167 i32) + (local $l168 i32) + (local $l169 i32) + (local $l170 i32) + (local $l171 i32) + (local $l172 i32) + (local $l173 i32) + (local $l174 i32) + (local $l175 i32) + (local $l176 i32) + (local $l177 i32) + (local $l178 i32) + (local $l179 i32) + (local $l180 i32) + (local $l181 i32) + (local $l182 i32) + (local $l183 i32) + (local $l184 i32) + (local $l185 i32) + (local $l186 i32) + (local $l187 i32) + (local $l188 i32) + (local $l189 i32) + (local $l190 i32) + (local $l191 i32) + (local $l192 i32) + (local $l193 i32) + (local $l194 i32) + (local $l195 i32) + (local $l196 i32) + (local $l197 i32) + (local $l198 i32) + (local $l199 i32) + (local $l200 i32) + (local $l201 i32) + (local $l202 i32) + (local $l203 i32) + (local $l204 i32) + (local $l205 i32) + (local $l206 i32) + (local $l207 i32) + (local $l208 i32) + (local $l209 i32) + (local $l210 i32) + (local $l211 i32) + (local $l212 i32) + (local $l213 i32) + (local $l214 i32) + (local $l215 i32) + (local $l216 i32) + (local $l217 i32) + (local $l218 i32) + (local $l219 i32) + (local $l220 i32) + (local $l221 i32) + (local $l222 i32) + (local $l223 i32) + (local $l224 i32) + (local $l225 i32) + (local $l226 i32) + (local $l227 i32) + (local $l228 i32) + (local $l229 i32) + (local $l230 i32) + (local $l231 i32) + (local $l232 i32) + (local $l233 i32) + (local $l234 i32) + (local $l235 i32) + (local $l236 i32) + (local $l237 i32) + (local $l238 i32) + (local $l239 i32) + (local $l240 i32) + (local $l241 i32) + (local $l242 i32) + (local $l243 i32) + (local $l244 i32) + (local $l245 i32) + (local $l246 i32) + (local $l247 i32) + (local $l248 i32) + (local $l249 i32) + (local $l250 i32) + (local $l251 i32) + (local $l252 i32) + (local $l253 i32) + (local $l254 i32) + (local $l255 i32) + (local $l256 i32) + (local $l257 i32) + (local $l258 i32) + (local $l259 i32) + (local $l260 i32) + (local $l261 i32) + (local $l262 i32) + (local $l263 i32) + (local $l264 i32) + (local $l265 i32) + (local $l266 i32) + (local $l267 i32) + (local $l268 i32) + (local $l269 i32) + (local $l270 i32) + (local $l271 i32) + (local $l272 i32) + (local $l273 i32) + (local $l274 i32) + (local $l275 i32) + (local $l276 i32) + (local $l277 i32) + (local $l278 i32) + (local $l279 i32) + (local $l280 i32) + (local $l281 i32) + (local $l282 i32) + (local $l283 i32) + (local $l284 i32) + (local $l285 i32) + (local $l286 i32) + (local $l287 i32) + (local $l288 i32) + (local $l289 i32) + (local $l290 i32) + (local $l291 i32) + (local $l292 i32) + (local $l293 i32) + (local $l294 i32) + (local $l295 i32) + (local $l296 i32) + (local $l297 i32) + (local $l298 i32) + (local $l299 i32) + (local $l300 i32) + (local $l301 i32) + (local $l302 i32) + (local $l303 i32) + (local $l304 i32) + (local $l305 i32) + (local $l306 i32) + (local $l307 i32) + (local $l308 i32) + (local $l309 i32) + (local $l310 i32) + (local $l311 i32) + (local $l312 i32) + (local $l313 i32) + (local $l314 i32) + (local $l315 i32) + (local $l316 i32) + (local $l317 i32) + (local $l318 i32) + (local $l319 i32) + (local $l320 i32) + (local $l321 i32) + (local $l322 i32) + (local $l323 i32) + (local $l324 i32) + (local $l325 i32) + (local $l326 i32) + (local $l327 i32) + (local $l328 i32) + (local $l329 i32) + (local $l330 i32) + (local $l331 i32) + (local $l332 i32) + (local $l333 i32) + (local $l334 i32) + (local $l335 i32) + (local $l336 i32) + (local $l337 i32) + (local $l338 i32) + (local $l339 i32) + (local $l340 i32) + (local $l341 i32) + (local $l342 i32) + (local $l343 i32) + (local $l344 i32) + (local $l345 i32) + (local $l346 i32) + (local $l347 i32) + (local $l348 i32) + (local $l349 i32) + (local $l350 i32) + (local $l351 i32) + (local $l352 i32) + (local $l353 i32) + (local $l354 i32) + (local $l355 i32) + (local $l356 i32) + (local $l357 i32) + (local $l358 i32) + (local $l359 i32) + (local $l360 i32) + (local $l361 i32) + (local $l362 i32) + (local $l363 i32) + (local $l364 i32) + (local $l365 i32) + (local $l366 i32) + (local $l367 i32) + (local $l368 i32) + (local $l369 i32) + (local $l370 i32) + (local $l371 i32) + (local $l372 i32) + (local $l373 i32) + (local $l374 i32) + (local $l375 i32) + (local $l376 i32) + (local $l377 i32) + (local $l378 i32) + (local $l379 i32) + (local $l380 i32) + (local $l381 i32) + (local $l382 i32) + (local $l383 i32) + (local $l384 i32) + (local $l385 i32) + (local $l386 i32) + (local $l387 i32) + (local $l388 i32) + (local $l389 i32) + (local $l390 i32) + (local $l391 i32) + (local $l392 i32) + (local $l393 i32) + (local $l394 i32) + (local $l395 i32) + (local $l396 i32) + (local $l397 i32) + (local $l398 i32) + (local $l399 i32) + (local $l400 i32) + (local $l401 i32) + (local $l402 i32) + (local $l403 i32) + (local $l404 i32) + (local $l405 i32) + (local $l406 i32) + (local $l407 i32) + (local $l408 i32) + (local $l409 i32) + (local $l410 i32) + (local $l411 i32) + (local $l412 i32) + (local $l413 i32) + (local $l414 i32) + (local $l415 i32) + (local $l416 i32) + (local $l417 i32) + (local $l418 i32) + (local $l419 i32) + (local $l420 i32) + (local $l421 i32) + (local $l422 i32) + (local $l423 i32) + (local $l424 i32) + (local $l425 i32) + (local $l426 i32) + (local $l427 i32) + (local $l428 i32) + (local $l429 i32) + (local $l430 i32) + (local $l431 i32) + (local $l432 i32) + (local $l433 i32) + (local $l434 i32) + (local $l435 i32) + (local $l436 i32) + (local $l437 i32) + (local $l438 i32) + (local $l439 i32) + (local $l440 i32) + (local $l441 i32) + (local $l442 i32) + (local $l443 i32) + (local $l444 i32) + (local $l445 i32) + (local $l446 i32) + (local $l447 i32) + (local $l448 i32) + (local $l449 i32) + (local $l450 i32) + (local $l451 i32) + (local $l452 i32) + (local $l453 i32) + (local $l454 i32) + (local $l455 i32) + (local $l456 i32) + (local $l457 i32) + (local $l458 i32) + (local $l459 i32) + (local $l460 i32) + (local $l461 i32) + (local $l462 i32) + (local $l463 i32) + (local $l464 i32) + (local $l465 i32) + (local $l466 i32) + (local $l467 i32) + (local $l468 i32) + (local $l469 i32) + (local $l470 i32) + (local $l471 i32) + (local $l472 i32) + (local $l473 i32) + (local $l474 i32) + (local $l475 i32) + (local $l476 i32) + (local $l477 i32) + (local $l478 i32) + (local $l479 i32) + (local $l480 i32) + (local $l481 i32) + (local $l482 i32) + (local $l483 i32) + (local $l484 i32) + (local $l485 i32) + (local $l486 i32) + (local $l487 i32) + (local $l488 i32) + (local $l489 i32) + (local $l490 i32) + (local $l491 i32) + (local $l492 i32) + (local $l493 i32) + (local $l494 i32) + (local $l495 i32) + (local $l496 i32) + (local $l497 i32) + (local $l498 i32) + (local $l499 i32) + (local $l500 i32) + (local $l501 i32) + (local $l502 i32) + (local $l503 i32) + (local $l504 i32) + (local $l505 i32) + (local $l506 i32) + (local $l507 i32) + (local $l508 i32) + (local $l509 i32) + (local $l510 i32) + (local $l511 i32) + (local $l512 i32) + (local $l513 i32) + (local $l514 i32) + (local $l515 i32) + (local $l516 i32) + (local $l517 i32) + (local $l518 i32) + (local $l519 i32) + (local $l520 i32) + (local $l521 i32) + (local $l522 i32) + (local $l523 i32) + (local $l524 i32) + (local $l525 i32) + (local $l526 i32) + (local $l527 i32) + (local $l528 i32) + (local $l529 i32) + (local $l530 i32) + (local $l531 i32) + (local $l532 i32) + (local $l533 i32) + (local $l534 i32) + (local $l535 i32) + (local $l536 i32) + (local $l537 i32) + (local $l538 i32) + (local $l539 i32) + (local $l540 i32) + (local $l541 i32) + (local $l542 i32) + (local $l543 i32) + (local $l544 i32) + (local $l545 i32) + (local $l546 i32) + (local $l547 i32) + (local $l548 i32) + (local $l549 i32) + (local $l550 i32) + (local $l551 i32) + (local $l552 i32) + (local $l553 i32) + (local $l554 i32) + (local $l555 i32) + (local $l556 i32) + (local $l557 i32) + (local $l558 i32) + (local $l559 i32) + (local $l560 i32) + (local $l561 i32) + (local $l562 i32) + (local $l563 i32) + (local $l564 i32) + (local $l565 i32) + (local $l566 i32) + (local $l567 i32) + (local $l568 i32) + (local $l569 i32) + (local $l570 i32) + (local $l571 i32) + (local $l572 i32) + (local $l573 i32) + (local $l574 i32) + (local $l575 i32) + (local $l576 i32) + (local $l577 i32) + (local $l578 i32) + (local $l579 i32) + (local $l580 i32) + (local $l581 i32) + (local $l582 i32) + (local $l583 i32) + (local $l584 i32) + (local $l585 i32) + (local $l586 i32) + (local $l587 i32) + (local $l588 i32) + (local $l589 i32) + (local $l590 i32) + (local $l591 i32) + (local $l592 i32) + (local $l593 i32) + (local $l594 i32) + (local $l595 i32) + (local $l596 i32) + (local $l597 i32) + (local $l598 i32) + (local $l599 i32) + (local $l600 i32) + (local $l601 i32) + (local $l602 i32) + (local $l603 i32) + (local $l604 i32) + (local $l605 i32) + (local $l606 i32) + (local $l607 i32) + (local $l608 i32) + (local $l609 i32) + (local $l610 i32) + (local $l611 i32) + (local $l612 i32) + (local $l613 i32) + (local $l614 i32) + (local $l615 i32) + (local $l616 i32) + (local $l617 i32) + (local $l618 i32) + (local $l619 i32) + (local $l620 i32) + (local $l621 i32) + (local $l622 i32) + (local $l623 i32) + (local $l624 i32) + (local $l625 i32) + (local $l626 i32) + (local $l627 i32) + (local $l628 i32) + (local $l629 i32) + (local $l630 i32) + (local $l631 i32) + (local $l632 i32) + (local $l633 i32) + (local $l634 i32) + (local $l635 i32) + (local $l636 i32) + (local $l637 i32) + (local $l638 i32) + (local $l639 i32) + (local $l640 i32) + (local $l641 i32) + (local $l642 i32) + (local $l643 i32) + (local $l644 i32) + (local $l645 i32) + (local $l646 i32) + (local $l647 i32) + (local $l648 i32) + (local $l649 i32) + (local $l650 i32) + (local $l651 i32) + (local $l652 i32) + (local $l653 i32) + (local $l654 i32) + (local $l655 i32) + (local $l656 i32) + (local $l657 i32) + (local $l658 i32) + (local $l659 i32) + (local $l660 i32) + (local $l661 i32) + (local $l662 i32) + (local $l663 i32) + (local $l664 i32) + (local $l665 i32) + (local $l666 i32) + (local $l667 i32) + (local $l668 i32) + (local $l669 i32) + (local $l670 i32) + (local $l671 i32) + (local $l672 i32) + (local $l673 i32) + (local $l674 i32) + (local $l675 i32) + (local $l676 i32) + (local $l677 i32) + (local $l678 i32) + (local $l679 i32) + (local $l680 i32) + (local $l681 i32) + (local $l682 i32) + (local $l683 i32) + (local $l684 i32) + (local $l685 i32) + (local $l686 i32) + (local $l687 i32) + (local $l688 i32) + (local $l689 i32) + (local $l690 i32) + (local $l691 i32) + (local $l692 i32) + (local $l693 i32) + (local $l694 i32) + (local $l695 i32) + (local $l696 i32) + (local $l697 i32) + (local $l698 i32) + (local $l699 i32) + (local $l700 i32) + (local $l701 i32) + (local $l702 i32) + (local $l703 i32) + (local $l704 i32) + (local $l705 i32) + (local $l706 i32) + (local $l707 i32) + (local $l708 i32) + (local $l709 i32) + (local $l710 i32) + (local $l711 i32) + (local $l712 i32) + (local $l713 i32) + (local $l714 i32) + (local $l715 i32) + (local $l716 i32) + (local $l717 i32) + (local $l718 i32) + (local $l719 i32) + (local $l720 i32) + (local $l721 i32) + (local $l722 i32) + (local $l723 i32) + (local $l724 i32) + (local $l725 i32) + (local $l726 i32) + (local $l727 i32) + (local $l728 i32) + (local $l729 i32) + (local $l730 i32) + (local $l731 i32) + (local $l732 i32) + (local $l733 i32) + (local $l734 i32) + (local $l735 i32) + (local $l736 i32) + (local $l737 i32) + (local $l738 i32) + (local $l739 i32) + (local $l740 i32) + (local $l741 i32) + (local $l742 i32) + (local $l743 i32) + (local $l744 i32) + (local $l745 i32) + (local $l746 i32) + (local $l747 i32) + (local $l748 i32) + (local $l749 i32) + (local $l750 i32) + (local $l751 i32) + (local $l752 i32) + (local $l753 i32) + (local $l754 i32) + (local $l755 i32) + (local $l756 i32) + (local $l757 i32) + (local $l758 i32) + (local $l759 i32) + (local $l760 i32) + (local $l761 i32) + (local $l762 i32) + (local $l763 i32) + (local $l764 i32) + (local $l765 i32) + (local $l766 i32) + (local $l767 i32) + (local $l768 i32) + (local $l769 i32) + (local $l770 i32) + (local $l771 i32) + (local $l772 i32) + (local $l773 i32) + (local $l774 i32) + (local $l775 i32) + (local $l776 i32) + (local $l777 i32) + (local $l778 i32) + (local $l779 i32) + (local $l780 i32) + (local $l781 i32) + (local $l782 i32) + (local $l783 i32) + (local $l784 i32) + (local $l785 i32) + (local $l786 i32) + (local $l787 i32) + (local $l788 i32) + (local $l789 i32) + (local $l790 i32) + (local $l791 i32) + (local $l792 i32) + (local $l793 i32) + (local $l794 i32) + (local $l795 i32) + (local $l796 i32) + (local $l797 i32) + (local $l798 i32) + (local $l799 i32) + (local $l800 i32) + (local $l801 i32) + (local $l802 i32) + (local $l803 i32) + (local $l804 i32) + (local $l805 i32) + (local $l806 i32) + (local $l807 i32) + (local $l808 i32) + (local $l809 i32) + (local $l810 i32) + (local $l811 i32) + (local $l812 i32) + (local $l813 i32) + (local $l814 i32) + (local $l815 i32) + (local $l816 i32) + (local $l817 i32) + (local $l818 i32) + (local $l819 i32) + (local $l820 i32) + (local $l821 i32) + (local $l822 i32) + (local $l823 i32) + (local $l824 i32) + (local $l825 i32) + (local $l826 i32) + (local $l827 i32) + (local $l828 i32) + (local $l829 i32) + (local $l830 i32) + (local $l831 i32) + (local $l832 i32) + (local $l833 i32) + (local $l834 i32) + (local $l835 i32) + (local $l836 i32) + (local $l837 i32) + (local $l838 i32) + (local $l839 i32) + (local $l840 i32) + (local $l841 i32) + (local $l842 i32) + (local $l843 i32) + (local $l844 i32) + (local $l845 i32) + (local $l846 i32) + (local $l847 i32) + (local $l848 i32) + (local $l849 i32) + (local $l850 i32) + (local $l851 i32) + (local $l852 i32) + (local $l853 i32) + (local $l854 i32) + (local $l855 i32) + (local $l856 i32) + (local $l857 i32) + (local $l858 i32) + (local $l859 i32) + (local $l860 i32) + (local $l861 i32) + (local $l862 i32) + (local $l863 i32) + (local $l864 i32) + (local $l865 i32) + (local $l866 i32) + (local $l867 i32) + (local $l868 i32) + (local $l869 i32) + (local $l870 i32) + (local $l871 i32) + (local $l872 i32) + (local $l873 i32) + (local $l874 i32) + (local $l875 i32) + (local $l876 i32) + (local $l877 i32) + (local $l878 i32) + (local $l879 i32) + (local $l880 i32) + (local $l881 i32) + (local $l882 i32) + (local $l883 i32) + (local $l884 i32) + (local $l885 i32) + (local $l886 i32) + (local $l887 i32) + (local $l888 i32) + (local $l889 i32) + (local $l890 i32) + (local $l891 i32) + (local $l892 i32) + (local $l893 i32) + (local $l894 i32) + (local $l895 i32) + (local $l896 i32) + (local $l897 i32) + (local $l898 i32) + (local $l899 i32) + (local $l900 i32) + (local $l901 i32) + (local $l902 i32) + (local $l903 i32) + (local $l904 i32) + (local $l905 i32) + (local $l906 i32) + (local $l907 i32) + (local $l908 i32) + (local $l909 i32) + (local $l910 i32) + (local $l911 i32) + (local $l912 i32) + (local $l913 i32) + (local $l914 i32) + (local $l915 i32) + (local $l916 i32) + (local $l917 i32) + (local $l918 i32) + (local $l919 i32) + (local $l920 i32) + (local $l921 i32) + (local $l922 i32) + (local $l923 i32) + (local $l924 i32) + (local $l925 i32) + (local $l926 i32) + (local $l927 i32) + (local $l928 i32) + (local $l929 i32) + (local $l930 i32) + (local $l931 i32) + (local $l932 i32) + (local $l933 i32) + (local $l934 i32) + (local $l935 i32) + (local $l936 i32) + (local $l937 i32) + (local $l938 i32) + (local $l939 i32) + (local $l940 i32) + (local $l941 i32) + (local $l942 i32) + (local $l943 i32) + (local $l944 i32) + (local $l945 i32) + (local $l946 i32) + (local $l947 i32) + (local $l948 i32) + (local $l949 i32) + (local $l950 i32) + (local $l951 i32) + (local $l952 i32) + (local $l953 i32) + (local $l954 i32) + (local $l955 i32) + (local $l956 i32) + (local $l957 i32) + (local $l958 i32) + (local $l959 i32) + (local $l960 i32) + (local $l961 i32) + (local $l962 i32) + (local $l963 i32) + (local $l964 i32) + (local $l965 i32) + (local $l966 i32) + (local $l967 i32) + (local $l968 i32) + (local $l969 i32) + (local $l970 i32) + (local $l971 i32) + (local $l972 i32) + (local $l973 i32) + (local $l974 i32) + (local $l975 i32) + (local $l976 i32) + (local $l977 i32) + (local $l978 i32) + (local $l979 i32) + (local $l980 i32) + (local $l981 i32) + (local $l982 i32) + (local $l983 i32) + (local $l984 i32) + (local $l985 i32) + (local $l986 i32) + (local $l987 i32) + (local $l988 i32) + (local $l989 i32) + (local $l990 i32) + (local $l991 i32) + (local $l992 i32) + (local $l993 i32) + (local $l994 i32) + (local $l995 i32) + (local $l996 i32) + (local $l997 i32) + (local $l998 i32) + (local $l999 i32) + (local $l1000 i32) + (local $l1001 i32) + (local $l1002 i32) + (local $l1003 i32) + (local $l1004 i32) + (local $l1005 i32) + (local $l1006 i32) + (local $l1007 i32) + (local $l1008 i32) + (local $l1009 i32) + (local $l1010 i32) + (local $l1011 i32) + (local $l1012 i32) + (local $l1013 i32) + (local $l1014 i32) + (local $l1015 i32) + (local $l1016 i32) + (local $l1017 i32) + (local $l1018 i32) + (local $l1019 i32) + (local $l1020 i32) + (local $l1021 i32) + (local $l1022 i32) + (local $l1023 i32) + (local $l1024 i32) + (local $l1025 i32) + (local $l1026 i32) + (local $l1027 i32) + (local $l1028 i32) + (local $l1029 i32) + (local $l1030 i32) + (local $l1031 i32) + (local $l1032 i32) + (local $l1033 i32) + (local $l1034 i32) + (local $l1035 i32) + (local $l1036 i32) + (local $l1037 i32) + (local $l1038 i32) + (local $l1039 i32) + (local $l1040 i32) + (local $l1041 i32) + (local $l1042 i32) + (local $l1043 i32) + (local $l1044 i32) + (local $l1045 i32) + (local $l1046 i32) + (local $l1047 i32) + (local $l1048 i32) + (local $l1049 i32) + (local $l1050 i32) + (local $l1051 i32) + (local $l1052 i32) + (local $l1053 i32) + (local $l1054 i32) + (local $l1055 i32) + (local $l1056 i32) + (local $l1057 i32) + (local $l1058 i32) + (local $l1059 i32) + (local $l1060 i32) + (local $l1061 i32) + (local $l1062 i32) + (local $l1063 i32) + (local $l1064 i32) + (local $l1065 i32) + (local $l1066 i32) + (local $l1067 i32) + (local $l1068 i32) + (local $l1069 i32) + (local $l1070 i32) + (local $l1071 i32) + (local $l1072 i32) + (local $l1073 i32) + (local $l1074 i32) + (local $l1075 i32) + (local $l1076 i32) + (local $l1077 i32) + (local $l1078 i32) + (local $l1079 i32) + (local $l1080 i32) + (local $l1081 i32) + (local $l1082 i32) + (local $l1083 i32) + (local $l1084 i32) + (local $l1085 i32) + (local $l1086 i32) + (local $l1087 i32) + (local $l1088 i32) + (local $l1089 i32) + (local $l1090 i32) + (local $l1091 i32) + (local $l1092 i32) + (local $l1093 i32) + (local $l1094 i32) + (local $l1095 i32) + (local $l1096 i32) + (local $l1097 i32) + (local $l1098 i32) + (local $l1099 i32) + (local $l1100 i32) + (local $l1101 i32) + (local $l1102 i32) + (local $l1103 i32) + (local $l1104 i32) + (local $l1105 i32) + (local $l1106 i32) + (local $l1107 i32) + (local $l1108 i32) + (local $l1109 i32) + (local $l1110 i32) + (local $l1111 i32) + (local $l1112 i32) + (local $l1113 i32) + (local $l1114 i32) + (local $l1115 i32) + (local $l1116 i32) + (local $l1117 i32) + (local $l1118 i32) + (local $l1119 i32) + (local $l1120 i32) + (local $l1121 i32) + (local $l1122 i32) + (local $l1123 i32) + (local $l1124 i32) + (local $l1125 i32) + (local $l1126 i32) + (local $l1127 i32) + (local $l1128 i32) + (local $l1129 i32) + (local $l1130 i32) + (local $l1131 i32) + (local $l1132 i32) + (local $l1133 i32) + (local $l1134 i32) + (local $l1135 i32) + (local $l1136 i32) + (local $l1137 i32) + (local $l1138 i32) + (local $l1139 i32) + (local $l1140 i32) + (local $l1141 i32) + (local $l1142 i32) + (local $l1143 i32) + (local $l1144 i32) + (local $l1145 i32) + (local $l1146 i32) + (local $l1147 i32) + (local $l1148 i32) + (local $l1149 i32) + (local $l1150 i32) + (local $l1151 i32) + (local $l1152 i32) + (local $l1153 i32) + (local $l1154 i32) + (local $l1155 i32) + (local $l1156 i32) + (local $l1157 i32) + (local $l1158 i32) + (local $l1159 i32) + (local $l1160 i32) + (local $l1161 i32) + (local $l1162 i32) + (local $l1163 i32) + (local $l1164 i32) + (local $l1165 i32) + (local $l1166 i32) + (local $l1167 i32) + (local $l1168 i32) + (local $l1169 i32) + (local $l1170 i32) + (local $l1171 i32) + (local $l1172 i32) + (local $l1173 i32) + (local $l1174 i32) + (local $l1175 i32) + (local $l1176 i32) + (local $l1177 i32) + (local $l1178 i32) + (local $l1179 i32) + (local $l1180 i32) + (local $l1181 i32) + (local $l1182 i32) + (local $l1183 i32) + (local $l1184 i32) + (local $l1185 i32) + (local $l1186 i32) + (local $l1187 i32) + (local $l1188 i32) + (local $l1189 i32) + (local $l1190 i32) + (local $l1191 i32) + (local $l1192 i32) + (local $l1193 i32) + (local $l1194 i32) + (local $l1195 i32) + (local $l1196 i32) + (local $l1197 i32) + (local $l1198 i32) + (local $l1199 i32) + (local $l1200 i32) + (local $l1201 i32) + (local $l1202 i32) + (local $l1203 i32) + (local $l1204 i32) + (local $l1205 i32) + (local $l1206 i32) + (local $l1207 i32) + (local $l1208 i32) + (local $l1209 i32) + (local $l1210 i32) + (local $l1211 i32) + (local $l1212 i32) + (local $l1213 i32) + (local $l1214 i32) + (local $l1215 i32) + (local $l1216 i32) + (local $l1217 i32) + (local $l1218 i32) + (local $l1219 i32) + (local $l1220 i32) + (local $l1221 i32) + (local $l1222 i32) + (local $l1223 i32) + (local $l1224 i32) + (local $l1225 i32) + (local $l1226 i32) + (local $l1227 i32) + (local $l1228 i32) + (local $l1229 i32) + (local $l1230 i32) + (local $l1231 i32) + (local $l1232 i32) + (local $l1233 i32) + (local $l1234 i32) + (local $l1235 i32) + (local $l1236 i32) + (local $l1237 i32) + (local $l1238 i32) + (local $l1239 i32) + (local $l1240 i32) + (local $l1241 i32) + (local $l1242 i32) + (local $l1243 i32) + (local $l1244 i32) + (local $l1245 i32) + (local $l1246 i32) + (local $l1247 i32) + (local $l1248 i32) + (local $l1249 i32) + (local $l1250 i32) + (local $l1251 i32) + (local $l1252 i32) + (local $l1253 i32) + (local $l1254 i32) + (local $l1255 i32) + (local $l1256 i32) + (local $l1257 i32) + (local $l1258 i32) + (local $l1259 i32) + (local $l1260 i32) + (local $l1261 i32) + (local $l1262 i32) + (local $l1263 i32) + (local $l1264 i32) + (local $l1265 i32) + (local $l1266 i32) + (local $l1267 i32) + (local $l1268 i32) + (local $l1269 i32) + (local $l1270 i32) + (local $l1271 i32) + (local $l1272 i32) + (local $l1273 i32) + (local $l1274 i32) + (local $l1275 i32) + (local $l1276 i32) + (local $l1277 i32) + (local $l1278 i32) + (local $l1279 i32) + (local $l1280 i32) + (local $l1281 i32) + (local $l1282 i32) + (local $l1283 i32) + (local $l1284 i32) + (local $l1285 i32) + (local $l1286 i32) + (local $l1287 i32) + (local $l1288 i32) + (local $l1289 i32) + (local $l1290 i32) + (local $l1291 i32) + (local $l1292 i32) + (local $l1293 i32) + (local $l1294 i32) + (local $l1295 i32) + (local $l1296 i32) + (local $l1297 i32) + (local $l1298 i32) + (local $l1299 i32) + (local $l1300 i32) + (local $l1301 i32) + (local $l1302 i32) + (local $l1303 i32) + (local $l1304 i32) + (local $l1305 i32) + (local $l1306 i32) + (local $l1307 i32) + (local $l1308 i32) + (local $l1309 i32) + (local $l1310 i32) + (local $l1311 i32) + (local $l1312 i32) + (local $l1313 i32) + (local $l1314 i32) + (local $l1315 i32) + (local $l1316 i32) + (local $l1317 i32) + (local $l1318 i32) + (local $l1319 i32) + (local $l1320 i32) + (local $l1321 i32) + (local $l1322 i32) + (local $l1323 i32) + (local $l1324 i32) + (local $l1325 i32) + (local $l1326 i32) + (local $l1327 i32) + (local $l1328 i32) + (local $l1329 i32) + (local $l1330 i32) + (local $l1331 i32) + (local $l1332 i32) + (local $l1333 i32) + (local $l1334 i32) + (local $l1335 i32) + (local $l1336 i32) + (local $l1337 i32) + (local $l1338 i32) + (local $l1339 i32) + (local $l1340 i32) + (local $l1341 i32) + (local $l1342 i32) + (local $l1343 i32) + (local $l1344 i32) + (local $l1345 i32) + (local $l1346 i32) + (local $l1347 i32) + (local $l1348 i32) + (local $l1349 i32) + (local $l1350 i32) + (local $l1351 i32) + (local $l1352 i32) + (local $l1353 i32) + (local $l1354 i32) + (local $l1355 i32) + (local $l1356 i32) + (local $l1357 i32) + (local $l1358 i32) + (local $l1359 i32) + (local $l1360 i32) + (local $l1361 i32) + (local $l1362 i32) + (local $l1363 i32) + (local $l1364 i32) + (local $l1365 i32) + (local $l1366 i32) + (local $l1367 i32) + (local $l1368 i32) + (local $l1369 i32) + (local $l1370 i32) + (local $l1371 i32) + (local $l1372 i32) + (local $l1373 i32) + (local $l1374 i32) + (local $l1375 i32) + (local $l1376 i32) + (local $l1377 i32) + (local $l1378 i32) + (local $l1379 i32) + (local $l1380 i32) + (local $l1381 i32) + (local $l1382 i32) + (local $l1383 i32) + (local $l1384 i32) + (local $l1385 i32) + (local $l1386 i32) + (local $l1387 i32) + (local $l1388 i32) + (local $l1389 i32) + (local $l1390 i32) + (local $l1391 i32) + (local $l1392 i32) + (local $l1393 i32) + (local $l1394 i32) + (local $l1395 i32) + (local $l1396 i32) + (local $l1397 i32) + (local $l1398 i32) + (local $l1399 i32) + (local $l1400 i32) + (local $l1401 i32) + (local $l1402 i32) + (local $l1403 i32) + (local $l1404 i32) + (local $l1405 i32) + (local $l1406 i32) + (local $l1407 i32) + (local $l1408 i32) + (local $l1409 i32) + (local $l1410 i32) + (local $l1411 i32) + (local $l1412 i32) + (local $l1413 i32) + (local $l1414 i32) + (local $l1415 i32) + (local $l1416 i32) + (local $l1417 i32) + (local $l1418 i32) + (local $l1419 i32) + (local $l1420 i32) + (local $l1421 i32) + (local $l1422 i32) + (local $l1423 i32) + (local $l1424 i32) + (local $l1425 i32) + (local $l1426 i32) + (local $l1427 i32) + (local $l1428 i32) + (local $l1429 i32) + (local $l1430 i32) + (local $l1431 i32) + (local $l1432 i32) + (local $l1433 i32) + (local $l1434 i32) + (local $l1435 i32) + (local $l1436 i32) + (local $l1437 i32) + (local $l1438 i32) + (local $l1439 i32) + (local $l1440 i32) + (local $l1441 i32) + (local $l1442 i32) + (local $l1443 i32) + (local $l1444 i32) + (local $l1445 i32) + (local $l1446 i32) + (local $l1447 i32) + (local $l1448 i32) + (local $l1449 i32) + (local $l1450 i32) + (local $l1451 i32) + (local $l1452 i32) + (local $l1453 i32) + (local $l1454 i32) + (local $l1455 i32) + (local $l1456 i32) + (local $l1457 i32) + (local $l1458 i32) + (local $l1459 i32) + (local $l1460 i32) + (local $l1461 i32) + (local $l1462 i32) + (local $l1463 i32) + (local $l1464 i32) + (local $l1465 i32) + (local $l1466 i32) + (local $l1467 i32) + (local $l1468 i32) + (local $l1469 i32) + (local $l1470 i32) + (local $l1471 i32) + (local $l1472 i32) + (local $l1473 i32) + (local $l1474 i32) + (local $l1475 i32) + (local $l1476 i32) + (local $l1477 i32) + (local $l1478 i32) + (local $l1479 i32) + (local $l1480 i32) + (local $l1481 i32) + (local $l1482 i32) + (local $l1483 i32) + (local $l1484 i32) + (local $l1485 i32) + (local $l1486 i32) + (local $l1487 i32) + (local $l1488 i32) + (local $l1489 i32) + (local $l1490 i32) + (local $l1491 i32) + (local $l1492 i32) + (local $l1493 i32) + (local $l1494 i32) + (local $l1495 i32) + (local $l1496 i32) + (local $l1497 i32) + (local $l1498 i32) + (local $l1499 i32) + (local $l1500 i32) + (local $l1501 i32) + (local $l1502 i32) + (local $l1503 i32) + (local $l1504 i32) + (local $l1505 i32) + (local $l1506 i32) + (local $l1507 i32) + (local $l1508 i32) + (local $l1509 i32) + (local $l1510 i32) + (local $l1511 i32) + (local $l1512 i32) + (local $l1513 i32) + (local $l1514 i32) + (local $l1515 i32) + (local $l1516 i32) + (local $l1517 i32) + (local $l1518 i32) + (local $l1519 i32) + (local $l1520 i32) + (local $l1521 i32) + (local $l1522 i32) + (local $l1523 i32) + (local $l1524 i32) + (local $l1525 i32) + (local $l1526 i32) + (local $l1527 i32) + (local $l1528 i32) + (local $l1529 i32) + (local $l1530 i32) + (local $l1531 i32) + (local $l1532 i32) + (local $l1533 i32) + (local $l1534 i32) + (local $l1535 i32) + (local $l1536 i32) + (local $l1537 i32) + (local $l1538 i32) + (local $l1539 i32) + (local $l1540 i32) + (local $l1541 i32) + (local $l1542 i32) + (local $l1543 i32) + (local $l1544 i32) + (local $l1545 i32) + (local $l1546 i32) + (local $l1547 i32) + (local $l1548 i32) + (local $l1549 i32) + (local $l1550 i32) + (local $l1551 i32) + (local $l1552 i32) + (local $l1553 i32) + (local $l1554 i32) + (local $l1555 i32) + (local $l1556 i32) + (local $l1557 i32) + (local $l1558 i32) + (local $l1559 i32) + (local $l1560 i32) + (local $l1561 i32) + (local $l1562 i32) + (local $l1563 i32) + (local $l1564 i32) + (local $l1565 i32) + (local $l1566 i32) + (local $l1567 i32) + (local $l1568 i32) + (local $l1569 i32) + (local $l1570 i32) + (local $l1571 i32) + (local $l1572 i32) + (local $l1573 i32) + (local $l1574 i32) + (local $l1575 i32) + (local $l1576 i32) + (local $l1577 i32) + (local $l1578 i32) + (local $l1579 i32) + (local $l1580 i32) + (local $l1581 i32) + (local $l1582 i32) + (local $l1583 i32) + (local $l1584 i32) + (local $l1585 i32) + (local $l1586 i32) + (local $l1587 i32) + (local $l1588 i32) + (local $l1589 i32) + (local $l1590 i32) + (local $l1591 i32) + (local $l1592 i32) + (local $l1593 i32) + (local $l1594 i32) + (local $l1595 i32) + (local $l1596 i32) + (local $l1597 i32) + (local $l1598 i32) + (local $l1599 i32) + (local $l1600 i32) + (local $l1601 i32) + (local $l1602 i32) + (local $l1603 i32) + (local $l1604 i32) + (local $l1605 i32) + (local $l1606 i32) + (local $l1607 i32) + (local $l1608 i32) + (local $l1609 i32) + (local $l1610 i32) + (local $l1611 i32) + (local $l1612 i32) + (local $l1613 i32) + (local $l1614 i32) + (local $l1615 i32) + (local $l1616 i32) + (local $l1617 i32) + (local $l1618 i32) + (local $l1619 i32) + (local $l1620 i32) + (local $l1621 i32) + (local $l1622 i32) + (local $l1623 i32) + (local $l1624 i32) + (local $l1625 i32) + (local $l1626 i32) + (local $l1627 i32) + (local $l1628 i32) + (local $l1629 i32) + (local $l1630 i32) + (local $l1631 i32) + (local $l1632 i32) + (local $l1633 i32) + (local $l1634 i32) + (local $l1635 i32) + (local $l1636 i32) + (local $l1637 i32) + (local $l1638 i32) + (local $l1639 i32) + (local $l1640 i32) + (local $l1641 i32) + (local $l1642 i32) + (local $l1643 i32) + (local $l1644 i32) + (local $l1645 i32) + (local $l1646 i32) + (local $l1647 i32) + (local $l1648 i32) + (local $l1649 i32) + (local $l1650 i32) + (local $l1651 i32) + (local $l1652 i32) + (local $l1653 i32) + (local $l1654 i32) + (local $l1655 i32) + (local $l1656 i32) + (local $l1657 i32) + (local $l1658 i32) + (local $l1659 i32) + (local $l1660 i32) + (local $l1661 i32) + (local $l1662 i32) + (local $l1663 i32) + (local $l1664 i32) + (local $l1665 i32) + (local $l1666 i32) + (local $l1667 i32) + (local $l1668 i32) + (local $l1669 i32) + (local $l1670 i32) + (local $l1671 i32) + (local $l1672 i32) + (local $l1673 i32) + (local $l1674 i32) + (local $l1675 i32) + (local $l1676 i32) + (local $l1677 i32) + (local $l1678 i32) + (local $l1679 i32) + (local $l1680 i32) + (local $l1681 i32) + (local $l1682 i32) + (local $l1683 i32) + (local $l1684 i32) + (local $l1685 i32) + (local $l1686 i32) + (local $l1687 i32) + (local $l1688 i32) + (local $l1689 i32) + (local $l1690 i32) + (local $l1691 i32) + (local $l1692 i32) + (local $l1693 i32) + (local $l1694 i32) + (local $l1695 i32) + (local $l1696 i32) + (local $l1697 i32) + (local $l1698 i32) + (local $l1699 i32) + (local $l1700 i32) + (local $l1701 i32) + (local $l1702 i32) + (local $l1703 i32) + (local $l1704 i32) + (local $l1705 i32) + (local $l1706 i32) + (local $l1707 i32) + (local $l1708 i32) + (local $l1709 i32) + (local $l1710 i32) + (local $l1711 i32) + (local $l1712 i32) + (local $l1713 i32) + (local $l1714 i32) + (local $l1715 i32) + (local $l1716 i32) + (local $l1717 i32) + (local $l1718 i32) + (local $l1719 i32) + (local $l1720 i32) + (local $l1721 i32) + (local $l1722 i32) + (local $l1723 i32) + (local $l1724 i32) + (local $l1725 i32) + (local $l1726 i32) + (local $l1727 i32) + (local $l1728 i32) + (local $l1729 i32) + (local $l1730 i32) + (local $l1731 i32) + (local $l1732 i32) + (local $l1733 i32) + (local $l1734 i32) + (local $l1735 i32) + (local $l1736 i32) + (local $l1737 i32) + (local $l1738 i32) + (local $l1739 i32) + (local $l1740 i32) + (local $l1741 i32) + (local $l1742 i32) + (local $l1743 i32) + (local $l1744 i32) + (local $l1745 i32) + (local $l1746 i32) + (local $l1747 i32) + (local $l1748 i32) + (local $l1749 i32) + (local $l1750 i32) + (local $l1751 i32) + (local $l1752 i32) + (local $l1753 i32) + (local $l1754 i32) + (local $l1755 i32) + (local $l1756 i32) + (local $l1757 i32) + (local $l1758 i32) + (local $l1759 i32) + (local $l1760 i32) + (local $l1761 i32) + (local $l1762 i32) + (local $l1763 i32) + (local $l1764 i32) + (local $l1765 i32) + (local $l1766 i32) + (local $l1767 i32) + (local $l1768 i32) + (local $l1769 i32) + (local $l1770 i32) + (local $l1771 i32) + (local $l1772 i32) + (local $l1773 i32) + (local $l1774 i32) + (local $l1775 i32) + (local $l1776 i32) + (local $l1777 i32) + (local $l1778 i32) + (local $l1779 i32) + (local $l1780 i32) + (local $l1781 i32) + (local $l1782 i32) + (local $l1783 i32) + (local $l1784 i32) + (local $l1785 i32) + (local $l1786 i32) + (local $l1787 i32) + (local $l1788 i32) + (local $l1789 i32) + (local $l1790 i32) + (local $l1791 i32) + (local $l1792 i32) + (local $l1793 i32) + (local $l1794 i32) + (local $l1795 i32) + (local $l1796 i32) + (local $l1797 i32) + (local $l1798 i32) + (local $l1799 i32) + (local $l1800 i32) + (local $l1801 i32) + (local $l1802 i32) + (local $l1803 i32) + (local $l1804 i32) + (local $l1805 i32) + (local $l1806 i32) + (local $l1807 i32) + (local $l1808 i32) + (local $l1809 i32) + (local $l1810 i32) + (local $l1811 i32) + (local $l1812 i32) + (local $l1813 i32) + (local $l1814 i32) + (local $l1815 i32) + (local $l1816 i32) + (local $l1817 i32) + (local $l1818 i32) + (local $l1819 i32) + (local $l1820 i32) + (local $l1821 i32) + (local $l1822 i32) + (local $l1823 i32) + (local $l1824 i32) + (local $l1825 i32) + (local $l1826 i32) + (local $l1827 i32) + (local $l1828 i32) + (local $l1829 i32) + (local $l1830 i32) + (local $l1831 i32) + (local $l1832 i32) + (local $l1833 i32) + (local $l1834 i32) + (local $l1835 i32) + (local $l1836 i32) + (local $l1837 i32) + (local $l1838 i32) + (local $l1839 i32) + (local $l1840 i32) + (local $l1841 i32) + (local $l1842 i32) + (local $l1843 i32) + (local $l1844 i32) + (local $l1845 i32) + (local $l1846 i32) + (local $l1847 i32) + (local $l1848 i32) + (local $l1849 i32) + (local $l1850 i32) + (local $l1851 i32) + (local $l1852 i32) + (local $l1853 i32) + (local $l1854 i32) + (local $l1855 i32) + (local $l1856 i32) + (local $l1857 i32) + (local $l1858 i32) + (local $l1859 i32) + (local $l1860 i32) + (local $l1861 i32) + (local $l1862 i32) + (local $l1863 i32) + (local $l1864 i32) + (local $l1865 i32) + (local $l1866 i32) + (local $l1867 i32) + (local $l1868 i32) + (local $l1869 i32) + (local $l1870 i32) + (local $l1871 i32) + (local $l1872 i32) + (local $l1873 i32) + (local $l1874 i32) + (local $l1875 i32) + (local $l1876 i32) + (local $l1877 i32) + (local $l1878 i32) + (local $l1879 i32) + (local $l1880 i32) + (local $l1881 i32) + (local $l1882 i32) + (local $l1883 i32) + (local $l1884 i32) + (local $l1885 i32) + (local $l1886 i32) + (local $l1887 i32) + (local $l1888 i32) + (local $l1889 i32) + (local $l1890 i32) + (local $l1891 i32) + (local $l1892 i32) + (local $l1893 i32) + (local $l1894 i32) + (local $l1895 i32) + (local $l1896 i32) + (local $l1897 i32) + (local $l1898 i32) + (local $l1899 i32) + (local $l1900 i32) + (local $l1901 i32) + (local $l1902 i32) + (local $l1903 i32) + (local $l1904 i32) + (local $l1905 i32) + (local $l1906 i32) + (local $l1907 i32) + (local $l1908 i32) + (local $l1909 i32) + (local $l1910 i32) + (local $l1911 i32) + (local $l1912 i32) + (local $l1913 i32) + (local $l1914 i32) + (local $l1915 i32) + (local $l1916 i32) + (local $l1917 i32) + (local $l1918 i32) + (local $l1919 i32) + (local $l1920 i32) + (local $l1921 i32) + (local $l1922 i32) + (local $l1923 i32) + (local $l1924 i32) + (local $l1925 i32) + (local $l1926 i32) + (local $l1927 i32) + (local $l1928 i32) + (local $l1929 i32) + (local $l1930 i32) + (local $l1931 i32) + (local $l1932 i32) + (local $l1933 i32) + (local $l1934 i32) + (local $l1935 i32) + (local $l1936 i32) + (local $l1937 i32) + (local $l1938 i32) + (local $l1939 i32) + (local $l1940 i32) + (local $l1941 i32) + (local $l1942 i32) + (local $l1943 i32) + (local $l1944 i32) + (local $l1945 i32) + (local $l1946 i32) + (local $l1947 i32) + (local $l1948 i32) + (local $l1949 i32) + (local $l1950 i32) + (local $l1951 i32) + (local $l1952 i32) + (local $l1953 i32) + (local $l1954 i32) + (local $l1955 i32) + (local $l1956 i32) + (local $l1957 i32) + (local $l1958 i32) + (local $l1959 i32) + (local $l1960 i32) + (local $l1961 i32) + (local $l1962 i32) + (local $l1963 i32) + (local $l1964 i32) + (local $l1965 i32) + (local $l1966 i32) + (local $l1967 i32) + (local $l1968 i32) + (local $l1969 i32) + (local $l1970 i32) + (local $l1971 i32) + (local $l1972 i32) + (local $l1973 i32) + (local $l1974 i32) + (local $l1975 i32) + (local $l1976 i32) + (local $l1977 i32) + (local $l1978 i32) + (local $l1979 i32) + (local $l1980 i32) + (local $l1981 i32) + (local $l1982 i32) + (local $l1983 i32) + (local $l1984 i32) + (local $l1985 i32) + (local $l1986 i32) + (local $l1987 i32) + (local $l1988 i32) + (local $l1989 i32) + (local $l1990 i32) + (local $l1991 i32) + (local $l1992 i32) + (local $l1993 i32) + (local $l1994 i32) + (local $l1995 i32) + (local $l1996 i32) + (local $l1997 i32) + (local $l1998 i32) + (local $l1999 i32) + (local $l2000 i32) + (local $l2001 i32) + (local $l2002 i32) + (local $l2003 i32) + (local $l2004 i32) + (local $l2005 i32) + (local $l2006 i32) + (local $l2007 i32) + (local $l2008 i32) + (local $l2009 i32) + (local $l2010 i32) + (local $l2011 i32) + (local $l2012 i32) + (local $l2013 i32) + (local $l2014 i32) + (local $l2015 i32) + (local $l2016 i32) + (local $l2017 i32) + (local $l2018 i32) + (local $l2019 i32) + (local $l2020 i32) + (local $l2021 i32) + (local $l2022 i32) + (local $l2023 i32) + (local $l2024 i32) + (local $l2025 i32) + (local $l2026 i32) + (local $l2027 i32) + (local $l2028 i32) + (local $l2029 i32) + (local $l2030 i32) + (local $l2031 i32) + (local $l2032 i32) + (local $l2033 i32) + (local $l2034 i32) + (local $l2035 i32) + (local $l2036 i32) + (local $l2037 i32) + (local $l2038 i32) + (local $l2039 i32) + (local $l2040 i32) + (local $l2041 i32) + (local $l2042 i32) + (local $l2043 i32) + (local $l2044 i32) + (local $l2045 i32) + (local $l2046 i32) + (local $l2047 i32) + (local $l2048 i32) + (local $l2049 i32) + (local $l2050 i32) + (local $l2051 i32) + (local $l2052 i32) + (local $l2053 i32) + (local $l2054 i32) + (local $l2055 i32) + (local $l2056 i32) + (local $l2057 i32) + (local $l2058 i32) + (local $l2059 i32) + (local $l2060 i32) + (local $l2061 i32) + (local $l2062 i32) + (local $l2063 i32) + (local $l2064 i32) + (local $l2065 i32) + (local $l2066 i32) + (local $l2067 i32) + (local $l2068 i32) + (local $l2069 i32) + (local $l2070 i32) + (local $l2071 i32) + (local $l2072 i32) + (local $l2073 i32) + (local $l2074 i32) + (local $l2075 i32) + (local $l2076 i32) + (local $l2077 i32) + (local $l2078 i32) + (local $l2079 i32) + (local $l2080 i32) + (local $l2081 i32) + (local $l2082 i32) + (local $l2083 i32) + (local $l2084 i32) + (local $l2085 i32) + (local $l2086 i32) + (local $l2087 i32) + (local $l2088 i32) + (local $l2089 i32) + (local $l2090 i32) + (local $l2091 i32) + (local $l2092 i32) + (local $l2093 i32) + (local $l2094 i32) + (local $l2095 i32) + (local $l2096 i32) + (local $l2097 i32) + (local $l2098 i32) + (local $l2099 i32) + (local $l2100 i32) + (local $l2101 i32) + (local $l2102 i32) + (local $l2103 i32) + (local $l2104 i32) + (local $l2105 i32) + (local $l2106 i32) + (local $l2107 i32) + (local $l2108 i32) + (local $l2109 i32) + (local $l2110 i32) + (local $l2111 i32) + (local $l2112 i32) + (local $l2113 i32) + (local $l2114 i32) + (local $l2115 i32) + (local $l2116 i32) + (local $l2117 i32) + (local $l2118 i32) + (local $l2119 i32) + (local $l2120 i32) + (local $l2121 i32) + (local $l2122 i32) + (local $l2123 i32) + (local $l2124 i32) + (local $l2125 i32) + (local $l2126 i32) + (local $l2127 i32) + (local $l2128 i32) + (local $l2129 i32) + (local $l2130 i32) + (local $l2131 i32) + (local $l2132 i32) + (local $l2133 i32) + (local $l2134 i32) + (local $l2135 i32) + (local $l2136 i32) + (local $l2137 i32) + (local $l2138 i32) + (local $l2139 i32) + (local $l2140 i32) + (local $l2141 i32) + (local $l2142 i32) + (local $l2143 i32) + (local $l2144 i32) + (local $l2145 i32) + (local $l2146 i32) + (local $l2147 i32) + (local $l2148 i32) + (local $l2149 i32) + (local $l2150 i32) + (local $l2151 i32) + (local $l2152 i32) + (local $l2153 i32) + (local $l2154 i32) + (local $l2155 i32) + (local $l2156 i32) + (local $l2157 i32) + (local $l2158 i32) + (local $l2159 i32) + (local $l2160 i32) + (local $l2161 i32) + (local $l2162 i32) + (local $l2163 i32) + (local $l2164 i32) + (local $l2165 i32) + (local $l2166 i32) + (local $l2167 i32) + (local $l2168 i32) + (local $l2169 i32) + (local $l2170 i32) + (local $l2171 i32) + (local $l2172 i32) + (local $l2173 i32) + (local $l2174 i32) + (local $l2175 i32) + (local $l2176 i32) + (local $l2177 i32) + (local $l2178 i32) + (local $l2179 i32) + (local $l2180 i32) + (local $l2181 i32) + (local $l2182 i32) + (local $l2183 i32) + (local $l2184 i32) + (local $l2185 i32) + (local $l2186 i32) + (local $l2187 i32) + (local $l2188 i32) + (local $l2189 i32) + (local $l2190 i32) + (local $l2191 i32) + (local $l2192 i32) + (local $l2193 i32) + (local $l2194 i32) + (local $l2195 i32) + (local $l2196 i32) + (local $l2197 i32) + (local $l2198 i32) + (local $l2199 i32) + (local $l2200 i32) + (local $l2201 i32) + (local $l2202 i32) + (local $l2203 i32) + (local $l2204 i32) + (local $l2205 i32) + (local $l2206 i32) + (local $l2207 i32) + (local $l2208 i32) + (local $l2209 i32) + (local $l2210 i32) + (local $l2211 i32) + (local $l2212 i32) + (local $l2213 i32) + (local $l2214 i32) + (local $l2215 i32) + (local $l2216 i32) + (local $l2217 i32) + (local $l2218 i32) + (local $l2219 i32) + (local $l2220 i32) + (local $l2221 i32) + (local $l2222 i32) + (local $l2223 i32) + (local $l2224 i32) + (local $l2225 i32) + (local $l2226 i32) + (local $l2227 i32) + (local $l2228 i32) + (local $l2229 i32) + (local $l2230 i32) + (local $l2231 i32) + (local $l2232 i32) + (local $l2233 i32) + (local $l2234 i32) + (local $l2235 i32) + (local $l2236 i32) + (local $l2237 i32) + (local $l2238 i32) + (local $l2239 i32) + (local $l2240 i32) + (local $l2241 i32) + (local $l2242 i32) + (local $l2243 i32) + (local $l2244 i32) + (local $l2245 i32) + (local $l2246 i32) + (local $l2247 i32) + (local $l2248 i32) + (local $l2249 i32) + (local $l2250 i32) + (local $l2251 i32) + (local $l2252 i32) + (local $l2253 i32) + (local $l2254 i32) + (local $l2255 i32) + (local $l2256 i32) + (local $l2257 i32) + (local $l2258 i32) + (local $l2259 i32) + (local $l2260 i32) + (local $l2261 i32) + (local $l2262 i32) + (local $l2263 i32) + (local $l2264 i32) + (local $l2265 i32) + (local $l2266 i32) + (local $l2267 i32) + (local $l2268 i32) + (local $l2269 i32) + (local $l2270 i32) + (local $l2271 i32) + (local $l2272 i32) + (local $l2273 i32) + (local $l2274 i32) + (local $l2275 i32) + (local $l2276 i32) + (local $l2277 i32) + (local $l2278 i32) + (local $l2279 i32) + (local $l2280 i32) + (local $l2281 i32) + (local $l2282 i32) + (local $l2283 i32) + (local $l2284 i32) + (local $l2285 i32) + (local $l2286 i32) + (local $l2287 i32) + (local $l2288 i32) + (local $l2289 i32) + (local $l2290 i32) + (local $l2291 i32) + (local $l2292 i32) + (local $l2293 i32) + (local $l2294 i32) + (local $l2295 i32) + (local $l2296 i32) + (local $l2297 i32) + (local $l2298 i32) + (local $l2299 i32) + (local $l2300 i32) + (local $l2301 i32) + (local $l2302 i32) + (local $l2303 i32) + (local $l2304 i32) + (local $l2305 i32) + (local $l2306 i32) + (local $l2307 i32) + (local $l2308 i32) + (local $l2309 i32) + (local $l2310 i32) + (local $l2311 i32) + (local $l2312 i32) + (local $l2313 i32) + (local $l2314 i32) + (local $l2315 i32) + (local $l2316 i32) + (local $l2317 i32) + (local $l2318 i32) + (local $l2319 i32) + (local $l2320 i32) + (local $l2321 i32) + (local $l2322 i32) + (local $l2323 i32) + (local $l2324 i32) + (local $l2325 i32) + (local $l2326 i32) + (local $l2327 i32) + (local $l2328 i32) + (local $l2329 i32) + (local $l2330 i32) + (local $l2331 i32) + (local $l2332 i32) + (local $l2333 i32) + (local $l2334 i32) + (local $l2335 i32) + (local $l2336 i32) + (local $l2337 i32) + (local $l2338 i32) + (local $l2339 i32) + (local $l2340 i32) + (local $l2341 i32) + (local $l2342 i32) + (local $l2343 i32) + (local $l2344 i32) + (local $l2345 i32) + (local $l2346 i32) + (local $l2347 i32) + (local $l2348 i32) + (local $l2349 i32) + (local $l2350 i32) + (local $l2351 i32) + (local $l2352 i32) + (local $l2353 i32) + (local $l2354 i32) + (local $l2355 i32) + (local $l2356 i32) + (local $l2357 i32) + (local $l2358 i32) + (local $l2359 i32) + (local $l2360 i32) + (local $l2361 i32) + (local $l2362 i32) + (local $l2363 i32) + (local $l2364 i32) + (local $l2365 i32) + (local $l2366 i32) + (local $l2367 i32) + (local $l2368 i32) + (local $l2369 i32) + (local $l2370 i32) + (local $l2371 i32) + (local $l2372 i32) + (local $l2373 i32) + (local $l2374 i32) + (local $l2375 i32) + (local $l2376 i32) + (local $l2377 i32) + (local $l2378 i32) + (local $l2379 i32) + (local $l2380 i32) + (local $l2381 i32) + (local $l2382 i32) + (local $l2383 i32) + (local $l2384 i32) + (local $l2385 i32) + (local $l2386 i32) + (local $l2387 i32) + (local $l2388 i32) + (local $l2389 i32) + (local $l2390 i32) + (local $l2391 i32) + (local $l2392 i32) + (local $l2393 i32) + (local $l2394 i32) + (local $l2395 i32) + (local $l2396 i32) + (local $l2397 i32) + (local $l2398 i32) + (local $l2399 i32) + (local $l2400 i32) + (local $l2401 i32) + (local $l2402 i32) + (local $l2403 i32) + (local $l2404 i32) + (local $l2405 i32) + (local $l2406 i32) + (local $l2407 i32) + (local $l2408 i32) + (local $l2409 i32) + (local $l2410 i32) + (local $l2411 i32) + (local $l2412 i32) + (local $l2413 i32) + (local $l2414 i32) + (local $l2415 i32) + (local $l2416 i32) + (local $l2417 i32) + (local $l2418 i32) + (local $l2419 i32) + (local $l2420 i32) + (local $l2421 i32) + (local $l2422 i32) + (local $l2423 i32) + (local $l2424 i32) + (local $l2425 i32) + (local $l2426 i32) + (local $l2427 i32) + (local $l2428 i32) + (local $l2429 i32) + (local $l2430 i32) + (local $l2431 i32) + (local $l2432 i32) + (local $l2433 i32) + (local $l2434 i32) + (local $l2435 i32) + (local $l2436 i32) + (local $l2437 i32) + (local $l2438 i32) + (local $l2439 i32) + (local $l2440 i32) + (local $l2441 i32) + (local $l2442 i32) + (local $l2443 i32) + (local $l2444 i32) + (local $l2445 i32) + (local $l2446 i32) + (local $l2447 i32) + (local $l2448 i32) + (local $l2449 i32) + (local $l2450 i32) + (local $l2451 i32) + (local $l2452 i32) + (local $l2453 i32) + (local $l2454 i32) + (local $l2455 i32) + (local $l2456 i32) + (local $l2457 i32) + (local $l2458 i32) + (local $l2459 i32) + (local $l2460 i32) + (local $l2461 i32) + (local $l2462 i32) + (local $l2463 i32) + (local $l2464 i32) + (local $l2465 i32) + (local $l2466 i32) + (local $l2467 i32) + (local $l2468 i32) + (local $l2469 i32) + (local $l2470 i32) + (local $l2471 i32) + (local $l2472 i32) + (local $l2473 i32) + (local $l2474 i32) + (local $l2475 i32) + (local $l2476 i32) + (local $l2477 i32) + (local $l2478 i32) + (local $l2479 i32) + (local $l2480 i32) + (local $l2481 i32) + (local $l2482 i32) + (local $l2483 i32) + (local $l2484 i32) + (local $l2485 i32) + (local $l2486 i32) + (local $l2487 i32) + (local $l2488 i32) + (local $l2489 i32) + (local $l2490 i32) + (local $l2491 i32) + (local $l2492 i32) + (local $l2493 i32) + (local $l2494 i32) + (local $l2495 i32) + (local $l2496 i32) + (local $l2497 i32) + (local $l2498 i32) + (local $l2499 i32) + (local $l2500 i32) + (local $l2501 i32) + (local $l2502 i32) + (local $l2503 i32) + (local $l2504 i32) + (local $l2505 i32) + (local $l2506 i32) + (local $l2507 i32) + (local $l2508 i32) + (local $l2509 i32) + (local $l2510 i32) + (local $l2511 i32) + (local $l2512 i32) + (local $l2513 i32) + (local $l2514 i32) + (local $l2515 i32) + (local $l2516 i32) + (local $l2517 i32) + (local $l2518 i32) + (local $l2519 i32) + (local $l2520 i32) + (local $l2521 i32) + (local $l2522 i32) + (local $l2523 i32) + (local $l2524 i32) + (local $l2525 i32) + (local $l2526 i32) + (local $l2527 i32) + (local $l2528 i32) + (local $l2529 i32) + (local $l2530 i32) + (local $l2531 i32) + (local $l2532 i32) + (local $l2533 i32) + (local $l2534 i32) + (local $l2535 i32) + (local $l2536 i32) + (local $l2537 i32) + (local $l2538 i32) + (local $l2539 i32) + (local $l2540 i32) + (local $l2541 i32) + (local $l2542 i32) + (local $l2543 i32) + (local $l2544 i32) + (local $l2545 i32) + (local $l2546 i32) + (local $l2547 i32) + (local $l2548 i32) + (local $l2549 i32) + (local $l2550 i32) + (local $l2551 i32) + (local $l2552 i32) + (local $l2553 i32) + (local $l2554 i32) + (local $l2555 i32) + (local $l2556 i32) + (local $l2557 i32) + (local $l2558 i32) + (local $l2559 i32) + (local $l2560 i32) + (local $l2561 i32) + (local $l2562 i32) + (local $l2563 i32) + (local $l2564 i32) + (local $l2565 i32) + (local $l2566 i32) + (local $l2567 i32) + (local $l2568 i32) + (local $l2569 i32) + (local $l2570 i32) + (local $l2571 i32) + (local $l2572 i32) + (local $l2573 i32) + (local $l2574 i32) + (local $l2575 i32) + (local $l2576 i32) + (local $l2577 i32) + (local $l2578 i32) + (local $l2579 i32) + (local $l2580 i32) + (local $l2581 i32) + (local $l2582 i32) + (local $l2583 i32) + (local $l2584 i32) + (local $l2585 i32) + (local $l2586 i32) + (local $l2587 i32) + (local $l2588 i32) + (local $l2589 i32) + (local $l2590 i32) + (local $l2591 i32) + (local $l2592 i32) + (local $l2593 i32) + (local $l2594 i32) + (local $l2595 i32) + (local $l2596 i32) + (local $l2597 i32) + (local $l2598 i32) + (local $l2599 i32) + (local $l2600 i32) + (local $l2601 i32) + (local $l2602 i32) + (local $l2603 i32) + (local $l2604 i32) + (local $l2605 i32) + (local $l2606 i32) + (local $l2607 i32) + (local $l2608 i32) + (local $l2609 i32) + (local $l2610 i32) + (local $l2611 i32) + (local $l2612 i32) + (local $l2613 i32) + (local $l2614 i32) + (local $l2615 i32) + (local $l2616 i32) + (local $l2617 i32) + (local $l2618 i32) + (local $l2619 i32) + (local $l2620 i32) + (local $l2621 i32) + (local $l2622 i32) + (local $l2623 i32) + (local $l2624 i32) + (local $l2625 i32) + (local $l2626 i32) + (local $l2627 i32) + (local $l2628 i32) + (local $l2629 i32) + (local $l2630 i32) + (local $l2631 i32) + (local $l2632 i32) + (local $l2633 i32) + (local $l2634 i32) + (local $l2635 i32) + (local $l2636 i32) + (local $l2637 i32) + (local $l2638 i32) + (local $l2639 i32) + (local $l2640 i32) + (local $l2641 i32) + (local $l2642 i32) + (local $l2643 i32) + (local $l2644 i32) + (local $l2645 i32) + (local $l2646 i32) + (local $l2647 i32) + (local $l2648 i32) + (local $l2649 i32) + (local $l2650 i32) + (local $l2651 i32) + (local $l2652 i32) + (local $l2653 i32) + (local $l2654 i32) + (local $l2655 i32) + (local $l2656 i32) + (local $l2657 i32) + (local $l2658 i32) + (local $l2659 i32) + (local $l2660 i32) + (local $l2661 i32) + (local $l2662 i32) + (local $l2663 i32) + (local $l2664 i32) + (local $l2665 i32) + (local $l2666 i32) + (local $l2667 i32) + (local $l2668 i32) + (local $l2669 i32) + (local $l2670 i32) + (local $l2671 i32) + (local $l2672 i32) + (local $l2673 i32) + (local $l2674 i32) + (local $l2675 i32) + (local $l2676 i32) + (local $l2677 i32) + (local $l2678 i32) + (local $l2679 i32) + (local $l2680 i32) + (local $l2681 i32) + (local $l2682 i32) + (local $l2683 i32) + (local $l2684 i32) + (local $l2685 i32) + (local $l2686 i32) + (local $l2687 i32) + (local $l2688 i32) + (local $l2689 i32) + (local $l2690 i32) + (local $l2691 i32) + (local $l2692 i32) + (local $l2693 i32) + (local $l2694 i32) + (local $l2695 i32) + (local $l2696 i32) + (local $l2697 i32) + (local $l2698 i32) + (local $l2699 i32) + (local $l2700 i32) + (local $l2701 i32) + (local $l2702 i32) + (local $l2703 i32) + (local $l2704 i32) + (local $l2705 i32) + (local $l2706 i32) + (local $l2707 i32) + (local $l2708 i32) + (local $l2709 i32) + (local $l2710 i32) + (local $l2711 i32) + (local $l2712 i32) + (local $l2713 i32) + (local $l2714 i32) + (local $l2715 i32) + (local $l2716 i32) + (local $l2717 i32) + (local $l2718 i32) + (local $l2719 i32) + (local $l2720 i32) + (local $l2721 i32) + (local $l2722 i32) + (local $l2723 i32) + (local $l2724 i32) + (local $l2725 i32) + (local $l2726 i32) + (local $l2727 i32) + (local $l2728 i32) + (local $l2729 i32) + (local $l2730 i32) + (local $l2731 i32) + (local $l2732 i32) + (local $l2733 i32) + (local $l2734 i32) + (local $l2735 i32) + (local $l2736 i32) + (local $l2737 i32) + (local $l2738 i32) + (local $l2739 i32) + (local $l2740 i32) + (local $l2741 i32) + (local $l2742 i32) + (local $l2743 i32) + (local $l2744 i32) + (local $l2745 i32) + (local $l2746 i32) + (local $l2747 i32) + (local $l2748 i32) + (local $l2749 i32) + (local $l2750 i32) + (local $l2751 i32) + (local $l2752 i32) + (local $l2753 i32) + (local $l2754 i32) + (local $l2755 i32) + (local $l2756 i32) + (local $l2757 i32) + (local $l2758 i32) + (local $l2759 i32) + (local $l2760 i32) + (local $l2761 i32) + (local $l2762 i32) + (local $l2763 i32) + (local $l2764 i32) + (local $l2765 i32) + (local $l2766 i32) + (local $l2767 i32) + (local $l2768 i32) + (local $l2769 i32) + (local $l2770 i32) + (local $l2771 i32) + (local $l2772 i32) + (local $l2773 i32) + (local $l2774 i32) + (local $l2775 i32) + (local $l2776 i32) + (local $l2777 i32) + (local $l2778 i32) + (local $l2779 i32) + (local $l2780 i32) + (local $l2781 i32) + (local $l2782 i32) + (local $l2783 i32) + (local $l2784 i32) + (local $l2785 i32) + (local $l2786 i32) + (local $l2787 i32) + (local $l2788 i32) + (local $l2789 i32) + (local $l2790 i32) + (local $l2791 i32) + (local $l2792 i32) + (local $l2793 i32) + (local $l2794 i32) + (local $l2795 i32) + (local $l2796 i32) + (local $l2797 i32) + (local $l2798 i32) + (local $l2799 i32) + (local $l2800 i32) + (local $l2801 i32) + (local $l2802 i32) + (local $l2803 i32) + (local $l2804 i32) + (local $l2805 i32) + (local $l2806 i32) + (local $l2807 i32) + (local $l2808 i32) + (local $l2809 i32) + (local $l2810 i32) + (local $l2811 i32) + (local $l2812 i32) + (local $l2813 i32) + (local $l2814 i32) + (local $l2815 i32) + (local $l2816 i32) + (local $l2817 i32) + (local $l2818 i32) + (local $l2819 i32) + (local $l2820 i32) + (local $l2821 i32) + (local $l2822 i32) + (local $l2823 i32) + (local $l2824 i32) + (local $l2825 i32) + (local $l2826 i32) + (local $l2827 i32) + (local $l2828 i32) + (local $l2829 i32) + (local $l2830 i32) + (local $l2831 i32) + (local $l2832 i32) + (local $l2833 i32) + (local $l2834 i32) + (local $l2835 i32) + (local $l2836 i32) + (local $l2837 i32) + (local $l2838 i32) + (local $l2839 i32) + (local $l2840 i32) + (local $l2841 i32) + (local $l2842 i32) + (local $l2843 i32) + (local $l2844 i32) + (local $l2845 i32) + (local $l2846 i32) + (local $l2847 i32) + (local $l2848 i32) + (local $l2849 i32) + (local $l2850 i32) + (local $l2851 i32) + (local $l2852 i32) + (local $l2853 i32) + (local $l2854 i32) + (local $l2855 i32) + (local $l2856 i32) + (local $l2857 i32) + (local $l2858 i32) + (local $l2859 i32) + (local $l2860 i32) + (local $l2861 i32) + (local $l2862 i32) + (local $l2863 i32) + (local $l2864 i32) + (local $l2865 i32) + (local $l2866 i32) + (local $l2867 i32) + (local $l2868 i32) + (local $l2869 i32) + (local $l2870 i32) + (local $l2871 i32) + (local $l2872 i32) + (local $l2873 i32) + (local $l2874 i32) + (local $l2875 i32) + (local $l2876 i32) + (local $l2877 i32) + (local $l2878 i32) + (local $l2879 i32) + (local $l2880 i32) + (local $l2881 i32) + (local $l2882 i32) + (local $l2883 i32) + (local $l2884 i32) + (local $l2885 i32) + (local $l2886 i32) + (local $l2887 i32) + (local $l2888 i32) + (local $l2889 i32) + (local $l2890 i32) + (local $l2891 i32) + (local $l2892 i32) + (local $l2893 i32) + (local $l2894 i32) + (local $l2895 i32) + (local $l2896 i32) + (local $l2897 i32) + (local $l2898 i32) + (local $l2899 i32) + (local $l2900 i32) + (local $l2901 i32) + (local $l2902 i32) + (local $l2903 i32) + (local $l2904 i32) + (local $l2905 i32) + (local $l2906 i32) + (local $l2907 i32) + (local $l2908 i32) + (local $l2909 i32) + (local $l2910 i32) + (local $l2911 i32) + (local $l2912 i32) + (local $l2913 i32) + (local $l2914 i32) + (local $l2915 i32) + (local $l2916 i32) + (local $l2917 i32) + (local $l2918 i32) + (local $l2919 i32) + (local $l2920 i32) + (local $l2921 i32) + (local $l2922 i32) + (local $l2923 i32) + (local $l2924 i32) + (local $l2925 i32) + (local $l2926 i32) + (local $l2927 i32) + (local $l2928 i32) + (local $l2929 i32) + (local $l2930 i32) + (local $l2931 i32) + (local $l2932 i32) + (local $l2933 i32) + (local $l2934 i32) + (local $l2935 i32) + (local $l2936 i32) + (local $l2937 i32) + (local $l2938 i32) + (local $l2939 i32) + (local $l2940 i32) + (local $l2941 i32) + (local $l2942 i32) + (local $l2943 i32) + (local $l2944 i32) + (local $l2945 i32) + (local $l2946 i32) + (local $l2947 i32) + (local $l2948 i32) + (local $l2949 i32) + (local $l2950 i32) + (local $l2951 i32) + (local $l2952 i32) + (local $l2953 i32) + (local $l2954 i32) + (local $l2955 i32) + (local $l2956 i32) + (local $l2957 i32) + (local $l2958 i32) + (local $l2959 i32) + (local $l2960 i32) + (local $l2961 i32) + (local $l2962 i32) + (local $l2963 i32) + (local $l2964 i32) + (local $l2965 i32) + (local $l2966 i32) + (local $l2967 i32) + (local $l2968 i32) + (local $l2969 i32) + (local $l2970 i32) + (local $l2971 i32) + (local $l2972 i32) + (local $l2973 i32) + (local $l2974 i32) + (local $l2975 i32) + (local $l2976 i32) + (local $l2977 i32) + (local $l2978 i32) + (local $l2979 i32) + (local $l2980 i32) + (local $l2981 i32) + (local $l2982 i32) + (local $l2983 i32) + (local $l2984 i32) + (local $l2985 i32) + (local $l2986 i32) + (local $l2987 i32) + (local $l2988 i32) + (local $l2989 i32) + (local $l2990 i32) + (local $l2991 i32) + (local $l2992 i32) + (local $l2993 i32) + (local $l2994 i32) + (local $l2995 i32) + (local $l2996 i32) + (local $l2997 i32) + (local $l2998 i32) + (local $l2999 i32) + (local $l3000 i32) + (local $l3001 i32) + (local $l3002 i32) + (local $l3003 i32) + (local $l3004 i32) + (local $l3005 i32) + (local $l3006 i32) + (local $l3007 i32) + (local $l3008 i32) + (local $l3009 i32) + (local $l3010 i32) + (local $l3011 i32) + (local $l3012 i32) + (local $l3013 i32) + (local $l3014 i32) + (local $l3015 i32) + (local $l3016 i32) + (local $l3017 i32) + (local $l3018 i32) + (local $l3019 i32) + (local $l3020 i32) + (local $l3021 i32) + (local $l3022 i32) + (local $l3023 i32) + (local $l3024 i32) + (local $l3025 i32) + (local $l3026 i32) + (local $l3027 i32) + (local $l3028 i32) + (local $l3029 i32) + (local $l3030 i32) + (local $l3031 i32) + (local $l3032 i32) + (local $l3033 i32) + (local $l3034 i32) + (local $l3035 i32) + (local $l3036 i32) + (local $l3037 i32) + (local $l3038 i32) + (local $l3039 i32) + (local $l3040 i32) + (local $l3041 i32) + (local $l3042 i32) + (local $l3043 i32) + (local $l3044 i32) + (local $l3045 i32) + (local $l3046 i32) + (local $l3047 i32) + (local $l3048 i32) + (local $l3049 i32) + (local $l3050 i32) + (local $l3051 i32) + (local $l3052 i32) + (local $l3053 i32) + (local $l3054 i32) + (local $l3055 i32) + (local $l3056 i32) + (local $l3057 i32) + (local $l3058 i32) + (local $l3059 i32) + (local $l3060 i32) + (local $l3061 i32) + (local $l3062 i32) + (local $l3063 i32) + (local $l3064 i32) + (local $l3065 i32) + (local $l3066 i32) + (local $l3067 i32) + (local $l3068 i32) + (local $l3069 i32) + (local $l3070 i32) + (local $l3071 i32) + (local $l3072 i32) + (local $l3073 i32) + (local $l3074 i32) + (local $l3075 i32) + (local $l3076 i32) + (local $l3077 i32) + (local $l3078 i32) + (local $l3079 i32) + (local $l3080 i32) + (local $l3081 i32) + (local $l3082 i32) + (local $l3083 i32) + (local $l3084 i32) + (local $l3085 i32) + (local $l3086 i32) + (local $l3087 i32) + (local $l3088 i32) + (local $l3089 i32) + (local $l3090 i32) + (local $l3091 i32) + (local $l3092 i32) + (local $l3093 i32) + (local $l3094 i32) + (local $l3095 i32) + (local $l3096 i32) + (local $l3097 i32) + (local $l3098 i32) + (local $l3099 i32) + (local $l3100 i32) + (local $l3101 i32) + (local $l3102 i32) + (local $l3103 i32) + (local $l3104 i32) + (local $l3105 i32) + (local $l3106 i32) + (local $l3107 i32) + (local $l3108 i32) + (local $l3109 i32) + (local $l3110 i32) + (local $l3111 i32) + (local $l3112 i32) + (local $l3113 i32) + (local $l3114 i32) + (local $l3115 i32) + (local $l3116 i32) + (local $l3117 i32) + (local $l3118 i32) + (local $l3119 i32) + (local $l3120 i32) + (local $l3121 i32) + (local $l3122 i32) + (local $l3123 i32) + (local $l3124 i32) + (local $l3125 i32) + (local $l3126 i32) + (local $l3127 i32) + (local $l3128 i32) + (local $l3129 i32) + (local $l3130 i32) + (local $l3131 i32) + (local $l3132 i32) + (local $l3133 i32) + (local $l3134 i32) + (local $l3135 i32) + (local $l3136 i32) + (local $l3137 i32) + (local $l3138 i32) + (local $l3139 i32) + (local $l3140 i32) + (local $l3141 i32) + (local $l3142 i32) + (local $l3143 i32) + (local $l3144 i32) + (local $l3145 i32) + (local $l3146 i32) + (local $l3147 i32) + (local $l3148 i32) + (local $l3149 i32) + (local $l3150 i32) + (local $l3151 i32) + (local $l3152 i32) + (local $l3153 i32) + (local $l3154 i32) + (local $l3155 i32) + (local $l3156 i32) + (local $l3157 i32) + (local $l3158 i32) + (local $l3159 i32) + (local $l3160 i32) + (local $l3161 i32) + (local $l3162 i32) + (local $l3163 i32) + (local $l3164 i32) + (local $l3165 i32) + (local $l3166 i32) + (local $l3167 i32) + (local $l3168 i32) + (local $l3169 i32) + (local $l3170 i32) + (local $l3171 i32) + (local $l3172 i32) + (local $l3173 i32) + (local $l3174 i32) + (local $l3175 i32) + (local $l3176 i32) + (local $l3177 i32) + (local $l3178 i32) + (local $l3179 i32) + (local $l3180 i32) + (local $l3181 i32) + (local $l3182 i32) + (local $l3183 i32) + (local $l3184 i32) + (local $l3185 i32) + (local $l3186 i32) + (local $l3187 i32) + (local $l3188 i32) + (local $l3189 i32) + (local $l3190 i32) + (local $l3191 i32) + (local $l3192 i32) + (local $l3193 i32) + (local $l3194 i32) + (local $l3195 i32) + (local $l3196 i32) + (local $l3197 i32) + (local $l3198 i32) + (local $l3199 i32) + (local $l3200 i32) + (local $l3201 i32) + (local $l3202 i32) + (local $l3203 i32) + (local $l3204 i32) + (local $l3205 i32) + (local $l3206 i32) + (local $l3207 i32) + (local $l3208 i32) + (local $l3209 i32) + (local $l3210 i32) + (local $l3211 i32) + (local $l3212 i32) + (local $l3213 i32) + (local $l3214 i32) + (local $l3215 i32) + (local $l3216 i32) + (local $l3217 i32) + (local $l3218 i32) + (local $l3219 i32) + (local $l3220 i32) + (local $l3221 i32) + (local $l3222 i32) + (local $l3223 i32) + (local $l3224 i32) + (local $l3225 i32) + (local $l3226 i32) + (local $l3227 i32) + (local $l3228 i32) + (local $l3229 i32) + (local $l3230 i32) + (local $l3231 i32) + (local $l3232 i32) + (local $l3233 i32) + (local $l3234 i32) + (local $l3235 i32) + (local $l3236 i32) + (local $l3237 i32) + (local $l3238 i32) + (local $l3239 i32) + (local $l3240 i32) + (local $l3241 i32) + (local $l3242 i32) + (local $l3243 i32) + (local $l3244 i32) + (local $l3245 i32) + (local $l3246 i32) + (local $l3247 i32) + (local $l3248 i32) + (local $l3249 i32) + (local $l3250 i32) + (local $l3251 i32) + (local $l3252 i32) + (local $l3253 i32) + (local $l3254 i32) + (local $l3255 i32) + (local $l3256 i32) + (local $l3257 i32) + (local $l3258 i32) + (local $l3259 i32) + (local $l3260 i32) + (local $l3261 i32) + (local $l3262 i32) + (local $l3263 i32) + (local $l3264 i32) + (local $l3265 i32) + (local $l3266 i32) + (local $l3267 i32) + (local $l3268 i32) + (local $l3269 i32) + (local $l3270 i32) + (local $l3271 i32) + (local $l3272 i32) + (local $l3273 i32) + (local $l3274 i32) + (local $l3275 i32) + (local $l3276 i32) + (local $l3277 i32) + (local $l3278 i32) + (local $l3279 i32) + (local $l3280 i32) + (local $l3281 i32) + (local $l3282 i32) + (local $l3283 i32) + (local $l3284 i32) + (local $l3285 i32) + (local $l3286 i32) + (local $l3287 i32) + (local $l3288 i32) + (local $l3289 i32) + (local $l3290 i32) + (local $l3291 i32) + (local $l3292 i32) + (local $l3293 i32) + (local $l3294 i32) + (local $l3295 i32) + (local $l3296 i32) + (local $l3297 i32) + (local $l3298 i32) + (local $l3299 i32) + (local $l3300 i32) + (local $l3301 i32) + (local $l3302 i32) + (local $l3303 i32) + (local $l3304 i32) + (local $l3305 i32) + (local $l3306 i32) + (local $l3307 i32) + (local $l3308 i32) + (local $l3309 i32) + (local $l3310 i32) + (local $l3311 i32) + (local $l3312 i32) + (local $l3313 i32) + (local $l3314 i32) + (local $l3315 i32) + (local $l3316 i32) + (local $l3317 i32) + (local $l3318 i32) + (local $l3319 i32) + (local $l3320 i32) + (local $l3321 i32) + (local $l3322 i32) + (local $l3323 i32) + (local $l3324 i32) + (local $l3325 i32) + (local $l3326 i32) + (local $l3327 i32) + (local $l3328 i32) + (local $l3329 i32) + (local $l3330 i32) + (local $l3331 i32) + (local $l3332 i32) + (local $l3333 i32) + (local $l3334 i32) + (local $l3335 i32) + (local $l3336 i32) + (local $l3337 i32) + (local $l3338 i32) + (local $l3339 i32) + (local $l3340 i32) + (local $l3341 i32) + (local $l3342 i32) + (local $l3343 i32) + (local $l3344 i32) + (local $l3345 i32) + (local $l3346 i32) + (local $l3347 i32) + (local $l3348 i32) + (local $l3349 i32) + (local $l3350 i32) + (local $l3351 i32) + (local $l3352 i32) + (local $l3353 i32) + (local $l3354 i32) + (local $l3355 i32) + (local $l3356 i32) + (local $l3357 i32) + (local $l3358 i32) + (local $l3359 i32) + (local $l3360 i32) + (local $l3361 i32) + (local $l3362 i32) + (local $l3363 i32) + (local $l3364 i32) + (local $l3365 i32) + (local $l3366 i32) + (local $l3367 i32) + (local $l3368 i32) + (local $l3369 i32) + (local $l3370 i32) + (local $l3371 i32) + (local $l3372 i32) + (local $l3373 i32) + (local $l3374 i32) + (local $l3375 i32) + (local $l3376 i32) + (local $l3377 i32) + (local $l3378 i32) + (local $l3379 i32) + (local $l3380 i32) + (local $l3381 i32) + (local $l3382 i32) + (local $l3383 i32) + (local $l3384 i32) + (local $l3385 i32) + (local $l3386 i32) + (local $l3387 i32) + (local $l3388 i32) + (local $l3389 i32) + (local $l3390 i32) + (local $l3391 i32) + (local $l3392 i32) + (local $l3393 i32) + (local $l3394 i32) + (local $l3395 i32) + (local $l3396 i32) + (local $l3397 i32) + (local $l3398 i32) + (local $l3399 i32) + (local $l3400 i32) + (local $l3401 i32) + (local $l3402 i32) + (local $l3403 i32) + (local $l3404 i32) + (local $l3405 i32) + (local $l3406 i32) + (local $l3407 i32) + (local $l3408 i32) + (local $l3409 i32) + (local $l3410 i32) + (local $l3411 i32) + (local $l3412 i32) + (local $l3413 i32) + (local $l3414 i32) + (local $l3415 i32) + (local $l3416 i32) + (local $l3417 i32) + (local $l3418 i32) + (local $l3419 i32) + (local $l3420 i32) + (local $l3421 i32) + (local $l3422 i32) + (local $l3423 i32) + (local $l3424 i32) + (local $l3425 i32) + (local $l3426 i32) + (local $l3427 i32) + (local $l3428 i32) + (local $l3429 i32) + (local $l3430 i32) + (local $l3431 i32) + (local $l3432 i32) + (local $l3433 i32) + (local $l3434 i32) + (local $l3435 i32) + (local $l3436 i32) + (local $l3437 i32) + (local $l3438 i32) + (local $l3439 i32) + (local $l3440 i32) + (local $l3441 i32) + (local $l3442 i32) + (local $l3443 i32) + (local $l3444 i32) + (local $l3445 i32) + (local $l3446 i32) + (local $l3447 i32) + (local $l3448 i32) + (local $l3449 i32) + (local $l3450 i32) + (local $l3451 i32) + (local $l3452 i32) + (local $l3453 i32) + (local $l3454 i32) + (local $l3455 i32) + (local $l3456 i32) + (local $l3457 i32) + (local $l3458 i32) + (local $l3459 i32) + (local $l3460 i32) + (local $l3461 i32) + (local $l3462 i32) + (local $l3463 i32) + (local $l3464 i32) + (local $l3465 i32) + (local $l3466 i32) + (local $l3467 i32) + (local $l3468 i32) + (local $l3469 i32) + (local $l3470 i32) + (local $l3471 i32) + (local $l3472 i32) + (local $l3473 i32) + (local $l3474 i32) + (local $l3475 i32) + (local $l3476 i32) + (local $l3477 i32) + (local $l3478 i32) + (local $l3479 i32) + (local $l3480 i32) + (local $l3481 i32) + (local $l3482 i32) + (local $l3483 i32) + (local $l3484 i32) + (local $l3485 i32) + (local $l3486 i32) + (local $l3487 i32) + (local $l3488 i32) + (local $l3489 i32) + (local $l3490 i32) + (local $l3491 i32) + (local $l3492 i32) + (local $l3493 i32) + (local $l3494 i32) + (local $l3495 i32) + (local $l3496 i32) + (local $l3497 i32) + (local $l3498 i32) + (local $l3499 i32) + (local $l3500 i32) + (local $l3501 i32) + (local $l3502 i32) + (local $l3503 i32) + (local $l3504 i32) + (local $l3505 i32) + (local $l3506 i32) + (local $l3507 i32) + (local $l3508 i32) + (local $l3509 i32) + (local $l3510 i32) + (local $l3511 i32) + (local $l3512 i32) + (local $l3513 i32) + (local $l3514 i32) + (local $l3515 i32) + (local $l3516 i32) + (local $l3517 i32) + (local $l3518 i32) + (local $l3519 i32) + (local $l3520 i32) + (local $l3521 i32) + (local $l3522 i32) + (local $l3523 i32) + (local $l3524 i32) + (local $l3525 i32) + (local $l3526 i32) + (local $l3527 i32) + (local $l3528 i32) + (local $l3529 i32) + (local $l3530 i32) + (local $l3531 i32) + (local $l3532 i32) + (local $l3533 i32) + (local $l3534 i32) + (local $l3535 i32) + (local $l3536 i32) + (local $l3537 i32) + (local $l3538 i32) + (local $l3539 i32) + (local $l3540 i32) + (local $l3541 i32) + (local $l3542 i32) + (local $l3543 i32) + (local $l3544 i32) + (local $l3545 i32) + (local $l3546 i32) + (local $l3547 i32) + (local $l3548 i32) + (local $l3549 i32) + (local $l3550 i32) + (local $l3551 i32) + (local $l3552 i32) + (local $l3553 i32) + (local $l3554 i32) + (local $l3555 i32) + (local $l3556 i32) + (local $l3557 i32) + (local $l3558 i32) + (local $l3559 i32) + (local $l3560 i32) + (local $l3561 i32) + (local $l3562 i32) + (local $l3563 i32) + (local $l3564 i32) + (local $l3565 i32) + (local $l3566 i32) + (local $l3567 i32) + (local $l3568 i32) + (local $l3569 i32) + (local $l3570 i32) + (local $l3571 i32) + (local $l3572 i32) + (local $l3573 i32) + (local $l3574 i32) + (local $l3575 i32) + (local $l3576 i32) + (local $l3577 i32) + (local $l3578 i32) + (local $l3579 i32) + (local $l3580 i32) + (local $l3581 i32) + (local $l3582 i32) + (local $l3583 i32) + (local $l3584 i32) + (local $l3585 i32) + (local $l3586 i32) + (local $l3587 i32) + (local $l3588 i32) + (local $l3589 i32) + (local $l3590 i32) + (local $l3591 i32) + (local $l3592 i32) + (local $l3593 i32) + (local $l3594 i32) + (local $l3595 i32) + (local $l3596 i32) + (local $l3597 i32) + (local $l3598 i32) + (local $l3599 i32) + (local $l3600 i32) + (local $l3601 i32) + (local $l3602 i32) + (local $l3603 i32) + (local $l3604 i32) + (local $l3605 i32) + (local $l3606 i32) + (local $l3607 i32) + (local $l3608 i32) + (local $l3609 i32) + (local $l3610 i32) + (local $l3611 i32) + (local $l3612 i32) + (local $l3613 i32) + (local $l3614 i32) + (local $l3615 i32) + (local $l3616 i32) + (local $l3617 i32) + (local $l3618 i32) + (local $l3619 i32) + (local $l3620 i32) + (local $l3621 i32) + (local $l3622 i32) + (local $l3623 i32) + (local $l3624 i32) + (local $l3625 i32) + (local $l3626 i32) + (local $l3627 i32) + (local $l3628 i32) + (local $l3629 i32) + (local $l3630 i32) + (local $l3631 i32) + (local $l3632 i32) + (local $l3633 i32) + (local $l3634 i32) + (local $l3635 i32) + (local $l3636 i32) + (local $l3637 i32) + (local $l3638 i32) + (local $l3639 i32) + (local $l3640 i32) + (local $l3641 i32) + (local $l3642 i32) + (local $l3643 i32) + (local $l3644 i32) + (local $l3645 i32) + (local $l3646 i32) + (local $l3647 i32) + (local $l3648 i32) + (local $l3649 i32) + (local $l3650 i32) + (local $l3651 i32) + (local $l3652 i32) + (local $l3653 i32) + (local $l3654 i32) + (local $l3655 i32) + (local $l3656 i32) + (local $l3657 i32) + (local $l3658 i32) + (local $l3659 i32) + (local $l3660 i32) + (local $l3661 i32) + (local $l3662 i32) + (local $l3663 i32) + (local $l3664 i32) + (local $l3665 i32) + (local $l3666 i32) + (local $l3667 i32) + (local $l3668 i32) + (local $l3669 i32) + (local $l3670 i32) + (local $l3671 i32) + (local $l3672 i32) + (local $l3673 i32) + (local $l3674 i32) + (local $l3675 i32) + (local $l3676 i32) + (local $l3677 i32) + (local $l3678 i32) + (local $l3679 i32) + (local $l3680 i32) + (local $l3681 i32) + (local $l3682 i32) + (local $l3683 i32) + (local $l3684 i32) + (local $l3685 i32) + (local $l3686 i32) + (local $l3687 i32) + (local $l3688 i32) + (local $l3689 i32) + (local $l3690 i32) + (local $l3691 i32) + (local $l3692 i32) + (local $l3693 i32) + (local $l3694 i32) + (local $l3695 i32) + (local $l3696 i32) + (local $l3697 i32) + (local $l3698 i32) + (local $l3699 i32) + (local $l3700 i32) + (local $l3701 i32) + (local $l3702 i32) + (local $l3703 i32) + (local $l3704 i32) + (local $l3705 i32) + (local $l3706 i32) + (local $l3707 i32) + (local $l3708 i32) + (local $l3709 i32) + (local $l3710 i32) + (local $l3711 i32) + (local $l3712 i32) + (local $l3713 i32) + (local $l3714 i32) + (local $l3715 i32) + (local $l3716 i32) + (local $l3717 i32) + (local $l3718 i32) + (local $l3719 i32) + (local $l3720 i32) + (local $l3721 i32) + (local $l3722 i32) + (local $l3723 i32) + (local $l3724 i32) + (local $l3725 i32) + (local $l3726 i32) + (local $l3727 i32) + (local $l3728 i32) + (local $l3729 i32) + (local $l3730 i32) + (local $l3731 i32) + (local $l3732 i32) + (local $l3733 i32) + (local $l3734 i32) + (local $l3735 i32) + (local $l3736 i32) + (local $l3737 i32) + (local $l3738 i32) + (local $l3739 i32) + (local $l3740 i32) + (local $l3741 i32) + (local $l3742 i32) + (local $l3743 i32) + (local $l3744 i32) + (local $l3745 i32) + (local $l3746 i32) + (local $l3747 i32) + (local $l3748 i32) + (local $l3749 i32) + (local $l3750 i32) + (local $l3751 i32) + (local $l3752 i32) + (local $l3753 i32) + (local $l3754 i32) + (local $l3755 i32) + (local $l3756 i32) + (local $l3757 i32) + (local $l3758 i32) + (local $l3759 i32) + (local $l3760 i32) + (local $l3761 i32) + (local $l3762 i32) + (local $l3763 i32) + (local $l3764 i32) + (local $l3765 i32) + (local $l3766 i32) + (local $l3767 i32) + (local $l3768 i32) + (local $l3769 i32) + (local $l3770 i32) + (local $l3771 i32) + (local $l3772 i32) + (local $l3773 i32) + (local $l3774 i32) + (local $l3775 i32) + (local $l3776 i32) + (local $l3777 i32) + (local $l3778 i32) + (local $l3779 i32) + (local $l3780 i32) + (local $l3781 i32) + (local $l3782 i32) + (local $l3783 i32) + (local $l3784 i32) + (local $l3785 i32) + (local $l3786 i32) + (local $l3787 i32) + (local $l3788 i32) + (local $l3789 i32) + (local $l3790 i32) + (local $l3791 i32) + (local $l3792 i32) + (local $l3793 i32) + (local $l3794 i32) + (local $l3795 i32) + (local $l3796 i32) + (local $l3797 i32) + (local $l3798 i32) + (local $l3799 i32) + (local $l3800 i32) + (local $l3801 i32) + (local $l3802 i32) + (local $l3803 i32) + (local $l3804 i32) + (local $l3805 i32) + (local $l3806 i32) + (local $l3807 i32) + (local $l3808 i32) + (local $l3809 i32) + (local $l3810 i32) + (local $l3811 i32) + (local $l3812 i32) + (local $l3813 i32) + (local $l3814 i32) + (local $l3815 i32) + (local $l3816 i32) + (local $l3817 i32) + (local $l3818 i32) + (local $l3819 i32) + (local $l3820 i32) + (local $l3821 i32) + (local $l3822 i32) + (local $l3823 i32) + (local $l3824 i32) + (local $l3825 i32) + (local $l3826 i32) + (local $l3827 i32) + (local $l3828 i32) + (local $l3829 i32) + (local $l3830 i32) + (local $l3831 i32) + (local $l3832 i32) + (local $l3833 i32) + (local $l3834 i32) + (local $l3835 i32) + (local $l3836 i32) + (local $l3837 i32) + (local $l3838 i32) + (local $l3839 i32) + (local $l3840 i32) + (local $l3841 i32) + (local $l3842 i32) + (local $l3843 i32) + (local $l3844 i32) + (local $l3845 i32) + (local $l3846 i32) + (local $l3847 i32) + (local $l3848 i32) + (local $l3849 i32) + (local $l3850 i32) + (local $l3851 i32) + (local $l3852 i32) + (local $l3853 i32) + (local $l3854 i32) + (local $l3855 i32) + (local $l3856 i32) + (local $l3857 i32) + (local $l3858 i32) + (local $l3859 i32) + (local $l3860 i32) + (local $l3861 i32) + (local $l3862 i32) + (local $l3863 i32) + (local $l3864 i32) + (local $l3865 i32) + (local $l3866 i32) + (local $l3867 i32) + (local $l3868 i32) + (local $l3869 i32) + (local $l3870 i32) + (local $l3871 i32) + (local $l3872 i32) + (local $l3873 i32) + (local $l3874 i32) + (local $l3875 i32) + (local $l3876 i32) + (local $l3877 i32) + (local $l3878 i32) + (local $l3879 i32) + (local $l3880 i32) + (local $l3881 i32) + (local $l3882 i32) + (local $l3883 i32) + (local $l3884 i32) + (local $l3885 i32) + (local $l3886 i32) + (local $l3887 i32) + (local $l3888 i32) + (local $l3889 i32) + (local $l3890 i32) + (local $l3891 i32) + (local $l3892 i32) + (local $l3893 i32) + (local $l3894 i32) + (local $l3895 i32) + (local $l3896 i32) + (local $l3897 i32) + (local $l3898 i32) + (local $l3899 i32) + (local $l3900 i32) + (local $l3901 i32) + (local $l3902 i32) + (local $l3903 i32) + (local $l3904 i32) + (local $l3905 i32) + (local $l3906 i32) + (local $l3907 i32) + (local $l3908 i32) + (local $l3909 i32) + (local $l3910 i32) + (local $l3911 i32) + (local $l3912 i32) + (local $l3913 i32) + (local $l3914 i32) + (local $l3915 i32) + (local $l3916 i32) + (local $l3917 i32) + (local $l3918 i32) + (local $l3919 i32) + (local $l3920 i32) + (local $l3921 i32) + (local $l3922 i32) + (local $l3923 i32) + (local $l3924 i32) + (local $l3925 i32) + (local $l3926 i32) + (local $l3927 i32) + (local $l3928 i32) + (local $l3929 i32) + (local $l3930 i32) + (local $l3931 i32) + (local $l3932 i32) + (local $l3933 i32) + (local $l3934 i32) + (local $l3935 i32) + (local $l3936 i32) + (local $l3937 i32) + (local $l3938 i32) + (local $l3939 i32) + (local $l3940 i32) + (local $l3941 i32) + (local $l3942 i32) + (local $l3943 i32) + (local $l3944 i32) + (local $l3945 i32) + (local $l3946 i32) + (local $l3947 i32) + (local $l3948 i32) + (local $l3949 i32) + (local $l3950 i32) + (local $l3951 i32) + (local $l3952 i32) + (local $l3953 i32) + (local $l3954 i32) + (local $l3955 i32) + (local $l3956 i32) + (local $l3957 i32) + (local $l3958 i32) + (local $l3959 i32) + (local $l3960 i32) + (local $l3961 i32) + (local $l3962 i32) + (local $l3963 i32) + (local $l3964 i32) + (local $l3965 i32) + (local $l3966 i32) + (local $l3967 i32) + (local $l3968 i32) + (local $l3969 i32) + (local $l3970 i32) + (local $l3971 i32) + (local $l3972 i32) + (local $l3973 i32) + (local $l3974 i32) + (local $l3975 i32) + (local $l3976 i32) + (local $l3977 i32) + (local $l3978 i32) + (local $l3979 i32) + (local $l3980 i32) + (local $l3981 i32) + (local $l3982 i32) + (local $l3983 i32) + (local $l3984 i32) + (local $l3985 i32) + (local $l3986 i32) + (local $l3987 i32) + (local $l3988 i32) + (local $l3989 i32) + (local $l3990 i32) + (local $l3991 i32) + (local $l3992 i32) + (local $l3993 i32) + (local $l3994 i32) + (local $l3995 i32) + (local $l3996 i32) + (local $l3997 i32) + (local $l3998 i32) + (local $l3999 i32) + (local $l4000 i32) + (local $l4001 i32) + (local $l4002 i32) + (local $l4003 i32) + (local $l4004 i32) + (local $l4005 i32) + (local $l4006 i32) + (local $l4007 i32) + (local $l4008 i32) + (local $l4009 i32) + (local $l4010 i32) + (local $l4011 i32) + (local $l4012 i32) + (local $l4013 i32) + (local $l4014 i32) + (local $l4015 i32) + (local $l4016 i32) + (local $l4017 i32) + (local $l4018 i32) + (local $l4019 i32) + (local $l4020 i32) + (local $l4021 i32) + (local $l4022 i32) + (local $l4023 i32) + (local $l4024 i32) + (local $l4025 i32) + (local $l4026 i32) + (local $l4027 i32) + (local $l4028 i32) + (local $l4029 i32) + (local $l4030 i32) + (local $l4031 i32) + (local $l4032 i32) + (local $l4033 i32) + (local $l4034 i32) + (local $l4035 i32) + (local $l4036 i32) + (local $l4037 i32) + (local $l4038 i32) + (local $l4039 i32) + (local $l4040 i32) + (local $l4041 i32) + (local $l4042 i32) + (local $l4043 i32) + (local $l4044 i32) + (local $l4045 i32) + (local $l4046 i32) + (local $l4047 i32) + (local $l4048 i32) + (local $l4049 i32) + (local $l4050 i32) + (local $l4051 i32) + (local $l4052 i32) + (local $l4053 i32) + (local $l4054 i32) + (local $l4055 i32) + (local $l4056 i32) + (local $l4057 i32) + (local $l4058 i32) + (local $l4059 i32) + (local $l4060 i32) + (local $l4061 i32) + (local $l4062 i32) + (local $l4063 i32) + (local $l4064 i32) + (local $l4065 i32) + (local $l4066 i32) + (local $l4067 i32) + (local $l4068 i32) + (local $l4069 i32) + (local $l4070 i32) + (local $l4071 i32) + (local $l4072 i32) + (local $l4073 i32) + (local $l4074 i32) + (local $l4075 i32) + (local $l4076 i32) + (local $l4077 i32) + (local $l4078 i32) + (local $l4079 i32) + (local $l4080 i32) + (local $l4081 i32) + (local $l4082 i32) + (local $l4083 i32) + (local $l4084 i32) + (local $l4085 i32) + (local $l4086 i32) + (local $l4087 i32) + (local $l4088 i32) + (local $l4089 i32) + (local $l4090 i32) + (local $l4091 i32) + (local $l4092 i32) + (local $l4093 i32) + (local $l4094 i32) + (local $l4095 i32) + (local $l4096 i32) + (local $l4097 i32) + (local $l4098 i32) + (local $l4099 i32) + (local $l4100 i32) + (local $l4101 i32) + (local $l4102 i32) + (local $l4103 i32) + (local $l4104 i32) + (local $l4105 i32) + (local $l4106 i32) + (local $l4107 i32) + (local $l4108 i32) + (local $l4109 i32) + (local $l4110 i32) + (local $l4111 i32) + (local $l4112 i32) + (local $l4113 i32) + (local $l4114 i32) + (local $l4115 i32) + (local $l4116 i32) + (local $l4117 i32) + (local $l4118 i32) + (local $l4119 i32) + (local $l4120 i32) + (local $l4121 i32) + (local $l4122 i32) + (local $l4123 i32) + (local $l4124 i32) + (local $l4125 i32) + (local $l4126 i32) + (local $l4127 i32) + (local $l4128 i32) + (local $l4129 i32) + (local $l4130 i32) + (local $l4131 i32) + (local $l4132 i32) + (local $l4133 i32) + (local $l4134 i32) + (local $l4135 i32) + (local $l4136 i32) + (local $l4137 i32) + (local $l4138 i32) + (local $l4139 i32) + (local $l4140 i32) + (local $l4141 i32) + (local $l4142 i32) + (local $l4143 i32) + (local $l4144 i32) + (local $l4145 i32) + (local $l4146 i32) + (local $l4147 i32) + (local $l4148 i32) + (local $l4149 i32) + (local $l4150 i32) + (local $l4151 i32) + (local $l4152 i32) + (local $l4153 i32) + (local $l4154 i32) + (local $l4155 i32) + (local $l4156 i32) + (local $l4157 i32) + (local $l4158 i32) + (local $l4159 i32) + (local $l4160 i32) + (local $l4161 i32) + (local $l4162 i32) + (local $l4163 i32) + (local $l4164 i32) + (local $l4165 i32) + (local $l4166 i32) + (local $l4167 i32) + (local $l4168 i32) + (local $l4169 i32) + (local $l4170 i32) + (local $l4171 i32) + (local $l4172 i32) + (local $l4173 i32) + (local $l4174 i32) + (local $l4175 i32) + (local $l4176 i32) + (local $l4177 i32) + (local $l4178 i32) + (local $l4179 i32) + (local $l4180 i32) + (local $l4181 i32) + (local $l4182 i32) + (local $l4183 i32) + (local $l4184 i32) + (local $l4185 i32) + (local $l4186 i32) + (local $l4187 i32) + (local $l4188 i32) + (local $l4189 i32) + (local $l4190 i32) + (local $l4191 i32) + (local $l4192 i32) + (local $l4193 i32) + (local $l4194 i32) + (local $l4195 i32) + (local $l4196 i32) + (local $l4197 i32) + (local $l4198 i32) + (local $l4199 i32) + (local $l4200 i32) + (local $l4201 i32) + (local $l4202 i32) + (local $l4203 i32) + (local $l4204 i32) + (local $l4205 i32) + (local $l4206 i32) + (local $l4207 i32) + (local $l4208 i32) + (local $l4209 i32) + (local $l4210 i32) + (local $l4211 i32) + (local $l4212 i32) + (local $l4213 i32) + (local $l4214 i32) + (local $l4215 i32) + (local $l4216 i32) + (local $l4217 i32) + (local $l4218 i32) + (local $l4219 i32) + (local $l4220 i32) + (local $l4221 i32) + (local $l4222 i32) + (local $l4223 i32) + (local $l4224 i32) + (local $l4225 i32) + (local $l4226 i32) + (local $l4227 i32) + (local $l4228 i32) + (local $l4229 i32) + (local $l4230 i32) + (local $l4231 i32) + (local $l4232 i32) + (local $l4233 i32) + (local $l4234 i32) + (local $l4235 i32) + (local $l4236 i32) + (local $l4237 i32) + (local $l4238 i32) + (local $l4239 i32) + (local $l4240 i32) + (local $l4241 i32) + (local $l4242 i32) + (local $l4243 i32) + (local $l4244 i32) + (local $l4245 i32) + (local $l4246 i32) + (local $l4247 i32) + (local $l4248 i32) + (local $l4249 i32) + (local $l4250 i32) + (local $l4251 i32) + (local $l4252 i32) + (local $l4253 i32) + (local $l4254 i32) + (local $l4255 i32) + (local $l4256 i32) + (local $l4257 i32) + (local $l4258 i32) + (local $l4259 i32) + (local $l4260 i32) + (local $l4261 i32) + (local $l4262 i32) + (local $l4263 i32) + (local $l4264 i32) + (local $l4265 i32) + (local $l4266 i32) + (local $l4267 i32) + (local $l4268 i32) + (local $l4269 i32) + (local $l4270 i32) + (local $l4271 i32) + (local $l4272 i32) + (local $l4273 i32) + (local $l4274 i32) + (local $l4275 i32) + (local $l4276 i32) + (local $l4277 i32) + (local $l4278 i32) + (local $l4279 i32) + (local $l4280 i32) + (local $l4281 i32) + (local $l4282 i32) + (local $l4283 i32) + (local $l4284 i32) + (local $l4285 i32) + (local $l4286 i32) + (local $l4287 i32) + (local $l4288 i32) + (local $l4289 i32) + (local $l4290 i32) + (local $l4291 i32) + (local $l4292 i32) + (local $l4293 i32) + (local $l4294 i32) + (local $l4295 i32) + (local $l4296 i32) + (local $l4297 i32) + (local $l4298 i32) + (local $l4299 i32) + (local $l4300 i32) + (local $l4301 i32) + (local $l4302 i32) + (local $l4303 i32) + (local $l4304 i32) + (local $l4305 i32) + (local $l4306 i32) + (local $l4307 i32) + (local $l4308 i32) + (local $l4309 i32) + (local $l4310 i32) + (local $l4311 i32) + (local $l4312 i32) + (local $l4313 i32) + (local $l4314 i32) + (local $l4315 i32) + (local $l4316 i32) + (local $l4317 i32) + (local $l4318 i32) + (local $l4319 i32) + (local $l4320 i32) + (local $l4321 i32) + (local $l4322 i32) + (local $l4323 i32) + (local $l4324 i32) + (local $l4325 i32) + (local $l4326 i32) + (local $l4327 i32) + (local $l4328 i32) + (local $l4329 i32) + (local $l4330 i32) + (local $l4331 i32) + (local $l4332 i32) + (local $l4333 i32) + (local $l4334 i32) + (local $l4335 i32) + (local $l4336 i32) + (local $l4337 i32) + (local $l4338 i32) + (local $l4339 i32) + (local $l4340 i32) + (local $l4341 i32) + (local $l4342 i32) + (local $l4343 i32) + (local $l4344 i32) + (local $l4345 i32) + (local $l4346 i32) + (local $l4347 i32) + (local $l4348 i32) + (local $l4349 i32) + (local $l4350 i32) + (local $l4351 i32) + (local $l4352 i32) + (local $l4353 i32) + (local $l4354 i32) + (local $l4355 i32) + (local $l4356 i32) + (local $l4357 i32) + (local $l4358 i32) + (local $l4359 i32) + (local $l4360 i32) + (local $l4361 i32) + (local $l4362 i32) + (local $l4363 i32) + (local $l4364 i32) + (local $l4365 i32) + (local $l4366 i32) + (local $l4367 i32) + (local $l4368 i32) + (local $l4369 i32) + (local $l4370 i32) + (local $l4371 i32) + (local $l4372 i32) + (local $l4373 i32) + (local $l4374 i32) + (local $l4375 i32) + (local $l4376 i32) + (local $l4377 i32) + (local $l4378 i32) + (local $l4379 i32) + (local $l4380 i32) + (local $l4381 i32) + (local $l4382 i32) + (local $l4383 i32) + (local $l4384 i32) + (local $l4385 i32) + (local $l4386 i32) + (local $l4387 i32) + (local $l4388 i32) + (local $l4389 i32) + (local $l4390 i32) + (local $l4391 i32) + (local $l4392 i32) + (local $l4393 i32) + (local $l4394 i32) + (local $l4395 i32) + (local $l4396 i32) + (local $l4397 i32) + (local $l4398 i32) + (local $l4399 i32) + (local $l4400 i32) + (local $l4401 i32) + (local $l4402 i32) + (local $l4403 i32) + (local $l4404 i32) + (local $l4405 i32) + (local $l4406 i32) + (local $l4407 i32) + (local $l4408 i32) + (local $l4409 i32) + (local $l4410 i32) + (local $l4411 i32) + (local $l4412 i32) + (local $l4413 i32) + (local $l4414 i32) + (local $l4415 i32) + (local $l4416 i32) + (local $l4417 i32) + (local $l4418 i32) + (local $l4419 i32) + (local $l4420 i32) + (local $l4421 i32) + (local $l4422 i32) + (local $l4423 i32) + (local $l4424 i32) + (local $l4425 i32) + (local $l4426 i32) + (local $l4427 i32) + (local $l4428 i32) + (local $l4429 i32) + (local $l4430 i32) + (local $l4431 i32) + (local $l4432 i32) + (local $l4433 i32) + (local $l4434 i32) + (local $l4435 i32) + (local $l4436 i32) + (local $l4437 i32) + (local $l4438 i32) + (local $l4439 i32) + (local $l4440 i32) + (local $l4441 i32) + (local $l4442 i32) + (local $l4443 i32) + (local $l4444 i32) + (local $l4445 i32) + (local $l4446 i32) + (local $l4447 i32) + (local $l4448 i32) + (local $l4449 i32) + (local $l4450 i32) + (local $l4451 i32) + (local $l4452 i32) + (local $l4453 i32) + (local $l4454 i32) + (local $l4455 i32) + (local $l4456 i32) + (local $l4457 i32) + (local $l4458 i32) + (local $l4459 i32) + (local $l4460 i32) + (local $l4461 i32) + (local $l4462 i32) + (local $l4463 i32) + (local $l4464 i32) + (local $l4465 i32) + (local $l4466 i32) + (local $l4467 i32) + (local $l4468 i32) + (local $l4469 i32) + (local $l4470 i32) + (local $l4471 i32) + (local $l4472 i32) + (local $l4473 i32) + (local $l4474 i32) + (local $l4475 i32) + (local $l4476 i32) + (local $l4477 i32) + (local $l4478 i32) + (local $l4479 i32) + (local $l4480 i32) + (local $l4481 i32) + (local $l4482 i32) + (local $l4483 i32) + (local $l4484 i32) + (local $l4485 i32) + (local $l4486 i32) + (local $l4487 i32) + (local $l4488 i32) + (local $l4489 i32) + (local $l4490 i32) + (local $l4491 i32) + (local $l4492 i32) + (local $l4493 i32) + (local $l4494 i32) + (local $l4495 i32) + (local $l4496 i32) + (local $l4497 i32) + (local $l4498 i32) + (local $l4499 i32) + (local $l4500 i32) + (local $l4501 i32) + (local $l4502 i32) + (local $l4503 i32) + (local $l4504 i32) + (local $l4505 i32) + (local $l4506 i32) + (local $l4507 i32) + (local $l4508 i32) + (local $l4509 i32) + (local $l4510 i32) + (local $l4511 i32) + (local $l4512 i32) + (local $l4513 i32) + (local $l4514 i32) + (local $l4515 i32) + (local $l4516 i32) + (local $l4517 i32) + (local $l4518 i32) + (local $l4519 i32) + (local $l4520 i32) + (local $l4521 i32) + (local $l4522 i32) + (local $l4523 i32) + (local $l4524 i32) + (local $l4525 i32) + (local $l4526 i32) + (local $l4527 i32) + (local $l4528 i32) + (local $l4529 i32) + (local $l4530 i32) + (local $l4531 i32) + (local $l4532 i32) + (local $l4533 i32) + (local $l4534 i32) + (local $l4535 i32) + (local $l4536 i32) + (local $l4537 i32) + (local $l4538 i32) + (local $l4539 i32) + (local $l4540 i32) + (local $l4541 i32) + (local $l4542 i32) + (local $l4543 i32) + (local $l4544 i32) + (local $l4545 i32) + (local $l4546 i32) + (local $l4547 i32) + (local $l4548 i32) + (local $l4549 i32) + (local $l4550 i32) + (local $l4551 i32) + (local $l4552 i32) + (local $l4553 i32) + (local $l4554 i32) + (local $l4555 i32) + (local $l4556 i32) + (local $l4557 i32) + (local $l4558 i32) + (local $l4559 i32) + (local $l4560 i32) + (local $l4561 i32) + (local $l4562 i32) + (local $l4563 i32) + (local $l4564 i32) + (local $l4565 i32) + (local $l4566 i32) + (local $l4567 i32) + (local $l4568 i32) + (local $l4569 i32) + (local $l4570 i32) + (local $l4571 i32) + (local $l4572 i32) + (local $l4573 i32) + (local $l4574 i32) + (local $l4575 i32) + (local $l4576 i32) + (local $l4577 i32) + (local $l4578 i32) + (local $l4579 i32) + (local $l4580 i32) + (local $l4581 i32) + (local $l4582 i32) + (local $l4583 i32) + (local $l4584 i32) + (local $l4585 i32) + (local $l4586 i32) + (local $l4587 i32) + (local $l4588 i32) + (local $l4589 i32) + (local $l4590 i32) + (local $l4591 i32) + (local $l4592 i32) + (local $l4593 i32) + (local $l4594 i32) + (local $l4595 i32) + (local $l4596 i32) + (local $l4597 i32) + (local $l4598 i32) + (local $l4599 i32) + (local $l4600 i32) + (local $l4601 i32) + (local $l4602 i32) + (local $l4603 i32) + (local $l4604 i32) + (local $l4605 i32) + (local $l4606 i32) + (local $l4607 i32) + (local $l4608 i32) + (local $l4609 i32) + (local $l4610 i32) + (local $l4611 i32) + (local $l4612 i32) + (local $l4613 i32) + (local $l4614 i32) + (local $l4615 i32) + (local $l4616 i32) + (local $l4617 i32) + (local $l4618 i32) + (local $l4619 i32) + (local $l4620 i32) + (local $l4621 i32) + (local $l4622 i32) + (local $l4623 i32) + (local $l4624 i32) + (local $l4625 i32) + (local $l4626 i32) + (local $l4627 i32) + (local $l4628 i32) + (local $l4629 i32) + (local $l4630 i32) + (local $l4631 i32) + (local $l4632 i32) + (local $l4633 i32) + (local $l4634 i32) + (local $l4635 i32) + (local $l4636 i32) + (local $l4637 i32) + (local $l4638 i32) + (local $l4639 i32) + (local $l4640 i32) + (local $l4641 i32) + (local $l4642 i32) + (local $l4643 i32) + (local $l4644 i32) + (local $l4645 i32) + (local $l4646 i32) + (local $l4647 i32) + (local $l4648 i32) + (local $l4649 i32) + (local $l4650 i32) + (local $l4651 i32) + (local $l4652 i32) + (local $l4653 i32) + (local $l4654 i32) + (local $l4655 i32) + (local $l4656 i32) + (local $l4657 i32) + (local $l4658 i32) + (local $l4659 i32) + (local $l4660 i32) + (local $l4661 i32) + (local $l4662 i32) + (local $l4663 i32) + (local $l4664 i32) + (local $l4665 i32) + (local $l4666 i32) + (local $l4667 i32) + (local $l4668 i32) + (local $l4669 i32) + (local $l4670 i32) + (local $l4671 i32) + (local $l4672 i32) + (local $l4673 i32) + (local $l4674 i32) + (local $l4675 i32) + (local $l4676 i32) + (local $l4677 i32) + (local $l4678 i32) + (local $l4679 i32) + (local $l4680 i32) + (local $l4681 i32) + (local $l4682 i32) + (local $l4683 i32) + (local $l4684 i32) + (local $l4685 i32) + (local $l4686 i32) + (local $l4687 i32) + (local $l4688 i32) + (local $l4689 i32) + (local $l4690 i32) + (local $l4691 i32) + (local $l4692 i32) + (local $l4693 i32) + (local $l4694 i32) + (local $l4695 i32) + (local $l4696 i32) + (local $l4697 i32) + (local $l4698 i32) + (local $l4699 i32) + (local $l4700 i32) + (local $l4701 i32) + (local $l4702 i32) + (local $l4703 i32) + (local $l4704 i32) + (local $l4705 i32) + (local $l4706 i32) + (local $l4707 i32) + (local $l4708 i32) + (local $l4709 i32) + (local $l4710 i32) + (local $l4711 i32) + (local $l4712 i32) + (local $l4713 i32) + (local $l4714 i32) + (local $l4715 i32) + (local $l4716 i32) + (local $l4717 i32) + (local $l4718 i32) + (local $l4719 i32) + (local $l4720 i32) + (local $l4721 i32) + (local $l4722 i32) + (local $l4723 i32) + (local $l4724 i32) + (local $l4725 i32) + (local $l4726 i32) + (local $l4727 i32) + (local $l4728 i32) + (local $l4729 i32) + (local $l4730 i32) + (local $l4731 i32) + (local $l4732 i32) + (local $l4733 i32) + (local $l4734 i32) + (local $l4735 i32) + (local $l4736 i32) + (local $l4737 i32) + (local $l4738 i32) + (local $l4739 i32) + (local $l4740 i32) + (local $l4741 i32) + (local $l4742 i32) + (local $l4743 i32) + (local $l4744 i32) + (local $l4745 i32) + (local $l4746 i32) + (local $l4747 i32) + (local $l4748 i32) + (local $l4749 i32) + (local $l4750 i32) + (local $l4751 i32) + (local $l4752 i32) + (local $l4753 i32) + (local $l4754 i32) + (local $l4755 i32) + (local $l4756 i32) + (local $l4757 i32) + (local $l4758 i32) + (local $l4759 i32) + (local $l4760 i32) + (local $l4761 i32) + (local $l4762 i32) + (local $l4763 i32) + (local $l4764 i32) + (local $l4765 i32) + (local $l4766 i32) + (local $l4767 i32) + (local $l4768 i32) + (local $l4769 i32) + (local $l4770 i32) + (local $l4771 i32) + (local $l4772 i32) + (local $l4773 i32) + (local $l4774 i32) + (local $l4775 i32) + (local $l4776 i32) + (local $l4777 i32) + (local $l4778 i32) + (local $l4779 i32) + (local $l4780 i32) + (local $l4781 i32) + (local $l4782 i32) + (local $l4783 i32) + (local $l4784 i32) + (local $l4785 i32) + (local $l4786 i32) + (local $l4787 i32) + (local $l4788 i32) + (local $l4789 i32) + (local $l4790 i32) + (local $l4791 i32) + (local $l4792 i32) + (local $l4793 i32) + (local $l4794 i32) + (local $l4795 i32) + (local $l4796 i32) + (local $l4797 i32) + (local $l4798 i32) + (local $l4799 i32) + (local $l4800 i32) + (local $l4801 i32) + (local $l4802 i32) + (local $l4803 i32) + (local $l4804 i32) + (local $l4805 i32) + (local $l4806 i32) + (local $l4807 i32) + (local $l4808 i32) + (local $l4809 i32) + (local $l4810 i32) + (local $l4811 i32) + (local $l4812 i32) + (local $l4813 i32) + (local $l4814 i32) + (local $l4815 i32) + (local $l4816 i32) + (local $l4817 i32) + (local $l4818 i32) + (local $l4819 i32) + (local $l4820 i32) + (local $l4821 i32) + (local $l4822 i32) + (local $l4823 i32) + (local $l4824 i32) + (local $l4825 i32) + (local $l4826 i32) + (local $l4827 i32) + (local $l4828 i32) + (local $l4829 i32) + (local $l4830 i32) + (local $l4831 i32) + (local $l4832 i32) + (local $l4833 i32) + (local $l4834 i32) + (local $l4835 i32) + (local $l4836 i32) + (local $l4837 i32) + (local $l4838 i32) + (local $l4839 i32) + (local $l4840 i32) + (local $l4841 i32) + (local $l4842 i32) + (local $l4843 i32) + (local $l4844 i32) + (local $l4845 i32) + (local $l4846 i32) + (local $l4847 i32) + (local $l4848 i32) + (local $l4849 i32) + (local $l4850 i32) + (local $l4851 i32) + (local $l4852 i32) + (local $l4853 i32) + (local $l4854 i32) + (local $l4855 i32) + (local $l4856 i32) + (local $l4857 i32) + (local $l4858 i32) + (local $l4859 i32) + (local $l4860 i32) + (local $l4861 i32) + (local $l4862 i32) + (local $l4863 i32) + (local $l4864 i32) + (local $l4865 i32) + (local $l4866 i32) + (local $l4867 i32) + (local $l4868 i32) + (local $l4869 i32) + (local $l4870 i32) + (local $l4871 i32) + (local $l4872 i32) + (local $l4873 i32) + (local $l4874 i32) + (local $l4875 i32) + (local $l4876 i32) + (local $l4877 i32) + (local $l4878 i32) + (local $l4879 i32) + (local $l4880 i32) + (local $l4881 i32) + (local $l4882 i32) + (local $l4883 i32) + (local $l4884 i32) + (local $l4885 i32) + (local $l4886 i32) + (local $l4887 i32) + (local $l4888 i32) + (local $l4889 i32) + (local $l4890 i32) + (local $l4891 i32) + (local $l4892 i32) + (local $l4893 i32) + (local $l4894 i32) + (local $l4895 i32) + (local $l4896 i32) + (local $l4897 i32) + (local $l4898 i32) + (local $l4899 i32) + (local $l4900 i32) + (local $l4901 i32) + (local $l4902 i32) + (local $l4903 i32) + (local $l4904 i32) + (local $l4905 i32) + (local $l4906 i32) + (local $l4907 i32) + (local $l4908 i32) + (local $l4909 i32) + (local $l4910 i32) + (local $l4911 i32) + (local $l4912 i32) + (local $l4913 i32) + (local $l4914 i32) + (local $l4915 i32) + (local $l4916 i32) + (local $l4917 i32) + (local $l4918 i32) + (local $l4919 i32) + (local $l4920 i32) + (local $l4921 i32) + (local $l4922 i32) + (local $l4923 i32) + (local $l4924 i32) + (local $l4925 i32) + (local $l4926 i32) + (local $l4927 i32) + (local $l4928 i32) + (local $l4929 i32) + (local $l4930 i32) + (local $l4931 i32) + (local $l4932 i32) + (local $l4933 i32) + (local $l4934 i32) + (local $l4935 i32) + (local $l4936 i32) + (local $l4937 i32) + (local $l4938 i32) + (local $l4939 i32) + (local $l4940 i32) + (local $l4941 i32) + (local $l4942 i32) + (local $l4943 i32) + (local $l4944 i32) + (local $l4945 i32) + (local $l4946 i32) + (local $l4947 i32) + (local $l4948 i32) + (local $l4949 i32) + (local $l4950 i32) + (local $l4951 i32) + (local $l4952 i32) + (local $l4953 i32) + (local $l4954 i32) + (local $l4955 i32) + (local $l4956 i32) + (local $l4957 i32) + (local $l4958 i32) + (local $l4959 i32) + (local $l4960 i32) + (local $l4961 i32) + (local $l4962 i32) + (local $l4963 i32) + (local $l4964 i32) + (local $l4965 i32) + (local $l4966 i32) + (local $l4967 i32) + (local $l4968 i32) + (local $l4969 i32) + (local $l4970 i32) + (local $l4971 i32) + (local $l4972 i32) + (local $l4973 i32) + (local $l4974 i32) + (local $l4975 i32) + (local $l4976 i32) + (local $l4977 i32) + (local $l4978 i32) + (local $l4979 i32) + (local $l4980 i32) + (local $l4981 i32) + (local $l4982 i32) + (local $l4983 i32) + (local $l4984 i32) + (local $l4985 i32) + (local $l4986 i32) + (local $l4987 i32) + (local $l4988 i32) + (local $l4989 i32) + (local $l4990 i32) + (local $l4991 i32) + (local $l4992 i32) + (local $l4993 i32) + (local $l4994 i32) + (local $l4995 i32) + (local $l4996 i32) + (local $l4997 i32) + (local $l4998 i32) + (local $l4999 i32) + (local $l5000 i32) + (local $l5001 i32) + (local $l5002 i32) + (local $l5003 i32) + (local $l5004 i32) + (local $l5005 i32) + (local $l5006 i32) + (local $l5007 i32) + (local $l5008 i32) + (local $l5009 i32) + (local $l5010 i32) + (local $l5011 i32) + (local $l5012 i32) + (local $l5013 i32) + (local $l5014 i32) + (local $l5015 i32) + (local $l5016 i32) + (local $l5017 i32) + (local $l5018 i32) + (local $l5019 i32) + (local $l5020 i32) + (local $l5021 i32) + (local $l5022 i32) + (local $l5023 i32) + (local $l5024 i32) + (local $l5025 i32) + (local $l5026 i32) + (local $l5027 i32) + (local $l5028 i32) + (local $l5029 i32) + (local $l5030 i32) + (local $l5031 i32) + (local $l5032 i32) + (local $l5033 i32) + (local $l5034 i32) + (local $l5035 i32) + (local $l5036 i32) + (local $l5037 i32) + (local $l5038 i32) + (local $l5039 i32) + (local $l5040 i32) + (local $l5041 i32) + (local $l5042 i32) + (local $l5043 i32) + (local $l5044 i32) + (local $l5045 i32) + (local $l5046 i32) + (local $l5047 i32) + (local $l5048 i32) + (local $l5049 i32) + (local $l5050 i32) + (local $l5051 i32) + (local $l5052 i32) + (local $l5053 i32) + (local $l5054 i32) + (local $l5055 i32) + (local $l5056 i32) + (local $l5057 i32) + (local $l5058 i32) + (local $l5059 i32) + (local $l5060 i32) + (local $l5061 i32) + (local $l5062 i32) + (local $l5063 i32) + (local $l5064 i32) + (local $l5065 i32) + (local $l5066 i32) + (local $l5067 i32) + (local $l5068 i32) + (local $l5069 i32) + (local $l5070 i32) + (local $l5071 i32) + (local $l5072 i32) + (local $l5073 i32) + (local $l5074 i32) + (local $l5075 i32) + (local $l5076 i32) + (local $l5077 i32) + (local $l5078 i32) + (local $l5079 i32) + (local $l5080 i32) + (local $l5081 i32) + (local $l5082 i32) + (local $l5083 i32) + (local $l5084 i32) + (local $l5085 i32) + (local $l5086 i32) + (local $l5087 i32) + (local $l5088 i32) + (local $l5089 i32) + (local $l5090 i32) + (local $l5091 i32) + (local $l5092 i32) + (local $l5093 i32) + (local $l5094 i32) + (local $l5095 i32) + (local $l5096 i32) + (local $l5097 i32) + (local $l5098 i32) + (local $l5099 i32) + (local $l5100 i32) + (local $l5101 i32) + (local $l5102 i32) + (local $l5103 i32) + (local $l5104 i32) + (local $l5105 i32) + (local $l5106 i32) + (local $l5107 i32) + (local $l5108 i32) + (local $l5109 i32) + (local $l5110 i32) + (local $l5111 i32) + (local $l5112 i32) + (local $l5113 i32) + (local $l5114 i32) + (local $l5115 i32) + (local $l5116 i32) + (local $l5117 i32) + (local $l5118 i32) + (local $l5119 i32) + (local $l5120 i32) + (local $l5121 i32) + (local $l5122 i32) + (local $l5123 i32) + (local $l5124 i32) + (local $l5125 i32) + (local $l5126 i32) + (local $l5127 i32) + (local $l5128 i32) + (local $l5129 i32) + (local $l5130 i32) + (local $l5131 i32) + (local $l5132 i32) + (local $l5133 i32) + (local $l5134 i32) + (local $l5135 i32) + (local $l5136 i32) + (local $l5137 i32) + (local $l5138 i32) + (local $l5139 i32) + (local $l5140 i32) + (local $l5141 i32) + (local $l5142 i32) + (local $l5143 i32) + (local $l5144 i32) + (local $l5145 i32) + (local $l5146 i32) + (local $l5147 i32) + (local $l5148 i32) + (local $l5149 i32) + (local $l5150 i32) + (local $l5151 i32) + (local $l5152 i32) + (local $l5153 i32) + (local $l5154 i32) + (local $l5155 i32) + (local $l5156 i32) + (local $l5157 i32) + (local $l5158 i32) + (local $l5159 i32) + (local $l5160 i32) + (local $l5161 i32) + (local $l5162 i32) + (local $l5163 i32) + (local $l5164 i32) + (local $l5165 i32) + (local $l5166 i32) + (local $l5167 i32) + (local $l5168 i32) + (local $l5169 i32) + (local $l5170 i32) + (local $l5171 i32) + (local $l5172 i32) + (local $l5173 i32) + (local $l5174 i32) + (local $l5175 i32) + (local $l5176 i32) + (local $l5177 i32) + (local $l5178 i32) + (local $l5179 i32) + (local $l5180 i32) + (local $l5181 i32) + (local $l5182 i32) + (local $l5183 i32) + (local $l5184 i32) + (local $l5185 i32) + (local $l5186 i32) + (local $l5187 i32) + (local $l5188 i32) + (local $l5189 i32) + (local $l5190 i32) + (local $l5191 i32) + (local $l5192 i32) + (local $l5193 i32) + (local $l5194 i32) + (local $l5195 i32) + (local $l5196 i32) + (local $l5197 i32) + (local $l5198 i32) + (local $l5199 i32) + (local $l5200 i32) + (local $l5201 i32) + (local $l5202 i32) + (local $l5203 i32) + (local $l5204 i32) + (local $l5205 i32) + (local $l5206 i32) + (local $l5207 i32) + (local $l5208 i32) + (local $l5209 i32) + (local $l5210 i32) + (local $l5211 i32) + (local $l5212 i32) + (local $l5213 i32) + (local $l5214 i32) + (local $l5215 i32) + (local $l5216 i32) + (local $l5217 i32) + (local $l5218 i32) + (local $l5219 i32) + (local $l5220 i32) + (local $l5221 i32) + (local $l5222 i32) + (local $l5223 i32) + (local $l5224 i32) + (local $l5225 i32) + (local $l5226 i32) + (local $l5227 i32) + (local $l5228 i32) + (local $l5229 i32) + (local $l5230 i32) + (local $l5231 i32) + (local $l5232 i32) + (local $l5233 i32) + (local $l5234 i32) + (local $l5235 i32) + (local $l5236 i32) + (local $l5237 i32) + (local $l5238 i32) + (local $l5239 i32) + (local $l5240 i32) + (local $l5241 i32) + (local $l5242 i32) + (local $l5243 i32) + (local $l5244 i32) + (local $l5245 i32) + (local $l5246 i32) + (local $l5247 i32) + (local $l5248 i32) + (local $l5249 i32) + (local $l5250 i32) + (local $l5251 i32) + (local $l5252 i32) + (local $l5253 i32) + (local $l5254 i32) + (local $l5255 i32) + (local $l5256 i32) + (local $l5257 i32) + (local $l5258 i32) + (local $l5259 i32) + (local $l5260 i32) + (local $l5261 i32) + (local $l5262 i32) + (local $l5263 i32) + (local $l5264 i32) + (local $l5265 i32) + (local $l5266 i32) + (local $l5267 i32) + (local $l5268 i32) + (local $l5269 i32) + (local $l5270 i32) + (local $l5271 i32) + (local $l5272 i32) + (local $l5273 i32) + (local $l5274 i32) + (local $l5275 i32) + (local $l5276 i32) + (local $l5277 i32) + (local $l5278 i32) + (local $l5279 i32) + (local $l5280 i32) + (local $l5281 i32) + (local $l5282 i32) + (local $l5283 i32) + (local $l5284 i32) + (local $l5285 i32) + (local $l5286 i32) + (local $l5287 i32) + (local $l5288 i32) + (local $l5289 i32) + (local $l5290 i32) + (local $l5291 i32) + (local $l5292 i32) + (local $l5293 i32) + (local $l5294 i32) + (local $l5295 i32) + (local $l5296 i32) + (local $l5297 i32) + (local $l5298 i32) + (local $l5299 i32) + (local $l5300 i32) + (local $l5301 i32) + (local $l5302 i32) + (local $l5303 i32) + (local $l5304 i32) + (local $l5305 i32) + (local $l5306 i32) + (local $l5307 i32) + (local $l5308 i32) + (local $l5309 i32) + (local $l5310 i32) + (local $l5311 i32) + (local $l5312 i32) + (local $l5313 i32) + (local $l5314 i32) + (local $l5315 i32) + (local $l5316 i32) + (local $l5317 i32) + (local $l5318 i32) + (local $l5319 i32) + (local $l5320 i32) + (local $l5321 i32) + (local $l5322 i32) + (local $l5323 i32) + (local $l5324 i32) + (local $l5325 i32) + (local $l5326 i32) + (local $l5327 i32) + (local $l5328 i32) + (local $l5329 i32) + (local $l5330 i32) + (local $l5331 i32) + (local $l5332 i32) + (local $l5333 i32) + (local $l5334 i32) + (local $l5335 i32) + (local $l5336 i32) + (local $l5337 i32) + (local $l5338 i32) + (local $l5339 i32) + (local $l5340 i32) + (local $l5341 i32) + (local $l5342 i32) + (local $l5343 i32) + (local $l5344 i32) + (local $l5345 i32) + (local $l5346 i32) + (local $l5347 i32) + (local $l5348 i32) + (local $l5349 i32) + (local $l5350 i32) + (local $l5351 i32) + (local $l5352 i32) + (local $l5353 i32) + (local $l5354 i32) + (local $l5355 i32) + (local $l5356 i32) + (local $l5357 i32) + (local $l5358 i32) + (local $l5359 i32) + (local $l5360 i32) + (local $l5361 i32) + (local $l5362 i32) + (local $l5363 i32) + (local $l5364 i32) + (local $l5365 i32) + (local $l5366 i32) + (local $l5367 i32) + (local $l5368 i32) + (local $l5369 i32) + (local $l5370 i32) + (local $l5371 i32) + (local $l5372 i32) + (local $l5373 i32) + (local $l5374 i32) + (local $l5375 i32) + (local $l5376 i32) + (local $l5377 i32) + (local $l5378 i32) + (local $l5379 i32) + (local $l5380 i32) + (local $l5381 i32) + (local $l5382 i32) + (local $l5383 i32) + (local $l5384 i32) + (local $l5385 i32) + (local $l5386 i32) + (local $l5387 i32) + (local $l5388 i32) + (local $l5389 i32) + (local $l5390 i32) + (local $l5391 i32) + (local $l5392 i32) + (local $l5393 i32) + (local $l5394 i32) + (local $l5395 i32) + (local $l5396 i32) + (local $l5397 i32) + (local $l5398 i32) + (local $l5399 i32) + (local $l5400 i32) + (local $l5401 i32) + (local $l5402 i32) + (local $l5403 i32) + (local $l5404 i32) + (local $l5405 i32) + (local $l5406 i32) + (local $l5407 i32) + (local $l5408 i32) + (local $l5409 i32) + (local $l5410 i32) + (local $l5411 i32) + (local $l5412 i32) + (local $l5413 i32) + (local $l5414 i32) + (local $l5415 i32) + (local $l5416 i32) + (local $l5417 i32) + (local $l5418 i32) + (local $l5419 i32) + (local $l5420 i32) + (local $l5421 i32) + (local $l5422 i32) + (local $l5423 i32) + (local $l5424 i32) + (local $l5425 i32) + (local $l5426 i32) + (local $l5427 i32) + (local $l5428 i32) + (local $l5429 i32) + (local $l5430 i32) + (local $l5431 i32) + (local $l5432 i32) + (local $l5433 i32) + (local $l5434 i32) + (local $l5435 i32) + (local $l5436 i32) + (local $l5437 i32) + (local $l5438 i32) + (local $l5439 i32) + (local $l5440 i32) + (local $l5441 i32) + (local $l5442 i32) + (local $l5443 i32) + (local $l5444 i32) + (local $l5445 i32) + (local $l5446 i32) + (local $l5447 i32) + (local $l5448 i32) + (local $l5449 i32) + (local $l5450 i32) + (local $l5451 i32) + (local $l5452 i32) + (local $l5453 i32) + (local $l5454 i32) + (local $l5455 i32) + (local $l5456 i32) + (local $l5457 i32) + (local $l5458 i32) + (local $l5459 i32) + (local $l5460 i32) + (local $l5461 i32) + (local $l5462 i32) + (local $l5463 i32) + (local $l5464 i32) + (local $l5465 i32) + (local $l5466 i32) + (local $l5467 i32) + (local $l5468 i32) + (local $l5469 i32) + (local $l5470 i32) + (local $l5471 i32) + (local $l5472 i32) + (local $l5473 i32) + (local $l5474 i32) + (local $l5475 i32) + (local $l5476 i32) + (local $l5477 i32) + (local $l5478 i32) + (local $l5479 i32) + (local $l5480 i32) + (local $l5481 i32) + (local $l5482 i32) + (local $l5483 i32) + (local $l5484 i32) + (local $l5485 i32) + (local $l5486 i32) + (local $l5487 i32) + (local $l5488 i32) + (local $l5489 i32) + (local $l5490 i32) + (local $l5491 i32) + (local $l5492 i32) + (local $l5493 i32) + (local $l5494 i32) + (local $l5495 i32) + (local $l5496 i32) + (local $l5497 i32) + (local $l5498 i32) + (local $l5499 i32) + (local $l5500 i32) + (local $l5501 i32) + (local $l5502 i32) + (local $l5503 i32) + (local $l5504 i32) + (local $l5505 i32) + (local $l5506 i32) + (local $l5507 i32) + (local $l5508 i32) + (local $l5509 i32) + (local $l5510 i32) + (local $l5511 i32) + (local $l5512 i32) + (local $l5513 i32) + (local $l5514 i32) + (local $l5515 i32) + (local $l5516 i32) + (local $l5517 i32) + (local $l5518 i32) + (local $l5519 i32) + (local $l5520 i32) + (local $l5521 i32) + (local $l5522 i32) + (local $l5523 i32) + (local $l5524 i32) + (local $l5525 i32) + (local $l5526 i32) + (local $l5527 i32) + (local $l5528 i32) + (local $l5529 i32) + (local $l5530 i32) + (local $l5531 i32) + (local $l5532 i32) + (local $l5533 i32) + (local $l5534 i32) + (local $l5535 i32) + (local $l5536 i32) + (local $l5537 i32) + (local $l5538 i32) + (local $l5539 i32) + (local $l5540 i32) + (local $l5541 i32) + (local $l5542 i32) + (local $l5543 i32) + (local $l5544 i32) + (local $l5545 i32) + (local $l5546 i32) + (local $l5547 i32) + (local $l5548 i32) + (local $l5549 i32) + (local $l5550 i32) + (local $l5551 i32) + (local $l5552 i32) + (local $l5553 i32) + (local $l5554 i32) + (local $l5555 i32) + (local $l5556 i32) + (local $l5557 i32) + (local $l5558 i32) + (local $l5559 i32) + (local $l5560 i32) + (local $l5561 i32) + (local $l5562 i32) + (local $l5563 i32) + (local $l5564 i32) + (local $l5565 i32) + (local $l5566 i32) + (local $l5567 i32) + (local $l5568 i32) + (local $l5569 i32) + (local $l5570 i32) + (local $l5571 i32) + (local $l5572 i32) + (local $l5573 i32) + (local $l5574 i32) + (local $l5575 i32) + (local $l5576 i32) + (local $l5577 i32) + (local $l5578 i32) + (local $l5579 i32) + (local $l5580 i32) + (local $l5581 i32) + (local $l5582 i32) + (local $l5583 i32) + (local $l5584 i32) + (local $l5585 i32) + (local $l5586 i32) + (local $l5587 i32) + (local $l5588 i32) + (local $l5589 i32) + (local $l5590 i32) + (local $l5591 i32) + (local $l5592 i32) + (local $l5593 i32) + (local $l5594 i32) + (local $l5595 i32) + (local $l5596 i32) + (local $l5597 i32) + (local $l5598 i32) + (local $l5599 i32) + (local $l5600 i32) + (local $l5601 i32) + (local $l5602 i32) + (local $l5603 i32) + (local $l5604 i32) + (local $l5605 i32) + (local $l5606 i32) + (local $l5607 i32) + (local $l5608 i32) + (local $l5609 i32) + (local $l5610 i32) + (local $l5611 i32) + (local $l5612 i32) + (local $l5613 i32) + (local $l5614 i32) + (local $l5615 i32) + (local $l5616 i32) + (local $l5617 i32) + (local $l5618 i32) + (local $l5619 i32) + (local $l5620 i32) + (local $l5621 i32) + (local $l5622 i32) + (local $l5623 i32) + (local $l5624 i32) + (local $l5625 i32) + (local $l5626 i32) + (local $l5627 i32) + (local $l5628 i32) + (local $l5629 i32) + (local $l5630 i32) + (local $l5631 i32) + (local $l5632 i32) + (local $l5633 i32) + (local $l5634 i32) + (local $l5635 i32) + (local $l5636 i32) + (local $l5637 i32) + (local $l5638 i32) + (local $l5639 i32) + (local $l5640 i32) + (local $l5641 i32) + (local $l5642 i32) + (local $l5643 i32) + (local $l5644 i32) + (local $l5645 i32) + (local $l5646 i32) + (local $l5647 i32) + (local $l5648 i32) + (local $l5649 i32) + (local $l5650 i32) + (local $l5651 i32) + (local $l5652 i32) + (local $l5653 i32) + (local $l5654 i32) + (local $l5655 i32) + (local $l5656 i32) + (local $l5657 i32) + (local $l5658 i32) + (local $l5659 i32) + (local $l5660 i32) + (local $l5661 i32) + (local $l5662 i32) + (local $l5663 i32) + (local $l5664 i32) + (local $l5665 i32) + (local $l5666 i32) + (local $l5667 i32) + (local $l5668 i32) + (local $l5669 i32) + (local $l5670 i32) + (local $l5671 i32) + (local $l5672 i32) + (local $l5673 i32) + (local $l5674 i32) + (local $l5675 i32) + (local $l5676 i32) + (local $l5677 i32) + (local $l5678 i32) + (local $l5679 i32) + (local $l5680 i32) + (local $l5681 i32) + (local $l5682 i32) + (local $l5683 i32) + (local $l5684 i32) + (local $l5685 i32) + (local $l5686 i32) + (local $l5687 i32) + (local $l5688 i32) + (local $l5689 i32) + (local $l5690 i32) + (local $l5691 i32) + (local $l5692 i32) + (local $l5693 i32) + (local $l5694 i32) + (local $l5695 i32) + (local $l5696 i32) + (local $l5697 i32) + (local $l5698 i32) + (local $l5699 i32) + (local $l5700 i32) + (local $l5701 i32) + (local $l5702 i32) + (local $l5703 i32) + (local $l5704 i32) + (local $l5705 i32) + (local $l5706 i32) + (local $l5707 i32) + (local $l5708 i32) + (local $l5709 i32) + (local $l5710 i32) + (local $l5711 i32) + (local $l5712 i32) + (local $l5713 i32) + (local $l5714 i32) + (local $l5715 i32) + (local $l5716 i32) + (local $l5717 i32) + (local $l5718 i32) + (local $l5719 i32) + (local $l5720 i32) + (local $l5721 i32) + (local $l5722 i32) + (local $l5723 i32) + (local $l5724 i32) + (local $l5725 i32) + (local $l5726 i32) + (local $l5727 i32) + (local $l5728 i32) + (local $l5729 i32) + (local $l5730 i32) + (local $l5731 i32) + (local $l5732 i32) + (local $l5733 i32) + (local $l5734 i32) + (local $l5735 i32) + (local $l5736 i32) + (local $l5737 i32) + (local $l5738 i32) + (local $l5739 i32) + (local $l5740 i32) + (local $l5741 i32) + (local $l5742 i32) + (local $l5743 i32) + (local $l5744 i32) + (local $l5745 i32) + (local $l5746 i32) + (local $l5747 i32) + (local $l5748 i32) + (local $l5749 i32) + (local $l5750 i32) + (local $l5751 i32) + (local $l5752 i32) + (local $l5753 i32) + (local $l5754 i32) + (local $l5755 i32) + (local $l5756 i32) + (local $l5757 i32) + (local $l5758 i32) + (local $l5759 i32) + (local $l5760 i32) + (local $l5761 i32) + (local $l5762 i32) + (local $l5763 i32) + (local $l5764 i32) + (local $l5765 i32) + (local $l5766 i32) + (local $l5767 i32) + (local $l5768 i32) + (local $l5769 i32) + (local $l5770 i32) + (local $l5771 i32) + (local $l5772 i32) + (local $l5773 i32) + (local $l5774 i32) + (local $l5775 i32) + (local $l5776 i32) + (local $l5777 i32) + (local $l5778 i32) + (local $l5779 i32) + (local $l5780 i32) + (local $l5781 i32) + (local $l5782 i32) + (local $l5783 i32) + (local $l5784 i32) + (local $l5785 i32) + (local $l5786 i32) + (local $l5787 i32) + (local $l5788 i32) + (local $l5789 i32) + (local $l5790 i32) + (local $l5791 i32) + (local $l5792 i32) + (local $l5793 i32) + (local $l5794 i32) + (local $l5795 i32) + (local $l5796 i32) + (local $l5797 i32) + (local $l5798 i32) + (local $l5799 i32) + (local $l5800 i32) + (local $l5801 i32) + (local $l5802 i32) + (local $l5803 i32) + (local $l5804 i32) + (local $l5805 i32) + (local $l5806 i32) + (local $l5807 i32) + (local $l5808 i32) + (local $l5809 i32) + (local $l5810 i32) + (local $l5811 i32) + (local $l5812 i32) + (local $l5813 i32) + (local $l5814 i32) + (local $l5815 i32) + (local $l5816 i32) + (local $l5817 i32) + (local $l5818 i32) + (local $l5819 i32) + (local $l5820 i32) + (local $l5821 i32) + (local $l5822 i32) + (local $l5823 i32) + (local $l5824 i32) + (local $l5825 i32) + (local $l5826 i32) + (local $l5827 i32) + (local $l5828 i32) + (local $l5829 i32) + (local $l5830 i32) + (local $l5831 i32) + (local $l5832 i32) + (local $l5833 i32) + (local $l5834 i32) + (local $l5835 i32) + (local $l5836 i32) + (local $l5837 i32) + (local $l5838 i32) + (local $l5839 i32) + (local $l5840 i32) + (local $l5841 i32) + (local $l5842 i32) + (local $l5843 i32) + (local $l5844 i32) + (local $l5845 i32) + (local $l5846 i32) + (local $l5847 i32) + (local $l5848 i32) + (local $l5849 i32) + (local $l5850 i32) + (local $l5851 i32) + (local $l5852 i32) + (local $l5853 i32) + (local $l5854 i32) + (local $l5855 i32) + (local $l5856 i32) + (local $l5857 i32) + (local $l5858 i32) + (local $l5859 i32) + (local $l5860 i32) + (local $l5861 i32) + (local $l5862 i32) + (local $l5863 i32) + (local $l5864 i32) + (local $l5865 i32) + (local $l5866 i32) + (local $l5867 i32) + (local $l5868 i32) + (local $l5869 i32) + (local $l5870 i32) + (local $l5871 i32) + (local $l5872 i32) + (local $l5873 i32) + (local $l5874 i32) + (local $l5875 i32) + (local $l5876 i32) + (local $l5877 i32) + (local $l5878 i32) + (local $l5879 i32) + (local $l5880 i32) + (local $l5881 i32) + (local $l5882 i32) + (local $l5883 i32) + (local $l5884 i32) + (local $l5885 i32) + (local $l5886 i32) + (local $l5887 i32) + (local $l5888 i32) + (local $l5889 i32) + (local $l5890 i32) + (local $l5891 i32) + (local $l5892 i32) + (local $l5893 i32) + (local $l5894 i32) + (local $l5895 i32) + (local $l5896 i32) + (local $l5897 i32) + (local $l5898 i32) + (local $l5899 i32) + (local $l5900 i32) + (local $l5901 i32) + (local $l5902 i32) + (local $l5903 i32) + (local $l5904 i32) + (local $l5905 i32) + (local $l5906 i32) + (local $l5907 i32) + (local $l5908 i32) + (local $l5909 i32) + (local $l5910 i32) + (local $l5911 i32) + (local $l5912 i32) + (local $l5913 i32) + (local $l5914 i32) + (local $l5915 i32) + (local $l5916 i32) + (local $l5917 i32) + (local $l5918 i32) + (local $l5919 i32) + (local $l5920 i32) + (local $l5921 i32) + (local $l5922 i32) + (local $l5923 i32) + (local $l5924 i32) + (local $l5925 i32) + (local $l5926 i32) + (local $l5927 i32) + (local $l5928 i32) + (local $l5929 i32) + (local $l5930 i32) + (local $l5931 i32) + (local $l5932 i32) + (local $l5933 i32) + (local $l5934 i32) + (local $l5935 i32) + (local $l5936 i32) + (local $l5937 i32) + (local $l5938 i32) + (local $l5939 i32) + (local $l5940 i32) + (local $l5941 i32) + (local $l5942 i32) + (local $l5943 i32) + (local $l5944 i32) + (local $l5945 i32) + (local $l5946 i32) + (local $l5947 i32) + (local $l5948 i32) + (local $l5949 i32) + (local $l5950 i32) + (local $l5951 i32) + (local $l5952 i32) + (local $l5953 i32) + (local $l5954 i32) + (local $l5955 i32) + (local $l5956 i32) + (local $l5957 i32) + (local $l5958 i32) + (local $l5959 i32) + (local $l5960 i32) + (local $l5961 i32) + (local $l5962 i32) + (local $l5963 i32) + (local $l5964 i32) + (local $l5965 i32) + (local $l5966 i32) + (local $l5967 i32) + (local $l5968 i32) + (local $l5969 i32) + (local $l5970 i32) + (local $l5971 i32) + (local $l5972 i32) + (local $l5973 i32) + (local $l5974 i32) + (local $l5975 i32) + (local $l5976 i32) + (local $l5977 i32) + (local $l5978 i32) + (local $l5979 i32) + (local $l5980 i32) + (local $l5981 i32) + (local $l5982 i32) + (local $l5983 i32) + (local $l5984 i32) + (local $l5985 i32) + (local $l5986 i32) + (local $l5987 i32) + (local $l5988 i32) + (local $l5989 i32) + (local $l5990 i32) + (local $l5991 i32) + (local $l5992 i32) + (local $l5993 i32) + (local $l5994 i32) + (local $l5995 i32) + (local $l5996 i32) + (local $l5997 i32) + (local $l5998 i32) + (local $l5999 i32) + (local $l6000 i32) + (local $l6001 i32) + (local $l6002 i32) + (local $l6003 i32) + (local $l6004 i32) + (local $l6005 i32) + (local $l6006 i32) + (local $l6007 i32) + (local $l6008 i32) + (local $l6009 i32) + (local $l6010 i32) + (local $l6011 i32) + (local $l6012 i32) + (local $l6013 i32) + (local $l6014 i32) + (local $l6015 i32) + (local $l6016 i32) + (local $l6017 i32) + (local $l6018 i32) + (local $l6019 i32) + (local $l6020 i32) + (local $l6021 i32) + (local $l6022 i32) + (local $l6023 i32) + (local $l6024 i32) + (local $l6025 i32) + (local $l6026 i32) + (local $l6027 i32) + (local $l6028 i32) + (local $l6029 i32) + (local $l6030 i32) + (local $l6031 i32) + (local $l6032 i32) + (local $l6033 i32) + (local $l6034 i32) + (local $l6035 i32) + (local $l6036 i32) + (local $l6037 i32) + (local $l6038 i32) + (local $l6039 i32) + (local $l6040 i32) + (local $l6041 i32) + (local $l6042 i32) + (local $l6043 i32) + (local $l6044 i32) + (local $l6045 i32) + (local $l6046 i32) + (local $l6047 i32) + (local $l6048 i32) + (local $l6049 i32) + (local $l6050 i32) + (local $l6051 i32) + (local $l6052 i32) + (local $l6053 i32) + (local $l6054 i32) + (local $l6055 i32) + (local $l6056 i32) + (local $l6057 i32) + (local $l6058 i32) + (local $l6059 i32) + (local $l6060 i32) + (local $l6061 i32) + (local $l6062 i32) + (local $l6063 i32) + (local $l6064 i32) + (local $l6065 i32) + (local $l6066 i32) + (local $l6067 i32) + (local $l6068 i32) + (local $l6069 i32) + (local $l6070 i32) + (local $l6071 i32) + (local $l6072 i32) + (local $l6073 i32) + (local $l6074 i32) + (local $l6075 i32) + (local $l6076 i32) + (local $l6077 i32) + (local $l6078 i32) + (local $l6079 i32) + (local $l6080 i32) + (local $l6081 i32) + (local $l6082 i32) + (local $l6083 i32) + (local $l6084 i32) + (local $l6085 i32) + (local $l6086 i32) + (local $l6087 i32) + (local $l6088 i32) + (local $l6089 i32) + (local $l6090 i32) + (local $l6091 i32) + (local $l6092 i32) + (local $l6093 i32) + (local $l6094 i32) + (local $l6095 i32) + (local $l6096 i32) + (local $l6097 i32) + (local $l6098 i32) + (local $l6099 i32) + (local $l6100 i32) + (local $l6101 i32) + (local $l6102 i32) + (local $l6103 i32) + (local $l6104 i32) + (local $l6105 i32) + (local $l6106 i32) + (local $l6107 i32) + (local $l6108 i32) + (local $l6109 i32) + (local $l6110 i32) + (local $l6111 i32) + (local $l6112 i32) + (local $l6113 i32) + (local $l6114 i32) + (local $l6115 i32) + (local $l6116 i32) + (local $l6117 i32) + (local $l6118 i32) + (local $l6119 i32) + (local $l6120 i32) + (local $l6121 i32) + (local $l6122 i32) + (local $l6123 i32) + (local $l6124 i32) + (local $l6125 i32) + (local $l6126 i32) + (local $l6127 i32) + (local $l6128 i32) + (local $l6129 i32) + (local $l6130 i32) + (local $l6131 i32) + (local $l6132 i32) + (local $l6133 i32) + (local $l6134 i32) + (local $l6135 i32) + (local $l6136 i32) + (local $l6137 i32) + (local $l6138 i32) + (local $l6139 i32) + (local $l6140 i32) + (local $l6141 i32) + (local $l6142 i32) + (local $l6143 i32) + (local $l6144 i32) + (local $l6145 i32) + (local $l6146 i32) + (local $l6147 i32) + (local $l6148 i32) + (local $l6149 i32) + (local $l6150 i32) + (local $l6151 i32) + (local $l6152 i32) + (local $l6153 i32) + (local $l6154 i32) + (local $l6155 i32) + (local $l6156 i32) + (local $l6157 i32) + (local $l6158 i32) + (local $l6159 i32) + (local $l6160 i32) + (local $l6161 i32) + (local $l6162 i32) + (local $l6163 i32) + (local $l6164 i32) + (local $l6165 i32) + (local $l6166 i32) + (local $l6167 i32) + (local $l6168 i32) + (local $l6169 i32) + (local $l6170 i32) + (local $l6171 i32) + (local $l6172 i32) + (local $l6173 i32) + (local $l6174 i32) + (local $l6175 i32) + (local $l6176 i32) + (local $l6177 i32) + (local $l6178 i32) + (local $l6179 i32) + (local $l6180 i32) + (local $l6181 i32) + (local $l6182 i32) + (local $l6183 i32) + (local $l6184 i32) + (local $l6185 i32) + (local $l6186 i32) + (local $l6187 i32) + (local $l6188 i32) + (local $l6189 i32) + (local $l6190 i32) + (local $l6191 i32) + (local $l6192 i32) + (local $l6193 i32) + (local $l6194 i32) + (local $l6195 i32) + (local $l6196 i32) + (local $l6197 i32) + (local $l6198 i32) + (local $l6199 i32) + (local $l6200 i32) + (local $l6201 i32) + (local $l6202 i32) + (local $l6203 i32) + (local $l6204 i32) + (local $l6205 i32) + (local $l6206 i32) + (local $l6207 i32) + (local $l6208 i32) + (local $l6209 i32) + (local $l6210 i32) + (local $l6211 i32) + (local $l6212 i32) + (local $l6213 i32) + (local $l6214 i32) + (local $l6215 i32) + (local $l6216 i32) + (local $l6217 i32) + (local $l6218 i32) + (local $l6219 i32) + (local $l6220 i32) + (local $l6221 i32) + (local $l6222 i32) + (local $l6223 i32) + (local $l6224 i32) + (local $l6225 i32) + (local $l6226 i32) + (local $l6227 i32) + (local $l6228 i32) + (local $l6229 i32) + (local $l6230 i32) + (local $l6231 i32) + (local $l6232 i32) + (local $l6233 i32) + (local $l6234 i32) + (local $l6235 i32) + (local $l6236 i32) + (local $l6237 i32) + (local $l6238 i32) + (local $l6239 i32) + (local $l6240 i32) + (local $l6241 i32) + (local $l6242 i32) + (local $l6243 i32) + (local $l6244 i32) + (local $l6245 i32) + (local $l6246 i32) + (local $l6247 i32) + (local $l6248 i32) + (local $l6249 i32) + (local $l6250 i32) + (local $l6251 i32) + (local $l6252 i32) + (local $l6253 i32) + (local $l6254 i32) + (local $l6255 i32) + (local $l6256 i32) + (local $l6257 i32) + (local $l6258 i32) + (local $l6259 i32) + (local $l6260 i32) + (local $l6261 i32) + (local $l6262 i32) + (local $l6263 i32) + (local $l6264 i32) + (local $l6265 i32) + (local $l6266 i32) + (local $l6267 i32) + (local $l6268 i32) + (local $l6269 i32) + (local $l6270 i32) + (local $l6271 i32) + (local $l6272 i32) + (local $l6273 i32) + (local $l6274 i32) + (local $l6275 i32) + (local $l6276 i32) + (local $l6277 i32) + (local $l6278 i32) + (local $l6279 i32) + (local $l6280 i32) + (local $l6281 i32) + (local $l6282 i32) + (local $l6283 i32) + (local $l6284 i32) + (local $l6285 i32) + (local $l6286 i32) + (local $l6287 i32) + (local $l6288 i32) + (local $l6289 i32) + (local $l6290 i32) + (local $l6291 i32) + (local $l6292 i32) + (local $l6293 i32) + (local $l6294 i32) + (local $l6295 i32) + (local $l6296 i32) + (local $l6297 i32) + (local $l6298 i32) + (local $l6299 i32) + (local $l6300 i32) + (local $l6301 i32) + (local $l6302 i32) + (local $l6303 i32) + (local $l6304 i32) + (local $l6305 i32) + (local $l6306 i32) + (local $l6307 i32) + (local $l6308 i32) + (local $l6309 i32) + (local $l6310 i32) + (local $l6311 i32) + (local $l6312 i32) + (local $l6313 i32) + (local $l6314 i32) + (local $l6315 i32) + (local $l6316 i32) + (local $l6317 i32) + (local $l6318 i32) + (local $l6319 i32) + (local $l6320 i32) + (local $l6321 i32) + (local $l6322 i32) + (local $l6323 i32) + (local $l6324 i32) + (local $l6325 i32) + (local $l6326 i32) + (local $l6327 i32) + (local $l6328 i32) + (local $l6329 i32) + (local $l6330 i32) + (local $l6331 i32) + (local $l6332 i32) + (local $l6333 i32) + (local $l6334 i32) + (local $l6335 i32) + (local $l6336 i32) + (local $l6337 i32) + (local $l6338 i32) + (local $l6339 i32) + (local $l6340 i32) + (local $l6341 i32) + (local $l6342 i32) + (local $l6343 i32) + (local $l6344 i32) + (local $l6345 i32) + (local $l6346 i32) + (local $l6347 i32) + (local $l6348 i32) + (local $l6349 i32) + (local $l6350 i32) + (local $l6351 i32) + (local $l6352 i32) + (local $l6353 i32) + (local $l6354 i32) + (local $l6355 i32) + (local $l6356 i32) + (local $l6357 i32) + (local $l6358 i32) + (local $l6359 i32) + (local $l6360 i32) + (local $l6361 i32) + (local $l6362 i32) + (local $l6363 i32) + (local $l6364 i32) + (local $l6365 i32) + (local $l6366 i32) + (local $l6367 i32) + (local $l6368 i32) + (local $l6369 i32) + (local $l6370 i32) + (local $l6371 i32) + (local $l6372 i32) + (local $l6373 i32) + (local $l6374 i32) + (local $l6375 i32) + (local $l6376 i32) + (local $l6377 i32) + (local $l6378 i32) + (local $l6379 i32) + (local $l6380 i32) + (local $l6381 i32) + (local $l6382 i32) + (local $l6383 i32) + (local $l6384 i32) + (local $l6385 i32) + (local $l6386 i32) + (local $l6387 i32) + (local $l6388 i32) + (local $l6389 i32) + (local $l6390 i32) + (local $l6391 i32) + (local $l6392 i32) + (local $l6393 i32) + (local $l6394 i32) + (local $l6395 i32) + (local $l6396 i32) + (local $l6397 i32) + (local $l6398 i32) + (local $l6399 i32) + (local $l6400 i32) + (local $l6401 i32) + (local $l6402 i32) + (local $l6403 i32) + (local $l6404 i32) + (local $l6405 i32) + (local $l6406 i32) + (local $l6407 i32) + (local $l6408 i32) + (local $l6409 i32) + (local $l6410 i32) + (local $l6411 i32) + (local $l6412 i32) + (local $l6413 i32) + (local $l6414 i32) + (local $l6415 i32) + (local $l6416 i32) + (local $l6417 i32) + (local $l6418 i32) + (local $l6419 i32) + (local $l6420 i32) + (local $l6421 i32) + (local $l6422 i32) + (local $l6423 i32) + (local $l6424 i32) + (local $l6425 i32) + (local $l6426 i32) + (local $l6427 i32) + (local $l6428 i32) + (local $l6429 i32) + (local $l6430 i32) + (local $l6431 i32) + (local $l6432 i32) + (local $l6433 i32) + (local $l6434 i32) + (local $l6435 i32) + (local $l6436 i32) + (local $l6437 i32) + (local $l6438 i32) + (local $l6439 i32) + (local $l6440 i32) + (local $l6441 i32) + (local $l6442 i32) + (local $l6443 i32) + (local $l6444 i32) + (local $l6445 i32) + (local $l6446 i32) + (local $l6447 i32) + (local $l6448 i32) + (local $l6449 i32) + (local $l6450 i32) + (local $l6451 i32) + (local $l6452 i32) + (local $l6453 i32) + (local $l6454 i32) + (local $l6455 i32) + (local $l6456 i32) + (local $l6457 i32) + (local $l6458 i32) + (local $l6459 i32) + (local $l6460 i32) + (local $l6461 i32) + (local $l6462 i32) + (local $l6463 i32) + (local $l6464 i32) + (local $l6465 i32) + (local $l6466 i32) + (local $l6467 i32) + (local $l6468 i32) + (local $l6469 i32) + (local $l6470 i32) + (local $l6471 i32) + (local $l6472 i32) + (local $l6473 i32) + (local $l6474 i32) + (local $l6475 i32) + (local $l6476 i32) + (local $l6477 i32) + (local $l6478 i32) + (local $l6479 i32) + (local $l6480 i32) + (local $l6481 i32) + (local $l6482 i32) + (local $l6483 i32) + (local $l6484 i32) + (local $l6485 i32) + (local $l6486 i32) + (local $l6487 i32) + (local $l6488 i32) + (local $l6489 i32) + (local $l6490 i32) + (local $l6491 i32) + (local $l6492 i32) + (local $l6493 i32) + (local $l6494 i32) + (local $l6495 i32) + (local $l6496 i32) + (local $l6497 i32) + (local $l6498 i32) + (local $l6499 i32) + (local $l6500 i32) + (local $l6501 i32) + (local $l6502 i32) + (local $l6503 i32) + (local $l6504 i32) + (local $l6505 i32) + (local $l6506 i32) + (local $l6507 i32) + (local $l6508 i32) + (local $l6509 i32) + (local $l6510 i32) + (local $l6511 i32) + (local $l6512 i32) + (local $l6513 i32) + (local $l6514 i32) + (local $l6515 i32) + (local $l6516 i32) + (local $l6517 i32) + (local $l6518 i32) + (local $l6519 i32) + (local $l6520 i32) + (local $l6521 i32) + (local $l6522 i32) + (local $l6523 i32) + (local $l6524 i32) + (local $l6525 i32) + (local $l6526 i32) + (local $l6527 i32) + (local $l6528 i32) + (local $l6529 i32) + (local $l6530 i32) + (local $l6531 i32) + (local $l6532 i32) + (local $l6533 i32) + (local $l6534 i32) + (local $l6535 i32) + (local $l6536 i32) + (local $l6537 i32) + (local $l6538 i32) + (local $l6539 i32) + (local $l6540 i32) + (local $l6541 i32) + (local $l6542 i32) + (local $l6543 i32) + (local $l6544 i32) + (local $l6545 i32) + (local $l6546 i32) + (local $l6547 i32) + (local $l6548 i32) + (local $l6549 i32) + (local $l6550 i32) + (local $l6551 i32) + (local $l6552 i32) + (local $l6553 i32) + (local $l6554 i32) + (local $l6555 i32) + (local $l6556 i32) + (local $l6557 i32) + (local $l6558 i32) + (local $l6559 i32) + (local $l6560 i32) + (local $l6561 i32) + (local $l6562 i32) + (local $l6563 i32) + (local $l6564 i32) + (local $l6565 i32) + (local $l6566 i32) + (local $l6567 i32) + (local $l6568 i32) + (local $l6569 i32) + (local $l6570 i32) + (local $l6571 i32) + (local $l6572 i32) + (local $l6573 i32) + (local $l6574 i32) + (local $l6575 i32) + (local $l6576 i32) + (local $l6577 i32) + (local $l6578 i32) + (local $l6579 i32) + (local $l6580 i32) + (local $l6581 i32) + (local $l6582 i32) + (local $l6583 i32) + (local $l6584 i32) + (local $l6585 i32) + (local $l6586 i32) + (local $l6587 i32) + (local $l6588 i32) + (local $l6589 i32) + (local $l6590 i32) + (local $l6591 i32) + (local $l6592 i32) + (local $l6593 i32) + (local $l6594 i32) + (local $l6595 i32) + (local $l6596 i32) + (local $l6597 i32) + (local $l6598 i32) + (local $l6599 i32) + (local $l6600 i32) + (local $l6601 i32) + (local $l6602 i32) + (local $l6603 i32) + (local $l6604 i32) + (local $l6605 i32) + (local $l6606 i32) + (local $l6607 i32) + (local $l6608 i32) + (local $l6609 i32) + (local $l6610 i32) + (local $l6611 i32) + (local $l6612 i32) + (local $l6613 i32) + (local $l6614 i32) + (local $l6615 i32) + (local $l6616 i32) + (local $l6617 i32) + (local $l6618 i32) + (local $l6619 i32) + (local $l6620 i32) + (local $l6621 i32) + (local $l6622 i32) + (local $l6623 i32) + (local $l6624 i32) + (local $l6625 i32) + (local $l6626 i32) + (local $l6627 i32) + (local $l6628 i32) + (local $l6629 i32) + (local $l6630 i32) + (local $l6631 i32) + (local $l6632 i32) + (local $l6633 i32) + (local $l6634 i32) + (local $l6635 i32) + (local $l6636 i32) + (local $l6637 i32) + (local $l6638 i32) + (local $l6639 i32) + (local $l6640 i32) + (local $l6641 i32) + (local $l6642 i32) + (local $l6643 i32) + (local $l6644 i32) + (local $l6645 i32) + (local $l6646 i32) + (local $l6647 i32) + (local $l6648 i32) + (local $l6649 i32) + (local $l6650 i32) + (local $l6651 i32) + (local $l6652 i32) + (local $l6653 i32) + (local $l6654 i32) + (local $l6655 i32) + (local $l6656 i32) + (local $l6657 i32) + (local $l6658 i32) + (local $l6659 i32) + (local $l6660 i32) + (local $l6661 i32) + (local $l6662 i32) + (local $l6663 i32) + (local $l6664 i32) + (local $l6665 i32) + (local $l6666 i32) + (local $l6667 i32) + (local $l6668 i32) + (local $l6669 i32) + (local $l6670 i32) + (local $l6671 i32) + (local $l6672 i32) + (local $l6673 i32) + (local $l6674 i32) + (local $l6675 i32) + (local $l6676 i32) + (local $l6677 i32) + (local $l6678 i32) + (local $l6679 i32) + (local $l6680 i32) + (local $l6681 i32) + (local $l6682 i32) + (local $l6683 i32) + (local $l6684 i32) + (local $l6685 i32) + (local $l6686 i32) + (local $l6687 i32) + (local $l6688 i32) + (local $l6689 i32) + (local $l6690 i32) + (local $l6691 i32) + (local $l6692 i32) + (local $l6693 i32) + (local $l6694 i32) + (local $l6695 i32) + (local $l6696 i32) + (local $l6697 i32) + (local $l6698 i32) + (local $l6699 i32) + (local $l6700 i32) + (local $l6701 i32) + (local $l6702 i32) + (local $l6703 i32) + (local $l6704 i32) + (local $l6705 i32) + (local $l6706 i32) + (local $l6707 i32) + (local $l6708 i32) + (local $l6709 i32) + (local $l6710 i32) + (local $l6711 i32) + (local $l6712 i32) + (local $l6713 i32) + (local $l6714 i32) + (local $l6715 i32) + (local $l6716 i32) + (local $l6717 i32) + (local $l6718 i32) + (local $l6719 i32) + (local $l6720 i32) + (local $l6721 i32) + (local $l6722 i32) + (local $l6723 i32) + (local $l6724 i32) + (local $l6725 i32) + (local $l6726 i32) + (local $l6727 i32) + (local $l6728 i32) + (local $l6729 i32) + (local $l6730 i32) + (local $l6731 i32) + (local $l6732 i32) + (local $l6733 i32) + (local $l6734 i32) + (local $l6735 i32) + (local $l6736 i32) + (local $l6737 i32) + (local $l6738 i32) + (local $l6739 i32) + (local $l6740 i32) + (local $l6741 i32) + (local $l6742 i32) + (local $l6743 i32) + (local $l6744 i32) + (local $l6745 i32) + (local $l6746 i32) + (local $l6747 i32) + (local $l6748 i32) + (local $l6749 i32) + (local $l6750 i32) + (local $l6751 i32) + (local $l6752 i32) + (local $l6753 i32) + (local $l6754 i32) + (local $l6755 i32) + (local $l6756 i32) + (local $l6757 i32) + (local $l6758 i32) + (local $l6759 i32) + (local $l6760 i32) + (local $l6761 i32) + (local $l6762 i32) + (local $l6763 i32) + (local $l6764 i32) + (local $l6765 i32) + (local $l6766 i32) + (local $l6767 i32) + (local $l6768 i32) + (local $l6769 i32) + (local $l6770 i32) + (local $l6771 i32) + (local $l6772 i32) + (local $l6773 i32) + (local $l6774 i32) + (local $l6775 i32) + (local $l6776 i32) + (local $l6777 i32) + (local $l6778 i32) + (local $l6779 i32) + (local $l6780 i32) + (local $l6781 i32) + (local $l6782 i32) + (local $l6783 i32) + (local $l6784 i32) + (local $l6785 i32) + (local $l6786 i32) + (local $l6787 i32) + (local $l6788 i32) + (local $l6789 i32) + (local $l6790 i32) + (local $l6791 i32) + (local $l6792 i32) + (local $l6793 i32) + (local $l6794 i32) + (local $l6795 i32) + (local $l6796 i32) + (local $l6797 i32) + (local $l6798 i32) + (local $l6799 i32) + (local $l6800 i32) + (local $l6801 i32) + (local $l6802 i32) + (local $l6803 i32) + (local $l6804 i32) + (local $l6805 i32) + (local $l6806 i32) + (local $l6807 i32) + (local $l6808 i32) + (local $l6809 i32) + (local $l6810 i32) + (local $l6811 i32) + (local $l6812 i32) + (local $l6813 i32) + (local $l6814 i32) + (local $l6815 i32) + (local $l6816 i32) + (local $l6817 i32) + (local $l6818 i32) + (local $l6819 i32) + (local $l6820 i32) + (local $l6821 i32) + (local $l6822 i32) + (local $l6823 i32) + (local $l6824 i32) + (local $l6825 i32) + (local $l6826 i32) + (local $l6827 i32) + (local $l6828 i32) + (local $l6829 i32) + (local $l6830 i32) + (local $l6831 i32) + (local $l6832 i32) + (local $l6833 i32) + (local $l6834 i32) + (local $l6835 i32) + (local $l6836 i32) + (local $l6837 i32) + (local $l6838 i32) + (local $l6839 i32) + (local $l6840 i32) + (local $l6841 i32) + (local $l6842 i32) + (local $l6843 i32) + (local $l6844 i32) + (local $l6845 i32) + (local $l6846 i32) + (local $l6847 i32) + (local $l6848 i32) + (local $l6849 i32) + (local $l6850 i32) + (local $l6851 i32) + (local $l6852 i32) + (local $l6853 i32) + (local $l6854 i32) + (local $l6855 i32) + (local $l6856 i32) + (local $l6857 i32) + (local $l6858 i32) + (local $l6859 i32) + (local $l6860 i32) + (local $l6861 i32) + (local $l6862 i32) + (local $l6863 i32) + (local $l6864 i32) + (local $l6865 i32) + (local $l6866 i32) + (local $l6867 i32) + (local $l6868 i32) + (local $l6869 i32) + (local $l6870 i32) + (local $l6871 i32) + (local $l6872 i32) + (local $l6873 i32) + (local $l6874 i32) + (local $l6875 i32) + (local $l6876 i32) + (local $l6877 i32) + (local $l6878 i32) + (local $l6879 i32) + (local $l6880 i32) + (local $l6881 i32) + (local $l6882 i32) + (local $l6883 i32) + (local $l6884 i32) + (local $l6885 i32) + (local $l6886 i32) + (local $l6887 i32) + (local $l6888 i32) + (local $l6889 i32) + (local $l6890 i32) + (local $l6891 i32) + (local $l6892 i32) + (local $l6893 i32) + (local $l6894 i32) + (local $l6895 i32) + (local $l6896 i32) + (local $l6897 i32) + (local $l6898 i32) + (local $l6899 i32) + (local $l6900 i32) + (local $l6901 i32) + (local $l6902 i32) + (local $l6903 i32) + (local $l6904 i32) + (local $l6905 i32) + (local $l6906 i32) + (local $l6907 i32) + (local $l6908 i32) + (local $l6909 i32) + (local $l6910 i32) + (local $l6911 i32) + (local $l6912 i32) + (local $l6913 i32) + (local $l6914 i32) + (local $l6915 i32) + (local $l6916 i32) + (local $l6917 i32) + (local $l6918 i32) + (local $l6919 i32) + (local $l6920 i32) + (local $l6921 i32) + (local $l6922 i32) + (local $l6923 i32) + (local $l6924 i32) + (local $l6925 i32) + (local $l6926 i32) + (local $l6927 i32) + (local $l6928 i32) + (local $l6929 i32) + (local $l6930 i32) + (local $l6931 i32) + (local $l6932 i32) + (local $l6933 i32) + (local $l6934 i32) + (local $l6935 i32) + (local $l6936 i32) + (local $l6937 i32) + (local $l6938 i32) + (local $l6939 i32) + (local $l6940 i32) + (local $l6941 i32) + (local $l6942 i32) + (local $l6943 i32) + (local $l6944 i32) + (local $l6945 i32) + (local $l6946 i32) + (local $l6947 i32) + (local $l6948 i32) + (local $l6949 i32) + (local $l6950 i32) + (local $l6951 i32) + (local $l6952 i32) + (local $l6953 i32) + (local $l6954 i32) + (local $l6955 i32) + (local $l6956 i32) + (local $l6957 i32) + (local $l6958 i32) + (local $l6959 i32) + (local $l6960 i32) + (local $l6961 i32) + (local $l6962 i32) + (local $l6963 i32) + (local $l6964 i32) + (local $l6965 i32) + (local $l6966 i32) + (local $l6967 i32) + (local $l6968 i32) + (local $l6969 i32) + (local $l6970 i32) + (local $l6971 i32) + (local $l6972 i32) + (local $l6973 i32) + (local $l6974 i32) + (local $l6975 i32) + (local $l6976 i32) + (local $l6977 i32) + (local $l6978 i32) + (local $l6979 i32) + (local $l6980 i32) + (local $l6981 i32) + (local $l6982 i32) + (local $l6983 i32) + (local $l6984 i32) + (local $l6985 i32) + (local $l6986 i32) + (local $l6987 i32) + (local $l6988 i32) + (local $l6989 i32) + (local $l6990 i32) + (local $l6991 i32) + (local $l6992 i32) + (local $l6993 i32) + (local $l6994 i32) + (local $l6995 i32) + (local $l6996 i32) + (local $l6997 i32) + (local $l6998 i32) + (local $l6999 i32) + (local $l7000 i32) + (local $l7001 i32) + (local $l7002 i32) + (local $l7003 i32) + (local $l7004 i32) + (local $l7005 i32) + (local $l7006 i32) + (local $l7007 i32) + (local $l7008 i32) + (local $l7009 i32) + (local $l7010 i32) + (local $l7011 i32) + (local $l7012 i32) + (local $l7013 i32) + (local $l7014 i32) + (local $l7015 i32) + (local $l7016 i32) + (local $l7017 i32) + (local $l7018 i32) + (local $l7019 i32) + (local $l7020 i32) + (local $l7021 i32) + (local $l7022 i32) + (local $l7023 i32) + (local $l7024 i32) + (local $l7025 i32) + (local $l7026 i32) + (local $l7027 i32) + (local $l7028 i32) + (local $l7029 i32) + (local $l7030 i32) + (local $l7031 i32) + (local $l7032 i32) + (local $l7033 i32) + (local $l7034 i32) + (local $l7035 i32) + (local $l7036 i32) + (local $l7037 i32) + (local $l7038 i32) + (local $l7039 i32) + (local $l7040 i32) + (local $l7041 i32) + (local $l7042 i32) + (local $l7043 i32) + (local $l7044 i32) + (local $l7045 i32) + (local $l7046 i32) + (local $l7047 i32) + (local $l7048 i32) + (local $l7049 i32) + (local $l7050 i32) + (local $l7051 i32) + (local $l7052 i32) + (local $l7053 i32) + (local $l7054 i32) + (local $l7055 i32) + (local $l7056 i32) + (local $l7057 i32) + (local $l7058 i32) + (local $l7059 i32) + (local $l7060 i32) + (local $l7061 i32) + (local $l7062 i32) + (local $l7063 i32) + (local $l7064 i32) + (local $l7065 i32) + (local $l7066 i32) + (local $l7067 i32) + (local $l7068 i32) + (local $l7069 i32) + (local $l7070 i32) + (local $l7071 i32) + (local $l7072 i32) + (local $l7073 i32) + (local $l7074 i32) + (local $l7075 i32) + (local $l7076 i32) + (local $l7077 i32) + (local $l7078 i32) + (local $l7079 i32) + (local $l7080 i32) + (local $l7081 i32) + (local $l7082 i32) + (local $l7083 i32) + (local $l7084 i32) + (local $l7085 i32) + (local $l7086 i32) + (local $l7087 i32) + (local $l7088 i32) + (local $l7089 i32) + (local $l7090 i32) + (local $l7091 i32) + (local $l7092 i32) + (local $l7093 i32) + (local $l7094 i32) + (local $l7095 i32) + (local $l7096 i32) + (local $l7097 i32) + (local $l7098 i32) + (local $l7099 i32) + (local $l7100 i32) + (local $l7101 i32) + (local $l7102 i32) + (local $l7103 i32) + (local $l7104 i32) + (local $l7105 i32) + (local $l7106 i32) + (local $l7107 i32) + (local $l7108 i32) + (local $l7109 i32) + (local $l7110 i32) + (local $l7111 i32) + (local $l7112 i32) + (local $l7113 i32) + (local $l7114 i32) + (local $l7115 i32) + (local $l7116 i32) + (local $l7117 i32) + (local $l7118 i32) + (local $l7119 i32) + (local $l7120 i32) + (local $l7121 i32) + (local $l7122 i32) + (local $l7123 i32) + (local $l7124 i32) + (local $l7125 i32) + (local $l7126 i32) + (local $l7127 i32) + (local $l7128 i32) + (local $l7129 i32) + (local $l7130 i32) + (local $l7131 i32) + (local $l7132 i32) + (local $l7133 i32) + (local $l7134 i32) + (local $l7135 i32) + (local $l7136 i32) + (local $l7137 i32) + (local $l7138 i32) + (local $l7139 i32) + (local $l7140 i32) + (local $l7141 i32) + (local $l7142 i32) + (local $l7143 i32) + (local $l7144 i32) + (local $l7145 i32) + (local $l7146 i32) + (local $l7147 i32) + (local $l7148 i32) + (local $l7149 i32) + (local $l7150 i32) + (local $l7151 i32) + (local $l7152 i32) + (local $l7153 i32) + (local $l7154 i32) + (local $l7155 i32) + (local $l7156 i32) + (local $l7157 i32) + (local $l7158 i32) + (local $l7159 i32) + (local $l7160 i32) + (local $l7161 i32) + (local $l7162 i32) + (local $l7163 i32) + (local $l7164 i32) + (local $l7165 i32) + (local $l7166 i32) + (local $l7167 i32) + (local $l7168 i32) + (local $l7169 i32) + (local $l7170 i32) + (local $l7171 i32) + (local $l7172 i32) + (local $l7173 i32) + (local $l7174 i32) + (local $l7175 i32) + (local $l7176 i32) + (local $l7177 i32) + (local $l7178 i32) + (local $l7179 i32) + (local $l7180 i32) + (local $l7181 i32) + (local $l7182 i32) + (local $l7183 i32) + (local $l7184 i32) + (local $l7185 i32) + (local $l7186 i32) + (local $l7187 i32) + (local $l7188 i32) + (local $l7189 i32) + (local $l7190 i32) + (local $l7191 i32) + (local $l7192 i32) + (local $l7193 i32) + (local $l7194 i32) + (local $l7195 i32) + (local $l7196 i32) + (local $l7197 i32) + (local $l7198 i32) + (local $l7199 i32) + (local $l7200 i32) + (local $l7201 i32) + (local $l7202 i32) + (local $l7203 i32) + (local $l7204 i32) + (local $l7205 i32) + (local $l7206 i32) + (local $l7207 i32) + (local $l7208 i32) + (local $l7209 i32) + (local $l7210 i32) + (local $l7211 i32) + (local $l7212 i32) + (local $l7213 i32) + (local $l7214 i32) + (local $l7215 i32) + (local $l7216 i32) + (local $l7217 i32) + (local $l7218 i32) + (local $l7219 i32) + (local $l7220 i32) + (local $l7221 i32) + (local $l7222 i32) + (local $l7223 i32) + (local $l7224 i32) + (local $l7225 i32) + (local $l7226 i32) + (local $l7227 i32) + (local $l7228 i32) + (local $l7229 i32) + (local $l7230 i32) + (local $l7231 i32) + (local $l7232 i32) + (local $l7233 i32) + (local $l7234 i32) + (local $l7235 i32) + (local $l7236 i32) + (local $l7237 i32) + (local $l7238 i32) + (local $l7239 i32) + (local $l7240 i32) + (local $l7241 i32) + (local $l7242 i32) + (local $l7243 i32) + (local $l7244 i32) + (local $l7245 i32) + (local $l7246 i32) + (local $l7247 i32) + (local $l7248 i32) + (local $l7249 i32) + (local $l7250 i32) + (local $l7251 i32) + (local $l7252 i32) + (local $l7253 i32) + (local $l7254 i32) + (local $l7255 i32) + (local $l7256 i32) + (local $l7257 i32) + (local $l7258 i32) + (local $l7259 i32) + (local $l7260 i32) + (local $l7261 i32) + (local $l7262 i32) + (local $l7263 i32) + (local $l7264 i32) + (local $l7265 i32) + (local $l7266 i32) + (local $l7267 i32) + (local $l7268 i32) + (local $l7269 i32) + (local $l7270 i32) + (local $l7271 i32) + (local $l7272 i32) + (local $l7273 i32) + (local $l7274 i32) + (local $l7275 i32) + (local $l7276 i32) + (local $l7277 i32) + (local $l7278 i32) + (local $l7279 i32) + (local $l7280 i32) + (local $l7281 i32) + (local $l7282 i32) + (local $l7283 i32) + (local $l7284 i32) + (local $l7285 i32) + (local $l7286 i32) + (local $l7287 i32) + (local $l7288 i32) + (local $l7289 i32) + (local $l7290 i32) + (local $l7291 i32) + (local $l7292 i32) + (local $l7293 i32) + (local $l7294 i32) + (local $l7295 i32) + (local $l7296 i32) + (local $l7297 i32) + (local $l7298 i32) + (local $l7299 i32) + (local $l7300 i32) + (local $l7301 i32) + (local $l7302 i32) + (local $l7303 i32) + (local $l7304 i32) + (local $l7305 i32) + (local $l7306 i32) + (local $l7307 i32) + (local $l7308 i32) + (local $l7309 i32) + (local $l7310 i32) + (local $l7311 i32) + (local $l7312 i32) + (local $l7313 i32) + (local $l7314 i32) + (local $l7315 i32) + (local $l7316 i32) + (local $l7317 i32) + (local $l7318 i32) + (local $l7319 i32) + (local $l7320 i32) + (local $l7321 i32) + (local $l7322 i32) + (local $l7323 i32) + (local $l7324 i32) + (local $l7325 i32) + (local $l7326 i32) + (local $l7327 i32) + (local $l7328 i32) + (local $l7329 i32) + (local $l7330 i32) + (local $l7331 i32) + (local $l7332 i32) + (local $l7333 i32) + (local $l7334 i32) + (local $l7335 i32) + (local $l7336 i32) + (local $l7337 i32) + (local $l7338 i32) + (local $l7339 i32) + (local $l7340 i32) + (local $l7341 i32) + (local $l7342 i32) + (local $l7343 i32) + (local $l7344 i32) + (local $l7345 i32) + (local $l7346 i32) + (local $l7347 i32) + (local $l7348 i32) + (local $l7349 i32) + (local $l7350 i32) + (local $l7351 i32) + (local $l7352 i32) + (local $l7353 i32) + (local $l7354 i32) + (local $l7355 i32) + (local $l7356 i32) + (local $l7357 i32) + (local $l7358 i32) + (local $l7359 i32) + (local $l7360 i32) + (local $l7361 i32) + (local $l7362 i32) + (local $l7363 i32) + (local $l7364 i32) + (local $l7365 i32) + (local $l7366 i32) + (local $l7367 i32) + (local $l7368 i32) + (local $l7369 i32) + (local $l7370 i32) + (local $l7371 i32) + (local $l7372 i32) + (local $l7373 i32) + (local $l7374 i32) + (local $l7375 i32) + (local $l7376 i32) + (local $l7377 i32) + (local $l7378 i32) + (local $l7379 i32) + (local $l7380 i32) + (local $l7381 i32) + (local $l7382 i32) + (local $l7383 i32) + (local $l7384 i32) + (local $l7385 i32) + (local $l7386 i32) + (local $l7387 i32) + (local $l7388 i32) + (local $l7389 i32) + (local $l7390 i32) + (local $l7391 i32) + (local $l7392 i32) + (local $l7393 i32) + (local $l7394 i32) + (local $l7395 i32) + (local $l7396 i32) + (local $l7397 i32) + (local $l7398 i32) + (local $l7399 i32) + (local $l7400 i32) + (local $l7401 i32) + (local $l7402 i32) + (local $l7403 i32) + (local $l7404 i32) + (local $l7405 i32) + (local $l7406 i32) + (local $l7407 i32) + (local $l7408 i32) + (local $l7409 i32) + (local $l7410 i32) + (local $l7411 i32) + (local $l7412 i32) + (local $l7413 i32) + (local $l7414 i32) + (local $l7415 i32) + (local $l7416 i32) + (local $l7417 i32) + (local $l7418 i32) + (local $l7419 i32) + (local $l7420 i32) + (local $l7421 i32) + (local $l7422 i32) + (local $l7423 i32) + (local $l7424 i32) + (local $l7425 i32) + (local $l7426 i32) + (local $l7427 i32) + (local $l7428 i32) + (local $l7429 i32) + (local $l7430 i32) + (local $l7431 i32) + (local $l7432 i32) + (local $l7433 i32) + (local $l7434 i32) + (local $l7435 i32) + (local $l7436 i32) + (local $l7437 i32) + (local $l7438 i32) + (local $l7439 i32) + (local $l7440 i32) + (local $l7441 i32) + (local $l7442 i32) + (local $l7443 i32) + (local $l7444 i32) + (local $l7445 i32) + (local $l7446 i32) + (local $l7447 i32) + (local $l7448 i32) + (local $l7449 i32) + (local $l7450 i32) + (local $l7451 i32) + (local $l7452 i32) + (local $l7453 i32) + (local $l7454 i32) + (local $l7455 i32) + (local $l7456 i32) + (local $l7457 i32) + (local $l7458 i32) + (local $l7459 i32) + (local $l7460 i32) + (local $l7461 i32) + (local $l7462 i32) + (local $l7463 i32) + (local $l7464 i32) + (local $l7465 i32) + (local $l7466 i32) + (local $l7467 i32) + (local $l7468 i32) + (local $l7469 i32) + (local $l7470 i32) + (local $l7471 i32) + (local $l7472 i32) + (local $l7473 i32) + (local $l7474 i32) + (local $l7475 i32) + (local $l7476 i32) + (local $l7477 i32) + (local $l7478 i32) + (local $l7479 i32) + (local $l7480 i32) + (local $l7481 i32) + (local $l7482 i32) + (local $l7483 i32) + (local $l7484 i32) + (local $l7485 i32) + (local $l7486 i32) + (local $l7487 i32) + (local $l7488 i32) + (local $l7489 i32) + (local $l7490 i32) + (local $l7491 i32) + (local $l7492 i32) + (local $l7493 i32) + (local $l7494 i32) + (local $l7495 i32) + (local $l7496 i32) + (local $l7497 i32) + (local $l7498 i32) + (local $l7499 i32) + (local $l7500 i32) + (local $l7501 i32) + (local $l7502 i32) + (local $l7503 i32) + (local $l7504 i32) + (local $l7505 i32) + (local $l7506 i32) + (local $l7507 i32) + (local $l7508 i32) + (local $l7509 i32) + (local $l7510 i32) + (local $l7511 i32) + (local $l7512 i32) + (local $l7513 i32) + (local $l7514 i32) + (local $l7515 i32) + (local $l7516 i32) + (local $l7517 i32) + (local $l7518 i32) + (local $l7519 i32) + (local $l7520 i32) + (local $l7521 i32) + (local $l7522 i32) + (local $l7523 i32) + (local $l7524 i32) + (local $l7525 i32) + (local $l7526 i32) + (local $l7527 i32) + (local $l7528 i32) + (local $l7529 i32) + (local $l7530 i32) + (local $l7531 i32) + (local $l7532 i32) + (local $l7533 i32) + (local $l7534 i32) + (local $l7535 i32) + (local $l7536 i32) + (local $l7537 i32) + (local $l7538 i32) + (local $l7539 i32) + (local $l7540 i32) + (local $l7541 i32) + (local $l7542 i32) + (local $l7543 i32) + (local $l7544 i32) + (local $l7545 i32) + (local $l7546 i32) + (local $l7547 i32) + (local $l7548 i32) + (local $l7549 i32) + (local $l7550 i32) + (local $l7551 i32) + (local $l7552 i32) + (local $l7553 i32) + (local $l7554 i32) + (local $l7555 i32) + (local $l7556 i32) + (local $l7557 i32) + (local $l7558 i32) + (local $l7559 i32) + (local $l7560 i32) + (local $l7561 i32) + (local $l7562 i32) + (local $l7563 i32) + (local $l7564 i32) + (local $l7565 i32) + (local $l7566 i32) + (local $l7567 i32) + (local $l7568 i32) + (local $l7569 i32) + (local $l7570 i32) + (local $l7571 i32) + (local $l7572 i32) + (local $l7573 i32) + (local $l7574 i32) + (local $l7575 i32) + (local $l7576 i32) + (local $l7577 i32) + (local $l7578 i32) + (local $l7579 i32) + (local $l7580 i32) + (local $l7581 i32) + (local $l7582 i32) + (local $l7583 i32) + (local $l7584 i32) + (local $l7585 i32) + (local $l7586 i32) + (local $l7587 i32) + (local $l7588 i32) + (local $l7589 i32) + (local $l7590 i32) + (local $l7591 i32) + (local $l7592 i32) + (local $l7593 i32) + (local $l7594 i32) + (local $l7595 i32) + (local $l7596 i32) + (local $l7597 i32) + (local $l7598 i32) + (local $l7599 i32) + (local $l7600 i32) + (local $l7601 i32) + (local $l7602 i32) + (local $l7603 i32) + (local $l7604 i32) + (local $l7605 i32) + (local $l7606 i32) + (local $l7607 i32) + (local $l7608 i32) + (local $l7609 i32) + (local $l7610 i32) + (local $l7611 i32) + (local $l7612 i32) + (local $l7613 i32) + (local $l7614 i32) + (local $l7615 i32) + (local $l7616 i32) + (local $l7617 i32) + (local $l7618 i32) + (local $l7619 i32) + (local $l7620 i32) + (local $l7621 i32) + (local $l7622 i32) + (local $l7623 i32) + (local $l7624 i32) + (local $l7625 i32) + (local $l7626 i32) + (local $l7627 i32) + (local $l7628 i32) + (local $l7629 i32) + (local $l7630 i32) + (local $l7631 i32) + (local $l7632 i32) + (local $l7633 i32) + (local $l7634 i32) + (local $l7635 i32) + (local $l7636 i32) + (local $l7637 i32) + (local $l7638 i32) + (local $l7639 i32) + (local $l7640 i32) + (local $l7641 i32) + (local $l7642 i32) + (local $l7643 i32) + (local $l7644 i32) + (local $l7645 i32) + (local $l7646 i32) + (local $l7647 i32) + (local $l7648 i32) + (local $l7649 i32) + (local $l7650 i32) + (local $l7651 i32) + (local $l7652 i32) + (local $l7653 i32) + (local $l7654 i32) + (local $l7655 i32) + (local $l7656 i32) + (local $l7657 i32) + (local $l7658 i32) + (local $l7659 i32) + (local $l7660 i32) + (local $l7661 i32) + (local $l7662 i32) + (local $l7663 i32) + (local $l7664 i32) + (local $l7665 i32) + (local $l7666 i32) + (local $l7667 i32) + (local $l7668 i32) + (local $l7669 i32) + (local $l7670 i32) + (local $l7671 i32) + (local $l7672 i32) + (local $l7673 i32) + (local $l7674 i32) + (local $l7675 i32) + (local $l7676 i32) + (local $l7677 i32) + (local $l7678 i32) + (local $l7679 i32) + (local $l7680 i32) + (local $l7681 i32) + (local $l7682 i32) + (local $l7683 i32) + (local $l7684 i32) + (local $l7685 i32) + (local $l7686 i32) + (local $l7687 i32) + (local $l7688 i32) + (local $l7689 i32) + (local $l7690 i32) + (local $l7691 i32) + (local $l7692 i32) + (local $l7693 i32) + (local $l7694 i32) + (local $l7695 i32) + (local $l7696 i32) + (local $l7697 i32) + (local $l7698 i32) + (local $l7699 i32) + (local $l7700 i32) + (local $l7701 i32) + (local $l7702 i32) + (local $l7703 i32) + (local $l7704 i32) + (local $l7705 i32) + (local $l7706 i32) + (local $l7707 i32) + (local $l7708 i32) + (local $l7709 i32) + (local $l7710 i32) + (local $l7711 i32) + (local $l7712 i32) + (local $l7713 i32) + (local $l7714 i32) + (local $l7715 i32) + (local $l7716 i32) + (local $l7717 i32) + (local $l7718 i32) + (local $l7719 i32) + (local $l7720 i32) + (local $l7721 i32) + (local $l7722 i32) + (local $l7723 i32) + (local $l7724 i32) + (local $l7725 i32) + (local $l7726 i32) + (local $l7727 i32) + (local $l7728 i32) + (local $l7729 i32) + (local $l7730 i32) + (local $l7731 i32) + (local $l7732 i32) + (local $l7733 i32) + (local $l7734 i32) + (local $l7735 i32) + (local $l7736 i32) + (local $l7737 i32) + (local $l7738 i32) + (local $l7739 i32) + (local $l7740 i32) + (local $l7741 i32) + (local $l7742 i32) + (local $l7743 i32) + (local $l7744 i32) + (local $l7745 i32) + (local $l7746 i32) + (local $l7747 i32) + (local $l7748 i32) + (local $l7749 i32) + (local $l7750 i32) + (local $l7751 i32) + (local $l7752 i32) + (local $l7753 i32) + (local $l7754 i32) + (local $l7755 i32) + (local $l7756 i32) + (local $l7757 i32) + (local $l7758 i32) + (local $l7759 i32) + (local $l7760 i32) + (local $l7761 i32) + (local $l7762 i32) + (local $l7763 i32) + (local $l7764 i32) + (local $l7765 i32) + (local $l7766 i32) + (local $l7767 i32) + (local $l7768 i32) + (local $l7769 i32) + (local $l7770 i32) + (local $l7771 i32) + (local $l7772 i32) + (local $l7773 i32) + (local $l7774 i32) + (local $l7775 i32) + (local $l7776 i32) + (local $l7777 i32) + (local $l7778 i32) + (local $l7779 i32) + (local $l7780 i32) + (local $l7781 i32) + (local $l7782 i32) + (local $l7783 i32) + (local $l7784 i32) + (local $l7785 i32) + (local $l7786 i32) + (local $l7787 i32) + (local $l7788 i32) + (local $l7789 i32) + (local $l7790 i32) + (local $l7791 i32) + (local $l7792 i32) + (local $l7793 i32) + (local $l7794 i32) + (local $l7795 i32) + (local $l7796 i32) + (local $l7797 i32) + (local $l7798 i32) + (local $l7799 i32) + (local $l7800 i32) + (local $l7801 i32) + (local $l7802 i32) + (local $l7803 i32) + (local $l7804 i32) + (local $l7805 i32) + (local $l7806 i32) + (local $l7807 i32) + (local $l7808 i32) + (local $l7809 i32) + (local $l7810 i32) + (local $l7811 i32) + (local $l7812 i32) + (local $l7813 i32) + (local $l7814 i32) + (local $l7815 i32) + (local $l7816 i32) + (local $l7817 i32) + (local $l7818 i32) + (local $l7819 i32) + (local $l7820 i32) + (local $l7821 i32) + (local $l7822 i32) + (local $l7823 i32) + (local $l7824 i32) + (local $l7825 i32) + (local $l7826 i32) + (local $l7827 i32) + (local $l7828 i32) + (local $l7829 i32) + (local $l7830 i32) + (local $l7831 i32) + (local $l7832 i32) + (local $l7833 i32) + (local $l7834 i32) + (local $l7835 i32) + (local $l7836 i32) + (local $l7837 i32) + (local $l7838 i32) + (local $l7839 i32) + (local $l7840 i32) + (local $l7841 i32) + (local $l7842 i32) + (local $l7843 i32) + (local $l7844 i32) + (local $l7845 i32) + (local $l7846 i32) + (local $l7847 i32) + (local $l7848 i32) + (local $l7849 i32) + (local $l7850 i32) + (local $l7851 i32) + (local $l7852 i32) + (local $l7853 i32) + (local $l7854 i32) + (local $l7855 i32) + (local $l7856 i32) + (local $l7857 i32) + (local $l7858 i32) + (local $l7859 i32) + (local $l7860 i32) + (local $l7861 i32) + (local $l7862 i32) + (local $l7863 i32) + (local $l7864 i32) + (local $l7865 i32) + (local $l7866 i32) + (local $l7867 i32) + (local $l7868 i32) + (local $l7869 i32) + (local $l7870 i32) + (local $l7871 i32) + (local $l7872 i32) + (local $l7873 i32) + (local $l7874 i32) + (local $l7875 i32) + (local $l7876 i32) + (local $l7877 i32) + (local $l7878 i32) + (local $l7879 i32) + (local $l7880 i32) + (local $l7881 i32) + (local $l7882 i32) + (local $l7883 i32) + (local $l7884 i32) + (local $l7885 i32) + (local $l7886 i32) + (local $l7887 i32) + (local $l7888 i32) + (local $l7889 i32) + (local $l7890 i32) + (local $l7891 i32) + (local $l7892 i32) + (local $l7893 i32) + (local $l7894 i32) + (local $l7895 i32) + (local $l7896 i32) + (local $l7897 i32) + (local $l7898 i32) + (local $l7899 i32) + (local $l7900 i32) + (local $l7901 i32) + (local $l7902 i32) + (local $l7903 i32) + (local $l7904 i32) + (local $l7905 i32) + (local $l7906 i32) + (local $l7907 i32) + (local $l7908 i32) + (local $l7909 i32) + (local $l7910 i32) + (local $l7911 i32) + (local $l7912 i32) + (local $l7913 i32) + (local $l7914 i32) + (local $l7915 i32) + (local $l7916 i32) + (local $l7917 i32) + (local $l7918 i32) + (local $l7919 i32) + (local $l7920 i32) + (local $l7921 i32) + (local $l7922 i32) + (local $l7923 i32) + (local $l7924 i32) + (local $l7925 i32) + (local $l7926 i32) + (local $l7927 i32) + (local $l7928 i32) + (local $l7929 i32) + (local $l7930 i32) + (local $l7931 i32) + (local $l7932 i32) + (local $l7933 i32) + (local $l7934 i32) + (local $l7935 i32) + (local $l7936 i32) + (local $l7937 i32) + (local $l7938 i32) + (local $l7939 i32) + (local $l7940 i32) + (local $l7941 i32) + (local $l7942 i32) + (local $l7943 i32) + (local $l7944 i32) + (local $l7945 i32) + (local $l7946 i32) + (local $l7947 i32) + (local $l7948 i32) + (local $l7949 i32) + (local $l7950 i32) + (local $l7951 i32) + (local $l7952 i32) + (local $l7953 i32) + (local $l7954 i32) + (local $l7955 i32) + (local $l7956 i32) + (local $l7957 i32) + (local $l7958 i32) + (local $l7959 i32) + (local $l7960 i32) + (local $l7961 i32) + (local $l7962 i32) + (local $l7963 i32) + (local $l7964 i32) + (local $l7965 i32) + (local $l7966 i32) + (local $l7967 i32) + (local $l7968 i32) + (local $l7969 i32) + (local $l7970 i32) + (local $l7971 i32) + (local $l7972 i32) + (local $l7973 i32) + (local $l7974 i32) + (local $l7975 i32) + (local $l7976 i32) + (local $l7977 i32) + (local $l7978 i32) + (local $l7979 i32) + (local $l7980 i32) + (local $l7981 i32) + (local $l7982 i32) + (local $l7983 i32) + (local $l7984 i32) + (local $l7985 i32) + (local $l7986 i32) + (local $l7987 i32) + (local $l7988 i32) + (local $l7989 i32) + (local $l7990 i32) + (local $l7991 i32) + (local $l7992 i32) + (local $l7993 i32) + (local $l7994 i32) + (local $l7995 i32) + (local $l7996 i32) + (local $l7997 i32) + (local $l7998 i32) + (local $l7999 i32) + (local $l8000 i32) + (local $l8001 i32) + (local $l8002 i32) + (local $l8003 i32) + (local $l8004 i32) + (local $l8005 i32) + (local $l8006 i32) + (local $l8007 i32) + (local $l8008 i32) + (local $l8009 i32) + (local $l8010 i32) + (local $l8011 i32) + (local $l8012 i32) + (local $l8013 i32) + (local $l8014 i32) + (local $l8015 i32) + (local $l8016 i32) + (local $l8017 i32) + (local $l8018 i32) + (local $l8019 i32) + (local $l8020 i32) + (local $l8021 i32) + (local $l8022 i32) + (local $l8023 i32) + (local $l8024 i32) + (local $l8025 i32) + (local $l8026 i32) + (local $l8027 i32) + (local $l8028 i32) + (local $l8029 i32) + (local $l8030 i32) + (local $l8031 i32) + (local $l8032 i32) + (local $l8033 i32) + (local $l8034 i32) + (local $l8035 i32) + (local $l8036 i32) + (local $l8037 i32) + (local $l8038 i32) + (local $l8039 i32) + (local $l8040 i32) + (local $l8041 i32) + (local $l8042 i32) + (local $l8043 i32) + (local $l8044 i32) + (local $l8045 i32) + (local $l8046 i32) + (local $l8047 i32) + (local $l8048 i32) + (local $l8049 i32) + (local $l8050 i32) + (local $l8051 i32) + (local $l8052 i32) + (local $l8053 i32) + (local $l8054 i32) + (local $l8055 i32) + (local $l8056 i32) + (local $l8057 i32) + (local $l8058 i32) + (local $l8059 i32) + (local $l8060 i32) + (local $l8061 i32) + (local $l8062 i32) + (local $l8063 i32) + (local $l8064 i32) + (local $l8065 i32) + (local $l8066 i32) + (local $l8067 i32) + (local $l8068 i32) + (local $l8069 i32) + (local $l8070 i32) + (local $l8071 i32) + (local $l8072 i32) + (local $l8073 i32) + (local $l8074 i32) + (local $l8075 i32) + (local $l8076 i32) + (local $l8077 i32) + (local $l8078 i32) + (local $l8079 i32) + (local $l8080 i32) + (local $l8081 i32) + (local $l8082 i32) + (local $l8083 i32) + (local $l8084 i32) + (local $l8085 i32) + (local $l8086 i32) + (local $l8087 i32) + (local $l8088 i32) + (local $l8089 i32) + (local $l8090 i32) + (local $l8091 i32) + (local $l8092 i32) + (local $l8093 i32) + (local $l8094 i32) + (local $l8095 i32) + (local $l8096 i32) + (local $l8097 i32) + (local $l8098 i32) + (local $l8099 i32) + (local $l8100 i32) + (local $l8101 i32) + (local $l8102 i32) + (local $l8103 i32) + (local $l8104 i32) + (local $l8105 i32) + (local $l8106 i32) + (local $l8107 i32) + (local $l8108 i32) + (local $l8109 i32) + (local $l8110 i32) + (local $l8111 i32) + (local $l8112 i32) + (local $l8113 i32) + (local $l8114 i32) + (local $l8115 i32) + (local $l8116 i32) + (local $l8117 i32) + (local $l8118 i32) + (local $l8119 i32) + (local $l8120 i32) + (local $l8121 i32) + (local $l8122 i32) + (local $l8123 i32) + (local $l8124 i32) + (local $l8125 i32) + (local $l8126 i32) + (local $l8127 i32) + (local $l8128 i32) + (local $l8129 i32) + (local $l8130 i32) + (local $l8131 i32) + (local $l8132 i32) + (local $l8133 i32) + (local $l8134 i32) + (local $l8135 i32) + (local $l8136 i32) + (local $l8137 i32) + (local $l8138 i32) + (local $l8139 i32) + (local $l8140 i32) + (local $l8141 i32) + (local $l8142 i32) + (local $l8143 i32) + (local $l8144 i32) + (local $l8145 i32) + (local $l8146 i32) + (local $l8147 i32) + (local $l8148 i32) + (local $l8149 i32) + (local $l8150 i32) + (local $l8151 i32) + (local $l8152 i32) + (local $l8153 i32) + (local $l8154 i32) + (local $l8155 i32) + (local $l8156 i32) + (local $l8157 i32) + (local $l8158 i32) + (local $l8159 i32) + (local $l8160 i32) + (local $l8161 i32) + (local $l8162 i32) + (local $l8163 i32) + (local $l8164 i32) + (local $l8165 i32) + (local $l8166 i32) + (local $l8167 i32) + (local $l8168 i32) + (local $l8169 i32) + (local $l8170 i32) + (local $l8171 i32) + (local $l8172 i32) + (local $l8173 i32) + (local $l8174 i32) + (local $l8175 i32) + (local $l8176 i32) + (local $l8177 i32) + (local $l8178 i32) + (local $l8179 i32) + (local $l8180 i32) + (local $l8181 i32) + (local $l8182 i32) + (local $l8183 i32) + (local $l8184 i32) + (local $l8185 i32) + (local $l8186 i32) + (local $l8187 i32) + (local $l8188 i32) + (local $l8189 i32) + (local $l8190 i32) + (local $l8191 i32) + (local $l8192 i32) + (local $l8193 i32) + (local $l8194 i32) + (local $l8195 i32) + (local $l8196 i32) + (local $l8197 i32) + (local $l8198 i32) + (local $l8199 i32) + (local $l8200 i32) + (local $l8201 i32) + (local $l8202 i32) + (local $l8203 i32) + (local $l8204 i32) + (local $l8205 i32) + (local $l8206 i32) + (local $l8207 i32) + (local $l8208 i32) + (local $l8209 i32) + (local $l8210 i32) + (local $l8211 i32) + (local $l8212 i32) + (local $l8213 i32) + (local $l8214 i32) + (local $l8215 i32) + (local $l8216 i32) + (local $l8217 i32) + (local $l8218 i32) + (local $l8219 i32) + (local $l8220 i32) + (local $l8221 i32) + (local $l8222 i32) + (local $l8223 i32) + (local $l8224 i32) + (local $l8225 i32) + (local $l8226 i32) + (local $l8227 i32) + (local $l8228 i32) + (local $l8229 i32) + (local $l8230 i32) + (local $l8231 i32) + (local $l8232 i32) + (local $l8233 i32) + (local $l8234 i32) + (local $l8235 i32) + (local $l8236 i32) + (local $l8237 i32) + (local $l8238 i32) + (local $l8239 i32) + (local $l8240 i32) + (local $l8241 i32) + (local $l8242 i32) + (local $l8243 i32) + (local $l8244 i32) + (local $l8245 i32) + (local $l8246 i32) + (local $l8247 i32) + (local $l8248 i32) + (local $l8249 i32) + (local $l8250 i32) + (local $l8251 i32) + (local $l8252 i32) + (local $l8253 i32) + (local $l8254 i32) + (local $l8255 i32) + (local $l8256 i32) + (local $l8257 i32) + (local $l8258 i32) + (local $l8259 i32) + (local $l8260 i32) + (local $l8261 i32) + (local $l8262 i32) + (local $l8263 i32) + (local $l8264 i32) + (local $l8265 i32) + (local $l8266 i32) + (local $l8267 i32) + (local $l8268 i32) + (local $l8269 i32) + (local $l8270 i32) + (local $l8271 i32) + (local $l8272 i32) + (local $l8273 i32) + (local $l8274 i32) + (local $l8275 i32) + (local $l8276 i32) + (local $l8277 i32) + (local $l8278 i32) + (local $l8279 i32) + (local $l8280 i32) + (local $l8281 i32) + (local $l8282 i32) + (local $l8283 i32) + (local $l8284 i32) + (local $l8285 i32) + (local $l8286 i32) + (local $l8287 i32) + (local $l8288 i32) + (local $l8289 i32) + (local $l8290 i32) + (local $l8291 i32) + (local $l8292 i32) + (local $l8293 i32) + (local $l8294 i32) + (local $l8295 i32) + (local $l8296 i32) + (local $l8297 i32) + (local $l8298 i32) + (local $l8299 i32) + (local $l8300 i32) + (local $l8301 i32) + (local $l8302 i32) + (local $l8303 i32) + (local $l8304 i32) + (local $l8305 i32) + (local $l8306 i32) + (local $l8307 i32) + (local $l8308 i32) + (local $l8309 i32) + (local $l8310 i32) + (local $l8311 i32) + (local $l8312 i32) + (local $l8313 i32) + (local $l8314 i32) + (local $l8315 i32) + (local $l8316 i32) + (local $l8317 i32) + (local $l8318 i32) + (local $l8319 i32) + (local $l8320 i32) + (local $l8321 i32) + (local $l8322 i32) + (local $l8323 i32) + (local $l8324 i32) + (local $l8325 i32) + (local $l8326 i32) + (local $l8327 i32) + (local $l8328 i32) + (local $l8329 i32) + (local $l8330 i32) + (local $l8331 i32) + (local $l8332 i32) + (local $l8333 i32) + (local $l8334 i32) + (local $l8335 i32) + (local $l8336 i32) + (local $l8337 i32) + (local $l8338 i32) + (local $l8339 i32) + (local $l8340 i32) + (local $l8341 i32) + (local $l8342 i32) + (local $l8343 i32) + (local $l8344 i32) + (local $l8345 i32) + (local $l8346 i32) + (local $l8347 i32) + (local $l8348 i32) + (local $l8349 i32) + (local $l8350 i32) + (local $l8351 i32) + (local $l8352 i32) + (local $l8353 i32) + (local $l8354 i32) + (local $l8355 i32) + (local $l8356 i32) + (local $l8357 i32) + (local $l8358 i32) + (local $l8359 i32) + (local $l8360 i32) + (local $l8361 i32) + (local $l8362 i32) + (local $l8363 i32) + (local $l8364 i32) + (local $l8365 i32) + (local $l8366 i32) + (local $l8367 i32) + (local $l8368 i32) + (local $l8369 i32) + (local $l8370 i32) + (local $l8371 i32) + (local $l8372 i32) + (local $l8373 i32) + (local $l8374 i32) + (local $l8375 i32) + (local $l8376 i32) + (local $l8377 i32) + (local $l8378 i32) + (local $l8379 i32) + (local $l8380 i32) + (local $l8381 i32) + (local $l8382 i32) + (local $l8383 i32) + (local $l8384 i32) + (local $l8385 i32) + (local $l8386 i32) + (local $l8387 i32) + (local $l8388 i32) + (local $l8389 i32) + (local $l8390 i32) + (local $l8391 i32) + (local $l8392 i32) + (local $l8393 i32) + (local $l8394 i32) + (local $l8395 i32) + (local $l8396 i32) + (local $l8397 i32) + (local $l8398 i32) + (local $l8399 i32) + (local $l8400 i32) + (local $l8401 i32) + (local $l8402 i32) + (local $l8403 i32) + (local $l8404 i32) + (local $l8405 i32) + (local $l8406 i32) + (local $l8407 i32) + (local $l8408 i32) + (local $l8409 i32) + (local $l8410 i32) + (local $l8411 i32) + (local $l8412 i32) + (local $l8413 i32) + (local $l8414 i32) + (local $l8415 i32) + (local $l8416 i32) + (local $l8417 i32) + (local $l8418 i32) + (local $l8419 i32) + (local $l8420 i32) + (local $l8421 i32) + (local $l8422 i32) + (local $l8423 i32) + (local $l8424 i32) + (local $l8425 i32) + (local $l8426 i32) + (local $l8427 i32) + (local $l8428 i32) + (local $l8429 i32) + (local $l8430 i32) + (local $l8431 i32) + (local $l8432 i32) + (local $l8433 i32) + (local $l8434 i32) + (local $l8435 i32) + (local $l8436 i32) + (local $l8437 i32) + (local $l8438 i32) + (local $l8439 i32) + (local $l8440 i32) + (local $l8441 i32) + (local $l8442 i32) + (local $l8443 i32) + (local $l8444 i32) + (local $l8445 i32) + (local $l8446 i32) + (local $l8447 i32) + (local $l8448 i32) + (local $l8449 i32) + (local $l8450 i32) + (local $l8451 i32) + (local $l8452 i32) + (local $l8453 i32) + (local $l8454 i32) + (local $l8455 i32) + (local $l8456 i32) + (local $l8457 i32) + (local $l8458 i32) + (local $l8459 i32) + (local $l8460 i32) + (local $l8461 i32) + (local $l8462 i32) + (local $l8463 i32) + (local $l8464 i32) + (local $l8465 i32) + (local $l8466 i32) + (local $l8467 i32) + (local $l8468 i32) + (local $l8469 i32) + (local $l8470 i32) + (local $l8471 i32) + (local $l8472 i32) + (local $l8473 i32) + (local $l8474 i32) + (local $l8475 i32) + (local $l8476 i32) + (local $l8477 i32) + (local $l8478 i32) + (local $l8479 i32) + (local $l8480 i32) + (local $l8481 i32) + (local $l8482 i32) + (local $l8483 i32) + (local $l8484 i32) + (local $l8485 i32) + (local $l8486 i32) + (local $l8487 i32) + (local $l8488 i32) + (local $l8489 i32) + (local $l8490 i32) + (local $l8491 i32) + (local $l8492 i32) + (local $l8493 i32) + (local $l8494 i32) + (local $l8495 i32) + (local $l8496 i32) + (local $l8497 i32) + (local $l8498 i32) + (local $l8499 i32) + (local $l8500 i32) + (local $l8501 i32) + (local $l8502 i32) + (local $l8503 i32) + (local $l8504 i32) + (local $l8505 i32) + (local $l8506 i32) + (local $l8507 i32) + (local $l8508 i32) + (local $l8509 i32) + (local $l8510 i32) + (local $l8511 i32) + (local $l8512 i32) + (local $l8513 i32) + (local $l8514 i32) + (local $l8515 i32) + (local $l8516 i32) + (local $l8517 i32) + (local $l8518 i32) + (local $l8519 i32) + (local $l8520 i32) + (local $l8521 i32) + (local $l8522 i32) + (local $l8523 i32) + (local $l8524 i32) + (local $l8525 i32) + (local $l8526 i32) + (local $l8527 i32) + (local $l8528 i32) + (local $l8529 i32) + (local $l8530 i32) + (local $l8531 i32) + (local $l8532 i32) + (local $l8533 i32) + (local $l8534 i32) + (local $l8535 i32) + (local $l8536 i32) + (local $l8537 i32) + (local $l8538 i32) + (local $l8539 i32) + (local $l8540 i32) + (local $l8541 i32) + (local $l8542 i32) + (local $l8543 i32) + (local $l8544 i32) + (local $l8545 i32) + (local $l8546 i32) + (local $l8547 i32) + (local $l8548 i32) + (local $l8549 i32) + (local $l8550 i32) + (local $l8551 i32) + (local $l8552 i32) + (local $l8553 i32) + (local $l8554 i32) + (local $l8555 i32) + (local $l8556 i32) + (local $l8557 i32) + (local $l8558 i32) + (local $l8559 i32) + (local $l8560 i32) + (local $l8561 i32) + (local $l8562 i32) + (local $l8563 i32) + (local $l8564 i32) + (local $l8565 i32) + (local $l8566 i32) + (local $l8567 i32) + (local $l8568 i32) + (local $l8569 i32) + (local $l8570 i32) + (local $l8571 i32) + (local $l8572 i32) + (local $l8573 i32) + (local $l8574 i32) + (local $l8575 i32) + (local $l8576 i32) + (local $l8577 i32) + (local $l8578 i32) + (local $l8579 i32) + (local $l8580 i32) + (local $l8581 i32) + (local $l8582 i32) + (local $l8583 i32) + (local $l8584 i32) + (local $l8585 i32) + (local $l8586 i32) + (local $l8587 i32) + (local $l8588 i32) + (local $l8589 i32) + (local $l8590 i32) + (local $l8591 i32) + (local $l8592 i32) + (local $l8593 i32) + (local $l8594 i32) + (local $l8595 i32) + (local $l8596 i32) + (local $l8597 i32) + (local $l8598 i32) + (local $l8599 i32) + (local $l8600 i32) + (local $l8601 i32) + (local $l8602 i32) + (local $l8603 i32) + (local $l8604 i32) + (local $l8605 i32) + (local $l8606 i32) + (local $l8607 i32) + (local $l8608 i32) + (local $l8609 i32) + (local $l8610 i32) + (local $l8611 i32) + (local $l8612 i32) + (local $l8613 i32) + (local $l8614 i32) + (local $l8615 i32) + (local $l8616 i32) + (local $l8617 i32) + (local $l8618 i32) + (local $l8619 i32) + (local $l8620 i32) + (local $l8621 i32) + (local $l8622 i32) + (local $l8623 i32) + (local $l8624 i32) + (local $l8625 i32) + (local $l8626 i32) + (local $l8627 i32) + (local $l8628 i32) + (local $l8629 i32) + (local $l8630 i32) + (local $l8631 i32) + (local $l8632 i32) + (local $l8633 i32) + (local $l8634 i32) + (local $l8635 i32) + (local $l8636 i32) + (local $l8637 i32) + (local $l8638 i32) + (local $l8639 i32) + (local $l8640 i32) + (local $l8641 i32) + (local $l8642 i32) + (local $l8643 i32) + (local $l8644 i32) + (local $l8645 i32) + (local $l8646 i32) + (local $l8647 i32) + (local $l8648 i32) + (local $l8649 i32) + (local $l8650 i32) + (local $l8651 i32) + (local $l8652 i32) + (local $l8653 i32) + (local $l8654 i32) + (local $l8655 i32) + (local $l8656 i32) + (local $l8657 i32) + (local $l8658 i32) + (local $l8659 i32) + (local $l8660 i32) + (local $l8661 i32) + (local $l8662 i32) + (local $l8663 i32) + (local $l8664 i32) + (local $l8665 i32) + (local $l8666 i32) + (local $l8667 i32) + (local $l8668 i32) + (local $l8669 i32) + (local $l8670 i32) + (local $l8671 i32) + (local $l8672 i32) + (local $l8673 i32) + (local $l8674 i32) + (local $l8675 i32) + (local $l8676 i32) + (local $l8677 i32) + (local $l8678 i32) + (local $l8679 i32) + (local $l8680 i32) + (local $l8681 i32) + (local $l8682 i32) + (local $l8683 i32) + (local $l8684 i32) + (local $l8685 i32) + (local $l8686 i32) + (local $l8687 i32) + (local $l8688 i32) + (local $l8689 i32) + (local $l8690 i32) + (local $l8691 i32) + (local $l8692 i32) + (local $l8693 i32) + (local $l8694 i32) + (local $l8695 i32) + (local $l8696 i32) + (local $l8697 i32) + (local $l8698 i32) + (local $l8699 i32) + (local $l8700 i32) + (local $l8701 i32) + (local $l8702 i32) + (local $l8703 i32) + (local $l8704 i32) + (local $l8705 i32) + (local $l8706 i32) + (local $l8707 i32) + (local $l8708 i32) + (local $l8709 i32) + (local $l8710 i32) + (local $l8711 i32) + (local $l8712 i32) + (local $l8713 i32) + (local $l8714 i32) + (local $l8715 i32) + (local $l8716 i32) + (local $l8717 i32) + (local $l8718 i32) + (local $l8719 i32) + (local $l8720 i32) + (local $l8721 i32) + (local $l8722 i32) + (local $l8723 i32) + (local $l8724 i32) + (local $l8725 i32) + (local $l8726 i32) + (local $l8727 i32) + (local $l8728 i32) + (local $l8729 i32) + (local $l8730 i32) + (local $l8731 i32) + (local $l8732 i32) + (local $l8733 i32) + (local $l8734 i32) + (local $l8735 i32) + (local $l8736 i32) + (local $l8737 i32) + (local $l8738 i32) + (local $l8739 i32) + (local $l8740 i32) + (local $l8741 i32) + (local $l8742 i32) + (local $l8743 i32) + (local $l8744 i32) + (local $l8745 i32) + (local $l8746 i32) + (local $l8747 i32) + (local $l8748 i32) + (local $l8749 i32) + (local $l8750 i32) + (local $l8751 i32) + (local $l8752 i32) + (local $l8753 i32) + (local $l8754 i32) + (local $l8755 i32) + (local $l8756 i32) + (local $l8757 i32) + (local $l8758 i32) + (local $l8759 i32) + (local $l8760 i32) + (local $l8761 i32) + (local $l8762 i32) + (local $l8763 i32) + (local $l8764 i32) + (local $l8765 i32) + (local $l8766 i32) + (local $l8767 i32) + (local $l8768 i32) + (local $l8769 i32) + (local $l8770 i32) + (local $l8771 i32) + (local $l8772 i32) + (local $l8773 i32) + (local $l8774 i32) + (local $l8775 i32) + (local $l8776 i32) + (local $l8777 i32) + (local $l8778 i32) + (local $l8779 i32) + (local $l8780 i32) + (local $l8781 i32) + (local $l8782 i32) + (local $l8783 i32) + (local $l8784 i32) + (local $l8785 i32) + (local $l8786 i32) + (local $l8787 i32) + (local $l8788 i32) + (local $l8789 i32) + (local $l8790 i32) + (local $l8791 i32) + (local $l8792 i32) + (local $l8793 i32) + (local $l8794 i32) + (local $l8795 i32) + (local $l8796 i32) + (local $l8797 i32) + (local $l8798 i32) + (local $l8799 i32) + (local $l8800 i32) + (local $l8801 i32) + (local $l8802 i32) + (local $l8803 i32) + (local $l8804 i32) + (local $l8805 i32) + (local $l8806 i32) + (local $l8807 i32) + (local $l8808 i32) + (local $l8809 i32) + (local $l8810 i32) + (local $l8811 i32) + (local $l8812 i32) + (local $l8813 i32) + (local $l8814 i32) + (local $l8815 i32) + (local $l8816 i32) + (local $l8817 i32) + (local $l8818 i32) + (local $l8819 i32) + (local $l8820 i32) + (local $l8821 i32) + (local $l8822 i32) + (local $l8823 i32) + (local $l8824 i32) + (local $l8825 i32) + (local $l8826 i32) + (local $l8827 i32) + (local $l8828 i32) + (local $l8829 i32) + (local $l8830 i32) + (local $l8831 i32) + (local $l8832 i32) + (local $l8833 i32) + (local $l8834 i32) + (local $l8835 i32) + (local $l8836 i32) + (local $l8837 i32) + (local $l8838 i32) + (local $l8839 i32) + (local $l8840 i32) + (local $l8841 i32) + (local $l8842 i32) + (local $l8843 i32) + (local $l8844 i32) + (local $l8845 i32) + (local $l8846 i32) + (local $l8847 i32) + (local $l8848 i32) + (local $l8849 i32) + (local $l8850 i32) + (local $l8851 i32) + (local $l8852 i32) + (local $l8853 i32) + (local $l8854 i32) + (local $l8855 i32) + (local $l8856 i32) + (local $l8857 i32) + (local $l8858 i32) + (local $l8859 i32) + (local $l8860 i32) + (local $l8861 i32) + (local $l8862 i32) + (local $l8863 i32) + (local $l8864 i32) + (local $l8865 i32) + (local $l8866 i32) + (local $l8867 i32) + (local $l8868 i32) + (local $l8869 i32) + (local $l8870 i32) + (local $l8871 i32) + (local $l8872 i32) + (local $l8873 i32) + (local $l8874 i32) + (local $l8875 i32) + (local $l8876 i32) + (local $l8877 i32) + (local $l8878 i32) + (local $l8879 i32) + (local $l8880 i32) + (local $l8881 i32) + (local $l8882 i32) + (local $l8883 i32) + (local $l8884 i32) + (local $l8885 i32) + (local $l8886 i32) + (local $l8887 i32) + (local $l8888 i32) + (local $l8889 i32) + (local $l8890 i32) + (local $l8891 i32) + (local $l8892 i32) + (local $l8893 i32) + (local $l8894 i32) + (local $l8895 i32) + (local $l8896 i32) + (local $l8897 i32) + (local $l8898 i32) + (local $l8899 i32) + (local $l8900 i32) + (local $l8901 i32) + (local $l8902 i32) + (local $l8903 i32) + (local $l8904 i32) + (local $l8905 i32) + (local $l8906 i32) + (local $l8907 i32) + (local $l8908 i32) + (local $l8909 i32) + (local $l8910 i32) + (local $l8911 i32) + (local $l8912 i32) + (local $l8913 i32) + (local $l8914 i32) + (local $l8915 i32) + (local $l8916 i32) + (local $l8917 i32) + (local $l8918 i32) + (local $l8919 i32) + (local $l8920 i32) + (local $l8921 i32) + (local $l8922 i32) + (local $l8923 i32) + (local $l8924 i32) + (local $l8925 i32) + (local $l8926 i32) + (local $l8927 i32) + (local $l8928 i32) + (local $l8929 i32) + (local $l8930 i32) + (local $l8931 i32) + (local $l8932 i32) + (local $l8933 i32) + (local $l8934 i32) + (local $l8935 i32) + (local $l8936 i32) + (local $l8937 i32) + (local $l8938 i32) + (local $l8939 i32) + (local $l8940 i32) + (local $l8941 i32) + (local $l8942 i32) + (local $l8943 i32) + (local $l8944 i32) + (local $l8945 i32) + (local $l8946 i32) + (local $l8947 i32) + (local $l8948 i32) + (local $l8949 i32) + (local $l8950 i32) + (local $l8951 i32) + (local $l8952 i32) + (local $l8953 i32) + (local $l8954 i32) + (local $l8955 i32) + (local $l8956 i32) + (local $l8957 i32) + (local $l8958 i32) + (local $l8959 i32) + (local $l8960 i32) + (local $l8961 i32) + (local $l8962 i32) + (local $l8963 i32) + (local $l8964 i32) + (local $l8965 i32) + (local $l8966 i32) + (local $l8967 i32) + (local $l8968 i32) + (local $l8969 i32) + (local $l8970 i32) + (local $l8971 i32) + (local $l8972 i32) + (local $l8973 i32) + (local $l8974 i32) + (local $l8975 i32) + (local $l8976 i32) + (local $l8977 i32) + (local $l8978 i32) + (local $l8979 i32) + (local $l8980 i32) + (local $l8981 i32) + (local $l8982 i32) + (local $l8983 i32) + (local $l8984 i32) + (local $l8985 i32) + (local $l8986 i32) + (local $l8987 i32) + (local $l8988 i32) + (local $l8989 i32) + (local $l8990 i32) + (local $l8991 i32) + (local $l8992 i32) + (local $l8993 i32) + (local $l8994 i32) + (local $l8995 i32) + (local $l8996 i32) + (local $l8997 i32) + (local $l8998 i32) + (local $l8999 i32) + (local $l9000 i32) + (local $l9001 i32) + (local $l9002 i32) + (local $l9003 i32) + (local $l9004 i32) + (local $l9005 i32) + (local $l9006 i32) + (local $l9007 i32) + (local $l9008 i32) + (local $l9009 i32) + (local $l9010 i32) + (local $l9011 i32) + (local $l9012 i32) + (local $l9013 i32) + (local $l9014 i32) + (local $l9015 i32) + (local $l9016 i32) + (local $l9017 i32) + (local $l9018 i32) + (local $l9019 i32) + (local $l9020 i32) + (local $l9021 i32) + (local $l9022 i32) + (local $l9023 i32) + (local $l9024 i32) + (local $l9025 i32) + (local $l9026 i32) + (local $l9027 i32) + (local $l9028 i32) + (local $l9029 i32) + (local $l9030 i32) + (local $l9031 i32) + (local $l9032 i32) + (local $l9033 i32) + (local $l9034 i32) + (local $l9035 i32) + (local $l9036 i32) + (local $l9037 i32) + (local $l9038 i32) + (local $l9039 i32) + (local $l9040 i32) + (local $l9041 i32) + (local $l9042 i32) + (local $l9043 i32) + (local $l9044 i32) + (local $l9045 i32) + (local $l9046 i32) + (local $l9047 i32) + (local $l9048 i32) + (local $l9049 i32) + (local $l9050 i32) + (local $l9051 i32) + (local $l9052 i32) + (local $l9053 i32) + (local $l9054 i32) + (local $l9055 i32) + (local $l9056 i32) + (local $l9057 i32) + (local $l9058 i32) + (local $l9059 i32) + (local $l9060 i32) + (local $l9061 i32) + (local $l9062 i32) + (local $l9063 i32) + (local $l9064 i32) + (local $l9065 i32) + (local $l9066 i32) + (local $l9067 i32) + (local $l9068 i32) + (local $l9069 i32) + (local $l9070 i32) + (local $l9071 i32) + (local $l9072 i32) + (local $l9073 i32) + (local $l9074 i32) + (local $l9075 i32) + (local $l9076 i32) + (local $l9077 i32) + (local $l9078 i32) + (local $l9079 i32) + (local $l9080 i32) + (local $l9081 i32) + (local $l9082 i32) + (local $l9083 i32) + (local $l9084 i32) + (local $l9085 i32) + (local $l9086 i32) + (local $l9087 i32) + (local $l9088 i32) + (local $l9089 i32) + (local $l9090 i32) + (local $l9091 i32) + (local $l9092 i32) + (local $l9093 i32) + (local $l9094 i32) + (local $l9095 i32) + (local $l9096 i32) + (local $l9097 i32) + (local $l9098 i32) + (local $l9099 i32) + (local $l9100 i32) + (local $l9101 i32) + (local $l9102 i32) + (local $l9103 i32) + (local $l9104 i32) + (local $l9105 i32) + (local $l9106 i32) + (local $l9107 i32) + (local $l9108 i32) + (local $l9109 i32) + (local $l9110 i32) + (local $l9111 i32) + (local $l9112 i32) + (local $l9113 i32) + (local $l9114 i32) + (local $l9115 i32) + (local $l9116 i32) + (local $l9117 i32) + (local $l9118 i32) + (local $l9119 i32) + (local $l9120 i32) + (local $l9121 i32) + (local $l9122 i32) + (local $l9123 i32) + (local $l9124 i32) + (local $l9125 i32) + (local $l9126 i32) + (local $l9127 i32) + (local $l9128 i32) + (local $l9129 i32) + (local $l9130 i32) + (local $l9131 i32) + (local $l9132 i32) + (local $l9133 i32) + (local $l9134 i32) + (local $l9135 i32) + (local $l9136 i32) + (local $l9137 i32) + (local $l9138 i32) + (local $l9139 i32) + (local $l9140 i32) + (local $l9141 i32) + (local $l9142 i32) + (local $l9143 i32) + (local $l9144 i32) + (local $l9145 i32) + (local $l9146 i32) + (local $l9147 i32) + (local $l9148 i32) + (local $l9149 i32) + (local $l9150 i32) + (local $l9151 i32) + (local $l9152 i32) + (local $l9153 i32) + (local $l9154 i32) + (local $l9155 i32) + (local $l9156 i32) + (local $l9157 i32) + (local $l9158 i32) + (local $l9159 i32) + (local $l9160 i32) + (local $l9161 i32) + (local $l9162 i32) + (local $l9163 i32) + (local $l9164 i32) + (local $l9165 i32) + (local $l9166 i32) + (local $l9167 i32) + (local $l9168 i32) + (local $l9169 i32) + (local $l9170 i32) + (local $l9171 i32) + (local $l9172 i32) + (local $l9173 i32) + (local $l9174 i32) + (local $l9175 i32) + (local $l9176 i32) + (local $l9177 i32) + (local $l9178 i32) + (local $l9179 i32) + (local $l9180 i32) + (local $l9181 i32) + (local $l9182 i32) + (local $l9183 i32) + (local $l9184 i32) + (local $l9185 i32) + (local $l9186 i32) + (local $l9187 i32) + (local $l9188 i32) + (local $l9189 i32) + (local $l9190 i32) + (local $l9191 i32) + (local $l9192 i32) + (local $l9193 i32) + (local $l9194 i32) + (local $l9195 i32) + (local $l9196 i32) + (local $l9197 i32) + (local $l9198 i32) + (local $l9199 i32) + (local $l9200 i32) + (local $l9201 i32) + (local $l9202 i32) + (local $l9203 i32) + (local $l9204 i32) + (local $l9205 i32) + (local $l9206 i32) + (local $l9207 i32) + (local $l9208 i32) + (local $l9209 i32) + (local $l9210 i32) + (local $l9211 i32) + (local $l9212 i32) + (local $l9213 i32) + (local $l9214 i32) + (local $l9215 i32) + (local $l9216 i32) + (local $l9217 i32) + (local $l9218 i32) + (local $l9219 i32) + (local $l9220 i32) + (local $l9221 i32) + (local $l9222 i32) + (local $l9223 i32) + (local $l9224 i32) + (local $l9225 i32) + (local $l9226 i32) + (local $l9227 i32) + (local $l9228 i32) + (local $l9229 i32) + (local $l9230 i32) + (local $l9231 i32) + (local $l9232 i32) + (local $l9233 i32) + (local $l9234 i32) + (local $l9235 i32) + (local $l9236 i32) + (local $l9237 i32) + (local $l9238 i32) + (local $l9239 i32) + (local $l9240 i32) + (local $l9241 i32) + (local $l9242 i32) + (local $l9243 i32) + (local $l9244 i32) + (local $l9245 i32) + (local $l9246 i32) + (local $l9247 i32) + (local $l9248 i32) + (local $l9249 i32) + (local $l9250 i32) + (local $l9251 i32) + (local $l9252 i32) + (local $l9253 i32) + (local $l9254 i32) + (local $l9255 i32) + (local $l9256 i32) + (local $l9257 i32) + (local $l9258 i32) + (local $l9259 i32) + (local $l9260 i32) + (local $l9261 i32) + (local $l9262 i32) + (local $l9263 i32) + (local $l9264 i32) + (local $l9265 i32) + (local $l9266 i32) + (local $l9267 i32) + (local $l9268 i32) + (local $l9269 i32) + (local $l9270 i32) + (local $l9271 i32) + (local $l9272 i32) + (local $l9273 i32) + (local $l9274 i32) + (local $l9275 i32) + (local $l9276 i32) + (local $l9277 i32) + (local $l9278 i32) + (local $l9279 i32) + (local $l9280 i32) + (local $l9281 i32) + (local $l9282 i32) + (local $l9283 i32) + (local $l9284 i32) + (local $l9285 i32) + (local $l9286 i32) + (local $l9287 i32) + (local $l9288 i32) + (local $l9289 i32) + (local $l9290 i32) + (local $l9291 i32) + (local $l9292 i32) + (local $l9293 i32) + (local $l9294 i32) + (local $l9295 i32) + (local $l9296 i32) + (local $l9297 i32) + (local $l9298 i32) + (local $l9299 i32) + (local $l9300 i32) + (local $l9301 i32) + (local $l9302 i32) + (local $l9303 i32) + (local $l9304 i32) + (local $l9305 i32) + (local $l9306 i32) + (local $l9307 i32) + (local $l9308 i32) + (local $l9309 i32) + (local $l9310 i32) + (local $l9311 i32) + (local $l9312 i32) + (local $l9313 i32) + (local $l9314 i32) + (local $l9315 i32) + (local $l9316 i32) + (local $l9317 i32) + (local $l9318 i32) + (local $l9319 i32) + (local $l9320 i32) + (local $l9321 i32) + (local $l9322 i32) + (local $l9323 i32) + (local $l9324 i32) + (local $l9325 i32) + (local $l9326 i32) + (local $l9327 i32) + (local $l9328 i32) + (local $l9329 i32) + (local $l9330 i32) + (local $l9331 i32) + (local $l9332 i32) + (local $l9333 i32) + (local $l9334 i32) + (local $l9335 i32) + (local $l9336 i32) + (local $l9337 i32) + (local $l9338 i32) + (local $l9339 i32) + (local $l9340 i32) + (local $l9341 i32) + (local $l9342 i32) + (local $l9343 i32) + (local $l9344 i32) + (local $l9345 i32) + (local $l9346 i32) + (local $l9347 i32) + (local $l9348 i32) + (local $l9349 i32) + (local $l9350 i32) + (local $l9351 i32) + (local $l9352 i32) + (local $l9353 i32) + (local $l9354 i32) + (local $l9355 i32) + (local $l9356 i32) + (local $l9357 i32) + (local $l9358 i32) + (local $l9359 i32) + (local $l9360 i32) + (local $l9361 i32) + (local $l9362 i32) + (local $l9363 i32) + (local $l9364 i32) + (local $l9365 i32) + (local $l9366 i32) + (local $l9367 i32) + (local $l9368 i32) + (local $l9369 i32) + (local $l9370 i32) + (local $l9371 i32) + (local $l9372 i32) + (local $l9373 i32) + (local $l9374 i32) + (local $l9375 i32) + (local $l9376 i32) + (local $l9377 i32) + (local $l9378 i32) + (local $l9379 i32) + (local $l9380 i32) + (local $l9381 i32) + (local $l9382 i32) + (local $l9383 i32) + (local $l9384 i32) + (local $l9385 i32) + (local $l9386 i32) + (local $l9387 i32) + (local $l9388 i32) + (local $l9389 i32) + (local $l9390 i32) + (local $l9391 i32) + (local $l9392 i32) + (local $l9393 i32) + (local $l9394 i32) + (local $l9395 i32) + (local $l9396 i32) + (local $l9397 i32) + (local $l9398 i32) + (local $l9399 i32) + (local $l9400 i32) + (local $l9401 i32) + (local $l9402 i32) + (local $l9403 i32) + (local $l9404 i32) + (local $l9405 i32) + (local $l9406 i32) + (local $l9407 i32) + (local $l9408 i32) + (local $l9409 i32) + (local $l9410 i32) + (local $l9411 i32) + (local $l9412 i32) + (local $l9413 i32) + (local $l9414 i32) + (local $l9415 i32) + (local $l9416 i32) + (local $l9417 i32) + (local $l9418 i32) + (local $l9419 i32) + (local $l9420 i32) + (local $l9421 i32) + (local $l9422 i32) + (local $l9423 i32) + (local $l9424 i32) + (local $l9425 i32) + (local $l9426 i32) + (local $l9427 i32) + (local $l9428 i32) + (local $l9429 i32) + (local $l9430 i32) + (local $l9431 i32) + (local $l9432 i32) + (local $l9433 i32) + (local $l9434 i32) + (local $l9435 i32) + (local $l9436 i32) + (local $l9437 i32) + (local $l9438 i32) + (local $l9439 i32) + (local $l9440 i32) + (local $l9441 i32) + (local $l9442 i32) + (local $l9443 i32) + (local $l9444 i32) + (local $l9445 i32) + (local $l9446 i32) + (local $l9447 i32) + (local $l9448 i32) + (local $l9449 i32) + (local $l9450 i32) + (local $l9451 i32) + (local $l9452 i32) + (local $l9453 i32) + (local $l9454 i32) + (local $l9455 i32) + (local $l9456 i32) + (local $l9457 i32) + (local $l9458 i32) + (local $l9459 i32) + (local $l9460 i32) + (local $l9461 i32) + (local $l9462 i32) + (local $l9463 i32) + (local $l9464 i32) + (local $l9465 i32) + (local $l9466 i32) + (local $l9467 i32) + (local $l9468 i32) + (local $l9469 i32) + (local $l9470 i32) + (local $l9471 i32) + (local $l9472 i32) + (local $l9473 i32) + (local $l9474 i32) + (local $l9475 i32) + (local $l9476 i32) + (local $l9477 i32) + (local $l9478 i32) + (local $l9479 i32) + (local $l9480 i32) + (local $l9481 i32) + (local $l9482 i32) + (local $l9483 i32) + (local $l9484 i32) + (local $l9485 i32) + (local $l9486 i32) + (local $l9487 i32) + (local $l9488 i32) + (local $l9489 i32) + (local $l9490 i32) + (local $l9491 i32) + (local $l9492 i32) + (local $l9493 i32) + (local $l9494 i32) + (local $l9495 i32) + (local $l9496 i32) + (local $l9497 i32) + (local $l9498 i32) + (local $l9499 i32) + (local $l9500 i32) + (local $l9501 i32) + (local $l9502 i32) + (local $l9503 i32) + (local $l9504 i32) + (local $l9505 i32) + (local $l9506 i32) + (local $l9507 i32) + (local $l9508 i32) + (local $l9509 i32) + (local $l9510 i32) + (local $l9511 i32) + (local $l9512 i32) + (local $l9513 i32) + (local $l9514 i32) + (local $l9515 i32) + (local $l9516 i32) + (local $l9517 i32) + (local $l9518 i32) + (local $l9519 i32) + (local $l9520 i32) + (local $l9521 i32) + (local $l9522 i32) + (local $l9523 i32) + (local $l9524 i32) + (local $l9525 i32) + (local $l9526 i32) + (local $l9527 i32) + (local $l9528 i32) + (local $l9529 i32) + (local $l9530 i32) + (local $l9531 i32) + (local $l9532 i32) + (local $l9533 i32) + (local $l9534 i32) + (local $l9535 i32) + (local $l9536 i32) + (local $l9537 i32) + (local $l9538 i32) + (local $l9539 i32) + (local $l9540 i32) + (local $l9541 i32) + (local $l9542 i32) + (local $l9543 i32) + (local $l9544 i32) + (local $l9545 i32) + (local $l9546 i32) + (local $l9547 i32) + (local $l9548 i32) + (local $l9549 i32) + (local $l9550 i32) + (local $l9551 i32) + (local $l9552 i32) + (local $l9553 i32) + (local $l9554 i32) + (local $l9555 i32) + (local $l9556 i32) + (local $l9557 i32) + (local $l9558 i32) + (local $l9559 i32) + (local $l9560 i32) + (local $l9561 i32) + (local $l9562 i32) + (local $l9563 i32) + (local $l9564 i32) + (local $l9565 i32) + (local $l9566 i32) + (local $l9567 i32) + (local $l9568 i32) + (local $l9569 i32) + (local $l9570 i32) + (local $l9571 i32) + (local $l9572 i32) + (local $l9573 i32) + (local $l9574 i32) + (local $l9575 i32) + (local $l9576 i32) + (local $l9577 i32) + (local $l9578 i32) + (local $l9579 i32) + (local $l9580 i32) + (local $l9581 i32) + (local $l9582 i32) + (local $l9583 i32) + (local $l9584 i32) + (local $l9585 i32) + (local $l9586 i32) + (local $l9587 i32) + (local $l9588 i32) + (local $l9589 i32) + (local $l9590 i32) + (local $l9591 i32) + (local $l9592 i32) + (local $l9593 i32) + (local $l9594 i32) + (local $l9595 i32) + (local $l9596 i32) + (local $l9597 i32) + (local $l9598 i32) + (local $l9599 i32) + (local $l9600 i32) + (local $l9601 i32) + (local $l9602 i32) + (local $l9603 i32) + (local $l9604 i32) + (local $l9605 i32) + (local $l9606 i32) + (local $l9607 i32) + (local $l9608 i32) + (local $l9609 i32) + (local $l9610 i32) + (local $l9611 i32) + (local $l9612 i32) + (local $l9613 i32) + (local $l9614 i32) + (local $l9615 i32) + (local $l9616 i32) + (local $l9617 i32) + (local $l9618 i32) + (local $l9619 i32) + (local $l9620 i32) + (local $l9621 i32) + (local $l9622 i32) + (local $l9623 i32) + (local $l9624 i32) + (local $l9625 i32) + (local $l9626 i32) + (local $l9627 i32) + (local $l9628 i32) + (local $l9629 i32) + (local $l9630 i32) + (local $l9631 i32) + (local $l9632 i32) + (local $l9633 i32) + (local $l9634 i32) + (local $l9635 i32) + (local $l9636 i32) + (local $l9637 i32) + (local $l9638 i32) + (local $l9639 i32) + (local $l9640 i32) + (local $l9641 i32) + (local $l9642 i32) + (local $l9643 i32) + (local $l9644 i32) + (local $l9645 i32) + (local $l9646 i32) + (local $l9647 i32) + (local $l9648 i32) + (local $l9649 i32) + (local $l9650 i32) + (local $l9651 i32) + (local $l9652 i32) + (local $l9653 i32) + (local $l9654 i32) + (local $l9655 i32) + (local $l9656 i32) + (local $l9657 i32) + (local $l9658 i32) + (local $l9659 i32) + (local $l9660 i32) + (local $l9661 i32) + (local $l9662 i32) + (local $l9663 i32) + (local $l9664 i32) + (local $l9665 i32) + (local $l9666 i32) + (local $l9667 i32) + (local $l9668 i32) + (local $l9669 i32) + (local $l9670 i32) + (local $l9671 i32) + (local $l9672 i32) + (local $l9673 i32) + (local $l9674 i32) + (local $l9675 i32) + (local $l9676 i32) + (local $l9677 i32) + (local $l9678 i32) + (local $l9679 i32) + (local $l9680 i32) + (local $l9681 i32) + (local $l9682 i32) + (local $l9683 i32) + (local $l9684 i32) + (local $l9685 i32) + (local $l9686 i32) + (local $l9687 i32) + (local $l9688 i32) + (local $l9689 i32) + (local $l9690 i32) + (local $l9691 i32) + (local $l9692 i32) + (local $l9693 i32) + (local $l9694 i32) + (local $l9695 i32) + (local $l9696 i32) + (local $l9697 i32) + (local $l9698 i32) + (local $l9699 i32) + (local $l9700 i32) + (local $l9701 i32) + (local $l9702 i32) + (local $l9703 i32) + (local $l9704 i32) + (local $l9705 i32) + (local $l9706 i32) + (local $l9707 i32) + (local $l9708 i32) + (local $l9709 i32) + (local $l9710 i32) + (local $l9711 i32) + (local $l9712 i32) + (local $l9713 i32) + (local $l9714 i32) + (local $l9715 i32) + (local $l9716 i32) + (local $l9717 i32) + (local $l9718 i32) + (local $l9719 i32) + (local $l9720 i32) + (local $l9721 i32) + (local $l9722 i32) + (local $l9723 i32) + (local $l9724 i32) + (local $l9725 i32) + (local $l9726 i32) + (local $l9727 i32) + (local $l9728 i32) + (local $l9729 i32) + (local $l9730 i32) + (local $l9731 i32) + (local $l9732 i32) + (local $l9733 i32) + (local $l9734 i32) + (local $l9735 i32) + (local $l9736 i32) + (local $l9737 i32) + (local $l9738 i32) + (local $l9739 i32) + (local $l9740 i32) + (local $l9741 i32) + (local $l9742 i32) + (local $l9743 i32) + (local $l9744 i32) + (local $l9745 i32) + (local $l9746 i32) + (local $l9747 i32) + (local $l9748 i32) + (local $l9749 i32) + (local $l9750 i32) + (local $l9751 i32) + (local $l9752 i32) + (local $l9753 i32) + (local $l9754 i32) + (local $l9755 i32) + (local $l9756 i32) + (local $l9757 i32) + (local $l9758 i32) + (local $l9759 i32) + (local $l9760 i32) + (local $l9761 i32) + (local $l9762 i32) + (local $l9763 i32) + (local $l9764 i32) + (local $l9765 i32) + (local $l9766 i32) + (local $l9767 i32) + (local $l9768 i32) + (local $l9769 i32) + (local $l9770 i32) + (local $l9771 i32) + (local $l9772 i32) + (local $l9773 i32) + (local $l9774 i32) + (local $l9775 i32) + (local $l9776 i32) + (local $l9777 i32) + (local $l9778 i32) + (local $l9779 i32) + (local $l9780 i32) + (local $l9781 i32) + (local $l9782 i32) + (local $l9783 i32) + (local $l9784 i32) + (local $l9785 i32) + (local $l9786 i32) + (local $l9787 i32) + (local $l9788 i32) + (local $l9789 i32) + (local $l9790 i32) + (local $l9791 i32) + (local $l9792 i32) + (local $l9793 i32) + (local $l9794 i32) + (local $l9795 i32) + (local $l9796 i32) + (local $l9797 i32) + (local $l9798 i32) + (local $l9799 i32) + (local $l9800 i32) + (local $l9801 i32) + (local $l9802 i32) + (local $l9803 i32) + (local $l9804 i32) + (local $l9805 i32) + (local $l9806 i32) + (local $l9807 i32) + (local $l9808 i32) + (local $l9809 i32) + (local $l9810 i32) + (local $l9811 i32) + (local $l9812 i32) + (local $l9813 i32) + (local $l9814 i32) + (local $l9815 i32) + (local $l9816 i32) + (local $l9817 i32) + (local $l9818 i32) + (local $l9819 i32) + (local $l9820 i32) + (local $l9821 i32) + (local $l9822 i32) + (local $l9823 i32) + (local $l9824 i32) + (local $l9825 i32) + (local $l9826 i32) + (local $l9827 i32) + (local $l9828 i32) + (local $l9829 i32) + (local $l9830 i32) + (local $l9831 i32) + (local $l9832 i32) + (local $l9833 i32) + (local $l9834 i32) + (local $l9835 i32) + (local $l9836 i32) + (local $l9837 i32) + (local $l9838 i32) + (local $l9839 i32) + (local $l9840 i32) + (local $l9841 i32) + (local $l9842 i32) + (local $l9843 i32) + (local $l9844 i32) + (local $l9845 i32) + (local $l9846 i32) + (local $l9847 i32) + (local $l9848 i32) + (local $l9849 i32) + (local $l9850 i32) + (local $l9851 i32) + (local $l9852 i32) + (local $l9853 i32) + (local $l9854 i32) + (local $l9855 i32) + (local $l9856 i32) + (local $l9857 i32) + (local $l9858 i32) + (local $l9859 i32) + (local $l9860 i32) + (local $l9861 i32) + (local $l9862 i32) + (local $l9863 i32) + (local $l9864 i32) + (local $l9865 i32) + (local $l9866 i32) + (local $l9867 i32) + (local $l9868 i32) + (local $l9869 i32) + (local $l9870 i32) + (local $l9871 i32) + (local $l9872 i32) + (local $l9873 i32) + (local $l9874 i32) + (local $l9875 i32) + (local $l9876 i32) + (local $l9877 i32) + (local $l9878 i32) + (local $l9879 i32) + (local $l9880 i32) + (local $l9881 i32) + (local $l9882 i32) + (local $l9883 i32) + (local $l9884 i32) + (local $l9885 i32) + (local $l9886 i32) + (local $l9887 i32) + (local $l9888 i32) + (local $l9889 i32) + (local $l9890 i32) + (local $l9891 i32) + (local $l9892 i32) + (local $l9893 i32) + (local $l9894 i32) + (local $l9895 i32) + (local $l9896 i32) + (local $l9897 i32) + (local $l9898 i32) + (local $l9899 i32) + (local $l9900 i32) + (local $l9901 i32) + (local $l9902 i32) + (local $l9903 i32) + (local $l9904 i32) + (local $l9905 i32) + (local $l9906 i32) + (local $l9907 i32) + (local $l9908 i32) + (local $l9909 i32) + (local $l9910 i32) + (local $l9911 i32) + (local $l9912 i32) + (local $l9913 i32) + (local $l9914 i32) + (local $l9915 i32) + (local $l9916 i32) + (local $l9917 i32) + (local $l9918 i32) + (local $l9919 i32) + (local $l9920 i32) + (local $l9921 i32) + (local $l9922 i32) + (local $l9923 i32) + (local $l9924 i32) + (local $l9925 i32) + (local $l9926 i32) + (local $l9927 i32) + (local $l9928 i32) + (local $l9929 i32) + (local $l9930 i32) + (local $l9931 i32) + (local $l9932 i32) + (local $l9933 i32) + (local $l9934 i32) + (local $l9935 i32) + (local $l9936 i32) + (local $l9937 i32) + (local $l9938 i32) + (local $l9939 i32) + (local $l9940 i32) + (local $l9941 i32) + (local $l9942 i32) + (local $l9943 i32) + (local $l9944 i32) + (local $l9945 i32) + (local $l9946 i32) + (local $l9947 i32) + (local $l9948 i32) + (local $l9949 i32) + (local $l9950 i32) + (local $l9951 i32) + (local $l9952 i32) + (local $l9953 i32) + (local $l9954 i32) + (local $l9955 i32) + (local $l9956 i32) + (local $l9957 i32) + (local $l9958 i32) + (local $l9959 i32) + (local $l9960 i32) + (local $l9961 i32) + (local $l9962 i32) + (local $l9963 i32) + (local $l9964 i32) + (local $l9965 i32) + (local $l9966 i32) + (local $l9967 i32) + (local $l9968 i32) + (local $l9969 i32) + (local $l9970 i32) + (local $l9971 i32) + (local $l9972 i32) + (local $l9973 i32) + (local $l9974 i32) + (local $l9975 i32) + (local $l9976 i32) + (local $l9977 i32) + (local $l9978 i32) + (local $l9979 i32) + (local $l9980 i32) + (local $l9981 i32) + (local $l9982 i32) + (local $l9983 i32) + (local $l9984 i32) + (local $l9985 i32) + (local $l9986 i32) + (local $l9987 i32) + (local $l9988 i32) + (local $l9989 i32) + (local $l9990 i32) + (local $l9991 i32) + (local $l9992 i32) + (local $l9993 i32) + (local $l9994 i32) + (local $l9995 i32) + (local $l9996 i32) + (local $l9997 i32) + (local $l9998 i32) + (local $l9999 i32) + ;; Initialize locals as sum of previous two + local.get $p0 + local.get $p1 + i32.add + local.set $l2 + local.get $p1 + local.get $l2 + i32.add + local.set $l3 + local.get $l2 + local.get $l3 + i32.add + local.set $l4 + local.get $l3 + local.get $l4 + i32.add + local.set $l5 + local.get $l4 + local.get $l5 + i32.add + local.set $l6 + local.get $l5 + local.get $l6 + i32.add + local.set $l7 + local.get $l6 + local.get $l7 + i32.add + local.set $l8 + local.get $l7 + local.get $l8 + i32.add + local.set $l9 + local.get $l8 + local.get $l9 + i32.add + local.set $l10 + local.get $l9 + local.get $l10 + i32.add + local.set $l11 + local.get $l10 + local.get $l11 + i32.add + local.set $l12 + local.get $l11 + local.get $l12 + i32.add + local.set $l13 + local.get $l12 + local.get $l13 + i32.add + local.set $l14 + local.get $l13 + local.get $l14 + i32.add + local.set $l15 + local.get $l14 + local.get $l15 + i32.add + local.set $l16 + local.get $l15 + local.get $l16 + i32.add + local.set $l17 + local.get $l16 + local.get $l17 + i32.add + local.set $l18 + local.get $l17 + local.get $l18 + i32.add + local.set $l19 + local.get $l18 + local.get $l19 + i32.add + local.set $l20 + local.get $l19 + local.get $l20 + i32.add + local.set $l21 + local.get $l20 + local.get $l21 + i32.add + local.set $l22 + local.get $l21 + local.get $l22 + i32.add + local.set $l23 + local.get $l22 + local.get $l23 + i32.add + local.set $l24 + local.get $l23 + local.get $l24 + i32.add + local.set $l25 + local.get $l24 + local.get $l25 + i32.add + local.set $l26 + local.get $l25 + local.get $l26 + i32.add + local.set $l27 + local.get $l26 + local.get $l27 + i32.add + local.set $l28 + local.get $l27 + local.get $l28 + i32.add + local.set $l29 + local.get $l28 + local.get $l29 + i32.add + local.set $l30 + local.get $l29 + local.get $l30 + i32.add + local.set $l31 + local.get $l30 + local.get $l31 + i32.add + local.set $l32 + local.get $l31 + local.get $l32 + i32.add + local.set $l33 + local.get $l32 + local.get $l33 + i32.add + local.set $l34 + local.get $l33 + local.get $l34 + i32.add + local.set $l35 + local.get $l34 + local.get $l35 + i32.add + local.set $l36 + local.get $l35 + local.get $l36 + i32.add + local.set $l37 + local.get $l36 + local.get $l37 + i32.add + local.set $l38 + local.get $l37 + local.get $l38 + i32.add + local.set $l39 + local.get $l38 + local.get $l39 + i32.add + local.set $l40 + local.get $l39 + local.get $l40 + i32.add + local.set $l41 + local.get $l40 + local.get $l41 + i32.add + local.set $l42 + local.get $l41 + local.get $l42 + i32.add + local.set $l43 + local.get $l42 + local.get $l43 + i32.add + local.set $l44 + local.get $l43 + local.get $l44 + i32.add + local.set $l45 + local.get $l44 + local.get $l45 + i32.add + local.set $l46 + local.get $l45 + local.get $l46 + i32.add + local.set $l47 + local.get $l46 + local.get $l47 + i32.add + local.set $l48 + local.get $l47 + local.get $l48 + i32.add + local.set $l49 + local.get $l48 + local.get $l49 + i32.add + local.set $l50 + local.get $l49 + local.get $l50 + i32.add + local.set $l51 + local.get $l50 + local.get $l51 + i32.add + local.set $l52 + local.get $l51 + local.get $l52 + i32.add + local.set $l53 + local.get $l52 + local.get $l53 + i32.add + local.set $l54 + local.get $l53 + local.get $l54 + i32.add + local.set $l55 + local.get $l54 + local.get $l55 + i32.add + local.set $l56 + local.get $l55 + local.get $l56 + i32.add + local.set $l57 + local.get $l56 + local.get $l57 + i32.add + local.set $l58 + local.get $l57 + local.get $l58 + i32.add + local.set $l59 + local.get $l58 + local.get $l59 + i32.add + local.set $l60 + local.get $l59 + local.get $l60 + i32.add + local.set $l61 + local.get $l60 + local.get $l61 + i32.add + local.set $l62 + local.get $l61 + local.get $l62 + i32.add + local.set $l63 + local.get $l62 + local.get $l63 + i32.add + local.set $l64 + local.get $l63 + local.get $l64 + i32.add + local.set $l65 + local.get $l64 + local.get $l65 + i32.add + local.set $l66 + local.get $l65 + local.get $l66 + i32.add + local.set $l67 + local.get $l66 + local.get $l67 + i32.add + local.set $l68 + local.get $l67 + local.get $l68 + i32.add + local.set $l69 + local.get $l68 + local.get $l69 + i32.add + local.set $l70 + local.get $l69 + local.get $l70 + i32.add + local.set $l71 + local.get $l70 + local.get $l71 + i32.add + local.set $l72 + local.get $l71 + local.get $l72 + i32.add + local.set $l73 + local.get $l72 + local.get $l73 + i32.add + local.set $l74 + local.get $l73 + local.get $l74 + i32.add + local.set $l75 + local.get $l74 + local.get $l75 + i32.add + local.set $l76 + local.get $l75 + local.get $l76 + i32.add + local.set $l77 + local.get $l76 + local.get $l77 + i32.add + local.set $l78 + local.get $l77 + local.get $l78 + i32.add + local.set $l79 + local.get $l78 + local.get $l79 + i32.add + local.set $l80 + local.get $l79 + local.get $l80 + i32.add + local.set $l81 + local.get $l80 + local.get $l81 + i32.add + local.set $l82 + local.get $l81 + local.get $l82 + i32.add + local.set $l83 + local.get $l82 + local.get $l83 + i32.add + local.set $l84 + local.get $l83 + local.get $l84 + i32.add + local.set $l85 + local.get $l84 + local.get $l85 + i32.add + local.set $l86 + local.get $l85 + local.get $l86 + i32.add + local.set $l87 + local.get $l86 + local.get $l87 + i32.add + local.set $l88 + local.get $l87 + local.get $l88 + i32.add + local.set $l89 + local.get $l88 + local.get $l89 + i32.add + local.set $l90 + local.get $l89 + local.get $l90 + i32.add + local.set $l91 + local.get $l90 + local.get $l91 + i32.add + local.set $l92 + local.get $l91 + local.get $l92 + i32.add + local.set $l93 + local.get $l92 + local.get $l93 + i32.add + local.set $l94 + local.get $l93 + local.get $l94 + i32.add + local.set $l95 + local.get $l94 + local.get $l95 + i32.add + local.set $l96 + local.get $l95 + local.get $l96 + i32.add + local.set $l97 + local.get $l96 + local.get $l97 + i32.add + local.set $l98 + local.get $l97 + local.get $l98 + i32.add + local.set $l99 + local.get $l98 + local.get $l99 + i32.add + local.set $l100 + local.get $l99 + local.get $l100 + i32.add + local.set $l101 + local.get $l100 + local.get $l101 + i32.add + local.set $l102 + local.get $l101 + local.get $l102 + i32.add + local.set $l103 + local.get $l102 + local.get $l103 + i32.add + local.set $l104 + local.get $l103 + local.get $l104 + i32.add + local.set $l105 + local.get $l104 + local.get $l105 + i32.add + local.set $l106 + local.get $l105 + local.get $l106 + i32.add + local.set $l107 + local.get $l106 + local.get $l107 + i32.add + local.set $l108 + local.get $l107 + local.get $l108 + i32.add + local.set $l109 + local.get $l108 + local.get $l109 + i32.add + local.set $l110 + local.get $l109 + local.get $l110 + i32.add + local.set $l111 + local.get $l110 + local.get $l111 + i32.add + local.set $l112 + local.get $l111 + local.get $l112 + i32.add + local.set $l113 + local.get $l112 + local.get $l113 + i32.add + local.set $l114 + local.get $l113 + local.get $l114 + i32.add + local.set $l115 + local.get $l114 + local.get $l115 + i32.add + local.set $l116 + local.get $l115 + local.get $l116 + i32.add + local.set $l117 + local.get $l116 + local.get $l117 + i32.add + local.set $l118 + local.get $l117 + local.get $l118 + i32.add + local.set $l119 + local.get $l118 + local.get $l119 + i32.add + local.set $l120 + local.get $l119 + local.get $l120 + i32.add + local.set $l121 + local.get $l120 + local.get $l121 + i32.add + local.set $l122 + local.get $l121 + local.get $l122 + i32.add + local.set $l123 + local.get $l122 + local.get $l123 + i32.add + local.set $l124 + local.get $l123 + local.get $l124 + i32.add + local.set $l125 + local.get $l124 + local.get $l125 + i32.add + local.set $l126 + local.get $l125 + local.get $l126 + i32.add + local.set $l127 + local.get $l126 + local.get $l127 + i32.add + local.set $l128 + local.get $l127 + local.get $l128 + i32.add + local.set $l129 + local.get $l128 + local.get $l129 + i32.add + local.set $l130 + local.get $l129 + local.get $l130 + i32.add + local.set $l131 + local.get $l130 + local.get $l131 + i32.add + local.set $l132 + local.get $l131 + local.get $l132 + i32.add + local.set $l133 + local.get $l132 + local.get $l133 + i32.add + local.set $l134 + local.get $l133 + local.get $l134 + i32.add + local.set $l135 + local.get $l134 + local.get $l135 + i32.add + local.set $l136 + local.get $l135 + local.get $l136 + i32.add + local.set $l137 + local.get $l136 + local.get $l137 + i32.add + local.set $l138 + local.get $l137 + local.get $l138 + i32.add + local.set $l139 + local.get $l138 + local.get $l139 + i32.add + local.set $l140 + local.get $l139 + local.get $l140 + i32.add + local.set $l141 + local.get $l140 + local.get $l141 + i32.add + local.set $l142 + local.get $l141 + local.get $l142 + i32.add + local.set $l143 + local.get $l142 + local.get $l143 + i32.add + local.set $l144 + local.get $l143 + local.get $l144 + i32.add + local.set $l145 + local.get $l144 + local.get $l145 + i32.add + local.set $l146 + local.get $l145 + local.get $l146 + i32.add + local.set $l147 + local.get $l146 + local.get $l147 + i32.add + local.set $l148 + local.get $l147 + local.get $l148 + i32.add + local.set $l149 + local.get $l148 + local.get $l149 + i32.add + local.set $l150 + local.get $l149 + local.get $l150 + i32.add + local.set $l151 + local.get $l150 + local.get $l151 + i32.add + local.set $l152 + local.get $l151 + local.get $l152 + i32.add + local.set $l153 + local.get $l152 + local.get $l153 + i32.add + local.set $l154 + local.get $l153 + local.get $l154 + i32.add + local.set $l155 + local.get $l154 + local.get $l155 + i32.add + local.set $l156 + local.get $l155 + local.get $l156 + i32.add + local.set $l157 + local.get $l156 + local.get $l157 + i32.add + local.set $l158 + local.get $l157 + local.get $l158 + i32.add + local.set $l159 + local.get $l158 + local.get $l159 + i32.add + local.set $l160 + local.get $l159 + local.get $l160 + i32.add + local.set $l161 + local.get $l160 + local.get $l161 + i32.add + local.set $l162 + local.get $l161 + local.get $l162 + i32.add + local.set $l163 + local.get $l162 + local.get $l163 + i32.add + local.set $l164 + local.get $l163 + local.get $l164 + i32.add + local.set $l165 + local.get $l164 + local.get $l165 + i32.add + local.set $l166 + local.get $l165 + local.get $l166 + i32.add + local.set $l167 + local.get $l166 + local.get $l167 + i32.add + local.set $l168 + local.get $l167 + local.get $l168 + i32.add + local.set $l169 + local.get $l168 + local.get $l169 + i32.add + local.set $l170 + local.get $l169 + local.get $l170 + i32.add + local.set $l171 + local.get $l170 + local.get $l171 + i32.add + local.set $l172 + local.get $l171 + local.get $l172 + i32.add + local.set $l173 + local.get $l172 + local.get $l173 + i32.add + local.set $l174 + local.get $l173 + local.get $l174 + i32.add + local.set $l175 + local.get $l174 + local.get $l175 + i32.add + local.set $l176 + local.get $l175 + local.get $l176 + i32.add + local.set $l177 + local.get $l176 + local.get $l177 + i32.add + local.set $l178 + local.get $l177 + local.get $l178 + i32.add + local.set $l179 + local.get $l178 + local.get $l179 + i32.add + local.set $l180 + local.get $l179 + local.get $l180 + i32.add + local.set $l181 + local.get $l180 + local.get $l181 + i32.add + local.set $l182 + local.get $l181 + local.get $l182 + i32.add + local.set $l183 + local.get $l182 + local.get $l183 + i32.add + local.set $l184 + local.get $l183 + local.get $l184 + i32.add + local.set $l185 + local.get $l184 + local.get $l185 + i32.add + local.set $l186 + local.get $l185 + local.get $l186 + i32.add + local.set $l187 + local.get $l186 + local.get $l187 + i32.add + local.set $l188 + local.get $l187 + local.get $l188 + i32.add + local.set $l189 + local.get $l188 + local.get $l189 + i32.add + local.set $l190 + local.get $l189 + local.get $l190 + i32.add + local.set $l191 + local.get $l190 + local.get $l191 + i32.add + local.set $l192 + local.get $l191 + local.get $l192 + i32.add + local.set $l193 + local.get $l192 + local.get $l193 + i32.add + local.set $l194 + local.get $l193 + local.get $l194 + i32.add + local.set $l195 + local.get $l194 + local.get $l195 + i32.add + local.set $l196 + local.get $l195 + local.get $l196 + i32.add + local.set $l197 + local.get $l196 + local.get $l197 + i32.add + local.set $l198 + local.get $l197 + local.get $l198 + i32.add + local.set $l199 + local.get $l198 + local.get $l199 + i32.add + local.set $l200 + local.get $l199 + local.get $l200 + i32.add + local.set $l201 + local.get $l200 + local.get $l201 + i32.add + local.set $l202 + local.get $l201 + local.get $l202 + i32.add + local.set $l203 + local.get $l202 + local.get $l203 + i32.add + local.set $l204 + local.get $l203 + local.get $l204 + i32.add + local.set $l205 + local.get $l204 + local.get $l205 + i32.add + local.set $l206 + local.get $l205 + local.get $l206 + i32.add + local.set $l207 + local.get $l206 + local.get $l207 + i32.add + local.set $l208 + local.get $l207 + local.get $l208 + i32.add + local.set $l209 + local.get $l208 + local.get $l209 + i32.add + local.set $l210 + local.get $l209 + local.get $l210 + i32.add + local.set $l211 + local.get $l210 + local.get $l211 + i32.add + local.set $l212 + local.get $l211 + local.get $l212 + i32.add + local.set $l213 + local.get $l212 + local.get $l213 + i32.add + local.set $l214 + local.get $l213 + local.get $l214 + i32.add + local.set $l215 + local.get $l214 + local.get $l215 + i32.add + local.set $l216 + local.get $l215 + local.get $l216 + i32.add + local.set $l217 + local.get $l216 + local.get $l217 + i32.add + local.set $l218 + local.get $l217 + local.get $l218 + i32.add + local.set $l219 + local.get $l218 + local.get $l219 + i32.add + local.set $l220 + local.get $l219 + local.get $l220 + i32.add + local.set $l221 + local.get $l220 + local.get $l221 + i32.add + local.set $l222 + local.get $l221 + local.get $l222 + i32.add + local.set $l223 + local.get $l222 + local.get $l223 + i32.add + local.set $l224 + local.get $l223 + local.get $l224 + i32.add + local.set $l225 + local.get $l224 + local.get $l225 + i32.add + local.set $l226 + local.get $l225 + local.get $l226 + i32.add + local.set $l227 + local.get $l226 + local.get $l227 + i32.add + local.set $l228 + local.get $l227 + local.get $l228 + i32.add + local.set $l229 + local.get $l228 + local.get $l229 + i32.add + local.set $l230 + local.get $l229 + local.get $l230 + i32.add + local.set $l231 + local.get $l230 + local.get $l231 + i32.add + local.set $l232 + local.get $l231 + local.get $l232 + i32.add + local.set $l233 + local.get $l232 + local.get $l233 + i32.add + local.set $l234 + local.get $l233 + local.get $l234 + i32.add + local.set $l235 + local.get $l234 + local.get $l235 + i32.add + local.set $l236 + local.get $l235 + local.get $l236 + i32.add + local.set $l237 + local.get $l236 + local.get $l237 + i32.add + local.set $l238 + local.get $l237 + local.get $l238 + i32.add + local.set $l239 + local.get $l238 + local.get $l239 + i32.add + local.set $l240 + local.get $l239 + local.get $l240 + i32.add + local.set $l241 + local.get $l240 + local.get $l241 + i32.add + local.set $l242 + local.get $l241 + local.get $l242 + i32.add + local.set $l243 + local.get $l242 + local.get $l243 + i32.add + local.set $l244 + local.get $l243 + local.get $l244 + i32.add + local.set $l245 + local.get $l244 + local.get $l245 + i32.add + local.set $l246 + local.get $l245 + local.get $l246 + i32.add + local.set $l247 + local.get $l246 + local.get $l247 + i32.add + local.set $l248 + local.get $l247 + local.get $l248 + i32.add + local.set $l249 + local.get $l248 + local.get $l249 + i32.add + local.set $l250 + local.get $l249 + local.get $l250 + i32.add + local.set $l251 + local.get $l250 + local.get $l251 + i32.add + local.set $l252 + local.get $l251 + local.get $l252 + i32.add + local.set $l253 + local.get $l252 + local.get $l253 + i32.add + local.set $l254 + local.get $l253 + local.get $l254 + i32.add + local.set $l255 + local.get $l254 + local.get $l255 + i32.add + local.set $l256 + local.get $l255 + local.get $l256 + i32.add + local.set $l257 + local.get $l256 + local.get $l257 + i32.add + local.set $l258 + local.get $l257 + local.get $l258 + i32.add + local.set $l259 + local.get $l258 + local.get $l259 + i32.add + local.set $l260 + local.get $l259 + local.get $l260 + i32.add + local.set $l261 + local.get $l260 + local.get $l261 + i32.add + local.set $l262 + local.get $l261 + local.get $l262 + i32.add + local.set $l263 + local.get $l262 + local.get $l263 + i32.add + local.set $l264 + local.get $l263 + local.get $l264 + i32.add + local.set $l265 + local.get $l264 + local.get $l265 + i32.add + local.set $l266 + local.get $l265 + local.get $l266 + i32.add + local.set $l267 + local.get $l266 + local.get $l267 + i32.add + local.set $l268 + local.get $l267 + local.get $l268 + i32.add + local.set $l269 + local.get $l268 + local.get $l269 + i32.add + local.set $l270 + local.get $l269 + local.get $l270 + i32.add + local.set $l271 + local.get $l270 + local.get $l271 + i32.add + local.set $l272 + local.get $l271 + local.get $l272 + i32.add + local.set $l273 + local.get $l272 + local.get $l273 + i32.add + local.set $l274 + local.get $l273 + local.get $l274 + i32.add + local.set $l275 + local.get $l274 + local.get $l275 + i32.add + local.set $l276 + local.get $l275 + local.get $l276 + i32.add + local.set $l277 + local.get $l276 + local.get $l277 + i32.add + local.set $l278 + local.get $l277 + local.get $l278 + i32.add + local.set $l279 + local.get $l278 + local.get $l279 + i32.add + local.set $l280 + local.get $l279 + local.get $l280 + i32.add + local.set $l281 + local.get $l280 + local.get $l281 + i32.add + local.set $l282 + local.get $l281 + local.get $l282 + i32.add + local.set $l283 + local.get $l282 + local.get $l283 + i32.add + local.set $l284 + local.get $l283 + local.get $l284 + i32.add + local.set $l285 + local.get $l284 + local.get $l285 + i32.add + local.set $l286 + local.get $l285 + local.get $l286 + i32.add + local.set $l287 + local.get $l286 + local.get $l287 + i32.add + local.set $l288 + local.get $l287 + local.get $l288 + i32.add + local.set $l289 + local.get $l288 + local.get $l289 + i32.add + local.set $l290 + local.get $l289 + local.get $l290 + i32.add + local.set $l291 + local.get $l290 + local.get $l291 + i32.add + local.set $l292 + local.get $l291 + local.get $l292 + i32.add + local.set $l293 + local.get $l292 + local.get $l293 + i32.add + local.set $l294 + local.get $l293 + local.get $l294 + i32.add + local.set $l295 + local.get $l294 + local.get $l295 + i32.add + local.set $l296 + local.get $l295 + local.get $l296 + i32.add + local.set $l297 + local.get $l296 + local.get $l297 + i32.add + local.set $l298 + local.get $l297 + local.get $l298 + i32.add + local.set $l299 + local.get $l298 + local.get $l299 + i32.add + local.set $l300 + local.get $l299 + local.get $l300 + i32.add + local.set $l301 + local.get $l300 + local.get $l301 + i32.add + local.set $l302 + local.get $l301 + local.get $l302 + i32.add + local.set $l303 + local.get $l302 + local.get $l303 + i32.add + local.set $l304 + local.get $l303 + local.get $l304 + i32.add + local.set $l305 + local.get $l304 + local.get $l305 + i32.add + local.set $l306 + local.get $l305 + local.get $l306 + i32.add + local.set $l307 + local.get $l306 + local.get $l307 + i32.add + local.set $l308 + local.get $l307 + local.get $l308 + i32.add + local.set $l309 + local.get $l308 + local.get $l309 + i32.add + local.set $l310 + local.get $l309 + local.get $l310 + i32.add + local.set $l311 + local.get $l310 + local.get $l311 + i32.add + local.set $l312 + local.get $l311 + local.get $l312 + i32.add + local.set $l313 + local.get $l312 + local.get $l313 + i32.add + local.set $l314 + local.get $l313 + local.get $l314 + i32.add + local.set $l315 + local.get $l314 + local.get $l315 + i32.add + local.set $l316 + local.get $l315 + local.get $l316 + i32.add + local.set $l317 + local.get $l316 + local.get $l317 + i32.add + local.set $l318 + local.get $l317 + local.get $l318 + i32.add + local.set $l319 + local.get $l318 + local.get $l319 + i32.add + local.set $l320 + local.get $l319 + local.get $l320 + i32.add + local.set $l321 + local.get $l320 + local.get $l321 + i32.add + local.set $l322 + local.get $l321 + local.get $l322 + i32.add + local.set $l323 + local.get $l322 + local.get $l323 + i32.add + local.set $l324 + local.get $l323 + local.get $l324 + i32.add + local.set $l325 + local.get $l324 + local.get $l325 + i32.add + local.set $l326 + local.get $l325 + local.get $l326 + i32.add + local.set $l327 + local.get $l326 + local.get $l327 + i32.add + local.set $l328 + local.get $l327 + local.get $l328 + i32.add + local.set $l329 + local.get $l328 + local.get $l329 + i32.add + local.set $l330 + local.get $l329 + local.get $l330 + i32.add + local.set $l331 + local.get $l330 + local.get $l331 + i32.add + local.set $l332 + local.get $l331 + local.get $l332 + i32.add + local.set $l333 + local.get $l332 + local.get $l333 + i32.add + local.set $l334 + local.get $l333 + local.get $l334 + i32.add + local.set $l335 + local.get $l334 + local.get $l335 + i32.add + local.set $l336 + local.get $l335 + local.get $l336 + i32.add + local.set $l337 + local.get $l336 + local.get $l337 + i32.add + local.set $l338 + local.get $l337 + local.get $l338 + i32.add + local.set $l339 + local.get $l338 + local.get $l339 + i32.add + local.set $l340 + local.get $l339 + local.get $l340 + i32.add + local.set $l341 + local.get $l340 + local.get $l341 + i32.add + local.set $l342 + local.get $l341 + local.get $l342 + i32.add + local.set $l343 + local.get $l342 + local.get $l343 + i32.add + local.set $l344 + local.get $l343 + local.get $l344 + i32.add + local.set $l345 + local.get $l344 + local.get $l345 + i32.add + local.set $l346 + local.get $l345 + local.get $l346 + i32.add + local.set $l347 + local.get $l346 + local.get $l347 + i32.add + local.set $l348 + local.get $l347 + local.get $l348 + i32.add + local.set $l349 + local.get $l348 + local.get $l349 + i32.add + local.set $l350 + local.get $l349 + local.get $l350 + i32.add + local.set $l351 + local.get $l350 + local.get $l351 + i32.add + local.set $l352 + local.get $l351 + local.get $l352 + i32.add + local.set $l353 + local.get $l352 + local.get $l353 + i32.add + local.set $l354 + local.get $l353 + local.get $l354 + i32.add + local.set $l355 + local.get $l354 + local.get $l355 + i32.add + local.set $l356 + local.get $l355 + local.get $l356 + i32.add + local.set $l357 + local.get $l356 + local.get $l357 + i32.add + local.set $l358 + local.get $l357 + local.get $l358 + i32.add + local.set $l359 + local.get $l358 + local.get $l359 + i32.add + local.set $l360 + local.get $l359 + local.get $l360 + i32.add + local.set $l361 + local.get $l360 + local.get $l361 + i32.add + local.set $l362 + local.get $l361 + local.get $l362 + i32.add + local.set $l363 + local.get $l362 + local.get $l363 + i32.add + local.set $l364 + local.get $l363 + local.get $l364 + i32.add + local.set $l365 + local.get $l364 + local.get $l365 + i32.add + local.set $l366 + local.get $l365 + local.get $l366 + i32.add + local.set $l367 + local.get $l366 + local.get $l367 + i32.add + local.set $l368 + local.get $l367 + local.get $l368 + i32.add + local.set $l369 + local.get $l368 + local.get $l369 + i32.add + local.set $l370 + local.get $l369 + local.get $l370 + i32.add + local.set $l371 + local.get $l370 + local.get $l371 + i32.add + local.set $l372 + local.get $l371 + local.get $l372 + i32.add + local.set $l373 + local.get $l372 + local.get $l373 + i32.add + local.set $l374 + local.get $l373 + local.get $l374 + i32.add + local.set $l375 + local.get $l374 + local.get $l375 + i32.add + local.set $l376 + local.get $l375 + local.get $l376 + i32.add + local.set $l377 + local.get $l376 + local.get $l377 + i32.add + local.set $l378 + local.get $l377 + local.get $l378 + i32.add + local.set $l379 + local.get $l378 + local.get $l379 + i32.add + local.set $l380 + local.get $l379 + local.get $l380 + i32.add + local.set $l381 + local.get $l380 + local.get $l381 + i32.add + local.set $l382 + local.get $l381 + local.get $l382 + i32.add + local.set $l383 + local.get $l382 + local.get $l383 + i32.add + local.set $l384 + local.get $l383 + local.get $l384 + i32.add + local.set $l385 + local.get $l384 + local.get $l385 + i32.add + local.set $l386 + local.get $l385 + local.get $l386 + i32.add + local.set $l387 + local.get $l386 + local.get $l387 + i32.add + local.set $l388 + local.get $l387 + local.get $l388 + i32.add + local.set $l389 + local.get $l388 + local.get $l389 + i32.add + local.set $l390 + local.get $l389 + local.get $l390 + i32.add + local.set $l391 + local.get $l390 + local.get $l391 + i32.add + local.set $l392 + local.get $l391 + local.get $l392 + i32.add + local.set $l393 + local.get $l392 + local.get $l393 + i32.add + local.set $l394 + local.get $l393 + local.get $l394 + i32.add + local.set $l395 + local.get $l394 + local.get $l395 + i32.add + local.set $l396 + local.get $l395 + local.get $l396 + i32.add + local.set $l397 + local.get $l396 + local.get $l397 + i32.add + local.set $l398 + local.get $l397 + local.get $l398 + i32.add + local.set $l399 + local.get $l398 + local.get $l399 + i32.add + local.set $l400 + local.get $l399 + local.get $l400 + i32.add + local.set $l401 + local.get $l400 + local.get $l401 + i32.add + local.set $l402 + local.get $l401 + local.get $l402 + i32.add + local.set $l403 + local.get $l402 + local.get $l403 + i32.add + local.set $l404 + local.get $l403 + local.get $l404 + i32.add + local.set $l405 + local.get $l404 + local.get $l405 + i32.add + local.set $l406 + local.get $l405 + local.get $l406 + i32.add + local.set $l407 + local.get $l406 + local.get $l407 + i32.add + local.set $l408 + local.get $l407 + local.get $l408 + i32.add + local.set $l409 + local.get $l408 + local.get $l409 + i32.add + local.set $l410 + local.get $l409 + local.get $l410 + i32.add + local.set $l411 + local.get $l410 + local.get $l411 + i32.add + local.set $l412 + local.get $l411 + local.get $l412 + i32.add + local.set $l413 + local.get $l412 + local.get $l413 + i32.add + local.set $l414 + local.get $l413 + local.get $l414 + i32.add + local.set $l415 + local.get $l414 + local.get $l415 + i32.add + local.set $l416 + local.get $l415 + local.get $l416 + i32.add + local.set $l417 + local.get $l416 + local.get $l417 + i32.add + local.set $l418 + local.get $l417 + local.get $l418 + i32.add + local.set $l419 + local.get $l418 + local.get $l419 + i32.add + local.set $l420 + local.get $l419 + local.get $l420 + i32.add + local.set $l421 + local.get $l420 + local.get $l421 + i32.add + local.set $l422 + local.get $l421 + local.get $l422 + i32.add + local.set $l423 + local.get $l422 + local.get $l423 + i32.add + local.set $l424 + local.get $l423 + local.get $l424 + i32.add + local.set $l425 + local.get $l424 + local.get $l425 + i32.add + local.set $l426 + local.get $l425 + local.get $l426 + i32.add + local.set $l427 + local.get $l426 + local.get $l427 + i32.add + local.set $l428 + local.get $l427 + local.get $l428 + i32.add + local.set $l429 + local.get $l428 + local.get $l429 + i32.add + local.set $l430 + local.get $l429 + local.get $l430 + i32.add + local.set $l431 + local.get $l430 + local.get $l431 + i32.add + local.set $l432 + local.get $l431 + local.get $l432 + i32.add + local.set $l433 + local.get $l432 + local.get $l433 + i32.add + local.set $l434 + local.get $l433 + local.get $l434 + i32.add + local.set $l435 + local.get $l434 + local.get $l435 + i32.add + local.set $l436 + local.get $l435 + local.get $l436 + i32.add + local.set $l437 + local.get $l436 + local.get $l437 + i32.add + local.set $l438 + local.get $l437 + local.get $l438 + i32.add + local.set $l439 + local.get $l438 + local.get $l439 + i32.add + local.set $l440 + local.get $l439 + local.get $l440 + i32.add + local.set $l441 + local.get $l440 + local.get $l441 + i32.add + local.set $l442 + local.get $l441 + local.get $l442 + i32.add + local.set $l443 + local.get $l442 + local.get $l443 + i32.add + local.set $l444 + local.get $l443 + local.get $l444 + i32.add + local.set $l445 + local.get $l444 + local.get $l445 + i32.add + local.set $l446 + local.get $l445 + local.get $l446 + i32.add + local.set $l447 + local.get $l446 + local.get $l447 + i32.add + local.set $l448 + local.get $l447 + local.get $l448 + i32.add + local.set $l449 + local.get $l448 + local.get $l449 + i32.add + local.set $l450 + local.get $l449 + local.get $l450 + i32.add + local.set $l451 + local.get $l450 + local.get $l451 + i32.add + local.set $l452 + local.get $l451 + local.get $l452 + i32.add + local.set $l453 + local.get $l452 + local.get $l453 + i32.add + local.set $l454 + local.get $l453 + local.get $l454 + i32.add + local.set $l455 + local.get $l454 + local.get $l455 + i32.add + local.set $l456 + local.get $l455 + local.get $l456 + i32.add + local.set $l457 + local.get $l456 + local.get $l457 + i32.add + local.set $l458 + local.get $l457 + local.get $l458 + i32.add + local.set $l459 + local.get $l458 + local.get $l459 + i32.add + local.set $l460 + local.get $l459 + local.get $l460 + i32.add + local.set $l461 + local.get $l460 + local.get $l461 + i32.add + local.set $l462 + local.get $l461 + local.get $l462 + i32.add + local.set $l463 + local.get $l462 + local.get $l463 + i32.add + local.set $l464 + local.get $l463 + local.get $l464 + i32.add + local.set $l465 + local.get $l464 + local.get $l465 + i32.add + local.set $l466 + local.get $l465 + local.get $l466 + i32.add + local.set $l467 + local.get $l466 + local.get $l467 + i32.add + local.set $l468 + local.get $l467 + local.get $l468 + i32.add + local.set $l469 + local.get $l468 + local.get $l469 + i32.add + local.set $l470 + local.get $l469 + local.get $l470 + i32.add + local.set $l471 + local.get $l470 + local.get $l471 + i32.add + local.set $l472 + local.get $l471 + local.get $l472 + i32.add + local.set $l473 + local.get $l472 + local.get $l473 + i32.add + local.set $l474 + local.get $l473 + local.get $l474 + i32.add + local.set $l475 + local.get $l474 + local.get $l475 + i32.add + local.set $l476 + local.get $l475 + local.get $l476 + i32.add + local.set $l477 + local.get $l476 + local.get $l477 + i32.add + local.set $l478 + local.get $l477 + local.get $l478 + i32.add + local.set $l479 + local.get $l478 + local.get $l479 + i32.add + local.set $l480 + local.get $l479 + local.get $l480 + i32.add + local.set $l481 + local.get $l480 + local.get $l481 + i32.add + local.set $l482 + local.get $l481 + local.get $l482 + i32.add + local.set $l483 + local.get $l482 + local.get $l483 + i32.add + local.set $l484 + local.get $l483 + local.get $l484 + i32.add + local.set $l485 + local.get $l484 + local.get $l485 + i32.add + local.set $l486 + local.get $l485 + local.get $l486 + i32.add + local.set $l487 + local.get $l486 + local.get $l487 + i32.add + local.set $l488 + local.get $l487 + local.get $l488 + i32.add + local.set $l489 + local.get $l488 + local.get $l489 + i32.add + local.set $l490 + local.get $l489 + local.get $l490 + i32.add + local.set $l491 + local.get $l490 + local.get $l491 + i32.add + local.set $l492 + local.get $l491 + local.get $l492 + i32.add + local.set $l493 + local.get $l492 + local.get $l493 + i32.add + local.set $l494 + local.get $l493 + local.get $l494 + i32.add + local.set $l495 + local.get $l494 + local.get $l495 + i32.add + local.set $l496 + local.get $l495 + local.get $l496 + i32.add + local.set $l497 + local.get $l496 + local.get $l497 + i32.add + local.set $l498 + local.get $l497 + local.get $l498 + i32.add + local.set $l499 + local.get $l498 + local.get $l499 + i32.add + local.set $l500 + local.get $l499 + local.get $l500 + i32.add + local.set $l501 + local.get $l500 + local.get $l501 + i32.add + local.set $l502 + local.get $l501 + local.get $l502 + i32.add + local.set $l503 + local.get $l502 + local.get $l503 + i32.add + local.set $l504 + local.get $l503 + local.get $l504 + i32.add + local.set $l505 + local.get $l504 + local.get $l505 + i32.add + local.set $l506 + local.get $l505 + local.get $l506 + i32.add + local.set $l507 + local.get $l506 + local.get $l507 + i32.add + local.set $l508 + local.get $l507 + local.get $l508 + i32.add + local.set $l509 + local.get $l508 + local.get $l509 + i32.add + local.set $l510 + local.get $l509 + local.get $l510 + i32.add + local.set $l511 + local.get $l510 + local.get $l511 + i32.add + local.set $l512 + local.get $l511 + local.get $l512 + i32.add + local.set $l513 + local.get $l512 + local.get $l513 + i32.add + local.set $l514 + local.get $l513 + local.get $l514 + i32.add + local.set $l515 + local.get $l514 + local.get $l515 + i32.add + local.set $l516 + local.get $l515 + local.get $l516 + i32.add + local.set $l517 + local.get $l516 + local.get $l517 + i32.add + local.set $l518 + local.get $l517 + local.get $l518 + i32.add + local.set $l519 + local.get $l518 + local.get $l519 + i32.add + local.set $l520 + local.get $l519 + local.get $l520 + i32.add + local.set $l521 + local.get $l520 + local.get $l521 + i32.add + local.set $l522 + local.get $l521 + local.get $l522 + i32.add + local.set $l523 + local.get $l522 + local.get $l523 + i32.add + local.set $l524 + local.get $l523 + local.get $l524 + i32.add + local.set $l525 + local.get $l524 + local.get $l525 + i32.add + local.set $l526 + local.get $l525 + local.get $l526 + i32.add + local.set $l527 + local.get $l526 + local.get $l527 + i32.add + local.set $l528 + local.get $l527 + local.get $l528 + i32.add + local.set $l529 + local.get $l528 + local.get $l529 + i32.add + local.set $l530 + local.get $l529 + local.get $l530 + i32.add + local.set $l531 + local.get $l530 + local.get $l531 + i32.add + local.set $l532 + local.get $l531 + local.get $l532 + i32.add + local.set $l533 + local.get $l532 + local.get $l533 + i32.add + local.set $l534 + local.get $l533 + local.get $l534 + i32.add + local.set $l535 + local.get $l534 + local.get $l535 + i32.add + local.set $l536 + local.get $l535 + local.get $l536 + i32.add + local.set $l537 + local.get $l536 + local.get $l537 + i32.add + local.set $l538 + local.get $l537 + local.get $l538 + i32.add + local.set $l539 + local.get $l538 + local.get $l539 + i32.add + local.set $l540 + local.get $l539 + local.get $l540 + i32.add + local.set $l541 + local.get $l540 + local.get $l541 + i32.add + local.set $l542 + local.get $l541 + local.get $l542 + i32.add + local.set $l543 + local.get $l542 + local.get $l543 + i32.add + local.set $l544 + local.get $l543 + local.get $l544 + i32.add + local.set $l545 + local.get $l544 + local.get $l545 + i32.add + local.set $l546 + local.get $l545 + local.get $l546 + i32.add + local.set $l547 + local.get $l546 + local.get $l547 + i32.add + local.set $l548 + local.get $l547 + local.get $l548 + i32.add + local.set $l549 + local.get $l548 + local.get $l549 + i32.add + local.set $l550 + local.get $l549 + local.get $l550 + i32.add + local.set $l551 + local.get $l550 + local.get $l551 + i32.add + local.set $l552 + local.get $l551 + local.get $l552 + i32.add + local.set $l553 + local.get $l552 + local.get $l553 + i32.add + local.set $l554 + local.get $l553 + local.get $l554 + i32.add + local.set $l555 + local.get $l554 + local.get $l555 + i32.add + local.set $l556 + local.get $l555 + local.get $l556 + i32.add + local.set $l557 + local.get $l556 + local.get $l557 + i32.add + local.set $l558 + local.get $l557 + local.get $l558 + i32.add + local.set $l559 + local.get $l558 + local.get $l559 + i32.add + local.set $l560 + local.get $l559 + local.get $l560 + i32.add + local.set $l561 + local.get $l560 + local.get $l561 + i32.add + local.set $l562 + local.get $l561 + local.get $l562 + i32.add + local.set $l563 + local.get $l562 + local.get $l563 + i32.add + local.set $l564 + local.get $l563 + local.get $l564 + i32.add + local.set $l565 + local.get $l564 + local.get $l565 + i32.add + local.set $l566 + local.get $l565 + local.get $l566 + i32.add + local.set $l567 + local.get $l566 + local.get $l567 + i32.add + local.set $l568 + local.get $l567 + local.get $l568 + i32.add + local.set $l569 + local.get $l568 + local.get $l569 + i32.add + local.set $l570 + local.get $l569 + local.get $l570 + i32.add + local.set $l571 + local.get $l570 + local.get $l571 + i32.add + local.set $l572 + local.get $l571 + local.get $l572 + i32.add + local.set $l573 + local.get $l572 + local.get $l573 + i32.add + local.set $l574 + local.get $l573 + local.get $l574 + i32.add + local.set $l575 + local.get $l574 + local.get $l575 + i32.add + local.set $l576 + local.get $l575 + local.get $l576 + i32.add + local.set $l577 + local.get $l576 + local.get $l577 + i32.add + local.set $l578 + local.get $l577 + local.get $l578 + i32.add + local.set $l579 + local.get $l578 + local.get $l579 + i32.add + local.set $l580 + local.get $l579 + local.get $l580 + i32.add + local.set $l581 + local.get $l580 + local.get $l581 + i32.add + local.set $l582 + local.get $l581 + local.get $l582 + i32.add + local.set $l583 + local.get $l582 + local.get $l583 + i32.add + local.set $l584 + local.get $l583 + local.get $l584 + i32.add + local.set $l585 + local.get $l584 + local.get $l585 + i32.add + local.set $l586 + local.get $l585 + local.get $l586 + i32.add + local.set $l587 + local.get $l586 + local.get $l587 + i32.add + local.set $l588 + local.get $l587 + local.get $l588 + i32.add + local.set $l589 + local.get $l588 + local.get $l589 + i32.add + local.set $l590 + local.get $l589 + local.get $l590 + i32.add + local.set $l591 + local.get $l590 + local.get $l591 + i32.add + local.set $l592 + local.get $l591 + local.get $l592 + i32.add + local.set $l593 + local.get $l592 + local.get $l593 + i32.add + local.set $l594 + local.get $l593 + local.get $l594 + i32.add + local.set $l595 + local.get $l594 + local.get $l595 + i32.add + local.set $l596 + local.get $l595 + local.get $l596 + i32.add + local.set $l597 + local.get $l596 + local.get $l597 + i32.add + local.set $l598 + local.get $l597 + local.get $l598 + i32.add + local.set $l599 + local.get $l598 + local.get $l599 + i32.add + local.set $l600 + local.get $l599 + local.get $l600 + i32.add + local.set $l601 + local.get $l600 + local.get $l601 + i32.add + local.set $l602 + local.get $l601 + local.get $l602 + i32.add + local.set $l603 + local.get $l602 + local.get $l603 + i32.add + local.set $l604 + local.get $l603 + local.get $l604 + i32.add + local.set $l605 + local.get $l604 + local.get $l605 + i32.add + local.set $l606 + local.get $l605 + local.get $l606 + i32.add + local.set $l607 + local.get $l606 + local.get $l607 + i32.add + local.set $l608 + local.get $l607 + local.get $l608 + i32.add + local.set $l609 + local.get $l608 + local.get $l609 + i32.add + local.set $l610 + local.get $l609 + local.get $l610 + i32.add + local.set $l611 + local.get $l610 + local.get $l611 + i32.add + local.set $l612 + local.get $l611 + local.get $l612 + i32.add + local.set $l613 + local.get $l612 + local.get $l613 + i32.add + local.set $l614 + local.get $l613 + local.get $l614 + i32.add + local.set $l615 + local.get $l614 + local.get $l615 + i32.add + local.set $l616 + local.get $l615 + local.get $l616 + i32.add + local.set $l617 + local.get $l616 + local.get $l617 + i32.add + local.set $l618 + local.get $l617 + local.get $l618 + i32.add + local.set $l619 + local.get $l618 + local.get $l619 + i32.add + local.set $l620 + local.get $l619 + local.get $l620 + i32.add + local.set $l621 + local.get $l620 + local.get $l621 + i32.add + local.set $l622 + local.get $l621 + local.get $l622 + i32.add + local.set $l623 + local.get $l622 + local.get $l623 + i32.add + local.set $l624 + local.get $l623 + local.get $l624 + i32.add + local.set $l625 + local.get $l624 + local.get $l625 + i32.add + local.set $l626 + local.get $l625 + local.get $l626 + i32.add + local.set $l627 + local.get $l626 + local.get $l627 + i32.add + local.set $l628 + local.get $l627 + local.get $l628 + i32.add + local.set $l629 + local.get $l628 + local.get $l629 + i32.add + local.set $l630 + local.get $l629 + local.get $l630 + i32.add + local.set $l631 + local.get $l630 + local.get $l631 + i32.add + local.set $l632 + local.get $l631 + local.get $l632 + i32.add + local.set $l633 + local.get $l632 + local.get $l633 + i32.add + local.set $l634 + local.get $l633 + local.get $l634 + i32.add + local.set $l635 + local.get $l634 + local.get $l635 + i32.add + local.set $l636 + local.get $l635 + local.get $l636 + i32.add + local.set $l637 + local.get $l636 + local.get $l637 + i32.add + local.set $l638 + local.get $l637 + local.get $l638 + i32.add + local.set $l639 + local.get $l638 + local.get $l639 + i32.add + local.set $l640 + local.get $l639 + local.get $l640 + i32.add + local.set $l641 + local.get $l640 + local.get $l641 + i32.add + local.set $l642 + local.get $l641 + local.get $l642 + i32.add + local.set $l643 + local.get $l642 + local.get $l643 + i32.add + local.set $l644 + local.get $l643 + local.get $l644 + i32.add + local.set $l645 + local.get $l644 + local.get $l645 + i32.add + local.set $l646 + local.get $l645 + local.get $l646 + i32.add + local.set $l647 + local.get $l646 + local.get $l647 + i32.add + local.set $l648 + local.get $l647 + local.get $l648 + i32.add + local.set $l649 + local.get $l648 + local.get $l649 + i32.add + local.set $l650 + local.get $l649 + local.get $l650 + i32.add + local.set $l651 + local.get $l650 + local.get $l651 + i32.add + local.set $l652 + local.get $l651 + local.get $l652 + i32.add + local.set $l653 + local.get $l652 + local.get $l653 + i32.add + local.set $l654 + local.get $l653 + local.get $l654 + i32.add + local.set $l655 + local.get $l654 + local.get $l655 + i32.add + local.set $l656 + local.get $l655 + local.get $l656 + i32.add + local.set $l657 + local.get $l656 + local.get $l657 + i32.add + local.set $l658 + local.get $l657 + local.get $l658 + i32.add + local.set $l659 + local.get $l658 + local.get $l659 + i32.add + local.set $l660 + local.get $l659 + local.get $l660 + i32.add + local.set $l661 + local.get $l660 + local.get $l661 + i32.add + local.set $l662 + local.get $l661 + local.get $l662 + i32.add + local.set $l663 + local.get $l662 + local.get $l663 + i32.add + local.set $l664 + local.get $l663 + local.get $l664 + i32.add + local.set $l665 + local.get $l664 + local.get $l665 + i32.add + local.set $l666 + local.get $l665 + local.get $l666 + i32.add + local.set $l667 + local.get $l666 + local.get $l667 + i32.add + local.set $l668 + local.get $l667 + local.get $l668 + i32.add + local.set $l669 + local.get $l668 + local.get $l669 + i32.add + local.set $l670 + local.get $l669 + local.get $l670 + i32.add + local.set $l671 + local.get $l670 + local.get $l671 + i32.add + local.set $l672 + local.get $l671 + local.get $l672 + i32.add + local.set $l673 + local.get $l672 + local.get $l673 + i32.add + local.set $l674 + local.get $l673 + local.get $l674 + i32.add + local.set $l675 + local.get $l674 + local.get $l675 + i32.add + local.set $l676 + local.get $l675 + local.get $l676 + i32.add + local.set $l677 + local.get $l676 + local.get $l677 + i32.add + local.set $l678 + local.get $l677 + local.get $l678 + i32.add + local.set $l679 + local.get $l678 + local.get $l679 + i32.add + local.set $l680 + local.get $l679 + local.get $l680 + i32.add + local.set $l681 + local.get $l680 + local.get $l681 + i32.add + local.set $l682 + local.get $l681 + local.get $l682 + i32.add + local.set $l683 + local.get $l682 + local.get $l683 + i32.add + local.set $l684 + local.get $l683 + local.get $l684 + i32.add + local.set $l685 + local.get $l684 + local.get $l685 + i32.add + local.set $l686 + local.get $l685 + local.get $l686 + i32.add + local.set $l687 + local.get $l686 + local.get $l687 + i32.add + local.set $l688 + local.get $l687 + local.get $l688 + i32.add + local.set $l689 + local.get $l688 + local.get $l689 + i32.add + local.set $l690 + local.get $l689 + local.get $l690 + i32.add + local.set $l691 + local.get $l690 + local.get $l691 + i32.add + local.set $l692 + local.get $l691 + local.get $l692 + i32.add + local.set $l693 + local.get $l692 + local.get $l693 + i32.add + local.set $l694 + local.get $l693 + local.get $l694 + i32.add + local.set $l695 + local.get $l694 + local.get $l695 + i32.add + local.set $l696 + local.get $l695 + local.get $l696 + i32.add + local.set $l697 + local.get $l696 + local.get $l697 + i32.add + local.set $l698 + local.get $l697 + local.get $l698 + i32.add + local.set $l699 + local.get $l698 + local.get $l699 + i32.add + local.set $l700 + local.get $l699 + local.get $l700 + i32.add + local.set $l701 + local.get $l700 + local.get $l701 + i32.add + local.set $l702 + local.get $l701 + local.get $l702 + i32.add + local.set $l703 + local.get $l702 + local.get $l703 + i32.add + local.set $l704 + local.get $l703 + local.get $l704 + i32.add + local.set $l705 + local.get $l704 + local.get $l705 + i32.add + local.set $l706 + local.get $l705 + local.get $l706 + i32.add + local.set $l707 + local.get $l706 + local.get $l707 + i32.add + local.set $l708 + local.get $l707 + local.get $l708 + i32.add + local.set $l709 + local.get $l708 + local.get $l709 + i32.add + local.set $l710 + local.get $l709 + local.get $l710 + i32.add + local.set $l711 + local.get $l710 + local.get $l711 + i32.add + local.set $l712 + local.get $l711 + local.get $l712 + i32.add + local.set $l713 + local.get $l712 + local.get $l713 + i32.add + local.set $l714 + local.get $l713 + local.get $l714 + i32.add + local.set $l715 + local.get $l714 + local.get $l715 + i32.add + local.set $l716 + local.get $l715 + local.get $l716 + i32.add + local.set $l717 + local.get $l716 + local.get $l717 + i32.add + local.set $l718 + local.get $l717 + local.get $l718 + i32.add + local.set $l719 + local.get $l718 + local.get $l719 + i32.add + local.set $l720 + local.get $l719 + local.get $l720 + i32.add + local.set $l721 + local.get $l720 + local.get $l721 + i32.add + local.set $l722 + local.get $l721 + local.get $l722 + i32.add + local.set $l723 + local.get $l722 + local.get $l723 + i32.add + local.set $l724 + local.get $l723 + local.get $l724 + i32.add + local.set $l725 + local.get $l724 + local.get $l725 + i32.add + local.set $l726 + local.get $l725 + local.get $l726 + i32.add + local.set $l727 + local.get $l726 + local.get $l727 + i32.add + local.set $l728 + local.get $l727 + local.get $l728 + i32.add + local.set $l729 + local.get $l728 + local.get $l729 + i32.add + local.set $l730 + local.get $l729 + local.get $l730 + i32.add + local.set $l731 + local.get $l730 + local.get $l731 + i32.add + local.set $l732 + local.get $l731 + local.get $l732 + i32.add + local.set $l733 + local.get $l732 + local.get $l733 + i32.add + local.set $l734 + local.get $l733 + local.get $l734 + i32.add + local.set $l735 + local.get $l734 + local.get $l735 + i32.add + local.set $l736 + local.get $l735 + local.get $l736 + i32.add + local.set $l737 + local.get $l736 + local.get $l737 + i32.add + local.set $l738 + local.get $l737 + local.get $l738 + i32.add + local.set $l739 + local.get $l738 + local.get $l739 + i32.add + local.set $l740 + local.get $l739 + local.get $l740 + i32.add + local.set $l741 + local.get $l740 + local.get $l741 + i32.add + local.set $l742 + local.get $l741 + local.get $l742 + i32.add + local.set $l743 + local.get $l742 + local.get $l743 + i32.add + local.set $l744 + local.get $l743 + local.get $l744 + i32.add + local.set $l745 + local.get $l744 + local.get $l745 + i32.add + local.set $l746 + local.get $l745 + local.get $l746 + i32.add + local.set $l747 + local.get $l746 + local.get $l747 + i32.add + local.set $l748 + local.get $l747 + local.get $l748 + i32.add + local.set $l749 + local.get $l748 + local.get $l749 + i32.add + local.set $l750 + local.get $l749 + local.get $l750 + i32.add + local.set $l751 + local.get $l750 + local.get $l751 + i32.add + local.set $l752 + local.get $l751 + local.get $l752 + i32.add + local.set $l753 + local.get $l752 + local.get $l753 + i32.add + local.set $l754 + local.get $l753 + local.get $l754 + i32.add + local.set $l755 + local.get $l754 + local.get $l755 + i32.add + local.set $l756 + local.get $l755 + local.get $l756 + i32.add + local.set $l757 + local.get $l756 + local.get $l757 + i32.add + local.set $l758 + local.get $l757 + local.get $l758 + i32.add + local.set $l759 + local.get $l758 + local.get $l759 + i32.add + local.set $l760 + local.get $l759 + local.get $l760 + i32.add + local.set $l761 + local.get $l760 + local.get $l761 + i32.add + local.set $l762 + local.get $l761 + local.get $l762 + i32.add + local.set $l763 + local.get $l762 + local.get $l763 + i32.add + local.set $l764 + local.get $l763 + local.get $l764 + i32.add + local.set $l765 + local.get $l764 + local.get $l765 + i32.add + local.set $l766 + local.get $l765 + local.get $l766 + i32.add + local.set $l767 + local.get $l766 + local.get $l767 + i32.add + local.set $l768 + local.get $l767 + local.get $l768 + i32.add + local.set $l769 + local.get $l768 + local.get $l769 + i32.add + local.set $l770 + local.get $l769 + local.get $l770 + i32.add + local.set $l771 + local.get $l770 + local.get $l771 + i32.add + local.set $l772 + local.get $l771 + local.get $l772 + i32.add + local.set $l773 + local.get $l772 + local.get $l773 + i32.add + local.set $l774 + local.get $l773 + local.get $l774 + i32.add + local.set $l775 + local.get $l774 + local.get $l775 + i32.add + local.set $l776 + local.get $l775 + local.get $l776 + i32.add + local.set $l777 + local.get $l776 + local.get $l777 + i32.add + local.set $l778 + local.get $l777 + local.get $l778 + i32.add + local.set $l779 + local.get $l778 + local.get $l779 + i32.add + local.set $l780 + local.get $l779 + local.get $l780 + i32.add + local.set $l781 + local.get $l780 + local.get $l781 + i32.add + local.set $l782 + local.get $l781 + local.get $l782 + i32.add + local.set $l783 + local.get $l782 + local.get $l783 + i32.add + local.set $l784 + local.get $l783 + local.get $l784 + i32.add + local.set $l785 + local.get $l784 + local.get $l785 + i32.add + local.set $l786 + local.get $l785 + local.get $l786 + i32.add + local.set $l787 + local.get $l786 + local.get $l787 + i32.add + local.set $l788 + local.get $l787 + local.get $l788 + i32.add + local.set $l789 + local.get $l788 + local.get $l789 + i32.add + local.set $l790 + local.get $l789 + local.get $l790 + i32.add + local.set $l791 + local.get $l790 + local.get $l791 + i32.add + local.set $l792 + local.get $l791 + local.get $l792 + i32.add + local.set $l793 + local.get $l792 + local.get $l793 + i32.add + local.set $l794 + local.get $l793 + local.get $l794 + i32.add + local.set $l795 + local.get $l794 + local.get $l795 + i32.add + local.set $l796 + local.get $l795 + local.get $l796 + i32.add + local.set $l797 + local.get $l796 + local.get $l797 + i32.add + local.set $l798 + local.get $l797 + local.get $l798 + i32.add + local.set $l799 + local.get $l798 + local.get $l799 + i32.add + local.set $l800 + local.get $l799 + local.get $l800 + i32.add + local.set $l801 + local.get $l800 + local.get $l801 + i32.add + local.set $l802 + local.get $l801 + local.get $l802 + i32.add + local.set $l803 + local.get $l802 + local.get $l803 + i32.add + local.set $l804 + local.get $l803 + local.get $l804 + i32.add + local.set $l805 + local.get $l804 + local.get $l805 + i32.add + local.set $l806 + local.get $l805 + local.get $l806 + i32.add + local.set $l807 + local.get $l806 + local.get $l807 + i32.add + local.set $l808 + local.get $l807 + local.get $l808 + i32.add + local.set $l809 + local.get $l808 + local.get $l809 + i32.add + local.set $l810 + local.get $l809 + local.get $l810 + i32.add + local.set $l811 + local.get $l810 + local.get $l811 + i32.add + local.set $l812 + local.get $l811 + local.get $l812 + i32.add + local.set $l813 + local.get $l812 + local.get $l813 + i32.add + local.set $l814 + local.get $l813 + local.get $l814 + i32.add + local.set $l815 + local.get $l814 + local.get $l815 + i32.add + local.set $l816 + local.get $l815 + local.get $l816 + i32.add + local.set $l817 + local.get $l816 + local.get $l817 + i32.add + local.set $l818 + local.get $l817 + local.get $l818 + i32.add + local.set $l819 + local.get $l818 + local.get $l819 + i32.add + local.set $l820 + local.get $l819 + local.get $l820 + i32.add + local.set $l821 + local.get $l820 + local.get $l821 + i32.add + local.set $l822 + local.get $l821 + local.get $l822 + i32.add + local.set $l823 + local.get $l822 + local.get $l823 + i32.add + local.set $l824 + local.get $l823 + local.get $l824 + i32.add + local.set $l825 + local.get $l824 + local.get $l825 + i32.add + local.set $l826 + local.get $l825 + local.get $l826 + i32.add + local.set $l827 + local.get $l826 + local.get $l827 + i32.add + local.set $l828 + local.get $l827 + local.get $l828 + i32.add + local.set $l829 + local.get $l828 + local.get $l829 + i32.add + local.set $l830 + local.get $l829 + local.get $l830 + i32.add + local.set $l831 + local.get $l830 + local.get $l831 + i32.add + local.set $l832 + local.get $l831 + local.get $l832 + i32.add + local.set $l833 + local.get $l832 + local.get $l833 + i32.add + local.set $l834 + local.get $l833 + local.get $l834 + i32.add + local.set $l835 + local.get $l834 + local.get $l835 + i32.add + local.set $l836 + local.get $l835 + local.get $l836 + i32.add + local.set $l837 + local.get $l836 + local.get $l837 + i32.add + local.set $l838 + local.get $l837 + local.get $l838 + i32.add + local.set $l839 + local.get $l838 + local.get $l839 + i32.add + local.set $l840 + local.get $l839 + local.get $l840 + i32.add + local.set $l841 + local.get $l840 + local.get $l841 + i32.add + local.set $l842 + local.get $l841 + local.get $l842 + i32.add + local.set $l843 + local.get $l842 + local.get $l843 + i32.add + local.set $l844 + local.get $l843 + local.get $l844 + i32.add + local.set $l845 + local.get $l844 + local.get $l845 + i32.add + local.set $l846 + local.get $l845 + local.get $l846 + i32.add + local.set $l847 + local.get $l846 + local.get $l847 + i32.add + local.set $l848 + local.get $l847 + local.get $l848 + i32.add + local.set $l849 + local.get $l848 + local.get $l849 + i32.add + local.set $l850 + local.get $l849 + local.get $l850 + i32.add + local.set $l851 + local.get $l850 + local.get $l851 + i32.add + local.set $l852 + local.get $l851 + local.get $l852 + i32.add + local.set $l853 + local.get $l852 + local.get $l853 + i32.add + local.set $l854 + local.get $l853 + local.get $l854 + i32.add + local.set $l855 + local.get $l854 + local.get $l855 + i32.add + local.set $l856 + local.get $l855 + local.get $l856 + i32.add + local.set $l857 + local.get $l856 + local.get $l857 + i32.add + local.set $l858 + local.get $l857 + local.get $l858 + i32.add + local.set $l859 + local.get $l858 + local.get $l859 + i32.add + local.set $l860 + local.get $l859 + local.get $l860 + i32.add + local.set $l861 + local.get $l860 + local.get $l861 + i32.add + local.set $l862 + local.get $l861 + local.get $l862 + i32.add + local.set $l863 + local.get $l862 + local.get $l863 + i32.add + local.set $l864 + local.get $l863 + local.get $l864 + i32.add + local.set $l865 + local.get $l864 + local.get $l865 + i32.add + local.set $l866 + local.get $l865 + local.get $l866 + i32.add + local.set $l867 + local.get $l866 + local.get $l867 + i32.add + local.set $l868 + local.get $l867 + local.get $l868 + i32.add + local.set $l869 + local.get $l868 + local.get $l869 + i32.add + local.set $l870 + local.get $l869 + local.get $l870 + i32.add + local.set $l871 + local.get $l870 + local.get $l871 + i32.add + local.set $l872 + local.get $l871 + local.get $l872 + i32.add + local.set $l873 + local.get $l872 + local.get $l873 + i32.add + local.set $l874 + local.get $l873 + local.get $l874 + i32.add + local.set $l875 + local.get $l874 + local.get $l875 + i32.add + local.set $l876 + local.get $l875 + local.get $l876 + i32.add + local.set $l877 + local.get $l876 + local.get $l877 + i32.add + local.set $l878 + local.get $l877 + local.get $l878 + i32.add + local.set $l879 + local.get $l878 + local.get $l879 + i32.add + local.set $l880 + local.get $l879 + local.get $l880 + i32.add + local.set $l881 + local.get $l880 + local.get $l881 + i32.add + local.set $l882 + local.get $l881 + local.get $l882 + i32.add + local.set $l883 + local.get $l882 + local.get $l883 + i32.add + local.set $l884 + local.get $l883 + local.get $l884 + i32.add + local.set $l885 + local.get $l884 + local.get $l885 + i32.add + local.set $l886 + local.get $l885 + local.get $l886 + i32.add + local.set $l887 + local.get $l886 + local.get $l887 + i32.add + local.set $l888 + local.get $l887 + local.get $l888 + i32.add + local.set $l889 + local.get $l888 + local.get $l889 + i32.add + local.set $l890 + local.get $l889 + local.get $l890 + i32.add + local.set $l891 + local.get $l890 + local.get $l891 + i32.add + local.set $l892 + local.get $l891 + local.get $l892 + i32.add + local.set $l893 + local.get $l892 + local.get $l893 + i32.add + local.set $l894 + local.get $l893 + local.get $l894 + i32.add + local.set $l895 + local.get $l894 + local.get $l895 + i32.add + local.set $l896 + local.get $l895 + local.get $l896 + i32.add + local.set $l897 + local.get $l896 + local.get $l897 + i32.add + local.set $l898 + local.get $l897 + local.get $l898 + i32.add + local.set $l899 + local.get $l898 + local.get $l899 + i32.add + local.set $l900 + local.get $l899 + local.get $l900 + i32.add + local.set $l901 + local.get $l900 + local.get $l901 + i32.add + local.set $l902 + local.get $l901 + local.get $l902 + i32.add + local.set $l903 + local.get $l902 + local.get $l903 + i32.add + local.set $l904 + local.get $l903 + local.get $l904 + i32.add + local.set $l905 + local.get $l904 + local.get $l905 + i32.add + local.set $l906 + local.get $l905 + local.get $l906 + i32.add + local.set $l907 + local.get $l906 + local.get $l907 + i32.add + local.set $l908 + local.get $l907 + local.get $l908 + i32.add + local.set $l909 + local.get $l908 + local.get $l909 + i32.add + local.set $l910 + local.get $l909 + local.get $l910 + i32.add + local.set $l911 + local.get $l910 + local.get $l911 + i32.add + local.set $l912 + local.get $l911 + local.get $l912 + i32.add + local.set $l913 + local.get $l912 + local.get $l913 + i32.add + local.set $l914 + local.get $l913 + local.get $l914 + i32.add + local.set $l915 + local.get $l914 + local.get $l915 + i32.add + local.set $l916 + local.get $l915 + local.get $l916 + i32.add + local.set $l917 + local.get $l916 + local.get $l917 + i32.add + local.set $l918 + local.get $l917 + local.get $l918 + i32.add + local.set $l919 + local.get $l918 + local.get $l919 + i32.add + local.set $l920 + local.get $l919 + local.get $l920 + i32.add + local.set $l921 + local.get $l920 + local.get $l921 + i32.add + local.set $l922 + local.get $l921 + local.get $l922 + i32.add + local.set $l923 + local.get $l922 + local.get $l923 + i32.add + local.set $l924 + local.get $l923 + local.get $l924 + i32.add + local.set $l925 + local.get $l924 + local.get $l925 + i32.add + local.set $l926 + local.get $l925 + local.get $l926 + i32.add + local.set $l927 + local.get $l926 + local.get $l927 + i32.add + local.set $l928 + local.get $l927 + local.get $l928 + i32.add + local.set $l929 + local.get $l928 + local.get $l929 + i32.add + local.set $l930 + local.get $l929 + local.get $l930 + i32.add + local.set $l931 + local.get $l930 + local.get $l931 + i32.add + local.set $l932 + local.get $l931 + local.get $l932 + i32.add + local.set $l933 + local.get $l932 + local.get $l933 + i32.add + local.set $l934 + local.get $l933 + local.get $l934 + i32.add + local.set $l935 + local.get $l934 + local.get $l935 + i32.add + local.set $l936 + local.get $l935 + local.get $l936 + i32.add + local.set $l937 + local.get $l936 + local.get $l937 + i32.add + local.set $l938 + local.get $l937 + local.get $l938 + i32.add + local.set $l939 + local.get $l938 + local.get $l939 + i32.add + local.set $l940 + local.get $l939 + local.get $l940 + i32.add + local.set $l941 + local.get $l940 + local.get $l941 + i32.add + local.set $l942 + local.get $l941 + local.get $l942 + i32.add + local.set $l943 + local.get $l942 + local.get $l943 + i32.add + local.set $l944 + local.get $l943 + local.get $l944 + i32.add + local.set $l945 + local.get $l944 + local.get $l945 + i32.add + local.set $l946 + local.get $l945 + local.get $l946 + i32.add + local.set $l947 + local.get $l946 + local.get $l947 + i32.add + local.set $l948 + local.get $l947 + local.get $l948 + i32.add + local.set $l949 + local.get $l948 + local.get $l949 + i32.add + local.set $l950 + local.get $l949 + local.get $l950 + i32.add + local.set $l951 + local.get $l950 + local.get $l951 + i32.add + local.set $l952 + local.get $l951 + local.get $l952 + i32.add + local.set $l953 + local.get $l952 + local.get $l953 + i32.add + local.set $l954 + local.get $l953 + local.get $l954 + i32.add + local.set $l955 + local.get $l954 + local.get $l955 + i32.add + local.set $l956 + local.get $l955 + local.get $l956 + i32.add + local.set $l957 + local.get $l956 + local.get $l957 + i32.add + local.set $l958 + local.get $l957 + local.get $l958 + i32.add + local.set $l959 + local.get $l958 + local.get $l959 + i32.add + local.set $l960 + local.get $l959 + local.get $l960 + i32.add + local.set $l961 + local.get $l960 + local.get $l961 + i32.add + local.set $l962 + local.get $l961 + local.get $l962 + i32.add + local.set $l963 + local.get $l962 + local.get $l963 + i32.add + local.set $l964 + local.get $l963 + local.get $l964 + i32.add + local.set $l965 + local.get $l964 + local.get $l965 + i32.add + local.set $l966 + local.get $l965 + local.get $l966 + i32.add + local.set $l967 + local.get $l966 + local.get $l967 + i32.add + local.set $l968 + local.get $l967 + local.get $l968 + i32.add + local.set $l969 + local.get $l968 + local.get $l969 + i32.add + local.set $l970 + local.get $l969 + local.get $l970 + i32.add + local.set $l971 + local.get $l970 + local.get $l971 + i32.add + local.set $l972 + local.get $l971 + local.get $l972 + i32.add + local.set $l973 + local.get $l972 + local.get $l973 + i32.add + local.set $l974 + local.get $l973 + local.get $l974 + i32.add + local.set $l975 + local.get $l974 + local.get $l975 + i32.add + local.set $l976 + local.get $l975 + local.get $l976 + i32.add + local.set $l977 + local.get $l976 + local.get $l977 + i32.add + local.set $l978 + local.get $l977 + local.get $l978 + i32.add + local.set $l979 + local.get $l978 + local.get $l979 + i32.add + local.set $l980 + local.get $l979 + local.get $l980 + i32.add + local.set $l981 + local.get $l980 + local.get $l981 + i32.add + local.set $l982 + local.get $l981 + local.get $l982 + i32.add + local.set $l983 + local.get $l982 + local.get $l983 + i32.add + local.set $l984 + local.get $l983 + local.get $l984 + i32.add + local.set $l985 + local.get $l984 + local.get $l985 + i32.add + local.set $l986 + local.get $l985 + local.get $l986 + i32.add + local.set $l987 + local.get $l986 + local.get $l987 + i32.add + local.set $l988 + local.get $l987 + local.get $l988 + i32.add + local.set $l989 + local.get $l988 + local.get $l989 + i32.add + local.set $l990 + local.get $l989 + local.get $l990 + i32.add + local.set $l991 + local.get $l990 + local.get $l991 + i32.add + local.set $l992 + local.get $l991 + local.get $l992 + i32.add + local.set $l993 + local.get $l992 + local.get $l993 + i32.add + local.set $l994 + local.get $l993 + local.get $l994 + i32.add + local.set $l995 + local.get $l994 + local.get $l995 + i32.add + local.set $l996 + local.get $l995 + local.get $l996 + i32.add + local.set $l997 + local.get $l996 + local.get $l997 + i32.add + local.set $l998 + local.get $l997 + local.get $l998 + i32.add + local.set $l999 + local.get $l998 + local.get $l999 + i32.add + local.set $l1000 + local.get $l999 + local.get $l1000 + i32.add + local.set $l1001 + local.get $l1000 + local.get $l1001 + i32.add + local.set $l1002 + local.get $l1001 + local.get $l1002 + i32.add + local.set $l1003 + local.get $l1002 + local.get $l1003 + i32.add + local.set $l1004 + local.get $l1003 + local.get $l1004 + i32.add + local.set $l1005 + local.get $l1004 + local.get $l1005 + i32.add + local.set $l1006 + local.get $l1005 + local.get $l1006 + i32.add + local.set $l1007 + local.get $l1006 + local.get $l1007 + i32.add + local.set $l1008 + local.get $l1007 + local.get $l1008 + i32.add + local.set $l1009 + local.get $l1008 + local.get $l1009 + i32.add + local.set $l1010 + local.get $l1009 + local.get $l1010 + i32.add + local.set $l1011 + local.get $l1010 + local.get $l1011 + i32.add + local.set $l1012 + local.get $l1011 + local.get $l1012 + i32.add + local.set $l1013 + local.get $l1012 + local.get $l1013 + i32.add + local.set $l1014 + local.get $l1013 + local.get $l1014 + i32.add + local.set $l1015 + local.get $l1014 + local.get $l1015 + i32.add + local.set $l1016 + local.get $l1015 + local.get $l1016 + i32.add + local.set $l1017 + local.get $l1016 + local.get $l1017 + i32.add + local.set $l1018 + local.get $l1017 + local.get $l1018 + i32.add + local.set $l1019 + local.get $l1018 + local.get $l1019 + i32.add + local.set $l1020 + local.get $l1019 + local.get $l1020 + i32.add + local.set $l1021 + local.get $l1020 + local.get $l1021 + i32.add + local.set $l1022 + local.get $l1021 + local.get $l1022 + i32.add + local.set $l1023 + local.get $l1022 + local.get $l1023 + i32.add + local.set $l1024 + local.get $l1023 + local.get $l1024 + i32.add + local.set $l1025 + local.get $l1024 + local.get $l1025 + i32.add + local.set $l1026 + local.get $l1025 + local.get $l1026 + i32.add + local.set $l1027 + local.get $l1026 + local.get $l1027 + i32.add + local.set $l1028 + local.get $l1027 + local.get $l1028 + i32.add + local.set $l1029 + local.get $l1028 + local.get $l1029 + i32.add + local.set $l1030 + local.get $l1029 + local.get $l1030 + i32.add + local.set $l1031 + local.get $l1030 + local.get $l1031 + i32.add + local.set $l1032 + local.get $l1031 + local.get $l1032 + i32.add + local.set $l1033 + local.get $l1032 + local.get $l1033 + i32.add + local.set $l1034 + local.get $l1033 + local.get $l1034 + i32.add + local.set $l1035 + local.get $l1034 + local.get $l1035 + i32.add + local.set $l1036 + local.get $l1035 + local.get $l1036 + i32.add + local.set $l1037 + local.get $l1036 + local.get $l1037 + i32.add + local.set $l1038 + local.get $l1037 + local.get $l1038 + i32.add + local.set $l1039 + local.get $l1038 + local.get $l1039 + i32.add + local.set $l1040 + local.get $l1039 + local.get $l1040 + i32.add + local.set $l1041 + local.get $l1040 + local.get $l1041 + i32.add + local.set $l1042 + local.get $l1041 + local.get $l1042 + i32.add + local.set $l1043 + local.get $l1042 + local.get $l1043 + i32.add + local.set $l1044 + local.get $l1043 + local.get $l1044 + i32.add + local.set $l1045 + local.get $l1044 + local.get $l1045 + i32.add + local.set $l1046 + local.get $l1045 + local.get $l1046 + i32.add + local.set $l1047 + local.get $l1046 + local.get $l1047 + i32.add + local.set $l1048 + local.get $l1047 + local.get $l1048 + i32.add + local.set $l1049 + local.get $l1048 + local.get $l1049 + i32.add + local.set $l1050 + local.get $l1049 + local.get $l1050 + i32.add + local.set $l1051 + local.get $l1050 + local.get $l1051 + i32.add + local.set $l1052 + local.get $l1051 + local.get $l1052 + i32.add + local.set $l1053 + local.get $l1052 + local.get $l1053 + i32.add + local.set $l1054 + local.get $l1053 + local.get $l1054 + i32.add + local.set $l1055 + local.get $l1054 + local.get $l1055 + i32.add + local.set $l1056 + local.get $l1055 + local.get $l1056 + i32.add + local.set $l1057 + local.get $l1056 + local.get $l1057 + i32.add + local.set $l1058 + local.get $l1057 + local.get $l1058 + i32.add + local.set $l1059 + local.get $l1058 + local.get $l1059 + i32.add + local.set $l1060 + local.get $l1059 + local.get $l1060 + i32.add + local.set $l1061 + local.get $l1060 + local.get $l1061 + i32.add + local.set $l1062 + local.get $l1061 + local.get $l1062 + i32.add + local.set $l1063 + local.get $l1062 + local.get $l1063 + i32.add + local.set $l1064 + local.get $l1063 + local.get $l1064 + i32.add + local.set $l1065 + local.get $l1064 + local.get $l1065 + i32.add + local.set $l1066 + local.get $l1065 + local.get $l1066 + i32.add + local.set $l1067 + local.get $l1066 + local.get $l1067 + i32.add + local.set $l1068 + local.get $l1067 + local.get $l1068 + i32.add + local.set $l1069 + local.get $l1068 + local.get $l1069 + i32.add + local.set $l1070 + local.get $l1069 + local.get $l1070 + i32.add + local.set $l1071 + local.get $l1070 + local.get $l1071 + i32.add + local.set $l1072 + local.get $l1071 + local.get $l1072 + i32.add + local.set $l1073 + local.get $l1072 + local.get $l1073 + i32.add + local.set $l1074 + local.get $l1073 + local.get $l1074 + i32.add + local.set $l1075 + local.get $l1074 + local.get $l1075 + i32.add + local.set $l1076 + local.get $l1075 + local.get $l1076 + i32.add + local.set $l1077 + local.get $l1076 + local.get $l1077 + i32.add + local.set $l1078 + local.get $l1077 + local.get $l1078 + i32.add + local.set $l1079 + local.get $l1078 + local.get $l1079 + i32.add + local.set $l1080 + local.get $l1079 + local.get $l1080 + i32.add + local.set $l1081 + local.get $l1080 + local.get $l1081 + i32.add + local.set $l1082 + local.get $l1081 + local.get $l1082 + i32.add + local.set $l1083 + local.get $l1082 + local.get $l1083 + i32.add + local.set $l1084 + local.get $l1083 + local.get $l1084 + i32.add + local.set $l1085 + local.get $l1084 + local.get $l1085 + i32.add + local.set $l1086 + local.get $l1085 + local.get $l1086 + i32.add + local.set $l1087 + local.get $l1086 + local.get $l1087 + i32.add + local.set $l1088 + local.get $l1087 + local.get $l1088 + i32.add + local.set $l1089 + local.get $l1088 + local.get $l1089 + i32.add + local.set $l1090 + local.get $l1089 + local.get $l1090 + i32.add + local.set $l1091 + local.get $l1090 + local.get $l1091 + i32.add + local.set $l1092 + local.get $l1091 + local.get $l1092 + i32.add + local.set $l1093 + local.get $l1092 + local.get $l1093 + i32.add + local.set $l1094 + local.get $l1093 + local.get $l1094 + i32.add + local.set $l1095 + local.get $l1094 + local.get $l1095 + i32.add + local.set $l1096 + local.get $l1095 + local.get $l1096 + i32.add + local.set $l1097 + local.get $l1096 + local.get $l1097 + i32.add + local.set $l1098 + local.get $l1097 + local.get $l1098 + i32.add + local.set $l1099 + local.get $l1098 + local.get $l1099 + i32.add + local.set $l1100 + local.get $l1099 + local.get $l1100 + i32.add + local.set $l1101 + local.get $l1100 + local.get $l1101 + i32.add + local.set $l1102 + local.get $l1101 + local.get $l1102 + i32.add + local.set $l1103 + local.get $l1102 + local.get $l1103 + i32.add + local.set $l1104 + local.get $l1103 + local.get $l1104 + i32.add + local.set $l1105 + local.get $l1104 + local.get $l1105 + i32.add + local.set $l1106 + local.get $l1105 + local.get $l1106 + i32.add + local.set $l1107 + local.get $l1106 + local.get $l1107 + i32.add + local.set $l1108 + local.get $l1107 + local.get $l1108 + i32.add + local.set $l1109 + local.get $l1108 + local.get $l1109 + i32.add + local.set $l1110 + local.get $l1109 + local.get $l1110 + i32.add + local.set $l1111 + local.get $l1110 + local.get $l1111 + i32.add + local.set $l1112 + local.get $l1111 + local.get $l1112 + i32.add + local.set $l1113 + local.get $l1112 + local.get $l1113 + i32.add + local.set $l1114 + local.get $l1113 + local.get $l1114 + i32.add + local.set $l1115 + local.get $l1114 + local.get $l1115 + i32.add + local.set $l1116 + local.get $l1115 + local.get $l1116 + i32.add + local.set $l1117 + local.get $l1116 + local.get $l1117 + i32.add + local.set $l1118 + local.get $l1117 + local.get $l1118 + i32.add + local.set $l1119 + local.get $l1118 + local.get $l1119 + i32.add + local.set $l1120 + local.get $l1119 + local.get $l1120 + i32.add + local.set $l1121 + local.get $l1120 + local.get $l1121 + i32.add + local.set $l1122 + local.get $l1121 + local.get $l1122 + i32.add + local.set $l1123 + local.get $l1122 + local.get $l1123 + i32.add + local.set $l1124 + local.get $l1123 + local.get $l1124 + i32.add + local.set $l1125 + local.get $l1124 + local.get $l1125 + i32.add + local.set $l1126 + local.get $l1125 + local.get $l1126 + i32.add + local.set $l1127 + local.get $l1126 + local.get $l1127 + i32.add + local.set $l1128 + local.get $l1127 + local.get $l1128 + i32.add + local.set $l1129 + local.get $l1128 + local.get $l1129 + i32.add + local.set $l1130 + local.get $l1129 + local.get $l1130 + i32.add + local.set $l1131 + local.get $l1130 + local.get $l1131 + i32.add + local.set $l1132 + local.get $l1131 + local.get $l1132 + i32.add + local.set $l1133 + local.get $l1132 + local.get $l1133 + i32.add + local.set $l1134 + local.get $l1133 + local.get $l1134 + i32.add + local.set $l1135 + local.get $l1134 + local.get $l1135 + i32.add + local.set $l1136 + local.get $l1135 + local.get $l1136 + i32.add + local.set $l1137 + local.get $l1136 + local.get $l1137 + i32.add + local.set $l1138 + local.get $l1137 + local.get $l1138 + i32.add + local.set $l1139 + local.get $l1138 + local.get $l1139 + i32.add + local.set $l1140 + local.get $l1139 + local.get $l1140 + i32.add + local.set $l1141 + local.get $l1140 + local.get $l1141 + i32.add + local.set $l1142 + local.get $l1141 + local.get $l1142 + i32.add + local.set $l1143 + local.get $l1142 + local.get $l1143 + i32.add + local.set $l1144 + local.get $l1143 + local.get $l1144 + i32.add + local.set $l1145 + local.get $l1144 + local.get $l1145 + i32.add + local.set $l1146 + local.get $l1145 + local.get $l1146 + i32.add + local.set $l1147 + local.get $l1146 + local.get $l1147 + i32.add + local.set $l1148 + local.get $l1147 + local.get $l1148 + i32.add + local.set $l1149 + local.get $l1148 + local.get $l1149 + i32.add + local.set $l1150 + local.get $l1149 + local.get $l1150 + i32.add + local.set $l1151 + local.get $l1150 + local.get $l1151 + i32.add + local.set $l1152 + local.get $l1151 + local.get $l1152 + i32.add + local.set $l1153 + local.get $l1152 + local.get $l1153 + i32.add + local.set $l1154 + local.get $l1153 + local.get $l1154 + i32.add + local.set $l1155 + local.get $l1154 + local.get $l1155 + i32.add + local.set $l1156 + local.get $l1155 + local.get $l1156 + i32.add + local.set $l1157 + local.get $l1156 + local.get $l1157 + i32.add + local.set $l1158 + local.get $l1157 + local.get $l1158 + i32.add + local.set $l1159 + local.get $l1158 + local.get $l1159 + i32.add + local.set $l1160 + local.get $l1159 + local.get $l1160 + i32.add + local.set $l1161 + local.get $l1160 + local.get $l1161 + i32.add + local.set $l1162 + local.get $l1161 + local.get $l1162 + i32.add + local.set $l1163 + local.get $l1162 + local.get $l1163 + i32.add + local.set $l1164 + local.get $l1163 + local.get $l1164 + i32.add + local.set $l1165 + local.get $l1164 + local.get $l1165 + i32.add + local.set $l1166 + local.get $l1165 + local.get $l1166 + i32.add + local.set $l1167 + local.get $l1166 + local.get $l1167 + i32.add + local.set $l1168 + local.get $l1167 + local.get $l1168 + i32.add + local.set $l1169 + local.get $l1168 + local.get $l1169 + i32.add + local.set $l1170 + local.get $l1169 + local.get $l1170 + i32.add + local.set $l1171 + local.get $l1170 + local.get $l1171 + i32.add + local.set $l1172 + local.get $l1171 + local.get $l1172 + i32.add + local.set $l1173 + local.get $l1172 + local.get $l1173 + i32.add + local.set $l1174 + local.get $l1173 + local.get $l1174 + i32.add + local.set $l1175 + local.get $l1174 + local.get $l1175 + i32.add + local.set $l1176 + local.get $l1175 + local.get $l1176 + i32.add + local.set $l1177 + local.get $l1176 + local.get $l1177 + i32.add + local.set $l1178 + local.get $l1177 + local.get $l1178 + i32.add + local.set $l1179 + local.get $l1178 + local.get $l1179 + i32.add + local.set $l1180 + local.get $l1179 + local.get $l1180 + i32.add + local.set $l1181 + local.get $l1180 + local.get $l1181 + i32.add + local.set $l1182 + local.get $l1181 + local.get $l1182 + i32.add + local.set $l1183 + local.get $l1182 + local.get $l1183 + i32.add + local.set $l1184 + local.get $l1183 + local.get $l1184 + i32.add + local.set $l1185 + local.get $l1184 + local.get $l1185 + i32.add + local.set $l1186 + local.get $l1185 + local.get $l1186 + i32.add + local.set $l1187 + local.get $l1186 + local.get $l1187 + i32.add + local.set $l1188 + local.get $l1187 + local.get $l1188 + i32.add + local.set $l1189 + local.get $l1188 + local.get $l1189 + i32.add + local.set $l1190 + local.get $l1189 + local.get $l1190 + i32.add + local.set $l1191 + local.get $l1190 + local.get $l1191 + i32.add + local.set $l1192 + local.get $l1191 + local.get $l1192 + i32.add + local.set $l1193 + local.get $l1192 + local.get $l1193 + i32.add + local.set $l1194 + local.get $l1193 + local.get $l1194 + i32.add + local.set $l1195 + local.get $l1194 + local.get $l1195 + i32.add + local.set $l1196 + local.get $l1195 + local.get $l1196 + i32.add + local.set $l1197 + local.get $l1196 + local.get $l1197 + i32.add + local.set $l1198 + local.get $l1197 + local.get $l1198 + i32.add + local.set $l1199 + local.get $l1198 + local.get $l1199 + i32.add + local.set $l1200 + local.get $l1199 + local.get $l1200 + i32.add + local.set $l1201 + local.get $l1200 + local.get $l1201 + i32.add + local.set $l1202 + local.get $l1201 + local.get $l1202 + i32.add + local.set $l1203 + local.get $l1202 + local.get $l1203 + i32.add + local.set $l1204 + local.get $l1203 + local.get $l1204 + i32.add + local.set $l1205 + local.get $l1204 + local.get $l1205 + i32.add + local.set $l1206 + local.get $l1205 + local.get $l1206 + i32.add + local.set $l1207 + local.get $l1206 + local.get $l1207 + i32.add + local.set $l1208 + local.get $l1207 + local.get $l1208 + i32.add + local.set $l1209 + local.get $l1208 + local.get $l1209 + i32.add + local.set $l1210 + local.get $l1209 + local.get $l1210 + i32.add + local.set $l1211 + local.get $l1210 + local.get $l1211 + i32.add + local.set $l1212 + local.get $l1211 + local.get $l1212 + i32.add + local.set $l1213 + local.get $l1212 + local.get $l1213 + i32.add + local.set $l1214 + local.get $l1213 + local.get $l1214 + i32.add + local.set $l1215 + local.get $l1214 + local.get $l1215 + i32.add + local.set $l1216 + local.get $l1215 + local.get $l1216 + i32.add + local.set $l1217 + local.get $l1216 + local.get $l1217 + i32.add + local.set $l1218 + local.get $l1217 + local.get $l1218 + i32.add + local.set $l1219 + local.get $l1218 + local.get $l1219 + i32.add + local.set $l1220 + local.get $l1219 + local.get $l1220 + i32.add + local.set $l1221 + local.get $l1220 + local.get $l1221 + i32.add + local.set $l1222 + local.get $l1221 + local.get $l1222 + i32.add + local.set $l1223 + local.get $l1222 + local.get $l1223 + i32.add + local.set $l1224 + local.get $l1223 + local.get $l1224 + i32.add + local.set $l1225 + local.get $l1224 + local.get $l1225 + i32.add + local.set $l1226 + local.get $l1225 + local.get $l1226 + i32.add + local.set $l1227 + local.get $l1226 + local.get $l1227 + i32.add + local.set $l1228 + local.get $l1227 + local.get $l1228 + i32.add + local.set $l1229 + local.get $l1228 + local.get $l1229 + i32.add + local.set $l1230 + local.get $l1229 + local.get $l1230 + i32.add + local.set $l1231 + local.get $l1230 + local.get $l1231 + i32.add + local.set $l1232 + local.get $l1231 + local.get $l1232 + i32.add + local.set $l1233 + local.get $l1232 + local.get $l1233 + i32.add + local.set $l1234 + local.get $l1233 + local.get $l1234 + i32.add + local.set $l1235 + local.get $l1234 + local.get $l1235 + i32.add + local.set $l1236 + local.get $l1235 + local.get $l1236 + i32.add + local.set $l1237 + local.get $l1236 + local.get $l1237 + i32.add + local.set $l1238 + local.get $l1237 + local.get $l1238 + i32.add + local.set $l1239 + local.get $l1238 + local.get $l1239 + i32.add + local.set $l1240 + local.get $l1239 + local.get $l1240 + i32.add + local.set $l1241 + local.get $l1240 + local.get $l1241 + i32.add + local.set $l1242 + local.get $l1241 + local.get $l1242 + i32.add + local.set $l1243 + local.get $l1242 + local.get $l1243 + i32.add + local.set $l1244 + local.get $l1243 + local.get $l1244 + i32.add + local.set $l1245 + local.get $l1244 + local.get $l1245 + i32.add + local.set $l1246 + local.get $l1245 + local.get $l1246 + i32.add + local.set $l1247 + local.get $l1246 + local.get $l1247 + i32.add + local.set $l1248 + local.get $l1247 + local.get $l1248 + i32.add + local.set $l1249 + local.get $l1248 + local.get $l1249 + i32.add + local.set $l1250 + local.get $l1249 + local.get $l1250 + i32.add + local.set $l1251 + local.get $l1250 + local.get $l1251 + i32.add + local.set $l1252 + local.get $l1251 + local.get $l1252 + i32.add + local.set $l1253 + local.get $l1252 + local.get $l1253 + i32.add + local.set $l1254 + local.get $l1253 + local.get $l1254 + i32.add + local.set $l1255 + local.get $l1254 + local.get $l1255 + i32.add + local.set $l1256 + local.get $l1255 + local.get $l1256 + i32.add + local.set $l1257 + local.get $l1256 + local.get $l1257 + i32.add + local.set $l1258 + local.get $l1257 + local.get $l1258 + i32.add + local.set $l1259 + local.get $l1258 + local.get $l1259 + i32.add + local.set $l1260 + local.get $l1259 + local.get $l1260 + i32.add + local.set $l1261 + local.get $l1260 + local.get $l1261 + i32.add + local.set $l1262 + local.get $l1261 + local.get $l1262 + i32.add + local.set $l1263 + local.get $l1262 + local.get $l1263 + i32.add + local.set $l1264 + local.get $l1263 + local.get $l1264 + i32.add + local.set $l1265 + local.get $l1264 + local.get $l1265 + i32.add + local.set $l1266 + local.get $l1265 + local.get $l1266 + i32.add + local.set $l1267 + local.get $l1266 + local.get $l1267 + i32.add + local.set $l1268 + local.get $l1267 + local.get $l1268 + i32.add + local.set $l1269 + local.get $l1268 + local.get $l1269 + i32.add + local.set $l1270 + local.get $l1269 + local.get $l1270 + i32.add + local.set $l1271 + local.get $l1270 + local.get $l1271 + i32.add + local.set $l1272 + local.get $l1271 + local.get $l1272 + i32.add + local.set $l1273 + local.get $l1272 + local.get $l1273 + i32.add + local.set $l1274 + local.get $l1273 + local.get $l1274 + i32.add + local.set $l1275 + local.get $l1274 + local.get $l1275 + i32.add + local.set $l1276 + local.get $l1275 + local.get $l1276 + i32.add + local.set $l1277 + local.get $l1276 + local.get $l1277 + i32.add + local.set $l1278 + local.get $l1277 + local.get $l1278 + i32.add + local.set $l1279 + local.get $l1278 + local.get $l1279 + i32.add + local.set $l1280 + local.get $l1279 + local.get $l1280 + i32.add + local.set $l1281 + local.get $l1280 + local.get $l1281 + i32.add + local.set $l1282 + local.get $l1281 + local.get $l1282 + i32.add + local.set $l1283 + local.get $l1282 + local.get $l1283 + i32.add + local.set $l1284 + local.get $l1283 + local.get $l1284 + i32.add + local.set $l1285 + local.get $l1284 + local.get $l1285 + i32.add + local.set $l1286 + local.get $l1285 + local.get $l1286 + i32.add + local.set $l1287 + local.get $l1286 + local.get $l1287 + i32.add + local.set $l1288 + local.get $l1287 + local.get $l1288 + i32.add + local.set $l1289 + local.get $l1288 + local.get $l1289 + i32.add + local.set $l1290 + local.get $l1289 + local.get $l1290 + i32.add + local.set $l1291 + local.get $l1290 + local.get $l1291 + i32.add + local.set $l1292 + local.get $l1291 + local.get $l1292 + i32.add + local.set $l1293 + local.get $l1292 + local.get $l1293 + i32.add + local.set $l1294 + local.get $l1293 + local.get $l1294 + i32.add + local.set $l1295 + local.get $l1294 + local.get $l1295 + i32.add + local.set $l1296 + local.get $l1295 + local.get $l1296 + i32.add + local.set $l1297 + local.get $l1296 + local.get $l1297 + i32.add + local.set $l1298 + local.get $l1297 + local.get $l1298 + i32.add + local.set $l1299 + local.get $l1298 + local.get $l1299 + i32.add + local.set $l1300 + local.get $l1299 + local.get $l1300 + i32.add + local.set $l1301 + local.get $l1300 + local.get $l1301 + i32.add + local.set $l1302 + local.get $l1301 + local.get $l1302 + i32.add + local.set $l1303 + local.get $l1302 + local.get $l1303 + i32.add + local.set $l1304 + local.get $l1303 + local.get $l1304 + i32.add + local.set $l1305 + local.get $l1304 + local.get $l1305 + i32.add + local.set $l1306 + local.get $l1305 + local.get $l1306 + i32.add + local.set $l1307 + local.get $l1306 + local.get $l1307 + i32.add + local.set $l1308 + local.get $l1307 + local.get $l1308 + i32.add + local.set $l1309 + local.get $l1308 + local.get $l1309 + i32.add + local.set $l1310 + local.get $l1309 + local.get $l1310 + i32.add + local.set $l1311 + local.get $l1310 + local.get $l1311 + i32.add + local.set $l1312 + local.get $l1311 + local.get $l1312 + i32.add + local.set $l1313 + local.get $l1312 + local.get $l1313 + i32.add + local.set $l1314 + local.get $l1313 + local.get $l1314 + i32.add + local.set $l1315 + local.get $l1314 + local.get $l1315 + i32.add + local.set $l1316 + local.get $l1315 + local.get $l1316 + i32.add + local.set $l1317 + local.get $l1316 + local.get $l1317 + i32.add + local.set $l1318 + local.get $l1317 + local.get $l1318 + i32.add + local.set $l1319 + local.get $l1318 + local.get $l1319 + i32.add + local.set $l1320 + local.get $l1319 + local.get $l1320 + i32.add + local.set $l1321 + local.get $l1320 + local.get $l1321 + i32.add + local.set $l1322 + local.get $l1321 + local.get $l1322 + i32.add + local.set $l1323 + local.get $l1322 + local.get $l1323 + i32.add + local.set $l1324 + local.get $l1323 + local.get $l1324 + i32.add + local.set $l1325 + local.get $l1324 + local.get $l1325 + i32.add + local.set $l1326 + local.get $l1325 + local.get $l1326 + i32.add + local.set $l1327 + local.get $l1326 + local.get $l1327 + i32.add + local.set $l1328 + local.get $l1327 + local.get $l1328 + i32.add + local.set $l1329 + local.get $l1328 + local.get $l1329 + i32.add + local.set $l1330 + local.get $l1329 + local.get $l1330 + i32.add + local.set $l1331 + local.get $l1330 + local.get $l1331 + i32.add + local.set $l1332 + local.get $l1331 + local.get $l1332 + i32.add + local.set $l1333 + local.get $l1332 + local.get $l1333 + i32.add + local.set $l1334 + local.get $l1333 + local.get $l1334 + i32.add + local.set $l1335 + local.get $l1334 + local.get $l1335 + i32.add + local.set $l1336 + local.get $l1335 + local.get $l1336 + i32.add + local.set $l1337 + local.get $l1336 + local.get $l1337 + i32.add + local.set $l1338 + local.get $l1337 + local.get $l1338 + i32.add + local.set $l1339 + local.get $l1338 + local.get $l1339 + i32.add + local.set $l1340 + local.get $l1339 + local.get $l1340 + i32.add + local.set $l1341 + local.get $l1340 + local.get $l1341 + i32.add + local.set $l1342 + local.get $l1341 + local.get $l1342 + i32.add + local.set $l1343 + local.get $l1342 + local.get $l1343 + i32.add + local.set $l1344 + local.get $l1343 + local.get $l1344 + i32.add + local.set $l1345 + local.get $l1344 + local.get $l1345 + i32.add + local.set $l1346 + local.get $l1345 + local.get $l1346 + i32.add + local.set $l1347 + local.get $l1346 + local.get $l1347 + i32.add + local.set $l1348 + local.get $l1347 + local.get $l1348 + i32.add + local.set $l1349 + local.get $l1348 + local.get $l1349 + i32.add + local.set $l1350 + local.get $l1349 + local.get $l1350 + i32.add + local.set $l1351 + local.get $l1350 + local.get $l1351 + i32.add + local.set $l1352 + local.get $l1351 + local.get $l1352 + i32.add + local.set $l1353 + local.get $l1352 + local.get $l1353 + i32.add + local.set $l1354 + local.get $l1353 + local.get $l1354 + i32.add + local.set $l1355 + local.get $l1354 + local.get $l1355 + i32.add + local.set $l1356 + local.get $l1355 + local.get $l1356 + i32.add + local.set $l1357 + local.get $l1356 + local.get $l1357 + i32.add + local.set $l1358 + local.get $l1357 + local.get $l1358 + i32.add + local.set $l1359 + local.get $l1358 + local.get $l1359 + i32.add + local.set $l1360 + local.get $l1359 + local.get $l1360 + i32.add + local.set $l1361 + local.get $l1360 + local.get $l1361 + i32.add + local.set $l1362 + local.get $l1361 + local.get $l1362 + i32.add + local.set $l1363 + local.get $l1362 + local.get $l1363 + i32.add + local.set $l1364 + local.get $l1363 + local.get $l1364 + i32.add + local.set $l1365 + local.get $l1364 + local.get $l1365 + i32.add + local.set $l1366 + local.get $l1365 + local.get $l1366 + i32.add + local.set $l1367 + local.get $l1366 + local.get $l1367 + i32.add + local.set $l1368 + local.get $l1367 + local.get $l1368 + i32.add + local.set $l1369 + local.get $l1368 + local.get $l1369 + i32.add + local.set $l1370 + local.get $l1369 + local.get $l1370 + i32.add + local.set $l1371 + local.get $l1370 + local.get $l1371 + i32.add + local.set $l1372 + local.get $l1371 + local.get $l1372 + i32.add + local.set $l1373 + local.get $l1372 + local.get $l1373 + i32.add + local.set $l1374 + local.get $l1373 + local.get $l1374 + i32.add + local.set $l1375 + local.get $l1374 + local.get $l1375 + i32.add + local.set $l1376 + local.get $l1375 + local.get $l1376 + i32.add + local.set $l1377 + local.get $l1376 + local.get $l1377 + i32.add + local.set $l1378 + local.get $l1377 + local.get $l1378 + i32.add + local.set $l1379 + local.get $l1378 + local.get $l1379 + i32.add + local.set $l1380 + local.get $l1379 + local.get $l1380 + i32.add + local.set $l1381 + local.get $l1380 + local.get $l1381 + i32.add + local.set $l1382 + local.get $l1381 + local.get $l1382 + i32.add + local.set $l1383 + local.get $l1382 + local.get $l1383 + i32.add + local.set $l1384 + local.get $l1383 + local.get $l1384 + i32.add + local.set $l1385 + local.get $l1384 + local.get $l1385 + i32.add + local.set $l1386 + local.get $l1385 + local.get $l1386 + i32.add + local.set $l1387 + local.get $l1386 + local.get $l1387 + i32.add + local.set $l1388 + local.get $l1387 + local.get $l1388 + i32.add + local.set $l1389 + local.get $l1388 + local.get $l1389 + i32.add + local.set $l1390 + local.get $l1389 + local.get $l1390 + i32.add + local.set $l1391 + local.get $l1390 + local.get $l1391 + i32.add + local.set $l1392 + local.get $l1391 + local.get $l1392 + i32.add + local.set $l1393 + local.get $l1392 + local.get $l1393 + i32.add + local.set $l1394 + local.get $l1393 + local.get $l1394 + i32.add + local.set $l1395 + local.get $l1394 + local.get $l1395 + i32.add + local.set $l1396 + local.get $l1395 + local.get $l1396 + i32.add + local.set $l1397 + local.get $l1396 + local.get $l1397 + i32.add + local.set $l1398 + local.get $l1397 + local.get $l1398 + i32.add + local.set $l1399 + local.get $l1398 + local.get $l1399 + i32.add + local.set $l1400 + local.get $l1399 + local.get $l1400 + i32.add + local.set $l1401 + local.get $l1400 + local.get $l1401 + i32.add + local.set $l1402 + local.get $l1401 + local.get $l1402 + i32.add + local.set $l1403 + local.get $l1402 + local.get $l1403 + i32.add + local.set $l1404 + local.get $l1403 + local.get $l1404 + i32.add + local.set $l1405 + local.get $l1404 + local.get $l1405 + i32.add + local.set $l1406 + local.get $l1405 + local.get $l1406 + i32.add + local.set $l1407 + local.get $l1406 + local.get $l1407 + i32.add + local.set $l1408 + local.get $l1407 + local.get $l1408 + i32.add + local.set $l1409 + local.get $l1408 + local.get $l1409 + i32.add + local.set $l1410 + local.get $l1409 + local.get $l1410 + i32.add + local.set $l1411 + local.get $l1410 + local.get $l1411 + i32.add + local.set $l1412 + local.get $l1411 + local.get $l1412 + i32.add + local.set $l1413 + local.get $l1412 + local.get $l1413 + i32.add + local.set $l1414 + local.get $l1413 + local.get $l1414 + i32.add + local.set $l1415 + local.get $l1414 + local.get $l1415 + i32.add + local.set $l1416 + local.get $l1415 + local.get $l1416 + i32.add + local.set $l1417 + local.get $l1416 + local.get $l1417 + i32.add + local.set $l1418 + local.get $l1417 + local.get $l1418 + i32.add + local.set $l1419 + local.get $l1418 + local.get $l1419 + i32.add + local.set $l1420 + local.get $l1419 + local.get $l1420 + i32.add + local.set $l1421 + local.get $l1420 + local.get $l1421 + i32.add + local.set $l1422 + local.get $l1421 + local.get $l1422 + i32.add + local.set $l1423 + local.get $l1422 + local.get $l1423 + i32.add + local.set $l1424 + local.get $l1423 + local.get $l1424 + i32.add + local.set $l1425 + local.get $l1424 + local.get $l1425 + i32.add + local.set $l1426 + local.get $l1425 + local.get $l1426 + i32.add + local.set $l1427 + local.get $l1426 + local.get $l1427 + i32.add + local.set $l1428 + local.get $l1427 + local.get $l1428 + i32.add + local.set $l1429 + local.get $l1428 + local.get $l1429 + i32.add + local.set $l1430 + local.get $l1429 + local.get $l1430 + i32.add + local.set $l1431 + local.get $l1430 + local.get $l1431 + i32.add + local.set $l1432 + local.get $l1431 + local.get $l1432 + i32.add + local.set $l1433 + local.get $l1432 + local.get $l1433 + i32.add + local.set $l1434 + local.get $l1433 + local.get $l1434 + i32.add + local.set $l1435 + local.get $l1434 + local.get $l1435 + i32.add + local.set $l1436 + local.get $l1435 + local.get $l1436 + i32.add + local.set $l1437 + local.get $l1436 + local.get $l1437 + i32.add + local.set $l1438 + local.get $l1437 + local.get $l1438 + i32.add + local.set $l1439 + local.get $l1438 + local.get $l1439 + i32.add + local.set $l1440 + local.get $l1439 + local.get $l1440 + i32.add + local.set $l1441 + local.get $l1440 + local.get $l1441 + i32.add + local.set $l1442 + local.get $l1441 + local.get $l1442 + i32.add + local.set $l1443 + local.get $l1442 + local.get $l1443 + i32.add + local.set $l1444 + local.get $l1443 + local.get $l1444 + i32.add + local.set $l1445 + local.get $l1444 + local.get $l1445 + i32.add + local.set $l1446 + local.get $l1445 + local.get $l1446 + i32.add + local.set $l1447 + local.get $l1446 + local.get $l1447 + i32.add + local.set $l1448 + local.get $l1447 + local.get $l1448 + i32.add + local.set $l1449 + local.get $l1448 + local.get $l1449 + i32.add + local.set $l1450 + local.get $l1449 + local.get $l1450 + i32.add + local.set $l1451 + local.get $l1450 + local.get $l1451 + i32.add + local.set $l1452 + local.get $l1451 + local.get $l1452 + i32.add + local.set $l1453 + local.get $l1452 + local.get $l1453 + i32.add + local.set $l1454 + local.get $l1453 + local.get $l1454 + i32.add + local.set $l1455 + local.get $l1454 + local.get $l1455 + i32.add + local.set $l1456 + local.get $l1455 + local.get $l1456 + i32.add + local.set $l1457 + local.get $l1456 + local.get $l1457 + i32.add + local.set $l1458 + local.get $l1457 + local.get $l1458 + i32.add + local.set $l1459 + local.get $l1458 + local.get $l1459 + i32.add + local.set $l1460 + local.get $l1459 + local.get $l1460 + i32.add + local.set $l1461 + local.get $l1460 + local.get $l1461 + i32.add + local.set $l1462 + local.get $l1461 + local.get $l1462 + i32.add + local.set $l1463 + local.get $l1462 + local.get $l1463 + i32.add + local.set $l1464 + local.get $l1463 + local.get $l1464 + i32.add + local.set $l1465 + local.get $l1464 + local.get $l1465 + i32.add + local.set $l1466 + local.get $l1465 + local.get $l1466 + i32.add + local.set $l1467 + local.get $l1466 + local.get $l1467 + i32.add + local.set $l1468 + local.get $l1467 + local.get $l1468 + i32.add + local.set $l1469 + local.get $l1468 + local.get $l1469 + i32.add + local.set $l1470 + local.get $l1469 + local.get $l1470 + i32.add + local.set $l1471 + local.get $l1470 + local.get $l1471 + i32.add + local.set $l1472 + local.get $l1471 + local.get $l1472 + i32.add + local.set $l1473 + local.get $l1472 + local.get $l1473 + i32.add + local.set $l1474 + local.get $l1473 + local.get $l1474 + i32.add + local.set $l1475 + local.get $l1474 + local.get $l1475 + i32.add + local.set $l1476 + local.get $l1475 + local.get $l1476 + i32.add + local.set $l1477 + local.get $l1476 + local.get $l1477 + i32.add + local.set $l1478 + local.get $l1477 + local.get $l1478 + i32.add + local.set $l1479 + local.get $l1478 + local.get $l1479 + i32.add + local.set $l1480 + local.get $l1479 + local.get $l1480 + i32.add + local.set $l1481 + local.get $l1480 + local.get $l1481 + i32.add + local.set $l1482 + local.get $l1481 + local.get $l1482 + i32.add + local.set $l1483 + local.get $l1482 + local.get $l1483 + i32.add + local.set $l1484 + local.get $l1483 + local.get $l1484 + i32.add + local.set $l1485 + local.get $l1484 + local.get $l1485 + i32.add + local.set $l1486 + local.get $l1485 + local.get $l1486 + i32.add + local.set $l1487 + local.get $l1486 + local.get $l1487 + i32.add + local.set $l1488 + local.get $l1487 + local.get $l1488 + i32.add + local.set $l1489 + local.get $l1488 + local.get $l1489 + i32.add + local.set $l1490 + local.get $l1489 + local.get $l1490 + i32.add + local.set $l1491 + local.get $l1490 + local.get $l1491 + i32.add + local.set $l1492 + local.get $l1491 + local.get $l1492 + i32.add + local.set $l1493 + local.get $l1492 + local.get $l1493 + i32.add + local.set $l1494 + local.get $l1493 + local.get $l1494 + i32.add + local.set $l1495 + local.get $l1494 + local.get $l1495 + i32.add + local.set $l1496 + local.get $l1495 + local.get $l1496 + i32.add + local.set $l1497 + local.get $l1496 + local.get $l1497 + i32.add + local.set $l1498 + local.get $l1497 + local.get $l1498 + i32.add + local.set $l1499 + local.get $l1498 + local.get $l1499 + i32.add + local.set $l1500 + local.get $l1499 + local.get $l1500 + i32.add + local.set $l1501 + local.get $l1500 + local.get $l1501 + i32.add + local.set $l1502 + local.get $l1501 + local.get $l1502 + i32.add + local.set $l1503 + local.get $l1502 + local.get $l1503 + i32.add + local.set $l1504 + local.get $l1503 + local.get $l1504 + i32.add + local.set $l1505 + local.get $l1504 + local.get $l1505 + i32.add + local.set $l1506 + local.get $l1505 + local.get $l1506 + i32.add + local.set $l1507 + local.get $l1506 + local.get $l1507 + i32.add + local.set $l1508 + local.get $l1507 + local.get $l1508 + i32.add + local.set $l1509 + local.get $l1508 + local.get $l1509 + i32.add + local.set $l1510 + local.get $l1509 + local.get $l1510 + i32.add + local.set $l1511 + local.get $l1510 + local.get $l1511 + i32.add + local.set $l1512 + local.get $l1511 + local.get $l1512 + i32.add + local.set $l1513 + local.get $l1512 + local.get $l1513 + i32.add + local.set $l1514 + local.get $l1513 + local.get $l1514 + i32.add + local.set $l1515 + local.get $l1514 + local.get $l1515 + i32.add + local.set $l1516 + local.get $l1515 + local.get $l1516 + i32.add + local.set $l1517 + local.get $l1516 + local.get $l1517 + i32.add + local.set $l1518 + local.get $l1517 + local.get $l1518 + i32.add + local.set $l1519 + local.get $l1518 + local.get $l1519 + i32.add + local.set $l1520 + local.get $l1519 + local.get $l1520 + i32.add + local.set $l1521 + local.get $l1520 + local.get $l1521 + i32.add + local.set $l1522 + local.get $l1521 + local.get $l1522 + i32.add + local.set $l1523 + local.get $l1522 + local.get $l1523 + i32.add + local.set $l1524 + local.get $l1523 + local.get $l1524 + i32.add + local.set $l1525 + local.get $l1524 + local.get $l1525 + i32.add + local.set $l1526 + local.get $l1525 + local.get $l1526 + i32.add + local.set $l1527 + local.get $l1526 + local.get $l1527 + i32.add + local.set $l1528 + local.get $l1527 + local.get $l1528 + i32.add + local.set $l1529 + local.get $l1528 + local.get $l1529 + i32.add + local.set $l1530 + local.get $l1529 + local.get $l1530 + i32.add + local.set $l1531 + local.get $l1530 + local.get $l1531 + i32.add + local.set $l1532 + local.get $l1531 + local.get $l1532 + i32.add + local.set $l1533 + local.get $l1532 + local.get $l1533 + i32.add + local.set $l1534 + local.get $l1533 + local.get $l1534 + i32.add + local.set $l1535 + local.get $l1534 + local.get $l1535 + i32.add + local.set $l1536 + local.get $l1535 + local.get $l1536 + i32.add + local.set $l1537 + local.get $l1536 + local.get $l1537 + i32.add + local.set $l1538 + local.get $l1537 + local.get $l1538 + i32.add + local.set $l1539 + local.get $l1538 + local.get $l1539 + i32.add + local.set $l1540 + local.get $l1539 + local.get $l1540 + i32.add + local.set $l1541 + local.get $l1540 + local.get $l1541 + i32.add + local.set $l1542 + local.get $l1541 + local.get $l1542 + i32.add + local.set $l1543 + local.get $l1542 + local.get $l1543 + i32.add + local.set $l1544 + local.get $l1543 + local.get $l1544 + i32.add + local.set $l1545 + local.get $l1544 + local.get $l1545 + i32.add + local.set $l1546 + local.get $l1545 + local.get $l1546 + i32.add + local.set $l1547 + local.get $l1546 + local.get $l1547 + i32.add + local.set $l1548 + local.get $l1547 + local.get $l1548 + i32.add + local.set $l1549 + local.get $l1548 + local.get $l1549 + i32.add + local.set $l1550 + local.get $l1549 + local.get $l1550 + i32.add + local.set $l1551 + local.get $l1550 + local.get $l1551 + i32.add + local.set $l1552 + local.get $l1551 + local.get $l1552 + i32.add + local.set $l1553 + local.get $l1552 + local.get $l1553 + i32.add + local.set $l1554 + local.get $l1553 + local.get $l1554 + i32.add + local.set $l1555 + local.get $l1554 + local.get $l1555 + i32.add + local.set $l1556 + local.get $l1555 + local.get $l1556 + i32.add + local.set $l1557 + local.get $l1556 + local.get $l1557 + i32.add + local.set $l1558 + local.get $l1557 + local.get $l1558 + i32.add + local.set $l1559 + local.get $l1558 + local.get $l1559 + i32.add + local.set $l1560 + local.get $l1559 + local.get $l1560 + i32.add + local.set $l1561 + local.get $l1560 + local.get $l1561 + i32.add + local.set $l1562 + local.get $l1561 + local.get $l1562 + i32.add + local.set $l1563 + local.get $l1562 + local.get $l1563 + i32.add + local.set $l1564 + local.get $l1563 + local.get $l1564 + i32.add + local.set $l1565 + local.get $l1564 + local.get $l1565 + i32.add + local.set $l1566 + local.get $l1565 + local.get $l1566 + i32.add + local.set $l1567 + local.get $l1566 + local.get $l1567 + i32.add + local.set $l1568 + local.get $l1567 + local.get $l1568 + i32.add + local.set $l1569 + local.get $l1568 + local.get $l1569 + i32.add + local.set $l1570 + local.get $l1569 + local.get $l1570 + i32.add + local.set $l1571 + local.get $l1570 + local.get $l1571 + i32.add + local.set $l1572 + local.get $l1571 + local.get $l1572 + i32.add + local.set $l1573 + local.get $l1572 + local.get $l1573 + i32.add + local.set $l1574 + local.get $l1573 + local.get $l1574 + i32.add + local.set $l1575 + local.get $l1574 + local.get $l1575 + i32.add + local.set $l1576 + local.get $l1575 + local.get $l1576 + i32.add + local.set $l1577 + local.get $l1576 + local.get $l1577 + i32.add + local.set $l1578 + local.get $l1577 + local.get $l1578 + i32.add + local.set $l1579 + local.get $l1578 + local.get $l1579 + i32.add + local.set $l1580 + local.get $l1579 + local.get $l1580 + i32.add + local.set $l1581 + local.get $l1580 + local.get $l1581 + i32.add + local.set $l1582 + local.get $l1581 + local.get $l1582 + i32.add + local.set $l1583 + local.get $l1582 + local.get $l1583 + i32.add + local.set $l1584 + local.get $l1583 + local.get $l1584 + i32.add + local.set $l1585 + local.get $l1584 + local.get $l1585 + i32.add + local.set $l1586 + local.get $l1585 + local.get $l1586 + i32.add + local.set $l1587 + local.get $l1586 + local.get $l1587 + i32.add + local.set $l1588 + local.get $l1587 + local.get $l1588 + i32.add + local.set $l1589 + local.get $l1588 + local.get $l1589 + i32.add + local.set $l1590 + local.get $l1589 + local.get $l1590 + i32.add + local.set $l1591 + local.get $l1590 + local.get $l1591 + i32.add + local.set $l1592 + local.get $l1591 + local.get $l1592 + i32.add + local.set $l1593 + local.get $l1592 + local.get $l1593 + i32.add + local.set $l1594 + local.get $l1593 + local.get $l1594 + i32.add + local.set $l1595 + local.get $l1594 + local.get $l1595 + i32.add + local.set $l1596 + local.get $l1595 + local.get $l1596 + i32.add + local.set $l1597 + local.get $l1596 + local.get $l1597 + i32.add + local.set $l1598 + local.get $l1597 + local.get $l1598 + i32.add + local.set $l1599 + local.get $l1598 + local.get $l1599 + i32.add + local.set $l1600 + local.get $l1599 + local.get $l1600 + i32.add + local.set $l1601 + local.get $l1600 + local.get $l1601 + i32.add + local.set $l1602 + local.get $l1601 + local.get $l1602 + i32.add + local.set $l1603 + local.get $l1602 + local.get $l1603 + i32.add + local.set $l1604 + local.get $l1603 + local.get $l1604 + i32.add + local.set $l1605 + local.get $l1604 + local.get $l1605 + i32.add + local.set $l1606 + local.get $l1605 + local.get $l1606 + i32.add + local.set $l1607 + local.get $l1606 + local.get $l1607 + i32.add + local.set $l1608 + local.get $l1607 + local.get $l1608 + i32.add + local.set $l1609 + local.get $l1608 + local.get $l1609 + i32.add + local.set $l1610 + local.get $l1609 + local.get $l1610 + i32.add + local.set $l1611 + local.get $l1610 + local.get $l1611 + i32.add + local.set $l1612 + local.get $l1611 + local.get $l1612 + i32.add + local.set $l1613 + local.get $l1612 + local.get $l1613 + i32.add + local.set $l1614 + local.get $l1613 + local.get $l1614 + i32.add + local.set $l1615 + local.get $l1614 + local.get $l1615 + i32.add + local.set $l1616 + local.get $l1615 + local.get $l1616 + i32.add + local.set $l1617 + local.get $l1616 + local.get $l1617 + i32.add + local.set $l1618 + local.get $l1617 + local.get $l1618 + i32.add + local.set $l1619 + local.get $l1618 + local.get $l1619 + i32.add + local.set $l1620 + local.get $l1619 + local.get $l1620 + i32.add + local.set $l1621 + local.get $l1620 + local.get $l1621 + i32.add + local.set $l1622 + local.get $l1621 + local.get $l1622 + i32.add + local.set $l1623 + local.get $l1622 + local.get $l1623 + i32.add + local.set $l1624 + local.get $l1623 + local.get $l1624 + i32.add + local.set $l1625 + local.get $l1624 + local.get $l1625 + i32.add + local.set $l1626 + local.get $l1625 + local.get $l1626 + i32.add + local.set $l1627 + local.get $l1626 + local.get $l1627 + i32.add + local.set $l1628 + local.get $l1627 + local.get $l1628 + i32.add + local.set $l1629 + local.get $l1628 + local.get $l1629 + i32.add + local.set $l1630 + local.get $l1629 + local.get $l1630 + i32.add + local.set $l1631 + local.get $l1630 + local.get $l1631 + i32.add + local.set $l1632 + local.get $l1631 + local.get $l1632 + i32.add + local.set $l1633 + local.get $l1632 + local.get $l1633 + i32.add + local.set $l1634 + local.get $l1633 + local.get $l1634 + i32.add + local.set $l1635 + local.get $l1634 + local.get $l1635 + i32.add + local.set $l1636 + local.get $l1635 + local.get $l1636 + i32.add + local.set $l1637 + local.get $l1636 + local.get $l1637 + i32.add + local.set $l1638 + local.get $l1637 + local.get $l1638 + i32.add + local.set $l1639 + local.get $l1638 + local.get $l1639 + i32.add + local.set $l1640 + local.get $l1639 + local.get $l1640 + i32.add + local.set $l1641 + local.get $l1640 + local.get $l1641 + i32.add + local.set $l1642 + local.get $l1641 + local.get $l1642 + i32.add + local.set $l1643 + local.get $l1642 + local.get $l1643 + i32.add + local.set $l1644 + local.get $l1643 + local.get $l1644 + i32.add + local.set $l1645 + local.get $l1644 + local.get $l1645 + i32.add + local.set $l1646 + local.get $l1645 + local.get $l1646 + i32.add + local.set $l1647 + local.get $l1646 + local.get $l1647 + i32.add + local.set $l1648 + local.get $l1647 + local.get $l1648 + i32.add + local.set $l1649 + local.get $l1648 + local.get $l1649 + i32.add + local.set $l1650 + local.get $l1649 + local.get $l1650 + i32.add + local.set $l1651 + local.get $l1650 + local.get $l1651 + i32.add + local.set $l1652 + local.get $l1651 + local.get $l1652 + i32.add + local.set $l1653 + local.get $l1652 + local.get $l1653 + i32.add + local.set $l1654 + local.get $l1653 + local.get $l1654 + i32.add + local.set $l1655 + local.get $l1654 + local.get $l1655 + i32.add + local.set $l1656 + local.get $l1655 + local.get $l1656 + i32.add + local.set $l1657 + local.get $l1656 + local.get $l1657 + i32.add + local.set $l1658 + local.get $l1657 + local.get $l1658 + i32.add + local.set $l1659 + local.get $l1658 + local.get $l1659 + i32.add + local.set $l1660 + local.get $l1659 + local.get $l1660 + i32.add + local.set $l1661 + local.get $l1660 + local.get $l1661 + i32.add + local.set $l1662 + local.get $l1661 + local.get $l1662 + i32.add + local.set $l1663 + local.get $l1662 + local.get $l1663 + i32.add + local.set $l1664 + local.get $l1663 + local.get $l1664 + i32.add + local.set $l1665 + local.get $l1664 + local.get $l1665 + i32.add + local.set $l1666 + local.get $l1665 + local.get $l1666 + i32.add + local.set $l1667 + local.get $l1666 + local.get $l1667 + i32.add + local.set $l1668 + local.get $l1667 + local.get $l1668 + i32.add + local.set $l1669 + local.get $l1668 + local.get $l1669 + i32.add + local.set $l1670 + local.get $l1669 + local.get $l1670 + i32.add + local.set $l1671 + local.get $l1670 + local.get $l1671 + i32.add + local.set $l1672 + local.get $l1671 + local.get $l1672 + i32.add + local.set $l1673 + local.get $l1672 + local.get $l1673 + i32.add + local.set $l1674 + local.get $l1673 + local.get $l1674 + i32.add + local.set $l1675 + local.get $l1674 + local.get $l1675 + i32.add + local.set $l1676 + local.get $l1675 + local.get $l1676 + i32.add + local.set $l1677 + local.get $l1676 + local.get $l1677 + i32.add + local.set $l1678 + local.get $l1677 + local.get $l1678 + i32.add + local.set $l1679 + local.get $l1678 + local.get $l1679 + i32.add + local.set $l1680 + local.get $l1679 + local.get $l1680 + i32.add + local.set $l1681 + local.get $l1680 + local.get $l1681 + i32.add + local.set $l1682 + local.get $l1681 + local.get $l1682 + i32.add + local.set $l1683 + local.get $l1682 + local.get $l1683 + i32.add + local.set $l1684 + local.get $l1683 + local.get $l1684 + i32.add + local.set $l1685 + local.get $l1684 + local.get $l1685 + i32.add + local.set $l1686 + local.get $l1685 + local.get $l1686 + i32.add + local.set $l1687 + local.get $l1686 + local.get $l1687 + i32.add + local.set $l1688 + local.get $l1687 + local.get $l1688 + i32.add + local.set $l1689 + local.get $l1688 + local.get $l1689 + i32.add + local.set $l1690 + local.get $l1689 + local.get $l1690 + i32.add + local.set $l1691 + local.get $l1690 + local.get $l1691 + i32.add + local.set $l1692 + local.get $l1691 + local.get $l1692 + i32.add + local.set $l1693 + local.get $l1692 + local.get $l1693 + i32.add + local.set $l1694 + local.get $l1693 + local.get $l1694 + i32.add + local.set $l1695 + local.get $l1694 + local.get $l1695 + i32.add + local.set $l1696 + local.get $l1695 + local.get $l1696 + i32.add + local.set $l1697 + local.get $l1696 + local.get $l1697 + i32.add + local.set $l1698 + local.get $l1697 + local.get $l1698 + i32.add + local.set $l1699 + local.get $l1698 + local.get $l1699 + i32.add + local.set $l1700 + local.get $l1699 + local.get $l1700 + i32.add + local.set $l1701 + local.get $l1700 + local.get $l1701 + i32.add + local.set $l1702 + local.get $l1701 + local.get $l1702 + i32.add + local.set $l1703 + local.get $l1702 + local.get $l1703 + i32.add + local.set $l1704 + local.get $l1703 + local.get $l1704 + i32.add + local.set $l1705 + local.get $l1704 + local.get $l1705 + i32.add + local.set $l1706 + local.get $l1705 + local.get $l1706 + i32.add + local.set $l1707 + local.get $l1706 + local.get $l1707 + i32.add + local.set $l1708 + local.get $l1707 + local.get $l1708 + i32.add + local.set $l1709 + local.get $l1708 + local.get $l1709 + i32.add + local.set $l1710 + local.get $l1709 + local.get $l1710 + i32.add + local.set $l1711 + local.get $l1710 + local.get $l1711 + i32.add + local.set $l1712 + local.get $l1711 + local.get $l1712 + i32.add + local.set $l1713 + local.get $l1712 + local.get $l1713 + i32.add + local.set $l1714 + local.get $l1713 + local.get $l1714 + i32.add + local.set $l1715 + local.get $l1714 + local.get $l1715 + i32.add + local.set $l1716 + local.get $l1715 + local.get $l1716 + i32.add + local.set $l1717 + local.get $l1716 + local.get $l1717 + i32.add + local.set $l1718 + local.get $l1717 + local.get $l1718 + i32.add + local.set $l1719 + local.get $l1718 + local.get $l1719 + i32.add + local.set $l1720 + local.get $l1719 + local.get $l1720 + i32.add + local.set $l1721 + local.get $l1720 + local.get $l1721 + i32.add + local.set $l1722 + local.get $l1721 + local.get $l1722 + i32.add + local.set $l1723 + local.get $l1722 + local.get $l1723 + i32.add + local.set $l1724 + local.get $l1723 + local.get $l1724 + i32.add + local.set $l1725 + local.get $l1724 + local.get $l1725 + i32.add + local.set $l1726 + local.get $l1725 + local.get $l1726 + i32.add + local.set $l1727 + local.get $l1726 + local.get $l1727 + i32.add + local.set $l1728 + local.get $l1727 + local.get $l1728 + i32.add + local.set $l1729 + local.get $l1728 + local.get $l1729 + i32.add + local.set $l1730 + local.get $l1729 + local.get $l1730 + i32.add + local.set $l1731 + local.get $l1730 + local.get $l1731 + i32.add + local.set $l1732 + local.get $l1731 + local.get $l1732 + i32.add + local.set $l1733 + local.get $l1732 + local.get $l1733 + i32.add + local.set $l1734 + local.get $l1733 + local.get $l1734 + i32.add + local.set $l1735 + local.get $l1734 + local.get $l1735 + i32.add + local.set $l1736 + local.get $l1735 + local.get $l1736 + i32.add + local.set $l1737 + local.get $l1736 + local.get $l1737 + i32.add + local.set $l1738 + local.get $l1737 + local.get $l1738 + i32.add + local.set $l1739 + local.get $l1738 + local.get $l1739 + i32.add + local.set $l1740 + local.get $l1739 + local.get $l1740 + i32.add + local.set $l1741 + local.get $l1740 + local.get $l1741 + i32.add + local.set $l1742 + local.get $l1741 + local.get $l1742 + i32.add + local.set $l1743 + local.get $l1742 + local.get $l1743 + i32.add + local.set $l1744 + local.get $l1743 + local.get $l1744 + i32.add + local.set $l1745 + local.get $l1744 + local.get $l1745 + i32.add + local.set $l1746 + local.get $l1745 + local.get $l1746 + i32.add + local.set $l1747 + local.get $l1746 + local.get $l1747 + i32.add + local.set $l1748 + local.get $l1747 + local.get $l1748 + i32.add + local.set $l1749 + local.get $l1748 + local.get $l1749 + i32.add + local.set $l1750 + local.get $l1749 + local.get $l1750 + i32.add + local.set $l1751 + local.get $l1750 + local.get $l1751 + i32.add + local.set $l1752 + local.get $l1751 + local.get $l1752 + i32.add + local.set $l1753 + local.get $l1752 + local.get $l1753 + i32.add + local.set $l1754 + local.get $l1753 + local.get $l1754 + i32.add + local.set $l1755 + local.get $l1754 + local.get $l1755 + i32.add + local.set $l1756 + local.get $l1755 + local.get $l1756 + i32.add + local.set $l1757 + local.get $l1756 + local.get $l1757 + i32.add + local.set $l1758 + local.get $l1757 + local.get $l1758 + i32.add + local.set $l1759 + local.get $l1758 + local.get $l1759 + i32.add + local.set $l1760 + local.get $l1759 + local.get $l1760 + i32.add + local.set $l1761 + local.get $l1760 + local.get $l1761 + i32.add + local.set $l1762 + local.get $l1761 + local.get $l1762 + i32.add + local.set $l1763 + local.get $l1762 + local.get $l1763 + i32.add + local.set $l1764 + local.get $l1763 + local.get $l1764 + i32.add + local.set $l1765 + local.get $l1764 + local.get $l1765 + i32.add + local.set $l1766 + local.get $l1765 + local.get $l1766 + i32.add + local.set $l1767 + local.get $l1766 + local.get $l1767 + i32.add + local.set $l1768 + local.get $l1767 + local.get $l1768 + i32.add + local.set $l1769 + local.get $l1768 + local.get $l1769 + i32.add + local.set $l1770 + local.get $l1769 + local.get $l1770 + i32.add + local.set $l1771 + local.get $l1770 + local.get $l1771 + i32.add + local.set $l1772 + local.get $l1771 + local.get $l1772 + i32.add + local.set $l1773 + local.get $l1772 + local.get $l1773 + i32.add + local.set $l1774 + local.get $l1773 + local.get $l1774 + i32.add + local.set $l1775 + local.get $l1774 + local.get $l1775 + i32.add + local.set $l1776 + local.get $l1775 + local.get $l1776 + i32.add + local.set $l1777 + local.get $l1776 + local.get $l1777 + i32.add + local.set $l1778 + local.get $l1777 + local.get $l1778 + i32.add + local.set $l1779 + local.get $l1778 + local.get $l1779 + i32.add + local.set $l1780 + local.get $l1779 + local.get $l1780 + i32.add + local.set $l1781 + local.get $l1780 + local.get $l1781 + i32.add + local.set $l1782 + local.get $l1781 + local.get $l1782 + i32.add + local.set $l1783 + local.get $l1782 + local.get $l1783 + i32.add + local.set $l1784 + local.get $l1783 + local.get $l1784 + i32.add + local.set $l1785 + local.get $l1784 + local.get $l1785 + i32.add + local.set $l1786 + local.get $l1785 + local.get $l1786 + i32.add + local.set $l1787 + local.get $l1786 + local.get $l1787 + i32.add + local.set $l1788 + local.get $l1787 + local.get $l1788 + i32.add + local.set $l1789 + local.get $l1788 + local.get $l1789 + i32.add + local.set $l1790 + local.get $l1789 + local.get $l1790 + i32.add + local.set $l1791 + local.get $l1790 + local.get $l1791 + i32.add + local.set $l1792 + local.get $l1791 + local.get $l1792 + i32.add + local.set $l1793 + local.get $l1792 + local.get $l1793 + i32.add + local.set $l1794 + local.get $l1793 + local.get $l1794 + i32.add + local.set $l1795 + local.get $l1794 + local.get $l1795 + i32.add + local.set $l1796 + local.get $l1795 + local.get $l1796 + i32.add + local.set $l1797 + local.get $l1796 + local.get $l1797 + i32.add + local.set $l1798 + local.get $l1797 + local.get $l1798 + i32.add + local.set $l1799 + local.get $l1798 + local.get $l1799 + i32.add + local.set $l1800 + local.get $l1799 + local.get $l1800 + i32.add + local.set $l1801 + local.get $l1800 + local.get $l1801 + i32.add + local.set $l1802 + local.get $l1801 + local.get $l1802 + i32.add + local.set $l1803 + local.get $l1802 + local.get $l1803 + i32.add + local.set $l1804 + local.get $l1803 + local.get $l1804 + i32.add + local.set $l1805 + local.get $l1804 + local.get $l1805 + i32.add + local.set $l1806 + local.get $l1805 + local.get $l1806 + i32.add + local.set $l1807 + local.get $l1806 + local.get $l1807 + i32.add + local.set $l1808 + local.get $l1807 + local.get $l1808 + i32.add + local.set $l1809 + local.get $l1808 + local.get $l1809 + i32.add + local.set $l1810 + local.get $l1809 + local.get $l1810 + i32.add + local.set $l1811 + local.get $l1810 + local.get $l1811 + i32.add + local.set $l1812 + local.get $l1811 + local.get $l1812 + i32.add + local.set $l1813 + local.get $l1812 + local.get $l1813 + i32.add + local.set $l1814 + local.get $l1813 + local.get $l1814 + i32.add + local.set $l1815 + local.get $l1814 + local.get $l1815 + i32.add + local.set $l1816 + local.get $l1815 + local.get $l1816 + i32.add + local.set $l1817 + local.get $l1816 + local.get $l1817 + i32.add + local.set $l1818 + local.get $l1817 + local.get $l1818 + i32.add + local.set $l1819 + local.get $l1818 + local.get $l1819 + i32.add + local.set $l1820 + local.get $l1819 + local.get $l1820 + i32.add + local.set $l1821 + local.get $l1820 + local.get $l1821 + i32.add + local.set $l1822 + local.get $l1821 + local.get $l1822 + i32.add + local.set $l1823 + local.get $l1822 + local.get $l1823 + i32.add + local.set $l1824 + local.get $l1823 + local.get $l1824 + i32.add + local.set $l1825 + local.get $l1824 + local.get $l1825 + i32.add + local.set $l1826 + local.get $l1825 + local.get $l1826 + i32.add + local.set $l1827 + local.get $l1826 + local.get $l1827 + i32.add + local.set $l1828 + local.get $l1827 + local.get $l1828 + i32.add + local.set $l1829 + local.get $l1828 + local.get $l1829 + i32.add + local.set $l1830 + local.get $l1829 + local.get $l1830 + i32.add + local.set $l1831 + local.get $l1830 + local.get $l1831 + i32.add + local.set $l1832 + local.get $l1831 + local.get $l1832 + i32.add + local.set $l1833 + local.get $l1832 + local.get $l1833 + i32.add + local.set $l1834 + local.get $l1833 + local.get $l1834 + i32.add + local.set $l1835 + local.get $l1834 + local.get $l1835 + i32.add + local.set $l1836 + local.get $l1835 + local.get $l1836 + i32.add + local.set $l1837 + local.get $l1836 + local.get $l1837 + i32.add + local.set $l1838 + local.get $l1837 + local.get $l1838 + i32.add + local.set $l1839 + local.get $l1838 + local.get $l1839 + i32.add + local.set $l1840 + local.get $l1839 + local.get $l1840 + i32.add + local.set $l1841 + local.get $l1840 + local.get $l1841 + i32.add + local.set $l1842 + local.get $l1841 + local.get $l1842 + i32.add + local.set $l1843 + local.get $l1842 + local.get $l1843 + i32.add + local.set $l1844 + local.get $l1843 + local.get $l1844 + i32.add + local.set $l1845 + local.get $l1844 + local.get $l1845 + i32.add + local.set $l1846 + local.get $l1845 + local.get $l1846 + i32.add + local.set $l1847 + local.get $l1846 + local.get $l1847 + i32.add + local.set $l1848 + local.get $l1847 + local.get $l1848 + i32.add + local.set $l1849 + local.get $l1848 + local.get $l1849 + i32.add + local.set $l1850 + local.get $l1849 + local.get $l1850 + i32.add + local.set $l1851 + local.get $l1850 + local.get $l1851 + i32.add + local.set $l1852 + local.get $l1851 + local.get $l1852 + i32.add + local.set $l1853 + local.get $l1852 + local.get $l1853 + i32.add + local.set $l1854 + local.get $l1853 + local.get $l1854 + i32.add + local.set $l1855 + local.get $l1854 + local.get $l1855 + i32.add + local.set $l1856 + local.get $l1855 + local.get $l1856 + i32.add + local.set $l1857 + local.get $l1856 + local.get $l1857 + i32.add + local.set $l1858 + local.get $l1857 + local.get $l1858 + i32.add + local.set $l1859 + local.get $l1858 + local.get $l1859 + i32.add + local.set $l1860 + local.get $l1859 + local.get $l1860 + i32.add + local.set $l1861 + local.get $l1860 + local.get $l1861 + i32.add + local.set $l1862 + local.get $l1861 + local.get $l1862 + i32.add + local.set $l1863 + local.get $l1862 + local.get $l1863 + i32.add + local.set $l1864 + local.get $l1863 + local.get $l1864 + i32.add + local.set $l1865 + local.get $l1864 + local.get $l1865 + i32.add + local.set $l1866 + local.get $l1865 + local.get $l1866 + i32.add + local.set $l1867 + local.get $l1866 + local.get $l1867 + i32.add + local.set $l1868 + local.get $l1867 + local.get $l1868 + i32.add + local.set $l1869 + local.get $l1868 + local.get $l1869 + i32.add + local.set $l1870 + local.get $l1869 + local.get $l1870 + i32.add + local.set $l1871 + local.get $l1870 + local.get $l1871 + i32.add + local.set $l1872 + local.get $l1871 + local.get $l1872 + i32.add + local.set $l1873 + local.get $l1872 + local.get $l1873 + i32.add + local.set $l1874 + local.get $l1873 + local.get $l1874 + i32.add + local.set $l1875 + local.get $l1874 + local.get $l1875 + i32.add + local.set $l1876 + local.get $l1875 + local.get $l1876 + i32.add + local.set $l1877 + local.get $l1876 + local.get $l1877 + i32.add + local.set $l1878 + local.get $l1877 + local.get $l1878 + i32.add + local.set $l1879 + local.get $l1878 + local.get $l1879 + i32.add + local.set $l1880 + local.get $l1879 + local.get $l1880 + i32.add + local.set $l1881 + local.get $l1880 + local.get $l1881 + i32.add + local.set $l1882 + local.get $l1881 + local.get $l1882 + i32.add + local.set $l1883 + local.get $l1882 + local.get $l1883 + i32.add + local.set $l1884 + local.get $l1883 + local.get $l1884 + i32.add + local.set $l1885 + local.get $l1884 + local.get $l1885 + i32.add + local.set $l1886 + local.get $l1885 + local.get $l1886 + i32.add + local.set $l1887 + local.get $l1886 + local.get $l1887 + i32.add + local.set $l1888 + local.get $l1887 + local.get $l1888 + i32.add + local.set $l1889 + local.get $l1888 + local.get $l1889 + i32.add + local.set $l1890 + local.get $l1889 + local.get $l1890 + i32.add + local.set $l1891 + local.get $l1890 + local.get $l1891 + i32.add + local.set $l1892 + local.get $l1891 + local.get $l1892 + i32.add + local.set $l1893 + local.get $l1892 + local.get $l1893 + i32.add + local.set $l1894 + local.get $l1893 + local.get $l1894 + i32.add + local.set $l1895 + local.get $l1894 + local.get $l1895 + i32.add + local.set $l1896 + local.get $l1895 + local.get $l1896 + i32.add + local.set $l1897 + local.get $l1896 + local.get $l1897 + i32.add + local.set $l1898 + local.get $l1897 + local.get $l1898 + i32.add + local.set $l1899 + local.get $l1898 + local.get $l1899 + i32.add + local.set $l1900 + local.get $l1899 + local.get $l1900 + i32.add + local.set $l1901 + local.get $l1900 + local.get $l1901 + i32.add + local.set $l1902 + local.get $l1901 + local.get $l1902 + i32.add + local.set $l1903 + local.get $l1902 + local.get $l1903 + i32.add + local.set $l1904 + local.get $l1903 + local.get $l1904 + i32.add + local.set $l1905 + local.get $l1904 + local.get $l1905 + i32.add + local.set $l1906 + local.get $l1905 + local.get $l1906 + i32.add + local.set $l1907 + local.get $l1906 + local.get $l1907 + i32.add + local.set $l1908 + local.get $l1907 + local.get $l1908 + i32.add + local.set $l1909 + local.get $l1908 + local.get $l1909 + i32.add + local.set $l1910 + local.get $l1909 + local.get $l1910 + i32.add + local.set $l1911 + local.get $l1910 + local.get $l1911 + i32.add + local.set $l1912 + local.get $l1911 + local.get $l1912 + i32.add + local.set $l1913 + local.get $l1912 + local.get $l1913 + i32.add + local.set $l1914 + local.get $l1913 + local.get $l1914 + i32.add + local.set $l1915 + local.get $l1914 + local.get $l1915 + i32.add + local.set $l1916 + local.get $l1915 + local.get $l1916 + i32.add + local.set $l1917 + local.get $l1916 + local.get $l1917 + i32.add + local.set $l1918 + local.get $l1917 + local.get $l1918 + i32.add + local.set $l1919 + local.get $l1918 + local.get $l1919 + i32.add + local.set $l1920 + local.get $l1919 + local.get $l1920 + i32.add + local.set $l1921 + local.get $l1920 + local.get $l1921 + i32.add + local.set $l1922 + local.get $l1921 + local.get $l1922 + i32.add + local.set $l1923 + local.get $l1922 + local.get $l1923 + i32.add + local.set $l1924 + local.get $l1923 + local.get $l1924 + i32.add + local.set $l1925 + local.get $l1924 + local.get $l1925 + i32.add + local.set $l1926 + local.get $l1925 + local.get $l1926 + i32.add + local.set $l1927 + local.get $l1926 + local.get $l1927 + i32.add + local.set $l1928 + local.get $l1927 + local.get $l1928 + i32.add + local.set $l1929 + local.get $l1928 + local.get $l1929 + i32.add + local.set $l1930 + local.get $l1929 + local.get $l1930 + i32.add + local.set $l1931 + local.get $l1930 + local.get $l1931 + i32.add + local.set $l1932 + local.get $l1931 + local.get $l1932 + i32.add + local.set $l1933 + local.get $l1932 + local.get $l1933 + i32.add + local.set $l1934 + local.get $l1933 + local.get $l1934 + i32.add + local.set $l1935 + local.get $l1934 + local.get $l1935 + i32.add + local.set $l1936 + local.get $l1935 + local.get $l1936 + i32.add + local.set $l1937 + local.get $l1936 + local.get $l1937 + i32.add + local.set $l1938 + local.get $l1937 + local.get $l1938 + i32.add + local.set $l1939 + local.get $l1938 + local.get $l1939 + i32.add + local.set $l1940 + local.get $l1939 + local.get $l1940 + i32.add + local.set $l1941 + local.get $l1940 + local.get $l1941 + i32.add + local.set $l1942 + local.get $l1941 + local.get $l1942 + i32.add + local.set $l1943 + local.get $l1942 + local.get $l1943 + i32.add + local.set $l1944 + local.get $l1943 + local.get $l1944 + i32.add + local.set $l1945 + local.get $l1944 + local.get $l1945 + i32.add + local.set $l1946 + local.get $l1945 + local.get $l1946 + i32.add + local.set $l1947 + local.get $l1946 + local.get $l1947 + i32.add + local.set $l1948 + local.get $l1947 + local.get $l1948 + i32.add + local.set $l1949 + local.get $l1948 + local.get $l1949 + i32.add + local.set $l1950 + local.get $l1949 + local.get $l1950 + i32.add + local.set $l1951 + local.get $l1950 + local.get $l1951 + i32.add + local.set $l1952 + local.get $l1951 + local.get $l1952 + i32.add + local.set $l1953 + local.get $l1952 + local.get $l1953 + i32.add + local.set $l1954 + local.get $l1953 + local.get $l1954 + i32.add + local.set $l1955 + local.get $l1954 + local.get $l1955 + i32.add + local.set $l1956 + local.get $l1955 + local.get $l1956 + i32.add + local.set $l1957 + local.get $l1956 + local.get $l1957 + i32.add + local.set $l1958 + local.get $l1957 + local.get $l1958 + i32.add + local.set $l1959 + local.get $l1958 + local.get $l1959 + i32.add + local.set $l1960 + local.get $l1959 + local.get $l1960 + i32.add + local.set $l1961 + local.get $l1960 + local.get $l1961 + i32.add + local.set $l1962 + local.get $l1961 + local.get $l1962 + i32.add + local.set $l1963 + local.get $l1962 + local.get $l1963 + i32.add + local.set $l1964 + local.get $l1963 + local.get $l1964 + i32.add + local.set $l1965 + local.get $l1964 + local.get $l1965 + i32.add + local.set $l1966 + local.get $l1965 + local.get $l1966 + i32.add + local.set $l1967 + local.get $l1966 + local.get $l1967 + i32.add + local.set $l1968 + local.get $l1967 + local.get $l1968 + i32.add + local.set $l1969 + local.get $l1968 + local.get $l1969 + i32.add + local.set $l1970 + local.get $l1969 + local.get $l1970 + i32.add + local.set $l1971 + local.get $l1970 + local.get $l1971 + i32.add + local.set $l1972 + local.get $l1971 + local.get $l1972 + i32.add + local.set $l1973 + local.get $l1972 + local.get $l1973 + i32.add + local.set $l1974 + local.get $l1973 + local.get $l1974 + i32.add + local.set $l1975 + local.get $l1974 + local.get $l1975 + i32.add + local.set $l1976 + local.get $l1975 + local.get $l1976 + i32.add + local.set $l1977 + local.get $l1976 + local.get $l1977 + i32.add + local.set $l1978 + local.get $l1977 + local.get $l1978 + i32.add + local.set $l1979 + local.get $l1978 + local.get $l1979 + i32.add + local.set $l1980 + local.get $l1979 + local.get $l1980 + i32.add + local.set $l1981 + local.get $l1980 + local.get $l1981 + i32.add + local.set $l1982 + local.get $l1981 + local.get $l1982 + i32.add + local.set $l1983 + local.get $l1982 + local.get $l1983 + i32.add + local.set $l1984 + local.get $l1983 + local.get $l1984 + i32.add + local.set $l1985 + local.get $l1984 + local.get $l1985 + i32.add + local.set $l1986 + local.get $l1985 + local.get $l1986 + i32.add + local.set $l1987 + local.get $l1986 + local.get $l1987 + i32.add + local.set $l1988 + local.get $l1987 + local.get $l1988 + i32.add + local.set $l1989 + local.get $l1988 + local.get $l1989 + i32.add + local.set $l1990 + local.get $l1989 + local.get $l1990 + i32.add + local.set $l1991 + local.get $l1990 + local.get $l1991 + i32.add + local.set $l1992 + local.get $l1991 + local.get $l1992 + i32.add + local.set $l1993 + local.get $l1992 + local.get $l1993 + i32.add + local.set $l1994 + local.get $l1993 + local.get $l1994 + i32.add + local.set $l1995 + local.get $l1994 + local.get $l1995 + i32.add + local.set $l1996 + local.get $l1995 + local.get $l1996 + i32.add + local.set $l1997 + local.get $l1996 + local.get $l1997 + i32.add + local.set $l1998 + local.get $l1997 + local.get $l1998 + i32.add + local.set $l1999 + local.get $l1998 + local.get $l1999 + i32.add + local.set $l2000 + local.get $l1999 + local.get $l2000 + i32.add + local.set $l2001 + local.get $l2000 + local.get $l2001 + i32.add + local.set $l2002 + local.get $l2001 + local.get $l2002 + i32.add + local.set $l2003 + local.get $l2002 + local.get $l2003 + i32.add + local.set $l2004 + local.get $l2003 + local.get $l2004 + i32.add + local.set $l2005 + local.get $l2004 + local.get $l2005 + i32.add + local.set $l2006 + local.get $l2005 + local.get $l2006 + i32.add + local.set $l2007 + local.get $l2006 + local.get $l2007 + i32.add + local.set $l2008 + local.get $l2007 + local.get $l2008 + i32.add + local.set $l2009 + local.get $l2008 + local.get $l2009 + i32.add + local.set $l2010 + local.get $l2009 + local.get $l2010 + i32.add + local.set $l2011 + local.get $l2010 + local.get $l2011 + i32.add + local.set $l2012 + local.get $l2011 + local.get $l2012 + i32.add + local.set $l2013 + local.get $l2012 + local.get $l2013 + i32.add + local.set $l2014 + local.get $l2013 + local.get $l2014 + i32.add + local.set $l2015 + local.get $l2014 + local.get $l2015 + i32.add + local.set $l2016 + local.get $l2015 + local.get $l2016 + i32.add + local.set $l2017 + local.get $l2016 + local.get $l2017 + i32.add + local.set $l2018 + local.get $l2017 + local.get $l2018 + i32.add + local.set $l2019 + local.get $l2018 + local.get $l2019 + i32.add + local.set $l2020 + local.get $l2019 + local.get $l2020 + i32.add + local.set $l2021 + local.get $l2020 + local.get $l2021 + i32.add + local.set $l2022 + local.get $l2021 + local.get $l2022 + i32.add + local.set $l2023 + local.get $l2022 + local.get $l2023 + i32.add + local.set $l2024 + local.get $l2023 + local.get $l2024 + i32.add + local.set $l2025 + local.get $l2024 + local.get $l2025 + i32.add + local.set $l2026 + local.get $l2025 + local.get $l2026 + i32.add + local.set $l2027 + local.get $l2026 + local.get $l2027 + i32.add + local.set $l2028 + local.get $l2027 + local.get $l2028 + i32.add + local.set $l2029 + local.get $l2028 + local.get $l2029 + i32.add + local.set $l2030 + local.get $l2029 + local.get $l2030 + i32.add + local.set $l2031 + local.get $l2030 + local.get $l2031 + i32.add + local.set $l2032 + local.get $l2031 + local.get $l2032 + i32.add + local.set $l2033 + local.get $l2032 + local.get $l2033 + i32.add + local.set $l2034 + local.get $l2033 + local.get $l2034 + i32.add + local.set $l2035 + local.get $l2034 + local.get $l2035 + i32.add + local.set $l2036 + local.get $l2035 + local.get $l2036 + i32.add + local.set $l2037 + local.get $l2036 + local.get $l2037 + i32.add + local.set $l2038 + local.get $l2037 + local.get $l2038 + i32.add + local.set $l2039 + local.get $l2038 + local.get $l2039 + i32.add + local.set $l2040 + local.get $l2039 + local.get $l2040 + i32.add + local.set $l2041 + local.get $l2040 + local.get $l2041 + i32.add + local.set $l2042 + local.get $l2041 + local.get $l2042 + i32.add + local.set $l2043 + local.get $l2042 + local.get $l2043 + i32.add + local.set $l2044 + local.get $l2043 + local.get $l2044 + i32.add + local.set $l2045 + local.get $l2044 + local.get $l2045 + i32.add + local.set $l2046 + local.get $l2045 + local.get $l2046 + i32.add + local.set $l2047 + local.get $l2046 + local.get $l2047 + i32.add + local.set $l2048 + local.get $l2047 + local.get $l2048 + i32.add + local.set $l2049 + local.get $l2048 + local.get $l2049 + i32.add + local.set $l2050 + local.get $l2049 + local.get $l2050 + i32.add + local.set $l2051 + local.get $l2050 + local.get $l2051 + i32.add + local.set $l2052 + local.get $l2051 + local.get $l2052 + i32.add + local.set $l2053 + local.get $l2052 + local.get $l2053 + i32.add + local.set $l2054 + local.get $l2053 + local.get $l2054 + i32.add + local.set $l2055 + local.get $l2054 + local.get $l2055 + i32.add + local.set $l2056 + local.get $l2055 + local.get $l2056 + i32.add + local.set $l2057 + local.get $l2056 + local.get $l2057 + i32.add + local.set $l2058 + local.get $l2057 + local.get $l2058 + i32.add + local.set $l2059 + local.get $l2058 + local.get $l2059 + i32.add + local.set $l2060 + local.get $l2059 + local.get $l2060 + i32.add + local.set $l2061 + local.get $l2060 + local.get $l2061 + i32.add + local.set $l2062 + local.get $l2061 + local.get $l2062 + i32.add + local.set $l2063 + local.get $l2062 + local.get $l2063 + i32.add + local.set $l2064 + local.get $l2063 + local.get $l2064 + i32.add + local.set $l2065 + local.get $l2064 + local.get $l2065 + i32.add + local.set $l2066 + local.get $l2065 + local.get $l2066 + i32.add + local.set $l2067 + local.get $l2066 + local.get $l2067 + i32.add + local.set $l2068 + local.get $l2067 + local.get $l2068 + i32.add + local.set $l2069 + local.get $l2068 + local.get $l2069 + i32.add + local.set $l2070 + local.get $l2069 + local.get $l2070 + i32.add + local.set $l2071 + local.get $l2070 + local.get $l2071 + i32.add + local.set $l2072 + local.get $l2071 + local.get $l2072 + i32.add + local.set $l2073 + local.get $l2072 + local.get $l2073 + i32.add + local.set $l2074 + local.get $l2073 + local.get $l2074 + i32.add + local.set $l2075 + local.get $l2074 + local.get $l2075 + i32.add + local.set $l2076 + local.get $l2075 + local.get $l2076 + i32.add + local.set $l2077 + local.get $l2076 + local.get $l2077 + i32.add + local.set $l2078 + local.get $l2077 + local.get $l2078 + i32.add + local.set $l2079 + local.get $l2078 + local.get $l2079 + i32.add + local.set $l2080 + local.get $l2079 + local.get $l2080 + i32.add + local.set $l2081 + local.get $l2080 + local.get $l2081 + i32.add + local.set $l2082 + local.get $l2081 + local.get $l2082 + i32.add + local.set $l2083 + local.get $l2082 + local.get $l2083 + i32.add + local.set $l2084 + local.get $l2083 + local.get $l2084 + i32.add + local.set $l2085 + local.get $l2084 + local.get $l2085 + i32.add + local.set $l2086 + local.get $l2085 + local.get $l2086 + i32.add + local.set $l2087 + local.get $l2086 + local.get $l2087 + i32.add + local.set $l2088 + local.get $l2087 + local.get $l2088 + i32.add + local.set $l2089 + local.get $l2088 + local.get $l2089 + i32.add + local.set $l2090 + local.get $l2089 + local.get $l2090 + i32.add + local.set $l2091 + local.get $l2090 + local.get $l2091 + i32.add + local.set $l2092 + local.get $l2091 + local.get $l2092 + i32.add + local.set $l2093 + local.get $l2092 + local.get $l2093 + i32.add + local.set $l2094 + local.get $l2093 + local.get $l2094 + i32.add + local.set $l2095 + local.get $l2094 + local.get $l2095 + i32.add + local.set $l2096 + local.get $l2095 + local.get $l2096 + i32.add + local.set $l2097 + local.get $l2096 + local.get $l2097 + i32.add + local.set $l2098 + local.get $l2097 + local.get $l2098 + i32.add + local.set $l2099 + local.get $l2098 + local.get $l2099 + i32.add + local.set $l2100 + local.get $l2099 + local.get $l2100 + i32.add + local.set $l2101 + local.get $l2100 + local.get $l2101 + i32.add + local.set $l2102 + local.get $l2101 + local.get $l2102 + i32.add + local.set $l2103 + local.get $l2102 + local.get $l2103 + i32.add + local.set $l2104 + local.get $l2103 + local.get $l2104 + i32.add + local.set $l2105 + local.get $l2104 + local.get $l2105 + i32.add + local.set $l2106 + local.get $l2105 + local.get $l2106 + i32.add + local.set $l2107 + local.get $l2106 + local.get $l2107 + i32.add + local.set $l2108 + local.get $l2107 + local.get $l2108 + i32.add + local.set $l2109 + local.get $l2108 + local.get $l2109 + i32.add + local.set $l2110 + local.get $l2109 + local.get $l2110 + i32.add + local.set $l2111 + local.get $l2110 + local.get $l2111 + i32.add + local.set $l2112 + local.get $l2111 + local.get $l2112 + i32.add + local.set $l2113 + local.get $l2112 + local.get $l2113 + i32.add + local.set $l2114 + local.get $l2113 + local.get $l2114 + i32.add + local.set $l2115 + local.get $l2114 + local.get $l2115 + i32.add + local.set $l2116 + local.get $l2115 + local.get $l2116 + i32.add + local.set $l2117 + local.get $l2116 + local.get $l2117 + i32.add + local.set $l2118 + local.get $l2117 + local.get $l2118 + i32.add + local.set $l2119 + local.get $l2118 + local.get $l2119 + i32.add + local.set $l2120 + local.get $l2119 + local.get $l2120 + i32.add + local.set $l2121 + local.get $l2120 + local.get $l2121 + i32.add + local.set $l2122 + local.get $l2121 + local.get $l2122 + i32.add + local.set $l2123 + local.get $l2122 + local.get $l2123 + i32.add + local.set $l2124 + local.get $l2123 + local.get $l2124 + i32.add + local.set $l2125 + local.get $l2124 + local.get $l2125 + i32.add + local.set $l2126 + local.get $l2125 + local.get $l2126 + i32.add + local.set $l2127 + local.get $l2126 + local.get $l2127 + i32.add + local.set $l2128 + local.get $l2127 + local.get $l2128 + i32.add + local.set $l2129 + local.get $l2128 + local.get $l2129 + i32.add + local.set $l2130 + local.get $l2129 + local.get $l2130 + i32.add + local.set $l2131 + local.get $l2130 + local.get $l2131 + i32.add + local.set $l2132 + local.get $l2131 + local.get $l2132 + i32.add + local.set $l2133 + local.get $l2132 + local.get $l2133 + i32.add + local.set $l2134 + local.get $l2133 + local.get $l2134 + i32.add + local.set $l2135 + local.get $l2134 + local.get $l2135 + i32.add + local.set $l2136 + local.get $l2135 + local.get $l2136 + i32.add + local.set $l2137 + local.get $l2136 + local.get $l2137 + i32.add + local.set $l2138 + local.get $l2137 + local.get $l2138 + i32.add + local.set $l2139 + local.get $l2138 + local.get $l2139 + i32.add + local.set $l2140 + local.get $l2139 + local.get $l2140 + i32.add + local.set $l2141 + local.get $l2140 + local.get $l2141 + i32.add + local.set $l2142 + local.get $l2141 + local.get $l2142 + i32.add + local.set $l2143 + local.get $l2142 + local.get $l2143 + i32.add + local.set $l2144 + local.get $l2143 + local.get $l2144 + i32.add + local.set $l2145 + local.get $l2144 + local.get $l2145 + i32.add + local.set $l2146 + local.get $l2145 + local.get $l2146 + i32.add + local.set $l2147 + local.get $l2146 + local.get $l2147 + i32.add + local.set $l2148 + local.get $l2147 + local.get $l2148 + i32.add + local.set $l2149 + local.get $l2148 + local.get $l2149 + i32.add + local.set $l2150 + local.get $l2149 + local.get $l2150 + i32.add + local.set $l2151 + local.get $l2150 + local.get $l2151 + i32.add + local.set $l2152 + local.get $l2151 + local.get $l2152 + i32.add + local.set $l2153 + local.get $l2152 + local.get $l2153 + i32.add + local.set $l2154 + local.get $l2153 + local.get $l2154 + i32.add + local.set $l2155 + local.get $l2154 + local.get $l2155 + i32.add + local.set $l2156 + local.get $l2155 + local.get $l2156 + i32.add + local.set $l2157 + local.get $l2156 + local.get $l2157 + i32.add + local.set $l2158 + local.get $l2157 + local.get $l2158 + i32.add + local.set $l2159 + local.get $l2158 + local.get $l2159 + i32.add + local.set $l2160 + local.get $l2159 + local.get $l2160 + i32.add + local.set $l2161 + local.get $l2160 + local.get $l2161 + i32.add + local.set $l2162 + local.get $l2161 + local.get $l2162 + i32.add + local.set $l2163 + local.get $l2162 + local.get $l2163 + i32.add + local.set $l2164 + local.get $l2163 + local.get $l2164 + i32.add + local.set $l2165 + local.get $l2164 + local.get $l2165 + i32.add + local.set $l2166 + local.get $l2165 + local.get $l2166 + i32.add + local.set $l2167 + local.get $l2166 + local.get $l2167 + i32.add + local.set $l2168 + local.get $l2167 + local.get $l2168 + i32.add + local.set $l2169 + local.get $l2168 + local.get $l2169 + i32.add + local.set $l2170 + local.get $l2169 + local.get $l2170 + i32.add + local.set $l2171 + local.get $l2170 + local.get $l2171 + i32.add + local.set $l2172 + local.get $l2171 + local.get $l2172 + i32.add + local.set $l2173 + local.get $l2172 + local.get $l2173 + i32.add + local.set $l2174 + local.get $l2173 + local.get $l2174 + i32.add + local.set $l2175 + local.get $l2174 + local.get $l2175 + i32.add + local.set $l2176 + local.get $l2175 + local.get $l2176 + i32.add + local.set $l2177 + local.get $l2176 + local.get $l2177 + i32.add + local.set $l2178 + local.get $l2177 + local.get $l2178 + i32.add + local.set $l2179 + local.get $l2178 + local.get $l2179 + i32.add + local.set $l2180 + local.get $l2179 + local.get $l2180 + i32.add + local.set $l2181 + local.get $l2180 + local.get $l2181 + i32.add + local.set $l2182 + local.get $l2181 + local.get $l2182 + i32.add + local.set $l2183 + local.get $l2182 + local.get $l2183 + i32.add + local.set $l2184 + local.get $l2183 + local.get $l2184 + i32.add + local.set $l2185 + local.get $l2184 + local.get $l2185 + i32.add + local.set $l2186 + local.get $l2185 + local.get $l2186 + i32.add + local.set $l2187 + local.get $l2186 + local.get $l2187 + i32.add + local.set $l2188 + local.get $l2187 + local.get $l2188 + i32.add + local.set $l2189 + local.get $l2188 + local.get $l2189 + i32.add + local.set $l2190 + local.get $l2189 + local.get $l2190 + i32.add + local.set $l2191 + local.get $l2190 + local.get $l2191 + i32.add + local.set $l2192 + local.get $l2191 + local.get $l2192 + i32.add + local.set $l2193 + local.get $l2192 + local.get $l2193 + i32.add + local.set $l2194 + local.get $l2193 + local.get $l2194 + i32.add + local.set $l2195 + local.get $l2194 + local.get $l2195 + i32.add + local.set $l2196 + local.get $l2195 + local.get $l2196 + i32.add + local.set $l2197 + local.get $l2196 + local.get $l2197 + i32.add + local.set $l2198 + local.get $l2197 + local.get $l2198 + i32.add + local.set $l2199 + local.get $l2198 + local.get $l2199 + i32.add + local.set $l2200 + local.get $l2199 + local.get $l2200 + i32.add + local.set $l2201 + local.get $l2200 + local.get $l2201 + i32.add + local.set $l2202 + local.get $l2201 + local.get $l2202 + i32.add + local.set $l2203 + local.get $l2202 + local.get $l2203 + i32.add + local.set $l2204 + local.get $l2203 + local.get $l2204 + i32.add + local.set $l2205 + local.get $l2204 + local.get $l2205 + i32.add + local.set $l2206 + local.get $l2205 + local.get $l2206 + i32.add + local.set $l2207 + local.get $l2206 + local.get $l2207 + i32.add + local.set $l2208 + local.get $l2207 + local.get $l2208 + i32.add + local.set $l2209 + local.get $l2208 + local.get $l2209 + i32.add + local.set $l2210 + local.get $l2209 + local.get $l2210 + i32.add + local.set $l2211 + local.get $l2210 + local.get $l2211 + i32.add + local.set $l2212 + local.get $l2211 + local.get $l2212 + i32.add + local.set $l2213 + local.get $l2212 + local.get $l2213 + i32.add + local.set $l2214 + local.get $l2213 + local.get $l2214 + i32.add + local.set $l2215 + local.get $l2214 + local.get $l2215 + i32.add + local.set $l2216 + local.get $l2215 + local.get $l2216 + i32.add + local.set $l2217 + local.get $l2216 + local.get $l2217 + i32.add + local.set $l2218 + local.get $l2217 + local.get $l2218 + i32.add + local.set $l2219 + local.get $l2218 + local.get $l2219 + i32.add + local.set $l2220 + local.get $l2219 + local.get $l2220 + i32.add + local.set $l2221 + local.get $l2220 + local.get $l2221 + i32.add + local.set $l2222 + local.get $l2221 + local.get $l2222 + i32.add + local.set $l2223 + local.get $l2222 + local.get $l2223 + i32.add + local.set $l2224 + local.get $l2223 + local.get $l2224 + i32.add + local.set $l2225 + local.get $l2224 + local.get $l2225 + i32.add + local.set $l2226 + local.get $l2225 + local.get $l2226 + i32.add + local.set $l2227 + local.get $l2226 + local.get $l2227 + i32.add + local.set $l2228 + local.get $l2227 + local.get $l2228 + i32.add + local.set $l2229 + local.get $l2228 + local.get $l2229 + i32.add + local.set $l2230 + local.get $l2229 + local.get $l2230 + i32.add + local.set $l2231 + local.get $l2230 + local.get $l2231 + i32.add + local.set $l2232 + local.get $l2231 + local.get $l2232 + i32.add + local.set $l2233 + local.get $l2232 + local.get $l2233 + i32.add + local.set $l2234 + local.get $l2233 + local.get $l2234 + i32.add + local.set $l2235 + local.get $l2234 + local.get $l2235 + i32.add + local.set $l2236 + local.get $l2235 + local.get $l2236 + i32.add + local.set $l2237 + local.get $l2236 + local.get $l2237 + i32.add + local.set $l2238 + local.get $l2237 + local.get $l2238 + i32.add + local.set $l2239 + local.get $l2238 + local.get $l2239 + i32.add + local.set $l2240 + local.get $l2239 + local.get $l2240 + i32.add + local.set $l2241 + local.get $l2240 + local.get $l2241 + i32.add + local.set $l2242 + local.get $l2241 + local.get $l2242 + i32.add + local.set $l2243 + local.get $l2242 + local.get $l2243 + i32.add + local.set $l2244 + local.get $l2243 + local.get $l2244 + i32.add + local.set $l2245 + local.get $l2244 + local.get $l2245 + i32.add + local.set $l2246 + local.get $l2245 + local.get $l2246 + i32.add + local.set $l2247 + local.get $l2246 + local.get $l2247 + i32.add + local.set $l2248 + local.get $l2247 + local.get $l2248 + i32.add + local.set $l2249 + local.get $l2248 + local.get $l2249 + i32.add + local.set $l2250 + local.get $l2249 + local.get $l2250 + i32.add + local.set $l2251 + local.get $l2250 + local.get $l2251 + i32.add + local.set $l2252 + local.get $l2251 + local.get $l2252 + i32.add + local.set $l2253 + local.get $l2252 + local.get $l2253 + i32.add + local.set $l2254 + local.get $l2253 + local.get $l2254 + i32.add + local.set $l2255 + local.get $l2254 + local.get $l2255 + i32.add + local.set $l2256 + local.get $l2255 + local.get $l2256 + i32.add + local.set $l2257 + local.get $l2256 + local.get $l2257 + i32.add + local.set $l2258 + local.get $l2257 + local.get $l2258 + i32.add + local.set $l2259 + local.get $l2258 + local.get $l2259 + i32.add + local.set $l2260 + local.get $l2259 + local.get $l2260 + i32.add + local.set $l2261 + local.get $l2260 + local.get $l2261 + i32.add + local.set $l2262 + local.get $l2261 + local.get $l2262 + i32.add + local.set $l2263 + local.get $l2262 + local.get $l2263 + i32.add + local.set $l2264 + local.get $l2263 + local.get $l2264 + i32.add + local.set $l2265 + local.get $l2264 + local.get $l2265 + i32.add + local.set $l2266 + local.get $l2265 + local.get $l2266 + i32.add + local.set $l2267 + local.get $l2266 + local.get $l2267 + i32.add + local.set $l2268 + local.get $l2267 + local.get $l2268 + i32.add + local.set $l2269 + local.get $l2268 + local.get $l2269 + i32.add + local.set $l2270 + local.get $l2269 + local.get $l2270 + i32.add + local.set $l2271 + local.get $l2270 + local.get $l2271 + i32.add + local.set $l2272 + local.get $l2271 + local.get $l2272 + i32.add + local.set $l2273 + local.get $l2272 + local.get $l2273 + i32.add + local.set $l2274 + local.get $l2273 + local.get $l2274 + i32.add + local.set $l2275 + local.get $l2274 + local.get $l2275 + i32.add + local.set $l2276 + local.get $l2275 + local.get $l2276 + i32.add + local.set $l2277 + local.get $l2276 + local.get $l2277 + i32.add + local.set $l2278 + local.get $l2277 + local.get $l2278 + i32.add + local.set $l2279 + local.get $l2278 + local.get $l2279 + i32.add + local.set $l2280 + local.get $l2279 + local.get $l2280 + i32.add + local.set $l2281 + local.get $l2280 + local.get $l2281 + i32.add + local.set $l2282 + local.get $l2281 + local.get $l2282 + i32.add + local.set $l2283 + local.get $l2282 + local.get $l2283 + i32.add + local.set $l2284 + local.get $l2283 + local.get $l2284 + i32.add + local.set $l2285 + local.get $l2284 + local.get $l2285 + i32.add + local.set $l2286 + local.get $l2285 + local.get $l2286 + i32.add + local.set $l2287 + local.get $l2286 + local.get $l2287 + i32.add + local.set $l2288 + local.get $l2287 + local.get $l2288 + i32.add + local.set $l2289 + local.get $l2288 + local.get $l2289 + i32.add + local.set $l2290 + local.get $l2289 + local.get $l2290 + i32.add + local.set $l2291 + local.get $l2290 + local.get $l2291 + i32.add + local.set $l2292 + local.get $l2291 + local.get $l2292 + i32.add + local.set $l2293 + local.get $l2292 + local.get $l2293 + i32.add + local.set $l2294 + local.get $l2293 + local.get $l2294 + i32.add + local.set $l2295 + local.get $l2294 + local.get $l2295 + i32.add + local.set $l2296 + local.get $l2295 + local.get $l2296 + i32.add + local.set $l2297 + local.get $l2296 + local.get $l2297 + i32.add + local.set $l2298 + local.get $l2297 + local.get $l2298 + i32.add + local.set $l2299 + local.get $l2298 + local.get $l2299 + i32.add + local.set $l2300 + local.get $l2299 + local.get $l2300 + i32.add + local.set $l2301 + local.get $l2300 + local.get $l2301 + i32.add + local.set $l2302 + local.get $l2301 + local.get $l2302 + i32.add + local.set $l2303 + local.get $l2302 + local.get $l2303 + i32.add + local.set $l2304 + local.get $l2303 + local.get $l2304 + i32.add + local.set $l2305 + local.get $l2304 + local.get $l2305 + i32.add + local.set $l2306 + local.get $l2305 + local.get $l2306 + i32.add + local.set $l2307 + local.get $l2306 + local.get $l2307 + i32.add + local.set $l2308 + local.get $l2307 + local.get $l2308 + i32.add + local.set $l2309 + local.get $l2308 + local.get $l2309 + i32.add + local.set $l2310 + local.get $l2309 + local.get $l2310 + i32.add + local.set $l2311 + local.get $l2310 + local.get $l2311 + i32.add + local.set $l2312 + local.get $l2311 + local.get $l2312 + i32.add + local.set $l2313 + local.get $l2312 + local.get $l2313 + i32.add + local.set $l2314 + local.get $l2313 + local.get $l2314 + i32.add + local.set $l2315 + local.get $l2314 + local.get $l2315 + i32.add + local.set $l2316 + local.get $l2315 + local.get $l2316 + i32.add + local.set $l2317 + local.get $l2316 + local.get $l2317 + i32.add + local.set $l2318 + local.get $l2317 + local.get $l2318 + i32.add + local.set $l2319 + local.get $l2318 + local.get $l2319 + i32.add + local.set $l2320 + local.get $l2319 + local.get $l2320 + i32.add + local.set $l2321 + local.get $l2320 + local.get $l2321 + i32.add + local.set $l2322 + local.get $l2321 + local.get $l2322 + i32.add + local.set $l2323 + local.get $l2322 + local.get $l2323 + i32.add + local.set $l2324 + local.get $l2323 + local.get $l2324 + i32.add + local.set $l2325 + local.get $l2324 + local.get $l2325 + i32.add + local.set $l2326 + local.get $l2325 + local.get $l2326 + i32.add + local.set $l2327 + local.get $l2326 + local.get $l2327 + i32.add + local.set $l2328 + local.get $l2327 + local.get $l2328 + i32.add + local.set $l2329 + local.get $l2328 + local.get $l2329 + i32.add + local.set $l2330 + local.get $l2329 + local.get $l2330 + i32.add + local.set $l2331 + local.get $l2330 + local.get $l2331 + i32.add + local.set $l2332 + local.get $l2331 + local.get $l2332 + i32.add + local.set $l2333 + local.get $l2332 + local.get $l2333 + i32.add + local.set $l2334 + local.get $l2333 + local.get $l2334 + i32.add + local.set $l2335 + local.get $l2334 + local.get $l2335 + i32.add + local.set $l2336 + local.get $l2335 + local.get $l2336 + i32.add + local.set $l2337 + local.get $l2336 + local.get $l2337 + i32.add + local.set $l2338 + local.get $l2337 + local.get $l2338 + i32.add + local.set $l2339 + local.get $l2338 + local.get $l2339 + i32.add + local.set $l2340 + local.get $l2339 + local.get $l2340 + i32.add + local.set $l2341 + local.get $l2340 + local.get $l2341 + i32.add + local.set $l2342 + local.get $l2341 + local.get $l2342 + i32.add + local.set $l2343 + local.get $l2342 + local.get $l2343 + i32.add + local.set $l2344 + local.get $l2343 + local.get $l2344 + i32.add + local.set $l2345 + local.get $l2344 + local.get $l2345 + i32.add + local.set $l2346 + local.get $l2345 + local.get $l2346 + i32.add + local.set $l2347 + local.get $l2346 + local.get $l2347 + i32.add + local.set $l2348 + local.get $l2347 + local.get $l2348 + i32.add + local.set $l2349 + local.get $l2348 + local.get $l2349 + i32.add + local.set $l2350 + local.get $l2349 + local.get $l2350 + i32.add + local.set $l2351 + local.get $l2350 + local.get $l2351 + i32.add + local.set $l2352 + local.get $l2351 + local.get $l2352 + i32.add + local.set $l2353 + local.get $l2352 + local.get $l2353 + i32.add + local.set $l2354 + local.get $l2353 + local.get $l2354 + i32.add + local.set $l2355 + local.get $l2354 + local.get $l2355 + i32.add + local.set $l2356 + local.get $l2355 + local.get $l2356 + i32.add + local.set $l2357 + local.get $l2356 + local.get $l2357 + i32.add + local.set $l2358 + local.get $l2357 + local.get $l2358 + i32.add + local.set $l2359 + local.get $l2358 + local.get $l2359 + i32.add + local.set $l2360 + local.get $l2359 + local.get $l2360 + i32.add + local.set $l2361 + local.get $l2360 + local.get $l2361 + i32.add + local.set $l2362 + local.get $l2361 + local.get $l2362 + i32.add + local.set $l2363 + local.get $l2362 + local.get $l2363 + i32.add + local.set $l2364 + local.get $l2363 + local.get $l2364 + i32.add + local.set $l2365 + local.get $l2364 + local.get $l2365 + i32.add + local.set $l2366 + local.get $l2365 + local.get $l2366 + i32.add + local.set $l2367 + local.get $l2366 + local.get $l2367 + i32.add + local.set $l2368 + local.get $l2367 + local.get $l2368 + i32.add + local.set $l2369 + local.get $l2368 + local.get $l2369 + i32.add + local.set $l2370 + local.get $l2369 + local.get $l2370 + i32.add + local.set $l2371 + local.get $l2370 + local.get $l2371 + i32.add + local.set $l2372 + local.get $l2371 + local.get $l2372 + i32.add + local.set $l2373 + local.get $l2372 + local.get $l2373 + i32.add + local.set $l2374 + local.get $l2373 + local.get $l2374 + i32.add + local.set $l2375 + local.get $l2374 + local.get $l2375 + i32.add + local.set $l2376 + local.get $l2375 + local.get $l2376 + i32.add + local.set $l2377 + local.get $l2376 + local.get $l2377 + i32.add + local.set $l2378 + local.get $l2377 + local.get $l2378 + i32.add + local.set $l2379 + local.get $l2378 + local.get $l2379 + i32.add + local.set $l2380 + local.get $l2379 + local.get $l2380 + i32.add + local.set $l2381 + local.get $l2380 + local.get $l2381 + i32.add + local.set $l2382 + local.get $l2381 + local.get $l2382 + i32.add + local.set $l2383 + local.get $l2382 + local.get $l2383 + i32.add + local.set $l2384 + local.get $l2383 + local.get $l2384 + i32.add + local.set $l2385 + local.get $l2384 + local.get $l2385 + i32.add + local.set $l2386 + local.get $l2385 + local.get $l2386 + i32.add + local.set $l2387 + local.get $l2386 + local.get $l2387 + i32.add + local.set $l2388 + local.get $l2387 + local.get $l2388 + i32.add + local.set $l2389 + local.get $l2388 + local.get $l2389 + i32.add + local.set $l2390 + local.get $l2389 + local.get $l2390 + i32.add + local.set $l2391 + local.get $l2390 + local.get $l2391 + i32.add + local.set $l2392 + local.get $l2391 + local.get $l2392 + i32.add + local.set $l2393 + local.get $l2392 + local.get $l2393 + i32.add + local.set $l2394 + local.get $l2393 + local.get $l2394 + i32.add + local.set $l2395 + local.get $l2394 + local.get $l2395 + i32.add + local.set $l2396 + local.get $l2395 + local.get $l2396 + i32.add + local.set $l2397 + local.get $l2396 + local.get $l2397 + i32.add + local.set $l2398 + local.get $l2397 + local.get $l2398 + i32.add + local.set $l2399 + local.get $l2398 + local.get $l2399 + i32.add + local.set $l2400 + local.get $l2399 + local.get $l2400 + i32.add + local.set $l2401 + local.get $l2400 + local.get $l2401 + i32.add + local.set $l2402 + local.get $l2401 + local.get $l2402 + i32.add + local.set $l2403 + local.get $l2402 + local.get $l2403 + i32.add + local.set $l2404 + local.get $l2403 + local.get $l2404 + i32.add + local.set $l2405 + local.get $l2404 + local.get $l2405 + i32.add + local.set $l2406 + local.get $l2405 + local.get $l2406 + i32.add + local.set $l2407 + local.get $l2406 + local.get $l2407 + i32.add + local.set $l2408 + local.get $l2407 + local.get $l2408 + i32.add + local.set $l2409 + local.get $l2408 + local.get $l2409 + i32.add + local.set $l2410 + local.get $l2409 + local.get $l2410 + i32.add + local.set $l2411 + local.get $l2410 + local.get $l2411 + i32.add + local.set $l2412 + local.get $l2411 + local.get $l2412 + i32.add + local.set $l2413 + local.get $l2412 + local.get $l2413 + i32.add + local.set $l2414 + local.get $l2413 + local.get $l2414 + i32.add + local.set $l2415 + local.get $l2414 + local.get $l2415 + i32.add + local.set $l2416 + local.get $l2415 + local.get $l2416 + i32.add + local.set $l2417 + local.get $l2416 + local.get $l2417 + i32.add + local.set $l2418 + local.get $l2417 + local.get $l2418 + i32.add + local.set $l2419 + local.get $l2418 + local.get $l2419 + i32.add + local.set $l2420 + local.get $l2419 + local.get $l2420 + i32.add + local.set $l2421 + local.get $l2420 + local.get $l2421 + i32.add + local.set $l2422 + local.get $l2421 + local.get $l2422 + i32.add + local.set $l2423 + local.get $l2422 + local.get $l2423 + i32.add + local.set $l2424 + local.get $l2423 + local.get $l2424 + i32.add + local.set $l2425 + local.get $l2424 + local.get $l2425 + i32.add + local.set $l2426 + local.get $l2425 + local.get $l2426 + i32.add + local.set $l2427 + local.get $l2426 + local.get $l2427 + i32.add + local.set $l2428 + local.get $l2427 + local.get $l2428 + i32.add + local.set $l2429 + local.get $l2428 + local.get $l2429 + i32.add + local.set $l2430 + local.get $l2429 + local.get $l2430 + i32.add + local.set $l2431 + local.get $l2430 + local.get $l2431 + i32.add + local.set $l2432 + local.get $l2431 + local.get $l2432 + i32.add + local.set $l2433 + local.get $l2432 + local.get $l2433 + i32.add + local.set $l2434 + local.get $l2433 + local.get $l2434 + i32.add + local.set $l2435 + local.get $l2434 + local.get $l2435 + i32.add + local.set $l2436 + local.get $l2435 + local.get $l2436 + i32.add + local.set $l2437 + local.get $l2436 + local.get $l2437 + i32.add + local.set $l2438 + local.get $l2437 + local.get $l2438 + i32.add + local.set $l2439 + local.get $l2438 + local.get $l2439 + i32.add + local.set $l2440 + local.get $l2439 + local.get $l2440 + i32.add + local.set $l2441 + local.get $l2440 + local.get $l2441 + i32.add + local.set $l2442 + local.get $l2441 + local.get $l2442 + i32.add + local.set $l2443 + local.get $l2442 + local.get $l2443 + i32.add + local.set $l2444 + local.get $l2443 + local.get $l2444 + i32.add + local.set $l2445 + local.get $l2444 + local.get $l2445 + i32.add + local.set $l2446 + local.get $l2445 + local.get $l2446 + i32.add + local.set $l2447 + local.get $l2446 + local.get $l2447 + i32.add + local.set $l2448 + local.get $l2447 + local.get $l2448 + i32.add + local.set $l2449 + local.get $l2448 + local.get $l2449 + i32.add + local.set $l2450 + local.get $l2449 + local.get $l2450 + i32.add + local.set $l2451 + local.get $l2450 + local.get $l2451 + i32.add + local.set $l2452 + local.get $l2451 + local.get $l2452 + i32.add + local.set $l2453 + local.get $l2452 + local.get $l2453 + i32.add + local.set $l2454 + local.get $l2453 + local.get $l2454 + i32.add + local.set $l2455 + local.get $l2454 + local.get $l2455 + i32.add + local.set $l2456 + local.get $l2455 + local.get $l2456 + i32.add + local.set $l2457 + local.get $l2456 + local.get $l2457 + i32.add + local.set $l2458 + local.get $l2457 + local.get $l2458 + i32.add + local.set $l2459 + local.get $l2458 + local.get $l2459 + i32.add + local.set $l2460 + local.get $l2459 + local.get $l2460 + i32.add + local.set $l2461 + local.get $l2460 + local.get $l2461 + i32.add + local.set $l2462 + local.get $l2461 + local.get $l2462 + i32.add + local.set $l2463 + local.get $l2462 + local.get $l2463 + i32.add + local.set $l2464 + local.get $l2463 + local.get $l2464 + i32.add + local.set $l2465 + local.get $l2464 + local.get $l2465 + i32.add + local.set $l2466 + local.get $l2465 + local.get $l2466 + i32.add + local.set $l2467 + local.get $l2466 + local.get $l2467 + i32.add + local.set $l2468 + local.get $l2467 + local.get $l2468 + i32.add + local.set $l2469 + local.get $l2468 + local.get $l2469 + i32.add + local.set $l2470 + local.get $l2469 + local.get $l2470 + i32.add + local.set $l2471 + local.get $l2470 + local.get $l2471 + i32.add + local.set $l2472 + local.get $l2471 + local.get $l2472 + i32.add + local.set $l2473 + local.get $l2472 + local.get $l2473 + i32.add + local.set $l2474 + local.get $l2473 + local.get $l2474 + i32.add + local.set $l2475 + local.get $l2474 + local.get $l2475 + i32.add + local.set $l2476 + local.get $l2475 + local.get $l2476 + i32.add + local.set $l2477 + local.get $l2476 + local.get $l2477 + i32.add + local.set $l2478 + local.get $l2477 + local.get $l2478 + i32.add + local.set $l2479 + local.get $l2478 + local.get $l2479 + i32.add + local.set $l2480 + local.get $l2479 + local.get $l2480 + i32.add + local.set $l2481 + local.get $l2480 + local.get $l2481 + i32.add + local.set $l2482 + local.get $l2481 + local.get $l2482 + i32.add + local.set $l2483 + local.get $l2482 + local.get $l2483 + i32.add + local.set $l2484 + local.get $l2483 + local.get $l2484 + i32.add + local.set $l2485 + local.get $l2484 + local.get $l2485 + i32.add + local.set $l2486 + local.get $l2485 + local.get $l2486 + i32.add + local.set $l2487 + local.get $l2486 + local.get $l2487 + i32.add + local.set $l2488 + local.get $l2487 + local.get $l2488 + i32.add + local.set $l2489 + local.get $l2488 + local.get $l2489 + i32.add + local.set $l2490 + local.get $l2489 + local.get $l2490 + i32.add + local.set $l2491 + local.get $l2490 + local.get $l2491 + i32.add + local.set $l2492 + local.get $l2491 + local.get $l2492 + i32.add + local.set $l2493 + local.get $l2492 + local.get $l2493 + i32.add + local.set $l2494 + local.get $l2493 + local.get $l2494 + i32.add + local.set $l2495 + local.get $l2494 + local.get $l2495 + i32.add + local.set $l2496 + local.get $l2495 + local.get $l2496 + i32.add + local.set $l2497 + local.get $l2496 + local.get $l2497 + i32.add + local.set $l2498 + local.get $l2497 + local.get $l2498 + i32.add + local.set $l2499 + local.get $l2498 + local.get $l2499 + i32.add + local.set $l2500 + local.get $l2499 + local.get $l2500 + i32.add + local.set $l2501 + local.get $l2500 + local.get $l2501 + i32.add + local.set $l2502 + local.get $l2501 + local.get $l2502 + i32.add + local.set $l2503 + local.get $l2502 + local.get $l2503 + i32.add + local.set $l2504 + local.get $l2503 + local.get $l2504 + i32.add + local.set $l2505 + local.get $l2504 + local.get $l2505 + i32.add + local.set $l2506 + local.get $l2505 + local.get $l2506 + i32.add + local.set $l2507 + local.get $l2506 + local.get $l2507 + i32.add + local.set $l2508 + local.get $l2507 + local.get $l2508 + i32.add + local.set $l2509 + local.get $l2508 + local.get $l2509 + i32.add + local.set $l2510 + local.get $l2509 + local.get $l2510 + i32.add + local.set $l2511 + local.get $l2510 + local.get $l2511 + i32.add + local.set $l2512 + local.get $l2511 + local.get $l2512 + i32.add + local.set $l2513 + local.get $l2512 + local.get $l2513 + i32.add + local.set $l2514 + local.get $l2513 + local.get $l2514 + i32.add + local.set $l2515 + local.get $l2514 + local.get $l2515 + i32.add + local.set $l2516 + local.get $l2515 + local.get $l2516 + i32.add + local.set $l2517 + local.get $l2516 + local.get $l2517 + i32.add + local.set $l2518 + local.get $l2517 + local.get $l2518 + i32.add + local.set $l2519 + local.get $l2518 + local.get $l2519 + i32.add + local.set $l2520 + local.get $l2519 + local.get $l2520 + i32.add + local.set $l2521 + local.get $l2520 + local.get $l2521 + i32.add + local.set $l2522 + local.get $l2521 + local.get $l2522 + i32.add + local.set $l2523 + local.get $l2522 + local.get $l2523 + i32.add + local.set $l2524 + local.get $l2523 + local.get $l2524 + i32.add + local.set $l2525 + local.get $l2524 + local.get $l2525 + i32.add + local.set $l2526 + local.get $l2525 + local.get $l2526 + i32.add + local.set $l2527 + local.get $l2526 + local.get $l2527 + i32.add + local.set $l2528 + local.get $l2527 + local.get $l2528 + i32.add + local.set $l2529 + local.get $l2528 + local.get $l2529 + i32.add + local.set $l2530 + local.get $l2529 + local.get $l2530 + i32.add + local.set $l2531 + local.get $l2530 + local.get $l2531 + i32.add + local.set $l2532 + local.get $l2531 + local.get $l2532 + i32.add + local.set $l2533 + local.get $l2532 + local.get $l2533 + i32.add + local.set $l2534 + local.get $l2533 + local.get $l2534 + i32.add + local.set $l2535 + local.get $l2534 + local.get $l2535 + i32.add + local.set $l2536 + local.get $l2535 + local.get $l2536 + i32.add + local.set $l2537 + local.get $l2536 + local.get $l2537 + i32.add + local.set $l2538 + local.get $l2537 + local.get $l2538 + i32.add + local.set $l2539 + local.get $l2538 + local.get $l2539 + i32.add + local.set $l2540 + local.get $l2539 + local.get $l2540 + i32.add + local.set $l2541 + local.get $l2540 + local.get $l2541 + i32.add + local.set $l2542 + local.get $l2541 + local.get $l2542 + i32.add + local.set $l2543 + local.get $l2542 + local.get $l2543 + i32.add + local.set $l2544 + local.get $l2543 + local.get $l2544 + i32.add + local.set $l2545 + local.get $l2544 + local.get $l2545 + i32.add + local.set $l2546 + local.get $l2545 + local.get $l2546 + i32.add + local.set $l2547 + local.get $l2546 + local.get $l2547 + i32.add + local.set $l2548 + local.get $l2547 + local.get $l2548 + i32.add + local.set $l2549 + local.get $l2548 + local.get $l2549 + i32.add + local.set $l2550 + local.get $l2549 + local.get $l2550 + i32.add + local.set $l2551 + local.get $l2550 + local.get $l2551 + i32.add + local.set $l2552 + local.get $l2551 + local.get $l2552 + i32.add + local.set $l2553 + local.get $l2552 + local.get $l2553 + i32.add + local.set $l2554 + local.get $l2553 + local.get $l2554 + i32.add + local.set $l2555 + local.get $l2554 + local.get $l2555 + i32.add + local.set $l2556 + local.get $l2555 + local.get $l2556 + i32.add + local.set $l2557 + local.get $l2556 + local.get $l2557 + i32.add + local.set $l2558 + local.get $l2557 + local.get $l2558 + i32.add + local.set $l2559 + local.get $l2558 + local.get $l2559 + i32.add + local.set $l2560 + local.get $l2559 + local.get $l2560 + i32.add + local.set $l2561 + local.get $l2560 + local.get $l2561 + i32.add + local.set $l2562 + local.get $l2561 + local.get $l2562 + i32.add + local.set $l2563 + local.get $l2562 + local.get $l2563 + i32.add + local.set $l2564 + local.get $l2563 + local.get $l2564 + i32.add + local.set $l2565 + local.get $l2564 + local.get $l2565 + i32.add + local.set $l2566 + local.get $l2565 + local.get $l2566 + i32.add + local.set $l2567 + local.get $l2566 + local.get $l2567 + i32.add + local.set $l2568 + local.get $l2567 + local.get $l2568 + i32.add + local.set $l2569 + local.get $l2568 + local.get $l2569 + i32.add + local.set $l2570 + local.get $l2569 + local.get $l2570 + i32.add + local.set $l2571 + local.get $l2570 + local.get $l2571 + i32.add + local.set $l2572 + local.get $l2571 + local.get $l2572 + i32.add + local.set $l2573 + local.get $l2572 + local.get $l2573 + i32.add + local.set $l2574 + local.get $l2573 + local.get $l2574 + i32.add + local.set $l2575 + local.get $l2574 + local.get $l2575 + i32.add + local.set $l2576 + local.get $l2575 + local.get $l2576 + i32.add + local.set $l2577 + local.get $l2576 + local.get $l2577 + i32.add + local.set $l2578 + local.get $l2577 + local.get $l2578 + i32.add + local.set $l2579 + local.get $l2578 + local.get $l2579 + i32.add + local.set $l2580 + local.get $l2579 + local.get $l2580 + i32.add + local.set $l2581 + local.get $l2580 + local.get $l2581 + i32.add + local.set $l2582 + local.get $l2581 + local.get $l2582 + i32.add + local.set $l2583 + local.get $l2582 + local.get $l2583 + i32.add + local.set $l2584 + local.get $l2583 + local.get $l2584 + i32.add + local.set $l2585 + local.get $l2584 + local.get $l2585 + i32.add + local.set $l2586 + local.get $l2585 + local.get $l2586 + i32.add + local.set $l2587 + local.get $l2586 + local.get $l2587 + i32.add + local.set $l2588 + local.get $l2587 + local.get $l2588 + i32.add + local.set $l2589 + local.get $l2588 + local.get $l2589 + i32.add + local.set $l2590 + local.get $l2589 + local.get $l2590 + i32.add + local.set $l2591 + local.get $l2590 + local.get $l2591 + i32.add + local.set $l2592 + local.get $l2591 + local.get $l2592 + i32.add + local.set $l2593 + local.get $l2592 + local.get $l2593 + i32.add + local.set $l2594 + local.get $l2593 + local.get $l2594 + i32.add + local.set $l2595 + local.get $l2594 + local.get $l2595 + i32.add + local.set $l2596 + local.get $l2595 + local.get $l2596 + i32.add + local.set $l2597 + local.get $l2596 + local.get $l2597 + i32.add + local.set $l2598 + local.get $l2597 + local.get $l2598 + i32.add + local.set $l2599 + local.get $l2598 + local.get $l2599 + i32.add + local.set $l2600 + local.get $l2599 + local.get $l2600 + i32.add + local.set $l2601 + local.get $l2600 + local.get $l2601 + i32.add + local.set $l2602 + local.get $l2601 + local.get $l2602 + i32.add + local.set $l2603 + local.get $l2602 + local.get $l2603 + i32.add + local.set $l2604 + local.get $l2603 + local.get $l2604 + i32.add + local.set $l2605 + local.get $l2604 + local.get $l2605 + i32.add + local.set $l2606 + local.get $l2605 + local.get $l2606 + i32.add + local.set $l2607 + local.get $l2606 + local.get $l2607 + i32.add + local.set $l2608 + local.get $l2607 + local.get $l2608 + i32.add + local.set $l2609 + local.get $l2608 + local.get $l2609 + i32.add + local.set $l2610 + local.get $l2609 + local.get $l2610 + i32.add + local.set $l2611 + local.get $l2610 + local.get $l2611 + i32.add + local.set $l2612 + local.get $l2611 + local.get $l2612 + i32.add + local.set $l2613 + local.get $l2612 + local.get $l2613 + i32.add + local.set $l2614 + local.get $l2613 + local.get $l2614 + i32.add + local.set $l2615 + local.get $l2614 + local.get $l2615 + i32.add + local.set $l2616 + local.get $l2615 + local.get $l2616 + i32.add + local.set $l2617 + local.get $l2616 + local.get $l2617 + i32.add + local.set $l2618 + local.get $l2617 + local.get $l2618 + i32.add + local.set $l2619 + local.get $l2618 + local.get $l2619 + i32.add + local.set $l2620 + local.get $l2619 + local.get $l2620 + i32.add + local.set $l2621 + local.get $l2620 + local.get $l2621 + i32.add + local.set $l2622 + local.get $l2621 + local.get $l2622 + i32.add + local.set $l2623 + local.get $l2622 + local.get $l2623 + i32.add + local.set $l2624 + local.get $l2623 + local.get $l2624 + i32.add + local.set $l2625 + local.get $l2624 + local.get $l2625 + i32.add + local.set $l2626 + local.get $l2625 + local.get $l2626 + i32.add + local.set $l2627 + local.get $l2626 + local.get $l2627 + i32.add + local.set $l2628 + local.get $l2627 + local.get $l2628 + i32.add + local.set $l2629 + local.get $l2628 + local.get $l2629 + i32.add + local.set $l2630 + local.get $l2629 + local.get $l2630 + i32.add + local.set $l2631 + local.get $l2630 + local.get $l2631 + i32.add + local.set $l2632 + local.get $l2631 + local.get $l2632 + i32.add + local.set $l2633 + local.get $l2632 + local.get $l2633 + i32.add + local.set $l2634 + local.get $l2633 + local.get $l2634 + i32.add + local.set $l2635 + local.get $l2634 + local.get $l2635 + i32.add + local.set $l2636 + local.get $l2635 + local.get $l2636 + i32.add + local.set $l2637 + local.get $l2636 + local.get $l2637 + i32.add + local.set $l2638 + local.get $l2637 + local.get $l2638 + i32.add + local.set $l2639 + local.get $l2638 + local.get $l2639 + i32.add + local.set $l2640 + local.get $l2639 + local.get $l2640 + i32.add + local.set $l2641 + local.get $l2640 + local.get $l2641 + i32.add + local.set $l2642 + local.get $l2641 + local.get $l2642 + i32.add + local.set $l2643 + local.get $l2642 + local.get $l2643 + i32.add + local.set $l2644 + local.get $l2643 + local.get $l2644 + i32.add + local.set $l2645 + local.get $l2644 + local.get $l2645 + i32.add + local.set $l2646 + local.get $l2645 + local.get $l2646 + i32.add + local.set $l2647 + local.get $l2646 + local.get $l2647 + i32.add + local.set $l2648 + local.get $l2647 + local.get $l2648 + i32.add + local.set $l2649 + local.get $l2648 + local.get $l2649 + i32.add + local.set $l2650 + local.get $l2649 + local.get $l2650 + i32.add + local.set $l2651 + local.get $l2650 + local.get $l2651 + i32.add + local.set $l2652 + local.get $l2651 + local.get $l2652 + i32.add + local.set $l2653 + local.get $l2652 + local.get $l2653 + i32.add + local.set $l2654 + local.get $l2653 + local.get $l2654 + i32.add + local.set $l2655 + local.get $l2654 + local.get $l2655 + i32.add + local.set $l2656 + local.get $l2655 + local.get $l2656 + i32.add + local.set $l2657 + local.get $l2656 + local.get $l2657 + i32.add + local.set $l2658 + local.get $l2657 + local.get $l2658 + i32.add + local.set $l2659 + local.get $l2658 + local.get $l2659 + i32.add + local.set $l2660 + local.get $l2659 + local.get $l2660 + i32.add + local.set $l2661 + local.get $l2660 + local.get $l2661 + i32.add + local.set $l2662 + local.get $l2661 + local.get $l2662 + i32.add + local.set $l2663 + local.get $l2662 + local.get $l2663 + i32.add + local.set $l2664 + local.get $l2663 + local.get $l2664 + i32.add + local.set $l2665 + local.get $l2664 + local.get $l2665 + i32.add + local.set $l2666 + local.get $l2665 + local.get $l2666 + i32.add + local.set $l2667 + local.get $l2666 + local.get $l2667 + i32.add + local.set $l2668 + local.get $l2667 + local.get $l2668 + i32.add + local.set $l2669 + local.get $l2668 + local.get $l2669 + i32.add + local.set $l2670 + local.get $l2669 + local.get $l2670 + i32.add + local.set $l2671 + local.get $l2670 + local.get $l2671 + i32.add + local.set $l2672 + local.get $l2671 + local.get $l2672 + i32.add + local.set $l2673 + local.get $l2672 + local.get $l2673 + i32.add + local.set $l2674 + local.get $l2673 + local.get $l2674 + i32.add + local.set $l2675 + local.get $l2674 + local.get $l2675 + i32.add + local.set $l2676 + local.get $l2675 + local.get $l2676 + i32.add + local.set $l2677 + local.get $l2676 + local.get $l2677 + i32.add + local.set $l2678 + local.get $l2677 + local.get $l2678 + i32.add + local.set $l2679 + local.get $l2678 + local.get $l2679 + i32.add + local.set $l2680 + local.get $l2679 + local.get $l2680 + i32.add + local.set $l2681 + local.get $l2680 + local.get $l2681 + i32.add + local.set $l2682 + local.get $l2681 + local.get $l2682 + i32.add + local.set $l2683 + local.get $l2682 + local.get $l2683 + i32.add + local.set $l2684 + local.get $l2683 + local.get $l2684 + i32.add + local.set $l2685 + local.get $l2684 + local.get $l2685 + i32.add + local.set $l2686 + local.get $l2685 + local.get $l2686 + i32.add + local.set $l2687 + local.get $l2686 + local.get $l2687 + i32.add + local.set $l2688 + local.get $l2687 + local.get $l2688 + i32.add + local.set $l2689 + local.get $l2688 + local.get $l2689 + i32.add + local.set $l2690 + local.get $l2689 + local.get $l2690 + i32.add + local.set $l2691 + local.get $l2690 + local.get $l2691 + i32.add + local.set $l2692 + local.get $l2691 + local.get $l2692 + i32.add + local.set $l2693 + local.get $l2692 + local.get $l2693 + i32.add + local.set $l2694 + local.get $l2693 + local.get $l2694 + i32.add + local.set $l2695 + local.get $l2694 + local.get $l2695 + i32.add + local.set $l2696 + local.get $l2695 + local.get $l2696 + i32.add + local.set $l2697 + local.get $l2696 + local.get $l2697 + i32.add + local.set $l2698 + local.get $l2697 + local.get $l2698 + i32.add + local.set $l2699 + local.get $l2698 + local.get $l2699 + i32.add + local.set $l2700 + local.get $l2699 + local.get $l2700 + i32.add + local.set $l2701 + local.get $l2700 + local.get $l2701 + i32.add + local.set $l2702 + local.get $l2701 + local.get $l2702 + i32.add + local.set $l2703 + local.get $l2702 + local.get $l2703 + i32.add + local.set $l2704 + local.get $l2703 + local.get $l2704 + i32.add + local.set $l2705 + local.get $l2704 + local.get $l2705 + i32.add + local.set $l2706 + local.get $l2705 + local.get $l2706 + i32.add + local.set $l2707 + local.get $l2706 + local.get $l2707 + i32.add + local.set $l2708 + local.get $l2707 + local.get $l2708 + i32.add + local.set $l2709 + local.get $l2708 + local.get $l2709 + i32.add + local.set $l2710 + local.get $l2709 + local.get $l2710 + i32.add + local.set $l2711 + local.get $l2710 + local.get $l2711 + i32.add + local.set $l2712 + local.get $l2711 + local.get $l2712 + i32.add + local.set $l2713 + local.get $l2712 + local.get $l2713 + i32.add + local.set $l2714 + local.get $l2713 + local.get $l2714 + i32.add + local.set $l2715 + local.get $l2714 + local.get $l2715 + i32.add + local.set $l2716 + local.get $l2715 + local.get $l2716 + i32.add + local.set $l2717 + local.get $l2716 + local.get $l2717 + i32.add + local.set $l2718 + local.get $l2717 + local.get $l2718 + i32.add + local.set $l2719 + local.get $l2718 + local.get $l2719 + i32.add + local.set $l2720 + local.get $l2719 + local.get $l2720 + i32.add + local.set $l2721 + local.get $l2720 + local.get $l2721 + i32.add + local.set $l2722 + local.get $l2721 + local.get $l2722 + i32.add + local.set $l2723 + local.get $l2722 + local.get $l2723 + i32.add + local.set $l2724 + local.get $l2723 + local.get $l2724 + i32.add + local.set $l2725 + local.get $l2724 + local.get $l2725 + i32.add + local.set $l2726 + local.get $l2725 + local.get $l2726 + i32.add + local.set $l2727 + local.get $l2726 + local.get $l2727 + i32.add + local.set $l2728 + local.get $l2727 + local.get $l2728 + i32.add + local.set $l2729 + local.get $l2728 + local.get $l2729 + i32.add + local.set $l2730 + local.get $l2729 + local.get $l2730 + i32.add + local.set $l2731 + local.get $l2730 + local.get $l2731 + i32.add + local.set $l2732 + local.get $l2731 + local.get $l2732 + i32.add + local.set $l2733 + local.get $l2732 + local.get $l2733 + i32.add + local.set $l2734 + local.get $l2733 + local.get $l2734 + i32.add + local.set $l2735 + local.get $l2734 + local.get $l2735 + i32.add + local.set $l2736 + local.get $l2735 + local.get $l2736 + i32.add + local.set $l2737 + local.get $l2736 + local.get $l2737 + i32.add + local.set $l2738 + local.get $l2737 + local.get $l2738 + i32.add + local.set $l2739 + local.get $l2738 + local.get $l2739 + i32.add + local.set $l2740 + local.get $l2739 + local.get $l2740 + i32.add + local.set $l2741 + local.get $l2740 + local.get $l2741 + i32.add + local.set $l2742 + local.get $l2741 + local.get $l2742 + i32.add + local.set $l2743 + local.get $l2742 + local.get $l2743 + i32.add + local.set $l2744 + local.get $l2743 + local.get $l2744 + i32.add + local.set $l2745 + local.get $l2744 + local.get $l2745 + i32.add + local.set $l2746 + local.get $l2745 + local.get $l2746 + i32.add + local.set $l2747 + local.get $l2746 + local.get $l2747 + i32.add + local.set $l2748 + local.get $l2747 + local.get $l2748 + i32.add + local.set $l2749 + local.get $l2748 + local.get $l2749 + i32.add + local.set $l2750 + local.get $l2749 + local.get $l2750 + i32.add + local.set $l2751 + local.get $l2750 + local.get $l2751 + i32.add + local.set $l2752 + local.get $l2751 + local.get $l2752 + i32.add + local.set $l2753 + local.get $l2752 + local.get $l2753 + i32.add + local.set $l2754 + local.get $l2753 + local.get $l2754 + i32.add + local.set $l2755 + local.get $l2754 + local.get $l2755 + i32.add + local.set $l2756 + local.get $l2755 + local.get $l2756 + i32.add + local.set $l2757 + local.get $l2756 + local.get $l2757 + i32.add + local.set $l2758 + local.get $l2757 + local.get $l2758 + i32.add + local.set $l2759 + local.get $l2758 + local.get $l2759 + i32.add + local.set $l2760 + local.get $l2759 + local.get $l2760 + i32.add + local.set $l2761 + local.get $l2760 + local.get $l2761 + i32.add + local.set $l2762 + local.get $l2761 + local.get $l2762 + i32.add + local.set $l2763 + local.get $l2762 + local.get $l2763 + i32.add + local.set $l2764 + local.get $l2763 + local.get $l2764 + i32.add + local.set $l2765 + local.get $l2764 + local.get $l2765 + i32.add + local.set $l2766 + local.get $l2765 + local.get $l2766 + i32.add + local.set $l2767 + local.get $l2766 + local.get $l2767 + i32.add + local.set $l2768 + local.get $l2767 + local.get $l2768 + i32.add + local.set $l2769 + local.get $l2768 + local.get $l2769 + i32.add + local.set $l2770 + local.get $l2769 + local.get $l2770 + i32.add + local.set $l2771 + local.get $l2770 + local.get $l2771 + i32.add + local.set $l2772 + local.get $l2771 + local.get $l2772 + i32.add + local.set $l2773 + local.get $l2772 + local.get $l2773 + i32.add + local.set $l2774 + local.get $l2773 + local.get $l2774 + i32.add + local.set $l2775 + local.get $l2774 + local.get $l2775 + i32.add + local.set $l2776 + local.get $l2775 + local.get $l2776 + i32.add + local.set $l2777 + local.get $l2776 + local.get $l2777 + i32.add + local.set $l2778 + local.get $l2777 + local.get $l2778 + i32.add + local.set $l2779 + local.get $l2778 + local.get $l2779 + i32.add + local.set $l2780 + local.get $l2779 + local.get $l2780 + i32.add + local.set $l2781 + local.get $l2780 + local.get $l2781 + i32.add + local.set $l2782 + local.get $l2781 + local.get $l2782 + i32.add + local.set $l2783 + local.get $l2782 + local.get $l2783 + i32.add + local.set $l2784 + local.get $l2783 + local.get $l2784 + i32.add + local.set $l2785 + local.get $l2784 + local.get $l2785 + i32.add + local.set $l2786 + local.get $l2785 + local.get $l2786 + i32.add + local.set $l2787 + local.get $l2786 + local.get $l2787 + i32.add + local.set $l2788 + local.get $l2787 + local.get $l2788 + i32.add + local.set $l2789 + local.get $l2788 + local.get $l2789 + i32.add + local.set $l2790 + local.get $l2789 + local.get $l2790 + i32.add + local.set $l2791 + local.get $l2790 + local.get $l2791 + i32.add + local.set $l2792 + local.get $l2791 + local.get $l2792 + i32.add + local.set $l2793 + local.get $l2792 + local.get $l2793 + i32.add + local.set $l2794 + local.get $l2793 + local.get $l2794 + i32.add + local.set $l2795 + local.get $l2794 + local.get $l2795 + i32.add + local.set $l2796 + local.get $l2795 + local.get $l2796 + i32.add + local.set $l2797 + local.get $l2796 + local.get $l2797 + i32.add + local.set $l2798 + local.get $l2797 + local.get $l2798 + i32.add + local.set $l2799 + local.get $l2798 + local.get $l2799 + i32.add + local.set $l2800 + local.get $l2799 + local.get $l2800 + i32.add + local.set $l2801 + local.get $l2800 + local.get $l2801 + i32.add + local.set $l2802 + local.get $l2801 + local.get $l2802 + i32.add + local.set $l2803 + local.get $l2802 + local.get $l2803 + i32.add + local.set $l2804 + local.get $l2803 + local.get $l2804 + i32.add + local.set $l2805 + local.get $l2804 + local.get $l2805 + i32.add + local.set $l2806 + local.get $l2805 + local.get $l2806 + i32.add + local.set $l2807 + local.get $l2806 + local.get $l2807 + i32.add + local.set $l2808 + local.get $l2807 + local.get $l2808 + i32.add + local.set $l2809 + local.get $l2808 + local.get $l2809 + i32.add + local.set $l2810 + local.get $l2809 + local.get $l2810 + i32.add + local.set $l2811 + local.get $l2810 + local.get $l2811 + i32.add + local.set $l2812 + local.get $l2811 + local.get $l2812 + i32.add + local.set $l2813 + local.get $l2812 + local.get $l2813 + i32.add + local.set $l2814 + local.get $l2813 + local.get $l2814 + i32.add + local.set $l2815 + local.get $l2814 + local.get $l2815 + i32.add + local.set $l2816 + local.get $l2815 + local.get $l2816 + i32.add + local.set $l2817 + local.get $l2816 + local.get $l2817 + i32.add + local.set $l2818 + local.get $l2817 + local.get $l2818 + i32.add + local.set $l2819 + local.get $l2818 + local.get $l2819 + i32.add + local.set $l2820 + local.get $l2819 + local.get $l2820 + i32.add + local.set $l2821 + local.get $l2820 + local.get $l2821 + i32.add + local.set $l2822 + local.get $l2821 + local.get $l2822 + i32.add + local.set $l2823 + local.get $l2822 + local.get $l2823 + i32.add + local.set $l2824 + local.get $l2823 + local.get $l2824 + i32.add + local.set $l2825 + local.get $l2824 + local.get $l2825 + i32.add + local.set $l2826 + local.get $l2825 + local.get $l2826 + i32.add + local.set $l2827 + local.get $l2826 + local.get $l2827 + i32.add + local.set $l2828 + local.get $l2827 + local.get $l2828 + i32.add + local.set $l2829 + local.get $l2828 + local.get $l2829 + i32.add + local.set $l2830 + local.get $l2829 + local.get $l2830 + i32.add + local.set $l2831 + local.get $l2830 + local.get $l2831 + i32.add + local.set $l2832 + local.get $l2831 + local.get $l2832 + i32.add + local.set $l2833 + local.get $l2832 + local.get $l2833 + i32.add + local.set $l2834 + local.get $l2833 + local.get $l2834 + i32.add + local.set $l2835 + local.get $l2834 + local.get $l2835 + i32.add + local.set $l2836 + local.get $l2835 + local.get $l2836 + i32.add + local.set $l2837 + local.get $l2836 + local.get $l2837 + i32.add + local.set $l2838 + local.get $l2837 + local.get $l2838 + i32.add + local.set $l2839 + local.get $l2838 + local.get $l2839 + i32.add + local.set $l2840 + local.get $l2839 + local.get $l2840 + i32.add + local.set $l2841 + local.get $l2840 + local.get $l2841 + i32.add + local.set $l2842 + local.get $l2841 + local.get $l2842 + i32.add + local.set $l2843 + local.get $l2842 + local.get $l2843 + i32.add + local.set $l2844 + local.get $l2843 + local.get $l2844 + i32.add + local.set $l2845 + local.get $l2844 + local.get $l2845 + i32.add + local.set $l2846 + local.get $l2845 + local.get $l2846 + i32.add + local.set $l2847 + local.get $l2846 + local.get $l2847 + i32.add + local.set $l2848 + local.get $l2847 + local.get $l2848 + i32.add + local.set $l2849 + local.get $l2848 + local.get $l2849 + i32.add + local.set $l2850 + local.get $l2849 + local.get $l2850 + i32.add + local.set $l2851 + local.get $l2850 + local.get $l2851 + i32.add + local.set $l2852 + local.get $l2851 + local.get $l2852 + i32.add + local.set $l2853 + local.get $l2852 + local.get $l2853 + i32.add + local.set $l2854 + local.get $l2853 + local.get $l2854 + i32.add + local.set $l2855 + local.get $l2854 + local.get $l2855 + i32.add + local.set $l2856 + local.get $l2855 + local.get $l2856 + i32.add + local.set $l2857 + local.get $l2856 + local.get $l2857 + i32.add + local.set $l2858 + local.get $l2857 + local.get $l2858 + i32.add + local.set $l2859 + local.get $l2858 + local.get $l2859 + i32.add + local.set $l2860 + local.get $l2859 + local.get $l2860 + i32.add + local.set $l2861 + local.get $l2860 + local.get $l2861 + i32.add + local.set $l2862 + local.get $l2861 + local.get $l2862 + i32.add + local.set $l2863 + local.get $l2862 + local.get $l2863 + i32.add + local.set $l2864 + local.get $l2863 + local.get $l2864 + i32.add + local.set $l2865 + local.get $l2864 + local.get $l2865 + i32.add + local.set $l2866 + local.get $l2865 + local.get $l2866 + i32.add + local.set $l2867 + local.get $l2866 + local.get $l2867 + i32.add + local.set $l2868 + local.get $l2867 + local.get $l2868 + i32.add + local.set $l2869 + local.get $l2868 + local.get $l2869 + i32.add + local.set $l2870 + local.get $l2869 + local.get $l2870 + i32.add + local.set $l2871 + local.get $l2870 + local.get $l2871 + i32.add + local.set $l2872 + local.get $l2871 + local.get $l2872 + i32.add + local.set $l2873 + local.get $l2872 + local.get $l2873 + i32.add + local.set $l2874 + local.get $l2873 + local.get $l2874 + i32.add + local.set $l2875 + local.get $l2874 + local.get $l2875 + i32.add + local.set $l2876 + local.get $l2875 + local.get $l2876 + i32.add + local.set $l2877 + local.get $l2876 + local.get $l2877 + i32.add + local.set $l2878 + local.get $l2877 + local.get $l2878 + i32.add + local.set $l2879 + local.get $l2878 + local.get $l2879 + i32.add + local.set $l2880 + local.get $l2879 + local.get $l2880 + i32.add + local.set $l2881 + local.get $l2880 + local.get $l2881 + i32.add + local.set $l2882 + local.get $l2881 + local.get $l2882 + i32.add + local.set $l2883 + local.get $l2882 + local.get $l2883 + i32.add + local.set $l2884 + local.get $l2883 + local.get $l2884 + i32.add + local.set $l2885 + local.get $l2884 + local.get $l2885 + i32.add + local.set $l2886 + local.get $l2885 + local.get $l2886 + i32.add + local.set $l2887 + local.get $l2886 + local.get $l2887 + i32.add + local.set $l2888 + local.get $l2887 + local.get $l2888 + i32.add + local.set $l2889 + local.get $l2888 + local.get $l2889 + i32.add + local.set $l2890 + local.get $l2889 + local.get $l2890 + i32.add + local.set $l2891 + local.get $l2890 + local.get $l2891 + i32.add + local.set $l2892 + local.get $l2891 + local.get $l2892 + i32.add + local.set $l2893 + local.get $l2892 + local.get $l2893 + i32.add + local.set $l2894 + local.get $l2893 + local.get $l2894 + i32.add + local.set $l2895 + local.get $l2894 + local.get $l2895 + i32.add + local.set $l2896 + local.get $l2895 + local.get $l2896 + i32.add + local.set $l2897 + local.get $l2896 + local.get $l2897 + i32.add + local.set $l2898 + local.get $l2897 + local.get $l2898 + i32.add + local.set $l2899 + local.get $l2898 + local.get $l2899 + i32.add + local.set $l2900 + local.get $l2899 + local.get $l2900 + i32.add + local.set $l2901 + local.get $l2900 + local.get $l2901 + i32.add + local.set $l2902 + local.get $l2901 + local.get $l2902 + i32.add + local.set $l2903 + local.get $l2902 + local.get $l2903 + i32.add + local.set $l2904 + local.get $l2903 + local.get $l2904 + i32.add + local.set $l2905 + local.get $l2904 + local.get $l2905 + i32.add + local.set $l2906 + local.get $l2905 + local.get $l2906 + i32.add + local.set $l2907 + local.get $l2906 + local.get $l2907 + i32.add + local.set $l2908 + local.get $l2907 + local.get $l2908 + i32.add + local.set $l2909 + local.get $l2908 + local.get $l2909 + i32.add + local.set $l2910 + local.get $l2909 + local.get $l2910 + i32.add + local.set $l2911 + local.get $l2910 + local.get $l2911 + i32.add + local.set $l2912 + local.get $l2911 + local.get $l2912 + i32.add + local.set $l2913 + local.get $l2912 + local.get $l2913 + i32.add + local.set $l2914 + local.get $l2913 + local.get $l2914 + i32.add + local.set $l2915 + local.get $l2914 + local.get $l2915 + i32.add + local.set $l2916 + local.get $l2915 + local.get $l2916 + i32.add + local.set $l2917 + local.get $l2916 + local.get $l2917 + i32.add + local.set $l2918 + local.get $l2917 + local.get $l2918 + i32.add + local.set $l2919 + local.get $l2918 + local.get $l2919 + i32.add + local.set $l2920 + local.get $l2919 + local.get $l2920 + i32.add + local.set $l2921 + local.get $l2920 + local.get $l2921 + i32.add + local.set $l2922 + local.get $l2921 + local.get $l2922 + i32.add + local.set $l2923 + local.get $l2922 + local.get $l2923 + i32.add + local.set $l2924 + local.get $l2923 + local.get $l2924 + i32.add + local.set $l2925 + local.get $l2924 + local.get $l2925 + i32.add + local.set $l2926 + local.get $l2925 + local.get $l2926 + i32.add + local.set $l2927 + local.get $l2926 + local.get $l2927 + i32.add + local.set $l2928 + local.get $l2927 + local.get $l2928 + i32.add + local.set $l2929 + local.get $l2928 + local.get $l2929 + i32.add + local.set $l2930 + local.get $l2929 + local.get $l2930 + i32.add + local.set $l2931 + local.get $l2930 + local.get $l2931 + i32.add + local.set $l2932 + local.get $l2931 + local.get $l2932 + i32.add + local.set $l2933 + local.get $l2932 + local.get $l2933 + i32.add + local.set $l2934 + local.get $l2933 + local.get $l2934 + i32.add + local.set $l2935 + local.get $l2934 + local.get $l2935 + i32.add + local.set $l2936 + local.get $l2935 + local.get $l2936 + i32.add + local.set $l2937 + local.get $l2936 + local.get $l2937 + i32.add + local.set $l2938 + local.get $l2937 + local.get $l2938 + i32.add + local.set $l2939 + local.get $l2938 + local.get $l2939 + i32.add + local.set $l2940 + local.get $l2939 + local.get $l2940 + i32.add + local.set $l2941 + local.get $l2940 + local.get $l2941 + i32.add + local.set $l2942 + local.get $l2941 + local.get $l2942 + i32.add + local.set $l2943 + local.get $l2942 + local.get $l2943 + i32.add + local.set $l2944 + local.get $l2943 + local.get $l2944 + i32.add + local.set $l2945 + local.get $l2944 + local.get $l2945 + i32.add + local.set $l2946 + local.get $l2945 + local.get $l2946 + i32.add + local.set $l2947 + local.get $l2946 + local.get $l2947 + i32.add + local.set $l2948 + local.get $l2947 + local.get $l2948 + i32.add + local.set $l2949 + local.get $l2948 + local.get $l2949 + i32.add + local.set $l2950 + local.get $l2949 + local.get $l2950 + i32.add + local.set $l2951 + local.get $l2950 + local.get $l2951 + i32.add + local.set $l2952 + local.get $l2951 + local.get $l2952 + i32.add + local.set $l2953 + local.get $l2952 + local.get $l2953 + i32.add + local.set $l2954 + local.get $l2953 + local.get $l2954 + i32.add + local.set $l2955 + local.get $l2954 + local.get $l2955 + i32.add + local.set $l2956 + local.get $l2955 + local.get $l2956 + i32.add + local.set $l2957 + local.get $l2956 + local.get $l2957 + i32.add + local.set $l2958 + local.get $l2957 + local.get $l2958 + i32.add + local.set $l2959 + local.get $l2958 + local.get $l2959 + i32.add + local.set $l2960 + local.get $l2959 + local.get $l2960 + i32.add + local.set $l2961 + local.get $l2960 + local.get $l2961 + i32.add + local.set $l2962 + local.get $l2961 + local.get $l2962 + i32.add + local.set $l2963 + local.get $l2962 + local.get $l2963 + i32.add + local.set $l2964 + local.get $l2963 + local.get $l2964 + i32.add + local.set $l2965 + local.get $l2964 + local.get $l2965 + i32.add + local.set $l2966 + local.get $l2965 + local.get $l2966 + i32.add + local.set $l2967 + local.get $l2966 + local.get $l2967 + i32.add + local.set $l2968 + local.get $l2967 + local.get $l2968 + i32.add + local.set $l2969 + local.get $l2968 + local.get $l2969 + i32.add + local.set $l2970 + local.get $l2969 + local.get $l2970 + i32.add + local.set $l2971 + local.get $l2970 + local.get $l2971 + i32.add + local.set $l2972 + local.get $l2971 + local.get $l2972 + i32.add + local.set $l2973 + local.get $l2972 + local.get $l2973 + i32.add + local.set $l2974 + local.get $l2973 + local.get $l2974 + i32.add + local.set $l2975 + local.get $l2974 + local.get $l2975 + i32.add + local.set $l2976 + local.get $l2975 + local.get $l2976 + i32.add + local.set $l2977 + local.get $l2976 + local.get $l2977 + i32.add + local.set $l2978 + local.get $l2977 + local.get $l2978 + i32.add + local.set $l2979 + local.get $l2978 + local.get $l2979 + i32.add + local.set $l2980 + local.get $l2979 + local.get $l2980 + i32.add + local.set $l2981 + local.get $l2980 + local.get $l2981 + i32.add + local.set $l2982 + local.get $l2981 + local.get $l2982 + i32.add + local.set $l2983 + local.get $l2982 + local.get $l2983 + i32.add + local.set $l2984 + local.get $l2983 + local.get $l2984 + i32.add + local.set $l2985 + local.get $l2984 + local.get $l2985 + i32.add + local.set $l2986 + local.get $l2985 + local.get $l2986 + i32.add + local.set $l2987 + local.get $l2986 + local.get $l2987 + i32.add + local.set $l2988 + local.get $l2987 + local.get $l2988 + i32.add + local.set $l2989 + local.get $l2988 + local.get $l2989 + i32.add + local.set $l2990 + local.get $l2989 + local.get $l2990 + i32.add + local.set $l2991 + local.get $l2990 + local.get $l2991 + i32.add + local.set $l2992 + local.get $l2991 + local.get $l2992 + i32.add + local.set $l2993 + local.get $l2992 + local.get $l2993 + i32.add + local.set $l2994 + local.get $l2993 + local.get $l2994 + i32.add + local.set $l2995 + local.get $l2994 + local.get $l2995 + i32.add + local.set $l2996 + local.get $l2995 + local.get $l2996 + i32.add + local.set $l2997 + local.get $l2996 + local.get $l2997 + i32.add + local.set $l2998 + local.get $l2997 + local.get $l2998 + i32.add + local.set $l2999 + local.get $l2998 + local.get $l2999 + i32.add + local.set $l3000 + local.get $l2999 + local.get $l3000 + i32.add + local.set $l3001 + local.get $l3000 + local.get $l3001 + i32.add + local.set $l3002 + local.get $l3001 + local.get $l3002 + i32.add + local.set $l3003 + local.get $l3002 + local.get $l3003 + i32.add + local.set $l3004 + local.get $l3003 + local.get $l3004 + i32.add + local.set $l3005 + local.get $l3004 + local.get $l3005 + i32.add + local.set $l3006 + local.get $l3005 + local.get $l3006 + i32.add + local.set $l3007 + local.get $l3006 + local.get $l3007 + i32.add + local.set $l3008 + local.get $l3007 + local.get $l3008 + i32.add + local.set $l3009 + local.get $l3008 + local.get $l3009 + i32.add + local.set $l3010 + local.get $l3009 + local.get $l3010 + i32.add + local.set $l3011 + local.get $l3010 + local.get $l3011 + i32.add + local.set $l3012 + local.get $l3011 + local.get $l3012 + i32.add + local.set $l3013 + local.get $l3012 + local.get $l3013 + i32.add + local.set $l3014 + local.get $l3013 + local.get $l3014 + i32.add + local.set $l3015 + local.get $l3014 + local.get $l3015 + i32.add + local.set $l3016 + local.get $l3015 + local.get $l3016 + i32.add + local.set $l3017 + local.get $l3016 + local.get $l3017 + i32.add + local.set $l3018 + local.get $l3017 + local.get $l3018 + i32.add + local.set $l3019 + local.get $l3018 + local.get $l3019 + i32.add + local.set $l3020 + local.get $l3019 + local.get $l3020 + i32.add + local.set $l3021 + local.get $l3020 + local.get $l3021 + i32.add + local.set $l3022 + local.get $l3021 + local.get $l3022 + i32.add + local.set $l3023 + local.get $l3022 + local.get $l3023 + i32.add + local.set $l3024 + local.get $l3023 + local.get $l3024 + i32.add + local.set $l3025 + local.get $l3024 + local.get $l3025 + i32.add + local.set $l3026 + local.get $l3025 + local.get $l3026 + i32.add + local.set $l3027 + local.get $l3026 + local.get $l3027 + i32.add + local.set $l3028 + local.get $l3027 + local.get $l3028 + i32.add + local.set $l3029 + local.get $l3028 + local.get $l3029 + i32.add + local.set $l3030 + local.get $l3029 + local.get $l3030 + i32.add + local.set $l3031 + local.get $l3030 + local.get $l3031 + i32.add + local.set $l3032 + local.get $l3031 + local.get $l3032 + i32.add + local.set $l3033 + local.get $l3032 + local.get $l3033 + i32.add + local.set $l3034 + local.get $l3033 + local.get $l3034 + i32.add + local.set $l3035 + local.get $l3034 + local.get $l3035 + i32.add + local.set $l3036 + local.get $l3035 + local.get $l3036 + i32.add + local.set $l3037 + local.get $l3036 + local.get $l3037 + i32.add + local.set $l3038 + local.get $l3037 + local.get $l3038 + i32.add + local.set $l3039 + local.get $l3038 + local.get $l3039 + i32.add + local.set $l3040 + local.get $l3039 + local.get $l3040 + i32.add + local.set $l3041 + local.get $l3040 + local.get $l3041 + i32.add + local.set $l3042 + local.get $l3041 + local.get $l3042 + i32.add + local.set $l3043 + local.get $l3042 + local.get $l3043 + i32.add + local.set $l3044 + local.get $l3043 + local.get $l3044 + i32.add + local.set $l3045 + local.get $l3044 + local.get $l3045 + i32.add + local.set $l3046 + local.get $l3045 + local.get $l3046 + i32.add + local.set $l3047 + local.get $l3046 + local.get $l3047 + i32.add + local.set $l3048 + local.get $l3047 + local.get $l3048 + i32.add + local.set $l3049 + local.get $l3048 + local.get $l3049 + i32.add + local.set $l3050 + local.get $l3049 + local.get $l3050 + i32.add + local.set $l3051 + local.get $l3050 + local.get $l3051 + i32.add + local.set $l3052 + local.get $l3051 + local.get $l3052 + i32.add + local.set $l3053 + local.get $l3052 + local.get $l3053 + i32.add + local.set $l3054 + local.get $l3053 + local.get $l3054 + i32.add + local.set $l3055 + local.get $l3054 + local.get $l3055 + i32.add + local.set $l3056 + local.get $l3055 + local.get $l3056 + i32.add + local.set $l3057 + local.get $l3056 + local.get $l3057 + i32.add + local.set $l3058 + local.get $l3057 + local.get $l3058 + i32.add + local.set $l3059 + local.get $l3058 + local.get $l3059 + i32.add + local.set $l3060 + local.get $l3059 + local.get $l3060 + i32.add + local.set $l3061 + local.get $l3060 + local.get $l3061 + i32.add + local.set $l3062 + local.get $l3061 + local.get $l3062 + i32.add + local.set $l3063 + local.get $l3062 + local.get $l3063 + i32.add + local.set $l3064 + local.get $l3063 + local.get $l3064 + i32.add + local.set $l3065 + local.get $l3064 + local.get $l3065 + i32.add + local.set $l3066 + local.get $l3065 + local.get $l3066 + i32.add + local.set $l3067 + local.get $l3066 + local.get $l3067 + i32.add + local.set $l3068 + local.get $l3067 + local.get $l3068 + i32.add + local.set $l3069 + local.get $l3068 + local.get $l3069 + i32.add + local.set $l3070 + local.get $l3069 + local.get $l3070 + i32.add + local.set $l3071 + local.get $l3070 + local.get $l3071 + i32.add + local.set $l3072 + local.get $l3071 + local.get $l3072 + i32.add + local.set $l3073 + local.get $l3072 + local.get $l3073 + i32.add + local.set $l3074 + local.get $l3073 + local.get $l3074 + i32.add + local.set $l3075 + local.get $l3074 + local.get $l3075 + i32.add + local.set $l3076 + local.get $l3075 + local.get $l3076 + i32.add + local.set $l3077 + local.get $l3076 + local.get $l3077 + i32.add + local.set $l3078 + local.get $l3077 + local.get $l3078 + i32.add + local.set $l3079 + local.get $l3078 + local.get $l3079 + i32.add + local.set $l3080 + local.get $l3079 + local.get $l3080 + i32.add + local.set $l3081 + local.get $l3080 + local.get $l3081 + i32.add + local.set $l3082 + local.get $l3081 + local.get $l3082 + i32.add + local.set $l3083 + local.get $l3082 + local.get $l3083 + i32.add + local.set $l3084 + local.get $l3083 + local.get $l3084 + i32.add + local.set $l3085 + local.get $l3084 + local.get $l3085 + i32.add + local.set $l3086 + local.get $l3085 + local.get $l3086 + i32.add + local.set $l3087 + local.get $l3086 + local.get $l3087 + i32.add + local.set $l3088 + local.get $l3087 + local.get $l3088 + i32.add + local.set $l3089 + local.get $l3088 + local.get $l3089 + i32.add + local.set $l3090 + local.get $l3089 + local.get $l3090 + i32.add + local.set $l3091 + local.get $l3090 + local.get $l3091 + i32.add + local.set $l3092 + local.get $l3091 + local.get $l3092 + i32.add + local.set $l3093 + local.get $l3092 + local.get $l3093 + i32.add + local.set $l3094 + local.get $l3093 + local.get $l3094 + i32.add + local.set $l3095 + local.get $l3094 + local.get $l3095 + i32.add + local.set $l3096 + local.get $l3095 + local.get $l3096 + i32.add + local.set $l3097 + local.get $l3096 + local.get $l3097 + i32.add + local.set $l3098 + local.get $l3097 + local.get $l3098 + i32.add + local.set $l3099 + local.get $l3098 + local.get $l3099 + i32.add + local.set $l3100 + local.get $l3099 + local.get $l3100 + i32.add + local.set $l3101 + local.get $l3100 + local.get $l3101 + i32.add + local.set $l3102 + local.get $l3101 + local.get $l3102 + i32.add + local.set $l3103 + local.get $l3102 + local.get $l3103 + i32.add + local.set $l3104 + local.get $l3103 + local.get $l3104 + i32.add + local.set $l3105 + local.get $l3104 + local.get $l3105 + i32.add + local.set $l3106 + local.get $l3105 + local.get $l3106 + i32.add + local.set $l3107 + local.get $l3106 + local.get $l3107 + i32.add + local.set $l3108 + local.get $l3107 + local.get $l3108 + i32.add + local.set $l3109 + local.get $l3108 + local.get $l3109 + i32.add + local.set $l3110 + local.get $l3109 + local.get $l3110 + i32.add + local.set $l3111 + local.get $l3110 + local.get $l3111 + i32.add + local.set $l3112 + local.get $l3111 + local.get $l3112 + i32.add + local.set $l3113 + local.get $l3112 + local.get $l3113 + i32.add + local.set $l3114 + local.get $l3113 + local.get $l3114 + i32.add + local.set $l3115 + local.get $l3114 + local.get $l3115 + i32.add + local.set $l3116 + local.get $l3115 + local.get $l3116 + i32.add + local.set $l3117 + local.get $l3116 + local.get $l3117 + i32.add + local.set $l3118 + local.get $l3117 + local.get $l3118 + i32.add + local.set $l3119 + local.get $l3118 + local.get $l3119 + i32.add + local.set $l3120 + local.get $l3119 + local.get $l3120 + i32.add + local.set $l3121 + local.get $l3120 + local.get $l3121 + i32.add + local.set $l3122 + local.get $l3121 + local.get $l3122 + i32.add + local.set $l3123 + local.get $l3122 + local.get $l3123 + i32.add + local.set $l3124 + local.get $l3123 + local.get $l3124 + i32.add + local.set $l3125 + local.get $l3124 + local.get $l3125 + i32.add + local.set $l3126 + local.get $l3125 + local.get $l3126 + i32.add + local.set $l3127 + local.get $l3126 + local.get $l3127 + i32.add + local.set $l3128 + local.get $l3127 + local.get $l3128 + i32.add + local.set $l3129 + local.get $l3128 + local.get $l3129 + i32.add + local.set $l3130 + local.get $l3129 + local.get $l3130 + i32.add + local.set $l3131 + local.get $l3130 + local.get $l3131 + i32.add + local.set $l3132 + local.get $l3131 + local.get $l3132 + i32.add + local.set $l3133 + local.get $l3132 + local.get $l3133 + i32.add + local.set $l3134 + local.get $l3133 + local.get $l3134 + i32.add + local.set $l3135 + local.get $l3134 + local.get $l3135 + i32.add + local.set $l3136 + local.get $l3135 + local.get $l3136 + i32.add + local.set $l3137 + local.get $l3136 + local.get $l3137 + i32.add + local.set $l3138 + local.get $l3137 + local.get $l3138 + i32.add + local.set $l3139 + local.get $l3138 + local.get $l3139 + i32.add + local.set $l3140 + local.get $l3139 + local.get $l3140 + i32.add + local.set $l3141 + local.get $l3140 + local.get $l3141 + i32.add + local.set $l3142 + local.get $l3141 + local.get $l3142 + i32.add + local.set $l3143 + local.get $l3142 + local.get $l3143 + i32.add + local.set $l3144 + local.get $l3143 + local.get $l3144 + i32.add + local.set $l3145 + local.get $l3144 + local.get $l3145 + i32.add + local.set $l3146 + local.get $l3145 + local.get $l3146 + i32.add + local.set $l3147 + local.get $l3146 + local.get $l3147 + i32.add + local.set $l3148 + local.get $l3147 + local.get $l3148 + i32.add + local.set $l3149 + local.get $l3148 + local.get $l3149 + i32.add + local.set $l3150 + local.get $l3149 + local.get $l3150 + i32.add + local.set $l3151 + local.get $l3150 + local.get $l3151 + i32.add + local.set $l3152 + local.get $l3151 + local.get $l3152 + i32.add + local.set $l3153 + local.get $l3152 + local.get $l3153 + i32.add + local.set $l3154 + local.get $l3153 + local.get $l3154 + i32.add + local.set $l3155 + local.get $l3154 + local.get $l3155 + i32.add + local.set $l3156 + local.get $l3155 + local.get $l3156 + i32.add + local.set $l3157 + local.get $l3156 + local.get $l3157 + i32.add + local.set $l3158 + local.get $l3157 + local.get $l3158 + i32.add + local.set $l3159 + local.get $l3158 + local.get $l3159 + i32.add + local.set $l3160 + local.get $l3159 + local.get $l3160 + i32.add + local.set $l3161 + local.get $l3160 + local.get $l3161 + i32.add + local.set $l3162 + local.get $l3161 + local.get $l3162 + i32.add + local.set $l3163 + local.get $l3162 + local.get $l3163 + i32.add + local.set $l3164 + local.get $l3163 + local.get $l3164 + i32.add + local.set $l3165 + local.get $l3164 + local.get $l3165 + i32.add + local.set $l3166 + local.get $l3165 + local.get $l3166 + i32.add + local.set $l3167 + local.get $l3166 + local.get $l3167 + i32.add + local.set $l3168 + local.get $l3167 + local.get $l3168 + i32.add + local.set $l3169 + local.get $l3168 + local.get $l3169 + i32.add + local.set $l3170 + local.get $l3169 + local.get $l3170 + i32.add + local.set $l3171 + local.get $l3170 + local.get $l3171 + i32.add + local.set $l3172 + local.get $l3171 + local.get $l3172 + i32.add + local.set $l3173 + local.get $l3172 + local.get $l3173 + i32.add + local.set $l3174 + local.get $l3173 + local.get $l3174 + i32.add + local.set $l3175 + local.get $l3174 + local.get $l3175 + i32.add + local.set $l3176 + local.get $l3175 + local.get $l3176 + i32.add + local.set $l3177 + local.get $l3176 + local.get $l3177 + i32.add + local.set $l3178 + local.get $l3177 + local.get $l3178 + i32.add + local.set $l3179 + local.get $l3178 + local.get $l3179 + i32.add + local.set $l3180 + local.get $l3179 + local.get $l3180 + i32.add + local.set $l3181 + local.get $l3180 + local.get $l3181 + i32.add + local.set $l3182 + local.get $l3181 + local.get $l3182 + i32.add + local.set $l3183 + local.get $l3182 + local.get $l3183 + i32.add + local.set $l3184 + local.get $l3183 + local.get $l3184 + i32.add + local.set $l3185 + local.get $l3184 + local.get $l3185 + i32.add + local.set $l3186 + local.get $l3185 + local.get $l3186 + i32.add + local.set $l3187 + local.get $l3186 + local.get $l3187 + i32.add + local.set $l3188 + local.get $l3187 + local.get $l3188 + i32.add + local.set $l3189 + local.get $l3188 + local.get $l3189 + i32.add + local.set $l3190 + local.get $l3189 + local.get $l3190 + i32.add + local.set $l3191 + local.get $l3190 + local.get $l3191 + i32.add + local.set $l3192 + local.get $l3191 + local.get $l3192 + i32.add + local.set $l3193 + local.get $l3192 + local.get $l3193 + i32.add + local.set $l3194 + local.get $l3193 + local.get $l3194 + i32.add + local.set $l3195 + local.get $l3194 + local.get $l3195 + i32.add + local.set $l3196 + local.get $l3195 + local.get $l3196 + i32.add + local.set $l3197 + local.get $l3196 + local.get $l3197 + i32.add + local.set $l3198 + local.get $l3197 + local.get $l3198 + i32.add + local.set $l3199 + local.get $l3198 + local.get $l3199 + i32.add + local.set $l3200 + local.get $l3199 + local.get $l3200 + i32.add + local.set $l3201 + local.get $l3200 + local.get $l3201 + i32.add + local.set $l3202 + local.get $l3201 + local.get $l3202 + i32.add + local.set $l3203 + local.get $l3202 + local.get $l3203 + i32.add + local.set $l3204 + local.get $l3203 + local.get $l3204 + i32.add + local.set $l3205 + local.get $l3204 + local.get $l3205 + i32.add + local.set $l3206 + local.get $l3205 + local.get $l3206 + i32.add + local.set $l3207 + local.get $l3206 + local.get $l3207 + i32.add + local.set $l3208 + local.get $l3207 + local.get $l3208 + i32.add + local.set $l3209 + local.get $l3208 + local.get $l3209 + i32.add + local.set $l3210 + local.get $l3209 + local.get $l3210 + i32.add + local.set $l3211 + local.get $l3210 + local.get $l3211 + i32.add + local.set $l3212 + local.get $l3211 + local.get $l3212 + i32.add + local.set $l3213 + local.get $l3212 + local.get $l3213 + i32.add + local.set $l3214 + local.get $l3213 + local.get $l3214 + i32.add + local.set $l3215 + local.get $l3214 + local.get $l3215 + i32.add + local.set $l3216 + local.get $l3215 + local.get $l3216 + i32.add + local.set $l3217 + local.get $l3216 + local.get $l3217 + i32.add + local.set $l3218 + local.get $l3217 + local.get $l3218 + i32.add + local.set $l3219 + local.get $l3218 + local.get $l3219 + i32.add + local.set $l3220 + local.get $l3219 + local.get $l3220 + i32.add + local.set $l3221 + local.get $l3220 + local.get $l3221 + i32.add + local.set $l3222 + local.get $l3221 + local.get $l3222 + i32.add + local.set $l3223 + local.get $l3222 + local.get $l3223 + i32.add + local.set $l3224 + local.get $l3223 + local.get $l3224 + i32.add + local.set $l3225 + local.get $l3224 + local.get $l3225 + i32.add + local.set $l3226 + local.get $l3225 + local.get $l3226 + i32.add + local.set $l3227 + local.get $l3226 + local.get $l3227 + i32.add + local.set $l3228 + local.get $l3227 + local.get $l3228 + i32.add + local.set $l3229 + local.get $l3228 + local.get $l3229 + i32.add + local.set $l3230 + local.get $l3229 + local.get $l3230 + i32.add + local.set $l3231 + local.get $l3230 + local.get $l3231 + i32.add + local.set $l3232 + local.get $l3231 + local.get $l3232 + i32.add + local.set $l3233 + local.get $l3232 + local.get $l3233 + i32.add + local.set $l3234 + local.get $l3233 + local.get $l3234 + i32.add + local.set $l3235 + local.get $l3234 + local.get $l3235 + i32.add + local.set $l3236 + local.get $l3235 + local.get $l3236 + i32.add + local.set $l3237 + local.get $l3236 + local.get $l3237 + i32.add + local.set $l3238 + local.get $l3237 + local.get $l3238 + i32.add + local.set $l3239 + local.get $l3238 + local.get $l3239 + i32.add + local.set $l3240 + local.get $l3239 + local.get $l3240 + i32.add + local.set $l3241 + local.get $l3240 + local.get $l3241 + i32.add + local.set $l3242 + local.get $l3241 + local.get $l3242 + i32.add + local.set $l3243 + local.get $l3242 + local.get $l3243 + i32.add + local.set $l3244 + local.get $l3243 + local.get $l3244 + i32.add + local.set $l3245 + local.get $l3244 + local.get $l3245 + i32.add + local.set $l3246 + local.get $l3245 + local.get $l3246 + i32.add + local.set $l3247 + local.get $l3246 + local.get $l3247 + i32.add + local.set $l3248 + local.get $l3247 + local.get $l3248 + i32.add + local.set $l3249 + local.get $l3248 + local.get $l3249 + i32.add + local.set $l3250 + local.get $l3249 + local.get $l3250 + i32.add + local.set $l3251 + local.get $l3250 + local.get $l3251 + i32.add + local.set $l3252 + local.get $l3251 + local.get $l3252 + i32.add + local.set $l3253 + local.get $l3252 + local.get $l3253 + i32.add + local.set $l3254 + local.get $l3253 + local.get $l3254 + i32.add + local.set $l3255 + local.get $l3254 + local.get $l3255 + i32.add + local.set $l3256 + local.get $l3255 + local.get $l3256 + i32.add + local.set $l3257 + local.get $l3256 + local.get $l3257 + i32.add + local.set $l3258 + local.get $l3257 + local.get $l3258 + i32.add + local.set $l3259 + local.get $l3258 + local.get $l3259 + i32.add + local.set $l3260 + local.get $l3259 + local.get $l3260 + i32.add + local.set $l3261 + local.get $l3260 + local.get $l3261 + i32.add + local.set $l3262 + local.get $l3261 + local.get $l3262 + i32.add + local.set $l3263 + local.get $l3262 + local.get $l3263 + i32.add + local.set $l3264 + local.get $l3263 + local.get $l3264 + i32.add + local.set $l3265 + local.get $l3264 + local.get $l3265 + i32.add + local.set $l3266 + local.get $l3265 + local.get $l3266 + i32.add + local.set $l3267 + local.get $l3266 + local.get $l3267 + i32.add + local.set $l3268 + local.get $l3267 + local.get $l3268 + i32.add + local.set $l3269 + local.get $l3268 + local.get $l3269 + i32.add + local.set $l3270 + local.get $l3269 + local.get $l3270 + i32.add + local.set $l3271 + local.get $l3270 + local.get $l3271 + i32.add + local.set $l3272 + local.get $l3271 + local.get $l3272 + i32.add + local.set $l3273 + local.get $l3272 + local.get $l3273 + i32.add + local.set $l3274 + local.get $l3273 + local.get $l3274 + i32.add + local.set $l3275 + local.get $l3274 + local.get $l3275 + i32.add + local.set $l3276 + local.get $l3275 + local.get $l3276 + i32.add + local.set $l3277 + local.get $l3276 + local.get $l3277 + i32.add + local.set $l3278 + local.get $l3277 + local.get $l3278 + i32.add + local.set $l3279 + local.get $l3278 + local.get $l3279 + i32.add + local.set $l3280 + local.get $l3279 + local.get $l3280 + i32.add + local.set $l3281 + local.get $l3280 + local.get $l3281 + i32.add + local.set $l3282 + local.get $l3281 + local.get $l3282 + i32.add + local.set $l3283 + local.get $l3282 + local.get $l3283 + i32.add + local.set $l3284 + local.get $l3283 + local.get $l3284 + i32.add + local.set $l3285 + local.get $l3284 + local.get $l3285 + i32.add + local.set $l3286 + local.get $l3285 + local.get $l3286 + i32.add + local.set $l3287 + local.get $l3286 + local.get $l3287 + i32.add + local.set $l3288 + local.get $l3287 + local.get $l3288 + i32.add + local.set $l3289 + local.get $l3288 + local.get $l3289 + i32.add + local.set $l3290 + local.get $l3289 + local.get $l3290 + i32.add + local.set $l3291 + local.get $l3290 + local.get $l3291 + i32.add + local.set $l3292 + local.get $l3291 + local.get $l3292 + i32.add + local.set $l3293 + local.get $l3292 + local.get $l3293 + i32.add + local.set $l3294 + local.get $l3293 + local.get $l3294 + i32.add + local.set $l3295 + local.get $l3294 + local.get $l3295 + i32.add + local.set $l3296 + local.get $l3295 + local.get $l3296 + i32.add + local.set $l3297 + local.get $l3296 + local.get $l3297 + i32.add + local.set $l3298 + local.get $l3297 + local.get $l3298 + i32.add + local.set $l3299 + local.get $l3298 + local.get $l3299 + i32.add + local.set $l3300 + local.get $l3299 + local.get $l3300 + i32.add + local.set $l3301 + local.get $l3300 + local.get $l3301 + i32.add + local.set $l3302 + local.get $l3301 + local.get $l3302 + i32.add + local.set $l3303 + local.get $l3302 + local.get $l3303 + i32.add + local.set $l3304 + local.get $l3303 + local.get $l3304 + i32.add + local.set $l3305 + local.get $l3304 + local.get $l3305 + i32.add + local.set $l3306 + local.get $l3305 + local.get $l3306 + i32.add + local.set $l3307 + local.get $l3306 + local.get $l3307 + i32.add + local.set $l3308 + local.get $l3307 + local.get $l3308 + i32.add + local.set $l3309 + local.get $l3308 + local.get $l3309 + i32.add + local.set $l3310 + local.get $l3309 + local.get $l3310 + i32.add + local.set $l3311 + local.get $l3310 + local.get $l3311 + i32.add + local.set $l3312 + local.get $l3311 + local.get $l3312 + i32.add + local.set $l3313 + local.get $l3312 + local.get $l3313 + i32.add + local.set $l3314 + local.get $l3313 + local.get $l3314 + i32.add + local.set $l3315 + local.get $l3314 + local.get $l3315 + i32.add + local.set $l3316 + local.get $l3315 + local.get $l3316 + i32.add + local.set $l3317 + local.get $l3316 + local.get $l3317 + i32.add + local.set $l3318 + local.get $l3317 + local.get $l3318 + i32.add + local.set $l3319 + local.get $l3318 + local.get $l3319 + i32.add + local.set $l3320 + local.get $l3319 + local.get $l3320 + i32.add + local.set $l3321 + local.get $l3320 + local.get $l3321 + i32.add + local.set $l3322 + local.get $l3321 + local.get $l3322 + i32.add + local.set $l3323 + local.get $l3322 + local.get $l3323 + i32.add + local.set $l3324 + local.get $l3323 + local.get $l3324 + i32.add + local.set $l3325 + local.get $l3324 + local.get $l3325 + i32.add + local.set $l3326 + local.get $l3325 + local.get $l3326 + i32.add + local.set $l3327 + local.get $l3326 + local.get $l3327 + i32.add + local.set $l3328 + local.get $l3327 + local.get $l3328 + i32.add + local.set $l3329 + local.get $l3328 + local.get $l3329 + i32.add + local.set $l3330 + local.get $l3329 + local.get $l3330 + i32.add + local.set $l3331 + local.get $l3330 + local.get $l3331 + i32.add + local.set $l3332 + local.get $l3331 + local.get $l3332 + i32.add + local.set $l3333 + local.get $l3332 + local.get $l3333 + i32.add + local.set $l3334 + local.get $l3333 + local.get $l3334 + i32.add + local.set $l3335 + local.get $l3334 + local.get $l3335 + i32.add + local.set $l3336 + local.get $l3335 + local.get $l3336 + i32.add + local.set $l3337 + local.get $l3336 + local.get $l3337 + i32.add + local.set $l3338 + local.get $l3337 + local.get $l3338 + i32.add + local.set $l3339 + local.get $l3338 + local.get $l3339 + i32.add + local.set $l3340 + local.get $l3339 + local.get $l3340 + i32.add + local.set $l3341 + local.get $l3340 + local.get $l3341 + i32.add + local.set $l3342 + local.get $l3341 + local.get $l3342 + i32.add + local.set $l3343 + local.get $l3342 + local.get $l3343 + i32.add + local.set $l3344 + local.get $l3343 + local.get $l3344 + i32.add + local.set $l3345 + local.get $l3344 + local.get $l3345 + i32.add + local.set $l3346 + local.get $l3345 + local.get $l3346 + i32.add + local.set $l3347 + local.get $l3346 + local.get $l3347 + i32.add + local.set $l3348 + local.get $l3347 + local.get $l3348 + i32.add + local.set $l3349 + local.get $l3348 + local.get $l3349 + i32.add + local.set $l3350 + local.get $l3349 + local.get $l3350 + i32.add + local.set $l3351 + local.get $l3350 + local.get $l3351 + i32.add + local.set $l3352 + local.get $l3351 + local.get $l3352 + i32.add + local.set $l3353 + local.get $l3352 + local.get $l3353 + i32.add + local.set $l3354 + local.get $l3353 + local.get $l3354 + i32.add + local.set $l3355 + local.get $l3354 + local.get $l3355 + i32.add + local.set $l3356 + local.get $l3355 + local.get $l3356 + i32.add + local.set $l3357 + local.get $l3356 + local.get $l3357 + i32.add + local.set $l3358 + local.get $l3357 + local.get $l3358 + i32.add + local.set $l3359 + local.get $l3358 + local.get $l3359 + i32.add + local.set $l3360 + local.get $l3359 + local.get $l3360 + i32.add + local.set $l3361 + local.get $l3360 + local.get $l3361 + i32.add + local.set $l3362 + local.get $l3361 + local.get $l3362 + i32.add + local.set $l3363 + local.get $l3362 + local.get $l3363 + i32.add + local.set $l3364 + local.get $l3363 + local.get $l3364 + i32.add + local.set $l3365 + local.get $l3364 + local.get $l3365 + i32.add + local.set $l3366 + local.get $l3365 + local.get $l3366 + i32.add + local.set $l3367 + local.get $l3366 + local.get $l3367 + i32.add + local.set $l3368 + local.get $l3367 + local.get $l3368 + i32.add + local.set $l3369 + local.get $l3368 + local.get $l3369 + i32.add + local.set $l3370 + local.get $l3369 + local.get $l3370 + i32.add + local.set $l3371 + local.get $l3370 + local.get $l3371 + i32.add + local.set $l3372 + local.get $l3371 + local.get $l3372 + i32.add + local.set $l3373 + local.get $l3372 + local.get $l3373 + i32.add + local.set $l3374 + local.get $l3373 + local.get $l3374 + i32.add + local.set $l3375 + local.get $l3374 + local.get $l3375 + i32.add + local.set $l3376 + local.get $l3375 + local.get $l3376 + i32.add + local.set $l3377 + local.get $l3376 + local.get $l3377 + i32.add + local.set $l3378 + local.get $l3377 + local.get $l3378 + i32.add + local.set $l3379 + local.get $l3378 + local.get $l3379 + i32.add + local.set $l3380 + local.get $l3379 + local.get $l3380 + i32.add + local.set $l3381 + local.get $l3380 + local.get $l3381 + i32.add + local.set $l3382 + local.get $l3381 + local.get $l3382 + i32.add + local.set $l3383 + local.get $l3382 + local.get $l3383 + i32.add + local.set $l3384 + local.get $l3383 + local.get $l3384 + i32.add + local.set $l3385 + local.get $l3384 + local.get $l3385 + i32.add + local.set $l3386 + local.get $l3385 + local.get $l3386 + i32.add + local.set $l3387 + local.get $l3386 + local.get $l3387 + i32.add + local.set $l3388 + local.get $l3387 + local.get $l3388 + i32.add + local.set $l3389 + local.get $l3388 + local.get $l3389 + i32.add + local.set $l3390 + local.get $l3389 + local.get $l3390 + i32.add + local.set $l3391 + local.get $l3390 + local.get $l3391 + i32.add + local.set $l3392 + local.get $l3391 + local.get $l3392 + i32.add + local.set $l3393 + local.get $l3392 + local.get $l3393 + i32.add + local.set $l3394 + local.get $l3393 + local.get $l3394 + i32.add + local.set $l3395 + local.get $l3394 + local.get $l3395 + i32.add + local.set $l3396 + local.get $l3395 + local.get $l3396 + i32.add + local.set $l3397 + local.get $l3396 + local.get $l3397 + i32.add + local.set $l3398 + local.get $l3397 + local.get $l3398 + i32.add + local.set $l3399 + local.get $l3398 + local.get $l3399 + i32.add + local.set $l3400 + local.get $l3399 + local.get $l3400 + i32.add + local.set $l3401 + local.get $l3400 + local.get $l3401 + i32.add + local.set $l3402 + local.get $l3401 + local.get $l3402 + i32.add + local.set $l3403 + local.get $l3402 + local.get $l3403 + i32.add + local.set $l3404 + local.get $l3403 + local.get $l3404 + i32.add + local.set $l3405 + local.get $l3404 + local.get $l3405 + i32.add + local.set $l3406 + local.get $l3405 + local.get $l3406 + i32.add + local.set $l3407 + local.get $l3406 + local.get $l3407 + i32.add + local.set $l3408 + local.get $l3407 + local.get $l3408 + i32.add + local.set $l3409 + local.get $l3408 + local.get $l3409 + i32.add + local.set $l3410 + local.get $l3409 + local.get $l3410 + i32.add + local.set $l3411 + local.get $l3410 + local.get $l3411 + i32.add + local.set $l3412 + local.get $l3411 + local.get $l3412 + i32.add + local.set $l3413 + local.get $l3412 + local.get $l3413 + i32.add + local.set $l3414 + local.get $l3413 + local.get $l3414 + i32.add + local.set $l3415 + local.get $l3414 + local.get $l3415 + i32.add + local.set $l3416 + local.get $l3415 + local.get $l3416 + i32.add + local.set $l3417 + local.get $l3416 + local.get $l3417 + i32.add + local.set $l3418 + local.get $l3417 + local.get $l3418 + i32.add + local.set $l3419 + local.get $l3418 + local.get $l3419 + i32.add + local.set $l3420 + local.get $l3419 + local.get $l3420 + i32.add + local.set $l3421 + local.get $l3420 + local.get $l3421 + i32.add + local.set $l3422 + local.get $l3421 + local.get $l3422 + i32.add + local.set $l3423 + local.get $l3422 + local.get $l3423 + i32.add + local.set $l3424 + local.get $l3423 + local.get $l3424 + i32.add + local.set $l3425 + local.get $l3424 + local.get $l3425 + i32.add + local.set $l3426 + local.get $l3425 + local.get $l3426 + i32.add + local.set $l3427 + local.get $l3426 + local.get $l3427 + i32.add + local.set $l3428 + local.get $l3427 + local.get $l3428 + i32.add + local.set $l3429 + local.get $l3428 + local.get $l3429 + i32.add + local.set $l3430 + local.get $l3429 + local.get $l3430 + i32.add + local.set $l3431 + local.get $l3430 + local.get $l3431 + i32.add + local.set $l3432 + local.get $l3431 + local.get $l3432 + i32.add + local.set $l3433 + local.get $l3432 + local.get $l3433 + i32.add + local.set $l3434 + local.get $l3433 + local.get $l3434 + i32.add + local.set $l3435 + local.get $l3434 + local.get $l3435 + i32.add + local.set $l3436 + local.get $l3435 + local.get $l3436 + i32.add + local.set $l3437 + local.get $l3436 + local.get $l3437 + i32.add + local.set $l3438 + local.get $l3437 + local.get $l3438 + i32.add + local.set $l3439 + local.get $l3438 + local.get $l3439 + i32.add + local.set $l3440 + local.get $l3439 + local.get $l3440 + i32.add + local.set $l3441 + local.get $l3440 + local.get $l3441 + i32.add + local.set $l3442 + local.get $l3441 + local.get $l3442 + i32.add + local.set $l3443 + local.get $l3442 + local.get $l3443 + i32.add + local.set $l3444 + local.get $l3443 + local.get $l3444 + i32.add + local.set $l3445 + local.get $l3444 + local.get $l3445 + i32.add + local.set $l3446 + local.get $l3445 + local.get $l3446 + i32.add + local.set $l3447 + local.get $l3446 + local.get $l3447 + i32.add + local.set $l3448 + local.get $l3447 + local.get $l3448 + i32.add + local.set $l3449 + local.get $l3448 + local.get $l3449 + i32.add + local.set $l3450 + local.get $l3449 + local.get $l3450 + i32.add + local.set $l3451 + local.get $l3450 + local.get $l3451 + i32.add + local.set $l3452 + local.get $l3451 + local.get $l3452 + i32.add + local.set $l3453 + local.get $l3452 + local.get $l3453 + i32.add + local.set $l3454 + local.get $l3453 + local.get $l3454 + i32.add + local.set $l3455 + local.get $l3454 + local.get $l3455 + i32.add + local.set $l3456 + local.get $l3455 + local.get $l3456 + i32.add + local.set $l3457 + local.get $l3456 + local.get $l3457 + i32.add + local.set $l3458 + local.get $l3457 + local.get $l3458 + i32.add + local.set $l3459 + local.get $l3458 + local.get $l3459 + i32.add + local.set $l3460 + local.get $l3459 + local.get $l3460 + i32.add + local.set $l3461 + local.get $l3460 + local.get $l3461 + i32.add + local.set $l3462 + local.get $l3461 + local.get $l3462 + i32.add + local.set $l3463 + local.get $l3462 + local.get $l3463 + i32.add + local.set $l3464 + local.get $l3463 + local.get $l3464 + i32.add + local.set $l3465 + local.get $l3464 + local.get $l3465 + i32.add + local.set $l3466 + local.get $l3465 + local.get $l3466 + i32.add + local.set $l3467 + local.get $l3466 + local.get $l3467 + i32.add + local.set $l3468 + local.get $l3467 + local.get $l3468 + i32.add + local.set $l3469 + local.get $l3468 + local.get $l3469 + i32.add + local.set $l3470 + local.get $l3469 + local.get $l3470 + i32.add + local.set $l3471 + local.get $l3470 + local.get $l3471 + i32.add + local.set $l3472 + local.get $l3471 + local.get $l3472 + i32.add + local.set $l3473 + local.get $l3472 + local.get $l3473 + i32.add + local.set $l3474 + local.get $l3473 + local.get $l3474 + i32.add + local.set $l3475 + local.get $l3474 + local.get $l3475 + i32.add + local.set $l3476 + local.get $l3475 + local.get $l3476 + i32.add + local.set $l3477 + local.get $l3476 + local.get $l3477 + i32.add + local.set $l3478 + local.get $l3477 + local.get $l3478 + i32.add + local.set $l3479 + local.get $l3478 + local.get $l3479 + i32.add + local.set $l3480 + local.get $l3479 + local.get $l3480 + i32.add + local.set $l3481 + local.get $l3480 + local.get $l3481 + i32.add + local.set $l3482 + local.get $l3481 + local.get $l3482 + i32.add + local.set $l3483 + local.get $l3482 + local.get $l3483 + i32.add + local.set $l3484 + local.get $l3483 + local.get $l3484 + i32.add + local.set $l3485 + local.get $l3484 + local.get $l3485 + i32.add + local.set $l3486 + local.get $l3485 + local.get $l3486 + i32.add + local.set $l3487 + local.get $l3486 + local.get $l3487 + i32.add + local.set $l3488 + local.get $l3487 + local.get $l3488 + i32.add + local.set $l3489 + local.get $l3488 + local.get $l3489 + i32.add + local.set $l3490 + local.get $l3489 + local.get $l3490 + i32.add + local.set $l3491 + local.get $l3490 + local.get $l3491 + i32.add + local.set $l3492 + local.get $l3491 + local.get $l3492 + i32.add + local.set $l3493 + local.get $l3492 + local.get $l3493 + i32.add + local.set $l3494 + local.get $l3493 + local.get $l3494 + i32.add + local.set $l3495 + local.get $l3494 + local.get $l3495 + i32.add + local.set $l3496 + local.get $l3495 + local.get $l3496 + i32.add + local.set $l3497 + local.get $l3496 + local.get $l3497 + i32.add + local.set $l3498 + local.get $l3497 + local.get $l3498 + i32.add + local.set $l3499 + local.get $l3498 + local.get $l3499 + i32.add + local.set $l3500 + local.get $l3499 + local.get $l3500 + i32.add + local.set $l3501 + local.get $l3500 + local.get $l3501 + i32.add + local.set $l3502 + local.get $l3501 + local.get $l3502 + i32.add + local.set $l3503 + local.get $l3502 + local.get $l3503 + i32.add + local.set $l3504 + local.get $l3503 + local.get $l3504 + i32.add + local.set $l3505 + local.get $l3504 + local.get $l3505 + i32.add + local.set $l3506 + local.get $l3505 + local.get $l3506 + i32.add + local.set $l3507 + local.get $l3506 + local.get $l3507 + i32.add + local.set $l3508 + local.get $l3507 + local.get $l3508 + i32.add + local.set $l3509 + local.get $l3508 + local.get $l3509 + i32.add + local.set $l3510 + local.get $l3509 + local.get $l3510 + i32.add + local.set $l3511 + local.get $l3510 + local.get $l3511 + i32.add + local.set $l3512 + local.get $l3511 + local.get $l3512 + i32.add + local.set $l3513 + local.get $l3512 + local.get $l3513 + i32.add + local.set $l3514 + local.get $l3513 + local.get $l3514 + i32.add + local.set $l3515 + local.get $l3514 + local.get $l3515 + i32.add + local.set $l3516 + local.get $l3515 + local.get $l3516 + i32.add + local.set $l3517 + local.get $l3516 + local.get $l3517 + i32.add + local.set $l3518 + local.get $l3517 + local.get $l3518 + i32.add + local.set $l3519 + local.get $l3518 + local.get $l3519 + i32.add + local.set $l3520 + local.get $l3519 + local.get $l3520 + i32.add + local.set $l3521 + local.get $l3520 + local.get $l3521 + i32.add + local.set $l3522 + local.get $l3521 + local.get $l3522 + i32.add + local.set $l3523 + local.get $l3522 + local.get $l3523 + i32.add + local.set $l3524 + local.get $l3523 + local.get $l3524 + i32.add + local.set $l3525 + local.get $l3524 + local.get $l3525 + i32.add + local.set $l3526 + local.get $l3525 + local.get $l3526 + i32.add + local.set $l3527 + local.get $l3526 + local.get $l3527 + i32.add + local.set $l3528 + local.get $l3527 + local.get $l3528 + i32.add + local.set $l3529 + local.get $l3528 + local.get $l3529 + i32.add + local.set $l3530 + local.get $l3529 + local.get $l3530 + i32.add + local.set $l3531 + local.get $l3530 + local.get $l3531 + i32.add + local.set $l3532 + local.get $l3531 + local.get $l3532 + i32.add + local.set $l3533 + local.get $l3532 + local.get $l3533 + i32.add + local.set $l3534 + local.get $l3533 + local.get $l3534 + i32.add + local.set $l3535 + local.get $l3534 + local.get $l3535 + i32.add + local.set $l3536 + local.get $l3535 + local.get $l3536 + i32.add + local.set $l3537 + local.get $l3536 + local.get $l3537 + i32.add + local.set $l3538 + local.get $l3537 + local.get $l3538 + i32.add + local.set $l3539 + local.get $l3538 + local.get $l3539 + i32.add + local.set $l3540 + local.get $l3539 + local.get $l3540 + i32.add + local.set $l3541 + local.get $l3540 + local.get $l3541 + i32.add + local.set $l3542 + local.get $l3541 + local.get $l3542 + i32.add + local.set $l3543 + local.get $l3542 + local.get $l3543 + i32.add + local.set $l3544 + local.get $l3543 + local.get $l3544 + i32.add + local.set $l3545 + local.get $l3544 + local.get $l3545 + i32.add + local.set $l3546 + local.get $l3545 + local.get $l3546 + i32.add + local.set $l3547 + local.get $l3546 + local.get $l3547 + i32.add + local.set $l3548 + local.get $l3547 + local.get $l3548 + i32.add + local.set $l3549 + local.get $l3548 + local.get $l3549 + i32.add + local.set $l3550 + local.get $l3549 + local.get $l3550 + i32.add + local.set $l3551 + local.get $l3550 + local.get $l3551 + i32.add + local.set $l3552 + local.get $l3551 + local.get $l3552 + i32.add + local.set $l3553 + local.get $l3552 + local.get $l3553 + i32.add + local.set $l3554 + local.get $l3553 + local.get $l3554 + i32.add + local.set $l3555 + local.get $l3554 + local.get $l3555 + i32.add + local.set $l3556 + local.get $l3555 + local.get $l3556 + i32.add + local.set $l3557 + local.get $l3556 + local.get $l3557 + i32.add + local.set $l3558 + local.get $l3557 + local.get $l3558 + i32.add + local.set $l3559 + local.get $l3558 + local.get $l3559 + i32.add + local.set $l3560 + local.get $l3559 + local.get $l3560 + i32.add + local.set $l3561 + local.get $l3560 + local.get $l3561 + i32.add + local.set $l3562 + local.get $l3561 + local.get $l3562 + i32.add + local.set $l3563 + local.get $l3562 + local.get $l3563 + i32.add + local.set $l3564 + local.get $l3563 + local.get $l3564 + i32.add + local.set $l3565 + local.get $l3564 + local.get $l3565 + i32.add + local.set $l3566 + local.get $l3565 + local.get $l3566 + i32.add + local.set $l3567 + local.get $l3566 + local.get $l3567 + i32.add + local.set $l3568 + local.get $l3567 + local.get $l3568 + i32.add + local.set $l3569 + local.get $l3568 + local.get $l3569 + i32.add + local.set $l3570 + local.get $l3569 + local.get $l3570 + i32.add + local.set $l3571 + local.get $l3570 + local.get $l3571 + i32.add + local.set $l3572 + local.get $l3571 + local.get $l3572 + i32.add + local.set $l3573 + local.get $l3572 + local.get $l3573 + i32.add + local.set $l3574 + local.get $l3573 + local.get $l3574 + i32.add + local.set $l3575 + local.get $l3574 + local.get $l3575 + i32.add + local.set $l3576 + local.get $l3575 + local.get $l3576 + i32.add + local.set $l3577 + local.get $l3576 + local.get $l3577 + i32.add + local.set $l3578 + local.get $l3577 + local.get $l3578 + i32.add + local.set $l3579 + local.get $l3578 + local.get $l3579 + i32.add + local.set $l3580 + local.get $l3579 + local.get $l3580 + i32.add + local.set $l3581 + local.get $l3580 + local.get $l3581 + i32.add + local.set $l3582 + local.get $l3581 + local.get $l3582 + i32.add + local.set $l3583 + local.get $l3582 + local.get $l3583 + i32.add + local.set $l3584 + local.get $l3583 + local.get $l3584 + i32.add + local.set $l3585 + local.get $l3584 + local.get $l3585 + i32.add + local.set $l3586 + local.get $l3585 + local.get $l3586 + i32.add + local.set $l3587 + local.get $l3586 + local.get $l3587 + i32.add + local.set $l3588 + local.get $l3587 + local.get $l3588 + i32.add + local.set $l3589 + local.get $l3588 + local.get $l3589 + i32.add + local.set $l3590 + local.get $l3589 + local.get $l3590 + i32.add + local.set $l3591 + local.get $l3590 + local.get $l3591 + i32.add + local.set $l3592 + local.get $l3591 + local.get $l3592 + i32.add + local.set $l3593 + local.get $l3592 + local.get $l3593 + i32.add + local.set $l3594 + local.get $l3593 + local.get $l3594 + i32.add + local.set $l3595 + local.get $l3594 + local.get $l3595 + i32.add + local.set $l3596 + local.get $l3595 + local.get $l3596 + i32.add + local.set $l3597 + local.get $l3596 + local.get $l3597 + i32.add + local.set $l3598 + local.get $l3597 + local.get $l3598 + i32.add + local.set $l3599 + local.get $l3598 + local.get $l3599 + i32.add + local.set $l3600 + local.get $l3599 + local.get $l3600 + i32.add + local.set $l3601 + local.get $l3600 + local.get $l3601 + i32.add + local.set $l3602 + local.get $l3601 + local.get $l3602 + i32.add + local.set $l3603 + local.get $l3602 + local.get $l3603 + i32.add + local.set $l3604 + local.get $l3603 + local.get $l3604 + i32.add + local.set $l3605 + local.get $l3604 + local.get $l3605 + i32.add + local.set $l3606 + local.get $l3605 + local.get $l3606 + i32.add + local.set $l3607 + local.get $l3606 + local.get $l3607 + i32.add + local.set $l3608 + local.get $l3607 + local.get $l3608 + i32.add + local.set $l3609 + local.get $l3608 + local.get $l3609 + i32.add + local.set $l3610 + local.get $l3609 + local.get $l3610 + i32.add + local.set $l3611 + local.get $l3610 + local.get $l3611 + i32.add + local.set $l3612 + local.get $l3611 + local.get $l3612 + i32.add + local.set $l3613 + local.get $l3612 + local.get $l3613 + i32.add + local.set $l3614 + local.get $l3613 + local.get $l3614 + i32.add + local.set $l3615 + local.get $l3614 + local.get $l3615 + i32.add + local.set $l3616 + local.get $l3615 + local.get $l3616 + i32.add + local.set $l3617 + local.get $l3616 + local.get $l3617 + i32.add + local.set $l3618 + local.get $l3617 + local.get $l3618 + i32.add + local.set $l3619 + local.get $l3618 + local.get $l3619 + i32.add + local.set $l3620 + local.get $l3619 + local.get $l3620 + i32.add + local.set $l3621 + local.get $l3620 + local.get $l3621 + i32.add + local.set $l3622 + local.get $l3621 + local.get $l3622 + i32.add + local.set $l3623 + local.get $l3622 + local.get $l3623 + i32.add + local.set $l3624 + local.get $l3623 + local.get $l3624 + i32.add + local.set $l3625 + local.get $l3624 + local.get $l3625 + i32.add + local.set $l3626 + local.get $l3625 + local.get $l3626 + i32.add + local.set $l3627 + local.get $l3626 + local.get $l3627 + i32.add + local.set $l3628 + local.get $l3627 + local.get $l3628 + i32.add + local.set $l3629 + local.get $l3628 + local.get $l3629 + i32.add + local.set $l3630 + local.get $l3629 + local.get $l3630 + i32.add + local.set $l3631 + local.get $l3630 + local.get $l3631 + i32.add + local.set $l3632 + local.get $l3631 + local.get $l3632 + i32.add + local.set $l3633 + local.get $l3632 + local.get $l3633 + i32.add + local.set $l3634 + local.get $l3633 + local.get $l3634 + i32.add + local.set $l3635 + local.get $l3634 + local.get $l3635 + i32.add + local.set $l3636 + local.get $l3635 + local.get $l3636 + i32.add + local.set $l3637 + local.get $l3636 + local.get $l3637 + i32.add + local.set $l3638 + local.get $l3637 + local.get $l3638 + i32.add + local.set $l3639 + local.get $l3638 + local.get $l3639 + i32.add + local.set $l3640 + local.get $l3639 + local.get $l3640 + i32.add + local.set $l3641 + local.get $l3640 + local.get $l3641 + i32.add + local.set $l3642 + local.get $l3641 + local.get $l3642 + i32.add + local.set $l3643 + local.get $l3642 + local.get $l3643 + i32.add + local.set $l3644 + local.get $l3643 + local.get $l3644 + i32.add + local.set $l3645 + local.get $l3644 + local.get $l3645 + i32.add + local.set $l3646 + local.get $l3645 + local.get $l3646 + i32.add + local.set $l3647 + local.get $l3646 + local.get $l3647 + i32.add + local.set $l3648 + local.get $l3647 + local.get $l3648 + i32.add + local.set $l3649 + local.get $l3648 + local.get $l3649 + i32.add + local.set $l3650 + local.get $l3649 + local.get $l3650 + i32.add + local.set $l3651 + local.get $l3650 + local.get $l3651 + i32.add + local.set $l3652 + local.get $l3651 + local.get $l3652 + i32.add + local.set $l3653 + local.get $l3652 + local.get $l3653 + i32.add + local.set $l3654 + local.get $l3653 + local.get $l3654 + i32.add + local.set $l3655 + local.get $l3654 + local.get $l3655 + i32.add + local.set $l3656 + local.get $l3655 + local.get $l3656 + i32.add + local.set $l3657 + local.get $l3656 + local.get $l3657 + i32.add + local.set $l3658 + local.get $l3657 + local.get $l3658 + i32.add + local.set $l3659 + local.get $l3658 + local.get $l3659 + i32.add + local.set $l3660 + local.get $l3659 + local.get $l3660 + i32.add + local.set $l3661 + local.get $l3660 + local.get $l3661 + i32.add + local.set $l3662 + local.get $l3661 + local.get $l3662 + i32.add + local.set $l3663 + local.get $l3662 + local.get $l3663 + i32.add + local.set $l3664 + local.get $l3663 + local.get $l3664 + i32.add + local.set $l3665 + local.get $l3664 + local.get $l3665 + i32.add + local.set $l3666 + local.get $l3665 + local.get $l3666 + i32.add + local.set $l3667 + local.get $l3666 + local.get $l3667 + i32.add + local.set $l3668 + local.get $l3667 + local.get $l3668 + i32.add + local.set $l3669 + local.get $l3668 + local.get $l3669 + i32.add + local.set $l3670 + local.get $l3669 + local.get $l3670 + i32.add + local.set $l3671 + local.get $l3670 + local.get $l3671 + i32.add + local.set $l3672 + local.get $l3671 + local.get $l3672 + i32.add + local.set $l3673 + local.get $l3672 + local.get $l3673 + i32.add + local.set $l3674 + local.get $l3673 + local.get $l3674 + i32.add + local.set $l3675 + local.get $l3674 + local.get $l3675 + i32.add + local.set $l3676 + local.get $l3675 + local.get $l3676 + i32.add + local.set $l3677 + local.get $l3676 + local.get $l3677 + i32.add + local.set $l3678 + local.get $l3677 + local.get $l3678 + i32.add + local.set $l3679 + local.get $l3678 + local.get $l3679 + i32.add + local.set $l3680 + local.get $l3679 + local.get $l3680 + i32.add + local.set $l3681 + local.get $l3680 + local.get $l3681 + i32.add + local.set $l3682 + local.get $l3681 + local.get $l3682 + i32.add + local.set $l3683 + local.get $l3682 + local.get $l3683 + i32.add + local.set $l3684 + local.get $l3683 + local.get $l3684 + i32.add + local.set $l3685 + local.get $l3684 + local.get $l3685 + i32.add + local.set $l3686 + local.get $l3685 + local.get $l3686 + i32.add + local.set $l3687 + local.get $l3686 + local.get $l3687 + i32.add + local.set $l3688 + local.get $l3687 + local.get $l3688 + i32.add + local.set $l3689 + local.get $l3688 + local.get $l3689 + i32.add + local.set $l3690 + local.get $l3689 + local.get $l3690 + i32.add + local.set $l3691 + local.get $l3690 + local.get $l3691 + i32.add + local.set $l3692 + local.get $l3691 + local.get $l3692 + i32.add + local.set $l3693 + local.get $l3692 + local.get $l3693 + i32.add + local.set $l3694 + local.get $l3693 + local.get $l3694 + i32.add + local.set $l3695 + local.get $l3694 + local.get $l3695 + i32.add + local.set $l3696 + local.get $l3695 + local.get $l3696 + i32.add + local.set $l3697 + local.get $l3696 + local.get $l3697 + i32.add + local.set $l3698 + local.get $l3697 + local.get $l3698 + i32.add + local.set $l3699 + local.get $l3698 + local.get $l3699 + i32.add + local.set $l3700 + local.get $l3699 + local.get $l3700 + i32.add + local.set $l3701 + local.get $l3700 + local.get $l3701 + i32.add + local.set $l3702 + local.get $l3701 + local.get $l3702 + i32.add + local.set $l3703 + local.get $l3702 + local.get $l3703 + i32.add + local.set $l3704 + local.get $l3703 + local.get $l3704 + i32.add + local.set $l3705 + local.get $l3704 + local.get $l3705 + i32.add + local.set $l3706 + local.get $l3705 + local.get $l3706 + i32.add + local.set $l3707 + local.get $l3706 + local.get $l3707 + i32.add + local.set $l3708 + local.get $l3707 + local.get $l3708 + i32.add + local.set $l3709 + local.get $l3708 + local.get $l3709 + i32.add + local.set $l3710 + local.get $l3709 + local.get $l3710 + i32.add + local.set $l3711 + local.get $l3710 + local.get $l3711 + i32.add + local.set $l3712 + local.get $l3711 + local.get $l3712 + i32.add + local.set $l3713 + local.get $l3712 + local.get $l3713 + i32.add + local.set $l3714 + local.get $l3713 + local.get $l3714 + i32.add + local.set $l3715 + local.get $l3714 + local.get $l3715 + i32.add + local.set $l3716 + local.get $l3715 + local.get $l3716 + i32.add + local.set $l3717 + local.get $l3716 + local.get $l3717 + i32.add + local.set $l3718 + local.get $l3717 + local.get $l3718 + i32.add + local.set $l3719 + local.get $l3718 + local.get $l3719 + i32.add + local.set $l3720 + local.get $l3719 + local.get $l3720 + i32.add + local.set $l3721 + local.get $l3720 + local.get $l3721 + i32.add + local.set $l3722 + local.get $l3721 + local.get $l3722 + i32.add + local.set $l3723 + local.get $l3722 + local.get $l3723 + i32.add + local.set $l3724 + local.get $l3723 + local.get $l3724 + i32.add + local.set $l3725 + local.get $l3724 + local.get $l3725 + i32.add + local.set $l3726 + local.get $l3725 + local.get $l3726 + i32.add + local.set $l3727 + local.get $l3726 + local.get $l3727 + i32.add + local.set $l3728 + local.get $l3727 + local.get $l3728 + i32.add + local.set $l3729 + local.get $l3728 + local.get $l3729 + i32.add + local.set $l3730 + local.get $l3729 + local.get $l3730 + i32.add + local.set $l3731 + local.get $l3730 + local.get $l3731 + i32.add + local.set $l3732 + local.get $l3731 + local.get $l3732 + i32.add + local.set $l3733 + local.get $l3732 + local.get $l3733 + i32.add + local.set $l3734 + local.get $l3733 + local.get $l3734 + i32.add + local.set $l3735 + local.get $l3734 + local.get $l3735 + i32.add + local.set $l3736 + local.get $l3735 + local.get $l3736 + i32.add + local.set $l3737 + local.get $l3736 + local.get $l3737 + i32.add + local.set $l3738 + local.get $l3737 + local.get $l3738 + i32.add + local.set $l3739 + local.get $l3738 + local.get $l3739 + i32.add + local.set $l3740 + local.get $l3739 + local.get $l3740 + i32.add + local.set $l3741 + local.get $l3740 + local.get $l3741 + i32.add + local.set $l3742 + local.get $l3741 + local.get $l3742 + i32.add + local.set $l3743 + local.get $l3742 + local.get $l3743 + i32.add + local.set $l3744 + local.get $l3743 + local.get $l3744 + i32.add + local.set $l3745 + local.get $l3744 + local.get $l3745 + i32.add + local.set $l3746 + local.get $l3745 + local.get $l3746 + i32.add + local.set $l3747 + local.get $l3746 + local.get $l3747 + i32.add + local.set $l3748 + local.get $l3747 + local.get $l3748 + i32.add + local.set $l3749 + local.get $l3748 + local.get $l3749 + i32.add + local.set $l3750 + local.get $l3749 + local.get $l3750 + i32.add + local.set $l3751 + local.get $l3750 + local.get $l3751 + i32.add + local.set $l3752 + local.get $l3751 + local.get $l3752 + i32.add + local.set $l3753 + local.get $l3752 + local.get $l3753 + i32.add + local.set $l3754 + local.get $l3753 + local.get $l3754 + i32.add + local.set $l3755 + local.get $l3754 + local.get $l3755 + i32.add + local.set $l3756 + local.get $l3755 + local.get $l3756 + i32.add + local.set $l3757 + local.get $l3756 + local.get $l3757 + i32.add + local.set $l3758 + local.get $l3757 + local.get $l3758 + i32.add + local.set $l3759 + local.get $l3758 + local.get $l3759 + i32.add + local.set $l3760 + local.get $l3759 + local.get $l3760 + i32.add + local.set $l3761 + local.get $l3760 + local.get $l3761 + i32.add + local.set $l3762 + local.get $l3761 + local.get $l3762 + i32.add + local.set $l3763 + local.get $l3762 + local.get $l3763 + i32.add + local.set $l3764 + local.get $l3763 + local.get $l3764 + i32.add + local.set $l3765 + local.get $l3764 + local.get $l3765 + i32.add + local.set $l3766 + local.get $l3765 + local.get $l3766 + i32.add + local.set $l3767 + local.get $l3766 + local.get $l3767 + i32.add + local.set $l3768 + local.get $l3767 + local.get $l3768 + i32.add + local.set $l3769 + local.get $l3768 + local.get $l3769 + i32.add + local.set $l3770 + local.get $l3769 + local.get $l3770 + i32.add + local.set $l3771 + local.get $l3770 + local.get $l3771 + i32.add + local.set $l3772 + local.get $l3771 + local.get $l3772 + i32.add + local.set $l3773 + local.get $l3772 + local.get $l3773 + i32.add + local.set $l3774 + local.get $l3773 + local.get $l3774 + i32.add + local.set $l3775 + local.get $l3774 + local.get $l3775 + i32.add + local.set $l3776 + local.get $l3775 + local.get $l3776 + i32.add + local.set $l3777 + local.get $l3776 + local.get $l3777 + i32.add + local.set $l3778 + local.get $l3777 + local.get $l3778 + i32.add + local.set $l3779 + local.get $l3778 + local.get $l3779 + i32.add + local.set $l3780 + local.get $l3779 + local.get $l3780 + i32.add + local.set $l3781 + local.get $l3780 + local.get $l3781 + i32.add + local.set $l3782 + local.get $l3781 + local.get $l3782 + i32.add + local.set $l3783 + local.get $l3782 + local.get $l3783 + i32.add + local.set $l3784 + local.get $l3783 + local.get $l3784 + i32.add + local.set $l3785 + local.get $l3784 + local.get $l3785 + i32.add + local.set $l3786 + local.get $l3785 + local.get $l3786 + i32.add + local.set $l3787 + local.get $l3786 + local.get $l3787 + i32.add + local.set $l3788 + local.get $l3787 + local.get $l3788 + i32.add + local.set $l3789 + local.get $l3788 + local.get $l3789 + i32.add + local.set $l3790 + local.get $l3789 + local.get $l3790 + i32.add + local.set $l3791 + local.get $l3790 + local.get $l3791 + i32.add + local.set $l3792 + local.get $l3791 + local.get $l3792 + i32.add + local.set $l3793 + local.get $l3792 + local.get $l3793 + i32.add + local.set $l3794 + local.get $l3793 + local.get $l3794 + i32.add + local.set $l3795 + local.get $l3794 + local.get $l3795 + i32.add + local.set $l3796 + local.get $l3795 + local.get $l3796 + i32.add + local.set $l3797 + local.get $l3796 + local.get $l3797 + i32.add + local.set $l3798 + local.get $l3797 + local.get $l3798 + i32.add + local.set $l3799 + local.get $l3798 + local.get $l3799 + i32.add + local.set $l3800 + local.get $l3799 + local.get $l3800 + i32.add + local.set $l3801 + local.get $l3800 + local.get $l3801 + i32.add + local.set $l3802 + local.get $l3801 + local.get $l3802 + i32.add + local.set $l3803 + local.get $l3802 + local.get $l3803 + i32.add + local.set $l3804 + local.get $l3803 + local.get $l3804 + i32.add + local.set $l3805 + local.get $l3804 + local.get $l3805 + i32.add + local.set $l3806 + local.get $l3805 + local.get $l3806 + i32.add + local.set $l3807 + local.get $l3806 + local.get $l3807 + i32.add + local.set $l3808 + local.get $l3807 + local.get $l3808 + i32.add + local.set $l3809 + local.get $l3808 + local.get $l3809 + i32.add + local.set $l3810 + local.get $l3809 + local.get $l3810 + i32.add + local.set $l3811 + local.get $l3810 + local.get $l3811 + i32.add + local.set $l3812 + local.get $l3811 + local.get $l3812 + i32.add + local.set $l3813 + local.get $l3812 + local.get $l3813 + i32.add + local.set $l3814 + local.get $l3813 + local.get $l3814 + i32.add + local.set $l3815 + local.get $l3814 + local.get $l3815 + i32.add + local.set $l3816 + local.get $l3815 + local.get $l3816 + i32.add + local.set $l3817 + local.get $l3816 + local.get $l3817 + i32.add + local.set $l3818 + local.get $l3817 + local.get $l3818 + i32.add + local.set $l3819 + local.get $l3818 + local.get $l3819 + i32.add + local.set $l3820 + local.get $l3819 + local.get $l3820 + i32.add + local.set $l3821 + local.get $l3820 + local.get $l3821 + i32.add + local.set $l3822 + local.get $l3821 + local.get $l3822 + i32.add + local.set $l3823 + local.get $l3822 + local.get $l3823 + i32.add + local.set $l3824 + local.get $l3823 + local.get $l3824 + i32.add + local.set $l3825 + local.get $l3824 + local.get $l3825 + i32.add + local.set $l3826 + local.get $l3825 + local.get $l3826 + i32.add + local.set $l3827 + local.get $l3826 + local.get $l3827 + i32.add + local.set $l3828 + local.get $l3827 + local.get $l3828 + i32.add + local.set $l3829 + local.get $l3828 + local.get $l3829 + i32.add + local.set $l3830 + local.get $l3829 + local.get $l3830 + i32.add + local.set $l3831 + local.get $l3830 + local.get $l3831 + i32.add + local.set $l3832 + local.get $l3831 + local.get $l3832 + i32.add + local.set $l3833 + local.get $l3832 + local.get $l3833 + i32.add + local.set $l3834 + local.get $l3833 + local.get $l3834 + i32.add + local.set $l3835 + local.get $l3834 + local.get $l3835 + i32.add + local.set $l3836 + local.get $l3835 + local.get $l3836 + i32.add + local.set $l3837 + local.get $l3836 + local.get $l3837 + i32.add + local.set $l3838 + local.get $l3837 + local.get $l3838 + i32.add + local.set $l3839 + local.get $l3838 + local.get $l3839 + i32.add + local.set $l3840 + local.get $l3839 + local.get $l3840 + i32.add + local.set $l3841 + local.get $l3840 + local.get $l3841 + i32.add + local.set $l3842 + local.get $l3841 + local.get $l3842 + i32.add + local.set $l3843 + local.get $l3842 + local.get $l3843 + i32.add + local.set $l3844 + local.get $l3843 + local.get $l3844 + i32.add + local.set $l3845 + local.get $l3844 + local.get $l3845 + i32.add + local.set $l3846 + local.get $l3845 + local.get $l3846 + i32.add + local.set $l3847 + local.get $l3846 + local.get $l3847 + i32.add + local.set $l3848 + local.get $l3847 + local.get $l3848 + i32.add + local.set $l3849 + local.get $l3848 + local.get $l3849 + i32.add + local.set $l3850 + local.get $l3849 + local.get $l3850 + i32.add + local.set $l3851 + local.get $l3850 + local.get $l3851 + i32.add + local.set $l3852 + local.get $l3851 + local.get $l3852 + i32.add + local.set $l3853 + local.get $l3852 + local.get $l3853 + i32.add + local.set $l3854 + local.get $l3853 + local.get $l3854 + i32.add + local.set $l3855 + local.get $l3854 + local.get $l3855 + i32.add + local.set $l3856 + local.get $l3855 + local.get $l3856 + i32.add + local.set $l3857 + local.get $l3856 + local.get $l3857 + i32.add + local.set $l3858 + local.get $l3857 + local.get $l3858 + i32.add + local.set $l3859 + local.get $l3858 + local.get $l3859 + i32.add + local.set $l3860 + local.get $l3859 + local.get $l3860 + i32.add + local.set $l3861 + local.get $l3860 + local.get $l3861 + i32.add + local.set $l3862 + local.get $l3861 + local.get $l3862 + i32.add + local.set $l3863 + local.get $l3862 + local.get $l3863 + i32.add + local.set $l3864 + local.get $l3863 + local.get $l3864 + i32.add + local.set $l3865 + local.get $l3864 + local.get $l3865 + i32.add + local.set $l3866 + local.get $l3865 + local.get $l3866 + i32.add + local.set $l3867 + local.get $l3866 + local.get $l3867 + i32.add + local.set $l3868 + local.get $l3867 + local.get $l3868 + i32.add + local.set $l3869 + local.get $l3868 + local.get $l3869 + i32.add + local.set $l3870 + local.get $l3869 + local.get $l3870 + i32.add + local.set $l3871 + local.get $l3870 + local.get $l3871 + i32.add + local.set $l3872 + local.get $l3871 + local.get $l3872 + i32.add + local.set $l3873 + local.get $l3872 + local.get $l3873 + i32.add + local.set $l3874 + local.get $l3873 + local.get $l3874 + i32.add + local.set $l3875 + local.get $l3874 + local.get $l3875 + i32.add + local.set $l3876 + local.get $l3875 + local.get $l3876 + i32.add + local.set $l3877 + local.get $l3876 + local.get $l3877 + i32.add + local.set $l3878 + local.get $l3877 + local.get $l3878 + i32.add + local.set $l3879 + local.get $l3878 + local.get $l3879 + i32.add + local.set $l3880 + local.get $l3879 + local.get $l3880 + i32.add + local.set $l3881 + local.get $l3880 + local.get $l3881 + i32.add + local.set $l3882 + local.get $l3881 + local.get $l3882 + i32.add + local.set $l3883 + local.get $l3882 + local.get $l3883 + i32.add + local.set $l3884 + local.get $l3883 + local.get $l3884 + i32.add + local.set $l3885 + local.get $l3884 + local.get $l3885 + i32.add + local.set $l3886 + local.get $l3885 + local.get $l3886 + i32.add + local.set $l3887 + local.get $l3886 + local.get $l3887 + i32.add + local.set $l3888 + local.get $l3887 + local.get $l3888 + i32.add + local.set $l3889 + local.get $l3888 + local.get $l3889 + i32.add + local.set $l3890 + local.get $l3889 + local.get $l3890 + i32.add + local.set $l3891 + local.get $l3890 + local.get $l3891 + i32.add + local.set $l3892 + local.get $l3891 + local.get $l3892 + i32.add + local.set $l3893 + local.get $l3892 + local.get $l3893 + i32.add + local.set $l3894 + local.get $l3893 + local.get $l3894 + i32.add + local.set $l3895 + local.get $l3894 + local.get $l3895 + i32.add + local.set $l3896 + local.get $l3895 + local.get $l3896 + i32.add + local.set $l3897 + local.get $l3896 + local.get $l3897 + i32.add + local.set $l3898 + local.get $l3897 + local.get $l3898 + i32.add + local.set $l3899 + local.get $l3898 + local.get $l3899 + i32.add + local.set $l3900 + local.get $l3899 + local.get $l3900 + i32.add + local.set $l3901 + local.get $l3900 + local.get $l3901 + i32.add + local.set $l3902 + local.get $l3901 + local.get $l3902 + i32.add + local.set $l3903 + local.get $l3902 + local.get $l3903 + i32.add + local.set $l3904 + local.get $l3903 + local.get $l3904 + i32.add + local.set $l3905 + local.get $l3904 + local.get $l3905 + i32.add + local.set $l3906 + local.get $l3905 + local.get $l3906 + i32.add + local.set $l3907 + local.get $l3906 + local.get $l3907 + i32.add + local.set $l3908 + local.get $l3907 + local.get $l3908 + i32.add + local.set $l3909 + local.get $l3908 + local.get $l3909 + i32.add + local.set $l3910 + local.get $l3909 + local.get $l3910 + i32.add + local.set $l3911 + local.get $l3910 + local.get $l3911 + i32.add + local.set $l3912 + local.get $l3911 + local.get $l3912 + i32.add + local.set $l3913 + local.get $l3912 + local.get $l3913 + i32.add + local.set $l3914 + local.get $l3913 + local.get $l3914 + i32.add + local.set $l3915 + local.get $l3914 + local.get $l3915 + i32.add + local.set $l3916 + local.get $l3915 + local.get $l3916 + i32.add + local.set $l3917 + local.get $l3916 + local.get $l3917 + i32.add + local.set $l3918 + local.get $l3917 + local.get $l3918 + i32.add + local.set $l3919 + local.get $l3918 + local.get $l3919 + i32.add + local.set $l3920 + local.get $l3919 + local.get $l3920 + i32.add + local.set $l3921 + local.get $l3920 + local.get $l3921 + i32.add + local.set $l3922 + local.get $l3921 + local.get $l3922 + i32.add + local.set $l3923 + local.get $l3922 + local.get $l3923 + i32.add + local.set $l3924 + local.get $l3923 + local.get $l3924 + i32.add + local.set $l3925 + local.get $l3924 + local.get $l3925 + i32.add + local.set $l3926 + local.get $l3925 + local.get $l3926 + i32.add + local.set $l3927 + local.get $l3926 + local.get $l3927 + i32.add + local.set $l3928 + local.get $l3927 + local.get $l3928 + i32.add + local.set $l3929 + local.get $l3928 + local.get $l3929 + i32.add + local.set $l3930 + local.get $l3929 + local.get $l3930 + i32.add + local.set $l3931 + local.get $l3930 + local.get $l3931 + i32.add + local.set $l3932 + local.get $l3931 + local.get $l3932 + i32.add + local.set $l3933 + local.get $l3932 + local.get $l3933 + i32.add + local.set $l3934 + local.get $l3933 + local.get $l3934 + i32.add + local.set $l3935 + local.get $l3934 + local.get $l3935 + i32.add + local.set $l3936 + local.get $l3935 + local.get $l3936 + i32.add + local.set $l3937 + local.get $l3936 + local.get $l3937 + i32.add + local.set $l3938 + local.get $l3937 + local.get $l3938 + i32.add + local.set $l3939 + local.get $l3938 + local.get $l3939 + i32.add + local.set $l3940 + local.get $l3939 + local.get $l3940 + i32.add + local.set $l3941 + local.get $l3940 + local.get $l3941 + i32.add + local.set $l3942 + local.get $l3941 + local.get $l3942 + i32.add + local.set $l3943 + local.get $l3942 + local.get $l3943 + i32.add + local.set $l3944 + local.get $l3943 + local.get $l3944 + i32.add + local.set $l3945 + local.get $l3944 + local.get $l3945 + i32.add + local.set $l3946 + local.get $l3945 + local.get $l3946 + i32.add + local.set $l3947 + local.get $l3946 + local.get $l3947 + i32.add + local.set $l3948 + local.get $l3947 + local.get $l3948 + i32.add + local.set $l3949 + local.get $l3948 + local.get $l3949 + i32.add + local.set $l3950 + local.get $l3949 + local.get $l3950 + i32.add + local.set $l3951 + local.get $l3950 + local.get $l3951 + i32.add + local.set $l3952 + local.get $l3951 + local.get $l3952 + i32.add + local.set $l3953 + local.get $l3952 + local.get $l3953 + i32.add + local.set $l3954 + local.get $l3953 + local.get $l3954 + i32.add + local.set $l3955 + local.get $l3954 + local.get $l3955 + i32.add + local.set $l3956 + local.get $l3955 + local.get $l3956 + i32.add + local.set $l3957 + local.get $l3956 + local.get $l3957 + i32.add + local.set $l3958 + local.get $l3957 + local.get $l3958 + i32.add + local.set $l3959 + local.get $l3958 + local.get $l3959 + i32.add + local.set $l3960 + local.get $l3959 + local.get $l3960 + i32.add + local.set $l3961 + local.get $l3960 + local.get $l3961 + i32.add + local.set $l3962 + local.get $l3961 + local.get $l3962 + i32.add + local.set $l3963 + local.get $l3962 + local.get $l3963 + i32.add + local.set $l3964 + local.get $l3963 + local.get $l3964 + i32.add + local.set $l3965 + local.get $l3964 + local.get $l3965 + i32.add + local.set $l3966 + local.get $l3965 + local.get $l3966 + i32.add + local.set $l3967 + local.get $l3966 + local.get $l3967 + i32.add + local.set $l3968 + local.get $l3967 + local.get $l3968 + i32.add + local.set $l3969 + local.get $l3968 + local.get $l3969 + i32.add + local.set $l3970 + local.get $l3969 + local.get $l3970 + i32.add + local.set $l3971 + local.get $l3970 + local.get $l3971 + i32.add + local.set $l3972 + local.get $l3971 + local.get $l3972 + i32.add + local.set $l3973 + local.get $l3972 + local.get $l3973 + i32.add + local.set $l3974 + local.get $l3973 + local.get $l3974 + i32.add + local.set $l3975 + local.get $l3974 + local.get $l3975 + i32.add + local.set $l3976 + local.get $l3975 + local.get $l3976 + i32.add + local.set $l3977 + local.get $l3976 + local.get $l3977 + i32.add + local.set $l3978 + local.get $l3977 + local.get $l3978 + i32.add + local.set $l3979 + local.get $l3978 + local.get $l3979 + i32.add + local.set $l3980 + local.get $l3979 + local.get $l3980 + i32.add + local.set $l3981 + local.get $l3980 + local.get $l3981 + i32.add + local.set $l3982 + local.get $l3981 + local.get $l3982 + i32.add + local.set $l3983 + local.get $l3982 + local.get $l3983 + i32.add + local.set $l3984 + local.get $l3983 + local.get $l3984 + i32.add + local.set $l3985 + local.get $l3984 + local.get $l3985 + i32.add + local.set $l3986 + local.get $l3985 + local.get $l3986 + i32.add + local.set $l3987 + local.get $l3986 + local.get $l3987 + i32.add + local.set $l3988 + local.get $l3987 + local.get $l3988 + i32.add + local.set $l3989 + local.get $l3988 + local.get $l3989 + i32.add + local.set $l3990 + local.get $l3989 + local.get $l3990 + i32.add + local.set $l3991 + local.get $l3990 + local.get $l3991 + i32.add + local.set $l3992 + local.get $l3991 + local.get $l3992 + i32.add + local.set $l3993 + local.get $l3992 + local.get $l3993 + i32.add + local.set $l3994 + local.get $l3993 + local.get $l3994 + i32.add + local.set $l3995 + local.get $l3994 + local.get $l3995 + i32.add + local.set $l3996 + local.get $l3995 + local.get $l3996 + i32.add + local.set $l3997 + local.get $l3996 + local.get $l3997 + i32.add + local.set $l3998 + local.get $l3997 + local.get $l3998 + i32.add + local.set $l3999 + local.get $l3998 + local.get $l3999 + i32.add + local.set $l4000 + local.get $l3999 + local.get $l4000 + i32.add + local.set $l4001 + local.get $l4000 + local.get $l4001 + i32.add + local.set $l4002 + local.get $l4001 + local.get $l4002 + i32.add + local.set $l4003 + local.get $l4002 + local.get $l4003 + i32.add + local.set $l4004 + local.get $l4003 + local.get $l4004 + i32.add + local.set $l4005 + local.get $l4004 + local.get $l4005 + i32.add + local.set $l4006 + local.get $l4005 + local.get $l4006 + i32.add + local.set $l4007 + local.get $l4006 + local.get $l4007 + i32.add + local.set $l4008 + local.get $l4007 + local.get $l4008 + i32.add + local.set $l4009 + local.get $l4008 + local.get $l4009 + i32.add + local.set $l4010 + local.get $l4009 + local.get $l4010 + i32.add + local.set $l4011 + local.get $l4010 + local.get $l4011 + i32.add + local.set $l4012 + local.get $l4011 + local.get $l4012 + i32.add + local.set $l4013 + local.get $l4012 + local.get $l4013 + i32.add + local.set $l4014 + local.get $l4013 + local.get $l4014 + i32.add + local.set $l4015 + local.get $l4014 + local.get $l4015 + i32.add + local.set $l4016 + local.get $l4015 + local.get $l4016 + i32.add + local.set $l4017 + local.get $l4016 + local.get $l4017 + i32.add + local.set $l4018 + local.get $l4017 + local.get $l4018 + i32.add + local.set $l4019 + local.get $l4018 + local.get $l4019 + i32.add + local.set $l4020 + local.get $l4019 + local.get $l4020 + i32.add + local.set $l4021 + local.get $l4020 + local.get $l4021 + i32.add + local.set $l4022 + local.get $l4021 + local.get $l4022 + i32.add + local.set $l4023 + local.get $l4022 + local.get $l4023 + i32.add + local.set $l4024 + local.get $l4023 + local.get $l4024 + i32.add + local.set $l4025 + local.get $l4024 + local.get $l4025 + i32.add + local.set $l4026 + local.get $l4025 + local.get $l4026 + i32.add + local.set $l4027 + local.get $l4026 + local.get $l4027 + i32.add + local.set $l4028 + local.get $l4027 + local.get $l4028 + i32.add + local.set $l4029 + local.get $l4028 + local.get $l4029 + i32.add + local.set $l4030 + local.get $l4029 + local.get $l4030 + i32.add + local.set $l4031 + local.get $l4030 + local.get $l4031 + i32.add + local.set $l4032 + local.get $l4031 + local.get $l4032 + i32.add + local.set $l4033 + local.get $l4032 + local.get $l4033 + i32.add + local.set $l4034 + local.get $l4033 + local.get $l4034 + i32.add + local.set $l4035 + local.get $l4034 + local.get $l4035 + i32.add + local.set $l4036 + local.get $l4035 + local.get $l4036 + i32.add + local.set $l4037 + local.get $l4036 + local.get $l4037 + i32.add + local.set $l4038 + local.get $l4037 + local.get $l4038 + i32.add + local.set $l4039 + local.get $l4038 + local.get $l4039 + i32.add + local.set $l4040 + local.get $l4039 + local.get $l4040 + i32.add + local.set $l4041 + local.get $l4040 + local.get $l4041 + i32.add + local.set $l4042 + local.get $l4041 + local.get $l4042 + i32.add + local.set $l4043 + local.get $l4042 + local.get $l4043 + i32.add + local.set $l4044 + local.get $l4043 + local.get $l4044 + i32.add + local.set $l4045 + local.get $l4044 + local.get $l4045 + i32.add + local.set $l4046 + local.get $l4045 + local.get $l4046 + i32.add + local.set $l4047 + local.get $l4046 + local.get $l4047 + i32.add + local.set $l4048 + local.get $l4047 + local.get $l4048 + i32.add + local.set $l4049 + local.get $l4048 + local.get $l4049 + i32.add + local.set $l4050 + local.get $l4049 + local.get $l4050 + i32.add + local.set $l4051 + local.get $l4050 + local.get $l4051 + i32.add + local.set $l4052 + local.get $l4051 + local.get $l4052 + i32.add + local.set $l4053 + local.get $l4052 + local.get $l4053 + i32.add + local.set $l4054 + local.get $l4053 + local.get $l4054 + i32.add + local.set $l4055 + local.get $l4054 + local.get $l4055 + i32.add + local.set $l4056 + local.get $l4055 + local.get $l4056 + i32.add + local.set $l4057 + local.get $l4056 + local.get $l4057 + i32.add + local.set $l4058 + local.get $l4057 + local.get $l4058 + i32.add + local.set $l4059 + local.get $l4058 + local.get $l4059 + i32.add + local.set $l4060 + local.get $l4059 + local.get $l4060 + i32.add + local.set $l4061 + local.get $l4060 + local.get $l4061 + i32.add + local.set $l4062 + local.get $l4061 + local.get $l4062 + i32.add + local.set $l4063 + local.get $l4062 + local.get $l4063 + i32.add + local.set $l4064 + local.get $l4063 + local.get $l4064 + i32.add + local.set $l4065 + local.get $l4064 + local.get $l4065 + i32.add + local.set $l4066 + local.get $l4065 + local.get $l4066 + i32.add + local.set $l4067 + local.get $l4066 + local.get $l4067 + i32.add + local.set $l4068 + local.get $l4067 + local.get $l4068 + i32.add + local.set $l4069 + local.get $l4068 + local.get $l4069 + i32.add + local.set $l4070 + local.get $l4069 + local.get $l4070 + i32.add + local.set $l4071 + local.get $l4070 + local.get $l4071 + i32.add + local.set $l4072 + local.get $l4071 + local.get $l4072 + i32.add + local.set $l4073 + local.get $l4072 + local.get $l4073 + i32.add + local.set $l4074 + local.get $l4073 + local.get $l4074 + i32.add + local.set $l4075 + local.get $l4074 + local.get $l4075 + i32.add + local.set $l4076 + local.get $l4075 + local.get $l4076 + i32.add + local.set $l4077 + local.get $l4076 + local.get $l4077 + i32.add + local.set $l4078 + local.get $l4077 + local.get $l4078 + i32.add + local.set $l4079 + local.get $l4078 + local.get $l4079 + i32.add + local.set $l4080 + local.get $l4079 + local.get $l4080 + i32.add + local.set $l4081 + local.get $l4080 + local.get $l4081 + i32.add + local.set $l4082 + local.get $l4081 + local.get $l4082 + i32.add + local.set $l4083 + local.get $l4082 + local.get $l4083 + i32.add + local.set $l4084 + local.get $l4083 + local.get $l4084 + i32.add + local.set $l4085 + local.get $l4084 + local.get $l4085 + i32.add + local.set $l4086 + local.get $l4085 + local.get $l4086 + i32.add + local.set $l4087 + local.get $l4086 + local.get $l4087 + i32.add + local.set $l4088 + local.get $l4087 + local.get $l4088 + i32.add + local.set $l4089 + local.get $l4088 + local.get $l4089 + i32.add + local.set $l4090 + local.get $l4089 + local.get $l4090 + i32.add + local.set $l4091 + local.get $l4090 + local.get $l4091 + i32.add + local.set $l4092 + local.get $l4091 + local.get $l4092 + i32.add + local.set $l4093 + local.get $l4092 + local.get $l4093 + i32.add + local.set $l4094 + local.get $l4093 + local.get $l4094 + i32.add + local.set $l4095 + local.get $l4094 + local.get $l4095 + i32.add + local.set $l4096 + local.get $l4095 + local.get $l4096 + i32.add + local.set $l4097 + local.get $l4096 + local.get $l4097 + i32.add + local.set $l4098 + local.get $l4097 + local.get $l4098 + i32.add + local.set $l4099 + local.get $l4098 + local.get $l4099 + i32.add + local.set $l4100 + local.get $l4099 + local.get $l4100 + i32.add + local.set $l4101 + local.get $l4100 + local.get $l4101 + i32.add + local.set $l4102 + local.get $l4101 + local.get $l4102 + i32.add + local.set $l4103 + local.get $l4102 + local.get $l4103 + i32.add + local.set $l4104 + local.get $l4103 + local.get $l4104 + i32.add + local.set $l4105 + local.get $l4104 + local.get $l4105 + i32.add + local.set $l4106 + local.get $l4105 + local.get $l4106 + i32.add + local.set $l4107 + local.get $l4106 + local.get $l4107 + i32.add + local.set $l4108 + local.get $l4107 + local.get $l4108 + i32.add + local.set $l4109 + local.get $l4108 + local.get $l4109 + i32.add + local.set $l4110 + local.get $l4109 + local.get $l4110 + i32.add + local.set $l4111 + local.get $l4110 + local.get $l4111 + i32.add + local.set $l4112 + local.get $l4111 + local.get $l4112 + i32.add + local.set $l4113 + local.get $l4112 + local.get $l4113 + i32.add + local.set $l4114 + local.get $l4113 + local.get $l4114 + i32.add + local.set $l4115 + local.get $l4114 + local.get $l4115 + i32.add + local.set $l4116 + local.get $l4115 + local.get $l4116 + i32.add + local.set $l4117 + local.get $l4116 + local.get $l4117 + i32.add + local.set $l4118 + local.get $l4117 + local.get $l4118 + i32.add + local.set $l4119 + local.get $l4118 + local.get $l4119 + i32.add + local.set $l4120 + local.get $l4119 + local.get $l4120 + i32.add + local.set $l4121 + local.get $l4120 + local.get $l4121 + i32.add + local.set $l4122 + local.get $l4121 + local.get $l4122 + i32.add + local.set $l4123 + local.get $l4122 + local.get $l4123 + i32.add + local.set $l4124 + local.get $l4123 + local.get $l4124 + i32.add + local.set $l4125 + local.get $l4124 + local.get $l4125 + i32.add + local.set $l4126 + local.get $l4125 + local.get $l4126 + i32.add + local.set $l4127 + local.get $l4126 + local.get $l4127 + i32.add + local.set $l4128 + local.get $l4127 + local.get $l4128 + i32.add + local.set $l4129 + local.get $l4128 + local.get $l4129 + i32.add + local.set $l4130 + local.get $l4129 + local.get $l4130 + i32.add + local.set $l4131 + local.get $l4130 + local.get $l4131 + i32.add + local.set $l4132 + local.get $l4131 + local.get $l4132 + i32.add + local.set $l4133 + local.get $l4132 + local.get $l4133 + i32.add + local.set $l4134 + local.get $l4133 + local.get $l4134 + i32.add + local.set $l4135 + local.get $l4134 + local.get $l4135 + i32.add + local.set $l4136 + local.get $l4135 + local.get $l4136 + i32.add + local.set $l4137 + local.get $l4136 + local.get $l4137 + i32.add + local.set $l4138 + local.get $l4137 + local.get $l4138 + i32.add + local.set $l4139 + local.get $l4138 + local.get $l4139 + i32.add + local.set $l4140 + local.get $l4139 + local.get $l4140 + i32.add + local.set $l4141 + local.get $l4140 + local.get $l4141 + i32.add + local.set $l4142 + local.get $l4141 + local.get $l4142 + i32.add + local.set $l4143 + local.get $l4142 + local.get $l4143 + i32.add + local.set $l4144 + local.get $l4143 + local.get $l4144 + i32.add + local.set $l4145 + local.get $l4144 + local.get $l4145 + i32.add + local.set $l4146 + local.get $l4145 + local.get $l4146 + i32.add + local.set $l4147 + local.get $l4146 + local.get $l4147 + i32.add + local.set $l4148 + local.get $l4147 + local.get $l4148 + i32.add + local.set $l4149 + local.get $l4148 + local.get $l4149 + i32.add + local.set $l4150 + local.get $l4149 + local.get $l4150 + i32.add + local.set $l4151 + local.get $l4150 + local.get $l4151 + i32.add + local.set $l4152 + local.get $l4151 + local.get $l4152 + i32.add + local.set $l4153 + local.get $l4152 + local.get $l4153 + i32.add + local.set $l4154 + local.get $l4153 + local.get $l4154 + i32.add + local.set $l4155 + local.get $l4154 + local.get $l4155 + i32.add + local.set $l4156 + local.get $l4155 + local.get $l4156 + i32.add + local.set $l4157 + local.get $l4156 + local.get $l4157 + i32.add + local.set $l4158 + local.get $l4157 + local.get $l4158 + i32.add + local.set $l4159 + local.get $l4158 + local.get $l4159 + i32.add + local.set $l4160 + local.get $l4159 + local.get $l4160 + i32.add + local.set $l4161 + local.get $l4160 + local.get $l4161 + i32.add + local.set $l4162 + local.get $l4161 + local.get $l4162 + i32.add + local.set $l4163 + local.get $l4162 + local.get $l4163 + i32.add + local.set $l4164 + local.get $l4163 + local.get $l4164 + i32.add + local.set $l4165 + local.get $l4164 + local.get $l4165 + i32.add + local.set $l4166 + local.get $l4165 + local.get $l4166 + i32.add + local.set $l4167 + local.get $l4166 + local.get $l4167 + i32.add + local.set $l4168 + local.get $l4167 + local.get $l4168 + i32.add + local.set $l4169 + local.get $l4168 + local.get $l4169 + i32.add + local.set $l4170 + local.get $l4169 + local.get $l4170 + i32.add + local.set $l4171 + local.get $l4170 + local.get $l4171 + i32.add + local.set $l4172 + local.get $l4171 + local.get $l4172 + i32.add + local.set $l4173 + local.get $l4172 + local.get $l4173 + i32.add + local.set $l4174 + local.get $l4173 + local.get $l4174 + i32.add + local.set $l4175 + local.get $l4174 + local.get $l4175 + i32.add + local.set $l4176 + local.get $l4175 + local.get $l4176 + i32.add + local.set $l4177 + local.get $l4176 + local.get $l4177 + i32.add + local.set $l4178 + local.get $l4177 + local.get $l4178 + i32.add + local.set $l4179 + local.get $l4178 + local.get $l4179 + i32.add + local.set $l4180 + local.get $l4179 + local.get $l4180 + i32.add + local.set $l4181 + local.get $l4180 + local.get $l4181 + i32.add + local.set $l4182 + local.get $l4181 + local.get $l4182 + i32.add + local.set $l4183 + local.get $l4182 + local.get $l4183 + i32.add + local.set $l4184 + local.get $l4183 + local.get $l4184 + i32.add + local.set $l4185 + local.get $l4184 + local.get $l4185 + i32.add + local.set $l4186 + local.get $l4185 + local.get $l4186 + i32.add + local.set $l4187 + local.get $l4186 + local.get $l4187 + i32.add + local.set $l4188 + local.get $l4187 + local.get $l4188 + i32.add + local.set $l4189 + local.get $l4188 + local.get $l4189 + i32.add + local.set $l4190 + local.get $l4189 + local.get $l4190 + i32.add + local.set $l4191 + local.get $l4190 + local.get $l4191 + i32.add + local.set $l4192 + local.get $l4191 + local.get $l4192 + i32.add + local.set $l4193 + local.get $l4192 + local.get $l4193 + i32.add + local.set $l4194 + local.get $l4193 + local.get $l4194 + i32.add + local.set $l4195 + local.get $l4194 + local.get $l4195 + i32.add + local.set $l4196 + local.get $l4195 + local.get $l4196 + i32.add + local.set $l4197 + local.get $l4196 + local.get $l4197 + i32.add + local.set $l4198 + local.get $l4197 + local.get $l4198 + i32.add + local.set $l4199 + local.get $l4198 + local.get $l4199 + i32.add + local.set $l4200 + local.get $l4199 + local.get $l4200 + i32.add + local.set $l4201 + local.get $l4200 + local.get $l4201 + i32.add + local.set $l4202 + local.get $l4201 + local.get $l4202 + i32.add + local.set $l4203 + local.get $l4202 + local.get $l4203 + i32.add + local.set $l4204 + local.get $l4203 + local.get $l4204 + i32.add + local.set $l4205 + local.get $l4204 + local.get $l4205 + i32.add + local.set $l4206 + local.get $l4205 + local.get $l4206 + i32.add + local.set $l4207 + local.get $l4206 + local.get $l4207 + i32.add + local.set $l4208 + local.get $l4207 + local.get $l4208 + i32.add + local.set $l4209 + local.get $l4208 + local.get $l4209 + i32.add + local.set $l4210 + local.get $l4209 + local.get $l4210 + i32.add + local.set $l4211 + local.get $l4210 + local.get $l4211 + i32.add + local.set $l4212 + local.get $l4211 + local.get $l4212 + i32.add + local.set $l4213 + local.get $l4212 + local.get $l4213 + i32.add + local.set $l4214 + local.get $l4213 + local.get $l4214 + i32.add + local.set $l4215 + local.get $l4214 + local.get $l4215 + i32.add + local.set $l4216 + local.get $l4215 + local.get $l4216 + i32.add + local.set $l4217 + local.get $l4216 + local.get $l4217 + i32.add + local.set $l4218 + local.get $l4217 + local.get $l4218 + i32.add + local.set $l4219 + local.get $l4218 + local.get $l4219 + i32.add + local.set $l4220 + local.get $l4219 + local.get $l4220 + i32.add + local.set $l4221 + local.get $l4220 + local.get $l4221 + i32.add + local.set $l4222 + local.get $l4221 + local.get $l4222 + i32.add + local.set $l4223 + local.get $l4222 + local.get $l4223 + i32.add + local.set $l4224 + local.get $l4223 + local.get $l4224 + i32.add + local.set $l4225 + local.get $l4224 + local.get $l4225 + i32.add + local.set $l4226 + local.get $l4225 + local.get $l4226 + i32.add + local.set $l4227 + local.get $l4226 + local.get $l4227 + i32.add + local.set $l4228 + local.get $l4227 + local.get $l4228 + i32.add + local.set $l4229 + local.get $l4228 + local.get $l4229 + i32.add + local.set $l4230 + local.get $l4229 + local.get $l4230 + i32.add + local.set $l4231 + local.get $l4230 + local.get $l4231 + i32.add + local.set $l4232 + local.get $l4231 + local.get $l4232 + i32.add + local.set $l4233 + local.get $l4232 + local.get $l4233 + i32.add + local.set $l4234 + local.get $l4233 + local.get $l4234 + i32.add + local.set $l4235 + local.get $l4234 + local.get $l4235 + i32.add + local.set $l4236 + local.get $l4235 + local.get $l4236 + i32.add + local.set $l4237 + local.get $l4236 + local.get $l4237 + i32.add + local.set $l4238 + local.get $l4237 + local.get $l4238 + i32.add + local.set $l4239 + local.get $l4238 + local.get $l4239 + i32.add + local.set $l4240 + local.get $l4239 + local.get $l4240 + i32.add + local.set $l4241 + local.get $l4240 + local.get $l4241 + i32.add + local.set $l4242 + local.get $l4241 + local.get $l4242 + i32.add + local.set $l4243 + local.get $l4242 + local.get $l4243 + i32.add + local.set $l4244 + local.get $l4243 + local.get $l4244 + i32.add + local.set $l4245 + local.get $l4244 + local.get $l4245 + i32.add + local.set $l4246 + local.get $l4245 + local.get $l4246 + i32.add + local.set $l4247 + local.get $l4246 + local.get $l4247 + i32.add + local.set $l4248 + local.get $l4247 + local.get $l4248 + i32.add + local.set $l4249 + local.get $l4248 + local.get $l4249 + i32.add + local.set $l4250 + local.get $l4249 + local.get $l4250 + i32.add + local.set $l4251 + local.get $l4250 + local.get $l4251 + i32.add + local.set $l4252 + local.get $l4251 + local.get $l4252 + i32.add + local.set $l4253 + local.get $l4252 + local.get $l4253 + i32.add + local.set $l4254 + local.get $l4253 + local.get $l4254 + i32.add + local.set $l4255 + local.get $l4254 + local.get $l4255 + i32.add + local.set $l4256 + local.get $l4255 + local.get $l4256 + i32.add + local.set $l4257 + local.get $l4256 + local.get $l4257 + i32.add + local.set $l4258 + local.get $l4257 + local.get $l4258 + i32.add + local.set $l4259 + local.get $l4258 + local.get $l4259 + i32.add + local.set $l4260 + local.get $l4259 + local.get $l4260 + i32.add + local.set $l4261 + local.get $l4260 + local.get $l4261 + i32.add + local.set $l4262 + local.get $l4261 + local.get $l4262 + i32.add + local.set $l4263 + local.get $l4262 + local.get $l4263 + i32.add + local.set $l4264 + local.get $l4263 + local.get $l4264 + i32.add + local.set $l4265 + local.get $l4264 + local.get $l4265 + i32.add + local.set $l4266 + local.get $l4265 + local.get $l4266 + i32.add + local.set $l4267 + local.get $l4266 + local.get $l4267 + i32.add + local.set $l4268 + local.get $l4267 + local.get $l4268 + i32.add + local.set $l4269 + local.get $l4268 + local.get $l4269 + i32.add + local.set $l4270 + local.get $l4269 + local.get $l4270 + i32.add + local.set $l4271 + local.get $l4270 + local.get $l4271 + i32.add + local.set $l4272 + local.get $l4271 + local.get $l4272 + i32.add + local.set $l4273 + local.get $l4272 + local.get $l4273 + i32.add + local.set $l4274 + local.get $l4273 + local.get $l4274 + i32.add + local.set $l4275 + local.get $l4274 + local.get $l4275 + i32.add + local.set $l4276 + local.get $l4275 + local.get $l4276 + i32.add + local.set $l4277 + local.get $l4276 + local.get $l4277 + i32.add + local.set $l4278 + local.get $l4277 + local.get $l4278 + i32.add + local.set $l4279 + local.get $l4278 + local.get $l4279 + i32.add + local.set $l4280 + local.get $l4279 + local.get $l4280 + i32.add + local.set $l4281 + local.get $l4280 + local.get $l4281 + i32.add + local.set $l4282 + local.get $l4281 + local.get $l4282 + i32.add + local.set $l4283 + local.get $l4282 + local.get $l4283 + i32.add + local.set $l4284 + local.get $l4283 + local.get $l4284 + i32.add + local.set $l4285 + local.get $l4284 + local.get $l4285 + i32.add + local.set $l4286 + local.get $l4285 + local.get $l4286 + i32.add + local.set $l4287 + local.get $l4286 + local.get $l4287 + i32.add + local.set $l4288 + local.get $l4287 + local.get $l4288 + i32.add + local.set $l4289 + local.get $l4288 + local.get $l4289 + i32.add + local.set $l4290 + local.get $l4289 + local.get $l4290 + i32.add + local.set $l4291 + local.get $l4290 + local.get $l4291 + i32.add + local.set $l4292 + local.get $l4291 + local.get $l4292 + i32.add + local.set $l4293 + local.get $l4292 + local.get $l4293 + i32.add + local.set $l4294 + local.get $l4293 + local.get $l4294 + i32.add + local.set $l4295 + local.get $l4294 + local.get $l4295 + i32.add + local.set $l4296 + local.get $l4295 + local.get $l4296 + i32.add + local.set $l4297 + local.get $l4296 + local.get $l4297 + i32.add + local.set $l4298 + local.get $l4297 + local.get $l4298 + i32.add + local.set $l4299 + local.get $l4298 + local.get $l4299 + i32.add + local.set $l4300 + local.get $l4299 + local.get $l4300 + i32.add + local.set $l4301 + local.get $l4300 + local.get $l4301 + i32.add + local.set $l4302 + local.get $l4301 + local.get $l4302 + i32.add + local.set $l4303 + local.get $l4302 + local.get $l4303 + i32.add + local.set $l4304 + local.get $l4303 + local.get $l4304 + i32.add + local.set $l4305 + local.get $l4304 + local.get $l4305 + i32.add + local.set $l4306 + local.get $l4305 + local.get $l4306 + i32.add + local.set $l4307 + local.get $l4306 + local.get $l4307 + i32.add + local.set $l4308 + local.get $l4307 + local.get $l4308 + i32.add + local.set $l4309 + local.get $l4308 + local.get $l4309 + i32.add + local.set $l4310 + local.get $l4309 + local.get $l4310 + i32.add + local.set $l4311 + local.get $l4310 + local.get $l4311 + i32.add + local.set $l4312 + local.get $l4311 + local.get $l4312 + i32.add + local.set $l4313 + local.get $l4312 + local.get $l4313 + i32.add + local.set $l4314 + local.get $l4313 + local.get $l4314 + i32.add + local.set $l4315 + local.get $l4314 + local.get $l4315 + i32.add + local.set $l4316 + local.get $l4315 + local.get $l4316 + i32.add + local.set $l4317 + local.get $l4316 + local.get $l4317 + i32.add + local.set $l4318 + local.get $l4317 + local.get $l4318 + i32.add + local.set $l4319 + local.get $l4318 + local.get $l4319 + i32.add + local.set $l4320 + local.get $l4319 + local.get $l4320 + i32.add + local.set $l4321 + local.get $l4320 + local.get $l4321 + i32.add + local.set $l4322 + local.get $l4321 + local.get $l4322 + i32.add + local.set $l4323 + local.get $l4322 + local.get $l4323 + i32.add + local.set $l4324 + local.get $l4323 + local.get $l4324 + i32.add + local.set $l4325 + local.get $l4324 + local.get $l4325 + i32.add + local.set $l4326 + local.get $l4325 + local.get $l4326 + i32.add + local.set $l4327 + local.get $l4326 + local.get $l4327 + i32.add + local.set $l4328 + local.get $l4327 + local.get $l4328 + i32.add + local.set $l4329 + local.get $l4328 + local.get $l4329 + i32.add + local.set $l4330 + local.get $l4329 + local.get $l4330 + i32.add + local.set $l4331 + local.get $l4330 + local.get $l4331 + i32.add + local.set $l4332 + local.get $l4331 + local.get $l4332 + i32.add + local.set $l4333 + local.get $l4332 + local.get $l4333 + i32.add + local.set $l4334 + local.get $l4333 + local.get $l4334 + i32.add + local.set $l4335 + local.get $l4334 + local.get $l4335 + i32.add + local.set $l4336 + local.get $l4335 + local.get $l4336 + i32.add + local.set $l4337 + local.get $l4336 + local.get $l4337 + i32.add + local.set $l4338 + local.get $l4337 + local.get $l4338 + i32.add + local.set $l4339 + local.get $l4338 + local.get $l4339 + i32.add + local.set $l4340 + local.get $l4339 + local.get $l4340 + i32.add + local.set $l4341 + local.get $l4340 + local.get $l4341 + i32.add + local.set $l4342 + local.get $l4341 + local.get $l4342 + i32.add + local.set $l4343 + local.get $l4342 + local.get $l4343 + i32.add + local.set $l4344 + local.get $l4343 + local.get $l4344 + i32.add + local.set $l4345 + local.get $l4344 + local.get $l4345 + i32.add + local.set $l4346 + local.get $l4345 + local.get $l4346 + i32.add + local.set $l4347 + local.get $l4346 + local.get $l4347 + i32.add + local.set $l4348 + local.get $l4347 + local.get $l4348 + i32.add + local.set $l4349 + local.get $l4348 + local.get $l4349 + i32.add + local.set $l4350 + local.get $l4349 + local.get $l4350 + i32.add + local.set $l4351 + local.get $l4350 + local.get $l4351 + i32.add + local.set $l4352 + local.get $l4351 + local.get $l4352 + i32.add + local.set $l4353 + local.get $l4352 + local.get $l4353 + i32.add + local.set $l4354 + local.get $l4353 + local.get $l4354 + i32.add + local.set $l4355 + local.get $l4354 + local.get $l4355 + i32.add + local.set $l4356 + local.get $l4355 + local.get $l4356 + i32.add + local.set $l4357 + local.get $l4356 + local.get $l4357 + i32.add + local.set $l4358 + local.get $l4357 + local.get $l4358 + i32.add + local.set $l4359 + local.get $l4358 + local.get $l4359 + i32.add + local.set $l4360 + local.get $l4359 + local.get $l4360 + i32.add + local.set $l4361 + local.get $l4360 + local.get $l4361 + i32.add + local.set $l4362 + local.get $l4361 + local.get $l4362 + i32.add + local.set $l4363 + local.get $l4362 + local.get $l4363 + i32.add + local.set $l4364 + local.get $l4363 + local.get $l4364 + i32.add + local.set $l4365 + local.get $l4364 + local.get $l4365 + i32.add + local.set $l4366 + local.get $l4365 + local.get $l4366 + i32.add + local.set $l4367 + local.get $l4366 + local.get $l4367 + i32.add + local.set $l4368 + local.get $l4367 + local.get $l4368 + i32.add + local.set $l4369 + local.get $l4368 + local.get $l4369 + i32.add + local.set $l4370 + local.get $l4369 + local.get $l4370 + i32.add + local.set $l4371 + local.get $l4370 + local.get $l4371 + i32.add + local.set $l4372 + local.get $l4371 + local.get $l4372 + i32.add + local.set $l4373 + local.get $l4372 + local.get $l4373 + i32.add + local.set $l4374 + local.get $l4373 + local.get $l4374 + i32.add + local.set $l4375 + local.get $l4374 + local.get $l4375 + i32.add + local.set $l4376 + local.get $l4375 + local.get $l4376 + i32.add + local.set $l4377 + local.get $l4376 + local.get $l4377 + i32.add + local.set $l4378 + local.get $l4377 + local.get $l4378 + i32.add + local.set $l4379 + local.get $l4378 + local.get $l4379 + i32.add + local.set $l4380 + local.get $l4379 + local.get $l4380 + i32.add + local.set $l4381 + local.get $l4380 + local.get $l4381 + i32.add + local.set $l4382 + local.get $l4381 + local.get $l4382 + i32.add + local.set $l4383 + local.get $l4382 + local.get $l4383 + i32.add + local.set $l4384 + local.get $l4383 + local.get $l4384 + i32.add + local.set $l4385 + local.get $l4384 + local.get $l4385 + i32.add + local.set $l4386 + local.get $l4385 + local.get $l4386 + i32.add + local.set $l4387 + local.get $l4386 + local.get $l4387 + i32.add + local.set $l4388 + local.get $l4387 + local.get $l4388 + i32.add + local.set $l4389 + local.get $l4388 + local.get $l4389 + i32.add + local.set $l4390 + local.get $l4389 + local.get $l4390 + i32.add + local.set $l4391 + local.get $l4390 + local.get $l4391 + i32.add + local.set $l4392 + local.get $l4391 + local.get $l4392 + i32.add + local.set $l4393 + local.get $l4392 + local.get $l4393 + i32.add + local.set $l4394 + local.get $l4393 + local.get $l4394 + i32.add + local.set $l4395 + local.get $l4394 + local.get $l4395 + i32.add + local.set $l4396 + local.get $l4395 + local.get $l4396 + i32.add + local.set $l4397 + local.get $l4396 + local.get $l4397 + i32.add + local.set $l4398 + local.get $l4397 + local.get $l4398 + i32.add + local.set $l4399 + local.get $l4398 + local.get $l4399 + i32.add + local.set $l4400 + local.get $l4399 + local.get $l4400 + i32.add + local.set $l4401 + local.get $l4400 + local.get $l4401 + i32.add + local.set $l4402 + local.get $l4401 + local.get $l4402 + i32.add + local.set $l4403 + local.get $l4402 + local.get $l4403 + i32.add + local.set $l4404 + local.get $l4403 + local.get $l4404 + i32.add + local.set $l4405 + local.get $l4404 + local.get $l4405 + i32.add + local.set $l4406 + local.get $l4405 + local.get $l4406 + i32.add + local.set $l4407 + local.get $l4406 + local.get $l4407 + i32.add + local.set $l4408 + local.get $l4407 + local.get $l4408 + i32.add + local.set $l4409 + local.get $l4408 + local.get $l4409 + i32.add + local.set $l4410 + local.get $l4409 + local.get $l4410 + i32.add + local.set $l4411 + local.get $l4410 + local.get $l4411 + i32.add + local.set $l4412 + local.get $l4411 + local.get $l4412 + i32.add + local.set $l4413 + local.get $l4412 + local.get $l4413 + i32.add + local.set $l4414 + local.get $l4413 + local.get $l4414 + i32.add + local.set $l4415 + local.get $l4414 + local.get $l4415 + i32.add + local.set $l4416 + local.get $l4415 + local.get $l4416 + i32.add + local.set $l4417 + local.get $l4416 + local.get $l4417 + i32.add + local.set $l4418 + local.get $l4417 + local.get $l4418 + i32.add + local.set $l4419 + local.get $l4418 + local.get $l4419 + i32.add + local.set $l4420 + local.get $l4419 + local.get $l4420 + i32.add + local.set $l4421 + local.get $l4420 + local.get $l4421 + i32.add + local.set $l4422 + local.get $l4421 + local.get $l4422 + i32.add + local.set $l4423 + local.get $l4422 + local.get $l4423 + i32.add + local.set $l4424 + local.get $l4423 + local.get $l4424 + i32.add + local.set $l4425 + local.get $l4424 + local.get $l4425 + i32.add + local.set $l4426 + local.get $l4425 + local.get $l4426 + i32.add + local.set $l4427 + local.get $l4426 + local.get $l4427 + i32.add + local.set $l4428 + local.get $l4427 + local.get $l4428 + i32.add + local.set $l4429 + local.get $l4428 + local.get $l4429 + i32.add + local.set $l4430 + local.get $l4429 + local.get $l4430 + i32.add + local.set $l4431 + local.get $l4430 + local.get $l4431 + i32.add + local.set $l4432 + local.get $l4431 + local.get $l4432 + i32.add + local.set $l4433 + local.get $l4432 + local.get $l4433 + i32.add + local.set $l4434 + local.get $l4433 + local.get $l4434 + i32.add + local.set $l4435 + local.get $l4434 + local.get $l4435 + i32.add + local.set $l4436 + local.get $l4435 + local.get $l4436 + i32.add + local.set $l4437 + local.get $l4436 + local.get $l4437 + i32.add + local.set $l4438 + local.get $l4437 + local.get $l4438 + i32.add + local.set $l4439 + local.get $l4438 + local.get $l4439 + i32.add + local.set $l4440 + local.get $l4439 + local.get $l4440 + i32.add + local.set $l4441 + local.get $l4440 + local.get $l4441 + i32.add + local.set $l4442 + local.get $l4441 + local.get $l4442 + i32.add + local.set $l4443 + local.get $l4442 + local.get $l4443 + i32.add + local.set $l4444 + local.get $l4443 + local.get $l4444 + i32.add + local.set $l4445 + local.get $l4444 + local.get $l4445 + i32.add + local.set $l4446 + local.get $l4445 + local.get $l4446 + i32.add + local.set $l4447 + local.get $l4446 + local.get $l4447 + i32.add + local.set $l4448 + local.get $l4447 + local.get $l4448 + i32.add + local.set $l4449 + local.get $l4448 + local.get $l4449 + i32.add + local.set $l4450 + local.get $l4449 + local.get $l4450 + i32.add + local.set $l4451 + local.get $l4450 + local.get $l4451 + i32.add + local.set $l4452 + local.get $l4451 + local.get $l4452 + i32.add + local.set $l4453 + local.get $l4452 + local.get $l4453 + i32.add + local.set $l4454 + local.get $l4453 + local.get $l4454 + i32.add + local.set $l4455 + local.get $l4454 + local.get $l4455 + i32.add + local.set $l4456 + local.get $l4455 + local.get $l4456 + i32.add + local.set $l4457 + local.get $l4456 + local.get $l4457 + i32.add + local.set $l4458 + local.get $l4457 + local.get $l4458 + i32.add + local.set $l4459 + local.get $l4458 + local.get $l4459 + i32.add + local.set $l4460 + local.get $l4459 + local.get $l4460 + i32.add + local.set $l4461 + local.get $l4460 + local.get $l4461 + i32.add + local.set $l4462 + local.get $l4461 + local.get $l4462 + i32.add + local.set $l4463 + local.get $l4462 + local.get $l4463 + i32.add + local.set $l4464 + local.get $l4463 + local.get $l4464 + i32.add + local.set $l4465 + local.get $l4464 + local.get $l4465 + i32.add + local.set $l4466 + local.get $l4465 + local.get $l4466 + i32.add + local.set $l4467 + local.get $l4466 + local.get $l4467 + i32.add + local.set $l4468 + local.get $l4467 + local.get $l4468 + i32.add + local.set $l4469 + local.get $l4468 + local.get $l4469 + i32.add + local.set $l4470 + local.get $l4469 + local.get $l4470 + i32.add + local.set $l4471 + local.get $l4470 + local.get $l4471 + i32.add + local.set $l4472 + local.get $l4471 + local.get $l4472 + i32.add + local.set $l4473 + local.get $l4472 + local.get $l4473 + i32.add + local.set $l4474 + local.get $l4473 + local.get $l4474 + i32.add + local.set $l4475 + local.get $l4474 + local.get $l4475 + i32.add + local.set $l4476 + local.get $l4475 + local.get $l4476 + i32.add + local.set $l4477 + local.get $l4476 + local.get $l4477 + i32.add + local.set $l4478 + local.get $l4477 + local.get $l4478 + i32.add + local.set $l4479 + local.get $l4478 + local.get $l4479 + i32.add + local.set $l4480 + local.get $l4479 + local.get $l4480 + i32.add + local.set $l4481 + local.get $l4480 + local.get $l4481 + i32.add + local.set $l4482 + local.get $l4481 + local.get $l4482 + i32.add + local.set $l4483 + local.get $l4482 + local.get $l4483 + i32.add + local.set $l4484 + local.get $l4483 + local.get $l4484 + i32.add + local.set $l4485 + local.get $l4484 + local.get $l4485 + i32.add + local.set $l4486 + local.get $l4485 + local.get $l4486 + i32.add + local.set $l4487 + local.get $l4486 + local.get $l4487 + i32.add + local.set $l4488 + local.get $l4487 + local.get $l4488 + i32.add + local.set $l4489 + local.get $l4488 + local.get $l4489 + i32.add + local.set $l4490 + local.get $l4489 + local.get $l4490 + i32.add + local.set $l4491 + local.get $l4490 + local.get $l4491 + i32.add + local.set $l4492 + local.get $l4491 + local.get $l4492 + i32.add + local.set $l4493 + local.get $l4492 + local.get $l4493 + i32.add + local.set $l4494 + local.get $l4493 + local.get $l4494 + i32.add + local.set $l4495 + local.get $l4494 + local.get $l4495 + i32.add + local.set $l4496 + local.get $l4495 + local.get $l4496 + i32.add + local.set $l4497 + local.get $l4496 + local.get $l4497 + i32.add + local.set $l4498 + local.get $l4497 + local.get $l4498 + i32.add + local.set $l4499 + local.get $l4498 + local.get $l4499 + i32.add + local.set $l4500 + local.get $l4499 + local.get $l4500 + i32.add + local.set $l4501 + local.get $l4500 + local.get $l4501 + i32.add + local.set $l4502 + local.get $l4501 + local.get $l4502 + i32.add + local.set $l4503 + local.get $l4502 + local.get $l4503 + i32.add + local.set $l4504 + local.get $l4503 + local.get $l4504 + i32.add + local.set $l4505 + local.get $l4504 + local.get $l4505 + i32.add + local.set $l4506 + local.get $l4505 + local.get $l4506 + i32.add + local.set $l4507 + local.get $l4506 + local.get $l4507 + i32.add + local.set $l4508 + local.get $l4507 + local.get $l4508 + i32.add + local.set $l4509 + local.get $l4508 + local.get $l4509 + i32.add + local.set $l4510 + local.get $l4509 + local.get $l4510 + i32.add + local.set $l4511 + local.get $l4510 + local.get $l4511 + i32.add + local.set $l4512 + local.get $l4511 + local.get $l4512 + i32.add + local.set $l4513 + local.get $l4512 + local.get $l4513 + i32.add + local.set $l4514 + local.get $l4513 + local.get $l4514 + i32.add + local.set $l4515 + local.get $l4514 + local.get $l4515 + i32.add + local.set $l4516 + local.get $l4515 + local.get $l4516 + i32.add + local.set $l4517 + local.get $l4516 + local.get $l4517 + i32.add + local.set $l4518 + local.get $l4517 + local.get $l4518 + i32.add + local.set $l4519 + local.get $l4518 + local.get $l4519 + i32.add + local.set $l4520 + local.get $l4519 + local.get $l4520 + i32.add + local.set $l4521 + local.get $l4520 + local.get $l4521 + i32.add + local.set $l4522 + local.get $l4521 + local.get $l4522 + i32.add + local.set $l4523 + local.get $l4522 + local.get $l4523 + i32.add + local.set $l4524 + local.get $l4523 + local.get $l4524 + i32.add + local.set $l4525 + local.get $l4524 + local.get $l4525 + i32.add + local.set $l4526 + local.get $l4525 + local.get $l4526 + i32.add + local.set $l4527 + local.get $l4526 + local.get $l4527 + i32.add + local.set $l4528 + local.get $l4527 + local.get $l4528 + i32.add + local.set $l4529 + local.get $l4528 + local.get $l4529 + i32.add + local.set $l4530 + local.get $l4529 + local.get $l4530 + i32.add + local.set $l4531 + local.get $l4530 + local.get $l4531 + i32.add + local.set $l4532 + local.get $l4531 + local.get $l4532 + i32.add + local.set $l4533 + local.get $l4532 + local.get $l4533 + i32.add + local.set $l4534 + local.get $l4533 + local.get $l4534 + i32.add + local.set $l4535 + local.get $l4534 + local.get $l4535 + i32.add + local.set $l4536 + local.get $l4535 + local.get $l4536 + i32.add + local.set $l4537 + local.get $l4536 + local.get $l4537 + i32.add + local.set $l4538 + local.get $l4537 + local.get $l4538 + i32.add + local.set $l4539 + local.get $l4538 + local.get $l4539 + i32.add + local.set $l4540 + local.get $l4539 + local.get $l4540 + i32.add + local.set $l4541 + local.get $l4540 + local.get $l4541 + i32.add + local.set $l4542 + local.get $l4541 + local.get $l4542 + i32.add + local.set $l4543 + local.get $l4542 + local.get $l4543 + i32.add + local.set $l4544 + local.get $l4543 + local.get $l4544 + i32.add + local.set $l4545 + local.get $l4544 + local.get $l4545 + i32.add + local.set $l4546 + local.get $l4545 + local.get $l4546 + i32.add + local.set $l4547 + local.get $l4546 + local.get $l4547 + i32.add + local.set $l4548 + local.get $l4547 + local.get $l4548 + i32.add + local.set $l4549 + local.get $l4548 + local.get $l4549 + i32.add + local.set $l4550 + local.get $l4549 + local.get $l4550 + i32.add + local.set $l4551 + local.get $l4550 + local.get $l4551 + i32.add + local.set $l4552 + local.get $l4551 + local.get $l4552 + i32.add + local.set $l4553 + local.get $l4552 + local.get $l4553 + i32.add + local.set $l4554 + local.get $l4553 + local.get $l4554 + i32.add + local.set $l4555 + local.get $l4554 + local.get $l4555 + i32.add + local.set $l4556 + local.get $l4555 + local.get $l4556 + i32.add + local.set $l4557 + local.get $l4556 + local.get $l4557 + i32.add + local.set $l4558 + local.get $l4557 + local.get $l4558 + i32.add + local.set $l4559 + local.get $l4558 + local.get $l4559 + i32.add + local.set $l4560 + local.get $l4559 + local.get $l4560 + i32.add + local.set $l4561 + local.get $l4560 + local.get $l4561 + i32.add + local.set $l4562 + local.get $l4561 + local.get $l4562 + i32.add + local.set $l4563 + local.get $l4562 + local.get $l4563 + i32.add + local.set $l4564 + local.get $l4563 + local.get $l4564 + i32.add + local.set $l4565 + local.get $l4564 + local.get $l4565 + i32.add + local.set $l4566 + local.get $l4565 + local.get $l4566 + i32.add + local.set $l4567 + local.get $l4566 + local.get $l4567 + i32.add + local.set $l4568 + local.get $l4567 + local.get $l4568 + i32.add + local.set $l4569 + local.get $l4568 + local.get $l4569 + i32.add + local.set $l4570 + local.get $l4569 + local.get $l4570 + i32.add + local.set $l4571 + local.get $l4570 + local.get $l4571 + i32.add + local.set $l4572 + local.get $l4571 + local.get $l4572 + i32.add + local.set $l4573 + local.get $l4572 + local.get $l4573 + i32.add + local.set $l4574 + local.get $l4573 + local.get $l4574 + i32.add + local.set $l4575 + local.get $l4574 + local.get $l4575 + i32.add + local.set $l4576 + local.get $l4575 + local.get $l4576 + i32.add + local.set $l4577 + local.get $l4576 + local.get $l4577 + i32.add + local.set $l4578 + local.get $l4577 + local.get $l4578 + i32.add + local.set $l4579 + local.get $l4578 + local.get $l4579 + i32.add + local.set $l4580 + local.get $l4579 + local.get $l4580 + i32.add + local.set $l4581 + local.get $l4580 + local.get $l4581 + i32.add + local.set $l4582 + local.get $l4581 + local.get $l4582 + i32.add + local.set $l4583 + local.get $l4582 + local.get $l4583 + i32.add + local.set $l4584 + local.get $l4583 + local.get $l4584 + i32.add + local.set $l4585 + local.get $l4584 + local.get $l4585 + i32.add + local.set $l4586 + local.get $l4585 + local.get $l4586 + i32.add + local.set $l4587 + local.get $l4586 + local.get $l4587 + i32.add + local.set $l4588 + local.get $l4587 + local.get $l4588 + i32.add + local.set $l4589 + local.get $l4588 + local.get $l4589 + i32.add + local.set $l4590 + local.get $l4589 + local.get $l4590 + i32.add + local.set $l4591 + local.get $l4590 + local.get $l4591 + i32.add + local.set $l4592 + local.get $l4591 + local.get $l4592 + i32.add + local.set $l4593 + local.get $l4592 + local.get $l4593 + i32.add + local.set $l4594 + local.get $l4593 + local.get $l4594 + i32.add + local.set $l4595 + local.get $l4594 + local.get $l4595 + i32.add + local.set $l4596 + local.get $l4595 + local.get $l4596 + i32.add + local.set $l4597 + local.get $l4596 + local.get $l4597 + i32.add + local.set $l4598 + local.get $l4597 + local.get $l4598 + i32.add + local.set $l4599 + local.get $l4598 + local.get $l4599 + i32.add + local.set $l4600 + local.get $l4599 + local.get $l4600 + i32.add + local.set $l4601 + local.get $l4600 + local.get $l4601 + i32.add + local.set $l4602 + local.get $l4601 + local.get $l4602 + i32.add + local.set $l4603 + local.get $l4602 + local.get $l4603 + i32.add + local.set $l4604 + local.get $l4603 + local.get $l4604 + i32.add + local.set $l4605 + local.get $l4604 + local.get $l4605 + i32.add + local.set $l4606 + local.get $l4605 + local.get $l4606 + i32.add + local.set $l4607 + local.get $l4606 + local.get $l4607 + i32.add + local.set $l4608 + local.get $l4607 + local.get $l4608 + i32.add + local.set $l4609 + local.get $l4608 + local.get $l4609 + i32.add + local.set $l4610 + local.get $l4609 + local.get $l4610 + i32.add + local.set $l4611 + local.get $l4610 + local.get $l4611 + i32.add + local.set $l4612 + local.get $l4611 + local.get $l4612 + i32.add + local.set $l4613 + local.get $l4612 + local.get $l4613 + i32.add + local.set $l4614 + local.get $l4613 + local.get $l4614 + i32.add + local.set $l4615 + local.get $l4614 + local.get $l4615 + i32.add + local.set $l4616 + local.get $l4615 + local.get $l4616 + i32.add + local.set $l4617 + local.get $l4616 + local.get $l4617 + i32.add + local.set $l4618 + local.get $l4617 + local.get $l4618 + i32.add + local.set $l4619 + local.get $l4618 + local.get $l4619 + i32.add + local.set $l4620 + local.get $l4619 + local.get $l4620 + i32.add + local.set $l4621 + local.get $l4620 + local.get $l4621 + i32.add + local.set $l4622 + local.get $l4621 + local.get $l4622 + i32.add + local.set $l4623 + local.get $l4622 + local.get $l4623 + i32.add + local.set $l4624 + local.get $l4623 + local.get $l4624 + i32.add + local.set $l4625 + local.get $l4624 + local.get $l4625 + i32.add + local.set $l4626 + local.get $l4625 + local.get $l4626 + i32.add + local.set $l4627 + local.get $l4626 + local.get $l4627 + i32.add + local.set $l4628 + local.get $l4627 + local.get $l4628 + i32.add + local.set $l4629 + local.get $l4628 + local.get $l4629 + i32.add + local.set $l4630 + local.get $l4629 + local.get $l4630 + i32.add + local.set $l4631 + local.get $l4630 + local.get $l4631 + i32.add + local.set $l4632 + local.get $l4631 + local.get $l4632 + i32.add + local.set $l4633 + local.get $l4632 + local.get $l4633 + i32.add + local.set $l4634 + local.get $l4633 + local.get $l4634 + i32.add + local.set $l4635 + local.get $l4634 + local.get $l4635 + i32.add + local.set $l4636 + local.get $l4635 + local.get $l4636 + i32.add + local.set $l4637 + local.get $l4636 + local.get $l4637 + i32.add + local.set $l4638 + local.get $l4637 + local.get $l4638 + i32.add + local.set $l4639 + local.get $l4638 + local.get $l4639 + i32.add + local.set $l4640 + local.get $l4639 + local.get $l4640 + i32.add + local.set $l4641 + local.get $l4640 + local.get $l4641 + i32.add + local.set $l4642 + local.get $l4641 + local.get $l4642 + i32.add + local.set $l4643 + local.get $l4642 + local.get $l4643 + i32.add + local.set $l4644 + local.get $l4643 + local.get $l4644 + i32.add + local.set $l4645 + local.get $l4644 + local.get $l4645 + i32.add + local.set $l4646 + local.get $l4645 + local.get $l4646 + i32.add + local.set $l4647 + local.get $l4646 + local.get $l4647 + i32.add + local.set $l4648 + local.get $l4647 + local.get $l4648 + i32.add + local.set $l4649 + local.get $l4648 + local.get $l4649 + i32.add + local.set $l4650 + local.get $l4649 + local.get $l4650 + i32.add + local.set $l4651 + local.get $l4650 + local.get $l4651 + i32.add + local.set $l4652 + local.get $l4651 + local.get $l4652 + i32.add + local.set $l4653 + local.get $l4652 + local.get $l4653 + i32.add + local.set $l4654 + local.get $l4653 + local.get $l4654 + i32.add + local.set $l4655 + local.get $l4654 + local.get $l4655 + i32.add + local.set $l4656 + local.get $l4655 + local.get $l4656 + i32.add + local.set $l4657 + local.get $l4656 + local.get $l4657 + i32.add + local.set $l4658 + local.get $l4657 + local.get $l4658 + i32.add + local.set $l4659 + local.get $l4658 + local.get $l4659 + i32.add + local.set $l4660 + local.get $l4659 + local.get $l4660 + i32.add + local.set $l4661 + local.get $l4660 + local.get $l4661 + i32.add + local.set $l4662 + local.get $l4661 + local.get $l4662 + i32.add + local.set $l4663 + local.get $l4662 + local.get $l4663 + i32.add + local.set $l4664 + local.get $l4663 + local.get $l4664 + i32.add + local.set $l4665 + local.get $l4664 + local.get $l4665 + i32.add + local.set $l4666 + local.get $l4665 + local.get $l4666 + i32.add + local.set $l4667 + local.get $l4666 + local.get $l4667 + i32.add + local.set $l4668 + local.get $l4667 + local.get $l4668 + i32.add + local.set $l4669 + local.get $l4668 + local.get $l4669 + i32.add + local.set $l4670 + local.get $l4669 + local.get $l4670 + i32.add + local.set $l4671 + local.get $l4670 + local.get $l4671 + i32.add + local.set $l4672 + local.get $l4671 + local.get $l4672 + i32.add + local.set $l4673 + local.get $l4672 + local.get $l4673 + i32.add + local.set $l4674 + local.get $l4673 + local.get $l4674 + i32.add + local.set $l4675 + local.get $l4674 + local.get $l4675 + i32.add + local.set $l4676 + local.get $l4675 + local.get $l4676 + i32.add + local.set $l4677 + local.get $l4676 + local.get $l4677 + i32.add + local.set $l4678 + local.get $l4677 + local.get $l4678 + i32.add + local.set $l4679 + local.get $l4678 + local.get $l4679 + i32.add + local.set $l4680 + local.get $l4679 + local.get $l4680 + i32.add + local.set $l4681 + local.get $l4680 + local.get $l4681 + i32.add + local.set $l4682 + local.get $l4681 + local.get $l4682 + i32.add + local.set $l4683 + local.get $l4682 + local.get $l4683 + i32.add + local.set $l4684 + local.get $l4683 + local.get $l4684 + i32.add + local.set $l4685 + local.get $l4684 + local.get $l4685 + i32.add + local.set $l4686 + local.get $l4685 + local.get $l4686 + i32.add + local.set $l4687 + local.get $l4686 + local.get $l4687 + i32.add + local.set $l4688 + local.get $l4687 + local.get $l4688 + i32.add + local.set $l4689 + local.get $l4688 + local.get $l4689 + i32.add + local.set $l4690 + local.get $l4689 + local.get $l4690 + i32.add + local.set $l4691 + local.get $l4690 + local.get $l4691 + i32.add + local.set $l4692 + local.get $l4691 + local.get $l4692 + i32.add + local.set $l4693 + local.get $l4692 + local.get $l4693 + i32.add + local.set $l4694 + local.get $l4693 + local.get $l4694 + i32.add + local.set $l4695 + local.get $l4694 + local.get $l4695 + i32.add + local.set $l4696 + local.get $l4695 + local.get $l4696 + i32.add + local.set $l4697 + local.get $l4696 + local.get $l4697 + i32.add + local.set $l4698 + local.get $l4697 + local.get $l4698 + i32.add + local.set $l4699 + local.get $l4698 + local.get $l4699 + i32.add + local.set $l4700 + local.get $l4699 + local.get $l4700 + i32.add + local.set $l4701 + local.get $l4700 + local.get $l4701 + i32.add + local.set $l4702 + local.get $l4701 + local.get $l4702 + i32.add + local.set $l4703 + local.get $l4702 + local.get $l4703 + i32.add + local.set $l4704 + local.get $l4703 + local.get $l4704 + i32.add + local.set $l4705 + local.get $l4704 + local.get $l4705 + i32.add + local.set $l4706 + local.get $l4705 + local.get $l4706 + i32.add + local.set $l4707 + local.get $l4706 + local.get $l4707 + i32.add + local.set $l4708 + local.get $l4707 + local.get $l4708 + i32.add + local.set $l4709 + local.get $l4708 + local.get $l4709 + i32.add + local.set $l4710 + local.get $l4709 + local.get $l4710 + i32.add + local.set $l4711 + local.get $l4710 + local.get $l4711 + i32.add + local.set $l4712 + local.get $l4711 + local.get $l4712 + i32.add + local.set $l4713 + local.get $l4712 + local.get $l4713 + i32.add + local.set $l4714 + local.get $l4713 + local.get $l4714 + i32.add + local.set $l4715 + local.get $l4714 + local.get $l4715 + i32.add + local.set $l4716 + local.get $l4715 + local.get $l4716 + i32.add + local.set $l4717 + local.get $l4716 + local.get $l4717 + i32.add + local.set $l4718 + local.get $l4717 + local.get $l4718 + i32.add + local.set $l4719 + local.get $l4718 + local.get $l4719 + i32.add + local.set $l4720 + local.get $l4719 + local.get $l4720 + i32.add + local.set $l4721 + local.get $l4720 + local.get $l4721 + i32.add + local.set $l4722 + local.get $l4721 + local.get $l4722 + i32.add + local.set $l4723 + local.get $l4722 + local.get $l4723 + i32.add + local.set $l4724 + local.get $l4723 + local.get $l4724 + i32.add + local.set $l4725 + local.get $l4724 + local.get $l4725 + i32.add + local.set $l4726 + local.get $l4725 + local.get $l4726 + i32.add + local.set $l4727 + local.get $l4726 + local.get $l4727 + i32.add + local.set $l4728 + local.get $l4727 + local.get $l4728 + i32.add + local.set $l4729 + local.get $l4728 + local.get $l4729 + i32.add + local.set $l4730 + local.get $l4729 + local.get $l4730 + i32.add + local.set $l4731 + local.get $l4730 + local.get $l4731 + i32.add + local.set $l4732 + local.get $l4731 + local.get $l4732 + i32.add + local.set $l4733 + local.get $l4732 + local.get $l4733 + i32.add + local.set $l4734 + local.get $l4733 + local.get $l4734 + i32.add + local.set $l4735 + local.get $l4734 + local.get $l4735 + i32.add + local.set $l4736 + local.get $l4735 + local.get $l4736 + i32.add + local.set $l4737 + local.get $l4736 + local.get $l4737 + i32.add + local.set $l4738 + local.get $l4737 + local.get $l4738 + i32.add + local.set $l4739 + local.get $l4738 + local.get $l4739 + i32.add + local.set $l4740 + local.get $l4739 + local.get $l4740 + i32.add + local.set $l4741 + local.get $l4740 + local.get $l4741 + i32.add + local.set $l4742 + local.get $l4741 + local.get $l4742 + i32.add + local.set $l4743 + local.get $l4742 + local.get $l4743 + i32.add + local.set $l4744 + local.get $l4743 + local.get $l4744 + i32.add + local.set $l4745 + local.get $l4744 + local.get $l4745 + i32.add + local.set $l4746 + local.get $l4745 + local.get $l4746 + i32.add + local.set $l4747 + local.get $l4746 + local.get $l4747 + i32.add + local.set $l4748 + local.get $l4747 + local.get $l4748 + i32.add + local.set $l4749 + local.get $l4748 + local.get $l4749 + i32.add + local.set $l4750 + local.get $l4749 + local.get $l4750 + i32.add + local.set $l4751 + local.get $l4750 + local.get $l4751 + i32.add + local.set $l4752 + local.get $l4751 + local.get $l4752 + i32.add + local.set $l4753 + local.get $l4752 + local.get $l4753 + i32.add + local.set $l4754 + local.get $l4753 + local.get $l4754 + i32.add + local.set $l4755 + local.get $l4754 + local.get $l4755 + i32.add + local.set $l4756 + local.get $l4755 + local.get $l4756 + i32.add + local.set $l4757 + local.get $l4756 + local.get $l4757 + i32.add + local.set $l4758 + local.get $l4757 + local.get $l4758 + i32.add + local.set $l4759 + local.get $l4758 + local.get $l4759 + i32.add + local.set $l4760 + local.get $l4759 + local.get $l4760 + i32.add + local.set $l4761 + local.get $l4760 + local.get $l4761 + i32.add + local.set $l4762 + local.get $l4761 + local.get $l4762 + i32.add + local.set $l4763 + local.get $l4762 + local.get $l4763 + i32.add + local.set $l4764 + local.get $l4763 + local.get $l4764 + i32.add + local.set $l4765 + local.get $l4764 + local.get $l4765 + i32.add + local.set $l4766 + local.get $l4765 + local.get $l4766 + i32.add + local.set $l4767 + local.get $l4766 + local.get $l4767 + i32.add + local.set $l4768 + local.get $l4767 + local.get $l4768 + i32.add + local.set $l4769 + local.get $l4768 + local.get $l4769 + i32.add + local.set $l4770 + local.get $l4769 + local.get $l4770 + i32.add + local.set $l4771 + local.get $l4770 + local.get $l4771 + i32.add + local.set $l4772 + local.get $l4771 + local.get $l4772 + i32.add + local.set $l4773 + local.get $l4772 + local.get $l4773 + i32.add + local.set $l4774 + local.get $l4773 + local.get $l4774 + i32.add + local.set $l4775 + local.get $l4774 + local.get $l4775 + i32.add + local.set $l4776 + local.get $l4775 + local.get $l4776 + i32.add + local.set $l4777 + local.get $l4776 + local.get $l4777 + i32.add + local.set $l4778 + local.get $l4777 + local.get $l4778 + i32.add + local.set $l4779 + local.get $l4778 + local.get $l4779 + i32.add + local.set $l4780 + local.get $l4779 + local.get $l4780 + i32.add + local.set $l4781 + local.get $l4780 + local.get $l4781 + i32.add + local.set $l4782 + local.get $l4781 + local.get $l4782 + i32.add + local.set $l4783 + local.get $l4782 + local.get $l4783 + i32.add + local.set $l4784 + local.get $l4783 + local.get $l4784 + i32.add + local.set $l4785 + local.get $l4784 + local.get $l4785 + i32.add + local.set $l4786 + local.get $l4785 + local.get $l4786 + i32.add + local.set $l4787 + local.get $l4786 + local.get $l4787 + i32.add + local.set $l4788 + local.get $l4787 + local.get $l4788 + i32.add + local.set $l4789 + local.get $l4788 + local.get $l4789 + i32.add + local.set $l4790 + local.get $l4789 + local.get $l4790 + i32.add + local.set $l4791 + local.get $l4790 + local.get $l4791 + i32.add + local.set $l4792 + local.get $l4791 + local.get $l4792 + i32.add + local.set $l4793 + local.get $l4792 + local.get $l4793 + i32.add + local.set $l4794 + local.get $l4793 + local.get $l4794 + i32.add + local.set $l4795 + local.get $l4794 + local.get $l4795 + i32.add + local.set $l4796 + local.get $l4795 + local.get $l4796 + i32.add + local.set $l4797 + local.get $l4796 + local.get $l4797 + i32.add + local.set $l4798 + local.get $l4797 + local.get $l4798 + i32.add + local.set $l4799 + local.get $l4798 + local.get $l4799 + i32.add + local.set $l4800 + local.get $l4799 + local.get $l4800 + i32.add + local.set $l4801 + local.get $l4800 + local.get $l4801 + i32.add + local.set $l4802 + local.get $l4801 + local.get $l4802 + i32.add + local.set $l4803 + local.get $l4802 + local.get $l4803 + i32.add + local.set $l4804 + local.get $l4803 + local.get $l4804 + i32.add + local.set $l4805 + local.get $l4804 + local.get $l4805 + i32.add + local.set $l4806 + local.get $l4805 + local.get $l4806 + i32.add + local.set $l4807 + local.get $l4806 + local.get $l4807 + i32.add + local.set $l4808 + local.get $l4807 + local.get $l4808 + i32.add + local.set $l4809 + local.get $l4808 + local.get $l4809 + i32.add + local.set $l4810 + local.get $l4809 + local.get $l4810 + i32.add + local.set $l4811 + local.get $l4810 + local.get $l4811 + i32.add + local.set $l4812 + local.get $l4811 + local.get $l4812 + i32.add + local.set $l4813 + local.get $l4812 + local.get $l4813 + i32.add + local.set $l4814 + local.get $l4813 + local.get $l4814 + i32.add + local.set $l4815 + local.get $l4814 + local.get $l4815 + i32.add + local.set $l4816 + local.get $l4815 + local.get $l4816 + i32.add + local.set $l4817 + local.get $l4816 + local.get $l4817 + i32.add + local.set $l4818 + local.get $l4817 + local.get $l4818 + i32.add + local.set $l4819 + local.get $l4818 + local.get $l4819 + i32.add + local.set $l4820 + local.get $l4819 + local.get $l4820 + i32.add + local.set $l4821 + local.get $l4820 + local.get $l4821 + i32.add + local.set $l4822 + local.get $l4821 + local.get $l4822 + i32.add + local.set $l4823 + local.get $l4822 + local.get $l4823 + i32.add + local.set $l4824 + local.get $l4823 + local.get $l4824 + i32.add + local.set $l4825 + local.get $l4824 + local.get $l4825 + i32.add + local.set $l4826 + local.get $l4825 + local.get $l4826 + i32.add + local.set $l4827 + local.get $l4826 + local.get $l4827 + i32.add + local.set $l4828 + local.get $l4827 + local.get $l4828 + i32.add + local.set $l4829 + local.get $l4828 + local.get $l4829 + i32.add + local.set $l4830 + local.get $l4829 + local.get $l4830 + i32.add + local.set $l4831 + local.get $l4830 + local.get $l4831 + i32.add + local.set $l4832 + local.get $l4831 + local.get $l4832 + i32.add + local.set $l4833 + local.get $l4832 + local.get $l4833 + i32.add + local.set $l4834 + local.get $l4833 + local.get $l4834 + i32.add + local.set $l4835 + local.get $l4834 + local.get $l4835 + i32.add + local.set $l4836 + local.get $l4835 + local.get $l4836 + i32.add + local.set $l4837 + local.get $l4836 + local.get $l4837 + i32.add + local.set $l4838 + local.get $l4837 + local.get $l4838 + i32.add + local.set $l4839 + local.get $l4838 + local.get $l4839 + i32.add + local.set $l4840 + local.get $l4839 + local.get $l4840 + i32.add + local.set $l4841 + local.get $l4840 + local.get $l4841 + i32.add + local.set $l4842 + local.get $l4841 + local.get $l4842 + i32.add + local.set $l4843 + local.get $l4842 + local.get $l4843 + i32.add + local.set $l4844 + local.get $l4843 + local.get $l4844 + i32.add + local.set $l4845 + local.get $l4844 + local.get $l4845 + i32.add + local.set $l4846 + local.get $l4845 + local.get $l4846 + i32.add + local.set $l4847 + local.get $l4846 + local.get $l4847 + i32.add + local.set $l4848 + local.get $l4847 + local.get $l4848 + i32.add + local.set $l4849 + local.get $l4848 + local.get $l4849 + i32.add + local.set $l4850 + local.get $l4849 + local.get $l4850 + i32.add + local.set $l4851 + local.get $l4850 + local.get $l4851 + i32.add + local.set $l4852 + local.get $l4851 + local.get $l4852 + i32.add + local.set $l4853 + local.get $l4852 + local.get $l4853 + i32.add + local.set $l4854 + local.get $l4853 + local.get $l4854 + i32.add + local.set $l4855 + local.get $l4854 + local.get $l4855 + i32.add + local.set $l4856 + local.get $l4855 + local.get $l4856 + i32.add + local.set $l4857 + local.get $l4856 + local.get $l4857 + i32.add + local.set $l4858 + local.get $l4857 + local.get $l4858 + i32.add + local.set $l4859 + local.get $l4858 + local.get $l4859 + i32.add + local.set $l4860 + local.get $l4859 + local.get $l4860 + i32.add + local.set $l4861 + local.get $l4860 + local.get $l4861 + i32.add + local.set $l4862 + local.get $l4861 + local.get $l4862 + i32.add + local.set $l4863 + local.get $l4862 + local.get $l4863 + i32.add + local.set $l4864 + local.get $l4863 + local.get $l4864 + i32.add + local.set $l4865 + local.get $l4864 + local.get $l4865 + i32.add + local.set $l4866 + local.get $l4865 + local.get $l4866 + i32.add + local.set $l4867 + local.get $l4866 + local.get $l4867 + i32.add + local.set $l4868 + local.get $l4867 + local.get $l4868 + i32.add + local.set $l4869 + local.get $l4868 + local.get $l4869 + i32.add + local.set $l4870 + local.get $l4869 + local.get $l4870 + i32.add + local.set $l4871 + local.get $l4870 + local.get $l4871 + i32.add + local.set $l4872 + local.get $l4871 + local.get $l4872 + i32.add + local.set $l4873 + local.get $l4872 + local.get $l4873 + i32.add + local.set $l4874 + local.get $l4873 + local.get $l4874 + i32.add + local.set $l4875 + local.get $l4874 + local.get $l4875 + i32.add + local.set $l4876 + local.get $l4875 + local.get $l4876 + i32.add + local.set $l4877 + local.get $l4876 + local.get $l4877 + i32.add + local.set $l4878 + local.get $l4877 + local.get $l4878 + i32.add + local.set $l4879 + local.get $l4878 + local.get $l4879 + i32.add + local.set $l4880 + local.get $l4879 + local.get $l4880 + i32.add + local.set $l4881 + local.get $l4880 + local.get $l4881 + i32.add + local.set $l4882 + local.get $l4881 + local.get $l4882 + i32.add + local.set $l4883 + local.get $l4882 + local.get $l4883 + i32.add + local.set $l4884 + local.get $l4883 + local.get $l4884 + i32.add + local.set $l4885 + local.get $l4884 + local.get $l4885 + i32.add + local.set $l4886 + local.get $l4885 + local.get $l4886 + i32.add + local.set $l4887 + local.get $l4886 + local.get $l4887 + i32.add + local.set $l4888 + local.get $l4887 + local.get $l4888 + i32.add + local.set $l4889 + local.get $l4888 + local.get $l4889 + i32.add + local.set $l4890 + local.get $l4889 + local.get $l4890 + i32.add + local.set $l4891 + local.get $l4890 + local.get $l4891 + i32.add + local.set $l4892 + local.get $l4891 + local.get $l4892 + i32.add + local.set $l4893 + local.get $l4892 + local.get $l4893 + i32.add + local.set $l4894 + local.get $l4893 + local.get $l4894 + i32.add + local.set $l4895 + local.get $l4894 + local.get $l4895 + i32.add + local.set $l4896 + local.get $l4895 + local.get $l4896 + i32.add + local.set $l4897 + local.get $l4896 + local.get $l4897 + i32.add + local.set $l4898 + local.get $l4897 + local.get $l4898 + i32.add + local.set $l4899 + local.get $l4898 + local.get $l4899 + i32.add + local.set $l4900 + local.get $l4899 + local.get $l4900 + i32.add + local.set $l4901 + local.get $l4900 + local.get $l4901 + i32.add + local.set $l4902 + local.get $l4901 + local.get $l4902 + i32.add + local.set $l4903 + local.get $l4902 + local.get $l4903 + i32.add + local.set $l4904 + local.get $l4903 + local.get $l4904 + i32.add + local.set $l4905 + local.get $l4904 + local.get $l4905 + i32.add + local.set $l4906 + local.get $l4905 + local.get $l4906 + i32.add + local.set $l4907 + local.get $l4906 + local.get $l4907 + i32.add + local.set $l4908 + local.get $l4907 + local.get $l4908 + i32.add + local.set $l4909 + local.get $l4908 + local.get $l4909 + i32.add + local.set $l4910 + local.get $l4909 + local.get $l4910 + i32.add + local.set $l4911 + local.get $l4910 + local.get $l4911 + i32.add + local.set $l4912 + local.get $l4911 + local.get $l4912 + i32.add + local.set $l4913 + local.get $l4912 + local.get $l4913 + i32.add + local.set $l4914 + local.get $l4913 + local.get $l4914 + i32.add + local.set $l4915 + local.get $l4914 + local.get $l4915 + i32.add + local.set $l4916 + local.get $l4915 + local.get $l4916 + i32.add + local.set $l4917 + local.get $l4916 + local.get $l4917 + i32.add + local.set $l4918 + local.get $l4917 + local.get $l4918 + i32.add + local.set $l4919 + local.get $l4918 + local.get $l4919 + i32.add + local.set $l4920 + local.get $l4919 + local.get $l4920 + i32.add + local.set $l4921 + local.get $l4920 + local.get $l4921 + i32.add + local.set $l4922 + local.get $l4921 + local.get $l4922 + i32.add + local.set $l4923 + local.get $l4922 + local.get $l4923 + i32.add + local.set $l4924 + local.get $l4923 + local.get $l4924 + i32.add + local.set $l4925 + local.get $l4924 + local.get $l4925 + i32.add + local.set $l4926 + local.get $l4925 + local.get $l4926 + i32.add + local.set $l4927 + local.get $l4926 + local.get $l4927 + i32.add + local.set $l4928 + local.get $l4927 + local.get $l4928 + i32.add + local.set $l4929 + local.get $l4928 + local.get $l4929 + i32.add + local.set $l4930 + local.get $l4929 + local.get $l4930 + i32.add + local.set $l4931 + local.get $l4930 + local.get $l4931 + i32.add + local.set $l4932 + local.get $l4931 + local.get $l4932 + i32.add + local.set $l4933 + local.get $l4932 + local.get $l4933 + i32.add + local.set $l4934 + local.get $l4933 + local.get $l4934 + i32.add + local.set $l4935 + local.get $l4934 + local.get $l4935 + i32.add + local.set $l4936 + local.get $l4935 + local.get $l4936 + i32.add + local.set $l4937 + local.get $l4936 + local.get $l4937 + i32.add + local.set $l4938 + local.get $l4937 + local.get $l4938 + i32.add + local.set $l4939 + local.get $l4938 + local.get $l4939 + i32.add + local.set $l4940 + local.get $l4939 + local.get $l4940 + i32.add + local.set $l4941 + local.get $l4940 + local.get $l4941 + i32.add + local.set $l4942 + local.get $l4941 + local.get $l4942 + i32.add + local.set $l4943 + local.get $l4942 + local.get $l4943 + i32.add + local.set $l4944 + local.get $l4943 + local.get $l4944 + i32.add + local.set $l4945 + local.get $l4944 + local.get $l4945 + i32.add + local.set $l4946 + local.get $l4945 + local.get $l4946 + i32.add + local.set $l4947 + local.get $l4946 + local.get $l4947 + i32.add + local.set $l4948 + local.get $l4947 + local.get $l4948 + i32.add + local.set $l4949 + local.get $l4948 + local.get $l4949 + i32.add + local.set $l4950 + local.get $l4949 + local.get $l4950 + i32.add + local.set $l4951 + local.get $l4950 + local.get $l4951 + i32.add + local.set $l4952 + local.get $l4951 + local.get $l4952 + i32.add + local.set $l4953 + local.get $l4952 + local.get $l4953 + i32.add + local.set $l4954 + local.get $l4953 + local.get $l4954 + i32.add + local.set $l4955 + local.get $l4954 + local.get $l4955 + i32.add + local.set $l4956 + local.get $l4955 + local.get $l4956 + i32.add + local.set $l4957 + local.get $l4956 + local.get $l4957 + i32.add + local.set $l4958 + local.get $l4957 + local.get $l4958 + i32.add + local.set $l4959 + local.get $l4958 + local.get $l4959 + i32.add + local.set $l4960 + local.get $l4959 + local.get $l4960 + i32.add + local.set $l4961 + local.get $l4960 + local.get $l4961 + i32.add + local.set $l4962 + local.get $l4961 + local.get $l4962 + i32.add + local.set $l4963 + local.get $l4962 + local.get $l4963 + i32.add + local.set $l4964 + local.get $l4963 + local.get $l4964 + i32.add + local.set $l4965 + local.get $l4964 + local.get $l4965 + i32.add + local.set $l4966 + local.get $l4965 + local.get $l4966 + i32.add + local.set $l4967 + local.get $l4966 + local.get $l4967 + i32.add + local.set $l4968 + local.get $l4967 + local.get $l4968 + i32.add + local.set $l4969 + local.get $l4968 + local.get $l4969 + i32.add + local.set $l4970 + local.get $l4969 + local.get $l4970 + i32.add + local.set $l4971 + local.get $l4970 + local.get $l4971 + i32.add + local.set $l4972 + local.get $l4971 + local.get $l4972 + i32.add + local.set $l4973 + local.get $l4972 + local.get $l4973 + i32.add + local.set $l4974 + local.get $l4973 + local.get $l4974 + i32.add + local.set $l4975 + local.get $l4974 + local.get $l4975 + i32.add + local.set $l4976 + local.get $l4975 + local.get $l4976 + i32.add + local.set $l4977 + local.get $l4976 + local.get $l4977 + i32.add + local.set $l4978 + local.get $l4977 + local.get $l4978 + i32.add + local.set $l4979 + local.get $l4978 + local.get $l4979 + i32.add + local.set $l4980 + local.get $l4979 + local.get $l4980 + i32.add + local.set $l4981 + local.get $l4980 + local.get $l4981 + i32.add + local.set $l4982 + local.get $l4981 + local.get $l4982 + i32.add + local.set $l4983 + local.get $l4982 + local.get $l4983 + i32.add + local.set $l4984 + local.get $l4983 + local.get $l4984 + i32.add + local.set $l4985 + local.get $l4984 + local.get $l4985 + i32.add + local.set $l4986 + local.get $l4985 + local.get $l4986 + i32.add + local.set $l4987 + local.get $l4986 + local.get $l4987 + i32.add + local.set $l4988 + local.get $l4987 + local.get $l4988 + i32.add + local.set $l4989 + local.get $l4988 + local.get $l4989 + i32.add + local.set $l4990 + local.get $l4989 + local.get $l4990 + i32.add + local.set $l4991 + local.get $l4990 + local.get $l4991 + i32.add + local.set $l4992 + local.get $l4991 + local.get $l4992 + i32.add + local.set $l4993 + local.get $l4992 + local.get $l4993 + i32.add + local.set $l4994 + local.get $l4993 + local.get $l4994 + i32.add + local.set $l4995 + local.get $l4994 + local.get $l4995 + i32.add + local.set $l4996 + local.get $l4995 + local.get $l4996 + i32.add + local.set $l4997 + local.get $l4996 + local.get $l4997 + i32.add + local.set $l4998 + local.get $l4997 + local.get $l4998 + i32.add + local.set $l4999 + local.get $l4998 + local.get $l4999 + i32.add + local.set $l5000 + local.get $l4999 + local.get $l5000 + i32.add + local.set $l5001 + local.get $l5000 + local.get $l5001 + i32.add + local.set $l5002 + local.get $l5001 + local.get $l5002 + i32.add + local.set $l5003 + local.get $l5002 + local.get $l5003 + i32.add + local.set $l5004 + local.get $l5003 + local.get $l5004 + i32.add + local.set $l5005 + local.get $l5004 + local.get $l5005 + i32.add + local.set $l5006 + local.get $l5005 + local.get $l5006 + i32.add + local.set $l5007 + local.get $l5006 + local.get $l5007 + i32.add + local.set $l5008 + local.get $l5007 + local.get $l5008 + i32.add + local.set $l5009 + local.get $l5008 + local.get $l5009 + i32.add + local.set $l5010 + local.get $l5009 + local.get $l5010 + i32.add + local.set $l5011 + local.get $l5010 + local.get $l5011 + i32.add + local.set $l5012 + local.get $l5011 + local.get $l5012 + i32.add + local.set $l5013 + local.get $l5012 + local.get $l5013 + i32.add + local.set $l5014 + local.get $l5013 + local.get $l5014 + i32.add + local.set $l5015 + local.get $l5014 + local.get $l5015 + i32.add + local.set $l5016 + local.get $l5015 + local.get $l5016 + i32.add + local.set $l5017 + local.get $l5016 + local.get $l5017 + i32.add + local.set $l5018 + local.get $l5017 + local.get $l5018 + i32.add + local.set $l5019 + local.get $l5018 + local.get $l5019 + i32.add + local.set $l5020 + local.get $l5019 + local.get $l5020 + i32.add + local.set $l5021 + local.get $l5020 + local.get $l5021 + i32.add + local.set $l5022 + local.get $l5021 + local.get $l5022 + i32.add + local.set $l5023 + local.get $l5022 + local.get $l5023 + i32.add + local.set $l5024 + local.get $l5023 + local.get $l5024 + i32.add + local.set $l5025 + local.get $l5024 + local.get $l5025 + i32.add + local.set $l5026 + local.get $l5025 + local.get $l5026 + i32.add + local.set $l5027 + local.get $l5026 + local.get $l5027 + i32.add + local.set $l5028 + local.get $l5027 + local.get $l5028 + i32.add + local.set $l5029 + local.get $l5028 + local.get $l5029 + i32.add + local.set $l5030 + local.get $l5029 + local.get $l5030 + i32.add + local.set $l5031 + local.get $l5030 + local.get $l5031 + i32.add + local.set $l5032 + local.get $l5031 + local.get $l5032 + i32.add + local.set $l5033 + local.get $l5032 + local.get $l5033 + i32.add + local.set $l5034 + local.get $l5033 + local.get $l5034 + i32.add + local.set $l5035 + local.get $l5034 + local.get $l5035 + i32.add + local.set $l5036 + local.get $l5035 + local.get $l5036 + i32.add + local.set $l5037 + local.get $l5036 + local.get $l5037 + i32.add + local.set $l5038 + local.get $l5037 + local.get $l5038 + i32.add + local.set $l5039 + local.get $l5038 + local.get $l5039 + i32.add + local.set $l5040 + local.get $l5039 + local.get $l5040 + i32.add + local.set $l5041 + local.get $l5040 + local.get $l5041 + i32.add + local.set $l5042 + local.get $l5041 + local.get $l5042 + i32.add + local.set $l5043 + local.get $l5042 + local.get $l5043 + i32.add + local.set $l5044 + local.get $l5043 + local.get $l5044 + i32.add + local.set $l5045 + local.get $l5044 + local.get $l5045 + i32.add + local.set $l5046 + local.get $l5045 + local.get $l5046 + i32.add + local.set $l5047 + local.get $l5046 + local.get $l5047 + i32.add + local.set $l5048 + local.get $l5047 + local.get $l5048 + i32.add + local.set $l5049 + local.get $l5048 + local.get $l5049 + i32.add + local.set $l5050 + local.get $l5049 + local.get $l5050 + i32.add + local.set $l5051 + local.get $l5050 + local.get $l5051 + i32.add + local.set $l5052 + local.get $l5051 + local.get $l5052 + i32.add + local.set $l5053 + local.get $l5052 + local.get $l5053 + i32.add + local.set $l5054 + local.get $l5053 + local.get $l5054 + i32.add + local.set $l5055 + local.get $l5054 + local.get $l5055 + i32.add + local.set $l5056 + local.get $l5055 + local.get $l5056 + i32.add + local.set $l5057 + local.get $l5056 + local.get $l5057 + i32.add + local.set $l5058 + local.get $l5057 + local.get $l5058 + i32.add + local.set $l5059 + local.get $l5058 + local.get $l5059 + i32.add + local.set $l5060 + local.get $l5059 + local.get $l5060 + i32.add + local.set $l5061 + local.get $l5060 + local.get $l5061 + i32.add + local.set $l5062 + local.get $l5061 + local.get $l5062 + i32.add + local.set $l5063 + local.get $l5062 + local.get $l5063 + i32.add + local.set $l5064 + local.get $l5063 + local.get $l5064 + i32.add + local.set $l5065 + local.get $l5064 + local.get $l5065 + i32.add + local.set $l5066 + local.get $l5065 + local.get $l5066 + i32.add + local.set $l5067 + local.get $l5066 + local.get $l5067 + i32.add + local.set $l5068 + local.get $l5067 + local.get $l5068 + i32.add + local.set $l5069 + local.get $l5068 + local.get $l5069 + i32.add + local.set $l5070 + local.get $l5069 + local.get $l5070 + i32.add + local.set $l5071 + local.get $l5070 + local.get $l5071 + i32.add + local.set $l5072 + local.get $l5071 + local.get $l5072 + i32.add + local.set $l5073 + local.get $l5072 + local.get $l5073 + i32.add + local.set $l5074 + local.get $l5073 + local.get $l5074 + i32.add + local.set $l5075 + local.get $l5074 + local.get $l5075 + i32.add + local.set $l5076 + local.get $l5075 + local.get $l5076 + i32.add + local.set $l5077 + local.get $l5076 + local.get $l5077 + i32.add + local.set $l5078 + local.get $l5077 + local.get $l5078 + i32.add + local.set $l5079 + local.get $l5078 + local.get $l5079 + i32.add + local.set $l5080 + local.get $l5079 + local.get $l5080 + i32.add + local.set $l5081 + local.get $l5080 + local.get $l5081 + i32.add + local.set $l5082 + local.get $l5081 + local.get $l5082 + i32.add + local.set $l5083 + local.get $l5082 + local.get $l5083 + i32.add + local.set $l5084 + local.get $l5083 + local.get $l5084 + i32.add + local.set $l5085 + local.get $l5084 + local.get $l5085 + i32.add + local.set $l5086 + local.get $l5085 + local.get $l5086 + i32.add + local.set $l5087 + local.get $l5086 + local.get $l5087 + i32.add + local.set $l5088 + local.get $l5087 + local.get $l5088 + i32.add + local.set $l5089 + local.get $l5088 + local.get $l5089 + i32.add + local.set $l5090 + local.get $l5089 + local.get $l5090 + i32.add + local.set $l5091 + local.get $l5090 + local.get $l5091 + i32.add + local.set $l5092 + local.get $l5091 + local.get $l5092 + i32.add + local.set $l5093 + local.get $l5092 + local.get $l5093 + i32.add + local.set $l5094 + local.get $l5093 + local.get $l5094 + i32.add + local.set $l5095 + local.get $l5094 + local.get $l5095 + i32.add + local.set $l5096 + local.get $l5095 + local.get $l5096 + i32.add + local.set $l5097 + local.get $l5096 + local.get $l5097 + i32.add + local.set $l5098 + local.get $l5097 + local.get $l5098 + i32.add + local.set $l5099 + local.get $l5098 + local.get $l5099 + i32.add + local.set $l5100 + local.get $l5099 + local.get $l5100 + i32.add + local.set $l5101 + local.get $l5100 + local.get $l5101 + i32.add + local.set $l5102 + local.get $l5101 + local.get $l5102 + i32.add + local.set $l5103 + local.get $l5102 + local.get $l5103 + i32.add + local.set $l5104 + local.get $l5103 + local.get $l5104 + i32.add + local.set $l5105 + local.get $l5104 + local.get $l5105 + i32.add + local.set $l5106 + local.get $l5105 + local.get $l5106 + i32.add + local.set $l5107 + local.get $l5106 + local.get $l5107 + i32.add + local.set $l5108 + local.get $l5107 + local.get $l5108 + i32.add + local.set $l5109 + local.get $l5108 + local.get $l5109 + i32.add + local.set $l5110 + local.get $l5109 + local.get $l5110 + i32.add + local.set $l5111 + local.get $l5110 + local.get $l5111 + i32.add + local.set $l5112 + local.get $l5111 + local.get $l5112 + i32.add + local.set $l5113 + local.get $l5112 + local.get $l5113 + i32.add + local.set $l5114 + local.get $l5113 + local.get $l5114 + i32.add + local.set $l5115 + local.get $l5114 + local.get $l5115 + i32.add + local.set $l5116 + local.get $l5115 + local.get $l5116 + i32.add + local.set $l5117 + local.get $l5116 + local.get $l5117 + i32.add + local.set $l5118 + local.get $l5117 + local.get $l5118 + i32.add + local.set $l5119 + local.get $l5118 + local.get $l5119 + i32.add + local.set $l5120 + local.get $l5119 + local.get $l5120 + i32.add + local.set $l5121 + local.get $l5120 + local.get $l5121 + i32.add + local.set $l5122 + local.get $l5121 + local.get $l5122 + i32.add + local.set $l5123 + local.get $l5122 + local.get $l5123 + i32.add + local.set $l5124 + local.get $l5123 + local.get $l5124 + i32.add + local.set $l5125 + local.get $l5124 + local.get $l5125 + i32.add + local.set $l5126 + local.get $l5125 + local.get $l5126 + i32.add + local.set $l5127 + local.get $l5126 + local.get $l5127 + i32.add + local.set $l5128 + local.get $l5127 + local.get $l5128 + i32.add + local.set $l5129 + local.get $l5128 + local.get $l5129 + i32.add + local.set $l5130 + local.get $l5129 + local.get $l5130 + i32.add + local.set $l5131 + local.get $l5130 + local.get $l5131 + i32.add + local.set $l5132 + local.get $l5131 + local.get $l5132 + i32.add + local.set $l5133 + local.get $l5132 + local.get $l5133 + i32.add + local.set $l5134 + local.get $l5133 + local.get $l5134 + i32.add + local.set $l5135 + local.get $l5134 + local.get $l5135 + i32.add + local.set $l5136 + local.get $l5135 + local.get $l5136 + i32.add + local.set $l5137 + local.get $l5136 + local.get $l5137 + i32.add + local.set $l5138 + local.get $l5137 + local.get $l5138 + i32.add + local.set $l5139 + local.get $l5138 + local.get $l5139 + i32.add + local.set $l5140 + local.get $l5139 + local.get $l5140 + i32.add + local.set $l5141 + local.get $l5140 + local.get $l5141 + i32.add + local.set $l5142 + local.get $l5141 + local.get $l5142 + i32.add + local.set $l5143 + local.get $l5142 + local.get $l5143 + i32.add + local.set $l5144 + local.get $l5143 + local.get $l5144 + i32.add + local.set $l5145 + local.get $l5144 + local.get $l5145 + i32.add + local.set $l5146 + local.get $l5145 + local.get $l5146 + i32.add + local.set $l5147 + local.get $l5146 + local.get $l5147 + i32.add + local.set $l5148 + local.get $l5147 + local.get $l5148 + i32.add + local.set $l5149 + local.get $l5148 + local.get $l5149 + i32.add + local.set $l5150 + local.get $l5149 + local.get $l5150 + i32.add + local.set $l5151 + local.get $l5150 + local.get $l5151 + i32.add + local.set $l5152 + local.get $l5151 + local.get $l5152 + i32.add + local.set $l5153 + local.get $l5152 + local.get $l5153 + i32.add + local.set $l5154 + local.get $l5153 + local.get $l5154 + i32.add + local.set $l5155 + local.get $l5154 + local.get $l5155 + i32.add + local.set $l5156 + local.get $l5155 + local.get $l5156 + i32.add + local.set $l5157 + local.get $l5156 + local.get $l5157 + i32.add + local.set $l5158 + local.get $l5157 + local.get $l5158 + i32.add + local.set $l5159 + local.get $l5158 + local.get $l5159 + i32.add + local.set $l5160 + local.get $l5159 + local.get $l5160 + i32.add + local.set $l5161 + local.get $l5160 + local.get $l5161 + i32.add + local.set $l5162 + local.get $l5161 + local.get $l5162 + i32.add + local.set $l5163 + local.get $l5162 + local.get $l5163 + i32.add + local.set $l5164 + local.get $l5163 + local.get $l5164 + i32.add + local.set $l5165 + local.get $l5164 + local.get $l5165 + i32.add + local.set $l5166 + local.get $l5165 + local.get $l5166 + i32.add + local.set $l5167 + local.get $l5166 + local.get $l5167 + i32.add + local.set $l5168 + local.get $l5167 + local.get $l5168 + i32.add + local.set $l5169 + local.get $l5168 + local.get $l5169 + i32.add + local.set $l5170 + local.get $l5169 + local.get $l5170 + i32.add + local.set $l5171 + local.get $l5170 + local.get $l5171 + i32.add + local.set $l5172 + local.get $l5171 + local.get $l5172 + i32.add + local.set $l5173 + local.get $l5172 + local.get $l5173 + i32.add + local.set $l5174 + local.get $l5173 + local.get $l5174 + i32.add + local.set $l5175 + local.get $l5174 + local.get $l5175 + i32.add + local.set $l5176 + local.get $l5175 + local.get $l5176 + i32.add + local.set $l5177 + local.get $l5176 + local.get $l5177 + i32.add + local.set $l5178 + local.get $l5177 + local.get $l5178 + i32.add + local.set $l5179 + local.get $l5178 + local.get $l5179 + i32.add + local.set $l5180 + local.get $l5179 + local.get $l5180 + i32.add + local.set $l5181 + local.get $l5180 + local.get $l5181 + i32.add + local.set $l5182 + local.get $l5181 + local.get $l5182 + i32.add + local.set $l5183 + local.get $l5182 + local.get $l5183 + i32.add + local.set $l5184 + local.get $l5183 + local.get $l5184 + i32.add + local.set $l5185 + local.get $l5184 + local.get $l5185 + i32.add + local.set $l5186 + local.get $l5185 + local.get $l5186 + i32.add + local.set $l5187 + local.get $l5186 + local.get $l5187 + i32.add + local.set $l5188 + local.get $l5187 + local.get $l5188 + i32.add + local.set $l5189 + local.get $l5188 + local.get $l5189 + i32.add + local.set $l5190 + local.get $l5189 + local.get $l5190 + i32.add + local.set $l5191 + local.get $l5190 + local.get $l5191 + i32.add + local.set $l5192 + local.get $l5191 + local.get $l5192 + i32.add + local.set $l5193 + local.get $l5192 + local.get $l5193 + i32.add + local.set $l5194 + local.get $l5193 + local.get $l5194 + i32.add + local.set $l5195 + local.get $l5194 + local.get $l5195 + i32.add + local.set $l5196 + local.get $l5195 + local.get $l5196 + i32.add + local.set $l5197 + local.get $l5196 + local.get $l5197 + i32.add + local.set $l5198 + local.get $l5197 + local.get $l5198 + i32.add + local.set $l5199 + local.get $l5198 + local.get $l5199 + i32.add + local.set $l5200 + local.get $l5199 + local.get $l5200 + i32.add + local.set $l5201 + local.get $l5200 + local.get $l5201 + i32.add + local.set $l5202 + local.get $l5201 + local.get $l5202 + i32.add + local.set $l5203 + local.get $l5202 + local.get $l5203 + i32.add + local.set $l5204 + local.get $l5203 + local.get $l5204 + i32.add + local.set $l5205 + local.get $l5204 + local.get $l5205 + i32.add + local.set $l5206 + local.get $l5205 + local.get $l5206 + i32.add + local.set $l5207 + local.get $l5206 + local.get $l5207 + i32.add + local.set $l5208 + local.get $l5207 + local.get $l5208 + i32.add + local.set $l5209 + local.get $l5208 + local.get $l5209 + i32.add + local.set $l5210 + local.get $l5209 + local.get $l5210 + i32.add + local.set $l5211 + local.get $l5210 + local.get $l5211 + i32.add + local.set $l5212 + local.get $l5211 + local.get $l5212 + i32.add + local.set $l5213 + local.get $l5212 + local.get $l5213 + i32.add + local.set $l5214 + local.get $l5213 + local.get $l5214 + i32.add + local.set $l5215 + local.get $l5214 + local.get $l5215 + i32.add + local.set $l5216 + local.get $l5215 + local.get $l5216 + i32.add + local.set $l5217 + local.get $l5216 + local.get $l5217 + i32.add + local.set $l5218 + local.get $l5217 + local.get $l5218 + i32.add + local.set $l5219 + local.get $l5218 + local.get $l5219 + i32.add + local.set $l5220 + local.get $l5219 + local.get $l5220 + i32.add + local.set $l5221 + local.get $l5220 + local.get $l5221 + i32.add + local.set $l5222 + local.get $l5221 + local.get $l5222 + i32.add + local.set $l5223 + local.get $l5222 + local.get $l5223 + i32.add + local.set $l5224 + local.get $l5223 + local.get $l5224 + i32.add + local.set $l5225 + local.get $l5224 + local.get $l5225 + i32.add + local.set $l5226 + local.get $l5225 + local.get $l5226 + i32.add + local.set $l5227 + local.get $l5226 + local.get $l5227 + i32.add + local.set $l5228 + local.get $l5227 + local.get $l5228 + i32.add + local.set $l5229 + local.get $l5228 + local.get $l5229 + i32.add + local.set $l5230 + local.get $l5229 + local.get $l5230 + i32.add + local.set $l5231 + local.get $l5230 + local.get $l5231 + i32.add + local.set $l5232 + local.get $l5231 + local.get $l5232 + i32.add + local.set $l5233 + local.get $l5232 + local.get $l5233 + i32.add + local.set $l5234 + local.get $l5233 + local.get $l5234 + i32.add + local.set $l5235 + local.get $l5234 + local.get $l5235 + i32.add + local.set $l5236 + local.get $l5235 + local.get $l5236 + i32.add + local.set $l5237 + local.get $l5236 + local.get $l5237 + i32.add + local.set $l5238 + local.get $l5237 + local.get $l5238 + i32.add + local.set $l5239 + local.get $l5238 + local.get $l5239 + i32.add + local.set $l5240 + local.get $l5239 + local.get $l5240 + i32.add + local.set $l5241 + local.get $l5240 + local.get $l5241 + i32.add + local.set $l5242 + local.get $l5241 + local.get $l5242 + i32.add + local.set $l5243 + local.get $l5242 + local.get $l5243 + i32.add + local.set $l5244 + local.get $l5243 + local.get $l5244 + i32.add + local.set $l5245 + local.get $l5244 + local.get $l5245 + i32.add + local.set $l5246 + local.get $l5245 + local.get $l5246 + i32.add + local.set $l5247 + local.get $l5246 + local.get $l5247 + i32.add + local.set $l5248 + local.get $l5247 + local.get $l5248 + i32.add + local.set $l5249 + local.get $l5248 + local.get $l5249 + i32.add + local.set $l5250 + local.get $l5249 + local.get $l5250 + i32.add + local.set $l5251 + local.get $l5250 + local.get $l5251 + i32.add + local.set $l5252 + local.get $l5251 + local.get $l5252 + i32.add + local.set $l5253 + local.get $l5252 + local.get $l5253 + i32.add + local.set $l5254 + local.get $l5253 + local.get $l5254 + i32.add + local.set $l5255 + local.get $l5254 + local.get $l5255 + i32.add + local.set $l5256 + local.get $l5255 + local.get $l5256 + i32.add + local.set $l5257 + local.get $l5256 + local.get $l5257 + i32.add + local.set $l5258 + local.get $l5257 + local.get $l5258 + i32.add + local.set $l5259 + local.get $l5258 + local.get $l5259 + i32.add + local.set $l5260 + local.get $l5259 + local.get $l5260 + i32.add + local.set $l5261 + local.get $l5260 + local.get $l5261 + i32.add + local.set $l5262 + local.get $l5261 + local.get $l5262 + i32.add + local.set $l5263 + local.get $l5262 + local.get $l5263 + i32.add + local.set $l5264 + local.get $l5263 + local.get $l5264 + i32.add + local.set $l5265 + local.get $l5264 + local.get $l5265 + i32.add + local.set $l5266 + local.get $l5265 + local.get $l5266 + i32.add + local.set $l5267 + local.get $l5266 + local.get $l5267 + i32.add + local.set $l5268 + local.get $l5267 + local.get $l5268 + i32.add + local.set $l5269 + local.get $l5268 + local.get $l5269 + i32.add + local.set $l5270 + local.get $l5269 + local.get $l5270 + i32.add + local.set $l5271 + local.get $l5270 + local.get $l5271 + i32.add + local.set $l5272 + local.get $l5271 + local.get $l5272 + i32.add + local.set $l5273 + local.get $l5272 + local.get $l5273 + i32.add + local.set $l5274 + local.get $l5273 + local.get $l5274 + i32.add + local.set $l5275 + local.get $l5274 + local.get $l5275 + i32.add + local.set $l5276 + local.get $l5275 + local.get $l5276 + i32.add + local.set $l5277 + local.get $l5276 + local.get $l5277 + i32.add + local.set $l5278 + local.get $l5277 + local.get $l5278 + i32.add + local.set $l5279 + local.get $l5278 + local.get $l5279 + i32.add + local.set $l5280 + local.get $l5279 + local.get $l5280 + i32.add + local.set $l5281 + local.get $l5280 + local.get $l5281 + i32.add + local.set $l5282 + local.get $l5281 + local.get $l5282 + i32.add + local.set $l5283 + local.get $l5282 + local.get $l5283 + i32.add + local.set $l5284 + local.get $l5283 + local.get $l5284 + i32.add + local.set $l5285 + local.get $l5284 + local.get $l5285 + i32.add + local.set $l5286 + local.get $l5285 + local.get $l5286 + i32.add + local.set $l5287 + local.get $l5286 + local.get $l5287 + i32.add + local.set $l5288 + local.get $l5287 + local.get $l5288 + i32.add + local.set $l5289 + local.get $l5288 + local.get $l5289 + i32.add + local.set $l5290 + local.get $l5289 + local.get $l5290 + i32.add + local.set $l5291 + local.get $l5290 + local.get $l5291 + i32.add + local.set $l5292 + local.get $l5291 + local.get $l5292 + i32.add + local.set $l5293 + local.get $l5292 + local.get $l5293 + i32.add + local.set $l5294 + local.get $l5293 + local.get $l5294 + i32.add + local.set $l5295 + local.get $l5294 + local.get $l5295 + i32.add + local.set $l5296 + local.get $l5295 + local.get $l5296 + i32.add + local.set $l5297 + local.get $l5296 + local.get $l5297 + i32.add + local.set $l5298 + local.get $l5297 + local.get $l5298 + i32.add + local.set $l5299 + local.get $l5298 + local.get $l5299 + i32.add + local.set $l5300 + local.get $l5299 + local.get $l5300 + i32.add + local.set $l5301 + local.get $l5300 + local.get $l5301 + i32.add + local.set $l5302 + local.get $l5301 + local.get $l5302 + i32.add + local.set $l5303 + local.get $l5302 + local.get $l5303 + i32.add + local.set $l5304 + local.get $l5303 + local.get $l5304 + i32.add + local.set $l5305 + local.get $l5304 + local.get $l5305 + i32.add + local.set $l5306 + local.get $l5305 + local.get $l5306 + i32.add + local.set $l5307 + local.get $l5306 + local.get $l5307 + i32.add + local.set $l5308 + local.get $l5307 + local.get $l5308 + i32.add + local.set $l5309 + local.get $l5308 + local.get $l5309 + i32.add + local.set $l5310 + local.get $l5309 + local.get $l5310 + i32.add + local.set $l5311 + local.get $l5310 + local.get $l5311 + i32.add + local.set $l5312 + local.get $l5311 + local.get $l5312 + i32.add + local.set $l5313 + local.get $l5312 + local.get $l5313 + i32.add + local.set $l5314 + local.get $l5313 + local.get $l5314 + i32.add + local.set $l5315 + local.get $l5314 + local.get $l5315 + i32.add + local.set $l5316 + local.get $l5315 + local.get $l5316 + i32.add + local.set $l5317 + local.get $l5316 + local.get $l5317 + i32.add + local.set $l5318 + local.get $l5317 + local.get $l5318 + i32.add + local.set $l5319 + local.get $l5318 + local.get $l5319 + i32.add + local.set $l5320 + local.get $l5319 + local.get $l5320 + i32.add + local.set $l5321 + local.get $l5320 + local.get $l5321 + i32.add + local.set $l5322 + local.get $l5321 + local.get $l5322 + i32.add + local.set $l5323 + local.get $l5322 + local.get $l5323 + i32.add + local.set $l5324 + local.get $l5323 + local.get $l5324 + i32.add + local.set $l5325 + local.get $l5324 + local.get $l5325 + i32.add + local.set $l5326 + local.get $l5325 + local.get $l5326 + i32.add + local.set $l5327 + local.get $l5326 + local.get $l5327 + i32.add + local.set $l5328 + local.get $l5327 + local.get $l5328 + i32.add + local.set $l5329 + local.get $l5328 + local.get $l5329 + i32.add + local.set $l5330 + local.get $l5329 + local.get $l5330 + i32.add + local.set $l5331 + local.get $l5330 + local.get $l5331 + i32.add + local.set $l5332 + local.get $l5331 + local.get $l5332 + i32.add + local.set $l5333 + local.get $l5332 + local.get $l5333 + i32.add + local.set $l5334 + local.get $l5333 + local.get $l5334 + i32.add + local.set $l5335 + local.get $l5334 + local.get $l5335 + i32.add + local.set $l5336 + local.get $l5335 + local.get $l5336 + i32.add + local.set $l5337 + local.get $l5336 + local.get $l5337 + i32.add + local.set $l5338 + local.get $l5337 + local.get $l5338 + i32.add + local.set $l5339 + local.get $l5338 + local.get $l5339 + i32.add + local.set $l5340 + local.get $l5339 + local.get $l5340 + i32.add + local.set $l5341 + local.get $l5340 + local.get $l5341 + i32.add + local.set $l5342 + local.get $l5341 + local.get $l5342 + i32.add + local.set $l5343 + local.get $l5342 + local.get $l5343 + i32.add + local.set $l5344 + local.get $l5343 + local.get $l5344 + i32.add + local.set $l5345 + local.get $l5344 + local.get $l5345 + i32.add + local.set $l5346 + local.get $l5345 + local.get $l5346 + i32.add + local.set $l5347 + local.get $l5346 + local.get $l5347 + i32.add + local.set $l5348 + local.get $l5347 + local.get $l5348 + i32.add + local.set $l5349 + local.get $l5348 + local.get $l5349 + i32.add + local.set $l5350 + local.get $l5349 + local.get $l5350 + i32.add + local.set $l5351 + local.get $l5350 + local.get $l5351 + i32.add + local.set $l5352 + local.get $l5351 + local.get $l5352 + i32.add + local.set $l5353 + local.get $l5352 + local.get $l5353 + i32.add + local.set $l5354 + local.get $l5353 + local.get $l5354 + i32.add + local.set $l5355 + local.get $l5354 + local.get $l5355 + i32.add + local.set $l5356 + local.get $l5355 + local.get $l5356 + i32.add + local.set $l5357 + local.get $l5356 + local.get $l5357 + i32.add + local.set $l5358 + local.get $l5357 + local.get $l5358 + i32.add + local.set $l5359 + local.get $l5358 + local.get $l5359 + i32.add + local.set $l5360 + local.get $l5359 + local.get $l5360 + i32.add + local.set $l5361 + local.get $l5360 + local.get $l5361 + i32.add + local.set $l5362 + local.get $l5361 + local.get $l5362 + i32.add + local.set $l5363 + local.get $l5362 + local.get $l5363 + i32.add + local.set $l5364 + local.get $l5363 + local.get $l5364 + i32.add + local.set $l5365 + local.get $l5364 + local.get $l5365 + i32.add + local.set $l5366 + local.get $l5365 + local.get $l5366 + i32.add + local.set $l5367 + local.get $l5366 + local.get $l5367 + i32.add + local.set $l5368 + local.get $l5367 + local.get $l5368 + i32.add + local.set $l5369 + local.get $l5368 + local.get $l5369 + i32.add + local.set $l5370 + local.get $l5369 + local.get $l5370 + i32.add + local.set $l5371 + local.get $l5370 + local.get $l5371 + i32.add + local.set $l5372 + local.get $l5371 + local.get $l5372 + i32.add + local.set $l5373 + local.get $l5372 + local.get $l5373 + i32.add + local.set $l5374 + local.get $l5373 + local.get $l5374 + i32.add + local.set $l5375 + local.get $l5374 + local.get $l5375 + i32.add + local.set $l5376 + local.get $l5375 + local.get $l5376 + i32.add + local.set $l5377 + local.get $l5376 + local.get $l5377 + i32.add + local.set $l5378 + local.get $l5377 + local.get $l5378 + i32.add + local.set $l5379 + local.get $l5378 + local.get $l5379 + i32.add + local.set $l5380 + local.get $l5379 + local.get $l5380 + i32.add + local.set $l5381 + local.get $l5380 + local.get $l5381 + i32.add + local.set $l5382 + local.get $l5381 + local.get $l5382 + i32.add + local.set $l5383 + local.get $l5382 + local.get $l5383 + i32.add + local.set $l5384 + local.get $l5383 + local.get $l5384 + i32.add + local.set $l5385 + local.get $l5384 + local.get $l5385 + i32.add + local.set $l5386 + local.get $l5385 + local.get $l5386 + i32.add + local.set $l5387 + local.get $l5386 + local.get $l5387 + i32.add + local.set $l5388 + local.get $l5387 + local.get $l5388 + i32.add + local.set $l5389 + local.get $l5388 + local.get $l5389 + i32.add + local.set $l5390 + local.get $l5389 + local.get $l5390 + i32.add + local.set $l5391 + local.get $l5390 + local.get $l5391 + i32.add + local.set $l5392 + local.get $l5391 + local.get $l5392 + i32.add + local.set $l5393 + local.get $l5392 + local.get $l5393 + i32.add + local.set $l5394 + local.get $l5393 + local.get $l5394 + i32.add + local.set $l5395 + local.get $l5394 + local.get $l5395 + i32.add + local.set $l5396 + local.get $l5395 + local.get $l5396 + i32.add + local.set $l5397 + local.get $l5396 + local.get $l5397 + i32.add + local.set $l5398 + local.get $l5397 + local.get $l5398 + i32.add + local.set $l5399 + local.get $l5398 + local.get $l5399 + i32.add + local.set $l5400 + local.get $l5399 + local.get $l5400 + i32.add + local.set $l5401 + local.get $l5400 + local.get $l5401 + i32.add + local.set $l5402 + local.get $l5401 + local.get $l5402 + i32.add + local.set $l5403 + local.get $l5402 + local.get $l5403 + i32.add + local.set $l5404 + local.get $l5403 + local.get $l5404 + i32.add + local.set $l5405 + local.get $l5404 + local.get $l5405 + i32.add + local.set $l5406 + local.get $l5405 + local.get $l5406 + i32.add + local.set $l5407 + local.get $l5406 + local.get $l5407 + i32.add + local.set $l5408 + local.get $l5407 + local.get $l5408 + i32.add + local.set $l5409 + local.get $l5408 + local.get $l5409 + i32.add + local.set $l5410 + local.get $l5409 + local.get $l5410 + i32.add + local.set $l5411 + local.get $l5410 + local.get $l5411 + i32.add + local.set $l5412 + local.get $l5411 + local.get $l5412 + i32.add + local.set $l5413 + local.get $l5412 + local.get $l5413 + i32.add + local.set $l5414 + local.get $l5413 + local.get $l5414 + i32.add + local.set $l5415 + local.get $l5414 + local.get $l5415 + i32.add + local.set $l5416 + local.get $l5415 + local.get $l5416 + i32.add + local.set $l5417 + local.get $l5416 + local.get $l5417 + i32.add + local.set $l5418 + local.get $l5417 + local.get $l5418 + i32.add + local.set $l5419 + local.get $l5418 + local.get $l5419 + i32.add + local.set $l5420 + local.get $l5419 + local.get $l5420 + i32.add + local.set $l5421 + local.get $l5420 + local.get $l5421 + i32.add + local.set $l5422 + local.get $l5421 + local.get $l5422 + i32.add + local.set $l5423 + local.get $l5422 + local.get $l5423 + i32.add + local.set $l5424 + local.get $l5423 + local.get $l5424 + i32.add + local.set $l5425 + local.get $l5424 + local.get $l5425 + i32.add + local.set $l5426 + local.get $l5425 + local.get $l5426 + i32.add + local.set $l5427 + local.get $l5426 + local.get $l5427 + i32.add + local.set $l5428 + local.get $l5427 + local.get $l5428 + i32.add + local.set $l5429 + local.get $l5428 + local.get $l5429 + i32.add + local.set $l5430 + local.get $l5429 + local.get $l5430 + i32.add + local.set $l5431 + local.get $l5430 + local.get $l5431 + i32.add + local.set $l5432 + local.get $l5431 + local.get $l5432 + i32.add + local.set $l5433 + local.get $l5432 + local.get $l5433 + i32.add + local.set $l5434 + local.get $l5433 + local.get $l5434 + i32.add + local.set $l5435 + local.get $l5434 + local.get $l5435 + i32.add + local.set $l5436 + local.get $l5435 + local.get $l5436 + i32.add + local.set $l5437 + local.get $l5436 + local.get $l5437 + i32.add + local.set $l5438 + local.get $l5437 + local.get $l5438 + i32.add + local.set $l5439 + local.get $l5438 + local.get $l5439 + i32.add + local.set $l5440 + local.get $l5439 + local.get $l5440 + i32.add + local.set $l5441 + local.get $l5440 + local.get $l5441 + i32.add + local.set $l5442 + local.get $l5441 + local.get $l5442 + i32.add + local.set $l5443 + local.get $l5442 + local.get $l5443 + i32.add + local.set $l5444 + local.get $l5443 + local.get $l5444 + i32.add + local.set $l5445 + local.get $l5444 + local.get $l5445 + i32.add + local.set $l5446 + local.get $l5445 + local.get $l5446 + i32.add + local.set $l5447 + local.get $l5446 + local.get $l5447 + i32.add + local.set $l5448 + local.get $l5447 + local.get $l5448 + i32.add + local.set $l5449 + local.get $l5448 + local.get $l5449 + i32.add + local.set $l5450 + local.get $l5449 + local.get $l5450 + i32.add + local.set $l5451 + local.get $l5450 + local.get $l5451 + i32.add + local.set $l5452 + local.get $l5451 + local.get $l5452 + i32.add + local.set $l5453 + local.get $l5452 + local.get $l5453 + i32.add + local.set $l5454 + local.get $l5453 + local.get $l5454 + i32.add + local.set $l5455 + local.get $l5454 + local.get $l5455 + i32.add + local.set $l5456 + local.get $l5455 + local.get $l5456 + i32.add + local.set $l5457 + local.get $l5456 + local.get $l5457 + i32.add + local.set $l5458 + local.get $l5457 + local.get $l5458 + i32.add + local.set $l5459 + local.get $l5458 + local.get $l5459 + i32.add + local.set $l5460 + local.get $l5459 + local.get $l5460 + i32.add + local.set $l5461 + local.get $l5460 + local.get $l5461 + i32.add + local.set $l5462 + local.get $l5461 + local.get $l5462 + i32.add + local.set $l5463 + local.get $l5462 + local.get $l5463 + i32.add + local.set $l5464 + local.get $l5463 + local.get $l5464 + i32.add + local.set $l5465 + local.get $l5464 + local.get $l5465 + i32.add + local.set $l5466 + local.get $l5465 + local.get $l5466 + i32.add + local.set $l5467 + local.get $l5466 + local.get $l5467 + i32.add + local.set $l5468 + local.get $l5467 + local.get $l5468 + i32.add + local.set $l5469 + local.get $l5468 + local.get $l5469 + i32.add + local.set $l5470 + local.get $l5469 + local.get $l5470 + i32.add + local.set $l5471 + local.get $l5470 + local.get $l5471 + i32.add + local.set $l5472 + local.get $l5471 + local.get $l5472 + i32.add + local.set $l5473 + local.get $l5472 + local.get $l5473 + i32.add + local.set $l5474 + local.get $l5473 + local.get $l5474 + i32.add + local.set $l5475 + local.get $l5474 + local.get $l5475 + i32.add + local.set $l5476 + local.get $l5475 + local.get $l5476 + i32.add + local.set $l5477 + local.get $l5476 + local.get $l5477 + i32.add + local.set $l5478 + local.get $l5477 + local.get $l5478 + i32.add + local.set $l5479 + local.get $l5478 + local.get $l5479 + i32.add + local.set $l5480 + local.get $l5479 + local.get $l5480 + i32.add + local.set $l5481 + local.get $l5480 + local.get $l5481 + i32.add + local.set $l5482 + local.get $l5481 + local.get $l5482 + i32.add + local.set $l5483 + local.get $l5482 + local.get $l5483 + i32.add + local.set $l5484 + local.get $l5483 + local.get $l5484 + i32.add + local.set $l5485 + local.get $l5484 + local.get $l5485 + i32.add + local.set $l5486 + local.get $l5485 + local.get $l5486 + i32.add + local.set $l5487 + local.get $l5486 + local.get $l5487 + i32.add + local.set $l5488 + local.get $l5487 + local.get $l5488 + i32.add + local.set $l5489 + local.get $l5488 + local.get $l5489 + i32.add + local.set $l5490 + local.get $l5489 + local.get $l5490 + i32.add + local.set $l5491 + local.get $l5490 + local.get $l5491 + i32.add + local.set $l5492 + local.get $l5491 + local.get $l5492 + i32.add + local.set $l5493 + local.get $l5492 + local.get $l5493 + i32.add + local.set $l5494 + local.get $l5493 + local.get $l5494 + i32.add + local.set $l5495 + local.get $l5494 + local.get $l5495 + i32.add + local.set $l5496 + local.get $l5495 + local.get $l5496 + i32.add + local.set $l5497 + local.get $l5496 + local.get $l5497 + i32.add + local.set $l5498 + local.get $l5497 + local.get $l5498 + i32.add + local.set $l5499 + local.get $l5498 + local.get $l5499 + i32.add + local.set $l5500 + local.get $l5499 + local.get $l5500 + i32.add + local.set $l5501 + local.get $l5500 + local.get $l5501 + i32.add + local.set $l5502 + local.get $l5501 + local.get $l5502 + i32.add + local.set $l5503 + local.get $l5502 + local.get $l5503 + i32.add + local.set $l5504 + local.get $l5503 + local.get $l5504 + i32.add + local.set $l5505 + local.get $l5504 + local.get $l5505 + i32.add + local.set $l5506 + local.get $l5505 + local.get $l5506 + i32.add + local.set $l5507 + local.get $l5506 + local.get $l5507 + i32.add + local.set $l5508 + local.get $l5507 + local.get $l5508 + i32.add + local.set $l5509 + local.get $l5508 + local.get $l5509 + i32.add + local.set $l5510 + local.get $l5509 + local.get $l5510 + i32.add + local.set $l5511 + local.get $l5510 + local.get $l5511 + i32.add + local.set $l5512 + local.get $l5511 + local.get $l5512 + i32.add + local.set $l5513 + local.get $l5512 + local.get $l5513 + i32.add + local.set $l5514 + local.get $l5513 + local.get $l5514 + i32.add + local.set $l5515 + local.get $l5514 + local.get $l5515 + i32.add + local.set $l5516 + local.get $l5515 + local.get $l5516 + i32.add + local.set $l5517 + local.get $l5516 + local.get $l5517 + i32.add + local.set $l5518 + local.get $l5517 + local.get $l5518 + i32.add + local.set $l5519 + local.get $l5518 + local.get $l5519 + i32.add + local.set $l5520 + local.get $l5519 + local.get $l5520 + i32.add + local.set $l5521 + local.get $l5520 + local.get $l5521 + i32.add + local.set $l5522 + local.get $l5521 + local.get $l5522 + i32.add + local.set $l5523 + local.get $l5522 + local.get $l5523 + i32.add + local.set $l5524 + local.get $l5523 + local.get $l5524 + i32.add + local.set $l5525 + local.get $l5524 + local.get $l5525 + i32.add + local.set $l5526 + local.get $l5525 + local.get $l5526 + i32.add + local.set $l5527 + local.get $l5526 + local.get $l5527 + i32.add + local.set $l5528 + local.get $l5527 + local.get $l5528 + i32.add + local.set $l5529 + local.get $l5528 + local.get $l5529 + i32.add + local.set $l5530 + local.get $l5529 + local.get $l5530 + i32.add + local.set $l5531 + local.get $l5530 + local.get $l5531 + i32.add + local.set $l5532 + local.get $l5531 + local.get $l5532 + i32.add + local.set $l5533 + local.get $l5532 + local.get $l5533 + i32.add + local.set $l5534 + local.get $l5533 + local.get $l5534 + i32.add + local.set $l5535 + local.get $l5534 + local.get $l5535 + i32.add + local.set $l5536 + local.get $l5535 + local.get $l5536 + i32.add + local.set $l5537 + local.get $l5536 + local.get $l5537 + i32.add + local.set $l5538 + local.get $l5537 + local.get $l5538 + i32.add + local.set $l5539 + local.get $l5538 + local.get $l5539 + i32.add + local.set $l5540 + local.get $l5539 + local.get $l5540 + i32.add + local.set $l5541 + local.get $l5540 + local.get $l5541 + i32.add + local.set $l5542 + local.get $l5541 + local.get $l5542 + i32.add + local.set $l5543 + local.get $l5542 + local.get $l5543 + i32.add + local.set $l5544 + local.get $l5543 + local.get $l5544 + i32.add + local.set $l5545 + local.get $l5544 + local.get $l5545 + i32.add + local.set $l5546 + local.get $l5545 + local.get $l5546 + i32.add + local.set $l5547 + local.get $l5546 + local.get $l5547 + i32.add + local.set $l5548 + local.get $l5547 + local.get $l5548 + i32.add + local.set $l5549 + local.get $l5548 + local.get $l5549 + i32.add + local.set $l5550 + local.get $l5549 + local.get $l5550 + i32.add + local.set $l5551 + local.get $l5550 + local.get $l5551 + i32.add + local.set $l5552 + local.get $l5551 + local.get $l5552 + i32.add + local.set $l5553 + local.get $l5552 + local.get $l5553 + i32.add + local.set $l5554 + local.get $l5553 + local.get $l5554 + i32.add + local.set $l5555 + local.get $l5554 + local.get $l5555 + i32.add + local.set $l5556 + local.get $l5555 + local.get $l5556 + i32.add + local.set $l5557 + local.get $l5556 + local.get $l5557 + i32.add + local.set $l5558 + local.get $l5557 + local.get $l5558 + i32.add + local.set $l5559 + local.get $l5558 + local.get $l5559 + i32.add + local.set $l5560 + local.get $l5559 + local.get $l5560 + i32.add + local.set $l5561 + local.get $l5560 + local.get $l5561 + i32.add + local.set $l5562 + local.get $l5561 + local.get $l5562 + i32.add + local.set $l5563 + local.get $l5562 + local.get $l5563 + i32.add + local.set $l5564 + local.get $l5563 + local.get $l5564 + i32.add + local.set $l5565 + local.get $l5564 + local.get $l5565 + i32.add + local.set $l5566 + local.get $l5565 + local.get $l5566 + i32.add + local.set $l5567 + local.get $l5566 + local.get $l5567 + i32.add + local.set $l5568 + local.get $l5567 + local.get $l5568 + i32.add + local.set $l5569 + local.get $l5568 + local.get $l5569 + i32.add + local.set $l5570 + local.get $l5569 + local.get $l5570 + i32.add + local.set $l5571 + local.get $l5570 + local.get $l5571 + i32.add + local.set $l5572 + local.get $l5571 + local.get $l5572 + i32.add + local.set $l5573 + local.get $l5572 + local.get $l5573 + i32.add + local.set $l5574 + local.get $l5573 + local.get $l5574 + i32.add + local.set $l5575 + local.get $l5574 + local.get $l5575 + i32.add + local.set $l5576 + local.get $l5575 + local.get $l5576 + i32.add + local.set $l5577 + local.get $l5576 + local.get $l5577 + i32.add + local.set $l5578 + local.get $l5577 + local.get $l5578 + i32.add + local.set $l5579 + local.get $l5578 + local.get $l5579 + i32.add + local.set $l5580 + local.get $l5579 + local.get $l5580 + i32.add + local.set $l5581 + local.get $l5580 + local.get $l5581 + i32.add + local.set $l5582 + local.get $l5581 + local.get $l5582 + i32.add + local.set $l5583 + local.get $l5582 + local.get $l5583 + i32.add + local.set $l5584 + local.get $l5583 + local.get $l5584 + i32.add + local.set $l5585 + local.get $l5584 + local.get $l5585 + i32.add + local.set $l5586 + local.get $l5585 + local.get $l5586 + i32.add + local.set $l5587 + local.get $l5586 + local.get $l5587 + i32.add + local.set $l5588 + local.get $l5587 + local.get $l5588 + i32.add + local.set $l5589 + local.get $l5588 + local.get $l5589 + i32.add + local.set $l5590 + local.get $l5589 + local.get $l5590 + i32.add + local.set $l5591 + local.get $l5590 + local.get $l5591 + i32.add + local.set $l5592 + local.get $l5591 + local.get $l5592 + i32.add + local.set $l5593 + local.get $l5592 + local.get $l5593 + i32.add + local.set $l5594 + local.get $l5593 + local.get $l5594 + i32.add + local.set $l5595 + local.get $l5594 + local.get $l5595 + i32.add + local.set $l5596 + local.get $l5595 + local.get $l5596 + i32.add + local.set $l5597 + local.get $l5596 + local.get $l5597 + i32.add + local.set $l5598 + local.get $l5597 + local.get $l5598 + i32.add + local.set $l5599 + local.get $l5598 + local.get $l5599 + i32.add + local.set $l5600 + local.get $l5599 + local.get $l5600 + i32.add + local.set $l5601 + local.get $l5600 + local.get $l5601 + i32.add + local.set $l5602 + local.get $l5601 + local.get $l5602 + i32.add + local.set $l5603 + local.get $l5602 + local.get $l5603 + i32.add + local.set $l5604 + local.get $l5603 + local.get $l5604 + i32.add + local.set $l5605 + local.get $l5604 + local.get $l5605 + i32.add + local.set $l5606 + local.get $l5605 + local.get $l5606 + i32.add + local.set $l5607 + local.get $l5606 + local.get $l5607 + i32.add + local.set $l5608 + local.get $l5607 + local.get $l5608 + i32.add + local.set $l5609 + local.get $l5608 + local.get $l5609 + i32.add + local.set $l5610 + local.get $l5609 + local.get $l5610 + i32.add + local.set $l5611 + local.get $l5610 + local.get $l5611 + i32.add + local.set $l5612 + local.get $l5611 + local.get $l5612 + i32.add + local.set $l5613 + local.get $l5612 + local.get $l5613 + i32.add + local.set $l5614 + local.get $l5613 + local.get $l5614 + i32.add + local.set $l5615 + local.get $l5614 + local.get $l5615 + i32.add + local.set $l5616 + local.get $l5615 + local.get $l5616 + i32.add + local.set $l5617 + local.get $l5616 + local.get $l5617 + i32.add + local.set $l5618 + local.get $l5617 + local.get $l5618 + i32.add + local.set $l5619 + local.get $l5618 + local.get $l5619 + i32.add + local.set $l5620 + local.get $l5619 + local.get $l5620 + i32.add + local.set $l5621 + local.get $l5620 + local.get $l5621 + i32.add + local.set $l5622 + local.get $l5621 + local.get $l5622 + i32.add + local.set $l5623 + local.get $l5622 + local.get $l5623 + i32.add + local.set $l5624 + local.get $l5623 + local.get $l5624 + i32.add + local.set $l5625 + local.get $l5624 + local.get $l5625 + i32.add + local.set $l5626 + local.get $l5625 + local.get $l5626 + i32.add + local.set $l5627 + local.get $l5626 + local.get $l5627 + i32.add + local.set $l5628 + local.get $l5627 + local.get $l5628 + i32.add + local.set $l5629 + local.get $l5628 + local.get $l5629 + i32.add + local.set $l5630 + local.get $l5629 + local.get $l5630 + i32.add + local.set $l5631 + local.get $l5630 + local.get $l5631 + i32.add + local.set $l5632 + local.get $l5631 + local.get $l5632 + i32.add + local.set $l5633 + local.get $l5632 + local.get $l5633 + i32.add + local.set $l5634 + local.get $l5633 + local.get $l5634 + i32.add + local.set $l5635 + local.get $l5634 + local.get $l5635 + i32.add + local.set $l5636 + local.get $l5635 + local.get $l5636 + i32.add + local.set $l5637 + local.get $l5636 + local.get $l5637 + i32.add + local.set $l5638 + local.get $l5637 + local.get $l5638 + i32.add + local.set $l5639 + local.get $l5638 + local.get $l5639 + i32.add + local.set $l5640 + local.get $l5639 + local.get $l5640 + i32.add + local.set $l5641 + local.get $l5640 + local.get $l5641 + i32.add + local.set $l5642 + local.get $l5641 + local.get $l5642 + i32.add + local.set $l5643 + local.get $l5642 + local.get $l5643 + i32.add + local.set $l5644 + local.get $l5643 + local.get $l5644 + i32.add + local.set $l5645 + local.get $l5644 + local.get $l5645 + i32.add + local.set $l5646 + local.get $l5645 + local.get $l5646 + i32.add + local.set $l5647 + local.get $l5646 + local.get $l5647 + i32.add + local.set $l5648 + local.get $l5647 + local.get $l5648 + i32.add + local.set $l5649 + local.get $l5648 + local.get $l5649 + i32.add + local.set $l5650 + local.get $l5649 + local.get $l5650 + i32.add + local.set $l5651 + local.get $l5650 + local.get $l5651 + i32.add + local.set $l5652 + local.get $l5651 + local.get $l5652 + i32.add + local.set $l5653 + local.get $l5652 + local.get $l5653 + i32.add + local.set $l5654 + local.get $l5653 + local.get $l5654 + i32.add + local.set $l5655 + local.get $l5654 + local.get $l5655 + i32.add + local.set $l5656 + local.get $l5655 + local.get $l5656 + i32.add + local.set $l5657 + local.get $l5656 + local.get $l5657 + i32.add + local.set $l5658 + local.get $l5657 + local.get $l5658 + i32.add + local.set $l5659 + local.get $l5658 + local.get $l5659 + i32.add + local.set $l5660 + local.get $l5659 + local.get $l5660 + i32.add + local.set $l5661 + local.get $l5660 + local.get $l5661 + i32.add + local.set $l5662 + local.get $l5661 + local.get $l5662 + i32.add + local.set $l5663 + local.get $l5662 + local.get $l5663 + i32.add + local.set $l5664 + local.get $l5663 + local.get $l5664 + i32.add + local.set $l5665 + local.get $l5664 + local.get $l5665 + i32.add + local.set $l5666 + local.get $l5665 + local.get $l5666 + i32.add + local.set $l5667 + local.get $l5666 + local.get $l5667 + i32.add + local.set $l5668 + local.get $l5667 + local.get $l5668 + i32.add + local.set $l5669 + local.get $l5668 + local.get $l5669 + i32.add + local.set $l5670 + local.get $l5669 + local.get $l5670 + i32.add + local.set $l5671 + local.get $l5670 + local.get $l5671 + i32.add + local.set $l5672 + local.get $l5671 + local.get $l5672 + i32.add + local.set $l5673 + local.get $l5672 + local.get $l5673 + i32.add + local.set $l5674 + local.get $l5673 + local.get $l5674 + i32.add + local.set $l5675 + local.get $l5674 + local.get $l5675 + i32.add + local.set $l5676 + local.get $l5675 + local.get $l5676 + i32.add + local.set $l5677 + local.get $l5676 + local.get $l5677 + i32.add + local.set $l5678 + local.get $l5677 + local.get $l5678 + i32.add + local.set $l5679 + local.get $l5678 + local.get $l5679 + i32.add + local.set $l5680 + local.get $l5679 + local.get $l5680 + i32.add + local.set $l5681 + local.get $l5680 + local.get $l5681 + i32.add + local.set $l5682 + local.get $l5681 + local.get $l5682 + i32.add + local.set $l5683 + local.get $l5682 + local.get $l5683 + i32.add + local.set $l5684 + local.get $l5683 + local.get $l5684 + i32.add + local.set $l5685 + local.get $l5684 + local.get $l5685 + i32.add + local.set $l5686 + local.get $l5685 + local.get $l5686 + i32.add + local.set $l5687 + local.get $l5686 + local.get $l5687 + i32.add + local.set $l5688 + local.get $l5687 + local.get $l5688 + i32.add + local.set $l5689 + local.get $l5688 + local.get $l5689 + i32.add + local.set $l5690 + local.get $l5689 + local.get $l5690 + i32.add + local.set $l5691 + local.get $l5690 + local.get $l5691 + i32.add + local.set $l5692 + local.get $l5691 + local.get $l5692 + i32.add + local.set $l5693 + local.get $l5692 + local.get $l5693 + i32.add + local.set $l5694 + local.get $l5693 + local.get $l5694 + i32.add + local.set $l5695 + local.get $l5694 + local.get $l5695 + i32.add + local.set $l5696 + local.get $l5695 + local.get $l5696 + i32.add + local.set $l5697 + local.get $l5696 + local.get $l5697 + i32.add + local.set $l5698 + local.get $l5697 + local.get $l5698 + i32.add + local.set $l5699 + local.get $l5698 + local.get $l5699 + i32.add + local.set $l5700 + local.get $l5699 + local.get $l5700 + i32.add + local.set $l5701 + local.get $l5700 + local.get $l5701 + i32.add + local.set $l5702 + local.get $l5701 + local.get $l5702 + i32.add + local.set $l5703 + local.get $l5702 + local.get $l5703 + i32.add + local.set $l5704 + local.get $l5703 + local.get $l5704 + i32.add + local.set $l5705 + local.get $l5704 + local.get $l5705 + i32.add + local.set $l5706 + local.get $l5705 + local.get $l5706 + i32.add + local.set $l5707 + local.get $l5706 + local.get $l5707 + i32.add + local.set $l5708 + local.get $l5707 + local.get $l5708 + i32.add + local.set $l5709 + local.get $l5708 + local.get $l5709 + i32.add + local.set $l5710 + local.get $l5709 + local.get $l5710 + i32.add + local.set $l5711 + local.get $l5710 + local.get $l5711 + i32.add + local.set $l5712 + local.get $l5711 + local.get $l5712 + i32.add + local.set $l5713 + local.get $l5712 + local.get $l5713 + i32.add + local.set $l5714 + local.get $l5713 + local.get $l5714 + i32.add + local.set $l5715 + local.get $l5714 + local.get $l5715 + i32.add + local.set $l5716 + local.get $l5715 + local.get $l5716 + i32.add + local.set $l5717 + local.get $l5716 + local.get $l5717 + i32.add + local.set $l5718 + local.get $l5717 + local.get $l5718 + i32.add + local.set $l5719 + local.get $l5718 + local.get $l5719 + i32.add + local.set $l5720 + local.get $l5719 + local.get $l5720 + i32.add + local.set $l5721 + local.get $l5720 + local.get $l5721 + i32.add + local.set $l5722 + local.get $l5721 + local.get $l5722 + i32.add + local.set $l5723 + local.get $l5722 + local.get $l5723 + i32.add + local.set $l5724 + local.get $l5723 + local.get $l5724 + i32.add + local.set $l5725 + local.get $l5724 + local.get $l5725 + i32.add + local.set $l5726 + local.get $l5725 + local.get $l5726 + i32.add + local.set $l5727 + local.get $l5726 + local.get $l5727 + i32.add + local.set $l5728 + local.get $l5727 + local.get $l5728 + i32.add + local.set $l5729 + local.get $l5728 + local.get $l5729 + i32.add + local.set $l5730 + local.get $l5729 + local.get $l5730 + i32.add + local.set $l5731 + local.get $l5730 + local.get $l5731 + i32.add + local.set $l5732 + local.get $l5731 + local.get $l5732 + i32.add + local.set $l5733 + local.get $l5732 + local.get $l5733 + i32.add + local.set $l5734 + local.get $l5733 + local.get $l5734 + i32.add + local.set $l5735 + local.get $l5734 + local.get $l5735 + i32.add + local.set $l5736 + local.get $l5735 + local.get $l5736 + i32.add + local.set $l5737 + local.get $l5736 + local.get $l5737 + i32.add + local.set $l5738 + local.get $l5737 + local.get $l5738 + i32.add + local.set $l5739 + local.get $l5738 + local.get $l5739 + i32.add + local.set $l5740 + local.get $l5739 + local.get $l5740 + i32.add + local.set $l5741 + local.get $l5740 + local.get $l5741 + i32.add + local.set $l5742 + local.get $l5741 + local.get $l5742 + i32.add + local.set $l5743 + local.get $l5742 + local.get $l5743 + i32.add + local.set $l5744 + local.get $l5743 + local.get $l5744 + i32.add + local.set $l5745 + local.get $l5744 + local.get $l5745 + i32.add + local.set $l5746 + local.get $l5745 + local.get $l5746 + i32.add + local.set $l5747 + local.get $l5746 + local.get $l5747 + i32.add + local.set $l5748 + local.get $l5747 + local.get $l5748 + i32.add + local.set $l5749 + local.get $l5748 + local.get $l5749 + i32.add + local.set $l5750 + local.get $l5749 + local.get $l5750 + i32.add + local.set $l5751 + local.get $l5750 + local.get $l5751 + i32.add + local.set $l5752 + local.get $l5751 + local.get $l5752 + i32.add + local.set $l5753 + local.get $l5752 + local.get $l5753 + i32.add + local.set $l5754 + local.get $l5753 + local.get $l5754 + i32.add + local.set $l5755 + local.get $l5754 + local.get $l5755 + i32.add + local.set $l5756 + local.get $l5755 + local.get $l5756 + i32.add + local.set $l5757 + local.get $l5756 + local.get $l5757 + i32.add + local.set $l5758 + local.get $l5757 + local.get $l5758 + i32.add + local.set $l5759 + local.get $l5758 + local.get $l5759 + i32.add + local.set $l5760 + local.get $l5759 + local.get $l5760 + i32.add + local.set $l5761 + local.get $l5760 + local.get $l5761 + i32.add + local.set $l5762 + local.get $l5761 + local.get $l5762 + i32.add + local.set $l5763 + local.get $l5762 + local.get $l5763 + i32.add + local.set $l5764 + local.get $l5763 + local.get $l5764 + i32.add + local.set $l5765 + local.get $l5764 + local.get $l5765 + i32.add + local.set $l5766 + local.get $l5765 + local.get $l5766 + i32.add + local.set $l5767 + local.get $l5766 + local.get $l5767 + i32.add + local.set $l5768 + local.get $l5767 + local.get $l5768 + i32.add + local.set $l5769 + local.get $l5768 + local.get $l5769 + i32.add + local.set $l5770 + local.get $l5769 + local.get $l5770 + i32.add + local.set $l5771 + local.get $l5770 + local.get $l5771 + i32.add + local.set $l5772 + local.get $l5771 + local.get $l5772 + i32.add + local.set $l5773 + local.get $l5772 + local.get $l5773 + i32.add + local.set $l5774 + local.get $l5773 + local.get $l5774 + i32.add + local.set $l5775 + local.get $l5774 + local.get $l5775 + i32.add + local.set $l5776 + local.get $l5775 + local.get $l5776 + i32.add + local.set $l5777 + local.get $l5776 + local.get $l5777 + i32.add + local.set $l5778 + local.get $l5777 + local.get $l5778 + i32.add + local.set $l5779 + local.get $l5778 + local.get $l5779 + i32.add + local.set $l5780 + local.get $l5779 + local.get $l5780 + i32.add + local.set $l5781 + local.get $l5780 + local.get $l5781 + i32.add + local.set $l5782 + local.get $l5781 + local.get $l5782 + i32.add + local.set $l5783 + local.get $l5782 + local.get $l5783 + i32.add + local.set $l5784 + local.get $l5783 + local.get $l5784 + i32.add + local.set $l5785 + local.get $l5784 + local.get $l5785 + i32.add + local.set $l5786 + local.get $l5785 + local.get $l5786 + i32.add + local.set $l5787 + local.get $l5786 + local.get $l5787 + i32.add + local.set $l5788 + local.get $l5787 + local.get $l5788 + i32.add + local.set $l5789 + local.get $l5788 + local.get $l5789 + i32.add + local.set $l5790 + local.get $l5789 + local.get $l5790 + i32.add + local.set $l5791 + local.get $l5790 + local.get $l5791 + i32.add + local.set $l5792 + local.get $l5791 + local.get $l5792 + i32.add + local.set $l5793 + local.get $l5792 + local.get $l5793 + i32.add + local.set $l5794 + local.get $l5793 + local.get $l5794 + i32.add + local.set $l5795 + local.get $l5794 + local.get $l5795 + i32.add + local.set $l5796 + local.get $l5795 + local.get $l5796 + i32.add + local.set $l5797 + local.get $l5796 + local.get $l5797 + i32.add + local.set $l5798 + local.get $l5797 + local.get $l5798 + i32.add + local.set $l5799 + local.get $l5798 + local.get $l5799 + i32.add + local.set $l5800 + local.get $l5799 + local.get $l5800 + i32.add + local.set $l5801 + local.get $l5800 + local.get $l5801 + i32.add + local.set $l5802 + local.get $l5801 + local.get $l5802 + i32.add + local.set $l5803 + local.get $l5802 + local.get $l5803 + i32.add + local.set $l5804 + local.get $l5803 + local.get $l5804 + i32.add + local.set $l5805 + local.get $l5804 + local.get $l5805 + i32.add + local.set $l5806 + local.get $l5805 + local.get $l5806 + i32.add + local.set $l5807 + local.get $l5806 + local.get $l5807 + i32.add + local.set $l5808 + local.get $l5807 + local.get $l5808 + i32.add + local.set $l5809 + local.get $l5808 + local.get $l5809 + i32.add + local.set $l5810 + local.get $l5809 + local.get $l5810 + i32.add + local.set $l5811 + local.get $l5810 + local.get $l5811 + i32.add + local.set $l5812 + local.get $l5811 + local.get $l5812 + i32.add + local.set $l5813 + local.get $l5812 + local.get $l5813 + i32.add + local.set $l5814 + local.get $l5813 + local.get $l5814 + i32.add + local.set $l5815 + local.get $l5814 + local.get $l5815 + i32.add + local.set $l5816 + local.get $l5815 + local.get $l5816 + i32.add + local.set $l5817 + local.get $l5816 + local.get $l5817 + i32.add + local.set $l5818 + local.get $l5817 + local.get $l5818 + i32.add + local.set $l5819 + local.get $l5818 + local.get $l5819 + i32.add + local.set $l5820 + local.get $l5819 + local.get $l5820 + i32.add + local.set $l5821 + local.get $l5820 + local.get $l5821 + i32.add + local.set $l5822 + local.get $l5821 + local.get $l5822 + i32.add + local.set $l5823 + local.get $l5822 + local.get $l5823 + i32.add + local.set $l5824 + local.get $l5823 + local.get $l5824 + i32.add + local.set $l5825 + local.get $l5824 + local.get $l5825 + i32.add + local.set $l5826 + local.get $l5825 + local.get $l5826 + i32.add + local.set $l5827 + local.get $l5826 + local.get $l5827 + i32.add + local.set $l5828 + local.get $l5827 + local.get $l5828 + i32.add + local.set $l5829 + local.get $l5828 + local.get $l5829 + i32.add + local.set $l5830 + local.get $l5829 + local.get $l5830 + i32.add + local.set $l5831 + local.get $l5830 + local.get $l5831 + i32.add + local.set $l5832 + local.get $l5831 + local.get $l5832 + i32.add + local.set $l5833 + local.get $l5832 + local.get $l5833 + i32.add + local.set $l5834 + local.get $l5833 + local.get $l5834 + i32.add + local.set $l5835 + local.get $l5834 + local.get $l5835 + i32.add + local.set $l5836 + local.get $l5835 + local.get $l5836 + i32.add + local.set $l5837 + local.get $l5836 + local.get $l5837 + i32.add + local.set $l5838 + local.get $l5837 + local.get $l5838 + i32.add + local.set $l5839 + local.get $l5838 + local.get $l5839 + i32.add + local.set $l5840 + local.get $l5839 + local.get $l5840 + i32.add + local.set $l5841 + local.get $l5840 + local.get $l5841 + i32.add + local.set $l5842 + local.get $l5841 + local.get $l5842 + i32.add + local.set $l5843 + local.get $l5842 + local.get $l5843 + i32.add + local.set $l5844 + local.get $l5843 + local.get $l5844 + i32.add + local.set $l5845 + local.get $l5844 + local.get $l5845 + i32.add + local.set $l5846 + local.get $l5845 + local.get $l5846 + i32.add + local.set $l5847 + local.get $l5846 + local.get $l5847 + i32.add + local.set $l5848 + local.get $l5847 + local.get $l5848 + i32.add + local.set $l5849 + local.get $l5848 + local.get $l5849 + i32.add + local.set $l5850 + local.get $l5849 + local.get $l5850 + i32.add + local.set $l5851 + local.get $l5850 + local.get $l5851 + i32.add + local.set $l5852 + local.get $l5851 + local.get $l5852 + i32.add + local.set $l5853 + local.get $l5852 + local.get $l5853 + i32.add + local.set $l5854 + local.get $l5853 + local.get $l5854 + i32.add + local.set $l5855 + local.get $l5854 + local.get $l5855 + i32.add + local.set $l5856 + local.get $l5855 + local.get $l5856 + i32.add + local.set $l5857 + local.get $l5856 + local.get $l5857 + i32.add + local.set $l5858 + local.get $l5857 + local.get $l5858 + i32.add + local.set $l5859 + local.get $l5858 + local.get $l5859 + i32.add + local.set $l5860 + local.get $l5859 + local.get $l5860 + i32.add + local.set $l5861 + local.get $l5860 + local.get $l5861 + i32.add + local.set $l5862 + local.get $l5861 + local.get $l5862 + i32.add + local.set $l5863 + local.get $l5862 + local.get $l5863 + i32.add + local.set $l5864 + local.get $l5863 + local.get $l5864 + i32.add + local.set $l5865 + local.get $l5864 + local.get $l5865 + i32.add + local.set $l5866 + local.get $l5865 + local.get $l5866 + i32.add + local.set $l5867 + local.get $l5866 + local.get $l5867 + i32.add + local.set $l5868 + local.get $l5867 + local.get $l5868 + i32.add + local.set $l5869 + local.get $l5868 + local.get $l5869 + i32.add + local.set $l5870 + local.get $l5869 + local.get $l5870 + i32.add + local.set $l5871 + local.get $l5870 + local.get $l5871 + i32.add + local.set $l5872 + local.get $l5871 + local.get $l5872 + i32.add + local.set $l5873 + local.get $l5872 + local.get $l5873 + i32.add + local.set $l5874 + local.get $l5873 + local.get $l5874 + i32.add + local.set $l5875 + local.get $l5874 + local.get $l5875 + i32.add + local.set $l5876 + local.get $l5875 + local.get $l5876 + i32.add + local.set $l5877 + local.get $l5876 + local.get $l5877 + i32.add + local.set $l5878 + local.get $l5877 + local.get $l5878 + i32.add + local.set $l5879 + local.get $l5878 + local.get $l5879 + i32.add + local.set $l5880 + local.get $l5879 + local.get $l5880 + i32.add + local.set $l5881 + local.get $l5880 + local.get $l5881 + i32.add + local.set $l5882 + local.get $l5881 + local.get $l5882 + i32.add + local.set $l5883 + local.get $l5882 + local.get $l5883 + i32.add + local.set $l5884 + local.get $l5883 + local.get $l5884 + i32.add + local.set $l5885 + local.get $l5884 + local.get $l5885 + i32.add + local.set $l5886 + local.get $l5885 + local.get $l5886 + i32.add + local.set $l5887 + local.get $l5886 + local.get $l5887 + i32.add + local.set $l5888 + local.get $l5887 + local.get $l5888 + i32.add + local.set $l5889 + local.get $l5888 + local.get $l5889 + i32.add + local.set $l5890 + local.get $l5889 + local.get $l5890 + i32.add + local.set $l5891 + local.get $l5890 + local.get $l5891 + i32.add + local.set $l5892 + local.get $l5891 + local.get $l5892 + i32.add + local.set $l5893 + local.get $l5892 + local.get $l5893 + i32.add + local.set $l5894 + local.get $l5893 + local.get $l5894 + i32.add + local.set $l5895 + local.get $l5894 + local.get $l5895 + i32.add + local.set $l5896 + local.get $l5895 + local.get $l5896 + i32.add + local.set $l5897 + local.get $l5896 + local.get $l5897 + i32.add + local.set $l5898 + local.get $l5897 + local.get $l5898 + i32.add + local.set $l5899 + local.get $l5898 + local.get $l5899 + i32.add + local.set $l5900 + local.get $l5899 + local.get $l5900 + i32.add + local.set $l5901 + local.get $l5900 + local.get $l5901 + i32.add + local.set $l5902 + local.get $l5901 + local.get $l5902 + i32.add + local.set $l5903 + local.get $l5902 + local.get $l5903 + i32.add + local.set $l5904 + local.get $l5903 + local.get $l5904 + i32.add + local.set $l5905 + local.get $l5904 + local.get $l5905 + i32.add + local.set $l5906 + local.get $l5905 + local.get $l5906 + i32.add + local.set $l5907 + local.get $l5906 + local.get $l5907 + i32.add + local.set $l5908 + local.get $l5907 + local.get $l5908 + i32.add + local.set $l5909 + local.get $l5908 + local.get $l5909 + i32.add + local.set $l5910 + local.get $l5909 + local.get $l5910 + i32.add + local.set $l5911 + local.get $l5910 + local.get $l5911 + i32.add + local.set $l5912 + local.get $l5911 + local.get $l5912 + i32.add + local.set $l5913 + local.get $l5912 + local.get $l5913 + i32.add + local.set $l5914 + local.get $l5913 + local.get $l5914 + i32.add + local.set $l5915 + local.get $l5914 + local.get $l5915 + i32.add + local.set $l5916 + local.get $l5915 + local.get $l5916 + i32.add + local.set $l5917 + local.get $l5916 + local.get $l5917 + i32.add + local.set $l5918 + local.get $l5917 + local.get $l5918 + i32.add + local.set $l5919 + local.get $l5918 + local.get $l5919 + i32.add + local.set $l5920 + local.get $l5919 + local.get $l5920 + i32.add + local.set $l5921 + local.get $l5920 + local.get $l5921 + i32.add + local.set $l5922 + local.get $l5921 + local.get $l5922 + i32.add + local.set $l5923 + local.get $l5922 + local.get $l5923 + i32.add + local.set $l5924 + local.get $l5923 + local.get $l5924 + i32.add + local.set $l5925 + local.get $l5924 + local.get $l5925 + i32.add + local.set $l5926 + local.get $l5925 + local.get $l5926 + i32.add + local.set $l5927 + local.get $l5926 + local.get $l5927 + i32.add + local.set $l5928 + local.get $l5927 + local.get $l5928 + i32.add + local.set $l5929 + local.get $l5928 + local.get $l5929 + i32.add + local.set $l5930 + local.get $l5929 + local.get $l5930 + i32.add + local.set $l5931 + local.get $l5930 + local.get $l5931 + i32.add + local.set $l5932 + local.get $l5931 + local.get $l5932 + i32.add + local.set $l5933 + local.get $l5932 + local.get $l5933 + i32.add + local.set $l5934 + local.get $l5933 + local.get $l5934 + i32.add + local.set $l5935 + local.get $l5934 + local.get $l5935 + i32.add + local.set $l5936 + local.get $l5935 + local.get $l5936 + i32.add + local.set $l5937 + local.get $l5936 + local.get $l5937 + i32.add + local.set $l5938 + local.get $l5937 + local.get $l5938 + i32.add + local.set $l5939 + local.get $l5938 + local.get $l5939 + i32.add + local.set $l5940 + local.get $l5939 + local.get $l5940 + i32.add + local.set $l5941 + local.get $l5940 + local.get $l5941 + i32.add + local.set $l5942 + local.get $l5941 + local.get $l5942 + i32.add + local.set $l5943 + local.get $l5942 + local.get $l5943 + i32.add + local.set $l5944 + local.get $l5943 + local.get $l5944 + i32.add + local.set $l5945 + local.get $l5944 + local.get $l5945 + i32.add + local.set $l5946 + local.get $l5945 + local.get $l5946 + i32.add + local.set $l5947 + local.get $l5946 + local.get $l5947 + i32.add + local.set $l5948 + local.get $l5947 + local.get $l5948 + i32.add + local.set $l5949 + local.get $l5948 + local.get $l5949 + i32.add + local.set $l5950 + local.get $l5949 + local.get $l5950 + i32.add + local.set $l5951 + local.get $l5950 + local.get $l5951 + i32.add + local.set $l5952 + local.get $l5951 + local.get $l5952 + i32.add + local.set $l5953 + local.get $l5952 + local.get $l5953 + i32.add + local.set $l5954 + local.get $l5953 + local.get $l5954 + i32.add + local.set $l5955 + local.get $l5954 + local.get $l5955 + i32.add + local.set $l5956 + local.get $l5955 + local.get $l5956 + i32.add + local.set $l5957 + local.get $l5956 + local.get $l5957 + i32.add + local.set $l5958 + local.get $l5957 + local.get $l5958 + i32.add + local.set $l5959 + local.get $l5958 + local.get $l5959 + i32.add + local.set $l5960 + local.get $l5959 + local.get $l5960 + i32.add + local.set $l5961 + local.get $l5960 + local.get $l5961 + i32.add + local.set $l5962 + local.get $l5961 + local.get $l5962 + i32.add + local.set $l5963 + local.get $l5962 + local.get $l5963 + i32.add + local.set $l5964 + local.get $l5963 + local.get $l5964 + i32.add + local.set $l5965 + local.get $l5964 + local.get $l5965 + i32.add + local.set $l5966 + local.get $l5965 + local.get $l5966 + i32.add + local.set $l5967 + local.get $l5966 + local.get $l5967 + i32.add + local.set $l5968 + local.get $l5967 + local.get $l5968 + i32.add + local.set $l5969 + local.get $l5968 + local.get $l5969 + i32.add + local.set $l5970 + local.get $l5969 + local.get $l5970 + i32.add + local.set $l5971 + local.get $l5970 + local.get $l5971 + i32.add + local.set $l5972 + local.get $l5971 + local.get $l5972 + i32.add + local.set $l5973 + local.get $l5972 + local.get $l5973 + i32.add + local.set $l5974 + local.get $l5973 + local.get $l5974 + i32.add + local.set $l5975 + local.get $l5974 + local.get $l5975 + i32.add + local.set $l5976 + local.get $l5975 + local.get $l5976 + i32.add + local.set $l5977 + local.get $l5976 + local.get $l5977 + i32.add + local.set $l5978 + local.get $l5977 + local.get $l5978 + i32.add + local.set $l5979 + local.get $l5978 + local.get $l5979 + i32.add + local.set $l5980 + local.get $l5979 + local.get $l5980 + i32.add + local.set $l5981 + local.get $l5980 + local.get $l5981 + i32.add + local.set $l5982 + local.get $l5981 + local.get $l5982 + i32.add + local.set $l5983 + local.get $l5982 + local.get $l5983 + i32.add + local.set $l5984 + local.get $l5983 + local.get $l5984 + i32.add + local.set $l5985 + local.get $l5984 + local.get $l5985 + i32.add + local.set $l5986 + local.get $l5985 + local.get $l5986 + i32.add + local.set $l5987 + local.get $l5986 + local.get $l5987 + i32.add + local.set $l5988 + local.get $l5987 + local.get $l5988 + i32.add + local.set $l5989 + local.get $l5988 + local.get $l5989 + i32.add + local.set $l5990 + local.get $l5989 + local.get $l5990 + i32.add + local.set $l5991 + local.get $l5990 + local.get $l5991 + i32.add + local.set $l5992 + local.get $l5991 + local.get $l5992 + i32.add + local.set $l5993 + local.get $l5992 + local.get $l5993 + i32.add + local.set $l5994 + local.get $l5993 + local.get $l5994 + i32.add + local.set $l5995 + local.get $l5994 + local.get $l5995 + i32.add + local.set $l5996 + local.get $l5995 + local.get $l5996 + i32.add + local.set $l5997 + local.get $l5996 + local.get $l5997 + i32.add + local.set $l5998 + local.get $l5997 + local.get $l5998 + i32.add + local.set $l5999 + local.get $l5998 + local.get $l5999 + i32.add + local.set $l6000 + local.get $l5999 + local.get $l6000 + i32.add + local.set $l6001 + local.get $l6000 + local.get $l6001 + i32.add + local.set $l6002 + local.get $l6001 + local.get $l6002 + i32.add + local.set $l6003 + local.get $l6002 + local.get $l6003 + i32.add + local.set $l6004 + local.get $l6003 + local.get $l6004 + i32.add + local.set $l6005 + local.get $l6004 + local.get $l6005 + i32.add + local.set $l6006 + local.get $l6005 + local.get $l6006 + i32.add + local.set $l6007 + local.get $l6006 + local.get $l6007 + i32.add + local.set $l6008 + local.get $l6007 + local.get $l6008 + i32.add + local.set $l6009 + local.get $l6008 + local.get $l6009 + i32.add + local.set $l6010 + local.get $l6009 + local.get $l6010 + i32.add + local.set $l6011 + local.get $l6010 + local.get $l6011 + i32.add + local.set $l6012 + local.get $l6011 + local.get $l6012 + i32.add + local.set $l6013 + local.get $l6012 + local.get $l6013 + i32.add + local.set $l6014 + local.get $l6013 + local.get $l6014 + i32.add + local.set $l6015 + local.get $l6014 + local.get $l6015 + i32.add + local.set $l6016 + local.get $l6015 + local.get $l6016 + i32.add + local.set $l6017 + local.get $l6016 + local.get $l6017 + i32.add + local.set $l6018 + local.get $l6017 + local.get $l6018 + i32.add + local.set $l6019 + local.get $l6018 + local.get $l6019 + i32.add + local.set $l6020 + local.get $l6019 + local.get $l6020 + i32.add + local.set $l6021 + local.get $l6020 + local.get $l6021 + i32.add + local.set $l6022 + local.get $l6021 + local.get $l6022 + i32.add + local.set $l6023 + local.get $l6022 + local.get $l6023 + i32.add + local.set $l6024 + local.get $l6023 + local.get $l6024 + i32.add + local.set $l6025 + local.get $l6024 + local.get $l6025 + i32.add + local.set $l6026 + local.get $l6025 + local.get $l6026 + i32.add + local.set $l6027 + local.get $l6026 + local.get $l6027 + i32.add + local.set $l6028 + local.get $l6027 + local.get $l6028 + i32.add + local.set $l6029 + local.get $l6028 + local.get $l6029 + i32.add + local.set $l6030 + local.get $l6029 + local.get $l6030 + i32.add + local.set $l6031 + local.get $l6030 + local.get $l6031 + i32.add + local.set $l6032 + local.get $l6031 + local.get $l6032 + i32.add + local.set $l6033 + local.get $l6032 + local.get $l6033 + i32.add + local.set $l6034 + local.get $l6033 + local.get $l6034 + i32.add + local.set $l6035 + local.get $l6034 + local.get $l6035 + i32.add + local.set $l6036 + local.get $l6035 + local.get $l6036 + i32.add + local.set $l6037 + local.get $l6036 + local.get $l6037 + i32.add + local.set $l6038 + local.get $l6037 + local.get $l6038 + i32.add + local.set $l6039 + local.get $l6038 + local.get $l6039 + i32.add + local.set $l6040 + local.get $l6039 + local.get $l6040 + i32.add + local.set $l6041 + local.get $l6040 + local.get $l6041 + i32.add + local.set $l6042 + local.get $l6041 + local.get $l6042 + i32.add + local.set $l6043 + local.get $l6042 + local.get $l6043 + i32.add + local.set $l6044 + local.get $l6043 + local.get $l6044 + i32.add + local.set $l6045 + local.get $l6044 + local.get $l6045 + i32.add + local.set $l6046 + local.get $l6045 + local.get $l6046 + i32.add + local.set $l6047 + local.get $l6046 + local.get $l6047 + i32.add + local.set $l6048 + local.get $l6047 + local.get $l6048 + i32.add + local.set $l6049 + local.get $l6048 + local.get $l6049 + i32.add + local.set $l6050 + local.get $l6049 + local.get $l6050 + i32.add + local.set $l6051 + local.get $l6050 + local.get $l6051 + i32.add + local.set $l6052 + local.get $l6051 + local.get $l6052 + i32.add + local.set $l6053 + local.get $l6052 + local.get $l6053 + i32.add + local.set $l6054 + local.get $l6053 + local.get $l6054 + i32.add + local.set $l6055 + local.get $l6054 + local.get $l6055 + i32.add + local.set $l6056 + local.get $l6055 + local.get $l6056 + i32.add + local.set $l6057 + local.get $l6056 + local.get $l6057 + i32.add + local.set $l6058 + local.get $l6057 + local.get $l6058 + i32.add + local.set $l6059 + local.get $l6058 + local.get $l6059 + i32.add + local.set $l6060 + local.get $l6059 + local.get $l6060 + i32.add + local.set $l6061 + local.get $l6060 + local.get $l6061 + i32.add + local.set $l6062 + local.get $l6061 + local.get $l6062 + i32.add + local.set $l6063 + local.get $l6062 + local.get $l6063 + i32.add + local.set $l6064 + local.get $l6063 + local.get $l6064 + i32.add + local.set $l6065 + local.get $l6064 + local.get $l6065 + i32.add + local.set $l6066 + local.get $l6065 + local.get $l6066 + i32.add + local.set $l6067 + local.get $l6066 + local.get $l6067 + i32.add + local.set $l6068 + local.get $l6067 + local.get $l6068 + i32.add + local.set $l6069 + local.get $l6068 + local.get $l6069 + i32.add + local.set $l6070 + local.get $l6069 + local.get $l6070 + i32.add + local.set $l6071 + local.get $l6070 + local.get $l6071 + i32.add + local.set $l6072 + local.get $l6071 + local.get $l6072 + i32.add + local.set $l6073 + local.get $l6072 + local.get $l6073 + i32.add + local.set $l6074 + local.get $l6073 + local.get $l6074 + i32.add + local.set $l6075 + local.get $l6074 + local.get $l6075 + i32.add + local.set $l6076 + local.get $l6075 + local.get $l6076 + i32.add + local.set $l6077 + local.get $l6076 + local.get $l6077 + i32.add + local.set $l6078 + local.get $l6077 + local.get $l6078 + i32.add + local.set $l6079 + local.get $l6078 + local.get $l6079 + i32.add + local.set $l6080 + local.get $l6079 + local.get $l6080 + i32.add + local.set $l6081 + local.get $l6080 + local.get $l6081 + i32.add + local.set $l6082 + local.get $l6081 + local.get $l6082 + i32.add + local.set $l6083 + local.get $l6082 + local.get $l6083 + i32.add + local.set $l6084 + local.get $l6083 + local.get $l6084 + i32.add + local.set $l6085 + local.get $l6084 + local.get $l6085 + i32.add + local.set $l6086 + local.get $l6085 + local.get $l6086 + i32.add + local.set $l6087 + local.get $l6086 + local.get $l6087 + i32.add + local.set $l6088 + local.get $l6087 + local.get $l6088 + i32.add + local.set $l6089 + local.get $l6088 + local.get $l6089 + i32.add + local.set $l6090 + local.get $l6089 + local.get $l6090 + i32.add + local.set $l6091 + local.get $l6090 + local.get $l6091 + i32.add + local.set $l6092 + local.get $l6091 + local.get $l6092 + i32.add + local.set $l6093 + local.get $l6092 + local.get $l6093 + i32.add + local.set $l6094 + local.get $l6093 + local.get $l6094 + i32.add + local.set $l6095 + local.get $l6094 + local.get $l6095 + i32.add + local.set $l6096 + local.get $l6095 + local.get $l6096 + i32.add + local.set $l6097 + local.get $l6096 + local.get $l6097 + i32.add + local.set $l6098 + local.get $l6097 + local.get $l6098 + i32.add + local.set $l6099 + local.get $l6098 + local.get $l6099 + i32.add + local.set $l6100 + local.get $l6099 + local.get $l6100 + i32.add + local.set $l6101 + local.get $l6100 + local.get $l6101 + i32.add + local.set $l6102 + local.get $l6101 + local.get $l6102 + i32.add + local.set $l6103 + local.get $l6102 + local.get $l6103 + i32.add + local.set $l6104 + local.get $l6103 + local.get $l6104 + i32.add + local.set $l6105 + local.get $l6104 + local.get $l6105 + i32.add + local.set $l6106 + local.get $l6105 + local.get $l6106 + i32.add + local.set $l6107 + local.get $l6106 + local.get $l6107 + i32.add + local.set $l6108 + local.get $l6107 + local.get $l6108 + i32.add + local.set $l6109 + local.get $l6108 + local.get $l6109 + i32.add + local.set $l6110 + local.get $l6109 + local.get $l6110 + i32.add + local.set $l6111 + local.get $l6110 + local.get $l6111 + i32.add + local.set $l6112 + local.get $l6111 + local.get $l6112 + i32.add + local.set $l6113 + local.get $l6112 + local.get $l6113 + i32.add + local.set $l6114 + local.get $l6113 + local.get $l6114 + i32.add + local.set $l6115 + local.get $l6114 + local.get $l6115 + i32.add + local.set $l6116 + local.get $l6115 + local.get $l6116 + i32.add + local.set $l6117 + local.get $l6116 + local.get $l6117 + i32.add + local.set $l6118 + local.get $l6117 + local.get $l6118 + i32.add + local.set $l6119 + local.get $l6118 + local.get $l6119 + i32.add + local.set $l6120 + local.get $l6119 + local.get $l6120 + i32.add + local.set $l6121 + local.get $l6120 + local.get $l6121 + i32.add + local.set $l6122 + local.get $l6121 + local.get $l6122 + i32.add + local.set $l6123 + local.get $l6122 + local.get $l6123 + i32.add + local.set $l6124 + local.get $l6123 + local.get $l6124 + i32.add + local.set $l6125 + local.get $l6124 + local.get $l6125 + i32.add + local.set $l6126 + local.get $l6125 + local.get $l6126 + i32.add + local.set $l6127 + local.get $l6126 + local.get $l6127 + i32.add + local.set $l6128 + local.get $l6127 + local.get $l6128 + i32.add + local.set $l6129 + local.get $l6128 + local.get $l6129 + i32.add + local.set $l6130 + local.get $l6129 + local.get $l6130 + i32.add + local.set $l6131 + local.get $l6130 + local.get $l6131 + i32.add + local.set $l6132 + local.get $l6131 + local.get $l6132 + i32.add + local.set $l6133 + local.get $l6132 + local.get $l6133 + i32.add + local.set $l6134 + local.get $l6133 + local.get $l6134 + i32.add + local.set $l6135 + local.get $l6134 + local.get $l6135 + i32.add + local.set $l6136 + local.get $l6135 + local.get $l6136 + i32.add + local.set $l6137 + local.get $l6136 + local.get $l6137 + i32.add + local.set $l6138 + local.get $l6137 + local.get $l6138 + i32.add + local.set $l6139 + local.get $l6138 + local.get $l6139 + i32.add + local.set $l6140 + local.get $l6139 + local.get $l6140 + i32.add + local.set $l6141 + local.get $l6140 + local.get $l6141 + i32.add + local.set $l6142 + local.get $l6141 + local.get $l6142 + i32.add + local.set $l6143 + local.get $l6142 + local.get $l6143 + i32.add + local.set $l6144 + local.get $l6143 + local.get $l6144 + i32.add + local.set $l6145 + local.get $l6144 + local.get $l6145 + i32.add + local.set $l6146 + local.get $l6145 + local.get $l6146 + i32.add + local.set $l6147 + local.get $l6146 + local.get $l6147 + i32.add + local.set $l6148 + local.get $l6147 + local.get $l6148 + i32.add + local.set $l6149 + local.get $l6148 + local.get $l6149 + i32.add + local.set $l6150 + local.get $l6149 + local.get $l6150 + i32.add + local.set $l6151 + local.get $l6150 + local.get $l6151 + i32.add + local.set $l6152 + local.get $l6151 + local.get $l6152 + i32.add + local.set $l6153 + local.get $l6152 + local.get $l6153 + i32.add + local.set $l6154 + local.get $l6153 + local.get $l6154 + i32.add + local.set $l6155 + local.get $l6154 + local.get $l6155 + i32.add + local.set $l6156 + local.get $l6155 + local.get $l6156 + i32.add + local.set $l6157 + local.get $l6156 + local.get $l6157 + i32.add + local.set $l6158 + local.get $l6157 + local.get $l6158 + i32.add + local.set $l6159 + local.get $l6158 + local.get $l6159 + i32.add + local.set $l6160 + local.get $l6159 + local.get $l6160 + i32.add + local.set $l6161 + local.get $l6160 + local.get $l6161 + i32.add + local.set $l6162 + local.get $l6161 + local.get $l6162 + i32.add + local.set $l6163 + local.get $l6162 + local.get $l6163 + i32.add + local.set $l6164 + local.get $l6163 + local.get $l6164 + i32.add + local.set $l6165 + local.get $l6164 + local.get $l6165 + i32.add + local.set $l6166 + local.get $l6165 + local.get $l6166 + i32.add + local.set $l6167 + local.get $l6166 + local.get $l6167 + i32.add + local.set $l6168 + local.get $l6167 + local.get $l6168 + i32.add + local.set $l6169 + local.get $l6168 + local.get $l6169 + i32.add + local.set $l6170 + local.get $l6169 + local.get $l6170 + i32.add + local.set $l6171 + local.get $l6170 + local.get $l6171 + i32.add + local.set $l6172 + local.get $l6171 + local.get $l6172 + i32.add + local.set $l6173 + local.get $l6172 + local.get $l6173 + i32.add + local.set $l6174 + local.get $l6173 + local.get $l6174 + i32.add + local.set $l6175 + local.get $l6174 + local.get $l6175 + i32.add + local.set $l6176 + local.get $l6175 + local.get $l6176 + i32.add + local.set $l6177 + local.get $l6176 + local.get $l6177 + i32.add + local.set $l6178 + local.get $l6177 + local.get $l6178 + i32.add + local.set $l6179 + local.get $l6178 + local.get $l6179 + i32.add + local.set $l6180 + local.get $l6179 + local.get $l6180 + i32.add + local.set $l6181 + local.get $l6180 + local.get $l6181 + i32.add + local.set $l6182 + local.get $l6181 + local.get $l6182 + i32.add + local.set $l6183 + local.get $l6182 + local.get $l6183 + i32.add + local.set $l6184 + local.get $l6183 + local.get $l6184 + i32.add + local.set $l6185 + local.get $l6184 + local.get $l6185 + i32.add + local.set $l6186 + local.get $l6185 + local.get $l6186 + i32.add + local.set $l6187 + local.get $l6186 + local.get $l6187 + i32.add + local.set $l6188 + local.get $l6187 + local.get $l6188 + i32.add + local.set $l6189 + local.get $l6188 + local.get $l6189 + i32.add + local.set $l6190 + local.get $l6189 + local.get $l6190 + i32.add + local.set $l6191 + local.get $l6190 + local.get $l6191 + i32.add + local.set $l6192 + local.get $l6191 + local.get $l6192 + i32.add + local.set $l6193 + local.get $l6192 + local.get $l6193 + i32.add + local.set $l6194 + local.get $l6193 + local.get $l6194 + i32.add + local.set $l6195 + local.get $l6194 + local.get $l6195 + i32.add + local.set $l6196 + local.get $l6195 + local.get $l6196 + i32.add + local.set $l6197 + local.get $l6196 + local.get $l6197 + i32.add + local.set $l6198 + local.get $l6197 + local.get $l6198 + i32.add + local.set $l6199 + local.get $l6198 + local.get $l6199 + i32.add + local.set $l6200 + local.get $l6199 + local.get $l6200 + i32.add + local.set $l6201 + local.get $l6200 + local.get $l6201 + i32.add + local.set $l6202 + local.get $l6201 + local.get $l6202 + i32.add + local.set $l6203 + local.get $l6202 + local.get $l6203 + i32.add + local.set $l6204 + local.get $l6203 + local.get $l6204 + i32.add + local.set $l6205 + local.get $l6204 + local.get $l6205 + i32.add + local.set $l6206 + local.get $l6205 + local.get $l6206 + i32.add + local.set $l6207 + local.get $l6206 + local.get $l6207 + i32.add + local.set $l6208 + local.get $l6207 + local.get $l6208 + i32.add + local.set $l6209 + local.get $l6208 + local.get $l6209 + i32.add + local.set $l6210 + local.get $l6209 + local.get $l6210 + i32.add + local.set $l6211 + local.get $l6210 + local.get $l6211 + i32.add + local.set $l6212 + local.get $l6211 + local.get $l6212 + i32.add + local.set $l6213 + local.get $l6212 + local.get $l6213 + i32.add + local.set $l6214 + local.get $l6213 + local.get $l6214 + i32.add + local.set $l6215 + local.get $l6214 + local.get $l6215 + i32.add + local.set $l6216 + local.get $l6215 + local.get $l6216 + i32.add + local.set $l6217 + local.get $l6216 + local.get $l6217 + i32.add + local.set $l6218 + local.get $l6217 + local.get $l6218 + i32.add + local.set $l6219 + local.get $l6218 + local.get $l6219 + i32.add + local.set $l6220 + local.get $l6219 + local.get $l6220 + i32.add + local.set $l6221 + local.get $l6220 + local.get $l6221 + i32.add + local.set $l6222 + local.get $l6221 + local.get $l6222 + i32.add + local.set $l6223 + local.get $l6222 + local.get $l6223 + i32.add + local.set $l6224 + local.get $l6223 + local.get $l6224 + i32.add + local.set $l6225 + local.get $l6224 + local.get $l6225 + i32.add + local.set $l6226 + local.get $l6225 + local.get $l6226 + i32.add + local.set $l6227 + local.get $l6226 + local.get $l6227 + i32.add + local.set $l6228 + local.get $l6227 + local.get $l6228 + i32.add + local.set $l6229 + local.get $l6228 + local.get $l6229 + i32.add + local.set $l6230 + local.get $l6229 + local.get $l6230 + i32.add + local.set $l6231 + local.get $l6230 + local.get $l6231 + i32.add + local.set $l6232 + local.get $l6231 + local.get $l6232 + i32.add + local.set $l6233 + local.get $l6232 + local.get $l6233 + i32.add + local.set $l6234 + local.get $l6233 + local.get $l6234 + i32.add + local.set $l6235 + local.get $l6234 + local.get $l6235 + i32.add + local.set $l6236 + local.get $l6235 + local.get $l6236 + i32.add + local.set $l6237 + local.get $l6236 + local.get $l6237 + i32.add + local.set $l6238 + local.get $l6237 + local.get $l6238 + i32.add + local.set $l6239 + local.get $l6238 + local.get $l6239 + i32.add + local.set $l6240 + local.get $l6239 + local.get $l6240 + i32.add + local.set $l6241 + local.get $l6240 + local.get $l6241 + i32.add + local.set $l6242 + local.get $l6241 + local.get $l6242 + i32.add + local.set $l6243 + local.get $l6242 + local.get $l6243 + i32.add + local.set $l6244 + local.get $l6243 + local.get $l6244 + i32.add + local.set $l6245 + local.get $l6244 + local.get $l6245 + i32.add + local.set $l6246 + local.get $l6245 + local.get $l6246 + i32.add + local.set $l6247 + local.get $l6246 + local.get $l6247 + i32.add + local.set $l6248 + local.get $l6247 + local.get $l6248 + i32.add + local.set $l6249 + local.get $l6248 + local.get $l6249 + i32.add + local.set $l6250 + local.get $l6249 + local.get $l6250 + i32.add + local.set $l6251 + local.get $l6250 + local.get $l6251 + i32.add + local.set $l6252 + local.get $l6251 + local.get $l6252 + i32.add + local.set $l6253 + local.get $l6252 + local.get $l6253 + i32.add + local.set $l6254 + local.get $l6253 + local.get $l6254 + i32.add + local.set $l6255 + local.get $l6254 + local.get $l6255 + i32.add + local.set $l6256 + local.get $l6255 + local.get $l6256 + i32.add + local.set $l6257 + local.get $l6256 + local.get $l6257 + i32.add + local.set $l6258 + local.get $l6257 + local.get $l6258 + i32.add + local.set $l6259 + local.get $l6258 + local.get $l6259 + i32.add + local.set $l6260 + local.get $l6259 + local.get $l6260 + i32.add + local.set $l6261 + local.get $l6260 + local.get $l6261 + i32.add + local.set $l6262 + local.get $l6261 + local.get $l6262 + i32.add + local.set $l6263 + local.get $l6262 + local.get $l6263 + i32.add + local.set $l6264 + local.get $l6263 + local.get $l6264 + i32.add + local.set $l6265 + local.get $l6264 + local.get $l6265 + i32.add + local.set $l6266 + local.get $l6265 + local.get $l6266 + i32.add + local.set $l6267 + local.get $l6266 + local.get $l6267 + i32.add + local.set $l6268 + local.get $l6267 + local.get $l6268 + i32.add + local.set $l6269 + local.get $l6268 + local.get $l6269 + i32.add + local.set $l6270 + local.get $l6269 + local.get $l6270 + i32.add + local.set $l6271 + local.get $l6270 + local.get $l6271 + i32.add + local.set $l6272 + local.get $l6271 + local.get $l6272 + i32.add + local.set $l6273 + local.get $l6272 + local.get $l6273 + i32.add + local.set $l6274 + local.get $l6273 + local.get $l6274 + i32.add + local.set $l6275 + local.get $l6274 + local.get $l6275 + i32.add + local.set $l6276 + local.get $l6275 + local.get $l6276 + i32.add + local.set $l6277 + local.get $l6276 + local.get $l6277 + i32.add + local.set $l6278 + local.get $l6277 + local.get $l6278 + i32.add + local.set $l6279 + local.get $l6278 + local.get $l6279 + i32.add + local.set $l6280 + local.get $l6279 + local.get $l6280 + i32.add + local.set $l6281 + local.get $l6280 + local.get $l6281 + i32.add + local.set $l6282 + local.get $l6281 + local.get $l6282 + i32.add + local.set $l6283 + local.get $l6282 + local.get $l6283 + i32.add + local.set $l6284 + local.get $l6283 + local.get $l6284 + i32.add + local.set $l6285 + local.get $l6284 + local.get $l6285 + i32.add + local.set $l6286 + local.get $l6285 + local.get $l6286 + i32.add + local.set $l6287 + local.get $l6286 + local.get $l6287 + i32.add + local.set $l6288 + local.get $l6287 + local.get $l6288 + i32.add + local.set $l6289 + local.get $l6288 + local.get $l6289 + i32.add + local.set $l6290 + local.get $l6289 + local.get $l6290 + i32.add + local.set $l6291 + local.get $l6290 + local.get $l6291 + i32.add + local.set $l6292 + local.get $l6291 + local.get $l6292 + i32.add + local.set $l6293 + local.get $l6292 + local.get $l6293 + i32.add + local.set $l6294 + local.get $l6293 + local.get $l6294 + i32.add + local.set $l6295 + local.get $l6294 + local.get $l6295 + i32.add + local.set $l6296 + local.get $l6295 + local.get $l6296 + i32.add + local.set $l6297 + local.get $l6296 + local.get $l6297 + i32.add + local.set $l6298 + local.get $l6297 + local.get $l6298 + i32.add + local.set $l6299 + local.get $l6298 + local.get $l6299 + i32.add + local.set $l6300 + local.get $l6299 + local.get $l6300 + i32.add + local.set $l6301 + local.get $l6300 + local.get $l6301 + i32.add + local.set $l6302 + local.get $l6301 + local.get $l6302 + i32.add + local.set $l6303 + local.get $l6302 + local.get $l6303 + i32.add + local.set $l6304 + local.get $l6303 + local.get $l6304 + i32.add + local.set $l6305 + local.get $l6304 + local.get $l6305 + i32.add + local.set $l6306 + local.get $l6305 + local.get $l6306 + i32.add + local.set $l6307 + local.get $l6306 + local.get $l6307 + i32.add + local.set $l6308 + local.get $l6307 + local.get $l6308 + i32.add + local.set $l6309 + local.get $l6308 + local.get $l6309 + i32.add + local.set $l6310 + local.get $l6309 + local.get $l6310 + i32.add + local.set $l6311 + local.get $l6310 + local.get $l6311 + i32.add + local.set $l6312 + local.get $l6311 + local.get $l6312 + i32.add + local.set $l6313 + local.get $l6312 + local.get $l6313 + i32.add + local.set $l6314 + local.get $l6313 + local.get $l6314 + i32.add + local.set $l6315 + local.get $l6314 + local.get $l6315 + i32.add + local.set $l6316 + local.get $l6315 + local.get $l6316 + i32.add + local.set $l6317 + local.get $l6316 + local.get $l6317 + i32.add + local.set $l6318 + local.get $l6317 + local.get $l6318 + i32.add + local.set $l6319 + local.get $l6318 + local.get $l6319 + i32.add + local.set $l6320 + local.get $l6319 + local.get $l6320 + i32.add + local.set $l6321 + local.get $l6320 + local.get $l6321 + i32.add + local.set $l6322 + local.get $l6321 + local.get $l6322 + i32.add + local.set $l6323 + local.get $l6322 + local.get $l6323 + i32.add + local.set $l6324 + local.get $l6323 + local.get $l6324 + i32.add + local.set $l6325 + local.get $l6324 + local.get $l6325 + i32.add + local.set $l6326 + local.get $l6325 + local.get $l6326 + i32.add + local.set $l6327 + local.get $l6326 + local.get $l6327 + i32.add + local.set $l6328 + local.get $l6327 + local.get $l6328 + i32.add + local.set $l6329 + local.get $l6328 + local.get $l6329 + i32.add + local.set $l6330 + local.get $l6329 + local.get $l6330 + i32.add + local.set $l6331 + local.get $l6330 + local.get $l6331 + i32.add + local.set $l6332 + local.get $l6331 + local.get $l6332 + i32.add + local.set $l6333 + local.get $l6332 + local.get $l6333 + i32.add + local.set $l6334 + local.get $l6333 + local.get $l6334 + i32.add + local.set $l6335 + local.get $l6334 + local.get $l6335 + i32.add + local.set $l6336 + local.get $l6335 + local.get $l6336 + i32.add + local.set $l6337 + local.get $l6336 + local.get $l6337 + i32.add + local.set $l6338 + local.get $l6337 + local.get $l6338 + i32.add + local.set $l6339 + local.get $l6338 + local.get $l6339 + i32.add + local.set $l6340 + local.get $l6339 + local.get $l6340 + i32.add + local.set $l6341 + local.get $l6340 + local.get $l6341 + i32.add + local.set $l6342 + local.get $l6341 + local.get $l6342 + i32.add + local.set $l6343 + local.get $l6342 + local.get $l6343 + i32.add + local.set $l6344 + local.get $l6343 + local.get $l6344 + i32.add + local.set $l6345 + local.get $l6344 + local.get $l6345 + i32.add + local.set $l6346 + local.get $l6345 + local.get $l6346 + i32.add + local.set $l6347 + local.get $l6346 + local.get $l6347 + i32.add + local.set $l6348 + local.get $l6347 + local.get $l6348 + i32.add + local.set $l6349 + local.get $l6348 + local.get $l6349 + i32.add + local.set $l6350 + local.get $l6349 + local.get $l6350 + i32.add + local.set $l6351 + local.get $l6350 + local.get $l6351 + i32.add + local.set $l6352 + local.get $l6351 + local.get $l6352 + i32.add + local.set $l6353 + local.get $l6352 + local.get $l6353 + i32.add + local.set $l6354 + local.get $l6353 + local.get $l6354 + i32.add + local.set $l6355 + local.get $l6354 + local.get $l6355 + i32.add + local.set $l6356 + local.get $l6355 + local.get $l6356 + i32.add + local.set $l6357 + local.get $l6356 + local.get $l6357 + i32.add + local.set $l6358 + local.get $l6357 + local.get $l6358 + i32.add + local.set $l6359 + local.get $l6358 + local.get $l6359 + i32.add + local.set $l6360 + local.get $l6359 + local.get $l6360 + i32.add + local.set $l6361 + local.get $l6360 + local.get $l6361 + i32.add + local.set $l6362 + local.get $l6361 + local.get $l6362 + i32.add + local.set $l6363 + local.get $l6362 + local.get $l6363 + i32.add + local.set $l6364 + local.get $l6363 + local.get $l6364 + i32.add + local.set $l6365 + local.get $l6364 + local.get $l6365 + i32.add + local.set $l6366 + local.get $l6365 + local.get $l6366 + i32.add + local.set $l6367 + local.get $l6366 + local.get $l6367 + i32.add + local.set $l6368 + local.get $l6367 + local.get $l6368 + i32.add + local.set $l6369 + local.get $l6368 + local.get $l6369 + i32.add + local.set $l6370 + local.get $l6369 + local.get $l6370 + i32.add + local.set $l6371 + local.get $l6370 + local.get $l6371 + i32.add + local.set $l6372 + local.get $l6371 + local.get $l6372 + i32.add + local.set $l6373 + local.get $l6372 + local.get $l6373 + i32.add + local.set $l6374 + local.get $l6373 + local.get $l6374 + i32.add + local.set $l6375 + local.get $l6374 + local.get $l6375 + i32.add + local.set $l6376 + local.get $l6375 + local.get $l6376 + i32.add + local.set $l6377 + local.get $l6376 + local.get $l6377 + i32.add + local.set $l6378 + local.get $l6377 + local.get $l6378 + i32.add + local.set $l6379 + local.get $l6378 + local.get $l6379 + i32.add + local.set $l6380 + local.get $l6379 + local.get $l6380 + i32.add + local.set $l6381 + local.get $l6380 + local.get $l6381 + i32.add + local.set $l6382 + local.get $l6381 + local.get $l6382 + i32.add + local.set $l6383 + local.get $l6382 + local.get $l6383 + i32.add + local.set $l6384 + local.get $l6383 + local.get $l6384 + i32.add + local.set $l6385 + local.get $l6384 + local.get $l6385 + i32.add + local.set $l6386 + local.get $l6385 + local.get $l6386 + i32.add + local.set $l6387 + local.get $l6386 + local.get $l6387 + i32.add + local.set $l6388 + local.get $l6387 + local.get $l6388 + i32.add + local.set $l6389 + local.get $l6388 + local.get $l6389 + i32.add + local.set $l6390 + local.get $l6389 + local.get $l6390 + i32.add + local.set $l6391 + local.get $l6390 + local.get $l6391 + i32.add + local.set $l6392 + local.get $l6391 + local.get $l6392 + i32.add + local.set $l6393 + local.get $l6392 + local.get $l6393 + i32.add + local.set $l6394 + local.get $l6393 + local.get $l6394 + i32.add + local.set $l6395 + local.get $l6394 + local.get $l6395 + i32.add + local.set $l6396 + local.get $l6395 + local.get $l6396 + i32.add + local.set $l6397 + local.get $l6396 + local.get $l6397 + i32.add + local.set $l6398 + local.get $l6397 + local.get $l6398 + i32.add + local.set $l6399 + local.get $l6398 + local.get $l6399 + i32.add + local.set $l6400 + local.get $l6399 + local.get $l6400 + i32.add + local.set $l6401 + local.get $l6400 + local.get $l6401 + i32.add + local.set $l6402 + local.get $l6401 + local.get $l6402 + i32.add + local.set $l6403 + local.get $l6402 + local.get $l6403 + i32.add + local.set $l6404 + local.get $l6403 + local.get $l6404 + i32.add + local.set $l6405 + local.get $l6404 + local.get $l6405 + i32.add + local.set $l6406 + local.get $l6405 + local.get $l6406 + i32.add + local.set $l6407 + local.get $l6406 + local.get $l6407 + i32.add + local.set $l6408 + local.get $l6407 + local.get $l6408 + i32.add + local.set $l6409 + local.get $l6408 + local.get $l6409 + i32.add + local.set $l6410 + local.get $l6409 + local.get $l6410 + i32.add + local.set $l6411 + local.get $l6410 + local.get $l6411 + i32.add + local.set $l6412 + local.get $l6411 + local.get $l6412 + i32.add + local.set $l6413 + local.get $l6412 + local.get $l6413 + i32.add + local.set $l6414 + local.get $l6413 + local.get $l6414 + i32.add + local.set $l6415 + local.get $l6414 + local.get $l6415 + i32.add + local.set $l6416 + local.get $l6415 + local.get $l6416 + i32.add + local.set $l6417 + local.get $l6416 + local.get $l6417 + i32.add + local.set $l6418 + local.get $l6417 + local.get $l6418 + i32.add + local.set $l6419 + local.get $l6418 + local.get $l6419 + i32.add + local.set $l6420 + local.get $l6419 + local.get $l6420 + i32.add + local.set $l6421 + local.get $l6420 + local.get $l6421 + i32.add + local.set $l6422 + local.get $l6421 + local.get $l6422 + i32.add + local.set $l6423 + local.get $l6422 + local.get $l6423 + i32.add + local.set $l6424 + local.get $l6423 + local.get $l6424 + i32.add + local.set $l6425 + local.get $l6424 + local.get $l6425 + i32.add + local.set $l6426 + local.get $l6425 + local.get $l6426 + i32.add + local.set $l6427 + local.get $l6426 + local.get $l6427 + i32.add + local.set $l6428 + local.get $l6427 + local.get $l6428 + i32.add + local.set $l6429 + local.get $l6428 + local.get $l6429 + i32.add + local.set $l6430 + local.get $l6429 + local.get $l6430 + i32.add + local.set $l6431 + local.get $l6430 + local.get $l6431 + i32.add + local.set $l6432 + local.get $l6431 + local.get $l6432 + i32.add + local.set $l6433 + local.get $l6432 + local.get $l6433 + i32.add + local.set $l6434 + local.get $l6433 + local.get $l6434 + i32.add + local.set $l6435 + local.get $l6434 + local.get $l6435 + i32.add + local.set $l6436 + local.get $l6435 + local.get $l6436 + i32.add + local.set $l6437 + local.get $l6436 + local.get $l6437 + i32.add + local.set $l6438 + local.get $l6437 + local.get $l6438 + i32.add + local.set $l6439 + local.get $l6438 + local.get $l6439 + i32.add + local.set $l6440 + local.get $l6439 + local.get $l6440 + i32.add + local.set $l6441 + local.get $l6440 + local.get $l6441 + i32.add + local.set $l6442 + local.get $l6441 + local.get $l6442 + i32.add + local.set $l6443 + local.get $l6442 + local.get $l6443 + i32.add + local.set $l6444 + local.get $l6443 + local.get $l6444 + i32.add + local.set $l6445 + local.get $l6444 + local.get $l6445 + i32.add + local.set $l6446 + local.get $l6445 + local.get $l6446 + i32.add + local.set $l6447 + local.get $l6446 + local.get $l6447 + i32.add + local.set $l6448 + local.get $l6447 + local.get $l6448 + i32.add + local.set $l6449 + local.get $l6448 + local.get $l6449 + i32.add + local.set $l6450 + local.get $l6449 + local.get $l6450 + i32.add + local.set $l6451 + local.get $l6450 + local.get $l6451 + i32.add + local.set $l6452 + local.get $l6451 + local.get $l6452 + i32.add + local.set $l6453 + local.get $l6452 + local.get $l6453 + i32.add + local.set $l6454 + local.get $l6453 + local.get $l6454 + i32.add + local.set $l6455 + local.get $l6454 + local.get $l6455 + i32.add + local.set $l6456 + local.get $l6455 + local.get $l6456 + i32.add + local.set $l6457 + local.get $l6456 + local.get $l6457 + i32.add + local.set $l6458 + local.get $l6457 + local.get $l6458 + i32.add + local.set $l6459 + local.get $l6458 + local.get $l6459 + i32.add + local.set $l6460 + local.get $l6459 + local.get $l6460 + i32.add + local.set $l6461 + local.get $l6460 + local.get $l6461 + i32.add + local.set $l6462 + local.get $l6461 + local.get $l6462 + i32.add + local.set $l6463 + local.get $l6462 + local.get $l6463 + i32.add + local.set $l6464 + local.get $l6463 + local.get $l6464 + i32.add + local.set $l6465 + local.get $l6464 + local.get $l6465 + i32.add + local.set $l6466 + local.get $l6465 + local.get $l6466 + i32.add + local.set $l6467 + local.get $l6466 + local.get $l6467 + i32.add + local.set $l6468 + local.get $l6467 + local.get $l6468 + i32.add + local.set $l6469 + local.get $l6468 + local.get $l6469 + i32.add + local.set $l6470 + local.get $l6469 + local.get $l6470 + i32.add + local.set $l6471 + local.get $l6470 + local.get $l6471 + i32.add + local.set $l6472 + local.get $l6471 + local.get $l6472 + i32.add + local.set $l6473 + local.get $l6472 + local.get $l6473 + i32.add + local.set $l6474 + local.get $l6473 + local.get $l6474 + i32.add + local.set $l6475 + local.get $l6474 + local.get $l6475 + i32.add + local.set $l6476 + local.get $l6475 + local.get $l6476 + i32.add + local.set $l6477 + local.get $l6476 + local.get $l6477 + i32.add + local.set $l6478 + local.get $l6477 + local.get $l6478 + i32.add + local.set $l6479 + local.get $l6478 + local.get $l6479 + i32.add + local.set $l6480 + local.get $l6479 + local.get $l6480 + i32.add + local.set $l6481 + local.get $l6480 + local.get $l6481 + i32.add + local.set $l6482 + local.get $l6481 + local.get $l6482 + i32.add + local.set $l6483 + local.get $l6482 + local.get $l6483 + i32.add + local.set $l6484 + local.get $l6483 + local.get $l6484 + i32.add + local.set $l6485 + local.get $l6484 + local.get $l6485 + i32.add + local.set $l6486 + local.get $l6485 + local.get $l6486 + i32.add + local.set $l6487 + local.get $l6486 + local.get $l6487 + i32.add + local.set $l6488 + local.get $l6487 + local.get $l6488 + i32.add + local.set $l6489 + local.get $l6488 + local.get $l6489 + i32.add + local.set $l6490 + local.get $l6489 + local.get $l6490 + i32.add + local.set $l6491 + local.get $l6490 + local.get $l6491 + i32.add + local.set $l6492 + local.get $l6491 + local.get $l6492 + i32.add + local.set $l6493 + local.get $l6492 + local.get $l6493 + i32.add + local.set $l6494 + local.get $l6493 + local.get $l6494 + i32.add + local.set $l6495 + local.get $l6494 + local.get $l6495 + i32.add + local.set $l6496 + local.get $l6495 + local.get $l6496 + i32.add + local.set $l6497 + local.get $l6496 + local.get $l6497 + i32.add + local.set $l6498 + local.get $l6497 + local.get $l6498 + i32.add + local.set $l6499 + local.get $l6498 + local.get $l6499 + i32.add + local.set $l6500 + local.get $l6499 + local.get $l6500 + i32.add + local.set $l6501 + local.get $l6500 + local.get $l6501 + i32.add + local.set $l6502 + local.get $l6501 + local.get $l6502 + i32.add + local.set $l6503 + local.get $l6502 + local.get $l6503 + i32.add + local.set $l6504 + local.get $l6503 + local.get $l6504 + i32.add + local.set $l6505 + local.get $l6504 + local.get $l6505 + i32.add + local.set $l6506 + local.get $l6505 + local.get $l6506 + i32.add + local.set $l6507 + local.get $l6506 + local.get $l6507 + i32.add + local.set $l6508 + local.get $l6507 + local.get $l6508 + i32.add + local.set $l6509 + local.get $l6508 + local.get $l6509 + i32.add + local.set $l6510 + local.get $l6509 + local.get $l6510 + i32.add + local.set $l6511 + local.get $l6510 + local.get $l6511 + i32.add + local.set $l6512 + local.get $l6511 + local.get $l6512 + i32.add + local.set $l6513 + local.get $l6512 + local.get $l6513 + i32.add + local.set $l6514 + local.get $l6513 + local.get $l6514 + i32.add + local.set $l6515 + local.get $l6514 + local.get $l6515 + i32.add + local.set $l6516 + local.get $l6515 + local.get $l6516 + i32.add + local.set $l6517 + local.get $l6516 + local.get $l6517 + i32.add + local.set $l6518 + local.get $l6517 + local.get $l6518 + i32.add + local.set $l6519 + local.get $l6518 + local.get $l6519 + i32.add + local.set $l6520 + local.get $l6519 + local.get $l6520 + i32.add + local.set $l6521 + local.get $l6520 + local.get $l6521 + i32.add + local.set $l6522 + local.get $l6521 + local.get $l6522 + i32.add + local.set $l6523 + local.get $l6522 + local.get $l6523 + i32.add + local.set $l6524 + local.get $l6523 + local.get $l6524 + i32.add + local.set $l6525 + local.get $l6524 + local.get $l6525 + i32.add + local.set $l6526 + local.get $l6525 + local.get $l6526 + i32.add + local.set $l6527 + local.get $l6526 + local.get $l6527 + i32.add + local.set $l6528 + local.get $l6527 + local.get $l6528 + i32.add + local.set $l6529 + local.get $l6528 + local.get $l6529 + i32.add + local.set $l6530 + local.get $l6529 + local.get $l6530 + i32.add + local.set $l6531 + local.get $l6530 + local.get $l6531 + i32.add + local.set $l6532 + local.get $l6531 + local.get $l6532 + i32.add + local.set $l6533 + local.get $l6532 + local.get $l6533 + i32.add + local.set $l6534 + local.get $l6533 + local.get $l6534 + i32.add + local.set $l6535 + local.get $l6534 + local.get $l6535 + i32.add + local.set $l6536 + local.get $l6535 + local.get $l6536 + i32.add + local.set $l6537 + local.get $l6536 + local.get $l6537 + i32.add + local.set $l6538 + local.get $l6537 + local.get $l6538 + i32.add + local.set $l6539 + local.get $l6538 + local.get $l6539 + i32.add + local.set $l6540 + local.get $l6539 + local.get $l6540 + i32.add + local.set $l6541 + local.get $l6540 + local.get $l6541 + i32.add + local.set $l6542 + local.get $l6541 + local.get $l6542 + i32.add + local.set $l6543 + local.get $l6542 + local.get $l6543 + i32.add + local.set $l6544 + local.get $l6543 + local.get $l6544 + i32.add + local.set $l6545 + local.get $l6544 + local.get $l6545 + i32.add + local.set $l6546 + local.get $l6545 + local.get $l6546 + i32.add + local.set $l6547 + local.get $l6546 + local.get $l6547 + i32.add + local.set $l6548 + local.get $l6547 + local.get $l6548 + i32.add + local.set $l6549 + local.get $l6548 + local.get $l6549 + i32.add + local.set $l6550 + local.get $l6549 + local.get $l6550 + i32.add + local.set $l6551 + local.get $l6550 + local.get $l6551 + i32.add + local.set $l6552 + local.get $l6551 + local.get $l6552 + i32.add + local.set $l6553 + local.get $l6552 + local.get $l6553 + i32.add + local.set $l6554 + local.get $l6553 + local.get $l6554 + i32.add + local.set $l6555 + local.get $l6554 + local.get $l6555 + i32.add + local.set $l6556 + local.get $l6555 + local.get $l6556 + i32.add + local.set $l6557 + local.get $l6556 + local.get $l6557 + i32.add + local.set $l6558 + local.get $l6557 + local.get $l6558 + i32.add + local.set $l6559 + local.get $l6558 + local.get $l6559 + i32.add + local.set $l6560 + local.get $l6559 + local.get $l6560 + i32.add + local.set $l6561 + local.get $l6560 + local.get $l6561 + i32.add + local.set $l6562 + local.get $l6561 + local.get $l6562 + i32.add + local.set $l6563 + local.get $l6562 + local.get $l6563 + i32.add + local.set $l6564 + local.get $l6563 + local.get $l6564 + i32.add + local.set $l6565 + local.get $l6564 + local.get $l6565 + i32.add + local.set $l6566 + local.get $l6565 + local.get $l6566 + i32.add + local.set $l6567 + local.get $l6566 + local.get $l6567 + i32.add + local.set $l6568 + local.get $l6567 + local.get $l6568 + i32.add + local.set $l6569 + local.get $l6568 + local.get $l6569 + i32.add + local.set $l6570 + local.get $l6569 + local.get $l6570 + i32.add + local.set $l6571 + local.get $l6570 + local.get $l6571 + i32.add + local.set $l6572 + local.get $l6571 + local.get $l6572 + i32.add + local.set $l6573 + local.get $l6572 + local.get $l6573 + i32.add + local.set $l6574 + local.get $l6573 + local.get $l6574 + i32.add + local.set $l6575 + local.get $l6574 + local.get $l6575 + i32.add + local.set $l6576 + local.get $l6575 + local.get $l6576 + i32.add + local.set $l6577 + local.get $l6576 + local.get $l6577 + i32.add + local.set $l6578 + local.get $l6577 + local.get $l6578 + i32.add + local.set $l6579 + local.get $l6578 + local.get $l6579 + i32.add + local.set $l6580 + local.get $l6579 + local.get $l6580 + i32.add + local.set $l6581 + local.get $l6580 + local.get $l6581 + i32.add + local.set $l6582 + local.get $l6581 + local.get $l6582 + i32.add + local.set $l6583 + local.get $l6582 + local.get $l6583 + i32.add + local.set $l6584 + local.get $l6583 + local.get $l6584 + i32.add + local.set $l6585 + local.get $l6584 + local.get $l6585 + i32.add + local.set $l6586 + local.get $l6585 + local.get $l6586 + i32.add + local.set $l6587 + local.get $l6586 + local.get $l6587 + i32.add + local.set $l6588 + local.get $l6587 + local.get $l6588 + i32.add + local.set $l6589 + local.get $l6588 + local.get $l6589 + i32.add + local.set $l6590 + local.get $l6589 + local.get $l6590 + i32.add + local.set $l6591 + local.get $l6590 + local.get $l6591 + i32.add + local.set $l6592 + local.get $l6591 + local.get $l6592 + i32.add + local.set $l6593 + local.get $l6592 + local.get $l6593 + i32.add + local.set $l6594 + local.get $l6593 + local.get $l6594 + i32.add + local.set $l6595 + local.get $l6594 + local.get $l6595 + i32.add + local.set $l6596 + local.get $l6595 + local.get $l6596 + i32.add + local.set $l6597 + local.get $l6596 + local.get $l6597 + i32.add + local.set $l6598 + local.get $l6597 + local.get $l6598 + i32.add + local.set $l6599 + local.get $l6598 + local.get $l6599 + i32.add + local.set $l6600 + local.get $l6599 + local.get $l6600 + i32.add + local.set $l6601 + local.get $l6600 + local.get $l6601 + i32.add + local.set $l6602 + local.get $l6601 + local.get $l6602 + i32.add + local.set $l6603 + local.get $l6602 + local.get $l6603 + i32.add + local.set $l6604 + local.get $l6603 + local.get $l6604 + i32.add + local.set $l6605 + local.get $l6604 + local.get $l6605 + i32.add + local.set $l6606 + local.get $l6605 + local.get $l6606 + i32.add + local.set $l6607 + local.get $l6606 + local.get $l6607 + i32.add + local.set $l6608 + local.get $l6607 + local.get $l6608 + i32.add + local.set $l6609 + local.get $l6608 + local.get $l6609 + i32.add + local.set $l6610 + local.get $l6609 + local.get $l6610 + i32.add + local.set $l6611 + local.get $l6610 + local.get $l6611 + i32.add + local.set $l6612 + local.get $l6611 + local.get $l6612 + i32.add + local.set $l6613 + local.get $l6612 + local.get $l6613 + i32.add + local.set $l6614 + local.get $l6613 + local.get $l6614 + i32.add + local.set $l6615 + local.get $l6614 + local.get $l6615 + i32.add + local.set $l6616 + local.get $l6615 + local.get $l6616 + i32.add + local.set $l6617 + local.get $l6616 + local.get $l6617 + i32.add + local.set $l6618 + local.get $l6617 + local.get $l6618 + i32.add + local.set $l6619 + local.get $l6618 + local.get $l6619 + i32.add + local.set $l6620 + local.get $l6619 + local.get $l6620 + i32.add + local.set $l6621 + local.get $l6620 + local.get $l6621 + i32.add + local.set $l6622 + local.get $l6621 + local.get $l6622 + i32.add + local.set $l6623 + local.get $l6622 + local.get $l6623 + i32.add + local.set $l6624 + local.get $l6623 + local.get $l6624 + i32.add + local.set $l6625 + local.get $l6624 + local.get $l6625 + i32.add + local.set $l6626 + local.get $l6625 + local.get $l6626 + i32.add + local.set $l6627 + local.get $l6626 + local.get $l6627 + i32.add + local.set $l6628 + local.get $l6627 + local.get $l6628 + i32.add + local.set $l6629 + local.get $l6628 + local.get $l6629 + i32.add + local.set $l6630 + local.get $l6629 + local.get $l6630 + i32.add + local.set $l6631 + local.get $l6630 + local.get $l6631 + i32.add + local.set $l6632 + local.get $l6631 + local.get $l6632 + i32.add + local.set $l6633 + local.get $l6632 + local.get $l6633 + i32.add + local.set $l6634 + local.get $l6633 + local.get $l6634 + i32.add + local.set $l6635 + local.get $l6634 + local.get $l6635 + i32.add + local.set $l6636 + local.get $l6635 + local.get $l6636 + i32.add + local.set $l6637 + local.get $l6636 + local.get $l6637 + i32.add + local.set $l6638 + local.get $l6637 + local.get $l6638 + i32.add + local.set $l6639 + local.get $l6638 + local.get $l6639 + i32.add + local.set $l6640 + local.get $l6639 + local.get $l6640 + i32.add + local.set $l6641 + local.get $l6640 + local.get $l6641 + i32.add + local.set $l6642 + local.get $l6641 + local.get $l6642 + i32.add + local.set $l6643 + local.get $l6642 + local.get $l6643 + i32.add + local.set $l6644 + local.get $l6643 + local.get $l6644 + i32.add + local.set $l6645 + local.get $l6644 + local.get $l6645 + i32.add + local.set $l6646 + local.get $l6645 + local.get $l6646 + i32.add + local.set $l6647 + local.get $l6646 + local.get $l6647 + i32.add + local.set $l6648 + local.get $l6647 + local.get $l6648 + i32.add + local.set $l6649 + local.get $l6648 + local.get $l6649 + i32.add + local.set $l6650 + local.get $l6649 + local.get $l6650 + i32.add + local.set $l6651 + local.get $l6650 + local.get $l6651 + i32.add + local.set $l6652 + local.get $l6651 + local.get $l6652 + i32.add + local.set $l6653 + local.get $l6652 + local.get $l6653 + i32.add + local.set $l6654 + local.get $l6653 + local.get $l6654 + i32.add + local.set $l6655 + local.get $l6654 + local.get $l6655 + i32.add + local.set $l6656 + local.get $l6655 + local.get $l6656 + i32.add + local.set $l6657 + local.get $l6656 + local.get $l6657 + i32.add + local.set $l6658 + local.get $l6657 + local.get $l6658 + i32.add + local.set $l6659 + local.get $l6658 + local.get $l6659 + i32.add + local.set $l6660 + local.get $l6659 + local.get $l6660 + i32.add + local.set $l6661 + local.get $l6660 + local.get $l6661 + i32.add + local.set $l6662 + local.get $l6661 + local.get $l6662 + i32.add + local.set $l6663 + local.get $l6662 + local.get $l6663 + i32.add + local.set $l6664 + local.get $l6663 + local.get $l6664 + i32.add + local.set $l6665 + local.get $l6664 + local.get $l6665 + i32.add + local.set $l6666 + local.get $l6665 + local.get $l6666 + i32.add + local.set $l6667 + local.get $l6666 + local.get $l6667 + i32.add + local.set $l6668 + local.get $l6667 + local.get $l6668 + i32.add + local.set $l6669 + local.get $l6668 + local.get $l6669 + i32.add + local.set $l6670 + local.get $l6669 + local.get $l6670 + i32.add + local.set $l6671 + local.get $l6670 + local.get $l6671 + i32.add + local.set $l6672 + local.get $l6671 + local.get $l6672 + i32.add + local.set $l6673 + local.get $l6672 + local.get $l6673 + i32.add + local.set $l6674 + local.get $l6673 + local.get $l6674 + i32.add + local.set $l6675 + local.get $l6674 + local.get $l6675 + i32.add + local.set $l6676 + local.get $l6675 + local.get $l6676 + i32.add + local.set $l6677 + local.get $l6676 + local.get $l6677 + i32.add + local.set $l6678 + local.get $l6677 + local.get $l6678 + i32.add + local.set $l6679 + local.get $l6678 + local.get $l6679 + i32.add + local.set $l6680 + local.get $l6679 + local.get $l6680 + i32.add + local.set $l6681 + local.get $l6680 + local.get $l6681 + i32.add + local.set $l6682 + local.get $l6681 + local.get $l6682 + i32.add + local.set $l6683 + local.get $l6682 + local.get $l6683 + i32.add + local.set $l6684 + local.get $l6683 + local.get $l6684 + i32.add + local.set $l6685 + local.get $l6684 + local.get $l6685 + i32.add + local.set $l6686 + local.get $l6685 + local.get $l6686 + i32.add + local.set $l6687 + local.get $l6686 + local.get $l6687 + i32.add + local.set $l6688 + local.get $l6687 + local.get $l6688 + i32.add + local.set $l6689 + local.get $l6688 + local.get $l6689 + i32.add + local.set $l6690 + local.get $l6689 + local.get $l6690 + i32.add + local.set $l6691 + local.get $l6690 + local.get $l6691 + i32.add + local.set $l6692 + local.get $l6691 + local.get $l6692 + i32.add + local.set $l6693 + local.get $l6692 + local.get $l6693 + i32.add + local.set $l6694 + local.get $l6693 + local.get $l6694 + i32.add + local.set $l6695 + local.get $l6694 + local.get $l6695 + i32.add + local.set $l6696 + local.get $l6695 + local.get $l6696 + i32.add + local.set $l6697 + local.get $l6696 + local.get $l6697 + i32.add + local.set $l6698 + local.get $l6697 + local.get $l6698 + i32.add + local.set $l6699 + local.get $l6698 + local.get $l6699 + i32.add + local.set $l6700 + local.get $l6699 + local.get $l6700 + i32.add + local.set $l6701 + local.get $l6700 + local.get $l6701 + i32.add + local.set $l6702 + local.get $l6701 + local.get $l6702 + i32.add + local.set $l6703 + local.get $l6702 + local.get $l6703 + i32.add + local.set $l6704 + local.get $l6703 + local.get $l6704 + i32.add + local.set $l6705 + local.get $l6704 + local.get $l6705 + i32.add + local.set $l6706 + local.get $l6705 + local.get $l6706 + i32.add + local.set $l6707 + local.get $l6706 + local.get $l6707 + i32.add + local.set $l6708 + local.get $l6707 + local.get $l6708 + i32.add + local.set $l6709 + local.get $l6708 + local.get $l6709 + i32.add + local.set $l6710 + local.get $l6709 + local.get $l6710 + i32.add + local.set $l6711 + local.get $l6710 + local.get $l6711 + i32.add + local.set $l6712 + local.get $l6711 + local.get $l6712 + i32.add + local.set $l6713 + local.get $l6712 + local.get $l6713 + i32.add + local.set $l6714 + local.get $l6713 + local.get $l6714 + i32.add + local.set $l6715 + local.get $l6714 + local.get $l6715 + i32.add + local.set $l6716 + local.get $l6715 + local.get $l6716 + i32.add + local.set $l6717 + local.get $l6716 + local.get $l6717 + i32.add + local.set $l6718 + local.get $l6717 + local.get $l6718 + i32.add + local.set $l6719 + local.get $l6718 + local.get $l6719 + i32.add + local.set $l6720 + local.get $l6719 + local.get $l6720 + i32.add + local.set $l6721 + local.get $l6720 + local.get $l6721 + i32.add + local.set $l6722 + local.get $l6721 + local.get $l6722 + i32.add + local.set $l6723 + local.get $l6722 + local.get $l6723 + i32.add + local.set $l6724 + local.get $l6723 + local.get $l6724 + i32.add + local.set $l6725 + local.get $l6724 + local.get $l6725 + i32.add + local.set $l6726 + local.get $l6725 + local.get $l6726 + i32.add + local.set $l6727 + local.get $l6726 + local.get $l6727 + i32.add + local.set $l6728 + local.get $l6727 + local.get $l6728 + i32.add + local.set $l6729 + local.get $l6728 + local.get $l6729 + i32.add + local.set $l6730 + local.get $l6729 + local.get $l6730 + i32.add + local.set $l6731 + local.get $l6730 + local.get $l6731 + i32.add + local.set $l6732 + local.get $l6731 + local.get $l6732 + i32.add + local.set $l6733 + local.get $l6732 + local.get $l6733 + i32.add + local.set $l6734 + local.get $l6733 + local.get $l6734 + i32.add + local.set $l6735 + local.get $l6734 + local.get $l6735 + i32.add + local.set $l6736 + local.get $l6735 + local.get $l6736 + i32.add + local.set $l6737 + local.get $l6736 + local.get $l6737 + i32.add + local.set $l6738 + local.get $l6737 + local.get $l6738 + i32.add + local.set $l6739 + local.get $l6738 + local.get $l6739 + i32.add + local.set $l6740 + local.get $l6739 + local.get $l6740 + i32.add + local.set $l6741 + local.get $l6740 + local.get $l6741 + i32.add + local.set $l6742 + local.get $l6741 + local.get $l6742 + i32.add + local.set $l6743 + local.get $l6742 + local.get $l6743 + i32.add + local.set $l6744 + local.get $l6743 + local.get $l6744 + i32.add + local.set $l6745 + local.get $l6744 + local.get $l6745 + i32.add + local.set $l6746 + local.get $l6745 + local.get $l6746 + i32.add + local.set $l6747 + local.get $l6746 + local.get $l6747 + i32.add + local.set $l6748 + local.get $l6747 + local.get $l6748 + i32.add + local.set $l6749 + local.get $l6748 + local.get $l6749 + i32.add + local.set $l6750 + local.get $l6749 + local.get $l6750 + i32.add + local.set $l6751 + local.get $l6750 + local.get $l6751 + i32.add + local.set $l6752 + local.get $l6751 + local.get $l6752 + i32.add + local.set $l6753 + local.get $l6752 + local.get $l6753 + i32.add + local.set $l6754 + local.get $l6753 + local.get $l6754 + i32.add + local.set $l6755 + local.get $l6754 + local.get $l6755 + i32.add + local.set $l6756 + local.get $l6755 + local.get $l6756 + i32.add + local.set $l6757 + local.get $l6756 + local.get $l6757 + i32.add + local.set $l6758 + local.get $l6757 + local.get $l6758 + i32.add + local.set $l6759 + local.get $l6758 + local.get $l6759 + i32.add + local.set $l6760 + local.get $l6759 + local.get $l6760 + i32.add + local.set $l6761 + local.get $l6760 + local.get $l6761 + i32.add + local.set $l6762 + local.get $l6761 + local.get $l6762 + i32.add + local.set $l6763 + local.get $l6762 + local.get $l6763 + i32.add + local.set $l6764 + local.get $l6763 + local.get $l6764 + i32.add + local.set $l6765 + local.get $l6764 + local.get $l6765 + i32.add + local.set $l6766 + local.get $l6765 + local.get $l6766 + i32.add + local.set $l6767 + local.get $l6766 + local.get $l6767 + i32.add + local.set $l6768 + local.get $l6767 + local.get $l6768 + i32.add + local.set $l6769 + local.get $l6768 + local.get $l6769 + i32.add + local.set $l6770 + local.get $l6769 + local.get $l6770 + i32.add + local.set $l6771 + local.get $l6770 + local.get $l6771 + i32.add + local.set $l6772 + local.get $l6771 + local.get $l6772 + i32.add + local.set $l6773 + local.get $l6772 + local.get $l6773 + i32.add + local.set $l6774 + local.get $l6773 + local.get $l6774 + i32.add + local.set $l6775 + local.get $l6774 + local.get $l6775 + i32.add + local.set $l6776 + local.get $l6775 + local.get $l6776 + i32.add + local.set $l6777 + local.get $l6776 + local.get $l6777 + i32.add + local.set $l6778 + local.get $l6777 + local.get $l6778 + i32.add + local.set $l6779 + local.get $l6778 + local.get $l6779 + i32.add + local.set $l6780 + local.get $l6779 + local.get $l6780 + i32.add + local.set $l6781 + local.get $l6780 + local.get $l6781 + i32.add + local.set $l6782 + local.get $l6781 + local.get $l6782 + i32.add + local.set $l6783 + local.get $l6782 + local.get $l6783 + i32.add + local.set $l6784 + local.get $l6783 + local.get $l6784 + i32.add + local.set $l6785 + local.get $l6784 + local.get $l6785 + i32.add + local.set $l6786 + local.get $l6785 + local.get $l6786 + i32.add + local.set $l6787 + local.get $l6786 + local.get $l6787 + i32.add + local.set $l6788 + local.get $l6787 + local.get $l6788 + i32.add + local.set $l6789 + local.get $l6788 + local.get $l6789 + i32.add + local.set $l6790 + local.get $l6789 + local.get $l6790 + i32.add + local.set $l6791 + local.get $l6790 + local.get $l6791 + i32.add + local.set $l6792 + local.get $l6791 + local.get $l6792 + i32.add + local.set $l6793 + local.get $l6792 + local.get $l6793 + i32.add + local.set $l6794 + local.get $l6793 + local.get $l6794 + i32.add + local.set $l6795 + local.get $l6794 + local.get $l6795 + i32.add + local.set $l6796 + local.get $l6795 + local.get $l6796 + i32.add + local.set $l6797 + local.get $l6796 + local.get $l6797 + i32.add + local.set $l6798 + local.get $l6797 + local.get $l6798 + i32.add + local.set $l6799 + local.get $l6798 + local.get $l6799 + i32.add + local.set $l6800 + local.get $l6799 + local.get $l6800 + i32.add + local.set $l6801 + local.get $l6800 + local.get $l6801 + i32.add + local.set $l6802 + local.get $l6801 + local.get $l6802 + i32.add + local.set $l6803 + local.get $l6802 + local.get $l6803 + i32.add + local.set $l6804 + local.get $l6803 + local.get $l6804 + i32.add + local.set $l6805 + local.get $l6804 + local.get $l6805 + i32.add + local.set $l6806 + local.get $l6805 + local.get $l6806 + i32.add + local.set $l6807 + local.get $l6806 + local.get $l6807 + i32.add + local.set $l6808 + local.get $l6807 + local.get $l6808 + i32.add + local.set $l6809 + local.get $l6808 + local.get $l6809 + i32.add + local.set $l6810 + local.get $l6809 + local.get $l6810 + i32.add + local.set $l6811 + local.get $l6810 + local.get $l6811 + i32.add + local.set $l6812 + local.get $l6811 + local.get $l6812 + i32.add + local.set $l6813 + local.get $l6812 + local.get $l6813 + i32.add + local.set $l6814 + local.get $l6813 + local.get $l6814 + i32.add + local.set $l6815 + local.get $l6814 + local.get $l6815 + i32.add + local.set $l6816 + local.get $l6815 + local.get $l6816 + i32.add + local.set $l6817 + local.get $l6816 + local.get $l6817 + i32.add + local.set $l6818 + local.get $l6817 + local.get $l6818 + i32.add + local.set $l6819 + local.get $l6818 + local.get $l6819 + i32.add + local.set $l6820 + local.get $l6819 + local.get $l6820 + i32.add + local.set $l6821 + local.get $l6820 + local.get $l6821 + i32.add + local.set $l6822 + local.get $l6821 + local.get $l6822 + i32.add + local.set $l6823 + local.get $l6822 + local.get $l6823 + i32.add + local.set $l6824 + local.get $l6823 + local.get $l6824 + i32.add + local.set $l6825 + local.get $l6824 + local.get $l6825 + i32.add + local.set $l6826 + local.get $l6825 + local.get $l6826 + i32.add + local.set $l6827 + local.get $l6826 + local.get $l6827 + i32.add + local.set $l6828 + local.get $l6827 + local.get $l6828 + i32.add + local.set $l6829 + local.get $l6828 + local.get $l6829 + i32.add + local.set $l6830 + local.get $l6829 + local.get $l6830 + i32.add + local.set $l6831 + local.get $l6830 + local.get $l6831 + i32.add + local.set $l6832 + local.get $l6831 + local.get $l6832 + i32.add + local.set $l6833 + local.get $l6832 + local.get $l6833 + i32.add + local.set $l6834 + local.get $l6833 + local.get $l6834 + i32.add + local.set $l6835 + local.get $l6834 + local.get $l6835 + i32.add + local.set $l6836 + local.get $l6835 + local.get $l6836 + i32.add + local.set $l6837 + local.get $l6836 + local.get $l6837 + i32.add + local.set $l6838 + local.get $l6837 + local.get $l6838 + i32.add + local.set $l6839 + local.get $l6838 + local.get $l6839 + i32.add + local.set $l6840 + local.get $l6839 + local.get $l6840 + i32.add + local.set $l6841 + local.get $l6840 + local.get $l6841 + i32.add + local.set $l6842 + local.get $l6841 + local.get $l6842 + i32.add + local.set $l6843 + local.get $l6842 + local.get $l6843 + i32.add + local.set $l6844 + local.get $l6843 + local.get $l6844 + i32.add + local.set $l6845 + local.get $l6844 + local.get $l6845 + i32.add + local.set $l6846 + local.get $l6845 + local.get $l6846 + i32.add + local.set $l6847 + local.get $l6846 + local.get $l6847 + i32.add + local.set $l6848 + local.get $l6847 + local.get $l6848 + i32.add + local.set $l6849 + local.get $l6848 + local.get $l6849 + i32.add + local.set $l6850 + local.get $l6849 + local.get $l6850 + i32.add + local.set $l6851 + local.get $l6850 + local.get $l6851 + i32.add + local.set $l6852 + local.get $l6851 + local.get $l6852 + i32.add + local.set $l6853 + local.get $l6852 + local.get $l6853 + i32.add + local.set $l6854 + local.get $l6853 + local.get $l6854 + i32.add + local.set $l6855 + local.get $l6854 + local.get $l6855 + i32.add + local.set $l6856 + local.get $l6855 + local.get $l6856 + i32.add + local.set $l6857 + local.get $l6856 + local.get $l6857 + i32.add + local.set $l6858 + local.get $l6857 + local.get $l6858 + i32.add + local.set $l6859 + local.get $l6858 + local.get $l6859 + i32.add + local.set $l6860 + local.get $l6859 + local.get $l6860 + i32.add + local.set $l6861 + local.get $l6860 + local.get $l6861 + i32.add + local.set $l6862 + local.get $l6861 + local.get $l6862 + i32.add + local.set $l6863 + local.get $l6862 + local.get $l6863 + i32.add + local.set $l6864 + local.get $l6863 + local.get $l6864 + i32.add + local.set $l6865 + local.get $l6864 + local.get $l6865 + i32.add + local.set $l6866 + local.get $l6865 + local.get $l6866 + i32.add + local.set $l6867 + local.get $l6866 + local.get $l6867 + i32.add + local.set $l6868 + local.get $l6867 + local.get $l6868 + i32.add + local.set $l6869 + local.get $l6868 + local.get $l6869 + i32.add + local.set $l6870 + local.get $l6869 + local.get $l6870 + i32.add + local.set $l6871 + local.get $l6870 + local.get $l6871 + i32.add + local.set $l6872 + local.get $l6871 + local.get $l6872 + i32.add + local.set $l6873 + local.get $l6872 + local.get $l6873 + i32.add + local.set $l6874 + local.get $l6873 + local.get $l6874 + i32.add + local.set $l6875 + local.get $l6874 + local.get $l6875 + i32.add + local.set $l6876 + local.get $l6875 + local.get $l6876 + i32.add + local.set $l6877 + local.get $l6876 + local.get $l6877 + i32.add + local.set $l6878 + local.get $l6877 + local.get $l6878 + i32.add + local.set $l6879 + local.get $l6878 + local.get $l6879 + i32.add + local.set $l6880 + local.get $l6879 + local.get $l6880 + i32.add + local.set $l6881 + local.get $l6880 + local.get $l6881 + i32.add + local.set $l6882 + local.get $l6881 + local.get $l6882 + i32.add + local.set $l6883 + local.get $l6882 + local.get $l6883 + i32.add + local.set $l6884 + local.get $l6883 + local.get $l6884 + i32.add + local.set $l6885 + local.get $l6884 + local.get $l6885 + i32.add + local.set $l6886 + local.get $l6885 + local.get $l6886 + i32.add + local.set $l6887 + local.get $l6886 + local.get $l6887 + i32.add + local.set $l6888 + local.get $l6887 + local.get $l6888 + i32.add + local.set $l6889 + local.get $l6888 + local.get $l6889 + i32.add + local.set $l6890 + local.get $l6889 + local.get $l6890 + i32.add + local.set $l6891 + local.get $l6890 + local.get $l6891 + i32.add + local.set $l6892 + local.get $l6891 + local.get $l6892 + i32.add + local.set $l6893 + local.get $l6892 + local.get $l6893 + i32.add + local.set $l6894 + local.get $l6893 + local.get $l6894 + i32.add + local.set $l6895 + local.get $l6894 + local.get $l6895 + i32.add + local.set $l6896 + local.get $l6895 + local.get $l6896 + i32.add + local.set $l6897 + local.get $l6896 + local.get $l6897 + i32.add + local.set $l6898 + local.get $l6897 + local.get $l6898 + i32.add + local.set $l6899 + local.get $l6898 + local.get $l6899 + i32.add + local.set $l6900 + local.get $l6899 + local.get $l6900 + i32.add + local.set $l6901 + local.get $l6900 + local.get $l6901 + i32.add + local.set $l6902 + local.get $l6901 + local.get $l6902 + i32.add + local.set $l6903 + local.get $l6902 + local.get $l6903 + i32.add + local.set $l6904 + local.get $l6903 + local.get $l6904 + i32.add + local.set $l6905 + local.get $l6904 + local.get $l6905 + i32.add + local.set $l6906 + local.get $l6905 + local.get $l6906 + i32.add + local.set $l6907 + local.get $l6906 + local.get $l6907 + i32.add + local.set $l6908 + local.get $l6907 + local.get $l6908 + i32.add + local.set $l6909 + local.get $l6908 + local.get $l6909 + i32.add + local.set $l6910 + local.get $l6909 + local.get $l6910 + i32.add + local.set $l6911 + local.get $l6910 + local.get $l6911 + i32.add + local.set $l6912 + local.get $l6911 + local.get $l6912 + i32.add + local.set $l6913 + local.get $l6912 + local.get $l6913 + i32.add + local.set $l6914 + local.get $l6913 + local.get $l6914 + i32.add + local.set $l6915 + local.get $l6914 + local.get $l6915 + i32.add + local.set $l6916 + local.get $l6915 + local.get $l6916 + i32.add + local.set $l6917 + local.get $l6916 + local.get $l6917 + i32.add + local.set $l6918 + local.get $l6917 + local.get $l6918 + i32.add + local.set $l6919 + local.get $l6918 + local.get $l6919 + i32.add + local.set $l6920 + local.get $l6919 + local.get $l6920 + i32.add + local.set $l6921 + local.get $l6920 + local.get $l6921 + i32.add + local.set $l6922 + local.get $l6921 + local.get $l6922 + i32.add + local.set $l6923 + local.get $l6922 + local.get $l6923 + i32.add + local.set $l6924 + local.get $l6923 + local.get $l6924 + i32.add + local.set $l6925 + local.get $l6924 + local.get $l6925 + i32.add + local.set $l6926 + local.get $l6925 + local.get $l6926 + i32.add + local.set $l6927 + local.get $l6926 + local.get $l6927 + i32.add + local.set $l6928 + local.get $l6927 + local.get $l6928 + i32.add + local.set $l6929 + local.get $l6928 + local.get $l6929 + i32.add + local.set $l6930 + local.get $l6929 + local.get $l6930 + i32.add + local.set $l6931 + local.get $l6930 + local.get $l6931 + i32.add + local.set $l6932 + local.get $l6931 + local.get $l6932 + i32.add + local.set $l6933 + local.get $l6932 + local.get $l6933 + i32.add + local.set $l6934 + local.get $l6933 + local.get $l6934 + i32.add + local.set $l6935 + local.get $l6934 + local.get $l6935 + i32.add + local.set $l6936 + local.get $l6935 + local.get $l6936 + i32.add + local.set $l6937 + local.get $l6936 + local.get $l6937 + i32.add + local.set $l6938 + local.get $l6937 + local.get $l6938 + i32.add + local.set $l6939 + local.get $l6938 + local.get $l6939 + i32.add + local.set $l6940 + local.get $l6939 + local.get $l6940 + i32.add + local.set $l6941 + local.get $l6940 + local.get $l6941 + i32.add + local.set $l6942 + local.get $l6941 + local.get $l6942 + i32.add + local.set $l6943 + local.get $l6942 + local.get $l6943 + i32.add + local.set $l6944 + local.get $l6943 + local.get $l6944 + i32.add + local.set $l6945 + local.get $l6944 + local.get $l6945 + i32.add + local.set $l6946 + local.get $l6945 + local.get $l6946 + i32.add + local.set $l6947 + local.get $l6946 + local.get $l6947 + i32.add + local.set $l6948 + local.get $l6947 + local.get $l6948 + i32.add + local.set $l6949 + local.get $l6948 + local.get $l6949 + i32.add + local.set $l6950 + local.get $l6949 + local.get $l6950 + i32.add + local.set $l6951 + local.get $l6950 + local.get $l6951 + i32.add + local.set $l6952 + local.get $l6951 + local.get $l6952 + i32.add + local.set $l6953 + local.get $l6952 + local.get $l6953 + i32.add + local.set $l6954 + local.get $l6953 + local.get $l6954 + i32.add + local.set $l6955 + local.get $l6954 + local.get $l6955 + i32.add + local.set $l6956 + local.get $l6955 + local.get $l6956 + i32.add + local.set $l6957 + local.get $l6956 + local.get $l6957 + i32.add + local.set $l6958 + local.get $l6957 + local.get $l6958 + i32.add + local.set $l6959 + local.get $l6958 + local.get $l6959 + i32.add + local.set $l6960 + local.get $l6959 + local.get $l6960 + i32.add + local.set $l6961 + local.get $l6960 + local.get $l6961 + i32.add + local.set $l6962 + local.get $l6961 + local.get $l6962 + i32.add + local.set $l6963 + local.get $l6962 + local.get $l6963 + i32.add + local.set $l6964 + local.get $l6963 + local.get $l6964 + i32.add + local.set $l6965 + local.get $l6964 + local.get $l6965 + i32.add + local.set $l6966 + local.get $l6965 + local.get $l6966 + i32.add + local.set $l6967 + local.get $l6966 + local.get $l6967 + i32.add + local.set $l6968 + local.get $l6967 + local.get $l6968 + i32.add + local.set $l6969 + local.get $l6968 + local.get $l6969 + i32.add + local.set $l6970 + local.get $l6969 + local.get $l6970 + i32.add + local.set $l6971 + local.get $l6970 + local.get $l6971 + i32.add + local.set $l6972 + local.get $l6971 + local.get $l6972 + i32.add + local.set $l6973 + local.get $l6972 + local.get $l6973 + i32.add + local.set $l6974 + local.get $l6973 + local.get $l6974 + i32.add + local.set $l6975 + local.get $l6974 + local.get $l6975 + i32.add + local.set $l6976 + local.get $l6975 + local.get $l6976 + i32.add + local.set $l6977 + local.get $l6976 + local.get $l6977 + i32.add + local.set $l6978 + local.get $l6977 + local.get $l6978 + i32.add + local.set $l6979 + local.get $l6978 + local.get $l6979 + i32.add + local.set $l6980 + local.get $l6979 + local.get $l6980 + i32.add + local.set $l6981 + local.get $l6980 + local.get $l6981 + i32.add + local.set $l6982 + local.get $l6981 + local.get $l6982 + i32.add + local.set $l6983 + local.get $l6982 + local.get $l6983 + i32.add + local.set $l6984 + local.get $l6983 + local.get $l6984 + i32.add + local.set $l6985 + local.get $l6984 + local.get $l6985 + i32.add + local.set $l6986 + local.get $l6985 + local.get $l6986 + i32.add + local.set $l6987 + local.get $l6986 + local.get $l6987 + i32.add + local.set $l6988 + local.get $l6987 + local.get $l6988 + i32.add + local.set $l6989 + local.get $l6988 + local.get $l6989 + i32.add + local.set $l6990 + local.get $l6989 + local.get $l6990 + i32.add + local.set $l6991 + local.get $l6990 + local.get $l6991 + i32.add + local.set $l6992 + local.get $l6991 + local.get $l6992 + i32.add + local.set $l6993 + local.get $l6992 + local.get $l6993 + i32.add + local.set $l6994 + local.get $l6993 + local.get $l6994 + i32.add + local.set $l6995 + local.get $l6994 + local.get $l6995 + i32.add + local.set $l6996 + local.get $l6995 + local.get $l6996 + i32.add + local.set $l6997 + local.get $l6996 + local.get $l6997 + i32.add + local.set $l6998 + local.get $l6997 + local.get $l6998 + i32.add + local.set $l6999 + local.get $l6998 + local.get $l6999 + i32.add + local.set $l7000 + local.get $l6999 + local.get $l7000 + i32.add + local.set $l7001 + local.get $l7000 + local.get $l7001 + i32.add + local.set $l7002 + local.get $l7001 + local.get $l7002 + i32.add + local.set $l7003 + local.get $l7002 + local.get $l7003 + i32.add + local.set $l7004 + local.get $l7003 + local.get $l7004 + i32.add + local.set $l7005 + local.get $l7004 + local.get $l7005 + i32.add + local.set $l7006 + local.get $l7005 + local.get $l7006 + i32.add + local.set $l7007 + local.get $l7006 + local.get $l7007 + i32.add + local.set $l7008 + local.get $l7007 + local.get $l7008 + i32.add + local.set $l7009 + local.get $l7008 + local.get $l7009 + i32.add + local.set $l7010 + local.get $l7009 + local.get $l7010 + i32.add + local.set $l7011 + local.get $l7010 + local.get $l7011 + i32.add + local.set $l7012 + local.get $l7011 + local.get $l7012 + i32.add + local.set $l7013 + local.get $l7012 + local.get $l7013 + i32.add + local.set $l7014 + local.get $l7013 + local.get $l7014 + i32.add + local.set $l7015 + local.get $l7014 + local.get $l7015 + i32.add + local.set $l7016 + local.get $l7015 + local.get $l7016 + i32.add + local.set $l7017 + local.get $l7016 + local.get $l7017 + i32.add + local.set $l7018 + local.get $l7017 + local.get $l7018 + i32.add + local.set $l7019 + local.get $l7018 + local.get $l7019 + i32.add + local.set $l7020 + local.get $l7019 + local.get $l7020 + i32.add + local.set $l7021 + local.get $l7020 + local.get $l7021 + i32.add + local.set $l7022 + local.get $l7021 + local.get $l7022 + i32.add + local.set $l7023 + local.get $l7022 + local.get $l7023 + i32.add + local.set $l7024 + local.get $l7023 + local.get $l7024 + i32.add + local.set $l7025 + local.get $l7024 + local.get $l7025 + i32.add + local.set $l7026 + local.get $l7025 + local.get $l7026 + i32.add + local.set $l7027 + local.get $l7026 + local.get $l7027 + i32.add + local.set $l7028 + local.get $l7027 + local.get $l7028 + i32.add + local.set $l7029 + local.get $l7028 + local.get $l7029 + i32.add + local.set $l7030 + local.get $l7029 + local.get $l7030 + i32.add + local.set $l7031 + local.get $l7030 + local.get $l7031 + i32.add + local.set $l7032 + local.get $l7031 + local.get $l7032 + i32.add + local.set $l7033 + local.get $l7032 + local.get $l7033 + i32.add + local.set $l7034 + local.get $l7033 + local.get $l7034 + i32.add + local.set $l7035 + local.get $l7034 + local.get $l7035 + i32.add + local.set $l7036 + local.get $l7035 + local.get $l7036 + i32.add + local.set $l7037 + local.get $l7036 + local.get $l7037 + i32.add + local.set $l7038 + local.get $l7037 + local.get $l7038 + i32.add + local.set $l7039 + local.get $l7038 + local.get $l7039 + i32.add + local.set $l7040 + local.get $l7039 + local.get $l7040 + i32.add + local.set $l7041 + local.get $l7040 + local.get $l7041 + i32.add + local.set $l7042 + local.get $l7041 + local.get $l7042 + i32.add + local.set $l7043 + local.get $l7042 + local.get $l7043 + i32.add + local.set $l7044 + local.get $l7043 + local.get $l7044 + i32.add + local.set $l7045 + local.get $l7044 + local.get $l7045 + i32.add + local.set $l7046 + local.get $l7045 + local.get $l7046 + i32.add + local.set $l7047 + local.get $l7046 + local.get $l7047 + i32.add + local.set $l7048 + local.get $l7047 + local.get $l7048 + i32.add + local.set $l7049 + local.get $l7048 + local.get $l7049 + i32.add + local.set $l7050 + local.get $l7049 + local.get $l7050 + i32.add + local.set $l7051 + local.get $l7050 + local.get $l7051 + i32.add + local.set $l7052 + local.get $l7051 + local.get $l7052 + i32.add + local.set $l7053 + local.get $l7052 + local.get $l7053 + i32.add + local.set $l7054 + local.get $l7053 + local.get $l7054 + i32.add + local.set $l7055 + local.get $l7054 + local.get $l7055 + i32.add + local.set $l7056 + local.get $l7055 + local.get $l7056 + i32.add + local.set $l7057 + local.get $l7056 + local.get $l7057 + i32.add + local.set $l7058 + local.get $l7057 + local.get $l7058 + i32.add + local.set $l7059 + local.get $l7058 + local.get $l7059 + i32.add + local.set $l7060 + local.get $l7059 + local.get $l7060 + i32.add + local.set $l7061 + local.get $l7060 + local.get $l7061 + i32.add + local.set $l7062 + local.get $l7061 + local.get $l7062 + i32.add + local.set $l7063 + local.get $l7062 + local.get $l7063 + i32.add + local.set $l7064 + local.get $l7063 + local.get $l7064 + i32.add + local.set $l7065 + local.get $l7064 + local.get $l7065 + i32.add + local.set $l7066 + local.get $l7065 + local.get $l7066 + i32.add + local.set $l7067 + local.get $l7066 + local.get $l7067 + i32.add + local.set $l7068 + local.get $l7067 + local.get $l7068 + i32.add + local.set $l7069 + local.get $l7068 + local.get $l7069 + i32.add + local.set $l7070 + local.get $l7069 + local.get $l7070 + i32.add + local.set $l7071 + local.get $l7070 + local.get $l7071 + i32.add + local.set $l7072 + local.get $l7071 + local.get $l7072 + i32.add + local.set $l7073 + local.get $l7072 + local.get $l7073 + i32.add + local.set $l7074 + local.get $l7073 + local.get $l7074 + i32.add + local.set $l7075 + local.get $l7074 + local.get $l7075 + i32.add + local.set $l7076 + local.get $l7075 + local.get $l7076 + i32.add + local.set $l7077 + local.get $l7076 + local.get $l7077 + i32.add + local.set $l7078 + local.get $l7077 + local.get $l7078 + i32.add + local.set $l7079 + local.get $l7078 + local.get $l7079 + i32.add + local.set $l7080 + local.get $l7079 + local.get $l7080 + i32.add + local.set $l7081 + local.get $l7080 + local.get $l7081 + i32.add + local.set $l7082 + local.get $l7081 + local.get $l7082 + i32.add + local.set $l7083 + local.get $l7082 + local.get $l7083 + i32.add + local.set $l7084 + local.get $l7083 + local.get $l7084 + i32.add + local.set $l7085 + local.get $l7084 + local.get $l7085 + i32.add + local.set $l7086 + local.get $l7085 + local.get $l7086 + i32.add + local.set $l7087 + local.get $l7086 + local.get $l7087 + i32.add + local.set $l7088 + local.get $l7087 + local.get $l7088 + i32.add + local.set $l7089 + local.get $l7088 + local.get $l7089 + i32.add + local.set $l7090 + local.get $l7089 + local.get $l7090 + i32.add + local.set $l7091 + local.get $l7090 + local.get $l7091 + i32.add + local.set $l7092 + local.get $l7091 + local.get $l7092 + i32.add + local.set $l7093 + local.get $l7092 + local.get $l7093 + i32.add + local.set $l7094 + local.get $l7093 + local.get $l7094 + i32.add + local.set $l7095 + local.get $l7094 + local.get $l7095 + i32.add + local.set $l7096 + local.get $l7095 + local.get $l7096 + i32.add + local.set $l7097 + local.get $l7096 + local.get $l7097 + i32.add + local.set $l7098 + local.get $l7097 + local.get $l7098 + i32.add + local.set $l7099 + local.get $l7098 + local.get $l7099 + i32.add + local.set $l7100 + local.get $l7099 + local.get $l7100 + i32.add + local.set $l7101 + local.get $l7100 + local.get $l7101 + i32.add + local.set $l7102 + local.get $l7101 + local.get $l7102 + i32.add + local.set $l7103 + local.get $l7102 + local.get $l7103 + i32.add + local.set $l7104 + local.get $l7103 + local.get $l7104 + i32.add + local.set $l7105 + local.get $l7104 + local.get $l7105 + i32.add + local.set $l7106 + local.get $l7105 + local.get $l7106 + i32.add + local.set $l7107 + local.get $l7106 + local.get $l7107 + i32.add + local.set $l7108 + local.get $l7107 + local.get $l7108 + i32.add + local.set $l7109 + local.get $l7108 + local.get $l7109 + i32.add + local.set $l7110 + local.get $l7109 + local.get $l7110 + i32.add + local.set $l7111 + local.get $l7110 + local.get $l7111 + i32.add + local.set $l7112 + local.get $l7111 + local.get $l7112 + i32.add + local.set $l7113 + local.get $l7112 + local.get $l7113 + i32.add + local.set $l7114 + local.get $l7113 + local.get $l7114 + i32.add + local.set $l7115 + local.get $l7114 + local.get $l7115 + i32.add + local.set $l7116 + local.get $l7115 + local.get $l7116 + i32.add + local.set $l7117 + local.get $l7116 + local.get $l7117 + i32.add + local.set $l7118 + local.get $l7117 + local.get $l7118 + i32.add + local.set $l7119 + local.get $l7118 + local.get $l7119 + i32.add + local.set $l7120 + local.get $l7119 + local.get $l7120 + i32.add + local.set $l7121 + local.get $l7120 + local.get $l7121 + i32.add + local.set $l7122 + local.get $l7121 + local.get $l7122 + i32.add + local.set $l7123 + local.get $l7122 + local.get $l7123 + i32.add + local.set $l7124 + local.get $l7123 + local.get $l7124 + i32.add + local.set $l7125 + local.get $l7124 + local.get $l7125 + i32.add + local.set $l7126 + local.get $l7125 + local.get $l7126 + i32.add + local.set $l7127 + local.get $l7126 + local.get $l7127 + i32.add + local.set $l7128 + local.get $l7127 + local.get $l7128 + i32.add + local.set $l7129 + local.get $l7128 + local.get $l7129 + i32.add + local.set $l7130 + local.get $l7129 + local.get $l7130 + i32.add + local.set $l7131 + local.get $l7130 + local.get $l7131 + i32.add + local.set $l7132 + local.get $l7131 + local.get $l7132 + i32.add + local.set $l7133 + local.get $l7132 + local.get $l7133 + i32.add + local.set $l7134 + local.get $l7133 + local.get $l7134 + i32.add + local.set $l7135 + local.get $l7134 + local.get $l7135 + i32.add + local.set $l7136 + local.get $l7135 + local.get $l7136 + i32.add + local.set $l7137 + local.get $l7136 + local.get $l7137 + i32.add + local.set $l7138 + local.get $l7137 + local.get $l7138 + i32.add + local.set $l7139 + local.get $l7138 + local.get $l7139 + i32.add + local.set $l7140 + local.get $l7139 + local.get $l7140 + i32.add + local.set $l7141 + local.get $l7140 + local.get $l7141 + i32.add + local.set $l7142 + local.get $l7141 + local.get $l7142 + i32.add + local.set $l7143 + local.get $l7142 + local.get $l7143 + i32.add + local.set $l7144 + local.get $l7143 + local.get $l7144 + i32.add + local.set $l7145 + local.get $l7144 + local.get $l7145 + i32.add + local.set $l7146 + local.get $l7145 + local.get $l7146 + i32.add + local.set $l7147 + local.get $l7146 + local.get $l7147 + i32.add + local.set $l7148 + local.get $l7147 + local.get $l7148 + i32.add + local.set $l7149 + local.get $l7148 + local.get $l7149 + i32.add + local.set $l7150 + local.get $l7149 + local.get $l7150 + i32.add + local.set $l7151 + local.get $l7150 + local.get $l7151 + i32.add + local.set $l7152 + local.get $l7151 + local.get $l7152 + i32.add + local.set $l7153 + local.get $l7152 + local.get $l7153 + i32.add + local.set $l7154 + local.get $l7153 + local.get $l7154 + i32.add + local.set $l7155 + local.get $l7154 + local.get $l7155 + i32.add + local.set $l7156 + local.get $l7155 + local.get $l7156 + i32.add + local.set $l7157 + local.get $l7156 + local.get $l7157 + i32.add + local.set $l7158 + local.get $l7157 + local.get $l7158 + i32.add + local.set $l7159 + local.get $l7158 + local.get $l7159 + i32.add + local.set $l7160 + local.get $l7159 + local.get $l7160 + i32.add + local.set $l7161 + local.get $l7160 + local.get $l7161 + i32.add + local.set $l7162 + local.get $l7161 + local.get $l7162 + i32.add + local.set $l7163 + local.get $l7162 + local.get $l7163 + i32.add + local.set $l7164 + local.get $l7163 + local.get $l7164 + i32.add + local.set $l7165 + local.get $l7164 + local.get $l7165 + i32.add + local.set $l7166 + local.get $l7165 + local.get $l7166 + i32.add + local.set $l7167 + local.get $l7166 + local.get $l7167 + i32.add + local.set $l7168 + local.get $l7167 + local.get $l7168 + i32.add + local.set $l7169 + local.get $l7168 + local.get $l7169 + i32.add + local.set $l7170 + local.get $l7169 + local.get $l7170 + i32.add + local.set $l7171 + local.get $l7170 + local.get $l7171 + i32.add + local.set $l7172 + local.get $l7171 + local.get $l7172 + i32.add + local.set $l7173 + local.get $l7172 + local.get $l7173 + i32.add + local.set $l7174 + local.get $l7173 + local.get $l7174 + i32.add + local.set $l7175 + local.get $l7174 + local.get $l7175 + i32.add + local.set $l7176 + local.get $l7175 + local.get $l7176 + i32.add + local.set $l7177 + local.get $l7176 + local.get $l7177 + i32.add + local.set $l7178 + local.get $l7177 + local.get $l7178 + i32.add + local.set $l7179 + local.get $l7178 + local.get $l7179 + i32.add + local.set $l7180 + local.get $l7179 + local.get $l7180 + i32.add + local.set $l7181 + local.get $l7180 + local.get $l7181 + i32.add + local.set $l7182 + local.get $l7181 + local.get $l7182 + i32.add + local.set $l7183 + local.get $l7182 + local.get $l7183 + i32.add + local.set $l7184 + local.get $l7183 + local.get $l7184 + i32.add + local.set $l7185 + local.get $l7184 + local.get $l7185 + i32.add + local.set $l7186 + local.get $l7185 + local.get $l7186 + i32.add + local.set $l7187 + local.get $l7186 + local.get $l7187 + i32.add + local.set $l7188 + local.get $l7187 + local.get $l7188 + i32.add + local.set $l7189 + local.get $l7188 + local.get $l7189 + i32.add + local.set $l7190 + local.get $l7189 + local.get $l7190 + i32.add + local.set $l7191 + local.get $l7190 + local.get $l7191 + i32.add + local.set $l7192 + local.get $l7191 + local.get $l7192 + i32.add + local.set $l7193 + local.get $l7192 + local.get $l7193 + i32.add + local.set $l7194 + local.get $l7193 + local.get $l7194 + i32.add + local.set $l7195 + local.get $l7194 + local.get $l7195 + i32.add + local.set $l7196 + local.get $l7195 + local.get $l7196 + i32.add + local.set $l7197 + local.get $l7196 + local.get $l7197 + i32.add + local.set $l7198 + local.get $l7197 + local.get $l7198 + i32.add + local.set $l7199 + local.get $l7198 + local.get $l7199 + i32.add + local.set $l7200 + local.get $l7199 + local.get $l7200 + i32.add + local.set $l7201 + local.get $l7200 + local.get $l7201 + i32.add + local.set $l7202 + local.get $l7201 + local.get $l7202 + i32.add + local.set $l7203 + local.get $l7202 + local.get $l7203 + i32.add + local.set $l7204 + local.get $l7203 + local.get $l7204 + i32.add + local.set $l7205 + local.get $l7204 + local.get $l7205 + i32.add + local.set $l7206 + local.get $l7205 + local.get $l7206 + i32.add + local.set $l7207 + local.get $l7206 + local.get $l7207 + i32.add + local.set $l7208 + local.get $l7207 + local.get $l7208 + i32.add + local.set $l7209 + local.get $l7208 + local.get $l7209 + i32.add + local.set $l7210 + local.get $l7209 + local.get $l7210 + i32.add + local.set $l7211 + local.get $l7210 + local.get $l7211 + i32.add + local.set $l7212 + local.get $l7211 + local.get $l7212 + i32.add + local.set $l7213 + local.get $l7212 + local.get $l7213 + i32.add + local.set $l7214 + local.get $l7213 + local.get $l7214 + i32.add + local.set $l7215 + local.get $l7214 + local.get $l7215 + i32.add + local.set $l7216 + local.get $l7215 + local.get $l7216 + i32.add + local.set $l7217 + local.get $l7216 + local.get $l7217 + i32.add + local.set $l7218 + local.get $l7217 + local.get $l7218 + i32.add + local.set $l7219 + local.get $l7218 + local.get $l7219 + i32.add + local.set $l7220 + local.get $l7219 + local.get $l7220 + i32.add + local.set $l7221 + local.get $l7220 + local.get $l7221 + i32.add + local.set $l7222 + local.get $l7221 + local.get $l7222 + i32.add + local.set $l7223 + local.get $l7222 + local.get $l7223 + i32.add + local.set $l7224 + local.get $l7223 + local.get $l7224 + i32.add + local.set $l7225 + local.get $l7224 + local.get $l7225 + i32.add + local.set $l7226 + local.get $l7225 + local.get $l7226 + i32.add + local.set $l7227 + local.get $l7226 + local.get $l7227 + i32.add + local.set $l7228 + local.get $l7227 + local.get $l7228 + i32.add + local.set $l7229 + local.get $l7228 + local.get $l7229 + i32.add + local.set $l7230 + local.get $l7229 + local.get $l7230 + i32.add + local.set $l7231 + local.get $l7230 + local.get $l7231 + i32.add + local.set $l7232 + local.get $l7231 + local.get $l7232 + i32.add + local.set $l7233 + local.get $l7232 + local.get $l7233 + i32.add + local.set $l7234 + local.get $l7233 + local.get $l7234 + i32.add + local.set $l7235 + local.get $l7234 + local.get $l7235 + i32.add + local.set $l7236 + local.get $l7235 + local.get $l7236 + i32.add + local.set $l7237 + local.get $l7236 + local.get $l7237 + i32.add + local.set $l7238 + local.get $l7237 + local.get $l7238 + i32.add + local.set $l7239 + local.get $l7238 + local.get $l7239 + i32.add + local.set $l7240 + local.get $l7239 + local.get $l7240 + i32.add + local.set $l7241 + local.get $l7240 + local.get $l7241 + i32.add + local.set $l7242 + local.get $l7241 + local.get $l7242 + i32.add + local.set $l7243 + local.get $l7242 + local.get $l7243 + i32.add + local.set $l7244 + local.get $l7243 + local.get $l7244 + i32.add + local.set $l7245 + local.get $l7244 + local.get $l7245 + i32.add + local.set $l7246 + local.get $l7245 + local.get $l7246 + i32.add + local.set $l7247 + local.get $l7246 + local.get $l7247 + i32.add + local.set $l7248 + local.get $l7247 + local.get $l7248 + i32.add + local.set $l7249 + local.get $l7248 + local.get $l7249 + i32.add + local.set $l7250 + local.get $l7249 + local.get $l7250 + i32.add + local.set $l7251 + local.get $l7250 + local.get $l7251 + i32.add + local.set $l7252 + local.get $l7251 + local.get $l7252 + i32.add + local.set $l7253 + local.get $l7252 + local.get $l7253 + i32.add + local.set $l7254 + local.get $l7253 + local.get $l7254 + i32.add + local.set $l7255 + local.get $l7254 + local.get $l7255 + i32.add + local.set $l7256 + local.get $l7255 + local.get $l7256 + i32.add + local.set $l7257 + local.get $l7256 + local.get $l7257 + i32.add + local.set $l7258 + local.get $l7257 + local.get $l7258 + i32.add + local.set $l7259 + local.get $l7258 + local.get $l7259 + i32.add + local.set $l7260 + local.get $l7259 + local.get $l7260 + i32.add + local.set $l7261 + local.get $l7260 + local.get $l7261 + i32.add + local.set $l7262 + local.get $l7261 + local.get $l7262 + i32.add + local.set $l7263 + local.get $l7262 + local.get $l7263 + i32.add + local.set $l7264 + local.get $l7263 + local.get $l7264 + i32.add + local.set $l7265 + local.get $l7264 + local.get $l7265 + i32.add + local.set $l7266 + local.get $l7265 + local.get $l7266 + i32.add + local.set $l7267 + local.get $l7266 + local.get $l7267 + i32.add + local.set $l7268 + local.get $l7267 + local.get $l7268 + i32.add + local.set $l7269 + local.get $l7268 + local.get $l7269 + i32.add + local.set $l7270 + local.get $l7269 + local.get $l7270 + i32.add + local.set $l7271 + local.get $l7270 + local.get $l7271 + i32.add + local.set $l7272 + local.get $l7271 + local.get $l7272 + i32.add + local.set $l7273 + local.get $l7272 + local.get $l7273 + i32.add + local.set $l7274 + local.get $l7273 + local.get $l7274 + i32.add + local.set $l7275 + local.get $l7274 + local.get $l7275 + i32.add + local.set $l7276 + local.get $l7275 + local.get $l7276 + i32.add + local.set $l7277 + local.get $l7276 + local.get $l7277 + i32.add + local.set $l7278 + local.get $l7277 + local.get $l7278 + i32.add + local.set $l7279 + local.get $l7278 + local.get $l7279 + i32.add + local.set $l7280 + local.get $l7279 + local.get $l7280 + i32.add + local.set $l7281 + local.get $l7280 + local.get $l7281 + i32.add + local.set $l7282 + local.get $l7281 + local.get $l7282 + i32.add + local.set $l7283 + local.get $l7282 + local.get $l7283 + i32.add + local.set $l7284 + local.get $l7283 + local.get $l7284 + i32.add + local.set $l7285 + local.get $l7284 + local.get $l7285 + i32.add + local.set $l7286 + local.get $l7285 + local.get $l7286 + i32.add + local.set $l7287 + local.get $l7286 + local.get $l7287 + i32.add + local.set $l7288 + local.get $l7287 + local.get $l7288 + i32.add + local.set $l7289 + local.get $l7288 + local.get $l7289 + i32.add + local.set $l7290 + local.get $l7289 + local.get $l7290 + i32.add + local.set $l7291 + local.get $l7290 + local.get $l7291 + i32.add + local.set $l7292 + local.get $l7291 + local.get $l7292 + i32.add + local.set $l7293 + local.get $l7292 + local.get $l7293 + i32.add + local.set $l7294 + local.get $l7293 + local.get $l7294 + i32.add + local.set $l7295 + local.get $l7294 + local.get $l7295 + i32.add + local.set $l7296 + local.get $l7295 + local.get $l7296 + i32.add + local.set $l7297 + local.get $l7296 + local.get $l7297 + i32.add + local.set $l7298 + local.get $l7297 + local.get $l7298 + i32.add + local.set $l7299 + local.get $l7298 + local.get $l7299 + i32.add + local.set $l7300 + local.get $l7299 + local.get $l7300 + i32.add + local.set $l7301 + local.get $l7300 + local.get $l7301 + i32.add + local.set $l7302 + local.get $l7301 + local.get $l7302 + i32.add + local.set $l7303 + local.get $l7302 + local.get $l7303 + i32.add + local.set $l7304 + local.get $l7303 + local.get $l7304 + i32.add + local.set $l7305 + local.get $l7304 + local.get $l7305 + i32.add + local.set $l7306 + local.get $l7305 + local.get $l7306 + i32.add + local.set $l7307 + local.get $l7306 + local.get $l7307 + i32.add + local.set $l7308 + local.get $l7307 + local.get $l7308 + i32.add + local.set $l7309 + local.get $l7308 + local.get $l7309 + i32.add + local.set $l7310 + local.get $l7309 + local.get $l7310 + i32.add + local.set $l7311 + local.get $l7310 + local.get $l7311 + i32.add + local.set $l7312 + local.get $l7311 + local.get $l7312 + i32.add + local.set $l7313 + local.get $l7312 + local.get $l7313 + i32.add + local.set $l7314 + local.get $l7313 + local.get $l7314 + i32.add + local.set $l7315 + local.get $l7314 + local.get $l7315 + i32.add + local.set $l7316 + local.get $l7315 + local.get $l7316 + i32.add + local.set $l7317 + local.get $l7316 + local.get $l7317 + i32.add + local.set $l7318 + local.get $l7317 + local.get $l7318 + i32.add + local.set $l7319 + local.get $l7318 + local.get $l7319 + i32.add + local.set $l7320 + local.get $l7319 + local.get $l7320 + i32.add + local.set $l7321 + local.get $l7320 + local.get $l7321 + i32.add + local.set $l7322 + local.get $l7321 + local.get $l7322 + i32.add + local.set $l7323 + local.get $l7322 + local.get $l7323 + i32.add + local.set $l7324 + local.get $l7323 + local.get $l7324 + i32.add + local.set $l7325 + local.get $l7324 + local.get $l7325 + i32.add + local.set $l7326 + local.get $l7325 + local.get $l7326 + i32.add + local.set $l7327 + local.get $l7326 + local.get $l7327 + i32.add + local.set $l7328 + local.get $l7327 + local.get $l7328 + i32.add + local.set $l7329 + local.get $l7328 + local.get $l7329 + i32.add + local.set $l7330 + local.get $l7329 + local.get $l7330 + i32.add + local.set $l7331 + local.get $l7330 + local.get $l7331 + i32.add + local.set $l7332 + local.get $l7331 + local.get $l7332 + i32.add + local.set $l7333 + local.get $l7332 + local.get $l7333 + i32.add + local.set $l7334 + local.get $l7333 + local.get $l7334 + i32.add + local.set $l7335 + local.get $l7334 + local.get $l7335 + i32.add + local.set $l7336 + local.get $l7335 + local.get $l7336 + i32.add + local.set $l7337 + local.get $l7336 + local.get $l7337 + i32.add + local.set $l7338 + local.get $l7337 + local.get $l7338 + i32.add + local.set $l7339 + local.get $l7338 + local.get $l7339 + i32.add + local.set $l7340 + local.get $l7339 + local.get $l7340 + i32.add + local.set $l7341 + local.get $l7340 + local.get $l7341 + i32.add + local.set $l7342 + local.get $l7341 + local.get $l7342 + i32.add + local.set $l7343 + local.get $l7342 + local.get $l7343 + i32.add + local.set $l7344 + local.get $l7343 + local.get $l7344 + i32.add + local.set $l7345 + local.get $l7344 + local.get $l7345 + i32.add + local.set $l7346 + local.get $l7345 + local.get $l7346 + i32.add + local.set $l7347 + local.get $l7346 + local.get $l7347 + i32.add + local.set $l7348 + local.get $l7347 + local.get $l7348 + i32.add + local.set $l7349 + local.get $l7348 + local.get $l7349 + i32.add + local.set $l7350 + local.get $l7349 + local.get $l7350 + i32.add + local.set $l7351 + local.get $l7350 + local.get $l7351 + i32.add + local.set $l7352 + local.get $l7351 + local.get $l7352 + i32.add + local.set $l7353 + local.get $l7352 + local.get $l7353 + i32.add + local.set $l7354 + local.get $l7353 + local.get $l7354 + i32.add + local.set $l7355 + local.get $l7354 + local.get $l7355 + i32.add + local.set $l7356 + local.get $l7355 + local.get $l7356 + i32.add + local.set $l7357 + local.get $l7356 + local.get $l7357 + i32.add + local.set $l7358 + local.get $l7357 + local.get $l7358 + i32.add + local.set $l7359 + local.get $l7358 + local.get $l7359 + i32.add + local.set $l7360 + local.get $l7359 + local.get $l7360 + i32.add + local.set $l7361 + local.get $l7360 + local.get $l7361 + i32.add + local.set $l7362 + local.get $l7361 + local.get $l7362 + i32.add + local.set $l7363 + local.get $l7362 + local.get $l7363 + i32.add + local.set $l7364 + local.get $l7363 + local.get $l7364 + i32.add + local.set $l7365 + local.get $l7364 + local.get $l7365 + i32.add + local.set $l7366 + local.get $l7365 + local.get $l7366 + i32.add + local.set $l7367 + local.get $l7366 + local.get $l7367 + i32.add + local.set $l7368 + local.get $l7367 + local.get $l7368 + i32.add + local.set $l7369 + local.get $l7368 + local.get $l7369 + i32.add + local.set $l7370 + local.get $l7369 + local.get $l7370 + i32.add + local.set $l7371 + local.get $l7370 + local.get $l7371 + i32.add + local.set $l7372 + local.get $l7371 + local.get $l7372 + i32.add + local.set $l7373 + local.get $l7372 + local.get $l7373 + i32.add + local.set $l7374 + local.get $l7373 + local.get $l7374 + i32.add + local.set $l7375 + local.get $l7374 + local.get $l7375 + i32.add + local.set $l7376 + local.get $l7375 + local.get $l7376 + i32.add + local.set $l7377 + local.get $l7376 + local.get $l7377 + i32.add + local.set $l7378 + local.get $l7377 + local.get $l7378 + i32.add + local.set $l7379 + local.get $l7378 + local.get $l7379 + i32.add + local.set $l7380 + local.get $l7379 + local.get $l7380 + i32.add + local.set $l7381 + local.get $l7380 + local.get $l7381 + i32.add + local.set $l7382 + local.get $l7381 + local.get $l7382 + i32.add + local.set $l7383 + local.get $l7382 + local.get $l7383 + i32.add + local.set $l7384 + local.get $l7383 + local.get $l7384 + i32.add + local.set $l7385 + local.get $l7384 + local.get $l7385 + i32.add + local.set $l7386 + local.get $l7385 + local.get $l7386 + i32.add + local.set $l7387 + local.get $l7386 + local.get $l7387 + i32.add + local.set $l7388 + local.get $l7387 + local.get $l7388 + i32.add + local.set $l7389 + local.get $l7388 + local.get $l7389 + i32.add + local.set $l7390 + local.get $l7389 + local.get $l7390 + i32.add + local.set $l7391 + local.get $l7390 + local.get $l7391 + i32.add + local.set $l7392 + local.get $l7391 + local.get $l7392 + i32.add + local.set $l7393 + local.get $l7392 + local.get $l7393 + i32.add + local.set $l7394 + local.get $l7393 + local.get $l7394 + i32.add + local.set $l7395 + local.get $l7394 + local.get $l7395 + i32.add + local.set $l7396 + local.get $l7395 + local.get $l7396 + i32.add + local.set $l7397 + local.get $l7396 + local.get $l7397 + i32.add + local.set $l7398 + local.get $l7397 + local.get $l7398 + i32.add + local.set $l7399 + local.get $l7398 + local.get $l7399 + i32.add + local.set $l7400 + local.get $l7399 + local.get $l7400 + i32.add + local.set $l7401 + local.get $l7400 + local.get $l7401 + i32.add + local.set $l7402 + local.get $l7401 + local.get $l7402 + i32.add + local.set $l7403 + local.get $l7402 + local.get $l7403 + i32.add + local.set $l7404 + local.get $l7403 + local.get $l7404 + i32.add + local.set $l7405 + local.get $l7404 + local.get $l7405 + i32.add + local.set $l7406 + local.get $l7405 + local.get $l7406 + i32.add + local.set $l7407 + local.get $l7406 + local.get $l7407 + i32.add + local.set $l7408 + local.get $l7407 + local.get $l7408 + i32.add + local.set $l7409 + local.get $l7408 + local.get $l7409 + i32.add + local.set $l7410 + local.get $l7409 + local.get $l7410 + i32.add + local.set $l7411 + local.get $l7410 + local.get $l7411 + i32.add + local.set $l7412 + local.get $l7411 + local.get $l7412 + i32.add + local.set $l7413 + local.get $l7412 + local.get $l7413 + i32.add + local.set $l7414 + local.get $l7413 + local.get $l7414 + i32.add + local.set $l7415 + local.get $l7414 + local.get $l7415 + i32.add + local.set $l7416 + local.get $l7415 + local.get $l7416 + i32.add + local.set $l7417 + local.get $l7416 + local.get $l7417 + i32.add + local.set $l7418 + local.get $l7417 + local.get $l7418 + i32.add + local.set $l7419 + local.get $l7418 + local.get $l7419 + i32.add + local.set $l7420 + local.get $l7419 + local.get $l7420 + i32.add + local.set $l7421 + local.get $l7420 + local.get $l7421 + i32.add + local.set $l7422 + local.get $l7421 + local.get $l7422 + i32.add + local.set $l7423 + local.get $l7422 + local.get $l7423 + i32.add + local.set $l7424 + local.get $l7423 + local.get $l7424 + i32.add + local.set $l7425 + local.get $l7424 + local.get $l7425 + i32.add + local.set $l7426 + local.get $l7425 + local.get $l7426 + i32.add + local.set $l7427 + local.get $l7426 + local.get $l7427 + i32.add + local.set $l7428 + local.get $l7427 + local.get $l7428 + i32.add + local.set $l7429 + local.get $l7428 + local.get $l7429 + i32.add + local.set $l7430 + local.get $l7429 + local.get $l7430 + i32.add + local.set $l7431 + local.get $l7430 + local.get $l7431 + i32.add + local.set $l7432 + local.get $l7431 + local.get $l7432 + i32.add + local.set $l7433 + local.get $l7432 + local.get $l7433 + i32.add + local.set $l7434 + local.get $l7433 + local.get $l7434 + i32.add + local.set $l7435 + local.get $l7434 + local.get $l7435 + i32.add + local.set $l7436 + local.get $l7435 + local.get $l7436 + i32.add + local.set $l7437 + local.get $l7436 + local.get $l7437 + i32.add + local.set $l7438 + local.get $l7437 + local.get $l7438 + i32.add + local.set $l7439 + local.get $l7438 + local.get $l7439 + i32.add + local.set $l7440 + local.get $l7439 + local.get $l7440 + i32.add + local.set $l7441 + local.get $l7440 + local.get $l7441 + i32.add + local.set $l7442 + local.get $l7441 + local.get $l7442 + i32.add + local.set $l7443 + local.get $l7442 + local.get $l7443 + i32.add + local.set $l7444 + local.get $l7443 + local.get $l7444 + i32.add + local.set $l7445 + local.get $l7444 + local.get $l7445 + i32.add + local.set $l7446 + local.get $l7445 + local.get $l7446 + i32.add + local.set $l7447 + local.get $l7446 + local.get $l7447 + i32.add + local.set $l7448 + local.get $l7447 + local.get $l7448 + i32.add + local.set $l7449 + local.get $l7448 + local.get $l7449 + i32.add + local.set $l7450 + local.get $l7449 + local.get $l7450 + i32.add + local.set $l7451 + local.get $l7450 + local.get $l7451 + i32.add + local.set $l7452 + local.get $l7451 + local.get $l7452 + i32.add + local.set $l7453 + local.get $l7452 + local.get $l7453 + i32.add + local.set $l7454 + local.get $l7453 + local.get $l7454 + i32.add + local.set $l7455 + local.get $l7454 + local.get $l7455 + i32.add + local.set $l7456 + local.get $l7455 + local.get $l7456 + i32.add + local.set $l7457 + local.get $l7456 + local.get $l7457 + i32.add + local.set $l7458 + local.get $l7457 + local.get $l7458 + i32.add + local.set $l7459 + local.get $l7458 + local.get $l7459 + i32.add + local.set $l7460 + local.get $l7459 + local.get $l7460 + i32.add + local.set $l7461 + local.get $l7460 + local.get $l7461 + i32.add + local.set $l7462 + local.get $l7461 + local.get $l7462 + i32.add + local.set $l7463 + local.get $l7462 + local.get $l7463 + i32.add + local.set $l7464 + local.get $l7463 + local.get $l7464 + i32.add + local.set $l7465 + local.get $l7464 + local.get $l7465 + i32.add + local.set $l7466 + local.get $l7465 + local.get $l7466 + i32.add + local.set $l7467 + local.get $l7466 + local.get $l7467 + i32.add + local.set $l7468 + local.get $l7467 + local.get $l7468 + i32.add + local.set $l7469 + local.get $l7468 + local.get $l7469 + i32.add + local.set $l7470 + local.get $l7469 + local.get $l7470 + i32.add + local.set $l7471 + local.get $l7470 + local.get $l7471 + i32.add + local.set $l7472 + local.get $l7471 + local.get $l7472 + i32.add + local.set $l7473 + local.get $l7472 + local.get $l7473 + i32.add + local.set $l7474 + local.get $l7473 + local.get $l7474 + i32.add + local.set $l7475 + local.get $l7474 + local.get $l7475 + i32.add + local.set $l7476 + local.get $l7475 + local.get $l7476 + i32.add + local.set $l7477 + local.get $l7476 + local.get $l7477 + i32.add + local.set $l7478 + local.get $l7477 + local.get $l7478 + i32.add + local.set $l7479 + local.get $l7478 + local.get $l7479 + i32.add + local.set $l7480 + local.get $l7479 + local.get $l7480 + i32.add + local.set $l7481 + local.get $l7480 + local.get $l7481 + i32.add + local.set $l7482 + local.get $l7481 + local.get $l7482 + i32.add + local.set $l7483 + local.get $l7482 + local.get $l7483 + i32.add + local.set $l7484 + local.get $l7483 + local.get $l7484 + i32.add + local.set $l7485 + local.get $l7484 + local.get $l7485 + i32.add + local.set $l7486 + local.get $l7485 + local.get $l7486 + i32.add + local.set $l7487 + local.get $l7486 + local.get $l7487 + i32.add + local.set $l7488 + local.get $l7487 + local.get $l7488 + i32.add + local.set $l7489 + local.get $l7488 + local.get $l7489 + i32.add + local.set $l7490 + local.get $l7489 + local.get $l7490 + i32.add + local.set $l7491 + local.get $l7490 + local.get $l7491 + i32.add + local.set $l7492 + local.get $l7491 + local.get $l7492 + i32.add + local.set $l7493 + local.get $l7492 + local.get $l7493 + i32.add + local.set $l7494 + local.get $l7493 + local.get $l7494 + i32.add + local.set $l7495 + local.get $l7494 + local.get $l7495 + i32.add + local.set $l7496 + local.get $l7495 + local.get $l7496 + i32.add + local.set $l7497 + local.get $l7496 + local.get $l7497 + i32.add + local.set $l7498 + local.get $l7497 + local.get $l7498 + i32.add + local.set $l7499 + local.get $l7498 + local.get $l7499 + i32.add + local.set $l7500 + local.get $l7499 + local.get $l7500 + i32.add + local.set $l7501 + local.get $l7500 + local.get $l7501 + i32.add + local.set $l7502 + local.get $l7501 + local.get $l7502 + i32.add + local.set $l7503 + local.get $l7502 + local.get $l7503 + i32.add + local.set $l7504 + local.get $l7503 + local.get $l7504 + i32.add + local.set $l7505 + local.get $l7504 + local.get $l7505 + i32.add + local.set $l7506 + local.get $l7505 + local.get $l7506 + i32.add + local.set $l7507 + local.get $l7506 + local.get $l7507 + i32.add + local.set $l7508 + local.get $l7507 + local.get $l7508 + i32.add + local.set $l7509 + local.get $l7508 + local.get $l7509 + i32.add + local.set $l7510 + local.get $l7509 + local.get $l7510 + i32.add + local.set $l7511 + local.get $l7510 + local.get $l7511 + i32.add + local.set $l7512 + local.get $l7511 + local.get $l7512 + i32.add + local.set $l7513 + local.get $l7512 + local.get $l7513 + i32.add + local.set $l7514 + local.get $l7513 + local.get $l7514 + i32.add + local.set $l7515 + local.get $l7514 + local.get $l7515 + i32.add + local.set $l7516 + local.get $l7515 + local.get $l7516 + i32.add + local.set $l7517 + local.get $l7516 + local.get $l7517 + i32.add + local.set $l7518 + local.get $l7517 + local.get $l7518 + i32.add + local.set $l7519 + local.get $l7518 + local.get $l7519 + i32.add + local.set $l7520 + local.get $l7519 + local.get $l7520 + i32.add + local.set $l7521 + local.get $l7520 + local.get $l7521 + i32.add + local.set $l7522 + local.get $l7521 + local.get $l7522 + i32.add + local.set $l7523 + local.get $l7522 + local.get $l7523 + i32.add + local.set $l7524 + local.get $l7523 + local.get $l7524 + i32.add + local.set $l7525 + local.get $l7524 + local.get $l7525 + i32.add + local.set $l7526 + local.get $l7525 + local.get $l7526 + i32.add + local.set $l7527 + local.get $l7526 + local.get $l7527 + i32.add + local.set $l7528 + local.get $l7527 + local.get $l7528 + i32.add + local.set $l7529 + local.get $l7528 + local.get $l7529 + i32.add + local.set $l7530 + local.get $l7529 + local.get $l7530 + i32.add + local.set $l7531 + local.get $l7530 + local.get $l7531 + i32.add + local.set $l7532 + local.get $l7531 + local.get $l7532 + i32.add + local.set $l7533 + local.get $l7532 + local.get $l7533 + i32.add + local.set $l7534 + local.get $l7533 + local.get $l7534 + i32.add + local.set $l7535 + local.get $l7534 + local.get $l7535 + i32.add + local.set $l7536 + local.get $l7535 + local.get $l7536 + i32.add + local.set $l7537 + local.get $l7536 + local.get $l7537 + i32.add + local.set $l7538 + local.get $l7537 + local.get $l7538 + i32.add + local.set $l7539 + local.get $l7538 + local.get $l7539 + i32.add + local.set $l7540 + local.get $l7539 + local.get $l7540 + i32.add + local.set $l7541 + local.get $l7540 + local.get $l7541 + i32.add + local.set $l7542 + local.get $l7541 + local.get $l7542 + i32.add + local.set $l7543 + local.get $l7542 + local.get $l7543 + i32.add + local.set $l7544 + local.get $l7543 + local.get $l7544 + i32.add + local.set $l7545 + local.get $l7544 + local.get $l7545 + i32.add + local.set $l7546 + local.get $l7545 + local.get $l7546 + i32.add + local.set $l7547 + local.get $l7546 + local.get $l7547 + i32.add + local.set $l7548 + local.get $l7547 + local.get $l7548 + i32.add + local.set $l7549 + local.get $l7548 + local.get $l7549 + i32.add + local.set $l7550 + local.get $l7549 + local.get $l7550 + i32.add + local.set $l7551 + local.get $l7550 + local.get $l7551 + i32.add + local.set $l7552 + local.get $l7551 + local.get $l7552 + i32.add + local.set $l7553 + local.get $l7552 + local.get $l7553 + i32.add + local.set $l7554 + local.get $l7553 + local.get $l7554 + i32.add + local.set $l7555 + local.get $l7554 + local.get $l7555 + i32.add + local.set $l7556 + local.get $l7555 + local.get $l7556 + i32.add + local.set $l7557 + local.get $l7556 + local.get $l7557 + i32.add + local.set $l7558 + local.get $l7557 + local.get $l7558 + i32.add + local.set $l7559 + local.get $l7558 + local.get $l7559 + i32.add + local.set $l7560 + local.get $l7559 + local.get $l7560 + i32.add + local.set $l7561 + local.get $l7560 + local.get $l7561 + i32.add + local.set $l7562 + local.get $l7561 + local.get $l7562 + i32.add + local.set $l7563 + local.get $l7562 + local.get $l7563 + i32.add + local.set $l7564 + local.get $l7563 + local.get $l7564 + i32.add + local.set $l7565 + local.get $l7564 + local.get $l7565 + i32.add + local.set $l7566 + local.get $l7565 + local.get $l7566 + i32.add + local.set $l7567 + local.get $l7566 + local.get $l7567 + i32.add + local.set $l7568 + local.get $l7567 + local.get $l7568 + i32.add + local.set $l7569 + local.get $l7568 + local.get $l7569 + i32.add + local.set $l7570 + local.get $l7569 + local.get $l7570 + i32.add + local.set $l7571 + local.get $l7570 + local.get $l7571 + i32.add + local.set $l7572 + local.get $l7571 + local.get $l7572 + i32.add + local.set $l7573 + local.get $l7572 + local.get $l7573 + i32.add + local.set $l7574 + local.get $l7573 + local.get $l7574 + i32.add + local.set $l7575 + local.get $l7574 + local.get $l7575 + i32.add + local.set $l7576 + local.get $l7575 + local.get $l7576 + i32.add + local.set $l7577 + local.get $l7576 + local.get $l7577 + i32.add + local.set $l7578 + local.get $l7577 + local.get $l7578 + i32.add + local.set $l7579 + local.get $l7578 + local.get $l7579 + i32.add + local.set $l7580 + local.get $l7579 + local.get $l7580 + i32.add + local.set $l7581 + local.get $l7580 + local.get $l7581 + i32.add + local.set $l7582 + local.get $l7581 + local.get $l7582 + i32.add + local.set $l7583 + local.get $l7582 + local.get $l7583 + i32.add + local.set $l7584 + local.get $l7583 + local.get $l7584 + i32.add + local.set $l7585 + local.get $l7584 + local.get $l7585 + i32.add + local.set $l7586 + local.get $l7585 + local.get $l7586 + i32.add + local.set $l7587 + local.get $l7586 + local.get $l7587 + i32.add + local.set $l7588 + local.get $l7587 + local.get $l7588 + i32.add + local.set $l7589 + local.get $l7588 + local.get $l7589 + i32.add + local.set $l7590 + local.get $l7589 + local.get $l7590 + i32.add + local.set $l7591 + local.get $l7590 + local.get $l7591 + i32.add + local.set $l7592 + local.get $l7591 + local.get $l7592 + i32.add + local.set $l7593 + local.get $l7592 + local.get $l7593 + i32.add + local.set $l7594 + local.get $l7593 + local.get $l7594 + i32.add + local.set $l7595 + local.get $l7594 + local.get $l7595 + i32.add + local.set $l7596 + local.get $l7595 + local.get $l7596 + i32.add + local.set $l7597 + local.get $l7596 + local.get $l7597 + i32.add + local.set $l7598 + local.get $l7597 + local.get $l7598 + i32.add + local.set $l7599 + local.get $l7598 + local.get $l7599 + i32.add + local.set $l7600 + local.get $l7599 + local.get $l7600 + i32.add + local.set $l7601 + local.get $l7600 + local.get $l7601 + i32.add + local.set $l7602 + local.get $l7601 + local.get $l7602 + i32.add + local.set $l7603 + local.get $l7602 + local.get $l7603 + i32.add + local.set $l7604 + local.get $l7603 + local.get $l7604 + i32.add + local.set $l7605 + local.get $l7604 + local.get $l7605 + i32.add + local.set $l7606 + local.get $l7605 + local.get $l7606 + i32.add + local.set $l7607 + local.get $l7606 + local.get $l7607 + i32.add + local.set $l7608 + local.get $l7607 + local.get $l7608 + i32.add + local.set $l7609 + local.get $l7608 + local.get $l7609 + i32.add + local.set $l7610 + local.get $l7609 + local.get $l7610 + i32.add + local.set $l7611 + local.get $l7610 + local.get $l7611 + i32.add + local.set $l7612 + local.get $l7611 + local.get $l7612 + i32.add + local.set $l7613 + local.get $l7612 + local.get $l7613 + i32.add + local.set $l7614 + local.get $l7613 + local.get $l7614 + i32.add + local.set $l7615 + local.get $l7614 + local.get $l7615 + i32.add + local.set $l7616 + local.get $l7615 + local.get $l7616 + i32.add + local.set $l7617 + local.get $l7616 + local.get $l7617 + i32.add + local.set $l7618 + local.get $l7617 + local.get $l7618 + i32.add + local.set $l7619 + local.get $l7618 + local.get $l7619 + i32.add + local.set $l7620 + local.get $l7619 + local.get $l7620 + i32.add + local.set $l7621 + local.get $l7620 + local.get $l7621 + i32.add + local.set $l7622 + local.get $l7621 + local.get $l7622 + i32.add + local.set $l7623 + local.get $l7622 + local.get $l7623 + i32.add + local.set $l7624 + local.get $l7623 + local.get $l7624 + i32.add + local.set $l7625 + local.get $l7624 + local.get $l7625 + i32.add + local.set $l7626 + local.get $l7625 + local.get $l7626 + i32.add + local.set $l7627 + local.get $l7626 + local.get $l7627 + i32.add + local.set $l7628 + local.get $l7627 + local.get $l7628 + i32.add + local.set $l7629 + local.get $l7628 + local.get $l7629 + i32.add + local.set $l7630 + local.get $l7629 + local.get $l7630 + i32.add + local.set $l7631 + local.get $l7630 + local.get $l7631 + i32.add + local.set $l7632 + local.get $l7631 + local.get $l7632 + i32.add + local.set $l7633 + local.get $l7632 + local.get $l7633 + i32.add + local.set $l7634 + local.get $l7633 + local.get $l7634 + i32.add + local.set $l7635 + local.get $l7634 + local.get $l7635 + i32.add + local.set $l7636 + local.get $l7635 + local.get $l7636 + i32.add + local.set $l7637 + local.get $l7636 + local.get $l7637 + i32.add + local.set $l7638 + local.get $l7637 + local.get $l7638 + i32.add + local.set $l7639 + local.get $l7638 + local.get $l7639 + i32.add + local.set $l7640 + local.get $l7639 + local.get $l7640 + i32.add + local.set $l7641 + local.get $l7640 + local.get $l7641 + i32.add + local.set $l7642 + local.get $l7641 + local.get $l7642 + i32.add + local.set $l7643 + local.get $l7642 + local.get $l7643 + i32.add + local.set $l7644 + local.get $l7643 + local.get $l7644 + i32.add + local.set $l7645 + local.get $l7644 + local.get $l7645 + i32.add + local.set $l7646 + local.get $l7645 + local.get $l7646 + i32.add + local.set $l7647 + local.get $l7646 + local.get $l7647 + i32.add + local.set $l7648 + local.get $l7647 + local.get $l7648 + i32.add + local.set $l7649 + local.get $l7648 + local.get $l7649 + i32.add + local.set $l7650 + local.get $l7649 + local.get $l7650 + i32.add + local.set $l7651 + local.get $l7650 + local.get $l7651 + i32.add + local.set $l7652 + local.get $l7651 + local.get $l7652 + i32.add + local.set $l7653 + local.get $l7652 + local.get $l7653 + i32.add + local.set $l7654 + local.get $l7653 + local.get $l7654 + i32.add + local.set $l7655 + local.get $l7654 + local.get $l7655 + i32.add + local.set $l7656 + local.get $l7655 + local.get $l7656 + i32.add + local.set $l7657 + local.get $l7656 + local.get $l7657 + i32.add + local.set $l7658 + local.get $l7657 + local.get $l7658 + i32.add + local.set $l7659 + local.get $l7658 + local.get $l7659 + i32.add + local.set $l7660 + local.get $l7659 + local.get $l7660 + i32.add + local.set $l7661 + local.get $l7660 + local.get $l7661 + i32.add + local.set $l7662 + local.get $l7661 + local.get $l7662 + i32.add + local.set $l7663 + local.get $l7662 + local.get $l7663 + i32.add + local.set $l7664 + local.get $l7663 + local.get $l7664 + i32.add + local.set $l7665 + local.get $l7664 + local.get $l7665 + i32.add + local.set $l7666 + local.get $l7665 + local.get $l7666 + i32.add + local.set $l7667 + local.get $l7666 + local.get $l7667 + i32.add + local.set $l7668 + local.get $l7667 + local.get $l7668 + i32.add + local.set $l7669 + local.get $l7668 + local.get $l7669 + i32.add + local.set $l7670 + local.get $l7669 + local.get $l7670 + i32.add + local.set $l7671 + local.get $l7670 + local.get $l7671 + i32.add + local.set $l7672 + local.get $l7671 + local.get $l7672 + i32.add + local.set $l7673 + local.get $l7672 + local.get $l7673 + i32.add + local.set $l7674 + local.get $l7673 + local.get $l7674 + i32.add + local.set $l7675 + local.get $l7674 + local.get $l7675 + i32.add + local.set $l7676 + local.get $l7675 + local.get $l7676 + i32.add + local.set $l7677 + local.get $l7676 + local.get $l7677 + i32.add + local.set $l7678 + local.get $l7677 + local.get $l7678 + i32.add + local.set $l7679 + local.get $l7678 + local.get $l7679 + i32.add + local.set $l7680 + local.get $l7679 + local.get $l7680 + i32.add + local.set $l7681 + local.get $l7680 + local.get $l7681 + i32.add + local.set $l7682 + local.get $l7681 + local.get $l7682 + i32.add + local.set $l7683 + local.get $l7682 + local.get $l7683 + i32.add + local.set $l7684 + local.get $l7683 + local.get $l7684 + i32.add + local.set $l7685 + local.get $l7684 + local.get $l7685 + i32.add + local.set $l7686 + local.get $l7685 + local.get $l7686 + i32.add + local.set $l7687 + local.get $l7686 + local.get $l7687 + i32.add + local.set $l7688 + local.get $l7687 + local.get $l7688 + i32.add + local.set $l7689 + local.get $l7688 + local.get $l7689 + i32.add + local.set $l7690 + local.get $l7689 + local.get $l7690 + i32.add + local.set $l7691 + local.get $l7690 + local.get $l7691 + i32.add + local.set $l7692 + local.get $l7691 + local.get $l7692 + i32.add + local.set $l7693 + local.get $l7692 + local.get $l7693 + i32.add + local.set $l7694 + local.get $l7693 + local.get $l7694 + i32.add + local.set $l7695 + local.get $l7694 + local.get $l7695 + i32.add + local.set $l7696 + local.get $l7695 + local.get $l7696 + i32.add + local.set $l7697 + local.get $l7696 + local.get $l7697 + i32.add + local.set $l7698 + local.get $l7697 + local.get $l7698 + i32.add + local.set $l7699 + local.get $l7698 + local.get $l7699 + i32.add + local.set $l7700 + local.get $l7699 + local.get $l7700 + i32.add + local.set $l7701 + local.get $l7700 + local.get $l7701 + i32.add + local.set $l7702 + local.get $l7701 + local.get $l7702 + i32.add + local.set $l7703 + local.get $l7702 + local.get $l7703 + i32.add + local.set $l7704 + local.get $l7703 + local.get $l7704 + i32.add + local.set $l7705 + local.get $l7704 + local.get $l7705 + i32.add + local.set $l7706 + local.get $l7705 + local.get $l7706 + i32.add + local.set $l7707 + local.get $l7706 + local.get $l7707 + i32.add + local.set $l7708 + local.get $l7707 + local.get $l7708 + i32.add + local.set $l7709 + local.get $l7708 + local.get $l7709 + i32.add + local.set $l7710 + local.get $l7709 + local.get $l7710 + i32.add + local.set $l7711 + local.get $l7710 + local.get $l7711 + i32.add + local.set $l7712 + local.get $l7711 + local.get $l7712 + i32.add + local.set $l7713 + local.get $l7712 + local.get $l7713 + i32.add + local.set $l7714 + local.get $l7713 + local.get $l7714 + i32.add + local.set $l7715 + local.get $l7714 + local.get $l7715 + i32.add + local.set $l7716 + local.get $l7715 + local.get $l7716 + i32.add + local.set $l7717 + local.get $l7716 + local.get $l7717 + i32.add + local.set $l7718 + local.get $l7717 + local.get $l7718 + i32.add + local.set $l7719 + local.get $l7718 + local.get $l7719 + i32.add + local.set $l7720 + local.get $l7719 + local.get $l7720 + i32.add + local.set $l7721 + local.get $l7720 + local.get $l7721 + i32.add + local.set $l7722 + local.get $l7721 + local.get $l7722 + i32.add + local.set $l7723 + local.get $l7722 + local.get $l7723 + i32.add + local.set $l7724 + local.get $l7723 + local.get $l7724 + i32.add + local.set $l7725 + local.get $l7724 + local.get $l7725 + i32.add + local.set $l7726 + local.get $l7725 + local.get $l7726 + i32.add + local.set $l7727 + local.get $l7726 + local.get $l7727 + i32.add + local.set $l7728 + local.get $l7727 + local.get $l7728 + i32.add + local.set $l7729 + local.get $l7728 + local.get $l7729 + i32.add + local.set $l7730 + local.get $l7729 + local.get $l7730 + i32.add + local.set $l7731 + local.get $l7730 + local.get $l7731 + i32.add + local.set $l7732 + local.get $l7731 + local.get $l7732 + i32.add + local.set $l7733 + local.get $l7732 + local.get $l7733 + i32.add + local.set $l7734 + local.get $l7733 + local.get $l7734 + i32.add + local.set $l7735 + local.get $l7734 + local.get $l7735 + i32.add + local.set $l7736 + local.get $l7735 + local.get $l7736 + i32.add + local.set $l7737 + local.get $l7736 + local.get $l7737 + i32.add + local.set $l7738 + local.get $l7737 + local.get $l7738 + i32.add + local.set $l7739 + local.get $l7738 + local.get $l7739 + i32.add + local.set $l7740 + local.get $l7739 + local.get $l7740 + i32.add + local.set $l7741 + local.get $l7740 + local.get $l7741 + i32.add + local.set $l7742 + local.get $l7741 + local.get $l7742 + i32.add + local.set $l7743 + local.get $l7742 + local.get $l7743 + i32.add + local.set $l7744 + local.get $l7743 + local.get $l7744 + i32.add + local.set $l7745 + local.get $l7744 + local.get $l7745 + i32.add + local.set $l7746 + local.get $l7745 + local.get $l7746 + i32.add + local.set $l7747 + local.get $l7746 + local.get $l7747 + i32.add + local.set $l7748 + local.get $l7747 + local.get $l7748 + i32.add + local.set $l7749 + local.get $l7748 + local.get $l7749 + i32.add + local.set $l7750 + local.get $l7749 + local.get $l7750 + i32.add + local.set $l7751 + local.get $l7750 + local.get $l7751 + i32.add + local.set $l7752 + local.get $l7751 + local.get $l7752 + i32.add + local.set $l7753 + local.get $l7752 + local.get $l7753 + i32.add + local.set $l7754 + local.get $l7753 + local.get $l7754 + i32.add + local.set $l7755 + local.get $l7754 + local.get $l7755 + i32.add + local.set $l7756 + local.get $l7755 + local.get $l7756 + i32.add + local.set $l7757 + local.get $l7756 + local.get $l7757 + i32.add + local.set $l7758 + local.get $l7757 + local.get $l7758 + i32.add + local.set $l7759 + local.get $l7758 + local.get $l7759 + i32.add + local.set $l7760 + local.get $l7759 + local.get $l7760 + i32.add + local.set $l7761 + local.get $l7760 + local.get $l7761 + i32.add + local.set $l7762 + local.get $l7761 + local.get $l7762 + i32.add + local.set $l7763 + local.get $l7762 + local.get $l7763 + i32.add + local.set $l7764 + local.get $l7763 + local.get $l7764 + i32.add + local.set $l7765 + local.get $l7764 + local.get $l7765 + i32.add + local.set $l7766 + local.get $l7765 + local.get $l7766 + i32.add + local.set $l7767 + local.get $l7766 + local.get $l7767 + i32.add + local.set $l7768 + local.get $l7767 + local.get $l7768 + i32.add + local.set $l7769 + local.get $l7768 + local.get $l7769 + i32.add + local.set $l7770 + local.get $l7769 + local.get $l7770 + i32.add + local.set $l7771 + local.get $l7770 + local.get $l7771 + i32.add + local.set $l7772 + local.get $l7771 + local.get $l7772 + i32.add + local.set $l7773 + local.get $l7772 + local.get $l7773 + i32.add + local.set $l7774 + local.get $l7773 + local.get $l7774 + i32.add + local.set $l7775 + local.get $l7774 + local.get $l7775 + i32.add + local.set $l7776 + local.get $l7775 + local.get $l7776 + i32.add + local.set $l7777 + local.get $l7776 + local.get $l7777 + i32.add + local.set $l7778 + local.get $l7777 + local.get $l7778 + i32.add + local.set $l7779 + local.get $l7778 + local.get $l7779 + i32.add + local.set $l7780 + local.get $l7779 + local.get $l7780 + i32.add + local.set $l7781 + local.get $l7780 + local.get $l7781 + i32.add + local.set $l7782 + local.get $l7781 + local.get $l7782 + i32.add + local.set $l7783 + local.get $l7782 + local.get $l7783 + i32.add + local.set $l7784 + local.get $l7783 + local.get $l7784 + i32.add + local.set $l7785 + local.get $l7784 + local.get $l7785 + i32.add + local.set $l7786 + local.get $l7785 + local.get $l7786 + i32.add + local.set $l7787 + local.get $l7786 + local.get $l7787 + i32.add + local.set $l7788 + local.get $l7787 + local.get $l7788 + i32.add + local.set $l7789 + local.get $l7788 + local.get $l7789 + i32.add + local.set $l7790 + local.get $l7789 + local.get $l7790 + i32.add + local.set $l7791 + local.get $l7790 + local.get $l7791 + i32.add + local.set $l7792 + local.get $l7791 + local.get $l7792 + i32.add + local.set $l7793 + local.get $l7792 + local.get $l7793 + i32.add + local.set $l7794 + local.get $l7793 + local.get $l7794 + i32.add + local.set $l7795 + local.get $l7794 + local.get $l7795 + i32.add + local.set $l7796 + local.get $l7795 + local.get $l7796 + i32.add + local.set $l7797 + local.get $l7796 + local.get $l7797 + i32.add + local.set $l7798 + local.get $l7797 + local.get $l7798 + i32.add + local.set $l7799 + local.get $l7798 + local.get $l7799 + i32.add + local.set $l7800 + local.get $l7799 + local.get $l7800 + i32.add + local.set $l7801 + local.get $l7800 + local.get $l7801 + i32.add + local.set $l7802 + local.get $l7801 + local.get $l7802 + i32.add + local.set $l7803 + local.get $l7802 + local.get $l7803 + i32.add + local.set $l7804 + local.get $l7803 + local.get $l7804 + i32.add + local.set $l7805 + local.get $l7804 + local.get $l7805 + i32.add + local.set $l7806 + local.get $l7805 + local.get $l7806 + i32.add + local.set $l7807 + local.get $l7806 + local.get $l7807 + i32.add + local.set $l7808 + local.get $l7807 + local.get $l7808 + i32.add + local.set $l7809 + local.get $l7808 + local.get $l7809 + i32.add + local.set $l7810 + local.get $l7809 + local.get $l7810 + i32.add + local.set $l7811 + local.get $l7810 + local.get $l7811 + i32.add + local.set $l7812 + local.get $l7811 + local.get $l7812 + i32.add + local.set $l7813 + local.get $l7812 + local.get $l7813 + i32.add + local.set $l7814 + local.get $l7813 + local.get $l7814 + i32.add + local.set $l7815 + local.get $l7814 + local.get $l7815 + i32.add + local.set $l7816 + local.get $l7815 + local.get $l7816 + i32.add + local.set $l7817 + local.get $l7816 + local.get $l7817 + i32.add + local.set $l7818 + local.get $l7817 + local.get $l7818 + i32.add + local.set $l7819 + local.get $l7818 + local.get $l7819 + i32.add + local.set $l7820 + local.get $l7819 + local.get $l7820 + i32.add + local.set $l7821 + local.get $l7820 + local.get $l7821 + i32.add + local.set $l7822 + local.get $l7821 + local.get $l7822 + i32.add + local.set $l7823 + local.get $l7822 + local.get $l7823 + i32.add + local.set $l7824 + local.get $l7823 + local.get $l7824 + i32.add + local.set $l7825 + local.get $l7824 + local.get $l7825 + i32.add + local.set $l7826 + local.get $l7825 + local.get $l7826 + i32.add + local.set $l7827 + local.get $l7826 + local.get $l7827 + i32.add + local.set $l7828 + local.get $l7827 + local.get $l7828 + i32.add + local.set $l7829 + local.get $l7828 + local.get $l7829 + i32.add + local.set $l7830 + local.get $l7829 + local.get $l7830 + i32.add + local.set $l7831 + local.get $l7830 + local.get $l7831 + i32.add + local.set $l7832 + local.get $l7831 + local.get $l7832 + i32.add + local.set $l7833 + local.get $l7832 + local.get $l7833 + i32.add + local.set $l7834 + local.get $l7833 + local.get $l7834 + i32.add + local.set $l7835 + local.get $l7834 + local.get $l7835 + i32.add + local.set $l7836 + local.get $l7835 + local.get $l7836 + i32.add + local.set $l7837 + local.get $l7836 + local.get $l7837 + i32.add + local.set $l7838 + local.get $l7837 + local.get $l7838 + i32.add + local.set $l7839 + local.get $l7838 + local.get $l7839 + i32.add + local.set $l7840 + local.get $l7839 + local.get $l7840 + i32.add + local.set $l7841 + local.get $l7840 + local.get $l7841 + i32.add + local.set $l7842 + local.get $l7841 + local.get $l7842 + i32.add + local.set $l7843 + local.get $l7842 + local.get $l7843 + i32.add + local.set $l7844 + local.get $l7843 + local.get $l7844 + i32.add + local.set $l7845 + local.get $l7844 + local.get $l7845 + i32.add + local.set $l7846 + local.get $l7845 + local.get $l7846 + i32.add + local.set $l7847 + local.get $l7846 + local.get $l7847 + i32.add + local.set $l7848 + local.get $l7847 + local.get $l7848 + i32.add + local.set $l7849 + local.get $l7848 + local.get $l7849 + i32.add + local.set $l7850 + local.get $l7849 + local.get $l7850 + i32.add + local.set $l7851 + local.get $l7850 + local.get $l7851 + i32.add + local.set $l7852 + local.get $l7851 + local.get $l7852 + i32.add + local.set $l7853 + local.get $l7852 + local.get $l7853 + i32.add + local.set $l7854 + local.get $l7853 + local.get $l7854 + i32.add + local.set $l7855 + local.get $l7854 + local.get $l7855 + i32.add + local.set $l7856 + local.get $l7855 + local.get $l7856 + i32.add + local.set $l7857 + local.get $l7856 + local.get $l7857 + i32.add + local.set $l7858 + local.get $l7857 + local.get $l7858 + i32.add + local.set $l7859 + local.get $l7858 + local.get $l7859 + i32.add + local.set $l7860 + local.get $l7859 + local.get $l7860 + i32.add + local.set $l7861 + local.get $l7860 + local.get $l7861 + i32.add + local.set $l7862 + local.get $l7861 + local.get $l7862 + i32.add + local.set $l7863 + local.get $l7862 + local.get $l7863 + i32.add + local.set $l7864 + local.get $l7863 + local.get $l7864 + i32.add + local.set $l7865 + local.get $l7864 + local.get $l7865 + i32.add + local.set $l7866 + local.get $l7865 + local.get $l7866 + i32.add + local.set $l7867 + local.get $l7866 + local.get $l7867 + i32.add + local.set $l7868 + local.get $l7867 + local.get $l7868 + i32.add + local.set $l7869 + local.get $l7868 + local.get $l7869 + i32.add + local.set $l7870 + local.get $l7869 + local.get $l7870 + i32.add + local.set $l7871 + local.get $l7870 + local.get $l7871 + i32.add + local.set $l7872 + local.get $l7871 + local.get $l7872 + i32.add + local.set $l7873 + local.get $l7872 + local.get $l7873 + i32.add + local.set $l7874 + local.get $l7873 + local.get $l7874 + i32.add + local.set $l7875 + local.get $l7874 + local.get $l7875 + i32.add + local.set $l7876 + local.get $l7875 + local.get $l7876 + i32.add + local.set $l7877 + local.get $l7876 + local.get $l7877 + i32.add + local.set $l7878 + local.get $l7877 + local.get $l7878 + i32.add + local.set $l7879 + local.get $l7878 + local.get $l7879 + i32.add + local.set $l7880 + local.get $l7879 + local.get $l7880 + i32.add + local.set $l7881 + local.get $l7880 + local.get $l7881 + i32.add + local.set $l7882 + local.get $l7881 + local.get $l7882 + i32.add + local.set $l7883 + local.get $l7882 + local.get $l7883 + i32.add + local.set $l7884 + local.get $l7883 + local.get $l7884 + i32.add + local.set $l7885 + local.get $l7884 + local.get $l7885 + i32.add + local.set $l7886 + local.get $l7885 + local.get $l7886 + i32.add + local.set $l7887 + local.get $l7886 + local.get $l7887 + i32.add + local.set $l7888 + local.get $l7887 + local.get $l7888 + i32.add + local.set $l7889 + local.get $l7888 + local.get $l7889 + i32.add + local.set $l7890 + local.get $l7889 + local.get $l7890 + i32.add + local.set $l7891 + local.get $l7890 + local.get $l7891 + i32.add + local.set $l7892 + local.get $l7891 + local.get $l7892 + i32.add + local.set $l7893 + local.get $l7892 + local.get $l7893 + i32.add + local.set $l7894 + local.get $l7893 + local.get $l7894 + i32.add + local.set $l7895 + local.get $l7894 + local.get $l7895 + i32.add + local.set $l7896 + local.get $l7895 + local.get $l7896 + i32.add + local.set $l7897 + local.get $l7896 + local.get $l7897 + i32.add + local.set $l7898 + local.get $l7897 + local.get $l7898 + i32.add + local.set $l7899 + local.get $l7898 + local.get $l7899 + i32.add + local.set $l7900 + local.get $l7899 + local.get $l7900 + i32.add + local.set $l7901 + local.get $l7900 + local.get $l7901 + i32.add + local.set $l7902 + local.get $l7901 + local.get $l7902 + i32.add + local.set $l7903 + local.get $l7902 + local.get $l7903 + i32.add + local.set $l7904 + local.get $l7903 + local.get $l7904 + i32.add + local.set $l7905 + local.get $l7904 + local.get $l7905 + i32.add + local.set $l7906 + local.get $l7905 + local.get $l7906 + i32.add + local.set $l7907 + local.get $l7906 + local.get $l7907 + i32.add + local.set $l7908 + local.get $l7907 + local.get $l7908 + i32.add + local.set $l7909 + local.get $l7908 + local.get $l7909 + i32.add + local.set $l7910 + local.get $l7909 + local.get $l7910 + i32.add + local.set $l7911 + local.get $l7910 + local.get $l7911 + i32.add + local.set $l7912 + local.get $l7911 + local.get $l7912 + i32.add + local.set $l7913 + local.get $l7912 + local.get $l7913 + i32.add + local.set $l7914 + local.get $l7913 + local.get $l7914 + i32.add + local.set $l7915 + local.get $l7914 + local.get $l7915 + i32.add + local.set $l7916 + local.get $l7915 + local.get $l7916 + i32.add + local.set $l7917 + local.get $l7916 + local.get $l7917 + i32.add + local.set $l7918 + local.get $l7917 + local.get $l7918 + i32.add + local.set $l7919 + local.get $l7918 + local.get $l7919 + i32.add + local.set $l7920 + local.get $l7919 + local.get $l7920 + i32.add + local.set $l7921 + local.get $l7920 + local.get $l7921 + i32.add + local.set $l7922 + local.get $l7921 + local.get $l7922 + i32.add + local.set $l7923 + local.get $l7922 + local.get $l7923 + i32.add + local.set $l7924 + local.get $l7923 + local.get $l7924 + i32.add + local.set $l7925 + local.get $l7924 + local.get $l7925 + i32.add + local.set $l7926 + local.get $l7925 + local.get $l7926 + i32.add + local.set $l7927 + local.get $l7926 + local.get $l7927 + i32.add + local.set $l7928 + local.get $l7927 + local.get $l7928 + i32.add + local.set $l7929 + local.get $l7928 + local.get $l7929 + i32.add + local.set $l7930 + local.get $l7929 + local.get $l7930 + i32.add + local.set $l7931 + local.get $l7930 + local.get $l7931 + i32.add + local.set $l7932 + local.get $l7931 + local.get $l7932 + i32.add + local.set $l7933 + local.get $l7932 + local.get $l7933 + i32.add + local.set $l7934 + local.get $l7933 + local.get $l7934 + i32.add + local.set $l7935 + local.get $l7934 + local.get $l7935 + i32.add + local.set $l7936 + local.get $l7935 + local.get $l7936 + i32.add + local.set $l7937 + local.get $l7936 + local.get $l7937 + i32.add + local.set $l7938 + local.get $l7937 + local.get $l7938 + i32.add + local.set $l7939 + local.get $l7938 + local.get $l7939 + i32.add + local.set $l7940 + local.get $l7939 + local.get $l7940 + i32.add + local.set $l7941 + local.get $l7940 + local.get $l7941 + i32.add + local.set $l7942 + local.get $l7941 + local.get $l7942 + i32.add + local.set $l7943 + local.get $l7942 + local.get $l7943 + i32.add + local.set $l7944 + local.get $l7943 + local.get $l7944 + i32.add + local.set $l7945 + local.get $l7944 + local.get $l7945 + i32.add + local.set $l7946 + local.get $l7945 + local.get $l7946 + i32.add + local.set $l7947 + local.get $l7946 + local.get $l7947 + i32.add + local.set $l7948 + local.get $l7947 + local.get $l7948 + i32.add + local.set $l7949 + local.get $l7948 + local.get $l7949 + i32.add + local.set $l7950 + local.get $l7949 + local.get $l7950 + i32.add + local.set $l7951 + local.get $l7950 + local.get $l7951 + i32.add + local.set $l7952 + local.get $l7951 + local.get $l7952 + i32.add + local.set $l7953 + local.get $l7952 + local.get $l7953 + i32.add + local.set $l7954 + local.get $l7953 + local.get $l7954 + i32.add + local.set $l7955 + local.get $l7954 + local.get $l7955 + i32.add + local.set $l7956 + local.get $l7955 + local.get $l7956 + i32.add + local.set $l7957 + local.get $l7956 + local.get $l7957 + i32.add + local.set $l7958 + local.get $l7957 + local.get $l7958 + i32.add + local.set $l7959 + local.get $l7958 + local.get $l7959 + i32.add + local.set $l7960 + local.get $l7959 + local.get $l7960 + i32.add + local.set $l7961 + local.get $l7960 + local.get $l7961 + i32.add + local.set $l7962 + local.get $l7961 + local.get $l7962 + i32.add + local.set $l7963 + local.get $l7962 + local.get $l7963 + i32.add + local.set $l7964 + local.get $l7963 + local.get $l7964 + i32.add + local.set $l7965 + local.get $l7964 + local.get $l7965 + i32.add + local.set $l7966 + local.get $l7965 + local.get $l7966 + i32.add + local.set $l7967 + local.get $l7966 + local.get $l7967 + i32.add + local.set $l7968 + local.get $l7967 + local.get $l7968 + i32.add + local.set $l7969 + local.get $l7968 + local.get $l7969 + i32.add + local.set $l7970 + local.get $l7969 + local.get $l7970 + i32.add + local.set $l7971 + local.get $l7970 + local.get $l7971 + i32.add + local.set $l7972 + local.get $l7971 + local.get $l7972 + i32.add + local.set $l7973 + local.get $l7972 + local.get $l7973 + i32.add + local.set $l7974 + local.get $l7973 + local.get $l7974 + i32.add + local.set $l7975 + local.get $l7974 + local.get $l7975 + i32.add + local.set $l7976 + local.get $l7975 + local.get $l7976 + i32.add + local.set $l7977 + local.get $l7976 + local.get $l7977 + i32.add + local.set $l7978 + local.get $l7977 + local.get $l7978 + i32.add + local.set $l7979 + local.get $l7978 + local.get $l7979 + i32.add + local.set $l7980 + local.get $l7979 + local.get $l7980 + i32.add + local.set $l7981 + local.get $l7980 + local.get $l7981 + i32.add + local.set $l7982 + local.get $l7981 + local.get $l7982 + i32.add + local.set $l7983 + local.get $l7982 + local.get $l7983 + i32.add + local.set $l7984 + local.get $l7983 + local.get $l7984 + i32.add + local.set $l7985 + local.get $l7984 + local.get $l7985 + i32.add + local.set $l7986 + local.get $l7985 + local.get $l7986 + i32.add + local.set $l7987 + local.get $l7986 + local.get $l7987 + i32.add + local.set $l7988 + local.get $l7987 + local.get $l7988 + i32.add + local.set $l7989 + local.get $l7988 + local.get $l7989 + i32.add + local.set $l7990 + local.get $l7989 + local.get $l7990 + i32.add + local.set $l7991 + local.get $l7990 + local.get $l7991 + i32.add + local.set $l7992 + local.get $l7991 + local.get $l7992 + i32.add + local.set $l7993 + local.get $l7992 + local.get $l7993 + i32.add + local.set $l7994 + local.get $l7993 + local.get $l7994 + i32.add + local.set $l7995 + local.get $l7994 + local.get $l7995 + i32.add + local.set $l7996 + local.get $l7995 + local.get $l7996 + i32.add + local.set $l7997 + local.get $l7996 + local.get $l7997 + i32.add + local.set $l7998 + local.get $l7997 + local.get $l7998 + i32.add + local.set $l7999 + local.get $l7998 + local.get $l7999 + i32.add + local.set $l8000 + local.get $l7999 + local.get $l8000 + i32.add + local.set $l8001 + local.get $l8000 + local.get $l8001 + i32.add + local.set $l8002 + local.get $l8001 + local.get $l8002 + i32.add + local.set $l8003 + local.get $l8002 + local.get $l8003 + i32.add + local.set $l8004 + local.get $l8003 + local.get $l8004 + i32.add + local.set $l8005 + local.get $l8004 + local.get $l8005 + i32.add + local.set $l8006 + local.get $l8005 + local.get $l8006 + i32.add + local.set $l8007 + local.get $l8006 + local.get $l8007 + i32.add + local.set $l8008 + local.get $l8007 + local.get $l8008 + i32.add + local.set $l8009 + local.get $l8008 + local.get $l8009 + i32.add + local.set $l8010 + local.get $l8009 + local.get $l8010 + i32.add + local.set $l8011 + local.get $l8010 + local.get $l8011 + i32.add + local.set $l8012 + local.get $l8011 + local.get $l8012 + i32.add + local.set $l8013 + local.get $l8012 + local.get $l8013 + i32.add + local.set $l8014 + local.get $l8013 + local.get $l8014 + i32.add + local.set $l8015 + local.get $l8014 + local.get $l8015 + i32.add + local.set $l8016 + local.get $l8015 + local.get $l8016 + i32.add + local.set $l8017 + local.get $l8016 + local.get $l8017 + i32.add + local.set $l8018 + local.get $l8017 + local.get $l8018 + i32.add + local.set $l8019 + local.get $l8018 + local.get $l8019 + i32.add + local.set $l8020 + local.get $l8019 + local.get $l8020 + i32.add + local.set $l8021 + local.get $l8020 + local.get $l8021 + i32.add + local.set $l8022 + local.get $l8021 + local.get $l8022 + i32.add + local.set $l8023 + local.get $l8022 + local.get $l8023 + i32.add + local.set $l8024 + local.get $l8023 + local.get $l8024 + i32.add + local.set $l8025 + local.get $l8024 + local.get $l8025 + i32.add + local.set $l8026 + local.get $l8025 + local.get $l8026 + i32.add + local.set $l8027 + local.get $l8026 + local.get $l8027 + i32.add + local.set $l8028 + local.get $l8027 + local.get $l8028 + i32.add + local.set $l8029 + local.get $l8028 + local.get $l8029 + i32.add + local.set $l8030 + local.get $l8029 + local.get $l8030 + i32.add + local.set $l8031 + local.get $l8030 + local.get $l8031 + i32.add + local.set $l8032 + local.get $l8031 + local.get $l8032 + i32.add + local.set $l8033 + local.get $l8032 + local.get $l8033 + i32.add + local.set $l8034 + local.get $l8033 + local.get $l8034 + i32.add + local.set $l8035 + local.get $l8034 + local.get $l8035 + i32.add + local.set $l8036 + local.get $l8035 + local.get $l8036 + i32.add + local.set $l8037 + local.get $l8036 + local.get $l8037 + i32.add + local.set $l8038 + local.get $l8037 + local.get $l8038 + i32.add + local.set $l8039 + local.get $l8038 + local.get $l8039 + i32.add + local.set $l8040 + local.get $l8039 + local.get $l8040 + i32.add + local.set $l8041 + local.get $l8040 + local.get $l8041 + i32.add + local.set $l8042 + local.get $l8041 + local.get $l8042 + i32.add + local.set $l8043 + local.get $l8042 + local.get $l8043 + i32.add + local.set $l8044 + local.get $l8043 + local.get $l8044 + i32.add + local.set $l8045 + local.get $l8044 + local.get $l8045 + i32.add + local.set $l8046 + local.get $l8045 + local.get $l8046 + i32.add + local.set $l8047 + local.get $l8046 + local.get $l8047 + i32.add + local.set $l8048 + local.get $l8047 + local.get $l8048 + i32.add + local.set $l8049 + local.get $l8048 + local.get $l8049 + i32.add + local.set $l8050 + local.get $l8049 + local.get $l8050 + i32.add + local.set $l8051 + local.get $l8050 + local.get $l8051 + i32.add + local.set $l8052 + local.get $l8051 + local.get $l8052 + i32.add + local.set $l8053 + local.get $l8052 + local.get $l8053 + i32.add + local.set $l8054 + local.get $l8053 + local.get $l8054 + i32.add + local.set $l8055 + local.get $l8054 + local.get $l8055 + i32.add + local.set $l8056 + local.get $l8055 + local.get $l8056 + i32.add + local.set $l8057 + local.get $l8056 + local.get $l8057 + i32.add + local.set $l8058 + local.get $l8057 + local.get $l8058 + i32.add + local.set $l8059 + local.get $l8058 + local.get $l8059 + i32.add + local.set $l8060 + local.get $l8059 + local.get $l8060 + i32.add + local.set $l8061 + local.get $l8060 + local.get $l8061 + i32.add + local.set $l8062 + local.get $l8061 + local.get $l8062 + i32.add + local.set $l8063 + local.get $l8062 + local.get $l8063 + i32.add + local.set $l8064 + local.get $l8063 + local.get $l8064 + i32.add + local.set $l8065 + local.get $l8064 + local.get $l8065 + i32.add + local.set $l8066 + local.get $l8065 + local.get $l8066 + i32.add + local.set $l8067 + local.get $l8066 + local.get $l8067 + i32.add + local.set $l8068 + local.get $l8067 + local.get $l8068 + i32.add + local.set $l8069 + local.get $l8068 + local.get $l8069 + i32.add + local.set $l8070 + local.get $l8069 + local.get $l8070 + i32.add + local.set $l8071 + local.get $l8070 + local.get $l8071 + i32.add + local.set $l8072 + local.get $l8071 + local.get $l8072 + i32.add + local.set $l8073 + local.get $l8072 + local.get $l8073 + i32.add + local.set $l8074 + local.get $l8073 + local.get $l8074 + i32.add + local.set $l8075 + local.get $l8074 + local.get $l8075 + i32.add + local.set $l8076 + local.get $l8075 + local.get $l8076 + i32.add + local.set $l8077 + local.get $l8076 + local.get $l8077 + i32.add + local.set $l8078 + local.get $l8077 + local.get $l8078 + i32.add + local.set $l8079 + local.get $l8078 + local.get $l8079 + i32.add + local.set $l8080 + local.get $l8079 + local.get $l8080 + i32.add + local.set $l8081 + local.get $l8080 + local.get $l8081 + i32.add + local.set $l8082 + local.get $l8081 + local.get $l8082 + i32.add + local.set $l8083 + local.get $l8082 + local.get $l8083 + i32.add + local.set $l8084 + local.get $l8083 + local.get $l8084 + i32.add + local.set $l8085 + local.get $l8084 + local.get $l8085 + i32.add + local.set $l8086 + local.get $l8085 + local.get $l8086 + i32.add + local.set $l8087 + local.get $l8086 + local.get $l8087 + i32.add + local.set $l8088 + local.get $l8087 + local.get $l8088 + i32.add + local.set $l8089 + local.get $l8088 + local.get $l8089 + i32.add + local.set $l8090 + local.get $l8089 + local.get $l8090 + i32.add + local.set $l8091 + local.get $l8090 + local.get $l8091 + i32.add + local.set $l8092 + local.get $l8091 + local.get $l8092 + i32.add + local.set $l8093 + local.get $l8092 + local.get $l8093 + i32.add + local.set $l8094 + local.get $l8093 + local.get $l8094 + i32.add + local.set $l8095 + local.get $l8094 + local.get $l8095 + i32.add + local.set $l8096 + local.get $l8095 + local.get $l8096 + i32.add + local.set $l8097 + local.get $l8096 + local.get $l8097 + i32.add + local.set $l8098 + local.get $l8097 + local.get $l8098 + i32.add + local.set $l8099 + local.get $l8098 + local.get $l8099 + i32.add + local.set $l8100 + local.get $l8099 + local.get $l8100 + i32.add + local.set $l8101 + local.get $l8100 + local.get $l8101 + i32.add + local.set $l8102 + local.get $l8101 + local.get $l8102 + i32.add + local.set $l8103 + local.get $l8102 + local.get $l8103 + i32.add + local.set $l8104 + local.get $l8103 + local.get $l8104 + i32.add + local.set $l8105 + local.get $l8104 + local.get $l8105 + i32.add + local.set $l8106 + local.get $l8105 + local.get $l8106 + i32.add + local.set $l8107 + local.get $l8106 + local.get $l8107 + i32.add + local.set $l8108 + local.get $l8107 + local.get $l8108 + i32.add + local.set $l8109 + local.get $l8108 + local.get $l8109 + i32.add + local.set $l8110 + local.get $l8109 + local.get $l8110 + i32.add + local.set $l8111 + local.get $l8110 + local.get $l8111 + i32.add + local.set $l8112 + local.get $l8111 + local.get $l8112 + i32.add + local.set $l8113 + local.get $l8112 + local.get $l8113 + i32.add + local.set $l8114 + local.get $l8113 + local.get $l8114 + i32.add + local.set $l8115 + local.get $l8114 + local.get $l8115 + i32.add + local.set $l8116 + local.get $l8115 + local.get $l8116 + i32.add + local.set $l8117 + local.get $l8116 + local.get $l8117 + i32.add + local.set $l8118 + local.get $l8117 + local.get $l8118 + i32.add + local.set $l8119 + local.get $l8118 + local.get $l8119 + i32.add + local.set $l8120 + local.get $l8119 + local.get $l8120 + i32.add + local.set $l8121 + local.get $l8120 + local.get $l8121 + i32.add + local.set $l8122 + local.get $l8121 + local.get $l8122 + i32.add + local.set $l8123 + local.get $l8122 + local.get $l8123 + i32.add + local.set $l8124 + local.get $l8123 + local.get $l8124 + i32.add + local.set $l8125 + local.get $l8124 + local.get $l8125 + i32.add + local.set $l8126 + local.get $l8125 + local.get $l8126 + i32.add + local.set $l8127 + local.get $l8126 + local.get $l8127 + i32.add + local.set $l8128 + local.get $l8127 + local.get $l8128 + i32.add + local.set $l8129 + local.get $l8128 + local.get $l8129 + i32.add + local.set $l8130 + local.get $l8129 + local.get $l8130 + i32.add + local.set $l8131 + local.get $l8130 + local.get $l8131 + i32.add + local.set $l8132 + local.get $l8131 + local.get $l8132 + i32.add + local.set $l8133 + local.get $l8132 + local.get $l8133 + i32.add + local.set $l8134 + local.get $l8133 + local.get $l8134 + i32.add + local.set $l8135 + local.get $l8134 + local.get $l8135 + i32.add + local.set $l8136 + local.get $l8135 + local.get $l8136 + i32.add + local.set $l8137 + local.get $l8136 + local.get $l8137 + i32.add + local.set $l8138 + local.get $l8137 + local.get $l8138 + i32.add + local.set $l8139 + local.get $l8138 + local.get $l8139 + i32.add + local.set $l8140 + local.get $l8139 + local.get $l8140 + i32.add + local.set $l8141 + local.get $l8140 + local.get $l8141 + i32.add + local.set $l8142 + local.get $l8141 + local.get $l8142 + i32.add + local.set $l8143 + local.get $l8142 + local.get $l8143 + i32.add + local.set $l8144 + local.get $l8143 + local.get $l8144 + i32.add + local.set $l8145 + local.get $l8144 + local.get $l8145 + i32.add + local.set $l8146 + local.get $l8145 + local.get $l8146 + i32.add + local.set $l8147 + local.get $l8146 + local.get $l8147 + i32.add + local.set $l8148 + local.get $l8147 + local.get $l8148 + i32.add + local.set $l8149 + local.get $l8148 + local.get $l8149 + i32.add + local.set $l8150 + local.get $l8149 + local.get $l8150 + i32.add + local.set $l8151 + local.get $l8150 + local.get $l8151 + i32.add + local.set $l8152 + local.get $l8151 + local.get $l8152 + i32.add + local.set $l8153 + local.get $l8152 + local.get $l8153 + i32.add + local.set $l8154 + local.get $l8153 + local.get $l8154 + i32.add + local.set $l8155 + local.get $l8154 + local.get $l8155 + i32.add + local.set $l8156 + local.get $l8155 + local.get $l8156 + i32.add + local.set $l8157 + local.get $l8156 + local.get $l8157 + i32.add + local.set $l8158 + local.get $l8157 + local.get $l8158 + i32.add + local.set $l8159 + local.get $l8158 + local.get $l8159 + i32.add + local.set $l8160 + local.get $l8159 + local.get $l8160 + i32.add + local.set $l8161 + local.get $l8160 + local.get $l8161 + i32.add + local.set $l8162 + local.get $l8161 + local.get $l8162 + i32.add + local.set $l8163 + local.get $l8162 + local.get $l8163 + i32.add + local.set $l8164 + local.get $l8163 + local.get $l8164 + i32.add + local.set $l8165 + local.get $l8164 + local.get $l8165 + i32.add + local.set $l8166 + local.get $l8165 + local.get $l8166 + i32.add + local.set $l8167 + local.get $l8166 + local.get $l8167 + i32.add + local.set $l8168 + local.get $l8167 + local.get $l8168 + i32.add + local.set $l8169 + local.get $l8168 + local.get $l8169 + i32.add + local.set $l8170 + local.get $l8169 + local.get $l8170 + i32.add + local.set $l8171 + local.get $l8170 + local.get $l8171 + i32.add + local.set $l8172 + local.get $l8171 + local.get $l8172 + i32.add + local.set $l8173 + local.get $l8172 + local.get $l8173 + i32.add + local.set $l8174 + local.get $l8173 + local.get $l8174 + i32.add + local.set $l8175 + local.get $l8174 + local.get $l8175 + i32.add + local.set $l8176 + local.get $l8175 + local.get $l8176 + i32.add + local.set $l8177 + local.get $l8176 + local.get $l8177 + i32.add + local.set $l8178 + local.get $l8177 + local.get $l8178 + i32.add + local.set $l8179 + local.get $l8178 + local.get $l8179 + i32.add + local.set $l8180 + local.get $l8179 + local.get $l8180 + i32.add + local.set $l8181 + local.get $l8180 + local.get $l8181 + i32.add + local.set $l8182 + local.get $l8181 + local.get $l8182 + i32.add + local.set $l8183 + local.get $l8182 + local.get $l8183 + i32.add + local.set $l8184 + local.get $l8183 + local.get $l8184 + i32.add + local.set $l8185 + local.get $l8184 + local.get $l8185 + i32.add + local.set $l8186 + local.get $l8185 + local.get $l8186 + i32.add + local.set $l8187 + local.get $l8186 + local.get $l8187 + i32.add + local.set $l8188 + local.get $l8187 + local.get $l8188 + i32.add + local.set $l8189 + local.get $l8188 + local.get $l8189 + i32.add + local.set $l8190 + local.get $l8189 + local.get $l8190 + i32.add + local.set $l8191 + local.get $l8190 + local.get $l8191 + i32.add + local.set $l8192 + local.get $l8191 + local.get $l8192 + i32.add + local.set $l8193 + local.get $l8192 + local.get $l8193 + i32.add + local.set $l8194 + local.get $l8193 + local.get $l8194 + i32.add + local.set $l8195 + local.get $l8194 + local.get $l8195 + i32.add + local.set $l8196 + local.get $l8195 + local.get $l8196 + i32.add + local.set $l8197 + local.get $l8196 + local.get $l8197 + i32.add + local.set $l8198 + local.get $l8197 + local.get $l8198 + i32.add + local.set $l8199 + local.get $l8198 + local.get $l8199 + i32.add + local.set $l8200 + local.get $l8199 + local.get $l8200 + i32.add + local.set $l8201 + local.get $l8200 + local.get $l8201 + i32.add + local.set $l8202 + local.get $l8201 + local.get $l8202 + i32.add + local.set $l8203 + local.get $l8202 + local.get $l8203 + i32.add + local.set $l8204 + local.get $l8203 + local.get $l8204 + i32.add + local.set $l8205 + local.get $l8204 + local.get $l8205 + i32.add + local.set $l8206 + local.get $l8205 + local.get $l8206 + i32.add + local.set $l8207 + local.get $l8206 + local.get $l8207 + i32.add + local.set $l8208 + local.get $l8207 + local.get $l8208 + i32.add + local.set $l8209 + local.get $l8208 + local.get $l8209 + i32.add + local.set $l8210 + local.get $l8209 + local.get $l8210 + i32.add + local.set $l8211 + local.get $l8210 + local.get $l8211 + i32.add + local.set $l8212 + local.get $l8211 + local.get $l8212 + i32.add + local.set $l8213 + local.get $l8212 + local.get $l8213 + i32.add + local.set $l8214 + local.get $l8213 + local.get $l8214 + i32.add + local.set $l8215 + local.get $l8214 + local.get $l8215 + i32.add + local.set $l8216 + local.get $l8215 + local.get $l8216 + i32.add + local.set $l8217 + local.get $l8216 + local.get $l8217 + i32.add + local.set $l8218 + local.get $l8217 + local.get $l8218 + i32.add + local.set $l8219 + local.get $l8218 + local.get $l8219 + i32.add + local.set $l8220 + local.get $l8219 + local.get $l8220 + i32.add + local.set $l8221 + local.get $l8220 + local.get $l8221 + i32.add + local.set $l8222 + local.get $l8221 + local.get $l8222 + i32.add + local.set $l8223 + local.get $l8222 + local.get $l8223 + i32.add + local.set $l8224 + local.get $l8223 + local.get $l8224 + i32.add + local.set $l8225 + local.get $l8224 + local.get $l8225 + i32.add + local.set $l8226 + local.get $l8225 + local.get $l8226 + i32.add + local.set $l8227 + local.get $l8226 + local.get $l8227 + i32.add + local.set $l8228 + local.get $l8227 + local.get $l8228 + i32.add + local.set $l8229 + local.get $l8228 + local.get $l8229 + i32.add + local.set $l8230 + local.get $l8229 + local.get $l8230 + i32.add + local.set $l8231 + local.get $l8230 + local.get $l8231 + i32.add + local.set $l8232 + local.get $l8231 + local.get $l8232 + i32.add + local.set $l8233 + local.get $l8232 + local.get $l8233 + i32.add + local.set $l8234 + local.get $l8233 + local.get $l8234 + i32.add + local.set $l8235 + local.get $l8234 + local.get $l8235 + i32.add + local.set $l8236 + local.get $l8235 + local.get $l8236 + i32.add + local.set $l8237 + local.get $l8236 + local.get $l8237 + i32.add + local.set $l8238 + local.get $l8237 + local.get $l8238 + i32.add + local.set $l8239 + local.get $l8238 + local.get $l8239 + i32.add + local.set $l8240 + local.get $l8239 + local.get $l8240 + i32.add + local.set $l8241 + local.get $l8240 + local.get $l8241 + i32.add + local.set $l8242 + local.get $l8241 + local.get $l8242 + i32.add + local.set $l8243 + local.get $l8242 + local.get $l8243 + i32.add + local.set $l8244 + local.get $l8243 + local.get $l8244 + i32.add + local.set $l8245 + local.get $l8244 + local.get $l8245 + i32.add + local.set $l8246 + local.get $l8245 + local.get $l8246 + i32.add + local.set $l8247 + local.get $l8246 + local.get $l8247 + i32.add + local.set $l8248 + local.get $l8247 + local.get $l8248 + i32.add + local.set $l8249 + local.get $l8248 + local.get $l8249 + i32.add + local.set $l8250 + local.get $l8249 + local.get $l8250 + i32.add + local.set $l8251 + local.get $l8250 + local.get $l8251 + i32.add + local.set $l8252 + local.get $l8251 + local.get $l8252 + i32.add + local.set $l8253 + local.get $l8252 + local.get $l8253 + i32.add + local.set $l8254 + local.get $l8253 + local.get $l8254 + i32.add + local.set $l8255 + local.get $l8254 + local.get $l8255 + i32.add + local.set $l8256 + local.get $l8255 + local.get $l8256 + i32.add + local.set $l8257 + local.get $l8256 + local.get $l8257 + i32.add + local.set $l8258 + local.get $l8257 + local.get $l8258 + i32.add + local.set $l8259 + local.get $l8258 + local.get $l8259 + i32.add + local.set $l8260 + local.get $l8259 + local.get $l8260 + i32.add + local.set $l8261 + local.get $l8260 + local.get $l8261 + i32.add + local.set $l8262 + local.get $l8261 + local.get $l8262 + i32.add + local.set $l8263 + local.get $l8262 + local.get $l8263 + i32.add + local.set $l8264 + local.get $l8263 + local.get $l8264 + i32.add + local.set $l8265 + local.get $l8264 + local.get $l8265 + i32.add + local.set $l8266 + local.get $l8265 + local.get $l8266 + i32.add + local.set $l8267 + local.get $l8266 + local.get $l8267 + i32.add + local.set $l8268 + local.get $l8267 + local.get $l8268 + i32.add + local.set $l8269 + local.get $l8268 + local.get $l8269 + i32.add + local.set $l8270 + local.get $l8269 + local.get $l8270 + i32.add + local.set $l8271 + local.get $l8270 + local.get $l8271 + i32.add + local.set $l8272 + local.get $l8271 + local.get $l8272 + i32.add + local.set $l8273 + local.get $l8272 + local.get $l8273 + i32.add + local.set $l8274 + local.get $l8273 + local.get $l8274 + i32.add + local.set $l8275 + local.get $l8274 + local.get $l8275 + i32.add + local.set $l8276 + local.get $l8275 + local.get $l8276 + i32.add + local.set $l8277 + local.get $l8276 + local.get $l8277 + i32.add + local.set $l8278 + local.get $l8277 + local.get $l8278 + i32.add + local.set $l8279 + local.get $l8278 + local.get $l8279 + i32.add + local.set $l8280 + local.get $l8279 + local.get $l8280 + i32.add + local.set $l8281 + local.get $l8280 + local.get $l8281 + i32.add + local.set $l8282 + local.get $l8281 + local.get $l8282 + i32.add + local.set $l8283 + local.get $l8282 + local.get $l8283 + i32.add + local.set $l8284 + local.get $l8283 + local.get $l8284 + i32.add + local.set $l8285 + local.get $l8284 + local.get $l8285 + i32.add + local.set $l8286 + local.get $l8285 + local.get $l8286 + i32.add + local.set $l8287 + local.get $l8286 + local.get $l8287 + i32.add + local.set $l8288 + local.get $l8287 + local.get $l8288 + i32.add + local.set $l8289 + local.get $l8288 + local.get $l8289 + i32.add + local.set $l8290 + local.get $l8289 + local.get $l8290 + i32.add + local.set $l8291 + local.get $l8290 + local.get $l8291 + i32.add + local.set $l8292 + local.get $l8291 + local.get $l8292 + i32.add + local.set $l8293 + local.get $l8292 + local.get $l8293 + i32.add + local.set $l8294 + local.get $l8293 + local.get $l8294 + i32.add + local.set $l8295 + local.get $l8294 + local.get $l8295 + i32.add + local.set $l8296 + local.get $l8295 + local.get $l8296 + i32.add + local.set $l8297 + local.get $l8296 + local.get $l8297 + i32.add + local.set $l8298 + local.get $l8297 + local.get $l8298 + i32.add + local.set $l8299 + local.get $l8298 + local.get $l8299 + i32.add + local.set $l8300 + local.get $l8299 + local.get $l8300 + i32.add + local.set $l8301 + local.get $l8300 + local.get $l8301 + i32.add + local.set $l8302 + local.get $l8301 + local.get $l8302 + i32.add + local.set $l8303 + local.get $l8302 + local.get $l8303 + i32.add + local.set $l8304 + local.get $l8303 + local.get $l8304 + i32.add + local.set $l8305 + local.get $l8304 + local.get $l8305 + i32.add + local.set $l8306 + local.get $l8305 + local.get $l8306 + i32.add + local.set $l8307 + local.get $l8306 + local.get $l8307 + i32.add + local.set $l8308 + local.get $l8307 + local.get $l8308 + i32.add + local.set $l8309 + local.get $l8308 + local.get $l8309 + i32.add + local.set $l8310 + local.get $l8309 + local.get $l8310 + i32.add + local.set $l8311 + local.get $l8310 + local.get $l8311 + i32.add + local.set $l8312 + local.get $l8311 + local.get $l8312 + i32.add + local.set $l8313 + local.get $l8312 + local.get $l8313 + i32.add + local.set $l8314 + local.get $l8313 + local.get $l8314 + i32.add + local.set $l8315 + local.get $l8314 + local.get $l8315 + i32.add + local.set $l8316 + local.get $l8315 + local.get $l8316 + i32.add + local.set $l8317 + local.get $l8316 + local.get $l8317 + i32.add + local.set $l8318 + local.get $l8317 + local.get $l8318 + i32.add + local.set $l8319 + local.get $l8318 + local.get $l8319 + i32.add + local.set $l8320 + local.get $l8319 + local.get $l8320 + i32.add + local.set $l8321 + local.get $l8320 + local.get $l8321 + i32.add + local.set $l8322 + local.get $l8321 + local.get $l8322 + i32.add + local.set $l8323 + local.get $l8322 + local.get $l8323 + i32.add + local.set $l8324 + local.get $l8323 + local.get $l8324 + i32.add + local.set $l8325 + local.get $l8324 + local.get $l8325 + i32.add + local.set $l8326 + local.get $l8325 + local.get $l8326 + i32.add + local.set $l8327 + local.get $l8326 + local.get $l8327 + i32.add + local.set $l8328 + local.get $l8327 + local.get $l8328 + i32.add + local.set $l8329 + local.get $l8328 + local.get $l8329 + i32.add + local.set $l8330 + local.get $l8329 + local.get $l8330 + i32.add + local.set $l8331 + local.get $l8330 + local.get $l8331 + i32.add + local.set $l8332 + local.get $l8331 + local.get $l8332 + i32.add + local.set $l8333 + local.get $l8332 + local.get $l8333 + i32.add + local.set $l8334 + local.get $l8333 + local.get $l8334 + i32.add + local.set $l8335 + local.get $l8334 + local.get $l8335 + i32.add + local.set $l8336 + local.get $l8335 + local.get $l8336 + i32.add + local.set $l8337 + local.get $l8336 + local.get $l8337 + i32.add + local.set $l8338 + local.get $l8337 + local.get $l8338 + i32.add + local.set $l8339 + local.get $l8338 + local.get $l8339 + i32.add + local.set $l8340 + local.get $l8339 + local.get $l8340 + i32.add + local.set $l8341 + local.get $l8340 + local.get $l8341 + i32.add + local.set $l8342 + local.get $l8341 + local.get $l8342 + i32.add + local.set $l8343 + local.get $l8342 + local.get $l8343 + i32.add + local.set $l8344 + local.get $l8343 + local.get $l8344 + i32.add + local.set $l8345 + local.get $l8344 + local.get $l8345 + i32.add + local.set $l8346 + local.get $l8345 + local.get $l8346 + i32.add + local.set $l8347 + local.get $l8346 + local.get $l8347 + i32.add + local.set $l8348 + local.get $l8347 + local.get $l8348 + i32.add + local.set $l8349 + local.get $l8348 + local.get $l8349 + i32.add + local.set $l8350 + local.get $l8349 + local.get $l8350 + i32.add + local.set $l8351 + local.get $l8350 + local.get $l8351 + i32.add + local.set $l8352 + local.get $l8351 + local.get $l8352 + i32.add + local.set $l8353 + local.get $l8352 + local.get $l8353 + i32.add + local.set $l8354 + local.get $l8353 + local.get $l8354 + i32.add + local.set $l8355 + local.get $l8354 + local.get $l8355 + i32.add + local.set $l8356 + local.get $l8355 + local.get $l8356 + i32.add + local.set $l8357 + local.get $l8356 + local.get $l8357 + i32.add + local.set $l8358 + local.get $l8357 + local.get $l8358 + i32.add + local.set $l8359 + local.get $l8358 + local.get $l8359 + i32.add + local.set $l8360 + local.get $l8359 + local.get $l8360 + i32.add + local.set $l8361 + local.get $l8360 + local.get $l8361 + i32.add + local.set $l8362 + local.get $l8361 + local.get $l8362 + i32.add + local.set $l8363 + local.get $l8362 + local.get $l8363 + i32.add + local.set $l8364 + local.get $l8363 + local.get $l8364 + i32.add + local.set $l8365 + local.get $l8364 + local.get $l8365 + i32.add + local.set $l8366 + local.get $l8365 + local.get $l8366 + i32.add + local.set $l8367 + local.get $l8366 + local.get $l8367 + i32.add + local.set $l8368 + local.get $l8367 + local.get $l8368 + i32.add + local.set $l8369 + local.get $l8368 + local.get $l8369 + i32.add + local.set $l8370 + local.get $l8369 + local.get $l8370 + i32.add + local.set $l8371 + local.get $l8370 + local.get $l8371 + i32.add + local.set $l8372 + local.get $l8371 + local.get $l8372 + i32.add + local.set $l8373 + local.get $l8372 + local.get $l8373 + i32.add + local.set $l8374 + local.get $l8373 + local.get $l8374 + i32.add + local.set $l8375 + local.get $l8374 + local.get $l8375 + i32.add + local.set $l8376 + local.get $l8375 + local.get $l8376 + i32.add + local.set $l8377 + local.get $l8376 + local.get $l8377 + i32.add + local.set $l8378 + local.get $l8377 + local.get $l8378 + i32.add + local.set $l8379 + local.get $l8378 + local.get $l8379 + i32.add + local.set $l8380 + local.get $l8379 + local.get $l8380 + i32.add + local.set $l8381 + local.get $l8380 + local.get $l8381 + i32.add + local.set $l8382 + local.get $l8381 + local.get $l8382 + i32.add + local.set $l8383 + local.get $l8382 + local.get $l8383 + i32.add + local.set $l8384 + local.get $l8383 + local.get $l8384 + i32.add + local.set $l8385 + local.get $l8384 + local.get $l8385 + i32.add + local.set $l8386 + local.get $l8385 + local.get $l8386 + i32.add + local.set $l8387 + local.get $l8386 + local.get $l8387 + i32.add + local.set $l8388 + local.get $l8387 + local.get $l8388 + i32.add + local.set $l8389 + local.get $l8388 + local.get $l8389 + i32.add + local.set $l8390 + local.get $l8389 + local.get $l8390 + i32.add + local.set $l8391 + local.get $l8390 + local.get $l8391 + i32.add + local.set $l8392 + local.get $l8391 + local.get $l8392 + i32.add + local.set $l8393 + local.get $l8392 + local.get $l8393 + i32.add + local.set $l8394 + local.get $l8393 + local.get $l8394 + i32.add + local.set $l8395 + local.get $l8394 + local.get $l8395 + i32.add + local.set $l8396 + local.get $l8395 + local.get $l8396 + i32.add + local.set $l8397 + local.get $l8396 + local.get $l8397 + i32.add + local.set $l8398 + local.get $l8397 + local.get $l8398 + i32.add + local.set $l8399 + local.get $l8398 + local.get $l8399 + i32.add + local.set $l8400 + local.get $l8399 + local.get $l8400 + i32.add + local.set $l8401 + local.get $l8400 + local.get $l8401 + i32.add + local.set $l8402 + local.get $l8401 + local.get $l8402 + i32.add + local.set $l8403 + local.get $l8402 + local.get $l8403 + i32.add + local.set $l8404 + local.get $l8403 + local.get $l8404 + i32.add + local.set $l8405 + local.get $l8404 + local.get $l8405 + i32.add + local.set $l8406 + local.get $l8405 + local.get $l8406 + i32.add + local.set $l8407 + local.get $l8406 + local.get $l8407 + i32.add + local.set $l8408 + local.get $l8407 + local.get $l8408 + i32.add + local.set $l8409 + local.get $l8408 + local.get $l8409 + i32.add + local.set $l8410 + local.get $l8409 + local.get $l8410 + i32.add + local.set $l8411 + local.get $l8410 + local.get $l8411 + i32.add + local.set $l8412 + local.get $l8411 + local.get $l8412 + i32.add + local.set $l8413 + local.get $l8412 + local.get $l8413 + i32.add + local.set $l8414 + local.get $l8413 + local.get $l8414 + i32.add + local.set $l8415 + local.get $l8414 + local.get $l8415 + i32.add + local.set $l8416 + local.get $l8415 + local.get $l8416 + i32.add + local.set $l8417 + local.get $l8416 + local.get $l8417 + i32.add + local.set $l8418 + local.get $l8417 + local.get $l8418 + i32.add + local.set $l8419 + local.get $l8418 + local.get $l8419 + i32.add + local.set $l8420 + local.get $l8419 + local.get $l8420 + i32.add + local.set $l8421 + local.get $l8420 + local.get $l8421 + i32.add + local.set $l8422 + local.get $l8421 + local.get $l8422 + i32.add + local.set $l8423 + local.get $l8422 + local.get $l8423 + i32.add + local.set $l8424 + local.get $l8423 + local.get $l8424 + i32.add + local.set $l8425 + local.get $l8424 + local.get $l8425 + i32.add + local.set $l8426 + local.get $l8425 + local.get $l8426 + i32.add + local.set $l8427 + local.get $l8426 + local.get $l8427 + i32.add + local.set $l8428 + local.get $l8427 + local.get $l8428 + i32.add + local.set $l8429 + local.get $l8428 + local.get $l8429 + i32.add + local.set $l8430 + local.get $l8429 + local.get $l8430 + i32.add + local.set $l8431 + local.get $l8430 + local.get $l8431 + i32.add + local.set $l8432 + local.get $l8431 + local.get $l8432 + i32.add + local.set $l8433 + local.get $l8432 + local.get $l8433 + i32.add + local.set $l8434 + local.get $l8433 + local.get $l8434 + i32.add + local.set $l8435 + local.get $l8434 + local.get $l8435 + i32.add + local.set $l8436 + local.get $l8435 + local.get $l8436 + i32.add + local.set $l8437 + local.get $l8436 + local.get $l8437 + i32.add + local.set $l8438 + local.get $l8437 + local.get $l8438 + i32.add + local.set $l8439 + local.get $l8438 + local.get $l8439 + i32.add + local.set $l8440 + local.get $l8439 + local.get $l8440 + i32.add + local.set $l8441 + local.get $l8440 + local.get $l8441 + i32.add + local.set $l8442 + local.get $l8441 + local.get $l8442 + i32.add + local.set $l8443 + local.get $l8442 + local.get $l8443 + i32.add + local.set $l8444 + local.get $l8443 + local.get $l8444 + i32.add + local.set $l8445 + local.get $l8444 + local.get $l8445 + i32.add + local.set $l8446 + local.get $l8445 + local.get $l8446 + i32.add + local.set $l8447 + local.get $l8446 + local.get $l8447 + i32.add + local.set $l8448 + local.get $l8447 + local.get $l8448 + i32.add + local.set $l8449 + local.get $l8448 + local.get $l8449 + i32.add + local.set $l8450 + local.get $l8449 + local.get $l8450 + i32.add + local.set $l8451 + local.get $l8450 + local.get $l8451 + i32.add + local.set $l8452 + local.get $l8451 + local.get $l8452 + i32.add + local.set $l8453 + local.get $l8452 + local.get $l8453 + i32.add + local.set $l8454 + local.get $l8453 + local.get $l8454 + i32.add + local.set $l8455 + local.get $l8454 + local.get $l8455 + i32.add + local.set $l8456 + local.get $l8455 + local.get $l8456 + i32.add + local.set $l8457 + local.get $l8456 + local.get $l8457 + i32.add + local.set $l8458 + local.get $l8457 + local.get $l8458 + i32.add + local.set $l8459 + local.get $l8458 + local.get $l8459 + i32.add + local.set $l8460 + local.get $l8459 + local.get $l8460 + i32.add + local.set $l8461 + local.get $l8460 + local.get $l8461 + i32.add + local.set $l8462 + local.get $l8461 + local.get $l8462 + i32.add + local.set $l8463 + local.get $l8462 + local.get $l8463 + i32.add + local.set $l8464 + local.get $l8463 + local.get $l8464 + i32.add + local.set $l8465 + local.get $l8464 + local.get $l8465 + i32.add + local.set $l8466 + local.get $l8465 + local.get $l8466 + i32.add + local.set $l8467 + local.get $l8466 + local.get $l8467 + i32.add + local.set $l8468 + local.get $l8467 + local.get $l8468 + i32.add + local.set $l8469 + local.get $l8468 + local.get $l8469 + i32.add + local.set $l8470 + local.get $l8469 + local.get $l8470 + i32.add + local.set $l8471 + local.get $l8470 + local.get $l8471 + i32.add + local.set $l8472 + local.get $l8471 + local.get $l8472 + i32.add + local.set $l8473 + local.get $l8472 + local.get $l8473 + i32.add + local.set $l8474 + local.get $l8473 + local.get $l8474 + i32.add + local.set $l8475 + local.get $l8474 + local.get $l8475 + i32.add + local.set $l8476 + local.get $l8475 + local.get $l8476 + i32.add + local.set $l8477 + local.get $l8476 + local.get $l8477 + i32.add + local.set $l8478 + local.get $l8477 + local.get $l8478 + i32.add + local.set $l8479 + local.get $l8478 + local.get $l8479 + i32.add + local.set $l8480 + local.get $l8479 + local.get $l8480 + i32.add + local.set $l8481 + local.get $l8480 + local.get $l8481 + i32.add + local.set $l8482 + local.get $l8481 + local.get $l8482 + i32.add + local.set $l8483 + local.get $l8482 + local.get $l8483 + i32.add + local.set $l8484 + local.get $l8483 + local.get $l8484 + i32.add + local.set $l8485 + local.get $l8484 + local.get $l8485 + i32.add + local.set $l8486 + local.get $l8485 + local.get $l8486 + i32.add + local.set $l8487 + local.get $l8486 + local.get $l8487 + i32.add + local.set $l8488 + local.get $l8487 + local.get $l8488 + i32.add + local.set $l8489 + local.get $l8488 + local.get $l8489 + i32.add + local.set $l8490 + local.get $l8489 + local.get $l8490 + i32.add + local.set $l8491 + local.get $l8490 + local.get $l8491 + i32.add + local.set $l8492 + local.get $l8491 + local.get $l8492 + i32.add + local.set $l8493 + local.get $l8492 + local.get $l8493 + i32.add + local.set $l8494 + local.get $l8493 + local.get $l8494 + i32.add + local.set $l8495 + local.get $l8494 + local.get $l8495 + i32.add + local.set $l8496 + local.get $l8495 + local.get $l8496 + i32.add + local.set $l8497 + local.get $l8496 + local.get $l8497 + i32.add + local.set $l8498 + local.get $l8497 + local.get $l8498 + i32.add + local.set $l8499 + local.get $l8498 + local.get $l8499 + i32.add + local.set $l8500 + local.get $l8499 + local.get $l8500 + i32.add + local.set $l8501 + local.get $l8500 + local.get $l8501 + i32.add + local.set $l8502 + local.get $l8501 + local.get $l8502 + i32.add + local.set $l8503 + local.get $l8502 + local.get $l8503 + i32.add + local.set $l8504 + local.get $l8503 + local.get $l8504 + i32.add + local.set $l8505 + local.get $l8504 + local.get $l8505 + i32.add + local.set $l8506 + local.get $l8505 + local.get $l8506 + i32.add + local.set $l8507 + local.get $l8506 + local.get $l8507 + i32.add + local.set $l8508 + local.get $l8507 + local.get $l8508 + i32.add + local.set $l8509 + local.get $l8508 + local.get $l8509 + i32.add + local.set $l8510 + local.get $l8509 + local.get $l8510 + i32.add + local.set $l8511 + local.get $l8510 + local.get $l8511 + i32.add + local.set $l8512 + local.get $l8511 + local.get $l8512 + i32.add + local.set $l8513 + local.get $l8512 + local.get $l8513 + i32.add + local.set $l8514 + local.get $l8513 + local.get $l8514 + i32.add + local.set $l8515 + local.get $l8514 + local.get $l8515 + i32.add + local.set $l8516 + local.get $l8515 + local.get $l8516 + i32.add + local.set $l8517 + local.get $l8516 + local.get $l8517 + i32.add + local.set $l8518 + local.get $l8517 + local.get $l8518 + i32.add + local.set $l8519 + local.get $l8518 + local.get $l8519 + i32.add + local.set $l8520 + local.get $l8519 + local.get $l8520 + i32.add + local.set $l8521 + local.get $l8520 + local.get $l8521 + i32.add + local.set $l8522 + local.get $l8521 + local.get $l8522 + i32.add + local.set $l8523 + local.get $l8522 + local.get $l8523 + i32.add + local.set $l8524 + local.get $l8523 + local.get $l8524 + i32.add + local.set $l8525 + local.get $l8524 + local.get $l8525 + i32.add + local.set $l8526 + local.get $l8525 + local.get $l8526 + i32.add + local.set $l8527 + local.get $l8526 + local.get $l8527 + i32.add + local.set $l8528 + local.get $l8527 + local.get $l8528 + i32.add + local.set $l8529 + local.get $l8528 + local.get $l8529 + i32.add + local.set $l8530 + local.get $l8529 + local.get $l8530 + i32.add + local.set $l8531 + local.get $l8530 + local.get $l8531 + i32.add + local.set $l8532 + local.get $l8531 + local.get $l8532 + i32.add + local.set $l8533 + local.get $l8532 + local.get $l8533 + i32.add + local.set $l8534 + local.get $l8533 + local.get $l8534 + i32.add + local.set $l8535 + local.get $l8534 + local.get $l8535 + i32.add + local.set $l8536 + local.get $l8535 + local.get $l8536 + i32.add + local.set $l8537 + local.get $l8536 + local.get $l8537 + i32.add + local.set $l8538 + local.get $l8537 + local.get $l8538 + i32.add + local.set $l8539 + local.get $l8538 + local.get $l8539 + i32.add + local.set $l8540 + local.get $l8539 + local.get $l8540 + i32.add + local.set $l8541 + local.get $l8540 + local.get $l8541 + i32.add + local.set $l8542 + local.get $l8541 + local.get $l8542 + i32.add + local.set $l8543 + local.get $l8542 + local.get $l8543 + i32.add + local.set $l8544 + local.get $l8543 + local.get $l8544 + i32.add + local.set $l8545 + local.get $l8544 + local.get $l8545 + i32.add + local.set $l8546 + local.get $l8545 + local.get $l8546 + i32.add + local.set $l8547 + local.get $l8546 + local.get $l8547 + i32.add + local.set $l8548 + local.get $l8547 + local.get $l8548 + i32.add + local.set $l8549 + local.get $l8548 + local.get $l8549 + i32.add + local.set $l8550 + local.get $l8549 + local.get $l8550 + i32.add + local.set $l8551 + local.get $l8550 + local.get $l8551 + i32.add + local.set $l8552 + local.get $l8551 + local.get $l8552 + i32.add + local.set $l8553 + local.get $l8552 + local.get $l8553 + i32.add + local.set $l8554 + local.get $l8553 + local.get $l8554 + i32.add + local.set $l8555 + local.get $l8554 + local.get $l8555 + i32.add + local.set $l8556 + local.get $l8555 + local.get $l8556 + i32.add + local.set $l8557 + local.get $l8556 + local.get $l8557 + i32.add + local.set $l8558 + local.get $l8557 + local.get $l8558 + i32.add + local.set $l8559 + local.get $l8558 + local.get $l8559 + i32.add + local.set $l8560 + local.get $l8559 + local.get $l8560 + i32.add + local.set $l8561 + local.get $l8560 + local.get $l8561 + i32.add + local.set $l8562 + local.get $l8561 + local.get $l8562 + i32.add + local.set $l8563 + local.get $l8562 + local.get $l8563 + i32.add + local.set $l8564 + local.get $l8563 + local.get $l8564 + i32.add + local.set $l8565 + local.get $l8564 + local.get $l8565 + i32.add + local.set $l8566 + local.get $l8565 + local.get $l8566 + i32.add + local.set $l8567 + local.get $l8566 + local.get $l8567 + i32.add + local.set $l8568 + local.get $l8567 + local.get $l8568 + i32.add + local.set $l8569 + local.get $l8568 + local.get $l8569 + i32.add + local.set $l8570 + local.get $l8569 + local.get $l8570 + i32.add + local.set $l8571 + local.get $l8570 + local.get $l8571 + i32.add + local.set $l8572 + local.get $l8571 + local.get $l8572 + i32.add + local.set $l8573 + local.get $l8572 + local.get $l8573 + i32.add + local.set $l8574 + local.get $l8573 + local.get $l8574 + i32.add + local.set $l8575 + local.get $l8574 + local.get $l8575 + i32.add + local.set $l8576 + local.get $l8575 + local.get $l8576 + i32.add + local.set $l8577 + local.get $l8576 + local.get $l8577 + i32.add + local.set $l8578 + local.get $l8577 + local.get $l8578 + i32.add + local.set $l8579 + local.get $l8578 + local.get $l8579 + i32.add + local.set $l8580 + local.get $l8579 + local.get $l8580 + i32.add + local.set $l8581 + local.get $l8580 + local.get $l8581 + i32.add + local.set $l8582 + local.get $l8581 + local.get $l8582 + i32.add + local.set $l8583 + local.get $l8582 + local.get $l8583 + i32.add + local.set $l8584 + local.get $l8583 + local.get $l8584 + i32.add + local.set $l8585 + local.get $l8584 + local.get $l8585 + i32.add + local.set $l8586 + local.get $l8585 + local.get $l8586 + i32.add + local.set $l8587 + local.get $l8586 + local.get $l8587 + i32.add + local.set $l8588 + local.get $l8587 + local.get $l8588 + i32.add + local.set $l8589 + local.get $l8588 + local.get $l8589 + i32.add + local.set $l8590 + local.get $l8589 + local.get $l8590 + i32.add + local.set $l8591 + local.get $l8590 + local.get $l8591 + i32.add + local.set $l8592 + local.get $l8591 + local.get $l8592 + i32.add + local.set $l8593 + local.get $l8592 + local.get $l8593 + i32.add + local.set $l8594 + local.get $l8593 + local.get $l8594 + i32.add + local.set $l8595 + local.get $l8594 + local.get $l8595 + i32.add + local.set $l8596 + local.get $l8595 + local.get $l8596 + i32.add + local.set $l8597 + local.get $l8596 + local.get $l8597 + i32.add + local.set $l8598 + local.get $l8597 + local.get $l8598 + i32.add + local.set $l8599 + local.get $l8598 + local.get $l8599 + i32.add + local.set $l8600 + local.get $l8599 + local.get $l8600 + i32.add + local.set $l8601 + local.get $l8600 + local.get $l8601 + i32.add + local.set $l8602 + local.get $l8601 + local.get $l8602 + i32.add + local.set $l8603 + local.get $l8602 + local.get $l8603 + i32.add + local.set $l8604 + local.get $l8603 + local.get $l8604 + i32.add + local.set $l8605 + local.get $l8604 + local.get $l8605 + i32.add + local.set $l8606 + local.get $l8605 + local.get $l8606 + i32.add + local.set $l8607 + local.get $l8606 + local.get $l8607 + i32.add + local.set $l8608 + local.get $l8607 + local.get $l8608 + i32.add + local.set $l8609 + local.get $l8608 + local.get $l8609 + i32.add + local.set $l8610 + local.get $l8609 + local.get $l8610 + i32.add + local.set $l8611 + local.get $l8610 + local.get $l8611 + i32.add + local.set $l8612 + local.get $l8611 + local.get $l8612 + i32.add + local.set $l8613 + local.get $l8612 + local.get $l8613 + i32.add + local.set $l8614 + local.get $l8613 + local.get $l8614 + i32.add + local.set $l8615 + local.get $l8614 + local.get $l8615 + i32.add + local.set $l8616 + local.get $l8615 + local.get $l8616 + i32.add + local.set $l8617 + local.get $l8616 + local.get $l8617 + i32.add + local.set $l8618 + local.get $l8617 + local.get $l8618 + i32.add + local.set $l8619 + local.get $l8618 + local.get $l8619 + i32.add + local.set $l8620 + local.get $l8619 + local.get $l8620 + i32.add + local.set $l8621 + local.get $l8620 + local.get $l8621 + i32.add + local.set $l8622 + local.get $l8621 + local.get $l8622 + i32.add + local.set $l8623 + local.get $l8622 + local.get $l8623 + i32.add + local.set $l8624 + local.get $l8623 + local.get $l8624 + i32.add + local.set $l8625 + local.get $l8624 + local.get $l8625 + i32.add + local.set $l8626 + local.get $l8625 + local.get $l8626 + i32.add + local.set $l8627 + local.get $l8626 + local.get $l8627 + i32.add + local.set $l8628 + local.get $l8627 + local.get $l8628 + i32.add + local.set $l8629 + local.get $l8628 + local.get $l8629 + i32.add + local.set $l8630 + local.get $l8629 + local.get $l8630 + i32.add + local.set $l8631 + local.get $l8630 + local.get $l8631 + i32.add + local.set $l8632 + local.get $l8631 + local.get $l8632 + i32.add + local.set $l8633 + local.get $l8632 + local.get $l8633 + i32.add + local.set $l8634 + local.get $l8633 + local.get $l8634 + i32.add + local.set $l8635 + local.get $l8634 + local.get $l8635 + i32.add + local.set $l8636 + local.get $l8635 + local.get $l8636 + i32.add + local.set $l8637 + local.get $l8636 + local.get $l8637 + i32.add + local.set $l8638 + local.get $l8637 + local.get $l8638 + i32.add + local.set $l8639 + local.get $l8638 + local.get $l8639 + i32.add + local.set $l8640 + local.get $l8639 + local.get $l8640 + i32.add + local.set $l8641 + local.get $l8640 + local.get $l8641 + i32.add + local.set $l8642 + local.get $l8641 + local.get $l8642 + i32.add + local.set $l8643 + local.get $l8642 + local.get $l8643 + i32.add + local.set $l8644 + local.get $l8643 + local.get $l8644 + i32.add + local.set $l8645 + local.get $l8644 + local.get $l8645 + i32.add + local.set $l8646 + local.get $l8645 + local.get $l8646 + i32.add + local.set $l8647 + local.get $l8646 + local.get $l8647 + i32.add + local.set $l8648 + local.get $l8647 + local.get $l8648 + i32.add + local.set $l8649 + local.get $l8648 + local.get $l8649 + i32.add + local.set $l8650 + local.get $l8649 + local.get $l8650 + i32.add + local.set $l8651 + local.get $l8650 + local.get $l8651 + i32.add + local.set $l8652 + local.get $l8651 + local.get $l8652 + i32.add + local.set $l8653 + local.get $l8652 + local.get $l8653 + i32.add + local.set $l8654 + local.get $l8653 + local.get $l8654 + i32.add + local.set $l8655 + local.get $l8654 + local.get $l8655 + i32.add + local.set $l8656 + local.get $l8655 + local.get $l8656 + i32.add + local.set $l8657 + local.get $l8656 + local.get $l8657 + i32.add + local.set $l8658 + local.get $l8657 + local.get $l8658 + i32.add + local.set $l8659 + local.get $l8658 + local.get $l8659 + i32.add + local.set $l8660 + local.get $l8659 + local.get $l8660 + i32.add + local.set $l8661 + local.get $l8660 + local.get $l8661 + i32.add + local.set $l8662 + local.get $l8661 + local.get $l8662 + i32.add + local.set $l8663 + local.get $l8662 + local.get $l8663 + i32.add + local.set $l8664 + local.get $l8663 + local.get $l8664 + i32.add + local.set $l8665 + local.get $l8664 + local.get $l8665 + i32.add + local.set $l8666 + local.get $l8665 + local.get $l8666 + i32.add + local.set $l8667 + local.get $l8666 + local.get $l8667 + i32.add + local.set $l8668 + local.get $l8667 + local.get $l8668 + i32.add + local.set $l8669 + local.get $l8668 + local.get $l8669 + i32.add + local.set $l8670 + local.get $l8669 + local.get $l8670 + i32.add + local.set $l8671 + local.get $l8670 + local.get $l8671 + i32.add + local.set $l8672 + local.get $l8671 + local.get $l8672 + i32.add + local.set $l8673 + local.get $l8672 + local.get $l8673 + i32.add + local.set $l8674 + local.get $l8673 + local.get $l8674 + i32.add + local.set $l8675 + local.get $l8674 + local.get $l8675 + i32.add + local.set $l8676 + local.get $l8675 + local.get $l8676 + i32.add + local.set $l8677 + local.get $l8676 + local.get $l8677 + i32.add + local.set $l8678 + local.get $l8677 + local.get $l8678 + i32.add + local.set $l8679 + local.get $l8678 + local.get $l8679 + i32.add + local.set $l8680 + local.get $l8679 + local.get $l8680 + i32.add + local.set $l8681 + local.get $l8680 + local.get $l8681 + i32.add + local.set $l8682 + local.get $l8681 + local.get $l8682 + i32.add + local.set $l8683 + local.get $l8682 + local.get $l8683 + i32.add + local.set $l8684 + local.get $l8683 + local.get $l8684 + i32.add + local.set $l8685 + local.get $l8684 + local.get $l8685 + i32.add + local.set $l8686 + local.get $l8685 + local.get $l8686 + i32.add + local.set $l8687 + local.get $l8686 + local.get $l8687 + i32.add + local.set $l8688 + local.get $l8687 + local.get $l8688 + i32.add + local.set $l8689 + local.get $l8688 + local.get $l8689 + i32.add + local.set $l8690 + local.get $l8689 + local.get $l8690 + i32.add + local.set $l8691 + local.get $l8690 + local.get $l8691 + i32.add + local.set $l8692 + local.get $l8691 + local.get $l8692 + i32.add + local.set $l8693 + local.get $l8692 + local.get $l8693 + i32.add + local.set $l8694 + local.get $l8693 + local.get $l8694 + i32.add + local.set $l8695 + local.get $l8694 + local.get $l8695 + i32.add + local.set $l8696 + local.get $l8695 + local.get $l8696 + i32.add + local.set $l8697 + local.get $l8696 + local.get $l8697 + i32.add + local.set $l8698 + local.get $l8697 + local.get $l8698 + i32.add + local.set $l8699 + local.get $l8698 + local.get $l8699 + i32.add + local.set $l8700 + local.get $l8699 + local.get $l8700 + i32.add + local.set $l8701 + local.get $l8700 + local.get $l8701 + i32.add + local.set $l8702 + local.get $l8701 + local.get $l8702 + i32.add + local.set $l8703 + local.get $l8702 + local.get $l8703 + i32.add + local.set $l8704 + local.get $l8703 + local.get $l8704 + i32.add + local.set $l8705 + local.get $l8704 + local.get $l8705 + i32.add + local.set $l8706 + local.get $l8705 + local.get $l8706 + i32.add + local.set $l8707 + local.get $l8706 + local.get $l8707 + i32.add + local.set $l8708 + local.get $l8707 + local.get $l8708 + i32.add + local.set $l8709 + local.get $l8708 + local.get $l8709 + i32.add + local.set $l8710 + local.get $l8709 + local.get $l8710 + i32.add + local.set $l8711 + local.get $l8710 + local.get $l8711 + i32.add + local.set $l8712 + local.get $l8711 + local.get $l8712 + i32.add + local.set $l8713 + local.get $l8712 + local.get $l8713 + i32.add + local.set $l8714 + local.get $l8713 + local.get $l8714 + i32.add + local.set $l8715 + local.get $l8714 + local.get $l8715 + i32.add + local.set $l8716 + local.get $l8715 + local.get $l8716 + i32.add + local.set $l8717 + local.get $l8716 + local.get $l8717 + i32.add + local.set $l8718 + local.get $l8717 + local.get $l8718 + i32.add + local.set $l8719 + local.get $l8718 + local.get $l8719 + i32.add + local.set $l8720 + local.get $l8719 + local.get $l8720 + i32.add + local.set $l8721 + local.get $l8720 + local.get $l8721 + i32.add + local.set $l8722 + local.get $l8721 + local.get $l8722 + i32.add + local.set $l8723 + local.get $l8722 + local.get $l8723 + i32.add + local.set $l8724 + local.get $l8723 + local.get $l8724 + i32.add + local.set $l8725 + local.get $l8724 + local.get $l8725 + i32.add + local.set $l8726 + local.get $l8725 + local.get $l8726 + i32.add + local.set $l8727 + local.get $l8726 + local.get $l8727 + i32.add + local.set $l8728 + local.get $l8727 + local.get $l8728 + i32.add + local.set $l8729 + local.get $l8728 + local.get $l8729 + i32.add + local.set $l8730 + local.get $l8729 + local.get $l8730 + i32.add + local.set $l8731 + local.get $l8730 + local.get $l8731 + i32.add + local.set $l8732 + local.get $l8731 + local.get $l8732 + i32.add + local.set $l8733 + local.get $l8732 + local.get $l8733 + i32.add + local.set $l8734 + local.get $l8733 + local.get $l8734 + i32.add + local.set $l8735 + local.get $l8734 + local.get $l8735 + i32.add + local.set $l8736 + local.get $l8735 + local.get $l8736 + i32.add + local.set $l8737 + local.get $l8736 + local.get $l8737 + i32.add + local.set $l8738 + local.get $l8737 + local.get $l8738 + i32.add + local.set $l8739 + local.get $l8738 + local.get $l8739 + i32.add + local.set $l8740 + local.get $l8739 + local.get $l8740 + i32.add + local.set $l8741 + local.get $l8740 + local.get $l8741 + i32.add + local.set $l8742 + local.get $l8741 + local.get $l8742 + i32.add + local.set $l8743 + local.get $l8742 + local.get $l8743 + i32.add + local.set $l8744 + local.get $l8743 + local.get $l8744 + i32.add + local.set $l8745 + local.get $l8744 + local.get $l8745 + i32.add + local.set $l8746 + local.get $l8745 + local.get $l8746 + i32.add + local.set $l8747 + local.get $l8746 + local.get $l8747 + i32.add + local.set $l8748 + local.get $l8747 + local.get $l8748 + i32.add + local.set $l8749 + local.get $l8748 + local.get $l8749 + i32.add + local.set $l8750 + local.get $l8749 + local.get $l8750 + i32.add + local.set $l8751 + local.get $l8750 + local.get $l8751 + i32.add + local.set $l8752 + local.get $l8751 + local.get $l8752 + i32.add + local.set $l8753 + local.get $l8752 + local.get $l8753 + i32.add + local.set $l8754 + local.get $l8753 + local.get $l8754 + i32.add + local.set $l8755 + local.get $l8754 + local.get $l8755 + i32.add + local.set $l8756 + local.get $l8755 + local.get $l8756 + i32.add + local.set $l8757 + local.get $l8756 + local.get $l8757 + i32.add + local.set $l8758 + local.get $l8757 + local.get $l8758 + i32.add + local.set $l8759 + local.get $l8758 + local.get $l8759 + i32.add + local.set $l8760 + local.get $l8759 + local.get $l8760 + i32.add + local.set $l8761 + local.get $l8760 + local.get $l8761 + i32.add + local.set $l8762 + local.get $l8761 + local.get $l8762 + i32.add + local.set $l8763 + local.get $l8762 + local.get $l8763 + i32.add + local.set $l8764 + local.get $l8763 + local.get $l8764 + i32.add + local.set $l8765 + local.get $l8764 + local.get $l8765 + i32.add + local.set $l8766 + local.get $l8765 + local.get $l8766 + i32.add + local.set $l8767 + local.get $l8766 + local.get $l8767 + i32.add + local.set $l8768 + local.get $l8767 + local.get $l8768 + i32.add + local.set $l8769 + local.get $l8768 + local.get $l8769 + i32.add + local.set $l8770 + local.get $l8769 + local.get $l8770 + i32.add + local.set $l8771 + local.get $l8770 + local.get $l8771 + i32.add + local.set $l8772 + local.get $l8771 + local.get $l8772 + i32.add + local.set $l8773 + local.get $l8772 + local.get $l8773 + i32.add + local.set $l8774 + local.get $l8773 + local.get $l8774 + i32.add + local.set $l8775 + local.get $l8774 + local.get $l8775 + i32.add + local.set $l8776 + local.get $l8775 + local.get $l8776 + i32.add + local.set $l8777 + local.get $l8776 + local.get $l8777 + i32.add + local.set $l8778 + local.get $l8777 + local.get $l8778 + i32.add + local.set $l8779 + local.get $l8778 + local.get $l8779 + i32.add + local.set $l8780 + local.get $l8779 + local.get $l8780 + i32.add + local.set $l8781 + local.get $l8780 + local.get $l8781 + i32.add + local.set $l8782 + local.get $l8781 + local.get $l8782 + i32.add + local.set $l8783 + local.get $l8782 + local.get $l8783 + i32.add + local.set $l8784 + local.get $l8783 + local.get $l8784 + i32.add + local.set $l8785 + local.get $l8784 + local.get $l8785 + i32.add + local.set $l8786 + local.get $l8785 + local.get $l8786 + i32.add + local.set $l8787 + local.get $l8786 + local.get $l8787 + i32.add + local.set $l8788 + local.get $l8787 + local.get $l8788 + i32.add + local.set $l8789 + local.get $l8788 + local.get $l8789 + i32.add + local.set $l8790 + local.get $l8789 + local.get $l8790 + i32.add + local.set $l8791 + local.get $l8790 + local.get $l8791 + i32.add + local.set $l8792 + local.get $l8791 + local.get $l8792 + i32.add + local.set $l8793 + local.get $l8792 + local.get $l8793 + i32.add + local.set $l8794 + local.get $l8793 + local.get $l8794 + i32.add + local.set $l8795 + local.get $l8794 + local.get $l8795 + i32.add + local.set $l8796 + local.get $l8795 + local.get $l8796 + i32.add + local.set $l8797 + local.get $l8796 + local.get $l8797 + i32.add + local.set $l8798 + local.get $l8797 + local.get $l8798 + i32.add + local.set $l8799 + local.get $l8798 + local.get $l8799 + i32.add + local.set $l8800 + local.get $l8799 + local.get $l8800 + i32.add + local.set $l8801 + local.get $l8800 + local.get $l8801 + i32.add + local.set $l8802 + local.get $l8801 + local.get $l8802 + i32.add + local.set $l8803 + local.get $l8802 + local.get $l8803 + i32.add + local.set $l8804 + local.get $l8803 + local.get $l8804 + i32.add + local.set $l8805 + local.get $l8804 + local.get $l8805 + i32.add + local.set $l8806 + local.get $l8805 + local.get $l8806 + i32.add + local.set $l8807 + local.get $l8806 + local.get $l8807 + i32.add + local.set $l8808 + local.get $l8807 + local.get $l8808 + i32.add + local.set $l8809 + local.get $l8808 + local.get $l8809 + i32.add + local.set $l8810 + local.get $l8809 + local.get $l8810 + i32.add + local.set $l8811 + local.get $l8810 + local.get $l8811 + i32.add + local.set $l8812 + local.get $l8811 + local.get $l8812 + i32.add + local.set $l8813 + local.get $l8812 + local.get $l8813 + i32.add + local.set $l8814 + local.get $l8813 + local.get $l8814 + i32.add + local.set $l8815 + local.get $l8814 + local.get $l8815 + i32.add + local.set $l8816 + local.get $l8815 + local.get $l8816 + i32.add + local.set $l8817 + local.get $l8816 + local.get $l8817 + i32.add + local.set $l8818 + local.get $l8817 + local.get $l8818 + i32.add + local.set $l8819 + local.get $l8818 + local.get $l8819 + i32.add + local.set $l8820 + local.get $l8819 + local.get $l8820 + i32.add + local.set $l8821 + local.get $l8820 + local.get $l8821 + i32.add + local.set $l8822 + local.get $l8821 + local.get $l8822 + i32.add + local.set $l8823 + local.get $l8822 + local.get $l8823 + i32.add + local.set $l8824 + local.get $l8823 + local.get $l8824 + i32.add + local.set $l8825 + local.get $l8824 + local.get $l8825 + i32.add + local.set $l8826 + local.get $l8825 + local.get $l8826 + i32.add + local.set $l8827 + local.get $l8826 + local.get $l8827 + i32.add + local.set $l8828 + local.get $l8827 + local.get $l8828 + i32.add + local.set $l8829 + local.get $l8828 + local.get $l8829 + i32.add + local.set $l8830 + local.get $l8829 + local.get $l8830 + i32.add + local.set $l8831 + local.get $l8830 + local.get $l8831 + i32.add + local.set $l8832 + local.get $l8831 + local.get $l8832 + i32.add + local.set $l8833 + local.get $l8832 + local.get $l8833 + i32.add + local.set $l8834 + local.get $l8833 + local.get $l8834 + i32.add + local.set $l8835 + local.get $l8834 + local.get $l8835 + i32.add + local.set $l8836 + local.get $l8835 + local.get $l8836 + i32.add + local.set $l8837 + local.get $l8836 + local.get $l8837 + i32.add + local.set $l8838 + local.get $l8837 + local.get $l8838 + i32.add + local.set $l8839 + local.get $l8838 + local.get $l8839 + i32.add + local.set $l8840 + local.get $l8839 + local.get $l8840 + i32.add + local.set $l8841 + local.get $l8840 + local.get $l8841 + i32.add + local.set $l8842 + local.get $l8841 + local.get $l8842 + i32.add + local.set $l8843 + local.get $l8842 + local.get $l8843 + i32.add + local.set $l8844 + local.get $l8843 + local.get $l8844 + i32.add + local.set $l8845 + local.get $l8844 + local.get $l8845 + i32.add + local.set $l8846 + local.get $l8845 + local.get $l8846 + i32.add + local.set $l8847 + local.get $l8846 + local.get $l8847 + i32.add + local.set $l8848 + local.get $l8847 + local.get $l8848 + i32.add + local.set $l8849 + local.get $l8848 + local.get $l8849 + i32.add + local.set $l8850 + local.get $l8849 + local.get $l8850 + i32.add + local.set $l8851 + local.get $l8850 + local.get $l8851 + i32.add + local.set $l8852 + local.get $l8851 + local.get $l8852 + i32.add + local.set $l8853 + local.get $l8852 + local.get $l8853 + i32.add + local.set $l8854 + local.get $l8853 + local.get $l8854 + i32.add + local.set $l8855 + local.get $l8854 + local.get $l8855 + i32.add + local.set $l8856 + local.get $l8855 + local.get $l8856 + i32.add + local.set $l8857 + local.get $l8856 + local.get $l8857 + i32.add + local.set $l8858 + local.get $l8857 + local.get $l8858 + i32.add + local.set $l8859 + local.get $l8858 + local.get $l8859 + i32.add + local.set $l8860 + local.get $l8859 + local.get $l8860 + i32.add + local.set $l8861 + local.get $l8860 + local.get $l8861 + i32.add + local.set $l8862 + local.get $l8861 + local.get $l8862 + i32.add + local.set $l8863 + local.get $l8862 + local.get $l8863 + i32.add + local.set $l8864 + local.get $l8863 + local.get $l8864 + i32.add + local.set $l8865 + local.get $l8864 + local.get $l8865 + i32.add + local.set $l8866 + local.get $l8865 + local.get $l8866 + i32.add + local.set $l8867 + local.get $l8866 + local.get $l8867 + i32.add + local.set $l8868 + local.get $l8867 + local.get $l8868 + i32.add + local.set $l8869 + local.get $l8868 + local.get $l8869 + i32.add + local.set $l8870 + local.get $l8869 + local.get $l8870 + i32.add + local.set $l8871 + local.get $l8870 + local.get $l8871 + i32.add + local.set $l8872 + local.get $l8871 + local.get $l8872 + i32.add + local.set $l8873 + local.get $l8872 + local.get $l8873 + i32.add + local.set $l8874 + local.get $l8873 + local.get $l8874 + i32.add + local.set $l8875 + local.get $l8874 + local.get $l8875 + i32.add + local.set $l8876 + local.get $l8875 + local.get $l8876 + i32.add + local.set $l8877 + local.get $l8876 + local.get $l8877 + i32.add + local.set $l8878 + local.get $l8877 + local.get $l8878 + i32.add + local.set $l8879 + local.get $l8878 + local.get $l8879 + i32.add + local.set $l8880 + local.get $l8879 + local.get $l8880 + i32.add + local.set $l8881 + local.get $l8880 + local.get $l8881 + i32.add + local.set $l8882 + local.get $l8881 + local.get $l8882 + i32.add + local.set $l8883 + local.get $l8882 + local.get $l8883 + i32.add + local.set $l8884 + local.get $l8883 + local.get $l8884 + i32.add + local.set $l8885 + local.get $l8884 + local.get $l8885 + i32.add + local.set $l8886 + local.get $l8885 + local.get $l8886 + i32.add + local.set $l8887 + local.get $l8886 + local.get $l8887 + i32.add + local.set $l8888 + local.get $l8887 + local.get $l8888 + i32.add + local.set $l8889 + local.get $l8888 + local.get $l8889 + i32.add + local.set $l8890 + local.get $l8889 + local.get $l8890 + i32.add + local.set $l8891 + local.get $l8890 + local.get $l8891 + i32.add + local.set $l8892 + local.get $l8891 + local.get $l8892 + i32.add + local.set $l8893 + local.get $l8892 + local.get $l8893 + i32.add + local.set $l8894 + local.get $l8893 + local.get $l8894 + i32.add + local.set $l8895 + local.get $l8894 + local.get $l8895 + i32.add + local.set $l8896 + local.get $l8895 + local.get $l8896 + i32.add + local.set $l8897 + local.get $l8896 + local.get $l8897 + i32.add + local.set $l8898 + local.get $l8897 + local.get $l8898 + i32.add + local.set $l8899 + local.get $l8898 + local.get $l8899 + i32.add + local.set $l8900 + local.get $l8899 + local.get $l8900 + i32.add + local.set $l8901 + local.get $l8900 + local.get $l8901 + i32.add + local.set $l8902 + local.get $l8901 + local.get $l8902 + i32.add + local.set $l8903 + local.get $l8902 + local.get $l8903 + i32.add + local.set $l8904 + local.get $l8903 + local.get $l8904 + i32.add + local.set $l8905 + local.get $l8904 + local.get $l8905 + i32.add + local.set $l8906 + local.get $l8905 + local.get $l8906 + i32.add + local.set $l8907 + local.get $l8906 + local.get $l8907 + i32.add + local.set $l8908 + local.get $l8907 + local.get $l8908 + i32.add + local.set $l8909 + local.get $l8908 + local.get $l8909 + i32.add + local.set $l8910 + local.get $l8909 + local.get $l8910 + i32.add + local.set $l8911 + local.get $l8910 + local.get $l8911 + i32.add + local.set $l8912 + local.get $l8911 + local.get $l8912 + i32.add + local.set $l8913 + local.get $l8912 + local.get $l8913 + i32.add + local.set $l8914 + local.get $l8913 + local.get $l8914 + i32.add + local.set $l8915 + local.get $l8914 + local.get $l8915 + i32.add + local.set $l8916 + local.get $l8915 + local.get $l8916 + i32.add + local.set $l8917 + local.get $l8916 + local.get $l8917 + i32.add + local.set $l8918 + local.get $l8917 + local.get $l8918 + i32.add + local.set $l8919 + local.get $l8918 + local.get $l8919 + i32.add + local.set $l8920 + local.get $l8919 + local.get $l8920 + i32.add + local.set $l8921 + local.get $l8920 + local.get $l8921 + i32.add + local.set $l8922 + local.get $l8921 + local.get $l8922 + i32.add + local.set $l8923 + local.get $l8922 + local.get $l8923 + i32.add + local.set $l8924 + local.get $l8923 + local.get $l8924 + i32.add + local.set $l8925 + local.get $l8924 + local.get $l8925 + i32.add + local.set $l8926 + local.get $l8925 + local.get $l8926 + i32.add + local.set $l8927 + local.get $l8926 + local.get $l8927 + i32.add + local.set $l8928 + local.get $l8927 + local.get $l8928 + i32.add + local.set $l8929 + local.get $l8928 + local.get $l8929 + i32.add + local.set $l8930 + local.get $l8929 + local.get $l8930 + i32.add + local.set $l8931 + local.get $l8930 + local.get $l8931 + i32.add + local.set $l8932 + local.get $l8931 + local.get $l8932 + i32.add + local.set $l8933 + local.get $l8932 + local.get $l8933 + i32.add + local.set $l8934 + local.get $l8933 + local.get $l8934 + i32.add + local.set $l8935 + local.get $l8934 + local.get $l8935 + i32.add + local.set $l8936 + local.get $l8935 + local.get $l8936 + i32.add + local.set $l8937 + local.get $l8936 + local.get $l8937 + i32.add + local.set $l8938 + local.get $l8937 + local.get $l8938 + i32.add + local.set $l8939 + local.get $l8938 + local.get $l8939 + i32.add + local.set $l8940 + local.get $l8939 + local.get $l8940 + i32.add + local.set $l8941 + local.get $l8940 + local.get $l8941 + i32.add + local.set $l8942 + local.get $l8941 + local.get $l8942 + i32.add + local.set $l8943 + local.get $l8942 + local.get $l8943 + i32.add + local.set $l8944 + local.get $l8943 + local.get $l8944 + i32.add + local.set $l8945 + local.get $l8944 + local.get $l8945 + i32.add + local.set $l8946 + local.get $l8945 + local.get $l8946 + i32.add + local.set $l8947 + local.get $l8946 + local.get $l8947 + i32.add + local.set $l8948 + local.get $l8947 + local.get $l8948 + i32.add + local.set $l8949 + local.get $l8948 + local.get $l8949 + i32.add + local.set $l8950 + local.get $l8949 + local.get $l8950 + i32.add + local.set $l8951 + local.get $l8950 + local.get $l8951 + i32.add + local.set $l8952 + local.get $l8951 + local.get $l8952 + i32.add + local.set $l8953 + local.get $l8952 + local.get $l8953 + i32.add + local.set $l8954 + local.get $l8953 + local.get $l8954 + i32.add + local.set $l8955 + local.get $l8954 + local.get $l8955 + i32.add + local.set $l8956 + local.get $l8955 + local.get $l8956 + i32.add + local.set $l8957 + local.get $l8956 + local.get $l8957 + i32.add + local.set $l8958 + local.get $l8957 + local.get $l8958 + i32.add + local.set $l8959 + local.get $l8958 + local.get $l8959 + i32.add + local.set $l8960 + local.get $l8959 + local.get $l8960 + i32.add + local.set $l8961 + local.get $l8960 + local.get $l8961 + i32.add + local.set $l8962 + local.get $l8961 + local.get $l8962 + i32.add + local.set $l8963 + local.get $l8962 + local.get $l8963 + i32.add + local.set $l8964 + local.get $l8963 + local.get $l8964 + i32.add + local.set $l8965 + local.get $l8964 + local.get $l8965 + i32.add + local.set $l8966 + local.get $l8965 + local.get $l8966 + i32.add + local.set $l8967 + local.get $l8966 + local.get $l8967 + i32.add + local.set $l8968 + local.get $l8967 + local.get $l8968 + i32.add + local.set $l8969 + local.get $l8968 + local.get $l8969 + i32.add + local.set $l8970 + local.get $l8969 + local.get $l8970 + i32.add + local.set $l8971 + local.get $l8970 + local.get $l8971 + i32.add + local.set $l8972 + local.get $l8971 + local.get $l8972 + i32.add + local.set $l8973 + local.get $l8972 + local.get $l8973 + i32.add + local.set $l8974 + local.get $l8973 + local.get $l8974 + i32.add + local.set $l8975 + local.get $l8974 + local.get $l8975 + i32.add + local.set $l8976 + local.get $l8975 + local.get $l8976 + i32.add + local.set $l8977 + local.get $l8976 + local.get $l8977 + i32.add + local.set $l8978 + local.get $l8977 + local.get $l8978 + i32.add + local.set $l8979 + local.get $l8978 + local.get $l8979 + i32.add + local.set $l8980 + local.get $l8979 + local.get $l8980 + i32.add + local.set $l8981 + local.get $l8980 + local.get $l8981 + i32.add + local.set $l8982 + local.get $l8981 + local.get $l8982 + i32.add + local.set $l8983 + local.get $l8982 + local.get $l8983 + i32.add + local.set $l8984 + local.get $l8983 + local.get $l8984 + i32.add + local.set $l8985 + local.get $l8984 + local.get $l8985 + i32.add + local.set $l8986 + local.get $l8985 + local.get $l8986 + i32.add + local.set $l8987 + local.get $l8986 + local.get $l8987 + i32.add + local.set $l8988 + local.get $l8987 + local.get $l8988 + i32.add + local.set $l8989 + local.get $l8988 + local.get $l8989 + i32.add + local.set $l8990 + local.get $l8989 + local.get $l8990 + i32.add + local.set $l8991 + local.get $l8990 + local.get $l8991 + i32.add + local.set $l8992 + local.get $l8991 + local.get $l8992 + i32.add + local.set $l8993 + local.get $l8992 + local.get $l8993 + i32.add + local.set $l8994 + local.get $l8993 + local.get $l8994 + i32.add + local.set $l8995 + local.get $l8994 + local.get $l8995 + i32.add + local.set $l8996 + local.get $l8995 + local.get $l8996 + i32.add + local.set $l8997 + local.get $l8996 + local.get $l8997 + i32.add + local.set $l8998 + local.get $l8997 + local.get $l8998 + i32.add + local.set $l8999 + local.get $l8998 + local.get $l8999 + i32.add + local.set $l9000 + local.get $l8999 + local.get $l9000 + i32.add + local.set $l9001 + local.get $l9000 + local.get $l9001 + i32.add + local.set $l9002 + local.get $l9001 + local.get $l9002 + i32.add + local.set $l9003 + local.get $l9002 + local.get $l9003 + i32.add + local.set $l9004 + local.get $l9003 + local.get $l9004 + i32.add + local.set $l9005 + local.get $l9004 + local.get $l9005 + i32.add + local.set $l9006 + local.get $l9005 + local.get $l9006 + i32.add + local.set $l9007 + local.get $l9006 + local.get $l9007 + i32.add + local.set $l9008 + local.get $l9007 + local.get $l9008 + i32.add + local.set $l9009 + local.get $l9008 + local.get $l9009 + i32.add + local.set $l9010 + local.get $l9009 + local.get $l9010 + i32.add + local.set $l9011 + local.get $l9010 + local.get $l9011 + i32.add + local.set $l9012 + local.get $l9011 + local.get $l9012 + i32.add + local.set $l9013 + local.get $l9012 + local.get $l9013 + i32.add + local.set $l9014 + local.get $l9013 + local.get $l9014 + i32.add + local.set $l9015 + local.get $l9014 + local.get $l9015 + i32.add + local.set $l9016 + local.get $l9015 + local.get $l9016 + i32.add + local.set $l9017 + local.get $l9016 + local.get $l9017 + i32.add + local.set $l9018 + local.get $l9017 + local.get $l9018 + i32.add + local.set $l9019 + local.get $l9018 + local.get $l9019 + i32.add + local.set $l9020 + local.get $l9019 + local.get $l9020 + i32.add + local.set $l9021 + local.get $l9020 + local.get $l9021 + i32.add + local.set $l9022 + local.get $l9021 + local.get $l9022 + i32.add + local.set $l9023 + local.get $l9022 + local.get $l9023 + i32.add + local.set $l9024 + local.get $l9023 + local.get $l9024 + i32.add + local.set $l9025 + local.get $l9024 + local.get $l9025 + i32.add + local.set $l9026 + local.get $l9025 + local.get $l9026 + i32.add + local.set $l9027 + local.get $l9026 + local.get $l9027 + i32.add + local.set $l9028 + local.get $l9027 + local.get $l9028 + i32.add + local.set $l9029 + local.get $l9028 + local.get $l9029 + i32.add + local.set $l9030 + local.get $l9029 + local.get $l9030 + i32.add + local.set $l9031 + local.get $l9030 + local.get $l9031 + i32.add + local.set $l9032 + local.get $l9031 + local.get $l9032 + i32.add + local.set $l9033 + local.get $l9032 + local.get $l9033 + i32.add + local.set $l9034 + local.get $l9033 + local.get $l9034 + i32.add + local.set $l9035 + local.get $l9034 + local.get $l9035 + i32.add + local.set $l9036 + local.get $l9035 + local.get $l9036 + i32.add + local.set $l9037 + local.get $l9036 + local.get $l9037 + i32.add + local.set $l9038 + local.get $l9037 + local.get $l9038 + i32.add + local.set $l9039 + local.get $l9038 + local.get $l9039 + i32.add + local.set $l9040 + local.get $l9039 + local.get $l9040 + i32.add + local.set $l9041 + local.get $l9040 + local.get $l9041 + i32.add + local.set $l9042 + local.get $l9041 + local.get $l9042 + i32.add + local.set $l9043 + local.get $l9042 + local.get $l9043 + i32.add + local.set $l9044 + local.get $l9043 + local.get $l9044 + i32.add + local.set $l9045 + local.get $l9044 + local.get $l9045 + i32.add + local.set $l9046 + local.get $l9045 + local.get $l9046 + i32.add + local.set $l9047 + local.get $l9046 + local.get $l9047 + i32.add + local.set $l9048 + local.get $l9047 + local.get $l9048 + i32.add + local.set $l9049 + local.get $l9048 + local.get $l9049 + i32.add + local.set $l9050 + local.get $l9049 + local.get $l9050 + i32.add + local.set $l9051 + local.get $l9050 + local.get $l9051 + i32.add + local.set $l9052 + local.get $l9051 + local.get $l9052 + i32.add + local.set $l9053 + local.get $l9052 + local.get $l9053 + i32.add + local.set $l9054 + local.get $l9053 + local.get $l9054 + i32.add + local.set $l9055 + local.get $l9054 + local.get $l9055 + i32.add + local.set $l9056 + local.get $l9055 + local.get $l9056 + i32.add + local.set $l9057 + local.get $l9056 + local.get $l9057 + i32.add + local.set $l9058 + local.get $l9057 + local.get $l9058 + i32.add + local.set $l9059 + local.get $l9058 + local.get $l9059 + i32.add + local.set $l9060 + local.get $l9059 + local.get $l9060 + i32.add + local.set $l9061 + local.get $l9060 + local.get $l9061 + i32.add + local.set $l9062 + local.get $l9061 + local.get $l9062 + i32.add + local.set $l9063 + local.get $l9062 + local.get $l9063 + i32.add + local.set $l9064 + local.get $l9063 + local.get $l9064 + i32.add + local.set $l9065 + local.get $l9064 + local.get $l9065 + i32.add + local.set $l9066 + local.get $l9065 + local.get $l9066 + i32.add + local.set $l9067 + local.get $l9066 + local.get $l9067 + i32.add + local.set $l9068 + local.get $l9067 + local.get $l9068 + i32.add + local.set $l9069 + local.get $l9068 + local.get $l9069 + i32.add + local.set $l9070 + local.get $l9069 + local.get $l9070 + i32.add + local.set $l9071 + local.get $l9070 + local.get $l9071 + i32.add + local.set $l9072 + local.get $l9071 + local.get $l9072 + i32.add + local.set $l9073 + local.get $l9072 + local.get $l9073 + i32.add + local.set $l9074 + local.get $l9073 + local.get $l9074 + i32.add + local.set $l9075 + local.get $l9074 + local.get $l9075 + i32.add + local.set $l9076 + local.get $l9075 + local.get $l9076 + i32.add + local.set $l9077 + local.get $l9076 + local.get $l9077 + i32.add + local.set $l9078 + local.get $l9077 + local.get $l9078 + i32.add + local.set $l9079 + local.get $l9078 + local.get $l9079 + i32.add + local.set $l9080 + local.get $l9079 + local.get $l9080 + i32.add + local.set $l9081 + local.get $l9080 + local.get $l9081 + i32.add + local.set $l9082 + local.get $l9081 + local.get $l9082 + i32.add + local.set $l9083 + local.get $l9082 + local.get $l9083 + i32.add + local.set $l9084 + local.get $l9083 + local.get $l9084 + i32.add + local.set $l9085 + local.get $l9084 + local.get $l9085 + i32.add + local.set $l9086 + local.get $l9085 + local.get $l9086 + i32.add + local.set $l9087 + local.get $l9086 + local.get $l9087 + i32.add + local.set $l9088 + local.get $l9087 + local.get $l9088 + i32.add + local.set $l9089 + local.get $l9088 + local.get $l9089 + i32.add + local.set $l9090 + local.get $l9089 + local.get $l9090 + i32.add + local.set $l9091 + local.get $l9090 + local.get $l9091 + i32.add + local.set $l9092 + local.get $l9091 + local.get $l9092 + i32.add + local.set $l9093 + local.get $l9092 + local.get $l9093 + i32.add + local.set $l9094 + local.get $l9093 + local.get $l9094 + i32.add + local.set $l9095 + local.get $l9094 + local.get $l9095 + i32.add + local.set $l9096 + local.get $l9095 + local.get $l9096 + i32.add + local.set $l9097 + local.get $l9096 + local.get $l9097 + i32.add + local.set $l9098 + local.get $l9097 + local.get $l9098 + i32.add + local.set $l9099 + local.get $l9098 + local.get $l9099 + i32.add + local.set $l9100 + local.get $l9099 + local.get $l9100 + i32.add + local.set $l9101 + local.get $l9100 + local.get $l9101 + i32.add + local.set $l9102 + local.get $l9101 + local.get $l9102 + i32.add + local.set $l9103 + local.get $l9102 + local.get $l9103 + i32.add + local.set $l9104 + local.get $l9103 + local.get $l9104 + i32.add + local.set $l9105 + local.get $l9104 + local.get $l9105 + i32.add + local.set $l9106 + local.get $l9105 + local.get $l9106 + i32.add + local.set $l9107 + local.get $l9106 + local.get $l9107 + i32.add + local.set $l9108 + local.get $l9107 + local.get $l9108 + i32.add + local.set $l9109 + local.get $l9108 + local.get $l9109 + i32.add + local.set $l9110 + local.get $l9109 + local.get $l9110 + i32.add + local.set $l9111 + local.get $l9110 + local.get $l9111 + i32.add + local.set $l9112 + local.get $l9111 + local.get $l9112 + i32.add + local.set $l9113 + local.get $l9112 + local.get $l9113 + i32.add + local.set $l9114 + local.get $l9113 + local.get $l9114 + i32.add + local.set $l9115 + local.get $l9114 + local.get $l9115 + i32.add + local.set $l9116 + local.get $l9115 + local.get $l9116 + i32.add + local.set $l9117 + local.get $l9116 + local.get $l9117 + i32.add + local.set $l9118 + local.get $l9117 + local.get $l9118 + i32.add + local.set $l9119 + local.get $l9118 + local.get $l9119 + i32.add + local.set $l9120 + local.get $l9119 + local.get $l9120 + i32.add + local.set $l9121 + local.get $l9120 + local.get $l9121 + i32.add + local.set $l9122 + local.get $l9121 + local.get $l9122 + i32.add + local.set $l9123 + local.get $l9122 + local.get $l9123 + i32.add + local.set $l9124 + local.get $l9123 + local.get $l9124 + i32.add + local.set $l9125 + local.get $l9124 + local.get $l9125 + i32.add + local.set $l9126 + local.get $l9125 + local.get $l9126 + i32.add + local.set $l9127 + local.get $l9126 + local.get $l9127 + i32.add + local.set $l9128 + local.get $l9127 + local.get $l9128 + i32.add + local.set $l9129 + local.get $l9128 + local.get $l9129 + i32.add + local.set $l9130 + local.get $l9129 + local.get $l9130 + i32.add + local.set $l9131 + local.get $l9130 + local.get $l9131 + i32.add + local.set $l9132 + local.get $l9131 + local.get $l9132 + i32.add + local.set $l9133 + local.get $l9132 + local.get $l9133 + i32.add + local.set $l9134 + local.get $l9133 + local.get $l9134 + i32.add + local.set $l9135 + local.get $l9134 + local.get $l9135 + i32.add + local.set $l9136 + local.get $l9135 + local.get $l9136 + i32.add + local.set $l9137 + local.get $l9136 + local.get $l9137 + i32.add + local.set $l9138 + local.get $l9137 + local.get $l9138 + i32.add + local.set $l9139 + local.get $l9138 + local.get $l9139 + i32.add + local.set $l9140 + local.get $l9139 + local.get $l9140 + i32.add + local.set $l9141 + local.get $l9140 + local.get $l9141 + i32.add + local.set $l9142 + local.get $l9141 + local.get $l9142 + i32.add + local.set $l9143 + local.get $l9142 + local.get $l9143 + i32.add + local.set $l9144 + local.get $l9143 + local.get $l9144 + i32.add + local.set $l9145 + local.get $l9144 + local.get $l9145 + i32.add + local.set $l9146 + local.get $l9145 + local.get $l9146 + i32.add + local.set $l9147 + local.get $l9146 + local.get $l9147 + i32.add + local.set $l9148 + local.get $l9147 + local.get $l9148 + i32.add + local.set $l9149 + local.get $l9148 + local.get $l9149 + i32.add + local.set $l9150 + local.get $l9149 + local.get $l9150 + i32.add + local.set $l9151 + local.get $l9150 + local.get $l9151 + i32.add + local.set $l9152 + local.get $l9151 + local.get $l9152 + i32.add + local.set $l9153 + local.get $l9152 + local.get $l9153 + i32.add + local.set $l9154 + local.get $l9153 + local.get $l9154 + i32.add + local.set $l9155 + local.get $l9154 + local.get $l9155 + i32.add + local.set $l9156 + local.get $l9155 + local.get $l9156 + i32.add + local.set $l9157 + local.get $l9156 + local.get $l9157 + i32.add + local.set $l9158 + local.get $l9157 + local.get $l9158 + i32.add + local.set $l9159 + local.get $l9158 + local.get $l9159 + i32.add + local.set $l9160 + local.get $l9159 + local.get $l9160 + i32.add + local.set $l9161 + local.get $l9160 + local.get $l9161 + i32.add + local.set $l9162 + local.get $l9161 + local.get $l9162 + i32.add + local.set $l9163 + local.get $l9162 + local.get $l9163 + i32.add + local.set $l9164 + local.get $l9163 + local.get $l9164 + i32.add + local.set $l9165 + local.get $l9164 + local.get $l9165 + i32.add + local.set $l9166 + local.get $l9165 + local.get $l9166 + i32.add + local.set $l9167 + local.get $l9166 + local.get $l9167 + i32.add + local.set $l9168 + local.get $l9167 + local.get $l9168 + i32.add + local.set $l9169 + local.get $l9168 + local.get $l9169 + i32.add + local.set $l9170 + local.get $l9169 + local.get $l9170 + i32.add + local.set $l9171 + local.get $l9170 + local.get $l9171 + i32.add + local.set $l9172 + local.get $l9171 + local.get $l9172 + i32.add + local.set $l9173 + local.get $l9172 + local.get $l9173 + i32.add + local.set $l9174 + local.get $l9173 + local.get $l9174 + i32.add + local.set $l9175 + local.get $l9174 + local.get $l9175 + i32.add + local.set $l9176 + local.get $l9175 + local.get $l9176 + i32.add + local.set $l9177 + local.get $l9176 + local.get $l9177 + i32.add + local.set $l9178 + local.get $l9177 + local.get $l9178 + i32.add + local.set $l9179 + local.get $l9178 + local.get $l9179 + i32.add + local.set $l9180 + local.get $l9179 + local.get $l9180 + i32.add + local.set $l9181 + local.get $l9180 + local.get $l9181 + i32.add + local.set $l9182 + local.get $l9181 + local.get $l9182 + i32.add + local.set $l9183 + local.get $l9182 + local.get $l9183 + i32.add + local.set $l9184 + local.get $l9183 + local.get $l9184 + i32.add + local.set $l9185 + local.get $l9184 + local.get $l9185 + i32.add + local.set $l9186 + local.get $l9185 + local.get $l9186 + i32.add + local.set $l9187 + local.get $l9186 + local.get $l9187 + i32.add + local.set $l9188 + local.get $l9187 + local.get $l9188 + i32.add + local.set $l9189 + local.get $l9188 + local.get $l9189 + i32.add + local.set $l9190 + local.get $l9189 + local.get $l9190 + i32.add + local.set $l9191 + local.get $l9190 + local.get $l9191 + i32.add + local.set $l9192 + local.get $l9191 + local.get $l9192 + i32.add + local.set $l9193 + local.get $l9192 + local.get $l9193 + i32.add + local.set $l9194 + local.get $l9193 + local.get $l9194 + i32.add + local.set $l9195 + local.get $l9194 + local.get $l9195 + i32.add + local.set $l9196 + local.get $l9195 + local.get $l9196 + i32.add + local.set $l9197 + local.get $l9196 + local.get $l9197 + i32.add + local.set $l9198 + local.get $l9197 + local.get $l9198 + i32.add + local.set $l9199 + local.get $l9198 + local.get $l9199 + i32.add + local.set $l9200 + local.get $l9199 + local.get $l9200 + i32.add + local.set $l9201 + local.get $l9200 + local.get $l9201 + i32.add + local.set $l9202 + local.get $l9201 + local.get $l9202 + i32.add + local.set $l9203 + local.get $l9202 + local.get $l9203 + i32.add + local.set $l9204 + local.get $l9203 + local.get $l9204 + i32.add + local.set $l9205 + local.get $l9204 + local.get $l9205 + i32.add + local.set $l9206 + local.get $l9205 + local.get $l9206 + i32.add + local.set $l9207 + local.get $l9206 + local.get $l9207 + i32.add + local.set $l9208 + local.get $l9207 + local.get $l9208 + i32.add + local.set $l9209 + local.get $l9208 + local.get $l9209 + i32.add + local.set $l9210 + local.get $l9209 + local.get $l9210 + i32.add + local.set $l9211 + local.get $l9210 + local.get $l9211 + i32.add + local.set $l9212 + local.get $l9211 + local.get $l9212 + i32.add + local.set $l9213 + local.get $l9212 + local.get $l9213 + i32.add + local.set $l9214 + local.get $l9213 + local.get $l9214 + i32.add + local.set $l9215 + local.get $l9214 + local.get $l9215 + i32.add + local.set $l9216 + local.get $l9215 + local.get $l9216 + i32.add + local.set $l9217 + local.get $l9216 + local.get $l9217 + i32.add + local.set $l9218 + local.get $l9217 + local.get $l9218 + i32.add + local.set $l9219 + local.get $l9218 + local.get $l9219 + i32.add + local.set $l9220 + local.get $l9219 + local.get $l9220 + i32.add + local.set $l9221 + local.get $l9220 + local.get $l9221 + i32.add + local.set $l9222 + local.get $l9221 + local.get $l9222 + i32.add + local.set $l9223 + local.get $l9222 + local.get $l9223 + i32.add + local.set $l9224 + local.get $l9223 + local.get $l9224 + i32.add + local.set $l9225 + local.get $l9224 + local.get $l9225 + i32.add + local.set $l9226 + local.get $l9225 + local.get $l9226 + i32.add + local.set $l9227 + local.get $l9226 + local.get $l9227 + i32.add + local.set $l9228 + local.get $l9227 + local.get $l9228 + i32.add + local.set $l9229 + local.get $l9228 + local.get $l9229 + i32.add + local.set $l9230 + local.get $l9229 + local.get $l9230 + i32.add + local.set $l9231 + local.get $l9230 + local.get $l9231 + i32.add + local.set $l9232 + local.get $l9231 + local.get $l9232 + i32.add + local.set $l9233 + local.get $l9232 + local.get $l9233 + i32.add + local.set $l9234 + local.get $l9233 + local.get $l9234 + i32.add + local.set $l9235 + local.get $l9234 + local.get $l9235 + i32.add + local.set $l9236 + local.get $l9235 + local.get $l9236 + i32.add + local.set $l9237 + local.get $l9236 + local.get $l9237 + i32.add + local.set $l9238 + local.get $l9237 + local.get $l9238 + i32.add + local.set $l9239 + local.get $l9238 + local.get $l9239 + i32.add + local.set $l9240 + local.get $l9239 + local.get $l9240 + i32.add + local.set $l9241 + local.get $l9240 + local.get $l9241 + i32.add + local.set $l9242 + local.get $l9241 + local.get $l9242 + i32.add + local.set $l9243 + local.get $l9242 + local.get $l9243 + i32.add + local.set $l9244 + local.get $l9243 + local.get $l9244 + i32.add + local.set $l9245 + local.get $l9244 + local.get $l9245 + i32.add + local.set $l9246 + local.get $l9245 + local.get $l9246 + i32.add + local.set $l9247 + local.get $l9246 + local.get $l9247 + i32.add + local.set $l9248 + local.get $l9247 + local.get $l9248 + i32.add + local.set $l9249 + local.get $l9248 + local.get $l9249 + i32.add + local.set $l9250 + local.get $l9249 + local.get $l9250 + i32.add + local.set $l9251 + local.get $l9250 + local.get $l9251 + i32.add + local.set $l9252 + local.get $l9251 + local.get $l9252 + i32.add + local.set $l9253 + local.get $l9252 + local.get $l9253 + i32.add + local.set $l9254 + local.get $l9253 + local.get $l9254 + i32.add + local.set $l9255 + local.get $l9254 + local.get $l9255 + i32.add + local.set $l9256 + local.get $l9255 + local.get $l9256 + i32.add + local.set $l9257 + local.get $l9256 + local.get $l9257 + i32.add + local.set $l9258 + local.get $l9257 + local.get $l9258 + i32.add + local.set $l9259 + local.get $l9258 + local.get $l9259 + i32.add + local.set $l9260 + local.get $l9259 + local.get $l9260 + i32.add + local.set $l9261 + local.get $l9260 + local.get $l9261 + i32.add + local.set $l9262 + local.get $l9261 + local.get $l9262 + i32.add + local.set $l9263 + local.get $l9262 + local.get $l9263 + i32.add + local.set $l9264 + local.get $l9263 + local.get $l9264 + i32.add + local.set $l9265 + local.get $l9264 + local.get $l9265 + i32.add + local.set $l9266 + local.get $l9265 + local.get $l9266 + i32.add + local.set $l9267 + local.get $l9266 + local.get $l9267 + i32.add + local.set $l9268 + local.get $l9267 + local.get $l9268 + i32.add + local.set $l9269 + local.get $l9268 + local.get $l9269 + i32.add + local.set $l9270 + local.get $l9269 + local.get $l9270 + i32.add + local.set $l9271 + local.get $l9270 + local.get $l9271 + i32.add + local.set $l9272 + local.get $l9271 + local.get $l9272 + i32.add + local.set $l9273 + local.get $l9272 + local.get $l9273 + i32.add + local.set $l9274 + local.get $l9273 + local.get $l9274 + i32.add + local.set $l9275 + local.get $l9274 + local.get $l9275 + i32.add + local.set $l9276 + local.get $l9275 + local.get $l9276 + i32.add + local.set $l9277 + local.get $l9276 + local.get $l9277 + i32.add + local.set $l9278 + local.get $l9277 + local.get $l9278 + i32.add + local.set $l9279 + local.get $l9278 + local.get $l9279 + i32.add + local.set $l9280 + local.get $l9279 + local.get $l9280 + i32.add + local.set $l9281 + local.get $l9280 + local.get $l9281 + i32.add + local.set $l9282 + local.get $l9281 + local.get $l9282 + i32.add + local.set $l9283 + local.get $l9282 + local.get $l9283 + i32.add + local.set $l9284 + local.get $l9283 + local.get $l9284 + i32.add + local.set $l9285 + local.get $l9284 + local.get $l9285 + i32.add + local.set $l9286 + local.get $l9285 + local.get $l9286 + i32.add + local.set $l9287 + local.get $l9286 + local.get $l9287 + i32.add + local.set $l9288 + local.get $l9287 + local.get $l9288 + i32.add + local.set $l9289 + local.get $l9288 + local.get $l9289 + i32.add + local.set $l9290 + local.get $l9289 + local.get $l9290 + i32.add + local.set $l9291 + local.get $l9290 + local.get $l9291 + i32.add + local.set $l9292 + local.get $l9291 + local.get $l9292 + i32.add + local.set $l9293 + local.get $l9292 + local.get $l9293 + i32.add + local.set $l9294 + local.get $l9293 + local.get $l9294 + i32.add + local.set $l9295 + local.get $l9294 + local.get $l9295 + i32.add + local.set $l9296 + local.get $l9295 + local.get $l9296 + i32.add + local.set $l9297 + local.get $l9296 + local.get $l9297 + i32.add + local.set $l9298 + local.get $l9297 + local.get $l9298 + i32.add + local.set $l9299 + local.get $l9298 + local.get $l9299 + i32.add + local.set $l9300 + local.get $l9299 + local.get $l9300 + i32.add + local.set $l9301 + local.get $l9300 + local.get $l9301 + i32.add + local.set $l9302 + local.get $l9301 + local.get $l9302 + i32.add + local.set $l9303 + local.get $l9302 + local.get $l9303 + i32.add + local.set $l9304 + local.get $l9303 + local.get $l9304 + i32.add + local.set $l9305 + local.get $l9304 + local.get $l9305 + i32.add + local.set $l9306 + local.get $l9305 + local.get $l9306 + i32.add + local.set $l9307 + local.get $l9306 + local.get $l9307 + i32.add + local.set $l9308 + local.get $l9307 + local.get $l9308 + i32.add + local.set $l9309 + local.get $l9308 + local.get $l9309 + i32.add + local.set $l9310 + local.get $l9309 + local.get $l9310 + i32.add + local.set $l9311 + local.get $l9310 + local.get $l9311 + i32.add + local.set $l9312 + local.get $l9311 + local.get $l9312 + i32.add + local.set $l9313 + local.get $l9312 + local.get $l9313 + i32.add + local.set $l9314 + local.get $l9313 + local.get $l9314 + i32.add + local.set $l9315 + local.get $l9314 + local.get $l9315 + i32.add + local.set $l9316 + local.get $l9315 + local.get $l9316 + i32.add + local.set $l9317 + local.get $l9316 + local.get $l9317 + i32.add + local.set $l9318 + local.get $l9317 + local.get $l9318 + i32.add + local.set $l9319 + local.get $l9318 + local.get $l9319 + i32.add + local.set $l9320 + local.get $l9319 + local.get $l9320 + i32.add + local.set $l9321 + local.get $l9320 + local.get $l9321 + i32.add + local.set $l9322 + local.get $l9321 + local.get $l9322 + i32.add + local.set $l9323 + local.get $l9322 + local.get $l9323 + i32.add + local.set $l9324 + local.get $l9323 + local.get $l9324 + i32.add + local.set $l9325 + local.get $l9324 + local.get $l9325 + i32.add + local.set $l9326 + local.get $l9325 + local.get $l9326 + i32.add + local.set $l9327 + local.get $l9326 + local.get $l9327 + i32.add + local.set $l9328 + local.get $l9327 + local.get $l9328 + i32.add + local.set $l9329 + local.get $l9328 + local.get $l9329 + i32.add + local.set $l9330 + local.get $l9329 + local.get $l9330 + i32.add + local.set $l9331 + local.get $l9330 + local.get $l9331 + i32.add + local.set $l9332 + local.get $l9331 + local.get $l9332 + i32.add + local.set $l9333 + local.get $l9332 + local.get $l9333 + i32.add + local.set $l9334 + local.get $l9333 + local.get $l9334 + i32.add + local.set $l9335 + local.get $l9334 + local.get $l9335 + i32.add + local.set $l9336 + local.get $l9335 + local.get $l9336 + i32.add + local.set $l9337 + local.get $l9336 + local.get $l9337 + i32.add + local.set $l9338 + local.get $l9337 + local.get $l9338 + i32.add + local.set $l9339 + local.get $l9338 + local.get $l9339 + i32.add + local.set $l9340 + local.get $l9339 + local.get $l9340 + i32.add + local.set $l9341 + local.get $l9340 + local.get $l9341 + i32.add + local.set $l9342 + local.get $l9341 + local.get $l9342 + i32.add + local.set $l9343 + local.get $l9342 + local.get $l9343 + i32.add + local.set $l9344 + local.get $l9343 + local.get $l9344 + i32.add + local.set $l9345 + local.get $l9344 + local.get $l9345 + i32.add + local.set $l9346 + local.get $l9345 + local.get $l9346 + i32.add + local.set $l9347 + local.get $l9346 + local.get $l9347 + i32.add + local.set $l9348 + local.get $l9347 + local.get $l9348 + i32.add + local.set $l9349 + local.get $l9348 + local.get $l9349 + i32.add + local.set $l9350 + local.get $l9349 + local.get $l9350 + i32.add + local.set $l9351 + local.get $l9350 + local.get $l9351 + i32.add + local.set $l9352 + local.get $l9351 + local.get $l9352 + i32.add + local.set $l9353 + local.get $l9352 + local.get $l9353 + i32.add + local.set $l9354 + local.get $l9353 + local.get $l9354 + i32.add + local.set $l9355 + local.get $l9354 + local.get $l9355 + i32.add + local.set $l9356 + local.get $l9355 + local.get $l9356 + i32.add + local.set $l9357 + local.get $l9356 + local.get $l9357 + i32.add + local.set $l9358 + local.get $l9357 + local.get $l9358 + i32.add + local.set $l9359 + local.get $l9358 + local.get $l9359 + i32.add + local.set $l9360 + local.get $l9359 + local.get $l9360 + i32.add + local.set $l9361 + local.get $l9360 + local.get $l9361 + i32.add + local.set $l9362 + local.get $l9361 + local.get $l9362 + i32.add + local.set $l9363 + local.get $l9362 + local.get $l9363 + i32.add + local.set $l9364 + local.get $l9363 + local.get $l9364 + i32.add + local.set $l9365 + local.get $l9364 + local.get $l9365 + i32.add + local.set $l9366 + local.get $l9365 + local.get $l9366 + i32.add + local.set $l9367 + local.get $l9366 + local.get $l9367 + i32.add + local.set $l9368 + local.get $l9367 + local.get $l9368 + i32.add + local.set $l9369 + local.get $l9368 + local.get $l9369 + i32.add + local.set $l9370 + local.get $l9369 + local.get $l9370 + i32.add + local.set $l9371 + local.get $l9370 + local.get $l9371 + i32.add + local.set $l9372 + local.get $l9371 + local.get $l9372 + i32.add + local.set $l9373 + local.get $l9372 + local.get $l9373 + i32.add + local.set $l9374 + local.get $l9373 + local.get $l9374 + i32.add + local.set $l9375 + local.get $l9374 + local.get $l9375 + i32.add + local.set $l9376 + local.get $l9375 + local.get $l9376 + i32.add + local.set $l9377 + local.get $l9376 + local.get $l9377 + i32.add + local.set $l9378 + local.get $l9377 + local.get $l9378 + i32.add + local.set $l9379 + local.get $l9378 + local.get $l9379 + i32.add + local.set $l9380 + local.get $l9379 + local.get $l9380 + i32.add + local.set $l9381 + local.get $l9380 + local.get $l9381 + i32.add + local.set $l9382 + local.get $l9381 + local.get $l9382 + i32.add + local.set $l9383 + local.get $l9382 + local.get $l9383 + i32.add + local.set $l9384 + local.get $l9383 + local.get $l9384 + i32.add + local.set $l9385 + local.get $l9384 + local.get $l9385 + i32.add + local.set $l9386 + local.get $l9385 + local.get $l9386 + i32.add + local.set $l9387 + local.get $l9386 + local.get $l9387 + i32.add + local.set $l9388 + local.get $l9387 + local.get $l9388 + i32.add + local.set $l9389 + local.get $l9388 + local.get $l9389 + i32.add + local.set $l9390 + local.get $l9389 + local.get $l9390 + i32.add + local.set $l9391 + local.get $l9390 + local.get $l9391 + i32.add + local.set $l9392 + local.get $l9391 + local.get $l9392 + i32.add + local.set $l9393 + local.get $l9392 + local.get $l9393 + i32.add + local.set $l9394 + local.get $l9393 + local.get $l9394 + i32.add + local.set $l9395 + local.get $l9394 + local.get $l9395 + i32.add + local.set $l9396 + local.get $l9395 + local.get $l9396 + i32.add + local.set $l9397 + local.get $l9396 + local.get $l9397 + i32.add + local.set $l9398 + local.get $l9397 + local.get $l9398 + i32.add + local.set $l9399 + local.get $l9398 + local.get $l9399 + i32.add + local.set $l9400 + local.get $l9399 + local.get $l9400 + i32.add + local.set $l9401 + local.get $l9400 + local.get $l9401 + i32.add + local.set $l9402 + local.get $l9401 + local.get $l9402 + i32.add + local.set $l9403 + local.get $l9402 + local.get $l9403 + i32.add + local.set $l9404 + local.get $l9403 + local.get $l9404 + i32.add + local.set $l9405 + local.get $l9404 + local.get $l9405 + i32.add + local.set $l9406 + local.get $l9405 + local.get $l9406 + i32.add + local.set $l9407 + local.get $l9406 + local.get $l9407 + i32.add + local.set $l9408 + local.get $l9407 + local.get $l9408 + i32.add + local.set $l9409 + local.get $l9408 + local.get $l9409 + i32.add + local.set $l9410 + local.get $l9409 + local.get $l9410 + i32.add + local.set $l9411 + local.get $l9410 + local.get $l9411 + i32.add + local.set $l9412 + local.get $l9411 + local.get $l9412 + i32.add + local.set $l9413 + local.get $l9412 + local.get $l9413 + i32.add + local.set $l9414 + local.get $l9413 + local.get $l9414 + i32.add + local.set $l9415 + local.get $l9414 + local.get $l9415 + i32.add + local.set $l9416 + local.get $l9415 + local.get $l9416 + i32.add + local.set $l9417 + local.get $l9416 + local.get $l9417 + i32.add + local.set $l9418 + local.get $l9417 + local.get $l9418 + i32.add + local.set $l9419 + local.get $l9418 + local.get $l9419 + i32.add + local.set $l9420 + local.get $l9419 + local.get $l9420 + i32.add + local.set $l9421 + local.get $l9420 + local.get $l9421 + i32.add + local.set $l9422 + local.get $l9421 + local.get $l9422 + i32.add + local.set $l9423 + local.get $l9422 + local.get $l9423 + i32.add + local.set $l9424 + local.get $l9423 + local.get $l9424 + i32.add + local.set $l9425 + local.get $l9424 + local.get $l9425 + i32.add + local.set $l9426 + local.get $l9425 + local.get $l9426 + i32.add + local.set $l9427 + local.get $l9426 + local.get $l9427 + i32.add + local.set $l9428 + local.get $l9427 + local.get $l9428 + i32.add + local.set $l9429 + local.get $l9428 + local.get $l9429 + i32.add + local.set $l9430 + local.get $l9429 + local.get $l9430 + i32.add + local.set $l9431 + local.get $l9430 + local.get $l9431 + i32.add + local.set $l9432 + local.get $l9431 + local.get $l9432 + i32.add + local.set $l9433 + local.get $l9432 + local.get $l9433 + i32.add + local.set $l9434 + local.get $l9433 + local.get $l9434 + i32.add + local.set $l9435 + local.get $l9434 + local.get $l9435 + i32.add + local.set $l9436 + local.get $l9435 + local.get $l9436 + i32.add + local.set $l9437 + local.get $l9436 + local.get $l9437 + i32.add + local.set $l9438 + local.get $l9437 + local.get $l9438 + i32.add + local.set $l9439 + local.get $l9438 + local.get $l9439 + i32.add + local.set $l9440 + local.get $l9439 + local.get $l9440 + i32.add + local.set $l9441 + local.get $l9440 + local.get $l9441 + i32.add + local.set $l9442 + local.get $l9441 + local.get $l9442 + i32.add + local.set $l9443 + local.get $l9442 + local.get $l9443 + i32.add + local.set $l9444 + local.get $l9443 + local.get $l9444 + i32.add + local.set $l9445 + local.get $l9444 + local.get $l9445 + i32.add + local.set $l9446 + local.get $l9445 + local.get $l9446 + i32.add + local.set $l9447 + local.get $l9446 + local.get $l9447 + i32.add + local.set $l9448 + local.get $l9447 + local.get $l9448 + i32.add + local.set $l9449 + local.get $l9448 + local.get $l9449 + i32.add + local.set $l9450 + local.get $l9449 + local.get $l9450 + i32.add + local.set $l9451 + local.get $l9450 + local.get $l9451 + i32.add + local.set $l9452 + local.get $l9451 + local.get $l9452 + i32.add + local.set $l9453 + local.get $l9452 + local.get $l9453 + i32.add + local.set $l9454 + local.get $l9453 + local.get $l9454 + i32.add + local.set $l9455 + local.get $l9454 + local.get $l9455 + i32.add + local.set $l9456 + local.get $l9455 + local.get $l9456 + i32.add + local.set $l9457 + local.get $l9456 + local.get $l9457 + i32.add + local.set $l9458 + local.get $l9457 + local.get $l9458 + i32.add + local.set $l9459 + local.get $l9458 + local.get $l9459 + i32.add + local.set $l9460 + local.get $l9459 + local.get $l9460 + i32.add + local.set $l9461 + local.get $l9460 + local.get $l9461 + i32.add + local.set $l9462 + local.get $l9461 + local.get $l9462 + i32.add + local.set $l9463 + local.get $l9462 + local.get $l9463 + i32.add + local.set $l9464 + local.get $l9463 + local.get $l9464 + i32.add + local.set $l9465 + local.get $l9464 + local.get $l9465 + i32.add + local.set $l9466 + local.get $l9465 + local.get $l9466 + i32.add + local.set $l9467 + local.get $l9466 + local.get $l9467 + i32.add + local.set $l9468 + local.get $l9467 + local.get $l9468 + i32.add + local.set $l9469 + local.get $l9468 + local.get $l9469 + i32.add + local.set $l9470 + local.get $l9469 + local.get $l9470 + i32.add + local.set $l9471 + local.get $l9470 + local.get $l9471 + i32.add + local.set $l9472 + local.get $l9471 + local.get $l9472 + i32.add + local.set $l9473 + local.get $l9472 + local.get $l9473 + i32.add + local.set $l9474 + local.get $l9473 + local.get $l9474 + i32.add + local.set $l9475 + local.get $l9474 + local.get $l9475 + i32.add + local.set $l9476 + local.get $l9475 + local.get $l9476 + i32.add + local.set $l9477 + local.get $l9476 + local.get $l9477 + i32.add + local.set $l9478 + local.get $l9477 + local.get $l9478 + i32.add + local.set $l9479 + local.get $l9478 + local.get $l9479 + i32.add + local.set $l9480 + local.get $l9479 + local.get $l9480 + i32.add + local.set $l9481 + local.get $l9480 + local.get $l9481 + i32.add + local.set $l9482 + local.get $l9481 + local.get $l9482 + i32.add + local.set $l9483 + local.get $l9482 + local.get $l9483 + i32.add + local.set $l9484 + local.get $l9483 + local.get $l9484 + i32.add + local.set $l9485 + local.get $l9484 + local.get $l9485 + i32.add + local.set $l9486 + local.get $l9485 + local.get $l9486 + i32.add + local.set $l9487 + local.get $l9486 + local.get $l9487 + i32.add + local.set $l9488 + local.get $l9487 + local.get $l9488 + i32.add + local.set $l9489 + local.get $l9488 + local.get $l9489 + i32.add + local.set $l9490 + local.get $l9489 + local.get $l9490 + i32.add + local.set $l9491 + local.get $l9490 + local.get $l9491 + i32.add + local.set $l9492 + local.get $l9491 + local.get $l9492 + i32.add + local.set $l9493 + local.get $l9492 + local.get $l9493 + i32.add + local.set $l9494 + local.get $l9493 + local.get $l9494 + i32.add + local.set $l9495 + local.get $l9494 + local.get $l9495 + i32.add + local.set $l9496 + local.get $l9495 + local.get $l9496 + i32.add + local.set $l9497 + local.get $l9496 + local.get $l9497 + i32.add + local.set $l9498 + local.get $l9497 + local.get $l9498 + i32.add + local.set $l9499 + local.get $l9498 + local.get $l9499 + i32.add + local.set $l9500 + local.get $l9499 + local.get $l9500 + i32.add + local.set $l9501 + local.get $l9500 + local.get $l9501 + i32.add + local.set $l9502 + local.get $l9501 + local.get $l9502 + i32.add + local.set $l9503 + local.get $l9502 + local.get $l9503 + i32.add + local.set $l9504 + local.get $l9503 + local.get $l9504 + i32.add + local.set $l9505 + local.get $l9504 + local.get $l9505 + i32.add + local.set $l9506 + local.get $l9505 + local.get $l9506 + i32.add + local.set $l9507 + local.get $l9506 + local.get $l9507 + i32.add + local.set $l9508 + local.get $l9507 + local.get $l9508 + i32.add + local.set $l9509 + local.get $l9508 + local.get $l9509 + i32.add + local.set $l9510 + local.get $l9509 + local.get $l9510 + i32.add + local.set $l9511 + local.get $l9510 + local.get $l9511 + i32.add + local.set $l9512 + local.get $l9511 + local.get $l9512 + i32.add + local.set $l9513 + local.get $l9512 + local.get $l9513 + i32.add + local.set $l9514 + local.get $l9513 + local.get $l9514 + i32.add + local.set $l9515 + local.get $l9514 + local.get $l9515 + i32.add + local.set $l9516 + local.get $l9515 + local.get $l9516 + i32.add + local.set $l9517 + local.get $l9516 + local.get $l9517 + i32.add + local.set $l9518 + local.get $l9517 + local.get $l9518 + i32.add + local.set $l9519 + local.get $l9518 + local.get $l9519 + i32.add + local.set $l9520 + local.get $l9519 + local.get $l9520 + i32.add + local.set $l9521 + local.get $l9520 + local.get $l9521 + i32.add + local.set $l9522 + local.get $l9521 + local.get $l9522 + i32.add + local.set $l9523 + local.get $l9522 + local.get $l9523 + i32.add + local.set $l9524 + local.get $l9523 + local.get $l9524 + i32.add + local.set $l9525 + local.get $l9524 + local.get $l9525 + i32.add + local.set $l9526 + local.get $l9525 + local.get $l9526 + i32.add + local.set $l9527 + local.get $l9526 + local.get $l9527 + i32.add + local.set $l9528 + local.get $l9527 + local.get $l9528 + i32.add + local.set $l9529 + local.get $l9528 + local.get $l9529 + i32.add + local.set $l9530 + local.get $l9529 + local.get $l9530 + i32.add + local.set $l9531 + local.get $l9530 + local.get $l9531 + i32.add + local.set $l9532 + local.get $l9531 + local.get $l9532 + i32.add + local.set $l9533 + local.get $l9532 + local.get $l9533 + i32.add + local.set $l9534 + local.get $l9533 + local.get $l9534 + i32.add + local.set $l9535 + local.get $l9534 + local.get $l9535 + i32.add + local.set $l9536 + local.get $l9535 + local.get $l9536 + i32.add + local.set $l9537 + local.get $l9536 + local.get $l9537 + i32.add + local.set $l9538 + local.get $l9537 + local.get $l9538 + i32.add + local.set $l9539 + local.get $l9538 + local.get $l9539 + i32.add + local.set $l9540 + local.get $l9539 + local.get $l9540 + i32.add + local.set $l9541 + local.get $l9540 + local.get $l9541 + i32.add + local.set $l9542 + local.get $l9541 + local.get $l9542 + i32.add + local.set $l9543 + local.get $l9542 + local.get $l9543 + i32.add + local.set $l9544 + local.get $l9543 + local.get $l9544 + i32.add + local.set $l9545 + local.get $l9544 + local.get $l9545 + i32.add + local.set $l9546 + local.get $l9545 + local.get $l9546 + i32.add + local.set $l9547 + local.get $l9546 + local.get $l9547 + i32.add + local.set $l9548 + local.get $l9547 + local.get $l9548 + i32.add + local.set $l9549 + local.get $l9548 + local.get $l9549 + i32.add + local.set $l9550 + local.get $l9549 + local.get $l9550 + i32.add + local.set $l9551 + local.get $l9550 + local.get $l9551 + i32.add + local.set $l9552 + local.get $l9551 + local.get $l9552 + i32.add + local.set $l9553 + local.get $l9552 + local.get $l9553 + i32.add + local.set $l9554 + local.get $l9553 + local.get $l9554 + i32.add + local.set $l9555 + local.get $l9554 + local.get $l9555 + i32.add + local.set $l9556 + local.get $l9555 + local.get $l9556 + i32.add + local.set $l9557 + local.get $l9556 + local.get $l9557 + i32.add + local.set $l9558 + local.get $l9557 + local.get $l9558 + i32.add + local.set $l9559 + local.get $l9558 + local.get $l9559 + i32.add + local.set $l9560 + local.get $l9559 + local.get $l9560 + i32.add + local.set $l9561 + local.get $l9560 + local.get $l9561 + i32.add + local.set $l9562 + local.get $l9561 + local.get $l9562 + i32.add + local.set $l9563 + local.get $l9562 + local.get $l9563 + i32.add + local.set $l9564 + local.get $l9563 + local.get $l9564 + i32.add + local.set $l9565 + local.get $l9564 + local.get $l9565 + i32.add + local.set $l9566 + local.get $l9565 + local.get $l9566 + i32.add + local.set $l9567 + local.get $l9566 + local.get $l9567 + i32.add + local.set $l9568 + local.get $l9567 + local.get $l9568 + i32.add + local.set $l9569 + local.get $l9568 + local.get $l9569 + i32.add + local.set $l9570 + local.get $l9569 + local.get $l9570 + i32.add + local.set $l9571 + local.get $l9570 + local.get $l9571 + i32.add + local.set $l9572 + local.get $l9571 + local.get $l9572 + i32.add + local.set $l9573 + local.get $l9572 + local.get $l9573 + i32.add + local.set $l9574 + local.get $l9573 + local.get $l9574 + i32.add + local.set $l9575 + local.get $l9574 + local.get $l9575 + i32.add + local.set $l9576 + local.get $l9575 + local.get $l9576 + i32.add + local.set $l9577 + local.get $l9576 + local.get $l9577 + i32.add + local.set $l9578 + local.get $l9577 + local.get $l9578 + i32.add + local.set $l9579 + local.get $l9578 + local.get $l9579 + i32.add + local.set $l9580 + local.get $l9579 + local.get $l9580 + i32.add + local.set $l9581 + local.get $l9580 + local.get $l9581 + i32.add + local.set $l9582 + local.get $l9581 + local.get $l9582 + i32.add + local.set $l9583 + local.get $l9582 + local.get $l9583 + i32.add + local.set $l9584 + local.get $l9583 + local.get $l9584 + i32.add + local.set $l9585 + local.get $l9584 + local.get $l9585 + i32.add + local.set $l9586 + local.get $l9585 + local.get $l9586 + i32.add + local.set $l9587 + local.get $l9586 + local.get $l9587 + i32.add + local.set $l9588 + local.get $l9587 + local.get $l9588 + i32.add + local.set $l9589 + local.get $l9588 + local.get $l9589 + i32.add + local.set $l9590 + local.get $l9589 + local.get $l9590 + i32.add + local.set $l9591 + local.get $l9590 + local.get $l9591 + i32.add + local.set $l9592 + local.get $l9591 + local.get $l9592 + i32.add + local.set $l9593 + local.get $l9592 + local.get $l9593 + i32.add + local.set $l9594 + local.get $l9593 + local.get $l9594 + i32.add + local.set $l9595 + local.get $l9594 + local.get $l9595 + i32.add + local.set $l9596 + local.get $l9595 + local.get $l9596 + i32.add + local.set $l9597 + local.get $l9596 + local.get $l9597 + i32.add + local.set $l9598 + local.get $l9597 + local.get $l9598 + i32.add + local.set $l9599 + local.get $l9598 + local.get $l9599 + i32.add + local.set $l9600 + local.get $l9599 + local.get $l9600 + i32.add + local.set $l9601 + local.get $l9600 + local.get $l9601 + i32.add + local.set $l9602 + local.get $l9601 + local.get $l9602 + i32.add + local.set $l9603 + local.get $l9602 + local.get $l9603 + i32.add + local.set $l9604 + local.get $l9603 + local.get $l9604 + i32.add + local.set $l9605 + local.get $l9604 + local.get $l9605 + i32.add + local.set $l9606 + local.get $l9605 + local.get $l9606 + i32.add + local.set $l9607 + local.get $l9606 + local.get $l9607 + i32.add + local.set $l9608 + local.get $l9607 + local.get $l9608 + i32.add + local.set $l9609 + local.get $l9608 + local.get $l9609 + i32.add + local.set $l9610 + local.get $l9609 + local.get $l9610 + i32.add + local.set $l9611 + local.get $l9610 + local.get $l9611 + i32.add + local.set $l9612 + local.get $l9611 + local.get $l9612 + i32.add + local.set $l9613 + local.get $l9612 + local.get $l9613 + i32.add + local.set $l9614 + local.get $l9613 + local.get $l9614 + i32.add + local.set $l9615 + local.get $l9614 + local.get $l9615 + i32.add + local.set $l9616 + local.get $l9615 + local.get $l9616 + i32.add + local.set $l9617 + local.get $l9616 + local.get $l9617 + i32.add + local.set $l9618 + local.get $l9617 + local.get $l9618 + i32.add + local.set $l9619 + local.get $l9618 + local.get $l9619 + i32.add + local.set $l9620 + local.get $l9619 + local.get $l9620 + i32.add + local.set $l9621 + local.get $l9620 + local.get $l9621 + i32.add + local.set $l9622 + local.get $l9621 + local.get $l9622 + i32.add + local.set $l9623 + local.get $l9622 + local.get $l9623 + i32.add + local.set $l9624 + local.get $l9623 + local.get $l9624 + i32.add + local.set $l9625 + local.get $l9624 + local.get $l9625 + i32.add + local.set $l9626 + local.get $l9625 + local.get $l9626 + i32.add + local.set $l9627 + local.get $l9626 + local.get $l9627 + i32.add + local.set $l9628 + local.get $l9627 + local.get $l9628 + i32.add + local.set $l9629 + local.get $l9628 + local.get $l9629 + i32.add + local.set $l9630 + local.get $l9629 + local.get $l9630 + i32.add + local.set $l9631 + local.get $l9630 + local.get $l9631 + i32.add + local.set $l9632 + local.get $l9631 + local.get $l9632 + i32.add + local.set $l9633 + local.get $l9632 + local.get $l9633 + i32.add + local.set $l9634 + local.get $l9633 + local.get $l9634 + i32.add + local.set $l9635 + local.get $l9634 + local.get $l9635 + i32.add + local.set $l9636 + local.get $l9635 + local.get $l9636 + i32.add + local.set $l9637 + local.get $l9636 + local.get $l9637 + i32.add + local.set $l9638 + local.get $l9637 + local.get $l9638 + i32.add + local.set $l9639 + local.get $l9638 + local.get $l9639 + i32.add + local.set $l9640 + local.get $l9639 + local.get $l9640 + i32.add + local.set $l9641 + local.get $l9640 + local.get $l9641 + i32.add + local.set $l9642 + local.get $l9641 + local.get $l9642 + i32.add + local.set $l9643 + local.get $l9642 + local.get $l9643 + i32.add + local.set $l9644 + local.get $l9643 + local.get $l9644 + i32.add + local.set $l9645 + local.get $l9644 + local.get $l9645 + i32.add + local.set $l9646 + local.get $l9645 + local.get $l9646 + i32.add + local.set $l9647 + local.get $l9646 + local.get $l9647 + i32.add + local.set $l9648 + local.get $l9647 + local.get $l9648 + i32.add + local.set $l9649 + local.get $l9648 + local.get $l9649 + i32.add + local.set $l9650 + local.get $l9649 + local.get $l9650 + i32.add + local.set $l9651 + local.get $l9650 + local.get $l9651 + i32.add + local.set $l9652 + local.get $l9651 + local.get $l9652 + i32.add + local.set $l9653 + local.get $l9652 + local.get $l9653 + i32.add + local.set $l9654 + local.get $l9653 + local.get $l9654 + i32.add + local.set $l9655 + local.get $l9654 + local.get $l9655 + i32.add + local.set $l9656 + local.get $l9655 + local.get $l9656 + i32.add + local.set $l9657 + local.get $l9656 + local.get $l9657 + i32.add + local.set $l9658 + local.get $l9657 + local.get $l9658 + i32.add + local.set $l9659 + local.get $l9658 + local.get $l9659 + i32.add + local.set $l9660 + local.get $l9659 + local.get $l9660 + i32.add + local.set $l9661 + local.get $l9660 + local.get $l9661 + i32.add + local.set $l9662 + local.get $l9661 + local.get $l9662 + i32.add + local.set $l9663 + local.get $l9662 + local.get $l9663 + i32.add + local.set $l9664 + local.get $l9663 + local.get $l9664 + i32.add + local.set $l9665 + local.get $l9664 + local.get $l9665 + i32.add + local.set $l9666 + local.get $l9665 + local.get $l9666 + i32.add + local.set $l9667 + local.get $l9666 + local.get $l9667 + i32.add + local.set $l9668 + local.get $l9667 + local.get $l9668 + i32.add + local.set $l9669 + local.get $l9668 + local.get $l9669 + i32.add + local.set $l9670 + local.get $l9669 + local.get $l9670 + i32.add + local.set $l9671 + local.get $l9670 + local.get $l9671 + i32.add + local.set $l9672 + local.get $l9671 + local.get $l9672 + i32.add + local.set $l9673 + local.get $l9672 + local.get $l9673 + i32.add + local.set $l9674 + local.get $l9673 + local.get $l9674 + i32.add + local.set $l9675 + local.get $l9674 + local.get $l9675 + i32.add + local.set $l9676 + local.get $l9675 + local.get $l9676 + i32.add + local.set $l9677 + local.get $l9676 + local.get $l9677 + i32.add + local.set $l9678 + local.get $l9677 + local.get $l9678 + i32.add + local.set $l9679 + local.get $l9678 + local.get $l9679 + i32.add + local.set $l9680 + local.get $l9679 + local.get $l9680 + i32.add + local.set $l9681 + local.get $l9680 + local.get $l9681 + i32.add + local.set $l9682 + local.get $l9681 + local.get $l9682 + i32.add + local.set $l9683 + local.get $l9682 + local.get $l9683 + i32.add + local.set $l9684 + local.get $l9683 + local.get $l9684 + i32.add + local.set $l9685 + local.get $l9684 + local.get $l9685 + i32.add + local.set $l9686 + local.get $l9685 + local.get $l9686 + i32.add + local.set $l9687 + local.get $l9686 + local.get $l9687 + i32.add + local.set $l9688 + local.get $l9687 + local.get $l9688 + i32.add + local.set $l9689 + local.get $l9688 + local.get $l9689 + i32.add + local.set $l9690 + local.get $l9689 + local.get $l9690 + i32.add + local.set $l9691 + local.get $l9690 + local.get $l9691 + i32.add + local.set $l9692 + local.get $l9691 + local.get $l9692 + i32.add + local.set $l9693 + local.get $l9692 + local.get $l9693 + i32.add + local.set $l9694 + local.get $l9693 + local.get $l9694 + i32.add + local.set $l9695 + local.get $l9694 + local.get $l9695 + i32.add + local.set $l9696 + local.get $l9695 + local.get $l9696 + i32.add + local.set $l9697 + local.get $l9696 + local.get $l9697 + i32.add + local.set $l9698 + local.get $l9697 + local.get $l9698 + i32.add + local.set $l9699 + local.get $l9698 + local.get $l9699 + i32.add + local.set $l9700 + local.get $l9699 + local.get $l9700 + i32.add + local.set $l9701 + local.get $l9700 + local.get $l9701 + i32.add + local.set $l9702 + local.get $l9701 + local.get $l9702 + i32.add + local.set $l9703 + local.get $l9702 + local.get $l9703 + i32.add + local.set $l9704 + local.get $l9703 + local.get $l9704 + i32.add + local.set $l9705 + local.get $l9704 + local.get $l9705 + i32.add + local.set $l9706 + local.get $l9705 + local.get $l9706 + i32.add + local.set $l9707 + local.get $l9706 + local.get $l9707 + i32.add + local.set $l9708 + local.get $l9707 + local.get $l9708 + i32.add + local.set $l9709 + local.get $l9708 + local.get $l9709 + i32.add + local.set $l9710 + local.get $l9709 + local.get $l9710 + i32.add + local.set $l9711 + local.get $l9710 + local.get $l9711 + i32.add + local.set $l9712 + local.get $l9711 + local.get $l9712 + i32.add + local.set $l9713 + local.get $l9712 + local.get $l9713 + i32.add + local.set $l9714 + local.get $l9713 + local.get $l9714 + i32.add + local.set $l9715 + local.get $l9714 + local.get $l9715 + i32.add + local.set $l9716 + local.get $l9715 + local.get $l9716 + i32.add + local.set $l9717 + local.get $l9716 + local.get $l9717 + i32.add + local.set $l9718 + local.get $l9717 + local.get $l9718 + i32.add + local.set $l9719 + local.get $l9718 + local.get $l9719 + i32.add + local.set $l9720 + local.get $l9719 + local.get $l9720 + i32.add + local.set $l9721 + local.get $l9720 + local.get $l9721 + i32.add + local.set $l9722 + local.get $l9721 + local.get $l9722 + i32.add + local.set $l9723 + local.get $l9722 + local.get $l9723 + i32.add + local.set $l9724 + local.get $l9723 + local.get $l9724 + i32.add + local.set $l9725 + local.get $l9724 + local.get $l9725 + i32.add + local.set $l9726 + local.get $l9725 + local.get $l9726 + i32.add + local.set $l9727 + local.get $l9726 + local.get $l9727 + i32.add + local.set $l9728 + local.get $l9727 + local.get $l9728 + i32.add + local.set $l9729 + local.get $l9728 + local.get $l9729 + i32.add + local.set $l9730 + local.get $l9729 + local.get $l9730 + i32.add + local.set $l9731 + local.get $l9730 + local.get $l9731 + i32.add + local.set $l9732 + local.get $l9731 + local.get $l9732 + i32.add + local.set $l9733 + local.get $l9732 + local.get $l9733 + i32.add + local.set $l9734 + local.get $l9733 + local.get $l9734 + i32.add + local.set $l9735 + local.get $l9734 + local.get $l9735 + i32.add + local.set $l9736 + local.get $l9735 + local.get $l9736 + i32.add + local.set $l9737 + local.get $l9736 + local.get $l9737 + i32.add + local.set $l9738 + local.get $l9737 + local.get $l9738 + i32.add + local.set $l9739 + local.get $l9738 + local.get $l9739 + i32.add + local.set $l9740 + local.get $l9739 + local.get $l9740 + i32.add + local.set $l9741 + local.get $l9740 + local.get $l9741 + i32.add + local.set $l9742 + local.get $l9741 + local.get $l9742 + i32.add + local.set $l9743 + local.get $l9742 + local.get $l9743 + i32.add + local.set $l9744 + local.get $l9743 + local.get $l9744 + i32.add + local.set $l9745 + local.get $l9744 + local.get $l9745 + i32.add + local.set $l9746 + local.get $l9745 + local.get $l9746 + i32.add + local.set $l9747 + local.get $l9746 + local.get $l9747 + i32.add + local.set $l9748 + local.get $l9747 + local.get $l9748 + i32.add + local.set $l9749 + local.get $l9748 + local.get $l9749 + i32.add + local.set $l9750 + local.get $l9749 + local.get $l9750 + i32.add + local.set $l9751 + local.get $l9750 + local.get $l9751 + i32.add + local.set $l9752 + local.get $l9751 + local.get $l9752 + i32.add + local.set $l9753 + local.get $l9752 + local.get $l9753 + i32.add + local.set $l9754 + local.get $l9753 + local.get $l9754 + i32.add + local.set $l9755 + local.get $l9754 + local.get $l9755 + i32.add + local.set $l9756 + local.get $l9755 + local.get $l9756 + i32.add + local.set $l9757 + local.get $l9756 + local.get $l9757 + i32.add + local.set $l9758 + local.get $l9757 + local.get $l9758 + i32.add + local.set $l9759 + local.get $l9758 + local.get $l9759 + i32.add + local.set $l9760 + local.get $l9759 + local.get $l9760 + i32.add + local.set $l9761 + local.get $l9760 + local.get $l9761 + i32.add + local.set $l9762 + local.get $l9761 + local.get $l9762 + i32.add + local.set $l9763 + local.get $l9762 + local.get $l9763 + i32.add + local.set $l9764 + local.get $l9763 + local.get $l9764 + i32.add + local.set $l9765 + local.get $l9764 + local.get $l9765 + i32.add + local.set $l9766 + local.get $l9765 + local.get $l9766 + i32.add + local.set $l9767 + local.get $l9766 + local.get $l9767 + i32.add + local.set $l9768 + local.get $l9767 + local.get $l9768 + i32.add + local.set $l9769 + local.get $l9768 + local.get $l9769 + i32.add + local.set $l9770 + local.get $l9769 + local.get $l9770 + i32.add + local.set $l9771 + local.get $l9770 + local.get $l9771 + i32.add + local.set $l9772 + local.get $l9771 + local.get $l9772 + i32.add + local.set $l9773 + local.get $l9772 + local.get $l9773 + i32.add + local.set $l9774 + local.get $l9773 + local.get $l9774 + i32.add + local.set $l9775 + local.get $l9774 + local.get $l9775 + i32.add + local.set $l9776 + local.get $l9775 + local.get $l9776 + i32.add + local.set $l9777 + local.get $l9776 + local.get $l9777 + i32.add + local.set $l9778 + local.get $l9777 + local.get $l9778 + i32.add + local.set $l9779 + local.get $l9778 + local.get $l9779 + i32.add + local.set $l9780 + local.get $l9779 + local.get $l9780 + i32.add + local.set $l9781 + local.get $l9780 + local.get $l9781 + i32.add + local.set $l9782 + local.get $l9781 + local.get $l9782 + i32.add + local.set $l9783 + local.get $l9782 + local.get $l9783 + i32.add + local.set $l9784 + local.get $l9783 + local.get $l9784 + i32.add + local.set $l9785 + local.get $l9784 + local.get $l9785 + i32.add + local.set $l9786 + local.get $l9785 + local.get $l9786 + i32.add + local.set $l9787 + local.get $l9786 + local.get $l9787 + i32.add + local.set $l9788 + local.get $l9787 + local.get $l9788 + i32.add + local.set $l9789 + local.get $l9788 + local.get $l9789 + i32.add + local.set $l9790 + local.get $l9789 + local.get $l9790 + i32.add + local.set $l9791 + local.get $l9790 + local.get $l9791 + i32.add + local.set $l9792 + local.get $l9791 + local.get $l9792 + i32.add + local.set $l9793 + local.get $l9792 + local.get $l9793 + i32.add + local.set $l9794 + local.get $l9793 + local.get $l9794 + i32.add + local.set $l9795 + local.get $l9794 + local.get $l9795 + i32.add + local.set $l9796 + local.get $l9795 + local.get $l9796 + i32.add + local.set $l9797 + local.get $l9796 + local.get $l9797 + i32.add + local.set $l9798 + local.get $l9797 + local.get $l9798 + i32.add + local.set $l9799 + local.get $l9798 + local.get $l9799 + i32.add + local.set $l9800 + local.get $l9799 + local.get $l9800 + i32.add + local.set $l9801 + local.get $l9800 + local.get $l9801 + i32.add + local.set $l9802 + local.get $l9801 + local.get $l9802 + i32.add + local.set $l9803 + local.get $l9802 + local.get $l9803 + i32.add + local.set $l9804 + local.get $l9803 + local.get $l9804 + i32.add + local.set $l9805 + local.get $l9804 + local.get $l9805 + i32.add + local.set $l9806 + local.get $l9805 + local.get $l9806 + i32.add + local.set $l9807 + local.get $l9806 + local.get $l9807 + i32.add + local.set $l9808 + local.get $l9807 + local.get $l9808 + i32.add + local.set $l9809 + local.get $l9808 + local.get $l9809 + i32.add + local.set $l9810 + local.get $l9809 + local.get $l9810 + i32.add + local.set $l9811 + local.get $l9810 + local.get $l9811 + i32.add + local.set $l9812 + local.get $l9811 + local.get $l9812 + i32.add + local.set $l9813 + local.get $l9812 + local.get $l9813 + i32.add + local.set $l9814 + local.get $l9813 + local.get $l9814 + i32.add + local.set $l9815 + local.get $l9814 + local.get $l9815 + i32.add + local.set $l9816 + local.get $l9815 + local.get $l9816 + i32.add + local.set $l9817 + local.get $l9816 + local.get $l9817 + i32.add + local.set $l9818 + local.get $l9817 + local.get $l9818 + i32.add + local.set $l9819 + local.get $l9818 + local.get $l9819 + i32.add + local.set $l9820 + local.get $l9819 + local.get $l9820 + i32.add + local.set $l9821 + local.get $l9820 + local.get $l9821 + i32.add + local.set $l9822 + local.get $l9821 + local.get $l9822 + i32.add + local.set $l9823 + local.get $l9822 + local.get $l9823 + i32.add + local.set $l9824 + local.get $l9823 + local.get $l9824 + i32.add + local.set $l9825 + local.get $l9824 + local.get $l9825 + i32.add + local.set $l9826 + local.get $l9825 + local.get $l9826 + i32.add + local.set $l9827 + local.get $l9826 + local.get $l9827 + i32.add + local.set $l9828 + local.get $l9827 + local.get $l9828 + i32.add + local.set $l9829 + local.get $l9828 + local.get $l9829 + i32.add + local.set $l9830 + local.get $l9829 + local.get $l9830 + i32.add + local.set $l9831 + local.get $l9830 + local.get $l9831 + i32.add + local.set $l9832 + local.get $l9831 + local.get $l9832 + i32.add + local.set $l9833 + local.get $l9832 + local.get $l9833 + i32.add + local.set $l9834 + local.get $l9833 + local.get $l9834 + i32.add + local.set $l9835 + local.get $l9834 + local.get $l9835 + i32.add + local.set $l9836 + local.get $l9835 + local.get $l9836 + i32.add + local.set $l9837 + local.get $l9836 + local.get $l9837 + i32.add + local.set $l9838 + local.get $l9837 + local.get $l9838 + i32.add + local.set $l9839 + local.get $l9838 + local.get $l9839 + i32.add + local.set $l9840 + local.get $l9839 + local.get $l9840 + i32.add + local.set $l9841 + local.get $l9840 + local.get $l9841 + i32.add + local.set $l9842 + local.get $l9841 + local.get $l9842 + i32.add + local.set $l9843 + local.get $l9842 + local.get $l9843 + i32.add + local.set $l9844 + local.get $l9843 + local.get $l9844 + i32.add + local.set $l9845 + local.get $l9844 + local.get $l9845 + i32.add + local.set $l9846 + local.get $l9845 + local.get $l9846 + i32.add + local.set $l9847 + local.get $l9846 + local.get $l9847 + i32.add + local.set $l9848 + local.get $l9847 + local.get $l9848 + i32.add + local.set $l9849 + local.get $l9848 + local.get $l9849 + i32.add + local.set $l9850 + local.get $l9849 + local.get $l9850 + i32.add + local.set $l9851 + local.get $l9850 + local.get $l9851 + i32.add + local.set $l9852 + local.get $l9851 + local.get $l9852 + i32.add + local.set $l9853 + local.get $l9852 + local.get $l9853 + i32.add + local.set $l9854 + local.get $l9853 + local.get $l9854 + i32.add + local.set $l9855 + local.get $l9854 + local.get $l9855 + i32.add + local.set $l9856 + local.get $l9855 + local.get $l9856 + i32.add + local.set $l9857 + local.get $l9856 + local.get $l9857 + i32.add + local.set $l9858 + local.get $l9857 + local.get $l9858 + i32.add + local.set $l9859 + local.get $l9858 + local.get $l9859 + i32.add + local.set $l9860 + local.get $l9859 + local.get $l9860 + i32.add + local.set $l9861 + local.get $l9860 + local.get $l9861 + i32.add + local.set $l9862 + local.get $l9861 + local.get $l9862 + i32.add + local.set $l9863 + local.get $l9862 + local.get $l9863 + i32.add + local.set $l9864 + local.get $l9863 + local.get $l9864 + i32.add + local.set $l9865 + local.get $l9864 + local.get $l9865 + i32.add + local.set $l9866 + local.get $l9865 + local.get $l9866 + i32.add + local.set $l9867 + local.get $l9866 + local.get $l9867 + i32.add + local.set $l9868 + local.get $l9867 + local.get $l9868 + i32.add + local.set $l9869 + local.get $l9868 + local.get $l9869 + i32.add + local.set $l9870 + local.get $l9869 + local.get $l9870 + i32.add + local.set $l9871 + local.get $l9870 + local.get $l9871 + i32.add + local.set $l9872 + local.get $l9871 + local.get $l9872 + i32.add + local.set $l9873 + local.get $l9872 + local.get $l9873 + i32.add + local.set $l9874 + local.get $l9873 + local.get $l9874 + i32.add + local.set $l9875 + local.get $l9874 + local.get $l9875 + i32.add + local.set $l9876 + local.get $l9875 + local.get $l9876 + i32.add + local.set $l9877 + local.get $l9876 + local.get $l9877 + i32.add + local.set $l9878 + local.get $l9877 + local.get $l9878 + i32.add + local.set $l9879 + local.get $l9878 + local.get $l9879 + i32.add + local.set $l9880 + local.get $l9879 + local.get $l9880 + i32.add + local.set $l9881 + local.get $l9880 + local.get $l9881 + i32.add + local.set $l9882 + local.get $l9881 + local.get $l9882 + i32.add + local.set $l9883 + local.get $l9882 + local.get $l9883 + i32.add + local.set $l9884 + local.get $l9883 + local.get $l9884 + i32.add + local.set $l9885 + local.get $l9884 + local.get $l9885 + i32.add + local.set $l9886 + local.get $l9885 + local.get $l9886 + i32.add + local.set $l9887 + local.get $l9886 + local.get $l9887 + i32.add + local.set $l9888 + local.get $l9887 + local.get $l9888 + i32.add + local.set $l9889 + local.get $l9888 + local.get $l9889 + i32.add + local.set $l9890 + local.get $l9889 + local.get $l9890 + i32.add + local.set $l9891 + local.get $l9890 + local.get $l9891 + i32.add + local.set $l9892 + local.get $l9891 + local.get $l9892 + i32.add + local.set $l9893 + local.get $l9892 + local.get $l9893 + i32.add + local.set $l9894 + local.get $l9893 + local.get $l9894 + i32.add + local.set $l9895 + local.get $l9894 + local.get $l9895 + i32.add + local.set $l9896 + local.get $l9895 + local.get $l9896 + i32.add + local.set $l9897 + local.get $l9896 + local.get $l9897 + i32.add + local.set $l9898 + local.get $l9897 + local.get $l9898 + i32.add + local.set $l9899 + local.get $l9898 + local.get $l9899 + i32.add + local.set $l9900 + local.get $l9899 + local.get $l9900 + i32.add + local.set $l9901 + local.get $l9900 + local.get $l9901 + i32.add + local.set $l9902 + local.get $l9901 + local.get $l9902 + i32.add + local.set $l9903 + local.get $l9902 + local.get $l9903 + i32.add + local.set $l9904 + local.get $l9903 + local.get $l9904 + i32.add + local.set $l9905 + local.get $l9904 + local.get $l9905 + i32.add + local.set $l9906 + local.get $l9905 + local.get $l9906 + i32.add + local.set $l9907 + local.get $l9906 + local.get $l9907 + i32.add + local.set $l9908 + local.get $l9907 + local.get $l9908 + i32.add + local.set $l9909 + local.get $l9908 + local.get $l9909 + i32.add + local.set $l9910 + local.get $l9909 + local.get $l9910 + i32.add + local.set $l9911 + local.get $l9910 + local.get $l9911 + i32.add + local.set $l9912 + local.get $l9911 + local.get $l9912 + i32.add + local.set $l9913 + local.get $l9912 + local.get $l9913 + i32.add + local.set $l9914 + local.get $l9913 + local.get $l9914 + i32.add + local.set $l9915 + local.get $l9914 + local.get $l9915 + i32.add + local.set $l9916 + local.get $l9915 + local.get $l9916 + i32.add + local.set $l9917 + local.get $l9916 + local.get $l9917 + i32.add + local.set $l9918 + local.get $l9917 + local.get $l9918 + i32.add + local.set $l9919 + local.get $l9918 + local.get $l9919 + i32.add + local.set $l9920 + local.get $l9919 + local.get $l9920 + i32.add + local.set $l9921 + local.get $l9920 + local.get $l9921 + i32.add + local.set $l9922 + local.get $l9921 + local.get $l9922 + i32.add + local.set $l9923 + local.get $l9922 + local.get $l9923 + i32.add + local.set $l9924 + local.get $l9923 + local.get $l9924 + i32.add + local.set $l9925 + local.get $l9924 + local.get $l9925 + i32.add + local.set $l9926 + local.get $l9925 + local.get $l9926 + i32.add + local.set $l9927 + local.get $l9926 + local.get $l9927 + i32.add + local.set $l9928 + local.get $l9927 + local.get $l9928 + i32.add + local.set $l9929 + local.get $l9928 + local.get $l9929 + i32.add + local.set $l9930 + local.get $l9929 + local.get $l9930 + i32.add + local.set $l9931 + local.get $l9930 + local.get $l9931 + i32.add + local.set $l9932 + local.get $l9931 + local.get $l9932 + i32.add + local.set $l9933 + local.get $l9932 + local.get $l9933 + i32.add + local.set $l9934 + local.get $l9933 + local.get $l9934 + i32.add + local.set $l9935 + local.get $l9934 + local.get $l9935 + i32.add + local.set $l9936 + local.get $l9935 + local.get $l9936 + i32.add + local.set $l9937 + local.get $l9936 + local.get $l9937 + i32.add + local.set $l9938 + local.get $l9937 + local.get $l9938 + i32.add + local.set $l9939 + local.get $l9938 + local.get $l9939 + i32.add + local.set $l9940 + local.get $l9939 + local.get $l9940 + i32.add + local.set $l9941 + local.get $l9940 + local.get $l9941 + i32.add + local.set $l9942 + local.get $l9941 + local.get $l9942 + i32.add + local.set $l9943 + local.get $l9942 + local.get $l9943 + i32.add + local.set $l9944 + local.get $l9943 + local.get $l9944 + i32.add + local.set $l9945 + local.get $l9944 + local.get $l9945 + i32.add + local.set $l9946 + local.get $l9945 + local.get $l9946 + i32.add + local.set $l9947 + local.get $l9946 + local.get $l9947 + i32.add + local.set $l9948 + local.get $l9947 + local.get $l9948 + i32.add + local.set $l9949 + local.get $l9948 + local.get $l9949 + i32.add + local.set $l9950 + local.get $l9949 + local.get $l9950 + i32.add + local.set $l9951 + local.get $l9950 + local.get $l9951 + i32.add + local.set $l9952 + local.get $l9951 + local.get $l9952 + i32.add + local.set $l9953 + local.get $l9952 + local.get $l9953 + i32.add + local.set $l9954 + local.get $l9953 + local.get $l9954 + i32.add + local.set $l9955 + local.get $l9954 + local.get $l9955 + i32.add + local.set $l9956 + local.get $l9955 + local.get $l9956 + i32.add + local.set $l9957 + local.get $l9956 + local.get $l9957 + i32.add + local.set $l9958 + local.get $l9957 + local.get $l9958 + i32.add + local.set $l9959 + local.get $l9958 + local.get $l9959 + i32.add + local.set $l9960 + local.get $l9959 + local.get $l9960 + i32.add + local.set $l9961 + local.get $l9960 + local.get $l9961 + i32.add + local.set $l9962 + local.get $l9961 + local.get $l9962 + i32.add + local.set $l9963 + local.get $l9962 + local.get $l9963 + i32.add + local.set $l9964 + local.get $l9963 + local.get $l9964 + i32.add + local.set $l9965 + local.get $l9964 + local.get $l9965 + i32.add + local.set $l9966 + local.get $l9965 + local.get $l9966 + i32.add + local.set $l9967 + local.get $l9966 + local.get $l9967 + i32.add + local.set $l9968 + local.get $l9967 + local.get $l9968 + i32.add + local.set $l9969 + local.get $l9968 + local.get $l9969 + i32.add + local.set $l9970 + local.get $l9969 + local.get $l9970 + i32.add + local.set $l9971 + local.get $l9970 + local.get $l9971 + i32.add + local.set $l9972 + local.get $l9971 + local.get $l9972 + i32.add + local.set $l9973 + local.get $l9972 + local.get $l9973 + i32.add + local.set $l9974 + local.get $l9973 + local.get $l9974 + i32.add + local.set $l9975 + local.get $l9974 + local.get $l9975 + i32.add + local.set $l9976 + local.get $l9975 + local.get $l9976 + i32.add + local.set $l9977 + local.get $l9976 + local.get $l9977 + i32.add + local.set $l9978 + local.get $l9977 + local.get $l9978 + i32.add + local.set $l9979 + local.get $l9978 + local.get $l9979 + i32.add + local.set $l9980 + local.get $l9979 + local.get $l9980 + i32.add + local.set $l9981 + local.get $l9980 + local.get $l9981 + i32.add + local.set $l9982 + local.get $l9981 + local.get $l9982 + i32.add + local.set $l9983 + local.get $l9982 + local.get $l9983 + i32.add + local.set $l9984 + local.get $l9983 + local.get $l9984 + i32.add + local.set $l9985 + local.get $l9984 + local.get $l9985 + i32.add + local.set $l9986 + local.get $l9985 + local.get $l9986 + i32.add + local.set $l9987 + local.get $l9986 + local.get $l9987 + i32.add + local.set $l9988 + local.get $l9987 + local.get $l9988 + i32.add + local.set $l9989 + local.get $l9988 + local.get $l9989 + i32.add + local.set $l9990 + local.get $l9989 + local.get $l9990 + i32.add + local.set $l9991 + local.get $l9990 + local.get $l9991 + i32.add + local.set $l9992 + local.get $l9991 + local.get $l9992 + i32.add + local.set $l9993 + local.get $l9992 + local.get $l9993 + i32.add + local.set $l9994 + local.get $l9993 + local.get $l9994 + i32.add + local.set $l9995 + local.get $l9994 + local.get $l9995 + i32.add + local.set $l9996 + local.get $l9995 + local.get $l9996 + i32.add + local.set $l9997 + local.get $l9996 + local.get $l9997 + i32.add + local.set $l9998 + local.get $l9997 + local.get $l9998 + i32.add + local.set $l9999 + ;; Return the last local variable + local.get $l9999 + ) +) From 4fe508cb92232364647ed628e88eab068f4ddb51 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 12 Feb 2026 17:48:50 -0500 Subject: [PATCH 179/212] fix comments --- src/test/app/FeeVote_test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 5103671ce0c..8f81af1e5f2 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -264,7 +264,9 @@ class FeeVote_test : public beast::unit_test::suite "extension_compute_limit = -100", "extension_size_limit = -200", "gas_price = -300"}); - // Illegal values are ignored, and the defaults left unchanged + // Negative values wrap to large positive uint32_t values. + // reference_fee is uint64_t and has bounds checking, so it keeps + // the default. auto setup = setup_FeeVote(config); BEAST_EXPECT(setup.reference_fee == defaultSetup.reference_fee); BEAST_EXPECT(setup.account_reserve == static_cast(-1234567)); From f73d8a6cf2386d787113f3b79499085bd07b9dbb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 13 Feb 2026 11:27:50 -0500 Subject: [PATCH 180/212] clean up some hf code (#6354) * clean up some hf code * fix comments * fix ubsan * Revert "fix ubsan" --- src/test/app/Wasm_test.cpp | 14 +- .../wasm_fixtures/codecov_tests/src/lib.rs | 13 + src/test/app/wasm_fixtures/fixtures.cpp | 311 +++++++++--------- .../app/wasm/detail/HostFuncImplGetter.cpp | 52 ++- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 4 + 5 files changed, 202 insertions(+), 192 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index d781875cc6e..8a7792dc515 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -326,9 +326,9 @@ struct Wasm_test : public beast::unit_test::suite } { // fail because trying to access nonexistent field - struct BadTestHostFunctions : public TestHostFunctions + struct FieldNotFoundHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) + explicit FieldNotFoundHostFunctions(Env& env) : TestHostFunctions(env) { } Expected @@ -338,15 +338,15 @@ struct Wasm_test : public beast::unit_test::suite } }; - std::shared_ptr hfs(new BadTestHostFunctions(env)); + std::shared_ptr hfs(new FieldNotFoundHostFunctions(env)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'965); } { // fail because trying to allocate more than MAX_PAGES memory - struct BadTestHostFunctions : public TestHostFunctions + struct OversizedFieldHostFunctions : public TestHostFunctions { - explicit BadTestHostFunctions(Env& env) : TestHostFunctions(env) + explicit OversizedFieldHostFunctions(Env& env) : TestHostFunctions(env) { } Expected @@ -356,7 +356,7 @@ struct Wasm_test : public beast::unit_test::suite } }; - std::shared_ptr hfs(new BadTestHostFunctions(env)); + std::shared_ptr hfs(new OversizedFieldHostFunctions(env)); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'965); } @@ -574,7 +574,7 @@ struct Wasm_test : public beast::unit_test::suite auto const codecovWasm = hexToBytes(codecovTestsWasmHex); std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const allowance = 201'503; + auto const allowance = 202'724; auto re = runEscrowWasm(codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); checkResult(re, 1, allowance); diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 59ff5bc164f..67e16c5cec6 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -1777,6 +1777,19 @@ pub extern "C" fn finish() -> i32 { "mptoken_keylet_mptid_wrong_length", ) }); + check_result( + unsafe { + host::trace( + message.as_ptr(), + message.len(), + locator.as_ptr(), + locator.len(), + 2, + ) + }, + error_codes::INVALID_PARAMS, + "trace_invalid_as_hex", + ); // ensure that the Slice index desync issue is fixed let empty: &[u8] = b""; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index db77313a42b..2767becda0a 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -653,13 +653,13 @@ extern std::string const codecovTestsWasmHex = "73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620d7469636b65745f6b65796c65" "74000008686f73745f6c69620c7661756c745f6b65796c6574000008686f73745f6c69620f64656c65676174655f6b65796c6574000008686f" "73745f6c6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a6469645f6b65796c6574000108686f73" - "745f6c69620e7369676e6572735f6b65796c65740001030302090a05030100110619037f01418080c0000b7f00418ea1c0000b7f004190a1c0" - "000b072e04066d656d6f727902000666696e697368003d0a5f5f646174615f656e6403010b5f5f686561705f6261736503020aa12c02460002" + "745f6c69620e7369676e6572735f6b65796c65740001030302090a05030100110619037f01418080c0000b7f0041bba1c0000b7f0041c0a1c0" + "000b072e04066d656d6f727902000666696e697368003d0a5f5f646174615f656e6403010b5f5f686561705f6261736503020abf2c02460002" "40200020014704402002200341014100410010001a20004100480d01418b80c000410b2000ad1001000b200220032000ac10011a0f0b418b80" - "c000410b2000ac1001000bd72b020a7f017e23004190026b22002400419680c000412341014100410010001a20004100360260200041e0006a" - "220241041002410441a88cc000410e103c20004100360260200241041003410441b68cc0004116103c200041f8006a22044200370300200041" - "f0006a22014200370300200041e8006a2205420037030020004200370360200241201004412041cc8cc0004116103c20004100360260200241" - "041005410441e28cc000410c103c200041106a2207428182848890a0c08001370300200041186a2206428182848890a0c08001370300200041" + "c000410b2000ac1001000bf52b020a7f017e23004190026b22002400419680c000412341014100410010001a20004100360260200041e0006a" + "220241041002410441bd8cc000410e103c20004100360260200241041003410441cb8cc0004116103c200041f8006a22044200370300200041" + "f0006a22014200370300200041e8006a2205420037030020004200370360200241201004412041e18cc0004116103c20004100360260200241" + "041005410441f78cc000410c103c200041106a2207428182848890a0c08001370300200041186a2206428182848890a0c08001370300200041" "206a2209428182848890a0c080013703002000428182848890a0c0800137030841b980c000410e1006410141c780c0004111103c200041086a" "41201006410141c780c0004111103c418180202002411410072203411446044002402000412e6a200041e2006a2d00003a0000200020002900" "673703e8012000200041ec006a2900003700ed01200020002f00603b012c200020002903e8013703a801200020002900ed013700ad01200020" @@ -667,170 +667,171 @@ extern std::string const codecovTestsWasmHex = "3703602000412c6a2204411420024120100822034120470d00200041c2006a20002d00623a0000200041f0016a2203200041ef006a29000022" "0a370300200041cf006a200a370000200041d7006a200041f7006a290000370000200041df006a200041ff006a2d00003a0000200020002f01" "603b01402000200028006336004320002000290067370047200041406b412041001009410141d880c0004110103c2001410036020020054200" - "370300200042003703604181802020024114100a411441ee8cc000411c103c2001410036020020054200370300200042003703604101418180" - "2020024114100b4114418a8dc0004114103c200041043602a001200041818020360260200041f8016a22054100360200200342003703002000" - "42003703e80120024104200041e8016a22014114100c4114419e8dc0004113103c2005410036020020034200370300200042003703e8012002" - "20002802a00120014114100d411441b18dc0004123103c2005410036020020034200370300200042003703e8014101200220002802a0012001" - "4114100e411441d48dc000411b103c4189803c100f412041e880c0004110103c4189803c1010412041f880c0004120103c41014189803c1011" + "370300200042003703604181802020024114100a411441838dc000411c103c2001410036020020054200370300200042003703604101418180" + "2020024114100b4114419f8dc0004114103c200041043602a001200041818020360260200041f8016a22054100360200200342003703002000" + "42003703e80120024104200041e8016a22014114100c411441b38dc0004113103c2005410036020020034200370300200042003703e8012002" + "20002802a00120014114100d411441c68dc0004123103c2005410036020020034200370300200042003703e8014101200220002802a0012001" + "4114100e411441e98dc000411b103c4189803c100f412041e880c0004110103c4189803c1010412041f880c0004120103c41014189803c1011" "4120419881c0004118103c200220002802a0011012412041b081c0004117103c200220002802a0011013412041c781c0004127103c41012002" "20002802a0011014412041ee81c000411f103c2004411410154114418d82c000410b103c20004180026a220842003703002005420037030020" - "034200370300200042003703e801200220002802a001200141201016412041ef8dc0004113103c419882c000410c41a482c000410b41af82c0" + "034200370300200042003703e801200220002802a001200141201016412041848ec0004113103c419882c000410c41a482c000410b41af82c0" "00410e1017410141bd82c0004109103c200041c0016a2009290300370300200041b8016a2006290300370300200041b0016a20072903003703" "00200020002903083703a801200541003b010020034200370300200042003703e80120044114200041a8016a22074120200141121018411241" - "828ec0004107103c2005410036020020034200370300200042003703e80120074120200141141019411441898ec000410e103c200041003602" - "e8012007412020014104101a410441978ec000410d103c20074120101b410841c682c000410d103c20074120101c410a41d382c0004114103c" - "200041003602e8012007412020014104101d410441a48ec000410e103c41e782c000410d20044114101e410041f482c000410d103c41e782c0" + "978ec0004107103c2005410036020020034200370300200042003703e801200741202001411410194114419e8ec000410e103c200041003602" + "e8012007412020014104101a410441ac8ec000410d103c20074120101b410841c682c000410d103c20074120101c410a41d382c0004114103c" + "200041003602e8012007412020014104101d410441b98ec000410e103c41e782c000410d20044114101e410041f482c000410d103c41e782c0" "00410d418183c0004108101f4100418983c000410c103c41e782c000410d419583c0004108101f4100419d83c0004111103c417f4104100441" - "7141ae83c000411e103c200041003602e8012001417f1004417141b28ec000411e103c200041ea016a41003a0000200041003b01e801200141" - "031004417d41d08ec0004124103c200041003602e8012001418094ebdc031004417341f48ec0004123103c4102100f416f41cc83c000411f10" + "7141ae83c000411e103c200041003602e8012001417f1004417141c78ec000411e103c200041ea016a41003a0000200041003b01e801200141" + "031004417d41e58ec0004124103c200041003602e8012001418094ebdc031004417341898fc0004123103c4102100f416f41cc83c000411f10" "3c417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c20024181201012417441a984c0004120103c" "200041e094ebdc036a220620002802a0011012417341c984c000411f103c200842003703002005420037030020034200370300200042003703" - "e8012004411420064108200141201020417341978fc0004118103c200842003703002005420037030020034200370300200042003703e80120" - "04411420044114200141201020417141af8fc000411a103c200842003703002005420037030020034200370300200042003703e80120064108" - "2001412041001021417341c98fc0004117103c200842003703002005420037030020034200370300200042003703e801200220002802a00120" - "01412041001021417141e08fc0004120103c200620002802a00141011009417341e884c0004118103c200220002802a0014101100941714180" - "85c000411a103c200842003703002005420037030020034200370300200042003703e801200620002802a0012001412010084173418090c000" - "4116103c200842003703002005420037030020034200370300200042003703e801200220002802a0012001412010084171419690c000411810" - "3c200842003703002005420037030020034200370300200042003703e8012004411420044114200620002802a001200141201022417341ae90" + "e8012004411420064108200141201020417341ac8fc0004118103c200842003703002005420037030020034200370300200042003703e80120" + "04411420044114200141201020417141c48fc000411a103c200842003703002005420037030020034200370300200042003703e80120064108" + "2001412041001021417341de8fc0004117103c200842003703002005420037030020034200370300200042003703e801200220002802a00120" + "01412041001021417141f58fc0004120103c200620002802a00141011009417341e884c0004118103c200220002802a0014101100941714180" + "85c000411a103c200842003703002005420037030020034200370300200042003703e801200620002802a0012001412010084173419590c000" + "4116103c200842003703002005420037030020034200370300200042003703e801200220002802a001200141201008417141ab90c000411810" + "3c200842003703002005420037030020034200370300200042003703e8012004411420044114200620002802a001200141201022417341c390" "c000411c103c200842003703002005420037030020034200370300200042003703e8012004411420044114200220002802a001200141201022" - "417141ca90c000411e103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114200620002802a0012001" - "41201023417341e890c0004119103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114200220002802" - "a0012001412010234171418191c000411f103c200842003703002005420037030020034200370300200042003703e80141faa0c0004114419a" - "85c0004114200141201023417141a091c0004129103c200842003703002005420037030020034200370300200042003703e80141ae85c00041" - "2841faa0c0004114200141201023417141c991c0004125103c200041dc016a2000413c6a280100360200200041d4016a200041346a29010037" - "02002000200029012c3702cc01200041808080083602c801200041003b01e801200041c8016a2209411841faa0c00041142001410210234171" - "41ee91c000410e103c200620002802a001422a1001417341d685c0004111103c200041003b01e8014102200141021007416f41fc91c000411b" - "103c200041003b01e801410220014102100a416f419792c000412b103c200041003b01e8014101410220014102100b416f41c292c000412310" + "417141df90c000411e103c200842003703002005420037030020034200370300200042003703e80141a7a1c0004114200620002802a0012001" + "41201023417341fd90c0004119103c200842003703002005420037030020034200370300200042003703e80141a7a1c0004114200220002802" + "a0012001412010234171419691c000411f103c200842003703002005420037030020034200370300200042003703e80141a7a1c0004114419a" + "85c0004114200141201023417141b591c0004129103c200842003703002005420037030020034200370300200042003703e80141ae85c00041" + "2841a7a1c0004114200141201023417141de91c0004125103c200041dc016a2000413c6a280100360200200041d4016a200041346a29010037" + "02002000200029012c3702cc01200041808080083602c801200041003b01e801200041c8016a2209411841a7a1c00041142001410210234171" + "418392c000410e103c200620002802a001422a1001417341d685c0004111103c200041003b01e8014102200141021007416f419192c000411b" + "103c200041003b01e801410220014102100a416f41ac92c000412b103c200041003b01e8014101410220014102100b416f41d792c000412310" "3c4102100f416f41cc83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c0004127103c41b980c00041812010" - "06417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e801200241812020014102100c417441e592" - "c0004121103c200041003b01e801200241812020014102100d4174418693c0004131103c200041003b01e8014101200241812020014102100e" - "417441b793c0004129103c20024181201012417441f686c0004125103c200241812010134174419b87c0004135103c41012002418120101441" + "06417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e801200241812020014102100c417441fa92" + "c0004121103c200041003b01e801200241812020014102100d4174419b93c0004131103c200041003b01e8014101200241812020014102100e" + "417441cc93c0004129103c20024181201012417441f686c0004125103c200241812010134174419b87c0004135103c41012002418120101441" "7441d087c000412d103c20024181201015417441fd87c0004119103c41e782c00041812041a482c000410b41af82c000410e1017417441bd82" "c0004109103c41e782c000410d41a482c00041812041af82c000410e1017417441bd82c0004109103c41e782c000410d41a482c000410b41af" - "82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441e093c0004121103c200041003b01e801" - "41faa0c00041812041faa0c00041142001410210234174418194c0004118103c200041003b01e8012004411420044114200241812020014102" - "10244174419994c000411f103c200041003b01e801200941812020044114200141021025417441b894c0004122103c41e782c000410d200620" + "82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441f593c0004121103c200041003b01e801" + "41a7a1c00041812041a7a1c00041142001410210234174419694c0004118103c200041003b01e8012004411420044114200241812020014102" + "1024417441ae94c000411f103c200041003b01e801200941812020044114200141021025417441cd94c0004122103c41e782c000410d200620" "002802a001410010004173419688c000410f103c200042d487b6f4c7d4b1c0003700e00141e782c000410d200041e095ebdc036a2207410810" "26417341a588c000411c103c41e782c000410d200620002802a001101f417341c188c0004116103c20074108200041e0016a22064108102741" "7341d788c0004118103c20064108200741081027417341ef88c0004118103c200041003b01e801200741082006410820014102410010284173" - "41da94c0004114103c200041003b01e80120064108200741082001410241001028417341ee94c0004114103c200041003b01e8012007410820" - "06410820014102410010294173418295c0004119103c200041003b01e801200641082007410820014102410010294173419b95c0004119103c" - "200041003b01e8012007410820064108200141024100102a417341b495c0004119103c200041003b01e8012006410820074108200141024100" - "102a417341cd95c0004119103c200041003b01e8012007410820064108200141024100102b417341e695c0004117103c200041003b01e80120" - "06410820074108200141024100102b417341fd95c0004117103c200041003b01e801200741084103200141024100102c4173419496c0004114" - "103c200041003b01e801200741084103200141024100102d417341a896c0004113103c200041003b01e80120074108200141024100102e4173" - "41bb96c0004113103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120102f417141ce96" - "c000411f103c200842003703002005420037030020034200370300200042003703e8012004411420044114200141201030417141ed96c00041" - "25103c200842003703002005420037030020034200370300200042003703e80120044114200441142001412010314171419297c0004122103c" - "200842003703002005420037030020034200370300200042003703e8012004411420044114200141201032417141b497c000411e103c200842" - "003703002005420037030020034200370300200042003703e8012004411420044114200141201033417141d297c000411f103c200842003703" - "002005420037030020034200370300200042003703e801200441142004411420044114200141201034417141f197c0004120103c2008420037" - "03002005420037030020034200370300200042003703e80120044114200441142001412010354171419198c000412c103c2008420037030020" - "05420037030020034200370300200042003703e8012004411420044114200141201036417141bd98c000411f103c2008420037030020054200" - "37030020034200370300200042003703e8012004411420044114200141201037417141dc98c000411e103c200220002802a001410010094171" - "418789c0004123103c200041003b01e80120044114200220002802a001200141021018417141fa98c000411a103c200041003b01e801200220" - "002802a0012001410210194171419499c0004121103c200041003b01e801200220002802a00120014102101a417141b599c0004120103c2002" + "41ef94c0004114103c200041003b01e801200641082007410820014102410010284173418395c0004114103c200041003b01e8012007410820" + "06410820014102410010294173419795c0004119103c200041003b01e80120064108200741082001410241001029417341b095c0004119103c" + "200041003b01e8012007410820064108200141024100102a417341c995c0004119103c200041003b01e8012006410820074108200141024100" + "102a417341e295c0004119103c200041003b01e8012007410820064108200141024100102b417341fb95c0004117103c200041003b01e80120" + "06410820074108200141024100102b4173419296c0004117103c200041003b01e801200741084103200141024100102c417341a996c0004114" + "103c200041003b01e801200741084103200141024100102d417341bd96c0004113103c200041003b01e80120074108200141024100102e4173" + "41d096c0004113103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120102f417141e396" + "c000411f103c200842003703002005420037030020034200370300200042003703e80120044114200441142001412010304171418297c00041" + "25103c200842003703002005420037030020034200370300200042003703e8012004411420044114200141201031417141a797c0004122103c" + "200842003703002005420037030020034200370300200042003703e8012004411420044114200141201032417141c997c000411e103c200842" + "003703002005420037030020034200370300200042003703e8012004411420044114200141201033417141e797c000411f103c200842003703" + "002005420037030020034200370300200042003703e8012004411420044114200441142001412010344171418698c0004120103c2008420037" + "03002005420037030020034200370300200042003703e8012004411420044114200141201035417141a698c000412c103c2008420037030020" + "05420037030020034200370300200042003703e8012004411420044114200141201036417141d298c000411f103c2008420037030020054200" + "37030020034200370300200042003703e8012004411420044114200141201037417141f198c000411e103c200220002802a001410010094171" + "418789c0004123103c200041003b01e80120044114200220002802a0012001410210184171418f99c000411a103c200041003b01e801200220" + "002802a001200141021019417141a999c0004121103c200041003b01e801200220002802a00120014102101a417141ca99c0004120103c2002" "20002802a001101b417141aa89c0004120103c200220002802a001101c417141ca89c0004127103c200041003602e801200220002802a00120" - "014104101d417141d599c0004121103c200041003b01e801200220002802a001200141021008417141f699c0004123103c2000418080800836" - "02e801200041003b018e02200220002802a001200141042000418e026a220341021020417141999ac0004121103c200041003b018e02200220" - "002802a00122052004411420022005200341021024417141ba9ac0004127103c200041003b018e0220044114200220002802a0012205200220" - "05200341021024417141e19ac0004127103c200041003b018e02200220002802a00120044114200341021038417141889bc0004125103c2000" - "41003b018e0220044114200220002802a001200341021038417141ad9bc0004125103c200041003b018e02200220002802a001200441142003" - "41021039417141d29bc000412c103c200041003b018e0220044114200220002802a001200341021039417141fe9bc000412c103c200041003b" - "018e02200220002802a00120034102103a417141aa9cc000411f103c200041003b018e02200220002802a0012001410420034102102f417141" - "c99cc0004122103c200041003b018e02200220002802a00120044114419a85c0004114200341021022417141eb9cc0004121103c200041003b" - "018e0220044114200220002802a001419a85c00041142003410210224171418c9dc0004121103c200041003b018e02200220002802a0012001" - "4104200341021030417141ad9dc0004128103c200041003b018e0220094118200220002802a001200341021025417141d59dc0004123103c20" - "0041003b018e02200220002802a00120014104200341021031417141f89dc0004125103c200041003b018e02200220002802a0012001410420" - "03410210324171419d9ec0004121103c200041003b018e02200220002802a00120014104200341021033417141be9ec0004122103c20004100" - "3b018e02200220002802a0012004411420014104200341021034417141e09ec0004124103c200041003b018e0220044114200220002802a001" - "20014104200341021034417141849fc0004124103c200041003b018e02200220002802a00120014104200341021035417141a89fc000412f10" - "3c200041003b018e02200220002802a00120034102103b417141d79fc0004123103c200041003b018e02200220002802a00120014104200341" - "021036417141fa9fc0004122103c200041003b018e02200220002802a001200141042003410210374171419ca0c0004121103c200041003b01" - "8e02200220002802a00141f189c0004120200341021018417141bda0c000411c103c41e782c000410d200220002802a001101e417141918ac0" - "004122103c41e796abdd03410d41f189c000412041001000417341b38ac0004110103c41e796abdd03410d200641081026417341c38ac00041" - "1d103c41e796abdd03410d20044114101e417341e08ac0004118103c41e796abdd03410d419583c0004108101f417341f88ac0004117103c20" - "0220002802a0012002418120410010004174418f8bc000410e103c2002418120420110014174419d8bc0004112103c41e782c0004181202006" - "41081026417441af8bc000411b103c41e782c00041812020044114101e417441ca8bc0004116103c41e782c000418120419583c0004108101f" - "417441e08bc0004115103c41e782c000410d200220002802a001101f417141f58bc0004119103c200041003b018e02200220002802a0012004" - "4114200341021025417141d9a0c0004121103c4101410020044114101e4100418e8cc000411a103c20004190026a240041010f0b0b418080c0" - "00410b417f20032003417f4e1bac1001000b0be5200200418080c0000bae056572726f725f636f64653d54455354204641494c454424242424" - "24205354415254494e47205741534d20455845435554494f4e202424242424746573745f616d656e646d656e74616d656e646d656e745f656e" - "61626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f" - "626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c" - "656e6765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e" - "65737465645f61727261795f6c656e7570646174655f6461746174657374206d65737361676574657374207075626b65797465737420736967" - "6e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f66656574657374696e672074" - "7261636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e74400000000000000074726163655f616d6f756e74" - "5f7a65726f6765745f706172656e745f6c65646765725f686173685f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c" - "69645f736669656c646765745f74785f6e65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f617272" - "61795f6c656e5f6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e657374" - "65645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f" - "6f626a5f77726f6e675f6c656e55534430303030303030303030303030303030300041d685c0000ba41b74726163655f6e756d5f6f6f625f73" - "74726765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c656467" - "65725f6f626a5f61727261795f6c656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f" - "736c696365616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f" - "6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269" - "675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174" - "655f646174615f746f6f5f6269675f736c69636574726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f62" - "5f736c69636574726163655f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c6f6174" - "5f636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75696e74323536676574" - "5f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e66745f7472616e736665725f6665655f77726f6e675f73" - "697a655f75696e74323536303030303030303030303030303030303030303030303030303030303030303174726163655f6163636f756e745f" - "77726f6e675f73697a655f6163636f756e74696474726163655f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f" - "625f737472696e6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e677472" - "6163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e67" - "74726163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77" - "726f6e675f6c656e67746874726163655f6163636f756e745f636865636b5f646573796e636765745f6c65646765725f73716e6765745f7061" - "72656e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f686173686765745f626173655f6665656765745f637572" - "72656e745f6c65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669" - "656c646765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e657374" - "65645f6669656c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f74" - "61786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e" - "745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f" - "5f6c6f6e67636865636b5f6b65796c65745f6f6f625f6c656e5f753332636865636b5f6b65796c65745f77726f6e675f6c656e5f753332666c" - "6f61745f66726f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e5f75696e7436346163636f" - "756e745f6b65796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e" - "5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e" - "5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f" - "77726f6e675f6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e" - "63795f6c656e616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765745f63757272656e" - "745f6c65646765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76" - "616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c" - "65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e6573746564" - "5f6669656c645f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f" - "6b65796c65745f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b65" - "6e5f6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f616464" - "5f6f6f625f736c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c" - "69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f" - "61745f6469766964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f62" - "5f736c696365666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c696365657363726f775f6b65796c6574" - "5f77726f6e675f73697a655f75696e7433326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f75696e7433326e66" - "745f6f666665725f6b65796c65745f77726f6e675f73697a655f75696e7433326f666665725f6b65796c65745f77726f6e675f73697a655f75" - "696e7433326f7261636c655f6b65796c65745f77726f6e675f73697a655f75696e7433327061796368616e5f6b65796c65745f77726f6e675f" - "73697a655f75696e7433327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f75696e7433327469" - "636b65745f6b65796c65745f77726f6e675f73697a655f75696e7433327661756c745f6b65796c65745f77726f6e675f73697a655f75696e74" - "33326765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e" - "743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e675f" - "73697a655f75696e743235366163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e746964636865636b5f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e74696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f75" - "6e7469643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e7469643264656c65676174655f6b65796c" - "65745f77726f6e675f73697a655f6163636f756e7469643164656c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "746964326465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964316465706f7369745f70" - "7265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326469645f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e746964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646c696e655f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e746964316c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e746964326d70745f69" - "737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f77726f6e675f73" - "697a655f6163636f756e7469646e66745f6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646f666665725f6b" - "65796c65745f77726f6e675f73697a655f6163636f756e7469646f7261636c655f6b65796c65745f77726f6e675f73697a655f6163636f756e" - "7469647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e746964317061796368616e5f6b65796c65745f77726f" - "6e675f73697a655f6163636f756e746964327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f61" - "63636f756e7469647369676e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e7469647469636b65745f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e7469647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f756e7469646765745f" - "6e66745f77726f6e675f73697a655f6163636f756e7469646d70746f6b656e5f6b65796c65745f6d707469645f77726f6e675f6c656e677468" - "004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38372e3020" - "2831373036376539616320323032352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c" - "732b087369676e2d657874"; + "014104101d417141ea99c0004121103c200041003b01e801200220002802a0012001410210084171418b9ac0004124103c2000418080800836" + "02e801200041003b018e02200220002802a001200141042000418e026a220341021020417141af9ac0004122103c200041003b018e02200220" + "002802a00122052004411420022005200341021024417141d19ac0004128103c200041003b018e0220044114200220002802a0012205200220" + "05200341021024417141f99ac0004128103c200041003b018e02200220002802a00120044114200341021038417141a19bc0004126103c2000" + "41003b018e0220044114200220002802a001200341021038417141c79bc0004126103c200041003b018e02200220002802a001200441142003" + "41021039417141ed9bc000412d103c200041003b018e0220044114200220002802a0012003410210394171419a9cc000412d103c200041003b" + "018e02200220002802a00120034102103a417141c79cc0004120103c200041003b018e02200220002802a0012001410420034102102f417141" + "e79cc0004123103c200041003b018e02200220002802a00120044114419a85c00041142003410210224171418a9dc0004122103c200041003b" + "018e0220044114200220002802a001419a85c0004114200341021022417141ac9dc0004122103c200041003b018e02200220002802a0012001" + "4104200341021030417141ce9dc0004129103c200041003b018e0220094118200220002802a001200341021025417141f79dc0004124103c20" + "0041003b018e02200220002802a001200141042003410210314171419b9ec0004126103c200041003b018e02200220002802a0012001410420" + "0341021032417141c19ec0004122103c200041003b018e02200220002802a00120014104200341021033417141e39ec0004123103c20004100" + "3b018e02200220002802a0012004411420014104200341021034417141869fc0004125103c200041003b018e0220044114200220002802a001" + "20014104200341021034417141ab9fc0004125103c200041003b018e02200220002802a00120014104200341021035417141d09fc000413010" + "3c200041003b018e02200220002802a00120034102103b41714180a0c0004124103c200041003b018e02200220002802a00120014104200341" + "021036417141a4a0c0004123103c200041003b018e02200220002802a00120014104200341021037417141c7a0c0004122103c200041003b01" + "8e02200220002802a00141f189c0004120200341021018417141e9a0c000411d103c41e782c000410d200220002802a001101e417141918ac0" + "004123103c41e796abdd03410d41f189c000412041001000417341b48ac0004110103c41e796abdd03410d200641081026417341c48ac00041" + "1d103c41e796abdd03410d20044114101e417341e18ac0004118103c41e796abdd03410d419583c0004108101f417341f98ac0004117103c20" + "0220002802a001200241812041001000417441908bc000410e103c2002418120420110014174419e8bc0004112103c41e782c0004181202006" + "41081026417441b08bc000411b103c41e782c00041812020044114101e417441cb8bc0004116103c41e782c000418120419583c0004108101f" + "417441e18bc0004115103c41e782c000410d200220002802a001101f417141f68bc0004119103c200041003b018e02200220002802a0012004" + "411420034102102541714186a1c0004121103c41e782c000410d200220002802a001410210004171418f8cc0004114103c4101410020044114" + "101e410041a38cc000411a103c20004190026a240041010f0b0b418080c000410b417f20032003417f4e1bac1001000b0b92210200418080c0" + "000bae056572726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741534d20455845435554494f4e2024" + "24242424746573745f616d656e646d656e74616d656e646d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f7478" + "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f" + "61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f6e65" + "737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e7570646174655f6461746174" + "657374206d65737361676574657374207075626b657974657374207369676e6174757265636865636b5f7369676765745f6e66745f666c6167" + "736765745f6e66745f7472616e736665725f66656574657374696e6720747261636574726163655f6163636f756e74400000000000005f7472" + "6163655f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e745f6c65646765725f68617368" + "5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e65737465645f61727261" + "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e6765745f74785f6e6573746564" + "5f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c" + "65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e5553443030303030303030303030" + "3030303030300041d685c0000bd11b74726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a5f6172" + "7261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f696e76616c69645f7366" + "69656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e61626c65645f746f6f5f" + "6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c656467" + "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c69636574726163655f6f" + "6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f616d6f756e745f6f6f625f736c6963" + "65666c6f61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c6963653263616368655f6c65" + "646765725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e7432" + "35366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e7432353630303030303030303030303030303030" + "3030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f756e745f696474726163655f" + "6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163636f756e745f6f6f625f" + "737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f" + "6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f6e6774726163" + "655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e67746874726163655f696e76616c69645f61" + "735f68657874726163655f6163636f756e745f636865636b5f646573796e636765745f6c65646765725f73716e6765745f706172656e745f6c" + "65646765725f74696d656765745f706172656e745f6c65646765725f686173686765745f626173655f6665656765745f63757272656e745f6c" + "65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465645f6669656c64676574" + "5f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f666965" + "6c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461786f6e6765" + "745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f706172656e745f6c656467" + "65725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e5f746f6f5f6c6f6e6763" + "6865636b5f6b65796c65745f6f6f625f6c656e5f753332636865636b5f6b65796c65745f77726f6e675f6c656e5f753332666c6f61745f6672" + "6f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e5f75696e7436346163636f756e745f6b65" + "796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c656e5f6f6f625f63" + "757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c65745f6c656e5f6f6f625f61" + "7373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f" + "6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e" + "616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c656467" + "65725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c645f696e76616c69645f73" + "6669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f" + "6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c64" + "5f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c6574" + "5f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f6b65796c" + "65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c69636531666c6f61745f6164645f6f6f625f73" + "6c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f625f736c69636532666c" + "6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f646976" + "6964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c696365" + "666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c696365657363726f775f6b65796c65745f77726f6e67" + "5f73697a655f75696e7433326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f75696e7433326e66745f6f666665" + "725f6b65796c65745f77726f6e675f73697a655f75696e7433326f666665725f6b65796c65745f77726f6e675f73697a655f75696e7433326f" + "7261636c655f6b65796c65745f77726f6e675f73697a655f75696e7433327061796368616e5f6b65796c65745f77726f6e675f73697a655f75" + "696e7433327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f75696e7433327469636b65745f6b" + "65796c65745f77726f6e675f73697a655f75696e7433327661756c745f6b65796c65745f77726f6e675f73697a655f75696e7433326765745f" + "6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a655f75696e743235366765" + "745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f77726f6e675f73697a655f75" + "696e743235366163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964636865636b5f6b65796c65745f7772" + "6f6e675f73697a655f6163636f756e745f696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69" + "643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69643264656c65676174655f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e745f69643164656c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e74" + "5f6964326465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964316465706f7369745f" + "707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964326469645f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e745f6964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646c696e655f6b65796c65" + "745f77726f6e675f73697a655f6163636f756e745f6964316c696e655f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964" + "326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646d70746f6b656e5f6b65796c65745f" + "77726f6e675f73697a655f6163636f756e745f69646e66745f6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e745f" + "69646f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646f7261636c655f6b65796c65745f77726f6e675f73" + "697a655f6163636f756e745f69647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f696431706179636861" + "6e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964327065726d697373696f6e65645f646f6d61696e5f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e745f69647369676e6572735f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69" + "647469636b65745f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69647661756c745f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e745f69646765745f6e66745f77726f6e675f73697a655f6163636f756e745f69646d70746f6b656e5f6b65796c65745f" + "6d707469645f77726f6e675f6c656e677468004d0970726f64756365727302086c616e6775616765010452757374000c70726f636573736564" + "2d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f66656174757265" + "73022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const floatTestsWasmHex = "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 0a3247604ab..163ab4e65f8 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -35,77 +35,69 @@ getAnyFieldData(STBase const* obj) case STI_UNKNOWN: case STI_NOTPRESENT: return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - break; - // LCOV_EXCL_STOP + // LCOV_EXCL_STOP + case STI_OBJECT: case STI_ARRAY: case STI_VECTOR256: return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - break; + case STI_ACCOUNT: { auto const* account(static_cast(obj)); auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } - break; - case STI_AMOUNT: - // will be processed by serializer - break; + case STI_ISSUE: { auto const* issue(static_cast(obj)); Asset const& asset(issue->value()); // XRP and IOU will be processed by serializer if (asset.holds()) { - // MPT auto const& mptIssue = asset.get(); auto const& mptID = mptIssue.getMptID(); return Bytes{mptID.cbegin(), mptID.cend()}; } + break; // Use serializer } - break; + case STI_VL: { auto const* vl(static_cast(obj)); auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } - break; - case STI_UINT16: { + + case STI_UINT16: return getIntBytes(obj); - } - break; - case STI_UINT32: { + + case STI_UINT32: return getIntBytes(obj); - } + // LCOV_EXCL_START - case STI_UINT64: { + case STI_UINT64: return getIntBytes(obj); - } - break; - case STI_INT32: { + + case STI_INT32: return getIntBytes(obj); - } - break; - case STI_INT64: { + + case STI_INT64: return getIntBytes(obj); - } - // LCOV_EXCL_STOP - break; + // LCOV_EXCL_STOP + case STI_UINT256: { auto const* uint256Obj(static_cast(obj)); auto const& data = uint256Obj->value(); return Bytes{data.begin(), data.end()}; } - break; + + case STI_AMOUNT: default: - break; // default to serializer + break; // Use serializer } Serializer msg; obj->add(msg); - auto const data = msg.getData(); - - return data; + return msg.getData(); } static Expected diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 34cfac416ec..0d245c526cf 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1355,6 +1355,10 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { return hfResult(results, asHex.error()); // LCOV_EXCL_LINE } + if (*asHex != 0 && *asHex != 1) + { + return hfResult(results, HostFunctionError::INVALID_PARAMS); + } return returnResult(runtime, params, results, hf->trace(*msg, *data, *asHex), index); } From fd524c4be9c63f91ef1029a06f179500ab682d68 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 18 Feb 2026 12:41:56 -0500 Subject: [PATCH 181/212] fix pre-commit --- src/test/app/Wasm_test.cpp | 11 +- src/test/app/wasm_fixtures/b58.c | 99 +++++------ src/test/app/wasm_fixtures/bad_align.c | 66 ++++--- src/test/app/wasm_fixtures/bad_alloc.c | 30 ++-- src/test/app/wasm_fixtures/fib.c | 13 +- src/test/app/wasm_fixtures/infiniteLoop.c | 11 +- src/test/app/wasm_fixtures/ledgerSqn.c | 16 +- src/test/app/wasm_fixtures/sha512Pure.c | 206 +++++++++++----------- src/xrpld/app/wasm/WasmiVM.h | 3 +- src/xrpld/app/wasm/detail/WasmiVM.cpp | 6 +- 10 files changed, 227 insertions(+), 234 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 8a7792dc515..1d8f165679e 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -535,11 +535,12 @@ struct Wasm_test : public beast::unit_test::suite [[maybe_unused]] uint256 const nft1{token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u), - token::uri("https://github.com/XRPLF/XRPL-Standards/discussions/" - "279?id=github.com/XRPLF/XRPL-Standards/discussions/" - "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" - "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" - "279&aot=github.com/XRPLF/XRPL-Standards/disc")); + token::uri( + "https://github.com/XRPLF/XRPL-Standards/discussions/" + "279?id=github.com/XRPLF/XRPL-Standards/discussions/" + "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" + "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" + "279&aot=github.com/XRPLF/XRPL-Standards/disc")); [[maybe_unused]] uint256 const nft2{token::getNextID(env, alan, 0u)}; env(token::mint(alan, 0u)); env.close(); diff --git a/src/test/app/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c index 56defdbb322..8935a9f1a5b 100644 --- a/src/test/app/wasm_fixtures/b58.c +++ b/src/test/app/wasm_fixtures/b58.c @@ -1,72 +1,69 @@ #include -static char const b58digits_ordered[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; +static char const b58digits_ordered[] = + "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; uint8_t e_data[32 * 1024]; -void* -allocate(int sz) +void *allocate(int sz) { - static int idx = 0; - if (idx >= 32) - return 0; - if (sz > 1024) - return 0; - return &e_data[idx++ << 10]; + static int idx = 0; + if (idx >= 32) + return 0; + if (sz > 1024) + return 0; + return &e_data[idx++ << 10]; } -void -deallocate(void* p) -{ -} +void deallocate(void *p) {} -extern int32_t -b58enco(char* b58, int32_t b58sz, void const* data, int32_t binsz) +extern int32_t b58enco(char *b58, int32_t b58sz, void const *data, + int32_t binsz) { - uint8_t const* bin = data; - int32_t carry; - int32_t i, j, high, zcount = 0; - int32_t size; + uint8_t const *bin = data; + int32_t carry; + int32_t i, j, high, zcount = 0; + int32_t size; - while (zcount < binsz && !bin[zcount]) - ++zcount; + while (zcount < binsz && !bin[zcount]) + ++zcount; - size = (binsz - zcount) * 138 / 100 + 1; - uint8_t* buf = allocate(size); - if (!buf) - return 0; - // memset(buf, 0, size); - for (i = 0; i < size; ++i) - buf[i] = 0; + size = (binsz - zcount) * 138 / 100 + 1; + uint8_t *buf = allocate(size); + if (!buf) + return 0; + // memset(buf, 0, size); + for (i = 0; i < size; ++i) + buf[i] = 0; - for (i = zcount, high = size - 1; i < binsz; ++i, high = j) + for (i = zcount, high = size - 1; i < binsz; ++i, high = j) + { + for (carry = bin[i], j = size - 1; (j > high) || carry; --j) { - for (carry = bin[i], j = size - 1; (j > high) || carry; --j) - { - carry += 256 * buf[j]; - buf[j] = carry % 58; - carry /= 58; - if (!j) - break; - } + carry += 256 * buf[j]; + buf[j] = carry % 58; + carry /= 58; + if (!j) + break; } + } - for (j = 0; j < size && !buf[j]; ++j) - ; + for (j = 0; j < size && !buf[j]; ++j) + ; - if (b58sz <= zcount + size - j) - return 0; + if (b58sz <= zcount + size - j) + return 0; - if (zcount) - { - // memset(b58, '1', zcount); - for (i = 0; i < zcount; ++i) - b58[i] = '1'; - } + if (zcount) + { + // memset(b58, '1', zcount); + for (i = 0; i < zcount; ++i) + b58[i] = '1'; + } - for (i = zcount; j < size; ++i, ++j) - b58[i] = b58digits_ordered[buf[j]]; - b58[i] = '\0'; + for (i = zcount; j < size; ++i, ++j) + b58[i] = b58digits_ordered[buf[j]]; + b58[i] = '\0'; - return i + 1; + return i + 1; } diff --git a/src/test/app/wasm_fixtures/bad_align.c b/src/test/app/wasm_fixtures/bad_align.c index edb045560d8..cc291c70f13 100644 --- a/src/test/app/wasm_fixtures/bad_align.c +++ b/src/test/app/wasm_fixtures/bad_align.c @@ -1,47 +1,43 @@ #include -int32_t -float_from_uint(uint8_t const*, int32_t, uint8_t*, int32_t, int32_t); -int32_t -check_keylet(uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +int32_t float_from_uint(uint8_t const *, int32_t, uint8_t *, int32_t, int32_t); +int32_t check_keylet(uint8_t const *, int32_t, uint8_t const *, int32_t, + uint8_t *, int32_t); uint8_t e_data1[32 * 1024]; uint8_t e_data2[32 * 1024]; -int32_t -test1() +int32_t test1() { - e_data1[1] = 0xFF; - e_data1[2] = 0xFF; - e_data1[3] = 0xFF; - e_data1[4] = 0xFF; - e_data1[5] = 0xFF; - e_data1[6] = 0xFF; - e_data1[7] = 0xFF; - e_data1[8] = 0xFF; - int32_t result = float_from_uint(&e_data1[1], 8, &e_data1[35], 12, 0); - return result >= 0 ? *((int32_t*)(&e_data1[36])) : result; + e_data1[1] = 0xFF; + e_data1[2] = 0xFF; + e_data1[3] = 0xFF; + e_data1[4] = 0xFF; + e_data1[5] = 0xFF; + e_data1[6] = 0xFF; + e_data1[7] = 0xFF; + e_data1[8] = 0xFF; + int32_t result = float_from_uint(&e_data1[1], 8, &e_data1[35], 12, 0); + return result >= 0 ? *((int32_t *)(&e_data1[36])) : result; } -int32_t -test2() +int32_t test2() { - // Set up misaligned uint32 (seq) at offset 1 - e_data2[1] = 0xFF; - e_data2[2] = 0xFF; - e_data2[3] = 0xFF; - e_data2[4] = 0xFF; - // Set up valid non-zero AccountID (20 bytes) at offset 10 - for (int i = 0; i < 20; i++) - e_data2[10 + i] = i + 1; - // Call check_keylet with misaligned uint32 at &e_data2[1] to hit line 72 in HostFuncWrapper.cpp - int32_t result = check_keylet(&e_data2[10], 20, &e_data2[1], 4, &e_data2[35], 32); - // Return the misaligned value directly to validate it was read correctly (-1 if all 0xFF) - return result >= 0 ? *((int32_t*)(&e_data2[36])) : result; + // Set up misaligned uint32 (seq) at offset 1 + e_data2[1] = 0xFF; + e_data2[2] = 0xFF; + e_data2[3] = 0xFF; + e_data2[4] = 0xFF; + // Set up valid non-zero AccountID (20 bytes) at offset 10 + for (int i = 0; i < 20; i++) + e_data2[10 + i] = i + 1; + // Call check_keylet with misaligned uint32 at &e_data2[1] to hit line 72 in + // HostFuncWrapper.cpp + int32_t result = + check_keylet(&e_data2[10], 20, &e_data2[1], 4, &e_data2[35], 32); + // Return the misaligned value directly to validate it was read correctly (-1 + // if all 0xFF) + return result >= 0 ? *((int32_t *)(&e_data2[36])) : result; } -int32_t -test() -{ - return test1() + test2(); -} +int32_t test() { return test1() + test2(); } diff --git a/src/test/app/wasm_fixtures/bad_alloc.c b/src/test/app/wasm_fixtures/bad_alloc.c index 9a0233e8a55..77356793657 100644 --- a/src/test/app/wasm_fixtures/bad_alloc.c +++ b/src/test/app/wasm_fixtures/bad_alloc.c @@ -2,26 +2,24 @@ char buf[1024]; -void* -allocate(int sz) +void *allocate(int sz) { - if (!sz) - return 0; + if (!sz) + return 0; - if (sz == 1) - return ((void*)(8 * 1024 * 1024)); - if (sz == 2) - return 0; - if (sz == 3) - return ((void*)(0xFFFFFFFF)); + if (sz == 1) + return ((void *)(8 * 1024 * 1024)); + if (sz == 2) + return 0; + if (sz == 3) + return ((void *)(0xFFFFFFFF)); - return &buf[sz]; + return &buf[sz]; } -int32_t -test(char* p, int32_t sz) +int32_t test(char *p, int32_t sz) { - if (!sz) - return 0; - return p[0]; + if (!sz) + return 0; + return p[0]; } diff --git a/src/test/app/wasm_fixtures/fib.c b/src/test/app/wasm_fixtures/fib.c index 4410923054f..e45cc4fe6cc 100644 --- a/src/test/app/wasm_fixtures/fib.c +++ b/src/test/app/wasm_fixtures/fib.c @@ -1,12 +1,11 @@ // typedef long long mint; typedef int mint; -mint -fib(mint n) +mint fib(mint n) { - if (!n) - return 0; - if (n <= 2) - return 1; - return fib(n - 1) + fib(n - 2); + if (!n) + return 0; + if (n <= 2) + return 1; + return fib(n - 1) + fib(n - 2); } diff --git a/src/test/app/wasm_fixtures/infiniteLoop.c b/src/test/app/wasm_fixtures/infiniteLoop.c index 037a843cac3..ba84a92ac1d 100644 --- a/src/test/app/wasm_fixtures/infiniteLoop.c +++ b/src/test/app/wasm_fixtures/infiniteLoop.c @@ -1,8 +1,7 @@ -int -loop() +int loop() { - int volatile x = 0; - while (1) - x++; - return x; + int volatile x = 0; + while (1) + x++; + return x; } diff --git a/src/test/app/wasm_fixtures/ledgerSqn.c b/src/test/app/wasm_fixtures/ledgerSqn.c index 020fafc78fa..e4d57b85936 100644 --- a/src/test/app/wasm_fixtures/ledgerSqn.c +++ b/src/test/app/wasm_fixtures/ledgerSqn.c @@ -1,16 +1,14 @@ #include -int32_t -get_ledger_sqn(uint8_t*, int32_t); +int32_t get_ledger_sqn(uint8_t *, int32_t); -int -finish() +int finish() { - uint32_t sqn; - int32_t result = get_ledger_sqn((uint8_t*)&sqn, sizeof(sqn)); + uint32_t sqn; + int32_t result = get_ledger_sqn((uint8_t *)&sqn, sizeof(sqn)); - if (result < 0) - return result; + if (result < 0) + return result; - return sqn >= 5 ? 5 : 0; + return sqn >= 5 ? 5 : 0; } diff --git a/src/test/app/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c index 2c736bb218c..347bf8827b0 100644 --- a/src/test/app/wasm_fixtures/sha512Pure.c +++ b/src/test/app/wasm_fixtures/sha512Pure.c @@ -2,22 +2,33 @@ #include static uint64_t const K512[] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, - 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, - 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, - 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, - 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, - 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, - 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, - 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, - 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, - 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, - 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, - 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, - 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, - 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, - 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; + 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, + 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, + 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, + 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, + 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, + 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, + 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, + 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, + 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, + 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, + 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, + 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, + 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, + 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, + 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, + 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, + 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, + 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, + 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, + 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, + 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, + 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, + 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, + 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, + 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, + 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, + 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; #define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) #define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) @@ -28,103 +39,94 @@ static uint64_t const K512[] = { #define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) #define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) -static inline uint64_t -B2U64(uint8_t val, uint8_t sh) +static inline uint64_t B2U64(uint8_t val, uint8_t sh) { - return ((uint64_t)val) << sh; + return ((uint64_t)val) << sh; } -void* -allocate(int sz) -{ - return malloc(sz); -} -void -deallocate(void* p) -{ - free(p); -} +void *allocate(int sz) { return malloc(sz); } +void deallocate(void *p) { free(p); } uint8_t e_data[32 * 1024]; -uint8_t* -sha512_process(uint8_t const* data, int32_t length) +uint8_t *sha512_process(uint8_t const *data, int32_t length) { - static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - - uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; - uint64_t X[16]; + static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + + uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; + uint64_t X[16]; + + uint64_t blocks = length / 128; + while (blocks--) + { + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + f = state[5]; + g = state[6]; + h = state[7]; + + unsigned i; + for (i = 0; i < 16; i++) + { + X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | B2U64(data[2], 40) | + B2U64(data[3], 32) | B2U64(data[4], 24) | B2U64(data[5], 16) | + B2U64(data[6], 8) | B2U64(data[7], 0); + data += 8; + + T1 = h; + T1 += Sigma1(e); + T1 += Ch(e, f, g); + T1 += K512[i]; + T1 += X[i]; + + T2 = Sigma0(a); + T2 += Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; + } - uint64_t blocks = length / 128; - while (blocks--) + for (i = 16; i < 80; i++) { - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - - unsigned i; - for (i = 0; i < 16; i++) - { - X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | B2U64(data[2], 40) | B2U64(data[3], 32) | - B2U64(data[4], 24) | B2U64(data[5], 16) | B2U64(data[6], 8) | B2U64(data[7], 0); - data += 8; - - T1 = h; - T1 += Sigma1(e); - T1 += Ch(e, f, g); - T1 += K512[i]; - T1 += X[i]; - - T2 = Sigma0(a); - T2 += Maj(a, b, c); - - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - for (i = 16; i < 80; i++) - { - s0 = X[(i + 1) & 0x0f]; - s0 = sigma0(s0); - s1 = X[(i + 14) & 0x0f]; - s1 = sigma1(s1); - - T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; - T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; - T2 = Sigma0(a) + Maj(a, b, c); - - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; + s0 = X[(i + 1) & 0x0f]; + s0 = sigma0(s0); + s1 = X[(i + 14) & 0x0f]; + s1 = sigma1(s1); + + T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; + T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; + T2 = Sigma0(a) + Maj(a, b, c); + + h = g; + g = f; + f = e; + e = d + T1; + d = c; + c = b; + b = a; + a = T1 + T2; } - return (uint8_t*)(state); + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + state[5] += f; + state[6] += g; + state[7] += h; + } + + return (uint8_t *)(state); } // int main () diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index d4ea0bfaa94..92743756325 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -125,7 +125,8 @@ struct InstanceWrapper std::int64_t getGas() const; - std::int64_t setGas(std::int64_t) const; + std::int64_t + setGas(std::int64_t) const; }; struct ModuleWrapper diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 6ef0315b975..bdf60ac7ec5 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -99,7 +99,8 @@ InstanceWrapper::operator=(InstanceWrapper&& o) return *this; } -InstanceWrapper::operator bool() const +InstanceWrapper:: +operator bool() const { return static_cast(instance_); } @@ -259,7 +260,8 @@ ModuleWrapper::operator=(ModuleWrapper&& o) return *this; } -ModuleWrapper::operator bool() const +ModuleWrapper:: +operator bool() const { return instanceWrap_; } From 1b4a564369e6b39defdc63004c5fba4cf73e47f6 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 18 Feb 2026 13:20:29 -0500 Subject: [PATCH 182/212] fix build issues --- src/test/app/TestHostFunctions.h | 4 ++-- src/xrpld/app/wasm/HostFuncImpl.h | 3 ++- src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp | 4 ++-- src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp | 2 +- src/xrpld/app/wasm/detail/HostFuncWrapper.cpp | 6 +++++- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 68cf42b362b..205c9cc1a03 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -1,13 +1,13 @@ #include #include -#include -#include #include #include +#include #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index d8e080a8ef9..1760be7c028 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -1,8 +1,9 @@ #pragma once -#include #include +#include + namespace xrpl { class WasmHostFunctionsImpl : public HostFunctions { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp index 57ef79e11a6..37e2796bf67 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp @@ -1,6 +1,6 @@ -#include #include +#include #include namespace xrpl { @@ -42,7 +42,7 @@ WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) Expected WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) { - auto const& table = ctx.app.getAmendmentTable(); + auto const& table = ctx.registry.getAmendmentTable(); auto const amendment = table.find(std::string(amendmentName)); return ctx.view().rules().enabled(amendment); } diff --git a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp index 7c4ee00406d..298cd1f9412 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp @@ -1,8 +1,8 @@ -#include #include #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp index 0d245c526cf..bbe6003d635 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp @@ -1,9 +1,13 @@ -#include #include #include #include +#include +#include +#include #include +#include +#include #include namespace xrpl { From 0392846a174b2c524c86cad0aaa19e6e3df90d28 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 25 Feb 2026 11:49:27 -0500 Subject: [PATCH 183/212] UT for wasm parameters (#6413) --- src/test/app/Wasm_test.cpp | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 1d8f165679e..9850a9ceefe 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -824,6 +824,8 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); std::shared_ptr hfs(new TestHostFunctions(env, 0)); + testcase("Wasm invalid return type"); + // return int64. { // (module // (memory (export "memory") 1) @@ -870,6 +872,57 @@ struct Wasm_test : public beast::unit_test::suite } } + void + testParameterType() + { + using namespace test::jtx; + Env env(*this); + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + + testcase("Wasm invalid params"); + + // (module + // (memory (export "memory") 1) + // (func $test1 (export "test1") (param i32) (result i32) + // i32.const 1000) + // (func $test2 (export "test2") (param i32 i32) (result i32) + // i32.const 1001)) + auto const wasmHex = + "0061736d01000000010c0260017f017f60027f7f017f03030200010503010001071a03066d656d6f7279020005746573743100" + "0005746573743200010a0d02050041e8070b050041e9070b"; + auto const wasm = hexToBytes(wasmHex); + + // good params, module is working properly + { + auto const re = runEscrowWasm(wasm, hfs, "test2", wasmParams(2, 10), 100'000); + BEAST_EXPECT(re && re->result == 1001 && re->cost == 37); + } + + // no params + { + auto const re = runEscrowWasm(wasm, hfs, "test1", {}, 100'000); + BEAST_EXPECT(!re); + } + + // more params + { + auto const re = runEscrowWasm(wasm, hfs, "test1", wasmParams(0, 1), 100'000); + BEAST_EXPECT(!re); + } + + // less params + { + auto const re = runEscrowWasm(wasm, hfs, "test2", wasmParams(1), 100'000); + BEAST_EXPECT(!re); + } + + // invalid type + { + auto const re = runEscrowWasm(wasm, hfs, "test1", wasmParams(std::int64_t(15)), 100'000); + BEAST_EXPECT(!re); + } + } + void testSwapBytes() { @@ -1007,6 +1060,7 @@ struct Wasm_test : public beast::unit_test::suite testReturnType(); testSwapBytes(); testManyParams(); + testParameterType(); // perfTest(); } From 1d9ec843506146ec514d07d88ef729d5d9aa3b60 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 26 Feb 2026 09:59:30 -0500 Subject: [PATCH 184/212] Test invalid opcodes (#6392) --- src/test/app/Wasm_test.cpp | 520 ++++++++++++++++++ src/test/app/wasm_fixtures/fixtures.cpp | 6 + src/test/app/wasm_fixtures/fixtures.h | 2 + .../app/wasm_fixtures/wat/opc_reserved.wat | 98 ++++ 4 files changed, 626 insertions(+) create mode 100644 src/test/app/wasm_fixtures/wat/opc_reserved.wat diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 9850a9ceefe..42ef5b35901 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -1026,6 +1026,524 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } + template + std::size_t + uleb128(IT& it, std::uint16_t val) + { + std::size_t count = 0; + do + { + std::uint8_t byte = val & 0x7f; + val >>= 7; + if (val) + byte |= 0x80; + *it++ = byte; + ++count; + } while (val != 0); + return count; + } + + void + testOpcodes() + { + using namespace test::jtx; + + unsigned const RESERVED = 64; + std::uint8_t nop = 0x01; + std::array const codeMarker = { + nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop}; + auto const opcReserved = hexToBytes(opcReservedHex); + + Env env{*this}; + auto& engine = WasmEngine::instance(); + + std::shared_ptr hfs(new TestHostFunctions(env, 0)); + auto imports = createWasmImport(*hfs); + env.close(); + + { + auto run = [&](std::vector const& code, + bool good = false, + int64_t cost = -1, + std::source_location const location = std::source_location::current()) { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + auto re = engine.run(code, "all_instructions", {}, imports, hfs, 1'000'000, env.journal); + if (BEAST_EXPECTS(re.has_value() == good, transToken(re.error()) + lineStr) && good) + BEAST_EXPECTS(re->cost == cost, std::to_string(re->cost) + lineStr); + }; + + // 1 byte instruction + auto test = [&](std::uint8_t start, + std::uint8_t finish, + bool good = false, + int64_t cost = -1, + std::source_location const location = std::source_location::current()) { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + auto code = opcReserved; + auto codeRange = std::ranges::search(code, codeMarker); + if (!BEAST_EXPECTS(!codeRange.empty(), lineStr)) + return; + + auto it = codeRange.begin(); + for (std::uint16_t i = start; i <= finish; ++i) + { + *it = i; + run(code, good, cost, location); + } + }; + + // 2 bytes instruction + auto test2 = [&](std::uint8_t major, + std::uint16_t start, + std::uint16_t finish, + bool good = false, + int64_t cost = -1, + std::source_location const location = std::source_location::current()) { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + auto code = opcReserved; + auto codeRange = std::ranges::search(code, codeMarker); + if (!BEAST_EXPECTS(!codeRange.empty(), lineStr)) + return; + + auto it = codeRange.begin(); + *it++ = major; + for (std::uint16_t i = start; i <= finish; ++i) + { + auto it2 = it; + uleb128(it2, i); + run(code, good, cost, location); + } + }; + + // multibytes instructions + auto testMB = [&](std::vector const& codeSnap, + bool good = false, + int64_t cost = -1, + std::source_location const location = std::source_location::current()) { + auto const lineStr = " (" + std::to_string(location.line()) + ")"; + auto code = opcReserved; + auto codeRange = std::ranges::search(code, codeMarker); + if (!BEAST_EXPECTS(!codeRange.empty(), lineStr)) + return; + + if (!BEAST_EXPECTS(codeSnap.size() < RESERVED, lineStr)) + return; + auto it = codeRange.begin(); + for (auto x : codeSnap) + *it++ = x; + run(code, good, cost, location); + }; + + // normal run + testcase("Wasm reserved opcodes main"); + test(nop, nop, true, 534); + + // reserved main + test(0x06, 0x0A); + test(0x12, 0x19); + test(0x25, 0x27); + test(0xC0, 0xFA); + test(0xFF, 0xFF); + + // reserved gc, string + testcase("Wasm reserved opcodes gc"); + test2(0xFB, 0x00, 0xBF); // not supported by compiler + + // reserved FC + testcase("Wasm reserved opcodes FC"); + test2(0xFC, 0x00, 0x07); // floats, disabled + test2(0xFC, 0x12, 0x1F); + + // reserved SIMD + testcase("Wasm reserved opcodes SIMD"); + test2(0xFD, 0x9A, 0x9A); + test2(0xFD, 0xA2, 0xA2); + test2(0xFD, 0xA5, 0xA6); + test2(0xFD, 0xAF, 0xB0); + test2(0xFD, 0xB2, 0xB4); + test2(0xFD, 0xB8, 0xB8); + test2(0xFD, 0xC2, 0xC2); + test2(0xFD, 0xC5, 0xC6); + test2(0xFD, 0xCF, 0xD0); + test2(0xFD, 0xD2, 0xD4); + test2(0xFD, 0xE2, 0xE2); + test2(0xFD, 0xEE, 0xEE); + test2(0xFD, 0x115, 0x12F); + + testcase("Wasm opcodes THREADS"); + test2(0xFE, 0x00, 0x4F); // not supported by compiler + + // FC mem instructions + testMB({0x41, 0x00, 0x41, 0x00, 0x41, 0x04, 0xFC, 0x08, 0x00, 0x00}); // memory.init + testMB({0xFC, 0x09, 0x00}); // data.drop + testMB({0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFC, 0x0A, 0x00, 0x00}); // memory.copy + testMB({0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFC, 0x0B, 0x00}); // memory.fill + testMB({0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFC, 0x0C, 0x00, 0x00}); // table.init + testMB({0xFC, 0x0D, 0x00}); // elem.drop + testMB({0x41, 0x00, 0x41, 0x00, 0x41, 0x00, 0xFC, 0x0E, 0x00, 0x00}); // table.copy + testMB({0xD2, 0x00, 0x41, 0x00, 0xFC, 0x0F, 0x00, 0x1A}); // table.grow + testMB({0x1A, 0xFC, 0x10, 0x00, 0x1A}); // table.size + testMB({0x41, 0x00, 0xD2, 0x00, 0x41, 0x00, 0xFC, 0x11, 0x00}); // table.fill + + testcase("Wasm opcodes SIMD"); + // clang-format off + + // generated by auggie + // SIMD instructions + testMB({0x41, 0x00, 0xFD, 0x00, 0x04, 0x00, 0x1A}); // v128.load + testMB({0x41, 0x00, 0xFD, 0x01, 0x03, 0x00, 0x1A}); // v128.load8x8_s + testMB({0x41, 0x00, 0xFD, 0x02, 0x03, 0x00, 0x1A}); // v128.load8x8_u + testMB({0x41, 0x00, 0xFD, 0x03, 0x03, 0x00, 0x1A}); // v128.load16x4_s + testMB({0x41, 0x00, 0xFD, 0x04, 0x03, 0x00, 0x1A}); // v128.load16x4_u + testMB({0x41, 0x00, 0xFD, 0x05, 0x03, 0x00, 0x1A}); // v128.load32x2_s + testMB({0x41, 0x00, 0xFD, 0x06, 0x03, 0x00, 0x1A}); // v128.load32x2_u + testMB({0x41, 0x00, 0xFD, 0x07, 0x00, 0x00, 0x1A}); // v128.load8_splat + testMB({0x41, 0x00, 0xFD, 0x08, 0x01, 0x00, 0x1A}); // v128.load16_splat + testMB({0x41, 0x00, 0xFD, 0x09, 0x02, 0x00, 0x1A}); // v128.load32_splat + testMB({0x41, 0x00, 0xFD, 0x0A, 0x03, 0x00, 0x1A}); // v128.load64_splat + testMB({0x41, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0B, 0x04, 0x00}); // v128.store + testMB({0xFD, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1A}); // v128.const + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0D, 0x00, 0x01, 0x02, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x1A}); // i8x16.shuffle + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0E, 0x1A}); // i8x16.swizzle + testMB({0x41, 0x2A, 0xFD, 0x0F, 0x1A}); // i8x16.splat + testMB({0x41, 0x2A, 0xFD, 0x10, 0x1A}); // i16x8.splat + testMB({0x41, 0x2A, 0xFD, 0x11, 0x1A}); // i32x4.splat + testMB({0x42, 0x2A, 0xFD, 0x12, 0x1A}); // i64x2.splat + + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x15, 0x00, 0x1A}); // i8x16.extract_lane_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x16, 0x00, 0x1A}); // i8x16.extract_lane_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x2A, 0xFD, 0x17, 0x00, 0x1A}); // i8x16.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x18, 0x00, 0x1A}); // i16x8.extract_lane_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x19, 0x00, 0x1A}); // i16x8.extract_lane_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x2A, 0xFD, 0x1A, 0x00, 0x1A}); // i16x8.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1B, 0x00, 0x1A}); // i32x4.extract_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x2A, 0xFD, 0x1C, 0x00, 0x1A}); // i32x4.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1D, 0x00, 0x1A}); // i64x2.extract_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x2A, 0xFD, 0x1E, 0x00, 0x1A}); // i64x2.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1F, 0x00, 0x1A}); // f32x4.extract_lane + testMB( + {0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x80, 0x3F, 0xFD, 0x20, 0x00, 0x1A}); // f32x4.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x21, 0x00, 0x1A}); // f64x2.extract_lane + testMB( + {0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0xFD, 0x22, 0x00, 0x1A}); // f64x2.replace_lane + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x23, 0x1A}); // i8x16.eq + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x24, 0x1A}); // i8x16.ne + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x25, 0x1A}); // i8x16.lt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x26, 0x1A}); // i8x16.lt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x27, 0x1A}); // i8x16.gt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x28, 0x1A}); // i8x16.gt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x29, 0x1A}); // i8x16.le_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2A, 0x1A}); // i8x16.le_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2B, 0x1A}); // i8x16.ge_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2C, 0x1A}); // i8x16.ge_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2D, 0x1A}); // i16x8.eq + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2E, 0x1A}); // i16x8.ne + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x2F, 0x1A}); // i16x8.lt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x30, 0x1A}); // i16x8.lt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x31, 0x1A}); // i16x8.gt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x32, 0x1A}); // i16x8.gt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x33, 0x1A}); // i16x8.le_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x34, 0x1A}); // i16x8.le_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x35, 0x1A}); // i16x8.ge_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x36, 0x1A}); // i16x8.ge_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x37, 0x1A}); // i32x4.eq + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x38, 0x1A}); // i32x4.ne + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x39, 0x1A}); // i32x4.lt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3A, 0x1A}); // i32x4.lt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3B, 0x1A}); // i32x4.gt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3C, 0x1A}); // i32x4.gt_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3D, 0x1A}); // i32x4.le_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3E, 0x1A}); // i32x4.le_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x3F, 0x1A}); // i32x4.ge_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x40, 0x1A}); // i32x4.ge_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x4D, 0x1A}); // v128.not + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x4E, 0x1A}); // v128.and + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x4F, 0x1A}); // v128.andnot + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x50, 0x1A}); // v128.or + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x51, 0x1A}); // v128.xor + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x52, 0x1A}); // v128.bitselect + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x53, 0x1A}); // v128.any_true + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x60, 0x1A}); // i8x16.abs + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x61, 0x1A}); // i8x16.neg + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x62, 0x1A}); // i8x16.popcnt + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x63, 0x1A}); // i8x16.all_true + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x64, 0x1A}); // i8x16.bitmask + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x6B, 0x1A}); // i8x16.shl + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x6C, 0x1A}); // i8x16.shr_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x6D, 0x1A}); // i8x16.shr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x6E, 0x1A}); // i8x16.add + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x6F, 0x1A}); // i8x16.add_sat_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x70, 0x1A}); // i8x16.add_sat_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x71, 0x1A}); // i8x16.sub + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x72, 0x1A}); // i8x16.sub_sat_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x73, 0x1A}); // i8x16.sub_sat_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x76, 0x1A}); // i8x16.min_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x77, 0x1A}); // i8x16.min_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x78, 0x1A}); // i8x16.max_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x79, 0x1A}); // i8x16.max_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x7B, 0x1A}); // i8x16.avgr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x80, 0x01, 0x1A}); // i16x8.abs + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x81, 0x01, 0x1A}); // i16x8.neg + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x83, 0x01, 0x1A}); // i16x8.all_true + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x84, 0x01, 0x1A}); // i16x8.bitmask + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x8B, 0x01, 0x1A}); // i16x8.shl + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x8C, 0x01, 0x1A}); // i16x8.shr_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0x8D, 0x01, 0x1A}); // i16x8.shr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x8E, 0x01, 0x1A}); // i16x8.add + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x8F, 0x01, 0x1A}); // i16x8.add_sat_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x90, 0x01, 0x1A}); // i16x8.add_sat_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x91, 0x01, 0x1A}); // i16x8.sub + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x92, 0x01, 0x1A}); // i16x8.sub_sat_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x93, 0x01, 0x1A}); // i16x8.sub_sat_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x95, 0x01, 0x1A}); // i16x8.mul + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x96, 0x01, 0x1A}); // i16x8.min_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x97, 0x01, 0x1A}); // i16x8.min_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x98, 0x01, 0x1A}); // i16x8.max_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x99, 0x01, 0x1A}); // i16x8.max_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x9B, 0x01, 0x1A}); // i16x8.avgr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xA0, 0x01, 0x1A}); // i32x4.abs + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xA1, 0x01, 0x1A}); // i32x4.neg + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xA3, 0x01, 0x1A}); // i32x4.all_true + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xA4, 0x01, 0x1A}); // i32x4.bitmask + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xAB, 0x01, 0x1A}); // i32x4.shl + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xAC, 0x01, 0x1A}); // i32x4.shr_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xAD, 0x01, 0x1A}); // i32x4.shr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xAE, 0x01, 0x1A}); // i32x4.add + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB1, 0x01, 0x1A}); // i32x4.sub + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB5, 0x01, 0x1A}); // i32x4.mul + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB6, 0x01, 0x1A}); // i32x4.min_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB7, 0x01, 0x1A}); // i32x4.min_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB8, 0x01, 0x1A}); // i32x4.max_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xB9, 0x01, 0x1A}); // i32x4.max_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xBA, 0x01, 0x1A}); // i32x4.dot_i16x8_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xC0, 0x01, 0x1A}); // i64x2.abs + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xC1, 0x01, 0x1A}); // i64x2.neg + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xC3, 0x01, 0x1A}); // i64x2.all_true + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xC4, 0x01, 0x1A}); // i64x2.bitmask + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xCB, 0x01, 0x1A}); // i64x2.shl + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xCC, 0x01, 0x1A}); // i64x2.shr_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x01, 0xFD, 0xCD, 0x01, 0x1A}); // i64x2.shr_u + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xCE, 0x01, 0x1A}); // i64x2.add + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD1, 0x01, 0x1A}); // i64x2.sub + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD5, 0x01, 0x1A}); // i64x2.mul + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD6, 0x01, 0x1A}); // i64x2.eq + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD7, 0x01, 0x1A}); // i64x2.ne + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD8, 0x01, 0x1A}); // i64x2.lt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xD9, 0x01, 0x1A}); // i64x2.gt_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xDA, 0x01, 0x1A}); // i64x2.le_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xDB, 0x01, 0x1A}); // i64x2.ge_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xF8, 0x01, 0x1A}); // i32x4.trunc_sat_f32x4_s + testMB({0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xF9, 0x01, 0x1A}); // i32x4.trunc_sat_f32x4_u + + // clang-format on + } + } + void run() override { @@ -1062,6 +1580,8 @@ struct Wasm_test : public beast::unit_test::suite testManyParams(); testParameterType(); + testOpcodes(); + // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 2767becda0a..77214824953 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -5105,3 +5105,9 @@ extern std::string const functions5kHex = "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b"; + +extern std::string const opcReservedHex = + "0061736d010000000105016000017f03030200000404017000010503010001060b027f0141000b7e0142000b07140110616c6c5f696e737472" + "756374696f6e7300010907010041000b01000a53020400412a0b4c02017f017e01010101010101010101010101010101010101010101010101" + "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101410b0b0b0a010041000b04746573" + "74"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index b453446a4cd..5c71698d67b 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -90,3 +90,5 @@ extern std::string const thousandParamsHex; extern std::string const thousand1ParamsHex; extern std::string const locals10kHex; extern std::string const functions5kHex; + +extern std::string const opcReservedHex; diff --git a/src/test/app/wasm_fixtures/wat/opc_reserved.wat b/src/test/app/wasm_fixtures/wat/opc_reserved.wat new file mode 100644 index 00000000000..0bc61b52c3d --- /dev/null +++ b/src/test/app/wasm_fixtures/wat/opc_reserved.wat @@ -0,0 +1,98 @@ +(module + + ;; Type for call_indirect + (type (func (result i32))) + + ;; Memory and table declarations + (memory 1) + (table 1 funcref) + (data (i32.const 0) "test") + (elem (i32.const 0) $test_func) + + ;; Global declarations + (global $g0 (mut i32) (i32.const 0)) + (global $g1 (mut i64) (i64.const 0)) + + ;; Test function for call/call_indirect + (func $test_func (result i32) + i32.const 42 + ) + + + ;; Main function with all instructions in hex order + (func $all_instructions (export "all_instructions") (result i32) + (local $l0 i32) + (local $l1 i64) + + ;; 0x01: nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + nop + i32.const 11 + ) +) From 953b9a35005aaa6321c4176064d51e281ee119ee Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:30:46 -0500 Subject: [PATCH 185/212] Disable reusing wasm module (#6364) * Remove ability to re-use wasm module * Check that HFS object is always new * Fix clang format * Remove perf tests * temp build fix * Fix merge --- src/test/app/TestHostFunctions.h | 832 ++---------------- src/test/app/Wasm_test.cpp | 338 ++----- src/test/app/wasm_fixtures/b58.c | 69 -- src/test/app/wasm_fixtures/bad_alloc.c | 25 - src/test/app/wasm_fixtures/fixtures.cpp | 146 --- src/test/app/wasm_fixtures/fixtures.h | 19 +- src/test/app/wasm_fixtures/sha512Pure.c | 135 --- src/xrpld/app/wasm/HostFunc.h | 140 ++- src/xrpld/app/wasm/HostFuncImpl.h | 163 ++-- src/xrpld/app/wasm/ParamsHelper.h | 46 - src/xrpld/app/wasm/WasmVM.h | 16 +- src/xrpld/app/wasm/WasmiVM.h | 47 +- src/xrpld/app/wasm/detail/HostFuncImpl.cpp | 4 +- .../app/wasm/detail/HostFuncImplFloat.cpp | 22 +- .../app/wasm/detail/HostFuncImplGetter.cpp | 46 +- .../app/wasm/detail/HostFuncImplKeylet.cpp | 37 +- .../wasm/detail/HostFuncImplLedgerHeader.cpp | 26 +- src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp | 14 +- .../app/wasm/detail/HostFuncImplTrace.cpp | 10 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 36 +- src/xrpld/app/wasm/detail/WasmiVM.cpp | 126 +-- 21 files changed, 442 insertions(+), 1855 deletions(-) delete mode 100644 src/test/app/wasm_fixtures/b58.c delete mode 100644 src/test/app/wasm_fixtures/bad_alloc.c delete mode 100644 src/test/app/wasm_fixtures/sha512Pure.c diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 205c9cc1a03..6de86988ccd 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -36,7 +36,7 @@ struct TestLedgerDataProvider : public HostFunctions } Expected - getLedgerSqn() override + getLedgerSqn() const override { return env_.current()->seq(); } @@ -71,37 +71,37 @@ struct TestHostFunctions : public HostFunctions } Expected - getLedgerSqn() override + getLedgerSqn() const override { return 12345; } Expected - getParentLedgerTime() override + getParentLedgerTime() const override { return 67890; } Expected - getParentLedgerHash() override + getParentLedgerHash() const override { return env_.current()->header().parentHash; } Expected - getBaseFee() override + getBaseFee() const override { return 10; } Expected - isAmendmentEnabled(uint256 const& amendmentId) override + isAmendmentEnabled(uint256 const& amendmentId) const override { return 1; } Expected - isAmendmentEnabled(std::string_view const& amendmentName) override + isAmendmentEnabled(std::string_view const& amendmentName) const override { return 1; } @@ -113,7 +113,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getTxField(SField const& fname) override + getTxField(SField const& fname) const override { if (fname == sfAccount) return Bytes(accountID_.begin(), accountID_.end()); @@ -137,7 +137,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getCurrentLedgerObjField(SField const& fname) override + getCurrentLedgerObjField(SField const& fname) const override { auto const& sn = fname.getName(); if (sn == "Destination" || sn == "Account") @@ -155,7 +155,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override + getLedgerObjField(int32_t cacheIdx, SField const& fname) const override { if (fname == sfBalance) { @@ -171,7 +171,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getTxNestedField(Slice const& locator) override + getTxNestedField(Slice const& locator) const override { if (locator.size() == 4) { @@ -189,7 +189,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getCurrentLedgerObjNestedField(Slice const& locator) override + getCurrentLedgerObjNestedField(Slice const& locator) const override { if (locator.size() == 4) { @@ -207,7 +207,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) const override { if (locator.size() == 4) { @@ -225,37 +225,37 @@ struct TestHostFunctions : public HostFunctions } Expected - getTxArrayLen(SField const& fname) override + getTxArrayLen(SField const& fname) const override { return 32; } Expected - getCurrentLedgerObjArrayLen(SField const& fname) override + getCurrentLedgerObjArrayLen(SField const& fname) const override { return 32; } Expected - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) const override { return 32; } Expected - getTxNestedArrayLen(Slice const& locator) override + getTxNestedArrayLen(Slice const& locator) const override { return 32; } Expected - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override + getCurrentLedgerObjNestedArrayLen(Slice const& locator) const override { return 32; } Expected - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) const override { return 32; } @@ -267,19 +267,19 @@ struct TestHostFunctions : public HostFunctions } Expected - checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) const override { return 1; } Expected - computeSha512HalfHash(Slice const& data) override + computeSha512HalfHash(Slice const& data) const override { return env_.current()->header().parentHash; } Expected - accountKeylet(AccountID const& account) override + accountKeylet(AccountID const& account) const override { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -288,7 +288,7 @@ struct TestHostFunctions : public HostFunctions } Expected - ammKeylet(Asset const& issue1, Asset const& issue2) override + ammKeylet(Asset const& issue1, Asset const& issue2) const override { if (issue1 == issue2) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -299,7 +299,7 @@ struct TestHostFunctions : public HostFunctions } Expected - checkKeylet(AccountID const& account, std::uint32_t seq) override + checkKeylet(AccountID const& account, std::uint32_t seq) const override { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -308,7 +308,7 @@ struct TestHostFunctions : public HostFunctions } Expected - credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) const override { if (!subject || !issuer || credentialType.empty() || credentialType.size() > maxCredentialTypeLength) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -317,7 +317,7 @@ struct TestHostFunctions : public HostFunctions } Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override + escrowKeylet(AccountID const& account, std::uint32_t seq) const override { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -326,7 +326,7 @@ struct TestHostFunctions : public HostFunctions } Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override + oracleKeylet(AccountID const& account, std::uint32_t documentId) const override { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -335,7 +335,7 @@ struct TestHostFunctions : public HostFunctions } Expected - getNFT(AccountID const& account, uint256 const& nftId) override + getNFT(AccountID const& account, uint256 const& nftId) const override { if (!account || !nftId) { @@ -347,38 +347,38 @@ struct TestHostFunctions : public HostFunctions } Expected - getNFTIssuer(uint256 const& nftId) override + getNFTIssuer(uint256 const& nftId) const override { return Bytes(accountID_.begin(), accountID_.end()); } Expected - getNFTTaxon(uint256 const& nftId) override + getNFTTaxon(uint256 const& nftId) const override { return 4; } Expected - getNFTFlags(uint256 const& nftId) override + getNFTFlags(uint256 const& nftId) const override { return 8; } Expected - getNFTTransferFee(uint256 const& nftId) override + getNFTTransferFee(uint256 const& nftId) const override { return 10; } Expected - getNFTSerial(uint256 const& nftId) override + getNFTSerial(uint256 const& nftId) const override { return 4; } template void - log(std::string_view const& msg, F&& dataFn) + log(std::string_view const& msg, F&& dataFn) const { #ifdef DEBUG_OUTPUT auto& j = std::cerr; @@ -395,7 +395,7 @@ struct TestHostFunctions : public HostFunctions } Expected - trace(std::string_view const& msg, Slice const& data, bool asHex) override + trace(std::string_view const& msg, Slice const& data, bool asHex) const override { if (!asHex) { @@ -415,95 +415,95 @@ struct TestHostFunctions : public HostFunctions } Expected - traceNum(std::string_view const& msg, int64_t data) override + traceNum(std::string_view const& msg, int64_t data) const override { log(msg, [data] { return data; }); return 0; } Expected - traceAccount(std::string_view const& msg, AccountID const& account) override + traceAccount(std::string_view const& msg, AccountID const& account) const override { log(msg, [&account] { return toBase58(account); }); return 0; } Expected - traceFloat(std::string_view const& msg, Slice const& data) override + traceFloat(std::string_view const& msg, Slice const& data) const override { log(msg, [&data] { return wasm_float::floatToString(data); }); return 0; } Expected - traceAmount(std::string_view const& msg, STAmount const& amount) override + traceAmount(std::string_view const& msg, STAmount const& amount) const override { log(msg, [&amount] { return amount.getFullText(); }); return 0; } Expected - floatFromInt(int64_t x, int32_t mode) override + floatFromInt(int64_t x, int32_t mode) const override { return wasm_float::floatFromIntImpl(x, mode); } Expected - floatFromUint(uint64_t x, int32_t mode) override + floatFromUint(uint64_t x, int32_t mode) const override { return wasm_float::floatFromUintImpl(x, mode); } Expected - floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) const override { return wasm_float::floatSetImpl(mantissa, exponent, mode); } Expected - floatCompare(Slice const& x, Slice const& y) override + floatCompare(Slice const& x, Slice const& y) const override { return wasm_float::floatCompareImpl(x, y); } Expected - floatAdd(Slice const& x, Slice const& y, int32_t mode) override + floatAdd(Slice const& x, Slice const& y, int32_t mode) const override { return wasm_float::floatAddImpl(x, y, mode); } Expected - floatSubtract(Slice const& x, Slice const& y, int32_t mode) override + floatSubtract(Slice const& x, Slice const& y, int32_t mode) const override { return wasm_float::floatSubtractImpl(x, y, mode); } Expected - floatMultiply(Slice const& x, Slice const& y, int32_t mode) override + floatMultiply(Slice const& x, Slice const& y, int32_t mode) const override { return wasm_float::floatMultiplyImpl(x, y, mode); } Expected - floatDivide(Slice const& x, Slice const& y, int32_t mode) override + floatDivide(Slice const& x, Slice const& y, int32_t mode) const override { return wasm_float::floatDivideImpl(x, y, mode); } Expected - floatRoot(Slice const& x, int32_t n, int32_t mode) override + floatRoot(Slice const& x, int32_t n, int32_t mode) const override { return wasm_float::floatRootImpl(x, n, mode); } Expected - floatPower(Slice const& x, int32_t n, int32_t mode) override + floatPower(Slice const& x, int32_t n, int32_t mode) const override { return wasm_float::floatPowerImpl(x, n, mode); } Expected - floatLog(Slice const& x, int32_t mode) override + floatLog(Slice const& x, int32_t mode) const override { return wasm_float::floatLogImpl(x, mode); } @@ -528,737 +528,5 @@ struct TestHostFunctionsSink : public TestHostFunctions } }; -struct PerfHostFunctions : public TestHostFunctions -{ - Keylet leKey; - std::shared_ptr currentLedgerObj = nullptr; - bool isLedgerObjCached = false; - - static int constexpr MAX_CACHE = 256; - std::array, MAX_CACHE> cache; - // std::optional data_; // deferred data update, not used in - // performance - std::shared_ptr tx_; - - void const* rt_ = nullptr; - - PerfHostFunctions(test::jtx::Env& env, Keylet const& k, std::shared_ptr&& tx) - : TestHostFunctions(env), leKey(k), tx_(std::move(tx)) - { - } - - Expected - getLedgerSqn() override - { - return env_.current()->seq(); - } - - Expected - getParentLedgerTime() override - { - return env_.current()->parentCloseTime().time_since_epoch().count(); - } - - Expected - getParentLedgerHash() override - { - return env_.current()->header().parentHash; - } - - Expected - getBaseFee() override - { - return env_.current()->fees().base.drops(); - } - - Expected - isAmendmentEnabled(uint256 const& amendmentId) override - { - return env_.current()->rules().enabled(amendmentId); - } - - Expected - isAmendmentEnabled(std::string_view const& amendmentName) override - { - auto const& table = env_.app().getAmendmentTable(); - auto const amendment = table.find(std::string(amendmentName)); - return env_.current()->rules().enabled(amendment); - } - - Expected, HostFunctionError> - getCurrentLedgerObj() - { - if (!isLedgerObjCached) - { - isLedgerObjCached = true; - currentLedgerObj = env_.le(leKey); - } - if (currentLedgerObj) - return currentLedgerObj; - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - } - - Expected, HostFunctionError> - peekCurrentLedgerObj(int32_t cacheIdx) - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cache[cacheIdx]) - { // return Unexpected(HostFunctionError::INVALID_SLOT); - auto const r = getCurrentLedgerObj(); - if (!r) - return Unexpected(r.error()); - cache[cacheIdx] = *r; - } - - return cache[cacheIdx]; - } - - Expected - normalizeCacheIndex(int32_t cacheIdx) - { - --cacheIdx; - if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::EMPTY_SLOT); - return cacheIdx; - } - - virtual Expected - cacheLedgerObj(uint256 const&, int32_t cacheIdx) override - { - // auto const& keylet = keylet::unchecked(objId); - - static int32_t intIdx = 0; - - if (cacheIdx < 0 || cacheIdx > MAX_CACHE) - return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - - if (!cacheIdx) - { - for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) - if (!cache[cacheIdx]) - break; - if (cacheIdx >= MAX_CACHE) - cacheIdx = intIdx++ % MAX_CACHE; - } - else - --cacheIdx; - - if (cacheIdx >= MAX_CACHE) - return Unexpected(HostFunctionError::SLOTS_FULL); - - cache[cacheIdx] = env_.le(leKey); - if (!cache[cacheIdx]) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - return cacheIdx + 1; - } - - static Expected - getAnyFieldData(STBase const* obj) - { - // auto const& fname = obj.getFName(); - if (!obj) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - auto const stype = obj->getSType(); - switch (stype) - { - // LCOV_EXCL_START - case STI_UNKNOWN: - case STI_NOTPRESENT: - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - break; - // LCOV_EXCL_STOP - case STI_OBJECT: - case STI_ARRAY: - return Unexpected(HostFunctionError::NOT_LEAF_FIELD); - break; - case STI_ACCOUNT: { - auto const* account(static_cast(obj)); - auto const& data = account->value(); - return Bytes{data.begin(), data.end()}; - } - break; - case STI_AMOUNT: - // will be processed by serializer - break; - case STI_ISSUE: { - auto const* issue(static_cast(obj)); - Asset const& asset(issue->value()); - // XRP and IOU will be processed by serializer - if (asset.holds()) - { - // MPT - auto const& mptIssue = asset.get(); - auto const& mptID = mptIssue.getMptID(); - return Bytes{mptID.cbegin(), mptID.cend()}; - } - } - break; - case STI_VL: { - auto const* vl(static_cast(obj)); - auto const& data = vl->value(); - return Bytes{data.begin(), data.end()}; - } - break; - case STI_UINT16: { - auto const& num(static_cast const*>(obj)); - std::uint16_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; - } - case STI_UINT32: { - auto const* num(static_cast const*>(obj)); - std::uint32_t const data = num->value(); - auto const* b = reinterpret_cast(&data); - auto const* e = reinterpret_cast(&data + 1); - return Bytes{b, e}; - } - break; - default: - break; // default to serializer - } - - Serializer msg; - obj->add(msg); - auto const data = msg.getData(); - - return data; - } - - Expected - getTxField(SField const& fname) override - { - return getAnyFieldData(tx_->peekAtPField(fname)); - } - - Expected - getCurrentLedgerObjField(SField const& fname) override - { - auto const sle = getCurrentLedgerObj(); - if (!sle) - return Unexpected(sle.error()); - return getAnyFieldData((*sle)->peekAtPField(fname)); - } - - Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override - { - auto const sle = peekCurrentLedgerObj(cacheIdx); - if (!sle) - return Unexpected(sle.error()); - return getAnyFieldData((*sle)->peekAtPField(fname)); - } - - static inline bool - noField(STBase const* field) - { - return !field || (STI_NOTPRESENT == field->getSType()) || (STI_UNKNOWN == field->getSType()); - } - - static Expected - locateField(STObject const& obj, Slice const& locator) - { - if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - - int32_t const* locPtr = reinterpret_cast(locator.data()); - int32_t const locSize = locator.size() / 4; - STBase const* field = nullptr; - auto const& knownSFields = SField::getKnownCodeToField(); - - { - int32_t const sfieldCode = locPtr[0]; - auto const it = knownSFields.find(sfieldCode); - if (it == knownSFields.end()) - return Unexpected(HostFunctionError::INVALID_FIELD); - - auto const& fname(*it->second); - field = obj.peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - } - - for (int i = 1; i < locSize; ++i) - { - int32_t const sfieldCode = locPtr[i]; - - if (STI_ARRAY == field->getSType()) - { - auto const* arr = static_cast(field); - if (sfieldCode >= arr->size()) - return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); - field = &(arr->operator[](sfieldCode)); - } - else if (STI_OBJECT == field->getSType()) - { - auto const* o = static_cast(field); - - auto const it = knownSFields.find(sfieldCode); - if (it == knownSFields.end()) - return Unexpected(HostFunctionError::INVALID_FIELD); - - auto const& fname(*it->second); - field = o->peekAtPField(fname); - } - else // simple field must be the last one - { - return Unexpected(HostFunctionError::LOCATOR_MALFORMED); - } - - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - } - - return field; - } - - Expected - getTxNestedField(Slice const& locator) override - { - // std::cout << tx_->getJson(JsonOptions::none).toStyledString() << - // std::endl; - auto const r = locateField(*tx_, locator); - if (!r) - return Unexpected(r.error()); - return getAnyFieldData(*r); - } - - Expected - getCurrentLedgerObjNestedField(Slice const& locator) override - { - auto const sle = getCurrentLedgerObj(); - if (!sle) - return Unexpected(sle.error()); - - auto const r = locateField(**sle, locator); - if (!r) - return Unexpected(r.error()); - - return getAnyFieldData(*r); - } - - Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override - { - auto const sle = peekCurrentLedgerObj(cacheIdx); - if (!sle) - return Unexpected(sle.error()); - - auto const r = locateField(**sle, locator); - if (!r) - return Unexpected(r.error()); - - return getAnyFieldData(*r); - } - - Expected - getTxArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const* field = tx_->peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - getCurrentLedgerObjArrayLen(SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const sle = getCurrentLedgerObj(); - if (!sle) - return Unexpected(sle.error()); - - auto const* field = (*sle)->peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override - { - if (fname.fieldType != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - - auto const sle = peekCurrentLedgerObj(cacheIdx); - if (!sle) - return Unexpected(sle.error()); - - auto const* field = (*sle)->peekAtPField(fname); - if (noField(field)) - return Unexpected(HostFunctionError::FIELD_NOT_FOUND); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - getTxNestedArrayLen(Slice const& locator) override - { - auto const r = locateField(*tx_, locator); - if (!r) - return Unexpected(r.error()); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override - { - auto const sle = getCurrentLedgerObj(); - if (!sle) - return Unexpected(sle.error()); - - auto const r = locateField(**sle, locator); - if (!r) - return Unexpected(r.error()); - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override - { - auto const sle = peekCurrentLedgerObj(cacheIdx); - if (!sle) - return Unexpected(sle.error()); - - auto const r = locateField(**sle, locator); - if (!r) - return Unexpected(r.error()); - - auto const* field = r.value(); - - if (field->getSType() != STI_ARRAY) - return Unexpected(HostFunctionError::NO_ARRAY); - int32_t const sz = static_cast(field)->size(); - - return sz; - } - - Expected - updateData(Slice const& data) override - { - if (data.size() > maxWasmDataLength) - return Unexpected(HostFunctionError::DATA_FIELD_TOO_LARGE); - - xrpl::detail::ApplyViewBase v(env_.app().openLedger().current().get(), tapNONE); - - auto sle = v.peek(leKey); - if (!sle) - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - - sle->setFieldVL(sfData, data); - v.update(sle); - - return data.size(); - } - - Expected - checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override - { - if (!publicKeyType(pubkey)) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - PublicKey const pk(pubkey); - return verify(pk, message, signature); - } - - Expected - computeSha512HalfHash(Slice const& data) override - { - auto const hash = sha512Half(data); - return hash; - } - - Expected - accountKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::account(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - ammKeylet(Asset const& issue1, Asset const& issue2) override - { - if (issue1 == issue2) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - // note: this should be removed with the MPT DEX amendment - if (issue1.holds() || issue2.holds()) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::amm(issue1, issue2); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - checkKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::check(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override - { - if (!subject || !issuer) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - if (credentialType.empty() || credentialType.size() > maxCredentialTypeLength) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::credential(subject, issuer, credentialType); - - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - didKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::did(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - delegateKeylet(AccountID const& account, AccountID const& authorize) override - { - if (!account || !authorize) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == authorize) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::delegate(account, authorize); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - depositPreauthKeylet(AccountID const& account, AccountID const& authorize) override - { - if (!account || !authorize) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == authorize) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::depositPreauth(account, authorize); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::escrow(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) override - { - if (!account1 || !account2) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account1 == account2) - return Unexpected(HostFunctionError::INVALID_PARAMS); - if (currency.isZero()) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - auto const keylet = keylet::line(account1, account2, currency); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override - { - if (!issuer) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - auto const keylet = keylet::mptIssuance(seq, issuer); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - mptokenKeylet(MPTID const& mptid, AccountID const& holder) override - { - if (!mptid) - return Unexpected(HostFunctionError::INVALID_PARAMS); - if (!holder) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - - auto const keylet = keylet::mptoken(mptid, holder); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - nftOfferKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::nftoffer(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - offerKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::offer(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - oracleKeylet(AccountID const& account, std::uint32_t documentId) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::oracle(account, documentId); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) override - { - if (!account || !destination) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - if (account == destination) - return Unexpected(HostFunctionError::INVALID_PARAMS); - auto const keylet = keylet::payChan(account, destination, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::permissionedDomain(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - signersKeylet(AccountID const& account) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::signers(account); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - ticketKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::ticket(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - vaultKeylet(AccountID const& account, std::uint32_t seq) override - { - if (!account) - return Unexpected(HostFunctionError::INVALID_ACCOUNT); - auto const keylet = keylet::vault(account, seq); - return Bytes{keylet.key.begin(), keylet.key.end()}; - } - - Expected - getNFT(AccountID const& account, uint256 const& nftId) override - { - if (!account || !nftId) - { - getJournal().trace() << "WASM getNFT: Invalid account or NFT ID"; - return Unexpected(HostFunctionError::INVALID_PARAMS); - } - - auto obj = nft::findToken(*env_.current(), account, nftId); - if (!obj) - { - getJournal().trace() << "WASM getNFT: NFT not found"; - return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); - } - - auto ouri = obj->at(~sfURI); - if (!ouri) - return Bytes(); - - Slice const s = ouri->value(); - return Bytes(s.begin(), s.end()); - } - - Expected - getNFTIssuer(uint256 const& nftId) override - { - auto const issuer = nft::getIssuer(nftId); - if (!issuer) - return Unexpected(HostFunctionError::INVALID_PARAMS); - - return Bytes{issuer.begin(), issuer.end()}; - } - - Expected - getNFTTaxon(uint256 const& nftId) override - { - return nft::toUInt32(nft::getTaxon(nftId)); - } - - Expected - getNFTFlags(uint256 const& nftId) override - { - return nft::getFlags(nftId); - } - - Expected - getNFTTransferFee(uint256 const& nftId) override - { - return nft::getTransferFee(nftId); - } - - Expected - getNFTSerial(uint256 const& nftId) override - { - return nft::getSerial(nftId); - } -}; - } // namespace test } // namespace xrpl diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 42ef5b35901..16969501136 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -37,7 +37,8 @@ runFinishFunction(std::string const& code) { auto& engine = WasmEngine::instance(); auto const wasm = hexToBytes(code); - auto const re = engine.run(wasm, "finish"); + HostFunctions hfs; + auto const re = engine.run(wasm, hfs, "finish"); if (re.has_value()) { return std::optional(re->result); @@ -107,10 +108,11 @@ struct Wasm_test : public beast::unit_test::suite // clang-format on auto& vm = WasmEngine::instance(); - std::shared_ptr imports(std::make_shared()); - WasmImpFunc(*imports, "func-add", reinterpret_cast(&Add)); + HostFunctions hfs; + ImportVec imports; + WasmImpFunc(imports, "func-add", reinterpret_cast(&Add), &hfs); - auto re = vm.run(wasm, "addTwo", wasmParams(1234, 5678), imports); + auto re = vm.run(wasm, hfs, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); @@ -125,7 +127,7 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - std::shared_ptr hfs(new HostFunctions(env.journal)); + HostFunctions hfs(env.journal); { auto wasm = hexToBytes("00000000"); @@ -175,22 +177,22 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - auto imports = std::make_shared(); - WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get(), 33); + TestLedgerDataProvider hfs(env); + ImportVec imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hfs, 33); auto& engine = WasmEngine::instance(); - auto re = engine.run(ledgerSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(ledgerSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); checkResult(re, 0, 440); env.close(); env.close(); - // empty module - run the same instance - re = engine.run({}, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); - - checkResult(re, 5, 488); + // empty module, throwing exception + re = engine.run({}, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + BEAST_EXPECT(!re); + env.close(); } void @@ -200,43 +202,13 @@ struct Wasm_test : public beast::unit_test::suite auto const fibWasm = hexToBytes(fibWasmHex); auto& engine = WasmEngine::instance(); + HostFunctions hfs; - auto const re = engine.run(fibWasm, "fib", wasmParams(10)); + auto const re = engine.run(fibWasm, hfs, "fib", wasmParams(10)); checkResult(re, 55, 1'137); } - void - testWasmSha() - { - testcase("Wasm sha"); - - auto const sha512Wasm = hexToBytes(sha512PureWasmHex); - auto& engine = WasmEngine::instance(); - - auto const re = engine.run(sha512Wasm, "sha512_process", wasmParams(sha512PureWasmHex)); - - checkResult(re, 34'432, 151'155); - } - - void - testWasmB58() - { - testcase("Wasm base58"); - auto const b58Wasm = hexToBytes(b58WasmHex); - auto& engine = WasmEngine::instance(); - - Bytes outb; - outb.resize(1024); - - auto const minSize = std::min(static_cast(512), static_cast(b58WasmHex.size())); - auto const s = std::string_view(b58WasmHex.c_str(), minSize); - - auto const re = engine.run(b58Wasm, "b58enco", wasmParams(outb, s)); - - checkResult(re, 700, 2'886'069); - } - void testHFCost() { @@ -250,12 +222,12 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto imp = createWasmImport(*hfs); - for (auto& i : *imp) + TestHostFunctions hfs(env, 0); + auto imp = createWasmImport(hfs); + for (auto& i : imp) i.second.gas = 0; - auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); + auto re = engine.run(allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 1'000'000, env.journal); checkResult(re, 1, 27'080); @@ -273,10 +245,10 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const imp = createWasmImport(*hfs); + TestHostFunctions hfs(env, 0); + auto const imp = createWasmImport(hfs); - auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 1'000'000, env.journal); + auto re = engine.run(allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 1'000'000, env.journal); checkResult(re, 1, 66'340); @@ -289,10 +261,10 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto const imp = createWasmImport(*hfs); + TestHostFunctions hfs(env, 0); + auto const imp = createWasmImport(hfs); - auto re = engine.run(allHostFuncWasm, ESCROW_FUNCTION_NAME, {}, imp, hfs, 200, env.journal); + auto re = engine.run(allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 200, env.journal); if (BEAST_EXPECT(!re)) { @@ -313,14 +285,14 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; { - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, 1, 66'340); } { // max() gas - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); checkResult(re, 1, 66'340); } @@ -332,13 +304,13 @@ struct Wasm_test : public beast::unit_test::suite { } Expected - getTxField(SField const& fname) override + getTxField(SField const& fname) const override { return Unexpected(HostFunctionError::FIELD_NOT_FOUND); } }; - std::shared_ptr hfs(new FieldNotFoundHostFunctions(env)); + FieldNotFoundHostFunctions hfs(env); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'965); } @@ -350,13 +322,13 @@ struct Wasm_test : public beast::unit_test::suite { } Expected - getTxField(SField const& fname) override + getTxField(SField const& fname) const override { return Bytes((128 + 1) * 64 * 1024, 1); } }; - std::shared_ptr hfs(new OversizedFieldHostFunctions(env)); + OversizedFieldHostFunctions hfs(env); auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); checkResult(re, -201, 28'965); } @@ -365,14 +337,14 @@ struct Wasm_test : public beast::unit_test::suite auto const deepWasm = hexToBytes(deepRecursionHex); - std::shared_ptr hfs(new TestHostFunctionsSink(env)); + TestHostFunctionsSink hfs(env); std::string funcName("finish"); auto re = runEscrowWasm(deepWasm, hfs, funcName, {}, 1'000'000'000); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; - auto const& sink = hfs->getSink(); + auto const& sink = hfs.getSink(); auto countSubstr = [](std::string const& str, std::string const& substr) { std::size_t pos = 0; int occurrences = 0; @@ -392,7 +364,7 @@ struct Wasm_test : public beast::unit_test::suite { // infinite loop auto const infiniteLoopWasm = hexToBytes(infiniteLoopWasmHex); std::string const funcName("loop"); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); // infinite loop should be caught and fail auto const re = runEscrowWasm(infiniteLoopWasm, hfs, funcName, {}, 1'000'000); @@ -405,13 +377,13 @@ struct Wasm_test : public beast::unit_test::suite { // expected import not provided auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn2", hfs.get()); + TestLedgerDataProvider hfs(env); + ImportVec imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn2", &hfs); auto& engine = WasmEngine::instance(); - auto re = engine.run(lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(lgrSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -419,14 +391,14 @@ struct Wasm_test : public beast::unit_test::suite { // bad import format auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); - (*imports)[0].first = nullptr; + TestLedgerDataProvider hfs(env); + ImportVec imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hfs); + imports[0].first = nullptr; auto& engine = WasmEngine::instance(); - auto re = engine.run(lgrSqnWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(lgrSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -434,12 +406,12 @@ struct Wasm_test : public beast::unit_test::suite { // bad function name auto const lgrSqnWasm = hexToBytes(ledgerSqnWasmHex); - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - std::shared_ptr imports(std::make_shared()); - WASM_IMPORT_FUNC2(*imports, getLedgerSqn, "get_ledger_sqn", hfs.get()); + TestLedgerDataProvider hfs(env); + ImportVec imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hfs); auto& engine = WasmEngine::instance(); - auto re = engine.run(lgrSqnWasm, "func1", {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(lgrSqnWasm, hfs, "func1", {}, imports, 1'000'000, env.journal); BEAST_EXPECT(!re); } @@ -458,7 +430,7 @@ struct Wasm_test : public beast::unit_test::suite { auto const floatTestWasm = hexToBytes(floatTestsWasmHex); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); auto re = runEscrowWasm(floatTestWasm, hfs, funcName, {}, 200'000); checkResult(re, 1, 110'699); env.close(); @@ -467,102 +439,13 @@ struct Wasm_test : public beast::unit_test::suite { auto const float0Wasm = hexToBytes(float0Hex); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); auto re = runEscrowWasm(float0Wasm, hfs, funcName, {}, 100'000); checkResult(re, 1, 4'259); env.close(); } } - void - perfTest() - { - testcase("Perf test host functions"); - - using namespace jtx; - using namespace std::chrono; - - // std::string const funcName("test"); - auto const perfWasm = hexToBytes(hfPerfTest); - - // std::string const credType = "abcde"; - // std::string const credType2 = "fghijk"; - // std::string const credType3 = "0123456"; - // char const uri[] = "uri"; - - Account const alan{"alan"}; - Account const bob{"bob"}; - Account const issuer{"issuer"}; - - { - Env env(*this); - // Env env(*this, envconfig(), {}, nullptr, - // beast::severities::kTrace); - env.fund(XRP(5000), alan, bob, issuer); - env.close(); - - // // create escrow - // auto const seq = env.seq(alan); - // auto const k = keylet::escrow(alan, seq); - // // auto const allowance = 3'600; - // auto escrowCreate = escrow::create(alan, bob, XRP(1000)); - // XRPAmount txnFees = env.current()->fees().base + 1000; - // env(escrowCreate, - // escrow::finish_function(wasmHex), - // escrow::finish_time(env.now() + 11s), - // escrow::cancel_time(env.now() + 100s), - // escrow::data("1000000000"), // 1000 XRP in drops - // memodata("memo1234567"), - // memodata("2memo1234567"), - // fee(txnFees)); - - // // create depositPreauth - // auto const k = keylet::depositPreauth( - // bob, - // {{issuer.id(), makeSlice(credType)}, - // {issuer.id(), makeSlice(credType2)}, - // {issuer.id(), makeSlice(credType3)}}); - // env(deposit::authCredentials( - // bob, - // {{issuer, credType}, - // {issuer, credType2}, - // {issuer, credType3}})); - - // create nft - [[maybe_unused]] uint256 const nft0{token::getNextID(env, alan, 0u)}; - env(token::mint(alan, 0u)); - auto const k = keylet::nftoffer(alan, 0); - [[maybe_unused]] uint256 const nft1{token::getNextID(env, alan, 0u)}; - - env(token::mint(alan, 0u), - token::uri( - "https://github.com/XRPLF/XRPL-Standards/discussions/" - "279?id=github.com/XRPLF/XRPL-Standards/discussions/" - "279&ut=github.com/XRPLF/XRPL-Standards/discussions/" - "279&sid=github.com/XRPLF/XRPL-Standards/discussions/" - "279&aot=github.com/XRPLF/XRPL-Standards/disc")); - [[maybe_unused]] uint256 const nft2{token::getNextID(env, alan, 0u)}; - env(token::mint(alan, 0u)); - env.close(); - - std::shared_ptr hfs(new PerfHostFunctions(env, k, env.tx())); - - auto re = runEscrowWasm(perfWasm, hfs, ESCROW_FUNCTION_NAME); - if (BEAST_EXPECT(re.has_value())) - { - BEAST_EXPECT(re->result); - std::cout << "Res: " << re->result << " cost: " << re->cost << std::endl; - } - - // env(escrow::finish(alan, alan, seq), - // escrow::comp_allowance(allowance), - // fee(txnFees), - // ter(tesSUCCESS)); - - env.close(); - } - } - void testCodecovWasm() { @@ -573,7 +456,7 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; auto const codecovWasm = hexToBytes(codecovTestsWasmHex); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); auto const allowance = 202'724; auto re = runEscrowWasm(codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); @@ -591,7 +474,7 @@ struct Wasm_test : public beast::unit_test::suite auto disabledFloatWasm = hexToBytes(disabledFloatHex); std::string const funcName("finish"); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); { // f32 set constant, opcode disabled exception @@ -704,91 +587,17 @@ struct Wasm_test : public beast::unit_test::suite Env env(*this); auto const startLoopWasm = hexToBytes(startLoopHex); - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - std::shared_ptr imports(std::make_shared()); + TestLedgerDataProvider hfs(env); + ImportVec imports; auto& engine = WasmEngine::instance(); - auto checkRes = engine.check(startLoopWasm, "finish", {}, imports, hfs, env.journal); + auto checkRes = engine.check(startLoopWasm, hfs, "finish", {}, imports, env.journal); BEAST_EXPECTS(checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); - auto re = engine.run(startLoopWasm, ESCROW_FUNCTION_NAME, {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(startLoopWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); BEAST_EXPECTS(re.error() == tecFAILED_PROCESSING, std::to_string(TERtoInt(re.error()))); } - void - testBadAlloc() - { - testcase("Wasm Bad Alloc"); - - // bad_alloc.c - auto const badAllocWasm = hexToBytes(badAllocHex); - - using namespace test::jtx; - - Env env{*this}; - std::shared_ptr hfs(new TestLedgerDataProvider(env)); - - // std::shared_ptr imports(std::make_shared()); - uint8_t buf1[8] = {7, 8, 9, 10, 11, 12, 13, 14}; - { // forged "allocate" return valid address - std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = sizeof(buf1)}}}}; - auto& engine = WasmEngine::instance(); - - auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - if (BEAST_EXPECT(re)) - { - BEAST_EXPECTS(re->result == 7, std::to_string(re->result)); - BEAST_EXPECTS(re->cost == 430, std::to_string(re->cost)); - } - } - - { // return 0 whithout calling wasm - std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 0}}}}; - auto& engine = WasmEngine::instance(); - auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); - } - - { // forged "allocate" return 8Mb (which is more than memory limit) - std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 1}}}}; - auto& engine = WasmEngine::instance(); - auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); - } - - { // forged "allocate" return 0 - std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 2}}}}; - auto& engine = WasmEngine::instance(); - auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); - } - - { // forged "allocate" return -1 - std::vector params = {{.type = WT_U8V, .of = {.u8v = {.d = buf1, .sz = 3}}}}; - auto& engine = WasmEngine::instance(); - auto re = engine.run(badAllocWasm, "test", params, {}, hfs, 1'000'000, env.journal); - - BEAST_EXPECT(!re) && BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); - } - - { - std::string what; - try - { - char const test[] = "test"; - std::size_t sz = std::numeric_limits::max() + 1ull; - auto p = wasmParams(std::string_view(test, sz)); - } - catch (std::exception const& e) - { - what = e.what(); - } - BEAST_EXPECT(what.find("can't allocate memory, size: 2147483648") != std::string::npos); - } - - env.close(); - } - void testBadAlign() { @@ -800,14 +609,14 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto imports = createWasmImport(*hfs); + TestHostFunctions hfs(env, 0); + auto imports = createWasmImport(hfs); { // Calls float_from_uint with bad alignment. // Can be checked through codecov auto& engine = WasmEngine::instance(); - auto re = engine.run(badAlignWasm, "test", {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(badAlignWasm, hfs, "test", {}, imports, 1'000'000, env.journal); if (BEAST_EXPECTS(re, transToken(re.error()))) { BEAST_EXPECTS(re->result == 0x684f7941, std::to_string(re->result)); @@ -822,7 +631,7 @@ struct Wasm_test : public beast::unit_test::suite { using namespace test::jtx; Env env(*this); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); testcase("Wasm invalid return type"); @@ -877,7 +686,7 @@ struct Wasm_test : public beast::unit_test::suite { using namespace test::jtx; Env env(*this); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); + TestHostFunctions hfs(env, 0); testcase("Wasm invalid params"); @@ -988,8 +797,8 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; Env env{*this}; - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto imports = createWasmImport(*hfs); + TestHostFunctions hfs(env, 0); + auto imports = createWasmImport(hfs); // add 1k parameter (max that wasmi support) std::vector params; @@ -998,28 +807,28 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); { - auto re = engine.run(params1k, "test", params, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(params1k, hfs, "test", params, imports, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 999000); } // add 1 more parameter, module can't be created now params.push_back({.type = WT_I32, .of = {.i32 = 2 * 1000}}); { - auto re = engine.run(params1k1, "test", params, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(params1k1, hfs, "test", params, imports, 1'000'000, env.journal); BEAST_EXPECT(!re); } // function that create 10k local variables auto const locals10k = hexToBytes(locals10kHex); { - auto re = engine.run(locals10k, "test", wasmParams(0, 1), imports, hfs, 1'000'000, env.journal); + auto re = engine.run(locals10k, hfs, "test", wasmParams(0, 1), imports, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 890'489'442); } // module has 5k functions auto const functions5k = hexToBytes(functions5kHex); { - auto re = engine.run(functions5k, "test0001", wasmParams(2, 3), imports, hfs, 1'000'000, env.journal); + auto re = engine.run(functions5k, hfs, "test0001", wasmParams(2, 3), imports, 1'000'000, env.journal); BEAST_EXPECT(re && re->result == 5); } @@ -1057,8 +866,8 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; auto& engine = WasmEngine::instance(); - std::shared_ptr hfs(new TestHostFunctions(env, 0)); - auto imports = createWasmImport(*hfs); + TestHostFunctions hfs(env, 0); + auto imports = createWasmImport(hfs); env.close(); { @@ -1067,7 +876,7 @@ struct Wasm_test : public beast::unit_test::suite int64_t cost = -1, std::source_location const location = std::source_location::current()) { auto const lineStr = " (" + std::to_string(location.line()) + ")"; - auto re = engine.run(code, "all_instructions", {}, imports, hfs, 1'000'000, env.journal); + auto re = engine.run(code, hfs, "all_instructions", {}, imports, 1'000'000, env.journal); if (BEAST_EXPECTS(re.has_value() == good, transToken(re.error()) + lineStr) && good) BEAST_EXPECTS(re->cost == cost, std::to_string(re->cost) + lineStr); }; @@ -1555,8 +1364,6 @@ struct Wasm_test : public beast::unit_test::suite testWasmLedgerSqn(); testWasmFib(); - testWasmSha(); - testWasmB58(); testHFCost(); testEscrowWasmDN(); @@ -1573,7 +1380,6 @@ struct Wasm_test : public beast::unit_test::suite testWasmSectionCorruption(); testStartFunctionLoop(); - testBadAlloc(); testBadAlign(); testReturnType(); testSwapBytes(); @@ -1581,8 +1387,6 @@ struct Wasm_test : public beast::unit_test::suite testParameterType(); testOpcodes(); - - // perfTest(); } }; diff --git a/src/test/app/wasm_fixtures/b58.c b/src/test/app/wasm_fixtures/b58.c deleted file mode 100644 index 8935a9f1a5b..00000000000 --- a/src/test/app/wasm_fixtures/b58.c +++ /dev/null @@ -1,69 +0,0 @@ -#include - -static char const b58digits_ordered[] = - "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; - -uint8_t e_data[32 * 1024]; - -void *allocate(int sz) -{ - static int idx = 0; - if (idx >= 32) - return 0; - if (sz > 1024) - return 0; - return &e_data[idx++ << 10]; -} - -void deallocate(void *p) {} - -extern int32_t b58enco(char *b58, int32_t b58sz, void const *data, - int32_t binsz) -{ - uint8_t const *bin = data; - int32_t carry; - int32_t i, j, high, zcount = 0; - int32_t size; - - while (zcount < binsz && !bin[zcount]) - ++zcount; - - size = (binsz - zcount) * 138 / 100 + 1; - uint8_t *buf = allocate(size); - if (!buf) - return 0; - // memset(buf, 0, size); - for (i = 0; i < size; ++i) - buf[i] = 0; - - for (i = zcount, high = size - 1; i < binsz; ++i, high = j) - { - for (carry = bin[i], j = size - 1; (j > high) || carry; --j) - { - carry += 256 * buf[j]; - buf[j] = carry % 58; - carry /= 58; - if (!j) - break; - } - } - - for (j = 0; j < size && !buf[j]; ++j) - ; - - if (b58sz <= zcount + size - j) - return 0; - - if (zcount) - { - // memset(b58, '1', zcount); - for (i = 0; i < zcount; ++i) - b58[i] = '1'; - } - - for (i = zcount; j < size; ++i, ++j) - b58[i] = b58digits_ordered[buf[j]]; - b58[i] = '\0'; - - return i + 1; -} diff --git a/src/test/app/wasm_fixtures/bad_alloc.c b/src/test/app/wasm_fixtures/bad_alloc.c deleted file mode 100644 index 77356793657..00000000000 --- a/src/test/app/wasm_fixtures/bad_alloc.c +++ /dev/null @@ -1,25 +0,0 @@ -#include - -char buf[1024]; - -void *allocate(int sz) -{ - if (!sz) - return 0; - - if (sz == 1) - return ((void *)(8 * 1024 * 1024)); - if (sz == 2) - return 0; - if (sz == 3) - return ((void *)(0xFFFFFFFF)); - - return &buf[sz]; -} - -int32_t test(char *p, int32_t sz) -{ - if (!sz) - return 0; - return p[0]; -} diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 77214824953..08d189a5bab 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -9,100 +9,6 @@ extern std::string const fibWasmHex = "0340200041036b100120016a2101200041026b220041044a0d000b200141" "016a0b"; -extern std::string const b58WasmHex = - "0061736d0100000001150460000060017f017f60017f0060047f7f7f7f01" - "7f0305040001020305030100020607017f0041d0080b074906066d656d6f" - "72790200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63" - "617465000106655f6461746103000a6465616c6c6f636174650002076235" - "38656e636f00030ae8050402000b3401017f024020004180084a0d0041c0" - "082802002200411f4a0d0041c008200041016a3602002000410a7441d008" - "6a21010b20010b02000baa0501097f41d088060240200341004c0d000340" - "200220066a2d00000d012003200641016a2206470d000b200321060b2003" - "20066b220c418a016c41e4006d220741106a4170716b21090240200c4100" - "480d00200741016a220a410771210541002104200741074f0440200a41f8" - "ffff1f71210a0340200420096a4200370300200a200441086a2204470d00" - "0b0b2005450d00200420096a21040340200441003a0000200441016a2104" - "200541016b22050d000b0b200320064a0440200621052007210403402002" - "20056a2d0000210802402004220a20074e0440200721042008450d010b20" - "0721040340200420096a220b200b2d000041087420086a220b200b413a6d" - "2208413a6c6b3a00002004450440410021040c020b200441016b2204200a" - "4a0d00200b413a6b418d7f490d000b0b200541016a22052003470d000b0b" - "200741016a22022103410021040240200c4100480d000340200420096a2d" - "00000d012002200441016a2204470d000b200221040b2001200320066a20" - "046b4a047f02402006450d002006410771210841002105200641084f0440" - "200641787121010340200020056a42b1e2c48993a6cc9831370000200120" - "0541086a2205470d000b0b2008450d00200020056a21050340200541313a" - "0000200541016a2105200841016b22080d000b0b0240200420074a0d0020" - "0420076a410171047f200405200020066a200420096a2d00004180086a2d" - "00003a0000200641016a2106200441016a0b210520042007460d00200520" - "096a2101200720056b2102200020066a2103417f21040340200320046a22" - "0741016a200120046a220541016a2d00004180086a2d00003a0000200741" - "026a200541026a2d00004180086a2d00003a00002002200441026a220447" - "0d000b200420066a41016a21060b200020066a41003a0000200641016a05" - "41000b0b0b4101004180080b3a3132333435363738394142434445464748" - "4a4b4c4d4e505152535455565758595a6162636465666768696a6b6d6e6f" - "707172737475767778797a00490f7461726765745f666561747572657304" - "2b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f72" - "65666572656e63652d74797065732b0a6d756c746976616c7565"; - -extern std::string const sha512PureWasmHex = - "0061736d0100000001130460000060017f017f60017f0060027f7f017f03" - "05040001020305030100020607017f0041800d0b075006066d656d6f7279" - "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f636174" - "65000106655f6461746103000a6465616c6c6f6361746500020e73686135" - "31325f70726f6365737300030aa4060402000b0f0041800d410020004180" - "80024d1b0b02000b8b0602147e037f200141ff006a41ff014f044041c08c" - "06211620014180016d41016bac210b41808d02290300210c41888d022903" - "00210d41908d02290300210e41988d02290300210f41a08d022903002110" - "41a88d02290300211141b08d02290300211241b88d022903002113034041" - "002101200c21092013210a201221082011210520102103200f2115200e21" - "06200d2102034020022107200120166a200020016a290000220242388620" - "024280fe0383422886842002428080fc0783421886200242808080f80f83" - "4208868484200242088842808080f80f832002421888428080fc07838420" - "024228884280fe03832002423888848484220237030020014180086a2903" - "00200a200322044232892004422e89852004421789857c2008220a200442" - "7f858320052208200483847c7c20027c2203200922024224892002421e89" - "85200242198985200220072006221485832006200783857c7c2109200320" - "157c2103200421052006211520072106200141086a2201418001470d000b" - "200020016a21004180092117411e210103402002210620162001410e6b41" - "0f714103746a221820182903002016200141056b410f714103746a290300" - "20162001410d6b410f714103746a2903002202423f892002423889852002" - "420788857c7c20162001410f714103746a2903002202422d892002420389" - "852002420688857c22023703002017290300200a20032205423289200542" - "2e89852005421789857c2005427f852008832004200583847c7c20027c22" - "03200922024224892002421e898520024219898520022006200785832006" - "200783857c7c2109200320147c2103201741086a21172008210a20042108" - "200521042007211420062107200141016a220141de00470d000b41b88d02" - "200a20137c221337030041b08d02200820127c221237030041a88d022004" - "20117c221137030041a08d02200320107c221037030041988d02200f2014" - "7c220f37030041908d022007200e7c220e37030041888d022002200d7c22" - "0d37030041808d022009200c7c220c370300200b420052200b42017d210b" - "0d000b0b41808d020b0b880501004180080b800522ae28d7982f8a42cd65" - "ef23914437712f3b4deccffbc0b5bcdb8981a5dbb5e938b548f35bc25639" - "19d005b6f111f1599b4f19afa4823f9218816ddad55e1cab420203a398aa" - "07d8be6f7045015b83128cb2e44ebe853124e2b4ffd5c37d0c556f897bf2" - "745dbe72b196163bfeb1de803512c725a706dc9b942669cf74f19bc1d24a" - "f19ec1699be4e3254f388647beefb5d58c8bc69dc10f659cac77cca10c24" - "75022b596f2ce92d83e4a66eaa84744ad4fb41bddca9b05cb5531183da88" - "f976abdf66ee52513e981032b42d6dc631a83f21fb98c82703b0e40eefbe" - "c77f59bfc28fa83df30be0c625a70a934791a7d56f8203e05163ca06706e" - "0e0a67292914fc2fd246850ab72726c9265c38211b2eed2ac45afc6d2c4d" - "dfb3959d130d3853de63af8b54730a65a8b2773cbb0a6a76e6aeed472ec9" - "c2813b358214852c72926403f14ca1e8bfa2013042bc4b661aa89197f8d0" - "708b4bc230be5406a3516cc71852efd619e892d110a96555240699d62a20" - "715785350ef4b8d1bb3270a06a10c8d0d2b816c1a41953ab4151086c371e" - "99eb8edf4c774827a8489be1b5bcb034635ac9c5b30c1c39cb8a41e34aaa" - "d84e73e363774fca9c5ba3b8b2d6f36f2e68fcb2ef5dee828f74602f1743" - "6f63a57872abf0a11478c884ec39641a0802c78c281e6323faffbe90e9bd" - "82deeb6c50a41579c6b2f7a3f9be2b5372e3f27871c69c6126eace3e27ca" - "07c2c021c7b886d11eebe0cdd67ddaea78d16eee7f4f7df5ba6f1772aa67" - "f006a698c8a2c57d630aae0df9be04983f111b471c13350b711b847d0423" - "f577db289324c7407babca32bcbec9150abe9e3c4c0d109cc4671d43b642" - "3ecbbed4c54c2a7e65fc9c297f59ecfad63aab6fcb5f1758474a8c19446c" - "00490f7461726765745f6665617475726573042b0f6d757461626c652d67" - "6c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" - "7065732b0a6d756c746976616c7565"; - extern std::string const ledgerSqnWasmHex = "0061736d01000000010e0360027f7f017f6000006000017f02160103656e760e6765745f6c65646765725f73716e0000030302010205030100" "02063f0a7f01418088040b7f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f" @@ -342,40 +248,6 @@ extern std::string const deepRecursionHex = "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69" "736800000a16011400230045044041010f0b230041016b240010000b"; -extern std::string const hfPerfTest = - "0061736d0100000001190460057f7f7f7f7f017f60047f7f7f7f017f6000006000017f0236" - "0303656e7609666c6f61745f6c6f67000003656e76057472616365000003656e7612747261" - "63655f6f70617175655f666c6f617400010303020203050301000206aa011c7f0041b0090b" - "7f004193090b7f0041b0080b7f0041c0080b7f0041e0080b7f004180090b7f004180080b7f" - "004184080b7f004188080b7f00418c080b7f004190080b7f004194080b7f004198080b7f00" - "419c080b7f0041a0080b7f0041a4080b7f0041a8080b7f0041ac080b7f00419b090b7f0041" - "80080b7f0041b0110b7f0041b0110b7f0041b091040b7f004180080b7f0041b091040b7f00" - "418080080b7f0041000b7f0041010b0785031f066d656d6f72790200115f5f7761736d5f63" - "616c6c5f63746f727300030666696e697368000403627566030001610301086572725f6865" - "61640302096572725f6461746131030305696e707574030406726573756c74030508495445" - "525f4d4158030609484153485f53495a450307084143435f53495a4503080d43555252454e" - "43595f53495a4503090b4b45594c45545f53495a45030a0a53465f4163636f756e74030b0e" - "53465f44657374696e6174696f6e030c0853465f4d656d6f73030d0753465f4d656d6f030e" - "0b53465f4d656d6f44617461030f0753465f4461746103101753465f417574686f72697a65" - "43726564656e7469616c730311016203120c5f5f64736f5f68616e646c6503130a5f5f6461" - "74615f656e6403140b5f5f737461636b5f6c6f7703150c5f5f737461636b5f686967680316" - "0d5f5f676c6f62616c5f6261736503170b5f5f686561705f6261736503180a5f5f68656170" - "5f656e6403190d5f5f6d656d6f72795f62617365031a0c5f5f7461626c655f62617365031b" - "0a7c0202000b7701017f41807821000340200041b0116a4200370300200041086a22000d00" - "0b41c0843d210002400340419309410841b009418008410010004108460440200041016b22" - "000d010c020b0b41b008410f41c0084113410010011a0b41e0084111419309410810021a41" - "8009411241b009410810021a41010b0b9f0104004180080b53809698002000000014000000" - "1400000020000000010008000300080009000f000a000e000d0007001b0007001a000f0066" - "6c6f61745f6c6f67206572726f7200696e76616c69642072657475726e2073697a650041e0" - "080b11666c6f61745f6c6f6720696e7075743a20004180090b12666c6f61745f6c6f672072" - "6573756c743a20004193090b10d48b29430a256d21d920c49ba5e353f8007f0970726f6475" - "63657273010c70726f6365737365642d62790105636c616e675f31392e312e352d77617369" - "2d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d7072" - "6f6a6563742061623462356132646235383239353861663165653330386137393063666462" - "3432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c" - "652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b" - "0a6d756c746976616c7565"; - extern std::string const allKeyletsWasmHex = "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f" "7f7f017f60037f7f7f017f60037f7f7e017f60057f7f7f7f7f017f60057f7f7f7f7f006000" @@ -1284,24 +1156,6 @@ extern std::string const startLoopHex = "0061736d010000000108026000006000017f03030200010712020573746172740000066669" "6e69736800010801000a0e02070003400c000b0b040041010b"; -extern std::string const badAllocHex = - "0061736d01000000010f0360000060017f017f60027f7f017f030403000102050301000206" - "3e0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090040b7f004180" - "080b7f00418090040b7f00418080080b7f0041000b7f0041010b07b9010e066d656d6f7279" - "0200115f5f7761736d5f63616c6c5f63746f7273000008616c6c6f63617465000103627566" - "0300047465737400020c5f5f64736f5f68616e646c6503010a5f5f646174615f656e640302" - "0b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f676c6f6261" - "6c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e6403070d5f" - "5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a420302000b2c01" - "017f024002400240024020000e0403000301020b41808080040f0b417f0f0b20004180086a" - "21010b20010b1000200145044041000f0b20002c00000b007f0970726f647563657273010c" - "70726f6365737365642d62790105636c616e675f31392e312e352d776173692d73646b2028" - "68747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420" - "61623462356132646235383239353861663165653330386137393063666462343262643234" - "3732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62" - "616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c7469" - "76616c7565"; - extern std::string const badAlignWasmHex = "0061736d01000000011b046000017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f600000022a0203656e760f666c6f61745f66726f6d5f75" "696e74000103656e760c636865636b5f6b65796c6574000203050403000000050301000306470b7f004180080b7f00418088020b7f00418008" diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index 5c71698d67b..ceace76fc00 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -5,27 +5,14 @@ #include extern std::string const ledgerSqnWasmHex; - extern std::string const allHostFunctionsWasmHex; - -extern std::string const deepRecursionHex; - -extern std::string const fibWasmHex; - -extern std::string const b58WasmHex; - -extern std::string const sha512PureWasmHex; - -extern std::string const hfPerfTest; - extern std::string const allKeyletsWasmHex; - extern std::string const codecovTestsWasmHex; -extern std::string const floatTestsWasmHex; +extern std::string const fibWasmHex; +extern std::string const floatTestsWasmHex; extern std::string const float0Hex; - extern std::string const disabledFloatHex; extern std::string const memoryPointerAtLimitHex; @@ -80,10 +67,10 @@ extern std::string const junkAfterSectionHex; extern std::string const invalidSectionIdHex; extern std::string const localVariableBombHex; +extern std::string const deepRecursionHex; extern std::string const infiniteLoopWasmHex; extern std::string const startLoopHex; -extern std::string const badAllocHex; extern std::string const badAlignWasmHex; extern std::string const thousandParamsHex; diff --git a/src/test/app/wasm_fixtures/sha512Pure.c b/src/test/app/wasm_fixtures/sha512Pure.c deleted file mode 100644 index 347bf8827b0..00000000000 --- a/src/test/app/wasm_fixtures/sha512Pure.c +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include - -static uint64_t const K512[] = { - 0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, - 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, - 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, - 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, - 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, - 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, - 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, - 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, - 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, - 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, - 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, - 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, - 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, - 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, - 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, - 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, - 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, - 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, - 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, - 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, - 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, - 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, - 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, - 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, - 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, - 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, - 0x5fcb6fab3ad6faec, 0x6c44198c4a475817}; - -#define ROTATE(x, y) (((x) >> (y)) | ((x) << (64 - (y)))) -#define Sigma0(x) (ROTATE((x), 28) ^ ROTATE((x), 34) ^ ROTATE((x), 39)) -#define Sigma1(x) (ROTATE((x), 14) ^ ROTATE((x), 18) ^ ROTATE((x), 41)) -#define sigma0(x) (ROTATE((x), 1) ^ ROTATE((x), 8) ^ ((x) >> 7)) -#define sigma1(x) (ROTATE((x), 19) ^ ROTATE((x), 61) ^ ((x) >> 6)) - -#define Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z))) -#define Maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z))) - -static inline uint64_t B2U64(uint8_t val, uint8_t sh) -{ - return ((uint64_t)val) << sh; -} - -void *allocate(int sz) { return malloc(sz); } -void deallocate(void *p) { free(p); } - -uint8_t e_data[32 * 1024]; - -uint8_t *sha512_process(uint8_t const *data, int32_t length) -{ - static uint64_t state[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - - uint64_t a, b, c, d, e, f, g, h, s0, s1, T1, T2; - uint64_t X[16]; - - uint64_t blocks = length / 128; - while (blocks--) - { - a = state[0]; - b = state[1]; - c = state[2]; - d = state[3]; - e = state[4]; - f = state[5]; - g = state[6]; - h = state[7]; - - unsigned i; - for (i = 0; i < 16; i++) - { - X[i] = B2U64(data[0], 56) | B2U64(data[1], 48) | B2U64(data[2], 40) | - B2U64(data[3], 32) | B2U64(data[4], 24) | B2U64(data[5], 16) | - B2U64(data[6], 8) | B2U64(data[7], 0); - data += 8; - - T1 = h; - T1 += Sigma1(e); - T1 += Ch(e, f, g); - T1 += K512[i]; - T1 += X[i]; - - T2 = Sigma0(a); - T2 += Maj(a, b, c); - - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - for (i = 16; i < 80; i++) - { - s0 = X[(i + 1) & 0x0f]; - s0 = sigma0(s0); - s1 = X[(i + 14) & 0x0f]; - s1 = sigma1(s1); - - T1 = X[i & 0xf] += s0 + s1 + X[(i + 9) & 0xf]; - T1 += h + Sigma1(e) + Ch(e, f, g) + K512[i]; - T2 = Sigma0(a) + Maj(a, b, c); - - h = g; - g = f; - f = e; - e = d + T1; - d = c; - c = b; - b = a; - a = T1 + T2; - } - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - state[4] += e; - state[5] += f; - state[6] += g; - state[7] += h; - } - - return (uint8_t *)(state); -} - -// int main () -//{ -// return 0; -// } diff --git a/src/xrpld/app/wasm/HostFunc.h b/src/xrpld/app/wasm/HostFunc.h index f3ed5ad6f96..ea1e171332f 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/src/xrpld/app/wasm/HostFunc.h @@ -104,56 +104,50 @@ struct HostFunctions return nullptr; } - std::int64_t - getGas() - { - return -1; - } - - void - setGas(std::int64_t) + beast::Journal + getJournal() const { - return; + return j_; } - beast::Journal - getJournal() + virtual bool + checkSelf() const { - return j_; + return true; } virtual Expected - getLedgerSqn() + getLedgerSqn() const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getParentLedgerTime() + getParentLedgerTime() const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getParentLedgerHash() + getParentLedgerHash() const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getBaseFee() + getBaseFee() const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - isAmendmentEnabled(uint256 const& amendmentId) + isAmendmentEnabled(uint256 const& amendmentId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - isAmendmentEnabled(std::string_view const& amendmentName) + isAmendmentEnabled(std::string_view const& amendmentName) const { return Unexpected(HostFunctionError::INTERNAL); } @@ -165,73 +159,73 @@ struct HostFunctions } virtual Expected - getTxField(SField const& fname) + getTxField(SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getCurrentLedgerObjField(SField const& fname) + getCurrentLedgerObjField(SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) + getLedgerObjField(int32_t cacheIdx, SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getTxNestedField(Slice const& locator) + getTxNestedField(Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getCurrentLedgerObjNestedField(Slice const& locator) + getCurrentLedgerObjNestedField(Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getTxArrayLen(SField const& fname) + getTxArrayLen(SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getCurrentLedgerObjArrayLen(SField const& fname) + getCurrentLedgerObjArrayLen(SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getTxNestedArrayLen(Slice const& locator) + getTxNestedArrayLen(Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getCurrentLedgerObjNestedArrayLen(Slice const& locator) + getCurrentLedgerObjNestedArrayLen(Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) const { return Unexpected(HostFunctionError::INTERNAL); } @@ -243,259 +237,259 @@ struct HostFunctions } virtual Expected - checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - computeSha512HalfHash(Slice const& data) + computeSha512HalfHash(Slice const& data) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - accountKeylet(AccountID const& account) + accountKeylet(AccountID const& account) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - ammKeylet(Asset const& issue1, Asset const& issue2) + ammKeylet(Asset const& issue1, Asset const& issue2) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - checkKeylet(AccountID const& account, std::uint32_t seq) + checkKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - didKeylet(AccountID const& account) + didKeylet(AccountID const& account) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - delegateKeylet(AccountID const& account, AccountID const& authorize) + delegateKeylet(AccountID const& account, AccountID const& authorize) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - depositPreauthKeylet(AccountID const& account, AccountID const& authorize) + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) + escrowKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) + lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - mptokenKeylet(MPTID const& mptid, AccountID const& holder) + mptokenKeylet(MPTID const& mptid, AccountID const& holder) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - nftOfferKeylet(AccountID const& account, std::uint32_t seq) + nftOfferKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - offerKeylet(AccountID const& account, std::uint32_t seq) + offerKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - oracleKeylet(AccountID const& account, std::uint32_t docId) + oracleKeylet(AccountID const& account, std::uint32_t docId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) + paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - signersKeylet(AccountID const& account) + signersKeylet(AccountID const& account) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - ticketKeylet(AccountID const& account, std::uint32_t seq) + ticketKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - vaultKeylet(AccountID const& account, std::uint32_t seq) + vaultKeylet(AccountID const& account, std::uint32_t seq) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFT(AccountID const& account, uint256 const& nftId) + getNFT(AccountID const& account, uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFTIssuer(uint256 const& nftId) + getNFTIssuer(uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFTTaxon(uint256 const& nftId) + getNFTTaxon(uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFTFlags(uint256 const& nftId) + getNFTFlags(uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFTTransferFee(uint256 const& nftId) + getNFTTransferFee(uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - getNFTSerial(uint256 const& nftId) + getNFTSerial(uint256 const& nftId) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - trace(std::string_view const& msg, Slice const& data, bool asHex) + trace(std::string_view const& msg, Slice const& data, bool asHex) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - traceNum(std::string_view const& msg, int64_t data) + traceNum(std::string_view const& msg, int64_t data) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - traceAccount(std::string_view const& msg, AccountID const& account) + traceAccount(std::string_view const& msg, AccountID const& account) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - traceFloat(std::string_view const& msg, Slice const& data) + traceFloat(std::string_view const& msg, Slice const& data) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - traceAmount(std::string_view const& msg, STAmount const& amount) + traceAmount(std::string_view const& msg, STAmount const& amount) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatFromInt(int64_t x, int32_t mode) + floatFromInt(int64_t x, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatFromUint(uint64_t x, int32_t mode) + floatFromUint(uint64_t x, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatSet(int64_t mantissa, int32_t exponent, int32_t mode) + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatCompare(Slice const& x, Slice const& y) + floatCompare(Slice const& x, Slice const& y) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatAdd(Slice const& x, Slice const& y, int32_t mode) + floatAdd(Slice const& x, Slice const& y, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatSubtract(Slice const& x, Slice const& y, int32_t mode) + floatSubtract(Slice const& x, Slice const& y, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatMultiply(Slice const& x, Slice const& y, int32_t mode) + floatMultiply(Slice const& x, Slice const& y, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatDivide(Slice const& x, Slice const& y, int32_t mode) + floatDivide(Slice const& x, Slice const& y, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatRoot(Slice const& x, int32_t n, int32_t mode) + floatRoot(Slice const& x, int32_t n, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatPower(Slice const& x, int32_t n, int32_t mode) + floatPower(Slice const& x, int32_t n, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } virtual Expected - floatLog(Slice const& x, int32_t mode) + floatLog(Slice const& x, int32_t mode) const { return Unexpected(HostFunctionError::INTERNAL); } diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/src/xrpld/app/wasm/HostFuncImpl.h index 1760be7c028..048f9338d7a 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/src/xrpld/app/wasm/HostFuncImpl.h @@ -7,44 +7,42 @@ namespace xrpl { class WasmHostFunctionsImpl : public HostFunctions { - ApplyContext& ctx; - Keylet leKey; - std::shared_ptr currentLedgerObj = nullptr; - bool isLedgerObjCached = false; + ApplyContext& ctx_; + + Keylet leKey_; + mutable std::optional> currentLedgerObj_; static int constexpr MAX_CACHE = 256; - std::array, MAX_CACHE> cache; + std::array, MAX_CACHE> cache_; + std::optional data_; void const* rt_ = nullptr; Expected, HostFunctionError> - getCurrentLedgerObj() + getCurrentLedgerObj() const { - if (!isLedgerObjCached) - { - isLedgerObjCached = true; - currentLedgerObj = ctx.view().read(leKey); - } - if (currentLedgerObj) - return currentLedgerObj; + if (!currentLedgerObj_) + currentLedgerObj_ = ctx_.view().read(leKey_); + if (*currentLedgerObj_) + return *currentLedgerObj_; return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); } Expected - normalizeCacheIndex(int32_t cacheIdx) + normalizeCacheIndex(int32_t cacheIdx) const { --cacheIdx; if (cacheIdx < 0 || cacheIdx >= MAX_CACHE) return Unexpected(HostFunctionError::SLOT_OUT_RANGE); - if (!cache[cacheIdx]) + if (!cache_[cacheIdx]) return Unexpected(HostFunctionError::EMPTY_SLOT); return cacheIdx; } template void - log(std::string_view const& msg, F&& dataFn) + log(std::string_view const& msg, F&& dataFn) const { #ifdef DEBUG_OUTPUT auto& j = std::cerr; @@ -53,7 +51,7 @@ class WasmHostFunctionsImpl : public HostFunctions return; auto j = getJournal().trace(); #endif - j << "WasmTrace[" << to_short_string(leKey.key) << "]: " << msg << " " << dataFn(); + j << "WasmTrace[" << to_short_string(leKey_.key) << "]: " << msg << " " << dataFn(); #ifdef DEBUG_OUTPUT j << std::endl; @@ -61,7 +59,7 @@ class WasmHostFunctionsImpl : public HostFunctions } public: - WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) : HostFunctions(ct.journal), ctx(ct), leKey(leKey) + WasmHostFunctionsImpl(ApplyContext& ct, Keylet const& leKey) : HostFunctions(ct.journal), ctx_(ct), leKey_(leKey) { } @@ -77,6 +75,13 @@ class WasmHostFunctionsImpl : public HostFunctions return rt_; } + virtual bool + checkSelf() const override + { + return !currentLedgerObj_ && !data_ && + std::ranges::find_if(cache_, [](auto& p) { return !!p; }) == cache_.end(); + } + std::optional const& getData() const { @@ -84,193 +89,193 @@ class WasmHostFunctionsImpl : public HostFunctions } Expected - getLedgerSqn() override; + getLedgerSqn() const override; Expected - getParentLedgerTime() override; + getParentLedgerTime() const override; Expected - getParentLedgerHash() override; + getParentLedgerHash() const override; Expected - getBaseFee() override; + getBaseFee() const override; Expected - isAmendmentEnabled(uint256 const& amendmentId) override; + isAmendmentEnabled(uint256 const& amendmentId) const override; Expected - isAmendmentEnabled(std::string_view const& amendmentName) override; + isAmendmentEnabled(std::string_view const& amendmentName) const override; Expected cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) override; Expected - getTxField(SField const& fname) override; + getTxField(SField const& fname) const override; Expected - getCurrentLedgerObjField(SField const& fname) override; + getCurrentLedgerObjField(SField const& fname) const override; Expected - getLedgerObjField(int32_t cacheIdx, SField const& fname) override; + getLedgerObjField(int32_t cacheIdx, SField const& fname) const override; Expected - getTxNestedField(Slice const& locator) override; + getTxNestedField(Slice const& locator) const override; Expected - getCurrentLedgerObjNestedField(Slice const& locator) override; + getCurrentLedgerObjNestedField(Slice const& locator) const override; Expected - getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) override; + getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) const override; Expected - getTxArrayLen(SField const& fname) override; + getTxArrayLen(SField const& fname) const override; Expected - getCurrentLedgerObjArrayLen(SField const& fname) override; + getCurrentLedgerObjArrayLen(SField const& fname) const override; Expected - getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) override; + getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) const override; Expected - getTxNestedArrayLen(Slice const& locator) override; + getTxNestedArrayLen(Slice const& locator) const override; Expected - getCurrentLedgerObjNestedArrayLen(Slice const& locator) override; + getCurrentLedgerObjNestedArrayLen(Slice const& locator) const override; Expected - getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) override; + getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) const override; Expected updateData(Slice const& data) override; Expected - checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) override; + checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) const override; Expected - computeSha512HalfHash(Slice const& data) override; + computeSha512HalfHash(Slice const& data) const override; Expected - accountKeylet(AccountID const& account) override; + accountKeylet(AccountID const& account) const override; Expected - ammKeylet(Asset const& issue1, Asset const& issue2) override; + ammKeylet(Asset const& issue1, Asset const& issue2) const override; Expected - checkKeylet(AccountID const& account, std::uint32_t seq) override; + checkKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) override; + credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) const override; Expected - didKeylet(AccountID const& account) override; + didKeylet(AccountID const& account) const override; Expected - delegateKeylet(AccountID const& account, AccountID const& authorize) override; + delegateKeylet(AccountID const& account, AccountID const& authorize) const override; Expected - depositPreauthKeylet(AccountID const& account, AccountID const& authorize) override; + depositPreauthKeylet(AccountID const& account, AccountID const& authorize) const override; Expected - escrowKeylet(AccountID const& account, std::uint32_t seq) override; + escrowKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) override; + lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) const override; Expected - mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) override; + mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) const override; Expected - mptokenKeylet(MPTID const& mptid, AccountID const& holder) override; + mptokenKeylet(MPTID const& mptid, AccountID const& holder) const override; Expected - nftOfferKeylet(AccountID const& account, std::uint32_t seq) override; + nftOfferKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - offerKeylet(AccountID const& account, std::uint32_t seq) override; + offerKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - oracleKeylet(AccountID const& account, std::uint32_t docId) override; + oracleKeylet(AccountID const& account, std::uint32_t docId) const override; Expected - paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) override; + paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) const override; Expected - permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) override; + permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - signersKeylet(AccountID const& account) override; + signersKeylet(AccountID const& account) const override; Expected - ticketKeylet(AccountID const& account, std::uint32_t seq) override; + ticketKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - vaultKeylet(AccountID const& account, std::uint32_t seq) override; + vaultKeylet(AccountID const& account, std::uint32_t seq) const override; Expected - getNFT(AccountID const& account, uint256 const& nftId) override; + getNFT(AccountID const& account, uint256 const& nftId) const override; Expected - getNFTIssuer(uint256 const& nftId) override; + getNFTIssuer(uint256 const& nftId) const override; Expected - getNFTTaxon(uint256 const& nftId) override; + getNFTTaxon(uint256 const& nftId) const override; Expected - getNFTFlags(uint256 const& nftId) override; + getNFTFlags(uint256 const& nftId) const override; Expected - getNFTTransferFee(uint256 const& nftId) override; + getNFTTransferFee(uint256 const& nftId) const override; Expected - getNFTSerial(uint256 const& nftId) override; + getNFTSerial(uint256 const& nftId) const override; Expected - trace(std::string_view const& msg, Slice const& data, bool asHex) override; + trace(std::string_view const& msg, Slice const& data, bool asHex) const override; Expected - traceNum(std::string_view const& msg, int64_t data) override; + traceNum(std::string_view const& msg, int64_t data) const override; Expected - traceAccount(std::string_view const& msg, AccountID const& account) override; + traceAccount(std::string_view const& msg, AccountID const& account) const override; Expected - traceFloat(std::string_view const& msg, Slice const& data) override; + traceFloat(std::string_view const& msg, Slice const& data) const override; Expected - traceAmount(std::string_view const& msg, STAmount const& amount) override; + traceAmount(std::string_view const& msg, STAmount const& amount) const override; Expected - floatFromInt(int64_t x, int32_t mode) override; + floatFromInt(int64_t x, int32_t mode) const override; Expected - floatFromUint(uint64_t x, int32_t mode) override; + floatFromUint(uint64_t x, int32_t mode) const override; Expected - floatSet(int64_t mantissa, int32_t exponent, int32_t mode) override; + floatSet(int64_t mantissa, int32_t exponent, int32_t mode) const override; Expected - floatCompare(Slice const& x, Slice const& y) override; + floatCompare(Slice const& x, Slice const& y) const override; Expected - floatAdd(Slice const& x, Slice const& y, int32_t mode) override; + floatAdd(Slice const& x, Slice const& y, int32_t mode) const override; Expected - floatSubtract(Slice const& x, Slice const& y, int32_t mode) override; + floatSubtract(Slice const& x, Slice const& y, int32_t mode) const override; Expected - floatMultiply(Slice const& x, Slice const& y, int32_t mode) override; + floatMultiply(Slice const& x, Slice const& y, int32_t mode) const override; Expected - floatDivide(Slice const& x, Slice const& y, int32_t mode) override; + floatDivide(Slice const& x, Slice const& y, int32_t mode) const override; Expected - floatRoot(Slice const& x, int32_t n, int32_t mode) override; + floatRoot(Slice const& x, int32_t n, int32_t mode) const override; Expected - floatPower(Slice const& x, int32_t n, int32_t mode) override; + floatPower(Slice const& x, int32_t n, int32_t mode) const override; Expected - floatLog(Slice const& x, int32_t mode) override; + floatLog(Slice const& x, int32_t mode) const override; }; namespace wasm_float { diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/src/xrpld/app/wasm/ParamsHelper.h index 90ecb4caa52..40b9405dcc1 100644 --- a/src/xrpld/app/wasm/ParamsHelper.h +++ b/src/xrpld/app/wasm/ParamsHelper.h @@ -173,52 +173,6 @@ wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) // wasmParamsHlp(v, std::forward(args)...); // } -template -inline void -wasmParamsHlp(std::vector& v, std::uint8_t const* dt, std::int32_t sz, Types&&... args) -{ - v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); - wasmParamsHlp(v, std::forward(args)...); -} - -template -inline void -wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) -{ - if (p.size() > std::numeric_limits::max()) - throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); // LCOV_EXCL_LINE - - wasmParamsHlp(v, p.data(), static_cast(p.size()), std::forward(args)...); -} - -template -inline void -wasmParamsHlp(std::vector& v, std::string_view const& p, Types&&... args) -{ - if (p.size() > std::numeric_limits::max()) - throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); - - wasmParamsHlp( - v, - reinterpret_cast(p.data()), - static_cast(p.size()), - std::forward(args)...); -} - -template -inline void -wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) -{ - if (p.size() > std::numeric_limits::max()) - throw std::runtime_error("can't allocate memory, size: " + std::to_string(p.size())); // LCOV_EXCL_LINE - - wasmParamsHlp( - v, - reinterpret_cast(p.c_str()), - static_cast(p.size()), - std::forward(args)...); -} - inline void wasmParamsHlp(std::vector& v) { diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index f14c475dc56..27b1cc38c90 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -24,7 +24,7 @@ class WasmiEngine; class WasmEngine { - std::unique_ptr const impl; + std::unique_ptr const impl_; WasmEngine(); @@ -43,20 +43,20 @@ class WasmEngine Expected, TER> run(Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName = {}, std::vector const& params = {}, - std::shared_ptr const& imports = {}, - std::shared_ptr const& hfs = {}, + ImportVec const& imports = {}, int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); NotTEC check( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params = {}, - std::shared_ptr const& imports = {}, - std::shared_ptr const& hfs = {}, + ImportVec const& imports = {}, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); // Host functions helper functionality @@ -69,13 +69,13 @@ class WasmEngine //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -std::shared_ptr +ImportVec createWasmImport(HostFunctions& hfs); Expected runEscrowWasm( Bytes const& wasmCode, - std::shared_ptr const& hfs, + HostFunctions& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}, int64_t gasLimit = -1); @@ -83,7 +83,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - std::shared_ptr const& hfs, + HostFunctions& hfs, std::string_view funcName = ESCROW_FUNCTION_NAME, std::vector const& params = {}); diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index 92743756325..10381b3cc55 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -145,12 +145,7 @@ struct ModuleWrapper ModuleWrapper(ModuleWrapper&& o); ModuleWrapper& operator=(ModuleWrapper&& o); - ModuleWrapper( - StorePtr& s, - Bytes const& wasmBin, - bool instantiate, - std::shared_ptr const& imports, - beast::Journal j); + ModuleWrapper(StorePtr& s, Bytes const& wasmBin, bool instantiate, ImportVec const& imports, beast::Journal j); ~ModuleWrapper() = default; operator bool() const; @@ -175,7 +170,7 @@ struct ModuleWrapper private: WasmExternVec - buildImports(StorePtr& s, std::shared_ptr const& imports); + buildImports(StorePtr& s, ImportVec const& imports); }; class WasmiEngine @@ -187,10 +182,6 @@ class WasmiEngine std::mutex m_; // 1 instance mutex - // to ensure lifetime during next executions with the same module - std::shared_ptr imports_; - std::shared_ptr hfs_; - public: WasmiEngine(); ~WasmiEngine() = default; @@ -200,24 +191,24 @@ class WasmiEngine Expected, TER> run(Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, int64_t gas, beast::Journal j); NotTEC check( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, beast::Journal j); std::int64_t - getGas(); + getGas() const; // Host functions helper functionality wasm_trap_t* @@ -228,22 +219,30 @@ class WasmiEngine private: InstanceWrapper const& - getRT(int m = 0, int i = 0); + getRT(int m = 0, int i = 0) const; wmem getMem() const; - int32_t - allocate(int32_t size); - Expected, TER> - runHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, int64_t gas); + runHlp( + Bytes const& wasmCode, + HostFunctions& hfs, + std::string_view funcName, + std::vector const& params, + ImportVec const& imports, + int64_t gas); NotTEC - checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params); + checkHlp( + Bytes const& wasmCode, + HostFunctions& hfs, + std::string_view funcName, + std::vector const& params, + ImportVec const& imports); int - addModule(Bytes const& wasmCode, bool instantiate, int64_t gas); + addModule(Bytes const& wasmCode, bool instantiate, ImportVec const& imports, int64_t gas); void clearModules(); @@ -256,7 +255,7 @@ class WasmiEngine makeModule(Bytes const& wasmCode, WasmExternVec const& imports = {}); FuncInfo - getFunc(std::string_view funcName); + getFunc(std::string_view funcName) const; std::vector convertParams(std::vector const& params); diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp index dfff35727f1..58420e58553 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImpl.cpp @@ -25,7 +25,7 @@ WasmHostFunctionsImpl::updateData(Slice const& data) // ========================================================= Expected -WasmHostFunctionsImpl::checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) +WasmHostFunctionsImpl::checkSignature(Slice const& message, Slice const& signature, Slice const& pubkey) const { if (!publicKeyType(pubkey)) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -35,7 +35,7 @@ WasmHostFunctionsImpl::checkSignature(Slice const& message, Slice const& signatu } Expected -WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) +WasmHostFunctionsImpl::computeSha512HalfHash(Slice const& data) const { auto const hash = sha512Half(data); return hash; diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index abff96a08d4..fca532407ac 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -480,67 +480,67 @@ floatLogImpl(Slice const& x, int32_t mode) // ========================================================= Expected -WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) +WasmHostFunctionsImpl::floatFromInt(int64_t x, int32_t mode) const { return wasm_float::floatFromIntImpl(x, mode); } Expected -WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) +WasmHostFunctionsImpl::floatFromUint(uint64_t x, int32_t mode) const { return wasm_float::floatFromUintImpl(x, mode); } Expected -WasmHostFunctionsImpl::floatSet(int64_t mantissa, int32_t exponent, int32_t mode) +WasmHostFunctionsImpl::floatSet(int64_t mantissa, int32_t exponent, int32_t mode) const { return wasm_float::floatSetImpl(mantissa, exponent, mode); } Expected -WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) +WasmHostFunctionsImpl::floatCompare(Slice const& x, Slice const& y) const { return wasm_float::floatCompareImpl(x, y); } Expected -WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) +WasmHostFunctionsImpl::floatAdd(Slice const& x, Slice const& y, int32_t mode) const { return wasm_float::floatAddImpl(x, y, mode); } Expected -WasmHostFunctionsImpl::floatSubtract(Slice const& x, Slice const& y, int32_t mode) +WasmHostFunctionsImpl::floatSubtract(Slice const& x, Slice const& y, int32_t mode) const { return wasm_float::floatSubtractImpl(x, y, mode); } Expected -WasmHostFunctionsImpl::floatMultiply(Slice const& x, Slice const& y, int32_t mode) +WasmHostFunctionsImpl::floatMultiply(Slice const& x, Slice const& y, int32_t mode) const { return wasm_float::floatMultiplyImpl(x, y, mode); } Expected -WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) +WasmHostFunctionsImpl::floatDivide(Slice const& x, Slice const& y, int32_t mode) const { return wasm_float::floatDivideImpl(x, y, mode); } Expected -WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) +WasmHostFunctionsImpl::floatRoot(Slice const& x, int32_t n, int32_t mode) const { return wasm_float::floatRootImpl(x, n, mode); } Expected -WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) +WasmHostFunctionsImpl::floatPower(Slice const& x, int32_t n, int32_t mode) const { return wasm_float::floatPowerImpl(x, n, mode); } Expected -WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) +WasmHostFunctionsImpl::floatLog(Slice const& x, int32_t mode) const { return wasm_float::floatLogImpl(x, mode); } diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index 163ab4e65f8..f38e77091d7 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -223,7 +223,7 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) if (cacheIdx == 0) { for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) - if (!cache[cacheIdx]) + if (!cache_[cacheIdx]) break; } else @@ -234,8 +234,8 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) if (cacheIdx >= MAX_CACHE) return Unexpected(HostFunctionError::SLOTS_FULL); - cache[cacheIdx] = ctx.view().read(keylet); - if (!cache[cacheIdx]) + cache_[cacheIdx] = ctx_.view().read(keylet); + if (!cache_[cacheIdx]) return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); return cacheIdx + 1; // return 1-based index } @@ -243,13 +243,13 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) // Subsection: top level getters Expected -WasmHostFunctionsImpl::getTxField(SField const& fname) +WasmHostFunctionsImpl::getTxField(SField const& fname) const { - return detail::getAnyFieldData(ctx.tx.peekAtPField(fname)); + return detail::getAnyFieldData(ctx_.tx.peekAtPField(fname)); } Expected -WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) +WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) const { auto const sle = getCurrentLedgerObj(); if (!sle.has_value()) @@ -258,20 +258,20 @@ WasmHostFunctionsImpl::getCurrentLedgerObjField(SField const& fname) } Expected -WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) +WasmHostFunctionsImpl::getLedgerObjField(int32_t cacheIdx, SField const& fname) const { auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) return Unexpected(normalizedIdx.error()); - return detail::getAnyFieldData(cache[normalizedIdx.value()]->peekAtPField(fname)); + return detail::getAnyFieldData(cache_[normalizedIdx.value()]->peekAtPField(fname)); } // Subsection: nested getters Expected -WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) +WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) const { - auto const r = detail::locateField(ctx.tx, locator); + auto const r = detail::locateField(ctx_.tx, locator); if (!r) return Unexpected(r.error()); @@ -279,7 +279,7 @@ WasmHostFunctionsImpl::getTxNestedField(Slice const& locator) } Expected -WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) +WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) const { auto const sle = getCurrentLedgerObj(); if (!sle.has_value()) @@ -293,13 +293,13 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedField(Slice const& locator) } Expected -WasmHostFunctionsImpl::getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) +WasmHostFunctionsImpl::getLedgerObjNestedField(int32_t cacheIdx, Slice const& locator) const { auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) return Unexpected(normalizedIdx.error()); - auto const r = detail::locateField(*cache[normalizedIdx.value()], locator); + auto const r = detail::locateField(*cache_[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); @@ -309,12 +309,12 @@ WasmHostFunctionsImpl::getLedgerObjNestedField(int32_t cacheIdx, Slice const& lo // Subsection: array length getters Expected -WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) +WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) const { if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); - auto const* field = ctx.tx.peekAtPField(fname); + auto const* field = ctx_.tx.peekAtPField(fname); if (detail::noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); @@ -322,7 +322,7 @@ WasmHostFunctionsImpl::getTxArrayLen(SField const& fname) } Expected -WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) +WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) const { if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); @@ -339,7 +339,7 @@ WasmHostFunctionsImpl::getCurrentLedgerObjArrayLen(SField const& fname) } Expected -WasmHostFunctionsImpl::getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) +WasmHostFunctionsImpl::getLedgerObjArrayLen(int32_t cacheIdx, SField const& fname) const { if (fname.fieldType != STI_ARRAY && fname.fieldType != STI_VECTOR256) return Unexpected(HostFunctionError::NO_ARRAY); @@ -348,7 +348,7 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen(int32_t cacheIdx, SField const& fnam if (!normalizedIdx.has_value()) return Unexpected(normalizedIdx.error()); - auto const* field = cache[normalizedIdx.value()]->peekAtPField(fname); + auto const* field = cache_[normalizedIdx.value()]->peekAtPField(fname); if (detail::noField(field)) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); @@ -358,9 +358,9 @@ WasmHostFunctionsImpl::getLedgerObjArrayLen(int32_t cacheIdx, SField const& fnam // Subsection: nested array length getters Expected -WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) +WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) const { - auto const r = detail::locateField(ctx.tx, locator); + auto const r = detail::locateField(ctx_.tx, locator); if (!r) return Unexpected(r.error()); @@ -369,7 +369,7 @@ WasmHostFunctionsImpl::getTxNestedArrayLen(Slice const& locator) } Expected -WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) +WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) const { auto const sle = getCurrentLedgerObj(); if (!sle.has_value()) @@ -383,13 +383,13 @@ WasmHostFunctionsImpl::getCurrentLedgerObjNestedArrayLen(Slice const& locator) } Expected -WasmHostFunctionsImpl::getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) +WasmHostFunctionsImpl::getLedgerObjNestedArrayLen(int32_t cacheIdx, Slice const& locator) const { auto const normalizedIdx = normalizeCacheIndex(cacheIdx); if (!normalizedIdx.has_value()) return Unexpected(normalizedIdx.error()); - auto const r = detail::locateField(*cache[normalizedIdx.value()], locator); + auto const r = detail::locateField(*cache_[normalizedIdx.value()], locator); if (!r) return Unexpected(r.error()); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp index a006b584e41..64afce9d213 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp @@ -6,7 +6,7 @@ namespace xrpl { Expected -WasmHostFunctionsImpl::accountKeylet(AccountID const& account) +WasmHostFunctionsImpl::accountKeylet(AccountID const& account) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -15,7 +15,7 @@ WasmHostFunctionsImpl::accountKeylet(AccountID const& account) } Expected -WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) +WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) const { if (issue1 == issue2) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -29,7 +29,7 @@ WasmHostFunctionsImpl::ammKeylet(Asset const& issue1, Asset const& issue2) } Expected -WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -39,6 +39,7 @@ WasmHostFunctionsImpl::checkKeylet(AccountID const& account, std::uint32_t seq) Expected WasmHostFunctionsImpl::credentialKeylet(AccountID const& subject, AccountID const& issuer, Slice const& credentialType) + const { if (!subject || !issuer) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -52,7 +53,7 @@ WasmHostFunctionsImpl::credentialKeylet(AccountID const& subject, AccountID cons } Expected -WasmHostFunctionsImpl::didKeylet(AccountID const& account) +WasmHostFunctionsImpl::didKeylet(AccountID const& account) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -61,7 +62,7 @@ WasmHostFunctionsImpl::didKeylet(AccountID const& account) } Expected -WasmHostFunctionsImpl::delegateKeylet(AccountID const& account, AccountID const& authorize) +WasmHostFunctionsImpl::delegateKeylet(AccountID const& account, AccountID const& authorize) const { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -72,7 +73,7 @@ WasmHostFunctionsImpl::delegateKeylet(AccountID const& account, AccountID const& } Expected -WasmHostFunctionsImpl::depositPreauthKeylet(AccountID const& account, AccountID const& authorize) +WasmHostFunctionsImpl::depositPreauthKeylet(AccountID const& account, AccountID const& authorize) const { if (!account || !authorize) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -83,7 +84,7 @@ WasmHostFunctionsImpl::depositPreauthKeylet(AccountID const& account, AccountID } Expected -WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -92,7 +93,7 @@ WasmHostFunctionsImpl::escrowKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) +WasmHostFunctionsImpl::lineKeylet(AccountID const& account1, AccountID const& account2, Currency const& currency) const { if (!account1 || !account2) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -106,7 +107,7 @@ WasmHostFunctionsImpl::lineKeylet(AccountID const& account1, AccountID const& ac } Expected -WasmHostFunctionsImpl::mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) +WasmHostFunctionsImpl::mptIssuanceKeylet(AccountID const& issuer, std::uint32_t seq) const { if (!issuer) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -116,7 +117,7 @@ WasmHostFunctionsImpl::mptIssuanceKeylet(AccountID const& issuer, std::uint32_t } Expected -WasmHostFunctionsImpl::mptokenKeylet(MPTID const& mptid, AccountID const& holder) +WasmHostFunctionsImpl::mptokenKeylet(MPTID const& mptid, AccountID const& holder) const { if (!mptid) return Unexpected(HostFunctionError::INVALID_PARAMS); @@ -128,7 +129,7 @@ WasmHostFunctionsImpl::mptokenKeylet(MPTID const& mptid, AccountID const& holder } Expected -WasmHostFunctionsImpl::nftOfferKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::nftOfferKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -137,7 +138,7 @@ WasmHostFunctionsImpl::nftOfferKeylet(AccountID const& account, std::uint32_t se } Expected -WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -146,7 +147,7 @@ WasmHostFunctionsImpl::offerKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::oracleKeylet(AccountID const& account, std::uint32_t documentId) +WasmHostFunctionsImpl::oracleKeylet(AccountID const& account, std::uint32_t documentId) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -155,7 +156,7 @@ WasmHostFunctionsImpl::oracleKeylet(AccountID const& account, std::uint32_t docu } Expected -WasmHostFunctionsImpl::paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) +WasmHostFunctionsImpl::paychanKeylet(AccountID const& account, AccountID const& destination, std::uint32_t seq) const { if (!account || !destination) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -166,7 +167,7 @@ WasmHostFunctionsImpl::paychanKeylet(AccountID const& account, AccountID const& } Expected -WasmHostFunctionsImpl::permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::permissionedDomainKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -175,7 +176,7 @@ WasmHostFunctionsImpl::permissionedDomainKeylet(AccountID const& account, std::u } Expected -WasmHostFunctionsImpl::signersKeylet(AccountID const& account) +WasmHostFunctionsImpl::signersKeylet(AccountID const& account) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -184,7 +185,7 @@ WasmHostFunctionsImpl::signersKeylet(AccountID const& account) } Expected -WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -193,7 +194,7 @@ WasmHostFunctionsImpl::ticketKeylet(AccountID const& account, std::uint32_t seq) } Expected -WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) +WasmHostFunctionsImpl::vaultKeylet(AccountID const& account, std::uint32_t seq) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); diff --git a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp index 37e2796bf67..e7cb31d851c 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp @@ -10,41 +10,41 @@ namespace xrpl { // ========================================================= Expected -WasmHostFunctionsImpl::getLedgerSqn() +WasmHostFunctionsImpl::getLedgerSqn() const { - return ctx.view().seq(); + return ctx_.view().seq(); } Expected -WasmHostFunctionsImpl::getParentLedgerTime() +WasmHostFunctionsImpl::getParentLedgerTime() const { - return ctx.view().parentCloseTime().time_since_epoch().count(); + return ctx_.view().parentCloseTime().time_since_epoch().count(); } Expected -WasmHostFunctionsImpl::getParentLedgerHash() +WasmHostFunctionsImpl::getParentLedgerHash() const { - return ctx.view().header().parentHash; + return ctx_.view().header().parentHash; } Expected -WasmHostFunctionsImpl::getBaseFee() +WasmHostFunctionsImpl::getBaseFee() const { - return ctx.view().fees().base.drops(); + return ctx_.view().fees().base.drops(); } Expected -WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) +WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) const { - return ctx.view().rules().enabled(amendmentId); + return ctx_.view().rules().enabled(amendmentId); } Expected -WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) +WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) const { - auto const& table = ctx.registry.getAmendmentTable(); + auto const& table = ctx_.registry.getAmendmentTable(); auto const amendment = table.find(std::string(amendmentName)); - return ctx.view().rules().enabled(amendment); + return ctx_.view().rules().enabled(amendment); } } // namespace xrpl diff --git a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp index 298cd1f9412..164d4d90fd1 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp @@ -11,7 +11,7 @@ namespace xrpl { // ========================================================= Expected -WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) +WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) const { if (!account) return Unexpected(HostFunctionError::INVALID_ACCOUNT); @@ -19,7 +19,7 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) if (!nftId) return Unexpected(HostFunctionError::INVALID_PARAMS); - auto obj = nft::findToken(ctx.view(), account, nftId); + auto obj = nft::findToken(ctx_.view(), account, nftId); if (!obj) return Unexpected(HostFunctionError::LEDGER_OBJ_NOT_FOUND); @@ -32,7 +32,7 @@ WasmHostFunctionsImpl::getNFT(AccountID const& account, uint256 const& nftId) } Expected -WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) +WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) const { auto const issuer = nft::getIssuer(nftId); if (!issuer) @@ -42,25 +42,25 @@ WasmHostFunctionsImpl::getNFTIssuer(uint256 const& nftId) } Expected -WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) +WasmHostFunctionsImpl::getNFTTaxon(uint256 const& nftId) const { return nft::toUInt32(nft::getTaxon(nftId)); } Expected -WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) +WasmHostFunctionsImpl::getNFTFlags(uint256 const& nftId) const { return nft::getFlags(nftId); } Expected -WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) +WasmHostFunctionsImpl::getNFTTransferFee(uint256 const& nftId) const { return nft::getTransferFee(nftId); } Expected -WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) +WasmHostFunctionsImpl::getNFTSerial(uint256 const& nftId) const { return nft::getSerial(nftId); } diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp index c3b0b955298..14a13a12c88 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp @@ -10,7 +10,7 @@ namespace xrpl { Expected -WasmHostFunctionsImpl::trace(std::string_view const& msg, Slice const& data, bool asHex) +WasmHostFunctionsImpl::trace(std::string_view const& msg, Slice const& data, bool asHex) const { if (!asHex) { @@ -30,28 +30,28 @@ WasmHostFunctionsImpl::trace(std::string_view const& msg, Slice const& data, boo } Expected -WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) +WasmHostFunctionsImpl::traceNum(std::string_view const& msg, int64_t data) const { log(msg, [data] { return data; }); return 0; } Expected -WasmHostFunctionsImpl::traceAccount(std::string_view const& msg, AccountID const& account) +WasmHostFunctionsImpl::traceAccount(std::string_view const& msg, AccountID const& account) const { log(msg, [&account] { return toBase58(account); }); return 0; } Expected -WasmHostFunctionsImpl::traceFloat(std::string_view const& msg, Slice const& data) +WasmHostFunctionsImpl::traceFloat(std::string_view const& msg, Slice const& data) const { log(msg, [&data] { return wasm_float::floatToString(data); }); return 0; } Expected -WasmHostFunctionsImpl::traceAmount(std::string_view const& msg, STAmount const& amount) +WasmHostFunctionsImpl::traceAmount(std::string_view const& msg, STAmount const& amount) const { log(msg, [&amount] { return amount.getFullText(); }); return 0; diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 23edbd2370b..99fe4f74d6f 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -89,21 +89,21 @@ setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) // clang-format on } -std::shared_ptr +ImportVec createWasmImport(HostFunctions& hfs) { - std::shared_ptr i(std::make_shared()); + ImportVec import; - setCommonHostFunctions(&hfs, *i); - WASM_IMPORT_FUNC2(*i, updateData, "update_data", &hfs, 1000); + setCommonHostFunctions(&hfs, import); + WASM_IMPORT_FUNC2(import, updateData, "update_data", &hfs, 1000); - return i; + return import; } Expected runEscrowWasm( Bytes const& wasmCode, - std::shared_ptr const& hfs, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, int64_t gasLimit) @@ -112,7 +112,7 @@ runEscrowWasm( auto& vm = WasmEngine::instance(); // vm.initMaxPages(MAX_PAGES); - auto const ret = vm.run(wasmCode, funcName, params, createWasmImport(*hfs), hfs, gasLimit, hfs->getJournal()); + auto const ret = vm.run(wasmCode, hfs, funcName, params, createWasmImport(hfs), gasLimit, hfs.getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -134,7 +134,7 @@ runEscrowWasm( NotTEC preflightEscrowWasm( Bytes const& wasmCode, - std::shared_ptr const& hfs, + HostFunctions& hfs, std::string_view funcName, std::vector const& params) { @@ -142,14 +142,14 @@ preflightEscrowWasm( auto& vm = WasmEngine::instance(); // vm.initMaxPages(MAX_PAGES); - auto const ret = vm.check(wasmCode, funcName, params, createWasmImport(*hfs), hfs, hfs->getJournal()); + auto const ret = vm.check(wasmCode, hfs, funcName, params, createWasmImport(hfs), hfs.getJournal()); return ret; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -WasmEngine::WasmEngine() : impl(std::make_unique()) +WasmEngine::WasmEngine() : impl_(std::make_unique()) { } @@ -163,39 +163,39 @@ WasmEngine::instance() Expected, TER> WasmEngine::run( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, int64_t gasLimit, beast::Journal j) { - return impl->run(wasmCode, funcName, params, imports, hfs, gasLimit, j); + return impl_->run(wasmCode, hfs, funcName, params, imports, gasLimit, j); } NotTEC WasmEngine::check( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, beast::Journal j) { - return impl->check(wasmCode, funcName, params, imports, hfs, j); + return impl_->check(wasmCode, hfs, funcName, params, imports, j); } void* WasmEngine::newTrap(std::string const& msg) { - return impl->newTrap(msg); + return impl_->newTrap(msg); } // LCOV_EXCL_START beast::Journal WasmEngine::getJournal() const { - return impl->getJournal(); + return impl_->getJournal(); } // LCOV_EXCL_STOP diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index bdf60ac7ec5..7472d554c74 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -233,7 +233,7 @@ ModuleWrapper::ModuleWrapper( StorePtr& s, Bytes const& wasmBin, bool instantiate, - std::shared_ptr const& imports, + ImportVec const& imports, beast::Journal j) : module_(init(s, wasmBin, j)), j_(j) { @@ -321,14 +321,14 @@ makeImpReturn(WasmImportFunc const& imp) } WasmExternVec -ModuleWrapper::buildImports(StorePtr& s, std::shared_ptr const& imports) +ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) { WasmImporttypeVec importTypes; wasm_module_imports(module_.get(), &importTypes.vec_); if (!importTypes.vec_.size) return {}; - if (!imports) + if (imports.empty()) throw std::runtime_error("Missing imports"); WasmExternVec wimports(importTypes.vec_.size); @@ -352,7 +352,7 @@ ModuleWrapper::buildImports(StorePtr& s, std::shared_ptr const& impor // continue; bool impSet = false; - for (auto const& obj : *imports) + for (auto const& obj : imports) { auto const& imp = obj.second; if (imp.name != fieldName) @@ -502,7 +502,7 @@ WasmiEngine::WasmiEngine() : engine_(init()), store_(nullptr, &wasm_store_delete } int -WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) +WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, ImportVec const& imports, int64_t gas) { moduleWrap_.reset(); store_.reset(); // to free the memory before creating new store @@ -520,7 +520,7 @@ WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) // LCOV_EXCL_STOP } - moduleWrap_ = std::make_unique(store_, wasmCode, instantiate, imports_, j_); + moduleWrap_ = std::make_unique(store_, wasmCode, instantiate, imports, j_); if (!moduleWrap_) throw std::runtime_error("can't create module wrapper"); // LCOV_EXCL_LINE @@ -535,7 +535,7 @@ WasmiEngine::addModule(Bytes const& wasmCode, bool instantiate, int64_t gas) // } FuncInfo -WasmiEngine::getFunc(std::string_view funcName) +WasmiEngine::getFunc(std::string_view funcName) const { return moduleWrap_->getFunc(funcName); } @@ -556,19 +556,6 @@ WasmiEngine::convertParams(std::vector const& params) case WT_I64: v.push_back(WASM_I64_VAL(p.of.i64)); break; - // LCOV_EXCL_STOP - case WT_U8V: { - auto mem = getMem(); - if (!mem.s) - throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE - auto const sz = p.of.u8v.sz; - auto const ptr = allocate(sz); - memcpy(mem.p + ptr, p.of.u8v.d, sz); - v.push_back(WASM_I32_VAL(ptr)); - v.push_back(WASM_I32_VAL(sz)); - } - break; - // LCOV_EXCL_START default: throw std::runtime_error("unknown parameter type: " + std::to_string(p.type)); break; @@ -695,22 +682,6 @@ WasmiEngine::call(FuncInfo const& f, std::vector& in, std::int64_t p return call(f, in, std::forward(args)...); } -template -WasmiResult -WasmiEngine::call(FuncInfo const& f, std::vector& in, uint8_t const* d, int32_t sz, Types&&... args) -{ - auto mem = getMem(); - if (!mem.s) - throw std::runtime_error("no memory exported"); // LCOV_EXCL_LINE - - auto const ptr = allocate(sz); - memcpy(mem.p + ptr, d, sz); - - add_param(in, ptr); - add_param(in, static_cast(sz)); - return call(f, in, std::forward(args)...); -} - template WasmiResult WasmiEngine::call(FuncInfo const& f, std::vector& in, Bytes const& p, Types&&... args) @@ -731,26 +702,19 @@ checkImports(ImportVec const& imports, HostFunctions* hfs) Expected, TER> WasmiEngine::run( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, int64_t gas, beast::Journal j) { j_ = j; - if (!wasmCode.empty()) - { // save values for reuse - imports_ = imports; - hfs_ = hfs; - } - try { - if (imports_) - checkImports(*imports_, hfs.get()); - return runHlp(wasmCode, funcName, params, gas); + checkImports(imports, &hfs); + return runHlp(wasmCode, hfs, funcName, params, imports, gas); } catch (std::exception const& e) { @@ -766,22 +730,29 @@ WasmiEngine::run( } Expected, TER> -WasmiEngine::runHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params, int64_t gas) +WasmiEngine::runHlp( + Bytes const& wasmCode, + HostFunctions& hfs, + std::string_view funcName, + std::vector const& params, + ImportVec const& imports, + int64_t gas) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); + if (wasmCode.empty()) + throw std::runtime_error("empty module"); + if (!hfs.checkSelf()) + throw std::runtime_error("hfs isn't clean"); + // Create and instantiate the module. - if (!wasmCode.empty()) - { - [[maybe_unused]] int const m = addModule(wasmCode, true, gas); - } + [[maybe_unused]] int const m = addModule(wasmCode, true, imports, gas); if (!moduleWrap_ || !moduleWrap_->instanceWrap_) throw std::runtime_error("no instance"); // LCOV_EXCL_LINE - if (hfs_) - hfs_->setRT(&getRT()); + hfs.setRT(&getRT()); // Call main auto const f = getFunc(!funcName.empty() ? funcName : "_start"); @@ -822,25 +793,18 @@ WasmiEngine::runHlp(Bytes const& wasmCode, std::string_view funcName, std::vecto NotTEC WasmiEngine::check( Bytes const& wasmCode, + HostFunctions& hfs, std::string_view funcName, std::vector const& params, - std::shared_ptr const& imports, - std::shared_ptr const& hfs, + ImportVec const& imports, beast::Journal j) { j_ = j; - if (!wasmCode.empty()) - { - imports_ = imports; - hfs_ = hfs; - } - try { - if (imports_) - checkImports(*imports_, hfs_.get()); - return checkHlp(wasmCode, funcName, params); + checkImports(imports, &hfs); + return checkHlp(wasmCode, hfs, funcName, params, imports); } catch (std::exception const& e) { @@ -857,7 +821,12 @@ WasmiEngine::check( } NotTEC -WasmiEngine::checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vector const& params) +WasmiEngine::checkHlp( + Bytes const& wasmCode, + HostFunctions& hfs, + std::string_view funcName, + std::vector const& params, + ImportVec const& imports) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); @@ -866,7 +835,7 @@ WasmiEngine::checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vec if (wasmCode.empty()) throw std::runtime_error("empty nodule"); - int const m = addModule(wasmCode, false, -1); + int const m = addModule(wasmCode, false, imports, -1); if ((m < 0) || !moduleWrap_) throw std::runtime_error("no module"); // LCOV_EXCL_LINE @@ -883,7 +852,7 @@ WasmiEngine::checkHlp(Bytes const& wasmCode, std::string_view funcName, std::vec // LCOV_EXCL_START std::int64_t -WasmiEngine::getGas() +WasmiEngine::getGas() const { return moduleWrap_ ? moduleWrap_->getGas() : -1; } @@ -896,32 +865,13 @@ WasmiEngine::getMem() const } InstanceWrapper const& -WasmiEngine::getRT(int m, int i) +WasmiEngine::getRT(int m, int i) const { if (!moduleWrap_) throw std::runtime_error("no module"); return moduleWrap_->getInstance(i); } -int32_t -WasmiEngine::allocate(int32_t sz) -{ - if (sz <= 0) - throw std::runtime_error("can't allocate memory, " + std::to_string(sz) + " bytes"); - - auto res = call<1>(W_ALLOC, sz); - - if (res.f || !res.r.vec_.size || (res.r.vec_.data[0].kind != WASM_I32)) - throw std::runtime_error("can't allocate memory, " + std::to_string(sz) + " bytes"); // LCOV_EXCL_LINE - - int32_t const p = res.r.vec_.data[0].of.i32; - auto const mem = getMem(); - if (p <= 0 || p + sz > mem.s) - throw std::runtime_error("invalid memory allocation, " + std::to_string(sz) + " bytes"); - - return p; -} - wasm_trap_t* WasmiEngine::newTrap(std::string const& txt) { From 50a74b899d69d765ef36dc46ba27943645302ae8 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 2 Mar 2026 14:47:47 -0500 Subject: [PATCH 186/212] add defensive check for sfData length (#6449) --- src/xrpld/app/tx/detail/Escrow.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/xrpld/app/tx/detail/Escrow.cpp b/src/xrpld/app/tx/detail/Escrow.cpp index bfce567f555..a126ad750ea 100644 --- a/src/xrpld/app/tx/detail/Escrow.cpp +++ b/src/xrpld/app/tx/detail/Escrow.cpp @@ -1149,6 +1149,11 @@ EscrowFinish::doApply() if (auto const& data = ledgerDataProvider->getData(); data.has_value()) { + if (data->size() > maxWasmDataLength) + { + // should already be checked in the updateData host function + return tecINTERNAL; // LCOV_EXCL_LINE + } slep->setFieldVL(sfData, makeSlice(*data)); ctx_.view().update(slep); } From 4df7d1a4bbd75bd2f346eac8d29d58f05f5e1e13 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 2 Mar 2026 16:48:02 -0400 Subject: [PATCH 187/212] rename variable --- src/xrpld/app/wasm/detail/WasmVM.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index a23a2f89720..7a3e270c20a 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -92,12 +92,12 @@ setCommonHostFunctions(HostFunctions* hfs, ImportVec& i) ImportVec createWasmImport(HostFunctions& hfs) { - ImportVec import; + ImportVec i; - setCommonHostFunctions(&hfs, import); - WASM_IMPORT_FUNC2(import, updateData, "update_data", &hfs, 1000); + setCommonHostFunctions(&hfs, i); + WASM_IMPORT_FUNC2(i, updateData, "update_data", &hfs, 1000); - return import; + return i; } Expected From bc5ec3c9624ae8505a66703597e51012871429b7 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 4 Mar 2026 09:30:09 -0400 Subject: [PATCH 188/212] assorted fixes (#6376) --- include/xrpl/protocol/Protocol.h | 9 +- src/test/app/HostFuncImpl_test.cpp | 37 ++++++++ src/test/app/Wasm_test.cpp | 93 +++++++++++-------- src/xrpld/app/wasm/WasmVM.h | 6 +- src/xrpld/app/wasm/WasmiVM.h | 6 +- .../app/wasm/detail/HostFuncImplGetter.cpp | 4 +- src/xrpld/app/wasm/detail/WasmVM.cpp | 10 +- src/xrpld/app/wasm/detail/WasmiVM.cpp | 11 ++- 8 files changed, 116 insertions(+), 60 deletions(-) diff --git a/include/xrpl/protocol/Protocol.h b/include/xrpl/protocol/Protocol.h index 1a15cffbf5b..6a3b81f5ae2 100644 --- a/include/xrpl/protocol/Protocol.h +++ b/include/xrpl/protocol/Protocol.h @@ -251,12 +251,11 @@ std::uint8_t constexpr vaultMaximumIOUScale = 18; * another vault; counted from 0 */ std::uint8_t constexpr maxAssetCheckDepth = 5; -/** The maximum length of a Data field in Escrow object that can be updated by - * Wasm code */ -std::size_t constexpr maxWasmDataLength = 4 * 1024; +/** Maximum length of a Data field in Escrow object that can be updated by WASM code. */ +std::size_t constexpr maxWasmDataLength = 4 * 1024; // 4KB -/** The maximum length of a parameters passed from Wasm code*/ -std::size_t constexpr maxWasmParamLength = 1024; +/** Maximum length of parameters passed from WASM code to host functions. */ +std::size_t constexpr maxWasmParamLength = 1024; // 1KB /** A ledger index. */ using LedgerIndex = std::uint32_t; diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 91c80eabe29..dbcf9266fd0 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -607,6 +607,18 @@ struct HostFuncImpl_test : public beast::unit_test::suite {sfCredentialIDs.fieldCode, 1}, // index 1 does not exist HostFunctionError::INDEX_OUT_OF_BOUNDS); + // Locator for negative index (STArray) + expectError( + {sfMemos.fieldCode, + -1, // negative index + sfMemoData.fieldCode}, + HostFunctionError::INDEX_OUT_OF_BOUNDS); + + // Locator for negative index (STVector256) + expectError( + {sfCredentialIDs.fieldCode, -1}, // negative index + HostFunctionError::INDEX_OUT_OF_BOUNDS); + // Locator for non-existent nested field expectError( {sfMemos.fieldCode, 0, sfURI.fieldCode}, // sfURI does not exist in the memo @@ -626,6 +638,31 @@ struct HostFuncImpl_test : public beast::unit_test::suite field_code(20000, 20000)}, HostFunctionError::INVALID_FIELD); + // Locator for negative base sfield code (-1 = sfInvalid, exists in map but not in tx) + expectError( + {-1, // sfInvalid's field code + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for zero base sfield code (0 = sfGeneric, exists in map but not in tx) + expectError( + {0, // sfGeneric's field code + 0, + sfAccount.fieldCode}, + HostFunctionError::FIELD_NOT_FOUND); + + // Locator for very negative base sfield code (not in knownCodeToField map) + expectError( + {std::numeric_limits::min(), 0, sfAccount.fieldCode}, + HostFunctionError::INVALID_FIELD); + + // Locator for negative nested sfield code in STObject context + // (sfMemos[0] is an STObject, then -1 is looked up as SField) + expectError( + {sfMemos.fieldCode, 0, -1}, // -1 = sfInvalid, exists in map but not in memo object + HostFunctionError::FIELD_NOT_FOUND); + // Locator for STArray expectError({sfMemos.fieldCode}, HostFunctionError::NOT_LEAF_FIELD); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 093698bc1df..a6fc86a247a 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -38,7 +38,7 @@ runFinishFunction(std::string const& code) auto& engine = WasmEngine::instance(); auto const wasm = hexToBytes(code); HostFunctions hfs; - auto const re = engine.run(wasm, hfs, "finish"); + auto const re = engine.run(wasm, hfs, 10'000'000, "finish"); if (re.has_value()) { return std::optional(re->result); @@ -112,7 +112,7 @@ struct Wasm_test : public beast::unit_test::suite ImportVec imports; WasmImpFunc(imports, "func-add", reinterpret_cast(&Add), &hfs); - auto re = vm.run(wasm, hfs, "addTwo", wasmParams(1234, 5678), imports); + auto re = vm.run(wasm, hfs, 10'000'000, "addTwo", wasmParams(1234, 5678), imports); // if (res) printf("invokeAdd get the result: %d\n", res.value()); @@ -133,7 +133,7 @@ struct Wasm_test : public beast::unit_test::suite auto wasm = hexToBytes("00000000"); std::string funcName("mock_escrow"); - auto re = runEscrowWasm(wasm, hfs, funcName, {}, 15); + auto re = runEscrowWasm(wasm, hfs, 15, funcName, {}); BEAST_EXPECT(!re); } @@ -183,7 +183,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - ledgerSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + ledgerSqnWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imports, env.journal); checkResult(re, 0, 440); @@ -191,7 +191,7 @@ struct Wasm_test : public beast::unit_test::suite env.close(); // empty module, throwing exception - re = engine.run({}, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + re = engine.run({}, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imports, env.journal); BEAST_EXPECT(!re); env.close(); } @@ -205,7 +205,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); HostFunctions hfs; - auto const re = engine.run(fibWasm, hfs, "fib", wasmParams(10)); + auto const re = engine.run(fibWasm, hfs, 10'000'000, "fib", wasmParams(10)); checkResult(re, 55, 1'137); } @@ -229,7 +229,7 @@ struct Wasm_test : public beast::unit_test::suite i.second.gas = 0; auto re = engine.run( - allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 1'000'000, env.journal); + allHostFuncWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imp, env.journal); checkResult(re, 1, 27'080); @@ -251,7 +251,7 @@ struct Wasm_test : public beast::unit_test::suite auto const imp = createWasmImport(hfs); auto re = engine.run( - allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 1'000'000, env.journal); + allHostFuncWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imp, env.journal); checkResult(re, 1, 66'340); @@ -268,7 +268,7 @@ struct Wasm_test : public beast::unit_test::suite auto const imp = createWasmImport(hfs); auto re = - engine.run(allHostFuncWasm, hfs, ESCROW_FUNCTION_NAME, {}, imp, 200, env.journal); + engine.run(allHostFuncWasm, hfs, 200, ESCROW_FUNCTION_NAME, {}, imp, env.journal); if (BEAST_EXPECT(!re)) { @@ -291,14 +291,31 @@ struct Wasm_test : public beast::unit_test::suite Env env{*this}; { TestHostFunctions hfs(env, 0); - auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); checkResult(re, 1, 66'340); } + { + // Invalid gas limit (0) should be rejected (boundary condition) + TestHostFunctions hfs(env, 0); + auto re = runEscrowWasm(allHFWasm, hfs, -1, ESCROW_FUNCTION_NAME, {}); + BEAST_EXPECT(!re.has_value()); + BEAST_EXPECT(re.error() == temBAD_AMOUNT); + } + + { + // Invalid gas limit (-1) should be rejected + TestHostFunctions hfs(env, 0); + auto re = runEscrowWasm(allHFWasm, hfs, 0, ESCROW_FUNCTION_NAME, {}); + BEAST_EXPECT(!re.has_value()); + BEAST_EXPECT(re.error() == temBAD_AMOUNT); + } + { // max() gas TestHostFunctions hfs(env, 0); - auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, -1); + auto re = runEscrowWasm( + allHFWasm, hfs, std::numeric_limits::max(), ESCROW_FUNCTION_NAME, {}); checkResult(re, 1, 66'340); } @@ -316,7 +333,7 @@ struct Wasm_test : public beast::unit_test::suite }; FieldNotFoundHostFunctions hfs(env); - auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); checkResult(re, -201, 28'965); } @@ -334,7 +351,7 @@ struct Wasm_test : public beast::unit_test::suite }; OversizedFieldHostFunctions hfs(env); - auto re = runEscrowWasm(allHFWasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto re = runEscrowWasm(allHFWasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); checkResult(re, -201, 28'965); } @@ -344,7 +361,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctionsSink hfs(env); std::string funcName("finish"); - auto re = runEscrowWasm(deepWasm, hfs, funcName, {}, 1'000'000'000); + auto re = runEscrowWasm(deepWasm, hfs, 1'000'000'000, funcName, {}); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() // << std::endl; @@ -372,7 +389,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hfs(env, 0); // infinite loop should be caught and fail - auto const re = runEscrowWasm(infiniteLoopWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(infiniteLoopWasm, hfs, 1'000'000, funcName, {}); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -389,7 +406,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - lgrSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + lgrSqnWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imports, env.journal); BEAST_EXPECT(!re); } @@ -405,7 +422,7 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); auto re = engine.run( - lgrSqnWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + lgrSqnWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imports, env.journal); BEAST_EXPECT(!re); } @@ -418,7 +435,7 @@ struct Wasm_test : public beast::unit_test::suite WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hfs); auto& engine = WasmEngine::instance(); - auto re = engine.run(lgrSqnWasm, hfs, "func1", {}, imports, 1'000'000, env.journal); + auto re = engine.run(lgrSqnWasm, hfs, 1'000'000, "func1", {}, imports, env.journal); BEAST_EXPECT(!re); } @@ -438,7 +455,7 @@ struct Wasm_test : public beast::unit_test::suite auto const floatTestWasm = hexToBytes(floatTestsWasmHex); TestHostFunctions hfs(env, 0); - auto re = runEscrowWasm(floatTestWasm, hfs, funcName, {}, 200'000); + auto re = runEscrowWasm(floatTestWasm, hfs, 200'000, funcName, {}); checkResult(re, 1, 110'699); env.close(); } @@ -447,7 +464,7 @@ struct Wasm_test : public beast::unit_test::suite auto const float0Wasm = hexToBytes(float0Hex); TestHostFunctions hfs(env, 0); - auto re = runEscrowWasm(float0Wasm, hfs, funcName, {}, 100'000); + auto re = runEscrowWasm(float0Wasm, hfs, 100'000, funcName, {}); checkResult(re, 1, 4'259); env.close(); } @@ -466,7 +483,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hfs(env, 0); auto const allowance = 202'724; - auto re = runEscrowWasm(codecovWasm, hfs, ESCROW_FUNCTION_NAME, {}, allowance); + auto re = runEscrowWasm(codecovWasm, hfs, allowance, ESCROW_FUNCTION_NAME, {}); checkResult(re, 1, allowance); } @@ -485,7 +502,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 set constant, opcode disabled exception - auto const re = runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(disabledFloatWasm, hfs, 1'000'000, funcName, {}); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -495,7 +512,7 @@ struct Wasm_test : public beast::unit_test::suite { // f32 add, can't create module exception disabledFloatWasm[0x117] = 0x92; - auto const re = runEscrowWasm(disabledFloatWasm, hfs, funcName, {}, 1'000'000); + auto const re = runEscrowWasm(disabledFloatWasm, hfs, 1'000'000, funcName, {}); if (BEAST_EXPECT(!re.has_value())) { BEAST_EXPECT(re.error() == tecFAILED_PROCESSING); @@ -602,7 +619,7 @@ struct Wasm_test : public beast::unit_test::suite BEAST_EXPECTS(checkRes == tesSUCCESS, std::to_string(TERtoInt(checkRes))); auto re = engine.run( - startLoopWasm, hfs, ESCROW_FUNCTION_NAME, {}, imports, 1'000'000, env.journal); + startLoopWasm, hfs, 1'000'000, ESCROW_FUNCTION_NAME, {}, imports, env.journal); BEAST_EXPECTS(re.error() == tecFAILED_PROCESSING, std::to_string(TERtoInt(re.error()))); } @@ -624,7 +641,7 @@ struct Wasm_test : public beast::unit_test::suite // Can be checked through codecov auto& engine = WasmEngine::instance(); - auto re = engine.run(badAlignWasm, hfs, "test", {}, imports, 1'000'000, env.journal); + auto re = engine.run(badAlignWasm, hfs, 1'000'000, "test", {}, imports, env.journal); if (BEAST_EXPECTS(re, transToken(re.error()))) { BEAST_EXPECTS(re->result == 0x684f7941, std::to_string(re->result)); @@ -653,7 +670,7 @@ struct Wasm_test : public beast::unit_test::suite "071302066d656d6f727902000666696e69736800000a0a01" "08004280808080100b"; auto const wasm = hexToBytes(wasmHex); - auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); BEAST_EXPECT(!re); } @@ -669,7 +686,7 @@ struct Wasm_test : public beast::unit_test::suite "0061736d01000000010401600000030201000503010001071302066d656d6f" "727902000666696e69736800000a050103000f0b"; auto const wasm = hexToBytes(wasmHex); - auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); BEAST_EXPECT(!re); } @@ -684,7 +701,7 @@ struct Wasm_test : public beast::unit_test::suite "6d6f727902000666696e69736800000a10010e0041808080800141ff818080" "010b"; auto const wasm = hexToBytes(wasmHex); - auto const re = runEscrowWasm(wasm, hfs, ESCROW_FUNCTION_NAME, {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); BEAST_EXPECT(!re); } } @@ -712,32 +729,32 @@ struct Wasm_test : public beast::unit_test::suite // good params, module is working properly { - auto const re = runEscrowWasm(wasm, hfs, "test2", wasmParams(2, 10), 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, "test2", wasmParams(2, 10)); BEAST_EXPECT(re && re->result == 1001 && re->cost == 37); } // no params { - auto const re = runEscrowWasm(wasm, hfs, "test1", {}, 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, "test1", {}); BEAST_EXPECT(!re); } // more params { - auto const re = runEscrowWasm(wasm, hfs, "test1", wasmParams(0, 1), 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, "test1", wasmParams(0, 1)); BEAST_EXPECT(!re); } // less params { - auto const re = runEscrowWasm(wasm, hfs, "test2", wasmParams(1), 100'000); + auto const re = runEscrowWasm(wasm, hfs, 100'000, "test2", wasmParams(1)); BEAST_EXPECT(!re); } // invalid type { auto const re = - runEscrowWasm(wasm, hfs, "test1", wasmParams(std::int64_t(15)), 100'000); + runEscrowWasm(wasm, hfs, 100'000, "test1", wasmParams(std::int64_t(15))); BEAST_EXPECT(!re); } } @@ -817,14 +834,14 @@ struct Wasm_test : public beast::unit_test::suite auto& engine = WasmEngine::instance(); { - auto re = engine.run(params1k, hfs, "test", params, imports, 1'000'000, env.journal); + auto re = engine.run(params1k, hfs, 1'000'000, "test", params, imports, env.journal); BEAST_EXPECT(re && re->result == 999000); } // add 1 more parameter, module can't be created now params.push_back({.type = WT_I32, .of = {.i32 = 2 * 1000}}); { - auto re = engine.run(params1k1, hfs, "test", params, imports, 1'000'000, env.journal); + auto re = engine.run(params1k1, hfs, 1'000'000, "test", params, imports, env.journal); BEAST_EXPECT(!re); } @@ -832,7 +849,7 @@ struct Wasm_test : public beast::unit_test::suite auto const locals10k = hexToBytes(locals10kHex); { auto re = engine.run( - locals10k, hfs, "test", wasmParams(0, 1), imports, 1'000'000, env.journal); + locals10k, hfs, 1'000'000, "test", wasmParams(0, 1), imports, env.journal); BEAST_EXPECT(re && re->result == 890'489'442); } @@ -840,7 +857,7 @@ struct Wasm_test : public beast::unit_test::suite auto const functions5k = hexToBytes(functions5kHex); { auto re = engine.run( - functions5k, hfs, "test0001", wasmParams(2, 3), imports, 1'000'000, env.journal); + functions5k, hfs, 1'000'000, "test0001", wasmParams(2, 3), imports, env.journal); BEAST_EXPECT(re && re->result == 5); } @@ -889,7 +906,7 @@ struct Wasm_test : public beast::unit_test::suite std::source_location const location = std::source_location::current()) { auto const lineStr = " (" + std::to_string(location.line()) + ")"; auto re = - engine.run(code, hfs, "all_instructions", {}, imports, 1'000'000, env.journal); + engine.run(code, hfs, 1'000'000, "all_instructions", {}, imports, env.journal); if (BEAST_EXPECTS(re.has_value() == good, transToken(re.error()) + lineStr) && good) BEAST_EXPECTS(re->cost == cost, std::to_string(re->cost) + lineStr); }; diff --git a/src/xrpld/app/wasm/WasmVM.h b/src/xrpld/app/wasm/WasmVM.h index 27b1cc38c90..03ef79ff6f1 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/src/xrpld/app/wasm/WasmVM.h @@ -44,10 +44,10 @@ class WasmEngine Expected, TER> run(Bytes const& wasmCode, HostFunctions& hfs, + int64_t gasLimit, std::string_view funcName = {}, std::vector const& params = {}, ImportVec const& imports = {}, - int64_t gasLimit = -1, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); NotTEC @@ -76,9 +76,9 @@ Expected runEscrowWasm( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gasLimit, std::string_view funcName = ESCROW_FUNCTION_NAME, - std::vector const& params = {}, - int64_t gasLimit = -1); + std::vector const& params = {}); NotTEC preflightEscrowWasm( diff --git a/src/xrpld/app/wasm/WasmiVM.h b/src/xrpld/app/wasm/WasmiVM.h index b49517633c5..28e3b8d9d7b 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/src/xrpld/app/wasm/WasmiVM.h @@ -208,10 +208,10 @@ class WasmiEngine Expected, TER> run(Bytes const& wasmCode, HostFunctions& hfs, + int64_t gas, std::string_view funcName, std::vector const& params, ImportVec const& imports, - int64_t gas, beast::Journal j); NotTEC @@ -244,10 +244,10 @@ class WasmiEngine runHlp( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gas, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - int64_t gas); + ImportVec const& imports); NotTEC checkHlp( diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp index f38e77091d7..a1bb979a1ec 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp @@ -162,7 +162,7 @@ locateField(STObject const& obj, Slice const& locator) if (STI_ARRAY == field->getSType()) { auto const* arr = static_cast(field); - if (sfieldCode >= arr->size()) + if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, arr->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](sfieldCode)); } @@ -180,7 +180,7 @@ locateField(STObject const& obj, Slice const& locator) else if (STI_VECTOR256 == field->getSType()) { auto const* v = static_cast(field); - if (sfieldCode >= v->size()) + if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, v->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); return FieldValue(&(v->operator[](sfieldCode))); } diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/xrpld/app/wasm/detail/WasmVM.cpp index 7a3e270c20a..4064a95924f 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmVM.cpp @@ -104,16 +104,16 @@ Expected runEscrowWasm( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gasLimit, std::string_view funcName, - std::vector const& params, - int64_t gasLimit) + std::vector const& params) { // create VM and set cost limit auto& vm = WasmEngine::instance(); // vm.initMaxPages(MAX_PAGES); auto const ret = - vm.run(wasmCode, hfs, funcName, params, createWasmImport(hfs), gasLimit, hfs.getJournal()); + vm.run(wasmCode, hfs, gasLimit, funcName, params, createWasmImport(hfs), hfs.getJournal()); // std::cout << "runEscrowWasm, mod size: " << wasmCode.size() // << ", gasLimit: " << gasLimit << ", funcName: " << funcName; @@ -166,13 +166,13 @@ Expected, TER> WasmEngine::run( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gasLimit, std::string_view funcName, std::vector const& params, ImportVec const& imports, - int64_t gasLimit, beast::Journal j) { - return impl_->run(wasmCode, hfs, funcName, params, imports, gasLimit, j); + return impl_->run(wasmCode, hfs, gasLimit, funcName, params, imports, j); } NotTEC diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/xrpld/app/wasm/detail/WasmiVM.cpp index 50d53b743a8..a29a58aa350 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/xrpld/app/wasm/detail/WasmiVM.cpp @@ -725,18 +725,21 @@ Expected, TER> WasmiEngine::run( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gas, std::string_view funcName, std::vector const& params, ImportVec const& imports, - int64_t gas, beast::Journal j) { j_ = j; + if (gas <= 0) + return Unexpected(temBAD_AMOUNT); + try { checkImports(imports, &hfs); - return runHlp(wasmCode, hfs, funcName, params, imports, gas); + return runHlp(wasmCode, hfs, gas, funcName, params, imports); } catch (std::exception const& e) { @@ -755,10 +758,10 @@ Expected, TER> WasmiEngine::runHlp( Bytes const& wasmCode, HostFunctions& hfs, + int64_t gas, std::string_view funcName, std::vector const& params, - ImportVec const& imports, - int64_t gas) + ImportVec const& imports) { // currently only 1 module support, possible parallel UT run std::lock_guard lg(m_); From 5afe8cc321ada60ea1c3ed7bbbc0b3fb129deb70 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 4 Mar 2026 11:30:33 -0500 Subject: [PATCH 189/212] Fix clang tidy (#6463) * Fix clang tidy * Add exponent overflow test --- src/test/app/HostFuncImpl_test.cpp | 6 ++++++ src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index dbcf9266fd0..32379495dc5 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -2252,6 +2252,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const result = hfs.floatSet(10, -1, 0); BEAST_EXPECT(result) && BEAST_EXPECT(*result == float1); } + + { + auto const result = hfs.floatSet(1, Number::maxExponent + normalExp + 1, 0); + BEAST_EXPECT(!result) && + BEAST_EXPECT(result.error() == HostFunctionError::FLOAT_COMPUTATION_ERROR); + } } void diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp index f66e01d1155..7e1b0382b10 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp @@ -221,6 +221,7 @@ floatFromIntImpl(int64_t x, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -242,6 +243,7 @@ floatFromUintImpl(uint64_t x, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -262,6 +264,7 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) } catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } @@ -284,6 +287,7 @@ floatCompareImpl(Slice const& x, Slice const& y) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -311,6 +315,7 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -337,6 +342,7 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -363,6 +369,7 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -388,6 +395,7 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) } catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } @@ -415,6 +423,7 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -445,6 +454,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP @@ -470,6 +480,7 @@ floatLogImpl(Slice const& x, int32_t mode) // LCOV_EXCL_START catch (...) { + return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); } return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_STOP From a9ebf786c63d656778360ab8094cba9c226dd79e Mon Sep 17 00:00:00 2001 From: Jingchen Date: Wed, 4 Mar 2026 20:21:51 +0000 Subject: [PATCH 190/212] Modularise wasm (#6441) Signed-off-by: JCW --- {src/xrpld/app => include/xrpl/tx}/wasm/HostFunc.h | 3 +-- {src/xrpld/app => include/xrpl/tx}/wasm/HostFuncImpl.h | 3 +-- {src/xrpld/app => include/xrpl/tx}/wasm/HostFuncWrapper.h | 2 +- {src/xrpld/app => include/xrpl/tx}/wasm/ParamsHelper.h | 0 {src/xrpld/app => include/xrpl/tx}/wasm/README.md | 0 {src/xrpld/app => include/xrpl/tx}/wasm/WasmVM.h | 2 +- {src/xrpld/app => include/xrpl/tx}/wasm/WasmiVM.h | 2 +- .../app/wasm/detail => libxrpl/tx/wasm}/HostFuncImpl.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncImplFloat.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncImplGetter.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncImplKeylet.cpp | 3 +-- .../tx/wasm}/HostFuncImplLedgerHeader.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncImplNFT.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncImplTrace.cpp | 3 +-- .../wasm/detail => libxrpl/tx/wasm}/HostFuncWrapper.cpp | 5 ++--- src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/WasmVM.cpp | 7 +++---- src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/WasmiVM.cpp | 3 +-- src/test/app/HostFuncImpl_test.cpp | 3 +-- src/test/app/TestHostFunctions.h | 5 ++--- src/test/app/Wasm_test.cpp | 2 +- 20 files changed, 22 insertions(+), 36 deletions(-) rename {src/xrpld/app => include/xrpl/tx}/wasm/HostFunc.h (99%) rename {src/xrpld/app => include/xrpl/tx}/wasm/HostFuncImpl.h (99%) rename {src/xrpld/app => include/xrpl/tx}/wasm/HostFuncWrapper.h (99%) rename {src/xrpld/app => include/xrpl/tx}/wasm/ParamsHelper.h (100%) rename {src/xrpld/app => include/xrpl/tx}/wasm/README.md (100%) rename {src/xrpld/app => include/xrpl/tx}/wasm/WasmVM.h (98%) rename {src/xrpld/app => include/xrpl/tx}/wasm/WasmiVM.h (99%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImpl.cpp (96%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplFloat.cpp (99%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplGetter.cpp (99%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplKeylet.cpp (99%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplLedgerHeader.cpp (96%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplNFT.cpp (97%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncImplTrace.cpp (97%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/HostFuncWrapper.cpp (99%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/WasmVM.cpp (98%) rename src/{xrpld/app/wasm/detail => libxrpl/tx/wasm}/WasmiVM.cpp (99%) diff --git a/src/xrpld/app/wasm/HostFunc.h b/include/xrpl/tx/wasm/HostFunc.h similarity index 99% rename from src/xrpld/app/wasm/HostFunc.h rename to include/xrpl/tx/wasm/HostFunc.h index 63269bc98b4..a3a26cfbaf6 100644 --- a/src/xrpld/app/wasm/HostFunc.h +++ b/include/xrpl/tx/wasm/HostFunc.h @@ -1,7 +1,5 @@ #pragma once -#include - #include #include #include @@ -10,6 +8,7 @@ #include #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/HostFuncImpl.h b/include/xrpl/tx/wasm/HostFuncImpl.h similarity index 99% rename from src/xrpld/app/wasm/HostFuncImpl.h rename to include/xrpl/tx/wasm/HostFuncImpl.h index da5e0e0708b..6992e1f5231 100644 --- a/src/xrpld/app/wasm/HostFuncImpl.h +++ b/include/xrpl/tx/wasm/HostFuncImpl.h @@ -1,8 +1,7 @@ #pragma once -#include - #include +#include namespace xrpl { class WasmHostFunctionsImpl : public HostFunctions diff --git a/src/xrpld/app/wasm/HostFuncWrapper.h b/include/xrpl/tx/wasm/HostFuncWrapper.h similarity index 99% rename from src/xrpld/app/wasm/HostFuncWrapper.h rename to include/xrpl/tx/wasm/HostFuncWrapper.h index 7dfba17f38c..444c3be97c3 100644 --- a/src/xrpld/app/wasm/HostFuncWrapper.h +++ b/include/xrpl/tx/wasm/HostFuncWrapper.h @@ -1,6 +1,6 @@ #pragma once -#include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/ParamsHelper.h b/include/xrpl/tx/wasm/ParamsHelper.h similarity index 100% rename from src/xrpld/app/wasm/ParamsHelper.h rename to include/xrpl/tx/wasm/ParamsHelper.h diff --git a/src/xrpld/app/wasm/README.md b/include/xrpl/tx/wasm/README.md similarity index 100% rename from src/xrpld/app/wasm/README.md rename to include/xrpl/tx/wasm/README.md diff --git a/src/xrpld/app/wasm/WasmVM.h b/include/xrpl/tx/wasm/WasmVM.h similarity index 98% rename from src/xrpld/app/wasm/WasmVM.h rename to include/xrpl/tx/wasm/WasmVM.h index 03ef79ff6f1..b872adfc954 100644 --- a/src/xrpld/app/wasm/WasmVM.h +++ b/include/xrpl/tx/wasm/WasmVM.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include diff --git a/src/xrpld/app/wasm/WasmiVM.h b/include/xrpl/tx/wasm/WasmiVM.h similarity index 99% rename from src/xrpld/app/wasm/WasmiVM.h rename to include/xrpl/tx/wasm/WasmiVM.h index 28e3b8d9d7b..bd37b4e42e6 100644 --- a/src/xrpld/app/wasm/WasmiVM.h +++ b/include/xrpl/tx/wasm/WasmiVM.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include diff --git a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp b/src/libxrpl/tx/wasm/HostFuncImpl.cpp similarity index 96% rename from src/xrpld/app/wasm/detail/HostFuncImpl.cpp rename to src/libxrpl/tx/wasm/HostFuncImpl.cpp index 77a9d1e3539..7f6dd4255c4 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImpl.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImpl.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp similarity index 99% rename from src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp rename to src/libxrpl/tx/wasm/HostFuncImplFloat.cpp index 7e1b0382b10..030148da143 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplFloat.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include #ifdef _DEBUG // #define DEBUG_OUTPUT 1 diff --git a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp similarity index 99% rename from src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp rename to src/libxrpl/tx/wasm/HostFuncImplGetter.cpp index a1bb979a1ec..1344d4f5bca 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplGetter.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp b/src/libxrpl/tx/wasm/HostFuncImplKeylet.cpp similarity index 99% rename from src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp rename to src/libxrpl/tx/wasm/HostFuncImplKeylet.cpp index 559267b3f07..8953790464f 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplKeylet.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplKeylet.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp b/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp similarity index 96% rename from src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp rename to src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp index e7cb31d851c..bb7e25614a2 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplLedgerHeader.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp similarity index 97% rename from src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp rename to src/libxrpl/tx/wasm/HostFuncImplNFT.cpp index 164d4d90fd1..fbf85d8a129 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplNFT.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp @@ -1,8 +1,7 @@ -#include - #include #include #include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp b/src/libxrpl/tx/wasm/HostFuncImplTrace.cpp similarity index 97% rename from src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp rename to src/libxrpl/tx/wasm/HostFuncImplTrace.cpp index e7516b35676..33f9dc8e2b5 100644 --- a/src/xrpld/app/wasm/detail/HostFuncImplTrace.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplTrace.cpp @@ -1,7 +1,6 @@ -#include - #include #include +#include #ifdef _DEBUG // #define DEBUG_OUTPUT 1 diff --git a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp similarity index 99% rename from src/xrpld/app/wasm/detail/HostFuncWrapper.cpp rename to src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 2e22dca4bda..656e51f75ea 100644 --- a/src/xrpld/app/wasm/detail/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -1,6 +1,3 @@ -#include -#include - #include #include #include @@ -9,6 +6,8 @@ #include #include #include +#include +#include namespace xrpl { diff --git a/src/xrpld/app/wasm/detail/WasmVM.cpp b/src/libxrpl/tx/wasm/WasmVM.cpp similarity index 98% rename from src/xrpld/app/wasm/detail/WasmVM.cpp rename to src/libxrpl/tx/wasm/WasmVM.cpp index 4064a95924f..7c755da2b3b 100644 --- a/src/xrpld/app/wasm/detail/WasmVM.cpp +++ b/src/libxrpl/tx/wasm/WasmVM.cpp @@ -2,14 +2,13 @@ // #define DEBUG_OUTPUT 1 #endif -#include -#include -#include - #include #include #include #include +#include +#include +#include #include diff --git a/src/xrpld/app/wasm/detail/WasmiVM.cpp b/src/libxrpl/tx/wasm/WasmiVM.cpp similarity index 99% rename from src/xrpld/app/wasm/detail/WasmiVM.cpp rename to src/libxrpl/tx/wasm/WasmiVM.cpp index a29a58aa350..6d264c5e501 100644 --- a/src/xrpld/app/wasm/detail/WasmiVM.cpp +++ b/src/libxrpl/tx/wasm/WasmiVM.cpp @@ -1,6 +1,5 @@ -#include - #include +#include #include diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index 32379495dc5..a64031bd366 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -1,8 +1,7 @@ #include -#include - #include +#include namespace xrpl { namespace test { diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 94d69b0e258..ec3d77803cf 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -1,13 +1,12 @@ #include #include -#include -#include - #include #include #include #include +#include +#include namespace xrpl { diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index a6fc86a247a..bf6bb0eb1a5 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -4,7 +4,7 @@ #include -#include +#include #include From fdfdf4fcebf581caafc16ca8a05b89fecf8a1e11 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 5 Mar 2026 14:49:07 -0400 Subject: [PATCH 191/212] fix pre-commit --- src/libxrpl/ledger/ApplyViewImpl.cpp | 3 +- src/test/app/EscrowSmart_test.cpp | 121 ++++++++++++++++-------- src/test/app/wasm_fixtures/updateData.c | 12 +-- 3 files changed, 91 insertions(+), 45 deletions(-) diff --git a/src/libxrpl/ledger/ApplyViewImpl.cpp b/src/libxrpl/ledger/ApplyViewImpl.cpp index 9ff7b568ee3..7fbd865db81 100644 --- a/src/libxrpl/ledger/ApplyViewImpl.cpp +++ b/src/libxrpl/ledger/ApplyViewImpl.cpp @@ -15,7 +15,8 @@ ApplyViewImpl::apply( bool isDryRun, beast::Journal j) { - return items_.apply(to, tx, ter, deliver_, parentBatchId, gasUsed_, wasmReturnCode_, isDryRun, j); + return items_.apply( + to, tx, ter, deliver_, parentBatchId, gasUsed_, wasmReturnCode_, isDryRun, j); } std::size_t diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 465d934f9b6..1ac9addfb61 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -228,7 +228,10 @@ struct EscrowSmart_test : public beast::unit_test::suite // Failure situations (i.e. all other combinations) { // only FinishFunction - env(escrowCreate, escrow::finish_function(ledgerSqnWasmHex), fee(txnFees), ter(temBAD_EXPIRATION)); + env(escrowCreate, + escrow::finish_function(ledgerSqnWasmHex), + fee(txnFees), + ter(temBAD_EXPIRATION)); env.close(); } { @@ -320,8 +323,12 @@ struct EscrowSmart_test : public beast::unit_test::suite // featureSmartEscrow disabled Env env(*this, features - featureSmartEscrow); env.fund(XRP(5000), alice, carol); - XRPAmount const txnFees = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; - env(escrow::finish(carol, alice, 1), fee(txnFees), escrow::comp_allowance(4), ter(temDISABLED)); + XRPAmount const txnFees = + env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; + env(escrow::finish(carol, alice, 1), + fee(txnFees), + escrow::comp_allowance(4), + ter(temDISABLED)); env.close(); } @@ -380,9 +387,9 @@ struct EscrowSmart_test : public beast::unit_test::suite sle->setFieldU32(sfFlags, 0); sle->setFieldU64(sfOwnerNode, 0); uint256 tmp; - BEAST_EXPECT( - tmp.parseHex("F63D1A452A96C19EFD77901FB37D236C59EAA746771A6" - "85D1BBA57A2238B9401")); + BEAST_EXPECT(tmp.parseHex( + "F63D1A452A96C19EFD77901FB37D236C59EAA746771A6" + "85D1BBA57A2238B9401")); sle->setFieldH256(sfPreviousTxnID, tmp); sle->setFieldU32(sfPreviousTxnLgrSeq, 4); sle->setFieldU32(sfSequence, seq); @@ -432,7 +439,10 @@ struct EscrowSmart_test : public beast::unit_test::suite // This function takes 4 gas // In testing, 1 gas costs 1 drop auto const finishFee = env.current()->fees().base + 3; - env(escrow::finish(carol, alice, seq), fee(finishFee), escrow::comp_allowance(4), ter(telINSUF_FEE_P)); + env(escrow::finish(carol, alice, seq), + fee(finishFee), + escrow::comp_allowance(4), + ter(telINSUF_FEE_P)); } { @@ -457,8 +467,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const allowance = 100; env(escrow::finish(carol, alice, seq2), - fee(env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + - 1), + fee(env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1), escrow::comp_allowance(allowance), ter(tefNO_WASM)); } @@ -482,8 +492,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto [createFee, finishFee] = [&]() { Env env(*this, features); auto createFee = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; - auto finishFee = - env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; + auto finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; return std::make_pair(createFee, finishFee); }(); @@ -543,7 +553,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( txMeta->getFieldI32(sfWasmReturnCode) == 5, @@ -566,7 +577,8 @@ struct EscrowSmart_test : public beast::unit_test::suite escrow::cancel_time(env.now() + 100s), fee(createFee)); env.close(); - auto const conditionFinishFee = finishFee + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); + auto const conditionFinishFee = + finishFee + env.current()->fees().base * (32 + (escrow::fb1.size() / 16)); if (BEAST_EXPECT(env.ownerCount(alice) == 2)) { @@ -613,7 +625,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( txMeta->getFieldI32(sfWasmReturnCode) == 5, @@ -763,8 +776,8 @@ struct EscrowSmart_test : public beast::unit_test::suite env.require(balance(alice, XRP(4000) - txnFees)); auto const allowance = 1420; - XRPAmount const finishFee = - env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; + XRPAmount const finishFee = env.current()->fees().base + + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; // FinishAfter time hasn't passed env(escrow::finish(alice, alice, seq), @@ -775,7 +788,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( txMeta->getFieldI32(sfWasmReturnCode) == -256, @@ -840,7 +854,8 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); auto const bigAllowance = 996'433; - uint64_t partialFeeCalc = (static_cast(bigAllowance) * 1'000'000) / MICRO_DROPS_PER_DROP + + uint64_t partialFeeCalc = + (static_cast(bigAllowance) * 1'000'000) / MICRO_DROPS_PER_DROP + 1; // to avoid an overflow auto finishFee = env.current()->fees().base + partialFeeCalc; BEAST_EXPECT(finishFee.drops() > bigAllowance); @@ -866,7 +881,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == allowance, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == allowance, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECTS( txMeta->getFieldI32(sfWasmReturnCode) == 5, @@ -895,7 +911,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + allHostFunctionsWasmHex.size() / 2 * 5; + XRPAmount txnFees = + env.current()->fees().base * 10 + allHostFunctionsWasmHex.size() / 2 * 5; env(escrowCreate, escrow::finish_function(allHostFunctionsWasmHex), escrow::finish_time(env.now() + 11s), @@ -904,7 +921,8 @@ struct EscrowSmart_test : public beast::unit_test::suite fee(txnFees)); env.close(); - if (BEAST_EXPECT(env.ownerCount(alice) == (1 + allHostFunctionsWasmHex.size() / 2 / 500))) + if (BEAST_EXPECT( + env.ownerCount(alice) == (1 + allHostFunctionsWasmHex.size() / 2 / 500))) { env.require(balance(alice, XRP(4000) - txnFees)); env.require(balance(carol, XRP(5000))); @@ -935,7 +953,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const txMeta = env.meta(); if (BEAST_EXPECT(txMeta && txMeta->isFieldPresent(sfGasUsed))) BEAST_EXPECTS( - txMeta->getFieldU32(sfGasUsed) == 64'292, std::to_string(txMeta->getFieldU32(sfGasUsed))); + txMeta->getFieldU32(sfGasUsed) == 64'292, + std::to_string(txMeta->getFieldU32(sfGasUsed))); if (BEAST_EXPECT(txMeta->isFieldPresent(sfWasmReturnCode))) BEAST_EXPECT(txMeta->getFieldI32(sfWasmReturnCode) == 1); @@ -999,7 +1018,8 @@ struct EscrowSmart_test : public beast::unit_test::suite if (BEAST_EXPECTS(env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); - XRPAmount txnFees = env.current()->fees().base * 10 + allKeyletsWasmHex.size() / 2 * 5; + XRPAmount txnFees = + env.current()->fees().base * 10 + allKeyletsWasmHex.size() / 2 * 5; env(escrow::create(alice, carol, XRP(1000)), escrow::finish_function(allKeyletsWasmHex), escrow::finish_time(env.now() + 2s), @@ -1012,7 +1032,9 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const allowance = 184'444; auto const finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; - env(escrow::finish(carol, alice, seq), escrow::comp_allowance(allowance), fee(finishFee)); + env(escrow::finish(carol, alice, seq), + escrow::comp_allowance(allowance), + fee(finishFee)); env.close(); auto const txMeta = env.meta(); @@ -1066,7 +1088,8 @@ struct EscrowSmart_test : public beast::unit_test::suite escrow::finish_function(wasmHex), escrow::cancel_time(env.now() + 100s), fee(env.current()->fees().base * 10 + wasmHex.size() / 2 * 5), - ter(expectedStatus == ExpectedStatus::Success ? TER{tesSUCCESS} : TER{temMALFORMED})); + ter(expectedStatus == ExpectedStatus::Success ? TER{tesSUCCESS} + : TER{temMALFORMED})); if (expectedStatus == ExpectedStatus::Crash) fail("Expected crash", loc.file_name(), loc.line()); else @@ -1093,23 +1116,47 @@ struct EscrowSmart_test : public beast::unit_test::suite std::vector const testCases = { // Code blob tests - {TestCase::BlobType::Code, 99'959, std::nullopt, ExpectedStatus::Success}, // just under 100kb - {TestCase::BlobType::Code, 99'961, std::nullopt, ExpectedStatus::Malformed}, // just over 100kb - {TestCase::BlobType::Code, 200'000, 10'000'000, ExpectedStatus::Success}, // ~200kb - {TestCase::BlobType::Code, 490'000, 10'000'000, ExpectedStatus::Success}, // just under 1MB JSON - {TestCase::BlobType::Code, 999'999, 10'000'000, ExpectedStatus::Crash}, // just over 1MB JSON + {TestCase::BlobType::Code, + 99'959, + std::nullopt, + ExpectedStatus::Success}, // just under 100kb + {TestCase::BlobType::Code, + 99'961, + std::nullopt, + ExpectedStatus::Malformed}, // just over 100kb + {TestCase::BlobType::Code, 200'000, 10'000'000, ExpectedStatus::Success}, // ~200kb + {TestCase::BlobType::Code, + 490'000, + 10'000'000, + ExpectedStatus::Success}, // just under 1MB JSON + {TestCase::BlobType::Code, + 999'999, + 10'000'000, + ExpectedStatus::Crash}, // just over 1MB JSON // Data blob tests - {TestCase::BlobType::Data, 99'946, std::nullopt, ExpectedStatus::Success}, // just under 100kb - {TestCase::BlobType::Data, 99'948, std::nullopt, ExpectedStatus::Malformed}, // just over 100kb - {TestCase::BlobType::Data, 200'000, 10'000'000, ExpectedStatus::Success}, // ~200kb - {TestCase::BlobType::Data, 490'000, 10'000'000, ExpectedStatus::Success}, // just under 1MB JSON - {TestCase::BlobType::Data, 999'950, 10'000'000, ExpectedStatus::Crash}, // just over 1MB JSON + {TestCase::BlobType::Data, + 99'946, + std::nullopt, + ExpectedStatus::Success}, // just under 100kb + {TestCase::BlobType::Data, + 99'948, + std::nullopt, + ExpectedStatus::Malformed}, // just over 100kb + {TestCase::BlobType::Data, 200'000, 10'000'000, ExpectedStatus::Success}, // ~200kb + {TestCase::BlobType::Data, + 490'000, + 10'000'000, + ExpectedStatus::Success}, // just under 1MB JSON + {TestCase::BlobType::Data, + 999'950, + 10'000'000, + ExpectedStatus::Crash}, // just over 1MB JSON }; for (auto const& tc : testCases) { - auto const wasm = - tc.type == TestCase::BlobType::Code ? generateCodeBlob(tc.size) : generateDataBlob(tc.size); + auto const wasm = tc.type == TestCase::BlobType::Code ? generateCodeBlob(tc.size) + : generateDataBlob(tc.size); runTest(wasm, tc.sizeLimit, tc.expected); } } diff --git a/src/test/app/wasm_fixtures/updateData.c b/src/test/app/wasm_fixtures/updateData.c index 8436f1c3905..0c506474922 100644 --- a/src/test/app/wasm_fixtures/updateData.c +++ b/src/test/app/wasm_fixtures/updateData.c @@ -1,13 +1,11 @@ #include -int32_t -update_data(uint8_t const*, int32_t); +int32_t update_data(uint8_t const *, int32_t); -int -finish() +int finish() { - uint8_t buf[] = "Data"; - update_data(buf, sizeof(buf) - 1); + uint8_t buf[] = "Data"; + update_data(buf, sizeof(buf) - 1); - return -256; + return -256; } From 780380da7e306deeef7eec1a43bbb5ccc4ca07ea Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Tue, 10 Mar 2026 11:37:12 -0400 Subject: [PATCH 192/212] Modularization fixes (#6488) --- include/xrpl/core/ServiceRegistry.h | 4 ++++ src/libxrpl/tx/transactors/Escrow.cpp | 19 ++++++++++--------- src/test/app/EscrowSmart_test.cpp | 7 +++---- src/test/app/Wasm_test.cpp | 6 +++--- src/xrpld/app/main/Application.cpp | 18 ++++++++++++++++++ 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/include/xrpl/core/ServiceRegistry.h b/include/xrpl/core/ServiceRegistry.h index 1a2e33d5ee0..7b43051f71a 100644 --- a/include/xrpl/core/ServiceRegistry.h +++ b/include/xrpl/core/ServiceRegistry.h @@ -4,6 +4,7 @@ #include #include #include +#include #include @@ -225,6 +226,9 @@ class ServiceRegistry virtual DatabaseCon& getWalletDB() = 0; + virtual Fees + getFees() const = 0; + // Temporary: Get the underlying Application for functions that haven't // been migrated yet. This should be removed once all code is migrated. virtual Application& diff --git a/src/libxrpl/tx/transactors/Escrow.cpp b/src/libxrpl/tx/transactors/Escrow.cpp index 055d3d786db..71a2b9837a9 100644 --- a/src/libxrpl/tx/transactors/Escrow.cpp +++ b/src/libxrpl/tx/transactors/Escrow.cpp @@ -198,15 +198,15 @@ EscrowCreate::preflight(PreflightContext const& ctx) if (ctx.tx.isFieldPresent(sfFinishFunction)) { - if (ctx.registry.config().FEES.extension_size_limit == 0 || - ctx.registry.config().FEES.extension_compute_limit == 0) + auto const fees(ctx.registry.getFees()); + if (fees.extensionSizeLimit == 0 || fees.extensionComputeLimit == 0) { JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; return temTEMP_DISABLED; } auto const code = ctx.tx.getFieldVL(sfFinishFunction); - if (code.size() == 0 || code.size() > ctx.registry.config().FEES.extension_size_limit) + if (code.size() == 0 || code.size() > fees.extensionSizeLimit) { JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad size " << code.size(); return temMALFORMED; @@ -654,7 +654,8 @@ EscrowFinish::preflight(PreflightContext const& ctx) if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) { - if (ctx.registry.config().FEES.extension_compute_limit == 0) + auto const fees(ctx.registry.getFees()); + if (fees.extensionComputeLimit == 0) { JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; return temTEMP_DISABLED; @@ -663,7 +664,7 @@ EscrowFinish::preflight(PreflightContext const& ctx) { return temBAD_LIMIT; } - if (*allowance > ctx.registry.config().FEES.extension_compute_limit) + if (*allowance > fees.extensionComputeLimit) { JLOG(ctx.j.debug()) << "ComputationAllowance too large: " << *allowance; return temBAD_LIMIT; @@ -1178,8 +1179,8 @@ EscrowFinish::doApply() // already checked above, this check is just in case return tecINTERNAL; } - std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; - auto re = runEscrowWasm(wasm, ledgerDataProvider, allowance, ESCROW_FUNCTION_NAME, {}); + std::uint32_t const allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm(wasm, ledgerDataProvider, allowance, ESCROW_FUNCTION_NAME); JLOG(j_.trace()) << "Escrow WASM ran"; if (auto const& data = ledgerDataProvider.getData(); data.has_value()) @@ -1195,8 +1196,8 @@ EscrowFinish::doApply() if (re.has_value()) { - auto reValue = re.value().result; - auto reCost = re.value().cost; + auto const reValue = re.value().result; + auto const reCost = re.value().cost; JLOG(j_.debug()) << "WASM Success: " + std::to_string(reValue) << ", cost: " << reCost; ctx_.setWasmReturnCode(reValue); diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 1ac9addfb61..ee8e30f2f3d 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -1,14 +1,13 @@ #include #include -#include -#include - #include #include #include #include #include +#include +#include #include #include @@ -177,7 +176,7 @@ struct EscrowSmart_test : public beast::unit_test::suite Env env( *this, envconfig([](std::unique_ptr cfg) { - cfg->START_UP = Config::FRESH; + cfg->START_UP = StartUpType::FRESH; return cfg; }), features); diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 608445691d1..d4e21fa177c 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -292,7 +292,7 @@ struct Wasm_test : public beast::unit_test::suite { TestHostFunctions hfs(env, 0); auto re = runEscrowWasm(allHFWasm, hfs, 100'000, ESCROW_FUNCTION_NAME, {}); - checkResult(re, 1, 66'340); + checkResult(re, 1, 65'840); } { @@ -316,7 +316,7 @@ struct Wasm_test : public beast::unit_test::suite TestHostFunctions hfs(env, 0); auto re = runEscrowWasm( allHFWasm, hfs, std::numeric_limits::max(), ESCROW_FUNCTION_NAME, {}); - checkResult(re, 1, 66'340); + checkResult(re, 1, 65'840); } { // fail because trying to access nonexistent field @@ -482,7 +482,7 @@ struct Wasm_test : public beast::unit_test::suite auto const codecovWasm = hexToBytes(codecovTestsWasmHex); TestHostFunctions hfs(env, 0); - auto const allowance = 339'303; + auto const allowance = 340'524; auto re = runEscrowWasm(codecovWasm, hfs, allowance, ESCROW_FUNCTION_NAME, {}); checkResult(re, 1, allowance); diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 3e3d87dcd51..32603bf5ac9 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -787,6 +787,24 @@ class ApplicationImp : public Application, public BasicApp return *mWalletDB; } + virtual Fees + getFees() const override + { + XRPL_ASSERT(config_, "xrpl::ApplicationImp::getFees : non-null config"); + + auto const& f1(config_->FEES); + + Fees f2; + f2.base = f1.reference_fee; + f2.reserve = f1.account_reserve; + f2.increment = f1.owner_reserve; + f2.extensionComputeLimit = f1.extension_compute_limit; + f2.extensionSizeLimit = f1.extension_size_limit; + f2.gasPrice = f1.gas_price; + + return f2; + } + bool serverOkay(std::string& reason) override; From 27468ddbcf2e8de7e559189aee8dcea97bd31af8 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:46:58 -0400 Subject: [PATCH 193/212] Add import / export sections test (#6497) --- src/test/app/Wasm_test.cpp | 166 +++++++++++++++++++++--- src/test/app/wasm_fixtures/fixtures.cpp | 6 + src/test/app/wasm_fixtures/fixtures.h | 2 + 3 files changed, 155 insertions(+), 19 deletions(-) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index bf6bb0eb1a5..041b73f0caa 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -32,6 +32,86 @@ hexToBytes(std::string const& hex) return Bytes(ws.begin(), ws.end()); } +template +unsigned +uleb128(IT& it, T val) +{ + unsigned count = 0; + do + { + std::uint8_t byte = val & 0x7f; + val >>= 7; + if (val) + byte |= 0x80; + *it++ = byte; + ++count; + } while (val != 0); + + return count; +} + +template +std::pair +uleb128(IT&& it) +{ + static_assert(sizeof(*it) == 1, "invalid iterator type"); + std::uint64_t val = 0; + std::uint64_t byte = 0; + unsigned shift = 0; + unsigned count = 0; + + do + { + if (shift > sizeof(std::uint64_t) * 8 - 7) + return {0, 0}; + byte = *it++; + val |= (byte & 0x7F) << shift; + shift += 7; + ++count; + } while (byte >= 0x80); + + return {val, count}; +} + +std::pair +getSection(Bytes const& module, std::uint8_t n) +{ + static std::uint8_t const hdr[] = {0x00, 0x61, 0x73, 0x6D}; + static std::uint8_t const ver[] = {0x01, 0x00, 0x00, 0x00}; + static std::uint8_t const lastSec = 12; + + // sections: + // 0: "Custom", 1: "Type", 2: "Import", 3: "Function", 4: "Table", 5: "Memory", 6: "Global", + // 7: "Export", 8: "Start", 9: "Element", 10: "Code", 11: "Data", 12: "DataCount" + + if (module.size() < sizeof(hdr) + sizeof(ver) + 2) + return {0, 0}; + if (memcmp(module.data(), hdr, sizeof(hdr)) != 0) + return {0, 0}; + if (memcmp(module.data() + sizeof(hdr), ver, sizeof(ver)) != 0) + return {0, 0}; + + unsigned pos = sizeof(hdr) + sizeof(ver); // sections start + for (; pos < module.size();) + { + auto const start = pos; + std::uint8_t const byte = module[pos++]; + if (byte > lastSec) + return {0, 0}; + + auto [sz, cnt] = uleb128(module.cbegin() + pos); + if (!cnt) + return {0, 0}; + if (pos + cnt + sz > module.size()) + return {0, 0}; + pos += cnt + sz; + + if (byte == n) + return {start, pos}; + } + return {0, 0}; +} + std::optional runFinishFunction(std::string const& code) { @@ -196,6 +276,71 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } + void + testImpExp() + { + testcase("Wasm import/export functions"); + + auto impExpWasm = hexToBytes(impExpHex); + + using namespace test::jtx; + + Env env{*this}; + TestLedgerDataProvider hfs(env); + ImportVec imports; + WASM_IMPORT_FUNC2(imports, getLedgerSqn, "get_ledger_sqn", &hfs, 33); + WASM_IMPORT_FUNC2(imports, getParentLedgerHash, "get_parent_ledger_hash", &hfs, 60); + auto& engine = WasmEngine::instance(); + + // Test exp_func1() - should return 1 + auto re = engine.run(impExpWasm, hfs, 1'000'000, "exp_func1", {}, imports, env.journal); + checkResult(re, 1, 30); + + // Test exp_func2(5) - should return 2 * 5 = 10 + re = engine.run( + impExpWasm, hfs, 1'000'000, "exp_func2", wasmParams(5), imports, env.journal); + checkResult(re, 10, 52); + + // Test test_imports() - should call get_ledger_sqn and get_parent_ledger_hash + re = engine.run(impExpWasm, hfs, 1'000'000, "test_imports", {}, imports, env.journal); + // Should return the ledger sequence number (3 by default in test env) + checkResult(re, 3, 294); + + // Test corrupted import/export sections - invert each byte and expect failure + testcase("Wasm import/export section corruption"); + { + // Import section(#2): bytes [26, 79) - 53 bytes + // Export section(#7): bytes [90, 141) - 51 bytes + auto [importStart, importEnd] = getSection(impExpWasm, 2); + auto [exportStart, exportEnd] = getSection(impExpWasm, 7); + + BEAST_EXPECTS(importStart == 26, std::to_string(importStart)); + BEAST_EXPECTS(importEnd == 79, std::to_string(importEnd)); + BEAST_EXPECTS(exportStart == 90, std::to_string(exportStart)); + BEAST_EXPECTS(exportEnd == 141, std::to_string(exportEnd)); + + auto testInv = [&](unsigned i) { + auto corruptedWasm = impExpWasm; + corruptedWasm[i] = ~corruptedWasm[i]; // Invert byte + + // Try to run any function - should fail due to corruption + auto result = engine.run( + corruptedWasm, hfs, 1'000'000, "exp_func1", {}, imports, env.journal); + BEAST_EXPECT(!result); + }; + + // Test each byte in import section + for (unsigned i = importStart; i < importEnd; ++i) + testInv(i); + + // Test each byte in export section + for (unsigned i = exportStart; i < exportEnd; ++i) + testInv(i); + } + + env.close(); + } + void testWasmFib() { @@ -723,8 +868,7 @@ struct Wasm_test : public beast::unit_test::suite // i32.const 1001)) auto const wasmHex = "0061736d01000000010c0260017f017f60027f7f017f03030200010503010001071a03066d656d6f727902" - "0005746573743100" - "0005746573743200010a0d02050041e8070b050041e9070b"; + "00057465737431000005746573743200010a0d02050041e8070b050041e9070b"; auto const wasm = hexToBytes(wasmHex); // good params, module is working properly @@ -864,23 +1008,6 @@ struct Wasm_test : public beast::unit_test::suite env.close(); } - template - std::size_t - uleb128(IT& it, std::uint16_t val) - { - std::size_t count = 0; - do - { - std::uint8_t byte = val & 0x7f; - val >>= 7; - if (val) - byte |= 0x80; - *it++ = byte; - ++count; - } while (val != 0); - return count; - } - void testOpcodes() { @@ -1394,6 +1521,7 @@ struct Wasm_test : public beast::unit_test::suite testWasmLib(); testBadWasm(); testWasmLedgerSqn(); + testImpExp(); testWasmFib(); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index eeae8ea49bc..454a5a4b2c1 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -8978,3 +8978,9 @@ extern std::string const opcReservedHex = "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101410b0b0b" "0a010041000b04746573" "74"; + +extern std::string const impExpHex = + "0061736d0100000001100360027f7f017f6000017f60017f017f02330203656e760e6765745f6c65646765725f7371" + "6e000003656e76166765745f706172656e745f6c65646765725f686173680000030403010201050301000107310406" + "6d656d6f72790200096578705f66756e63310002096578705f66756e633200030c746573745f696d706f7274730004" + "0a2b03040041010b0700200041026c0b1c01027f4120410410001a41202802002100410041201001210120000b"; diff --git a/src/test/app/wasm_fixtures/fixtures.h b/src/test/app/wasm_fixtures/fixtures.h index ceace76fc00..b3b20a8f373 100644 --- a/src/test/app/wasm_fixtures/fixtures.h +++ b/src/test/app/wasm_fixtures/fixtures.h @@ -79,3 +79,5 @@ extern std::string const locals10kHex; extern std::string const functions5kHex; extern std::string const opcReservedHex; + +extern std::string const impExpHex; From 196e6a1b2703af6456db931a46a0bc537cb4c070 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Fri, 20 Mar 2026 14:26:26 -0400 Subject: [PATCH 194/212] Clang-format fixtures.cpp (#6610) --- src/test/app/wasm_fixtures/fixtures.cpp | 13429 ++++++++-------------- 1 file changed, 5058 insertions(+), 8371 deletions(-) diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 454a5a4b2c1..7dcd5c4ea13 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -3,1244 +3,920 @@ #include extern std::string const fibWasmHex = - "0061736d0100000001090260000060017f017f0303020001071b02115f5f" - "7761736d5f63616c6c5f63746f727300000366696200010a440202000b3f" - "01017f200045044041000f0b2000410348044041010f0b200041026a2100" - "0340200041036b100120016a2101200041026b220041044a0d000b200141" - "016a0b"; + "0061736d0100000001090260000060017f017f0303020001071b02115f5f7761736d5f63616c6c5f63746f72730000" + "0366696200010a440202000b3f01017f200045044041000f0b2000410348044041010f0b200041026a210003402000" + "41036b100120016a2101200041026b220041044a0d000b200141016a0b"; extern std::string const ledgerSqnWasmHex = "0061736d01000000010e0360027f7f017f6000006000017f02160103656e760e6765745f6c65646765725f73716e00" - "00030302010205030100" - "02063f0a7f01418088040b7f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088" - "040b7f00418080080b7f" - "0041000b7f0041010b07aa010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300010666696e69" - "736800020c5f5f64736f" - "5f68616e646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869" - "676803040d5f5f676c6f" - "62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f656e6403070d5f5f6d656d6f72795f" - "6261736503080c5f5f74" - "61626c655f6261736503090a3d0202000b3801037f230041106b220024002000410c6a410410002101200028020c21" - "02200041106a24002001" - "41054100200241054f1b20014100481b0b007f0970726f647563657273010c70726f6365737365642d62790105636c" - "616e675f31392e312e35" - "2d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374" - "20616234623561326462" - "353832393538616631656533303861373930636664623432626432343732302900490f7461726765745f6665617475" - "726573042b0f6d757461" - "626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c74697661" - "6c7565"; + "0003030201020503010002063f0a7f01418088040b7f004180080b7f004180080b7f004180080b7f00418088040b7f" + "004180080b7f00418088040b7f00418080080b7f0041000b7f0041010b07aa010c066d656d6f72790200115f5f7761" + "736d5f63616c6c5f63746f727300010666696e69736800020c5f5f64736f5f68616e646c6503010a5f5f646174615f" + "656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" + "6503050b5f5f686561705f6261736503060a5f5f686561705f656e6403070d5f5f6d656d6f72795f6261736503080c" + "5f5f7461626c655f6261736503090a3d0202000b3801037f230041106b220024002000410c6a410410002101200028" + "020c2102200041106a2400200141054100200241054f1b20014100481b0b007f0970726f647563657273010c70726f" + "6365737365642d62790105636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875" + "622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162346235613264623538323935386166316565333038" + "61373930636664623432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c652d" + "676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const allHostFunctionsWasmHex = - "0061736d0100000001540c60027f7f017f60037f7f7f017f60047f7f7f7f017f60017f017f" - "60067f7f7f7f7f7f017f60037f7f7f0060057f7f7f7f7f017f60037f7f7e017f60087f7f7f" - "7f7f7f7f7f017f60017f0060027f7f006000017f02ae061a08686f73745f6c69620c676574" - "5f74785f6669656c64000108686f73745f6c69620974726163655f6e756d000708686f7374" - "5f6c6962057472616365000608686f73745f6c69620e6765745f6c65646765725f73716e00" - "0008686f73745f6c6962166765745f706172656e745f6c65646765725f74696d6500000868" - "6f73745f6c6962166765745f706172656e745f6c65646765725f68617368000008686f7374" - "5f6c6962136765745f74785f6e65737465645f6669656c64000208686f73745f6c69621067" - "65745f74785f61727261795f6c656e000308686f73745f6c6962176765745f74785f6e6573" - "7465645f61727261795f6c656e000008686f73745f6c69621c6765745f63757272656e745f" - "6c65646765725f6f626a5f6669656c64000108686f73745f6c6962236765745f6375727265" - "6e745f6c65646765725f6f626a5f6e65737465645f6669656c64000208686f73745f6c6962" - "206765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e00030868" - "6f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" - "5f61727261795f6c656e000008686f73745f6c69621063616368655f6c65646765725f6f62" - "6a000108686f73745f6c69621163726564656e7469616c5f6b65796c6574000808686f7374" - "5f6c69620d657363726f775f6b65796c6574000408686f73745f6c69620d6f7261636c655f" - "6b65796c6574000408686f73745f6c696213636f6d707574655f7368613531325f68616c66" - "000208686f73745f6c6962076765745f6e6674000408686f73745f6c69620b757064617465" - "5f64617461000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64" - "000208686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f666965" - "6c64000608686f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c65" - "6e000008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f6172" - "7261795f6c656e000108686f73745f6c69620e6163636f756e745f6b65796c657400020868" - "6f73745f6c69620d74726163655f6163636f756e740002030c0b090a05050b050001010300" - "05030100110619037f01418080c0000b7f0041af99c0000b7f0041b099c0000b072e04066d" - "656d6f727902000666696e697368001e0a5f5f646174615f656e6403010b5f5f686561705f" - "6261736503020ac61d0b990101027f230041306b220124002000027f418180202001411c6a" - "4114100022024114470440417f20022002417f4e1b210241010c010b200020012f001c3b00" - "01200041036a2001411e6a2d00003a0000200120012900233703082001200141286a290000" - "37000d200128001f21022000410d6a200129000d3700002000200129030837020841000b3a" - "000020002002360204200141306a24000b460020012d00004101460440418080c000410b20" - "013402041001000b20002001290001370000200041106a200141116a280000360000200041" - "086a200141096a2900003700000b1900200241214f0440000b200020023602042000200136" - "02000b1900200241094f0440000b20002002360204200020013602000bde1a01097f230041" - "b0036b22002400418b80c000411b41014100410010021a41a680c000411941014100410010" - "021a41e780c000412b41014100410010021a20004100360270024002400240024002400240" - "02400240200041f0006a220741041003220141004a0440419281c000411720002802702201" - "41187420014180fe03714108747220014108764180fe037120014118767272ad10011a2000" - "41003602900120004190016a220341041004220141004c0d0141a981c00041132000280290" - "01220141187420014180fe03714108747220014108764180fe037120014118767272ad1001" - "1a200041c8016a22024200370300200041c0016a22054200370300200041b8016a22044200" - "370300200042003703b001200041b0016a22064120100522014120470d0241bc81c0004113" - "20064120410110021a41cf81c000412041014100410010021a41dc82c000412e4101410041" - "0010021a200041a0016a410036020020004198016a42003703002000420037039001418180" - "2020034114100022014114470d03418a83c00041142003101f200042003703704188801820" - "074108100022014108470d04419e83c0004117420810011a41b583c0004128200741084101" - "10021a2000410036024841848008200041c8006a22034104100022014104470d0541dd83c0" - "00411520034104410110021a200041013b0034200242003703002005420037030020044200" - "370300200042003703b0010240200041346a4102200641201006220141004e044041f283c0" - "0041142001ad10011a200041286a20062001101c418684c000410d2000280228200028022c" - "410110021a0c010b419384c00041292001ac10011a0b41bc84c00041154183803c1007ac10" - "011a41d184c00041134189803c1007ac10011a0240200041346a41021008220141004e0440" - "41e484c00041142001ad10011a0c010b41f884c000412d2001ac10011a0b41a585c0004123" - "41014100410010021a41de86c000413341014100410010021a200042003703704182801820" - "0041f0006a220141081009220341004c0d0620034108460440419187c000412b420810011a" - "41bc87c000412f20014108410110021a0c080b41eb87c000412f2003ad10011a200041206a" - "200041f0006a2003101d419a88c000411720002802202000280224410110021a0c070b41bf" - "82c000411d2001ac10011a419b7f21020c070b419a82c00041252001ac10011a419a7f2102" - "0c060b41ef81c000412b2001ac10011a41997f21020c050b41b486c000412a2001ac10011a" - "41b77e21020c040b41f385c00041c1002001ac10011a41b67e21020c030b41c885c000412b" - "2001ac10011a41b57e21020c020b41b188c00041c5002003ac10011a0b200041a0016a4100" - "36020020004198016a4200370300200042003703900102404181802020004190016a220341" - "141009220141004a044041f688c000411e2003101f0c010b419489c00041332001ac10011a" - "0b200041013b0048200041c8016a4200370300200041c0016a4200370300200041b8016a42" - "00370300200042003703b0010240200041c8006a4102200041b0016a22014120100a220341" - "004e044041c789c000411c2003ad10011a200041186a20012003101c41e389c00041152000" - "280218200028021c410110021a0c010b41f889c00041392003ac10011a0b41b18ac0004124" - "4183803c100bac10011a0240200041c8006a4102100c220141004e044041d58ac000411c20" - "01ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc00041284101410041001002" - "1a41d68bc000412f41014100410010021a200041b0016a2203101a200041f0006a22012003" - "101b200041a8016a4200370300200041a0016a420037030020004198016a42003703002000" - "42003703900102400240024002400240200120004190016a22031020220141204604402003" - "41204100100d220441004a044041858cc00041232004ad10011a2000420037034820042000" - "41c8006a220141081021220341004c0d022003410846044041a88cc000412a420810011a41" - "d28cc000412e20014108410110021a0c060b41808dc000412e2003ad10011a200041106a20" - "0041c8006a2003101d41ae8dc000411620002802102000280214410110021a0c050b41e68f" - "c000413c2004ac10011a200041c8016a4200370300200041c0016a4200370300200041b801" - "6a4200370300200042003703b0014101200041b0016a4120102122014100480d020c030b41" - "ba92c000412e2001ac10011a41ef7c21020c050b41c48dc000412b2003ac10011a0c020b41" - "a290c00041c1002001ac10011a0b200041013b00484101200041c8006a200041b0016a1022" - "2201410048044041e390c00041352001ac10011a0b4101102322014100480440419891c000" - "41322001ac10011a0b4101200041c8006a10242201410048044041ca91c00041392001ac10" - "011a0b418392c000413741014100410010021a0c010b200041013b0034200041c8016a4200" - "370300200041c0016a4200370300200041b8016a4200370300200042003703b00102402004" - "200041346a200041b0016a22011022220341004e044041ef8dc000411b2003ad10011a2000" - "41086a20012003101c418a8ec00041142000280208200028020c410110021a0c010b419e8e" - "c00041312003ac10011a0b41cf8ec000412320041023ac10011a02402004200041346a1024" - "220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10011a0b" - "41c28fc000412441014100410010021a0b41e892c000412f41014100410010021a200041b0" - "016a2201101a200041346a22042001101b200041e0006a4200370300200041d8006a420037" - "0300200041d0006a420037030020004200370348024002400240024002402004200041c800" - "6a2203102022014120460440419793c000410f20034120410110021a20004188016a420037" - "030020004180016a4200370300200041f8006a420037030020004200370370024020044114" - "2004411441a693c0004109200041f0006a22014120100e220341004a044020002001200310" - "1c41ae93c000411220002802002000280204410110021a0c010b41c093c000413c2003ac10" - "011a0b200041a8016a22064200370300200041a0016a2202420037030020004198016a2205" - "4200370300200042003703900120004180808cc07e360268200041346a22034114200041e8" - "006a410420004190016a22084120100f22014120470d0141fc93c000410e20084120410110" - "021a200041c8016a4200370300200041c0016a4200370300200041b8016a42003703002000" - "42003703b001200041808080d00236026c20034114200041ec006a4104200041b0016a2204" - "4120101022014120470d02418a94c000410e20044120410110021a419894c0004124410141" - "00410010021a419195c000412541014100410010021a20004188016a420037030020004180" - "016a4200370300200041f8006a42003703002000420037037041b695c0004117200041f000" - "6a22034120101122014120470d0341cd95c000410b41b695c0004117410110021a41d895c0" - "00411120034120410110021a2004101a200041c8006a22072004101b200642003703002002" - "420037030020054200370300200042003703900102404100200422026b410371220320026a" - "220520024d0d0020030440200321010340200241003a0000200241016a2102200141016b22" - "010d000b0b200341016b4107490d000340200241003a0000200241076a41003a0000200241" - "066a41003a0000200241056a41003a0000200241046a41003a0000200241036a41003a0000" - "200241026a41003a0000200241016a41003a0000200241086a22022005470d000b0b200541" - "800220036b2201417c716a220220054b0440034020054100360200200541046a2205200249" - "0d000b0b024020022001410371220120026a22034f0d002001220504400340200241003a00" - "00200241016a2102200541016b22050d000b0b200141016b4107490d000340200241003a00" - "00200241076a41003a0000200241066a41003a0000200241056a41003a0000200241046a41" - "003a0000200241036a41003a0000200241026a41003a0000200241016a41003a0000200241" - "086a22022003470d000b0b0240200741142008412020044180021012220141004a044041e9" - "95c00041102001ad10011a20014181024f0d0641f995c000410920042001410110021a0c01" - "0b418296c000412e2001ac10011a0b41b096c000411241c296c00041074101100222014100" - "480d0541c996c000411d2001ad10011a41e696c0004111422a1001410048044041ad97c000" - "411a42a47b10011a41a47b21020c070b41f796c000411c420010011a41012102419397c000" - "411a41014100410010021a41ff97c000412941014100410010021a41a898c0004128101322" - "01412846044041d098c000412741a898c0004128410110021a41f798c000411e4101410041" - "0010021a41bf80c000412841014100410010021a0c070b419599c000411a2001ac10011a41" - "c37a21020c060b41f494c000411d2001ac10011a418b7c21020c050b41d894c000411c2001" - "ac10011a41897c21020c040b41bc94c000411c2001ac10011a41887c21020c030b41dd97c0" - "0041222001ac10011a41a77b21020c020b000b41c797c00041162001ac10011a41a57b2102" - "0b200041b0036a240020020b0d00200020012002411410191a0b0c00200041142001412010" - "180b0e002000418280182001200210140b0e002000200141022002412010150b0a00200041" - "83803c10160b0a0020002001410210170b0bb9190100418080c0000baf196572726f725f63" - "6f64653d3d3d3d20484f53542046554e4354494f4e532054455354203d3d3d54657374696e" - "6720323620686f73742066756e6374696f6e73535543434553533a20416c6c20686f737420" - "66756e6374696f6e20746573747320706173736564212d2d2d2043617465676f727920313a" - "204c6564676572204865616465722046756e6374696f6e73202d2d2d4c6564676572207365" - "7175656e6365206e756d6265723a506172656e74206c65646765722074696d653a50617265" - "6e74206c656467657220686173683a535543434553533a204c656467657220686561646572" - "2066756e6374696f6e734552524f523a206765745f706172656e745f6c65646765725f6861" - "73682077726f6e67206c656e6774683a4552524f523a206765745f706172656e745f6c6564" - "6765725f74696d65206661696c65643a4552524f523a206765745f6c65646765725f73716e" - "206661696c65643a2d2d2d2043617465676f727920323a205472616e73616374696f6e2044" - "6174612046756e6374696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a" - "5472616e73616374696f6e20466565206c656e6774683a5472616e73616374696f6e204665" - "65202873657269616c697a65642058525020616d6f756e74293a5472616e73616374696f6e" - "2053657175656e63653a4e6573746564206669656c64206c656e6774683a4e657374656420" - "6669656c643a494e464f3a206765745f74785f6e65737465645f6669656c64206e6f742061" - "70706c696361626c653a5369676e657273206172726179206c656e6774683a4d656d6f7320" - "6172726179206c656e6774683a4e6573746564206172726179206c656e6774683a494e464f" - "3a206765745f74785f6e65737465645f61727261795f6c656e206e6f74206170706c696361" - "626c653a535543434553533a205472616e73616374696f6e20646174612066756e6374696f" - "6e734552524f523a206765745f74785f6669656c642853657175656e6365292077726f6e67" - "206c656e6774683a4552524f523a206765745f74785f6669656c6428466565292077726f6e" - "67206c656e67746820286578706563746564203820627974657320666f7220585250293a45" - "52524f523a206765745f74785f6669656c64284163636f756e74292077726f6e67206c656e" - "6774683a2d2d2d2043617465676f727920333a2043757272656e74204c6564676572204f62" - "6a6563742046756e6374696f6e73202d2d2d43757272656e74206f626a6563742062616c61" - "6e6365206c656e677468202858525020616d6f756e74293a43757272656e74206f626a6563" - "742062616c616e6365202873657269616c697a65642058525020616d6f756e74293a437572" - "72656e74206f626a6563742062616c616e6365206c656e67746820286e6f6e2d5852502061" - "6d6f756e74293a43757272656e74206f626a6563742062616c616e63653a494e464f3a2067" - "65745f63757272656e745f6c65646765725f6f626a5f6669656c642842616c616e63652920" - "6661696c656420286d6179206265206578706563746564293a43757272656e74206c656467" - "6572206f626a656374206163636f756e743a494e464f3a206765745f63757272656e745f6c" - "65646765725f6f626a5f6669656c64284163636f756e7429206661696c65643a4375727265" - "6e74206e6573746564206669656c64206c656e6774683a43757272656e74206e6573746564" - "206669656c643a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e" - "65737465645f6669656c64206e6f74206170706c696361626c653a43757272656e74206f62" - "6a656374205369676e657273206172726179206c656e6774683a43757272656e74206e6573" - "746564206172726179206c656e6774683a494e464f3a206765745f63757272656e745f6c65" - "646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c696361" - "626c653a535543434553533a2043757272656e74206c6564676572206f626a656374206675" - "6e6374696f6e732d2d2d2043617465676f727920343a20416e79204c6564676572204f626a" - "6563742046756e6374696f6e73202d2d2d5375636365737366756c6c792063616368656420" - "6f626a65637420696e20736c6f743a436163686564206f626a6563742062616c616e636520" - "6c656e677468202858525020616d6f756e74293a436163686564206f626a6563742062616c" - "616e6365202873657269616c697a65642058525020616d6f756e74293a436163686564206f" - "626a6563742062616c616e6365206c656e67746820286e6f6e2d58525020616d6f756e7429" - "3a436163686564206f626a6563742062616c616e63653a494e464f3a206765745f6c656467" - "65725f6f626a5f6669656c642842616c616e636529206661696c65643a436163686564206e" - "6573746564206669656c64206c656e6774683a436163686564206e6573746564206669656c" - "643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e" - "6f74206170706c696361626c653a436163686564206f626a656374205369676e6572732061" - "72726179206c656e6774683a436163686564206e6573746564206172726179206c656e6774" - "683a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c" - "656e206e6f74206170706c696361626c653a535543434553533a20416e79206c6564676572" - "206f626a6563742066756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f" - "626a206661696c656420286578706563746564207769746820746573742066697874757265" - "73293a494e464f3a206765745f6c65646765725f6f626a5f6669656c64206661696c656420" - "617320657870656374656420286e6f20636163686564206f626a656374293a494e464f3a20" - "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206661696c6564206173" - "2065787065637465643a494e464f3a206765745f6c65646765725f6f626a5f61727261795f" - "6c656e206661696c65642061732065787065637465643a494e464f3a206765745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e206661696c656420617320657870" - "65637465643a535543434553533a20416e79206c6564676572206f626a6563742066756e63" - "74696f6e732028696e7465726661636520746573746564294552524f523a206163636f756e" - "745f6b65796c6574206661696c656420666f722063616368696e6720746573743a2d2d2d20" - "43617465676f727920353a204b65796c65742047656e65726174696f6e2046756e6374696f" - "6e73202d2d2d4163636f756e74206b65796c65743a546573745479706543726564656e7469" - "616c206b65796c65743a494e464f3a2063726564656e7469616c5f6b65796c657420666169" - "6c656420286578706563746564202d20696e74657266616365206973737565293a45736372" - "6f77206b65796c65743a4f7261636c65206b65796c65743a535543434553533a204b65796c" - "65742067656e65726174696f6e2066756e6374696f6e734552524f523a206f7261636c655f" - "6b65796c6574206661696c65643a4552524f523a20657363726f775f6b65796c6574206661" - "696c65643a4552524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d" - "2043617465676f727920363a205574696c6974792046756e6374696f6e73202d2d2d48656c" - "6c6f2c205852504c205741534d20776f726c6421496e70757420646174613a534841353132" - "2068616c6620686173683a4e46542064617461206c656e6774683a4e465420646174613a49" - "4e464f3a206765745f6e6674206661696c656420286578706563746564202d206e6f207375" - "6368204e4654293a54657374207472616365206d6573736167657061796c6f616454726163" - "652066756e6374696f6e206279746573207772697474656e3a54657374206e756d62657220" - "747261636554726163655f6e756d2066756e6374696f6e2073756363656564656453554343" - "4553533a205574696c6974792066756e6374696f6e734552524f523a2074726163655f6e75" - "6d2829206661696c65643a4552524f523a2074726163652829206661696c65643a4552524f" - "523a20636f6d707574655f7368613531325f68616c66206661696c65643a2d2d2d20436174" - "65676f727920373a2044617461205570646174652046756e6374696f6e73202d2d2d557064" - "61746564206c656467657220656e74727920646174612066726f6d205741534d2074657374" - "5375636365737366756c6c792075706461746564206c656467657220656e74727920776974" - "683a535543434553533a2044617461207570646174652066756e6374696f6e734552524f52" - "3a207570646174655f64617461206661696c65643a004d0970726f64756365727302086c61" - "6e6775616765010452757374000c70726f6365737365642d6279010572757374631d312e38" - "372e30202831373036376539616320323032352d30352d303929002c0f7461726765745f66" - "65617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "0061736d0100000001540c60027f7f017f60037f7f7f017f60047f7f7f7f017f60017f017f60067f7f7f7f7f7f017f" + "60037f7f7f0060057f7f7f7f7f017f60037f7f7e017f60087f7f7f7f7f7f7f7f017f60017f0060027f7f006000017f" + "02ae061a08686f73745f6c69620c6765745f74785f6669656c64000108686f73745f6c69620974726163655f6e756d" + "000708686f73745f6c6962057472616365000608686f73745f6c69620e6765745f6c65646765725f73716e00000868" + "6f73745f6c6962166765745f706172656e745f6c65646765725f74696d65000008686f73745f6c6962166765745f70" + "6172656e745f6c65646765725f68617368000008686f73745f6c6962136765745f74785f6e65737465645f6669656c" + "64000208686f73745f6c6962106765745f74785f61727261795f6c656e000308686f73745f6c6962176765745f7478" + "5f6e65737465645f61727261795f6c656e000008686f73745f6c69621c6765745f63757272656e745f6c6564676572" + "5f6f626a5f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a5f6e65" + "737465645f6669656c64000208686f73745f6c6962206765745f63757272656e745f6c65646765725f6f626a5f6172" + "7261795f6c656e000308686f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e65737465" + "645f61727261795f6c656e000008686f73745f6c69621063616368655f6c65646765725f6f626a000108686f73745f" + "6c69621163726564656e7469616c5f6b65796c6574000808686f73745f6c69620d657363726f775f6b65796c657400" + "0408686f73745f6c69620d6f7261636c655f6b65796c6574000408686f73745f6c696213636f6d707574655f736861" + "3531325f68616c66000208686f73745f6c6962076765745f6e6674000408686f73745f6c69620b7570646174655f64" + "617461000008686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000208686f73745f6c69621b" + "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64000608686f73745f6c6962186765745f6c656467" + "65725f6f626a5f61727261795f6c656e000008686f73745f6c69621f6765745f6c65646765725f6f626a5f6e657374" + "65645f61727261795f6c656e000108686f73745f6c69620e6163636f756e745f6b65796c6574000208686f73745f6c" + "69620d74726163655f6163636f756e740002030c0b090a05050b05000101030005030100110619037f01418080c000" + "0b7f0041af99c0000b7f0041b099c0000b072e04066d656d6f727902000666696e697368001e0a5f5f646174615f65" + "6e6403010b5f5f686561705f6261736503020ac61d0b990101027f230041306b220124002000027f41818020200141" + "1c6a4114100022024114470440417f20022002417f4e1b210241010c010b200020012f001c3b0001200041036a2001" + "411e6a2d00003a0000200120012900233703082001200141286a29000037000d200128001f21022000410d6a200129" + "000d3700002000200129030837020841000b3a000020002002360204200141306a24000b460020012d000041014604" + "40418080c000410b20013402041001000b20002001290001370000200041106a200141116a28000036000020004108" + "6a200141096a2900003700000b1900200241214f0440000b20002002360204200020013602000b1900200241094f04" + "40000b20002002360204200020013602000bde1a01097f230041b0036b22002400418b80c000411b41014100410010" + "021a41a680c000411941014100410010021a41e780c000412b41014100410010021a20004100360270024002400240" + "02400240024002400240200041f0006a220741041003220141004a0440419281c00041172000280270220141187420" + "014180fe03714108747220014108764180fe037120014118767272ad10011a200041003602900120004190016a2203" + "41041004220141004c0d0141a981c0004113200028029001220141187420014180fe03714108747220014108764180" + "fe037120014118767272ad10011a200041c8016a22024200370300200041c0016a22054200370300200041b8016a22" + "044200370300200042003703b001200041b0016a22064120100522014120470d0241bc81c000411320064120410110" + "021a41cf81c000412041014100410010021a41dc82c000412e41014100410010021a200041a0016a41003602002000" + "4198016a420037030020004200370390014181802020034114100022014114470d03418a83c00041142003101f2000" + "42003703704188801820074108100022014108470d04419e83c0004117420810011a41b583c0004128200741084101" + "10021a2000410036024841848008200041c8006a22034104100022014104470d0541dd83c000411520034104410110" + "021a200041013b0034200242003703002005420037030020044200370300200042003703b0010240200041346a4102" + "200641201006220141004e044041f283c00041142001ad10011a200041286a20062001101c418684c000410d200028" + "0228200028022c410110021a0c010b419384c00041292001ac10011a0b41bc84c00041154183803c1007ac10011a41" + "d184c00041134189803c1007ac10011a0240200041346a41021008220141004e044041e484c00041142001ad10011a" + "0c010b41f884c000412d2001ac10011a0b41a585c000412341014100410010021a41de86c000413341014100410010" + "021a2000420037037041828018200041f0006a220141081009220341004c0d0620034108460440419187c000412b42" + "0810011a41bc87c000412f20014108410110021a0c080b41eb87c000412f2003ad10011a200041206a200041f0006a" + "2003101d419a88c000411720002802202000280224410110021a0c070b41bf82c000411d2001ac10011a419b7f2102" + "0c070b419a82c00041252001ac10011a419a7f21020c060b41ef81c000412b2001ac10011a41997f21020c050b41b4" + "86c000412a2001ac10011a41b77e21020c040b41f385c00041c1002001ac10011a41b67e21020c030b41c885c00041" + "2b2001ac10011a41b57e21020c020b41b188c00041c5002003ac10011a0b200041a0016a410036020020004198016a" + "4200370300200042003703900102404181802020004190016a220341141009220141004a044041f688c000411e2003" + "101f0c010b419489c00041332001ac10011a0b200041013b0048200041c8016a4200370300200041c0016a42003703" + "00200041b8016a4200370300200042003703b0010240200041c8006a4102200041b0016a22014120100a220341004e" + "044041c789c000411c2003ad10011a200041186a20012003101c41e389c00041152000280218200028021c41011002" + "1a0c010b41f889c00041392003ac10011a0b41b18ac00041244183803c100bac10011a0240200041c8006a4102100c" + "220141004e044041d58ac000411c2001ad10011a0c010b41f18ac000413d2001ac10011a0b41ae8bc0004128410141" + "00410010021a41d68bc000412f41014100410010021a200041b0016a2203101a200041f0006a22012003101b200041" + "a8016a4200370300200041a0016a420037030020004198016a42003703002000420037039001024002400240024002" + "40200120004190016a2203102022014120460440200341204100100d220441004a044041858cc00041232004ad1001" + "1a200042003703482004200041c8006a220141081021220341004c0d022003410846044041a88cc000412a42081001" + "1a41d28cc000412e20014108410110021a0c060b41808dc000412e2003ad10011a200041106a200041c8006a200310" + "1d41ae8dc000411620002802102000280214410110021a0c050b41e68fc000413c2004ac10011a200041c8016a4200" + "370300200041c0016a4200370300200041b8016a4200370300200042003703b0014101200041b0016a412010212201" + "4100480d020c030b41ba92c000412e2001ac10011a41ef7c21020c050b41c48dc000412b2003ac10011a0c020b41a2" + "90c00041c1002001ac10011a0b200041013b00484101200041c8006a200041b0016a10222201410048044041e390c0" + "0041352001ac10011a0b4101102322014100480440419891c00041322001ac10011a0b4101200041c8006a10242201" + "410048044041ca91c00041392001ac10011a0b418392c000413741014100410010021a0c010b200041013b00342000" + "41c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b0010240200420004134" + "6a200041b0016a22011022220341004e044041ef8dc000411b2003ad10011a200041086a20012003101c418a8ec000" + "41142000280208200028020c410110021a0c010b419e8ec00041312003ac10011a0b41cf8ec000412320041023ac10" + "011a02402004200041346a1024220141004e044041f28ec000411b2001ad10011a0c010b418d8fc00041352001ac10" + "011a0b41c28fc000412441014100410010021a0b41e892c000412f41014100410010021a200041b0016a2201101a20" + "0041346a22042001101b200041e0006a4200370300200041d8006a4200370300200041d0006a420037030020004200" + "370348024002400240024002402004200041c8006a2203102022014120460440419793c000410f2003412041011002" + "1a20004188016a420037030020004180016a4200370300200041f8006a420037030020004200370370024020044114" + "2004411441a693c0004109200041f0006a22014120100e220341004a0440200020012003101c41ae93c00041122000" + "2802002000280204410110021a0c010b41c093c000413c2003ac10011a0b200041a8016a22064200370300200041a0" + "016a2202420037030020004198016a22054200370300200042003703900120004180808cc07e360268200041346a22" + "034114200041e8006a410420004190016a22084120100f22014120470d0141fc93c000410e20084120410110021a20" + "0041c8016a4200370300200041c0016a4200370300200041b8016a4200370300200042003703b001200041808080d0" + "0236026c20034114200041ec006a4104200041b0016a22044120101022014120470d02418a94c000410e2004412041" + "0110021a419894c000412441014100410010021a419195c000412541014100410010021a20004188016a4200370300" + "20004180016a4200370300200041f8006a42003703002000420037037041b695c0004117200041f0006a2203412010" + "1122014120470d0341cd95c000410b41b695c0004117410110021a41d895c000411120034120410110021a2004101a" + "200041c8006a22072004101b2006420037030020024200370300200542003703002000420037039001024041002004" + "22026b410371220320026a220520024d0d0020030440200321010340200241003a0000200241016a2102200141016b" + "22010d000b0b200341016b4107490d000340200241003a0000200241076a41003a0000200241066a41003a00002002" + "41056a41003a0000200241046a41003a0000200241036a41003a0000200241026a41003a0000200241016a41003a00" + "00200241086a22022005470d000b0b200541800220036b2201417c716a220220054b04400340200541003602002005" + "41046a22052002490d000b0b024020022001410371220120026a22034f0d002001220504400340200241003a000020" + "0241016a2102200541016b22050d000b0b200141016b4107490d000340200241003a0000200241076a41003a000020" + "0241066a41003a0000200241056a41003a0000200241046a41003a0000200241036a41003a0000200241026a41003a" + "0000200241016a41003a0000200241086a22022003470d000b0b024020074114200841202004418002101222014100" + "4a044041e995c00041102001ad10011a20014181024f0d0641f995c000410920042001410110021a0c010b418296c0" + "00412e2001ac10011a0b41b096c000411241c296c00041074101100222014100480d0541c996c000411d2001ad1001" + "1a41e696c0004111422a1001410048044041ad97c000411a42a47b10011a41a47b21020c070b41f796c000411c4200" + "10011a41012102419397c000411a41014100410010021a41ff97c000412941014100410010021a41a898c000412810" + "132201412846044041d098c000412741a898c0004128410110021a41f798c000411e41014100410010021a41bf80c0" + "00412841014100410010021a0c070b419599c000411a2001ac10011a41c37a21020c060b41f494c000411d2001ac10" + "011a418b7c21020c050b41d894c000411c2001ac10011a41897c21020c040b41bc94c000411c2001ac10011a41887c" + "21020c030b41dd97c00041222001ac10011a41a77b21020c020b000b41c797c00041162001ac10011a41a57b21020b" + "200041b0036a240020020b0d00200020012002411410191a0b0c00200041142001412010180b0e0020004182801820" + "01200210140b0e002000200141022002412010150b0a0020004183803c10160b0a0020002001410210170b0bb91901" + "00418080c0000baf196572726f725f636f64653d3d3d3d20484f53542046554e4354494f4e532054455354203d3d3d" + "54657374696e6720323620686f73742066756e6374696f6e73535543434553533a20416c6c20686f73742066756e63" + "74696f6e20746573747320706173736564212d2d2d2043617465676f727920313a204c656467657220486561646572" + "2046756e6374696f6e73202d2d2d4c65646765722073657175656e6365206e756d6265723a506172656e74206c6564" + "6765722074696d653a506172656e74206c656467657220686173683a535543434553533a204c656467657220686561" + "6465722066756e6374696f6e734552524f523a206765745f706172656e745f6c65646765725f686173682077726f6e" + "67206c656e6774683a4552524f523a206765745f706172656e745f6c65646765725f74696d65206661696c65643a45" + "52524f523a206765745f6c65646765725f73716e206661696c65643a2d2d2d2043617465676f727920323a20547261" + "6e73616374696f6e20446174612046756e6374696f6e73202d2d2d5472616e73616374696f6e204163636f756e743a" + "5472616e73616374696f6e20466565206c656e6774683a5472616e73616374696f6e20466565202873657269616c69" + "7a65642058525020616d6f756e74293a5472616e73616374696f6e2053657175656e63653a4e657374656420666965" + "6c64206c656e6774683a4e6573746564206669656c643a494e464f3a206765745f74785f6e65737465645f6669656c" + "64206e6f74206170706c696361626c653a5369676e657273206172726179206c656e6774683a4d656d6f7320617272" + "6179206c656e6774683a4e6573746564206172726179206c656e6774683a494e464f3a206765745f74785f6e657374" + "65645f61727261795f6c656e206e6f74206170706c696361626c653a535543434553533a205472616e73616374696f" + "6e20646174612066756e6374696f6e734552524f523a206765745f74785f6669656c642853657175656e6365292077" + "726f6e67206c656e6774683a4552524f523a206765745f74785f6669656c6428466565292077726f6e67206c656e67" + "746820286578706563746564203820627974657320666f7220585250293a4552524f523a206765745f74785f666965" + "6c64284163636f756e74292077726f6e67206c656e6774683a2d2d2d2043617465676f727920333a2043757272656e" + "74204c6564676572204f626a6563742046756e6374696f6e73202d2d2d43757272656e74206f626a6563742062616c" + "616e6365206c656e677468202858525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "202873657269616c697a65642058525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "206c656e67746820286e6f6e2d58525020616d6f756e74293a43757272656e74206f626a6563742062616c616e6365" + "3a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c642842616c616e636529206661" + "696c656420286d6179206265206578706563746564293a43757272656e74206c6564676572206f626a656374206163" + "636f756e743a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6669656c64284163636f756e" + "7429206661696c65643a43757272656e74206e6573746564206669656c64206c656e6774683a43757272656e74206e" + "6573746564206669656c643a494e464f3a206765745f63757272656e745f6c65646765725f6f626a5f6e6573746564" + "5f6669656c64206e6f74206170706c696361626c653a43757272656e74206f626a656374205369676e657273206172" + "726179206c656e6774683a43757272656e74206e6573746564206172726179206c656e6774683a494e464f3a206765" + "745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206e6f74206170706c69" + "6361626c653a535543434553533a2043757272656e74206c6564676572206f626a6563742066756e6374696f6e732d" + "2d2d2043617465676f727920343a20416e79204c6564676572204f626a6563742046756e6374696f6e73202d2d2d53" + "75636365737366756c6c7920636163686564206f626a65637420696e20736c6f743a436163686564206f626a656374" + "2062616c616e6365206c656e677468202858525020616d6f756e74293a436163686564206f626a6563742062616c61" + "6e6365202873657269616c697a65642058525020616d6f756e74293a436163686564206f626a6563742062616c616e" + "6365206c656e67746820286e6f6e2d58525020616d6f756e74293a436163686564206f626a6563742062616c616e63" + "653a494e464f3a206765745f6c65646765725f6f626a5f6669656c642842616c616e636529206661696c65643a4361" + "63686564206e6573746564206669656c64206c656e6774683a436163686564206e6573746564206669656c643a494e" + "464f3a206765745f6c65646765725f6f626a5f6e65737465645f6669656c64206e6f74206170706c696361626c653a" + "436163686564206f626a656374205369676e657273206172726179206c656e6774683a436163686564206e65737465" + "64206172726179206c656e6774683a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e206e6f74206170706c696361626c653a535543434553533a20416e79206c6564676572206f626a656374" + "2066756e6374696f6e73494e464f3a2063616368655f6c65646765725f6f626a206661696c65642028657870656374" + "656420776974682074657374206669787475726573293a494e464f3a206765745f6c65646765725f6f626a5f666965" + "6c64206661696c656420617320657870656374656420286e6f20636163686564206f626a656374293a494e464f3a20" + "6765745f6c65646765725f6f626a5f6e65737465645f6669656c64206661696c65642061732065787065637465643a" + "494e464f3a206765745f6c65646765725f6f626a5f61727261795f6c656e206661696c656420617320657870656374" + "65643a494e464f3a206765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e206661696c6564" + "2061732065787065637465643a535543434553533a20416e79206c6564676572206f626a6563742066756e6374696f" + "6e732028696e7465726661636520746573746564294552524f523a206163636f756e745f6b65796c6574206661696c" + "656420666f722063616368696e6720746573743a2d2d2d2043617465676f727920353a204b65796c65742047656e65" + "726174696f6e2046756e6374696f6e73202d2d2d4163636f756e74206b65796c65743a546573745479706543726564" + "656e7469616c206b65796c65743a494e464f3a2063726564656e7469616c5f6b65796c6574206661696c6564202865" + "78706563746564202d20696e74657266616365206973737565293a457363726f77206b65796c65743a4f7261636c65" + "206b65796c65743a535543434553533a204b65796c65742067656e65726174696f6e2066756e6374696f6e73455252" + "4f523a206f7261636c655f6b65796c6574206661696c65643a4552524f523a20657363726f775f6b65796c65742066" + "61696c65643a4552524f523a206163636f756e745f6b65796c6574206661696c65643a2d2d2d2043617465676f7279" + "20363a205574696c6974792046756e6374696f6e73202d2d2d48656c6c6f2c205852504c205741534d20776f726c64" + "21496e70757420646174613a5348413531322068616c6620686173683a4e46542064617461206c656e6774683a4e46" + "5420646174613a494e464f3a206765745f6e6674206661696c656420286578706563746564202d206e6f2073756368" + "204e4654293a54657374207472616365206d6573736167657061796c6f616454726163652066756e6374696f6e2062" + "79746573207772697474656e3a54657374206e756d62657220747261636554726163655f6e756d2066756e6374696f" + "6e20737563636565646564535543434553533a205574696c6974792066756e6374696f6e734552524f523a20747261" + "63655f6e756d2829206661696c65643a4552524f523a2074726163652829206661696c65643a4552524f523a20636f" + "6d707574655f7368613531325f68616c66206661696c65643a2d2d2d2043617465676f727920373a20446174612055" + "70646174652046756e6374696f6e73202d2d2d55706461746564206c656467657220656e7472792064617461206672" + "6f6d205741534d20746573745375636365737366756c6c792075706461746564206c656467657220656e7472792077" + "6974683a535543434553533a2044617461207570646174652066756e6374696f6e734552524f523a20757064617465" + "5f64617461206661696c65643a004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" + "65737365642d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d303929002c" + "0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; extern std::string const deepRecursionHex = - "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69" - "736800000a16011400230045044041010f0b230041016b240010000b"; + "0061736d010000000105016000017f030201000608017f0141c0843d0b070a010666696e69736800000a1601140023" + "0045044041010f0b230041016b240010000b"; extern std::string const allKeyletsWasmHex = - "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f" - "7f7f017f60037f7f7f017f60037f7f7e017f60057f7f7f7f7f017f60057f7f7f7f7f006000" - "017f60037f7f7f000284051808686f73745f6c69620974726163655f6e756d000408686f73" - "745f6c6962057472616365000508686f73745f6c69621063616368655f6c65646765725f6f" - "626a000308686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108" - "686f73745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64" - "000308686f73745f6c69620d74726163655f6163636f756e74000108686f73745f6c69620e" - "6163636f756e745f6b65796c6574000108686f73745f6c69620b6c696e655f6b65796c6574" - "000208686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69620c636865" - "636b5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c65" - "74000208686f73745f6c69620f64656c65676174655f6b65796c6574000008686f73745f6c" - "6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a" - "6469645f6b65796c6574000108686f73745f6c69620d657363726f775f6b65796c65740000" - "08686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008686f73745f" - "6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c6962106e66745f6f6666" - "65725f6b65796c6574000008686f73745f6c69620c6f666665725f6b65796c657400000868" - "6f73745f6c69620e7061796368616e5f6b65796c6574000208686f73745f6c69621a706572" - "6d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620e7369" - "676e6572735f6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c6574" - "000008686f73745f6c69620c7661756c745f6b65796c657400000304030607080503010011" - "0619037f01418080c0000b7f0041ad8ac0000b7f0041b08ac0000b073e05066d656d6f7279" - "02000d6f626a6563745f65786973747300180666696e69736800190a5f5f646174615f656e" - "6403010b5f5f686561705f6261736503020ab73403a80502017f017e230041a0016b220524" - "00024020012d0000410146044041c280c000411620012802042201ac10001a200041013a00" - "00200020013602040c010b200541186a200141196a290000370300200541106a200141116a" - "290000370300200541086a200141096a290000370300200520012900013703002002200320" - "054120410110011a02402005412041001002220141004a04402004450440418b80c000410f" - "4285801410001a20014185801420054180016a412010032201412047044041a680c0004115" - "417f20012001417f4e1b2201ac10001a200041013a0000200020013602040c040b200541c2" - "006a20054182016a2d00003a0000200541f0006a20054197016a2900002206370300200541" - "286a22012005418f016a290000370300200541306a22022006370300200541386a22032005" - "419f016a2d00003a0000200520052f0080013b014020052005290087013703202005200528" - "008301360043200541df006a20032d00003a0000200541d7006a2002290300370000200541" - "cf006a200129030037000020052005290320370047419a80c000410c200541406b41204101" - "10011a0c020b418b80c000410f2004ac10001a2001200420054180016a4114100322014114" - "47044041a680c0004115417f20012001417f4e1b2201ac10001a200041013a000020002001" - "3602040c030b200541c2006a20054182016a2d00003a000020052005290087013703602005" - "2005418c016a290000370065200520052f0080013b01402005200529036037032020052005" - "2900653700252005200528008301360043200541cc006a2005290025370000200520052903" - "20370047419a80c000410c200541406b4114410110011a0c010b41bb80c00041072001ac10" - "001a200041013a0000200020013602040c010b20004180023b01000b200541a0016a24000b" - "8b2a02087f027e23004180076b2200240041d880c000412341014100410010011a02402000" - "027f02404181802020004188016a22024114100422014114460440200041066a2000418a01" - "6a22032d00003a00002000200029008f013703e001200020004194016a22042900003700e5" - "01200020002f0088013b0104200020002903e0013703d806200020002900e5013700dd0620" - "00200028008b01360007200041106a20002900dd06370000200020002903d80637000b41fb" - "80c0004108200041046a2205411410051a4183802020024114100422014114470d03200041" - "1a6a20032d00003a00002000200029008f013703e001200020042900003700e50120002000" - "2f0088013b0118200020002903e0013703d806200020002900e5013700dd06200020002800" - "8b0136001b200041246a20002900dd06370000200020002903d80637001f418381c000410c" - "200041186a411410051a200041a0016a2203420037030020004198016a2204420037030020" - "004190016a420037030020004200370388012005411420024120100622014120460d010240" - "20014100480440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5" - "006a20032903003700002000413d6a2004290300370000200041356a20004190016a290300" - "370000200020002903880137002d41000b3a002c20004188016a2000412c6a418f81c00041" - "07418180201018024020002d0088014101460440200028028c01210141878ac00041124205" - "10001a0c010b41002101419681c000413541014100410010011a200041de006a41c4003a00" - "00200041d8006a4100360200200041e3006a41003a0000200041d5a6013b015c2000420037" - "03502000410036005f200041a0016a2203420037030020004198016a220442003703002000" - "4190016a2205420037030020004200370388010240200041046a4114200041186a41142000" - "41d0006a411420004188016a41201007220241204704400240200241004804402000200236" - "02680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000200041" - "f5006a2004290300370000200041ed006a200529030037000020002000290388013700650b" - "200020013a006420004188016a200041e4006a41cb81c00041094100101820002d00880141" - "01460440200028028c01210141878ac0004112420510001a0c010b41d481c0004137410141" - "00410010011a200041f0016a200041286a2203280100360200200041e8016a200041206a22" - "04290100370300200041fc016a200041d8006a290300220837020020004184026a200041e0" - "006a2802002202360200200020002901183703e0012000200029035022093702f401200041" - "e8066a22012002360200200041e0066a22022008370300200020093703d806200041f4066a" - "2004290100370200200041fc066a2003280100360200200020002901183702ec0620004188" - "026a200041d8066a22034128101a2000418c016a200041e0016a41d000101a200041013602" - "8801200041f0066a220442003703002001420037030020024200370300200042003703d806" - "2000027f41998ac0004114200041b4016a4128200341201008220341204704400240200341" - "00480440200020033602e4010c010b2000417f3602e4010b41010c010b200041f9016a2004" - "290300370000200041f1016a2001290300370000200041e9016a2002290300370000200020" - "002903d8063700e10141000b3a00e001200041b4026a200041e0016a418b82c00041034181" - "8020101820002d00b402410146044020002802b802210141878ac0004112420610001a0c01" - "0b41002101418e82c000413141014100410010011a200041808080303602d806200041f801" - "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" - "003703e0010240200041046a4114200041d8066a4104200041e0016a412010092202412047" - "0440024020024100480440200020023602c0020c010b2000417f3602c0020b410121010c01" - "0b200041d5026a2003290300370000200041cd026a2004290300370000200041c5026a2005" - "290300370000200020002903e0013700bd020b200020013a00bc02200041e0016a200041bc" - "026a41bf82c000410541818020101820002d00e001410146044020002802e401210141878a" - "c0004112420610001a0c010b4100210141c482c000413341014100410010011a200041f801" - "6a22034200370300200041f0016a22044200370300200041e8016a22054200370300200042" - "003703e0010240200041046a220241142002411441f782c0004112200041e0016a4120100a" - "22024120470440024020024100480440200020023602e4020c010b2000417f3602e4020b41" - "0121010c010b200041f9026a2003290300370000200041f1026a2004290300370000200041" - "e9026a2005290300370000200020002903e0013700e1020b200020013a00e002200041e001" - "6a200041e0026a418983c000410a41988020101820002d00e001410146044020002802e401" - "210141878ac0004112420710001a0c010b41002101419383c000413841014100410010011a" - "200041f8016a22034200370300200041f0016a22044200370300200041e8016a2205420037" - "0300200042003703e0010240200041046a4114200041186a4114200041e0016a4120100b22" - "02412047044002402002410048044020002002360288030c010b2000417f360288030b4101" - "21010c010b2000419d036a200329030037000020004195036a20042903003700002000418d" - "036a2005290300370000200020002903e001370085030b200020013a008403200041e0016a" - "20004184036a41cb83c000410841818020101820002d00e001410146044020002802e40121" - "0141878ac0004112420810001a0c010b41d383c000413641014100410010011a230041206b" - "22012400200141186a22044200370300200141106a22054200370300200141086a22064200" - "37030020014200370300200041a8036a2202027f200041046a4114200041186a4114200141" - "20100c22034120470440024020034100480440200220033602040c010b2002417f3602040b" - "41010c010b20022001290300370001200241196a2004290300370000200241116a20052903" - "00370000200241096a200629030037000041000b3a0000200141206a2400200041e0016a20" - "02418984c000410e41818020101820002d00e001410146044020002802e401210141878ac0" - "004112420910001a0c010b419784c000413c41014100410010011a230041206b2201240020" - "0141186a22044200370300200141106a22054200370300200141086a220642003703002001" - "4200370300200041cc036a2202027f200041046a411420014120100d220341204704400240" - "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300" - "370001200241196a2004290300370000200241116a2005290300370000200241096a200629" - "030037000041000b3a0000200141206a2400200041e0016a200241d384c000410341818020" - "101820002d00e001410146044020002802e401210141878ac0004112420a10001a0c010b41" - "d684c000413141014100410010011a230041306b22012400200141808080d80036020c2001" - "41286a22044200370300200141206a22054200370300200141186a22064200370300200142" - "00370310200041f0036a2202027f200041046a41142001410c6a4104200141106a4120100e" - "22034120470440024020034100480440200220033602040c010b2002417f3602040b41010c" - "010b20022001290310370001200241196a2004290300370000200241116a20052903003700" - "00200241096a200629030037000041000b3a0000200141306a2400200041e0016a20024187" - "85c000410641818020101820002d00e001410146044020002802e401210141878ac0004112" - "420b10001a0c010b418d85c000413441014100410010011a230041306b2201240020014180" - "8080e00036020c200141286a22044200370300200141206a22054200370300200141186a22" - "0642003703002001420037031020004194046a2202027f200041046a41142001410c6a4104" - "200141106a4120100f22034120470440024020034100480440200220033602040c010b2002" - "417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241" - "116a2005290300370000200241096a200629030037000041000b3a0000200141306a240020" - "0041f4016a200041146a280100360200200041ec016a2000410c6a29010037020020002000" - "2901043702e401200041808080e0003602e001200041d8066a200241c185c000410b418480" - "20101820002d00d806410146044020002802dc06210141878ac0004112420c10001a0c010b" - "41cc85c000413941014100410010011a230041206b22012400200141186a22044200370300" - "200141106a22054200370300200141086a2206420037030020014200370300200041b8046a" - "2202027f200041e0016a4118200041186a4114200141201010220341204704400240200341" - "00480440200220033602040c010b2002417f3602040b41010c010b20022001290300370001" - "200241196a2004290300370000200241116a2005290300370000200241096a200629030037" - "000041000b3a0000200141206a2400200041d8066a2002418586c000410741818020101820" - "002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b418c86c0" - "00413541014100410010011a230041306b220124002001418080803036020c200141286a22" - "044200370300200141206a22054200370300200141186a2206420037030020014200370310" - "200041dc046a2202027f200041186a41142001410c6a4104200141106a4120101122034120" - "470440024020034100480440200220033602040c010b2002417f3602040b41010c010b2002" - "2001290310370001200241196a2004290300370000200241116a2005290300370000200241" - "096a200629030037000041000b3a0000200141306a2400200041d8066a200241c186c00041" - "0c41828020101820002d00d806410146044020002802dc06210141878ac0004112420d1000" - "1a0c010b41cd86c000413a41014100410010011a230041306b22012400200141808080e800" - "36020c200141286a22044200370300200141206a22054200370300200141186a2206420037" - "03002001420037031020004180056a2202027f200041046a41142001410c6a410420014110" - "6a4120101222034120470440024020034100480440200220033602040c010b2002417f3602" - "040b41010c010b20022001290310370001200241196a2004290300370000200241116a2005" - "290300370000200241096a200629030037000041000b3a0000200141306a2400200041d806" - "6a2002418787c000410541818020101820002d00d806410146044020002802dc0621014187" - "8ac0004112420d10001a0c010b418c87c000413341014100410010011a230041306b220124" - "00200141808080f00036020c200141286a22044200370300200141206a2205420037030020" - "0141186a2206420037030020014200370310200041a4056a2202027f200041046a41142000" - "41186a41142001410c6a4104200141106a4120101322034120470440024020034100480440" - "200220033602040c010b2002417f3602040b41010c010b2002200129031037000120024119" - "6a2004290300370000200241116a2005290300370000200241096a20062903003700004100" - "0b3a0000200141306a2400200041d8066a200241bf87c000410a41818020101820002d00d8" - "06410146044020002802dc06210141878ac0004112420e10001a0c010b41c987c000413841" - "014100410010011a230041306b22012400200141808080f80036020c200141286a22044200" - "370300200141206a22054200370300200141186a2206420037030020014200370310200041" - "c8056a2202027f200041046a41142001410c6a4104200141106a4120101422034120470440" - "024020034100480440200220033602040c010b2002417f3602040b41010c010b2002200129" - "0310370001200241196a2004290300370000200241116a2005290300370000200241096a20" - "0629030037000041000b3a0000200141306a2400200041d8066a2002418188c00041124182" - "8020101820002d00d806410146044020002802dc06210141878ac0004112420f10001a0c01" - "0b419388c00041c00041014100410010011a230041206b22012400200141186a2204420037" - "0300200141106a22054200370300200141086a2206420037030020014200370300200041ec" - "056a2202027f200041046a4114200141201015220341204704400240200341004804402002" - "20033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" - "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a" - "0000200141206a2400200041d8066a200241d388c000410a4100101820002d00d806410146" - "044020002802dc06210141878ac0004112421010001a0c010b41dd88c00041384101410041" - "0010011a230041306b22012400200141808080900136020c200141286a2204420037030020" - "0141206a22054200370300200141186a220642003703002001420037031020004190066a22" - "02027f200041046a41142001410c6a4104200141106a412010162203412047044002402003" - "4100480440200220033602040c010b2002417f3602040b41010c010b200220012903103700" - "01200241196a2004290300370000200241116a2005290300370000200241096a2006290300" - "37000041000b3a0000200141306a2400200041d8066a2002419589c0004106418180201018" - "20002d00d806410146044020002802dc06210141878ac0004112421210001a0c010b410121" - "01419b89c000413441014100410010011a230041306b22022400200241808080980136020c" - "200241286a22054200370300200241206a22064200370300200241186a2207420037030020" - "024200370310200041b4066a2203027f200041046a41142002410c6a4104200241106a4120" - "101722044120470440024020044100480440200320043602040c010b2003417f3602040b41" - "010c010b20032002290310370001200341196a2005290300370000200341116a2006290300" - "370000200341096a200729030037000041000b3a0000200241306a2400200041d8066a2003" - "41cf89c000410541818020101820002d00d806410146044020002802dc06210141878ac000" - "4112421310001a0c010b41d489c000413341014100410010011a0b20004180076a24002001" - "0f0b418080c000410b417f20012001417f4e1bac1000000bfd0401067f200241104f044002" - "4020002000410020006b41037122056a22044f0d0020012103200504402005210603402000" - "20032d00003a0000200341016a2103200041016a2100200641016b22060d000b0b20054101" - "6b4107490d000340200020032d00003a0000200041016a200341016a2d00003a0000200041" - "026a200341026a2d00003a0000200041036a200341036a2d00003a0000200041046a200341" - "046a2d00003a0000200041056a200341056a2d00003a0000200041066a200341066a2d0000" - "3a0000200041076a200341076a2d00003a0000200341086a2103200041086a22002004470d" - "000b0b2004200220056b2207417c7122086a21000240200120056a22064103714504402000" - "20044d0d0120062101034020042001280200360200200141046a2101200441046a22042000" - "490d000b0c010b200020044d0d002006410374220541187121032006417c71220241046a21" - "01410020056b41187121052002280200210203402004200220037620012802002202200574" - "72360200200141046a2101200441046a22042000490d000b0b20074103712102200620086a" - "21010b02402000200020026a22064f0d002002410771220304400340200020012d00003a00" - "00200141016a2101200041016a2100200341016b22030d000b0b200241016b4107490d0003" - "40200020012d00003a0000200041016a200141016a2d00003a0000200041026a200141026a" - "2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a00" - "00200041056a200141056a2d00003a0000200041066a200141066a2d00003a000020004107" - "6a200141076a2d00003a0000200141086a2101200041086a22002006470d000b0b0b0ba30a" - "0100418080c0000b990a6572726f725f636f64653d47657474696e67206669656c643a2046" - "69656c6420646174613a204572726f722067657474696e67206669656c643a204572726f72" - "3a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e" - "47205741534d20455845435554494f4e2024242424244163636f756e743a44657374696e61" - "74696f6e3a4163636f756e744163636f756e74206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e54727573746c696e65" - "54727573746c696e65206f626a656374206578697374732c2070726f63656564696e672077" - "69746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374" - "732c2070726f63656564696e67207769746820657363726f772066696e6973682e43686563" - "6b436865636b206f626a656374206578697374732c2070726f63656564696e672077697468" - "20657363726f772066696e6973682e7465726d73616e64636f6e646974696f6e7343726564" - "656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e44656c656761746544656c65" - "67617465206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e4465706f736974507265617574684465706f736974507265" - "61757468206f626a656374206578697374732c2070726f63656564696e6720776974682065" - "7363726f772066696e6973682e444944444944206f626a656374206578697374732c207072" - "6f63656564696e67207769746820657363726f772066696e6973682e457363726f77457363" - "726f77206f626a656374206578697374732c2070726f63656564696e672077697468206573" - "63726f772066696e6973682e4d505449737375616e63654d505449737375616e6365206f62" - "6a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" - "696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070" - "726f63656564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f" - "666665724e46546f6b656e4f66666572206f626a656374206578697374732c2070726f6365" - "6564696e67207769746820657363726f772066696e6973682e4f666665724f66666572206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e50" - "65726d697373696f6e6564446f6d61696e5065726d697373696f6e6564446f6d61696e206f" - "626a656374206578697374732c2070726f63656564696e67207769746820657363726f7720" - "66696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" - "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e54" - "69636b65745469636b6574206f626a656374206578697374732c2070726f63656564696e67" - "207769746820657363726f772066696e6973682e5661756c745661756c74206f626a656374" - "206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973" - "682e43757272656e74207365712076616c75653a004d0970726f64756365727302086c616e" - "6775616765010452757374000c70726f6365737365642d6279010572757374631d312e3837" - "2e30202831373036376539616320323032352d30352d303929002c0f7461726765745f6665" - "617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "0061736d0100000001480960067f7f7f7f7f7f017f60047f7f7f7f017f60087f7f7f7f7f7f7f7f017f60037f7f7f01" + "7f60037f7f7e017f60057f7f7f7f7f017f60057f7f7f7f7f006000017f60037f7f7f000284051808686f73745f6c69" + "620974726163655f6e756d000408686f73745f6c6962057472616365000508686f73745f6c69621063616368655f6c" + "65646765725f6f626a000308686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108686f73" + "745f6c69621c6765745f63757272656e745f6c65646765725f6f626a5f6669656c64000308686f73745f6c69620d74" + "726163655f6163636f756e74000108686f73745f6c69620e6163636f756e745f6b65796c6574000108686f73745f6c" + "69620b6c696e655f6b65796c6574000208686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c6962" + "0c636865636b5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b65796c6574000208686f" + "73745f6c69620f64656c65676174655f6b65796c6574000008686f73745f6c6962166465706f7369745f7072656175" + "74685f6b65796c6574000008686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620d65736372" + "6f775f6b65796c6574000008686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008686f7374" + "5f6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c6574" + "000008686f73745f6c69620c6f666665725f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b6579" + "6c6574000208686f73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73" + "745f6c69620e7369676e6572735f6b65796c6574000108686f73745f6c69620d7469636b65745f6b65796c65740000" + "08686f73745f6c69620c7661756c745f6b65796c6574000003040306070805030100110619037f01418080c0000b7f" + "0041ad8ac0000b7f0041b08ac0000b073e05066d656d6f727902000d6f626a6563745f65786973747300180666696e" + "69736800190a5f5f646174615f656e6403010b5f5f686561705f6261736503020ab73403a80502017f017e230041a0" + "016b22052400024020012d0000410146044041c280c000411620012802042201ac10001a200041013a000020002001" + "3602040c010b200541186a200141196a290000370300200541106a200141116a290000370300200541086a20014109" + "6a290000370300200520012900013703002002200320054120410110011a02402005412041001002220141004a0440" + "2004450440418b80c000410f4285801410001a20014185801420054180016a412010032201412047044041a680c000" + "4115417f20012001417f4e1b2201ac10001a200041013a0000200020013602040c040b200541c2006a20054182016a" + "2d00003a0000200541f0006a20054197016a2900002206370300200541286a22012005418f016a2900003703002005" + "41306a22022006370300200541386a22032005419f016a2d00003a0000200520052f0080013b014020052005290087" + "013703202005200528008301360043200541df006a20032d00003a0000200541d7006a2002290300370000200541cf" + "006a200129030037000020052005290320370047419a80c000410c200541406b4120410110011a0c020b418b80c000" + "410f2004ac10001a2001200420054180016a411410032201411447044041a680c0004115417f20012001417f4e1b22" + "01ac10001a200041013a0000200020013602040c030b200541c2006a20054182016a2d00003a000020052005290087" + "0137036020052005418c016a290000370065200520052f0080013b0140200520052903603703202005200529006537" + "00252005200528008301360043200541cc006a200529002537000020052005290320370047419a80c000410c200541" + "406b4114410110011a0c010b41bb80c00041072001ac10001a200041013a0000200020013602040c010b2000418002" + "3b01000b200541a0016a24000b8b2a02087f027e23004180076b2200240041d880c000412341014100410010011a02" + "402000027f02404181802020004188016a22024114100422014114460440200041066a2000418a016a22032d00003a" + "00002000200029008f013703e001200020004194016a22042900003700e501200020002f0088013b01042000200029" + "03e0013703d806200020002900e5013700dd062000200028008b01360007200041106a20002900dd06370000200020" + "002903d80637000b41fb80c0004108200041046a2205411410051a4183802020024114100422014114470d03200041" + "1a6a20032d00003a00002000200029008f013703e001200020042900003700e501200020002f0088013b0118200020" + "002903e0013703d806200020002900e5013700dd062000200028008b0136001b200041246a20002900dd0637000020" + "0020002903d80637001f418381c000410c200041186a411410051a200041a0016a2203420037030020004198016a22" + "04420037030020004190016a420037030020004200370388012005411420024120100622014120460d010240200141" + "00480440200020013602300c010b2000417f3602300b41010c020b0c020b200041c5006a2003290300370000200041" + "3d6a2004290300370000200041356a20004190016a290300370000200020002903880137002d41000b3a002c200041" + "88016a2000412c6a418f81c0004107418180201018024020002d0088014101460440200028028c01210141878ac000" + "4112420510001a0c010b41002101419681c000413541014100410010011a200041de006a41c4003a0000200041d800" + "6a4100360200200041e3006a41003a0000200041d5a6013b015c200042003703502000410036005f200041a0016a22" + "03420037030020004198016a2204420037030020004190016a2205420037030020004200370388010240200041046a" + "4114200041186a4114200041d0006a411420004188016a412010072202412047044002402002410048044020002002" + "3602680c010b2000417f3602680b410121010c010b200041fd006a2003290300370000200041f5006a200429030037" + "0000200041ed006a200529030037000020002000290388013700650b200020013a006420004188016a200041e4006a" + "41cb81c00041094100101820002d0088014101460440200028028c01210141878ac0004112420510001a0c010b41d4" + "81c000413741014100410010011a200041f0016a200041286a2203280100360200200041e8016a200041206a220429" + "0100370300200041fc016a200041d8006a290300220837020020004184026a200041e0006a28020022023602002000" + "20002901183703e0012000200029035022093702f401200041e8066a22012002360200200041e0066a220220083703" + "00200020093703d806200041f4066a2004290100370200200041fc066a2003280100360200200020002901183702ec" + "0620004188026a200041d8066a22034128101a2000418c016a200041e0016a41d000101a2000410136028801200041" + "f0066a220442003703002001420037030020024200370300200042003703d8062000027f41998ac0004114200041b4" + "016a412820034120100822034120470440024020034100480440200020033602e4010c010b2000417f3602e4010b41" + "010c010b200041f9016a2004290300370000200041f1016a2001290300370000200041e9016a200229030037000020" + "0020002903d8063700e10141000b3a00e001200041b4026a200041e0016a418b82c000410341818020101820002d00" + "b402410146044020002802b802210141878ac0004112420610001a0c010b41002101418e82c0004131410141004100" + "10011a200041808080303602d806200041f8016a22034200370300200041f0016a22044200370300200041e8016a22" + "054200370300200042003703e0010240200041046a4114200041d8066a4104200041e0016a41201009220241204704" + "40024020024100480440200020023602c0020c010b2000417f3602c0020b410121010c010b200041d5026a20032903" + "00370000200041cd026a2004290300370000200041c5026a2005290300370000200020002903e0013700bd020b2000" + "20013a00bc02200041e0016a200041bc026a41bf82c000410541818020101820002d00e001410146044020002802e4" + "01210141878ac0004112420610001a0c010b4100210141c482c000413341014100410010011a200041f8016a220342" + "00370300200041f0016a22044200370300200041e8016a22054200370300200042003703e0010240200041046a2202" + "41142002411441f782c0004112200041e0016a4120100a22024120470440024020024100480440200020023602e402" + "0c010b2000417f3602e4020b410121010c010b200041f9026a2003290300370000200041f1026a2004290300370000" + "200041e9026a2005290300370000200020002903e0013700e1020b200020013a00e002200041e0016a200041e0026a" + "418983c000410a41988020101820002d00e001410146044020002802e401210141878ac0004112420710001a0c010b" + "41002101419383c000413841014100410010011a200041f8016a22034200370300200041f0016a2204420037030020" + "0041e8016a22054200370300200042003703e0010240200041046a4114200041186a4114200041e0016a4120100b22" + "02412047044002402002410048044020002002360288030c010b2000417f360288030b410121010c010b2000419d03" + "6a200329030037000020004195036a20042903003700002000418d036a2005290300370000200020002903e0013700" + "85030b200020013a008403200041e0016a20004184036a41cb83c000410841818020101820002d00e0014101460440" + "20002802e401210141878ac0004112420810001a0c010b41d383c000413641014100410010011a230041206b220124" + "00200141186a22044200370300200141106a22054200370300200141086a2206420037030020014200370300200041" + "a8036a2202027f200041046a4114200041186a411420014120100c2203412047044002402003410048044020022003" + "3602040c010b2002417f3602040b41010c010b20022001290300370001200241196a2004290300370000200241116a" + "2005290300370000200241096a200629030037000041000b3a0000200141206a2400200041e0016a2002418984c000" + "410e41818020101820002d00e001410146044020002802e401210141878ac0004112420910001a0c010b419784c000" + "413c41014100410010011a230041206b22012400200141186a22044200370300200141106a22054200370300200141" + "086a2206420037030020014200370300200041cc036a2202027f200041046a411420014120100d2203412047044002" + "4020034100480440200220033602040c010b2002417f3602040b41010c010b20022001290300370001200241196a20" + "04290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141206a240020" + "0041e0016a200241d384c000410341818020101820002d00e001410146044020002802e401210141878ac000411242" + "0a10001a0c010b41d684c000413141014100410010011a230041306b22012400200141808080d80036020c20014128" + "6a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041f0036a2202" + "027f200041046a41142001410c6a4104200141106a4120100e22034120470440024020034100480440200220033602" + "040c010b2002417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241116a2005" + "290300370000200241096a200629030037000041000b3a0000200141306a2400200041e0016a2002418785c0004106" + "41818020101820002d00e001410146044020002802e401210141878ac0004112420b10001a0c010b418d85c0004134" + "41014100410010011a230041306b22012400200141808080e00036020c200141286a22044200370300200141206a22" + "054200370300200141186a220642003703002001420037031020004194046a2202027f200041046a41142001410c6a" + "4104200141106a4120100f22034120470440024020034100480440200220033602040c010b2002417f3602040b4101" + "0c010b20022001290310370001200241196a2004290300370000200241116a2005290300370000200241096a200629" + "030037000041000b3a0000200141306a2400200041f4016a200041146a280100360200200041ec016a2000410c6a29" + "0100370200200020002901043702e401200041808080e0003602e001200041d8066a200241c185c000410b41848020" + "101820002d00d806410146044020002802dc06210141878ac0004112420c10001a0c010b41cc85c000413941014100" + "410010011a230041206b22012400200141186a22044200370300200141106a22054200370300200141086a22064200" + "37030020014200370300200041b8046a2202027f200041e0016a4118200041186a4114200141201010220341204704" + "40024020034100480440200220033602040c010b2002417f3602040b41010c010b2002200129030037000120024119" + "6a2004290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141206a24" + "00200041d8066a2002418586c000410741818020101820002d00d806410146044020002802dc06210141878ac00041" + "12420d10001a0c010b418c86c000413541014100410010011a230041306b220124002001418080803036020c200141" + "286a22044200370300200141206a22054200370300200141186a2206420037030020014200370310200041dc046a22" + "02027f200041186a41142001410c6a4104200141106a41201011220341204704400240200341004804402002200336" + "02040c010b2002417f3602040b41010c010b20022001290310370001200241196a2004290300370000200241116a20" + "05290300370000200241096a200629030037000041000b3a0000200141306a2400200041d8066a200241c186c00041" + "0c41828020101820002d00d806410146044020002802dc06210141878ac0004112420d10001a0c010b41cd86c00041" + "3a41014100410010011a230041306b22012400200141808080e80036020c200141286a22044200370300200141206a" + "22054200370300200141186a220642003703002001420037031020004180056a2202027f200041046a41142001410c" + "6a4104200141106a4120101222034120470440024020034100480440200220033602040c010b2002417f3602040b41" + "010c010b20022001290310370001200241196a2004290300370000200241116a2005290300370000200241096a2006" + "29030037000041000b3a0000200141306a2400200041d8066a2002418787c000410541818020101820002d00d80641" + "0146044020002802dc06210141878ac0004112420d10001a0c010b418c87c000413341014100410010011a23004130" + "6b22012400200141808080f00036020c200141286a22044200370300200141206a22054200370300200141186a2206" + "420037030020014200370310200041a4056a2202027f200041046a4114200041186a41142001410c6a410420014110" + "6a4120101322034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b200220" + "01290310370001200241196a2004290300370000200241116a2005290300370000200241096a200629030037000041" + "000b3a0000200141306a2400200041d8066a200241bf87c000410a41818020101820002d00d8064101460440200028" + "02dc06210141878ac0004112420e10001a0c010b41c987c000413841014100410010011a230041306b220124002001" + "41808080f80036020c200141286a22044200370300200141206a22054200370300200141186a220642003703002001" + "4200370310200041c8056a2202027f200041046a41142001410c6a4104200141106a41201014220341204704400240" + "20034100480440200220033602040c010b2002417f3602040b41010c010b20022001290310370001200241196a2004" + "290300370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141306a24002000" + "41d8066a2002418188c000411241828020101820002d00d806410146044020002802dc06210141878ac0004112420f" + "10001a0c010b419388c00041c00041014100410010011a230041206b22012400200141186a22044200370300200141" + "106a22054200370300200141086a2206420037030020014200370300200041ec056a2202027f200041046a41142001" + "4120101522034120470440024020034100480440200220033602040c010b2002417f3602040b41010c010b20022001" + "290300370001200241196a2004290300370000200241116a2005290300370000200241096a20062903003700004100" + "0b3a0000200141206a2400200041d8066a200241d388c000410a4100101820002d00d806410146044020002802dc06" + "210141878ac0004112421010001a0c010b41dd88c000413841014100410010011a230041306b220124002001418080" + "80900136020c200141286a22044200370300200141206a22054200370300200141186a220642003703002001420037" + "031020004190066a2202027f200041046a41142001410c6a4104200141106a41201016220341204704400240200341" + "00480440200220033602040c010b2002417f3602040b41010c010b20022001290310370001200241196a2004290300" + "370000200241116a2005290300370000200241096a200629030037000041000b3a0000200141306a2400200041d806" + "6a2002419589c000410641818020101820002d00d806410146044020002802dc06210141878ac0004112421210001a" + "0c010b41012101419b89c000413441014100410010011a230041306b22022400200241808080980136020c20024128" + "6a22054200370300200241206a22064200370300200241186a2207420037030020024200370310200041b4066a2203" + "027f200041046a41142002410c6a4104200241106a4120101722044120470440024020044100480440200320043602" + "040c010b2003417f3602040b41010c010b20032002290310370001200341196a2005290300370000200341116a2006" + "290300370000200341096a200729030037000041000b3a0000200241306a2400200041d8066a200341cf89c0004105" + "41818020101820002d00d806410146044020002802dc06210141878ac0004112421310001a0c010b41d489c0004133" + "41014100410010011a0b20004180076a240020010f0b418080c000410b417f20012001417f4e1bac1000000bfd0401" + "067f200241104f0440024020002000410020006b41037122056a22044f0d0020012103200504402005210603402000" + "20032d00003a0000200341016a2103200041016a2100200641016b22060d000b0b200541016b4107490d0003402000" + "20032d00003a0000200041016a200341016a2d00003a0000200041026a200341026a2d00003a0000200041036a2003" + "41036a2d00003a0000200041046a200341046a2d00003a0000200041056a200341056a2d00003a0000200041066a20" + "0341066a2d00003a0000200041076a200341076a2d00003a0000200341086a2103200041086a22002004470d000b0b" + "2004200220056b2207417c7122086a21000240200120056a2206410371450440200020044d0d012006210103402004" + "2001280200360200200141046a2101200441046a22042000490d000b0c010b200020044d0d00200641037422054118" + "7121032006417c71220241046a2101410020056b411871210520022802002102034020042002200376200128020022" + "0220057472360200200141046a2101200441046a22042000490d000b0b20074103712102200620086a21010b024020" + "00200020026a22064f0d002002410771220304400340200020012d00003a0000200141016a2101200041016a210020" + "0341016b22030d000b0b200241016b4107490d000340200020012d00003a0000200041016a200141016a2d00003a00" + "00200041026a200141026a2d00003a0000200041036a200141036a2d00003a0000200041046a200141046a2d00003a" + "0000200041056a200141056a2d00003a0000200041066a200141066a2d00003a0000200041076a200141076a2d0000" + "3a0000200141086a2101200041086a22002006470d000b0b0b0ba30a0100418080c0000b990a6572726f725f636f64" + "653d47657474696e67206669656c643a204669656c6420646174613a204572726f722067657474696e67206669656c" + "643a204572726f723a204572726f722067657474696e67206b65796c65743a202424242424205354415254494e4720" + "5741534d20455845435554494f4e2024242424244163636f756e743a44657374696e6174696f6e3a4163636f756e74" + "4163636f756e74206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066" + "696e6973682e54727573746c696e6554727573746c696e65206f626a656374206578697374732c2070726f63656564" + "696e67207769746820657363726f772066696e6973682e414d4d414d4d206f626a656374206578697374732c207072" + "6f63656564696e67207769746820657363726f772066696e6973682e436865636b436865636b206f626a6563742065" + "78697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e7465726d73616e64636f" + "6e646974696f6e7343726564656e7469616c43726564656e7469616c206f626a656374206578697374732c2070726f" + "63656564696e67207769746820657363726f772066696e6973682e44656c656761746544656c6567617465206f626a" + "656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e4465706f73" + "6974507265617574684465706f73697450726561757468206f626a656374206578697374732c2070726f6365656469" + "6e67207769746820657363726f772066696e6973682e444944444944206f626a656374206578697374732c2070726f" + "63656564696e67207769746820657363726f772066696e6973682e457363726f77457363726f77206f626a65637420" + "6578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e4d505449737375616e" + "63654d505449737375616e6365206f626a656374206578697374732c2070726f63656564696e672077697468206573" + "63726f772066696e6973682e4d50546f6b656e4d50546f6b656e206f626a656374206578697374732c2070726f6365" + "6564696e67207769746820657363726f772066696e6973682e4e46546f6b656e4f666665724e46546f6b656e4f6666" + "6572206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e697368" + "2e4f666665724f66666572206f626a656374206578697374732c2070726f63656564696e6720776974682065736372" + "6f772066696e6973682e5061794368616e6e656c5061794368616e6e656c206f626a656374206578697374732c2070" + "726f63656564696e67207769746820657363726f772066696e6973682e5065726d697373696f6e6564446f6d61696e" + "5065726d697373696f6e6564446f6d61696e206f626a656374206578697374732c2070726f63656564696e67207769" + "746820657363726f772066696e6973682e5369676e65724c6973745369676e65724c697374206f626a656374206578" + "697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e5469636b65745469636b65" + "74206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f772066696e6973682e" + "5661756c745661756c74206f626a656374206578697374732c2070726f63656564696e67207769746820657363726f" + "772066696e6973682e43757272656e74207365712076616c75653a004d0970726f64756365727302086c616e677561" + "6765010452757374000c70726f6365737365642d6279010572757374631d312e38372e302028313730363765396163" + "20323032352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c" + "732b087369676e2d657874"; extern std::string const codecovTestsWasmHex = "0061736d0100000001570b60067f7f7f7f7f7f017f60047f7f7f7f017f60027f7f017f60057f7f7f7f7f017f60037f" - "7f7f017f60077f7f7f7f" - "7f7f7f017f60087f7f7f7f7f7f7f7f017f60017f017f60037f7f7e017f60047f7f7f7f006000017f02990d3c08686f" - "73745f6c696205747261" - "6365000308686f73745f6c69620974726163655f6e756d000808686f73745f6c69620e6765745f6c65646765725f73" - "716e000208686f73745f" - "6c6962166765745f706172656e745f6c65646765725f74696d65000208686f73745f6c6962166765745f706172656e" - "745f6c65646765725f68" - "617368000208686f73745f6c69620c6765745f626173655f666565000208686f73745f6c696211616d656e646d656e" - "745f656e61626c656400" - "0208686f73745f6c69620c6765745f74785f6669656c64000408686f73745f6c69620e6163636f756e745f6b65796c" - "6574000108686f73745f" - "6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765745f63757272656e745f6c6564" - "6765725f6f626a5f6669" - "656c64000408686f73745f6c6962146765745f6c65646765725f6f626a5f6669656c64000108686f73745f6c696213" - "6765745f74785f6e6573" - "7465645f6669656c64000108686f73745f6c6962236765745f63757272656e745f6c65646765725f6f626a5f6e6573" - "7465645f6669656c6400" - "0108686f73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c64000308686f73745f6c" - "6962106765745f74785f" - "61727261795f6c656e000708686f73745f6c6962206765745f63757272656e745f6c65646765725f6f626a5f617272" - "61795f6c656e00070868" - "6f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c656e000208686f73745f6c696217676574" - "5f74785f6e6573746564" - "5f61727261795f6c656e000208686f73745f6c6962276765745f63757272656e745f6c65646765725f6f626a5f6e65" - "737465645f6172726179" - "5f6c656e000208686f73745f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e" - "000408686f73745f6c69" - "620b7570646174655f64617461000208686f73745f6c696213636f6d707574655f7368613531325f68616c66000108" - "686f73745f6c69620963" - "6865636b5f736967000008686f73745f6c6962076765745f6e6674000008686f73745f6c69620e6765745f6e66745f" - "69737375657200010868" - "6f73745f6c69620d6765745f6e66745f7461786f6e000108686f73745f6c69620d6765745f6e66745f666c61677300" - "0208686f73745f6c6962" - "146765745f6e66745f7472616e736665725f666565000208686f73745f6c69620e6765745f6e66745f73657269616c" - "000108686f73745f6c69" - "620d74726163655f6163636f756e74000108686f73745f6c69620c74726163655f616d6f756e74000108686f73745f" - "6c69620c636865636b5f" - "6b65796c6574000008686f73745f6c69620f666c6f61745f66726f6d5f75696e74000308686f73745f6c69620b6c69" - "6e655f6b65796c657400" - "0608686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c69621163726564656e7469616c5f6b6579" - "6c6574000608686f7374" - "5f6c69620e6d70746f6b656e5f6b65796c6574000008686f73745f6c69621274726163655f6f70617175655f666c6f" - "6174000108686f73745f" - "6c69620d666c6f61745f636f6d70617265000108686f73745f6c696209666c6f61745f616464000508686f73745f6c" - "69620e666c6f61745f73" - "75627472616374000508686f73745f6c69620e666c6f61745f6d756c7469706c79000508686f73745f6c69620c666c" - "6f61745f646976696465" - "000508686f73745f6c69620a666c6f61745f726f6f74000008686f73745f6c696209666c6f61745f706f7700000868" - "6f73745f6c696209666c" - "6f61745f6c6f67000308686f73745f6c69620d657363726f775f6b65796c6574000008686f73745f6c6962136d7074" - "5f69737375616e63655f" - "6b65796c6574000008686f73745f6c6962106e66745f6f666665725f6b65796c6574000008686f73745f6c69620c6f" - "666665725f6b65796c65" - "74000008686f73745f6c69620d6f7261636c655f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b" - "65796c6574000608686f" - "73745f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620d7469" - "636b65745f6b65796c65" - "74000008686f73745f6c69620c7661756c745f6b65796c6574000008686f73745f6c69620f64656c65676174655f6b" - "65796c6574000008686f" - "73745f6c6962166465706f7369745f707265617574685f6b65796c6574000008686f73745f6c69620a6469645f6b65" - "796c6574000108686f73" - "745f6c69620e7369676e6572735f6b65796c65740001030302090a05030100110619037f01418080c0000b7f0041bb" - "a1c0000b7f0041c0a1c0" - "000b072e04066d656d6f727902000666696e697368003d0a5f5f646174615f656e6403010b5f5f686561705f626173" - "6503020abf2c02460002" - "40200020014704402002200341014100410010001a20004100480d01418b80c000410b2000ad1001000b2002200320" - "00ac10011a0f0b418b80" - "c000410b2000ac1001000bf52b020a7f017e23004190026b22002400419680c000412341014100410010001a200041" - "00360260200041e0006a" - "220241041002410441bd8cc000410e103c20004100360260200241041003410441cb8cc0004116103c200041f8006a" - "22044200370300200041" - "f0006a22014200370300200041e8006a2205420037030020004200370360200241201004412041e18cc0004116103c" - "20004100360260200241" - "041005410441f78cc000410c103c200041106a2207428182848890a0c08001370300200041186a2206428182848890" - "a0c08001370300200041" - "206a2209428182848890a0c080013703002000428182848890a0c0800137030841b980c000410e1006410141c780c0" - "004111103c200041086a" - "41201006410141c780c0004111103c418180202002411410072203411446044002402000412e6a200041e2006a2d00" - "003a0000200020002900" - "673703e8012000200041ec006a2900003700ed01200020002f00603b012c200020002903e8013703a8012000200029" - "00ed013700ad01200020" - "0028006336002f200041386a20002900ad01370000200020002903a801370033200442003703002001420037030020" - "05420037030020004200" - "3703602000412c6a2204411420024120100822034120470d00200041c2006a20002d00623a0000200041f0016a2203" - "200041ef006a29000022" - "0a370300200041cf006a200a370000200041d7006a200041f7006a290000370000200041df006a200041ff006a2d00" - "003a0000200020002f01" - "603b01402000200028006336004320002000290067370047200041406b412041001009410141d880c0004110103c20" - "01410036020020054200" - "370300200042003703604181802020024114100a411441838dc000411c103c20014100360200200542003703002000" - "42003703604101418180" - "2020024114100b4114419f8dc0004114103c200041043602a001200041818020360260200041f8016a220541003602" - "00200342003703002000" + "7f7f017f60077f7f7f7f7f7f7f017f60087f7f7f7f7f7f7f7f017f60017f017f60037f7f7e017f60047f7f7f7f0060" + "00017f02990d3c08686f73745f6c6962057472616365000308686f73745f6c69620974726163655f6e756d00080868" + "6f73745f6c69620e6765745f6c65646765725f73716e000208686f73745f6c6962166765745f706172656e745f6c65" + "646765725f74696d65000208686f73745f6c6962166765745f706172656e745f6c65646765725f6861736800020868" + "6f73745f6c69620c6765745f626173655f666565000208686f73745f6c696211616d656e646d656e745f656e61626c" + "6564000208686f73745f6c69620c6765745f74785f6669656c64000408686f73745f6c69620e6163636f756e745f6b" + "65796c6574000108686f73745f6c69621063616368655f6c65646765725f6f626a000408686f73745f6c69621c6765" + "745f63757272656e745f6c65646765725f6f626a5f6669656c64000408686f73745f6c6962146765745f6c65646765" + "725f6f626a5f6669656c64000108686f73745f6c6962136765745f74785f6e65737465645f6669656c64000108686f" + "73745f6c6962236765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c64000108686f" + "73745f6c69621b6765745f6c65646765725f6f626a5f6e65737465645f6669656c64000308686f73745f6c69621067" + "65745f74785f61727261795f6c656e000708686f73745f6c6962206765745f63757272656e745f6c65646765725f6f" + "626a5f61727261795f6c656e000708686f73745f6c6962186765745f6c65646765725f6f626a5f61727261795f6c65" + "6e000208686f73745f6c6962176765745f74785f6e65737465645f61727261795f6c656e000208686f73745f6c6962" + "276765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000208686f7374" + "5f6c69621f6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e000408686f73745f6c6962" + "0b7570646174655f64617461000208686f73745f6c696213636f6d707574655f7368613531325f68616c6600010868" + "6f73745f6c696209636865636b5f736967000008686f73745f6c6962076765745f6e6674000008686f73745f6c6962" + "0e6765745f6e66745f697373756572000108686f73745f6c69620d6765745f6e66745f7461786f6e000108686f7374" + "5f6c69620d6765745f6e66745f666c616773000208686f73745f6c6962146765745f6e66745f7472616e736665725f" + "666565000208686f73745f6c69620e6765745f6e66745f73657269616c000108686f73745f6c69620d74726163655f" + "6163636f756e74000108686f73745f6c69620c74726163655f616d6f756e74000108686f73745f6c69620c63686563" + "6b5f6b65796c6574000008686f73745f6c69620f666c6f61745f66726f6d5f75696e74000308686f73745f6c69620b" + "6c696e655f6b65796c6574000608686f73745f6c69620a616d6d5f6b65796c6574000008686f73745f6c6962116372" + "6564656e7469616c5f6b65796c6574000608686f73745f6c69620e6d70746f6b656e5f6b65796c6574000008686f73" + "745f6c69621274726163655f6f70617175655f666c6f6174000108686f73745f6c69620d666c6f61745f636f6d7061" + "7265000108686f73745f6c696209666c6f61745f616464000508686f73745f6c69620e666c6f61745f737562747261" + "6374000508686f73745f6c69620e666c6f61745f6d756c7469706c79000508686f73745f6c69620c666c6f61745f64" + "6976696465000508686f73745f6c69620a666c6f61745f726f6f74000008686f73745f6c696209666c6f61745f706f" + "77000008686f73745f6c696209666c6f61745f6c6f67000308686f73745f6c69620d657363726f775f6b65796c6574" + "000008686f73745f6c6962136d70745f69737375616e63655f6b65796c6574000008686f73745f6c6962106e66745f" + "6f666665725f6b65796c6574000008686f73745f6c69620c6f666665725f6b65796c6574000008686f73745f6c6962" + "0d6f7261636c655f6b65796c6574000008686f73745f6c69620e7061796368616e5f6b65796c6574000608686f7374" + "5f6c69621a7065726d697373696f6e65645f646f6d61696e5f6b65796c6574000008686f73745f6c69620d7469636b" + "65745f6b65796c6574000008686f73745f6c69620c7661756c745f6b65796c6574000008686f73745f6c69620f6465" + "6c65676174655f6b65796c6574000008686f73745f6c6962166465706f7369745f707265617574685f6b65796c6574" + "000008686f73745f6c69620a6469645f6b65796c6574000108686f73745f6c69620e7369676e6572735f6b65796c65" + "740001030302090a05030100110619037f01418080c0000b7f0041bba1c0000b7f0041c0a1c0000b072e04066d656d" + "6f727902000666696e697368003d0a5f5f646174615f656e6403010b5f5f686561705f6261736503020abf2c024600" + "0240200020014704402002200341014100410010001a20004100480d01418b80c000410b2000ad1001000b20022003" + "2000ac10011a0f0b418b80c000410b2000ac1001000bf52b020a7f017e23004190026b22002400419680c000412341" + "014100410010001a20004100360260200041e0006a220241041002410441bd8cc000410e103c200041003602602002" + "41041003410441cb8cc0004116103c200041f8006a22044200370300200041f0006a22014200370300200041e8006a" + "2205420037030020004200370360200241201004412041e18cc0004116103c20004100360260200241041005410441" + "f78cc000410c103c200041106a2207428182848890a0c08001370300200041186a2206428182848890a0c080013703" + "00200041206a2209428182848890a0c080013703002000428182848890a0c0800137030841b980c000410e10064101" + "41c780c0004111103c200041086a41201006410141c780c0004111103c418180202002411410072203411446044002" + "402000412e6a200041e2006a2d00003a0000200020002900673703e8012000200041ec006a2900003700ed01200020" + "002f00603b012c200020002903e8013703a801200020002900ed013700ad012000200028006336002f200041386a20" + "002900ad01370000200020002903a80137003320044200370300200142003703002005420037030020004200370360" + "2000412c6a2204411420024120100822034120470d00200041c2006a20002d00623a0000200041f0016a2203200041" + "ef006a290000220a370300200041cf006a200a370000200041d7006a200041f7006a290000370000200041df006a20" + "0041ff006a2d00003a0000200020002f01603b01402000200028006336004320002000290067370047200041406b41" + "2041001009410141d880c0004110103c2001410036020020054200370300200042003703604181802020024114100a" + "411441838dc000411c103c20014100360200200542003703002000420037036041014181802020024114100b411441" + "9f8dc0004114103c200041043602a001200041818020360260200041f8016a22054100360200200342003703002000" "42003703e80120024104200041e8016a22014114100c411441b38dc0004113103c2005410036020020034200370300" - "200042003703e8012002" - "20002802a00120014114100d411441c68dc0004123103c2005410036020020034200370300200042003703e8014101" - "200220002802a0012001" - "4114100e411441e98dc000411b103c4189803c100f412041e880c0004110103c4189803c1010412041f880c0004120" - "103c41014189803c1011" - "4120419881c0004118103c200220002802a0011012412041b081c0004117103c200220002802a0011013412041c781" - "c0004127103c41012002" - "20002802a0011014412041ee81c000411f103c2004411410154114418d82c000410b103c20004180026a2208420037" - "03002005420037030020" - "034200370300200042003703e801200220002802a001200141201016412041848ec0004113103c419882c000410c41" - "a482c000410b41af82c0" - "00410e1017410141bd82c0004109103c200041c0016a2009290300370300200041b8016a2006290300370300200041" - "b0016a20072903003703" - "00200020002903083703a801200541003b010020034200370300200042003703e80120044114200041a8016a220741" - "20200141121018411241" - "978ec0004107103c2005410036020020034200370300200042003703e801200741202001411410194114419e8ec000" - "410e103c200041003602" - "e8012007412020014104101a410441ac8ec000410d103c20074120101b410841c682c000410d103c20074120101c41" - "0a41d382c0004114103c" - "200041003602e8012007412020014104101d410441b98ec000410e103c41e782c000410d20044114101e410041f482" - "c000410d103c41e782c0" - "00410d418183c0004108101f4100418983c000410c103c41e782c000410d419583c0004108101f4100419d83c00041" - "11103c417f4104100441" - "7141ae83c000411e103c200041003602e8012001417f1004417141c78ec000411e103c200041ea016a41003a000020" - "0041003b01e801200141" - "031004417d41e58ec0004124103c200041003602e8012001418094ebdc031004417341898fc0004123103c4102100f" - "416f41cc83c000411f10" - "3c417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c2002418120101241" - "7441a984c0004120103c" - "200041e094ebdc036a220620002802a0011012417341c984c000411f103c2008420037030020054200370300200342" - "00370300200042003703" - "e8012004411420064108200141201020417341ac8fc0004118103c2008420037030020054200370300200342003703" - "00200042003703e80120" - "04411420044114200141201020417141c48fc000411a103c2008420037030020054200370300200342003703002000" - "42003703e80120064108" - "2001412041001021417341de8fc0004117103c200842003703002005420037030020034200370300200042003703e8" - "01200220002802a00120" - "01412041001021417141f58fc0004120103c200620002802a00141011009417341e884c0004118103c200220002802" - "a0014101100941714180" - "85c000411a103c200842003703002005420037030020034200370300200042003703e801200620002802a001200141" - "2010084173419590c000" - "4116103c200842003703002005420037030020034200370300200042003703e801200220002802a001200141201008" - "417141ab90c000411810" - "3c200842003703002005420037030020034200370300200042003703e8012004411420044114200620002802a00120" - "0141201022417341c390" - "c000411c103c200842003703002005420037030020034200370300200042003703e801200441142004411420022000" - "2802a001200141201022" - "417141df90c000411e103c200842003703002005420037030020034200370300200042003703e80141a7a1c0004114" - "200620002802a0012001" - "41201023417341fd90c0004119103c200842003703002005420037030020034200370300200042003703e80141a7a1" - "c0004114200220002802" - "a0012001412010234171419691c000411f103c200842003703002005420037030020034200370300200042003703e8" - "0141a7a1c0004114419a" - "85c0004114200141201023417141b591c0004129103c20084200370300200542003703002003420037030020004200" - "3703e80141ae85c00041" - "2841a7a1c0004114200141201023417141de91c0004125103c200041dc016a2000413c6a280100360200200041d401" - "6a200041346a29010037" - "02002000200029012c3702cc01200041808080083602c801200041003b01e801200041c8016a2209411841a7a1c000" - "41142001410210234171" - "418392c000410e103c200620002802a001422a1001417341d685c0004111103c200041003b01e80141022001410210" - "07416f419192c000411b" - "103c200041003b01e801410220014102100a416f41ac92c000412b103c200041003b01e8014101410220014102100b" - "416f41d792c000412310" - "3c4102100f416f41cc83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c000412710" - "3c41b980c00041812010" - "06417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e801200241812020" - "014102100c417441fa92" - "c0004121103c200041003b01e801200241812020014102100d4174419b93c0004131103c200041003b01e801410120" - "0241812020014102100e" - "417441cc93c0004129103c20024181201012417441f686c0004125103c200241812010134174419b87c0004135103c" - "41012002418120101441" - "7441d087c000412d103c20024181201015417441fd87c0004119103c41e782c00041812041a482c000410b41af82c0" - "00410e1017417441bd82" - "c0004109103c41e782c000410d41a482c00041812041af82c000410e1017417441bd82c0004109103c41e782c00041" - "0d41a482c000410b41af" - "82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441f593c0004121" - "103c200041003b01e801" - "41a7a1c00041812041a7a1c00041142001410210234174419694c0004118103c200041003b01e80120044114200441" - "14200241812020014102" - "1024417441ae94c000411f103c200041003b01e801200941812020044114200141021025417441cd94c0004122103c" - "41e782c000410d200620" - "002802a001410010004173419688c000410f103c200042d487b6f4c7d4b1c0003700e00141e782c000410d200041e0" - "95ebdc036a2207410810" - "26417341a588c000411c103c41e782c000410d200620002802a001101f417341c188c0004116103c20074108200041" - "e0016a22064108102741" - "7341d788c0004118103c20064108200741081027417341ef88c0004118103c200041003b01e8012007410820064108" - "20014102410010284173" - "41ef94c0004114103c200041003b01e801200641082007410820014102410010284173418395c0004114103c200041" - "003b01e8012007410820" - "06410820014102410010294173419795c0004119103c200041003b01e8012006410820074108200141024100102941" - "7341b095c0004119103c" - "200041003b01e8012007410820064108200141024100102a417341c995c0004119103c200041003b01e80120064108" - "20074108200141024100" + "200042003703e801200220002802a00120014114100d411441c68dc0004123103c2005410036020020034200370300" + "200042003703e8014101200220002802a00120014114100e411441e98dc000411b103c4189803c100f412041e880c0" + "004110103c4189803c1010412041f880c0004120103c41014189803c10114120419881c0004118103c200220002802" + "a0011012412041b081c0004117103c200220002802a0011013412041c781c0004127103c4101200220002802a00110" + "14412041ee81c000411f103c2004411410154114418d82c000410b103c20004180026a220842003703002005420037" + "030020034200370300200042003703e801200220002802a001200141201016412041848ec0004113103c419882c000" + "410c41a482c000410b41af82c000410e1017410141bd82c0004109103c200041c0016a2009290300370300200041b8" + "016a2006290300370300200041b0016a2007290300370300200020002903083703a801200541003b01002003420037" + "0300200042003703e80120044114200041a8016a22074120200141121018411241978ec0004107103c200541003602" + "0020034200370300200042003703e801200741202001411410194114419e8ec000410e103c200041003602e8012007" + "412020014104101a410441ac8ec000410d103c20074120101b410841c682c000410d103c20074120101c410a41d382" + "c0004114103c200041003602e8012007412020014104101d410441b98ec000410e103c41e782c000410d2004411410" + "1e410041f482c000410d103c41e782c000410d418183c0004108101f4100418983c000410c103c41e782c000410d41" + "9583c0004108101f4100419d83c0004111103c417f41041004417141ae83c000411e103c200041003602e801200141" + "7f1004417141c78ec000411e103c200041ea016a41003a0000200041003b01e801200141031004417d41e58ec00041" + "24103c200041003602e8012001418094ebdc031004417341898fc0004123103c4102100f416f41cc83c000411f103c" + "417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c200241812010124174" + "41a984c0004120103c200041e094ebdc036a220620002802a0011012417341c984c000411f103c2008420037030020" + "05420037030020034200370300200042003703e8012004411420064108200141201020417341ac8fc0004118103c20" + "0842003703002005420037030020034200370300200042003703e8012004411420044114200141201020417141c48f" + "c000411a103c200842003703002005420037030020034200370300200042003703e801200641082001412041001021" + "417341de8fc0004117103c200842003703002005420037030020034200370300200042003703e801200220002802a0" + "012001412041001021417141f58fc0004120103c200620002802a00141011009417341e884c0004118103c20022000" + "2802a001410110094171418085c000411a103c200842003703002005420037030020034200370300200042003703e8" + "01200620002802a0012001412010084173419590c0004116103c200842003703002005420037030020034200370300" + "200042003703e801200220002802a001200141201008417141ab90c0004118103c2008420037030020054200370300" + "20034200370300200042003703e8012004411420044114200620002802a001200141201022417341c390c000411c10" + "3c200842003703002005420037030020034200370300200042003703e8012004411420044114200220002802a00120" + "0141201022417141df90c000411e103c200842003703002005420037030020034200370300200042003703e80141a7" + "a1c0004114200620002802a001200141201023417341fd90c0004119103c2008420037030020054200370300200342" + "00370300200042003703e80141a7a1c0004114200220002802a0012001412010234171419691c000411f103c200842" + "003703002005420037030020034200370300200042003703e80141a7a1c0004114419a85c000411420014120102341" + "7141b591c0004129103c200842003703002005420037030020034200370300200042003703e80141ae85c000412841" + "a7a1c0004114200141201023417141de91c0004125103c200041dc016a2000413c6a280100360200200041d4016a20" + "0041346a2901003702002000200029012c3702cc01200041808080083602c801200041003b01e801200041c8016a22" + "09411841a7a1c00041142001410210234171418392c000410e103c200620002802a001422a1001417341d685c00041" + "11103c200041003b01e8014102200141021007416f419192c000411b103c200041003b01e801410220014102100a41" + "6f41ac92c000412b103c200041003b01e8014101410220014102100b416f41d792c0004123103c4102100f416f41cc" + "83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c0004127103c41b980c000418120" + "1006417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e8012002418120" + "20014102100c417441fa92c0004121103c200041003b01e801200241812020014102100d4174419b93c0004131103c" + "200041003b01e8014101200241812020014102100e417441cc93c0004129103c20024181201012417441f686c00041" + "25103c200241812010134174419b87c0004135103c410120024181201014417441d087c000412d103c200241812010" + "15417441fd87c0004119103c41e782c00041812041a482c000410b41af82c000410e1017417441bd82c0004109103c" + "41e782c000410d41a482c00041812041af82c000410e1017417441bd82c0004109103c41e782c000410d41a482c000" + "410b41af82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441f593" + "c0004121103c200041003b01e80141a7a1c00041812041a7a1c00041142001410210234174419694c0004118103c20" + "0041003b01e80120044114200441142002418120200141021024417441ae94c000411f103c200041003b01e8012009" + "41812020044114200141021025417441cd94c0004122103c41e782c000410d200620002802a0014100100041734196" + "88c000410f103c200042d487b6f4c7d4b1c0003700e00141e782c000410d200041e095ebdc036a2207410810264173" + "41a588c000411c103c41e782c000410d200620002802a001101f417341c188c0004116103c20074108200041e0016a" + "220641081027417341d788c0004118103c20064108200741081027417341ef88c0004118103c200041003b01e80120" + "074108200641082001410241001028417341ef94c0004114103c200041003b01e80120064108200741082001410241" + "0010284173418395c0004114103c200041003b01e801200741082006410820014102410010294173419795c0004119" + "103c200041003b01e80120064108200741082001410241001029417341b095c0004119103c200041003b01e8012007" + "410820064108200141024100102a417341c995c0004119103c200041003b01e8012006410820074108200141024100" "102a417341e295c0004119103c200041003b01e8012007410820064108200141024100102b417341fb95c000411710" - "3c200041003b01e80120" - "06410820074108200141024100102b4173419296c0004117103c200041003b01e80120074108410320014102410010" - "2c417341a996c0004114" - "103c200041003b01e801200741084103200141024100102d417341bd96c0004113103c200041003b01e80120074108" - "200141024100102e4173" - "41d096c0004113103c200842003703002005420037030020034200370300200042003703e801200441142004411420" - "014120102f417141e396" - "c000411f103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120" - "10304171418297c00041" - "25103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120103141" - "7141a797c0004122103c" - "200842003703002005420037030020034200370300200042003703e8012004411420044114200141201032417141c9" - "97c000411e103c200842" - "003703002005420037030020034200370300200042003703e8012004411420044114200141201033417141e797c000" - "411f103c200842003703" - "002005420037030020034200370300200042003703e8012004411420044114200441142001412010344171418698c0" - "004120103c2008420037" - "03002005420037030020034200370300200042003703e8012004411420044114200141201035417141a698c000412c" - "103c2008420037030020" - "05420037030020034200370300200042003703e8012004411420044114200141201036417141d298c000411f103c20" - "08420037030020054200" - "37030020034200370300200042003703e8012004411420044114200141201037417141f198c000411e103c20022000" - "2802a001410010094171" - "418789c0004123103c200041003b01e80120044114200220002802a0012001410210184171418f99c000411a103c20" - "0041003b01e801200220" - "002802a001200141021019417141a999c0004121103c200041003b01e801200220002802a00120014102101a417141" - "ca99c0004120103c2002" - "20002802a001101b417141aa89c0004120103c200220002802a001101c417141ca89c0004127103c200041003602e8" - "01200220002802a00120" - "014104101d417141ea99c0004121103c200041003b01e801200220002802a0012001410210084171418b9ac0004124" - "103c2000418080800836" - "02e801200041003b018e02200220002802a001200141042000418e026a220341021020417141af9ac0004122103c20" - "0041003b018e02200220" - "002802a00122052004411420022005200341021024417141d19ac0004128103c200041003b018e0220044114200220" - "002802a0012205200220" - "05200341021024417141f99ac0004128103c200041003b018e02200220002802a00120044114200341021038417141" - "a19bc0004126103c2000" - "41003b018e0220044114200220002802a001200341021038417141c79bc0004126103c200041003b018e0220022000" - "2802a001200441142003" - "41021039417141ed9bc000412d103c200041003b018e0220044114200220002802a0012003410210394171419a9cc0" - "00412d103c200041003b" - "018e02200220002802a00120034102103a417141c79cc0004120103c200041003b018e02200220002802a001200141" - "0420034102102f417141" - "e79cc0004123103c200041003b018e02200220002802a00120044114419a85c00041142003410210224171418a9dc0" - "004122103c200041003b" - "018e0220044114200220002802a001419a85c0004114200341021022417141ac9dc0004122103c200041003b018e02" - "200220002802a0012001" - "4104200341021030417141ce9dc0004129103c200041003b018e0220094118200220002802a0012003410210254171" - "41f79dc0004124103c20" - "0041003b018e02200220002802a001200141042003410210314171419b9ec0004126103c200041003b018e02200220" - "002802a0012001410420" - "0341021032417141c19ec0004122103c200041003b018e02200220002802a00120014104200341021033417141e39e" - "c0004123103c20004100" - "3b018e02200220002802a0012004411420014104200341021034417141869fc0004125103c200041003b018e022004" - "4114200220002802a001" - "20014104200341021034417141ab9fc0004125103c200041003b018e02200220002802a00120014104200341021035" - "417141d09fc000413010" - "3c200041003b018e02200220002802a00120034102103b41714180a0c0004124103c200041003b018e022002200028" - "02a00120014104200341" - "021036417141a4a0c0004123103c200041003b018e02200220002802a00120014104200341021037417141c7a0c000" - "4122103c200041003b01" - "8e02200220002802a00141f189c0004120200341021018417141e9a0c000411d103c41e782c000410d200220002802" - "a001101e417141918ac0" - "004123103c41e796abdd03410d41f189c000412041001000417341b48ac0004110103c41e796abdd03410d20064108" - "1026417341c48ac00041" - "1d103c41e796abdd03410d20044114101e417341e18ac0004118103c41e796abdd03410d419583c0004108101f4173" - "41f98ac0004117103c20" - "0220002802a001200241812041001000417441908bc000410e103c2002418120420110014174419e8bc0004112103c" - "41e782c0004181202006" - "41081026417441b08bc000411b103c41e782c00041812020044114101e417441cb8bc0004116103c41e782c0004181" - "20419583c0004108101f" - "417441e18bc0004115103c41e782c000410d200220002802a001101f417141f68bc0004119103c200041003b018e02" - "200220002802a0012004" - "411420034102102541714186a1c0004121103c41e782c000410d200220002802a001410210004171418f8cc0004114" - "103c4101410020044114" - "101e410041a38cc000411a103c20004190026a240041010f0b0b418080c000410b417f20032003417f4e1bac100100" - "0b0b92210200418080c0" - "000bae056572726f725f636f64653d54455354204641494c45442424242424205354415254494e47205741534d2045" - "5845435554494f4e2024" - "24242424746573745f616d656e646d656e74616d656e646d656e745f656e61626c656463616368655f6c6564676572" - "5f6f626a6765745f7478" - "5f61727261795f6c656e6765745f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c" - "65646765725f6f626a5f" - "61727261795f6c656e6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c6564" - "6765725f6f626a5f6e65" - "737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261795f6c656e7570" - "646174655f6461746174" - "657374206d65737361676574657374207075626b657974657374207369676e6174757265636865636b5f7369676765" - "745f6e66745f666c6167" - "736765745f6e66745f7472616e736665725f66656574657374696e6720747261636574726163655f6163636f756e74" - "400000000000005f7472" - "6163655f616d6f756e74400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e745f6c" - "65646765725f68617368" + "3c200041003b01e8012006410820074108200141024100102b4173419296c0004117103c200041003b01e801200741" + "084103200141024100102c417341a996c0004114103c200041003b01e801200741084103200141024100102d417341" + "bd96c0004113103c200041003b01e80120074108200141024100102e417341d096c0004113103c2008420037030020" + "05420037030020034200370300200042003703e801200441142004411420014120102f417141e396c000411f103c20" + "0842003703002005420037030020034200370300200042003703e80120044114200441142001412010304171418297" + "c0004125103c200842003703002005420037030020034200370300200042003703e801200441142004411420014120" + "1031417141a797c0004122103c200842003703002005420037030020034200370300200042003703e8012004411420" + "044114200141201032417141c997c000411e103c200842003703002005420037030020034200370300200042003703" + "e8012004411420044114200141201033417141e797c000411f103c2008420037030020054200370300200342003703" + "00200042003703e8012004411420044114200441142001412010344171418698c0004120103c200842003703002005" + "420037030020034200370300200042003703e8012004411420044114200141201035417141a698c000412c103c2008" + "42003703002005420037030020034200370300200042003703e8012004411420044114200141201036417141d298c0" + "00411f103c200842003703002005420037030020034200370300200042003703e80120044114200441142001412010" + "37417141f198c000411e103c200220002802a001410010094171418789c0004123103c200041003b01e80120044114" + "200220002802a0012001410210184171418f99c000411a103c200041003b01e801200220002802a001200141021019" + "417141a999c0004121103c200041003b01e801200220002802a00120014102101a417141ca99c0004120103c200220" + "002802a001101b417141aa89c0004120103c200220002802a001101c417141ca89c0004127103c200041003602e801" + "200220002802a00120014104101d417141ea99c0004121103c200041003b01e801200220002802a001200141021008" + "4171418b9ac0004124103c200041808080083602e801200041003b018e02200220002802a001200141042000418e02" + "6a220341021020417141af9ac0004122103c200041003b018e02200220002802a00122052004411420022005200341" + "021024417141d19ac0004128103c200041003b018e0220044114200220002802a00122052002200520034102102441" + "7141f99ac0004128103c200041003b018e02200220002802a00120044114200341021038417141a19bc0004126103c" + "200041003b018e0220044114200220002802a001200341021038417141c79bc0004126103c200041003b018e022002" + "20002802a00120044114200341021039417141ed9bc000412d103c200041003b018e0220044114200220002802a001" + "2003410210394171419a9cc000412d103c200041003b018e02200220002802a00120034102103a417141c79cc00041" + "20103c200041003b018e02200220002802a0012001410420034102102f417141e79cc0004123103c200041003b018e" + "02200220002802a00120044114419a85c00041142003410210224171418a9dc0004122103c200041003b018e022004" + "4114200220002802a001419a85c0004114200341021022417141ac9dc0004122103c200041003b018e022002200028" + "02a00120014104200341021030417141ce9dc0004129103c200041003b018e0220094118200220002802a001200341" + "021025417141f79dc0004124103c200041003b018e02200220002802a001200141042003410210314171419b9ec000" + "4126103c200041003b018e02200220002802a00120014104200341021032417141c19ec0004122103c200041003b01" + "8e02200220002802a00120014104200341021033417141e39ec0004123103c200041003b018e02200220002802a001" + "2004411420014104200341021034417141869fc0004125103c200041003b018e0220044114200220002802a0012001" + "4104200341021034417141ab9fc0004125103c200041003b018e02200220002802a001200141042003410210354171" + "41d09fc0004130103c200041003b018e02200220002802a00120034102103b41714180a0c0004124103c200041003b" + "018e02200220002802a00120014104200341021036417141a4a0c0004123103c200041003b018e02200220002802a0" + "0120014104200341021037417141c7a0c0004122103c200041003b018e02200220002802a00141f189c00041202003" + "41021018417141e9a0c000411d103c41e782c000410d200220002802a001101e417141918ac0004123103c41e796ab" + "dd03410d41f189c000412041001000417341b48ac0004110103c41e796abdd03410d200641081026417341c48ac000" + "411d103c41e796abdd03410d20044114101e417341e18ac0004118103c41e796abdd03410d419583c0004108101f41" + "7341f98ac0004117103c200220002802a001200241812041001000417441908bc000410e103c200241812042011001" + "4174419e8bc0004112103c41e782c000418120200641081026417441b08bc000411b103c41e782c000418120200441" + "14101e417441cb8bc0004116103c41e782c000418120419583c0004108101f417441e18bc0004115103c41e782c000" + "410d200220002802a001101f417141f68bc0004119103c200041003b018e02200220002802a0012004411420034102" + "102541714186a1c0004121103c41e782c000410d200220002802a001410210004171418f8cc0004114103c41014100" + "20044114101e410041a38cc000411a103c20004190026a240041010f0b0b418080c000410b417f20032003417f4e1b" + "ac1001000b0b92210200418080c0000bae056572726f725f636f64653d54455354204641494c454424242424242053" + "54415254494e47205741534d20455845435554494f4e202424242424746573745f616d656e646d656e74616d656e64" + "6d656e745f656e61626c656463616368655f6c65646765725f6f626a6765745f74785f61727261795f6c656e676574" + "5f63757272656e745f6c65646765725f6f626a5f61727261795f6c656e6765745f6c65646765725f6f626a5f617272" + "61795f6c656e6765745f74785f6e65737465645f61727261795f6c656e6765745f63757272656e745f6c6564676572" + "5f6f626a5f6e65737465645f61727261795f6c656e6765745f6c65646765725f6f626a5f6e65737465645f61727261" + "795f6c656e7570646174655f6461746174657374206d65737361676574657374207075626b65797465737420736967" + "6e6174757265636865636b5f7369676765745f6e66745f666c6167736765745f6e66745f7472616e736665725f6665" + "6574657374696e6720747261636574726163655f6163636f756e74400000000000005f74726163655f616d6f756e74" + "400000000000000074726163655f616d6f756e745f7a65726f6765745f706172656e745f6c65646765725f68617368" "5f6e65675f7074726765745f74785f61727261795f6c656e5f696e76616c69645f736669656c646765745f74785f6e" - "65737465645f61727261" - "795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f6e65675f6c656e676574" - "5f74785f6e6573746564" - "5f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f7074725f" - "6f6f6263616368655f6c" - "65646765725f6f626a5f7074725f6f6f6263616368655f6c65646765725f6f626a5f77726f6e675f6c656e55534430" - "30303030303030303030" - "3030303030300041d685c0000bd11b74726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c6564" - "6765725f6f626a5f6172" - "7261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c656e5f" - "696e76616c69645f7366" - "69656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c696365616d656e646d656e745f656e" - "61626c65645f746f6f5f" - "6c6f6e676765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6375" - "7272656e745f6c656467" - "65725f6f626a5f6e65737465645f61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c6564676572" - "5f6f626a5f6e65737465" - "645f61727261795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c" - "69636574726163655f6f" - "6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f736c69636574726163655f616d6f756e" - "745f6f6f625f736c6963" - "65666c6f61745f636f6d706172655f6f6f625f736c69636531666c6f61745f636f6d706172655f6f6f625f736c6963" - "653263616368655f6c65" - "646765725f6f626a5f77726f6e675f73697a655f75696e743235366765745f6e66745f666c6167735f77726f6e675f" - "73697a655f75696e7432" - "35366765745f6e66745f7472616e736665725f6665655f77726f6e675f73697a655f75696e74323536303030303030" - "30303030303030303030" - "3030303030303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f756e" - "745f696474726163655f" - "6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e6774726163655f6163" - "636f756e745f6f6f625f" - "737472696e6774726163655f616d6f756e745f6f6f625f737472696e6774726163655f746f6f5f6c6f6e6774726163" - "655f6e756d5f746f6f5f" - "6c6f6e6774726163655f6f70617175655f666c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f" - "6f5f6c6f6e6774726163" - "655f616d6f756e745f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e6774687472616365" - "5f696e76616c69645f61" - "735f68657874726163655f6163636f756e745f636865636b5f646573796e636765745f6c65646765725f73716e6765" - "745f706172656e745f6c" - "65646765725f74696d656765745f706172656e745f6c65646765725f686173686765745f626173655f666565676574" - "5f63757272656e745f6c" - "65646765725f6f626a5f6669656c646765745f6c65646765725f6f626a5f6669656c646765745f74785f6e65737465" - "645f6669656c64676574" - "5f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f" - "6e65737465645f666965" - "6c64636f6d707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e" - "66745f7461786f6e6765" - "745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e6765745f70" - "6172656e745f6c656467" - "65725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f6c65646765725f686173685f6c656e" - "5f746f6f5f6c6f6e6763" - "6865636b5f6b65796c65745f6f6f625f6c656e5f753332636865636b5f6b65796c65745f77726f6e675f6c656e5f75" - "3332666c6f61745f6672" - "6f6d5f75696e745f6c656e5f6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e5f75696e743634" - "6163636f756e745f6b65" - "796c65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c6574" - "5f6c656e5f6f6f625f63" - "757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d6d5f6b65796c6574" - "5f6c656e5f6f6f625f61" - "7373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e5f617373657432616d6d5f6b65796c65745f" - "6c656e5f77726f6e675f" - "6e6f6e5f7872705f63757272656e63795f6c656e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f6375" - "7272656e63795f6c656e" - "616d6d5f6b65796c65745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765745f6375" - "7272656e745f6c656467" - "65725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c64" - "5f696e76616c69645f73" - "6669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6375727265" - "6e745f6c65646765725f" - "6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65" - "737465645f6669656c64" - "5f746f6f5f6269675f736c696365636f6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365" - "616d6d5f6b65796c6574" - "5f746f6f5f6269675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70" - "746f6b656e5f6b65796c" - "65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c69636531666c6f6174" - "5f6164645f6f6f625f73" - "6c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f61745f73756274726163745f6f6f" - "625f736c69636532666c" - "6f61745f6d756c7469706c795f6f6f625f736c69636531666c6f61745f6d756c7469706c795f6f6f625f736c696365" - "32666c6f61745f646976" - "6964655f6f6f625f736c69636531666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f74" - "5f6f6f625f736c696365" - "666c6f61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c696365657363726f775f6b65" - "796c65745f77726f6e67" - "5f73697a655f75696e7433326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f75696e74" - "33326e66745f6f666665" - "725f6b65796c65745f77726f6e675f73697a655f75696e7433326f666665725f6b65796c65745f77726f6e675f7369" - "7a655f75696e7433326f" - "7261636c655f6b65796c65745f77726f6e675f73697a655f75696e7433327061796368616e5f6b65796c65745f7772" - "6f6e675f73697a655f75" - "696e7433327065726d697373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f75696e74" - "33327469636b65745f6b" + "65737465645f61727261795f6c656e5f6e65675f7074726765745f74785f6e65737465645f61727261795f6c656e5f" + "6e65675f6c656e6765745f74785f6e65737465645f61727261795f6c656e5f746f6f5f6c6f6e676765745f74785f6e" + "65737465645f61727261795f6c656e5f7074725f6f6f6263616368655f6c65646765725f6f626a5f7074725f6f6f62" + "63616368655f6c65646765725f6f626a5f77726f6e675f6c656e555344303030303030303030303030303030303000" + "41d685c0000bd11b74726163655f6e756d5f6f6f625f7374726765745f63757272656e745f6c65646765725f6f626a" + "5f61727261795f6c656e5f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f61727261795f6c" + "656e5f696e76616c69645f736669656c64616d656e646d656e745f656e61626c65645f746f6f5f6269675f736c6963" + "65616d656e646d656e745f656e61626c65645f746f6f5f6c6f6e676765745f74785f6e65737465645f61727261795f" + "6c656e5f746f6f5f6269675f736c6963656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f" + "61727261795f6c656e5f746f6f5f6269675f736c6963656765745f6c65646765725f6f626a5f6e65737465645f6172" + "7261795f6c656e5f746f6f5f6269675f736c6963657570646174655f646174615f746f6f5f6269675f736c69636574" + "726163655f6f6f625f736c69636574726163655f6f70617175655f666c6f61745f6f6f625f736c6963657472616365" + "5f616d6f756e745f6f6f625f736c696365666c6f61745f636f6d706172655f6f6f625f736c69636531666c6f61745f" + "636f6d706172655f6f6f625f736c6963653263616368655f6c65646765725f6f626a5f77726f6e675f73697a655f75" + "696e743235366765745f6e66745f666c6167735f77726f6e675f73697a655f75696e743235366765745f6e66745f74" + "72616e736665725f6665655f77726f6e675f73697a655f75696e743235363030303030303030303030303030303030" + "30303030303030303030303030303174726163655f6163636f756e745f77726f6e675f73697a655f6163636f756e74" + "5f696474726163655f6f6f625f737472696e6774726163655f6f70617175655f666c6f61745f6f6f625f737472696e" + "6774726163655f6163636f756e745f6f6f625f737472696e6774726163655f616d6f756e745f6f6f625f737472696e" + "6774726163655f746f6f5f6c6f6e6774726163655f6e756d5f746f6f5f6c6f6e6774726163655f6f70617175655f66" + "6c6f61745f746f6f5f6c6f6e6774726163655f6163636f756e745f746f6f5f6c6f6e6774726163655f616d6f756e74" + "5f746f6f5f6c6f6e6774726163655f616d6f756e745f77726f6e675f6c656e67746874726163655f696e76616c6964" + "5f61735f68657874726163655f6163636f756e745f636865636b5f646573796e636765745f6c65646765725f73716e" + "6765745f706172656e745f6c65646765725f74696d656765745f706172656e745f6c65646765725f68617368676574" + "5f626173655f6665656765745f63757272656e745f6c65646765725f6f626a5f6669656c646765745f6c6564676572" + "5f6f626a5f6669656c646765745f74785f6e65737465645f6669656c646765745f63757272656e745f6c6564676572" + "5f6f626a5f6e65737465645f6669656c646765745f6c65646765725f6f626a5f6e65737465645f6669656c64636f6d" + "707574655f7368613531325f68616c666765745f6e66746765745f6e66745f6973737565726765745f6e66745f7461" + "786f6e6765745f6e66745f73657269616c6765745f706172656e745f6c65646765725f686173685f6e65675f6c656e" + "6765745f706172656e745f6c65646765725f686173685f6275665f746f6f5f736d616c6c6765745f706172656e745f" + "6c65646765725f686173685f6c656e5f746f6f5f6c6f6e67636865636b5f6b65796c65745f6f6f625f6c656e5f7533" + "32636865636b5f6b65796c65745f77726f6e675f6c656e5f753332666c6f61745f66726f6d5f75696e745f6c656e5f" + "6f6f62666c6f61745f66726f6d5f75696e745f77726f6e675f6c656e5f75696e7436346163636f756e745f6b65796c" + "65745f6c656e5f6f6f626163636f756e745f6b65796c65745f77726f6e675f6c656e6c696e655f6b65796c65745f6c" + "656e5f6f6f625f63757272656e63796c696e655f6b65796c65745f77726f6e675f6c656e5f63757272656e6379616d" + "6d5f6b65796c65745f6c656e5f6f6f625f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6c656e" + "5f617373657432616d6d5f6b65796c65745f6c656e5f77726f6e675f6e6f6e5f7872705f63757272656e63795f6c65" + "6e616d6d5f6b65796c65745f6c656e5f77726f6e675f7872705f63757272656e63795f6c656e616d6d5f6b65796c65" + "745f6d70746765745f74785f6669656c645f696e76616c69645f736669656c646765745f63757272656e745f6c6564" + "6765725f6f626a5f6669656c645f696e76616c69645f736669656c646765745f6c65646765725f6f626a5f6669656c" + "645f696e76616c69645f736669656c646765745f74785f6e65737465645f6669656c645f746f6f5f6269675f736c69" + "63656765745f63757272656e745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f73" + "6c6963656765745f6c65646765725f6f626a5f6e65737465645f6669656c645f746f6f5f6269675f736c696365636f" + "6d707574655f7368613531325f68616c665f746f6f5f6269675f736c696365616d6d5f6b65796c65745f746f6f5f62" + "69675f736c69636563726564656e7469616c5f6b65796c65745f746f6f5f6269675f736c6963656d70746f6b656e5f" + "6b65796c65745f746f6f5f6269675f736c6963655f6d70746964666c6f61745f6164645f6f6f625f736c6963653166" + "6c6f61745f6164645f6f6f625f736c69636532666c6f61745f73756274726163745f6f6f625f736c69636531666c6f" + "61745f73756274726163745f6f6f625f736c69636532666c6f61745f6d756c7469706c795f6f6f625f736c69636531" + "666c6f61745f6d756c7469706c795f6f6f625f736c69636532666c6f61745f6469766964655f6f6f625f736c696365" + "31666c6f61745f6469766964655f6f6f625f736c69636532666c6f61745f726f6f745f6f6f625f736c696365666c6f" + "61745f706f775f6f6f625f736c696365666c6f61745f6c6f675f6f6f625f736c696365657363726f775f6b65796c65" + "745f77726f6e675f73697a655f75696e7433326d70745f69737375616e63655f6b65796c65745f77726f6e675f7369" + "7a655f75696e7433326e66745f6f666665725f6b65796c65745f77726f6e675f73697a655f75696e7433326f666665" + "725f6b65796c65745f77726f6e675f73697a655f75696e7433326f7261636c655f6b65796c65745f77726f6e675f73" + "697a655f75696e7433327061796368616e5f6b65796c65745f77726f6e675f73697a655f75696e7433327065726d69" + "7373696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f75696e7433327469636b65745f6b" "65796c65745f77726f6e675f73697a655f75696e7433327661756c745f6b65796c65745f77726f6e675f73697a655f" - "75696e7433326765745f" - "6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973737565725f77726f6e675f73697a65" - "5f75696e743235366765" - "745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e743235366765745f6e66745f73657269616c5f7772" - "6f6e675f73697a655f75" - "696e743235366163636f756e745f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964636865636b" - "5f6b65796c65745f7772" - "6f6e675f73697a655f6163636f756e745f696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e745f69" - "643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69643264656c6567" - "6174655f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e745f69643164656c65676174655f6b65796c65745f77726f6e675f7369" - "7a655f6163636f756e74" - "5f6964326465706f7369745f707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69" - "64316465706f7369745f" - "707265617574685f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964326469645f6b65796c6574" - "5f77726f6e675f73697a" - "655f6163636f756e745f6964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964" - "6c696e655f6b65796c65" - "745f77726f6e675f73697a655f6163636f756e745f6964316c696e655f6b65796c65745f77726f6e675f73697a655f" - "6163636f756e745f6964" - "326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646d70746f6b" - "656e5f6b65796c65745f" - "77726f6e675f73697a655f6163636f756e745f69646e66745f6f666665725f6b65796c65745f77726f6e675f73697a" - "655f6163636f756e745f" - "69646f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646f7261636c655f6b65796c" - "65745f77726f6e675f73" - "697a655f6163636f756e745f69647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e74" - "5f696431706179636861" - "6e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964327065726d697373696f6e65645f646f6d" - "61696e5f6b65796c6574" - "5f77726f6e675f73697a655f6163636f756e745f69647369676e6572735f6b65796c65745f77726f6e675f73697a65" - "5f6163636f756e745f69" - "647469636b65745f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69647661756c745f6b65796c65" - "745f77726f6e675f7369" - "7a655f6163636f756e745f69646765745f6e66745f77726f6e675f73697a655f6163636f756e745f69646d70746f6b" - "656e5f6b65796c65745f" - "6d707469645f77726f6e675f6c656e677468004d0970726f64756365727302086c616e677561676501045275737400" - "0c70726f636573736564" - "2d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d303929002c0f74617267" - "65745f66656174757265" - "73022b0f6d757461626c652d676c6f62616c732b087369676e2d657874"; + "75696e7433326765745f6e66745f77726f6e675f73697a655f75696e743235366765745f6e66745f6973737565725f" + "77726f6e675f73697a655f75696e743235366765745f6e66745f7461786f6e5f77726f6e675f73697a655f75696e74" + "3235366765745f6e66745f73657269616c5f77726f6e675f73697a655f75696e743235366163636f756e745f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e745f6964636865636b5f6b65796c65745f77726f6e675f73697a" + "655f6163636f756e745f696463726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e" + "745f69643163726564656e7469616c5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964326465" + "6c65676174655f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69643164656c65676174655f6b65" + "796c65745f77726f6e675f73697a655f6163636f756e745f6964326465706f7369745f707265617574685f6b65796c" + "65745f77726f6e675f73697a655f6163636f756e745f6964316465706f7369745f707265617574685f6b65796c6574" + "5f77726f6e675f73697a655f6163636f756e745f6964326469645f6b65796c65745f77726f6e675f73697a655f6163" + "636f756e745f6964657363726f775f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646c696e65" + "5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964316c696e655f6b65796c65745f77726f6e67" + "5f73697a655f6163636f756e745f6964326d70745f69737375616e63655f6b65796c65745f77726f6e675f73697a65" + "5f6163636f756e745f69646d70746f6b656e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964" + "6e66745f6f666665725f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69646f666665725f6b6579" + "6c65745f77726f6e675f73697a655f6163636f756e745f69646f7261636c655f6b65796c65745f77726f6e675f7369" + "7a655f6163636f756e745f69647061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f" + "6964317061796368616e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f6964327065726d697373" + "696f6e65645f646f6d61696e5f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69647369676e6572" + "735f6b65796c65745f77726f6e675f73697a655f6163636f756e745f69647469636b65745f6b65796c65745f77726f" + "6e675f73697a655f6163636f756e745f69647661756c745f6b65796c65745f77726f6e675f73697a655f6163636f75" + "6e745f69646765745f6e66745f77726f6e675f73697a655f6163636f756e745f69646d70746f6b656e5f6b65796c65" + "745f6d707469645f77726f6e675f6c656e677468004d0970726f64756365727302086c616e67756167650104527573" + "74000c70726f6365737365642d6279010572757374631d312e38372e30202831373036376539616320323032352d30" + "352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e" + "2d657874"; extern std::string const floatTestsWasmHex = - "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f" - "017f60067f7f7f7f7f7f017f60047e7f7f7f017f60057f7e7f7f7f017f60037f7f7e017f60" - "00017f02c9020e08686f73745f6c6962057472616365000108686f73745f6c69620e666c6f" - "61745f66726f6d5f696e74000408686f73745f6c69621274726163655f6f70617175655f66" - "6c6f6174000208686f73745f6c69620f666c6f61745f66726f6d5f75696e74000108686f73" - "745f6c696209666c6f61745f736574000508686f73745f6c69620d666c6f61745f636f6d70" - "617265000208686f73745f6c696209666c6f61745f616464000008686f73745f6c69620e66" - "6c6f61745f7375627472616374000008686f73745f6c69620e666c6f61745f6d756c746970" - "6c79000008686f73745f6c69620c666c6f61745f646976696465000008686f73745f6c6962" - "09666c6f61745f706f77000308686f73745f6c69620974726163655f6e756d000608686f73" - "745f6c69620a666c6f61745f726f6f74000308686f73745f6c696209666c6f61745f6c6f67" - "00010302010705030100110619037f01418080c0000b7f0041d28ac0000b7f0041e08ac000" - "0b072e04066d656d6f727902000666696e697368000e0a5f5f646174615f656e6403010b5f" - "5f686561705f6261736503020af20e01ef0e01047f230041206b22012400418080c000411d" - "41014100410010001a200142003703100240428ce000200141106a22004108410010014108" - "460440419d80c00041172000410810021a41b480c000411e20004108410110001a0c010b41" - "d280c000411e41014100410010001a0b2001428ce0003703180240200141186a4108200141" - "106a2200410841001003410846044041f080c00041172000410810021a0c010b418781c000" - "411e41014100410010001a0b0240410242fb00200141106a22004108410010044108460440" - "41a581c00041212000410810021a0c010b41c681c000412641014100410010001a0b41ec81" - "c0004115418182c000410810021a419182c0004116418982c000410810021a41a782c00041" - "1b41014100410010001a2001420037031802404201200141186a2200410841001001410846" - "044041c282c000410f2000410810021a0c010b41d182c000411641014100410010001a0b02" - "40200141186a4108418182c0004108100545044041e782c000411b41014100410010001a0c" - "010b418283c000411b41014100410010001a0b0240200141186a4108418982c00041081005" - "4101460440419d83c000412341014100410010001a0c010b41c083c0004124410141004100" - "10001a0b0240418982c0004108200141186a41081005410246044041e483c0004123410141" - "00410010001a0c010b418784c000412441014100410010001a0b41ab84c000412041014100" - "410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a220241084181" - "82c000410820024108410010061a200041016b22000d000b20014200370318420a20014118" - "6a22004108410010011a02402000410820024108100545044041cb84c00041144101410041" - "0010001a0c010b41df84c000411341014100410010001a0b410b21000340200141106a2202" - "4108418182c000410820024108410010071a200041016b22000d000b024020024108418982" - "c0004108100545044041f284c000411941014100410010001a0c010b418b85c00041184101" - "4100410010001a0b41a385c000412341014100410010001a20014200370300420a20014108" - "410010011a200142d487b6f4c7d4b1c000370308410621000340200141086a220241082001" - "410820024108410010081a200041016b22000d000b2001420037031042c0843d200141106a" - "22004108410010011a02402000410820024108100545044041c685c0004119410141004100" - "10001a0c010b41df85c000411841014100410010001a0b410721000340200141086a220241" - "082001410820024108410010091a200041016b22000d000b20014200370318417f42012001" - "41186a22004108410010041a02402002410820004108100545044041f785c0004117410141" - "00410010001a0c010b418e86c000411641014100410010001a0b41a486c000411741014100" - "410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb" - "86c00041122000410810021a418982c00041084106200041084100100a1a41cd86c0004118" - "2000410810021a200142003703104209200141106a22024108410010011a20024108410220" - "0041084100100a1a41e586c00041142000410810021a200241084100200041084100100a1a" - "41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" - "200341084102200041084100100a1a419087c00041142000410810021a41a487c000413820" - "0341084100200041084100100aac100b1a41dc87c000411841014100410010001a20014200" - "370308420920004108410010011a20014200370310200041084102200241084100100c1a41" - "f487c00041122002410810021a200041084103200241084100100c1a418688c00041122002" - "410810021a2001420037031842c0843d20034108410010011a200341084103200241084100" - "100c1a419888c00041182002410810021a200341084106200241084100100c1a41b088c000" - "411c2002410810021a41cc88c000411741014100410010001a2001420037031042c0843d20" - "024108410010011a2001420037031820024108200341084100100d1a41e388c00041142003" - "410810021a41f788c000411a41014100410010001a20014200370318418182c00041084189" - "82c000410820034108410010081a0240418982c0004108200341081005450440419189c000" - "411641014100410010001a0c010b41a789c000411541014100410010001a0b418982c00041" - "08418982c0004108200141186a22004108410010081a0240418182c0004108200041081005" - "45044041bc89c000411741014100410010001a0c010b41d389c00041164101410041001000" - "1a0b41e989c000411a41014100410010001a2001420037031020014200370318420a200141" - "186a22024108410010011a418182c000410820024108200141106a22004108410010091a41" - "838ac00041192000410810021a418182c00041082000410820004108410010091a419c8ac0" - "00410f2000410810021a02402002410820004108100545044041ab8ac00041144101410041" - "0010001a0c010b41bf8ac000411341014100410010001a0b200141206a240041010b0bdc0a" - "0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d2024" - "24242020666c6f61742066726f6d206936342031323330303a2020666c6f61742066726f6d" - "20693634203132333030206173204845583a2020666c6f61742066726f6d20693634203132" - "3330303a206661696c65642020666c6f61742066726f6d207536342031323330303a202066" - "6c6f61742066726f6d207536342031323330303a206661696c65642020666c6f6174206672" - "6f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065" - "787020322c206d616e746973736120333a206661696c65642020666c6f61742066726f6d20" - "636f6e737420313ad4838d7ea4c6800094838d7ea4c680002020666c6f61742066726f6d20" - "636f6e7374202d313a0a24242420746573745f666c6f61745f636f6d706172652024242420" - "20666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c656420" - "20666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f" - "6d203120213d20464c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41" - "545f4e454741544956455f4f4e452020666c6f61742066726f6d203120213e20464c4f4154" - "5f4e454741544956455f4f4e452020464c4f41545f4e454741544956455f4f4e45203c2066" - "6c6f61742066726f6d20312020464c4f41545f4e454741544956455f4f4e4520213c20666c" - "6f61742066726f6d20310a24242420746573745f666c6f61745f6164645f73756274726163" - "742024242420207265706561746564206164643a20676f6f64202072657065617465642061" - "64643a20626164202072657065617465642073756274726163743a20676f6f642020726570" - "65617465642073756274726163743a206261640a24242420746573745f666c6f61745f6d75" - "6c7469706c795f6469766964652024242420207265706561746564206d756c7469706c793a" - "20676f6f6420207265706561746564206d756c7469706c793a206261642020726570656174" - "6564206469766964653a20676f6f6420207265706561746564206469766964653a20626164" - "0a24242420746573745f666c6f61745f706f77202424242020666c6f61742063756265206f" - "6620313a2020666c6f61742036746820706f776572206f66202d313a2020666c6f61742073" - "7175617265206f6620393a2020666c6f61742030746820706f776572206f6620393a202066" - "6c6f617420737175617265206f6620303a2020666c6f61742030746820706f776572206f66" - "20302028657870656374696e6720494e56414c49445f504152414d53206572726f72293a0a" - "24242420746573745f666c6f61745f726f6f74202424242020666c6f61742073717274206f" - "6620393a2020666c6f61742063627274206f6620393a2020666c6f61742063627274206f66" - "20313030303030303a2020666c6f61742036746820726f6f74206f6620313030303030303a" - "0a24242420746573745f666c6f61745f6c6f672024242420206c6f675f3130206f66203130" - "30303030303a0a24242420746573745f666c6f61745f6e65676174652024242420206e6567" - "61746520636f6e737420313a20676f6f6420206e656761746520636f6e737420313a206261" - "6420206e656761746520636f6e7374202d313a20676f6f6420206e656761746520636f6e73" - "74202d313a206261640a24242420746573745f666c6f61745f696e76657274202424242020" - "696e76657274206120666c6f61742066726f6d2031303a2020696e7665727420616761696e" - "3a2020696e766572742074776963653a20676f6f642020696e766572742074776963653a20" - "626164004d0970726f64756365727302086c616e6775616765010452757374000c70726f63" - "65737365642d6279010572757374631d312e38372e30202831373036376539616320323032" - "352d30352d303929002c0f7461726765745f6665617475726573022b0f6d757461626c652d" - "676c6f62616c732b087369676e2d657874"; + "0061736d0100000001430860077f7f7f7f7f7f7f017f60057f7f7f7f7f017f60047f7f7f7f017f60067f7f7f7f7f7f" + "017f60047e7f7f7f017f60057f7e7f7f7f017f60037f7f7e017f6000017f02c9020e08686f73745f6c696205747261" + "6365000108686f73745f6c69620e666c6f61745f66726f6d5f696e74000408686f73745f6c69621274726163655f6f" + "70617175655f666c6f6174000208686f73745f6c69620f666c6f61745f66726f6d5f75696e74000108686f73745f6c" + "696209666c6f61745f736574000508686f73745f6c69620d666c6f61745f636f6d70617265000208686f73745f6c69" + "6209666c6f61745f616464000008686f73745f6c69620e666c6f61745f7375627472616374000008686f73745f6c69" + "620e666c6f61745f6d756c7469706c79000008686f73745f6c69620c666c6f61745f646976696465000008686f7374" + "5f6c696209666c6f61745f706f77000308686f73745f6c69620974726163655f6e756d000608686f73745f6c69620a" + "666c6f61745f726f6f74000308686f73745f6c696209666c6f61745f6c6f6700010302010705030100110619037f01" + "418080c0000b7f0041d28ac0000b7f0041e08ac0000b072e04066d656d6f727902000666696e697368000e0a5f5f64" + "6174615f656e6403010b5f5f686561705f6261736503020af20e01ef0e01047f230041206b22012400418080c00041" + "1d41014100410010001a200142003703100240428ce000200141106a22004108410010014108460440419d80c00041" + "172000410810021a41b480c000411e20004108410110001a0c010b41d280c000411e41014100410010001a0b200142" + "8ce0003703180240200141186a4108200141106a2200410841001003410846044041f080c00041172000410810021a" + "0c010b418781c000411e41014100410010001a0b0240410242fb00200141106a2200410841001004410846044041a5" + "81c00041212000410810021a0c010b41c681c000412641014100410010001a0b41ec81c0004115418182c000410810" + "021a419182c0004116418982c000410810021a41a782c000411b41014100410010001a200142003703180240420120" + "0141186a2200410841001001410846044041c282c000410f2000410810021a0c010b41d182c0004116410141004100" + "10001a0b0240200141186a4108418182c0004108100545044041e782c000411b41014100410010001a0c010b418283" + "c000411b41014100410010001a0b0240200141186a4108418982c000410810054101460440419d83c0004123410141" + "00410010001a0c010b41c083c000412441014100410010001a0b0240418982c0004108200141186a41081005410246" + "044041e483c000412341014100410010001a0c010b418784c000412441014100410010001a0b41ab84c00041204101" + "4100410010001a200142d487b6f4c7d4b1c000370310410921000340200141106a22024108418182c0004108200241" + "08410010061a200041016b22000d000b20014200370318420a200141186a22004108410010011a0240200041082002" + "4108100545044041cb84c000411441014100410010001a0c010b41df84c000411341014100410010001a0b410b2100" + "0340200141106a22024108418182c000410820024108410010071a200041016b22000d000b024020024108418982c0" + "004108100545044041f284c000411941014100410010001a0c010b418b85c000411841014100410010001a0b41a385" + "c000412341014100410010001a20014200370300420a20014108410010011a200142d487b6f4c7d4b1c00037030841" + "0621000340200141086a220241082001410820024108410010081a200041016b22000d000b2001420037031042c084" + "3d200141106a22004108410010011a02402000410820024108100545044041c685c000411941014100410010001a0c" + "010b41df85c000411841014100410010001a0b410721000340200141086a220241082001410820024108410010091a" + "200041016b22000d000b20014200370318417f4201200141186a22004108410010041a024020024108200041081005" + "45044041f785c000411741014100410010001a0c010b418e86c000411641014100410010001a0b41a486c000411741" + "014100410010001a20014200370308418182c00041084103200141086a220041084100100a1a41bb86c00041122000" + "410810021a418982c00041084106200041084100100a1a41cd86c00041182000410810021a20014200370310420920" + "0141106a22024108410010011a200241084102200041084100100a1a41e586c00041142000410810021a2002410841" + "00200041084100100a1a41f986c00041172000410810021a200142003703184200200141186a22034108410010011a" + "200341084102200041084100100a1a419087c00041142000410810021a41a487c00041382003410841002000410841" + "00100aac100b1a41dc87c000411841014100410010001a20014200370308420920004108410010011a200142003703" + "10200041084102200241084100100c1a41f487c00041122002410810021a200041084103200241084100100c1a4186" + "88c00041122002410810021a2001420037031842c0843d20034108410010011a200341084103200241084100100c1a" + "419888c00041182002410810021a200341084106200241084100100c1a41b088c000411c2002410810021a41cc88c0" + "00411741014100410010001a2001420037031042c0843d20024108410010011a200142003703182002410820034108" + "4100100d1a41e388c00041142003410810021a41f788c000411a41014100410010001a20014200370318418182c000" + "4108418982c000410820034108410010081a0240418982c0004108200341081005450440419189c000411641014100" + "410010001a0c010b41a789c000411541014100410010001a0b418982c0004108418982c0004108200141186a220041" + "08410010081a0240418182c000410820004108100545044041bc89c000411741014100410010001a0c010b41d389c0" + "00411641014100410010001a0b41e989c000411a41014100410010001a2001420037031020014200370318420a2001" + "41186a22024108410010011a418182c000410820024108200141106a22004108410010091a41838ac0004119200041" + "0810021a418182c00041082000410820004108410010091a419c8ac000410f2000410810021a024020024108200041" + "08100545044041ab8ac000411441014100410010001a0c010b41bf8ac000411341014100410010001a0b200141206a" + "240041010b0bdc0a0100418080c0000bd20a0a24242420746573745f666c6f61745f66726f6d5f7761736d20242424" + "2020666c6f61742066726f6d206936342031323330303a2020666c6f61742066726f6d206936342031323330302061" + "73204845583a2020666c6f61742066726f6d206936342031323330303a206661696c65642020666c6f61742066726f" + "6d207536342031323330303a2020666c6f61742066726f6d207536342031323330303a206661696c65642020666c6f" + "61742066726f6d2065787020322c206d616e7469737361203132333a2020666c6f61742066726f6d2065787020322c" + "206d616e746973736120333a206661696c65642020666c6f61742066726f6d20636f6e737420313ad4838d7ea4c680" + "0094838d7ea4c680002020666c6f61742066726f6d20636f6e7374202d313a0a24242420746573745f666c6f61745f" + "636f6d70617265202424242020666c6f61742066726f6d20313a2020666c6f61742066726f6d20313a206661696c65" + "642020666c6f61742066726f6d2031203d3d20464c4f41545f4f4e452020666c6f61742066726f6d203120213d2046" + "4c4f41545f4f4e452020666c6f61742066726f6d2031203e20464c4f41545f4e454741544956455f4f4e452020666c" + "6f61742066726f6d203120213e20464c4f41545f4e454741544956455f4f4e452020464c4f41545f4e454741544956" + "455f4f4e45203c20666c6f61742066726f6d20312020464c4f41545f4e454741544956455f4f4e4520213c20666c6f" + "61742066726f6d20310a24242420746573745f666c6f61745f6164645f737562747261637420242424202072657065" + "61746564206164643a20676f6f6420207265706561746564206164643a206261642020726570656174656420737562" + "74726163743a20676f6f64202072657065617465642073756274726163743a206261640a24242420746573745f666c" + "6f61745f6d756c7469706c795f6469766964652024242420207265706561746564206d756c7469706c793a20676f6f" + "6420207265706561746564206d756c7469706c793a2062616420207265706561746564206469766964653a20676f6f" + "6420207265706561746564206469766964653a206261640a24242420746573745f666c6f61745f706f772024242420" + "20666c6f61742063756265206f6620313a2020666c6f61742036746820706f776572206f66202d313a2020666c6f61" + "7420737175617265206f6620393a2020666c6f61742030746820706f776572206f6620393a2020666c6f6174207371" + "75617265206f6620303a2020666c6f61742030746820706f776572206f6620302028657870656374696e6720494e56" + "414c49445f504152414d53206572726f72293a0a24242420746573745f666c6f61745f726f6f74202424242020666c" + "6f61742073717274206f6620393a2020666c6f61742063627274206f6620393a2020666c6f61742063627274206f66" + "20313030303030303a2020666c6f61742036746820726f6f74206f6620313030303030303a0a24242420746573745f" + "666c6f61745f6c6f672024242420206c6f675f3130206f6620313030303030303a0a24242420746573745f666c6f61" + "745f6e65676174652024242420206e656761746520636f6e737420313a20676f6f6420206e656761746520636f6e73" + "7420313a2062616420206e656761746520636f6e7374202d313a20676f6f6420206e656761746520636f6e7374202d" + "313a206261640a24242420746573745f666c6f61745f696e76657274202424242020696e76657274206120666c6f61" + "742066726f6d2031303a2020696e7665727420616761696e3a2020696e766572742074776963653a20676f6f642020" + "696e766572742074776963653a20626164004d0970726f64756365727302086c616e6775616765010452757374000c" + "70726f6365737365642d6279010572757374631d312e38372e30202831373036376539616320323032352d30352d30" + "3929002c0f7461726765745f6665617475726573022b0f6d757461626c652d676c6f62616c732b087369676e2d6578" + "74"; extern std::string const float0Hex = - "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f6007" - "7f7f7f7f7f7f7f017f60047f7f7f7f017f6000017f025f0408686f73745f" - "6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f" - "6d5f696e74000108686f73745f6c69620e666c6f61745f73756274726163" - "74000208686f73745f6c69620d666c6f61745f636f6d7061726500030302" - "010405030100110619037f01418080c0000b7f00419281c0000b7f0041a0" - "81c0000b072e04066d656d6f727902000666696e69736800040a5f5f6461" - "74615f656e6403010b5f5f686561705f6261736503020abe0201bb020101" - "7f23808080800041206b2200248080808000418080c08000411541004100" - "41001080808080001a200042003703084200200041086a41084100108180" - "8080001a20004200370310420a200041106a410841001081808080001a20" - "0042003703180240200041106a4108200041106a4108200041186a410841" - "001082808080004108460d00419580c08000411541004100410010808080" - "80001a0b02400240200041086a4108200041186a41081083808080000d00" - "41aa80c0800041174100410041001080808080001a0c010b41c180c08000" - "41164100410041001080808080001a0b02400240200041086a410841d780" - "c0800041081083808080000d0041df80c08000411a410041004100108080" - "8080001a0c010b41f980c0800041194100410041001080808080001a0b20" - "0041206a24808080800041010b0b9c010100418080c0000b92010a242424" - "20746573745f666c6f61745f30202424242020666c6f61742031302d3130" - "3a206661696c65642020666c6f6174203020636f6d706172653a20676f6f" - "642020666c6f6174203020636f6d706172653a2062616480000000000000" - "002020464c4f41545f5a45524f20636f6d706172653a20676f6f64202046" - "4c4f41545f5a45524f20636f6d706172653a20626164009502046e616d65" - "001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e3878" - "72706c5f73746434686f7374357472616365313768616338383262323664" - "656162656436364501355f5a4e387872706c5f73746434686f7374313466" - "6c6f61745f66726f6d5f696e743137683032343066386533613839643139" - "39654502355f5a4e387872706c5f73746434686f73743134666c6f61745f" - "737562747261637431376864363430633135323334353432393563450334" - "5f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d7061" - "72653137683663386465656231323864393638386645040666696e697368" - "071201000f5f5f737461636b5f706f696e746572090a0100072e726f6461" - "7461004d0970726f64756365727302086c616e6775616765010452757374" - "000c70726f6365737365642d6279010572757374631d312e38392e302028" - "32393438333838336520323032352d30382d3034290094010f7461726765" - "745f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b" - "2d6d656d6f72792d6f70742b1663616c6c2d696e6469726563742d6f7665" - "726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f" - "62616c732b136e6f6e7472617070696e672d6670746f696e742b0f726566" - "6572656e63652d74797065732b087369676e2d657874"; + "0061736d0100000001290560057f7f7f7f7f017f60047e7f7f7f017f60077f7f7f7f7f7f7f017f60047f7f7f7f017f" + "6000017f025f0408686f73745f6c6962057472616365000008686f73745f6c69620e666c6f61745f66726f6d5f696e" + "74000108686f73745f6c69620e666c6f61745f7375627472616374000208686f73745f6c69620d666c6f61745f636f" + "6d7061726500030302010405030100110619037f01418080c0000b7f00419281c0000b7f0041a081c0000b072e0406" + "6d656d6f727902000666696e69736800040a5f5f646174615f656e6403010b5f5f686561705f6261736503020abe02" + "01bb0201017f23808080800041206b2200248080808000418080c0800041154100410041001080808080001a200042" + "003703084200200041086a410841001081808080001a20004200370310420a200041106a410841001081808080001a" + "200042003703180240200041106a4108200041106a4108200041186a410841001082808080004108460d00419580c0" + "800041154100410041001080808080001a0b02400240200041086a4108200041186a41081083808080000d0041aa80" + "c0800041174100410041001080808080001a0c010b41c180c0800041164100410041001080808080001a0b02400240" + "200041086a410841d780c0800041081083808080000d0041df80c08000411a4100410041001080808080001a0c010b" + "41f980c0800041194100410041001080808080001a0b200041206a24808080800041010b0b9c010100418080c0000b" + "92010a24242420746573745f666c6f61745f30202424242020666c6f61742031302d31303a206661696c6564202066" + "6c6f6174203020636f6d706172653a20676f6f642020666c6f6174203020636f6d706172653a206261648000000000" + "0000002020464c4f41545f5a45524f20636f6d706172653a20676f6f642020464c4f41545f5a45524f20636f6d7061" + "72653a20626164009502046e616d65001110666c6f61745f74657374732e7761736d01da0105002b5f5a4e38787270" + "6c5f73746434686f7374357472616365313768616338383262323664656162656436364501355f5a4e387872706c5f" + "73746434686f73743134666c6f61745f66726f6d5f696e74313768303234306638653361383964313939654502355f" + "5a4e387872706c5f73746434686f73743134666c6f61745f7375627472616374313768643634306331353233343534" + "323935634503345f5a4e387872706c5f73746434686f73743133666c6f61745f636f6d706172653137683663386465" + "656231323864393638386645040666696e697368071201000f5f5f737461636b5f706f696e746572090a0100072e72" + "6f64617461004d0970726f64756365727302086c616e6775616765010452757374000c70726f6365737365642d6279" + "010572757374631d312e38392e30202832393438333838336520323032352d30382d3034290094010f746172676574" + "5f6665617475726573082b0b62756c6b2d6d656d6f72792b0f62756c6b2d6d656d6f72792d6f70742b1663616c6c2d" + "696e6469726563742d6f7665726c6f6e672b0a6d756c746976616c75652b0f6d757461626c652d676c6f62616c732" + "b136e6f6e7472617070696e672d6670746f696e742b0f7265666572656e63652d74797065732b087369676e2d65787" + "4"; extern std::string const disabledFloatHex = - "0061736d010000000108026000006000017f03030200010503010002063e" - "0a7f004180080b7f004180080b7f004180100b7f004180100b7f00418090" - "040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041" - "010b07b0010d066d656d6f72790200115f5f7761736d5f63616c6c5f6374" - "6f727300000666696e69736800010362756603000c5f5f64736f5f68616e" - "646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f77" - "03030c5f5f737461636b5f6869676803040d5f5f676c6f62616c5f626173" - "6503050b5f5f686561705f6261736503060a5f5f686561705f656e640307" - "0d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503" - "090a150202000b100043000000c54300200045921a41010b"; + "0061736d010000000108026000006000017f03030200010503010002063e0a7f004180080b7f004180080b7f004180" + "100b7f004180100b7f00418090040b7f004180080b7f00418090040b7f00418080080b7f0041000b7f0041010b07b0" + "010d066d656d6f72790200115f5f7761736d5f63616c6c5f63746f727300000666696e69736800010362756603000c" + "5f5f64736f5f68616e646c6503010a5f5f646174615f656e6403020b5f5f737461636b5f6c6f7703030c5f5f737461" + "636b5f6869676803040d5f5f676c6f62616c5f6261736503050b5f5f686561705f6261736503060a5f5f686561705f" + "656e6403070d5f5f6d656d6f72795f6261736503080c5f5f7461626c655f6261736503090a150202000b1000430000" + "00c54300200045921a41010b"; extern std::string const memoryPointerAtLimitHex = - "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a" - "0e010c0041ffff032d00001a41010b"; + "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a0e010c0041ffff032d00" + "001a41010b"; extern std::string const memoryPointerOverLimitHex = - "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a" - "0e010c00418080042d00001a41010b"; + "0061736d010000000105016000017f030201000503010001070a010666696e69736800000a0e010c00418080042d00" + "001a41010b"; extern std::string const memoryOffsetOverLimitHex = - "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" - "66696e69736800000a0e010c00410028028080041a41010b"; + "0061736d010000000105016000017f030201000503010001071302066d656d6f727902000666696e69736800000a0e" + "010c00410028028080041a41010b"; extern std::string const memoryEndOfWordOverLimitHex = - "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" - "66696e69736800000a0e010c0041feff032802001a41010b"; + "0061736d010000000105016000017f030201000503010001071302066d656d6f727902000666696e69736800000a0e" + "010c0041feff032802001a41010b"; extern std::string const memoryGrow0To1PageHex = - "0061736d010000000105016000017f030201000503010000071302066d656d6f7279020006" - "66696e69736800000a0b010900410140001a41010b"; + "0061736d010000000105016000017f030201000503010000071302066d656d6f727902000666696e69736800000a0b" + "010900410140001a41010b"; extern std::string const memoryGrow1To0PageHex = - "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" - "66696e69736800000a13011100417f4000417f460440417f0f0b41010b"; + "0061736d010000000105016000017f030201000503010001071302066d656d6f727902000666696e69736800000a13" + "011100417f4000417f460440417f0f0b41010b"; extern std::string const memoryLastByteOf8MBHex = - "0061736d010000000105016000017f030201000506010180018001071302066d656d6f7279" - "02000666696e69736800000a0f010d0041ffffff032d00001a41010b"; + "0061736d010000000105016000017f030201000506010180018001071302066d656d6f727902000666696e69736800" + "000a0f010d0041ffffff032d00001a41010b"; extern std::string const memoryGrow1MoreThan8MBHex = - "0061736d010000000105016000017f03020100050401008001071302066d656d6f72790200" - "0666696e69736800000a1301110041014000417f460440417f0f0b41010b"; + "0061736d010000000105016000017f03020100050401008001071302066d656d6f727902000666696e69736800000a" + "1301110041014000417f460440417f0f0b41010b"; extern std::string const memoryGrow0MoreThan8MBHex = - "0061736d010000000105016000017f03020100050401008001071302066d656d6f72790200" - "0666696e69736800000a1301110041004000417f460440417f0f0b41010b"; + "0061736d010000000105016000017f03020100050401008001071302066d656d6f727902000666696e69736800000a" + "1301110041004000417f460440417f0f0b41010b"; extern std::string const memoryInit1MoreThan8MBHex = - "0061736d010000000105016000017f030201000506010181018101071302066d656d6f7279" - "02000666696e69736800000a0f010d0041ffffff032d00001a41010b"; + "0061736d010000000105016000017f030201000506010181018101071302066d656d6f727902000666696e69736800" + "000a0f010d0041ffffff032d00001a41010b"; extern std::string const memoryNegativeAddressHex = - "0061736d010000000105016000017f030201000506010180018001071302066d656d6f7279" - "02000666696e69736800000a0c010a00417f2d00001a41010b"; + "0061736d010000000105016000017f030201000506010180018001071302066d656d6f727902000666696e69736800" + "000a0c010a00417f2d00001a41010b"; extern std::string const table64ElementsHex = - "0061736d010000000108026000006000017f0303020001040401700040070a010666696e69" - "736800010946010041000b4000000000000000000000000000000000000000000000000000" - "00000000000000000000000000000000000000000000000000000000000000000000000000" - "00000a090202000b040041010b"; + "0061736d010000000108026000006000017f0303020001040401700040070a010666696e6973680001094601004100" + "0b40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "000000000000000000000000000000000000000a090202000b040041010b"; extern std::string const table65ElementsHex = - "0061736d010000000108026000006000017f0303020001040401700041070a010666696e69" - "736800010947010041000b4100000000000000000000000000000000000000000000000000" - "00000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000a090202000b040041010b"; + "0061736d010000000108026000006000017f0303020001040401700041070a010666696e6973680001094701004100" + "0b41000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "00000000000000000000000000000000000000000a090202000b040041010b"; extern std::string const table2TablesHex = - "0061736d010000000108026000006000017f03030200010409027001010170010101070a01" - "0666696e6973680001090f020041000b0100020141000b0001000a090202000b040041010" - "b"; + "0061736d010000000108026000006000017f03030200010409027001010170010101070a010666696e697368000109" + "0f020041000b0100020141000b0001000a090202000b040041010b"; extern std::string const table0ElementsHex = - "0061736d010000000105016000017f03020100040401700000070a010666696e6973680000" - "0a0601040041010b"; + "0061736d010000000105016000017f03020100040401700000070a010666696e69736800000a0601040041010b"; extern std::string const tableUintMaxHex = - "0061736d010000000105016000017f030201000408017000ffffffff0f070a010666696e69" - "736800000a0601040041010b"; + "0061736d010000000105016000017f030201000408017000ffffffff0f070a010666696e69736800000a0601040041" + "010b"; extern std::string const proposalMutableGlobalHex = - "0061736d010000000105016000017f030201000606017f0141000b07140207636f756e7465" - "7203000666696e69736800000a0d010b00230041016a240041010b"; + "0061736d010000000105016000017f030201000606017f0141000b07140207636f756e74657203000666696e697368" + "00000a0d010b00230041016a240041010b"; extern std::string const proposalGcStructNewHex = - "0061736d01000000010b026000017f5f027f017f0103020100070a010666696e6973680000" - "0a0a010800fb01011a41010b"; + "0061736d01000000010b026000017f5f027f017f0103020100070a010666696e69736800000a0a010800fb01011a41" + "010b"; extern std::string const proposalMultiValueHex = - "0061736d010000000110036000027f7f6000017f60027f7f017f0303020001070a01066669" - "6e69736800010a14020600410a41140b0b00100002026a411e460b0b"; + "0061736d010000000110036000027f7f6000017f60027f7f017f0303020001070a010666696e69736800010a140206" + "00410a41140b0b00100002026a411e460b0b"; extern std::string const proposalSignExtHex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a0b01090041" - "ff01c0417f460b"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a0b01090041ff01c0417f460b"; extern std::string const proposalFloatToIntHex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a1201100043" - "f9021550fc0041ffffffff07460b"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a1201100043f9021550fc0041ffffff" + "ff07460b"; extern std::string const proposalBulkMemoryHex = - "0061736d010000000105016000017f030201000503010001071302066d656d6f7279020006" - "66696e69736800000a1f011d004100412a3a000041e40041004101fc0a000041e4002d0000" - "412a460b"; + "0061736d010000000105016000017f030201000503010001071302066d656d6f727902000666696e69736800000a1f" + "011d004100412a3a000041e40041004101fc0a000041e4002d0000412a460b"; extern std::string const proposalRefTypesHex = - "0061736d010000000105016000017f020f0103656e76057461626c65016f00010302010007" - "0a010666696e69736800000a0c010a004100d06f260041010b"; + "0061736d010000000105016000017f020f0103656e76057461626c65016f000103020100070a010666696e69736800" + "000a0c010a004100d06f260041010b"; extern std::string const proposalTailCallHex = - "0061736d010000000105016000017f0303020000070a010666696e69736800010a0b020400" - "41010b040012000b"; + "0061736d010000000105016000017f0303020000070a010666696e69736800010a0b02040041010b040012000b"; extern std::string const proposalExtendedConstHex = - "0061736d010000000105016000017f030201000609017f00410a41206a0b070a010666696e" - "69736800000a090107002300412a460b"; + "0061736d010000000105016000017f030201000609017f00410a41206a0b070a010666696e69736800000a09010700" + "2300412a460b"; extern std::string const proposalMultiMemoryHex = - "0061736d010000000105016000017f0302010005050200000001070a010666696e69736800" - "000a060104003f010b"; + "0061736d010000000105016000017f0302010005050200000001070a010666696e69736800000a060104003f010b"; extern std::string const proposalCustomPageSizesHex = - "0061736d010000000105016000017f0302010005040108010a070a010666696e6973680000" - "0a0601040041010b0010046e616d65010901000666696e697368"; + "0061736d010000000105016000017f0302010005040108010a070a010666696e69736800000a0601040041010b0010" + "046e616d65010901000666696e697368"; extern std::string const proposalMemory64Hex = - "0061736d010000000105016000017f030201000503010401070a010666696e69736800000a" - "10010e004200412a3a00003f004201510b0010046e616d65010901000666696e697368"; + "0061736d010000000105016000017f030201000503010401070a010666696e69736800000a10010e004200412a3a00" + "003f004201510b0010046e616d65010901000666696e697368"; extern std::string const proposalWideArithmeticHex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a0e010c0042" - "014202fc161a1a41010b0010046e616d65010901000666696e697368"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a0e010c0042014202fc161a1a41010b" + "0010046e616d65010901000666696e697368"; extern std::string const trapDivideBy0Hex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a0c010a0041" - "2a41006d1a41010b"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a0c010a00412a41006d1a41010b"; extern std::string const trapIntOverflowHex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a0d010b0041" - "8080808078417f6d0b"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a0d010b00418080808078417f6d0b"; extern std::string const trapUnreachableHex = - "0061736d010000000105016000017f03020100070a010666696e69736800000a0701050000" - "41010b"; + "0061736d010000000105016000017f03020100070a010666696e69736800000a070105000041010b"; extern std::string const trapNullCallHex = - "0061736d010000000105016000017f03020100040401700001070a010666696e6973680000" - "0a0901070041001100000b"; + "0061736d010000000105016000017f03020100040401700001070a010666696e69736800000a090107004100110000" + "0b"; extern std::string const trapFuncSigMismatchHex = - "0061736d010000000108026000006000017f0303020001040401700001070a010666696e69" - "736800010907010041000b01000a0d020300010b070041001101000b"; + "0061736d010000000108026000006000017f0303020001040401700001070a010666696e6973680001090701004100" + "0b01000a0d020300010b070041001101000b"; extern std::string const wasiGetTimeHex = - "0061736d01000000010c0260037f7e7f017f6000017f02290116776173695f736e61707368" - "6f745f70726576696577310e636c6f636b5f74696d655f6765740000030201010503010001" - "071302066d656d6f727902000666696e69736800010a16011400410042e807410010004504" - "7f410105417f0b0b"; + "0061736d01000000010c0260037f7e7f017f6000017f02290116776173695f736e617073686f745f70726576696577" + "310e636c6f636b5f74696d655f6765740000030201010503010001071302066d656d6f727902000666696e69736800" + "010a16011400410042e8074100100045047f410105417f0b0b"; extern std::string const wasiPrintHex = - "0061736d01000000010d0260047f7f7f7f017f6000017f02230116776173695f736e617073" - "686f745f70726576696577310866645f77726974650000030201010503010001071302066d" - "656d6f727902000666696e69736800010a1d011b01017f4118210041014100410120001000" - "45047f410105417f0b0b0b1e030041100b0648656c6c6f0a0041000b04100000000041040b" - "0406000000"; + "0061736d01000000010d0260047f7f7f7f017f6000017f02230116776173695f736e617073686f745f707265766965" + "77310866645f77726974650000030201010503010001071302066d656d6f727902000666696e69736800010a1d011b" + "01017f411821004101410041012000100045047f410105417f0b0b0b1e030041100b0648656c6c6f0a0041000b0410" + "0000000041040b0406000000"; // The following several wasm hex strings are for testing wasm section // corruption cases. They are illegal hence do not have corresponding @@ -1269,9 +945,9 @@ extern std::string const lyingHeaderHex = "0061736d01000000018080808008"; // # Vector count: Infinite stream of 0x80 (100 bytes) // data += b'\x80' * 100 extern std::string const neverEndingNumberHex = - "0061736d010000000105808080808080808080808080808080808080808080808080808080" - "80808080808080808080808080808080808080808080808080808080808080808080808080" - "808080808080808080808080808080808080808080808080808080808080808080808080"; + "0061736d01000000010580808080808080808080808080808080808080808080808080808080808080808080808080" + "8080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080" + "80808080808080808080808080808080"; // Corruption Test: vectorLie // Scenario: A vector declares it has 4 billion items, but provides none. @@ -1357,7627 +1033,4638 @@ extern std::string const localVariableBombHex = "0061736d01000000010401600000030201000a0f010d01ffffffff0f7f0b"; extern std::string const infiniteLoopWasmHex = - "0061736d010000000108026000006000017f030302000105030100020638097f004180080b" - "7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080" - "080b7f0041000b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c" - "5f63746f72730000046c6f6f7000010c5f5f64736f5f68616e646c6503000a5f5f64617461" - "5f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f" - "5f676c6f62616c5f6261736503040b5f5f686561705f6261736503050a5f5f686561705f65" - "6e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f6261736503080a27" - "0202000b220041fc87044100360200034041fc870441fc870428020041016a3602000c000b" - "000b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31" - "392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c" - "766d2f6c6c766d2d70726f6a65637420616234623561326462353832393538616631656533" - "303861373930636664623432626432343732302900490f7461726765745f66656174757265" - "73042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f726566657265" - "6e63652d74797065732b0a6d756c746976616c7565"; + "0061736d010000000108026000006000017f030302000105030100020638097f004180080b7f004180080b7f004180" + "080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f0041000b7f0041010b07a8010c066d656d" + "6f72790200115f5f7761736d5f63616c6c5f63746f72730000046c6f6f7000010c5f5f64736f5f68616e646c650300" + "0a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f5f676c" + "6f62616c5f6261736503040b5f5f686561705f6261736503050a5f5f686561705f656e6403060d5f5f6d656d6f7279" + "5f6261736503070c5f5f7461626c655f6261736503080a270202000b220041fc87044100360200034041fc870441fc" + "870428020041016a3602000c000b000b007f0970726f647563657273010c70726f6365737365642d62790105636c61" + "6e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c76" + "6d2d70726f6a6563742061623462356132646235383239353861663165653330386137393063666462343262643234" + "3732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d" + "6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const startLoopHex = - "0061736d010000000108026000006000017f03030200010712020573746172740000066669" - "6e69736800010801000a0e02070003400c000b0b040041010b"; + "0061736d010000000108026000006000017f030302000107120205737461727400000666696e69736800010801000a" + "0e02070003400c000b0b040041010b"; extern std::string const badAlignWasmHex = "0061736d01000000011b046000017f60057f7f7f7f7f017f60067f7f7f7f7f7f017f600000022a0203656e760f666c" - "6f61745f66726f6d5f75" - "696e74000103656e760c636865636b5f6b65796c6574000203050403000000050301000306470b7f004180080b7f00" - "418088020b7f00418008" - "0b7f00418088040b7f00418088040b7f00418088080b7f004180080b7f00418088080b7f004180800c0b7f0041000b" - "7f0041010b07cc011006" - "6d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730002057465737431000307655f6461746131030005" - "7465737432000407655f" - "64617461320301047465737400050c5f5f64736f5f68616e646c6503020a5f5f646174615f656e6403030b5f5f7374" - "61636b5f6c6f7703040c" - "5f5f737461636b5f6869676803050d5f5f676c6f62616c5f6261736503060b5f5f686561705f6261736503070a5f5f" - "686561705f656e640308" - "0d5f5f6d656d6f72795f6261736503090c5f5f7461626c655f62617365030a0a99020402000b2801017f418108427f" - "370000418108410841a3" - "08410c41001000220041a40828020020004100481b0b5f01017f419a88024191a4cca00136010041928802428994ac" - "e0d0c1c3871037010041" - "8a88024281848ca0d0c0c1830837010041818802417f360000418a8802411441818802410441a38802412010012200" - "41a48802280200200041" - "00481b0b8a0101037f418108427f370000418108410841a308410c410010002100419a88024191a4cca00136010041" - "928802428994ace0d0c1" - "c38710370100418a88024281848ca0d0c0c1830837010041818802417f36000041a4082802002101418a8802411441" - "818802410441a3880241" - "201001220241a4880228020020024100481b2000200120004100481b6a0b007f0970726f647563657273010c70726f" - "6365737365642d627901" - "05636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d" - "2f6c6c766d2d70726f6a" - "6563742061623462356132646235383239353861663165653330386137393063666462343262643234373230290049" - "0f7461726765745f6665" - "617475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74" - "797065732b0a6d756c74" - "6976616c7565"; + "6f61745f66726f6d5f75696e74000103656e760c636865636b5f6b65796c6574000203050403000000050301000306" + "470b7f004180080b7f00418088020b7f004180080b7f00418088040b7f00418088040b7f00418088080b7f00418008" + "0b7f00418088080b7f004180800c0b7f0041000b7f0041010b07cc0110066d656d6f72790200115f5f7761736d5f63" + "616c6c5f63746f72730002057465737431000307655f64617461310300057465737432000407655f64617461320301" + "047465737400050c5f5f64736f5f68616e646c6503020a5f5f646174615f656e6403030b5f5f737461636b5f6c6f77" + "03040c5f5f737461636b5f6869676803050d5f5f676c6f62616c5f6261736503060b5f5f686561705f626173650307" + "0a5f5f686561705f656e6403080d5f5f6d656d6f72795f6261736503090c5f5f7461626c655f62617365030a0a9902" + "0402000b2801017f418108427f370000418108410841a308410c41001000220041a40828020020004100481b0b5f01" + "017f419a88024191a4cca00136010041928802428994ace0d0c1c38710370100418a88024281848ca0d0c0c1830837" + "010041818802417f360000418a8802411441818802410441a3880241201001220041a4880228020020004100481b0b" + "8a0101037f418108427f370000418108410841a308410c410010002100419a88024191a4cca0013601004192880242" + "8994ace0d0c1c38710370100418a88024281848ca0d0c0c1830837010041818802417f36000041a408280200210141" + "8a8802411441818802410441a3880241201001220241a4880228020020024100481b2000200120004100481b6a0b00" + "7f0970726f647563657273010c70726f6365737365642d62790105636c616e675f31392e312e352d776173692d7364" + "6b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a6563742061623462356132" + "6462353832393538616631656533303861373930636664623432626432343732302900490f7461726765745f666561" + "7475726573042b0f6d757461626c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d7479" + "7065732b0a6d756c746976616c7565"; extern std::string const thousandParamsHex = "0061736d0100000001f1070260000060e8077f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f017f030302000105" - "030100020638097f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00" - "418080080b7f0041000b" - "7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730000047465737400010c5f" - "5f64736f5f68616e646c" - "6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d5f" - "5f676c6f62616c5f6261" - "736503040b5f5f686561705f6261736503050a5f5f686561705f656e6403060d5f5f6d656d6f72795f626173650307" - "0c5f5f7461626c655f62" - "61736503080aa71e0202000ba11e00200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a6a" - "200b6a200c6a200d6a20" - "0e6a200f6a20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d6a" - "201e6a201f6a20206a20" - "216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a202f6a20306a" - "20316a20326a20336a20" - "346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e6a203f6a20406a20416a20426a20436a" - "20446a20456a20466a20" - "476a20486a20496a204a6a204b6a204c6a204d6a204e6a204f6a20506a20516a20526a20536a20546a20556a20566a" - "20576a20586a20596a20" - "5a6a205b6a205c6a205d6a205e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a20696a" - "206a6a206b6a206c6a20" - "6d6a206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c6a" - "207d6a207e6a207f6a20" - "80016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a2089016a208a016a208b016a" - "208c016a208d016a208e" - "016a208f016a2090016a2091016a2092016a2093016a2094016a2095016a2096016a2097016a2098016a2099016a20" - "9a016a209b016a209c01" - "6a209d016a209e016a209f016a20a0016a20a1016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20a8" - "016a20a9016a20aa016a" - "20ab016a20ac016a20ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b601" - "6a20b7016a20b8016a20" - "b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c4016a" - "20c5016a20c6016a20c7" - "016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20d0016a20d1016a20d2016a20" - "d3016a20d4016a20d501" - "6a20d6016a20d7016a20d8016a20d9016a20da016a20db016a20dc016a20dd016a20de016a20df016a20e0016a20e1" - "016a20e2016a20e3016a" - "20e4016a20e5016a20e6016a20e7016a20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef01" - "6a20f0016a20f1016a20" - "f2016a20f3016a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd016a" - "20fe016a20ff016a2080" - "026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a208b026a20" - "8c026a208d026a208e02" - "6a208f026a2090026a2091026a2092026a2093026a2094026a2095026a2096026a2097026a2098026a2099026a209a" - "026a209b026a209c026a" - "209d026a209e026a209f026a20a0026a20a1026a20a2026a20a3026a20a4026a20a5026a20a6026a20a7026a20a802" - "6a20a9026a20aa026a20" - "ab026a20ac026a20ad026a20ae026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b6026a" - "20b7026a20b8026a20b9" - "026a20ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a20" - "c5026a20c6026a20c702" - "6a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d1026a20d2026a20d3" - "026a20d4026a20d5026a" - "20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20dd026a20de026a20df026a20e0026a20e102" - "6a20e2026a20e3026a20" - "e4026a20e5026a20e6026a20e7026a20e8026a20e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef026a" - "20f0026a20f1026a20f2" - "026a20f3026a20f4026a20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a20" - "fe026a20ff026a208003" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f017f030302000105030100020638097f" + "004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f0041" + "000b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f7273000004746573740001" + "0c5f5f64736f5f68616e646c6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f7374" + "61636b5f6869676803030d5f5f676c6f62616c5f6261736503040b5f5f686561705f6261736503050a5f5f68656170" + "5f656e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f6261736503080aa71e0202000ba11e00" + "200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a6a200b6a200c6a200d6a200e6a200f6a" + "20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d6a201e6a201f" + "6a20206a20216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a20" + "2f6a20306a20316a20326a20336a20346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e6a" + "203f6a20406a20416a20426a20436a20446a20456a20466a20476a20486a20496a204a6a204b6a204c6a204d6a204e" + "6a204f6a20506a20516a20526a20536a20546a20556a20566a20576a20586a20596a205a6a205b6a205c6a205d6a20" + "5e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a20696a206a6a206b6a206c6a206d6a" + "206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c6a207d" + "6a207e6a207f6a2080016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a2089016a" + "208a016a208b016a208c016a208d016a208e016a208f016a2090016a2091016a2092016a2093016a2094016a209501" + "6a2096016a2097016a2098016a2099016a209a016a209b016a209c016a209d016a209e016a209f016a20a0016a20a1" + "016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20a8016a20a9016a20aa016a20ab016a20ac016a20" + "ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b6016a20b7016a20b8016a" + "20b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c401" + "6a20c5016a20c6016a20c7016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20d0" + "016a20d1016a20d2016a20d3016a20d4016a20d5016a20d6016a20d7016a20d8016a20d9016a20da016a20db016a20" + "dc016a20dd016a20de016a20df016a20e0016a20e1016a20e2016a20e3016a20e4016a20e5016a20e6016a20e7016a" + "20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef016a20f0016a20f1016a20f2016a20f301" + "6a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd016a20fe016a20ff" + "016a2080026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a20" + "8b026a208c026a208d026a208e026a208f026a2090026a2091026a2092026a2093026a2094026a2095026a2096026a" + "2097026a2098026a2099026a209a026a209b026a209c026a209d026a209e026a209f026a20a0026a20a1026a20a202" + "6a20a3026a20a4026a20a5026a20a6026a20a7026a20a8026a20a9026a20aa026a20ab026a20ac026a20ad026a20ae" + "026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b6026a20b7026a20b8026a20b9026a20" + "ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a20c5026a" + "20c6026a20c7026a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d102" + "6a20d2026a20d3026a20d4026a20d5026a20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20dd" + "026a20de026a20df026a20e0026a20e1026a20e2026a20e3026a20e4026a20e5026a20e6026a20e7026a20e8026a20" + "e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef026a20f0026a20f1026a20f2026a20f3026a20f4026a" + "20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a20fe026a20ff026a208003" "6a2081036a2082036a2083036a2084036a2085036a2086036a2087036a2088036a2089036a208a036a208b036a208c" - "036a208d036a208e036a" - "208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a2098036a2099036a209a03" - "6a209b036a209c036a20" - "9d036a209e036a209f036a20a0036a20a1036a20a2036a20a3036a20a4036a20a5036a20a6036a20a7036a20a8036a" - "20a9036a20aa036a20ab" - "036a20ac036a20ad036a20ae036a20af036a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a20" - "b7036a20b8036a20b903" - "6a20ba036a20bb036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20c5" - "036a20c6036a20c7036a" - "20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d2036a20d303" - "6a20d4036a20d5036a20" - "d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de036a20df036a20e0036a20e1036a" - "20e2036a20e3036a20e4" - "036a20e5036a20e6036a20e7036a20e8036a20e9036a20ea036a20eb036a20ec036a20ed036a20ee036a20ef036a20" - "f0036a20f1036a20f203" - "6a20f3036a20f4036a20f5036a20f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20fe" - "036a20ff036a2080046a" - "2081046a2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c04" - "6a208d046a208e046a20" - "8f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a2099046a209a046a" - "209b046a209c046a209d" - "046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a20a5046a20a6046a20a7046a20a8046a20" - "a9046a20aa046a20ab04" - "6a20ac046a20ad046a20ae046a20af046a20b0046a20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20b7" - "046a20b8046a20b9046a" - "20ba046a20bb046a20bc046a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c504" - "6a20c6046a20c7046a20" - "c8046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d3046a" - "20d4046a20d5046a20d6" - "046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df046a20e0046a20e1046a20" - "e2046a20e3046a20e404" - "6a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb046a20ec046a20ed046a20ee046a20ef046a20f0" - "046a20f1046a20f2046a" - "20f3046a20f4046a20f5046a20f6046a20f7046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe04" - "6a20ff046a2080056a20" - "81056a2082056a2083056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c056a" - "208d056a208e056a208f" - "056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a056a20" - "9b056a209c056a209d05" - "6a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20a6056a20a7056a20a8056a20a9" - "056a20aa056a20ab056a" - "20ac056a20ad056a20ae056a20af056a20b0056a20b1056a20b2056a20b3056a20b4056a20b5056a20b6056a20b705" - "6a20b8056a20b9056a20" - "ba056a20bb056a20bc056a20bd056a20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c5056a" - "20c6056a20c7056a20c8" - "056a20c9056a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a20" - "d4056a20d5056a20d605" - "6a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a20e1056a20e2" - "056a20e3056a20e4056a" - "20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec056a20ed056a20ee056a20ef056a20f005" - "6a20f1056a20f2056a20" - "f3056a20f4056a20f5056a20f6056a20f7056a20f8056a20f9056a20fa056a20fb056a20fc056a20fd056a20fe056a" - "20ff056a2080066a2081" - "066a2082066a2083066a2084066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a20" - "8d066a208e066a208f06" - "6a2090066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a209b" - "066a209c066a209d066a" - "209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a7066a20a8066a20a906" - "6a20aa066a20ab066a20" - "ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20b3066a20b4066a20b5066a20b6066a20b7066a" - "20b8066a20b9066a20ba" - "066a20bb066a20bc066a20bd066a20be066a20bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a20" - "c6066a20c7066a20c806" - "6a20c9066a20ca066a20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20d4" - "066a20d5066a20d6066a" - "20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20e206" - "6a20e3066a20e4066a20" - "e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a20ee066a20ef066a20f0066a" - "20f1066a20f2066a20f3" - "066a20f4066a20f5066a20f6066a20f7066a20f8066a20f9066a20fa066a20fb066a20fc066a20fd066a20fe066a20" - "ff066a2080076a208107" - "6a2082076a2083076a2084076a2085076a2086076a2087076a2088076a2089076a208a076a208b076a208c076a208d" - "076a208e076a208f076a" - "2090076a2091076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b07" - "6a209c076a209d076a20" - "9e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a8076a20a9076a" - "20aa076a20ab076a20ac" - "076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b4076a20b5076a20b6076a20b7076a20" - "b8076a20b9076a20ba07" - "6a20bb076a20bc076a20bd076a20be076a20bf076a20c0076a20c1076a20c2076a20c3076a20c4076a20c5076a20c6" - "076a20c7076a20c8076a" - "20c9076a20ca076a20cb076a20cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d407" - "6a20d5076a20d6076a20" - "d7076a20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e2076a" - "20e3076a20e4076a20e5" - "076a20e6076a20e7076a0b007f0970726f647563657273010c70726f6365737365642d62790105636c616e675f3139" - "2e312e352d776173692d" - "73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a656374206162346235" - "61326462353832393538" - "616631656533303861373930636664623432626432343732302900490f7461726765745f6665617475726573042b0f" - "6d757461626c652d676c" - "6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; + "036a208d036a208e036a208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a20" + "98036a2099036a209a036a209b036a209c036a209d036a209e036a209f036a20a0036a20a1036a20a2036a20a3036a" + "20a4036a20a5036a20a6036a20a7036a20a8036a20a9036a20aa036a20ab036a20ac036a20ad036a20ae036a20af03" + "6a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a20b7036a20b8036a20b9036a20ba036a20bb" + "036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20c5036a20c6036a20" + "c7036a20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d2036a" + "20d3036a20d4036a20d5036a20d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de03" + "6a20df036a20e0036a20e1036a20e2036a20e3036a20e4036a20e5036a20e6036a20e7036a20e8036a20e9036a20ea" + "036a20eb036a20ec036a20ed036a20ee036a20ef036a20f0036a20f1036a20f2036a20f3036a20f4036a20f5036a20" + "f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20fe036a20ff036a2080046a2081046a" + "2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c046a208d04" + "6a208e046a208f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a2099" + "046a209a046a209b046a209c046a209d046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a20" + "a5046a20a6046a20a7046a20a8046a20a9046a20aa046a20ab046a20ac046a20ad046a20ae046a20af046a20b0046a" + "20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20b7046a20b8046a20b9046a20ba046a20bb046a20bc04" + "6a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c5046a20c6046a20c7046a20c8" + "046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d3046a20" + "d4046a20d5046a20d6046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df046a" + "20e0046a20e1046a20e2046a20e3046a20e4046a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb04" + "6a20ec046a20ed046a20ee046a20ef046a20f0046a20f1046a20f2046a20f3046a20f4046a20f5046a20f6046a20f7" + "046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe046a20ff046a2080056a2081056a2082056a20" + "83056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c056a208d056a208e056a" + "208f056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a05" + "6a209b056a209c056a209d056a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20a6" + "056a20a7056a20a8056a20a9056a20aa056a20ab056a20ac056a20ad056a20ae056a20af056a20b0056a20b1056a20" + "b2056a20b3056a20b4056a20b5056a20b6056a20b7056a20b8056a20b9056a20ba056a20bb056a20bc056a20bd056a" + "20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c5056a20c6056a20c7056a20c8056a20c905" + "6a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a20d4056a20d5" + "056a20d6056a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a20" + "e1056a20e2056a20e3056a20e4056a20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec056a" + "20ed056a20ee056a20ef056a20f0056a20f1056a20f2056a20f3056a20f4056a20f5056a20f6056a20f7056a20f805" + "6a20f9056a20fa056a20fb056a20fc056a20fd056a20fe056a20ff056a2080066a2081066a2082066a2083066a2084" + "066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a208d066a208e066a208f066a20" + "90066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a209b066a" + "209c066a209d066a209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a706" + "6a20a8066a20a9066a20aa066a20ab066a20ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20b3" + "066a20b4066a20b5066a20b6066a20b7066a20b8066a20b9066a20ba066a20bb066a20bc066a20bd066a20be066a20" + "bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a20c6066a20c7066a20c8066a20c9066a20ca066a" + "20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20d4066a20d5066a20d606" + "6a20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20e2" + "066a20e3066a20e4066a20e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a20" + "ee066a20ef066a20f0066a20f1066a20f2066a20f3066a20f4066a20f5066a20f6066a20f7066a20f8066a20f9066a" + "20fa066a20fb066a20fc066a20fd066a20fe066a20ff066a2080076a2081076a2082076a2083076a2084076a208507" + "6a2086076a2087076a2088076a2089076a208a076a208b076a208c076a208d076a208e076a208f076a2090076a2091" + "076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b076a209c076a20" + "9d076a209e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a8076a" + "20a9076a20aa076a20ab076a20ac076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b407" + "6a20b5076a20b6076a20b7076a20b8076a20b9076a20ba076a20bb076a20bc076a20bd076a20be076a20bf076a20c0" + "076a20c1076a20c2076a20c3076a20c4076a20c5076a20c6076a20c7076a20c8076a20c9076a20ca076a20cb076a20" + "cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d4076a20d5076a20d6076a20d7076a" + "20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e2076a20e307" + "6a20e4076a20e5076a20e6076a20e7076a0b007f0970726f647563657273010c70726f6365737365642d6279010563" + "6c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c" + "6c766d2d70726f6a656374206162346235613264623538323935386166316565333038613739306366646234326264" + "32343732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c732b08736967" + "6e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const thousand1ParamsHex = "0061736d0100000001f2070260000060e9077f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f7f7f7f7f7f7f7f" "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" - "7f7f7f017f0303020001" - "05030100020638097f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f" - "00418080080b7f004100" - "0b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730000047465737400010c" - "5f5f64736f5f68616e64" - "6c6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f737461636b5f6869676803030d" - "5f5f676c6f62616c5f62" - "61736503040b5f5f686561705f6261736503050a5f5f686561705f656e6403060d5f5f6d656d6f72795f6261736503" - "070c5f5f7461626c655f" - "6261736503080aab1e0202000ba51e00200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a" - "6a200b6a200c6a200d6a" - "200e6a200f6a20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d" - "6a201e6a201f6a20206a" - "20216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a202f6a2030" - "6a20316a20326a20336a" - "20346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e6a203f6a20406a20416a20426a2043" - "6a20446a20456a20466a" - "20476a20486a20496a204a6a204b6a204c6a204d6a204e6a204f6a20506a20516a20526a20536a20546a20556a2056" - "6a20576a20586a20596a" - "205a6a205b6a205c6a205d6a205e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a2069" - "6a206a6a206b6a206c6a" - "206d6a206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c" - "6a207d6a207e6a207f6a" - "2080016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a2089016a208a016a208b01" - "6a208c016a208d016a20" - "8e016a208f016a2090016a2091016a2092016a2093016a2094016a2095016a2096016a2097016a2098016a2099016a" - "209a016a209b016a209c" - "016a209d016a209e016a209f016a20a0016a20a1016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20" - "a8016a20a9016a20aa01" - "6a20ab016a20ac016a20ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b6" - "016a20b7016a20b8016a" - "20b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c401" - "6a20c5016a20c6016a20" - "c7016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20d0016a20d1016a20d2016a" - "20d3016a20d4016a20d5" - "016a20d6016a20d7016a20d8016a20d9016a20da016a20db016a20dc016a20dd016a20de016a20df016a20e0016a20" - "e1016a20e2016a20e301" - "6a20e4016a20e5016a20e6016a20e7016a20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef" - "016a20f0016a20f1016a" - "20f2016a20f3016a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd01" - "6a20fe016a20ff016a20" - "80026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a208b026a" - "208c026a208d026a208e" - "026a208f026a2090026a2091026a2092026a2093026a2094026a2095026a2096026a2097026a2098026a2099026a20" - "9a026a209b026a209c02" - "6a209d026a209e026a209f026a20a0026a20a1026a20a2026a20a3026a20a4026a20a5026a20a6026a20a7026a20a8" - "026a20a9026a20aa026a" - "20ab026a20ac026a20ad026a20ae026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b602" - "6a20b7026a20b8026a20" - "b9026a20ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a" - "20c5026a20c6026a20c7" - "026a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d1026a20d2026a20" - "d3026a20d4026a20d502" - "6a20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20dd026a20de026a20df026a20e0026a20e1" - "026a20e2026a20e3026a" - "20e4026a20e5026a20e6026a20e7026a20e8026a20e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef02" - "6a20f0026a20f1026a20" - "f2026a20f3026a20f4026a20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a" - "20fe026a20ff026a2080" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f" + "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f017f03030200010503010002063809" + "7f004180080b7f004180080b7f004180080b7f00418088040b7f004180080b7f00418088040b7f00418080080b7f00" + "41000b7f0041010b07a8010c066d656d6f72790200115f5f7761736d5f63616c6c5f63746f72730000047465737400" + "010c5f5f64736f5f68616e646c6503000a5f5f646174615f656e6403010b5f5f737461636b5f6c6f7703020c5f5f73" + "7461636b5f6869676803030d5f5f676c6f62616c5f6261736503040b5f5f686561705f6261736503050a5f5f686561" + "705f656e6403060d5f5f6d656d6f72795f6261736503070c5f5f7461626c655f6261736503080aab1e0202000ba51e" + "00200020016a20026a20036a20046a20056a20066a20076a20086a20096a200a6a200b6a200c6a200d6a200e6a200f" + "6a20106a20116a20126a20136a20146a20156a20166a20176a20186a20196a201a6a201b6a201c6a201d6a201e6a20" + "1f6a20206a20216a20226a20236a20246a20256a20266a20276a20286a20296a202a6a202b6a202c6a202d6a202e6a" + "202f6a20306a20316a20326a20336a20346a20356a20366a20376a20386a20396a203a6a203b6a203c6a203d6a203e" + "6a203f6a20406a20416a20426a20436a20446a20456a20466a20476a20486a20496a204a6a204b6a204c6a204d6a20" + "4e6a204f6a20506a20516a20526a20536a20546a20556a20566a20576a20586a20596a205a6a205b6a205c6a205d6a" + "205e6a205f6a20606a20616a20626a20636a20646a20656a20666a20676a20686a20696a206a6a206b6a206c6a206d" + "6a206e6a206f6a20706a20716a20726a20736a20746a20756a20766a20776a20786a20796a207a6a207b6a207c6a20" + "7d6a207e6a207f6a2080016a2081016a2082016a2083016a2084016a2085016a2086016a2087016a2088016a208901" + "6a208a016a208b016a208c016a208d016a208e016a208f016a2090016a2091016a2092016a2093016a2094016a2095" + "016a2096016a2097016a2098016a2099016a209a016a209b016a209c016a209d016a209e016a209f016a20a0016a20" + "a1016a20a2016a20a3016a20a4016a20a5016a20a6016a20a7016a20a8016a20a9016a20aa016a20ab016a20ac016a" + "20ad016a20ae016a20af016a20b0016a20b1016a20b2016a20b3016a20b4016a20b5016a20b6016a20b7016a20b801" + "6a20b9016a20ba016a20bb016a20bc016a20bd016a20be016a20bf016a20c0016a20c1016a20c2016a20c3016a20c4" + "016a20c5016a20c6016a20c7016a20c8016a20c9016a20ca016a20cb016a20cc016a20cd016a20ce016a20cf016a20" + "d0016a20d1016a20d2016a20d3016a20d4016a20d5016a20d6016a20d7016a20d8016a20d9016a20da016a20db016a" + "20dc016a20dd016a20de016a20df016a20e0016a20e1016a20e2016a20e3016a20e4016a20e5016a20e6016a20e701" + "6a20e8016a20e9016a20ea016a20eb016a20ec016a20ed016a20ee016a20ef016a20f0016a20f1016a20f2016a20f3" + "016a20f4016a20f5016a20f6016a20f7016a20f8016a20f9016a20fa016a20fb016a20fc016a20fd016a20fe016a20" + "ff016a2080026a2081026a2082026a2083026a2084026a2085026a2086026a2087026a2088026a2089026a208a026a" + "208b026a208c026a208d026a208e026a208f026a2090026a2091026a2092026a2093026a2094026a2095026a209602" + "6a2097026a2098026a2099026a209a026a209b026a209c026a209d026a209e026a209f026a20a0026a20a1026a20a2" + "026a20a3026a20a4026a20a5026a20a6026a20a7026a20a8026a20a9026a20aa026a20ab026a20ac026a20ad026a20" + "ae026a20af026a20b0026a20b1026a20b2026a20b3026a20b4026a20b5026a20b6026a20b7026a20b8026a20b9026a" + "20ba026a20bb026a20bc026a20bd026a20be026a20bf026a20c0026a20c1026a20c2026a20c3026a20c4026a20c502" + "6a20c6026a20c7026a20c8026a20c9026a20ca026a20cb026a20cc026a20cd026a20ce026a20cf026a20d0026a20d1" + "026a20d2026a20d3026a20d4026a20d5026a20d6026a20d7026a20d8026a20d9026a20da026a20db026a20dc026a20" + "dd026a20de026a20df026a20e0026a20e1026a20e2026a20e3026a20e4026a20e5026a20e6026a20e7026a20e8026a" + "20e9026a20ea026a20eb026a20ec026a20ed026a20ee026a20ef026a20f0026a20f1026a20f2026a20f3026a20f402" + "6a20f5026a20f6026a20f7026a20f8026a20f9026a20fa026a20fb026a20fc026a20fd026a20fe026a20ff026a2080" "036a2081036a2082036a2083036a2084036a2085036a2086036a2087036a2088036a2089036a208a036a208b036a20" - "8c036a208d036a208e03" - "6a208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a2098036a2099036a209a" - "036a209b036a209c036a" - "209d036a209e036a209f036a20a0036a20a1036a20a2036a20a3036a20a4036a20a5036a20a6036a20a7036a20a803" - "6a20a9036a20aa036a20" - "ab036a20ac036a20ad036a20ae036a20af036a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a" - "20b7036a20b8036a20b9" - "036a20ba036a20bb036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20" - "c5036a20c6036a20c703" - "6a20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d2036a20d3" - "036a20d4036a20d5036a" - "20d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de036a20df036a20e0036a20e103" - "6a20e2036a20e3036a20" - "e4036a20e5036a20e6036a20e7036a20e8036a20e9036a20ea036a20eb036a20ec036a20ed036a20ee036a20ef036a" - "20f0036a20f1036a20f2" - "036a20f3036a20f4036a20f5036a20f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20" - "fe036a20ff036a208004" - "6a2081046a2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c" - "046a208d046a208e046a" - "208f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a2099046a209a04" - "6a209b046a209c046a20" - "9d046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a20a5046a20a6046a20a7046a20a8046a" - "20a9046a20aa046a20ab" - "046a20ac046a20ad046a20ae046a20af046a20b0046a20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20" - "b7046a20b8046a20b904" - "6a20ba046a20bb046a20bc046a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c5" - "046a20c6046a20c7046a" - "20c8046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d304" - "6a20d4046a20d5046a20" - "d6046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df046a20e0046a20e1046a" - "20e2046a20e3046a20e4" - "046a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb046a20ec046a20ed046a20ee046a20ef046a20" - "f0046a20f1046a20f204" - "6a20f3046a20f4046a20f5046a20f6046a20f7046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe" - "046a20ff046a2080056a" - "2081056a2082056a2083056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c05" - "6a208d056a208e056a20" - "8f056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a056a" - "209b056a209c056a209d" - "056a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20a6056a20a7056a20a8056a20" - "a9056a20aa056a20ab05" - "6a20ac056a20ad056a20ae056a20af056a20b0056a20b1056a20b2056a20b3056a20b4056a20b5056a20b6056a20b7" - "056a20b8056a20b9056a" - "20ba056a20bb056a20bc056a20bd056a20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c505" - "6a20c6056a20c7056a20" - "c8056a20c9056a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a" - "20d4056a20d5056a20d6" - "056a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a20e1056a20" - "e2056a20e3056a20e405" - "6a20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec056a20ed056a20ee056a20ef056a20f0" - "056a20f1056a20f2056a" - "20f3056a20f4056a20f5056a20f6056a20f7056a20f8056a20f9056a20fa056a20fb056a20fc056a20fd056a20fe05" - "6a20ff056a2080066a20" - "81066a2082066a2083066a2084066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a" - "208d066a208e066a208f" - "066a2090066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a20" - "9b066a209c066a209d06" - "6a209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a7066a20a8066a20a9" - "066a20aa066a20ab066a" - "20ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20b3066a20b4066a20b5066a20b6066a20b706" - "6a20b8066a20b9066a20" - "ba066a20bb066a20bc066a20bd066a20be066a20bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a" - "20c6066a20c7066a20c8" - "066a20c9066a20ca066a20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20" - "d4066a20d5066a20d606" - "6a20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20e2" - "066a20e3066a20e4066a" - "20e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a20ee066a20ef066a20f006" - "6a20f1066a20f2066a20" - "f3066a20f4066a20f5066a20f6066a20f7066a20f8066a20f9066a20fa066a20fb066a20fc066a20fd066a20fe066a" - "20ff066a2080076a2081" - "076a2082076a2083076a2084076a2085076a2086076a2087076a2088076a2089076a208a076a208b076a208c076a20" - "8d076a208e076a208f07" - "6a2090076a2091076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b" - "076a209c076a209d076a" - "209e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a8076a20a907" - "6a20aa076a20ab076a20" - "ac076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b4076a20b5076a20b6076a20b7076a" - "20b8076a20b9076a20ba" - "076a20bb076a20bc076a20bd076a20be076a20bf076a20c0076a20c1076a20c2076a20c3076a20c4076a20c5076a20" - "c6076a20c7076a20c807" - "6a20c9076a20ca076a20cb076a20cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d4" - "076a20d5076a20d6076a" - "20d7076a20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e207" - "6a20e3076a20e4076a20" - "e5076a20e6076a20e7076a20e8076a0b007f0970726f647563657273010c70726f6365737365642d62790105636c61" - "6e675f31392e312e352d" - "776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c6c766d2f6c6c766d2d70726f6a65637420" - "61623462356132646235" - "3832393538616631656533303861373930636664623432626432343732302900490f7461726765745f666561747572" - "6573042b0f6d75746162" - "6c652d676c6f62616c732b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c" - "7565"; + "8c036a208d036a208e036a208f036a2090036a2091036a2092036a2093036a2094036a2095036a2096036a2097036a" + "2098036a2099036a209a036a209b036a209c036a209d036a209e036a209f036a20a0036a20a1036a20a2036a20a303" + "6a20a4036a20a5036a20a6036a20a7036a20a8036a20a9036a20aa036a20ab036a20ac036a20ad036a20ae036a20af" + "036a20b0036a20b1036a20b2036a20b3036a20b4036a20b5036a20b6036a20b7036a20b8036a20b9036a20ba036a20" + "bb036a20bc036a20bd036a20be036a20bf036a20c0036a20c1036a20c2036a20c3036a20c4036a20c5036a20c6036a" + "20c7036a20c8036a20c9036a20ca036a20cb036a20cc036a20cd036a20ce036a20cf036a20d0036a20d1036a20d203" + "6a20d3036a20d4036a20d5036a20d6036a20d7036a20d8036a20d9036a20da036a20db036a20dc036a20dd036a20de" + "036a20df036a20e0036a20e1036a20e2036a20e3036a20e4036a20e5036a20e6036a20e7036a20e8036a20e9036a20" + "ea036a20eb036a20ec036a20ed036a20ee036a20ef036a20f0036a20f1036a20f2036a20f3036a20f4036a20f5036a" + "20f6036a20f7036a20f8036a20f9036a20fa036a20fb036a20fc036a20fd036a20fe036a20ff036a2080046a208104" + "6a2082046a2083046a2084046a2085046a2086046a2087046a2088046a2089046a208a046a208b046a208c046a208d" + "046a208e046a208f046a2090046a2091046a2092046a2093046a2094046a2095046a2096046a2097046a2098046a20" + "99046a209a046a209b046a209c046a209d046a209e046a209f046a20a0046a20a1046a20a2046a20a3046a20a4046a" + "20a5046a20a6046a20a7046a20a8046a20a9046a20aa046a20ab046a20ac046a20ad046a20ae046a20af046a20b004" + "6a20b1046a20b2046a20b3046a20b4046a20b5046a20b6046a20b7046a20b8046a20b9046a20ba046a20bb046a20bc" + "046a20bd046a20be046a20bf046a20c0046a20c1046a20c2046a20c3046a20c4046a20c5046a20c6046a20c7046a20" + "c8046a20c9046a20ca046a20cb046a20cc046a20cd046a20ce046a20cf046a20d0046a20d1046a20d2046a20d3046a" + "20d4046a20d5046a20d6046a20d7046a20d8046a20d9046a20da046a20db046a20dc046a20dd046a20de046a20df04" + "6a20e0046a20e1046a20e2046a20e3046a20e4046a20e5046a20e6046a20e7046a20e8046a20e9046a20ea046a20eb" + "046a20ec046a20ed046a20ee046a20ef046a20f0046a20f1046a20f2046a20f3046a20f4046a20f5046a20f6046a20" + "f7046a20f8046a20f9046a20fa046a20fb046a20fc046a20fd046a20fe046a20ff046a2080056a2081056a2082056a" + "2083056a2084056a2085056a2086056a2087056a2088056a2089056a208a056a208b056a208c056a208d056a208e05" + "6a208f056a2090056a2091056a2092056a2093056a2094056a2095056a2096056a2097056a2098056a2099056a209a" + "056a209b056a209c056a209d056a209e056a209f056a20a0056a20a1056a20a2056a20a3056a20a4056a20a5056a20" + "a6056a20a7056a20a8056a20a9056a20aa056a20ab056a20ac056a20ad056a20ae056a20af056a20b0056a20b1056a" + "20b2056a20b3056a20b4056a20b5056a20b6056a20b7056a20b8056a20b9056a20ba056a20bb056a20bc056a20bd05" + "6a20be056a20bf056a20c0056a20c1056a20c2056a20c3056a20c4056a20c5056a20c6056a20c7056a20c8056a20c9" + "056a20ca056a20cb056a20cc056a20cd056a20ce056a20cf056a20d0056a20d1056a20d2056a20d3056a20d4056a20" + "d5056a20d6056a20d7056a20d8056a20d9056a20da056a20db056a20dc056a20dd056a20de056a20df056a20e0056a" + "20e1056a20e2056a20e3056a20e4056a20e5056a20e6056a20e7056a20e8056a20e9056a20ea056a20eb056a20ec05" + "6a20ed056a20ee056a20ef056a20f0056a20f1056a20f2056a20f3056a20f4056a20f5056a20f6056a20f7056a20f8" + "056a20f9056a20fa056a20fb056a20fc056a20fd056a20fe056a20ff056a2080066a2081066a2082066a2083066a20" + "84066a2085066a2086066a2087066a2088066a2089066a208a066a208b066a208c066a208d066a208e066a208f066a" + "2090066a2091066a2092066a2093066a2094066a2095066a2096066a2097066a2098066a2099066a209a066a209b06" + "6a209c066a209d066a209e066a209f066a20a0066a20a1066a20a2066a20a3066a20a4066a20a5066a20a6066a20a7" + "066a20a8066a20a9066a20aa066a20ab066a20ac066a20ad066a20ae066a20af066a20b0066a20b1066a20b2066a20" + "b3066a20b4066a20b5066a20b6066a20b7066a20b8066a20b9066a20ba066a20bb066a20bc066a20bd066a20be066a" + "20bf066a20c0066a20c1066a20c2066a20c3066a20c4066a20c5066a20c6066a20c7066a20c8066a20c9066a20ca06" + "6a20cb066a20cc066a20cd066a20ce066a20cf066a20d0066a20d1066a20d2066a20d3066a20d4066a20d5066a20d6" + "066a20d7066a20d8066a20d9066a20da066a20db066a20dc066a20dd066a20de066a20df066a20e0066a20e1066a20" + "e2066a20e3066a20e4066a20e5066a20e6066a20e7066a20e8066a20e9066a20ea066a20eb066a20ec066a20ed066a" + "20ee066a20ef066a20f0066a20f1066a20f2066a20f3066a20f4066a20f5066a20f6066a20f7066a20f8066a20f906" + "6a20fa066a20fb066a20fc066a20fd066a20fe066a20ff066a2080076a2081076a2082076a2083076a2084076a2085" + "076a2086076a2087076a2088076a2089076a208a076a208b076a208c076a208d076a208e076a208f076a2090076a20" + "91076a2092076a2093076a2094076a2095076a2096076a2097076a2098076a2099076a209a076a209b076a209c076a" + "209d076a209e076a209f076a20a0076a20a1076a20a2076a20a3076a20a4076a20a5076a20a6076a20a7076a20a807" + "6a20a9076a20aa076a20ab076a20ac076a20ad076a20ae076a20af076a20b0076a20b1076a20b2076a20b3076a20b4" + "076a20b5076a20b6076a20b7076a20b8076a20b9076a20ba076a20bb076a20bc076a20bd076a20be076a20bf076a20" + "c0076a20c1076a20c2076a20c3076a20c4076a20c5076a20c6076a20c7076a20c8076a20c9076a20ca076a20cb076a" + "20cc076a20cd076a20ce076a20cf076a20d0076a20d1076a20d2076a20d3076a20d4076a20d5076a20d6076a20d707" + "6a20d8076a20d9076a20da076a20db076a20dc076a20dd076a20de076a20df076a20e0076a20e1076a20e2076a20e3" + "076a20e4076a20e5076a20e6076a20e7076a20e8076a0b007f0970726f647563657273010c70726f6365737365642d" + "62790105636c616e675f31392e312e352d776173692d73646b202868747470733a2f2f6769746875622e636f6d2f6c" + "6c766d2f6c6c766d2d70726f6a65637420616234623561326462353832393538616631656533303861373930636664" + "623432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" + "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; extern std::string const locals10kHex = "0061736d0100000001070160027f7f017f03020100070801047465737400000a9b8a0601978a06018e4e7f20002001" - "6a2102200120026a2103" - "200220036a2104200320046a2105200420056a2106200520066a2107200620076a2108200720086a2109200820096a" - "210a2009200a6a210b20" - "0a200b6a210c200b200c6a210d200c200d6a210e200d200e6a210f200e200f6a2110200f20106a2111201020116a21" - "12201120126a21132012" - "20136a2114201320146a2115201420156a2116201520166a2117201620176a2118201720186a2119201820196a211a" - "2019201a6a211b201a20" - "1b6a211c201b201c6a211d201c201d6a211e201d201e6a211f201e201f6a2120201f20206a2121202020216a212220" - "2120226a212320222023" - "6a2124202320246a2125202420256a2126202520266a2127202620276a2128202720286a2129202820296a212a2029" - "202a6a212b202a202b6a" - "212c202b202c6a212d202c202d6a212e202d202e6a212f202e202f6a2130202f20306a2131203020316a2132203120" - "326a2133203220336a21" - "34203320346a2135203420356a2136203520366a2137203620376a2138203720386a2139203820396a213a2039203a" - "6a213b203a203b6a213c" - "203b203c6a213d203c203d6a213e203d203e6a213f203e203f6a2140203f20406a2141204020416a2142204120426a" - "2143204220436a214420" - "4320446a2145204420456a2146204520466a2147204620476a2148204720486a2149204820496a214a2049204a6a21" - "4b204a204b6a214c204b" - "204c6a214d204c204d6a214e204d204e6a214f204e204f6a2150204f20506a2151205020516a2152205120526a2153" - "205220536a2154205320" - "546a2155205420556a2156205520566a2157205620576a2158205720586a2159205820596a215a2059205a6a215b20" - "5a205b6a215c205b205c" - "6a215d205c205d6a215e205d205e6a215f205e205f6a2160205f20606a2161206020616a2162206120626a21632062" - "20636a2164206320646a" - "2165206420656a2166206520666a2167206620676a2168206720686a2169206820696a216a2069206a6a216b206a20" - "6b6a216c206b206c6a21" - "6d206c206d6a216e206d206e6a216f206e206f6a2170206f20706a2171207020716a2172207120726a217320722073" - "6a2174207320746a2175" - "207420756a2176207520766a2177207620776a2178207720786a2179207820796a217a2079207a6a217b207a207b6a" - "217c207b207c6a217d20" - "7c207d6a217e207d207e6a217f207e207f6a218001207f2080016a2181012080012081016a2182012081012082016a" - "2183012082012083016a" - "2184012083012084016a2185012084012085016a2186012085012086016a2187012086012087016a21880120870120" - "88016a21890120880120" - "89016a218a01208901208a016a218b01208a01208b016a218c01208b01208c016a218d01208c01208d016a218e0120" - "8d01208e016a218f0120" - "8e01208f016a219001208f012090016a2191012090012091016a2192012091012092016a2193012092012093016a21" - "94012093012094016a21" - "95012094012095016a2196012095012096016a2197012096012097016a2198012097012098016a2199012098012099" - "016a219a01209901209a" - "016a219b01209a01209b016a219c01209b01209c016a219d01209c01209d016a219e01209d01209e016a219f01209e" - "01209f016a21a001209f" - "0120a0016a21a10120a00120a1016a21a20120a10120a2016a21a30120a20120a3016a21a40120a30120a4016a21a5" - "0120a40120a5016a21a6" - "0120a50120a6016a21a70120a60120a7016a21a80120a70120a8016a21a90120a80120a9016a21aa0120a90120aa01" - "6a21ab0120aa0120ab01" - "6a21ac0120ab0120ac016a21ad0120ac0120ad016a21ae0120ad0120ae016a21af0120ae0120af016a21b00120af01" - "20b0016a21b10120b001" - "20b1016a21b20120b10120b2016a21b30120b20120b3016a21b40120b30120b4016a21b50120b40120b5016a21b601" - "20b50120b6016a21b701" - "20b60120b7016a21b80120b70120b8016a21b90120b80120b9016a21ba0120b90120ba016a21bb0120ba0120bb016a" - "21bc0120bb0120bc016a" - "21bd0120bc0120bd016a21be0120bd0120be016a21bf0120be0120bf016a21c00120bf0120c0016a21c10120c00120" - "c1016a21c20120c10120" - "c2016a21c30120c20120c3016a21c40120c30120c4016a21c50120c40120c5016a21c60120c50120c6016a21c70120" - "c60120c7016a21c80120" - "c70120c8016a21c90120c80120c9016a21ca0120c90120ca016a21cb0120ca0120cb016a21cc0120cb0120cc016a21" - "cd0120cc0120cd016a21" - "ce0120cd0120ce016a21cf0120ce0120cf016a21d00120cf0120d0016a21d10120d00120d1016a21d20120d10120d2" - "016a21d30120d20120d3" - "016a21d40120d30120d4016a21d50120d40120d5016a21d60120d50120d6016a21d70120d60120d7016a21d80120d7" - "0120d8016a21d90120d8" - "0120d9016a21da0120d90120da016a21db0120da0120db016a21dc0120db0120dc016a21dd0120dc0120dd016a21de" - "0120dd0120de016a21df" - "0120de0120df016a21e00120df0120e0016a21e10120e00120e1016a21e20120e10120e2016a21e30120e20120e301" - "6a21e40120e30120e401" - "6a21e50120e40120e5016a21e60120e50120e6016a21e70120e60120e7016a21e80120e70120e8016a21e90120e801" - "20e9016a21ea0120e901" - "20ea016a21eb0120ea0120eb016a21ec0120eb0120ec016a21ed0120ec0120ed016a21ee0120ed0120ee016a21ef01" - "20ee0120ef016a21f001" - "20ef0120f0016a21f10120f00120f1016a21f20120f10120f2016a21f30120f20120f3016a21f40120f30120f4016a" - "21f50120f40120f5016a" - "21f60120f50120f6016a21f70120f60120f7016a21f80120f70120f8016a21f90120f80120f9016a21fa0120f90120" - "fa016a21fb0120fa0120" - "fb016a21fc0120fb0120fc016a21fd0120fc0120fd016a21fe0120fd0120fe016a21ff0120fe0120ff016a21800220" - "ff012080026a21810220" - "80022081026a2182022081022082026a2183022082022083026a2184022083022084026a2185022084022085026a21" - "86022085022086026a21" - "87022086022087026a2188022087022088026a2189022088022089026a218a02208902208a026a218b02208a02208b" - "026a218c02208b02208c" - "026a218d02208c02208d026a218e02208d02208e026a218f02208e02208f026a219002208f022090026a2191022090" - "022091026a2192022091" - "022092026a2193022092022093026a2194022093022094026a2195022094022095026a2196022095022096026a2197" - "022096022097026a2198" - "022097022098026a2199022098022099026a219a02209902209a026a219b02209a02209b026a219c02209b02209c02" - "6a219d02209c02209d02" - "6a219e02209d02209e026a219f02209e02209f026a21a002209f0220a0026a21a10220a00220a1026a21a20220a102" - "20a2026a21a30220a202" - "20a3026a21a40220a30220a4026a21a50220a40220a5026a21a60220a50220a6026a21a70220a60220a7026a21a802" - "20a70220a8026a21a902" - "20a80220a9026a21aa0220a90220aa026a21ab0220aa0220ab026a21ac0220ab0220ac026a21ad0220ac0220ad026a" - "21ae0220ad0220ae026a" + "6a2102200120026a2103200220036a2104200320046a2105200420056a2106200520066a2107200620076a21082007" + "20086a2109200820096a210a2009200a6a210b200a200b6a210c200b200c6a210d200c200d6a210e200d200e6a210f" + "200e200f6a2110200f20106a2111201020116a2112201120126a2113201220136a2114201320146a2115201420156a" + "2116201520166a2117201620176a2118201720186a2119201820196a211a2019201a6a211b201a201b6a211c201b20" + "1c6a211d201c201d6a211e201d201e6a211f201e201f6a2120201f20206a2121202020216a2122202120226a212320" + "2220236a2124202320246a2125202420256a2126202520266a2127202620276a2128202720286a2129202820296a21" + "2a2029202a6a212b202a202b6a212c202b202c6a212d202c202d6a212e202d202e6a212f202e202f6a2130202f2030" + "6a2131203020316a2132203120326a2133203220336a2134203320346a2135203420356a2136203520366a21372036" + "20376a2138203720386a2139203820396a213a2039203a6a213b203a203b6a213c203b203c6a213d203c203d6a213e" + "203d203e6a213f203e203f6a2140203f20406a2141204020416a2142204120426a2143204220436a2144204320446a" + "2145204420456a2146204520466a2147204620476a2148204720486a2149204820496a214a2049204a6a214b204a20" + "4b6a214c204b204c6a214d204c204d6a214e204d204e6a214f204e204f6a2150204f20506a2151205020516a215220" + "5120526a2153205220536a2154205320546a2155205420556a2156205520566a2157205620576a2158205720586a21" + "59205820596a215a2059205a6a215b205a205b6a215c205b205c6a215d205c205d6a215e205d205e6a215f205e205f" + "6a2160205f20606a2161206020616a2162206120626a2163206220636a2164206320646a2165206420656a21662065" + "20666a2167206620676a2168206720686a2169206820696a216a2069206a6a216b206a206b6a216c206b206c6a216d" + "206c206d6a216e206d206e6a216f206e206f6a2170206f20706a2171207020716a2172207120726a2173207220736a" + "2174207320746a2175207420756a2176207520766a2177207620776a2178207720786a2179207820796a217a207920" + "7a6a217b207a207b6a217c207b207c6a217d207c207d6a217e207d207e6a217f207e207f6a218001207f2080016a21" + "81012080012081016a2182012081012082016a2183012082012083016a2184012083012084016a2185012084012085" + "016a2186012085012086016a2187012086012087016a2188012087012088016a2189012088012089016a218a012089" + "01208a016a218b01208a01208b016a218c01208b01208c016a218d01208c01208d016a218e01208d01208e016a218f" + "01208e01208f016a219001208f012090016a2191012090012091016a2192012091012092016a219301209201209301" + "6a2194012093012094016a2195012094012095016a2196012095012096016a2197012096012097016a219801209701" + "2098016a2199012098012099016a219a01209901209a016a219b01209a01209b016a219c01209b01209c016a219d01" + "209c01209d016a219e01209d01209e016a219f01209e01209f016a21a001209f0120a0016a21a10120a00120a1016a" + "21a20120a10120a2016a21a30120a20120a3016a21a40120a30120a4016a21a50120a40120a5016a21a60120a50120" + "a6016a21a70120a60120a7016a21a80120a70120a8016a21a90120a80120a9016a21aa0120a90120aa016a21ab0120" + "aa0120ab016a21ac0120ab0120ac016a21ad0120ac0120ad016a21ae0120ad0120ae016a21af0120ae0120af016a21" + "b00120af0120b0016a21b10120b00120b1016a21b20120b10120b2016a21b30120b20120b3016a21b40120b30120b4" + "016a21b50120b40120b5016a21b60120b50120b6016a21b70120b60120b7016a21b80120b70120b8016a21b90120b8" + "0120b9016a21ba0120b90120ba016a21bb0120ba0120bb016a21bc0120bb0120bc016a21bd0120bc0120bd016a21be" + "0120bd0120be016a21bf0120be0120bf016a21c00120bf0120c0016a21c10120c00120c1016a21c20120c10120c201" + "6a21c30120c20120c3016a21c40120c30120c4016a21c50120c40120c5016a21c60120c50120c6016a21c70120c601" + "20c7016a21c80120c70120c8016a21c90120c80120c9016a21ca0120c90120ca016a21cb0120ca0120cb016a21cc01" + "20cb0120cc016a21cd0120cc0120cd016a21ce0120cd0120ce016a21cf0120ce0120cf016a21d00120cf0120d0016a" + "21d10120d00120d1016a21d20120d10120d2016a21d30120d20120d3016a21d40120d30120d4016a21d50120d40120" + "d5016a21d60120d50120d6016a21d70120d60120d7016a21d80120d70120d8016a21d90120d80120d9016a21da0120" + "d90120da016a21db0120da0120db016a21dc0120db0120dc016a21dd0120dc0120dd016a21de0120dd0120de016a21" + "df0120de0120df016a21e00120df0120e0016a21e10120e00120e1016a21e20120e10120e2016a21e30120e20120e3" + "016a21e40120e30120e4016a21e50120e40120e5016a21e60120e50120e6016a21e70120e60120e7016a21e80120e7" + "0120e8016a21e90120e80120e9016a21ea0120e90120ea016a21eb0120ea0120eb016a21ec0120eb0120ec016a21ed" + "0120ec0120ed016a21ee0120ed0120ee016a21ef0120ee0120ef016a21f00120ef0120f0016a21f10120f00120f101" + "6a21f20120f10120f2016a21f30120f20120f3016a21f40120f30120f4016a21f50120f40120f5016a21f60120f501" + "20f6016a21f70120f60120f7016a21f80120f70120f8016a21f90120f80120f9016a21fa0120f90120fa016a21fb01" + "20fa0120fb016a21fc0120fb0120fc016a21fd0120fc0120fd016a21fe0120fd0120fe016a21ff0120fe0120ff016a" + "21800220ff012080026a2181022080022081026a2182022081022082026a2183022082022083026a21840220830220" + "84026a2185022084022085026a2186022085022086026a2187022086022087026a2188022087022088026a21890220" + "88022089026a218a02208902208a026a218b02208a02208b026a218c02208b02208c026a218d02208c02208d026a21" + "8e02208d02208e026a218f02208e02208f026a219002208f022090026a2191022090022091026a2192022091022092" + "026a2193022092022093026a2194022093022094026a2195022094022095026a2196022095022096026a2197022096" + "022097026a2198022097022098026a2199022098022099026a219a02209902209a026a219b02209a02209b026a219c" + "02209b02209c026a219d02209c02209d026a219e02209d02209e026a219f02209e02209f026a21a002209f0220a002" + "6a21a10220a00220a1026a21a20220a10220a2026a21a30220a20220a3026a21a40220a30220a4026a21a50220a402" + "20a5026a21a60220a50220a6026a21a70220a60220a7026a21a80220a70220a8026a21a90220a80220a9026a21aa02" + "20a90220aa026a21ab0220aa0220ab026a21ac0220ab0220ac026a21ad0220ac0220ad026a21ae0220ad0220ae026a" "21af0220ae0220af026a21b00220af0220b0026a21b10220b00220b1026a21b20220b10220b2026a21b30220b20220" - "b3026a21b40220b30220" - "b4026a21b50220b40220b5026a21b60220b50220b6026a21b70220b60220b7026a21b80220b70220b8026a21b90220" - "b80220b9026a21ba0220" - "b90220ba026a21bb0220ba0220bb026a21bc0220bb0220bc026a21bd0220bc0220bd026a21be0220bd0220be026a21" - "bf0220be0220bf026a21" - "c00220bf0220c0026a21c10220c00220c1026a21c20220c10220c2026a21c30220c20220c3026a21c40220c30220c4" - "026a21c50220c40220c5" - "026a21c60220c50220c6026a21c70220c60220c7026a21c80220c70220c8026a21c90220c80220c9026a21ca0220c9" - "0220ca026a21cb0220ca" - "0220cb026a21cc0220cb0220cc026a21cd0220cc0220cd026a21ce0220cd0220ce026a21cf0220ce0220cf026a21d0" - "0220cf0220d0026a21d1" - "0220d00220d1026a21d20220d10220d2026a21d30220d20220d3026a21d40220d30220d4026a21d50220d40220d502" - "6a21d60220d50220d602" - "6a21d70220d60220d7026a21d80220d70220d8026a21d90220d80220d9026a21da0220d90220da026a21db0220da02" - "20db026a21dc0220db02" - "20dc026a21dd0220dc0220dd026a21de0220dd0220de026a21df0220de0220df026a21e00220df0220e0026a21e102" - "20e00220e1026a21e202" - "20e10220e2026a21e30220e20220e3026a21e40220e30220e4026a21e50220e40220e5026a21e60220e50220e6026a" - "21e70220e60220e7026a" - "21e80220e70220e8026a21e90220e80220e9026a21ea0220e90220ea026a21eb0220ea0220eb026a21ec0220eb0220" - "ec026a21ed0220ec0220" - "ed026a21ee0220ed0220ee026a21ef0220ee0220ef026a21f00220ef0220f0026a21f10220f00220f1026a21f20220" - "f10220f2026a21f30220" - "f20220f3026a21f40220f30220f4026a21f50220f40220f5026a21f60220f50220f6026a21f70220f60220f7026a21" - "f80220f70220f8026a21" - "f90220f80220f9026a21fa0220f90220fa026a21fb0220fa0220fb026a21fc0220fb0220fc026a21fd0220fc0220fd" - "026a21fe0220fd0220fe" - "026a21ff0220fe0220ff026a21800320ff022080036a2181032080032081036a2182032081032082036a2183032082" - "032083036a2184032083" - "032084036a2185032084032085036a2186032085032086036a2187032086032087036a2188032087032088036a2189" - "032088032089036a218a" - "03208903208a036a218b03208a03208b036a218c03208b03208c036a218d03208c03208d036a218e03208d03208e03" - "6a218f03208e03208f03" - "6a219003208f032090036a2191032090032091036a2192032091032092036a2193032092032093036a219403209303" - "2094036a219503209403" - "2095036a2196032095032096036a2197032096032097036a2198032097032098036a2199032098032099036a219a03" - "209903209a036a219b03" - "209a03209b036a219c03209b03209c036a219d03209c03209d036a219e03209d03209e036a219f03209e03209f036a" - "21a003209f0320a0036a" - "21a10320a00320a1036a21a20320a10320a2036a21a30320a20320a3036a21a40320a30320a4036a21a50320a40320" - "a5036a21a60320a50320" - "a6036a21a70320a60320a7036a21a80320a70320a8036a21a90320a80320a9036a21aa0320a90320aa036a21ab0320" - "aa0320ab036a21ac0320" - "ab0320ac036a21ad0320ac0320ad036a21ae0320ad0320ae036a21af0320ae0320af036a21b00320af0320b0036a21" - "b10320b00320b1036a21" - "b20320b10320b2036a21b30320b20320b3036a21b40320b30320b4036a21b50320b40320b5036a21b60320b50320b6" - "036a21b70320b60320b7" - "036a21b80320b70320b8036a21b90320b80320b9036a21ba0320b90320ba036a21bb0320ba0320bb036a21bc0320bb" - "0320bc036a21bd0320bc" - "0320bd036a21be0320bd0320be036a21bf0320be0320bf036a21c00320bf0320c0036a21c10320c00320c1036a21c2" - "0320c10320c2036a21c3" - "0320c20320c3036a21c40320c30320c4036a21c50320c40320c5036a21c60320c50320c6036a21c70320c60320c703" - "6a21c80320c70320c803" - "6a21c90320c80320c9036a21ca0320c90320ca036a21cb0320ca0320cb036a21cc0320cb0320cc036a21cd0320cc03" - "20cd036a21ce0320cd03" - "20ce036a21cf0320ce0320cf036a21d00320cf0320d0036a21d10320d00320d1036a21d20320d10320d2036a21d303" - "20d20320d3036a21d403" - "20d30320d4036a21d50320d40320d5036a21d60320d50320d6036a21d70320d60320d7036a21d80320d70320d8036a" - "21d90320d80320d9036a" - "21da0320d90320da036a21db0320da0320db036a21dc0320db0320dc036a21dd0320dc0320dd036a21de0320dd0320" - "de036a21df0320de0320" - "df036a21e00320df0320e0036a21e10320e00320e1036a21e20320e10320e2036a21e30320e20320e3036a21e40320" - "e30320e4036a21e50320" - "e40320e5036a21e60320e50320e6036a21e70320e60320e7036a21e80320e70320e8036a21e90320e80320e9036a21" - "ea0320e90320ea036a21" - "eb0320ea0320eb036a21ec0320eb0320ec036a21ed0320ec0320ed036a21ee0320ed0320ee036a21ef0320ee0320ef" - "036a21f00320ef0320f0" - "036a21f10320f00320f1036a21f20320f10320f2036a21f30320f20320f3036a21f40320f30320f4036a21f50320f4" - "0320f5036a21f60320f5" - "0320f6036a21f70320f60320f7036a21f80320f70320f8036a21f90320f80320f9036a21fa0320f90320fa036a21fb" - "0320fa0320fb036a21fc" - "0320fb0320fc036a21fd0320fc0320fd036a21fe0320fd0320fe036a21ff0320fe0320ff036a21800420ff03208004" - "6a218104208004208104" - "6a2182042081042082046a2183042082042083046a2184042083042084046a2185042084042085046a218604208504" - "2086046a218704208604" - "2087046a2188042087042088046a2189042088042089046a218a04208904208a046a218b04208a04208b046a218c04" - "208b04208c046a218d04" - "208c04208d046a218e04208d04208e046a218f04208e04208f046a219004208f042090046a2191042090042091046a" - "2192042091042092046a" - "2193042092042093046a2194042093042094046a2195042094042095046a2196042095042096046a21970420960420" - "97046a21980420970420" - "98046a2199042098042099046a219a04209904209a046a219b04209a04209b046a219c04209b04209c046a219d0420" - "9c04209d046a219e0420" - "9d04209e046a219f04209e04209f046a21a004209f0420a0046a21a10420a00420a1046a21a20420a10420a2046a21" - "a30420a20420a3046a21" - "a40420a30420a4046a21a50420a40420a5046a21a60420a50420a6046a21a70420a60420a7046a21a80420a70420a8" - "046a21a90420a80420a9" - "046a21aa0420a90420aa046a21ab0420aa0420ab046a21ac0420ab0420ac046a21ad0420ac0420ad046a21ae0420ad" - "0420ae046a21af0420ae" - "0420af046a21b00420af0420b0046a21b10420b00420b1046a21b20420b10420b2046a21b30420b20420b3046a21b4" - "0420b30420b4046a21b5" - "0420b40420b5046a21b60420b50420b6046a21b70420b60420b7046a21b80420b70420b8046a21b90420b80420b904" - "6a21ba0420b90420ba04" + "b3026a21b40220b30220b4026a21b50220b40220b5026a21b60220b50220b6026a21b70220b60220b7026a21b80220" + "b70220b8026a21b90220b80220b9026a21ba0220b90220ba026a21bb0220ba0220bb026a21bc0220bb0220bc026a21" + "bd0220bc0220bd026a21be0220bd0220be026a21bf0220be0220bf026a21c00220bf0220c0026a21c10220c00220c1" + "026a21c20220c10220c2026a21c30220c20220c3026a21c40220c30220c4026a21c50220c40220c5026a21c60220c5" + "0220c6026a21c70220c60220c7026a21c80220c70220c8026a21c90220c80220c9026a21ca0220c90220ca026a21cb" + "0220ca0220cb026a21cc0220cb0220cc026a21cd0220cc0220cd026a21ce0220cd0220ce026a21cf0220ce0220cf02" + "6a21d00220cf0220d0026a21d10220d00220d1026a21d20220d10220d2026a21d30220d20220d3026a21d40220d302" + "20d4026a21d50220d40220d5026a21d60220d50220d6026a21d70220d60220d7026a21d80220d70220d8026a21d902" + "20d80220d9026a21da0220d90220da026a21db0220da0220db026a21dc0220db0220dc026a21dd0220dc0220dd026a" + "21de0220dd0220de026a21df0220de0220df026a21e00220df0220e0026a21e10220e00220e1026a21e20220e10220" + "e2026a21e30220e20220e3026a21e40220e30220e4026a21e50220e40220e5026a21e60220e50220e6026a21e70220" + "e60220e7026a21e80220e70220e8026a21e90220e80220e9026a21ea0220e90220ea026a21eb0220ea0220eb026a21" + "ec0220eb0220ec026a21ed0220ec0220ed026a21ee0220ed0220ee026a21ef0220ee0220ef026a21f00220ef0220f0" + "026a21f10220f00220f1026a21f20220f10220f2026a21f30220f20220f3026a21f40220f30220f4026a21f50220f4" + "0220f5026a21f60220f50220f6026a21f70220f60220f7026a21f80220f70220f8026a21f90220f80220f9026a21fa" + "0220f90220fa026a21fb0220fa0220fb026a21fc0220fb0220fc026a21fd0220fc0220fd026a21fe0220fd0220fe02" + "6a21ff0220fe0220ff026a21800320ff022080036a2181032080032081036a2182032081032082036a218303208203" + "2083036a2184032083032084036a2185032084032085036a2186032085032086036a2187032086032087036a218803" + "2087032088036a2189032088032089036a218a03208903208a036a218b03208a03208b036a218c03208b03208c036a" + "218d03208c03208d036a218e03208d03208e036a218f03208e03208f036a219003208f032090036a21910320900320" + "91036a2192032091032092036a2193032092032093036a2194032093032094036a2195032094032095036a21960320" + "95032096036a2197032096032097036a2198032097032098036a2199032098032099036a219a03209903209a036a21" + "9b03209a03209b036a219c03209b03209c036a219d03209c03209d036a219e03209d03209e036a219f03209e03209f" + "036a21a003209f0320a0036a21a10320a00320a1036a21a20320a10320a2036a21a30320a20320a3036a21a40320a3" + "0320a4036a21a50320a40320a5036a21a60320a50320a6036a21a70320a60320a7036a21a80320a70320a8036a21a9" + "0320a80320a9036a21aa0320a90320aa036a21ab0320aa0320ab036a21ac0320ab0320ac036a21ad0320ac0320ad03" + "6a21ae0320ad0320ae036a21af0320ae0320af036a21b00320af0320b0036a21b10320b00320b1036a21b20320b103" + "20b2036a21b30320b20320b3036a21b40320b30320b4036a21b50320b40320b5036a21b60320b50320b6036a21b703" + "20b60320b7036a21b80320b70320b8036a21b90320b80320b9036a21ba0320b90320ba036a21bb0320ba0320bb036a" + "21bc0320bb0320bc036a21bd0320bc0320bd036a21be0320bd0320be036a21bf0320be0320bf036a21c00320bf0320" + "c0036a21c10320c00320c1036a21c20320c10320c2036a21c30320c20320c3036a21c40320c30320c4036a21c50320" + "c40320c5036a21c60320c50320c6036a21c70320c60320c7036a21c80320c70320c8036a21c90320c80320c9036a21" + "ca0320c90320ca036a21cb0320ca0320cb036a21cc0320cb0320cc036a21cd0320cc0320cd036a21ce0320cd0320ce" + "036a21cf0320ce0320cf036a21d00320cf0320d0036a21d10320d00320d1036a21d20320d10320d2036a21d30320d2" + "0320d3036a21d40320d30320d4036a21d50320d40320d5036a21d60320d50320d6036a21d70320d60320d7036a21d8" + "0320d70320d8036a21d90320d80320d9036a21da0320d90320da036a21db0320da0320db036a21dc0320db0320dc03" + "6a21dd0320dc0320dd036a21de0320dd0320de036a21df0320de0320df036a21e00320df0320e0036a21e10320e003" + "20e1036a21e20320e10320e2036a21e30320e20320e3036a21e40320e30320e4036a21e50320e40320e5036a21e603" + "20e50320e6036a21e70320e60320e7036a21e80320e70320e8036a21e90320e80320e9036a21ea0320e90320ea036a" + "21eb0320ea0320eb036a21ec0320eb0320ec036a21ed0320ec0320ed036a21ee0320ed0320ee036a21ef0320ee0320" + "ef036a21f00320ef0320f0036a21f10320f00320f1036a21f20320f10320f2036a21f30320f20320f3036a21f40320" + "f30320f4036a21f50320f40320f5036a21f60320f50320f6036a21f70320f60320f7036a21f80320f70320f8036a21" + "f90320f80320f9036a21fa0320f90320fa036a21fb0320fa0320fb036a21fc0320fb0320fc036a21fd0320fc0320fd" + "036a21fe0320fd0320fe036a21ff0320fe0320ff036a21800420ff032080046a2181042080042081046a2182042081" + "042082046a2183042082042083046a2184042083042084046a2185042084042085046a2186042085042086046a2187" + "042086042087046a2188042087042088046a2189042088042089046a218a04208904208a046a218b04208a04208b04" + "6a218c04208b04208c046a218d04208c04208d046a218e04208d04208e046a218f04208e04208f046a219004208f04" + "2090046a2191042090042091046a2192042091042092046a2193042092042093046a2194042093042094046a219504" + "2094042095046a2196042095042096046a2197042096042097046a2198042097042098046a2199042098042099046a" + "219a04209904209a046a219b04209a04209b046a219c04209b04209c046a219d04209c04209d046a219e04209d0420" + "9e046a219f04209e04209f046a21a004209f0420a0046a21a10420a00420a1046a21a20420a10420a2046a21a30420" + "a20420a3046a21a40420a30420a4046a21a50420a40420a5046a21a60420a50420a6046a21a70420a60420a7046a21" + "a80420a70420a8046a21a90420a80420a9046a21aa0420a90420aa046a21ab0420aa0420ab046a21ac0420ab0420ac" + "046a21ad0420ac0420ad046a21ae0420ad0420ae046a21af0420ae0420af046a21b00420af0420b0046a21b10420b0" + "0420b1046a21b20420b10420b2046a21b30420b20420b3046a21b40420b30420b4046a21b50420b40420b5046a21b6" + "0420b50420b6046a21b70420b60420b7046a21b80420b70420b8046a21b90420b80420b9046a21ba0420b90420ba04" "6a21bb0420ba0420bb046a21bc0420bb0420bc046a21bd0420bc0420bd046a21be0420bd0420be046a21bf0420be04" - "20bf046a21c00420bf04" - "20c0046a21c10420c00420c1046a21c20420c10420c2046a21c30420c20420c3046a21c40420c30420c4046a21c504" - "20c40420c5046a21c604" - "20c50420c6046a21c70420c60420c7046a21c80420c70420c8046a21c90420c80420c9046a21ca0420c90420ca046a" - "21cb0420ca0420cb046a" - "21cc0420cb0420cc046a21cd0420cc0420cd046a21ce0420cd0420ce046a21cf0420ce0420cf046a21d00420cf0420" - "d0046a21d10420d00420" - "d1046a21d20420d10420d2046a21d30420d20420d3046a21d40420d30420d4046a21d50420d40420d5046a21d60420" - "d50420d6046a21d70420" - "d60420d7046a21d80420d70420d8046a21d90420d80420d9046a21da0420d90420da046a21db0420da0420db046a21" - "dc0420db0420dc046a21" - "dd0420dc0420dd046a21de0420dd0420de046a21df0420de0420df046a21e00420df0420e0046a21e10420e00420e1" - "046a21e20420e10420e2" - "046a21e30420e20420e3046a21e40420e30420e4046a21e50420e40420e5046a21e60420e50420e6046a21e70420e6" - "0420e7046a21e80420e7" - "0420e8046a21e90420e80420e9046a21ea0420e90420ea046a21eb0420ea0420eb046a21ec0420eb0420ec046a21ed" - "0420ec0420ed046a21ee" - "0420ed0420ee046a21ef0420ee0420ef046a21f00420ef0420f0046a21f10420f00420f1046a21f20420f10420f204" - "6a21f30420f20420f304" - "6a21f40420f30420f4046a21f50420f40420f5046a21f60420f50420f6046a21f70420f60420f7046a21f80420f704" - "20f8046a21f90420f804" - "20f9046a21fa0420f90420fa046a21fb0420fa0420fb046a21fc0420fb0420fc046a21fd0420fc0420fd046a21fe04" - "20fd0420fe046a21ff04" - "20fe0420ff046a21800520ff042080056a2181052080052081056a2182052081052082056a2183052082052083056a" - "2184052083052084056a" - "2185052084052085056a2186052085052086056a2187052086052087056a2188052087052088056a21890520880520" - "89056a218a0520890520" - "8a056a218b05208a05208b056a218c05208b05208c056a218d05208c05208d056a218e05208d05208e056a218f0520" - "8e05208f056a21900520" - "8f052090056a2191052090052091056a2192052091052092056a2193052092052093056a2194052093052094056a21" - "95052094052095056a21" - "96052095052096056a2197052096052097056a2198052097052098056a2199052098052099056a219a05209905209a" - "056a219b05209a05209b" - "056a219c05209b05209c056a219d05209c05209d056a219e05209d05209e056a219f05209e05209f056a21a005209f" - "0520a0056a21a10520a0" - "0520a1056a21a20520a10520a2056a21a30520a20520a3056a21a40520a30520a4056a21a50520a40520a5056a21a6" - "0520a50520a6056a21a7" - "0520a60520a7056a21a80520a70520a8056a21a90520a80520a9056a21aa0520a90520aa056a21ab0520aa0520ab05" - "6a21ac0520ab0520ac05" - "6a21ad0520ac0520ad056a21ae0520ad0520ae056a21af0520ae0520af056a21b00520af0520b0056a21b10520b005" - "20b1056a21b20520b105" - "20b2056a21b30520b20520b3056a21b40520b30520b4056a21b50520b40520b5056a21b60520b50520b6056a21b705" - "20b60520b7056a21b805" - "20b70520b8056a21b90520b80520b9056a21ba0520b90520ba056a21bb0520ba0520bb056a21bc0520bb0520bc056a" - "21bd0520bc0520bd056a" - "21be0520bd0520be056a21bf0520be0520bf056a21c00520bf0520c0056a21c10520c00520c1056a21c20520c10520" - "c2056a21c30520c20520" - "c3056a21c40520c30520c4056a21c50520c40520c5056a21c60520c50520c6056a21c70520c60520c7056a21c80520" - "c70520c8056a21c90520" - "c80520c9056a21ca0520c90520ca056a21cb0520ca0520cb056a21cc0520cb0520cc056a21cd0520cc0520cd056a21" - "ce0520cd0520ce056a21" - "cf0520ce0520cf056a21d00520cf0520d0056a21d10520d00520d1056a21d20520d10520d2056a21d30520d20520d3" - "056a21d40520d30520d4" - "056a21d50520d40520d5056a21d60520d50520d6056a21d70520d60520d7056a21d80520d70520d8056a21d90520d8" - "0520d9056a21da0520d9" - "0520da056a21db0520da0520db056a21dc0520db0520dc056a21dd0520dc0520dd056a21de0520dd0520de056a21df" - "0520de0520df056a21e0" - "0520df0520e0056a21e10520e00520e1056a21e20520e10520e2056a21e30520e20520e3056a21e40520e30520e405" - "6a21e50520e40520e505" - "6a21e60520e50520e6056a21e70520e60520e7056a21e80520e70520e8056a21e90520e80520e9056a21ea0520e905" - "20ea056a21eb0520ea05" - "20eb056a21ec0520eb0520ec056a21ed0520ec0520ed056a21ee0520ed0520ee056a21ef0520ee0520ef056a21f005" - "20ef0520f0056a21f105" - "20f00520f1056a21f20520f10520f2056a21f30520f20520f3056a21f40520f30520f4056a21f50520f40520f5056a" - "21f60520f50520f6056a" - "21f70520f60520f7056a21f80520f70520f8056a21f90520f80520f9056a21fa0520f90520fa056a21fb0520fa0520" - "fb056a21fc0520fb0520" - "fc056a21fd0520fc0520fd056a21fe0520fd0520fe056a21ff0520fe0520ff056a21800620ff052080066a21810620" - "80062081066a21820620" - "81062082066a2183062082062083066a2184062083062084066a2185062084062085066a2186062085062086066a21" - "87062086062087066a21" - "88062087062088066a2189062088062089066a218a06208906208a066a218b06208a06208b066a218c06208b06208c" - "066a218d06208c06208d" - "066a218e06208d06208e066a218f06208e06208f066a219006208f062090066a2191062090062091066a2192062091" - "062092066a2193062092" - "062093066a2194062093062094066a2195062094062095066a2196062095062096066a2197062096062097066a2198" - "062097062098066a2199" - "062098062099066a219a06209906209a066a219b06209a06209b066a219c06209b06209c066a219d06209c06209d06" - "6a219e06209d06209e06" - "6a219f06209e06209f066a21a006209f0620a0066a21a10620a00620a1066a21a20620a10620a2066a21a30620a206" - "20a3066a21a40620a306" - "20a4066a21a50620a40620a5066a21a60620a50620a6066a21a70620a60620a7066a21a80620a70620a8066a21a906" - "20a80620a9066a21aa06" - "20a90620aa066a21ab0620aa0620ab066a21ac0620ab0620ac066a21ad0620ac0620ad066a21ae0620ad0620ae066a" - "21af0620ae0620af066a" - "21b00620af0620b0066a21b10620b00620b1066a21b20620b10620b2066a21b30620b20620b3066a21b40620b30620" - "b4066a21b50620b40620" - "b5066a21b60620b50620b6066a21b70620b60620b7066a21b80620b70620b8066a21b90620b80620b9066a21ba0620" - "b90620ba066a21bb0620" - "ba0620bb066a21bc0620bb0620bc066a21bd0620bc0620bd066a21be0620bd0620be066a21bf0620be0620bf066a21" - "c00620bf0620c0066a21" - "c10620c00620c1066a21c20620c10620c2066a21c30620c20620c3066a21c40620c30620c4066a21c50620c40620c5" - "066a21c60620c50620c6" + "20bf046a21c00420bf0420c0046a21c10420c00420c1046a21c20420c10420c2046a21c30420c20420c3046a21c404" + "20c30420c4046a21c50420c40420c5046a21c60420c50420c6046a21c70420c60420c7046a21c80420c70420c8046a" + "21c90420c80420c9046a21ca0420c90420ca046a21cb0420ca0420cb046a21cc0420cb0420cc046a21cd0420cc0420" + "cd046a21ce0420cd0420ce046a21cf0420ce0420cf046a21d00420cf0420d0046a21d10420d00420d1046a21d20420" + "d10420d2046a21d30420d20420d3046a21d40420d30420d4046a21d50420d40420d5046a21d60420d50420d6046a21" + "d70420d60420d7046a21d80420d70420d8046a21d90420d80420d9046a21da0420d90420da046a21db0420da0420db" + "046a21dc0420db0420dc046a21dd0420dc0420dd046a21de0420dd0420de046a21df0420de0420df046a21e00420df" + "0420e0046a21e10420e00420e1046a21e20420e10420e2046a21e30420e20420e3046a21e40420e30420e4046a21e5" + "0420e40420e5046a21e60420e50420e6046a21e70420e60420e7046a21e80420e70420e8046a21e90420e80420e904" + "6a21ea0420e90420ea046a21eb0420ea0420eb046a21ec0420eb0420ec046a21ed0420ec0420ed046a21ee0420ed04" + "20ee046a21ef0420ee0420ef046a21f00420ef0420f0046a21f10420f00420f1046a21f20420f10420f2046a21f304" + "20f20420f3046a21f40420f30420f4046a21f50420f40420f5046a21f60420f50420f6046a21f70420f60420f7046a" + "21f80420f70420f8046a21f90420f80420f9046a21fa0420f90420fa046a21fb0420fa0420fb046a21fc0420fb0420" + "fc046a21fd0420fc0420fd046a21fe0420fd0420fe046a21ff0420fe0420ff046a21800520ff042080056a21810520" + "80052081056a2182052081052082056a2183052082052083056a2184052083052084056a2185052084052085056a21" + "86052085052086056a2187052086052087056a2188052087052088056a2189052088052089056a218a05208905208a" + "056a218b05208a05208b056a218c05208b05208c056a218d05208c05208d056a218e05208d05208e056a218f05208e" + "05208f056a219005208f052090056a2191052090052091056a2192052091052092056a2193052092052093056a2194" + "052093052094056a2195052094052095056a2196052095052096056a2197052096052097056a219805209705209805" + "6a2199052098052099056a219a05209905209a056a219b05209a05209b056a219c05209b05209c056a219d05209c05" + "209d056a219e05209d05209e056a219f05209e05209f056a21a005209f0520a0056a21a10520a00520a1056a21a205" + "20a10520a2056a21a30520a20520a3056a21a40520a30520a4056a21a50520a40520a5056a21a60520a50520a6056a" + "21a70520a60520a7056a21a80520a70520a8056a21a90520a80520a9056a21aa0520a90520aa056a21ab0520aa0520" + "ab056a21ac0520ab0520ac056a21ad0520ac0520ad056a21ae0520ad0520ae056a21af0520ae0520af056a21b00520" + "af0520b0056a21b10520b00520b1056a21b20520b10520b2056a21b30520b20520b3056a21b40520b30520b4056a21" + "b50520b40520b5056a21b60520b50520b6056a21b70520b60520b7056a21b80520b70520b8056a21b90520b80520b9" + "056a21ba0520b90520ba056a21bb0520ba0520bb056a21bc0520bb0520bc056a21bd0520bc0520bd056a21be0520bd" + "0520be056a21bf0520be0520bf056a21c00520bf0520c0056a21c10520c00520c1056a21c20520c10520c2056a21c3" + "0520c20520c3056a21c40520c30520c4056a21c50520c40520c5056a21c60520c50520c6056a21c70520c60520c705" + "6a21c80520c70520c8056a21c90520c80520c9056a21ca0520c90520ca056a21cb0520ca0520cb056a21cc0520cb05" + "20cc056a21cd0520cc0520cd056a21ce0520cd0520ce056a21cf0520ce0520cf056a21d00520cf0520d0056a21d105" + "20d00520d1056a21d20520d10520d2056a21d30520d20520d3056a21d40520d30520d4056a21d50520d40520d5056a" + "21d60520d50520d6056a21d70520d60520d7056a21d80520d70520d8056a21d90520d80520d9056a21da0520d90520" + "da056a21db0520da0520db056a21dc0520db0520dc056a21dd0520dc0520dd056a21de0520dd0520de056a21df0520" + "de0520df056a21e00520df0520e0056a21e10520e00520e1056a21e20520e10520e2056a21e30520e20520e3056a21" + "e40520e30520e4056a21e50520e40520e5056a21e60520e50520e6056a21e70520e60520e7056a21e80520e70520e8" + "056a21e90520e80520e9056a21ea0520e90520ea056a21eb0520ea0520eb056a21ec0520eb0520ec056a21ed0520ec" + "0520ed056a21ee0520ed0520ee056a21ef0520ee0520ef056a21f00520ef0520f0056a21f10520f00520f1056a21f2" + "0520f10520f2056a21f30520f20520f3056a21f40520f30520f4056a21f50520f40520f5056a21f60520f50520f605" + "6a21f70520f60520f7056a21f80520f70520f8056a21f90520f80520f9056a21fa0520f90520fa056a21fb0520fa05" + "20fb056a21fc0520fb0520fc056a21fd0520fc0520fd056a21fe0520fd0520fe056a21ff0520fe0520ff056a218006" + "20ff052080066a2181062080062081066a2182062081062082066a2183062082062083066a2184062083062084066a" + "2185062084062085066a2186062085062086066a2187062086062087066a2188062087062088066a21890620880620" + "89066a218a06208906208a066a218b06208a06208b066a218c06208b06208c066a218d06208c06208d066a218e0620" + "8d06208e066a218f06208e06208f066a219006208f062090066a2191062090062091066a2192062091062092066a21" + "93062092062093066a2194062093062094066a2195062094062095066a2196062095062096066a2197062096062097" + "066a2198062097062098066a2199062098062099066a219a06209906209a066a219b06209a06209b066a219c06209b" + "06209c066a219d06209c06209d066a219e06209d06209e066a219f06209e06209f066a21a006209f0620a0066a21a1" + "0620a00620a1066a21a20620a10620a2066a21a30620a20620a3066a21a40620a30620a4066a21a50620a40620a506" + "6a21a60620a50620a6066a21a70620a60620a7066a21a80620a70620a8066a21a90620a80620a9066a21aa0620a906" + "20aa066a21ab0620aa0620ab066a21ac0620ab0620ac066a21ad0620ac0620ad066a21ae0620ad0620ae066a21af06" + "20ae0620af066a21b00620af0620b0066a21b10620b00620b1066a21b20620b10620b2066a21b30620b20620b3066a" + "21b40620b30620b4066a21b50620b40620b5066a21b60620b50620b6066a21b70620b60620b7066a21b80620b70620" + "b8066a21b90620b80620b9066a21ba0620b90620ba066a21bb0620ba0620bb066a21bc0620bb0620bc066a21bd0620" + "bc0620bd066a21be0620bd0620be066a21bf0620be0620bf066a21c00620bf0620c0066a21c10620c00620c1066a21" + "c20620c10620c2066a21c30620c20620c3066a21c40620c30620c4066a21c50620c40620c5066a21c60620c50620c6" "066a21c70620c60620c7066a21c80620c70620c8066a21c90620c80620c9066a21ca0620c90620ca066a21cb0620ca" - "0620cb066a21cc0620cb" - "0620cc066a21cd0620cc0620cd066a21ce0620cd0620ce066a21cf0620ce0620cf066a21d00620cf0620d0066a21d1" - "0620d00620d1066a21d2" - "0620d10620d2066a21d30620d20620d3066a21d40620d30620d4066a21d50620d40620d5066a21d60620d50620d606" - "6a21d70620d60620d706" - "6a21d80620d70620d8066a21d90620d80620d9066a21da0620d90620da066a21db0620da0620db066a21dc0620db06" - "20dc066a21dd0620dc06" - "20dd066a21de0620dd0620de066a21df0620de0620df066a21e00620df0620e0066a21e10620e00620e1066a21e206" - "20e10620e2066a21e306" - "20e20620e3066a21e40620e30620e4066a21e50620e40620e5066a21e60620e50620e6066a21e70620e60620e7066a" - "21e80620e70620e8066a" - "21e90620e80620e9066a21ea0620e90620ea066a21eb0620ea0620eb066a21ec0620eb0620ec066a21ed0620ec0620" - "ed066a21ee0620ed0620" - "ee066a21ef0620ee0620ef066a21f00620ef0620f0066a21f10620f00620f1066a21f20620f10620f2066a21f30620" - "f20620f3066a21f40620" - "f30620f4066a21f50620f40620f5066a21f60620f50620f6066a21f70620f60620f7066a21f80620f70620f8066a21" - "f90620f80620f9066a21" - "fa0620f90620fa066a21fb0620fa0620fb066a21fc0620fb0620fc066a21fd0620fc0620fd066a21fe0620fd0620fe" - "066a21ff0620fe0620ff" - "066a21800720ff062080076a2181072080072081076a2182072081072082076a2183072082072083076a2184072083" - "072084076a2185072084" - "072085076a2186072085072086076a2187072086072087076a2188072087072088076a2189072088072089076a218a" - "07208907208a076a218b" - "07208a07208b076a218c07208b07208c076a218d07208c07208d076a218e07208d07208e076a218f07208e07208f07" - "6a219007208f07209007" - "6a2191072090072091076a2192072091072092076a2193072092072093076a2194072093072094076a219507209407" - "2095076a219607209507" - "2096076a2197072096072097076a2198072097072098076a2199072098072099076a219a07209907209a076a219b07" - "209a07209b076a219c07" - "209b07209c076a219d07209c07209d076a219e07209d07209e076a219f07209e07209f076a21a007209f0720a0076a" - "21a10720a00720a1076a" - "21a20720a10720a2076a21a30720a20720a3076a21a40720a30720a4076a21a50720a40720a5076a21a60720a50720" - "a6076a21a70720a60720" - "a7076a21a80720a70720a8076a21a90720a80720a9076a21aa0720a90720aa076a21ab0720aa0720ab076a21ac0720" - "ab0720ac076a21ad0720" - "ac0720ad076a21ae0720ad0720ae076a21af0720ae0720af076a21b00720af0720b0076a21b10720b00720b1076a21" - "b20720b10720b2076a21" - "b30720b20720b3076a21b40720b30720b4076a21b50720b40720b5076a21b60720b50720b6076a21b70720b60720b7" - "076a21b80720b70720b8" - "076a21b90720b80720b9076a21ba0720b90720ba076a21bb0720ba0720bb076a21bc0720bb0720bc076a21bd0720bc" - "0720bd076a21be0720bd" - "0720be076a21bf0720be0720bf076a21c00720bf0720c0076a21c10720c00720c1076a21c20720c10720c2076a21c3" - "0720c20720c3076a21c4" - "0720c30720c4076a21c50720c40720c5076a21c60720c50720c6076a21c70720c60720c7076a21c80720c70720c807" - "6a21c90720c80720c907" - "6a21ca0720c90720ca076a21cb0720ca0720cb076a21cc0720cb0720cc076a21cd0720cc0720cd076a21ce0720cd07" - "20ce076a21cf0720ce07" - "20cf076a21d00720cf0720d0076a21d10720d00720d1076a21d20720d10720d2076a21d30720d20720d3076a21d407" - "20d30720d4076a21d507" - "20d40720d5076a21d60720d50720d6076a21d70720d60720d7076a21d80720d70720d8076a21d90720d80720d9076a" - "21da0720d90720da076a" - "21db0720da0720db076a21dc0720db0720dc076a21dd0720dc0720dd076a21de0720dd0720de076a21df0720de0720" - "df076a21e00720df0720" - "e0076a21e10720e00720e1076a21e20720e10720e2076a21e30720e20720e3076a21e40720e30720e4076a21e50720" - "e40720e5076a21e60720" - "e50720e6076a21e70720e60720e7076a21e80720e70720e8076a21e90720e80720e9076a21ea0720e90720ea076a21" - "eb0720ea0720eb076a21" - "ec0720eb0720ec076a21ed0720ec0720ed076a21ee0720ed0720ee076a21ef0720ee0720ef076a21f00720ef0720f0" - "076a21f10720f00720f1" - "076a21f20720f10720f2076a21f30720f20720f3076a21f40720f30720f4076a21f50720f40720f5076a21f60720f5" - "0720f6076a21f70720f6" - "0720f7076a21f80720f70720f8076a21f90720f80720f9076a21fa0720f90720fa076a21fb0720fa0720fb076a21fc" - "0720fb0720fc076a21fd" - "0720fc0720fd076a21fe0720fd0720fe076a21ff0720fe0720ff076a21800820ff072080086a218108208008208108" - "6a218208208108208208" - "6a2183082082082083086a2184082083082084086a2185082084082085086a2186082085082086086a218708208608" - "2087086a218808208708" - "2088086a2189082088082089086a218a08208908208a086a218b08208a08208b086a218c08208b08208c086a218d08" - "208c08208d086a218e08" - "208d08208e086a218f08208e08208f086a219008208f082090086a2191082090082091086a2192082091082092086a" - "2193082092082093086a" - "2194082093082094086a2195082094082095086a2196082095082096086a2197082096082097086a21980820970820" - "98086a21990820980820" - "99086a219a08209908209a086a219b08209a08209b086a219c08209b08209c086a219d08209c08209d086a219e0820" - "9d08209e086a219f0820" - "9e08209f086a21a008209f0820a0086a21a10820a00820a1086a21a20820a10820a2086a21a30820a20820a3086a21" - "a40820a30820a4086a21" - "a50820a40820a5086a21a60820a50820a6086a21a70820a60820a7086a21a80820a70820a8086a21a90820a80820a9" - "086a21aa0820a90820aa" - "086a21ab0820aa0820ab086a21ac0820ab0820ac086a21ad0820ac0820ad086a21ae0820ad0820ae086a21af0820ae" - "0820af086a21b00820af" - "0820b0086a21b10820b00820b1086a21b20820b10820b2086a21b30820b20820b3086a21b40820b30820b4086a21b5" - "0820b40820b5086a21b6" - "0820b50820b6086a21b70820b60820b7086a21b80820b70820b8086a21b90820b80820b9086a21ba0820b90820ba08" - "6a21bb0820ba0820bb08" - "6a21bc0820bb0820bc086a21bd0820bc0820bd086a21be0820bd0820be086a21bf0820be0820bf086a21c00820bf08" - "20c0086a21c10820c008" - "20c1086a21c20820c10820c2086a21c30820c20820c3086a21c40820c30820c4086a21c50820c40820c5086a21c608" - "20c50820c6086a21c708" - "20c60820c7086a21c80820c70820c8086a21c90820c80820c9086a21ca0820c90820ca086a21cb0820ca0820cb086a" - "21cc0820cb0820cc086a" - "21cd0820cc0820cd086a21ce0820cd0820ce086a21cf0820ce0820cf086a21d00820cf0820d0086a21d10820d00820" - "d1086a21d20820d10820" + "0620cb066a21cc0620cb0620cc066a21cd0620cc0620cd066a21ce0620cd0620ce066a21cf0620ce0620cf066a21d0" + "0620cf0620d0066a21d10620d00620d1066a21d20620d10620d2066a21d30620d20620d3066a21d40620d30620d406" + "6a21d50620d40620d5066a21d60620d50620d6066a21d70620d60620d7066a21d80620d70620d8066a21d90620d806" + "20d9066a21da0620d90620da066a21db0620da0620db066a21dc0620db0620dc066a21dd0620dc0620dd066a21de06" + "20dd0620de066a21df0620de0620df066a21e00620df0620e0066a21e10620e00620e1066a21e20620e10620e2066a" + "21e30620e20620e3066a21e40620e30620e4066a21e50620e40620e5066a21e60620e50620e6066a21e70620e60620" + "e7066a21e80620e70620e8066a21e90620e80620e9066a21ea0620e90620ea066a21eb0620ea0620eb066a21ec0620" + "eb0620ec066a21ed0620ec0620ed066a21ee0620ed0620ee066a21ef0620ee0620ef066a21f00620ef0620f0066a21" + "f10620f00620f1066a21f20620f10620f2066a21f30620f20620f3066a21f40620f30620f4066a21f50620f40620f5" + "066a21f60620f50620f6066a21f70620f60620f7066a21f80620f70620f8066a21f90620f80620f9066a21fa0620f9" + "0620fa066a21fb0620fa0620fb066a21fc0620fb0620fc066a21fd0620fc0620fd066a21fe0620fd0620fe066a21ff" + "0620fe0620ff066a21800720ff062080076a2181072080072081076a2182072081072082076a218307208207208307" + "6a2184072083072084076a2185072084072085076a2186072085072086076a2187072086072087076a218807208707" + "2088076a2189072088072089076a218a07208907208a076a218b07208a07208b076a218c07208b07208c076a218d07" + "208c07208d076a218e07208d07208e076a218f07208e07208f076a219007208f072090076a2191072090072091076a" + "2192072091072092076a2193072092072093076a2194072093072094076a2195072094072095076a21960720950720" + "96076a2197072096072097076a2198072097072098076a2199072098072099076a219a07209907209a076a219b0720" + "9a07209b076a219c07209b07209c076a219d07209c07209d076a219e07209d07209e076a219f07209e07209f076a21" + "a007209f0720a0076a21a10720a00720a1076a21a20720a10720a2076a21a30720a20720a3076a21a40720a30720a4" + "076a21a50720a40720a5076a21a60720a50720a6076a21a70720a60720a7076a21a80720a70720a8076a21a90720a8" + "0720a9076a21aa0720a90720aa076a21ab0720aa0720ab076a21ac0720ab0720ac076a21ad0720ac0720ad076a21ae" + "0720ad0720ae076a21af0720ae0720af076a21b00720af0720b0076a21b10720b00720b1076a21b20720b10720b207" + "6a21b30720b20720b3076a21b40720b30720b4076a21b50720b40720b5076a21b60720b50720b6076a21b70720b607" + "20b7076a21b80720b70720b8076a21b90720b80720b9076a21ba0720b90720ba076a21bb0720ba0720bb076a21bc07" + "20bb0720bc076a21bd0720bc0720bd076a21be0720bd0720be076a21bf0720be0720bf076a21c00720bf0720c0076a" + "21c10720c00720c1076a21c20720c10720c2076a21c30720c20720c3076a21c40720c30720c4076a21c50720c40720" + "c5076a21c60720c50720c6076a21c70720c60720c7076a21c80720c70720c8076a21c90720c80720c9076a21ca0720" + "c90720ca076a21cb0720ca0720cb076a21cc0720cb0720cc076a21cd0720cc0720cd076a21ce0720cd0720ce076a21" + "cf0720ce0720cf076a21d00720cf0720d0076a21d10720d00720d1076a21d20720d10720d2076a21d30720d20720d3" + "076a21d40720d30720d4076a21d50720d40720d5076a21d60720d50720d6076a21d70720d60720d7076a21d80720d7" + "0720d8076a21d90720d80720d9076a21da0720d90720da076a21db0720da0720db076a21dc0720db0720dc076a21dd" + "0720dc0720dd076a21de0720dd0720de076a21df0720de0720df076a21e00720df0720e0076a21e10720e00720e107" + "6a21e20720e10720e2076a21e30720e20720e3076a21e40720e30720e4076a21e50720e40720e5076a21e60720e507" + "20e6076a21e70720e60720e7076a21e80720e70720e8076a21e90720e80720e9076a21ea0720e90720ea076a21eb07" + "20ea0720eb076a21ec0720eb0720ec076a21ed0720ec0720ed076a21ee0720ed0720ee076a21ef0720ee0720ef076a" + "21f00720ef0720f0076a21f10720f00720f1076a21f20720f10720f2076a21f30720f20720f3076a21f40720f30720" + "f4076a21f50720f40720f5076a21f60720f50720f6076a21f70720f60720f7076a21f80720f70720f8076a21f90720" + "f80720f9076a21fa0720f90720fa076a21fb0720fa0720fb076a21fc0720fb0720fc076a21fd0720fc0720fd076a21" + "fe0720fd0720fe076a21ff0720fe0720ff076a21800820ff072080086a2181082080082081086a2182082081082082" + "086a2183082082082083086a2184082083082084086a2185082084082085086a2186082085082086086a2187082086" + "082087086a2188082087082088086a2189082088082089086a218a08208908208a086a218b08208a08208b086a218c" + "08208b08208c086a218d08208c08208d086a218e08208d08208e086a218f08208e08208f086a219008208f08209008" + "6a2191082090082091086a2192082091082092086a2193082092082093086a2194082093082094086a219508209408" + "2095086a2196082095082096086a2197082096082097086a2198082097082098086a2199082098082099086a219a08" + "209908209a086a219b08209a08209b086a219c08209b08209c086a219d08209c08209d086a219e08209d08209e086a" + "219f08209e08209f086a21a008209f0820a0086a21a10820a00820a1086a21a20820a10820a2086a21a30820a20820" + "a3086a21a40820a30820a4086a21a50820a40820a5086a21a60820a50820a6086a21a70820a60820a7086a21a80820" + "a70820a8086a21a90820a80820a9086a21aa0820a90820aa086a21ab0820aa0820ab086a21ac0820ab0820ac086a21" + "ad0820ac0820ad086a21ae0820ad0820ae086a21af0820ae0820af086a21b00820af0820b0086a21b10820b00820b1" + "086a21b20820b10820b2086a21b30820b20820b3086a21b40820b30820b4086a21b50820b40820b5086a21b60820b5" + "0820b6086a21b70820b60820b7086a21b80820b70820b8086a21b90820b80820b9086a21ba0820b90820ba086a21bb" + "0820ba0820bb086a21bc0820bb0820bc086a21bd0820bc0820bd086a21be0820bd0820be086a21bf0820be0820bf08" + "6a21c00820bf0820c0086a21c10820c00820c1086a21c20820c10820c2086a21c30820c20820c3086a21c40820c308" + "20c4086a21c50820c40820c5086a21c60820c50820c6086a21c70820c60820c7086a21c80820c70820c8086a21c908" + "20c80820c9086a21ca0820c90820ca086a21cb0820ca0820cb086a21cc0820cb0820cc086a21cd0820cc0820cd086a" + "21ce0820cd0820ce086a21cf0820ce0820cf086a21d00820cf0820d0086a21d10820d00820d1086a21d20820d10820" "d2086a21d30820d20820d3086a21d40820d30820d4086a21d50820d40820d5086a21d60820d50820d6086a21d70820" - "d60820d7086a21d80820" - "d70820d8086a21d90820d80820d9086a21da0820d90820da086a21db0820da0820db086a21dc0820db0820dc086a21" - "dd0820dc0820dd086a21" - "de0820dd0820de086a21df0820de0820df086a21e00820df0820e0086a21e10820e00820e1086a21e20820e10820e2" - "086a21e30820e20820e3" - "086a21e40820e30820e4086a21e50820e40820e5086a21e60820e50820e6086a21e70820e60820e7086a21e80820e7" - "0820e8086a21e90820e8" - "0820e9086a21ea0820e90820ea086a21eb0820ea0820eb086a21ec0820eb0820ec086a21ed0820ec0820ed086a21ee" - "0820ed0820ee086a21ef" - "0820ee0820ef086a21f00820ef0820f0086a21f10820f00820f1086a21f20820f10820f2086a21f30820f20820f308" - "6a21f40820f30820f408" - "6a21f50820f40820f5086a21f60820f50820f6086a21f70820f60820f7086a21f80820f70820f8086a21f90820f808" - "20f9086a21fa0820f908" - "20fa086a21fb0820fa0820fb086a21fc0820fb0820fc086a21fd0820fc0820fd086a21fe0820fd0820fe086a21ff08" - "20fe0820ff086a218009" - "20ff082080096a2181092080092081096a2182092081092082096a2183092082092083096a2184092083092084096a" - "2185092084092085096a" - "2186092085092086096a2187092086092087096a2188092087092088096a2189092088092089096a218a0920890920" - "8a096a218b09208a0920" - "8b096a218c09208b09208c096a218d09208c09208d096a218e09208d09208e096a218f09208e09208f096a21900920" - "8f092090096a21910920" - "90092091096a2192092091092092096a2193092092092093096a2194092093092094096a2195092094092095096a21" - "96092095092096096a21" - "97092096092097096a2198092097092098096a2199092098092099096a219a09209909209a096a219b09209a09209b" - "096a219c09209b09209c" - "096a219d09209c09209d096a219e09209d09209e096a219f09209e09209f096a21a009209f0920a0096a21a10920a0" - "0920a1096a21a20920a1" - "0920a2096a21a30920a20920a3096a21a40920a30920a4096a21a50920a40920a5096a21a60920a50920a6096a21a7" - "0920a60920a7096a21a8" - "0920a70920a8096a21a90920a80920a9096a21aa0920a90920aa096a21ab0920aa0920ab096a21ac0920ab0920ac09" - "6a21ad0920ac0920ad09" - "6a21ae0920ad0920ae096a21af0920ae0920af096a21b00920af0920b0096a21b10920b00920b1096a21b20920b109" - "20b2096a21b30920b209" - "20b3096a21b40920b30920b4096a21b50920b40920b5096a21b60920b50920b6096a21b70920b60920b7096a21b809" - "20b70920b8096a21b909" - "20b80920b9096a21ba0920b90920ba096a21bb0920ba0920bb096a21bc0920bb0920bc096a21bd0920bc0920bd096a" - "21be0920bd0920be096a" - "21bf0920be0920bf096a21c00920bf0920c0096a21c10920c00920c1096a21c20920c10920c2096a21c30920c20920" - "c3096a21c40920c30920" - "c4096a21c50920c40920c5096a21c60920c50920c6096a21c70920c60920c7096a21c80920c70920c8096a21c90920" - "c80920c9096a21ca0920" - "c90920ca096a21cb0920ca0920cb096a21cc0920cb0920cc096a21cd0920cc0920cd096a21ce0920cd0920ce096a21" - "cf0920ce0920cf096a21" - "d00920cf0920d0096a21d10920d00920d1096a21d20920d10920d2096a21d30920d20920d3096a21d40920d30920d4" - "096a21d50920d40920d5" - "096a21d60920d50920d6096a21d70920d60920d7096a21d80920d70920d8096a21d90920d80920d9096a21da0920d9" - "0920da096a21db0920da" - "0920db096a21dc0920db0920dc096a21dd0920dc0920dd096a21de0920dd0920de096a21df0920de0920df096a21e0" - "0920df0920e0096a21e1" - "0920e00920e1096a21e20920e10920e2096a21e30920e20920e3096a21e40920e30920e4096a21e50920e40920e509" - "6a21e60920e50920e609" - "6a21e70920e60920e7096a21e80920e70920e8096a21e90920e80920e9096a21ea0920e90920ea096a21eb0920ea09" - "20eb096a21ec0920eb09" - "20ec096a21ed0920ec0920ed096a21ee0920ed0920ee096a21ef0920ee0920ef096a21f00920ef0920f0096a21f109" - "20f00920f1096a21f209" - "20f10920f2096a21f30920f20920f3096a21f40920f30920f4096a21f50920f40920f5096a21f60920f50920f6096a" - "21f70920f60920f7096a" - "21f80920f70920f8096a21f90920f80920f9096a21fa0920f90920fa096a21fb0920fa0920fb096a21fc0920fb0920" - "fc096a21fd0920fc0920" - "fd096a21fe0920fd0920fe096a21ff0920fe0920ff096a21800a20ff0920800a6a21810a20800a20810a6a21820a20" - "810a20820a6a21830a20" - "820a20830a6a21840a20830a20840a6a21850a20840a20850a6a21860a20850a20860a6a21870a20860a20870a6a21" - "880a20870a20880a6a21" - "890a20880a20890a6a218a0a20890a208a0a6a218b0a208a0a208b0a6a218c0a208b0a208c0a6a218d0a208c0a208d" - "0a6a218e0a208d0a208e" - "0a6a218f0a208e0a208f0a6a21900a208f0a20900a6a21910a20900a20910a6a21920a20910a20920a6a21930a2092" - "0a20930a6a21940a2093" - "0a20940a6a21950a20940a20950a6a21960a20950a20960a6a21970a20960a20970a6a21980a20970a20980a6a2199" - "0a20980a20990a6a219a" - "0a20990a209a0a6a219b0a209a0a209b0a6a219c0a209b0a209c0a6a219d0a209c0a209d0a6a219e0a209d0a209e0a" - "6a219f0a209e0a209f0a" - "6a21a00a209f0a20a00a6a21a10a20a00a20a10a6a21a20a20a10a20a20a6a21a30a20a20a20a30a6a21a40a20a30a" - "20a40a6a21a50a20a40a" - "20a50a6a21a60a20a50a20a60a6a21a70a20a60a20a70a6a21a80a20a70a20a80a6a21a90a20a80a20a90a6a21aa0a" - "20a90a20aa0a6a21ab0a" - "20aa0a20ab0a6a21ac0a20ab0a20ac0a6a21ad0a20ac0a20ad0a6a21ae0a20ad0a20ae0a6a21af0a20ae0a20af0a6a" - "21b00a20af0a20b00a6a" - "21b10a20b00a20b10a6a21b20a20b10a20b20a6a21b30a20b20a20b30a6a21b40a20b30a20b40a6a21b50a20b40a20" - "b50a6a21b60a20b50a20" - "b60a6a21b70a20b60a20b70a6a21b80a20b70a20b80a6a21b90a20b80a20b90a6a21ba0a20b90a20ba0a6a21bb0a20" - "ba0a20bb0a6a21bc0a20" - "bb0a20bc0a6a21bd0a20bc0a20bd0a6a21be0a20bd0a20be0a6a21bf0a20be0a20bf0a6a21c00a20bf0a20c00a6a21" - "c10a20c00a20c10a6a21" - "c20a20c10a20c20a6a21c30a20c20a20c30a6a21c40a20c30a20c40a6a21c50a20c40a20c50a6a21c60a20c50a20c6" - "0a6a21c70a20c60a20c7" - "0a6a21c80a20c70a20c80a6a21c90a20c80a20c90a6a21ca0a20c90a20ca0a6a21cb0a20ca0a20cb0a6a21cc0a20cb" - "0a20cc0a6a21cd0a20cc" - "0a20cd0a6a21ce0a20cd0a20ce0a6a21cf0a20ce0a20cf0a6a21d00a20cf0a20d00a6a21d10a20d00a20d10a6a21d2" - "0a20d10a20d20a6a21d3" - "0a20d20a20d30a6a21d40a20d30a20d40a6a21d50a20d40a20d50a6a21d60a20d50a20d60a6a21d70a20d60a20d70a" - "6a21d80a20d70a20d80a" - "6a21d90a20d80a20d90a6a21da0a20d90a20da0a6a21db0a20da0a20db0a6a21dc0a20db0a20dc0a6a21dd0a20dc0a" - "20dd0a6a21de0a20dd0a" + "d60820d7086a21d80820d70820d8086a21d90820d80820d9086a21da0820d90820da086a21db0820da0820db086a21" + "dc0820db0820dc086a21dd0820dc0820dd086a21de0820dd0820de086a21df0820de0820df086a21e00820df0820e0" + "086a21e10820e00820e1086a21e20820e10820e2086a21e30820e20820e3086a21e40820e30820e4086a21e50820e4" + "0820e5086a21e60820e50820e6086a21e70820e60820e7086a21e80820e70820e8086a21e90820e80820e9086a21ea" + "0820e90820ea086a21eb0820ea0820eb086a21ec0820eb0820ec086a21ed0820ec0820ed086a21ee0820ed0820ee08" + "6a21ef0820ee0820ef086a21f00820ef0820f0086a21f10820f00820f1086a21f20820f10820f2086a21f30820f208" + "20f3086a21f40820f30820f4086a21f50820f40820f5086a21f60820f50820f6086a21f70820f60820f7086a21f808" + "20f70820f8086a21f90820f80820f9086a21fa0820f90820fa086a21fb0820fa0820fb086a21fc0820fb0820fc086a" + "21fd0820fc0820fd086a21fe0820fd0820fe086a21ff0820fe0820ff086a21800920ff082080096a21810920800920" + "81096a2182092081092082096a2183092082092083096a2184092083092084096a2185092084092085096a21860920" + "85092086096a2187092086092087096a2188092087092088096a2189092088092089096a218a09208909208a096a21" + "8b09208a09208b096a218c09208b09208c096a218d09208c09208d096a218e09208d09208e096a218f09208e09208f" + "096a219009208f092090096a2191092090092091096a2192092091092092096a2193092092092093096a2194092093" + "092094096a2195092094092095096a2196092095092096096a2197092096092097096a2198092097092098096a2199" + "092098092099096a219a09209909209a096a219b09209a09209b096a219c09209b09209c096a219d09209c09209d09" + "6a219e09209d09209e096a219f09209e09209f096a21a009209f0920a0096a21a10920a00920a1096a21a20920a109" + "20a2096a21a30920a20920a3096a21a40920a30920a4096a21a50920a40920a5096a21a60920a50920a6096a21a709" + "20a60920a7096a21a80920a70920a8096a21a90920a80920a9096a21aa0920a90920aa096a21ab0920aa0920ab096a" + "21ac0920ab0920ac096a21ad0920ac0920ad096a21ae0920ad0920ae096a21af0920ae0920af096a21b00920af0920" + "b0096a21b10920b00920b1096a21b20920b10920b2096a21b30920b20920b3096a21b40920b30920b4096a21b50920" + "b40920b5096a21b60920b50920b6096a21b70920b60920b7096a21b80920b70920b8096a21b90920b80920b9096a21" + "ba0920b90920ba096a21bb0920ba0920bb096a21bc0920bb0920bc096a21bd0920bc0920bd096a21be0920bd0920be" + "096a21bf0920be0920bf096a21c00920bf0920c0096a21c10920c00920c1096a21c20920c10920c2096a21c30920c2" + "0920c3096a21c40920c30920c4096a21c50920c40920c5096a21c60920c50920c6096a21c70920c60920c7096a21c8" + "0920c70920c8096a21c90920c80920c9096a21ca0920c90920ca096a21cb0920ca0920cb096a21cc0920cb0920cc09" + "6a21cd0920cc0920cd096a21ce0920cd0920ce096a21cf0920ce0920cf096a21d00920cf0920d0096a21d10920d009" + "20d1096a21d20920d10920d2096a21d30920d20920d3096a21d40920d30920d4096a21d50920d40920d5096a21d609" + "20d50920d6096a21d70920d60920d7096a21d80920d70920d8096a21d90920d80920d9096a21da0920d90920da096a" + "21db0920da0920db096a21dc0920db0920dc096a21dd0920dc0920dd096a21de0920dd0920de096a21df0920de0920" + "df096a21e00920df0920e0096a21e10920e00920e1096a21e20920e10920e2096a21e30920e20920e3096a21e40920" + "e30920e4096a21e50920e40920e5096a21e60920e50920e6096a21e70920e60920e7096a21e80920e70920e8096a21" + "e90920e80920e9096a21ea0920e90920ea096a21eb0920ea0920eb096a21ec0920eb0920ec096a21ed0920ec0920ed" + "096a21ee0920ed0920ee096a21ef0920ee0920ef096a21f00920ef0920f0096a21f10920f00920f1096a21f20920f1" + "0920f2096a21f30920f20920f3096a21f40920f30920f4096a21f50920f40920f5096a21f60920f50920f6096a21f7" + "0920f60920f7096a21f80920f70920f8096a21f90920f80920f9096a21fa0920f90920fa096a21fb0920fa0920fb09" + "6a21fc0920fb0920fc096a21fd0920fc0920fd096a21fe0920fd0920fe096a21ff0920fe0920ff096a21800a20ff09" + "20800a6a21810a20800a20810a6a21820a20810a20820a6a21830a20820a20830a6a21840a20830a20840a6a21850a" + "20840a20850a6a21860a20850a20860a6a21870a20860a20870a6a21880a20870a20880a6a21890a20880a20890a6a" + "218a0a20890a208a0a6a218b0a208a0a208b0a6a218c0a208b0a208c0a6a218d0a208c0a208d0a6a218e0a208d0a20" + "8e0a6a218f0a208e0a208f0a6a21900a208f0a20900a6a21910a20900a20910a6a21920a20910a20920a6a21930a20" + "920a20930a6a21940a20930a20940a6a21950a20940a20950a6a21960a20950a20960a6a21970a20960a20970a6a21" + "980a20970a20980a6a21990a20980a20990a6a219a0a20990a209a0a6a219b0a209a0a209b0a6a219c0a209b0a209c" + "0a6a219d0a209c0a209d0a6a219e0a209d0a209e0a6a219f0a209e0a209f0a6a21a00a209f0a20a00a6a21a10a20a0" + "0a20a10a6a21a20a20a10a20a20a6a21a30a20a20a20a30a6a21a40a20a30a20a40a6a21a50a20a40a20a50a6a21a6" + "0a20a50a20a60a6a21a70a20a60a20a70a6a21a80a20a70a20a80a6a21a90a20a80a20a90a6a21aa0a20a90a20aa0a" + "6a21ab0a20aa0a20ab0a6a21ac0a20ab0a20ac0a6a21ad0a20ac0a20ad0a6a21ae0a20ad0a20ae0a6a21af0a20ae0a" + "20af0a6a21b00a20af0a20b00a6a21b10a20b00a20b10a6a21b20a20b10a20b20a6a21b30a20b20a20b30a6a21b40a" + "20b30a20b40a6a21b50a20b40a20b50a6a21b60a20b50a20b60a6a21b70a20b60a20b70a6a21b80a20b70a20b80a6a" + "21b90a20b80a20b90a6a21ba0a20b90a20ba0a6a21bb0a20ba0a20bb0a6a21bc0a20bb0a20bc0a6a21bd0a20bc0a20" + "bd0a6a21be0a20bd0a20be0a6a21bf0a20be0a20bf0a6a21c00a20bf0a20c00a6a21c10a20c00a20c10a6a21c20a20" + "c10a20c20a6a21c30a20c20a20c30a6a21c40a20c30a20c40a6a21c50a20c40a20c50a6a21c60a20c50a20c60a6a21" + "c70a20c60a20c70a6a21c80a20c70a20c80a6a21c90a20c80a20c90a6a21ca0a20c90a20ca0a6a21cb0a20ca0a20cb" + "0a6a21cc0a20cb0a20cc0a6a21cd0a20cc0a20cd0a6a21ce0a20cd0a20ce0a6a21cf0a20ce0a20cf0a6a21d00a20cf" + "0a20d00a6a21d10a20d00a20d10a6a21d20a20d10a20d20a6a21d30a20d20a20d30a6a21d40a20d30a20d40a6a21d5" + "0a20d40a20d50a6a21d60a20d50a20d60a6a21d70a20d60a20d70a6a21d80a20d70a20d80a6a21d90a20d80a20d90a" + "6a21da0a20d90a20da0a6a21db0a20da0a20db0a6a21dc0a20db0a20dc0a6a21dd0a20dc0a20dd0a6a21de0a20dd0a" "20de0a6a21df0a20de0a20df0a6a21e00a20df0a20e00a6a21e10a20e00a20e10a6a21e20a20e10a20e20a6a21e30a" - "20e20a20e30a6a21e40a" - "20e30a20e40a6a21e50a20e40a20e50a6a21e60a20e50a20e60a6a21e70a20e60a20e70a6a21e80a20e70a20e80a6a" - "21e90a20e80a20e90a6a" - "21ea0a20e90a20ea0a6a21eb0a20ea0a20eb0a6a21ec0a20eb0a20ec0a6a21ed0a20ec0a20ed0a6a21ee0a20ed0a20" - "ee0a6a21ef0a20ee0a20" - "ef0a6a21f00a20ef0a20f00a6a21f10a20f00a20f10a6a21f20a20f10a20f20a6a21f30a20f20a20f30a6a21f40a20" - "f30a20f40a6a21f50a20" - "f40a20f50a6a21f60a20f50a20f60a6a21f70a20f60a20f70a6a21f80a20f70a20f80a6a21f90a20f80a20f90a6a21" - "fa0a20f90a20fa0a6a21" - "fb0a20fa0a20fb0a6a21fc0a20fb0a20fc0a6a21fd0a20fc0a20fd0a6a21fe0a20fd0a20fe0a6a21ff0a20fe0a20ff" - "0a6a21800b20ff0a2080" - "0b6a21810b20800b20810b6a21820b20810b20820b6a21830b20820b20830b6a21840b20830b20840b6a21850b2084" - "0b20850b6a21860b2085" - "0b20860b6a21870b20860b20870b6a21880b20870b20880b6a21890b20880b20890b6a218a0b20890b208a0b6a218b" - "0b208a0b208b0b6a218c" - "0b208b0b208c0b6a218d0b208c0b208d0b6a218e0b208d0b208e0b6a218f0b208e0b208f0b6a21900b208f0b20900b" - "6a21910b20900b20910b" - "6a21920b20910b20920b6a21930b20920b20930b6a21940b20930b20940b6a21950b20940b20950b6a21960b20950b" - "20960b6a21970b20960b" - "20970b6a21980b20970b20980b6a21990b20980b20990b6a219a0b20990b209a0b6a219b0b209a0b209b0b6a219c0b" - "209b0b209c0b6a219d0b" - "209c0b209d0b6a219e0b209d0b209e0b6a219f0b209e0b209f0b6a21a00b209f0b20a00b6a21a10b20a00b20a10b6a" - "21a20b20a10b20a20b6a" - "21a30b20a20b20a30b6a21a40b20a30b20a40b6a21a50b20a40b20a50b6a21a60b20a50b20a60b6a21a70b20a60b20" - "a70b6a21a80b20a70b20" - "a80b6a21a90b20a80b20a90b6a21aa0b20a90b20aa0b6a21ab0b20aa0b20ab0b6a21ac0b20ab0b20ac0b6a21ad0b20" - "ac0b20ad0b6a21ae0b20" - "ad0b20ae0b6a21af0b20ae0b20af0b6a21b00b20af0b20b00b6a21b10b20b00b20b10b6a21b20b20b10b20b20b6a21" - "b30b20b20b20b30b6a21" - "b40b20b30b20b40b6a21b50b20b40b20b50b6a21b60b20b50b20b60b6a21b70b20b60b20b70b6a21b80b20b70b20b8" - "0b6a21b90b20b80b20b9" - "0b6a21ba0b20b90b20ba0b6a21bb0b20ba0b20bb0b6a21bc0b20bb0b20bc0b6a21bd0b20bc0b20bd0b6a21be0b20bd" - "0b20be0b6a21bf0b20be" - "0b20bf0b6a21c00b20bf0b20c00b6a21c10b20c00b20c10b6a21c20b20c10b20c20b6a21c30b20c20b20c30b6a21c4" - "0b20c30b20c40b6a21c5" - "0b20c40b20c50b6a21c60b20c50b20c60b6a21c70b20c60b20c70b6a21c80b20c70b20c80b6a21c90b20c80b20c90b" - "6a21ca0b20c90b20ca0b" - "6a21cb0b20ca0b20cb0b6a21cc0b20cb0b20cc0b6a21cd0b20cc0b20cd0b6a21ce0b20cd0b20ce0b6a21cf0b20ce0b" - "20cf0b6a21d00b20cf0b" - "20d00b6a21d10b20d00b20d10b6a21d20b20d10b20d20b6a21d30b20d20b20d30b6a21d40b20d30b20d40b6a21d50b" - "20d40b20d50b6a21d60b" - "20d50b20d60b6a21d70b20d60b20d70b6a21d80b20d70b20d80b6a21d90b20d80b20d90b6a21da0b20d90b20da0b6a" - "21db0b20da0b20db0b6a" - "21dc0b20db0b20dc0b6a21dd0b20dc0b20dd0b6a21de0b20dd0b20de0b6a21df0b20de0b20df0b6a21e00b20df0b20" - "e00b6a21e10b20e00b20" - "e10b6a21e20b20e10b20e20b6a21e30b20e20b20e30b6a21e40b20e30b20e40b6a21e50b20e40b20e50b6a21e60b20" - "e50b20e60b6a21e70b20" - "e60b20e70b6a21e80b20e70b20e80b6a21e90b20e80b20e90b6a21ea0b20e90b20ea0b6a21eb0b20ea0b20eb0b6a21" - "ec0b20eb0b20ec0b6a21" - "ed0b20ec0b20ed0b6a21ee0b20ed0b20ee0b6a21ef0b20ee0b20ef0b6a21f00b20ef0b20f00b6a21f10b20f00b20f1" - "0b6a21f20b20f10b20f2" - "0b6a21f30b20f20b20f30b6a21f40b20f30b20f40b6a21f50b20f40b20f50b6a21f60b20f50b20f60b6a21f70b20f6" - "0b20f70b6a21f80b20f7" - "0b20f80b6a21f90b20f80b20f90b6a21fa0b20f90b20fa0b6a21fb0b20fa0b20fb0b6a21fc0b20fb0b20fc0b6a21fd" - "0b20fc0b20fd0b6a21fe" - "0b20fd0b20fe0b6a21ff0b20fe0b20ff0b6a21800c20ff0b20800c6a21810c20800c20810c6a21820c20810c20820c" - "6a21830c20820c20830c" - "6a21840c20830c20840c6a21850c20840c20850c6a21860c20850c20860c6a21870c20860c20870c6a21880c20870c" - "20880c6a21890c20880c" - "20890c6a218a0c20890c208a0c6a218b0c208a0c208b0c6a218c0c208b0c208c0c6a218d0c208c0c208d0c6a218e0c" - "208d0c208e0c6a218f0c" - "208e0c208f0c6a21900c208f0c20900c6a21910c20900c20910c6a21920c20910c20920c6a21930c20920c20930c6a" - "21940c20930c20940c6a" - "21950c20940c20950c6a21960c20950c20960c6a21970c20960c20970c6a21980c20970c20980c6a21990c20980c20" - "990c6a219a0c20990c20" - "9a0c6a219b0c209a0c209b0c6a219c0c209b0c209c0c6a219d0c209c0c209d0c6a219e0c209d0c209e0c6a219f0c20" - "9e0c209f0c6a21a00c20" - "9f0c20a00c6a21a10c20a00c20a10c6a21a20c20a10c20a20c6a21a30c20a20c20a30c6a21a40c20a30c20a40c6a21" - "a50c20a40c20a50c6a21" - "a60c20a50c20a60c6a21a70c20a60c20a70c6a21a80c20a70c20a80c6a21a90c20a80c20a90c6a21aa0c20a90c20aa" - "0c6a21ab0c20aa0c20ab" - "0c6a21ac0c20ab0c20ac0c6a21ad0c20ac0c20ad0c6a21ae0c20ad0c20ae0c6a21af0c20ae0c20af0c6a21b00c20af" - "0c20b00c6a21b10c20b0" - "0c20b10c6a21b20c20b10c20b20c6a21b30c20b20c20b30c6a21b40c20b30c20b40c6a21b50c20b40c20b50c6a21b6" - "0c20b50c20b60c6a21b7" - "0c20b60c20b70c6a21b80c20b70c20b80c6a21b90c20b80c20b90c6a21ba0c20b90c20ba0c6a21bb0c20ba0c20bb0c" - "6a21bc0c20bb0c20bc0c" - "6a21bd0c20bc0c20bd0c6a21be0c20bd0c20be0c6a21bf0c20be0c20bf0c6a21c00c20bf0c20c00c6a21c10c20c00c" - "20c10c6a21c20c20c10c" - "20c20c6a21c30c20c20c20c30c6a21c40c20c30c20c40c6a21c50c20c40c20c50c6a21c60c20c50c20c60c6a21c70c" - "20c60c20c70c6a21c80c" - "20c70c20c80c6a21c90c20c80c20c90c6a21ca0c20c90c20ca0c6a21cb0c20ca0c20cb0c6a21cc0c20cb0c20cc0c6a" - "21cd0c20cc0c20cd0c6a" - "21ce0c20cd0c20ce0c6a21cf0c20ce0c20cf0c6a21d00c20cf0c20d00c6a21d10c20d00c20d10c6a21d20c20d10c20" - "d20c6a21d30c20d20c20" - "d30c6a21d40c20d30c20d40c6a21d50c20d40c20d50c6a21d60c20d50c20d60c6a21d70c20d60c20d70c6a21d80c20" - "d70c20d80c6a21d90c20" - "d80c20d90c6a21da0c20d90c20da0c6a21db0c20da0c20db0c6a21dc0c20db0c20dc0c6a21dd0c20dc0c20dd0c6a21" - "de0c20dd0c20de0c6a21" - "df0c20de0c20df0c6a21e00c20df0c20e00c6a21e10c20e00c20e10c6a21e20c20e10c20e20c6a21e30c20e20c20e3" - "0c6a21e40c20e30c20e4" - "0c6a21e50c20e40c20e50c6a21e60c20e50c20e60c6a21e70c20e60c20e70c6a21e80c20e70c20e80c6a21e90c20e8" - "0c20e90c6a21ea0c20e9" + "20e20a20e30a6a21e40a20e30a20e40a6a21e50a20e40a20e50a6a21e60a20e50a20e60a6a21e70a20e60a20e70a6a" + "21e80a20e70a20e80a6a21e90a20e80a20e90a6a21ea0a20e90a20ea0a6a21eb0a20ea0a20eb0a6a21ec0a20eb0a20" + "ec0a6a21ed0a20ec0a20ed0a6a21ee0a20ed0a20ee0a6a21ef0a20ee0a20ef0a6a21f00a20ef0a20f00a6a21f10a20" + "f00a20f10a6a21f20a20f10a20f20a6a21f30a20f20a20f30a6a21f40a20f30a20f40a6a21f50a20f40a20f50a6a21" + "f60a20f50a20f60a6a21f70a20f60a20f70a6a21f80a20f70a20f80a6a21f90a20f80a20f90a6a21fa0a20f90a20fa" + "0a6a21fb0a20fa0a20fb0a6a21fc0a20fb0a20fc0a6a21fd0a20fc0a20fd0a6a21fe0a20fd0a20fe0a6a21ff0a20fe" + "0a20ff0a6a21800b20ff0a20800b6a21810b20800b20810b6a21820b20810b20820b6a21830b20820b20830b6a2184" + "0b20830b20840b6a21850b20840b20850b6a21860b20850b20860b6a21870b20860b20870b6a21880b20870b20880b" + "6a21890b20880b20890b6a218a0b20890b208a0b6a218b0b208a0b208b0b6a218c0b208b0b208c0b6a218d0b208c0b" + "208d0b6a218e0b208d0b208e0b6a218f0b208e0b208f0b6a21900b208f0b20900b6a21910b20900b20910b6a21920b" + "20910b20920b6a21930b20920b20930b6a21940b20930b20940b6a21950b20940b20950b6a21960b20950b20960b6a" + "21970b20960b20970b6a21980b20970b20980b6a21990b20980b20990b6a219a0b20990b209a0b6a219b0b209a0b20" + "9b0b6a219c0b209b0b209c0b6a219d0b209c0b209d0b6a219e0b209d0b209e0b6a219f0b209e0b209f0b6a21a00b20" + "9f0b20a00b6a21a10b20a00b20a10b6a21a20b20a10b20a20b6a21a30b20a20b20a30b6a21a40b20a30b20a40b6a21" + "a50b20a40b20a50b6a21a60b20a50b20a60b6a21a70b20a60b20a70b6a21a80b20a70b20a80b6a21a90b20a80b20a9" + "0b6a21aa0b20a90b20aa0b6a21ab0b20aa0b20ab0b6a21ac0b20ab0b20ac0b6a21ad0b20ac0b20ad0b6a21ae0b20ad" + "0b20ae0b6a21af0b20ae0b20af0b6a21b00b20af0b20b00b6a21b10b20b00b20b10b6a21b20b20b10b20b20b6a21b3" + "0b20b20b20b30b6a21b40b20b30b20b40b6a21b50b20b40b20b50b6a21b60b20b50b20b60b6a21b70b20b60b20b70b" + "6a21b80b20b70b20b80b6a21b90b20b80b20b90b6a21ba0b20b90b20ba0b6a21bb0b20ba0b20bb0b6a21bc0b20bb0b" + "20bc0b6a21bd0b20bc0b20bd0b6a21be0b20bd0b20be0b6a21bf0b20be0b20bf0b6a21c00b20bf0b20c00b6a21c10b" + "20c00b20c10b6a21c20b20c10b20c20b6a21c30b20c20b20c30b6a21c40b20c30b20c40b6a21c50b20c40b20c50b6a" + "21c60b20c50b20c60b6a21c70b20c60b20c70b6a21c80b20c70b20c80b6a21c90b20c80b20c90b6a21ca0b20c90b20" + "ca0b6a21cb0b20ca0b20cb0b6a21cc0b20cb0b20cc0b6a21cd0b20cc0b20cd0b6a21ce0b20cd0b20ce0b6a21cf0b20" + "ce0b20cf0b6a21d00b20cf0b20d00b6a21d10b20d00b20d10b6a21d20b20d10b20d20b6a21d30b20d20b20d30b6a21" + "d40b20d30b20d40b6a21d50b20d40b20d50b6a21d60b20d50b20d60b6a21d70b20d60b20d70b6a21d80b20d70b20d8" + "0b6a21d90b20d80b20d90b6a21da0b20d90b20da0b6a21db0b20da0b20db0b6a21dc0b20db0b20dc0b6a21dd0b20dc" + "0b20dd0b6a21de0b20dd0b20de0b6a21df0b20de0b20df0b6a21e00b20df0b20e00b6a21e10b20e00b20e10b6a21e2" + "0b20e10b20e20b6a21e30b20e20b20e30b6a21e40b20e30b20e40b6a21e50b20e40b20e50b6a21e60b20e50b20e60b" + "6a21e70b20e60b20e70b6a21e80b20e70b20e80b6a21e90b20e80b20e90b6a21ea0b20e90b20ea0b6a21eb0b20ea0b" + "20eb0b6a21ec0b20eb0b20ec0b6a21ed0b20ec0b20ed0b6a21ee0b20ed0b20ee0b6a21ef0b20ee0b20ef0b6a21f00b" + "20ef0b20f00b6a21f10b20f00b20f10b6a21f20b20f10b20f20b6a21f30b20f20b20f30b6a21f40b20f30b20f40b6a" + "21f50b20f40b20f50b6a21f60b20f50b20f60b6a21f70b20f60b20f70b6a21f80b20f70b20f80b6a21f90b20f80b20" + "f90b6a21fa0b20f90b20fa0b6a21fb0b20fa0b20fb0b6a21fc0b20fb0b20fc0b6a21fd0b20fc0b20fd0b6a21fe0b20" + "fd0b20fe0b6a21ff0b20fe0b20ff0b6a21800c20ff0b20800c6a21810c20800c20810c6a21820c20810c20820c6a21" + "830c20820c20830c6a21840c20830c20840c6a21850c20840c20850c6a21860c20850c20860c6a21870c20860c2087" + "0c6a21880c20870c20880c6a21890c20880c20890c6a218a0c20890c208a0c6a218b0c208a0c208b0c6a218c0c208b" + "0c208c0c6a218d0c208c0c208d0c6a218e0c208d0c208e0c6a218f0c208e0c208f0c6a21900c208f0c20900c6a2191" + "0c20900c20910c6a21920c20910c20920c6a21930c20920c20930c6a21940c20930c20940c6a21950c20940c20950c" + "6a21960c20950c20960c6a21970c20960c20970c6a21980c20970c20980c6a21990c20980c20990c6a219a0c20990c" + "209a0c6a219b0c209a0c209b0c6a219c0c209b0c209c0c6a219d0c209c0c209d0c6a219e0c209d0c209e0c6a219f0c" + "209e0c209f0c6a21a00c209f0c20a00c6a21a10c20a00c20a10c6a21a20c20a10c20a20c6a21a30c20a20c20a30c6a" + "21a40c20a30c20a40c6a21a50c20a40c20a50c6a21a60c20a50c20a60c6a21a70c20a60c20a70c6a21a80c20a70c20" + "a80c6a21a90c20a80c20a90c6a21aa0c20a90c20aa0c6a21ab0c20aa0c20ab0c6a21ac0c20ab0c20ac0c6a21ad0c20" + "ac0c20ad0c6a21ae0c20ad0c20ae0c6a21af0c20ae0c20af0c6a21b00c20af0c20b00c6a21b10c20b00c20b10c6a21" + "b20c20b10c20b20c6a21b30c20b20c20b30c6a21b40c20b30c20b40c6a21b50c20b40c20b50c6a21b60c20b50c20b6" + "0c6a21b70c20b60c20b70c6a21b80c20b70c20b80c6a21b90c20b80c20b90c6a21ba0c20b90c20ba0c6a21bb0c20ba" + "0c20bb0c6a21bc0c20bb0c20bc0c6a21bd0c20bc0c20bd0c6a21be0c20bd0c20be0c6a21bf0c20be0c20bf0c6a21c0" + "0c20bf0c20c00c6a21c10c20c00c20c10c6a21c20c20c10c20c20c6a21c30c20c20c20c30c6a21c40c20c30c20c40c" + "6a21c50c20c40c20c50c6a21c60c20c50c20c60c6a21c70c20c60c20c70c6a21c80c20c70c20c80c6a21c90c20c80c" + "20c90c6a21ca0c20c90c20ca0c6a21cb0c20ca0c20cb0c6a21cc0c20cb0c20cc0c6a21cd0c20cc0c20cd0c6a21ce0c" + "20cd0c20ce0c6a21cf0c20ce0c20cf0c6a21d00c20cf0c20d00c6a21d10c20d00c20d10c6a21d20c20d10c20d20c6a" + "21d30c20d20c20d30c6a21d40c20d30c20d40c6a21d50c20d40c20d50c6a21d60c20d50c20d60c6a21d70c20d60c20" + "d70c6a21d80c20d70c20d80c6a21d90c20d80c20d90c6a21da0c20d90c20da0c6a21db0c20da0c20db0c6a21dc0c20" + "db0c20dc0c6a21dd0c20dc0c20dd0c6a21de0c20dd0c20de0c6a21df0c20de0c20df0c6a21e00c20df0c20e00c6a21" + "e10c20e00c20e10c6a21e20c20e10c20e20c6a21e30c20e20c20e30c6a21e40c20e30c20e40c6a21e50c20e40c20e5" + "0c6a21e60c20e50c20e60c6a21e70c20e60c20e70c6a21e80c20e70c20e80c6a21e90c20e80c20e90c6a21ea0c20e9" "0c20ea0c6a21eb0c20ea0c20eb0c6a21ec0c20eb0c20ec0c6a21ed0c20ec0c20ed0c6a21ee0c20ed0c20ee0c6a21ef" - "0c20ee0c20ef0c6a21f0" - "0c20ef0c20f00c6a21f10c20f00c20f10c6a21f20c20f10c20f20c6a21f30c20f20c20f30c6a21f40c20f30c20f40c" - "6a21f50c20f40c20f50c" - "6a21f60c20f50c20f60c6a21f70c20f60c20f70c6a21f80c20f70c20f80c6a21f90c20f80c20f90c6a21fa0c20f90c" - "20fa0c6a21fb0c20fa0c" - "20fb0c6a21fc0c20fb0c20fc0c6a21fd0c20fc0c20fd0c6a21fe0c20fd0c20fe0c6a21ff0c20fe0c20ff0c6a21800d" - "20ff0c20800d6a21810d" - "20800d20810d6a21820d20810d20820d6a21830d20820d20830d6a21840d20830d20840d6a21850d20840d20850d6a" - "21860d20850d20860d6a" - "21870d20860d20870d6a21880d20870d20880d6a21890d20880d20890d6a218a0d20890d208a0d6a218b0d208a0d20" - "8b0d6a218c0d208b0d20" - "8c0d6a218d0d208c0d208d0d6a218e0d208d0d208e0d6a218f0d208e0d208f0d6a21900d208f0d20900d6a21910d20" - "900d20910d6a21920d20" - "910d20920d6a21930d20920d20930d6a21940d20930d20940d6a21950d20940d20950d6a21960d20950d20960d6a21" - "970d20960d20970d6a21" - "980d20970d20980d6a21990d20980d20990d6a219a0d20990d209a0d6a219b0d209a0d209b0d6a219c0d209b0d209c" - "0d6a219d0d209c0d209d" - "0d6a219e0d209d0d209e0d6a219f0d209e0d209f0d6a21a00d209f0d20a00d6a21a10d20a00d20a10d6a21a20d20a1" - "0d20a20d6a21a30d20a2" - "0d20a30d6a21a40d20a30d20a40d6a21a50d20a40d20a50d6a21a60d20a50d20a60d6a21a70d20a60d20a70d6a21a8" - "0d20a70d20a80d6a21a9" - "0d20a80d20a90d6a21aa0d20a90d20aa0d6a21ab0d20aa0d20ab0d6a21ac0d20ab0d20ac0d6a21ad0d20ac0d20ad0d" - "6a21ae0d20ad0d20ae0d" - "6a21af0d20ae0d20af0d6a21b00d20af0d20b00d6a21b10d20b00d20b10d6a21b20d20b10d20b20d6a21b30d20b20d" - "20b30d6a21b40d20b30d" - "20b40d6a21b50d20b40d20b50d6a21b60d20b50d20b60d6a21b70d20b60d20b70d6a21b80d20b70d20b80d6a21b90d" - "20b80d20b90d6a21ba0d" - "20b90d20ba0d6a21bb0d20ba0d20bb0d6a21bc0d20bb0d20bc0d6a21bd0d20bc0d20bd0d6a21be0d20bd0d20be0d6a" - "21bf0d20be0d20bf0d6a" - "21c00d20bf0d20c00d6a21c10d20c00d20c10d6a21c20d20c10d20c20d6a21c30d20c20d20c30d6a21c40d20c30d20" - "c40d6a21c50d20c40d20" - "c50d6a21c60d20c50d20c60d6a21c70d20c60d20c70d6a21c80d20c70d20c80d6a21c90d20c80d20c90d6a21ca0d20" - "c90d20ca0d6a21cb0d20" - "ca0d20cb0d6a21cc0d20cb0d20cc0d6a21cd0d20cc0d20cd0d6a21ce0d20cd0d20ce0d6a21cf0d20ce0d20cf0d6a21" - "d00d20cf0d20d00d6a21" - "d10d20d00d20d10d6a21d20d20d10d20d20d6a21d30d20d20d20d30d6a21d40d20d30d20d40d6a21d50d20d40d20d5" - "0d6a21d60d20d50d20d6" - "0d6a21d70d20d60d20d70d6a21d80d20d70d20d80d6a21d90d20d80d20d90d6a21da0d20d90d20da0d6a21db0d20da" - "0d20db0d6a21dc0d20db" - "0d20dc0d6a21dd0d20dc0d20dd0d6a21de0d20dd0d20de0d6a21df0d20de0d20df0d6a21e00d20df0d20e00d6a21e1" - "0d20e00d20e10d6a21e2" - "0d20e10d20e20d6a21e30d20e20d20e30d6a21e40d20e30d20e40d6a21e50d20e40d20e50d6a21e60d20e50d20e60d" - "6a21e70d20e60d20e70d" - "6a21e80d20e70d20e80d6a21e90d20e80d20e90d6a21ea0d20e90d20ea0d6a21eb0d20ea0d20eb0d6a21ec0d20eb0d" - "20ec0d6a21ed0d20ec0d" - "20ed0d6a21ee0d20ed0d20ee0d6a21ef0d20ee0d20ef0d6a21f00d20ef0d20f00d6a21f10d20f00d20f10d6a21f20d" - "20f10d20f20d6a21f30d" - "20f20d20f30d6a21f40d20f30d20f40d6a21f50d20f40d20f50d6a21f60d20f50d20f60d6a21f70d20f60d20f70d6a" - "21f80d20f70d20f80d6a" - "21f90d20f80d20f90d6a21fa0d20f90d20fa0d6a21fb0d20fa0d20fb0d6a21fc0d20fb0d20fc0d6a21fd0d20fc0d20" - "fd0d6a21fe0d20fd0d20" - "fe0d6a21ff0d20fe0d20ff0d6a21800e20ff0d20800e6a21810e20800e20810e6a21820e20810e20820e6a21830e20" - "820e20830e6a21840e20" - "830e20840e6a21850e20840e20850e6a21860e20850e20860e6a21870e20860e20870e6a21880e20870e20880e6a21" - "890e20880e20890e6a21" - "8a0e20890e208a0e6a218b0e208a0e208b0e6a218c0e208b0e208c0e6a218d0e208c0e208d0e6a218e0e208d0e208e" - "0e6a218f0e208e0e208f" - "0e6a21900e208f0e20900e6a21910e20900e20910e6a21920e20910e20920e6a21930e20920e20930e6a21940e2093" - "0e20940e6a21950e2094" - "0e20950e6a21960e20950e20960e6a21970e20960e20970e6a21980e20970e20980e6a21990e20980e20990e6a219a" - "0e20990e209a0e6a219b" - "0e209a0e209b0e6a219c0e209b0e209c0e6a219d0e209c0e209d0e6a219e0e209d0e209e0e6a219f0e209e0e209f0e" - "6a21a00e209f0e20a00e" - "6a21a10e20a00e20a10e6a21a20e20a10e20a20e6a21a30e20a20e20a30e6a21a40e20a30e20a40e6a21a50e20a40e" - "20a50e6a21a60e20a50e" - "20a60e6a21a70e20a60e20a70e6a21a80e20a70e20a80e6a21a90e20a80e20a90e6a21aa0e20a90e20aa0e6a21ab0e" - "20aa0e20ab0e6a21ac0e" - "20ab0e20ac0e6a21ad0e20ac0e20ad0e6a21ae0e20ad0e20ae0e6a21af0e20ae0e20af0e6a21b00e20af0e20b00e6a" - "21b10e20b00e20b10e6a" - "21b20e20b10e20b20e6a21b30e20b20e20b30e6a21b40e20b30e20b40e6a21b50e20b40e20b50e6a21b60e20b50e20" - "b60e6a21b70e20b60e20" - "b70e6a21b80e20b70e20b80e6a21b90e20b80e20b90e6a21ba0e20b90e20ba0e6a21bb0e20ba0e20bb0e6a21bc0e20" - "bb0e20bc0e6a21bd0e20" - "bc0e20bd0e6a21be0e20bd0e20be0e6a21bf0e20be0e20bf0e6a21c00e20bf0e20c00e6a21c10e20c00e20c10e6a21" - "c20e20c10e20c20e6a21" - "c30e20c20e20c30e6a21c40e20c30e20c40e6a21c50e20c40e20c50e6a21c60e20c50e20c60e6a21c70e20c60e20c7" - "0e6a21c80e20c70e20c8" - "0e6a21c90e20c80e20c90e6a21ca0e20c90e20ca0e6a21cb0e20ca0e20cb0e6a21cc0e20cb0e20cc0e6a21cd0e20cc" - "0e20cd0e6a21ce0e20cd" - "0e20ce0e6a21cf0e20ce0e20cf0e6a21d00e20cf0e20d00e6a21d10e20d00e20d10e6a21d20e20d10e20d20e6a21d3" - "0e20d20e20d30e6a21d4" - "0e20d30e20d40e6a21d50e20d40e20d50e6a21d60e20d50e20d60e6a21d70e20d60e20d70e6a21d80e20d70e20d80e" - "6a21d90e20d80e20d90e" - "6a21da0e20d90e20da0e6a21db0e20da0e20db0e6a21dc0e20db0e20dc0e6a21dd0e20dc0e20dd0e6a21de0e20dd0e" - "20de0e6a21df0e20de0e" - "20df0e6a21e00e20df0e20e00e6a21e10e20e00e20e10e6a21e20e20e10e20e20e6a21e30e20e20e20e30e6a21e40e" - "20e30e20e40e6a21e50e" - "20e40e20e50e6a21e60e20e50e20e60e6a21e70e20e60e20e70e6a21e80e20e70e20e80e6a21e90e20e80e20e90e6a" - "21ea0e20e90e20ea0e6a" - "21eb0e20ea0e20eb0e6a21ec0e20eb0e20ec0e6a21ed0e20ec0e20ed0e6a21ee0e20ed0e20ee0e6a21ef0e20ee0e20" - "ef0e6a21f00e20ef0e20" - "f00e6a21f10e20f00e20f10e6a21f20e20f10e20f20e6a21f30e20f20e20f30e6a21f40e20f30e20f40e6a21f50e20" - "f40e20f50e6a21f60e20" + "0c20ee0c20ef0c6a21f00c20ef0c20f00c6a21f10c20f00c20f10c6a21f20c20f10c20f20c6a21f30c20f20c20f30c" + "6a21f40c20f30c20f40c6a21f50c20f40c20f50c6a21f60c20f50c20f60c6a21f70c20f60c20f70c6a21f80c20f70c" + "20f80c6a21f90c20f80c20f90c6a21fa0c20f90c20fa0c6a21fb0c20fa0c20fb0c6a21fc0c20fb0c20fc0c6a21fd0c" + "20fc0c20fd0c6a21fe0c20fd0c20fe0c6a21ff0c20fe0c20ff0c6a21800d20ff0c20800d6a21810d20800d20810d6a" + "21820d20810d20820d6a21830d20820d20830d6a21840d20830d20840d6a21850d20840d20850d6a21860d20850d20" + "860d6a21870d20860d20870d6a21880d20870d20880d6a21890d20880d20890d6a218a0d20890d208a0d6a218b0d20" + "8a0d208b0d6a218c0d208b0d208c0d6a218d0d208c0d208d0d6a218e0d208d0d208e0d6a218f0d208e0d208f0d6a21" + "900d208f0d20900d6a21910d20900d20910d6a21920d20910d20920d6a21930d20920d20930d6a21940d20930d2094" + "0d6a21950d20940d20950d6a21960d20950d20960d6a21970d20960d20970d6a21980d20970d20980d6a21990d2098" + "0d20990d6a219a0d20990d209a0d6a219b0d209a0d209b0d6a219c0d209b0d209c0d6a219d0d209c0d209d0d6a219e" + "0d209d0d209e0d6a219f0d209e0d209f0d6a21a00d209f0d20a00d6a21a10d20a00d20a10d6a21a20d20a10d20a20d" + "6a21a30d20a20d20a30d6a21a40d20a30d20a40d6a21a50d20a40d20a50d6a21a60d20a50d20a60d6a21a70d20a60d" + "20a70d6a21a80d20a70d20a80d6a21a90d20a80d20a90d6a21aa0d20a90d20aa0d6a21ab0d20aa0d20ab0d6a21ac0d" + "20ab0d20ac0d6a21ad0d20ac0d20ad0d6a21ae0d20ad0d20ae0d6a21af0d20ae0d20af0d6a21b00d20af0d20b00d6a" + "21b10d20b00d20b10d6a21b20d20b10d20b20d6a21b30d20b20d20b30d6a21b40d20b30d20b40d6a21b50d20b40d20" + "b50d6a21b60d20b50d20b60d6a21b70d20b60d20b70d6a21b80d20b70d20b80d6a21b90d20b80d20b90d6a21ba0d20" + "b90d20ba0d6a21bb0d20ba0d20bb0d6a21bc0d20bb0d20bc0d6a21bd0d20bc0d20bd0d6a21be0d20bd0d20be0d6a21" + "bf0d20be0d20bf0d6a21c00d20bf0d20c00d6a21c10d20c00d20c10d6a21c20d20c10d20c20d6a21c30d20c20d20c3" + "0d6a21c40d20c30d20c40d6a21c50d20c40d20c50d6a21c60d20c50d20c60d6a21c70d20c60d20c70d6a21c80d20c7" + "0d20c80d6a21c90d20c80d20c90d6a21ca0d20c90d20ca0d6a21cb0d20ca0d20cb0d6a21cc0d20cb0d20cc0d6a21cd" + "0d20cc0d20cd0d6a21ce0d20cd0d20ce0d6a21cf0d20ce0d20cf0d6a21d00d20cf0d20d00d6a21d10d20d00d20d10d" + "6a21d20d20d10d20d20d6a21d30d20d20d20d30d6a21d40d20d30d20d40d6a21d50d20d40d20d50d6a21d60d20d50d" + "20d60d6a21d70d20d60d20d70d6a21d80d20d70d20d80d6a21d90d20d80d20d90d6a21da0d20d90d20da0d6a21db0d" + "20da0d20db0d6a21dc0d20db0d20dc0d6a21dd0d20dc0d20dd0d6a21de0d20dd0d20de0d6a21df0d20de0d20df0d6a" + "21e00d20df0d20e00d6a21e10d20e00d20e10d6a21e20d20e10d20e20d6a21e30d20e20d20e30d6a21e40d20e30d20" + "e40d6a21e50d20e40d20e50d6a21e60d20e50d20e60d6a21e70d20e60d20e70d6a21e80d20e70d20e80d6a21e90d20" + "e80d20e90d6a21ea0d20e90d20ea0d6a21eb0d20ea0d20eb0d6a21ec0d20eb0d20ec0d6a21ed0d20ec0d20ed0d6a21" + "ee0d20ed0d20ee0d6a21ef0d20ee0d20ef0d6a21f00d20ef0d20f00d6a21f10d20f00d20f10d6a21f20d20f10d20f2" + "0d6a21f30d20f20d20f30d6a21f40d20f30d20f40d6a21f50d20f40d20f50d6a21f60d20f50d20f60d6a21f70d20f6" + "0d20f70d6a21f80d20f70d20f80d6a21f90d20f80d20f90d6a21fa0d20f90d20fa0d6a21fb0d20fa0d20fb0d6a21fc" + "0d20fb0d20fc0d6a21fd0d20fc0d20fd0d6a21fe0d20fd0d20fe0d6a21ff0d20fe0d20ff0d6a21800e20ff0d20800e" + "6a21810e20800e20810e6a21820e20810e20820e6a21830e20820e20830e6a21840e20830e20840e6a21850e20840e" + "20850e6a21860e20850e20860e6a21870e20860e20870e6a21880e20870e20880e6a21890e20880e20890e6a218a0e" + "20890e208a0e6a218b0e208a0e208b0e6a218c0e208b0e208c0e6a218d0e208c0e208d0e6a218e0e208d0e208e0e6a" + "218f0e208e0e208f0e6a21900e208f0e20900e6a21910e20900e20910e6a21920e20910e20920e6a21930e20920e20" + "930e6a21940e20930e20940e6a21950e20940e20950e6a21960e20950e20960e6a21970e20960e20970e6a21980e20" + "970e20980e6a21990e20980e20990e6a219a0e20990e209a0e6a219b0e209a0e209b0e6a219c0e209b0e209c0e6a21" + "9d0e209c0e209d0e6a219e0e209d0e209e0e6a219f0e209e0e209f0e6a21a00e209f0e20a00e6a21a10e20a00e20a1" + "0e6a21a20e20a10e20a20e6a21a30e20a20e20a30e6a21a40e20a30e20a40e6a21a50e20a40e20a50e6a21a60e20a5" + "0e20a60e6a21a70e20a60e20a70e6a21a80e20a70e20a80e6a21a90e20a80e20a90e6a21aa0e20a90e20aa0e6a21ab" + "0e20aa0e20ab0e6a21ac0e20ab0e20ac0e6a21ad0e20ac0e20ad0e6a21ae0e20ad0e20ae0e6a21af0e20ae0e20af0e" + "6a21b00e20af0e20b00e6a21b10e20b00e20b10e6a21b20e20b10e20b20e6a21b30e20b20e20b30e6a21b40e20b30e" + "20b40e6a21b50e20b40e20b50e6a21b60e20b50e20b60e6a21b70e20b60e20b70e6a21b80e20b70e20b80e6a21b90e" + "20b80e20b90e6a21ba0e20b90e20ba0e6a21bb0e20ba0e20bb0e6a21bc0e20bb0e20bc0e6a21bd0e20bc0e20bd0e6a" + "21be0e20bd0e20be0e6a21bf0e20be0e20bf0e6a21c00e20bf0e20c00e6a21c10e20c00e20c10e6a21c20e20c10e20" + "c20e6a21c30e20c20e20c30e6a21c40e20c30e20c40e6a21c50e20c40e20c50e6a21c60e20c50e20c60e6a21c70e20" + "c60e20c70e6a21c80e20c70e20c80e6a21c90e20c80e20c90e6a21ca0e20c90e20ca0e6a21cb0e20ca0e20cb0e6a21" + "cc0e20cb0e20cc0e6a21cd0e20cc0e20cd0e6a21ce0e20cd0e20ce0e6a21cf0e20ce0e20cf0e6a21d00e20cf0e20d0" + "0e6a21d10e20d00e20d10e6a21d20e20d10e20d20e6a21d30e20d20e20d30e6a21d40e20d30e20d40e6a21d50e20d4" + "0e20d50e6a21d60e20d50e20d60e6a21d70e20d60e20d70e6a21d80e20d70e20d80e6a21d90e20d80e20d90e6a21da" + "0e20d90e20da0e6a21db0e20da0e20db0e6a21dc0e20db0e20dc0e6a21dd0e20dc0e20dd0e6a21de0e20dd0e20de0e" + "6a21df0e20de0e20df0e6a21e00e20df0e20e00e6a21e10e20e00e20e10e6a21e20e20e10e20e20e6a21e30e20e20e" + "20e30e6a21e40e20e30e20e40e6a21e50e20e40e20e50e6a21e60e20e50e20e60e6a21e70e20e60e20e70e6a21e80e" + "20e70e20e80e6a21e90e20e80e20e90e6a21ea0e20e90e20ea0e6a21eb0e20ea0e20eb0e6a21ec0e20eb0e20ec0e6a" + "21ed0e20ec0e20ed0e6a21ee0e20ed0e20ee0e6a21ef0e20ee0e20ef0e6a21f00e20ef0e20f00e6a21f10e20f00e20" + "f10e6a21f20e20f10e20f20e6a21f30e20f20e20f30e6a21f40e20f30e20f40e6a21f50e20f40e20f50e6a21f60e20" "f50e20f60e6a21f70e20f60e20f70e6a21f80e20f70e20f80e6a21f90e20f80e20f90e6a21fa0e20f90e20fa0e6a21" - "fb0e20fa0e20fb0e6a21" - "fc0e20fb0e20fc0e6a21fd0e20fc0e20fd0e6a21fe0e20fd0e20fe0e6a21ff0e20fe0e20ff0e6a21800f20ff0e2080" - "0f6a21810f20800f2081" - "0f6a21820f20810f20820f6a21830f20820f20830f6a21840f20830f20840f6a21850f20840f20850f6a21860f2085" - "0f20860f6a21870f2086" - "0f20870f6a21880f20870f20880f6a21890f20880f20890f6a218a0f20890f208a0f6a218b0f208a0f208b0f6a218c" - "0f208b0f208c0f6a218d" - "0f208c0f208d0f6a218e0f208d0f208e0f6a218f0f208e0f208f0f6a21900f208f0f20900f6a21910f20900f20910f" - "6a21920f20910f20920f" - "6a21930f20920f20930f6a21940f20930f20940f6a21950f20940f20950f6a21960f20950f20960f6a21970f20960f" - "20970f6a21980f20970f" - "20980f6a21990f20980f20990f6a219a0f20990f209a0f6a219b0f209a0f209b0f6a219c0f209b0f209c0f6a219d0f" - "209c0f209d0f6a219e0f" - "209d0f209e0f6a219f0f209e0f209f0f6a21a00f209f0f20a00f6a21a10f20a00f20a10f6a21a20f20a10f20a20f6a" - "21a30f20a20f20a30f6a" - "21a40f20a30f20a40f6a21a50f20a40f20a50f6a21a60f20a50f20a60f6a21a70f20a60f20a70f6a21a80f20a70f20" - "a80f6a21a90f20a80f20" - "a90f6a21aa0f20a90f20aa0f6a21ab0f20aa0f20ab0f6a21ac0f20ab0f20ac0f6a21ad0f20ac0f20ad0f6a21ae0f20" - "ad0f20ae0f6a21af0f20" - "ae0f20af0f6a21b00f20af0f20b00f6a21b10f20b00f20b10f6a21b20f20b10f20b20f6a21b30f20b20f20b30f6a21" - "b40f20b30f20b40f6a21" - "b50f20b40f20b50f6a21b60f20b50f20b60f6a21b70f20b60f20b70f6a21b80f20b70f20b80f6a21b90f20b80f20b9" - "0f6a21ba0f20b90f20ba" - "0f6a21bb0f20ba0f20bb0f6a21bc0f20bb0f20bc0f6a21bd0f20bc0f20bd0f6a21be0f20bd0f20be0f6a21bf0f20be" - "0f20bf0f6a21c00f20bf" - "0f20c00f6a21c10f20c00f20c10f6a21c20f20c10f20c20f6a21c30f20c20f20c30f6a21c40f20c30f20c40f6a21c5" - "0f20c40f20c50f6a21c6" - "0f20c50f20c60f6a21c70f20c60f20c70f6a21c80f20c70f20c80f6a21c90f20c80f20c90f6a21ca0f20c90f20ca0f" - "6a21cb0f20ca0f20cb0f" - "6a21cc0f20cb0f20cc0f6a21cd0f20cc0f20cd0f6a21ce0f20cd0f20ce0f6a21cf0f20ce0f20cf0f6a21d00f20cf0f" - "20d00f6a21d10f20d00f" - "20d10f6a21d20f20d10f20d20f6a21d30f20d20f20d30f6a21d40f20d30f20d40f6a21d50f20d40f20d50f6a21d60f" - "20d50f20d60f6a21d70f" - "20d60f20d70f6a21d80f20d70f20d80f6a21d90f20d80f20d90f6a21da0f20d90f20da0f6a21db0f20da0f20db0f6a" - "21dc0f20db0f20dc0f6a" - "21dd0f20dc0f20dd0f6a21de0f20dd0f20de0f6a21df0f20de0f20df0f6a21e00f20df0f20e00f6a21e10f20e00f20" - "e10f6a21e20f20e10f20" - "e20f6a21e30f20e20f20e30f6a21e40f20e30f20e40f6a21e50f20e40f20e50f6a21e60f20e50f20e60f6a21e70f20" - "e60f20e70f6a21e80f20" - "e70f20e80f6a21e90f20e80f20e90f6a21ea0f20e90f20ea0f6a21eb0f20ea0f20eb0f6a21ec0f20eb0f20ec0f6a21" - "ed0f20ec0f20ed0f6a21" - "ee0f20ed0f20ee0f6a21ef0f20ee0f20ef0f6a21f00f20ef0f20f00f6a21f10f20f00f20f10f6a21f20f20f10f20f2" - "0f6a21f30f20f20f20f3" - "0f6a21f40f20f30f20f40f6a21f50f20f40f20f50f6a21f60f20f50f20f60f6a21f70f20f60f20f70f6a21f80f20f7" - "0f20f80f6a21f90f20f8" - "0f20f90f6a21fa0f20f90f20fa0f6a21fb0f20fa0f20fb0f6a21fc0f20fb0f20fc0f6a21fd0f20fc0f20fd0f6a21fe" - "0f20fd0f20fe0f6a21ff" - "0f20fe0f20ff0f6a21801020ff0f2080106a2181102080102081106a2182102081102082106a218310208210208310" - "6a218410208310208410" - "6a2185102084102085106a2186102085102086106a2187102086102087106a2188102087102088106a218910208810" - "2089106a218a10208910" - "208a106a218b10208a10208b106a218c10208b10208c106a218d10208c10208d106a218e10208d10208e106a218f10" - "208e10208f106a219010" - "208f102090106a2191102090102091106a2192102091102092106a2193102092102093106a2194102093102094106a" - "2195102094102095106a" - "2196102095102096106a2197102096102097106a2198102097102098106a2199102098102099106a219a1020991020" - "9a106a219b10209a1020" - "9b106a219c10209b10209c106a219d10209c10209d106a219e10209d10209e106a219f10209e10209f106a21a01020" - "9f1020a0106a21a11020" - "a01020a1106a21a21020a11020a2106a21a31020a21020a3106a21a41020a31020a4106a21a51020a41020a5106a21" - "a61020a51020a6106a21" - "a71020a61020a7106a21a81020a71020a8106a21a91020a81020a9106a21aa1020a91020aa106a21ab1020aa1020ab" - "106a21ac1020ab1020ac" - "106a21ad1020ac1020ad106a21ae1020ad1020ae106a21af1020ae1020af106a21b01020af1020b0106a21b11020b0" - "1020b1106a21b21020b1" - "1020b2106a21b31020b21020b3106a21b41020b31020b4106a21b51020b41020b5106a21b61020b51020b6106a21b7" - "1020b61020b7106a21b8" - "1020b71020b8106a21b91020b81020b9106a21ba1020b91020ba106a21bb1020ba1020bb106a21bc1020bb1020bc10" - "6a21bd1020bc1020bd10" - "6a21be1020bd1020be106a21bf1020be1020bf106a21c01020bf1020c0106a21c11020c01020c1106a21c21020c110" - "20c2106a21c31020c210" - "20c3106a21c41020c31020c4106a21c51020c41020c5106a21c61020c51020c6106a21c71020c61020c7106a21c810" - "20c71020c8106a21c910" - "20c81020c9106a21ca1020c91020ca106a21cb1020ca1020cb106a21cc1020cb1020cc106a21cd1020cc1020cd106a" - "21ce1020cd1020ce106a" - "21cf1020ce1020cf106a21d01020cf1020d0106a21d11020d01020d1106a21d21020d11020d2106a21d31020d21020" - "d3106a21d41020d31020" - "d4106a21d51020d41020d5106a21d61020d51020d6106a21d71020d61020d7106a21d81020d71020d8106a21d91020" - "d81020d9106a21da1020" - "d91020da106a21db1020da1020db106a21dc1020db1020dc106a21dd1020dc1020dd106a21de1020dd1020de106a21" - "df1020de1020df106a21" - "e01020df1020e0106a21e11020e01020e1106a21e21020e11020e2106a21e31020e21020e3106a21e41020e31020e4" - "106a21e51020e41020e5" - "106a21e61020e51020e6106a21e71020e61020e7106a21e81020e71020e8106a21e91020e81020e9106a21ea1020e9" - "1020ea106a21eb1020ea" - "1020eb106a21ec1020eb1020ec106a21ed1020ec1020ed106a21ee1020ed1020ee106a21ef1020ee1020ef106a21f0" - "1020ef1020f0106a21f1" - "1020f01020f1106a21f21020f11020f2106a21f31020f21020f3106a21f41020f31020f4106a21f51020f41020f510" - "6a21f61020f51020f610" - "6a21f71020f61020f7106a21f81020f71020f8106a21f91020f81020f9106a21fa1020f91020fa106a21fb1020fa10" - "20fb106a21fc1020fb10" - "20fc106a21fd1020fc1020fd106a21fe1020fd1020fe106a21ff1020fe1020ff106a21801120ff102080116a218111" - "2080112081116a218211" + "fb0e20fa0e20fb0e6a21fc0e20fb0e20fc0e6a21fd0e20fc0e20fd0e6a21fe0e20fd0e20fe0e6a21ff0e20fe0e20ff" + "0e6a21800f20ff0e20800f6a21810f20800f20810f6a21820f20810f20820f6a21830f20820f20830f6a21840f2083" + "0f20840f6a21850f20840f20850f6a21860f20850f20860f6a21870f20860f20870f6a21880f20870f20880f6a2189" + "0f20880f20890f6a218a0f20890f208a0f6a218b0f208a0f208b0f6a218c0f208b0f208c0f6a218d0f208c0f208d0f" + "6a218e0f208d0f208e0f6a218f0f208e0f208f0f6a21900f208f0f20900f6a21910f20900f20910f6a21920f20910f" + "20920f6a21930f20920f20930f6a21940f20930f20940f6a21950f20940f20950f6a21960f20950f20960f6a21970f" + "20960f20970f6a21980f20970f20980f6a21990f20980f20990f6a219a0f20990f209a0f6a219b0f209a0f209b0f6a" + "219c0f209b0f209c0f6a219d0f209c0f209d0f6a219e0f209d0f209e0f6a219f0f209e0f209f0f6a21a00f209f0f20" + "a00f6a21a10f20a00f20a10f6a21a20f20a10f20a20f6a21a30f20a20f20a30f6a21a40f20a30f20a40f6a21a50f20" + "a40f20a50f6a21a60f20a50f20a60f6a21a70f20a60f20a70f6a21a80f20a70f20a80f6a21a90f20a80f20a90f6a21" + "aa0f20a90f20aa0f6a21ab0f20aa0f20ab0f6a21ac0f20ab0f20ac0f6a21ad0f20ac0f20ad0f6a21ae0f20ad0f20ae" + "0f6a21af0f20ae0f20af0f6a21b00f20af0f20b00f6a21b10f20b00f20b10f6a21b20f20b10f20b20f6a21b30f20b2" + "0f20b30f6a21b40f20b30f20b40f6a21b50f20b40f20b50f6a21b60f20b50f20b60f6a21b70f20b60f20b70f6a21b8" + "0f20b70f20b80f6a21b90f20b80f20b90f6a21ba0f20b90f20ba0f6a21bb0f20ba0f20bb0f6a21bc0f20bb0f20bc0f" + "6a21bd0f20bc0f20bd0f6a21be0f20bd0f20be0f6a21bf0f20be0f20bf0f6a21c00f20bf0f20c00f6a21c10f20c00f" + "20c10f6a21c20f20c10f20c20f6a21c30f20c20f20c30f6a21c40f20c30f20c40f6a21c50f20c40f20c50f6a21c60f" + "20c50f20c60f6a21c70f20c60f20c70f6a21c80f20c70f20c80f6a21c90f20c80f20c90f6a21ca0f20c90f20ca0f6a" + "21cb0f20ca0f20cb0f6a21cc0f20cb0f20cc0f6a21cd0f20cc0f20cd0f6a21ce0f20cd0f20ce0f6a21cf0f20ce0f20" + "cf0f6a21d00f20cf0f20d00f6a21d10f20d00f20d10f6a21d20f20d10f20d20f6a21d30f20d20f20d30f6a21d40f20" + "d30f20d40f6a21d50f20d40f20d50f6a21d60f20d50f20d60f6a21d70f20d60f20d70f6a21d80f20d70f20d80f6a21" + "d90f20d80f20d90f6a21da0f20d90f20da0f6a21db0f20da0f20db0f6a21dc0f20db0f20dc0f6a21dd0f20dc0f20dd" + "0f6a21de0f20dd0f20de0f6a21df0f20de0f20df0f6a21e00f20df0f20e00f6a21e10f20e00f20e10f6a21e20f20e1" + "0f20e20f6a21e30f20e20f20e30f6a21e40f20e30f20e40f6a21e50f20e40f20e50f6a21e60f20e50f20e60f6a21e7" + "0f20e60f20e70f6a21e80f20e70f20e80f6a21e90f20e80f20e90f6a21ea0f20e90f20ea0f6a21eb0f20ea0f20eb0f" + "6a21ec0f20eb0f20ec0f6a21ed0f20ec0f20ed0f6a21ee0f20ed0f20ee0f6a21ef0f20ee0f20ef0f6a21f00f20ef0f" + "20f00f6a21f10f20f00f20f10f6a21f20f20f10f20f20f6a21f30f20f20f20f30f6a21f40f20f30f20f40f6a21f50f" + "20f40f20f50f6a21f60f20f50f20f60f6a21f70f20f60f20f70f6a21f80f20f70f20f80f6a21f90f20f80f20f90f6a" + "21fa0f20f90f20fa0f6a21fb0f20fa0f20fb0f6a21fc0f20fb0f20fc0f6a21fd0f20fc0f20fd0f6a21fe0f20fd0f20" + "fe0f6a21ff0f20fe0f20ff0f6a21801020ff0f2080106a2181102080102081106a2182102081102082106a21831020" + "82102083106a2184102083102084106a2185102084102085106a2186102085102086106a2187102086102087106a21" + "88102087102088106a2189102088102089106a218a10208910208a106a218b10208a10208b106a218c10208b10208c" + "106a218d10208c10208d106a218e10208d10208e106a218f10208e10208f106a219010208f102090106a2191102090" + "102091106a2192102091102092106a2193102092102093106a2194102093102094106a2195102094102095106a2196" + "102095102096106a2197102096102097106a2198102097102098106a2199102098102099106a219a10209910209a10" + "6a219b10209a10209b106a219c10209b10209c106a219d10209c10209d106a219e10209d10209e106a219f10209e10" + "209f106a21a010209f1020a0106a21a11020a01020a1106a21a21020a11020a2106a21a31020a21020a3106a21a410" + "20a31020a4106a21a51020a41020a5106a21a61020a51020a6106a21a71020a61020a7106a21a81020a71020a8106a" + "21a91020a81020a9106a21aa1020a91020aa106a21ab1020aa1020ab106a21ac1020ab1020ac106a21ad1020ac1020" + "ad106a21ae1020ad1020ae106a21af1020ae1020af106a21b01020af1020b0106a21b11020b01020b1106a21b21020" + "b11020b2106a21b31020b21020b3106a21b41020b31020b4106a21b51020b41020b5106a21b61020b51020b6106a21" + "b71020b61020b7106a21b81020b71020b8106a21b91020b81020b9106a21ba1020b91020ba106a21bb1020ba1020bb" + "106a21bc1020bb1020bc106a21bd1020bc1020bd106a21be1020bd1020be106a21bf1020be1020bf106a21c01020bf" + "1020c0106a21c11020c01020c1106a21c21020c11020c2106a21c31020c21020c3106a21c41020c31020c4106a21c5" + "1020c41020c5106a21c61020c51020c6106a21c71020c61020c7106a21c81020c71020c8106a21c91020c81020c910" + "6a21ca1020c91020ca106a21cb1020ca1020cb106a21cc1020cb1020cc106a21cd1020cc1020cd106a21ce1020cd10" + "20ce106a21cf1020ce1020cf106a21d01020cf1020d0106a21d11020d01020d1106a21d21020d11020d2106a21d310" + "20d21020d3106a21d41020d31020d4106a21d51020d41020d5106a21d61020d51020d6106a21d71020d61020d7106a" + "21d81020d71020d8106a21d91020d81020d9106a21da1020d91020da106a21db1020da1020db106a21dc1020db1020" + "dc106a21dd1020dc1020dd106a21de1020dd1020de106a21df1020de1020df106a21e01020df1020e0106a21e11020" + "e01020e1106a21e21020e11020e2106a21e31020e21020e3106a21e41020e31020e4106a21e51020e41020e5106a21" + "e61020e51020e6106a21e71020e61020e7106a21e81020e71020e8106a21e91020e81020e9106a21ea1020e91020ea" + "106a21eb1020ea1020eb106a21ec1020eb1020ec106a21ed1020ec1020ed106a21ee1020ed1020ee106a21ef1020ee" + "1020ef106a21f01020ef1020f0106a21f11020f01020f1106a21f21020f11020f2106a21f31020f21020f3106a21f4" + "1020f31020f4106a21f51020f41020f5106a21f61020f51020f6106a21f71020f61020f7106a21f81020f71020f810" + "6a21f91020f81020f9106a21fa1020f91020fa106a21fb1020fa1020fb106a21fc1020fb1020fc106a21fd1020fc10" + "20fd106a21fe1020fd1020fe106a21ff1020fe1020ff106a21801120ff102080116a2181112080112081116a218211" "2081112082116a2183112082112083116a2184112083112084116a2185112084112085116a2186112085112086116a" - "2187112086112087116a" - "2188112087112088116a2189112088112089116a218a11208911208a116a218b11208a11208b116a218c11208b1120" - "8c116a218d11208c1120" - "8d116a218e11208d11208e116a218f11208e11208f116a219011208f112090116a2191112090112091116a21921120" - "91112092116a21931120" - "92112093116a2194112093112094116a2195112094112095116a2196112095112096116a2197112096112097116a21" - "98112097112098116a21" - "99112098112099116a219a11209911209a116a219b11209a11209b116a219c11209b11209c116a219d11209c11209d" - "116a219e11209d11209e" - "116a219f11209e11209f116a21a011209f1120a0116a21a11120a01120a1116a21a21120a11120a2116a21a31120a2" - "1120a3116a21a41120a3" - "1120a4116a21a51120a41120a5116a21a61120a51120a6116a21a71120a61120a7116a21a81120a71120a8116a21a9" - "1120a81120a9116a21aa" - "1120a91120aa116a21ab1120aa1120ab116a21ac1120ab1120ac116a21ad1120ac1120ad116a21ae1120ad1120ae11" - "6a21af1120ae1120af11" - "6a21b01120af1120b0116a21b11120b01120b1116a21b21120b11120b2116a21b31120b21120b3116a21b41120b311" - "20b4116a21b51120b411" - "20b5116a21b61120b51120b6116a21b71120b61120b7116a21b81120b71120b8116a21b91120b81120b9116a21ba11" - "20b91120ba116a21bb11" - "20ba1120bb116a21bc1120bb1120bc116a21bd1120bc1120bd116a21be1120bd1120be116a21bf1120be1120bf116a" - "21c01120bf1120c0116a" - "21c11120c01120c1116a21c21120c11120c2116a21c31120c21120c3116a21c41120c31120c4116a21c51120c41120" - "c5116a21c61120c51120" - "c6116a21c71120c61120c7116a21c81120c71120c8116a21c91120c81120c9116a21ca1120c91120ca116a21cb1120" - "ca1120cb116a21cc1120" - "cb1120cc116a21cd1120cc1120cd116a21ce1120cd1120ce116a21cf1120ce1120cf116a21d01120cf1120d0116a21" - "d11120d01120d1116a21" - "d21120d11120d2116a21d31120d21120d3116a21d41120d31120d4116a21d51120d41120d5116a21d61120d51120d6" - "116a21d71120d61120d7" - "116a21d81120d71120d8116a21d91120d81120d9116a21da1120d91120da116a21db1120da1120db116a21dc1120db" - "1120dc116a21dd1120dc" - "1120dd116a21de1120dd1120de116a21df1120de1120df116a21e01120df1120e0116a21e11120e01120e1116a21e2" - "1120e11120e2116a21e3" - "1120e21120e3116a21e41120e31120e4116a21e51120e41120e5116a21e61120e51120e6116a21e71120e61120e711" - "6a21e81120e71120e811" - "6a21e91120e81120e9116a21ea1120e91120ea116a21eb1120ea1120eb116a21ec1120eb1120ec116a21ed1120ec11" - "20ed116a21ee1120ed11" - "20ee116a21ef1120ee1120ef116a21f01120ef1120f0116a21f11120f01120f1116a21f21120f11120f2116a21f311" - "20f21120f3116a21f411" - "20f31120f4116a21f51120f41120f5116a21f61120f51120f6116a21f71120f61120f7116a21f81120f71120f8116a" - "21f91120f81120f9116a" - "21fa1120f91120fa116a21fb1120fa1120fb116a21fc1120fb1120fc116a21fd1120fc1120fd116a21fe1120fd1120" - "fe116a21ff1120fe1120" - "ff116a21801220ff112080126a2181122080122081126a2182122081122082126a2183122082122083126a21841220" - "83122084126a21851220" - "84122085126a2186122085122086126a2187122086122087126a2188122087122088126a2189122088122089126a21" - "8a12208912208a126a21" - "8b12208a12208b126a218c12208b12208c126a218d12208c12208d126a218e12208d12208e126a218f12208e12208f" - "126a219012208f122090" - "126a2191122090122091126a2192122091122092126a2193122092122093126a2194122093122094126a2195122094" - "122095126a2196122095" - "122096126a2197122096122097126a2198122097122098126a2199122098122099126a219a12209912209a126a219b" - "12209a12209b126a219c" - "12209b12209c126a219d12209c12209d126a219e12209d12209e126a219f12209e12209f126a21a012209f1220a012" - "6a21a11220a01220a112" - "6a21a21220a11220a2126a21a31220a21220a3126a21a41220a31220a4126a21a51220a41220a5126a21a61220a512" - "20a6126a21a71220a612" - "20a7126a21a81220a71220a8126a21a91220a81220a9126a21aa1220a91220aa126a21ab1220aa1220ab126a21ac12" - "20ab1220ac126a21ad12" - "20ac1220ad126a21ae1220ad1220ae126a21af1220ae1220af126a21b01220af1220b0126a21b11220b01220b1126a" - "21b21220b11220b2126a" - "21b31220b21220b3126a21b41220b31220b4126a21b51220b41220b5126a21b61220b51220b6126a21b71220b61220" - "b7126a21b81220b71220" - "b8126a21b91220b81220b9126a21ba1220b91220ba126a21bb1220ba1220bb126a21bc1220bb1220bc126a21bd1220" - "bc1220bd126a21be1220" - "bd1220be126a21bf1220be1220bf126a21c01220bf1220c0126a21c11220c01220c1126a21c21220c11220c2126a21" - "c31220c21220c3126a21" - "c41220c31220c4126a21c51220c41220c5126a21c61220c51220c6126a21c71220c61220c7126a21c81220c71220c8" - "126a21c91220c81220c9" - "126a21ca1220c91220ca126a21cb1220ca1220cb126a21cc1220cb1220cc126a21cd1220cc1220cd126a21ce1220cd" - "1220ce126a21cf1220ce" - "1220cf126a21d01220cf1220d0126a21d11220d01220d1126a21d21220d11220d2126a21d31220d21220d3126a21d4" - "1220d31220d4126a21d5" - "1220d41220d5126a21d61220d51220d6126a21d71220d61220d7126a21d81220d71220d8126a21d91220d81220d912" - "6a21da1220d91220da12" - "6a21db1220da1220db126a21dc1220db1220dc126a21dd1220dc1220dd126a21de1220dd1220de126a21df1220de12" - "20df126a21e01220df12" - "20e0126a21e11220e01220e1126a21e21220e11220e2126a21e31220e21220e3126a21e41220e31220e4126a21e512" - "20e41220e5126a21e612" - "20e51220e6126a21e71220e61220e7126a21e81220e71220e8126a21e91220e81220e9126a21ea1220e91220ea126a" - "21eb1220ea1220eb126a" - "21ec1220eb1220ec126a21ed1220ec1220ed126a21ee1220ed1220ee126a21ef1220ee1220ef126a21f01220ef1220" - "f0126a21f11220f01220" - "f1126a21f21220f11220f2126a21f31220f21220f3126a21f41220f31220f4126a21f51220f41220f5126a21f61220" - "f51220f6126a21f71220" - "f61220f7126a21f81220f71220f8126a21f91220f81220f9126a21fa1220f91220fa126a21fb1220fa1220fb126a21" - "fc1220fb1220fc126a21" - "fd1220fc1220fd126a21fe1220fd1220fe126a21ff1220fe1220ff126a21801320ff122080136a2181132080132081" - "136a2182132081132082" - "136a2183132082132083136a2184132083132084136a2185132084132085136a2186132085132086136a2187132086" - "132087136a2188132087" - "132088136a2189132088132089136a218a13208913208a136a218b13208a13208b136a218c13208b13208c136a218d" - "13208c13208d136a218e" + "2187112086112087116a2188112087112088116a2189112088112089116a218a11208911208a116a218b11208a1120" + "8b116a218c11208b11208c116a218d11208c11208d116a218e11208d11208e116a218f11208e11208f116a21901120" + "8f112090116a2191112090112091116a2192112091112092116a2193112092112093116a2194112093112094116a21" + "95112094112095116a2196112095112096116a2197112096112097116a2198112097112098116a2199112098112099" + "116a219a11209911209a116a219b11209a11209b116a219c11209b11209c116a219d11209c11209d116a219e11209d" + "11209e116a219f11209e11209f116a21a011209f1120a0116a21a11120a01120a1116a21a21120a11120a2116a21a3" + "1120a21120a3116a21a41120a31120a4116a21a51120a41120a5116a21a61120a51120a6116a21a71120a61120a711" + "6a21a81120a71120a8116a21a91120a81120a9116a21aa1120a91120aa116a21ab1120aa1120ab116a21ac1120ab11" + "20ac116a21ad1120ac1120ad116a21ae1120ad1120ae116a21af1120ae1120af116a21b01120af1120b0116a21b111" + "20b01120b1116a21b21120b11120b2116a21b31120b21120b3116a21b41120b31120b4116a21b51120b41120b5116a" + "21b61120b51120b6116a21b71120b61120b7116a21b81120b71120b8116a21b91120b81120b9116a21ba1120b91120" + "ba116a21bb1120ba1120bb116a21bc1120bb1120bc116a21bd1120bc1120bd116a21be1120bd1120be116a21bf1120" + "be1120bf116a21c01120bf1120c0116a21c11120c01120c1116a21c21120c11120c2116a21c31120c21120c3116a21" + "c41120c31120c4116a21c51120c41120c5116a21c61120c51120c6116a21c71120c61120c7116a21c81120c71120c8" + "116a21c91120c81120c9116a21ca1120c91120ca116a21cb1120ca1120cb116a21cc1120cb1120cc116a21cd1120cc" + "1120cd116a21ce1120cd1120ce116a21cf1120ce1120cf116a21d01120cf1120d0116a21d11120d01120d1116a21d2" + "1120d11120d2116a21d31120d21120d3116a21d41120d31120d4116a21d51120d41120d5116a21d61120d51120d611" + "6a21d71120d61120d7116a21d81120d71120d8116a21d91120d81120d9116a21da1120d91120da116a21db1120da11" + "20db116a21dc1120db1120dc116a21dd1120dc1120dd116a21de1120dd1120de116a21df1120de1120df116a21e011" + "20df1120e0116a21e11120e01120e1116a21e21120e11120e2116a21e31120e21120e3116a21e41120e31120e4116a" + "21e51120e41120e5116a21e61120e51120e6116a21e71120e61120e7116a21e81120e71120e8116a21e91120e81120" + "e9116a21ea1120e91120ea116a21eb1120ea1120eb116a21ec1120eb1120ec116a21ed1120ec1120ed116a21ee1120" + "ed1120ee116a21ef1120ee1120ef116a21f01120ef1120f0116a21f11120f01120f1116a21f21120f11120f2116a21" + "f31120f21120f3116a21f41120f31120f4116a21f51120f41120f5116a21f61120f51120f6116a21f71120f61120f7" + "116a21f81120f71120f8116a21f91120f81120f9116a21fa1120f91120fa116a21fb1120fa1120fb116a21fc1120fb" + "1120fc116a21fd1120fc1120fd116a21fe1120fd1120fe116a21ff1120fe1120ff116a21801220ff112080126a2181" + "122080122081126a2182122081122082126a2183122082122083126a2184122083122084126a218512208412208512" + "6a2186122085122086126a2187122086122087126a2188122087122088126a2189122088122089126a218a12208912" + "208a126a218b12208a12208b126a218c12208b12208c126a218d12208c12208d126a218e12208d12208e126a218f12" + "208e12208f126a219012208f122090126a2191122090122091126a2192122091122092126a2193122092122093126a" + "2194122093122094126a2195122094122095126a2196122095122096126a2197122096122097126a21981220971220" + "98126a2199122098122099126a219a12209912209a126a219b12209a12209b126a219c12209b12209c126a219d1220" + "9c12209d126a219e12209d12209e126a219f12209e12209f126a21a012209f1220a0126a21a11220a01220a1126a21" + "a21220a11220a2126a21a31220a21220a3126a21a41220a31220a4126a21a51220a41220a5126a21a61220a51220a6" + "126a21a71220a61220a7126a21a81220a71220a8126a21a91220a81220a9126a21aa1220a91220aa126a21ab1220aa" + "1220ab126a21ac1220ab1220ac126a21ad1220ac1220ad126a21ae1220ad1220ae126a21af1220ae1220af126a21b0" + "1220af1220b0126a21b11220b01220b1126a21b21220b11220b2126a21b31220b21220b3126a21b41220b31220b412" + "6a21b51220b41220b5126a21b61220b51220b6126a21b71220b61220b7126a21b81220b71220b8126a21b91220b812" + "20b9126a21ba1220b91220ba126a21bb1220ba1220bb126a21bc1220bb1220bc126a21bd1220bc1220bd126a21be12" + "20bd1220be126a21bf1220be1220bf126a21c01220bf1220c0126a21c11220c01220c1126a21c21220c11220c2126a" + "21c31220c21220c3126a21c41220c31220c4126a21c51220c41220c5126a21c61220c51220c6126a21c71220c61220" + "c7126a21c81220c71220c8126a21c91220c81220c9126a21ca1220c91220ca126a21cb1220ca1220cb126a21cc1220" + "cb1220cc126a21cd1220cc1220cd126a21ce1220cd1220ce126a21cf1220ce1220cf126a21d01220cf1220d0126a21" + "d11220d01220d1126a21d21220d11220d2126a21d31220d21220d3126a21d41220d31220d4126a21d51220d41220d5" + "126a21d61220d51220d6126a21d71220d61220d7126a21d81220d71220d8126a21d91220d81220d9126a21da1220d9" + "1220da126a21db1220da1220db126a21dc1220db1220dc126a21dd1220dc1220dd126a21de1220dd1220de126a21df" + "1220de1220df126a21e01220df1220e0126a21e11220e01220e1126a21e21220e11220e2126a21e31220e21220e312" + "6a21e41220e31220e4126a21e51220e41220e5126a21e61220e51220e6126a21e71220e61220e7126a21e81220e712" + "20e8126a21e91220e81220e9126a21ea1220e91220ea126a21eb1220ea1220eb126a21ec1220eb1220ec126a21ed12" + "20ec1220ed126a21ee1220ed1220ee126a21ef1220ee1220ef126a21f01220ef1220f0126a21f11220f01220f1126a" + "21f21220f11220f2126a21f31220f21220f3126a21f41220f31220f4126a21f51220f41220f5126a21f61220f51220" + "f6126a21f71220f61220f7126a21f81220f71220f8126a21f91220f81220f9126a21fa1220f91220fa126a21fb1220" + "fa1220fb126a21fc1220fb1220fc126a21fd1220fc1220fd126a21fe1220fd1220fe126a21ff1220fe1220ff126a21" + "801320ff122080136a2181132080132081136a2182132081132082136a2183132082132083136a2184132083132084" + "136a2185132084132085136a2186132085132086136a2187132086132087136a2188132087132088136a2189132088" + "132089136a218a13208913208a136a218b13208a13208b136a218c13208b13208c136a218d13208c13208d136a218e" "13208d13208e136a218f13208e13208f136a219013208f132090136a2191132090132091136a219213209113209213" - "6a219313209213209313" - "6a2194132093132094136a2195132094132095136a2196132095132096136a2197132096132097136a219813209713" - "2098136a219913209813" - "2099136a219a13209913209a136a219b13209a13209b136a219c13209b13209c136a219d13209c13209d136a219e13" - "209d13209e136a219f13" - "209e13209f136a21a013209f1320a0136a21a11320a01320a1136a21a21320a11320a2136a21a31320a21320a3136a" - "21a41320a31320a4136a" - "21a51320a41320a5136a21a61320a51320a6136a21a71320a61320a7136a21a81320a71320a8136a21a91320a81320" - "a9136a21aa1320a91320" - "aa136a21ab1320aa1320ab136a21ac1320ab1320ac136a21ad1320ac1320ad136a21ae1320ad1320ae136a21af1320" - "ae1320af136a21b01320" - "af1320b0136a21b11320b01320b1136a21b21320b11320b2136a21b31320b21320b3136a21b41320b31320b4136a21" - "b51320b41320b5136a21" - "b61320b51320b6136a21b71320b61320b7136a21b81320b71320b8136a21b91320b81320b9136a21ba1320b91320ba" - "136a21bb1320ba1320bb" - "136a21bc1320bb1320bc136a21bd1320bc1320bd136a21be1320bd1320be136a21bf1320be1320bf136a21c01320bf" - "1320c0136a21c11320c0" - "1320c1136a21c21320c11320c2136a21c31320c21320c3136a21c41320c31320c4136a21c51320c41320c5136a21c6" - "1320c51320c6136a21c7" - "1320c61320c7136a21c81320c71320c8136a21c91320c81320c9136a21ca1320c91320ca136a21cb1320ca1320cb13" - "6a21cc1320cb1320cc13" - "6a21cd1320cc1320cd136a21ce1320cd1320ce136a21cf1320ce1320cf136a21d01320cf1320d0136a21d11320d013" - "20d1136a21d21320d113" - "20d2136a21d31320d21320d3136a21d41320d31320d4136a21d51320d41320d5136a21d61320d51320d6136a21d713" - "20d61320d7136a21d813" - "20d71320d8136a21d91320d81320d9136a21da1320d91320da136a21db1320da1320db136a21dc1320db1320dc136a" - "21dd1320dc1320dd136a" - "21de1320dd1320de136a21df1320de1320df136a21e01320df1320e0136a21e11320e01320e1136a21e21320e11320" - "e2136a21e31320e21320" - "e3136a21e41320e31320e4136a21e51320e41320e5136a21e61320e51320e6136a21e71320e61320e7136a21e81320" - "e71320e8136a21e91320" - "e81320e9136a21ea1320e91320ea136a21eb1320ea1320eb136a21ec1320eb1320ec136a21ed1320ec1320ed136a21" - "ee1320ed1320ee136a21" - "ef1320ee1320ef136a21f01320ef1320f0136a21f11320f01320f1136a21f21320f11320f2136a21f31320f21320f3" - "136a21f41320f31320f4" - "136a21f51320f41320f5136a21f61320f51320f6136a21f71320f61320f7136a21f81320f71320f8136a21f91320f8" - "1320f9136a21fa1320f9" - "1320fa136a21fb1320fa1320fb136a21fc1320fb1320fc136a21fd1320fc1320fd136a21fe1320fd1320fe136a21ff" - "1320fe1320ff136a2180" - "1420ff132080146a2181142080142081146a2182142081142082146a2183142082142083146a218414208314208414" - "6a218514208414208514" - "6a2186142085142086146a2187142086142087146a2188142087142088146a2189142088142089146a218a14208914" - "208a146a218b14208a14" - "208b146a218c14208b14208c146a218d14208c14208d146a218e14208d14208e146a218f14208e14208f146a219014" - "208f142090146a219114" - "2090142091146a2192142091142092146a2193142092142093146a2194142093142094146a2195142094142095146a" - "2196142095142096146a" - "2197142096142097146a2198142097142098146a2199142098142099146a219a14209914209a146a219b14209a1420" - "9b146a219c14209b1420" - "9c146a219d14209c14209d146a219e14209d14209e146a219f14209e14209f146a21a014209f1420a0146a21a11420" - "a01420a1146a21a21420" - "a11420a2146a21a31420a21420a3146a21a41420a31420a4146a21a51420a41420a5146a21a61420a51420a6146a21" - "a71420a61420a7146a21" - "a81420a71420a8146a21a91420a81420a9146a21aa1420a91420aa146a21ab1420aa1420ab146a21ac1420ab1420ac" - "146a21ad1420ac1420ad" - "146a21ae1420ad1420ae146a21af1420ae1420af146a21b01420af1420b0146a21b11420b01420b1146a21b21420b1" - "1420b2146a21b31420b2" - "1420b3146a21b41420b31420b4146a21b51420b41420b5146a21b61420b51420b6146a21b71420b61420b7146a21b8" - "1420b71420b8146a21b9" - "1420b81420b9146a21ba1420b91420ba146a21bb1420ba1420bb146a21bc1420bb1420bc146a21bd1420bc1420bd14" - "6a21be1420bd1420be14" - "6a21bf1420be1420bf146a21c01420bf1420c0146a21c11420c01420c1146a21c21420c11420c2146a21c31420c214" - "20c3146a21c41420c314" - "20c4146a21c51420c41420c5146a21c61420c51420c6146a21c71420c61420c7146a21c81420c71420c8146a21c914" - "20c81420c9146a21ca14" - "20c91420ca146a21cb1420ca1420cb146a21cc1420cb1420cc146a21cd1420cc1420cd146a21ce1420cd1420ce146a" - "21cf1420ce1420cf146a" - "21d01420cf1420d0146a21d11420d01420d1146a21d21420d11420d2146a21d31420d21420d3146a21d41420d31420" - "d4146a21d51420d41420" - "d5146a21d61420d51420d6146a21d71420d61420d7146a21d81420d71420d8146a21d91420d81420d9146a21da1420" - "d91420da146a21db1420" - "da1420db146a21dc1420db1420dc146a21dd1420dc1420dd146a21de1420dd1420de146a21df1420de1420df146a21" - "e01420df1420e0146a21" - "e11420e01420e1146a21e21420e11420e2146a21e31420e21420e3146a21e41420e31420e4146a21e51420e41420e5" - "146a21e61420e51420e6" - "146a21e71420e61420e7146a21e81420e71420e8146a21e91420e81420e9146a21ea1420e91420ea146a21eb1420ea" - "1420eb146a21ec1420eb" - "1420ec146a21ed1420ec1420ed146a21ee1420ed1420ee146a21ef1420ee1420ef146a21f01420ef1420f0146a21f1" - "1420f01420f1146a21f2" - "1420f11420f2146a21f31420f21420f3146a21f41420f31420f4146a21f51420f41420f5146a21f61420f51420f614" - "6a21f71420f61420f714" - "6a21f81420f71420f8146a21f91420f81420f9146a21fa1420f91420fa146a21fb1420fa1420fb146a21fc1420fb14" - "20fc146a21fd1420fc14" - "20fd146a21fe1420fd1420fe146a21ff1420fe1420ff146a21801520ff142080156a2181152080152081156a218215" - "2081152082156a218315" - "2082152083156a2184152083152084156a2185152084152085156a2186152085152086156a2187152086152087156a" - "2188152087152088156a" - "2189152088152089156a218a15208915208a156a218b15208a15208b156a218c15208b15208c156a218d15208c1520" - "8d156a218e15208d1520" - "8e156a218f15208e15208f156a219015208f152090156a2191152090152091156a2192152091152092156a21931520" - "92152093156a21941520" - "93152094156a2195152094152095156a2196152095152096156a2197152096152097156a2198152097152098156a21" - "99152098152099156a21" + "6a2193132092132093136a2194132093132094136a2195132094132095136a2196132095132096136a219713209613" + "2097136a2198132097132098136a2199132098132099136a219a13209913209a136a219b13209a13209b136a219c13" + "209b13209c136a219d13209c13209d136a219e13209d13209e136a219f13209e13209f136a21a013209f1320a0136a" + "21a11320a01320a1136a21a21320a11320a2136a21a31320a21320a3136a21a41320a31320a4136a21a51320a41320" + "a5136a21a61320a51320a6136a21a71320a61320a7136a21a81320a71320a8136a21a91320a81320a9136a21aa1320" + "a91320aa136a21ab1320aa1320ab136a21ac1320ab1320ac136a21ad1320ac1320ad136a21ae1320ad1320ae136a21" + "af1320ae1320af136a21b01320af1320b0136a21b11320b01320b1136a21b21320b11320b2136a21b31320b21320b3" + "136a21b41320b31320b4136a21b51320b41320b5136a21b61320b51320b6136a21b71320b61320b7136a21b81320b7" + "1320b8136a21b91320b81320b9136a21ba1320b91320ba136a21bb1320ba1320bb136a21bc1320bb1320bc136a21bd" + "1320bc1320bd136a21be1320bd1320be136a21bf1320be1320bf136a21c01320bf1320c0136a21c11320c01320c113" + "6a21c21320c11320c2136a21c31320c21320c3136a21c41320c31320c4136a21c51320c41320c5136a21c61320c513" + "20c6136a21c71320c61320c7136a21c81320c71320c8136a21c91320c81320c9136a21ca1320c91320ca136a21cb13" + "20ca1320cb136a21cc1320cb1320cc136a21cd1320cc1320cd136a21ce1320cd1320ce136a21cf1320ce1320cf136a" + "21d01320cf1320d0136a21d11320d01320d1136a21d21320d11320d2136a21d31320d21320d3136a21d41320d31320" + "d4136a21d51320d41320d5136a21d61320d51320d6136a21d71320d61320d7136a21d81320d71320d8136a21d91320" + "d81320d9136a21da1320d91320da136a21db1320da1320db136a21dc1320db1320dc136a21dd1320dc1320dd136a21" + "de1320dd1320de136a21df1320de1320df136a21e01320df1320e0136a21e11320e01320e1136a21e21320e11320e2" + "136a21e31320e21320e3136a21e41320e31320e4136a21e51320e41320e5136a21e61320e51320e6136a21e71320e6" + "1320e7136a21e81320e71320e8136a21e91320e81320e9136a21ea1320e91320ea136a21eb1320ea1320eb136a21ec" + "1320eb1320ec136a21ed1320ec1320ed136a21ee1320ed1320ee136a21ef1320ee1320ef136a21f01320ef1320f013" + "6a21f11320f01320f1136a21f21320f11320f2136a21f31320f21320f3136a21f41320f31320f4136a21f51320f413" + "20f5136a21f61320f51320f6136a21f71320f61320f7136a21f81320f71320f8136a21f91320f81320f9136a21fa13" + "20f91320fa136a21fb1320fa1320fb136a21fc1320fb1320fc136a21fd1320fc1320fd136a21fe1320fd1320fe136a" + "21ff1320fe1320ff136a21801420ff132080146a2181142080142081146a2182142081142082146a21831420821420" + "83146a2184142083142084146a2185142084142085146a2186142085142086146a2187142086142087146a21881420" + "87142088146a2189142088142089146a218a14208914208a146a218b14208a14208b146a218c14208b14208c146a21" + "8d14208c14208d146a218e14208d14208e146a218f14208e14208f146a219014208f142090146a2191142090142091" + "146a2192142091142092146a2193142092142093146a2194142093142094146a2195142094142095146a2196142095" + "142096146a2197142096142097146a2198142097142098146a2199142098142099146a219a14209914209a146a219b" + "14209a14209b146a219c14209b14209c146a219d14209c14209d146a219e14209d14209e146a219f14209e14209f14" + "6a21a014209f1420a0146a21a11420a01420a1146a21a21420a11420a2146a21a31420a21420a3146a21a41420a314" + "20a4146a21a51420a41420a5146a21a61420a51420a6146a21a71420a61420a7146a21a81420a71420a8146a21a914" + "20a81420a9146a21aa1420a91420aa146a21ab1420aa1420ab146a21ac1420ab1420ac146a21ad1420ac1420ad146a" + "21ae1420ad1420ae146a21af1420ae1420af146a21b01420af1420b0146a21b11420b01420b1146a21b21420b11420" + "b2146a21b31420b21420b3146a21b41420b31420b4146a21b51420b41420b5146a21b61420b51420b6146a21b71420" + "b61420b7146a21b81420b71420b8146a21b91420b81420b9146a21ba1420b91420ba146a21bb1420ba1420bb146a21" + "bc1420bb1420bc146a21bd1420bc1420bd146a21be1420bd1420be146a21bf1420be1420bf146a21c01420bf1420c0" + "146a21c11420c01420c1146a21c21420c11420c2146a21c31420c21420c3146a21c41420c31420c4146a21c51420c4" + "1420c5146a21c61420c51420c6146a21c71420c61420c7146a21c81420c71420c8146a21c91420c81420c9146a21ca" + "1420c91420ca146a21cb1420ca1420cb146a21cc1420cb1420cc146a21cd1420cc1420cd146a21ce1420cd1420ce14" + "6a21cf1420ce1420cf146a21d01420cf1420d0146a21d11420d01420d1146a21d21420d11420d2146a21d31420d214" + "20d3146a21d41420d31420d4146a21d51420d41420d5146a21d61420d51420d6146a21d71420d61420d7146a21d814" + "20d71420d8146a21d91420d81420d9146a21da1420d91420da146a21db1420da1420db146a21dc1420db1420dc146a" + "21dd1420dc1420dd146a21de1420dd1420de146a21df1420de1420df146a21e01420df1420e0146a21e11420e01420" + "e1146a21e21420e11420e2146a21e31420e21420e3146a21e41420e31420e4146a21e51420e41420e5146a21e61420" + "e51420e6146a21e71420e61420e7146a21e81420e71420e8146a21e91420e81420e9146a21ea1420e91420ea146a21" + "eb1420ea1420eb146a21ec1420eb1420ec146a21ed1420ec1420ed146a21ee1420ed1420ee146a21ef1420ee1420ef" + "146a21f01420ef1420f0146a21f11420f01420f1146a21f21420f11420f2146a21f31420f21420f3146a21f41420f3" + "1420f4146a21f51420f41420f5146a21f61420f51420f6146a21f71420f61420f7146a21f81420f71420f8146a21f9" + "1420f81420f9146a21fa1420f91420fa146a21fb1420fa1420fb146a21fc1420fb1420fc146a21fd1420fc1420fd14" + "6a21fe1420fd1420fe146a21ff1420fe1420ff146a21801520ff142080156a2181152080152081156a218215208115" + "2082156a2183152082152083156a2184152083152084156a2185152084152085156a2186152085152086156a218715" + "2086152087156a2188152087152088156a2189152088152089156a218a15208915208a156a218b15208a15208b156a" + "218c15208b15208c156a218d15208c15208d156a218e15208d15208e156a218f15208e15208f156a219015208f1520" + "90156a2191152090152091156a2192152091152092156a2193152092152093156a2194152093152094156a21951520" + "94152095156a2196152095152096156a2197152096152097156a2198152097152098156a2199152098152099156a21" "9a15209915209a156a219b15209a15209b156a219c15209b15209c156a219d15209c15209d156a219e15209d15209e" - "156a219f15209e15209f" - "156a21a015209f1520a0156a21a11520a01520a1156a21a21520a11520a2156a21a31520a21520a3156a21a41520a3" - "1520a4156a21a51520a4" - "1520a5156a21a61520a51520a6156a21a71520a61520a7156a21a81520a71520a8156a21a91520a81520a9156a21aa" - "1520a91520aa156a21ab" - "1520aa1520ab156a21ac1520ab1520ac156a21ad1520ac1520ad156a21ae1520ad1520ae156a21af1520ae1520af15" - "6a21b01520af1520b015" - "6a21b11520b01520b1156a21b21520b11520b2156a21b31520b21520b3156a21b41520b31520b4156a21b51520b415" - "20b5156a21b61520b515" - "20b6156a21b71520b61520b7156a21b81520b71520b8156a21b91520b81520b9156a21ba1520b91520ba156a21bb15" - "20ba1520bb156a21bc15" - "20bb1520bc156a21bd1520bc1520bd156a21be1520bd1520be156a21bf1520be1520bf156a21c01520bf1520c0156a" - "21c11520c01520c1156a" - "21c21520c11520c2156a21c31520c21520c3156a21c41520c31520c4156a21c51520c41520c5156a21c61520c51520" - "c6156a21c71520c61520" - "c7156a21c81520c71520c8156a21c91520c81520c9156a21ca1520c91520ca156a21cb1520ca1520cb156a21cc1520" - "cb1520cc156a21cd1520" - "cc1520cd156a21ce1520cd1520ce156a21cf1520ce1520cf156a21d01520cf1520d0156a21d11520d01520d1156a21" - "d21520d11520d2156a21" - "d31520d21520d3156a21d41520d31520d4156a21d51520d41520d5156a21d61520d51520d6156a21d71520d61520d7" - "156a21d81520d71520d8" - "156a21d91520d81520d9156a21da1520d91520da156a21db1520da1520db156a21dc1520db1520dc156a21dd1520dc" - "1520dd156a21de1520dd" - "1520de156a21df1520de1520df156a21e01520df1520e0156a21e11520e01520e1156a21e21520e11520e2156a21e3" - "1520e21520e3156a21e4" - "1520e31520e4156a21e51520e41520e5156a21e61520e51520e6156a21e71520e61520e7156a21e81520e71520e815" - "6a21e91520e81520e915" - "6a21ea1520e91520ea156a21eb1520ea1520eb156a21ec1520eb1520ec156a21ed1520ec1520ed156a21ee1520ed15" - "20ee156a21ef1520ee15" - "20ef156a21f01520ef1520f0156a21f11520f01520f1156a21f21520f11520f2156a21f31520f21520f3156a21f415" - "20f31520f4156a21f515" - "20f41520f5156a21f61520f51520f6156a21f71520f61520f7156a21f81520f71520f8156a21f91520f81520f9156a" - "21fa1520f91520fa156a" - "21fb1520fa1520fb156a21fc1520fb1520fc156a21fd1520fc1520fd156a21fe1520fd1520fe156a21ff1520fe1520" - "ff156a21801620ff1520" - "80166a2181162080162081166a2182162081162082166a2183162082162083166a2184162083162084166a21851620" - "84162085166a21861620" - "85162086166a2187162086162087166a2188162087162088166a2189162088162089166a218a16208916208a166a21" - "8b16208a16208b166a21" - "8c16208b16208c166a218d16208c16208d166a218e16208d16208e166a218f16208e16208f166a219016208f162090" - "166a2191162090162091" - "166a2192162091162092166a2193162092162093166a2194162093162094166a2195162094162095166a2196162095" - "162096166a2197162096" - "162097166a2198162097162098166a2199162098162099166a219a16209916209a166a219b16209a16209b166a219c" - "16209b16209c166a219d" - "16209c16209d166a219e16209d16209e166a219f16209e16209f166a21a016209f1620a0166a21a11620a01620a116" - "6a21a21620a11620a216" - "6a21a31620a21620a3166a21a41620a31620a4166a21a51620a41620a5166a21a61620a51620a6166a21a71620a616" - "20a7166a21a81620a716" - "20a8166a21a91620a81620a9166a21aa1620a91620aa166a21ab1620aa1620ab166a21ac1620ab1620ac166a21ad16" - "20ac1620ad166a21ae16" - "20ad1620ae166a21af1620ae1620af166a21b01620af1620b0166a21b11620b01620b1166a21b21620b11620b2166a" - "21b31620b21620b3166a" - "21b41620b31620b4166a21b51620b41620b5166a21b61620b51620b6166a21b71620b61620b7166a21b81620b71620" - "b8166a21b91620b81620" - "b9166a21ba1620b91620ba166a21bb1620ba1620bb166a21bc1620bb1620bc166a21bd1620bc1620bd166a21be1620" - "bd1620be166a21bf1620" - "be1620bf166a21c01620bf1620c0166a21c11620c01620c1166a21c21620c11620c2166a21c31620c21620c3166a21" - "c41620c31620c4166a21" - "c51620c41620c5166a21c61620c51620c6166a21c71620c61620c7166a21c81620c71620c8166a21c91620c81620c9" - "166a21ca1620c91620ca" - "166a21cb1620ca1620cb166a21cc1620cb1620cc166a21cd1620cc1620cd166a21ce1620cd1620ce166a21cf1620ce" - "1620cf166a21d01620cf" - "1620d0166a21d11620d01620d1166a21d21620d11620d2166a21d31620d21620d3166a21d41620d31620d4166a21d5" - "1620d41620d5166a21d6" - "1620d51620d6166a21d71620d61620d7166a21d81620d71620d8166a21d91620d81620d9166a21da1620d91620da16" - "6a21db1620da1620db16" - "6a21dc1620db1620dc166a21dd1620dc1620dd166a21de1620dd1620de166a21df1620de1620df166a21e01620df16" - "20e0166a21e11620e016" - "20e1166a21e21620e11620e2166a21e31620e21620e3166a21e41620e31620e4166a21e51620e41620e5166a21e616" - "20e51620e6166a21e716" - "20e61620e7166a21e81620e71620e8166a21e91620e81620e9166a21ea1620e91620ea166a21eb1620ea1620eb166a" - "21ec1620eb1620ec166a" - "21ed1620ec1620ed166a21ee1620ed1620ee166a21ef1620ee1620ef166a21f01620ef1620f0166a21f11620f01620" - "f1166a21f21620f11620" - "f2166a21f31620f21620f3166a21f41620f31620f4166a21f51620f41620f5166a21f61620f51620f6166a21f71620" - "f61620f7166a21f81620" - "f71620f8166a21f91620f81620f9166a21fa1620f91620fa166a21fb1620fa1620fb166a21fc1620fb1620fc166a21" - "fd1620fc1620fd166a21" - "fe1620fd1620fe166a21ff1620fe1620ff166a21801720ff162080176a2181172080172081176a2182172081172082" - "176a2183172082172083" - "176a2184172083172084176a2185172084172085176a2186172085172086176a2187172086172087176a2188172087" - "172088176a2189172088" - "172089176a218a17208917208a176a218b17208a17208b176a218c17208b17208c176a218d17208c17208d176a218e" - "17208d17208e176a218f" - "17208e17208f176a219017208f172090176a2191172090172091176a2192172091172092176a219317209217209317" - "6a219417209317209417" - "6a2195172094172095176a2196172095172096176a2197172096172097176a2198172097172098176a219917209817" - "2099176a219a17209917" - "209a176a219b17209a17209b176a219c17209b17209c176a219d17209c17209d176a219e17209d17209e176a219f17" - "209e17209f176a21a017" - "209f1720a0176a21a11720a01720a1176a21a21720a11720a2176a21a31720a21720a3176a21a41720a31720a4176a" - "21a51720a41720a5176a" + "156a219f15209e15209f156a21a015209f1520a0156a21a11520a01520a1156a21a21520a11520a2156a21a31520a2" + "1520a3156a21a41520a31520a4156a21a51520a41520a5156a21a61520a51520a6156a21a71520a61520a7156a21a8" + "1520a71520a8156a21a91520a81520a9156a21aa1520a91520aa156a21ab1520aa1520ab156a21ac1520ab1520ac15" + "6a21ad1520ac1520ad156a21ae1520ad1520ae156a21af1520ae1520af156a21b01520af1520b0156a21b11520b015" + "20b1156a21b21520b11520b2156a21b31520b21520b3156a21b41520b31520b4156a21b51520b41520b5156a21b615" + "20b51520b6156a21b71520b61520b7156a21b81520b71520b8156a21b91520b81520b9156a21ba1520b91520ba156a" + "21bb1520ba1520bb156a21bc1520bb1520bc156a21bd1520bc1520bd156a21be1520bd1520be156a21bf1520be1520" + "bf156a21c01520bf1520c0156a21c11520c01520c1156a21c21520c11520c2156a21c31520c21520c3156a21c41520" + "c31520c4156a21c51520c41520c5156a21c61520c51520c6156a21c71520c61520c7156a21c81520c71520c8156a21" + "c91520c81520c9156a21ca1520c91520ca156a21cb1520ca1520cb156a21cc1520cb1520cc156a21cd1520cc1520cd" + "156a21ce1520cd1520ce156a21cf1520ce1520cf156a21d01520cf1520d0156a21d11520d01520d1156a21d21520d1" + "1520d2156a21d31520d21520d3156a21d41520d31520d4156a21d51520d41520d5156a21d61520d51520d6156a21d7" + "1520d61520d7156a21d81520d71520d8156a21d91520d81520d9156a21da1520d91520da156a21db1520da1520db15" + "6a21dc1520db1520dc156a21dd1520dc1520dd156a21de1520dd1520de156a21df1520de1520df156a21e01520df15" + "20e0156a21e11520e01520e1156a21e21520e11520e2156a21e31520e21520e3156a21e41520e31520e4156a21e515" + "20e41520e5156a21e61520e51520e6156a21e71520e61520e7156a21e81520e71520e8156a21e91520e81520e9156a" + "21ea1520e91520ea156a21eb1520ea1520eb156a21ec1520eb1520ec156a21ed1520ec1520ed156a21ee1520ed1520" + "ee156a21ef1520ee1520ef156a21f01520ef1520f0156a21f11520f01520f1156a21f21520f11520f2156a21f31520" + "f21520f3156a21f41520f31520f4156a21f51520f41520f5156a21f61520f51520f6156a21f71520f61520f7156a21" + "f81520f71520f8156a21f91520f81520f9156a21fa1520f91520fa156a21fb1520fa1520fb156a21fc1520fb1520fc" + "156a21fd1520fc1520fd156a21fe1520fd1520fe156a21ff1520fe1520ff156a21801620ff152080166a2181162080" + "162081166a2182162081162082166a2183162082162083166a2184162083162084166a2185162084162085166a2186" + "162085162086166a2187162086162087166a2188162087162088166a2189162088162089166a218a16208916208a16" + "6a218b16208a16208b166a218c16208b16208c166a218d16208c16208d166a218e16208d16208e166a218f16208e16" + "208f166a219016208f162090166a2191162090162091166a2192162091162092166a2193162092162093166a219416" + "2093162094166a2195162094162095166a2196162095162096166a2197162096162097166a2198162097162098166a" + "2199162098162099166a219a16209916209a166a219b16209a16209b166a219c16209b16209c166a219d16209c1620" + "9d166a219e16209d16209e166a219f16209e16209f166a21a016209f1620a0166a21a11620a01620a1166a21a21620" + "a11620a2166a21a31620a21620a3166a21a41620a31620a4166a21a51620a41620a5166a21a61620a51620a6166a21" + "a71620a61620a7166a21a81620a71620a8166a21a91620a81620a9166a21aa1620a91620aa166a21ab1620aa1620ab" + "166a21ac1620ab1620ac166a21ad1620ac1620ad166a21ae1620ad1620ae166a21af1620ae1620af166a21b01620af" + "1620b0166a21b11620b01620b1166a21b21620b11620b2166a21b31620b21620b3166a21b41620b31620b4166a21b5" + "1620b41620b5166a21b61620b51620b6166a21b71620b61620b7166a21b81620b71620b8166a21b91620b81620b916" + "6a21ba1620b91620ba166a21bb1620ba1620bb166a21bc1620bb1620bc166a21bd1620bc1620bd166a21be1620bd16" + "20be166a21bf1620be1620bf166a21c01620bf1620c0166a21c11620c01620c1166a21c21620c11620c2166a21c316" + "20c21620c3166a21c41620c31620c4166a21c51620c41620c5166a21c61620c51620c6166a21c71620c61620c7166a" + "21c81620c71620c8166a21c91620c81620c9166a21ca1620c91620ca166a21cb1620ca1620cb166a21cc1620cb1620" + "cc166a21cd1620cc1620cd166a21ce1620cd1620ce166a21cf1620ce1620cf166a21d01620cf1620d0166a21d11620" + "d01620d1166a21d21620d11620d2166a21d31620d21620d3166a21d41620d31620d4166a21d51620d41620d5166a21" + "d61620d51620d6166a21d71620d61620d7166a21d81620d71620d8166a21d91620d81620d9166a21da1620d91620da" + "166a21db1620da1620db166a21dc1620db1620dc166a21dd1620dc1620dd166a21de1620dd1620de166a21df1620de" + "1620df166a21e01620df1620e0166a21e11620e01620e1166a21e21620e11620e2166a21e31620e21620e3166a21e4" + "1620e31620e4166a21e51620e41620e5166a21e61620e51620e6166a21e71620e61620e7166a21e81620e71620e816" + "6a21e91620e81620e9166a21ea1620e91620ea166a21eb1620ea1620eb166a21ec1620eb1620ec166a21ed1620ec16" + "20ed166a21ee1620ed1620ee166a21ef1620ee1620ef166a21f01620ef1620f0166a21f11620f01620f1166a21f216" + "20f11620f2166a21f31620f21620f3166a21f41620f31620f4166a21f51620f41620f5166a21f61620f51620f6166a" + "21f71620f61620f7166a21f81620f71620f8166a21f91620f81620f9166a21fa1620f91620fa166a21fb1620fa1620" + "fb166a21fc1620fb1620fc166a21fd1620fc1620fd166a21fe1620fd1620fe166a21ff1620fe1620ff166a21801720" + "ff162080176a2181172080172081176a2182172081172082176a2183172082172083176a2184172083172084176a21" + "85172084172085176a2186172085172086176a2187172086172087176a2188172087172088176a2189172088172089" + "176a218a17208917208a176a218b17208a17208b176a218c17208b17208c176a218d17208c17208d176a218e17208d" + "17208e176a218f17208e17208f176a219017208f172090176a2191172090172091176a2192172091172092176a2193" + "172092172093176a2194172093172094176a2195172094172095176a2196172095172096176a219717209617209717" + "6a2198172097172098176a2199172098172099176a219a17209917209a176a219b17209a17209b176a219c17209b17" + "209c176a219d17209c17209d176a219e17209d17209e176a219f17209e17209f176a21a017209f1720a0176a21a117" + "20a01720a1176a21a21720a11720a2176a21a31720a21720a3176a21a41720a31720a4176a21a51720a41720a5176a" "21a61720a51720a6176a21a71720a61720a7176a21a81720a71720a8176a21a91720a81720a9176a21aa1720a91720" - "aa176a21ab1720aa1720" - "ab176a21ac1720ab1720ac176a21ad1720ac1720ad176a21ae1720ad1720ae176a21af1720ae1720af176a21b01720" - "af1720b0176a21b11720" - "b01720b1176a21b21720b11720b2176a21b31720b21720b3176a21b41720b31720b4176a21b51720b41720b5176a21" - "b61720b51720b6176a21" - "b71720b61720b7176a21b81720b71720b8176a21b91720b81720b9176a21ba1720b91720ba176a21bb1720ba1720bb" - "176a21bc1720bb1720bc" - "176a21bd1720bc1720bd176a21be1720bd1720be176a21bf1720be1720bf176a21c01720bf1720c0176a21c11720c0" - "1720c1176a21c21720c1" - "1720c2176a21c31720c21720c3176a21c41720c31720c4176a21c51720c41720c5176a21c61720c51720c6176a21c7" - "1720c61720c7176a21c8" - "1720c71720c8176a21c91720c81720c9176a21ca1720c91720ca176a21cb1720ca1720cb176a21cc1720cb1720cc17" - "6a21cd1720cc1720cd17" - "6a21ce1720cd1720ce176a21cf1720ce1720cf176a21d01720cf1720d0176a21d11720d01720d1176a21d21720d117" - "20d2176a21d31720d217" - "20d3176a21d41720d31720d4176a21d51720d41720d5176a21d61720d51720d6176a21d71720d61720d7176a21d817" - "20d71720d8176a21d917" - "20d81720d9176a21da1720d91720da176a21db1720da1720db176a21dc1720db1720dc176a21dd1720dc1720dd176a" - "21de1720dd1720de176a" - "21df1720de1720df176a21e01720df1720e0176a21e11720e01720e1176a21e21720e11720e2176a21e31720e21720" - "e3176a21e41720e31720" - "e4176a21e51720e41720e5176a21e61720e51720e6176a21e71720e61720e7176a21e81720e71720e8176a21e91720" - "e81720e9176a21ea1720" - "e91720ea176a21eb1720ea1720eb176a21ec1720eb1720ec176a21ed1720ec1720ed176a21ee1720ed1720ee176a21" - "ef1720ee1720ef176a21" - "f01720ef1720f0176a21f11720f01720f1176a21f21720f11720f2176a21f31720f21720f3176a21f41720f31720f4" - "176a21f51720f41720f5" - "176a21f61720f51720f6176a21f71720f61720f7176a21f81720f71720f8176a21f91720f81720f9176a21fa1720f9" - "1720fa176a21fb1720fa" - "1720fb176a21fc1720fb1720fc176a21fd1720fc1720fd176a21fe1720fd1720fe176a21ff1720fe1720ff176a2180" - "1820ff172080186a2181" - "182080182081186a2182182081182082186a2183182082182083186a2184182083182084186a218518208418208518" - "6a218618208518208618" - "6a2187182086182087186a2188182087182088186a2189182088182089186a218a18208918208a186a218b18208a18" - "208b186a218c18208b18" - "208c186a218d18208c18208d186a218e18208d18208e186a218f18208e18208f186a219018208f182090186a219118" - "2090182091186a219218" - "2091182092186a2193182092182093186a2194182093182094186a2195182094182095186a2196182095182096186a" - "2197182096182097186a" - "2198182097182098186a2199182098182099186a219a18209918209a186a219b18209a18209b186a219c18209b1820" - "9c186a219d18209c1820" - "9d186a219e18209d18209e186a219f18209e18209f186a21a018209f1820a0186a21a11820a01820a1186a21a21820" - "a11820a2186a21a31820" - "a21820a3186a21a41820a31820a4186a21a51820a41820a5186a21a61820a51820a6186a21a71820a61820a7186a21" - "a81820a71820a8186a21" - "a91820a81820a9186a21aa1820a91820aa186a21ab1820aa1820ab186a21ac1820ab1820ac186a21ad1820ac1820ad" - "186a21ae1820ad1820ae" - "186a21af1820ae1820af186a21b01820af1820b0186a21b11820b01820b1186a21b21820b11820b2186a21b31820b2" - "1820b3186a21b41820b3" - "1820b4186a21b51820b41820b5186a21b61820b51820b6186a21b71820b61820b7186a21b81820b71820b8186a21b9" - "1820b81820b9186a21ba" - "1820b91820ba186a21bb1820ba1820bb186a21bc1820bb1820bc186a21bd1820bc1820bd186a21be1820bd1820be18" - "6a21bf1820be1820bf18" - "6a21c01820bf1820c0186a21c11820c01820c1186a21c21820c11820c2186a21c31820c21820c3186a21c41820c318" - "20c4186a21c51820c418" - "20c5186a21c61820c51820c6186a21c71820c61820c7186a21c81820c71820c8186a21c91820c81820c9186a21ca18" - "20c91820ca186a21cb18" - "20ca1820cb186a21cc1820cb1820cc186a21cd1820cc1820cd186a21ce1820cd1820ce186a21cf1820ce1820cf186a" - "21d01820cf1820d0186a" - "21d11820d01820d1186a21d21820d11820d2186a21d31820d21820d3186a21d41820d31820d4186a21d51820d41820" - "d5186a21d61820d51820" - "d6186a21d71820d61820d7186a21d81820d71820d8186a21d91820d81820d9186a21da1820d91820da186a21db1820" - "da1820db186a21dc1820" - "db1820dc186a21dd1820dc1820dd186a21de1820dd1820de186a21df1820de1820df186a21e01820df1820e0186a21" - "e11820e01820e1186a21" - "e21820e11820e2186a21e31820e21820e3186a21e41820e31820e4186a21e51820e41820e5186a21e61820e51820e6" - "186a21e71820e61820e7" - "186a21e81820e71820e8186a21e91820e81820e9186a21ea1820e91820ea186a21eb1820ea1820eb186a21ec1820eb" - "1820ec186a21ed1820ec" - "1820ed186a21ee1820ed1820ee186a21ef1820ee1820ef186a21f01820ef1820f0186a21f11820f01820f1186a21f2" - "1820f11820f2186a21f3" - "1820f21820f3186a21f41820f31820f4186a21f51820f41820f5186a21f61820f51820f6186a21f71820f61820f718" - "6a21f81820f71820f818" - "6a21f91820f81820f9186a21fa1820f91820fa186a21fb1820fa1820fb186a21fc1820fb1820fc186a21fd1820fc18" - "20fd186a21fe1820fd18" - "20fe186a21ff1820fe1820ff186a21801920ff182080196a2181192080192081196a2182192081192082196a218319" - "2082192083196a218419" - "2083192084196a2185192084192085196a2186192085192086196a2187192086192087196a2188192087192088196a" - "2189192088192089196a" - "218a19208919208a196a218b19208a19208b196a218c19208b19208c196a218d19208c19208d196a218e19208d1920" - "8e196a218f19208e1920" - "8f196a219019208f192090196a2191192090192091196a2192192091192092196a2193192092192093196a21941920" - "93192094196a21951920" - "94192095196a2196192095192096196a2197192096192097196a2198192097192098196a2199192098192099196a21" - "9a19209919209a196a21" - "9b19209a19209b196a219c19209b19209c196a219d19209c19209d196a219e19209d19209e196a219f19209e19209f" - "196a21a019209f1920a0" - "196a21a11920a01920a1196a21a21920a11920a2196a21a31920a21920a3196a21a41920a31920a4196a21a51920a4" - "1920a5196a21a61920a5" - "1920a6196a21a71920a61920a7196a21a81920a71920a8196a21a91920a81920a9196a21aa1920a91920aa196a21ab" - "1920aa1920ab196a21ac" - "1920ab1920ac196a21ad1920ac1920ad196a21ae1920ad1920ae196a21af1920ae1920af196a21b01920af1920b019" - "6a21b11920b01920b119" + "aa176a21ab1720aa1720ab176a21ac1720ab1720ac176a21ad1720ac1720ad176a21ae1720ad1720ae176a21af1720" + "ae1720af176a21b01720af1720b0176a21b11720b01720b1176a21b21720b11720b2176a21b31720b21720b3176a21" + "b41720b31720b4176a21b51720b41720b5176a21b61720b51720b6176a21b71720b61720b7176a21b81720b71720b8" + "176a21b91720b81720b9176a21ba1720b91720ba176a21bb1720ba1720bb176a21bc1720bb1720bc176a21bd1720bc" + "1720bd176a21be1720bd1720be176a21bf1720be1720bf176a21c01720bf1720c0176a21c11720c01720c1176a21c2" + "1720c11720c2176a21c31720c21720c3176a21c41720c31720c4176a21c51720c41720c5176a21c61720c51720c617" + "6a21c71720c61720c7176a21c81720c71720c8176a21c91720c81720c9176a21ca1720c91720ca176a21cb1720ca17" + "20cb176a21cc1720cb1720cc176a21cd1720cc1720cd176a21ce1720cd1720ce176a21cf1720ce1720cf176a21d017" + "20cf1720d0176a21d11720d01720d1176a21d21720d11720d2176a21d31720d21720d3176a21d41720d31720d4176a" + "21d51720d41720d5176a21d61720d51720d6176a21d71720d61720d7176a21d81720d71720d8176a21d91720d81720" + "d9176a21da1720d91720da176a21db1720da1720db176a21dc1720db1720dc176a21dd1720dc1720dd176a21de1720" + "dd1720de176a21df1720de1720df176a21e01720df1720e0176a21e11720e01720e1176a21e21720e11720e2176a21" + "e31720e21720e3176a21e41720e31720e4176a21e51720e41720e5176a21e61720e51720e6176a21e71720e61720e7" + "176a21e81720e71720e8176a21e91720e81720e9176a21ea1720e91720ea176a21eb1720ea1720eb176a21ec1720eb" + "1720ec176a21ed1720ec1720ed176a21ee1720ed1720ee176a21ef1720ee1720ef176a21f01720ef1720f0176a21f1" + "1720f01720f1176a21f21720f11720f2176a21f31720f21720f3176a21f41720f31720f4176a21f51720f41720f517" + "6a21f61720f51720f6176a21f71720f61720f7176a21f81720f71720f8176a21f91720f81720f9176a21fa1720f917" + "20fa176a21fb1720fa1720fb176a21fc1720fb1720fc176a21fd1720fc1720fd176a21fe1720fd1720fe176a21ff17" + "20fe1720ff176a21801820ff172080186a2181182080182081186a2182182081182082186a2183182082182083186a" + "2184182083182084186a2185182084182085186a2186182085182086186a2187182086182087186a21881820871820" + "88186a2189182088182089186a218a18208918208a186a218b18208a18208b186a218c18208b18208c186a218d1820" + "8c18208d186a218e18208d18208e186a218f18208e18208f186a219018208f182090186a2191182090182091186a21" + "92182091182092186a2193182092182093186a2194182093182094186a2195182094182095186a2196182095182096" + "186a2197182096182097186a2198182097182098186a2199182098182099186a219a18209918209a186a219b18209a" + "18209b186a219c18209b18209c186a219d18209c18209d186a219e18209d18209e186a219f18209e18209f186a21a0" + "18209f1820a0186a21a11820a01820a1186a21a21820a11820a2186a21a31820a21820a3186a21a41820a31820a418" + "6a21a51820a41820a5186a21a61820a51820a6186a21a71820a61820a7186a21a81820a71820a8186a21a91820a818" + "20a9186a21aa1820a91820aa186a21ab1820aa1820ab186a21ac1820ab1820ac186a21ad1820ac1820ad186a21ae18" + "20ad1820ae186a21af1820ae1820af186a21b01820af1820b0186a21b11820b01820b1186a21b21820b11820b2186a" + "21b31820b21820b3186a21b41820b31820b4186a21b51820b41820b5186a21b61820b51820b6186a21b71820b61820" + "b7186a21b81820b71820b8186a21b91820b81820b9186a21ba1820b91820ba186a21bb1820ba1820bb186a21bc1820" + "bb1820bc186a21bd1820bc1820bd186a21be1820bd1820be186a21bf1820be1820bf186a21c01820bf1820c0186a21" + "c11820c01820c1186a21c21820c11820c2186a21c31820c21820c3186a21c41820c31820c4186a21c51820c41820c5" + "186a21c61820c51820c6186a21c71820c61820c7186a21c81820c71820c8186a21c91820c81820c9186a21ca1820c9" + "1820ca186a21cb1820ca1820cb186a21cc1820cb1820cc186a21cd1820cc1820cd186a21ce1820cd1820ce186a21cf" + "1820ce1820cf186a21d01820cf1820d0186a21d11820d01820d1186a21d21820d11820d2186a21d31820d21820d318" + "6a21d41820d31820d4186a21d51820d41820d5186a21d61820d51820d6186a21d71820d61820d7186a21d81820d718" + "20d8186a21d91820d81820d9186a21da1820d91820da186a21db1820da1820db186a21dc1820db1820dc186a21dd18" + "20dc1820dd186a21de1820dd1820de186a21df1820de1820df186a21e01820df1820e0186a21e11820e01820e1186a" + "21e21820e11820e2186a21e31820e21820e3186a21e41820e31820e4186a21e51820e41820e5186a21e61820e51820" + "e6186a21e71820e61820e7186a21e81820e71820e8186a21e91820e81820e9186a21ea1820e91820ea186a21eb1820" + "ea1820eb186a21ec1820eb1820ec186a21ed1820ec1820ed186a21ee1820ed1820ee186a21ef1820ee1820ef186a21" + "f01820ef1820f0186a21f11820f01820f1186a21f21820f11820f2186a21f31820f21820f3186a21f41820f31820f4" + "186a21f51820f41820f5186a21f61820f51820f6186a21f71820f61820f7186a21f81820f71820f8186a21f91820f8" + "1820f9186a21fa1820f91820fa186a21fb1820fa1820fb186a21fc1820fb1820fc186a21fd1820fc1820fd186a21fe" + "1820fd1820fe186a21ff1820fe1820ff186a21801920ff182080196a2181192080192081196a218219208119208219" + "6a2183192082192083196a2184192083192084196a2185192084192085196a2186192085192086196a218719208619" + "2087196a2188192087192088196a2189192088192089196a218a19208919208a196a218b19208a19208b196a218c19" + "208b19208c196a218d19208c19208d196a218e19208d19208e196a218f19208e19208f196a219019208f192090196a" + "2191192090192091196a2192192091192092196a2193192092192093196a2194192093192094196a21951920941920" + "95196a2196192095192096196a2197192096192097196a2198192097192098196a2199192098192099196a219a1920" + "9919209a196a219b19209a19209b196a219c19209b19209c196a219d19209c19209d196a219e19209d19209e196a21" + "9f19209e19209f196a21a019209f1920a0196a21a11920a01920a1196a21a21920a11920a2196a21a31920a21920a3" + "196a21a41920a31920a4196a21a51920a41920a5196a21a61920a51920a6196a21a71920a61920a7196a21a81920a7" + "1920a8196a21a91920a81920a9196a21aa1920a91920aa196a21ab1920aa1920ab196a21ac1920ab1920ac196a21ad" + "1920ac1920ad196a21ae1920ad1920ae196a21af1920ae1920af196a21b01920af1920b0196a21b11920b01920b119" "6a21b21920b11920b2196a21b31920b21920b3196a21b41920b31920b4196a21b51920b41920b5196a21b61920b519" - "20b6196a21b71920b619" - "20b7196a21b81920b71920b8196a21b91920b81920b9196a21ba1920b91920ba196a21bb1920ba1920bb196a21bc19" - "20bb1920bc196a21bd19" - "20bc1920bd196a21be1920bd1920be196a21bf1920be1920bf196a21c01920bf1920c0196a21c11920c01920c1196a" - "21c21920c11920c2196a" - "21c31920c21920c3196a21c41920c31920c4196a21c51920c41920c5196a21c61920c51920c6196a21c71920c61920" - "c7196a21c81920c71920" - "c8196a21c91920c81920c9196a21ca1920c91920ca196a21cb1920ca1920cb196a21cc1920cb1920cc196a21cd1920" - "cc1920cd196a21ce1920" - "cd1920ce196a21cf1920ce1920cf196a21d01920cf1920d0196a21d11920d01920d1196a21d21920d11920d2196a21" - "d31920d21920d3196a21" - "d41920d31920d4196a21d51920d41920d5196a21d61920d51920d6196a21d71920d61920d7196a21d81920d71920d8" - "196a21d91920d81920d9" - "196a21da1920d91920da196a21db1920da1920db196a21dc1920db1920dc196a21dd1920dc1920dd196a21de1920dd" - "1920de196a21df1920de" - "1920df196a21e01920df1920e0196a21e11920e01920e1196a21e21920e11920e2196a21e31920e21920e3196a21e4" - "1920e31920e4196a21e5" - "1920e41920e5196a21e61920e51920e6196a21e71920e61920e7196a21e81920e71920e8196a21e91920e81920e919" - "6a21ea1920e91920ea19" - "6a21eb1920ea1920eb196a21ec1920eb1920ec196a21ed1920ec1920ed196a21ee1920ed1920ee196a21ef1920ee19" - "20ef196a21f01920ef19" - "20f0196a21f11920f01920f1196a21f21920f11920f2196a21f31920f21920f3196a21f41920f31920f4196a21f519" - "20f41920f5196a21f619" - "20f51920f6196a21f71920f61920f7196a21f81920f71920f8196a21f91920f81920f9196a21fa1920f91920fa196a" - "21fb1920fa1920fb196a" - "21fc1920fb1920fc196a21fd1920fc1920fd196a21fe1920fd1920fe196a21ff1920fe1920ff196a21801a20ff1920" - "801a6a21811a20801a20" - "811a6a21821a20811a20821a6a21831a20821a20831a6a21841a20831a20841a6a21851a20841a20851a6a21861a20" - "851a20861a6a21871a20" - "861a20871a6a21881a20871a20881a6a21891a20881a20891a6a218a1a20891a208a1a6a218b1a208a1a208b1a6a21" - "8c1a208b1a208c1a6a21" - "8d1a208c1a208d1a6a218e1a208d1a208e1a6a218f1a208e1a208f1a6a21901a208f1a20901a6a21911a20901a2091" - "1a6a21921a20911a2092" - "1a6a21931a20921a20931a6a21941a20931a20941a6a21951a20941a20951a6a21961a20951a20961a6a21971a2096" - "1a20971a6a21981a2097" - "1a20981a6a21991a20981a20991a6a219a1a20991a209a1a6a219b1a209a1a209b1a6a219c1a209b1a209c1a6a219d" - "1a209c1a209d1a6a219e" - "1a209d1a209e1a6a219f1a209e1a209f1a6a21a01a209f1a20a01a6a21a11a20a01a20a11a6a21a21a20a11a20a21a" - "6a21a31a20a21a20a31a" - "6a21a41a20a31a20a41a6a21a51a20a41a20a51a6a21a61a20a51a20a61a6a21a71a20a61a20a71a6a21a81a20a71a" - "20a81a6a21a91a20a81a" - "20a91a6a21aa1a20a91a20aa1a6a21ab1a20aa1a20ab1a6a21ac1a20ab1a20ac1a6a21ad1a20ac1a20ad1a6a21ae1a" - "20ad1a20ae1a6a21af1a" - "20ae1a20af1a6a21b01a20af1a20b01a6a21b11a20b01a20b11a6a21b21a20b11a20b21a6a21b31a20b21a20b31a6a" - "21b41a20b31a20b41a6a" - "21b51a20b41a20b51a6a21b61a20b51a20b61a6a21b71a20b61a20b71a6a21b81a20b71a20b81a6a21b91a20b81a20" - "b91a6a21ba1a20b91a20" - "ba1a6a21bb1a20ba1a20bb1a6a21bc1a20bb1a20bc1a6a21bd1a20bc1a20bd1a6a21be1a20bd1a20be1a6a21bf1a20" - "be1a20bf1a6a21c01a20" - "bf1a20c01a6a21c11a20c01a20c11a6a21c21a20c11a20c21a6a21c31a20c21a20c31a6a21c41a20c31a20c41a6a21" - "c51a20c41a20c51a6a21" - "c61a20c51a20c61a6a21c71a20c61a20c71a6a21c81a20c71a20c81a6a21c91a20c81a20c91a6a21ca1a20c91a20ca" - "1a6a21cb1a20ca1a20cb" - "1a6a21cc1a20cb1a20cc1a6a21cd1a20cc1a20cd1a6a21ce1a20cd1a20ce1a6a21cf1a20ce1a20cf1a6a21d01a20cf" - "1a20d01a6a21d11a20d0" - "1a20d11a6a21d21a20d11a20d21a6a21d31a20d21a20d31a6a21d41a20d31a20d41a6a21d51a20d41a20d51a6a21d6" - "1a20d51a20d61a6a21d7" - "1a20d61a20d71a6a21d81a20d71a20d81a6a21d91a20d81a20d91a6a21da1a20d91a20da1a6a21db1a20da1a20db1a" - "6a21dc1a20db1a20dc1a" - "6a21dd1a20dc1a20dd1a6a21de1a20dd1a20de1a6a21df1a20de1a20df1a6a21e01a20df1a20e01a6a21e11a20e01a" - "20e11a6a21e21a20e11a" - "20e21a6a21e31a20e21a20e31a6a21e41a20e31a20e41a6a21e51a20e41a20e51a6a21e61a20e51a20e61a6a21e71a" - "20e61a20e71a6a21e81a" - "20e71a20e81a6a21e91a20e81a20e91a6a21ea1a20e91a20ea1a6a21eb1a20ea1a20eb1a6a21ec1a20eb1a20ec1a6a" - "21ed1a20ec1a20ed1a6a" - "21ee1a20ed1a20ee1a6a21ef1a20ee1a20ef1a6a21f01a20ef1a20f01a6a21f11a20f01a20f11a6a21f21a20f11a20" - "f21a6a21f31a20f21a20" - "f31a6a21f41a20f31a20f41a6a21f51a20f41a20f51a6a21f61a20f51a20f61a6a21f71a20f61a20f71a6a21f81a20" - "f71a20f81a6a21f91a20" - "f81a20f91a6a21fa1a20f91a20fa1a6a21fb1a20fa1a20fb1a6a21fc1a20fb1a20fc1a6a21fd1a20fc1a20fd1a6a21" - "fe1a20fd1a20fe1a6a21" - "ff1a20fe1a20ff1a6a21801b20ff1a20801b6a21811b20801b20811b6a21821b20811b20821b6a21831b20821b2083" - "1b6a21841b20831b2084" - "1b6a21851b20841b20851b6a21861b20851b20861b6a21871b20861b20871b6a21881b20871b20881b6a21891b2088" - "1b20891b6a218a1b2089" - "1b208a1b6a218b1b208a1b208b1b6a218c1b208b1b208c1b6a218d1b208c1b208d1b6a218e1b208d1b208e1b6a218f" - "1b208e1b208f1b6a2190" - "1b208f1b20901b6a21911b20901b20911b6a21921b20911b20921b6a21931b20921b20931b6a21941b20931b20941b" - "6a21951b20941b20951b" - "6a21961b20951b20961b6a21971b20961b20971b6a21981b20971b20981b6a21991b20981b20991b6a219a1b20991b" - "209a1b6a219b1b209a1b" - "209b1b6a219c1b209b1b209c1b6a219d1b209c1b209d1b6a219e1b209d1b209e1b6a219f1b209e1b209f1b6a21a01b" - "209f1b20a01b6a21a11b" - "20a01b20a11b6a21a21b20a11b20a21b6a21a31b20a21b20a31b6a21a41b20a31b20a41b6a21a51b20a41b20a51b6a" - "21a61b20a51b20a61b6a" - "21a71b20a61b20a71b6a21a81b20a71b20a81b6a21a91b20a81b20a91b6a21aa1b20a91b20aa1b6a21ab1b20aa1b20" - "ab1b6a21ac1b20ab1b20" - "ac1b6a21ad1b20ac1b20ad1b6a21ae1b20ad1b20ae1b6a21af1b20ae1b20af1b6a21b01b20af1b20b01b6a21b11b20" - "b01b20b11b6a21b21b20" - "b11b20b21b6a21b31b20b21b20b31b6a21b41b20b31b20b41b6a21b51b20b41b20b51b6a21b61b20b51b20b61b6a21" - "b71b20b61b20b71b6a21" - "b81b20b71b20b81b6a21b91b20b81b20b91b6a21ba1b20b91b20ba1b6a21bb1b20ba1b20bb1b6a21bc1b20bb1b20bc" - "1b6a21bd1b20bc1b20bd" + "20b6196a21b71920b61920b7196a21b81920b71920b8196a21b91920b81920b9196a21ba1920b91920ba196a21bb19" + "20ba1920bb196a21bc1920bb1920bc196a21bd1920bc1920bd196a21be1920bd1920be196a21bf1920be1920bf196a" + "21c01920bf1920c0196a21c11920c01920c1196a21c21920c11920c2196a21c31920c21920c3196a21c41920c31920" + "c4196a21c51920c41920c5196a21c61920c51920c6196a21c71920c61920c7196a21c81920c71920c8196a21c91920" + "c81920c9196a21ca1920c91920ca196a21cb1920ca1920cb196a21cc1920cb1920cc196a21cd1920cc1920cd196a21" + "ce1920cd1920ce196a21cf1920ce1920cf196a21d01920cf1920d0196a21d11920d01920d1196a21d21920d11920d2" + "196a21d31920d21920d3196a21d41920d31920d4196a21d51920d41920d5196a21d61920d51920d6196a21d71920d6" + "1920d7196a21d81920d71920d8196a21d91920d81920d9196a21da1920d91920da196a21db1920da1920db196a21dc" + "1920db1920dc196a21dd1920dc1920dd196a21de1920dd1920de196a21df1920de1920df196a21e01920df1920e019" + "6a21e11920e01920e1196a21e21920e11920e2196a21e31920e21920e3196a21e41920e31920e4196a21e51920e419" + "20e5196a21e61920e51920e6196a21e71920e61920e7196a21e81920e71920e8196a21e91920e81920e9196a21ea19" + "20e91920ea196a21eb1920ea1920eb196a21ec1920eb1920ec196a21ed1920ec1920ed196a21ee1920ed1920ee196a" + "21ef1920ee1920ef196a21f01920ef1920f0196a21f11920f01920f1196a21f21920f11920f2196a21f31920f21920" + "f3196a21f41920f31920f4196a21f51920f41920f5196a21f61920f51920f6196a21f71920f61920f7196a21f81920" + "f71920f8196a21f91920f81920f9196a21fa1920f91920fa196a21fb1920fa1920fb196a21fc1920fb1920fc196a21" + "fd1920fc1920fd196a21fe1920fd1920fe196a21ff1920fe1920ff196a21801a20ff1920801a6a21811a20801a2081" + "1a6a21821a20811a20821a6a21831a20821a20831a6a21841a20831a20841a6a21851a20841a20851a6a21861a2085" + "1a20861a6a21871a20861a20871a6a21881a20871a20881a6a21891a20881a20891a6a218a1a20891a208a1a6a218b" + "1a208a1a208b1a6a218c1a208b1a208c1a6a218d1a208c1a208d1a6a218e1a208d1a208e1a6a218f1a208e1a208f1a" + "6a21901a208f1a20901a6a21911a20901a20911a6a21921a20911a20921a6a21931a20921a20931a6a21941a20931a" + "20941a6a21951a20941a20951a6a21961a20951a20961a6a21971a20961a20971a6a21981a20971a20981a6a21991a" + "20981a20991a6a219a1a20991a209a1a6a219b1a209a1a209b1a6a219c1a209b1a209c1a6a219d1a209c1a209d1a6a" + "219e1a209d1a209e1a6a219f1a209e1a209f1a6a21a01a209f1a20a01a6a21a11a20a01a20a11a6a21a21a20a11a20" + "a21a6a21a31a20a21a20a31a6a21a41a20a31a20a41a6a21a51a20a41a20a51a6a21a61a20a51a20a61a6a21a71a20" + "a61a20a71a6a21a81a20a71a20a81a6a21a91a20a81a20a91a6a21aa1a20a91a20aa1a6a21ab1a20aa1a20ab1a6a21" + "ac1a20ab1a20ac1a6a21ad1a20ac1a20ad1a6a21ae1a20ad1a20ae1a6a21af1a20ae1a20af1a6a21b01a20af1a20b0" + "1a6a21b11a20b01a20b11a6a21b21a20b11a20b21a6a21b31a20b21a20b31a6a21b41a20b31a20b41a6a21b51a20b4" + "1a20b51a6a21b61a20b51a20b61a6a21b71a20b61a20b71a6a21b81a20b71a20b81a6a21b91a20b81a20b91a6a21ba" + "1a20b91a20ba1a6a21bb1a20ba1a20bb1a6a21bc1a20bb1a20bc1a6a21bd1a20bc1a20bd1a6a21be1a20bd1a20be1a" + "6a21bf1a20be1a20bf1a6a21c01a20bf1a20c01a6a21c11a20c01a20c11a6a21c21a20c11a20c21a6a21c31a20c21a" + "20c31a6a21c41a20c31a20c41a6a21c51a20c41a20c51a6a21c61a20c51a20c61a6a21c71a20c61a20c71a6a21c81a" + "20c71a20c81a6a21c91a20c81a20c91a6a21ca1a20c91a20ca1a6a21cb1a20ca1a20cb1a6a21cc1a20cb1a20cc1a6a" + "21cd1a20cc1a20cd1a6a21ce1a20cd1a20ce1a6a21cf1a20ce1a20cf1a6a21d01a20cf1a20d01a6a21d11a20d01a20" + "d11a6a21d21a20d11a20d21a6a21d31a20d21a20d31a6a21d41a20d31a20d41a6a21d51a20d41a20d51a6a21d61a20" + "d51a20d61a6a21d71a20d61a20d71a6a21d81a20d71a20d81a6a21d91a20d81a20d91a6a21da1a20d91a20da1a6a21" + "db1a20da1a20db1a6a21dc1a20db1a20dc1a6a21dd1a20dc1a20dd1a6a21de1a20dd1a20de1a6a21df1a20de1a20df" + "1a6a21e01a20df1a20e01a6a21e11a20e01a20e11a6a21e21a20e11a20e21a6a21e31a20e21a20e31a6a21e41a20e3" + "1a20e41a6a21e51a20e41a20e51a6a21e61a20e51a20e61a6a21e71a20e61a20e71a6a21e81a20e71a20e81a6a21e9" + "1a20e81a20e91a6a21ea1a20e91a20ea1a6a21eb1a20ea1a20eb1a6a21ec1a20eb1a20ec1a6a21ed1a20ec1a20ed1a" + "6a21ee1a20ed1a20ee1a6a21ef1a20ee1a20ef1a6a21f01a20ef1a20f01a6a21f11a20f01a20f11a6a21f21a20f11a" + "20f21a6a21f31a20f21a20f31a6a21f41a20f31a20f41a6a21f51a20f41a20f51a6a21f61a20f51a20f61a6a21f71a" + "20f61a20f71a6a21f81a20f71a20f81a6a21f91a20f81a20f91a6a21fa1a20f91a20fa1a6a21fb1a20fa1a20fb1a6a" + "21fc1a20fb1a20fc1a6a21fd1a20fc1a20fd1a6a21fe1a20fd1a20fe1a6a21ff1a20fe1a20ff1a6a21801b20ff1a20" + "801b6a21811b20801b20811b6a21821b20811b20821b6a21831b20821b20831b6a21841b20831b20841b6a21851b20" + "841b20851b6a21861b20851b20861b6a21871b20861b20871b6a21881b20871b20881b6a21891b20881b20891b6a21" + "8a1b20891b208a1b6a218b1b208a1b208b1b6a218c1b208b1b208c1b6a218d1b208c1b208d1b6a218e1b208d1b208e" + "1b6a218f1b208e1b208f1b6a21901b208f1b20901b6a21911b20901b20911b6a21921b20911b20921b6a21931b2092" + "1b20931b6a21941b20931b20941b6a21951b20941b20951b6a21961b20951b20961b6a21971b20961b20971b6a2198" + "1b20971b20981b6a21991b20981b20991b6a219a1b20991b209a1b6a219b1b209a1b209b1b6a219c1b209b1b209c1b" + "6a219d1b209c1b209d1b6a219e1b209d1b209e1b6a219f1b209e1b209f1b6a21a01b209f1b20a01b6a21a11b20a01b" + "20a11b6a21a21b20a11b20a21b6a21a31b20a21b20a31b6a21a41b20a31b20a41b6a21a51b20a41b20a51b6a21a61b" + "20a51b20a61b6a21a71b20a61b20a71b6a21a81b20a71b20a81b6a21a91b20a81b20a91b6a21aa1b20a91b20aa1b6a" + "21ab1b20aa1b20ab1b6a21ac1b20ab1b20ac1b6a21ad1b20ac1b20ad1b6a21ae1b20ad1b20ae1b6a21af1b20ae1b20" + "af1b6a21b01b20af1b20b01b6a21b11b20b01b20b11b6a21b21b20b11b20b21b6a21b31b20b21b20b31b6a21b41b20" + "b31b20b41b6a21b51b20b41b20b51b6a21b61b20b51b20b61b6a21b71b20b61b20b71b6a21b81b20b71b20b81b6a21" + "b91b20b81b20b91b6a21ba1b20b91b20ba1b6a21bb1b20ba1b20bb1b6a21bc1b20bb1b20bc1b6a21bd1b20bc1b20bd" "1b6a21be1b20bd1b20be1b6a21bf1b20be1b20bf1b6a21c01b20bf1b20c01b6a21c11b20c01b20c11b6a21c21b20c1" - "1b20c21b6a21c31b20c2" - "1b20c31b6a21c41b20c31b20c41b6a21c51b20c41b20c51b6a21c61b20c51b20c61b6a21c71b20c61b20c71b6a21c8" - "1b20c71b20c81b6a21c9" - "1b20c81b20c91b6a21ca1b20c91b20ca1b6a21cb1b20ca1b20cb1b6a21cc1b20cb1b20cc1b6a21cd1b20cc1b20cd1b" - "6a21ce1b20cd1b20ce1b" - "6a21cf1b20ce1b20cf1b6a21d01b20cf1b20d01b6a21d11b20d01b20d11b6a21d21b20d11b20d21b6a21d31b20d21b" - "20d31b6a21d41b20d31b" - "20d41b6a21d51b20d41b20d51b6a21d61b20d51b20d61b6a21d71b20d61b20d71b6a21d81b20d71b20d81b6a21d91b" - "20d81b20d91b6a21da1b" - "20d91b20da1b6a21db1b20da1b20db1b6a21dc1b20db1b20dc1b6a21dd1b20dc1b20dd1b6a21de1b20dd1b20de1b6a" - "21df1b20de1b20df1b6a" - "21e01b20df1b20e01b6a21e11b20e01b20e11b6a21e21b20e11b20e21b6a21e31b20e21b20e31b6a21e41b20e31b20" - "e41b6a21e51b20e41b20" - "e51b6a21e61b20e51b20e61b6a21e71b20e61b20e71b6a21e81b20e71b20e81b6a21e91b20e81b20e91b6a21ea1b20" - "e91b20ea1b6a21eb1b20" - "ea1b20eb1b6a21ec1b20eb1b20ec1b6a21ed1b20ec1b20ed1b6a21ee1b20ed1b20ee1b6a21ef1b20ee1b20ef1b6a21" - "f01b20ef1b20f01b6a21" - "f11b20f01b20f11b6a21f21b20f11b20f21b6a21f31b20f21b20f31b6a21f41b20f31b20f41b6a21f51b20f41b20f5" - "1b6a21f61b20f51b20f6" - "1b6a21f71b20f61b20f71b6a21f81b20f71b20f81b6a21f91b20f81b20f91b6a21fa1b20f91b20fa1b6a21fb1b20fa" - "1b20fb1b6a21fc1b20fb" - "1b20fc1b6a21fd1b20fc1b20fd1b6a21fe1b20fd1b20fe1b6a21ff1b20fe1b20ff1b6a21801c20ff1b20801c6a2181" - "1c20801c20811c6a2182" - "1c20811c20821c6a21831c20821c20831c6a21841c20831c20841c6a21851c20841c20851c6a21861c20851c20861c" - "6a21871c20861c20871c" - "6a21881c20871c20881c6a21891c20881c20891c6a218a1c20891c208a1c6a218b1c208a1c208b1c6a218c1c208b1c" - "208c1c6a218d1c208c1c" - "208d1c6a218e1c208d1c208e1c6a218f1c208e1c208f1c6a21901c208f1c20901c6a21911c20901c20911c6a21921c" - "20911c20921c6a21931c" - "20921c20931c6a21941c20931c20941c6a21951c20941c20951c6a21961c20951c20961c6a21971c20961c20971c6a" - "21981c20971c20981c6a" - "21991c20981c20991c6a219a1c20991c209a1c6a219b1c209a1c209b1c6a219c1c209b1c209c1c6a219d1c209c1c20" - "9d1c6a219e1c209d1c20" - "9e1c6a219f1c209e1c209f1c6a21a01c209f1c20a01c6a21a11c20a01c20a11c6a21a21c20a11c20a21c6a21a31c20" - "a21c20a31c6a21a41c20" - "a31c20a41c6a21a51c20a41c20a51c6a21a61c20a51c20a61c6a21a71c20a61c20a71c6a21a81c20a71c20a81c6a21" - "a91c20a81c20a91c6a21" - "aa1c20a91c20aa1c6a21ab1c20aa1c20ab1c6a21ac1c20ab1c20ac1c6a21ad1c20ac1c20ad1c6a21ae1c20ad1c20ae" - "1c6a21af1c20ae1c20af" - "1c6a21b01c20af1c20b01c6a21b11c20b01c20b11c6a21b21c20b11c20b21c6a21b31c20b21c20b31c6a21b41c20b3" - "1c20b41c6a21b51c20b4" - "1c20b51c6a21b61c20b51c20b61c6a21b71c20b61c20b71c6a21b81c20b71c20b81c6a21b91c20b81c20b91c6a21ba" - "1c20b91c20ba1c6a21bb" - "1c20ba1c20bb1c6a21bc1c20bb1c20bc1c6a21bd1c20bc1c20bd1c6a21be1c20bd1c20be1c6a21bf1c20be1c20bf1c" - "6a21c01c20bf1c20c01c" - "6a21c11c20c01c20c11c6a21c21c20c11c20c21c6a21c31c20c21c20c31c6a21c41c20c31c20c41c6a21c51c20c41c" - "20c51c6a21c61c20c51c" - "20c61c6a21c71c20c61c20c71c6a21c81c20c71c20c81c6a21c91c20c81c20c91c6a21ca1c20c91c20ca1c6a21cb1c" - "20ca1c20cb1c6a21cc1c" - "20cb1c20cc1c6a21cd1c20cc1c20cd1c6a21ce1c20cd1c20ce1c6a21cf1c20ce1c20cf1c6a21d01c20cf1c20d01c6a" - "21d11c20d01c20d11c6a" - "21d21c20d11c20d21c6a21d31c20d21c20d31c6a21d41c20d31c20d41c6a21d51c20d41c20d51c6a21d61c20d51c20" - "d61c6a21d71c20d61c20" - "d71c6a21d81c20d71c20d81c6a21d91c20d81c20d91c6a21da1c20d91c20da1c6a21db1c20da1c20db1c6a21dc1c20" - "db1c20dc1c6a21dd1c20" - "dc1c20dd1c6a21de1c20dd1c20de1c6a21df1c20de1c20df1c6a21e01c20df1c20e01c6a21e11c20e01c20e11c6a21" - "e21c20e11c20e21c6a21" - "e31c20e21c20e31c6a21e41c20e31c20e41c6a21e51c20e41c20e51c6a21e61c20e51c20e61c6a21e71c20e61c20e7" - "1c6a21e81c20e71c20e8" - "1c6a21e91c20e81c20e91c6a21ea1c20e91c20ea1c6a21eb1c20ea1c20eb1c6a21ec1c20eb1c20ec1c6a21ed1c20ec" - "1c20ed1c6a21ee1c20ed" - "1c20ee1c6a21ef1c20ee1c20ef1c6a21f01c20ef1c20f01c6a21f11c20f01c20f11c6a21f21c20f11c20f21c6a21f3" - "1c20f21c20f31c6a21f4" - "1c20f31c20f41c6a21f51c20f41c20f51c6a21f61c20f51c20f61c6a21f71c20f61c20f71c6a21f81c20f71c20f81c" - "6a21f91c20f81c20f91c" - "6a21fa1c20f91c20fa1c6a21fb1c20fa1c20fb1c6a21fc1c20fb1c20fc1c6a21fd1c20fc1c20fd1c6a21fe1c20fd1c" - "20fe1c6a21ff1c20fe1c" - "20ff1c6a21801d20ff1c20801d6a21811d20801d20811d6a21821d20811d20821d6a21831d20821d20831d6a21841d" - "20831d20841d6a21851d" - "20841d20851d6a21861d20851d20861d6a21871d20861d20871d6a21881d20871d20881d6a21891d20881d20891d6a" - "218a1d20891d208a1d6a" - "218b1d208a1d208b1d6a218c1d208b1d208c1d6a218d1d208c1d208d1d6a218e1d208d1d208e1d6a218f1d208e1d20" - "8f1d6a21901d208f1d20" - "901d6a21911d20901d20911d6a21921d20911d20921d6a21931d20921d20931d6a21941d20931d20941d6a21951d20" - "941d20951d6a21961d20" - "951d20961d6a21971d20961d20971d6a21981d20971d20981d6a21991d20981d20991d6a219a1d20991d209a1d6a21" - "9b1d209a1d209b1d6a21" - "9c1d209b1d209c1d6a219d1d209c1d209d1d6a219e1d209d1d209e1d6a219f1d209e1d209f1d6a21a01d209f1d20a0" - "1d6a21a11d20a01d20a1" - "1d6a21a21d20a11d20a21d6a21a31d20a21d20a31d6a21a41d20a31d20a41d6a21a51d20a41d20a51d6a21a61d20a5" - "1d20a61d6a21a71d20a6" - "1d20a71d6a21a81d20a71d20a81d6a21a91d20a81d20a91d6a21aa1d20a91d20aa1d6a21ab1d20aa1d20ab1d6a21ac" - "1d20ab1d20ac1d6a21ad" - "1d20ac1d20ad1d6a21ae1d20ad1d20ae1d6a21af1d20ae1d20af1d6a21b01d20af1d20b01d6a21b11d20b01d20b11d" - "6a21b21d20b11d20b21d" - "6a21b31d20b21d20b31d6a21b41d20b31d20b41d6a21b51d20b41d20b51d6a21b61d20b51d20b61d6a21b71d20b61d" - "20b71d6a21b81d20b71d" - "20b81d6a21b91d20b81d20b91d6a21ba1d20b91d20ba1d6a21bb1d20ba1d20bb1d6a21bc1d20bb1d20bc1d6a21bd1d" - "20bc1d20bd1d6a21be1d" - "20bd1d20be1d6a21bf1d20be1d20bf1d6a21c01d20bf1d20c01d6a21c11d20c01d20c11d6a21c21d20c11d20c21d6a" - "21c31d20c21d20c31d6a" - "21c41d20c31d20c41d6a21c51d20c41d20c51d6a21c61d20c51d20c61d6a21c71d20c61d20c71d6a21c81d20c71d20" - "c81d6a21c91d20c81d20" + "1b20c21b6a21c31b20c21b20c31b6a21c41b20c31b20c41b6a21c51b20c41b20c51b6a21c61b20c51b20c61b6a21c7" + "1b20c61b20c71b6a21c81b20c71b20c81b6a21c91b20c81b20c91b6a21ca1b20c91b20ca1b6a21cb1b20ca1b20cb1b" + "6a21cc1b20cb1b20cc1b6a21cd1b20cc1b20cd1b6a21ce1b20cd1b20ce1b6a21cf1b20ce1b20cf1b6a21d01b20cf1b" + "20d01b6a21d11b20d01b20d11b6a21d21b20d11b20d21b6a21d31b20d21b20d31b6a21d41b20d31b20d41b6a21d51b" + "20d41b20d51b6a21d61b20d51b20d61b6a21d71b20d61b20d71b6a21d81b20d71b20d81b6a21d91b20d81b20d91b6a" + "21da1b20d91b20da1b6a21db1b20da1b20db1b6a21dc1b20db1b20dc1b6a21dd1b20dc1b20dd1b6a21de1b20dd1b20" + "de1b6a21df1b20de1b20df1b6a21e01b20df1b20e01b6a21e11b20e01b20e11b6a21e21b20e11b20e21b6a21e31b20" + "e21b20e31b6a21e41b20e31b20e41b6a21e51b20e41b20e51b6a21e61b20e51b20e61b6a21e71b20e61b20e71b6a21" + "e81b20e71b20e81b6a21e91b20e81b20e91b6a21ea1b20e91b20ea1b6a21eb1b20ea1b20eb1b6a21ec1b20eb1b20ec" + "1b6a21ed1b20ec1b20ed1b6a21ee1b20ed1b20ee1b6a21ef1b20ee1b20ef1b6a21f01b20ef1b20f01b6a21f11b20f0" + "1b20f11b6a21f21b20f11b20f21b6a21f31b20f21b20f31b6a21f41b20f31b20f41b6a21f51b20f41b20f51b6a21f6" + "1b20f51b20f61b6a21f71b20f61b20f71b6a21f81b20f71b20f81b6a21f91b20f81b20f91b6a21fa1b20f91b20fa1b" + "6a21fb1b20fa1b20fb1b6a21fc1b20fb1b20fc1b6a21fd1b20fc1b20fd1b6a21fe1b20fd1b20fe1b6a21ff1b20fe1b" + "20ff1b6a21801c20ff1b20801c6a21811c20801c20811c6a21821c20811c20821c6a21831c20821c20831c6a21841c" + "20831c20841c6a21851c20841c20851c6a21861c20851c20861c6a21871c20861c20871c6a21881c20871c20881c6a" + "21891c20881c20891c6a218a1c20891c208a1c6a218b1c208a1c208b1c6a218c1c208b1c208c1c6a218d1c208c1c20" + "8d1c6a218e1c208d1c208e1c6a218f1c208e1c208f1c6a21901c208f1c20901c6a21911c20901c20911c6a21921c20" + "911c20921c6a21931c20921c20931c6a21941c20931c20941c6a21951c20941c20951c6a21961c20951c20961c6a21" + "971c20961c20971c6a21981c20971c20981c6a21991c20981c20991c6a219a1c20991c209a1c6a219b1c209a1c209b" + "1c6a219c1c209b1c209c1c6a219d1c209c1c209d1c6a219e1c209d1c209e1c6a219f1c209e1c209f1c6a21a01c209f" + "1c20a01c6a21a11c20a01c20a11c6a21a21c20a11c20a21c6a21a31c20a21c20a31c6a21a41c20a31c20a41c6a21a5" + "1c20a41c20a51c6a21a61c20a51c20a61c6a21a71c20a61c20a71c6a21a81c20a71c20a81c6a21a91c20a81c20a91c" + "6a21aa1c20a91c20aa1c6a21ab1c20aa1c20ab1c6a21ac1c20ab1c20ac1c6a21ad1c20ac1c20ad1c6a21ae1c20ad1c" + "20ae1c6a21af1c20ae1c20af1c6a21b01c20af1c20b01c6a21b11c20b01c20b11c6a21b21c20b11c20b21c6a21b31c" + "20b21c20b31c6a21b41c20b31c20b41c6a21b51c20b41c20b51c6a21b61c20b51c20b61c6a21b71c20b61c20b71c6a" + "21b81c20b71c20b81c6a21b91c20b81c20b91c6a21ba1c20b91c20ba1c6a21bb1c20ba1c20bb1c6a21bc1c20bb1c20" + "bc1c6a21bd1c20bc1c20bd1c6a21be1c20bd1c20be1c6a21bf1c20be1c20bf1c6a21c01c20bf1c20c01c6a21c11c20" + "c01c20c11c6a21c21c20c11c20c21c6a21c31c20c21c20c31c6a21c41c20c31c20c41c6a21c51c20c41c20c51c6a21" + "c61c20c51c20c61c6a21c71c20c61c20c71c6a21c81c20c71c20c81c6a21c91c20c81c20c91c6a21ca1c20c91c20ca" + "1c6a21cb1c20ca1c20cb1c6a21cc1c20cb1c20cc1c6a21cd1c20cc1c20cd1c6a21ce1c20cd1c20ce1c6a21cf1c20ce" + "1c20cf1c6a21d01c20cf1c20d01c6a21d11c20d01c20d11c6a21d21c20d11c20d21c6a21d31c20d21c20d31c6a21d4" + "1c20d31c20d41c6a21d51c20d41c20d51c6a21d61c20d51c20d61c6a21d71c20d61c20d71c6a21d81c20d71c20d81c" + "6a21d91c20d81c20d91c6a21da1c20d91c20da1c6a21db1c20da1c20db1c6a21dc1c20db1c20dc1c6a21dd1c20dc1c" + "20dd1c6a21de1c20dd1c20de1c6a21df1c20de1c20df1c6a21e01c20df1c20e01c6a21e11c20e01c20e11c6a21e21c" + "20e11c20e21c6a21e31c20e21c20e31c6a21e41c20e31c20e41c6a21e51c20e41c20e51c6a21e61c20e51c20e61c6a" + "21e71c20e61c20e71c6a21e81c20e71c20e81c6a21e91c20e81c20e91c6a21ea1c20e91c20ea1c6a21eb1c20ea1c20" + "eb1c6a21ec1c20eb1c20ec1c6a21ed1c20ec1c20ed1c6a21ee1c20ed1c20ee1c6a21ef1c20ee1c20ef1c6a21f01c20" + "ef1c20f01c6a21f11c20f01c20f11c6a21f21c20f11c20f21c6a21f31c20f21c20f31c6a21f41c20f31c20f41c6a21" + "f51c20f41c20f51c6a21f61c20f51c20f61c6a21f71c20f61c20f71c6a21f81c20f71c20f81c6a21f91c20f81c20f9" + "1c6a21fa1c20f91c20fa1c6a21fb1c20fa1c20fb1c6a21fc1c20fb1c20fc1c6a21fd1c20fc1c20fd1c6a21fe1c20fd" + "1c20fe1c6a21ff1c20fe1c20ff1c6a21801d20ff1c20801d6a21811d20801d20811d6a21821d20811d20821d6a2183" + "1d20821d20831d6a21841d20831d20841d6a21851d20841d20851d6a21861d20851d20861d6a21871d20861d20871d" + "6a21881d20871d20881d6a21891d20881d20891d6a218a1d20891d208a1d6a218b1d208a1d208b1d6a218c1d208b1d" + "208c1d6a218d1d208c1d208d1d6a218e1d208d1d208e1d6a218f1d208e1d208f1d6a21901d208f1d20901d6a21911d" + "20901d20911d6a21921d20911d20921d6a21931d20921d20931d6a21941d20931d20941d6a21951d20941d20951d6a" + "21961d20951d20961d6a21971d20961d20971d6a21981d20971d20981d6a21991d20981d20991d6a219a1d20991d20" + "9a1d6a219b1d209a1d209b1d6a219c1d209b1d209c1d6a219d1d209c1d209d1d6a219e1d209d1d209e1d6a219f1d20" + "9e1d209f1d6a21a01d209f1d20a01d6a21a11d20a01d20a11d6a21a21d20a11d20a21d6a21a31d20a21d20a31d6a21" + "a41d20a31d20a41d6a21a51d20a41d20a51d6a21a61d20a51d20a61d6a21a71d20a61d20a71d6a21a81d20a71d20a8" + "1d6a21a91d20a81d20a91d6a21aa1d20a91d20aa1d6a21ab1d20aa1d20ab1d6a21ac1d20ab1d20ac1d6a21ad1d20ac" + "1d20ad1d6a21ae1d20ad1d20ae1d6a21af1d20ae1d20af1d6a21b01d20af1d20b01d6a21b11d20b01d20b11d6a21b2" + "1d20b11d20b21d6a21b31d20b21d20b31d6a21b41d20b31d20b41d6a21b51d20b41d20b51d6a21b61d20b51d20b61d" + "6a21b71d20b61d20b71d6a21b81d20b71d20b81d6a21b91d20b81d20b91d6a21ba1d20b91d20ba1d6a21bb1d20ba1d" + "20bb1d6a21bc1d20bb1d20bc1d6a21bd1d20bc1d20bd1d6a21be1d20bd1d20be1d6a21bf1d20be1d20bf1d6a21c01d" + "20bf1d20c01d6a21c11d20c01d20c11d6a21c21d20c11d20c21d6a21c31d20c21d20c31d6a21c41d20c31d20c41d6a" + "21c51d20c41d20c51d6a21c61d20c51d20c61d6a21c71d20c61d20c71d6a21c81d20c71d20c81d6a21c91d20c81d20" "c91d6a21ca1d20c91d20ca1d6a21cb1d20ca1d20cb1d6a21cc1d20cb1d20cc1d6a21cd1d20cc1d20cd1d6a21ce1d20" - "cd1d20ce1d6a21cf1d20" - "ce1d20cf1d6a21d01d20cf1d20d01d6a21d11d20d01d20d11d6a21d21d20d11d20d21d6a21d31d20d21d20d31d6a21" - "d41d20d31d20d41d6a21" - "d51d20d41d20d51d6a21d61d20d51d20d61d6a21d71d20d61d20d71d6a21d81d20d71d20d81d6a21d91d20d81d20d9" - "1d6a21da1d20d91d20da" - "1d6a21db1d20da1d20db1d6a21dc1d20db1d20dc1d6a21dd1d20dc1d20dd1d6a21de1d20dd1d20de1d6a21df1d20de" - "1d20df1d6a21e01d20df" - "1d20e01d6a21e11d20e01d20e11d6a21e21d20e11d20e21d6a21e31d20e21d20e31d6a21e41d20e31d20e41d6a21e5" - "1d20e41d20e51d6a21e6" - "1d20e51d20e61d6a21e71d20e61d20e71d6a21e81d20e71d20e81d6a21e91d20e81d20e91d6a21ea1d20e91d20ea1d" - "6a21eb1d20ea1d20eb1d" - "6a21ec1d20eb1d20ec1d6a21ed1d20ec1d20ed1d6a21ee1d20ed1d20ee1d6a21ef1d20ee1d20ef1d6a21f01d20ef1d" - "20f01d6a21f11d20f01d" - "20f11d6a21f21d20f11d20f21d6a21f31d20f21d20f31d6a21f41d20f31d20f41d6a21f51d20f41d20f51d6a21f61d" - "20f51d20f61d6a21f71d" - "20f61d20f71d6a21f81d20f71d20f81d6a21f91d20f81d20f91d6a21fa1d20f91d20fa1d6a21fb1d20fa1d20fb1d6a" - "21fc1d20fb1d20fc1d6a" - "21fd1d20fc1d20fd1d6a21fe1d20fd1d20fe1d6a21ff1d20fe1d20ff1d6a21801e20ff1d20801e6a21811e20801e20" - "811e6a21821e20811e20" - "821e6a21831e20821e20831e6a21841e20831e20841e6a21851e20841e20851e6a21861e20851e20861e6a21871e20" - "861e20871e6a21881e20" - "871e20881e6a21891e20881e20891e6a218a1e20891e208a1e6a218b1e208a1e208b1e6a218c1e208b1e208c1e6a21" - "8d1e208c1e208d1e6a21" - "8e1e208d1e208e1e6a218f1e208e1e208f1e6a21901e208f1e20901e6a21911e20901e20911e6a21921e20911e2092" - "1e6a21931e20921e2093" - "1e6a21941e20931e20941e6a21951e20941e20951e6a21961e20951e20961e6a21971e20961e20971e6a21981e2097" - "1e20981e6a21991e2098" - "1e20991e6a219a1e20991e209a1e6a219b1e209a1e209b1e6a219c1e209b1e209c1e6a219d1e209c1e209d1e6a219e" - "1e209d1e209e1e6a219f" - "1e209e1e209f1e6a21a01e209f1e20a01e6a21a11e20a01e20a11e6a21a21e20a11e20a21e6a21a31e20a21e20a31e" - "6a21a41e20a31e20a41e" - "6a21a51e20a41e20a51e6a21a61e20a51e20a61e6a21a71e20a61e20a71e6a21a81e20a71e20a81e6a21a91e20a81e" - "20a91e6a21aa1e20a91e" - "20aa1e6a21ab1e20aa1e20ab1e6a21ac1e20ab1e20ac1e6a21ad1e20ac1e20ad1e6a21ae1e20ad1e20ae1e6a21af1e" - "20ae1e20af1e6a21b01e" - "20af1e20b01e6a21b11e20b01e20b11e6a21b21e20b11e20b21e6a21b31e20b21e20b31e6a21b41e20b31e20b41e6a" - "21b51e20b41e20b51e6a" - "21b61e20b51e20b61e6a21b71e20b61e20b71e6a21b81e20b71e20b81e6a21b91e20b81e20b91e6a21ba1e20b91e20" - "ba1e6a21bb1e20ba1e20" - "bb1e6a21bc1e20bb1e20bc1e6a21bd1e20bc1e20bd1e6a21be1e20bd1e20be1e6a21bf1e20be1e20bf1e6a21c01e20" - "bf1e20c01e6a21c11e20" - "c01e20c11e6a21c21e20c11e20c21e6a21c31e20c21e20c31e6a21c41e20c31e20c41e6a21c51e20c41e20c51e6a21" - "c61e20c51e20c61e6a21" - "c71e20c61e20c71e6a21c81e20c71e20c81e6a21c91e20c81e20c91e6a21ca1e20c91e20ca1e6a21cb1e20ca1e20cb" - "1e6a21cc1e20cb1e20cc" - "1e6a21cd1e20cc1e20cd1e6a21ce1e20cd1e20ce1e6a21cf1e20ce1e20cf1e6a21d01e20cf1e20d01e6a21d11e20d0" - "1e20d11e6a21d21e20d1" - "1e20d21e6a21d31e20d21e20d31e6a21d41e20d31e20d41e6a21d51e20d41e20d51e6a21d61e20d51e20d61e6a21d7" - "1e20d61e20d71e6a21d8" - "1e20d71e20d81e6a21d91e20d81e20d91e6a21da1e20d91e20da1e6a21db1e20da1e20db1e6a21dc1e20db1e20dc1e" - "6a21dd1e20dc1e20dd1e" - "6a21de1e20dd1e20de1e6a21df1e20de1e20df1e6a21e01e20df1e20e01e6a21e11e20e01e20e11e6a21e21e20e11e" - "20e21e6a21e31e20e21e" - "20e31e6a21e41e20e31e20e41e6a21e51e20e41e20e51e6a21e61e20e51e20e61e6a21e71e20e61e20e71e6a21e81e" - "20e71e20e81e6a21e91e" - "20e81e20e91e6a21ea1e20e91e20ea1e6a21eb1e20ea1e20eb1e6a21ec1e20eb1e20ec1e6a21ed1e20ec1e20ed1e6a" - "21ee1e20ed1e20ee1e6a" - "21ef1e20ee1e20ef1e6a21f01e20ef1e20f01e6a21f11e20f01e20f11e6a21f21e20f11e20f21e6a21f31e20f21e20" - "f31e6a21f41e20f31e20" - "f41e6a21f51e20f41e20f51e6a21f61e20f51e20f61e6a21f71e20f61e20f71e6a21f81e20f71e20f81e6a21f91e20" - "f81e20f91e6a21fa1e20" - "f91e20fa1e6a21fb1e20fa1e20fb1e6a21fc1e20fb1e20fc1e6a21fd1e20fc1e20fd1e6a21fe1e20fd1e20fe1e6a21" - "ff1e20fe1e20ff1e6a21" - "801f20ff1e20801f6a21811f20801f20811f6a21821f20811f20821f6a21831f20821f20831f6a21841f20831f2084" - "1f6a21851f20841f2085" - "1f6a21861f20851f20861f6a21871f20861f20871f6a21881f20871f20881f6a21891f20881f20891f6a218a1f2089" - "1f208a1f6a218b1f208a" - "1f208b1f6a218c1f208b1f208c1f6a218d1f208c1f208d1f6a218e1f208d1f208e1f6a218f1f208e1f208f1f6a2190" - "1f208f1f20901f6a2191" - "1f20901f20911f6a21921f20911f20921f6a21931f20921f20931f6a21941f20931f20941f6a21951f20941f20951f" - "6a21961f20951f20961f" - "6a21971f20961f20971f6a21981f20971f20981f6a21991f20981f20991f6a219a1f20991f209a1f6a219b1f209a1f" - "209b1f6a219c1f209b1f" - "209c1f6a219d1f209c1f209d1f6a219e1f209d1f209e1f6a219f1f209e1f209f1f6a21a01f209f1f20a01f6a21a11f" - "20a01f20a11f6a21a21f" - "20a11f20a21f6a21a31f20a21f20a31f6a21a41f20a31f20a41f6a21a51f20a41f20a51f6a21a61f20a51f20a61f6a" - "21a71f20a61f20a71f6a" - "21a81f20a71f20a81f6a21a91f20a81f20a91f6a21aa1f20a91f20aa1f6a21ab1f20aa1f20ab1f6a21ac1f20ab1f20" - "ac1f6a21ad1f20ac1f20" - "ad1f6a21ae1f20ad1f20ae1f6a21af1f20ae1f20af1f6a21b01f20af1f20b01f6a21b11f20b01f20b11f6a21b21f20" - "b11f20b21f6a21b31f20" - "b21f20b31f6a21b41f20b31f20b41f6a21b51f20b41f20b51f6a21b61f20b51f20b61f6a21b71f20b61f20b71f6a21" - "b81f20b71f20b81f6a21" - "b91f20b81f20b91f6a21ba1f20b91f20ba1f6a21bb1f20ba1f20bb1f6a21bc1f20bb1f20bc1f6a21bd1f20bc1f20bd" - "1f6a21be1f20bd1f20be" - "1f6a21bf1f20be1f20bf1f6a21c01f20bf1f20c01f6a21c11f20c01f20c11f6a21c21f20c11f20c21f6a21c31f20c2" - "1f20c31f6a21c41f20c3" - "1f20c41f6a21c51f20c41f20c51f6a21c61f20c51f20c61f6a21c71f20c61f20c71f6a21c81f20c71f20c81f6a21c9" - "1f20c81f20c91f6a21ca" - "1f20c91f20ca1f6a21cb1f20ca1f20cb1f6a21cc1f20cb1f20cc1f6a21cd1f20cc1f20cd1f6a21ce1f20cd1f20ce1f" - "6a21cf1f20ce1f20cf1f" - "6a21d01f20cf1f20d01f6a21d11f20d01f20d11f6a21d21f20d11f20d21f6a21d31f20d21f20d31f6a21d41f20d31f" - "20d41f6a21d51f20d41f" + "cd1d20ce1d6a21cf1d20ce1d20cf1d6a21d01d20cf1d20d01d6a21d11d20d01d20d11d6a21d21d20d11d20d21d6a21" + "d31d20d21d20d31d6a21d41d20d31d20d41d6a21d51d20d41d20d51d6a21d61d20d51d20d61d6a21d71d20d61d20d7" + "1d6a21d81d20d71d20d81d6a21d91d20d81d20d91d6a21da1d20d91d20da1d6a21db1d20da1d20db1d6a21dc1d20db" + "1d20dc1d6a21dd1d20dc1d20dd1d6a21de1d20dd1d20de1d6a21df1d20de1d20df1d6a21e01d20df1d20e01d6a21e1" + "1d20e01d20e11d6a21e21d20e11d20e21d6a21e31d20e21d20e31d6a21e41d20e31d20e41d6a21e51d20e41d20e51d" + "6a21e61d20e51d20e61d6a21e71d20e61d20e71d6a21e81d20e71d20e81d6a21e91d20e81d20e91d6a21ea1d20e91d" + "20ea1d6a21eb1d20ea1d20eb1d6a21ec1d20eb1d20ec1d6a21ed1d20ec1d20ed1d6a21ee1d20ed1d20ee1d6a21ef1d" + "20ee1d20ef1d6a21f01d20ef1d20f01d6a21f11d20f01d20f11d6a21f21d20f11d20f21d6a21f31d20f21d20f31d6a" + "21f41d20f31d20f41d6a21f51d20f41d20f51d6a21f61d20f51d20f61d6a21f71d20f61d20f71d6a21f81d20f71d20" + "f81d6a21f91d20f81d20f91d6a21fa1d20f91d20fa1d6a21fb1d20fa1d20fb1d6a21fc1d20fb1d20fc1d6a21fd1d20" + "fc1d20fd1d6a21fe1d20fd1d20fe1d6a21ff1d20fe1d20ff1d6a21801e20ff1d20801e6a21811e20801e20811e6a21" + "821e20811e20821e6a21831e20821e20831e6a21841e20831e20841e6a21851e20841e20851e6a21861e20851e2086" + "1e6a21871e20861e20871e6a21881e20871e20881e6a21891e20881e20891e6a218a1e20891e208a1e6a218b1e208a" + "1e208b1e6a218c1e208b1e208c1e6a218d1e208c1e208d1e6a218e1e208d1e208e1e6a218f1e208e1e208f1e6a2190" + "1e208f1e20901e6a21911e20901e20911e6a21921e20911e20921e6a21931e20921e20931e6a21941e20931e20941e" + "6a21951e20941e20951e6a21961e20951e20961e6a21971e20961e20971e6a21981e20971e20981e6a21991e20981e" + "20991e6a219a1e20991e209a1e6a219b1e209a1e209b1e6a219c1e209b1e209c1e6a219d1e209c1e209d1e6a219e1e" + "209d1e209e1e6a219f1e209e1e209f1e6a21a01e209f1e20a01e6a21a11e20a01e20a11e6a21a21e20a11e20a21e6a" + "21a31e20a21e20a31e6a21a41e20a31e20a41e6a21a51e20a41e20a51e6a21a61e20a51e20a61e6a21a71e20a61e20" + "a71e6a21a81e20a71e20a81e6a21a91e20a81e20a91e6a21aa1e20a91e20aa1e6a21ab1e20aa1e20ab1e6a21ac1e20" + "ab1e20ac1e6a21ad1e20ac1e20ad1e6a21ae1e20ad1e20ae1e6a21af1e20ae1e20af1e6a21b01e20af1e20b01e6a21" + "b11e20b01e20b11e6a21b21e20b11e20b21e6a21b31e20b21e20b31e6a21b41e20b31e20b41e6a21b51e20b41e20b5" + "1e6a21b61e20b51e20b61e6a21b71e20b61e20b71e6a21b81e20b71e20b81e6a21b91e20b81e20b91e6a21ba1e20b9" + "1e20ba1e6a21bb1e20ba1e20bb1e6a21bc1e20bb1e20bc1e6a21bd1e20bc1e20bd1e6a21be1e20bd1e20be1e6a21bf" + "1e20be1e20bf1e6a21c01e20bf1e20c01e6a21c11e20c01e20c11e6a21c21e20c11e20c21e6a21c31e20c21e20c31e" + "6a21c41e20c31e20c41e6a21c51e20c41e20c51e6a21c61e20c51e20c61e6a21c71e20c61e20c71e6a21c81e20c71e" + "20c81e6a21c91e20c81e20c91e6a21ca1e20c91e20ca1e6a21cb1e20ca1e20cb1e6a21cc1e20cb1e20cc1e6a21cd1e" + "20cc1e20cd1e6a21ce1e20cd1e20ce1e6a21cf1e20ce1e20cf1e6a21d01e20cf1e20d01e6a21d11e20d01e20d11e6a" + "21d21e20d11e20d21e6a21d31e20d21e20d31e6a21d41e20d31e20d41e6a21d51e20d41e20d51e6a21d61e20d51e20" + "d61e6a21d71e20d61e20d71e6a21d81e20d71e20d81e6a21d91e20d81e20d91e6a21da1e20d91e20da1e6a21db1e20" + "da1e20db1e6a21dc1e20db1e20dc1e6a21dd1e20dc1e20dd1e6a21de1e20dd1e20de1e6a21df1e20de1e20df1e6a21" + "e01e20df1e20e01e6a21e11e20e01e20e11e6a21e21e20e11e20e21e6a21e31e20e21e20e31e6a21e41e20e31e20e4" + "1e6a21e51e20e41e20e51e6a21e61e20e51e20e61e6a21e71e20e61e20e71e6a21e81e20e71e20e81e6a21e91e20e8" + "1e20e91e6a21ea1e20e91e20ea1e6a21eb1e20ea1e20eb1e6a21ec1e20eb1e20ec1e6a21ed1e20ec1e20ed1e6a21ee" + "1e20ed1e20ee1e6a21ef1e20ee1e20ef1e6a21f01e20ef1e20f01e6a21f11e20f01e20f11e6a21f21e20f11e20f21e" + "6a21f31e20f21e20f31e6a21f41e20f31e20f41e6a21f51e20f41e20f51e6a21f61e20f51e20f61e6a21f71e20f61e" + "20f71e6a21f81e20f71e20f81e6a21f91e20f81e20f91e6a21fa1e20f91e20fa1e6a21fb1e20fa1e20fb1e6a21fc1e" + "20fb1e20fc1e6a21fd1e20fc1e20fd1e6a21fe1e20fd1e20fe1e6a21ff1e20fe1e20ff1e6a21801f20ff1e20801f6a" + "21811f20801f20811f6a21821f20811f20821f6a21831f20821f20831f6a21841f20831f20841f6a21851f20841f20" + "851f6a21861f20851f20861f6a21871f20861f20871f6a21881f20871f20881f6a21891f20881f20891f6a218a1f20" + "891f208a1f6a218b1f208a1f208b1f6a218c1f208b1f208c1f6a218d1f208c1f208d1f6a218e1f208d1f208e1f6a21" + "8f1f208e1f208f1f6a21901f208f1f20901f6a21911f20901f20911f6a21921f20911f20921f6a21931f20921f2093" + "1f6a21941f20931f20941f6a21951f20941f20951f6a21961f20951f20961f6a21971f20961f20971f6a21981f2097" + "1f20981f6a21991f20981f20991f6a219a1f20991f209a1f6a219b1f209a1f209b1f6a219c1f209b1f209c1f6a219d" + "1f209c1f209d1f6a219e1f209d1f209e1f6a219f1f209e1f209f1f6a21a01f209f1f20a01f6a21a11f20a01f20a11f" + "6a21a21f20a11f20a21f6a21a31f20a21f20a31f6a21a41f20a31f20a41f6a21a51f20a41f20a51f6a21a61f20a51f" + "20a61f6a21a71f20a61f20a71f6a21a81f20a71f20a81f6a21a91f20a81f20a91f6a21aa1f20a91f20aa1f6a21ab1f" + "20aa1f20ab1f6a21ac1f20ab1f20ac1f6a21ad1f20ac1f20ad1f6a21ae1f20ad1f20ae1f6a21af1f20ae1f20af1f6a" + "21b01f20af1f20b01f6a21b11f20b01f20b11f6a21b21f20b11f20b21f6a21b31f20b21f20b31f6a21b41f20b31f20" + "b41f6a21b51f20b41f20b51f6a21b61f20b51f20b61f6a21b71f20b61f20b71f6a21b81f20b71f20b81f6a21b91f20" + "b81f20b91f6a21ba1f20b91f20ba1f6a21bb1f20ba1f20bb1f6a21bc1f20bb1f20bc1f6a21bd1f20bc1f20bd1f6a21" + "be1f20bd1f20be1f6a21bf1f20be1f20bf1f6a21c01f20bf1f20c01f6a21c11f20c01f20c11f6a21c21f20c11f20c2" + "1f6a21c31f20c21f20c31f6a21c41f20c31f20c41f6a21c51f20c41f20c51f6a21c61f20c51f20c61f6a21c71f20c6" + "1f20c71f6a21c81f20c71f20c81f6a21c91f20c81f20c91f6a21ca1f20c91f20ca1f6a21cb1f20ca1f20cb1f6a21cc" + "1f20cb1f20cc1f6a21cd1f20cc1f20cd1f6a21ce1f20cd1f20ce1f6a21cf1f20ce1f20cf1f6a21d01f20cf1f20d01f" + "6a21d11f20d01f20d11f6a21d21f20d11f20d21f6a21d31f20d21f20d31f6a21d41f20d31f20d41f6a21d51f20d41f" "20d51f6a21d61f20d51f20d61f6a21d71f20d61f20d71f6a21d81f20d71f20d81f6a21d91f20d81f20d91f6a21da1f" - "20d91f20da1f6a21db1f" - "20da1f20db1f6a21dc1f20db1f20dc1f6a21dd1f20dc1f20dd1f6a21de1f20dd1f20de1f6a21df1f20de1f20df1f6a" - "21e01f20df1f20e01f6a" - "21e11f20e01f20e11f6a21e21f20e11f20e21f6a21e31f20e21f20e31f6a21e41f20e31f20e41f6a21e51f20e41f20" - "e51f6a21e61f20e51f20" - "e61f6a21e71f20e61f20e71f6a21e81f20e71f20e81f6a21e91f20e81f20e91f6a21ea1f20e91f20ea1f6a21eb1f20" - "ea1f20eb1f6a21ec1f20" - "eb1f20ec1f6a21ed1f20ec1f20ed1f6a21ee1f20ed1f20ee1f6a21ef1f20ee1f20ef1f6a21f01f20ef1f20f01f6a21" - "f11f20f01f20f11f6a21" - "f21f20f11f20f21f6a21f31f20f21f20f31f6a21f41f20f31f20f41f6a21f51f20f41f20f51f6a21f61f20f51f20f6" - "1f6a21f71f20f61f20f7" - "1f6a21f81f20f71f20f81f6a21f91f20f81f20f91f6a21fa1f20f91f20fa1f6a21fb1f20fa1f20fb1f6a21fc1f20fb" - "1f20fc1f6a21fd1f20fc" - "1f20fd1f6a21fe1f20fd1f20fe1f6a21ff1f20fe1f20ff1f6a21802020ff1f2080206a2181202080202081206a2182" - "202081202082206a2183" - "202082202083206a2184202083202084206a2185202084202085206a2186202085202086206a218720208620208720" - "6a218820208720208820" - "6a2189202088202089206a218a20208920208a206a218b20208a20208b206a218c20208b20208c206a218d20208c20" - "208d206a218e20208d20" - "208e206a218f20208e20208f206a219020208f202090206a2191202090202091206a2192202091202092206a219320" - "2092202093206a219420" - "2093202094206a2195202094202095206a2196202095202096206a2197202096202097206a2198202097202098206a" - "2199202098202099206a" - "219a20209920209a206a219b20209a20209b206a219c20209b20209c206a219d20209c20209d206a219e20209d2020" - "9e206a219f20209e2020" - "9f206a21a020209f2020a0206a21a12020a02020a1206a21a22020a12020a2206a21a32020a22020a3206a21a42020" - "a32020a4206a21a52020" - "a42020a5206a21a62020a52020a6206a21a72020a62020a7206a21a82020a72020a8206a21a92020a82020a9206a21" - "aa2020a92020aa206a21" - "ab2020aa2020ab206a21ac2020ab2020ac206a21ad2020ac2020ad206a21ae2020ad2020ae206a21af2020ae2020af" - "206a21b02020af2020b0" - "206a21b12020b02020b1206a21b22020b12020b2206a21b32020b22020b3206a21b42020b32020b4206a21b52020b4" - "2020b5206a21b62020b5" - "2020b6206a21b72020b62020b7206a21b82020b72020b8206a21b92020b82020b9206a21ba2020b92020ba206a21bb" - "2020ba2020bb206a21bc" - "2020bb2020bc206a21bd2020bc2020bd206a21be2020bd2020be206a21bf2020be2020bf206a21c02020bf2020c020" - "6a21c12020c02020c120" - "6a21c22020c12020c2206a21c32020c22020c3206a21c42020c32020c4206a21c52020c42020c5206a21c62020c520" - "20c6206a21c72020c620" - "20c7206a21c82020c72020c8206a21c92020c82020c9206a21ca2020c92020ca206a21cb2020ca2020cb206a21cc20" - "20cb2020cc206a21cd20" - "20cc2020cd206a21ce2020cd2020ce206a21cf2020ce2020cf206a21d02020cf2020d0206a21d12020d02020d1206a" - "21d22020d12020d2206a" - "21d32020d22020d3206a21d42020d32020d4206a21d52020d42020d5206a21d62020d52020d6206a21d72020d62020" - "d7206a21d82020d72020" - "d8206a21d92020d82020d9206a21da2020d92020da206a21db2020da2020db206a21dc2020db2020dc206a21dd2020" - "dc2020dd206a21de2020" - "dd2020de206a21df2020de2020df206a21e02020df2020e0206a21e12020e02020e1206a21e22020e12020e2206a21" - "e32020e22020e3206a21" - "e42020e32020e4206a21e52020e42020e5206a21e62020e52020e6206a21e72020e62020e7206a21e82020e72020e8" - "206a21e92020e82020e9" - "206a21ea2020e92020ea206a21eb2020ea2020eb206a21ec2020eb2020ec206a21ed2020ec2020ed206a21ee2020ed" - "2020ee206a21ef2020ee" - "2020ef206a21f02020ef2020f0206a21f12020f02020f1206a21f22020f12020f2206a21f32020f22020f3206a21f4" - "2020f32020f4206a21f5" - "2020f42020f5206a21f62020f52020f6206a21f72020f62020f7206a21f82020f72020f8206a21f92020f82020f920" - "6a21fa2020f92020fa20" - "6a21fb2020fa2020fb206a21fc2020fb2020fc206a21fd2020fc2020fd206a21fe2020fd2020fe206a21ff2020fe20" - "20ff206a21802120ff20" - "2080216a2181212080212081216a2182212081212082216a2183212082212083216a2184212083212084216a218521" - "2084212085216a218621" - "2085212086216a2187212086212087216a2188212087212088216a2189212088212089216a218a21208921208a216a" - "218b21208a21208b216a" - "218c21208b21208c216a218d21208c21208d216a218e21208d21208e216a218f21208e21208f216a219021208f2120" - "90216a21912120902120" - "91216a2192212091212092216a2193212092212093216a2194212093212094216a2195212094212095216a21962120" - "95212096216a21972120" - "96212097216a2198212097212098216a2199212098212099216a219a21209921209a216a219b21209a21209b216a21" - "9c21209b21209c216a21" - "9d21209c21209d216a219e21209d21209e216a219f21209e21209f216a21a021209f2120a0216a21a12120a02120a1" - "216a21a22120a12120a2" - "216a21a32120a22120a3216a21a42120a32120a4216a21a52120a42120a5216a21a62120a52120a6216a21a72120a6" - "2120a7216a21a82120a7" - "2120a8216a21a92120a82120a9216a21aa2120a92120aa216a21ab2120aa2120ab216a21ac2120ab2120ac216a21ad" - "2120ac2120ad216a21ae" - "2120ad2120ae216a21af2120ae2120af216a21b02120af2120b0216a21b12120b02120b1216a21b22120b12120b221" - "6a21b32120b22120b321" - "6a21b42120b32120b4216a21b52120b42120b5216a21b62120b52120b6216a21b72120b62120b7216a21b82120b721" - "20b8216a21b92120b821" - "20b9216a21ba2120b92120ba216a21bb2120ba2120bb216a21bc2120bb2120bc216a21bd2120bc2120bd216a21be21" - "20bd2120be216a21bf21" - "20be2120bf216a21c02120bf2120c0216a21c12120c02120c1216a21c22120c12120c2216a21c32120c22120c3216a" - "21c42120c32120c4216a" - "21c52120c42120c5216a21c62120c52120c6216a21c72120c62120c7216a21c82120c72120c8216a21c92120c82120" - "c9216a21ca2120c92120" - "ca216a21cb2120ca2120cb216a21cc2120cb2120cc216a21cd2120cc2120cd216a21ce2120cd2120ce216a21cf2120" - "ce2120cf216a21d02120" - "cf2120d0216a21d12120d02120d1216a21d22120d12120d2216a21d32120d22120d3216a21d42120d32120d4216a21" - "d52120d42120d5216a21" - "d62120d52120d6216a21d72120d62120d7216a21d82120d72120d8216a21d92120d82120d9216a21da2120d92120da" - "216a21db2120da2120db" - "216a21dc2120db2120dc216a21dd2120dc2120dd216a21de2120dd2120de216a21df2120de2120df216a21e02120df" - "2120e0216a21e12120e0" + "20d91f20da1f6a21db1f20da1f20db1f6a21dc1f20db1f20dc1f6a21dd1f20dc1f20dd1f6a21de1f20dd1f20de1f6a" + "21df1f20de1f20df1f6a21e01f20df1f20e01f6a21e11f20e01f20e11f6a21e21f20e11f20e21f6a21e31f20e21f20" + "e31f6a21e41f20e31f20e41f6a21e51f20e41f20e51f6a21e61f20e51f20e61f6a21e71f20e61f20e71f6a21e81f20" + "e71f20e81f6a21e91f20e81f20e91f6a21ea1f20e91f20ea1f6a21eb1f20ea1f20eb1f6a21ec1f20eb1f20ec1f6a21" + "ed1f20ec1f20ed1f6a21ee1f20ed1f20ee1f6a21ef1f20ee1f20ef1f6a21f01f20ef1f20f01f6a21f11f20f01f20f1" + "1f6a21f21f20f11f20f21f6a21f31f20f21f20f31f6a21f41f20f31f20f41f6a21f51f20f41f20f51f6a21f61f20f5" + "1f20f61f6a21f71f20f61f20f71f6a21f81f20f71f20f81f6a21f91f20f81f20f91f6a21fa1f20f91f20fa1f6a21fb" + "1f20fa1f20fb1f6a21fc1f20fb1f20fc1f6a21fd1f20fc1f20fd1f6a21fe1f20fd1f20fe1f6a21ff1f20fe1f20ff1f" + "6a21802020ff1f2080206a2181202080202081206a2182202081202082206a2183202082202083206a218420208320" + "2084206a2185202084202085206a2186202085202086206a2187202086202087206a2188202087202088206a218920" + "2088202089206a218a20208920208a206a218b20208a20208b206a218c20208b20208c206a218d20208c20208d206a" + "218e20208d20208e206a218f20208e20208f206a219020208f202090206a2191202090202091206a21922020912020" + "92206a2193202092202093206a2194202093202094206a2195202094202095206a2196202095202096206a21972020" + "96202097206a2198202097202098206a2199202098202099206a219a20209920209a206a219b20209a20209b206a21" + "9c20209b20209c206a219d20209c20209d206a219e20209d20209e206a219f20209e20209f206a21a020209f2020a0" + "206a21a12020a02020a1206a21a22020a12020a2206a21a32020a22020a3206a21a42020a32020a4206a21a52020a4" + "2020a5206a21a62020a52020a6206a21a72020a62020a7206a21a82020a72020a8206a21a92020a82020a9206a21aa" + "2020a92020aa206a21ab2020aa2020ab206a21ac2020ab2020ac206a21ad2020ac2020ad206a21ae2020ad2020ae20" + "6a21af2020ae2020af206a21b02020af2020b0206a21b12020b02020b1206a21b22020b12020b2206a21b32020b220" + "20b3206a21b42020b32020b4206a21b52020b42020b5206a21b62020b52020b6206a21b72020b62020b7206a21b820" + "20b72020b8206a21b92020b82020b9206a21ba2020b92020ba206a21bb2020ba2020bb206a21bc2020bb2020bc206a" + "21bd2020bc2020bd206a21be2020bd2020be206a21bf2020be2020bf206a21c02020bf2020c0206a21c12020c02020" + "c1206a21c22020c12020c2206a21c32020c22020c3206a21c42020c32020c4206a21c52020c42020c5206a21c62020" + "c52020c6206a21c72020c62020c7206a21c82020c72020c8206a21c92020c82020c9206a21ca2020c92020ca206a21" + "cb2020ca2020cb206a21cc2020cb2020cc206a21cd2020cc2020cd206a21ce2020cd2020ce206a21cf2020ce2020cf" + "206a21d02020cf2020d0206a21d12020d02020d1206a21d22020d12020d2206a21d32020d22020d3206a21d42020d3" + "2020d4206a21d52020d42020d5206a21d62020d52020d6206a21d72020d62020d7206a21d82020d72020d8206a21d9" + "2020d82020d9206a21da2020d92020da206a21db2020da2020db206a21dc2020db2020dc206a21dd2020dc2020dd20" + "6a21de2020dd2020de206a21df2020de2020df206a21e02020df2020e0206a21e12020e02020e1206a21e22020e120" + "20e2206a21e32020e22020e3206a21e42020e32020e4206a21e52020e42020e5206a21e62020e52020e6206a21e720" + "20e62020e7206a21e82020e72020e8206a21e92020e82020e9206a21ea2020e92020ea206a21eb2020ea2020eb206a" + "21ec2020eb2020ec206a21ed2020ec2020ed206a21ee2020ed2020ee206a21ef2020ee2020ef206a21f02020ef2020" + "f0206a21f12020f02020f1206a21f22020f12020f2206a21f32020f22020f3206a21f42020f32020f4206a21f52020" + "f42020f5206a21f62020f52020f6206a21f72020f62020f7206a21f82020f72020f8206a21f92020f82020f9206a21" + "fa2020f92020fa206a21fb2020fa2020fb206a21fc2020fb2020fc206a21fd2020fc2020fd206a21fe2020fd2020fe" + "206a21ff2020fe2020ff206a21802120ff202080216a2181212080212081216a2182212081212082216a2183212082" + "212083216a2184212083212084216a2185212084212085216a2186212085212086216a2187212086212087216a2188" + "212087212088216a2189212088212089216a218a21208921208a216a218b21208a21208b216a218c21208b21208c21" + "6a218d21208c21208d216a218e21208d21208e216a218f21208e21208f216a219021208f212090216a219121209021" + "2091216a2192212091212092216a2193212092212093216a2194212093212094216a2195212094212095216a219621" + "2095212096216a2197212096212097216a2198212097212098216a2199212098212099216a219a21209921209a216a" + "219b21209a21209b216a219c21209b21209c216a219d21209c21209d216a219e21209d21209e216a219f21209e2120" + "9f216a21a021209f2120a0216a21a12120a02120a1216a21a22120a12120a2216a21a32120a22120a3216a21a42120" + "a32120a4216a21a52120a42120a5216a21a62120a52120a6216a21a72120a62120a7216a21a82120a72120a8216a21" + "a92120a82120a9216a21aa2120a92120aa216a21ab2120aa2120ab216a21ac2120ab2120ac216a21ad2120ac2120ad" + "216a21ae2120ad2120ae216a21af2120ae2120af216a21b02120af2120b0216a21b12120b02120b1216a21b22120b1" + "2120b2216a21b32120b22120b3216a21b42120b32120b4216a21b52120b42120b5216a21b62120b52120b6216a21b7" + "2120b62120b7216a21b82120b72120b8216a21b92120b82120b9216a21ba2120b92120ba216a21bb2120ba2120bb21" + "6a21bc2120bb2120bc216a21bd2120bc2120bd216a21be2120bd2120be216a21bf2120be2120bf216a21c02120bf21" + "20c0216a21c12120c02120c1216a21c22120c12120c2216a21c32120c22120c3216a21c42120c32120c4216a21c521" + "20c42120c5216a21c62120c52120c6216a21c72120c62120c7216a21c82120c72120c8216a21c92120c82120c9216a" + "21ca2120c92120ca216a21cb2120ca2120cb216a21cc2120cb2120cc216a21cd2120cc2120cd216a21ce2120cd2120" + "ce216a21cf2120ce2120cf216a21d02120cf2120d0216a21d12120d02120d1216a21d22120d12120d2216a21d32120" + "d22120d3216a21d42120d32120d4216a21d52120d42120d5216a21d62120d52120d6216a21d72120d62120d7216a21" + "d82120d72120d8216a21d92120d82120d9216a21da2120d92120da216a21db2120da2120db216a21dc2120db2120dc" + "216a21dd2120dc2120dd216a21de2120dd2120de216a21df2120de2120df216a21e02120df2120e0216a21e12120e0" "2120e1216a21e22120e12120e2216a21e32120e22120e3216a21e42120e32120e4216a21e52120e42120e5216a21e6" - "2120e52120e6216a21e7" - "2120e62120e7216a21e82120e72120e8216a21e92120e82120e9216a21ea2120e92120ea216a21eb2120ea2120eb21" - "6a21ec2120eb2120ec21" - "6a21ed2120ec2120ed216a21ee2120ed2120ee216a21ef2120ee2120ef216a21f02120ef2120f0216a21f12120f021" - "20f1216a21f22120f121" - "20f2216a21f32120f22120f3216a21f42120f32120f4216a21f52120f42120f5216a21f62120f52120f6216a21f721" - "20f62120f7216a21f821" - "20f72120f8216a21f92120f82120f9216a21fa2120f92120fa216a21fb2120fa2120fb216a21fc2120fb2120fc216a" - "21fd2120fc2120fd216a" - "21fe2120fd2120fe216a21ff2120fe2120ff216a21802220ff212080226a2181222080222081226a21822220812220" - "82226a21832220822220" - "83226a2184222083222084226a2185222084222085226a2186222085222086226a2187222086222087226a21882220" - "87222088226a21892220" - "88222089226a218a22208922208a226a218b22208a22208b226a218c22208b22208c226a218d22208c22208d226a21" - "8e22208d22208e226a21" - "8f22208e22208f226a219022208f222090226a2191222090222091226a2192222091222092226a2193222092222093" - "226a2194222093222094" - "226a2195222094222095226a2196222095222096226a2197222096222097226a2198222097222098226a2199222098" - "222099226a219a222099" - "22209a226a219b22209a22209b226a219c22209b22209c226a219d22209c22209d226a219e22209d22209e226a219f" - "22209e22209f226a21a0" - "22209f2220a0226a21a12220a02220a1226a21a22220a12220a2226a21a32220a22220a3226a21a42220a32220a422" - "6a21a52220a42220a522" - "6a21a62220a52220a6226a21a72220a62220a7226a21a82220a72220a8226a21a92220a82220a9226a21aa2220a922" - "20aa226a21ab2220aa22" - "20ab226a21ac2220ab2220ac226a21ad2220ac2220ad226a21ae2220ad2220ae226a21af2220ae2220af226a21b022" - "20af2220b0226a21b122" - "20b02220b1226a21b22220b12220b2226a21b32220b22220b3226a21b42220b32220b4226a21b52220b42220b5226a" - "21b62220b52220b6226a" - "21b72220b62220b7226a21b82220b72220b8226a21b92220b82220b9226a21ba2220b92220ba226a21bb2220ba2220" - "bb226a21bc2220bb2220" - "bc226a21bd2220bc2220bd226a21be2220bd2220be226a21bf2220be2220bf226a21c02220bf2220c0226a21c12220" - "c02220c1226a21c22220" - "c12220c2226a21c32220c22220c3226a21c42220c32220c4226a21c52220c42220c5226a21c62220c52220c6226a21" - "c72220c62220c7226a21" - "c82220c72220c8226a21c92220c82220c9226a21ca2220c92220ca226a21cb2220ca2220cb226a21cc2220cb2220cc" - "226a21cd2220cc2220cd" - "226a21ce2220cd2220ce226a21cf2220ce2220cf226a21d02220cf2220d0226a21d12220d02220d1226a21d22220d1" - "2220d2226a21d32220d2" - "2220d3226a21d42220d32220d4226a21d52220d42220d5226a21d62220d52220d6226a21d72220d62220d7226a21d8" - "2220d72220d8226a21d9" - "2220d82220d9226a21da2220d92220da226a21db2220da2220db226a21dc2220db2220dc226a21dd2220dc2220dd22" - "6a21de2220dd2220de22" - "6a21df2220de2220df226a21e02220df2220e0226a21e12220e02220e1226a21e22220e12220e2226a21e32220e222" - "20e3226a21e42220e322" - "20e4226a21e52220e42220e5226a21e62220e52220e6226a21e72220e62220e7226a21e82220e72220e8226a21e922" - "20e82220e9226a21ea22" - "20e92220ea226a21eb2220ea2220eb226a21ec2220eb2220ec226a21ed2220ec2220ed226a21ee2220ed2220ee226a" - "21ef2220ee2220ef226a" - "21f02220ef2220f0226a21f12220f02220f1226a21f22220f12220f2226a21f32220f22220f3226a21f42220f32220" - "f4226a21f52220f42220" - "f5226a21f62220f52220f6226a21f72220f62220f7226a21f82220f72220f8226a21f92220f82220f9226a21fa2220" - "f92220fa226a21fb2220" - "fa2220fb226a21fc2220fb2220fc226a21fd2220fc2220fd226a21fe2220fd2220fe226a21ff2220fe2220ff226a21" - "802320ff222080236a21" - "81232080232081236a2182232081232082236a2183232082232083236a2184232083232084236a2185232084232085" - "236a2186232085232086" - "236a2187232086232087236a2188232087232088236a2189232088232089236a218a23208923208a236a218b23208a" - "23208b236a218c23208b" - "23208c236a218d23208c23208d236a218e23208d23208e236a218f23208e23208f236a219023208f232090236a2191" - "232090232091236a2192" - "232091232092236a2193232092232093236a2194232093232094236a2195232094232095236a219623209523209623" - "6a219723209623209723" - "6a2198232097232098236a2199232098232099236a219a23209923209a236a219b23209a23209b236a219c23209b23" - "209c236a219d23209c23" - "209d236a219e23209d23209e236a219f23209e23209f236a21a023209f2320a0236a21a12320a02320a1236a21a223" - "20a12320a2236a21a323" - "20a22320a3236a21a42320a32320a4236a21a52320a42320a5236a21a62320a52320a6236a21a72320a62320a7236a" - "21a82320a72320a8236a" - "21a92320a82320a9236a21aa2320a92320aa236a21ab2320aa2320ab236a21ac2320ab2320ac236a21ad2320ac2320" - "ad236a21ae2320ad2320" - "ae236a21af2320ae2320af236a21b02320af2320b0236a21b12320b02320b1236a21b22320b12320b2236a21b32320" - "b22320b3236a21b42320" - "b32320b4236a21b52320b42320b5236a21b62320b52320b6236a21b72320b62320b7236a21b82320b72320b8236a21" - "b92320b82320b9236a21" - "ba2320b92320ba236a21bb2320ba2320bb236a21bc2320bb2320bc236a21bd2320bc2320bd236a21be2320bd2320be" - "236a21bf2320be2320bf" - "236a21c02320bf2320c0236a21c12320c02320c1236a21c22320c12320c2236a21c32320c22320c3236a21c42320c3" - "2320c4236a21c52320c4" - "2320c5236a21c62320c52320c6236a21c72320c62320c7236a21c82320c72320c8236a21c92320c82320c9236a21ca" - "2320c92320ca236a21cb" - "2320ca2320cb236a21cc2320cb2320cc236a21cd2320cc2320cd236a21ce2320cd2320ce236a21cf2320ce2320cf23" - "6a21d02320cf2320d023" - "6a21d12320d02320d1236a21d22320d12320d2236a21d32320d22320d3236a21d42320d32320d4236a21d52320d423" - "20d5236a21d62320d523" - "20d6236a21d72320d62320d7236a21d82320d72320d8236a21d92320d82320d9236a21da2320d92320da236a21db23" - "20da2320db236a21dc23" - "20db2320dc236a21dd2320dc2320dd236a21de2320dd2320de236a21df2320de2320df236a21e02320df2320e0236a" - "21e12320e02320e1236a" - "21e22320e12320e2236a21e32320e22320e3236a21e42320e32320e4236a21e52320e42320e5236a21e62320e52320" - "e6236a21e72320e62320" - "e7236a21e82320e72320e8236a21e92320e82320e9236a21ea2320e92320ea236a21eb2320ea2320eb236a21ec2320" - "eb2320ec236a21ed2320" + "2120e52120e6216a21e72120e62120e7216a21e82120e72120e8216a21e92120e82120e9216a21ea2120e92120ea21" + "6a21eb2120ea2120eb216a21ec2120eb2120ec216a21ed2120ec2120ed216a21ee2120ed2120ee216a21ef2120ee21" + "20ef216a21f02120ef2120f0216a21f12120f02120f1216a21f22120f12120f2216a21f32120f22120f3216a21f421" + "20f32120f4216a21f52120f42120f5216a21f62120f52120f6216a21f72120f62120f7216a21f82120f72120f8216a" + "21f92120f82120f9216a21fa2120f92120fa216a21fb2120fa2120fb216a21fc2120fb2120fc216a21fd2120fc2120" + "fd216a21fe2120fd2120fe216a21ff2120fe2120ff216a21802220ff212080226a2181222080222081226a21822220" + "81222082226a2183222082222083226a2184222083222084226a2185222084222085226a2186222085222086226a21" + "87222086222087226a2188222087222088226a2189222088222089226a218a22208922208a226a218b22208a22208b" + "226a218c22208b22208c226a218d22208c22208d226a218e22208d22208e226a218f22208e22208f226a219022208f" + "222090226a2191222090222091226a2192222091222092226a2193222092222093226a2194222093222094226a2195" + "222094222095226a2196222095222096226a2197222096222097226a2198222097222098226a219922209822209922" + "6a219a22209922209a226a219b22209a22209b226a219c22209b22209c226a219d22209c22209d226a219e22209d22" + "209e226a219f22209e22209f226a21a022209f2220a0226a21a12220a02220a1226a21a22220a12220a2226a21a322" + "20a22220a3226a21a42220a32220a4226a21a52220a42220a5226a21a62220a52220a6226a21a72220a62220a7226a" + "21a82220a72220a8226a21a92220a82220a9226a21aa2220a92220aa226a21ab2220aa2220ab226a21ac2220ab2220" + "ac226a21ad2220ac2220ad226a21ae2220ad2220ae226a21af2220ae2220af226a21b02220af2220b0226a21b12220" + "b02220b1226a21b22220b12220b2226a21b32220b22220b3226a21b42220b32220b4226a21b52220b42220b5226a21" + "b62220b52220b6226a21b72220b62220b7226a21b82220b72220b8226a21b92220b82220b9226a21ba2220b92220ba" + "226a21bb2220ba2220bb226a21bc2220bb2220bc226a21bd2220bc2220bd226a21be2220bd2220be226a21bf2220be" + "2220bf226a21c02220bf2220c0226a21c12220c02220c1226a21c22220c12220c2226a21c32220c22220c3226a21c4" + "2220c32220c4226a21c52220c42220c5226a21c62220c52220c6226a21c72220c62220c7226a21c82220c72220c822" + "6a21c92220c82220c9226a21ca2220c92220ca226a21cb2220ca2220cb226a21cc2220cb2220cc226a21cd2220cc22" + "20cd226a21ce2220cd2220ce226a21cf2220ce2220cf226a21d02220cf2220d0226a21d12220d02220d1226a21d222" + "20d12220d2226a21d32220d22220d3226a21d42220d32220d4226a21d52220d42220d5226a21d62220d52220d6226a" + "21d72220d62220d7226a21d82220d72220d8226a21d92220d82220d9226a21da2220d92220da226a21db2220da2220" + "db226a21dc2220db2220dc226a21dd2220dc2220dd226a21de2220dd2220de226a21df2220de2220df226a21e02220" + "df2220e0226a21e12220e02220e1226a21e22220e12220e2226a21e32220e22220e3226a21e42220e32220e4226a21" + "e52220e42220e5226a21e62220e52220e6226a21e72220e62220e7226a21e82220e72220e8226a21e92220e82220e9" + "226a21ea2220e92220ea226a21eb2220ea2220eb226a21ec2220eb2220ec226a21ed2220ec2220ed226a21ee2220ed" + "2220ee226a21ef2220ee2220ef226a21f02220ef2220f0226a21f12220f02220f1226a21f22220f12220f2226a21f3" + "2220f22220f3226a21f42220f32220f4226a21f52220f42220f5226a21f62220f52220f6226a21f72220f62220f722" + "6a21f82220f72220f8226a21f92220f82220f9226a21fa2220f92220fa226a21fb2220fa2220fb226a21fc2220fb22" + "20fc226a21fd2220fc2220fd226a21fe2220fd2220fe226a21ff2220fe2220ff226a21802320ff222080236a218123" + "2080232081236a2182232081232082236a2183232082232083236a2184232083232084236a2185232084232085236a" + "2186232085232086236a2187232086232087236a2188232087232088236a2189232088232089236a218a2320892320" + "8a236a218b23208a23208b236a218c23208b23208c236a218d23208c23208d236a218e23208d23208e236a218f2320" + "8e23208f236a219023208f232090236a2191232090232091236a2192232091232092236a2193232092232093236a21" + "94232093232094236a2195232094232095236a2196232095232096236a2197232096232097236a2198232097232098" + "236a2199232098232099236a219a23209923209a236a219b23209a23209b236a219c23209b23209c236a219d23209c" + "23209d236a219e23209d23209e236a219f23209e23209f236a21a023209f2320a0236a21a12320a02320a1236a21a2" + "2320a12320a2236a21a32320a22320a3236a21a42320a32320a4236a21a52320a42320a5236a21a62320a52320a623" + "6a21a72320a62320a7236a21a82320a72320a8236a21a92320a82320a9236a21aa2320a92320aa236a21ab2320aa23" + "20ab236a21ac2320ab2320ac236a21ad2320ac2320ad236a21ae2320ad2320ae236a21af2320ae2320af236a21b023" + "20af2320b0236a21b12320b02320b1236a21b22320b12320b2236a21b32320b22320b3236a21b42320b32320b4236a" + "21b52320b42320b5236a21b62320b52320b6236a21b72320b62320b7236a21b82320b72320b8236a21b92320b82320" + "b9236a21ba2320b92320ba236a21bb2320ba2320bb236a21bc2320bb2320bc236a21bd2320bc2320bd236a21be2320" + "bd2320be236a21bf2320be2320bf236a21c02320bf2320c0236a21c12320c02320c1236a21c22320c12320c2236a21" + "c32320c22320c3236a21c42320c32320c4236a21c52320c42320c5236a21c62320c52320c6236a21c72320c62320c7" + "236a21c82320c72320c8236a21c92320c82320c9236a21ca2320c92320ca236a21cb2320ca2320cb236a21cc2320cb" + "2320cc236a21cd2320cc2320cd236a21ce2320cd2320ce236a21cf2320ce2320cf236a21d02320cf2320d0236a21d1" + "2320d02320d1236a21d22320d12320d2236a21d32320d22320d3236a21d42320d32320d4236a21d52320d42320d523" + "6a21d62320d52320d6236a21d72320d62320d7236a21d82320d72320d8236a21d92320d82320d9236a21da2320d923" + "20da236a21db2320da2320db236a21dc2320db2320dc236a21dd2320dc2320dd236a21de2320dd2320de236a21df23" + "20de2320df236a21e02320df2320e0236a21e12320e02320e1236a21e22320e12320e2236a21e32320e22320e3236a" + "21e42320e32320e4236a21e52320e42320e5236a21e62320e52320e6236a21e72320e62320e7236a21e82320e72320" + "e8236a21e92320e82320e9236a21ea2320e92320ea236a21eb2320ea2320eb236a21ec2320eb2320ec236a21ed2320" "ec2320ed236a21ee2320ed2320ee236a21ef2320ee2320ef236a21f02320ef2320f0236a21f12320f02320f1236a21" - "f22320f12320f2236a21" - "f32320f22320f3236a21f42320f32320f4236a21f52320f42320f5236a21f62320f52320f6236a21f72320f62320f7" - "236a21f82320f72320f8" - "236a21f92320f82320f9236a21fa2320f92320fa236a21fb2320fa2320fb236a21fc2320fb2320fc236a21fd2320fc" - "2320fd236a21fe2320fd" - "2320fe236a21ff2320fe2320ff236a21802420ff232080246a2181242080242081246a2182242081242082246a2183" - "242082242083246a2184" - "242083242084246a2185242084242085246a2186242085242086246a2187242086242087246a218824208724208824" - "6a218924208824208924" - "6a218a24208924208a246a218b24208a24208b246a218c24208b24208c246a218d24208c24208d246a218e24208d24" - "208e246a218f24208e24" - "208f246a219024208f242090246a2191242090242091246a2192242091242092246a2193242092242093246a219424" - "2093242094246a219524" - "2094242095246a2196242095242096246a2197242096242097246a2198242097242098246a2199242098242099246a" - "219a24209924209a246a" - "219b24209a24209b246a219c24209b24209c246a219d24209c24209d246a219e24209d24209e246a219f24209e2420" - "9f246a21a024209f2420" - "a0246a21a12420a02420a1246a21a22420a12420a2246a21a32420a22420a3246a21a42420a32420a4246a21a52420" - "a42420a5246a21a62420" - "a52420a6246a21a72420a62420a7246a21a82420a72420a8246a21a92420a82420a9246a21aa2420a92420aa246a21" - "ab2420aa2420ab246a21" - "ac2420ab2420ac246a21ad2420ac2420ad246a21ae2420ad2420ae246a21af2420ae2420af246a21b02420af2420b0" - "246a21b12420b02420b1" - "246a21b22420b12420b2246a21b32420b22420b3246a21b42420b32420b4246a21b52420b42420b5246a21b62420b5" - "2420b6246a21b72420b6" - "2420b7246a21b82420b72420b8246a21b92420b82420b9246a21ba2420b92420ba246a21bb2420ba2420bb246a21bc" - "2420bb2420bc246a21bd" - "2420bc2420bd246a21be2420bd2420be246a21bf2420be2420bf246a21c02420bf2420c0246a21c12420c02420c124" - "6a21c22420c12420c224" - "6a21c32420c22420c3246a21c42420c32420c4246a21c52420c42420c5246a21c62420c52420c6246a21c72420c624" - "20c7246a21c82420c724" - "20c8246a21c92420c82420c9246a21ca2420c92420ca246a21cb2420ca2420cb246a21cc2420cb2420cc246a21cd24" - "20cc2420cd246a21ce24" - "20cd2420ce246a21cf2420ce2420cf246a21d02420cf2420d0246a21d12420d02420d1246a21d22420d12420d2246a" - "21d32420d22420d3246a" - "21d42420d32420d4246a21d52420d42420d5246a21d62420d52420d6246a21d72420d62420d7246a21d82420d72420" - "d8246a21d92420d82420" - "d9246a21da2420d92420da246a21db2420da2420db246a21dc2420db2420dc246a21dd2420dc2420dd246a21de2420" - "dd2420de246a21df2420" - "de2420df246a21e02420df2420e0246a21e12420e02420e1246a21e22420e12420e2246a21e32420e22420e3246a21" - "e42420e32420e4246a21" - "e52420e42420e5246a21e62420e52420e6246a21e72420e62420e7246a21e82420e72420e8246a21e92420e82420e9" - "246a21ea2420e92420ea" - "246a21eb2420ea2420eb246a21ec2420eb2420ec246a21ed2420ec2420ed246a21ee2420ed2420ee246a21ef2420ee" - "2420ef246a21f02420ef" - "2420f0246a21f12420f02420f1246a21f22420f12420f2246a21f32420f22420f3246a21f42420f32420f4246a21f5" - "2420f42420f5246a21f6" - "2420f52420f6246a21f72420f62420f7246a21f82420f72420f8246a21f92420f82420f9246a21fa2420f92420fa24" - "6a21fb2420fa2420fb24" - "6a21fc2420fb2420fc246a21fd2420fc2420fd246a21fe2420fd2420fe246a21ff2420fe2420ff246a21802520ff24" - "2080256a218125208025" - "2081256a2182252081252082256a2183252082252083256a2184252083252084256a2185252084252085256a218625" - "2085252086256a218725" - "2086252087256a2188252087252088256a2189252088252089256a218a25208925208a256a218b25208a25208b256a" - "218c25208b25208c256a" - "218d25208c25208d256a218e25208d25208e256a218f25208e25208f256a219025208f252090256a21912520902520" - "91256a21922520912520" - "92256a2193252092252093256a2194252093252094256a2195252094252095256a2196252095252096256a21972520" - "96252097256a21982520" - "97252098256a2199252098252099256a219a25209925209a256a219b25209a25209b256a219c25209b25209c256a21" - "9d25209c25209d256a21" - "9e25209d25209e256a219f25209e25209f256a21a025209f2520a0256a21a12520a02520a1256a21a22520a12520a2" - "256a21a32520a22520a3" - "256a21a42520a32520a4256a21a52520a42520a5256a21a62520a52520a6256a21a72520a62520a7256a21a82520a7" - "2520a8256a21a92520a8" - "2520a9256a21aa2520a92520aa256a21ab2520aa2520ab256a21ac2520ab2520ac256a21ad2520ac2520ad256a21ae" - "2520ad2520ae256a21af" - "2520ae2520af256a21b02520af2520b0256a21b12520b02520b1256a21b22520b12520b2256a21b32520b22520b325" - "6a21b42520b32520b425" - "6a21b52520b42520b5256a21b62520b52520b6256a21b72520b62520b7256a21b82520b72520b8256a21b92520b825" - "20b9256a21ba2520b925" - "20ba256a21bb2520ba2520bb256a21bc2520bb2520bc256a21bd2520bc2520bd256a21be2520bd2520be256a21bf25" - "20be2520bf256a21c025" - "20bf2520c0256a21c12520c02520c1256a21c22520c12520c2256a21c32520c22520c3256a21c42520c32520c4256a" - "21c52520c42520c5256a" - "21c62520c52520c6256a21c72520c62520c7256a21c82520c72520c8256a21c92520c82520c9256a21ca2520c92520" - "ca256a21cb2520ca2520" - "cb256a21cc2520cb2520cc256a21cd2520cc2520cd256a21ce2520cd2520ce256a21cf2520ce2520cf256a21d02520" - "cf2520d0256a21d12520" - "d02520d1256a21d22520d12520d2256a21d32520d22520d3256a21d42520d32520d4256a21d52520d42520d5256a21" - "d62520d52520d6256a21" - "d72520d62520d7256a21d82520d72520d8256a21d92520d82520d9256a21da2520d92520da256a21db2520da2520db" - "256a21dc2520db2520dc" - "256a21dd2520dc2520dd256a21de2520dd2520de256a21df2520de2520df256a21e02520df2520e0256a21e12520e0" - "2520e1256a21e22520e1" - "2520e2256a21e32520e22520e3256a21e42520e32520e4256a21e52520e42520e5256a21e62520e52520e6256a21e7" - "2520e62520e7256a21e8" - "2520e72520e8256a21e92520e82520e9256a21ea2520e92520ea256a21eb2520ea2520eb256a21ec2520eb2520ec25" - "6a21ed2520ec2520ed25" - "6a21ee2520ed2520ee256a21ef2520ee2520ef256a21f02520ef2520f0256a21f12520f02520f1256a21f22520f125" - "20f2256a21f32520f225" - "20f3256a21f42520f32520f4256a21f52520f42520f5256a21f62520f52520f6256a21f72520f62520f7256a21f825" - "20f72520f8256a21f925" + "f22320f12320f2236a21f32320f22320f3236a21f42320f32320f4236a21f52320f42320f5236a21f62320f52320f6" + "236a21f72320f62320f7236a21f82320f72320f8236a21f92320f82320f9236a21fa2320f92320fa236a21fb2320fa" + "2320fb236a21fc2320fb2320fc236a21fd2320fc2320fd236a21fe2320fd2320fe236a21ff2320fe2320ff236a2180" + "2420ff232080246a2181242080242081246a2182242081242082246a2183242082242083246a218424208324208424" + "6a2185242084242085246a2186242085242086246a2187242086242087246a2188242087242088246a218924208824" + "2089246a218a24208924208a246a218b24208a24208b246a218c24208b24208c246a218d24208c24208d246a218e24" + "208d24208e246a218f24208e24208f246a219024208f242090246a2191242090242091246a2192242091242092246a" + "2193242092242093246a2194242093242094246a2195242094242095246a2196242095242096246a21972420962420" + "97246a2198242097242098246a2199242098242099246a219a24209924209a246a219b24209a24209b246a219c2420" + "9b24209c246a219d24209c24209d246a219e24209d24209e246a219f24209e24209f246a21a024209f2420a0246a21" + "a12420a02420a1246a21a22420a12420a2246a21a32420a22420a3246a21a42420a32420a4246a21a52420a42420a5" + "246a21a62420a52420a6246a21a72420a62420a7246a21a82420a72420a8246a21a92420a82420a9246a21aa2420a9" + "2420aa246a21ab2420aa2420ab246a21ac2420ab2420ac246a21ad2420ac2420ad246a21ae2420ad2420ae246a21af" + "2420ae2420af246a21b02420af2420b0246a21b12420b02420b1246a21b22420b12420b2246a21b32420b22420b324" + "6a21b42420b32420b4246a21b52420b42420b5246a21b62420b52420b6246a21b72420b62420b7246a21b82420b724" + "20b8246a21b92420b82420b9246a21ba2420b92420ba246a21bb2420ba2420bb246a21bc2420bb2420bc246a21bd24" + "20bc2420bd246a21be2420bd2420be246a21bf2420be2420bf246a21c02420bf2420c0246a21c12420c02420c1246a" + "21c22420c12420c2246a21c32420c22420c3246a21c42420c32420c4246a21c52420c42420c5246a21c62420c52420" + "c6246a21c72420c62420c7246a21c82420c72420c8246a21c92420c82420c9246a21ca2420c92420ca246a21cb2420" + "ca2420cb246a21cc2420cb2420cc246a21cd2420cc2420cd246a21ce2420cd2420ce246a21cf2420ce2420cf246a21" + "d02420cf2420d0246a21d12420d02420d1246a21d22420d12420d2246a21d32420d22420d3246a21d42420d32420d4" + "246a21d52420d42420d5246a21d62420d52420d6246a21d72420d62420d7246a21d82420d72420d8246a21d92420d8" + "2420d9246a21da2420d92420da246a21db2420da2420db246a21dc2420db2420dc246a21dd2420dc2420dd246a21de" + "2420dd2420de246a21df2420de2420df246a21e02420df2420e0246a21e12420e02420e1246a21e22420e12420e224" + "6a21e32420e22420e3246a21e42420e32420e4246a21e52420e42420e5246a21e62420e52420e6246a21e72420e624" + "20e7246a21e82420e72420e8246a21e92420e82420e9246a21ea2420e92420ea246a21eb2420ea2420eb246a21ec24" + "20eb2420ec246a21ed2420ec2420ed246a21ee2420ed2420ee246a21ef2420ee2420ef246a21f02420ef2420f0246a" + "21f12420f02420f1246a21f22420f12420f2246a21f32420f22420f3246a21f42420f32420f4246a21f52420f42420" + "f5246a21f62420f52420f6246a21f72420f62420f7246a21f82420f72420f8246a21f92420f82420f9246a21fa2420" + "f92420fa246a21fb2420fa2420fb246a21fc2420fb2420fc246a21fd2420fc2420fd246a21fe2420fd2420fe246a21" + "ff2420fe2420ff246a21802520ff242080256a2181252080252081256a2182252081252082256a2183252082252083" + "256a2184252083252084256a2185252084252085256a2186252085252086256a2187252086252087256a2188252087" + "252088256a2189252088252089256a218a25208925208a256a218b25208a25208b256a218c25208b25208c256a218d" + "25208c25208d256a218e25208d25208e256a218f25208e25208f256a219025208f252090256a219125209025209125" + "6a2192252091252092256a2193252092252093256a2194252093252094256a2195252094252095256a219625209525" + "2096256a2197252096252097256a2198252097252098256a2199252098252099256a219a25209925209a256a219b25" + "209a25209b256a219c25209b25209c256a219d25209c25209d256a219e25209d25209e256a219f25209e25209f256a" + "21a025209f2520a0256a21a12520a02520a1256a21a22520a12520a2256a21a32520a22520a3256a21a42520a32520" + "a4256a21a52520a42520a5256a21a62520a52520a6256a21a72520a62520a7256a21a82520a72520a8256a21a92520" + "a82520a9256a21aa2520a92520aa256a21ab2520aa2520ab256a21ac2520ab2520ac256a21ad2520ac2520ad256a21" + "ae2520ad2520ae256a21af2520ae2520af256a21b02520af2520b0256a21b12520b02520b1256a21b22520b12520b2" + "256a21b32520b22520b3256a21b42520b32520b4256a21b52520b42520b5256a21b62520b52520b6256a21b72520b6" + "2520b7256a21b82520b72520b8256a21b92520b82520b9256a21ba2520b92520ba256a21bb2520ba2520bb256a21bc" + "2520bb2520bc256a21bd2520bc2520bd256a21be2520bd2520be256a21bf2520be2520bf256a21c02520bf2520c025" + "6a21c12520c02520c1256a21c22520c12520c2256a21c32520c22520c3256a21c42520c32520c4256a21c52520c425" + "20c5256a21c62520c52520c6256a21c72520c62520c7256a21c82520c72520c8256a21c92520c82520c9256a21ca25" + "20c92520ca256a21cb2520ca2520cb256a21cc2520cb2520cc256a21cd2520cc2520cd256a21ce2520cd2520ce256a" + "21cf2520ce2520cf256a21d02520cf2520d0256a21d12520d02520d1256a21d22520d12520d2256a21d32520d22520" + "d3256a21d42520d32520d4256a21d52520d42520d5256a21d62520d52520d6256a21d72520d62520d7256a21d82520" + "d72520d8256a21d92520d82520d9256a21da2520d92520da256a21db2520da2520db256a21dc2520db2520dc256a21" + "dd2520dc2520dd256a21de2520dd2520de256a21df2520de2520df256a21e02520df2520e0256a21e12520e02520e1" + "256a21e22520e12520e2256a21e32520e22520e3256a21e42520e32520e4256a21e52520e42520e5256a21e62520e5" + "2520e6256a21e72520e62520e7256a21e82520e72520e8256a21e92520e82520e9256a21ea2520e92520ea256a21eb" + "2520ea2520eb256a21ec2520eb2520ec256a21ed2520ec2520ed256a21ee2520ed2520ee256a21ef2520ee2520ef25" + "6a21f02520ef2520f0256a21f12520f02520f1256a21f22520f12520f2256a21f32520f22520f3256a21f42520f325" + "20f4256a21f52520f42520f5256a21f62520f52520f6256a21f72520f62520f7256a21f82520f72520f8256a21f925" "20f82520f9256a21fa2520f92520fa256a21fb2520fa2520fb256a21fc2520fb2520fc256a21fd2520fc2520fd256a" - "21fe2520fd2520fe256a" - "21ff2520fe2520ff256a21802620ff252080266a2181262080262081266a2182262081262082266a21832620822620" - "83266a21842620832620" - "84266a2185262084262085266a2186262085262086266a2187262086262087266a2188262087262088266a21892620" - "88262089266a218a2620" - "8926208a266a218b26208a26208b266a218c26208b26208c266a218d26208c26208d266a218e26208d26208e266a21" - "8f26208e26208f266a21" - "9026208f262090266a2191262090262091266a2192262091262092266a2193262092262093266a2194262093262094" - "266a2195262094262095" - "266a2196262095262096266a2197262096262097266a2198262097262098266a2199262098262099266a219a262099" - "26209a266a219b26209a" - "26209b266a219c26209b26209c266a219d26209c26209d266a219e26209d26209e266a219f26209e26209f266a21a0" - "26209f2620a0266a21a1" - "2620a02620a1266a21a22620a12620a2266a21a32620a22620a3266a21a42620a32620a4266a21a52620a42620a526" - "6a21a62620a52620a626" - "6a21a72620a62620a7266a21a82620a72620a8266a21a92620a82620a9266a21aa2620a92620aa266a21ab2620aa26" - "20ab266a21ac2620ab26" - "20ac266a21ad2620ac2620ad266a21ae2620ad2620ae266a21af2620ae2620af266a21b02620af2620b0266a21b126" - "20b02620b1266a21b226" - "20b12620b2266a21b32620b22620b3266a21b42620b32620b4266a21b52620b42620b5266a21b62620b52620b6266a" - "21b72620b62620b7266a" - "21b82620b72620b8266a21b92620b82620b9266a21ba2620b92620ba266a21bb2620ba2620bb266a21bc2620bb2620" - "bc266a21bd2620bc2620" - "bd266a21be2620bd2620be266a21bf2620be2620bf266a21c02620bf2620c0266a21c12620c02620c1266a21c22620" - "c12620c2266a21c32620" - "c22620c3266a21c42620c32620c4266a21c52620c42620c5266a21c62620c52620c6266a21c72620c62620c7266a21" - "c82620c72620c8266a21" - "c92620c82620c9266a21ca2620c92620ca266a21cb2620ca2620cb266a21cc2620cb2620cc266a21cd2620cc2620cd" - "266a21ce2620cd2620ce" - "266a21cf2620ce2620cf266a21d02620cf2620d0266a21d12620d02620d1266a21d22620d12620d2266a21d32620d2" - "2620d3266a21d42620d3" - "2620d4266a21d52620d42620d5266a21d62620d52620d6266a21d72620d62620d7266a21d82620d72620d8266a21d9" - "2620d82620d9266a21da" - "2620d92620da266a21db2620da2620db266a21dc2620db2620dc266a21dd2620dc2620dd266a21de2620dd2620de26" - "6a21df2620de2620df26" - "6a21e02620df2620e0266a21e12620e02620e1266a21e22620e12620e2266a21e32620e22620e3266a21e42620e326" - "20e4266a21e52620e426" - "20e5266a21e62620e52620e6266a21e72620e62620e7266a21e82620e72620e8266a21e92620e82620e9266a21ea26" - "20e92620ea266a21eb26" - "20ea2620eb266a21ec2620eb2620ec266a21ed2620ec2620ed266a21ee2620ed2620ee266a21ef2620ee2620ef266a" - "21f02620ef2620f0266a" - "21f12620f02620f1266a21f22620f12620f2266a21f32620f22620f3266a21f42620f32620f4266a21f52620f42620" - "f5266a21f62620f52620" - "f6266a21f72620f62620f7266a21f82620f72620f8266a21f92620f82620f9266a21fa2620f92620fa266a21fb2620" - "fa2620fb266a21fc2620" - "fb2620fc266a21fd2620fc2620fd266a21fe2620fd2620fe266a21ff2620fe2620ff266a21802720ff262080276a21" - "81272080272081276a21" - "82272081272082276a2183272082272083276a2184272083272084276a2185272084272085276a2186272085272086" - "276a2187272086272087" - "276a2188272087272088276a2189272088272089276a218a27208927208a276a218b27208a27208b276a218c27208b" - "27208c276a218d27208c" - "27208d276a218e27208d27208e276a218f27208e27208f276a219027208f272090276a2191272090272091276a2192" - "272091272092276a2193" - "272092272093276a2194272093272094276a2195272094272095276a2196272095272096276a219727209627209727" - "6a219827209727209827" - "6a2199272098272099276a219a27209927209a276a219b27209a27209b276a219c27209b27209c276a219d27209c27" - "209d276a219e27209d27" - "209e276a219f27209e27209f276a21a027209f2720a0276a21a12720a02720a1276a21a22720a12720a2276a21a327" - "20a22720a3276a21a427" - "20a32720a4276a21a52720a42720a5276a21a62720a52720a6276a21a72720a62720a7276a21a82720a72720a8276a" - "21a92720a82720a9276a" - "21aa2720a92720aa276a21ab2720aa2720ab276a21ac2720ab2720ac276a21ad2720ac2720ad276a21ae2720ad2720" - "ae276a21af2720ae2720" - "af276a21b02720af2720b0276a21b12720b02720b1276a21b22720b12720b2276a21b32720b22720b3276a21b42720" - "b32720b4276a21b52720" - "b42720b5276a21b62720b52720b6276a21b72720b62720b7276a21b82720b72720b8276a21b92720b82720b9276a21" - "ba2720b92720ba276a21" - "bb2720ba2720bb276a21bc2720bb2720bc276a21bd2720bc2720bd276a21be2720bd2720be276a21bf2720be2720bf" - "276a21c02720bf2720c0" - "276a21c12720c02720c1276a21c22720c12720c2276a21c32720c22720c3276a21c42720c32720c4276a21c52720c4" - "2720c5276a21c62720c5" - "2720c6276a21c72720c62720c7276a21c82720c72720c8276a21c92720c82720c9276a21ca2720c92720ca276a21cb" - "2720ca2720cb276a21cc" - "2720cb2720cc276a21cd2720cc2720cd276a21ce2720cd2720ce276a21cf2720ce2720cf276a21d02720cf2720d027" - "6a21d12720d02720d127" - "6a21d22720d12720d2276a21d32720d22720d3276a21d42720d32720d4276a21d52720d42720d5276a21d62720d527" - "20d6276a21d72720d627" - "20d7276a21d82720d72720d8276a21d92720d82720d9276a21da2720d92720da276a21db2720da2720db276a21dc27" - "20db2720dc276a21dd27" - "20dc2720dd276a21de2720dd2720de276a21df2720de2720df276a21e02720df2720e0276a21e12720e02720e1276a" - "21e22720e12720e2276a" - "21e32720e22720e3276a21e42720e32720e4276a21e52720e42720e5276a21e62720e52720e6276a21e72720e62720" - "e7276a21e82720e72720" - "e8276a21e92720e82720e9276a21ea2720e92720ea276a21eb2720ea2720eb276a21ec2720eb2720ec276a21ed2720" - "ec2720ed276a21ee2720" - "ed2720ee276a21ef2720ee2720ef276a21f02720ef2720f0276a21f12720f02720f1276a21f22720f12720f2276a21" - "f32720f22720f3276a21" - "f42720f32720f4276a21f52720f42720f5276a21f62720f52720f6276a21f72720f62720f7276a21f82720f72720f8" - "276a21f92720f82720f9" - "276a21fa2720f92720fa276a21fb2720fa2720fb276a21fc2720fb2720fc276a21fd2720fc2720fd276a21fe2720fd" - "2720fe276a21ff2720fe" - "2720ff276a21802820ff272080286a2181282080282081286a2182282081282082286a2183282082282083286a2184" - "282083282084286a2185" + "21fe2520fd2520fe256a21ff2520fe2520ff256a21802620ff252080266a2181262080262081266a21822620812620" + "82266a2183262082262083266a2184262083262084266a2185262084262085266a2186262085262086266a21872620" + "86262087266a2188262087262088266a2189262088262089266a218a26208926208a266a218b26208a26208b266a21" + "8c26208b26208c266a218d26208c26208d266a218e26208d26208e266a218f26208e26208f266a219026208f262090" + "266a2191262090262091266a2192262091262092266a2193262092262093266a2194262093262094266a2195262094" + "262095266a2196262095262096266a2197262096262097266a2198262097262098266a2199262098262099266a219a" + "26209926209a266a219b26209a26209b266a219c26209b26209c266a219d26209c26209d266a219e26209d26209e26" + "6a219f26209e26209f266a21a026209f2620a0266a21a12620a02620a1266a21a22620a12620a2266a21a32620a226" + "20a3266a21a42620a32620a4266a21a52620a42620a5266a21a62620a52620a6266a21a72620a62620a7266a21a826" + "20a72620a8266a21a92620a82620a9266a21aa2620a92620aa266a21ab2620aa2620ab266a21ac2620ab2620ac266a" + "21ad2620ac2620ad266a21ae2620ad2620ae266a21af2620ae2620af266a21b02620af2620b0266a21b12620b02620" + "b1266a21b22620b12620b2266a21b32620b22620b3266a21b42620b32620b4266a21b52620b42620b5266a21b62620" + "b52620b6266a21b72620b62620b7266a21b82620b72620b8266a21b92620b82620b9266a21ba2620b92620ba266a21" + "bb2620ba2620bb266a21bc2620bb2620bc266a21bd2620bc2620bd266a21be2620bd2620be266a21bf2620be2620bf" + "266a21c02620bf2620c0266a21c12620c02620c1266a21c22620c12620c2266a21c32620c22620c3266a21c42620c3" + "2620c4266a21c52620c42620c5266a21c62620c52620c6266a21c72620c62620c7266a21c82620c72620c8266a21c9" + "2620c82620c9266a21ca2620c92620ca266a21cb2620ca2620cb266a21cc2620cb2620cc266a21cd2620cc2620cd26" + "6a21ce2620cd2620ce266a21cf2620ce2620cf266a21d02620cf2620d0266a21d12620d02620d1266a21d22620d126" + "20d2266a21d32620d22620d3266a21d42620d32620d4266a21d52620d42620d5266a21d62620d52620d6266a21d726" + "20d62620d7266a21d82620d72620d8266a21d92620d82620d9266a21da2620d92620da266a21db2620da2620db266a" + "21dc2620db2620dc266a21dd2620dc2620dd266a21de2620dd2620de266a21df2620de2620df266a21e02620df2620" + "e0266a21e12620e02620e1266a21e22620e12620e2266a21e32620e22620e3266a21e42620e32620e4266a21e52620" + "e42620e5266a21e62620e52620e6266a21e72620e62620e7266a21e82620e72620e8266a21e92620e82620e9266a21" + "ea2620e92620ea266a21eb2620ea2620eb266a21ec2620eb2620ec266a21ed2620ec2620ed266a21ee2620ed2620ee" + "266a21ef2620ee2620ef266a21f02620ef2620f0266a21f12620f02620f1266a21f22620f12620f2266a21f32620f2" + "2620f3266a21f42620f32620f4266a21f52620f42620f5266a21f62620f52620f6266a21f72620f62620f7266a21f8" + "2620f72620f8266a21f92620f82620f9266a21fa2620f92620fa266a21fb2620fa2620fb266a21fc2620fb2620fc26" + "6a21fd2620fc2620fd266a21fe2620fd2620fe266a21ff2620fe2620ff266a21802720ff262080276a218127208027" + "2081276a2182272081272082276a2183272082272083276a2184272083272084276a2185272084272085276a218627" + "2085272086276a2187272086272087276a2188272087272088276a2189272088272089276a218a27208927208a276a" + "218b27208a27208b276a218c27208b27208c276a218d27208c27208d276a218e27208d27208e276a218f27208e2720" + "8f276a219027208f272090276a2191272090272091276a2192272091272092276a2193272092272093276a21942720" + "93272094276a2195272094272095276a2196272095272096276a2197272096272097276a2198272097272098276a21" + "99272098272099276a219a27209927209a276a219b27209a27209b276a219c27209b27209c276a219d27209c27209d" + "276a219e27209d27209e276a219f27209e27209f276a21a027209f2720a0276a21a12720a02720a1276a21a22720a1" + "2720a2276a21a32720a22720a3276a21a42720a32720a4276a21a52720a42720a5276a21a62720a52720a6276a21a7" + "2720a62720a7276a21a82720a72720a8276a21a92720a82720a9276a21aa2720a92720aa276a21ab2720aa2720ab27" + "6a21ac2720ab2720ac276a21ad2720ac2720ad276a21ae2720ad2720ae276a21af2720ae2720af276a21b02720af27" + "20b0276a21b12720b02720b1276a21b22720b12720b2276a21b32720b22720b3276a21b42720b32720b4276a21b527" + "20b42720b5276a21b62720b52720b6276a21b72720b62720b7276a21b82720b72720b8276a21b92720b82720b9276a" + "21ba2720b92720ba276a21bb2720ba2720bb276a21bc2720bb2720bc276a21bd2720bc2720bd276a21be2720bd2720" + "be276a21bf2720be2720bf276a21c02720bf2720c0276a21c12720c02720c1276a21c22720c12720c2276a21c32720" + "c22720c3276a21c42720c32720c4276a21c52720c42720c5276a21c62720c52720c6276a21c72720c62720c7276a21" + "c82720c72720c8276a21c92720c82720c9276a21ca2720c92720ca276a21cb2720ca2720cb276a21cc2720cb2720cc" + "276a21cd2720cc2720cd276a21ce2720cd2720ce276a21cf2720ce2720cf276a21d02720cf2720d0276a21d12720d0" + "2720d1276a21d22720d12720d2276a21d32720d22720d3276a21d42720d32720d4276a21d52720d42720d5276a21d6" + "2720d52720d6276a21d72720d62720d7276a21d82720d72720d8276a21d92720d82720d9276a21da2720d92720da27" + "6a21db2720da2720db276a21dc2720db2720dc276a21dd2720dc2720dd276a21de2720dd2720de276a21df2720de27" + "20df276a21e02720df2720e0276a21e12720e02720e1276a21e22720e12720e2276a21e32720e22720e3276a21e427" + "20e32720e4276a21e52720e42720e5276a21e62720e52720e6276a21e72720e62720e7276a21e82720e72720e8276a" + "21e92720e82720e9276a21ea2720e92720ea276a21eb2720ea2720eb276a21ec2720eb2720ec276a21ed2720ec2720" + "ed276a21ee2720ed2720ee276a21ef2720ee2720ef276a21f02720ef2720f0276a21f12720f02720f1276a21f22720" + "f12720f2276a21f32720f22720f3276a21f42720f32720f4276a21f52720f42720f5276a21f62720f52720f6276a21" + "f72720f62720f7276a21f82720f72720f8276a21f92720f82720f9276a21fa2720f92720fa276a21fb2720fa2720fb" + "276a21fc2720fb2720fc276a21fd2720fc2720fd276a21fe2720fd2720fe276a21ff2720fe2720ff276a21802820ff" + "272080286a2181282080282081286a2182282081282082286a2183282082282083286a2184282083282084286a2185" "282084282085286a2186282085282086286a2187282086282087286a2188282087282088286a218928208828208928" - "6a218a28208928208a28" - "6a218b28208a28208b286a218c28208b28208c286a218d28208c28208d286a218e28208d28208e286a218f28208e28" - "208f286a219028208f28" - "2090286a2191282090282091286a2192282091282092286a2193282092282093286a2194282093282094286a219528" - "2094282095286a219628" - "2095282096286a2197282096282097286a2198282097282098286a2199282098282099286a219a28209928209a286a" - "219b28209a28209b286a" - "219c28209b28209c286a219d28209c28209d286a219e28209d28209e286a219f28209e28209f286a21a028209f2820" - "a0286a21a12820a02820" - "a1286a21a22820a12820a2286a21a32820a22820a3286a21a42820a32820a4286a21a52820a42820a5286a21a62820" - "a52820a6286a21a72820" - "a62820a7286a21a82820a72820a8286a21a92820a82820a9286a21aa2820a92820aa286a21ab2820aa2820ab286a21" - "ac2820ab2820ac286a21" - "ad2820ac2820ad286a21ae2820ad2820ae286a21af2820ae2820af286a21b02820af2820b0286a21b12820b02820b1" - "286a21b22820b12820b2" - "286a21b32820b22820b3286a21b42820b32820b4286a21b52820b42820b5286a21b62820b52820b6286a21b72820b6" - "2820b7286a21b82820b7" - "2820b8286a21b92820b82820b9286a21ba2820b92820ba286a21bb2820ba2820bb286a21bc2820bb2820bc286a21bd" - "2820bc2820bd286a21be" - "2820bd2820be286a21bf2820be2820bf286a21c02820bf2820c0286a21c12820c02820c1286a21c22820c12820c228" - "6a21c32820c22820c328" - "6a21c42820c32820c4286a21c52820c42820c5286a21c62820c52820c6286a21c72820c62820c7286a21c82820c728" - "20c8286a21c92820c828" - "20c9286a21ca2820c92820ca286a21cb2820ca2820cb286a21cc2820cb2820cc286a21cd2820cc2820cd286a21ce28" - "20cd2820ce286a21cf28" - "20ce2820cf286a21d02820cf2820d0286a21d12820d02820d1286a21d22820d12820d2286a21d32820d22820d3286a" - "21d42820d32820d4286a" - "21d52820d42820d5286a21d62820d52820d6286a21d72820d62820d7286a21d82820d72820d8286a21d92820d82820" - "d9286a21da2820d92820" - "da286a21db2820da2820db286a21dc2820db2820dc286a21dd2820dc2820dd286a21de2820dd2820de286a21df2820" - "de2820df286a21e02820" - "df2820e0286a21e12820e02820e1286a21e22820e12820e2286a21e32820e22820e3286a21e42820e32820e4286a21" - "e52820e42820e5286a21" - "e62820e52820e6286a21e72820e62820e7286a21e82820e72820e8286a21e92820e82820e9286a21ea2820e92820ea" - "286a21eb2820ea2820eb" - "286a21ec2820eb2820ec286a21ed2820ec2820ed286a21ee2820ed2820ee286a21ef2820ee2820ef286a21f02820ef" - "2820f0286a21f12820f0" - "2820f1286a21f22820f12820f2286a21f32820f22820f3286a21f42820f32820f4286a21f52820f42820f5286a21f6" - "2820f52820f6286a21f7" - "2820f62820f7286a21f82820f72820f8286a21f92820f82820f9286a21fa2820f92820fa286a21fb2820fa2820fb28" - "6a21fc2820fb2820fc28" - "6a21fd2820fc2820fd286a21fe2820fd2820fe286a21ff2820fe2820ff286a21802920ff282080296a218129208029" - "2081296a218229208129" - "2082296a2183292082292083296a2184292083292084296a2185292084292085296a2186292085292086296a218729" - "2086292087296a218829" - "2087292088296a2189292088292089296a218a29208929208a296a218b29208a29208b296a218c29208b29208c296a" - "218d29208c29208d296a" - "218e29208d29208e296a218f29208e29208f296a219029208f292090296a2191292090292091296a21922920912920" - "92296a21932920922920" - "93296a2194292093292094296a2195292094292095296a2196292095292096296a2197292096292097296a21982920" - "97292098296a21992920" - "98292099296a219a29209929209a296a219b29209a29209b296a219c29209b29209c296a219d29209c29209d296a21" - "9e29209d29209e296a21" - "9f29209e29209f296a21a029209f2920a0296a21a12920a02920a1296a21a22920a12920a2296a21a32920a22920a3" - "296a21a42920a32920a4" - "296a21a52920a42920a5296a21a62920a52920a6296a21a72920a62920a7296a21a82920a72920a8296a21a92920a8" - "2920a9296a21aa2920a9" - "2920aa296a21ab2920aa2920ab296a21ac2920ab2920ac296a21ad2920ac2920ad296a21ae2920ad2920ae296a21af" - "2920ae2920af296a21b0" - "2920af2920b0296a21b12920b02920b1296a21b22920b12920b2296a21b32920b22920b3296a21b42920b32920b429" - "6a21b52920b42920b529" - "6a21b62920b52920b6296a21b72920b62920b7296a21b82920b72920b8296a21b92920b82920b9296a21ba2920b929" - "20ba296a21bb2920ba29" - "20bb296a21bc2920bb2920bc296a21bd2920bc2920bd296a21be2920bd2920be296a21bf2920be2920bf296a21c029" - "20bf2920c0296a21c129" - "20c02920c1296a21c22920c12920c2296a21c32920c22920c3296a21c42920c32920c4296a21c52920c42920c5296a" - "21c62920c52920c6296a" - "21c72920c62920c7296a21c82920c72920c8296a21c92920c82920c9296a21ca2920c92920ca296a21cb2920ca2920" - "cb296a21cc2920cb2920" - "cc296a21cd2920cc2920cd296a21ce2920cd2920ce296a21cf2920ce2920cf296a21d02920cf2920d0296a21d12920" - "d02920d1296a21d22920" - "d12920d2296a21d32920d22920d3296a21d42920d32920d4296a21d52920d42920d5296a21d62920d52920d6296a21" - "d72920d62920d7296a21" - "d82920d72920d8296a21d92920d82920d9296a21da2920d92920da296a21db2920da2920db296a21dc2920db2920dc" - "296a21dd2920dc2920dd" - "296a21de2920dd2920de296a21df2920de2920df296a21e02920df2920e0296a21e12920e02920e1296a21e22920e1" - "2920e2296a21e32920e2" - "2920e3296a21e42920e32920e4296a21e52920e42920e5296a21e62920e52920e6296a21e72920e62920e7296a21e8" - "2920e72920e8296a21e9" - "2920e82920e9296a21ea2920e92920ea296a21eb2920ea2920eb296a21ec2920eb2920ec296a21ed2920ec2920ed29" - "6a21ee2920ed2920ee29" - "6a21ef2920ee2920ef296a21f02920ef2920f0296a21f12920f02920f1296a21f22920f12920f2296a21f32920f229" - "20f3296a21f42920f329" - "20f4296a21f52920f42920f5296a21f62920f52920f6296a21f72920f62920f7296a21f82920f72920f8296a21f929" - "20f82920f9296a21fa29" - "20f92920fa296a21fb2920fa2920fb296a21fc2920fb2920fc296a21fd2920fc2920fd296a21fe2920fd2920fe296a" - "21ff2920fe2920ff296a" - "21802a20ff2920802a6a21812a20802a20812a6a21822a20812a20822a6a21832a20822a20832a6a21842a20832a20" - "842a6a21852a20842a20" - "852a6a21862a20852a20862a6a21872a20862a20872a6a21882a20872a20882a6a21892a20882a20892a6a218a2a20" - "892a208a2a6a218b2a20" - "8a2a208b2a6a218c2a208b2a208c2a6a218d2a208c2a208d2a6a218e2a208d2a208e2a6a218f2a208e2a208f2a6a21" - "902a208f2a20902a6a21" + "6a218a28208928208a286a218b28208a28208b286a218c28208b28208c286a218d28208c28208d286a218e28208d28" + "208e286a218f28208e28208f286a219028208f282090286a2191282090282091286a2192282091282092286a219328" + "2092282093286a2194282093282094286a2195282094282095286a2196282095282096286a2197282096282097286a" + "2198282097282098286a2199282098282099286a219a28209928209a286a219b28209a28209b286a219c28209b2820" + "9c286a219d28209c28209d286a219e28209d28209e286a219f28209e28209f286a21a028209f2820a0286a21a12820" + "a02820a1286a21a22820a12820a2286a21a32820a22820a3286a21a42820a32820a4286a21a52820a42820a5286a21" + "a62820a52820a6286a21a72820a62820a7286a21a82820a72820a8286a21a92820a82820a9286a21aa2820a92820aa" + "286a21ab2820aa2820ab286a21ac2820ab2820ac286a21ad2820ac2820ad286a21ae2820ad2820ae286a21af2820ae" + "2820af286a21b02820af2820b0286a21b12820b02820b1286a21b22820b12820b2286a21b32820b22820b3286a21b4" + "2820b32820b4286a21b52820b42820b5286a21b62820b52820b6286a21b72820b62820b7286a21b82820b72820b828" + "6a21b92820b82820b9286a21ba2820b92820ba286a21bb2820ba2820bb286a21bc2820bb2820bc286a21bd2820bc28" + "20bd286a21be2820bd2820be286a21bf2820be2820bf286a21c02820bf2820c0286a21c12820c02820c1286a21c228" + "20c12820c2286a21c32820c22820c3286a21c42820c32820c4286a21c52820c42820c5286a21c62820c52820c6286a" + "21c72820c62820c7286a21c82820c72820c8286a21c92820c82820c9286a21ca2820c92820ca286a21cb2820ca2820" + "cb286a21cc2820cb2820cc286a21cd2820cc2820cd286a21ce2820cd2820ce286a21cf2820ce2820cf286a21d02820" + "cf2820d0286a21d12820d02820d1286a21d22820d12820d2286a21d32820d22820d3286a21d42820d32820d4286a21" + "d52820d42820d5286a21d62820d52820d6286a21d72820d62820d7286a21d82820d72820d8286a21d92820d82820d9" + "286a21da2820d92820da286a21db2820da2820db286a21dc2820db2820dc286a21dd2820dc2820dd286a21de2820dd" + "2820de286a21df2820de2820df286a21e02820df2820e0286a21e12820e02820e1286a21e22820e12820e2286a21e3" + "2820e22820e3286a21e42820e32820e4286a21e52820e42820e5286a21e62820e52820e6286a21e72820e62820e728" + "6a21e82820e72820e8286a21e92820e82820e9286a21ea2820e92820ea286a21eb2820ea2820eb286a21ec2820eb28" + "20ec286a21ed2820ec2820ed286a21ee2820ed2820ee286a21ef2820ee2820ef286a21f02820ef2820f0286a21f128" + "20f02820f1286a21f22820f12820f2286a21f32820f22820f3286a21f42820f32820f4286a21f52820f42820f5286a" + "21f62820f52820f6286a21f72820f62820f7286a21f82820f72820f8286a21f92820f82820f9286a21fa2820f92820" + "fa286a21fb2820fa2820fb286a21fc2820fb2820fc286a21fd2820fc2820fd286a21fe2820fd2820fe286a21ff2820" + "fe2820ff286a21802920ff282080296a2181292080292081296a2182292081292082296a2183292082292083296a21" + "84292083292084296a2185292084292085296a2186292085292086296a2187292086292087296a2188292087292088" + "296a2189292088292089296a218a29208929208a296a218b29208a29208b296a218c29208b29208c296a218d29208c" + "29208d296a218e29208d29208e296a218f29208e29208f296a219029208f292090296a2191292090292091296a2192" + "292091292092296a2193292092292093296a2194292093292094296a2195292094292095296a219629209529209629" + "6a2197292096292097296a2198292097292098296a2199292098292099296a219a29209929209a296a219b29209a29" + "209b296a219c29209b29209c296a219d29209c29209d296a219e29209d29209e296a219f29209e29209f296a21a029" + "209f2920a0296a21a12920a02920a1296a21a22920a12920a2296a21a32920a22920a3296a21a42920a32920a4296a" + "21a52920a42920a5296a21a62920a52920a6296a21a72920a62920a7296a21a82920a72920a8296a21a92920a82920" + "a9296a21aa2920a92920aa296a21ab2920aa2920ab296a21ac2920ab2920ac296a21ad2920ac2920ad296a21ae2920" + "ad2920ae296a21af2920ae2920af296a21b02920af2920b0296a21b12920b02920b1296a21b22920b12920b2296a21" + "b32920b22920b3296a21b42920b32920b4296a21b52920b42920b5296a21b62920b52920b6296a21b72920b62920b7" + "296a21b82920b72920b8296a21b92920b82920b9296a21ba2920b92920ba296a21bb2920ba2920bb296a21bc2920bb" + "2920bc296a21bd2920bc2920bd296a21be2920bd2920be296a21bf2920be2920bf296a21c02920bf2920c0296a21c1" + "2920c02920c1296a21c22920c12920c2296a21c32920c22920c3296a21c42920c32920c4296a21c52920c42920c529" + "6a21c62920c52920c6296a21c72920c62920c7296a21c82920c72920c8296a21c92920c82920c9296a21ca2920c929" + "20ca296a21cb2920ca2920cb296a21cc2920cb2920cc296a21cd2920cc2920cd296a21ce2920cd2920ce296a21cf29" + "20ce2920cf296a21d02920cf2920d0296a21d12920d02920d1296a21d22920d12920d2296a21d32920d22920d3296a" + "21d42920d32920d4296a21d52920d42920d5296a21d62920d52920d6296a21d72920d62920d7296a21d82920d72920" + "d8296a21d92920d82920d9296a21da2920d92920da296a21db2920da2920db296a21dc2920db2920dc296a21dd2920" + "dc2920dd296a21de2920dd2920de296a21df2920de2920df296a21e02920df2920e0296a21e12920e02920e1296a21" + "e22920e12920e2296a21e32920e22920e3296a21e42920e32920e4296a21e52920e42920e5296a21e62920e52920e6" + "296a21e72920e62920e7296a21e82920e72920e8296a21e92920e82920e9296a21ea2920e92920ea296a21eb2920ea" + "2920eb296a21ec2920eb2920ec296a21ed2920ec2920ed296a21ee2920ed2920ee296a21ef2920ee2920ef296a21f0" + "2920ef2920f0296a21f12920f02920f1296a21f22920f12920f2296a21f32920f22920f3296a21f42920f32920f429" + "6a21f52920f42920f5296a21f62920f52920f6296a21f72920f62920f7296a21f82920f72920f8296a21f92920f829" + "20f9296a21fa2920f92920fa296a21fb2920fa2920fb296a21fc2920fb2920fc296a21fd2920fc2920fd296a21fe29" + "20fd2920fe296a21ff2920fe2920ff296a21802a20ff2920802a6a21812a20802a20812a6a21822a20812a20822a6a" + "21832a20822a20832a6a21842a20832a20842a6a21852a20842a20852a6a21862a20852a20862a6a21872a20862a20" + "872a6a21882a20872a20882a6a21892a20882a20892a6a218a2a20892a208a2a6a218b2a208a2a208b2a6a218c2a20" + "8b2a208c2a6a218d2a208c2a208d2a6a218e2a208d2a208e2a6a218f2a208e2a208f2a6a21902a208f2a20902a6a21" "912a20902a20912a6a21922a20912a20922a6a21932a20922a20932a6a21942a20932a20942a6a21952a20942a2095" - "2a6a21962a20952a2096" - "2a6a21972a20962a20972a6a21982a20972a20982a6a21992a20982a20992a6a219a2a20992a209a2a6a219b2a209a" - "2a209b2a6a219c2a209b" - "2a209c2a6a219d2a209c2a209d2a6a219e2a209d2a209e2a6a219f2a209e2a209f2a6a21a02a209f2a20a02a6a21a1" - "2a20a02a20a12a6a21a2" - "2a20a12a20a22a6a21a32a20a22a20a32a6a21a42a20a32a20a42a6a21a52a20a42a20a52a6a21a62a20a52a20a62a" - "6a21a72a20a62a20a72a" - "6a21a82a20a72a20a82a6a21a92a20a82a20a92a6a21aa2a20a92a20aa2a6a21ab2a20aa2a20ab2a6a21ac2a20ab2a" - "20ac2a6a21ad2a20ac2a" - "20ad2a6a21ae2a20ad2a20ae2a6a21af2a20ae2a20af2a6a21b02a20af2a20b02a6a21b12a20b02a20b12a6a21b22a" - "20b12a20b22a6a21b32a" - "20b22a20b32a6a21b42a20b32a20b42a6a21b52a20b42a20b52a6a21b62a20b52a20b62a6a21b72a20b62a20b72a6a" - "21b82a20b72a20b82a6a" - "21b92a20b82a20b92a6a21ba2a20b92a20ba2a6a21bb2a20ba2a20bb2a6a21bc2a20bb2a20bc2a6a21bd2a20bc2a20" - "bd2a6a21be2a20bd2a20" - "be2a6a21bf2a20be2a20bf2a6a21c02a20bf2a20c02a6a21c12a20c02a20c12a6a21c22a20c12a20c22a6a21c32a20" - "c22a20c32a6a21c42a20" - "c32a20c42a6a21c52a20c42a20c52a6a21c62a20c52a20c62a6a21c72a20c62a20c72a6a21c82a20c72a20c82a6a21" - "c92a20c82a20c92a6a21" - "ca2a20c92a20ca2a6a21cb2a20ca2a20cb2a6a21cc2a20cb2a20cc2a6a21cd2a20cc2a20cd2a6a21ce2a20cd2a20ce" - "2a6a21cf2a20ce2a20cf" - "2a6a21d02a20cf2a20d02a6a21d12a20d02a20d12a6a21d22a20d12a20d22a6a21d32a20d22a20d32a6a21d42a20d3" - "2a20d42a6a21d52a20d4" - "2a20d52a6a21d62a20d52a20d62a6a21d72a20d62a20d72a6a21d82a20d72a20d82a6a21d92a20d82a20d92a6a21da" - "2a20d92a20da2a6a21db" - "2a20da2a20db2a6a21dc2a20db2a20dc2a6a21dd2a20dc2a20dd2a6a21de2a20dd2a20de2a6a21df2a20de2a20df2a" - "6a21e02a20df2a20e02a" - "6a21e12a20e02a20e12a6a21e22a20e12a20e22a6a21e32a20e22a20e32a6a21e42a20e32a20e42a6a21e52a20e42a" - "20e52a6a21e62a20e52a" - "20e62a6a21e72a20e62a20e72a6a21e82a20e72a20e82a6a21e92a20e82a20e92a6a21ea2a20e92a20ea2a6a21eb2a" - "20ea2a20eb2a6a21ec2a" - "20eb2a20ec2a6a21ed2a20ec2a20ed2a6a21ee2a20ed2a20ee2a6a21ef2a20ee2a20ef2a6a21f02a20ef2a20f02a6a" - "21f12a20f02a20f12a6a" - "21f22a20f12a20f22a6a21f32a20f22a20f32a6a21f42a20f32a20f42a6a21f52a20f42a20f52a6a21f62a20f52a20" - "f62a6a21f72a20f62a20" - "f72a6a21f82a20f72a20f82a6a21f92a20f82a20f92a6a21fa2a20f92a20fa2a6a21fb2a20fa2a20fb2a6a21fc2a20" - "fb2a20fc2a6a21fd2a20" - "fc2a20fd2a6a21fe2a20fd2a20fe2a6a21ff2a20fe2a20ff2a6a21802b20ff2a20802b6a21812b20802b20812b6a21" - "822b20812b20822b6a21" - "832b20822b20832b6a21842b20832b20842b6a21852b20842b20852b6a21862b20852b20862b6a21872b20862b2087" - "2b6a21882b20872b2088" - "2b6a21892b20882b20892b6a218a2b20892b208a2b6a218b2b208a2b208b2b6a218c2b208b2b208c2b6a218d2b208c" - "2b208d2b6a218e2b208d" - "2b208e2b6a218f2b208e2b208f2b6a21902b208f2b20902b6a21912b20902b20912b6a21922b20912b20922b6a2193" - "2b20922b20932b6a2194" - "2b20932b20942b6a21952b20942b20952b6a21962b20952b20962b6a21972b20962b20972b6a21982b20972b20982b" - "6a21992b20982b20992b" - "6a219a2b20992b209a2b6a219b2b209a2b209b2b6a219c2b209b2b209c2b6a219d2b209c2b209d2b6a219e2b209d2b" - "209e2b6a219f2b209e2b" - "209f2b6a21a02b209f2b20a02b6a21a12b20a02b20a12b6a21a22b20a12b20a22b6a21a32b20a22b20a32b6a21a42b" - "20a32b20a42b6a21a52b" - "20a42b20a52b6a21a62b20a52b20a62b6a21a72b20a62b20a72b6a21a82b20a72b20a82b6a21a92b20a82b20a92b6a" - "21aa2b20a92b20aa2b6a" - "21ab2b20aa2b20ab2b6a21ac2b20ab2b20ac2b6a21ad2b20ac2b20ad2b6a21ae2b20ad2b20ae2b6a21af2b20ae2b20" - "af2b6a21b02b20af2b20" - "b02b6a21b12b20b02b20b12b6a21b22b20b12b20b22b6a21b32b20b22b20b32b6a21b42b20b32b20b42b6a21b52b20" - "b42b20b52b6a21b62b20" - "b52b20b62b6a21b72b20b62b20b72b6a21b82b20b72b20b82b6a21b92b20b82b20b92b6a21ba2b20b92b20ba2b6a21" - "bb2b20ba2b20bb2b6a21" - "bc2b20bb2b20bc2b6a21bd2b20bc2b20bd2b6a21be2b20bd2b20be2b6a21bf2b20be2b20bf2b6a21c02b20bf2b20c0" - "2b6a21c12b20c02b20c1" - "2b6a21c22b20c12b20c22b6a21c32b20c22b20c32b6a21c42b20c32b20c42b6a21c52b20c42b20c52b6a21c62b20c5" - "2b20c62b6a21c72b20c6" - "2b20c72b6a21c82b20c72b20c82b6a21c92b20c82b20c92b6a21ca2b20c92b20ca2b6a21cb2b20ca2b20cb2b6a21cc" - "2b20cb2b20cc2b6a21cd" - "2b20cc2b20cd2b6a21ce2b20cd2b20ce2b6a21cf2b20ce2b20cf2b6a21d02b20cf2b20d02b6a21d12b20d02b20d12b" - "6a21d22b20d12b20d22b" - "6a21d32b20d22b20d32b6a21d42b20d32b20d42b6a21d52b20d42b20d52b6a21d62b20d52b20d62b6a21d72b20d62b" - "20d72b6a21d82b20d72b" - "20d82b6a21d92b20d82b20d92b6a21da2b20d92b20da2b6a21db2b20da2b20db2b6a21dc2b20db2b20dc2b6a21dd2b" - "20dc2b20dd2b6a21de2b" - "20dd2b20de2b6a21df2b20de2b20df2b6a21e02b20df2b20e02b6a21e12b20e02b20e12b6a21e22b20e12b20e22b6a" - "21e32b20e22b20e32b6a" - "21e42b20e32b20e42b6a21e52b20e42b20e52b6a21e62b20e52b20e62b6a21e72b20e62b20e72b6a21e82b20e72b20" - "e82b6a21e92b20e82b20" - "e92b6a21ea2b20e92b20ea2b6a21eb2b20ea2b20eb2b6a21ec2b20eb2b20ec2b6a21ed2b20ec2b20ed2b6a21ee2b20" - "ed2b20ee2b6a21ef2b20" - "ee2b20ef2b6a21f02b20ef2b20f02b6a21f12b20f02b20f12b6a21f22b20f12b20f22b6a21f32b20f22b20f32b6a21" - "f42b20f32b20f42b6a21" - "f52b20f42b20f52b6a21f62b20f52b20f62b6a21f72b20f62b20f72b6a21f82b20f72b20f82b6a21f92b20f82b20f9" - "2b6a21fa2b20f92b20fa" - "2b6a21fb2b20fa2b20fb2b6a21fc2b20fb2b20fc2b6a21fd2b20fc2b20fd2b6a21fe2b20fd2b20fe2b6a21ff2b20fe" - "2b20ff2b6a21802c20ff" - "2b20802c6a21812c20802c20812c6a21822c20812c20822c6a21832c20822c20832c6a21842c20832c20842c6a2185" - "2c20842c20852c6a2186" - "2c20852c20862c6a21872c20862c20872c6a21882c20872c20882c6a21892c20882c20892c6a218a2c20892c208a2c" - "6a218b2c208a2c208b2c" - "6a218c2c208b2c208c2c6a218d2c208c2c208d2c6a218e2c208d2c208e2c6a218f2c208e2c208f2c6a21902c208f2c" - "20902c6a21912c20902c" - "20912c6a21922c20912c20922c6a21932c20922c20932c6a21942c20932c20942c6a21952c20942c20952c6a21962c" - "20952c20962c6a21972c" - "20962c20972c6a21982c20972c20982c6a21992c20982c20992c6a219a2c20992c209a2c6a219b2c209a2c209b2c6a" - "219c2c209b2c209c2c6a" + "2a6a21962a20952a20962a6a21972a20962a20972a6a21982a20972a20982a6a21992a20982a20992a6a219a2a2099" + "2a209a2a6a219b2a209a2a209b2a6a219c2a209b2a209c2a6a219d2a209c2a209d2a6a219e2a209d2a209e2a6a219f" + "2a209e2a209f2a6a21a02a209f2a20a02a6a21a12a20a02a20a12a6a21a22a20a12a20a22a6a21a32a20a22a20a32a" + "6a21a42a20a32a20a42a6a21a52a20a42a20a52a6a21a62a20a52a20a62a6a21a72a20a62a20a72a6a21a82a20a72a" + "20a82a6a21a92a20a82a20a92a6a21aa2a20a92a20aa2a6a21ab2a20aa2a20ab2a6a21ac2a20ab2a20ac2a6a21ad2a" + "20ac2a20ad2a6a21ae2a20ad2a20ae2a6a21af2a20ae2a20af2a6a21b02a20af2a20b02a6a21b12a20b02a20b12a6a" + "21b22a20b12a20b22a6a21b32a20b22a20b32a6a21b42a20b32a20b42a6a21b52a20b42a20b52a6a21b62a20b52a20" + "b62a6a21b72a20b62a20b72a6a21b82a20b72a20b82a6a21b92a20b82a20b92a6a21ba2a20b92a20ba2a6a21bb2a20" + "ba2a20bb2a6a21bc2a20bb2a20bc2a6a21bd2a20bc2a20bd2a6a21be2a20bd2a20be2a6a21bf2a20be2a20bf2a6a21" + "c02a20bf2a20c02a6a21c12a20c02a20c12a6a21c22a20c12a20c22a6a21c32a20c22a20c32a6a21c42a20c32a20c4" + "2a6a21c52a20c42a20c52a6a21c62a20c52a20c62a6a21c72a20c62a20c72a6a21c82a20c72a20c82a6a21c92a20c8" + "2a20c92a6a21ca2a20c92a20ca2a6a21cb2a20ca2a20cb2a6a21cc2a20cb2a20cc2a6a21cd2a20cc2a20cd2a6a21ce" + "2a20cd2a20ce2a6a21cf2a20ce2a20cf2a6a21d02a20cf2a20d02a6a21d12a20d02a20d12a6a21d22a20d12a20d22a" + "6a21d32a20d22a20d32a6a21d42a20d32a20d42a6a21d52a20d42a20d52a6a21d62a20d52a20d62a6a21d72a20d62a" + "20d72a6a21d82a20d72a20d82a6a21d92a20d82a20d92a6a21da2a20d92a20da2a6a21db2a20da2a20db2a6a21dc2a" + "20db2a20dc2a6a21dd2a20dc2a20dd2a6a21de2a20dd2a20de2a6a21df2a20de2a20df2a6a21e02a20df2a20e02a6a" + "21e12a20e02a20e12a6a21e22a20e12a20e22a6a21e32a20e22a20e32a6a21e42a20e32a20e42a6a21e52a20e42a20" + "e52a6a21e62a20e52a20e62a6a21e72a20e62a20e72a6a21e82a20e72a20e82a6a21e92a20e82a20e92a6a21ea2a20" + "e92a20ea2a6a21eb2a20ea2a20eb2a6a21ec2a20eb2a20ec2a6a21ed2a20ec2a20ed2a6a21ee2a20ed2a20ee2a6a21" + "ef2a20ee2a20ef2a6a21f02a20ef2a20f02a6a21f12a20f02a20f12a6a21f22a20f12a20f22a6a21f32a20f22a20f3" + "2a6a21f42a20f32a20f42a6a21f52a20f42a20f52a6a21f62a20f52a20f62a6a21f72a20f62a20f72a6a21f82a20f7" + "2a20f82a6a21f92a20f82a20f92a6a21fa2a20f92a20fa2a6a21fb2a20fa2a20fb2a6a21fc2a20fb2a20fc2a6a21fd" + "2a20fc2a20fd2a6a21fe2a20fd2a20fe2a6a21ff2a20fe2a20ff2a6a21802b20ff2a20802b6a21812b20802b20812b" + "6a21822b20812b20822b6a21832b20822b20832b6a21842b20832b20842b6a21852b20842b20852b6a21862b20852b" + "20862b6a21872b20862b20872b6a21882b20872b20882b6a21892b20882b20892b6a218a2b20892b208a2b6a218b2b" + "208a2b208b2b6a218c2b208b2b208c2b6a218d2b208c2b208d2b6a218e2b208d2b208e2b6a218f2b208e2b208f2b6a" + "21902b208f2b20902b6a21912b20902b20912b6a21922b20912b20922b6a21932b20922b20932b6a21942b20932b20" + "942b6a21952b20942b20952b6a21962b20952b20962b6a21972b20962b20972b6a21982b20972b20982b6a21992b20" + "982b20992b6a219a2b20992b209a2b6a219b2b209a2b209b2b6a219c2b209b2b209c2b6a219d2b209c2b209d2b6a21" + "9e2b209d2b209e2b6a219f2b209e2b209f2b6a21a02b209f2b20a02b6a21a12b20a02b20a12b6a21a22b20a12b20a2" + "2b6a21a32b20a22b20a32b6a21a42b20a32b20a42b6a21a52b20a42b20a52b6a21a62b20a52b20a62b6a21a72b20a6" + "2b20a72b6a21a82b20a72b20a82b6a21a92b20a82b20a92b6a21aa2b20a92b20aa2b6a21ab2b20aa2b20ab2b6a21ac" + "2b20ab2b20ac2b6a21ad2b20ac2b20ad2b6a21ae2b20ad2b20ae2b6a21af2b20ae2b20af2b6a21b02b20af2b20b02b" + "6a21b12b20b02b20b12b6a21b22b20b12b20b22b6a21b32b20b22b20b32b6a21b42b20b32b20b42b6a21b52b20b42b" + "20b52b6a21b62b20b52b20b62b6a21b72b20b62b20b72b6a21b82b20b72b20b82b6a21b92b20b82b20b92b6a21ba2b" + "20b92b20ba2b6a21bb2b20ba2b20bb2b6a21bc2b20bb2b20bc2b6a21bd2b20bc2b20bd2b6a21be2b20bd2b20be2b6a" + "21bf2b20be2b20bf2b6a21c02b20bf2b20c02b6a21c12b20c02b20c12b6a21c22b20c12b20c22b6a21c32b20c22b20" + "c32b6a21c42b20c32b20c42b6a21c52b20c42b20c52b6a21c62b20c52b20c62b6a21c72b20c62b20c72b6a21c82b20" + "c72b20c82b6a21c92b20c82b20c92b6a21ca2b20c92b20ca2b6a21cb2b20ca2b20cb2b6a21cc2b20cb2b20cc2b6a21" + "cd2b20cc2b20cd2b6a21ce2b20cd2b20ce2b6a21cf2b20ce2b20cf2b6a21d02b20cf2b20d02b6a21d12b20d02b20d1" + "2b6a21d22b20d12b20d22b6a21d32b20d22b20d32b6a21d42b20d32b20d42b6a21d52b20d42b20d52b6a21d62b20d5" + "2b20d62b6a21d72b20d62b20d72b6a21d82b20d72b20d82b6a21d92b20d82b20d92b6a21da2b20d92b20da2b6a21db" + "2b20da2b20db2b6a21dc2b20db2b20dc2b6a21dd2b20dc2b20dd2b6a21de2b20dd2b20de2b6a21df2b20de2b20df2b" + "6a21e02b20df2b20e02b6a21e12b20e02b20e12b6a21e22b20e12b20e22b6a21e32b20e22b20e32b6a21e42b20e32b" + "20e42b6a21e52b20e42b20e52b6a21e62b20e52b20e62b6a21e72b20e62b20e72b6a21e82b20e72b20e82b6a21e92b" + "20e82b20e92b6a21ea2b20e92b20ea2b6a21eb2b20ea2b20eb2b6a21ec2b20eb2b20ec2b6a21ed2b20ec2b20ed2b6a" + "21ee2b20ed2b20ee2b6a21ef2b20ee2b20ef2b6a21f02b20ef2b20f02b6a21f12b20f02b20f12b6a21f22b20f12b20" + "f22b6a21f32b20f22b20f32b6a21f42b20f32b20f42b6a21f52b20f42b20f52b6a21f62b20f52b20f62b6a21f72b20" + "f62b20f72b6a21f82b20f72b20f82b6a21f92b20f82b20f92b6a21fa2b20f92b20fa2b6a21fb2b20fa2b20fb2b6a21" + "fc2b20fb2b20fc2b6a21fd2b20fc2b20fd2b6a21fe2b20fd2b20fe2b6a21ff2b20fe2b20ff2b6a21802c20ff2b2080" + "2c6a21812c20802c20812c6a21822c20812c20822c6a21832c20822c20832c6a21842c20832c20842c6a21852c2084" + "2c20852c6a21862c20852c20862c6a21872c20862c20872c6a21882c20872c20882c6a21892c20882c20892c6a218a" + "2c20892c208a2c6a218b2c208a2c208b2c6a218c2c208b2c208c2c6a218d2c208c2c208d2c6a218e2c208d2c208e2c" + "6a218f2c208e2c208f2c6a21902c208f2c20902c6a21912c20902c20912c6a21922c20912c20922c6a21932c20922c" + "20932c6a21942c20932c20942c6a21952c20942c20952c6a21962c20952c20962c6a21972c20962c20972c6a21982c" + "20972c20982c6a21992c20982c20992c6a219a2c20992c209a2c6a219b2c209a2c209b2c6a219c2c209b2c209c2c6a" "219d2c209c2c209d2c6a219e2c209d2c209e2c6a219f2c209e2c209f2c6a21a02c209f2c20a02c6a21a12c20a02c20" - "a12c6a21a22c20a12c20" - "a22c6a21a32c20a22c20a32c6a21a42c20a32c20a42c6a21a52c20a42c20a52c6a21a62c20a52c20a62c6a21a72c20" - "a62c20a72c6a21a82c20" - "a72c20a82c6a21a92c20a82c20a92c6a21aa2c20a92c20aa2c6a21ab2c20aa2c20ab2c6a21ac2c20ab2c20ac2c6a21" - "ad2c20ac2c20ad2c6a21" - "ae2c20ad2c20ae2c6a21af2c20ae2c20af2c6a21b02c20af2c20b02c6a21b12c20b02c20b12c6a21b22c20b12c20b2" - "2c6a21b32c20b22c20b3" - "2c6a21b42c20b32c20b42c6a21b52c20b42c20b52c6a21b62c20b52c20b62c6a21b72c20b62c20b72c6a21b82c20b7" - "2c20b82c6a21b92c20b8" - "2c20b92c6a21ba2c20b92c20ba2c6a21bb2c20ba2c20bb2c6a21bc2c20bb2c20bc2c6a21bd2c20bc2c20bd2c6a21be" - "2c20bd2c20be2c6a21bf" - "2c20be2c20bf2c6a21c02c20bf2c20c02c6a21c12c20c02c20c12c6a21c22c20c12c20c22c6a21c32c20c22c20c32c" - "6a21c42c20c32c20c42c" - "6a21c52c20c42c20c52c6a21c62c20c52c20c62c6a21c72c20c62c20c72c6a21c82c20c72c20c82c6a21c92c20c82c" - "20c92c6a21ca2c20c92c" - "20ca2c6a21cb2c20ca2c20cb2c6a21cc2c20cb2c20cc2c6a21cd2c20cc2c20cd2c6a21ce2c20cd2c20ce2c6a21cf2c" - "20ce2c20cf2c6a21d02c" - "20cf2c20d02c6a21d12c20d02c20d12c6a21d22c20d12c20d22c6a21d32c20d22c20d32c6a21d42c20d32c20d42c6a" - "21d52c20d42c20d52c6a" - "21d62c20d52c20d62c6a21d72c20d62c20d72c6a21d82c20d72c20d82c6a21d92c20d82c20d92c6a21da2c20d92c20" - "da2c6a21db2c20da2c20" - "db2c6a21dc2c20db2c20dc2c6a21dd2c20dc2c20dd2c6a21de2c20dd2c20de2c6a21df2c20de2c20df2c6a21e02c20" - "df2c20e02c6a21e12c20" - "e02c20e12c6a21e22c20e12c20e22c6a21e32c20e22c20e32c6a21e42c20e32c20e42c6a21e52c20e42c20e52c6a21" - "e62c20e52c20e62c6a21" - "e72c20e62c20e72c6a21e82c20e72c20e82c6a21e92c20e82c20e92c6a21ea2c20e92c20ea2c6a21eb2c20ea2c20eb" - "2c6a21ec2c20eb2c20ec" - "2c6a21ed2c20ec2c20ed2c6a21ee2c20ed2c20ee2c6a21ef2c20ee2c20ef2c6a21f02c20ef2c20f02c6a21f12c20f0" - "2c20f12c6a21f22c20f1" - "2c20f22c6a21f32c20f22c20f32c6a21f42c20f32c20f42c6a21f52c20f42c20f52c6a21f62c20f52c20f62c6a21f7" - "2c20f62c20f72c6a21f8" - "2c20f72c20f82c6a21f92c20f82c20f92c6a21fa2c20f92c20fa2c6a21fb2c20fa2c20fb2c6a21fc2c20fb2c20fc2c" - "6a21fd2c20fc2c20fd2c" - "6a21fe2c20fd2c20fe2c6a21ff2c20fe2c20ff2c6a21802d20ff2c20802d6a21812d20802d20812d6a21822d20812d" - "20822d6a21832d20822d" - "20832d6a21842d20832d20842d6a21852d20842d20852d6a21862d20852d20862d6a21872d20862d20872d6a21882d" - "20872d20882d6a21892d" - "20882d20892d6a218a2d20892d208a2d6a218b2d208a2d208b2d6a218c2d208b2d208c2d6a218d2d208c2d208d2d6a" - "218e2d208d2d208e2d6a" - "218f2d208e2d208f2d6a21902d208f2d20902d6a21912d20902d20912d6a21922d20912d20922d6a21932d20922d20" - "932d6a21942d20932d20" - "942d6a21952d20942d20952d6a21962d20952d20962d6a21972d20962d20972d6a21982d20972d20982d6a21992d20" - "982d20992d6a219a2d20" - "992d209a2d6a219b2d209a2d209b2d6a219c2d209b2d209c2d6a219d2d209c2d209d2d6a219e2d209d2d209e2d6a21" - "9f2d209e2d209f2d6a21" - "a02d209f2d20a02d6a21a12d20a02d20a12d6a21a22d20a12d20a22d6a21a32d20a22d20a32d6a21a42d20a32d20a4" - "2d6a21a52d20a42d20a5" - "2d6a21a62d20a52d20a62d6a21a72d20a62d20a72d6a21a82d20a72d20a82d6a21a92d20a82d20a92d6a21aa2d20a9" - "2d20aa2d6a21ab2d20aa" - "2d20ab2d6a21ac2d20ab2d20ac2d6a21ad2d20ac2d20ad2d6a21ae2d20ad2d20ae2d6a21af2d20ae2d20af2d6a21b0" - "2d20af2d20b02d6a21b1" - "2d20b02d20b12d6a21b22d20b12d20b22d6a21b32d20b22d20b32d6a21b42d20b32d20b42d6a21b52d20b42d20b52d" - "6a21b62d20b52d20b62d" - "6a21b72d20b62d20b72d6a21b82d20b72d20b82d6a21b92d20b82d20b92d6a21ba2d20b92d20ba2d6a21bb2d20ba2d" - "20bb2d6a21bc2d20bb2d" - "20bc2d6a21bd2d20bc2d20bd2d6a21be2d20bd2d20be2d6a21bf2d20be2d20bf2d6a21c02d20bf2d20c02d6a21c12d" - "20c02d20c12d6a21c22d" - "20c12d20c22d6a21c32d20c22d20c32d6a21c42d20c32d20c42d6a21c52d20c42d20c52d6a21c62d20c52d20c62d6a" - "21c72d20c62d20c72d6a" - "21c82d20c72d20c82d6a21c92d20c82d20c92d6a21ca2d20c92d20ca2d6a21cb2d20ca2d20cb2d6a21cc2d20cb2d20" - "cc2d6a21cd2d20cc2d20" - "cd2d6a21ce2d20cd2d20ce2d6a21cf2d20ce2d20cf2d6a21d02d20cf2d20d02d6a21d12d20d02d20d12d6a21d22d20" - "d12d20d22d6a21d32d20" - "d22d20d32d6a21d42d20d32d20d42d6a21d52d20d42d20d52d6a21d62d20d52d20d62d6a21d72d20d62d20d72d6a21" - "d82d20d72d20d82d6a21" - "d92d20d82d20d92d6a21da2d20d92d20da2d6a21db2d20da2d20db2d6a21dc2d20db2d20dc2d6a21dd2d20dc2d20dd" - "2d6a21de2d20dd2d20de" - "2d6a21df2d20de2d20df2d6a21e02d20df2d20e02d6a21e12d20e02d20e12d6a21e22d20e12d20e22d6a21e32d20e2" - "2d20e32d6a21e42d20e3" - "2d20e42d6a21e52d20e42d20e52d6a21e62d20e52d20e62d6a21e72d20e62d20e72d6a21e82d20e72d20e82d6a21e9" - "2d20e82d20e92d6a21ea" - "2d20e92d20ea2d6a21eb2d20ea2d20eb2d6a21ec2d20eb2d20ec2d6a21ed2d20ec2d20ed2d6a21ee2d20ed2d20ee2d" - "6a21ef2d20ee2d20ef2d" - "6a21f02d20ef2d20f02d6a21f12d20f02d20f12d6a21f22d20f12d20f22d6a21f32d20f22d20f32d6a21f42d20f32d" - "20f42d6a21f52d20f42d" - "20f52d6a21f62d20f52d20f62d6a21f72d20f62d20f72d6a21f82d20f72d20f82d6a21f92d20f82d20f92d6a21fa2d" - "20f92d20fa2d6a21fb2d" - "20fa2d20fb2d6a21fc2d20fb2d20fc2d6a21fd2d20fc2d20fd2d6a21fe2d20fd2d20fe2d6a21ff2d20fe2d20ff2d6a" - "21802e20ff2d20802e6a" - "21812e20802e20812e6a21822e20812e20822e6a21832e20822e20832e6a21842e20832e20842e6a21852e20842e20" - "852e6a21862e20852e20" - "862e6a21872e20862e20872e6a21882e20872e20882e6a21892e20882e20892e6a218a2e20892e208a2e6a218b2e20" - "8a2e208b2e6a218c2e20" - "8b2e208c2e6a218d2e208c2e208d2e6a218e2e208d2e208e2e6a218f2e208e2e208f2e6a21902e208f2e20902e6a21" - "912e20902e20912e6a21" - "922e20912e20922e6a21932e20922e20932e6a21942e20932e20942e6a21952e20942e20952e6a21962e20952e2096" - "2e6a21972e20962e2097" - "2e6a21982e20972e20982e6a21992e20982e20992e6a219a2e20992e209a2e6a219b2e209a2e209b2e6a219c2e209b" - "2e209c2e6a219d2e209c" - "2e209d2e6a219e2e209d2e209e2e6a219f2e209e2e209f2e6a21a02e209f2e20a02e6a21a12e20a02e20a12e6a21a2" - "2e20a12e20a22e6a21a3" - "2e20a22e20a32e6a21a42e20a32e20a42e6a21a52e20a42e20a52e6a21a62e20a52e20a62e6a21a72e20a62e20a72e" - "6a21a82e20a72e20a82e" + "a12c6a21a22c20a12c20a22c6a21a32c20a22c20a32c6a21a42c20a32c20a42c6a21a52c20a42c20a52c6a21a62c20" + "a52c20a62c6a21a72c20a62c20a72c6a21a82c20a72c20a82c6a21a92c20a82c20a92c6a21aa2c20a92c20aa2c6a21" + "ab2c20aa2c20ab2c6a21ac2c20ab2c20ac2c6a21ad2c20ac2c20ad2c6a21ae2c20ad2c20ae2c6a21af2c20ae2c20af" + "2c6a21b02c20af2c20b02c6a21b12c20b02c20b12c6a21b22c20b12c20b22c6a21b32c20b22c20b32c6a21b42c20b3" + "2c20b42c6a21b52c20b42c20b52c6a21b62c20b52c20b62c6a21b72c20b62c20b72c6a21b82c20b72c20b82c6a21b9" + "2c20b82c20b92c6a21ba2c20b92c20ba2c6a21bb2c20ba2c20bb2c6a21bc2c20bb2c20bc2c6a21bd2c20bc2c20bd2c" + "6a21be2c20bd2c20be2c6a21bf2c20be2c20bf2c6a21c02c20bf2c20c02c6a21c12c20c02c20c12c6a21c22c20c12c" + "20c22c6a21c32c20c22c20c32c6a21c42c20c32c20c42c6a21c52c20c42c20c52c6a21c62c20c52c20c62c6a21c72c" + "20c62c20c72c6a21c82c20c72c20c82c6a21c92c20c82c20c92c6a21ca2c20c92c20ca2c6a21cb2c20ca2c20cb2c6a" + "21cc2c20cb2c20cc2c6a21cd2c20cc2c20cd2c6a21ce2c20cd2c20ce2c6a21cf2c20ce2c20cf2c6a21d02c20cf2c20" + "d02c6a21d12c20d02c20d12c6a21d22c20d12c20d22c6a21d32c20d22c20d32c6a21d42c20d32c20d42c6a21d52c20" + "d42c20d52c6a21d62c20d52c20d62c6a21d72c20d62c20d72c6a21d82c20d72c20d82c6a21d92c20d82c20d92c6a21" + "da2c20d92c20da2c6a21db2c20da2c20db2c6a21dc2c20db2c20dc2c6a21dd2c20dc2c20dd2c6a21de2c20dd2c20de" + "2c6a21df2c20de2c20df2c6a21e02c20df2c20e02c6a21e12c20e02c20e12c6a21e22c20e12c20e22c6a21e32c20e2" + "2c20e32c6a21e42c20e32c20e42c6a21e52c20e42c20e52c6a21e62c20e52c20e62c6a21e72c20e62c20e72c6a21e8" + "2c20e72c20e82c6a21e92c20e82c20e92c6a21ea2c20e92c20ea2c6a21eb2c20ea2c20eb2c6a21ec2c20eb2c20ec2c" + "6a21ed2c20ec2c20ed2c6a21ee2c20ed2c20ee2c6a21ef2c20ee2c20ef2c6a21f02c20ef2c20f02c6a21f12c20f02c" + "20f12c6a21f22c20f12c20f22c6a21f32c20f22c20f32c6a21f42c20f32c20f42c6a21f52c20f42c20f52c6a21f62c" + "20f52c20f62c6a21f72c20f62c20f72c6a21f82c20f72c20f82c6a21f92c20f82c20f92c6a21fa2c20f92c20fa2c6a" + "21fb2c20fa2c20fb2c6a21fc2c20fb2c20fc2c6a21fd2c20fc2c20fd2c6a21fe2c20fd2c20fe2c6a21ff2c20fe2c20" + "ff2c6a21802d20ff2c20802d6a21812d20802d20812d6a21822d20812d20822d6a21832d20822d20832d6a21842d20" + "832d20842d6a21852d20842d20852d6a21862d20852d20862d6a21872d20862d20872d6a21882d20872d20882d6a21" + "892d20882d20892d6a218a2d20892d208a2d6a218b2d208a2d208b2d6a218c2d208b2d208c2d6a218d2d208c2d208d" + "2d6a218e2d208d2d208e2d6a218f2d208e2d208f2d6a21902d208f2d20902d6a21912d20902d20912d6a21922d2091" + "2d20922d6a21932d20922d20932d6a21942d20932d20942d6a21952d20942d20952d6a21962d20952d20962d6a2197" + "2d20962d20972d6a21982d20972d20982d6a21992d20982d20992d6a219a2d20992d209a2d6a219b2d209a2d209b2d" + "6a219c2d209b2d209c2d6a219d2d209c2d209d2d6a219e2d209d2d209e2d6a219f2d209e2d209f2d6a21a02d209f2d" + "20a02d6a21a12d20a02d20a12d6a21a22d20a12d20a22d6a21a32d20a22d20a32d6a21a42d20a32d20a42d6a21a52d" + "20a42d20a52d6a21a62d20a52d20a62d6a21a72d20a62d20a72d6a21a82d20a72d20a82d6a21a92d20a82d20a92d6a" + "21aa2d20a92d20aa2d6a21ab2d20aa2d20ab2d6a21ac2d20ab2d20ac2d6a21ad2d20ac2d20ad2d6a21ae2d20ad2d20" + "ae2d6a21af2d20ae2d20af2d6a21b02d20af2d20b02d6a21b12d20b02d20b12d6a21b22d20b12d20b22d6a21b32d20" + "b22d20b32d6a21b42d20b32d20b42d6a21b52d20b42d20b52d6a21b62d20b52d20b62d6a21b72d20b62d20b72d6a21" + "b82d20b72d20b82d6a21b92d20b82d20b92d6a21ba2d20b92d20ba2d6a21bb2d20ba2d20bb2d6a21bc2d20bb2d20bc" + "2d6a21bd2d20bc2d20bd2d6a21be2d20bd2d20be2d6a21bf2d20be2d20bf2d6a21c02d20bf2d20c02d6a21c12d20c0" + "2d20c12d6a21c22d20c12d20c22d6a21c32d20c22d20c32d6a21c42d20c32d20c42d6a21c52d20c42d20c52d6a21c6" + "2d20c52d20c62d6a21c72d20c62d20c72d6a21c82d20c72d20c82d6a21c92d20c82d20c92d6a21ca2d20c92d20ca2d" + "6a21cb2d20ca2d20cb2d6a21cc2d20cb2d20cc2d6a21cd2d20cc2d20cd2d6a21ce2d20cd2d20ce2d6a21cf2d20ce2d" + "20cf2d6a21d02d20cf2d20d02d6a21d12d20d02d20d12d6a21d22d20d12d20d22d6a21d32d20d22d20d32d6a21d42d" + "20d32d20d42d6a21d52d20d42d20d52d6a21d62d20d52d20d62d6a21d72d20d62d20d72d6a21d82d20d72d20d82d6a" + "21d92d20d82d20d92d6a21da2d20d92d20da2d6a21db2d20da2d20db2d6a21dc2d20db2d20dc2d6a21dd2d20dc2d20" + "dd2d6a21de2d20dd2d20de2d6a21df2d20de2d20df2d6a21e02d20df2d20e02d6a21e12d20e02d20e12d6a21e22d20" + "e12d20e22d6a21e32d20e22d20e32d6a21e42d20e32d20e42d6a21e52d20e42d20e52d6a21e62d20e52d20e62d6a21" + "e72d20e62d20e72d6a21e82d20e72d20e82d6a21e92d20e82d20e92d6a21ea2d20e92d20ea2d6a21eb2d20ea2d20eb" + "2d6a21ec2d20eb2d20ec2d6a21ed2d20ec2d20ed2d6a21ee2d20ed2d20ee2d6a21ef2d20ee2d20ef2d6a21f02d20ef" + "2d20f02d6a21f12d20f02d20f12d6a21f22d20f12d20f22d6a21f32d20f22d20f32d6a21f42d20f32d20f42d6a21f5" + "2d20f42d20f52d6a21f62d20f52d20f62d6a21f72d20f62d20f72d6a21f82d20f72d20f82d6a21f92d20f82d20f92d" + "6a21fa2d20f92d20fa2d6a21fb2d20fa2d20fb2d6a21fc2d20fb2d20fc2d6a21fd2d20fc2d20fd2d6a21fe2d20fd2d" + "20fe2d6a21ff2d20fe2d20ff2d6a21802e20ff2d20802e6a21812e20802e20812e6a21822e20812e20822e6a21832e" + "20822e20832e6a21842e20832e20842e6a21852e20842e20852e6a21862e20852e20862e6a21872e20862e20872e6a" + "21882e20872e20882e6a21892e20882e20892e6a218a2e20892e208a2e6a218b2e208a2e208b2e6a218c2e208b2e20" + "8c2e6a218d2e208c2e208d2e6a218e2e208d2e208e2e6a218f2e208e2e208f2e6a21902e208f2e20902e6a21912e20" + "902e20912e6a21922e20912e20922e6a21932e20922e20932e6a21942e20932e20942e6a21952e20942e20952e6a21" + "962e20952e20962e6a21972e20962e20972e6a21982e20972e20982e6a21992e20982e20992e6a219a2e20992e209a" + "2e6a219b2e209a2e209b2e6a219c2e209b2e209c2e6a219d2e209c2e209d2e6a219e2e209d2e209e2e6a219f2e209e" + "2e209f2e6a21a02e209f2e20a02e6a21a12e20a02e20a12e6a21a22e20a12e20a22e6a21a32e20a22e20a32e6a21a4" + "2e20a32e20a42e6a21a52e20a42e20a52e6a21a62e20a52e20a62e6a21a72e20a62e20a72e6a21a82e20a72e20a82e" "6a21a92e20a82e20a92e6a21aa2e20a92e20aa2e6a21ab2e20aa2e20ab2e6a21ac2e20ab2e20ac2e6a21ad2e20ac2e" - "20ad2e6a21ae2e20ad2e" - "20ae2e6a21af2e20ae2e20af2e6a21b02e20af2e20b02e6a21b12e20b02e20b12e6a21b22e20b12e20b22e6a21b32e" - "20b22e20b32e6a21b42e" - "20b32e20b42e6a21b52e20b42e20b52e6a21b62e20b52e20b62e6a21b72e20b62e20b72e6a21b82e20b72e20b82e6a" - "21b92e20b82e20b92e6a" - "21ba2e20b92e20ba2e6a21bb2e20ba2e20bb2e6a21bc2e20bb2e20bc2e6a21bd2e20bc2e20bd2e6a21be2e20bd2e20" - "be2e6a21bf2e20be2e20" - "bf2e6a21c02e20bf2e20c02e6a21c12e20c02e20c12e6a21c22e20c12e20c22e6a21c32e20c22e20c32e6a21c42e20" - "c32e20c42e6a21c52e20" - "c42e20c52e6a21c62e20c52e20c62e6a21c72e20c62e20c72e6a21c82e20c72e20c82e6a21c92e20c82e20c92e6a21" - "ca2e20c92e20ca2e6a21" - "cb2e20ca2e20cb2e6a21cc2e20cb2e20cc2e6a21cd2e20cc2e20cd2e6a21ce2e20cd2e20ce2e6a21cf2e20ce2e20cf" - "2e6a21d02e20cf2e20d0" - "2e6a21d12e20d02e20d12e6a21d22e20d12e20d22e6a21d32e20d22e20d32e6a21d42e20d32e20d42e6a21d52e20d4" - "2e20d52e6a21d62e20d5" - "2e20d62e6a21d72e20d62e20d72e6a21d82e20d72e20d82e6a21d92e20d82e20d92e6a21da2e20d92e20da2e6a21db" - "2e20da2e20db2e6a21dc" - "2e20db2e20dc2e6a21dd2e20dc2e20dd2e6a21de2e20dd2e20de2e6a21df2e20de2e20df2e6a21e02e20df2e20e02e" - "6a21e12e20e02e20e12e" - "6a21e22e20e12e20e22e6a21e32e20e22e20e32e6a21e42e20e32e20e42e6a21e52e20e42e20e52e6a21e62e20e52e" - "20e62e6a21e72e20e62e" - "20e72e6a21e82e20e72e20e82e6a21e92e20e82e20e92e6a21ea2e20e92e20ea2e6a21eb2e20ea2e20eb2e6a21ec2e" - "20eb2e20ec2e6a21ed2e" - "20ec2e20ed2e6a21ee2e20ed2e20ee2e6a21ef2e20ee2e20ef2e6a21f02e20ef2e20f02e6a21f12e20f02e20f12e6a" - "21f22e20f12e20f22e6a" - "21f32e20f22e20f32e6a21f42e20f32e20f42e6a21f52e20f42e20f52e6a21f62e20f52e20f62e6a21f72e20f62e20" - "f72e6a21f82e20f72e20" - "f82e6a21f92e20f82e20f92e6a21fa2e20f92e20fa2e6a21fb2e20fa2e20fb2e6a21fc2e20fb2e20fc2e6a21fd2e20" - "fc2e20fd2e6a21fe2e20" - "fd2e20fe2e6a21ff2e20fe2e20ff2e6a21802f20ff2e20802f6a21812f20802f20812f6a21822f20812f20822f6a21" - "832f20822f20832f6a21" - "842f20832f20842f6a21852f20842f20852f6a21862f20852f20862f6a21872f20862f20872f6a21882f20872f2088" - "2f6a21892f20882f2089" - "2f6a218a2f20892f208a2f6a218b2f208a2f208b2f6a218c2f208b2f208c2f6a218d2f208c2f208d2f6a218e2f208d" - "2f208e2f6a218f2f208e" - "2f208f2f6a21902f208f2f20902f6a21912f20902f20912f6a21922f20912f20922f6a21932f20922f20932f6a2194" - "2f20932f20942f6a2195" - "2f20942f20952f6a21962f20952f20962f6a21972f20962f20972f6a21982f20972f20982f6a21992f20982f20992f" - "6a219a2f20992f209a2f" - "6a219b2f209a2f209b2f6a219c2f209b2f209c2f6a219d2f209c2f209d2f6a219e2f209d2f209e2f6a219f2f209e2f" - "209f2f6a21a02f209f2f" - "20a02f6a21a12f20a02f20a12f6a21a22f20a12f20a22f6a21a32f20a22f20a32f6a21a42f20a32f20a42f6a21a52f" - "20a42f20a52f6a21a62f" - "20a52f20a62f6a21a72f20a62f20a72f6a21a82f20a72f20a82f6a21a92f20a82f20a92f6a21aa2f20a92f20aa2f6a" - "21ab2f20aa2f20ab2f6a" - "21ac2f20ab2f20ac2f6a21ad2f20ac2f20ad2f6a21ae2f20ad2f20ae2f6a21af2f20ae2f20af2f6a21b02f20af2f20" - "b02f6a21b12f20b02f20" - "b12f6a21b22f20b12f20b22f6a21b32f20b22f20b32f6a21b42f20b32f20b42f6a21b52f20b42f20b52f6a21b62f20" - "b52f20b62f6a21b72f20" - "b62f20b72f6a21b82f20b72f20b82f6a21b92f20b82f20b92f6a21ba2f20b92f20ba2f6a21bb2f20ba2f20bb2f6a21" - "bc2f20bb2f20bc2f6a21" - "bd2f20bc2f20bd2f6a21be2f20bd2f20be2f6a21bf2f20be2f20bf2f6a21c02f20bf2f20c02f6a21c12f20c02f20c1" - "2f6a21c22f20c12f20c2" - "2f6a21c32f20c22f20c32f6a21c42f20c32f20c42f6a21c52f20c42f20c52f6a21c62f20c52f20c62f6a21c72f20c6" - "2f20c72f6a21c82f20c7" - "2f20c82f6a21c92f20c82f20c92f6a21ca2f20c92f20ca2f6a21cb2f20ca2f20cb2f6a21cc2f20cb2f20cc2f6a21cd" - "2f20cc2f20cd2f6a21ce" - "2f20cd2f20ce2f6a21cf2f20ce2f20cf2f6a21d02f20cf2f20d02f6a21d12f20d02f20d12f6a21d22f20d12f20d22f" - "6a21d32f20d22f20d32f" - "6a21d42f20d32f20d42f6a21d52f20d42f20d52f6a21d62f20d52f20d62f6a21d72f20d62f20d72f6a21d82f20d72f" - "20d82f6a21d92f20d82f" - "20d92f6a21da2f20d92f20da2f6a21db2f20da2f20db2f6a21dc2f20db2f20dc2f6a21dd2f20dc2f20dd2f6a21de2f" - "20dd2f20de2f6a21df2f" - "20de2f20df2f6a21e02f20df2f20e02f6a21e12f20e02f20e12f6a21e22f20e12f20e22f6a21e32f20e22f20e32f6a" - "21e42f20e32f20e42f6a" - "21e52f20e42f20e52f6a21e62f20e52f20e62f6a21e72f20e62f20e72f6a21e82f20e72f20e82f6a21e92f20e82f20" - "e92f6a21ea2f20e92f20" - "ea2f6a21eb2f20ea2f20eb2f6a21ec2f20eb2f20ec2f6a21ed2f20ec2f20ed2f6a21ee2f20ed2f20ee2f6a21ef2f20" - "ee2f20ef2f6a21f02f20" - "ef2f20f02f6a21f12f20f02f20f12f6a21f22f20f12f20f22f6a21f32f20f22f20f32f6a21f42f20f32f20f42f6a21" - "f52f20f42f20f52f6a21" - "f62f20f52f20f62f6a21f72f20f62f20f72f6a21f82f20f72f20f82f6a21f92f20f82f20f92f6a21fa2f20f92f20fa" - "2f6a21fb2f20fa2f20fb" - "2f6a21fc2f20fb2f20fc2f6a21fd2f20fc2f20fd2f6a21fe2f20fd2f20fe2f6a21ff2f20fe2f20ff2f6a21803020ff" - "2f2080306a2181302080" - "302081306a2182302081302082306a2183302082302083306a2184302083302084306a2185302084302085306a2186" - "302085302086306a2187" - "302086302087306a2188302087302088306a2189302088302089306a218a30208930208a306a218b30208a30208b30" - "6a218c30208b30208c30" - "6a218d30208c30208d306a218e30208d30208e306a218f30208e30208f306a219030208f302090306a219130209030" - "2091306a219230209130" - "2092306a2193302092302093306a2194302093302094306a2195302094302095306a2196302095302096306a219730" - "2096302097306a219830" - "2097302098306a2199302098302099306a219a30209930209a306a219b30209a30209b306a219c30209b30209c306a" - "219d30209c30209d306a" - "219e30209d30209e306a219f30209e30209f306a21a030209f3020a0306a21a13020a03020a1306a21a23020a13020" - "a2306a21a33020a23020" - "a3306a21a43020a33020a4306a21a53020a43020a5306a21a63020a53020a6306a21a73020a63020a7306a21a83020" - "a73020a8306a21a93020" - "a83020a9306a21aa3020a93020aa306a21ab3020aa3020ab306a21ac3020ab3020ac306a21ad3020ac3020ad306a21" - "ae3020ad3020ae306a21" - "af3020ae3020af306a21b03020af3020b0306a21b13020b03020b1306a21b23020b13020b2306a21b33020b23020b3" - "306a21b43020b33020b4" + "20ad2e6a21ae2e20ad2e20ae2e6a21af2e20ae2e20af2e6a21b02e20af2e20b02e6a21b12e20b02e20b12e6a21b22e" + "20b12e20b22e6a21b32e20b22e20b32e6a21b42e20b32e20b42e6a21b52e20b42e20b52e6a21b62e20b52e20b62e6a" + "21b72e20b62e20b72e6a21b82e20b72e20b82e6a21b92e20b82e20b92e6a21ba2e20b92e20ba2e6a21bb2e20ba2e20" + "bb2e6a21bc2e20bb2e20bc2e6a21bd2e20bc2e20bd2e6a21be2e20bd2e20be2e6a21bf2e20be2e20bf2e6a21c02e20" + "bf2e20c02e6a21c12e20c02e20c12e6a21c22e20c12e20c22e6a21c32e20c22e20c32e6a21c42e20c32e20c42e6a21" + "c52e20c42e20c52e6a21c62e20c52e20c62e6a21c72e20c62e20c72e6a21c82e20c72e20c82e6a21c92e20c82e20c9" + "2e6a21ca2e20c92e20ca2e6a21cb2e20ca2e20cb2e6a21cc2e20cb2e20cc2e6a21cd2e20cc2e20cd2e6a21ce2e20cd" + "2e20ce2e6a21cf2e20ce2e20cf2e6a21d02e20cf2e20d02e6a21d12e20d02e20d12e6a21d22e20d12e20d22e6a21d3" + "2e20d22e20d32e6a21d42e20d32e20d42e6a21d52e20d42e20d52e6a21d62e20d52e20d62e6a21d72e20d62e20d72e" + "6a21d82e20d72e20d82e6a21d92e20d82e20d92e6a21da2e20d92e20da2e6a21db2e20da2e20db2e6a21dc2e20db2e" + "20dc2e6a21dd2e20dc2e20dd2e6a21de2e20dd2e20de2e6a21df2e20de2e20df2e6a21e02e20df2e20e02e6a21e12e" + "20e02e20e12e6a21e22e20e12e20e22e6a21e32e20e22e20e32e6a21e42e20e32e20e42e6a21e52e20e42e20e52e6a" + "21e62e20e52e20e62e6a21e72e20e62e20e72e6a21e82e20e72e20e82e6a21e92e20e82e20e92e6a21ea2e20e92e20" + "ea2e6a21eb2e20ea2e20eb2e6a21ec2e20eb2e20ec2e6a21ed2e20ec2e20ed2e6a21ee2e20ed2e20ee2e6a21ef2e20" + "ee2e20ef2e6a21f02e20ef2e20f02e6a21f12e20f02e20f12e6a21f22e20f12e20f22e6a21f32e20f22e20f32e6a21" + "f42e20f32e20f42e6a21f52e20f42e20f52e6a21f62e20f52e20f62e6a21f72e20f62e20f72e6a21f82e20f72e20f8" + "2e6a21f92e20f82e20f92e6a21fa2e20f92e20fa2e6a21fb2e20fa2e20fb2e6a21fc2e20fb2e20fc2e6a21fd2e20fc" + "2e20fd2e6a21fe2e20fd2e20fe2e6a21ff2e20fe2e20ff2e6a21802f20ff2e20802f6a21812f20802f20812f6a2182" + "2f20812f20822f6a21832f20822f20832f6a21842f20832f20842f6a21852f20842f20852f6a21862f20852f20862f" + "6a21872f20862f20872f6a21882f20872f20882f6a21892f20882f20892f6a218a2f20892f208a2f6a218b2f208a2f" + "208b2f6a218c2f208b2f208c2f6a218d2f208c2f208d2f6a218e2f208d2f208e2f6a218f2f208e2f208f2f6a21902f" + "208f2f20902f6a21912f20902f20912f6a21922f20912f20922f6a21932f20922f20932f6a21942f20932f20942f6a" + "21952f20942f20952f6a21962f20952f20962f6a21972f20962f20972f6a21982f20972f20982f6a21992f20982f20" + "992f6a219a2f20992f209a2f6a219b2f209a2f209b2f6a219c2f209b2f209c2f6a219d2f209c2f209d2f6a219e2f20" + "9d2f209e2f6a219f2f209e2f209f2f6a21a02f209f2f20a02f6a21a12f20a02f20a12f6a21a22f20a12f20a22f6a21" + "a32f20a22f20a32f6a21a42f20a32f20a42f6a21a52f20a42f20a52f6a21a62f20a52f20a62f6a21a72f20a62f20a7" + "2f6a21a82f20a72f20a82f6a21a92f20a82f20a92f6a21aa2f20a92f20aa2f6a21ab2f20aa2f20ab2f6a21ac2f20ab" + "2f20ac2f6a21ad2f20ac2f20ad2f6a21ae2f20ad2f20ae2f6a21af2f20ae2f20af2f6a21b02f20af2f20b02f6a21b1" + "2f20b02f20b12f6a21b22f20b12f20b22f6a21b32f20b22f20b32f6a21b42f20b32f20b42f6a21b52f20b42f20b52f" + "6a21b62f20b52f20b62f6a21b72f20b62f20b72f6a21b82f20b72f20b82f6a21b92f20b82f20b92f6a21ba2f20b92f" + "20ba2f6a21bb2f20ba2f20bb2f6a21bc2f20bb2f20bc2f6a21bd2f20bc2f20bd2f6a21be2f20bd2f20be2f6a21bf2f" + "20be2f20bf2f6a21c02f20bf2f20c02f6a21c12f20c02f20c12f6a21c22f20c12f20c22f6a21c32f20c22f20c32f6a" + "21c42f20c32f20c42f6a21c52f20c42f20c52f6a21c62f20c52f20c62f6a21c72f20c62f20c72f6a21c82f20c72f20" + "c82f6a21c92f20c82f20c92f6a21ca2f20c92f20ca2f6a21cb2f20ca2f20cb2f6a21cc2f20cb2f20cc2f6a21cd2f20" + "cc2f20cd2f6a21ce2f20cd2f20ce2f6a21cf2f20ce2f20cf2f6a21d02f20cf2f20d02f6a21d12f20d02f20d12f6a21" + "d22f20d12f20d22f6a21d32f20d22f20d32f6a21d42f20d32f20d42f6a21d52f20d42f20d52f6a21d62f20d52f20d6" + "2f6a21d72f20d62f20d72f6a21d82f20d72f20d82f6a21d92f20d82f20d92f6a21da2f20d92f20da2f6a21db2f20da" + "2f20db2f6a21dc2f20db2f20dc2f6a21dd2f20dc2f20dd2f6a21de2f20dd2f20de2f6a21df2f20de2f20df2f6a21e0" + "2f20df2f20e02f6a21e12f20e02f20e12f6a21e22f20e12f20e22f6a21e32f20e22f20e32f6a21e42f20e32f20e42f" + "6a21e52f20e42f20e52f6a21e62f20e52f20e62f6a21e72f20e62f20e72f6a21e82f20e72f20e82f6a21e92f20e82f" + "20e92f6a21ea2f20e92f20ea2f6a21eb2f20ea2f20eb2f6a21ec2f20eb2f20ec2f6a21ed2f20ec2f20ed2f6a21ee2f" + "20ed2f20ee2f6a21ef2f20ee2f20ef2f6a21f02f20ef2f20f02f6a21f12f20f02f20f12f6a21f22f20f12f20f22f6a" + "21f32f20f22f20f32f6a21f42f20f32f20f42f6a21f52f20f42f20f52f6a21f62f20f52f20f62f6a21f72f20f62f20" + "f72f6a21f82f20f72f20f82f6a21f92f20f82f20f92f6a21fa2f20f92f20fa2f6a21fb2f20fa2f20fb2f6a21fc2f20" + "fb2f20fc2f6a21fd2f20fc2f20fd2f6a21fe2f20fd2f20fe2f6a21ff2f20fe2f20ff2f6a21803020ff2f2080306a21" + "81302080302081306a2182302081302082306a2183302082302083306a2184302083302084306a2185302084302085" + "306a2186302085302086306a2187302086302087306a2188302087302088306a2189302088302089306a218a302089" + "30208a306a218b30208a30208b306a218c30208b30208c306a218d30208c30208d306a218e30208d30208e306a218f" + "30208e30208f306a219030208f302090306a2191302090302091306a2192302091302092306a219330209230209330" + "6a2194302093302094306a2195302094302095306a2196302095302096306a2197302096302097306a219830209730" + "2098306a2199302098302099306a219a30209930209a306a219b30209a30209b306a219c30209b30209c306a219d30" + "209c30209d306a219e30209d30209e306a219f30209e30209f306a21a030209f3020a0306a21a13020a03020a1306a" + "21a23020a13020a2306a21a33020a23020a3306a21a43020a33020a4306a21a53020a43020a5306a21a63020a53020" + "a6306a21a73020a63020a7306a21a83020a73020a8306a21a93020a83020a9306a21aa3020a93020aa306a21ab3020" + "aa3020ab306a21ac3020ab3020ac306a21ad3020ac3020ad306a21ae3020ad3020ae306a21af3020ae3020af306a21" + "b03020af3020b0306a21b13020b03020b1306a21b23020b13020b2306a21b33020b23020b3306a21b43020b33020b4" "306a21b53020b43020b5306a21b63020b53020b6306a21b73020b63020b7306a21b83020b73020b8306a21b93020b8" - "3020b9306a21ba3020b9" - "3020ba306a21bb3020ba3020bb306a21bc3020bb3020bc306a21bd3020bc3020bd306a21be3020bd3020be306a21bf" - "3020be3020bf306a21c0" - "3020bf3020c0306a21c13020c03020c1306a21c23020c13020c2306a21c33020c23020c3306a21c43020c33020c430" - "6a21c53020c43020c530" - "6a21c63020c53020c6306a21c73020c63020c7306a21c83020c73020c8306a21c93020c83020c9306a21ca3020c930" - "20ca306a21cb3020ca30" - "20cb306a21cc3020cb3020cc306a21cd3020cc3020cd306a21ce3020cd3020ce306a21cf3020ce3020cf306a21d030" - "20cf3020d0306a21d130" - "20d03020d1306a21d23020d13020d2306a21d33020d23020d3306a21d43020d33020d4306a21d53020d43020d5306a" - "21d63020d53020d6306a" - "21d73020d63020d7306a21d83020d73020d8306a21d93020d83020d9306a21da3020d93020da306a21db3020da3020" - "db306a21dc3020db3020" - "dc306a21dd3020dc3020dd306a21de3020dd3020de306a21df3020de3020df306a21e03020df3020e0306a21e13020" - "e03020e1306a21e23020" - "e13020e2306a21e33020e23020e3306a21e43020e33020e4306a21e53020e43020e5306a21e63020e53020e6306a21" - "e73020e63020e7306a21" - "e83020e73020e8306a21e93020e83020e9306a21ea3020e93020ea306a21eb3020ea3020eb306a21ec3020eb3020ec" - "306a21ed3020ec3020ed" - "306a21ee3020ed3020ee306a21ef3020ee3020ef306a21f03020ef3020f0306a21f13020f03020f1306a21f23020f1" - "3020f2306a21f33020f2" - "3020f3306a21f43020f33020f4306a21f53020f43020f5306a21f63020f53020f6306a21f73020f63020f7306a21f8" - "3020f73020f8306a21f9" - "3020f83020f9306a21fa3020f93020fa306a21fb3020fa3020fb306a21fc3020fb3020fc306a21fd3020fc3020fd30" - "6a21fe3020fd3020fe30" - "6a21ff3020fe3020ff306a21803120ff302080316a2181312080312081316a2182312081312082316a218331208231" - "2083316a218431208331" - "2084316a2185312084312085316a2186312085312086316a2187312086312087316a2188312087312088316a218931" - "2088312089316a218a31" - "208931208a316a218b31208a31208b316a218c31208b31208c316a218d31208c31208d316a218e31208d31208e316a" - "218f31208e31208f316a" - "219031208f312090316a2191312090312091316a2192312091312092316a2193312092312093316a21943120933120" - "94316a21953120943120" - "95316a2196312095312096316a2197312096312097316a2198312097312098316a2199312098312099316a219a3120" - "9931209a316a219b3120" - "9a31209b316a219c31209b31209c316a219d31209c31209d316a219e31209d31209e316a219f31209e31209f316a21" - "a031209f3120a0316a21" - "a13120a03120a1316a21a23120a13120a2316a21a33120a23120a3316a21a43120a33120a4316a21a53120a43120a5" - "316a21a63120a53120a6" - "316a21a73120a63120a7316a21a83120a73120a8316a21a93120a83120a9316a21aa3120a93120aa316a21ab3120aa" - "3120ab316a21ac3120ab" - "3120ac316a21ad3120ac3120ad316a21ae3120ad3120ae316a21af3120ae3120af316a21b03120af3120b0316a21b1" - "3120b03120b1316a21b2" - "3120b13120b2316a21b33120b23120b3316a21b43120b33120b4316a21b53120b43120b5316a21b63120b53120b631" - "6a21b73120b63120b731" - "6a21b83120b73120b8316a21b93120b83120b9316a21ba3120b93120ba316a21bb3120ba3120bb316a21bc3120bb31" - "20bc316a21bd3120bc31" - "20bd316a21be3120bd3120be316a21bf3120be3120bf316a21c03120bf3120c0316a21c13120c03120c1316a21c231" - "20c13120c2316a21c331" - "20c23120c3316a21c43120c33120c4316a21c53120c43120c5316a21c63120c53120c6316a21c73120c63120c7316a" - "21c83120c73120c8316a" - "21c93120c83120c9316a21ca3120c93120ca316a21cb3120ca3120cb316a21cc3120cb3120cc316a21cd3120cc3120" - "cd316a21ce3120cd3120" - "ce316a21cf3120ce3120cf316a21d03120cf3120d0316a21d13120d03120d1316a21d23120d13120d2316a21d33120" - "d23120d3316a21d43120" - "d33120d4316a21d53120d43120d5316a21d63120d53120d6316a21d73120d63120d7316a21d83120d73120d8316a21" - "d93120d83120d9316a21" - "da3120d93120da316a21db3120da3120db316a21dc3120db3120dc316a21dd3120dc3120dd316a21de3120dd3120de" - "316a21df3120de3120df" - "316a21e03120df3120e0316a21e13120e03120e1316a21e23120e13120e2316a21e33120e23120e3316a21e43120e3" - "3120e4316a21e53120e4" - "3120e5316a21e63120e53120e6316a21e73120e63120e7316a21e83120e73120e8316a21e93120e83120e9316a21ea" - "3120e93120ea316a21eb" - "3120ea3120eb316a21ec3120eb3120ec316a21ed3120ec3120ed316a21ee3120ed3120ee316a21ef3120ee3120ef31" - "6a21f03120ef3120f031" - "6a21f13120f03120f1316a21f23120f13120f2316a21f33120f23120f3316a21f43120f33120f4316a21f53120f431" - "20f5316a21f63120f531" - "20f6316a21f73120f63120f7316a21f83120f73120f8316a21f93120f83120f9316a21fa3120f93120fa316a21fb31" - "20fa3120fb316a21fc31" - "20fb3120fc316a21fd3120fc3120fd316a21fe3120fd3120fe316a21ff3120fe3120ff316a21803220ff312080326a" - "2181322080322081326a" - "2182322081322082326a2183322082322083326a2184322083322084326a2185322084322085326a21863220853220" - "86326a21873220863220" - "87326a2188322087322088326a2189322088322089326a218a32208932208a326a218b32208a32208b326a218c3220" - "8b32208c326a218d3220" - "8c32208d326a218e32208d32208e326a218f32208e32208f326a219032208f322090326a2191322090322091326a21" - "92322091322092326a21" - "93322092322093326a2194322093322094326a2195322094322095326a2196322095322096326a2197322096322097" - "326a2198322097322098" - "326a2199322098322099326a219a32209932209a326a219b32209a32209b326a219c32209b32209c326a219d32209c" - "32209d326a219e32209d" - "32209e326a219f32209e32209f326a21a032209f3220a0326a21a13220a03220a1326a21a23220a13220a2326a21a3" - "3220a23220a3326a21a4" - "3220a33220a4326a21a53220a43220a5326a21a63220a53220a6326a21a73220a63220a7326a21a83220a73220a832" - "6a21a93220a83220a932" - "6a21aa3220a93220aa326a21ab3220aa3220ab326a21ac3220ab3220ac326a21ad3220ac3220ad326a21ae3220ad32" - "20ae326a21af3220ae32" - "20af326a21b03220af3220b0326a21b13220b03220b1326a21b23220b13220b2326a21b33220b23220b3326a21b432" - "20b33220b4326a21b532" - "20b43220b5326a21b63220b53220b6326a21b73220b63220b7326a21b83220b73220b8326a21b93220b83220b9326a" - "21ba3220b93220ba326a" - "21bb3220ba3220bb326a21bc3220bb3220bc326a21bd3220bc3220bd326a21be3220bd3220be326a21bf3220be3220" - "bf326a21c03220bf3220" + "3020b9306a21ba3020b93020ba306a21bb3020ba3020bb306a21bc3020bb3020bc306a21bd3020bc3020bd306a21be" + "3020bd3020be306a21bf3020be3020bf306a21c03020bf3020c0306a21c13020c03020c1306a21c23020c13020c230" + "6a21c33020c23020c3306a21c43020c33020c4306a21c53020c43020c5306a21c63020c53020c6306a21c73020c630" + "20c7306a21c83020c73020c8306a21c93020c83020c9306a21ca3020c93020ca306a21cb3020ca3020cb306a21cc30" + "20cb3020cc306a21cd3020cc3020cd306a21ce3020cd3020ce306a21cf3020ce3020cf306a21d03020cf3020d0306a" + "21d13020d03020d1306a21d23020d13020d2306a21d33020d23020d3306a21d43020d33020d4306a21d53020d43020" + "d5306a21d63020d53020d6306a21d73020d63020d7306a21d83020d73020d8306a21d93020d83020d9306a21da3020" + "d93020da306a21db3020da3020db306a21dc3020db3020dc306a21dd3020dc3020dd306a21de3020dd3020de306a21" + "df3020de3020df306a21e03020df3020e0306a21e13020e03020e1306a21e23020e13020e2306a21e33020e23020e3" + "306a21e43020e33020e4306a21e53020e43020e5306a21e63020e53020e6306a21e73020e63020e7306a21e83020e7" + "3020e8306a21e93020e83020e9306a21ea3020e93020ea306a21eb3020ea3020eb306a21ec3020eb3020ec306a21ed" + "3020ec3020ed306a21ee3020ed3020ee306a21ef3020ee3020ef306a21f03020ef3020f0306a21f13020f03020f130" + "6a21f23020f13020f2306a21f33020f23020f3306a21f43020f33020f4306a21f53020f43020f5306a21f63020f530" + "20f6306a21f73020f63020f7306a21f83020f73020f8306a21f93020f83020f9306a21fa3020f93020fa306a21fb30" + "20fa3020fb306a21fc3020fb3020fc306a21fd3020fc3020fd306a21fe3020fd3020fe306a21ff3020fe3020ff306a" + "21803120ff302080316a2181312080312081316a2182312081312082316a2183312082312083316a21843120833120" + "84316a2185312084312085316a2186312085312086316a2187312086312087316a2188312087312088316a21893120" + "88312089316a218a31208931208a316a218b31208a31208b316a218c31208b31208c316a218d31208c31208d316a21" + "8e31208d31208e316a218f31208e31208f316a219031208f312090316a2191312090312091316a2192312091312092" + "316a2193312092312093316a2194312093312094316a2195312094312095316a2196312095312096316a2197312096" + "312097316a2198312097312098316a2199312098312099316a219a31209931209a316a219b31209a31209b316a219c" + "31209b31209c316a219d31209c31209d316a219e31209d31209e316a219f31209e31209f316a21a031209f3120a031" + "6a21a13120a03120a1316a21a23120a13120a2316a21a33120a23120a3316a21a43120a33120a4316a21a53120a431" + "20a5316a21a63120a53120a6316a21a73120a63120a7316a21a83120a73120a8316a21a93120a83120a9316a21aa31" + "20a93120aa316a21ab3120aa3120ab316a21ac3120ab3120ac316a21ad3120ac3120ad316a21ae3120ad3120ae316a" + "21af3120ae3120af316a21b03120af3120b0316a21b13120b03120b1316a21b23120b13120b2316a21b33120b23120" + "b3316a21b43120b33120b4316a21b53120b43120b5316a21b63120b53120b6316a21b73120b63120b7316a21b83120" + "b73120b8316a21b93120b83120b9316a21ba3120b93120ba316a21bb3120ba3120bb316a21bc3120bb3120bc316a21" + "bd3120bc3120bd316a21be3120bd3120be316a21bf3120be3120bf316a21c03120bf3120c0316a21c13120c03120c1" + "316a21c23120c13120c2316a21c33120c23120c3316a21c43120c33120c4316a21c53120c43120c5316a21c63120c5" + "3120c6316a21c73120c63120c7316a21c83120c73120c8316a21c93120c83120c9316a21ca3120c93120ca316a21cb" + "3120ca3120cb316a21cc3120cb3120cc316a21cd3120cc3120cd316a21ce3120cd3120ce316a21cf3120ce3120cf31" + "6a21d03120cf3120d0316a21d13120d03120d1316a21d23120d13120d2316a21d33120d23120d3316a21d43120d331" + "20d4316a21d53120d43120d5316a21d63120d53120d6316a21d73120d63120d7316a21d83120d73120d8316a21d931" + "20d83120d9316a21da3120d93120da316a21db3120da3120db316a21dc3120db3120dc316a21dd3120dc3120dd316a" + "21de3120dd3120de316a21df3120de3120df316a21e03120df3120e0316a21e13120e03120e1316a21e23120e13120" + "e2316a21e33120e23120e3316a21e43120e33120e4316a21e53120e43120e5316a21e63120e53120e6316a21e73120" + "e63120e7316a21e83120e73120e8316a21e93120e83120e9316a21ea3120e93120ea316a21eb3120ea3120eb316a21" + "ec3120eb3120ec316a21ed3120ec3120ed316a21ee3120ed3120ee316a21ef3120ee3120ef316a21f03120ef3120f0" + "316a21f13120f03120f1316a21f23120f13120f2316a21f33120f23120f3316a21f43120f33120f4316a21f53120f4" + "3120f5316a21f63120f53120f6316a21f73120f63120f7316a21f83120f73120f8316a21f93120f83120f9316a21fa" + "3120f93120fa316a21fb3120fa3120fb316a21fc3120fb3120fc316a21fd3120fc3120fd316a21fe3120fd3120fe31" + "6a21ff3120fe3120ff316a21803220ff312080326a2181322080322081326a2182322081322082326a218332208232" + "2083326a2184322083322084326a2185322084322085326a2186322085322086326a2187322086322087326a218832" + "2087322088326a2189322088322089326a218a32208932208a326a218b32208a32208b326a218c32208b32208c326a" + "218d32208c32208d326a218e32208d32208e326a218f32208e32208f326a219032208f322090326a21913220903220" + "91326a2192322091322092326a2193322092322093326a2194322093322094326a2195322094322095326a21963220" + "95322096326a2197322096322097326a2198322097322098326a2199322098322099326a219a32209932209a326a21" + "9b32209a32209b326a219c32209b32209c326a219d32209c32209d326a219e32209d32209e326a219f32209e32209f" + "326a21a032209f3220a0326a21a13220a03220a1326a21a23220a13220a2326a21a33220a23220a3326a21a43220a3" + "3220a4326a21a53220a43220a5326a21a63220a53220a6326a21a73220a63220a7326a21a83220a73220a8326a21a9" + "3220a83220a9326a21aa3220a93220aa326a21ab3220aa3220ab326a21ac3220ab3220ac326a21ad3220ac3220ad32" + "6a21ae3220ad3220ae326a21af3220ae3220af326a21b03220af3220b0326a21b13220b03220b1326a21b23220b132" + "20b2326a21b33220b23220b3326a21b43220b33220b4326a21b53220b43220b5326a21b63220b53220b6326a21b732" + "20b63220b7326a21b83220b73220b8326a21b93220b83220b9326a21ba3220b93220ba326a21bb3220ba3220bb326a" + "21bc3220bb3220bc326a21bd3220bc3220bd326a21be3220bd3220be326a21bf3220be3220bf326a21c03220bf3220" "c0326a21c13220c03220c1326a21c23220c13220c2326a21c33220c23220c3326a21c43220c33220c4326a21c53220" - "c43220c5326a21c63220" - "c53220c6326a21c73220c63220c7326a21c83220c73220c8326a21c93220c83220c9326a21ca3220c93220ca326a21" - "cb3220ca3220cb326a21" - "cc3220cb3220cc326a21cd3220cc3220cd326a21ce3220cd3220ce326a21cf3220ce3220cf326a21d03220cf3220d0" - "326a21d13220d03220d1" - "326a21d23220d13220d2326a21d33220d23220d3326a21d43220d33220d4326a21d53220d43220d5326a21d63220d5" - "3220d6326a21d73220d6" - "3220d7326a21d83220d73220d8326a21d93220d83220d9326a21da3220d93220da326a21db3220da3220db326a21dc" - "3220db3220dc326a21dd" - "3220dc3220dd326a21de3220dd3220de326a21df3220de3220df326a21e03220df3220e0326a21e13220e03220e132" - "6a21e23220e13220e232" - "6a21e33220e23220e3326a21e43220e33220e4326a21e53220e43220e5326a21e63220e53220e6326a21e73220e632" - "20e7326a21e83220e732" - "20e8326a21e93220e83220e9326a21ea3220e93220ea326a21eb3220ea3220eb326a21ec3220eb3220ec326a21ed32" - "20ec3220ed326a21ee32" - "20ed3220ee326a21ef3220ee3220ef326a21f03220ef3220f0326a21f13220f03220f1326a21f23220f13220f2326a" - "21f33220f23220f3326a" - "21f43220f33220f4326a21f53220f43220f5326a21f63220f53220f6326a21f73220f63220f7326a21f83220f73220" - "f8326a21f93220f83220" - "f9326a21fa3220f93220fa326a21fb3220fa3220fb326a21fc3220fb3220fc326a21fd3220fc3220fd326a21fe3220" - "fd3220fe326a21ff3220" - "fe3220ff326a21803320ff322080336a2181332080332081336a2182332081332082336a2183332082332083336a21" - "84332083332084336a21" - "85332084332085336a2186332085332086336a2187332086332087336a2188332087332088336a2189332088332089" - "336a218a33208933208a" - "336a218b33208a33208b336a218c33208b33208c336a218d33208c33208d336a218e33208d33208e336a218f33208e" - "33208f336a219033208f" - "332090336a2191332090332091336a2192332091332092336a2193332092332093336a2194332093332094336a2195" - "332094332095336a2196" - "332095332096336a2197332096332097336a2198332097332098336a2199332098332099336a219a33209933209a33" - "6a219b33209a33209b33" - "6a219c33209b33209c336a219d33209c33209d336a219e33209d33209e336a219f33209e33209f336a21a033209f33" - "20a0336a21a13320a033" - "20a1336a21a23320a13320a2336a21a33320a23320a3336a21a43320a33320a4336a21a53320a43320a5336a21a633" - "20a53320a6336a21a733" - "20a63320a7336a21a83320a73320a8336a21a93320a83320a9336a21aa3320a93320aa336a21ab3320aa3320ab336a" - "21ac3320ab3320ac336a" - "21ad3320ac3320ad336a21ae3320ad3320ae336a21af3320ae3320af336a21b03320af3320b0336a21b13320b03320" - "b1336a21b23320b13320" - "b2336a21b33320b23320b3336a21b43320b33320b4336a21b53320b43320b5336a21b63320b53320b6336a21b73320" - "b63320b7336a21b83320" - "b73320b8336a21b93320b83320b9336a21ba3320b93320ba336a21bb3320ba3320bb336a21bc3320bb3320bc336a21" - "bd3320bc3320bd336a21" - "be3320bd3320be336a21bf3320be3320bf336a21c03320bf3320c0336a21c13320c03320c1336a21c23320c13320c2" - "336a21c33320c23320c3" - "336a21c43320c33320c4336a21c53320c43320c5336a21c63320c53320c6336a21c73320c63320c7336a21c83320c7" - "3320c8336a21c93320c8" - "3320c9336a21ca3320c93320ca336a21cb3320ca3320cb336a21cc3320cb3320cc336a21cd3320cc3320cd336a21ce" - "3320cd3320ce336a21cf" - "3320ce3320cf336a21d03320cf3320d0336a21d13320d03320d1336a21d23320d13320d2336a21d33320d23320d333" - "6a21d43320d33320d433" - "6a21d53320d43320d5336a21d63320d53320d6336a21d73320d63320d7336a21d83320d73320d8336a21d93320d833" - "20d9336a21da3320d933" - "20da336a21db3320da3320db336a21dc3320db3320dc336a21dd3320dc3320dd336a21de3320dd3320de336a21df33" - "20de3320df336a21e033" - "20df3320e0336a21e13320e03320e1336a21e23320e13320e2336a21e33320e23320e3336a21e43320e33320e4336a" - "21e53320e43320e5336a" - "21e63320e53320e6336a21e73320e63320e7336a21e83320e73320e8336a21e93320e83320e9336a21ea3320e93320" - "ea336a21eb3320ea3320" - "eb336a21ec3320eb3320ec336a21ed3320ec3320ed336a21ee3320ed3320ee336a21ef3320ee3320ef336a21f03320" - "ef3320f0336a21f13320" - "f03320f1336a21f23320f13320f2336a21f33320f23320f3336a21f43320f33320f4336a21f53320f43320f5336a21" - "f63320f53320f6336a21" - "f73320f63320f7336a21f83320f73320f8336a21f93320f83320f9336a21fa3320f93320fa336a21fb3320fa3320fb" - "336a21fc3320fb3320fc" - "336a21fd3320fc3320fd336a21fe3320fd3320fe336a21ff3320fe3320ff336a21803420ff332080346a2181342080" - "342081346a2182342081" - "342082346a2183342082342083346a2184342083342084346a2185342084342085346a2186342085342086346a2187" - "342086342087346a2188" - "342087342088346a2189342088342089346a218a34208934208a346a218b34208a34208b346a218c34208b34208c34" - "6a218d34208c34208d34" - "6a218e34208d34208e346a218f34208e34208f346a219034208f342090346a2191342090342091346a219234209134" - "2092346a219334209234" - "2093346a2194342093342094346a2195342094342095346a2196342095342096346a2197342096342097346a219834" - "2097342098346a219934" - "2098342099346a219a34209934209a346a219b34209a34209b346a219c34209b34209c346a219d34209c34209d346a" - "219e34209d34209e346a" - "219f34209e34209f346a21a034209f3420a0346a21a13420a03420a1346a21a23420a13420a2346a21a33420a23420" - "a3346a21a43420a33420" - "a4346a21a53420a43420a5346a21a63420a53420a6346a21a73420a63420a7346a21a83420a73420a8346a21a93420" - "a83420a9346a21aa3420" - "a93420aa346a21ab3420aa3420ab346a21ac3420ab3420ac346a21ad3420ac3420ad346a21ae3420ad3420ae346a21" - "af3420ae3420af346a21" - "b03420af3420b0346a21b13420b03420b1346a21b23420b13420b2346a21b33420b23420b3346a21b43420b33420b4" - "346a21b53420b43420b5" - "346a21b63420b53420b6346a21b73420b63420b7346a21b83420b73420b8346a21b93420b83420b9346a21ba3420b9" - "3420ba346a21bb3420ba" - "3420bb346a21bc3420bb3420bc346a21bd3420bc3420bd346a21be3420bd3420be346a21bf3420be3420bf346a21c0" - "3420bf3420c0346a21c1" - "3420c03420c1346a21c23420c13420c2346a21c33420c23420c3346a21c43420c33420c4346a21c53420c43420c534" - "6a21c63420c53420c634" - "6a21c73420c63420c7346a21c83420c73420c8346a21c93420c83420c9346a21ca3420c93420ca346a21cb3420ca34" - "20cb346a21cc3420cb34" + "c43220c5326a21c63220c53220c6326a21c73220c63220c7326a21c83220c73220c8326a21c93220c83220c9326a21" + "ca3220c93220ca326a21cb3220ca3220cb326a21cc3220cb3220cc326a21cd3220cc3220cd326a21ce3220cd3220ce" + "326a21cf3220ce3220cf326a21d03220cf3220d0326a21d13220d03220d1326a21d23220d13220d2326a21d33220d2" + "3220d3326a21d43220d33220d4326a21d53220d43220d5326a21d63220d53220d6326a21d73220d63220d7326a21d8" + "3220d73220d8326a21d93220d83220d9326a21da3220d93220da326a21db3220da3220db326a21dc3220db3220dc32" + "6a21dd3220dc3220dd326a21de3220dd3220de326a21df3220de3220df326a21e03220df3220e0326a21e13220e032" + "20e1326a21e23220e13220e2326a21e33220e23220e3326a21e43220e33220e4326a21e53220e43220e5326a21e632" + "20e53220e6326a21e73220e63220e7326a21e83220e73220e8326a21e93220e83220e9326a21ea3220e93220ea326a" + "21eb3220ea3220eb326a21ec3220eb3220ec326a21ed3220ec3220ed326a21ee3220ed3220ee326a21ef3220ee3220" + "ef326a21f03220ef3220f0326a21f13220f03220f1326a21f23220f13220f2326a21f33220f23220f3326a21f43220" + "f33220f4326a21f53220f43220f5326a21f63220f53220f6326a21f73220f63220f7326a21f83220f73220f8326a21" + "f93220f83220f9326a21fa3220f93220fa326a21fb3220fa3220fb326a21fc3220fb3220fc326a21fd3220fc3220fd" + "326a21fe3220fd3220fe326a21ff3220fe3220ff326a21803320ff322080336a2181332080332081336a2182332081" + "332082336a2183332082332083336a2184332083332084336a2185332084332085336a2186332085332086336a2187" + "332086332087336a2188332087332088336a2189332088332089336a218a33208933208a336a218b33208a33208b33" + "6a218c33208b33208c336a218d33208c33208d336a218e33208d33208e336a218f33208e33208f336a219033208f33" + "2090336a2191332090332091336a2192332091332092336a2193332092332093336a2194332093332094336a219533" + "2094332095336a2196332095332096336a2197332096332097336a2198332097332098336a2199332098332099336a" + "219a33209933209a336a219b33209a33209b336a219c33209b33209c336a219d33209c33209d336a219e33209d3320" + "9e336a219f33209e33209f336a21a033209f3320a0336a21a13320a03320a1336a21a23320a13320a2336a21a33320" + "a23320a3336a21a43320a33320a4336a21a53320a43320a5336a21a63320a53320a6336a21a73320a63320a7336a21" + "a83320a73320a8336a21a93320a83320a9336a21aa3320a93320aa336a21ab3320aa3320ab336a21ac3320ab3320ac" + "336a21ad3320ac3320ad336a21ae3320ad3320ae336a21af3320ae3320af336a21b03320af3320b0336a21b13320b0" + "3320b1336a21b23320b13320b2336a21b33320b23320b3336a21b43320b33320b4336a21b53320b43320b5336a21b6" + "3320b53320b6336a21b73320b63320b7336a21b83320b73320b8336a21b93320b83320b9336a21ba3320b93320ba33" + "6a21bb3320ba3320bb336a21bc3320bb3320bc336a21bd3320bc3320bd336a21be3320bd3320be336a21bf3320be33" + "20bf336a21c03320bf3320c0336a21c13320c03320c1336a21c23320c13320c2336a21c33320c23320c3336a21c433" + "20c33320c4336a21c53320c43320c5336a21c63320c53320c6336a21c73320c63320c7336a21c83320c73320c8336a" + "21c93320c83320c9336a21ca3320c93320ca336a21cb3320ca3320cb336a21cc3320cb3320cc336a21cd3320cc3320" + "cd336a21ce3320cd3320ce336a21cf3320ce3320cf336a21d03320cf3320d0336a21d13320d03320d1336a21d23320" + "d13320d2336a21d33320d23320d3336a21d43320d33320d4336a21d53320d43320d5336a21d63320d53320d6336a21" + "d73320d63320d7336a21d83320d73320d8336a21d93320d83320d9336a21da3320d93320da336a21db3320da3320db" + "336a21dc3320db3320dc336a21dd3320dc3320dd336a21de3320dd3320de336a21df3320de3320df336a21e03320df" + "3320e0336a21e13320e03320e1336a21e23320e13320e2336a21e33320e23320e3336a21e43320e33320e4336a21e5" + "3320e43320e5336a21e63320e53320e6336a21e73320e63320e7336a21e83320e73320e8336a21e93320e83320e933" + "6a21ea3320e93320ea336a21eb3320ea3320eb336a21ec3320eb3320ec336a21ed3320ec3320ed336a21ee3320ed33" + "20ee336a21ef3320ee3320ef336a21f03320ef3320f0336a21f13320f03320f1336a21f23320f13320f2336a21f333" + "20f23320f3336a21f43320f33320f4336a21f53320f43320f5336a21f63320f53320f6336a21f73320f63320f7336a" + "21f83320f73320f8336a21f93320f83320f9336a21fa3320f93320fa336a21fb3320fa3320fb336a21fc3320fb3320" + "fc336a21fd3320fc3320fd336a21fe3320fd3320fe336a21ff3320fe3320ff336a21803420ff332080346a21813420" + "80342081346a2182342081342082346a2183342082342083346a2184342083342084346a2185342084342085346a21" + "86342085342086346a2187342086342087346a2188342087342088346a2189342088342089346a218a34208934208a" + "346a218b34208a34208b346a218c34208b34208c346a218d34208c34208d346a218e34208d34208e346a218f34208e" + "34208f346a219034208f342090346a2191342090342091346a2192342091342092346a2193342092342093346a2194" + "342093342094346a2195342094342095346a2196342095342096346a2197342096342097346a219834209734209834" + "6a2199342098342099346a219a34209934209a346a219b34209a34209b346a219c34209b34209c346a219d34209c34" + "209d346a219e34209d34209e346a219f34209e34209f346a21a034209f3420a0346a21a13420a03420a1346a21a234" + "20a13420a2346a21a33420a23420a3346a21a43420a33420a4346a21a53420a43420a5346a21a63420a53420a6346a" + "21a73420a63420a7346a21a83420a73420a8346a21a93420a83420a9346a21aa3420a93420aa346a21ab3420aa3420" + "ab346a21ac3420ab3420ac346a21ad3420ac3420ad346a21ae3420ad3420ae346a21af3420ae3420af346a21b03420" + "af3420b0346a21b13420b03420b1346a21b23420b13420b2346a21b33420b23420b3346a21b43420b33420b4346a21" + "b53420b43420b5346a21b63420b53420b6346a21b73420b63420b7346a21b83420b73420b8346a21b93420b83420b9" + "346a21ba3420b93420ba346a21bb3420ba3420bb346a21bc3420bb3420bc346a21bd3420bc3420bd346a21be3420bd" + "3420be346a21bf3420be3420bf346a21c03420bf3420c0346a21c13420c03420c1346a21c23420c13420c2346a21c3" + "3420c23420c3346a21c43420c33420c4346a21c53420c43420c5346a21c63420c53420c6346a21c73420c63420c734" + "6a21c83420c73420c8346a21c93420c83420c9346a21ca3420c93420ca346a21cb3420ca3420cb346a21cc3420cb34" "20cc346a21cd3420cc3420cd346a21ce3420cd3420ce346a21cf3420ce3420cf346a21d03420cf3420d0346a21d134" - "20d03420d1346a21d234" - "20d13420d2346a21d33420d23420d3346a21d43420d33420d4346a21d53420d43420d5346a21d63420d53420d6346a" - "21d73420d63420d7346a" - "21d83420d73420d8346a21d93420d83420d9346a21da3420d93420da346a21db3420da3420db346a21dc3420db3420" - "dc346a21dd3420dc3420" - "dd346a21de3420dd3420de346a21df3420de3420df346a21e03420df3420e0346a21e13420e03420e1346a21e23420" - "e13420e2346a21e33420" - "e23420e3346a21e43420e33420e4346a21e53420e43420e5346a21e63420e53420e6346a21e73420e63420e7346a21" - "e83420e73420e8346a21" - "e93420e83420e9346a21ea3420e93420ea346a21eb3420ea3420eb346a21ec3420eb3420ec346a21ed3420ec3420ed" - "346a21ee3420ed3420ee" - "346a21ef3420ee3420ef346a21f03420ef3420f0346a21f13420f03420f1346a21f23420f13420f2346a21f33420f2" - "3420f3346a21f43420f3" - "3420f4346a21f53420f43420f5346a21f63420f53420f6346a21f73420f63420f7346a21f83420f73420f8346a21f9" - "3420f83420f9346a21fa" - "3420f93420fa346a21fb3420fa3420fb346a21fc3420fb3420fc346a21fd3420fc3420fd346a21fe3420fd3420fe34" - "6a21ff3420fe3420ff34" - "6a21803520ff342080356a2181352080352081356a2182352081352082356a2183352082352083356a218435208335" - "2084356a218535208435" - "2085356a2186352085352086356a2187352086352087356a2188352087352088356a2189352088352089356a218a35" - "208935208a356a218b35" - "208a35208b356a218c35208b35208c356a218d35208c35208d356a218e35208d35208e356a218f35208e35208f356a" - "219035208f352090356a" - "2191352090352091356a2192352091352092356a2193352092352093356a2194352093352094356a21953520943520" - "95356a21963520953520" - "96356a2197352096352097356a2198352097352098356a2199352098352099356a219a35209935209a356a219b3520" - "9a35209b356a219c3520" - "9b35209c356a219d35209c35209d356a219e35209d35209e356a219f35209e35209f356a21a035209f3520a0356a21" - "a13520a03520a1356a21" - "a23520a13520a2356a21a33520a23520a3356a21a43520a33520a4356a21a53520a43520a5356a21a63520a53520a6" - "356a21a73520a63520a7" - "356a21a83520a73520a8356a21a93520a83520a9356a21aa3520a93520aa356a21ab3520aa3520ab356a21ac3520ab" - "3520ac356a21ad3520ac" - "3520ad356a21ae3520ad3520ae356a21af3520ae3520af356a21b03520af3520b0356a21b13520b03520b1356a21b2" - "3520b13520b2356a21b3" - "3520b23520b3356a21b43520b33520b4356a21b53520b43520b5356a21b63520b53520b6356a21b73520b63520b735" - "6a21b83520b73520b835" - "6a21b93520b83520b9356a21ba3520b93520ba356a21bb3520ba3520bb356a21bc3520bb3520bc356a21bd3520bc35" - "20bd356a21be3520bd35" - "20be356a21bf3520be3520bf356a21c03520bf3520c0356a21c13520c03520c1356a21c23520c13520c2356a21c335" - "20c23520c3356a21c435" - "20c33520c4356a21c53520c43520c5356a21c63520c53520c6356a21c73520c63520c7356a21c83520c73520c8356a" - "21c93520c83520c9356a" - "21ca3520c93520ca356a21cb3520ca3520cb356a21cc3520cb3520cc356a21cd3520cc3520cd356a21ce3520cd3520" - "ce356a21cf3520ce3520" - "cf356a21d03520cf3520d0356a21d13520d03520d1356a21d23520d13520d2356a21d33520d23520d3356a21d43520" - "d33520d4356a21d53520" - "d43520d5356a21d63520d53520d6356a21d73520d63520d7356a21d83520d73520d8356a21d93520d83520d9356a21" - "da3520d93520da356a21" - "db3520da3520db356a21dc3520db3520dc356a21dd3520dc3520dd356a21de3520dd3520de356a21df3520de3520df" - "356a21e03520df3520e0" - "356a21e13520e03520e1356a21e23520e13520e2356a21e33520e23520e3356a21e43520e33520e4356a21e53520e4" - "3520e5356a21e63520e5" - "3520e6356a21e73520e63520e7356a21e83520e73520e8356a21e93520e83520e9356a21ea3520e93520ea356a21eb" - "3520ea3520eb356a21ec" - "3520eb3520ec356a21ed3520ec3520ed356a21ee3520ed3520ee356a21ef3520ee3520ef356a21f03520ef3520f035" - "6a21f13520f03520f135" - "6a21f23520f13520f2356a21f33520f23520f3356a21f43520f33520f4356a21f53520f43520f5356a21f63520f535" - "20f6356a21f73520f635" - "20f7356a21f83520f73520f8356a21f93520f83520f9356a21fa3520f93520fa356a21fb3520fa3520fb356a21fc35" - "20fb3520fc356a21fd35" - "20fc3520fd356a21fe3520fd3520fe356a21ff3520fe3520ff356a21803620ff352080366a2181362080362081366a" - "2182362081362082366a" - "2183362082362083366a2184362083362084366a2185362084362085366a2186362085362086366a21873620863620" - "87366a21883620873620" - "88366a2189362088362089366a218a36208936208a366a218b36208a36208b366a218c36208b36208c366a218d3620" - "8c36208d366a218e3620" - "8d36208e366a218f36208e36208f366a219036208f362090366a2191362090362091366a2192362091362092366a21" - "93362092362093366a21" - "94362093362094366a2195362094362095366a2196362095362096366a2197362096362097366a2198362097362098" - "366a2199362098362099" - "366a219a36209936209a366a219b36209a36209b366a219c36209b36209c366a219d36209c36209d366a219e36209d" - "36209e366a219f36209e" - "36209f366a21a036209f3620a0366a21a13620a03620a1366a21a23620a13620a2366a21a33620a23620a3366a21a4" - "3620a33620a4366a21a5" - "3620a43620a5366a21a63620a53620a6366a21a73620a63620a7366a21a83620a73620a8366a21a93620a83620a936" - "6a21aa3620a93620aa36" - "6a21ab3620aa3620ab366a21ac3620ab3620ac366a21ad3620ac3620ad366a21ae3620ad3620ae366a21af3620ae36" - "20af366a21b03620af36" - "20b0366a21b13620b03620b1366a21b23620b13620b2366a21b33620b23620b3366a21b43620b33620b4366a21b536" - "20b43620b5366a21b636" - "20b53620b6366a21b73620b63620b7366a21b83620b73620b8366a21b93620b83620b9366a21ba3620b93620ba366a" - "21bb3620ba3620bb366a" - "21bc3620bb3620bc366a21bd3620bc3620bd366a21be3620bd3620be366a21bf3620be3620bf366a21c03620bf3620" - "c0366a21c13620c03620" - "c1366a21c23620c13620c2366a21c33620c23620c3366a21c43620c33620c4366a21c53620c43620c5366a21c63620" - "c53620c6366a21c73620" - "c63620c7366a21c83620c73620c8366a21c93620c83620c9366a21ca3620c93620ca366a21cb3620ca3620cb366a21" - "cc3620cb3620cc366a21" - "cd3620cc3620cd366a21ce3620cd3620ce366a21cf3620ce3620cf366a21d03620cf3620d0366a21d13620d03620d1" - "366a21d23620d13620d2" - "366a21d33620d23620d3366a21d43620d33620d4366a21d53620d43620d5366a21d63620d53620d6366a21d73620d6" - "3620d7366a21d83620d7" + "20d03420d1346a21d23420d13420d2346a21d33420d23420d3346a21d43420d33420d4346a21d53420d43420d5346a" + "21d63420d53420d6346a21d73420d63420d7346a21d83420d73420d8346a21d93420d83420d9346a21da3420d93420" + "da346a21db3420da3420db346a21dc3420db3420dc346a21dd3420dc3420dd346a21de3420dd3420de346a21df3420" + "de3420df346a21e03420df3420e0346a21e13420e03420e1346a21e23420e13420e2346a21e33420e23420e3346a21" + "e43420e33420e4346a21e53420e43420e5346a21e63420e53420e6346a21e73420e63420e7346a21e83420e73420e8" + "346a21e93420e83420e9346a21ea3420e93420ea346a21eb3420ea3420eb346a21ec3420eb3420ec346a21ed3420ec" + "3420ed346a21ee3420ed3420ee346a21ef3420ee3420ef346a21f03420ef3420f0346a21f13420f03420f1346a21f2" + "3420f13420f2346a21f33420f23420f3346a21f43420f33420f4346a21f53420f43420f5346a21f63420f53420f634" + "6a21f73420f63420f7346a21f83420f73420f8346a21f93420f83420f9346a21fa3420f93420fa346a21fb3420fa34" + "20fb346a21fc3420fb3420fc346a21fd3420fc3420fd346a21fe3420fd3420fe346a21ff3420fe3420ff346a218035" + "20ff342080356a2181352080352081356a2182352081352082356a2183352082352083356a2184352083352084356a" + "2185352084352085356a2186352085352086356a2187352086352087356a2188352087352088356a21893520883520" + "89356a218a35208935208a356a218b35208a35208b356a218c35208b35208c356a218d35208c35208d356a218e3520" + "8d35208e356a218f35208e35208f356a219035208f352090356a2191352090352091356a2192352091352092356a21" + "93352092352093356a2194352093352094356a2195352094352095356a2196352095352096356a2197352096352097" + "356a2198352097352098356a2199352098352099356a219a35209935209a356a219b35209a35209b356a219c35209b" + "35209c356a219d35209c35209d356a219e35209d35209e356a219f35209e35209f356a21a035209f3520a0356a21a1" + "3520a03520a1356a21a23520a13520a2356a21a33520a23520a3356a21a43520a33520a4356a21a53520a43520a535" + "6a21a63520a53520a6356a21a73520a63520a7356a21a83520a73520a8356a21a93520a83520a9356a21aa3520a935" + "20aa356a21ab3520aa3520ab356a21ac3520ab3520ac356a21ad3520ac3520ad356a21ae3520ad3520ae356a21af35" + "20ae3520af356a21b03520af3520b0356a21b13520b03520b1356a21b23520b13520b2356a21b33520b23520b3356a" + "21b43520b33520b4356a21b53520b43520b5356a21b63520b53520b6356a21b73520b63520b7356a21b83520b73520" + "b8356a21b93520b83520b9356a21ba3520b93520ba356a21bb3520ba3520bb356a21bc3520bb3520bc356a21bd3520" + "bc3520bd356a21be3520bd3520be356a21bf3520be3520bf356a21c03520bf3520c0356a21c13520c03520c1356a21" + "c23520c13520c2356a21c33520c23520c3356a21c43520c33520c4356a21c53520c43520c5356a21c63520c53520c6" + "356a21c73520c63520c7356a21c83520c73520c8356a21c93520c83520c9356a21ca3520c93520ca356a21cb3520ca" + "3520cb356a21cc3520cb3520cc356a21cd3520cc3520cd356a21ce3520cd3520ce356a21cf3520ce3520cf356a21d0" + "3520cf3520d0356a21d13520d03520d1356a21d23520d13520d2356a21d33520d23520d3356a21d43520d33520d435" + "6a21d53520d43520d5356a21d63520d53520d6356a21d73520d63520d7356a21d83520d73520d8356a21d93520d835" + "20d9356a21da3520d93520da356a21db3520da3520db356a21dc3520db3520dc356a21dd3520dc3520dd356a21de35" + "20dd3520de356a21df3520de3520df356a21e03520df3520e0356a21e13520e03520e1356a21e23520e13520e2356a" + "21e33520e23520e3356a21e43520e33520e4356a21e53520e43520e5356a21e63520e53520e6356a21e73520e63520" + "e7356a21e83520e73520e8356a21e93520e83520e9356a21ea3520e93520ea356a21eb3520ea3520eb356a21ec3520" + "eb3520ec356a21ed3520ec3520ed356a21ee3520ed3520ee356a21ef3520ee3520ef356a21f03520ef3520f0356a21" + "f13520f03520f1356a21f23520f13520f2356a21f33520f23520f3356a21f43520f33520f4356a21f53520f43520f5" + "356a21f63520f53520f6356a21f73520f63520f7356a21f83520f73520f8356a21f93520f83520f9356a21fa3520f9" + "3520fa356a21fb3520fa3520fb356a21fc3520fb3520fc356a21fd3520fc3520fd356a21fe3520fd3520fe356a21ff" + "3520fe3520ff356a21803620ff352080366a2181362080362081366a2182362081362082366a218336208236208336" + "6a2184362083362084366a2185362084362085366a2186362085362086366a2187362086362087366a218836208736" + "2088366a2189362088362089366a218a36208936208a366a218b36208a36208b366a218c36208b36208c366a218d36" + "208c36208d366a218e36208d36208e366a218f36208e36208f366a219036208f362090366a2191362090362091366a" + "2192362091362092366a2193362092362093366a2194362093362094366a2195362094362095366a21963620953620" + "96366a2197362096362097366a2198362097362098366a2199362098362099366a219a36209936209a366a219b3620" + "9a36209b366a219c36209b36209c366a219d36209c36209d366a219e36209d36209e366a219f36209e36209f366a21" + "a036209f3620a0366a21a13620a03620a1366a21a23620a13620a2366a21a33620a23620a3366a21a43620a33620a4" + "366a21a53620a43620a5366a21a63620a53620a6366a21a73620a63620a7366a21a83620a73620a8366a21a93620a8" + "3620a9366a21aa3620a93620aa366a21ab3620aa3620ab366a21ac3620ab3620ac366a21ad3620ac3620ad366a21ae" + "3620ad3620ae366a21af3620ae3620af366a21b03620af3620b0366a21b13620b03620b1366a21b23620b13620b236" + "6a21b33620b23620b3366a21b43620b33620b4366a21b53620b43620b5366a21b63620b53620b6366a21b73620b636" + "20b7366a21b83620b73620b8366a21b93620b83620b9366a21ba3620b93620ba366a21bb3620ba3620bb366a21bc36" + "20bb3620bc366a21bd3620bc3620bd366a21be3620bd3620be366a21bf3620be3620bf366a21c03620bf3620c0366a" + "21c13620c03620c1366a21c23620c13620c2366a21c33620c23620c3366a21c43620c33620c4366a21c53620c43620" + "c5366a21c63620c53620c6366a21c73620c63620c7366a21c83620c73620c8366a21c93620c83620c9366a21ca3620" + "c93620ca366a21cb3620ca3620cb366a21cc3620cb3620cc366a21cd3620cc3620cd366a21ce3620cd3620ce366a21" + "cf3620ce3620cf366a21d03620cf3620d0366a21d13620d03620d1366a21d23620d13620d2366a21d33620d23620d3" + "366a21d43620d33620d4366a21d53620d43620d5366a21d63620d53620d6366a21d73620d63620d7366a21d83620d7" "3620d8366a21d93620d83620d9366a21da3620d93620da366a21db3620da3620db366a21dc3620db3620dc366a21dd" - "3620dc3620dd366a21de" - "3620dd3620de366a21df3620de3620df366a21e03620df3620e0366a21e13620e03620e1366a21e23620e13620e236" - "6a21e33620e23620e336" - "6a21e43620e33620e4366a21e53620e43620e5366a21e63620e53620e6366a21e73620e63620e7366a21e83620e736" - "20e8366a21e93620e836" - "20e9366a21ea3620e93620ea366a21eb3620ea3620eb366a21ec3620eb3620ec366a21ed3620ec3620ed366a21ee36" - "20ed3620ee366a21ef36" - "20ee3620ef366a21f03620ef3620f0366a21f13620f03620f1366a21f23620f13620f2366a21f33620f23620f3366a" - "21f43620f33620f4366a" - "21f53620f43620f5366a21f63620f53620f6366a21f73620f63620f7366a21f83620f73620f8366a21f93620f83620" - "f9366a21fa3620f93620" - "fa366a21fb3620fa3620fb366a21fc3620fb3620fc366a21fd3620fc3620fd366a21fe3620fd3620fe366a21ff3620" - "fe3620ff366a21803720" - "ff362080376a2181372080372081376a2182372081372082376a2183372082372083376a2184372083372084376a21" - "85372084372085376a21" - "86372085372086376a2187372086372087376a2188372087372088376a2189372088372089376a218a37208937208a" - "376a218b37208a37208b" - "376a218c37208b37208c376a218d37208c37208d376a218e37208d37208e376a218f37208e37208f376a219037208f" - "372090376a2191372090" - "372091376a2192372091372092376a2193372092372093376a2194372093372094376a2195372094372095376a2196" - "372095372096376a2197" - "372096372097376a2198372097372098376a2199372098372099376a219a37209937209a376a219b37209a37209b37" - "6a219c37209b37209c37" - "6a219d37209c37209d376a219e37209d37209e376a219f37209e37209f376a21a037209f3720a0376a21a13720a037" - "20a1376a21a23720a137" - "20a2376a21a33720a23720a3376a21a43720a33720a4376a21a53720a43720a5376a21a63720a53720a6376a21a737" - "20a63720a7376a21a837" - "20a73720a8376a21a93720a83720a9376a21aa3720a93720aa376a21ab3720aa3720ab376a21ac3720ab3720ac376a" - "21ad3720ac3720ad376a" - "21ae3720ad3720ae376a21af3720ae3720af376a21b03720af3720b0376a21b13720b03720b1376a21b23720b13720" - "b2376a21b33720b23720" - "b3376a21b43720b33720b4376a21b53720b43720b5376a21b63720b53720b6376a21b73720b63720b7376a21b83720" - "b73720b8376a21b93720" - "b83720b9376a21ba3720b93720ba376a21bb3720ba3720bb376a21bc3720bb3720bc376a21bd3720bc3720bd376a21" - "be3720bd3720be376a21" - "bf3720be3720bf376a21c03720bf3720c0376a21c13720c03720c1376a21c23720c13720c2376a21c33720c23720c3" - "376a21c43720c33720c4" - "376a21c53720c43720c5376a21c63720c53720c6376a21c73720c63720c7376a21c83720c73720c8376a21c93720c8" - "3720c9376a21ca3720c9" - "3720ca376a21cb3720ca3720cb376a21cc3720cb3720cc376a21cd3720cc3720cd376a21ce3720cd3720ce376a21cf" - "3720ce3720cf376a21d0" - "3720cf3720d0376a21d13720d03720d1376a21d23720d13720d2376a21d33720d23720d3376a21d43720d33720d437" - "6a21d53720d43720d537" - "6a21d63720d53720d6376a21d73720d63720d7376a21d83720d73720d8376a21d93720d83720d9376a21da3720d937" - "20da376a21db3720da37" - "20db376a21dc3720db3720dc376a21dd3720dc3720dd376a21de3720dd3720de376a21df3720de3720df376a21e037" - "20df3720e0376a21e137" - "20e03720e1376a21e23720e13720e2376a21e33720e23720e3376a21e43720e33720e4376a21e53720e43720e5376a" - "21e63720e53720e6376a" - "21e73720e63720e7376a21e83720e73720e8376a21e93720e83720e9376a21ea3720e93720ea376a21eb3720ea3720" - "eb376a21ec3720eb3720" - "ec376a21ed3720ec3720ed376a21ee3720ed3720ee376a21ef3720ee3720ef376a21f03720ef3720f0376a21f13720" - "f03720f1376a21f23720" - "f13720f2376a21f33720f23720f3376a21f43720f33720f4376a21f53720f43720f5376a21f63720f53720f6376a21" - "f73720f63720f7376a21" - "f83720f73720f8376a21f93720f83720f9376a21fa3720f93720fa376a21fb3720fa3720fb376a21fc3720fb3720fc" - "376a21fd3720fc3720fd" - "376a21fe3720fd3720fe376a21ff3720fe3720ff376a21803820ff372080386a2181382080382081386a2182382081" - "382082386a2183382082" - "382083386a2184382083382084386a2185382084382085386a2186382085382086386a2187382086382087386a2188" - "382087382088386a2189" - "382088382089386a218a38208938208a386a218b38208a38208b386a218c38208b38208c386a218d38208c38208d38" - "6a218e38208d38208e38" - "6a218f38208e38208f386a219038208f382090386a2191382090382091386a2192382091382092386a219338209238" - "2093386a219438209338" - "2094386a2195382094382095386a2196382095382096386a2197382096382097386a2198382097382098386a219938" - "2098382099386a219a38" - "209938209a386a219b38209a38209b386a219c38209b38209c386a219d38209c38209d386a219e38209d38209e386a" - "219f38209e38209f386a" - "21a038209f3820a0386a21a13820a03820a1386a21a23820a13820a2386a21a33820a23820a3386a21a43820a33820" - "a4386a21a53820a43820" - "a5386a21a63820a53820a6386a21a73820a63820a7386a21a83820a73820a8386a21a93820a83820a9386a21aa3820" - "a93820aa386a21ab3820" - "aa3820ab386a21ac3820ab3820ac386a21ad3820ac3820ad386a21ae3820ad3820ae386a21af3820ae3820af386a21" - "b03820af3820b0386a21" - "b13820b03820b1386a21b23820b13820b2386a21b33820b23820b3386a21b43820b33820b4386a21b53820b43820b5" - "386a21b63820b53820b6" - "386a21b73820b63820b7386a21b83820b73820b8386a21b93820b83820b9386a21ba3820b93820ba386a21bb3820ba" - "3820bb386a21bc3820bb" - "3820bc386a21bd3820bc3820bd386a21be3820bd3820be386a21bf3820be3820bf386a21c03820bf3820c0386a21c1" - "3820c03820c1386a21c2" - "3820c13820c2386a21c33820c23820c3386a21c43820c33820c4386a21c53820c43820c5386a21c63820c53820c638" - "6a21c73820c63820c738" - "6a21c83820c73820c8386a21c93820c83820c9386a21ca3820c93820ca386a21cb3820ca3820cb386a21cc3820cb38" - "20cc386a21cd3820cc38" - "20cd386a21ce3820cd3820ce386a21cf3820ce3820cf386a21d03820cf3820d0386a21d13820d03820d1386a21d238" - "20d13820d2386a21d338" - "20d23820d3386a21d43820d33820d4386a21d53820d43820d5386a21d63820d53820d6386a21d73820d63820d7386a" - "21d83820d73820d8386a" - "21d93820d83820d9386a21da3820d93820da386a21db3820da3820db386a21dc3820db3820dc386a21dd3820dc3820" - "dd386a21de3820dd3820" - "de386a21df3820de3820df386a21e03820df3820e0386a21e13820e03820e1386a21e23820e13820e2386a21e33820" - "e23820e3386a21e43820" + "3620dc3620dd366a21de3620dd3620de366a21df3620de3620df366a21e03620df3620e0366a21e13620e03620e136" + "6a21e23620e13620e2366a21e33620e23620e3366a21e43620e33620e4366a21e53620e43620e5366a21e63620e536" + "20e6366a21e73620e63620e7366a21e83620e73620e8366a21e93620e83620e9366a21ea3620e93620ea366a21eb36" + "20ea3620eb366a21ec3620eb3620ec366a21ed3620ec3620ed366a21ee3620ed3620ee366a21ef3620ee3620ef366a" + "21f03620ef3620f0366a21f13620f03620f1366a21f23620f13620f2366a21f33620f23620f3366a21f43620f33620" + "f4366a21f53620f43620f5366a21f63620f53620f6366a21f73620f63620f7366a21f83620f73620f8366a21f93620" + "f83620f9366a21fa3620f93620fa366a21fb3620fa3620fb366a21fc3620fb3620fc366a21fd3620fc3620fd366a21" + "fe3620fd3620fe366a21ff3620fe3620ff366a21803720ff362080376a2181372080372081376a2182372081372082" + "376a2183372082372083376a2184372083372084376a2185372084372085376a2186372085372086376a2187372086" + "372087376a2188372087372088376a2189372088372089376a218a37208937208a376a218b37208a37208b376a218c" + "37208b37208c376a218d37208c37208d376a218e37208d37208e376a218f37208e37208f376a219037208f37209037" + "6a2191372090372091376a2192372091372092376a2193372092372093376a2194372093372094376a219537209437" + "2095376a2196372095372096376a2197372096372097376a2198372097372098376a2199372098372099376a219a37" + "209937209a376a219b37209a37209b376a219c37209b37209c376a219d37209c37209d376a219e37209d37209e376a" + "219f37209e37209f376a21a037209f3720a0376a21a13720a03720a1376a21a23720a13720a2376a21a33720a23720" + "a3376a21a43720a33720a4376a21a53720a43720a5376a21a63720a53720a6376a21a73720a63720a7376a21a83720" + "a73720a8376a21a93720a83720a9376a21aa3720a93720aa376a21ab3720aa3720ab376a21ac3720ab3720ac376a21" + "ad3720ac3720ad376a21ae3720ad3720ae376a21af3720ae3720af376a21b03720af3720b0376a21b13720b03720b1" + "376a21b23720b13720b2376a21b33720b23720b3376a21b43720b33720b4376a21b53720b43720b5376a21b63720b5" + "3720b6376a21b73720b63720b7376a21b83720b73720b8376a21b93720b83720b9376a21ba3720b93720ba376a21bb" + "3720ba3720bb376a21bc3720bb3720bc376a21bd3720bc3720bd376a21be3720bd3720be376a21bf3720be3720bf37" + "6a21c03720bf3720c0376a21c13720c03720c1376a21c23720c13720c2376a21c33720c23720c3376a21c43720c337" + "20c4376a21c53720c43720c5376a21c63720c53720c6376a21c73720c63720c7376a21c83720c73720c8376a21c937" + "20c83720c9376a21ca3720c93720ca376a21cb3720ca3720cb376a21cc3720cb3720cc376a21cd3720cc3720cd376a" + "21ce3720cd3720ce376a21cf3720ce3720cf376a21d03720cf3720d0376a21d13720d03720d1376a21d23720d13720" + "d2376a21d33720d23720d3376a21d43720d33720d4376a21d53720d43720d5376a21d63720d53720d6376a21d73720" + "d63720d7376a21d83720d73720d8376a21d93720d83720d9376a21da3720d93720da376a21db3720da3720db376a21" + "dc3720db3720dc376a21dd3720dc3720dd376a21de3720dd3720de376a21df3720de3720df376a21e03720df3720e0" + "376a21e13720e03720e1376a21e23720e13720e2376a21e33720e23720e3376a21e43720e33720e4376a21e53720e4" + "3720e5376a21e63720e53720e6376a21e73720e63720e7376a21e83720e73720e8376a21e93720e83720e9376a21ea" + "3720e93720ea376a21eb3720ea3720eb376a21ec3720eb3720ec376a21ed3720ec3720ed376a21ee3720ed3720ee37" + "6a21ef3720ee3720ef376a21f03720ef3720f0376a21f13720f03720f1376a21f23720f13720f2376a21f33720f237" + "20f3376a21f43720f33720f4376a21f53720f43720f5376a21f63720f53720f6376a21f73720f63720f7376a21f837" + "20f73720f8376a21f93720f83720f9376a21fa3720f93720fa376a21fb3720fa3720fb376a21fc3720fb3720fc376a" + "21fd3720fc3720fd376a21fe3720fd3720fe376a21ff3720fe3720ff376a21803820ff372080386a21813820803820" + "81386a2182382081382082386a2183382082382083386a2184382083382084386a2185382084382085386a21863820" + "85382086386a2187382086382087386a2188382087382088386a2189382088382089386a218a38208938208a386a21" + "8b38208a38208b386a218c38208b38208c386a218d38208c38208d386a218e38208d38208e386a218f38208e38208f" + "386a219038208f382090386a2191382090382091386a2192382091382092386a2193382092382093386a2194382093" + "382094386a2195382094382095386a2196382095382096386a2197382096382097386a2198382097382098386a2199" + "382098382099386a219a38209938209a386a219b38209a38209b386a219c38209b38209c386a219d38209c38209d38" + "6a219e38209d38209e386a219f38209e38209f386a21a038209f3820a0386a21a13820a03820a1386a21a23820a138" + "20a2386a21a33820a23820a3386a21a43820a33820a4386a21a53820a43820a5386a21a63820a53820a6386a21a738" + "20a63820a7386a21a83820a73820a8386a21a93820a83820a9386a21aa3820a93820aa386a21ab3820aa3820ab386a" + "21ac3820ab3820ac386a21ad3820ac3820ad386a21ae3820ad3820ae386a21af3820ae3820af386a21b03820af3820" + "b0386a21b13820b03820b1386a21b23820b13820b2386a21b33820b23820b3386a21b43820b33820b4386a21b53820" + "b43820b5386a21b63820b53820b6386a21b73820b63820b7386a21b83820b73820b8386a21b93820b83820b9386a21" + "ba3820b93820ba386a21bb3820ba3820bb386a21bc3820bb3820bc386a21bd3820bc3820bd386a21be3820bd3820be" + "386a21bf3820be3820bf386a21c03820bf3820c0386a21c13820c03820c1386a21c23820c13820c2386a21c33820c2" + "3820c3386a21c43820c33820c4386a21c53820c43820c5386a21c63820c53820c6386a21c73820c63820c7386a21c8" + "3820c73820c8386a21c93820c83820c9386a21ca3820c93820ca386a21cb3820ca3820cb386a21cc3820cb3820cc38" + "6a21cd3820cc3820cd386a21ce3820cd3820ce386a21cf3820ce3820cf386a21d03820cf3820d0386a21d13820d038" + "20d1386a21d23820d13820d2386a21d33820d23820d3386a21d43820d33820d4386a21d53820d43820d5386a21d638" + "20d53820d6386a21d73820d63820d7386a21d83820d73820d8386a21d93820d83820d9386a21da3820d93820da386a" + "21db3820da3820db386a21dc3820db3820dc386a21dd3820dc3820dd386a21de3820dd3820de386a21df3820de3820" + "df386a21e03820df3820e0386a21e13820e03820e1386a21e23820e13820e2386a21e33820e23820e3386a21e43820" "e33820e4386a21e53820e43820e5386a21e63820e53820e6386a21e73820e63820e7386a21e83820e73820e8386a21" - "e93820e83820e9386a21" - "ea3820e93820ea386a21eb3820ea3820eb386a21ec3820eb3820ec386a21ed3820ec3820ed386a21ee3820ed3820ee" - "386a21ef3820ee3820ef" - "386a21f03820ef3820f0386a21f13820f03820f1386a21f23820f13820f2386a21f33820f23820f3386a21f43820f3" - "3820f4386a21f53820f4" - "3820f5386a21f63820f53820f6386a21f73820f63820f7386a21f83820f73820f8386a21f93820f83820f9386a21fa" - "3820f93820fa386a21fb" - "3820fa3820fb386a21fc3820fb3820fc386a21fd3820fc3820fd386a21fe3820fd3820fe386a21ff3820fe3820ff38" - "6a21803920ff38208039" - "6a2181392080392081396a2182392081392082396a2183392082392083396a2184392083392084396a218539208439" - "2085396a218639208539" - "2086396a2187392086392087396a2188392087392088396a2189392088392089396a218a39208939208a396a218b39" - "208a39208b396a218c39" - "208b39208c396a218d39208c39208d396a218e39208d39208e396a218f39208e39208f396a219039208f392090396a" - "2191392090392091396a" - "2192392091392092396a2193392092392093396a2194392093392094396a2195392094392095396a21963920953920" - "96396a21973920963920" - "97396a2198392097392098396a2199392098392099396a219a39209939209a396a219b39209a39209b396a219c3920" - "9b39209c396a219d3920" - "9c39209d396a219e39209d39209e396a219f39209e39209f396a21a039209f3920a0396a21a13920a03920a1396a21" - "a23920a13920a2396a21" - "a33920a23920a3396a21a43920a33920a4396a21a53920a43920a5396a21a63920a53920a6396a21a73920a63920a7" - "396a21a83920a73920a8" - "396a21a93920a83920a9396a21aa3920a93920aa396a21ab3920aa3920ab396a21ac3920ab3920ac396a21ad3920ac" - "3920ad396a21ae3920ad" - "3920ae396a21af3920ae3920af396a21b03920af3920b0396a21b13920b03920b1396a21b23920b13920b2396a21b3" - "3920b23920b3396a21b4" - "3920b33920b4396a21b53920b43920b5396a21b63920b53920b6396a21b73920b63920b7396a21b83920b73920b839" - "6a21b93920b83920b939" - "6a21ba3920b93920ba396a21bb3920ba3920bb396a21bc3920bb3920bc396a21bd3920bc3920bd396a21be3920bd39" - "20be396a21bf3920be39" - "20bf396a21c03920bf3920c0396a21c13920c03920c1396a21c23920c13920c2396a21c33920c23920c3396a21c439" - "20c33920c4396a21c539" - "20c43920c5396a21c63920c53920c6396a21c73920c63920c7396a21c83920c73920c8396a21c93920c83920c9396a" - "21ca3920c93920ca396a" - "21cb3920ca3920cb396a21cc3920cb3920cc396a21cd3920cc3920cd396a21ce3920cd3920ce396a21cf3920ce3920" - "cf396a21d03920cf3920" - "d0396a21d13920d03920d1396a21d23920d13920d2396a21d33920d23920d3396a21d43920d33920d4396a21d53920" - "d43920d5396a21d63920" - "d53920d6396a21d73920d63920d7396a21d83920d73920d8396a21d93920d83920d9396a21da3920d93920da396a21" - "db3920da3920db396a21" - "dc3920db3920dc396a21dd3920dc3920dd396a21de3920dd3920de396a21df3920de3920df396a21e03920df3920e0" - "396a21e13920e03920e1" - "396a21e23920e13920e2396a21e33920e23920e3396a21e43920e33920e4396a21e53920e43920e5396a21e63920e5" - "3920e6396a21e73920e6" - "3920e7396a21e83920e73920e8396a21e93920e83920e9396a21ea3920e93920ea396a21eb3920ea3920eb396a21ec" - "3920eb3920ec396a21ed" - "3920ec3920ed396a21ee3920ed3920ee396a21ef3920ee3920ef396a21f03920ef3920f0396a21f13920f03920f139" - "6a21f23920f13920f239" - "6a21f33920f23920f3396a21f43920f33920f4396a21f53920f43920f5396a21f63920f53920f6396a21f73920f639" - "20f7396a21f83920f739" - "20f8396a21f93920f83920f9396a21fa3920f93920fa396a21fb3920fa3920fb396a21fc3920fb3920fc396a21fd39" - "20fc3920fd396a21fe39" - "20fd3920fe396a21ff3920fe3920ff396a21803a20ff3920803a6a21813a20803a20813a6a21823a20813a20823a6a" - "21833a20823a20833a6a" - "21843a20833a20843a6a21853a20843a20853a6a21863a20853a20863a6a21873a20863a20873a6a21883a20873a20" - "883a6a21893a20883a20" - "893a6a218a3a20893a208a3a6a218b3a208a3a208b3a6a218c3a208b3a208c3a6a218d3a208c3a208d3a6a218e3a20" - "8d3a208e3a6a218f3a20" - "8e3a208f3a6a21903a208f3a20903a6a21913a20903a20913a6a21923a20913a20923a6a21933a20923a20933a6a21" - "943a20933a20943a6a21" - "953a20943a20953a6a21963a20953a20963a6a21973a20963a20973a6a21983a20973a20983a6a21993a20983a2099" - "3a6a219a3a20993a209a" - "3a6a219b3a209a3a209b3a6a219c3a209b3a209c3a6a219d3a209c3a209d3a6a219e3a209d3a209e3a6a219f3a209e" - "3a209f3a6a21a03a209f" - "3a20a03a6a21a13a20a03a20a13a6a21a23a20a13a20a23a6a21a33a20a23a20a33a6a21a43a20a33a20a43a6a21a5" - "3a20a43a20a53a6a21a6" - "3a20a53a20a63a6a21a73a20a63a20a73a6a21a83a20a73a20a83a6a21a93a20a83a20a93a6a21aa3a20a93a20aa3a" - "6a21ab3a20aa3a20ab3a" - "6a21ac3a20ab3a20ac3a6a21ad3a20ac3a20ad3a6a21ae3a20ad3a20ae3a6a21af3a20ae3a20af3a6a21b03a20af3a" - "20b03a6a21b13a20b03a" - "20b13a6a21b23a20b13a20b23a6a21b33a20b23a20b33a6a21b43a20b33a20b43a6a21b53a20b43a20b53a6a21b63a" - "20b53a20b63a6a21b73a" - "20b63a20b73a6a21b83a20b73a20b83a6a21b93a20b83a20b93a6a21ba3a20b93a20ba3a6a21bb3a20ba3a20bb3a6a" - "21bc3a20bb3a20bc3a6a" - "21bd3a20bc3a20bd3a6a21be3a20bd3a20be3a6a21bf3a20be3a20bf3a6a21c03a20bf3a20c03a6a21c13a20c03a20" - "c13a6a21c23a20c13a20" - "c23a6a21c33a20c23a20c33a6a21c43a20c33a20c43a6a21c53a20c43a20c53a6a21c63a20c53a20c63a6a21c73a20" - "c63a20c73a6a21c83a20" - "c73a20c83a6a21c93a20c83a20c93a6a21ca3a20c93a20ca3a6a21cb3a20ca3a20cb3a6a21cc3a20cb3a20cc3a6a21" - "cd3a20cc3a20cd3a6a21" - "ce3a20cd3a20ce3a6a21cf3a20ce3a20cf3a6a21d03a20cf3a20d03a6a21d13a20d03a20d13a6a21d23a20d13a20d2" - "3a6a21d33a20d23a20d3" - "3a6a21d43a20d33a20d43a6a21d53a20d43a20d53a6a21d63a20d53a20d63a6a21d73a20d63a20d73a6a21d83a20d7" - "3a20d83a6a21d93a20d8" - "3a20d93a6a21da3a20d93a20da3a6a21db3a20da3a20db3a6a21dc3a20db3a20dc3a6a21dd3a20dc3a20dd3a6a21de" - "3a20dd3a20de3a6a21df" - "3a20de3a20df3a6a21e03a20df3a20e03a6a21e13a20e03a20e13a6a21e23a20e13a20e23a6a21e33a20e23a20e33a" - "6a21e43a20e33a20e43a" - "6a21e53a20e43a20e53a6a21e63a20e53a20e63a6a21e73a20e63a20e73a6a21e83a20e73a20e83a6a21e93a20e83a" - "20e93a6a21ea3a20e93a" - "20ea3a6a21eb3a20ea3a20eb3a6a21ec3a20eb3a20ec3a6a21ed3a20ec3a20ed3a6a21ee3a20ed3a20ee3a6a21ef3a" - "20ee3a20ef3a6a21f03a" + "e93820e83820e9386a21ea3820e93820ea386a21eb3820ea3820eb386a21ec3820eb3820ec386a21ed3820ec3820ed" + "386a21ee3820ed3820ee386a21ef3820ee3820ef386a21f03820ef3820f0386a21f13820f03820f1386a21f23820f1" + "3820f2386a21f33820f23820f3386a21f43820f33820f4386a21f53820f43820f5386a21f63820f53820f6386a21f7" + "3820f63820f7386a21f83820f73820f8386a21f93820f83820f9386a21fa3820f93820fa386a21fb3820fa3820fb38" + "6a21fc3820fb3820fc386a21fd3820fc3820fd386a21fe3820fd3820fe386a21ff3820fe3820ff386a21803920ff38" + "2080396a2181392080392081396a2182392081392082396a2183392082392083396a2184392083392084396a218539" + "2084392085396a2186392085392086396a2187392086392087396a2188392087392088396a2189392088392089396a" + "218a39208939208a396a218b39208a39208b396a218c39208b39208c396a218d39208c39208d396a218e39208d3920" + "8e396a218f39208e39208f396a219039208f392090396a2191392090392091396a2192392091392092396a21933920" + "92392093396a2194392093392094396a2195392094392095396a2196392095392096396a2197392096392097396a21" + "98392097392098396a2199392098392099396a219a39209939209a396a219b39209a39209b396a219c39209b39209c" + "396a219d39209c39209d396a219e39209d39209e396a219f39209e39209f396a21a039209f3920a0396a21a13920a0" + "3920a1396a21a23920a13920a2396a21a33920a23920a3396a21a43920a33920a4396a21a53920a43920a5396a21a6" + "3920a53920a6396a21a73920a63920a7396a21a83920a73920a8396a21a93920a83920a9396a21aa3920a93920aa39" + "6a21ab3920aa3920ab396a21ac3920ab3920ac396a21ad3920ac3920ad396a21ae3920ad3920ae396a21af3920ae39" + "20af396a21b03920af3920b0396a21b13920b03920b1396a21b23920b13920b2396a21b33920b23920b3396a21b439" + "20b33920b4396a21b53920b43920b5396a21b63920b53920b6396a21b73920b63920b7396a21b83920b73920b8396a" + "21b93920b83920b9396a21ba3920b93920ba396a21bb3920ba3920bb396a21bc3920bb3920bc396a21bd3920bc3920" + "bd396a21be3920bd3920be396a21bf3920be3920bf396a21c03920bf3920c0396a21c13920c03920c1396a21c23920" + "c13920c2396a21c33920c23920c3396a21c43920c33920c4396a21c53920c43920c5396a21c63920c53920c6396a21" + "c73920c63920c7396a21c83920c73920c8396a21c93920c83920c9396a21ca3920c93920ca396a21cb3920ca3920cb" + "396a21cc3920cb3920cc396a21cd3920cc3920cd396a21ce3920cd3920ce396a21cf3920ce3920cf396a21d03920cf" + "3920d0396a21d13920d03920d1396a21d23920d13920d2396a21d33920d23920d3396a21d43920d33920d4396a21d5" + "3920d43920d5396a21d63920d53920d6396a21d73920d63920d7396a21d83920d73920d8396a21d93920d83920d939" + "6a21da3920d93920da396a21db3920da3920db396a21dc3920db3920dc396a21dd3920dc3920dd396a21de3920dd39" + "20de396a21df3920de3920df396a21e03920df3920e0396a21e13920e03920e1396a21e23920e13920e2396a21e339" + "20e23920e3396a21e43920e33920e4396a21e53920e43920e5396a21e63920e53920e6396a21e73920e63920e7396a" + "21e83920e73920e8396a21e93920e83920e9396a21ea3920e93920ea396a21eb3920ea3920eb396a21ec3920eb3920" + "ec396a21ed3920ec3920ed396a21ee3920ed3920ee396a21ef3920ee3920ef396a21f03920ef3920f0396a21f13920" + "f03920f1396a21f23920f13920f2396a21f33920f23920f3396a21f43920f33920f4396a21f53920f43920f5396a21" + "f63920f53920f6396a21f73920f63920f7396a21f83920f73920f8396a21f93920f83920f9396a21fa3920f93920fa" + "396a21fb3920fa3920fb396a21fc3920fb3920fc396a21fd3920fc3920fd396a21fe3920fd3920fe396a21ff3920fe" + "3920ff396a21803a20ff3920803a6a21813a20803a20813a6a21823a20813a20823a6a21833a20823a20833a6a2184" + "3a20833a20843a6a21853a20843a20853a6a21863a20853a20863a6a21873a20863a20873a6a21883a20873a20883a" + "6a21893a20883a20893a6a218a3a20893a208a3a6a218b3a208a3a208b3a6a218c3a208b3a208c3a6a218d3a208c3a" + "208d3a6a218e3a208d3a208e3a6a218f3a208e3a208f3a6a21903a208f3a20903a6a21913a20903a20913a6a21923a" + "20913a20923a6a21933a20923a20933a6a21943a20933a20943a6a21953a20943a20953a6a21963a20953a20963a6a" + "21973a20963a20973a6a21983a20973a20983a6a21993a20983a20993a6a219a3a20993a209a3a6a219b3a209a3a20" + "9b3a6a219c3a209b3a209c3a6a219d3a209c3a209d3a6a219e3a209d3a209e3a6a219f3a209e3a209f3a6a21a03a20" + "9f3a20a03a6a21a13a20a03a20a13a6a21a23a20a13a20a23a6a21a33a20a23a20a33a6a21a43a20a33a20a43a6a21" + "a53a20a43a20a53a6a21a63a20a53a20a63a6a21a73a20a63a20a73a6a21a83a20a73a20a83a6a21a93a20a83a20a9" + "3a6a21aa3a20a93a20aa3a6a21ab3a20aa3a20ab3a6a21ac3a20ab3a20ac3a6a21ad3a20ac3a20ad3a6a21ae3a20ad" + "3a20ae3a6a21af3a20ae3a20af3a6a21b03a20af3a20b03a6a21b13a20b03a20b13a6a21b23a20b13a20b23a6a21b3" + "3a20b23a20b33a6a21b43a20b33a20b43a6a21b53a20b43a20b53a6a21b63a20b53a20b63a6a21b73a20b63a20b73a" + "6a21b83a20b73a20b83a6a21b93a20b83a20b93a6a21ba3a20b93a20ba3a6a21bb3a20ba3a20bb3a6a21bc3a20bb3a" + "20bc3a6a21bd3a20bc3a20bd3a6a21be3a20bd3a20be3a6a21bf3a20be3a20bf3a6a21c03a20bf3a20c03a6a21c13a" + "20c03a20c13a6a21c23a20c13a20c23a6a21c33a20c23a20c33a6a21c43a20c33a20c43a6a21c53a20c43a20c53a6a" + "21c63a20c53a20c63a6a21c73a20c63a20c73a6a21c83a20c73a20c83a6a21c93a20c83a20c93a6a21ca3a20c93a20" + "ca3a6a21cb3a20ca3a20cb3a6a21cc3a20cb3a20cc3a6a21cd3a20cc3a20cd3a6a21ce3a20cd3a20ce3a6a21cf3a20" + "ce3a20cf3a6a21d03a20cf3a20d03a6a21d13a20d03a20d13a6a21d23a20d13a20d23a6a21d33a20d23a20d33a6a21" + "d43a20d33a20d43a6a21d53a20d43a20d53a6a21d63a20d53a20d63a6a21d73a20d63a20d73a6a21d83a20d73a20d8" + "3a6a21d93a20d83a20d93a6a21da3a20d93a20da3a6a21db3a20da3a20db3a6a21dc3a20db3a20dc3a6a21dd3a20dc" + "3a20dd3a6a21de3a20dd3a20de3a6a21df3a20de3a20df3a6a21e03a20df3a20e03a6a21e13a20e03a20e13a6a21e2" + "3a20e13a20e23a6a21e33a20e23a20e33a6a21e43a20e33a20e43a6a21e53a20e43a20e53a6a21e63a20e53a20e63a" + "6a21e73a20e63a20e73a6a21e83a20e73a20e83a6a21e93a20e83a20e93a6a21ea3a20e93a20ea3a6a21eb3a20ea3a" + "20eb3a6a21ec3a20eb3a20ec3a6a21ed3a20ec3a20ed3a6a21ee3a20ed3a20ee3a6a21ef3a20ee3a20ef3a6a21f03a" "20ef3a20f03a6a21f13a20f03a20f13a6a21f23a20f13a20f23a6a21f33a20f23a20f33a6a21f43a20f33a20f43a6a" - "21f53a20f43a20f53a6a" - "21f63a20f53a20f63a6a21f73a20f63a20f73a6a21f83a20f73a20f83a6a21f93a20f83a20f93a6a21fa3a20f93a20" - "fa3a6a21fb3a20fa3a20" - "fb3a6a21fc3a20fb3a20fc3a6a21fd3a20fc3a20fd3a6a21fe3a20fd3a20fe3a6a21ff3a20fe3a20ff3a6a21803b20" - "ff3a20803b6a21813b20" - "803b20813b6a21823b20813b20823b6a21833b20823b20833b6a21843b20833b20843b6a21853b20843b20853b6a21" - "863b20853b20863b6a21" - "873b20863b20873b6a21883b20873b20883b6a21893b20883b20893b6a218a3b20893b208a3b6a218b3b208a3b208b" - "3b6a218c3b208b3b208c" - "3b6a218d3b208c3b208d3b6a218e3b208d3b208e3b6a218f3b208e3b208f3b6a21903b208f3b20903b6a21913b2090" - "3b20913b6a21923b2091" - "3b20923b6a21933b20923b20933b6a21943b20933b20943b6a21953b20943b20953b6a21963b20953b20963b6a2197" - "3b20963b20973b6a2198" - "3b20973b20983b6a21993b20983b20993b6a219a3b20993b209a3b6a219b3b209a3b209b3b6a219c3b209b3b209c3b" - "6a219d3b209c3b209d3b" - "6a219e3b209d3b209e3b6a219f3b209e3b209f3b6a21a03b209f3b20a03b6a21a13b20a03b20a13b6a21a23b20a13b" - "20a23b6a21a33b20a23b" - "20a33b6a21a43b20a33b20a43b6a21a53b20a43b20a53b6a21a63b20a53b20a63b6a21a73b20a63b20a73b6a21a83b" - "20a73b20a83b6a21a93b" - "20a83b20a93b6a21aa3b20a93b20aa3b6a21ab3b20aa3b20ab3b6a21ac3b20ab3b20ac3b6a21ad3b20ac3b20ad3b6a" - "21ae3b20ad3b20ae3b6a" - "21af3b20ae3b20af3b6a21b03b20af3b20b03b6a21b13b20b03b20b13b6a21b23b20b13b20b23b6a21b33b20b23b20" - "b33b6a21b43b20b33b20" - "b43b6a21b53b20b43b20b53b6a21b63b20b53b20b63b6a21b73b20b63b20b73b6a21b83b20b73b20b83b6a21b93b20" - "b83b20b93b6a21ba3b20" - "b93b20ba3b6a21bb3b20ba3b20bb3b6a21bc3b20bb3b20bc3b6a21bd3b20bc3b20bd3b6a21be3b20bd3b20be3b6a21" - "bf3b20be3b20bf3b6a21" - "c03b20bf3b20c03b6a21c13b20c03b20c13b6a21c23b20c13b20c23b6a21c33b20c23b20c33b6a21c43b20c33b20c4" - "3b6a21c53b20c43b20c5" - "3b6a21c63b20c53b20c63b6a21c73b20c63b20c73b6a21c83b20c73b20c83b6a21c93b20c83b20c93b6a21ca3b20c9" - "3b20ca3b6a21cb3b20ca" - "3b20cb3b6a21cc3b20cb3b20cc3b6a21cd3b20cc3b20cd3b6a21ce3b20cd3b20ce3b6a21cf3b20ce3b20cf3b6a21d0" - "3b20cf3b20d03b6a21d1" - "3b20d03b20d13b6a21d23b20d13b20d23b6a21d33b20d23b20d33b6a21d43b20d33b20d43b6a21d53b20d43b20d53b" - "6a21d63b20d53b20d63b" - "6a21d73b20d63b20d73b6a21d83b20d73b20d83b6a21d93b20d83b20d93b6a21da3b20d93b20da3b6a21db3b20da3b" - "20db3b6a21dc3b20db3b" - "20dc3b6a21dd3b20dc3b20dd3b6a21de3b20dd3b20de3b6a21df3b20de3b20df3b6a21e03b20df3b20e03b6a21e13b" - "20e03b20e13b6a21e23b" - "20e13b20e23b6a21e33b20e23b20e33b6a21e43b20e33b20e43b6a21e53b20e43b20e53b6a21e63b20e53b20e63b6a" - "21e73b20e63b20e73b6a" - "21e83b20e73b20e83b6a21e93b20e83b20e93b6a21ea3b20e93b20ea3b6a21eb3b20ea3b20eb3b6a21ec3b20eb3b20" - "ec3b6a21ed3b20ec3b20" - "ed3b6a21ee3b20ed3b20ee3b6a21ef3b20ee3b20ef3b6a21f03b20ef3b20f03b6a21f13b20f03b20f13b6a21f23b20" - "f13b20f23b6a21f33b20" - "f23b20f33b6a21f43b20f33b20f43b6a21f53b20f43b20f53b6a21f63b20f53b20f63b6a21f73b20f63b20f73b6a21" - "f83b20f73b20f83b6a21" - "f93b20f83b20f93b6a21fa3b20f93b20fa3b6a21fb3b20fa3b20fb3b6a21fc3b20fb3b20fc3b6a21fd3b20fc3b20fd" - "3b6a21fe3b20fd3b20fe" - "3b6a21ff3b20fe3b20ff3b6a21803c20ff3b20803c6a21813c20803c20813c6a21823c20813c20823c6a21833c2082" - "3c20833c6a21843c2083" - "3c20843c6a21853c20843c20853c6a21863c20853c20863c6a21873c20863c20873c6a21883c20873c20883c6a2189" - "3c20883c20893c6a218a" - "3c20893c208a3c6a218b3c208a3c208b3c6a218c3c208b3c208c3c6a218d3c208c3c208d3c6a218e3c208d3c208e3c" - "6a218f3c208e3c208f3c" - "6a21903c208f3c20903c6a21913c20903c20913c6a21923c20913c20923c6a21933c20923c20933c6a21943c20933c" - "20943c6a21953c20943c" - "20953c6a21963c20953c20963c6a21973c20963c20973c6a21983c20973c20983c6a21993c20983c20993c6a219a3c" - "20993c209a3c6a219b3c" - "209a3c209b3c6a219c3c209b3c209c3c6a219d3c209c3c209d3c6a219e3c209d3c209e3c6a219f3c209e3c209f3c6a" - "21a03c209f3c20a03c6a" - "21a13c20a03c20a13c6a21a23c20a13c20a23c6a21a33c20a23c20a33c6a21a43c20a33c20a43c6a21a53c20a43c20" - "a53c6a21a63c20a53c20" - "a63c6a21a73c20a63c20a73c6a21a83c20a73c20a83c6a21a93c20a83c20a93c6a21aa3c20a93c20aa3c6a21ab3c20" - "aa3c20ab3c6a21ac3c20" - "ab3c20ac3c6a21ad3c20ac3c20ad3c6a21ae3c20ad3c20ae3c6a21af3c20ae3c20af3c6a21b03c20af3c20b03c6a21" - "b13c20b03c20b13c6a21" - "b23c20b13c20b23c6a21b33c20b23c20b33c6a21b43c20b33c20b43c6a21b53c20b43c20b53c6a21b63c20b53c20b6" - "3c6a21b73c20b63c20b7" - "3c6a21b83c20b73c20b83c6a21b93c20b83c20b93c6a21ba3c20b93c20ba3c6a21bb3c20ba3c20bb3c6a21bc3c20bb" - "3c20bc3c6a21bd3c20bc" - "3c20bd3c6a21be3c20bd3c20be3c6a21bf3c20be3c20bf3c6a21c03c20bf3c20c03c6a21c13c20c03c20c13c6a21c2" - "3c20c13c20c23c6a21c3" - "3c20c23c20c33c6a21c43c20c33c20c43c6a21c53c20c43c20c53c6a21c63c20c53c20c63c6a21c73c20c63c20c73c" - "6a21c83c20c73c20c83c" - "6a21c93c20c83c20c93c6a21ca3c20c93c20ca3c6a21cb3c20ca3c20cb3c6a21cc3c20cb3c20cc3c6a21cd3c20cc3c" - "20cd3c6a21ce3c20cd3c" - "20ce3c6a21cf3c20ce3c20cf3c6a21d03c20cf3c20d03c6a21d13c20d03c20d13c6a21d23c20d13c20d23c6a21d33c" - "20d23c20d33c6a21d43c" - "20d33c20d43c6a21d53c20d43c20d53c6a21d63c20d53c20d63c6a21d73c20d63c20d73c6a21d83c20d73c20d83c6a" - "21d93c20d83c20d93c6a" - "21da3c20d93c20da3c6a21db3c20da3c20db3c6a21dc3c20db3c20dc3c6a21dd3c20dc3c20dd3c6a21de3c20dd3c20" - "de3c6a21df3c20de3c20" - "df3c6a21e03c20df3c20e03c6a21e13c20e03c20e13c6a21e23c20e13c20e23c6a21e33c20e23c20e33c6a21e43c20" - "e33c20e43c6a21e53c20" - "e43c20e53c6a21e63c20e53c20e63c6a21e73c20e63c20e73c6a21e83c20e73c20e83c6a21e93c20e83c20e93c6a21" - "ea3c20e93c20ea3c6a21" - "eb3c20ea3c20eb3c6a21ec3c20eb3c20ec3c6a21ed3c20ec3c20ed3c6a21ee3c20ed3c20ee3c6a21ef3c20ee3c20ef" - "3c6a21f03c20ef3c20f0" - "3c6a21f13c20f03c20f13c6a21f23c20f13c20f23c6a21f33c20f23c20f33c6a21f43c20f33c20f43c6a21f53c20f4" - "3c20f53c6a21f63c20f5" - "3c20f63c6a21f73c20f63c20f73c6a21f83c20f73c20f83c6a21f93c20f83c20f93c6a21fa3c20f93c20fa3c6a21fb" - "3c20fa3c20fb3c6a21fc" + "21f53a20f43a20f53a6a21f63a20f53a20f63a6a21f73a20f63a20f73a6a21f83a20f73a20f83a6a21f93a20f83a20" + "f93a6a21fa3a20f93a20fa3a6a21fb3a20fa3a20fb3a6a21fc3a20fb3a20fc3a6a21fd3a20fc3a20fd3a6a21fe3a20" + "fd3a20fe3a6a21ff3a20fe3a20ff3a6a21803b20ff3a20803b6a21813b20803b20813b6a21823b20813b20823b6a21" + "833b20823b20833b6a21843b20833b20843b6a21853b20843b20853b6a21863b20853b20863b6a21873b20863b2087" + "3b6a21883b20873b20883b6a21893b20883b20893b6a218a3b20893b208a3b6a218b3b208a3b208b3b6a218c3b208b" + "3b208c3b6a218d3b208c3b208d3b6a218e3b208d3b208e3b6a218f3b208e3b208f3b6a21903b208f3b20903b6a2191" + "3b20903b20913b6a21923b20913b20923b6a21933b20923b20933b6a21943b20933b20943b6a21953b20943b20953b" + "6a21963b20953b20963b6a21973b20963b20973b6a21983b20973b20983b6a21993b20983b20993b6a219a3b20993b" + "209a3b6a219b3b209a3b209b3b6a219c3b209b3b209c3b6a219d3b209c3b209d3b6a219e3b209d3b209e3b6a219f3b" + "209e3b209f3b6a21a03b209f3b20a03b6a21a13b20a03b20a13b6a21a23b20a13b20a23b6a21a33b20a23b20a33b6a" + "21a43b20a33b20a43b6a21a53b20a43b20a53b6a21a63b20a53b20a63b6a21a73b20a63b20a73b6a21a83b20a73b20" + "a83b6a21a93b20a83b20a93b6a21aa3b20a93b20aa3b6a21ab3b20aa3b20ab3b6a21ac3b20ab3b20ac3b6a21ad3b20" + "ac3b20ad3b6a21ae3b20ad3b20ae3b6a21af3b20ae3b20af3b6a21b03b20af3b20b03b6a21b13b20b03b20b13b6a21" + "b23b20b13b20b23b6a21b33b20b23b20b33b6a21b43b20b33b20b43b6a21b53b20b43b20b53b6a21b63b20b53b20b6" + "3b6a21b73b20b63b20b73b6a21b83b20b73b20b83b6a21b93b20b83b20b93b6a21ba3b20b93b20ba3b6a21bb3b20ba" + "3b20bb3b6a21bc3b20bb3b20bc3b6a21bd3b20bc3b20bd3b6a21be3b20bd3b20be3b6a21bf3b20be3b20bf3b6a21c0" + "3b20bf3b20c03b6a21c13b20c03b20c13b6a21c23b20c13b20c23b6a21c33b20c23b20c33b6a21c43b20c33b20c43b" + "6a21c53b20c43b20c53b6a21c63b20c53b20c63b6a21c73b20c63b20c73b6a21c83b20c73b20c83b6a21c93b20c83b" + "20c93b6a21ca3b20c93b20ca3b6a21cb3b20ca3b20cb3b6a21cc3b20cb3b20cc3b6a21cd3b20cc3b20cd3b6a21ce3b" + "20cd3b20ce3b6a21cf3b20ce3b20cf3b6a21d03b20cf3b20d03b6a21d13b20d03b20d13b6a21d23b20d13b20d23b6a" + "21d33b20d23b20d33b6a21d43b20d33b20d43b6a21d53b20d43b20d53b6a21d63b20d53b20d63b6a21d73b20d63b20" + "d73b6a21d83b20d73b20d83b6a21d93b20d83b20d93b6a21da3b20d93b20da3b6a21db3b20da3b20db3b6a21dc3b20" + "db3b20dc3b6a21dd3b20dc3b20dd3b6a21de3b20dd3b20de3b6a21df3b20de3b20df3b6a21e03b20df3b20e03b6a21" + "e13b20e03b20e13b6a21e23b20e13b20e23b6a21e33b20e23b20e33b6a21e43b20e33b20e43b6a21e53b20e43b20e5" + "3b6a21e63b20e53b20e63b6a21e73b20e63b20e73b6a21e83b20e73b20e83b6a21e93b20e83b20e93b6a21ea3b20e9" + "3b20ea3b6a21eb3b20ea3b20eb3b6a21ec3b20eb3b20ec3b6a21ed3b20ec3b20ed3b6a21ee3b20ed3b20ee3b6a21ef" + "3b20ee3b20ef3b6a21f03b20ef3b20f03b6a21f13b20f03b20f13b6a21f23b20f13b20f23b6a21f33b20f23b20f33b" + "6a21f43b20f33b20f43b6a21f53b20f43b20f53b6a21f63b20f53b20f63b6a21f73b20f63b20f73b6a21f83b20f73b" + "20f83b6a21f93b20f83b20f93b6a21fa3b20f93b20fa3b6a21fb3b20fa3b20fb3b6a21fc3b20fb3b20fc3b6a21fd3b" + "20fc3b20fd3b6a21fe3b20fd3b20fe3b6a21ff3b20fe3b20ff3b6a21803c20ff3b20803c6a21813c20803c20813c6a" + "21823c20813c20823c6a21833c20823c20833c6a21843c20833c20843c6a21853c20843c20853c6a21863c20853c20" + "863c6a21873c20863c20873c6a21883c20873c20883c6a21893c20883c20893c6a218a3c20893c208a3c6a218b3c20" + "8a3c208b3c6a218c3c208b3c208c3c6a218d3c208c3c208d3c6a218e3c208d3c208e3c6a218f3c208e3c208f3c6a21" + "903c208f3c20903c6a21913c20903c20913c6a21923c20913c20923c6a21933c20923c20933c6a21943c20933c2094" + "3c6a21953c20943c20953c6a21963c20953c20963c6a21973c20963c20973c6a21983c20973c20983c6a21993c2098" + "3c20993c6a219a3c20993c209a3c6a219b3c209a3c209b3c6a219c3c209b3c209c3c6a219d3c209c3c209d3c6a219e" + "3c209d3c209e3c6a219f3c209e3c209f3c6a21a03c209f3c20a03c6a21a13c20a03c20a13c6a21a23c20a13c20a23c" + "6a21a33c20a23c20a33c6a21a43c20a33c20a43c6a21a53c20a43c20a53c6a21a63c20a53c20a63c6a21a73c20a63c" + "20a73c6a21a83c20a73c20a83c6a21a93c20a83c20a93c6a21aa3c20a93c20aa3c6a21ab3c20aa3c20ab3c6a21ac3c" + "20ab3c20ac3c6a21ad3c20ac3c20ad3c6a21ae3c20ad3c20ae3c6a21af3c20ae3c20af3c6a21b03c20af3c20b03c6a" + "21b13c20b03c20b13c6a21b23c20b13c20b23c6a21b33c20b23c20b33c6a21b43c20b33c20b43c6a21b53c20b43c20" + "b53c6a21b63c20b53c20b63c6a21b73c20b63c20b73c6a21b83c20b73c20b83c6a21b93c20b83c20b93c6a21ba3c20" + "b93c20ba3c6a21bb3c20ba3c20bb3c6a21bc3c20bb3c20bc3c6a21bd3c20bc3c20bd3c6a21be3c20bd3c20be3c6a21" + "bf3c20be3c20bf3c6a21c03c20bf3c20c03c6a21c13c20c03c20c13c6a21c23c20c13c20c23c6a21c33c20c23c20c3" + "3c6a21c43c20c33c20c43c6a21c53c20c43c20c53c6a21c63c20c53c20c63c6a21c73c20c63c20c73c6a21c83c20c7" + "3c20c83c6a21c93c20c83c20c93c6a21ca3c20c93c20ca3c6a21cb3c20ca3c20cb3c6a21cc3c20cb3c20cc3c6a21cd" + "3c20cc3c20cd3c6a21ce3c20cd3c20ce3c6a21cf3c20ce3c20cf3c6a21d03c20cf3c20d03c6a21d13c20d03c20d13c" + "6a21d23c20d13c20d23c6a21d33c20d23c20d33c6a21d43c20d33c20d43c6a21d53c20d43c20d53c6a21d63c20d53c" + "20d63c6a21d73c20d63c20d73c6a21d83c20d73c20d83c6a21d93c20d83c20d93c6a21da3c20d93c20da3c6a21db3c" + "20da3c20db3c6a21dc3c20db3c20dc3c6a21dd3c20dc3c20dd3c6a21de3c20dd3c20de3c6a21df3c20de3c20df3c6a" + "21e03c20df3c20e03c6a21e13c20e03c20e13c6a21e23c20e13c20e23c6a21e33c20e23c20e33c6a21e43c20e33c20" + "e43c6a21e53c20e43c20e53c6a21e63c20e53c20e63c6a21e73c20e63c20e73c6a21e83c20e73c20e83c6a21e93c20" + "e83c20e93c6a21ea3c20e93c20ea3c6a21eb3c20ea3c20eb3c6a21ec3c20eb3c20ec3c6a21ed3c20ec3c20ed3c6a21" + "ee3c20ed3c20ee3c6a21ef3c20ee3c20ef3c6a21f03c20ef3c20f03c6a21f13c20f03c20f13c6a21f23c20f13c20f2" + "3c6a21f33c20f23c20f33c6a21f43c20f33c20f43c6a21f53c20f43c20f53c6a21f63c20f53c20f63c6a21f73c20f6" + "3c20f73c6a21f83c20f73c20f83c6a21f93c20f83c20f93c6a21fa3c20f93c20fa3c6a21fb3c20fa3c20fb3c6a21fc" "3c20fb3c20fc3c6a21fd3c20fc3c20fd3c6a21fe3c20fd3c20fe3c6a21ff3c20fe3c20ff3c6a21803d20ff3c20803d" - "6a21813d20803d20813d" - "6a21823d20813d20823d6a21833d20823d20833d6a21843d20833d20843d6a21853d20843d20853d6a21863d20853d" - "20863d6a21873d20863d" - "20873d6a21883d20873d20883d6a21893d20883d20893d6a218a3d20893d208a3d6a218b3d208a3d208b3d6a218c3d" - "208b3d208c3d6a218d3d" - "208c3d208d3d6a218e3d208d3d208e3d6a218f3d208e3d208f3d6a21903d208f3d20903d6a21913d20903d20913d6a" - "21923d20913d20923d6a" - "21933d20923d20933d6a21943d20933d20943d6a21953d20943d20953d6a21963d20953d20963d6a21973d20963d20" - "973d6a21983d20973d20" - "983d6a21993d20983d20993d6a219a3d20993d209a3d6a219b3d209a3d209b3d6a219c3d209b3d209c3d6a219d3d20" - "9c3d209d3d6a219e3d20" - "9d3d209e3d6a219f3d209e3d209f3d6a21a03d209f3d20a03d6a21a13d20a03d20a13d6a21a23d20a13d20a23d6a21" - "a33d20a23d20a33d6a21" - "a43d20a33d20a43d6a21a53d20a43d20a53d6a21a63d20a53d20a63d6a21a73d20a63d20a73d6a21a83d20a73d20a8" - "3d6a21a93d20a83d20a9" - "3d6a21aa3d20a93d20aa3d6a21ab3d20aa3d20ab3d6a21ac3d20ab3d20ac3d6a21ad3d20ac3d20ad3d6a21ae3d20ad" - "3d20ae3d6a21af3d20ae" - "3d20af3d6a21b03d20af3d20b03d6a21b13d20b03d20b13d6a21b23d20b13d20b23d6a21b33d20b23d20b33d6a21b4" - "3d20b33d20b43d6a21b5" - "3d20b43d20b53d6a21b63d20b53d20b63d6a21b73d20b63d20b73d6a21b83d20b73d20b83d6a21b93d20b83d20b93d" - "6a21ba3d20b93d20ba3d" - "6a21bb3d20ba3d20bb3d6a21bc3d20bb3d20bc3d6a21bd3d20bc3d20bd3d6a21be3d20bd3d20be3d6a21bf3d20be3d" - "20bf3d6a21c03d20bf3d" - "20c03d6a21c13d20c03d20c13d6a21c23d20c13d20c23d6a21c33d20c23d20c33d6a21c43d20c33d20c43d6a21c53d" - "20c43d20c53d6a21c63d" - "20c53d20c63d6a21c73d20c63d20c73d6a21c83d20c73d20c83d6a21c93d20c83d20c93d6a21ca3d20c93d20ca3d6a" - "21cb3d20ca3d20cb3d6a" - "21cc3d20cb3d20cc3d6a21cd3d20cc3d20cd3d6a21ce3d20cd3d20ce3d6a21cf3d20ce3d20cf3d6a21d03d20cf3d20" - "d03d6a21d13d20d03d20" - "d13d6a21d23d20d13d20d23d6a21d33d20d23d20d33d6a21d43d20d33d20d43d6a21d53d20d43d20d53d6a21d63d20" - "d53d20d63d6a21d73d20" - "d63d20d73d6a21d83d20d73d20d83d6a21d93d20d83d20d93d6a21da3d20d93d20da3d6a21db3d20da3d20db3d6a21" - "dc3d20db3d20dc3d6a21" - "dd3d20dc3d20dd3d6a21de3d20dd3d20de3d6a21df3d20de3d20df3d6a21e03d20df3d20e03d6a21e13d20e03d20e1" - "3d6a21e23d20e13d20e2" - "3d6a21e33d20e23d20e33d6a21e43d20e33d20e43d6a21e53d20e43d20e53d6a21e63d20e53d20e63d6a21e73d20e6" - "3d20e73d6a21e83d20e7" - "3d20e83d6a21e93d20e83d20e93d6a21ea3d20e93d20ea3d6a21eb3d20ea3d20eb3d6a21ec3d20eb3d20ec3d6a21ed" - "3d20ec3d20ed3d6a21ee" - "3d20ed3d20ee3d6a21ef3d20ee3d20ef3d6a21f03d20ef3d20f03d6a21f13d20f03d20f13d6a21f23d20f13d20f23d" - "6a21f33d20f23d20f33d" - "6a21f43d20f33d20f43d6a21f53d20f43d20f53d6a21f63d20f53d20f63d6a21f73d20f63d20f73d6a21f83d20f73d" - "20f83d6a21f93d20f83d" - "20f93d6a21fa3d20f93d20fa3d6a21fb3d20fa3d20fb3d6a21fc3d20fb3d20fc3d6a21fd3d20fc3d20fd3d6a21fe3d" - "20fd3d20fe3d6a21ff3d" - "20fe3d20ff3d6a21803e20ff3d20803e6a21813e20803e20813e6a21823e20813e20823e6a21833e20823e20833e6a" - "21843e20833e20843e6a" - "21853e20843e20853e6a21863e20853e20863e6a21873e20863e20873e6a21883e20873e20883e6a21893e20883e20" - "893e6a218a3e20893e20" - "8a3e6a218b3e208a3e208b3e6a218c3e208b3e208c3e6a218d3e208c3e208d3e6a218e3e208d3e208e3e6a218f3e20" - "8e3e208f3e6a21903e20" - "8f3e20903e6a21913e20903e20913e6a21923e20913e20923e6a21933e20923e20933e6a21943e20933e20943e6a21" - "953e20943e20953e6a21" - "963e20953e20963e6a21973e20963e20973e6a21983e20973e20983e6a21993e20983e20993e6a219a3e20993e209a" - "3e6a219b3e209a3e209b" - "3e6a219c3e209b3e209c3e6a219d3e209c3e209d3e6a219e3e209d3e209e3e6a219f3e209e3e209f3e6a21a03e209f" - "3e20a03e6a21a13e20a0" - "3e20a13e6a21a23e20a13e20a23e6a21a33e20a23e20a33e6a21a43e20a33e20a43e6a21a53e20a43e20a53e6a21a6" - "3e20a53e20a63e6a21a7" - "3e20a63e20a73e6a21a83e20a73e20a83e6a21a93e20a83e20a93e6a21aa3e20a93e20aa3e6a21ab3e20aa3e20ab3e" - "6a21ac3e20ab3e20ac3e" - "6a21ad3e20ac3e20ad3e6a21ae3e20ad3e20ae3e6a21af3e20ae3e20af3e6a21b03e20af3e20b03e6a21b13e20b03e" - "20b13e6a21b23e20b13e" - "20b23e6a21b33e20b23e20b33e6a21b43e20b33e20b43e6a21b53e20b43e20b53e6a21b63e20b53e20b63e6a21b73e" - "20b63e20b73e6a21b83e" - "20b73e20b83e6a21b93e20b83e20b93e6a21ba3e20b93e20ba3e6a21bb3e20ba3e20bb3e6a21bc3e20bb3e20bc3e6a" - "21bd3e20bc3e20bd3e6a" - "21be3e20bd3e20be3e6a21bf3e20be3e20bf3e6a21c03e20bf3e20c03e6a21c13e20c03e20c13e6a21c23e20c13e20" - "c23e6a21c33e20c23e20" - "c33e6a21c43e20c33e20c43e6a21c53e20c43e20c53e6a21c63e20c53e20c63e6a21c73e20c63e20c73e6a21c83e20" - "c73e20c83e6a21c93e20" - "c83e20c93e6a21ca3e20c93e20ca3e6a21cb3e20ca3e20cb3e6a21cc3e20cb3e20cc3e6a21cd3e20cc3e20cd3e6a21" - "ce3e20cd3e20ce3e6a21" - "cf3e20ce3e20cf3e6a21d03e20cf3e20d03e6a21d13e20d03e20d13e6a21d23e20d13e20d23e6a21d33e20d23e20d3" - "3e6a21d43e20d33e20d4" - "3e6a21d53e20d43e20d53e6a21d63e20d53e20d63e6a21d73e20d63e20d73e6a21d83e20d73e20d83e6a21d93e20d8" - "3e20d93e6a21da3e20d9" - "3e20da3e6a21db3e20da3e20db3e6a21dc3e20db3e20dc3e6a21dd3e20dc3e20dd3e6a21de3e20dd3e20de3e6a21df" - "3e20de3e20df3e6a21e0" - "3e20df3e20e03e6a21e13e20e03e20e13e6a21e23e20e13e20e23e6a21e33e20e23e20e33e6a21e43e20e33e20e43e" - "6a21e53e20e43e20e53e" - "6a21e63e20e53e20e63e6a21e73e20e63e20e73e6a21e83e20e73e20e83e6a21e93e20e83e20e93e6a21ea3e20e93e" - "20ea3e6a21eb3e20ea3e" - "20eb3e6a21ec3e20eb3e20ec3e6a21ed3e20ec3e20ed3e6a21ee3e20ed3e20ee3e6a21ef3e20ee3e20ef3e6a21f03e" - "20ef3e20f03e6a21f13e" - "20f03e20f13e6a21f23e20f13e20f23e6a21f33e20f23e20f33e6a21f43e20f33e20f43e6a21f53e20f43e20f53e6a" - "21f63e20f53e20f63e6a" - "21f73e20f63e20f73e6a21f83e20f73e20f83e6a21f93e20f83e20f93e6a21fa3e20f93e20fa3e6a21fb3e20fa3e20" - "fb3e6a21fc3e20fb3e20" - "fc3e6a21fd3e20fc3e20fd3e6a21fe3e20fd3e20fe3e6a21ff3e20fe3e20ff3e6a21803f20ff3e20803f6a21813f20" - "803f20813f6a21823f20" - "813f20823f6a21833f20823f20833f6a21843f20833f20843f6a21853f20843f20853f6a21863f20853f20863f6a21" - "873f20863f20873f6a21" + "6a21813d20803d20813d6a21823d20813d20823d6a21833d20823d20833d6a21843d20833d20843d6a21853d20843d" + "20853d6a21863d20853d20863d6a21873d20863d20873d6a21883d20873d20883d6a21893d20883d20893d6a218a3d" + "20893d208a3d6a218b3d208a3d208b3d6a218c3d208b3d208c3d6a218d3d208c3d208d3d6a218e3d208d3d208e3d6a" + "218f3d208e3d208f3d6a21903d208f3d20903d6a21913d20903d20913d6a21923d20913d20923d6a21933d20923d20" + "933d6a21943d20933d20943d6a21953d20943d20953d6a21963d20953d20963d6a21973d20963d20973d6a21983d20" + "973d20983d6a21993d20983d20993d6a219a3d20993d209a3d6a219b3d209a3d209b3d6a219c3d209b3d209c3d6a21" + "9d3d209c3d209d3d6a219e3d209d3d209e3d6a219f3d209e3d209f3d6a21a03d209f3d20a03d6a21a13d20a03d20a1" + "3d6a21a23d20a13d20a23d6a21a33d20a23d20a33d6a21a43d20a33d20a43d6a21a53d20a43d20a53d6a21a63d20a5" + "3d20a63d6a21a73d20a63d20a73d6a21a83d20a73d20a83d6a21a93d20a83d20a93d6a21aa3d20a93d20aa3d6a21ab" + "3d20aa3d20ab3d6a21ac3d20ab3d20ac3d6a21ad3d20ac3d20ad3d6a21ae3d20ad3d20ae3d6a21af3d20ae3d20af3d" + "6a21b03d20af3d20b03d6a21b13d20b03d20b13d6a21b23d20b13d20b23d6a21b33d20b23d20b33d6a21b43d20b33d" + "20b43d6a21b53d20b43d20b53d6a21b63d20b53d20b63d6a21b73d20b63d20b73d6a21b83d20b73d20b83d6a21b93d" + "20b83d20b93d6a21ba3d20b93d20ba3d6a21bb3d20ba3d20bb3d6a21bc3d20bb3d20bc3d6a21bd3d20bc3d20bd3d6a" + "21be3d20bd3d20be3d6a21bf3d20be3d20bf3d6a21c03d20bf3d20c03d6a21c13d20c03d20c13d6a21c23d20c13d20" + "c23d6a21c33d20c23d20c33d6a21c43d20c33d20c43d6a21c53d20c43d20c53d6a21c63d20c53d20c63d6a21c73d20" + "c63d20c73d6a21c83d20c73d20c83d6a21c93d20c83d20c93d6a21ca3d20c93d20ca3d6a21cb3d20ca3d20cb3d6a21" + "cc3d20cb3d20cc3d6a21cd3d20cc3d20cd3d6a21ce3d20cd3d20ce3d6a21cf3d20ce3d20cf3d6a21d03d20cf3d20d0" + "3d6a21d13d20d03d20d13d6a21d23d20d13d20d23d6a21d33d20d23d20d33d6a21d43d20d33d20d43d6a21d53d20d4" + "3d20d53d6a21d63d20d53d20d63d6a21d73d20d63d20d73d6a21d83d20d73d20d83d6a21d93d20d83d20d93d6a21da" + "3d20d93d20da3d6a21db3d20da3d20db3d6a21dc3d20db3d20dc3d6a21dd3d20dc3d20dd3d6a21de3d20dd3d20de3d" + "6a21df3d20de3d20df3d6a21e03d20df3d20e03d6a21e13d20e03d20e13d6a21e23d20e13d20e23d6a21e33d20e23d" + "20e33d6a21e43d20e33d20e43d6a21e53d20e43d20e53d6a21e63d20e53d20e63d6a21e73d20e63d20e73d6a21e83d" + "20e73d20e83d6a21e93d20e83d20e93d6a21ea3d20e93d20ea3d6a21eb3d20ea3d20eb3d6a21ec3d20eb3d20ec3d6a" + "21ed3d20ec3d20ed3d6a21ee3d20ed3d20ee3d6a21ef3d20ee3d20ef3d6a21f03d20ef3d20f03d6a21f13d20f03d20" + "f13d6a21f23d20f13d20f23d6a21f33d20f23d20f33d6a21f43d20f33d20f43d6a21f53d20f43d20f53d6a21f63d20" + "f53d20f63d6a21f73d20f63d20f73d6a21f83d20f73d20f83d6a21f93d20f83d20f93d6a21fa3d20f93d20fa3d6a21" + "fb3d20fa3d20fb3d6a21fc3d20fb3d20fc3d6a21fd3d20fc3d20fd3d6a21fe3d20fd3d20fe3d6a21ff3d20fe3d20ff" + "3d6a21803e20ff3d20803e6a21813e20803e20813e6a21823e20813e20823e6a21833e20823e20833e6a21843e2083" + "3e20843e6a21853e20843e20853e6a21863e20853e20863e6a21873e20863e20873e6a21883e20873e20883e6a2189" + "3e20883e20893e6a218a3e20893e208a3e6a218b3e208a3e208b3e6a218c3e208b3e208c3e6a218d3e208c3e208d3e" + "6a218e3e208d3e208e3e6a218f3e208e3e208f3e6a21903e208f3e20903e6a21913e20903e20913e6a21923e20913e" + "20923e6a21933e20923e20933e6a21943e20933e20943e6a21953e20943e20953e6a21963e20953e20963e6a21973e" + "20963e20973e6a21983e20973e20983e6a21993e20983e20993e6a219a3e20993e209a3e6a219b3e209a3e209b3e6a" + "219c3e209b3e209c3e6a219d3e209c3e209d3e6a219e3e209d3e209e3e6a219f3e209e3e209f3e6a21a03e209f3e20" + "a03e6a21a13e20a03e20a13e6a21a23e20a13e20a23e6a21a33e20a23e20a33e6a21a43e20a33e20a43e6a21a53e20" + "a43e20a53e6a21a63e20a53e20a63e6a21a73e20a63e20a73e6a21a83e20a73e20a83e6a21a93e20a83e20a93e6a21" + "aa3e20a93e20aa3e6a21ab3e20aa3e20ab3e6a21ac3e20ab3e20ac3e6a21ad3e20ac3e20ad3e6a21ae3e20ad3e20ae" + "3e6a21af3e20ae3e20af3e6a21b03e20af3e20b03e6a21b13e20b03e20b13e6a21b23e20b13e20b23e6a21b33e20b2" + "3e20b33e6a21b43e20b33e20b43e6a21b53e20b43e20b53e6a21b63e20b53e20b63e6a21b73e20b63e20b73e6a21b8" + "3e20b73e20b83e6a21b93e20b83e20b93e6a21ba3e20b93e20ba3e6a21bb3e20ba3e20bb3e6a21bc3e20bb3e20bc3e" + "6a21bd3e20bc3e20bd3e6a21be3e20bd3e20be3e6a21bf3e20be3e20bf3e6a21c03e20bf3e20c03e6a21c13e20c03e" + "20c13e6a21c23e20c13e20c23e6a21c33e20c23e20c33e6a21c43e20c33e20c43e6a21c53e20c43e20c53e6a21c63e" + "20c53e20c63e6a21c73e20c63e20c73e6a21c83e20c73e20c83e6a21c93e20c83e20c93e6a21ca3e20c93e20ca3e6a" + "21cb3e20ca3e20cb3e6a21cc3e20cb3e20cc3e6a21cd3e20cc3e20cd3e6a21ce3e20cd3e20ce3e6a21cf3e20ce3e20" + "cf3e6a21d03e20cf3e20d03e6a21d13e20d03e20d13e6a21d23e20d13e20d23e6a21d33e20d23e20d33e6a21d43e20" + "d33e20d43e6a21d53e20d43e20d53e6a21d63e20d53e20d63e6a21d73e20d63e20d73e6a21d83e20d73e20d83e6a21" + "d93e20d83e20d93e6a21da3e20d93e20da3e6a21db3e20da3e20db3e6a21dc3e20db3e20dc3e6a21dd3e20dc3e20dd" + "3e6a21de3e20dd3e20de3e6a21df3e20de3e20df3e6a21e03e20df3e20e03e6a21e13e20e03e20e13e6a21e23e20e1" + "3e20e23e6a21e33e20e23e20e33e6a21e43e20e33e20e43e6a21e53e20e43e20e53e6a21e63e20e53e20e63e6a21e7" + "3e20e63e20e73e6a21e83e20e73e20e83e6a21e93e20e83e20e93e6a21ea3e20e93e20ea3e6a21eb3e20ea3e20eb3e" + "6a21ec3e20eb3e20ec3e6a21ed3e20ec3e20ed3e6a21ee3e20ed3e20ee3e6a21ef3e20ee3e20ef3e6a21f03e20ef3e" + "20f03e6a21f13e20f03e20f13e6a21f23e20f13e20f23e6a21f33e20f23e20f33e6a21f43e20f33e20f43e6a21f53e" + "20f43e20f53e6a21f63e20f53e20f63e6a21f73e20f63e20f73e6a21f83e20f73e20f83e6a21f93e20f83e20f93e6a" + "21fa3e20f93e20fa3e6a21fb3e20fa3e20fb3e6a21fc3e20fb3e20fc3e6a21fd3e20fc3e20fd3e6a21fe3e20fd3e20" + "fe3e6a21ff3e20fe3e20ff3e6a21803f20ff3e20803f6a21813f20803f20813f6a21823f20813f20823f6a21833f20" + "823f20833f6a21843f20833f20843f6a21853f20843f20853f6a21863f20853f20863f6a21873f20863f20873f6a21" "883f20873f20883f6a21893f20883f20893f6a218a3f20893f208a3f6a218b3f208a3f208b3f6a218c3f208b3f208c" - "3f6a218d3f208c3f208d" - "3f6a218e3f208d3f208e3f6a218f3f208e3f208f3f6a21903f208f3f20903f6a21913f20903f20913f6a21923f2091" - "3f20923f6a21933f2092" - "3f20933f6a21943f20933f20943f6a21953f20943f20953f6a21963f20953f20963f6a21973f20963f20973f6a2198" - "3f20973f20983f6a2199" - "3f20983f20993f6a219a3f20993f209a3f6a219b3f209a3f209b3f6a219c3f209b3f209c3f6a219d3f209c3f209d3f" - "6a219e3f209d3f209e3f" - "6a219f3f209e3f209f3f6a21a03f209f3f20a03f6a21a13f20a03f20a13f6a21a23f20a13f20a23f6a21a33f20a23f" - "20a33f6a21a43f20a33f" - "20a43f6a21a53f20a43f20a53f6a21a63f20a53f20a63f6a21a73f20a63f20a73f6a21a83f20a73f20a83f6a21a93f" - "20a83f20a93f6a21aa3f" - "20a93f20aa3f6a21ab3f20aa3f20ab3f6a21ac3f20ab3f20ac3f6a21ad3f20ac3f20ad3f6a21ae3f20ad3f20ae3f6a" - "21af3f20ae3f20af3f6a" - "21b03f20af3f20b03f6a21b13f20b03f20b13f6a21b23f20b13f20b23f6a21b33f20b23f20b33f6a21b43f20b33f20" - "b43f6a21b53f20b43f20" - "b53f6a21b63f20b53f20b63f6a21b73f20b63f20b73f6a21b83f20b73f20b83f6a21b93f20b83f20b93f6a21ba3f20" - "b93f20ba3f6a21bb3f20" - "ba3f20bb3f6a21bc3f20bb3f20bc3f6a21bd3f20bc3f20bd3f6a21be3f20bd3f20be3f6a21bf3f20be3f20bf3f6a21" - "c03f20bf3f20c03f6a21" - "c13f20c03f20c13f6a21c23f20c13f20c23f6a21c33f20c23f20c33f6a21c43f20c33f20c43f6a21c53f20c43f20c5" - "3f6a21c63f20c53f20c6" - "3f6a21c73f20c63f20c73f6a21c83f20c73f20c83f6a21c93f20c83f20c93f6a21ca3f20c93f20ca3f6a21cb3f20ca" - "3f20cb3f6a21cc3f20cb" - "3f20cc3f6a21cd3f20cc3f20cd3f6a21ce3f20cd3f20ce3f6a21cf3f20ce3f20cf3f6a21d03f20cf3f20d03f6a21d1" - "3f20d03f20d13f6a21d2" - "3f20d13f20d23f6a21d33f20d23f20d33f6a21d43f20d33f20d43f6a21d53f20d43f20d53f6a21d63f20d53f20d63f" - "6a21d73f20d63f20d73f" - "6a21d83f20d73f20d83f6a21d93f20d83f20d93f6a21da3f20d93f20da3f6a21db3f20da3f20db3f6a21dc3f20db3f" - "20dc3f6a21dd3f20dc3f" - "20dd3f6a21de3f20dd3f20de3f6a21df3f20de3f20df3f6a21e03f20df3f20e03f6a21e13f20e03f20e13f6a21e23f" - "20e13f20e23f6a21e33f" - "20e23f20e33f6a21e43f20e33f20e43f6a21e53f20e43f20e53f6a21e63f20e53f20e63f6a21e73f20e63f20e73f6a" - "21e83f20e73f20e83f6a" - "21e93f20e83f20e93f6a21ea3f20e93f20ea3f6a21eb3f20ea3f20eb3f6a21ec3f20eb3f20ec3f6a21ed3f20ec3f20" - "ed3f6a21ee3f20ed3f20" - "ee3f6a21ef3f20ee3f20ef3f6a21f03f20ef3f20f03f6a21f13f20f03f20f13f6a21f23f20f13f20f23f6a21f33f20" - "f23f20f33f6a21f43f20" - "f33f20f43f6a21f53f20f43f20f53f6a21f63f20f53f20f63f6a21f73f20f63f20f73f6a21f83f20f73f20f83f6a21" - "f93f20f83f20f93f6a21" - "fa3f20f93f20fa3f6a21fb3f20fa3f20fb3f6a21fc3f20fb3f20fc3f6a21fd3f20fc3f20fd3f6a21fe3f20fd3f20fe" - "3f6a21ff3f20fe3f20ff" - "3f6a21804020ff3f2080406a2181402080402081406a2182402081402082406a2183402082402083406a2184402083" - "402084406a2185402084" - "402085406a2186402085402086406a2187402086402087406a2188402087402088406a2189402088402089406a218a" - "40208940208a406a218b" - "40208a40208b406a218c40208b40208c406a218d40208c40208d406a218e40208d40208e406a218f40208e40208f40" - "6a219040208f40209040" - "6a2191402090402091406a2192402091402092406a2193402092402093406a2194402093402094406a219540209440" - "2095406a219640209540" - "2096406a2197402096402097406a2198402097402098406a2199402098402099406a219a40209940209a406a219b40" - "209a40209b406a219c40" - "209b40209c406a219d40209c40209d406a219e40209d40209e406a219f40209e40209f406a21a040209f4020a0406a" - "21a14020a04020a1406a" - "21a24020a14020a2406a21a34020a24020a3406a21a44020a34020a4406a21a54020a44020a5406a21a64020a54020" - "a6406a21a74020a64020" - "a7406a21a84020a74020a8406a21a94020a84020a9406a21aa4020a94020aa406a21ab4020aa4020ab406a21ac4020" - "ab4020ac406a21ad4020" - "ac4020ad406a21ae4020ad4020ae406a21af4020ae4020af406a21b04020af4020b0406a21b14020b04020b1406a21" - "b24020b14020b2406a21" - "b34020b24020b3406a21b44020b34020b4406a21b54020b44020b5406a21b64020b54020b6406a21b74020b64020b7" - "406a21b84020b74020b8" - "406a21b94020b84020b9406a21ba4020b94020ba406a21bb4020ba4020bb406a21bc4020bb4020bc406a21bd4020bc" - "4020bd406a21be4020bd" - "4020be406a21bf4020be4020bf406a21c04020bf4020c0406a21c14020c04020c1406a21c24020c14020c2406a21c3" - "4020c24020c3406a21c4" - "4020c34020c4406a21c54020c44020c5406a21c64020c54020c6406a21c74020c64020c7406a21c84020c74020c840" - "6a21c94020c84020c940" - "6a21ca4020c94020ca406a21cb4020ca4020cb406a21cc4020cb4020cc406a21cd4020cc4020cd406a21ce4020cd40" - "20ce406a21cf4020ce40" - "20cf406a21d04020cf4020d0406a21d14020d04020d1406a21d24020d14020d2406a21d34020d24020d3406a21d440" - "20d34020d4406a21d540" - "20d44020d5406a21d64020d54020d6406a21d74020d64020d7406a21d84020d74020d8406a21d94020d84020d9406a" - "21da4020d94020da406a" - "21db4020da4020db406a21dc4020db4020dc406a21dd4020dc4020dd406a21de4020dd4020de406a21df4020de4020" - "df406a21e04020df4020" - "e0406a21e14020e04020e1406a21e24020e14020e2406a21e34020e24020e3406a21e44020e34020e4406a21e54020" - "e44020e5406a21e64020" - "e54020e6406a21e74020e64020e7406a21e84020e74020e8406a21e94020e84020e9406a21ea4020e94020ea406a21" - "eb4020ea4020eb406a21" - "ec4020eb4020ec406a21ed4020ec4020ed406a21ee4020ed4020ee406a21ef4020ee4020ef406a21f04020ef4020f0" - "406a21f14020f04020f1" - "406a21f24020f14020f2406a21f34020f24020f3406a21f44020f34020f4406a21f54020f44020f5406a21f64020f5" - "4020f6406a21f74020f6" - "4020f7406a21f84020f74020f8406a21f94020f84020f9406a21fa4020f94020fa406a21fb4020fa4020fb406a21fc" - "4020fb4020fc406a21fd" - "4020fc4020fd406a21fe4020fd4020fe406a21ff4020fe4020ff406a21804120ff402080416a218141208041208141" - "6a218241208141208241" - "6a2183412082412083416a2184412083412084416a2185412084412085416a2186412085412086416a218741208641" - "2087416a218841208741" - "2088416a2189412088412089416a218a41208941208a416a218b41208a41208b416a218c41208b41208c416a218d41" - "208c41208d416a218e41" - "208d41208e416a218f41208e41208f416a219041208f412090416a2191412090412091416a2192412091412092416a" - "2193412092412093416a" + "3f6a218d3f208c3f208d3f6a218e3f208d3f208e3f6a218f3f208e3f208f3f6a21903f208f3f20903f6a21913f2090" + "3f20913f6a21923f20913f20923f6a21933f20923f20933f6a21943f20933f20943f6a21953f20943f20953f6a2196" + "3f20953f20963f6a21973f20963f20973f6a21983f20973f20983f6a21993f20983f20993f6a219a3f20993f209a3f" + "6a219b3f209a3f209b3f6a219c3f209b3f209c3f6a219d3f209c3f209d3f6a219e3f209d3f209e3f6a219f3f209e3f" + "209f3f6a21a03f209f3f20a03f6a21a13f20a03f20a13f6a21a23f20a13f20a23f6a21a33f20a23f20a33f6a21a43f" + "20a33f20a43f6a21a53f20a43f20a53f6a21a63f20a53f20a63f6a21a73f20a63f20a73f6a21a83f20a73f20a83f6a" + "21a93f20a83f20a93f6a21aa3f20a93f20aa3f6a21ab3f20aa3f20ab3f6a21ac3f20ab3f20ac3f6a21ad3f20ac3f20" + "ad3f6a21ae3f20ad3f20ae3f6a21af3f20ae3f20af3f6a21b03f20af3f20b03f6a21b13f20b03f20b13f6a21b23f20" + "b13f20b23f6a21b33f20b23f20b33f6a21b43f20b33f20b43f6a21b53f20b43f20b53f6a21b63f20b53f20b63f6a21" + "b73f20b63f20b73f6a21b83f20b73f20b83f6a21b93f20b83f20b93f6a21ba3f20b93f20ba3f6a21bb3f20ba3f20bb" + "3f6a21bc3f20bb3f20bc3f6a21bd3f20bc3f20bd3f6a21be3f20bd3f20be3f6a21bf3f20be3f20bf3f6a21c03f20bf" + "3f20c03f6a21c13f20c03f20c13f6a21c23f20c13f20c23f6a21c33f20c23f20c33f6a21c43f20c33f20c43f6a21c5" + "3f20c43f20c53f6a21c63f20c53f20c63f6a21c73f20c63f20c73f6a21c83f20c73f20c83f6a21c93f20c83f20c93f" + "6a21ca3f20c93f20ca3f6a21cb3f20ca3f20cb3f6a21cc3f20cb3f20cc3f6a21cd3f20cc3f20cd3f6a21ce3f20cd3f" + "20ce3f6a21cf3f20ce3f20cf3f6a21d03f20cf3f20d03f6a21d13f20d03f20d13f6a21d23f20d13f20d23f6a21d33f" + "20d23f20d33f6a21d43f20d33f20d43f6a21d53f20d43f20d53f6a21d63f20d53f20d63f6a21d73f20d63f20d73f6a" + "21d83f20d73f20d83f6a21d93f20d83f20d93f6a21da3f20d93f20da3f6a21db3f20da3f20db3f6a21dc3f20db3f20" + "dc3f6a21dd3f20dc3f20dd3f6a21de3f20dd3f20de3f6a21df3f20de3f20df3f6a21e03f20df3f20e03f6a21e13f20" + "e03f20e13f6a21e23f20e13f20e23f6a21e33f20e23f20e33f6a21e43f20e33f20e43f6a21e53f20e43f20e53f6a21" + "e63f20e53f20e63f6a21e73f20e63f20e73f6a21e83f20e73f20e83f6a21e93f20e83f20e93f6a21ea3f20e93f20ea" + "3f6a21eb3f20ea3f20eb3f6a21ec3f20eb3f20ec3f6a21ed3f20ec3f20ed3f6a21ee3f20ed3f20ee3f6a21ef3f20ee" + "3f20ef3f6a21f03f20ef3f20f03f6a21f13f20f03f20f13f6a21f23f20f13f20f23f6a21f33f20f23f20f33f6a21f4" + "3f20f33f20f43f6a21f53f20f43f20f53f6a21f63f20f53f20f63f6a21f73f20f63f20f73f6a21f83f20f73f20f83f" + "6a21f93f20f83f20f93f6a21fa3f20f93f20fa3f6a21fb3f20fa3f20fb3f6a21fc3f20fb3f20fc3f6a21fd3f20fc3f" + "20fd3f6a21fe3f20fd3f20fe3f6a21ff3f20fe3f20ff3f6a21804020ff3f2080406a2181402080402081406a218240" + "2081402082406a2183402082402083406a2184402083402084406a2185402084402085406a2186402085402086406a" + "2187402086402087406a2188402087402088406a2189402088402089406a218a40208940208a406a218b40208a4020" + "8b406a218c40208b40208c406a218d40208c40208d406a218e40208d40208e406a218f40208e40208f406a21904020" + "8f402090406a2191402090402091406a2192402091402092406a2193402092402093406a2194402093402094406a21" + "95402094402095406a2196402095402096406a2197402096402097406a2198402097402098406a2199402098402099" + "406a219a40209940209a406a219b40209a40209b406a219c40209b40209c406a219d40209c40209d406a219e40209d" + "40209e406a219f40209e40209f406a21a040209f4020a0406a21a14020a04020a1406a21a24020a14020a2406a21a3" + "4020a24020a3406a21a44020a34020a4406a21a54020a44020a5406a21a64020a54020a6406a21a74020a64020a740" + "6a21a84020a74020a8406a21a94020a84020a9406a21aa4020a94020aa406a21ab4020aa4020ab406a21ac4020ab40" + "20ac406a21ad4020ac4020ad406a21ae4020ad4020ae406a21af4020ae4020af406a21b04020af4020b0406a21b140" + "20b04020b1406a21b24020b14020b2406a21b34020b24020b3406a21b44020b34020b4406a21b54020b44020b5406a" + "21b64020b54020b6406a21b74020b64020b7406a21b84020b74020b8406a21b94020b84020b9406a21ba4020b94020" + "ba406a21bb4020ba4020bb406a21bc4020bb4020bc406a21bd4020bc4020bd406a21be4020bd4020be406a21bf4020" + "be4020bf406a21c04020bf4020c0406a21c14020c04020c1406a21c24020c14020c2406a21c34020c24020c3406a21" + "c44020c34020c4406a21c54020c44020c5406a21c64020c54020c6406a21c74020c64020c7406a21c84020c74020c8" + "406a21c94020c84020c9406a21ca4020c94020ca406a21cb4020ca4020cb406a21cc4020cb4020cc406a21cd4020cc" + "4020cd406a21ce4020cd4020ce406a21cf4020ce4020cf406a21d04020cf4020d0406a21d14020d04020d1406a21d2" + "4020d14020d2406a21d34020d24020d3406a21d44020d34020d4406a21d54020d44020d5406a21d64020d54020d640" + "6a21d74020d64020d7406a21d84020d74020d8406a21d94020d84020d9406a21da4020d94020da406a21db4020da40" + "20db406a21dc4020db4020dc406a21dd4020dc4020dd406a21de4020dd4020de406a21df4020de4020df406a21e040" + "20df4020e0406a21e14020e04020e1406a21e24020e14020e2406a21e34020e24020e3406a21e44020e34020e4406a" + "21e54020e44020e5406a21e64020e54020e6406a21e74020e64020e7406a21e84020e74020e8406a21e94020e84020" + "e9406a21ea4020e94020ea406a21eb4020ea4020eb406a21ec4020eb4020ec406a21ed4020ec4020ed406a21ee4020" + "ed4020ee406a21ef4020ee4020ef406a21f04020ef4020f0406a21f14020f04020f1406a21f24020f14020f2406a21" + "f34020f24020f3406a21f44020f34020f4406a21f54020f44020f5406a21f64020f54020f6406a21f74020f64020f7" + "406a21f84020f74020f8406a21f94020f84020f9406a21fa4020f94020fa406a21fb4020fa4020fb406a21fc4020fb" + "4020fc406a21fd4020fc4020fd406a21fe4020fd4020fe406a21ff4020fe4020ff406a21804120ff402080416a2181" + "412080412081416a2182412081412082416a2183412082412083416a2184412083412084416a218541208441208541" + "6a2186412085412086416a2187412086412087416a2188412087412088416a2189412088412089416a218a41208941" + "208a416a218b41208a41208b416a218c41208b41208c416a218d41208c41208d416a218e41208d41208e416a218f41" + "208e41208f416a219041208f412090416a2191412090412091416a2192412091412092416a2193412092412093416a" "2194412093412094416a2195412094412095416a2196412095412096416a2197412096412097416a21984120974120" - "98416a21994120984120" - "99416a219a41209941209a416a219b41209a41209b416a219c41209b41209c416a219d41209c41209d416a219e4120" - "9d41209e416a219f4120" - "9e41209f416a21a041209f4120a0416a21a14120a04120a1416a21a24120a14120a2416a21a34120a24120a3416a21" - "a44120a34120a4416a21" - "a54120a44120a5416a21a64120a54120a6416a21a74120a64120a7416a21a84120a74120a8416a21a94120a84120a9" - "416a21aa4120a94120aa" - "416a21ab4120aa4120ab416a21ac4120ab4120ac416a21ad4120ac4120ad416a21ae4120ad4120ae416a21af4120ae" - "4120af416a21b04120af" - "4120b0416a21b14120b04120b1416a21b24120b14120b2416a21b34120b24120b3416a21b44120b34120b4416a21b5" - "4120b44120b5416a21b6" - "4120b54120b6416a21b74120b64120b7416a21b84120b74120b8416a21b94120b84120b9416a21ba4120b94120ba41" - "6a21bb4120ba4120bb41" - "6a21bc4120bb4120bc416a21bd4120bc4120bd416a21be4120bd4120be416a21bf4120be4120bf416a21c04120bf41" - "20c0416a21c14120c041" - "20c1416a21c24120c14120c2416a21c34120c24120c3416a21c44120c34120c4416a21c54120c44120c5416a21c641" - "20c54120c6416a21c741" - "20c64120c7416a21c84120c74120c8416a21c94120c84120c9416a21ca4120c94120ca416a21cb4120ca4120cb416a" - "21cc4120cb4120cc416a" - "21cd4120cc4120cd416a21ce4120cd4120ce416a21cf4120ce4120cf416a21d04120cf4120d0416a21d14120d04120" - "d1416a21d24120d14120" - "d2416a21d34120d24120d3416a21d44120d34120d4416a21d54120d44120d5416a21d64120d54120d6416a21d74120" - "d64120d7416a21d84120" - "d74120d8416a21d94120d84120d9416a21da4120d94120da416a21db4120da4120db416a21dc4120db4120dc416a21" - "dd4120dc4120dd416a21" - "de4120dd4120de416a21df4120de4120df416a21e04120df4120e0416a21e14120e04120e1416a21e24120e14120e2" - "416a21e34120e24120e3" - "416a21e44120e34120e4416a21e54120e44120e5416a21e64120e54120e6416a21e74120e64120e7416a21e84120e7" - "4120e8416a21e94120e8" - "4120e9416a21ea4120e94120ea416a21eb4120ea4120eb416a21ec4120eb4120ec416a21ed4120ec4120ed416a21ee" - "4120ed4120ee416a21ef" - "4120ee4120ef416a21f04120ef4120f0416a21f14120f04120f1416a21f24120f14120f2416a21f34120f24120f341" - "6a21f44120f34120f441" - "6a21f54120f44120f5416a21f64120f54120f6416a21f74120f64120f7416a21f84120f74120f8416a21f94120f841" - "20f9416a21fa4120f941" - "20fa416a21fb4120fa4120fb416a21fc4120fb4120fc416a21fd4120fc4120fd416a21fe4120fd4120fe416a21ff41" - "20fe4120ff416a218042" - "20ff412080426a2181422080422081426a2182422081422082426a2183422082422083426a2184422083422084426a" - "2185422084422085426a" - "2186422085422086426a2187422086422087426a2188422087422088426a2189422088422089426a218a4220894220" - "8a426a218b42208a4220" - "8b426a218c42208b42208c426a218d42208c42208d426a218e42208d42208e426a218f42208e42208f426a21904220" - "8f422090426a21914220" - "90422091426a2192422091422092426a2193422092422093426a2194422093422094426a2195422094422095426a21" - "96422095422096426a21" - "97422096422097426a2198422097422098426a2199422098422099426a219a42209942209a426a219b42209a42209b" - "426a219c42209b42209c" - "426a219d42209c42209d426a219e42209d42209e426a219f42209e42209f426a21a042209f4220a0426a21a14220a0" - "4220a1426a21a24220a1" - "4220a2426a21a34220a24220a3426a21a44220a34220a4426a21a54220a44220a5426a21a64220a54220a6426a21a7" - "4220a64220a7426a21a8" - "4220a74220a8426a21a94220a84220a9426a21aa4220a94220aa426a21ab4220aa4220ab426a21ac4220ab4220ac42" - "6a21ad4220ac4220ad42" - "6a21ae4220ad4220ae426a21af4220ae4220af426a21b04220af4220b0426a21b14220b04220b1426a21b24220b142" - "20b2426a21b34220b242" - "20b3426a21b44220b34220b4426a21b54220b44220b5426a21b64220b54220b6426a21b74220b64220b7426a21b842" - "20b74220b8426a21b942" - "20b84220b9426a21ba4220b94220ba426a21bb4220ba4220bb426a21bc4220bb4220bc426a21bd4220bc4220bd426a" - "21be4220bd4220be426a" - "21bf4220be4220bf426a21c04220bf4220c0426a21c14220c04220c1426a21c24220c14220c2426a21c34220c24220" - "c3426a21c44220c34220" - "c4426a21c54220c44220c5426a21c64220c54220c6426a21c74220c64220c7426a21c84220c74220c8426a21c94220" - "c84220c9426a21ca4220" - "c94220ca426a21cb4220ca4220cb426a21cc4220cb4220cc426a21cd4220cc4220cd426a21ce4220cd4220ce426a21" - "cf4220ce4220cf426a21" - "d04220cf4220d0426a21d14220d04220d1426a21d24220d14220d2426a21d34220d24220d3426a21d44220d34220d4" - "426a21d54220d44220d5" - "426a21d64220d54220d6426a21d74220d64220d7426a21d84220d74220d8426a21d94220d84220d9426a21da4220d9" - "4220da426a21db4220da" - "4220db426a21dc4220db4220dc426a21dd4220dc4220dd426a21de4220dd4220de426a21df4220de4220df426a21e0" - "4220df4220e0426a21e1" - "4220e04220e1426a21e24220e14220e2426a21e34220e24220e3426a21e44220e34220e4426a21e54220e44220e542" - "6a21e64220e54220e642" - "6a21e74220e64220e7426a21e84220e74220e8426a21e94220e84220e9426a21ea4220e94220ea426a21eb4220ea42" - "20eb426a21ec4220eb42" - "20ec426a21ed4220ec4220ed426a21ee4220ed4220ee426a21ef4220ee4220ef426a21f04220ef4220f0426a21f142" - "20f04220f1426a21f242" - "20f14220f2426a21f34220f24220f3426a21f44220f34220f4426a21f54220f44220f5426a21f64220f54220f6426a" - "21f74220f64220f7426a" - "21f84220f74220f8426a21f94220f84220f9426a21fa4220f94220fa426a21fb4220fa4220fb426a21fc4220fb4220" - "fc426a21fd4220fc4220" - "fd426a21fe4220fd4220fe426a21ff4220fe4220ff426a21804320ff422080436a2181432080432081436a21824320" - "81432082436a21834320" - "82432083436a2184432083432084436a2185432084432085436a2186432085432086436a2187432086432087436a21" - "88432087432088436a21" - "89432088432089436a218a43208943208a436a218b43208a43208b436a218c43208b43208c436a218d43208c43208d" - "436a218e43208d43208e" - "436a218f43208e43208f436a219043208f432090436a2191432090432091436a2192432091432092436a2193432092" - "432093436a2194432093" - "432094436a2195432094432095436a2196432095432096436a2197432096432097436a2198432097432098436a2199" - "432098432099436a219a" - "43209943209a436a219b43209a43209b436a219c43209b43209c436a219d43209c43209d436a219e43209d43209e43" - "6a219f43209e43209f43" + "98416a2199412098412099416a219a41209941209a416a219b41209a41209b416a219c41209b41209c416a219d4120" + "9c41209d416a219e41209d41209e416a219f41209e41209f416a21a041209f4120a0416a21a14120a04120a1416a21" + "a24120a14120a2416a21a34120a24120a3416a21a44120a34120a4416a21a54120a44120a5416a21a64120a54120a6" + "416a21a74120a64120a7416a21a84120a74120a8416a21a94120a84120a9416a21aa4120a94120aa416a21ab4120aa" + "4120ab416a21ac4120ab4120ac416a21ad4120ac4120ad416a21ae4120ad4120ae416a21af4120ae4120af416a21b0" + "4120af4120b0416a21b14120b04120b1416a21b24120b14120b2416a21b34120b24120b3416a21b44120b34120b441" + "6a21b54120b44120b5416a21b64120b54120b6416a21b74120b64120b7416a21b84120b74120b8416a21b94120b841" + "20b9416a21ba4120b94120ba416a21bb4120ba4120bb416a21bc4120bb4120bc416a21bd4120bc4120bd416a21be41" + "20bd4120be416a21bf4120be4120bf416a21c04120bf4120c0416a21c14120c04120c1416a21c24120c14120c2416a" + "21c34120c24120c3416a21c44120c34120c4416a21c54120c44120c5416a21c64120c54120c6416a21c74120c64120" + "c7416a21c84120c74120c8416a21c94120c84120c9416a21ca4120c94120ca416a21cb4120ca4120cb416a21cc4120" + "cb4120cc416a21cd4120cc4120cd416a21ce4120cd4120ce416a21cf4120ce4120cf416a21d04120cf4120d0416a21" + "d14120d04120d1416a21d24120d14120d2416a21d34120d24120d3416a21d44120d34120d4416a21d54120d44120d5" + "416a21d64120d54120d6416a21d74120d64120d7416a21d84120d74120d8416a21d94120d84120d9416a21da4120d9" + "4120da416a21db4120da4120db416a21dc4120db4120dc416a21dd4120dc4120dd416a21de4120dd4120de416a21df" + "4120de4120df416a21e04120df4120e0416a21e14120e04120e1416a21e24120e14120e2416a21e34120e24120e341" + "6a21e44120e34120e4416a21e54120e44120e5416a21e64120e54120e6416a21e74120e64120e7416a21e84120e741" + "20e8416a21e94120e84120e9416a21ea4120e94120ea416a21eb4120ea4120eb416a21ec4120eb4120ec416a21ed41" + "20ec4120ed416a21ee4120ed4120ee416a21ef4120ee4120ef416a21f04120ef4120f0416a21f14120f04120f1416a" + "21f24120f14120f2416a21f34120f24120f3416a21f44120f34120f4416a21f54120f44120f5416a21f64120f54120" + "f6416a21f74120f64120f7416a21f84120f74120f8416a21f94120f84120f9416a21fa4120f94120fa416a21fb4120" + "fa4120fb416a21fc4120fb4120fc416a21fd4120fc4120fd416a21fe4120fd4120fe416a21ff4120fe4120ff416a21" + "804220ff412080426a2181422080422081426a2182422081422082426a2183422082422083426a2184422083422084" + "426a2185422084422085426a2186422085422086426a2187422086422087426a2188422087422088426a2189422088" + "422089426a218a42208942208a426a218b42208a42208b426a218c42208b42208c426a218d42208c42208d426a218e" + "42208d42208e426a218f42208e42208f426a219042208f422090426a2191422090422091426a219242209142209242" + "6a2193422092422093426a2194422093422094426a2195422094422095426a2196422095422096426a219742209642" + "2097426a2198422097422098426a2199422098422099426a219a42209942209a426a219b42209a42209b426a219c42" + "209b42209c426a219d42209c42209d426a219e42209d42209e426a219f42209e42209f426a21a042209f4220a0426a" + "21a14220a04220a1426a21a24220a14220a2426a21a34220a24220a3426a21a44220a34220a4426a21a54220a44220" + "a5426a21a64220a54220a6426a21a74220a64220a7426a21a84220a74220a8426a21a94220a84220a9426a21aa4220" + "a94220aa426a21ab4220aa4220ab426a21ac4220ab4220ac426a21ad4220ac4220ad426a21ae4220ad4220ae426a21" + "af4220ae4220af426a21b04220af4220b0426a21b14220b04220b1426a21b24220b14220b2426a21b34220b24220b3" + "426a21b44220b34220b4426a21b54220b44220b5426a21b64220b54220b6426a21b74220b64220b7426a21b84220b7" + "4220b8426a21b94220b84220b9426a21ba4220b94220ba426a21bb4220ba4220bb426a21bc4220bb4220bc426a21bd" + "4220bc4220bd426a21be4220bd4220be426a21bf4220be4220bf426a21c04220bf4220c0426a21c14220c04220c142" + "6a21c24220c14220c2426a21c34220c24220c3426a21c44220c34220c4426a21c54220c44220c5426a21c64220c542" + "20c6426a21c74220c64220c7426a21c84220c74220c8426a21c94220c84220c9426a21ca4220c94220ca426a21cb42" + "20ca4220cb426a21cc4220cb4220cc426a21cd4220cc4220cd426a21ce4220cd4220ce426a21cf4220ce4220cf426a" + "21d04220cf4220d0426a21d14220d04220d1426a21d24220d14220d2426a21d34220d24220d3426a21d44220d34220" + "d4426a21d54220d44220d5426a21d64220d54220d6426a21d74220d64220d7426a21d84220d74220d8426a21d94220" + "d84220d9426a21da4220d94220da426a21db4220da4220db426a21dc4220db4220dc426a21dd4220dc4220dd426a21" + "de4220dd4220de426a21df4220de4220df426a21e04220df4220e0426a21e14220e04220e1426a21e24220e14220e2" + "426a21e34220e24220e3426a21e44220e34220e4426a21e54220e44220e5426a21e64220e54220e6426a21e74220e6" + "4220e7426a21e84220e74220e8426a21e94220e84220e9426a21ea4220e94220ea426a21eb4220ea4220eb426a21ec" + "4220eb4220ec426a21ed4220ec4220ed426a21ee4220ed4220ee426a21ef4220ee4220ef426a21f04220ef4220f042" + "6a21f14220f04220f1426a21f24220f14220f2426a21f34220f24220f3426a21f44220f34220f4426a21f54220f442" + "20f5426a21f64220f54220f6426a21f74220f64220f7426a21f84220f74220f8426a21f94220f84220f9426a21fa42" + "20f94220fa426a21fb4220fa4220fb426a21fc4220fb4220fc426a21fd4220fc4220fd426a21fe4220fd4220fe426a" + "21ff4220fe4220ff426a21804320ff422080436a2181432080432081436a2182432081432082436a21834320824320" + "83436a2184432083432084436a2185432084432085436a2186432085432086436a2187432086432087436a21884320" + "87432088436a2189432088432089436a218a43208943208a436a218b43208a43208b436a218c43208b43208c436a21" + "8d43208c43208d436a218e43208d43208e436a218f43208e43208f436a219043208f432090436a2191432090432091" + "436a2192432091432092436a2193432092432093436a2194432093432094436a2195432094432095436a2196432095" + "432096436a2197432096432097436a2198432097432098436a2199432098432099436a219a43209943209a436a219b" + "43209a43209b436a219c43209b43209c436a219d43209c43209d436a219e43209d43209e436a219f43209e43209f43" "6a21a043209f4320a0436a21a14320a04320a1436a21a24320a14320a2436a21a34320a24320a3436a21a44320a343" - "20a4436a21a54320a443" - "20a5436a21a64320a54320a6436a21a74320a64320a7436a21a84320a74320a8436a21a94320a84320a9436a21aa43" - "20a94320aa436a21ab43" - "20aa4320ab436a21ac4320ab4320ac436a21ad4320ac4320ad436a21ae4320ad4320ae436a21af4320ae4320af436a" - "21b04320af4320b0436a" - "21b14320b04320b1436a21b24320b14320b2436a21b34320b24320b3436a21b44320b34320b4436a21b54320b44320" - "b5436a21b64320b54320" - "b6436a21b74320b64320b7436a21b84320b74320b8436a21b94320b84320b9436a21ba4320b94320ba436a21bb4320" - "ba4320bb436a21bc4320" - "bb4320bc436a21bd4320bc4320bd436a21be4320bd4320be436a21bf4320be4320bf436a21c04320bf4320c0436a21" - "c14320c04320c1436a21" - "c24320c14320c2436a21c34320c24320c3436a21c44320c34320c4436a21c54320c44320c5436a21c64320c54320c6" - "436a21c74320c64320c7" - "436a21c84320c74320c8436a21c94320c84320c9436a21ca4320c94320ca436a21cb4320ca4320cb436a21cc4320cb" - "4320cc436a21cd4320cc" - "4320cd436a21ce4320cd4320ce436a21cf4320ce4320cf436a21d04320cf4320d0436a21d14320d04320d1436a21d2" - "4320d14320d2436a21d3" - "4320d24320d3436a21d44320d34320d4436a21d54320d44320d5436a21d64320d54320d6436a21d74320d64320d743" - "6a21d84320d74320d843" - "6a21d94320d84320d9436a21da4320d94320da436a21db4320da4320db436a21dc4320db4320dc436a21dd4320dc43" - "20dd436a21de4320dd43" - "20de436a21df4320de4320df436a21e04320df4320e0436a21e14320e04320e1436a21e24320e14320e2436a21e343" - "20e24320e3436a21e443" - "20e34320e4436a21e54320e44320e5436a21e64320e54320e6436a21e74320e64320e7436a21e84320e74320e8436a" - "21e94320e84320e9436a" - "21ea4320e94320ea436a21eb4320ea4320eb436a21ec4320eb4320ec436a21ed4320ec4320ed436a21ee4320ed4320" - "ee436a21ef4320ee4320" - "ef436a21f04320ef4320f0436a21f14320f04320f1436a21f24320f14320f2436a21f34320f24320f3436a21f44320" - "f34320f4436a21f54320" - "f44320f5436a21f64320f54320f6436a21f74320f64320f7436a21f84320f74320f8436a21f94320f84320f9436a21" - "fa4320f94320fa436a21" - "fb4320fa4320fb436a21fc4320fb4320fc436a21fd4320fc4320fd436a21fe4320fd4320fe436a21ff4320fe4320ff" - "436a21804420ff432080" - "446a2181442080442081446a2182442081442082446a2183442082442083446a2184442083442084446a2185442084" - "442085446a2186442085" - "442086446a2187442086442087446a2188442087442088446a2189442088442089446a218a44208944208a446a218b" - "44208a44208b446a218c" - "44208b44208c446a218d44208c44208d446a218e44208d44208e446a218f44208e44208f446a219044208f44209044" - "6a219144209044209144" - "6a2192442091442092446a2193442092442093446a2194442093442094446a2195442094442095446a219644209544" - "2096446a219744209644" - "2097446a2198442097442098446a2199442098442099446a219a44209944209a446a219b44209a44209b446a219c44" - "209b44209c446a219d44" - "209c44209d446a219e44209d44209e446a219f44209e44209f446a21a044209f4420a0446a21a14420a04420a1446a" - "21a24420a14420a2446a" - "21a34420a24420a3446a21a44420a34420a4446a21a54420a44420a5446a21a64420a54420a6446a21a74420a64420" - "a7446a21a84420a74420" - "a8446a21a94420a84420a9446a21aa4420a94420aa446a21ab4420aa4420ab446a21ac4420ab4420ac446a21ad4420" - "ac4420ad446a21ae4420" - "ad4420ae446a21af4420ae4420af446a21b04420af4420b0446a21b14420b04420b1446a21b24420b14420b2446a21" - "b34420b24420b3446a21" - "b44420b34420b4446a21b54420b44420b5446a21b64420b54420b6446a21b74420b64420b7446a21b84420b74420b8" - "446a21b94420b84420b9" - "446a21ba4420b94420ba446a21bb4420ba4420bb446a21bc4420bb4420bc446a21bd4420bc4420bd446a21be4420bd" - "4420be446a21bf4420be" - "4420bf446a21c04420bf4420c0446a21c14420c04420c1446a21c24420c14420c2446a21c34420c24420c3446a21c4" - "4420c34420c4446a21c5" - "4420c44420c5446a21c64420c54420c6446a21c74420c64420c7446a21c84420c74420c8446a21c94420c84420c944" - "6a21ca4420c94420ca44" - "6a21cb4420ca4420cb446a21cc4420cb4420cc446a21cd4420cc4420cd446a21ce4420cd4420ce446a21cf4420ce44" - "20cf446a21d04420cf44" - "20d0446a21d14420d04420d1446a21d24420d14420d2446a21d34420d24420d3446a21d44420d34420d4446a21d544" - "20d44420d5446a21d644" - "20d54420d6446a21d74420d64420d7446a21d84420d74420d8446a21d94420d84420d9446a21da4420d94420da446a" - "21db4420da4420db446a" - "21dc4420db4420dc446a21dd4420dc4420dd446a21de4420dd4420de446a21df4420de4420df446a21e04420df4420" - "e0446a21e14420e04420" - "e1446a21e24420e14420e2446a21e34420e24420e3446a21e44420e34420e4446a21e54420e44420e5446a21e64420" - "e54420e6446a21e74420" - "e64420e7446a21e84420e74420e8446a21e94420e84420e9446a21ea4420e94420ea446a21eb4420ea4420eb446a21" - "ec4420eb4420ec446a21" - "ed4420ec4420ed446a21ee4420ed4420ee446a21ef4420ee4420ef446a21f04420ef4420f0446a21f14420f04420f1" - "446a21f24420f14420f2" - "446a21f34420f24420f3446a21f44420f34420f4446a21f54420f44420f5446a21f64420f54420f6446a21f74420f6" - "4420f7446a21f84420f7" - "4420f8446a21f94420f84420f9446a21fa4420f94420fa446a21fb4420fa4420fb446a21fc4420fb4420fc446a21fd" - "4420fc4420fd446a21fe" - "4420fd4420fe446a21ff4420fe4420ff446a21804520ff442080456a2181452080452081456a218245208145208245" - "6a218345208245208345" - "6a2184452083452084456a2185452084452085456a2186452085452086456a2187452086452087456a218845208745" - "2088456a218945208845" - "2089456a218a45208945208a456a218b45208a45208b456a218c45208b45208c456a218d45208c45208d456a218e45" - "208d45208e456a218f45" - "208e45208f456a219045208f452090456a2191452090452091456a2192452091452092456a2193452092452093456a" - "2194452093452094456a" - "2195452094452095456a2196452095452096456a2197452096452097456a2198452097452098456a21994520984520" - "99456a219a4520994520" - "9a456a219b45209a45209b456a219c45209b45209c456a219d45209c45209d456a219e45209d45209e456a219f4520" - "9e45209f456a21a04520" - "9f4520a0456a21a14520a04520a1456a21a24520a14520a2456a21a34520a24520a3456a21a44520a34520a4456a21" - "a54520a44520a5456a21" - "a64520a54520a6456a21a74520a64520a7456a21a84520a74520a8456a21a94520a84520a9456a21aa4520a94520aa" - "456a21ab4520aa4520ab" + "20a4436a21a54320a44320a5436a21a64320a54320a6436a21a74320a64320a7436a21a84320a74320a8436a21a943" + "20a84320a9436a21aa4320a94320aa436a21ab4320aa4320ab436a21ac4320ab4320ac436a21ad4320ac4320ad436a" + "21ae4320ad4320ae436a21af4320ae4320af436a21b04320af4320b0436a21b14320b04320b1436a21b24320b14320" + "b2436a21b34320b24320b3436a21b44320b34320b4436a21b54320b44320b5436a21b64320b54320b6436a21b74320" + "b64320b7436a21b84320b74320b8436a21b94320b84320b9436a21ba4320b94320ba436a21bb4320ba4320bb436a21" + "bc4320bb4320bc436a21bd4320bc4320bd436a21be4320bd4320be436a21bf4320be4320bf436a21c04320bf4320c0" + "436a21c14320c04320c1436a21c24320c14320c2436a21c34320c24320c3436a21c44320c34320c4436a21c54320c4" + "4320c5436a21c64320c54320c6436a21c74320c64320c7436a21c84320c74320c8436a21c94320c84320c9436a21ca" + "4320c94320ca436a21cb4320ca4320cb436a21cc4320cb4320cc436a21cd4320cc4320cd436a21ce4320cd4320ce43" + "6a21cf4320ce4320cf436a21d04320cf4320d0436a21d14320d04320d1436a21d24320d14320d2436a21d34320d243" + "20d3436a21d44320d34320d4436a21d54320d44320d5436a21d64320d54320d6436a21d74320d64320d7436a21d843" + "20d74320d8436a21d94320d84320d9436a21da4320d94320da436a21db4320da4320db436a21dc4320db4320dc436a" + "21dd4320dc4320dd436a21de4320dd4320de436a21df4320de4320df436a21e04320df4320e0436a21e14320e04320" + "e1436a21e24320e14320e2436a21e34320e24320e3436a21e44320e34320e4436a21e54320e44320e5436a21e64320" + "e54320e6436a21e74320e64320e7436a21e84320e74320e8436a21e94320e84320e9436a21ea4320e94320ea436a21" + "eb4320ea4320eb436a21ec4320eb4320ec436a21ed4320ec4320ed436a21ee4320ed4320ee436a21ef4320ee4320ef" + "436a21f04320ef4320f0436a21f14320f04320f1436a21f24320f14320f2436a21f34320f24320f3436a21f44320f3" + "4320f4436a21f54320f44320f5436a21f64320f54320f6436a21f74320f64320f7436a21f84320f74320f8436a21f9" + "4320f84320f9436a21fa4320f94320fa436a21fb4320fa4320fb436a21fc4320fb4320fc436a21fd4320fc4320fd43" + "6a21fe4320fd4320fe436a21ff4320fe4320ff436a21804420ff432080446a2181442080442081446a218244208144" + "2082446a2183442082442083446a2184442083442084446a2185442084442085446a2186442085442086446a218744" + "2086442087446a2188442087442088446a2189442088442089446a218a44208944208a446a218b44208a44208b446a" + "218c44208b44208c446a218d44208c44208d446a218e44208d44208e446a218f44208e44208f446a219044208f4420" + "90446a2191442090442091446a2192442091442092446a2193442092442093446a2194442093442094446a21954420" + "94442095446a2196442095442096446a2197442096442097446a2198442097442098446a2199442098442099446a21" + "9a44209944209a446a219b44209a44209b446a219c44209b44209c446a219d44209c44209d446a219e44209d44209e" + "446a219f44209e44209f446a21a044209f4420a0446a21a14420a04420a1446a21a24420a14420a2446a21a34420a2" + "4420a3446a21a44420a34420a4446a21a54420a44420a5446a21a64420a54420a6446a21a74420a64420a7446a21a8" + "4420a74420a8446a21a94420a84420a9446a21aa4420a94420aa446a21ab4420aa4420ab446a21ac4420ab4420ac44" + "6a21ad4420ac4420ad446a21ae4420ad4420ae446a21af4420ae4420af446a21b04420af4420b0446a21b14420b044" + "20b1446a21b24420b14420b2446a21b34420b24420b3446a21b44420b34420b4446a21b54420b44420b5446a21b644" + "20b54420b6446a21b74420b64420b7446a21b84420b74420b8446a21b94420b84420b9446a21ba4420b94420ba446a" + "21bb4420ba4420bb446a21bc4420bb4420bc446a21bd4420bc4420bd446a21be4420bd4420be446a21bf4420be4420" + "bf446a21c04420bf4420c0446a21c14420c04420c1446a21c24420c14420c2446a21c34420c24420c3446a21c44420" + "c34420c4446a21c54420c44420c5446a21c64420c54420c6446a21c74420c64420c7446a21c84420c74420c8446a21" + "c94420c84420c9446a21ca4420c94420ca446a21cb4420ca4420cb446a21cc4420cb4420cc446a21cd4420cc4420cd" + "446a21ce4420cd4420ce446a21cf4420ce4420cf446a21d04420cf4420d0446a21d14420d04420d1446a21d24420d1" + "4420d2446a21d34420d24420d3446a21d44420d34420d4446a21d54420d44420d5446a21d64420d54420d6446a21d7" + "4420d64420d7446a21d84420d74420d8446a21d94420d84420d9446a21da4420d94420da446a21db4420da4420db44" + "6a21dc4420db4420dc446a21dd4420dc4420dd446a21de4420dd4420de446a21df4420de4420df446a21e04420df44" + "20e0446a21e14420e04420e1446a21e24420e14420e2446a21e34420e24420e3446a21e44420e34420e4446a21e544" + "20e44420e5446a21e64420e54420e6446a21e74420e64420e7446a21e84420e74420e8446a21e94420e84420e9446a" + "21ea4420e94420ea446a21eb4420ea4420eb446a21ec4420eb4420ec446a21ed4420ec4420ed446a21ee4420ed4420" + "ee446a21ef4420ee4420ef446a21f04420ef4420f0446a21f14420f04420f1446a21f24420f14420f2446a21f34420" + "f24420f3446a21f44420f34420f4446a21f54420f44420f5446a21f64420f54420f6446a21f74420f64420f7446a21" + "f84420f74420f8446a21f94420f84420f9446a21fa4420f94420fa446a21fb4420fa4420fb446a21fc4420fb4420fc" + "446a21fd4420fc4420fd446a21fe4420fd4420fe446a21ff4420fe4420ff446a21804520ff442080456a2181452080" + "452081456a2182452081452082456a2183452082452083456a2184452083452084456a2185452084452085456a2186" + "452085452086456a2187452086452087456a2188452087452088456a2189452088452089456a218a45208945208a45" + "6a218b45208a45208b456a218c45208b45208c456a218d45208c45208d456a218e45208d45208e456a218f45208e45" + "208f456a219045208f452090456a2191452090452091456a2192452091452092456a2193452092452093456a219445" + "2093452094456a2195452094452095456a2196452095452096456a2197452096452097456a2198452097452098456a" + "2199452098452099456a219a45209945209a456a219b45209a45209b456a219c45209b45209c456a219d45209c4520" + "9d456a219e45209d45209e456a219f45209e45209f456a21a045209f4520a0456a21a14520a04520a1456a21a24520" + "a14520a2456a21a34520a24520a3456a21a44520a34520a4456a21a54520a44520a5456a21a64520a54520a6456a21" + "a74520a64520a7456a21a84520a74520a8456a21a94520a84520a9456a21aa4520a94520aa456a21ab4520aa4520ab" "456a21ac4520ab4520ac456a21ad4520ac4520ad456a21ae4520ad4520ae456a21af4520ae4520af456a21b04520af" - "4520b0456a21b14520b0" - "4520b1456a21b24520b14520b2456a21b34520b24520b3456a21b44520b34520b4456a21b54520b44520b5456a21b6" - "4520b54520b6456a21b7" - "4520b64520b7456a21b84520b74520b8456a21b94520b84520b9456a21ba4520b94520ba456a21bb4520ba4520bb45" - "6a21bc4520bb4520bc45" - "6a21bd4520bc4520bd456a21be4520bd4520be456a21bf4520be4520bf456a21c04520bf4520c0456a21c14520c045" - "20c1456a21c24520c145" - "20c2456a21c34520c24520c3456a21c44520c34520c4456a21c54520c44520c5456a21c64520c54520c6456a21c745" - "20c64520c7456a21c845" - "20c74520c8456a21c94520c84520c9456a21ca4520c94520ca456a21cb4520ca4520cb456a21cc4520cb4520cc456a" - "21cd4520cc4520cd456a" - "21ce4520cd4520ce456a21cf4520ce4520cf456a21d04520cf4520d0456a21d14520d04520d1456a21d24520d14520" - "d2456a21d34520d24520" - "d3456a21d44520d34520d4456a21d54520d44520d5456a21d64520d54520d6456a21d74520d64520d7456a21d84520" - "d74520d8456a21d94520" - "d84520d9456a21da4520d94520da456a21db4520da4520db456a21dc4520db4520dc456a21dd4520dc4520dd456a21" - "de4520dd4520de456a21" - "df4520de4520df456a21e04520df4520e0456a21e14520e04520e1456a21e24520e14520e2456a21e34520e24520e3" - "456a21e44520e34520e4" - "456a21e54520e44520e5456a21e64520e54520e6456a21e74520e64520e7456a21e84520e74520e8456a21e94520e8" - "4520e9456a21ea4520e9" - "4520ea456a21eb4520ea4520eb456a21ec4520eb4520ec456a21ed4520ec4520ed456a21ee4520ed4520ee456a21ef" - "4520ee4520ef456a21f0" - "4520ef4520f0456a21f14520f04520f1456a21f24520f14520f2456a21f34520f24520f3456a21f44520f34520f445" - "6a21f54520f44520f545" - "6a21f64520f54520f6456a21f74520f64520f7456a21f84520f74520f8456a21f94520f84520f9456a21fa4520f945" - "20fa456a21fb4520fa45" - "20fb456a21fc4520fb4520fc456a21fd4520fc4520fd456a21fe4520fd4520fe456a21ff4520fe4520ff456a218046" - "20ff452080466a218146" - "2080462081466a2182462081462082466a2183462082462083466a2184462083462084466a2185462084462085466a" - "2186462085462086466a" - "2187462086462087466a2188462087462088466a2189462088462089466a218a46208946208a466a218b46208a4620" - "8b466a218c46208b4620" - "8c466a218d46208c46208d466a218e46208d46208e466a218f46208e46208f466a219046208f462090466a21914620" - "90462091466a21924620" - "91462092466a2193462092462093466a2194462093462094466a2195462094462095466a2196462095462096466a21" - "97462096462097466a21" - "98462097462098466a2199462098462099466a219a46209946209a466a219b46209a46209b466a219c46209b46209c" - "466a219d46209c46209d" - "466a219e46209d46209e466a219f46209e46209f466a21a046209f4620a0466a21a14620a04620a1466a21a24620a1" - "4620a2466a21a34620a2" - "4620a3466a21a44620a34620a4466a21a54620a44620a5466a21a64620a54620a6466a21a74620a64620a7466a21a8" - "4620a74620a8466a21a9" - "4620a84620a9466a21aa4620a94620aa466a21ab4620aa4620ab466a21ac4620ab4620ac466a21ad4620ac4620ad46" - "6a21ae4620ad4620ae46" - "6a21af4620ae4620af466a21b04620af4620b0466a21b14620b04620b1466a21b24620b14620b2466a21b34620b246" - "20b3466a21b44620b346" - "20b4466a21b54620b44620b5466a21b64620b54620b6466a21b74620b64620b7466a21b84620b74620b8466a21b946" - "20b84620b9466a21ba46" - "20b94620ba466a21bb4620ba4620bb466a21bc4620bb4620bc466a21bd4620bc4620bd466a21be4620bd4620be466a" - "21bf4620be4620bf466a" - "21c04620bf4620c0466a21c14620c04620c1466a21c24620c14620c2466a21c34620c24620c3466a21c44620c34620" - "c4466a21c54620c44620" - "c5466a21c64620c54620c6466a21c74620c64620c7466a21c84620c74620c8466a21c94620c84620c9466a21ca4620" - "c94620ca466a21cb4620" - "ca4620cb466a21cc4620cb4620cc466a21cd4620cc4620cd466a21ce4620cd4620ce466a21cf4620ce4620cf466a21" - "d04620cf4620d0466a21" - "d14620d04620d1466a21d24620d14620d2466a21d34620d24620d3466a21d44620d34620d4466a21d54620d44620d5" - "466a21d64620d54620d6" - "466a21d74620d64620d7466a21d84620d74620d8466a21d94620d84620d9466a21da4620d94620da466a21db4620da" - "4620db466a21dc4620db" - "4620dc466a21dd4620dc4620dd466a21de4620dd4620de466a21df4620de4620df466a21e04620df4620e0466a21e1" - "4620e04620e1466a21e2" - "4620e14620e2466a21e34620e24620e3466a21e44620e34620e4466a21e54620e44620e5466a21e64620e54620e646" - "6a21e74620e64620e746" - "6a21e84620e74620e8466a21e94620e84620e9466a21ea4620e94620ea466a21eb4620ea4620eb466a21ec4620eb46" - "20ec466a21ed4620ec46" - "20ed466a21ee4620ed4620ee466a21ef4620ee4620ef466a21f04620ef4620f0466a21f14620f04620f1466a21f246" - "20f14620f2466a21f346" - "20f24620f3466a21f44620f34620f4466a21f54620f44620f5466a21f64620f54620f6466a21f74620f64620f7466a" - "21f84620f74620f8466a" - "21f94620f84620f9466a21fa4620f94620fa466a21fb4620fa4620fb466a21fc4620fb4620fc466a21fd4620fc4620" - "fd466a21fe4620fd4620" - "fe466a21ff4620fe4620ff466a21804720ff462080476a2181472080472081476a2182472081472082476a21834720" - "82472083476a21844720" - "83472084476a2185472084472085476a2186472085472086476a2187472086472087476a2188472087472088476a21" - "89472088472089476a21" - "8a47208947208a476a218b47208a47208b476a218c47208b47208c476a218d47208c47208d476a218e47208d47208e" - "476a218f47208e47208f" - "476a219047208f472090476a2191472090472091476a2192472091472092476a2193472092472093476a2194472093" - "472094476a2195472094" - "472095476a2196472095472096476a2197472096472097476a2198472097472098476a2199472098472099476a219a" - "47209947209a476a219b" - "47209a47209b476a219c47209b47209c476a219d47209c47209d476a219e47209d47209e476a219f47209e47209f47" - "6a21a047209f4720a047" - "6a21a14720a04720a1476a21a24720a14720a2476a21a34720a24720a3476a21a44720a34720a4476a21a54720a447" - "20a5476a21a64720a547" - "20a6476a21a74720a64720a7476a21a84720a74720a8476a21a94720a84720a9476a21aa4720a94720aa476a21ab47" - "20aa4720ab476a21ac47" - "20ab4720ac476a21ad4720ac4720ad476a21ae4720ad4720ae476a21af4720ae4720af476a21b04720af4720b0476a" - "21b14720b04720b1476a" - "21b24720b14720b2476a21b34720b24720b3476a21b44720b34720b4476a21b54720b44720b5476a21b64720b54720" - "b6476a21b74720b64720" + "4520b0456a21b14520b04520b1456a21b24520b14520b2456a21b34520b24520b3456a21b44520b34520b4456a21b5" + "4520b44520b5456a21b64520b54520b6456a21b74520b64520b7456a21b84520b74520b8456a21b94520b84520b945" + "6a21ba4520b94520ba456a21bb4520ba4520bb456a21bc4520bb4520bc456a21bd4520bc4520bd456a21be4520bd45" + "20be456a21bf4520be4520bf456a21c04520bf4520c0456a21c14520c04520c1456a21c24520c14520c2456a21c345" + "20c24520c3456a21c44520c34520c4456a21c54520c44520c5456a21c64520c54520c6456a21c74520c64520c7456a" + "21c84520c74520c8456a21c94520c84520c9456a21ca4520c94520ca456a21cb4520ca4520cb456a21cc4520cb4520" + "cc456a21cd4520cc4520cd456a21ce4520cd4520ce456a21cf4520ce4520cf456a21d04520cf4520d0456a21d14520" + "d04520d1456a21d24520d14520d2456a21d34520d24520d3456a21d44520d34520d4456a21d54520d44520d5456a21" + "d64520d54520d6456a21d74520d64520d7456a21d84520d74520d8456a21d94520d84520d9456a21da4520d94520da" + "456a21db4520da4520db456a21dc4520db4520dc456a21dd4520dc4520dd456a21de4520dd4520de456a21df4520de" + "4520df456a21e04520df4520e0456a21e14520e04520e1456a21e24520e14520e2456a21e34520e24520e3456a21e4" + "4520e34520e4456a21e54520e44520e5456a21e64520e54520e6456a21e74520e64520e7456a21e84520e74520e845" + "6a21e94520e84520e9456a21ea4520e94520ea456a21eb4520ea4520eb456a21ec4520eb4520ec456a21ed4520ec45" + "20ed456a21ee4520ed4520ee456a21ef4520ee4520ef456a21f04520ef4520f0456a21f14520f04520f1456a21f245" + "20f14520f2456a21f34520f24520f3456a21f44520f34520f4456a21f54520f44520f5456a21f64520f54520f6456a" + "21f74520f64520f7456a21f84520f74520f8456a21f94520f84520f9456a21fa4520f94520fa456a21fb4520fa4520" + "fb456a21fc4520fb4520fc456a21fd4520fc4520fd456a21fe4520fd4520fe456a21ff4520fe4520ff456a21804620" + "ff452080466a2181462080462081466a2182462081462082466a2183462082462083466a2184462083462084466a21" + "85462084462085466a2186462085462086466a2187462086462087466a2188462087462088466a2189462088462089" + "466a218a46208946208a466a218b46208a46208b466a218c46208b46208c466a218d46208c46208d466a218e46208d" + "46208e466a218f46208e46208f466a219046208f462090466a2191462090462091466a2192462091462092466a2193" + "462092462093466a2194462093462094466a2195462094462095466a2196462095462096466a219746209646209746" + "6a2198462097462098466a2199462098462099466a219a46209946209a466a219b46209a46209b466a219c46209b46" + "209c466a219d46209c46209d466a219e46209d46209e466a219f46209e46209f466a21a046209f4620a0466a21a146" + "20a04620a1466a21a24620a14620a2466a21a34620a24620a3466a21a44620a34620a4466a21a54620a44620a5466a" + "21a64620a54620a6466a21a74620a64620a7466a21a84620a74620a8466a21a94620a84620a9466a21aa4620a94620" + "aa466a21ab4620aa4620ab466a21ac4620ab4620ac466a21ad4620ac4620ad466a21ae4620ad4620ae466a21af4620" + "ae4620af466a21b04620af4620b0466a21b14620b04620b1466a21b24620b14620b2466a21b34620b24620b3466a21" + "b44620b34620b4466a21b54620b44620b5466a21b64620b54620b6466a21b74620b64620b7466a21b84620b74620b8" + "466a21b94620b84620b9466a21ba4620b94620ba466a21bb4620ba4620bb466a21bc4620bb4620bc466a21bd4620bc" + "4620bd466a21be4620bd4620be466a21bf4620be4620bf466a21c04620bf4620c0466a21c14620c04620c1466a21c2" + "4620c14620c2466a21c34620c24620c3466a21c44620c34620c4466a21c54620c44620c5466a21c64620c54620c646" + "6a21c74620c64620c7466a21c84620c74620c8466a21c94620c84620c9466a21ca4620c94620ca466a21cb4620ca46" + "20cb466a21cc4620cb4620cc466a21cd4620cc4620cd466a21ce4620cd4620ce466a21cf4620ce4620cf466a21d046" + "20cf4620d0466a21d14620d04620d1466a21d24620d14620d2466a21d34620d24620d3466a21d44620d34620d4466a" + "21d54620d44620d5466a21d64620d54620d6466a21d74620d64620d7466a21d84620d74620d8466a21d94620d84620" + "d9466a21da4620d94620da466a21db4620da4620db466a21dc4620db4620dc466a21dd4620dc4620dd466a21de4620" + "dd4620de466a21df4620de4620df466a21e04620df4620e0466a21e14620e04620e1466a21e24620e14620e2466a21" + "e34620e24620e3466a21e44620e34620e4466a21e54620e44620e5466a21e64620e54620e6466a21e74620e64620e7" + "466a21e84620e74620e8466a21e94620e84620e9466a21ea4620e94620ea466a21eb4620ea4620eb466a21ec4620eb" + "4620ec466a21ed4620ec4620ed466a21ee4620ed4620ee466a21ef4620ee4620ef466a21f04620ef4620f0466a21f1" + "4620f04620f1466a21f24620f14620f2466a21f34620f24620f3466a21f44620f34620f4466a21f54620f44620f546" + "6a21f64620f54620f6466a21f74620f64620f7466a21f84620f74620f8466a21f94620f84620f9466a21fa4620f946" + "20fa466a21fb4620fa4620fb466a21fc4620fb4620fc466a21fd4620fc4620fd466a21fe4620fd4620fe466a21ff46" + "20fe4620ff466a21804720ff462080476a2181472080472081476a2182472081472082476a2183472082472083476a" + "2184472083472084476a2185472084472085476a2186472085472086476a2187472086472087476a21884720874720" + "88476a2189472088472089476a218a47208947208a476a218b47208a47208b476a218c47208b47208c476a218d4720" + "8c47208d476a218e47208d47208e476a218f47208e47208f476a219047208f472090476a2191472090472091476a21" + "92472091472092476a2193472092472093476a2194472093472094476a2195472094472095476a2196472095472096" + "476a2197472096472097476a2198472097472098476a2199472098472099476a219a47209947209a476a219b47209a" + "47209b476a219c47209b47209c476a219d47209c47209d476a219e47209d47209e476a219f47209e47209f476a21a0" + "47209f4720a0476a21a14720a04720a1476a21a24720a14720a2476a21a34720a24720a3476a21a44720a34720a447" + "6a21a54720a44720a5476a21a64720a54720a6476a21a74720a64720a7476a21a84720a74720a8476a21a94720a847" + "20a9476a21aa4720a94720aa476a21ab4720aa4720ab476a21ac4720ab4720ac476a21ad4720ac4720ad476a21ae47" + "20ad4720ae476a21af4720ae4720af476a21b04720af4720b0476a21b14720b04720b1476a21b24720b14720b2476a" + "21b34720b24720b3476a21b44720b34720b4476a21b54720b44720b5476a21b64720b54720b6476a21b74720b64720" "b7476a21b84720b74720b8476a21b94720b84720b9476a21ba4720b94720ba476a21bb4720ba4720bb476a21bc4720" - "bb4720bc476a21bd4720" - "bc4720bd476a21be4720bd4720be476a21bf4720be4720bf476a21c04720bf4720c0476a21c14720c04720c1476a21" - "c24720c14720c2476a21" - "c34720c24720c3476a21c44720c34720c4476a21c54720c44720c5476a21c64720c54720c6476a21c74720c64720c7" - "476a21c84720c74720c8" - "476a21c94720c84720c9476a21ca4720c94720ca476a21cb4720ca4720cb476a21cc4720cb4720cc476a21cd4720cc" - "4720cd476a21ce4720cd" - "4720ce476a21cf4720ce4720cf476a21d04720cf4720d0476a21d14720d04720d1476a21d24720d14720d2476a21d3" - "4720d24720d3476a21d4" - "4720d34720d4476a21d54720d44720d5476a21d64720d54720d6476a21d74720d64720d7476a21d84720d74720d847" - "6a21d94720d84720d947" - "6a21da4720d94720da476a21db4720da4720db476a21dc4720db4720dc476a21dd4720dc4720dd476a21de4720dd47" - "20de476a21df4720de47" - "20df476a21e04720df4720e0476a21e14720e04720e1476a21e24720e14720e2476a21e34720e24720e3476a21e447" - "20e34720e4476a21e547" - "20e44720e5476a21e64720e54720e6476a21e74720e64720e7476a21e84720e74720e8476a21e94720e84720e9476a" - "21ea4720e94720ea476a" - "21eb4720ea4720eb476a21ec4720eb4720ec476a21ed4720ec4720ed476a21ee4720ed4720ee476a21ef4720ee4720" - "ef476a21f04720ef4720" - "f0476a21f14720f04720f1476a21f24720f14720f2476a21f34720f24720f3476a21f44720f34720f4476a21f54720" - "f44720f5476a21f64720" - "f54720f6476a21f74720f64720f7476a21f84720f74720f8476a21f94720f84720f9476a21fa4720f94720fa476a21" - "fb4720fa4720fb476a21" - "fc4720fb4720fc476a21fd4720fc4720fd476a21fe4720fd4720fe476a21ff4720fe4720ff476a21804820ff472080" - "486a2181482080482081" - "486a2182482081482082486a2183482082482083486a2184482083482084486a2185482084482085486a2186482085" - "482086486a2187482086" - "482087486a2188482087482088486a2189482088482089486a218a48208948208a486a218b48208a48208b486a218c" - "48208b48208c486a218d" - "48208c48208d486a218e48208d48208e486a218f48208e48208f486a219048208f482090486a219148209048209148" - "6a219248209148209248" - "6a2193482092482093486a2194482093482094486a2195482094482095486a2196482095482096486a219748209648" - "2097486a219848209748" - "2098486a2199482098482099486a219a48209948209a486a219b48209a48209b486a219c48209b48209c486a219d48" - "209c48209d486a219e48" - "209d48209e486a219f48209e48209f486a21a048209f4820a0486a21a14820a04820a1486a21a24820a14820a2486a" - "21a34820a24820a3486a" - "21a44820a34820a4486a21a54820a44820a5486a21a64820a54820a6486a21a74820a64820a7486a21a84820a74820" - "a8486a21a94820a84820" - "a9486a21aa4820a94820aa486a21ab4820aa4820ab486a21ac4820ab4820ac486a21ad4820ac4820ad486a21ae4820" - "ad4820ae486a21af4820" - "ae4820af486a21b04820af4820b0486a21b14820b04820b1486a21b24820b14820b2486a21b34820b24820b3486a21" - "b44820b34820b4486a21" - "b54820b44820b5486a21b64820b54820b6486a21b74820b64820b7486a21b84820b74820b8486a21b94820b84820b9" - "486a21ba4820b94820ba" - "486a21bb4820ba4820bb486a21bc4820bb4820bc486a21bd4820bc4820bd486a21be4820bd4820be486a21bf4820be" - "4820bf486a21c04820bf" - "4820c0486a21c14820c04820c1486a21c24820c14820c2486a21c34820c24820c3486a21c44820c34820c4486a21c5" - "4820c44820c5486a21c6" - "4820c54820c6486a21c74820c64820c7486a21c84820c74820c8486a21c94820c84820c9486a21ca4820c94820ca48" - "6a21cb4820ca4820cb48" - "6a21cc4820cb4820cc486a21cd4820cc4820cd486a21ce4820cd4820ce486a21cf4820ce4820cf486a21d04820cf48" - "20d0486a21d14820d048" - "20d1486a21d24820d14820d2486a21d34820d24820d3486a21d44820d34820d4486a21d54820d44820d5486a21d648" - "20d54820d6486a21d748" - "20d64820d7486a21d84820d74820d8486a21d94820d84820d9486a21da4820d94820da486a21db4820da4820db486a" - "21dc4820db4820dc486a" - "21dd4820dc4820dd486a21de4820dd4820de486a21df4820de4820df486a21e04820df4820e0486a21e14820e04820" - "e1486a21e24820e14820" - "e2486a21e34820e24820e3486a21e44820e34820e4486a21e54820e44820e5486a21e64820e54820e6486a21e74820" - "e64820e7486a21e84820" - "e74820e8486a21e94820e84820e9486a21ea4820e94820ea486a21eb4820ea4820eb486a21ec4820eb4820ec486a21" - "ed4820ec4820ed486a21" - "ee4820ed4820ee486a21ef4820ee4820ef486a21f04820ef4820f0486a21f14820f04820f1486a21f24820f14820f2" - "486a21f34820f24820f3" - "486a21f44820f34820f4486a21f54820f44820f5486a21f64820f54820f6486a21f74820f64820f7486a21f84820f7" - "4820f8486a21f94820f8" - "4820f9486a21fa4820f94820fa486a21fb4820fa4820fb486a21fc4820fb4820fc486a21fd4820fc4820fd486a21fe" - "4820fd4820fe486a21ff" - "4820fe4820ff486a21804920ff482080496a2181492080492081496a2182492081492082496a218349208249208349" - "6a218449208349208449" - "6a2185492084492085496a2186492085492086496a2187492086492087496a2188492087492088496a218949208849" - "2089496a218a49208949" - "208a496a218b49208a49208b496a218c49208b49208c496a218d49208c49208d496a218e49208d49208e496a218f49" - "208e49208f496a219049" - "208f492090496a2191492090492091496a2192492091492092496a2193492092492093496a2194492093492094496a" - "2195492094492095496a" - "2196492095492096496a2197492096492097496a2198492097492098496a2199492098492099496a219a4920994920" - "9a496a219b49209a4920" - "9b496a219c49209b49209c496a219d49209c49209d496a219e49209d49209e496a219f49209e49209f496a21a04920" - "9f4920a0496a21a14920" - "a04920a1496a21a24920a14920a2496a21a34920a24920a3496a21a44920a34920a4496a21a54920a44920a5496a21" - "a64920a54920a6496a21" - "a74920a64920a7496a21a84920a74920a8496a21a94920a84920a9496a21aa4920a94920aa496a21ab4920aa4920ab" - "496a21ac4920ab4920ac" - "496a21ad4920ac4920ad496a21ae4920ad4920ae496a21af4920ae4920af496a21b04920af4920b0496a21b14920b0" - "4920b1496a21b24920b1" - "4920b2496a21b34920b24920b3496a21b44920b34920b4496a21b54920b44920b5496a21b64920b54920b6496a21b7" - "4920b64920b7496a21b8" - "4920b74920b8496a21b94920b84920b9496a21ba4920b94920ba496a21bb4920ba4920bb496a21bc4920bb4920bc49" - "6a21bd4920bc4920bd49" - "6a21be4920bd4920be496a21bf4920be4920bf496a21c04920bf4920c0496a21c14920c04920c1496a21c24920c149" - "20c2496a21c34920c249" + "bb4720bc476a21bd4720bc4720bd476a21be4720bd4720be476a21bf4720be4720bf476a21c04720bf4720c0476a21" + "c14720c04720c1476a21c24720c14720c2476a21c34720c24720c3476a21c44720c34720c4476a21c54720c44720c5" + "476a21c64720c54720c6476a21c74720c64720c7476a21c84720c74720c8476a21c94720c84720c9476a21ca4720c9" + "4720ca476a21cb4720ca4720cb476a21cc4720cb4720cc476a21cd4720cc4720cd476a21ce4720cd4720ce476a21cf" + "4720ce4720cf476a21d04720cf4720d0476a21d14720d04720d1476a21d24720d14720d2476a21d34720d24720d347" + "6a21d44720d34720d4476a21d54720d44720d5476a21d64720d54720d6476a21d74720d64720d7476a21d84720d747" + "20d8476a21d94720d84720d9476a21da4720d94720da476a21db4720da4720db476a21dc4720db4720dc476a21dd47" + "20dc4720dd476a21de4720dd4720de476a21df4720de4720df476a21e04720df4720e0476a21e14720e04720e1476a" + "21e24720e14720e2476a21e34720e24720e3476a21e44720e34720e4476a21e54720e44720e5476a21e64720e54720" + "e6476a21e74720e64720e7476a21e84720e74720e8476a21e94720e84720e9476a21ea4720e94720ea476a21eb4720" + "ea4720eb476a21ec4720eb4720ec476a21ed4720ec4720ed476a21ee4720ed4720ee476a21ef4720ee4720ef476a21" + "f04720ef4720f0476a21f14720f04720f1476a21f24720f14720f2476a21f34720f24720f3476a21f44720f34720f4" + "476a21f54720f44720f5476a21f64720f54720f6476a21f74720f64720f7476a21f84720f74720f8476a21f94720f8" + "4720f9476a21fa4720f94720fa476a21fb4720fa4720fb476a21fc4720fb4720fc476a21fd4720fc4720fd476a21fe" + "4720fd4720fe476a21ff4720fe4720ff476a21804820ff472080486a2181482080482081486a218248208148208248" + "6a2183482082482083486a2184482083482084486a2185482084482085486a2186482085482086486a218748208648" + "2087486a2188482087482088486a2189482088482089486a218a48208948208a486a218b48208a48208b486a218c48" + "208b48208c486a218d48208c48208d486a218e48208d48208e486a218f48208e48208f486a219048208f482090486a" + "2191482090482091486a2192482091482092486a2193482092482093486a2194482093482094486a21954820944820" + "95486a2196482095482096486a2197482096482097486a2198482097482098486a2199482098482099486a219a4820" + "9948209a486a219b48209a48209b486a219c48209b48209c486a219d48209c48209d486a219e48209d48209e486a21" + "9f48209e48209f486a21a048209f4820a0486a21a14820a04820a1486a21a24820a14820a2486a21a34820a24820a3" + "486a21a44820a34820a4486a21a54820a44820a5486a21a64820a54820a6486a21a74820a64820a7486a21a84820a7" + "4820a8486a21a94820a84820a9486a21aa4820a94820aa486a21ab4820aa4820ab486a21ac4820ab4820ac486a21ad" + "4820ac4820ad486a21ae4820ad4820ae486a21af4820ae4820af486a21b04820af4820b0486a21b14820b04820b148" + "6a21b24820b14820b2486a21b34820b24820b3486a21b44820b34820b4486a21b54820b44820b5486a21b64820b548" + "20b6486a21b74820b64820b7486a21b84820b74820b8486a21b94820b84820b9486a21ba4820b94820ba486a21bb48" + "20ba4820bb486a21bc4820bb4820bc486a21bd4820bc4820bd486a21be4820bd4820be486a21bf4820be4820bf486a" + "21c04820bf4820c0486a21c14820c04820c1486a21c24820c14820c2486a21c34820c24820c3486a21c44820c34820" + "c4486a21c54820c44820c5486a21c64820c54820c6486a21c74820c64820c7486a21c84820c74820c8486a21c94820" + "c84820c9486a21ca4820c94820ca486a21cb4820ca4820cb486a21cc4820cb4820cc486a21cd4820cc4820cd486a21" + "ce4820cd4820ce486a21cf4820ce4820cf486a21d04820cf4820d0486a21d14820d04820d1486a21d24820d14820d2" + "486a21d34820d24820d3486a21d44820d34820d4486a21d54820d44820d5486a21d64820d54820d6486a21d74820d6" + "4820d7486a21d84820d74820d8486a21d94820d84820d9486a21da4820d94820da486a21db4820da4820db486a21dc" + "4820db4820dc486a21dd4820dc4820dd486a21de4820dd4820de486a21df4820de4820df486a21e04820df4820e048" + "6a21e14820e04820e1486a21e24820e14820e2486a21e34820e24820e3486a21e44820e34820e4486a21e54820e448" + "20e5486a21e64820e54820e6486a21e74820e64820e7486a21e84820e74820e8486a21e94820e84820e9486a21ea48" + "20e94820ea486a21eb4820ea4820eb486a21ec4820eb4820ec486a21ed4820ec4820ed486a21ee4820ed4820ee486a" + "21ef4820ee4820ef486a21f04820ef4820f0486a21f14820f04820f1486a21f24820f14820f2486a21f34820f24820" + "f3486a21f44820f34820f4486a21f54820f44820f5486a21f64820f54820f6486a21f74820f64820f7486a21f84820" + "f74820f8486a21f94820f84820f9486a21fa4820f94820fa486a21fb4820fa4820fb486a21fc4820fb4820fc486a21" + "fd4820fc4820fd486a21fe4820fd4820fe486a21ff4820fe4820ff486a21804920ff482080496a2181492080492081" + "496a2182492081492082496a2183492082492083496a2184492083492084496a2185492084492085496a2186492085" + "492086496a2187492086492087496a2188492087492088496a2189492088492089496a218a49208949208a496a218b" + "49208a49208b496a218c49208b49208c496a218d49208c49208d496a218e49208d49208e496a218f49208e49208f49" + "6a219049208f492090496a2191492090492091496a2192492091492092496a2193492092492093496a219449209349" + "2094496a2195492094492095496a2196492095492096496a2197492096492097496a2198492097492098496a219949" + "2098492099496a219a49209949209a496a219b49209a49209b496a219c49209b49209c496a219d49209c49209d496a" + "219e49209d49209e496a219f49209e49209f496a21a049209f4920a0496a21a14920a04920a1496a21a24920a14920" + "a2496a21a34920a24920a3496a21a44920a34920a4496a21a54920a44920a5496a21a64920a54920a6496a21a74920" + "a64920a7496a21a84920a74920a8496a21a94920a84920a9496a21aa4920a94920aa496a21ab4920aa4920ab496a21" + "ac4920ab4920ac496a21ad4920ac4920ad496a21ae4920ad4920ae496a21af4920ae4920af496a21b04920af4920b0" + "496a21b14920b04920b1496a21b24920b14920b2496a21b34920b24920b3496a21b44920b34920b4496a21b54920b4" + "4920b5496a21b64920b54920b6496a21b74920b64920b7496a21b84920b74920b8496a21b94920b84920b9496a21ba" + "4920b94920ba496a21bb4920ba4920bb496a21bc4920bb4920bc496a21bd4920bc4920bd496a21be4920bd4920be49" + "6a21bf4920be4920bf496a21c04920bf4920c0496a21c14920c04920c1496a21c24920c14920c2496a21c34920c249" "20c3496a21c44920c34920c4496a21c54920c44920c5496a21c64920c54920c6496a21c74920c64920c7496a21c849" - "20c74920c8496a21c949" - "20c84920c9496a21ca4920c94920ca496a21cb4920ca4920cb496a21cc4920cb4920cc496a21cd4920cc4920cd496a" - "21ce4920cd4920ce496a" - "21cf4920ce4920cf496a21d04920cf4920d0496a21d14920d04920d1496a21d24920d14920d2496a21d34920d24920" - "d3496a21d44920d34920" - "d4496a21d54920d44920d5496a21d64920d54920d6496a21d74920d64920d7496a21d84920d74920d8496a21d94920" - "d84920d9496a21da4920" - "d94920da496a21db4920da4920db496a21dc4920db4920dc496a21dd4920dc4920dd496a21de4920dd4920de496a21" - "df4920de4920df496a21" - "e04920df4920e0496a21e14920e04920e1496a21e24920e14920e2496a21e34920e24920e3496a21e44920e34920e4" - "496a21e54920e44920e5" - "496a21e64920e54920e6496a21e74920e64920e7496a21e84920e74920e8496a21e94920e84920e9496a21ea4920e9" - "4920ea496a21eb4920ea" - "4920eb496a21ec4920eb4920ec496a21ed4920ec4920ed496a21ee4920ed4920ee496a21ef4920ee4920ef496a21f0" - "4920ef4920f0496a21f1" - "4920f04920f1496a21f24920f14920f2496a21f34920f24920f3496a21f44920f34920f4496a21f54920f44920f549" - "6a21f64920f54920f649" - "6a21f74920f64920f7496a21f84920f74920f8496a21f94920f84920f9496a21fa4920f94920fa496a21fb4920fa49" - "20fb496a21fc4920fb49" - "20fc496a21fd4920fc4920fd496a21fe4920fd4920fe496a21ff4920fe4920ff496a21804a20ff4920804a6a21814a" - "20804a20814a6a21824a" - "20814a20824a6a21834a20824a20834a6a21844a20834a20844a6a21854a20844a20854a6a21864a20854a20864a6a" - "21874a20864a20874a6a" - "21884a20874a20884a6a21894a20884a20894a6a218a4a20894a208a4a6a218b4a208a4a208b4a6a218c4a208b4a20" - "8c4a6a218d4a208c4a20" - "8d4a6a218e4a208d4a208e4a6a218f4a208e4a208f4a6a21904a208f4a20904a6a21914a20904a20914a6a21924a20" - "914a20924a6a21934a20" - "924a20934a6a21944a20934a20944a6a21954a20944a20954a6a21964a20954a20964a6a21974a20964a20974a6a21" - "984a20974a20984a6a21" - "994a20984a20994a6a219a4a20994a209a4a6a219b4a209a4a209b4a6a219c4a209b4a209c4a6a219d4a209c4a209d" - "4a6a219e4a209d4a209e" - "4a6a219f4a209e4a209f4a6a21a04a209f4a20a04a6a21a14a20a04a20a14a6a21a24a20a14a20a24a6a21a34a20a2" - "4a20a34a6a21a44a20a3" - "4a20a44a6a21a54a20a44a20a54a6a21a64a20a54a20a64a6a21a74a20a64a20a74a6a21a84a20a74a20a84a6a21a9" - "4a20a84a20a94a6a21aa" - "4a20a94a20aa4a6a21ab4a20aa4a20ab4a6a21ac4a20ab4a20ac4a6a21ad4a20ac4a20ad4a6a21ae4a20ad4a20ae4a" - "6a21af4a20ae4a20af4a" - "6a21b04a20af4a20b04a6a21b14a20b04a20b14a6a21b24a20b14a20b24a6a21b34a20b24a20b34a6a21b44a20b34a" - "20b44a6a21b54a20b44a" - "20b54a6a21b64a20b54a20b64a6a21b74a20b64a20b74a6a21b84a20b74a20b84a6a21b94a20b84a20b94a6a21ba4a" - "20b94a20ba4a6a21bb4a" - "20ba4a20bb4a6a21bc4a20bb4a20bc4a6a21bd4a20bc4a20bd4a6a21be4a20bd4a20be4a6a21bf4a20be4a20bf4a6a" - "21c04a20bf4a20c04a6a" - "21c14a20c04a20c14a6a21c24a20c14a20c24a6a21c34a20c24a20c34a6a21c44a20c34a20c44a6a21c54a20c44a20" - "c54a6a21c64a20c54a20" - "c64a6a21c74a20c64a20c74a6a21c84a20c74a20c84a6a21c94a20c84a20c94a6a21ca4a20c94a20ca4a6a21cb4a20" - "ca4a20cb4a6a21cc4a20" - "cb4a20cc4a6a21cd4a20cc4a20cd4a6a21ce4a20cd4a20ce4a6a21cf4a20ce4a20cf4a6a21d04a20cf4a20d04a6a21" - "d14a20d04a20d14a6a21" - "d24a20d14a20d24a6a21d34a20d24a20d34a6a21d44a20d34a20d44a6a21d54a20d44a20d54a6a21d64a20d54a20d6" - "4a6a21d74a20d64a20d7" - "4a6a21d84a20d74a20d84a6a21d94a20d84a20d94a6a21da4a20d94a20da4a6a21db4a20da4a20db4a6a21dc4a20db" - "4a20dc4a6a21dd4a20dc" - "4a20dd4a6a21de4a20dd4a20de4a6a21df4a20de4a20df4a6a21e04a20df4a20e04a6a21e14a20e04a20e14a6a21e2" - "4a20e14a20e24a6a21e3" - "4a20e24a20e34a6a21e44a20e34a20e44a6a21e54a20e44a20e54a6a21e64a20e54a20e64a6a21e74a20e64a20e74a" - "6a21e84a20e74a20e84a" - "6a21e94a20e84a20e94a6a21ea4a20e94a20ea4a6a21eb4a20ea4a20eb4a6a21ec4a20eb4a20ec4a6a21ed4a20ec4a" - "20ed4a6a21ee4a20ed4a" - "20ee4a6a21ef4a20ee4a20ef4a6a21f04a20ef4a20f04a6a21f14a20f04a20f14a6a21f24a20f14a20f24a6a21f34a" - "20f24a20f34a6a21f44a" - "20f34a20f44a6a21f54a20f44a20f54a6a21f64a20f54a20f64a6a21f74a20f64a20f74a6a21f84a20f74a20f84a6a" - "21f94a20f84a20f94a6a" - "21fa4a20f94a20fa4a6a21fb4a20fa4a20fb4a6a21fc4a20fb4a20fc4a6a21fd4a20fc4a20fd4a6a21fe4a20fd4a20" - "fe4a6a21ff4a20fe4a20" - "ff4a6a21804b20ff4a20804b6a21814b20804b20814b6a21824b20814b20824b6a21834b20824b20834b6a21844b20" - "834b20844b6a21854b20" - "844b20854b6a21864b20854b20864b6a21874b20864b20874b6a21884b20874b20884b6a21894b20884b20894b6a21" - "8a4b20894b208a4b6a21" - "8b4b208a4b208b4b6a218c4b208b4b208c4b6a218d4b208c4b208d4b6a218e4b208d4b208e4b6a218f4b208e4b208f" - "4b6a21904b208f4b2090" - "4b6a21914b20904b20914b6a21924b20914b20924b6a21934b20924b20934b6a21944b20934b20944b6a21954b2094" - "4b20954b6a21964b2095" - "4b20964b6a21974b20964b20974b6a21984b20974b20984b6a21994b20984b20994b6a219a4b20994b209a4b6a219b" - "4b209a4b209b4b6a219c" - "4b209b4b209c4b6a219d4b209c4b209d4b6a219e4b209d4b209e4b6a219f4b209e4b209f4b6a21a04b209f4b20a04b" - "6a21a14b20a04b20a14b" - "6a21a24b20a14b20a24b6a21a34b20a24b20a34b6a21a44b20a34b20a44b6a21a54b20a44b20a54b6a21a64b20a54b" - "20a64b6a21a74b20a64b" - "20a74b6a21a84b20a74b20a84b6a21a94b20a84b20a94b6a21aa4b20a94b20aa4b6a21ab4b20aa4b20ab4b6a21ac4b" - "20ab4b20ac4b6a21ad4b" - "20ac4b20ad4b6a21ae4b20ad4b20ae4b6a21af4b20ae4b20af4b6a21b04b20af4b20b04b6a21b14b20b04b20b14b6a" - "21b24b20b14b20b24b6a" - "21b34b20b24b20b34b6a21b44b20b34b20b44b6a21b54b20b44b20b54b6a21b64b20b54b20b64b6a21b74b20b64b20" - "b74b6a21b84b20b74b20" - "b84b6a21b94b20b84b20b94b6a21ba4b20b94b20ba4b6a21bb4b20ba4b20bb4b6a21bc4b20bb4b20bc4b6a21bd4b20" - "bc4b20bd4b6a21be4b20" - "bd4b20be4b6a21bf4b20be4b20bf4b6a21c04b20bf4b20c04b6a21c14b20c04b20c14b6a21c24b20c14b20c24b6a21" - "c34b20c24b20c34b6a21" - "c44b20c34b20c44b6a21c54b20c44b20c54b6a21c64b20c54b20c64b6a21c74b20c64b20c74b6a21c84b20c74b20c8" - "4b6a21c94b20c84b20c9" - "4b6a21ca4b20c94b20ca4b6a21cb4b20ca4b20cb4b6a21cc4b20cb4b20cc4b6a21cd4b20cc4b20cd4b6a21ce4b20cd" - "4b20ce4b6a21cf4b20ce" + "20c74920c8496a21c94920c84920c9496a21ca4920c94920ca496a21cb4920ca4920cb496a21cc4920cb4920cc496a" + "21cd4920cc4920cd496a21ce4920cd4920ce496a21cf4920ce4920cf496a21d04920cf4920d0496a21d14920d04920" + "d1496a21d24920d14920d2496a21d34920d24920d3496a21d44920d34920d4496a21d54920d44920d5496a21d64920" + "d54920d6496a21d74920d64920d7496a21d84920d74920d8496a21d94920d84920d9496a21da4920d94920da496a21" + "db4920da4920db496a21dc4920db4920dc496a21dd4920dc4920dd496a21de4920dd4920de496a21df4920de4920df" + "496a21e04920df4920e0496a21e14920e04920e1496a21e24920e14920e2496a21e34920e24920e3496a21e44920e3" + "4920e4496a21e54920e44920e5496a21e64920e54920e6496a21e74920e64920e7496a21e84920e74920e8496a21e9" + "4920e84920e9496a21ea4920e94920ea496a21eb4920ea4920eb496a21ec4920eb4920ec496a21ed4920ec4920ed49" + "6a21ee4920ed4920ee496a21ef4920ee4920ef496a21f04920ef4920f0496a21f14920f04920f1496a21f24920f149" + "20f2496a21f34920f24920f3496a21f44920f34920f4496a21f54920f44920f5496a21f64920f54920f6496a21f749" + "20f64920f7496a21f84920f74920f8496a21f94920f84920f9496a21fa4920f94920fa496a21fb4920fa4920fb496a" + "21fc4920fb4920fc496a21fd4920fc4920fd496a21fe4920fd4920fe496a21ff4920fe4920ff496a21804a20ff4920" + "804a6a21814a20804a20814a6a21824a20814a20824a6a21834a20824a20834a6a21844a20834a20844a6a21854a20" + "844a20854a6a21864a20854a20864a6a21874a20864a20874a6a21884a20874a20884a6a21894a20884a20894a6a21" + "8a4a20894a208a4a6a218b4a208a4a208b4a6a218c4a208b4a208c4a6a218d4a208c4a208d4a6a218e4a208d4a208e" + "4a6a218f4a208e4a208f4a6a21904a208f4a20904a6a21914a20904a20914a6a21924a20914a20924a6a21934a2092" + "4a20934a6a21944a20934a20944a6a21954a20944a20954a6a21964a20954a20964a6a21974a20964a20974a6a2198" + "4a20974a20984a6a21994a20984a20994a6a219a4a20994a209a4a6a219b4a209a4a209b4a6a219c4a209b4a209c4a" + "6a219d4a209c4a209d4a6a219e4a209d4a209e4a6a219f4a209e4a209f4a6a21a04a209f4a20a04a6a21a14a20a04a" + "20a14a6a21a24a20a14a20a24a6a21a34a20a24a20a34a6a21a44a20a34a20a44a6a21a54a20a44a20a54a6a21a64a" + "20a54a20a64a6a21a74a20a64a20a74a6a21a84a20a74a20a84a6a21a94a20a84a20a94a6a21aa4a20a94a20aa4a6a" + "21ab4a20aa4a20ab4a6a21ac4a20ab4a20ac4a6a21ad4a20ac4a20ad4a6a21ae4a20ad4a20ae4a6a21af4a20ae4a20" + "af4a6a21b04a20af4a20b04a6a21b14a20b04a20b14a6a21b24a20b14a20b24a6a21b34a20b24a20b34a6a21b44a20" + "b34a20b44a6a21b54a20b44a20b54a6a21b64a20b54a20b64a6a21b74a20b64a20b74a6a21b84a20b74a20b84a6a21" + "b94a20b84a20b94a6a21ba4a20b94a20ba4a6a21bb4a20ba4a20bb4a6a21bc4a20bb4a20bc4a6a21bd4a20bc4a20bd" + "4a6a21be4a20bd4a20be4a6a21bf4a20be4a20bf4a6a21c04a20bf4a20c04a6a21c14a20c04a20c14a6a21c24a20c1" + "4a20c24a6a21c34a20c24a20c34a6a21c44a20c34a20c44a6a21c54a20c44a20c54a6a21c64a20c54a20c64a6a21c7" + "4a20c64a20c74a6a21c84a20c74a20c84a6a21c94a20c84a20c94a6a21ca4a20c94a20ca4a6a21cb4a20ca4a20cb4a" + "6a21cc4a20cb4a20cc4a6a21cd4a20cc4a20cd4a6a21ce4a20cd4a20ce4a6a21cf4a20ce4a20cf4a6a21d04a20cf4a" + "20d04a6a21d14a20d04a20d14a6a21d24a20d14a20d24a6a21d34a20d24a20d34a6a21d44a20d34a20d44a6a21d54a" + "20d44a20d54a6a21d64a20d54a20d64a6a21d74a20d64a20d74a6a21d84a20d74a20d84a6a21d94a20d84a20d94a6a" + "21da4a20d94a20da4a6a21db4a20da4a20db4a6a21dc4a20db4a20dc4a6a21dd4a20dc4a20dd4a6a21de4a20dd4a20" + "de4a6a21df4a20de4a20df4a6a21e04a20df4a20e04a6a21e14a20e04a20e14a6a21e24a20e14a20e24a6a21e34a20" + "e24a20e34a6a21e44a20e34a20e44a6a21e54a20e44a20e54a6a21e64a20e54a20e64a6a21e74a20e64a20e74a6a21" + "e84a20e74a20e84a6a21e94a20e84a20e94a6a21ea4a20e94a20ea4a6a21eb4a20ea4a20eb4a6a21ec4a20eb4a20ec" + "4a6a21ed4a20ec4a20ed4a6a21ee4a20ed4a20ee4a6a21ef4a20ee4a20ef4a6a21f04a20ef4a20f04a6a21f14a20f0" + "4a20f14a6a21f24a20f14a20f24a6a21f34a20f24a20f34a6a21f44a20f34a20f44a6a21f54a20f44a20f54a6a21f6" + "4a20f54a20f64a6a21f74a20f64a20f74a6a21f84a20f74a20f84a6a21f94a20f84a20f94a6a21fa4a20f94a20fa4a" + "6a21fb4a20fa4a20fb4a6a21fc4a20fb4a20fc4a6a21fd4a20fc4a20fd4a6a21fe4a20fd4a20fe4a6a21ff4a20fe4a" + "20ff4a6a21804b20ff4a20804b6a21814b20804b20814b6a21824b20814b20824b6a21834b20824b20834b6a21844b" + "20834b20844b6a21854b20844b20854b6a21864b20854b20864b6a21874b20864b20874b6a21884b20874b20884b6a" + "21894b20884b20894b6a218a4b20894b208a4b6a218b4b208a4b208b4b6a218c4b208b4b208c4b6a218d4b208c4b20" + "8d4b6a218e4b208d4b208e4b6a218f4b208e4b208f4b6a21904b208f4b20904b6a21914b20904b20914b6a21924b20" + "914b20924b6a21934b20924b20934b6a21944b20934b20944b6a21954b20944b20954b6a21964b20954b20964b6a21" + "974b20964b20974b6a21984b20974b20984b6a21994b20984b20994b6a219a4b20994b209a4b6a219b4b209a4b209b" + "4b6a219c4b209b4b209c4b6a219d4b209c4b209d4b6a219e4b209d4b209e4b6a219f4b209e4b209f4b6a21a04b209f" + "4b20a04b6a21a14b20a04b20a14b6a21a24b20a14b20a24b6a21a34b20a24b20a34b6a21a44b20a34b20a44b6a21a5" + "4b20a44b20a54b6a21a64b20a54b20a64b6a21a74b20a64b20a74b6a21a84b20a74b20a84b6a21a94b20a84b20a94b" + "6a21aa4b20a94b20aa4b6a21ab4b20aa4b20ab4b6a21ac4b20ab4b20ac4b6a21ad4b20ac4b20ad4b6a21ae4b20ad4b" + "20ae4b6a21af4b20ae4b20af4b6a21b04b20af4b20b04b6a21b14b20b04b20b14b6a21b24b20b14b20b24b6a21b34b" + "20b24b20b34b6a21b44b20b34b20b44b6a21b54b20b44b20b54b6a21b64b20b54b20b64b6a21b74b20b64b20b74b6a" + "21b84b20b74b20b84b6a21b94b20b84b20b94b6a21ba4b20b94b20ba4b6a21bb4b20ba4b20bb4b6a21bc4b20bb4b20" + "bc4b6a21bd4b20bc4b20bd4b6a21be4b20bd4b20be4b6a21bf4b20be4b20bf4b6a21c04b20bf4b20c04b6a21c14b20" + "c04b20c14b6a21c24b20c14b20c24b6a21c34b20c24b20c34b6a21c44b20c34b20c44b6a21c54b20c44b20c54b6a21" + "c64b20c54b20c64b6a21c74b20c64b20c74b6a21c84b20c74b20c84b6a21c94b20c84b20c94b6a21ca4b20c94b20ca" + "4b6a21cb4b20ca4b20cb4b6a21cc4b20cb4b20cc4b6a21cd4b20cc4b20cd4b6a21ce4b20cd4b20ce4b6a21cf4b20ce" "4b20cf4b6a21d04b20cf4b20d04b6a21d14b20d04b20d14b6a21d24b20d14b20d24b6a21d34b20d24b20d34b6a21d4" - "4b20d34b20d44b6a21d5" - "4b20d44b20d54b6a21d64b20d54b20d64b6a21d74b20d64b20d74b6a21d84b20d74b20d84b6a21d94b20d84b20d94b" - "6a21da4b20d94b20da4b" - "6a21db4b20da4b20db4b6a21dc4b20db4b20dc4b6a21dd4b20dc4b20dd4b6a21de4b20dd4b20de4b6a21df4b20de4b" - "20df4b6a21e04b20df4b" - "20e04b6a21e14b20e04b20e14b6a21e24b20e14b20e24b6a21e34b20e24b20e34b6a21e44b20e34b20e44b6a21e54b" - "20e44b20e54b6a21e64b" - "20e54b20e64b6a21e74b20e64b20e74b6a21e84b20e74b20e84b6a21e94b20e84b20e94b6a21ea4b20e94b20ea4b6a" - "21eb4b20ea4b20eb4b6a" - "21ec4b20eb4b20ec4b6a21ed4b20ec4b20ed4b6a21ee4b20ed4b20ee4b6a21ef4b20ee4b20ef4b6a21f04b20ef4b20" - "f04b6a21f14b20f04b20" - "f14b6a21f24b20f14b20f24b6a21f34b20f24b20f34b6a21f44b20f34b20f44b6a21f54b20f44b20f54b6a21f64b20" - "f54b20f64b6a21f74b20" - "f64b20f74b6a21f84b20f74b20f84b6a21f94b20f84b20f94b6a21fa4b20f94b20fa4b6a21fb4b20fa4b20fb4b6a21" - "fc4b20fb4b20fc4b6a21" - "fd4b20fc4b20fd4b6a21fe4b20fd4b20fe4b6a21ff4b20fe4b20ff4b6a21804c20ff4b20804c6a21814c20804c2081" - "4c6a21824c20814c2082" - "4c6a21834c20824c20834c6a21844c20834c20844c6a21854c20844c20854c6a21864c20854c20864c6a21874c2086" - "4c20874c6a21884c2087" - "4c20884c6a21894c20884c20894c6a218a4c20894c208a4c6a218b4c208a4c208b4c6a218c4c208b4c208c4c6a218d" - "4c208c4c208d4c6a218e" - "4c208d4c208e4c6a218f4c208e4c208f4c6a21904c208f4c20904c6a21914c20904c20914c6a21924c20914c20924c" - "6a21934c20924c20934c" - "6a21944c20934c20944c6a21954c20944c20954c6a21964c20954c20964c6a21974c20964c20974c6a21984c20974c" - "20984c6a21994c20984c" - "20994c6a219a4c20994c209a4c6a219b4c209a4c209b4c6a219c4c209b4c209c4c6a219d4c209c4c209d4c6a219e4c" - "209d4c209e4c6a219f4c" - "209e4c209f4c6a21a04c209f4c20a04c6a21a14c20a04c20a14c6a21a24c20a14c20a24c6a21a34c20a24c20a34c6a" - "21a44c20a34c20a44c6a" - "21a54c20a44c20a54c6a21a64c20a54c20a64c6a21a74c20a64c20a74c6a21a84c20a74c20a84c6a21a94c20a84c20" - "a94c6a21aa4c20a94c20" - "aa4c6a21ab4c20aa4c20ab4c6a21ac4c20ab4c20ac4c6a21ad4c20ac4c20ad4c6a21ae4c20ad4c20ae4c6a21af4c20" - "ae4c20af4c6a21b04c20" - "af4c20b04c6a21b14c20b04c20b14c6a21b24c20b14c20b24c6a21b34c20b24c20b34c6a21b44c20b34c20b44c6a21" - "b54c20b44c20b54c6a21" - "b64c20b54c20b64c6a21b74c20b64c20b74c6a21b84c20b74c20b84c6a21b94c20b84c20b94c6a21ba4c20b94c20ba" - "4c6a21bb4c20ba4c20bb" - "4c6a21bc4c20bb4c20bc4c6a21bd4c20bc4c20bd4c6a21be4c20bd4c20be4c6a21bf4c20be4c20bf4c6a21c04c20bf" - "4c20c04c6a21c14c20c0" - "4c20c14c6a21c24c20c14c20c24c6a21c34c20c24c20c34c6a21c44c20c34c20c44c6a21c54c20c44c20c54c6a21c6" - "4c20c54c20c64c6a21c7" - "4c20c64c20c74c6a21c84c20c74c20c84c6a21c94c20c84c20c94c6a21ca4c20c94c20ca4c6a21cb4c20ca4c20cb4c" - "6a21cc4c20cb4c20cc4c" - "6a21cd4c20cc4c20cd4c6a21ce4c20cd4c20ce4c6a21cf4c20ce4c20cf4c6a21d04c20cf4c20d04c6a21d14c20d04c" - "20d14c6a21d24c20d14c" - "20d24c6a21d34c20d24c20d34c6a21d44c20d34c20d44c6a21d54c20d44c20d54c6a21d64c20d54c20d64c6a21d74c" - "20d64c20d74c6a21d84c" - "20d74c20d84c6a21d94c20d84c20d94c6a21da4c20d94c20da4c6a21db4c20da4c20db4c6a21dc4c20db4c20dc4c6a" - "21dd4c20dc4c20dd4c6a" - "21de4c20dd4c20de4c6a21df4c20de4c20df4c6a21e04c20df4c20e04c6a21e14c20e04c20e14c6a21e24c20e14c20" - "e24c6a21e34c20e24c20" - "e34c6a21e44c20e34c20e44c6a21e54c20e44c20e54c6a21e64c20e54c20e64c6a21e74c20e64c20e74c6a21e84c20" - "e74c20e84c6a21e94c20" - "e84c20e94c6a21ea4c20e94c20ea4c6a21eb4c20ea4c20eb4c6a21ec4c20eb4c20ec4c6a21ed4c20ec4c20ed4c6a21" - "ee4c20ed4c20ee4c6a21" - "ef4c20ee4c20ef4c6a21f04c20ef4c20f04c6a21f14c20f04c20f14c6a21f24c20f14c20f24c6a21f34c20f24c20f3" - "4c6a21f44c20f34c20f4" - "4c6a21f54c20f44c20f54c6a21f64c20f54c20f64c6a21f74c20f64c20f74c6a21f84c20f74c20f84c6a21f94c20f8" - "4c20f94c6a21fa4c20f9" - "4c20fa4c6a21fb4c20fa4c20fb4c6a21fc4c20fb4c20fc4c6a21fd4c20fc4c20fd4c6a21fe4c20fd4c20fe4c6a21ff" - "4c20fe4c20ff4c6a2180" - "4d20ff4c20804d6a21814d20804d20814d6a21824d20814d20824d6a21834d20824d20834d6a21844d20834d20844d" - "6a21854d20844d20854d" - "6a21864d20854d20864d6a21874d20864d20874d6a21884d20874d20884d6a21894d20884d20894d6a218a4d20894d" - "208a4d6a218b4d208a4d" - "208b4d6a218c4d208b4d208c4d6a218d4d208c4d208d4d6a218e4d208d4d208e4d6a218f4d208e4d208f4d6a21904d" - "208f4d20904d6a21914d" - "20904d20914d6a21924d20914d20924d6a21934d20924d20934d6a21944d20934d20944d6a21954d20944d20954d6a" - "21964d20954d20964d6a" - "21974d20964d20974d6a21984d20974d20984d6a21994d20984d20994d6a219a4d20994d209a4d6a219b4d209a4d20" - "9b4d6a219c4d209b4d20" - "9c4d6a219d4d209c4d209d4d6a219e4d209d4d209e4d6a219f4d209e4d209f4d6a21a04d209f4d20a04d6a21a14d20" - "a04d20a14d6a21a24d20" - "a14d20a24d6a21a34d20a24d20a34d6a21a44d20a34d20a44d6a21a54d20a44d20a54d6a21a64d20a54d20a64d6a21" - "a74d20a64d20a74d6a21" - "a84d20a74d20a84d6a21a94d20a84d20a94d6a21aa4d20a94d20aa4d6a21ab4d20aa4d20ab4d6a21ac4d20ab4d20ac" - "4d6a21ad4d20ac4d20ad" - "4d6a21ae4d20ad4d20ae4d6a21af4d20ae4d20af4d6a21b04d20af4d20b04d6a21b14d20b04d20b14d6a21b24d20b1" - "4d20b24d6a21b34d20b2" - "4d20b34d6a21b44d20b34d20b44d6a21b54d20b44d20b54d6a21b64d20b54d20b64d6a21b74d20b64d20b74d6a21b8" - "4d20b74d20b84d6a21b9" - "4d20b84d20b94d6a21ba4d20b94d20ba4d6a21bb4d20ba4d20bb4d6a21bc4d20bb4d20bc4d6a21bd4d20bc4d20bd4d" - "6a21be4d20bd4d20be4d" - "6a21bf4d20be4d20bf4d6a21c04d20bf4d20c04d6a21c14d20c04d20c14d6a21c24d20c14d20c24d6a21c34d20c24d" - "20c34d6a21c44d20c34d" - "20c44d6a21c54d20c44d20c54d6a21c64d20c54d20c64d6a21c74d20c64d20c74d6a21c84d20c74d20c84d6a21c94d" - "20c84d20c94d6a21ca4d" - "20c94d20ca4d6a21cb4d20ca4d20cb4d6a21cc4d20cb4d20cc4d6a21cd4d20cc4d20cd4d6a21ce4d20cd4d20ce4d6a" - "21cf4d20ce4d20cf4d6a" - "21d04d20cf4d20d04d6a21d14d20d04d20d14d6a21d24d20d14d20d24d6a21d34d20d24d20d34d6a21d44d20d34d20" - "d44d6a21d54d20d44d20" - "d54d6a21d64d20d54d20d64d6a21d74d20d64d20d74d6a21d84d20d74d20d84d6a21d94d20d84d20d94d6a21da4d20" - "d94d20da4d6a21db4d20" + "4b20d34b20d44b6a21d54b20d44b20d54b6a21d64b20d54b20d64b6a21d74b20d64b20d74b6a21d84b20d74b20d84b" + "6a21d94b20d84b20d94b6a21da4b20d94b20da4b6a21db4b20da4b20db4b6a21dc4b20db4b20dc4b6a21dd4b20dc4b" + "20dd4b6a21de4b20dd4b20de4b6a21df4b20de4b20df4b6a21e04b20df4b20e04b6a21e14b20e04b20e14b6a21e24b" + "20e14b20e24b6a21e34b20e24b20e34b6a21e44b20e34b20e44b6a21e54b20e44b20e54b6a21e64b20e54b20e64b6a" + "21e74b20e64b20e74b6a21e84b20e74b20e84b6a21e94b20e84b20e94b6a21ea4b20e94b20ea4b6a21eb4b20ea4b20" + "eb4b6a21ec4b20eb4b20ec4b6a21ed4b20ec4b20ed4b6a21ee4b20ed4b20ee4b6a21ef4b20ee4b20ef4b6a21f04b20" + "ef4b20f04b6a21f14b20f04b20f14b6a21f24b20f14b20f24b6a21f34b20f24b20f34b6a21f44b20f34b20f44b6a21" + "f54b20f44b20f54b6a21f64b20f54b20f64b6a21f74b20f64b20f74b6a21f84b20f74b20f84b6a21f94b20f84b20f9" + "4b6a21fa4b20f94b20fa4b6a21fb4b20fa4b20fb4b6a21fc4b20fb4b20fc4b6a21fd4b20fc4b20fd4b6a21fe4b20fd" + "4b20fe4b6a21ff4b20fe4b20ff4b6a21804c20ff4b20804c6a21814c20804c20814c6a21824c20814c20824c6a2183" + "4c20824c20834c6a21844c20834c20844c6a21854c20844c20854c6a21864c20854c20864c6a21874c20864c20874c" + "6a21884c20874c20884c6a21894c20884c20894c6a218a4c20894c208a4c6a218b4c208a4c208b4c6a218c4c208b4c" + "208c4c6a218d4c208c4c208d4c6a218e4c208d4c208e4c6a218f4c208e4c208f4c6a21904c208f4c20904c6a21914c" + "20904c20914c6a21924c20914c20924c6a21934c20924c20934c6a21944c20934c20944c6a21954c20944c20954c6a" + "21964c20954c20964c6a21974c20964c20974c6a21984c20974c20984c6a21994c20984c20994c6a219a4c20994c20" + "9a4c6a219b4c209a4c209b4c6a219c4c209b4c209c4c6a219d4c209c4c209d4c6a219e4c209d4c209e4c6a219f4c20" + "9e4c209f4c6a21a04c209f4c20a04c6a21a14c20a04c20a14c6a21a24c20a14c20a24c6a21a34c20a24c20a34c6a21" + "a44c20a34c20a44c6a21a54c20a44c20a54c6a21a64c20a54c20a64c6a21a74c20a64c20a74c6a21a84c20a74c20a8" + "4c6a21a94c20a84c20a94c6a21aa4c20a94c20aa4c6a21ab4c20aa4c20ab4c6a21ac4c20ab4c20ac4c6a21ad4c20ac" + "4c20ad4c6a21ae4c20ad4c20ae4c6a21af4c20ae4c20af4c6a21b04c20af4c20b04c6a21b14c20b04c20b14c6a21b2" + "4c20b14c20b24c6a21b34c20b24c20b34c6a21b44c20b34c20b44c6a21b54c20b44c20b54c6a21b64c20b54c20b64c" + "6a21b74c20b64c20b74c6a21b84c20b74c20b84c6a21b94c20b84c20b94c6a21ba4c20b94c20ba4c6a21bb4c20ba4c" + "20bb4c6a21bc4c20bb4c20bc4c6a21bd4c20bc4c20bd4c6a21be4c20bd4c20be4c6a21bf4c20be4c20bf4c6a21c04c" + "20bf4c20c04c6a21c14c20c04c20c14c6a21c24c20c14c20c24c6a21c34c20c24c20c34c6a21c44c20c34c20c44c6a" + "21c54c20c44c20c54c6a21c64c20c54c20c64c6a21c74c20c64c20c74c6a21c84c20c74c20c84c6a21c94c20c84c20" + "c94c6a21ca4c20c94c20ca4c6a21cb4c20ca4c20cb4c6a21cc4c20cb4c20cc4c6a21cd4c20cc4c20cd4c6a21ce4c20" + "cd4c20ce4c6a21cf4c20ce4c20cf4c6a21d04c20cf4c20d04c6a21d14c20d04c20d14c6a21d24c20d14c20d24c6a21" + "d34c20d24c20d34c6a21d44c20d34c20d44c6a21d54c20d44c20d54c6a21d64c20d54c20d64c6a21d74c20d64c20d7" + "4c6a21d84c20d74c20d84c6a21d94c20d84c20d94c6a21da4c20d94c20da4c6a21db4c20da4c20db4c6a21dc4c20db" + "4c20dc4c6a21dd4c20dc4c20dd4c6a21de4c20dd4c20de4c6a21df4c20de4c20df4c6a21e04c20df4c20e04c6a21e1" + "4c20e04c20e14c6a21e24c20e14c20e24c6a21e34c20e24c20e34c6a21e44c20e34c20e44c6a21e54c20e44c20e54c" + "6a21e64c20e54c20e64c6a21e74c20e64c20e74c6a21e84c20e74c20e84c6a21e94c20e84c20e94c6a21ea4c20e94c" + "20ea4c6a21eb4c20ea4c20eb4c6a21ec4c20eb4c20ec4c6a21ed4c20ec4c20ed4c6a21ee4c20ed4c20ee4c6a21ef4c" + "20ee4c20ef4c6a21f04c20ef4c20f04c6a21f14c20f04c20f14c6a21f24c20f14c20f24c6a21f34c20f24c20f34c6a" + "21f44c20f34c20f44c6a21f54c20f44c20f54c6a21f64c20f54c20f64c6a21f74c20f64c20f74c6a21f84c20f74c20" + "f84c6a21f94c20f84c20f94c6a21fa4c20f94c20fa4c6a21fb4c20fa4c20fb4c6a21fc4c20fb4c20fc4c6a21fd4c20" + "fc4c20fd4c6a21fe4c20fd4c20fe4c6a21ff4c20fe4c20ff4c6a21804d20ff4c20804d6a21814d20804d20814d6a21" + "824d20814d20824d6a21834d20824d20834d6a21844d20834d20844d6a21854d20844d20854d6a21864d20854d2086" + "4d6a21874d20864d20874d6a21884d20874d20884d6a21894d20884d20894d6a218a4d20894d208a4d6a218b4d208a" + "4d208b4d6a218c4d208b4d208c4d6a218d4d208c4d208d4d6a218e4d208d4d208e4d6a218f4d208e4d208f4d6a2190" + "4d208f4d20904d6a21914d20904d20914d6a21924d20914d20924d6a21934d20924d20934d6a21944d20934d20944d" + "6a21954d20944d20954d6a21964d20954d20964d6a21974d20964d20974d6a21984d20974d20984d6a21994d20984d" + "20994d6a219a4d20994d209a4d6a219b4d209a4d209b4d6a219c4d209b4d209c4d6a219d4d209c4d209d4d6a219e4d" + "209d4d209e4d6a219f4d209e4d209f4d6a21a04d209f4d20a04d6a21a14d20a04d20a14d6a21a24d20a14d20a24d6a" + "21a34d20a24d20a34d6a21a44d20a34d20a44d6a21a54d20a44d20a54d6a21a64d20a54d20a64d6a21a74d20a64d20" + "a74d6a21a84d20a74d20a84d6a21a94d20a84d20a94d6a21aa4d20a94d20aa4d6a21ab4d20aa4d20ab4d6a21ac4d20" + "ab4d20ac4d6a21ad4d20ac4d20ad4d6a21ae4d20ad4d20ae4d6a21af4d20ae4d20af4d6a21b04d20af4d20b04d6a21" + "b14d20b04d20b14d6a21b24d20b14d20b24d6a21b34d20b24d20b34d6a21b44d20b34d20b44d6a21b54d20b44d20b5" + "4d6a21b64d20b54d20b64d6a21b74d20b64d20b74d6a21b84d20b74d20b84d6a21b94d20b84d20b94d6a21ba4d20b9" + "4d20ba4d6a21bb4d20ba4d20bb4d6a21bc4d20bb4d20bc4d6a21bd4d20bc4d20bd4d6a21be4d20bd4d20be4d6a21bf" + "4d20be4d20bf4d6a21c04d20bf4d20c04d6a21c14d20c04d20c14d6a21c24d20c14d20c24d6a21c34d20c24d20c34d" + "6a21c44d20c34d20c44d6a21c54d20c44d20c54d6a21c64d20c54d20c64d6a21c74d20c64d20c74d6a21c84d20c74d" + "20c84d6a21c94d20c84d20c94d6a21ca4d20c94d20ca4d6a21cb4d20ca4d20cb4d6a21cc4d20cb4d20cc4d6a21cd4d" + "20cc4d20cd4d6a21ce4d20cd4d20ce4d6a21cf4d20ce4d20cf4d6a21d04d20cf4d20d04d6a21d14d20d04d20d14d6a" + "21d24d20d14d20d24d6a21d34d20d24d20d34d6a21d44d20d34d20d44d6a21d54d20d44d20d54d6a21d64d20d54d20" + "d64d6a21d74d20d64d20d74d6a21d84d20d74d20d84d6a21d94d20d84d20d94d6a21da4d20d94d20da4d6a21db4d20" "da4d20db4d6a21dc4d20db4d20dc4d6a21dd4d20dc4d20dd4d6a21de4d20dd4d20de4d6a21df4d20de4d20df4d6a21" - "e04d20df4d20e04d6a21" - "e14d20e04d20e14d6a21e24d20e14d20e24d6a21e34d20e24d20e34d6a21e44d20e34d20e44d6a21e54d20e44d20e5" - "4d6a21e64d20e54d20e6" - "4d6a21e74d20e64d20e74d6a21e84d20e74d20e84d6a21e94d20e84d20e94d6a21ea4d20e94d20ea4d6a21eb4d20ea" - "4d20eb4d6a21ec4d20eb" - "4d20ec4d6a21ed4d20ec4d20ed4d6a21ee4d20ed4d20ee4d6a21ef4d20ee4d20ef4d6a21f04d20ef4d20f04d6a21f1" - "4d20f04d20f14d6a21f2" - "4d20f14d20f24d6a21f34d20f24d20f34d6a21f44d20f34d20f44d6a21f54d20f44d20f54d6a21f64d20f54d20f64d" - "6a21f74d20f64d20f74d" - "6a21f84d20f74d20f84d6a21f94d20f84d20f94d6a21fa4d20f94d20fa4d6a21fb4d20fa4d20fb4d6a21fc4d20fb4d" - "20fc4d6a21fd4d20fc4d" - "20fd4d6a21fe4d20fd4d20fe4d6a21ff4d20fe4d20ff4d6a21804e20ff4d20804e6a21814e20804e20814e6a21824e" - "20814e20824e6a21834e" - "20824e20834e6a21844e20834e20844e6a21854e20844e20854e6a21864e20854e20864e6a21874e20864e20874e6a" - "21884e20874e20884e6a" - "21894e20884e20894e6a218a4e20894e208a4e6a218b4e208a4e208b4e6a218c4e208b4e208c4e6a218d4e208c4e20" - "8d4e6a218e4e208d4e20" - "8e4e6a218f4e208f4e0b"; + "e04d20df4d20e04d6a21e14d20e04d20e14d6a21e24d20e14d20e24d6a21e34d20e24d20e34d6a21e44d20e34d20e4" + "4d6a21e54d20e44d20e54d6a21e64d20e54d20e64d6a21e74d20e64d20e74d6a21e84d20e74d20e84d6a21e94d20e8" + "4d20e94d6a21ea4d20e94d20ea4d6a21eb4d20ea4d20eb4d6a21ec4d20eb4d20ec4d6a21ed4d20ec4d20ed4d6a21ee" + "4d20ed4d20ee4d6a21ef4d20ee4d20ef4d6a21f04d20ef4d20f04d6a21f14d20f04d20f14d6a21f24d20f14d20f24d" + "6a21f34d20f24d20f34d6a21f44d20f34d20f44d6a21f54d20f44d20f54d6a21f64d20f54d20f64d6a21f74d20f64d" + "20f74d6a21f84d20f74d20f84d6a21f94d20f84d20f94d6a21fa4d20f94d20fa4d6a21fb4d20fa4d20fb4d6a21fc4d" + "20fb4d20fc4d6a21fd4d20fc4d20fd4d6a21fe4d20fd4d20fe4d6a21ff4d20fe4d20ff4d6a21804e20ff4d20804e6a" + "21814e20804e20814e6a21824e20814e20824e6a21834e20824e20834e6a21844e20834e20844e6a21854e20844e20" + "854e6a21864e20854e20864e6a21874e20864e20874e6a21884e20874e20884e6a21894e20884e20894e6a218a4e20" + "894e208a4e6a218b4e208a4e208b4e6a218c4e208b4e208c4e6a218d4e208c4e208d4e6a218e4e208d4e208e4e6a21" + "8f4e208f4e0b"; extern std::string const functions5kHex = "0061736d0100000001070160027f7f017f038a27882700000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "00000000000000000000" - "00000000000007e2d30388270874657374303030300000087465737430303031000108746573743030303200020874" - "65737430303033000308" - "7465737430303034000408746573743030303500050874657374303030360006087465737430303037000708746573" - "74303030380008087465" - "7374303030390009087465737430303130000a087465737430303131000b087465737430303132000c087465737430" - "303133000d0874657374" - "30303134000e087465737430303135000f087465737430303136001008746573743030313700110874657374303031" - "38001208746573743030" - "3139001308746573743030323000140874657374303032310015087465737430303232001608746573743030323300" - "17087465737430303234" - "00180874657374303032350019087465737430303236001a087465737430303237001b087465737430303238001c08" - "7465737430303239001d" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000007e2d303882708" + "7465737430303030000008746573743030303100010874657374303030320002087465737430303033000308746573" + "7430303034000408746573743030303500050874657374303030360006087465737430303037000708746573743030" + "303800080874657374303030390009087465737430303130000a087465737430303131000b08746573743030313200" + "0c087465737430303133000d087465737430303134000e087465737430303135000f08746573743030313600100874" + "6573743030313700110874657374303031380012087465737430303139001308746573743030323000140874657374" + "3030323100150874657374303032320016087465737430303233001708746573743030323400180874657374303032" + "350019087465737430303236001a087465737430303237001b087465737430303238001c087465737430303239001d" "087465737430303330001e087465737430303331001f08746573743030333200200874657374303033330021087465" - "73743030333400220874" - "6573743030333500230874657374303033360024087465737430303337002508746573743030333800260874657374" - "30303339002708746573" - "743030343000280874657374303034310029087465737430303432002a087465737430303433002b08746573743030" - "3434002c087465737430" - "303435002d087465737430303436002e087465737430303437002f0874657374303034380030087465737430303439" - "00310874657374303035" - "3000320874657374303035310033087465737430303532003408746573743030353300350874657374303035340036" - "08746573743030353500" - "3708746573743030353600380874657374303035370039087465737430303538003a087465737430303539003b0874" - "65737430303630003c08" - "7465737430303631003d087465737430303632003e087465737430303633003f087465737430303634004008746573" - "74303036350041087465" - "7374303036360042087465737430303637004308746573743030363800440874657374303036390045087465737430" - "30373000460874657374" - "30303731004708746573743030373200480874657374303037330049087465737430303734004a0874657374303037" - "35004b08746573743030" - "3736004c087465737430303737004d087465737430303738004e087465737430303739004f08746573743030383000" - "50087465737430303831" - "0051087465737430303832005208746573743030383300530874657374303038340054087465737430303835005508" - "74657374303038360056" - "087465737430303837005708746573743030383800580874657374303038390059087465737430303930005a087465" - "737430303931005b0874" - "65737430303932005c087465737430303933005d087465737430303934005e087465737430303935005f0874657374" - "30303936006008746573" - "7430303937006108746573743030393800620874657374303039390063087465737430313030006408746573743031" - "30310065087465737430" - "3130320066087465737430313033006708746573743031303400680874657374303130350069087465737430313036" - "006a0874657374303130" - "37006b087465737430313038006c087465737430313039006d087465737430313130006e087465737430313131006f" - "08746573743031313200" - "7008746573743031313300710874657374303131340072087465737430313135007308746573743031313600740874" - "65737430313137007508" - "7465737430313138007608746573743031313900770874657374303132300078087465737430313231007908746573" - "7430313232007a087465" - "737430313233007b087465737430313234007c087465737430313235007d087465737430313236007e087465737430" - "313237007f0874657374" - "3031323800800108746573743031323900810108746573743031333000820108746573743031333100830108746573" - "74303133320084010874" - "6573743031333300850108746573743031333400860108746573743031333500870108746573743031333600880108" - "74657374303133370089" - "01087465737430313338008a01087465737430313339008b01087465737430313430008c0108746573743031343100" - "8d010874657374303134" - "32008e01087465737430313433008f0108746573743031343400900108746573743031343500910108746573743031" - "34360092010874657374" - "3031343700930108746573743031343800940108746573743031343900950108746573743031353000960108746573" - "74303135310097010874" - "65737430313532009801087465737430313533009901087465737430313534009a01087465737430313535009b0108" - "7465737430313536009c" - "01087465737430313537009d01087465737430313538009e01087465737430313539009f0108746573743031363000" - "a0010874657374303136" - "3100a10108746573743031363200a20108746573743031363300a30108746573743031363400a40108746573743031" - "363500a5010874657374" - "3031363600a60108746573743031363700a70108746573743031363800a80108746573743031363900a90108746573" - "743031373000aa010874" - "6573743031373100ab0108746573743031373200ac0108746573743031373300ad0108746573743031373400ae0108" - "746573743031373500af" - "0108746573743031373600b00108746573743031373700b10108746573743031373800b20108746573743031373900" - "b3010874657374303138" - "3000b40108746573743031383100b50108746573743031383200b60108746573743031383300b70108746573743031" - "383400b8010874657374" - "3031383500b90108746573743031383600ba0108746573743031383700bb0108746573743031383800bc0108746573" - "743031383900bd010874" - "6573743031393000be0108746573743031393100bf0108746573743031393200c00108746573743031393300c10108" - "746573743031393400c2" - "0108746573743031393500c30108746573743031393600c40108746573743031393700c50108746573743031393800" - "c6010874657374303139" - "3900c70108746573743032303000c80108746573743032303100c90108746573743032303200ca0108746573743032" - "303300cb010874657374" - "3032303400cc0108746573743032303500cd0108746573743032303600ce0108746573743032303700cf0108746573" - "743032303800d0010874" - "6573743032303900d10108746573743032313000d20108746573743032313100d30108746573743032313200d40108" - "746573743032313300d5" - "0108746573743032313400d60108746573743032313500d70108746573743032313600d80108746573743032313700" - "d9010874657374303231" - "3800da0108746573743032313900db0108746573743032323000dc0108746573743032323100dd0108746573743032" - "323200de010874657374" - "3032323300df0108746573743032323400e00108746573743032323500e10108746573743032323600e20108746573" - "743032323700e3010874" - "6573743032323800e40108746573743032323900e50108746573743032333000e60108746573743032333100e70108" - "746573743032333200e8" - "0108746573743032333300e90108746573743032333400ea0108746573743032333500eb0108746573743032333600" - "ec010874657374303233" - "3700ed0108746573743032333800ee0108746573743032333900ef0108746573743032343000f00108746573743032" - "343100f1010874657374" - "3032343200f20108746573743032343300f30108746573743032343400f40108746573743032343500f50108746573" - "743032343600f6010874" - "6573743032343700f70108746573743032343800f80108746573743032343900f90108746573743032353000fa0108" - "746573743032353100fb" - "0108746573743032353200fc0108746573743032353300fd0108746573743032353400fe0108746573743032353500" - "ff010874657374303235" - "3600800208746573743032353700810208746573743032353800820208746573743032353900830208746573743032" - "36300084020874657374" + "7374303033340022087465737430303335002308746573743030333600240874657374303033370025087465737430" + "3033380026087465737430303339002708746573743030343000280874657374303034310029087465737430303432" + "002a087465737430303433002b087465737430303434002c087465737430303435002d087465737430303436002e08" + "7465737430303437002f08746573743030343800300874657374303034390031087465737430303530003208746573" + "7430303531003308746573743030353200340874657374303035330035087465737430303534003608746573743030" + "3535003708746573743030353600380874657374303035370039087465737430303538003a08746573743030353900" + "3b087465737430303630003c087465737430303631003d087465737430303632003e087465737430303633003f0874" + "6573743030363400400874657374303036350041087465737430303636004208746573743030363700430874657374" + "3030363800440874657374303036390045087465737430303730004608746573743030373100470874657374303037" + "3200480874657374303037330049087465737430303734004a087465737430303735004b087465737430303736004c" + "087465737430303737004d087465737430303738004e087465737430303739004f0874657374303038300050087465" + "7374303038310051087465737430303832005208746573743030383300530874657374303038340054087465737430" + "3038350055087465737430303836005608746573743030383700570874657374303038380058087465737430303839" + "0059087465737430303930005a087465737430303931005b087465737430303932005c087465737430303933005d08" + "7465737430303934005e087465737430303935005f0874657374303039360060087465737430303937006108746573" + "7430303938006208746573743030393900630874657374303130300064087465737430313031006508746573743031" + "3032006608746573743031303300670874657374303130340068087465737430313035006908746573743031303600" + "6a087465737430313037006b087465737430313038006c087465737430313039006d087465737430313130006e0874" + "65737430313131006f0874657374303131320070087465737430313133007108746573743031313400720874657374" + "3031313500730874657374303131360074087465737430313137007508746573743031313800760874657374303131" + "39007708746573743031323000780874657374303132310079087465737430313232007a087465737430313233007b" + "087465737430313234007c087465737430313235007d087465737430313236007e087465737430313237007f087465" + "7374303132380080010874657374303132390081010874657374303133300082010874657374303133310083010874" + "6573743031333200840108746573743031333300850108746573743031333400860108746573743031333500870108" + "7465737430313336008801087465737430313337008901087465737430313338008a01087465737430313339008b01" + "087465737430313430008c01087465737430313431008d01087465737430313432008e01087465737430313433008f" + "0108746573743031343400900108746573743031343500910108746573743031343600920108746573743031343700" + "9301087465737430313438009401087465737430313439009501087465737430313530009601087465737430313531" + "009701087465737430313532009801087465737430313533009901087465737430313534009a010874657374303135" + "35009b01087465737430313536009c01087465737430313537009d01087465737430313538009e0108746573743031" + "3539009f0108746573743031363000a00108746573743031363100a10108746573743031363200a201087465737430" + "31363300a30108746573743031363400a40108746573743031363500a50108746573743031363600a6010874657374" + "3031363700a70108746573743031363800a80108746573743031363900a90108746573743031373000aa0108746573" + "743031373100ab0108746573743031373200ac0108746573743031373300ad0108746573743031373400ae01087465" + "73743031373500af0108746573743031373600b00108746573743031373700b10108746573743031373800b2010874" + "6573743031373900b30108746573743031383000b40108746573743031383100b50108746573743031383200b60108" + "746573743031383300b70108746573743031383400b80108746573743031383500b90108746573743031383600ba01" + "08746573743031383700bb0108746573743031383800bc0108746573743031383900bd0108746573743031393000be" + "0108746573743031393100bf0108746573743031393200c00108746573743031393300c10108746573743031393400" + "c20108746573743031393500c30108746573743031393600c40108746573743031393700c501087465737430313938" + "00c60108746573743031393900c70108746573743032303000c80108746573743032303100c9010874657374303230" + "3200ca0108746573743032303300cb0108746573743032303400cc0108746573743032303500cd0108746573743032" + "303600ce0108746573743032303700cf0108746573743032303800d00108746573743032303900d101087465737430" + "32313000d20108746573743032313100d30108746573743032313200d40108746573743032313300d5010874657374" + "3032313400d60108746573743032313500d70108746573743032313600d80108746573743032313700d90108746573" + "743032313800da0108746573743032313900db0108746573743032323000dc0108746573743032323100dd01087465" + "73743032323200de0108746573743032323300df0108746573743032323400e00108746573743032323500e1010874" + "6573743032323600e20108746573743032323700e30108746573743032323800e40108746573743032323900e50108" + "746573743032333000e60108746573743032333100e70108746573743032333200e80108746573743032333300e901" + "08746573743032333400ea0108746573743032333500eb0108746573743032333600ec0108746573743032333700ed" + "0108746573743032333800ee0108746573743032333900ef0108746573743032343000f00108746573743032343100" + "f10108746573743032343200f20108746573743032343300f30108746573743032343400f401087465737430323435" + "00f50108746573743032343600f60108746573743032343700f70108746573743032343800f8010874657374303234" + "3900f90108746573743032353000fa0108746573743032353100fb0108746573743032353200fc0108746573743032" + "353300fd0108746573743032353400fe0108746573743032353500ff01087465737430323536008002087465737430" + "3235370081020874657374303235380082020874657374303235390083020874657374303236300084020874657374" "3032363100850208746573743032363200860208746573743032363300870208746573743032363400880208746573" - "74303236350089020874" - "65737430323636008a02087465737430323637008b02087465737430323638008c02087465737430323639008d0208" - "7465737430323730008e" - "02087465737430323731008f0208746573743032373200900208746573743032373300910208746573743032373400" - "92020874657374303237" - "3500930208746573743032373600940208746573743032373700950208746573743032373800960208746573743032" - "37390097020874657374" - "30323830009802087465737430323831009902087465737430323832009a02087465737430323833009b0208746573" - "7430323834009c020874" - "65737430323835009d02087465737430323836009e02087465737430323837009f0208746573743032383800a00208" - "746573743032383900a1" - "0208746573743032393000a20208746573743032393100a30208746573743032393200a40208746573743032393300" - "a5020874657374303239" - "3400a60208746573743032393500a70208746573743032393600a80208746573743032393700a90208746573743032" - "393800aa020874657374" - "3032393900ab0208746573743033303000ac0208746573743033303100ad0208746573743033303200ae0208746573" - "743033303300af020874" - "6573743033303400b00208746573743033303500b10208746573743033303600b20208746573743033303700b30208" - "746573743033303800b4" - "0208746573743033303900b50208746573743033313000b60208746573743033313100b70208746573743033313200" - "b8020874657374303331" - "3300b90208746573743033313400ba0208746573743033313500bb0208746573743033313600bc0208746573743033" - "313700bd020874657374" - "3033313800be0208746573743033313900bf0208746573743033323000c00208746573743033323100c10208746573" - "743033323200c2020874" - "6573743033323300c30208746573743033323400c40208746573743033323500c50208746573743033323600c60208" - "746573743033323700c7" - "0208746573743033323800c80208746573743033323900c90208746573743033333000ca0208746573743033333100" - "cb020874657374303333" - "3200cc0208746573743033333300cd0208746573743033333400ce0208746573743033333500cf0208746573743033" - "333600d0020874657374" - "3033333700d10208746573743033333800d20208746573743033333900d30208746573743033343000d40208746573" - "743033343100d5020874" - "6573743033343200d60208746573743033343300d70208746573743033343400d80208746573743033343500d90208" - "746573743033343600da" - "0208746573743033343700db0208746573743033343800dc0208746573743033343900dd0208746573743033353000" - "de020874657374303335" - "3100df0208746573743033353200e00208746573743033353300e10208746573743033353400e20208746573743033" - "353500e3020874657374" - "3033353600e40208746573743033353700e50208746573743033353800e60208746573743033353900e70208746573" - "743033363000e8020874" - "6573743033363100e90208746573743033363200ea0208746573743033363300eb0208746573743033363400ec0208" - "746573743033363500ed" - "0208746573743033363600ee0208746573743033363700ef0208746573743033363800f00208746573743033363900" - "f1020874657374303337" - "3000f20208746573743033373100f30208746573743033373200f40208746573743033373300f50208746573743033" - "373400f6020874657374" - "3033373500f70208746573743033373600f80208746573743033373700f90208746573743033373800fa0208746573" - "743033373900fb020874" - "6573743033383000fc0208746573743033383100fd0208746573743033383200fe0208746573743033383300ff0208" - "74657374303338340080" - "0308746573743033383500810308746573743033383600820308746573743033383700830308746573743033383800" - "84030874657374303338" - "3900850308746573743033393000860308746573743033393100870308746573743033393200880308746573743033" - "39330089030874657374" - "30333934008a03087465737430333935008b03087465737430333936008c03087465737430333937008d0308746573" - "7430333938008e030874" - "65737430333939008f0308746573743034303000900308746573743034303100910308746573743034303200920308" - "74657374303430330093" - "0308746573743034303400940308746573743034303500950308746573743034303600960308746573743034303700" - "97030874657374303430" - "38009803087465737430343039009903087465737430343130009a03087465737430343131009b0308746573743034" - "3132009c030874657374" - "30343133009d03087465737430343134009e03087465737430343135009f0308746573743034313600a00308746573" - "743034313700a1030874" - "6573743034313800a20308746573743034313900a30308746573743034323000a40308746573743034323100a50308" - "746573743034323200a6" - "0308746573743034323300a70308746573743034323400a80308746573743034323500a90308746573743034323600" - "aa030874657374303432" - "3700ab0308746573743034323800ac0308746573743034323900ad0308746573743034333000ae0308746573743034" - "333100af030874657374" - "3034333200b00308746573743034333300b10308746573743034333400b20308746573743034333500b30308746573" - "743034333600b4030874" - "6573743034333700b50308746573743034333800b60308746573743034333900b70308746573743034343000b80308" - "746573743034343100b9" - "0308746573743034343200ba0308746573743034343300bb0308746573743034343400bc0308746573743034343500" - "bd030874657374303434" - "3600be0308746573743034343700bf0308746573743034343800c00308746573743034343900c10308746573743034" - "353000c2030874657374" - "3034353100c30308746573743034353200c40308746573743034353300c50308746573743034353400c60308746573" - "743034353500c7030874" - "6573743034353600c80308746573743034353700c90308746573743034353800ca0308746573743034353900cb0308" - "746573743034363000cc" - "0308746573743034363100cd0308746573743034363200ce0308746573743034363300cf0308746573743034363400" - "d0030874657374303436" - "3500d10308746573743034363600d20308746573743034363700d30308746573743034363800d40308746573743034" - "363900d5030874657374" - "3034373000d60308746573743034373100d70308746573743034373200d80308746573743034373300d90308746573" - "743034373400da030874" - "6573743034373500db0308746573743034373600dc0308746573743034373700dd0308746573743034373800de0308" - "746573743034373900df" - "0308746573743034383000e00308746573743034383100e10308746573743034383200e20308746573743034383300" - "e3030874657374303438" + "7430323635008902087465737430323636008a02087465737430323637008b02087465737430323638008c02087465" + "737430323639008d02087465737430323730008e02087465737430323731008f020874657374303237320090020874" + "6573743032373300910208746573743032373400920208746573743032373500930208746573743032373600940208" + "7465737430323737009502087465737430323738009602087465737430323739009702087465737430323830009802" + "087465737430323831009902087465737430323832009a02087465737430323833009b02087465737430323834009c" + "02087465737430323835009d02087465737430323836009e02087465737430323837009f0208746573743032383800" + "a00208746573743032383900a10208746573743032393000a20208746573743032393100a302087465737430323932" + "00a40208746573743032393300a50208746573743032393400a60208746573743032393500a7020874657374303239" + "3600a80208746573743032393700a90208746573743032393800aa0208746573743032393900ab0208746573743033" + "303000ac0208746573743033303100ad0208746573743033303200ae0208746573743033303300af02087465737430" + "33303400b00208746573743033303500b10208746573743033303600b20208746573743033303700b3020874657374" + "3033303800b40208746573743033303900b50208746573743033313000b60208746573743033313100b70208746573" + "743033313200b80208746573743033313300b90208746573743033313400ba0208746573743033313500bb02087465" + "73743033313600bc0208746573743033313700bd0208746573743033313800be0208746573743033313900bf020874" + "6573743033323000c00208746573743033323100c10208746573743033323200c20208746573743033323300c30208" + "746573743033323400c40208746573743033323500c50208746573743033323600c60208746573743033323700c702" + "08746573743033323800c80208746573743033323900c90208746573743033333000ca0208746573743033333100cb" + "0208746573743033333200cc0208746573743033333300cd0208746573743033333400ce0208746573743033333500" + "cf0208746573743033333600d00208746573743033333700d10208746573743033333800d202087465737430333339" + "00d30208746573743033343000d40208746573743033343100d50208746573743033343200d6020874657374303334" + "3300d70208746573743033343400d80208746573743033343500d90208746573743033343600da0208746573743033" + "343700db0208746573743033343800dc0208746573743033343900dd0208746573743033353000de02087465737430" + "33353100df0208746573743033353200e00208746573743033353300e10208746573743033353400e2020874657374" + "3033353500e30208746573743033353600e40208746573743033353700e50208746573743033353800e60208746573" + "743033353900e70208746573743033363000e80208746573743033363100e90208746573743033363200ea02087465" + "73743033363300eb0208746573743033363400ec0208746573743033363500ed0208746573743033363600ee020874" + "6573743033363700ef0208746573743033363800f00208746573743033363900f10208746573743033373000f20208" + "746573743033373100f30208746573743033373200f40208746573743033373300f50208746573743033373400f602" + "08746573743033373500f70208746573743033373600f80208746573743033373700f90208746573743033373800fa" + "0208746573743033373900fb0208746573743033383000fc0208746573743033383100fd0208746573743033383200" + "fe0208746573743033383300ff02087465737430333834008003087465737430333835008103087465737430333836" + "0082030874657374303338370083030874657374303338380084030874657374303338390085030874657374303339" + "3000860308746573743033393100870308746573743033393200880308746573743033393300890308746573743033" + "3934008a03087465737430333935008b03087465737430333936008c03087465737430333937008d03087465737430" + "333938008e03087465737430333939008f030874657374303430300090030874657374303430310091030874657374" + "3034303200920308746573743034303300930308746573743034303400940308746573743034303500950308746573" + "7430343036009603087465737430343037009703087465737430343038009803087465737430343039009903087465" + "737430343130009a03087465737430343131009b03087465737430343132009c03087465737430343133009d030874" + "65737430343134009e03087465737430343135009f0308746573743034313600a00308746573743034313700a10308" + "746573743034313800a20308746573743034313900a30308746573743034323000a40308746573743034323100a503" + "08746573743034323200a60308746573743034323300a70308746573743034323400a80308746573743034323500a9" + "0308746573743034323600aa0308746573743034323700ab0308746573743034323800ac0308746573743034323900" + "ad0308746573743034333000ae0308746573743034333100af0308746573743034333200b003087465737430343333" + "00b10308746573743034333400b20308746573743034333500b30308746573743034333600b4030874657374303433" + "3700b50308746573743034333800b60308746573743034333900b70308746573743034343000b80308746573743034" + "343100b90308746573743034343200ba0308746573743034343300bb0308746573743034343400bc03087465737430" + "34343500bd0308746573743034343600be0308746573743034343700bf0308746573743034343800c0030874657374" + "3034343900c10308746573743034353000c20308746573743034353100c30308746573743034353200c40308746573" + "743034353300c50308746573743034353400c60308746573743034353500c70308746573743034353600c803087465" + "73743034353700c90308746573743034353800ca0308746573743034353900cb0308746573743034363000cc030874" + "6573743034363100cd0308746573743034363200ce0308746573743034363300cf0308746573743034363400d00308" + "746573743034363500d10308746573743034363600d20308746573743034363700d30308746573743034363800d403" + "08746573743034363900d50308746573743034373000d60308746573743034373100d70308746573743034373200d8" + "0308746573743034373300d90308746573743034373400da0308746573743034373500db0308746573743034373600" + "dc0308746573743034373700dd0308746573743034373800de0308746573743034373900df03087465737430343830" + "00e00308746573743034383100e10308746573743034383200e20308746573743034383300e3030874657374303438" "3400e40308746573743034383500e50308746573743034383600e60308746573743034383700e70308746573743034" - "383800e8030874657374" - "3034383900e90308746573743034393000ea0308746573743034393100eb0308746573743034393200ec0308746573" - "743034393300ed030874" - "6573743034393400ee0308746573743034393500ef0308746573743034393600f00308746573743034393700f10308" - "746573743034393800f2" - "0308746573743034393900f30308746573743035303000f40308746573743035303100f50308746573743035303200" - "f6030874657374303530" - "3300f70308746573743035303400f80308746573743035303500f90308746573743035303600fa0308746573743035" - "303700fb030874657374" - "3035303800fc0308746573743035303900fd0308746573743035313000fe0308746573743035313100ff0308746573" - "74303531320080040874" - "6573743035313300810408746573743035313400820408746573743035313500830408746573743035313600840408" - "74657374303531370085" - "0408746573743035313800860408746573743035313900870408746573743035323000880408746573743035323100" - "89040874657374303532" - "32008a04087465737430353233008b04087465737430353234008c04087465737430353235008d0408746573743035" - "3236008e040874657374" - "30353237008f0408746573743035323800900408746573743035323900910408746573743035333000920408746573" - "74303533310093040874" - "6573743035333200940408746573743035333300950408746573743035333400960408746573743035333500970408" - "74657374303533360098" - "04087465737430353337009904087465737430353338009a04087465737430353339009b0408746573743035343000" - "9c040874657374303534" - "31009d04087465737430353432009e04087465737430353433009f0408746573743035343400a00408746573743035" - "343500a1040874657374" - "3035343600a20408746573743035343700a30408746573743035343800a40408746573743035343900a50408746573" - "743035353000a6040874" - "6573743035353100a70408746573743035353200a80408746573743035353300a90408746573743035353400aa0408" - "746573743035353500ab" - "0408746573743035353600ac0408746573743035353700ad0408746573743035353800ae0408746573743035353900" - "af040874657374303536" - "3000b00408746573743035363100b10408746573743035363200b20408746573743035363300b30408746573743035" - "363400b4040874657374" - "3035363500b50408746573743035363600b60408746573743035363700b70408746573743035363800b80408746573" - "743035363900b9040874" - "6573743035373000ba0408746573743035373100bb0408746573743035373200bc0408746573743035373300bd0408" - "746573743035373400be" - "0408746573743035373500bf0408746573743035373600c00408746573743035373700c10408746573743035373800" - "c2040874657374303537" - "3900c30408746573743035383000c40408746573743035383100c50408746573743035383200c60408746573743035" - "383300c7040874657374" - "3035383400c80408746573743035383500c90408746573743035383600ca0408746573743035383700cb0408746573" - "743035383800cc040874" - "6573743035383900cd0408746573743035393000ce0408746573743035393100cf0408746573743035393200d00408" - "746573743035393300d1" - "0408746573743035393400d20408746573743035393500d30408746573743035393600d40408746573743035393700" - "d5040874657374303539" - "3800d60408746573743035393900d70408746573743036303000d80408746573743036303100d90408746573743036" - "303200da040874657374" - "3036303300db0408746573743036303400dc0408746573743036303500dd0408746573743036303600de0408746573" - "743036303700df040874" - "6573743036303800e00408746573743036303900e10408746573743036313000e20408746573743036313100e30408" - "746573743036313200e4" - "0408746573743036313300e50408746573743036313400e60408746573743036313500e70408746573743036313600" - "e8040874657374303631" - "3700e90408746573743036313800ea0408746573743036313900eb0408746573743036323000ec0408746573743036" - "323100ed040874657374" - "3036323200ee0408746573743036323300ef0408746573743036323400f00408746573743036323500f10408746573" - "743036323600f2040874" - "6573743036323700f30408746573743036323800f40408746573743036323900f50408746573743036333000f60408" - "746573743036333100f7" - "0408746573743036333200f80408746573743036333300f90408746573743036333400fa0408746573743036333500" - "fb040874657374303633" - "3600fc0408746573743036333700fd0408746573743036333800fe0408746573743036333900ff0408746573743036" - "34300080050874657374" - "3036343100810508746573743036343200820508746573743036343300830508746573743036343400840508746573" - "74303634350085050874" - "6573743036343600860508746573743036343700870508746573743036343800880508746573743036343900890508" - "7465737430363530008a" - "05087465737430363531008b05087465737430363532008c05087465737430363533008d0508746573743036353400" - "8e050874657374303635" - "35008f0508746573743036353600900508746573743036353700910508746573743036353800920508746573743036" - "35390093050874657374" - "3036363000940508746573743036363100950508746573743036363200960508746573743036363300970508746573" - "74303636340098050874" - "65737430363635009905087465737430363636009a05087465737430363637009b05087465737430363638009c0508" - "7465737430363639009d" - "05087465737430363730009e05087465737430363731009f0508746573743036373200a00508746573743036373300" - "a1050874657374303637" - "3400a20508746573743036373500a30508746573743036373600a40508746573743036373700a50508746573743036" - "373800a6050874657374" - "3036373900a70508746573743036383000a80508746573743036383100a90508746573743036383200aa0508746573" - "743036383300ab050874" - "6573743036383400ac0508746573743036383500ad0508746573743036383600ae0508746573743036383700af0508" - "746573743036383800b0" - "0508746573743036383900b10508746573743036393000b20508746573743036393100b30508746573743036393200" - "b4050874657374303639" - "3300b50508746573743036393400b60508746573743036393500b70508746573743036393600b80508746573743036" - "393700b9050874657374" - "3036393800ba0508746573743036393900bb0508746573743037303000bc0508746573743037303100bd0508746573" - "743037303200be050874" - "6573743037303300bf0508746573743037303400c00508746573743037303500c10508746573743037303600c20508" - "746573743037303700c3" + "383800e80308746573743034383900e90308746573743034393000ea0308746573743034393100eb03087465737430" + "34393200ec0308746573743034393300ed0308746573743034393400ee0308746573743034393500ef030874657374" + "3034393600f00308746573743034393700f10308746573743034393800f20308746573743034393900f30308746573" + "743035303000f40308746573743035303100f50308746573743035303200f60308746573743035303300f703087465" + "73743035303400f80308746573743035303500f90308746573743035303600fa0308746573743035303700fb030874" + "6573743035303800fc0308746573743035303900fd0308746573743035313000fe0308746573743035313100ff0308" + "7465737430353132008004087465737430353133008104087465737430353134008204087465737430353135008304" + "0874657374303531360084040874657374303531370085040874657374303531380086040874657374303531390087" + "04087465737430353230008804087465737430353231008904087465737430353232008a0408746573743035323300" + "8b04087465737430353234008c04087465737430353235008d04087465737430353236008e04087465737430353237" + "008f040874657374303532380090040874657374303532390091040874657374303533300092040874657374303533" + "3100930408746573743035333200940408746573743035333300950408746573743035333400960408746573743035" + "3335009704087465737430353336009804087465737430353337009904087465737430353338009a04087465737430" + "353339009b04087465737430353430009c04087465737430353431009d04087465737430353432009e040874657374" + "30353433009f0408746573743035343400a00408746573743035343500a10408746573743035343600a20408746573" + "743035343700a30408746573743035343800a40408746573743035343900a50408746573743035353000a604087465" + "73743035353100a70408746573743035353200a80408746573743035353300a90408746573743035353400aa040874" + "6573743035353500ab0408746573743035353600ac0408746573743035353700ad0408746573743035353800ae0408" + "746573743035353900af0408746573743035363000b00408746573743035363100b10408746573743035363200b204" + "08746573743035363300b30408746573743035363400b40408746573743035363500b50408746573743035363600b6" + "0408746573743035363700b70408746573743035363800b80408746573743035363900b90408746573743035373000" + "ba0408746573743035373100bb0408746573743035373200bc0408746573743035373300bd04087465737430353734" + "00be0408746573743035373500bf0408746573743035373600c00408746573743035373700c1040874657374303537" + "3800c20408746573743035373900c30408746573743035383000c40408746573743035383100c50408746573743035" + "383200c60408746573743035383300c70408746573743035383400c80408746573743035383500c904087465737430" + "35383600ca0408746573743035383700cb0408746573743035383800cc0408746573743035383900cd040874657374" + "3035393000ce0408746573743035393100cf0408746573743035393200d00408746573743035393300d10408746573" + "743035393400d20408746573743035393500d30408746573743035393600d40408746573743035393700d504087465" + "73743035393800d60408746573743035393900d70408746573743036303000d80408746573743036303100d9040874" + "6573743036303200da0408746573743036303300db0408746573743036303400dc0408746573743036303500dd0408" + "746573743036303600de0408746573743036303700df0408746573743036303800e00408746573743036303900e104" + "08746573743036313000e20408746573743036313100e30408746573743036313200e40408746573743036313300e5" + "0408746573743036313400e60408746573743036313500e70408746573743036313600e80408746573743036313700" + "e90408746573743036313800ea0408746573743036313900eb0408746573743036323000ec04087465737430363231" + "00ed0408746573743036323200ee0408746573743036323300ef0408746573743036323400f0040874657374303632" + "3500f10408746573743036323600f20408746573743036323700f30408746573743036323800f40408746573743036" + "323900f50408746573743036333000f60408746573743036333100f70408746573743036333200f804087465737430" + "36333300f90408746573743036333400fa0408746573743036333500fb0408746573743036333600fc040874657374" + "3036333700fd0408746573743036333800fe0408746573743036333900ff0408746573743036343000800508746573" + "7430363431008105087465737430363432008205087465737430363433008305087465737430363434008405087465" + "7374303634350085050874657374303634360086050874657374303634370087050874657374303634380088050874" + "65737430363439008905087465737430363530008a05087465737430363531008b05087465737430363532008c0508" + "7465737430363533008d05087465737430363534008e05087465737430363535008f05087465737430363536009005" + "0874657374303635370091050874657374303635380092050874657374303635390093050874657374303636300094" + "0508746573743036363100950508746573743036363200960508746573743036363300970508746573743036363400" + "9805087465737430363635009905087465737430363636009a05087465737430363637009b05087465737430363638" + "009c05087465737430363639009d05087465737430363730009e05087465737430363731009f050874657374303637" + "3200a00508746573743036373300a10508746573743036373400a20508746573743036373500a30508746573743036" + "373600a40508746573743036373700a50508746573743036373800a60508746573743036373900a705087465737430" + "36383000a80508746573743036383100a90508746573743036383200aa0508746573743036383300ab050874657374" + "3036383400ac0508746573743036383500ad0508746573743036383600ae0508746573743036383700af0508746573" + "743036383800b00508746573743036383900b10508746573743036393000b20508746573743036393100b305087465" + "73743036393200b40508746573743036393300b50508746573743036393400b60508746573743036393500b7050874" + "6573743036393600b80508746573743036393700b90508746573743036393800ba0508746573743036393900bb0508" + "746573743037303000bc0508746573743037303100bd0508746573743037303200be0508746573743037303300bf05" + "08746573743037303400c00508746573743037303500c10508746573743037303600c20508746573743037303700c3" "0508746573743037303800c40508746573743037303900c50508746573743037313000c60508746573743037313100" - "c7050874657374303731" - "3200c80508746573743037313300c90508746573743037313400ca0508746573743037313500cb0508746573743037" - "313600cc050874657374" - "3037313700cd0508746573743037313800ce0508746573743037313900cf0508746573743037323000d00508746573" - "743037323100d1050874" - "6573743037323200d20508746573743037323300d30508746573743037323400d40508746573743037323500d50508" - "746573743037323600d6" - "0508746573743037323700d70508746573743037323800d80508746573743037323900d90508746573743037333000" - "da050874657374303733" - "3100db0508746573743037333200dc0508746573743037333300dd0508746573743037333400de0508746573743037" - "333500df050874657374" - "3037333600e00508746573743037333700e10508746573743037333800e20508746573743037333900e30508746573" - "743037343000e4050874" - "6573743037343100e50508746573743037343200e60508746573743037343300e70508746573743037343400e80508" - "746573743037343500e9" - "0508746573743037343600ea0508746573743037343700eb0508746573743037343800ec0508746573743037343900" - "ed050874657374303735" - "3000ee0508746573743037353100ef0508746573743037353200f00508746573743037353300f10508746573743037" - "353400f2050874657374" - "3037353500f30508746573743037353600f40508746573743037353700f50508746573743037353800f60508746573" - "743037353900f7050874" - "6573743037363000f80508746573743037363100f90508746573743037363200fa0508746573743037363300fb0508" - "746573743037363400fc" - "0508746573743037363500fd0508746573743037363600fe0508746573743037363700ff0508746573743037363800" - "80060874657374303736" - "3900810608746573743037373000820608746573743037373100830608746573743037373200840608746573743037" - "37330085060874657374" - "3037373400860608746573743037373500870608746573743037373600880608746573743037373700890608746573" - "7430373738008a060874" - "65737430373739008b06087465737430373830008c06087465737430373831008d06087465737430373832008e0608" - "7465737430373833008f" - "0608746573743037383400900608746573743037383500910608746573743037383600920608746573743037383700" - "93060874657374303738" - "3800940608746573743037383900950608746573743037393000960608746573743037393100970608746573743037" - "39320098060874657374" - "30373933009906087465737430373934009a06087465737430373935009b06087465737430373936009c0608746573" - "7430373937009d060874" - "65737430373938009e06087465737430373939009f0608746573743038303000a00608746573743038303100a10608" - "746573743038303200a2" - "0608746573743038303300a30608746573743038303400a40608746573743038303500a50608746573743038303600" - "a6060874657374303830" - "3700a70608746573743038303800a80608746573743038303900a90608746573743038313000aa0608746573743038" - "313100ab060874657374" - "3038313200ac0608746573743038313300ad0608746573743038313400ae0608746573743038313500af0608746573" - "743038313600b0060874" - "6573743038313700b10608746573743038313800b20608746573743038313900b30608746573743038323000b40608" - "746573743038323100b5" - "0608746573743038323200b60608746573743038323300b70608746573743038323400b80608746573743038323500" - "b9060874657374303832" - "3600ba0608746573743038323700bb0608746573743038323800bc0608746573743038323900bd0608746573743038" - "333000be060874657374" - "3038333100bf0608746573743038333200c00608746573743038333300c10608746573743038333400c20608746573" - "743038333500c3060874" - "6573743038333600c40608746573743038333700c50608746573743038333800c60608746573743038333900c70608" - "746573743038343000c8" - "0608746573743038343100c90608746573743038343200ca0608746573743038343300cb0608746573743038343400" - "cc060874657374303834" - "3500cd0608746573743038343600ce0608746573743038343700cf0608746573743038343800d00608746573743038" - "343900d1060874657374" - "3038353000d20608746573743038353100d30608746573743038353200d40608746573743038353300d50608746573" - "743038353400d6060874" - "6573743038353500d70608746573743038353600d80608746573743038353700d90608746573743038353800da0608" - "746573743038353900db" - "0608746573743038363000dc0608746573743038363100dd0608746573743038363200de0608746573743038363300" - "df060874657374303836" - "3400e00608746573743038363500e10608746573743038363600e20608746573743038363700e30608746573743038" - "363800e4060874657374" - "3038363900e50608746573743038373000e60608746573743038373100e70608746573743038373200e80608746573" - "743038373300e9060874" - "6573743038373400ea0608746573743038373500eb0608746573743038373600ec0608746573743038373700ed0608" - "746573743038373800ee" - "0608746573743038373900ef0608746573743038383000f00608746573743038383100f10608746573743038383200" - "f2060874657374303838" - "3300f30608746573743038383400f40608746573743038383500f50608746573743038383600f60608746573743038" - "383700f7060874657374" - "3038383800f80608746573743038383900f90608746573743038393000fa0608746573743038393100fb0608746573" - "743038393200fc060874" - "6573743038393300fd0608746573743038393400fe0608746573743038393500ff0608746573743038393600800708" - "74657374303839370081" - "0708746573743038393800820708746573743038393900830708746573743039303000840708746573743039303100" - "85070874657374303930" - "3200860708746573743039303300870708746573743039303400880708746573743039303500890708746573743039" - "3036008a070874657374" - "30393037008b07087465737430393038008c07087465737430393039008d07087465737430393130008e0708746573" - "7430393131008f070874" - "6573743039313200900708746573743039313300910708746573743039313400920708746573743039313500930708" - "74657374303931360094" - "0708746573743039313700950708746573743039313800960708746573743039313900970708746573743039323000" - "98070874657374303932" - "31009907087465737430393232009a07087465737430393233009b07087465737430393234009c0708746573743039" - "3235009d070874657374" - "30393236009e07087465737430393237009f0708746573743039323800a00708746573743039323900a10708746573" - "743039333000a2070874" + "c70508746573743037313200c80508746573743037313300c90508746573743037313400ca05087465737430373135" + "00cb0508746573743037313600cc0508746573743037313700cd0508746573743037313800ce050874657374303731" + "3900cf0508746573743037323000d00508746573743037323100d10508746573743037323200d20508746573743037" + "323300d30508746573743037323400d40508746573743037323500d50508746573743037323600d605087465737430" + "37323700d70508746573743037323800d80508746573743037323900d90508746573743037333000da050874657374" + "3037333100db0508746573743037333200dc0508746573743037333300dd0508746573743037333400de0508746573" + "743037333500df0508746573743037333600e00508746573743037333700e10508746573743037333800e205087465" + "73743037333900e30508746573743037343000e40508746573743037343100e50508746573743037343200e6050874" + "6573743037343300e70508746573743037343400e80508746573743037343500e90508746573743037343600ea0508" + "746573743037343700eb0508746573743037343800ec0508746573743037343900ed0508746573743037353000ee05" + "08746573743037353100ef0508746573743037353200f00508746573743037353300f10508746573743037353400f2" + "0508746573743037353500f30508746573743037353600f40508746573743037353700f50508746573743037353800" + "f60508746573743037353900f70508746573743037363000f80508746573743037363100f905087465737430373632" + "00fa0508746573743037363300fb0508746573743037363400fc0508746573743037363500fd050874657374303736" + "3600fe0508746573743037363700ff0508746573743037363800800608746573743037363900810608746573743037" + "3730008206087465737430373731008306087465737430373732008406087465737430373733008506087465737430" + "3737340086060874657374303737350087060874657374303737360088060874657374303737370089060874657374" + "30373738008a06087465737430373739008b06087465737430373830008c06087465737430373831008d0608746573" + "7430373832008e06087465737430373833008f06087465737430373834009006087465737430373835009106087465" + "7374303738360092060874657374303738370093060874657374303738380094060874657374303738390095060874" + "6573743037393000960608746573743037393100970608746573743037393200980608746573743037393300990608" + "7465737430373934009a06087465737430373935009b06087465737430373936009c06087465737430373937009d06" + "087465737430373938009e06087465737430373939009f0608746573743038303000a00608746573743038303100a1" + "0608746573743038303200a20608746573743038303300a30608746573743038303400a40608746573743038303500" + "a50608746573743038303600a60608746573743038303700a70608746573743038303800a806087465737430383039" + "00a90608746573743038313000aa0608746573743038313100ab0608746573743038313200ac060874657374303831" + "3300ad0608746573743038313400ae0608746573743038313500af0608746573743038313600b00608746573743038" + "313700b10608746573743038313800b20608746573743038313900b30608746573743038323000b406087465737430" + "38323100b50608746573743038323200b60608746573743038323300b70608746573743038323400b8060874657374" + "3038323500b90608746573743038323600ba0608746573743038323700bb0608746573743038323800bc0608746573" + "743038323900bd0608746573743038333000be0608746573743038333100bf0608746573743038333200c006087465" + "73743038333300c10608746573743038333400c20608746573743038333500c30608746573743038333600c4060874" + "6573743038333700c50608746573743038333800c60608746573743038333900c70608746573743038343000c80608" + "746573743038343100c90608746573743038343200ca0608746573743038343300cb0608746573743038343400cc06" + "08746573743038343500cd0608746573743038343600ce0608746573743038343700cf0608746573743038343800d0" + "0608746573743038343900d10608746573743038353000d20608746573743038353100d30608746573743038353200" + "d40608746573743038353300d50608746573743038353400d60608746573743038353500d706087465737430383536" + "00d80608746573743038353700d90608746573743038353800da0608746573743038353900db060874657374303836" + "3000dc0608746573743038363100dd0608746573743038363200de0608746573743038363300df0608746573743038" + "363400e00608746573743038363500e10608746573743038363600e20608746573743038363700e306087465737430" + "38363800e40608746573743038363900e50608746573743038373000e60608746573743038373100e7060874657374" + "3038373200e80608746573743038373300e90608746573743038373400ea0608746573743038373500eb0608746573" + "743038373600ec0608746573743038373700ed0608746573743038373800ee0608746573743038373900ef06087465" + "73743038383000f00608746573743038383100f10608746573743038383200f20608746573743038383300f3060874" + "6573743038383400f40608746573743038383500f50608746573743038383600f60608746573743038383700f70608" + "746573743038383800f80608746573743038383900f90608746573743038393000fa0608746573743038393100fb06" + "08746573743038393200fc0608746573743038393300fd0608746573743038393400fe0608746573743038393500ff" + "0608746573743038393600800708746573743038393700810708746573743038393800820708746573743038393900" + "8307087465737430393030008407087465737430393031008507087465737430393032008607087465737430393033" + "008707087465737430393034008807087465737430393035008907087465737430393036008a070874657374303930" + "37008b07087465737430393038008c07087465737430393039008d07087465737430393130008e0708746573743039" + "3131008f07087465737430393132009007087465737430393133009107087465737430393134009207087465737430" + "3931350093070874657374303931360094070874657374303931370095070874657374303931380096070874657374" + "30393139009707087465737430393230009807087465737430393231009907087465737430393232009a0708746573" + "7430393233009b07087465737430393234009c07087465737430393235009d07087465737430393236009e07087465" + "737430393237009f0708746573743039323800a00708746573743039323900a10708746573743039333000a2070874" "6573743039333100a30708746573743039333200a40708746573743039333300a50708746573743039333400a60708" - "746573743039333500a7" - "0708746573743039333600a80708746573743039333700a90708746573743039333800aa0708746573743039333900" - "ab070874657374303934" - "3000ac0708746573743039343100ad0708746573743039343200ae0708746573743039343300af0708746573743039" - "343400b0070874657374" - "3039343500b10708746573743039343600b20708746573743039343700b30708746573743039343800b40708746573" - "743039343900b5070874" - "6573743039353000b60708746573743039353100b70708746573743039353200b80708746573743039353300b90708" - "746573743039353400ba" - "0708746573743039353500bb0708746573743039353600bc0708746573743039353700bd0708746573743039353800" - "be070874657374303935" - "3900bf0708746573743039363000c00708746573743039363100c10708746573743039363200c20708746573743039" - "363300c3070874657374" - "3039363400c40708746573743039363500c50708746573743039363600c60708746573743039363700c70708746573" - "743039363800c8070874" - "6573743039363900c90708746573743039373000ca0708746573743039373100cb0708746573743039373200cc0708" - "746573743039373300cd" - "0708746573743039373400ce0708746573743039373500cf0708746573743039373600d00708746573743039373700" - "d1070874657374303937" - "3800d20708746573743039373900d30708746573743039383000d40708746573743039383100d50708746573743039" - "383200d6070874657374" - "3039383300d70708746573743039383400d80708746573743039383500d90708746573743039383600da0708746573" - "743039383700db070874" - "6573743039383800dc0708746573743039383900dd0708746573743039393000de0708746573743039393100df0708" - "746573743039393200e0" - "0708746573743039393300e10708746573743039393400e20708746573743039393500e30708746573743039393600" - "e4070874657374303939" - "3700e50708746573743039393800e60708746573743039393900e70708746573743130303000e80708746573743130" - "303100e9070874657374" - "3130303200ea0708746573743130303300eb0708746573743130303400ec0708746573743130303500ed0708746573" - "743130303600ee070874" - "6573743130303700ef0708746573743130303800f00708746573743130303900f10708746573743130313000f20708" - "746573743130313100f3" - "0708746573743130313200f40708746573743130313300f50708746573743130313400f60708746573743130313500" - "f7070874657374313031" - "3600f80708746573743130313700f90708746573743130313800fa0708746573743130313900fb0708746573743130" - "323000fc070874657374" - "3130323100fd0708746573743130323200fe0708746573743130323300ff0708746573743130323400800808746573" - "74313032350081080874" - "6573743130323600820808746573743130323700830808746573743130323800840808746573743130323900850808" - "74657374313033300086" - "0808746573743130333100870808746573743130333200880808746573743130333300890808746573743130333400" - "8a080874657374313033" - "35008b08087465737431303336008c08087465737431303337008d08087465737431303338008e0808746573743130" - "3339008f080874657374" - "3130343000900808746573743130343100910808746573743130343200920808746573743130343300930808746573" - "74313034340094080874" - "6573743130343500950808746573743130343600960808746573743130343700970808746573743130343800980808" - "74657374313034390099" - "08087465737431303530009a08087465737431303531009b08087465737431303532009c0808746573743130353300" - "9d080874657374313035" - "34009e08087465737431303535009f0808746573743130353600a00808746573743130353700a10808746573743130" - "353800a2080874657374" - "3130353900a30808746573743130363000a40808746573743130363100a50808746573743130363200a60808746573" - "743130363300a7080874" - "6573743130363400a80808746573743130363500a90808746573743130363600aa0808746573743130363700ab0808" - "746573743130363800ac" - "0808746573743130363900ad0808746573743130373000ae0808746573743130373100af0808746573743130373200" - "b0080874657374313037" - "3300b10808746573743130373400b20808746573743130373500b30808746573743130373600b40808746573743130" - "373700b5080874657374" - "3130373800b60808746573743130373900b70808746573743130383000b80808746573743130383100b90808746573" - "743130383200ba080874" - "6573743130383300bb0808746573743130383400bc0808746573743130383500bd0808746573743130383600be0808" - "746573743130383700bf" - "0808746573743130383800c00808746573743130383900c10808746573743130393000c20808746573743130393100" - "c3080874657374313039" - "3200c40808746573743130393300c50808746573743130393400c60808746573743130393500c70808746573743130" - "393600c8080874657374" - "3130393700c90808746573743130393800ca0808746573743130393900cb0808746573743131303000cc0808746573" - "743131303100cd080874" - "6573743131303200ce0808746573743131303300cf0808746573743131303400d00808746573743131303500d10808" - "746573743131303600d2" - "0808746573743131303700d30808746573743131303800d40808746573743131303900d50808746573743131313000" - "d6080874657374313131" - "3100d70808746573743131313200d80808746573743131313300d90808746573743131313400da0808746573743131" - "313500db080874657374" - "3131313600dc0808746573743131313700dd0808746573743131313800de0808746573743131313900df0808746573" - "743131323000e0080874" - "6573743131323100e10808746573743131323200e20808746573743131323300e30808746573743131323400e40808" - "746573743131323500e5" - "0808746573743131323600e60808746573743131323700e70808746573743131323800e80808746573743131323900" - "e9080874657374313133" - "3000ea0808746573743131333100eb0808746573743131333200ec0808746573743131333300ed0808746573743131" - "333400ee080874657374" - "3131333500ef0808746573743131333600f00808746573743131333700f10808746573743131333800f20808746573" - "743131333900f3080874" - "6573743131343000f40808746573743131343100f50808746573743131343200f60808746573743131343300f70808" - "746573743131343400f8" - "0808746573743131343500f90808746573743131343600fa0808746573743131343700fb0808746573743131343800" - "fc080874657374313134" - "3900fd0808746573743131353000fe0808746573743131353100ff0808746573743131353200800908746573743131" - "35330081090874657374" + "746573743039333500a70708746573743039333600a80708746573743039333700a90708746573743039333800aa07" + "08746573743039333900ab0708746573743039343000ac0708746573743039343100ad0708746573743039343200ae" + "0708746573743039343300af0708746573743039343400b00708746573743039343500b10708746573743039343600" + "b20708746573743039343700b30708746573743039343800b40708746573743039343900b507087465737430393530" + "00b60708746573743039353100b70708746573743039353200b80708746573743039353300b9070874657374303935" + "3400ba0708746573743039353500bb0708746573743039353600bc0708746573743039353700bd0708746573743039" + "353800be0708746573743039353900bf0708746573743039363000c00708746573743039363100c107087465737430" + "39363200c20708746573743039363300c30708746573743039363400c40708746573743039363500c5070874657374" + "3039363600c60708746573743039363700c70708746573743039363800c80708746573743039363900c90708746573" + "743039373000ca0708746573743039373100cb0708746573743039373200cc0708746573743039373300cd07087465" + "73743039373400ce0708746573743039373500cf0708746573743039373600d00708746573743039373700d1070874" + "6573743039373800d20708746573743039373900d30708746573743039383000d40708746573743039383100d50708" + "746573743039383200d60708746573743039383300d70708746573743039383400d80708746573743039383500d907" + "08746573743039383600da0708746573743039383700db0708746573743039383800dc0708746573743039383900dd" + "0708746573743039393000de0708746573743039393100df0708746573743039393200e00708746573743039393300" + "e10708746573743039393400e20708746573743039393500e30708746573743039393600e407087465737430393937" + "00e50708746573743039393800e60708746573743039393900e70708746573743130303000e8070874657374313030" + "3100e90708746573743130303200ea0708746573743130303300eb0708746573743130303400ec0708746573743130" + "303500ed0708746573743130303600ee0708746573743130303700ef0708746573743130303800f007087465737431" + "30303900f10708746573743130313000f20708746573743130313100f30708746573743130313200f4070874657374" + "3130313300f50708746573743130313400f60708746573743130313500f70708746573743130313600f80708746573" + "743130313700f90708746573743130313800fa0708746573743130313900fb0708746573743130323000fc07087465" + "73743130323100fd0708746573743130323200fe0708746573743130323300ff070874657374313032340080080874" + "6573743130323500810808746573743130323600820808746573743130323700830808746573743130323800840808" + "7465737431303239008508087465737431303330008608087465737431303331008708087465737431303332008808" + "087465737431303333008908087465737431303334008a08087465737431303335008b08087465737431303336008c" + "08087465737431303337008d08087465737431303338008e08087465737431303339008f0808746573743130343000" + "9008087465737431303431009108087465737431303432009208087465737431303433009308087465737431303434" + "0094080874657374313034350095080874657374313034360096080874657374313034370097080874657374313034" + "38009808087465737431303439009908087465737431303530009a08087465737431303531009b0808746573743130" + "3532009c08087465737431303533009d08087465737431303534009e08087465737431303535009f08087465737431" + "30353600a00808746573743130353700a10808746573743130353800a20808746573743130353900a3080874657374" + "3130363000a40808746573743130363100a50808746573743130363200a60808746573743130363300a70808746573" + "743130363400a80808746573743130363500a90808746573743130363600aa0808746573743130363700ab08087465" + "73743130363800ac0808746573743130363900ad0808746573743130373000ae0808746573743130373100af080874" + "6573743130373200b00808746573743130373300b10808746573743130373400b20808746573743130373500b30808" + "746573743130373600b40808746573743130373700b50808746573743130373800b60808746573743130373900b708" + "08746573743130383000b80808746573743130383100b90808746573743130383200ba0808746573743130383300bb" + "0808746573743130383400bc0808746573743130383500bd0808746573743130383600be0808746573743130383700" + "bf0808746573743130383800c00808746573743130383900c10808746573743130393000c208087465737431303931" + "00c30808746573743130393200c40808746573743130393300c50808746573743130393400c6080874657374313039" + "3500c70808746573743130393600c80808746573743130393700c90808746573743130393800ca0808746573743130" + "393900cb0808746573743131303000cc0808746573743131303100cd0808746573743131303200ce08087465737431" + "31303300cf0808746573743131303400d00808746573743131303500d10808746573743131303600d2080874657374" + "3131303700d30808746573743131303800d40808746573743131303900d50808746573743131313000d60808746573" + "743131313100d70808746573743131313200d80808746573743131313300d90808746573743131313400da08087465" + "73743131313500db0808746573743131313600dc0808746573743131313700dd0808746573743131313800de080874" + "6573743131313900df0808746573743131323000e00808746573743131323100e10808746573743131323200e20808" + "746573743131323300e30808746573743131323400e40808746573743131323500e50808746573743131323600e608" + "08746573743131323700e70808746573743131323800e80808746573743131323900e90808746573743131333000ea" + "0808746573743131333100eb0808746573743131333200ec0808746573743131333300ed0808746573743131333400" + "ee0808746573743131333500ef0808746573743131333600f00808746573743131333700f108087465737431313338" + "00f20808746573743131333900f30808746573743131343000f40808746573743131343100f5080874657374313134" + "3200f60808746573743131343300f70808746573743131343400f80808746573743131343500f90808746573743131" + "343600fa0808746573743131343700fb0808746573743131343800fc0808746573743131343900fd08087465737431" + "31353000fe0808746573743131353100ff080874657374313135320080090874657374313135330081090874657374" "3131353400820908746573743131353500830908746573743131353600840908746573743131353700850908746573" - "74313135380086090874" - "65737431313539008709087465737431313630008809087465737431313631008909087465737431313632008a0908" - "7465737431313633008b" - "09087465737431313634008c09087465737431313635008d09087465737431313636008e0908746573743131363700" - "8f090874657374313136" - "3800900908746573743131363900910908746573743131373000920908746573743131373100930908746573743131" - "37320094090874657374" - "3131373300950908746573743131373400960908746573743131373500970908746573743131373600980908746573" - "74313137370099090874" - "65737431313738009a09087465737431313739009b09087465737431313830009c09087465737431313831009d0908" - "7465737431313832009e" - "09087465737431313833009f0908746573743131383400a00908746573743131383500a10908746573743131383600" - "a2090874657374313138" - "3700a30908746573743131383800a40908746573743131383900a50908746573743131393000a60908746573743131" - "393100a7090874657374" - "3131393200a80908746573743131393300a90908746573743131393400aa0908746573743131393500ab0908746573" - "743131393600ac090874" - "6573743131393700ad0908746573743131393800ae0908746573743131393900af0908746573743132303000b00908" - "746573743132303100b1" - "0908746573743132303200b20908746573743132303300b30908746573743132303400b40908746573743132303500" - "b5090874657374313230" - "3600b60908746573743132303700b70908746573743132303800b80908746573743132303900b90908746573743132" - "313000ba090874657374" - "3132313100bb0908746573743132313200bc0908746573743132313300bd0908746573743132313400be0908746573" - "743132313500bf090874" - "6573743132313600c00908746573743132313700c10908746573743132313800c20908746573743132313900c30908" - "746573743132323000c4" - "0908746573743132323100c50908746573743132323200c60908746573743132323300c70908746573743132323400" - "c8090874657374313232" - "3500c90908746573743132323600ca0908746573743132323700cb0908746573743132323800cc0908746573743132" - "323900cd090874657374" - "3132333000ce0908746573743132333100cf0908746573743132333200d00908746573743132333300d10908746573" - "743132333400d2090874" - "6573743132333500d30908746573743132333600d40908746573743132333700d50908746573743132333800d60908" - "746573743132333900d7" - "0908746573743132343000d80908746573743132343100d90908746573743132343200da0908746573743132343300" - "db090874657374313234" - "3400dc0908746573743132343500dd0908746573743132343600de0908746573743132343700df0908746573743132" - "343800e0090874657374" - "3132343900e10908746573743132353000e20908746573743132353100e30908746573743132353200e40908746573" - "743132353300e5090874" - "6573743132353400e60908746573743132353500e70908746573743132353600e80908746573743132353700e90908" - "746573743132353800ea" - "0908746573743132353900eb0908746573743132363000ec0908746573743132363100ed0908746573743132363200" - "ee090874657374313236" - "3300ef0908746573743132363400f00908746573743132363500f10908746573743132363600f20908746573743132" - "363700f3090874657374" - "3132363800f40908746573743132363900f50908746573743132373000f60908746573743132373100f70908746573" - "743132373200f8090874" - "6573743132373300f90908746573743132373400fa0908746573743132373500fb0908746573743132373600fc0908" - "746573743132373700fd" - "0908746573743132373800fe0908746573743132373900ff0908746573743132383000800a08746573743132383100" - "810a0874657374313238" - "3200820a08746573743132383300830a08746573743132383400840a08746573743132383500850a08746573743132" - "383600860a0874657374" - "3132383700870a08746573743132383800880a08746573743132383900890a087465737431323930008a0a08746573" - "7431323931008b0a0874" - "65737431323932008c0a087465737431323933008d0a087465737431323934008e0a087465737431323935008f0a08" - "74657374313239360090" - "0a08746573743132393700910a08746573743132393800920a08746573743132393900930a08746573743133303000" - "940a0874657374313330" - "3100950a08746573743133303200960a08746573743133303300970a08746573743133303400980a08746573743133" - "303500990a0874657374" - "31333036009a0a087465737431333037009b0a087465737431333038009c0a087465737431333039009d0a08746573" - "7431333130009e0a0874" - "65737431333131009f0a08746573743133313200a00a08746573743133313300a10a08746573743133313400a20a08" - "746573743133313500a3" - "0a08746573743133313600a40a08746573743133313700a50a08746573743133313800a60a08746573743133313900" - "a70a0874657374313332" - "3000a80a08746573743133323100a90a08746573743133323200aa0a08746573743133323300ab0a08746573743133" - "323400ac0a0874657374" - "3133323500ad0a08746573743133323600ae0a08746573743133323700af0a08746573743133323800b00a08746573" - "743133323900b10a0874" - "6573743133333000b20a08746573743133333100b30a08746573743133333200b40a08746573743133333300b50a08" - "746573743133333400b6" - "0a08746573743133333500b70a08746573743133333600b80a08746573743133333700b90a08746573743133333800" - "ba0a0874657374313333" - "3900bb0a08746573743133343000bc0a08746573743133343100bd0a08746573743133343200be0a08746573743133" - "343300bf0a0874657374" - "3133343400c00a08746573743133343500c10a08746573743133343600c20a08746573743133343700c30a08746573" - "743133343800c40a0874" - "6573743133343900c50a08746573743133353000c60a08746573743133353100c70a08746573743133353200c80a08" - "746573743133353300c9" - "0a08746573743133353400ca0a08746573743133353500cb0a08746573743133353600cc0a08746573743133353700" - "cd0a0874657374313335" - "3800ce0a08746573743133353900cf0a08746573743133363000d00a08746573743133363100d10a08746573743133" - "363200d20a0874657374" - "3133363300d30a08746573743133363400d40a08746573743133363500d50a08746573743133363600d60a08746573" - "743133363700d70a0874" - "6573743133363800d80a08746573743133363900d90a08746573743133373000da0a08746573743133373100db0a08" - "746573743133373200dc" - "0a08746573743133373300dd0a08746573743133373400de0a08746573743133373500df0a08746573743133373600" - "e00a0874657374313337" + "7431313538008609087465737431313539008709087465737431313630008809087465737431313631008909087465" + "737431313632008a09087465737431313633008b09087465737431313634008c09087465737431313635008d090874" + "65737431313636008e09087465737431313637008f0908746573743131363800900908746573743131363900910908" + "7465737431313730009209087465737431313731009309087465737431313732009409087465737431313733009509" + "0874657374313137340096090874657374313137350097090874657374313137360098090874657374313137370099" + "09087465737431313738009a09087465737431313739009b09087465737431313830009c0908746573743131383100" + "9d09087465737431313832009e09087465737431313833009f0908746573743131383400a009087465737431313835" + "00a10908746573743131383600a20908746573743131383700a30908746573743131383800a4090874657374313138" + "3900a50908746573743131393000a60908746573743131393100a70908746573743131393200a80908746573743131" + "393300a90908746573743131393400aa0908746573743131393500ab0908746573743131393600ac09087465737431" + "31393700ad0908746573743131393800ae0908746573743131393900af0908746573743132303000b0090874657374" + "3132303100b10908746573743132303200b20908746573743132303300b30908746573743132303400b40908746573" + "743132303500b50908746573743132303600b60908746573743132303700b70908746573743132303800b809087465" + "73743132303900b90908746573743132313000ba0908746573743132313100bb0908746573743132313200bc090874" + "6573743132313300bd0908746573743132313400be0908746573743132313500bf0908746573743132313600c00908" + "746573743132313700c10908746573743132313800c20908746573743132313900c30908746573743132323000c409" + "08746573743132323100c50908746573743132323200c60908746573743132323300c70908746573743132323400c8" + "0908746573743132323500c90908746573743132323600ca0908746573743132323700cb0908746573743132323800" + "cc0908746573743132323900cd0908746573743132333000ce0908746573743132333100cf09087465737431323332" + "00d00908746573743132333300d10908746573743132333400d20908746573743132333500d3090874657374313233" + "3600d40908746573743132333700d50908746573743132333800d60908746573743132333900d70908746573743132" + "343000d80908746573743132343100d90908746573743132343200da0908746573743132343300db09087465737431" + "32343400dc0908746573743132343500dd0908746573743132343600de0908746573743132343700df090874657374" + "3132343800e00908746573743132343900e10908746573743132353000e20908746573743132353100e30908746573" + "743132353200e40908746573743132353300e50908746573743132353400e60908746573743132353500e709087465" + "73743132353600e80908746573743132353700e90908746573743132353800ea0908746573743132353900eb090874" + "6573743132363000ec0908746573743132363100ed0908746573743132363200ee0908746573743132363300ef0908" + "746573743132363400f00908746573743132363500f10908746573743132363600f20908746573743132363700f309" + "08746573743132363800f40908746573743132363900f50908746573743132373000f60908746573743132373100f7" + "0908746573743132373200f80908746573743132373300f90908746573743132373400fa0908746573743132373500" + "fb0908746573743132373600fc0908746573743132373700fd0908746573743132373800fe09087465737431323739" + "00ff0908746573743132383000800a08746573743132383100810a08746573743132383200820a0874657374313238" + "3300830a08746573743132383400840a08746573743132383500850a08746573743132383600860a08746573743132" + "383700870a08746573743132383800880a08746573743132383900890a087465737431323930008a0a087465737431" + "323931008b0a087465737431323932008c0a087465737431323933008d0a087465737431323934008e0a0874657374" + "31323935008f0a08746573743132393600900a08746573743132393700910a08746573743132393800920a08746573" + "743132393900930a08746573743133303000940a08746573743133303100950a08746573743133303200960a087465" + "73743133303300970a08746573743133303400980a08746573743133303500990a087465737431333036009a0a0874" + "65737431333037009b0a087465737431333038009c0a087465737431333039009d0a087465737431333130009e0a08" + "7465737431333131009f0a08746573743133313200a00a08746573743133313300a10a08746573743133313400a20a" + "08746573743133313500a30a08746573743133313600a40a08746573743133313700a50a08746573743133313800a6" + "0a08746573743133313900a70a08746573743133323000a80a08746573743133323100a90a08746573743133323200" + "aa0a08746573743133323300ab0a08746573743133323400ac0a08746573743133323500ad0a087465737431333236" + "00ae0a08746573743133323700af0a08746573743133323800b00a08746573743133323900b10a0874657374313333" + "3000b20a08746573743133333100b30a08746573743133333200b40a08746573743133333300b50a08746573743133" + "333400b60a08746573743133333500b70a08746573743133333600b80a08746573743133333700b90a087465737431" + "33333800ba0a08746573743133333900bb0a08746573743133343000bc0a08746573743133343100bd0a0874657374" + "3133343200be0a08746573743133343300bf0a08746573743133343400c00a08746573743133343500c10a08746573" + "743133343600c20a08746573743133343700c30a08746573743133343800c40a08746573743133343900c50a087465" + "73743133353000c60a08746573743133353100c70a08746573743133353200c80a08746573743133353300c90a0874" + "6573743133353400ca0a08746573743133353500cb0a08746573743133353600cc0a08746573743133353700cd0a08" + "746573743133353800ce0a08746573743133353900cf0a08746573743133363000d00a08746573743133363100d10a" + "08746573743133363200d20a08746573743133363300d30a08746573743133363400d40a08746573743133363500d5" + "0a08746573743133363600d60a08746573743133363700d70a08746573743133363800d80a08746573743133363900" + "d90a08746573743133373000da0a08746573743133373100db0a08746573743133373200dc0a087465737431333733" + "00dd0a08746573743133373400de0a08746573743133373500df0a08746573743133373600e00a0874657374313337" "3700e10a08746573743133373800e20a08746573743133373900e30a08746573743133383000e40a08746573743133" - "383100e50a0874657374" - "3133383200e60a08746573743133383300e70a08746573743133383400e80a08746573743133383500e90a08746573" - "743133383600ea0a0874" - "6573743133383700eb0a08746573743133383800ec0a08746573743133383900ed0a08746573743133393000ee0a08" - "746573743133393100ef" - "0a08746573743133393200f00a08746573743133393300f10a08746573743133393400f20a08746573743133393500" - "f30a0874657374313339" - "3600f40a08746573743133393700f50a08746573743133393800f60a08746573743133393900f70a08746573743134" - "303000f80a0874657374" - "3134303100f90a08746573743134303200fa0a08746573743134303300fb0a08746573743134303400fc0a08746573" - "743134303500fd0a0874" - "6573743134303600fe0a08746573743134303700ff0a08746573743134303800800b08746573743134303900810b08" - "74657374313431300082" - "0b08746573743134313100830b08746573743134313200840b08746573743134313300850b08746573743134313400" - "860b0874657374313431" - "3500870b08746573743134313600880b08746573743134313700890b087465737431343138008a0b08746573743134" - "3139008b0b0874657374" - "31343230008c0b087465737431343231008d0b087465737431343232008e0b087465737431343233008f0b08746573" - "743134323400900b0874" - "6573743134323500910b08746573743134323600920b08746573743134323700930b08746573743134323800940b08" - "74657374313432390095" - "0b08746573743134333000960b08746573743134333100970b08746573743134333200980b08746573743134333300" - "990b0874657374313433" - "34009a0b087465737431343335009b0b087465737431343336009c0b087465737431343337009d0b08746573743134" - "3338009e0b0874657374" - "31343339009f0b08746573743134343000a00b08746573743134343100a10b08746573743134343200a20b08746573" - "743134343300a30b0874" - "6573743134343400a40b08746573743134343500a50b08746573743134343600a60b08746573743134343700a70b08" - "746573743134343800a8" - "0b08746573743134343900a90b08746573743134353000aa0b08746573743134353100ab0b08746573743134353200" - "ac0b0874657374313435" - "3300ad0b08746573743134353400ae0b08746573743134353500af0b08746573743134353600b00b08746573743134" - "353700b10b0874657374" - "3134353800b20b08746573743134353900b30b08746573743134363000b40b08746573743134363100b50b08746573" - "743134363200b60b0874" - "6573743134363300b70b08746573743134363400b80b08746573743134363500b90b08746573743134363600ba0b08" - "746573743134363700bb" - "0b08746573743134363800bc0b08746573743134363900bd0b08746573743134373000be0b08746573743134373100" - "bf0b0874657374313437" - "3200c00b08746573743134373300c10b08746573743134373400c20b08746573743134373500c30b08746573743134" - "373600c40b0874657374" - "3134373700c50b08746573743134373800c60b08746573743134373900c70b08746573743134383000c80b08746573" - "743134383100c90b0874" - "6573743134383200ca0b08746573743134383300cb0b08746573743134383400cc0b08746573743134383500cd0b08" - "746573743134383600ce" - "0b08746573743134383700cf0b08746573743134383800d00b08746573743134383900d10b08746573743134393000" - "d20b0874657374313439" - "3100d30b08746573743134393200d40b08746573743134393300d50b08746573743134393400d60b08746573743134" - "393500d70b0874657374" - "3134393600d80b08746573743134393700d90b08746573743134393800da0b08746573743134393900db0b08746573" - "743135303000dc0b0874" - "6573743135303100dd0b08746573743135303200de0b08746573743135303300df0b08746573743135303400e00b08" - "746573743135303500e1" - "0b08746573743135303600e20b08746573743135303700e30b08746573743135303800e40b08746573743135303900" - "e50b0874657374313531" - "3000e60b08746573743135313100e70b08746573743135313200e80b08746573743135313300e90b08746573743135" - "313400ea0b0874657374" - "3135313500eb0b08746573743135313600ec0b08746573743135313700ed0b08746573743135313800ee0b08746573" - "743135313900ef0b0874" - "6573743135323000f00b08746573743135323100f10b08746573743135323200f20b08746573743135323300f30b08" - "746573743135323400f4" - "0b08746573743135323500f50b08746573743135323600f60b08746573743135323700f70b08746573743135323800" - "f80b0874657374313532" - "3900f90b08746573743135333000fa0b08746573743135333100fb0b08746573743135333200fc0b08746573743135" - "333300fd0b0874657374" - "3135333400fe0b08746573743135333500ff0b08746573743135333600800c08746573743135333700810c08746573" - "743135333800820c0874" - "6573743135333900830c08746573743135343000840c08746573743135343100850c08746573743135343200860c08" - "74657374313534330087" - "0c08746573743135343400880c08746573743135343500890c087465737431353436008a0c08746573743135343700" - "8b0c0874657374313534" - "38008c0c087465737431353439008d0c087465737431353530008e0c087465737431353531008f0c08746573743135" - "353200900c0874657374" - "3135353300910c08746573743135353400920c08746573743135353500930c08746573743135353600940c08746573" - "743135353700950c0874" - "6573743135353800960c08746573743135353900970c08746573743135363000980c08746573743135363100990c08" - "7465737431353632009a" - "0c087465737431353633009b0c087465737431353634009c0c087465737431353635009d0c08746573743135363600" - "9e0c0874657374313536" - "37009f0c08746573743135363800a00c08746573743135363900a10c08746573743135373000a20c08746573743135" - "373100a30c0874657374" - "3135373200a40c08746573743135373300a50c08746573743135373400a60c08746573743135373500a70c08746573" - "743135373600a80c0874" - "6573743135373700a90c08746573743135373800aa0c08746573743135373900ab0c08746573743135383000ac0c08" - "746573743135383100ad" - "0c08746573743135383200ae0c08746573743135383300af0c08746573743135383400b00c08746573743135383500" - "b10c0874657374313538" - "3600b20c08746573743135383700b30c08746573743135383800b40c08746573743135383900b50c08746573743135" - "393000b60c0874657374" - "3135393100b70c08746573743135393200b80c08746573743135393300b90c08746573743135393400ba0c08746573" - "743135393500bb0c0874" - "6573743135393600bc0c08746573743135393700bd0c08746573743135393800be0c08746573743135393900bf0c08" - "746573743136303000c0" + "383100e50a08746573743133383200e60a08746573743133383300e70a08746573743133383400e80a087465737431" + "33383500e90a08746573743133383600ea0a08746573743133383700eb0a08746573743133383800ec0a0874657374" + "3133383900ed0a08746573743133393000ee0a08746573743133393100ef0a08746573743133393200f00a08746573" + "743133393300f10a08746573743133393400f20a08746573743133393500f30a08746573743133393600f40a087465" + "73743133393700f50a08746573743133393800f60a08746573743133393900f70a08746573743134303000f80a0874" + "6573743134303100f90a08746573743134303200fa0a08746573743134303300fb0a08746573743134303400fc0a08" + "746573743134303500fd0a08746573743134303600fe0a08746573743134303700ff0a08746573743134303800800b" + "08746573743134303900810b08746573743134313000820b08746573743134313100830b0874657374313431320084" + "0b08746573743134313300850b08746573743134313400860b08746573743134313500870b08746573743134313600" + "880b08746573743134313700890b087465737431343138008a0b087465737431343139008b0b087465737431343230" + "008c0b087465737431343231008d0b087465737431343232008e0b087465737431343233008f0b0874657374313432" + "3400900b08746573743134323500910b08746573743134323600920b08746573743134323700930b08746573743134" + "323800940b08746573743134323900950b08746573743134333000960b08746573743134333100970b087465737431" + "34333200980b08746573743134333300990b087465737431343334009a0b087465737431343335009b0b0874657374" + "31343336009c0b087465737431343337009d0b087465737431343338009e0b087465737431343339009f0b08746573" + "743134343000a00b08746573743134343100a10b08746573743134343200a20b08746573743134343300a30b087465" + "73743134343400a40b08746573743134343500a50b08746573743134343600a60b08746573743134343700a70b0874" + "6573743134343800a80b08746573743134343900a90b08746573743134353000aa0b08746573743134353100ab0b08" + "746573743134353200ac0b08746573743134353300ad0b08746573743134353400ae0b08746573743134353500af0b" + "08746573743134353600b00b08746573743134353700b10b08746573743134353800b20b08746573743134353900b3" + "0b08746573743134363000b40b08746573743134363100b50b08746573743134363200b60b08746573743134363300" + "b70b08746573743134363400b80b08746573743134363500b90b08746573743134363600ba0b087465737431343637" + "00bb0b08746573743134363800bc0b08746573743134363900bd0b08746573743134373000be0b0874657374313437" + "3100bf0b08746573743134373200c00b08746573743134373300c10b08746573743134373400c20b08746573743134" + "373500c30b08746573743134373600c40b08746573743134373700c50b08746573743134373800c60b087465737431" + "34373900c70b08746573743134383000c80b08746573743134383100c90b08746573743134383200ca0b0874657374" + "3134383300cb0b08746573743134383400cc0b08746573743134383500cd0b08746573743134383600ce0b08746573" + "743134383700cf0b08746573743134383800d00b08746573743134383900d10b08746573743134393000d20b087465" + "73743134393100d30b08746573743134393200d40b08746573743134393300d50b08746573743134393400d60b0874" + "6573743134393500d70b08746573743134393600d80b08746573743134393700d90b08746573743134393800da0b08" + "746573743134393900db0b08746573743135303000dc0b08746573743135303100dd0b08746573743135303200de0b" + "08746573743135303300df0b08746573743135303400e00b08746573743135303500e10b08746573743135303600e2" + "0b08746573743135303700e30b08746573743135303800e40b08746573743135303900e50b08746573743135313000" + "e60b08746573743135313100e70b08746573743135313200e80b08746573743135313300e90b087465737431353134" + "00ea0b08746573743135313500eb0b08746573743135313600ec0b08746573743135313700ed0b0874657374313531" + "3800ee0b08746573743135313900ef0b08746573743135323000f00b08746573743135323100f10b08746573743135" + "323200f20b08746573743135323300f30b08746573743135323400f40b08746573743135323500f50b087465737431" + "35323600f60b08746573743135323700f70b08746573743135323800f80b08746573743135323900f90b0874657374" + "3135333000fa0b08746573743135333100fb0b08746573743135333200fc0b08746573743135333300fd0b08746573" + "743135333400fe0b08746573743135333500ff0b08746573743135333600800c08746573743135333700810c087465" + "73743135333800820c08746573743135333900830c08746573743135343000840c08746573743135343100850c0874" + "6573743135343200860c08746573743135343300870c08746573743135343400880c08746573743135343500890c08" + "7465737431353436008a0c087465737431353437008b0c087465737431353438008c0c087465737431353439008d0c" + "087465737431353530008e0c087465737431353531008f0c08746573743135353200900c0874657374313535330091" + "0c08746573743135353400920c08746573743135353500930c08746573743135353600940c08746573743135353700" + "950c08746573743135353800960c08746573743135353900970c08746573743135363000980c087465737431353631" + "00990c087465737431353632009a0c087465737431353633009b0c087465737431353634009c0c0874657374313536" + "35009d0c087465737431353636009e0c087465737431353637009f0c08746573743135363800a00c08746573743135" + "363900a10c08746573743135373000a20c08746573743135373100a30c08746573743135373200a40c087465737431" + "35373300a50c08746573743135373400a60c08746573743135373500a70c08746573743135373600a80c0874657374" + "3135373700a90c08746573743135373800aa0c08746573743135373900ab0c08746573743135383000ac0c08746573" + "743135383100ad0c08746573743135383200ae0c08746573743135383300af0c08746573743135383400b00c087465" + "73743135383500b10c08746573743135383600b20c08746573743135383700b30c08746573743135383800b40c0874" + "6573743135383900b50c08746573743135393000b60c08746573743135393100b70c08746573743135393200b80c08" + "746573743135393300b90c08746573743135393400ba0c08746573743135393500bb0c08746573743135393600bc0c" + "08746573743135393700bd0c08746573743135393800be0c08746573743135393900bf0c08746573743136303000c0" "0c08746573743136303100c10c08746573743136303200c20c08746573743136303300c30c08746573743136303400" - "c40c0874657374313630" - "3500c50c08746573743136303600c60c08746573743136303700c70c08746573743136303800c80c08746573743136" - "303900c90c0874657374" - "3136313000ca0c08746573743136313100cb0c08746573743136313200cc0c08746573743136313300cd0c08746573" - "743136313400ce0c0874" - "6573743136313500cf0c08746573743136313600d00c08746573743136313700d10c08746573743136313800d20c08" - "746573743136313900d3" - "0c08746573743136323000d40c08746573743136323100d50c08746573743136323200d60c08746573743136323300" - "d70c0874657374313632" - "3400d80c08746573743136323500d90c08746573743136323600da0c08746573743136323700db0c08746573743136" - "323800dc0c0874657374" - "3136323900dd0c08746573743136333000de0c08746573743136333100df0c08746573743136333200e00c08746573" - "743136333300e10c0874" - "6573743136333400e20c08746573743136333500e30c08746573743136333600e40c08746573743136333700e50c08" - "746573743136333800e6" - "0c08746573743136333900e70c08746573743136343000e80c08746573743136343100e90c08746573743136343200" - "ea0c0874657374313634" - "3300eb0c08746573743136343400ec0c08746573743136343500ed0c08746573743136343600ee0c08746573743136" - "343700ef0c0874657374" - "3136343800f00c08746573743136343900f10c08746573743136353000f20c08746573743136353100f30c08746573" - "743136353200f40c0874" - "6573743136353300f50c08746573743136353400f60c08746573743136353500f70c08746573743136353600f80c08" - "746573743136353700f9" - "0c08746573743136353800fa0c08746573743136353900fb0c08746573743136363000fc0c08746573743136363100" - "fd0c0874657374313636" - "3200fe0c08746573743136363300ff0c08746573743136363400800d08746573743136363500810d08746573743136" - "363600820d0874657374" - "3136363700830d08746573743136363800840d08746573743136363900850d08746573743136373000860d08746573" - "743136373100870d0874" - "6573743136373200880d08746573743136373300890d087465737431363734008a0d087465737431363735008b0d08" - "7465737431363736008c" - "0d087465737431363737008d0d087465737431363738008e0d087465737431363739008f0d08746573743136383000" - "900d0874657374313638" - "3100910d08746573743136383200920d08746573743136383300930d08746573743136383400940d08746573743136" - "383500950d0874657374" - "3136383600960d08746573743136383700970d08746573743136383800980d08746573743136383900990d08746573" - "7431363930009a0d0874" - "65737431363931009b0d087465737431363932009c0d087465737431363933009d0d087465737431363934009e0d08" - "7465737431363935009f" - "0d08746573743136393600a00d08746573743136393700a10d08746573743136393800a20d08746573743136393900" - "a30d0874657374313730" - "3000a40d08746573743137303100a50d08746573743137303200a60d08746573743137303300a70d08746573743137" - "303400a80d0874657374" - "3137303500a90d08746573743137303600aa0d08746573743137303700ab0d08746573743137303800ac0d08746573" - "743137303900ad0d0874" - "6573743137313000ae0d08746573743137313100af0d08746573743137313200b00d08746573743137313300b10d08" - "746573743137313400b2" - "0d08746573743137313500b30d08746573743137313600b40d08746573743137313700b50d08746573743137313800" - "b60d0874657374313731" - "3900b70d08746573743137323000b80d08746573743137323100b90d08746573743137323200ba0d08746573743137" - "323300bb0d0874657374" - "3137323400bc0d08746573743137323500bd0d08746573743137323600be0d08746573743137323700bf0d08746573" - "743137323800c00d0874" - "6573743137323900c10d08746573743137333000c20d08746573743137333100c30d08746573743137333200c40d08" - "746573743137333300c5" - "0d08746573743137333400c60d08746573743137333500c70d08746573743137333600c80d08746573743137333700" - "c90d0874657374313733" - "3800ca0d08746573743137333900cb0d08746573743137343000cc0d08746573743137343100cd0d08746573743137" - "343200ce0d0874657374" - "3137343300cf0d08746573743137343400d00d08746573743137343500d10d08746573743137343600d20d08746573" - "743137343700d30d0874" - "6573743137343800d40d08746573743137343900d50d08746573743137353000d60d08746573743137353100d70d08" - "746573743137353200d8" - "0d08746573743137353300d90d08746573743137353400da0d08746573743137353500db0d08746573743137353600" - "dc0d0874657374313735" - "3700dd0d08746573743137353800de0d08746573743137353900df0d08746573743137363000e00d08746573743137" - "363100e10d0874657374" - "3137363200e20d08746573743137363300e30d08746573743137363400e40d08746573743137363500e50d08746573" - "743137363600e60d0874" - "6573743137363700e70d08746573743137363800e80d08746573743137363900e90d08746573743137373000ea0d08" - "746573743137373100eb" - "0d08746573743137373200ec0d08746573743137373300ed0d08746573743137373400ee0d08746573743137373500" - "ef0d0874657374313737" - "3600f00d08746573743137373700f10d08746573743137373800f20d08746573743137373900f30d08746573743137" - "383000f40d0874657374" - "3137383100f50d08746573743137383200f60d08746573743137383300f70d08746573743137383400f80d08746573" - "743137383500f90d0874" - "6573743137383600fa0d08746573743137383700fb0d08746573743137383800fc0d08746573743137383900fd0d08" - "746573743137393000fe" - "0d08746573743137393100ff0d08746573743137393200800e08746573743137393300810e08746573743137393400" - "820e0874657374313739" - "3500830e08746573743137393600840e08746573743137393700850e08746573743137393800860e08746573743137" - "393900870e0874657374" - "3138303000880e08746573743138303100890e087465737431383032008a0e087465737431383033008b0e08746573" - "7431383034008c0e0874" - "65737431383035008d0e087465737431383036008e0e087465737431383037008f0e08746573743138303800900e08" - "74657374313830390091" - "0e08746573743138313000920e08746573743138313100930e08746573743138313200940e08746573743138313300" - "950e0874657374313831" - "3400960e08746573743138313500970e08746573743138313600980e08746573743138313700990e08746573743138" - "3138009a0e0874657374" - "31383139009b0e087465737431383230009c0e087465737431383231009d0e087465737431383232009e0e08746573" - "7431383233009f0e0874" + "c40c08746573743136303500c50c08746573743136303600c60c08746573743136303700c70c087465737431363038" + "00c80c08746573743136303900c90c08746573743136313000ca0c08746573743136313100cb0c0874657374313631" + "3200cc0c08746573743136313300cd0c08746573743136313400ce0c08746573743136313500cf0c08746573743136" + "313600d00c08746573743136313700d10c08746573743136313800d20c08746573743136313900d30c087465737431" + "36323000d40c08746573743136323100d50c08746573743136323200d60c08746573743136323300d70c0874657374" + "3136323400d80c08746573743136323500d90c08746573743136323600da0c08746573743136323700db0c08746573" + "743136323800dc0c08746573743136323900dd0c08746573743136333000de0c08746573743136333100df0c087465" + "73743136333200e00c08746573743136333300e10c08746573743136333400e20c08746573743136333500e30c0874" + "6573743136333600e40c08746573743136333700e50c08746573743136333800e60c08746573743136333900e70c08" + "746573743136343000e80c08746573743136343100e90c08746573743136343200ea0c08746573743136343300eb0c" + "08746573743136343400ec0c08746573743136343500ed0c08746573743136343600ee0c08746573743136343700ef" + "0c08746573743136343800f00c08746573743136343900f10c08746573743136353000f20c08746573743136353100" + "f30c08746573743136353200f40c08746573743136353300f50c08746573743136353400f60c087465737431363535" + "00f70c08746573743136353600f80c08746573743136353700f90c08746573743136353800fa0c0874657374313635" + "3900fb0c08746573743136363000fc0c08746573743136363100fd0c08746573743136363200fe0c08746573743136" + "363300ff0c08746573743136363400800d08746573743136363500810d08746573743136363600820d087465737431" + "36363700830d08746573743136363800840d08746573743136363900850d08746573743136373000860d0874657374" + "3136373100870d08746573743136373200880d08746573743136373300890d087465737431363734008a0d08746573" + "7431363735008b0d087465737431363736008c0d087465737431363737008d0d087465737431363738008e0d087465" + "737431363739008f0d08746573743136383000900d08746573743136383100910d08746573743136383200920d0874" + "6573743136383300930d08746573743136383400940d08746573743136383500950d08746573743136383600960d08" + "746573743136383700970d08746573743136383800980d08746573743136383900990d087465737431363930009a0d" + "087465737431363931009b0d087465737431363932009c0d087465737431363933009d0d087465737431363934009e" + "0d087465737431363935009f0d08746573743136393600a00d08746573743136393700a10d08746573743136393800" + "a20d08746573743136393900a30d08746573743137303000a40d08746573743137303100a50d087465737431373032" + "00a60d08746573743137303300a70d08746573743137303400a80d08746573743137303500a90d0874657374313730" + "3600aa0d08746573743137303700ab0d08746573743137303800ac0d08746573743137303900ad0d08746573743137" + "313000ae0d08746573743137313100af0d08746573743137313200b00d08746573743137313300b10d087465737431" + "37313400b20d08746573743137313500b30d08746573743137313600b40d08746573743137313700b50d0874657374" + "3137313800b60d08746573743137313900b70d08746573743137323000b80d08746573743137323100b90d08746573" + "743137323200ba0d08746573743137323300bb0d08746573743137323400bc0d08746573743137323500bd0d087465" + "73743137323600be0d08746573743137323700bf0d08746573743137323800c00d08746573743137323900c10d0874" + "6573743137333000c20d08746573743137333100c30d08746573743137333200c40d08746573743137333300c50d08" + "746573743137333400c60d08746573743137333500c70d08746573743137333600c80d08746573743137333700c90d" + "08746573743137333800ca0d08746573743137333900cb0d08746573743137343000cc0d08746573743137343100cd" + "0d08746573743137343200ce0d08746573743137343300cf0d08746573743137343400d00d08746573743137343500" + "d10d08746573743137343600d20d08746573743137343700d30d08746573743137343800d40d087465737431373439" + "00d50d08746573743137353000d60d08746573743137353100d70d08746573743137353200d80d0874657374313735" + "3300d90d08746573743137353400da0d08746573743137353500db0d08746573743137353600dc0d08746573743137" + "353700dd0d08746573743137353800de0d08746573743137353900df0d08746573743137363000e00d087465737431" + "37363100e10d08746573743137363200e20d08746573743137363300e30d08746573743137363400e40d0874657374" + "3137363500e50d08746573743137363600e60d08746573743137363700e70d08746573743137363800e80d08746573" + "743137363900e90d08746573743137373000ea0d08746573743137373100eb0d08746573743137373200ec0d087465" + "73743137373300ed0d08746573743137373400ee0d08746573743137373500ef0d08746573743137373600f00d0874" + "6573743137373700f10d08746573743137373800f20d08746573743137373900f30d08746573743137383000f40d08" + "746573743137383100f50d08746573743137383200f60d08746573743137383300f70d08746573743137383400f80d" + "08746573743137383500f90d08746573743137383600fa0d08746573743137383700fb0d08746573743137383800fc" + "0d08746573743137383900fd0d08746573743137393000fe0d08746573743137393100ff0d08746573743137393200" + "800e08746573743137393300810e08746573743137393400820e08746573743137393500830e087465737431373936" + "00840e08746573743137393700850e08746573743137393800860e08746573743137393900870e0874657374313830" + "3000880e08746573743138303100890e087465737431383032008a0e087465737431383033008b0e08746573743138" + "3034008c0e087465737431383035008d0e087465737431383036008e0e087465737431383037008f0e087465737431" + "38303800900e08746573743138303900910e08746573743138313000920e08746573743138313100930e0874657374" + "3138313200940e08746573743138313300950e08746573743138313400960e08746573743138313500970e08746573" + "743138313600980e08746573743138313700990e087465737431383138009a0e087465737431383139009b0e087465" + "737431383230009c0e087465737431383231009d0e087465737431383232009e0e087465737431383233009f0e0874" "6573743138323400a00e08746573743138323500a10e08746573743138323600a20e08746573743138323700a30e08" - "746573743138323800a4" - "0e08746573743138323900a50e08746573743138333000a60e08746573743138333100a70e08746573743138333200" - "a80e0874657374313833" - "3300a90e08746573743138333400aa0e08746573743138333500ab0e08746573743138333600ac0e08746573743138" - "333700ad0e0874657374" - "3138333800ae0e08746573743138333900af0e08746573743138343000b00e08746573743138343100b10e08746573" - "743138343200b20e0874" - "6573743138343300b30e08746573743138343400b40e08746573743138343500b50e08746573743138343600b60e08" - "746573743138343700b7" - "0e08746573743138343800b80e08746573743138343900b90e08746573743138353000ba0e08746573743138353100" - "bb0e0874657374313835" - "3200bc0e08746573743138353300bd0e08746573743138353400be0e08746573743138353500bf0e08746573743138" - "353600c00e0874657374" - "3138353700c10e08746573743138353800c20e08746573743138353900c30e08746573743138363000c40e08746573" - "743138363100c50e0874" - "6573743138363200c60e08746573743138363300c70e08746573743138363400c80e08746573743138363500c90e08" - "746573743138363600ca" - "0e08746573743138363700cb0e08746573743138363800cc0e08746573743138363900cd0e08746573743138373000" - "ce0e0874657374313837" - "3100cf0e08746573743138373200d00e08746573743138373300d10e08746573743138373400d20e08746573743138" - "373500d30e0874657374" - "3138373600d40e08746573743138373700d50e08746573743138373800d60e08746573743138373900d70e08746573" - "743138383000d80e0874" - "6573743138383100d90e08746573743138383200da0e08746573743138383300db0e08746573743138383400dc0e08" - "746573743138383500dd" - "0e08746573743138383600de0e08746573743138383700df0e08746573743138383800e00e08746573743138383900" - "e10e0874657374313839" - "3000e20e08746573743138393100e30e08746573743138393200e40e08746573743138393300e50e08746573743138" - "393400e60e0874657374" - "3138393500e70e08746573743138393600e80e08746573743138393700e90e08746573743138393800ea0e08746573" - "743138393900eb0e0874" - "6573743139303000ec0e08746573743139303100ed0e08746573743139303200ee0e08746573743139303300ef0e08" - "746573743139303400f0" - "0e08746573743139303500f10e08746573743139303600f20e08746573743139303700f30e08746573743139303800" - "f40e0874657374313930" - "3900f50e08746573743139313000f60e08746573743139313100f70e08746573743139313200f80e08746573743139" - "313300f90e0874657374" - "3139313400fa0e08746573743139313500fb0e08746573743139313600fc0e08746573743139313700fd0e08746573" - "743139313800fe0e0874" - "6573743139313900ff0e08746573743139323000800f08746573743139323100810f08746573743139323200820f08" - "74657374313932330083" - "0f08746573743139323400840f08746573743139323500850f08746573743139323600860f08746573743139323700" - "870f0874657374313932" - "3800880f08746573743139323900890f087465737431393330008a0f087465737431393331008b0f08746573743139" - "3332008c0f0874657374" - "31393333008d0f087465737431393334008e0f087465737431393335008f0f08746573743139333600900f08746573" - "743139333700910f0874" - "6573743139333800920f08746573743139333900930f08746573743139343000940f08746573743139343100950f08" - "74657374313934320096" - "0f08746573743139343300970f08746573743139343400980f08746573743139343500990f08746573743139343600" - "9a0f0874657374313934" - "37009b0f087465737431393438009c0f087465737431393439009d0f087465737431393530009e0f08746573743139" - "3531009f0f0874657374" - "3139353200a00f08746573743139353300a10f08746573743139353400a20f08746573743139353500a30f08746573" - "743139353600a40f0874" - "6573743139353700a50f08746573743139353800a60f08746573743139353900a70f08746573743139363000a80f08" - "746573743139363100a9" - "0f08746573743139363200aa0f08746573743139363300ab0f08746573743139363400ac0f08746573743139363500" - "ad0f0874657374313936" - "3600ae0f08746573743139363700af0f08746573743139363800b00f08746573743139363900b10f08746573743139" - "373000b20f0874657374" - "3139373100b30f08746573743139373200b40f08746573743139373300b50f08746573743139373400b60f08746573" - "743139373500b70f0874" - "6573743139373600b80f08746573743139373700b90f08746573743139373800ba0f08746573743139373900bb0f08" - "746573743139383000bc" - "0f08746573743139383100bd0f08746573743139383200be0f08746573743139383300bf0f08746573743139383400" - "c00f0874657374313938" - "3500c10f08746573743139383600c20f08746573743139383700c30f08746573743139383800c40f08746573743139" - "383900c50f0874657374" - "3139393000c60f08746573743139393100c70f08746573743139393200c80f08746573743139393300c90f08746573" - "743139393400ca0f0874" - "6573743139393500cb0f08746573743139393600cc0f08746573743139393700cd0f08746573743139393800ce0f08" - "746573743139393900cf" - "0f08746573743230303000d00f08746573743230303100d10f08746573743230303200d20f08746573743230303300" - "d30f0874657374323030" - "3400d40f08746573743230303500d50f08746573743230303600d60f08746573743230303700d70f08746573743230" - "303800d80f0874657374" - "3230303900d90f08746573743230313000da0f08746573743230313100db0f08746573743230313200dc0f08746573" - "743230313300dd0f0874" - "6573743230313400de0f08746573743230313500df0f08746573743230313600e00f08746573743230313700e10f08" - "746573743230313800e2" - "0f08746573743230313900e30f08746573743230323000e40f08746573743230323100e50f08746573743230323200" - "e60f0874657374323032" - "3300e70f08746573743230323400e80f08746573743230323500e90f08746573743230323600ea0f08746573743230" - "323700eb0f0874657374" - "3230323800ec0f08746573743230323900ed0f08746573743230333000ee0f08746573743230333100ef0f08746573" - "743230333200f00f0874" - "6573743230333300f10f08746573743230333400f20f08746573743230333500f30f08746573743230333600f40f08" - "746573743230333700f5" - "0f08746573743230333800f60f08746573743230333900f70f08746573743230343000f80f08746573743230343100" - "f90f0874657374323034" - "3200fa0f08746573743230343300fb0f08746573743230343400fc0f08746573743230343500fd0f08746573743230" - "343600fe0f0874657374" + "746573743138323800a40e08746573743138323900a50e08746573743138333000a60e08746573743138333100a70e" + "08746573743138333200a80e08746573743138333300a90e08746573743138333400aa0e08746573743138333500ab" + "0e08746573743138333600ac0e08746573743138333700ad0e08746573743138333800ae0e08746573743138333900" + "af0e08746573743138343000b00e08746573743138343100b10e08746573743138343200b20e087465737431383433" + "00b30e08746573743138343400b40e08746573743138343500b50e08746573743138343600b60e0874657374313834" + "3700b70e08746573743138343800b80e08746573743138343900b90e08746573743138353000ba0e08746573743138" + "353100bb0e08746573743138353200bc0e08746573743138353300bd0e08746573743138353400be0e087465737431" + "38353500bf0e08746573743138353600c00e08746573743138353700c10e08746573743138353800c20e0874657374" + "3138353900c30e08746573743138363000c40e08746573743138363100c50e08746573743138363200c60e08746573" + "743138363300c70e08746573743138363400c80e08746573743138363500c90e08746573743138363600ca0e087465" + "73743138363700cb0e08746573743138363800cc0e08746573743138363900cd0e08746573743138373000ce0e0874" + "6573743138373100cf0e08746573743138373200d00e08746573743138373300d10e08746573743138373400d20e08" + "746573743138373500d30e08746573743138373600d40e08746573743138373700d50e08746573743138373800d60e" + "08746573743138373900d70e08746573743138383000d80e08746573743138383100d90e08746573743138383200da" + "0e08746573743138383300db0e08746573743138383400dc0e08746573743138383500dd0e08746573743138383600" + "de0e08746573743138383700df0e08746573743138383800e00e08746573743138383900e10e087465737431383930" + "00e20e08746573743138393100e30e08746573743138393200e40e08746573743138393300e50e0874657374313839" + "3400e60e08746573743138393500e70e08746573743138393600e80e08746573743138393700e90e08746573743138" + "393800ea0e08746573743138393900eb0e08746573743139303000ec0e08746573743139303100ed0e087465737431" + "39303200ee0e08746573743139303300ef0e08746573743139303400f00e08746573743139303500f10e0874657374" + "3139303600f20e08746573743139303700f30e08746573743139303800f40e08746573743139303900f50e08746573" + "743139313000f60e08746573743139313100f70e08746573743139313200f80e08746573743139313300f90e087465" + "73743139313400fa0e08746573743139313500fb0e08746573743139313600fc0e08746573743139313700fd0e0874" + "6573743139313800fe0e08746573743139313900ff0e08746573743139323000800f08746573743139323100810f08" + "746573743139323200820f08746573743139323300830f08746573743139323400840f08746573743139323500850f" + "08746573743139323600860f08746573743139323700870f08746573743139323800880f0874657374313932390089" + "0f087465737431393330008a0f087465737431393331008b0f087465737431393332008c0f08746573743139333300" + "8d0f087465737431393334008e0f087465737431393335008f0f08746573743139333600900f087465737431393337" + "00910f08746573743139333800920f08746573743139333900930f08746573743139343000940f0874657374313934" + "3100950f08746573743139343200960f08746573743139343300970f08746573743139343400980f08746573743139" + "343500990f087465737431393436009a0f087465737431393437009b0f087465737431393438009c0f087465737431" + "393439009d0f087465737431393530009e0f087465737431393531009f0f08746573743139353200a00f0874657374" + "3139353300a10f08746573743139353400a20f08746573743139353500a30f08746573743139353600a40f08746573" + "743139353700a50f08746573743139353800a60f08746573743139353900a70f08746573743139363000a80f087465" + "73743139363100a90f08746573743139363200aa0f08746573743139363300ab0f08746573743139363400ac0f0874" + "6573743139363500ad0f08746573743139363600ae0f08746573743139363700af0f08746573743139363800b00f08" + "746573743139363900b10f08746573743139373000b20f08746573743139373100b30f08746573743139373200b40f" + "08746573743139373300b50f08746573743139373400b60f08746573743139373500b70f08746573743139373600b8" + "0f08746573743139373700b90f08746573743139373800ba0f08746573743139373900bb0f08746573743139383000" + "bc0f08746573743139383100bd0f08746573743139383200be0f08746573743139383300bf0f087465737431393834" + "00c00f08746573743139383500c10f08746573743139383600c20f08746573743139383700c30f0874657374313938" + "3800c40f08746573743139383900c50f08746573743139393000c60f08746573743139393100c70f08746573743139" + "393200c80f08746573743139393300c90f08746573743139393400ca0f08746573743139393500cb0f087465737431" + "39393600cc0f08746573743139393700cd0f08746573743139393800ce0f08746573743139393900cf0f0874657374" + "3230303000d00f08746573743230303100d10f08746573743230303200d20f08746573743230303300d30f08746573" + "743230303400d40f08746573743230303500d50f08746573743230303600d60f08746573743230303700d70f087465" + "73743230303800d80f08746573743230303900d90f08746573743230313000da0f08746573743230313100db0f0874" + "6573743230313200dc0f08746573743230313300dd0f08746573743230313400de0f08746573743230313500df0f08" + "746573743230313600e00f08746573743230313700e10f08746573743230313800e20f08746573743230313900e30f" + "08746573743230323000e40f08746573743230323100e50f08746573743230323200e60f08746573743230323300e7" + "0f08746573743230323400e80f08746573743230323500e90f08746573743230323600ea0f08746573743230323700" + "eb0f08746573743230323800ec0f08746573743230323900ed0f08746573743230333000ee0f087465737432303331" + "00ef0f08746573743230333200f00f08746573743230333300f10f08746573743230333400f20f0874657374323033" + "3500f30f08746573743230333600f40f08746573743230333700f50f08746573743230333800f60f08746573743230" + "333900f70f08746573743230343000f80f08746573743230343100f90f08746573743230343200fa0f087465737432" + "30343300fb0f08746573743230343400fc0f08746573743230343500fd0f08746573743230343600fe0f0874657374" "3230343700ff0f08746573743230343800801008746573743230343900811008746573743230353000821008746573" - "74323035310083100874" - "6573743230353200841008746573743230353300851008746573743230353400861008746573743230353500871008" - "74657374323035360088" - "10087465737432303537008910087465737432303538008a10087465737432303539008b1008746573743230363000" - "8c100874657374323036" - "31008d10087465737432303632008e10087465737432303633008f1008746573743230363400901008746573743230" - "36350091100874657374" - "3230363600921008746573743230363700931008746573743230363800941008746573743230363900951008746573" - "74323037300096100874" - "65737432303731009710087465737432303732009810087465737432303733009910087465737432303734009a1008" - "7465737432303735009b" - "10087465737432303736009c10087465737432303737009d10087465737432303738009e1008746573743230373900" - "9f100874657374323038" - "3000a01008746573743230383100a11008746573743230383200a21008746573743230383300a31008746573743230" - "383400a4100874657374" - "3230383500a51008746573743230383600a61008746573743230383700a71008746573743230383800a81008746573" - "743230383900a9100874" - "6573743230393000aa1008746573743230393100ab1008746573743230393200ac1008746573743230393300ad1008" - "746573743230393400ae" - "1008746573743230393500af1008746573743230393600b01008746573743230393700b11008746573743230393800" - "b2100874657374323039" - "3900b31008746573743231303000b41008746573743231303100b51008746573743231303200b61008746573743231" - "303300b7100874657374" - "3231303400b81008746573743231303500b91008746573743231303600ba1008746573743231303700bb1008746573" - "743231303800bc100874" - "6573743231303900bd1008746573743231313000be1008746573743231313100bf1008746573743231313200c01008" - "746573743231313300c1" - "1008746573743231313400c21008746573743231313500c31008746573743231313600c41008746573743231313700" - "c5100874657374323131" - "3800c61008746573743231313900c71008746573743231323000c81008746573743231323100c91008746573743231" - "323200ca100874657374" - "3231323300cb1008746573743231323400cc1008746573743231323500cd1008746573743231323600ce1008746573" - "743231323700cf100874" - "6573743231323800d01008746573743231323900d11008746573743231333000d21008746573743231333100d31008" - "746573743231333200d4" - "1008746573743231333300d51008746573743231333400d61008746573743231333500d71008746573743231333600" - "d8100874657374323133" - "3700d91008746573743231333800da1008746573743231333900db1008746573743231343000dc1008746573743231" - "343100dd100874657374" - "3231343200de1008746573743231343300df1008746573743231343400e01008746573743231343500e11008746573" - "743231343600e2100874" - "6573743231343700e31008746573743231343800e41008746573743231343900e51008746573743231353000e61008" - "746573743231353100e7" - "1008746573743231353200e81008746573743231353300e91008746573743231353400ea1008746573743231353500" - "eb100874657374323135" - "3600ec1008746573743231353700ed1008746573743231353800ee1008746573743231353900ef1008746573743231" - "363000f0100874657374" - "3231363100f11008746573743231363200f21008746573743231363300f31008746573743231363400f41008746573" - "743231363500f5100874" - "6573743231363600f61008746573743231363700f71008746573743231363800f81008746573743231363900f91008" - "746573743231373000fa" - "1008746573743231373100fb1008746573743231373200fc1008746573743231373300fd1008746573743231373400" - "fe100874657374323137" - "3500ff1008746573743231373600801108746573743231373700811108746573743231373800821108746573743231" - "37390083110874657374" - "3231383000841108746573743231383100851108746573743231383200861108746573743231383300871108746573" - "74323138340088110874" - "65737432313835008911087465737432313836008a11087465737432313837008b11087465737432313838008c1108" - "7465737432313839008d" - "11087465737432313930008e11087465737432313931008f1108746573743231393200901108746573743231393300" - "91110874657374323139" - "3400921108746573743231393500931108746573743231393600941108746573743231393700951108746573743231" - "39380096110874657374" - "32313939009711087465737432323030009811087465737432323031009911087465737432323032009a1108746573" - "7432323033009b110874" - "65737432323034009c11087465737432323035009d11087465737432323036009e11087465737432323037009f1108" - "746573743232303800a0" - "1108746573743232303900a11108746573743232313000a21108746573743232313100a31108746573743232313200" - "a4110874657374323231" - "3300a51108746573743232313400a61108746573743232313500a71108746573743232313600a81108746573743232" - "313700a9110874657374" - "3232313800aa1108746573743232313900ab1108746573743232323000ac1108746573743232323100ad1108746573" - "743232323200ae110874" - "6573743232323300af1108746573743232323400b01108746573743232323500b11108746573743232323600b21108" - "746573743232323700b3" - "1108746573743232323800b41108746573743232323900b51108746573743232333000b61108746573743232333100" - "b7110874657374323233" - "3200b81108746573743232333300b91108746573743232333400ba1108746573743232333500bb1108746573743232" - "333600bc110874657374" - "3232333700bd1108746573743232333800be1108746573743232333900bf1108746573743232343000c01108746573" - "743232343100c1110874" - "6573743232343200c21108746573743232343300c31108746573743232343400c41108746573743232343500c51108" - "746573743232343600c6" - "1108746573743232343700c71108746573743232343800c81108746573743232343900c91108746573743232353000" - "ca110874657374323235" - "3100cb1108746573743232353200cc1108746573743232353300cd1108746573743232353400ce1108746573743232" - "353500cf110874657374" - "3232353600d01108746573743232353700d11108746573743232353800d21108746573743232353900d31108746573" - "743232363000d4110874" - "6573743232363100d51108746573743232363200d61108746573743232363300d71108746573743232363400d81108" - "746573743232363500d9" - "1108746573743232363600da1108746573743232363700db1108746573743232363800dc1108746573743232363900" - "dd110874657374323237" + "7432303531008310087465737432303532008410087465737432303533008510087465737432303534008610087465" + "737432303535008710087465737432303536008810087465737432303537008910087465737432303538008a100874" + "65737432303539008b10087465737432303630008c10087465737432303631008d10087465737432303632008e1008" + "7465737432303633008f10087465737432303634009010087465737432303635009110087465737432303636009210" + "0874657374323036370093100874657374323036380094100874657374323036390095100874657374323037300096" + "1008746573743230373100971008746573743230373200981008746573743230373300991008746573743230373400" + "9a10087465737432303735009b10087465737432303736009c10087465737432303737009d10087465737432303738" + "009e10087465737432303739009f1008746573743230383000a01008746573743230383100a1100874657374323038" + "3200a21008746573743230383300a31008746573743230383400a41008746573743230383500a51008746573743230" + "383600a61008746573743230383700a71008746573743230383800a81008746573743230383900a910087465737432" + "30393000aa1008746573743230393100ab1008746573743230393200ac1008746573743230393300ad100874657374" + "3230393400ae1008746573743230393500af1008746573743230393600b01008746573743230393700b11008746573" + "743230393800b21008746573743230393900b31008746573743231303000b41008746573743231303100b510087465" + "73743231303200b61008746573743231303300b71008746573743231303400b81008746573743231303500b9100874" + "6573743231303600ba1008746573743231303700bb1008746573743231303800bc1008746573743231303900bd1008" + "746573743231313000be1008746573743231313100bf1008746573743231313200c01008746573743231313300c110" + "08746573743231313400c21008746573743231313500c31008746573743231313600c41008746573743231313700c5" + "1008746573743231313800c61008746573743231313900c71008746573743231323000c81008746573743231323100" + "c91008746573743231323200ca1008746573743231323300cb1008746573743231323400cc10087465737432313235" + "00cd1008746573743231323600ce1008746573743231323700cf1008746573743231323800d0100874657374323132" + "3900d11008746573743231333000d21008746573743231333100d31008746573743231333200d41008746573743231" + "333300d51008746573743231333400d61008746573743231333500d71008746573743231333600d810087465737432" + "31333700d91008746573743231333800da1008746573743231333900db1008746573743231343000dc100874657374" + "3231343100dd1008746573743231343200de1008746573743231343300df1008746573743231343400e01008746573" + "743231343500e11008746573743231343600e21008746573743231343700e31008746573743231343800e410087465" + "73743231343900e51008746573743231353000e61008746573743231353100e71008746573743231353200e8100874" + "6573743231353300e91008746573743231353400ea1008746573743231353500eb1008746573743231353600ec1008" + "746573743231353700ed1008746573743231353800ee1008746573743231353900ef1008746573743231363000f010" + "08746573743231363100f11008746573743231363200f21008746573743231363300f31008746573743231363400f4" + "1008746573743231363500f51008746573743231363600f61008746573743231363700f71008746573743231363800" + "f81008746573743231363900f91008746573743231373000fa1008746573743231373100fb10087465737432313732" + "00fc1008746573743231373300fd1008746573743231373400fe1008746573743231373500ff100874657374323137" + "3600801108746573743231373700811108746573743231373800821108746573743231373900831108746573743231" + "3830008411087465737432313831008511087465737432313832008611087465737432313833008711087465737432" + "313834008811087465737432313835008911087465737432313836008a11087465737432313837008b110874657374" + "32313838008c11087465737432313839008d11087465737432313930008e11087465737432313931008f1108746573" + "7432313932009011087465737432313933009111087465737432313934009211087465737432313935009311087465" + "7374323139360094110874657374323139370095110874657374323139380096110874657374323139390097110874" + "65737432323030009811087465737432323031009911087465737432323032009a11087465737432323033009b1108" + "7465737432323034009c11087465737432323035009d11087465737432323036009e11087465737432323037009f11" + "08746573743232303800a01108746573743232303900a11108746573743232313000a21108746573743232313100a3" + "1108746573743232313200a41108746573743232313300a51108746573743232313400a61108746573743232313500" + "a71108746573743232313600a81108746573743232313700a91108746573743232313800aa11087465737432323139" + "00ab1108746573743232323000ac1108746573743232323100ad1108746573743232323200ae110874657374323232" + "3300af1108746573743232323400b01108746573743232323500b11108746573743232323600b21108746573743232" + "323700b31108746573743232323800b41108746573743232323900b51108746573743232333000b611087465737432" + "32333100b71108746573743232333200b81108746573743232333300b91108746573743232333400ba110874657374" + "3232333500bb1108746573743232333600bc1108746573743232333700bd1108746573743232333800be1108746573" + "743232333900bf1108746573743232343000c01108746573743232343100c11108746573743232343200c211087465" + "73743232343300c31108746573743232343400c41108746573743232343500c51108746573743232343600c6110874" + "6573743232343700c71108746573743232343800c81108746573743232343900c91108746573743232353000ca1108" + "746573743232353100cb1108746573743232353200cc1108746573743232353300cd1108746573743232353400ce11" + "08746573743232353500cf1108746573743232353600d01108746573743232353700d11108746573743232353800d2" + "1108746573743232353900d31108746573743232363000d41108746573743232363100d51108746573743232363200" + "d61108746573743232363300d71108746573743232363400d81108746573743232363500d911087465737432323636" + "00da1108746573743232363700db1108746573743232363800dc1108746573743232363900dd110874657374323237" "3000de1108746573743232373100df1108746573743232373200e01108746573743232373300e11108746573743232" - "373400e2110874657374" - "3232373500e31108746573743232373600e41108746573743232373700e51108746573743232373800e61108746573" - "743232373900e7110874" - "6573743232383000e81108746573743232383100e91108746573743232383200ea1108746573743232383300eb1108" - "746573743232383400ec" - "1108746573743232383500ed1108746573743232383600ee1108746573743232383700ef1108746573743232383800" - "f0110874657374323238" - "3900f11108746573743232393000f21108746573743232393100f31108746573743232393200f41108746573743232" - "393300f5110874657374" - "3232393400f61108746573743232393500f71108746573743232393600f81108746573743232393700f91108746573" - "743232393800fa110874" - "6573743232393900fb1108746573743233303000fc1108746573743233303100fd1108746573743233303200fe1108" - "746573743233303300ff" - "1108746573743233303400801208746573743233303500811208746573743233303600821208746573743233303700" - "83120874657374323330" - "3800841208746573743233303900851208746573743233313000861208746573743233313100871208746573743233" - "31320088120874657374" - "32333133008912087465737432333134008a12087465737432333135008b12087465737432333136008c1208746573" - "7432333137008d120874" - "65737432333138008e12087465737432333139008f1208746573743233323000901208746573743233323100911208" - "74657374323332320092" - "1208746573743233323300931208746573743233323400941208746573743233323500951208746573743233323600" - "96120874657374323332" - "37009712087465737432333238009812087465737432333239009912087465737432333330009a1208746573743233" - "3331009b120874657374" - "32333332009c12087465737432333333009d12087465737432333334009e12087465737432333335009f1208746573" - "743233333600a0120874" - "6573743233333700a11208746573743233333800a21208746573743233333900a31208746573743233343000a41208" - "746573743233343100a5" - "1208746573743233343200a61208746573743233343300a71208746573743233343400a81208746573743233343500" - "a9120874657374323334" - "3600aa1208746573743233343700ab1208746573743233343800ac1208746573743233343900ad1208746573743233" - "353000ae120874657374" - "3233353100af1208746573743233353200b01208746573743233353300b11208746573743233353400b21208746573" - "743233353500b3120874" - "6573743233353600b41208746573743233353700b51208746573743233353800b61208746573743233353900b71208" - "746573743233363000b8" - "1208746573743233363100b91208746573743233363200ba1208746573743233363300bb1208746573743233363400" - "bc120874657374323336" - "3500bd1208746573743233363600be1208746573743233363700bf1208746573743233363800c01208746573743233" - "363900c1120874657374" - "3233373000c21208746573743233373100c31208746573743233373200c41208746573743233373300c51208746573" - "743233373400c6120874" - "6573743233373500c71208746573743233373600c81208746573743233373700c91208746573743233373800ca1208" - "746573743233373900cb" - "1208746573743233383000cc1208746573743233383100cd1208746573743233383200ce1208746573743233383300" - "cf120874657374323338" - "3400d01208746573743233383500d11208746573743233383600d21208746573743233383700d31208746573743233" - "383800d4120874657374" - "3233383900d51208746573743233393000d61208746573743233393100d71208746573743233393200d81208746573" - "743233393300d9120874" - "6573743233393400da1208746573743233393500db1208746573743233393600dc1208746573743233393700dd1208" - "746573743233393800de" - "1208746573743233393900df1208746573743234303000e01208746573743234303100e11208746573743234303200" - "e2120874657374323430" - "3300e31208746573743234303400e41208746573743234303500e51208746573743234303600e61208746573743234" - "303700e7120874657374" - "3234303800e81208746573743234303900e91208746573743234313000ea1208746573743234313100eb1208746573" - "743234313200ec120874" - "6573743234313300ed1208746573743234313400ee1208746573743234313500ef1208746573743234313600f01208" - "746573743234313700f1" - "1208746573743234313800f21208746573743234313900f31208746573743234323000f41208746573743234323100" - "f5120874657374323432" - "3200f61208746573743234323300f71208746573743234323400f81208746573743234323500f91208746573743234" - "323600fa120874657374" - "3234323700fb1208746573743234323800fc1208746573743234323900fd1208746573743234333000fe1208746573" - "743234333100ff120874" - "6573743234333200801308746573743234333300811308746573743234333400821308746573743234333500831308" - "74657374323433360084" - "1308746573743234333700851308746573743234333800861308746573743234333900871308746573743234343000" - "88130874657374323434" - "31008913087465737432343432008a13087465737432343433008b13087465737432343434008c1308746573743234" - "3435008d130874657374" - "32343436008e13087465737432343437008f1308746573743234343800901308746573743234343900911308746573" - "74323435300092130874" - "6573743234353100931308746573743234353200941308746573743234353300951308746573743234353400961308" - "74657374323435350097" - "13087465737432343536009813087465737432343537009913087465737432343538009a1308746573743234353900" - "9b130874657374323436" - "30009c13087465737432343631009d13087465737432343632009e13087465737432343633009f1308746573743234" - "363400a0130874657374" - "3234363500a11308746573743234363600a21308746573743234363700a31308746573743234363800a41308746573" - "743234363900a5130874" - "6573743234373000a61308746573743234373100a71308746573743234373200a81308746573743234373300a91308" - "746573743234373400aa" - "1308746573743234373500ab1308746573743234373600ac1308746573743234373700ad1308746573743234373800" - "ae130874657374323437" - "3900af1308746573743234383000b01308746573743234383100b11308746573743234383200b21308746573743234" - "383300b3130874657374" - "3234383400b41308746573743234383500b51308746573743234383600b61308746573743234383700b71308746573" - "743234383800b8130874" - "6573743234383900b91308746573743234393000ba1308746573743234393100bb1308746573743234393200bc1308" - "746573743234393300bd" + "373400e21108746573743232373500e31108746573743232373600e41108746573743232373700e511087465737432" + "32373800e61108746573743232373900e71108746573743232383000e81108746573743232383100e9110874657374" + "3232383200ea1108746573743232383300eb1108746573743232383400ec1108746573743232383500ed1108746573" + "743232383600ee1108746573743232383700ef1108746573743232383800f01108746573743232383900f111087465" + "73743232393000f21108746573743232393100f31108746573743232393200f41108746573743232393300f5110874" + "6573743232393400f61108746573743232393500f71108746573743232393600f81108746573743232393700f91108" + "746573743232393800fa1108746573743232393900fb1108746573743233303000fc1108746573743233303100fd11" + "08746573743233303200fe1108746573743233303300ff110874657374323330340080120874657374323330350081" + "1208746573743233303600821208746573743233303700831208746573743233303800841208746573743233303900" + "8512087465737432333130008612087465737432333131008712087465737432333132008812087465737432333133" + "008912087465737432333134008a12087465737432333135008b12087465737432333136008c120874657374323331" + "37008d12087465737432333138008e12087465737432333139008f1208746573743233323000901208746573743233" + "3231009112087465737432333232009212087465737432333233009312087465737432333234009412087465737432" + "3332350095120874657374323332360096120874657374323332370097120874657374323332380098120874657374" + "32333239009912087465737432333330009a12087465737432333331009b12087465737432333332009c1208746573" + "7432333333009d12087465737432333334009e12087465737432333335009f1208746573743233333600a012087465" + "73743233333700a11208746573743233333800a21208746573743233333900a31208746573743233343000a4120874" + "6573743233343100a51208746573743233343200a61208746573743233343300a71208746573743233343400a81208" + "746573743233343500a91208746573743233343600aa1208746573743233343700ab1208746573743233343800ac12" + "08746573743233343900ad1208746573743233353000ae1208746573743233353100af1208746573743233353200b0" + "1208746573743233353300b11208746573743233353400b21208746573743233353500b31208746573743233353600" + "b41208746573743233353700b51208746573743233353800b61208746573743233353900b712087465737432333630" + "00b81208746573743233363100b91208746573743233363200ba1208746573743233363300bb120874657374323336" + "3400bc1208746573743233363500bd1208746573743233363600be1208746573743233363700bf1208746573743233" + "363800c01208746573743233363900c11208746573743233373000c21208746573743233373100c312087465737432" + "33373200c41208746573743233373300c51208746573743233373400c61208746573743233373500c7120874657374" + "3233373600c81208746573743233373700c91208746573743233373800ca1208746573743233373900cb1208746573" + "743233383000cc1208746573743233383100cd1208746573743233383200ce1208746573743233383300cf12087465" + "73743233383400d01208746573743233383500d11208746573743233383600d21208746573743233383700d3120874" + "6573743233383800d41208746573743233383900d51208746573743233393000d61208746573743233393100d71208" + "746573743233393200d81208746573743233393300d91208746573743233393400da1208746573743233393500db12" + "08746573743233393600dc1208746573743233393700dd1208746573743233393800de1208746573743233393900df" + "1208746573743234303000e01208746573743234303100e11208746573743234303200e21208746573743234303300" + "e31208746573743234303400e41208746573743234303500e51208746573743234303600e612087465737432343037" + "00e71208746573743234303800e81208746573743234303900e91208746573743234313000ea120874657374323431" + "3100eb1208746573743234313200ec1208746573743234313300ed1208746573743234313400ee1208746573743234" + "313500ef1208746573743234313600f01208746573743234313700f11208746573743234313800f212087465737432" + "34313900f31208746573743234323000f41208746573743234323100f51208746573743234323200f6120874657374" + "3234323300f71208746573743234323400f81208746573743234323500f91208746573743234323600fa1208746573" + "743234323700fb1208746573743234323800fc1208746573743234323900fd1208746573743234333000fe12087465" + "73743234333100ff120874657374323433320080130874657374323433330081130874657374323433340082130874" + "6573743234333500831308746573743234333600841308746573743234333700851308746573743234333800861308" + "7465737432343339008713087465737432343430008813087465737432343431008913087465737432343432008a13" + "087465737432343433008b13087465737432343434008c13087465737432343435008d13087465737432343436008e" + "13087465737432343437008f1308746573743234343800901308746573743234343900911308746573743234353000" + "9213087465737432343531009313087465737432343532009413087465737432343533009513087465737432343534" + "0096130874657374323435350097130874657374323435360098130874657374323435370099130874657374323435" + "38009a13087465737432343539009b13087465737432343630009c13087465737432343631009d1308746573743234" + "3632009e13087465737432343633009f1308746573743234363400a01308746573743234363500a113087465737432" + "34363600a21308746573743234363700a31308746573743234363800a41308746573743234363900a5130874657374" + "3234373000a61308746573743234373100a71308746573743234373200a81308746573743234373300a91308746573" + "743234373400aa1308746573743234373500ab1308746573743234373600ac1308746573743234373700ad13087465" + "73743234373800ae1308746573743234373900af1308746573743234383000b01308746573743234383100b1130874" + "6573743234383200b21308746573743234383300b31308746573743234383400b41308746573743234383500b51308" + "746573743234383600b61308746573743234383700b71308746573743234383800b81308746573743234383900b913" + "08746573743234393000ba1308746573743234393100bb1308746573743234393200bc1308746573743234393300bd" "1308746573743234393400be1308746573743234393500bf1308746573743234393600c01308746573743234393700" - "c1130874657374323439" - "3800c21308746573743234393900c31308746573743235303000c41308746573743235303100c51308746573743235" - "303200c6130874657374" - "3235303300c71308746573743235303400c81308746573743235303500c91308746573743235303600ca1308746573" - "743235303700cb130874" - "6573743235303800cc1308746573743235303900cd1308746573743235313000ce1308746573743235313100cf1308" - "746573743235313200d0" - "1308746573743235313300d11308746573743235313400d21308746573743235313500d31308746573743235313600" - "d4130874657374323531" - "3700d51308746573743235313800d61308746573743235313900d71308746573743235323000d81308746573743235" - "323100d9130874657374" - "3235323200da1308746573743235323300db1308746573743235323400dc1308746573743235323500dd1308746573" - "743235323600de130874" - "6573743235323700df1308746573743235323800e01308746573743235323900e11308746573743235333000e21308" - "746573743235333100e3" - "1308746573743235333200e41308746573743235333300e51308746573743235333400e61308746573743235333500" - "e7130874657374323533" - "3600e81308746573743235333700e91308746573743235333800ea1308746573743235333900eb1308746573743235" - "343000ec130874657374" - "3235343100ed1308746573743235343200ee1308746573743235343300ef1308746573743235343400f01308746573" - "743235343500f1130874" - "6573743235343600f21308746573743235343700f31308746573743235343800f41308746573743235343900f51308" - "746573743235353000f6" - "1308746573743235353100f71308746573743235353200f81308746573743235353300f91308746573743235353400" - "fa130874657374323535" - "3500fb1308746573743235353600fc1308746573743235353700fd1308746573743235353800fe1308746573743235" - "353900ff130874657374" - "3235363000801408746573743235363100811408746573743235363200821408746573743235363300831408746573" - "74323536340084140874" - "6573743235363500851408746573743235363600861408746573743235363700871408746573743235363800881408" - "74657374323536390089" - "14087465737432353730008a14087465737432353731008b14087465737432353732008c1408746573743235373300" - "8d140874657374323537" - "34008e14087465737432353735008f1408746573743235373600901408746573743235373700911408746573743235" - "37380092140874657374" - "3235373900931408746573743235383000941408746573743235383100951408746573743235383200961408746573" - "74323538330097140874" - "65737432353834009814087465737432353835009914087465737432353836009a14087465737432353837009b1408" - "7465737432353838009c" - "14087465737432353839009d14087465737432353930009e14087465737432353931009f1408746573743235393200" - "a0140874657374323539" - "3300a11408746573743235393400a21408746573743235393500a31408746573743235393600a41408746573743235" - "393700a5140874657374" - "3235393800a61408746573743235393900a71408746573743236303000a81408746573743236303100a91408746573" - "743236303200aa140874" - "6573743236303300ab1408746573743236303400ac1408746573743236303500ad1408746573743236303600ae1408" - "746573743236303700af" - "1408746573743236303800b01408746573743236303900b11408746573743236313000b21408746573743236313100" - "b3140874657374323631" - "3200b41408746573743236313300b51408746573743236313400b61408746573743236313500b71408746573743236" - "313600b8140874657374" - "3236313700b91408746573743236313800ba1408746573743236313900bb1408746573743236323000bc1408746573" - "743236323100bd140874" - "6573743236323200be1408746573743236323300bf1408746573743236323400c01408746573743236323500c11408" - "746573743236323600c2" - "1408746573743236323700c31408746573743236323800c41408746573743236323900c51408746573743236333000" - "c6140874657374323633" - "3100c71408746573743236333200c81408746573743236333300c91408746573743236333400ca1408746573743236" - "333500cb140874657374" - "3236333600cc1408746573743236333700cd1408746573743236333800ce1408746573743236333900cf1408746573" - "743236343000d0140874" - "6573743236343100d11408746573743236343200d21408746573743236343300d31408746573743236343400d41408" - "746573743236343500d5" - "1408746573743236343600d61408746573743236343700d71408746573743236343800d81408746573743236343900" - "d9140874657374323635" - "3000da1408746573743236353100db1408746573743236353200dc1408746573743236353300dd1408746573743236" - "353400de140874657374" - "3236353500df1408746573743236353600e01408746573743236353700e11408746573743236353800e21408746573" - "743236353900e3140874" - "6573743236363000e41408746573743236363100e51408746573743236363200e61408746573743236363300e71408" - "746573743236363400e8" - "1408746573743236363500e91408746573743236363600ea1408746573743236363700eb1408746573743236363800" - "ec140874657374323636" - "3900ed1408746573743236373000ee1408746573743236373100ef1408746573743236373200f01408746573743236" - "373300f1140874657374" - "3236373400f21408746573743236373500f31408746573743236373600f41408746573743236373700f51408746573" - "743236373800f6140874" - "6573743236373900f71408746573743236383000f81408746573743236383100f91408746573743236383200fa1408" - "746573743236383300fb" - "1408746573743236383400fc1408746573743236383500fd1408746573743236383600fe1408746573743236383700" - "ff140874657374323638" - "3800801508746573743236383900811508746573743236393000821508746573743236393100831508746573743236" - "39320084150874657374" - "3236393300851508746573743236393400861508746573743236393500871508746573743236393600881508746573" - "74323639370089150874" - "65737432363938008a15087465737432363939008b15087465737432373030008c15087465737432373031008d1508" - "7465737432373032008e" - "15087465737432373033008f1508746573743237303400901508746573743237303500911508746573743237303600" - "92150874657374323730" - "3700931508746573743237303800941508746573743237303900951508746573743237313000961508746573743237" - "31310097150874657374" - "32373132009815087465737432373133009915087465737432373134009a15087465737432373135009b1508746573" - "7432373136009c150874" + "c11308746573743234393800c21308746573743234393900c31308746573743235303000c413087465737432353031" + "00c51308746573743235303200c61308746573743235303300c71308746573743235303400c8130874657374323530" + "3500c91308746573743235303600ca1308746573743235303700cb1308746573743235303800cc1308746573743235" + "303900cd1308746573743235313000ce1308746573743235313100cf1308746573743235313200d013087465737432" + "35313300d11308746573743235313400d21308746573743235313500d31308746573743235313600d4130874657374" + "3235313700d51308746573743235313800d61308746573743235313900d71308746573743235323000d81308746573" + "743235323100d91308746573743235323200da1308746573743235323300db1308746573743235323400dc13087465" + "73743235323500dd1308746573743235323600de1308746573743235323700df1308746573743235323800e0130874" + "6573743235323900e11308746573743235333000e21308746573743235333100e31308746573743235333200e41308" + "746573743235333300e51308746573743235333400e61308746573743235333500e71308746573743235333600e813" + "08746573743235333700e91308746573743235333800ea1308746573743235333900eb1308746573743235343000ec" + "1308746573743235343100ed1308746573743235343200ee1308746573743235343300ef1308746573743235343400" + "f01308746573743235343500f11308746573743235343600f21308746573743235343700f313087465737432353438" + "00f41308746573743235343900f51308746573743235353000f61308746573743235353100f7130874657374323535" + "3200f81308746573743235353300f91308746573743235353400fa1308746573743235353500fb1308746573743235" + "353600fc1308746573743235353700fd1308746573743235353800fe1308746573743235353900ff13087465737432" + "3536300080140874657374323536310081140874657374323536320082140874657374323536330083140874657374" + "3235363400841408746573743235363500851408746573743235363600861408746573743235363700871408746573" + "7432353638008814087465737432353639008914087465737432353730008a14087465737432353731008b14087465" + "737432353732008c14087465737432353733008d14087465737432353734008e14087465737432353735008f140874" + "6573743235373600901408746573743235373700911408746573743235373800921408746573743235373900931408" + "7465737432353830009414087465737432353831009514087465737432353832009614087465737432353833009714" + "087465737432353834009814087465737432353835009914087465737432353836009a14087465737432353837009b" + "14087465737432353838009c14087465737432353839009d14087465737432353930009e1408746573743235393100" + "9f1408746573743235393200a01408746573743235393300a11408746573743235393400a214087465737432353935" + "00a31408746573743235393600a41408746573743235393700a51408746573743235393800a6140874657374323539" + "3900a71408746573743236303000a81408746573743236303100a91408746573743236303200aa1408746573743236" + "303300ab1408746573743236303400ac1408746573743236303500ad1408746573743236303600ae14087465737432" + "36303700af1408746573743236303800b01408746573743236303900b11408746573743236313000b2140874657374" + "3236313100b31408746573743236313200b41408746573743236313300b51408746573743236313400b61408746573" + "743236313500b71408746573743236313600b81408746573743236313700b91408746573743236313800ba14087465" + "73743236313900bb1408746573743236323000bc1408746573743236323100bd1408746573743236323200be140874" + "6573743236323300bf1408746573743236323400c01408746573743236323500c11408746573743236323600c21408" + "746573743236323700c31408746573743236323800c41408746573743236323900c51408746573743236333000c614" + "08746573743236333100c71408746573743236333200c81408746573743236333300c91408746573743236333400ca" + "1408746573743236333500cb1408746573743236333600cc1408746573743236333700cd1408746573743236333800" + "ce1408746573743236333900cf1408746573743236343000d01408746573743236343100d114087465737432363432" + "00d21408746573743236343300d31408746573743236343400d41408746573743236343500d5140874657374323634" + "3600d61408746573743236343700d71408746573743236343800d81408746573743236343900d91408746573743236" + "353000da1408746573743236353100db1408746573743236353200dc1408746573743236353300dd14087465737432" + "36353400de1408746573743236353500df1408746573743236353600e01408746573743236353700e1140874657374" + "3236353800e21408746573743236353900e31408746573743236363000e41408746573743236363100e51408746573" + "743236363200e61408746573743236363300e71408746573743236363400e81408746573743236363500e914087465" + "73743236363600ea1408746573743236363700eb1408746573743236363800ec1408746573743236363900ed140874" + "6573743236373000ee1408746573743236373100ef1408746573743236373200f01408746573743236373300f11408" + "746573743236373400f21408746573743236373500f31408746573743236373600f41408746573743236373700f514" + "08746573743236373800f61408746573743236373900f71408746573743236383000f81408746573743236383100f9" + "1408746573743236383200fa1408746573743236383300fb1408746573743236383400fc1408746573743236383500" + "fd1408746573743236383600fe1408746573743236383700ff14087465737432363838008015087465737432363839" + "0081150874657374323639300082150874657374323639310083150874657374323639320084150874657374323639" + "3300851508746573743236393400861508746573743236393500871508746573743236393600881508746573743236" + "3937008915087465737432363938008a15087465737432363939008b15087465737432373030008c15087465737432" + "373031008d15087465737432373032008e15087465737432373033008f150874657374323730340090150874657374" + "3237303500911508746573743237303600921508746573743237303700931508746573743237303800941508746573" + "7432373039009515087465737432373130009615087465737432373131009715087465737432373132009815087465" + "737432373133009915087465737432373134009a15087465737432373135009b15087465737432373136009c150874" "65737432373137009d15087465737432373138009e15087465737432373139009f1508746573743237323000a01508" - "746573743237323100a1" - "1508746573743237323200a21508746573743237323300a31508746573743237323400a41508746573743237323500" - "a5150874657374323732" - "3600a61508746573743237323700a71508746573743237323800a81508746573743237323900a91508746573743237" - "333000aa150874657374" - "3237333100ab1508746573743237333200ac1508746573743237333300ad1508746573743237333400ae1508746573" - "743237333500af150874" - "6573743237333600b01508746573743237333700b11508746573743237333800b21508746573743237333900b31508" - "746573743237343000b4" - "1508746573743237343100b51508746573743237343200b61508746573743237343300b71508746573743237343400" - "b8150874657374323734" - "3500b91508746573743237343600ba1508746573743237343700bb1508746573743237343800bc1508746573743237" - "343900bd150874657374" - "3237353000be1508746573743237353100bf1508746573743237353200c01508746573743237353300c11508746573" - "743237353400c2150874" - "6573743237353500c31508746573743237353600c41508746573743237353700c51508746573743237353800c61508" - "746573743237353900c7" - "1508746573743237363000c81508746573743237363100c91508746573743237363200ca1508746573743237363300" - "cb150874657374323736" - "3400cc1508746573743237363500cd1508746573743237363600ce1508746573743237363700cf1508746573743237" - "363800d0150874657374" - "3237363900d11508746573743237373000d21508746573743237373100d31508746573743237373200d41508746573" - "743237373300d5150874" - "6573743237373400d61508746573743237373500d71508746573743237373600d81508746573743237373700d91508" - "746573743237373800da" - "1508746573743237373900db1508746573743237383000dc1508746573743237383100dd1508746573743237383200" - "de150874657374323738" - "3300df1508746573743237383400e01508746573743237383500e11508746573743237383600e21508746573743237" - "383700e3150874657374" - "3237383800e41508746573743237383900e51508746573743237393000e61508746573743237393100e71508746573" - "743237393200e8150874" - "6573743237393300e91508746573743237393400ea1508746573743237393500eb1508746573743237393600ec1508" - "746573743237393700ed" - "1508746573743237393800ee1508746573743237393900ef1508746573743238303000f01508746573743238303100" - "f1150874657374323830" - "3200f21508746573743238303300f31508746573743238303400f41508746573743238303500f51508746573743238" - "303600f6150874657374" - "3238303700f71508746573743238303800f81508746573743238303900f91508746573743238313000fa1508746573" - "743238313100fb150874" - "6573743238313200fc1508746573743238313300fd1508746573743238313400fe1508746573743238313500ff1508" - "74657374323831360080" - "1608746573743238313700811608746573743238313800821608746573743238313900831608746573743238323000" - "84160874657374323832" - "3100851608746573743238323200861608746573743238323300871608746573743238323400881608746573743238" - "32350089160874657374" - "32383236008a16087465737432383237008b16087465737432383238008c16087465737432383239008d1608746573" - "7432383330008e160874" - "65737432383331008f1608746573743238333200901608746573743238333300911608746573743238333400921608" - "74657374323833350093" - "1608746573743238333600941608746573743238333700951608746573743238333800961608746573743238333900" - "97160874657374323834" - "30009816087465737432383431009916087465737432383432009a16087465737432383433009b1608746573743238" - "3434009c160874657374" - "32383435009d16087465737432383436009e16087465737432383437009f1608746573743238343800a01608746573" - "743238343900a1160874" - "6573743238353000a21608746573743238353100a31608746573743238353200a41608746573743238353300a51608" - "746573743238353400a6" - "1608746573743238353500a71608746573743238353600a81608746573743238353700a91608746573743238353800" - "aa160874657374323835" - "3900ab1608746573743238363000ac1608746573743238363100ad1608746573743238363200ae1608746573743238" - "363300af160874657374" - "3238363400b01608746573743238363500b11608746573743238363600b21608746573743238363700b31608746573" - "743238363800b4160874" - "6573743238363900b51608746573743238373000b61608746573743238373100b71608746573743238373200b81608" - "746573743238373300b9" - "1608746573743238373400ba1608746573743238373500bb1608746573743238373600bc1608746573743238373700" - "bd160874657374323837" - "3800be1608746573743238373900bf1608746573743238383000c01608746573743238383100c11608746573743238" - "383200c2160874657374" - "3238383300c31608746573743238383400c41608746573743238383500c51608746573743238383600c61608746573" - "743238383700c7160874" - "6573743238383800c81608746573743238383900c91608746573743238393000ca1608746573743238393100cb1608" - "746573743238393200cc" - "1608746573743238393300cd1608746573743238393400ce1608746573743238393500cf1608746573743238393600" - "d0160874657374323839" - "3700d11608746573743238393800d21608746573743238393900d31608746573743239303000d41608746573743239" - "303100d5160874657374" - "3239303200d61608746573743239303300d71608746573743239303400d81608746573743239303500d91608746573" - "743239303600da160874" - "6573743239303700db1608746573743239303800dc1608746573743239303900dd1608746573743239313000de1608" - "746573743239313100df" - "1608746573743239313200e01608746573743239313300e11608746573743239313400e21608746573743239313500" - "e3160874657374323931" - "3600e41608746573743239313700e51608746573743239313800e61608746573743239313900e71608746573743239" - "323000e8160874657374" - "3239323100e91608746573743239323200ea1608746573743239323300eb1608746573743239323400ec1608746573" - "743239323500ed160874" - "6573743239323600ee1608746573743239323700ef1608746573743239323800f01608746573743239323900f11608" - "746573743239333000f2" - "1608746573743239333100f31608746573743239333200f41608746573743239333300f51608746573743239333400" - "f6160874657374323933" - "3500f71608746573743239333600f81608746573743239333700f91608746573743239333800fa1608746573743239" - "333900fb160874657374" + "746573743237323100a11508746573743237323200a21508746573743237323300a31508746573743237323400a415" + "08746573743237323500a51508746573743237323600a61508746573743237323700a71508746573743237323800a8" + "1508746573743237323900a91508746573743237333000aa1508746573743237333100ab1508746573743237333200" + "ac1508746573743237333300ad1508746573743237333400ae1508746573743237333500af15087465737432373336" + "00b01508746573743237333700b11508746573743237333800b21508746573743237333900b3150874657374323734" + "3000b41508746573743237343100b51508746573743237343200b61508746573743237343300b71508746573743237" + "343400b81508746573743237343500b91508746573743237343600ba1508746573743237343700bb15087465737432" + "37343800bc1508746573743237343900bd1508746573743237353000be1508746573743237353100bf150874657374" + "3237353200c01508746573743237353300c11508746573743237353400c21508746573743237353500c31508746573" + "743237353600c41508746573743237353700c51508746573743237353800c61508746573743237353900c715087465" + "73743237363000c81508746573743237363100c91508746573743237363200ca1508746573743237363300cb150874" + "6573743237363400cc1508746573743237363500cd1508746573743237363600ce1508746573743237363700cf1508" + "746573743237363800d01508746573743237363900d11508746573743237373000d21508746573743237373100d315" + "08746573743237373200d41508746573743237373300d51508746573743237373400d61508746573743237373500d7" + "1508746573743237373600d81508746573743237373700d91508746573743237373800da1508746573743237373900" + "db1508746573743237383000dc1508746573743237383100dd1508746573743237383200de15087465737432373833" + "00df1508746573743237383400e01508746573743237383500e11508746573743237383600e2150874657374323738" + "3700e31508746573743237383800e41508746573743237383900e51508746573743237393000e61508746573743237" + "393100e71508746573743237393200e81508746573743237393300e91508746573743237393400ea15087465737432" + "37393500eb1508746573743237393600ec1508746573743237393700ed1508746573743237393800ee150874657374" + "3237393900ef1508746573743238303000f01508746573743238303100f11508746573743238303200f21508746573" + "743238303300f31508746573743238303400f41508746573743238303500f51508746573743238303600f615087465" + "73743238303700f71508746573743238303800f81508746573743238303900f91508746573743238313000fa150874" + "6573743238313100fb1508746573743238313200fc1508746573743238313300fd1508746573743238313400fe1508" + "746573743238313500ff15087465737432383136008016087465737432383137008116087465737432383138008216" + "0874657374323831390083160874657374323832300084160874657374323832310085160874657374323832320086" + "1608746573743238323300871608746573743238323400881608746573743238323500891608746573743238323600" + "8a16087465737432383237008b16087465737432383238008c16087465737432383239008d16087465737432383330" + "008e16087465737432383331008f160874657374323833320090160874657374323833330091160874657374323833" + "3400921608746573743238333500931608746573743238333600941608746573743238333700951608746573743238" + "3338009616087465737432383339009716087465737432383430009816087465737432383431009916087465737432" + "383432009a16087465737432383433009b16087465737432383434009c16087465737432383435009d160874657374" + "32383436009e16087465737432383437009f1608746573743238343800a01608746573743238343900a11608746573" + "743238353000a21608746573743238353100a31608746573743238353200a41608746573743238353300a516087465" + "73743238353400a61608746573743238353500a71608746573743238353600a81608746573743238353700a9160874" + "6573743238353800aa1608746573743238353900ab1608746573743238363000ac1608746573743238363100ad1608" + "746573743238363200ae1608746573743238363300af1608746573743238363400b01608746573743238363500b116" + "08746573743238363600b21608746573743238363700b31608746573743238363800b41608746573743238363900b5" + "1608746573743238373000b61608746573743238373100b71608746573743238373200b81608746573743238373300" + "b91608746573743238373400ba1608746573743238373500bb1608746573743238373600bc16087465737432383737" + "00bd1608746573743238373800be1608746573743238373900bf1608746573743238383000c0160874657374323838" + "3100c11608746573743238383200c21608746573743238383300c31608746573743238383400c41608746573743238" + "383500c51608746573743238383600c61608746573743238383700c71608746573743238383800c816087465737432" + "38383900c91608746573743238393000ca1608746573743238393100cb1608746573743238393200cc160874657374" + "3238393300cd1608746573743238393400ce1608746573743238393500cf1608746573743238393600d01608746573" + "743238393700d11608746573743238393800d21608746573743238393900d31608746573743239303000d416087465" + "73743239303100d51608746573743239303200d61608746573743239303300d71608746573743239303400d8160874" + "6573743239303500d91608746573743239303600da1608746573743239303700db1608746573743239303800dc1608" + "746573743239303900dd1608746573743239313000de1608746573743239313100df1608746573743239313200e016" + "08746573743239313300e11608746573743239313400e21608746573743239313500e31608746573743239313600e4" + "1608746573743239313700e51608746573743239313800e61608746573743239313900e71608746573743239323000" + "e81608746573743239323100e91608746573743239323200ea1608746573743239323300eb16087465737432393234" + "00ec1608746573743239323500ed1608746573743239323600ee1608746573743239323700ef160874657374323932" + "3800f01608746573743239323900f11608746573743239333000f21608746573743239333100f31608746573743239" + "333200f41608746573743239333300f51608746573743239333400f61608746573743239333500f716087465737432" + "39333600f81608746573743239333700f91608746573743239333800fa1608746573743239333900fb160874657374" "3239343000fc1608746573743239343100fd1608746573743239343200fe1608746573743239343300ff1608746573" - "74323934340080170874" - "6573743239343500811708746573743239343600821708746573743239343700831708746573743239343800841708" - "74657374323934390085" - "1708746573743239353000861708746573743239353100871708746573743239353200881708746573743239353300" - "89170874657374323935" - "34008a17087465737432393535008b17087465737432393536008c17087465737432393537008d1708746573743239" - "3538008e170874657374" - "32393539008f1708746573743239363000901708746573743239363100911708746573743239363200921708746573" - "74323936330093170874" - "6573743239363400941708746573743239363500951708746573743239363600961708746573743239363700971708" - "74657374323936380098" - "17087465737432393639009917087465737432393730009a17087465737432393731009b1708746573743239373200" - "9c170874657374323937" - "33009d17087465737432393734009e17087465737432393735009f1708746573743239373600a01708746573743239" - "373700a1170874657374" - "3239373800a21708746573743239373900a31708746573743239383000a41708746573743239383100a51708746573" - "743239383200a6170874" - "6573743239383300a71708746573743239383400a81708746573743239383500a91708746573743239383600aa1708" - "746573743239383700ab" - "1708746573743239383800ac1708746573743239383900ad1708746573743239393000ae1708746573743239393100" - "af170874657374323939" - "3200b01708746573743239393300b11708746573743239393400b21708746573743239393500b31708746573743239" - "393600b4170874657374" - "3239393700b51708746573743239393800b61708746573743239393900b71708746573743330303000b81708746573" - "743330303100b9170874" - "6573743330303200ba1708746573743330303300bb1708746573743330303400bc1708746573743330303500bd1708" - "746573743330303600be" - "1708746573743330303700bf1708746573743330303800c01708746573743330303900c11708746573743330313000" - "c2170874657374333031" - "3100c31708746573743330313200c41708746573743330313300c51708746573743330313400c61708746573743330" - "313500c7170874657374" - "3330313600c81708746573743330313700c91708746573743330313800ca1708746573743330313900cb1708746573" - "743330323000cc170874" - "6573743330323100cd1708746573743330323200ce1708746573743330323300cf1708746573743330323400d01708" - "746573743330323500d1" - "1708746573743330323600d21708746573743330323700d31708746573743330323800d41708746573743330323900" - "d5170874657374333033" - "3000d61708746573743330333100d71708746573743330333200d81708746573743330333300d91708746573743330" - "333400da170874657374" - "3330333500db1708746573743330333600dc1708746573743330333700dd1708746573743330333800de1708746573" - "743330333900df170874" - "6573743330343000e01708746573743330343100e11708746573743330343200e21708746573743330343300e31708" - "746573743330343400e4" - "1708746573743330343500e51708746573743330343600e61708746573743330343700e71708746573743330343800" - "e8170874657374333034" - "3900e91708746573743330353000ea1708746573743330353100eb1708746573743330353200ec1708746573743330" - "353300ed170874657374" - "3330353400ee1708746573743330353500ef1708746573743330353600f01708746573743330353700f11708746573" - "743330353800f2170874" - "6573743330353900f31708746573743330363000f41708746573743330363100f51708746573743330363200f61708" - "746573743330363300f7" - "1708746573743330363400f81708746573743330363500f91708746573743330363600fa1708746573743330363700" - "fb170874657374333036" - "3800fc1708746573743330363900fd1708746573743330373000fe1708746573743330373100ff1708746573743330" - "37320080180874657374" - "3330373300811808746573743330373400821808746573743330373500831808746573743330373600841808746573" - "74333037370085180874" - "6573743330373800861808746573743330373900871808746573743330383000881808746573743330383100891808" - "7465737433303832008a" - "18087465737433303833008b18087465737433303834008c18087465737433303835008d1808746573743330383600" - "8e180874657374333038" - "37008f1808746573743330383800901808746573743330383900911808746573743330393000921808746573743330" - "39310093180874657374" - "3330393200941808746573743330393300951808746573743330393400961808746573743330393500971808746573" - "74333039360098180874" - "65737433303937009918087465737433303938009a18087465737433303939009b18087465737433313030009c1808" - "7465737433313031009d" - "18087465737433313032009e18087465737433313033009f1808746573743331303400a01808746573743331303500" - "a1180874657374333130" - "3600a21808746573743331303700a31808746573743331303800a41808746573743331303900a51808746573743331" - "313000a6180874657374" - "3331313100a71808746573743331313200a81808746573743331313300a91808746573743331313400aa1808746573" - "743331313500ab180874" - "6573743331313600ac1808746573743331313700ad1808746573743331313800ae1808746573743331313900af1808" - "746573743331323000b0" - "1808746573743331323100b11808746573743331323200b21808746573743331323300b31808746573743331323400" - "b4180874657374333132" - "3500b51808746573743331323600b61808746573743331323700b71808746573743331323800b81808746573743331" - "323900b9180874657374" - "3331333000ba1808746573743331333100bb1808746573743331333200bc1808746573743331333300bd1808746573" - "743331333400be180874" - "6573743331333500bf1808746573743331333600c01808746573743331333700c11808746573743331333800c21808" - "746573743331333900c3" - "1808746573743331343000c41808746573743331343100c51808746573743331343200c61808746573743331343300" - "c7180874657374333134" - "3400c81808746573743331343500c91808746573743331343600ca1808746573743331343700cb1808746573743331" - "343800cc180874657374" - "3331343900cd1808746573743331353000ce1808746573743331353100cf1808746573743331353200d01808746573" - "743331353300d1180874" - "6573743331353400d21808746573743331353500d31808746573743331353600d41808746573743331353700d51808" - "746573743331353800d6" - "1808746573743331353900d71808746573743331363000d81808746573743331363100d91808746573743331363200" - "da180874657374333136" + "7432393434008017087465737432393435008117087465737432393436008217087465737432393437008317087465" + "7374323934380084170874657374323934390085170874657374323935300086170874657374323935310087170874" + "65737432393532008817087465737432393533008917087465737432393534008a17087465737432393535008b1708" + "7465737432393536008c17087465737432393537008d17087465737432393538008e17087465737432393539008f17" + "0874657374323936300090170874657374323936310091170874657374323936320092170874657374323936330093" + "1708746573743239363400941708746573743239363500951708746573743239363600961708746573743239363700" + "9717087465737432393638009817087465737432393639009917087465737432393730009a17087465737432393731" + "009b17087465737432393732009c17087465737432393733009d17087465737432393734009e170874657374323937" + "35009f1708746573743239373600a01708746573743239373700a11708746573743239373800a21708746573743239" + "373900a31708746573743239383000a41708746573743239383100a51708746573743239383200a617087465737432" + "39383300a71708746573743239383400a81708746573743239383500a91708746573743239383600aa170874657374" + "3239383700ab1708746573743239383800ac1708746573743239383900ad1708746573743239393000ae1708746573" + "743239393100af1708746573743239393200b01708746573743239393300b11708746573743239393400b217087465" + "73743239393500b31708746573743239393600b41708746573743239393700b51708746573743239393800b6170874" + "6573743239393900b71708746573743330303000b81708746573743330303100b91708746573743330303200ba1708" + "746573743330303300bb1708746573743330303400bc1708746573743330303500bd1708746573743330303600be17" + "08746573743330303700bf1708746573743330303800c01708746573743330303900c11708746573743330313000c2" + "1708746573743330313100c31708746573743330313200c41708746573743330313300c51708746573743330313400" + "c61708746573743330313500c71708746573743330313600c81708746573743330313700c917087465737433303138" + "00ca1708746573743330313900cb1708746573743330323000cc1708746573743330323100cd170874657374333032" + "3200ce1708746573743330323300cf1708746573743330323400d01708746573743330323500d11708746573743330" + "323600d21708746573743330323700d31708746573743330323800d41708746573743330323900d517087465737433" + "30333000d61708746573743330333100d71708746573743330333200d81708746573743330333300d9170874657374" + "3330333400da1708746573743330333500db1708746573743330333600dc1708746573743330333700dd1708746573" + "743330333800de1708746573743330333900df1708746573743330343000e01708746573743330343100e117087465" + "73743330343200e21708746573743330343300e31708746573743330343400e41708746573743330343500e5170874" + "6573743330343600e61708746573743330343700e71708746573743330343800e81708746573743330343900e91708" + "746573743330353000ea1708746573743330353100eb1708746573743330353200ec1708746573743330353300ed17" + "08746573743330353400ee1708746573743330353500ef1708746573743330353600f01708746573743330353700f1" + "1708746573743330353800f21708746573743330353900f31708746573743330363000f41708746573743330363100" + "f51708746573743330363200f61708746573743330363300f71708746573743330363400f817087465737433303635" + "00f91708746573743330363600fa1708746573743330363700fb1708746573743330363800fc170874657374333036" + "3900fd1708746573743330373000fe1708746573743330373100ff1708746573743330373200801808746573743330" + "3733008118087465737433303734008218087465737433303735008318087465737433303736008418087465737433" + "3037370085180874657374333037380086180874657374333037390087180874657374333038300088180874657374" + "33303831008918087465737433303832008a18087465737433303833008b18087465737433303834008c1808746573" + "7433303835008d18087465737433303836008e18087465737433303837008f18087465737433303838009018087465" + "7374333038390091180874657374333039300092180874657374333039310093180874657374333039320094180874" + "6573743330393300951808746573743330393400961808746573743330393500971808746573743330393600981808" + "7465737433303937009918087465737433303938009a18087465737433303939009b18087465737433313030009c18" + "087465737433313031009d18087465737433313032009e18087465737433313033009f1808746573743331303400a0" + "1808746573743331303500a11808746573743331303600a21808746573743331303700a31808746573743331303800" + "a41808746573743331303900a51808746573743331313000a61808746573743331313100a718087465737433313132" + "00a81808746573743331313300a91808746573743331313400aa1808746573743331313500ab180874657374333131" + "3600ac1808746573743331313700ad1808746573743331313800ae1808746573743331313900af1808746573743331" + "323000b01808746573743331323100b11808746573743331323200b21808746573743331323300b318087465737433" + "31323400b41808746573743331323500b51808746573743331323600b61808746573743331323700b7180874657374" + "3331323800b81808746573743331323900b91808746573743331333000ba1808746573743331333100bb1808746573" + "743331333200bc1808746573743331333300bd1808746573743331333400be1808746573743331333500bf18087465" + "73743331333600c01808746573743331333700c11808746573743331333800c21808746573743331333900c3180874" + "6573743331343000c41808746573743331343100c51808746573743331343200c61808746573743331343300c71808" + "746573743331343400c81808746573743331343500c91808746573743331343600ca1808746573743331343700cb18" + "08746573743331343800cc1808746573743331343900cd1808746573743331353000ce1808746573743331353100cf" + "1808746573743331353200d01808746573743331353300d11808746573743331353400d21808746573743331353500" + "d31808746573743331353600d41808746573743331353700d51808746573743331353800d618087465737433313539" + "00d71808746573743331363000d81808746573743331363100d91808746573743331363200da180874657374333136" "3300db1808746573743331363400dc1808746573743331363500dd1808746573743331363600de1808746573743331" - "363700df180874657374" - "3331363800e01808746573743331363900e11808746573743331373000e21808746573743331373100e31808746573" - "743331373200e4180874" - "6573743331373300e51808746573743331373400e61808746573743331373500e71808746573743331373600e81808" - "746573743331373700e9" - "1808746573743331373800ea1808746573743331373900eb1808746573743331383000ec1808746573743331383100" - "ed180874657374333138" - "3200ee1808746573743331383300ef1808746573743331383400f01808746573743331383500f11808746573743331" - "383600f2180874657374" - "3331383700f31808746573743331383800f41808746573743331383900f51808746573743331393000f61808746573" - "743331393100f7180874" - "6573743331393200f81808746573743331393300f91808746573743331393400fa1808746573743331393500fb1808" - "746573743331393600fc" - "1808746573743331393700fd1808746573743331393800fe1808746573743331393900ff1808746573743332303000" - "80190874657374333230" - "3100811908746573743332303200821908746573743332303300831908746573743332303400841908746573743332" - "30350085190874657374" - "3332303600861908746573743332303700871908746573743332303800881908746573743332303900891908746573" - "7433323130008a190874" - "65737433323131008b19087465737433323132008c19087465737433323133008d19087465737433323134008e1908" - "7465737433323135008f" - "1908746573743332313600901908746573743332313700911908746573743332313800921908746573743332313900" - "93190874657374333232" - "3000941908746573743332323100951908746573743332323200961908746573743332323300971908746573743332" - "32340098190874657374" - "33323235009919087465737433323236009a19087465737433323237009b19087465737433323238009c1908746573" - "7433323239009d190874" - "65737433323330009e19087465737433323331009f1908746573743332333200a01908746573743332333300a11908" - "746573743332333400a2" - "1908746573743332333500a31908746573743332333600a41908746573743332333700a51908746573743332333800" - "a6190874657374333233" - "3900a71908746573743332343000a81908746573743332343100a91908746573743332343200aa1908746573743332" - "343300ab190874657374" - "3332343400ac1908746573743332343500ad1908746573743332343600ae1908746573743332343700af1908746573" - "743332343800b0190874" - "6573743332343900b11908746573743332353000b21908746573743332353100b31908746573743332353200b41908" - "746573743332353300b5" - "1908746573743332353400b61908746573743332353500b71908746573743332353600b81908746573743332353700" - "b9190874657374333235" - "3800ba1908746573743332353900bb1908746573743332363000bc1908746573743332363100bd1908746573743332" - "363200be190874657374" - "3332363300bf1908746573743332363400c01908746573743332363500c11908746573743332363600c21908746573" - "743332363700c3190874" - "6573743332363800c41908746573743332363900c51908746573743332373000c61908746573743332373100c71908" - "746573743332373200c8" - "1908746573743332373300c91908746573743332373400ca1908746573743332373500cb1908746573743332373600" - "cc190874657374333237" - "3700cd1908746573743332373800ce1908746573743332373900cf1908746573743332383000d01908746573743332" - "383100d1190874657374" - "3332383200d21908746573743332383300d31908746573743332383400d41908746573743332383500d51908746573" - "743332383600d6190874" - "6573743332383700d71908746573743332383800d81908746573743332383900d91908746573743332393000da1908" - "746573743332393100db" - "1908746573743332393200dc1908746573743332393300dd1908746573743332393400de1908746573743332393500" - "df190874657374333239" - "3600e01908746573743332393700e11908746573743332393800e21908746573743332393900e31908746573743333" - "303000e4190874657374" - "3333303100e51908746573743333303200e61908746573743333303300e71908746573743333303400e81908746573" - "743333303500e9190874" - "6573743333303600ea1908746573743333303700eb1908746573743333303800ec1908746573743333303900ed1908" - "746573743333313000ee" - "1908746573743333313100ef1908746573743333313200f01908746573743333313300f11908746573743333313400" - "f2190874657374333331" - "3500f31908746573743333313600f41908746573743333313700f51908746573743333313800f61908746573743333" - "313900f7190874657374" - "3333323000f81908746573743333323100f91908746573743333323200fa1908746573743333323300fb1908746573" - "743333323400fc190874" - "6573743333323500fd1908746573743333323600fe1908746573743333323700ff1908746573743333323800801a08" - "74657374333332390081" - "1a08746573743333333000821a08746573743333333100831a08746573743333333200841a08746573743333333300" - "851a0874657374333333" - "3400861a08746573743333333500871a08746573743333333600881a08746573743333333700891a08746573743333" - "3338008a1a0874657374" - "33333339008b1a087465737433333430008c1a087465737433333431008d1a087465737433333432008e1a08746573" - "7433333433008f1a0874" - "6573743333343400901a08746573743333343500911a08746573743333343600921a08746573743333343700931a08" - "74657374333334380094" - "1a08746573743333343900951a08746573743333353000961a08746573743333353100971a08746573743333353200" - "981a0874657374333335" - "3300991a087465737433333534009a1a087465737433333535009b1a087465737433333536009c1a08746573743333" - "3537009d1a0874657374" - "33333538009e1a087465737433333539009f1a08746573743333363000a01a08746573743333363100a11a08746573" - "743333363200a21a0874" - "6573743333363300a31a08746573743333363400a41a08746573743333363500a51a08746573743333363600a61a08" - "746573743333363700a7" - "1a08746573743333363800a81a08746573743333363900a91a08746573743333373000aa1a08746573743333373100" - "ab1a0874657374333337" - "3200ac1a08746573743333373300ad1a08746573743333373400ae1a08746573743333373500af1a08746573743333" - "373600b01a0874657374" - "3333373700b11a08746573743333373800b21a08746573743333373900b31a08746573743333383000b41a08746573" - "743333383100b51a0874" - "6573743333383200b61a08746573743333383300b71a08746573743333383400b81a08746573743333383500b91a08" - "746573743333383600ba" + "363700df1808746573743331363800e01808746573743331363900e11808746573743331373000e218087465737433" + "31373100e31808746573743331373200e41808746573743331373300e51808746573743331373400e6180874657374" + "3331373500e71808746573743331373600e81808746573743331373700e91808746573743331373800ea1808746573" + "743331373900eb1808746573743331383000ec1808746573743331383100ed1808746573743331383200ee18087465" + "73743331383300ef1808746573743331383400f01808746573743331383500f11808746573743331383600f2180874" + "6573743331383700f31808746573743331383800f41808746573743331383900f51808746573743331393000f61808" + "746573743331393100f71808746573743331393200f81808746573743331393300f91808746573743331393400fa18" + "08746573743331393500fb1808746573743331393600fc1808746573743331393700fd1808746573743331393800fe" + "1808746573743331393900ff1808746573743332303000801908746573743332303100811908746573743332303200" + "8219087465737433323033008319087465737433323034008419087465737433323035008519087465737433323036" + "0086190874657374333230370087190874657374333230380088190874657374333230390089190874657374333231" + "30008a19087465737433323131008b19087465737433323132008c19087465737433323133008d1908746573743332" + "3134008e19087465737433323135008f19087465737433323136009019087465737433323137009119087465737433" + "3231380092190874657374333231390093190874657374333232300094190874657374333232310095190874657374" + "3332323200961908746573743332323300971908746573743332323400981908746573743332323500991908746573" + "7433323236009a19087465737433323237009b19087465737433323238009c19087465737433323239009d19087465" + "737433323330009e19087465737433323331009f1908746573743332333200a01908746573743332333300a1190874" + "6573743332333400a21908746573743332333500a31908746573743332333600a41908746573743332333700a51908" + "746573743332333800a61908746573743332333900a71908746573743332343000a81908746573743332343100a919" + "08746573743332343200aa1908746573743332343300ab1908746573743332343400ac1908746573743332343500ad" + "1908746573743332343600ae1908746573743332343700af1908746573743332343800b01908746573743332343900" + "b11908746573743332353000b21908746573743332353100b31908746573743332353200b419087465737433323533" + "00b51908746573743332353400b61908746573743332353500b71908746573743332353600b8190874657374333235" + "3700b91908746573743332353800ba1908746573743332353900bb1908746573743332363000bc1908746573743332" + "363100bd1908746573743332363200be1908746573743332363300bf1908746573743332363400c019087465737433" + "32363500c11908746573743332363600c21908746573743332363700c31908746573743332363800c4190874657374" + "3332363900c51908746573743332373000c61908746573743332373100c71908746573743332373200c81908746573" + "743332373300c91908746573743332373400ca1908746573743332373500cb1908746573743332373600cc19087465" + "73743332373700cd1908746573743332373800ce1908746573743332373900cf1908746573743332383000d0190874" + "6573743332383100d11908746573743332383200d21908746573743332383300d31908746573743332383400d41908" + "746573743332383500d51908746573743332383600d61908746573743332383700d71908746573743332383800d819" + "08746573743332383900d91908746573743332393000da1908746573743332393100db1908746573743332393200dc" + "1908746573743332393300dd1908746573743332393400de1908746573743332393500df1908746573743332393600" + "e01908746573743332393700e11908746573743332393800e21908746573743332393900e319087465737433333030" + "00e41908746573743333303100e51908746573743333303200e61908746573743333303300e7190874657374333330" + "3400e81908746573743333303500e91908746573743333303600ea1908746573743333303700eb1908746573743333" + "303800ec1908746573743333303900ed1908746573743333313000ee1908746573743333313100ef19087465737433" + "33313200f01908746573743333313300f11908746573743333313400f21908746573743333313500f3190874657374" + "3333313600f41908746573743333313700f51908746573743333313800f61908746573743333313900f71908746573" + "743333323000f81908746573743333323100f91908746573743333323200fa1908746573743333323300fb19087465" + "73743333323400fc1908746573743333323500fd1908746573743333323600fe1908746573743333323700ff190874" + "6573743333323800801a08746573743333323900811a08746573743333333000821a08746573743333333100831a08" + "746573743333333200841a08746573743333333300851a08746573743333333400861a08746573743333333500871a" + "08746573743333333600881a08746573743333333700891a087465737433333338008a1a087465737433333339008b" + "1a087465737433333430008c1a087465737433333431008d1a087465737433333432008e1a08746573743333343300" + "8f1a08746573743333343400901a08746573743333343500911a08746573743333343600921a087465737433333437" + "00931a08746573743333343800941a08746573743333343900951a08746573743333353000961a0874657374333335" + "3100971a08746573743333353200981a08746573743333353300991a087465737433333534009a1a08746573743333" + "3535009b1a087465737433333536009c1a087465737433333537009d1a087465737433333538009e1a087465737433" + "333539009f1a08746573743333363000a01a08746573743333363100a11a08746573743333363200a21a0874657374" + "3333363300a31a08746573743333363400a41a08746573743333363500a51a08746573743333363600a61a08746573" + "743333363700a71a08746573743333363800a81a08746573743333363900a91a08746573743333373000aa1a087465" + "73743333373100ab1a08746573743333373200ac1a08746573743333373300ad1a08746573743333373400ae1a0874" + "6573743333373500af1a08746573743333373600b01a08746573743333373700b11a08746573743333373800b21a08" + "746573743333373900b31a08746573743333383000b41a08746573743333383100b51a08746573743333383200b61a" + "08746573743333383300b71a08746573743333383400b81a08746573743333383500b91a08746573743333383600ba" "1a08746573743333383700bb1a08746573743333383800bc1a08746573743333383900bd1a08746573743333393000" - "be1a0874657374333339" - "3100bf1a08746573743333393200c01a08746573743333393300c11a08746573743333393400c21a08746573743333" - "393500c31a0874657374" - "3333393600c41a08746573743333393700c51a08746573743333393800c61a08746573743333393900c71a08746573" - "743334303000c81a0874" - "6573743334303100c91a08746573743334303200ca1a08746573743334303300cb1a08746573743334303400cc1a08" - "746573743334303500cd" - "1a08746573743334303600ce1a08746573743334303700cf1a08746573743334303800d01a08746573743334303900" - "d11a0874657374333431" - "3000d21a08746573743334313100d31a08746573743334313200d41a08746573743334313300d51a08746573743334" - "313400d61a0874657374" - "3334313500d71a08746573743334313600d81a08746573743334313700d91a08746573743334313800da1a08746573" - "743334313900db1a0874" - "6573743334323000dc1a08746573743334323100dd1a08746573743334323200de1a08746573743334323300df1a08" - "746573743334323400e0" - "1a08746573743334323500e11a08746573743334323600e21a08746573743334323700e31a08746573743334323800" - "e41a0874657374333432" - "3900e51a08746573743334333000e61a08746573743334333100e71a08746573743334333200e81a08746573743334" - "333300e91a0874657374" - "3334333400ea1a08746573743334333500eb1a08746573743334333600ec1a08746573743334333700ed1a08746573" - "743334333800ee1a0874" - "6573743334333900ef1a08746573743334343000f01a08746573743334343100f11a08746573743334343200f21a08" - "746573743334343300f3" - "1a08746573743334343400f41a08746573743334343500f51a08746573743334343600f61a08746573743334343700" - "f71a0874657374333434" - "3800f81a08746573743334343900f91a08746573743334353000fa1a08746573743334353100fb1a08746573743334" - "353200fc1a0874657374" - "3334353300fd1a08746573743334353400fe1a08746573743334353500ff1a08746573743334353600801b08746573" - "743334353700811b0874" - "6573743334353800821b08746573743334353900831b08746573743334363000841b08746573743334363100851b08" - "74657374333436320086" - "1b08746573743334363300871b08746573743334363400881b08746573743334363500891b08746573743334363600" - "8a1b0874657374333436" - "37008b1b087465737433343638008c1b087465737433343639008d1b087465737433343730008e1b08746573743334" - "3731008f1b0874657374" - "3334373200901b08746573743334373300911b08746573743334373400921b08746573743334373500931b08746573" - "743334373600941b0874" - "6573743334373700951b08746573743334373800961b08746573743334373900971b08746573743334383000981b08" - "74657374333438310099" - "1b087465737433343832009a1b087465737433343833009b1b087465737433343834009c1b08746573743334383500" - "9d1b0874657374333438" - "36009e1b087465737433343837009f1b08746573743334383800a01b08746573743334383900a11b08746573743334" - "393000a21b0874657374" - "3334393100a31b08746573743334393200a41b08746573743334393300a51b08746573743334393400a61b08746573" - "743334393500a71b0874" - "6573743334393600a81b08746573743334393700a91b08746573743334393800aa1b08746573743334393900ab1b08" - "746573743335303000ac" - "1b08746573743335303100ad1b08746573743335303200ae1b08746573743335303300af1b08746573743335303400" - "b01b0874657374333530" - "3500b11b08746573743335303600b21b08746573743335303700b31b08746573743335303800b41b08746573743335" - "303900b51b0874657374" - "3335313000b61b08746573743335313100b71b08746573743335313200b81b08746573743335313300b91b08746573" - "743335313400ba1b0874" - "6573743335313500bb1b08746573743335313600bc1b08746573743335313700bd1b08746573743335313800be1b08" - "746573743335313900bf" - "1b08746573743335323000c01b08746573743335323100c11b08746573743335323200c21b08746573743335323300" - "c31b0874657374333532" - "3400c41b08746573743335323500c51b08746573743335323600c61b08746573743335323700c71b08746573743335" - "323800c81b0874657374" - "3335323900c91b08746573743335333000ca1b08746573743335333100cb1b08746573743335333200cc1b08746573" - "743335333300cd1b0874" - "6573743335333400ce1b08746573743335333500cf1b08746573743335333600d01b08746573743335333700d11b08" - "746573743335333800d2" - "1b08746573743335333900d31b08746573743335343000d41b08746573743335343100d51b08746573743335343200" - "d61b0874657374333534" - "3300d71b08746573743335343400d81b08746573743335343500d91b08746573743335343600da1b08746573743335" - "343700db1b0874657374" - "3335343800dc1b08746573743335343900dd1b08746573743335353000de1b08746573743335353100df1b08746573" - "743335353200e01b0874" - "6573743335353300e11b08746573743335353400e21b08746573743335353500e31b08746573743335353600e41b08" - "746573743335353700e5" - "1b08746573743335353800e61b08746573743335353900e71b08746573743335363000e81b08746573743335363100" - "e91b0874657374333536" - "3200ea1b08746573743335363300eb1b08746573743335363400ec1b08746573743335363500ed1b08746573743335" - "363600ee1b0874657374" - "3335363700ef1b08746573743335363800f01b08746573743335363900f11b08746573743335373000f21b08746573" - "743335373100f31b0874" - "6573743335373200f41b08746573743335373300f51b08746573743335373400f61b08746573743335373500f71b08" - "746573743335373600f8" - "1b08746573743335373700f91b08746573743335373800fa1b08746573743335373900fb1b08746573743335383000" - "fc1b0874657374333538" - "3100fd1b08746573743335383200fe1b08746573743335383300ff1b08746573743335383400801c08746573743335" - "383500811c0874657374" - "3335383600821c08746573743335383700831c08746573743335383800841c08746573743335383900851c08746573" - "743335393000861c0874" - "6573743335393100871c08746573743335393200881c08746573743335393300891c087465737433353934008a1c08" - "7465737433353935008b" - "1c087465737433353936008c1c087465737433353937008d1c087465737433353938008e1c08746573743335393900" - "8f1c0874657374333630" - "3000901c08746573743336303100911c08746573743336303200921c08746573743336303300931c08746573743336" - "303400941c0874657374" - "3336303500951c08746573743336303600961c08746573743336303700971c08746573743336303800981c08746573" - "743336303900991c0874" + "be1a08746573743333393100bf1a08746573743333393200c01a08746573743333393300c11a087465737433333934" + "00c21a08746573743333393500c31a08746573743333393600c41a08746573743333393700c51a0874657374333339" + "3800c61a08746573743333393900c71a08746573743334303000c81a08746573743334303100c91a08746573743334" + "303200ca1a08746573743334303300cb1a08746573743334303400cc1a08746573743334303500cd1a087465737433" + "34303600ce1a08746573743334303700cf1a08746573743334303800d01a08746573743334303900d11a0874657374" + "3334313000d21a08746573743334313100d31a08746573743334313200d41a08746573743334313300d51a08746573" + "743334313400d61a08746573743334313500d71a08746573743334313600d81a08746573743334313700d91a087465" + "73743334313800da1a08746573743334313900db1a08746573743334323000dc1a08746573743334323100dd1a0874" + "6573743334323200de1a08746573743334323300df1a08746573743334323400e01a08746573743334323500e11a08" + "746573743334323600e21a08746573743334323700e31a08746573743334323800e41a08746573743334323900e51a" + "08746573743334333000e61a08746573743334333100e71a08746573743334333200e81a08746573743334333300e9" + "1a08746573743334333400ea1a08746573743334333500eb1a08746573743334333600ec1a08746573743334333700" + "ed1a08746573743334333800ee1a08746573743334333900ef1a08746573743334343000f01a087465737433343431" + "00f11a08746573743334343200f21a08746573743334343300f31a08746573743334343400f41a0874657374333434" + "3500f51a08746573743334343600f61a08746573743334343700f71a08746573743334343800f81a08746573743334" + "343900f91a08746573743334353000fa1a08746573743334353100fb1a08746573743334353200fc1a087465737433" + "34353300fd1a08746573743334353400fe1a08746573743334353500ff1a08746573743334353600801b0874657374" + "3334353700811b08746573743334353800821b08746573743334353900831b08746573743334363000841b08746573" + "743334363100851b08746573743334363200861b08746573743334363300871b08746573743334363400881b087465" + "73743334363500891b087465737433343636008a1b087465737433343637008b1b087465737433343638008c1b0874" + "65737433343639008d1b087465737433343730008e1b087465737433343731008f1b08746573743334373200901b08" + "746573743334373300911b08746573743334373400921b08746573743334373500931b08746573743334373600941b" + "08746573743334373700951b08746573743334373800961b08746573743334373900971b0874657374333438300098" + "1b08746573743334383100991b087465737433343832009a1b087465737433343833009b1b08746573743334383400" + "9c1b087465737433343835009d1b087465737433343836009e1b087465737433343837009f1b087465737433343838" + "00a01b08746573743334383900a11b08746573743334393000a21b08746573743334393100a31b0874657374333439" + "3200a41b08746573743334393300a51b08746573743334393400a61b08746573743334393500a71b08746573743334" + "393600a81b08746573743334393700a91b08746573743334393800aa1b08746573743334393900ab1b087465737433" + "35303000ac1b08746573743335303100ad1b08746573743335303200ae1b08746573743335303300af1b0874657374" + "3335303400b01b08746573743335303500b11b08746573743335303600b21b08746573743335303700b31b08746573" + "743335303800b41b08746573743335303900b51b08746573743335313000b61b08746573743335313100b71b087465" + "73743335313200b81b08746573743335313300b91b08746573743335313400ba1b08746573743335313500bb1b0874" + "6573743335313600bc1b08746573743335313700bd1b08746573743335313800be1b08746573743335313900bf1b08" + "746573743335323000c01b08746573743335323100c11b08746573743335323200c21b08746573743335323300c31b" + "08746573743335323400c41b08746573743335323500c51b08746573743335323600c61b08746573743335323700c7" + "1b08746573743335323800c81b08746573743335323900c91b08746573743335333000ca1b08746573743335333100" + "cb1b08746573743335333200cc1b08746573743335333300cd1b08746573743335333400ce1b087465737433353335" + "00cf1b08746573743335333600d01b08746573743335333700d11b08746573743335333800d21b0874657374333533" + "3900d31b08746573743335343000d41b08746573743335343100d51b08746573743335343200d61b08746573743335" + "343300d71b08746573743335343400d81b08746573743335343500d91b08746573743335343600da1b087465737433" + "35343700db1b08746573743335343800dc1b08746573743335343900dd1b08746573743335353000de1b0874657374" + "3335353100df1b08746573743335353200e01b08746573743335353300e11b08746573743335353400e21b08746573" + "743335353500e31b08746573743335353600e41b08746573743335353700e51b08746573743335353800e61b087465" + "73743335353900e71b08746573743335363000e81b08746573743335363100e91b08746573743335363200ea1b0874" + "6573743335363300eb1b08746573743335363400ec1b08746573743335363500ed1b08746573743335363600ee1b08" + "746573743335363700ef1b08746573743335363800f01b08746573743335363900f11b08746573743335373000f21b" + "08746573743335373100f31b08746573743335373200f41b08746573743335373300f51b08746573743335373400f6" + "1b08746573743335373500f71b08746573743335373600f81b08746573743335373700f91b08746573743335373800" + "fa1b08746573743335373900fb1b08746573743335383000fc1b08746573743335383100fd1b087465737433353832" + "00fe1b08746573743335383300ff1b08746573743335383400801c08746573743335383500811c0874657374333538" + "3600821c08746573743335383700831c08746573743335383800841c08746573743335383900851c08746573743335" + "393000861c08746573743335393100871c08746573743335393200881c08746573743335393300891c087465737433" + "353934008a1c087465737433353935008b1c087465737433353936008c1c087465737433353937008d1c0874657374" + "33353938008e1c087465737433353939008f1c08746573743336303000901c08746573743336303100911c08746573" + "743336303200921c08746573743336303300931c08746573743336303400941c08746573743336303500951c087465" + "73743336303600961c08746573743336303700971c08746573743336303800981c08746573743336303900991c0874" "65737433363130009a1c087465737433363131009b1c087465737433363132009c1c087465737433363133009d1c08" - "7465737433363134009e" - "1c087465737433363135009f1c08746573743336313600a01c08746573743336313700a11c08746573743336313800" - "a21c0874657374333631" - "3900a31c08746573743336323000a41c08746573743336323100a51c08746573743336323200a61c08746573743336" - "323300a71c0874657374" - "3336323400a81c08746573743336323500a91c08746573743336323600aa1c08746573743336323700ab1c08746573" - "743336323800ac1c0874" - "6573743336323900ad1c08746573743336333000ae1c08746573743336333100af1c08746573743336333200b01c08" - "746573743336333300b1" - "1c08746573743336333400b21c08746573743336333500b31c08746573743336333600b41c08746573743336333700" - "b51c0874657374333633" - "3800b61c08746573743336333900b71c08746573743336343000b81c08746573743336343100b91c08746573743336" - "343200ba1c0874657374" - "3336343300bb1c08746573743336343400bc1c08746573743336343500bd1c08746573743336343600be1c08746573" - "743336343700bf1c0874" - "6573743336343800c01c08746573743336343900c11c08746573743336353000c21c08746573743336353100c31c08" - "746573743336353200c4" - "1c08746573743336353300c51c08746573743336353400c61c08746573743336353500c71c08746573743336353600" - "c81c0874657374333635" - "3700c91c08746573743336353800ca1c08746573743336353900cb1c08746573743336363000cc1c08746573743336" - "363100cd1c0874657374" - "3336363200ce1c08746573743336363300cf1c08746573743336363400d01c08746573743336363500d11c08746573" - "743336363600d21c0874" - "6573743336363700d31c08746573743336363800d41c08746573743336363900d51c08746573743336373000d61c08" - "746573743336373100d7" - "1c08746573743336373200d81c08746573743336373300d91c08746573743336373400da1c08746573743336373500" - "db1c0874657374333637" - "3600dc1c08746573743336373700dd1c08746573743336373800de1c08746573743336373900df1c08746573743336" - "383000e01c0874657374" - "3336383100e11c08746573743336383200e21c08746573743336383300e31c08746573743336383400e41c08746573" - "743336383500e51c0874" - "6573743336383600e61c08746573743336383700e71c08746573743336383800e81c08746573743336383900e91c08" - "746573743336393000ea" - "1c08746573743336393100eb1c08746573743336393200ec1c08746573743336393300ed1c08746573743336393400" - "ee1c0874657374333639" - "3500ef1c08746573743336393600f01c08746573743336393700f11c08746573743336393800f21c08746573743336" - "393900f31c0874657374" - "3337303000f41c08746573743337303100f51c08746573743337303200f61c08746573743337303300f71c08746573" - "743337303400f81c0874" - "6573743337303500f91c08746573743337303600fa1c08746573743337303700fb1c08746573743337303800fc1c08" - "746573743337303900fd" - "1c08746573743337313000fe1c08746573743337313100ff1c08746573743337313200801d08746573743337313300" - "811d0874657374333731" - "3400821d08746573743337313500831d08746573743337313600841d08746573743337313700851d08746573743337" - "313800861d0874657374" - "3337313900871d08746573743337323000881d08746573743337323100891d087465737433373232008a1d08746573" - "7433373233008b1d0874" - "65737433373234008c1d087465737433373235008d1d087465737433373236008e1d087465737433373237008f1d08" - "74657374333732380090" - "1d08746573743337323900911d08746573743337333000921d08746573743337333100931d08746573743337333200" - "941d0874657374333733" - "3300951d08746573743337333400961d08746573743337333500971d08746573743337333600981d08746573743337" - "333700991d0874657374" - "33373338009a1d087465737433373339009b1d087465737433373430009c1d087465737433373431009d1d08746573" - "7433373432009e1d0874" - "65737433373433009f1d08746573743337343400a01d08746573743337343500a11d08746573743337343600a21d08" - "746573743337343700a3" - "1d08746573743337343800a41d08746573743337343900a51d08746573743337353000a61d08746573743337353100" - "a71d0874657374333735" - "3200a81d08746573743337353300a91d08746573743337353400aa1d08746573743337353500ab1d08746573743337" - "353600ac1d0874657374" - "3337353700ad1d08746573743337353800ae1d08746573743337353900af1d08746573743337363000b01d08746573" - "743337363100b11d0874" - "6573743337363200b21d08746573743337363300b31d08746573743337363400b41d08746573743337363500b51d08" - "746573743337363600b6" - "1d08746573743337363700b71d08746573743337363800b81d08746573743337363900b91d08746573743337373000" - "ba1d0874657374333737" - "3100bb1d08746573743337373200bc1d08746573743337373300bd1d08746573743337373400be1d08746573743337" - "373500bf1d0874657374" - "3337373600c01d08746573743337373700c11d08746573743337373800c21d08746573743337373900c31d08746573" - "743337383000c41d0874" - "6573743337383100c51d08746573743337383200c61d08746573743337383300c71d08746573743337383400c81d08" - "746573743337383500c9" - "1d08746573743337383600ca1d08746573743337383700cb1d08746573743337383800cc1d08746573743337383900" - "cd1d0874657374333739" - "3000ce1d08746573743337393100cf1d08746573743337393200d01d08746573743337393300d11d08746573743337" - "393400d21d0874657374" - "3337393500d31d08746573743337393600d41d08746573743337393700d51d08746573743337393800d61d08746573" - "743337393900d71d0874" - "6573743338303000d81d08746573743338303100d91d08746573743338303200da1d08746573743338303300db1d08" - "746573743338303400dc" - "1d08746573743338303500dd1d08746573743338303600de1d08746573743338303700df1d08746573743338303800" - "e01d0874657374333830" - "3900e11d08746573743338313000e21d08746573743338313100e31d08746573743338313200e41d08746573743338" - "313300e51d0874657374" - "3338313400e61d08746573743338313500e71d08746573743338313600e81d08746573743338313700e91d08746573" - "743338313800ea1d0874" - "6573743338313900eb1d08746573743338323000ec1d08746573743338323100ed1d08746573743338323200ee1d08" - "746573743338323300ef" - "1d08746573743338323400f01d08746573743338323500f11d08746573743338323600f21d08746573743338323700" - "f31d0874657374333832" - "3800f41d08746573743338323900f51d08746573743338333000f61d08746573743338333100f71d08746573743338" - "333200f81d0874657374" + "7465737433363134009e1c087465737433363135009f1c08746573743336313600a01c08746573743336313700a11c" + "08746573743336313800a21c08746573743336313900a31c08746573743336323000a41c08746573743336323100a5" + "1c08746573743336323200a61c08746573743336323300a71c08746573743336323400a81c08746573743336323500" + "a91c08746573743336323600aa1c08746573743336323700ab1c08746573743336323800ac1c087465737433363239" + "00ad1c08746573743336333000ae1c08746573743336333100af1c08746573743336333200b01c0874657374333633" + "3300b11c08746573743336333400b21c08746573743336333500b31c08746573743336333600b41c08746573743336" + "333700b51c08746573743336333800b61c08746573743336333900b71c08746573743336343000b81c087465737433" + "36343100b91c08746573743336343200ba1c08746573743336343300bb1c08746573743336343400bc1c0874657374" + "3336343500bd1c08746573743336343600be1c08746573743336343700bf1c08746573743336343800c01c08746573" + "743336343900c11c08746573743336353000c21c08746573743336353100c31c08746573743336353200c41c087465" + "73743336353300c51c08746573743336353400c61c08746573743336353500c71c08746573743336353600c81c0874" + "6573743336353700c91c08746573743336353800ca1c08746573743336353900cb1c08746573743336363000cc1c08" + "746573743336363100cd1c08746573743336363200ce1c08746573743336363300cf1c08746573743336363400d01c" + "08746573743336363500d11c08746573743336363600d21c08746573743336363700d31c08746573743336363800d4" + "1c08746573743336363900d51c08746573743336373000d61c08746573743336373100d71c08746573743336373200" + "d81c08746573743336373300d91c08746573743336373400da1c08746573743336373500db1c087465737433363736" + "00dc1c08746573743336373700dd1c08746573743336373800de1c08746573743336373900df1c0874657374333638" + "3000e01c08746573743336383100e11c08746573743336383200e21c08746573743336383300e31c08746573743336" + "383400e41c08746573743336383500e51c08746573743336383600e61c08746573743336383700e71c087465737433" + "36383800e81c08746573743336383900e91c08746573743336393000ea1c08746573743336393100eb1c0874657374" + "3336393200ec1c08746573743336393300ed1c08746573743336393400ee1c08746573743336393500ef1c08746573" + "743336393600f01c08746573743336393700f11c08746573743336393800f21c08746573743336393900f31c087465" + "73743337303000f41c08746573743337303100f51c08746573743337303200f61c08746573743337303300f71c0874" + "6573743337303400f81c08746573743337303500f91c08746573743337303600fa1c08746573743337303700fb1c08" + "746573743337303800fc1c08746573743337303900fd1c08746573743337313000fe1c08746573743337313100ff1c" + "08746573743337313200801d08746573743337313300811d08746573743337313400821d0874657374333731350083" + "1d08746573743337313600841d08746573743337313700851d08746573743337313800861d08746573743337313900" + "871d08746573743337323000881d08746573743337323100891d087465737433373232008a1d087465737433373233" + "008b1d087465737433373234008c1d087465737433373235008d1d087465737433373236008e1d0874657374333732" + "37008f1d08746573743337323800901d08746573743337323900911d08746573743337333000921d08746573743337" + "333100931d08746573743337333200941d08746573743337333300951d08746573743337333400961d087465737433" + "37333500971d08746573743337333600981d08746573743337333700991d087465737433373338009a1d0874657374" + "33373339009b1d087465737433373430009c1d087465737433373431009d1d087465737433373432009e1d08746573" + "7433373433009f1d08746573743337343400a01d08746573743337343500a11d08746573743337343600a21d087465" + "73743337343700a31d08746573743337343800a41d08746573743337343900a51d08746573743337353000a61d0874" + "6573743337353100a71d08746573743337353200a81d08746573743337353300a91d08746573743337353400aa1d08" + "746573743337353500ab1d08746573743337353600ac1d08746573743337353700ad1d08746573743337353800ae1d" + "08746573743337353900af1d08746573743337363000b01d08746573743337363100b11d08746573743337363200b2" + "1d08746573743337363300b31d08746573743337363400b41d08746573743337363500b51d08746573743337363600" + "b61d08746573743337363700b71d08746573743337363800b81d08746573743337363900b91d087465737433373730" + "00ba1d08746573743337373100bb1d08746573743337373200bc1d08746573743337373300bd1d0874657374333737" + "3400be1d08746573743337373500bf1d08746573743337373600c01d08746573743337373700c11d08746573743337" + "373800c21d08746573743337373900c31d08746573743337383000c41d08746573743337383100c51d087465737433" + "37383200c61d08746573743337383300c71d08746573743337383400c81d08746573743337383500c91d0874657374" + "3337383600ca1d08746573743337383700cb1d08746573743337383800cc1d08746573743337383900cd1d08746573" + "743337393000ce1d08746573743337393100cf1d08746573743337393200d01d08746573743337393300d11d087465" + "73743337393400d21d08746573743337393500d31d08746573743337393600d41d08746573743337393700d51d0874" + "6573743337393800d61d08746573743337393900d71d08746573743338303000d81d08746573743338303100d91d08" + "746573743338303200da1d08746573743338303300db1d08746573743338303400dc1d08746573743338303500dd1d" + "08746573743338303600de1d08746573743338303700df1d08746573743338303800e01d08746573743338303900e1" + "1d08746573743338313000e21d08746573743338313100e31d08746573743338313200e41d08746573743338313300" + "e51d08746573743338313400e61d08746573743338313500e71d08746573743338313600e81d087465737433383137" + "00e91d08746573743338313800ea1d08746573743338313900eb1d08746573743338323000ec1d0874657374333832" + "3100ed1d08746573743338323200ee1d08746573743338323300ef1d08746573743338323400f01d08746573743338" + "323500f11d08746573743338323600f21d08746573743338323700f31d08746573743338323800f41d087465737433" + "38323900f51d08746573743338333000f61d08746573743338333100f71d08746573743338333200f81d0874657374" "3338333300f91d08746573743338333400fa1d08746573743338333500fb1d08746573743338333600fc1d08746573" - "743338333700fd1d0874" - "6573743338333800fe1d08746573743338333900ff1d08746573743338343000801e08746573743338343100811e08" - "74657374333834320082" - "1e08746573743338343300831e08746573743338343400841e08746573743338343500851e08746573743338343600" - "861e0874657374333834" - "3700871e08746573743338343800881e08746573743338343900891e087465737433383530008a1e08746573743338" - "3531008b1e0874657374" - "33383532008c1e087465737433383533008d1e087465737433383534008e1e087465737433383535008f1e08746573" - "743338353600901e0874" - "6573743338353700911e08746573743338353800921e08746573743338353900931e08746573743338363000941e08" - "74657374333836310095" - "1e08746573743338363200961e08746573743338363300971e08746573743338363400981e08746573743338363500" - "991e0874657374333836" - "36009a1e087465737433383637009b1e087465737433383638009c1e087465737433383639009d1e08746573743338" - "3730009e1e0874657374" - "33383731009f1e08746573743338373200a01e08746573743338373300a11e08746573743338373400a21e08746573" - "743338373500a31e0874" - "6573743338373600a41e08746573743338373700a51e08746573743338373800a61e08746573743338373900a71e08" - "746573743338383000a8" - "1e08746573743338383100a91e08746573743338383200aa1e08746573743338383300ab1e08746573743338383400" - "ac1e0874657374333838" - "3500ad1e08746573743338383600ae1e08746573743338383700af1e08746573743338383800b01e08746573743338" - "383900b11e0874657374" - "3338393000b21e08746573743338393100b31e08746573743338393200b41e08746573743338393300b51e08746573" - "743338393400b61e0874" - "6573743338393500b71e08746573743338393600b81e08746573743338393700b91e08746573743338393800ba1e08" - "746573743338393900bb" - "1e08746573743339303000bc1e08746573743339303100bd1e08746573743339303200be1e08746573743339303300" - "bf1e0874657374333930" - "3400c01e08746573743339303500c11e08746573743339303600c21e08746573743339303700c31e08746573743339" - "303800c41e0874657374" - "3339303900c51e08746573743339313000c61e08746573743339313100c71e08746573743339313200c81e08746573" - "743339313300c91e0874" - "6573743339313400ca1e08746573743339313500cb1e08746573743339313600cc1e08746573743339313700cd1e08" - "746573743339313800ce" - "1e08746573743339313900cf1e08746573743339323000d01e08746573743339323100d11e08746573743339323200" - "d21e0874657374333932" - "3300d31e08746573743339323400d41e08746573743339323500d51e08746573743339323600d61e08746573743339" - "323700d71e0874657374" - "3339323800d81e08746573743339323900d91e08746573743339333000da1e08746573743339333100db1e08746573" - "743339333200dc1e0874" - "6573743339333300dd1e08746573743339333400de1e08746573743339333500df1e08746573743339333600e01e08" - "746573743339333700e1" - "1e08746573743339333800e21e08746573743339333900e31e08746573743339343000e41e08746573743339343100" - "e51e0874657374333934" - "3200e61e08746573743339343300e71e08746573743339343400e81e08746573743339343500e91e08746573743339" - "343600ea1e0874657374" - "3339343700eb1e08746573743339343800ec1e08746573743339343900ed1e08746573743339353000ee1e08746573" - "743339353100ef1e0874" - "6573743339353200f01e08746573743339353300f11e08746573743339353400f21e08746573743339353500f31e08" - "746573743339353600f4" - "1e08746573743339353700f51e08746573743339353800f61e08746573743339353900f71e08746573743339363000" - "f81e0874657374333936" - "3100f91e08746573743339363200fa1e08746573743339363300fb1e08746573743339363400fc1e08746573743339" - "363500fd1e0874657374" - "3339363600fe1e08746573743339363700ff1e08746573743339363800801f08746573743339363900811f08746573" - "743339373000821f0874" - "6573743339373100831f08746573743339373200841f08746573743339373300851f08746573743339373400861f08" - "74657374333937350087" - "1f08746573743339373600881f08746573743339373700891f087465737433393738008a1f08746573743339373900" - "8b1f0874657374333938" - "30008c1f087465737433393831008d1f087465737433393832008e1f087465737433393833008f1f08746573743339" - "383400901f0874657374" - "3339383500911f08746573743339383600921f08746573743339383700931f08746573743339383800941f08746573" - "743339383900951f0874" - "6573743339393000961f08746573743339393100971f08746573743339393200981f08746573743339393300991f08" - "7465737433393934009a" - "1f087465737433393935009b1f087465737433393936009c1f087465737433393937009d1f08746573743339393800" - "9e1f0874657374333939" - "39009f1f08746573743430303000a01f08746573743430303100a11f08746573743430303200a21f08746573743430" - "303300a31f0874657374" - "3430303400a41f08746573743430303500a51f08746573743430303600a61f08746573743430303700a71f08746573" - "743430303800a81f0874" - "6573743430303900a91f08746573743430313000aa1f08746573743430313100ab1f08746573743430313200ac1f08" - "746573743430313300ad" - "1f08746573743430313400ae1f08746573743430313500af1f08746573743430313600b01f08746573743430313700" - "b11f0874657374343031" - "3800b21f08746573743430313900b31f08746573743430323000b41f08746573743430323100b51f08746573743430" - "323200b61f0874657374" - "3430323300b71f08746573743430323400b81f08746573743430323500b91f08746573743430323600ba1f08746573" - "743430323700bb1f0874" - "6573743430323800bc1f08746573743430323900bd1f08746573743430333000be1f08746573743430333100bf1f08" - "746573743430333200c0" - "1f08746573743430333300c11f08746573743430333400c21f08746573743430333500c31f08746573743430333600" - "c41f0874657374343033" - "3700c51f08746573743430333800c61f08746573743430333900c71f08746573743430343000c81f08746573743430" - "343100c91f0874657374" - "3430343200ca1f08746573743430343300cb1f08746573743430343400cc1f08746573743430343500cd1f08746573" - "743430343600ce1f0874" - "6573743430343700cf1f08746573743430343800d01f08746573743430343900d11f08746573743430353000d21f08" - "746573743430353100d3" - "1f08746573743430353200d41f08746573743430353300d51f08746573743430353400d61f08746573743430353500" - "d71f0874657374343035" + "743338333700fd1d08746573743338333800fe1d08746573743338333900ff1d08746573743338343000801e087465" + "73743338343100811e08746573743338343200821e08746573743338343300831e08746573743338343400841e0874" + "6573743338343500851e08746573743338343600861e08746573743338343700871e08746573743338343800881e08" + "746573743338343900891e087465737433383530008a1e087465737433383531008b1e087465737433383532008c1e" + "087465737433383533008d1e087465737433383534008e1e087465737433383535008f1e0874657374333835360090" + "1e08746573743338353700911e08746573743338353800921e08746573743338353900931e08746573743338363000" + "941e08746573743338363100951e08746573743338363200961e08746573743338363300971e087465737433383634" + "00981e08746573743338363500991e087465737433383636009a1e087465737433383637009b1e0874657374333836" + "38009c1e087465737433383639009d1e087465737433383730009e1e087465737433383731009f1e08746573743338" + "373200a01e08746573743338373300a11e08746573743338373400a21e08746573743338373500a31e087465737433" + "38373600a41e08746573743338373700a51e08746573743338373800a61e08746573743338373900a71e0874657374" + "3338383000a81e08746573743338383100a91e08746573743338383200aa1e08746573743338383300ab1e08746573" + "743338383400ac1e08746573743338383500ad1e08746573743338383600ae1e08746573743338383700af1e087465" + "73743338383800b01e08746573743338383900b11e08746573743338393000b21e08746573743338393100b31e0874" + "6573743338393200b41e08746573743338393300b51e08746573743338393400b61e08746573743338393500b71e08" + "746573743338393600b81e08746573743338393700b91e08746573743338393800ba1e08746573743338393900bb1e" + "08746573743339303000bc1e08746573743339303100bd1e08746573743339303200be1e08746573743339303300bf" + "1e08746573743339303400c01e08746573743339303500c11e08746573743339303600c21e08746573743339303700" + "c31e08746573743339303800c41e08746573743339303900c51e08746573743339313000c61e087465737433393131" + "00c71e08746573743339313200c81e08746573743339313300c91e08746573743339313400ca1e0874657374333931" + "3500cb1e08746573743339313600cc1e08746573743339313700cd1e08746573743339313800ce1e08746573743339" + "313900cf1e08746573743339323000d01e08746573743339323100d11e08746573743339323200d21e087465737433" + "39323300d31e08746573743339323400d41e08746573743339323500d51e08746573743339323600d61e0874657374" + "3339323700d71e08746573743339323800d81e08746573743339323900d91e08746573743339333000da1e08746573" + "743339333100db1e08746573743339333200dc1e08746573743339333300dd1e08746573743339333400de1e087465" + "73743339333500df1e08746573743339333600e01e08746573743339333700e11e08746573743339333800e21e0874" + "6573743339333900e31e08746573743339343000e41e08746573743339343100e51e08746573743339343200e61e08" + "746573743339343300e71e08746573743339343400e81e08746573743339343500e91e08746573743339343600ea1e" + "08746573743339343700eb1e08746573743339343800ec1e08746573743339343900ed1e08746573743339353000ee" + "1e08746573743339353100ef1e08746573743339353200f01e08746573743339353300f11e08746573743339353400" + "f21e08746573743339353500f31e08746573743339353600f41e08746573743339353700f51e087465737433393538" + "00f61e08746573743339353900f71e08746573743339363000f81e08746573743339363100f91e0874657374333936" + "3200fa1e08746573743339363300fb1e08746573743339363400fc1e08746573743339363500fd1e08746573743339" + "363600fe1e08746573743339363700ff1e08746573743339363800801f08746573743339363900811f087465737433" + "39373000821f08746573743339373100831f08746573743339373200841f08746573743339373300851f0874657374" + "3339373400861f08746573743339373500871f08746573743339373600881f08746573743339373700891f08746573" + "7433393738008a1f087465737433393739008b1f087465737433393830008c1f087465737433393831008d1f087465" + "737433393832008e1f087465737433393833008f1f08746573743339383400901f08746573743339383500911f0874" + "6573743339383600921f08746573743339383700931f08746573743339383800941f08746573743339383900951f08" + "746573743339393000961f08746573743339393100971f08746573743339393200981f08746573743339393300991f" + "087465737433393934009a1f087465737433393935009b1f087465737433393936009c1f087465737433393937009d" + "1f087465737433393938009e1f087465737433393939009f1f08746573743430303000a01f08746573743430303100" + "a11f08746573743430303200a21f08746573743430303300a31f08746573743430303400a41f087465737434303035" + "00a51f08746573743430303600a61f08746573743430303700a71f08746573743430303800a81f0874657374343030" + "3900a91f08746573743430313000aa1f08746573743430313100ab1f08746573743430313200ac1f08746573743430" + "313300ad1f08746573743430313400ae1f08746573743430313500af1f08746573743430313600b01f087465737434" + "30313700b11f08746573743430313800b21f08746573743430313900b31f08746573743430323000b41f0874657374" + "3430323100b51f08746573743430323200b61f08746573743430323300b71f08746573743430323400b81f08746573" + "743430323500b91f08746573743430323600ba1f08746573743430323700bb1f08746573743430323800bc1f087465" + "73743430323900bd1f08746573743430333000be1f08746573743430333100bf1f08746573743430333200c01f0874" + "6573743430333300c11f08746573743430333400c21f08746573743430333500c31f08746573743430333600c41f08" + "746573743430333700c51f08746573743430333800c61f08746573743430333900c71f08746573743430343000c81f" + "08746573743430343100c91f08746573743430343200ca1f08746573743430343300cb1f08746573743430343400cc" + "1f08746573743430343500cd1f08746573743430343600ce1f08746573743430343700cf1f08746573743430343800" + "d01f08746573743430343900d11f08746573743430353000d21f08746573743430353100d31f087465737434303532" + "00d41f08746573743430353300d51f08746573743430353400d61f08746573743430353500d71f0874657374343035" "3600d81f08746573743430353700d91f08746573743430353800da1f08746573743430353900db1f08746573743430" - "363000dc1f0874657374" - "3430363100dd1f08746573743430363200de1f08746573743430363300df1f08746573743430363400e01f08746573" - "743430363500e11f0874" - "6573743430363600e21f08746573743430363700e31f08746573743430363800e41f08746573743430363900e51f08" - "746573743430373000e6" - "1f08746573743430373100e71f08746573743430373200e81f08746573743430373300e91f08746573743430373400" - "ea1f0874657374343037" - "3500eb1f08746573743430373600ec1f08746573743430373700ed1f08746573743430373800ee1f08746573743430" - "373900ef1f0874657374" - "3430383000f01f08746573743430383100f11f08746573743430383200f21f08746573743430383300f31f08746573" - "743430383400f41f0874" - "6573743430383500f51f08746573743430383600f61f08746573743430383700f71f08746573743430383800f81f08" - "746573743430383900f9" - "1f08746573743430393000fa1f08746573743430393100fb1f08746573743430393200fc1f08746573743430393300" - "fd1f0874657374343039" - "3400fe1f08746573743430393500ff1f08746573743430393600802008746573743430393700812008746573743430" - "39380082200874657374" - "3430393900832008746573743431303000842008746573743431303100852008746573743431303200862008746573" - "74343130330087200874" - "65737434313034008820087465737434313035008920087465737434313036008a20087465737434313037008b2008" - "7465737434313038008c" - "20087465737434313039008d20087465737434313130008e20087465737434313131008f2008746573743431313200" - "90200874657374343131" - "3300912008746573743431313400922008746573743431313500932008746573743431313600942008746573743431" - "31370095200874657374" - "3431313800962008746573743431313900972008746573743431323000982008746573743431323100992008746573" - "7434313232009a200874" - "65737434313233009b20087465737434313234009c20087465737434313235009d20087465737434313236009e2008" - "7465737434313237009f" - "2008746573743431323800a02008746573743431323900a12008746573743431333000a22008746573743431333100" - "a3200874657374343133" - "3200a42008746573743431333300a52008746573743431333400a62008746573743431333500a72008746573743431" - "333600a8200874657374" - "3431333700a92008746573743431333800aa2008746573743431333900ab2008746573743431343000ac2008746573" - "743431343100ad200874" - "6573743431343200ae2008746573743431343300af2008746573743431343400b02008746573743431343500b12008" - "746573743431343600b2" - "2008746573743431343700b32008746573743431343800b42008746573743431343900b52008746573743431353000" - "b6200874657374343135" - "3100b72008746573743431353200b82008746573743431353300b92008746573743431353400ba2008746573743431" - "353500bb200874657374" - "3431353600bc2008746573743431353700bd2008746573743431353800be2008746573743431353900bf2008746573" - "743431363000c0200874" - "6573743431363100c12008746573743431363200c22008746573743431363300c32008746573743431363400c42008" - "746573743431363500c5" - "2008746573743431363600c62008746573743431363700c72008746573743431363800c82008746573743431363900" - "c9200874657374343137" - "3000ca2008746573743431373100cb2008746573743431373200cc2008746573743431373300cd2008746573743431" - "373400ce200874657374" - "3431373500cf2008746573743431373600d02008746573743431373700d12008746573743431373800d22008746573" - "743431373900d3200874" - "6573743431383000d42008746573743431383100d52008746573743431383200d62008746573743431383300d72008" - "746573743431383400d8" - "2008746573743431383500d92008746573743431383600da2008746573743431383700db2008746573743431383800" - "dc200874657374343138" - "3900dd2008746573743431393000de2008746573743431393100df2008746573743431393200e02008746573743431" - "393300e1200874657374" - "3431393400e22008746573743431393500e32008746573743431393600e42008746573743431393700e52008746573" - "743431393800e6200874" - "6573743431393900e72008746573743432303000e82008746573743432303100e92008746573743432303200ea2008" - "746573743432303300eb" - "2008746573743432303400ec2008746573743432303500ed2008746573743432303600ee2008746573743432303700" - "ef200874657374343230" - "3800f02008746573743432303900f12008746573743432313000f22008746573743432313100f32008746573743432" - "313200f4200874657374" - "3432313300f52008746573743432313400f62008746573743432313500f72008746573743432313600f82008746573" - "743432313700f9200874" - "6573743432313800fa2008746573743432313900fb2008746573743432323000fc2008746573743432323100fd2008" - "746573743432323200fe" - "2008746573743432323300ff2008746573743432323400802108746573743432323500812108746573743432323600" - "82210874657374343232" - "3700832108746573743432323800842108746573743432323900852108746573743432333000862108746573743432" - "33310087210874657374" - "34323332008821087465737434323333008921087465737434323334008a21087465737434323335008b2108746573" - "7434323336008c210874" - "65737434323337008d21087465737434323338008e21087465737434323339008f2108746573743432343000902108" - "74657374343234310091" - "2108746573743432343200922108746573743432343300932108746573743432343400942108746573743432343500" - "95210874657374343234" - "3600962108746573743432343700972108746573743432343800982108746573743432343900992108746573743432" - "3530009a210874657374" - "34323531009b21087465737434323532009c21087465737434323533009d21087465737434323534009e2108746573" - "7434323535009f210874" - "6573743432353600a02108746573743432353700a12108746573743432353800a22108746573743432353900a32108" - "746573743432363000a4" - "2108746573743432363100a52108746573743432363200a62108746573743432363300a72108746573743432363400" - "a8210874657374343236" - "3500a92108746573743432363600aa2108746573743432363700ab2108746573743432363800ac2108746573743432" - "363900ad210874657374" - "3432373000ae2108746573743432373100af2108746573743432373200b02108746573743432373300b12108746573" - "743432373400b2210874" - "6573743432373500b32108746573743432373600b42108746573743432373700b52108746573743432373800b62108" - "746573743432373900b7" + "363000dc1f08746573743430363100dd1f08746573743430363200de1f08746573743430363300df1f087465737434" + "30363400e01f08746573743430363500e11f08746573743430363600e21f08746573743430363700e31f0874657374" + "3430363800e41f08746573743430363900e51f08746573743430373000e61f08746573743430373100e71f08746573" + "743430373200e81f08746573743430373300e91f08746573743430373400ea1f08746573743430373500eb1f087465" + "73743430373600ec1f08746573743430373700ed1f08746573743430373800ee1f08746573743430373900ef1f0874" + "6573743430383000f01f08746573743430383100f11f08746573743430383200f21f08746573743430383300f31f08" + "746573743430383400f41f08746573743430383500f51f08746573743430383600f61f08746573743430383700f71f" + "08746573743430383800f81f08746573743430383900f91f08746573743430393000fa1f08746573743430393100fb" + "1f08746573743430393200fc1f08746573743430393300fd1f08746573743430393400fe1f08746573743430393500" + "ff1f087465737434303936008020087465737434303937008120087465737434303938008220087465737434303939" + "0083200874657374343130300084200874657374343130310085200874657374343130320086200874657374343130" + "33008720087465737434313034008820087465737434313035008920087465737434313036008a2008746573743431" + "3037008b20087465737434313038008c20087465737434313039008d20087465737434313130008e20087465737434" + "313131008f200874657374343131320090200874657374343131330091200874657374343131340092200874657374" + "3431313500932008746573743431313600942008746573743431313700952008746573743431313800962008746573" + "7434313139009720087465737434313230009820087465737434313231009920087465737434313232009a20087465" + "737434313233009b20087465737434313234009c20087465737434313235009d20087465737434313236009e200874" + "65737434313237009f2008746573743431323800a02008746573743431323900a12008746573743431333000a22008" + "746573743431333100a32008746573743431333200a42008746573743431333300a52008746573743431333400a620" + "08746573743431333500a72008746573743431333600a82008746573743431333700a92008746573743431333800aa" + "2008746573743431333900ab2008746573743431343000ac2008746573743431343100ad2008746573743431343200" + "ae2008746573743431343300af2008746573743431343400b02008746573743431343500b120087465737434313436" + "00b22008746573743431343700b32008746573743431343800b42008746573743431343900b5200874657374343135" + "3000b62008746573743431353100b72008746573743431353200b82008746573743431353300b92008746573743431" + "353400ba2008746573743431353500bb2008746573743431353600bc2008746573743431353700bd20087465737434" + "31353800be2008746573743431353900bf2008746573743431363000c02008746573743431363100c1200874657374" + "3431363200c22008746573743431363300c32008746573743431363400c42008746573743431363500c52008746573" + "743431363600c62008746573743431363700c72008746573743431363800c82008746573743431363900c920087465" + "73743431373000ca2008746573743431373100cb2008746573743431373200cc2008746573743431373300cd200874" + "6573743431373400ce2008746573743431373500cf2008746573743431373600d02008746573743431373700d12008" + "746573743431373800d22008746573743431373900d32008746573743431383000d42008746573743431383100d520" + "08746573743431383200d62008746573743431383300d72008746573743431383400d82008746573743431383500d9" + "2008746573743431383600da2008746573743431383700db2008746573743431383800dc2008746573743431383900" + "dd2008746573743431393000de2008746573743431393100df2008746573743431393200e020087465737434313933" + "00e12008746573743431393400e22008746573743431393500e32008746573743431393600e4200874657374343139" + "3700e52008746573743431393800e62008746573743431393900e72008746573743432303000e82008746573743432" + "303100e92008746573743432303200ea2008746573743432303300eb2008746573743432303400ec20087465737434" + "32303500ed2008746573743432303600ee2008746573743432303700ef2008746573743432303800f0200874657374" + "3432303900f12008746573743432313000f22008746573743432313100f32008746573743432313200f42008746573" + "743432313300f52008746573743432313400f62008746573743432313500f72008746573743432313600f820087465" + "73743432313700f92008746573743432313800fa2008746573743432313900fb2008746573743432323000fc200874" + "6573743432323100fd2008746573743432323200fe2008746573743432323300ff2008746573743432323400802108" + "7465737434323235008121087465737434323236008221087465737434323237008321087465737434323238008421" + "0874657374343232390085210874657374343233300086210874657374343233310087210874657374343233320088" + "21087465737434323333008921087465737434323334008a21087465737434323335008b2108746573743432333600" + "8c21087465737434323337008d21087465737434323338008e21087465737434323339008f21087465737434323430" + "0090210874657374343234310091210874657374343234320092210874657374343234330093210874657374343234" + "3400942108746573743432343500952108746573743432343600962108746573743432343700972108746573743432" + "3438009821087465737434323439009921087465737434323530009a21087465737434323531009b21087465737434" + "323532009c21087465737434323533009d21087465737434323534009e21087465737434323535009f210874657374" + "3432353600a02108746573743432353700a12108746573743432353800a22108746573743432353900a32108746573" + "743432363000a42108746573743432363100a52108746573743432363200a62108746573743432363300a721087465" + "73743432363400a82108746573743432363500a92108746573743432363600aa2108746573743432363700ab210874" + "6573743432363800ac2108746573743432363900ad2108746573743432373000ae2108746573743432373100af2108" + "746573743432373200b02108746573743432373300b12108746573743432373400b22108746573743432373500b321" + "08746573743432373600b42108746573743432373700b52108746573743432373800b62108746573743432373900b7" "2108746573743432383000b82108746573743432383100b92108746573743432383200ba2108746573743432383300" - "bb210874657374343238" - "3400bc2108746573743432383500bd2108746573743432383600be2108746573743432383700bf2108746573743432" - "383800c0210874657374" - "3432383900c12108746573743432393000c22108746573743432393100c32108746573743432393200c42108746573" - "743432393300c5210874" - "6573743432393400c62108746573743432393500c72108746573743432393600c82108746573743432393700c92108" - "746573743432393800ca" - "2108746573743432393900cb2108746573743433303000cc2108746573743433303100cd2108746573743433303200" - "ce210874657374343330" - "3300cf2108746573743433303400d02108746573743433303500d12108746573743433303600d22108746573743433" - "303700d3210874657374" - "3433303800d42108746573743433303900d52108746573743433313000d62108746573743433313100d72108746573" - "743433313200d8210874" - "6573743433313300d92108746573743433313400da2108746573743433313500db2108746573743433313600dc2108" - "746573743433313700dd" - "2108746573743433313800de2108746573743433313900df2108746573743433323000e02108746573743433323100" - "e1210874657374343332" - "3200e22108746573743433323300e32108746573743433323400e42108746573743433323500e52108746573743433" - "323600e6210874657374" - "3433323700e72108746573743433323800e82108746573743433323900e92108746573743433333000ea2108746573" - "743433333100eb210874" - "6573743433333200ec2108746573743433333300ed2108746573743433333400ee2108746573743433333500ef2108" - "746573743433333600f0" - "2108746573743433333700f12108746573743433333800f22108746573743433333900f32108746573743433343000" - "f4210874657374343334" - "3100f52108746573743433343200f62108746573743433343300f72108746573743433343400f82108746573743433" - "343500f9210874657374" - "3433343600fa2108746573743433343700fb2108746573743433343800fc2108746573743433343900fd2108746573" - "743433353000fe210874" - "6573743433353100ff2108746573743433353200802208746573743433353300812208746573743433353400822208" - "74657374343335350083" - "2208746573743433353600842208746573743433353700852208746573743433353800862208746573743433353900" - "87220874657374343336" - "30008822087465737434333631008922087465737434333632008a22087465737434333633008b2208746573743433" - "3634008c220874657374" - "34333635008d22087465737434333636008e22087465737434333637008f2208746573743433363800902208746573" - "74343336390091220874" - "6573743433373000922208746573743433373100932208746573743433373200942208746573743433373300952208" - "74657374343337340096" - "2208746573743433373500972208746573743433373600982208746573743433373700992208746573743433373800" - "9a220874657374343337" - "39009b22087465737434333830009c22087465737434333831009d22087465737434333832009e2208746573743433" - "3833009f220874657374" - "3433383400a02208746573743433383500a12208746573743433383600a22208746573743433383700a32208746573" - "743433383800a4220874" - "6573743433383900a52208746573743433393000a62208746573743433393100a72208746573743433393200a82208" - "746573743433393300a9" - "2208746573743433393400aa2208746573743433393500ab2208746573743433393600ac2208746573743433393700" - "ad220874657374343339" - "3800ae2208746573743433393900af2208746573743434303000b02208746573743434303100b12208746573743434" - "303200b2220874657374" - "3434303300b32208746573743434303400b42208746573743434303500b52208746573743434303600b62208746573" - "743434303700b7220874" - "6573743434303800b82208746573743434303900b92208746573743434313000ba2208746573743434313100bb2208" - "746573743434313200bc" - "2208746573743434313300bd2208746573743434313400be2208746573743434313500bf2208746573743434313600" - "c0220874657374343431" - "3700c12208746573743434313800c22208746573743434313900c32208746573743434323000c42208746573743434" - "323100c5220874657374" - "3434323200c62208746573743434323300c72208746573743434323400c82208746573743434323500c92208746573" - "743434323600ca220874" - "6573743434323700cb2208746573743434323800cc2208746573743434323900cd2208746573743434333000ce2208" - "746573743434333100cf" - "2208746573743434333200d02208746573743434333300d12208746573743434333400d22208746573743434333500" - "d3220874657374343433" - "3600d42208746573743434333700d52208746573743434333800d62208746573743434333900d72208746573743434" - "343000d8220874657374" - "3434343100d92208746573743434343200da2208746573743434343300db2208746573743434343400dc2208746573" - "743434343500dd220874" - "6573743434343600de2208746573743434343700df2208746573743434343800e02208746573743434343900e12208" - "746573743434353000e2" - "2208746573743434353100e32208746573743434353200e42208746573743434353300e52208746573743434353400" - "e6220874657374343435" - "3500e72208746573743434353600e82208746573743434353700e92208746573743434353800ea2208746573743434" - "353900eb220874657374" - "3434363000ec2208746573743434363100ed2208746573743434363200ee2208746573743434363300ef2208746573" - "743434363400f0220874" - "6573743434363500f12208746573743434363600f22208746573743434363700f32208746573743434363800f42208" - "746573743434363900f5" - "2208746573743434373000f62208746573743434373100f72208746573743434373200f82208746573743434373300" - "f9220874657374343437" - "3400fa2208746573743434373500fb2208746573743434373600fc2208746573743434373700fd2208746573743434" - "373800fe220874657374" - "3434373900ff2208746573743434383000802308746573743434383100812308746573743434383200822308746573" - "74343438330083230874" - "6573743434383400842308746573743434383500852308746573743434383600862308746573743434383700872308" - "74657374343438380088" - "23087465737434343839008923087465737434343930008a23087465737434343931008b2308746573743434393200" - "8c230874657374343439" - "33008d23087465737434343934008e23087465737434343935008f2308746573743434393600902308746573743434" - "39370091230874657374" - "3434393800922308746573743434393900932308746573743435303000942308746573743435303100952308746573" - "74343530320096230874" + "bb2108746573743432383400bc2108746573743432383500bd2108746573743432383600be21087465737434323837" + "00bf2108746573743432383800c02108746573743432383900c12108746573743432393000c2210874657374343239" + "3100c32108746573743432393200c42108746573743432393300c52108746573743432393400c62108746573743432" + "393500c72108746573743432393600c82108746573743432393700c92108746573743432393800ca21087465737434" + "32393900cb2108746573743433303000cc2108746573743433303100cd2108746573743433303200ce210874657374" + "3433303300cf2108746573743433303400d02108746573743433303500d12108746573743433303600d22108746573" + "743433303700d32108746573743433303800d42108746573743433303900d52108746573743433313000d621087465" + "73743433313100d72108746573743433313200d82108746573743433313300d92108746573743433313400da210874" + "6573743433313500db2108746573743433313600dc2108746573743433313700dd2108746573743433313800de2108" + "746573743433313900df2108746573743433323000e02108746573743433323100e12108746573743433323200e221" + "08746573743433323300e32108746573743433323400e42108746573743433323500e52108746573743433323600e6" + "2108746573743433323700e72108746573743433323800e82108746573743433323900e92108746573743433333000" + "ea2108746573743433333100eb2108746573743433333200ec2108746573743433333300ed21087465737434333334" + "00ee2108746573743433333500ef2108746573743433333600f02108746573743433333700f1210874657374343333" + "3800f22108746573743433333900f32108746573743433343000f42108746573743433343100f52108746573743433" + "343200f62108746573743433343300f72108746573743433343400f82108746573743433343500f921087465737434" + "33343600fa2108746573743433343700fb2108746573743433343800fc2108746573743433343900fd210874657374" + "3433353000fe2108746573743433353100ff2108746573743433353200802208746573743433353300812208746573" + "7434333534008222087465737434333535008322087465737434333536008422087465737434333537008522087465" + "7374343335380086220874657374343335390087220874657374343336300088220874657374343336310089220874" + "65737434333632008a22087465737434333633008b22087465737434333634008c22087465737434333635008d2208" + "7465737434333636008e22087465737434333637008f22087465737434333638009022087465737434333639009122" + "0874657374343337300092220874657374343337310093220874657374343337320094220874657374343337330095" + "2208746573743433373400962208746573743433373500972208746573743433373600982208746573743433373700" + "9922087465737434333738009a22087465737434333739009b22087465737434333830009c22087465737434333831" + "009d22087465737434333832009e22087465737434333833009f2208746573743433383400a0220874657374343338" + "3500a12208746573743433383600a22208746573743433383700a32208746573743433383800a42208746573743433" + "383900a52208746573743433393000a62208746573743433393100a72208746573743433393200a822087465737434" + "33393300a92208746573743433393400aa2208746573743433393500ab2208746573743433393600ac220874657374" + "3433393700ad2208746573743433393800ae2208746573743433393900af2208746573743434303000b02208746573" + "743434303100b12208746573743434303200b22208746573743434303300b32208746573743434303400b422087465" + "73743434303500b52208746573743434303600b62208746573743434303700b72208746573743434303800b8220874" + "6573743434303900b92208746573743434313000ba2208746573743434313100bb2208746573743434313200bc2208" + "746573743434313300bd2208746573743434313400be2208746573743434313500bf2208746573743434313600c022" + "08746573743434313700c12208746573743434313800c22208746573743434313900c32208746573743434323000c4" + "2208746573743434323100c52208746573743434323200c62208746573743434323300c72208746573743434323400" + "c82208746573743434323500c92208746573743434323600ca2208746573743434323700cb22087465737434343238" + "00cc2208746573743434323900cd2208746573743434333000ce2208746573743434333100cf220874657374343433" + "3200d02208746573743434333300d12208746573743434333400d22208746573743434333500d32208746573743434" + "333600d42208746573743434333700d52208746573743434333800d62208746573743434333900d722087465737434" + "34343000d82208746573743434343100d92208746573743434343200da2208746573743434343300db220874657374" + "3434343400dc2208746573743434343500dd2208746573743434343600de2208746573743434343700df2208746573" + "743434343800e02208746573743434343900e12208746573743434353000e22208746573743434353100e322087465" + "73743434353200e42208746573743434353300e52208746573743434353400e62208746573743434353500e7220874" + "6573743434353600e82208746573743434353700e92208746573743434353800ea2208746573743434353900eb2208" + "746573743434363000ec2208746573743434363100ed2208746573743434363200ee2208746573743434363300ef22" + "08746573743434363400f02208746573743434363500f12208746573743434363600f22208746573743434363700f3" + "2208746573743434363800f42208746573743434363900f52208746573743434373000f62208746573743434373100" + "f72208746573743434373200f82208746573743434373300f92208746573743434373400fa22087465737434343735" + "00fb2208746573743434373600fc2208746573743434373700fd2208746573743434373800fe220874657374343437" + "3900ff2208746573743434383000802308746573743434383100812308746573743434383200822308746573743434" + "3833008323087465737434343834008423087465737434343835008523087465737434343836008623087465737434" + "343837008723087465737434343838008823087465737434343839008923087465737434343930008a230874657374" + "34343931008b23087465737434343932008c23087465737434343933008d23087465737434343934008e2308746573" + "7434343935008f23087465737434343936009023087465737434343937009123087465737434343938009223087465" + "7374343439390093230874657374343530300094230874657374343530310095230874657374343530320096230874" "65737434353033009723087465737434353034009823087465737434353035009923087465737434353036009a2308" - "7465737434353037009b" - "23087465737434353038009c23087465737434353039009d23087465737434353130009e2308746573743435313100" - "9f230874657374343531" - "3200a02308746573743435313300a12308746573743435313400a22308746573743435313500a32308746573743435" - "313600a4230874657374" - "3435313700a52308746573743435313800a62308746573743435313900a72308746573743435323000a82308746573" - "743435323100a9230874" - "6573743435323200aa2308746573743435323300ab2308746573743435323400ac2308746573743435323500ad2308" - "746573743435323600ae" - "2308746573743435323700af2308746573743435323800b02308746573743435323900b12308746573743435333000" - "b2230874657374343533" - "3100b32308746573743435333200b42308746573743435333300b52308746573743435333400b62308746573743435" - "333500b7230874657374" - "3435333600b82308746573743435333700b92308746573743435333800ba2308746573743435333900bb2308746573" - "743435343000bc230874" - "6573743435343100bd2308746573743435343200be2308746573743435343300bf2308746573743435343400c02308" - "746573743435343500c1" - "2308746573743435343600c22308746573743435343700c32308746573743435343800c42308746573743435343900" - "c5230874657374343535" - "3000c62308746573743435353100c72308746573743435353200c82308746573743435353300c92308746573743435" - "353400ca230874657374" - "3435353500cb2308746573743435353600cc2308746573743435353700cd2308746573743435353800ce2308746573" - "743435353900cf230874" - "6573743435363000d02308746573743435363100d12308746573743435363200d22308746573743435363300d32308" - "746573743435363400d4" - "2308746573743435363500d52308746573743435363600d62308746573743435363700d72308746573743435363800" - "d8230874657374343536" - "3900d92308746573743435373000da2308746573743435373100db2308746573743435373200dc2308746573743435" - "373300dd230874657374" - "3435373400de2308746573743435373500df2308746573743435373600e02308746573743435373700e12308746573" - "743435373800e2230874" - "6573743435373900e32308746573743435383000e42308746573743435383100e52308746573743435383200e62308" - "746573743435383300e7" - "2308746573743435383400e82308746573743435383500e92308746573743435383600ea2308746573743435383700" - "eb230874657374343538" - "3800ec2308746573743435383900ed2308746573743435393000ee2308746573743435393100ef2308746573743435" - "393200f0230874657374" - "3435393300f12308746573743435393400f22308746573743435393500f32308746573743435393600f42308746573" - "743435393700f5230874" - "6573743435393800f62308746573743435393900f72308746573743436303000f82308746573743436303100f92308" - "746573743436303200fa" - "2308746573743436303300fb2308746573743436303400fc2308746573743436303500fd2308746573743436303600" - "fe230874657374343630" - "3700ff2308746573743436303800802408746573743436303900812408746573743436313000822408746573743436" - "31310083240874657374" - "3436313200842408746573743436313300852408746573743436313400862408746573743436313500872408746573" - "74343631360088240874" - "65737434363137008924087465737434363138008a24087465737434363139008b24087465737434363230008c2408" - "7465737434363231008d" - "24087465737434363232008e24087465737434363233008f2408746573743436323400902408746573743436323500" - "91240874657374343632" - "3600922408746573743436323700932408746573743436323800942408746573743436323900952408746573743436" - "33300096240874657374" - "34363331009724087465737434363332009824087465737434363333009924087465737434363334009a2408746573" - "7434363335009b240874" - "65737434363336009c24087465737434363337009d24087465737434363338009e24087465737434363339009f2408" - "746573743436343000a0" - "2408746573743436343100a12408746573743436343200a22408746573743436343300a32408746573743436343400" - "a4240874657374343634" - "3500a52408746573743436343600a62408746573743436343700a72408746573743436343800a82408746573743436" - "343900a9240874657374" - "3436353000aa2408746573743436353100ab2408746573743436353200ac2408746573743436353300ad2408746573" - "743436353400ae240874" - "6573743436353500af2408746573743436353600b02408746573743436353700b12408746573743436353800b22408" - "746573743436353900b3" - "2408746573743436363000b42408746573743436363100b52408746573743436363200b62408746573743436363300" - "b7240874657374343636" - "3400b82408746573743436363500b92408746573743436363600ba2408746573743436363700bb2408746573743436" - "363800bc240874657374" - "3436363900bd2408746573743436373000be2408746573743436373100bf2408746573743436373200c02408746573" - "743436373300c1240874" - "6573743436373400c22408746573743436373500c32408746573743436373600c42408746573743436373700c52408" - "746573743436373800c6" - "2408746573743436373900c72408746573743436383000c82408746573743436383100c92408746573743436383200" - "ca240874657374343638" - "3300cb2408746573743436383400cc2408746573743436383500cd2408746573743436383600ce2408746573743436" - "383700cf240874657374" - "3436383800d02408746573743436383900d12408746573743436393000d22408746573743436393100d32408746573" - "743436393200d4240874" - "6573743436393300d52408746573743436393400d62408746573743436393500d72408746573743436393600d82408" - "746573743436393700d9" - "2408746573743436393800da2408746573743436393900db2408746573743437303000dc2408746573743437303100" - "dd240874657374343730" - "3200de2408746573743437303300df2408746573743437303400e02408746573743437303500e12408746573743437" - "303600e2240874657374" - "3437303700e32408746573743437303800e42408746573743437303900e52408746573743437313000e62408746573" - "743437313100e7240874" - "6573743437313200e82408746573743437313300e92408746573743437313400ea2408746573743437313500eb2408" - "746573743437313600ec" - "2408746573743437313700ed2408746573743437313800ee2408746573743437313900ef2408746573743437323000" - "f0240874657374343732" - "3100f12408746573743437323200f22408746573743437323300f32408746573743437323400f42408746573743437" - "323500f5240874657374" + "7465737434353037009b23087465737434353038009c23087465737434353039009d23087465737434353130009e23" + "087465737434353131009f2308746573743435313200a02308746573743435313300a12308746573743435313400a2" + "2308746573743435313500a32308746573743435313600a42308746573743435313700a52308746573743435313800" + "a62308746573743435313900a72308746573743435323000a82308746573743435323100a923087465737434353232" + "00aa2308746573743435323300ab2308746573743435323400ac2308746573743435323500ad230874657374343532" + "3600ae2308746573743435323700af2308746573743435323800b02308746573743435323900b12308746573743435" + "333000b22308746573743435333100b32308746573743435333200b42308746573743435333300b523087465737434" + "35333400b62308746573743435333500b72308746573743435333600b82308746573743435333700b9230874657374" + "3435333800ba2308746573743435333900bb2308746573743435343000bc2308746573743435343100bd2308746573" + "743435343200be2308746573743435343300bf2308746573743435343400c02308746573743435343500c123087465" + "73743435343600c22308746573743435343700c32308746573743435343800c42308746573743435343900c5230874" + "6573743435353000c62308746573743435353100c72308746573743435353200c82308746573743435353300c92308" + "746573743435353400ca2308746573743435353500cb2308746573743435353600cc2308746573743435353700cd23" + "08746573743435353800ce2308746573743435353900cf2308746573743435363000d02308746573743435363100d1" + "2308746573743435363200d22308746573743435363300d32308746573743435363400d42308746573743435363500" + "d52308746573743435363600d62308746573743435363700d72308746573743435363800d823087465737434353639" + "00d92308746573743435373000da2308746573743435373100db2308746573743435373200dc230874657374343537" + "3300dd2308746573743435373400de2308746573743435373500df2308746573743435373600e02308746573743435" + "373700e12308746573743435373800e22308746573743435373900e32308746573743435383000e423087465737434" + "35383100e52308746573743435383200e62308746573743435383300e72308746573743435383400e8230874657374" + "3435383500e92308746573743435383600ea2308746573743435383700eb2308746573743435383800ec2308746573" + "743435383900ed2308746573743435393000ee2308746573743435393100ef2308746573743435393200f023087465" + "73743435393300f12308746573743435393400f22308746573743435393500f32308746573743435393600f4230874" + "6573743435393700f52308746573743435393800f62308746573743435393900f72308746573743436303000f82308" + "746573743436303100f92308746573743436303200fa2308746573743436303300fb2308746573743436303400fc23" + "08746573743436303500fd2308746573743436303600fe2308746573743436303700ff230874657374343630380080" + "2408746573743436303900812408746573743436313000822408746573743436313100832408746573743436313200" + "8424087465737434363133008524087465737434363134008624087465737434363135008724087465737434363136" + "008824087465737434363137008924087465737434363138008a24087465737434363139008b240874657374343632" + "30008c24087465737434363231008d24087465737434363232008e24087465737434363233008f2408746573743436" + "3234009024087465737434363235009124087465737434363236009224087465737434363237009324087465737434" + "3632380094240874657374343632390095240874657374343633300096240874657374343633310097240874657374" + "34363332009824087465737434363333009924087465737434363334009a24087465737434363335009b2408746573" + "7434363336009c24087465737434363337009d24087465737434363338009e24087465737434363339009f24087465" + "73743436343000a02408746573743436343100a12408746573743436343200a22408746573743436343300a3240874" + "6573743436343400a42408746573743436343500a52408746573743436343600a62408746573743436343700a72408" + "746573743436343800a82408746573743436343900a92408746573743436353000aa2408746573743436353100ab24" + "08746573743436353200ac2408746573743436353300ad2408746573743436353400ae2408746573743436353500af" + "2408746573743436353600b02408746573743436353700b12408746573743436353800b22408746573743436353900" + "b32408746573743436363000b42408746573743436363100b52408746573743436363200b624087465737434363633" + "00b72408746573743436363400b82408746573743436363500b92408746573743436363600ba240874657374343636" + "3700bb2408746573743436363800bc2408746573743436363900bd2408746573743436373000be2408746573743436" + "373100bf2408746573743436373200c02408746573743436373300c12408746573743436373400c224087465737434" + "36373500c32408746573743436373600c42408746573743436373700c52408746573743436373800c6240874657374" + "3436373900c72408746573743436383000c82408746573743436383100c92408746573743436383200ca2408746573" + "743436383300cb2408746573743436383400cc2408746573743436383500cd2408746573743436383600ce24087465" + "73743436383700cf2408746573743436383800d02408746573743436383900d12408746573743436393000d2240874" + "6573743436393100d32408746573743436393200d42408746573743436393300d52408746573743436393400d62408" + "746573743436393500d72408746573743436393600d82408746573743436393700d92408746573743436393800da24" + "08746573743436393900db2408746573743437303000dc2408746573743437303100dd2408746573743437303200de" + "2408746573743437303300df2408746573743437303400e02408746573743437303500e12408746573743437303600" + "e22408746573743437303700e32408746573743437303800e42408746573743437303900e524087465737434373130" + "00e62408746573743437313100e72408746573743437313200e82408746573743437313300e9240874657374343731" + "3400ea2408746573743437313500eb2408746573743437313600ec2408746573743437313700ed2408746573743437" + "313800ee2408746573743437313900ef2408746573743437323000f02408746573743437323100f124087465737434" + "37323200f22408746573743437323300f32408746573743437323400f42408746573743437323500f5240874657374" "3437323600f62408746573743437323700f72408746573743437323800f82408746573743437323900f92408746573" - "743437333000fa240874" - "6573743437333100fb2408746573743437333200fc2408746573743437333300fd2408746573743437333400fe2408" - "746573743437333500ff" - "2408746573743437333600802508746573743437333700812508746573743437333800822508746573743437333900" - "83250874657374343734" - "3000842508746573743437343100852508746573743437343200862508746573743437343300872508746573743437" - "34340088250874657374" - "34373435008925087465737434373436008a25087465737434373437008b25087465737434373438008c2508746573" - "7434373439008d250874" - "65737434373530008e25087465737434373531008f2508746573743437353200902508746573743437353300912508" - "74657374343735340092" - "2508746573743437353500932508746573743437353600942508746573743437353700952508746573743437353800" - "96250874657374343735" - "39009725087465737434373630009825087465737434373631009925087465737434373632009a2508746573743437" - "3633009b250874657374" - "34373634009c25087465737434373635009d25087465737434373636009e25087465737434373637009f2508746573" - "743437363800a0250874" - "6573743437363900a12508746573743437373000a22508746573743437373100a32508746573743437373200a42508" - "746573743437373300a5" - "2508746573743437373400a62508746573743437373500a72508746573743437373600a82508746573743437373700" - "a9250874657374343737" - "3800aa2508746573743437373900ab2508746573743437383000ac2508746573743437383100ad2508746573743437" - "383200ae250874657374" - "3437383300af2508746573743437383400b02508746573743437383500b12508746573743437383600b22508746573" - "743437383700b3250874" - "6573743437383800b42508746573743437383900b52508746573743437393000b62508746573743437393100b72508" - "746573743437393200b8" - "2508746573743437393300b92508746573743437393400ba2508746573743437393500bb2508746573743437393600" - "bc250874657374343739" - "3700bd2508746573743437393800be2508746573743437393900bf2508746573743438303000c02508746573743438" - "303100c1250874657374" - "3438303200c22508746573743438303300c32508746573743438303400c42508746573743438303500c52508746573" - "743438303600c6250874" - "6573743438303700c72508746573743438303800c82508746573743438303900c92508746573743438313000ca2508" - "746573743438313100cb" - "2508746573743438313200cc2508746573743438313300cd2508746573743438313400ce2508746573743438313500" - "cf250874657374343831" - "3600d02508746573743438313700d12508746573743438313800d22508746573743438313900d32508746573743438" - "323000d4250874657374" - "3438323100d52508746573743438323200d62508746573743438323300d72508746573743438323400d82508746573" - "743438323500d9250874" - "6573743438323600da2508746573743438323700db2508746573743438323800dc2508746573743438323900dd2508" - "746573743438333000de" - "2508746573743438333100df2508746573743438333200e02508746573743438333300e12508746573743438333400" - "e2250874657374343833" - "3500e32508746573743438333600e42508746573743438333700e52508746573743438333800e62508746573743438" - "333900e7250874657374" - "3438343000e82508746573743438343100e92508746573743438343200ea2508746573743438343300eb2508746573" - "743438343400ec250874" - "6573743438343500ed2508746573743438343600ee2508746573743438343700ef2508746573743438343800f02508" - "746573743438343900f1" - "2508746573743438353000f22508746573743438353100f32508746573743438353200f42508746573743438353300" - "f5250874657374343835" - "3400f62508746573743438353500f72508746573743438353600f82508746573743438353700f92508746573743438" - "353800fa250874657374" - "3438353900fb2508746573743438363000fc2508746573743438363100fd2508746573743438363200fe2508746573" - "743438363300ff250874" - "6573743438363400802608746573743438363500812608746573743438363600822608746573743438363700832608" - "74657374343836380084" - "2608746573743438363900852608746573743438373000862608746573743438373100872608746573743438373200" - "88260874657374343837" - "33008926087465737434383734008a26087465737434383735008b26087465737434383736008c2608746573743438" - "3737008d260874657374" - "34383738008e26087465737434383739008f2608746573743438383000902608746573743438383100912608746573" - "74343838320092260874" - "6573743438383300932608746573743438383400942608746573743438383500952608746573743438383600962608" - "74657374343838370097" - "26087465737434383838009826087465737434383839009926087465737434383930009a2608746573743438393100" - "9b260874657374343839" - "32009c26087465737434383933009d26087465737434383934009e26087465737434383935009f2608746573743438" - "393600a0260874657374" - "3438393700a12608746573743438393800a22608746573743438393900a32608746573743439303000a42608746573" - "743439303100a5260874" - "6573743439303200a62608746573743439303300a72608746573743439303400a82608746573743439303500a92608" - "746573743439303600aa" - "2608746573743439303700ab2608746573743439303800ac2608746573743439303900ad2608746573743439313000" - "ae260874657374343931" - "3100af2608746573743439313200b02608746573743439313300b12608746573743439313400b22608746573743439" - "313500b3260874657374" - "3439313600b42608746573743439313700b52608746573743439313800b62608746573743439313900b72608746573" - "743439323000b8260874" - "6573743439323100b92608746573743439323200ba2608746573743439323300bb2608746573743439323400bc2608" - "746573743439323500bd" - "2608746573743439323600be2608746573743439323700bf2608746573743439323800c02608746573743439323900" - "c1260874657374343933" - "3000c22608746573743439333100c32608746573743439333200c42608746573743439333300c52608746573743439" - "333400c6260874657374" - "3439333500c72608746573743439333600c82608746573743439333700c92608746573743439333800ca2608746573" - "743439333900cb260874" - "6573743439343000cc2608746573743439343100cd2608746573743439343200ce2608746573743439343300cf2608" - "746573743439343400d0" - "2608746573743439343500d12608746573743439343600d22608746573743439343700d32608746573743439343800" - "d4260874657374343934" + "743437333000fa2408746573743437333100fb2408746573743437333200fc2408746573743437333300fd24087465" + "73743437333400fe2408746573743437333500ff240874657374343733360080250874657374343733370081250874" + "6573743437333800822508746573743437333900832508746573743437343000842508746573743437343100852508" + "7465737434373432008625087465737434373433008725087465737434373434008825087465737434373435008925" + "087465737434373436008a25087465737434373437008b25087465737434373438008c25087465737434373439008d" + "25087465737434373530008e25087465737434373531008f2508746573743437353200902508746573743437353300" + "9125087465737434373534009225087465737434373535009325087465737434373536009425087465737434373537" + "0095250874657374343735380096250874657374343735390097250874657374343736300098250874657374343736" + "31009925087465737434373632009a25087465737434373633009b25087465737434373634009c2508746573743437" + "3635009d25087465737434373636009e25087465737434373637009f2508746573743437363800a025087465737434" + "37363900a12508746573743437373000a22508746573743437373100a32508746573743437373200a4250874657374" + "3437373300a52508746573743437373400a62508746573743437373500a72508746573743437373600a82508746573" + "743437373700a92508746573743437373800aa2508746573743437373900ab2508746573743437383000ac25087465" + "73743437383100ad2508746573743437383200ae2508746573743437383300af2508746573743437383400b0250874" + "6573743437383500b12508746573743437383600b22508746573743437383700b32508746573743437383800b42508" + "746573743437383900b52508746573743437393000b62508746573743437393100b72508746573743437393200b825" + "08746573743437393300b92508746573743437393400ba2508746573743437393500bb2508746573743437393600bc" + "2508746573743437393700bd2508746573743437393800be2508746573743437393900bf2508746573743438303000" + "c02508746573743438303100c12508746573743438303200c22508746573743438303300c325087465737434383034" + "00c42508746573743438303500c52508746573743438303600c62508746573743438303700c7250874657374343830" + "3800c82508746573743438303900c92508746573743438313000ca2508746573743438313100cb2508746573743438" + "313200cc2508746573743438313300cd2508746573743438313400ce2508746573743438313500cf25087465737434" + "38313600d02508746573743438313700d12508746573743438313800d22508746573743438313900d3250874657374" + "3438323000d42508746573743438323100d52508746573743438323200d62508746573743438323300d72508746573" + "743438323400d82508746573743438323500d92508746573743438323600da2508746573743438323700db25087465" + "73743438323800dc2508746573743438323900dd2508746573743438333000de2508746573743438333100df250874" + "6573743438333200e02508746573743438333300e12508746573743438333400e22508746573743438333500e32508" + "746573743438333600e42508746573743438333700e52508746573743438333800e62508746573743438333900e725" + "08746573743438343000e82508746573743438343100e92508746573743438343200ea2508746573743438343300eb" + "2508746573743438343400ec2508746573743438343500ed2508746573743438343600ee2508746573743438343700" + "ef2508746573743438343800f02508746573743438343900f12508746573743438353000f225087465737434383531" + "00f32508746573743438353200f42508746573743438353300f52508746573743438353400f6250874657374343835" + "3500f72508746573743438353600f82508746573743438353700f92508746573743438353800fa2508746573743438" + "353900fb2508746573743438363000fc2508746573743438363100fd2508746573743438363200fe25087465737434" + "38363300ff250874657374343836340080260874657374343836350081260874657374343836360082260874657374" + "3438363700832608746573743438363800842608746573743438363900852608746573743438373000862608746573" + "7434383731008726087465737434383732008826087465737434383733008926087465737434383734008a26087465" + "737434383735008b26087465737434383736008c26087465737434383737008d26087465737434383738008e260874" + "65737434383739008f2608746573743438383000902608746573743438383100912608746573743438383200922608" + "7465737434383833009326087465737434383834009426087465737434383835009526087465737434383836009626" + "087465737434383837009726087465737434383838009826087465737434383839009926087465737434383930009a" + "26087465737434383931009b26087465737434383932009c26087465737434383933009d2608746573743438393400" + "9e26087465737434383935009f2608746573743438393600a02608746573743438393700a126087465737434383938" + "00a22608746573743438393900a32608746573743439303000a42608746573743439303100a5260874657374343930" + "3200a62608746573743439303300a72608746573743439303400a82608746573743439303500a92608746573743439" + "303600aa2608746573743439303700ab2608746573743439303800ac2608746573743439303900ad26087465737434" + "39313000ae2608746573743439313100af2608746573743439313200b02608746573743439313300b1260874657374" + "3439313400b22608746573743439313500b32608746573743439313600b42608746573743439313700b52608746573" + "743439313800b62608746573743439313900b72608746573743439323000b82608746573743439323100b926087465" + "73743439323200ba2608746573743439323300bb2608746573743439323400bc2608746573743439323500bd260874" + "6573743439323600be2608746573743439323700bf2608746573743439323800c02608746573743439323900c12608" + "746573743439333000c22608746573743439333100c32608746573743439333200c42608746573743439333300c526" + "08746573743439333400c62608746573743439333500c72608746573743439333600c82608746573743439333700c9" + "2608746573743439333800ca2608746573743439333900cb2608746573743439343000cc2608746573743439343100" + "cd2608746573743439343200ce2608746573743439343300cf2608746573743439343400d026087465737434393435" + "00d12608746573743439343600d22608746573743439343700d32608746573743439343800d4260874657374343934" "3900d52608746573743439353000d62608746573743439353100d72608746573743439353200d82608746573743439" - "353300d9260874657374" - "3439353400da2608746573743439353500db2608746573743439353600dc2608746573743439353700dd2608746573" - "743439353800de260874" - "6573743439353900df2608746573743439363000e02608746573743439363100e12608746573743439363200e22608" - "746573743439363300e3" - "2608746573743439363400e42608746573743439363500e52608746573743439363600e62608746573743439363700" - "e7260874657374343936" - "3800e82608746573743439363900e92608746573743439373000ea2608746573743439373100eb2608746573743439" - "373200ec260874657374" - "3439373300ed2608746573743439373400ee2608746573743439373500ef2608746573743439373600f02608746573" - "743439373700f1260874" - "6573743439373800f22608746573743439373900f32608746573743439383000f42608746573743439383100f52608" - "746573743439383200f6" - "2608746573743439383300f72608746573743439383400f82608746573743439383500f92608746573743439383600" - "fa260874657374343938" - "3700fb2608746573743439383800fc2608746573743439383900fd2608746573743439393000fe2608746573743439" - "393100ff260874657374" - "3439393200802708746573743439393300812708746573743439393400822708746573743439393500832708746573" - "74343939360084270874" - "657374343939370085270874657374343939380086270874657374343939390087270ac2b80288270700200020016a" - "0b0700200020016a0b07" + "353300d92608746573743439353400da2608746573743439353500db2608746573743439353600dc26087465737434" + "39353700dd2608746573743439353800de2608746573743439353900df2608746573743439363000e0260874657374" + "3439363100e12608746573743439363200e22608746573743439363300e32608746573743439363400e42608746573" + "743439363500e52608746573743439363600e62608746573743439363700e72608746573743439363800e826087465" + "73743439363900e92608746573743439373000ea2608746573743439373100eb2608746573743439373200ec260874" + "6573743439373300ed2608746573743439373400ee2608746573743439373500ef2608746573743439373600f02608" + "746573743439373700f12608746573743439373800f22608746573743439373900f32608746573743439383000f426" + "08746573743439383100f52608746573743439383200f62608746573743439383300f72608746573743439383400f8" + "2608746573743439383500f92608746573743439383600fa2608746573743439383700fb2608746573743439383800" + "fc2608746573743439383900fd2608746573743439393000fe2608746573743439393100ff26087465737434393932" + "0080270874657374343939330081270874657374343939340082270874657374343939350083270874657374343939" + "360084270874657374343939370085270874657374343939380086270874657374343939390087270ac2b802882707" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b07" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b070020" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b07002000" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b"; + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b"; extern std::string const opcReservedHex = "0061736d010000000105016000017f03030200000404017000010503010001060b027f0141000b7e0142000b071401" - "10616c6c5f696e737472" - "756374696f6e7300010907010041000b01000a53020400412a0b4c02017f017e010101010101010101010101010101" - "01010101010101010101" - "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101410b0b0b" - "0a010041000b04746573" - "74"; + "10616c6c5f696e737472756374696f6e7300010907010041000b01000a53020400412a0b4c02017f017e0101010101" + "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101" + "01010101010101010101010101010101410b0b0b0a010041000b0474657374"; extern std::string const impExpHex = "0061736d0100000001100360027f7f017f6000017f60017f017f02330203656e760e6765745f6c65646765725f7371" From 888ca2e6d98fd9a897d9a87201a01a6358359986 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 24 Mar 2026 09:29:05 -0700 Subject: [PATCH 195/212] fix build --- src/libxrpl/tx/wasm/HostFuncImplNFT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp index fbf85d8a129..ac002d723f3 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include namespace xrpl { From 90397e1a52dd9fee91bc0851357a7fd17022a728 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 24 Mar 2026 09:41:08 -0700 Subject: [PATCH 196/212] more build fixes --- src/test/app/TestHostFunctions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index ec3d77803cf..0e74cd62834 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include From 531e8b6ebd99dc81b4fa8c89f19d6f94e10af114 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 24 Mar 2026 09:46:01 -0700 Subject: [PATCH 197/212] fix clang-tidy --- include/xrpl/tx/wasm/WasmiVM.h | 4 ++-- src/libxrpl/basics/Number.cpp | 12 ++++++++-- src/libxrpl/tx/wasm/HostFuncImplFloat.cpp | 21 ++++++++++------ src/libxrpl/tx/wasm/HostFuncImplGetter.cpp | 28 +++++++++++++--------- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 4 ++++ src/libxrpl/tx/wasm/WasmiVM.cpp | 20 ++++++++++++---- 6 files changed, 63 insertions(+), 26 deletions(-) diff --git a/include/xrpl/tx/wasm/WasmiVM.h b/include/xrpl/tx/wasm/WasmiVM.h index bd37b4e42e6..034f115ee6e 100644 --- a/include/xrpl/tx/wasm/WasmiVM.h +++ b/include/xrpl/tx/wasm/WasmiVM.h @@ -182,11 +182,11 @@ struct ModuleWrapper addInstance(StorePtr& s, WasmExternVec const& imports); std::int64_t - getGas(); + getGas() const; private: WasmExternVec - buildImports(StorePtr& s, ImportVec const& imports); + buildImports(StorePtr& s, ImportVec const& imports) const; }; class WasmiEngine diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index b64c2f5707b..7a265395285 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -955,9 +955,13 @@ ln(Number const& x, int iterations = 50) static Number const LN2(693'147'180'559'945'309ll, -18); if (x <= 0) + { throw std::runtime_error("Not a positive value"); - else if (x == 1) + } + if (x == 1) + { return N0; + } int exponent = 0; Number mantissa = x; @@ -993,9 +997,13 @@ log10(Number const& x, int iterations) static Number const LN10(2'302'585'092'994'046ll, -15); if (x <= 0) + { throw std::runtime_error("Not a positive value"); - else if (x == 1) + } + if (x == 1) + { return N0; + } if (x <= Number(10)) { diff --git a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp index 030148da143..ea810f59d72 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp @@ -27,7 +27,7 @@ class Number2 : public Number bool good_; public: - Number2(Slice const& data) : Number(), good_(false) + Number2(Slice const& data) : good_(false) { if (data.size() != encodedFloatSize) return; @@ -124,16 +124,20 @@ class Number2 : public Number { return floatNull; } - else if (absM > maxEncodedMantissa) + if (absM > maxEncodedMantissa) { return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); // LCOV_EXCL_LINE } v |= absM; if (e > wasmMaxExponent) + { return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); - else if (e < wasmMinExponent) + } + if (e < wasmMinExponent) + { return floatNull; + } uint64_t const normExp = e - wasmMinExponent + 1; //+97 v |= normExp << encodedMantissaBits; @@ -160,10 +164,9 @@ struct FloatState { Number::rounding_mode oldMode_; MantissaRange::mantissa_scale oldScale_; - bool good_; + bool good_{false}; - FloatState(int32_t mode) - : oldMode_(Number::getround()), oldScale_(Number::getMantissaScale()), good_(false) + FloatState(int32_t mode) : oldMode_(Number::getround()), oldScale_(Number::getMantissaScale()) { if (mode < Number::rounding_mode::to_nearest || mode > Number::rounding_mode::upward) return; @@ -281,7 +284,11 @@ floatCompareImpl(Slice const& x, Slice const& y) detail::Number2 yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - return xx < yy ? 2 : (xx == yy ? 0 : 1); + if (xx < yy) + return 2; + if (xx == yy) + return 0; + return 1; } // LCOV_EXCL_START catch (...) diff --git a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp index 1344d4f5bca..7d96c111e88 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp @@ -42,13 +42,13 @@ getAnyFieldData(STBase const* obj) return Unexpected(HostFunctionError::NOT_LEAF_FIELD); case STI_ACCOUNT: { - auto const* account(static_cast(obj)); + auto const* account(dynamic_cast(obj)); auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } case STI_ISSUE: { - auto const* issue(static_cast(obj)); + auto const* issue(dynamic_cast(obj)); Asset const& asset(issue->value()); // XRP and IOU will be processed by serializer if (asset.holds()) @@ -61,7 +61,7 @@ getAnyFieldData(STBase const* obj) } case STI_VL: { - auto const* vl(static_cast(obj)); + auto const* vl(dynamic_cast(obj)); auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } @@ -84,7 +84,7 @@ getAnyFieldData(STBase const* obj) // LCOV_EXCL_STOP case STI_UINT256: { - auto const* uint256Obj(static_cast(obj)); + auto const* uint256Obj(dynamic_cast(obj)); auto const& data = uint256Obj->value(); return Bytes{data.begin(), data.end()}; } @@ -106,7 +106,7 @@ getAnyFieldData(FieldValue const& variantObj) { return getAnyFieldData(*obj); } - else if (uint256 const* const* u = std::get_if(&variantObj)) + if (uint256 const* const* u = std::get_if(&variantObj)) { return Bytes((*u)->begin(), (*u)->end()); } @@ -133,10 +133,14 @@ locateField(STObject const& obj, Slice const& locator) { uintptr_t const p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) // unaligned + if (p & (alignof(int32_t) - 1)) + { // unaligned memcpy(&locBuf[0], locator.data(), locator.size()); + } else + { locPtr = reinterpret_cast(locator.data()); + } } STBase const* field = nullptr; @@ -160,14 +164,14 @@ locateField(STObject const& obj, Slice const& locator) if (STI_ARRAY == field->getSType()) { - auto const* arr = static_cast(field); + auto const* arr = dynamic_cast(field); if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, arr->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](sfieldCode)); } else if (STI_OBJECT == field->getSType()) { - auto const* o = static_cast(field); + auto const* o = dynamic_cast(field); auto const it = knownSFields.find(sfieldCode); if (it == knownSFields.end()) @@ -178,7 +182,7 @@ locateField(STObject const& obj, Slice const& locator) } else if (STI_VECTOR256 == field->getSType()) { - auto const* v = static_cast(field); + auto const* v = dynamic_cast(field); if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, v->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); return FieldValue(&(v->operator[](sfieldCode))); @@ -201,9 +205,9 @@ getArrayLen(FieldValue const& variantField) if (STBase const* const* field = std::get_if(&variantField)) { if ((*field)->getSType() == STI_VECTOR256) - return static_cast(*field)->size(); + return dynamic_cast(*field)->size(); if ((*field)->getSType() == STI_ARRAY) - return static_cast(*field)->size(); + return dynamic_cast(*field)->size(); } // uint256 is not an array so that variant should still return NO_ARRAY @@ -222,8 +226,10 @@ WasmHostFunctionsImpl::cacheLedgerObj(uint256 const& objId, int32_t cacheIdx) if (cacheIdx == 0) { for (cacheIdx = 0; cacheIdx < MAX_CACHE; ++cacheIdx) + { if (!cache_[cacheIdx]) break; + } } else { diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 656e51f75ea..83453d90686 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -78,9 +78,13 @@ getDataUnsigned(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) T x; uintptr_t p = reinterpret_cast(r->data()); if (p & (alignof(T) - 1)) // unaligned + { memcpy(&x, r->data(), sizeof(T)); + } else + { x = *reinterpret_cast(r->data()); + } x = adjustWasmEndianess(x); return x; diff --git a/src/libxrpl/tx/wasm/WasmiVM.cpp b/src/libxrpl/tx/wasm/WasmiVM.cpp index 6d264c5e501..7dd4b5debce 100644 --- a/src/libxrpl/tx/wasm/WasmiVM.cpp +++ b/src/libxrpl/tx/wasm/WasmiVM.cpp @@ -33,7 +33,9 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) << std::string_view(error_message.data, error_message.size - 1); } else + { j << "WASMI Error: " << msg; + } if (error_message.size) wasm_byte_vec_delete(&error_message); @@ -331,7 +333,7 @@ makeImpReturn(WasmImportFunc const& imp) } WasmExternVec -ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) +ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) const { WasmImporttypeVec importTypes; wasm_module_imports(module_.get(), &importTypes.vec_); @@ -355,8 +357,10 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) wasm_externkind_t const itype = wasm_externtype_kind(wasm_importtype_type(importType)); if ((itype) != WASM_EXTERN_FUNC) + { throw std::runtime_error( "Invalid import type " + std::to_string(itype)); // LCOV_EXCL_LINE + } // for multi-module support // if ((W_ENV != modName) && (W_HOST_LIB != modName)) @@ -471,7 +475,7 @@ ModuleWrapper::addInstance(StorePtr& s, WasmExternVec const& imports) // } std::int64_t -ModuleWrapper::getGas() +ModuleWrapper::getGas() const { return instanceWrap_ ? instanceWrap_.getGas() : -1; } @@ -491,8 +495,10 @@ WasmiEngine::init() { wasm_config_t* config = wasm_config_new(); if (!config) + { return std::unique_ptr{ nullptr, &wasm_engine_delete}; // LCOV_EXCL_LINE + } wasmi_config_consume_fuel_set(config, true); wasmi_config_ignore_custom_sections_set(config, true); wasmi_config_wasm_mutable_globals_set(config, false); @@ -792,14 +798,20 @@ WasmiEngine::runHlp( auto const res = call<1>(f, p); if (res.f) + { throw std::runtime_error("<" + std::string(funcName) + "> failure"); - else if (!res.r.vec_.size) + } + if (!res.r.vec_.size) + { throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE - else if (res.r.vec_.data[0].kind != WASM_I32) + } + if (res.r.vec_.data[0].kind != WASM_I32) + { throw std::runtime_error( "<" + std::string(funcName) + "> return type mismatch, ret: " + std::to_string(static_cast(res.r.vec_.data[0].kind))); + } if (gas == -1) gas = std::numeric_limits::max(); From 9dbb301699a438dbec7f3f99fe7d397d7561f109 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 24 Mar 2026 10:20:06 -0700 Subject: [PATCH 198/212] more clang-tidy fixes --- src/test/app/HostFuncImpl_test.cpp | 22 ++++++++++++++++++++++ src/test/app/Wasm_test.cpp | 8 +++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index a64031bd366..e77c3ded0ce 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -117,8 +117,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite WasmHostFunctionsImpl hfs(ac, dummyEscrow); auto const result = hfs.getParentLedgerTime(); if (BEAST_EXPECT(result.has_value())) + { BEAST_EXPECT( result.value() == env.current()->parentCloseTime().time_since_epoch().count()); + } } } @@ -301,9 +303,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const credentialIds = hfs.getTxField(sfCredentialIDs); if (BEAST_EXPECT(!credentialIds.has_value())) + { BEAST_EXPECTS( credentialIds.error() == HostFunctionError::NOT_LEAF_FIELD, std::to_string(HfErrorToInt(credentialIds.error()))); + } auto const nonField = hfs.getTxField(sfInvalid); if (BEAST_EXPECT(!nonField.has_value())) @@ -583,9 +587,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Locator for non-existent base field expectError( @@ -729,9 +735,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getCurrentLedgerObjNestedField(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Locator for non-existent base field expectError( @@ -770,9 +778,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = dummyHfs.getCurrentLedgerObjNestedField(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, std::to_string(static_cast(result.error()))); + } } } @@ -873,9 +883,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getLedgerObjNestedField(slot, locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Error: base field not found @@ -1062,8 +1074,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const arrLen = hfs.getLedgerObjArrayLen(1, sfSignerEntries); if (BEAST_EXPECT(arrLen.has_value())) + { // Should return 2 for sfSignerEntries BEAST_EXPECT(arrLen.value() == 2); + } } { auto const arrLen = hfs.getLedgerObjArrayLen(0, sfSignerEntries); @@ -1123,9 +1137,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Locator for sfMemos @@ -1173,9 +1189,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getCurrentLedgerObjNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Locator for sfSignerEntries @@ -1203,9 +1221,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = dummyHfs.getCurrentLedgerObjNestedArrayLen(locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND, std::to_string(static_cast(result.error()))); + } } } @@ -1249,9 +1269,11 @@ struct HostFuncImpl_test : public beast::unit_test::suite locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getLedgerObjNestedArrayLen(slot, locator); if (BEAST_EXPECT(!result.has_value())) + { BEAST_EXPECTS( result.error() == expectedError, std::to_string(static_cast(result.error()))); + } }; // Error: non-array field diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 041b73f0caa..089a6150cf5 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -25,7 +25,7 @@ Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return nullptr; } -std::vector const +std::vector hexToBytes(std::string const& hex) { auto const ws = boost::algorithm::unhex(hex); @@ -123,10 +123,8 @@ runFinishFunction(std::string const& code) { return std::optional(re->result); } - else - { - return std::nullopt; - } + + return std::nullopt; } struct Wasm_test : public beast::unit_test::suite From a7ab8ee92335e756c5bfbda5c1dc9efa79e0f729 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Tue, 24 Mar 2026 10:22:01 -0700 Subject: [PATCH 199/212] clang-tidy fixes --- include/xrpl/tx/wasm/WasmiVM.h | 2 +- src/libxrpl/basics/Number.cpp | 2 +- src/libxrpl/tx/wasm/HostFuncImplFloat.cpp | 10 +++---- src/libxrpl/tx/wasm/HostFuncImplGetter.cpp | 9 +++--- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 12 ++++---- src/libxrpl/tx/wasm/WasmiVM.cpp | 34 +++++++++++----------- src/test/app/Wasm_test.cpp | 4 +-- 7 files changed, 37 insertions(+), 36 deletions(-) diff --git a/include/xrpl/tx/wasm/WasmiVM.h b/include/xrpl/tx/wasm/WasmiVM.h index 034f115ee6e..61bbedfd1aa 100644 --- a/include/xrpl/tx/wasm/WasmiVM.h +++ b/include/xrpl/tx/wasm/WasmiVM.h @@ -273,7 +273,7 @@ class WasmiEngine FuncInfo getFunc(std::string_view funcName) const; - std::vector + static std::vector convertParams(std::vector const& params); static int diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 72c129ac7dd..5ec9da315e1 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -983,7 +983,7 @@ ln(Number const& x, int iterations = 50) for (int i = 1; i <= iterations; ++i) { - sum = sum + z / (2 * i - 1); + sum = sum + z / ((2 * i) - 1); z = z * zz; } diff --git a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp index ea810f59d72..0b31bcd6ce1 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp @@ -39,7 +39,7 @@ class Number2 : public Number } uint64_t const v = SerialIter(data).get64(); - if (!(v & STAmount::cIssuedCurrency)) + if ((v & STAmount::cIssuedCurrency) == 0u) return; int32_t const e = static_cast((v >> encodedMantissaBits) & 0xFFull); @@ -47,9 +47,9 @@ class Number2 : public Number if (decodedExponent < wasmMinExponent || decodedExponent > wasmMaxExponent) return; - int64_t const neg = (v & STAmount::cPositive) ? 1 : -1; + int64_t const neg = ((v & STAmount::cPositive) != 0u) ? 1 : -1; int64_t const m = neg * static_cast(v & ((1ull << encodedMantissaBits) - 1)); - if (!m) + if (m == 0) return; Number x(makeNumber(m, decodedExponent)); @@ -120,7 +120,7 @@ class Number2 : public Number v |= STAmount::cIssuedCurrency; uint64_t const absM = std::abs(m); - if (!absM) + if (absM == 0u) { return floatNull; } @@ -450,7 +450,7 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) detail::Number2 xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - if (xx == Number() && !n) + if (xx == Number() && (n == 0)) return Unexpected(HostFunctionError::INVALID_PARAMS); detail::Number2 res(power(xx, n, 1)); diff --git a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp index 7d96c111e88..67542ac5598 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp @@ -24,7 +24,7 @@ getIntBytes(STBase const* obj) static Expected getAnyFieldData(STBase const* obj) { - if (!obj) + if (obj == nullptr) return Unexpected(HostFunctionError::FIELD_NOT_FOUND); auto const stype = obj->getSType(); @@ -117,13 +117,14 @@ getAnyFieldData(FieldValue const& variantObj) static inline bool noField(STBase const* field) { - return !field || (STI_NOTPRESENT == field->getSType()) || (STI_UNKNOWN == field->getSType()); + return (field == nullptr) || (STI_NOTPRESENT == field->getSType()) || + (STI_UNKNOWN == field->getSType()); } static Expected locateField(STObject const& obj, Slice const& locator) { - if (locator.empty() || (locator.size() & 3)) // must be multiple of 4 + if (locator.empty() || ((locator.size() & 3) != 0u)) // must be multiple of 4 return Unexpected(HostFunctionError::LOCATOR_MALFORMED); static_assert(maxWasmParamLength % sizeof(int32_t) == 0); @@ -133,7 +134,7 @@ locateField(STObject const& obj, Slice const& locator) { uintptr_t const p = reinterpret_cast(locator.data()); - if (p & (alignof(int32_t) - 1)) + if ((p & (alignof(int32_t) - 1)) != 0u) { // unaligned memcpy(&locBuf[0], locator.data(), locator.size()); } diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 83453d90686..6003aefd84c 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -21,19 +21,19 @@ setData( uint8_t const* src, int32_t srcSize) { - if (!srcSize) + if (srcSize == 0) return 0; // LCOV_EXCL_LINE - if (dst < 0 || dstSize < 0 || !src || srcSize < 0) + if (dst < 0 || dstSize < 0 || (src == nullptr) || srcSize < 0) return HfErrorToInt(HostFunctionError::INVALID_PARAMS); if (srcSize > maxWasmDataLength) return HfErrorToInt(HostFunctionError::DATA_FIELD_TOO_LARGE); - auto const memory = runtime ? runtime->getMem() : wmem(); + auto const memory = (runtime != nullptr) ? runtime->getMem() : wmem(); // LCOV_EXCL_START - if (!memory.s) + if (memory.s == 0u) return HfErrorToInt(HostFunctionError::NO_MEM_EXPORTED); // LCOV_EXCL_STOP if ((int64_t)dst + dstSize > memory.s) @@ -339,7 +339,7 @@ checkGas(void* env) HostFunctions* hf = reinterpret_cast(udata->first); auto const* runtime = reinterpret_cast(hf->getRT()); - if (!runtime) + if (runtime == nullptr) { wasm_trap_t* trap = reinterpret_cast( WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE @@ -1409,7 +1409,7 @@ trace_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return hfResult(results, HostFunctionError::INVALID_PARAMS); } - return returnResult(runtime, params, results, hf->trace(*msg, *data, *asHex), index); + return returnResult(runtime, params, results, hf->trace(*msg, *data, *asHex != 0), index); } wasm_trap_t* diff --git a/src/libxrpl/tx/wasm/WasmiVM.cpp b/src/libxrpl/tx/wasm/WasmiVM.cpp index 7dd4b5debce..8147f84588a 100644 --- a/src/libxrpl/tx/wasm/WasmiVM.cpp +++ b/src/libxrpl/tx/wasm/WasmiVM.cpp @@ -24,10 +24,10 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) { wasm_byte_vec_t error_message WASM_EMPTY_VEC; - if (trap) + if (trap != nullptr) wasm_trap_message(trap, &error_message); - if (error_message.size) + if (error_message.size != 0u) { j << "WASMI Error: " << msg << ", " << std::string_view(error_message.data, error_message.size - 1); @@ -37,11 +37,11 @@ print_wasm_error(std::string_view msg, wasm_trap_t* trap, beast::Journal jlog) j << "WASMI Error: " << msg; } - if (error_message.size) + if (error_message.size != 0u) wasm_byte_vec_delete(&error_message); } - if (trap) + if (trap != nullptr) wasm_trap_delete(trap); #ifdef DEBUG_OUTPUT @@ -64,7 +64,7 @@ InstanceWrapper::init( InstancePtr mi = InstancePtr( wasm_instance_new(s.get(), m.get(), &imports.vec_, &trap), &wasm_instance_delete); - if (!mi || trap) + if (!mi || (trap != nullptr)) { print_wasm_error("can't create instance", trap, j); throw std::runtime_error("can't create instance"); @@ -126,7 +126,7 @@ InstanceWrapper::getFunc(std::string_view funcName, WasmExporttypeVec const& exp if (!instance_) throw std::runtime_error("no instance"); // LCOV_EXCL_LINE - if (!exportTypes.vec_.size) + if (exportTypes.vec_.size == 0u) throw std::runtime_error("no export"); // LCOV_EXCL_LINE if (exportTypes.vec_.size != exports_.vec_.size) throw std::runtime_error("invalid export"); // LCOV_EXCL_LINE @@ -152,7 +152,7 @@ InstanceWrapper::getFunc(std::string_view funcName, WasmExporttypeVec const& exp } } - if (!f || !ft) + if ((f == nullptr) || (ft == nullptr)) throw std::runtime_error("can't find function <" + std::string(funcName) + ">"); return {f, ft}; @@ -180,7 +180,7 @@ InstanceWrapper::getMem() const } } - if (!mem) + if (mem == nullptr) return {}; // LCOV_EXCL_LINE return {reinterpret_cast(wasm_memory_data(mem)), wasm_memory_data_size(mem)}; @@ -189,7 +189,7 @@ InstanceWrapper::getMem() const std::int64_t InstanceWrapper::getGas() const { - if (!store_) + if (store_ == nullptr) return -1; // LCOV_EXCL_LINE std::uint64_t gas = 0; wasm_store_get_fuel(store_, &gas); @@ -199,13 +199,13 @@ InstanceWrapper::getGas() const std::int64_t InstanceWrapper::setGas(std::int64_t gas) const { - if (!store_) + if (store_ == nullptr) return -1; // LCOV_EXCL_LINE if (gas < 0) gas = std::numeric_limits::max(); wasmi_error_t* err = wasm_store_set_fuel(store_, static_cast(gas)); - if (err) + if (err != nullptr) { // LCOV_EXCL_START print_wasm_error("Can't set instance gas", nullptr, j_); @@ -284,7 +284,7 @@ static WasmValtypeVec makeImpParams(WasmImportFunc const& imp) { auto const paramSize = imp.params.size(); - if (!paramSize) + if (paramSize == 0u) return {}; WasmValtypeVec v(paramSize); @@ -338,7 +338,7 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) const WasmImporttypeVec importTypes; wasm_module_imports(module_.get(), &importTypes.vec_); - if (!importTypes.vec_.size) + if (importTypes.vec_.size == 0u) return {}; if (imports.empty()) throw std::runtime_error("Missing imports"); @@ -388,7 +388,7 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) const reinterpret_cast(imp.wrap), (void*)&obj, nullptr); - if (!func) + if (func == nullptr) { // LCOV_EXCL_START throw std::runtime_error("can't create import function " + imp.name); @@ -494,7 +494,7 @@ std::unique_ptr WasmiEngine::init() { wasm_config_t* config = wasm_config_new(); - if (!config) + if (config == nullptr) { return std::unique_ptr{ nullptr, &wasm_engine_delete}; // LCOV_EXCL_LINE @@ -537,7 +537,7 @@ WasmiEngine::addModule( if (gas < 0) gas = std::numeric_limits::max(); wasmi_error_t* err = wasm_store_set_fuel(store_.get(), static_cast(gas)); - if (err) + if (err != nullptr) { // LCOV_EXCL_START print_wasm_error("Error setting gas", nullptr, j_); @@ -801,7 +801,7 @@ WasmiEngine::runHlp( { throw std::runtime_error("<" + std::string(funcName) + "> failure"); } - if (!res.r.vec_.size) + if (res.r.vec_.size == 0u) { throw std::runtime_error( "<" + std::string(funcName) + "> return nothing"); // LCOV_EXCL_LINE diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 089a6150cf5..93add98f3a4 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -62,7 +62,7 @@ uleb128(IT&& it) do { - if (shift > sizeof(std::uint64_t) * 8 - 7) + if (shift > (sizeof(std::uint64_t) * 8) - 7) return {0, 0}; byte = *it++; val |= (byte & 0x7F) << shift; @@ -100,7 +100,7 @@ getSection(Bytes const& module, std::uint8_t n) return {0, 0}; auto [sz, cnt] = uleb128(module.cbegin() + pos); - if (!cnt) + if (cnt == 0u) return {0, 0}; if (pos + cnt + sz > module.size()) return {0, 0}; From d006433579676cec6c7e26922d1fffbdb36f9fa2 Mon Sep 17 00:00:00 2001 From: Olek <115580134+oleks-rip@users.noreply.github.com> Date: Wed, 25 Mar 2026 09:42:33 -0400 Subject: [PATCH 200/212] Base divison of large fixtures (#6637) --- .../wasm_fixtures/fixture_functions_5k.cpp | 2238 + .../app/wasm_fixtures/fixture_locals_10k.cpp | 2126 + src/test/app/wasm_fixtures/fixtures.cpp | 4358 -- .../app/wasm_fixtures/wat/functions_5k.wat | 45002 -------------- .../app/wasm_fixtures/wat/functions_5k.zip | Bin 0 -> 29665 bytes src/test/app/wasm_fixtures/wat/locals_10k.wat | 50000 ---------------- src/test/app/wasm_fixtures/wat/locals_10k.zip | Bin 0 -> 82559 bytes 7 files changed, 4364 insertions(+), 99360 deletions(-) create mode 100644 src/test/app/wasm_fixtures/fixture_functions_5k.cpp create mode 100644 src/test/app/wasm_fixtures/fixture_locals_10k.cpp delete mode 100644 src/test/app/wasm_fixtures/wat/functions_5k.wat create mode 100644 src/test/app/wasm_fixtures/wat/functions_5k.zip delete mode 100644 src/test/app/wasm_fixtures/wat/locals_10k.wat create mode 100644 src/test/app/wasm_fixtures/wat/locals_10k.zip diff --git a/src/test/app/wasm_fixtures/fixture_functions_5k.cpp b/src/test/app/wasm_fixtures/fixture_functions_5k.cpp new file mode 100644 index 00000000000..6ade5fea144 --- /dev/null +++ b/src/test/app/wasm_fixtures/fixture_functions_5k.cpp @@ -0,0 +1,2238 @@ +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const functions5kHex = + "0061736d0100000001070160027f7f017f038a27882700000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "0000000000000000000000000000000000000000000000000000000000000000000000000000000007e2d303882708" + "7465737430303030000008746573743030303100010874657374303030320002087465737430303033000308746573" + "7430303034000408746573743030303500050874657374303030360006087465737430303037000708746573743030" + "303800080874657374303030390009087465737430303130000a087465737430303131000b08746573743030313200" + "0c087465737430303133000d087465737430303134000e087465737430303135000f08746573743030313600100874" + "6573743030313700110874657374303031380012087465737430303139001308746573743030323000140874657374" + "3030323100150874657374303032320016087465737430303233001708746573743030323400180874657374303032" + "350019087465737430303236001a087465737430303237001b087465737430303238001c087465737430303239001d" + "087465737430303330001e087465737430303331001f08746573743030333200200874657374303033330021087465" + "7374303033340022087465737430303335002308746573743030333600240874657374303033370025087465737430" + "3033380026087465737430303339002708746573743030343000280874657374303034310029087465737430303432" + "002a087465737430303433002b087465737430303434002c087465737430303435002d087465737430303436002e08" + "7465737430303437002f08746573743030343800300874657374303034390031087465737430303530003208746573" + "7430303531003308746573743030353200340874657374303035330035087465737430303534003608746573743030" + "3535003708746573743030353600380874657374303035370039087465737430303538003a08746573743030353900" + "3b087465737430303630003c087465737430303631003d087465737430303632003e087465737430303633003f0874" + "6573743030363400400874657374303036350041087465737430303636004208746573743030363700430874657374" + "3030363800440874657374303036390045087465737430303730004608746573743030373100470874657374303037" + "3200480874657374303037330049087465737430303734004a087465737430303735004b087465737430303736004c" + "087465737430303737004d087465737430303738004e087465737430303739004f0874657374303038300050087465" + "7374303038310051087465737430303832005208746573743030383300530874657374303038340054087465737430" + "3038350055087465737430303836005608746573743030383700570874657374303038380058087465737430303839" + "0059087465737430303930005a087465737430303931005b087465737430303932005c087465737430303933005d08" + "7465737430303934005e087465737430303935005f0874657374303039360060087465737430303937006108746573" + "7430303938006208746573743030393900630874657374303130300064087465737430313031006508746573743031" + "3032006608746573743031303300670874657374303130340068087465737430313035006908746573743031303600" + "6a087465737430313037006b087465737430313038006c087465737430313039006d087465737430313130006e0874" + "65737430313131006f0874657374303131320070087465737430313133007108746573743031313400720874657374" + "3031313500730874657374303131360074087465737430313137007508746573743031313800760874657374303131" + "39007708746573743031323000780874657374303132310079087465737430313232007a087465737430313233007b" + "087465737430313234007c087465737430313235007d087465737430313236007e087465737430313237007f087465" + "7374303132380080010874657374303132390081010874657374303133300082010874657374303133310083010874" + "6573743031333200840108746573743031333300850108746573743031333400860108746573743031333500870108" + "7465737430313336008801087465737430313337008901087465737430313338008a01087465737430313339008b01" + "087465737430313430008c01087465737430313431008d01087465737430313432008e01087465737430313433008f" + "0108746573743031343400900108746573743031343500910108746573743031343600920108746573743031343700" + "9301087465737430313438009401087465737430313439009501087465737430313530009601087465737430313531" + "009701087465737430313532009801087465737430313533009901087465737430313534009a010874657374303135" + "35009b01087465737430313536009c01087465737430313537009d01087465737430313538009e0108746573743031" + "3539009f0108746573743031363000a00108746573743031363100a10108746573743031363200a201087465737430" + "31363300a30108746573743031363400a40108746573743031363500a50108746573743031363600a6010874657374" + "3031363700a70108746573743031363800a80108746573743031363900a90108746573743031373000aa0108746573" + "743031373100ab0108746573743031373200ac0108746573743031373300ad0108746573743031373400ae01087465" + "73743031373500af0108746573743031373600b00108746573743031373700b10108746573743031373800b2010874" + "6573743031373900b30108746573743031383000b40108746573743031383100b50108746573743031383200b60108" + "746573743031383300b70108746573743031383400b80108746573743031383500b90108746573743031383600ba01" + "08746573743031383700bb0108746573743031383800bc0108746573743031383900bd0108746573743031393000be" + "0108746573743031393100bf0108746573743031393200c00108746573743031393300c10108746573743031393400" + "c20108746573743031393500c30108746573743031393600c40108746573743031393700c501087465737430313938" + "00c60108746573743031393900c70108746573743032303000c80108746573743032303100c9010874657374303230" + "3200ca0108746573743032303300cb0108746573743032303400cc0108746573743032303500cd0108746573743032" + "303600ce0108746573743032303700cf0108746573743032303800d00108746573743032303900d101087465737430" + "32313000d20108746573743032313100d30108746573743032313200d40108746573743032313300d5010874657374" + "3032313400d60108746573743032313500d70108746573743032313600d80108746573743032313700d90108746573" + "743032313800da0108746573743032313900db0108746573743032323000dc0108746573743032323100dd01087465" + "73743032323200de0108746573743032323300df0108746573743032323400e00108746573743032323500e1010874" + "6573743032323600e20108746573743032323700e30108746573743032323800e40108746573743032323900e50108" + "746573743032333000e60108746573743032333100e70108746573743032333200e80108746573743032333300e901" + "08746573743032333400ea0108746573743032333500eb0108746573743032333600ec0108746573743032333700ed" + "0108746573743032333800ee0108746573743032333900ef0108746573743032343000f00108746573743032343100" + "f10108746573743032343200f20108746573743032343300f30108746573743032343400f401087465737430323435" + "00f50108746573743032343600f60108746573743032343700f70108746573743032343800f8010874657374303234" + "3900f90108746573743032353000fa0108746573743032353100fb0108746573743032353200fc0108746573743032" + "353300fd0108746573743032353400fe0108746573743032353500ff01087465737430323536008002087465737430" + "3235370081020874657374303235380082020874657374303235390083020874657374303236300084020874657374" + "3032363100850208746573743032363200860208746573743032363300870208746573743032363400880208746573" + "7430323635008902087465737430323636008a02087465737430323637008b02087465737430323638008c02087465" + "737430323639008d02087465737430323730008e02087465737430323731008f020874657374303237320090020874" + "6573743032373300910208746573743032373400920208746573743032373500930208746573743032373600940208" + "7465737430323737009502087465737430323738009602087465737430323739009702087465737430323830009802" + "087465737430323831009902087465737430323832009a02087465737430323833009b02087465737430323834009c" + "02087465737430323835009d02087465737430323836009e02087465737430323837009f0208746573743032383800" + "a00208746573743032383900a10208746573743032393000a20208746573743032393100a302087465737430323932" + "00a40208746573743032393300a50208746573743032393400a60208746573743032393500a7020874657374303239" + "3600a80208746573743032393700a90208746573743032393800aa0208746573743032393900ab0208746573743033" + "303000ac0208746573743033303100ad0208746573743033303200ae0208746573743033303300af02087465737430" + "33303400b00208746573743033303500b10208746573743033303600b20208746573743033303700b3020874657374" + "3033303800b40208746573743033303900b50208746573743033313000b60208746573743033313100b70208746573" + "743033313200b80208746573743033313300b90208746573743033313400ba0208746573743033313500bb02087465" + "73743033313600bc0208746573743033313700bd0208746573743033313800be0208746573743033313900bf020874" + "6573743033323000c00208746573743033323100c10208746573743033323200c20208746573743033323300c30208" + "746573743033323400c40208746573743033323500c50208746573743033323600c60208746573743033323700c702" + "08746573743033323800c80208746573743033323900c90208746573743033333000ca0208746573743033333100cb" + "0208746573743033333200cc0208746573743033333300cd0208746573743033333400ce0208746573743033333500" + "cf0208746573743033333600d00208746573743033333700d10208746573743033333800d202087465737430333339" + "00d30208746573743033343000d40208746573743033343100d50208746573743033343200d6020874657374303334" + "3300d70208746573743033343400d80208746573743033343500d90208746573743033343600da0208746573743033" + "343700db0208746573743033343800dc0208746573743033343900dd0208746573743033353000de02087465737430" + "33353100df0208746573743033353200e00208746573743033353300e10208746573743033353400e2020874657374" + "3033353500e30208746573743033353600e40208746573743033353700e50208746573743033353800e60208746573" + "743033353900e70208746573743033363000e80208746573743033363100e90208746573743033363200ea02087465" + "73743033363300eb0208746573743033363400ec0208746573743033363500ed0208746573743033363600ee020874" + "6573743033363700ef0208746573743033363800f00208746573743033363900f10208746573743033373000f20208" + "746573743033373100f30208746573743033373200f40208746573743033373300f50208746573743033373400f602" + "08746573743033373500f70208746573743033373600f80208746573743033373700f90208746573743033373800fa" + "0208746573743033373900fb0208746573743033383000fc0208746573743033383100fd0208746573743033383200" + "fe0208746573743033383300ff02087465737430333834008003087465737430333835008103087465737430333836" + "0082030874657374303338370083030874657374303338380084030874657374303338390085030874657374303339" + "3000860308746573743033393100870308746573743033393200880308746573743033393300890308746573743033" + "3934008a03087465737430333935008b03087465737430333936008c03087465737430333937008d03087465737430" + "333938008e03087465737430333939008f030874657374303430300090030874657374303430310091030874657374" + "3034303200920308746573743034303300930308746573743034303400940308746573743034303500950308746573" + "7430343036009603087465737430343037009703087465737430343038009803087465737430343039009903087465" + "737430343130009a03087465737430343131009b03087465737430343132009c03087465737430343133009d030874" + "65737430343134009e03087465737430343135009f0308746573743034313600a00308746573743034313700a10308" + "746573743034313800a20308746573743034313900a30308746573743034323000a40308746573743034323100a503" + "08746573743034323200a60308746573743034323300a70308746573743034323400a80308746573743034323500a9" + "0308746573743034323600aa0308746573743034323700ab0308746573743034323800ac0308746573743034323900" + "ad0308746573743034333000ae0308746573743034333100af0308746573743034333200b003087465737430343333" + "00b10308746573743034333400b20308746573743034333500b30308746573743034333600b4030874657374303433" + "3700b50308746573743034333800b60308746573743034333900b70308746573743034343000b80308746573743034" + "343100b90308746573743034343200ba0308746573743034343300bb0308746573743034343400bc03087465737430" + "34343500bd0308746573743034343600be0308746573743034343700bf0308746573743034343800c0030874657374" + "3034343900c10308746573743034353000c20308746573743034353100c30308746573743034353200c40308746573" + "743034353300c50308746573743034353400c60308746573743034353500c70308746573743034353600c803087465" + "73743034353700c90308746573743034353800ca0308746573743034353900cb0308746573743034363000cc030874" + "6573743034363100cd0308746573743034363200ce0308746573743034363300cf0308746573743034363400d00308" + "746573743034363500d10308746573743034363600d20308746573743034363700d30308746573743034363800d403" + "08746573743034363900d50308746573743034373000d60308746573743034373100d70308746573743034373200d8" + "0308746573743034373300d90308746573743034373400da0308746573743034373500db0308746573743034373600" + "dc0308746573743034373700dd0308746573743034373800de0308746573743034373900df03087465737430343830" + "00e00308746573743034383100e10308746573743034383200e20308746573743034383300e3030874657374303438" + "3400e40308746573743034383500e50308746573743034383600e60308746573743034383700e70308746573743034" + "383800e80308746573743034383900e90308746573743034393000ea0308746573743034393100eb03087465737430" + "34393200ec0308746573743034393300ed0308746573743034393400ee0308746573743034393500ef030874657374" + "3034393600f00308746573743034393700f10308746573743034393800f20308746573743034393900f30308746573" + "743035303000f40308746573743035303100f50308746573743035303200f60308746573743035303300f703087465" + "73743035303400f80308746573743035303500f90308746573743035303600fa0308746573743035303700fb030874" + "6573743035303800fc0308746573743035303900fd0308746573743035313000fe0308746573743035313100ff0308" + "7465737430353132008004087465737430353133008104087465737430353134008204087465737430353135008304" + "0874657374303531360084040874657374303531370085040874657374303531380086040874657374303531390087" + "04087465737430353230008804087465737430353231008904087465737430353232008a0408746573743035323300" + "8b04087465737430353234008c04087465737430353235008d04087465737430353236008e04087465737430353237" + "008f040874657374303532380090040874657374303532390091040874657374303533300092040874657374303533" + "3100930408746573743035333200940408746573743035333300950408746573743035333400960408746573743035" + "3335009704087465737430353336009804087465737430353337009904087465737430353338009a04087465737430" + "353339009b04087465737430353430009c04087465737430353431009d04087465737430353432009e040874657374" + "30353433009f0408746573743035343400a00408746573743035343500a10408746573743035343600a20408746573" + "743035343700a30408746573743035343800a40408746573743035343900a50408746573743035353000a604087465" + "73743035353100a70408746573743035353200a80408746573743035353300a90408746573743035353400aa040874" + "6573743035353500ab0408746573743035353600ac0408746573743035353700ad0408746573743035353800ae0408" + "746573743035353900af0408746573743035363000b00408746573743035363100b10408746573743035363200b204" + "08746573743035363300b30408746573743035363400b40408746573743035363500b50408746573743035363600b6" + "0408746573743035363700b70408746573743035363800b80408746573743035363900b90408746573743035373000" + "ba0408746573743035373100bb0408746573743035373200bc0408746573743035373300bd04087465737430353734" + "00be0408746573743035373500bf0408746573743035373600c00408746573743035373700c1040874657374303537" + "3800c20408746573743035373900c30408746573743035383000c40408746573743035383100c50408746573743035" + "383200c60408746573743035383300c70408746573743035383400c80408746573743035383500c904087465737430" + "35383600ca0408746573743035383700cb0408746573743035383800cc0408746573743035383900cd040874657374" + "3035393000ce0408746573743035393100cf0408746573743035393200d00408746573743035393300d10408746573" + "743035393400d20408746573743035393500d30408746573743035393600d40408746573743035393700d504087465" + "73743035393800d60408746573743035393900d70408746573743036303000d80408746573743036303100d9040874" + "6573743036303200da0408746573743036303300db0408746573743036303400dc0408746573743036303500dd0408" + "746573743036303600de0408746573743036303700df0408746573743036303800e00408746573743036303900e104" + "08746573743036313000e20408746573743036313100e30408746573743036313200e40408746573743036313300e5" + "0408746573743036313400e60408746573743036313500e70408746573743036313600e80408746573743036313700" + "e90408746573743036313800ea0408746573743036313900eb0408746573743036323000ec04087465737430363231" + "00ed0408746573743036323200ee0408746573743036323300ef0408746573743036323400f0040874657374303632" + "3500f10408746573743036323600f20408746573743036323700f30408746573743036323800f40408746573743036" + "323900f50408746573743036333000f60408746573743036333100f70408746573743036333200f804087465737430" + "36333300f90408746573743036333400fa0408746573743036333500fb0408746573743036333600fc040874657374" + "3036333700fd0408746573743036333800fe0408746573743036333900ff0408746573743036343000800508746573" + "7430363431008105087465737430363432008205087465737430363433008305087465737430363434008405087465" + "7374303634350085050874657374303634360086050874657374303634370087050874657374303634380088050874" + "65737430363439008905087465737430363530008a05087465737430363531008b05087465737430363532008c0508" + "7465737430363533008d05087465737430363534008e05087465737430363535008f05087465737430363536009005" + "0874657374303635370091050874657374303635380092050874657374303635390093050874657374303636300094" + "0508746573743036363100950508746573743036363200960508746573743036363300970508746573743036363400" + "9805087465737430363635009905087465737430363636009a05087465737430363637009b05087465737430363638" + "009c05087465737430363639009d05087465737430363730009e05087465737430363731009f050874657374303637" + "3200a00508746573743036373300a10508746573743036373400a20508746573743036373500a30508746573743036" + "373600a40508746573743036373700a50508746573743036373800a60508746573743036373900a705087465737430" + "36383000a80508746573743036383100a90508746573743036383200aa0508746573743036383300ab050874657374" + "3036383400ac0508746573743036383500ad0508746573743036383600ae0508746573743036383700af0508746573" + "743036383800b00508746573743036383900b10508746573743036393000b20508746573743036393100b305087465" + "73743036393200b40508746573743036393300b50508746573743036393400b60508746573743036393500b7050874" + "6573743036393600b80508746573743036393700b90508746573743036393800ba0508746573743036393900bb0508" + "746573743037303000bc0508746573743037303100bd0508746573743037303200be0508746573743037303300bf05" + "08746573743037303400c00508746573743037303500c10508746573743037303600c20508746573743037303700c3" + "0508746573743037303800c40508746573743037303900c50508746573743037313000c60508746573743037313100" + "c70508746573743037313200c80508746573743037313300c90508746573743037313400ca05087465737430373135" + "00cb0508746573743037313600cc0508746573743037313700cd0508746573743037313800ce050874657374303731" + "3900cf0508746573743037323000d00508746573743037323100d10508746573743037323200d20508746573743037" + "323300d30508746573743037323400d40508746573743037323500d50508746573743037323600d605087465737430" + "37323700d70508746573743037323800d80508746573743037323900d90508746573743037333000da050874657374" + "3037333100db0508746573743037333200dc0508746573743037333300dd0508746573743037333400de0508746573" + "743037333500df0508746573743037333600e00508746573743037333700e10508746573743037333800e205087465" + "73743037333900e30508746573743037343000e40508746573743037343100e50508746573743037343200e6050874" + "6573743037343300e70508746573743037343400e80508746573743037343500e90508746573743037343600ea0508" + "746573743037343700eb0508746573743037343800ec0508746573743037343900ed0508746573743037353000ee05" + "08746573743037353100ef0508746573743037353200f00508746573743037353300f10508746573743037353400f2" + "0508746573743037353500f30508746573743037353600f40508746573743037353700f50508746573743037353800" + "f60508746573743037353900f70508746573743037363000f80508746573743037363100f905087465737430373632" + "00fa0508746573743037363300fb0508746573743037363400fc0508746573743037363500fd050874657374303736" + "3600fe0508746573743037363700ff0508746573743037363800800608746573743037363900810608746573743037" + "3730008206087465737430373731008306087465737430373732008406087465737430373733008506087465737430" + "3737340086060874657374303737350087060874657374303737360088060874657374303737370089060874657374" + "30373738008a06087465737430373739008b06087465737430373830008c06087465737430373831008d0608746573" + "7430373832008e06087465737430373833008f06087465737430373834009006087465737430373835009106087465" + "7374303738360092060874657374303738370093060874657374303738380094060874657374303738390095060874" + "6573743037393000960608746573743037393100970608746573743037393200980608746573743037393300990608" + "7465737430373934009a06087465737430373935009b06087465737430373936009c06087465737430373937009d06" + "087465737430373938009e06087465737430373939009f0608746573743038303000a00608746573743038303100a1" + "0608746573743038303200a20608746573743038303300a30608746573743038303400a40608746573743038303500" + "a50608746573743038303600a60608746573743038303700a70608746573743038303800a806087465737430383039" + "00a90608746573743038313000aa0608746573743038313100ab0608746573743038313200ac060874657374303831" + "3300ad0608746573743038313400ae0608746573743038313500af0608746573743038313600b00608746573743038" + "313700b10608746573743038313800b20608746573743038313900b30608746573743038323000b406087465737430" + "38323100b50608746573743038323200b60608746573743038323300b70608746573743038323400b8060874657374" + "3038323500b90608746573743038323600ba0608746573743038323700bb0608746573743038323800bc0608746573" + "743038323900bd0608746573743038333000be0608746573743038333100bf0608746573743038333200c006087465" + "73743038333300c10608746573743038333400c20608746573743038333500c30608746573743038333600c4060874" + "6573743038333700c50608746573743038333800c60608746573743038333900c70608746573743038343000c80608" + "746573743038343100c90608746573743038343200ca0608746573743038343300cb0608746573743038343400cc06" + "08746573743038343500cd0608746573743038343600ce0608746573743038343700cf0608746573743038343800d0" + "0608746573743038343900d10608746573743038353000d20608746573743038353100d30608746573743038353200" + "d40608746573743038353300d50608746573743038353400d60608746573743038353500d706087465737430383536" + "00d80608746573743038353700d90608746573743038353800da0608746573743038353900db060874657374303836" + "3000dc0608746573743038363100dd0608746573743038363200de0608746573743038363300df0608746573743038" + "363400e00608746573743038363500e10608746573743038363600e20608746573743038363700e306087465737430" + "38363800e40608746573743038363900e50608746573743038373000e60608746573743038373100e7060874657374" + "3038373200e80608746573743038373300e90608746573743038373400ea0608746573743038373500eb0608746573" + "743038373600ec0608746573743038373700ed0608746573743038373800ee0608746573743038373900ef06087465" + "73743038383000f00608746573743038383100f10608746573743038383200f20608746573743038383300f3060874" + "6573743038383400f40608746573743038383500f50608746573743038383600f60608746573743038383700f70608" + "746573743038383800f80608746573743038383900f90608746573743038393000fa0608746573743038393100fb06" + "08746573743038393200fc0608746573743038393300fd0608746573743038393400fe0608746573743038393500ff" + "0608746573743038393600800708746573743038393700810708746573743038393800820708746573743038393900" + "8307087465737430393030008407087465737430393031008507087465737430393032008607087465737430393033" + "008707087465737430393034008807087465737430393035008907087465737430393036008a070874657374303930" + "37008b07087465737430393038008c07087465737430393039008d07087465737430393130008e0708746573743039" + "3131008f07087465737430393132009007087465737430393133009107087465737430393134009207087465737430" + "3931350093070874657374303931360094070874657374303931370095070874657374303931380096070874657374" + "30393139009707087465737430393230009807087465737430393231009907087465737430393232009a0708746573" + "7430393233009b07087465737430393234009c07087465737430393235009d07087465737430393236009e07087465" + "737430393237009f0708746573743039323800a00708746573743039323900a10708746573743039333000a2070874" + "6573743039333100a30708746573743039333200a40708746573743039333300a50708746573743039333400a60708" + "746573743039333500a70708746573743039333600a80708746573743039333700a90708746573743039333800aa07" + "08746573743039333900ab0708746573743039343000ac0708746573743039343100ad0708746573743039343200ae" + "0708746573743039343300af0708746573743039343400b00708746573743039343500b10708746573743039343600" + "b20708746573743039343700b30708746573743039343800b40708746573743039343900b507087465737430393530" + "00b60708746573743039353100b70708746573743039353200b80708746573743039353300b9070874657374303935" + "3400ba0708746573743039353500bb0708746573743039353600bc0708746573743039353700bd0708746573743039" + "353800be0708746573743039353900bf0708746573743039363000c00708746573743039363100c107087465737430" + "39363200c20708746573743039363300c30708746573743039363400c40708746573743039363500c5070874657374" + "3039363600c60708746573743039363700c70708746573743039363800c80708746573743039363900c90708746573" + "743039373000ca0708746573743039373100cb0708746573743039373200cc0708746573743039373300cd07087465" + "73743039373400ce0708746573743039373500cf0708746573743039373600d00708746573743039373700d1070874" + "6573743039373800d20708746573743039373900d30708746573743039383000d40708746573743039383100d50708" + "746573743039383200d60708746573743039383300d70708746573743039383400d80708746573743039383500d907" + "08746573743039383600da0708746573743039383700db0708746573743039383800dc0708746573743039383900dd" + "0708746573743039393000de0708746573743039393100df0708746573743039393200e00708746573743039393300" + "e10708746573743039393400e20708746573743039393500e30708746573743039393600e407087465737430393937" + "00e50708746573743039393800e60708746573743039393900e70708746573743130303000e8070874657374313030" + "3100e90708746573743130303200ea0708746573743130303300eb0708746573743130303400ec0708746573743130" + "303500ed0708746573743130303600ee0708746573743130303700ef0708746573743130303800f007087465737431" + "30303900f10708746573743130313000f20708746573743130313100f30708746573743130313200f4070874657374" + "3130313300f50708746573743130313400f60708746573743130313500f70708746573743130313600f80708746573" + "743130313700f90708746573743130313800fa0708746573743130313900fb0708746573743130323000fc07087465" + "73743130323100fd0708746573743130323200fe0708746573743130323300ff070874657374313032340080080874" + "6573743130323500810808746573743130323600820808746573743130323700830808746573743130323800840808" + "7465737431303239008508087465737431303330008608087465737431303331008708087465737431303332008808" + "087465737431303333008908087465737431303334008a08087465737431303335008b08087465737431303336008c" + "08087465737431303337008d08087465737431303338008e08087465737431303339008f0808746573743130343000" + "9008087465737431303431009108087465737431303432009208087465737431303433009308087465737431303434" + "0094080874657374313034350095080874657374313034360096080874657374313034370097080874657374313034" + "38009808087465737431303439009908087465737431303530009a08087465737431303531009b0808746573743130" + "3532009c08087465737431303533009d08087465737431303534009e08087465737431303535009f08087465737431" + "30353600a00808746573743130353700a10808746573743130353800a20808746573743130353900a3080874657374" + "3130363000a40808746573743130363100a50808746573743130363200a60808746573743130363300a70808746573" + "743130363400a80808746573743130363500a90808746573743130363600aa0808746573743130363700ab08087465" + "73743130363800ac0808746573743130363900ad0808746573743130373000ae0808746573743130373100af080874" + "6573743130373200b00808746573743130373300b10808746573743130373400b20808746573743130373500b30808" + "746573743130373600b40808746573743130373700b50808746573743130373800b60808746573743130373900b708" + "08746573743130383000b80808746573743130383100b90808746573743130383200ba0808746573743130383300bb" + "0808746573743130383400bc0808746573743130383500bd0808746573743130383600be0808746573743130383700" + "bf0808746573743130383800c00808746573743130383900c10808746573743130393000c208087465737431303931" + "00c30808746573743130393200c40808746573743130393300c50808746573743130393400c6080874657374313039" + "3500c70808746573743130393600c80808746573743130393700c90808746573743130393800ca0808746573743130" + "393900cb0808746573743131303000cc0808746573743131303100cd0808746573743131303200ce08087465737431" + "31303300cf0808746573743131303400d00808746573743131303500d10808746573743131303600d2080874657374" + "3131303700d30808746573743131303800d40808746573743131303900d50808746573743131313000d60808746573" + "743131313100d70808746573743131313200d80808746573743131313300d90808746573743131313400da08087465" + "73743131313500db0808746573743131313600dc0808746573743131313700dd0808746573743131313800de080874" + "6573743131313900df0808746573743131323000e00808746573743131323100e10808746573743131323200e20808" + "746573743131323300e30808746573743131323400e40808746573743131323500e50808746573743131323600e608" + "08746573743131323700e70808746573743131323800e80808746573743131323900e90808746573743131333000ea" + "0808746573743131333100eb0808746573743131333200ec0808746573743131333300ed0808746573743131333400" + "ee0808746573743131333500ef0808746573743131333600f00808746573743131333700f108087465737431313338" + "00f20808746573743131333900f30808746573743131343000f40808746573743131343100f5080874657374313134" + "3200f60808746573743131343300f70808746573743131343400f80808746573743131343500f90808746573743131" + "343600fa0808746573743131343700fb0808746573743131343800fc0808746573743131343900fd08087465737431" + "31353000fe0808746573743131353100ff080874657374313135320080090874657374313135330081090874657374" + "3131353400820908746573743131353500830908746573743131353600840908746573743131353700850908746573" + "7431313538008609087465737431313539008709087465737431313630008809087465737431313631008909087465" + "737431313632008a09087465737431313633008b09087465737431313634008c09087465737431313635008d090874" + "65737431313636008e09087465737431313637008f0908746573743131363800900908746573743131363900910908" + "7465737431313730009209087465737431313731009309087465737431313732009409087465737431313733009509" + "0874657374313137340096090874657374313137350097090874657374313137360098090874657374313137370099" + "09087465737431313738009a09087465737431313739009b09087465737431313830009c0908746573743131383100" + "9d09087465737431313832009e09087465737431313833009f0908746573743131383400a009087465737431313835" + "00a10908746573743131383600a20908746573743131383700a30908746573743131383800a4090874657374313138" + "3900a50908746573743131393000a60908746573743131393100a70908746573743131393200a80908746573743131" + "393300a90908746573743131393400aa0908746573743131393500ab0908746573743131393600ac09087465737431" + "31393700ad0908746573743131393800ae0908746573743131393900af0908746573743132303000b0090874657374" + "3132303100b10908746573743132303200b20908746573743132303300b30908746573743132303400b40908746573" + "743132303500b50908746573743132303600b60908746573743132303700b70908746573743132303800b809087465" + "73743132303900b90908746573743132313000ba0908746573743132313100bb0908746573743132313200bc090874" + "6573743132313300bd0908746573743132313400be0908746573743132313500bf0908746573743132313600c00908" + "746573743132313700c10908746573743132313800c20908746573743132313900c30908746573743132323000c409" + "08746573743132323100c50908746573743132323200c60908746573743132323300c70908746573743132323400c8" + "0908746573743132323500c90908746573743132323600ca0908746573743132323700cb0908746573743132323800" + "cc0908746573743132323900cd0908746573743132333000ce0908746573743132333100cf09087465737431323332" + "00d00908746573743132333300d10908746573743132333400d20908746573743132333500d3090874657374313233" + "3600d40908746573743132333700d50908746573743132333800d60908746573743132333900d70908746573743132" + "343000d80908746573743132343100d90908746573743132343200da0908746573743132343300db09087465737431" + "32343400dc0908746573743132343500dd0908746573743132343600de0908746573743132343700df090874657374" + "3132343800e00908746573743132343900e10908746573743132353000e20908746573743132353100e30908746573" + "743132353200e40908746573743132353300e50908746573743132353400e60908746573743132353500e709087465" + "73743132353600e80908746573743132353700e90908746573743132353800ea0908746573743132353900eb090874" + "6573743132363000ec0908746573743132363100ed0908746573743132363200ee0908746573743132363300ef0908" + "746573743132363400f00908746573743132363500f10908746573743132363600f20908746573743132363700f309" + "08746573743132363800f40908746573743132363900f50908746573743132373000f60908746573743132373100f7" + "0908746573743132373200f80908746573743132373300f90908746573743132373400fa0908746573743132373500" + "fb0908746573743132373600fc0908746573743132373700fd0908746573743132373800fe09087465737431323739" + "00ff0908746573743132383000800a08746573743132383100810a08746573743132383200820a0874657374313238" + "3300830a08746573743132383400840a08746573743132383500850a08746573743132383600860a08746573743132" + "383700870a08746573743132383800880a08746573743132383900890a087465737431323930008a0a087465737431" + "323931008b0a087465737431323932008c0a087465737431323933008d0a087465737431323934008e0a0874657374" + "31323935008f0a08746573743132393600900a08746573743132393700910a08746573743132393800920a08746573" + "743132393900930a08746573743133303000940a08746573743133303100950a08746573743133303200960a087465" + "73743133303300970a08746573743133303400980a08746573743133303500990a087465737431333036009a0a0874" + "65737431333037009b0a087465737431333038009c0a087465737431333039009d0a087465737431333130009e0a08" + "7465737431333131009f0a08746573743133313200a00a08746573743133313300a10a08746573743133313400a20a" + "08746573743133313500a30a08746573743133313600a40a08746573743133313700a50a08746573743133313800a6" + "0a08746573743133313900a70a08746573743133323000a80a08746573743133323100a90a08746573743133323200" + "aa0a08746573743133323300ab0a08746573743133323400ac0a08746573743133323500ad0a087465737431333236" + "00ae0a08746573743133323700af0a08746573743133323800b00a08746573743133323900b10a0874657374313333" + "3000b20a08746573743133333100b30a08746573743133333200b40a08746573743133333300b50a08746573743133" + "333400b60a08746573743133333500b70a08746573743133333600b80a08746573743133333700b90a087465737431" + "33333800ba0a08746573743133333900bb0a08746573743133343000bc0a08746573743133343100bd0a0874657374" + "3133343200be0a08746573743133343300bf0a08746573743133343400c00a08746573743133343500c10a08746573" + "743133343600c20a08746573743133343700c30a08746573743133343800c40a08746573743133343900c50a087465" + "73743133353000c60a08746573743133353100c70a08746573743133353200c80a08746573743133353300c90a0874" + "6573743133353400ca0a08746573743133353500cb0a08746573743133353600cc0a08746573743133353700cd0a08" + "746573743133353800ce0a08746573743133353900cf0a08746573743133363000d00a08746573743133363100d10a" + "08746573743133363200d20a08746573743133363300d30a08746573743133363400d40a08746573743133363500d5" + "0a08746573743133363600d60a08746573743133363700d70a08746573743133363800d80a08746573743133363900" + "d90a08746573743133373000da0a08746573743133373100db0a08746573743133373200dc0a087465737431333733" + "00dd0a08746573743133373400de0a08746573743133373500df0a08746573743133373600e00a0874657374313337" + "3700e10a08746573743133373800e20a08746573743133373900e30a08746573743133383000e40a08746573743133" + "383100e50a08746573743133383200e60a08746573743133383300e70a08746573743133383400e80a087465737431" + "33383500e90a08746573743133383600ea0a08746573743133383700eb0a08746573743133383800ec0a0874657374" + "3133383900ed0a08746573743133393000ee0a08746573743133393100ef0a08746573743133393200f00a08746573" + "743133393300f10a08746573743133393400f20a08746573743133393500f30a08746573743133393600f40a087465" + "73743133393700f50a08746573743133393800f60a08746573743133393900f70a08746573743134303000f80a0874" + "6573743134303100f90a08746573743134303200fa0a08746573743134303300fb0a08746573743134303400fc0a08" + "746573743134303500fd0a08746573743134303600fe0a08746573743134303700ff0a08746573743134303800800b" + "08746573743134303900810b08746573743134313000820b08746573743134313100830b0874657374313431320084" + "0b08746573743134313300850b08746573743134313400860b08746573743134313500870b08746573743134313600" + "880b08746573743134313700890b087465737431343138008a0b087465737431343139008b0b087465737431343230" + "008c0b087465737431343231008d0b087465737431343232008e0b087465737431343233008f0b0874657374313432" + "3400900b08746573743134323500910b08746573743134323600920b08746573743134323700930b08746573743134" + "323800940b08746573743134323900950b08746573743134333000960b08746573743134333100970b087465737431" + "34333200980b08746573743134333300990b087465737431343334009a0b087465737431343335009b0b0874657374" + "31343336009c0b087465737431343337009d0b087465737431343338009e0b087465737431343339009f0b08746573" + "743134343000a00b08746573743134343100a10b08746573743134343200a20b08746573743134343300a30b087465" + "73743134343400a40b08746573743134343500a50b08746573743134343600a60b08746573743134343700a70b0874" + "6573743134343800a80b08746573743134343900a90b08746573743134353000aa0b08746573743134353100ab0b08" + "746573743134353200ac0b08746573743134353300ad0b08746573743134353400ae0b08746573743134353500af0b" + "08746573743134353600b00b08746573743134353700b10b08746573743134353800b20b08746573743134353900b3" + "0b08746573743134363000b40b08746573743134363100b50b08746573743134363200b60b08746573743134363300" + "b70b08746573743134363400b80b08746573743134363500b90b08746573743134363600ba0b087465737431343637" + "00bb0b08746573743134363800bc0b08746573743134363900bd0b08746573743134373000be0b0874657374313437" + "3100bf0b08746573743134373200c00b08746573743134373300c10b08746573743134373400c20b08746573743134" + "373500c30b08746573743134373600c40b08746573743134373700c50b08746573743134373800c60b087465737431" + "34373900c70b08746573743134383000c80b08746573743134383100c90b08746573743134383200ca0b0874657374" + "3134383300cb0b08746573743134383400cc0b08746573743134383500cd0b08746573743134383600ce0b08746573" + "743134383700cf0b08746573743134383800d00b08746573743134383900d10b08746573743134393000d20b087465" + "73743134393100d30b08746573743134393200d40b08746573743134393300d50b08746573743134393400d60b0874" + "6573743134393500d70b08746573743134393600d80b08746573743134393700d90b08746573743134393800da0b08" + "746573743134393900db0b08746573743135303000dc0b08746573743135303100dd0b08746573743135303200de0b" + "08746573743135303300df0b08746573743135303400e00b08746573743135303500e10b08746573743135303600e2" + "0b08746573743135303700e30b08746573743135303800e40b08746573743135303900e50b08746573743135313000" + "e60b08746573743135313100e70b08746573743135313200e80b08746573743135313300e90b087465737431353134" + "00ea0b08746573743135313500eb0b08746573743135313600ec0b08746573743135313700ed0b0874657374313531" + "3800ee0b08746573743135313900ef0b08746573743135323000f00b08746573743135323100f10b08746573743135" + "323200f20b08746573743135323300f30b08746573743135323400f40b08746573743135323500f50b087465737431" + "35323600f60b08746573743135323700f70b08746573743135323800f80b08746573743135323900f90b0874657374" + "3135333000fa0b08746573743135333100fb0b08746573743135333200fc0b08746573743135333300fd0b08746573" + "743135333400fe0b08746573743135333500ff0b08746573743135333600800c08746573743135333700810c087465" + "73743135333800820c08746573743135333900830c08746573743135343000840c08746573743135343100850c0874" + "6573743135343200860c08746573743135343300870c08746573743135343400880c08746573743135343500890c08" + "7465737431353436008a0c087465737431353437008b0c087465737431353438008c0c087465737431353439008d0c" + "087465737431353530008e0c087465737431353531008f0c08746573743135353200900c0874657374313535330091" + "0c08746573743135353400920c08746573743135353500930c08746573743135353600940c08746573743135353700" + "950c08746573743135353800960c08746573743135353900970c08746573743135363000980c087465737431353631" + "00990c087465737431353632009a0c087465737431353633009b0c087465737431353634009c0c0874657374313536" + "35009d0c087465737431353636009e0c087465737431353637009f0c08746573743135363800a00c08746573743135" + "363900a10c08746573743135373000a20c08746573743135373100a30c08746573743135373200a40c087465737431" + "35373300a50c08746573743135373400a60c08746573743135373500a70c08746573743135373600a80c0874657374" + "3135373700a90c08746573743135373800aa0c08746573743135373900ab0c08746573743135383000ac0c08746573" + "743135383100ad0c08746573743135383200ae0c08746573743135383300af0c08746573743135383400b00c087465" + "73743135383500b10c08746573743135383600b20c08746573743135383700b30c08746573743135383800b40c0874" + "6573743135383900b50c08746573743135393000b60c08746573743135393100b70c08746573743135393200b80c08" + "746573743135393300b90c08746573743135393400ba0c08746573743135393500bb0c08746573743135393600bc0c" + "08746573743135393700bd0c08746573743135393800be0c08746573743135393900bf0c08746573743136303000c0" + "0c08746573743136303100c10c08746573743136303200c20c08746573743136303300c30c08746573743136303400" + "c40c08746573743136303500c50c08746573743136303600c60c08746573743136303700c70c087465737431363038" + "00c80c08746573743136303900c90c08746573743136313000ca0c08746573743136313100cb0c0874657374313631" + "3200cc0c08746573743136313300cd0c08746573743136313400ce0c08746573743136313500cf0c08746573743136" + "313600d00c08746573743136313700d10c08746573743136313800d20c08746573743136313900d30c087465737431" + "36323000d40c08746573743136323100d50c08746573743136323200d60c08746573743136323300d70c0874657374" + "3136323400d80c08746573743136323500d90c08746573743136323600da0c08746573743136323700db0c08746573" + "743136323800dc0c08746573743136323900dd0c08746573743136333000de0c08746573743136333100df0c087465" + "73743136333200e00c08746573743136333300e10c08746573743136333400e20c08746573743136333500e30c0874" + "6573743136333600e40c08746573743136333700e50c08746573743136333800e60c08746573743136333900e70c08" + "746573743136343000e80c08746573743136343100e90c08746573743136343200ea0c08746573743136343300eb0c" + "08746573743136343400ec0c08746573743136343500ed0c08746573743136343600ee0c08746573743136343700ef" + "0c08746573743136343800f00c08746573743136343900f10c08746573743136353000f20c08746573743136353100" + "f30c08746573743136353200f40c08746573743136353300f50c08746573743136353400f60c087465737431363535" + "00f70c08746573743136353600f80c08746573743136353700f90c08746573743136353800fa0c0874657374313635" + "3900fb0c08746573743136363000fc0c08746573743136363100fd0c08746573743136363200fe0c08746573743136" + "363300ff0c08746573743136363400800d08746573743136363500810d08746573743136363600820d087465737431" + "36363700830d08746573743136363800840d08746573743136363900850d08746573743136373000860d0874657374" + "3136373100870d08746573743136373200880d08746573743136373300890d087465737431363734008a0d08746573" + "7431363735008b0d087465737431363736008c0d087465737431363737008d0d087465737431363738008e0d087465" + "737431363739008f0d08746573743136383000900d08746573743136383100910d08746573743136383200920d0874" + "6573743136383300930d08746573743136383400940d08746573743136383500950d08746573743136383600960d08" + "746573743136383700970d08746573743136383800980d08746573743136383900990d087465737431363930009a0d" + "087465737431363931009b0d087465737431363932009c0d087465737431363933009d0d087465737431363934009e" + "0d087465737431363935009f0d08746573743136393600a00d08746573743136393700a10d08746573743136393800" + "a20d08746573743136393900a30d08746573743137303000a40d08746573743137303100a50d087465737431373032" + "00a60d08746573743137303300a70d08746573743137303400a80d08746573743137303500a90d0874657374313730" + "3600aa0d08746573743137303700ab0d08746573743137303800ac0d08746573743137303900ad0d08746573743137" + "313000ae0d08746573743137313100af0d08746573743137313200b00d08746573743137313300b10d087465737431" + "37313400b20d08746573743137313500b30d08746573743137313600b40d08746573743137313700b50d0874657374" + "3137313800b60d08746573743137313900b70d08746573743137323000b80d08746573743137323100b90d08746573" + "743137323200ba0d08746573743137323300bb0d08746573743137323400bc0d08746573743137323500bd0d087465" + "73743137323600be0d08746573743137323700bf0d08746573743137323800c00d08746573743137323900c10d0874" + "6573743137333000c20d08746573743137333100c30d08746573743137333200c40d08746573743137333300c50d08" + "746573743137333400c60d08746573743137333500c70d08746573743137333600c80d08746573743137333700c90d" + "08746573743137333800ca0d08746573743137333900cb0d08746573743137343000cc0d08746573743137343100cd" + "0d08746573743137343200ce0d08746573743137343300cf0d08746573743137343400d00d08746573743137343500" + "d10d08746573743137343600d20d08746573743137343700d30d08746573743137343800d40d087465737431373439" + "00d50d08746573743137353000d60d08746573743137353100d70d08746573743137353200d80d0874657374313735" + "3300d90d08746573743137353400da0d08746573743137353500db0d08746573743137353600dc0d08746573743137" + "353700dd0d08746573743137353800de0d08746573743137353900df0d08746573743137363000e00d087465737431" + "37363100e10d08746573743137363200e20d08746573743137363300e30d08746573743137363400e40d0874657374" + "3137363500e50d08746573743137363600e60d08746573743137363700e70d08746573743137363800e80d08746573" + "743137363900e90d08746573743137373000ea0d08746573743137373100eb0d08746573743137373200ec0d087465" + "73743137373300ed0d08746573743137373400ee0d08746573743137373500ef0d08746573743137373600f00d0874" + "6573743137373700f10d08746573743137373800f20d08746573743137373900f30d08746573743137383000f40d08" + "746573743137383100f50d08746573743137383200f60d08746573743137383300f70d08746573743137383400f80d" + "08746573743137383500f90d08746573743137383600fa0d08746573743137383700fb0d08746573743137383800fc" + "0d08746573743137383900fd0d08746573743137393000fe0d08746573743137393100ff0d08746573743137393200" + "800e08746573743137393300810e08746573743137393400820e08746573743137393500830e087465737431373936" + "00840e08746573743137393700850e08746573743137393800860e08746573743137393900870e0874657374313830" + "3000880e08746573743138303100890e087465737431383032008a0e087465737431383033008b0e08746573743138" + "3034008c0e087465737431383035008d0e087465737431383036008e0e087465737431383037008f0e087465737431" + "38303800900e08746573743138303900910e08746573743138313000920e08746573743138313100930e0874657374" + "3138313200940e08746573743138313300950e08746573743138313400960e08746573743138313500970e08746573" + "743138313600980e08746573743138313700990e087465737431383138009a0e087465737431383139009b0e087465" + "737431383230009c0e087465737431383231009d0e087465737431383232009e0e087465737431383233009f0e0874" + "6573743138323400a00e08746573743138323500a10e08746573743138323600a20e08746573743138323700a30e08" + "746573743138323800a40e08746573743138323900a50e08746573743138333000a60e08746573743138333100a70e" + "08746573743138333200a80e08746573743138333300a90e08746573743138333400aa0e08746573743138333500ab" + "0e08746573743138333600ac0e08746573743138333700ad0e08746573743138333800ae0e08746573743138333900" + "af0e08746573743138343000b00e08746573743138343100b10e08746573743138343200b20e087465737431383433" + "00b30e08746573743138343400b40e08746573743138343500b50e08746573743138343600b60e0874657374313834" + "3700b70e08746573743138343800b80e08746573743138343900b90e08746573743138353000ba0e08746573743138" + "353100bb0e08746573743138353200bc0e08746573743138353300bd0e08746573743138353400be0e087465737431" + "38353500bf0e08746573743138353600c00e08746573743138353700c10e08746573743138353800c20e0874657374" + "3138353900c30e08746573743138363000c40e08746573743138363100c50e08746573743138363200c60e08746573" + "743138363300c70e08746573743138363400c80e08746573743138363500c90e08746573743138363600ca0e087465" + "73743138363700cb0e08746573743138363800cc0e08746573743138363900cd0e08746573743138373000ce0e0874" + "6573743138373100cf0e08746573743138373200d00e08746573743138373300d10e08746573743138373400d20e08" + "746573743138373500d30e08746573743138373600d40e08746573743138373700d50e08746573743138373800d60e" + "08746573743138373900d70e08746573743138383000d80e08746573743138383100d90e08746573743138383200da" + "0e08746573743138383300db0e08746573743138383400dc0e08746573743138383500dd0e08746573743138383600" + "de0e08746573743138383700df0e08746573743138383800e00e08746573743138383900e10e087465737431383930" + "00e20e08746573743138393100e30e08746573743138393200e40e08746573743138393300e50e0874657374313839" + "3400e60e08746573743138393500e70e08746573743138393600e80e08746573743138393700e90e08746573743138" + "393800ea0e08746573743138393900eb0e08746573743139303000ec0e08746573743139303100ed0e087465737431" + "39303200ee0e08746573743139303300ef0e08746573743139303400f00e08746573743139303500f10e0874657374" + "3139303600f20e08746573743139303700f30e08746573743139303800f40e08746573743139303900f50e08746573" + "743139313000f60e08746573743139313100f70e08746573743139313200f80e08746573743139313300f90e087465" + "73743139313400fa0e08746573743139313500fb0e08746573743139313600fc0e08746573743139313700fd0e0874" + "6573743139313800fe0e08746573743139313900ff0e08746573743139323000800f08746573743139323100810f08" + "746573743139323200820f08746573743139323300830f08746573743139323400840f08746573743139323500850f" + "08746573743139323600860f08746573743139323700870f08746573743139323800880f0874657374313932390089" + "0f087465737431393330008a0f087465737431393331008b0f087465737431393332008c0f08746573743139333300" + "8d0f087465737431393334008e0f087465737431393335008f0f08746573743139333600900f087465737431393337" + "00910f08746573743139333800920f08746573743139333900930f08746573743139343000940f0874657374313934" + "3100950f08746573743139343200960f08746573743139343300970f08746573743139343400980f08746573743139" + "343500990f087465737431393436009a0f087465737431393437009b0f087465737431393438009c0f087465737431" + "393439009d0f087465737431393530009e0f087465737431393531009f0f08746573743139353200a00f0874657374" + "3139353300a10f08746573743139353400a20f08746573743139353500a30f08746573743139353600a40f08746573" + "743139353700a50f08746573743139353800a60f08746573743139353900a70f08746573743139363000a80f087465" + "73743139363100a90f08746573743139363200aa0f08746573743139363300ab0f08746573743139363400ac0f0874" + "6573743139363500ad0f08746573743139363600ae0f08746573743139363700af0f08746573743139363800b00f08" + "746573743139363900b10f08746573743139373000b20f08746573743139373100b30f08746573743139373200b40f" + "08746573743139373300b50f08746573743139373400b60f08746573743139373500b70f08746573743139373600b8" + "0f08746573743139373700b90f08746573743139373800ba0f08746573743139373900bb0f08746573743139383000" + "bc0f08746573743139383100bd0f08746573743139383200be0f08746573743139383300bf0f087465737431393834" + "00c00f08746573743139383500c10f08746573743139383600c20f08746573743139383700c30f0874657374313938" + "3800c40f08746573743139383900c50f08746573743139393000c60f08746573743139393100c70f08746573743139" + "393200c80f08746573743139393300c90f08746573743139393400ca0f08746573743139393500cb0f087465737431" + "39393600cc0f08746573743139393700cd0f08746573743139393800ce0f08746573743139393900cf0f0874657374" + "3230303000d00f08746573743230303100d10f08746573743230303200d20f08746573743230303300d30f08746573" + "743230303400d40f08746573743230303500d50f08746573743230303600d60f08746573743230303700d70f087465" + "73743230303800d80f08746573743230303900d90f08746573743230313000da0f08746573743230313100db0f0874" + "6573743230313200dc0f08746573743230313300dd0f08746573743230313400de0f08746573743230313500df0f08" + "746573743230313600e00f08746573743230313700e10f08746573743230313800e20f08746573743230313900e30f" + "08746573743230323000e40f08746573743230323100e50f08746573743230323200e60f08746573743230323300e7" + "0f08746573743230323400e80f08746573743230323500e90f08746573743230323600ea0f08746573743230323700" + "eb0f08746573743230323800ec0f08746573743230323900ed0f08746573743230333000ee0f087465737432303331" + "00ef0f08746573743230333200f00f08746573743230333300f10f08746573743230333400f20f0874657374323033" + "3500f30f08746573743230333600f40f08746573743230333700f50f08746573743230333800f60f08746573743230" + "333900f70f08746573743230343000f80f08746573743230343100f90f08746573743230343200fa0f087465737432" + "30343300fb0f08746573743230343400fc0f08746573743230343500fd0f08746573743230343600fe0f0874657374" + "3230343700ff0f08746573743230343800801008746573743230343900811008746573743230353000821008746573" + "7432303531008310087465737432303532008410087465737432303533008510087465737432303534008610087465" + "737432303535008710087465737432303536008810087465737432303537008910087465737432303538008a100874" + "65737432303539008b10087465737432303630008c10087465737432303631008d10087465737432303632008e1008" + "7465737432303633008f10087465737432303634009010087465737432303635009110087465737432303636009210" + "0874657374323036370093100874657374323036380094100874657374323036390095100874657374323037300096" + "1008746573743230373100971008746573743230373200981008746573743230373300991008746573743230373400" + "9a10087465737432303735009b10087465737432303736009c10087465737432303737009d10087465737432303738" + "009e10087465737432303739009f1008746573743230383000a01008746573743230383100a1100874657374323038" + "3200a21008746573743230383300a31008746573743230383400a41008746573743230383500a51008746573743230" + "383600a61008746573743230383700a71008746573743230383800a81008746573743230383900a910087465737432" + "30393000aa1008746573743230393100ab1008746573743230393200ac1008746573743230393300ad100874657374" + "3230393400ae1008746573743230393500af1008746573743230393600b01008746573743230393700b11008746573" + "743230393800b21008746573743230393900b31008746573743231303000b41008746573743231303100b510087465" + "73743231303200b61008746573743231303300b71008746573743231303400b81008746573743231303500b9100874" + "6573743231303600ba1008746573743231303700bb1008746573743231303800bc1008746573743231303900bd1008" + "746573743231313000be1008746573743231313100bf1008746573743231313200c01008746573743231313300c110" + "08746573743231313400c21008746573743231313500c31008746573743231313600c41008746573743231313700c5" + "1008746573743231313800c61008746573743231313900c71008746573743231323000c81008746573743231323100" + "c91008746573743231323200ca1008746573743231323300cb1008746573743231323400cc10087465737432313235" + "00cd1008746573743231323600ce1008746573743231323700cf1008746573743231323800d0100874657374323132" + "3900d11008746573743231333000d21008746573743231333100d31008746573743231333200d41008746573743231" + "333300d51008746573743231333400d61008746573743231333500d71008746573743231333600d810087465737432" + "31333700d91008746573743231333800da1008746573743231333900db1008746573743231343000dc100874657374" + "3231343100dd1008746573743231343200de1008746573743231343300df1008746573743231343400e01008746573" + "743231343500e11008746573743231343600e21008746573743231343700e31008746573743231343800e410087465" + "73743231343900e51008746573743231353000e61008746573743231353100e71008746573743231353200e8100874" + "6573743231353300e91008746573743231353400ea1008746573743231353500eb1008746573743231353600ec1008" + "746573743231353700ed1008746573743231353800ee1008746573743231353900ef1008746573743231363000f010" + "08746573743231363100f11008746573743231363200f21008746573743231363300f31008746573743231363400f4" + "1008746573743231363500f51008746573743231363600f61008746573743231363700f71008746573743231363800" + "f81008746573743231363900f91008746573743231373000fa1008746573743231373100fb10087465737432313732" + "00fc1008746573743231373300fd1008746573743231373400fe1008746573743231373500ff100874657374323137" + "3600801108746573743231373700811108746573743231373800821108746573743231373900831108746573743231" + "3830008411087465737432313831008511087465737432313832008611087465737432313833008711087465737432" + "313834008811087465737432313835008911087465737432313836008a11087465737432313837008b110874657374" + "32313838008c11087465737432313839008d11087465737432313930008e11087465737432313931008f1108746573" + "7432313932009011087465737432313933009111087465737432313934009211087465737432313935009311087465" + "7374323139360094110874657374323139370095110874657374323139380096110874657374323139390097110874" + "65737432323030009811087465737432323031009911087465737432323032009a11087465737432323033009b1108" + "7465737432323034009c11087465737432323035009d11087465737432323036009e11087465737432323037009f11" + "08746573743232303800a01108746573743232303900a11108746573743232313000a21108746573743232313100a3" + "1108746573743232313200a41108746573743232313300a51108746573743232313400a61108746573743232313500" + "a71108746573743232313600a81108746573743232313700a91108746573743232313800aa11087465737432323139" + "00ab1108746573743232323000ac1108746573743232323100ad1108746573743232323200ae110874657374323232" + "3300af1108746573743232323400b01108746573743232323500b11108746573743232323600b21108746573743232" + "323700b31108746573743232323800b41108746573743232323900b51108746573743232333000b611087465737432" + "32333100b71108746573743232333200b81108746573743232333300b91108746573743232333400ba110874657374" + "3232333500bb1108746573743232333600bc1108746573743232333700bd1108746573743232333800be1108746573" + "743232333900bf1108746573743232343000c01108746573743232343100c11108746573743232343200c211087465" + "73743232343300c31108746573743232343400c41108746573743232343500c51108746573743232343600c6110874" + "6573743232343700c71108746573743232343800c81108746573743232343900c91108746573743232353000ca1108" + "746573743232353100cb1108746573743232353200cc1108746573743232353300cd1108746573743232353400ce11" + "08746573743232353500cf1108746573743232353600d01108746573743232353700d11108746573743232353800d2" + "1108746573743232353900d31108746573743232363000d41108746573743232363100d51108746573743232363200" + "d61108746573743232363300d71108746573743232363400d81108746573743232363500d911087465737432323636" + "00da1108746573743232363700db1108746573743232363800dc1108746573743232363900dd110874657374323237" + "3000de1108746573743232373100df1108746573743232373200e01108746573743232373300e11108746573743232" + "373400e21108746573743232373500e31108746573743232373600e41108746573743232373700e511087465737432" + "32373800e61108746573743232373900e71108746573743232383000e81108746573743232383100e9110874657374" + "3232383200ea1108746573743232383300eb1108746573743232383400ec1108746573743232383500ed1108746573" + "743232383600ee1108746573743232383700ef1108746573743232383800f01108746573743232383900f111087465" + "73743232393000f21108746573743232393100f31108746573743232393200f41108746573743232393300f5110874" + "6573743232393400f61108746573743232393500f71108746573743232393600f81108746573743232393700f91108" + "746573743232393800fa1108746573743232393900fb1108746573743233303000fc1108746573743233303100fd11" + "08746573743233303200fe1108746573743233303300ff110874657374323330340080120874657374323330350081" + "1208746573743233303600821208746573743233303700831208746573743233303800841208746573743233303900" + "8512087465737432333130008612087465737432333131008712087465737432333132008812087465737432333133" + "008912087465737432333134008a12087465737432333135008b12087465737432333136008c120874657374323331" + "37008d12087465737432333138008e12087465737432333139008f1208746573743233323000901208746573743233" + "3231009112087465737432333232009212087465737432333233009312087465737432333234009412087465737432" + "3332350095120874657374323332360096120874657374323332370097120874657374323332380098120874657374" + "32333239009912087465737432333330009a12087465737432333331009b12087465737432333332009c1208746573" + "7432333333009d12087465737432333334009e12087465737432333335009f1208746573743233333600a012087465" + "73743233333700a11208746573743233333800a21208746573743233333900a31208746573743233343000a4120874" + "6573743233343100a51208746573743233343200a61208746573743233343300a71208746573743233343400a81208" + "746573743233343500a91208746573743233343600aa1208746573743233343700ab1208746573743233343800ac12" + "08746573743233343900ad1208746573743233353000ae1208746573743233353100af1208746573743233353200b0" + "1208746573743233353300b11208746573743233353400b21208746573743233353500b31208746573743233353600" + "b41208746573743233353700b51208746573743233353800b61208746573743233353900b712087465737432333630" + "00b81208746573743233363100b91208746573743233363200ba1208746573743233363300bb120874657374323336" + "3400bc1208746573743233363500bd1208746573743233363600be1208746573743233363700bf1208746573743233" + "363800c01208746573743233363900c11208746573743233373000c21208746573743233373100c312087465737432" + "33373200c41208746573743233373300c51208746573743233373400c61208746573743233373500c7120874657374" + "3233373600c81208746573743233373700c91208746573743233373800ca1208746573743233373900cb1208746573" + "743233383000cc1208746573743233383100cd1208746573743233383200ce1208746573743233383300cf12087465" + "73743233383400d01208746573743233383500d11208746573743233383600d21208746573743233383700d3120874" + "6573743233383800d41208746573743233383900d51208746573743233393000d61208746573743233393100d71208" + "746573743233393200d81208746573743233393300d91208746573743233393400da1208746573743233393500db12" + "08746573743233393600dc1208746573743233393700dd1208746573743233393800de1208746573743233393900df" + "1208746573743234303000e01208746573743234303100e11208746573743234303200e21208746573743234303300" + "e31208746573743234303400e41208746573743234303500e51208746573743234303600e612087465737432343037" + "00e71208746573743234303800e81208746573743234303900e91208746573743234313000ea120874657374323431" + "3100eb1208746573743234313200ec1208746573743234313300ed1208746573743234313400ee1208746573743234" + "313500ef1208746573743234313600f01208746573743234313700f11208746573743234313800f212087465737432" + "34313900f31208746573743234323000f41208746573743234323100f51208746573743234323200f6120874657374" + "3234323300f71208746573743234323400f81208746573743234323500f91208746573743234323600fa1208746573" + "743234323700fb1208746573743234323800fc1208746573743234323900fd1208746573743234333000fe12087465" + "73743234333100ff120874657374323433320080130874657374323433330081130874657374323433340082130874" + "6573743234333500831308746573743234333600841308746573743234333700851308746573743234333800861308" + "7465737432343339008713087465737432343430008813087465737432343431008913087465737432343432008a13" + "087465737432343433008b13087465737432343434008c13087465737432343435008d13087465737432343436008e" + "13087465737432343437008f1308746573743234343800901308746573743234343900911308746573743234353000" + "9213087465737432343531009313087465737432343532009413087465737432343533009513087465737432343534" + "0096130874657374323435350097130874657374323435360098130874657374323435370099130874657374323435" + "38009a13087465737432343539009b13087465737432343630009c13087465737432343631009d1308746573743234" + "3632009e13087465737432343633009f1308746573743234363400a01308746573743234363500a113087465737432" + "34363600a21308746573743234363700a31308746573743234363800a41308746573743234363900a5130874657374" + "3234373000a61308746573743234373100a71308746573743234373200a81308746573743234373300a91308746573" + "743234373400aa1308746573743234373500ab1308746573743234373600ac1308746573743234373700ad13087465" + "73743234373800ae1308746573743234373900af1308746573743234383000b01308746573743234383100b1130874" + "6573743234383200b21308746573743234383300b31308746573743234383400b41308746573743234383500b51308" + "746573743234383600b61308746573743234383700b71308746573743234383800b81308746573743234383900b913" + "08746573743234393000ba1308746573743234393100bb1308746573743234393200bc1308746573743234393300bd" + "1308746573743234393400be1308746573743234393500bf1308746573743234393600c01308746573743234393700" + "c11308746573743234393800c21308746573743234393900c31308746573743235303000c413087465737432353031" + "00c51308746573743235303200c61308746573743235303300c71308746573743235303400c8130874657374323530" + "3500c91308746573743235303600ca1308746573743235303700cb1308746573743235303800cc1308746573743235" + "303900cd1308746573743235313000ce1308746573743235313100cf1308746573743235313200d013087465737432" + "35313300d11308746573743235313400d21308746573743235313500d31308746573743235313600d4130874657374" + "3235313700d51308746573743235313800d61308746573743235313900d71308746573743235323000d81308746573" + "743235323100d91308746573743235323200da1308746573743235323300db1308746573743235323400dc13087465" + "73743235323500dd1308746573743235323600de1308746573743235323700df1308746573743235323800e0130874" + "6573743235323900e11308746573743235333000e21308746573743235333100e31308746573743235333200e41308" + "746573743235333300e51308746573743235333400e61308746573743235333500e71308746573743235333600e813" + "08746573743235333700e91308746573743235333800ea1308746573743235333900eb1308746573743235343000ec" + "1308746573743235343100ed1308746573743235343200ee1308746573743235343300ef1308746573743235343400" + "f01308746573743235343500f11308746573743235343600f21308746573743235343700f313087465737432353438" + "00f41308746573743235343900f51308746573743235353000f61308746573743235353100f7130874657374323535" + "3200f81308746573743235353300f91308746573743235353400fa1308746573743235353500fb1308746573743235" + "353600fc1308746573743235353700fd1308746573743235353800fe1308746573743235353900ff13087465737432" + "3536300080140874657374323536310081140874657374323536320082140874657374323536330083140874657374" + "3235363400841408746573743235363500851408746573743235363600861408746573743235363700871408746573" + "7432353638008814087465737432353639008914087465737432353730008a14087465737432353731008b14087465" + "737432353732008c14087465737432353733008d14087465737432353734008e14087465737432353735008f140874" + "6573743235373600901408746573743235373700911408746573743235373800921408746573743235373900931408" + "7465737432353830009414087465737432353831009514087465737432353832009614087465737432353833009714" + "087465737432353834009814087465737432353835009914087465737432353836009a14087465737432353837009b" + "14087465737432353838009c14087465737432353839009d14087465737432353930009e1408746573743235393100" + "9f1408746573743235393200a01408746573743235393300a11408746573743235393400a214087465737432353935" + "00a31408746573743235393600a41408746573743235393700a51408746573743235393800a6140874657374323539" + "3900a71408746573743236303000a81408746573743236303100a91408746573743236303200aa1408746573743236" + "303300ab1408746573743236303400ac1408746573743236303500ad1408746573743236303600ae14087465737432" + "36303700af1408746573743236303800b01408746573743236303900b11408746573743236313000b2140874657374" + "3236313100b31408746573743236313200b41408746573743236313300b51408746573743236313400b61408746573" + "743236313500b71408746573743236313600b81408746573743236313700b91408746573743236313800ba14087465" + "73743236313900bb1408746573743236323000bc1408746573743236323100bd1408746573743236323200be140874" + "6573743236323300bf1408746573743236323400c01408746573743236323500c11408746573743236323600c21408" + "746573743236323700c31408746573743236323800c41408746573743236323900c51408746573743236333000c614" + "08746573743236333100c71408746573743236333200c81408746573743236333300c91408746573743236333400ca" + "1408746573743236333500cb1408746573743236333600cc1408746573743236333700cd1408746573743236333800" + "ce1408746573743236333900cf1408746573743236343000d01408746573743236343100d114087465737432363432" + "00d21408746573743236343300d31408746573743236343400d41408746573743236343500d5140874657374323634" + "3600d61408746573743236343700d71408746573743236343800d81408746573743236343900d91408746573743236" + "353000da1408746573743236353100db1408746573743236353200dc1408746573743236353300dd14087465737432" + "36353400de1408746573743236353500df1408746573743236353600e01408746573743236353700e1140874657374" + "3236353800e21408746573743236353900e31408746573743236363000e41408746573743236363100e51408746573" + "743236363200e61408746573743236363300e71408746573743236363400e81408746573743236363500e914087465" + "73743236363600ea1408746573743236363700eb1408746573743236363800ec1408746573743236363900ed140874" + "6573743236373000ee1408746573743236373100ef1408746573743236373200f01408746573743236373300f11408" + "746573743236373400f21408746573743236373500f31408746573743236373600f41408746573743236373700f514" + "08746573743236373800f61408746573743236373900f71408746573743236383000f81408746573743236383100f9" + "1408746573743236383200fa1408746573743236383300fb1408746573743236383400fc1408746573743236383500" + "fd1408746573743236383600fe1408746573743236383700ff14087465737432363838008015087465737432363839" + "0081150874657374323639300082150874657374323639310083150874657374323639320084150874657374323639" + "3300851508746573743236393400861508746573743236393500871508746573743236393600881508746573743236" + "3937008915087465737432363938008a15087465737432363939008b15087465737432373030008c15087465737432" + "373031008d15087465737432373032008e15087465737432373033008f150874657374323730340090150874657374" + "3237303500911508746573743237303600921508746573743237303700931508746573743237303800941508746573" + "7432373039009515087465737432373130009615087465737432373131009715087465737432373132009815087465" + "737432373133009915087465737432373134009a15087465737432373135009b15087465737432373136009c150874" + "65737432373137009d15087465737432373138009e15087465737432373139009f1508746573743237323000a01508" + "746573743237323100a11508746573743237323200a21508746573743237323300a31508746573743237323400a415" + "08746573743237323500a51508746573743237323600a61508746573743237323700a71508746573743237323800a8" + "1508746573743237323900a91508746573743237333000aa1508746573743237333100ab1508746573743237333200" + "ac1508746573743237333300ad1508746573743237333400ae1508746573743237333500af15087465737432373336" + "00b01508746573743237333700b11508746573743237333800b21508746573743237333900b3150874657374323734" + "3000b41508746573743237343100b51508746573743237343200b61508746573743237343300b71508746573743237" + "343400b81508746573743237343500b91508746573743237343600ba1508746573743237343700bb15087465737432" + "37343800bc1508746573743237343900bd1508746573743237353000be1508746573743237353100bf150874657374" + "3237353200c01508746573743237353300c11508746573743237353400c21508746573743237353500c31508746573" + "743237353600c41508746573743237353700c51508746573743237353800c61508746573743237353900c715087465" + "73743237363000c81508746573743237363100c91508746573743237363200ca1508746573743237363300cb150874" + "6573743237363400cc1508746573743237363500cd1508746573743237363600ce1508746573743237363700cf1508" + "746573743237363800d01508746573743237363900d11508746573743237373000d21508746573743237373100d315" + "08746573743237373200d41508746573743237373300d51508746573743237373400d61508746573743237373500d7" + "1508746573743237373600d81508746573743237373700d91508746573743237373800da1508746573743237373900" + "db1508746573743237383000dc1508746573743237383100dd1508746573743237383200de15087465737432373833" + "00df1508746573743237383400e01508746573743237383500e11508746573743237383600e2150874657374323738" + "3700e31508746573743237383800e41508746573743237383900e51508746573743237393000e61508746573743237" + "393100e71508746573743237393200e81508746573743237393300e91508746573743237393400ea15087465737432" + "37393500eb1508746573743237393600ec1508746573743237393700ed1508746573743237393800ee150874657374" + "3237393900ef1508746573743238303000f01508746573743238303100f11508746573743238303200f21508746573" + "743238303300f31508746573743238303400f41508746573743238303500f51508746573743238303600f615087465" + "73743238303700f71508746573743238303800f81508746573743238303900f91508746573743238313000fa150874" + "6573743238313100fb1508746573743238313200fc1508746573743238313300fd1508746573743238313400fe1508" + "746573743238313500ff15087465737432383136008016087465737432383137008116087465737432383138008216" + "0874657374323831390083160874657374323832300084160874657374323832310085160874657374323832320086" + "1608746573743238323300871608746573743238323400881608746573743238323500891608746573743238323600" + "8a16087465737432383237008b16087465737432383238008c16087465737432383239008d16087465737432383330" + "008e16087465737432383331008f160874657374323833320090160874657374323833330091160874657374323833" + "3400921608746573743238333500931608746573743238333600941608746573743238333700951608746573743238" + "3338009616087465737432383339009716087465737432383430009816087465737432383431009916087465737432" + "383432009a16087465737432383433009b16087465737432383434009c16087465737432383435009d160874657374" + "32383436009e16087465737432383437009f1608746573743238343800a01608746573743238343900a11608746573" + "743238353000a21608746573743238353100a31608746573743238353200a41608746573743238353300a516087465" + "73743238353400a61608746573743238353500a71608746573743238353600a81608746573743238353700a9160874" + "6573743238353800aa1608746573743238353900ab1608746573743238363000ac1608746573743238363100ad1608" + "746573743238363200ae1608746573743238363300af1608746573743238363400b01608746573743238363500b116" + "08746573743238363600b21608746573743238363700b31608746573743238363800b41608746573743238363900b5" + "1608746573743238373000b61608746573743238373100b71608746573743238373200b81608746573743238373300" + "b91608746573743238373400ba1608746573743238373500bb1608746573743238373600bc16087465737432383737" + "00bd1608746573743238373800be1608746573743238373900bf1608746573743238383000c0160874657374323838" + "3100c11608746573743238383200c21608746573743238383300c31608746573743238383400c41608746573743238" + "383500c51608746573743238383600c61608746573743238383700c71608746573743238383800c816087465737432" + "38383900c91608746573743238393000ca1608746573743238393100cb1608746573743238393200cc160874657374" + "3238393300cd1608746573743238393400ce1608746573743238393500cf1608746573743238393600d01608746573" + "743238393700d11608746573743238393800d21608746573743238393900d31608746573743239303000d416087465" + "73743239303100d51608746573743239303200d61608746573743239303300d71608746573743239303400d8160874" + "6573743239303500d91608746573743239303600da1608746573743239303700db1608746573743239303800dc1608" + "746573743239303900dd1608746573743239313000de1608746573743239313100df1608746573743239313200e016" + "08746573743239313300e11608746573743239313400e21608746573743239313500e31608746573743239313600e4" + "1608746573743239313700e51608746573743239313800e61608746573743239313900e71608746573743239323000" + "e81608746573743239323100e91608746573743239323200ea1608746573743239323300eb16087465737432393234" + "00ec1608746573743239323500ed1608746573743239323600ee1608746573743239323700ef160874657374323932" + "3800f01608746573743239323900f11608746573743239333000f21608746573743239333100f31608746573743239" + "333200f41608746573743239333300f51608746573743239333400f61608746573743239333500f716087465737432" + "39333600f81608746573743239333700f91608746573743239333800fa1608746573743239333900fb160874657374" + "3239343000fc1608746573743239343100fd1608746573743239343200fe1608746573743239343300ff1608746573" + "7432393434008017087465737432393435008117087465737432393436008217087465737432393437008317087465" + "7374323934380084170874657374323934390085170874657374323935300086170874657374323935310087170874" + "65737432393532008817087465737432393533008917087465737432393534008a17087465737432393535008b1708" + "7465737432393536008c17087465737432393537008d17087465737432393538008e17087465737432393539008f17" + "0874657374323936300090170874657374323936310091170874657374323936320092170874657374323936330093" + "1708746573743239363400941708746573743239363500951708746573743239363600961708746573743239363700" + "9717087465737432393638009817087465737432393639009917087465737432393730009a17087465737432393731" + "009b17087465737432393732009c17087465737432393733009d17087465737432393734009e170874657374323937" + "35009f1708746573743239373600a01708746573743239373700a11708746573743239373800a21708746573743239" + "373900a31708746573743239383000a41708746573743239383100a51708746573743239383200a617087465737432" + "39383300a71708746573743239383400a81708746573743239383500a91708746573743239383600aa170874657374" + "3239383700ab1708746573743239383800ac1708746573743239383900ad1708746573743239393000ae1708746573" + "743239393100af1708746573743239393200b01708746573743239393300b11708746573743239393400b217087465" + "73743239393500b31708746573743239393600b41708746573743239393700b51708746573743239393800b6170874" + "6573743239393900b71708746573743330303000b81708746573743330303100b91708746573743330303200ba1708" + "746573743330303300bb1708746573743330303400bc1708746573743330303500bd1708746573743330303600be17" + "08746573743330303700bf1708746573743330303800c01708746573743330303900c11708746573743330313000c2" + "1708746573743330313100c31708746573743330313200c41708746573743330313300c51708746573743330313400" + "c61708746573743330313500c71708746573743330313600c81708746573743330313700c917087465737433303138" + "00ca1708746573743330313900cb1708746573743330323000cc1708746573743330323100cd170874657374333032" + "3200ce1708746573743330323300cf1708746573743330323400d01708746573743330323500d11708746573743330" + "323600d21708746573743330323700d31708746573743330323800d41708746573743330323900d517087465737433" + "30333000d61708746573743330333100d71708746573743330333200d81708746573743330333300d9170874657374" + "3330333400da1708746573743330333500db1708746573743330333600dc1708746573743330333700dd1708746573" + "743330333800de1708746573743330333900df1708746573743330343000e01708746573743330343100e117087465" + "73743330343200e21708746573743330343300e31708746573743330343400e41708746573743330343500e5170874" + "6573743330343600e61708746573743330343700e71708746573743330343800e81708746573743330343900e91708" + "746573743330353000ea1708746573743330353100eb1708746573743330353200ec1708746573743330353300ed17" + "08746573743330353400ee1708746573743330353500ef1708746573743330353600f01708746573743330353700f1" + "1708746573743330353800f21708746573743330353900f31708746573743330363000f41708746573743330363100" + "f51708746573743330363200f61708746573743330363300f71708746573743330363400f817087465737433303635" + "00f91708746573743330363600fa1708746573743330363700fb1708746573743330363800fc170874657374333036" + "3900fd1708746573743330373000fe1708746573743330373100ff1708746573743330373200801808746573743330" + "3733008118087465737433303734008218087465737433303735008318087465737433303736008418087465737433" + "3037370085180874657374333037380086180874657374333037390087180874657374333038300088180874657374" + "33303831008918087465737433303832008a18087465737433303833008b18087465737433303834008c1808746573" + "7433303835008d18087465737433303836008e18087465737433303837008f18087465737433303838009018087465" + "7374333038390091180874657374333039300092180874657374333039310093180874657374333039320094180874" + "6573743330393300951808746573743330393400961808746573743330393500971808746573743330393600981808" + "7465737433303937009918087465737433303938009a18087465737433303939009b18087465737433313030009c18" + "087465737433313031009d18087465737433313032009e18087465737433313033009f1808746573743331303400a0" + "1808746573743331303500a11808746573743331303600a21808746573743331303700a31808746573743331303800" + "a41808746573743331303900a51808746573743331313000a61808746573743331313100a718087465737433313132" + "00a81808746573743331313300a91808746573743331313400aa1808746573743331313500ab180874657374333131" + "3600ac1808746573743331313700ad1808746573743331313800ae1808746573743331313900af1808746573743331" + "323000b01808746573743331323100b11808746573743331323200b21808746573743331323300b318087465737433" + "31323400b41808746573743331323500b51808746573743331323600b61808746573743331323700b7180874657374" + "3331323800b81808746573743331323900b91808746573743331333000ba1808746573743331333100bb1808746573" + "743331333200bc1808746573743331333300bd1808746573743331333400be1808746573743331333500bf18087465" + "73743331333600c01808746573743331333700c11808746573743331333800c21808746573743331333900c3180874" + "6573743331343000c41808746573743331343100c51808746573743331343200c61808746573743331343300c71808" + "746573743331343400c81808746573743331343500c91808746573743331343600ca1808746573743331343700cb18" + "08746573743331343800cc1808746573743331343900cd1808746573743331353000ce1808746573743331353100cf" + "1808746573743331353200d01808746573743331353300d11808746573743331353400d21808746573743331353500" + "d31808746573743331353600d41808746573743331353700d51808746573743331353800d618087465737433313539" + "00d71808746573743331363000d81808746573743331363100d91808746573743331363200da180874657374333136" + "3300db1808746573743331363400dc1808746573743331363500dd1808746573743331363600de1808746573743331" + "363700df1808746573743331363800e01808746573743331363900e11808746573743331373000e218087465737433" + "31373100e31808746573743331373200e41808746573743331373300e51808746573743331373400e6180874657374" + "3331373500e71808746573743331373600e81808746573743331373700e91808746573743331373800ea1808746573" + "743331373900eb1808746573743331383000ec1808746573743331383100ed1808746573743331383200ee18087465" + "73743331383300ef1808746573743331383400f01808746573743331383500f11808746573743331383600f2180874" + "6573743331383700f31808746573743331383800f41808746573743331383900f51808746573743331393000f61808" + "746573743331393100f71808746573743331393200f81808746573743331393300f91808746573743331393400fa18" + "08746573743331393500fb1808746573743331393600fc1808746573743331393700fd1808746573743331393800fe" + "1808746573743331393900ff1808746573743332303000801908746573743332303100811908746573743332303200" + "8219087465737433323033008319087465737433323034008419087465737433323035008519087465737433323036" + "0086190874657374333230370087190874657374333230380088190874657374333230390089190874657374333231" + "30008a19087465737433323131008b19087465737433323132008c19087465737433323133008d1908746573743332" + "3134008e19087465737433323135008f19087465737433323136009019087465737433323137009119087465737433" + "3231380092190874657374333231390093190874657374333232300094190874657374333232310095190874657374" + "3332323200961908746573743332323300971908746573743332323400981908746573743332323500991908746573" + "7433323236009a19087465737433323237009b19087465737433323238009c19087465737433323239009d19087465" + "737433323330009e19087465737433323331009f1908746573743332333200a01908746573743332333300a1190874" + "6573743332333400a21908746573743332333500a31908746573743332333600a41908746573743332333700a51908" + "746573743332333800a61908746573743332333900a71908746573743332343000a81908746573743332343100a919" + "08746573743332343200aa1908746573743332343300ab1908746573743332343400ac1908746573743332343500ad" + "1908746573743332343600ae1908746573743332343700af1908746573743332343800b01908746573743332343900" + "b11908746573743332353000b21908746573743332353100b31908746573743332353200b419087465737433323533" + "00b51908746573743332353400b61908746573743332353500b71908746573743332353600b8190874657374333235" + "3700b91908746573743332353800ba1908746573743332353900bb1908746573743332363000bc1908746573743332" + "363100bd1908746573743332363200be1908746573743332363300bf1908746573743332363400c019087465737433" + "32363500c11908746573743332363600c21908746573743332363700c31908746573743332363800c4190874657374" + "3332363900c51908746573743332373000c61908746573743332373100c71908746573743332373200c81908746573" + "743332373300c91908746573743332373400ca1908746573743332373500cb1908746573743332373600cc19087465" + "73743332373700cd1908746573743332373800ce1908746573743332373900cf1908746573743332383000d0190874" + "6573743332383100d11908746573743332383200d21908746573743332383300d31908746573743332383400d41908" + "746573743332383500d51908746573743332383600d61908746573743332383700d71908746573743332383800d819" + "08746573743332383900d91908746573743332393000da1908746573743332393100db1908746573743332393200dc" + "1908746573743332393300dd1908746573743332393400de1908746573743332393500df1908746573743332393600" + "e01908746573743332393700e11908746573743332393800e21908746573743332393900e319087465737433333030" + "00e41908746573743333303100e51908746573743333303200e61908746573743333303300e7190874657374333330" + "3400e81908746573743333303500e91908746573743333303600ea1908746573743333303700eb1908746573743333" + "303800ec1908746573743333303900ed1908746573743333313000ee1908746573743333313100ef19087465737433" + "33313200f01908746573743333313300f11908746573743333313400f21908746573743333313500f3190874657374" + "3333313600f41908746573743333313700f51908746573743333313800f61908746573743333313900f71908746573" + "743333323000f81908746573743333323100f91908746573743333323200fa1908746573743333323300fb19087465" + "73743333323400fc1908746573743333323500fd1908746573743333323600fe1908746573743333323700ff190874" + "6573743333323800801a08746573743333323900811a08746573743333333000821a08746573743333333100831a08" + "746573743333333200841a08746573743333333300851a08746573743333333400861a08746573743333333500871a" + "08746573743333333600881a08746573743333333700891a087465737433333338008a1a087465737433333339008b" + "1a087465737433333430008c1a087465737433333431008d1a087465737433333432008e1a08746573743333343300" + "8f1a08746573743333343400901a08746573743333343500911a08746573743333343600921a087465737433333437" + "00931a08746573743333343800941a08746573743333343900951a08746573743333353000961a0874657374333335" + "3100971a08746573743333353200981a08746573743333353300991a087465737433333534009a1a08746573743333" + "3535009b1a087465737433333536009c1a087465737433333537009d1a087465737433333538009e1a087465737433" + "333539009f1a08746573743333363000a01a08746573743333363100a11a08746573743333363200a21a0874657374" + "3333363300a31a08746573743333363400a41a08746573743333363500a51a08746573743333363600a61a08746573" + "743333363700a71a08746573743333363800a81a08746573743333363900a91a08746573743333373000aa1a087465" + "73743333373100ab1a08746573743333373200ac1a08746573743333373300ad1a08746573743333373400ae1a0874" + "6573743333373500af1a08746573743333373600b01a08746573743333373700b11a08746573743333373800b21a08" + "746573743333373900b31a08746573743333383000b41a08746573743333383100b51a08746573743333383200b61a" + "08746573743333383300b71a08746573743333383400b81a08746573743333383500b91a08746573743333383600ba" + "1a08746573743333383700bb1a08746573743333383800bc1a08746573743333383900bd1a08746573743333393000" + "be1a08746573743333393100bf1a08746573743333393200c01a08746573743333393300c11a087465737433333934" + "00c21a08746573743333393500c31a08746573743333393600c41a08746573743333393700c51a0874657374333339" + "3800c61a08746573743333393900c71a08746573743334303000c81a08746573743334303100c91a08746573743334" + "303200ca1a08746573743334303300cb1a08746573743334303400cc1a08746573743334303500cd1a087465737433" + "34303600ce1a08746573743334303700cf1a08746573743334303800d01a08746573743334303900d11a0874657374" + "3334313000d21a08746573743334313100d31a08746573743334313200d41a08746573743334313300d51a08746573" + "743334313400d61a08746573743334313500d71a08746573743334313600d81a08746573743334313700d91a087465" + "73743334313800da1a08746573743334313900db1a08746573743334323000dc1a08746573743334323100dd1a0874" + "6573743334323200de1a08746573743334323300df1a08746573743334323400e01a08746573743334323500e11a08" + "746573743334323600e21a08746573743334323700e31a08746573743334323800e41a08746573743334323900e51a" + "08746573743334333000e61a08746573743334333100e71a08746573743334333200e81a08746573743334333300e9" + "1a08746573743334333400ea1a08746573743334333500eb1a08746573743334333600ec1a08746573743334333700" + "ed1a08746573743334333800ee1a08746573743334333900ef1a08746573743334343000f01a087465737433343431" + "00f11a08746573743334343200f21a08746573743334343300f31a08746573743334343400f41a0874657374333434" + "3500f51a08746573743334343600f61a08746573743334343700f71a08746573743334343800f81a08746573743334" + "343900f91a08746573743334353000fa1a08746573743334353100fb1a08746573743334353200fc1a087465737433" + "34353300fd1a08746573743334353400fe1a08746573743334353500ff1a08746573743334353600801b0874657374" + "3334353700811b08746573743334353800821b08746573743334353900831b08746573743334363000841b08746573" + "743334363100851b08746573743334363200861b08746573743334363300871b08746573743334363400881b087465" + "73743334363500891b087465737433343636008a1b087465737433343637008b1b087465737433343638008c1b0874" + "65737433343639008d1b087465737433343730008e1b087465737433343731008f1b08746573743334373200901b08" + "746573743334373300911b08746573743334373400921b08746573743334373500931b08746573743334373600941b" + "08746573743334373700951b08746573743334373800961b08746573743334373900971b0874657374333438300098" + "1b08746573743334383100991b087465737433343832009a1b087465737433343833009b1b08746573743334383400" + "9c1b087465737433343835009d1b087465737433343836009e1b087465737433343837009f1b087465737433343838" + "00a01b08746573743334383900a11b08746573743334393000a21b08746573743334393100a31b0874657374333439" + "3200a41b08746573743334393300a51b08746573743334393400a61b08746573743334393500a71b08746573743334" + "393600a81b08746573743334393700a91b08746573743334393800aa1b08746573743334393900ab1b087465737433" + "35303000ac1b08746573743335303100ad1b08746573743335303200ae1b08746573743335303300af1b0874657374" + "3335303400b01b08746573743335303500b11b08746573743335303600b21b08746573743335303700b31b08746573" + "743335303800b41b08746573743335303900b51b08746573743335313000b61b08746573743335313100b71b087465" + "73743335313200b81b08746573743335313300b91b08746573743335313400ba1b08746573743335313500bb1b0874" + "6573743335313600bc1b08746573743335313700bd1b08746573743335313800be1b08746573743335313900bf1b08" + "746573743335323000c01b08746573743335323100c11b08746573743335323200c21b08746573743335323300c31b" + "08746573743335323400c41b08746573743335323500c51b08746573743335323600c61b08746573743335323700c7" + "1b08746573743335323800c81b08746573743335323900c91b08746573743335333000ca1b08746573743335333100" + "cb1b08746573743335333200cc1b08746573743335333300cd1b08746573743335333400ce1b087465737433353335" + "00cf1b08746573743335333600d01b08746573743335333700d11b08746573743335333800d21b0874657374333533" + "3900d31b08746573743335343000d41b08746573743335343100d51b08746573743335343200d61b08746573743335" + "343300d71b08746573743335343400d81b08746573743335343500d91b08746573743335343600da1b087465737433" + "35343700db1b08746573743335343800dc1b08746573743335343900dd1b08746573743335353000de1b0874657374" + "3335353100df1b08746573743335353200e01b08746573743335353300e11b08746573743335353400e21b08746573" + "743335353500e31b08746573743335353600e41b08746573743335353700e51b08746573743335353800e61b087465" + "73743335353900e71b08746573743335363000e81b08746573743335363100e91b08746573743335363200ea1b0874" + "6573743335363300eb1b08746573743335363400ec1b08746573743335363500ed1b08746573743335363600ee1b08" + "746573743335363700ef1b08746573743335363800f01b08746573743335363900f11b08746573743335373000f21b" + "08746573743335373100f31b08746573743335373200f41b08746573743335373300f51b08746573743335373400f6" + "1b08746573743335373500f71b08746573743335373600f81b08746573743335373700f91b08746573743335373800" + "fa1b08746573743335373900fb1b08746573743335383000fc1b08746573743335383100fd1b087465737433353832" + "00fe1b08746573743335383300ff1b08746573743335383400801c08746573743335383500811c0874657374333538" + "3600821c08746573743335383700831c08746573743335383800841c08746573743335383900851c08746573743335" + "393000861c08746573743335393100871c08746573743335393200881c08746573743335393300891c087465737433" + "353934008a1c087465737433353935008b1c087465737433353936008c1c087465737433353937008d1c0874657374" + "33353938008e1c087465737433353939008f1c08746573743336303000901c08746573743336303100911c08746573" + "743336303200921c08746573743336303300931c08746573743336303400941c08746573743336303500951c087465" + "73743336303600961c08746573743336303700971c08746573743336303800981c08746573743336303900991c0874" + "65737433363130009a1c087465737433363131009b1c087465737433363132009c1c087465737433363133009d1c08" + "7465737433363134009e1c087465737433363135009f1c08746573743336313600a01c08746573743336313700a11c" + "08746573743336313800a21c08746573743336313900a31c08746573743336323000a41c08746573743336323100a5" + "1c08746573743336323200a61c08746573743336323300a71c08746573743336323400a81c08746573743336323500" + "a91c08746573743336323600aa1c08746573743336323700ab1c08746573743336323800ac1c087465737433363239" + "00ad1c08746573743336333000ae1c08746573743336333100af1c08746573743336333200b01c0874657374333633" + "3300b11c08746573743336333400b21c08746573743336333500b31c08746573743336333600b41c08746573743336" + "333700b51c08746573743336333800b61c08746573743336333900b71c08746573743336343000b81c087465737433" + "36343100b91c08746573743336343200ba1c08746573743336343300bb1c08746573743336343400bc1c0874657374" + "3336343500bd1c08746573743336343600be1c08746573743336343700bf1c08746573743336343800c01c08746573" + "743336343900c11c08746573743336353000c21c08746573743336353100c31c08746573743336353200c41c087465" + "73743336353300c51c08746573743336353400c61c08746573743336353500c71c08746573743336353600c81c0874" + "6573743336353700c91c08746573743336353800ca1c08746573743336353900cb1c08746573743336363000cc1c08" + "746573743336363100cd1c08746573743336363200ce1c08746573743336363300cf1c08746573743336363400d01c" + "08746573743336363500d11c08746573743336363600d21c08746573743336363700d31c08746573743336363800d4" + "1c08746573743336363900d51c08746573743336373000d61c08746573743336373100d71c08746573743336373200" + "d81c08746573743336373300d91c08746573743336373400da1c08746573743336373500db1c087465737433363736" + "00dc1c08746573743336373700dd1c08746573743336373800de1c08746573743336373900df1c0874657374333638" + "3000e01c08746573743336383100e11c08746573743336383200e21c08746573743336383300e31c08746573743336" + "383400e41c08746573743336383500e51c08746573743336383600e61c08746573743336383700e71c087465737433" + "36383800e81c08746573743336383900e91c08746573743336393000ea1c08746573743336393100eb1c0874657374" + "3336393200ec1c08746573743336393300ed1c08746573743336393400ee1c08746573743336393500ef1c08746573" + "743336393600f01c08746573743336393700f11c08746573743336393800f21c08746573743336393900f31c087465" + "73743337303000f41c08746573743337303100f51c08746573743337303200f61c08746573743337303300f71c0874" + "6573743337303400f81c08746573743337303500f91c08746573743337303600fa1c08746573743337303700fb1c08" + "746573743337303800fc1c08746573743337303900fd1c08746573743337313000fe1c08746573743337313100ff1c" + "08746573743337313200801d08746573743337313300811d08746573743337313400821d0874657374333731350083" + "1d08746573743337313600841d08746573743337313700851d08746573743337313800861d08746573743337313900" + "871d08746573743337323000881d08746573743337323100891d087465737433373232008a1d087465737433373233" + "008b1d087465737433373234008c1d087465737433373235008d1d087465737433373236008e1d0874657374333732" + "37008f1d08746573743337323800901d08746573743337323900911d08746573743337333000921d08746573743337" + "333100931d08746573743337333200941d08746573743337333300951d08746573743337333400961d087465737433" + "37333500971d08746573743337333600981d08746573743337333700991d087465737433373338009a1d0874657374" + "33373339009b1d087465737433373430009c1d087465737433373431009d1d087465737433373432009e1d08746573" + "7433373433009f1d08746573743337343400a01d08746573743337343500a11d08746573743337343600a21d087465" + "73743337343700a31d08746573743337343800a41d08746573743337343900a51d08746573743337353000a61d0874" + "6573743337353100a71d08746573743337353200a81d08746573743337353300a91d08746573743337353400aa1d08" + "746573743337353500ab1d08746573743337353600ac1d08746573743337353700ad1d08746573743337353800ae1d" + "08746573743337353900af1d08746573743337363000b01d08746573743337363100b11d08746573743337363200b2" + "1d08746573743337363300b31d08746573743337363400b41d08746573743337363500b51d08746573743337363600" + "b61d08746573743337363700b71d08746573743337363800b81d08746573743337363900b91d087465737433373730" + "00ba1d08746573743337373100bb1d08746573743337373200bc1d08746573743337373300bd1d0874657374333737" + "3400be1d08746573743337373500bf1d08746573743337373600c01d08746573743337373700c11d08746573743337" + "373800c21d08746573743337373900c31d08746573743337383000c41d08746573743337383100c51d087465737433" + "37383200c61d08746573743337383300c71d08746573743337383400c81d08746573743337383500c91d0874657374" + "3337383600ca1d08746573743337383700cb1d08746573743337383800cc1d08746573743337383900cd1d08746573" + "743337393000ce1d08746573743337393100cf1d08746573743337393200d01d08746573743337393300d11d087465" + "73743337393400d21d08746573743337393500d31d08746573743337393600d41d08746573743337393700d51d0874" + "6573743337393800d61d08746573743337393900d71d08746573743338303000d81d08746573743338303100d91d08" + "746573743338303200da1d08746573743338303300db1d08746573743338303400dc1d08746573743338303500dd1d" + "08746573743338303600de1d08746573743338303700df1d08746573743338303800e01d08746573743338303900e1" + "1d08746573743338313000e21d08746573743338313100e31d08746573743338313200e41d08746573743338313300" + "e51d08746573743338313400e61d08746573743338313500e71d08746573743338313600e81d087465737433383137" + "00e91d08746573743338313800ea1d08746573743338313900eb1d08746573743338323000ec1d0874657374333832" + "3100ed1d08746573743338323200ee1d08746573743338323300ef1d08746573743338323400f01d08746573743338" + "323500f11d08746573743338323600f21d08746573743338323700f31d08746573743338323800f41d087465737433" + "38323900f51d08746573743338333000f61d08746573743338333100f71d08746573743338333200f81d0874657374" + "3338333300f91d08746573743338333400fa1d08746573743338333500fb1d08746573743338333600fc1d08746573" + "743338333700fd1d08746573743338333800fe1d08746573743338333900ff1d08746573743338343000801e087465" + "73743338343100811e08746573743338343200821e08746573743338343300831e08746573743338343400841e0874" + "6573743338343500851e08746573743338343600861e08746573743338343700871e08746573743338343800881e08" + "746573743338343900891e087465737433383530008a1e087465737433383531008b1e087465737433383532008c1e" + "087465737433383533008d1e087465737433383534008e1e087465737433383535008f1e0874657374333835360090" + "1e08746573743338353700911e08746573743338353800921e08746573743338353900931e08746573743338363000" + "941e08746573743338363100951e08746573743338363200961e08746573743338363300971e087465737433383634" + "00981e08746573743338363500991e087465737433383636009a1e087465737433383637009b1e0874657374333836" + "38009c1e087465737433383639009d1e087465737433383730009e1e087465737433383731009f1e08746573743338" + "373200a01e08746573743338373300a11e08746573743338373400a21e08746573743338373500a31e087465737433" + "38373600a41e08746573743338373700a51e08746573743338373800a61e08746573743338373900a71e0874657374" + "3338383000a81e08746573743338383100a91e08746573743338383200aa1e08746573743338383300ab1e08746573" + "743338383400ac1e08746573743338383500ad1e08746573743338383600ae1e08746573743338383700af1e087465" + "73743338383800b01e08746573743338383900b11e08746573743338393000b21e08746573743338393100b31e0874" + "6573743338393200b41e08746573743338393300b51e08746573743338393400b61e08746573743338393500b71e08" + "746573743338393600b81e08746573743338393700b91e08746573743338393800ba1e08746573743338393900bb1e" + "08746573743339303000bc1e08746573743339303100bd1e08746573743339303200be1e08746573743339303300bf" + "1e08746573743339303400c01e08746573743339303500c11e08746573743339303600c21e08746573743339303700" + "c31e08746573743339303800c41e08746573743339303900c51e08746573743339313000c61e087465737433393131" + "00c71e08746573743339313200c81e08746573743339313300c91e08746573743339313400ca1e0874657374333931" + "3500cb1e08746573743339313600cc1e08746573743339313700cd1e08746573743339313800ce1e08746573743339" + "313900cf1e08746573743339323000d01e08746573743339323100d11e08746573743339323200d21e087465737433" + "39323300d31e08746573743339323400d41e08746573743339323500d51e08746573743339323600d61e0874657374" + "3339323700d71e08746573743339323800d81e08746573743339323900d91e08746573743339333000da1e08746573" + "743339333100db1e08746573743339333200dc1e08746573743339333300dd1e08746573743339333400de1e087465" + "73743339333500df1e08746573743339333600e01e08746573743339333700e11e08746573743339333800e21e0874" + "6573743339333900e31e08746573743339343000e41e08746573743339343100e51e08746573743339343200e61e08" + "746573743339343300e71e08746573743339343400e81e08746573743339343500e91e08746573743339343600ea1e" + "08746573743339343700eb1e08746573743339343800ec1e08746573743339343900ed1e08746573743339353000ee" + "1e08746573743339353100ef1e08746573743339353200f01e08746573743339353300f11e08746573743339353400" + "f21e08746573743339353500f31e08746573743339353600f41e08746573743339353700f51e087465737433393538" + "00f61e08746573743339353900f71e08746573743339363000f81e08746573743339363100f91e0874657374333936" + "3200fa1e08746573743339363300fb1e08746573743339363400fc1e08746573743339363500fd1e08746573743339" + "363600fe1e08746573743339363700ff1e08746573743339363800801f08746573743339363900811f087465737433" + "39373000821f08746573743339373100831f08746573743339373200841f08746573743339373300851f0874657374" + "3339373400861f08746573743339373500871f08746573743339373600881f08746573743339373700891f08746573" + "7433393738008a1f087465737433393739008b1f087465737433393830008c1f087465737433393831008d1f087465" + "737433393832008e1f087465737433393833008f1f08746573743339383400901f08746573743339383500911f0874" + "6573743339383600921f08746573743339383700931f08746573743339383800941f08746573743339383900951f08" + "746573743339393000961f08746573743339393100971f08746573743339393200981f08746573743339393300991f" + "087465737433393934009a1f087465737433393935009b1f087465737433393936009c1f087465737433393937009d" + "1f087465737433393938009e1f087465737433393939009f1f08746573743430303000a01f08746573743430303100" + "a11f08746573743430303200a21f08746573743430303300a31f08746573743430303400a41f087465737434303035" + "00a51f08746573743430303600a61f08746573743430303700a71f08746573743430303800a81f0874657374343030" + "3900a91f08746573743430313000aa1f08746573743430313100ab1f08746573743430313200ac1f08746573743430" + "313300ad1f08746573743430313400ae1f08746573743430313500af1f08746573743430313600b01f087465737434" + "30313700b11f08746573743430313800b21f08746573743430313900b31f08746573743430323000b41f0874657374" + "3430323100b51f08746573743430323200b61f08746573743430323300b71f08746573743430323400b81f08746573" + "743430323500b91f08746573743430323600ba1f08746573743430323700bb1f08746573743430323800bc1f087465" + "73743430323900bd1f08746573743430333000be1f08746573743430333100bf1f08746573743430333200c01f0874" + "6573743430333300c11f08746573743430333400c21f08746573743430333500c31f08746573743430333600c41f08" + "746573743430333700c51f08746573743430333800c61f08746573743430333900c71f08746573743430343000c81f" + "08746573743430343100c91f08746573743430343200ca1f08746573743430343300cb1f08746573743430343400cc" + "1f08746573743430343500cd1f08746573743430343600ce1f08746573743430343700cf1f08746573743430343800" + "d01f08746573743430343900d11f08746573743430353000d21f08746573743430353100d31f087465737434303532" + "00d41f08746573743430353300d51f08746573743430353400d61f08746573743430353500d71f0874657374343035" + "3600d81f08746573743430353700d91f08746573743430353800da1f08746573743430353900db1f08746573743430" + "363000dc1f08746573743430363100dd1f08746573743430363200de1f08746573743430363300df1f087465737434" + "30363400e01f08746573743430363500e11f08746573743430363600e21f08746573743430363700e31f0874657374" + "3430363800e41f08746573743430363900e51f08746573743430373000e61f08746573743430373100e71f08746573" + "743430373200e81f08746573743430373300e91f08746573743430373400ea1f08746573743430373500eb1f087465" + "73743430373600ec1f08746573743430373700ed1f08746573743430373800ee1f08746573743430373900ef1f0874" + "6573743430383000f01f08746573743430383100f11f08746573743430383200f21f08746573743430383300f31f08" + "746573743430383400f41f08746573743430383500f51f08746573743430383600f61f08746573743430383700f71f" + "08746573743430383800f81f08746573743430383900f91f08746573743430393000fa1f08746573743430393100fb" + "1f08746573743430393200fc1f08746573743430393300fd1f08746573743430393400fe1f08746573743430393500" + "ff1f087465737434303936008020087465737434303937008120087465737434303938008220087465737434303939" + "0083200874657374343130300084200874657374343130310085200874657374343130320086200874657374343130" + "33008720087465737434313034008820087465737434313035008920087465737434313036008a2008746573743431" + "3037008b20087465737434313038008c20087465737434313039008d20087465737434313130008e20087465737434" + "313131008f200874657374343131320090200874657374343131330091200874657374343131340092200874657374" + "3431313500932008746573743431313600942008746573743431313700952008746573743431313800962008746573" + "7434313139009720087465737434313230009820087465737434313231009920087465737434313232009a20087465" + "737434313233009b20087465737434313234009c20087465737434313235009d20087465737434313236009e200874" + "65737434313237009f2008746573743431323800a02008746573743431323900a12008746573743431333000a22008" + "746573743431333100a32008746573743431333200a42008746573743431333300a52008746573743431333400a620" + "08746573743431333500a72008746573743431333600a82008746573743431333700a92008746573743431333800aa" + "2008746573743431333900ab2008746573743431343000ac2008746573743431343100ad2008746573743431343200" + "ae2008746573743431343300af2008746573743431343400b02008746573743431343500b120087465737434313436" + "00b22008746573743431343700b32008746573743431343800b42008746573743431343900b5200874657374343135" + "3000b62008746573743431353100b72008746573743431353200b82008746573743431353300b92008746573743431" + "353400ba2008746573743431353500bb2008746573743431353600bc2008746573743431353700bd20087465737434" + "31353800be2008746573743431353900bf2008746573743431363000c02008746573743431363100c1200874657374" + "3431363200c22008746573743431363300c32008746573743431363400c42008746573743431363500c52008746573" + "743431363600c62008746573743431363700c72008746573743431363800c82008746573743431363900c920087465" + "73743431373000ca2008746573743431373100cb2008746573743431373200cc2008746573743431373300cd200874" + "6573743431373400ce2008746573743431373500cf2008746573743431373600d02008746573743431373700d12008" + "746573743431373800d22008746573743431373900d32008746573743431383000d42008746573743431383100d520" + "08746573743431383200d62008746573743431383300d72008746573743431383400d82008746573743431383500d9" + "2008746573743431383600da2008746573743431383700db2008746573743431383800dc2008746573743431383900" + "dd2008746573743431393000de2008746573743431393100df2008746573743431393200e020087465737434313933" + "00e12008746573743431393400e22008746573743431393500e32008746573743431393600e4200874657374343139" + "3700e52008746573743431393800e62008746573743431393900e72008746573743432303000e82008746573743432" + "303100e92008746573743432303200ea2008746573743432303300eb2008746573743432303400ec20087465737434" + "32303500ed2008746573743432303600ee2008746573743432303700ef2008746573743432303800f0200874657374" + "3432303900f12008746573743432313000f22008746573743432313100f32008746573743432313200f42008746573" + "743432313300f52008746573743432313400f62008746573743432313500f72008746573743432313600f820087465" + "73743432313700f92008746573743432313800fa2008746573743432313900fb2008746573743432323000fc200874" + "6573743432323100fd2008746573743432323200fe2008746573743432323300ff2008746573743432323400802108" + "7465737434323235008121087465737434323236008221087465737434323237008321087465737434323238008421" + "0874657374343232390085210874657374343233300086210874657374343233310087210874657374343233320088" + "21087465737434323333008921087465737434323334008a21087465737434323335008b2108746573743432333600" + "8c21087465737434323337008d21087465737434323338008e21087465737434323339008f21087465737434323430" + "0090210874657374343234310091210874657374343234320092210874657374343234330093210874657374343234" + "3400942108746573743432343500952108746573743432343600962108746573743432343700972108746573743432" + "3438009821087465737434323439009921087465737434323530009a21087465737434323531009b21087465737434" + "323532009c21087465737434323533009d21087465737434323534009e21087465737434323535009f210874657374" + "3432353600a02108746573743432353700a12108746573743432353800a22108746573743432353900a32108746573" + "743432363000a42108746573743432363100a52108746573743432363200a62108746573743432363300a721087465" + "73743432363400a82108746573743432363500a92108746573743432363600aa2108746573743432363700ab210874" + "6573743432363800ac2108746573743432363900ad2108746573743432373000ae2108746573743432373100af2108" + "746573743432373200b02108746573743432373300b12108746573743432373400b22108746573743432373500b321" + "08746573743432373600b42108746573743432373700b52108746573743432373800b62108746573743432373900b7" + "2108746573743432383000b82108746573743432383100b92108746573743432383200ba2108746573743432383300" + "bb2108746573743432383400bc2108746573743432383500bd2108746573743432383600be21087465737434323837" + "00bf2108746573743432383800c02108746573743432383900c12108746573743432393000c2210874657374343239" + "3100c32108746573743432393200c42108746573743432393300c52108746573743432393400c62108746573743432" + "393500c72108746573743432393600c82108746573743432393700c92108746573743432393800ca21087465737434" + "32393900cb2108746573743433303000cc2108746573743433303100cd2108746573743433303200ce210874657374" + "3433303300cf2108746573743433303400d02108746573743433303500d12108746573743433303600d22108746573" + "743433303700d32108746573743433303800d42108746573743433303900d52108746573743433313000d621087465" + "73743433313100d72108746573743433313200d82108746573743433313300d92108746573743433313400da210874" + "6573743433313500db2108746573743433313600dc2108746573743433313700dd2108746573743433313800de2108" + "746573743433313900df2108746573743433323000e02108746573743433323100e12108746573743433323200e221" + "08746573743433323300e32108746573743433323400e42108746573743433323500e52108746573743433323600e6" + "2108746573743433323700e72108746573743433323800e82108746573743433323900e92108746573743433333000" + "ea2108746573743433333100eb2108746573743433333200ec2108746573743433333300ed21087465737434333334" + "00ee2108746573743433333500ef2108746573743433333600f02108746573743433333700f1210874657374343333" + "3800f22108746573743433333900f32108746573743433343000f42108746573743433343100f52108746573743433" + "343200f62108746573743433343300f72108746573743433343400f82108746573743433343500f921087465737434" + "33343600fa2108746573743433343700fb2108746573743433343800fc2108746573743433343900fd210874657374" + "3433353000fe2108746573743433353100ff2108746573743433353200802208746573743433353300812208746573" + "7434333534008222087465737434333535008322087465737434333536008422087465737434333537008522087465" + "7374343335380086220874657374343335390087220874657374343336300088220874657374343336310089220874" + "65737434333632008a22087465737434333633008b22087465737434333634008c22087465737434333635008d2208" + "7465737434333636008e22087465737434333637008f22087465737434333638009022087465737434333639009122" + "0874657374343337300092220874657374343337310093220874657374343337320094220874657374343337330095" + "2208746573743433373400962208746573743433373500972208746573743433373600982208746573743433373700" + "9922087465737434333738009a22087465737434333739009b22087465737434333830009c22087465737434333831" + "009d22087465737434333832009e22087465737434333833009f2208746573743433383400a0220874657374343338" + "3500a12208746573743433383600a22208746573743433383700a32208746573743433383800a42208746573743433" + "383900a52208746573743433393000a62208746573743433393100a72208746573743433393200a822087465737434" + "33393300a92208746573743433393400aa2208746573743433393500ab2208746573743433393600ac220874657374" + "3433393700ad2208746573743433393800ae2208746573743433393900af2208746573743434303000b02208746573" + "743434303100b12208746573743434303200b22208746573743434303300b32208746573743434303400b422087465" + "73743434303500b52208746573743434303600b62208746573743434303700b72208746573743434303800b8220874" + "6573743434303900b92208746573743434313000ba2208746573743434313100bb2208746573743434313200bc2208" + "746573743434313300bd2208746573743434313400be2208746573743434313500bf2208746573743434313600c022" + "08746573743434313700c12208746573743434313800c22208746573743434313900c32208746573743434323000c4" + "2208746573743434323100c52208746573743434323200c62208746573743434323300c72208746573743434323400" + "c82208746573743434323500c92208746573743434323600ca2208746573743434323700cb22087465737434343238" + "00cc2208746573743434323900cd2208746573743434333000ce2208746573743434333100cf220874657374343433" + "3200d02208746573743434333300d12208746573743434333400d22208746573743434333500d32208746573743434" + "333600d42208746573743434333700d52208746573743434333800d62208746573743434333900d722087465737434" + "34343000d82208746573743434343100d92208746573743434343200da2208746573743434343300db220874657374" + "3434343400dc2208746573743434343500dd2208746573743434343600de2208746573743434343700df2208746573" + "743434343800e02208746573743434343900e12208746573743434353000e22208746573743434353100e322087465" + "73743434353200e42208746573743434353300e52208746573743434353400e62208746573743434353500e7220874" + "6573743434353600e82208746573743434353700e92208746573743434353800ea2208746573743434353900eb2208" + "746573743434363000ec2208746573743434363100ed2208746573743434363200ee2208746573743434363300ef22" + "08746573743434363400f02208746573743434363500f12208746573743434363600f22208746573743434363700f3" + "2208746573743434363800f42208746573743434363900f52208746573743434373000f62208746573743434373100" + "f72208746573743434373200f82208746573743434373300f92208746573743434373400fa22087465737434343735" + "00fb2208746573743434373600fc2208746573743434373700fd2208746573743434373800fe220874657374343437" + "3900ff2208746573743434383000802308746573743434383100812308746573743434383200822308746573743434" + "3833008323087465737434343834008423087465737434343835008523087465737434343836008623087465737434" + "343837008723087465737434343838008823087465737434343839008923087465737434343930008a230874657374" + "34343931008b23087465737434343932008c23087465737434343933008d23087465737434343934008e2308746573" + "7434343935008f23087465737434343936009023087465737434343937009123087465737434343938009223087465" + "7374343439390093230874657374343530300094230874657374343530310095230874657374343530320096230874" + "65737434353033009723087465737434353034009823087465737434353035009923087465737434353036009a2308" + "7465737434353037009b23087465737434353038009c23087465737434353039009d23087465737434353130009e23" + "087465737434353131009f2308746573743435313200a02308746573743435313300a12308746573743435313400a2" + "2308746573743435313500a32308746573743435313600a42308746573743435313700a52308746573743435313800" + "a62308746573743435313900a72308746573743435323000a82308746573743435323100a923087465737434353232" + "00aa2308746573743435323300ab2308746573743435323400ac2308746573743435323500ad230874657374343532" + "3600ae2308746573743435323700af2308746573743435323800b02308746573743435323900b12308746573743435" + "333000b22308746573743435333100b32308746573743435333200b42308746573743435333300b523087465737434" + "35333400b62308746573743435333500b72308746573743435333600b82308746573743435333700b9230874657374" + "3435333800ba2308746573743435333900bb2308746573743435343000bc2308746573743435343100bd2308746573" + "743435343200be2308746573743435343300bf2308746573743435343400c02308746573743435343500c123087465" + "73743435343600c22308746573743435343700c32308746573743435343800c42308746573743435343900c5230874" + "6573743435353000c62308746573743435353100c72308746573743435353200c82308746573743435353300c92308" + "746573743435353400ca2308746573743435353500cb2308746573743435353600cc2308746573743435353700cd23" + "08746573743435353800ce2308746573743435353900cf2308746573743435363000d02308746573743435363100d1" + "2308746573743435363200d22308746573743435363300d32308746573743435363400d42308746573743435363500" + "d52308746573743435363600d62308746573743435363700d72308746573743435363800d823087465737434353639" + "00d92308746573743435373000da2308746573743435373100db2308746573743435373200dc230874657374343537" + "3300dd2308746573743435373400de2308746573743435373500df2308746573743435373600e02308746573743435" + "373700e12308746573743435373800e22308746573743435373900e32308746573743435383000e423087465737434" + "35383100e52308746573743435383200e62308746573743435383300e72308746573743435383400e8230874657374" + "3435383500e92308746573743435383600ea2308746573743435383700eb2308746573743435383800ec2308746573" + "743435383900ed2308746573743435393000ee2308746573743435393100ef2308746573743435393200f023087465" + "73743435393300f12308746573743435393400f22308746573743435393500f32308746573743435393600f4230874" + "6573743435393700f52308746573743435393800f62308746573743435393900f72308746573743436303000f82308" + "746573743436303100f92308746573743436303200fa2308746573743436303300fb2308746573743436303400fc23" + "08746573743436303500fd2308746573743436303600fe2308746573743436303700ff230874657374343630380080" + "2408746573743436303900812408746573743436313000822408746573743436313100832408746573743436313200" + "8424087465737434363133008524087465737434363134008624087465737434363135008724087465737434363136" + "008824087465737434363137008924087465737434363138008a24087465737434363139008b240874657374343632" + "30008c24087465737434363231008d24087465737434363232008e24087465737434363233008f2408746573743436" + "3234009024087465737434363235009124087465737434363236009224087465737434363237009324087465737434" + "3632380094240874657374343632390095240874657374343633300096240874657374343633310097240874657374" + "34363332009824087465737434363333009924087465737434363334009a24087465737434363335009b2408746573" + "7434363336009c24087465737434363337009d24087465737434363338009e24087465737434363339009f24087465" + "73743436343000a02408746573743436343100a12408746573743436343200a22408746573743436343300a3240874" + "6573743436343400a42408746573743436343500a52408746573743436343600a62408746573743436343700a72408" + "746573743436343800a82408746573743436343900a92408746573743436353000aa2408746573743436353100ab24" + "08746573743436353200ac2408746573743436353300ad2408746573743436353400ae2408746573743436353500af" + "2408746573743436353600b02408746573743436353700b12408746573743436353800b22408746573743436353900" + "b32408746573743436363000b42408746573743436363100b52408746573743436363200b624087465737434363633" + "00b72408746573743436363400b82408746573743436363500b92408746573743436363600ba240874657374343636" + "3700bb2408746573743436363800bc2408746573743436363900bd2408746573743436373000be2408746573743436" + "373100bf2408746573743436373200c02408746573743436373300c12408746573743436373400c224087465737434" + "36373500c32408746573743436373600c42408746573743436373700c52408746573743436373800c6240874657374" + "3436373900c72408746573743436383000c82408746573743436383100c92408746573743436383200ca2408746573" + "743436383300cb2408746573743436383400cc2408746573743436383500cd2408746573743436383600ce24087465" + "73743436383700cf2408746573743436383800d02408746573743436383900d12408746573743436393000d2240874" + "6573743436393100d32408746573743436393200d42408746573743436393300d52408746573743436393400d62408" + "746573743436393500d72408746573743436393600d82408746573743436393700d92408746573743436393800da24" + "08746573743436393900db2408746573743437303000dc2408746573743437303100dd2408746573743437303200de" + "2408746573743437303300df2408746573743437303400e02408746573743437303500e12408746573743437303600" + "e22408746573743437303700e32408746573743437303800e42408746573743437303900e524087465737434373130" + "00e62408746573743437313100e72408746573743437313200e82408746573743437313300e9240874657374343731" + "3400ea2408746573743437313500eb2408746573743437313600ec2408746573743437313700ed2408746573743437" + "313800ee2408746573743437313900ef2408746573743437323000f02408746573743437323100f124087465737434" + "37323200f22408746573743437323300f32408746573743437323400f42408746573743437323500f5240874657374" + "3437323600f62408746573743437323700f72408746573743437323800f82408746573743437323900f92408746573" + "743437333000fa2408746573743437333100fb2408746573743437333200fc2408746573743437333300fd24087465" + "73743437333400fe2408746573743437333500ff240874657374343733360080250874657374343733370081250874" + "6573743437333800822508746573743437333900832508746573743437343000842508746573743437343100852508" + "7465737434373432008625087465737434373433008725087465737434373434008825087465737434373435008925" + "087465737434373436008a25087465737434373437008b25087465737434373438008c25087465737434373439008d" + "25087465737434373530008e25087465737434373531008f2508746573743437353200902508746573743437353300" + "9125087465737434373534009225087465737434373535009325087465737434373536009425087465737434373537" + "0095250874657374343735380096250874657374343735390097250874657374343736300098250874657374343736" + "31009925087465737434373632009a25087465737434373633009b25087465737434373634009c2508746573743437" + "3635009d25087465737434373636009e25087465737434373637009f2508746573743437363800a025087465737434" + "37363900a12508746573743437373000a22508746573743437373100a32508746573743437373200a4250874657374" + "3437373300a52508746573743437373400a62508746573743437373500a72508746573743437373600a82508746573" + "743437373700a92508746573743437373800aa2508746573743437373900ab2508746573743437383000ac25087465" + "73743437383100ad2508746573743437383200ae2508746573743437383300af2508746573743437383400b0250874" + "6573743437383500b12508746573743437383600b22508746573743437383700b32508746573743437383800b42508" + "746573743437383900b52508746573743437393000b62508746573743437393100b72508746573743437393200b825" + "08746573743437393300b92508746573743437393400ba2508746573743437393500bb2508746573743437393600bc" + "2508746573743437393700bd2508746573743437393800be2508746573743437393900bf2508746573743438303000" + "c02508746573743438303100c12508746573743438303200c22508746573743438303300c325087465737434383034" + "00c42508746573743438303500c52508746573743438303600c62508746573743438303700c7250874657374343830" + "3800c82508746573743438303900c92508746573743438313000ca2508746573743438313100cb2508746573743438" + "313200cc2508746573743438313300cd2508746573743438313400ce2508746573743438313500cf25087465737434" + "38313600d02508746573743438313700d12508746573743438313800d22508746573743438313900d3250874657374" + "3438323000d42508746573743438323100d52508746573743438323200d62508746573743438323300d72508746573" + "743438323400d82508746573743438323500d92508746573743438323600da2508746573743438323700db25087465" + "73743438323800dc2508746573743438323900dd2508746573743438333000de2508746573743438333100df250874" + "6573743438333200e02508746573743438333300e12508746573743438333400e22508746573743438333500e32508" + "746573743438333600e42508746573743438333700e52508746573743438333800e62508746573743438333900e725" + "08746573743438343000e82508746573743438343100e92508746573743438343200ea2508746573743438343300eb" + "2508746573743438343400ec2508746573743438343500ed2508746573743438343600ee2508746573743438343700" + "ef2508746573743438343800f02508746573743438343900f12508746573743438353000f225087465737434383531" + "00f32508746573743438353200f42508746573743438353300f52508746573743438353400f6250874657374343835" + "3500f72508746573743438353600f82508746573743438353700f92508746573743438353800fa2508746573743438" + "353900fb2508746573743438363000fc2508746573743438363100fd2508746573743438363200fe25087465737434" + "38363300ff250874657374343836340080260874657374343836350081260874657374343836360082260874657374" + "3438363700832608746573743438363800842608746573743438363900852608746573743438373000862608746573" + "7434383731008726087465737434383732008826087465737434383733008926087465737434383734008a26087465" + "737434383735008b26087465737434383736008c26087465737434383737008d26087465737434383738008e260874" + "65737434383739008f2608746573743438383000902608746573743438383100912608746573743438383200922608" + "7465737434383833009326087465737434383834009426087465737434383835009526087465737434383836009626" + "087465737434383837009726087465737434383838009826087465737434383839009926087465737434383930009a" + "26087465737434383931009b26087465737434383932009c26087465737434383933009d2608746573743438393400" + "9e26087465737434383935009f2608746573743438393600a02608746573743438393700a126087465737434383938" + "00a22608746573743438393900a32608746573743439303000a42608746573743439303100a5260874657374343930" + "3200a62608746573743439303300a72608746573743439303400a82608746573743439303500a92608746573743439" + "303600aa2608746573743439303700ab2608746573743439303800ac2608746573743439303900ad26087465737434" + "39313000ae2608746573743439313100af2608746573743439313200b02608746573743439313300b1260874657374" + "3439313400b22608746573743439313500b32608746573743439313600b42608746573743439313700b52608746573" + "743439313800b62608746573743439313900b72608746573743439323000b82608746573743439323100b926087465" + "73743439323200ba2608746573743439323300bb2608746573743439323400bc2608746573743439323500bd260874" + "6573743439323600be2608746573743439323700bf2608746573743439323800c02608746573743439323900c12608" + "746573743439333000c22608746573743439333100c32608746573743439333200c42608746573743439333300c526" + "08746573743439333400c62608746573743439333500c72608746573743439333600c82608746573743439333700c9" + "2608746573743439333800ca2608746573743439333900cb2608746573743439343000cc2608746573743439343100" + "cd2608746573743439343200ce2608746573743439343300cf2608746573743439343400d026087465737434393435" + "00d12608746573743439343600d22608746573743439343700d32608746573743439343800d4260874657374343934" + "3900d52608746573743439353000d62608746573743439353100d72608746573743439353200d82608746573743439" + "353300d92608746573743439353400da2608746573743439353500db2608746573743439353600dc26087465737434" + "39353700dd2608746573743439353800de2608746573743439353900df2608746573743439363000e0260874657374" + "3439363100e12608746573743439363200e22608746573743439363300e32608746573743439363400e42608746573" + "743439363500e52608746573743439363600e62608746573743439363700e72608746573743439363800e826087465" + "73743439363900e92608746573743439373000ea2608746573743439373100eb2608746573743439373200ec260874" + "6573743439373300ed2608746573743439373400ee2608746573743439373500ef2608746573743439373600f02608" + "746573743439373700f12608746573743439373800f22608746573743439373900f32608746573743439383000f426" + "08746573743439383100f52608746573743439383200f62608746573743439383300f72608746573743439383400f8" + "2608746573743439383500f92608746573743439383600fa2608746573743439383700fb2608746573743439383800" + "fc2608746573743439383900fd2608746573743439393000fe2608746573743439393100ff26087465737434393932" + "0080270874657374343939330081270874657374343939340082270874657374343939350083270874657374343939" + "360084270874657374343939370085270874657374343939380086270874657374343939390087270ac2b802882707" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" + "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" + "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" + "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" + "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" + "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" + "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" + "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" + "6a0b"; diff --git a/src/test/app/wasm_fixtures/fixture_locals_10k.cpp b/src/test/app/wasm_fixtures/fixture_locals_10k.cpp new file mode 100644 index 00000000000..fe3b11a7a8d --- /dev/null +++ b/src/test/app/wasm_fixtures/fixture_locals_10k.cpp @@ -0,0 +1,2126 @@ +// TODO: consider moving these to separate files (and figure out the build) + +#include + +extern std::string const locals10kHex = + "0061736d0100000001070160027f7f017f03020100070801047465737400000a9b8a0601978a06018e4e7f20002001" + "6a2102200120026a2103200220036a2104200320046a2105200420056a2106200520066a2107200620076a21082007" + "20086a2109200820096a210a2009200a6a210b200a200b6a210c200b200c6a210d200c200d6a210e200d200e6a210f" + "200e200f6a2110200f20106a2111201020116a2112201120126a2113201220136a2114201320146a2115201420156a" + "2116201520166a2117201620176a2118201720186a2119201820196a211a2019201a6a211b201a201b6a211c201b20" + "1c6a211d201c201d6a211e201d201e6a211f201e201f6a2120201f20206a2121202020216a2122202120226a212320" + "2220236a2124202320246a2125202420256a2126202520266a2127202620276a2128202720286a2129202820296a21" + "2a2029202a6a212b202a202b6a212c202b202c6a212d202c202d6a212e202d202e6a212f202e202f6a2130202f2030" + "6a2131203020316a2132203120326a2133203220336a2134203320346a2135203420356a2136203520366a21372036" + "20376a2138203720386a2139203820396a213a2039203a6a213b203a203b6a213c203b203c6a213d203c203d6a213e" + "203d203e6a213f203e203f6a2140203f20406a2141204020416a2142204120426a2143204220436a2144204320446a" + "2145204420456a2146204520466a2147204620476a2148204720486a2149204820496a214a2049204a6a214b204a20" + "4b6a214c204b204c6a214d204c204d6a214e204d204e6a214f204e204f6a2150204f20506a2151205020516a215220" + "5120526a2153205220536a2154205320546a2155205420556a2156205520566a2157205620576a2158205720586a21" + "59205820596a215a2059205a6a215b205a205b6a215c205b205c6a215d205c205d6a215e205d205e6a215f205e205f" + "6a2160205f20606a2161206020616a2162206120626a2163206220636a2164206320646a2165206420656a21662065" + "20666a2167206620676a2168206720686a2169206820696a216a2069206a6a216b206a206b6a216c206b206c6a216d" + "206c206d6a216e206d206e6a216f206e206f6a2170206f20706a2171207020716a2172207120726a2173207220736a" + "2174207320746a2175207420756a2176207520766a2177207620776a2178207720786a2179207820796a217a207920" + "7a6a217b207a207b6a217c207b207c6a217d207c207d6a217e207d207e6a217f207e207f6a218001207f2080016a21" + "81012080012081016a2182012081012082016a2183012082012083016a2184012083012084016a2185012084012085" + "016a2186012085012086016a2187012086012087016a2188012087012088016a2189012088012089016a218a012089" + "01208a016a218b01208a01208b016a218c01208b01208c016a218d01208c01208d016a218e01208d01208e016a218f" + "01208e01208f016a219001208f012090016a2191012090012091016a2192012091012092016a219301209201209301" + "6a2194012093012094016a2195012094012095016a2196012095012096016a2197012096012097016a219801209701" + "2098016a2199012098012099016a219a01209901209a016a219b01209a01209b016a219c01209b01209c016a219d01" + "209c01209d016a219e01209d01209e016a219f01209e01209f016a21a001209f0120a0016a21a10120a00120a1016a" + "21a20120a10120a2016a21a30120a20120a3016a21a40120a30120a4016a21a50120a40120a5016a21a60120a50120" + "a6016a21a70120a60120a7016a21a80120a70120a8016a21a90120a80120a9016a21aa0120a90120aa016a21ab0120" + "aa0120ab016a21ac0120ab0120ac016a21ad0120ac0120ad016a21ae0120ad0120ae016a21af0120ae0120af016a21" + "b00120af0120b0016a21b10120b00120b1016a21b20120b10120b2016a21b30120b20120b3016a21b40120b30120b4" + "016a21b50120b40120b5016a21b60120b50120b6016a21b70120b60120b7016a21b80120b70120b8016a21b90120b8" + "0120b9016a21ba0120b90120ba016a21bb0120ba0120bb016a21bc0120bb0120bc016a21bd0120bc0120bd016a21be" + "0120bd0120be016a21bf0120be0120bf016a21c00120bf0120c0016a21c10120c00120c1016a21c20120c10120c201" + "6a21c30120c20120c3016a21c40120c30120c4016a21c50120c40120c5016a21c60120c50120c6016a21c70120c601" + "20c7016a21c80120c70120c8016a21c90120c80120c9016a21ca0120c90120ca016a21cb0120ca0120cb016a21cc01" + "20cb0120cc016a21cd0120cc0120cd016a21ce0120cd0120ce016a21cf0120ce0120cf016a21d00120cf0120d0016a" + "21d10120d00120d1016a21d20120d10120d2016a21d30120d20120d3016a21d40120d30120d4016a21d50120d40120" + "d5016a21d60120d50120d6016a21d70120d60120d7016a21d80120d70120d8016a21d90120d80120d9016a21da0120" + "d90120da016a21db0120da0120db016a21dc0120db0120dc016a21dd0120dc0120dd016a21de0120dd0120de016a21" + "df0120de0120df016a21e00120df0120e0016a21e10120e00120e1016a21e20120e10120e2016a21e30120e20120e3" + "016a21e40120e30120e4016a21e50120e40120e5016a21e60120e50120e6016a21e70120e60120e7016a21e80120e7" + "0120e8016a21e90120e80120e9016a21ea0120e90120ea016a21eb0120ea0120eb016a21ec0120eb0120ec016a21ed" + "0120ec0120ed016a21ee0120ed0120ee016a21ef0120ee0120ef016a21f00120ef0120f0016a21f10120f00120f101" + "6a21f20120f10120f2016a21f30120f20120f3016a21f40120f30120f4016a21f50120f40120f5016a21f60120f501" + "20f6016a21f70120f60120f7016a21f80120f70120f8016a21f90120f80120f9016a21fa0120f90120fa016a21fb01" + "20fa0120fb016a21fc0120fb0120fc016a21fd0120fc0120fd016a21fe0120fd0120fe016a21ff0120fe0120ff016a" + "21800220ff012080026a2181022080022081026a2182022081022082026a2183022082022083026a21840220830220" + "84026a2185022084022085026a2186022085022086026a2187022086022087026a2188022087022088026a21890220" + "88022089026a218a02208902208a026a218b02208a02208b026a218c02208b02208c026a218d02208c02208d026a21" + "8e02208d02208e026a218f02208e02208f026a219002208f022090026a2191022090022091026a2192022091022092" + "026a2193022092022093026a2194022093022094026a2195022094022095026a2196022095022096026a2197022096" + "022097026a2198022097022098026a2199022098022099026a219a02209902209a026a219b02209a02209b026a219c" + "02209b02209c026a219d02209c02209d026a219e02209d02209e026a219f02209e02209f026a21a002209f0220a002" + "6a21a10220a00220a1026a21a20220a10220a2026a21a30220a20220a3026a21a40220a30220a4026a21a50220a402" + "20a5026a21a60220a50220a6026a21a70220a60220a7026a21a80220a70220a8026a21a90220a80220a9026a21aa02" + "20a90220aa026a21ab0220aa0220ab026a21ac0220ab0220ac026a21ad0220ac0220ad026a21ae0220ad0220ae026a" + "21af0220ae0220af026a21b00220af0220b0026a21b10220b00220b1026a21b20220b10220b2026a21b30220b20220" + "b3026a21b40220b30220b4026a21b50220b40220b5026a21b60220b50220b6026a21b70220b60220b7026a21b80220" + "b70220b8026a21b90220b80220b9026a21ba0220b90220ba026a21bb0220ba0220bb026a21bc0220bb0220bc026a21" + "bd0220bc0220bd026a21be0220bd0220be026a21bf0220be0220bf026a21c00220bf0220c0026a21c10220c00220c1" + "026a21c20220c10220c2026a21c30220c20220c3026a21c40220c30220c4026a21c50220c40220c5026a21c60220c5" + "0220c6026a21c70220c60220c7026a21c80220c70220c8026a21c90220c80220c9026a21ca0220c90220ca026a21cb" + "0220ca0220cb026a21cc0220cb0220cc026a21cd0220cc0220cd026a21ce0220cd0220ce026a21cf0220ce0220cf02" + "6a21d00220cf0220d0026a21d10220d00220d1026a21d20220d10220d2026a21d30220d20220d3026a21d40220d302" + "20d4026a21d50220d40220d5026a21d60220d50220d6026a21d70220d60220d7026a21d80220d70220d8026a21d902" + "20d80220d9026a21da0220d90220da026a21db0220da0220db026a21dc0220db0220dc026a21dd0220dc0220dd026a" + "21de0220dd0220de026a21df0220de0220df026a21e00220df0220e0026a21e10220e00220e1026a21e20220e10220" + "e2026a21e30220e20220e3026a21e40220e30220e4026a21e50220e40220e5026a21e60220e50220e6026a21e70220" + "e60220e7026a21e80220e70220e8026a21e90220e80220e9026a21ea0220e90220ea026a21eb0220ea0220eb026a21" + "ec0220eb0220ec026a21ed0220ec0220ed026a21ee0220ed0220ee026a21ef0220ee0220ef026a21f00220ef0220f0" + "026a21f10220f00220f1026a21f20220f10220f2026a21f30220f20220f3026a21f40220f30220f4026a21f50220f4" + "0220f5026a21f60220f50220f6026a21f70220f60220f7026a21f80220f70220f8026a21f90220f80220f9026a21fa" + "0220f90220fa026a21fb0220fa0220fb026a21fc0220fb0220fc026a21fd0220fc0220fd026a21fe0220fd0220fe02" + "6a21ff0220fe0220ff026a21800320ff022080036a2181032080032081036a2182032081032082036a218303208203" + "2083036a2184032083032084036a2185032084032085036a2186032085032086036a2187032086032087036a218803" + "2087032088036a2189032088032089036a218a03208903208a036a218b03208a03208b036a218c03208b03208c036a" + "218d03208c03208d036a218e03208d03208e036a218f03208e03208f036a219003208f032090036a21910320900320" + "91036a2192032091032092036a2193032092032093036a2194032093032094036a2195032094032095036a21960320" + "95032096036a2197032096032097036a2198032097032098036a2199032098032099036a219a03209903209a036a21" + "9b03209a03209b036a219c03209b03209c036a219d03209c03209d036a219e03209d03209e036a219f03209e03209f" + "036a21a003209f0320a0036a21a10320a00320a1036a21a20320a10320a2036a21a30320a20320a3036a21a40320a3" + "0320a4036a21a50320a40320a5036a21a60320a50320a6036a21a70320a60320a7036a21a80320a70320a8036a21a9" + "0320a80320a9036a21aa0320a90320aa036a21ab0320aa0320ab036a21ac0320ab0320ac036a21ad0320ac0320ad03" + "6a21ae0320ad0320ae036a21af0320ae0320af036a21b00320af0320b0036a21b10320b00320b1036a21b20320b103" + "20b2036a21b30320b20320b3036a21b40320b30320b4036a21b50320b40320b5036a21b60320b50320b6036a21b703" + "20b60320b7036a21b80320b70320b8036a21b90320b80320b9036a21ba0320b90320ba036a21bb0320ba0320bb036a" + "21bc0320bb0320bc036a21bd0320bc0320bd036a21be0320bd0320be036a21bf0320be0320bf036a21c00320bf0320" + "c0036a21c10320c00320c1036a21c20320c10320c2036a21c30320c20320c3036a21c40320c30320c4036a21c50320" + "c40320c5036a21c60320c50320c6036a21c70320c60320c7036a21c80320c70320c8036a21c90320c80320c9036a21" + "ca0320c90320ca036a21cb0320ca0320cb036a21cc0320cb0320cc036a21cd0320cc0320cd036a21ce0320cd0320ce" + "036a21cf0320ce0320cf036a21d00320cf0320d0036a21d10320d00320d1036a21d20320d10320d2036a21d30320d2" + "0320d3036a21d40320d30320d4036a21d50320d40320d5036a21d60320d50320d6036a21d70320d60320d7036a21d8" + "0320d70320d8036a21d90320d80320d9036a21da0320d90320da036a21db0320da0320db036a21dc0320db0320dc03" + "6a21dd0320dc0320dd036a21de0320dd0320de036a21df0320de0320df036a21e00320df0320e0036a21e10320e003" + "20e1036a21e20320e10320e2036a21e30320e20320e3036a21e40320e30320e4036a21e50320e40320e5036a21e603" + "20e50320e6036a21e70320e60320e7036a21e80320e70320e8036a21e90320e80320e9036a21ea0320e90320ea036a" + "21eb0320ea0320eb036a21ec0320eb0320ec036a21ed0320ec0320ed036a21ee0320ed0320ee036a21ef0320ee0320" + "ef036a21f00320ef0320f0036a21f10320f00320f1036a21f20320f10320f2036a21f30320f20320f3036a21f40320" + "f30320f4036a21f50320f40320f5036a21f60320f50320f6036a21f70320f60320f7036a21f80320f70320f8036a21" + "f90320f80320f9036a21fa0320f90320fa036a21fb0320fa0320fb036a21fc0320fb0320fc036a21fd0320fc0320fd" + "036a21fe0320fd0320fe036a21ff0320fe0320ff036a21800420ff032080046a2181042080042081046a2182042081" + "042082046a2183042082042083046a2184042083042084046a2185042084042085046a2186042085042086046a2187" + "042086042087046a2188042087042088046a2189042088042089046a218a04208904208a046a218b04208a04208b04" + "6a218c04208b04208c046a218d04208c04208d046a218e04208d04208e046a218f04208e04208f046a219004208f04" + "2090046a2191042090042091046a2192042091042092046a2193042092042093046a2194042093042094046a219504" + "2094042095046a2196042095042096046a2197042096042097046a2198042097042098046a2199042098042099046a" + "219a04209904209a046a219b04209a04209b046a219c04209b04209c046a219d04209c04209d046a219e04209d0420" + "9e046a219f04209e04209f046a21a004209f0420a0046a21a10420a00420a1046a21a20420a10420a2046a21a30420" + "a20420a3046a21a40420a30420a4046a21a50420a40420a5046a21a60420a50420a6046a21a70420a60420a7046a21" + "a80420a70420a8046a21a90420a80420a9046a21aa0420a90420aa046a21ab0420aa0420ab046a21ac0420ab0420ac" + "046a21ad0420ac0420ad046a21ae0420ad0420ae046a21af0420ae0420af046a21b00420af0420b0046a21b10420b0" + "0420b1046a21b20420b10420b2046a21b30420b20420b3046a21b40420b30420b4046a21b50420b40420b5046a21b6" + "0420b50420b6046a21b70420b60420b7046a21b80420b70420b8046a21b90420b80420b9046a21ba0420b90420ba04" + "6a21bb0420ba0420bb046a21bc0420bb0420bc046a21bd0420bc0420bd046a21be0420bd0420be046a21bf0420be04" + "20bf046a21c00420bf0420c0046a21c10420c00420c1046a21c20420c10420c2046a21c30420c20420c3046a21c404" + "20c30420c4046a21c50420c40420c5046a21c60420c50420c6046a21c70420c60420c7046a21c80420c70420c8046a" + "21c90420c80420c9046a21ca0420c90420ca046a21cb0420ca0420cb046a21cc0420cb0420cc046a21cd0420cc0420" + "cd046a21ce0420cd0420ce046a21cf0420ce0420cf046a21d00420cf0420d0046a21d10420d00420d1046a21d20420" + "d10420d2046a21d30420d20420d3046a21d40420d30420d4046a21d50420d40420d5046a21d60420d50420d6046a21" + "d70420d60420d7046a21d80420d70420d8046a21d90420d80420d9046a21da0420d90420da046a21db0420da0420db" + "046a21dc0420db0420dc046a21dd0420dc0420dd046a21de0420dd0420de046a21df0420de0420df046a21e00420df" + "0420e0046a21e10420e00420e1046a21e20420e10420e2046a21e30420e20420e3046a21e40420e30420e4046a21e5" + "0420e40420e5046a21e60420e50420e6046a21e70420e60420e7046a21e80420e70420e8046a21e90420e80420e904" + "6a21ea0420e90420ea046a21eb0420ea0420eb046a21ec0420eb0420ec046a21ed0420ec0420ed046a21ee0420ed04" + "20ee046a21ef0420ee0420ef046a21f00420ef0420f0046a21f10420f00420f1046a21f20420f10420f2046a21f304" + "20f20420f3046a21f40420f30420f4046a21f50420f40420f5046a21f60420f50420f6046a21f70420f60420f7046a" + "21f80420f70420f8046a21f90420f80420f9046a21fa0420f90420fa046a21fb0420fa0420fb046a21fc0420fb0420" + "fc046a21fd0420fc0420fd046a21fe0420fd0420fe046a21ff0420fe0420ff046a21800520ff042080056a21810520" + "80052081056a2182052081052082056a2183052082052083056a2184052083052084056a2185052084052085056a21" + "86052085052086056a2187052086052087056a2188052087052088056a2189052088052089056a218a05208905208a" + "056a218b05208a05208b056a218c05208b05208c056a218d05208c05208d056a218e05208d05208e056a218f05208e" + "05208f056a219005208f052090056a2191052090052091056a2192052091052092056a2193052092052093056a2194" + "052093052094056a2195052094052095056a2196052095052096056a2197052096052097056a219805209705209805" + "6a2199052098052099056a219a05209905209a056a219b05209a05209b056a219c05209b05209c056a219d05209c05" + "209d056a219e05209d05209e056a219f05209e05209f056a21a005209f0520a0056a21a10520a00520a1056a21a205" + "20a10520a2056a21a30520a20520a3056a21a40520a30520a4056a21a50520a40520a5056a21a60520a50520a6056a" + "21a70520a60520a7056a21a80520a70520a8056a21a90520a80520a9056a21aa0520a90520aa056a21ab0520aa0520" + "ab056a21ac0520ab0520ac056a21ad0520ac0520ad056a21ae0520ad0520ae056a21af0520ae0520af056a21b00520" + "af0520b0056a21b10520b00520b1056a21b20520b10520b2056a21b30520b20520b3056a21b40520b30520b4056a21" + "b50520b40520b5056a21b60520b50520b6056a21b70520b60520b7056a21b80520b70520b8056a21b90520b80520b9" + "056a21ba0520b90520ba056a21bb0520ba0520bb056a21bc0520bb0520bc056a21bd0520bc0520bd056a21be0520bd" + "0520be056a21bf0520be0520bf056a21c00520bf0520c0056a21c10520c00520c1056a21c20520c10520c2056a21c3" + "0520c20520c3056a21c40520c30520c4056a21c50520c40520c5056a21c60520c50520c6056a21c70520c60520c705" + "6a21c80520c70520c8056a21c90520c80520c9056a21ca0520c90520ca056a21cb0520ca0520cb056a21cc0520cb05" + "20cc056a21cd0520cc0520cd056a21ce0520cd0520ce056a21cf0520ce0520cf056a21d00520cf0520d0056a21d105" + "20d00520d1056a21d20520d10520d2056a21d30520d20520d3056a21d40520d30520d4056a21d50520d40520d5056a" + "21d60520d50520d6056a21d70520d60520d7056a21d80520d70520d8056a21d90520d80520d9056a21da0520d90520" + "da056a21db0520da0520db056a21dc0520db0520dc056a21dd0520dc0520dd056a21de0520dd0520de056a21df0520" + "de0520df056a21e00520df0520e0056a21e10520e00520e1056a21e20520e10520e2056a21e30520e20520e3056a21" + "e40520e30520e4056a21e50520e40520e5056a21e60520e50520e6056a21e70520e60520e7056a21e80520e70520e8" + "056a21e90520e80520e9056a21ea0520e90520ea056a21eb0520ea0520eb056a21ec0520eb0520ec056a21ed0520ec" + "0520ed056a21ee0520ed0520ee056a21ef0520ee0520ef056a21f00520ef0520f0056a21f10520f00520f1056a21f2" + "0520f10520f2056a21f30520f20520f3056a21f40520f30520f4056a21f50520f40520f5056a21f60520f50520f605" + "6a21f70520f60520f7056a21f80520f70520f8056a21f90520f80520f9056a21fa0520f90520fa056a21fb0520fa05" + "20fb056a21fc0520fb0520fc056a21fd0520fc0520fd056a21fe0520fd0520fe056a21ff0520fe0520ff056a218006" + "20ff052080066a2181062080062081066a2182062081062082066a2183062082062083066a2184062083062084066a" + "2185062084062085066a2186062085062086066a2187062086062087066a2188062087062088066a21890620880620" + "89066a218a06208906208a066a218b06208a06208b066a218c06208b06208c066a218d06208c06208d066a218e0620" + "8d06208e066a218f06208e06208f066a219006208f062090066a2191062090062091066a2192062091062092066a21" + "93062092062093066a2194062093062094066a2195062094062095066a2196062095062096066a2197062096062097" + "066a2198062097062098066a2199062098062099066a219a06209906209a066a219b06209a06209b066a219c06209b" + "06209c066a219d06209c06209d066a219e06209d06209e066a219f06209e06209f066a21a006209f0620a0066a21a1" + "0620a00620a1066a21a20620a10620a2066a21a30620a20620a3066a21a40620a30620a4066a21a50620a40620a506" + "6a21a60620a50620a6066a21a70620a60620a7066a21a80620a70620a8066a21a90620a80620a9066a21aa0620a906" + "20aa066a21ab0620aa0620ab066a21ac0620ab0620ac066a21ad0620ac0620ad066a21ae0620ad0620ae066a21af06" + "20ae0620af066a21b00620af0620b0066a21b10620b00620b1066a21b20620b10620b2066a21b30620b20620b3066a" + "21b40620b30620b4066a21b50620b40620b5066a21b60620b50620b6066a21b70620b60620b7066a21b80620b70620" + "b8066a21b90620b80620b9066a21ba0620b90620ba066a21bb0620ba0620bb066a21bc0620bb0620bc066a21bd0620" + "bc0620bd066a21be0620bd0620be066a21bf0620be0620bf066a21c00620bf0620c0066a21c10620c00620c1066a21" + "c20620c10620c2066a21c30620c20620c3066a21c40620c30620c4066a21c50620c40620c5066a21c60620c50620c6" + "066a21c70620c60620c7066a21c80620c70620c8066a21c90620c80620c9066a21ca0620c90620ca066a21cb0620ca" + "0620cb066a21cc0620cb0620cc066a21cd0620cc0620cd066a21ce0620cd0620ce066a21cf0620ce0620cf066a21d0" + "0620cf0620d0066a21d10620d00620d1066a21d20620d10620d2066a21d30620d20620d3066a21d40620d30620d406" + "6a21d50620d40620d5066a21d60620d50620d6066a21d70620d60620d7066a21d80620d70620d8066a21d90620d806" + "20d9066a21da0620d90620da066a21db0620da0620db066a21dc0620db0620dc066a21dd0620dc0620dd066a21de06" + "20dd0620de066a21df0620de0620df066a21e00620df0620e0066a21e10620e00620e1066a21e20620e10620e2066a" + "21e30620e20620e3066a21e40620e30620e4066a21e50620e40620e5066a21e60620e50620e6066a21e70620e60620" + "e7066a21e80620e70620e8066a21e90620e80620e9066a21ea0620e90620ea066a21eb0620ea0620eb066a21ec0620" + "eb0620ec066a21ed0620ec0620ed066a21ee0620ed0620ee066a21ef0620ee0620ef066a21f00620ef0620f0066a21" + "f10620f00620f1066a21f20620f10620f2066a21f30620f20620f3066a21f40620f30620f4066a21f50620f40620f5" + "066a21f60620f50620f6066a21f70620f60620f7066a21f80620f70620f8066a21f90620f80620f9066a21fa0620f9" + "0620fa066a21fb0620fa0620fb066a21fc0620fb0620fc066a21fd0620fc0620fd066a21fe0620fd0620fe066a21ff" + "0620fe0620ff066a21800720ff062080076a2181072080072081076a2182072081072082076a218307208207208307" + "6a2184072083072084076a2185072084072085076a2186072085072086076a2187072086072087076a218807208707" + "2088076a2189072088072089076a218a07208907208a076a218b07208a07208b076a218c07208b07208c076a218d07" + "208c07208d076a218e07208d07208e076a218f07208e07208f076a219007208f072090076a2191072090072091076a" + "2192072091072092076a2193072092072093076a2194072093072094076a2195072094072095076a21960720950720" + "96076a2197072096072097076a2198072097072098076a2199072098072099076a219a07209907209a076a219b0720" + "9a07209b076a219c07209b07209c076a219d07209c07209d076a219e07209d07209e076a219f07209e07209f076a21" + "a007209f0720a0076a21a10720a00720a1076a21a20720a10720a2076a21a30720a20720a3076a21a40720a30720a4" + "076a21a50720a40720a5076a21a60720a50720a6076a21a70720a60720a7076a21a80720a70720a8076a21a90720a8" + "0720a9076a21aa0720a90720aa076a21ab0720aa0720ab076a21ac0720ab0720ac076a21ad0720ac0720ad076a21ae" + "0720ad0720ae076a21af0720ae0720af076a21b00720af0720b0076a21b10720b00720b1076a21b20720b10720b207" + "6a21b30720b20720b3076a21b40720b30720b4076a21b50720b40720b5076a21b60720b50720b6076a21b70720b607" + "20b7076a21b80720b70720b8076a21b90720b80720b9076a21ba0720b90720ba076a21bb0720ba0720bb076a21bc07" + "20bb0720bc076a21bd0720bc0720bd076a21be0720bd0720be076a21bf0720be0720bf076a21c00720bf0720c0076a" + "21c10720c00720c1076a21c20720c10720c2076a21c30720c20720c3076a21c40720c30720c4076a21c50720c40720" + "c5076a21c60720c50720c6076a21c70720c60720c7076a21c80720c70720c8076a21c90720c80720c9076a21ca0720" + "c90720ca076a21cb0720ca0720cb076a21cc0720cb0720cc076a21cd0720cc0720cd076a21ce0720cd0720ce076a21" + "cf0720ce0720cf076a21d00720cf0720d0076a21d10720d00720d1076a21d20720d10720d2076a21d30720d20720d3" + "076a21d40720d30720d4076a21d50720d40720d5076a21d60720d50720d6076a21d70720d60720d7076a21d80720d7" + "0720d8076a21d90720d80720d9076a21da0720d90720da076a21db0720da0720db076a21dc0720db0720dc076a21dd" + "0720dc0720dd076a21de0720dd0720de076a21df0720de0720df076a21e00720df0720e0076a21e10720e00720e107" + "6a21e20720e10720e2076a21e30720e20720e3076a21e40720e30720e4076a21e50720e40720e5076a21e60720e507" + "20e6076a21e70720e60720e7076a21e80720e70720e8076a21e90720e80720e9076a21ea0720e90720ea076a21eb07" + "20ea0720eb076a21ec0720eb0720ec076a21ed0720ec0720ed076a21ee0720ed0720ee076a21ef0720ee0720ef076a" + "21f00720ef0720f0076a21f10720f00720f1076a21f20720f10720f2076a21f30720f20720f3076a21f40720f30720" + "f4076a21f50720f40720f5076a21f60720f50720f6076a21f70720f60720f7076a21f80720f70720f8076a21f90720" + "f80720f9076a21fa0720f90720fa076a21fb0720fa0720fb076a21fc0720fb0720fc076a21fd0720fc0720fd076a21" + "fe0720fd0720fe076a21ff0720fe0720ff076a21800820ff072080086a2181082080082081086a2182082081082082" + "086a2183082082082083086a2184082083082084086a2185082084082085086a2186082085082086086a2187082086" + "082087086a2188082087082088086a2189082088082089086a218a08208908208a086a218b08208a08208b086a218c" + "08208b08208c086a218d08208c08208d086a218e08208d08208e086a218f08208e08208f086a219008208f08209008" + "6a2191082090082091086a2192082091082092086a2193082092082093086a2194082093082094086a219508209408" + "2095086a2196082095082096086a2197082096082097086a2198082097082098086a2199082098082099086a219a08" + "209908209a086a219b08209a08209b086a219c08209b08209c086a219d08209c08209d086a219e08209d08209e086a" + "219f08209e08209f086a21a008209f0820a0086a21a10820a00820a1086a21a20820a10820a2086a21a30820a20820" + "a3086a21a40820a30820a4086a21a50820a40820a5086a21a60820a50820a6086a21a70820a60820a7086a21a80820" + "a70820a8086a21a90820a80820a9086a21aa0820a90820aa086a21ab0820aa0820ab086a21ac0820ab0820ac086a21" + "ad0820ac0820ad086a21ae0820ad0820ae086a21af0820ae0820af086a21b00820af0820b0086a21b10820b00820b1" + "086a21b20820b10820b2086a21b30820b20820b3086a21b40820b30820b4086a21b50820b40820b5086a21b60820b5" + "0820b6086a21b70820b60820b7086a21b80820b70820b8086a21b90820b80820b9086a21ba0820b90820ba086a21bb" + "0820ba0820bb086a21bc0820bb0820bc086a21bd0820bc0820bd086a21be0820bd0820be086a21bf0820be0820bf08" + "6a21c00820bf0820c0086a21c10820c00820c1086a21c20820c10820c2086a21c30820c20820c3086a21c40820c308" + "20c4086a21c50820c40820c5086a21c60820c50820c6086a21c70820c60820c7086a21c80820c70820c8086a21c908" + "20c80820c9086a21ca0820c90820ca086a21cb0820ca0820cb086a21cc0820cb0820cc086a21cd0820cc0820cd086a" + "21ce0820cd0820ce086a21cf0820ce0820cf086a21d00820cf0820d0086a21d10820d00820d1086a21d20820d10820" + "d2086a21d30820d20820d3086a21d40820d30820d4086a21d50820d40820d5086a21d60820d50820d6086a21d70820" + "d60820d7086a21d80820d70820d8086a21d90820d80820d9086a21da0820d90820da086a21db0820da0820db086a21" + "dc0820db0820dc086a21dd0820dc0820dd086a21de0820dd0820de086a21df0820de0820df086a21e00820df0820e0" + "086a21e10820e00820e1086a21e20820e10820e2086a21e30820e20820e3086a21e40820e30820e4086a21e50820e4" + "0820e5086a21e60820e50820e6086a21e70820e60820e7086a21e80820e70820e8086a21e90820e80820e9086a21ea" + "0820e90820ea086a21eb0820ea0820eb086a21ec0820eb0820ec086a21ed0820ec0820ed086a21ee0820ed0820ee08" + "6a21ef0820ee0820ef086a21f00820ef0820f0086a21f10820f00820f1086a21f20820f10820f2086a21f30820f208" + "20f3086a21f40820f30820f4086a21f50820f40820f5086a21f60820f50820f6086a21f70820f60820f7086a21f808" + "20f70820f8086a21f90820f80820f9086a21fa0820f90820fa086a21fb0820fa0820fb086a21fc0820fb0820fc086a" + "21fd0820fc0820fd086a21fe0820fd0820fe086a21ff0820fe0820ff086a21800920ff082080096a21810920800920" + "81096a2182092081092082096a2183092082092083096a2184092083092084096a2185092084092085096a21860920" + "85092086096a2187092086092087096a2188092087092088096a2189092088092089096a218a09208909208a096a21" + "8b09208a09208b096a218c09208b09208c096a218d09208c09208d096a218e09208d09208e096a218f09208e09208f" + "096a219009208f092090096a2191092090092091096a2192092091092092096a2193092092092093096a2194092093" + "092094096a2195092094092095096a2196092095092096096a2197092096092097096a2198092097092098096a2199" + "092098092099096a219a09209909209a096a219b09209a09209b096a219c09209b09209c096a219d09209c09209d09" + "6a219e09209d09209e096a219f09209e09209f096a21a009209f0920a0096a21a10920a00920a1096a21a20920a109" + "20a2096a21a30920a20920a3096a21a40920a30920a4096a21a50920a40920a5096a21a60920a50920a6096a21a709" + "20a60920a7096a21a80920a70920a8096a21a90920a80920a9096a21aa0920a90920aa096a21ab0920aa0920ab096a" + "21ac0920ab0920ac096a21ad0920ac0920ad096a21ae0920ad0920ae096a21af0920ae0920af096a21b00920af0920" + "b0096a21b10920b00920b1096a21b20920b10920b2096a21b30920b20920b3096a21b40920b30920b4096a21b50920" + "b40920b5096a21b60920b50920b6096a21b70920b60920b7096a21b80920b70920b8096a21b90920b80920b9096a21" + "ba0920b90920ba096a21bb0920ba0920bb096a21bc0920bb0920bc096a21bd0920bc0920bd096a21be0920bd0920be" + "096a21bf0920be0920bf096a21c00920bf0920c0096a21c10920c00920c1096a21c20920c10920c2096a21c30920c2" + "0920c3096a21c40920c30920c4096a21c50920c40920c5096a21c60920c50920c6096a21c70920c60920c7096a21c8" + "0920c70920c8096a21c90920c80920c9096a21ca0920c90920ca096a21cb0920ca0920cb096a21cc0920cb0920cc09" + "6a21cd0920cc0920cd096a21ce0920cd0920ce096a21cf0920ce0920cf096a21d00920cf0920d0096a21d10920d009" + "20d1096a21d20920d10920d2096a21d30920d20920d3096a21d40920d30920d4096a21d50920d40920d5096a21d609" + "20d50920d6096a21d70920d60920d7096a21d80920d70920d8096a21d90920d80920d9096a21da0920d90920da096a" + "21db0920da0920db096a21dc0920db0920dc096a21dd0920dc0920dd096a21de0920dd0920de096a21df0920de0920" + "df096a21e00920df0920e0096a21e10920e00920e1096a21e20920e10920e2096a21e30920e20920e3096a21e40920" + "e30920e4096a21e50920e40920e5096a21e60920e50920e6096a21e70920e60920e7096a21e80920e70920e8096a21" + "e90920e80920e9096a21ea0920e90920ea096a21eb0920ea0920eb096a21ec0920eb0920ec096a21ed0920ec0920ed" + "096a21ee0920ed0920ee096a21ef0920ee0920ef096a21f00920ef0920f0096a21f10920f00920f1096a21f20920f1" + "0920f2096a21f30920f20920f3096a21f40920f30920f4096a21f50920f40920f5096a21f60920f50920f6096a21f7" + "0920f60920f7096a21f80920f70920f8096a21f90920f80920f9096a21fa0920f90920fa096a21fb0920fa0920fb09" + "6a21fc0920fb0920fc096a21fd0920fc0920fd096a21fe0920fd0920fe096a21ff0920fe0920ff096a21800a20ff09" + "20800a6a21810a20800a20810a6a21820a20810a20820a6a21830a20820a20830a6a21840a20830a20840a6a21850a" + "20840a20850a6a21860a20850a20860a6a21870a20860a20870a6a21880a20870a20880a6a21890a20880a20890a6a" + "218a0a20890a208a0a6a218b0a208a0a208b0a6a218c0a208b0a208c0a6a218d0a208c0a208d0a6a218e0a208d0a20" + "8e0a6a218f0a208e0a208f0a6a21900a208f0a20900a6a21910a20900a20910a6a21920a20910a20920a6a21930a20" + "920a20930a6a21940a20930a20940a6a21950a20940a20950a6a21960a20950a20960a6a21970a20960a20970a6a21" + "980a20970a20980a6a21990a20980a20990a6a219a0a20990a209a0a6a219b0a209a0a209b0a6a219c0a209b0a209c" + "0a6a219d0a209c0a209d0a6a219e0a209d0a209e0a6a219f0a209e0a209f0a6a21a00a209f0a20a00a6a21a10a20a0" + "0a20a10a6a21a20a20a10a20a20a6a21a30a20a20a20a30a6a21a40a20a30a20a40a6a21a50a20a40a20a50a6a21a6" + "0a20a50a20a60a6a21a70a20a60a20a70a6a21a80a20a70a20a80a6a21a90a20a80a20a90a6a21aa0a20a90a20aa0a" + "6a21ab0a20aa0a20ab0a6a21ac0a20ab0a20ac0a6a21ad0a20ac0a20ad0a6a21ae0a20ad0a20ae0a6a21af0a20ae0a" + "20af0a6a21b00a20af0a20b00a6a21b10a20b00a20b10a6a21b20a20b10a20b20a6a21b30a20b20a20b30a6a21b40a" + "20b30a20b40a6a21b50a20b40a20b50a6a21b60a20b50a20b60a6a21b70a20b60a20b70a6a21b80a20b70a20b80a6a" + "21b90a20b80a20b90a6a21ba0a20b90a20ba0a6a21bb0a20ba0a20bb0a6a21bc0a20bb0a20bc0a6a21bd0a20bc0a20" + "bd0a6a21be0a20bd0a20be0a6a21bf0a20be0a20bf0a6a21c00a20bf0a20c00a6a21c10a20c00a20c10a6a21c20a20" + "c10a20c20a6a21c30a20c20a20c30a6a21c40a20c30a20c40a6a21c50a20c40a20c50a6a21c60a20c50a20c60a6a21" + "c70a20c60a20c70a6a21c80a20c70a20c80a6a21c90a20c80a20c90a6a21ca0a20c90a20ca0a6a21cb0a20ca0a20cb" + "0a6a21cc0a20cb0a20cc0a6a21cd0a20cc0a20cd0a6a21ce0a20cd0a20ce0a6a21cf0a20ce0a20cf0a6a21d00a20cf" + "0a20d00a6a21d10a20d00a20d10a6a21d20a20d10a20d20a6a21d30a20d20a20d30a6a21d40a20d30a20d40a6a21d5" + "0a20d40a20d50a6a21d60a20d50a20d60a6a21d70a20d60a20d70a6a21d80a20d70a20d80a6a21d90a20d80a20d90a" + "6a21da0a20d90a20da0a6a21db0a20da0a20db0a6a21dc0a20db0a20dc0a6a21dd0a20dc0a20dd0a6a21de0a20dd0a" + "20de0a6a21df0a20de0a20df0a6a21e00a20df0a20e00a6a21e10a20e00a20e10a6a21e20a20e10a20e20a6a21e30a" + "20e20a20e30a6a21e40a20e30a20e40a6a21e50a20e40a20e50a6a21e60a20e50a20e60a6a21e70a20e60a20e70a6a" + "21e80a20e70a20e80a6a21e90a20e80a20e90a6a21ea0a20e90a20ea0a6a21eb0a20ea0a20eb0a6a21ec0a20eb0a20" + "ec0a6a21ed0a20ec0a20ed0a6a21ee0a20ed0a20ee0a6a21ef0a20ee0a20ef0a6a21f00a20ef0a20f00a6a21f10a20" + "f00a20f10a6a21f20a20f10a20f20a6a21f30a20f20a20f30a6a21f40a20f30a20f40a6a21f50a20f40a20f50a6a21" + "f60a20f50a20f60a6a21f70a20f60a20f70a6a21f80a20f70a20f80a6a21f90a20f80a20f90a6a21fa0a20f90a20fa" + "0a6a21fb0a20fa0a20fb0a6a21fc0a20fb0a20fc0a6a21fd0a20fc0a20fd0a6a21fe0a20fd0a20fe0a6a21ff0a20fe" + "0a20ff0a6a21800b20ff0a20800b6a21810b20800b20810b6a21820b20810b20820b6a21830b20820b20830b6a2184" + "0b20830b20840b6a21850b20840b20850b6a21860b20850b20860b6a21870b20860b20870b6a21880b20870b20880b" + "6a21890b20880b20890b6a218a0b20890b208a0b6a218b0b208a0b208b0b6a218c0b208b0b208c0b6a218d0b208c0b" + "208d0b6a218e0b208d0b208e0b6a218f0b208e0b208f0b6a21900b208f0b20900b6a21910b20900b20910b6a21920b" + "20910b20920b6a21930b20920b20930b6a21940b20930b20940b6a21950b20940b20950b6a21960b20950b20960b6a" + "21970b20960b20970b6a21980b20970b20980b6a21990b20980b20990b6a219a0b20990b209a0b6a219b0b209a0b20" + "9b0b6a219c0b209b0b209c0b6a219d0b209c0b209d0b6a219e0b209d0b209e0b6a219f0b209e0b209f0b6a21a00b20" + "9f0b20a00b6a21a10b20a00b20a10b6a21a20b20a10b20a20b6a21a30b20a20b20a30b6a21a40b20a30b20a40b6a21" + "a50b20a40b20a50b6a21a60b20a50b20a60b6a21a70b20a60b20a70b6a21a80b20a70b20a80b6a21a90b20a80b20a9" + "0b6a21aa0b20a90b20aa0b6a21ab0b20aa0b20ab0b6a21ac0b20ab0b20ac0b6a21ad0b20ac0b20ad0b6a21ae0b20ad" + "0b20ae0b6a21af0b20ae0b20af0b6a21b00b20af0b20b00b6a21b10b20b00b20b10b6a21b20b20b10b20b20b6a21b3" + "0b20b20b20b30b6a21b40b20b30b20b40b6a21b50b20b40b20b50b6a21b60b20b50b20b60b6a21b70b20b60b20b70b" + "6a21b80b20b70b20b80b6a21b90b20b80b20b90b6a21ba0b20b90b20ba0b6a21bb0b20ba0b20bb0b6a21bc0b20bb0b" + "20bc0b6a21bd0b20bc0b20bd0b6a21be0b20bd0b20be0b6a21bf0b20be0b20bf0b6a21c00b20bf0b20c00b6a21c10b" + "20c00b20c10b6a21c20b20c10b20c20b6a21c30b20c20b20c30b6a21c40b20c30b20c40b6a21c50b20c40b20c50b6a" + "21c60b20c50b20c60b6a21c70b20c60b20c70b6a21c80b20c70b20c80b6a21c90b20c80b20c90b6a21ca0b20c90b20" + "ca0b6a21cb0b20ca0b20cb0b6a21cc0b20cb0b20cc0b6a21cd0b20cc0b20cd0b6a21ce0b20cd0b20ce0b6a21cf0b20" + "ce0b20cf0b6a21d00b20cf0b20d00b6a21d10b20d00b20d10b6a21d20b20d10b20d20b6a21d30b20d20b20d30b6a21" + "d40b20d30b20d40b6a21d50b20d40b20d50b6a21d60b20d50b20d60b6a21d70b20d60b20d70b6a21d80b20d70b20d8" + "0b6a21d90b20d80b20d90b6a21da0b20d90b20da0b6a21db0b20da0b20db0b6a21dc0b20db0b20dc0b6a21dd0b20dc" + "0b20dd0b6a21de0b20dd0b20de0b6a21df0b20de0b20df0b6a21e00b20df0b20e00b6a21e10b20e00b20e10b6a21e2" + "0b20e10b20e20b6a21e30b20e20b20e30b6a21e40b20e30b20e40b6a21e50b20e40b20e50b6a21e60b20e50b20e60b" + "6a21e70b20e60b20e70b6a21e80b20e70b20e80b6a21e90b20e80b20e90b6a21ea0b20e90b20ea0b6a21eb0b20ea0b" + "20eb0b6a21ec0b20eb0b20ec0b6a21ed0b20ec0b20ed0b6a21ee0b20ed0b20ee0b6a21ef0b20ee0b20ef0b6a21f00b" + "20ef0b20f00b6a21f10b20f00b20f10b6a21f20b20f10b20f20b6a21f30b20f20b20f30b6a21f40b20f30b20f40b6a" + "21f50b20f40b20f50b6a21f60b20f50b20f60b6a21f70b20f60b20f70b6a21f80b20f70b20f80b6a21f90b20f80b20" + "f90b6a21fa0b20f90b20fa0b6a21fb0b20fa0b20fb0b6a21fc0b20fb0b20fc0b6a21fd0b20fc0b20fd0b6a21fe0b20" + "fd0b20fe0b6a21ff0b20fe0b20ff0b6a21800c20ff0b20800c6a21810c20800c20810c6a21820c20810c20820c6a21" + "830c20820c20830c6a21840c20830c20840c6a21850c20840c20850c6a21860c20850c20860c6a21870c20860c2087" + "0c6a21880c20870c20880c6a21890c20880c20890c6a218a0c20890c208a0c6a218b0c208a0c208b0c6a218c0c208b" + "0c208c0c6a218d0c208c0c208d0c6a218e0c208d0c208e0c6a218f0c208e0c208f0c6a21900c208f0c20900c6a2191" + "0c20900c20910c6a21920c20910c20920c6a21930c20920c20930c6a21940c20930c20940c6a21950c20940c20950c" + "6a21960c20950c20960c6a21970c20960c20970c6a21980c20970c20980c6a21990c20980c20990c6a219a0c20990c" + "209a0c6a219b0c209a0c209b0c6a219c0c209b0c209c0c6a219d0c209c0c209d0c6a219e0c209d0c209e0c6a219f0c" + "209e0c209f0c6a21a00c209f0c20a00c6a21a10c20a00c20a10c6a21a20c20a10c20a20c6a21a30c20a20c20a30c6a" + "21a40c20a30c20a40c6a21a50c20a40c20a50c6a21a60c20a50c20a60c6a21a70c20a60c20a70c6a21a80c20a70c20" + "a80c6a21a90c20a80c20a90c6a21aa0c20a90c20aa0c6a21ab0c20aa0c20ab0c6a21ac0c20ab0c20ac0c6a21ad0c20" + "ac0c20ad0c6a21ae0c20ad0c20ae0c6a21af0c20ae0c20af0c6a21b00c20af0c20b00c6a21b10c20b00c20b10c6a21" + "b20c20b10c20b20c6a21b30c20b20c20b30c6a21b40c20b30c20b40c6a21b50c20b40c20b50c6a21b60c20b50c20b6" + "0c6a21b70c20b60c20b70c6a21b80c20b70c20b80c6a21b90c20b80c20b90c6a21ba0c20b90c20ba0c6a21bb0c20ba" + "0c20bb0c6a21bc0c20bb0c20bc0c6a21bd0c20bc0c20bd0c6a21be0c20bd0c20be0c6a21bf0c20be0c20bf0c6a21c0" + "0c20bf0c20c00c6a21c10c20c00c20c10c6a21c20c20c10c20c20c6a21c30c20c20c20c30c6a21c40c20c30c20c40c" + "6a21c50c20c40c20c50c6a21c60c20c50c20c60c6a21c70c20c60c20c70c6a21c80c20c70c20c80c6a21c90c20c80c" + "20c90c6a21ca0c20c90c20ca0c6a21cb0c20ca0c20cb0c6a21cc0c20cb0c20cc0c6a21cd0c20cc0c20cd0c6a21ce0c" + "20cd0c20ce0c6a21cf0c20ce0c20cf0c6a21d00c20cf0c20d00c6a21d10c20d00c20d10c6a21d20c20d10c20d20c6a" + "21d30c20d20c20d30c6a21d40c20d30c20d40c6a21d50c20d40c20d50c6a21d60c20d50c20d60c6a21d70c20d60c20" + "d70c6a21d80c20d70c20d80c6a21d90c20d80c20d90c6a21da0c20d90c20da0c6a21db0c20da0c20db0c6a21dc0c20" + "db0c20dc0c6a21dd0c20dc0c20dd0c6a21de0c20dd0c20de0c6a21df0c20de0c20df0c6a21e00c20df0c20e00c6a21" + "e10c20e00c20e10c6a21e20c20e10c20e20c6a21e30c20e20c20e30c6a21e40c20e30c20e40c6a21e50c20e40c20e5" + "0c6a21e60c20e50c20e60c6a21e70c20e60c20e70c6a21e80c20e70c20e80c6a21e90c20e80c20e90c6a21ea0c20e9" + "0c20ea0c6a21eb0c20ea0c20eb0c6a21ec0c20eb0c20ec0c6a21ed0c20ec0c20ed0c6a21ee0c20ed0c20ee0c6a21ef" + "0c20ee0c20ef0c6a21f00c20ef0c20f00c6a21f10c20f00c20f10c6a21f20c20f10c20f20c6a21f30c20f20c20f30c" + "6a21f40c20f30c20f40c6a21f50c20f40c20f50c6a21f60c20f50c20f60c6a21f70c20f60c20f70c6a21f80c20f70c" + "20f80c6a21f90c20f80c20f90c6a21fa0c20f90c20fa0c6a21fb0c20fa0c20fb0c6a21fc0c20fb0c20fc0c6a21fd0c" + "20fc0c20fd0c6a21fe0c20fd0c20fe0c6a21ff0c20fe0c20ff0c6a21800d20ff0c20800d6a21810d20800d20810d6a" + "21820d20810d20820d6a21830d20820d20830d6a21840d20830d20840d6a21850d20840d20850d6a21860d20850d20" + "860d6a21870d20860d20870d6a21880d20870d20880d6a21890d20880d20890d6a218a0d20890d208a0d6a218b0d20" + "8a0d208b0d6a218c0d208b0d208c0d6a218d0d208c0d208d0d6a218e0d208d0d208e0d6a218f0d208e0d208f0d6a21" + "900d208f0d20900d6a21910d20900d20910d6a21920d20910d20920d6a21930d20920d20930d6a21940d20930d2094" + "0d6a21950d20940d20950d6a21960d20950d20960d6a21970d20960d20970d6a21980d20970d20980d6a21990d2098" + "0d20990d6a219a0d20990d209a0d6a219b0d209a0d209b0d6a219c0d209b0d209c0d6a219d0d209c0d209d0d6a219e" + "0d209d0d209e0d6a219f0d209e0d209f0d6a21a00d209f0d20a00d6a21a10d20a00d20a10d6a21a20d20a10d20a20d" + "6a21a30d20a20d20a30d6a21a40d20a30d20a40d6a21a50d20a40d20a50d6a21a60d20a50d20a60d6a21a70d20a60d" + "20a70d6a21a80d20a70d20a80d6a21a90d20a80d20a90d6a21aa0d20a90d20aa0d6a21ab0d20aa0d20ab0d6a21ac0d" + "20ab0d20ac0d6a21ad0d20ac0d20ad0d6a21ae0d20ad0d20ae0d6a21af0d20ae0d20af0d6a21b00d20af0d20b00d6a" + "21b10d20b00d20b10d6a21b20d20b10d20b20d6a21b30d20b20d20b30d6a21b40d20b30d20b40d6a21b50d20b40d20" + "b50d6a21b60d20b50d20b60d6a21b70d20b60d20b70d6a21b80d20b70d20b80d6a21b90d20b80d20b90d6a21ba0d20" + "b90d20ba0d6a21bb0d20ba0d20bb0d6a21bc0d20bb0d20bc0d6a21bd0d20bc0d20bd0d6a21be0d20bd0d20be0d6a21" + "bf0d20be0d20bf0d6a21c00d20bf0d20c00d6a21c10d20c00d20c10d6a21c20d20c10d20c20d6a21c30d20c20d20c3" + "0d6a21c40d20c30d20c40d6a21c50d20c40d20c50d6a21c60d20c50d20c60d6a21c70d20c60d20c70d6a21c80d20c7" + "0d20c80d6a21c90d20c80d20c90d6a21ca0d20c90d20ca0d6a21cb0d20ca0d20cb0d6a21cc0d20cb0d20cc0d6a21cd" + "0d20cc0d20cd0d6a21ce0d20cd0d20ce0d6a21cf0d20ce0d20cf0d6a21d00d20cf0d20d00d6a21d10d20d00d20d10d" + "6a21d20d20d10d20d20d6a21d30d20d20d20d30d6a21d40d20d30d20d40d6a21d50d20d40d20d50d6a21d60d20d50d" + "20d60d6a21d70d20d60d20d70d6a21d80d20d70d20d80d6a21d90d20d80d20d90d6a21da0d20d90d20da0d6a21db0d" + "20da0d20db0d6a21dc0d20db0d20dc0d6a21dd0d20dc0d20dd0d6a21de0d20dd0d20de0d6a21df0d20de0d20df0d6a" + "21e00d20df0d20e00d6a21e10d20e00d20e10d6a21e20d20e10d20e20d6a21e30d20e20d20e30d6a21e40d20e30d20" + "e40d6a21e50d20e40d20e50d6a21e60d20e50d20e60d6a21e70d20e60d20e70d6a21e80d20e70d20e80d6a21e90d20" + "e80d20e90d6a21ea0d20e90d20ea0d6a21eb0d20ea0d20eb0d6a21ec0d20eb0d20ec0d6a21ed0d20ec0d20ed0d6a21" + "ee0d20ed0d20ee0d6a21ef0d20ee0d20ef0d6a21f00d20ef0d20f00d6a21f10d20f00d20f10d6a21f20d20f10d20f2" + "0d6a21f30d20f20d20f30d6a21f40d20f30d20f40d6a21f50d20f40d20f50d6a21f60d20f50d20f60d6a21f70d20f6" + "0d20f70d6a21f80d20f70d20f80d6a21f90d20f80d20f90d6a21fa0d20f90d20fa0d6a21fb0d20fa0d20fb0d6a21fc" + "0d20fb0d20fc0d6a21fd0d20fc0d20fd0d6a21fe0d20fd0d20fe0d6a21ff0d20fe0d20ff0d6a21800e20ff0d20800e" + "6a21810e20800e20810e6a21820e20810e20820e6a21830e20820e20830e6a21840e20830e20840e6a21850e20840e" + "20850e6a21860e20850e20860e6a21870e20860e20870e6a21880e20870e20880e6a21890e20880e20890e6a218a0e" + "20890e208a0e6a218b0e208a0e208b0e6a218c0e208b0e208c0e6a218d0e208c0e208d0e6a218e0e208d0e208e0e6a" + "218f0e208e0e208f0e6a21900e208f0e20900e6a21910e20900e20910e6a21920e20910e20920e6a21930e20920e20" + "930e6a21940e20930e20940e6a21950e20940e20950e6a21960e20950e20960e6a21970e20960e20970e6a21980e20" + "970e20980e6a21990e20980e20990e6a219a0e20990e209a0e6a219b0e209a0e209b0e6a219c0e209b0e209c0e6a21" + "9d0e209c0e209d0e6a219e0e209d0e209e0e6a219f0e209e0e209f0e6a21a00e209f0e20a00e6a21a10e20a00e20a1" + "0e6a21a20e20a10e20a20e6a21a30e20a20e20a30e6a21a40e20a30e20a40e6a21a50e20a40e20a50e6a21a60e20a5" + "0e20a60e6a21a70e20a60e20a70e6a21a80e20a70e20a80e6a21a90e20a80e20a90e6a21aa0e20a90e20aa0e6a21ab" + "0e20aa0e20ab0e6a21ac0e20ab0e20ac0e6a21ad0e20ac0e20ad0e6a21ae0e20ad0e20ae0e6a21af0e20ae0e20af0e" + "6a21b00e20af0e20b00e6a21b10e20b00e20b10e6a21b20e20b10e20b20e6a21b30e20b20e20b30e6a21b40e20b30e" + "20b40e6a21b50e20b40e20b50e6a21b60e20b50e20b60e6a21b70e20b60e20b70e6a21b80e20b70e20b80e6a21b90e" + "20b80e20b90e6a21ba0e20b90e20ba0e6a21bb0e20ba0e20bb0e6a21bc0e20bb0e20bc0e6a21bd0e20bc0e20bd0e6a" + "21be0e20bd0e20be0e6a21bf0e20be0e20bf0e6a21c00e20bf0e20c00e6a21c10e20c00e20c10e6a21c20e20c10e20" + "c20e6a21c30e20c20e20c30e6a21c40e20c30e20c40e6a21c50e20c40e20c50e6a21c60e20c50e20c60e6a21c70e20" + "c60e20c70e6a21c80e20c70e20c80e6a21c90e20c80e20c90e6a21ca0e20c90e20ca0e6a21cb0e20ca0e20cb0e6a21" + "cc0e20cb0e20cc0e6a21cd0e20cc0e20cd0e6a21ce0e20cd0e20ce0e6a21cf0e20ce0e20cf0e6a21d00e20cf0e20d0" + "0e6a21d10e20d00e20d10e6a21d20e20d10e20d20e6a21d30e20d20e20d30e6a21d40e20d30e20d40e6a21d50e20d4" + "0e20d50e6a21d60e20d50e20d60e6a21d70e20d60e20d70e6a21d80e20d70e20d80e6a21d90e20d80e20d90e6a21da" + "0e20d90e20da0e6a21db0e20da0e20db0e6a21dc0e20db0e20dc0e6a21dd0e20dc0e20dd0e6a21de0e20dd0e20de0e" + "6a21df0e20de0e20df0e6a21e00e20df0e20e00e6a21e10e20e00e20e10e6a21e20e20e10e20e20e6a21e30e20e20e" + "20e30e6a21e40e20e30e20e40e6a21e50e20e40e20e50e6a21e60e20e50e20e60e6a21e70e20e60e20e70e6a21e80e" + "20e70e20e80e6a21e90e20e80e20e90e6a21ea0e20e90e20ea0e6a21eb0e20ea0e20eb0e6a21ec0e20eb0e20ec0e6a" + "21ed0e20ec0e20ed0e6a21ee0e20ed0e20ee0e6a21ef0e20ee0e20ef0e6a21f00e20ef0e20f00e6a21f10e20f00e20" + "f10e6a21f20e20f10e20f20e6a21f30e20f20e20f30e6a21f40e20f30e20f40e6a21f50e20f40e20f50e6a21f60e20" + "f50e20f60e6a21f70e20f60e20f70e6a21f80e20f70e20f80e6a21f90e20f80e20f90e6a21fa0e20f90e20fa0e6a21" + "fb0e20fa0e20fb0e6a21fc0e20fb0e20fc0e6a21fd0e20fc0e20fd0e6a21fe0e20fd0e20fe0e6a21ff0e20fe0e20ff" + "0e6a21800f20ff0e20800f6a21810f20800f20810f6a21820f20810f20820f6a21830f20820f20830f6a21840f2083" + "0f20840f6a21850f20840f20850f6a21860f20850f20860f6a21870f20860f20870f6a21880f20870f20880f6a2189" + "0f20880f20890f6a218a0f20890f208a0f6a218b0f208a0f208b0f6a218c0f208b0f208c0f6a218d0f208c0f208d0f" + "6a218e0f208d0f208e0f6a218f0f208e0f208f0f6a21900f208f0f20900f6a21910f20900f20910f6a21920f20910f" + "20920f6a21930f20920f20930f6a21940f20930f20940f6a21950f20940f20950f6a21960f20950f20960f6a21970f" + "20960f20970f6a21980f20970f20980f6a21990f20980f20990f6a219a0f20990f209a0f6a219b0f209a0f209b0f6a" + "219c0f209b0f209c0f6a219d0f209c0f209d0f6a219e0f209d0f209e0f6a219f0f209e0f209f0f6a21a00f209f0f20" + "a00f6a21a10f20a00f20a10f6a21a20f20a10f20a20f6a21a30f20a20f20a30f6a21a40f20a30f20a40f6a21a50f20" + "a40f20a50f6a21a60f20a50f20a60f6a21a70f20a60f20a70f6a21a80f20a70f20a80f6a21a90f20a80f20a90f6a21" + "aa0f20a90f20aa0f6a21ab0f20aa0f20ab0f6a21ac0f20ab0f20ac0f6a21ad0f20ac0f20ad0f6a21ae0f20ad0f20ae" + "0f6a21af0f20ae0f20af0f6a21b00f20af0f20b00f6a21b10f20b00f20b10f6a21b20f20b10f20b20f6a21b30f20b2" + "0f20b30f6a21b40f20b30f20b40f6a21b50f20b40f20b50f6a21b60f20b50f20b60f6a21b70f20b60f20b70f6a21b8" + "0f20b70f20b80f6a21b90f20b80f20b90f6a21ba0f20b90f20ba0f6a21bb0f20ba0f20bb0f6a21bc0f20bb0f20bc0f" + "6a21bd0f20bc0f20bd0f6a21be0f20bd0f20be0f6a21bf0f20be0f20bf0f6a21c00f20bf0f20c00f6a21c10f20c00f" + "20c10f6a21c20f20c10f20c20f6a21c30f20c20f20c30f6a21c40f20c30f20c40f6a21c50f20c40f20c50f6a21c60f" + "20c50f20c60f6a21c70f20c60f20c70f6a21c80f20c70f20c80f6a21c90f20c80f20c90f6a21ca0f20c90f20ca0f6a" + "21cb0f20ca0f20cb0f6a21cc0f20cb0f20cc0f6a21cd0f20cc0f20cd0f6a21ce0f20cd0f20ce0f6a21cf0f20ce0f20" + "cf0f6a21d00f20cf0f20d00f6a21d10f20d00f20d10f6a21d20f20d10f20d20f6a21d30f20d20f20d30f6a21d40f20" + "d30f20d40f6a21d50f20d40f20d50f6a21d60f20d50f20d60f6a21d70f20d60f20d70f6a21d80f20d70f20d80f6a21" + "d90f20d80f20d90f6a21da0f20d90f20da0f6a21db0f20da0f20db0f6a21dc0f20db0f20dc0f6a21dd0f20dc0f20dd" + "0f6a21de0f20dd0f20de0f6a21df0f20de0f20df0f6a21e00f20df0f20e00f6a21e10f20e00f20e10f6a21e20f20e1" + "0f20e20f6a21e30f20e20f20e30f6a21e40f20e30f20e40f6a21e50f20e40f20e50f6a21e60f20e50f20e60f6a21e7" + "0f20e60f20e70f6a21e80f20e70f20e80f6a21e90f20e80f20e90f6a21ea0f20e90f20ea0f6a21eb0f20ea0f20eb0f" + "6a21ec0f20eb0f20ec0f6a21ed0f20ec0f20ed0f6a21ee0f20ed0f20ee0f6a21ef0f20ee0f20ef0f6a21f00f20ef0f" + "20f00f6a21f10f20f00f20f10f6a21f20f20f10f20f20f6a21f30f20f20f20f30f6a21f40f20f30f20f40f6a21f50f" + "20f40f20f50f6a21f60f20f50f20f60f6a21f70f20f60f20f70f6a21f80f20f70f20f80f6a21f90f20f80f20f90f6a" + "21fa0f20f90f20fa0f6a21fb0f20fa0f20fb0f6a21fc0f20fb0f20fc0f6a21fd0f20fc0f20fd0f6a21fe0f20fd0f20" + "fe0f6a21ff0f20fe0f20ff0f6a21801020ff0f2080106a2181102080102081106a2182102081102082106a21831020" + "82102083106a2184102083102084106a2185102084102085106a2186102085102086106a2187102086102087106a21" + "88102087102088106a2189102088102089106a218a10208910208a106a218b10208a10208b106a218c10208b10208c" + "106a218d10208c10208d106a218e10208d10208e106a218f10208e10208f106a219010208f102090106a2191102090" + "102091106a2192102091102092106a2193102092102093106a2194102093102094106a2195102094102095106a2196" + "102095102096106a2197102096102097106a2198102097102098106a2199102098102099106a219a10209910209a10" + "6a219b10209a10209b106a219c10209b10209c106a219d10209c10209d106a219e10209d10209e106a219f10209e10" + "209f106a21a010209f1020a0106a21a11020a01020a1106a21a21020a11020a2106a21a31020a21020a3106a21a410" + "20a31020a4106a21a51020a41020a5106a21a61020a51020a6106a21a71020a61020a7106a21a81020a71020a8106a" + "21a91020a81020a9106a21aa1020a91020aa106a21ab1020aa1020ab106a21ac1020ab1020ac106a21ad1020ac1020" + "ad106a21ae1020ad1020ae106a21af1020ae1020af106a21b01020af1020b0106a21b11020b01020b1106a21b21020" + "b11020b2106a21b31020b21020b3106a21b41020b31020b4106a21b51020b41020b5106a21b61020b51020b6106a21" + "b71020b61020b7106a21b81020b71020b8106a21b91020b81020b9106a21ba1020b91020ba106a21bb1020ba1020bb" + "106a21bc1020bb1020bc106a21bd1020bc1020bd106a21be1020bd1020be106a21bf1020be1020bf106a21c01020bf" + "1020c0106a21c11020c01020c1106a21c21020c11020c2106a21c31020c21020c3106a21c41020c31020c4106a21c5" + "1020c41020c5106a21c61020c51020c6106a21c71020c61020c7106a21c81020c71020c8106a21c91020c81020c910" + "6a21ca1020c91020ca106a21cb1020ca1020cb106a21cc1020cb1020cc106a21cd1020cc1020cd106a21ce1020cd10" + "20ce106a21cf1020ce1020cf106a21d01020cf1020d0106a21d11020d01020d1106a21d21020d11020d2106a21d310" + "20d21020d3106a21d41020d31020d4106a21d51020d41020d5106a21d61020d51020d6106a21d71020d61020d7106a" + "21d81020d71020d8106a21d91020d81020d9106a21da1020d91020da106a21db1020da1020db106a21dc1020db1020" + "dc106a21dd1020dc1020dd106a21de1020dd1020de106a21df1020de1020df106a21e01020df1020e0106a21e11020" + "e01020e1106a21e21020e11020e2106a21e31020e21020e3106a21e41020e31020e4106a21e51020e41020e5106a21" + "e61020e51020e6106a21e71020e61020e7106a21e81020e71020e8106a21e91020e81020e9106a21ea1020e91020ea" + "106a21eb1020ea1020eb106a21ec1020eb1020ec106a21ed1020ec1020ed106a21ee1020ed1020ee106a21ef1020ee" + "1020ef106a21f01020ef1020f0106a21f11020f01020f1106a21f21020f11020f2106a21f31020f21020f3106a21f4" + "1020f31020f4106a21f51020f41020f5106a21f61020f51020f6106a21f71020f61020f7106a21f81020f71020f810" + "6a21f91020f81020f9106a21fa1020f91020fa106a21fb1020fa1020fb106a21fc1020fb1020fc106a21fd1020fc10" + "20fd106a21fe1020fd1020fe106a21ff1020fe1020ff106a21801120ff102080116a2181112080112081116a218211" + "2081112082116a2183112082112083116a2184112083112084116a2185112084112085116a2186112085112086116a" + "2187112086112087116a2188112087112088116a2189112088112089116a218a11208911208a116a218b11208a1120" + "8b116a218c11208b11208c116a218d11208c11208d116a218e11208d11208e116a218f11208e11208f116a21901120" + "8f112090116a2191112090112091116a2192112091112092116a2193112092112093116a2194112093112094116a21" + "95112094112095116a2196112095112096116a2197112096112097116a2198112097112098116a2199112098112099" + "116a219a11209911209a116a219b11209a11209b116a219c11209b11209c116a219d11209c11209d116a219e11209d" + "11209e116a219f11209e11209f116a21a011209f1120a0116a21a11120a01120a1116a21a21120a11120a2116a21a3" + "1120a21120a3116a21a41120a31120a4116a21a51120a41120a5116a21a61120a51120a6116a21a71120a61120a711" + "6a21a81120a71120a8116a21a91120a81120a9116a21aa1120a91120aa116a21ab1120aa1120ab116a21ac1120ab11" + "20ac116a21ad1120ac1120ad116a21ae1120ad1120ae116a21af1120ae1120af116a21b01120af1120b0116a21b111" + "20b01120b1116a21b21120b11120b2116a21b31120b21120b3116a21b41120b31120b4116a21b51120b41120b5116a" + "21b61120b51120b6116a21b71120b61120b7116a21b81120b71120b8116a21b91120b81120b9116a21ba1120b91120" + "ba116a21bb1120ba1120bb116a21bc1120bb1120bc116a21bd1120bc1120bd116a21be1120bd1120be116a21bf1120" + "be1120bf116a21c01120bf1120c0116a21c11120c01120c1116a21c21120c11120c2116a21c31120c21120c3116a21" + "c41120c31120c4116a21c51120c41120c5116a21c61120c51120c6116a21c71120c61120c7116a21c81120c71120c8" + "116a21c91120c81120c9116a21ca1120c91120ca116a21cb1120ca1120cb116a21cc1120cb1120cc116a21cd1120cc" + "1120cd116a21ce1120cd1120ce116a21cf1120ce1120cf116a21d01120cf1120d0116a21d11120d01120d1116a21d2" + "1120d11120d2116a21d31120d21120d3116a21d41120d31120d4116a21d51120d41120d5116a21d61120d51120d611" + "6a21d71120d61120d7116a21d81120d71120d8116a21d91120d81120d9116a21da1120d91120da116a21db1120da11" + "20db116a21dc1120db1120dc116a21dd1120dc1120dd116a21de1120dd1120de116a21df1120de1120df116a21e011" + "20df1120e0116a21e11120e01120e1116a21e21120e11120e2116a21e31120e21120e3116a21e41120e31120e4116a" + "21e51120e41120e5116a21e61120e51120e6116a21e71120e61120e7116a21e81120e71120e8116a21e91120e81120" + "e9116a21ea1120e91120ea116a21eb1120ea1120eb116a21ec1120eb1120ec116a21ed1120ec1120ed116a21ee1120" + "ed1120ee116a21ef1120ee1120ef116a21f01120ef1120f0116a21f11120f01120f1116a21f21120f11120f2116a21" + "f31120f21120f3116a21f41120f31120f4116a21f51120f41120f5116a21f61120f51120f6116a21f71120f61120f7" + "116a21f81120f71120f8116a21f91120f81120f9116a21fa1120f91120fa116a21fb1120fa1120fb116a21fc1120fb" + "1120fc116a21fd1120fc1120fd116a21fe1120fd1120fe116a21ff1120fe1120ff116a21801220ff112080126a2181" + "122080122081126a2182122081122082126a2183122082122083126a2184122083122084126a218512208412208512" + "6a2186122085122086126a2187122086122087126a2188122087122088126a2189122088122089126a218a12208912" + "208a126a218b12208a12208b126a218c12208b12208c126a218d12208c12208d126a218e12208d12208e126a218f12" + "208e12208f126a219012208f122090126a2191122090122091126a2192122091122092126a2193122092122093126a" + "2194122093122094126a2195122094122095126a2196122095122096126a2197122096122097126a21981220971220" + "98126a2199122098122099126a219a12209912209a126a219b12209a12209b126a219c12209b12209c126a219d1220" + "9c12209d126a219e12209d12209e126a219f12209e12209f126a21a012209f1220a0126a21a11220a01220a1126a21" + "a21220a11220a2126a21a31220a21220a3126a21a41220a31220a4126a21a51220a41220a5126a21a61220a51220a6" + "126a21a71220a61220a7126a21a81220a71220a8126a21a91220a81220a9126a21aa1220a91220aa126a21ab1220aa" + "1220ab126a21ac1220ab1220ac126a21ad1220ac1220ad126a21ae1220ad1220ae126a21af1220ae1220af126a21b0" + "1220af1220b0126a21b11220b01220b1126a21b21220b11220b2126a21b31220b21220b3126a21b41220b31220b412" + "6a21b51220b41220b5126a21b61220b51220b6126a21b71220b61220b7126a21b81220b71220b8126a21b91220b812" + "20b9126a21ba1220b91220ba126a21bb1220ba1220bb126a21bc1220bb1220bc126a21bd1220bc1220bd126a21be12" + "20bd1220be126a21bf1220be1220bf126a21c01220bf1220c0126a21c11220c01220c1126a21c21220c11220c2126a" + "21c31220c21220c3126a21c41220c31220c4126a21c51220c41220c5126a21c61220c51220c6126a21c71220c61220" + "c7126a21c81220c71220c8126a21c91220c81220c9126a21ca1220c91220ca126a21cb1220ca1220cb126a21cc1220" + "cb1220cc126a21cd1220cc1220cd126a21ce1220cd1220ce126a21cf1220ce1220cf126a21d01220cf1220d0126a21" + "d11220d01220d1126a21d21220d11220d2126a21d31220d21220d3126a21d41220d31220d4126a21d51220d41220d5" + "126a21d61220d51220d6126a21d71220d61220d7126a21d81220d71220d8126a21d91220d81220d9126a21da1220d9" + "1220da126a21db1220da1220db126a21dc1220db1220dc126a21dd1220dc1220dd126a21de1220dd1220de126a21df" + "1220de1220df126a21e01220df1220e0126a21e11220e01220e1126a21e21220e11220e2126a21e31220e21220e312" + "6a21e41220e31220e4126a21e51220e41220e5126a21e61220e51220e6126a21e71220e61220e7126a21e81220e712" + "20e8126a21e91220e81220e9126a21ea1220e91220ea126a21eb1220ea1220eb126a21ec1220eb1220ec126a21ed12" + "20ec1220ed126a21ee1220ed1220ee126a21ef1220ee1220ef126a21f01220ef1220f0126a21f11220f01220f1126a" + "21f21220f11220f2126a21f31220f21220f3126a21f41220f31220f4126a21f51220f41220f5126a21f61220f51220" + "f6126a21f71220f61220f7126a21f81220f71220f8126a21f91220f81220f9126a21fa1220f91220fa126a21fb1220" + "fa1220fb126a21fc1220fb1220fc126a21fd1220fc1220fd126a21fe1220fd1220fe126a21ff1220fe1220ff126a21" + "801320ff122080136a2181132080132081136a2182132081132082136a2183132082132083136a2184132083132084" + "136a2185132084132085136a2186132085132086136a2187132086132087136a2188132087132088136a2189132088" + "132089136a218a13208913208a136a218b13208a13208b136a218c13208b13208c136a218d13208c13208d136a218e" + "13208d13208e136a218f13208e13208f136a219013208f132090136a2191132090132091136a219213209113209213" + "6a2193132092132093136a2194132093132094136a2195132094132095136a2196132095132096136a219713209613" + "2097136a2198132097132098136a2199132098132099136a219a13209913209a136a219b13209a13209b136a219c13" + "209b13209c136a219d13209c13209d136a219e13209d13209e136a219f13209e13209f136a21a013209f1320a0136a" + "21a11320a01320a1136a21a21320a11320a2136a21a31320a21320a3136a21a41320a31320a4136a21a51320a41320" + "a5136a21a61320a51320a6136a21a71320a61320a7136a21a81320a71320a8136a21a91320a81320a9136a21aa1320" + "a91320aa136a21ab1320aa1320ab136a21ac1320ab1320ac136a21ad1320ac1320ad136a21ae1320ad1320ae136a21" + "af1320ae1320af136a21b01320af1320b0136a21b11320b01320b1136a21b21320b11320b2136a21b31320b21320b3" + "136a21b41320b31320b4136a21b51320b41320b5136a21b61320b51320b6136a21b71320b61320b7136a21b81320b7" + "1320b8136a21b91320b81320b9136a21ba1320b91320ba136a21bb1320ba1320bb136a21bc1320bb1320bc136a21bd" + "1320bc1320bd136a21be1320bd1320be136a21bf1320be1320bf136a21c01320bf1320c0136a21c11320c01320c113" + "6a21c21320c11320c2136a21c31320c21320c3136a21c41320c31320c4136a21c51320c41320c5136a21c61320c513" + "20c6136a21c71320c61320c7136a21c81320c71320c8136a21c91320c81320c9136a21ca1320c91320ca136a21cb13" + "20ca1320cb136a21cc1320cb1320cc136a21cd1320cc1320cd136a21ce1320cd1320ce136a21cf1320ce1320cf136a" + "21d01320cf1320d0136a21d11320d01320d1136a21d21320d11320d2136a21d31320d21320d3136a21d41320d31320" + "d4136a21d51320d41320d5136a21d61320d51320d6136a21d71320d61320d7136a21d81320d71320d8136a21d91320" + "d81320d9136a21da1320d91320da136a21db1320da1320db136a21dc1320db1320dc136a21dd1320dc1320dd136a21" + "de1320dd1320de136a21df1320de1320df136a21e01320df1320e0136a21e11320e01320e1136a21e21320e11320e2" + "136a21e31320e21320e3136a21e41320e31320e4136a21e51320e41320e5136a21e61320e51320e6136a21e71320e6" + "1320e7136a21e81320e71320e8136a21e91320e81320e9136a21ea1320e91320ea136a21eb1320ea1320eb136a21ec" + "1320eb1320ec136a21ed1320ec1320ed136a21ee1320ed1320ee136a21ef1320ee1320ef136a21f01320ef1320f013" + "6a21f11320f01320f1136a21f21320f11320f2136a21f31320f21320f3136a21f41320f31320f4136a21f51320f413" + "20f5136a21f61320f51320f6136a21f71320f61320f7136a21f81320f71320f8136a21f91320f81320f9136a21fa13" + "20f91320fa136a21fb1320fa1320fb136a21fc1320fb1320fc136a21fd1320fc1320fd136a21fe1320fd1320fe136a" + "21ff1320fe1320ff136a21801420ff132080146a2181142080142081146a2182142081142082146a21831420821420" + "83146a2184142083142084146a2185142084142085146a2186142085142086146a2187142086142087146a21881420" + "87142088146a2189142088142089146a218a14208914208a146a218b14208a14208b146a218c14208b14208c146a21" + "8d14208c14208d146a218e14208d14208e146a218f14208e14208f146a219014208f142090146a2191142090142091" + "146a2192142091142092146a2193142092142093146a2194142093142094146a2195142094142095146a2196142095" + "142096146a2197142096142097146a2198142097142098146a2199142098142099146a219a14209914209a146a219b" + "14209a14209b146a219c14209b14209c146a219d14209c14209d146a219e14209d14209e146a219f14209e14209f14" + "6a21a014209f1420a0146a21a11420a01420a1146a21a21420a11420a2146a21a31420a21420a3146a21a41420a314" + "20a4146a21a51420a41420a5146a21a61420a51420a6146a21a71420a61420a7146a21a81420a71420a8146a21a914" + "20a81420a9146a21aa1420a91420aa146a21ab1420aa1420ab146a21ac1420ab1420ac146a21ad1420ac1420ad146a" + "21ae1420ad1420ae146a21af1420ae1420af146a21b01420af1420b0146a21b11420b01420b1146a21b21420b11420" + "b2146a21b31420b21420b3146a21b41420b31420b4146a21b51420b41420b5146a21b61420b51420b6146a21b71420" + "b61420b7146a21b81420b71420b8146a21b91420b81420b9146a21ba1420b91420ba146a21bb1420ba1420bb146a21" + "bc1420bb1420bc146a21bd1420bc1420bd146a21be1420bd1420be146a21bf1420be1420bf146a21c01420bf1420c0" + "146a21c11420c01420c1146a21c21420c11420c2146a21c31420c21420c3146a21c41420c31420c4146a21c51420c4" + "1420c5146a21c61420c51420c6146a21c71420c61420c7146a21c81420c71420c8146a21c91420c81420c9146a21ca" + "1420c91420ca146a21cb1420ca1420cb146a21cc1420cb1420cc146a21cd1420cc1420cd146a21ce1420cd1420ce14" + "6a21cf1420ce1420cf146a21d01420cf1420d0146a21d11420d01420d1146a21d21420d11420d2146a21d31420d214" + "20d3146a21d41420d31420d4146a21d51420d41420d5146a21d61420d51420d6146a21d71420d61420d7146a21d814" + "20d71420d8146a21d91420d81420d9146a21da1420d91420da146a21db1420da1420db146a21dc1420db1420dc146a" + "21dd1420dc1420dd146a21de1420dd1420de146a21df1420de1420df146a21e01420df1420e0146a21e11420e01420" + "e1146a21e21420e11420e2146a21e31420e21420e3146a21e41420e31420e4146a21e51420e41420e5146a21e61420" + "e51420e6146a21e71420e61420e7146a21e81420e71420e8146a21e91420e81420e9146a21ea1420e91420ea146a21" + "eb1420ea1420eb146a21ec1420eb1420ec146a21ed1420ec1420ed146a21ee1420ed1420ee146a21ef1420ee1420ef" + "146a21f01420ef1420f0146a21f11420f01420f1146a21f21420f11420f2146a21f31420f21420f3146a21f41420f3" + "1420f4146a21f51420f41420f5146a21f61420f51420f6146a21f71420f61420f7146a21f81420f71420f8146a21f9" + "1420f81420f9146a21fa1420f91420fa146a21fb1420fa1420fb146a21fc1420fb1420fc146a21fd1420fc1420fd14" + "6a21fe1420fd1420fe146a21ff1420fe1420ff146a21801520ff142080156a2181152080152081156a218215208115" + "2082156a2183152082152083156a2184152083152084156a2185152084152085156a2186152085152086156a218715" + "2086152087156a2188152087152088156a2189152088152089156a218a15208915208a156a218b15208a15208b156a" + "218c15208b15208c156a218d15208c15208d156a218e15208d15208e156a218f15208e15208f156a219015208f1520" + "90156a2191152090152091156a2192152091152092156a2193152092152093156a2194152093152094156a21951520" + "94152095156a2196152095152096156a2197152096152097156a2198152097152098156a2199152098152099156a21" + "9a15209915209a156a219b15209a15209b156a219c15209b15209c156a219d15209c15209d156a219e15209d15209e" + "156a219f15209e15209f156a21a015209f1520a0156a21a11520a01520a1156a21a21520a11520a2156a21a31520a2" + "1520a3156a21a41520a31520a4156a21a51520a41520a5156a21a61520a51520a6156a21a71520a61520a7156a21a8" + "1520a71520a8156a21a91520a81520a9156a21aa1520a91520aa156a21ab1520aa1520ab156a21ac1520ab1520ac15" + "6a21ad1520ac1520ad156a21ae1520ad1520ae156a21af1520ae1520af156a21b01520af1520b0156a21b11520b015" + "20b1156a21b21520b11520b2156a21b31520b21520b3156a21b41520b31520b4156a21b51520b41520b5156a21b615" + "20b51520b6156a21b71520b61520b7156a21b81520b71520b8156a21b91520b81520b9156a21ba1520b91520ba156a" + "21bb1520ba1520bb156a21bc1520bb1520bc156a21bd1520bc1520bd156a21be1520bd1520be156a21bf1520be1520" + "bf156a21c01520bf1520c0156a21c11520c01520c1156a21c21520c11520c2156a21c31520c21520c3156a21c41520" + "c31520c4156a21c51520c41520c5156a21c61520c51520c6156a21c71520c61520c7156a21c81520c71520c8156a21" + "c91520c81520c9156a21ca1520c91520ca156a21cb1520ca1520cb156a21cc1520cb1520cc156a21cd1520cc1520cd" + "156a21ce1520cd1520ce156a21cf1520ce1520cf156a21d01520cf1520d0156a21d11520d01520d1156a21d21520d1" + "1520d2156a21d31520d21520d3156a21d41520d31520d4156a21d51520d41520d5156a21d61520d51520d6156a21d7" + "1520d61520d7156a21d81520d71520d8156a21d91520d81520d9156a21da1520d91520da156a21db1520da1520db15" + "6a21dc1520db1520dc156a21dd1520dc1520dd156a21de1520dd1520de156a21df1520de1520df156a21e01520df15" + "20e0156a21e11520e01520e1156a21e21520e11520e2156a21e31520e21520e3156a21e41520e31520e4156a21e515" + "20e41520e5156a21e61520e51520e6156a21e71520e61520e7156a21e81520e71520e8156a21e91520e81520e9156a" + "21ea1520e91520ea156a21eb1520ea1520eb156a21ec1520eb1520ec156a21ed1520ec1520ed156a21ee1520ed1520" + "ee156a21ef1520ee1520ef156a21f01520ef1520f0156a21f11520f01520f1156a21f21520f11520f2156a21f31520" + "f21520f3156a21f41520f31520f4156a21f51520f41520f5156a21f61520f51520f6156a21f71520f61520f7156a21" + "f81520f71520f8156a21f91520f81520f9156a21fa1520f91520fa156a21fb1520fa1520fb156a21fc1520fb1520fc" + "156a21fd1520fc1520fd156a21fe1520fd1520fe156a21ff1520fe1520ff156a21801620ff152080166a2181162080" + "162081166a2182162081162082166a2183162082162083166a2184162083162084166a2185162084162085166a2186" + "162085162086166a2187162086162087166a2188162087162088166a2189162088162089166a218a16208916208a16" + "6a218b16208a16208b166a218c16208b16208c166a218d16208c16208d166a218e16208d16208e166a218f16208e16" + "208f166a219016208f162090166a2191162090162091166a2192162091162092166a2193162092162093166a219416" + "2093162094166a2195162094162095166a2196162095162096166a2197162096162097166a2198162097162098166a" + "2199162098162099166a219a16209916209a166a219b16209a16209b166a219c16209b16209c166a219d16209c1620" + "9d166a219e16209d16209e166a219f16209e16209f166a21a016209f1620a0166a21a11620a01620a1166a21a21620" + "a11620a2166a21a31620a21620a3166a21a41620a31620a4166a21a51620a41620a5166a21a61620a51620a6166a21" + "a71620a61620a7166a21a81620a71620a8166a21a91620a81620a9166a21aa1620a91620aa166a21ab1620aa1620ab" + "166a21ac1620ab1620ac166a21ad1620ac1620ad166a21ae1620ad1620ae166a21af1620ae1620af166a21b01620af" + "1620b0166a21b11620b01620b1166a21b21620b11620b2166a21b31620b21620b3166a21b41620b31620b4166a21b5" + "1620b41620b5166a21b61620b51620b6166a21b71620b61620b7166a21b81620b71620b8166a21b91620b81620b916" + "6a21ba1620b91620ba166a21bb1620ba1620bb166a21bc1620bb1620bc166a21bd1620bc1620bd166a21be1620bd16" + "20be166a21bf1620be1620bf166a21c01620bf1620c0166a21c11620c01620c1166a21c21620c11620c2166a21c316" + "20c21620c3166a21c41620c31620c4166a21c51620c41620c5166a21c61620c51620c6166a21c71620c61620c7166a" + "21c81620c71620c8166a21c91620c81620c9166a21ca1620c91620ca166a21cb1620ca1620cb166a21cc1620cb1620" + "cc166a21cd1620cc1620cd166a21ce1620cd1620ce166a21cf1620ce1620cf166a21d01620cf1620d0166a21d11620" + "d01620d1166a21d21620d11620d2166a21d31620d21620d3166a21d41620d31620d4166a21d51620d41620d5166a21" + "d61620d51620d6166a21d71620d61620d7166a21d81620d71620d8166a21d91620d81620d9166a21da1620d91620da" + "166a21db1620da1620db166a21dc1620db1620dc166a21dd1620dc1620dd166a21de1620dd1620de166a21df1620de" + "1620df166a21e01620df1620e0166a21e11620e01620e1166a21e21620e11620e2166a21e31620e21620e3166a21e4" + "1620e31620e4166a21e51620e41620e5166a21e61620e51620e6166a21e71620e61620e7166a21e81620e71620e816" + "6a21e91620e81620e9166a21ea1620e91620ea166a21eb1620ea1620eb166a21ec1620eb1620ec166a21ed1620ec16" + "20ed166a21ee1620ed1620ee166a21ef1620ee1620ef166a21f01620ef1620f0166a21f11620f01620f1166a21f216" + "20f11620f2166a21f31620f21620f3166a21f41620f31620f4166a21f51620f41620f5166a21f61620f51620f6166a" + "21f71620f61620f7166a21f81620f71620f8166a21f91620f81620f9166a21fa1620f91620fa166a21fb1620fa1620" + "fb166a21fc1620fb1620fc166a21fd1620fc1620fd166a21fe1620fd1620fe166a21ff1620fe1620ff166a21801720" + "ff162080176a2181172080172081176a2182172081172082176a2183172082172083176a2184172083172084176a21" + "85172084172085176a2186172085172086176a2187172086172087176a2188172087172088176a2189172088172089" + "176a218a17208917208a176a218b17208a17208b176a218c17208b17208c176a218d17208c17208d176a218e17208d" + "17208e176a218f17208e17208f176a219017208f172090176a2191172090172091176a2192172091172092176a2193" + "172092172093176a2194172093172094176a2195172094172095176a2196172095172096176a219717209617209717" + "6a2198172097172098176a2199172098172099176a219a17209917209a176a219b17209a17209b176a219c17209b17" + "209c176a219d17209c17209d176a219e17209d17209e176a219f17209e17209f176a21a017209f1720a0176a21a117" + "20a01720a1176a21a21720a11720a2176a21a31720a21720a3176a21a41720a31720a4176a21a51720a41720a5176a" + "21a61720a51720a6176a21a71720a61720a7176a21a81720a71720a8176a21a91720a81720a9176a21aa1720a91720" + "aa176a21ab1720aa1720ab176a21ac1720ab1720ac176a21ad1720ac1720ad176a21ae1720ad1720ae176a21af1720" + "ae1720af176a21b01720af1720b0176a21b11720b01720b1176a21b21720b11720b2176a21b31720b21720b3176a21" + "b41720b31720b4176a21b51720b41720b5176a21b61720b51720b6176a21b71720b61720b7176a21b81720b71720b8" + "176a21b91720b81720b9176a21ba1720b91720ba176a21bb1720ba1720bb176a21bc1720bb1720bc176a21bd1720bc" + "1720bd176a21be1720bd1720be176a21bf1720be1720bf176a21c01720bf1720c0176a21c11720c01720c1176a21c2" + "1720c11720c2176a21c31720c21720c3176a21c41720c31720c4176a21c51720c41720c5176a21c61720c51720c617" + "6a21c71720c61720c7176a21c81720c71720c8176a21c91720c81720c9176a21ca1720c91720ca176a21cb1720ca17" + "20cb176a21cc1720cb1720cc176a21cd1720cc1720cd176a21ce1720cd1720ce176a21cf1720ce1720cf176a21d017" + "20cf1720d0176a21d11720d01720d1176a21d21720d11720d2176a21d31720d21720d3176a21d41720d31720d4176a" + "21d51720d41720d5176a21d61720d51720d6176a21d71720d61720d7176a21d81720d71720d8176a21d91720d81720" + "d9176a21da1720d91720da176a21db1720da1720db176a21dc1720db1720dc176a21dd1720dc1720dd176a21de1720" + "dd1720de176a21df1720de1720df176a21e01720df1720e0176a21e11720e01720e1176a21e21720e11720e2176a21" + "e31720e21720e3176a21e41720e31720e4176a21e51720e41720e5176a21e61720e51720e6176a21e71720e61720e7" + "176a21e81720e71720e8176a21e91720e81720e9176a21ea1720e91720ea176a21eb1720ea1720eb176a21ec1720eb" + "1720ec176a21ed1720ec1720ed176a21ee1720ed1720ee176a21ef1720ee1720ef176a21f01720ef1720f0176a21f1" + "1720f01720f1176a21f21720f11720f2176a21f31720f21720f3176a21f41720f31720f4176a21f51720f41720f517" + "6a21f61720f51720f6176a21f71720f61720f7176a21f81720f71720f8176a21f91720f81720f9176a21fa1720f917" + "20fa176a21fb1720fa1720fb176a21fc1720fb1720fc176a21fd1720fc1720fd176a21fe1720fd1720fe176a21ff17" + "20fe1720ff176a21801820ff172080186a2181182080182081186a2182182081182082186a2183182082182083186a" + "2184182083182084186a2185182084182085186a2186182085182086186a2187182086182087186a21881820871820" + "88186a2189182088182089186a218a18208918208a186a218b18208a18208b186a218c18208b18208c186a218d1820" + "8c18208d186a218e18208d18208e186a218f18208e18208f186a219018208f182090186a2191182090182091186a21" + "92182091182092186a2193182092182093186a2194182093182094186a2195182094182095186a2196182095182096" + "186a2197182096182097186a2198182097182098186a2199182098182099186a219a18209918209a186a219b18209a" + "18209b186a219c18209b18209c186a219d18209c18209d186a219e18209d18209e186a219f18209e18209f186a21a0" + "18209f1820a0186a21a11820a01820a1186a21a21820a11820a2186a21a31820a21820a3186a21a41820a31820a418" + "6a21a51820a41820a5186a21a61820a51820a6186a21a71820a61820a7186a21a81820a71820a8186a21a91820a818" + "20a9186a21aa1820a91820aa186a21ab1820aa1820ab186a21ac1820ab1820ac186a21ad1820ac1820ad186a21ae18" + "20ad1820ae186a21af1820ae1820af186a21b01820af1820b0186a21b11820b01820b1186a21b21820b11820b2186a" + "21b31820b21820b3186a21b41820b31820b4186a21b51820b41820b5186a21b61820b51820b6186a21b71820b61820" + "b7186a21b81820b71820b8186a21b91820b81820b9186a21ba1820b91820ba186a21bb1820ba1820bb186a21bc1820" + "bb1820bc186a21bd1820bc1820bd186a21be1820bd1820be186a21bf1820be1820bf186a21c01820bf1820c0186a21" + "c11820c01820c1186a21c21820c11820c2186a21c31820c21820c3186a21c41820c31820c4186a21c51820c41820c5" + "186a21c61820c51820c6186a21c71820c61820c7186a21c81820c71820c8186a21c91820c81820c9186a21ca1820c9" + "1820ca186a21cb1820ca1820cb186a21cc1820cb1820cc186a21cd1820cc1820cd186a21ce1820cd1820ce186a21cf" + "1820ce1820cf186a21d01820cf1820d0186a21d11820d01820d1186a21d21820d11820d2186a21d31820d21820d318" + "6a21d41820d31820d4186a21d51820d41820d5186a21d61820d51820d6186a21d71820d61820d7186a21d81820d718" + "20d8186a21d91820d81820d9186a21da1820d91820da186a21db1820da1820db186a21dc1820db1820dc186a21dd18" + "20dc1820dd186a21de1820dd1820de186a21df1820de1820df186a21e01820df1820e0186a21e11820e01820e1186a" + "21e21820e11820e2186a21e31820e21820e3186a21e41820e31820e4186a21e51820e41820e5186a21e61820e51820" + "e6186a21e71820e61820e7186a21e81820e71820e8186a21e91820e81820e9186a21ea1820e91820ea186a21eb1820" + "ea1820eb186a21ec1820eb1820ec186a21ed1820ec1820ed186a21ee1820ed1820ee186a21ef1820ee1820ef186a21" + "f01820ef1820f0186a21f11820f01820f1186a21f21820f11820f2186a21f31820f21820f3186a21f41820f31820f4" + "186a21f51820f41820f5186a21f61820f51820f6186a21f71820f61820f7186a21f81820f71820f8186a21f91820f8" + "1820f9186a21fa1820f91820fa186a21fb1820fa1820fb186a21fc1820fb1820fc186a21fd1820fc1820fd186a21fe" + "1820fd1820fe186a21ff1820fe1820ff186a21801920ff182080196a2181192080192081196a218219208119208219" + "6a2183192082192083196a2184192083192084196a2185192084192085196a2186192085192086196a218719208619" + "2087196a2188192087192088196a2189192088192089196a218a19208919208a196a218b19208a19208b196a218c19" + "208b19208c196a218d19208c19208d196a218e19208d19208e196a218f19208e19208f196a219019208f192090196a" + "2191192090192091196a2192192091192092196a2193192092192093196a2194192093192094196a21951920941920" + "95196a2196192095192096196a2197192096192097196a2198192097192098196a2199192098192099196a219a1920" + "9919209a196a219b19209a19209b196a219c19209b19209c196a219d19209c19209d196a219e19209d19209e196a21" + "9f19209e19209f196a21a019209f1920a0196a21a11920a01920a1196a21a21920a11920a2196a21a31920a21920a3" + "196a21a41920a31920a4196a21a51920a41920a5196a21a61920a51920a6196a21a71920a61920a7196a21a81920a7" + "1920a8196a21a91920a81920a9196a21aa1920a91920aa196a21ab1920aa1920ab196a21ac1920ab1920ac196a21ad" + "1920ac1920ad196a21ae1920ad1920ae196a21af1920ae1920af196a21b01920af1920b0196a21b11920b01920b119" + "6a21b21920b11920b2196a21b31920b21920b3196a21b41920b31920b4196a21b51920b41920b5196a21b61920b519" + "20b6196a21b71920b61920b7196a21b81920b71920b8196a21b91920b81920b9196a21ba1920b91920ba196a21bb19" + "20ba1920bb196a21bc1920bb1920bc196a21bd1920bc1920bd196a21be1920bd1920be196a21bf1920be1920bf196a" + "21c01920bf1920c0196a21c11920c01920c1196a21c21920c11920c2196a21c31920c21920c3196a21c41920c31920" + "c4196a21c51920c41920c5196a21c61920c51920c6196a21c71920c61920c7196a21c81920c71920c8196a21c91920" + "c81920c9196a21ca1920c91920ca196a21cb1920ca1920cb196a21cc1920cb1920cc196a21cd1920cc1920cd196a21" + "ce1920cd1920ce196a21cf1920ce1920cf196a21d01920cf1920d0196a21d11920d01920d1196a21d21920d11920d2" + "196a21d31920d21920d3196a21d41920d31920d4196a21d51920d41920d5196a21d61920d51920d6196a21d71920d6" + "1920d7196a21d81920d71920d8196a21d91920d81920d9196a21da1920d91920da196a21db1920da1920db196a21dc" + "1920db1920dc196a21dd1920dc1920dd196a21de1920dd1920de196a21df1920de1920df196a21e01920df1920e019" + "6a21e11920e01920e1196a21e21920e11920e2196a21e31920e21920e3196a21e41920e31920e4196a21e51920e419" + "20e5196a21e61920e51920e6196a21e71920e61920e7196a21e81920e71920e8196a21e91920e81920e9196a21ea19" + "20e91920ea196a21eb1920ea1920eb196a21ec1920eb1920ec196a21ed1920ec1920ed196a21ee1920ed1920ee196a" + "21ef1920ee1920ef196a21f01920ef1920f0196a21f11920f01920f1196a21f21920f11920f2196a21f31920f21920" + "f3196a21f41920f31920f4196a21f51920f41920f5196a21f61920f51920f6196a21f71920f61920f7196a21f81920" + "f71920f8196a21f91920f81920f9196a21fa1920f91920fa196a21fb1920fa1920fb196a21fc1920fb1920fc196a21" + "fd1920fc1920fd196a21fe1920fd1920fe196a21ff1920fe1920ff196a21801a20ff1920801a6a21811a20801a2081" + "1a6a21821a20811a20821a6a21831a20821a20831a6a21841a20831a20841a6a21851a20841a20851a6a21861a2085" + "1a20861a6a21871a20861a20871a6a21881a20871a20881a6a21891a20881a20891a6a218a1a20891a208a1a6a218b" + "1a208a1a208b1a6a218c1a208b1a208c1a6a218d1a208c1a208d1a6a218e1a208d1a208e1a6a218f1a208e1a208f1a" + "6a21901a208f1a20901a6a21911a20901a20911a6a21921a20911a20921a6a21931a20921a20931a6a21941a20931a" + "20941a6a21951a20941a20951a6a21961a20951a20961a6a21971a20961a20971a6a21981a20971a20981a6a21991a" + "20981a20991a6a219a1a20991a209a1a6a219b1a209a1a209b1a6a219c1a209b1a209c1a6a219d1a209c1a209d1a6a" + "219e1a209d1a209e1a6a219f1a209e1a209f1a6a21a01a209f1a20a01a6a21a11a20a01a20a11a6a21a21a20a11a20" + "a21a6a21a31a20a21a20a31a6a21a41a20a31a20a41a6a21a51a20a41a20a51a6a21a61a20a51a20a61a6a21a71a20" + "a61a20a71a6a21a81a20a71a20a81a6a21a91a20a81a20a91a6a21aa1a20a91a20aa1a6a21ab1a20aa1a20ab1a6a21" + "ac1a20ab1a20ac1a6a21ad1a20ac1a20ad1a6a21ae1a20ad1a20ae1a6a21af1a20ae1a20af1a6a21b01a20af1a20b0" + "1a6a21b11a20b01a20b11a6a21b21a20b11a20b21a6a21b31a20b21a20b31a6a21b41a20b31a20b41a6a21b51a20b4" + "1a20b51a6a21b61a20b51a20b61a6a21b71a20b61a20b71a6a21b81a20b71a20b81a6a21b91a20b81a20b91a6a21ba" + "1a20b91a20ba1a6a21bb1a20ba1a20bb1a6a21bc1a20bb1a20bc1a6a21bd1a20bc1a20bd1a6a21be1a20bd1a20be1a" + "6a21bf1a20be1a20bf1a6a21c01a20bf1a20c01a6a21c11a20c01a20c11a6a21c21a20c11a20c21a6a21c31a20c21a" + "20c31a6a21c41a20c31a20c41a6a21c51a20c41a20c51a6a21c61a20c51a20c61a6a21c71a20c61a20c71a6a21c81a" + "20c71a20c81a6a21c91a20c81a20c91a6a21ca1a20c91a20ca1a6a21cb1a20ca1a20cb1a6a21cc1a20cb1a20cc1a6a" + "21cd1a20cc1a20cd1a6a21ce1a20cd1a20ce1a6a21cf1a20ce1a20cf1a6a21d01a20cf1a20d01a6a21d11a20d01a20" + "d11a6a21d21a20d11a20d21a6a21d31a20d21a20d31a6a21d41a20d31a20d41a6a21d51a20d41a20d51a6a21d61a20" + "d51a20d61a6a21d71a20d61a20d71a6a21d81a20d71a20d81a6a21d91a20d81a20d91a6a21da1a20d91a20da1a6a21" + "db1a20da1a20db1a6a21dc1a20db1a20dc1a6a21dd1a20dc1a20dd1a6a21de1a20dd1a20de1a6a21df1a20de1a20df" + "1a6a21e01a20df1a20e01a6a21e11a20e01a20e11a6a21e21a20e11a20e21a6a21e31a20e21a20e31a6a21e41a20e3" + "1a20e41a6a21e51a20e41a20e51a6a21e61a20e51a20e61a6a21e71a20e61a20e71a6a21e81a20e71a20e81a6a21e9" + "1a20e81a20e91a6a21ea1a20e91a20ea1a6a21eb1a20ea1a20eb1a6a21ec1a20eb1a20ec1a6a21ed1a20ec1a20ed1a" + "6a21ee1a20ed1a20ee1a6a21ef1a20ee1a20ef1a6a21f01a20ef1a20f01a6a21f11a20f01a20f11a6a21f21a20f11a" + "20f21a6a21f31a20f21a20f31a6a21f41a20f31a20f41a6a21f51a20f41a20f51a6a21f61a20f51a20f61a6a21f71a" + "20f61a20f71a6a21f81a20f71a20f81a6a21f91a20f81a20f91a6a21fa1a20f91a20fa1a6a21fb1a20fa1a20fb1a6a" + "21fc1a20fb1a20fc1a6a21fd1a20fc1a20fd1a6a21fe1a20fd1a20fe1a6a21ff1a20fe1a20ff1a6a21801b20ff1a20" + "801b6a21811b20801b20811b6a21821b20811b20821b6a21831b20821b20831b6a21841b20831b20841b6a21851b20" + "841b20851b6a21861b20851b20861b6a21871b20861b20871b6a21881b20871b20881b6a21891b20881b20891b6a21" + "8a1b20891b208a1b6a218b1b208a1b208b1b6a218c1b208b1b208c1b6a218d1b208c1b208d1b6a218e1b208d1b208e" + "1b6a218f1b208e1b208f1b6a21901b208f1b20901b6a21911b20901b20911b6a21921b20911b20921b6a21931b2092" + "1b20931b6a21941b20931b20941b6a21951b20941b20951b6a21961b20951b20961b6a21971b20961b20971b6a2198" + "1b20971b20981b6a21991b20981b20991b6a219a1b20991b209a1b6a219b1b209a1b209b1b6a219c1b209b1b209c1b" + "6a219d1b209c1b209d1b6a219e1b209d1b209e1b6a219f1b209e1b209f1b6a21a01b209f1b20a01b6a21a11b20a01b" + "20a11b6a21a21b20a11b20a21b6a21a31b20a21b20a31b6a21a41b20a31b20a41b6a21a51b20a41b20a51b6a21a61b" + "20a51b20a61b6a21a71b20a61b20a71b6a21a81b20a71b20a81b6a21a91b20a81b20a91b6a21aa1b20a91b20aa1b6a" + "21ab1b20aa1b20ab1b6a21ac1b20ab1b20ac1b6a21ad1b20ac1b20ad1b6a21ae1b20ad1b20ae1b6a21af1b20ae1b20" + "af1b6a21b01b20af1b20b01b6a21b11b20b01b20b11b6a21b21b20b11b20b21b6a21b31b20b21b20b31b6a21b41b20" + "b31b20b41b6a21b51b20b41b20b51b6a21b61b20b51b20b61b6a21b71b20b61b20b71b6a21b81b20b71b20b81b6a21" + "b91b20b81b20b91b6a21ba1b20b91b20ba1b6a21bb1b20ba1b20bb1b6a21bc1b20bb1b20bc1b6a21bd1b20bc1b20bd" + "1b6a21be1b20bd1b20be1b6a21bf1b20be1b20bf1b6a21c01b20bf1b20c01b6a21c11b20c01b20c11b6a21c21b20c1" + "1b20c21b6a21c31b20c21b20c31b6a21c41b20c31b20c41b6a21c51b20c41b20c51b6a21c61b20c51b20c61b6a21c7" + "1b20c61b20c71b6a21c81b20c71b20c81b6a21c91b20c81b20c91b6a21ca1b20c91b20ca1b6a21cb1b20ca1b20cb1b" + "6a21cc1b20cb1b20cc1b6a21cd1b20cc1b20cd1b6a21ce1b20cd1b20ce1b6a21cf1b20ce1b20cf1b6a21d01b20cf1b" + "20d01b6a21d11b20d01b20d11b6a21d21b20d11b20d21b6a21d31b20d21b20d31b6a21d41b20d31b20d41b6a21d51b" + "20d41b20d51b6a21d61b20d51b20d61b6a21d71b20d61b20d71b6a21d81b20d71b20d81b6a21d91b20d81b20d91b6a" + "21da1b20d91b20da1b6a21db1b20da1b20db1b6a21dc1b20db1b20dc1b6a21dd1b20dc1b20dd1b6a21de1b20dd1b20" + "de1b6a21df1b20de1b20df1b6a21e01b20df1b20e01b6a21e11b20e01b20e11b6a21e21b20e11b20e21b6a21e31b20" + "e21b20e31b6a21e41b20e31b20e41b6a21e51b20e41b20e51b6a21e61b20e51b20e61b6a21e71b20e61b20e71b6a21" + "e81b20e71b20e81b6a21e91b20e81b20e91b6a21ea1b20e91b20ea1b6a21eb1b20ea1b20eb1b6a21ec1b20eb1b20ec" + "1b6a21ed1b20ec1b20ed1b6a21ee1b20ed1b20ee1b6a21ef1b20ee1b20ef1b6a21f01b20ef1b20f01b6a21f11b20f0" + "1b20f11b6a21f21b20f11b20f21b6a21f31b20f21b20f31b6a21f41b20f31b20f41b6a21f51b20f41b20f51b6a21f6" + "1b20f51b20f61b6a21f71b20f61b20f71b6a21f81b20f71b20f81b6a21f91b20f81b20f91b6a21fa1b20f91b20fa1b" + "6a21fb1b20fa1b20fb1b6a21fc1b20fb1b20fc1b6a21fd1b20fc1b20fd1b6a21fe1b20fd1b20fe1b6a21ff1b20fe1b" + "20ff1b6a21801c20ff1b20801c6a21811c20801c20811c6a21821c20811c20821c6a21831c20821c20831c6a21841c" + "20831c20841c6a21851c20841c20851c6a21861c20851c20861c6a21871c20861c20871c6a21881c20871c20881c6a" + "21891c20881c20891c6a218a1c20891c208a1c6a218b1c208a1c208b1c6a218c1c208b1c208c1c6a218d1c208c1c20" + "8d1c6a218e1c208d1c208e1c6a218f1c208e1c208f1c6a21901c208f1c20901c6a21911c20901c20911c6a21921c20" + "911c20921c6a21931c20921c20931c6a21941c20931c20941c6a21951c20941c20951c6a21961c20951c20961c6a21" + "971c20961c20971c6a21981c20971c20981c6a21991c20981c20991c6a219a1c20991c209a1c6a219b1c209a1c209b" + "1c6a219c1c209b1c209c1c6a219d1c209c1c209d1c6a219e1c209d1c209e1c6a219f1c209e1c209f1c6a21a01c209f" + "1c20a01c6a21a11c20a01c20a11c6a21a21c20a11c20a21c6a21a31c20a21c20a31c6a21a41c20a31c20a41c6a21a5" + "1c20a41c20a51c6a21a61c20a51c20a61c6a21a71c20a61c20a71c6a21a81c20a71c20a81c6a21a91c20a81c20a91c" + "6a21aa1c20a91c20aa1c6a21ab1c20aa1c20ab1c6a21ac1c20ab1c20ac1c6a21ad1c20ac1c20ad1c6a21ae1c20ad1c" + "20ae1c6a21af1c20ae1c20af1c6a21b01c20af1c20b01c6a21b11c20b01c20b11c6a21b21c20b11c20b21c6a21b31c" + "20b21c20b31c6a21b41c20b31c20b41c6a21b51c20b41c20b51c6a21b61c20b51c20b61c6a21b71c20b61c20b71c6a" + "21b81c20b71c20b81c6a21b91c20b81c20b91c6a21ba1c20b91c20ba1c6a21bb1c20ba1c20bb1c6a21bc1c20bb1c20" + "bc1c6a21bd1c20bc1c20bd1c6a21be1c20bd1c20be1c6a21bf1c20be1c20bf1c6a21c01c20bf1c20c01c6a21c11c20" + "c01c20c11c6a21c21c20c11c20c21c6a21c31c20c21c20c31c6a21c41c20c31c20c41c6a21c51c20c41c20c51c6a21" + "c61c20c51c20c61c6a21c71c20c61c20c71c6a21c81c20c71c20c81c6a21c91c20c81c20c91c6a21ca1c20c91c20ca" + "1c6a21cb1c20ca1c20cb1c6a21cc1c20cb1c20cc1c6a21cd1c20cc1c20cd1c6a21ce1c20cd1c20ce1c6a21cf1c20ce" + "1c20cf1c6a21d01c20cf1c20d01c6a21d11c20d01c20d11c6a21d21c20d11c20d21c6a21d31c20d21c20d31c6a21d4" + "1c20d31c20d41c6a21d51c20d41c20d51c6a21d61c20d51c20d61c6a21d71c20d61c20d71c6a21d81c20d71c20d81c" + "6a21d91c20d81c20d91c6a21da1c20d91c20da1c6a21db1c20da1c20db1c6a21dc1c20db1c20dc1c6a21dd1c20dc1c" + "20dd1c6a21de1c20dd1c20de1c6a21df1c20de1c20df1c6a21e01c20df1c20e01c6a21e11c20e01c20e11c6a21e21c" + "20e11c20e21c6a21e31c20e21c20e31c6a21e41c20e31c20e41c6a21e51c20e41c20e51c6a21e61c20e51c20e61c6a" + "21e71c20e61c20e71c6a21e81c20e71c20e81c6a21e91c20e81c20e91c6a21ea1c20e91c20ea1c6a21eb1c20ea1c20" + "eb1c6a21ec1c20eb1c20ec1c6a21ed1c20ec1c20ed1c6a21ee1c20ed1c20ee1c6a21ef1c20ee1c20ef1c6a21f01c20" + "ef1c20f01c6a21f11c20f01c20f11c6a21f21c20f11c20f21c6a21f31c20f21c20f31c6a21f41c20f31c20f41c6a21" + "f51c20f41c20f51c6a21f61c20f51c20f61c6a21f71c20f61c20f71c6a21f81c20f71c20f81c6a21f91c20f81c20f9" + "1c6a21fa1c20f91c20fa1c6a21fb1c20fa1c20fb1c6a21fc1c20fb1c20fc1c6a21fd1c20fc1c20fd1c6a21fe1c20fd" + "1c20fe1c6a21ff1c20fe1c20ff1c6a21801d20ff1c20801d6a21811d20801d20811d6a21821d20811d20821d6a2183" + "1d20821d20831d6a21841d20831d20841d6a21851d20841d20851d6a21861d20851d20861d6a21871d20861d20871d" + "6a21881d20871d20881d6a21891d20881d20891d6a218a1d20891d208a1d6a218b1d208a1d208b1d6a218c1d208b1d" + "208c1d6a218d1d208c1d208d1d6a218e1d208d1d208e1d6a218f1d208e1d208f1d6a21901d208f1d20901d6a21911d" + "20901d20911d6a21921d20911d20921d6a21931d20921d20931d6a21941d20931d20941d6a21951d20941d20951d6a" + "21961d20951d20961d6a21971d20961d20971d6a21981d20971d20981d6a21991d20981d20991d6a219a1d20991d20" + "9a1d6a219b1d209a1d209b1d6a219c1d209b1d209c1d6a219d1d209c1d209d1d6a219e1d209d1d209e1d6a219f1d20" + "9e1d209f1d6a21a01d209f1d20a01d6a21a11d20a01d20a11d6a21a21d20a11d20a21d6a21a31d20a21d20a31d6a21" + "a41d20a31d20a41d6a21a51d20a41d20a51d6a21a61d20a51d20a61d6a21a71d20a61d20a71d6a21a81d20a71d20a8" + "1d6a21a91d20a81d20a91d6a21aa1d20a91d20aa1d6a21ab1d20aa1d20ab1d6a21ac1d20ab1d20ac1d6a21ad1d20ac" + "1d20ad1d6a21ae1d20ad1d20ae1d6a21af1d20ae1d20af1d6a21b01d20af1d20b01d6a21b11d20b01d20b11d6a21b2" + "1d20b11d20b21d6a21b31d20b21d20b31d6a21b41d20b31d20b41d6a21b51d20b41d20b51d6a21b61d20b51d20b61d" + "6a21b71d20b61d20b71d6a21b81d20b71d20b81d6a21b91d20b81d20b91d6a21ba1d20b91d20ba1d6a21bb1d20ba1d" + "20bb1d6a21bc1d20bb1d20bc1d6a21bd1d20bc1d20bd1d6a21be1d20bd1d20be1d6a21bf1d20be1d20bf1d6a21c01d" + "20bf1d20c01d6a21c11d20c01d20c11d6a21c21d20c11d20c21d6a21c31d20c21d20c31d6a21c41d20c31d20c41d6a" + "21c51d20c41d20c51d6a21c61d20c51d20c61d6a21c71d20c61d20c71d6a21c81d20c71d20c81d6a21c91d20c81d20" + "c91d6a21ca1d20c91d20ca1d6a21cb1d20ca1d20cb1d6a21cc1d20cb1d20cc1d6a21cd1d20cc1d20cd1d6a21ce1d20" + "cd1d20ce1d6a21cf1d20ce1d20cf1d6a21d01d20cf1d20d01d6a21d11d20d01d20d11d6a21d21d20d11d20d21d6a21" + "d31d20d21d20d31d6a21d41d20d31d20d41d6a21d51d20d41d20d51d6a21d61d20d51d20d61d6a21d71d20d61d20d7" + "1d6a21d81d20d71d20d81d6a21d91d20d81d20d91d6a21da1d20d91d20da1d6a21db1d20da1d20db1d6a21dc1d20db" + "1d20dc1d6a21dd1d20dc1d20dd1d6a21de1d20dd1d20de1d6a21df1d20de1d20df1d6a21e01d20df1d20e01d6a21e1" + "1d20e01d20e11d6a21e21d20e11d20e21d6a21e31d20e21d20e31d6a21e41d20e31d20e41d6a21e51d20e41d20e51d" + "6a21e61d20e51d20e61d6a21e71d20e61d20e71d6a21e81d20e71d20e81d6a21e91d20e81d20e91d6a21ea1d20e91d" + "20ea1d6a21eb1d20ea1d20eb1d6a21ec1d20eb1d20ec1d6a21ed1d20ec1d20ed1d6a21ee1d20ed1d20ee1d6a21ef1d" + "20ee1d20ef1d6a21f01d20ef1d20f01d6a21f11d20f01d20f11d6a21f21d20f11d20f21d6a21f31d20f21d20f31d6a" + "21f41d20f31d20f41d6a21f51d20f41d20f51d6a21f61d20f51d20f61d6a21f71d20f61d20f71d6a21f81d20f71d20" + "f81d6a21f91d20f81d20f91d6a21fa1d20f91d20fa1d6a21fb1d20fa1d20fb1d6a21fc1d20fb1d20fc1d6a21fd1d20" + "fc1d20fd1d6a21fe1d20fd1d20fe1d6a21ff1d20fe1d20ff1d6a21801e20ff1d20801e6a21811e20801e20811e6a21" + "821e20811e20821e6a21831e20821e20831e6a21841e20831e20841e6a21851e20841e20851e6a21861e20851e2086" + "1e6a21871e20861e20871e6a21881e20871e20881e6a21891e20881e20891e6a218a1e20891e208a1e6a218b1e208a" + "1e208b1e6a218c1e208b1e208c1e6a218d1e208c1e208d1e6a218e1e208d1e208e1e6a218f1e208e1e208f1e6a2190" + "1e208f1e20901e6a21911e20901e20911e6a21921e20911e20921e6a21931e20921e20931e6a21941e20931e20941e" + "6a21951e20941e20951e6a21961e20951e20961e6a21971e20961e20971e6a21981e20971e20981e6a21991e20981e" + "20991e6a219a1e20991e209a1e6a219b1e209a1e209b1e6a219c1e209b1e209c1e6a219d1e209c1e209d1e6a219e1e" + "209d1e209e1e6a219f1e209e1e209f1e6a21a01e209f1e20a01e6a21a11e20a01e20a11e6a21a21e20a11e20a21e6a" + "21a31e20a21e20a31e6a21a41e20a31e20a41e6a21a51e20a41e20a51e6a21a61e20a51e20a61e6a21a71e20a61e20" + "a71e6a21a81e20a71e20a81e6a21a91e20a81e20a91e6a21aa1e20a91e20aa1e6a21ab1e20aa1e20ab1e6a21ac1e20" + "ab1e20ac1e6a21ad1e20ac1e20ad1e6a21ae1e20ad1e20ae1e6a21af1e20ae1e20af1e6a21b01e20af1e20b01e6a21" + "b11e20b01e20b11e6a21b21e20b11e20b21e6a21b31e20b21e20b31e6a21b41e20b31e20b41e6a21b51e20b41e20b5" + "1e6a21b61e20b51e20b61e6a21b71e20b61e20b71e6a21b81e20b71e20b81e6a21b91e20b81e20b91e6a21ba1e20b9" + "1e20ba1e6a21bb1e20ba1e20bb1e6a21bc1e20bb1e20bc1e6a21bd1e20bc1e20bd1e6a21be1e20bd1e20be1e6a21bf" + "1e20be1e20bf1e6a21c01e20bf1e20c01e6a21c11e20c01e20c11e6a21c21e20c11e20c21e6a21c31e20c21e20c31e" + "6a21c41e20c31e20c41e6a21c51e20c41e20c51e6a21c61e20c51e20c61e6a21c71e20c61e20c71e6a21c81e20c71e" + "20c81e6a21c91e20c81e20c91e6a21ca1e20c91e20ca1e6a21cb1e20ca1e20cb1e6a21cc1e20cb1e20cc1e6a21cd1e" + "20cc1e20cd1e6a21ce1e20cd1e20ce1e6a21cf1e20ce1e20cf1e6a21d01e20cf1e20d01e6a21d11e20d01e20d11e6a" + "21d21e20d11e20d21e6a21d31e20d21e20d31e6a21d41e20d31e20d41e6a21d51e20d41e20d51e6a21d61e20d51e20" + "d61e6a21d71e20d61e20d71e6a21d81e20d71e20d81e6a21d91e20d81e20d91e6a21da1e20d91e20da1e6a21db1e20" + "da1e20db1e6a21dc1e20db1e20dc1e6a21dd1e20dc1e20dd1e6a21de1e20dd1e20de1e6a21df1e20de1e20df1e6a21" + "e01e20df1e20e01e6a21e11e20e01e20e11e6a21e21e20e11e20e21e6a21e31e20e21e20e31e6a21e41e20e31e20e4" + "1e6a21e51e20e41e20e51e6a21e61e20e51e20e61e6a21e71e20e61e20e71e6a21e81e20e71e20e81e6a21e91e20e8" + "1e20e91e6a21ea1e20e91e20ea1e6a21eb1e20ea1e20eb1e6a21ec1e20eb1e20ec1e6a21ed1e20ec1e20ed1e6a21ee" + "1e20ed1e20ee1e6a21ef1e20ee1e20ef1e6a21f01e20ef1e20f01e6a21f11e20f01e20f11e6a21f21e20f11e20f21e" + "6a21f31e20f21e20f31e6a21f41e20f31e20f41e6a21f51e20f41e20f51e6a21f61e20f51e20f61e6a21f71e20f61e" + "20f71e6a21f81e20f71e20f81e6a21f91e20f81e20f91e6a21fa1e20f91e20fa1e6a21fb1e20fa1e20fb1e6a21fc1e" + "20fb1e20fc1e6a21fd1e20fc1e20fd1e6a21fe1e20fd1e20fe1e6a21ff1e20fe1e20ff1e6a21801f20ff1e20801f6a" + "21811f20801f20811f6a21821f20811f20821f6a21831f20821f20831f6a21841f20831f20841f6a21851f20841f20" + "851f6a21861f20851f20861f6a21871f20861f20871f6a21881f20871f20881f6a21891f20881f20891f6a218a1f20" + "891f208a1f6a218b1f208a1f208b1f6a218c1f208b1f208c1f6a218d1f208c1f208d1f6a218e1f208d1f208e1f6a21" + "8f1f208e1f208f1f6a21901f208f1f20901f6a21911f20901f20911f6a21921f20911f20921f6a21931f20921f2093" + "1f6a21941f20931f20941f6a21951f20941f20951f6a21961f20951f20961f6a21971f20961f20971f6a21981f2097" + "1f20981f6a21991f20981f20991f6a219a1f20991f209a1f6a219b1f209a1f209b1f6a219c1f209b1f209c1f6a219d" + "1f209c1f209d1f6a219e1f209d1f209e1f6a219f1f209e1f209f1f6a21a01f209f1f20a01f6a21a11f20a01f20a11f" + "6a21a21f20a11f20a21f6a21a31f20a21f20a31f6a21a41f20a31f20a41f6a21a51f20a41f20a51f6a21a61f20a51f" + "20a61f6a21a71f20a61f20a71f6a21a81f20a71f20a81f6a21a91f20a81f20a91f6a21aa1f20a91f20aa1f6a21ab1f" + "20aa1f20ab1f6a21ac1f20ab1f20ac1f6a21ad1f20ac1f20ad1f6a21ae1f20ad1f20ae1f6a21af1f20ae1f20af1f6a" + "21b01f20af1f20b01f6a21b11f20b01f20b11f6a21b21f20b11f20b21f6a21b31f20b21f20b31f6a21b41f20b31f20" + "b41f6a21b51f20b41f20b51f6a21b61f20b51f20b61f6a21b71f20b61f20b71f6a21b81f20b71f20b81f6a21b91f20" + "b81f20b91f6a21ba1f20b91f20ba1f6a21bb1f20ba1f20bb1f6a21bc1f20bb1f20bc1f6a21bd1f20bc1f20bd1f6a21" + "be1f20bd1f20be1f6a21bf1f20be1f20bf1f6a21c01f20bf1f20c01f6a21c11f20c01f20c11f6a21c21f20c11f20c2" + "1f6a21c31f20c21f20c31f6a21c41f20c31f20c41f6a21c51f20c41f20c51f6a21c61f20c51f20c61f6a21c71f20c6" + "1f20c71f6a21c81f20c71f20c81f6a21c91f20c81f20c91f6a21ca1f20c91f20ca1f6a21cb1f20ca1f20cb1f6a21cc" + "1f20cb1f20cc1f6a21cd1f20cc1f20cd1f6a21ce1f20cd1f20ce1f6a21cf1f20ce1f20cf1f6a21d01f20cf1f20d01f" + "6a21d11f20d01f20d11f6a21d21f20d11f20d21f6a21d31f20d21f20d31f6a21d41f20d31f20d41f6a21d51f20d41f" + "20d51f6a21d61f20d51f20d61f6a21d71f20d61f20d71f6a21d81f20d71f20d81f6a21d91f20d81f20d91f6a21da1f" + "20d91f20da1f6a21db1f20da1f20db1f6a21dc1f20db1f20dc1f6a21dd1f20dc1f20dd1f6a21de1f20dd1f20de1f6a" + "21df1f20de1f20df1f6a21e01f20df1f20e01f6a21e11f20e01f20e11f6a21e21f20e11f20e21f6a21e31f20e21f20" + "e31f6a21e41f20e31f20e41f6a21e51f20e41f20e51f6a21e61f20e51f20e61f6a21e71f20e61f20e71f6a21e81f20" + "e71f20e81f6a21e91f20e81f20e91f6a21ea1f20e91f20ea1f6a21eb1f20ea1f20eb1f6a21ec1f20eb1f20ec1f6a21" + "ed1f20ec1f20ed1f6a21ee1f20ed1f20ee1f6a21ef1f20ee1f20ef1f6a21f01f20ef1f20f01f6a21f11f20f01f20f1" + "1f6a21f21f20f11f20f21f6a21f31f20f21f20f31f6a21f41f20f31f20f41f6a21f51f20f41f20f51f6a21f61f20f5" + "1f20f61f6a21f71f20f61f20f71f6a21f81f20f71f20f81f6a21f91f20f81f20f91f6a21fa1f20f91f20fa1f6a21fb" + "1f20fa1f20fb1f6a21fc1f20fb1f20fc1f6a21fd1f20fc1f20fd1f6a21fe1f20fd1f20fe1f6a21ff1f20fe1f20ff1f" + "6a21802020ff1f2080206a2181202080202081206a2182202081202082206a2183202082202083206a218420208320" + "2084206a2185202084202085206a2186202085202086206a2187202086202087206a2188202087202088206a218920" + "2088202089206a218a20208920208a206a218b20208a20208b206a218c20208b20208c206a218d20208c20208d206a" + "218e20208d20208e206a218f20208e20208f206a219020208f202090206a2191202090202091206a21922020912020" + "92206a2193202092202093206a2194202093202094206a2195202094202095206a2196202095202096206a21972020" + "96202097206a2198202097202098206a2199202098202099206a219a20209920209a206a219b20209a20209b206a21" + "9c20209b20209c206a219d20209c20209d206a219e20209d20209e206a219f20209e20209f206a21a020209f2020a0" + "206a21a12020a02020a1206a21a22020a12020a2206a21a32020a22020a3206a21a42020a32020a4206a21a52020a4" + "2020a5206a21a62020a52020a6206a21a72020a62020a7206a21a82020a72020a8206a21a92020a82020a9206a21aa" + "2020a92020aa206a21ab2020aa2020ab206a21ac2020ab2020ac206a21ad2020ac2020ad206a21ae2020ad2020ae20" + "6a21af2020ae2020af206a21b02020af2020b0206a21b12020b02020b1206a21b22020b12020b2206a21b32020b220" + "20b3206a21b42020b32020b4206a21b52020b42020b5206a21b62020b52020b6206a21b72020b62020b7206a21b820" + "20b72020b8206a21b92020b82020b9206a21ba2020b92020ba206a21bb2020ba2020bb206a21bc2020bb2020bc206a" + "21bd2020bc2020bd206a21be2020bd2020be206a21bf2020be2020bf206a21c02020bf2020c0206a21c12020c02020" + "c1206a21c22020c12020c2206a21c32020c22020c3206a21c42020c32020c4206a21c52020c42020c5206a21c62020" + "c52020c6206a21c72020c62020c7206a21c82020c72020c8206a21c92020c82020c9206a21ca2020c92020ca206a21" + "cb2020ca2020cb206a21cc2020cb2020cc206a21cd2020cc2020cd206a21ce2020cd2020ce206a21cf2020ce2020cf" + "206a21d02020cf2020d0206a21d12020d02020d1206a21d22020d12020d2206a21d32020d22020d3206a21d42020d3" + "2020d4206a21d52020d42020d5206a21d62020d52020d6206a21d72020d62020d7206a21d82020d72020d8206a21d9" + "2020d82020d9206a21da2020d92020da206a21db2020da2020db206a21dc2020db2020dc206a21dd2020dc2020dd20" + "6a21de2020dd2020de206a21df2020de2020df206a21e02020df2020e0206a21e12020e02020e1206a21e22020e120" + "20e2206a21e32020e22020e3206a21e42020e32020e4206a21e52020e42020e5206a21e62020e52020e6206a21e720" + "20e62020e7206a21e82020e72020e8206a21e92020e82020e9206a21ea2020e92020ea206a21eb2020ea2020eb206a" + "21ec2020eb2020ec206a21ed2020ec2020ed206a21ee2020ed2020ee206a21ef2020ee2020ef206a21f02020ef2020" + "f0206a21f12020f02020f1206a21f22020f12020f2206a21f32020f22020f3206a21f42020f32020f4206a21f52020" + "f42020f5206a21f62020f52020f6206a21f72020f62020f7206a21f82020f72020f8206a21f92020f82020f9206a21" + "fa2020f92020fa206a21fb2020fa2020fb206a21fc2020fb2020fc206a21fd2020fc2020fd206a21fe2020fd2020fe" + "206a21ff2020fe2020ff206a21802120ff202080216a2181212080212081216a2182212081212082216a2183212082" + "212083216a2184212083212084216a2185212084212085216a2186212085212086216a2187212086212087216a2188" + "212087212088216a2189212088212089216a218a21208921208a216a218b21208a21208b216a218c21208b21208c21" + "6a218d21208c21208d216a218e21208d21208e216a218f21208e21208f216a219021208f212090216a219121209021" + "2091216a2192212091212092216a2193212092212093216a2194212093212094216a2195212094212095216a219621" + "2095212096216a2197212096212097216a2198212097212098216a2199212098212099216a219a21209921209a216a" + "219b21209a21209b216a219c21209b21209c216a219d21209c21209d216a219e21209d21209e216a219f21209e2120" + "9f216a21a021209f2120a0216a21a12120a02120a1216a21a22120a12120a2216a21a32120a22120a3216a21a42120" + "a32120a4216a21a52120a42120a5216a21a62120a52120a6216a21a72120a62120a7216a21a82120a72120a8216a21" + "a92120a82120a9216a21aa2120a92120aa216a21ab2120aa2120ab216a21ac2120ab2120ac216a21ad2120ac2120ad" + "216a21ae2120ad2120ae216a21af2120ae2120af216a21b02120af2120b0216a21b12120b02120b1216a21b22120b1" + "2120b2216a21b32120b22120b3216a21b42120b32120b4216a21b52120b42120b5216a21b62120b52120b6216a21b7" + "2120b62120b7216a21b82120b72120b8216a21b92120b82120b9216a21ba2120b92120ba216a21bb2120ba2120bb21" + "6a21bc2120bb2120bc216a21bd2120bc2120bd216a21be2120bd2120be216a21bf2120be2120bf216a21c02120bf21" + "20c0216a21c12120c02120c1216a21c22120c12120c2216a21c32120c22120c3216a21c42120c32120c4216a21c521" + "20c42120c5216a21c62120c52120c6216a21c72120c62120c7216a21c82120c72120c8216a21c92120c82120c9216a" + "21ca2120c92120ca216a21cb2120ca2120cb216a21cc2120cb2120cc216a21cd2120cc2120cd216a21ce2120cd2120" + "ce216a21cf2120ce2120cf216a21d02120cf2120d0216a21d12120d02120d1216a21d22120d12120d2216a21d32120" + "d22120d3216a21d42120d32120d4216a21d52120d42120d5216a21d62120d52120d6216a21d72120d62120d7216a21" + "d82120d72120d8216a21d92120d82120d9216a21da2120d92120da216a21db2120da2120db216a21dc2120db2120dc" + "216a21dd2120dc2120dd216a21de2120dd2120de216a21df2120de2120df216a21e02120df2120e0216a21e12120e0" + "2120e1216a21e22120e12120e2216a21e32120e22120e3216a21e42120e32120e4216a21e52120e42120e5216a21e6" + "2120e52120e6216a21e72120e62120e7216a21e82120e72120e8216a21e92120e82120e9216a21ea2120e92120ea21" + "6a21eb2120ea2120eb216a21ec2120eb2120ec216a21ed2120ec2120ed216a21ee2120ed2120ee216a21ef2120ee21" + "20ef216a21f02120ef2120f0216a21f12120f02120f1216a21f22120f12120f2216a21f32120f22120f3216a21f421" + "20f32120f4216a21f52120f42120f5216a21f62120f52120f6216a21f72120f62120f7216a21f82120f72120f8216a" + "21f92120f82120f9216a21fa2120f92120fa216a21fb2120fa2120fb216a21fc2120fb2120fc216a21fd2120fc2120" + "fd216a21fe2120fd2120fe216a21ff2120fe2120ff216a21802220ff212080226a2181222080222081226a21822220" + "81222082226a2183222082222083226a2184222083222084226a2185222084222085226a2186222085222086226a21" + "87222086222087226a2188222087222088226a2189222088222089226a218a22208922208a226a218b22208a22208b" + "226a218c22208b22208c226a218d22208c22208d226a218e22208d22208e226a218f22208e22208f226a219022208f" + "222090226a2191222090222091226a2192222091222092226a2193222092222093226a2194222093222094226a2195" + "222094222095226a2196222095222096226a2197222096222097226a2198222097222098226a219922209822209922" + "6a219a22209922209a226a219b22209a22209b226a219c22209b22209c226a219d22209c22209d226a219e22209d22" + "209e226a219f22209e22209f226a21a022209f2220a0226a21a12220a02220a1226a21a22220a12220a2226a21a322" + "20a22220a3226a21a42220a32220a4226a21a52220a42220a5226a21a62220a52220a6226a21a72220a62220a7226a" + "21a82220a72220a8226a21a92220a82220a9226a21aa2220a92220aa226a21ab2220aa2220ab226a21ac2220ab2220" + "ac226a21ad2220ac2220ad226a21ae2220ad2220ae226a21af2220ae2220af226a21b02220af2220b0226a21b12220" + "b02220b1226a21b22220b12220b2226a21b32220b22220b3226a21b42220b32220b4226a21b52220b42220b5226a21" + "b62220b52220b6226a21b72220b62220b7226a21b82220b72220b8226a21b92220b82220b9226a21ba2220b92220ba" + "226a21bb2220ba2220bb226a21bc2220bb2220bc226a21bd2220bc2220bd226a21be2220bd2220be226a21bf2220be" + "2220bf226a21c02220bf2220c0226a21c12220c02220c1226a21c22220c12220c2226a21c32220c22220c3226a21c4" + "2220c32220c4226a21c52220c42220c5226a21c62220c52220c6226a21c72220c62220c7226a21c82220c72220c822" + "6a21c92220c82220c9226a21ca2220c92220ca226a21cb2220ca2220cb226a21cc2220cb2220cc226a21cd2220cc22" + "20cd226a21ce2220cd2220ce226a21cf2220ce2220cf226a21d02220cf2220d0226a21d12220d02220d1226a21d222" + "20d12220d2226a21d32220d22220d3226a21d42220d32220d4226a21d52220d42220d5226a21d62220d52220d6226a" + "21d72220d62220d7226a21d82220d72220d8226a21d92220d82220d9226a21da2220d92220da226a21db2220da2220" + "db226a21dc2220db2220dc226a21dd2220dc2220dd226a21de2220dd2220de226a21df2220de2220df226a21e02220" + "df2220e0226a21e12220e02220e1226a21e22220e12220e2226a21e32220e22220e3226a21e42220e32220e4226a21" + "e52220e42220e5226a21e62220e52220e6226a21e72220e62220e7226a21e82220e72220e8226a21e92220e82220e9" + "226a21ea2220e92220ea226a21eb2220ea2220eb226a21ec2220eb2220ec226a21ed2220ec2220ed226a21ee2220ed" + "2220ee226a21ef2220ee2220ef226a21f02220ef2220f0226a21f12220f02220f1226a21f22220f12220f2226a21f3" + "2220f22220f3226a21f42220f32220f4226a21f52220f42220f5226a21f62220f52220f6226a21f72220f62220f722" + "6a21f82220f72220f8226a21f92220f82220f9226a21fa2220f92220fa226a21fb2220fa2220fb226a21fc2220fb22" + "20fc226a21fd2220fc2220fd226a21fe2220fd2220fe226a21ff2220fe2220ff226a21802320ff222080236a218123" + "2080232081236a2182232081232082236a2183232082232083236a2184232083232084236a2185232084232085236a" + "2186232085232086236a2187232086232087236a2188232087232088236a2189232088232089236a218a2320892320" + "8a236a218b23208a23208b236a218c23208b23208c236a218d23208c23208d236a218e23208d23208e236a218f2320" + "8e23208f236a219023208f232090236a2191232090232091236a2192232091232092236a2193232092232093236a21" + "94232093232094236a2195232094232095236a2196232095232096236a2197232096232097236a2198232097232098" + "236a2199232098232099236a219a23209923209a236a219b23209a23209b236a219c23209b23209c236a219d23209c" + "23209d236a219e23209d23209e236a219f23209e23209f236a21a023209f2320a0236a21a12320a02320a1236a21a2" + "2320a12320a2236a21a32320a22320a3236a21a42320a32320a4236a21a52320a42320a5236a21a62320a52320a623" + "6a21a72320a62320a7236a21a82320a72320a8236a21a92320a82320a9236a21aa2320a92320aa236a21ab2320aa23" + "20ab236a21ac2320ab2320ac236a21ad2320ac2320ad236a21ae2320ad2320ae236a21af2320ae2320af236a21b023" + "20af2320b0236a21b12320b02320b1236a21b22320b12320b2236a21b32320b22320b3236a21b42320b32320b4236a" + "21b52320b42320b5236a21b62320b52320b6236a21b72320b62320b7236a21b82320b72320b8236a21b92320b82320" + "b9236a21ba2320b92320ba236a21bb2320ba2320bb236a21bc2320bb2320bc236a21bd2320bc2320bd236a21be2320" + "bd2320be236a21bf2320be2320bf236a21c02320bf2320c0236a21c12320c02320c1236a21c22320c12320c2236a21" + "c32320c22320c3236a21c42320c32320c4236a21c52320c42320c5236a21c62320c52320c6236a21c72320c62320c7" + "236a21c82320c72320c8236a21c92320c82320c9236a21ca2320c92320ca236a21cb2320ca2320cb236a21cc2320cb" + "2320cc236a21cd2320cc2320cd236a21ce2320cd2320ce236a21cf2320ce2320cf236a21d02320cf2320d0236a21d1" + "2320d02320d1236a21d22320d12320d2236a21d32320d22320d3236a21d42320d32320d4236a21d52320d42320d523" + "6a21d62320d52320d6236a21d72320d62320d7236a21d82320d72320d8236a21d92320d82320d9236a21da2320d923" + "20da236a21db2320da2320db236a21dc2320db2320dc236a21dd2320dc2320dd236a21de2320dd2320de236a21df23" + "20de2320df236a21e02320df2320e0236a21e12320e02320e1236a21e22320e12320e2236a21e32320e22320e3236a" + "21e42320e32320e4236a21e52320e42320e5236a21e62320e52320e6236a21e72320e62320e7236a21e82320e72320" + "e8236a21e92320e82320e9236a21ea2320e92320ea236a21eb2320ea2320eb236a21ec2320eb2320ec236a21ed2320" + "ec2320ed236a21ee2320ed2320ee236a21ef2320ee2320ef236a21f02320ef2320f0236a21f12320f02320f1236a21" + "f22320f12320f2236a21f32320f22320f3236a21f42320f32320f4236a21f52320f42320f5236a21f62320f52320f6" + "236a21f72320f62320f7236a21f82320f72320f8236a21f92320f82320f9236a21fa2320f92320fa236a21fb2320fa" + "2320fb236a21fc2320fb2320fc236a21fd2320fc2320fd236a21fe2320fd2320fe236a21ff2320fe2320ff236a2180" + "2420ff232080246a2181242080242081246a2182242081242082246a2183242082242083246a218424208324208424" + "6a2185242084242085246a2186242085242086246a2187242086242087246a2188242087242088246a218924208824" + "2089246a218a24208924208a246a218b24208a24208b246a218c24208b24208c246a218d24208c24208d246a218e24" + "208d24208e246a218f24208e24208f246a219024208f242090246a2191242090242091246a2192242091242092246a" + "2193242092242093246a2194242093242094246a2195242094242095246a2196242095242096246a21972420962420" + "97246a2198242097242098246a2199242098242099246a219a24209924209a246a219b24209a24209b246a219c2420" + "9b24209c246a219d24209c24209d246a219e24209d24209e246a219f24209e24209f246a21a024209f2420a0246a21" + "a12420a02420a1246a21a22420a12420a2246a21a32420a22420a3246a21a42420a32420a4246a21a52420a42420a5" + "246a21a62420a52420a6246a21a72420a62420a7246a21a82420a72420a8246a21a92420a82420a9246a21aa2420a9" + "2420aa246a21ab2420aa2420ab246a21ac2420ab2420ac246a21ad2420ac2420ad246a21ae2420ad2420ae246a21af" + "2420ae2420af246a21b02420af2420b0246a21b12420b02420b1246a21b22420b12420b2246a21b32420b22420b324" + "6a21b42420b32420b4246a21b52420b42420b5246a21b62420b52420b6246a21b72420b62420b7246a21b82420b724" + "20b8246a21b92420b82420b9246a21ba2420b92420ba246a21bb2420ba2420bb246a21bc2420bb2420bc246a21bd24" + "20bc2420bd246a21be2420bd2420be246a21bf2420be2420bf246a21c02420bf2420c0246a21c12420c02420c1246a" + "21c22420c12420c2246a21c32420c22420c3246a21c42420c32420c4246a21c52420c42420c5246a21c62420c52420" + "c6246a21c72420c62420c7246a21c82420c72420c8246a21c92420c82420c9246a21ca2420c92420ca246a21cb2420" + "ca2420cb246a21cc2420cb2420cc246a21cd2420cc2420cd246a21ce2420cd2420ce246a21cf2420ce2420cf246a21" + "d02420cf2420d0246a21d12420d02420d1246a21d22420d12420d2246a21d32420d22420d3246a21d42420d32420d4" + "246a21d52420d42420d5246a21d62420d52420d6246a21d72420d62420d7246a21d82420d72420d8246a21d92420d8" + "2420d9246a21da2420d92420da246a21db2420da2420db246a21dc2420db2420dc246a21dd2420dc2420dd246a21de" + "2420dd2420de246a21df2420de2420df246a21e02420df2420e0246a21e12420e02420e1246a21e22420e12420e224" + "6a21e32420e22420e3246a21e42420e32420e4246a21e52420e42420e5246a21e62420e52420e6246a21e72420e624" + "20e7246a21e82420e72420e8246a21e92420e82420e9246a21ea2420e92420ea246a21eb2420ea2420eb246a21ec24" + "20eb2420ec246a21ed2420ec2420ed246a21ee2420ed2420ee246a21ef2420ee2420ef246a21f02420ef2420f0246a" + "21f12420f02420f1246a21f22420f12420f2246a21f32420f22420f3246a21f42420f32420f4246a21f52420f42420" + "f5246a21f62420f52420f6246a21f72420f62420f7246a21f82420f72420f8246a21f92420f82420f9246a21fa2420" + "f92420fa246a21fb2420fa2420fb246a21fc2420fb2420fc246a21fd2420fc2420fd246a21fe2420fd2420fe246a21" + "ff2420fe2420ff246a21802520ff242080256a2181252080252081256a2182252081252082256a2183252082252083" + "256a2184252083252084256a2185252084252085256a2186252085252086256a2187252086252087256a2188252087" + "252088256a2189252088252089256a218a25208925208a256a218b25208a25208b256a218c25208b25208c256a218d" + "25208c25208d256a218e25208d25208e256a218f25208e25208f256a219025208f252090256a219125209025209125" + "6a2192252091252092256a2193252092252093256a2194252093252094256a2195252094252095256a219625209525" + "2096256a2197252096252097256a2198252097252098256a2199252098252099256a219a25209925209a256a219b25" + "209a25209b256a219c25209b25209c256a219d25209c25209d256a219e25209d25209e256a219f25209e25209f256a" + "21a025209f2520a0256a21a12520a02520a1256a21a22520a12520a2256a21a32520a22520a3256a21a42520a32520" + "a4256a21a52520a42520a5256a21a62520a52520a6256a21a72520a62520a7256a21a82520a72520a8256a21a92520" + "a82520a9256a21aa2520a92520aa256a21ab2520aa2520ab256a21ac2520ab2520ac256a21ad2520ac2520ad256a21" + "ae2520ad2520ae256a21af2520ae2520af256a21b02520af2520b0256a21b12520b02520b1256a21b22520b12520b2" + "256a21b32520b22520b3256a21b42520b32520b4256a21b52520b42520b5256a21b62520b52520b6256a21b72520b6" + "2520b7256a21b82520b72520b8256a21b92520b82520b9256a21ba2520b92520ba256a21bb2520ba2520bb256a21bc" + "2520bb2520bc256a21bd2520bc2520bd256a21be2520bd2520be256a21bf2520be2520bf256a21c02520bf2520c025" + "6a21c12520c02520c1256a21c22520c12520c2256a21c32520c22520c3256a21c42520c32520c4256a21c52520c425" + "20c5256a21c62520c52520c6256a21c72520c62520c7256a21c82520c72520c8256a21c92520c82520c9256a21ca25" + "20c92520ca256a21cb2520ca2520cb256a21cc2520cb2520cc256a21cd2520cc2520cd256a21ce2520cd2520ce256a" + "21cf2520ce2520cf256a21d02520cf2520d0256a21d12520d02520d1256a21d22520d12520d2256a21d32520d22520" + "d3256a21d42520d32520d4256a21d52520d42520d5256a21d62520d52520d6256a21d72520d62520d7256a21d82520" + "d72520d8256a21d92520d82520d9256a21da2520d92520da256a21db2520da2520db256a21dc2520db2520dc256a21" + "dd2520dc2520dd256a21de2520dd2520de256a21df2520de2520df256a21e02520df2520e0256a21e12520e02520e1" + "256a21e22520e12520e2256a21e32520e22520e3256a21e42520e32520e4256a21e52520e42520e5256a21e62520e5" + "2520e6256a21e72520e62520e7256a21e82520e72520e8256a21e92520e82520e9256a21ea2520e92520ea256a21eb" + "2520ea2520eb256a21ec2520eb2520ec256a21ed2520ec2520ed256a21ee2520ed2520ee256a21ef2520ee2520ef25" + "6a21f02520ef2520f0256a21f12520f02520f1256a21f22520f12520f2256a21f32520f22520f3256a21f42520f325" + "20f4256a21f52520f42520f5256a21f62520f52520f6256a21f72520f62520f7256a21f82520f72520f8256a21f925" + "20f82520f9256a21fa2520f92520fa256a21fb2520fa2520fb256a21fc2520fb2520fc256a21fd2520fc2520fd256a" + "21fe2520fd2520fe256a21ff2520fe2520ff256a21802620ff252080266a2181262080262081266a21822620812620" + "82266a2183262082262083266a2184262083262084266a2185262084262085266a2186262085262086266a21872620" + "86262087266a2188262087262088266a2189262088262089266a218a26208926208a266a218b26208a26208b266a21" + "8c26208b26208c266a218d26208c26208d266a218e26208d26208e266a218f26208e26208f266a219026208f262090" + "266a2191262090262091266a2192262091262092266a2193262092262093266a2194262093262094266a2195262094" + "262095266a2196262095262096266a2197262096262097266a2198262097262098266a2199262098262099266a219a" + "26209926209a266a219b26209a26209b266a219c26209b26209c266a219d26209c26209d266a219e26209d26209e26" + "6a219f26209e26209f266a21a026209f2620a0266a21a12620a02620a1266a21a22620a12620a2266a21a32620a226" + "20a3266a21a42620a32620a4266a21a52620a42620a5266a21a62620a52620a6266a21a72620a62620a7266a21a826" + "20a72620a8266a21a92620a82620a9266a21aa2620a92620aa266a21ab2620aa2620ab266a21ac2620ab2620ac266a" + "21ad2620ac2620ad266a21ae2620ad2620ae266a21af2620ae2620af266a21b02620af2620b0266a21b12620b02620" + "b1266a21b22620b12620b2266a21b32620b22620b3266a21b42620b32620b4266a21b52620b42620b5266a21b62620" + "b52620b6266a21b72620b62620b7266a21b82620b72620b8266a21b92620b82620b9266a21ba2620b92620ba266a21" + "bb2620ba2620bb266a21bc2620bb2620bc266a21bd2620bc2620bd266a21be2620bd2620be266a21bf2620be2620bf" + "266a21c02620bf2620c0266a21c12620c02620c1266a21c22620c12620c2266a21c32620c22620c3266a21c42620c3" + "2620c4266a21c52620c42620c5266a21c62620c52620c6266a21c72620c62620c7266a21c82620c72620c8266a21c9" + "2620c82620c9266a21ca2620c92620ca266a21cb2620ca2620cb266a21cc2620cb2620cc266a21cd2620cc2620cd26" + "6a21ce2620cd2620ce266a21cf2620ce2620cf266a21d02620cf2620d0266a21d12620d02620d1266a21d22620d126" + "20d2266a21d32620d22620d3266a21d42620d32620d4266a21d52620d42620d5266a21d62620d52620d6266a21d726" + "20d62620d7266a21d82620d72620d8266a21d92620d82620d9266a21da2620d92620da266a21db2620da2620db266a" + "21dc2620db2620dc266a21dd2620dc2620dd266a21de2620dd2620de266a21df2620de2620df266a21e02620df2620" + "e0266a21e12620e02620e1266a21e22620e12620e2266a21e32620e22620e3266a21e42620e32620e4266a21e52620" + "e42620e5266a21e62620e52620e6266a21e72620e62620e7266a21e82620e72620e8266a21e92620e82620e9266a21" + "ea2620e92620ea266a21eb2620ea2620eb266a21ec2620eb2620ec266a21ed2620ec2620ed266a21ee2620ed2620ee" + "266a21ef2620ee2620ef266a21f02620ef2620f0266a21f12620f02620f1266a21f22620f12620f2266a21f32620f2" + "2620f3266a21f42620f32620f4266a21f52620f42620f5266a21f62620f52620f6266a21f72620f62620f7266a21f8" + "2620f72620f8266a21f92620f82620f9266a21fa2620f92620fa266a21fb2620fa2620fb266a21fc2620fb2620fc26" + "6a21fd2620fc2620fd266a21fe2620fd2620fe266a21ff2620fe2620ff266a21802720ff262080276a218127208027" + "2081276a2182272081272082276a2183272082272083276a2184272083272084276a2185272084272085276a218627" + "2085272086276a2187272086272087276a2188272087272088276a2189272088272089276a218a27208927208a276a" + "218b27208a27208b276a218c27208b27208c276a218d27208c27208d276a218e27208d27208e276a218f27208e2720" + "8f276a219027208f272090276a2191272090272091276a2192272091272092276a2193272092272093276a21942720" + "93272094276a2195272094272095276a2196272095272096276a2197272096272097276a2198272097272098276a21" + "99272098272099276a219a27209927209a276a219b27209a27209b276a219c27209b27209c276a219d27209c27209d" + "276a219e27209d27209e276a219f27209e27209f276a21a027209f2720a0276a21a12720a02720a1276a21a22720a1" + "2720a2276a21a32720a22720a3276a21a42720a32720a4276a21a52720a42720a5276a21a62720a52720a6276a21a7" + "2720a62720a7276a21a82720a72720a8276a21a92720a82720a9276a21aa2720a92720aa276a21ab2720aa2720ab27" + "6a21ac2720ab2720ac276a21ad2720ac2720ad276a21ae2720ad2720ae276a21af2720ae2720af276a21b02720af27" + "20b0276a21b12720b02720b1276a21b22720b12720b2276a21b32720b22720b3276a21b42720b32720b4276a21b527" + "20b42720b5276a21b62720b52720b6276a21b72720b62720b7276a21b82720b72720b8276a21b92720b82720b9276a" + "21ba2720b92720ba276a21bb2720ba2720bb276a21bc2720bb2720bc276a21bd2720bc2720bd276a21be2720bd2720" + "be276a21bf2720be2720bf276a21c02720bf2720c0276a21c12720c02720c1276a21c22720c12720c2276a21c32720" + "c22720c3276a21c42720c32720c4276a21c52720c42720c5276a21c62720c52720c6276a21c72720c62720c7276a21" + "c82720c72720c8276a21c92720c82720c9276a21ca2720c92720ca276a21cb2720ca2720cb276a21cc2720cb2720cc" + "276a21cd2720cc2720cd276a21ce2720cd2720ce276a21cf2720ce2720cf276a21d02720cf2720d0276a21d12720d0" + "2720d1276a21d22720d12720d2276a21d32720d22720d3276a21d42720d32720d4276a21d52720d42720d5276a21d6" + "2720d52720d6276a21d72720d62720d7276a21d82720d72720d8276a21d92720d82720d9276a21da2720d92720da27" + "6a21db2720da2720db276a21dc2720db2720dc276a21dd2720dc2720dd276a21de2720dd2720de276a21df2720de27" + "20df276a21e02720df2720e0276a21e12720e02720e1276a21e22720e12720e2276a21e32720e22720e3276a21e427" + "20e32720e4276a21e52720e42720e5276a21e62720e52720e6276a21e72720e62720e7276a21e82720e72720e8276a" + "21e92720e82720e9276a21ea2720e92720ea276a21eb2720ea2720eb276a21ec2720eb2720ec276a21ed2720ec2720" + "ed276a21ee2720ed2720ee276a21ef2720ee2720ef276a21f02720ef2720f0276a21f12720f02720f1276a21f22720" + "f12720f2276a21f32720f22720f3276a21f42720f32720f4276a21f52720f42720f5276a21f62720f52720f6276a21" + "f72720f62720f7276a21f82720f72720f8276a21f92720f82720f9276a21fa2720f92720fa276a21fb2720fa2720fb" + "276a21fc2720fb2720fc276a21fd2720fc2720fd276a21fe2720fd2720fe276a21ff2720fe2720ff276a21802820ff" + "272080286a2181282080282081286a2182282081282082286a2183282082282083286a2184282083282084286a2185" + "282084282085286a2186282085282086286a2187282086282087286a2188282087282088286a218928208828208928" + "6a218a28208928208a286a218b28208a28208b286a218c28208b28208c286a218d28208c28208d286a218e28208d28" + "208e286a218f28208e28208f286a219028208f282090286a2191282090282091286a2192282091282092286a219328" + "2092282093286a2194282093282094286a2195282094282095286a2196282095282096286a2197282096282097286a" + "2198282097282098286a2199282098282099286a219a28209928209a286a219b28209a28209b286a219c28209b2820" + "9c286a219d28209c28209d286a219e28209d28209e286a219f28209e28209f286a21a028209f2820a0286a21a12820" + "a02820a1286a21a22820a12820a2286a21a32820a22820a3286a21a42820a32820a4286a21a52820a42820a5286a21" + "a62820a52820a6286a21a72820a62820a7286a21a82820a72820a8286a21a92820a82820a9286a21aa2820a92820aa" + "286a21ab2820aa2820ab286a21ac2820ab2820ac286a21ad2820ac2820ad286a21ae2820ad2820ae286a21af2820ae" + "2820af286a21b02820af2820b0286a21b12820b02820b1286a21b22820b12820b2286a21b32820b22820b3286a21b4" + "2820b32820b4286a21b52820b42820b5286a21b62820b52820b6286a21b72820b62820b7286a21b82820b72820b828" + "6a21b92820b82820b9286a21ba2820b92820ba286a21bb2820ba2820bb286a21bc2820bb2820bc286a21bd2820bc28" + "20bd286a21be2820bd2820be286a21bf2820be2820bf286a21c02820bf2820c0286a21c12820c02820c1286a21c228" + "20c12820c2286a21c32820c22820c3286a21c42820c32820c4286a21c52820c42820c5286a21c62820c52820c6286a" + "21c72820c62820c7286a21c82820c72820c8286a21c92820c82820c9286a21ca2820c92820ca286a21cb2820ca2820" + "cb286a21cc2820cb2820cc286a21cd2820cc2820cd286a21ce2820cd2820ce286a21cf2820ce2820cf286a21d02820" + "cf2820d0286a21d12820d02820d1286a21d22820d12820d2286a21d32820d22820d3286a21d42820d32820d4286a21" + "d52820d42820d5286a21d62820d52820d6286a21d72820d62820d7286a21d82820d72820d8286a21d92820d82820d9" + "286a21da2820d92820da286a21db2820da2820db286a21dc2820db2820dc286a21dd2820dc2820dd286a21de2820dd" + "2820de286a21df2820de2820df286a21e02820df2820e0286a21e12820e02820e1286a21e22820e12820e2286a21e3" + "2820e22820e3286a21e42820e32820e4286a21e52820e42820e5286a21e62820e52820e6286a21e72820e62820e728" + "6a21e82820e72820e8286a21e92820e82820e9286a21ea2820e92820ea286a21eb2820ea2820eb286a21ec2820eb28" + "20ec286a21ed2820ec2820ed286a21ee2820ed2820ee286a21ef2820ee2820ef286a21f02820ef2820f0286a21f128" + "20f02820f1286a21f22820f12820f2286a21f32820f22820f3286a21f42820f32820f4286a21f52820f42820f5286a" + "21f62820f52820f6286a21f72820f62820f7286a21f82820f72820f8286a21f92820f82820f9286a21fa2820f92820" + "fa286a21fb2820fa2820fb286a21fc2820fb2820fc286a21fd2820fc2820fd286a21fe2820fd2820fe286a21ff2820" + "fe2820ff286a21802920ff282080296a2181292080292081296a2182292081292082296a2183292082292083296a21" + "84292083292084296a2185292084292085296a2186292085292086296a2187292086292087296a2188292087292088" + "296a2189292088292089296a218a29208929208a296a218b29208a29208b296a218c29208b29208c296a218d29208c" + "29208d296a218e29208d29208e296a218f29208e29208f296a219029208f292090296a2191292090292091296a2192" + "292091292092296a2193292092292093296a2194292093292094296a2195292094292095296a219629209529209629" + "6a2197292096292097296a2198292097292098296a2199292098292099296a219a29209929209a296a219b29209a29" + "209b296a219c29209b29209c296a219d29209c29209d296a219e29209d29209e296a219f29209e29209f296a21a029" + "209f2920a0296a21a12920a02920a1296a21a22920a12920a2296a21a32920a22920a3296a21a42920a32920a4296a" + "21a52920a42920a5296a21a62920a52920a6296a21a72920a62920a7296a21a82920a72920a8296a21a92920a82920" + "a9296a21aa2920a92920aa296a21ab2920aa2920ab296a21ac2920ab2920ac296a21ad2920ac2920ad296a21ae2920" + "ad2920ae296a21af2920ae2920af296a21b02920af2920b0296a21b12920b02920b1296a21b22920b12920b2296a21" + "b32920b22920b3296a21b42920b32920b4296a21b52920b42920b5296a21b62920b52920b6296a21b72920b62920b7" + "296a21b82920b72920b8296a21b92920b82920b9296a21ba2920b92920ba296a21bb2920ba2920bb296a21bc2920bb" + "2920bc296a21bd2920bc2920bd296a21be2920bd2920be296a21bf2920be2920bf296a21c02920bf2920c0296a21c1" + "2920c02920c1296a21c22920c12920c2296a21c32920c22920c3296a21c42920c32920c4296a21c52920c42920c529" + "6a21c62920c52920c6296a21c72920c62920c7296a21c82920c72920c8296a21c92920c82920c9296a21ca2920c929" + "20ca296a21cb2920ca2920cb296a21cc2920cb2920cc296a21cd2920cc2920cd296a21ce2920cd2920ce296a21cf29" + "20ce2920cf296a21d02920cf2920d0296a21d12920d02920d1296a21d22920d12920d2296a21d32920d22920d3296a" + "21d42920d32920d4296a21d52920d42920d5296a21d62920d52920d6296a21d72920d62920d7296a21d82920d72920" + "d8296a21d92920d82920d9296a21da2920d92920da296a21db2920da2920db296a21dc2920db2920dc296a21dd2920" + "dc2920dd296a21de2920dd2920de296a21df2920de2920df296a21e02920df2920e0296a21e12920e02920e1296a21" + "e22920e12920e2296a21e32920e22920e3296a21e42920e32920e4296a21e52920e42920e5296a21e62920e52920e6" + "296a21e72920e62920e7296a21e82920e72920e8296a21e92920e82920e9296a21ea2920e92920ea296a21eb2920ea" + "2920eb296a21ec2920eb2920ec296a21ed2920ec2920ed296a21ee2920ed2920ee296a21ef2920ee2920ef296a21f0" + "2920ef2920f0296a21f12920f02920f1296a21f22920f12920f2296a21f32920f22920f3296a21f42920f32920f429" + "6a21f52920f42920f5296a21f62920f52920f6296a21f72920f62920f7296a21f82920f72920f8296a21f92920f829" + "20f9296a21fa2920f92920fa296a21fb2920fa2920fb296a21fc2920fb2920fc296a21fd2920fc2920fd296a21fe29" + "20fd2920fe296a21ff2920fe2920ff296a21802a20ff2920802a6a21812a20802a20812a6a21822a20812a20822a6a" + "21832a20822a20832a6a21842a20832a20842a6a21852a20842a20852a6a21862a20852a20862a6a21872a20862a20" + "872a6a21882a20872a20882a6a21892a20882a20892a6a218a2a20892a208a2a6a218b2a208a2a208b2a6a218c2a20" + "8b2a208c2a6a218d2a208c2a208d2a6a218e2a208d2a208e2a6a218f2a208e2a208f2a6a21902a208f2a20902a6a21" + "912a20902a20912a6a21922a20912a20922a6a21932a20922a20932a6a21942a20932a20942a6a21952a20942a2095" + "2a6a21962a20952a20962a6a21972a20962a20972a6a21982a20972a20982a6a21992a20982a20992a6a219a2a2099" + "2a209a2a6a219b2a209a2a209b2a6a219c2a209b2a209c2a6a219d2a209c2a209d2a6a219e2a209d2a209e2a6a219f" + "2a209e2a209f2a6a21a02a209f2a20a02a6a21a12a20a02a20a12a6a21a22a20a12a20a22a6a21a32a20a22a20a32a" + "6a21a42a20a32a20a42a6a21a52a20a42a20a52a6a21a62a20a52a20a62a6a21a72a20a62a20a72a6a21a82a20a72a" + "20a82a6a21a92a20a82a20a92a6a21aa2a20a92a20aa2a6a21ab2a20aa2a20ab2a6a21ac2a20ab2a20ac2a6a21ad2a" + "20ac2a20ad2a6a21ae2a20ad2a20ae2a6a21af2a20ae2a20af2a6a21b02a20af2a20b02a6a21b12a20b02a20b12a6a" + "21b22a20b12a20b22a6a21b32a20b22a20b32a6a21b42a20b32a20b42a6a21b52a20b42a20b52a6a21b62a20b52a20" + "b62a6a21b72a20b62a20b72a6a21b82a20b72a20b82a6a21b92a20b82a20b92a6a21ba2a20b92a20ba2a6a21bb2a20" + "ba2a20bb2a6a21bc2a20bb2a20bc2a6a21bd2a20bc2a20bd2a6a21be2a20bd2a20be2a6a21bf2a20be2a20bf2a6a21" + "c02a20bf2a20c02a6a21c12a20c02a20c12a6a21c22a20c12a20c22a6a21c32a20c22a20c32a6a21c42a20c32a20c4" + "2a6a21c52a20c42a20c52a6a21c62a20c52a20c62a6a21c72a20c62a20c72a6a21c82a20c72a20c82a6a21c92a20c8" + "2a20c92a6a21ca2a20c92a20ca2a6a21cb2a20ca2a20cb2a6a21cc2a20cb2a20cc2a6a21cd2a20cc2a20cd2a6a21ce" + "2a20cd2a20ce2a6a21cf2a20ce2a20cf2a6a21d02a20cf2a20d02a6a21d12a20d02a20d12a6a21d22a20d12a20d22a" + "6a21d32a20d22a20d32a6a21d42a20d32a20d42a6a21d52a20d42a20d52a6a21d62a20d52a20d62a6a21d72a20d62a" + "20d72a6a21d82a20d72a20d82a6a21d92a20d82a20d92a6a21da2a20d92a20da2a6a21db2a20da2a20db2a6a21dc2a" + "20db2a20dc2a6a21dd2a20dc2a20dd2a6a21de2a20dd2a20de2a6a21df2a20de2a20df2a6a21e02a20df2a20e02a6a" + "21e12a20e02a20e12a6a21e22a20e12a20e22a6a21e32a20e22a20e32a6a21e42a20e32a20e42a6a21e52a20e42a20" + "e52a6a21e62a20e52a20e62a6a21e72a20e62a20e72a6a21e82a20e72a20e82a6a21e92a20e82a20e92a6a21ea2a20" + "e92a20ea2a6a21eb2a20ea2a20eb2a6a21ec2a20eb2a20ec2a6a21ed2a20ec2a20ed2a6a21ee2a20ed2a20ee2a6a21" + "ef2a20ee2a20ef2a6a21f02a20ef2a20f02a6a21f12a20f02a20f12a6a21f22a20f12a20f22a6a21f32a20f22a20f3" + "2a6a21f42a20f32a20f42a6a21f52a20f42a20f52a6a21f62a20f52a20f62a6a21f72a20f62a20f72a6a21f82a20f7" + "2a20f82a6a21f92a20f82a20f92a6a21fa2a20f92a20fa2a6a21fb2a20fa2a20fb2a6a21fc2a20fb2a20fc2a6a21fd" + "2a20fc2a20fd2a6a21fe2a20fd2a20fe2a6a21ff2a20fe2a20ff2a6a21802b20ff2a20802b6a21812b20802b20812b" + "6a21822b20812b20822b6a21832b20822b20832b6a21842b20832b20842b6a21852b20842b20852b6a21862b20852b" + "20862b6a21872b20862b20872b6a21882b20872b20882b6a21892b20882b20892b6a218a2b20892b208a2b6a218b2b" + "208a2b208b2b6a218c2b208b2b208c2b6a218d2b208c2b208d2b6a218e2b208d2b208e2b6a218f2b208e2b208f2b6a" + "21902b208f2b20902b6a21912b20902b20912b6a21922b20912b20922b6a21932b20922b20932b6a21942b20932b20" + "942b6a21952b20942b20952b6a21962b20952b20962b6a21972b20962b20972b6a21982b20972b20982b6a21992b20" + "982b20992b6a219a2b20992b209a2b6a219b2b209a2b209b2b6a219c2b209b2b209c2b6a219d2b209c2b209d2b6a21" + "9e2b209d2b209e2b6a219f2b209e2b209f2b6a21a02b209f2b20a02b6a21a12b20a02b20a12b6a21a22b20a12b20a2" + "2b6a21a32b20a22b20a32b6a21a42b20a32b20a42b6a21a52b20a42b20a52b6a21a62b20a52b20a62b6a21a72b20a6" + "2b20a72b6a21a82b20a72b20a82b6a21a92b20a82b20a92b6a21aa2b20a92b20aa2b6a21ab2b20aa2b20ab2b6a21ac" + "2b20ab2b20ac2b6a21ad2b20ac2b20ad2b6a21ae2b20ad2b20ae2b6a21af2b20ae2b20af2b6a21b02b20af2b20b02b" + "6a21b12b20b02b20b12b6a21b22b20b12b20b22b6a21b32b20b22b20b32b6a21b42b20b32b20b42b6a21b52b20b42b" + "20b52b6a21b62b20b52b20b62b6a21b72b20b62b20b72b6a21b82b20b72b20b82b6a21b92b20b82b20b92b6a21ba2b" + "20b92b20ba2b6a21bb2b20ba2b20bb2b6a21bc2b20bb2b20bc2b6a21bd2b20bc2b20bd2b6a21be2b20bd2b20be2b6a" + "21bf2b20be2b20bf2b6a21c02b20bf2b20c02b6a21c12b20c02b20c12b6a21c22b20c12b20c22b6a21c32b20c22b20" + "c32b6a21c42b20c32b20c42b6a21c52b20c42b20c52b6a21c62b20c52b20c62b6a21c72b20c62b20c72b6a21c82b20" + "c72b20c82b6a21c92b20c82b20c92b6a21ca2b20c92b20ca2b6a21cb2b20ca2b20cb2b6a21cc2b20cb2b20cc2b6a21" + "cd2b20cc2b20cd2b6a21ce2b20cd2b20ce2b6a21cf2b20ce2b20cf2b6a21d02b20cf2b20d02b6a21d12b20d02b20d1" + "2b6a21d22b20d12b20d22b6a21d32b20d22b20d32b6a21d42b20d32b20d42b6a21d52b20d42b20d52b6a21d62b20d5" + "2b20d62b6a21d72b20d62b20d72b6a21d82b20d72b20d82b6a21d92b20d82b20d92b6a21da2b20d92b20da2b6a21db" + "2b20da2b20db2b6a21dc2b20db2b20dc2b6a21dd2b20dc2b20dd2b6a21de2b20dd2b20de2b6a21df2b20de2b20df2b" + "6a21e02b20df2b20e02b6a21e12b20e02b20e12b6a21e22b20e12b20e22b6a21e32b20e22b20e32b6a21e42b20e32b" + "20e42b6a21e52b20e42b20e52b6a21e62b20e52b20e62b6a21e72b20e62b20e72b6a21e82b20e72b20e82b6a21e92b" + "20e82b20e92b6a21ea2b20e92b20ea2b6a21eb2b20ea2b20eb2b6a21ec2b20eb2b20ec2b6a21ed2b20ec2b20ed2b6a" + "21ee2b20ed2b20ee2b6a21ef2b20ee2b20ef2b6a21f02b20ef2b20f02b6a21f12b20f02b20f12b6a21f22b20f12b20" + "f22b6a21f32b20f22b20f32b6a21f42b20f32b20f42b6a21f52b20f42b20f52b6a21f62b20f52b20f62b6a21f72b20" + "f62b20f72b6a21f82b20f72b20f82b6a21f92b20f82b20f92b6a21fa2b20f92b20fa2b6a21fb2b20fa2b20fb2b6a21" + "fc2b20fb2b20fc2b6a21fd2b20fc2b20fd2b6a21fe2b20fd2b20fe2b6a21ff2b20fe2b20ff2b6a21802c20ff2b2080" + "2c6a21812c20802c20812c6a21822c20812c20822c6a21832c20822c20832c6a21842c20832c20842c6a21852c2084" + "2c20852c6a21862c20852c20862c6a21872c20862c20872c6a21882c20872c20882c6a21892c20882c20892c6a218a" + "2c20892c208a2c6a218b2c208a2c208b2c6a218c2c208b2c208c2c6a218d2c208c2c208d2c6a218e2c208d2c208e2c" + "6a218f2c208e2c208f2c6a21902c208f2c20902c6a21912c20902c20912c6a21922c20912c20922c6a21932c20922c" + "20932c6a21942c20932c20942c6a21952c20942c20952c6a21962c20952c20962c6a21972c20962c20972c6a21982c" + "20972c20982c6a21992c20982c20992c6a219a2c20992c209a2c6a219b2c209a2c209b2c6a219c2c209b2c209c2c6a" + "219d2c209c2c209d2c6a219e2c209d2c209e2c6a219f2c209e2c209f2c6a21a02c209f2c20a02c6a21a12c20a02c20" + "a12c6a21a22c20a12c20a22c6a21a32c20a22c20a32c6a21a42c20a32c20a42c6a21a52c20a42c20a52c6a21a62c20" + "a52c20a62c6a21a72c20a62c20a72c6a21a82c20a72c20a82c6a21a92c20a82c20a92c6a21aa2c20a92c20aa2c6a21" + "ab2c20aa2c20ab2c6a21ac2c20ab2c20ac2c6a21ad2c20ac2c20ad2c6a21ae2c20ad2c20ae2c6a21af2c20ae2c20af" + "2c6a21b02c20af2c20b02c6a21b12c20b02c20b12c6a21b22c20b12c20b22c6a21b32c20b22c20b32c6a21b42c20b3" + "2c20b42c6a21b52c20b42c20b52c6a21b62c20b52c20b62c6a21b72c20b62c20b72c6a21b82c20b72c20b82c6a21b9" + "2c20b82c20b92c6a21ba2c20b92c20ba2c6a21bb2c20ba2c20bb2c6a21bc2c20bb2c20bc2c6a21bd2c20bc2c20bd2c" + "6a21be2c20bd2c20be2c6a21bf2c20be2c20bf2c6a21c02c20bf2c20c02c6a21c12c20c02c20c12c6a21c22c20c12c" + "20c22c6a21c32c20c22c20c32c6a21c42c20c32c20c42c6a21c52c20c42c20c52c6a21c62c20c52c20c62c6a21c72c" + "20c62c20c72c6a21c82c20c72c20c82c6a21c92c20c82c20c92c6a21ca2c20c92c20ca2c6a21cb2c20ca2c20cb2c6a" + "21cc2c20cb2c20cc2c6a21cd2c20cc2c20cd2c6a21ce2c20cd2c20ce2c6a21cf2c20ce2c20cf2c6a21d02c20cf2c20" + "d02c6a21d12c20d02c20d12c6a21d22c20d12c20d22c6a21d32c20d22c20d32c6a21d42c20d32c20d42c6a21d52c20" + "d42c20d52c6a21d62c20d52c20d62c6a21d72c20d62c20d72c6a21d82c20d72c20d82c6a21d92c20d82c20d92c6a21" + "da2c20d92c20da2c6a21db2c20da2c20db2c6a21dc2c20db2c20dc2c6a21dd2c20dc2c20dd2c6a21de2c20dd2c20de" + "2c6a21df2c20de2c20df2c6a21e02c20df2c20e02c6a21e12c20e02c20e12c6a21e22c20e12c20e22c6a21e32c20e2" + "2c20e32c6a21e42c20e32c20e42c6a21e52c20e42c20e52c6a21e62c20e52c20e62c6a21e72c20e62c20e72c6a21e8" + "2c20e72c20e82c6a21e92c20e82c20e92c6a21ea2c20e92c20ea2c6a21eb2c20ea2c20eb2c6a21ec2c20eb2c20ec2c" + "6a21ed2c20ec2c20ed2c6a21ee2c20ed2c20ee2c6a21ef2c20ee2c20ef2c6a21f02c20ef2c20f02c6a21f12c20f02c" + "20f12c6a21f22c20f12c20f22c6a21f32c20f22c20f32c6a21f42c20f32c20f42c6a21f52c20f42c20f52c6a21f62c" + "20f52c20f62c6a21f72c20f62c20f72c6a21f82c20f72c20f82c6a21f92c20f82c20f92c6a21fa2c20f92c20fa2c6a" + "21fb2c20fa2c20fb2c6a21fc2c20fb2c20fc2c6a21fd2c20fc2c20fd2c6a21fe2c20fd2c20fe2c6a21ff2c20fe2c20" + "ff2c6a21802d20ff2c20802d6a21812d20802d20812d6a21822d20812d20822d6a21832d20822d20832d6a21842d20" + "832d20842d6a21852d20842d20852d6a21862d20852d20862d6a21872d20862d20872d6a21882d20872d20882d6a21" + "892d20882d20892d6a218a2d20892d208a2d6a218b2d208a2d208b2d6a218c2d208b2d208c2d6a218d2d208c2d208d" + "2d6a218e2d208d2d208e2d6a218f2d208e2d208f2d6a21902d208f2d20902d6a21912d20902d20912d6a21922d2091" + "2d20922d6a21932d20922d20932d6a21942d20932d20942d6a21952d20942d20952d6a21962d20952d20962d6a2197" + "2d20962d20972d6a21982d20972d20982d6a21992d20982d20992d6a219a2d20992d209a2d6a219b2d209a2d209b2d" + "6a219c2d209b2d209c2d6a219d2d209c2d209d2d6a219e2d209d2d209e2d6a219f2d209e2d209f2d6a21a02d209f2d" + "20a02d6a21a12d20a02d20a12d6a21a22d20a12d20a22d6a21a32d20a22d20a32d6a21a42d20a32d20a42d6a21a52d" + "20a42d20a52d6a21a62d20a52d20a62d6a21a72d20a62d20a72d6a21a82d20a72d20a82d6a21a92d20a82d20a92d6a" + "21aa2d20a92d20aa2d6a21ab2d20aa2d20ab2d6a21ac2d20ab2d20ac2d6a21ad2d20ac2d20ad2d6a21ae2d20ad2d20" + "ae2d6a21af2d20ae2d20af2d6a21b02d20af2d20b02d6a21b12d20b02d20b12d6a21b22d20b12d20b22d6a21b32d20" + "b22d20b32d6a21b42d20b32d20b42d6a21b52d20b42d20b52d6a21b62d20b52d20b62d6a21b72d20b62d20b72d6a21" + "b82d20b72d20b82d6a21b92d20b82d20b92d6a21ba2d20b92d20ba2d6a21bb2d20ba2d20bb2d6a21bc2d20bb2d20bc" + "2d6a21bd2d20bc2d20bd2d6a21be2d20bd2d20be2d6a21bf2d20be2d20bf2d6a21c02d20bf2d20c02d6a21c12d20c0" + "2d20c12d6a21c22d20c12d20c22d6a21c32d20c22d20c32d6a21c42d20c32d20c42d6a21c52d20c42d20c52d6a21c6" + "2d20c52d20c62d6a21c72d20c62d20c72d6a21c82d20c72d20c82d6a21c92d20c82d20c92d6a21ca2d20c92d20ca2d" + "6a21cb2d20ca2d20cb2d6a21cc2d20cb2d20cc2d6a21cd2d20cc2d20cd2d6a21ce2d20cd2d20ce2d6a21cf2d20ce2d" + "20cf2d6a21d02d20cf2d20d02d6a21d12d20d02d20d12d6a21d22d20d12d20d22d6a21d32d20d22d20d32d6a21d42d" + "20d32d20d42d6a21d52d20d42d20d52d6a21d62d20d52d20d62d6a21d72d20d62d20d72d6a21d82d20d72d20d82d6a" + "21d92d20d82d20d92d6a21da2d20d92d20da2d6a21db2d20da2d20db2d6a21dc2d20db2d20dc2d6a21dd2d20dc2d20" + "dd2d6a21de2d20dd2d20de2d6a21df2d20de2d20df2d6a21e02d20df2d20e02d6a21e12d20e02d20e12d6a21e22d20" + "e12d20e22d6a21e32d20e22d20e32d6a21e42d20e32d20e42d6a21e52d20e42d20e52d6a21e62d20e52d20e62d6a21" + "e72d20e62d20e72d6a21e82d20e72d20e82d6a21e92d20e82d20e92d6a21ea2d20e92d20ea2d6a21eb2d20ea2d20eb" + "2d6a21ec2d20eb2d20ec2d6a21ed2d20ec2d20ed2d6a21ee2d20ed2d20ee2d6a21ef2d20ee2d20ef2d6a21f02d20ef" + "2d20f02d6a21f12d20f02d20f12d6a21f22d20f12d20f22d6a21f32d20f22d20f32d6a21f42d20f32d20f42d6a21f5" + "2d20f42d20f52d6a21f62d20f52d20f62d6a21f72d20f62d20f72d6a21f82d20f72d20f82d6a21f92d20f82d20f92d" + "6a21fa2d20f92d20fa2d6a21fb2d20fa2d20fb2d6a21fc2d20fb2d20fc2d6a21fd2d20fc2d20fd2d6a21fe2d20fd2d" + "20fe2d6a21ff2d20fe2d20ff2d6a21802e20ff2d20802e6a21812e20802e20812e6a21822e20812e20822e6a21832e" + "20822e20832e6a21842e20832e20842e6a21852e20842e20852e6a21862e20852e20862e6a21872e20862e20872e6a" + "21882e20872e20882e6a21892e20882e20892e6a218a2e20892e208a2e6a218b2e208a2e208b2e6a218c2e208b2e20" + "8c2e6a218d2e208c2e208d2e6a218e2e208d2e208e2e6a218f2e208e2e208f2e6a21902e208f2e20902e6a21912e20" + "902e20912e6a21922e20912e20922e6a21932e20922e20932e6a21942e20932e20942e6a21952e20942e20952e6a21" + "962e20952e20962e6a21972e20962e20972e6a21982e20972e20982e6a21992e20982e20992e6a219a2e20992e209a" + "2e6a219b2e209a2e209b2e6a219c2e209b2e209c2e6a219d2e209c2e209d2e6a219e2e209d2e209e2e6a219f2e209e" + "2e209f2e6a21a02e209f2e20a02e6a21a12e20a02e20a12e6a21a22e20a12e20a22e6a21a32e20a22e20a32e6a21a4" + "2e20a32e20a42e6a21a52e20a42e20a52e6a21a62e20a52e20a62e6a21a72e20a62e20a72e6a21a82e20a72e20a82e" + "6a21a92e20a82e20a92e6a21aa2e20a92e20aa2e6a21ab2e20aa2e20ab2e6a21ac2e20ab2e20ac2e6a21ad2e20ac2e" + "20ad2e6a21ae2e20ad2e20ae2e6a21af2e20ae2e20af2e6a21b02e20af2e20b02e6a21b12e20b02e20b12e6a21b22e" + "20b12e20b22e6a21b32e20b22e20b32e6a21b42e20b32e20b42e6a21b52e20b42e20b52e6a21b62e20b52e20b62e6a" + "21b72e20b62e20b72e6a21b82e20b72e20b82e6a21b92e20b82e20b92e6a21ba2e20b92e20ba2e6a21bb2e20ba2e20" + "bb2e6a21bc2e20bb2e20bc2e6a21bd2e20bc2e20bd2e6a21be2e20bd2e20be2e6a21bf2e20be2e20bf2e6a21c02e20" + "bf2e20c02e6a21c12e20c02e20c12e6a21c22e20c12e20c22e6a21c32e20c22e20c32e6a21c42e20c32e20c42e6a21" + "c52e20c42e20c52e6a21c62e20c52e20c62e6a21c72e20c62e20c72e6a21c82e20c72e20c82e6a21c92e20c82e20c9" + "2e6a21ca2e20c92e20ca2e6a21cb2e20ca2e20cb2e6a21cc2e20cb2e20cc2e6a21cd2e20cc2e20cd2e6a21ce2e20cd" + "2e20ce2e6a21cf2e20ce2e20cf2e6a21d02e20cf2e20d02e6a21d12e20d02e20d12e6a21d22e20d12e20d22e6a21d3" + "2e20d22e20d32e6a21d42e20d32e20d42e6a21d52e20d42e20d52e6a21d62e20d52e20d62e6a21d72e20d62e20d72e" + "6a21d82e20d72e20d82e6a21d92e20d82e20d92e6a21da2e20d92e20da2e6a21db2e20da2e20db2e6a21dc2e20db2e" + "20dc2e6a21dd2e20dc2e20dd2e6a21de2e20dd2e20de2e6a21df2e20de2e20df2e6a21e02e20df2e20e02e6a21e12e" + "20e02e20e12e6a21e22e20e12e20e22e6a21e32e20e22e20e32e6a21e42e20e32e20e42e6a21e52e20e42e20e52e6a" + "21e62e20e52e20e62e6a21e72e20e62e20e72e6a21e82e20e72e20e82e6a21e92e20e82e20e92e6a21ea2e20e92e20" + "ea2e6a21eb2e20ea2e20eb2e6a21ec2e20eb2e20ec2e6a21ed2e20ec2e20ed2e6a21ee2e20ed2e20ee2e6a21ef2e20" + "ee2e20ef2e6a21f02e20ef2e20f02e6a21f12e20f02e20f12e6a21f22e20f12e20f22e6a21f32e20f22e20f32e6a21" + "f42e20f32e20f42e6a21f52e20f42e20f52e6a21f62e20f52e20f62e6a21f72e20f62e20f72e6a21f82e20f72e20f8" + "2e6a21f92e20f82e20f92e6a21fa2e20f92e20fa2e6a21fb2e20fa2e20fb2e6a21fc2e20fb2e20fc2e6a21fd2e20fc" + "2e20fd2e6a21fe2e20fd2e20fe2e6a21ff2e20fe2e20ff2e6a21802f20ff2e20802f6a21812f20802f20812f6a2182" + "2f20812f20822f6a21832f20822f20832f6a21842f20832f20842f6a21852f20842f20852f6a21862f20852f20862f" + "6a21872f20862f20872f6a21882f20872f20882f6a21892f20882f20892f6a218a2f20892f208a2f6a218b2f208a2f" + "208b2f6a218c2f208b2f208c2f6a218d2f208c2f208d2f6a218e2f208d2f208e2f6a218f2f208e2f208f2f6a21902f" + "208f2f20902f6a21912f20902f20912f6a21922f20912f20922f6a21932f20922f20932f6a21942f20932f20942f6a" + "21952f20942f20952f6a21962f20952f20962f6a21972f20962f20972f6a21982f20972f20982f6a21992f20982f20" + "992f6a219a2f20992f209a2f6a219b2f209a2f209b2f6a219c2f209b2f209c2f6a219d2f209c2f209d2f6a219e2f20" + "9d2f209e2f6a219f2f209e2f209f2f6a21a02f209f2f20a02f6a21a12f20a02f20a12f6a21a22f20a12f20a22f6a21" + "a32f20a22f20a32f6a21a42f20a32f20a42f6a21a52f20a42f20a52f6a21a62f20a52f20a62f6a21a72f20a62f20a7" + "2f6a21a82f20a72f20a82f6a21a92f20a82f20a92f6a21aa2f20a92f20aa2f6a21ab2f20aa2f20ab2f6a21ac2f20ab" + "2f20ac2f6a21ad2f20ac2f20ad2f6a21ae2f20ad2f20ae2f6a21af2f20ae2f20af2f6a21b02f20af2f20b02f6a21b1" + "2f20b02f20b12f6a21b22f20b12f20b22f6a21b32f20b22f20b32f6a21b42f20b32f20b42f6a21b52f20b42f20b52f" + "6a21b62f20b52f20b62f6a21b72f20b62f20b72f6a21b82f20b72f20b82f6a21b92f20b82f20b92f6a21ba2f20b92f" + "20ba2f6a21bb2f20ba2f20bb2f6a21bc2f20bb2f20bc2f6a21bd2f20bc2f20bd2f6a21be2f20bd2f20be2f6a21bf2f" + "20be2f20bf2f6a21c02f20bf2f20c02f6a21c12f20c02f20c12f6a21c22f20c12f20c22f6a21c32f20c22f20c32f6a" + "21c42f20c32f20c42f6a21c52f20c42f20c52f6a21c62f20c52f20c62f6a21c72f20c62f20c72f6a21c82f20c72f20" + "c82f6a21c92f20c82f20c92f6a21ca2f20c92f20ca2f6a21cb2f20ca2f20cb2f6a21cc2f20cb2f20cc2f6a21cd2f20" + "cc2f20cd2f6a21ce2f20cd2f20ce2f6a21cf2f20ce2f20cf2f6a21d02f20cf2f20d02f6a21d12f20d02f20d12f6a21" + "d22f20d12f20d22f6a21d32f20d22f20d32f6a21d42f20d32f20d42f6a21d52f20d42f20d52f6a21d62f20d52f20d6" + "2f6a21d72f20d62f20d72f6a21d82f20d72f20d82f6a21d92f20d82f20d92f6a21da2f20d92f20da2f6a21db2f20da" + "2f20db2f6a21dc2f20db2f20dc2f6a21dd2f20dc2f20dd2f6a21de2f20dd2f20de2f6a21df2f20de2f20df2f6a21e0" + "2f20df2f20e02f6a21e12f20e02f20e12f6a21e22f20e12f20e22f6a21e32f20e22f20e32f6a21e42f20e32f20e42f" + "6a21e52f20e42f20e52f6a21e62f20e52f20e62f6a21e72f20e62f20e72f6a21e82f20e72f20e82f6a21e92f20e82f" + "20e92f6a21ea2f20e92f20ea2f6a21eb2f20ea2f20eb2f6a21ec2f20eb2f20ec2f6a21ed2f20ec2f20ed2f6a21ee2f" + "20ed2f20ee2f6a21ef2f20ee2f20ef2f6a21f02f20ef2f20f02f6a21f12f20f02f20f12f6a21f22f20f12f20f22f6a" + "21f32f20f22f20f32f6a21f42f20f32f20f42f6a21f52f20f42f20f52f6a21f62f20f52f20f62f6a21f72f20f62f20" + "f72f6a21f82f20f72f20f82f6a21f92f20f82f20f92f6a21fa2f20f92f20fa2f6a21fb2f20fa2f20fb2f6a21fc2f20" + "fb2f20fc2f6a21fd2f20fc2f20fd2f6a21fe2f20fd2f20fe2f6a21ff2f20fe2f20ff2f6a21803020ff2f2080306a21" + "81302080302081306a2182302081302082306a2183302082302083306a2184302083302084306a2185302084302085" + "306a2186302085302086306a2187302086302087306a2188302087302088306a2189302088302089306a218a302089" + "30208a306a218b30208a30208b306a218c30208b30208c306a218d30208c30208d306a218e30208d30208e306a218f" + "30208e30208f306a219030208f302090306a2191302090302091306a2192302091302092306a219330209230209330" + "6a2194302093302094306a2195302094302095306a2196302095302096306a2197302096302097306a219830209730" + "2098306a2199302098302099306a219a30209930209a306a219b30209a30209b306a219c30209b30209c306a219d30" + "209c30209d306a219e30209d30209e306a219f30209e30209f306a21a030209f3020a0306a21a13020a03020a1306a" + "21a23020a13020a2306a21a33020a23020a3306a21a43020a33020a4306a21a53020a43020a5306a21a63020a53020" + "a6306a21a73020a63020a7306a21a83020a73020a8306a21a93020a83020a9306a21aa3020a93020aa306a21ab3020" + "aa3020ab306a21ac3020ab3020ac306a21ad3020ac3020ad306a21ae3020ad3020ae306a21af3020ae3020af306a21" + "b03020af3020b0306a21b13020b03020b1306a21b23020b13020b2306a21b33020b23020b3306a21b43020b33020b4" + "306a21b53020b43020b5306a21b63020b53020b6306a21b73020b63020b7306a21b83020b73020b8306a21b93020b8" + "3020b9306a21ba3020b93020ba306a21bb3020ba3020bb306a21bc3020bb3020bc306a21bd3020bc3020bd306a21be" + "3020bd3020be306a21bf3020be3020bf306a21c03020bf3020c0306a21c13020c03020c1306a21c23020c13020c230" + "6a21c33020c23020c3306a21c43020c33020c4306a21c53020c43020c5306a21c63020c53020c6306a21c73020c630" + "20c7306a21c83020c73020c8306a21c93020c83020c9306a21ca3020c93020ca306a21cb3020ca3020cb306a21cc30" + "20cb3020cc306a21cd3020cc3020cd306a21ce3020cd3020ce306a21cf3020ce3020cf306a21d03020cf3020d0306a" + "21d13020d03020d1306a21d23020d13020d2306a21d33020d23020d3306a21d43020d33020d4306a21d53020d43020" + "d5306a21d63020d53020d6306a21d73020d63020d7306a21d83020d73020d8306a21d93020d83020d9306a21da3020" + "d93020da306a21db3020da3020db306a21dc3020db3020dc306a21dd3020dc3020dd306a21de3020dd3020de306a21" + "df3020de3020df306a21e03020df3020e0306a21e13020e03020e1306a21e23020e13020e2306a21e33020e23020e3" + "306a21e43020e33020e4306a21e53020e43020e5306a21e63020e53020e6306a21e73020e63020e7306a21e83020e7" + "3020e8306a21e93020e83020e9306a21ea3020e93020ea306a21eb3020ea3020eb306a21ec3020eb3020ec306a21ed" + "3020ec3020ed306a21ee3020ed3020ee306a21ef3020ee3020ef306a21f03020ef3020f0306a21f13020f03020f130" + "6a21f23020f13020f2306a21f33020f23020f3306a21f43020f33020f4306a21f53020f43020f5306a21f63020f530" + "20f6306a21f73020f63020f7306a21f83020f73020f8306a21f93020f83020f9306a21fa3020f93020fa306a21fb30" + "20fa3020fb306a21fc3020fb3020fc306a21fd3020fc3020fd306a21fe3020fd3020fe306a21ff3020fe3020ff306a" + "21803120ff302080316a2181312080312081316a2182312081312082316a2183312082312083316a21843120833120" + "84316a2185312084312085316a2186312085312086316a2187312086312087316a2188312087312088316a21893120" + "88312089316a218a31208931208a316a218b31208a31208b316a218c31208b31208c316a218d31208c31208d316a21" + "8e31208d31208e316a218f31208e31208f316a219031208f312090316a2191312090312091316a2192312091312092" + "316a2193312092312093316a2194312093312094316a2195312094312095316a2196312095312096316a2197312096" + "312097316a2198312097312098316a2199312098312099316a219a31209931209a316a219b31209a31209b316a219c" + "31209b31209c316a219d31209c31209d316a219e31209d31209e316a219f31209e31209f316a21a031209f3120a031" + "6a21a13120a03120a1316a21a23120a13120a2316a21a33120a23120a3316a21a43120a33120a4316a21a53120a431" + "20a5316a21a63120a53120a6316a21a73120a63120a7316a21a83120a73120a8316a21a93120a83120a9316a21aa31" + "20a93120aa316a21ab3120aa3120ab316a21ac3120ab3120ac316a21ad3120ac3120ad316a21ae3120ad3120ae316a" + "21af3120ae3120af316a21b03120af3120b0316a21b13120b03120b1316a21b23120b13120b2316a21b33120b23120" + "b3316a21b43120b33120b4316a21b53120b43120b5316a21b63120b53120b6316a21b73120b63120b7316a21b83120" + "b73120b8316a21b93120b83120b9316a21ba3120b93120ba316a21bb3120ba3120bb316a21bc3120bb3120bc316a21" + "bd3120bc3120bd316a21be3120bd3120be316a21bf3120be3120bf316a21c03120bf3120c0316a21c13120c03120c1" + "316a21c23120c13120c2316a21c33120c23120c3316a21c43120c33120c4316a21c53120c43120c5316a21c63120c5" + "3120c6316a21c73120c63120c7316a21c83120c73120c8316a21c93120c83120c9316a21ca3120c93120ca316a21cb" + "3120ca3120cb316a21cc3120cb3120cc316a21cd3120cc3120cd316a21ce3120cd3120ce316a21cf3120ce3120cf31" + "6a21d03120cf3120d0316a21d13120d03120d1316a21d23120d13120d2316a21d33120d23120d3316a21d43120d331" + "20d4316a21d53120d43120d5316a21d63120d53120d6316a21d73120d63120d7316a21d83120d73120d8316a21d931" + "20d83120d9316a21da3120d93120da316a21db3120da3120db316a21dc3120db3120dc316a21dd3120dc3120dd316a" + "21de3120dd3120de316a21df3120de3120df316a21e03120df3120e0316a21e13120e03120e1316a21e23120e13120" + "e2316a21e33120e23120e3316a21e43120e33120e4316a21e53120e43120e5316a21e63120e53120e6316a21e73120" + "e63120e7316a21e83120e73120e8316a21e93120e83120e9316a21ea3120e93120ea316a21eb3120ea3120eb316a21" + "ec3120eb3120ec316a21ed3120ec3120ed316a21ee3120ed3120ee316a21ef3120ee3120ef316a21f03120ef3120f0" + "316a21f13120f03120f1316a21f23120f13120f2316a21f33120f23120f3316a21f43120f33120f4316a21f53120f4" + "3120f5316a21f63120f53120f6316a21f73120f63120f7316a21f83120f73120f8316a21f93120f83120f9316a21fa" + "3120f93120fa316a21fb3120fa3120fb316a21fc3120fb3120fc316a21fd3120fc3120fd316a21fe3120fd3120fe31" + "6a21ff3120fe3120ff316a21803220ff312080326a2181322080322081326a2182322081322082326a218332208232" + "2083326a2184322083322084326a2185322084322085326a2186322085322086326a2187322086322087326a218832" + "2087322088326a2189322088322089326a218a32208932208a326a218b32208a32208b326a218c32208b32208c326a" + "218d32208c32208d326a218e32208d32208e326a218f32208e32208f326a219032208f322090326a21913220903220" + "91326a2192322091322092326a2193322092322093326a2194322093322094326a2195322094322095326a21963220" + "95322096326a2197322096322097326a2198322097322098326a2199322098322099326a219a32209932209a326a21" + "9b32209a32209b326a219c32209b32209c326a219d32209c32209d326a219e32209d32209e326a219f32209e32209f" + "326a21a032209f3220a0326a21a13220a03220a1326a21a23220a13220a2326a21a33220a23220a3326a21a43220a3" + "3220a4326a21a53220a43220a5326a21a63220a53220a6326a21a73220a63220a7326a21a83220a73220a8326a21a9" + "3220a83220a9326a21aa3220a93220aa326a21ab3220aa3220ab326a21ac3220ab3220ac326a21ad3220ac3220ad32" + "6a21ae3220ad3220ae326a21af3220ae3220af326a21b03220af3220b0326a21b13220b03220b1326a21b23220b132" + "20b2326a21b33220b23220b3326a21b43220b33220b4326a21b53220b43220b5326a21b63220b53220b6326a21b732" + "20b63220b7326a21b83220b73220b8326a21b93220b83220b9326a21ba3220b93220ba326a21bb3220ba3220bb326a" + "21bc3220bb3220bc326a21bd3220bc3220bd326a21be3220bd3220be326a21bf3220be3220bf326a21c03220bf3220" + "c0326a21c13220c03220c1326a21c23220c13220c2326a21c33220c23220c3326a21c43220c33220c4326a21c53220" + "c43220c5326a21c63220c53220c6326a21c73220c63220c7326a21c83220c73220c8326a21c93220c83220c9326a21" + "ca3220c93220ca326a21cb3220ca3220cb326a21cc3220cb3220cc326a21cd3220cc3220cd326a21ce3220cd3220ce" + "326a21cf3220ce3220cf326a21d03220cf3220d0326a21d13220d03220d1326a21d23220d13220d2326a21d33220d2" + "3220d3326a21d43220d33220d4326a21d53220d43220d5326a21d63220d53220d6326a21d73220d63220d7326a21d8" + "3220d73220d8326a21d93220d83220d9326a21da3220d93220da326a21db3220da3220db326a21dc3220db3220dc32" + "6a21dd3220dc3220dd326a21de3220dd3220de326a21df3220de3220df326a21e03220df3220e0326a21e13220e032" + "20e1326a21e23220e13220e2326a21e33220e23220e3326a21e43220e33220e4326a21e53220e43220e5326a21e632" + "20e53220e6326a21e73220e63220e7326a21e83220e73220e8326a21e93220e83220e9326a21ea3220e93220ea326a" + "21eb3220ea3220eb326a21ec3220eb3220ec326a21ed3220ec3220ed326a21ee3220ed3220ee326a21ef3220ee3220" + "ef326a21f03220ef3220f0326a21f13220f03220f1326a21f23220f13220f2326a21f33220f23220f3326a21f43220" + "f33220f4326a21f53220f43220f5326a21f63220f53220f6326a21f73220f63220f7326a21f83220f73220f8326a21" + "f93220f83220f9326a21fa3220f93220fa326a21fb3220fa3220fb326a21fc3220fb3220fc326a21fd3220fc3220fd" + "326a21fe3220fd3220fe326a21ff3220fe3220ff326a21803320ff322080336a2181332080332081336a2182332081" + "332082336a2183332082332083336a2184332083332084336a2185332084332085336a2186332085332086336a2187" + "332086332087336a2188332087332088336a2189332088332089336a218a33208933208a336a218b33208a33208b33" + "6a218c33208b33208c336a218d33208c33208d336a218e33208d33208e336a218f33208e33208f336a219033208f33" + "2090336a2191332090332091336a2192332091332092336a2193332092332093336a2194332093332094336a219533" + "2094332095336a2196332095332096336a2197332096332097336a2198332097332098336a2199332098332099336a" + "219a33209933209a336a219b33209a33209b336a219c33209b33209c336a219d33209c33209d336a219e33209d3320" + "9e336a219f33209e33209f336a21a033209f3320a0336a21a13320a03320a1336a21a23320a13320a2336a21a33320" + "a23320a3336a21a43320a33320a4336a21a53320a43320a5336a21a63320a53320a6336a21a73320a63320a7336a21" + "a83320a73320a8336a21a93320a83320a9336a21aa3320a93320aa336a21ab3320aa3320ab336a21ac3320ab3320ac" + "336a21ad3320ac3320ad336a21ae3320ad3320ae336a21af3320ae3320af336a21b03320af3320b0336a21b13320b0" + "3320b1336a21b23320b13320b2336a21b33320b23320b3336a21b43320b33320b4336a21b53320b43320b5336a21b6" + "3320b53320b6336a21b73320b63320b7336a21b83320b73320b8336a21b93320b83320b9336a21ba3320b93320ba33" + "6a21bb3320ba3320bb336a21bc3320bb3320bc336a21bd3320bc3320bd336a21be3320bd3320be336a21bf3320be33" + "20bf336a21c03320bf3320c0336a21c13320c03320c1336a21c23320c13320c2336a21c33320c23320c3336a21c433" + "20c33320c4336a21c53320c43320c5336a21c63320c53320c6336a21c73320c63320c7336a21c83320c73320c8336a" + "21c93320c83320c9336a21ca3320c93320ca336a21cb3320ca3320cb336a21cc3320cb3320cc336a21cd3320cc3320" + "cd336a21ce3320cd3320ce336a21cf3320ce3320cf336a21d03320cf3320d0336a21d13320d03320d1336a21d23320" + "d13320d2336a21d33320d23320d3336a21d43320d33320d4336a21d53320d43320d5336a21d63320d53320d6336a21" + "d73320d63320d7336a21d83320d73320d8336a21d93320d83320d9336a21da3320d93320da336a21db3320da3320db" + "336a21dc3320db3320dc336a21dd3320dc3320dd336a21de3320dd3320de336a21df3320de3320df336a21e03320df" + "3320e0336a21e13320e03320e1336a21e23320e13320e2336a21e33320e23320e3336a21e43320e33320e4336a21e5" + "3320e43320e5336a21e63320e53320e6336a21e73320e63320e7336a21e83320e73320e8336a21e93320e83320e933" + "6a21ea3320e93320ea336a21eb3320ea3320eb336a21ec3320eb3320ec336a21ed3320ec3320ed336a21ee3320ed33" + "20ee336a21ef3320ee3320ef336a21f03320ef3320f0336a21f13320f03320f1336a21f23320f13320f2336a21f333" + "20f23320f3336a21f43320f33320f4336a21f53320f43320f5336a21f63320f53320f6336a21f73320f63320f7336a" + "21f83320f73320f8336a21f93320f83320f9336a21fa3320f93320fa336a21fb3320fa3320fb336a21fc3320fb3320" + "fc336a21fd3320fc3320fd336a21fe3320fd3320fe336a21ff3320fe3320ff336a21803420ff332080346a21813420" + "80342081346a2182342081342082346a2183342082342083346a2184342083342084346a2185342084342085346a21" + "86342085342086346a2187342086342087346a2188342087342088346a2189342088342089346a218a34208934208a" + "346a218b34208a34208b346a218c34208b34208c346a218d34208c34208d346a218e34208d34208e346a218f34208e" + "34208f346a219034208f342090346a2191342090342091346a2192342091342092346a2193342092342093346a2194" + "342093342094346a2195342094342095346a2196342095342096346a2197342096342097346a219834209734209834" + "6a2199342098342099346a219a34209934209a346a219b34209a34209b346a219c34209b34209c346a219d34209c34" + "209d346a219e34209d34209e346a219f34209e34209f346a21a034209f3420a0346a21a13420a03420a1346a21a234" + "20a13420a2346a21a33420a23420a3346a21a43420a33420a4346a21a53420a43420a5346a21a63420a53420a6346a" + "21a73420a63420a7346a21a83420a73420a8346a21a93420a83420a9346a21aa3420a93420aa346a21ab3420aa3420" + "ab346a21ac3420ab3420ac346a21ad3420ac3420ad346a21ae3420ad3420ae346a21af3420ae3420af346a21b03420" + "af3420b0346a21b13420b03420b1346a21b23420b13420b2346a21b33420b23420b3346a21b43420b33420b4346a21" + "b53420b43420b5346a21b63420b53420b6346a21b73420b63420b7346a21b83420b73420b8346a21b93420b83420b9" + "346a21ba3420b93420ba346a21bb3420ba3420bb346a21bc3420bb3420bc346a21bd3420bc3420bd346a21be3420bd" + "3420be346a21bf3420be3420bf346a21c03420bf3420c0346a21c13420c03420c1346a21c23420c13420c2346a21c3" + "3420c23420c3346a21c43420c33420c4346a21c53420c43420c5346a21c63420c53420c6346a21c73420c63420c734" + "6a21c83420c73420c8346a21c93420c83420c9346a21ca3420c93420ca346a21cb3420ca3420cb346a21cc3420cb34" + "20cc346a21cd3420cc3420cd346a21ce3420cd3420ce346a21cf3420ce3420cf346a21d03420cf3420d0346a21d134" + "20d03420d1346a21d23420d13420d2346a21d33420d23420d3346a21d43420d33420d4346a21d53420d43420d5346a" + "21d63420d53420d6346a21d73420d63420d7346a21d83420d73420d8346a21d93420d83420d9346a21da3420d93420" + "da346a21db3420da3420db346a21dc3420db3420dc346a21dd3420dc3420dd346a21de3420dd3420de346a21df3420" + "de3420df346a21e03420df3420e0346a21e13420e03420e1346a21e23420e13420e2346a21e33420e23420e3346a21" + "e43420e33420e4346a21e53420e43420e5346a21e63420e53420e6346a21e73420e63420e7346a21e83420e73420e8" + "346a21e93420e83420e9346a21ea3420e93420ea346a21eb3420ea3420eb346a21ec3420eb3420ec346a21ed3420ec" + "3420ed346a21ee3420ed3420ee346a21ef3420ee3420ef346a21f03420ef3420f0346a21f13420f03420f1346a21f2" + "3420f13420f2346a21f33420f23420f3346a21f43420f33420f4346a21f53420f43420f5346a21f63420f53420f634" + "6a21f73420f63420f7346a21f83420f73420f8346a21f93420f83420f9346a21fa3420f93420fa346a21fb3420fa34" + "20fb346a21fc3420fb3420fc346a21fd3420fc3420fd346a21fe3420fd3420fe346a21ff3420fe3420ff346a218035" + "20ff342080356a2181352080352081356a2182352081352082356a2183352082352083356a2184352083352084356a" + "2185352084352085356a2186352085352086356a2187352086352087356a2188352087352088356a21893520883520" + "89356a218a35208935208a356a218b35208a35208b356a218c35208b35208c356a218d35208c35208d356a218e3520" + "8d35208e356a218f35208e35208f356a219035208f352090356a2191352090352091356a2192352091352092356a21" + "93352092352093356a2194352093352094356a2195352094352095356a2196352095352096356a2197352096352097" + "356a2198352097352098356a2199352098352099356a219a35209935209a356a219b35209a35209b356a219c35209b" + "35209c356a219d35209c35209d356a219e35209d35209e356a219f35209e35209f356a21a035209f3520a0356a21a1" + "3520a03520a1356a21a23520a13520a2356a21a33520a23520a3356a21a43520a33520a4356a21a53520a43520a535" + "6a21a63520a53520a6356a21a73520a63520a7356a21a83520a73520a8356a21a93520a83520a9356a21aa3520a935" + "20aa356a21ab3520aa3520ab356a21ac3520ab3520ac356a21ad3520ac3520ad356a21ae3520ad3520ae356a21af35" + "20ae3520af356a21b03520af3520b0356a21b13520b03520b1356a21b23520b13520b2356a21b33520b23520b3356a" + "21b43520b33520b4356a21b53520b43520b5356a21b63520b53520b6356a21b73520b63520b7356a21b83520b73520" + "b8356a21b93520b83520b9356a21ba3520b93520ba356a21bb3520ba3520bb356a21bc3520bb3520bc356a21bd3520" + "bc3520bd356a21be3520bd3520be356a21bf3520be3520bf356a21c03520bf3520c0356a21c13520c03520c1356a21" + "c23520c13520c2356a21c33520c23520c3356a21c43520c33520c4356a21c53520c43520c5356a21c63520c53520c6" + "356a21c73520c63520c7356a21c83520c73520c8356a21c93520c83520c9356a21ca3520c93520ca356a21cb3520ca" + "3520cb356a21cc3520cb3520cc356a21cd3520cc3520cd356a21ce3520cd3520ce356a21cf3520ce3520cf356a21d0" + "3520cf3520d0356a21d13520d03520d1356a21d23520d13520d2356a21d33520d23520d3356a21d43520d33520d435" + "6a21d53520d43520d5356a21d63520d53520d6356a21d73520d63520d7356a21d83520d73520d8356a21d93520d835" + "20d9356a21da3520d93520da356a21db3520da3520db356a21dc3520db3520dc356a21dd3520dc3520dd356a21de35" + "20dd3520de356a21df3520de3520df356a21e03520df3520e0356a21e13520e03520e1356a21e23520e13520e2356a" + "21e33520e23520e3356a21e43520e33520e4356a21e53520e43520e5356a21e63520e53520e6356a21e73520e63520" + "e7356a21e83520e73520e8356a21e93520e83520e9356a21ea3520e93520ea356a21eb3520ea3520eb356a21ec3520" + "eb3520ec356a21ed3520ec3520ed356a21ee3520ed3520ee356a21ef3520ee3520ef356a21f03520ef3520f0356a21" + "f13520f03520f1356a21f23520f13520f2356a21f33520f23520f3356a21f43520f33520f4356a21f53520f43520f5" + "356a21f63520f53520f6356a21f73520f63520f7356a21f83520f73520f8356a21f93520f83520f9356a21fa3520f9" + "3520fa356a21fb3520fa3520fb356a21fc3520fb3520fc356a21fd3520fc3520fd356a21fe3520fd3520fe356a21ff" + "3520fe3520ff356a21803620ff352080366a2181362080362081366a2182362081362082366a218336208236208336" + "6a2184362083362084366a2185362084362085366a2186362085362086366a2187362086362087366a218836208736" + "2088366a2189362088362089366a218a36208936208a366a218b36208a36208b366a218c36208b36208c366a218d36" + "208c36208d366a218e36208d36208e366a218f36208e36208f366a219036208f362090366a2191362090362091366a" + "2192362091362092366a2193362092362093366a2194362093362094366a2195362094362095366a21963620953620" + "96366a2197362096362097366a2198362097362098366a2199362098362099366a219a36209936209a366a219b3620" + "9a36209b366a219c36209b36209c366a219d36209c36209d366a219e36209d36209e366a219f36209e36209f366a21" + "a036209f3620a0366a21a13620a03620a1366a21a23620a13620a2366a21a33620a23620a3366a21a43620a33620a4" + "366a21a53620a43620a5366a21a63620a53620a6366a21a73620a63620a7366a21a83620a73620a8366a21a93620a8" + "3620a9366a21aa3620a93620aa366a21ab3620aa3620ab366a21ac3620ab3620ac366a21ad3620ac3620ad366a21ae" + "3620ad3620ae366a21af3620ae3620af366a21b03620af3620b0366a21b13620b03620b1366a21b23620b13620b236" + "6a21b33620b23620b3366a21b43620b33620b4366a21b53620b43620b5366a21b63620b53620b6366a21b73620b636" + "20b7366a21b83620b73620b8366a21b93620b83620b9366a21ba3620b93620ba366a21bb3620ba3620bb366a21bc36" + "20bb3620bc366a21bd3620bc3620bd366a21be3620bd3620be366a21bf3620be3620bf366a21c03620bf3620c0366a" + "21c13620c03620c1366a21c23620c13620c2366a21c33620c23620c3366a21c43620c33620c4366a21c53620c43620" + "c5366a21c63620c53620c6366a21c73620c63620c7366a21c83620c73620c8366a21c93620c83620c9366a21ca3620" + "c93620ca366a21cb3620ca3620cb366a21cc3620cb3620cc366a21cd3620cc3620cd366a21ce3620cd3620ce366a21" + "cf3620ce3620cf366a21d03620cf3620d0366a21d13620d03620d1366a21d23620d13620d2366a21d33620d23620d3" + "366a21d43620d33620d4366a21d53620d43620d5366a21d63620d53620d6366a21d73620d63620d7366a21d83620d7" + "3620d8366a21d93620d83620d9366a21da3620d93620da366a21db3620da3620db366a21dc3620db3620dc366a21dd" + "3620dc3620dd366a21de3620dd3620de366a21df3620de3620df366a21e03620df3620e0366a21e13620e03620e136" + "6a21e23620e13620e2366a21e33620e23620e3366a21e43620e33620e4366a21e53620e43620e5366a21e63620e536" + "20e6366a21e73620e63620e7366a21e83620e73620e8366a21e93620e83620e9366a21ea3620e93620ea366a21eb36" + "20ea3620eb366a21ec3620eb3620ec366a21ed3620ec3620ed366a21ee3620ed3620ee366a21ef3620ee3620ef366a" + "21f03620ef3620f0366a21f13620f03620f1366a21f23620f13620f2366a21f33620f23620f3366a21f43620f33620" + "f4366a21f53620f43620f5366a21f63620f53620f6366a21f73620f63620f7366a21f83620f73620f8366a21f93620" + "f83620f9366a21fa3620f93620fa366a21fb3620fa3620fb366a21fc3620fb3620fc366a21fd3620fc3620fd366a21" + "fe3620fd3620fe366a21ff3620fe3620ff366a21803720ff362080376a2181372080372081376a2182372081372082" + "376a2183372082372083376a2184372083372084376a2185372084372085376a2186372085372086376a2187372086" + "372087376a2188372087372088376a2189372088372089376a218a37208937208a376a218b37208a37208b376a218c" + "37208b37208c376a218d37208c37208d376a218e37208d37208e376a218f37208e37208f376a219037208f37209037" + "6a2191372090372091376a2192372091372092376a2193372092372093376a2194372093372094376a219537209437" + "2095376a2196372095372096376a2197372096372097376a2198372097372098376a2199372098372099376a219a37" + "209937209a376a219b37209a37209b376a219c37209b37209c376a219d37209c37209d376a219e37209d37209e376a" + "219f37209e37209f376a21a037209f3720a0376a21a13720a03720a1376a21a23720a13720a2376a21a33720a23720" + "a3376a21a43720a33720a4376a21a53720a43720a5376a21a63720a53720a6376a21a73720a63720a7376a21a83720" + "a73720a8376a21a93720a83720a9376a21aa3720a93720aa376a21ab3720aa3720ab376a21ac3720ab3720ac376a21" + "ad3720ac3720ad376a21ae3720ad3720ae376a21af3720ae3720af376a21b03720af3720b0376a21b13720b03720b1" + "376a21b23720b13720b2376a21b33720b23720b3376a21b43720b33720b4376a21b53720b43720b5376a21b63720b5" + "3720b6376a21b73720b63720b7376a21b83720b73720b8376a21b93720b83720b9376a21ba3720b93720ba376a21bb" + "3720ba3720bb376a21bc3720bb3720bc376a21bd3720bc3720bd376a21be3720bd3720be376a21bf3720be3720bf37" + "6a21c03720bf3720c0376a21c13720c03720c1376a21c23720c13720c2376a21c33720c23720c3376a21c43720c337" + "20c4376a21c53720c43720c5376a21c63720c53720c6376a21c73720c63720c7376a21c83720c73720c8376a21c937" + "20c83720c9376a21ca3720c93720ca376a21cb3720ca3720cb376a21cc3720cb3720cc376a21cd3720cc3720cd376a" + "21ce3720cd3720ce376a21cf3720ce3720cf376a21d03720cf3720d0376a21d13720d03720d1376a21d23720d13720" + "d2376a21d33720d23720d3376a21d43720d33720d4376a21d53720d43720d5376a21d63720d53720d6376a21d73720" + "d63720d7376a21d83720d73720d8376a21d93720d83720d9376a21da3720d93720da376a21db3720da3720db376a21" + "dc3720db3720dc376a21dd3720dc3720dd376a21de3720dd3720de376a21df3720de3720df376a21e03720df3720e0" + "376a21e13720e03720e1376a21e23720e13720e2376a21e33720e23720e3376a21e43720e33720e4376a21e53720e4" + "3720e5376a21e63720e53720e6376a21e73720e63720e7376a21e83720e73720e8376a21e93720e83720e9376a21ea" + "3720e93720ea376a21eb3720ea3720eb376a21ec3720eb3720ec376a21ed3720ec3720ed376a21ee3720ed3720ee37" + "6a21ef3720ee3720ef376a21f03720ef3720f0376a21f13720f03720f1376a21f23720f13720f2376a21f33720f237" + "20f3376a21f43720f33720f4376a21f53720f43720f5376a21f63720f53720f6376a21f73720f63720f7376a21f837" + "20f73720f8376a21f93720f83720f9376a21fa3720f93720fa376a21fb3720fa3720fb376a21fc3720fb3720fc376a" + "21fd3720fc3720fd376a21fe3720fd3720fe376a21ff3720fe3720ff376a21803820ff372080386a21813820803820" + "81386a2182382081382082386a2183382082382083386a2184382083382084386a2185382084382085386a21863820" + "85382086386a2187382086382087386a2188382087382088386a2189382088382089386a218a38208938208a386a21" + "8b38208a38208b386a218c38208b38208c386a218d38208c38208d386a218e38208d38208e386a218f38208e38208f" + "386a219038208f382090386a2191382090382091386a2192382091382092386a2193382092382093386a2194382093" + "382094386a2195382094382095386a2196382095382096386a2197382096382097386a2198382097382098386a2199" + "382098382099386a219a38209938209a386a219b38209a38209b386a219c38209b38209c386a219d38209c38209d38" + "6a219e38209d38209e386a219f38209e38209f386a21a038209f3820a0386a21a13820a03820a1386a21a23820a138" + "20a2386a21a33820a23820a3386a21a43820a33820a4386a21a53820a43820a5386a21a63820a53820a6386a21a738" + "20a63820a7386a21a83820a73820a8386a21a93820a83820a9386a21aa3820a93820aa386a21ab3820aa3820ab386a" + "21ac3820ab3820ac386a21ad3820ac3820ad386a21ae3820ad3820ae386a21af3820ae3820af386a21b03820af3820" + "b0386a21b13820b03820b1386a21b23820b13820b2386a21b33820b23820b3386a21b43820b33820b4386a21b53820" + "b43820b5386a21b63820b53820b6386a21b73820b63820b7386a21b83820b73820b8386a21b93820b83820b9386a21" + "ba3820b93820ba386a21bb3820ba3820bb386a21bc3820bb3820bc386a21bd3820bc3820bd386a21be3820bd3820be" + "386a21bf3820be3820bf386a21c03820bf3820c0386a21c13820c03820c1386a21c23820c13820c2386a21c33820c2" + "3820c3386a21c43820c33820c4386a21c53820c43820c5386a21c63820c53820c6386a21c73820c63820c7386a21c8" + "3820c73820c8386a21c93820c83820c9386a21ca3820c93820ca386a21cb3820ca3820cb386a21cc3820cb3820cc38" + "6a21cd3820cc3820cd386a21ce3820cd3820ce386a21cf3820ce3820cf386a21d03820cf3820d0386a21d13820d038" + "20d1386a21d23820d13820d2386a21d33820d23820d3386a21d43820d33820d4386a21d53820d43820d5386a21d638" + "20d53820d6386a21d73820d63820d7386a21d83820d73820d8386a21d93820d83820d9386a21da3820d93820da386a" + "21db3820da3820db386a21dc3820db3820dc386a21dd3820dc3820dd386a21de3820dd3820de386a21df3820de3820" + "df386a21e03820df3820e0386a21e13820e03820e1386a21e23820e13820e2386a21e33820e23820e3386a21e43820" + "e33820e4386a21e53820e43820e5386a21e63820e53820e6386a21e73820e63820e7386a21e83820e73820e8386a21" + "e93820e83820e9386a21ea3820e93820ea386a21eb3820ea3820eb386a21ec3820eb3820ec386a21ed3820ec3820ed" + "386a21ee3820ed3820ee386a21ef3820ee3820ef386a21f03820ef3820f0386a21f13820f03820f1386a21f23820f1" + "3820f2386a21f33820f23820f3386a21f43820f33820f4386a21f53820f43820f5386a21f63820f53820f6386a21f7" + "3820f63820f7386a21f83820f73820f8386a21f93820f83820f9386a21fa3820f93820fa386a21fb3820fa3820fb38" + "6a21fc3820fb3820fc386a21fd3820fc3820fd386a21fe3820fd3820fe386a21ff3820fe3820ff386a21803920ff38" + "2080396a2181392080392081396a2182392081392082396a2183392082392083396a2184392083392084396a218539" + "2084392085396a2186392085392086396a2187392086392087396a2188392087392088396a2189392088392089396a" + "218a39208939208a396a218b39208a39208b396a218c39208b39208c396a218d39208c39208d396a218e39208d3920" + "8e396a218f39208e39208f396a219039208f392090396a2191392090392091396a2192392091392092396a21933920" + "92392093396a2194392093392094396a2195392094392095396a2196392095392096396a2197392096392097396a21" + "98392097392098396a2199392098392099396a219a39209939209a396a219b39209a39209b396a219c39209b39209c" + "396a219d39209c39209d396a219e39209d39209e396a219f39209e39209f396a21a039209f3920a0396a21a13920a0" + "3920a1396a21a23920a13920a2396a21a33920a23920a3396a21a43920a33920a4396a21a53920a43920a5396a21a6" + "3920a53920a6396a21a73920a63920a7396a21a83920a73920a8396a21a93920a83920a9396a21aa3920a93920aa39" + "6a21ab3920aa3920ab396a21ac3920ab3920ac396a21ad3920ac3920ad396a21ae3920ad3920ae396a21af3920ae39" + "20af396a21b03920af3920b0396a21b13920b03920b1396a21b23920b13920b2396a21b33920b23920b3396a21b439" + "20b33920b4396a21b53920b43920b5396a21b63920b53920b6396a21b73920b63920b7396a21b83920b73920b8396a" + "21b93920b83920b9396a21ba3920b93920ba396a21bb3920ba3920bb396a21bc3920bb3920bc396a21bd3920bc3920" + "bd396a21be3920bd3920be396a21bf3920be3920bf396a21c03920bf3920c0396a21c13920c03920c1396a21c23920" + "c13920c2396a21c33920c23920c3396a21c43920c33920c4396a21c53920c43920c5396a21c63920c53920c6396a21" + "c73920c63920c7396a21c83920c73920c8396a21c93920c83920c9396a21ca3920c93920ca396a21cb3920ca3920cb" + "396a21cc3920cb3920cc396a21cd3920cc3920cd396a21ce3920cd3920ce396a21cf3920ce3920cf396a21d03920cf" + "3920d0396a21d13920d03920d1396a21d23920d13920d2396a21d33920d23920d3396a21d43920d33920d4396a21d5" + "3920d43920d5396a21d63920d53920d6396a21d73920d63920d7396a21d83920d73920d8396a21d93920d83920d939" + "6a21da3920d93920da396a21db3920da3920db396a21dc3920db3920dc396a21dd3920dc3920dd396a21de3920dd39" + "20de396a21df3920de3920df396a21e03920df3920e0396a21e13920e03920e1396a21e23920e13920e2396a21e339" + "20e23920e3396a21e43920e33920e4396a21e53920e43920e5396a21e63920e53920e6396a21e73920e63920e7396a" + "21e83920e73920e8396a21e93920e83920e9396a21ea3920e93920ea396a21eb3920ea3920eb396a21ec3920eb3920" + "ec396a21ed3920ec3920ed396a21ee3920ed3920ee396a21ef3920ee3920ef396a21f03920ef3920f0396a21f13920" + "f03920f1396a21f23920f13920f2396a21f33920f23920f3396a21f43920f33920f4396a21f53920f43920f5396a21" + "f63920f53920f6396a21f73920f63920f7396a21f83920f73920f8396a21f93920f83920f9396a21fa3920f93920fa" + "396a21fb3920fa3920fb396a21fc3920fb3920fc396a21fd3920fc3920fd396a21fe3920fd3920fe396a21ff3920fe" + "3920ff396a21803a20ff3920803a6a21813a20803a20813a6a21823a20813a20823a6a21833a20823a20833a6a2184" + "3a20833a20843a6a21853a20843a20853a6a21863a20853a20863a6a21873a20863a20873a6a21883a20873a20883a" + "6a21893a20883a20893a6a218a3a20893a208a3a6a218b3a208a3a208b3a6a218c3a208b3a208c3a6a218d3a208c3a" + "208d3a6a218e3a208d3a208e3a6a218f3a208e3a208f3a6a21903a208f3a20903a6a21913a20903a20913a6a21923a" + "20913a20923a6a21933a20923a20933a6a21943a20933a20943a6a21953a20943a20953a6a21963a20953a20963a6a" + "21973a20963a20973a6a21983a20973a20983a6a21993a20983a20993a6a219a3a20993a209a3a6a219b3a209a3a20" + "9b3a6a219c3a209b3a209c3a6a219d3a209c3a209d3a6a219e3a209d3a209e3a6a219f3a209e3a209f3a6a21a03a20" + "9f3a20a03a6a21a13a20a03a20a13a6a21a23a20a13a20a23a6a21a33a20a23a20a33a6a21a43a20a33a20a43a6a21" + "a53a20a43a20a53a6a21a63a20a53a20a63a6a21a73a20a63a20a73a6a21a83a20a73a20a83a6a21a93a20a83a20a9" + "3a6a21aa3a20a93a20aa3a6a21ab3a20aa3a20ab3a6a21ac3a20ab3a20ac3a6a21ad3a20ac3a20ad3a6a21ae3a20ad" + "3a20ae3a6a21af3a20ae3a20af3a6a21b03a20af3a20b03a6a21b13a20b03a20b13a6a21b23a20b13a20b23a6a21b3" + "3a20b23a20b33a6a21b43a20b33a20b43a6a21b53a20b43a20b53a6a21b63a20b53a20b63a6a21b73a20b63a20b73a" + "6a21b83a20b73a20b83a6a21b93a20b83a20b93a6a21ba3a20b93a20ba3a6a21bb3a20ba3a20bb3a6a21bc3a20bb3a" + "20bc3a6a21bd3a20bc3a20bd3a6a21be3a20bd3a20be3a6a21bf3a20be3a20bf3a6a21c03a20bf3a20c03a6a21c13a" + "20c03a20c13a6a21c23a20c13a20c23a6a21c33a20c23a20c33a6a21c43a20c33a20c43a6a21c53a20c43a20c53a6a" + "21c63a20c53a20c63a6a21c73a20c63a20c73a6a21c83a20c73a20c83a6a21c93a20c83a20c93a6a21ca3a20c93a20" + "ca3a6a21cb3a20ca3a20cb3a6a21cc3a20cb3a20cc3a6a21cd3a20cc3a20cd3a6a21ce3a20cd3a20ce3a6a21cf3a20" + "ce3a20cf3a6a21d03a20cf3a20d03a6a21d13a20d03a20d13a6a21d23a20d13a20d23a6a21d33a20d23a20d33a6a21" + "d43a20d33a20d43a6a21d53a20d43a20d53a6a21d63a20d53a20d63a6a21d73a20d63a20d73a6a21d83a20d73a20d8" + "3a6a21d93a20d83a20d93a6a21da3a20d93a20da3a6a21db3a20da3a20db3a6a21dc3a20db3a20dc3a6a21dd3a20dc" + "3a20dd3a6a21de3a20dd3a20de3a6a21df3a20de3a20df3a6a21e03a20df3a20e03a6a21e13a20e03a20e13a6a21e2" + "3a20e13a20e23a6a21e33a20e23a20e33a6a21e43a20e33a20e43a6a21e53a20e43a20e53a6a21e63a20e53a20e63a" + "6a21e73a20e63a20e73a6a21e83a20e73a20e83a6a21e93a20e83a20e93a6a21ea3a20e93a20ea3a6a21eb3a20ea3a" + "20eb3a6a21ec3a20eb3a20ec3a6a21ed3a20ec3a20ed3a6a21ee3a20ed3a20ee3a6a21ef3a20ee3a20ef3a6a21f03a" + "20ef3a20f03a6a21f13a20f03a20f13a6a21f23a20f13a20f23a6a21f33a20f23a20f33a6a21f43a20f33a20f43a6a" + "21f53a20f43a20f53a6a21f63a20f53a20f63a6a21f73a20f63a20f73a6a21f83a20f73a20f83a6a21f93a20f83a20" + "f93a6a21fa3a20f93a20fa3a6a21fb3a20fa3a20fb3a6a21fc3a20fb3a20fc3a6a21fd3a20fc3a20fd3a6a21fe3a20" + "fd3a20fe3a6a21ff3a20fe3a20ff3a6a21803b20ff3a20803b6a21813b20803b20813b6a21823b20813b20823b6a21" + "833b20823b20833b6a21843b20833b20843b6a21853b20843b20853b6a21863b20853b20863b6a21873b20863b2087" + "3b6a21883b20873b20883b6a21893b20883b20893b6a218a3b20893b208a3b6a218b3b208a3b208b3b6a218c3b208b" + "3b208c3b6a218d3b208c3b208d3b6a218e3b208d3b208e3b6a218f3b208e3b208f3b6a21903b208f3b20903b6a2191" + "3b20903b20913b6a21923b20913b20923b6a21933b20923b20933b6a21943b20933b20943b6a21953b20943b20953b" + "6a21963b20953b20963b6a21973b20963b20973b6a21983b20973b20983b6a21993b20983b20993b6a219a3b20993b" + "209a3b6a219b3b209a3b209b3b6a219c3b209b3b209c3b6a219d3b209c3b209d3b6a219e3b209d3b209e3b6a219f3b" + "209e3b209f3b6a21a03b209f3b20a03b6a21a13b20a03b20a13b6a21a23b20a13b20a23b6a21a33b20a23b20a33b6a" + "21a43b20a33b20a43b6a21a53b20a43b20a53b6a21a63b20a53b20a63b6a21a73b20a63b20a73b6a21a83b20a73b20" + "a83b6a21a93b20a83b20a93b6a21aa3b20a93b20aa3b6a21ab3b20aa3b20ab3b6a21ac3b20ab3b20ac3b6a21ad3b20" + "ac3b20ad3b6a21ae3b20ad3b20ae3b6a21af3b20ae3b20af3b6a21b03b20af3b20b03b6a21b13b20b03b20b13b6a21" + "b23b20b13b20b23b6a21b33b20b23b20b33b6a21b43b20b33b20b43b6a21b53b20b43b20b53b6a21b63b20b53b20b6" + "3b6a21b73b20b63b20b73b6a21b83b20b73b20b83b6a21b93b20b83b20b93b6a21ba3b20b93b20ba3b6a21bb3b20ba" + "3b20bb3b6a21bc3b20bb3b20bc3b6a21bd3b20bc3b20bd3b6a21be3b20bd3b20be3b6a21bf3b20be3b20bf3b6a21c0" + "3b20bf3b20c03b6a21c13b20c03b20c13b6a21c23b20c13b20c23b6a21c33b20c23b20c33b6a21c43b20c33b20c43b" + "6a21c53b20c43b20c53b6a21c63b20c53b20c63b6a21c73b20c63b20c73b6a21c83b20c73b20c83b6a21c93b20c83b" + "20c93b6a21ca3b20c93b20ca3b6a21cb3b20ca3b20cb3b6a21cc3b20cb3b20cc3b6a21cd3b20cc3b20cd3b6a21ce3b" + "20cd3b20ce3b6a21cf3b20ce3b20cf3b6a21d03b20cf3b20d03b6a21d13b20d03b20d13b6a21d23b20d13b20d23b6a" + "21d33b20d23b20d33b6a21d43b20d33b20d43b6a21d53b20d43b20d53b6a21d63b20d53b20d63b6a21d73b20d63b20" + "d73b6a21d83b20d73b20d83b6a21d93b20d83b20d93b6a21da3b20d93b20da3b6a21db3b20da3b20db3b6a21dc3b20" + "db3b20dc3b6a21dd3b20dc3b20dd3b6a21de3b20dd3b20de3b6a21df3b20de3b20df3b6a21e03b20df3b20e03b6a21" + "e13b20e03b20e13b6a21e23b20e13b20e23b6a21e33b20e23b20e33b6a21e43b20e33b20e43b6a21e53b20e43b20e5" + "3b6a21e63b20e53b20e63b6a21e73b20e63b20e73b6a21e83b20e73b20e83b6a21e93b20e83b20e93b6a21ea3b20e9" + "3b20ea3b6a21eb3b20ea3b20eb3b6a21ec3b20eb3b20ec3b6a21ed3b20ec3b20ed3b6a21ee3b20ed3b20ee3b6a21ef" + "3b20ee3b20ef3b6a21f03b20ef3b20f03b6a21f13b20f03b20f13b6a21f23b20f13b20f23b6a21f33b20f23b20f33b" + "6a21f43b20f33b20f43b6a21f53b20f43b20f53b6a21f63b20f53b20f63b6a21f73b20f63b20f73b6a21f83b20f73b" + "20f83b6a21f93b20f83b20f93b6a21fa3b20f93b20fa3b6a21fb3b20fa3b20fb3b6a21fc3b20fb3b20fc3b6a21fd3b" + "20fc3b20fd3b6a21fe3b20fd3b20fe3b6a21ff3b20fe3b20ff3b6a21803c20ff3b20803c6a21813c20803c20813c6a" + "21823c20813c20823c6a21833c20823c20833c6a21843c20833c20843c6a21853c20843c20853c6a21863c20853c20" + "863c6a21873c20863c20873c6a21883c20873c20883c6a21893c20883c20893c6a218a3c20893c208a3c6a218b3c20" + "8a3c208b3c6a218c3c208b3c208c3c6a218d3c208c3c208d3c6a218e3c208d3c208e3c6a218f3c208e3c208f3c6a21" + "903c208f3c20903c6a21913c20903c20913c6a21923c20913c20923c6a21933c20923c20933c6a21943c20933c2094" + "3c6a21953c20943c20953c6a21963c20953c20963c6a21973c20963c20973c6a21983c20973c20983c6a21993c2098" + "3c20993c6a219a3c20993c209a3c6a219b3c209a3c209b3c6a219c3c209b3c209c3c6a219d3c209c3c209d3c6a219e" + "3c209d3c209e3c6a219f3c209e3c209f3c6a21a03c209f3c20a03c6a21a13c20a03c20a13c6a21a23c20a13c20a23c" + "6a21a33c20a23c20a33c6a21a43c20a33c20a43c6a21a53c20a43c20a53c6a21a63c20a53c20a63c6a21a73c20a63c" + "20a73c6a21a83c20a73c20a83c6a21a93c20a83c20a93c6a21aa3c20a93c20aa3c6a21ab3c20aa3c20ab3c6a21ac3c" + "20ab3c20ac3c6a21ad3c20ac3c20ad3c6a21ae3c20ad3c20ae3c6a21af3c20ae3c20af3c6a21b03c20af3c20b03c6a" + "21b13c20b03c20b13c6a21b23c20b13c20b23c6a21b33c20b23c20b33c6a21b43c20b33c20b43c6a21b53c20b43c20" + "b53c6a21b63c20b53c20b63c6a21b73c20b63c20b73c6a21b83c20b73c20b83c6a21b93c20b83c20b93c6a21ba3c20" + "b93c20ba3c6a21bb3c20ba3c20bb3c6a21bc3c20bb3c20bc3c6a21bd3c20bc3c20bd3c6a21be3c20bd3c20be3c6a21" + "bf3c20be3c20bf3c6a21c03c20bf3c20c03c6a21c13c20c03c20c13c6a21c23c20c13c20c23c6a21c33c20c23c20c3" + "3c6a21c43c20c33c20c43c6a21c53c20c43c20c53c6a21c63c20c53c20c63c6a21c73c20c63c20c73c6a21c83c20c7" + "3c20c83c6a21c93c20c83c20c93c6a21ca3c20c93c20ca3c6a21cb3c20ca3c20cb3c6a21cc3c20cb3c20cc3c6a21cd" + "3c20cc3c20cd3c6a21ce3c20cd3c20ce3c6a21cf3c20ce3c20cf3c6a21d03c20cf3c20d03c6a21d13c20d03c20d13c" + "6a21d23c20d13c20d23c6a21d33c20d23c20d33c6a21d43c20d33c20d43c6a21d53c20d43c20d53c6a21d63c20d53c" + "20d63c6a21d73c20d63c20d73c6a21d83c20d73c20d83c6a21d93c20d83c20d93c6a21da3c20d93c20da3c6a21db3c" + "20da3c20db3c6a21dc3c20db3c20dc3c6a21dd3c20dc3c20dd3c6a21de3c20dd3c20de3c6a21df3c20de3c20df3c6a" + "21e03c20df3c20e03c6a21e13c20e03c20e13c6a21e23c20e13c20e23c6a21e33c20e23c20e33c6a21e43c20e33c20" + "e43c6a21e53c20e43c20e53c6a21e63c20e53c20e63c6a21e73c20e63c20e73c6a21e83c20e73c20e83c6a21e93c20" + "e83c20e93c6a21ea3c20e93c20ea3c6a21eb3c20ea3c20eb3c6a21ec3c20eb3c20ec3c6a21ed3c20ec3c20ed3c6a21" + "ee3c20ed3c20ee3c6a21ef3c20ee3c20ef3c6a21f03c20ef3c20f03c6a21f13c20f03c20f13c6a21f23c20f13c20f2" + "3c6a21f33c20f23c20f33c6a21f43c20f33c20f43c6a21f53c20f43c20f53c6a21f63c20f53c20f63c6a21f73c20f6" + "3c20f73c6a21f83c20f73c20f83c6a21f93c20f83c20f93c6a21fa3c20f93c20fa3c6a21fb3c20fa3c20fb3c6a21fc" + "3c20fb3c20fc3c6a21fd3c20fc3c20fd3c6a21fe3c20fd3c20fe3c6a21ff3c20fe3c20ff3c6a21803d20ff3c20803d" + "6a21813d20803d20813d6a21823d20813d20823d6a21833d20823d20833d6a21843d20833d20843d6a21853d20843d" + "20853d6a21863d20853d20863d6a21873d20863d20873d6a21883d20873d20883d6a21893d20883d20893d6a218a3d" + "20893d208a3d6a218b3d208a3d208b3d6a218c3d208b3d208c3d6a218d3d208c3d208d3d6a218e3d208d3d208e3d6a" + "218f3d208e3d208f3d6a21903d208f3d20903d6a21913d20903d20913d6a21923d20913d20923d6a21933d20923d20" + "933d6a21943d20933d20943d6a21953d20943d20953d6a21963d20953d20963d6a21973d20963d20973d6a21983d20" + "973d20983d6a21993d20983d20993d6a219a3d20993d209a3d6a219b3d209a3d209b3d6a219c3d209b3d209c3d6a21" + "9d3d209c3d209d3d6a219e3d209d3d209e3d6a219f3d209e3d209f3d6a21a03d209f3d20a03d6a21a13d20a03d20a1" + "3d6a21a23d20a13d20a23d6a21a33d20a23d20a33d6a21a43d20a33d20a43d6a21a53d20a43d20a53d6a21a63d20a5" + "3d20a63d6a21a73d20a63d20a73d6a21a83d20a73d20a83d6a21a93d20a83d20a93d6a21aa3d20a93d20aa3d6a21ab" + "3d20aa3d20ab3d6a21ac3d20ab3d20ac3d6a21ad3d20ac3d20ad3d6a21ae3d20ad3d20ae3d6a21af3d20ae3d20af3d" + "6a21b03d20af3d20b03d6a21b13d20b03d20b13d6a21b23d20b13d20b23d6a21b33d20b23d20b33d6a21b43d20b33d" + "20b43d6a21b53d20b43d20b53d6a21b63d20b53d20b63d6a21b73d20b63d20b73d6a21b83d20b73d20b83d6a21b93d" + "20b83d20b93d6a21ba3d20b93d20ba3d6a21bb3d20ba3d20bb3d6a21bc3d20bb3d20bc3d6a21bd3d20bc3d20bd3d6a" + "21be3d20bd3d20be3d6a21bf3d20be3d20bf3d6a21c03d20bf3d20c03d6a21c13d20c03d20c13d6a21c23d20c13d20" + "c23d6a21c33d20c23d20c33d6a21c43d20c33d20c43d6a21c53d20c43d20c53d6a21c63d20c53d20c63d6a21c73d20" + "c63d20c73d6a21c83d20c73d20c83d6a21c93d20c83d20c93d6a21ca3d20c93d20ca3d6a21cb3d20ca3d20cb3d6a21" + "cc3d20cb3d20cc3d6a21cd3d20cc3d20cd3d6a21ce3d20cd3d20ce3d6a21cf3d20ce3d20cf3d6a21d03d20cf3d20d0" + "3d6a21d13d20d03d20d13d6a21d23d20d13d20d23d6a21d33d20d23d20d33d6a21d43d20d33d20d43d6a21d53d20d4" + "3d20d53d6a21d63d20d53d20d63d6a21d73d20d63d20d73d6a21d83d20d73d20d83d6a21d93d20d83d20d93d6a21da" + "3d20d93d20da3d6a21db3d20da3d20db3d6a21dc3d20db3d20dc3d6a21dd3d20dc3d20dd3d6a21de3d20dd3d20de3d" + "6a21df3d20de3d20df3d6a21e03d20df3d20e03d6a21e13d20e03d20e13d6a21e23d20e13d20e23d6a21e33d20e23d" + "20e33d6a21e43d20e33d20e43d6a21e53d20e43d20e53d6a21e63d20e53d20e63d6a21e73d20e63d20e73d6a21e83d" + "20e73d20e83d6a21e93d20e83d20e93d6a21ea3d20e93d20ea3d6a21eb3d20ea3d20eb3d6a21ec3d20eb3d20ec3d6a" + "21ed3d20ec3d20ed3d6a21ee3d20ed3d20ee3d6a21ef3d20ee3d20ef3d6a21f03d20ef3d20f03d6a21f13d20f03d20" + "f13d6a21f23d20f13d20f23d6a21f33d20f23d20f33d6a21f43d20f33d20f43d6a21f53d20f43d20f53d6a21f63d20" + "f53d20f63d6a21f73d20f63d20f73d6a21f83d20f73d20f83d6a21f93d20f83d20f93d6a21fa3d20f93d20fa3d6a21" + "fb3d20fa3d20fb3d6a21fc3d20fb3d20fc3d6a21fd3d20fc3d20fd3d6a21fe3d20fd3d20fe3d6a21ff3d20fe3d20ff" + "3d6a21803e20ff3d20803e6a21813e20803e20813e6a21823e20813e20823e6a21833e20823e20833e6a21843e2083" + "3e20843e6a21853e20843e20853e6a21863e20853e20863e6a21873e20863e20873e6a21883e20873e20883e6a2189" + "3e20883e20893e6a218a3e20893e208a3e6a218b3e208a3e208b3e6a218c3e208b3e208c3e6a218d3e208c3e208d3e" + "6a218e3e208d3e208e3e6a218f3e208e3e208f3e6a21903e208f3e20903e6a21913e20903e20913e6a21923e20913e" + "20923e6a21933e20923e20933e6a21943e20933e20943e6a21953e20943e20953e6a21963e20953e20963e6a21973e" + "20963e20973e6a21983e20973e20983e6a21993e20983e20993e6a219a3e20993e209a3e6a219b3e209a3e209b3e6a" + "219c3e209b3e209c3e6a219d3e209c3e209d3e6a219e3e209d3e209e3e6a219f3e209e3e209f3e6a21a03e209f3e20" + "a03e6a21a13e20a03e20a13e6a21a23e20a13e20a23e6a21a33e20a23e20a33e6a21a43e20a33e20a43e6a21a53e20" + "a43e20a53e6a21a63e20a53e20a63e6a21a73e20a63e20a73e6a21a83e20a73e20a83e6a21a93e20a83e20a93e6a21" + "aa3e20a93e20aa3e6a21ab3e20aa3e20ab3e6a21ac3e20ab3e20ac3e6a21ad3e20ac3e20ad3e6a21ae3e20ad3e20ae" + "3e6a21af3e20ae3e20af3e6a21b03e20af3e20b03e6a21b13e20b03e20b13e6a21b23e20b13e20b23e6a21b33e20b2" + "3e20b33e6a21b43e20b33e20b43e6a21b53e20b43e20b53e6a21b63e20b53e20b63e6a21b73e20b63e20b73e6a21b8" + "3e20b73e20b83e6a21b93e20b83e20b93e6a21ba3e20b93e20ba3e6a21bb3e20ba3e20bb3e6a21bc3e20bb3e20bc3e" + "6a21bd3e20bc3e20bd3e6a21be3e20bd3e20be3e6a21bf3e20be3e20bf3e6a21c03e20bf3e20c03e6a21c13e20c03e" + "20c13e6a21c23e20c13e20c23e6a21c33e20c23e20c33e6a21c43e20c33e20c43e6a21c53e20c43e20c53e6a21c63e" + "20c53e20c63e6a21c73e20c63e20c73e6a21c83e20c73e20c83e6a21c93e20c83e20c93e6a21ca3e20c93e20ca3e6a" + "21cb3e20ca3e20cb3e6a21cc3e20cb3e20cc3e6a21cd3e20cc3e20cd3e6a21ce3e20cd3e20ce3e6a21cf3e20ce3e20" + "cf3e6a21d03e20cf3e20d03e6a21d13e20d03e20d13e6a21d23e20d13e20d23e6a21d33e20d23e20d33e6a21d43e20" + "d33e20d43e6a21d53e20d43e20d53e6a21d63e20d53e20d63e6a21d73e20d63e20d73e6a21d83e20d73e20d83e6a21" + "d93e20d83e20d93e6a21da3e20d93e20da3e6a21db3e20da3e20db3e6a21dc3e20db3e20dc3e6a21dd3e20dc3e20dd" + "3e6a21de3e20dd3e20de3e6a21df3e20de3e20df3e6a21e03e20df3e20e03e6a21e13e20e03e20e13e6a21e23e20e1" + "3e20e23e6a21e33e20e23e20e33e6a21e43e20e33e20e43e6a21e53e20e43e20e53e6a21e63e20e53e20e63e6a21e7" + "3e20e63e20e73e6a21e83e20e73e20e83e6a21e93e20e83e20e93e6a21ea3e20e93e20ea3e6a21eb3e20ea3e20eb3e" + "6a21ec3e20eb3e20ec3e6a21ed3e20ec3e20ed3e6a21ee3e20ed3e20ee3e6a21ef3e20ee3e20ef3e6a21f03e20ef3e" + "20f03e6a21f13e20f03e20f13e6a21f23e20f13e20f23e6a21f33e20f23e20f33e6a21f43e20f33e20f43e6a21f53e" + "20f43e20f53e6a21f63e20f53e20f63e6a21f73e20f63e20f73e6a21f83e20f73e20f83e6a21f93e20f83e20f93e6a" + "21fa3e20f93e20fa3e6a21fb3e20fa3e20fb3e6a21fc3e20fb3e20fc3e6a21fd3e20fc3e20fd3e6a21fe3e20fd3e20" + "fe3e6a21ff3e20fe3e20ff3e6a21803f20ff3e20803f6a21813f20803f20813f6a21823f20813f20823f6a21833f20" + "823f20833f6a21843f20833f20843f6a21853f20843f20853f6a21863f20853f20863f6a21873f20863f20873f6a21" + "883f20873f20883f6a21893f20883f20893f6a218a3f20893f208a3f6a218b3f208a3f208b3f6a218c3f208b3f208c" + "3f6a218d3f208c3f208d3f6a218e3f208d3f208e3f6a218f3f208e3f208f3f6a21903f208f3f20903f6a21913f2090" + "3f20913f6a21923f20913f20923f6a21933f20923f20933f6a21943f20933f20943f6a21953f20943f20953f6a2196" + "3f20953f20963f6a21973f20963f20973f6a21983f20973f20983f6a21993f20983f20993f6a219a3f20993f209a3f" + "6a219b3f209a3f209b3f6a219c3f209b3f209c3f6a219d3f209c3f209d3f6a219e3f209d3f209e3f6a219f3f209e3f" + "209f3f6a21a03f209f3f20a03f6a21a13f20a03f20a13f6a21a23f20a13f20a23f6a21a33f20a23f20a33f6a21a43f" + "20a33f20a43f6a21a53f20a43f20a53f6a21a63f20a53f20a63f6a21a73f20a63f20a73f6a21a83f20a73f20a83f6a" + "21a93f20a83f20a93f6a21aa3f20a93f20aa3f6a21ab3f20aa3f20ab3f6a21ac3f20ab3f20ac3f6a21ad3f20ac3f20" + "ad3f6a21ae3f20ad3f20ae3f6a21af3f20ae3f20af3f6a21b03f20af3f20b03f6a21b13f20b03f20b13f6a21b23f20" + "b13f20b23f6a21b33f20b23f20b33f6a21b43f20b33f20b43f6a21b53f20b43f20b53f6a21b63f20b53f20b63f6a21" + "b73f20b63f20b73f6a21b83f20b73f20b83f6a21b93f20b83f20b93f6a21ba3f20b93f20ba3f6a21bb3f20ba3f20bb" + "3f6a21bc3f20bb3f20bc3f6a21bd3f20bc3f20bd3f6a21be3f20bd3f20be3f6a21bf3f20be3f20bf3f6a21c03f20bf" + "3f20c03f6a21c13f20c03f20c13f6a21c23f20c13f20c23f6a21c33f20c23f20c33f6a21c43f20c33f20c43f6a21c5" + "3f20c43f20c53f6a21c63f20c53f20c63f6a21c73f20c63f20c73f6a21c83f20c73f20c83f6a21c93f20c83f20c93f" + "6a21ca3f20c93f20ca3f6a21cb3f20ca3f20cb3f6a21cc3f20cb3f20cc3f6a21cd3f20cc3f20cd3f6a21ce3f20cd3f" + "20ce3f6a21cf3f20ce3f20cf3f6a21d03f20cf3f20d03f6a21d13f20d03f20d13f6a21d23f20d13f20d23f6a21d33f" + "20d23f20d33f6a21d43f20d33f20d43f6a21d53f20d43f20d53f6a21d63f20d53f20d63f6a21d73f20d63f20d73f6a" + "21d83f20d73f20d83f6a21d93f20d83f20d93f6a21da3f20d93f20da3f6a21db3f20da3f20db3f6a21dc3f20db3f20" + "dc3f6a21dd3f20dc3f20dd3f6a21de3f20dd3f20de3f6a21df3f20de3f20df3f6a21e03f20df3f20e03f6a21e13f20" + "e03f20e13f6a21e23f20e13f20e23f6a21e33f20e23f20e33f6a21e43f20e33f20e43f6a21e53f20e43f20e53f6a21" + "e63f20e53f20e63f6a21e73f20e63f20e73f6a21e83f20e73f20e83f6a21e93f20e83f20e93f6a21ea3f20e93f20ea" + "3f6a21eb3f20ea3f20eb3f6a21ec3f20eb3f20ec3f6a21ed3f20ec3f20ed3f6a21ee3f20ed3f20ee3f6a21ef3f20ee" + "3f20ef3f6a21f03f20ef3f20f03f6a21f13f20f03f20f13f6a21f23f20f13f20f23f6a21f33f20f23f20f33f6a21f4" + "3f20f33f20f43f6a21f53f20f43f20f53f6a21f63f20f53f20f63f6a21f73f20f63f20f73f6a21f83f20f73f20f83f" + "6a21f93f20f83f20f93f6a21fa3f20f93f20fa3f6a21fb3f20fa3f20fb3f6a21fc3f20fb3f20fc3f6a21fd3f20fc3f" + "20fd3f6a21fe3f20fd3f20fe3f6a21ff3f20fe3f20ff3f6a21804020ff3f2080406a2181402080402081406a218240" + "2081402082406a2183402082402083406a2184402083402084406a2185402084402085406a2186402085402086406a" + "2187402086402087406a2188402087402088406a2189402088402089406a218a40208940208a406a218b40208a4020" + "8b406a218c40208b40208c406a218d40208c40208d406a218e40208d40208e406a218f40208e40208f406a21904020" + "8f402090406a2191402090402091406a2192402091402092406a2193402092402093406a2194402093402094406a21" + "95402094402095406a2196402095402096406a2197402096402097406a2198402097402098406a2199402098402099" + "406a219a40209940209a406a219b40209a40209b406a219c40209b40209c406a219d40209c40209d406a219e40209d" + "40209e406a219f40209e40209f406a21a040209f4020a0406a21a14020a04020a1406a21a24020a14020a2406a21a3" + "4020a24020a3406a21a44020a34020a4406a21a54020a44020a5406a21a64020a54020a6406a21a74020a64020a740" + "6a21a84020a74020a8406a21a94020a84020a9406a21aa4020a94020aa406a21ab4020aa4020ab406a21ac4020ab40" + "20ac406a21ad4020ac4020ad406a21ae4020ad4020ae406a21af4020ae4020af406a21b04020af4020b0406a21b140" + "20b04020b1406a21b24020b14020b2406a21b34020b24020b3406a21b44020b34020b4406a21b54020b44020b5406a" + "21b64020b54020b6406a21b74020b64020b7406a21b84020b74020b8406a21b94020b84020b9406a21ba4020b94020" + "ba406a21bb4020ba4020bb406a21bc4020bb4020bc406a21bd4020bc4020bd406a21be4020bd4020be406a21bf4020" + "be4020bf406a21c04020bf4020c0406a21c14020c04020c1406a21c24020c14020c2406a21c34020c24020c3406a21" + "c44020c34020c4406a21c54020c44020c5406a21c64020c54020c6406a21c74020c64020c7406a21c84020c74020c8" + "406a21c94020c84020c9406a21ca4020c94020ca406a21cb4020ca4020cb406a21cc4020cb4020cc406a21cd4020cc" + "4020cd406a21ce4020cd4020ce406a21cf4020ce4020cf406a21d04020cf4020d0406a21d14020d04020d1406a21d2" + "4020d14020d2406a21d34020d24020d3406a21d44020d34020d4406a21d54020d44020d5406a21d64020d54020d640" + "6a21d74020d64020d7406a21d84020d74020d8406a21d94020d84020d9406a21da4020d94020da406a21db4020da40" + "20db406a21dc4020db4020dc406a21dd4020dc4020dd406a21de4020dd4020de406a21df4020de4020df406a21e040" + "20df4020e0406a21e14020e04020e1406a21e24020e14020e2406a21e34020e24020e3406a21e44020e34020e4406a" + "21e54020e44020e5406a21e64020e54020e6406a21e74020e64020e7406a21e84020e74020e8406a21e94020e84020" + "e9406a21ea4020e94020ea406a21eb4020ea4020eb406a21ec4020eb4020ec406a21ed4020ec4020ed406a21ee4020" + "ed4020ee406a21ef4020ee4020ef406a21f04020ef4020f0406a21f14020f04020f1406a21f24020f14020f2406a21" + "f34020f24020f3406a21f44020f34020f4406a21f54020f44020f5406a21f64020f54020f6406a21f74020f64020f7" + "406a21f84020f74020f8406a21f94020f84020f9406a21fa4020f94020fa406a21fb4020fa4020fb406a21fc4020fb" + "4020fc406a21fd4020fc4020fd406a21fe4020fd4020fe406a21ff4020fe4020ff406a21804120ff402080416a2181" + "412080412081416a2182412081412082416a2183412082412083416a2184412083412084416a218541208441208541" + "6a2186412085412086416a2187412086412087416a2188412087412088416a2189412088412089416a218a41208941" + "208a416a218b41208a41208b416a218c41208b41208c416a218d41208c41208d416a218e41208d41208e416a218f41" + "208e41208f416a219041208f412090416a2191412090412091416a2192412091412092416a2193412092412093416a" + "2194412093412094416a2195412094412095416a2196412095412096416a2197412096412097416a21984120974120" + "98416a2199412098412099416a219a41209941209a416a219b41209a41209b416a219c41209b41209c416a219d4120" + "9c41209d416a219e41209d41209e416a219f41209e41209f416a21a041209f4120a0416a21a14120a04120a1416a21" + "a24120a14120a2416a21a34120a24120a3416a21a44120a34120a4416a21a54120a44120a5416a21a64120a54120a6" + "416a21a74120a64120a7416a21a84120a74120a8416a21a94120a84120a9416a21aa4120a94120aa416a21ab4120aa" + "4120ab416a21ac4120ab4120ac416a21ad4120ac4120ad416a21ae4120ad4120ae416a21af4120ae4120af416a21b0" + "4120af4120b0416a21b14120b04120b1416a21b24120b14120b2416a21b34120b24120b3416a21b44120b34120b441" + "6a21b54120b44120b5416a21b64120b54120b6416a21b74120b64120b7416a21b84120b74120b8416a21b94120b841" + "20b9416a21ba4120b94120ba416a21bb4120ba4120bb416a21bc4120bb4120bc416a21bd4120bc4120bd416a21be41" + "20bd4120be416a21bf4120be4120bf416a21c04120bf4120c0416a21c14120c04120c1416a21c24120c14120c2416a" + "21c34120c24120c3416a21c44120c34120c4416a21c54120c44120c5416a21c64120c54120c6416a21c74120c64120" + "c7416a21c84120c74120c8416a21c94120c84120c9416a21ca4120c94120ca416a21cb4120ca4120cb416a21cc4120" + "cb4120cc416a21cd4120cc4120cd416a21ce4120cd4120ce416a21cf4120ce4120cf416a21d04120cf4120d0416a21" + "d14120d04120d1416a21d24120d14120d2416a21d34120d24120d3416a21d44120d34120d4416a21d54120d44120d5" + "416a21d64120d54120d6416a21d74120d64120d7416a21d84120d74120d8416a21d94120d84120d9416a21da4120d9" + "4120da416a21db4120da4120db416a21dc4120db4120dc416a21dd4120dc4120dd416a21de4120dd4120de416a21df" + "4120de4120df416a21e04120df4120e0416a21e14120e04120e1416a21e24120e14120e2416a21e34120e24120e341" + "6a21e44120e34120e4416a21e54120e44120e5416a21e64120e54120e6416a21e74120e64120e7416a21e84120e741" + "20e8416a21e94120e84120e9416a21ea4120e94120ea416a21eb4120ea4120eb416a21ec4120eb4120ec416a21ed41" + "20ec4120ed416a21ee4120ed4120ee416a21ef4120ee4120ef416a21f04120ef4120f0416a21f14120f04120f1416a" + "21f24120f14120f2416a21f34120f24120f3416a21f44120f34120f4416a21f54120f44120f5416a21f64120f54120" + "f6416a21f74120f64120f7416a21f84120f74120f8416a21f94120f84120f9416a21fa4120f94120fa416a21fb4120" + "fa4120fb416a21fc4120fb4120fc416a21fd4120fc4120fd416a21fe4120fd4120fe416a21ff4120fe4120ff416a21" + "804220ff412080426a2181422080422081426a2182422081422082426a2183422082422083426a2184422083422084" + "426a2185422084422085426a2186422085422086426a2187422086422087426a2188422087422088426a2189422088" + "422089426a218a42208942208a426a218b42208a42208b426a218c42208b42208c426a218d42208c42208d426a218e" + "42208d42208e426a218f42208e42208f426a219042208f422090426a2191422090422091426a219242209142209242" + "6a2193422092422093426a2194422093422094426a2195422094422095426a2196422095422096426a219742209642" + "2097426a2198422097422098426a2199422098422099426a219a42209942209a426a219b42209a42209b426a219c42" + "209b42209c426a219d42209c42209d426a219e42209d42209e426a219f42209e42209f426a21a042209f4220a0426a" + "21a14220a04220a1426a21a24220a14220a2426a21a34220a24220a3426a21a44220a34220a4426a21a54220a44220" + "a5426a21a64220a54220a6426a21a74220a64220a7426a21a84220a74220a8426a21a94220a84220a9426a21aa4220" + "a94220aa426a21ab4220aa4220ab426a21ac4220ab4220ac426a21ad4220ac4220ad426a21ae4220ad4220ae426a21" + "af4220ae4220af426a21b04220af4220b0426a21b14220b04220b1426a21b24220b14220b2426a21b34220b24220b3" + "426a21b44220b34220b4426a21b54220b44220b5426a21b64220b54220b6426a21b74220b64220b7426a21b84220b7" + "4220b8426a21b94220b84220b9426a21ba4220b94220ba426a21bb4220ba4220bb426a21bc4220bb4220bc426a21bd" + "4220bc4220bd426a21be4220bd4220be426a21bf4220be4220bf426a21c04220bf4220c0426a21c14220c04220c142" + "6a21c24220c14220c2426a21c34220c24220c3426a21c44220c34220c4426a21c54220c44220c5426a21c64220c542" + "20c6426a21c74220c64220c7426a21c84220c74220c8426a21c94220c84220c9426a21ca4220c94220ca426a21cb42" + "20ca4220cb426a21cc4220cb4220cc426a21cd4220cc4220cd426a21ce4220cd4220ce426a21cf4220ce4220cf426a" + "21d04220cf4220d0426a21d14220d04220d1426a21d24220d14220d2426a21d34220d24220d3426a21d44220d34220" + "d4426a21d54220d44220d5426a21d64220d54220d6426a21d74220d64220d7426a21d84220d74220d8426a21d94220" + "d84220d9426a21da4220d94220da426a21db4220da4220db426a21dc4220db4220dc426a21dd4220dc4220dd426a21" + "de4220dd4220de426a21df4220de4220df426a21e04220df4220e0426a21e14220e04220e1426a21e24220e14220e2" + "426a21e34220e24220e3426a21e44220e34220e4426a21e54220e44220e5426a21e64220e54220e6426a21e74220e6" + "4220e7426a21e84220e74220e8426a21e94220e84220e9426a21ea4220e94220ea426a21eb4220ea4220eb426a21ec" + "4220eb4220ec426a21ed4220ec4220ed426a21ee4220ed4220ee426a21ef4220ee4220ef426a21f04220ef4220f042" + "6a21f14220f04220f1426a21f24220f14220f2426a21f34220f24220f3426a21f44220f34220f4426a21f54220f442" + "20f5426a21f64220f54220f6426a21f74220f64220f7426a21f84220f74220f8426a21f94220f84220f9426a21fa42" + "20f94220fa426a21fb4220fa4220fb426a21fc4220fb4220fc426a21fd4220fc4220fd426a21fe4220fd4220fe426a" + "21ff4220fe4220ff426a21804320ff422080436a2181432080432081436a2182432081432082436a21834320824320" + "83436a2184432083432084436a2185432084432085436a2186432085432086436a2187432086432087436a21884320" + "87432088436a2189432088432089436a218a43208943208a436a218b43208a43208b436a218c43208b43208c436a21" + "8d43208c43208d436a218e43208d43208e436a218f43208e43208f436a219043208f432090436a2191432090432091" + "436a2192432091432092436a2193432092432093436a2194432093432094436a2195432094432095436a2196432095" + "432096436a2197432096432097436a2198432097432098436a2199432098432099436a219a43209943209a436a219b" + "43209a43209b436a219c43209b43209c436a219d43209c43209d436a219e43209d43209e436a219f43209e43209f43" + "6a21a043209f4320a0436a21a14320a04320a1436a21a24320a14320a2436a21a34320a24320a3436a21a44320a343" + "20a4436a21a54320a44320a5436a21a64320a54320a6436a21a74320a64320a7436a21a84320a74320a8436a21a943" + "20a84320a9436a21aa4320a94320aa436a21ab4320aa4320ab436a21ac4320ab4320ac436a21ad4320ac4320ad436a" + "21ae4320ad4320ae436a21af4320ae4320af436a21b04320af4320b0436a21b14320b04320b1436a21b24320b14320" + "b2436a21b34320b24320b3436a21b44320b34320b4436a21b54320b44320b5436a21b64320b54320b6436a21b74320" + "b64320b7436a21b84320b74320b8436a21b94320b84320b9436a21ba4320b94320ba436a21bb4320ba4320bb436a21" + "bc4320bb4320bc436a21bd4320bc4320bd436a21be4320bd4320be436a21bf4320be4320bf436a21c04320bf4320c0" + "436a21c14320c04320c1436a21c24320c14320c2436a21c34320c24320c3436a21c44320c34320c4436a21c54320c4" + "4320c5436a21c64320c54320c6436a21c74320c64320c7436a21c84320c74320c8436a21c94320c84320c9436a21ca" + "4320c94320ca436a21cb4320ca4320cb436a21cc4320cb4320cc436a21cd4320cc4320cd436a21ce4320cd4320ce43" + "6a21cf4320ce4320cf436a21d04320cf4320d0436a21d14320d04320d1436a21d24320d14320d2436a21d34320d243" + "20d3436a21d44320d34320d4436a21d54320d44320d5436a21d64320d54320d6436a21d74320d64320d7436a21d843" + "20d74320d8436a21d94320d84320d9436a21da4320d94320da436a21db4320da4320db436a21dc4320db4320dc436a" + "21dd4320dc4320dd436a21de4320dd4320de436a21df4320de4320df436a21e04320df4320e0436a21e14320e04320" + "e1436a21e24320e14320e2436a21e34320e24320e3436a21e44320e34320e4436a21e54320e44320e5436a21e64320" + "e54320e6436a21e74320e64320e7436a21e84320e74320e8436a21e94320e84320e9436a21ea4320e94320ea436a21" + "eb4320ea4320eb436a21ec4320eb4320ec436a21ed4320ec4320ed436a21ee4320ed4320ee436a21ef4320ee4320ef" + "436a21f04320ef4320f0436a21f14320f04320f1436a21f24320f14320f2436a21f34320f24320f3436a21f44320f3" + "4320f4436a21f54320f44320f5436a21f64320f54320f6436a21f74320f64320f7436a21f84320f74320f8436a21f9" + "4320f84320f9436a21fa4320f94320fa436a21fb4320fa4320fb436a21fc4320fb4320fc436a21fd4320fc4320fd43" + "6a21fe4320fd4320fe436a21ff4320fe4320ff436a21804420ff432080446a2181442080442081446a218244208144" + "2082446a2183442082442083446a2184442083442084446a2185442084442085446a2186442085442086446a218744" + "2086442087446a2188442087442088446a2189442088442089446a218a44208944208a446a218b44208a44208b446a" + "218c44208b44208c446a218d44208c44208d446a218e44208d44208e446a218f44208e44208f446a219044208f4420" + "90446a2191442090442091446a2192442091442092446a2193442092442093446a2194442093442094446a21954420" + "94442095446a2196442095442096446a2197442096442097446a2198442097442098446a2199442098442099446a21" + "9a44209944209a446a219b44209a44209b446a219c44209b44209c446a219d44209c44209d446a219e44209d44209e" + "446a219f44209e44209f446a21a044209f4420a0446a21a14420a04420a1446a21a24420a14420a2446a21a34420a2" + "4420a3446a21a44420a34420a4446a21a54420a44420a5446a21a64420a54420a6446a21a74420a64420a7446a21a8" + "4420a74420a8446a21a94420a84420a9446a21aa4420a94420aa446a21ab4420aa4420ab446a21ac4420ab4420ac44" + "6a21ad4420ac4420ad446a21ae4420ad4420ae446a21af4420ae4420af446a21b04420af4420b0446a21b14420b044" + "20b1446a21b24420b14420b2446a21b34420b24420b3446a21b44420b34420b4446a21b54420b44420b5446a21b644" + "20b54420b6446a21b74420b64420b7446a21b84420b74420b8446a21b94420b84420b9446a21ba4420b94420ba446a" + "21bb4420ba4420bb446a21bc4420bb4420bc446a21bd4420bc4420bd446a21be4420bd4420be446a21bf4420be4420" + "bf446a21c04420bf4420c0446a21c14420c04420c1446a21c24420c14420c2446a21c34420c24420c3446a21c44420" + "c34420c4446a21c54420c44420c5446a21c64420c54420c6446a21c74420c64420c7446a21c84420c74420c8446a21" + "c94420c84420c9446a21ca4420c94420ca446a21cb4420ca4420cb446a21cc4420cb4420cc446a21cd4420cc4420cd" + "446a21ce4420cd4420ce446a21cf4420ce4420cf446a21d04420cf4420d0446a21d14420d04420d1446a21d24420d1" + "4420d2446a21d34420d24420d3446a21d44420d34420d4446a21d54420d44420d5446a21d64420d54420d6446a21d7" + "4420d64420d7446a21d84420d74420d8446a21d94420d84420d9446a21da4420d94420da446a21db4420da4420db44" + "6a21dc4420db4420dc446a21dd4420dc4420dd446a21de4420dd4420de446a21df4420de4420df446a21e04420df44" + "20e0446a21e14420e04420e1446a21e24420e14420e2446a21e34420e24420e3446a21e44420e34420e4446a21e544" + "20e44420e5446a21e64420e54420e6446a21e74420e64420e7446a21e84420e74420e8446a21e94420e84420e9446a" + "21ea4420e94420ea446a21eb4420ea4420eb446a21ec4420eb4420ec446a21ed4420ec4420ed446a21ee4420ed4420" + "ee446a21ef4420ee4420ef446a21f04420ef4420f0446a21f14420f04420f1446a21f24420f14420f2446a21f34420" + "f24420f3446a21f44420f34420f4446a21f54420f44420f5446a21f64420f54420f6446a21f74420f64420f7446a21" + "f84420f74420f8446a21f94420f84420f9446a21fa4420f94420fa446a21fb4420fa4420fb446a21fc4420fb4420fc" + "446a21fd4420fc4420fd446a21fe4420fd4420fe446a21ff4420fe4420ff446a21804520ff442080456a2181452080" + "452081456a2182452081452082456a2183452082452083456a2184452083452084456a2185452084452085456a2186" + "452085452086456a2187452086452087456a2188452087452088456a2189452088452089456a218a45208945208a45" + "6a218b45208a45208b456a218c45208b45208c456a218d45208c45208d456a218e45208d45208e456a218f45208e45" + "208f456a219045208f452090456a2191452090452091456a2192452091452092456a2193452092452093456a219445" + "2093452094456a2195452094452095456a2196452095452096456a2197452096452097456a2198452097452098456a" + "2199452098452099456a219a45209945209a456a219b45209a45209b456a219c45209b45209c456a219d45209c4520" + "9d456a219e45209d45209e456a219f45209e45209f456a21a045209f4520a0456a21a14520a04520a1456a21a24520" + "a14520a2456a21a34520a24520a3456a21a44520a34520a4456a21a54520a44520a5456a21a64520a54520a6456a21" + "a74520a64520a7456a21a84520a74520a8456a21a94520a84520a9456a21aa4520a94520aa456a21ab4520aa4520ab" + "456a21ac4520ab4520ac456a21ad4520ac4520ad456a21ae4520ad4520ae456a21af4520ae4520af456a21b04520af" + "4520b0456a21b14520b04520b1456a21b24520b14520b2456a21b34520b24520b3456a21b44520b34520b4456a21b5" + "4520b44520b5456a21b64520b54520b6456a21b74520b64520b7456a21b84520b74520b8456a21b94520b84520b945" + "6a21ba4520b94520ba456a21bb4520ba4520bb456a21bc4520bb4520bc456a21bd4520bc4520bd456a21be4520bd45" + "20be456a21bf4520be4520bf456a21c04520bf4520c0456a21c14520c04520c1456a21c24520c14520c2456a21c345" + "20c24520c3456a21c44520c34520c4456a21c54520c44520c5456a21c64520c54520c6456a21c74520c64520c7456a" + "21c84520c74520c8456a21c94520c84520c9456a21ca4520c94520ca456a21cb4520ca4520cb456a21cc4520cb4520" + "cc456a21cd4520cc4520cd456a21ce4520cd4520ce456a21cf4520ce4520cf456a21d04520cf4520d0456a21d14520" + "d04520d1456a21d24520d14520d2456a21d34520d24520d3456a21d44520d34520d4456a21d54520d44520d5456a21" + "d64520d54520d6456a21d74520d64520d7456a21d84520d74520d8456a21d94520d84520d9456a21da4520d94520da" + "456a21db4520da4520db456a21dc4520db4520dc456a21dd4520dc4520dd456a21de4520dd4520de456a21df4520de" + "4520df456a21e04520df4520e0456a21e14520e04520e1456a21e24520e14520e2456a21e34520e24520e3456a21e4" + "4520e34520e4456a21e54520e44520e5456a21e64520e54520e6456a21e74520e64520e7456a21e84520e74520e845" + "6a21e94520e84520e9456a21ea4520e94520ea456a21eb4520ea4520eb456a21ec4520eb4520ec456a21ed4520ec45" + "20ed456a21ee4520ed4520ee456a21ef4520ee4520ef456a21f04520ef4520f0456a21f14520f04520f1456a21f245" + "20f14520f2456a21f34520f24520f3456a21f44520f34520f4456a21f54520f44520f5456a21f64520f54520f6456a" + "21f74520f64520f7456a21f84520f74520f8456a21f94520f84520f9456a21fa4520f94520fa456a21fb4520fa4520" + "fb456a21fc4520fb4520fc456a21fd4520fc4520fd456a21fe4520fd4520fe456a21ff4520fe4520ff456a21804620" + "ff452080466a2181462080462081466a2182462081462082466a2183462082462083466a2184462083462084466a21" + "85462084462085466a2186462085462086466a2187462086462087466a2188462087462088466a2189462088462089" + "466a218a46208946208a466a218b46208a46208b466a218c46208b46208c466a218d46208c46208d466a218e46208d" + "46208e466a218f46208e46208f466a219046208f462090466a2191462090462091466a2192462091462092466a2193" + "462092462093466a2194462093462094466a2195462094462095466a2196462095462096466a219746209646209746" + "6a2198462097462098466a2199462098462099466a219a46209946209a466a219b46209a46209b466a219c46209b46" + "209c466a219d46209c46209d466a219e46209d46209e466a219f46209e46209f466a21a046209f4620a0466a21a146" + "20a04620a1466a21a24620a14620a2466a21a34620a24620a3466a21a44620a34620a4466a21a54620a44620a5466a" + "21a64620a54620a6466a21a74620a64620a7466a21a84620a74620a8466a21a94620a84620a9466a21aa4620a94620" + "aa466a21ab4620aa4620ab466a21ac4620ab4620ac466a21ad4620ac4620ad466a21ae4620ad4620ae466a21af4620" + "ae4620af466a21b04620af4620b0466a21b14620b04620b1466a21b24620b14620b2466a21b34620b24620b3466a21" + "b44620b34620b4466a21b54620b44620b5466a21b64620b54620b6466a21b74620b64620b7466a21b84620b74620b8" + "466a21b94620b84620b9466a21ba4620b94620ba466a21bb4620ba4620bb466a21bc4620bb4620bc466a21bd4620bc" + "4620bd466a21be4620bd4620be466a21bf4620be4620bf466a21c04620bf4620c0466a21c14620c04620c1466a21c2" + "4620c14620c2466a21c34620c24620c3466a21c44620c34620c4466a21c54620c44620c5466a21c64620c54620c646" + "6a21c74620c64620c7466a21c84620c74620c8466a21c94620c84620c9466a21ca4620c94620ca466a21cb4620ca46" + "20cb466a21cc4620cb4620cc466a21cd4620cc4620cd466a21ce4620cd4620ce466a21cf4620ce4620cf466a21d046" + "20cf4620d0466a21d14620d04620d1466a21d24620d14620d2466a21d34620d24620d3466a21d44620d34620d4466a" + "21d54620d44620d5466a21d64620d54620d6466a21d74620d64620d7466a21d84620d74620d8466a21d94620d84620" + "d9466a21da4620d94620da466a21db4620da4620db466a21dc4620db4620dc466a21dd4620dc4620dd466a21de4620" + "dd4620de466a21df4620de4620df466a21e04620df4620e0466a21e14620e04620e1466a21e24620e14620e2466a21" + "e34620e24620e3466a21e44620e34620e4466a21e54620e44620e5466a21e64620e54620e6466a21e74620e64620e7" + "466a21e84620e74620e8466a21e94620e84620e9466a21ea4620e94620ea466a21eb4620ea4620eb466a21ec4620eb" + "4620ec466a21ed4620ec4620ed466a21ee4620ed4620ee466a21ef4620ee4620ef466a21f04620ef4620f0466a21f1" + "4620f04620f1466a21f24620f14620f2466a21f34620f24620f3466a21f44620f34620f4466a21f54620f44620f546" + "6a21f64620f54620f6466a21f74620f64620f7466a21f84620f74620f8466a21f94620f84620f9466a21fa4620f946" + "20fa466a21fb4620fa4620fb466a21fc4620fb4620fc466a21fd4620fc4620fd466a21fe4620fd4620fe466a21ff46" + "20fe4620ff466a21804720ff462080476a2181472080472081476a2182472081472082476a2183472082472083476a" + "2184472083472084476a2185472084472085476a2186472085472086476a2187472086472087476a21884720874720" + "88476a2189472088472089476a218a47208947208a476a218b47208a47208b476a218c47208b47208c476a218d4720" + "8c47208d476a218e47208d47208e476a218f47208e47208f476a219047208f472090476a2191472090472091476a21" + "92472091472092476a2193472092472093476a2194472093472094476a2195472094472095476a2196472095472096" + "476a2197472096472097476a2198472097472098476a2199472098472099476a219a47209947209a476a219b47209a" + "47209b476a219c47209b47209c476a219d47209c47209d476a219e47209d47209e476a219f47209e47209f476a21a0" + "47209f4720a0476a21a14720a04720a1476a21a24720a14720a2476a21a34720a24720a3476a21a44720a34720a447" + "6a21a54720a44720a5476a21a64720a54720a6476a21a74720a64720a7476a21a84720a74720a8476a21a94720a847" + "20a9476a21aa4720a94720aa476a21ab4720aa4720ab476a21ac4720ab4720ac476a21ad4720ac4720ad476a21ae47" + "20ad4720ae476a21af4720ae4720af476a21b04720af4720b0476a21b14720b04720b1476a21b24720b14720b2476a" + "21b34720b24720b3476a21b44720b34720b4476a21b54720b44720b5476a21b64720b54720b6476a21b74720b64720" + "b7476a21b84720b74720b8476a21b94720b84720b9476a21ba4720b94720ba476a21bb4720ba4720bb476a21bc4720" + "bb4720bc476a21bd4720bc4720bd476a21be4720bd4720be476a21bf4720be4720bf476a21c04720bf4720c0476a21" + "c14720c04720c1476a21c24720c14720c2476a21c34720c24720c3476a21c44720c34720c4476a21c54720c44720c5" + "476a21c64720c54720c6476a21c74720c64720c7476a21c84720c74720c8476a21c94720c84720c9476a21ca4720c9" + "4720ca476a21cb4720ca4720cb476a21cc4720cb4720cc476a21cd4720cc4720cd476a21ce4720cd4720ce476a21cf" + "4720ce4720cf476a21d04720cf4720d0476a21d14720d04720d1476a21d24720d14720d2476a21d34720d24720d347" + "6a21d44720d34720d4476a21d54720d44720d5476a21d64720d54720d6476a21d74720d64720d7476a21d84720d747" + "20d8476a21d94720d84720d9476a21da4720d94720da476a21db4720da4720db476a21dc4720db4720dc476a21dd47" + "20dc4720dd476a21de4720dd4720de476a21df4720de4720df476a21e04720df4720e0476a21e14720e04720e1476a" + "21e24720e14720e2476a21e34720e24720e3476a21e44720e34720e4476a21e54720e44720e5476a21e64720e54720" + "e6476a21e74720e64720e7476a21e84720e74720e8476a21e94720e84720e9476a21ea4720e94720ea476a21eb4720" + "ea4720eb476a21ec4720eb4720ec476a21ed4720ec4720ed476a21ee4720ed4720ee476a21ef4720ee4720ef476a21" + "f04720ef4720f0476a21f14720f04720f1476a21f24720f14720f2476a21f34720f24720f3476a21f44720f34720f4" + "476a21f54720f44720f5476a21f64720f54720f6476a21f74720f64720f7476a21f84720f74720f8476a21f94720f8" + "4720f9476a21fa4720f94720fa476a21fb4720fa4720fb476a21fc4720fb4720fc476a21fd4720fc4720fd476a21fe" + "4720fd4720fe476a21ff4720fe4720ff476a21804820ff472080486a2181482080482081486a218248208148208248" + "6a2183482082482083486a2184482083482084486a2185482084482085486a2186482085482086486a218748208648" + "2087486a2188482087482088486a2189482088482089486a218a48208948208a486a218b48208a48208b486a218c48" + "208b48208c486a218d48208c48208d486a218e48208d48208e486a218f48208e48208f486a219048208f482090486a" + "2191482090482091486a2192482091482092486a2193482092482093486a2194482093482094486a21954820944820" + "95486a2196482095482096486a2197482096482097486a2198482097482098486a2199482098482099486a219a4820" + "9948209a486a219b48209a48209b486a219c48209b48209c486a219d48209c48209d486a219e48209d48209e486a21" + "9f48209e48209f486a21a048209f4820a0486a21a14820a04820a1486a21a24820a14820a2486a21a34820a24820a3" + "486a21a44820a34820a4486a21a54820a44820a5486a21a64820a54820a6486a21a74820a64820a7486a21a84820a7" + "4820a8486a21a94820a84820a9486a21aa4820a94820aa486a21ab4820aa4820ab486a21ac4820ab4820ac486a21ad" + "4820ac4820ad486a21ae4820ad4820ae486a21af4820ae4820af486a21b04820af4820b0486a21b14820b04820b148" + "6a21b24820b14820b2486a21b34820b24820b3486a21b44820b34820b4486a21b54820b44820b5486a21b64820b548" + "20b6486a21b74820b64820b7486a21b84820b74820b8486a21b94820b84820b9486a21ba4820b94820ba486a21bb48" + "20ba4820bb486a21bc4820bb4820bc486a21bd4820bc4820bd486a21be4820bd4820be486a21bf4820be4820bf486a" + "21c04820bf4820c0486a21c14820c04820c1486a21c24820c14820c2486a21c34820c24820c3486a21c44820c34820" + "c4486a21c54820c44820c5486a21c64820c54820c6486a21c74820c64820c7486a21c84820c74820c8486a21c94820" + "c84820c9486a21ca4820c94820ca486a21cb4820ca4820cb486a21cc4820cb4820cc486a21cd4820cc4820cd486a21" + "ce4820cd4820ce486a21cf4820ce4820cf486a21d04820cf4820d0486a21d14820d04820d1486a21d24820d14820d2" + "486a21d34820d24820d3486a21d44820d34820d4486a21d54820d44820d5486a21d64820d54820d6486a21d74820d6" + "4820d7486a21d84820d74820d8486a21d94820d84820d9486a21da4820d94820da486a21db4820da4820db486a21dc" + "4820db4820dc486a21dd4820dc4820dd486a21de4820dd4820de486a21df4820de4820df486a21e04820df4820e048" + "6a21e14820e04820e1486a21e24820e14820e2486a21e34820e24820e3486a21e44820e34820e4486a21e54820e448" + "20e5486a21e64820e54820e6486a21e74820e64820e7486a21e84820e74820e8486a21e94820e84820e9486a21ea48" + "20e94820ea486a21eb4820ea4820eb486a21ec4820eb4820ec486a21ed4820ec4820ed486a21ee4820ed4820ee486a" + "21ef4820ee4820ef486a21f04820ef4820f0486a21f14820f04820f1486a21f24820f14820f2486a21f34820f24820" + "f3486a21f44820f34820f4486a21f54820f44820f5486a21f64820f54820f6486a21f74820f64820f7486a21f84820" + "f74820f8486a21f94820f84820f9486a21fa4820f94820fa486a21fb4820fa4820fb486a21fc4820fb4820fc486a21" + "fd4820fc4820fd486a21fe4820fd4820fe486a21ff4820fe4820ff486a21804920ff482080496a2181492080492081" + "496a2182492081492082496a2183492082492083496a2184492083492084496a2185492084492085496a2186492085" + "492086496a2187492086492087496a2188492087492088496a2189492088492089496a218a49208949208a496a218b" + "49208a49208b496a218c49208b49208c496a218d49208c49208d496a218e49208d49208e496a218f49208e49208f49" + "6a219049208f492090496a2191492090492091496a2192492091492092496a2193492092492093496a219449209349" + "2094496a2195492094492095496a2196492095492096496a2197492096492097496a2198492097492098496a219949" + "2098492099496a219a49209949209a496a219b49209a49209b496a219c49209b49209c496a219d49209c49209d496a" + "219e49209d49209e496a219f49209e49209f496a21a049209f4920a0496a21a14920a04920a1496a21a24920a14920" + "a2496a21a34920a24920a3496a21a44920a34920a4496a21a54920a44920a5496a21a64920a54920a6496a21a74920" + "a64920a7496a21a84920a74920a8496a21a94920a84920a9496a21aa4920a94920aa496a21ab4920aa4920ab496a21" + "ac4920ab4920ac496a21ad4920ac4920ad496a21ae4920ad4920ae496a21af4920ae4920af496a21b04920af4920b0" + "496a21b14920b04920b1496a21b24920b14920b2496a21b34920b24920b3496a21b44920b34920b4496a21b54920b4" + "4920b5496a21b64920b54920b6496a21b74920b64920b7496a21b84920b74920b8496a21b94920b84920b9496a21ba" + "4920b94920ba496a21bb4920ba4920bb496a21bc4920bb4920bc496a21bd4920bc4920bd496a21be4920bd4920be49" + "6a21bf4920be4920bf496a21c04920bf4920c0496a21c14920c04920c1496a21c24920c14920c2496a21c34920c249" + "20c3496a21c44920c34920c4496a21c54920c44920c5496a21c64920c54920c6496a21c74920c64920c7496a21c849" + "20c74920c8496a21c94920c84920c9496a21ca4920c94920ca496a21cb4920ca4920cb496a21cc4920cb4920cc496a" + "21cd4920cc4920cd496a21ce4920cd4920ce496a21cf4920ce4920cf496a21d04920cf4920d0496a21d14920d04920" + "d1496a21d24920d14920d2496a21d34920d24920d3496a21d44920d34920d4496a21d54920d44920d5496a21d64920" + "d54920d6496a21d74920d64920d7496a21d84920d74920d8496a21d94920d84920d9496a21da4920d94920da496a21" + "db4920da4920db496a21dc4920db4920dc496a21dd4920dc4920dd496a21de4920dd4920de496a21df4920de4920df" + "496a21e04920df4920e0496a21e14920e04920e1496a21e24920e14920e2496a21e34920e24920e3496a21e44920e3" + "4920e4496a21e54920e44920e5496a21e64920e54920e6496a21e74920e64920e7496a21e84920e74920e8496a21e9" + "4920e84920e9496a21ea4920e94920ea496a21eb4920ea4920eb496a21ec4920eb4920ec496a21ed4920ec4920ed49" + "6a21ee4920ed4920ee496a21ef4920ee4920ef496a21f04920ef4920f0496a21f14920f04920f1496a21f24920f149" + "20f2496a21f34920f24920f3496a21f44920f34920f4496a21f54920f44920f5496a21f64920f54920f6496a21f749" + "20f64920f7496a21f84920f74920f8496a21f94920f84920f9496a21fa4920f94920fa496a21fb4920fa4920fb496a" + "21fc4920fb4920fc496a21fd4920fc4920fd496a21fe4920fd4920fe496a21ff4920fe4920ff496a21804a20ff4920" + "804a6a21814a20804a20814a6a21824a20814a20824a6a21834a20824a20834a6a21844a20834a20844a6a21854a20" + "844a20854a6a21864a20854a20864a6a21874a20864a20874a6a21884a20874a20884a6a21894a20884a20894a6a21" + "8a4a20894a208a4a6a218b4a208a4a208b4a6a218c4a208b4a208c4a6a218d4a208c4a208d4a6a218e4a208d4a208e" + "4a6a218f4a208e4a208f4a6a21904a208f4a20904a6a21914a20904a20914a6a21924a20914a20924a6a21934a2092" + "4a20934a6a21944a20934a20944a6a21954a20944a20954a6a21964a20954a20964a6a21974a20964a20974a6a2198" + "4a20974a20984a6a21994a20984a20994a6a219a4a20994a209a4a6a219b4a209a4a209b4a6a219c4a209b4a209c4a" + "6a219d4a209c4a209d4a6a219e4a209d4a209e4a6a219f4a209e4a209f4a6a21a04a209f4a20a04a6a21a14a20a04a" + "20a14a6a21a24a20a14a20a24a6a21a34a20a24a20a34a6a21a44a20a34a20a44a6a21a54a20a44a20a54a6a21a64a" + "20a54a20a64a6a21a74a20a64a20a74a6a21a84a20a74a20a84a6a21a94a20a84a20a94a6a21aa4a20a94a20aa4a6a" + "21ab4a20aa4a20ab4a6a21ac4a20ab4a20ac4a6a21ad4a20ac4a20ad4a6a21ae4a20ad4a20ae4a6a21af4a20ae4a20" + "af4a6a21b04a20af4a20b04a6a21b14a20b04a20b14a6a21b24a20b14a20b24a6a21b34a20b24a20b34a6a21b44a20" + "b34a20b44a6a21b54a20b44a20b54a6a21b64a20b54a20b64a6a21b74a20b64a20b74a6a21b84a20b74a20b84a6a21" + "b94a20b84a20b94a6a21ba4a20b94a20ba4a6a21bb4a20ba4a20bb4a6a21bc4a20bb4a20bc4a6a21bd4a20bc4a20bd" + "4a6a21be4a20bd4a20be4a6a21bf4a20be4a20bf4a6a21c04a20bf4a20c04a6a21c14a20c04a20c14a6a21c24a20c1" + "4a20c24a6a21c34a20c24a20c34a6a21c44a20c34a20c44a6a21c54a20c44a20c54a6a21c64a20c54a20c64a6a21c7" + "4a20c64a20c74a6a21c84a20c74a20c84a6a21c94a20c84a20c94a6a21ca4a20c94a20ca4a6a21cb4a20ca4a20cb4a" + "6a21cc4a20cb4a20cc4a6a21cd4a20cc4a20cd4a6a21ce4a20cd4a20ce4a6a21cf4a20ce4a20cf4a6a21d04a20cf4a" + "20d04a6a21d14a20d04a20d14a6a21d24a20d14a20d24a6a21d34a20d24a20d34a6a21d44a20d34a20d44a6a21d54a" + "20d44a20d54a6a21d64a20d54a20d64a6a21d74a20d64a20d74a6a21d84a20d74a20d84a6a21d94a20d84a20d94a6a" + "21da4a20d94a20da4a6a21db4a20da4a20db4a6a21dc4a20db4a20dc4a6a21dd4a20dc4a20dd4a6a21de4a20dd4a20" + "de4a6a21df4a20de4a20df4a6a21e04a20df4a20e04a6a21e14a20e04a20e14a6a21e24a20e14a20e24a6a21e34a20" + "e24a20e34a6a21e44a20e34a20e44a6a21e54a20e44a20e54a6a21e64a20e54a20e64a6a21e74a20e64a20e74a6a21" + "e84a20e74a20e84a6a21e94a20e84a20e94a6a21ea4a20e94a20ea4a6a21eb4a20ea4a20eb4a6a21ec4a20eb4a20ec" + "4a6a21ed4a20ec4a20ed4a6a21ee4a20ed4a20ee4a6a21ef4a20ee4a20ef4a6a21f04a20ef4a20f04a6a21f14a20f0" + "4a20f14a6a21f24a20f14a20f24a6a21f34a20f24a20f34a6a21f44a20f34a20f44a6a21f54a20f44a20f54a6a21f6" + "4a20f54a20f64a6a21f74a20f64a20f74a6a21f84a20f74a20f84a6a21f94a20f84a20f94a6a21fa4a20f94a20fa4a" + "6a21fb4a20fa4a20fb4a6a21fc4a20fb4a20fc4a6a21fd4a20fc4a20fd4a6a21fe4a20fd4a20fe4a6a21ff4a20fe4a" + "20ff4a6a21804b20ff4a20804b6a21814b20804b20814b6a21824b20814b20824b6a21834b20824b20834b6a21844b" + "20834b20844b6a21854b20844b20854b6a21864b20854b20864b6a21874b20864b20874b6a21884b20874b20884b6a" + "21894b20884b20894b6a218a4b20894b208a4b6a218b4b208a4b208b4b6a218c4b208b4b208c4b6a218d4b208c4b20" + "8d4b6a218e4b208d4b208e4b6a218f4b208e4b208f4b6a21904b208f4b20904b6a21914b20904b20914b6a21924b20" + "914b20924b6a21934b20924b20934b6a21944b20934b20944b6a21954b20944b20954b6a21964b20954b20964b6a21" + "974b20964b20974b6a21984b20974b20984b6a21994b20984b20994b6a219a4b20994b209a4b6a219b4b209a4b209b" + "4b6a219c4b209b4b209c4b6a219d4b209c4b209d4b6a219e4b209d4b209e4b6a219f4b209e4b209f4b6a21a04b209f" + "4b20a04b6a21a14b20a04b20a14b6a21a24b20a14b20a24b6a21a34b20a24b20a34b6a21a44b20a34b20a44b6a21a5" + "4b20a44b20a54b6a21a64b20a54b20a64b6a21a74b20a64b20a74b6a21a84b20a74b20a84b6a21a94b20a84b20a94b" + "6a21aa4b20a94b20aa4b6a21ab4b20aa4b20ab4b6a21ac4b20ab4b20ac4b6a21ad4b20ac4b20ad4b6a21ae4b20ad4b" + "20ae4b6a21af4b20ae4b20af4b6a21b04b20af4b20b04b6a21b14b20b04b20b14b6a21b24b20b14b20b24b6a21b34b" + "20b24b20b34b6a21b44b20b34b20b44b6a21b54b20b44b20b54b6a21b64b20b54b20b64b6a21b74b20b64b20b74b6a" + "21b84b20b74b20b84b6a21b94b20b84b20b94b6a21ba4b20b94b20ba4b6a21bb4b20ba4b20bb4b6a21bc4b20bb4b20" + "bc4b6a21bd4b20bc4b20bd4b6a21be4b20bd4b20be4b6a21bf4b20be4b20bf4b6a21c04b20bf4b20c04b6a21c14b20" + "c04b20c14b6a21c24b20c14b20c24b6a21c34b20c24b20c34b6a21c44b20c34b20c44b6a21c54b20c44b20c54b6a21" + "c64b20c54b20c64b6a21c74b20c64b20c74b6a21c84b20c74b20c84b6a21c94b20c84b20c94b6a21ca4b20c94b20ca" + "4b6a21cb4b20ca4b20cb4b6a21cc4b20cb4b20cc4b6a21cd4b20cc4b20cd4b6a21ce4b20cd4b20ce4b6a21cf4b20ce" + "4b20cf4b6a21d04b20cf4b20d04b6a21d14b20d04b20d14b6a21d24b20d14b20d24b6a21d34b20d24b20d34b6a21d4" + "4b20d34b20d44b6a21d54b20d44b20d54b6a21d64b20d54b20d64b6a21d74b20d64b20d74b6a21d84b20d74b20d84b" + "6a21d94b20d84b20d94b6a21da4b20d94b20da4b6a21db4b20da4b20db4b6a21dc4b20db4b20dc4b6a21dd4b20dc4b" + "20dd4b6a21de4b20dd4b20de4b6a21df4b20de4b20df4b6a21e04b20df4b20e04b6a21e14b20e04b20e14b6a21e24b" + "20e14b20e24b6a21e34b20e24b20e34b6a21e44b20e34b20e44b6a21e54b20e44b20e54b6a21e64b20e54b20e64b6a" + "21e74b20e64b20e74b6a21e84b20e74b20e84b6a21e94b20e84b20e94b6a21ea4b20e94b20ea4b6a21eb4b20ea4b20" + "eb4b6a21ec4b20eb4b20ec4b6a21ed4b20ec4b20ed4b6a21ee4b20ed4b20ee4b6a21ef4b20ee4b20ef4b6a21f04b20" + "ef4b20f04b6a21f14b20f04b20f14b6a21f24b20f14b20f24b6a21f34b20f24b20f34b6a21f44b20f34b20f44b6a21" + "f54b20f44b20f54b6a21f64b20f54b20f64b6a21f74b20f64b20f74b6a21f84b20f74b20f84b6a21f94b20f84b20f9" + "4b6a21fa4b20f94b20fa4b6a21fb4b20fa4b20fb4b6a21fc4b20fb4b20fc4b6a21fd4b20fc4b20fd4b6a21fe4b20fd" + "4b20fe4b6a21ff4b20fe4b20ff4b6a21804c20ff4b20804c6a21814c20804c20814c6a21824c20814c20824c6a2183" + "4c20824c20834c6a21844c20834c20844c6a21854c20844c20854c6a21864c20854c20864c6a21874c20864c20874c" + "6a21884c20874c20884c6a21894c20884c20894c6a218a4c20894c208a4c6a218b4c208a4c208b4c6a218c4c208b4c" + "208c4c6a218d4c208c4c208d4c6a218e4c208d4c208e4c6a218f4c208e4c208f4c6a21904c208f4c20904c6a21914c" + "20904c20914c6a21924c20914c20924c6a21934c20924c20934c6a21944c20934c20944c6a21954c20944c20954c6a" + "21964c20954c20964c6a21974c20964c20974c6a21984c20974c20984c6a21994c20984c20994c6a219a4c20994c20" + "9a4c6a219b4c209a4c209b4c6a219c4c209b4c209c4c6a219d4c209c4c209d4c6a219e4c209d4c209e4c6a219f4c20" + "9e4c209f4c6a21a04c209f4c20a04c6a21a14c20a04c20a14c6a21a24c20a14c20a24c6a21a34c20a24c20a34c6a21" + "a44c20a34c20a44c6a21a54c20a44c20a54c6a21a64c20a54c20a64c6a21a74c20a64c20a74c6a21a84c20a74c20a8" + "4c6a21a94c20a84c20a94c6a21aa4c20a94c20aa4c6a21ab4c20aa4c20ab4c6a21ac4c20ab4c20ac4c6a21ad4c20ac" + "4c20ad4c6a21ae4c20ad4c20ae4c6a21af4c20ae4c20af4c6a21b04c20af4c20b04c6a21b14c20b04c20b14c6a21b2" + "4c20b14c20b24c6a21b34c20b24c20b34c6a21b44c20b34c20b44c6a21b54c20b44c20b54c6a21b64c20b54c20b64c" + "6a21b74c20b64c20b74c6a21b84c20b74c20b84c6a21b94c20b84c20b94c6a21ba4c20b94c20ba4c6a21bb4c20ba4c" + "20bb4c6a21bc4c20bb4c20bc4c6a21bd4c20bc4c20bd4c6a21be4c20bd4c20be4c6a21bf4c20be4c20bf4c6a21c04c" + "20bf4c20c04c6a21c14c20c04c20c14c6a21c24c20c14c20c24c6a21c34c20c24c20c34c6a21c44c20c34c20c44c6a" + "21c54c20c44c20c54c6a21c64c20c54c20c64c6a21c74c20c64c20c74c6a21c84c20c74c20c84c6a21c94c20c84c20" + "c94c6a21ca4c20c94c20ca4c6a21cb4c20ca4c20cb4c6a21cc4c20cb4c20cc4c6a21cd4c20cc4c20cd4c6a21ce4c20" + "cd4c20ce4c6a21cf4c20ce4c20cf4c6a21d04c20cf4c20d04c6a21d14c20d04c20d14c6a21d24c20d14c20d24c6a21" + "d34c20d24c20d34c6a21d44c20d34c20d44c6a21d54c20d44c20d54c6a21d64c20d54c20d64c6a21d74c20d64c20d7" + "4c6a21d84c20d74c20d84c6a21d94c20d84c20d94c6a21da4c20d94c20da4c6a21db4c20da4c20db4c6a21dc4c20db" + "4c20dc4c6a21dd4c20dc4c20dd4c6a21de4c20dd4c20de4c6a21df4c20de4c20df4c6a21e04c20df4c20e04c6a21e1" + "4c20e04c20e14c6a21e24c20e14c20e24c6a21e34c20e24c20e34c6a21e44c20e34c20e44c6a21e54c20e44c20e54c" + "6a21e64c20e54c20e64c6a21e74c20e64c20e74c6a21e84c20e74c20e84c6a21e94c20e84c20e94c6a21ea4c20e94c" + "20ea4c6a21eb4c20ea4c20eb4c6a21ec4c20eb4c20ec4c6a21ed4c20ec4c20ed4c6a21ee4c20ed4c20ee4c6a21ef4c" + "20ee4c20ef4c6a21f04c20ef4c20f04c6a21f14c20f04c20f14c6a21f24c20f14c20f24c6a21f34c20f24c20f34c6a" + "21f44c20f34c20f44c6a21f54c20f44c20f54c6a21f64c20f54c20f64c6a21f74c20f64c20f74c6a21f84c20f74c20" + "f84c6a21f94c20f84c20f94c6a21fa4c20f94c20fa4c6a21fb4c20fa4c20fb4c6a21fc4c20fb4c20fc4c6a21fd4c20" + "fc4c20fd4c6a21fe4c20fd4c20fe4c6a21ff4c20fe4c20ff4c6a21804d20ff4c20804d6a21814d20804d20814d6a21" + "824d20814d20824d6a21834d20824d20834d6a21844d20834d20844d6a21854d20844d20854d6a21864d20854d2086" + "4d6a21874d20864d20874d6a21884d20874d20884d6a21894d20884d20894d6a218a4d20894d208a4d6a218b4d208a" + "4d208b4d6a218c4d208b4d208c4d6a218d4d208c4d208d4d6a218e4d208d4d208e4d6a218f4d208e4d208f4d6a2190" + "4d208f4d20904d6a21914d20904d20914d6a21924d20914d20924d6a21934d20924d20934d6a21944d20934d20944d" + "6a21954d20944d20954d6a21964d20954d20964d6a21974d20964d20974d6a21984d20974d20984d6a21994d20984d" + "20994d6a219a4d20994d209a4d6a219b4d209a4d209b4d6a219c4d209b4d209c4d6a219d4d209c4d209d4d6a219e4d" + "209d4d209e4d6a219f4d209e4d209f4d6a21a04d209f4d20a04d6a21a14d20a04d20a14d6a21a24d20a14d20a24d6a" + "21a34d20a24d20a34d6a21a44d20a34d20a44d6a21a54d20a44d20a54d6a21a64d20a54d20a64d6a21a74d20a64d20" + "a74d6a21a84d20a74d20a84d6a21a94d20a84d20a94d6a21aa4d20a94d20aa4d6a21ab4d20aa4d20ab4d6a21ac4d20" + "ab4d20ac4d6a21ad4d20ac4d20ad4d6a21ae4d20ad4d20ae4d6a21af4d20ae4d20af4d6a21b04d20af4d20b04d6a21" + "b14d20b04d20b14d6a21b24d20b14d20b24d6a21b34d20b24d20b34d6a21b44d20b34d20b44d6a21b54d20b44d20b5" + "4d6a21b64d20b54d20b64d6a21b74d20b64d20b74d6a21b84d20b74d20b84d6a21b94d20b84d20b94d6a21ba4d20b9" + "4d20ba4d6a21bb4d20ba4d20bb4d6a21bc4d20bb4d20bc4d6a21bd4d20bc4d20bd4d6a21be4d20bd4d20be4d6a21bf" + "4d20be4d20bf4d6a21c04d20bf4d20c04d6a21c14d20c04d20c14d6a21c24d20c14d20c24d6a21c34d20c24d20c34d" + "6a21c44d20c34d20c44d6a21c54d20c44d20c54d6a21c64d20c54d20c64d6a21c74d20c64d20c74d6a21c84d20c74d" + "20c84d6a21c94d20c84d20c94d6a21ca4d20c94d20ca4d6a21cb4d20ca4d20cb4d6a21cc4d20cb4d20cc4d6a21cd4d" + "20cc4d20cd4d6a21ce4d20cd4d20ce4d6a21cf4d20ce4d20cf4d6a21d04d20cf4d20d04d6a21d14d20d04d20d14d6a" + "21d24d20d14d20d24d6a21d34d20d24d20d34d6a21d44d20d34d20d44d6a21d54d20d44d20d54d6a21d64d20d54d20" + "d64d6a21d74d20d64d20d74d6a21d84d20d74d20d84d6a21d94d20d84d20d94d6a21da4d20d94d20da4d6a21db4d20" + "da4d20db4d6a21dc4d20db4d20dc4d6a21dd4d20dc4d20dd4d6a21de4d20dd4d20de4d6a21df4d20de4d20df4d6a21" + "e04d20df4d20e04d6a21e14d20e04d20e14d6a21e24d20e14d20e24d6a21e34d20e24d20e34d6a21e44d20e34d20e4" + "4d6a21e54d20e44d20e54d6a21e64d20e54d20e64d6a21e74d20e64d20e74d6a21e84d20e74d20e84d6a21e94d20e8" + "4d20e94d6a21ea4d20e94d20ea4d6a21eb4d20ea4d20eb4d6a21ec4d20eb4d20ec4d6a21ed4d20ec4d20ed4d6a21ee" + "4d20ed4d20ee4d6a21ef4d20ee4d20ef4d6a21f04d20ef4d20f04d6a21f14d20f04d20f14d6a21f24d20f14d20f24d" + "6a21f34d20f24d20f34d6a21f44d20f34d20f44d6a21f54d20f44d20f54d6a21f64d20f54d20f64d6a21f74d20f64d" + "20f74d6a21f84d20f74d20f84d6a21f94d20f84d20f94d6a21fa4d20f94d20fa4d6a21fb4d20fa4d20fb4d6a21fc4d" + "20fb4d20fc4d6a21fd4d20fc4d20fd4d6a21fe4d20fd4d20fe4d6a21ff4d20fe4d20ff4d6a21804e20ff4d20804e6a" + "21814e20804e20814e6a21824e20814e20824e6a21834e20824e20834e6a21844e20834e20844e6a21854e20844e20" + "854e6a21864e20854e20864e6a21874e20864e20874e6a21884e20874e20884e6a21894e20884e20894e6a218a4e20" + "894e208a4e6a218b4e208a4e208b4e6a218c4e208b4e208c4e6a218d4e208c4e208d4e6a218e4e208d4e208e4e6a21" + "8f4e208f4e0b"; diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 7dcd5c4ea13..945a5a8ce22 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -1302,4364 +1302,6 @@ extern std::string const thousand1ParamsHex = "623432626432343732302900490f7461726765745f6665617475726573042b0f6d757461626c652d676c6f62616c73" "2b087369676e2d6578742b0f7265666572656e63652d74797065732b0a6d756c746976616c7565"; -extern std::string const locals10kHex = - "0061736d0100000001070160027f7f017f03020100070801047465737400000a9b8a0601978a06018e4e7f20002001" - "6a2102200120026a2103200220036a2104200320046a2105200420056a2106200520066a2107200620076a21082007" - "20086a2109200820096a210a2009200a6a210b200a200b6a210c200b200c6a210d200c200d6a210e200d200e6a210f" - "200e200f6a2110200f20106a2111201020116a2112201120126a2113201220136a2114201320146a2115201420156a" - "2116201520166a2117201620176a2118201720186a2119201820196a211a2019201a6a211b201a201b6a211c201b20" - "1c6a211d201c201d6a211e201d201e6a211f201e201f6a2120201f20206a2121202020216a2122202120226a212320" - "2220236a2124202320246a2125202420256a2126202520266a2127202620276a2128202720286a2129202820296a21" - "2a2029202a6a212b202a202b6a212c202b202c6a212d202c202d6a212e202d202e6a212f202e202f6a2130202f2030" - "6a2131203020316a2132203120326a2133203220336a2134203320346a2135203420356a2136203520366a21372036" - "20376a2138203720386a2139203820396a213a2039203a6a213b203a203b6a213c203b203c6a213d203c203d6a213e" - "203d203e6a213f203e203f6a2140203f20406a2141204020416a2142204120426a2143204220436a2144204320446a" - "2145204420456a2146204520466a2147204620476a2148204720486a2149204820496a214a2049204a6a214b204a20" - "4b6a214c204b204c6a214d204c204d6a214e204d204e6a214f204e204f6a2150204f20506a2151205020516a215220" - "5120526a2153205220536a2154205320546a2155205420556a2156205520566a2157205620576a2158205720586a21" - "59205820596a215a2059205a6a215b205a205b6a215c205b205c6a215d205c205d6a215e205d205e6a215f205e205f" - "6a2160205f20606a2161206020616a2162206120626a2163206220636a2164206320646a2165206420656a21662065" - "20666a2167206620676a2168206720686a2169206820696a216a2069206a6a216b206a206b6a216c206b206c6a216d" - "206c206d6a216e206d206e6a216f206e206f6a2170206f20706a2171207020716a2172207120726a2173207220736a" - "2174207320746a2175207420756a2176207520766a2177207620776a2178207720786a2179207820796a217a207920" - "7a6a217b207a207b6a217c207b207c6a217d207c207d6a217e207d207e6a217f207e207f6a218001207f2080016a21" - "81012080012081016a2182012081012082016a2183012082012083016a2184012083012084016a2185012084012085" - "016a2186012085012086016a2187012086012087016a2188012087012088016a2189012088012089016a218a012089" - "01208a016a218b01208a01208b016a218c01208b01208c016a218d01208c01208d016a218e01208d01208e016a218f" - "01208e01208f016a219001208f012090016a2191012090012091016a2192012091012092016a219301209201209301" - "6a2194012093012094016a2195012094012095016a2196012095012096016a2197012096012097016a219801209701" - "2098016a2199012098012099016a219a01209901209a016a219b01209a01209b016a219c01209b01209c016a219d01" - "209c01209d016a219e01209d01209e016a219f01209e01209f016a21a001209f0120a0016a21a10120a00120a1016a" - "21a20120a10120a2016a21a30120a20120a3016a21a40120a30120a4016a21a50120a40120a5016a21a60120a50120" - "a6016a21a70120a60120a7016a21a80120a70120a8016a21a90120a80120a9016a21aa0120a90120aa016a21ab0120" - "aa0120ab016a21ac0120ab0120ac016a21ad0120ac0120ad016a21ae0120ad0120ae016a21af0120ae0120af016a21" - "b00120af0120b0016a21b10120b00120b1016a21b20120b10120b2016a21b30120b20120b3016a21b40120b30120b4" - "016a21b50120b40120b5016a21b60120b50120b6016a21b70120b60120b7016a21b80120b70120b8016a21b90120b8" - "0120b9016a21ba0120b90120ba016a21bb0120ba0120bb016a21bc0120bb0120bc016a21bd0120bc0120bd016a21be" - "0120bd0120be016a21bf0120be0120bf016a21c00120bf0120c0016a21c10120c00120c1016a21c20120c10120c201" - "6a21c30120c20120c3016a21c40120c30120c4016a21c50120c40120c5016a21c60120c50120c6016a21c70120c601" - "20c7016a21c80120c70120c8016a21c90120c80120c9016a21ca0120c90120ca016a21cb0120ca0120cb016a21cc01" - "20cb0120cc016a21cd0120cc0120cd016a21ce0120cd0120ce016a21cf0120ce0120cf016a21d00120cf0120d0016a" - "21d10120d00120d1016a21d20120d10120d2016a21d30120d20120d3016a21d40120d30120d4016a21d50120d40120" - "d5016a21d60120d50120d6016a21d70120d60120d7016a21d80120d70120d8016a21d90120d80120d9016a21da0120" - "d90120da016a21db0120da0120db016a21dc0120db0120dc016a21dd0120dc0120dd016a21de0120dd0120de016a21" - "df0120de0120df016a21e00120df0120e0016a21e10120e00120e1016a21e20120e10120e2016a21e30120e20120e3" - "016a21e40120e30120e4016a21e50120e40120e5016a21e60120e50120e6016a21e70120e60120e7016a21e80120e7" - "0120e8016a21e90120e80120e9016a21ea0120e90120ea016a21eb0120ea0120eb016a21ec0120eb0120ec016a21ed" - "0120ec0120ed016a21ee0120ed0120ee016a21ef0120ee0120ef016a21f00120ef0120f0016a21f10120f00120f101" - "6a21f20120f10120f2016a21f30120f20120f3016a21f40120f30120f4016a21f50120f40120f5016a21f60120f501" - "20f6016a21f70120f60120f7016a21f80120f70120f8016a21f90120f80120f9016a21fa0120f90120fa016a21fb01" - "20fa0120fb016a21fc0120fb0120fc016a21fd0120fc0120fd016a21fe0120fd0120fe016a21ff0120fe0120ff016a" - "21800220ff012080026a2181022080022081026a2182022081022082026a2183022082022083026a21840220830220" - "84026a2185022084022085026a2186022085022086026a2187022086022087026a2188022087022088026a21890220" - "88022089026a218a02208902208a026a218b02208a02208b026a218c02208b02208c026a218d02208c02208d026a21" - "8e02208d02208e026a218f02208e02208f026a219002208f022090026a2191022090022091026a2192022091022092" - "026a2193022092022093026a2194022093022094026a2195022094022095026a2196022095022096026a2197022096" - "022097026a2198022097022098026a2199022098022099026a219a02209902209a026a219b02209a02209b026a219c" - "02209b02209c026a219d02209c02209d026a219e02209d02209e026a219f02209e02209f026a21a002209f0220a002" - "6a21a10220a00220a1026a21a20220a10220a2026a21a30220a20220a3026a21a40220a30220a4026a21a50220a402" - "20a5026a21a60220a50220a6026a21a70220a60220a7026a21a80220a70220a8026a21a90220a80220a9026a21aa02" - "20a90220aa026a21ab0220aa0220ab026a21ac0220ab0220ac026a21ad0220ac0220ad026a21ae0220ad0220ae026a" - "21af0220ae0220af026a21b00220af0220b0026a21b10220b00220b1026a21b20220b10220b2026a21b30220b20220" - "b3026a21b40220b30220b4026a21b50220b40220b5026a21b60220b50220b6026a21b70220b60220b7026a21b80220" - "b70220b8026a21b90220b80220b9026a21ba0220b90220ba026a21bb0220ba0220bb026a21bc0220bb0220bc026a21" - "bd0220bc0220bd026a21be0220bd0220be026a21bf0220be0220bf026a21c00220bf0220c0026a21c10220c00220c1" - "026a21c20220c10220c2026a21c30220c20220c3026a21c40220c30220c4026a21c50220c40220c5026a21c60220c5" - "0220c6026a21c70220c60220c7026a21c80220c70220c8026a21c90220c80220c9026a21ca0220c90220ca026a21cb" - "0220ca0220cb026a21cc0220cb0220cc026a21cd0220cc0220cd026a21ce0220cd0220ce026a21cf0220ce0220cf02" - "6a21d00220cf0220d0026a21d10220d00220d1026a21d20220d10220d2026a21d30220d20220d3026a21d40220d302" - "20d4026a21d50220d40220d5026a21d60220d50220d6026a21d70220d60220d7026a21d80220d70220d8026a21d902" - "20d80220d9026a21da0220d90220da026a21db0220da0220db026a21dc0220db0220dc026a21dd0220dc0220dd026a" - "21de0220dd0220de026a21df0220de0220df026a21e00220df0220e0026a21e10220e00220e1026a21e20220e10220" - "e2026a21e30220e20220e3026a21e40220e30220e4026a21e50220e40220e5026a21e60220e50220e6026a21e70220" - "e60220e7026a21e80220e70220e8026a21e90220e80220e9026a21ea0220e90220ea026a21eb0220ea0220eb026a21" - "ec0220eb0220ec026a21ed0220ec0220ed026a21ee0220ed0220ee026a21ef0220ee0220ef026a21f00220ef0220f0" - "026a21f10220f00220f1026a21f20220f10220f2026a21f30220f20220f3026a21f40220f30220f4026a21f50220f4" - "0220f5026a21f60220f50220f6026a21f70220f60220f7026a21f80220f70220f8026a21f90220f80220f9026a21fa" - "0220f90220fa026a21fb0220fa0220fb026a21fc0220fb0220fc026a21fd0220fc0220fd026a21fe0220fd0220fe02" - "6a21ff0220fe0220ff026a21800320ff022080036a2181032080032081036a2182032081032082036a218303208203" - "2083036a2184032083032084036a2185032084032085036a2186032085032086036a2187032086032087036a218803" - "2087032088036a2189032088032089036a218a03208903208a036a218b03208a03208b036a218c03208b03208c036a" - "218d03208c03208d036a218e03208d03208e036a218f03208e03208f036a219003208f032090036a21910320900320" - "91036a2192032091032092036a2193032092032093036a2194032093032094036a2195032094032095036a21960320" - "95032096036a2197032096032097036a2198032097032098036a2199032098032099036a219a03209903209a036a21" - "9b03209a03209b036a219c03209b03209c036a219d03209c03209d036a219e03209d03209e036a219f03209e03209f" - "036a21a003209f0320a0036a21a10320a00320a1036a21a20320a10320a2036a21a30320a20320a3036a21a40320a3" - "0320a4036a21a50320a40320a5036a21a60320a50320a6036a21a70320a60320a7036a21a80320a70320a8036a21a9" - "0320a80320a9036a21aa0320a90320aa036a21ab0320aa0320ab036a21ac0320ab0320ac036a21ad0320ac0320ad03" - "6a21ae0320ad0320ae036a21af0320ae0320af036a21b00320af0320b0036a21b10320b00320b1036a21b20320b103" - "20b2036a21b30320b20320b3036a21b40320b30320b4036a21b50320b40320b5036a21b60320b50320b6036a21b703" - "20b60320b7036a21b80320b70320b8036a21b90320b80320b9036a21ba0320b90320ba036a21bb0320ba0320bb036a" - "21bc0320bb0320bc036a21bd0320bc0320bd036a21be0320bd0320be036a21bf0320be0320bf036a21c00320bf0320" - "c0036a21c10320c00320c1036a21c20320c10320c2036a21c30320c20320c3036a21c40320c30320c4036a21c50320" - "c40320c5036a21c60320c50320c6036a21c70320c60320c7036a21c80320c70320c8036a21c90320c80320c9036a21" - "ca0320c90320ca036a21cb0320ca0320cb036a21cc0320cb0320cc036a21cd0320cc0320cd036a21ce0320cd0320ce" - "036a21cf0320ce0320cf036a21d00320cf0320d0036a21d10320d00320d1036a21d20320d10320d2036a21d30320d2" - "0320d3036a21d40320d30320d4036a21d50320d40320d5036a21d60320d50320d6036a21d70320d60320d7036a21d8" - "0320d70320d8036a21d90320d80320d9036a21da0320d90320da036a21db0320da0320db036a21dc0320db0320dc03" - "6a21dd0320dc0320dd036a21de0320dd0320de036a21df0320de0320df036a21e00320df0320e0036a21e10320e003" - "20e1036a21e20320e10320e2036a21e30320e20320e3036a21e40320e30320e4036a21e50320e40320e5036a21e603" - "20e50320e6036a21e70320e60320e7036a21e80320e70320e8036a21e90320e80320e9036a21ea0320e90320ea036a" - "21eb0320ea0320eb036a21ec0320eb0320ec036a21ed0320ec0320ed036a21ee0320ed0320ee036a21ef0320ee0320" - "ef036a21f00320ef0320f0036a21f10320f00320f1036a21f20320f10320f2036a21f30320f20320f3036a21f40320" - "f30320f4036a21f50320f40320f5036a21f60320f50320f6036a21f70320f60320f7036a21f80320f70320f8036a21" - "f90320f80320f9036a21fa0320f90320fa036a21fb0320fa0320fb036a21fc0320fb0320fc036a21fd0320fc0320fd" - "036a21fe0320fd0320fe036a21ff0320fe0320ff036a21800420ff032080046a2181042080042081046a2182042081" - "042082046a2183042082042083046a2184042083042084046a2185042084042085046a2186042085042086046a2187" - "042086042087046a2188042087042088046a2189042088042089046a218a04208904208a046a218b04208a04208b04" - "6a218c04208b04208c046a218d04208c04208d046a218e04208d04208e046a218f04208e04208f046a219004208f04" - "2090046a2191042090042091046a2192042091042092046a2193042092042093046a2194042093042094046a219504" - "2094042095046a2196042095042096046a2197042096042097046a2198042097042098046a2199042098042099046a" - "219a04209904209a046a219b04209a04209b046a219c04209b04209c046a219d04209c04209d046a219e04209d0420" - "9e046a219f04209e04209f046a21a004209f0420a0046a21a10420a00420a1046a21a20420a10420a2046a21a30420" - "a20420a3046a21a40420a30420a4046a21a50420a40420a5046a21a60420a50420a6046a21a70420a60420a7046a21" - "a80420a70420a8046a21a90420a80420a9046a21aa0420a90420aa046a21ab0420aa0420ab046a21ac0420ab0420ac" - "046a21ad0420ac0420ad046a21ae0420ad0420ae046a21af0420ae0420af046a21b00420af0420b0046a21b10420b0" - "0420b1046a21b20420b10420b2046a21b30420b20420b3046a21b40420b30420b4046a21b50420b40420b5046a21b6" - "0420b50420b6046a21b70420b60420b7046a21b80420b70420b8046a21b90420b80420b9046a21ba0420b90420ba04" - "6a21bb0420ba0420bb046a21bc0420bb0420bc046a21bd0420bc0420bd046a21be0420bd0420be046a21bf0420be04" - "20bf046a21c00420bf0420c0046a21c10420c00420c1046a21c20420c10420c2046a21c30420c20420c3046a21c404" - "20c30420c4046a21c50420c40420c5046a21c60420c50420c6046a21c70420c60420c7046a21c80420c70420c8046a" - "21c90420c80420c9046a21ca0420c90420ca046a21cb0420ca0420cb046a21cc0420cb0420cc046a21cd0420cc0420" - "cd046a21ce0420cd0420ce046a21cf0420ce0420cf046a21d00420cf0420d0046a21d10420d00420d1046a21d20420" - "d10420d2046a21d30420d20420d3046a21d40420d30420d4046a21d50420d40420d5046a21d60420d50420d6046a21" - "d70420d60420d7046a21d80420d70420d8046a21d90420d80420d9046a21da0420d90420da046a21db0420da0420db" - "046a21dc0420db0420dc046a21dd0420dc0420dd046a21de0420dd0420de046a21df0420de0420df046a21e00420df" - "0420e0046a21e10420e00420e1046a21e20420e10420e2046a21e30420e20420e3046a21e40420e30420e4046a21e5" - "0420e40420e5046a21e60420e50420e6046a21e70420e60420e7046a21e80420e70420e8046a21e90420e80420e904" - "6a21ea0420e90420ea046a21eb0420ea0420eb046a21ec0420eb0420ec046a21ed0420ec0420ed046a21ee0420ed04" - "20ee046a21ef0420ee0420ef046a21f00420ef0420f0046a21f10420f00420f1046a21f20420f10420f2046a21f304" - "20f20420f3046a21f40420f30420f4046a21f50420f40420f5046a21f60420f50420f6046a21f70420f60420f7046a" - "21f80420f70420f8046a21f90420f80420f9046a21fa0420f90420fa046a21fb0420fa0420fb046a21fc0420fb0420" - "fc046a21fd0420fc0420fd046a21fe0420fd0420fe046a21ff0420fe0420ff046a21800520ff042080056a21810520" - "80052081056a2182052081052082056a2183052082052083056a2184052083052084056a2185052084052085056a21" - "86052085052086056a2187052086052087056a2188052087052088056a2189052088052089056a218a05208905208a" - "056a218b05208a05208b056a218c05208b05208c056a218d05208c05208d056a218e05208d05208e056a218f05208e" - "05208f056a219005208f052090056a2191052090052091056a2192052091052092056a2193052092052093056a2194" - "052093052094056a2195052094052095056a2196052095052096056a2197052096052097056a219805209705209805" - "6a2199052098052099056a219a05209905209a056a219b05209a05209b056a219c05209b05209c056a219d05209c05" - "209d056a219e05209d05209e056a219f05209e05209f056a21a005209f0520a0056a21a10520a00520a1056a21a205" - "20a10520a2056a21a30520a20520a3056a21a40520a30520a4056a21a50520a40520a5056a21a60520a50520a6056a" - "21a70520a60520a7056a21a80520a70520a8056a21a90520a80520a9056a21aa0520a90520aa056a21ab0520aa0520" - "ab056a21ac0520ab0520ac056a21ad0520ac0520ad056a21ae0520ad0520ae056a21af0520ae0520af056a21b00520" - "af0520b0056a21b10520b00520b1056a21b20520b10520b2056a21b30520b20520b3056a21b40520b30520b4056a21" - "b50520b40520b5056a21b60520b50520b6056a21b70520b60520b7056a21b80520b70520b8056a21b90520b80520b9" - "056a21ba0520b90520ba056a21bb0520ba0520bb056a21bc0520bb0520bc056a21bd0520bc0520bd056a21be0520bd" - "0520be056a21bf0520be0520bf056a21c00520bf0520c0056a21c10520c00520c1056a21c20520c10520c2056a21c3" - "0520c20520c3056a21c40520c30520c4056a21c50520c40520c5056a21c60520c50520c6056a21c70520c60520c705" - "6a21c80520c70520c8056a21c90520c80520c9056a21ca0520c90520ca056a21cb0520ca0520cb056a21cc0520cb05" - "20cc056a21cd0520cc0520cd056a21ce0520cd0520ce056a21cf0520ce0520cf056a21d00520cf0520d0056a21d105" - "20d00520d1056a21d20520d10520d2056a21d30520d20520d3056a21d40520d30520d4056a21d50520d40520d5056a" - "21d60520d50520d6056a21d70520d60520d7056a21d80520d70520d8056a21d90520d80520d9056a21da0520d90520" - "da056a21db0520da0520db056a21dc0520db0520dc056a21dd0520dc0520dd056a21de0520dd0520de056a21df0520" - "de0520df056a21e00520df0520e0056a21e10520e00520e1056a21e20520e10520e2056a21e30520e20520e3056a21" - "e40520e30520e4056a21e50520e40520e5056a21e60520e50520e6056a21e70520e60520e7056a21e80520e70520e8" - "056a21e90520e80520e9056a21ea0520e90520ea056a21eb0520ea0520eb056a21ec0520eb0520ec056a21ed0520ec" - "0520ed056a21ee0520ed0520ee056a21ef0520ee0520ef056a21f00520ef0520f0056a21f10520f00520f1056a21f2" - "0520f10520f2056a21f30520f20520f3056a21f40520f30520f4056a21f50520f40520f5056a21f60520f50520f605" - "6a21f70520f60520f7056a21f80520f70520f8056a21f90520f80520f9056a21fa0520f90520fa056a21fb0520fa05" - "20fb056a21fc0520fb0520fc056a21fd0520fc0520fd056a21fe0520fd0520fe056a21ff0520fe0520ff056a218006" - "20ff052080066a2181062080062081066a2182062081062082066a2183062082062083066a2184062083062084066a" - "2185062084062085066a2186062085062086066a2187062086062087066a2188062087062088066a21890620880620" - "89066a218a06208906208a066a218b06208a06208b066a218c06208b06208c066a218d06208c06208d066a218e0620" - "8d06208e066a218f06208e06208f066a219006208f062090066a2191062090062091066a2192062091062092066a21" - "93062092062093066a2194062093062094066a2195062094062095066a2196062095062096066a2197062096062097" - "066a2198062097062098066a2199062098062099066a219a06209906209a066a219b06209a06209b066a219c06209b" - "06209c066a219d06209c06209d066a219e06209d06209e066a219f06209e06209f066a21a006209f0620a0066a21a1" - "0620a00620a1066a21a20620a10620a2066a21a30620a20620a3066a21a40620a30620a4066a21a50620a40620a506" - "6a21a60620a50620a6066a21a70620a60620a7066a21a80620a70620a8066a21a90620a80620a9066a21aa0620a906" - "20aa066a21ab0620aa0620ab066a21ac0620ab0620ac066a21ad0620ac0620ad066a21ae0620ad0620ae066a21af06" - "20ae0620af066a21b00620af0620b0066a21b10620b00620b1066a21b20620b10620b2066a21b30620b20620b3066a" - "21b40620b30620b4066a21b50620b40620b5066a21b60620b50620b6066a21b70620b60620b7066a21b80620b70620" - "b8066a21b90620b80620b9066a21ba0620b90620ba066a21bb0620ba0620bb066a21bc0620bb0620bc066a21bd0620" - "bc0620bd066a21be0620bd0620be066a21bf0620be0620bf066a21c00620bf0620c0066a21c10620c00620c1066a21" - "c20620c10620c2066a21c30620c20620c3066a21c40620c30620c4066a21c50620c40620c5066a21c60620c50620c6" - "066a21c70620c60620c7066a21c80620c70620c8066a21c90620c80620c9066a21ca0620c90620ca066a21cb0620ca" - "0620cb066a21cc0620cb0620cc066a21cd0620cc0620cd066a21ce0620cd0620ce066a21cf0620ce0620cf066a21d0" - "0620cf0620d0066a21d10620d00620d1066a21d20620d10620d2066a21d30620d20620d3066a21d40620d30620d406" - "6a21d50620d40620d5066a21d60620d50620d6066a21d70620d60620d7066a21d80620d70620d8066a21d90620d806" - "20d9066a21da0620d90620da066a21db0620da0620db066a21dc0620db0620dc066a21dd0620dc0620dd066a21de06" - "20dd0620de066a21df0620de0620df066a21e00620df0620e0066a21e10620e00620e1066a21e20620e10620e2066a" - "21e30620e20620e3066a21e40620e30620e4066a21e50620e40620e5066a21e60620e50620e6066a21e70620e60620" - "e7066a21e80620e70620e8066a21e90620e80620e9066a21ea0620e90620ea066a21eb0620ea0620eb066a21ec0620" - "eb0620ec066a21ed0620ec0620ed066a21ee0620ed0620ee066a21ef0620ee0620ef066a21f00620ef0620f0066a21" - "f10620f00620f1066a21f20620f10620f2066a21f30620f20620f3066a21f40620f30620f4066a21f50620f40620f5" - "066a21f60620f50620f6066a21f70620f60620f7066a21f80620f70620f8066a21f90620f80620f9066a21fa0620f9" - "0620fa066a21fb0620fa0620fb066a21fc0620fb0620fc066a21fd0620fc0620fd066a21fe0620fd0620fe066a21ff" - "0620fe0620ff066a21800720ff062080076a2181072080072081076a2182072081072082076a218307208207208307" - "6a2184072083072084076a2185072084072085076a2186072085072086076a2187072086072087076a218807208707" - "2088076a2189072088072089076a218a07208907208a076a218b07208a07208b076a218c07208b07208c076a218d07" - "208c07208d076a218e07208d07208e076a218f07208e07208f076a219007208f072090076a2191072090072091076a" - "2192072091072092076a2193072092072093076a2194072093072094076a2195072094072095076a21960720950720" - "96076a2197072096072097076a2198072097072098076a2199072098072099076a219a07209907209a076a219b0720" - "9a07209b076a219c07209b07209c076a219d07209c07209d076a219e07209d07209e076a219f07209e07209f076a21" - "a007209f0720a0076a21a10720a00720a1076a21a20720a10720a2076a21a30720a20720a3076a21a40720a30720a4" - "076a21a50720a40720a5076a21a60720a50720a6076a21a70720a60720a7076a21a80720a70720a8076a21a90720a8" - "0720a9076a21aa0720a90720aa076a21ab0720aa0720ab076a21ac0720ab0720ac076a21ad0720ac0720ad076a21ae" - "0720ad0720ae076a21af0720ae0720af076a21b00720af0720b0076a21b10720b00720b1076a21b20720b10720b207" - "6a21b30720b20720b3076a21b40720b30720b4076a21b50720b40720b5076a21b60720b50720b6076a21b70720b607" - "20b7076a21b80720b70720b8076a21b90720b80720b9076a21ba0720b90720ba076a21bb0720ba0720bb076a21bc07" - "20bb0720bc076a21bd0720bc0720bd076a21be0720bd0720be076a21bf0720be0720bf076a21c00720bf0720c0076a" - "21c10720c00720c1076a21c20720c10720c2076a21c30720c20720c3076a21c40720c30720c4076a21c50720c40720" - "c5076a21c60720c50720c6076a21c70720c60720c7076a21c80720c70720c8076a21c90720c80720c9076a21ca0720" - "c90720ca076a21cb0720ca0720cb076a21cc0720cb0720cc076a21cd0720cc0720cd076a21ce0720cd0720ce076a21" - "cf0720ce0720cf076a21d00720cf0720d0076a21d10720d00720d1076a21d20720d10720d2076a21d30720d20720d3" - "076a21d40720d30720d4076a21d50720d40720d5076a21d60720d50720d6076a21d70720d60720d7076a21d80720d7" - "0720d8076a21d90720d80720d9076a21da0720d90720da076a21db0720da0720db076a21dc0720db0720dc076a21dd" - "0720dc0720dd076a21de0720dd0720de076a21df0720de0720df076a21e00720df0720e0076a21e10720e00720e107" - "6a21e20720e10720e2076a21e30720e20720e3076a21e40720e30720e4076a21e50720e40720e5076a21e60720e507" - "20e6076a21e70720e60720e7076a21e80720e70720e8076a21e90720e80720e9076a21ea0720e90720ea076a21eb07" - "20ea0720eb076a21ec0720eb0720ec076a21ed0720ec0720ed076a21ee0720ed0720ee076a21ef0720ee0720ef076a" - "21f00720ef0720f0076a21f10720f00720f1076a21f20720f10720f2076a21f30720f20720f3076a21f40720f30720" - "f4076a21f50720f40720f5076a21f60720f50720f6076a21f70720f60720f7076a21f80720f70720f8076a21f90720" - "f80720f9076a21fa0720f90720fa076a21fb0720fa0720fb076a21fc0720fb0720fc076a21fd0720fc0720fd076a21" - "fe0720fd0720fe076a21ff0720fe0720ff076a21800820ff072080086a2181082080082081086a2182082081082082" - "086a2183082082082083086a2184082083082084086a2185082084082085086a2186082085082086086a2187082086" - "082087086a2188082087082088086a2189082088082089086a218a08208908208a086a218b08208a08208b086a218c" - "08208b08208c086a218d08208c08208d086a218e08208d08208e086a218f08208e08208f086a219008208f08209008" - "6a2191082090082091086a2192082091082092086a2193082092082093086a2194082093082094086a219508209408" - "2095086a2196082095082096086a2197082096082097086a2198082097082098086a2199082098082099086a219a08" - "209908209a086a219b08209a08209b086a219c08209b08209c086a219d08209c08209d086a219e08209d08209e086a" - "219f08209e08209f086a21a008209f0820a0086a21a10820a00820a1086a21a20820a10820a2086a21a30820a20820" - "a3086a21a40820a30820a4086a21a50820a40820a5086a21a60820a50820a6086a21a70820a60820a7086a21a80820" - "a70820a8086a21a90820a80820a9086a21aa0820a90820aa086a21ab0820aa0820ab086a21ac0820ab0820ac086a21" - "ad0820ac0820ad086a21ae0820ad0820ae086a21af0820ae0820af086a21b00820af0820b0086a21b10820b00820b1" - "086a21b20820b10820b2086a21b30820b20820b3086a21b40820b30820b4086a21b50820b40820b5086a21b60820b5" - "0820b6086a21b70820b60820b7086a21b80820b70820b8086a21b90820b80820b9086a21ba0820b90820ba086a21bb" - "0820ba0820bb086a21bc0820bb0820bc086a21bd0820bc0820bd086a21be0820bd0820be086a21bf0820be0820bf08" - "6a21c00820bf0820c0086a21c10820c00820c1086a21c20820c10820c2086a21c30820c20820c3086a21c40820c308" - "20c4086a21c50820c40820c5086a21c60820c50820c6086a21c70820c60820c7086a21c80820c70820c8086a21c908" - "20c80820c9086a21ca0820c90820ca086a21cb0820ca0820cb086a21cc0820cb0820cc086a21cd0820cc0820cd086a" - "21ce0820cd0820ce086a21cf0820ce0820cf086a21d00820cf0820d0086a21d10820d00820d1086a21d20820d10820" - "d2086a21d30820d20820d3086a21d40820d30820d4086a21d50820d40820d5086a21d60820d50820d6086a21d70820" - "d60820d7086a21d80820d70820d8086a21d90820d80820d9086a21da0820d90820da086a21db0820da0820db086a21" - "dc0820db0820dc086a21dd0820dc0820dd086a21de0820dd0820de086a21df0820de0820df086a21e00820df0820e0" - "086a21e10820e00820e1086a21e20820e10820e2086a21e30820e20820e3086a21e40820e30820e4086a21e50820e4" - "0820e5086a21e60820e50820e6086a21e70820e60820e7086a21e80820e70820e8086a21e90820e80820e9086a21ea" - "0820e90820ea086a21eb0820ea0820eb086a21ec0820eb0820ec086a21ed0820ec0820ed086a21ee0820ed0820ee08" - "6a21ef0820ee0820ef086a21f00820ef0820f0086a21f10820f00820f1086a21f20820f10820f2086a21f30820f208" - "20f3086a21f40820f30820f4086a21f50820f40820f5086a21f60820f50820f6086a21f70820f60820f7086a21f808" - "20f70820f8086a21f90820f80820f9086a21fa0820f90820fa086a21fb0820fa0820fb086a21fc0820fb0820fc086a" - "21fd0820fc0820fd086a21fe0820fd0820fe086a21ff0820fe0820ff086a21800920ff082080096a21810920800920" - "81096a2182092081092082096a2183092082092083096a2184092083092084096a2185092084092085096a21860920" - "85092086096a2187092086092087096a2188092087092088096a2189092088092089096a218a09208909208a096a21" - "8b09208a09208b096a218c09208b09208c096a218d09208c09208d096a218e09208d09208e096a218f09208e09208f" - "096a219009208f092090096a2191092090092091096a2192092091092092096a2193092092092093096a2194092093" - "092094096a2195092094092095096a2196092095092096096a2197092096092097096a2198092097092098096a2199" - "092098092099096a219a09209909209a096a219b09209a09209b096a219c09209b09209c096a219d09209c09209d09" - "6a219e09209d09209e096a219f09209e09209f096a21a009209f0920a0096a21a10920a00920a1096a21a20920a109" - "20a2096a21a30920a20920a3096a21a40920a30920a4096a21a50920a40920a5096a21a60920a50920a6096a21a709" - "20a60920a7096a21a80920a70920a8096a21a90920a80920a9096a21aa0920a90920aa096a21ab0920aa0920ab096a" - "21ac0920ab0920ac096a21ad0920ac0920ad096a21ae0920ad0920ae096a21af0920ae0920af096a21b00920af0920" - "b0096a21b10920b00920b1096a21b20920b10920b2096a21b30920b20920b3096a21b40920b30920b4096a21b50920" - "b40920b5096a21b60920b50920b6096a21b70920b60920b7096a21b80920b70920b8096a21b90920b80920b9096a21" - "ba0920b90920ba096a21bb0920ba0920bb096a21bc0920bb0920bc096a21bd0920bc0920bd096a21be0920bd0920be" - "096a21bf0920be0920bf096a21c00920bf0920c0096a21c10920c00920c1096a21c20920c10920c2096a21c30920c2" - "0920c3096a21c40920c30920c4096a21c50920c40920c5096a21c60920c50920c6096a21c70920c60920c7096a21c8" - "0920c70920c8096a21c90920c80920c9096a21ca0920c90920ca096a21cb0920ca0920cb096a21cc0920cb0920cc09" - "6a21cd0920cc0920cd096a21ce0920cd0920ce096a21cf0920ce0920cf096a21d00920cf0920d0096a21d10920d009" - "20d1096a21d20920d10920d2096a21d30920d20920d3096a21d40920d30920d4096a21d50920d40920d5096a21d609" - "20d50920d6096a21d70920d60920d7096a21d80920d70920d8096a21d90920d80920d9096a21da0920d90920da096a" - "21db0920da0920db096a21dc0920db0920dc096a21dd0920dc0920dd096a21de0920dd0920de096a21df0920de0920" - "df096a21e00920df0920e0096a21e10920e00920e1096a21e20920e10920e2096a21e30920e20920e3096a21e40920" - "e30920e4096a21e50920e40920e5096a21e60920e50920e6096a21e70920e60920e7096a21e80920e70920e8096a21" - "e90920e80920e9096a21ea0920e90920ea096a21eb0920ea0920eb096a21ec0920eb0920ec096a21ed0920ec0920ed" - "096a21ee0920ed0920ee096a21ef0920ee0920ef096a21f00920ef0920f0096a21f10920f00920f1096a21f20920f1" - "0920f2096a21f30920f20920f3096a21f40920f30920f4096a21f50920f40920f5096a21f60920f50920f6096a21f7" - "0920f60920f7096a21f80920f70920f8096a21f90920f80920f9096a21fa0920f90920fa096a21fb0920fa0920fb09" - "6a21fc0920fb0920fc096a21fd0920fc0920fd096a21fe0920fd0920fe096a21ff0920fe0920ff096a21800a20ff09" - "20800a6a21810a20800a20810a6a21820a20810a20820a6a21830a20820a20830a6a21840a20830a20840a6a21850a" - "20840a20850a6a21860a20850a20860a6a21870a20860a20870a6a21880a20870a20880a6a21890a20880a20890a6a" - "218a0a20890a208a0a6a218b0a208a0a208b0a6a218c0a208b0a208c0a6a218d0a208c0a208d0a6a218e0a208d0a20" - "8e0a6a218f0a208e0a208f0a6a21900a208f0a20900a6a21910a20900a20910a6a21920a20910a20920a6a21930a20" - "920a20930a6a21940a20930a20940a6a21950a20940a20950a6a21960a20950a20960a6a21970a20960a20970a6a21" - "980a20970a20980a6a21990a20980a20990a6a219a0a20990a209a0a6a219b0a209a0a209b0a6a219c0a209b0a209c" - "0a6a219d0a209c0a209d0a6a219e0a209d0a209e0a6a219f0a209e0a209f0a6a21a00a209f0a20a00a6a21a10a20a0" - "0a20a10a6a21a20a20a10a20a20a6a21a30a20a20a20a30a6a21a40a20a30a20a40a6a21a50a20a40a20a50a6a21a6" - "0a20a50a20a60a6a21a70a20a60a20a70a6a21a80a20a70a20a80a6a21a90a20a80a20a90a6a21aa0a20a90a20aa0a" - "6a21ab0a20aa0a20ab0a6a21ac0a20ab0a20ac0a6a21ad0a20ac0a20ad0a6a21ae0a20ad0a20ae0a6a21af0a20ae0a" - "20af0a6a21b00a20af0a20b00a6a21b10a20b00a20b10a6a21b20a20b10a20b20a6a21b30a20b20a20b30a6a21b40a" - "20b30a20b40a6a21b50a20b40a20b50a6a21b60a20b50a20b60a6a21b70a20b60a20b70a6a21b80a20b70a20b80a6a" - "21b90a20b80a20b90a6a21ba0a20b90a20ba0a6a21bb0a20ba0a20bb0a6a21bc0a20bb0a20bc0a6a21bd0a20bc0a20" - "bd0a6a21be0a20bd0a20be0a6a21bf0a20be0a20bf0a6a21c00a20bf0a20c00a6a21c10a20c00a20c10a6a21c20a20" - "c10a20c20a6a21c30a20c20a20c30a6a21c40a20c30a20c40a6a21c50a20c40a20c50a6a21c60a20c50a20c60a6a21" - "c70a20c60a20c70a6a21c80a20c70a20c80a6a21c90a20c80a20c90a6a21ca0a20c90a20ca0a6a21cb0a20ca0a20cb" - "0a6a21cc0a20cb0a20cc0a6a21cd0a20cc0a20cd0a6a21ce0a20cd0a20ce0a6a21cf0a20ce0a20cf0a6a21d00a20cf" - "0a20d00a6a21d10a20d00a20d10a6a21d20a20d10a20d20a6a21d30a20d20a20d30a6a21d40a20d30a20d40a6a21d5" - "0a20d40a20d50a6a21d60a20d50a20d60a6a21d70a20d60a20d70a6a21d80a20d70a20d80a6a21d90a20d80a20d90a" - "6a21da0a20d90a20da0a6a21db0a20da0a20db0a6a21dc0a20db0a20dc0a6a21dd0a20dc0a20dd0a6a21de0a20dd0a" - "20de0a6a21df0a20de0a20df0a6a21e00a20df0a20e00a6a21e10a20e00a20e10a6a21e20a20e10a20e20a6a21e30a" - "20e20a20e30a6a21e40a20e30a20e40a6a21e50a20e40a20e50a6a21e60a20e50a20e60a6a21e70a20e60a20e70a6a" - "21e80a20e70a20e80a6a21e90a20e80a20e90a6a21ea0a20e90a20ea0a6a21eb0a20ea0a20eb0a6a21ec0a20eb0a20" - "ec0a6a21ed0a20ec0a20ed0a6a21ee0a20ed0a20ee0a6a21ef0a20ee0a20ef0a6a21f00a20ef0a20f00a6a21f10a20" - "f00a20f10a6a21f20a20f10a20f20a6a21f30a20f20a20f30a6a21f40a20f30a20f40a6a21f50a20f40a20f50a6a21" - "f60a20f50a20f60a6a21f70a20f60a20f70a6a21f80a20f70a20f80a6a21f90a20f80a20f90a6a21fa0a20f90a20fa" - "0a6a21fb0a20fa0a20fb0a6a21fc0a20fb0a20fc0a6a21fd0a20fc0a20fd0a6a21fe0a20fd0a20fe0a6a21ff0a20fe" - "0a20ff0a6a21800b20ff0a20800b6a21810b20800b20810b6a21820b20810b20820b6a21830b20820b20830b6a2184" - "0b20830b20840b6a21850b20840b20850b6a21860b20850b20860b6a21870b20860b20870b6a21880b20870b20880b" - "6a21890b20880b20890b6a218a0b20890b208a0b6a218b0b208a0b208b0b6a218c0b208b0b208c0b6a218d0b208c0b" - "208d0b6a218e0b208d0b208e0b6a218f0b208e0b208f0b6a21900b208f0b20900b6a21910b20900b20910b6a21920b" - "20910b20920b6a21930b20920b20930b6a21940b20930b20940b6a21950b20940b20950b6a21960b20950b20960b6a" - "21970b20960b20970b6a21980b20970b20980b6a21990b20980b20990b6a219a0b20990b209a0b6a219b0b209a0b20" - "9b0b6a219c0b209b0b209c0b6a219d0b209c0b209d0b6a219e0b209d0b209e0b6a219f0b209e0b209f0b6a21a00b20" - "9f0b20a00b6a21a10b20a00b20a10b6a21a20b20a10b20a20b6a21a30b20a20b20a30b6a21a40b20a30b20a40b6a21" - "a50b20a40b20a50b6a21a60b20a50b20a60b6a21a70b20a60b20a70b6a21a80b20a70b20a80b6a21a90b20a80b20a9" - "0b6a21aa0b20a90b20aa0b6a21ab0b20aa0b20ab0b6a21ac0b20ab0b20ac0b6a21ad0b20ac0b20ad0b6a21ae0b20ad" - "0b20ae0b6a21af0b20ae0b20af0b6a21b00b20af0b20b00b6a21b10b20b00b20b10b6a21b20b20b10b20b20b6a21b3" - "0b20b20b20b30b6a21b40b20b30b20b40b6a21b50b20b40b20b50b6a21b60b20b50b20b60b6a21b70b20b60b20b70b" - "6a21b80b20b70b20b80b6a21b90b20b80b20b90b6a21ba0b20b90b20ba0b6a21bb0b20ba0b20bb0b6a21bc0b20bb0b" - "20bc0b6a21bd0b20bc0b20bd0b6a21be0b20bd0b20be0b6a21bf0b20be0b20bf0b6a21c00b20bf0b20c00b6a21c10b" - "20c00b20c10b6a21c20b20c10b20c20b6a21c30b20c20b20c30b6a21c40b20c30b20c40b6a21c50b20c40b20c50b6a" - "21c60b20c50b20c60b6a21c70b20c60b20c70b6a21c80b20c70b20c80b6a21c90b20c80b20c90b6a21ca0b20c90b20" - "ca0b6a21cb0b20ca0b20cb0b6a21cc0b20cb0b20cc0b6a21cd0b20cc0b20cd0b6a21ce0b20cd0b20ce0b6a21cf0b20" - "ce0b20cf0b6a21d00b20cf0b20d00b6a21d10b20d00b20d10b6a21d20b20d10b20d20b6a21d30b20d20b20d30b6a21" - "d40b20d30b20d40b6a21d50b20d40b20d50b6a21d60b20d50b20d60b6a21d70b20d60b20d70b6a21d80b20d70b20d8" - "0b6a21d90b20d80b20d90b6a21da0b20d90b20da0b6a21db0b20da0b20db0b6a21dc0b20db0b20dc0b6a21dd0b20dc" - "0b20dd0b6a21de0b20dd0b20de0b6a21df0b20de0b20df0b6a21e00b20df0b20e00b6a21e10b20e00b20e10b6a21e2" - "0b20e10b20e20b6a21e30b20e20b20e30b6a21e40b20e30b20e40b6a21e50b20e40b20e50b6a21e60b20e50b20e60b" - "6a21e70b20e60b20e70b6a21e80b20e70b20e80b6a21e90b20e80b20e90b6a21ea0b20e90b20ea0b6a21eb0b20ea0b" - "20eb0b6a21ec0b20eb0b20ec0b6a21ed0b20ec0b20ed0b6a21ee0b20ed0b20ee0b6a21ef0b20ee0b20ef0b6a21f00b" - "20ef0b20f00b6a21f10b20f00b20f10b6a21f20b20f10b20f20b6a21f30b20f20b20f30b6a21f40b20f30b20f40b6a" - "21f50b20f40b20f50b6a21f60b20f50b20f60b6a21f70b20f60b20f70b6a21f80b20f70b20f80b6a21f90b20f80b20" - "f90b6a21fa0b20f90b20fa0b6a21fb0b20fa0b20fb0b6a21fc0b20fb0b20fc0b6a21fd0b20fc0b20fd0b6a21fe0b20" - "fd0b20fe0b6a21ff0b20fe0b20ff0b6a21800c20ff0b20800c6a21810c20800c20810c6a21820c20810c20820c6a21" - "830c20820c20830c6a21840c20830c20840c6a21850c20840c20850c6a21860c20850c20860c6a21870c20860c2087" - "0c6a21880c20870c20880c6a21890c20880c20890c6a218a0c20890c208a0c6a218b0c208a0c208b0c6a218c0c208b" - "0c208c0c6a218d0c208c0c208d0c6a218e0c208d0c208e0c6a218f0c208e0c208f0c6a21900c208f0c20900c6a2191" - "0c20900c20910c6a21920c20910c20920c6a21930c20920c20930c6a21940c20930c20940c6a21950c20940c20950c" - "6a21960c20950c20960c6a21970c20960c20970c6a21980c20970c20980c6a21990c20980c20990c6a219a0c20990c" - "209a0c6a219b0c209a0c209b0c6a219c0c209b0c209c0c6a219d0c209c0c209d0c6a219e0c209d0c209e0c6a219f0c" - "209e0c209f0c6a21a00c209f0c20a00c6a21a10c20a00c20a10c6a21a20c20a10c20a20c6a21a30c20a20c20a30c6a" - "21a40c20a30c20a40c6a21a50c20a40c20a50c6a21a60c20a50c20a60c6a21a70c20a60c20a70c6a21a80c20a70c20" - "a80c6a21a90c20a80c20a90c6a21aa0c20a90c20aa0c6a21ab0c20aa0c20ab0c6a21ac0c20ab0c20ac0c6a21ad0c20" - "ac0c20ad0c6a21ae0c20ad0c20ae0c6a21af0c20ae0c20af0c6a21b00c20af0c20b00c6a21b10c20b00c20b10c6a21" - "b20c20b10c20b20c6a21b30c20b20c20b30c6a21b40c20b30c20b40c6a21b50c20b40c20b50c6a21b60c20b50c20b6" - "0c6a21b70c20b60c20b70c6a21b80c20b70c20b80c6a21b90c20b80c20b90c6a21ba0c20b90c20ba0c6a21bb0c20ba" - "0c20bb0c6a21bc0c20bb0c20bc0c6a21bd0c20bc0c20bd0c6a21be0c20bd0c20be0c6a21bf0c20be0c20bf0c6a21c0" - "0c20bf0c20c00c6a21c10c20c00c20c10c6a21c20c20c10c20c20c6a21c30c20c20c20c30c6a21c40c20c30c20c40c" - "6a21c50c20c40c20c50c6a21c60c20c50c20c60c6a21c70c20c60c20c70c6a21c80c20c70c20c80c6a21c90c20c80c" - "20c90c6a21ca0c20c90c20ca0c6a21cb0c20ca0c20cb0c6a21cc0c20cb0c20cc0c6a21cd0c20cc0c20cd0c6a21ce0c" - "20cd0c20ce0c6a21cf0c20ce0c20cf0c6a21d00c20cf0c20d00c6a21d10c20d00c20d10c6a21d20c20d10c20d20c6a" - "21d30c20d20c20d30c6a21d40c20d30c20d40c6a21d50c20d40c20d50c6a21d60c20d50c20d60c6a21d70c20d60c20" - "d70c6a21d80c20d70c20d80c6a21d90c20d80c20d90c6a21da0c20d90c20da0c6a21db0c20da0c20db0c6a21dc0c20" - "db0c20dc0c6a21dd0c20dc0c20dd0c6a21de0c20dd0c20de0c6a21df0c20de0c20df0c6a21e00c20df0c20e00c6a21" - "e10c20e00c20e10c6a21e20c20e10c20e20c6a21e30c20e20c20e30c6a21e40c20e30c20e40c6a21e50c20e40c20e5" - "0c6a21e60c20e50c20e60c6a21e70c20e60c20e70c6a21e80c20e70c20e80c6a21e90c20e80c20e90c6a21ea0c20e9" - "0c20ea0c6a21eb0c20ea0c20eb0c6a21ec0c20eb0c20ec0c6a21ed0c20ec0c20ed0c6a21ee0c20ed0c20ee0c6a21ef" - "0c20ee0c20ef0c6a21f00c20ef0c20f00c6a21f10c20f00c20f10c6a21f20c20f10c20f20c6a21f30c20f20c20f30c" - "6a21f40c20f30c20f40c6a21f50c20f40c20f50c6a21f60c20f50c20f60c6a21f70c20f60c20f70c6a21f80c20f70c" - "20f80c6a21f90c20f80c20f90c6a21fa0c20f90c20fa0c6a21fb0c20fa0c20fb0c6a21fc0c20fb0c20fc0c6a21fd0c" - "20fc0c20fd0c6a21fe0c20fd0c20fe0c6a21ff0c20fe0c20ff0c6a21800d20ff0c20800d6a21810d20800d20810d6a" - "21820d20810d20820d6a21830d20820d20830d6a21840d20830d20840d6a21850d20840d20850d6a21860d20850d20" - "860d6a21870d20860d20870d6a21880d20870d20880d6a21890d20880d20890d6a218a0d20890d208a0d6a218b0d20" - "8a0d208b0d6a218c0d208b0d208c0d6a218d0d208c0d208d0d6a218e0d208d0d208e0d6a218f0d208e0d208f0d6a21" - "900d208f0d20900d6a21910d20900d20910d6a21920d20910d20920d6a21930d20920d20930d6a21940d20930d2094" - "0d6a21950d20940d20950d6a21960d20950d20960d6a21970d20960d20970d6a21980d20970d20980d6a21990d2098" - "0d20990d6a219a0d20990d209a0d6a219b0d209a0d209b0d6a219c0d209b0d209c0d6a219d0d209c0d209d0d6a219e" - "0d209d0d209e0d6a219f0d209e0d209f0d6a21a00d209f0d20a00d6a21a10d20a00d20a10d6a21a20d20a10d20a20d" - "6a21a30d20a20d20a30d6a21a40d20a30d20a40d6a21a50d20a40d20a50d6a21a60d20a50d20a60d6a21a70d20a60d" - "20a70d6a21a80d20a70d20a80d6a21a90d20a80d20a90d6a21aa0d20a90d20aa0d6a21ab0d20aa0d20ab0d6a21ac0d" - "20ab0d20ac0d6a21ad0d20ac0d20ad0d6a21ae0d20ad0d20ae0d6a21af0d20ae0d20af0d6a21b00d20af0d20b00d6a" - "21b10d20b00d20b10d6a21b20d20b10d20b20d6a21b30d20b20d20b30d6a21b40d20b30d20b40d6a21b50d20b40d20" - "b50d6a21b60d20b50d20b60d6a21b70d20b60d20b70d6a21b80d20b70d20b80d6a21b90d20b80d20b90d6a21ba0d20" - "b90d20ba0d6a21bb0d20ba0d20bb0d6a21bc0d20bb0d20bc0d6a21bd0d20bc0d20bd0d6a21be0d20bd0d20be0d6a21" - "bf0d20be0d20bf0d6a21c00d20bf0d20c00d6a21c10d20c00d20c10d6a21c20d20c10d20c20d6a21c30d20c20d20c3" - "0d6a21c40d20c30d20c40d6a21c50d20c40d20c50d6a21c60d20c50d20c60d6a21c70d20c60d20c70d6a21c80d20c7" - "0d20c80d6a21c90d20c80d20c90d6a21ca0d20c90d20ca0d6a21cb0d20ca0d20cb0d6a21cc0d20cb0d20cc0d6a21cd" - "0d20cc0d20cd0d6a21ce0d20cd0d20ce0d6a21cf0d20ce0d20cf0d6a21d00d20cf0d20d00d6a21d10d20d00d20d10d" - "6a21d20d20d10d20d20d6a21d30d20d20d20d30d6a21d40d20d30d20d40d6a21d50d20d40d20d50d6a21d60d20d50d" - "20d60d6a21d70d20d60d20d70d6a21d80d20d70d20d80d6a21d90d20d80d20d90d6a21da0d20d90d20da0d6a21db0d" - "20da0d20db0d6a21dc0d20db0d20dc0d6a21dd0d20dc0d20dd0d6a21de0d20dd0d20de0d6a21df0d20de0d20df0d6a" - "21e00d20df0d20e00d6a21e10d20e00d20e10d6a21e20d20e10d20e20d6a21e30d20e20d20e30d6a21e40d20e30d20" - "e40d6a21e50d20e40d20e50d6a21e60d20e50d20e60d6a21e70d20e60d20e70d6a21e80d20e70d20e80d6a21e90d20" - "e80d20e90d6a21ea0d20e90d20ea0d6a21eb0d20ea0d20eb0d6a21ec0d20eb0d20ec0d6a21ed0d20ec0d20ed0d6a21" - "ee0d20ed0d20ee0d6a21ef0d20ee0d20ef0d6a21f00d20ef0d20f00d6a21f10d20f00d20f10d6a21f20d20f10d20f2" - "0d6a21f30d20f20d20f30d6a21f40d20f30d20f40d6a21f50d20f40d20f50d6a21f60d20f50d20f60d6a21f70d20f6" - "0d20f70d6a21f80d20f70d20f80d6a21f90d20f80d20f90d6a21fa0d20f90d20fa0d6a21fb0d20fa0d20fb0d6a21fc" - "0d20fb0d20fc0d6a21fd0d20fc0d20fd0d6a21fe0d20fd0d20fe0d6a21ff0d20fe0d20ff0d6a21800e20ff0d20800e" - "6a21810e20800e20810e6a21820e20810e20820e6a21830e20820e20830e6a21840e20830e20840e6a21850e20840e" - "20850e6a21860e20850e20860e6a21870e20860e20870e6a21880e20870e20880e6a21890e20880e20890e6a218a0e" - "20890e208a0e6a218b0e208a0e208b0e6a218c0e208b0e208c0e6a218d0e208c0e208d0e6a218e0e208d0e208e0e6a" - "218f0e208e0e208f0e6a21900e208f0e20900e6a21910e20900e20910e6a21920e20910e20920e6a21930e20920e20" - "930e6a21940e20930e20940e6a21950e20940e20950e6a21960e20950e20960e6a21970e20960e20970e6a21980e20" - "970e20980e6a21990e20980e20990e6a219a0e20990e209a0e6a219b0e209a0e209b0e6a219c0e209b0e209c0e6a21" - "9d0e209c0e209d0e6a219e0e209d0e209e0e6a219f0e209e0e209f0e6a21a00e209f0e20a00e6a21a10e20a00e20a1" - "0e6a21a20e20a10e20a20e6a21a30e20a20e20a30e6a21a40e20a30e20a40e6a21a50e20a40e20a50e6a21a60e20a5" - "0e20a60e6a21a70e20a60e20a70e6a21a80e20a70e20a80e6a21a90e20a80e20a90e6a21aa0e20a90e20aa0e6a21ab" - "0e20aa0e20ab0e6a21ac0e20ab0e20ac0e6a21ad0e20ac0e20ad0e6a21ae0e20ad0e20ae0e6a21af0e20ae0e20af0e" - "6a21b00e20af0e20b00e6a21b10e20b00e20b10e6a21b20e20b10e20b20e6a21b30e20b20e20b30e6a21b40e20b30e" - "20b40e6a21b50e20b40e20b50e6a21b60e20b50e20b60e6a21b70e20b60e20b70e6a21b80e20b70e20b80e6a21b90e" - "20b80e20b90e6a21ba0e20b90e20ba0e6a21bb0e20ba0e20bb0e6a21bc0e20bb0e20bc0e6a21bd0e20bc0e20bd0e6a" - "21be0e20bd0e20be0e6a21bf0e20be0e20bf0e6a21c00e20bf0e20c00e6a21c10e20c00e20c10e6a21c20e20c10e20" - "c20e6a21c30e20c20e20c30e6a21c40e20c30e20c40e6a21c50e20c40e20c50e6a21c60e20c50e20c60e6a21c70e20" - "c60e20c70e6a21c80e20c70e20c80e6a21c90e20c80e20c90e6a21ca0e20c90e20ca0e6a21cb0e20ca0e20cb0e6a21" - "cc0e20cb0e20cc0e6a21cd0e20cc0e20cd0e6a21ce0e20cd0e20ce0e6a21cf0e20ce0e20cf0e6a21d00e20cf0e20d0" - "0e6a21d10e20d00e20d10e6a21d20e20d10e20d20e6a21d30e20d20e20d30e6a21d40e20d30e20d40e6a21d50e20d4" - "0e20d50e6a21d60e20d50e20d60e6a21d70e20d60e20d70e6a21d80e20d70e20d80e6a21d90e20d80e20d90e6a21da" - "0e20d90e20da0e6a21db0e20da0e20db0e6a21dc0e20db0e20dc0e6a21dd0e20dc0e20dd0e6a21de0e20dd0e20de0e" - "6a21df0e20de0e20df0e6a21e00e20df0e20e00e6a21e10e20e00e20e10e6a21e20e20e10e20e20e6a21e30e20e20e" - "20e30e6a21e40e20e30e20e40e6a21e50e20e40e20e50e6a21e60e20e50e20e60e6a21e70e20e60e20e70e6a21e80e" - "20e70e20e80e6a21e90e20e80e20e90e6a21ea0e20e90e20ea0e6a21eb0e20ea0e20eb0e6a21ec0e20eb0e20ec0e6a" - "21ed0e20ec0e20ed0e6a21ee0e20ed0e20ee0e6a21ef0e20ee0e20ef0e6a21f00e20ef0e20f00e6a21f10e20f00e20" - "f10e6a21f20e20f10e20f20e6a21f30e20f20e20f30e6a21f40e20f30e20f40e6a21f50e20f40e20f50e6a21f60e20" - "f50e20f60e6a21f70e20f60e20f70e6a21f80e20f70e20f80e6a21f90e20f80e20f90e6a21fa0e20f90e20fa0e6a21" - "fb0e20fa0e20fb0e6a21fc0e20fb0e20fc0e6a21fd0e20fc0e20fd0e6a21fe0e20fd0e20fe0e6a21ff0e20fe0e20ff" - "0e6a21800f20ff0e20800f6a21810f20800f20810f6a21820f20810f20820f6a21830f20820f20830f6a21840f2083" - "0f20840f6a21850f20840f20850f6a21860f20850f20860f6a21870f20860f20870f6a21880f20870f20880f6a2189" - "0f20880f20890f6a218a0f20890f208a0f6a218b0f208a0f208b0f6a218c0f208b0f208c0f6a218d0f208c0f208d0f" - "6a218e0f208d0f208e0f6a218f0f208e0f208f0f6a21900f208f0f20900f6a21910f20900f20910f6a21920f20910f" - "20920f6a21930f20920f20930f6a21940f20930f20940f6a21950f20940f20950f6a21960f20950f20960f6a21970f" - "20960f20970f6a21980f20970f20980f6a21990f20980f20990f6a219a0f20990f209a0f6a219b0f209a0f209b0f6a" - "219c0f209b0f209c0f6a219d0f209c0f209d0f6a219e0f209d0f209e0f6a219f0f209e0f209f0f6a21a00f209f0f20" - "a00f6a21a10f20a00f20a10f6a21a20f20a10f20a20f6a21a30f20a20f20a30f6a21a40f20a30f20a40f6a21a50f20" - "a40f20a50f6a21a60f20a50f20a60f6a21a70f20a60f20a70f6a21a80f20a70f20a80f6a21a90f20a80f20a90f6a21" - "aa0f20a90f20aa0f6a21ab0f20aa0f20ab0f6a21ac0f20ab0f20ac0f6a21ad0f20ac0f20ad0f6a21ae0f20ad0f20ae" - "0f6a21af0f20ae0f20af0f6a21b00f20af0f20b00f6a21b10f20b00f20b10f6a21b20f20b10f20b20f6a21b30f20b2" - "0f20b30f6a21b40f20b30f20b40f6a21b50f20b40f20b50f6a21b60f20b50f20b60f6a21b70f20b60f20b70f6a21b8" - "0f20b70f20b80f6a21b90f20b80f20b90f6a21ba0f20b90f20ba0f6a21bb0f20ba0f20bb0f6a21bc0f20bb0f20bc0f" - "6a21bd0f20bc0f20bd0f6a21be0f20bd0f20be0f6a21bf0f20be0f20bf0f6a21c00f20bf0f20c00f6a21c10f20c00f" - "20c10f6a21c20f20c10f20c20f6a21c30f20c20f20c30f6a21c40f20c30f20c40f6a21c50f20c40f20c50f6a21c60f" - "20c50f20c60f6a21c70f20c60f20c70f6a21c80f20c70f20c80f6a21c90f20c80f20c90f6a21ca0f20c90f20ca0f6a" - "21cb0f20ca0f20cb0f6a21cc0f20cb0f20cc0f6a21cd0f20cc0f20cd0f6a21ce0f20cd0f20ce0f6a21cf0f20ce0f20" - "cf0f6a21d00f20cf0f20d00f6a21d10f20d00f20d10f6a21d20f20d10f20d20f6a21d30f20d20f20d30f6a21d40f20" - "d30f20d40f6a21d50f20d40f20d50f6a21d60f20d50f20d60f6a21d70f20d60f20d70f6a21d80f20d70f20d80f6a21" - "d90f20d80f20d90f6a21da0f20d90f20da0f6a21db0f20da0f20db0f6a21dc0f20db0f20dc0f6a21dd0f20dc0f20dd" - "0f6a21de0f20dd0f20de0f6a21df0f20de0f20df0f6a21e00f20df0f20e00f6a21e10f20e00f20e10f6a21e20f20e1" - "0f20e20f6a21e30f20e20f20e30f6a21e40f20e30f20e40f6a21e50f20e40f20e50f6a21e60f20e50f20e60f6a21e7" - "0f20e60f20e70f6a21e80f20e70f20e80f6a21e90f20e80f20e90f6a21ea0f20e90f20ea0f6a21eb0f20ea0f20eb0f" - "6a21ec0f20eb0f20ec0f6a21ed0f20ec0f20ed0f6a21ee0f20ed0f20ee0f6a21ef0f20ee0f20ef0f6a21f00f20ef0f" - "20f00f6a21f10f20f00f20f10f6a21f20f20f10f20f20f6a21f30f20f20f20f30f6a21f40f20f30f20f40f6a21f50f" - "20f40f20f50f6a21f60f20f50f20f60f6a21f70f20f60f20f70f6a21f80f20f70f20f80f6a21f90f20f80f20f90f6a" - "21fa0f20f90f20fa0f6a21fb0f20fa0f20fb0f6a21fc0f20fb0f20fc0f6a21fd0f20fc0f20fd0f6a21fe0f20fd0f20" - "fe0f6a21ff0f20fe0f20ff0f6a21801020ff0f2080106a2181102080102081106a2182102081102082106a21831020" - "82102083106a2184102083102084106a2185102084102085106a2186102085102086106a2187102086102087106a21" - "88102087102088106a2189102088102089106a218a10208910208a106a218b10208a10208b106a218c10208b10208c" - "106a218d10208c10208d106a218e10208d10208e106a218f10208e10208f106a219010208f102090106a2191102090" - "102091106a2192102091102092106a2193102092102093106a2194102093102094106a2195102094102095106a2196" - "102095102096106a2197102096102097106a2198102097102098106a2199102098102099106a219a10209910209a10" - "6a219b10209a10209b106a219c10209b10209c106a219d10209c10209d106a219e10209d10209e106a219f10209e10" - "209f106a21a010209f1020a0106a21a11020a01020a1106a21a21020a11020a2106a21a31020a21020a3106a21a410" - "20a31020a4106a21a51020a41020a5106a21a61020a51020a6106a21a71020a61020a7106a21a81020a71020a8106a" - "21a91020a81020a9106a21aa1020a91020aa106a21ab1020aa1020ab106a21ac1020ab1020ac106a21ad1020ac1020" - "ad106a21ae1020ad1020ae106a21af1020ae1020af106a21b01020af1020b0106a21b11020b01020b1106a21b21020" - "b11020b2106a21b31020b21020b3106a21b41020b31020b4106a21b51020b41020b5106a21b61020b51020b6106a21" - "b71020b61020b7106a21b81020b71020b8106a21b91020b81020b9106a21ba1020b91020ba106a21bb1020ba1020bb" - "106a21bc1020bb1020bc106a21bd1020bc1020bd106a21be1020bd1020be106a21bf1020be1020bf106a21c01020bf" - "1020c0106a21c11020c01020c1106a21c21020c11020c2106a21c31020c21020c3106a21c41020c31020c4106a21c5" - "1020c41020c5106a21c61020c51020c6106a21c71020c61020c7106a21c81020c71020c8106a21c91020c81020c910" - "6a21ca1020c91020ca106a21cb1020ca1020cb106a21cc1020cb1020cc106a21cd1020cc1020cd106a21ce1020cd10" - "20ce106a21cf1020ce1020cf106a21d01020cf1020d0106a21d11020d01020d1106a21d21020d11020d2106a21d310" - "20d21020d3106a21d41020d31020d4106a21d51020d41020d5106a21d61020d51020d6106a21d71020d61020d7106a" - "21d81020d71020d8106a21d91020d81020d9106a21da1020d91020da106a21db1020da1020db106a21dc1020db1020" - "dc106a21dd1020dc1020dd106a21de1020dd1020de106a21df1020de1020df106a21e01020df1020e0106a21e11020" - "e01020e1106a21e21020e11020e2106a21e31020e21020e3106a21e41020e31020e4106a21e51020e41020e5106a21" - "e61020e51020e6106a21e71020e61020e7106a21e81020e71020e8106a21e91020e81020e9106a21ea1020e91020ea" - "106a21eb1020ea1020eb106a21ec1020eb1020ec106a21ed1020ec1020ed106a21ee1020ed1020ee106a21ef1020ee" - "1020ef106a21f01020ef1020f0106a21f11020f01020f1106a21f21020f11020f2106a21f31020f21020f3106a21f4" - "1020f31020f4106a21f51020f41020f5106a21f61020f51020f6106a21f71020f61020f7106a21f81020f71020f810" - "6a21f91020f81020f9106a21fa1020f91020fa106a21fb1020fa1020fb106a21fc1020fb1020fc106a21fd1020fc10" - "20fd106a21fe1020fd1020fe106a21ff1020fe1020ff106a21801120ff102080116a2181112080112081116a218211" - "2081112082116a2183112082112083116a2184112083112084116a2185112084112085116a2186112085112086116a" - "2187112086112087116a2188112087112088116a2189112088112089116a218a11208911208a116a218b11208a1120" - "8b116a218c11208b11208c116a218d11208c11208d116a218e11208d11208e116a218f11208e11208f116a21901120" - "8f112090116a2191112090112091116a2192112091112092116a2193112092112093116a2194112093112094116a21" - "95112094112095116a2196112095112096116a2197112096112097116a2198112097112098116a2199112098112099" - "116a219a11209911209a116a219b11209a11209b116a219c11209b11209c116a219d11209c11209d116a219e11209d" - "11209e116a219f11209e11209f116a21a011209f1120a0116a21a11120a01120a1116a21a21120a11120a2116a21a3" - "1120a21120a3116a21a41120a31120a4116a21a51120a41120a5116a21a61120a51120a6116a21a71120a61120a711" - "6a21a81120a71120a8116a21a91120a81120a9116a21aa1120a91120aa116a21ab1120aa1120ab116a21ac1120ab11" - "20ac116a21ad1120ac1120ad116a21ae1120ad1120ae116a21af1120ae1120af116a21b01120af1120b0116a21b111" - "20b01120b1116a21b21120b11120b2116a21b31120b21120b3116a21b41120b31120b4116a21b51120b41120b5116a" - "21b61120b51120b6116a21b71120b61120b7116a21b81120b71120b8116a21b91120b81120b9116a21ba1120b91120" - "ba116a21bb1120ba1120bb116a21bc1120bb1120bc116a21bd1120bc1120bd116a21be1120bd1120be116a21bf1120" - "be1120bf116a21c01120bf1120c0116a21c11120c01120c1116a21c21120c11120c2116a21c31120c21120c3116a21" - "c41120c31120c4116a21c51120c41120c5116a21c61120c51120c6116a21c71120c61120c7116a21c81120c71120c8" - "116a21c91120c81120c9116a21ca1120c91120ca116a21cb1120ca1120cb116a21cc1120cb1120cc116a21cd1120cc" - "1120cd116a21ce1120cd1120ce116a21cf1120ce1120cf116a21d01120cf1120d0116a21d11120d01120d1116a21d2" - "1120d11120d2116a21d31120d21120d3116a21d41120d31120d4116a21d51120d41120d5116a21d61120d51120d611" - "6a21d71120d61120d7116a21d81120d71120d8116a21d91120d81120d9116a21da1120d91120da116a21db1120da11" - "20db116a21dc1120db1120dc116a21dd1120dc1120dd116a21de1120dd1120de116a21df1120de1120df116a21e011" - "20df1120e0116a21e11120e01120e1116a21e21120e11120e2116a21e31120e21120e3116a21e41120e31120e4116a" - "21e51120e41120e5116a21e61120e51120e6116a21e71120e61120e7116a21e81120e71120e8116a21e91120e81120" - "e9116a21ea1120e91120ea116a21eb1120ea1120eb116a21ec1120eb1120ec116a21ed1120ec1120ed116a21ee1120" - "ed1120ee116a21ef1120ee1120ef116a21f01120ef1120f0116a21f11120f01120f1116a21f21120f11120f2116a21" - "f31120f21120f3116a21f41120f31120f4116a21f51120f41120f5116a21f61120f51120f6116a21f71120f61120f7" - "116a21f81120f71120f8116a21f91120f81120f9116a21fa1120f91120fa116a21fb1120fa1120fb116a21fc1120fb" - "1120fc116a21fd1120fc1120fd116a21fe1120fd1120fe116a21ff1120fe1120ff116a21801220ff112080126a2181" - "122080122081126a2182122081122082126a2183122082122083126a2184122083122084126a218512208412208512" - "6a2186122085122086126a2187122086122087126a2188122087122088126a2189122088122089126a218a12208912" - "208a126a218b12208a12208b126a218c12208b12208c126a218d12208c12208d126a218e12208d12208e126a218f12" - "208e12208f126a219012208f122090126a2191122090122091126a2192122091122092126a2193122092122093126a" - "2194122093122094126a2195122094122095126a2196122095122096126a2197122096122097126a21981220971220" - "98126a2199122098122099126a219a12209912209a126a219b12209a12209b126a219c12209b12209c126a219d1220" - "9c12209d126a219e12209d12209e126a219f12209e12209f126a21a012209f1220a0126a21a11220a01220a1126a21" - "a21220a11220a2126a21a31220a21220a3126a21a41220a31220a4126a21a51220a41220a5126a21a61220a51220a6" - "126a21a71220a61220a7126a21a81220a71220a8126a21a91220a81220a9126a21aa1220a91220aa126a21ab1220aa" - "1220ab126a21ac1220ab1220ac126a21ad1220ac1220ad126a21ae1220ad1220ae126a21af1220ae1220af126a21b0" - "1220af1220b0126a21b11220b01220b1126a21b21220b11220b2126a21b31220b21220b3126a21b41220b31220b412" - "6a21b51220b41220b5126a21b61220b51220b6126a21b71220b61220b7126a21b81220b71220b8126a21b91220b812" - "20b9126a21ba1220b91220ba126a21bb1220ba1220bb126a21bc1220bb1220bc126a21bd1220bc1220bd126a21be12" - "20bd1220be126a21bf1220be1220bf126a21c01220bf1220c0126a21c11220c01220c1126a21c21220c11220c2126a" - "21c31220c21220c3126a21c41220c31220c4126a21c51220c41220c5126a21c61220c51220c6126a21c71220c61220" - "c7126a21c81220c71220c8126a21c91220c81220c9126a21ca1220c91220ca126a21cb1220ca1220cb126a21cc1220" - "cb1220cc126a21cd1220cc1220cd126a21ce1220cd1220ce126a21cf1220ce1220cf126a21d01220cf1220d0126a21" - "d11220d01220d1126a21d21220d11220d2126a21d31220d21220d3126a21d41220d31220d4126a21d51220d41220d5" - "126a21d61220d51220d6126a21d71220d61220d7126a21d81220d71220d8126a21d91220d81220d9126a21da1220d9" - "1220da126a21db1220da1220db126a21dc1220db1220dc126a21dd1220dc1220dd126a21de1220dd1220de126a21df" - "1220de1220df126a21e01220df1220e0126a21e11220e01220e1126a21e21220e11220e2126a21e31220e21220e312" - "6a21e41220e31220e4126a21e51220e41220e5126a21e61220e51220e6126a21e71220e61220e7126a21e81220e712" - "20e8126a21e91220e81220e9126a21ea1220e91220ea126a21eb1220ea1220eb126a21ec1220eb1220ec126a21ed12" - "20ec1220ed126a21ee1220ed1220ee126a21ef1220ee1220ef126a21f01220ef1220f0126a21f11220f01220f1126a" - "21f21220f11220f2126a21f31220f21220f3126a21f41220f31220f4126a21f51220f41220f5126a21f61220f51220" - "f6126a21f71220f61220f7126a21f81220f71220f8126a21f91220f81220f9126a21fa1220f91220fa126a21fb1220" - "fa1220fb126a21fc1220fb1220fc126a21fd1220fc1220fd126a21fe1220fd1220fe126a21ff1220fe1220ff126a21" - "801320ff122080136a2181132080132081136a2182132081132082136a2183132082132083136a2184132083132084" - "136a2185132084132085136a2186132085132086136a2187132086132087136a2188132087132088136a2189132088" - "132089136a218a13208913208a136a218b13208a13208b136a218c13208b13208c136a218d13208c13208d136a218e" - "13208d13208e136a218f13208e13208f136a219013208f132090136a2191132090132091136a219213209113209213" - "6a2193132092132093136a2194132093132094136a2195132094132095136a2196132095132096136a219713209613" - "2097136a2198132097132098136a2199132098132099136a219a13209913209a136a219b13209a13209b136a219c13" - "209b13209c136a219d13209c13209d136a219e13209d13209e136a219f13209e13209f136a21a013209f1320a0136a" - "21a11320a01320a1136a21a21320a11320a2136a21a31320a21320a3136a21a41320a31320a4136a21a51320a41320" - "a5136a21a61320a51320a6136a21a71320a61320a7136a21a81320a71320a8136a21a91320a81320a9136a21aa1320" - "a91320aa136a21ab1320aa1320ab136a21ac1320ab1320ac136a21ad1320ac1320ad136a21ae1320ad1320ae136a21" - "af1320ae1320af136a21b01320af1320b0136a21b11320b01320b1136a21b21320b11320b2136a21b31320b21320b3" - "136a21b41320b31320b4136a21b51320b41320b5136a21b61320b51320b6136a21b71320b61320b7136a21b81320b7" - "1320b8136a21b91320b81320b9136a21ba1320b91320ba136a21bb1320ba1320bb136a21bc1320bb1320bc136a21bd" - "1320bc1320bd136a21be1320bd1320be136a21bf1320be1320bf136a21c01320bf1320c0136a21c11320c01320c113" - "6a21c21320c11320c2136a21c31320c21320c3136a21c41320c31320c4136a21c51320c41320c5136a21c61320c513" - "20c6136a21c71320c61320c7136a21c81320c71320c8136a21c91320c81320c9136a21ca1320c91320ca136a21cb13" - "20ca1320cb136a21cc1320cb1320cc136a21cd1320cc1320cd136a21ce1320cd1320ce136a21cf1320ce1320cf136a" - "21d01320cf1320d0136a21d11320d01320d1136a21d21320d11320d2136a21d31320d21320d3136a21d41320d31320" - "d4136a21d51320d41320d5136a21d61320d51320d6136a21d71320d61320d7136a21d81320d71320d8136a21d91320" - "d81320d9136a21da1320d91320da136a21db1320da1320db136a21dc1320db1320dc136a21dd1320dc1320dd136a21" - "de1320dd1320de136a21df1320de1320df136a21e01320df1320e0136a21e11320e01320e1136a21e21320e11320e2" - "136a21e31320e21320e3136a21e41320e31320e4136a21e51320e41320e5136a21e61320e51320e6136a21e71320e6" - "1320e7136a21e81320e71320e8136a21e91320e81320e9136a21ea1320e91320ea136a21eb1320ea1320eb136a21ec" - "1320eb1320ec136a21ed1320ec1320ed136a21ee1320ed1320ee136a21ef1320ee1320ef136a21f01320ef1320f013" - "6a21f11320f01320f1136a21f21320f11320f2136a21f31320f21320f3136a21f41320f31320f4136a21f51320f413" - "20f5136a21f61320f51320f6136a21f71320f61320f7136a21f81320f71320f8136a21f91320f81320f9136a21fa13" - "20f91320fa136a21fb1320fa1320fb136a21fc1320fb1320fc136a21fd1320fc1320fd136a21fe1320fd1320fe136a" - "21ff1320fe1320ff136a21801420ff132080146a2181142080142081146a2182142081142082146a21831420821420" - "83146a2184142083142084146a2185142084142085146a2186142085142086146a2187142086142087146a21881420" - "87142088146a2189142088142089146a218a14208914208a146a218b14208a14208b146a218c14208b14208c146a21" - "8d14208c14208d146a218e14208d14208e146a218f14208e14208f146a219014208f142090146a2191142090142091" - "146a2192142091142092146a2193142092142093146a2194142093142094146a2195142094142095146a2196142095" - "142096146a2197142096142097146a2198142097142098146a2199142098142099146a219a14209914209a146a219b" - "14209a14209b146a219c14209b14209c146a219d14209c14209d146a219e14209d14209e146a219f14209e14209f14" - "6a21a014209f1420a0146a21a11420a01420a1146a21a21420a11420a2146a21a31420a21420a3146a21a41420a314" - "20a4146a21a51420a41420a5146a21a61420a51420a6146a21a71420a61420a7146a21a81420a71420a8146a21a914" - "20a81420a9146a21aa1420a91420aa146a21ab1420aa1420ab146a21ac1420ab1420ac146a21ad1420ac1420ad146a" - "21ae1420ad1420ae146a21af1420ae1420af146a21b01420af1420b0146a21b11420b01420b1146a21b21420b11420" - "b2146a21b31420b21420b3146a21b41420b31420b4146a21b51420b41420b5146a21b61420b51420b6146a21b71420" - "b61420b7146a21b81420b71420b8146a21b91420b81420b9146a21ba1420b91420ba146a21bb1420ba1420bb146a21" - "bc1420bb1420bc146a21bd1420bc1420bd146a21be1420bd1420be146a21bf1420be1420bf146a21c01420bf1420c0" - "146a21c11420c01420c1146a21c21420c11420c2146a21c31420c21420c3146a21c41420c31420c4146a21c51420c4" - "1420c5146a21c61420c51420c6146a21c71420c61420c7146a21c81420c71420c8146a21c91420c81420c9146a21ca" - "1420c91420ca146a21cb1420ca1420cb146a21cc1420cb1420cc146a21cd1420cc1420cd146a21ce1420cd1420ce14" - "6a21cf1420ce1420cf146a21d01420cf1420d0146a21d11420d01420d1146a21d21420d11420d2146a21d31420d214" - "20d3146a21d41420d31420d4146a21d51420d41420d5146a21d61420d51420d6146a21d71420d61420d7146a21d814" - "20d71420d8146a21d91420d81420d9146a21da1420d91420da146a21db1420da1420db146a21dc1420db1420dc146a" - "21dd1420dc1420dd146a21de1420dd1420de146a21df1420de1420df146a21e01420df1420e0146a21e11420e01420" - "e1146a21e21420e11420e2146a21e31420e21420e3146a21e41420e31420e4146a21e51420e41420e5146a21e61420" - "e51420e6146a21e71420e61420e7146a21e81420e71420e8146a21e91420e81420e9146a21ea1420e91420ea146a21" - "eb1420ea1420eb146a21ec1420eb1420ec146a21ed1420ec1420ed146a21ee1420ed1420ee146a21ef1420ee1420ef" - "146a21f01420ef1420f0146a21f11420f01420f1146a21f21420f11420f2146a21f31420f21420f3146a21f41420f3" - "1420f4146a21f51420f41420f5146a21f61420f51420f6146a21f71420f61420f7146a21f81420f71420f8146a21f9" - "1420f81420f9146a21fa1420f91420fa146a21fb1420fa1420fb146a21fc1420fb1420fc146a21fd1420fc1420fd14" - "6a21fe1420fd1420fe146a21ff1420fe1420ff146a21801520ff142080156a2181152080152081156a218215208115" - "2082156a2183152082152083156a2184152083152084156a2185152084152085156a2186152085152086156a218715" - "2086152087156a2188152087152088156a2189152088152089156a218a15208915208a156a218b15208a15208b156a" - "218c15208b15208c156a218d15208c15208d156a218e15208d15208e156a218f15208e15208f156a219015208f1520" - "90156a2191152090152091156a2192152091152092156a2193152092152093156a2194152093152094156a21951520" - "94152095156a2196152095152096156a2197152096152097156a2198152097152098156a2199152098152099156a21" - "9a15209915209a156a219b15209a15209b156a219c15209b15209c156a219d15209c15209d156a219e15209d15209e" - "156a219f15209e15209f156a21a015209f1520a0156a21a11520a01520a1156a21a21520a11520a2156a21a31520a2" - "1520a3156a21a41520a31520a4156a21a51520a41520a5156a21a61520a51520a6156a21a71520a61520a7156a21a8" - "1520a71520a8156a21a91520a81520a9156a21aa1520a91520aa156a21ab1520aa1520ab156a21ac1520ab1520ac15" - "6a21ad1520ac1520ad156a21ae1520ad1520ae156a21af1520ae1520af156a21b01520af1520b0156a21b11520b015" - "20b1156a21b21520b11520b2156a21b31520b21520b3156a21b41520b31520b4156a21b51520b41520b5156a21b615" - "20b51520b6156a21b71520b61520b7156a21b81520b71520b8156a21b91520b81520b9156a21ba1520b91520ba156a" - "21bb1520ba1520bb156a21bc1520bb1520bc156a21bd1520bc1520bd156a21be1520bd1520be156a21bf1520be1520" - "bf156a21c01520bf1520c0156a21c11520c01520c1156a21c21520c11520c2156a21c31520c21520c3156a21c41520" - "c31520c4156a21c51520c41520c5156a21c61520c51520c6156a21c71520c61520c7156a21c81520c71520c8156a21" - "c91520c81520c9156a21ca1520c91520ca156a21cb1520ca1520cb156a21cc1520cb1520cc156a21cd1520cc1520cd" - "156a21ce1520cd1520ce156a21cf1520ce1520cf156a21d01520cf1520d0156a21d11520d01520d1156a21d21520d1" - "1520d2156a21d31520d21520d3156a21d41520d31520d4156a21d51520d41520d5156a21d61520d51520d6156a21d7" - "1520d61520d7156a21d81520d71520d8156a21d91520d81520d9156a21da1520d91520da156a21db1520da1520db15" - "6a21dc1520db1520dc156a21dd1520dc1520dd156a21de1520dd1520de156a21df1520de1520df156a21e01520df15" - "20e0156a21e11520e01520e1156a21e21520e11520e2156a21e31520e21520e3156a21e41520e31520e4156a21e515" - "20e41520e5156a21e61520e51520e6156a21e71520e61520e7156a21e81520e71520e8156a21e91520e81520e9156a" - "21ea1520e91520ea156a21eb1520ea1520eb156a21ec1520eb1520ec156a21ed1520ec1520ed156a21ee1520ed1520" - "ee156a21ef1520ee1520ef156a21f01520ef1520f0156a21f11520f01520f1156a21f21520f11520f2156a21f31520" - "f21520f3156a21f41520f31520f4156a21f51520f41520f5156a21f61520f51520f6156a21f71520f61520f7156a21" - "f81520f71520f8156a21f91520f81520f9156a21fa1520f91520fa156a21fb1520fa1520fb156a21fc1520fb1520fc" - "156a21fd1520fc1520fd156a21fe1520fd1520fe156a21ff1520fe1520ff156a21801620ff152080166a2181162080" - "162081166a2182162081162082166a2183162082162083166a2184162083162084166a2185162084162085166a2186" - "162085162086166a2187162086162087166a2188162087162088166a2189162088162089166a218a16208916208a16" - "6a218b16208a16208b166a218c16208b16208c166a218d16208c16208d166a218e16208d16208e166a218f16208e16" - "208f166a219016208f162090166a2191162090162091166a2192162091162092166a2193162092162093166a219416" - "2093162094166a2195162094162095166a2196162095162096166a2197162096162097166a2198162097162098166a" - "2199162098162099166a219a16209916209a166a219b16209a16209b166a219c16209b16209c166a219d16209c1620" - "9d166a219e16209d16209e166a219f16209e16209f166a21a016209f1620a0166a21a11620a01620a1166a21a21620" - "a11620a2166a21a31620a21620a3166a21a41620a31620a4166a21a51620a41620a5166a21a61620a51620a6166a21" - "a71620a61620a7166a21a81620a71620a8166a21a91620a81620a9166a21aa1620a91620aa166a21ab1620aa1620ab" - "166a21ac1620ab1620ac166a21ad1620ac1620ad166a21ae1620ad1620ae166a21af1620ae1620af166a21b01620af" - "1620b0166a21b11620b01620b1166a21b21620b11620b2166a21b31620b21620b3166a21b41620b31620b4166a21b5" - "1620b41620b5166a21b61620b51620b6166a21b71620b61620b7166a21b81620b71620b8166a21b91620b81620b916" - "6a21ba1620b91620ba166a21bb1620ba1620bb166a21bc1620bb1620bc166a21bd1620bc1620bd166a21be1620bd16" - "20be166a21bf1620be1620bf166a21c01620bf1620c0166a21c11620c01620c1166a21c21620c11620c2166a21c316" - "20c21620c3166a21c41620c31620c4166a21c51620c41620c5166a21c61620c51620c6166a21c71620c61620c7166a" - "21c81620c71620c8166a21c91620c81620c9166a21ca1620c91620ca166a21cb1620ca1620cb166a21cc1620cb1620" - "cc166a21cd1620cc1620cd166a21ce1620cd1620ce166a21cf1620ce1620cf166a21d01620cf1620d0166a21d11620" - "d01620d1166a21d21620d11620d2166a21d31620d21620d3166a21d41620d31620d4166a21d51620d41620d5166a21" - "d61620d51620d6166a21d71620d61620d7166a21d81620d71620d8166a21d91620d81620d9166a21da1620d91620da" - "166a21db1620da1620db166a21dc1620db1620dc166a21dd1620dc1620dd166a21de1620dd1620de166a21df1620de" - "1620df166a21e01620df1620e0166a21e11620e01620e1166a21e21620e11620e2166a21e31620e21620e3166a21e4" - "1620e31620e4166a21e51620e41620e5166a21e61620e51620e6166a21e71620e61620e7166a21e81620e71620e816" - "6a21e91620e81620e9166a21ea1620e91620ea166a21eb1620ea1620eb166a21ec1620eb1620ec166a21ed1620ec16" - "20ed166a21ee1620ed1620ee166a21ef1620ee1620ef166a21f01620ef1620f0166a21f11620f01620f1166a21f216" - "20f11620f2166a21f31620f21620f3166a21f41620f31620f4166a21f51620f41620f5166a21f61620f51620f6166a" - "21f71620f61620f7166a21f81620f71620f8166a21f91620f81620f9166a21fa1620f91620fa166a21fb1620fa1620" - "fb166a21fc1620fb1620fc166a21fd1620fc1620fd166a21fe1620fd1620fe166a21ff1620fe1620ff166a21801720" - "ff162080176a2181172080172081176a2182172081172082176a2183172082172083176a2184172083172084176a21" - "85172084172085176a2186172085172086176a2187172086172087176a2188172087172088176a2189172088172089" - "176a218a17208917208a176a218b17208a17208b176a218c17208b17208c176a218d17208c17208d176a218e17208d" - "17208e176a218f17208e17208f176a219017208f172090176a2191172090172091176a2192172091172092176a2193" - "172092172093176a2194172093172094176a2195172094172095176a2196172095172096176a219717209617209717" - "6a2198172097172098176a2199172098172099176a219a17209917209a176a219b17209a17209b176a219c17209b17" - "209c176a219d17209c17209d176a219e17209d17209e176a219f17209e17209f176a21a017209f1720a0176a21a117" - "20a01720a1176a21a21720a11720a2176a21a31720a21720a3176a21a41720a31720a4176a21a51720a41720a5176a" - "21a61720a51720a6176a21a71720a61720a7176a21a81720a71720a8176a21a91720a81720a9176a21aa1720a91720" - "aa176a21ab1720aa1720ab176a21ac1720ab1720ac176a21ad1720ac1720ad176a21ae1720ad1720ae176a21af1720" - "ae1720af176a21b01720af1720b0176a21b11720b01720b1176a21b21720b11720b2176a21b31720b21720b3176a21" - "b41720b31720b4176a21b51720b41720b5176a21b61720b51720b6176a21b71720b61720b7176a21b81720b71720b8" - "176a21b91720b81720b9176a21ba1720b91720ba176a21bb1720ba1720bb176a21bc1720bb1720bc176a21bd1720bc" - "1720bd176a21be1720bd1720be176a21bf1720be1720bf176a21c01720bf1720c0176a21c11720c01720c1176a21c2" - "1720c11720c2176a21c31720c21720c3176a21c41720c31720c4176a21c51720c41720c5176a21c61720c51720c617" - "6a21c71720c61720c7176a21c81720c71720c8176a21c91720c81720c9176a21ca1720c91720ca176a21cb1720ca17" - "20cb176a21cc1720cb1720cc176a21cd1720cc1720cd176a21ce1720cd1720ce176a21cf1720ce1720cf176a21d017" - "20cf1720d0176a21d11720d01720d1176a21d21720d11720d2176a21d31720d21720d3176a21d41720d31720d4176a" - "21d51720d41720d5176a21d61720d51720d6176a21d71720d61720d7176a21d81720d71720d8176a21d91720d81720" - "d9176a21da1720d91720da176a21db1720da1720db176a21dc1720db1720dc176a21dd1720dc1720dd176a21de1720" - "dd1720de176a21df1720de1720df176a21e01720df1720e0176a21e11720e01720e1176a21e21720e11720e2176a21" - "e31720e21720e3176a21e41720e31720e4176a21e51720e41720e5176a21e61720e51720e6176a21e71720e61720e7" - "176a21e81720e71720e8176a21e91720e81720e9176a21ea1720e91720ea176a21eb1720ea1720eb176a21ec1720eb" - "1720ec176a21ed1720ec1720ed176a21ee1720ed1720ee176a21ef1720ee1720ef176a21f01720ef1720f0176a21f1" - "1720f01720f1176a21f21720f11720f2176a21f31720f21720f3176a21f41720f31720f4176a21f51720f41720f517" - "6a21f61720f51720f6176a21f71720f61720f7176a21f81720f71720f8176a21f91720f81720f9176a21fa1720f917" - "20fa176a21fb1720fa1720fb176a21fc1720fb1720fc176a21fd1720fc1720fd176a21fe1720fd1720fe176a21ff17" - "20fe1720ff176a21801820ff172080186a2181182080182081186a2182182081182082186a2183182082182083186a" - "2184182083182084186a2185182084182085186a2186182085182086186a2187182086182087186a21881820871820" - "88186a2189182088182089186a218a18208918208a186a218b18208a18208b186a218c18208b18208c186a218d1820" - "8c18208d186a218e18208d18208e186a218f18208e18208f186a219018208f182090186a2191182090182091186a21" - "92182091182092186a2193182092182093186a2194182093182094186a2195182094182095186a2196182095182096" - "186a2197182096182097186a2198182097182098186a2199182098182099186a219a18209918209a186a219b18209a" - "18209b186a219c18209b18209c186a219d18209c18209d186a219e18209d18209e186a219f18209e18209f186a21a0" - "18209f1820a0186a21a11820a01820a1186a21a21820a11820a2186a21a31820a21820a3186a21a41820a31820a418" - "6a21a51820a41820a5186a21a61820a51820a6186a21a71820a61820a7186a21a81820a71820a8186a21a91820a818" - "20a9186a21aa1820a91820aa186a21ab1820aa1820ab186a21ac1820ab1820ac186a21ad1820ac1820ad186a21ae18" - "20ad1820ae186a21af1820ae1820af186a21b01820af1820b0186a21b11820b01820b1186a21b21820b11820b2186a" - "21b31820b21820b3186a21b41820b31820b4186a21b51820b41820b5186a21b61820b51820b6186a21b71820b61820" - "b7186a21b81820b71820b8186a21b91820b81820b9186a21ba1820b91820ba186a21bb1820ba1820bb186a21bc1820" - "bb1820bc186a21bd1820bc1820bd186a21be1820bd1820be186a21bf1820be1820bf186a21c01820bf1820c0186a21" - "c11820c01820c1186a21c21820c11820c2186a21c31820c21820c3186a21c41820c31820c4186a21c51820c41820c5" - "186a21c61820c51820c6186a21c71820c61820c7186a21c81820c71820c8186a21c91820c81820c9186a21ca1820c9" - "1820ca186a21cb1820ca1820cb186a21cc1820cb1820cc186a21cd1820cc1820cd186a21ce1820cd1820ce186a21cf" - "1820ce1820cf186a21d01820cf1820d0186a21d11820d01820d1186a21d21820d11820d2186a21d31820d21820d318" - "6a21d41820d31820d4186a21d51820d41820d5186a21d61820d51820d6186a21d71820d61820d7186a21d81820d718" - "20d8186a21d91820d81820d9186a21da1820d91820da186a21db1820da1820db186a21dc1820db1820dc186a21dd18" - "20dc1820dd186a21de1820dd1820de186a21df1820de1820df186a21e01820df1820e0186a21e11820e01820e1186a" - "21e21820e11820e2186a21e31820e21820e3186a21e41820e31820e4186a21e51820e41820e5186a21e61820e51820" - "e6186a21e71820e61820e7186a21e81820e71820e8186a21e91820e81820e9186a21ea1820e91820ea186a21eb1820" - "ea1820eb186a21ec1820eb1820ec186a21ed1820ec1820ed186a21ee1820ed1820ee186a21ef1820ee1820ef186a21" - "f01820ef1820f0186a21f11820f01820f1186a21f21820f11820f2186a21f31820f21820f3186a21f41820f31820f4" - "186a21f51820f41820f5186a21f61820f51820f6186a21f71820f61820f7186a21f81820f71820f8186a21f91820f8" - "1820f9186a21fa1820f91820fa186a21fb1820fa1820fb186a21fc1820fb1820fc186a21fd1820fc1820fd186a21fe" - "1820fd1820fe186a21ff1820fe1820ff186a21801920ff182080196a2181192080192081196a218219208119208219" - "6a2183192082192083196a2184192083192084196a2185192084192085196a2186192085192086196a218719208619" - "2087196a2188192087192088196a2189192088192089196a218a19208919208a196a218b19208a19208b196a218c19" - "208b19208c196a218d19208c19208d196a218e19208d19208e196a218f19208e19208f196a219019208f192090196a" - "2191192090192091196a2192192091192092196a2193192092192093196a2194192093192094196a21951920941920" - "95196a2196192095192096196a2197192096192097196a2198192097192098196a2199192098192099196a219a1920" - "9919209a196a219b19209a19209b196a219c19209b19209c196a219d19209c19209d196a219e19209d19209e196a21" - "9f19209e19209f196a21a019209f1920a0196a21a11920a01920a1196a21a21920a11920a2196a21a31920a21920a3" - "196a21a41920a31920a4196a21a51920a41920a5196a21a61920a51920a6196a21a71920a61920a7196a21a81920a7" - "1920a8196a21a91920a81920a9196a21aa1920a91920aa196a21ab1920aa1920ab196a21ac1920ab1920ac196a21ad" - "1920ac1920ad196a21ae1920ad1920ae196a21af1920ae1920af196a21b01920af1920b0196a21b11920b01920b119" - "6a21b21920b11920b2196a21b31920b21920b3196a21b41920b31920b4196a21b51920b41920b5196a21b61920b519" - "20b6196a21b71920b61920b7196a21b81920b71920b8196a21b91920b81920b9196a21ba1920b91920ba196a21bb19" - "20ba1920bb196a21bc1920bb1920bc196a21bd1920bc1920bd196a21be1920bd1920be196a21bf1920be1920bf196a" - "21c01920bf1920c0196a21c11920c01920c1196a21c21920c11920c2196a21c31920c21920c3196a21c41920c31920" - "c4196a21c51920c41920c5196a21c61920c51920c6196a21c71920c61920c7196a21c81920c71920c8196a21c91920" - "c81920c9196a21ca1920c91920ca196a21cb1920ca1920cb196a21cc1920cb1920cc196a21cd1920cc1920cd196a21" - "ce1920cd1920ce196a21cf1920ce1920cf196a21d01920cf1920d0196a21d11920d01920d1196a21d21920d11920d2" - "196a21d31920d21920d3196a21d41920d31920d4196a21d51920d41920d5196a21d61920d51920d6196a21d71920d6" - "1920d7196a21d81920d71920d8196a21d91920d81920d9196a21da1920d91920da196a21db1920da1920db196a21dc" - "1920db1920dc196a21dd1920dc1920dd196a21de1920dd1920de196a21df1920de1920df196a21e01920df1920e019" - "6a21e11920e01920e1196a21e21920e11920e2196a21e31920e21920e3196a21e41920e31920e4196a21e51920e419" - "20e5196a21e61920e51920e6196a21e71920e61920e7196a21e81920e71920e8196a21e91920e81920e9196a21ea19" - "20e91920ea196a21eb1920ea1920eb196a21ec1920eb1920ec196a21ed1920ec1920ed196a21ee1920ed1920ee196a" - "21ef1920ee1920ef196a21f01920ef1920f0196a21f11920f01920f1196a21f21920f11920f2196a21f31920f21920" - "f3196a21f41920f31920f4196a21f51920f41920f5196a21f61920f51920f6196a21f71920f61920f7196a21f81920" - "f71920f8196a21f91920f81920f9196a21fa1920f91920fa196a21fb1920fa1920fb196a21fc1920fb1920fc196a21" - "fd1920fc1920fd196a21fe1920fd1920fe196a21ff1920fe1920ff196a21801a20ff1920801a6a21811a20801a2081" - "1a6a21821a20811a20821a6a21831a20821a20831a6a21841a20831a20841a6a21851a20841a20851a6a21861a2085" - "1a20861a6a21871a20861a20871a6a21881a20871a20881a6a21891a20881a20891a6a218a1a20891a208a1a6a218b" - "1a208a1a208b1a6a218c1a208b1a208c1a6a218d1a208c1a208d1a6a218e1a208d1a208e1a6a218f1a208e1a208f1a" - "6a21901a208f1a20901a6a21911a20901a20911a6a21921a20911a20921a6a21931a20921a20931a6a21941a20931a" - "20941a6a21951a20941a20951a6a21961a20951a20961a6a21971a20961a20971a6a21981a20971a20981a6a21991a" - "20981a20991a6a219a1a20991a209a1a6a219b1a209a1a209b1a6a219c1a209b1a209c1a6a219d1a209c1a209d1a6a" - "219e1a209d1a209e1a6a219f1a209e1a209f1a6a21a01a209f1a20a01a6a21a11a20a01a20a11a6a21a21a20a11a20" - "a21a6a21a31a20a21a20a31a6a21a41a20a31a20a41a6a21a51a20a41a20a51a6a21a61a20a51a20a61a6a21a71a20" - "a61a20a71a6a21a81a20a71a20a81a6a21a91a20a81a20a91a6a21aa1a20a91a20aa1a6a21ab1a20aa1a20ab1a6a21" - "ac1a20ab1a20ac1a6a21ad1a20ac1a20ad1a6a21ae1a20ad1a20ae1a6a21af1a20ae1a20af1a6a21b01a20af1a20b0" - "1a6a21b11a20b01a20b11a6a21b21a20b11a20b21a6a21b31a20b21a20b31a6a21b41a20b31a20b41a6a21b51a20b4" - "1a20b51a6a21b61a20b51a20b61a6a21b71a20b61a20b71a6a21b81a20b71a20b81a6a21b91a20b81a20b91a6a21ba" - "1a20b91a20ba1a6a21bb1a20ba1a20bb1a6a21bc1a20bb1a20bc1a6a21bd1a20bc1a20bd1a6a21be1a20bd1a20be1a" - "6a21bf1a20be1a20bf1a6a21c01a20bf1a20c01a6a21c11a20c01a20c11a6a21c21a20c11a20c21a6a21c31a20c21a" - "20c31a6a21c41a20c31a20c41a6a21c51a20c41a20c51a6a21c61a20c51a20c61a6a21c71a20c61a20c71a6a21c81a" - "20c71a20c81a6a21c91a20c81a20c91a6a21ca1a20c91a20ca1a6a21cb1a20ca1a20cb1a6a21cc1a20cb1a20cc1a6a" - "21cd1a20cc1a20cd1a6a21ce1a20cd1a20ce1a6a21cf1a20ce1a20cf1a6a21d01a20cf1a20d01a6a21d11a20d01a20" - "d11a6a21d21a20d11a20d21a6a21d31a20d21a20d31a6a21d41a20d31a20d41a6a21d51a20d41a20d51a6a21d61a20" - "d51a20d61a6a21d71a20d61a20d71a6a21d81a20d71a20d81a6a21d91a20d81a20d91a6a21da1a20d91a20da1a6a21" - "db1a20da1a20db1a6a21dc1a20db1a20dc1a6a21dd1a20dc1a20dd1a6a21de1a20dd1a20de1a6a21df1a20de1a20df" - "1a6a21e01a20df1a20e01a6a21e11a20e01a20e11a6a21e21a20e11a20e21a6a21e31a20e21a20e31a6a21e41a20e3" - "1a20e41a6a21e51a20e41a20e51a6a21e61a20e51a20e61a6a21e71a20e61a20e71a6a21e81a20e71a20e81a6a21e9" - "1a20e81a20e91a6a21ea1a20e91a20ea1a6a21eb1a20ea1a20eb1a6a21ec1a20eb1a20ec1a6a21ed1a20ec1a20ed1a" - "6a21ee1a20ed1a20ee1a6a21ef1a20ee1a20ef1a6a21f01a20ef1a20f01a6a21f11a20f01a20f11a6a21f21a20f11a" - "20f21a6a21f31a20f21a20f31a6a21f41a20f31a20f41a6a21f51a20f41a20f51a6a21f61a20f51a20f61a6a21f71a" - "20f61a20f71a6a21f81a20f71a20f81a6a21f91a20f81a20f91a6a21fa1a20f91a20fa1a6a21fb1a20fa1a20fb1a6a" - "21fc1a20fb1a20fc1a6a21fd1a20fc1a20fd1a6a21fe1a20fd1a20fe1a6a21ff1a20fe1a20ff1a6a21801b20ff1a20" - "801b6a21811b20801b20811b6a21821b20811b20821b6a21831b20821b20831b6a21841b20831b20841b6a21851b20" - "841b20851b6a21861b20851b20861b6a21871b20861b20871b6a21881b20871b20881b6a21891b20881b20891b6a21" - "8a1b20891b208a1b6a218b1b208a1b208b1b6a218c1b208b1b208c1b6a218d1b208c1b208d1b6a218e1b208d1b208e" - "1b6a218f1b208e1b208f1b6a21901b208f1b20901b6a21911b20901b20911b6a21921b20911b20921b6a21931b2092" - "1b20931b6a21941b20931b20941b6a21951b20941b20951b6a21961b20951b20961b6a21971b20961b20971b6a2198" - "1b20971b20981b6a21991b20981b20991b6a219a1b20991b209a1b6a219b1b209a1b209b1b6a219c1b209b1b209c1b" - "6a219d1b209c1b209d1b6a219e1b209d1b209e1b6a219f1b209e1b209f1b6a21a01b209f1b20a01b6a21a11b20a01b" - "20a11b6a21a21b20a11b20a21b6a21a31b20a21b20a31b6a21a41b20a31b20a41b6a21a51b20a41b20a51b6a21a61b" - "20a51b20a61b6a21a71b20a61b20a71b6a21a81b20a71b20a81b6a21a91b20a81b20a91b6a21aa1b20a91b20aa1b6a" - "21ab1b20aa1b20ab1b6a21ac1b20ab1b20ac1b6a21ad1b20ac1b20ad1b6a21ae1b20ad1b20ae1b6a21af1b20ae1b20" - "af1b6a21b01b20af1b20b01b6a21b11b20b01b20b11b6a21b21b20b11b20b21b6a21b31b20b21b20b31b6a21b41b20" - "b31b20b41b6a21b51b20b41b20b51b6a21b61b20b51b20b61b6a21b71b20b61b20b71b6a21b81b20b71b20b81b6a21" - "b91b20b81b20b91b6a21ba1b20b91b20ba1b6a21bb1b20ba1b20bb1b6a21bc1b20bb1b20bc1b6a21bd1b20bc1b20bd" - "1b6a21be1b20bd1b20be1b6a21bf1b20be1b20bf1b6a21c01b20bf1b20c01b6a21c11b20c01b20c11b6a21c21b20c1" - "1b20c21b6a21c31b20c21b20c31b6a21c41b20c31b20c41b6a21c51b20c41b20c51b6a21c61b20c51b20c61b6a21c7" - "1b20c61b20c71b6a21c81b20c71b20c81b6a21c91b20c81b20c91b6a21ca1b20c91b20ca1b6a21cb1b20ca1b20cb1b" - "6a21cc1b20cb1b20cc1b6a21cd1b20cc1b20cd1b6a21ce1b20cd1b20ce1b6a21cf1b20ce1b20cf1b6a21d01b20cf1b" - "20d01b6a21d11b20d01b20d11b6a21d21b20d11b20d21b6a21d31b20d21b20d31b6a21d41b20d31b20d41b6a21d51b" - "20d41b20d51b6a21d61b20d51b20d61b6a21d71b20d61b20d71b6a21d81b20d71b20d81b6a21d91b20d81b20d91b6a" - "21da1b20d91b20da1b6a21db1b20da1b20db1b6a21dc1b20db1b20dc1b6a21dd1b20dc1b20dd1b6a21de1b20dd1b20" - "de1b6a21df1b20de1b20df1b6a21e01b20df1b20e01b6a21e11b20e01b20e11b6a21e21b20e11b20e21b6a21e31b20" - "e21b20e31b6a21e41b20e31b20e41b6a21e51b20e41b20e51b6a21e61b20e51b20e61b6a21e71b20e61b20e71b6a21" - "e81b20e71b20e81b6a21e91b20e81b20e91b6a21ea1b20e91b20ea1b6a21eb1b20ea1b20eb1b6a21ec1b20eb1b20ec" - "1b6a21ed1b20ec1b20ed1b6a21ee1b20ed1b20ee1b6a21ef1b20ee1b20ef1b6a21f01b20ef1b20f01b6a21f11b20f0" - "1b20f11b6a21f21b20f11b20f21b6a21f31b20f21b20f31b6a21f41b20f31b20f41b6a21f51b20f41b20f51b6a21f6" - "1b20f51b20f61b6a21f71b20f61b20f71b6a21f81b20f71b20f81b6a21f91b20f81b20f91b6a21fa1b20f91b20fa1b" - "6a21fb1b20fa1b20fb1b6a21fc1b20fb1b20fc1b6a21fd1b20fc1b20fd1b6a21fe1b20fd1b20fe1b6a21ff1b20fe1b" - "20ff1b6a21801c20ff1b20801c6a21811c20801c20811c6a21821c20811c20821c6a21831c20821c20831c6a21841c" - "20831c20841c6a21851c20841c20851c6a21861c20851c20861c6a21871c20861c20871c6a21881c20871c20881c6a" - "21891c20881c20891c6a218a1c20891c208a1c6a218b1c208a1c208b1c6a218c1c208b1c208c1c6a218d1c208c1c20" - "8d1c6a218e1c208d1c208e1c6a218f1c208e1c208f1c6a21901c208f1c20901c6a21911c20901c20911c6a21921c20" - "911c20921c6a21931c20921c20931c6a21941c20931c20941c6a21951c20941c20951c6a21961c20951c20961c6a21" - "971c20961c20971c6a21981c20971c20981c6a21991c20981c20991c6a219a1c20991c209a1c6a219b1c209a1c209b" - "1c6a219c1c209b1c209c1c6a219d1c209c1c209d1c6a219e1c209d1c209e1c6a219f1c209e1c209f1c6a21a01c209f" - "1c20a01c6a21a11c20a01c20a11c6a21a21c20a11c20a21c6a21a31c20a21c20a31c6a21a41c20a31c20a41c6a21a5" - "1c20a41c20a51c6a21a61c20a51c20a61c6a21a71c20a61c20a71c6a21a81c20a71c20a81c6a21a91c20a81c20a91c" - "6a21aa1c20a91c20aa1c6a21ab1c20aa1c20ab1c6a21ac1c20ab1c20ac1c6a21ad1c20ac1c20ad1c6a21ae1c20ad1c" - "20ae1c6a21af1c20ae1c20af1c6a21b01c20af1c20b01c6a21b11c20b01c20b11c6a21b21c20b11c20b21c6a21b31c" - "20b21c20b31c6a21b41c20b31c20b41c6a21b51c20b41c20b51c6a21b61c20b51c20b61c6a21b71c20b61c20b71c6a" - "21b81c20b71c20b81c6a21b91c20b81c20b91c6a21ba1c20b91c20ba1c6a21bb1c20ba1c20bb1c6a21bc1c20bb1c20" - "bc1c6a21bd1c20bc1c20bd1c6a21be1c20bd1c20be1c6a21bf1c20be1c20bf1c6a21c01c20bf1c20c01c6a21c11c20" - "c01c20c11c6a21c21c20c11c20c21c6a21c31c20c21c20c31c6a21c41c20c31c20c41c6a21c51c20c41c20c51c6a21" - "c61c20c51c20c61c6a21c71c20c61c20c71c6a21c81c20c71c20c81c6a21c91c20c81c20c91c6a21ca1c20c91c20ca" - "1c6a21cb1c20ca1c20cb1c6a21cc1c20cb1c20cc1c6a21cd1c20cc1c20cd1c6a21ce1c20cd1c20ce1c6a21cf1c20ce" - "1c20cf1c6a21d01c20cf1c20d01c6a21d11c20d01c20d11c6a21d21c20d11c20d21c6a21d31c20d21c20d31c6a21d4" - "1c20d31c20d41c6a21d51c20d41c20d51c6a21d61c20d51c20d61c6a21d71c20d61c20d71c6a21d81c20d71c20d81c" - "6a21d91c20d81c20d91c6a21da1c20d91c20da1c6a21db1c20da1c20db1c6a21dc1c20db1c20dc1c6a21dd1c20dc1c" - "20dd1c6a21de1c20dd1c20de1c6a21df1c20de1c20df1c6a21e01c20df1c20e01c6a21e11c20e01c20e11c6a21e21c" - "20e11c20e21c6a21e31c20e21c20e31c6a21e41c20e31c20e41c6a21e51c20e41c20e51c6a21e61c20e51c20e61c6a" - "21e71c20e61c20e71c6a21e81c20e71c20e81c6a21e91c20e81c20e91c6a21ea1c20e91c20ea1c6a21eb1c20ea1c20" - "eb1c6a21ec1c20eb1c20ec1c6a21ed1c20ec1c20ed1c6a21ee1c20ed1c20ee1c6a21ef1c20ee1c20ef1c6a21f01c20" - "ef1c20f01c6a21f11c20f01c20f11c6a21f21c20f11c20f21c6a21f31c20f21c20f31c6a21f41c20f31c20f41c6a21" - "f51c20f41c20f51c6a21f61c20f51c20f61c6a21f71c20f61c20f71c6a21f81c20f71c20f81c6a21f91c20f81c20f9" - "1c6a21fa1c20f91c20fa1c6a21fb1c20fa1c20fb1c6a21fc1c20fb1c20fc1c6a21fd1c20fc1c20fd1c6a21fe1c20fd" - "1c20fe1c6a21ff1c20fe1c20ff1c6a21801d20ff1c20801d6a21811d20801d20811d6a21821d20811d20821d6a2183" - "1d20821d20831d6a21841d20831d20841d6a21851d20841d20851d6a21861d20851d20861d6a21871d20861d20871d" - "6a21881d20871d20881d6a21891d20881d20891d6a218a1d20891d208a1d6a218b1d208a1d208b1d6a218c1d208b1d" - "208c1d6a218d1d208c1d208d1d6a218e1d208d1d208e1d6a218f1d208e1d208f1d6a21901d208f1d20901d6a21911d" - "20901d20911d6a21921d20911d20921d6a21931d20921d20931d6a21941d20931d20941d6a21951d20941d20951d6a" - "21961d20951d20961d6a21971d20961d20971d6a21981d20971d20981d6a21991d20981d20991d6a219a1d20991d20" - "9a1d6a219b1d209a1d209b1d6a219c1d209b1d209c1d6a219d1d209c1d209d1d6a219e1d209d1d209e1d6a219f1d20" - "9e1d209f1d6a21a01d209f1d20a01d6a21a11d20a01d20a11d6a21a21d20a11d20a21d6a21a31d20a21d20a31d6a21" - "a41d20a31d20a41d6a21a51d20a41d20a51d6a21a61d20a51d20a61d6a21a71d20a61d20a71d6a21a81d20a71d20a8" - "1d6a21a91d20a81d20a91d6a21aa1d20a91d20aa1d6a21ab1d20aa1d20ab1d6a21ac1d20ab1d20ac1d6a21ad1d20ac" - "1d20ad1d6a21ae1d20ad1d20ae1d6a21af1d20ae1d20af1d6a21b01d20af1d20b01d6a21b11d20b01d20b11d6a21b2" - "1d20b11d20b21d6a21b31d20b21d20b31d6a21b41d20b31d20b41d6a21b51d20b41d20b51d6a21b61d20b51d20b61d" - "6a21b71d20b61d20b71d6a21b81d20b71d20b81d6a21b91d20b81d20b91d6a21ba1d20b91d20ba1d6a21bb1d20ba1d" - "20bb1d6a21bc1d20bb1d20bc1d6a21bd1d20bc1d20bd1d6a21be1d20bd1d20be1d6a21bf1d20be1d20bf1d6a21c01d" - "20bf1d20c01d6a21c11d20c01d20c11d6a21c21d20c11d20c21d6a21c31d20c21d20c31d6a21c41d20c31d20c41d6a" - "21c51d20c41d20c51d6a21c61d20c51d20c61d6a21c71d20c61d20c71d6a21c81d20c71d20c81d6a21c91d20c81d20" - "c91d6a21ca1d20c91d20ca1d6a21cb1d20ca1d20cb1d6a21cc1d20cb1d20cc1d6a21cd1d20cc1d20cd1d6a21ce1d20" - "cd1d20ce1d6a21cf1d20ce1d20cf1d6a21d01d20cf1d20d01d6a21d11d20d01d20d11d6a21d21d20d11d20d21d6a21" - "d31d20d21d20d31d6a21d41d20d31d20d41d6a21d51d20d41d20d51d6a21d61d20d51d20d61d6a21d71d20d61d20d7" - "1d6a21d81d20d71d20d81d6a21d91d20d81d20d91d6a21da1d20d91d20da1d6a21db1d20da1d20db1d6a21dc1d20db" - "1d20dc1d6a21dd1d20dc1d20dd1d6a21de1d20dd1d20de1d6a21df1d20de1d20df1d6a21e01d20df1d20e01d6a21e1" - "1d20e01d20e11d6a21e21d20e11d20e21d6a21e31d20e21d20e31d6a21e41d20e31d20e41d6a21e51d20e41d20e51d" - "6a21e61d20e51d20e61d6a21e71d20e61d20e71d6a21e81d20e71d20e81d6a21e91d20e81d20e91d6a21ea1d20e91d" - "20ea1d6a21eb1d20ea1d20eb1d6a21ec1d20eb1d20ec1d6a21ed1d20ec1d20ed1d6a21ee1d20ed1d20ee1d6a21ef1d" - "20ee1d20ef1d6a21f01d20ef1d20f01d6a21f11d20f01d20f11d6a21f21d20f11d20f21d6a21f31d20f21d20f31d6a" - "21f41d20f31d20f41d6a21f51d20f41d20f51d6a21f61d20f51d20f61d6a21f71d20f61d20f71d6a21f81d20f71d20" - "f81d6a21f91d20f81d20f91d6a21fa1d20f91d20fa1d6a21fb1d20fa1d20fb1d6a21fc1d20fb1d20fc1d6a21fd1d20" - "fc1d20fd1d6a21fe1d20fd1d20fe1d6a21ff1d20fe1d20ff1d6a21801e20ff1d20801e6a21811e20801e20811e6a21" - "821e20811e20821e6a21831e20821e20831e6a21841e20831e20841e6a21851e20841e20851e6a21861e20851e2086" - "1e6a21871e20861e20871e6a21881e20871e20881e6a21891e20881e20891e6a218a1e20891e208a1e6a218b1e208a" - "1e208b1e6a218c1e208b1e208c1e6a218d1e208c1e208d1e6a218e1e208d1e208e1e6a218f1e208e1e208f1e6a2190" - "1e208f1e20901e6a21911e20901e20911e6a21921e20911e20921e6a21931e20921e20931e6a21941e20931e20941e" - "6a21951e20941e20951e6a21961e20951e20961e6a21971e20961e20971e6a21981e20971e20981e6a21991e20981e" - "20991e6a219a1e20991e209a1e6a219b1e209a1e209b1e6a219c1e209b1e209c1e6a219d1e209c1e209d1e6a219e1e" - "209d1e209e1e6a219f1e209e1e209f1e6a21a01e209f1e20a01e6a21a11e20a01e20a11e6a21a21e20a11e20a21e6a" - "21a31e20a21e20a31e6a21a41e20a31e20a41e6a21a51e20a41e20a51e6a21a61e20a51e20a61e6a21a71e20a61e20" - "a71e6a21a81e20a71e20a81e6a21a91e20a81e20a91e6a21aa1e20a91e20aa1e6a21ab1e20aa1e20ab1e6a21ac1e20" - "ab1e20ac1e6a21ad1e20ac1e20ad1e6a21ae1e20ad1e20ae1e6a21af1e20ae1e20af1e6a21b01e20af1e20b01e6a21" - "b11e20b01e20b11e6a21b21e20b11e20b21e6a21b31e20b21e20b31e6a21b41e20b31e20b41e6a21b51e20b41e20b5" - "1e6a21b61e20b51e20b61e6a21b71e20b61e20b71e6a21b81e20b71e20b81e6a21b91e20b81e20b91e6a21ba1e20b9" - "1e20ba1e6a21bb1e20ba1e20bb1e6a21bc1e20bb1e20bc1e6a21bd1e20bc1e20bd1e6a21be1e20bd1e20be1e6a21bf" - "1e20be1e20bf1e6a21c01e20bf1e20c01e6a21c11e20c01e20c11e6a21c21e20c11e20c21e6a21c31e20c21e20c31e" - "6a21c41e20c31e20c41e6a21c51e20c41e20c51e6a21c61e20c51e20c61e6a21c71e20c61e20c71e6a21c81e20c71e" - "20c81e6a21c91e20c81e20c91e6a21ca1e20c91e20ca1e6a21cb1e20ca1e20cb1e6a21cc1e20cb1e20cc1e6a21cd1e" - "20cc1e20cd1e6a21ce1e20cd1e20ce1e6a21cf1e20ce1e20cf1e6a21d01e20cf1e20d01e6a21d11e20d01e20d11e6a" - "21d21e20d11e20d21e6a21d31e20d21e20d31e6a21d41e20d31e20d41e6a21d51e20d41e20d51e6a21d61e20d51e20" - "d61e6a21d71e20d61e20d71e6a21d81e20d71e20d81e6a21d91e20d81e20d91e6a21da1e20d91e20da1e6a21db1e20" - "da1e20db1e6a21dc1e20db1e20dc1e6a21dd1e20dc1e20dd1e6a21de1e20dd1e20de1e6a21df1e20de1e20df1e6a21" - "e01e20df1e20e01e6a21e11e20e01e20e11e6a21e21e20e11e20e21e6a21e31e20e21e20e31e6a21e41e20e31e20e4" - "1e6a21e51e20e41e20e51e6a21e61e20e51e20e61e6a21e71e20e61e20e71e6a21e81e20e71e20e81e6a21e91e20e8" - "1e20e91e6a21ea1e20e91e20ea1e6a21eb1e20ea1e20eb1e6a21ec1e20eb1e20ec1e6a21ed1e20ec1e20ed1e6a21ee" - "1e20ed1e20ee1e6a21ef1e20ee1e20ef1e6a21f01e20ef1e20f01e6a21f11e20f01e20f11e6a21f21e20f11e20f21e" - "6a21f31e20f21e20f31e6a21f41e20f31e20f41e6a21f51e20f41e20f51e6a21f61e20f51e20f61e6a21f71e20f61e" - "20f71e6a21f81e20f71e20f81e6a21f91e20f81e20f91e6a21fa1e20f91e20fa1e6a21fb1e20fa1e20fb1e6a21fc1e" - "20fb1e20fc1e6a21fd1e20fc1e20fd1e6a21fe1e20fd1e20fe1e6a21ff1e20fe1e20ff1e6a21801f20ff1e20801f6a" - "21811f20801f20811f6a21821f20811f20821f6a21831f20821f20831f6a21841f20831f20841f6a21851f20841f20" - "851f6a21861f20851f20861f6a21871f20861f20871f6a21881f20871f20881f6a21891f20881f20891f6a218a1f20" - "891f208a1f6a218b1f208a1f208b1f6a218c1f208b1f208c1f6a218d1f208c1f208d1f6a218e1f208d1f208e1f6a21" - "8f1f208e1f208f1f6a21901f208f1f20901f6a21911f20901f20911f6a21921f20911f20921f6a21931f20921f2093" - "1f6a21941f20931f20941f6a21951f20941f20951f6a21961f20951f20961f6a21971f20961f20971f6a21981f2097" - "1f20981f6a21991f20981f20991f6a219a1f20991f209a1f6a219b1f209a1f209b1f6a219c1f209b1f209c1f6a219d" - "1f209c1f209d1f6a219e1f209d1f209e1f6a219f1f209e1f209f1f6a21a01f209f1f20a01f6a21a11f20a01f20a11f" - "6a21a21f20a11f20a21f6a21a31f20a21f20a31f6a21a41f20a31f20a41f6a21a51f20a41f20a51f6a21a61f20a51f" - "20a61f6a21a71f20a61f20a71f6a21a81f20a71f20a81f6a21a91f20a81f20a91f6a21aa1f20a91f20aa1f6a21ab1f" - "20aa1f20ab1f6a21ac1f20ab1f20ac1f6a21ad1f20ac1f20ad1f6a21ae1f20ad1f20ae1f6a21af1f20ae1f20af1f6a" - "21b01f20af1f20b01f6a21b11f20b01f20b11f6a21b21f20b11f20b21f6a21b31f20b21f20b31f6a21b41f20b31f20" - "b41f6a21b51f20b41f20b51f6a21b61f20b51f20b61f6a21b71f20b61f20b71f6a21b81f20b71f20b81f6a21b91f20" - "b81f20b91f6a21ba1f20b91f20ba1f6a21bb1f20ba1f20bb1f6a21bc1f20bb1f20bc1f6a21bd1f20bc1f20bd1f6a21" - "be1f20bd1f20be1f6a21bf1f20be1f20bf1f6a21c01f20bf1f20c01f6a21c11f20c01f20c11f6a21c21f20c11f20c2" - "1f6a21c31f20c21f20c31f6a21c41f20c31f20c41f6a21c51f20c41f20c51f6a21c61f20c51f20c61f6a21c71f20c6" - "1f20c71f6a21c81f20c71f20c81f6a21c91f20c81f20c91f6a21ca1f20c91f20ca1f6a21cb1f20ca1f20cb1f6a21cc" - "1f20cb1f20cc1f6a21cd1f20cc1f20cd1f6a21ce1f20cd1f20ce1f6a21cf1f20ce1f20cf1f6a21d01f20cf1f20d01f" - "6a21d11f20d01f20d11f6a21d21f20d11f20d21f6a21d31f20d21f20d31f6a21d41f20d31f20d41f6a21d51f20d41f" - "20d51f6a21d61f20d51f20d61f6a21d71f20d61f20d71f6a21d81f20d71f20d81f6a21d91f20d81f20d91f6a21da1f" - "20d91f20da1f6a21db1f20da1f20db1f6a21dc1f20db1f20dc1f6a21dd1f20dc1f20dd1f6a21de1f20dd1f20de1f6a" - "21df1f20de1f20df1f6a21e01f20df1f20e01f6a21e11f20e01f20e11f6a21e21f20e11f20e21f6a21e31f20e21f20" - "e31f6a21e41f20e31f20e41f6a21e51f20e41f20e51f6a21e61f20e51f20e61f6a21e71f20e61f20e71f6a21e81f20" - "e71f20e81f6a21e91f20e81f20e91f6a21ea1f20e91f20ea1f6a21eb1f20ea1f20eb1f6a21ec1f20eb1f20ec1f6a21" - "ed1f20ec1f20ed1f6a21ee1f20ed1f20ee1f6a21ef1f20ee1f20ef1f6a21f01f20ef1f20f01f6a21f11f20f01f20f1" - "1f6a21f21f20f11f20f21f6a21f31f20f21f20f31f6a21f41f20f31f20f41f6a21f51f20f41f20f51f6a21f61f20f5" - "1f20f61f6a21f71f20f61f20f71f6a21f81f20f71f20f81f6a21f91f20f81f20f91f6a21fa1f20f91f20fa1f6a21fb" - "1f20fa1f20fb1f6a21fc1f20fb1f20fc1f6a21fd1f20fc1f20fd1f6a21fe1f20fd1f20fe1f6a21ff1f20fe1f20ff1f" - "6a21802020ff1f2080206a2181202080202081206a2182202081202082206a2183202082202083206a218420208320" - "2084206a2185202084202085206a2186202085202086206a2187202086202087206a2188202087202088206a218920" - "2088202089206a218a20208920208a206a218b20208a20208b206a218c20208b20208c206a218d20208c20208d206a" - "218e20208d20208e206a218f20208e20208f206a219020208f202090206a2191202090202091206a21922020912020" - "92206a2193202092202093206a2194202093202094206a2195202094202095206a2196202095202096206a21972020" - "96202097206a2198202097202098206a2199202098202099206a219a20209920209a206a219b20209a20209b206a21" - "9c20209b20209c206a219d20209c20209d206a219e20209d20209e206a219f20209e20209f206a21a020209f2020a0" - "206a21a12020a02020a1206a21a22020a12020a2206a21a32020a22020a3206a21a42020a32020a4206a21a52020a4" - "2020a5206a21a62020a52020a6206a21a72020a62020a7206a21a82020a72020a8206a21a92020a82020a9206a21aa" - "2020a92020aa206a21ab2020aa2020ab206a21ac2020ab2020ac206a21ad2020ac2020ad206a21ae2020ad2020ae20" - "6a21af2020ae2020af206a21b02020af2020b0206a21b12020b02020b1206a21b22020b12020b2206a21b32020b220" - "20b3206a21b42020b32020b4206a21b52020b42020b5206a21b62020b52020b6206a21b72020b62020b7206a21b820" - "20b72020b8206a21b92020b82020b9206a21ba2020b92020ba206a21bb2020ba2020bb206a21bc2020bb2020bc206a" - "21bd2020bc2020bd206a21be2020bd2020be206a21bf2020be2020bf206a21c02020bf2020c0206a21c12020c02020" - "c1206a21c22020c12020c2206a21c32020c22020c3206a21c42020c32020c4206a21c52020c42020c5206a21c62020" - "c52020c6206a21c72020c62020c7206a21c82020c72020c8206a21c92020c82020c9206a21ca2020c92020ca206a21" - "cb2020ca2020cb206a21cc2020cb2020cc206a21cd2020cc2020cd206a21ce2020cd2020ce206a21cf2020ce2020cf" - "206a21d02020cf2020d0206a21d12020d02020d1206a21d22020d12020d2206a21d32020d22020d3206a21d42020d3" - "2020d4206a21d52020d42020d5206a21d62020d52020d6206a21d72020d62020d7206a21d82020d72020d8206a21d9" - "2020d82020d9206a21da2020d92020da206a21db2020da2020db206a21dc2020db2020dc206a21dd2020dc2020dd20" - "6a21de2020dd2020de206a21df2020de2020df206a21e02020df2020e0206a21e12020e02020e1206a21e22020e120" - "20e2206a21e32020e22020e3206a21e42020e32020e4206a21e52020e42020e5206a21e62020e52020e6206a21e720" - "20e62020e7206a21e82020e72020e8206a21e92020e82020e9206a21ea2020e92020ea206a21eb2020ea2020eb206a" - "21ec2020eb2020ec206a21ed2020ec2020ed206a21ee2020ed2020ee206a21ef2020ee2020ef206a21f02020ef2020" - "f0206a21f12020f02020f1206a21f22020f12020f2206a21f32020f22020f3206a21f42020f32020f4206a21f52020" - "f42020f5206a21f62020f52020f6206a21f72020f62020f7206a21f82020f72020f8206a21f92020f82020f9206a21" - "fa2020f92020fa206a21fb2020fa2020fb206a21fc2020fb2020fc206a21fd2020fc2020fd206a21fe2020fd2020fe" - "206a21ff2020fe2020ff206a21802120ff202080216a2181212080212081216a2182212081212082216a2183212082" - "212083216a2184212083212084216a2185212084212085216a2186212085212086216a2187212086212087216a2188" - "212087212088216a2189212088212089216a218a21208921208a216a218b21208a21208b216a218c21208b21208c21" - "6a218d21208c21208d216a218e21208d21208e216a218f21208e21208f216a219021208f212090216a219121209021" - "2091216a2192212091212092216a2193212092212093216a2194212093212094216a2195212094212095216a219621" - "2095212096216a2197212096212097216a2198212097212098216a2199212098212099216a219a21209921209a216a" - "219b21209a21209b216a219c21209b21209c216a219d21209c21209d216a219e21209d21209e216a219f21209e2120" - "9f216a21a021209f2120a0216a21a12120a02120a1216a21a22120a12120a2216a21a32120a22120a3216a21a42120" - "a32120a4216a21a52120a42120a5216a21a62120a52120a6216a21a72120a62120a7216a21a82120a72120a8216a21" - "a92120a82120a9216a21aa2120a92120aa216a21ab2120aa2120ab216a21ac2120ab2120ac216a21ad2120ac2120ad" - "216a21ae2120ad2120ae216a21af2120ae2120af216a21b02120af2120b0216a21b12120b02120b1216a21b22120b1" - "2120b2216a21b32120b22120b3216a21b42120b32120b4216a21b52120b42120b5216a21b62120b52120b6216a21b7" - "2120b62120b7216a21b82120b72120b8216a21b92120b82120b9216a21ba2120b92120ba216a21bb2120ba2120bb21" - "6a21bc2120bb2120bc216a21bd2120bc2120bd216a21be2120bd2120be216a21bf2120be2120bf216a21c02120bf21" - "20c0216a21c12120c02120c1216a21c22120c12120c2216a21c32120c22120c3216a21c42120c32120c4216a21c521" - "20c42120c5216a21c62120c52120c6216a21c72120c62120c7216a21c82120c72120c8216a21c92120c82120c9216a" - "21ca2120c92120ca216a21cb2120ca2120cb216a21cc2120cb2120cc216a21cd2120cc2120cd216a21ce2120cd2120" - "ce216a21cf2120ce2120cf216a21d02120cf2120d0216a21d12120d02120d1216a21d22120d12120d2216a21d32120" - "d22120d3216a21d42120d32120d4216a21d52120d42120d5216a21d62120d52120d6216a21d72120d62120d7216a21" - "d82120d72120d8216a21d92120d82120d9216a21da2120d92120da216a21db2120da2120db216a21dc2120db2120dc" - "216a21dd2120dc2120dd216a21de2120dd2120de216a21df2120de2120df216a21e02120df2120e0216a21e12120e0" - "2120e1216a21e22120e12120e2216a21e32120e22120e3216a21e42120e32120e4216a21e52120e42120e5216a21e6" - "2120e52120e6216a21e72120e62120e7216a21e82120e72120e8216a21e92120e82120e9216a21ea2120e92120ea21" - "6a21eb2120ea2120eb216a21ec2120eb2120ec216a21ed2120ec2120ed216a21ee2120ed2120ee216a21ef2120ee21" - "20ef216a21f02120ef2120f0216a21f12120f02120f1216a21f22120f12120f2216a21f32120f22120f3216a21f421" - "20f32120f4216a21f52120f42120f5216a21f62120f52120f6216a21f72120f62120f7216a21f82120f72120f8216a" - "21f92120f82120f9216a21fa2120f92120fa216a21fb2120fa2120fb216a21fc2120fb2120fc216a21fd2120fc2120" - "fd216a21fe2120fd2120fe216a21ff2120fe2120ff216a21802220ff212080226a2181222080222081226a21822220" - "81222082226a2183222082222083226a2184222083222084226a2185222084222085226a2186222085222086226a21" - "87222086222087226a2188222087222088226a2189222088222089226a218a22208922208a226a218b22208a22208b" - "226a218c22208b22208c226a218d22208c22208d226a218e22208d22208e226a218f22208e22208f226a219022208f" - "222090226a2191222090222091226a2192222091222092226a2193222092222093226a2194222093222094226a2195" - "222094222095226a2196222095222096226a2197222096222097226a2198222097222098226a219922209822209922" - "6a219a22209922209a226a219b22209a22209b226a219c22209b22209c226a219d22209c22209d226a219e22209d22" - "209e226a219f22209e22209f226a21a022209f2220a0226a21a12220a02220a1226a21a22220a12220a2226a21a322" - "20a22220a3226a21a42220a32220a4226a21a52220a42220a5226a21a62220a52220a6226a21a72220a62220a7226a" - "21a82220a72220a8226a21a92220a82220a9226a21aa2220a92220aa226a21ab2220aa2220ab226a21ac2220ab2220" - "ac226a21ad2220ac2220ad226a21ae2220ad2220ae226a21af2220ae2220af226a21b02220af2220b0226a21b12220" - "b02220b1226a21b22220b12220b2226a21b32220b22220b3226a21b42220b32220b4226a21b52220b42220b5226a21" - "b62220b52220b6226a21b72220b62220b7226a21b82220b72220b8226a21b92220b82220b9226a21ba2220b92220ba" - "226a21bb2220ba2220bb226a21bc2220bb2220bc226a21bd2220bc2220bd226a21be2220bd2220be226a21bf2220be" - "2220bf226a21c02220bf2220c0226a21c12220c02220c1226a21c22220c12220c2226a21c32220c22220c3226a21c4" - "2220c32220c4226a21c52220c42220c5226a21c62220c52220c6226a21c72220c62220c7226a21c82220c72220c822" - "6a21c92220c82220c9226a21ca2220c92220ca226a21cb2220ca2220cb226a21cc2220cb2220cc226a21cd2220cc22" - "20cd226a21ce2220cd2220ce226a21cf2220ce2220cf226a21d02220cf2220d0226a21d12220d02220d1226a21d222" - "20d12220d2226a21d32220d22220d3226a21d42220d32220d4226a21d52220d42220d5226a21d62220d52220d6226a" - "21d72220d62220d7226a21d82220d72220d8226a21d92220d82220d9226a21da2220d92220da226a21db2220da2220" - "db226a21dc2220db2220dc226a21dd2220dc2220dd226a21de2220dd2220de226a21df2220de2220df226a21e02220" - "df2220e0226a21e12220e02220e1226a21e22220e12220e2226a21e32220e22220e3226a21e42220e32220e4226a21" - "e52220e42220e5226a21e62220e52220e6226a21e72220e62220e7226a21e82220e72220e8226a21e92220e82220e9" - "226a21ea2220e92220ea226a21eb2220ea2220eb226a21ec2220eb2220ec226a21ed2220ec2220ed226a21ee2220ed" - "2220ee226a21ef2220ee2220ef226a21f02220ef2220f0226a21f12220f02220f1226a21f22220f12220f2226a21f3" - "2220f22220f3226a21f42220f32220f4226a21f52220f42220f5226a21f62220f52220f6226a21f72220f62220f722" - "6a21f82220f72220f8226a21f92220f82220f9226a21fa2220f92220fa226a21fb2220fa2220fb226a21fc2220fb22" - "20fc226a21fd2220fc2220fd226a21fe2220fd2220fe226a21ff2220fe2220ff226a21802320ff222080236a218123" - "2080232081236a2182232081232082236a2183232082232083236a2184232083232084236a2185232084232085236a" - "2186232085232086236a2187232086232087236a2188232087232088236a2189232088232089236a218a2320892320" - "8a236a218b23208a23208b236a218c23208b23208c236a218d23208c23208d236a218e23208d23208e236a218f2320" - "8e23208f236a219023208f232090236a2191232090232091236a2192232091232092236a2193232092232093236a21" - "94232093232094236a2195232094232095236a2196232095232096236a2197232096232097236a2198232097232098" - "236a2199232098232099236a219a23209923209a236a219b23209a23209b236a219c23209b23209c236a219d23209c" - "23209d236a219e23209d23209e236a219f23209e23209f236a21a023209f2320a0236a21a12320a02320a1236a21a2" - "2320a12320a2236a21a32320a22320a3236a21a42320a32320a4236a21a52320a42320a5236a21a62320a52320a623" - "6a21a72320a62320a7236a21a82320a72320a8236a21a92320a82320a9236a21aa2320a92320aa236a21ab2320aa23" - "20ab236a21ac2320ab2320ac236a21ad2320ac2320ad236a21ae2320ad2320ae236a21af2320ae2320af236a21b023" - "20af2320b0236a21b12320b02320b1236a21b22320b12320b2236a21b32320b22320b3236a21b42320b32320b4236a" - "21b52320b42320b5236a21b62320b52320b6236a21b72320b62320b7236a21b82320b72320b8236a21b92320b82320" - "b9236a21ba2320b92320ba236a21bb2320ba2320bb236a21bc2320bb2320bc236a21bd2320bc2320bd236a21be2320" - "bd2320be236a21bf2320be2320bf236a21c02320bf2320c0236a21c12320c02320c1236a21c22320c12320c2236a21" - "c32320c22320c3236a21c42320c32320c4236a21c52320c42320c5236a21c62320c52320c6236a21c72320c62320c7" - "236a21c82320c72320c8236a21c92320c82320c9236a21ca2320c92320ca236a21cb2320ca2320cb236a21cc2320cb" - "2320cc236a21cd2320cc2320cd236a21ce2320cd2320ce236a21cf2320ce2320cf236a21d02320cf2320d0236a21d1" - "2320d02320d1236a21d22320d12320d2236a21d32320d22320d3236a21d42320d32320d4236a21d52320d42320d523" - "6a21d62320d52320d6236a21d72320d62320d7236a21d82320d72320d8236a21d92320d82320d9236a21da2320d923" - "20da236a21db2320da2320db236a21dc2320db2320dc236a21dd2320dc2320dd236a21de2320dd2320de236a21df23" - "20de2320df236a21e02320df2320e0236a21e12320e02320e1236a21e22320e12320e2236a21e32320e22320e3236a" - "21e42320e32320e4236a21e52320e42320e5236a21e62320e52320e6236a21e72320e62320e7236a21e82320e72320" - "e8236a21e92320e82320e9236a21ea2320e92320ea236a21eb2320ea2320eb236a21ec2320eb2320ec236a21ed2320" - "ec2320ed236a21ee2320ed2320ee236a21ef2320ee2320ef236a21f02320ef2320f0236a21f12320f02320f1236a21" - "f22320f12320f2236a21f32320f22320f3236a21f42320f32320f4236a21f52320f42320f5236a21f62320f52320f6" - "236a21f72320f62320f7236a21f82320f72320f8236a21f92320f82320f9236a21fa2320f92320fa236a21fb2320fa" - "2320fb236a21fc2320fb2320fc236a21fd2320fc2320fd236a21fe2320fd2320fe236a21ff2320fe2320ff236a2180" - "2420ff232080246a2181242080242081246a2182242081242082246a2183242082242083246a218424208324208424" - "6a2185242084242085246a2186242085242086246a2187242086242087246a2188242087242088246a218924208824" - "2089246a218a24208924208a246a218b24208a24208b246a218c24208b24208c246a218d24208c24208d246a218e24" - "208d24208e246a218f24208e24208f246a219024208f242090246a2191242090242091246a2192242091242092246a" - "2193242092242093246a2194242093242094246a2195242094242095246a2196242095242096246a21972420962420" - "97246a2198242097242098246a2199242098242099246a219a24209924209a246a219b24209a24209b246a219c2420" - "9b24209c246a219d24209c24209d246a219e24209d24209e246a219f24209e24209f246a21a024209f2420a0246a21" - "a12420a02420a1246a21a22420a12420a2246a21a32420a22420a3246a21a42420a32420a4246a21a52420a42420a5" - "246a21a62420a52420a6246a21a72420a62420a7246a21a82420a72420a8246a21a92420a82420a9246a21aa2420a9" - "2420aa246a21ab2420aa2420ab246a21ac2420ab2420ac246a21ad2420ac2420ad246a21ae2420ad2420ae246a21af" - "2420ae2420af246a21b02420af2420b0246a21b12420b02420b1246a21b22420b12420b2246a21b32420b22420b324" - "6a21b42420b32420b4246a21b52420b42420b5246a21b62420b52420b6246a21b72420b62420b7246a21b82420b724" - "20b8246a21b92420b82420b9246a21ba2420b92420ba246a21bb2420ba2420bb246a21bc2420bb2420bc246a21bd24" - "20bc2420bd246a21be2420bd2420be246a21bf2420be2420bf246a21c02420bf2420c0246a21c12420c02420c1246a" - "21c22420c12420c2246a21c32420c22420c3246a21c42420c32420c4246a21c52420c42420c5246a21c62420c52420" - "c6246a21c72420c62420c7246a21c82420c72420c8246a21c92420c82420c9246a21ca2420c92420ca246a21cb2420" - "ca2420cb246a21cc2420cb2420cc246a21cd2420cc2420cd246a21ce2420cd2420ce246a21cf2420ce2420cf246a21" - "d02420cf2420d0246a21d12420d02420d1246a21d22420d12420d2246a21d32420d22420d3246a21d42420d32420d4" - "246a21d52420d42420d5246a21d62420d52420d6246a21d72420d62420d7246a21d82420d72420d8246a21d92420d8" - "2420d9246a21da2420d92420da246a21db2420da2420db246a21dc2420db2420dc246a21dd2420dc2420dd246a21de" - "2420dd2420de246a21df2420de2420df246a21e02420df2420e0246a21e12420e02420e1246a21e22420e12420e224" - "6a21e32420e22420e3246a21e42420e32420e4246a21e52420e42420e5246a21e62420e52420e6246a21e72420e624" - "20e7246a21e82420e72420e8246a21e92420e82420e9246a21ea2420e92420ea246a21eb2420ea2420eb246a21ec24" - "20eb2420ec246a21ed2420ec2420ed246a21ee2420ed2420ee246a21ef2420ee2420ef246a21f02420ef2420f0246a" - "21f12420f02420f1246a21f22420f12420f2246a21f32420f22420f3246a21f42420f32420f4246a21f52420f42420" - "f5246a21f62420f52420f6246a21f72420f62420f7246a21f82420f72420f8246a21f92420f82420f9246a21fa2420" - "f92420fa246a21fb2420fa2420fb246a21fc2420fb2420fc246a21fd2420fc2420fd246a21fe2420fd2420fe246a21" - "ff2420fe2420ff246a21802520ff242080256a2181252080252081256a2182252081252082256a2183252082252083" - "256a2184252083252084256a2185252084252085256a2186252085252086256a2187252086252087256a2188252087" - "252088256a2189252088252089256a218a25208925208a256a218b25208a25208b256a218c25208b25208c256a218d" - "25208c25208d256a218e25208d25208e256a218f25208e25208f256a219025208f252090256a219125209025209125" - "6a2192252091252092256a2193252092252093256a2194252093252094256a2195252094252095256a219625209525" - "2096256a2197252096252097256a2198252097252098256a2199252098252099256a219a25209925209a256a219b25" - "209a25209b256a219c25209b25209c256a219d25209c25209d256a219e25209d25209e256a219f25209e25209f256a" - "21a025209f2520a0256a21a12520a02520a1256a21a22520a12520a2256a21a32520a22520a3256a21a42520a32520" - "a4256a21a52520a42520a5256a21a62520a52520a6256a21a72520a62520a7256a21a82520a72520a8256a21a92520" - "a82520a9256a21aa2520a92520aa256a21ab2520aa2520ab256a21ac2520ab2520ac256a21ad2520ac2520ad256a21" - "ae2520ad2520ae256a21af2520ae2520af256a21b02520af2520b0256a21b12520b02520b1256a21b22520b12520b2" - "256a21b32520b22520b3256a21b42520b32520b4256a21b52520b42520b5256a21b62520b52520b6256a21b72520b6" - "2520b7256a21b82520b72520b8256a21b92520b82520b9256a21ba2520b92520ba256a21bb2520ba2520bb256a21bc" - "2520bb2520bc256a21bd2520bc2520bd256a21be2520bd2520be256a21bf2520be2520bf256a21c02520bf2520c025" - "6a21c12520c02520c1256a21c22520c12520c2256a21c32520c22520c3256a21c42520c32520c4256a21c52520c425" - "20c5256a21c62520c52520c6256a21c72520c62520c7256a21c82520c72520c8256a21c92520c82520c9256a21ca25" - "20c92520ca256a21cb2520ca2520cb256a21cc2520cb2520cc256a21cd2520cc2520cd256a21ce2520cd2520ce256a" - "21cf2520ce2520cf256a21d02520cf2520d0256a21d12520d02520d1256a21d22520d12520d2256a21d32520d22520" - "d3256a21d42520d32520d4256a21d52520d42520d5256a21d62520d52520d6256a21d72520d62520d7256a21d82520" - "d72520d8256a21d92520d82520d9256a21da2520d92520da256a21db2520da2520db256a21dc2520db2520dc256a21" - "dd2520dc2520dd256a21de2520dd2520de256a21df2520de2520df256a21e02520df2520e0256a21e12520e02520e1" - "256a21e22520e12520e2256a21e32520e22520e3256a21e42520e32520e4256a21e52520e42520e5256a21e62520e5" - "2520e6256a21e72520e62520e7256a21e82520e72520e8256a21e92520e82520e9256a21ea2520e92520ea256a21eb" - "2520ea2520eb256a21ec2520eb2520ec256a21ed2520ec2520ed256a21ee2520ed2520ee256a21ef2520ee2520ef25" - "6a21f02520ef2520f0256a21f12520f02520f1256a21f22520f12520f2256a21f32520f22520f3256a21f42520f325" - "20f4256a21f52520f42520f5256a21f62520f52520f6256a21f72520f62520f7256a21f82520f72520f8256a21f925" - "20f82520f9256a21fa2520f92520fa256a21fb2520fa2520fb256a21fc2520fb2520fc256a21fd2520fc2520fd256a" - "21fe2520fd2520fe256a21ff2520fe2520ff256a21802620ff252080266a2181262080262081266a21822620812620" - "82266a2183262082262083266a2184262083262084266a2185262084262085266a2186262085262086266a21872620" - "86262087266a2188262087262088266a2189262088262089266a218a26208926208a266a218b26208a26208b266a21" - "8c26208b26208c266a218d26208c26208d266a218e26208d26208e266a218f26208e26208f266a219026208f262090" - "266a2191262090262091266a2192262091262092266a2193262092262093266a2194262093262094266a2195262094" - "262095266a2196262095262096266a2197262096262097266a2198262097262098266a2199262098262099266a219a" - "26209926209a266a219b26209a26209b266a219c26209b26209c266a219d26209c26209d266a219e26209d26209e26" - "6a219f26209e26209f266a21a026209f2620a0266a21a12620a02620a1266a21a22620a12620a2266a21a32620a226" - "20a3266a21a42620a32620a4266a21a52620a42620a5266a21a62620a52620a6266a21a72620a62620a7266a21a826" - "20a72620a8266a21a92620a82620a9266a21aa2620a92620aa266a21ab2620aa2620ab266a21ac2620ab2620ac266a" - "21ad2620ac2620ad266a21ae2620ad2620ae266a21af2620ae2620af266a21b02620af2620b0266a21b12620b02620" - "b1266a21b22620b12620b2266a21b32620b22620b3266a21b42620b32620b4266a21b52620b42620b5266a21b62620" - "b52620b6266a21b72620b62620b7266a21b82620b72620b8266a21b92620b82620b9266a21ba2620b92620ba266a21" - "bb2620ba2620bb266a21bc2620bb2620bc266a21bd2620bc2620bd266a21be2620bd2620be266a21bf2620be2620bf" - "266a21c02620bf2620c0266a21c12620c02620c1266a21c22620c12620c2266a21c32620c22620c3266a21c42620c3" - "2620c4266a21c52620c42620c5266a21c62620c52620c6266a21c72620c62620c7266a21c82620c72620c8266a21c9" - "2620c82620c9266a21ca2620c92620ca266a21cb2620ca2620cb266a21cc2620cb2620cc266a21cd2620cc2620cd26" - "6a21ce2620cd2620ce266a21cf2620ce2620cf266a21d02620cf2620d0266a21d12620d02620d1266a21d22620d126" - "20d2266a21d32620d22620d3266a21d42620d32620d4266a21d52620d42620d5266a21d62620d52620d6266a21d726" - "20d62620d7266a21d82620d72620d8266a21d92620d82620d9266a21da2620d92620da266a21db2620da2620db266a" - "21dc2620db2620dc266a21dd2620dc2620dd266a21de2620dd2620de266a21df2620de2620df266a21e02620df2620" - "e0266a21e12620e02620e1266a21e22620e12620e2266a21e32620e22620e3266a21e42620e32620e4266a21e52620" - "e42620e5266a21e62620e52620e6266a21e72620e62620e7266a21e82620e72620e8266a21e92620e82620e9266a21" - "ea2620e92620ea266a21eb2620ea2620eb266a21ec2620eb2620ec266a21ed2620ec2620ed266a21ee2620ed2620ee" - "266a21ef2620ee2620ef266a21f02620ef2620f0266a21f12620f02620f1266a21f22620f12620f2266a21f32620f2" - "2620f3266a21f42620f32620f4266a21f52620f42620f5266a21f62620f52620f6266a21f72620f62620f7266a21f8" - "2620f72620f8266a21f92620f82620f9266a21fa2620f92620fa266a21fb2620fa2620fb266a21fc2620fb2620fc26" - "6a21fd2620fc2620fd266a21fe2620fd2620fe266a21ff2620fe2620ff266a21802720ff262080276a218127208027" - "2081276a2182272081272082276a2183272082272083276a2184272083272084276a2185272084272085276a218627" - "2085272086276a2187272086272087276a2188272087272088276a2189272088272089276a218a27208927208a276a" - "218b27208a27208b276a218c27208b27208c276a218d27208c27208d276a218e27208d27208e276a218f27208e2720" - "8f276a219027208f272090276a2191272090272091276a2192272091272092276a2193272092272093276a21942720" - "93272094276a2195272094272095276a2196272095272096276a2197272096272097276a2198272097272098276a21" - "99272098272099276a219a27209927209a276a219b27209a27209b276a219c27209b27209c276a219d27209c27209d" - "276a219e27209d27209e276a219f27209e27209f276a21a027209f2720a0276a21a12720a02720a1276a21a22720a1" - "2720a2276a21a32720a22720a3276a21a42720a32720a4276a21a52720a42720a5276a21a62720a52720a6276a21a7" - "2720a62720a7276a21a82720a72720a8276a21a92720a82720a9276a21aa2720a92720aa276a21ab2720aa2720ab27" - "6a21ac2720ab2720ac276a21ad2720ac2720ad276a21ae2720ad2720ae276a21af2720ae2720af276a21b02720af27" - "20b0276a21b12720b02720b1276a21b22720b12720b2276a21b32720b22720b3276a21b42720b32720b4276a21b527" - "20b42720b5276a21b62720b52720b6276a21b72720b62720b7276a21b82720b72720b8276a21b92720b82720b9276a" - "21ba2720b92720ba276a21bb2720ba2720bb276a21bc2720bb2720bc276a21bd2720bc2720bd276a21be2720bd2720" - "be276a21bf2720be2720bf276a21c02720bf2720c0276a21c12720c02720c1276a21c22720c12720c2276a21c32720" - "c22720c3276a21c42720c32720c4276a21c52720c42720c5276a21c62720c52720c6276a21c72720c62720c7276a21" - "c82720c72720c8276a21c92720c82720c9276a21ca2720c92720ca276a21cb2720ca2720cb276a21cc2720cb2720cc" - "276a21cd2720cc2720cd276a21ce2720cd2720ce276a21cf2720ce2720cf276a21d02720cf2720d0276a21d12720d0" - "2720d1276a21d22720d12720d2276a21d32720d22720d3276a21d42720d32720d4276a21d52720d42720d5276a21d6" - "2720d52720d6276a21d72720d62720d7276a21d82720d72720d8276a21d92720d82720d9276a21da2720d92720da27" - "6a21db2720da2720db276a21dc2720db2720dc276a21dd2720dc2720dd276a21de2720dd2720de276a21df2720de27" - "20df276a21e02720df2720e0276a21e12720e02720e1276a21e22720e12720e2276a21e32720e22720e3276a21e427" - "20e32720e4276a21e52720e42720e5276a21e62720e52720e6276a21e72720e62720e7276a21e82720e72720e8276a" - "21e92720e82720e9276a21ea2720e92720ea276a21eb2720ea2720eb276a21ec2720eb2720ec276a21ed2720ec2720" - "ed276a21ee2720ed2720ee276a21ef2720ee2720ef276a21f02720ef2720f0276a21f12720f02720f1276a21f22720" - "f12720f2276a21f32720f22720f3276a21f42720f32720f4276a21f52720f42720f5276a21f62720f52720f6276a21" - "f72720f62720f7276a21f82720f72720f8276a21f92720f82720f9276a21fa2720f92720fa276a21fb2720fa2720fb" - "276a21fc2720fb2720fc276a21fd2720fc2720fd276a21fe2720fd2720fe276a21ff2720fe2720ff276a21802820ff" - "272080286a2181282080282081286a2182282081282082286a2183282082282083286a2184282083282084286a2185" - "282084282085286a2186282085282086286a2187282086282087286a2188282087282088286a218928208828208928" - "6a218a28208928208a286a218b28208a28208b286a218c28208b28208c286a218d28208c28208d286a218e28208d28" - "208e286a218f28208e28208f286a219028208f282090286a2191282090282091286a2192282091282092286a219328" - "2092282093286a2194282093282094286a2195282094282095286a2196282095282096286a2197282096282097286a" - "2198282097282098286a2199282098282099286a219a28209928209a286a219b28209a28209b286a219c28209b2820" - "9c286a219d28209c28209d286a219e28209d28209e286a219f28209e28209f286a21a028209f2820a0286a21a12820" - "a02820a1286a21a22820a12820a2286a21a32820a22820a3286a21a42820a32820a4286a21a52820a42820a5286a21" - "a62820a52820a6286a21a72820a62820a7286a21a82820a72820a8286a21a92820a82820a9286a21aa2820a92820aa" - "286a21ab2820aa2820ab286a21ac2820ab2820ac286a21ad2820ac2820ad286a21ae2820ad2820ae286a21af2820ae" - "2820af286a21b02820af2820b0286a21b12820b02820b1286a21b22820b12820b2286a21b32820b22820b3286a21b4" - "2820b32820b4286a21b52820b42820b5286a21b62820b52820b6286a21b72820b62820b7286a21b82820b72820b828" - "6a21b92820b82820b9286a21ba2820b92820ba286a21bb2820ba2820bb286a21bc2820bb2820bc286a21bd2820bc28" - "20bd286a21be2820bd2820be286a21bf2820be2820bf286a21c02820bf2820c0286a21c12820c02820c1286a21c228" - "20c12820c2286a21c32820c22820c3286a21c42820c32820c4286a21c52820c42820c5286a21c62820c52820c6286a" - "21c72820c62820c7286a21c82820c72820c8286a21c92820c82820c9286a21ca2820c92820ca286a21cb2820ca2820" - "cb286a21cc2820cb2820cc286a21cd2820cc2820cd286a21ce2820cd2820ce286a21cf2820ce2820cf286a21d02820" - "cf2820d0286a21d12820d02820d1286a21d22820d12820d2286a21d32820d22820d3286a21d42820d32820d4286a21" - "d52820d42820d5286a21d62820d52820d6286a21d72820d62820d7286a21d82820d72820d8286a21d92820d82820d9" - "286a21da2820d92820da286a21db2820da2820db286a21dc2820db2820dc286a21dd2820dc2820dd286a21de2820dd" - "2820de286a21df2820de2820df286a21e02820df2820e0286a21e12820e02820e1286a21e22820e12820e2286a21e3" - "2820e22820e3286a21e42820e32820e4286a21e52820e42820e5286a21e62820e52820e6286a21e72820e62820e728" - "6a21e82820e72820e8286a21e92820e82820e9286a21ea2820e92820ea286a21eb2820ea2820eb286a21ec2820eb28" - "20ec286a21ed2820ec2820ed286a21ee2820ed2820ee286a21ef2820ee2820ef286a21f02820ef2820f0286a21f128" - "20f02820f1286a21f22820f12820f2286a21f32820f22820f3286a21f42820f32820f4286a21f52820f42820f5286a" - "21f62820f52820f6286a21f72820f62820f7286a21f82820f72820f8286a21f92820f82820f9286a21fa2820f92820" - "fa286a21fb2820fa2820fb286a21fc2820fb2820fc286a21fd2820fc2820fd286a21fe2820fd2820fe286a21ff2820" - "fe2820ff286a21802920ff282080296a2181292080292081296a2182292081292082296a2183292082292083296a21" - "84292083292084296a2185292084292085296a2186292085292086296a2187292086292087296a2188292087292088" - "296a2189292088292089296a218a29208929208a296a218b29208a29208b296a218c29208b29208c296a218d29208c" - "29208d296a218e29208d29208e296a218f29208e29208f296a219029208f292090296a2191292090292091296a2192" - "292091292092296a2193292092292093296a2194292093292094296a2195292094292095296a219629209529209629" - "6a2197292096292097296a2198292097292098296a2199292098292099296a219a29209929209a296a219b29209a29" - "209b296a219c29209b29209c296a219d29209c29209d296a219e29209d29209e296a219f29209e29209f296a21a029" - "209f2920a0296a21a12920a02920a1296a21a22920a12920a2296a21a32920a22920a3296a21a42920a32920a4296a" - "21a52920a42920a5296a21a62920a52920a6296a21a72920a62920a7296a21a82920a72920a8296a21a92920a82920" - "a9296a21aa2920a92920aa296a21ab2920aa2920ab296a21ac2920ab2920ac296a21ad2920ac2920ad296a21ae2920" - "ad2920ae296a21af2920ae2920af296a21b02920af2920b0296a21b12920b02920b1296a21b22920b12920b2296a21" - "b32920b22920b3296a21b42920b32920b4296a21b52920b42920b5296a21b62920b52920b6296a21b72920b62920b7" - "296a21b82920b72920b8296a21b92920b82920b9296a21ba2920b92920ba296a21bb2920ba2920bb296a21bc2920bb" - "2920bc296a21bd2920bc2920bd296a21be2920bd2920be296a21bf2920be2920bf296a21c02920bf2920c0296a21c1" - "2920c02920c1296a21c22920c12920c2296a21c32920c22920c3296a21c42920c32920c4296a21c52920c42920c529" - "6a21c62920c52920c6296a21c72920c62920c7296a21c82920c72920c8296a21c92920c82920c9296a21ca2920c929" - "20ca296a21cb2920ca2920cb296a21cc2920cb2920cc296a21cd2920cc2920cd296a21ce2920cd2920ce296a21cf29" - "20ce2920cf296a21d02920cf2920d0296a21d12920d02920d1296a21d22920d12920d2296a21d32920d22920d3296a" - "21d42920d32920d4296a21d52920d42920d5296a21d62920d52920d6296a21d72920d62920d7296a21d82920d72920" - "d8296a21d92920d82920d9296a21da2920d92920da296a21db2920da2920db296a21dc2920db2920dc296a21dd2920" - "dc2920dd296a21de2920dd2920de296a21df2920de2920df296a21e02920df2920e0296a21e12920e02920e1296a21" - "e22920e12920e2296a21e32920e22920e3296a21e42920e32920e4296a21e52920e42920e5296a21e62920e52920e6" - "296a21e72920e62920e7296a21e82920e72920e8296a21e92920e82920e9296a21ea2920e92920ea296a21eb2920ea" - "2920eb296a21ec2920eb2920ec296a21ed2920ec2920ed296a21ee2920ed2920ee296a21ef2920ee2920ef296a21f0" - "2920ef2920f0296a21f12920f02920f1296a21f22920f12920f2296a21f32920f22920f3296a21f42920f32920f429" - "6a21f52920f42920f5296a21f62920f52920f6296a21f72920f62920f7296a21f82920f72920f8296a21f92920f829" - "20f9296a21fa2920f92920fa296a21fb2920fa2920fb296a21fc2920fb2920fc296a21fd2920fc2920fd296a21fe29" - "20fd2920fe296a21ff2920fe2920ff296a21802a20ff2920802a6a21812a20802a20812a6a21822a20812a20822a6a" - "21832a20822a20832a6a21842a20832a20842a6a21852a20842a20852a6a21862a20852a20862a6a21872a20862a20" - "872a6a21882a20872a20882a6a21892a20882a20892a6a218a2a20892a208a2a6a218b2a208a2a208b2a6a218c2a20" - "8b2a208c2a6a218d2a208c2a208d2a6a218e2a208d2a208e2a6a218f2a208e2a208f2a6a21902a208f2a20902a6a21" - "912a20902a20912a6a21922a20912a20922a6a21932a20922a20932a6a21942a20932a20942a6a21952a20942a2095" - "2a6a21962a20952a20962a6a21972a20962a20972a6a21982a20972a20982a6a21992a20982a20992a6a219a2a2099" - "2a209a2a6a219b2a209a2a209b2a6a219c2a209b2a209c2a6a219d2a209c2a209d2a6a219e2a209d2a209e2a6a219f" - "2a209e2a209f2a6a21a02a209f2a20a02a6a21a12a20a02a20a12a6a21a22a20a12a20a22a6a21a32a20a22a20a32a" - "6a21a42a20a32a20a42a6a21a52a20a42a20a52a6a21a62a20a52a20a62a6a21a72a20a62a20a72a6a21a82a20a72a" - "20a82a6a21a92a20a82a20a92a6a21aa2a20a92a20aa2a6a21ab2a20aa2a20ab2a6a21ac2a20ab2a20ac2a6a21ad2a" - "20ac2a20ad2a6a21ae2a20ad2a20ae2a6a21af2a20ae2a20af2a6a21b02a20af2a20b02a6a21b12a20b02a20b12a6a" - "21b22a20b12a20b22a6a21b32a20b22a20b32a6a21b42a20b32a20b42a6a21b52a20b42a20b52a6a21b62a20b52a20" - "b62a6a21b72a20b62a20b72a6a21b82a20b72a20b82a6a21b92a20b82a20b92a6a21ba2a20b92a20ba2a6a21bb2a20" - "ba2a20bb2a6a21bc2a20bb2a20bc2a6a21bd2a20bc2a20bd2a6a21be2a20bd2a20be2a6a21bf2a20be2a20bf2a6a21" - "c02a20bf2a20c02a6a21c12a20c02a20c12a6a21c22a20c12a20c22a6a21c32a20c22a20c32a6a21c42a20c32a20c4" - "2a6a21c52a20c42a20c52a6a21c62a20c52a20c62a6a21c72a20c62a20c72a6a21c82a20c72a20c82a6a21c92a20c8" - "2a20c92a6a21ca2a20c92a20ca2a6a21cb2a20ca2a20cb2a6a21cc2a20cb2a20cc2a6a21cd2a20cc2a20cd2a6a21ce" - "2a20cd2a20ce2a6a21cf2a20ce2a20cf2a6a21d02a20cf2a20d02a6a21d12a20d02a20d12a6a21d22a20d12a20d22a" - "6a21d32a20d22a20d32a6a21d42a20d32a20d42a6a21d52a20d42a20d52a6a21d62a20d52a20d62a6a21d72a20d62a" - "20d72a6a21d82a20d72a20d82a6a21d92a20d82a20d92a6a21da2a20d92a20da2a6a21db2a20da2a20db2a6a21dc2a" - "20db2a20dc2a6a21dd2a20dc2a20dd2a6a21de2a20dd2a20de2a6a21df2a20de2a20df2a6a21e02a20df2a20e02a6a" - "21e12a20e02a20e12a6a21e22a20e12a20e22a6a21e32a20e22a20e32a6a21e42a20e32a20e42a6a21e52a20e42a20" - "e52a6a21e62a20e52a20e62a6a21e72a20e62a20e72a6a21e82a20e72a20e82a6a21e92a20e82a20e92a6a21ea2a20" - "e92a20ea2a6a21eb2a20ea2a20eb2a6a21ec2a20eb2a20ec2a6a21ed2a20ec2a20ed2a6a21ee2a20ed2a20ee2a6a21" - "ef2a20ee2a20ef2a6a21f02a20ef2a20f02a6a21f12a20f02a20f12a6a21f22a20f12a20f22a6a21f32a20f22a20f3" - "2a6a21f42a20f32a20f42a6a21f52a20f42a20f52a6a21f62a20f52a20f62a6a21f72a20f62a20f72a6a21f82a20f7" - "2a20f82a6a21f92a20f82a20f92a6a21fa2a20f92a20fa2a6a21fb2a20fa2a20fb2a6a21fc2a20fb2a20fc2a6a21fd" - "2a20fc2a20fd2a6a21fe2a20fd2a20fe2a6a21ff2a20fe2a20ff2a6a21802b20ff2a20802b6a21812b20802b20812b" - "6a21822b20812b20822b6a21832b20822b20832b6a21842b20832b20842b6a21852b20842b20852b6a21862b20852b" - "20862b6a21872b20862b20872b6a21882b20872b20882b6a21892b20882b20892b6a218a2b20892b208a2b6a218b2b" - "208a2b208b2b6a218c2b208b2b208c2b6a218d2b208c2b208d2b6a218e2b208d2b208e2b6a218f2b208e2b208f2b6a" - "21902b208f2b20902b6a21912b20902b20912b6a21922b20912b20922b6a21932b20922b20932b6a21942b20932b20" - "942b6a21952b20942b20952b6a21962b20952b20962b6a21972b20962b20972b6a21982b20972b20982b6a21992b20" - "982b20992b6a219a2b20992b209a2b6a219b2b209a2b209b2b6a219c2b209b2b209c2b6a219d2b209c2b209d2b6a21" - "9e2b209d2b209e2b6a219f2b209e2b209f2b6a21a02b209f2b20a02b6a21a12b20a02b20a12b6a21a22b20a12b20a2" - "2b6a21a32b20a22b20a32b6a21a42b20a32b20a42b6a21a52b20a42b20a52b6a21a62b20a52b20a62b6a21a72b20a6" - "2b20a72b6a21a82b20a72b20a82b6a21a92b20a82b20a92b6a21aa2b20a92b20aa2b6a21ab2b20aa2b20ab2b6a21ac" - "2b20ab2b20ac2b6a21ad2b20ac2b20ad2b6a21ae2b20ad2b20ae2b6a21af2b20ae2b20af2b6a21b02b20af2b20b02b" - "6a21b12b20b02b20b12b6a21b22b20b12b20b22b6a21b32b20b22b20b32b6a21b42b20b32b20b42b6a21b52b20b42b" - "20b52b6a21b62b20b52b20b62b6a21b72b20b62b20b72b6a21b82b20b72b20b82b6a21b92b20b82b20b92b6a21ba2b" - "20b92b20ba2b6a21bb2b20ba2b20bb2b6a21bc2b20bb2b20bc2b6a21bd2b20bc2b20bd2b6a21be2b20bd2b20be2b6a" - "21bf2b20be2b20bf2b6a21c02b20bf2b20c02b6a21c12b20c02b20c12b6a21c22b20c12b20c22b6a21c32b20c22b20" - "c32b6a21c42b20c32b20c42b6a21c52b20c42b20c52b6a21c62b20c52b20c62b6a21c72b20c62b20c72b6a21c82b20" - "c72b20c82b6a21c92b20c82b20c92b6a21ca2b20c92b20ca2b6a21cb2b20ca2b20cb2b6a21cc2b20cb2b20cc2b6a21" - "cd2b20cc2b20cd2b6a21ce2b20cd2b20ce2b6a21cf2b20ce2b20cf2b6a21d02b20cf2b20d02b6a21d12b20d02b20d1" - "2b6a21d22b20d12b20d22b6a21d32b20d22b20d32b6a21d42b20d32b20d42b6a21d52b20d42b20d52b6a21d62b20d5" - "2b20d62b6a21d72b20d62b20d72b6a21d82b20d72b20d82b6a21d92b20d82b20d92b6a21da2b20d92b20da2b6a21db" - "2b20da2b20db2b6a21dc2b20db2b20dc2b6a21dd2b20dc2b20dd2b6a21de2b20dd2b20de2b6a21df2b20de2b20df2b" - "6a21e02b20df2b20e02b6a21e12b20e02b20e12b6a21e22b20e12b20e22b6a21e32b20e22b20e32b6a21e42b20e32b" - "20e42b6a21e52b20e42b20e52b6a21e62b20e52b20e62b6a21e72b20e62b20e72b6a21e82b20e72b20e82b6a21e92b" - "20e82b20e92b6a21ea2b20e92b20ea2b6a21eb2b20ea2b20eb2b6a21ec2b20eb2b20ec2b6a21ed2b20ec2b20ed2b6a" - "21ee2b20ed2b20ee2b6a21ef2b20ee2b20ef2b6a21f02b20ef2b20f02b6a21f12b20f02b20f12b6a21f22b20f12b20" - "f22b6a21f32b20f22b20f32b6a21f42b20f32b20f42b6a21f52b20f42b20f52b6a21f62b20f52b20f62b6a21f72b20" - "f62b20f72b6a21f82b20f72b20f82b6a21f92b20f82b20f92b6a21fa2b20f92b20fa2b6a21fb2b20fa2b20fb2b6a21" - "fc2b20fb2b20fc2b6a21fd2b20fc2b20fd2b6a21fe2b20fd2b20fe2b6a21ff2b20fe2b20ff2b6a21802c20ff2b2080" - "2c6a21812c20802c20812c6a21822c20812c20822c6a21832c20822c20832c6a21842c20832c20842c6a21852c2084" - "2c20852c6a21862c20852c20862c6a21872c20862c20872c6a21882c20872c20882c6a21892c20882c20892c6a218a" - "2c20892c208a2c6a218b2c208a2c208b2c6a218c2c208b2c208c2c6a218d2c208c2c208d2c6a218e2c208d2c208e2c" - "6a218f2c208e2c208f2c6a21902c208f2c20902c6a21912c20902c20912c6a21922c20912c20922c6a21932c20922c" - "20932c6a21942c20932c20942c6a21952c20942c20952c6a21962c20952c20962c6a21972c20962c20972c6a21982c" - "20972c20982c6a21992c20982c20992c6a219a2c20992c209a2c6a219b2c209a2c209b2c6a219c2c209b2c209c2c6a" - "219d2c209c2c209d2c6a219e2c209d2c209e2c6a219f2c209e2c209f2c6a21a02c209f2c20a02c6a21a12c20a02c20" - "a12c6a21a22c20a12c20a22c6a21a32c20a22c20a32c6a21a42c20a32c20a42c6a21a52c20a42c20a52c6a21a62c20" - "a52c20a62c6a21a72c20a62c20a72c6a21a82c20a72c20a82c6a21a92c20a82c20a92c6a21aa2c20a92c20aa2c6a21" - "ab2c20aa2c20ab2c6a21ac2c20ab2c20ac2c6a21ad2c20ac2c20ad2c6a21ae2c20ad2c20ae2c6a21af2c20ae2c20af" - "2c6a21b02c20af2c20b02c6a21b12c20b02c20b12c6a21b22c20b12c20b22c6a21b32c20b22c20b32c6a21b42c20b3" - "2c20b42c6a21b52c20b42c20b52c6a21b62c20b52c20b62c6a21b72c20b62c20b72c6a21b82c20b72c20b82c6a21b9" - "2c20b82c20b92c6a21ba2c20b92c20ba2c6a21bb2c20ba2c20bb2c6a21bc2c20bb2c20bc2c6a21bd2c20bc2c20bd2c" - "6a21be2c20bd2c20be2c6a21bf2c20be2c20bf2c6a21c02c20bf2c20c02c6a21c12c20c02c20c12c6a21c22c20c12c" - "20c22c6a21c32c20c22c20c32c6a21c42c20c32c20c42c6a21c52c20c42c20c52c6a21c62c20c52c20c62c6a21c72c" - "20c62c20c72c6a21c82c20c72c20c82c6a21c92c20c82c20c92c6a21ca2c20c92c20ca2c6a21cb2c20ca2c20cb2c6a" - "21cc2c20cb2c20cc2c6a21cd2c20cc2c20cd2c6a21ce2c20cd2c20ce2c6a21cf2c20ce2c20cf2c6a21d02c20cf2c20" - "d02c6a21d12c20d02c20d12c6a21d22c20d12c20d22c6a21d32c20d22c20d32c6a21d42c20d32c20d42c6a21d52c20" - "d42c20d52c6a21d62c20d52c20d62c6a21d72c20d62c20d72c6a21d82c20d72c20d82c6a21d92c20d82c20d92c6a21" - "da2c20d92c20da2c6a21db2c20da2c20db2c6a21dc2c20db2c20dc2c6a21dd2c20dc2c20dd2c6a21de2c20dd2c20de" - "2c6a21df2c20de2c20df2c6a21e02c20df2c20e02c6a21e12c20e02c20e12c6a21e22c20e12c20e22c6a21e32c20e2" - "2c20e32c6a21e42c20e32c20e42c6a21e52c20e42c20e52c6a21e62c20e52c20e62c6a21e72c20e62c20e72c6a21e8" - "2c20e72c20e82c6a21e92c20e82c20e92c6a21ea2c20e92c20ea2c6a21eb2c20ea2c20eb2c6a21ec2c20eb2c20ec2c" - "6a21ed2c20ec2c20ed2c6a21ee2c20ed2c20ee2c6a21ef2c20ee2c20ef2c6a21f02c20ef2c20f02c6a21f12c20f02c" - "20f12c6a21f22c20f12c20f22c6a21f32c20f22c20f32c6a21f42c20f32c20f42c6a21f52c20f42c20f52c6a21f62c" - "20f52c20f62c6a21f72c20f62c20f72c6a21f82c20f72c20f82c6a21f92c20f82c20f92c6a21fa2c20f92c20fa2c6a" - "21fb2c20fa2c20fb2c6a21fc2c20fb2c20fc2c6a21fd2c20fc2c20fd2c6a21fe2c20fd2c20fe2c6a21ff2c20fe2c20" - "ff2c6a21802d20ff2c20802d6a21812d20802d20812d6a21822d20812d20822d6a21832d20822d20832d6a21842d20" - "832d20842d6a21852d20842d20852d6a21862d20852d20862d6a21872d20862d20872d6a21882d20872d20882d6a21" - "892d20882d20892d6a218a2d20892d208a2d6a218b2d208a2d208b2d6a218c2d208b2d208c2d6a218d2d208c2d208d" - "2d6a218e2d208d2d208e2d6a218f2d208e2d208f2d6a21902d208f2d20902d6a21912d20902d20912d6a21922d2091" - "2d20922d6a21932d20922d20932d6a21942d20932d20942d6a21952d20942d20952d6a21962d20952d20962d6a2197" - "2d20962d20972d6a21982d20972d20982d6a21992d20982d20992d6a219a2d20992d209a2d6a219b2d209a2d209b2d" - "6a219c2d209b2d209c2d6a219d2d209c2d209d2d6a219e2d209d2d209e2d6a219f2d209e2d209f2d6a21a02d209f2d" - "20a02d6a21a12d20a02d20a12d6a21a22d20a12d20a22d6a21a32d20a22d20a32d6a21a42d20a32d20a42d6a21a52d" - "20a42d20a52d6a21a62d20a52d20a62d6a21a72d20a62d20a72d6a21a82d20a72d20a82d6a21a92d20a82d20a92d6a" - "21aa2d20a92d20aa2d6a21ab2d20aa2d20ab2d6a21ac2d20ab2d20ac2d6a21ad2d20ac2d20ad2d6a21ae2d20ad2d20" - "ae2d6a21af2d20ae2d20af2d6a21b02d20af2d20b02d6a21b12d20b02d20b12d6a21b22d20b12d20b22d6a21b32d20" - "b22d20b32d6a21b42d20b32d20b42d6a21b52d20b42d20b52d6a21b62d20b52d20b62d6a21b72d20b62d20b72d6a21" - "b82d20b72d20b82d6a21b92d20b82d20b92d6a21ba2d20b92d20ba2d6a21bb2d20ba2d20bb2d6a21bc2d20bb2d20bc" - "2d6a21bd2d20bc2d20bd2d6a21be2d20bd2d20be2d6a21bf2d20be2d20bf2d6a21c02d20bf2d20c02d6a21c12d20c0" - "2d20c12d6a21c22d20c12d20c22d6a21c32d20c22d20c32d6a21c42d20c32d20c42d6a21c52d20c42d20c52d6a21c6" - "2d20c52d20c62d6a21c72d20c62d20c72d6a21c82d20c72d20c82d6a21c92d20c82d20c92d6a21ca2d20c92d20ca2d" - "6a21cb2d20ca2d20cb2d6a21cc2d20cb2d20cc2d6a21cd2d20cc2d20cd2d6a21ce2d20cd2d20ce2d6a21cf2d20ce2d" - "20cf2d6a21d02d20cf2d20d02d6a21d12d20d02d20d12d6a21d22d20d12d20d22d6a21d32d20d22d20d32d6a21d42d" - "20d32d20d42d6a21d52d20d42d20d52d6a21d62d20d52d20d62d6a21d72d20d62d20d72d6a21d82d20d72d20d82d6a" - "21d92d20d82d20d92d6a21da2d20d92d20da2d6a21db2d20da2d20db2d6a21dc2d20db2d20dc2d6a21dd2d20dc2d20" - "dd2d6a21de2d20dd2d20de2d6a21df2d20de2d20df2d6a21e02d20df2d20e02d6a21e12d20e02d20e12d6a21e22d20" - "e12d20e22d6a21e32d20e22d20e32d6a21e42d20e32d20e42d6a21e52d20e42d20e52d6a21e62d20e52d20e62d6a21" - "e72d20e62d20e72d6a21e82d20e72d20e82d6a21e92d20e82d20e92d6a21ea2d20e92d20ea2d6a21eb2d20ea2d20eb" - "2d6a21ec2d20eb2d20ec2d6a21ed2d20ec2d20ed2d6a21ee2d20ed2d20ee2d6a21ef2d20ee2d20ef2d6a21f02d20ef" - "2d20f02d6a21f12d20f02d20f12d6a21f22d20f12d20f22d6a21f32d20f22d20f32d6a21f42d20f32d20f42d6a21f5" - "2d20f42d20f52d6a21f62d20f52d20f62d6a21f72d20f62d20f72d6a21f82d20f72d20f82d6a21f92d20f82d20f92d" - "6a21fa2d20f92d20fa2d6a21fb2d20fa2d20fb2d6a21fc2d20fb2d20fc2d6a21fd2d20fc2d20fd2d6a21fe2d20fd2d" - "20fe2d6a21ff2d20fe2d20ff2d6a21802e20ff2d20802e6a21812e20802e20812e6a21822e20812e20822e6a21832e" - "20822e20832e6a21842e20832e20842e6a21852e20842e20852e6a21862e20852e20862e6a21872e20862e20872e6a" - "21882e20872e20882e6a21892e20882e20892e6a218a2e20892e208a2e6a218b2e208a2e208b2e6a218c2e208b2e20" - "8c2e6a218d2e208c2e208d2e6a218e2e208d2e208e2e6a218f2e208e2e208f2e6a21902e208f2e20902e6a21912e20" - "902e20912e6a21922e20912e20922e6a21932e20922e20932e6a21942e20932e20942e6a21952e20942e20952e6a21" - "962e20952e20962e6a21972e20962e20972e6a21982e20972e20982e6a21992e20982e20992e6a219a2e20992e209a" - "2e6a219b2e209a2e209b2e6a219c2e209b2e209c2e6a219d2e209c2e209d2e6a219e2e209d2e209e2e6a219f2e209e" - "2e209f2e6a21a02e209f2e20a02e6a21a12e20a02e20a12e6a21a22e20a12e20a22e6a21a32e20a22e20a32e6a21a4" - "2e20a32e20a42e6a21a52e20a42e20a52e6a21a62e20a52e20a62e6a21a72e20a62e20a72e6a21a82e20a72e20a82e" - "6a21a92e20a82e20a92e6a21aa2e20a92e20aa2e6a21ab2e20aa2e20ab2e6a21ac2e20ab2e20ac2e6a21ad2e20ac2e" - "20ad2e6a21ae2e20ad2e20ae2e6a21af2e20ae2e20af2e6a21b02e20af2e20b02e6a21b12e20b02e20b12e6a21b22e" - "20b12e20b22e6a21b32e20b22e20b32e6a21b42e20b32e20b42e6a21b52e20b42e20b52e6a21b62e20b52e20b62e6a" - "21b72e20b62e20b72e6a21b82e20b72e20b82e6a21b92e20b82e20b92e6a21ba2e20b92e20ba2e6a21bb2e20ba2e20" - "bb2e6a21bc2e20bb2e20bc2e6a21bd2e20bc2e20bd2e6a21be2e20bd2e20be2e6a21bf2e20be2e20bf2e6a21c02e20" - "bf2e20c02e6a21c12e20c02e20c12e6a21c22e20c12e20c22e6a21c32e20c22e20c32e6a21c42e20c32e20c42e6a21" - "c52e20c42e20c52e6a21c62e20c52e20c62e6a21c72e20c62e20c72e6a21c82e20c72e20c82e6a21c92e20c82e20c9" - "2e6a21ca2e20c92e20ca2e6a21cb2e20ca2e20cb2e6a21cc2e20cb2e20cc2e6a21cd2e20cc2e20cd2e6a21ce2e20cd" - "2e20ce2e6a21cf2e20ce2e20cf2e6a21d02e20cf2e20d02e6a21d12e20d02e20d12e6a21d22e20d12e20d22e6a21d3" - "2e20d22e20d32e6a21d42e20d32e20d42e6a21d52e20d42e20d52e6a21d62e20d52e20d62e6a21d72e20d62e20d72e" - "6a21d82e20d72e20d82e6a21d92e20d82e20d92e6a21da2e20d92e20da2e6a21db2e20da2e20db2e6a21dc2e20db2e" - "20dc2e6a21dd2e20dc2e20dd2e6a21de2e20dd2e20de2e6a21df2e20de2e20df2e6a21e02e20df2e20e02e6a21e12e" - "20e02e20e12e6a21e22e20e12e20e22e6a21e32e20e22e20e32e6a21e42e20e32e20e42e6a21e52e20e42e20e52e6a" - "21e62e20e52e20e62e6a21e72e20e62e20e72e6a21e82e20e72e20e82e6a21e92e20e82e20e92e6a21ea2e20e92e20" - "ea2e6a21eb2e20ea2e20eb2e6a21ec2e20eb2e20ec2e6a21ed2e20ec2e20ed2e6a21ee2e20ed2e20ee2e6a21ef2e20" - "ee2e20ef2e6a21f02e20ef2e20f02e6a21f12e20f02e20f12e6a21f22e20f12e20f22e6a21f32e20f22e20f32e6a21" - "f42e20f32e20f42e6a21f52e20f42e20f52e6a21f62e20f52e20f62e6a21f72e20f62e20f72e6a21f82e20f72e20f8" - "2e6a21f92e20f82e20f92e6a21fa2e20f92e20fa2e6a21fb2e20fa2e20fb2e6a21fc2e20fb2e20fc2e6a21fd2e20fc" - "2e20fd2e6a21fe2e20fd2e20fe2e6a21ff2e20fe2e20ff2e6a21802f20ff2e20802f6a21812f20802f20812f6a2182" - "2f20812f20822f6a21832f20822f20832f6a21842f20832f20842f6a21852f20842f20852f6a21862f20852f20862f" - "6a21872f20862f20872f6a21882f20872f20882f6a21892f20882f20892f6a218a2f20892f208a2f6a218b2f208a2f" - "208b2f6a218c2f208b2f208c2f6a218d2f208c2f208d2f6a218e2f208d2f208e2f6a218f2f208e2f208f2f6a21902f" - "208f2f20902f6a21912f20902f20912f6a21922f20912f20922f6a21932f20922f20932f6a21942f20932f20942f6a" - "21952f20942f20952f6a21962f20952f20962f6a21972f20962f20972f6a21982f20972f20982f6a21992f20982f20" - "992f6a219a2f20992f209a2f6a219b2f209a2f209b2f6a219c2f209b2f209c2f6a219d2f209c2f209d2f6a219e2f20" - "9d2f209e2f6a219f2f209e2f209f2f6a21a02f209f2f20a02f6a21a12f20a02f20a12f6a21a22f20a12f20a22f6a21" - "a32f20a22f20a32f6a21a42f20a32f20a42f6a21a52f20a42f20a52f6a21a62f20a52f20a62f6a21a72f20a62f20a7" - "2f6a21a82f20a72f20a82f6a21a92f20a82f20a92f6a21aa2f20a92f20aa2f6a21ab2f20aa2f20ab2f6a21ac2f20ab" - "2f20ac2f6a21ad2f20ac2f20ad2f6a21ae2f20ad2f20ae2f6a21af2f20ae2f20af2f6a21b02f20af2f20b02f6a21b1" - "2f20b02f20b12f6a21b22f20b12f20b22f6a21b32f20b22f20b32f6a21b42f20b32f20b42f6a21b52f20b42f20b52f" - "6a21b62f20b52f20b62f6a21b72f20b62f20b72f6a21b82f20b72f20b82f6a21b92f20b82f20b92f6a21ba2f20b92f" - "20ba2f6a21bb2f20ba2f20bb2f6a21bc2f20bb2f20bc2f6a21bd2f20bc2f20bd2f6a21be2f20bd2f20be2f6a21bf2f" - "20be2f20bf2f6a21c02f20bf2f20c02f6a21c12f20c02f20c12f6a21c22f20c12f20c22f6a21c32f20c22f20c32f6a" - "21c42f20c32f20c42f6a21c52f20c42f20c52f6a21c62f20c52f20c62f6a21c72f20c62f20c72f6a21c82f20c72f20" - "c82f6a21c92f20c82f20c92f6a21ca2f20c92f20ca2f6a21cb2f20ca2f20cb2f6a21cc2f20cb2f20cc2f6a21cd2f20" - "cc2f20cd2f6a21ce2f20cd2f20ce2f6a21cf2f20ce2f20cf2f6a21d02f20cf2f20d02f6a21d12f20d02f20d12f6a21" - "d22f20d12f20d22f6a21d32f20d22f20d32f6a21d42f20d32f20d42f6a21d52f20d42f20d52f6a21d62f20d52f20d6" - "2f6a21d72f20d62f20d72f6a21d82f20d72f20d82f6a21d92f20d82f20d92f6a21da2f20d92f20da2f6a21db2f20da" - "2f20db2f6a21dc2f20db2f20dc2f6a21dd2f20dc2f20dd2f6a21de2f20dd2f20de2f6a21df2f20de2f20df2f6a21e0" - "2f20df2f20e02f6a21e12f20e02f20e12f6a21e22f20e12f20e22f6a21e32f20e22f20e32f6a21e42f20e32f20e42f" - "6a21e52f20e42f20e52f6a21e62f20e52f20e62f6a21e72f20e62f20e72f6a21e82f20e72f20e82f6a21e92f20e82f" - "20e92f6a21ea2f20e92f20ea2f6a21eb2f20ea2f20eb2f6a21ec2f20eb2f20ec2f6a21ed2f20ec2f20ed2f6a21ee2f" - "20ed2f20ee2f6a21ef2f20ee2f20ef2f6a21f02f20ef2f20f02f6a21f12f20f02f20f12f6a21f22f20f12f20f22f6a" - "21f32f20f22f20f32f6a21f42f20f32f20f42f6a21f52f20f42f20f52f6a21f62f20f52f20f62f6a21f72f20f62f20" - "f72f6a21f82f20f72f20f82f6a21f92f20f82f20f92f6a21fa2f20f92f20fa2f6a21fb2f20fa2f20fb2f6a21fc2f20" - "fb2f20fc2f6a21fd2f20fc2f20fd2f6a21fe2f20fd2f20fe2f6a21ff2f20fe2f20ff2f6a21803020ff2f2080306a21" - "81302080302081306a2182302081302082306a2183302082302083306a2184302083302084306a2185302084302085" - "306a2186302085302086306a2187302086302087306a2188302087302088306a2189302088302089306a218a302089" - "30208a306a218b30208a30208b306a218c30208b30208c306a218d30208c30208d306a218e30208d30208e306a218f" - "30208e30208f306a219030208f302090306a2191302090302091306a2192302091302092306a219330209230209330" - "6a2194302093302094306a2195302094302095306a2196302095302096306a2197302096302097306a219830209730" - "2098306a2199302098302099306a219a30209930209a306a219b30209a30209b306a219c30209b30209c306a219d30" - "209c30209d306a219e30209d30209e306a219f30209e30209f306a21a030209f3020a0306a21a13020a03020a1306a" - "21a23020a13020a2306a21a33020a23020a3306a21a43020a33020a4306a21a53020a43020a5306a21a63020a53020" - "a6306a21a73020a63020a7306a21a83020a73020a8306a21a93020a83020a9306a21aa3020a93020aa306a21ab3020" - "aa3020ab306a21ac3020ab3020ac306a21ad3020ac3020ad306a21ae3020ad3020ae306a21af3020ae3020af306a21" - "b03020af3020b0306a21b13020b03020b1306a21b23020b13020b2306a21b33020b23020b3306a21b43020b33020b4" - "306a21b53020b43020b5306a21b63020b53020b6306a21b73020b63020b7306a21b83020b73020b8306a21b93020b8" - "3020b9306a21ba3020b93020ba306a21bb3020ba3020bb306a21bc3020bb3020bc306a21bd3020bc3020bd306a21be" - "3020bd3020be306a21bf3020be3020bf306a21c03020bf3020c0306a21c13020c03020c1306a21c23020c13020c230" - "6a21c33020c23020c3306a21c43020c33020c4306a21c53020c43020c5306a21c63020c53020c6306a21c73020c630" - "20c7306a21c83020c73020c8306a21c93020c83020c9306a21ca3020c93020ca306a21cb3020ca3020cb306a21cc30" - "20cb3020cc306a21cd3020cc3020cd306a21ce3020cd3020ce306a21cf3020ce3020cf306a21d03020cf3020d0306a" - "21d13020d03020d1306a21d23020d13020d2306a21d33020d23020d3306a21d43020d33020d4306a21d53020d43020" - "d5306a21d63020d53020d6306a21d73020d63020d7306a21d83020d73020d8306a21d93020d83020d9306a21da3020" - "d93020da306a21db3020da3020db306a21dc3020db3020dc306a21dd3020dc3020dd306a21de3020dd3020de306a21" - "df3020de3020df306a21e03020df3020e0306a21e13020e03020e1306a21e23020e13020e2306a21e33020e23020e3" - "306a21e43020e33020e4306a21e53020e43020e5306a21e63020e53020e6306a21e73020e63020e7306a21e83020e7" - "3020e8306a21e93020e83020e9306a21ea3020e93020ea306a21eb3020ea3020eb306a21ec3020eb3020ec306a21ed" - "3020ec3020ed306a21ee3020ed3020ee306a21ef3020ee3020ef306a21f03020ef3020f0306a21f13020f03020f130" - "6a21f23020f13020f2306a21f33020f23020f3306a21f43020f33020f4306a21f53020f43020f5306a21f63020f530" - "20f6306a21f73020f63020f7306a21f83020f73020f8306a21f93020f83020f9306a21fa3020f93020fa306a21fb30" - "20fa3020fb306a21fc3020fb3020fc306a21fd3020fc3020fd306a21fe3020fd3020fe306a21ff3020fe3020ff306a" - "21803120ff302080316a2181312080312081316a2182312081312082316a2183312082312083316a21843120833120" - "84316a2185312084312085316a2186312085312086316a2187312086312087316a2188312087312088316a21893120" - "88312089316a218a31208931208a316a218b31208a31208b316a218c31208b31208c316a218d31208c31208d316a21" - "8e31208d31208e316a218f31208e31208f316a219031208f312090316a2191312090312091316a2192312091312092" - "316a2193312092312093316a2194312093312094316a2195312094312095316a2196312095312096316a2197312096" - "312097316a2198312097312098316a2199312098312099316a219a31209931209a316a219b31209a31209b316a219c" - "31209b31209c316a219d31209c31209d316a219e31209d31209e316a219f31209e31209f316a21a031209f3120a031" - "6a21a13120a03120a1316a21a23120a13120a2316a21a33120a23120a3316a21a43120a33120a4316a21a53120a431" - "20a5316a21a63120a53120a6316a21a73120a63120a7316a21a83120a73120a8316a21a93120a83120a9316a21aa31" - "20a93120aa316a21ab3120aa3120ab316a21ac3120ab3120ac316a21ad3120ac3120ad316a21ae3120ad3120ae316a" - "21af3120ae3120af316a21b03120af3120b0316a21b13120b03120b1316a21b23120b13120b2316a21b33120b23120" - "b3316a21b43120b33120b4316a21b53120b43120b5316a21b63120b53120b6316a21b73120b63120b7316a21b83120" - "b73120b8316a21b93120b83120b9316a21ba3120b93120ba316a21bb3120ba3120bb316a21bc3120bb3120bc316a21" - "bd3120bc3120bd316a21be3120bd3120be316a21bf3120be3120bf316a21c03120bf3120c0316a21c13120c03120c1" - "316a21c23120c13120c2316a21c33120c23120c3316a21c43120c33120c4316a21c53120c43120c5316a21c63120c5" - "3120c6316a21c73120c63120c7316a21c83120c73120c8316a21c93120c83120c9316a21ca3120c93120ca316a21cb" - "3120ca3120cb316a21cc3120cb3120cc316a21cd3120cc3120cd316a21ce3120cd3120ce316a21cf3120ce3120cf31" - "6a21d03120cf3120d0316a21d13120d03120d1316a21d23120d13120d2316a21d33120d23120d3316a21d43120d331" - "20d4316a21d53120d43120d5316a21d63120d53120d6316a21d73120d63120d7316a21d83120d73120d8316a21d931" - "20d83120d9316a21da3120d93120da316a21db3120da3120db316a21dc3120db3120dc316a21dd3120dc3120dd316a" - "21de3120dd3120de316a21df3120de3120df316a21e03120df3120e0316a21e13120e03120e1316a21e23120e13120" - "e2316a21e33120e23120e3316a21e43120e33120e4316a21e53120e43120e5316a21e63120e53120e6316a21e73120" - "e63120e7316a21e83120e73120e8316a21e93120e83120e9316a21ea3120e93120ea316a21eb3120ea3120eb316a21" - "ec3120eb3120ec316a21ed3120ec3120ed316a21ee3120ed3120ee316a21ef3120ee3120ef316a21f03120ef3120f0" - "316a21f13120f03120f1316a21f23120f13120f2316a21f33120f23120f3316a21f43120f33120f4316a21f53120f4" - "3120f5316a21f63120f53120f6316a21f73120f63120f7316a21f83120f73120f8316a21f93120f83120f9316a21fa" - "3120f93120fa316a21fb3120fa3120fb316a21fc3120fb3120fc316a21fd3120fc3120fd316a21fe3120fd3120fe31" - "6a21ff3120fe3120ff316a21803220ff312080326a2181322080322081326a2182322081322082326a218332208232" - "2083326a2184322083322084326a2185322084322085326a2186322085322086326a2187322086322087326a218832" - "2087322088326a2189322088322089326a218a32208932208a326a218b32208a32208b326a218c32208b32208c326a" - "218d32208c32208d326a218e32208d32208e326a218f32208e32208f326a219032208f322090326a21913220903220" - "91326a2192322091322092326a2193322092322093326a2194322093322094326a2195322094322095326a21963220" - "95322096326a2197322096322097326a2198322097322098326a2199322098322099326a219a32209932209a326a21" - "9b32209a32209b326a219c32209b32209c326a219d32209c32209d326a219e32209d32209e326a219f32209e32209f" - "326a21a032209f3220a0326a21a13220a03220a1326a21a23220a13220a2326a21a33220a23220a3326a21a43220a3" - "3220a4326a21a53220a43220a5326a21a63220a53220a6326a21a73220a63220a7326a21a83220a73220a8326a21a9" - "3220a83220a9326a21aa3220a93220aa326a21ab3220aa3220ab326a21ac3220ab3220ac326a21ad3220ac3220ad32" - "6a21ae3220ad3220ae326a21af3220ae3220af326a21b03220af3220b0326a21b13220b03220b1326a21b23220b132" - "20b2326a21b33220b23220b3326a21b43220b33220b4326a21b53220b43220b5326a21b63220b53220b6326a21b732" - "20b63220b7326a21b83220b73220b8326a21b93220b83220b9326a21ba3220b93220ba326a21bb3220ba3220bb326a" - "21bc3220bb3220bc326a21bd3220bc3220bd326a21be3220bd3220be326a21bf3220be3220bf326a21c03220bf3220" - "c0326a21c13220c03220c1326a21c23220c13220c2326a21c33220c23220c3326a21c43220c33220c4326a21c53220" - "c43220c5326a21c63220c53220c6326a21c73220c63220c7326a21c83220c73220c8326a21c93220c83220c9326a21" - "ca3220c93220ca326a21cb3220ca3220cb326a21cc3220cb3220cc326a21cd3220cc3220cd326a21ce3220cd3220ce" - "326a21cf3220ce3220cf326a21d03220cf3220d0326a21d13220d03220d1326a21d23220d13220d2326a21d33220d2" - "3220d3326a21d43220d33220d4326a21d53220d43220d5326a21d63220d53220d6326a21d73220d63220d7326a21d8" - "3220d73220d8326a21d93220d83220d9326a21da3220d93220da326a21db3220da3220db326a21dc3220db3220dc32" - "6a21dd3220dc3220dd326a21de3220dd3220de326a21df3220de3220df326a21e03220df3220e0326a21e13220e032" - "20e1326a21e23220e13220e2326a21e33220e23220e3326a21e43220e33220e4326a21e53220e43220e5326a21e632" - "20e53220e6326a21e73220e63220e7326a21e83220e73220e8326a21e93220e83220e9326a21ea3220e93220ea326a" - "21eb3220ea3220eb326a21ec3220eb3220ec326a21ed3220ec3220ed326a21ee3220ed3220ee326a21ef3220ee3220" - "ef326a21f03220ef3220f0326a21f13220f03220f1326a21f23220f13220f2326a21f33220f23220f3326a21f43220" - "f33220f4326a21f53220f43220f5326a21f63220f53220f6326a21f73220f63220f7326a21f83220f73220f8326a21" - "f93220f83220f9326a21fa3220f93220fa326a21fb3220fa3220fb326a21fc3220fb3220fc326a21fd3220fc3220fd" - "326a21fe3220fd3220fe326a21ff3220fe3220ff326a21803320ff322080336a2181332080332081336a2182332081" - "332082336a2183332082332083336a2184332083332084336a2185332084332085336a2186332085332086336a2187" - "332086332087336a2188332087332088336a2189332088332089336a218a33208933208a336a218b33208a33208b33" - "6a218c33208b33208c336a218d33208c33208d336a218e33208d33208e336a218f33208e33208f336a219033208f33" - "2090336a2191332090332091336a2192332091332092336a2193332092332093336a2194332093332094336a219533" - "2094332095336a2196332095332096336a2197332096332097336a2198332097332098336a2199332098332099336a" - "219a33209933209a336a219b33209a33209b336a219c33209b33209c336a219d33209c33209d336a219e33209d3320" - "9e336a219f33209e33209f336a21a033209f3320a0336a21a13320a03320a1336a21a23320a13320a2336a21a33320" - "a23320a3336a21a43320a33320a4336a21a53320a43320a5336a21a63320a53320a6336a21a73320a63320a7336a21" - "a83320a73320a8336a21a93320a83320a9336a21aa3320a93320aa336a21ab3320aa3320ab336a21ac3320ab3320ac" - "336a21ad3320ac3320ad336a21ae3320ad3320ae336a21af3320ae3320af336a21b03320af3320b0336a21b13320b0" - "3320b1336a21b23320b13320b2336a21b33320b23320b3336a21b43320b33320b4336a21b53320b43320b5336a21b6" - "3320b53320b6336a21b73320b63320b7336a21b83320b73320b8336a21b93320b83320b9336a21ba3320b93320ba33" - "6a21bb3320ba3320bb336a21bc3320bb3320bc336a21bd3320bc3320bd336a21be3320bd3320be336a21bf3320be33" - "20bf336a21c03320bf3320c0336a21c13320c03320c1336a21c23320c13320c2336a21c33320c23320c3336a21c433" - "20c33320c4336a21c53320c43320c5336a21c63320c53320c6336a21c73320c63320c7336a21c83320c73320c8336a" - "21c93320c83320c9336a21ca3320c93320ca336a21cb3320ca3320cb336a21cc3320cb3320cc336a21cd3320cc3320" - "cd336a21ce3320cd3320ce336a21cf3320ce3320cf336a21d03320cf3320d0336a21d13320d03320d1336a21d23320" - "d13320d2336a21d33320d23320d3336a21d43320d33320d4336a21d53320d43320d5336a21d63320d53320d6336a21" - "d73320d63320d7336a21d83320d73320d8336a21d93320d83320d9336a21da3320d93320da336a21db3320da3320db" - "336a21dc3320db3320dc336a21dd3320dc3320dd336a21de3320dd3320de336a21df3320de3320df336a21e03320df" - "3320e0336a21e13320e03320e1336a21e23320e13320e2336a21e33320e23320e3336a21e43320e33320e4336a21e5" - "3320e43320e5336a21e63320e53320e6336a21e73320e63320e7336a21e83320e73320e8336a21e93320e83320e933" - "6a21ea3320e93320ea336a21eb3320ea3320eb336a21ec3320eb3320ec336a21ed3320ec3320ed336a21ee3320ed33" - "20ee336a21ef3320ee3320ef336a21f03320ef3320f0336a21f13320f03320f1336a21f23320f13320f2336a21f333" - "20f23320f3336a21f43320f33320f4336a21f53320f43320f5336a21f63320f53320f6336a21f73320f63320f7336a" - "21f83320f73320f8336a21f93320f83320f9336a21fa3320f93320fa336a21fb3320fa3320fb336a21fc3320fb3320" - "fc336a21fd3320fc3320fd336a21fe3320fd3320fe336a21ff3320fe3320ff336a21803420ff332080346a21813420" - "80342081346a2182342081342082346a2183342082342083346a2184342083342084346a2185342084342085346a21" - "86342085342086346a2187342086342087346a2188342087342088346a2189342088342089346a218a34208934208a" - "346a218b34208a34208b346a218c34208b34208c346a218d34208c34208d346a218e34208d34208e346a218f34208e" - "34208f346a219034208f342090346a2191342090342091346a2192342091342092346a2193342092342093346a2194" - "342093342094346a2195342094342095346a2196342095342096346a2197342096342097346a219834209734209834" - "6a2199342098342099346a219a34209934209a346a219b34209a34209b346a219c34209b34209c346a219d34209c34" - "209d346a219e34209d34209e346a219f34209e34209f346a21a034209f3420a0346a21a13420a03420a1346a21a234" - "20a13420a2346a21a33420a23420a3346a21a43420a33420a4346a21a53420a43420a5346a21a63420a53420a6346a" - "21a73420a63420a7346a21a83420a73420a8346a21a93420a83420a9346a21aa3420a93420aa346a21ab3420aa3420" - "ab346a21ac3420ab3420ac346a21ad3420ac3420ad346a21ae3420ad3420ae346a21af3420ae3420af346a21b03420" - "af3420b0346a21b13420b03420b1346a21b23420b13420b2346a21b33420b23420b3346a21b43420b33420b4346a21" - "b53420b43420b5346a21b63420b53420b6346a21b73420b63420b7346a21b83420b73420b8346a21b93420b83420b9" - "346a21ba3420b93420ba346a21bb3420ba3420bb346a21bc3420bb3420bc346a21bd3420bc3420bd346a21be3420bd" - "3420be346a21bf3420be3420bf346a21c03420bf3420c0346a21c13420c03420c1346a21c23420c13420c2346a21c3" - "3420c23420c3346a21c43420c33420c4346a21c53420c43420c5346a21c63420c53420c6346a21c73420c63420c734" - "6a21c83420c73420c8346a21c93420c83420c9346a21ca3420c93420ca346a21cb3420ca3420cb346a21cc3420cb34" - "20cc346a21cd3420cc3420cd346a21ce3420cd3420ce346a21cf3420ce3420cf346a21d03420cf3420d0346a21d134" - "20d03420d1346a21d23420d13420d2346a21d33420d23420d3346a21d43420d33420d4346a21d53420d43420d5346a" - "21d63420d53420d6346a21d73420d63420d7346a21d83420d73420d8346a21d93420d83420d9346a21da3420d93420" - "da346a21db3420da3420db346a21dc3420db3420dc346a21dd3420dc3420dd346a21de3420dd3420de346a21df3420" - "de3420df346a21e03420df3420e0346a21e13420e03420e1346a21e23420e13420e2346a21e33420e23420e3346a21" - "e43420e33420e4346a21e53420e43420e5346a21e63420e53420e6346a21e73420e63420e7346a21e83420e73420e8" - "346a21e93420e83420e9346a21ea3420e93420ea346a21eb3420ea3420eb346a21ec3420eb3420ec346a21ed3420ec" - "3420ed346a21ee3420ed3420ee346a21ef3420ee3420ef346a21f03420ef3420f0346a21f13420f03420f1346a21f2" - "3420f13420f2346a21f33420f23420f3346a21f43420f33420f4346a21f53420f43420f5346a21f63420f53420f634" - "6a21f73420f63420f7346a21f83420f73420f8346a21f93420f83420f9346a21fa3420f93420fa346a21fb3420fa34" - "20fb346a21fc3420fb3420fc346a21fd3420fc3420fd346a21fe3420fd3420fe346a21ff3420fe3420ff346a218035" - "20ff342080356a2181352080352081356a2182352081352082356a2183352082352083356a2184352083352084356a" - "2185352084352085356a2186352085352086356a2187352086352087356a2188352087352088356a21893520883520" - "89356a218a35208935208a356a218b35208a35208b356a218c35208b35208c356a218d35208c35208d356a218e3520" - "8d35208e356a218f35208e35208f356a219035208f352090356a2191352090352091356a2192352091352092356a21" - "93352092352093356a2194352093352094356a2195352094352095356a2196352095352096356a2197352096352097" - "356a2198352097352098356a2199352098352099356a219a35209935209a356a219b35209a35209b356a219c35209b" - "35209c356a219d35209c35209d356a219e35209d35209e356a219f35209e35209f356a21a035209f3520a0356a21a1" - "3520a03520a1356a21a23520a13520a2356a21a33520a23520a3356a21a43520a33520a4356a21a53520a43520a535" - "6a21a63520a53520a6356a21a73520a63520a7356a21a83520a73520a8356a21a93520a83520a9356a21aa3520a935" - "20aa356a21ab3520aa3520ab356a21ac3520ab3520ac356a21ad3520ac3520ad356a21ae3520ad3520ae356a21af35" - "20ae3520af356a21b03520af3520b0356a21b13520b03520b1356a21b23520b13520b2356a21b33520b23520b3356a" - "21b43520b33520b4356a21b53520b43520b5356a21b63520b53520b6356a21b73520b63520b7356a21b83520b73520" - "b8356a21b93520b83520b9356a21ba3520b93520ba356a21bb3520ba3520bb356a21bc3520bb3520bc356a21bd3520" - "bc3520bd356a21be3520bd3520be356a21bf3520be3520bf356a21c03520bf3520c0356a21c13520c03520c1356a21" - "c23520c13520c2356a21c33520c23520c3356a21c43520c33520c4356a21c53520c43520c5356a21c63520c53520c6" - "356a21c73520c63520c7356a21c83520c73520c8356a21c93520c83520c9356a21ca3520c93520ca356a21cb3520ca" - "3520cb356a21cc3520cb3520cc356a21cd3520cc3520cd356a21ce3520cd3520ce356a21cf3520ce3520cf356a21d0" - "3520cf3520d0356a21d13520d03520d1356a21d23520d13520d2356a21d33520d23520d3356a21d43520d33520d435" - "6a21d53520d43520d5356a21d63520d53520d6356a21d73520d63520d7356a21d83520d73520d8356a21d93520d835" - "20d9356a21da3520d93520da356a21db3520da3520db356a21dc3520db3520dc356a21dd3520dc3520dd356a21de35" - "20dd3520de356a21df3520de3520df356a21e03520df3520e0356a21e13520e03520e1356a21e23520e13520e2356a" - "21e33520e23520e3356a21e43520e33520e4356a21e53520e43520e5356a21e63520e53520e6356a21e73520e63520" - "e7356a21e83520e73520e8356a21e93520e83520e9356a21ea3520e93520ea356a21eb3520ea3520eb356a21ec3520" - "eb3520ec356a21ed3520ec3520ed356a21ee3520ed3520ee356a21ef3520ee3520ef356a21f03520ef3520f0356a21" - "f13520f03520f1356a21f23520f13520f2356a21f33520f23520f3356a21f43520f33520f4356a21f53520f43520f5" - "356a21f63520f53520f6356a21f73520f63520f7356a21f83520f73520f8356a21f93520f83520f9356a21fa3520f9" - "3520fa356a21fb3520fa3520fb356a21fc3520fb3520fc356a21fd3520fc3520fd356a21fe3520fd3520fe356a21ff" - "3520fe3520ff356a21803620ff352080366a2181362080362081366a2182362081362082366a218336208236208336" - "6a2184362083362084366a2185362084362085366a2186362085362086366a2187362086362087366a218836208736" - "2088366a2189362088362089366a218a36208936208a366a218b36208a36208b366a218c36208b36208c366a218d36" - "208c36208d366a218e36208d36208e366a218f36208e36208f366a219036208f362090366a2191362090362091366a" - "2192362091362092366a2193362092362093366a2194362093362094366a2195362094362095366a21963620953620" - "96366a2197362096362097366a2198362097362098366a2199362098362099366a219a36209936209a366a219b3620" - "9a36209b366a219c36209b36209c366a219d36209c36209d366a219e36209d36209e366a219f36209e36209f366a21" - "a036209f3620a0366a21a13620a03620a1366a21a23620a13620a2366a21a33620a23620a3366a21a43620a33620a4" - "366a21a53620a43620a5366a21a63620a53620a6366a21a73620a63620a7366a21a83620a73620a8366a21a93620a8" - "3620a9366a21aa3620a93620aa366a21ab3620aa3620ab366a21ac3620ab3620ac366a21ad3620ac3620ad366a21ae" - "3620ad3620ae366a21af3620ae3620af366a21b03620af3620b0366a21b13620b03620b1366a21b23620b13620b236" - "6a21b33620b23620b3366a21b43620b33620b4366a21b53620b43620b5366a21b63620b53620b6366a21b73620b636" - "20b7366a21b83620b73620b8366a21b93620b83620b9366a21ba3620b93620ba366a21bb3620ba3620bb366a21bc36" - "20bb3620bc366a21bd3620bc3620bd366a21be3620bd3620be366a21bf3620be3620bf366a21c03620bf3620c0366a" - "21c13620c03620c1366a21c23620c13620c2366a21c33620c23620c3366a21c43620c33620c4366a21c53620c43620" - "c5366a21c63620c53620c6366a21c73620c63620c7366a21c83620c73620c8366a21c93620c83620c9366a21ca3620" - "c93620ca366a21cb3620ca3620cb366a21cc3620cb3620cc366a21cd3620cc3620cd366a21ce3620cd3620ce366a21" - "cf3620ce3620cf366a21d03620cf3620d0366a21d13620d03620d1366a21d23620d13620d2366a21d33620d23620d3" - "366a21d43620d33620d4366a21d53620d43620d5366a21d63620d53620d6366a21d73620d63620d7366a21d83620d7" - "3620d8366a21d93620d83620d9366a21da3620d93620da366a21db3620da3620db366a21dc3620db3620dc366a21dd" - "3620dc3620dd366a21de3620dd3620de366a21df3620de3620df366a21e03620df3620e0366a21e13620e03620e136" - "6a21e23620e13620e2366a21e33620e23620e3366a21e43620e33620e4366a21e53620e43620e5366a21e63620e536" - "20e6366a21e73620e63620e7366a21e83620e73620e8366a21e93620e83620e9366a21ea3620e93620ea366a21eb36" - "20ea3620eb366a21ec3620eb3620ec366a21ed3620ec3620ed366a21ee3620ed3620ee366a21ef3620ee3620ef366a" - "21f03620ef3620f0366a21f13620f03620f1366a21f23620f13620f2366a21f33620f23620f3366a21f43620f33620" - "f4366a21f53620f43620f5366a21f63620f53620f6366a21f73620f63620f7366a21f83620f73620f8366a21f93620" - "f83620f9366a21fa3620f93620fa366a21fb3620fa3620fb366a21fc3620fb3620fc366a21fd3620fc3620fd366a21" - "fe3620fd3620fe366a21ff3620fe3620ff366a21803720ff362080376a2181372080372081376a2182372081372082" - "376a2183372082372083376a2184372083372084376a2185372084372085376a2186372085372086376a2187372086" - "372087376a2188372087372088376a2189372088372089376a218a37208937208a376a218b37208a37208b376a218c" - "37208b37208c376a218d37208c37208d376a218e37208d37208e376a218f37208e37208f376a219037208f37209037" - "6a2191372090372091376a2192372091372092376a2193372092372093376a2194372093372094376a219537209437" - "2095376a2196372095372096376a2197372096372097376a2198372097372098376a2199372098372099376a219a37" - "209937209a376a219b37209a37209b376a219c37209b37209c376a219d37209c37209d376a219e37209d37209e376a" - "219f37209e37209f376a21a037209f3720a0376a21a13720a03720a1376a21a23720a13720a2376a21a33720a23720" - "a3376a21a43720a33720a4376a21a53720a43720a5376a21a63720a53720a6376a21a73720a63720a7376a21a83720" - "a73720a8376a21a93720a83720a9376a21aa3720a93720aa376a21ab3720aa3720ab376a21ac3720ab3720ac376a21" - "ad3720ac3720ad376a21ae3720ad3720ae376a21af3720ae3720af376a21b03720af3720b0376a21b13720b03720b1" - "376a21b23720b13720b2376a21b33720b23720b3376a21b43720b33720b4376a21b53720b43720b5376a21b63720b5" - "3720b6376a21b73720b63720b7376a21b83720b73720b8376a21b93720b83720b9376a21ba3720b93720ba376a21bb" - "3720ba3720bb376a21bc3720bb3720bc376a21bd3720bc3720bd376a21be3720bd3720be376a21bf3720be3720bf37" - "6a21c03720bf3720c0376a21c13720c03720c1376a21c23720c13720c2376a21c33720c23720c3376a21c43720c337" - "20c4376a21c53720c43720c5376a21c63720c53720c6376a21c73720c63720c7376a21c83720c73720c8376a21c937" - "20c83720c9376a21ca3720c93720ca376a21cb3720ca3720cb376a21cc3720cb3720cc376a21cd3720cc3720cd376a" - "21ce3720cd3720ce376a21cf3720ce3720cf376a21d03720cf3720d0376a21d13720d03720d1376a21d23720d13720" - "d2376a21d33720d23720d3376a21d43720d33720d4376a21d53720d43720d5376a21d63720d53720d6376a21d73720" - "d63720d7376a21d83720d73720d8376a21d93720d83720d9376a21da3720d93720da376a21db3720da3720db376a21" - "dc3720db3720dc376a21dd3720dc3720dd376a21de3720dd3720de376a21df3720de3720df376a21e03720df3720e0" - "376a21e13720e03720e1376a21e23720e13720e2376a21e33720e23720e3376a21e43720e33720e4376a21e53720e4" - "3720e5376a21e63720e53720e6376a21e73720e63720e7376a21e83720e73720e8376a21e93720e83720e9376a21ea" - "3720e93720ea376a21eb3720ea3720eb376a21ec3720eb3720ec376a21ed3720ec3720ed376a21ee3720ed3720ee37" - "6a21ef3720ee3720ef376a21f03720ef3720f0376a21f13720f03720f1376a21f23720f13720f2376a21f33720f237" - "20f3376a21f43720f33720f4376a21f53720f43720f5376a21f63720f53720f6376a21f73720f63720f7376a21f837" - "20f73720f8376a21f93720f83720f9376a21fa3720f93720fa376a21fb3720fa3720fb376a21fc3720fb3720fc376a" - "21fd3720fc3720fd376a21fe3720fd3720fe376a21ff3720fe3720ff376a21803820ff372080386a21813820803820" - "81386a2182382081382082386a2183382082382083386a2184382083382084386a2185382084382085386a21863820" - "85382086386a2187382086382087386a2188382087382088386a2189382088382089386a218a38208938208a386a21" - "8b38208a38208b386a218c38208b38208c386a218d38208c38208d386a218e38208d38208e386a218f38208e38208f" - "386a219038208f382090386a2191382090382091386a2192382091382092386a2193382092382093386a2194382093" - "382094386a2195382094382095386a2196382095382096386a2197382096382097386a2198382097382098386a2199" - "382098382099386a219a38209938209a386a219b38209a38209b386a219c38209b38209c386a219d38209c38209d38" - "6a219e38209d38209e386a219f38209e38209f386a21a038209f3820a0386a21a13820a03820a1386a21a23820a138" - "20a2386a21a33820a23820a3386a21a43820a33820a4386a21a53820a43820a5386a21a63820a53820a6386a21a738" - "20a63820a7386a21a83820a73820a8386a21a93820a83820a9386a21aa3820a93820aa386a21ab3820aa3820ab386a" - "21ac3820ab3820ac386a21ad3820ac3820ad386a21ae3820ad3820ae386a21af3820ae3820af386a21b03820af3820" - "b0386a21b13820b03820b1386a21b23820b13820b2386a21b33820b23820b3386a21b43820b33820b4386a21b53820" - "b43820b5386a21b63820b53820b6386a21b73820b63820b7386a21b83820b73820b8386a21b93820b83820b9386a21" - "ba3820b93820ba386a21bb3820ba3820bb386a21bc3820bb3820bc386a21bd3820bc3820bd386a21be3820bd3820be" - "386a21bf3820be3820bf386a21c03820bf3820c0386a21c13820c03820c1386a21c23820c13820c2386a21c33820c2" - "3820c3386a21c43820c33820c4386a21c53820c43820c5386a21c63820c53820c6386a21c73820c63820c7386a21c8" - "3820c73820c8386a21c93820c83820c9386a21ca3820c93820ca386a21cb3820ca3820cb386a21cc3820cb3820cc38" - "6a21cd3820cc3820cd386a21ce3820cd3820ce386a21cf3820ce3820cf386a21d03820cf3820d0386a21d13820d038" - "20d1386a21d23820d13820d2386a21d33820d23820d3386a21d43820d33820d4386a21d53820d43820d5386a21d638" - "20d53820d6386a21d73820d63820d7386a21d83820d73820d8386a21d93820d83820d9386a21da3820d93820da386a" - "21db3820da3820db386a21dc3820db3820dc386a21dd3820dc3820dd386a21de3820dd3820de386a21df3820de3820" - "df386a21e03820df3820e0386a21e13820e03820e1386a21e23820e13820e2386a21e33820e23820e3386a21e43820" - "e33820e4386a21e53820e43820e5386a21e63820e53820e6386a21e73820e63820e7386a21e83820e73820e8386a21" - "e93820e83820e9386a21ea3820e93820ea386a21eb3820ea3820eb386a21ec3820eb3820ec386a21ed3820ec3820ed" - "386a21ee3820ed3820ee386a21ef3820ee3820ef386a21f03820ef3820f0386a21f13820f03820f1386a21f23820f1" - "3820f2386a21f33820f23820f3386a21f43820f33820f4386a21f53820f43820f5386a21f63820f53820f6386a21f7" - "3820f63820f7386a21f83820f73820f8386a21f93820f83820f9386a21fa3820f93820fa386a21fb3820fa3820fb38" - "6a21fc3820fb3820fc386a21fd3820fc3820fd386a21fe3820fd3820fe386a21ff3820fe3820ff386a21803920ff38" - "2080396a2181392080392081396a2182392081392082396a2183392082392083396a2184392083392084396a218539" - "2084392085396a2186392085392086396a2187392086392087396a2188392087392088396a2189392088392089396a" - "218a39208939208a396a218b39208a39208b396a218c39208b39208c396a218d39208c39208d396a218e39208d3920" - "8e396a218f39208e39208f396a219039208f392090396a2191392090392091396a2192392091392092396a21933920" - "92392093396a2194392093392094396a2195392094392095396a2196392095392096396a2197392096392097396a21" - "98392097392098396a2199392098392099396a219a39209939209a396a219b39209a39209b396a219c39209b39209c" - "396a219d39209c39209d396a219e39209d39209e396a219f39209e39209f396a21a039209f3920a0396a21a13920a0" - "3920a1396a21a23920a13920a2396a21a33920a23920a3396a21a43920a33920a4396a21a53920a43920a5396a21a6" - "3920a53920a6396a21a73920a63920a7396a21a83920a73920a8396a21a93920a83920a9396a21aa3920a93920aa39" - "6a21ab3920aa3920ab396a21ac3920ab3920ac396a21ad3920ac3920ad396a21ae3920ad3920ae396a21af3920ae39" - "20af396a21b03920af3920b0396a21b13920b03920b1396a21b23920b13920b2396a21b33920b23920b3396a21b439" - "20b33920b4396a21b53920b43920b5396a21b63920b53920b6396a21b73920b63920b7396a21b83920b73920b8396a" - "21b93920b83920b9396a21ba3920b93920ba396a21bb3920ba3920bb396a21bc3920bb3920bc396a21bd3920bc3920" - "bd396a21be3920bd3920be396a21bf3920be3920bf396a21c03920bf3920c0396a21c13920c03920c1396a21c23920" - "c13920c2396a21c33920c23920c3396a21c43920c33920c4396a21c53920c43920c5396a21c63920c53920c6396a21" - "c73920c63920c7396a21c83920c73920c8396a21c93920c83920c9396a21ca3920c93920ca396a21cb3920ca3920cb" - "396a21cc3920cb3920cc396a21cd3920cc3920cd396a21ce3920cd3920ce396a21cf3920ce3920cf396a21d03920cf" - "3920d0396a21d13920d03920d1396a21d23920d13920d2396a21d33920d23920d3396a21d43920d33920d4396a21d5" - "3920d43920d5396a21d63920d53920d6396a21d73920d63920d7396a21d83920d73920d8396a21d93920d83920d939" - "6a21da3920d93920da396a21db3920da3920db396a21dc3920db3920dc396a21dd3920dc3920dd396a21de3920dd39" - "20de396a21df3920de3920df396a21e03920df3920e0396a21e13920e03920e1396a21e23920e13920e2396a21e339" - "20e23920e3396a21e43920e33920e4396a21e53920e43920e5396a21e63920e53920e6396a21e73920e63920e7396a" - "21e83920e73920e8396a21e93920e83920e9396a21ea3920e93920ea396a21eb3920ea3920eb396a21ec3920eb3920" - "ec396a21ed3920ec3920ed396a21ee3920ed3920ee396a21ef3920ee3920ef396a21f03920ef3920f0396a21f13920" - "f03920f1396a21f23920f13920f2396a21f33920f23920f3396a21f43920f33920f4396a21f53920f43920f5396a21" - "f63920f53920f6396a21f73920f63920f7396a21f83920f73920f8396a21f93920f83920f9396a21fa3920f93920fa" - "396a21fb3920fa3920fb396a21fc3920fb3920fc396a21fd3920fc3920fd396a21fe3920fd3920fe396a21ff3920fe" - "3920ff396a21803a20ff3920803a6a21813a20803a20813a6a21823a20813a20823a6a21833a20823a20833a6a2184" - "3a20833a20843a6a21853a20843a20853a6a21863a20853a20863a6a21873a20863a20873a6a21883a20873a20883a" - "6a21893a20883a20893a6a218a3a20893a208a3a6a218b3a208a3a208b3a6a218c3a208b3a208c3a6a218d3a208c3a" - "208d3a6a218e3a208d3a208e3a6a218f3a208e3a208f3a6a21903a208f3a20903a6a21913a20903a20913a6a21923a" - "20913a20923a6a21933a20923a20933a6a21943a20933a20943a6a21953a20943a20953a6a21963a20953a20963a6a" - "21973a20963a20973a6a21983a20973a20983a6a21993a20983a20993a6a219a3a20993a209a3a6a219b3a209a3a20" - "9b3a6a219c3a209b3a209c3a6a219d3a209c3a209d3a6a219e3a209d3a209e3a6a219f3a209e3a209f3a6a21a03a20" - "9f3a20a03a6a21a13a20a03a20a13a6a21a23a20a13a20a23a6a21a33a20a23a20a33a6a21a43a20a33a20a43a6a21" - "a53a20a43a20a53a6a21a63a20a53a20a63a6a21a73a20a63a20a73a6a21a83a20a73a20a83a6a21a93a20a83a20a9" - "3a6a21aa3a20a93a20aa3a6a21ab3a20aa3a20ab3a6a21ac3a20ab3a20ac3a6a21ad3a20ac3a20ad3a6a21ae3a20ad" - "3a20ae3a6a21af3a20ae3a20af3a6a21b03a20af3a20b03a6a21b13a20b03a20b13a6a21b23a20b13a20b23a6a21b3" - "3a20b23a20b33a6a21b43a20b33a20b43a6a21b53a20b43a20b53a6a21b63a20b53a20b63a6a21b73a20b63a20b73a" - "6a21b83a20b73a20b83a6a21b93a20b83a20b93a6a21ba3a20b93a20ba3a6a21bb3a20ba3a20bb3a6a21bc3a20bb3a" - "20bc3a6a21bd3a20bc3a20bd3a6a21be3a20bd3a20be3a6a21bf3a20be3a20bf3a6a21c03a20bf3a20c03a6a21c13a" - "20c03a20c13a6a21c23a20c13a20c23a6a21c33a20c23a20c33a6a21c43a20c33a20c43a6a21c53a20c43a20c53a6a" - "21c63a20c53a20c63a6a21c73a20c63a20c73a6a21c83a20c73a20c83a6a21c93a20c83a20c93a6a21ca3a20c93a20" - "ca3a6a21cb3a20ca3a20cb3a6a21cc3a20cb3a20cc3a6a21cd3a20cc3a20cd3a6a21ce3a20cd3a20ce3a6a21cf3a20" - "ce3a20cf3a6a21d03a20cf3a20d03a6a21d13a20d03a20d13a6a21d23a20d13a20d23a6a21d33a20d23a20d33a6a21" - "d43a20d33a20d43a6a21d53a20d43a20d53a6a21d63a20d53a20d63a6a21d73a20d63a20d73a6a21d83a20d73a20d8" - "3a6a21d93a20d83a20d93a6a21da3a20d93a20da3a6a21db3a20da3a20db3a6a21dc3a20db3a20dc3a6a21dd3a20dc" - "3a20dd3a6a21de3a20dd3a20de3a6a21df3a20de3a20df3a6a21e03a20df3a20e03a6a21e13a20e03a20e13a6a21e2" - "3a20e13a20e23a6a21e33a20e23a20e33a6a21e43a20e33a20e43a6a21e53a20e43a20e53a6a21e63a20e53a20e63a" - "6a21e73a20e63a20e73a6a21e83a20e73a20e83a6a21e93a20e83a20e93a6a21ea3a20e93a20ea3a6a21eb3a20ea3a" - "20eb3a6a21ec3a20eb3a20ec3a6a21ed3a20ec3a20ed3a6a21ee3a20ed3a20ee3a6a21ef3a20ee3a20ef3a6a21f03a" - "20ef3a20f03a6a21f13a20f03a20f13a6a21f23a20f13a20f23a6a21f33a20f23a20f33a6a21f43a20f33a20f43a6a" - "21f53a20f43a20f53a6a21f63a20f53a20f63a6a21f73a20f63a20f73a6a21f83a20f73a20f83a6a21f93a20f83a20" - "f93a6a21fa3a20f93a20fa3a6a21fb3a20fa3a20fb3a6a21fc3a20fb3a20fc3a6a21fd3a20fc3a20fd3a6a21fe3a20" - "fd3a20fe3a6a21ff3a20fe3a20ff3a6a21803b20ff3a20803b6a21813b20803b20813b6a21823b20813b20823b6a21" - "833b20823b20833b6a21843b20833b20843b6a21853b20843b20853b6a21863b20853b20863b6a21873b20863b2087" - "3b6a21883b20873b20883b6a21893b20883b20893b6a218a3b20893b208a3b6a218b3b208a3b208b3b6a218c3b208b" - "3b208c3b6a218d3b208c3b208d3b6a218e3b208d3b208e3b6a218f3b208e3b208f3b6a21903b208f3b20903b6a2191" - "3b20903b20913b6a21923b20913b20923b6a21933b20923b20933b6a21943b20933b20943b6a21953b20943b20953b" - "6a21963b20953b20963b6a21973b20963b20973b6a21983b20973b20983b6a21993b20983b20993b6a219a3b20993b" - "209a3b6a219b3b209a3b209b3b6a219c3b209b3b209c3b6a219d3b209c3b209d3b6a219e3b209d3b209e3b6a219f3b" - "209e3b209f3b6a21a03b209f3b20a03b6a21a13b20a03b20a13b6a21a23b20a13b20a23b6a21a33b20a23b20a33b6a" - "21a43b20a33b20a43b6a21a53b20a43b20a53b6a21a63b20a53b20a63b6a21a73b20a63b20a73b6a21a83b20a73b20" - "a83b6a21a93b20a83b20a93b6a21aa3b20a93b20aa3b6a21ab3b20aa3b20ab3b6a21ac3b20ab3b20ac3b6a21ad3b20" - "ac3b20ad3b6a21ae3b20ad3b20ae3b6a21af3b20ae3b20af3b6a21b03b20af3b20b03b6a21b13b20b03b20b13b6a21" - "b23b20b13b20b23b6a21b33b20b23b20b33b6a21b43b20b33b20b43b6a21b53b20b43b20b53b6a21b63b20b53b20b6" - "3b6a21b73b20b63b20b73b6a21b83b20b73b20b83b6a21b93b20b83b20b93b6a21ba3b20b93b20ba3b6a21bb3b20ba" - "3b20bb3b6a21bc3b20bb3b20bc3b6a21bd3b20bc3b20bd3b6a21be3b20bd3b20be3b6a21bf3b20be3b20bf3b6a21c0" - "3b20bf3b20c03b6a21c13b20c03b20c13b6a21c23b20c13b20c23b6a21c33b20c23b20c33b6a21c43b20c33b20c43b" - "6a21c53b20c43b20c53b6a21c63b20c53b20c63b6a21c73b20c63b20c73b6a21c83b20c73b20c83b6a21c93b20c83b" - "20c93b6a21ca3b20c93b20ca3b6a21cb3b20ca3b20cb3b6a21cc3b20cb3b20cc3b6a21cd3b20cc3b20cd3b6a21ce3b" - "20cd3b20ce3b6a21cf3b20ce3b20cf3b6a21d03b20cf3b20d03b6a21d13b20d03b20d13b6a21d23b20d13b20d23b6a" - "21d33b20d23b20d33b6a21d43b20d33b20d43b6a21d53b20d43b20d53b6a21d63b20d53b20d63b6a21d73b20d63b20" - "d73b6a21d83b20d73b20d83b6a21d93b20d83b20d93b6a21da3b20d93b20da3b6a21db3b20da3b20db3b6a21dc3b20" - "db3b20dc3b6a21dd3b20dc3b20dd3b6a21de3b20dd3b20de3b6a21df3b20de3b20df3b6a21e03b20df3b20e03b6a21" - "e13b20e03b20e13b6a21e23b20e13b20e23b6a21e33b20e23b20e33b6a21e43b20e33b20e43b6a21e53b20e43b20e5" - "3b6a21e63b20e53b20e63b6a21e73b20e63b20e73b6a21e83b20e73b20e83b6a21e93b20e83b20e93b6a21ea3b20e9" - "3b20ea3b6a21eb3b20ea3b20eb3b6a21ec3b20eb3b20ec3b6a21ed3b20ec3b20ed3b6a21ee3b20ed3b20ee3b6a21ef" - "3b20ee3b20ef3b6a21f03b20ef3b20f03b6a21f13b20f03b20f13b6a21f23b20f13b20f23b6a21f33b20f23b20f33b" - "6a21f43b20f33b20f43b6a21f53b20f43b20f53b6a21f63b20f53b20f63b6a21f73b20f63b20f73b6a21f83b20f73b" - "20f83b6a21f93b20f83b20f93b6a21fa3b20f93b20fa3b6a21fb3b20fa3b20fb3b6a21fc3b20fb3b20fc3b6a21fd3b" - "20fc3b20fd3b6a21fe3b20fd3b20fe3b6a21ff3b20fe3b20ff3b6a21803c20ff3b20803c6a21813c20803c20813c6a" - "21823c20813c20823c6a21833c20823c20833c6a21843c20833c20843c6a21853c20843c20853c6a21863c20853c20" - "863c6a21873c20863c20873c6a21883c20873c20883c6a21893c20883c20893c6a218a3c20893c208a3c6a218b3c20" - "8a3c208b3c6a218c3c208b3c208c3c6a218d3c208c3c208d3c6a218e3c208d3c208e3c6a218f3c208e3c208f3c6a21" - "903c208f3c20903c6a21913c20903c20913c6a21923c20913c20923c6a21933c20923c20933c6a21943c20933c2094" - "3c6a21953c20943c20953c6a21963c20953c20963c6a21973c20963c20973c6a21983c20973c20983c6a21993c2098" - "3c20993c6a219a3c20993c209a3c6a219b3c209a3c209b3c6a219c3c209b3c209c3c6a219d3c209c3c209d3c6a219e" - "3c209d3c209e3c6a219f3c209e3c209f3c6a21a03c209f3c20a03c6a21a13c20a03c20a13c6a21a23c20a13c20a23c" - "6a21a33c20a23c20a33c6a21a43c20a33c20a43c6a21a53c20a43c20a53c6a21a63c20a53c20a63c6a21a73c20a63c" - "20a73c6a21a83c20a73c20a83c6a21a93c20a83c20a93c6a21aa3c20a93c20aa3c6a21ab3c20aa3c20ab3c6a21ac3c" - "20ab3c20ac3c6a21ad3c20ac3c20ad3c6a21ae3c20ad3c20ae3c6a21af3c20ae3c20af3c6a21b03c20af3c20b03c6a" - "21b13c20b03c20b13c6a21b23c20b13c20b23c6a21b33c20b23c20b33c6a21b43c20b33c20b43c6a21b53c20b43c20" - "b53c6a21b63c20b53c20b63c6a21b73c20b63c20b73c6a21b83c20b73c20b83c6a21b93c20b83c20b93c6a21ba3c20" - "b93c20ba3c6a21bb3c20ba3c20bb3c6a21bc3c20bb3c20bc3c6a21bd3c20bc3c20bd3c6a21be3c20bd3c20be3c6a21" - "bf3c20be3c20bf3c6a21c03c20bf3c20c03c6a21c13c20c03c20c13c6a21c23c20c13c20c23c6a21c33c20c23c20c3" - "3c6a21c43c20c33c20c43c6a21c53c20c43c20c53c6a21c63c20c53c20c63c6a21c73c20c63c20c73c6a21c83c20c7" - "3c20c83c6a21c93c20c83c20c93c6a21ca3c20c93c20ca3c6a21cb3c20ca3c20cb3c6a21cc3c20cb3c20cc3c6a21cd" - "3c20cc3c20cd3c6a21ce3c20cd3c20ce3c6a21cf3c20ce3c20cf3c6a21d03c20cf3c20d03c6a21d13c20d03c20d13c" - "6a21d23c20d13c20d23c6a21d33c20d23c20d33c6a21d43c20d33c20d43c6a21d53c20d43c20d53c6a21d63c20d53c" - "20d63c6a21d73c20d63c20d73c6a21d83c20d73c20d83c6a21d93c20d83c20d93c6a21da3c20d93c20da3c6a21db3c" - "20da3c20db3c6a21dc3c20db3c20dc3c6a21dd3c20dc3c20dd3c6a21de3c20dd3c20de3c6a21df3c20de3c20df3c6a" - "21e03c20df3c20e03c6a21e13c20e03c20e13c6a21e23c20e13c20e23c6a21e33c20e23c20e33c6a21e43c20e33c20" - "e43c6a21e53c20e43c20e53c6a21e63c20e53c20e63c6a21e73c20e63c20e73c6a21e83c20e73c20e83c6a21e93c20" - "e83c20e93c6a21ea3c20e93c20ea3c6a21eb3c20ea3c20eb3c6a21ec3c20eb3c20ec3c6a21ed3c20ec3c20ed3c6a21" - "ee3c20ed3c20ee3c6a21ef3c20ee3c20ef3c6a21f03c20ef3c20f03c6a21f13c20f03c20f13c6a21f23c20f13c20f2" - "3c6a21f33c20f23c20f33c6a21f43c20f33c20f43c6a21f53c20f43c20f53c6a21f63c20f53c20f63c6a21f73c20f6" - "3c20f73c6a21f83c20f73c20f83c6a21f93c20f83c20f93c6a21fa3c20f93c20fa3c6a21fb3c20fa3c20fb3c6a21fc" - "3c20fb3c20fc3c6a21fd3c20fc3c20fd3c6a21fe3c20fd3c20fe3c6a21ff3c20fe3c20ff3c6a21803d20ff3c20803d" - "6a21813d20803d20813d6a21823d20813d20823d6a21833d20823d20833d6a21843d20833d20843d6a21853d20843d" - "20853d6a21863d20853d20863d6a21873d20863d20873d6a21883d20873d20883d6a21893d20883d20893d6a218a3d" - "20893d208a3d6a218b3d208a3d208b3d6a218c3d208b3d208c3d6a218d3d208c3d208d3d6a218e3d208d3d208e3d6a" - "218f3d208e3d208f3d6a21903d208f3d20903d6a21913d20903d20913d6a21923d20913d20923d6a21933d20923d20" - "933d6a21943d20933d20943d6a21953d20943d20953d6a21963d20953d20963d6a21973d20963d20973d6a21983d20" - "973d20983d6a21993d20983d20993d6a219a3d20993d209a3d6a219b3d209a3d209b3d6a219c3d209b3d209c3d6a21" - "9d3d209c3d209d3d6a219e3d209d3d209e3d6a219f3d209e3d209f3d6a21a03d209f3d20a03d6a21a13d20a03d20a1" - "3d6a21a23d20a13d20a23d6a21a33d20a23d20a33d6a21a43d20a33d20a43d6a21a53d20a43d20a53d6a21a63d20a5" - "3d20a63d6a21a73d20a63d20a73d6a21a83d20a73d20a83d6a21a93d20a83d20a93d6a21aa3d20a93d20aa3d6a21ab" - "3d20aa3d20ab3d6a21ac3d20ab3d20ac3d6a21ad3d20ac3d20ad3d6a21ae3d20ad3d20ae3d6a21af3d20ae3d20af3d" - "6a21b03d20af3d20b03d6a21b13d20b03d20b13d6a21b23d20b13d20b23d6a21b33d20b23d20b33d6a21b43d20b33d" - "20b43d6a21b53d20b43d20b53d6a21b63d20b53d20b63d6a21b73d20b63d20b73d6a21b83d20b73d20b83d6a21b93d" - "20b83d20b93d6a21ba3d20b93d20ba3d6a21bb3d20ba3d20bb3d6a21bc3d20bb3d20bc3d6a21bd3d20bc3d20bd3d6a" - "21be3d20bd3d20be3d6a21bf3d20be3d20bf3d6a21c03d20bf3d20c03d6a21c13d20c03d20c13d6a21c23d20c13d20" - "c23d6a21c33d20c23d20c33d6a21c43d20c33d20c43d6a21c53d20c43d20c53d6a21c63d20c53d20c63d6a21c73d20" - "c63d20c73d6a21c83d20c73d20c83d6a21c93d20c83d20c93d6a21ca3d20c93d20ca3d6a21cb3d20ca3d20cb3d6a21" - "cc3d20cb3d20cc3d6a21cd3d20cc3d20cd3d6a21ce3d20cd3d20ce3d6a21cf3d20ce3d20cf3d6a21d03d20cf3d20d0" - "3d6a21d13d20d03d20d13d6a21d23d20d13d20d23d6a21d33d20d23d20d33d6a21d43d20d33d20d43d6a21d53d20d4" - "3d20d53d6a21d63d20d53d20d63d6a21d73d20d63d20d73d6a21d83d20d73d20d83d6a21d93d20d83d20d93d6a21da" - "3d20d93d20da3d6a21db3d20da3d20db3d6a21dc3d20db3d20dc3d6a21dd3d20dc3d20dd3d6a21de3d20dd3d20de3d" - "6a21df3d20de3d20df3d6a21e03d20df3d20e03d6a21e13d20e03d20e13d6a21e23d20e13d20e23d6a21e33d20e23d" - "20e33d6a21e43d20e33d20e43d6a21e53d20e43d20e53d6a21e63d20e53d20e63d6a21e73d20e63d20e73d6a21e83d" - "20e73d20e83d6a21e93d20e83d20e93d6a21ea3d20e93d20ea3d6a21eb3d20ea3d20eb3d6a21ec3d20eb3d20ec3d6a" - "21ed3d20ec3d20ed3d6a21ee3d20ed3d20ee3d6a21ef3d20ee3d20ef3d6a21f03d20ef3d20f03d6a21f13d20f03d20" - "f13d6a21f23d20f13d20f23d6a21f33d20f23d20f33d6a21f43d20f33d20f43d6a21f53d20f43d20f53d6a21f63d20" - "f53d20f63d6a21f73d20f63d20f73d6a21f83d20f73d20f83d6a21f93d20f83d20f93d6a21fa3d20f93d20fa3d6a21" - "fb3d20fa3d20fb3d6a21fc3d20fb3d20fc3d6a21fd3d20fc3d20fd3d6a21fe3d20fd3d20fe3d6a21ff3d20fe3d20ff" - "3d6a21803e20ff3d20803e6a21813e20803e20813e6a21823e20813e20823e6a21833e20823e20833e6a21843e2083" - "3e20843e6a21853e20843e20853e6a21863e20853e20863e6a21873e20863e20873e6a21883e20873e20883e6a2189" - "3e20883e20893e6a218a3e20893e208a3e6a218b3e208a3e208b3e6a218c3e208b3e208c3e6a218d3e208c3e208d3e" - "6a218e3e208d3e208e3e6a218f3e208e3e208f3e6a21903e208f3e20903e6a21913e20903e20913e6a21923e20913e" - "20923e6a21933e20923e20933e6a21943e20933e20943e6a21953e20943e20953e6a21963e20953e20963e6a21973e" - "20963e20973e6a21983e20973e20983e6a21993e20983e20993e6a219a3e20993e209a3e6a219b3e209a3e209b3e6a" - "219c3e209b3e209c3e6a219d3e209c3e209d3e6a219e3e209d3e209e3e6a219f3e209e3e209f3e6a21a03e209f3e20" - "a03e6a21a13e20a03e20a13e6a21a23e20a13e20a23e6a21a33e20a23e20a33e6a21a43e20a33e20a43e6a21a53e20" - "a43e20a53e6a21a63e20a53e20a63e6a21a73e20a63e20a73e6a21a83e20a73e20a83e6a21a93e20a83e20a93e6a21" - "aa3e20a93e20aa3e6a21ab3e20aa3e20ab3e6a21ac3e20ab3e20ac3e6a21ad3e20ac3e20ad3e6a21ae3e20ad3e20ae" - "3e6a21af3e20ae3e20af3e6a21b03e20af3e20b03e6a21b13e20b03e20b13e6a21b23e20b13e20b23e6a21b33e20b2" - "3e20b33e6a21b43e20b33e20b43e6a21b53e20b43e20b53e6a21b63e20b53e20b63e6a21b73e20b63e20b73e6a21b8" - "3e20b73e20b83e6a21b93e20b83e20b93e6a21ba3e20b93e20ba3e6a21bb3e20ba3e20bb3e6a21bc3e20bb3e20bc3e" - "6a21bd3e20bc3e20bd3e6a21be3e20bd3e20be3e6a21bf3e20be3e20bf3e6a21c03e20bf3e20c03e6a21c13e20c03e" - "20c13e6a21c23e20c13e20c23e6a21c33e20c23e20c33e6a21c43e20c33e20c43e6a21c53e20c43e20c53e6a21c63e" - "20c53e20c63e6a21c73e20c63e20c73e6a21c83e20c73e20c83e6a21c93e20c83e20c93e6a21ca3e20c93e20ca3e6a" - "21cb3e20ca3e20cb3e6a21cc3e20cb3e20cc3e6a21cd3e20cc3e20cd3e6a21ce3e20cd3e20ce3e6a21cf3e20ce3e20" - "cf3e6a21d03e20cf3e20d03e6a21d13e20d03e20d13e6a21d23e20d13e20d23e6a21d33e20d23e20d33e6a21d43e20" - "d33e20d43e6a21d53e20d43e20d53e6a21d63e20d53e20d63e6a21d73e20d63e20d73e6a21d83e20d73e20d83e6a21" - "d93e20d83e20d93e6a21da3e20d93e20da3e6a21db3e20da3e20db3e6a21dc3e20db3e20dc3e6a21dd3e20dc3e20dd" - "3e6a21de3e20dd3e20de3e6a21df3e20de3e20df3e6a21e03e20df3e20e03e6a21e13e20e03e20e13e6a21e23e20e1" - "3e20e23e6a21e33e20e23e20e33e6a21e43e20e33e20e43e6a21e53e20e43e20e53e6a21e63e20e53e20e63e6a21e7" - "3e20e63e20e73e6a21e83e20e73e20e83e6a21e93e20e83e20e93e6a21ea3e20e93e20ea3e6a21eb3e20ea3e20eb3e" - "6a21ec3e20eb3e20ec3e6a21ed3e20ec3e20ed3e6a21ee3e20ed3e20ee3e6a21ef3e20ee3e20ef3e6a21f03e20ef3e" - "20f03e6a21f13e20f03e20f13e6a21f23e20f13e20f23e6a21f33e20f23e20f33e6a21f43e20f33e20f43e6a21f53e" - "20f43e20f53e6a21f63e20f53e20f63e6a21f73e20f63e20f73e6a21f83e20f73e20f83e6a21f93e20f83e20f93e6a" - "21fa3e20f93e20fa3e6a21fb3e20fa3e20fb3e6a21fc3e20fb3e20fc3e6a21fd3e20fc3e20fd3e6a21fe3e20fd3e20" - "fe3e6a21ff3e20fe3e20ff3e6a21803f20ff3e20803f6a21813f20803f20813f6a21823f20813f20823f6a21833f20" - "823f20833f6a21843f20833f20843f6a21853f20843f20853f6a21863f20853f20863f6a21873f20863f20873f6a21" - "883f20873f20883f6a21893f20883f20893f6a218a3f20893f208a3f6a218b3f208a3f208b3f6a218c3f208b3f208c" - "3f6a218d3f208c3f208d3f6a218e3f208d3f208e3f6a218f3f208e3f208f3f6a21903f208f3f20903f6a21913f2090" - "3f20913f6a21923f20913f20923f6a21933f20923f20933f6a21943f20933f20943f6a21953f20943f20953f6a2196" - "3f20953f20963f6a21973f20963f20973f6a21983f20973f20983f6a21993f20983f20993f6a219a3f20993f209a3f" - "6a219b3f209a3f209b3f6a219c3f209b3f209c3f6a219d3f209c3f209d3f6a219e3f209d3f209e3f6a219f3f209e3f" - "209f3f6a21a03f209f3f20a03f6a21a13f20a03f20a13f6a21a23f20a13f20a23f6a21a33f20a23f20a33f6a21a43f" - "20a33f20a43f6a21a53f20a43f20a53f6a21a63f20a53f20a63f6a21a73f20a63f20a73f6a21a83f20a73f20a83f6a" - "21a93f20a83f20a93f6a21aa3f20a93f20aa3f6a21ab3f20aa3f20ab3f6a21ac3f20ab3f20ac3f6a21ad3f20ac3f20" - "ad3f6a21ae3f20ad3f20ae3f6a21af3f20ae3f20af3f6a21b03f20af3f20b03f6a21b13f20b03f20b13f6a21b23f20" - "b13f20b23f6a21b33f20b23f20b33f6a21b43f20b33f20b43f6a21b53f20b43f20b53f6a21b63f20b53f20b63f6a21" - "b73f20b63f20b73f6a21b83f20b73f20b83f6a21b93f20b83f20b93f6a21ba3f20b93f20ba3f6a21bb3f20ba3f20bb" - "3f6a21bc3f20bb3f20bc3f6a21bd3f20bc3f20bd3f6a21be3f20bd3f20be3f6a21bf3f20be3f20bf3f6a21c03f20bf" - "3f20c03f6a21c13f20c03f20c13f6a21c23f20c13f20c23f6a21c33f20c23f20c33f6a21c43f20c33f20c43f6a21c5" - "3f20c43f20c53f6a21c63f20c53f20c63f6a21c73f20c63f20c73f6a21c83f20c73f20c83f6a21c93f20c83f20c93f" - "6a21ca3f20c93f20ca3f6a21cb3f20ca3f20cb3f6a21cc3f20cb3f20cc3f6a21cd3f20cc3f20cd3f6a21ce3f20cd3f" - "20ce3f6a21cf3f20ce3f20cf3f6a21d03f20cf3f20d03f6a21d13f20d03f20d13f6a21d23f20d13f20d23f6a21d33f" - "20d23f20d33f6a21d43f20d33f20d43f6a21d53f20d43f20d53f6a21d63f20d53f20d63f6a21d73f20d63f20d73f6a" - "21d83f20d73f20d83f6a21d93f20d83f20d93f6a21da3f20d93f20da3f6a21db3f20da3f20db3f6a21dc3f20db3f20" - "dc3f6a21dd3f20dc3f20dd3f6a21de3f20dd3f20de3f6a21df3f20de3f20df3f6a21e03f20df3f20e03f6a21e13f20" - "e03f20e13f6a21e23f20e13f20e23f6a21e33f20e23f20e33f6a21e43f20e33f20e43f6a21e53f20e43f20e53f6a21" - "e63f20e53f20e63f6a21e73f20e63f20e73f6a21e83f20e73f20e83f6a21e93f20e83f20e93f6a21ea3f20e93f20ea" - "3f6a21eb3f20ea3f20eb3f6a21ec3f20eb3f20ec3f6a21ed3f20ec3f20ed3f6a21ee3f20ed3f20ee3f6a21ef3f20ee" - "3f20ef3f6a21f03f20ef3f20f03f6a21f13f20f03f20f13f6a21f23f20f13f20f23f6a21f33f20f23f20f33f6a21f4" - "3f20f33f20f43f6a21f53f20f43f20f53f6a21f63f20f53f20f63f6a21f73f20f63f20f73f6a21f83f20f73f20f83f" - "6a21f93f20f83f20f93f6a21fa3f20f93f20fa3f6a21fb3f20fa3f20fb3f6a21fc3f20fb3f20fc3f6a21fd3f20fc3f" - "20fd3f6a21fe3f20fd3f20fe3f6a21ff3f20fe3f20ff3f6a21804020ff3f2080406a2181402080402081406a218240" - "2081402082406a2183402082402083406a2184402083402084406a2185402084402085406a2186402085402086406a" - "2187402086402087406a2188402087402088406a2189402088402089406a218a40208940208a406a218b40208a4020" - "8b406a218c40208b40208c406a218d40208c40208d406a218e40208d40208e406a218f40208e40208f406a21904020" - "8f402090406a2191402090402091406a2192402091402092406a2193402092402093406a2194402093402094406a21" - "95402094402095406a2196402095402096406a2197402096402097406a2198402097402098406a2199402098402099" - "406a219a40209940209a406a219b40209a40209b406a219c40209b40209c406a219d40209c40209d406a219e40209d" - "40209e406a219f40209e40209f406a21a040209f4020a0406a21a14020a04020a1406a21a24020a14020a2406a21a3" - "4020a24020a3406a21a44020a34020a4406a21a54020a44020a5406a21a64020a54020a6406a21a74020a64020a740" - "6a21a84020a74020a8406a21a94020a84020a9406a21aa4020a94020aa406a21ab4020aa4020ab406a21ac4020ab40" - "20ac406a21ad4020ac4020ad406a21ae4020ad4020ae406a21af4020ae4020af406a21b04020af4020b0406a21b140" - "20b04020b1406a21b24020b14020b2406a21b34020b24020b3406a21b44020b34020b4406a21b54020b44020b5406a" - "21b64020b54020b6406a21b74020b64020b7406a21b84020b74020b8406a21b94020b84020b9406a21ba4020b94020" - "ba406a21bb4020ba4020bb406a21bc4020bb4020bc406a21bd4020bc4020bd406a21be4020bd4020be406a21bf4020" - "be4020bf406a21c04020bf4020c0406a21c14020c04020c1406a21c24020c14020c2406a21c34020c24020c3406a21" - "c44020c34020c4406a21c54020c44020c5406a21c64020c54020c6406a21c74020c64020c7406a21c84020c74020c8" - "406a21c94020c84020c9406a21ca4020c94020ca406a21cb4020ca4020cb406a21cc4020cb4020cc406a21cd4020cc" - "4020cd406a21ce4020cd4020ce406a21cf4020ce4020cf406a21d04020cf4020d0406a21d14020d04020d1406a21d2" - "4020d14020d2406a21d34020d24020d3406a21d44020d34020d4406a21d54020d44020d5406a21d64020d54020d640" - "6a21d74020d64020d7406a21d84020d74020d8406a21d94020d84020d9406a21da4020d94020da406a21db4020da40" - "20db406a21dc4020db4020dc406a21dd4020dc4020dd406a21de4020dd4020de406a21df4020de4020df406a21e040" - "20df4020e0406a21e14020e04020e1406a21e24020e14020e2406a21e34020e24020e3406a21e44020e34020e4406a" - "21e54020e44020e5406a21e64020e54020e6406a21e74020e64020e7406a21e84020e74020e8406a21e94020e84020" - "e9406a21ea4020e94020ea406a21eb4020ea4020eb406a21ec4020eb4020ec406a21ed4020ec4020ed406a21ee4020" - "ed4020ee406a21ef4020ee4020ef406a21f04020ef4020f0406a21f14020f04020f1406a21f24020f14020f2406a21" - "f34020f24020f3406a21f44020f34020f4406a21f54020f44020f5406a21f64020f54020f6406a21f74020f64020f7" - "406a21f84020f74020f8406a21f94020f84020f9406a21fa4020f94020fa406a21fb4020fa4020fb406a21fc4020fb" - "4020fc406a21fd4020fc4020fd406a21fe4020fd4020fe406a21ff4020fe4020ff406a21804120ff402080416a2181" - "412080412081416a2182412081412082416a2183412082412083416a2184412083412084416a218541208441208541" - "6a2186412085412086416a2187412086412087416a2188412087412088416a2189412088412089416a218a41208941" - "208a416a218b41208a41208b416a218c41208b41208c416a218d41208c41208d416a218e41208d41208e416a218f41" - "208e41208f416a219041208f412090416a2191412090412091416a2192412091412092416a2193412092412093416a" - "2194412093412094416a2195412094412095416a2196412095412096416a2197412096412097416a21984120974120" - "98416a2199412098412099416a219a41209941209a416a219b41209a41209b416a219c41209b41209c416a219d4120" - "9c41209d416a219e41209d41209e416a219f41209e41209f416a21a041209f4120a0416a21a14120a04120a1416a21" - "a24120a14120a2416a21a34120a24120a3416a21a44120a34120a4416a21a54120a44120a5416a21a64120a54120a6" - "416a21a74120a64120a7416a21a84120a74120a8416a21a94120a84120a9416a21aa4120a94120aa416a21ab4120aa" - "4120ab416a21ac4120ab4120ac416a21ad4120ac4120ad416a21ae4120ad4120ae416a21af4120ae4120af416a21b0" - "4120af4120b0416a21b14120b04120b1416a21b24120b14120b2416a21b34120b24120b3416a21b44120b34120b441" - "6a21b54120b44120b5416a21b64120b54120b6416a21b74120b64120b7416a21b84120b74120b8416a21b94120b841" - "20b9416a21ba4120b94120ba416a21bb4120ba4120bb416a21bc4120bb4120bc416a21bd4120bc4120bd416a21be41" - "20bd4120be416a21bf4120be4120bf416a21c04120bf4120c0416a21c14120c04120c1416a21c24120c14120c2416a" - "21c34120c24120c3416a21c44120c34120c4416a21c54120c44120c5416a21c64120c54120c6416a21c74120c64120" - "c7416a21c84120c74120c8416a21c94120c84120c9416a21ca4120c94120ca416a21cb4120ca4120cb416a21cc4120" - "cb4120cc416a21cd4120cc4120cd416a21ce4120cd4120ce416a21cf4120ce4120cf416a21d04120cf4120d0416a21" - "d14120d04120d1416a21d24120d14120d2416a21d34120d24120d3416a21d44120d34120d4416a21d54120d44120d5" - "416a21d64120d54120d6416a21d74120d64120d7416a21d84120d74120d8416a21d94120d84120d9416a21da4120d9" - "4120da416a21db4120da4120db416a21dc4120db4120dc416a21dd4120dc4120dd416a21de4120dd4120de416a21df" - "4120de4120df416a21e04120df4120e0416a21e14120e04120e1416a21e24120e14120e2416a21e34120e24120e341" - "6a21e44120e34120e4416a21e54120e44120e5416a21e64120e54120e6416a21e74120e64120e7416a21e84120e741" - "20e8416a21e94120e84120e9416a21ea4120e94120ea416a21eb4120ea4120eb416a21ec4120eb4120ec416a21ed41" - "20ec4120ed416a21ee4120ed4120ee416a21ef4120ee4120ef416a21f04120ef4120f0416a21f14120f04120f1416a" - "21f24120f14120f2416a21f34120f24120f3416a21f44120f34120f4416a21f54120f44120f5416a21f64120f54120" - "f6416a21f74120f64120f7416a21f84120f74120f8416a21f94120f84120f9416a21fa4120f94120fa416a21fb4120" - "fa4120fb416a21fc4120fb4120fc416a21fd4120fc4120fd416a21fe4120fd4120fe416a21ff4120fe4120ff416a21" - "804220ff412080426a2181422080422081426a2182422081422082426a2183422082422083426a2184422083422084" - "426a2185422084422085426a2186422085422086426a2187422086422087426a2188422087422088426a2189422088" - "422089426a218a42208942208a426a218b42208a42208b426a218c42208b42208c426a218d42208c42208d426a218e" - "42208d42208e426a218f42208e42208f426a219042208f422090426a2191422090422091426a219242209142209242" - "6a2193422092422093426a2194422093422094426a2195422094422095426a2196422095422096426a219742209642" - "2097426a2198422097422098426a2199422098422099426a219a42209942209a426a219b42209a42209b426a219c42" - "209b42209c426a219d42209c42209d426a219e42209d42209e426a219f42209e42209f426a21a042209f4220a0426a" - "21a14220a04220a1426a21a24220a14220a2426a21a34220a24220a3426a21a44220a34220a4426a21a54220a44220" - "a5426a21a64220a54220a6426a21a74220a64220a7426a21a84220a74220a8426a21a94220a84220a9426a21aa4220" - "a94220aa426a21ab4220aa4220ab426a21ac4220ab4220ac426a21ad4220ac4220ad426a21ae4220ad4220ae426a21" - "af4220ae4220af426a21b04220af4220b0426a21b14220b04220b1426a21b24220b14220b2426a21b34220b24220b3" - "426a21b44220b34220b4426a21b54220b44220b5426a21b64220b54220b6426a21b74220b64220b7426a21b84220b7" - "4220b8426a21b94220b84220b9426a21ba4220b94220ba426a21bb4220ba4220bb426a21bc4220bb4220bc426a21bd" - "4220bc4220bd426a21be4220bd4220be426a21bf4220be4220bf426a21c04220bf4220c0426a21c14220c04220c142" - "6a21c24220c14220c2426a21c34220c24220c3426a21c44220c34220c4426a21c54220c44220c5426a21c64220c542" - "20c6426a21c74220c64220c7426a21c84220c74220c8426a21c94220c84220c9426a21ca4220c94220ca426a21cb42" - "20ca4220cb426a21cc4220cb4220cc426a21cd4220cc4220cd426a21ce4220cd4220ce426a21cf4220ce4220cf426a" - "21d04220cf4220d0426a21d14220d04220d1426a21d24220d14220d2426a21d34220d24220d3426a21d44220d34220" - "d4426a21d54220d44220d5426a21d64220d54220d6426a21d74220d64220d7426a21d84220d74220d8426a21d94220" - "d84220d9426a21da4220d94220da426a21db4220da4220db426a21dc4220db4220dc426a21dd4220dc4220dd426a21" - "de4220dd4220de426a21df4220de4220df426a21e04220df4220e0426a21e14220e04220e1426a21e24220e14220e2" - "426a21e34220e24220e3426a21e44220e34220e4426a21e54220e44220e5426a21e64220e54220e6426a21e74220e6" - "4220e7426a21e84220e74220e8426a21e94220e84220e9426a21ea4220e94220ea426a21eb4220ea4220eb426a21ec" - "4220eb4220ec426a21ed4220ec4220ed426a21ee4220ed4220ee426a21ef4220ee4220ef426a21f04220ef4220f042" - "6a21f14220f04220f1426a21f24220f14220f2426a21f34220f24220f3426a21f44220f34220f4426a21f54220f442" - "20f5426a21f64220f54220f6426a21f74220f64220f7426a21f84220f74220f8426a21f94220f84220f9426a21fa42" - "20f94220fa426a21fb4220fa4220fb426a21fc4220fb4220fc426a21fd4220fc4220fd426a21fe4220fd4220fe426a" - "21ff4220fe4220ff426a21804320ff422080436a2181432080432081436a2182432081432082436a21834320824320" - "83436a2184432083432084436a2185432084432085436a2186432085432086436a2187432086432087436a21884320" - "87432088436a2189432088432089436a218a43208943208a436a218b43208a43208b436a218c43208b43208c436a21" - "8d43208c43208d436a218e43208d43208e436a218f43208e43208f436a219043208f432090436a2191432090432091" - "436a2192432091432092436a2193432092432093436a2194432093432094436a2195432094432095436a2196432095" - "432096436a2197432096432097436a2198432097432098436a2199432098432099436a219a43209943209a436a219b" - "43209a43209b436a219c43209b43209c436a219d43209c43209d436a219e43209d43209e436a219f43209e43209f43" - "6a21a043209f4320a0436a21a14320a04320a1436a21a24320a14320a2436a21a34320a24320a3436a21a44320a343" - "20a4436a21a54320a44320a5436a21a64320a54320a6436a21a74320a64320a7436a21a84320a74320a8436a21a943" - "20a84320a9436a21aa4320a94320aa436a21ab4320aa4320ab436a21ac4320ab4320ac436a21ad4320ac4320ad436a" - "21ae4320ad4320ae436a21af4320ae4320af436a21b04320af4320b0436a21b14320b04320b1436a21b24320b14320" - "b2436a21b34320b24320b3436a21b44320b34320b4436a21b54320b44320b5436a21b64320b54320b6436a21b74320" - "b64320b7436a21b84320b74320b8436a21b94320b84320b9436a21ba4320b94320ba436a21bb4320ba4320bb436a21" - "bc4320bb4320bc436a21bd4320bc4320bd436a21be4320bd4320be436a21bf4320be4320bf436a21c04320bf4320c0" - "436a21c14320c04320c1436a21c24320c14320c2436a21c34320c24320c3436a21c44320c34320c4436a21c54320c4" - "4320c5436a21c64320c54320c6436a21c74320c64320c7436a21c84320c74320c8436a21c94320c84320c9436a21ca" - "4320c94320ca436a21cb4320ca4320cb436a21cc4320cb4320cc436a21cd4320cc4320cd436a21ce4320cd4320ce43" - "6a21cf4320ce4320cf436a21d04320cf4320d0436a21d14320d04320d1436a21d24320d14320d2436a21d34320d243" - "20d3436a21d44320d34320d4436a21d54320d44320d5436a21d64320d54320d6436a21d74320d64320d7436a21d843" - "20d74320d8436a21d94320d84320d9436a21da4320d94320da436a21db4320da4320db436a21dc4320db4320dc436a" - "21dd4320dc4320dd436a21de4320dd4320de436a21df4320de4320df436a21e04320df4320e0436a21e14320e04320" - "e1436a21e24320e14320e2436a21e34320e24320e3436a21e44320e34320e4436a21e54320e44320e5436a21e64320" - "e54320e6436a21e74320e64320e7436a21e84320e74320e8436a21e94320e84320e9436a21ea4320e94320ea436a21" - "eb4320ea4320eb436a21ec4320eb4320ec436a21ed4320ec4320ed436a21ee4320ed4320ee436a21ef4320ee4320ef" - "436a21f04320ef4320f0436a21f14320f04320f1436a21f24320f14320f2436a21f34320f24320f3436a21f44320f3" - "4320f4436a21f54320f44320f5436a21f64320f54320f6436a21f74320f64320f7436a21f84320f74320f8436a21f9" - "4320f84320f9436a21fa4320f94320fa436a21fb4320fa4320fb436a21fc4320fb4320fc436a21fd4320fc4320fd43" - "6a21fe4320fd4320fe436a21ff4320fe4320ff436a21804420ff432080446a2181442080442081446a218244208144" - "2082446a2183442082442083446a2184442083442084446a2185442084442085446a2186442085442086446a218744" - "2086442087446a2188442087442088446a2189442088442089446a218a44208944208a446a218b44208a44208b446a" - "218c44208b44208c446a218d44208c44208d446a218e44208d44208e446a218f44208e44208f446a219044208f4420" - "90446a2191442090442091446a2192442091442092446a2193442092442093446a2194442093442094446a21954420" - "94442095446a2196442095442096446a2197442096442097446a2198442097442098446a2199442098442099446a21" - "9a44209944209a446a219b44209a44209b446a219c44209b44209c446a219d44209c44209d446a219e44209d44209e" - "446a219f44209e44209f446a21a044209f4420a0446a21a14420a04420a1446a21a24420a14420a2446a21a34420a2" - "4420a3446a21a44420a34420a4446a21a54420a44420a5446a21a64420a54420a6446a21a74420a64420a7446a21a8" - "4420a74420a8446a21a94420a84420a9446a21aa4420a94420aa446a21ab4420aa4420ab446a21ac4420ab4420ac44" - "6a21ad4420ac4420ad446a21ae4420ad4420ae446a21af4420ae4420af446a21b04420af4420b0446a21b14420b044" - "20b1446a21b24420b14420b2446a21b34420b24420b3446a21b44420b34420b4446a21b54420b44420b5446a21b644" - "20b54420b6446a21b74420b64420b7446a21b84420b74420b8446a21b94420b84420b9446a21ba4420b94420ba446a" - "21bb4420ba4420bb446a21bc4420bb4420bc446a21bd4420bc4420bd446a21be4420bd4420be446a21bf4420be4420" - "bf446a21c04420bf4420c0446a21c14420c04420c1446a21c24420c14420c2446a21c34420c24420c3446a21c44420" - "c34420c4446a21c54420c44420c5446a21c64420c54420c6446a21c74420c64420c7446a21c84420c74420c8446a21" - "c94420c84420c9446a21ca4420c94420ca446a21cb4420ca4420cb446a21cc4420cb4420cc446a21cd4420cc4420cd" - "446a21ce4420cd4420ce446a21cf4420ce4420cf446a21d04420cf4420d0446a21d14420d04420d1446a21d24420d1" - "4420d2446a21d34420d24420d3446a21d44420d34420d4446a21d54420d44420d5446a21d64420d54420d6446a21d7" - "4420d64420d7446a21d84420d74420d8446a21d94420d84420d9446a21da4420d94420da446a21db4420da4420db44" - "6a21dc4420db4420dc446a21dd4420dc4420dd446a21de4420dd4420de446a21df4420de4420df446a21e04420df44" - "20e0446a21e14420e04420e1446a21e24420e14420e2446a21e34420e24420e3446a21e44420e34420e4446a21e544" - "20e44420e5446a21e64420e54420e6446a21e74420e64420e7446a21e84420e74420e8446a21e94420e84420e9446a" - "21ea4420e94420ea446a21eb4420ea4420eb446a21ec4420eb4420ec446a21ed4420ec4420ed446a21ee4420ed4420" - "ee446a21ef4420ee4420ef446a21f04420ef4420f0446a21f14420f04420f1446a21f24420f14420f2446a21f34420" - "f24420f3446a21f44420f34420f4446a21f54420f44420f5446a21f64420f54420f6446a21f74420f64420f7446a21" - "f84420f74420f8446a21f94420f84420f9446a21fa4420f94420fa446a21fb4420fa4420fb446a21fc4420fb4420fc" - "446a21fd4420fc4420fd446a21fe4420fd4420fe446a21ff4420fe4420ff446a21804520ff442080456a2181452080" - "452081456a2182452081452082456a2183452082452083456a2184452083452084456a2185452084452085456a2186" - "452085452086456a2187452086452087456a2188452087452088456a2189452088452089456a218a45208945208a45" - "6a218b45208a45208b456a218c45208b45208c456a218d45208c45208d456a218e45208d45208e456a218f45208e45" - "208f456a219045208f452090456a2191452090452091456a2192452091452092456a2193452092452093456a219445" - "2093452094456a2195452094452095456a2196452095452096456a2197452096452097456a2198452097452098456a" - "2199452098452099456a219a45209945209a456a219b45209a45209b456a219c45209b45209c456a219d45209c4520" - "9d456a219e45209d45209e456a219f45209e45209f456a21a045209f4520a0456a21a14520a04520a1456a21a24520" - "a14520a2456a21a34520a24520a3456a21a44520a34520a4456a21a54520a44520a5456a21a64520a54520a6456a21" - "a74520a64520a7456a21a84520a74520a8456a21a94520a84520a9456a21aa4520a94520aa456a21ab4520aa4520ab" - "456a21ac4520ab4520ac456a21ad4520ac4520ad456a21ae4520ad4520ae456a21af4520ae4520af456a21b04520af" - "4520b0456a21b14520b04520b1456a21b24520b14520b2456a21b34520b24520b3456a21b44520b34520b4456a21b5" - "4520b44520b5456a21b64520b54520b6456a21b74520b64520b7456a21b84520b74520b8456a21b94520b84520b945" - "6a21ba4520b94520ba456a21bb4520ba4520bb456a21bc4520bb4520bc456a21bd4520bc4520bd456a21be4520bd45" - "20be456a21bf4520be4520bf456a21c04520bf4520c0456a21c14520c04520c1456a21c24520c14520c2456a21c345" - "20c24520c3456a21c44520c34520c4456a21c54520c44520c5456a21c64520c54520c6456a21c74520c64520c7456a" - "21c84520c74520c8456a21c94520c84520c9456a21ca4520c94520ca456a21cb4520ca4520cb456a21cc4520cb4520" - "cc456a21cd4520cc4520cd456a21ce4520cd4520ce456a21cf4520ce4520cf456a21d04520cf4520d0456a21d14520" - "d04520d1456a21d24520d14520d2456a21d34520d24520d3456a21d44520d34520d4456a21d54520d44520d5456a21" - "d64520d54520d6456a21d74520d64520d7456a21d84520d74520d8456a21d94520d84520d9456a21da4520d94520da" - "456a21db4520da4520db456a21dc4520db4520dc456a21dd4520dc4520dd456a21de4520dd4520de456a21df4520de" - "4520df456a21e04520df4520e0456a21e14520e04520e1456a21e24520e14520e2456a21e34520e24520e3456a21e4" - "4520e34520e4456a21e54520e44520e5456a21e64520e54520e6456a21e74520e64520e7456a21e84520e74520e845" - "6a21e94520e84520e9456a21ea4520e94520ea456a21eb4520ea4520eb456a21ec4520eb4520ec456a21ed4520ec45" - "20ed456a21ee4520ed4520ee456a21ef4520ee4520ef456a21f04520ef4520f0456a21f14520f04520f1456a21f245" - "20f14520f2456a21f34520f24520f3456a21f44520f34520f4456a21f54520f44520f5456a21f64520f54520f6456a" - "21f74520f64520f7456a21f84520f74520f8456a21f94520f84520f9456a21fa4520f94520fa456a21fb4520fa4520" - "fb456a21fc4520fb4520fc456a21fd4520fc4520fd456a21fe4520fd4520fe456a21ff4520fe4520ff456a21804620" - "ff452080466a2181462080462081466a2182462081462082466a2183462082462083466a2184462083462084466a21" - "85462084462085466a2186462085462086466a2187462086462087466a2188462087462088466a2189462088462089" - "466a218a46208946208a466a218b46208a46208b466a218c46208b46208c466a218d46208c46208d466a218e46208d" - "46208e466a218f46208e46208f466a219046208f462090466a2191462090462091466a2192462091462092466a2193" - "462092462093466a2194462093462094466a2195462094462095466a2196462095462096466a219746209646209746" - "6a2198462097462098466a2199462098462099466a219a46209946209a466a219b46209a46209b466a219c46209b46" - "209c466a219d46209c46209d466a219e46209d46209e466a219f46209e46209f466a21a046209f4620a0466a21a146" - "20a04620a1466a21a24620a14620a2466a21a34620a24620a3466a21a44620a34620a4466a21a54620a44620a5466a" - "21a64620a54620a6466a21a74620a64620a7466a21a84620a74620a8466a21a94620a84620a9466a21aa4620a94620" - "aa466a21ab4620aa4620ab466a21ac4620ab4620ac466a21ad4620ac4620ad466a21ae4620ad4620ae466a21af4620" - "ae4620af466a21b04620af4620b0466a21b14620b04620b1466a21b24620b14620b2466a21b34620b24620b3466a21" - "b44620b34620b4466a21b54620b44620b5466a21b64620b54620b6466a21b74620b64620b7466a21b84620b74620b8" - "466a21b94620b84620b9466a21ba4620b94620ba466a21bb4620ba4620bb466a21bc4620bb4620bc466a21bd4620bc" - "4620bd466a21be4620bd4620be466a21bf4620be4620bf466a21c04620bf4620c0466a21c14620c04620c1466a21c2" - "4620c14620c2466a21c34620c24620c3466a21c44620c34620c4466a21c54620c44620c5466a21c64620c54620c646" - "6a21c74620c64620c7466a21c84620c74620c8466a21c94620c84620c9466a21ca4620c94620ca466a21cb4620ca46" - "20cb466a21cc4620cb4620cc466a21cd4620cc4620cd466a21ce4620cd4620ce466a21cf4620ce4620cf466a21d046" - "20cf4620d0466a21d14620d04620d1466a21d24620d14620d2466a21d34620d24620d3466a21d44620d34620d4466a" - "21d54620d44620d5466a21d64620d54620d6466a21d74620d64620d7466a21d84620d74620d8466a21d94620d84620" - "d9466a21da4620d94620da466a21db4620da4620db466a21dc4620db4620dc466a21dd4620dc4620dd466a21de4620" - "dd4620de466a21df4620de4620df466a21e04620df4620e0466a21e14620e04620e1466a21e24620e14620e2466a21" - "e34620e24620e3466a21e44620e34620e4466a21e54620e44620e5466a21e64620e54620e6466a21e74620e64620e7" - "466a21e84620e74620e8466a21e94620e84620e9466a21ea4620e94620ea466a21eb4620ea4620eb466a21ec4620eb" - "4620ec466a21ed4620ec4620ed466a21ee4620ed4620ee466a21ef4620ee4620ef466a21f04620ef4620f0466a21f1" - "4620f04620f1466a21f24620f14620f2466a21f34620f24620f3466a21f44620f34620f4466a21f54620f44620f546" - "6a21f64620f54620f6466a21f74620f64620f7466a21f84620f74620f8466a21f94620f84620f9466a21fa4620f946" - "20fa466a21fb4620fa4620fb466a21fc4620fb4620fc466a21fd4620fc4620fd466a21fe4620fd4620fe466a21ff46" - "20fe4620ff466a21804720ff462080476a2181472080472081476a2182472081472082476a2183472082472083476a" - "2184472083472084476a2185472084472085476a2186472085472086476a2187472086472087476a21884720874720" - "88476a2189472088472089476a218a47208947208a476a218b47208a47208b476a218c47208b47208c476a218d4720" - "8c47208d476a218e47208d47208e476a218f47208e47208f476a219047208f472090476a2191472090472091476a21" - "92472091472092476a2193472092472093476a2194472093472094476a2195472094472095476a2196472095472096" - "476a2197472096472097476a2198472097472098476a2199472098472099476a219a47209947209a476a219b47209a" - "47209b476a219c47209b47209c476a219d47209c47209d476a219e47209d47209e476a219f47209e47209f476a21a0" - "47209f4720a0476a21a14720a04720a1476a21a24720a14720a2476a21a34720a24720a3476a21a44720a34720a447" - "6a21a54720a44720a5476a21a64720a54720a6476a21a74720a64720a7476a21a84720a74720a8476a21a94720a847" - "20a9476a21aa4720a94720aa476a21ab4720aa4720ab476a21ac4720ab4720ac476a21ad4720ac4720ad476a21ae47" - "20ad4720ae476a21af4720ae4720af476a21b04720af4720b0476a21b14720b04720b1476a21b24720b14720b2476a" - "21b34720b24720b3476a21b44720b34720b4476a21b54720b44720b5476a21b64720b54720b6476a21b74720b64720" - "b7476a21b84720b74720b8476a21b94720b84720b9476a21ba4720b94720ba476a21bb4720ba4720bb476a21bc4720" - "bb4720bc476a21bd4720bc4720bd476a21be4720bd4720be476a21bf4720be4720bf476a21c04720bf4720c0476a21" - "c14720c04720c1476a21c24720c14720c2476a21c34720c24720c3476a21c44720c34720c4476a21c54720c44720c5" - "476a21c64720c54720c6476a21c74720c64720c7476a21c84720c74720c8476a21c94720c84720c9476a21ca4720c9" - "4720ca476a21cb4720ca4720cb476a21cc4720cb4720cc476a21cd4720cc4720cd476a21ce4720cd4720ce476a21cf" - "4720ce4720cf476a21d04720cf4720d0476a21d14720d04720d1476a21d24720d14720d2476a21d34720d24720d347" - "6a21d44720d34720d4476a21d54720d44720d5476a21d64720d54720d6476a21d74720d64720d7476a21d84720d747" - "20d8476a21d94720d84720d9476a21da4720d94720da476a21db4720da4720db476a21dc4720db4720dc476a21dd47" - "20dc4720dd476a21de4720dd4720de476a21df4720de4720df476a21e04720df4720e0476a21e14720e04720e1476a" - "21e24720e14720e2476a21e34720e24720e3476a21e44720e34720e4476a21e54720e44720e5476a21e64720e54720" - "e6476a21e74720e64720e7476a21e84720e74720e8476a21e94720e84720e9476a21ea4720e94720ea476a21eb4720" - "ea4720eb476a21ec4720eb4720ec476a21ed4720ec4720ed476a21ee4720ed4720ee476a21ef4720ee4720ef476a21" - "f04720ef4720f0476a21f14720f04720f1476a21f24720f14720f2476a21f34720f24720f3476a21f44720f34720f4" - "476a21f54720f44720f5476a21f64720f54720f6476a21f74720f64720f7476a21f84720f74720f8476a21f94720f8" - "4720f9476a21fa4720f94720fa476a21fb4720fa4720fb476a21fc4720fb4720fc476a21fd4720fc4720fd476a21fe" - "4720fd4720fe476a21ff4720fe4720ff476a21804820ff472080486a2181482080482081486a218248208148208248" - "6a2183482082482083486a2184482083482084486a2185482084482085486a2186482085482086486a218748208648" - "2087486a2188482087482088486a2189482088482089486a218a48208948208a486a218b48208a48208b486a218c48" - "208b48208c486a218d48208c48208d486a218e48208d48208e486a218f48208e48208f486a219048208f482090486a" - "2191482090482091486a2192482091482092486a2193482092482093486a2194482093482094486a21954820944820" - "95486a2196482095482096486a2197482096482097486a2198482097482098486a2199482098482099486a219a4820" - "9948209a486a219b48209a48209b486a219c48209b48209c486a219d48209c48209d486a219e48209d48209e486a21" - "9f48209e48209f486a21a048209f4820a0486a21a14820a04820a1486a21a24820a14820a2486a21a34820a24820a3" - "486a21a44820a34820a4486a21a54820a44820a5486a21a64820a54820a6486a21a74820a64820a7486a21a84820a7" - "4820a8486a21a94820a84820a9486a21aa4820a94820aa486a21ab4820aa4820ab486a21ac4820ab4820ac486a21ad" - "4820ac4820ad486a21ae4820ad4820ae486a21af4820ae4820af486a21b04820af4820b0486a21b14820b04820b148" - "6a21b24820b14820b2486a21b34820b24820b3486a21b44820b34820b4486a21b54820b44820b5486a21b64820b548" - "20b6486a21b74820b64820b7486a21b84820b74820b8486a21b94820b84820b9486a21ba4820b94820ba486a21bb48" - "20ba4820bb486a21bc4820bb4820bc486a21bd4820bc4820bd486a21be4820bd4820be486a21bf4820be4820bf486a" - "21c04820bf4820c0486a21c14820c04820c1486a21c24820c14820c2486a21c34820c24820c3486a21c44820c34820" - "c4486a21c54820c44820c5486a21c64820c54820c6486a21c74820c64820c7486a21c84820c74820c8486a21c94820" - "c84820c9486a21ca4820c94820ca486a21cb4820ca4820cb486a21cc4820cb4820cc486a21cd4820cc4820cd486a21" - "ce4820cd4820ce486a21cf4820ce4820cf486a21d04820cf4820d0486a21d14820d04820d1486a21d24820d14820d2" - "486a21d34820d24820d3486a21d44820d34820d4486a21d54820d44820d5486a21d64820d54820d6486a21d74820d6" - "4820d7486a21d84820d74820d8486a21d94820d84820d9486a21da4820d94820da486a21db4820da4820db486a21dc" - "4820db4820dc486a21dd4820dc4820dd486a21de4820dd4820de486a21df4820de4820df486a21e04820df4820e048" - "6a21e14820e04820e1486a21e24820e14820e2486a21e34820e24820e3486a21e44820e34820e4486a21e54820e448" - "20e5486a21e64820e54820e6486a21e74820e64820e7486a21e84820e74820e8486a21e94820e84820e9486a21ea48" - "20e94820ea486a21eb4820ea4820eb486a21ec4820eb4820ec486a21ed4820ec4820ed486a21ee4820ed4820ee486a" - "21ef4820ee4820ef486a21f04820ef4820f0486a21f14820f04820f1486a21f24820f14820f2486a21f34820f24820" - "f3486a21f44820f34820f4486a21f54820f44820f5486a21f64820f54820f6486a21f74820f64820f7486a21f84820" - "f74820f8486a21f94820f84820f9486a21fa4820f94820fa486a21fb4820fa4820fb486a21fc4820fb4820fc486a21" - "fd4820fc4820fd486a21fe4820fd4820fe486a21ff4820fe4820ff486a21804920ff482080496a2181492080492081" - "496a2182492081492082496a2183492082492083496a2184492083492084496a2185492084492085496a2186492085" - "492086496a2187492086492087496a2188492087492088496a2189492088492089496a218a49208949208a496a218b" - "49208a49208b496a218c49208b49208c496a218d49208c49208d496a218e49208d49208e496a218f49208e49208f49" - "6a219049208f492090496a2191492090492091496a2192492091492092496a2193492092492093496a219449209349" - "2094496a2195492094492095496a2196492095492096496a2197492096492097496a2198492097492098496a219949" - "2098492099496a219a49209949209a496a219b49209a49209b496a219c49209b49209c496a219d49209c49209d496a" - "219e49209d49209e496a219f49209e49209f496a21a049209f4920a0496a21a14920a04920a1496a21a24920a14920" - "a2496a21a34920a24920a3496a21a44920a34920a4496a21a54920a44920a5496a21a64920a54920a6496a21a74920" - "a64920a7496a21a84920a74920a8496a21a94920a84920a9496a21aa4920a94920aa496a21ab4920aa4920ab496a21" - "ac4920ab4920ac496a21ad4920ac4920ad496a21ae4920ad4920ae496a21af4920ae4920af496a21b04920af4920b0" - "496a21b14920b04920b1496a21b24920b14920b2496a21b34920b24920b3496a21b44920b34920b4496a21b54920b4" - "4920b5496a21b64920b54920b6496a21b74920b64920b7496a21b84920b74920b8496a21b94920b84920b9496a21ba" - "4920b94920ba496a21bb4920ba4920bb496a21bc4920bb4920bc496a21bd4920bc4920bd496a21be4920bd4920be49" - "6a21bf4920be4920bf496a21c04920bf4920c0496a21c14920c04920c1496a21c24920c14920c2496a21c34920c249" - "20c3496a21c44920c34920c4496a21c54920c44920c5496a21c64920c54920c6496a21c74920c64920c7496a21c849" - "20c74920c8496a21c94920c84920c9496a21ca4920c94920ca496a21cb4920ca4920cb496a21cc4920cb4920cc496a" - "21cd4920cc4920cd496a21ce4920cd4920ce496a21cf4920ce4920cf496a21d04920cf4920d0496a21d14920d04920" - "d1496a21d24920d14920d2496a21d34920d24920d3496a21d44920d34920d4496a21d54920d44920d5496a21d64920" - "d54920d6496a21d74920d64920d7496a21d84920d74920d8496a21d94920d84920d9496a21da4920d94920da496a21" - "db4920da4920db496a21dc4920db4920dc496a21dd4920dc4920dd496a21de4920dd4920de496a21df4920de4920df" - "496a21e04920df4920e0496a21e14920e04920e1496a21e24920e14920e2496a21e34920e24920e3496a21e44920e3" - "4920e4496a21e54920e44920e5496a21e64920e54920e6496a21e74920e64920e7496a21e84920e74920e8496a21e9" - "4920e84920e9496a21ea4920e94920ea496a21eb4920ea4920eb496a21ec4920eb4920ec496a21ed4920ec4920ed49" - "6a21ee4920ed4920ee496a21ef4920ee4920ef496a21f04920ef4920f0496a21f14920f04920f1496a21f24920f149" - "20f2496a21f34920f24920f3496a21f44920f34920f4496a21f54920f44920f5496a21f64920f54920f6496a21f749" - "20f64920f7496a21f84920f74920f8496a21f94920f84920f9496a21fa4920f94920fa496a21fb4920fa4920fb496a" - "21fc4920fb4920fc496a21fd4920fc4920fd496a21fe4920fd4920fe496a21ff4920fe4920ff496a21804a20ff4920" - "804a6a21814a20804a20814a6a21824a20814a20824a6a21834a20824a20834a6a21844a20834a20844a6a21854a20" - "844a20854a6a21864a20854a20864a6a21874a20864a20874a6a21884a20874a20884a6a21894a20884a20894a6a21" - "8a4a20894a208a4a6a218b4a208a4a208b4a6a218c4a208b4a208c4a6a218d4a208c4a208d4a6a218e4a208d4a208e" - "4a6a218f4a208e4a208f4a6a21904a208f4a20904a6a21914a20904a20914a6a21924a20914a20924a6a21934a2092" - "4a20934a6a21944a20934a20944a6a21954a20944a20954a6a21964a20954a20964a6a21974a20964a20974a6a2198" - "4a20974a20984a6a21994a20984a20994a6a219a4a20994a209a4a6a219b4a209a4a209b4a6a219c4a209b4a209c4a" - "6a219d4a209c4a209d4a6a219e4a209d4a209e4a6a219f4a209e4a209f4a6a21a04a209f4a20a04a6a21a14a20a04a" - "20a14a6a21a24a20a14a20a24a6a21a34a20a24a20a34a6a21a44a20a34a20a44a6a21a54a20a44a20a54a6a21a64a" - "20a54a20a64a6a21a74a20a64a20a74a6a21a84a20a74a20a84a6a21a94a20a84a20a94a6a21aa4a20a94a20aa4a6a" - "21ab4a20aa4a20ab4a6a21ac4a20ab4a20ac4a6a21ad4a20ac4a20ad4a6a21ae4a20ad4a20ae4a6a21af4a20ae4a20" - "af4a6a21b04a20af4a20b04a6a21b14a20b04a20b14a6a21b24a20b14a20b24a6a21b34a20b24a20b34a6a21b44a20" - "b34a20b44a6a21b54a20b44a20b54a6a21b64a20b54a20b64a6a21b74a20b64a20b74a6a21b84a20b74a20b84a6a21" - "b94a20b84a20b94a6a21ba4a20b94a20ba4a6a21bb4a20ba4a20bb4a6a21bc4a20bb4a20bc4a6a21bd4a20bc4a20bd" - "4a6a21be4a20bd4a20be4a6a21bf4a20be4a20bf4a6a21c04a20bf4a20c04a6a21c14a20c04a20c14a6a21c24a20c1" - "4a20c24a6a21c34a20c24a20c34a6a21c44a20c34a20c44a6a21c54a20c44a20c54a6a21c64a20c54a20c64a6a21c7" - "4a20c64a20c74a6a21c84a20c74a20c84a6a21c94a20c84a20c94a6a21ca4a20c94a20ca4a6a21cb4a20ca4a20cb4a" - "6a21cc4a20cb4a20cc4a6a21cd4a20cc4a20cd4a6a21ce4a20cd4a20ce4a6a21cf4a20ce4a20cf4a6a21d04a20cf4a" - "20d04a6a21d14a20d04a20d14a6a21d24a20d14a20d24a6a21d34a20d24a20d34a6a21d44a20d34a20d44a6a21d54a" - "20d44a20d54a6a21d64a20d54a20d64a6a21d74a20d64a20d74a6a21d84a20d74a20d84a6a21d94a20d84a20d94a6a" - "21da4a20d94a20da4a6a21db4a20da4a20db4a6a21dc4a20db4a20dc4a6a21dd4a20dc4a20dd4a6a21de4a20dd4a20" - "de4a6a21df4a20de4a20df4a6a21e04a20df4a20e04a6a21e14a20e04a20e14a6a21e24a20e14a20e24a6a21e34a20" - "e24a20e34a6a21e44a20e34a20e44a6a21e54a20e44a20e54a6a21e64a20e54a20e64a6a21e74a20e64a20e74a6a21" - "e84a20e74a20e84a6a21e94a20e84a20e94a6a21ea4a20e94a20ea4a6a21eb4a20ea4a20eb4a6a21ec4a20eb4a20ec" - "4a6a21ed4a20ec4a20ed4a6a21ee4a20ed4a20ee4a6a21ef4a20ee4a20ef4a6a21f04a20ef4a20f04a6a21f14a20f0" - "4a20f14a6a21f24a20f14a20f24a6a21f34a20f24a20f34a6a21f44a20f34a20f44a6a21f54a20f44a20f54a6a21f6" - "4a20f54a20f64a6a21f74a20f64a20f74a6a21f84a20f74a20f84a6a21f94a20f84a20f94a6a21fa4a20f94a20fa4a" - "6a21fb4a20fa4a20fb4a6a21fc4a20fb4a20fc4a6a21fd4a20fc4a20fd4a6a21fe4a20fd4a20fe4a6a21ff4a20fe4a" - "20ff4a6a21804b20ff4a20804b6a21814b20804b20814b6a21824b20814b20824b6a21834b20824b20834b6a21844b" - "20834b20844b6a21854b20844b20854b6a21864b20854b20864b6a21874b20864b20874b6a21884b20874b20884b6a" - "21894b20884b20894b6a218a4b20894b208a4b6a218b4b208a4b208b4b6a218c4b208b4b208c4b6a218d4b208c4b20" - "8d4b6a218e4b208d4b208e4b6a218f4b208e4b208f4b6a21904b208f4b20904b6a21914b20904b20914b6a21924b20" - "914b20924b6a21934b20924b20934b6a21944b20934b20944b6a21954b20944b20954b6a21964b20954b20964b6a21" - "974b20964b20974b6a21984b20974b20984b6a21994b20984b20994b6a219a4b20994b209a4b6a219b4b209a4b209b" - "4b6a219c4b209b4b209c4b6a219d4b209c4b209d4b6a219e4b209d4b209e4b6a219f4b209e4b209f4b6a21a04b209f" - "4b20a04b6a21a14b20a04b20a14b6a21a24b20a14b20a24b6a21a34b20a24b20a34b6a21a44b20a34b20a44b6a21a5" - "4b20a44b20a54b6a21a64b20a54b20a64b6a21a74b20a64b20a74b6a21a84b20a74b20a84b6a21a94b20a84b20a94b" - "6a21aa4b20a94b20aa4b6a21ab4b20aa4b20ab4b6a21ac4b20ab4b20ac4b6a21ad4b20ac4b20ad4b6a21ae4b20ad4b" - "20ae4b6a21af4b20ae4b20af4b6a21b04b20af4b20b04b6a21b14b20b04b20b14b6a21b24b20b14b20b24b6a21b34b" - "20b24b20b34b6a21b44b20b34b20b44b6a21b54b20b44b20b54b6a21b64b20b54b20b64b6a21b74b20b64b20b74b6a" - "21b84b20b74b20b84b6a21b94b20b84b20b94b6a21ba4b20b94b20ba4b6a21bb4b20ba4b20bb4b6a21bc4b20bb4b20" - "bc4b6a21bd4b20bc4b20bd4b6a21be4b20bd4b20be4b6a21bf4b20be4b20bf4b6a21c04b20bf4b20c04b6a21c14b20" - "c04b20c14b6a21c24b20c14b20c24b6a21c34b20c24b20c34b6a21c44b20c34b20c44b6a21c54b20c44b20c54b6a21" - "c64b20c54b20c64b6a21c74b20c64b20c74b6a21c84b20c74b20c84b6a21c94b20c84b20c94b6a21ca4b20c94b20ca" - "4b6a21cb4b20ca4b20cb4b6a21cc4b20cb4b20cc4b6a21cd4b20cc4b20cd4b6a21ce4b20cd4b20ce4b6a21cf4b20ce" - "4b20cf4b6a21d04b20cf4b20d04b6a21d14b20d04b20d14b6a21d24b20d14b20d24b6a21d34b20d24b20d34b6a21d4" - "4b20d34b20d44b6a21d54b20d44b20d54b6a21d64b20d54b20d64b6a21d74b20d64b20d74b6a21d84b20d74b20d84b" - "6a21d94b20d84b20d94b6a21da4b20d94b20da4b6a21db4b20da4b20db4b6a21dc4b20db4b20dc4b6a21dd4b20dc4b" - "20dd4b6a21de4b20dd4b20de4b6a21df4b20de4b20df4b6a21e04b20df4b20e04b6a21e14b20e04b20e14b6a21e24b" - "20e14b20e24b6a21e34b20e24b20e34b6a21e44b20e34b20e44b6a21e54b20e44b20e54b6a21e64b20e54b20e64b6a" - "21e74b20e64b20e74b6a21e84b20e74b20e84b6a21e94b20e84b20e94b6a21ea4b20e94b20ea4b6a21eb4b20ea4b20" - "eb4b6a21ec4b20eb4b20ec4b6a21ed4b20ec4b20ed4b6a21ee4b20ed4b20ee4b6a21ef4b20ee4b20ef4b6a21f04b20" - "ef4b20f04b6a21f14b20f04b20f14b6a21f24b20f14b20f24b6a21f34b20f24b20f34b6a21f44b20f34b20f44b6a21" - "f54b20f44b20f54b6a21f64b20f54b20f64b6a21f74b20f64b20f74b6a21f84b20f74b20f84b6a21f94b20f84b20f9" - "4b6a21fa4b20f94b20fa4b6a21fb4b20fa4b20fb4b6a21fc4b20fb4b20fc4b6a21fd4b20fc4b20fd4b6a21fe4b20fd" - "4b20fe4b6a21ff4b20fe4b20ff4b6a21804c20ff4b20804c6a21814c20804c20814c6a21824c20814c20824c6a2183" - "4c20824c20834c6a21844c20834c20844c6a21854c20844c20854c6a21864c20854c20864c6a21874c20864c20874c" - "6a21884c20874c20884c6a21894c20884c20894c6a218a4c20894c208a4c6a218b4c208a4c208b4c6a218c4c208b4c" - "208c4c6a218d4c208c4c208d4c6a218e4c208d4c208e4c6a218f4c208e4c208f4c6a21904c208f4c20904c6a21914c" - "20904c20914c6a21924c20914c20924c6a21934c20924c20934c6a21944c20934c20944c6a21954c20944c20954c6a" - "21964c20954c20964c6a21974c20964c20974c6a21984c20974c20984c6a21994c20984c20994c6a219a4c20994c20" - "9a4c6a219b4c209a4c209b4c6a219c4c209b4c209c4c6a219d4c209c4c209d4c6a219e4c209d4c209e4c6a219f4c20" - "9e4c209f4c6a21a04c209f4c20a04c6a21a14c20a04c20a14c6a21a24c20a14c20a24c6a21a34c20a24c20a34c6a21" - "a44c20a34c20a44c6a21a54c20a44c20a54c6a21a64c20a54c20a64c6a21a74c20a64c20a74c6a21a84c20a74c20a8" - "4c6a21a94c20a84c20a94c6a21aa4c20a94c20aa4c6a21ab4c20aa4c20ab4c6a21ac4c20ab4c20ac4c6a21ad4c20ac" - "4c20ad4c6a21ae4c20ad4c20ae4c6a21af4c20ae4c20af4c6a21b04c20af4c20b04c6a21b14c20b04c20b14c6a21b2" - "4c20b14c20b24c6a21b34c20b24c20b34c6a21b44c20b34c20b44c6a21b54c20b44c20b54c6a21b64c20b54c20b64c" - "6a21b74c20b64c20b74c6a21b84c20b74c20b84c6a21b94c20b84c20b94c6a21ba4c20b94c20ba4c6a21bb4c20ba4c" - "20bb4c6a21bc4c20bb4c20bc4c6a21bd4c20bc4c20bd4c6a21be4c20bd4c20be4c6a21bf4c20be4c20bf4c6a21c04c" - "20bf4c20c04c6a21c14c20c04c20c14c6a21c24c20c14c20c24c6a21c34c20c24c20c34c6a21c44c20c34c20c44c6a" - "21c54c20c44c20c54c6a21c64c20c54c20c64c6a21c74c20c64c20c74c6a21c84c20c74c20c84c6a21c94c20c84c20" - "c94c6a21ca4c20c94c20ca4c6a21cb4c20ca4c20cb4c6a21cc4c20cb4c20cc4c6a21cd4c20cc4c20cd4c6a21ce4c20" - "cd4c20ce4c6a21cf4c20ce4c20cf4c6a21d04c20cf4c20d04c6a21d14c20d04c20d14c6a21d24c20d14c20d24c6a21" - "d34c20d24c20d34c6a21d44c20d34c20d44c6a21d54c20d44c20d54c6a21d64c20d54c20d64c6a21d74c20d64c20d7" - "4c6a21d84c20d74c20d84c6a21d94c20d84c20d94c6a21da4c20d94c20da4c6a21db4c20da4c20db4c6a21dc4c20db" - "4c20dc4c6a21dd4c20dc4c20dd4c6a21de4c20dd4c20de4c6a21df4c20de4c20df4c6a21e04c20df4c20e04c6a21e1" - "4c20e04c20e14c6a21e24c20e14c20e24c6a21e34c20e24c20e34c6a21e44c20e34c20e44c6a21e54c20e44c20e54c" - "6a21e64c20e54c20e64c6a21e74c20e64c20e74c6a21e84c20e74c20e84c6a21e94c20e84c20e94c6a21ea4c20e94c" - "20ea4c6a21eb4c20ea4c20eb4c6a21ec4c20eb4c20ec4c6a21ed4c20ec4c20ed4c6a21ee4c20ed4c20ee4c6a21ef4c" - "20ee4c20ef4c6a21f04c20ef4c20f04c6a21f14c20f04c20f14c6a21f24c20f14c20f24c6a21f34c20f24c20f34c6a" - "21f44c20f34c20f44c6a21f54c20f44c20f54c6a21f64c20f54c20f64c6a21f74c20f64c20f74c6a21f84c20f74c20" - "f84c6a21f94c20f84c20f94c6a21fa4c20f94c20fa4c6a21fb4c20fa4c20fb4c6a21fc4c20fb4c20fc4c6a21fd4c20" - "fc4c20fd4c6a21fe4c20fd4c20fe4c6a21ff4c20fe4c20ff4c6a21804d20ff4c20804d6a21814d20804d20814d6a21" - "824d20814d20824d6a21834d20824d20834d6a21844d20834d20844d6a21854d20844d20854d6a21864d20854d2086" - "4d6a21874d20864d20874d6a21884d20874d20884d6a21894d20884d20894d6a218a4d20894d208a4d6a218b4d208a" - "4d208b4d6a218c4d208b4d208c4d6a218d4d208c4d208d4d6a218e4d208d4d208e4d6a218f4d208e4d208f4d6a2190" - "4d208f4d20904d6a21914d20904d20914d6a21924d20914d20924d6a21934d20924d20934d6a21944d20934d20944d" - "6a21954d20944d20954d6a21964d20954d20964d6a21974d20964d20974d6a21984d20974d20984d6a21994d20984d" - "20994d6a219a4d20994d209a4d6a219b4d209a4d209b4d6a219c4d209b4d209c4d6a219d4d209c4d209d4d6a219e4d" - "209d4d209e4d6a219f4d209e4d209f4d6a21a04d209f4d20a04d6a21a14d20a04d20a14d6a21a24d20a14d20a24d6a" - "21a34d20a24d20a34d6a21a44d20a34d20a44d6a21a54d20a44d20a54d6a21a64d20a54d20a64d6a21a74d20a64d20" - "a74d6a21a84d20a74d20a84d6a21a94d20a84d20a94d6a21aa4d20a94d20aa4d6a21ab4d20aa4d20ab4d6a21ac4d20" - "ab4d20ac4d6a21ad4d20ac4d20ad4d6a21ae4d20ad4d20ae4d6a21af4d20ae4d20af4d6a21b04d20af4d20b04d6a21" - "b14d20b04d20b14d6a21b24d20b14d20b24d6a21b34d20b24d20b34d6a21b44d20b34d20b44d6a21b54d20b44d20b5" - "4d6a21b64d20b54d20b64d6a21b74d20b64d20b74d6a21b84d20b74d20b84d6a21b94d20b84d20b94d6a21ba4d20b9" - "4d20ba4d6a21bb4d20ba4d20bb4d6a21bc4d20bb4d20bc4d6a21bd4d20bc4d20bd4d6a21be4d20bd4d20be4d6a21bf" - "4d20be4d20bf4d6a21c04d20bf4d20c04d6a21c14d20c04d20c14d6a21c24d20c14d20c24d6a21c34d20c24d20c34d" - "6a21c44d20c34d20c44d6a21c54d20c44d20c54d6a21c64d20c54d20c64d6a21c74d20c64d20c74d6a21c84d20c74d" - "20c84d6a21c94d20c84d20c94d6a21ca4d20c94d20ca4d6a21cb4d20ca4d20cb4d6a21cc4d20cb4d20cc4d6a21cd4d" - "20cc4d20cd4d6a21ce4d20cd4d20ce4d6a21cf4d20ce4d20cf4d6a21d04d20cf4d20d04d6a21d14d20d04d20d14d6a" - "21d24d20d14d20d24d6a21d34d20d24d20d34d6a21d44d20d34d20d44d6a21d54d20d44d20d54d6a21d64d20d54d20" - "d64d6a21d74d20d64d20d74d6a21d84d20d74d20d84d6a21d94d20d84d20d94d6a21da4d20d94d20da4d6a21db4d20" - "da4d20db4d6a21dc4d20db4d20dc4d6a21dd4d20dc4d20dd4d6a21de4d20dd4d20de4d6a21df4d20de4d20df4d6a21" - "e04d20df4d20e04d6a21e14d20e04d20e14d6a21e24d20e14d20e24d6a21e34d20e24d20e34d6a21e44d20e34d20e4" - "4d6a21e54d20e44d20e54d6a21e64d20e54d20e64d6a21e74d20e64d20e74d6a21e84d20e74d20e84d6a21e94d20e8" - "4d20e94d6a21ea4d20e94d20ea4d6a21eb4d20ea4d20eb4d6a21ec4d20eb4d20ec4d6a21ed4d20ec4d20ed4d6a21ee" - "4d20ed4d20ee4d6a21ef4d20ee4d20ef4d6a21f04d20ef4d20f04d6a21f14d20f04d20f14d6a21f24d20f14d20f24d" - "6a21f34d20f24d20f34d6a21f44d20f34d20f44d6a21f54d20f44d20f54d6a21f64d20f54d20f64d6a21f74d20f64d" - "20f74d6a21f84d20f74d20f84d6a21f94d20f84d20f94d6a21fa4d20f94d20fa4d6a21fb4d20fa4d20fb4d6a21fc4d" - "20fb4d20fc4d6a21fd4d20fc4d20fd4d6a21fe4d20fd4d20fe4d6a21ff4d20fe4d20ff4d6a21804e20ff4d20804e6a" - "21814e20804e20814e6a21824e20814e20824e6a21834e20824e20834e6a21844e20834e20844e6a21854e20844e20" - "854e6a21864e20854e20864e6a21874e20864e20874e6a21884e20874e20884e6a21894e20884e20894e6a218a4e20" - "894e208a4e6a218b4e208a4e208b4e6a218c4e208b4e208c4e6a218d4e208c4e208d4e6a218e4e208d4e208e4e6a21" - "8f4e208f4e0b"; - -extern std::string const functions5kHex = - "0061736d0100000001070160027f7f017f038a27882700000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" - "0000000000000000000000000000000000000000000000000000000000000000000000000000000007e2d303882708" - "7465737430303030000008746573743030303100010874657374303030320002087465737430303033000308746573" - "7430303034000408746573743030303500050874657374303030360006087465737430303037000708746573743030" - "303800080874657374303030390009087465737430303130000a087465737430303131000b08746573743030313200" - "0c087465737430303133000d087465737430303134000e087465737430303135000f08746573743030313600100874" - "6573743030313700110874657374303031380012087465737430303139001308746573743030323000140874657374" - "3030323100150874657374303032320016087465737430303233001708746573743030323400180874657374303032" - "350019087465737430303236001a087465737430303237001b087465737430303238001c087465737430303239001d" - "087465737430303330001e087465737430303331001f08746573743030333200200874657374303033330021087465" - "7374303033340022087465737430303335002308746573743030333600240874657374303033370025087465737430" - "3033380026087465737430303339002708746573743030343000280874657374303034310029087465737430303432" - "002a087465737430303433002b087465737430303434002c087465737430303435002d087465737430303436002e08" - "7465737430303437002f08746573743030343800300874657374303034390031087465737430303530003208746573" - "7430303531003308746573743030353200340874657374303035330035087465737430303534003608746573743030" - "3535003708746573743030353600380874657374303035370039087465737430303538003a08746573743030353900" - "3b087465737430303630003c087465737430303631003d087465737430303632003e087465737430303633003f0874" - "6573743030363400400874657374303036350041087465737430303636004208746573743030363700430874657374" - "3030363800440874657374303036390045087465737430303730004608746573743030373100470874657374303037" - "3200480874657374303037330049087465737430303734004a087465737430303735004b087465737430303736004c" - "087465737430303737004d087465737430303738004e087465737430303739004f0874657374303038300050087465" - "7374303038310051087465737430303832005208746573743030383300530874657374303038340054087465737430" - "3038350055087465737430303836005608746573743030383700570874657374303038380058087465737430303839" - "0059087465737430303930005a087465737430303931005b087465737430303932005c087465737430303933005d08" - "7465737430303934005e087465737430303935005f0874657374303039360060087465737430303937006108746573" - "7430303938006208746573743030393900630874657374303130300064087465737430313031006508746573743031" - "3032006608746573743031303300670874657374303130340068087465737430313035006908746573743031303600" - "6a087465737430313037006b087465737430313038006c087465737430313039006d087465737430313130006e0874" - "65737430313131006f0874657374303131320070087465737430313133007108746573743031313400720874657374" - "3031313500730874657374303131360074087465737430313137007508746573743031313800760874657374303131" - "39007708746573743031323000780874657374303132310079087465737430313232007a087465737430313233007b" - "087465737430313234007c087465737430313235007d087465737430313236007e087465737430313237007f087465" - "7374303132380080010874657374303132390081010874657374303133300082010874657374303133310083010874" - "6573743031333200840108746573743031333300850108746573743031333400860108746573743031333500870108" - "7465737430313336008801087465737430313337008901087465737430313338008a01087465737430313339008b01" - "087465737430313430008c01087465737430313431008d01087465737430313432008e01087465737430313433008f" - "0108746573743031343400900108746573743031343500910108746573743031343600920108746573743031343700" - "9301087465737430313438009401087465737430313439009501087465737430313530009601087465737430313531" - "009701087465737430313532009801087465737430313533009901087465737430313534009a010874657374303135" - "35009b01087465737430313536009c01087465737430313537009d01087465737430313538009e0108746573743031" - "3539009f0108746573743031363000a00108746573743031363100a10108746573743031363200a201087465737430" - "31363300a30108746573743031363400a40108746573743031363500a50108746573743031363600a6010874657374" - "3031363700a70108746573743031363800a80108746573743031363900a90108746573743031373000aa0108746573" - "743031373100ab0108746573743031373200ac0108746573743031373300ad0108746573743031373400ae01087465" - "73743031373500af0108746573743031373600b00108746573743031373700b10108746573743031373800b2010874" - "6573743031373900b30108746573743031383000b40108746573743031383100b50108746573743031383200b60108" - "746573743031383300b70108746573743031383400b80108746573743031383500b90108746573743031383600ba01" - "08746573743031383700bb0108746573743031383800bc0108746573743031383900bd0108746573743031393000be" - "0108746573743031393100bf0108746573743031393200c00108746573743031393300c10108746573743031393400" - "c20108746573743031393500c30108746573743031393600c40108746573743031393700c501087465737430313938" - "00c60108746573743031393900c70108746573743032303000c80108746573743032303100c9010874657374303230" - "3200ca0108746573743032303300cb0108746573743032303400cc0108746573743032303500cd0108746573743032" - "303600ce0108746573743032303700cf0108746573743032303800d00108746573743032303900d101087465737430" - "32313000d20108746573743032313100d30108746573743032313200d40108746573743032313300d5010874657374" - "3032313400d60108746573743032313500d70108746573743032313600d80108746573743032313700d90108746573" - "743032313800da0108746573743032313900db0108746573743032323000dc0108746573743032323100dd01087465" - "73743032323200de0108746573743032323300df0108746573743032323400e00108746573743032323500e1010874" - "6573743032323600e20108746573743032323700e30108746573743032323800e40108746573743032323900e50108" - "746573743032333000e60108746573743032333100e70108746573743032333200e80108746573743032333300e901" - "08746573743032333400ea0108746573743032333500eb0108746573743032333600ec0108746573743032333700ed" - "0108746573743032333800ee0108746573743032333900ef0108746573743032343000f00108746573743032343100" - "f10108746573743032343200f20108746573743032343300f30108746573743032343400f401087465737430323435" - "00f50108746573743032343600f60108746573743032343700f70108746573743032343800f8010874657374303234" - "3900f90108746573743032353000fa0108746573743032353100fb0108746573743032353200fc0108746573743032" - "353300fd0108746573743032353400fe0108746573743032353500ff01087465737430323536008002087465737430" - "3235370081020874657374303235380082020874657374303235390083020874657374303236300084020874657374" - "3032363100850208746573743032363200860208746573743032363300870208746573743032363400880208746573" - "7430323635008902087465737430323636008a02087465737430323637008b02087465737430323638008c02087465" - "737430323639008d02087465737430323730008e02087465737430323731008f020874657374303237320090020874" - "6573743032373300910208746573743032373400920208746573743032373500930208746573743032373600940208" - "7465737430323737009502087465737430323738009602087465737430323739009702087465737430323830009802" - "087465737430323831009902087465737430323832009a02087465737430323833009b02087465737430323834009c" - "02087465737430323835009d02087465737430323836009e02087465737430323837009f0208746573743032383800" - "a00208746573743032383900a10208746573743032393000a20208746573743032393100a302087465737430323932" - "00a40208746573743032393300a50208746573743032393400a60208746573743032393500a7020874657374303239" - "3600a80208746573743032393700a90208746573743032393800aa0208746573743032393900ab0208746573743033" - "303000ac0208746573743033303100ad0208746573743033303200ae0208746573743033303300af02087465737430" - "33303400b00208746573743033303500b10208746573743033303600b20208746573743033303700b3020874657374" - "3033303800b40208746573743033303900b50208746573743033313000b60208746573743033313100b70208746573" - "743033313200b80208746573743033313300b90208746573743033313400ba0208746573743033313500bb02087465" - "73743033313600bc0208746573743033313700bd0208746573743033313800be0208746573743033313900bf020874" - "6573743033323000c00208746573743033323100c10208746573743033323200c20208746573743033323300c30208" - "746573743033323400c40208746573743033323500c50208746573743033323600c60208746573743033323700c702" - "08746573743033323800c80208746573743033323900c90208746573743033333000ca0208746573743033333100cb" - "0208746573743033333200cc0208746573743033333300cd0208746573743033333400ce0208746573743033333500" - "cf0208746573743033333600d00208746573743033333700d10208746573743033333800d202087465737430333339" - "00d30208746573743033343000d40208746573743033343100d50208746573743033343200d6020874657374303334" - "3300d70208746573743033343400d80208746573743033343500d90208746573743033343600da0208746573743033" - "343700db0208746573743033343800dc0208746573743033343900dd0208746573743033353000de02087465737430" - "33353100df0208746573743033353200e00208746573743033353300e10208746573743033353400e2020874657374" - "3033353500e30208746573743033353600e40208746573743033353700e50208746573743033353800e60208746573" - "743033353900e70208746573743033363000e80208746573743033363100e90208746573743033363200ea02087465" - "73743033363300eb0208746573743033363400ec0208746573743033363500ed0208746573743033363600ee020874" - "6573743033363700ef0208746573743033363800f00208746573743033363900f10208746573743033373000f20208" - "746573743033373100f30208746573743033373200f40208746573743033373300f50208746573743033373400f602" - "08746573743033373500f70208746573743033373600f80208746573743033373700f90208746573743033373800fa" - "0208746573743033373900fb0208746573743033383000fc0208746573743033383100fd0208746573743033383200" - "fe0208746573743033383300ff02087465737430333834008003087465737430333835008103087465737430333836" - "0082030874657374303338370083030874657374303338380084030874657374303338390085030874657374303339" - "3000860308746573743033393100870308746573743033393200880308746573743033393300890308746573743033" - "3934008a03087465737430333935008b03087465737430333936008c03087465737430333937008d03087465737430" - "333938008e03087465737430333939008f030874657374303430300090030874657374303430310091030874657374" - "3034303200920308746573743034303300930308746573743034303400940308746573743034303500950308746573" - "7430343036009603087465737430343037009703087465737430343038009803087465737430343039009903087465" - "737430343130009a03087465737430343131009b03087465737430343132009c03087465737430343133009d030874" - "65737430343134009e03087465737430343135009f0308746573743034313600a00308746573743034313700a10308" - "746573743034313800a20308746573743034313900a30308746573743034323000a40308746573743034323100a503" - "08746573743034323200a60308746573743034323300a70308746573743034323400a80308746573743034323500a9" - "0308746573743034323600aa0308746573743034323700ab0308746573743034323800ac0308746573743034323900" - "ad0308746573743034333000ae0308746573743034333100af0308746573743034333200b003087465737430343333" - "00b10308746573743034333400b20308746573743034333500b30308746573743034333600b4030874657374303433" - "3700b50308746573743034333800b60308746573743034333900b70308746573743034343000b80308746573743034" - "343100b90308746573743034343200ba0308746573743034343300bb0308746573743034343400bc03087465737430" - "34343500bd0308746573743034343600be0308746573743034343700bf0308746573743034343800c0030874657374" - "3034343900c10308746573743034353000c20308746573743034353100c30308746573743034353200c40308746573" - "743034353300c50308746573743034353400c60308746573743034353500c70308746573743034353600c803087465" - "73743034353700c90308746573743034353800ca0308746573743034353900cb0308746573743034363000cc030874" - "6573743034363100cd0308746573743034363200ce0308746573743034363300cf0308746573743034363400d00308" - "746573743034363500d10308746573743034363600d20308746573743034363700d30308746573743034363800d403" - "08746573743034363900d50308746573743034373000d60308746573743034373100d70308746573743034373200d8" - "0308746573743034373300d90308746573743034373400da0308746573743034373500db0308746573743034373600" - "dc0308746573743034373700dd0308746573743034373800de0308746573743034373900df03087465737430343830" - "00e00308746573743034383100e10308746573743034383200e20308746573743034383300e3030874657374303438" - "3400e40308746573743034383500e50308746573743034383600e60308746573743034383700e70308746573743034" - "383800e80308746573743034383900e90308746573743034393000ea0308746573743034393100eb03087465737430" - "34393200ec0308746573743034393300ed0308746573743034393400ee0308746573743034393500ef030874657374" - "3034393600f00308746573743034393700f10308746573743034393800f20308746573743034393900f30308746573" - "743035303000f40308746573743035303100f50308746573743035303200f60308746573743035303300f703087465" - "73743035303400f80308746573743035303500f90308746573743035303600fa0308746573743035303700fb030874" - "6573743035303800fc0308746573743035303900fd0308746573743035313000fe0308746573743035313100ff0308" - "7465737430353132008004087465737430353133008104087465737430353134008204087465737430353135008304" - "0874657374303531360084040874657374303531370085040874657374303531380086040874657374303531390087" - "04087465737430353230008804087465737430353231008904087465737430353232008a0408746573743035323300" - "8b04087465737430353234008c04087465737430353235008d04087465737430353236008e04087465737430353237" - "008f040874657374303532380090040874657374303532390091040874657374303533300092040874657374303533" - "3100930408746573743035333200940408746573743035333300950408746573743035333400960408746573743035" - "3335009704087465737430353336009804087465737430353337009904087465737430353338009a04087465737430" - "353339009b04087465737430353430009c04087465737430353431009d04087465737430353432009e040874657374" - "30353433009f0408746573743035343400a00408746573743035343500a10408746573743035343600a20408746573" - "743035343700a30408746573743035343800a40408746573743035343900a50408746573743035353000a604087465" - "73743035353100a70408746573743035353200a80408746573743035353300a90408746573743035353400aa040874" - "6573743035353500ab0408746573743035353600ac0408746573743035353700ad0408746573743035353800ae0408" - "746573743035353900af0408746573743035363000b00408746573743035363100b10408746573743035363200b204" - "08746573743035363300b30408746573743035363400b40408746573743035363500b50408746573743035363600b6" - "0408746573743035363700b70408746573743035363800b80408746573743035363900b90408746573743035373000" - "ba0408746573743035373100bb0408746573743035373200bc0408746573743035373300bd04087465737430353734" - "00be0408746573743035373500bf0408746573743035373600c00408746573743035373700c1040874657374303537" - "3800c20408746573743035373900c30408746573743035383000c40408746573743035383100c50408746573743035" - "383200c60408746573743035383300c70408746573743035383400c80408746573743035383500c904087465737430" - "35383600ca0408746573743035383700cb0408746573743035383800cc0408746573743035383900cd040874657374" - "3035393000ce0408746573743035393100cf0408746573743035393200d00408746573743035393300d10408746573" - "743035393400d20408746573743035393500d30408746573743035393600d40408746573743035393700d504087465" - "73743035393800d60408746573743035393900d70408746573743036303000d80408746573743036303100d9040874" - "6573743036303200da0408746573743036303300db0408746573743036303400dc0408746573743036303500dd0408" - "746573743036303600de0408746573743036303700df0408746573743036303800e00408746573743036303900e104" - "08746573743036313000e20408746573743036313100e30408746573743036313200e40408746573743036313300e5" - "0408746573743036313400e60408746573743036313500e70408746573743036313600e80408746573743036313700" - "e90408746573743036313800ea0408746573743036313900eb0408746573743036323000ec04087465737430363231" - "00ed0408746573743036323200ee0408746573743036323300ef0408746573743036323400f0040874657374303632" - "3500f10408746573743036323600f20408746573743036323700f30408746573743036323800f40408746573743036" - "323900f50408746573743036333000f60408746573743036333100f70408746573743036333200f804087465737430" - "36333300f90408746573743036333400fa0408746573743036333500fb0408746573743036333600fc040874657374" - "3036333700fd0408746573743036333800fe0408746573743036333900ff0408746573743036343000800508746573" - "7430363431008105087465737430363432008205087465737430363433008305087465737430363434008405087465" - "7374303634350085050874657374303634360086050874657374303634370087050874657374303634380088050874" - "65737430363439008905087465737430363530008a05087465737430363531008b05087465737430363532008c0508" - "7465737430363533008d05087465737430363534008e05087465737430363535008f05087465737430363536009005" - "0874657374303635370091050874657374303635380092050874657374303635390093050874657374303636300094" - "0508746573743036363100950508746573743036363200960508746573743036363300970508746573743036363400" - "9805087465737430363635009905087465737430363636009a05087465737430363637009b05087465737430363638" - "009c05087465737430363639009d05087465737430363730009e05087465737430363731009f050874657374303637" - "3200a00508746573743036373300a10508746573743036373400a20508746573743036373500a30508746573743036" - "373600a40508746573743036373700a50508746573743036373800a60508746573743036373900a705087465737430" - "36383000a80508746573743036383100a90508746573743036383200aa0508746573743036383300ab050874657374" - "3036383400ac0508746573743036383500ad0508746573743036383600ae0508746573743036383700af0508746573" - "743036383800b00508746573743036383900b10508746573743036393000b20508746573743036393100b305087465" - "73743036393200b40508746573743036393300b50508746573743036393400b60508746573743036393500b7050874" - "6573743036393600b80508746573743036393700b90508746573743036393800ba0508746573743036393900bb0508" - "746573743037303000bc0508746573743037303100bd0508746573743037303200be0508746573743037303300bf05" - "08746573743037303400c00508746573743037303500c10508746573743037303600c20508746573743037303700c3" - "0508746573743037303800c40508746573743037303900c50508746573743037313000c60508746573743037313100" - "c70508746573743037313200c80508746573743037313300c90508746573743037313400ca05087465737430373135" - "00cb0508746573743037313600cc0508746573743037313700cd0508746573743037313800ce050874657374303731" - "3900cf0508746573743037323000d00508746573743037323100d10508746573743037323200d20508746573743037" - "323300d30508746573743037323400d40508746573743037323500d50508746573743037323600d605087465737430" - "37323700d70508746573743037323800d80508746573743037323900d90508746573743037333000da050874657374" - "3037333100db0508746573743037333200dc0508746573743037333300dd0508746573743037333400de0508746573" - "743037333500df0508746573743037333600e00508746573743037333700e10508746573743037333800e205087465" - "73743037333900e30508746573743037343000e40508746573743037343100e50508746573743037343200e6050874" - "6573743037343300e70508746573743037343400e80508746573743037343500e90508746573743037343600ea0508" - "746573743037343700eb0508746573743037343800ec0508746573743037343900ed0508746573743037353000ee05" - "08746573743037353100ef0508746573743037353200f00508746573743037353300f10508746573743037353400f2" - "0508746573743037353500f30508746573743037353600f40508746573743037353700f50508746573743037353800" - "f60508746573743037353900f70508746573743037363000f80508746573743037363100f905087465737430373632" - "00fa0508746573743037363300fb0508746573743037363400fc0508746573743037363500fd050874657374303736" - "3600fe0508746573743037363700ff0508746573743037363800800608746573743037363900810608746573743037" - "3730008206087465737430373731008306087465737430373732008406087465737430373733008506087465737430" - "3737340086060874657374303737350087060874657374303737360088060874657374303737370089060874657374" - "30373738008a06087465737430373739008b06087465737430373830008c06087465737430373831008d0608746573" - "7430373832008e06087465737430373833008f06087465737430373834009006087465737430373835009106087465" - "7374303738360092060874657374303738370093060874657374303738380094060874657374303738390095060874" - "6573743037393000960608746573743037393100970608746573743037393200980608746573743037393300990608" - "7465737430373934009a06087465737430373935009b06087465737430373936009c06087465737430373937009d06" - "087465737430373938009e06087465737430373939009f0608746573743038303000a00608746573743038303100a1" - "0608746573743038303200a20608746573743038303300a30608746573743038303400a40608746573743038303500" - "a50608746573743038303600a60608746573743038303700a70608746573743038303800a806087465737430383039" - "00a90608746573743038313000aa0608746573743038313100ab0608746573743038313200ac060874657374303831" - "3300ad0608746573743038313400ae0608746573743038313500af0608746573743038313600b00608746573743038" - "313700b10608746573743038313800b20608746573743038313900b30608746573743038323000b406087465737430" - "38323100b50608746573743038323200b60608746573743038323300b70608746573743038323400b8060874657374" - "3038323500b90608746573743038323600ba0608746573743038323700bb0608746573743038323800bc0608746573" - "743038323900bd0608746573743038333000be0608746573743038333100bf0608746573743038333200c006087465" - "73743038333300c10608746573743038333400c20608746573743038333500c30608746573743038333600c4060874" - "6573743038333700c50608746573743038333800c60608746573743038333900c70608746573743038343000c80608" - "746573743038343100c90608746573743038343200ca0608746573743038343300cb0608746573743038343400cc06" - "08746573743038343500cd0608746573743038343600ce0608746573743038343700cf0608746573743038343800d0" - "0608746573743038343900d10608746573743038353000d20608746573743038353100d30608746573743038353200" - "d40608746573743038353300d50608746573743038353400d60608746573743038353500d706087465737430383536" - "00d80608746573743038353700d90608746573743038353800da0608746573743038353900db060874657374303836" - "3000dc0608746573743038363100dd0608746573743038363200de0608746573743038363300df0608746573743038" - "363400e00608746573743038363500e10608746573743038363600e20608746573743038363700e306087465737430" - "38363800e40608746573743038363900e50608746573743038373000e60608746573743038373100e7060874657374" - "3038373200e80608746573743038373300e90608746573743038373400ea0608746573743038373500eb0608746573" - "743038373600ec0608746573743038373700ed0608746573743038373800ee0608746573743038373900ef06087465" - "73743038383000f00608746573743038383100f10608746573743038383200f20608746573743038383300f3060874" - "6573743038383400f40608746573743038383500f50608746573743038383600f60608746573743038383700f70608" - "746573743038383800f80608746573743038383900f90608746573743038393000fa0608746573743038393100fb06" - "08746573743038393200fc0608746573743038393300fd0608746573743038393400fe0608746573743038393500ff" - "0608746573743038393600800708746573743038393700810708746573743038393800820708746573743038393900" - "8307087465737430393030008407087465737430393031008507087465737430393032008607087465737430393033" - "008707087465737430393034008807087465737430393035008907087465737430393036008a070874657374303930" - "37008b07087465737430393038008c07087465737430393039008d07087465737430393130008e0708746573743039" - "3131008f07087465737430393132009007087465737430393133009107087465737430393134009207087465737430" - "3931350093070874657374303931360094070874657374303931370095070874657374303931380096070874657374" - "30393139009707087465737430393230009807087465737430393231009907087465737430393232009a0708746573" - "7430393233009b07087465737430393234009c07087465737430393235009d07087465737430393236009e07087465" - "737430393237009f0708746573743039323800a00708746573743039323900a10708746573743039333000a2070874" - "6573743039333100a30708746573743039333200a40708746573743039333300a50708746573743039333400a60708" - "746573743039333500a70708746573743039333600a80708746573743039333700a90708746573743039333800aa07" - "08746573743039333900ab0708746573743039343000ac0708746573743039343100ad0708746573743039343200ae" - "0708746573743039343300af0708746573743039343400b00708746573743039343500b10708746573743039343600" - "b20708746573743039343700b30708746573743039343800b40708746573743039343900b507087465737430393530" - "00b60708746573743039353100b70708746573743039353200b80708746573743039353300b9070874657374303935" - "3400ba0708746573743039353500bb0708746573743039353600bc0708746573743039353700bd0708746573743039" - "353800be0708746573743039353900bf0708746573743039363000c00708746573743039363100c107087465737430" - "39363200c20708746573743039363300c30708746573743039363400c40708746573743039363500c5070874657374" - "3039363600c60708746573743039363700c70708746573743039363800c80708746573743039363900c90708746573" - "743039373000ca0708746573743039373100cb0708746573743039373200cc0708746573743039373300cd07087465" - "73743039373400ce0708746573743039373500cf0708746573743039373600d00708746573743039373700d1070874" - "6573743039373800d20708746573743039373900d30708746573743039383000d40708746573743039383100d50708" - "746573743039383200d60708746573743039383300d70708746573743039383400d80708746573743039383500d907" - "08746573743039383600da0708746573743039383700db0708746573743039383800dc0708746573743039383900dd" - "0708746573743039393000de0708746573743039393100df0708746573743039393200e00708746573743039393300" - "e10708746573743039393400e20708746573743039393500e30708746573743039393600e407087465737430393937" - "00e50708746573743039393800e60708746573743039393900e70708746573743130303000e8070874657374313030" - "3100e90708746573743130303200ea0708746573743130303300eb0708746573743130303400ec0708746573743130" - "303500ed0708746573743130303600ee0708746573743130303700ef0708746573743130303800f007087465737431" - "30303900f10708746573743130313000f20708746573743130313100f30708746573743130313200f4070874657374" - "3130313300f50708746573743130313400f60708746573743130313500f70708746573743130313600f80708746573" - "743130313700f90708746573743130313800fa0708746573743130313900fb0708746573743130323000fc07087465" - "73743130323100fd0708746573743130323200fe0708746573743130323300ff070874657374313032340080080874" - "6573743130323500810808746573743130323600820808746573743130323700830808746573743130323800840808" - "7465737431303239008508087465737431303330008608087465737431303331008708087465737431303332008808" - "087465737431303333008908087465737431303334008a08087465737431303335008b08087465737431303336008c" - "08087465737431303337008d08087465737431303338008e08087465737431303339008f0808746573743130343000" - "9008087465737431303431009108087465737431303432009208087465737431303433009308087465737431303434" - "0094080874657374313034350095080874657374313034360096080874657374313034370097080874657374313034" - "38009808087465737431303439009908087465737431303530009a08087465737431303531009b0808746573743130" - "3532009c08087465737431303533009d08087465737431303534009e08087465737431303535009f08087465737431" - "30353600a00808746573743130353700a10808746573743130353800a20808746573743130353900a3080874657374" - "3130363000a40808746573743130363100a50808746573743130363200a60808746573743130363300a70808746573" - "743130363400a80808746573743130363500a90808746573743130363600aa0808746573743130363700ab08087465" - "73743130363800ac0808746573743130363900ad0808746573743130373000ae0808746573743130373100af080874" - "6573743130373200b00808746573743130373300b10808746573743130373400b20808746573743130373500b30808" - "746573743130373600b40808746573743130373700b50808746573743130373800b60808746573743130373900b708" - "08746573743130383000b80808746573743130383100b90808746573743130383200ba0808746573743130383300bb" - "0808746573743130383400bc0808746573743130383500bd0808746573743130383600be0808746573743130383700" - "bf0808746573743130383800c00808746573743130383900c10808746573743130393000c208087465737431303931" - "00c30808746573743130393200c40808746573743130393300c50808746573743130393400c6080874657374313039" - "3500c70808746573743130393600c80808746573743130393700c90808746573743130393800ca0808746573743130" - "393900cb0808746573743131303000cc0808746573743131303100cd0808746573743131303200ce08087465737431" - "31303300cf0808746573743131303400d00808746573743131303500d10808746573743131303600d2080874657374" - "3131303700d30808746573743131303800d40808746573743131303900d50808746573743131313000d60808746573" - "743131313100d70808746573743131313200d80808746573743131313300d90808746573743131313400da08087465" - "73743131313500db0808746573743131313600dc0808746573743131313700dd0808746573743131313800de080874" - "6573743131313900df0808746573743131323000e00808746573743131323100e10808746573743131323200e20808" - "746573743131323300e30808746573743131323400e40808746573743131323500e50808746573743131323600e608" - "08746573743131323700e70808746573743131323800e80808746573743131323900e90808746573743131333000ea" - "0808746573743131333100eb0808746573743131333200ec0808746573743131333300ed0808746573743131333400" - "ee0808746573743131333500ef0808746573743131333600f00808746573743131333700f108087465737431313338" - "00f20808746573743131333900f30808746573743131343000f40808746573743131343100f5080874657374313134" - "3200f60808746573743131343300f70808746573743131343400f80808746573743131343500f90808746573743131" - "343600fa0808746573743131343700fb0808746573743131343800fc0808746573743131343900fd08087465737431" - "31353000fe0808746573743131353100ff080874657374313135320080090874657374313135330081090874657374" - "3131353400820908746573743131353500830908746573743131353600840908746573743131353700850908746573" - "7431313538008609087465737431313539008709087465737431313630008809087465737431313631008909087465" - "737431313632008a09087465737431313633008b09087465737431313634008c09087465737431313635008d090874" - "65737431313636008e09087465737431313637008f0908746573743131363800900908746573743131363900910908" - "7465737431313730009209087465737431313731009309087465737431313732009409087465737431313733009509" - "0874657374313137340096090874657374313137350097090874657374313137360098090874657374313137370099" - "09087465737431313738009a09087465737431313739009b09087465737431313830009c0908746573743131383100" - "9d09087465737431313832009e09087465737431313833009f0908746573743131383400a009087465737431313835" - "00a10908746573743131383600a20908746573743131383700a30908746573743131383800a4090874657374313138" - "3900a50908746573743131393000a60908746573743131393100a70908746573743131393200a80908746573743131" - "393300a90908746573743131393400aa0908746573743131393500ab0908746573743131393600ac09087465737431" - "31393700ad0908746573743131393800ae0908746573743131393900af0908746573743132303000b0090874657374" - "3132303100b10908746573743132303200b20908746573743132303300b30908746573743132303400b40908746573" - "743132303500b50908746573743132303600b60908746573743132303700b70908746573743132303800b809087465" - "73743132303900b90908746573743132313000ba0908746573743132313100bb0908746573743132313200bc090874" - "6573743132313300bd0908746573743132313400be0908746573743132313500bf0908746573743132313600c00908" - "746573743132313700c10908746573743132313800c20908746573743132313900c30908746573743132323000c409" - "08746573743132323100c50908746573743132323200c60908746573743132323300c70908746573743132323400c8" - "0908746573743132323500c90908746573743132323600ca0908746573743132323700cb0908746573743132323800" - "cc0908746573743132323900cd0908746573743132333000ce0908746573743132333100cf09087465737431323332" - "00d00908746573743132333300d10908746573743132333400d20908746573743132333500d3090874657374313233" - "3600d40908746573743132333700d50908746573743132333800d60908746573743132333900d70908746573743132" - "343000d80908746573743132343100d90908746573743132343200da0908746573743132343300db09087465737431" - "32343400dc0908746573743132343500dd0908746573743132343600de0908746573743132343700df090874657374" - "3132343800e00908746573743132343900e10908746573743132353000e20908746573743132353100e30908746573" - "743132353200e40908746573743132353300e50908746573743132353400e60908746573743132353500e709087465" - "73743132353600e80908746573743132353700e90908746573743132353800ea0908746573743132353900eb090874" - "6573743132363000ec0908746573743132363100ed0908746573743132363200ee0908746573743132363300ef0908" - "746573743132363400f00908746573743132363500f10908746573743132363600f20908746573743132363700f309" - "08746573743132363800f40908746573743132363900f50908746573743132373000f60908746573743132373100f7" - "0908746573743132373200f80908746573743132373300f90908746573743132373400fa0908746573743132373500" - "fb0908746573743132373600fc0908746573743132373700fd0908746573743132373800fe09087465737431323739" - "00ff0908746573743132383000800a08746573743132383100810a08746573743132383200820a0874657374313238" - "3300830a08746573743132383400840a08746573743132383500850a08746573743132383600860a08746573743132" - "383700870a08746573743132383800880a08746573743132383900890a087465737431323930008a0a087465737431" - "323931008b0a087465737431323932008c0a087465737431323933008d0a087465737431323934008e0a0874657374" - "31323935008f0a08746573743132393600900a08746573743132393700910a08746573743132393800920a08746573" - "743132393900930a08746573743133303000940a08746573743133303100950a08746573743133303200960a087465" - "73743133303300970a08746573743133303400980a08746573743133303500990a087465737431333036009a0a0874" - "65737431333037009b0a087465737431333038009c0a087465737431333039009d0a087465737431333130009e0a08" - "7465737431333131009f0a08746573743133313200a00a08746573743133313300a10a08746573743133313400a20a" - "08746573743133313500a30a08746573743133313600a40a08746573743133313700a50a08746573743133313800a6" - "0a08746573743133313900a70a08746573743133323000a80a08746573743133323100a90a08746573743133323200" - "aa0a08746573743133323300ab0a08746573743133323400ac0a08746573743133323500ad0a087465737431333236" - "00ae0a08746573743133323700af0a08746573743133323800b00a08746573743133323900b10a0874657374313333" - "3000b20a08746573743133333100b30a08746573743133333200b40a08746573743133333300b50a08746573743133" - "333400b60a08746573743133333500b70a08746573743133333600b80a08746573743133333700b90a087465737431" - "33333800ba0a08746573743133333900bb0a08746573743133343000bc0a08746573743133343100bd0a0874657374" - "3133343200be0a08746573743133343300bf0a08746573743133343400c00a08746573743133343500c10a08746573" - "743133343600c20a08746573743133343700c30a08746573743133343800c40a08746573743133343900c50a087465" - "73743133353000c60a08746573743133353100c70a08746573743133353200c80a08746573743133353300c90a0874" - "6573743133353400ca0a08746573743133353500cb0a08746573743133353600cc0a08746573743133353700cd0a08" - "746573743133353800ce0a08746573743133353900cf0a08746573743133363000d00a08746573743133363100d10a" - "08746573743133363200d20a08746573743133363300d30a08746573743133363400d40a08746573743133363500d5" - "0a08746573743133363600d60a08746573743133363700d70a08746573743133363800d80a08746573743133363900" - "d90a08746573743133373000da0a08746573743133373100db0a08746573743133373200dc0a087465737431333733" - "00dd0a08746573743133373400de0a08746573743133373500df0a08746573743133373600e00a0874657374313337" - "3700e10a08746573743133373800e20a08746573743133373900e30a08746573743133383000e40a08746573743133" - "383100e50a08746573743133383200e60a08746573743133383300e70a08746573743133383400e80a087465737431" - "33383500e90a08746573743133383600ea0a08746573743133383700eb0a08746573743133383800ec0a0874657374" - "3133383900ed0a08746573743133393000ee0a08746573743133393100ef0a08746573743133393200f00a08746573" - "743133393300f10a08746573743133393400f20a08746573743133393500f30a08746573743133393600f40a087465" - "73743133393700f50a08746573743133393800f60a08746573743133393900f70a08746573743134303000f80a0874" - "6573743134303100f90a08746573743134303200fa0a08746573743134303300fb0a08746573743134303400fc0a08" - "746573743134303500fd0a08746573743134303600fe0a08746573743134303700ff0a08746573743134303800800b" - "08746573743134303900810b08746573743134313000820b08746573743134313100830b0874657374313431320084" - "0b08746573743134313300850b08746573743134313400860b08746573743134313500870b08746573743134313600" - "880b08746573743134313700890b087465737431343138008a0b087465737431343139008b0b087465737431343230" - "008c0b087465737431343231008d0b087465737431343232008e0b087465737431343233008f0b0874657374313432" - "3400900b08746573743134323500910b08746573743134323600920b08746573743134323700930b08746573743134" - "323800940b08746573743134323900950b08746573743134333000960b08746573743134333100970b087465737431" - "34333200980b08746573743134333300990b087465737431343334009a0b087465737431343335009b0b0874657374" - "31343336009c0b087465737431343337009d0b087465737431343338009e0b087465737431343339009f0b08746573" - "743134343000a00b08746573743134343100a10b08746573743134343200a20b08746573743134343300a30b087465" - "73743134343400a40b08746573743134343500a50b08746573743134343600a60b08746573743134343700a70b0874" - "6573743134343800a80b08746573743134343900a90b08746573743134353000aa0b08746573743134353100ab0b08" - "746573743134353200ac0b08746573743134353300ad0b08746573743134353400ae0b08746573743134353500af0b" - "08746573743134353600b00b08746573743134353700b10b08746573743134353800b20b08746573743134353900b3" - "0b08746573743134363000b40b08746573743134363100b50b08746573743134363200b60b08746573743134363300" - "b70b08746573743134363400b80b08746573743134363500b90b08746573743134363600ba0b087465737431343637" - "00bb0b08746573743134363800bc0b08746573743134363900bd0b08746573743134373000be0b0874657374313437" - "3100bf0b08746573743134373200c00b08746573743134373300c10b08746573743134373400c20b08746573743134" - "373500c30b08746573743134373600c40b08746573743134373700c50b08746573743134373800c60b087465737431" - "34373900c70b08746573743134383000c80b08746573743134383100c90b08746573743134383200ca0b0874657374" - "3134383300cb0b08746573743134383400cc0b08746573743134383500cd0b08746573743134383600ce0b08746573" - "743134383700cf0b08746573743134383800d00b08746573743134383900d10b08746573743134393000d20b087465" - "73743134393100d30b08746573743134393200d40b08746573743134393300d50b08746573743134393400d60b0874" - "6573743134393500d70b08746573743134393600d80b08746573743134393700d90b08746573743134393800da0b08" - "746573743134393900db0b08746573743135303000dc0b08746573743135303100dd0b08746573743135303200de0b" - "08746573743135303300df0b08746573743135303400e00b08746573743135303500e10b08746573743135303600e2" - "0b08746573743135303700e30b08746573743135303800e40b08746573743135303900e50b08746573743135313000" - "e60b08746573743135313100e70b08746573743135313200e80b08746573743135313300e90b087465737431353134" - "00ea0b08746573743135313500eb0b08746573743135313600ec0b08746573743135313700ed0b0874657374313531" - "3800ee0b08746573743135313900ef0b08746573743135323000f00b08746573743135323100f10b08746573743135" - "323200f20b08746573743135323300f30b08746573743135323400f40b08746573743135323500f50b087465737431" - "35323600f60b08746573743135323700f70b08746573743135323800f80b08746573743135323900f90b0874657374" - "3135333000fa0b08746573743135333100fb0b08746573743135333200fc0b08746573743135333300fd0b08746573" - "743135333400fe0b08746573743135333500ff0b08746573743135333600800c08746573743135333700810c087465" - "73743135333800820c08746573743135333900830c08746573743135343000840c08746573743135343100850c0874" - "6573743135343200860c08746573743135343300870c08746573743135343400880c08746573743135343500890c08" - "7465737431353436008a0c087465737431353437008b0c087465737431353438008c0c087465737431353439008d0c" - "087465737431353530008e0c087465737431353531008f0c08746573743135353200900c0874657374313535330091" - "0c08746573743135353400920c08746573743135353500930c08746573743135353600940c08746573743135353700" - "950c08746573743135353800960c08746573743135353900970c08746573743135363000980c087465737431353631" - "00990c087465737431353632009a0c087465737431353633009b0c087465737431353634009c0c0874657374313536" - "35009d0c087465737431353636009e0c087465737431353637009f0c08746573743135363800a00c08746573743135" - "363900a10c08746573743135373000a20c08746573743135373100a30c08746573743135373200a40c087465737431" - "35373300a50c08746573743135373400a60c08746573743135373500a70c08746573743135373600a80c0874657374" - "3135373700a90c08746573743135373800aa0c08746573743135373900ab0c08746573743135383000ac0c08746573" - "743135383100ad0c08746573743135383200ae0c08746573743135383300af0c08746573743135383400b00c087465" - "73743135383500b10c08746573743135383600b20c08746573743135383700b30c08746573743135383800b40c0874" - "6573743135383900b50c08746573743135393000b60c08746573743135393100b70c08746573743135393200b80c08" - "746573743135393300b90c08746573743135393400ba0c08746573743135393500bb0c08746573743135393600bc0c" - "08746573743135393700bd0c08746573743135393800be0c08746573743135393900bf0c08746573743136303000c0" - "0c08746573743136303100c10c08746573743136303200c20c08746573743136303300c30c08746573743136303400" - "c40c08746573743136303500c50c08746573743136303600c60c08746573743136303700c70c087465737431363038" - "00c80c08746573743136303900c90c08746573743136313000ca0c08746573743136313100cb0c0874657374313631" - "3200cc0c08746573743136313300cd0c08746573743136313400ce0c08746573743136313500cf0c08746573743136" - "313600d00c08746573743136313700d10c08746573743136313800d20c08746573743136313900d30c087465737431" - "36323000d40c08746573743136323100d50c08746573743136323200d60c08746573743136323300d70c0874657374" - "3136323400d80c08746573743136323500d90c08746573743136323600da0c08746573743136323700db0c08746573" - "743136323800dc0c08746573743136323900dd0c08746573743136333000de0c08746573743136333100df0c087465" - "73743136333200e00c08746573743136333300e10c08746573743136333400e20c08746573743136333500e30c0874" - "6573743136333600e40c08746573743136333700e50c08746573743136333800e60c08746573743136333900e70c08" - "746573743136343000e80c08746573743136343100e90c08746573743136343200ea0c08746573743136343300eb0c" - "08746573743136343400ec0c08746573743136343500ed0c08746573743136343600ee0c08746573743136343700ef" - "0c08746573743136343800f00c08746573743136343900f10c08746573743136353000f20c08746573743136353100" - "f30c08746573743136353200f40c08746573743136353300f50c08746573743136353400f60c087465737431363535" - "00f70c08746573743136353600f80c08746573743136353700f90c08746573743136353800fa0c0874657374313635" - "3900fb0c08746573743136363000fc0c08746573743136363100fd0c08746573743136363200fe0c08746573743136" - "363300ff0c08746573743136363400800d08746573743136363500810d08746573743136363600820d087465737431" - "36363700830d08746573743136363800840d08746573743136363900850d08746573743136373000860d0874657374" - "3136373100870d08746573743136373200880d08746573743136373300890d087465737431363734008a0d08746573" - "7431363735008b0d087465737431363736008c0d087465737431363737008d0d087465737431363738008e0d087465" - "737431363739008f0d08746573743136383000900d08746573743136383100910d08746573743136383200920d0874" - "6573743136383300930d08746573743136383400940d08746573743136383500950d08746573743136383600960d08" - "746573743136383700970d08746573743136383800980d08746573743136383900990d087465737431363930009a0d" - "087465737431363931009b0d087465737431363932009c0d087465737431363933009d0d087465737431363934009e" - "0d087465737431363935009f0d08746573743136393600a00d08746573743136393700a10d08746573743136393800" - "a20d08746573743136393900a30d08746573743137303000a40d08746573743137303100a50d087465737431373032" - "00a60d08746573743137303300a70d08746573743137303400a80d08746573743137303500a90d0874657374313730" - "3600aa0d08746573743137303700ab0d08746573743137303800ac0d08746573743137303900ad0d08746573743137" - "313000ae0d08746573743137313100af0d08746573743137313200b00d08746573743137313300b10d087465737431" - "37313400b20d08746573743137313500b30d08746573743137313600b40d08746573743137313700b50d0874657374" - "3137313800b60d08746573743137313900b70d08746573743137323000b80d08746573743137323100b90d08746573" - "743137323200ba0d08746573743137323300bb0d08746573743137323400bc0d08746573743137323500bd0d087465" - "73743137323600be0d08746573743137323700bf0d08746573743137323800c00d08746573743137323900c10d0874" - "6573743137333000c20d08746573743137333100c30d08746573743137333200c40d08746573743137333300c50d08" - "746573743137333400c60d08746573743137333500c70d08746573743137333600c80d08746573743137333700c90d" - "08746573743137333800ca0d08746573743137333900cb0d08746573743137343000cc0d08746573743137343100cd" - "0d08746573743137343200ce0d08746573743137343300cf0d08746573743137343400d00d08746573743137343500" - "d10d08746573743137343600d20d08746573743137343700d30d08746573743137343800d40d087465737431373439" - "00d50d08746573743137353000d60d08746573743137353100d70d08746573743137353200d80d0874657374313735" - "3300d90d08746573743137353400da0d08746573743137353500db0d08746573743137353600dc0d08746573743137" - "353700dd0d08746573743137353800de0d08746573743137353900df0d08746573743137363000e00d087465737431" - "37363100e10d08746573743137363200e20d08746573743137363300e30d08746573743137363400e40d0874657374" - "3137363500e50d08746573743137363600e60d08746573743137363700e70d08746573743137363800e80d08746573" - "743137363900e90d08746573743137373000ea0d08746573743137373100eb0d08746573743137373200ec0d087465" - "73743137373300ed0d08746573743137373400ee0d08746573743137373500ef0d08746573743137373600f00d0874" - "6573743137373700f10d08746573743137373800f20d08746573743137373900f30d08746573743137383000f40d08" - "746573743137383100f50d08746573743137383200f60d08746573743137383300f70d08746573743137383400f80d" - "08746573743137383500f90d08746573743137383600fa0d08746573743137383700fb0d08746573743137383800fc" - "0d08746573743137383900fd0d08746573743137393000fe0d08746573743137393100ff0d08746573743137393200" - "800e08746573743137393300810e08746573743137393400820e08746573743137393500830e087465737431373936" - "00840e08746573743137393700850e08746573743137393800860e08746573743137393900870e0874657374313830" - "3000880e08746573743138303100890e087465737431383032008a0e087465737431383033008b0e08746573743138" - "3034008c0e087465737431383035008d0e087465737431383036008e0e087465737431383037008f0e087465737431" - "38303800900e08746573743138303900910e08746573743138313000920e08746573743138313100930e0874657374" - "3138313200940e08746573743138313300950e08746573743138313400960e08746573743138313500970e08746573" - "743138313600980e08746573743138313700990e087465737431383138009a0e087465737431383139009b0e087465" - "737431383230009c0e087465737431383231009d0e087465737431383232009e0e087465737431383233009f0e0874" - "6573743138323400a00e08746573743138323500a10e08746573743138323600a20e08746573743138323700a30e08" - "746573743138323800a40e08746573743138323900a50e08746573743138333000a60e08746573743138333100a70e" - "08746573743138333200a80e08746573743138333300a90e08746573743138333400aa0e08746573743138333500ab" - "0e08746573743138333600ac0e08746573743138333700ad0e08746573743138333800ae0e08746573743138333900" - "af0e08746573743138343000b00e08746573743138343100b10e08746573743138343200b20e087465737431383433" - "00b30e08746573743138343400b40e08746573743138343500b50e08746573743138343600b60e0874657374313834" - "3700b70e08746573743138343800b80e08746573743138343900b90e08746573743138353000ba0e08746573743138" - "353100bb0e08746573743138353200bc0e08746573743138353300bd0e08746573743138353400be0e087465737431" - "38353500bf0e08746573743138353600c00e08746573743138353700c10e08746573743138353800c20e0874657374" - "3138353900c30e08746573743138363000c40e08746573743138363100c50e08746573743138363200c60e08746573" - "743138363300c70e08746573743138363400c80e08746573743138363500c90e08746573743138363600ca0e087465" - "73743138363700cb0e08746573743138363800cc0e08746573743138363900cd0e08746573743138373000ce0e0874" - "6573743138373100cf0e08746573743138373200d00e08746573743138373300d10e08746573743138373400d20e08" - "746573743138373500d30e08746573743138373600d40e08746573743138373700d50e08746573743138373800d60e" - "08746573743138373900d70e08746573743138383000d80e08746573743138383100d90e08746573743138383200da" - "0e08746573743138383300db0e08746573743138383400dc0e08746573743138383500dd0e08746573743138383600" - "de0e08746573743138383700df0e08746573743138383800e00e08746573743138383900e10e087465737431383930" - "00e20e08746573743138393100e30e08746573743138393200e40e08746573743138393300e50e0874657374313839" - "3400e60e08746573743138393500e70e08746573743138393600e80e08746573743138393700e90e08746573743138" - "393800ea0e08746573743138393900eb0e08746573743139303000ec0e08746573743139303100ed0e087465737431" - "39303200ee0e08746573743139303300ef0e08746573743139303400f00e08746573743139303500f10e0874657374" - "3139303600f20e08746573743139303700f30e08746573743139303800f40e08746573743139303900f50e08746573" - "743139313000f60e08746573743139313100f70e08746573743139313200f80e08746573743139313300f90e087465" - "73743139313400fa0e08746573743139313500fb0e08746573743139313600fc0e08746573743139313700fd0e0874" - "6573743139313800fe0e08746573743139313900ff0e08746573743139323000800f08746573743139323100810f08" - "746573743139323200820f08746573743139323300830f08746573743139323400840f08746573743139323500850f" - "08746573743139323600860f08746573743139323700870f08746573743139323800880f0874657374313932390089" - "0f087465737431393330008a0f087465737431393331008b0f087465737431393332008c0f08746573743139333300" - "8d0f087465737431393334008e0f087465737431393335008f0f08746573743139333600900f087465737431393337" - "00910f08746573743139333800920f08746573743139333900930f08746573743139343000940f0874657374313934" - "3100950f08746573743139343200960f08746573743139343300970f08746573743139343400980f08746573743139" - "343500990f087465737431393436009a0f087465737431393437009b0f087465737431393438009c0f087465737431" - "393439009d0f087465737431393530009e0f087465737431393531009f0f08746573743139353200a00f0874657374" - "3139353300a10f08746573743139353400a20f08746573743139353500a30f08746573743139353600a40f08746573" - "743139353700a50f08746573743139353800a60f08746573743139353900a70f08746573743139363000a80f087465" - "73743139363100a90f08746573743139363200aa0f08746573743139363300ab0f08746573743139363400ac0f0874" - "6573743139363500ad0f08746573743139363600ae0f08746573743139363700af0f08746573743139363800b00f08" - "746573743139363900b10f08746573743139373000b20f08746573743139373100b30f08746573743139373200b40f" - "08746573743139373300b50f08746573743139373400b60f08746573743139373500b70f08746573743139373600b8" - "0f08746573743139373700b90f08746573743139373800ba0f08746573743139373900bb0f08746573743139383000" - "bc0f08746573743139383100bd0f08746573743139383200be0f08746573743139383300bf0f087465737431393834" - "00c00f08746573743139383500c10f08746573743139383600c20f08746573743139383700c30f0874657374313938" - "3800c40f08746573743139383900c50f08746573743139393000c60f08746573743139393100c70f08746573743139" - "393200c80f08746573743139393300c90f08746573743139393400ca0f08746573743139393500cb0f087465737431" - "39393600cc0f08746573743139393700cd0f08746573743139393800ce0f08746573743139393900cf0f0874657374" - "3230303000d00f08746573743230303100d10f08746573743230303200d20f08746573743230303300d30f08746573" - "743230303400d40f08746573743230303500d50f08746573743230303600d60f08746573743230303700d70f087465" - "73743230303800d80f08746573743230303900d90f08746573743230313000da0f08746573743230313100db0f0874" - "6573743230313200dc0f08746573743230313300dd0f08746573743230313400de0f08746573743230313500df0f08" - "746573743230313600e00f08746573743230313700e10f08746573743230313800e20f08746573743230313900e30f" - "08746573743230323000e40f08746573743230323100e50f08746573743230323200e60f08746573743230323300e7" - "0f08746573743230323400e80f08746573743230323500e90f08746573743230323600ea0f08746573743230323700" - "eb0f08746573743230323800ec0f08746573743230323900ed0f08746573743230333000ee0f087465737432303331" - "00ef0f08746573743230333200f00f08746573743230333300f10f08746573743230333400f20f0874657374323033" - "3500f30f08746573743230333600f40f08746573743230333700f50f08746573743230333800f60f08746573743230" - "333900f70f08746573743230343000f80f08746573743230343100f90f08746573743230343200fa0f087465737432" - "30343300fb0f08746573743230343400fc0f08746573743230343500fd0f08746573743230343600fe0f0874657374" - "3230343700ff0f08746573743230343800801008746573743230343900811008746573743230353000821008746573" - "7432303531008310087465737432303532008410087465737432303533008510087465737432303534008610087465" - "737432303535008710087465737432303536008810087465737432303537008910087465737432303538008a100874" - "65737432303539008b10087465737432303630008c10087465737432303631008d10087465737432303632008e1008" - "7465737432303633008f10087465737432303634009010087465737432303635009110087465737432303636009210" - "0874657374323036370093100874657374323036380094100874657374323036390095100874657374323037300096" - "1008746573743230373100971008746573743230373200981008746573743230373300991008746573743230373400" - "9a10087465737432303735009b10087465737432303736009c10087465737432303737009d10087465737432303738" - "009e10087465737432303739009f1008746573743230383000a01008746573743230383100a1100874657374323038" - "3200a21008746573743230383300a31008746573743230383400a41008746573743230383500a51008746573743230" - "383600a61008746573743230383700a71008746573743230383800a81008746573743230383900a910087465737432" - "30393000aa1008746573743230393100ab1008746573743230393200ac1008746573743230393300ad100874657374" - "3230393400ae1008746573743230393500af1008746573743230393600b01008746573743230393700b11008746573" - "743230393800b21008746573743230393900b31008746573743231303000b41008746573743231303100b510087465" - "73743231303200b61008746573743231303300b71008746573743231303400b81008746573743231303500b9100874" - "6573743231303600ba1008746573743231303700bb1008746573743231303800bc1008746573743231303900bd1008" - "746573743231313000be1008746573743231313100bf1008746573743231313200c01008746573743231313300c110" - "08746573743231313400c21008746573743231313500c31008746573743231313600c41008746573743231313700c5" - "1008746573743231313800c61008746573743231313900c71008746573743231323000c81008746573743231323100" - "c91008746573743231323200ca1008746573743231323300cb1008746573743231323400cc10087465737432313235" - "00cd1008746573743231323600ce1008746573743231323700cf1008746573743231323800d0100874657374323132" - "3900d11008746573743231333000d21008746573743231333100d31008746573743231333200d41008746573743231" - "333300d51008746573743231333400d61008746573743231333500d71008746573743231333600d810087465737432" - "31333700d91008746573743231333800da1008746573743231333900db1008746573743231343000dc100874657374" - "3231343100dd1008746573743231343200de1008746573743231343300df1008746573743231343400e01008746573" - "743231343500e11008746573743231343600e21008746573743231343700e31008746573743231343800e410087465" - "73743231343900e51008746573743231353000e61008746573743231353100e71008746573743231353200e8100874" - "6573743231353300e91008746573743231353400ea1008746573743231353500eb1008746573743231353600ec1008" - "746573743231353700ed1008746573743231353800ee1008746573743231353900ef1008746573743231363000f010" - "08746573743231363100f11008746573743231363200f21008746573743231363300f31008746573743231363400f4" - "1008746573743231363500f51008746573743231363600f61008746573743231363700f71008746573743231363800" - "f81008746573743231363900f91008746573743231373000fa1008746573743231373100fb10087465737432313732" - "00fc1008746573743231373300fd1008746573743231373400fe1008746573743231373500ff100874657374323137" - "3600801108746573743231373700811108746573743231373800821108746573743231373900831108746573743231" - "3830008411087465737432313831008511087465737432313832008611087465737432313833008711087465737432" - "313834008811087465737432313835008911087465737432313836008a11087465737432313837008b110874657374" - "32313838008c11087465737432313839008d11087465737432313930008e11087465737432313931008f1108746573" - "7432313932009011087465737432313933009111087465737432313934009211087465737432313935009311087465" - "7374323139360094110874657374323139370095110874657374323139380096110874657374323139390097110874" - "65737432323030009811087465737432323031009911087465737432323032009a11087465737432323033009b1108" - "7465737432323034009c11087465737432323035009d11087465737432323036009e11087465737432323037009f11" - "08746573743232303800a01108746573743232303900a11108746573743232313000a21108746573743232313100a3" - "1108746573743232313200a41108746573743232313300a51108746573743232313400a61108746573743232313500" - "a71108746573743232313600a81108746573743232313700a91108746573743232313800aa11087465737432323139" - "00ab1108746573743232323000ac1108746573743232323100ad1108746573743232323200ae110874657374323232" - "3300af1108746573743232323400b01108746573743232323500b11108746573743232323600b21108746573743232" - "323700b31108746573743232323800b41108746573743232323900b51108746573743232333000b611087465737432" - "32333100b71108746573743232333200b81108746573743232333300b91108746573743232333400ba110874657374" - "3232333500bb1108746573743232333600bc1108746573743232333700bd1108746573743232333800be1108746573" - "743232333900bf1108746573743232343000c01108746573743232343100c11108746573743232343200c211087465" - "73743232343300c31108746573743232343400c41108746573743232343500c51108746573743232343600c6110874" - "6573743232343700c71108746573743232343800c81108746573743232343900c91108746573743232353000ca1108" - "746573743232353100cb1108746573743232353200cc1108746573743232353300cd1108746573743232353400ce11" - "08746573743232353500cf1108746573743232353600d01108746573743232353700d11108746573743232353800d2" - "1108746573743232353900d31108746573743232363000d41108746573743232363100d51108746573743232363200" - "d61108746573743232363300d71108746573743232363400d81108746573743232363500d911087465737432323636" - "00da1108746573743232363700db1108746573743232363800dc1108746573743232363900dd110874657374323237" - "3000de1108746573743232373100df1108746573743232373200e01108746573743232373300e11108746573743232" - "373400e21108746573743232373500e31108746573743232373600e41108746573743232373700e511087465737432" - "32373800e61108746573743232373900e71108746573743232383000e81108746573743232383100e9110874657374" - "3232383200ea1108746573743232383300eb1108746573743232383400ec1108746573743232383500ed1108746573" - "743232383600ee1108746573743232383700ef1108746573743232383800f01108746573743232383900f111087465" - "73743232393000f21108746573743232393100f31108746573743232393200f41108746573743232393300f5110874" - "6573743232393400f61108746573743232393500f71108746573743232393600f81108746573743232393700f91108" - "746573743232393800fa1108746573743232393900fb1108746573743233303000fc1108746573743233303100fd11" - "08746573743233303200fe1108746573743233303300ff110874657374323330340080120874657374323330350081" - "1208746573743233303600821208746573743233303700831208746573743233303800841208746573743233303900" - "8512087465737432333130008612087465737432333131008712087465737432333132008812087465737432333133" - "008912087465737432333134008a12087465737432333135008b12087465737432333136008c120874657374323331" - "37008d12087465737432333138008e12087465737432333139008f1208746573743233323000901208746573743233" - "3231009112087465737432333232009212087465737432333233009312087465737432333234009412087465737432" - "3332350095120874657374323332360096120874657374323332370097120874657374323332380098120874657374" - "32333239009912087465737432333330009a12087465737432333331009b12087465737432333332009c1208746573" - "7432333333009d12087465737432333334009e12087465737432333335009f1208746573743233333600a012087465" - "73743233333700a11208746573743233333800a21208746573743233333900a31208746573743233343000a4120874" - "6573743233343100a51208746573743233343200a61208746573743233343300a71208746573743233343400a81208" - "746573743233343500a91208746573743233343600aa1208746573743233343700ab1208746573743233343800ac12" - "08746573743233343900ad1208746573743233353000ae1208746573743233353100af1208746573743233353200b0" - "1208746573743233353300b11208746573743233353400b21208746573743233353500b31208746573743233353600" - "b41208746573743233353700b51208746573743233353800b61208746573743233353900b712087465737432333630" - "00b81208746573743233363100b91208746573743233363200ba1208746573743233363300bb120874657374323336" - "3400bc1208746573743233363500bd1208746573743233363600be1208746573743233363700bf1208746573743233" - "363800c01208746573743233363900c11208746573743233373000c21208746573743233373100c312087465737432" - "33373200c41208746573743233373300c51208746573743233373400c61208746573743233373500c7120874657374" - "3233373600c81208746573743233373700c91208746573743233373800ca1208746573743233373900cb1208746573" - "743233383000cc1208746573743233383100cd1208746573743233383200ce1208746573743233383300cf12087465" - "73743233383400d01208746573743233383500d11208746573743233383600d21208746573743233383700d3120874" - "6573743233383800d41208746573743233383900d51208746573743233393000d61208746573743233393100d71208" - "746573743233393200d81208746573743233393300d91208746573743233393400da1208746573743233393500db12" - "08746573743233393600dc1208746573743233393700dd1208746573743233393800de1208746573743233393900df" - "1208746573743234303000e01208746573743234303100e11208746573743234303200e21208746573743234303300" - "e31208746573743234303400e41208746573743234303500e51208746573743234303600e612087465737432343037" - "00e71208746573743234303800e81208746573743234303900e91208746573743234313000ea120874657374323431" - "3100eb1208746573743234313200ec1208746573743234313300ed1208746573743234313400ee1208746573743234" - "313500ef1208746573743234313600f01208746573743234313700f11208746573743234313800f212087465737432" - "34313900f31208746573743234323000f41208746573743234323100f51208746573743234323200f6120874657374" - "3234323300f71208746573743234323400f81208746573743234323500f91208746573743234323600fa1208746573" - "743234323700fb1208746573743234323800fc1208746573743234323900fd1208746573743234333000fe12087465" - "73743234333100ff120874657374323433320080130874657374323433330081130874657374323433340082130874" - "6573743234333500831308746573743234333600841308746573743234333700851308746573743234333800861308" - "7465737432343339008713087465737432343430008813087465737432343431008913087465737432343432008a13" - "087465737432343433008b13087465737432343434008c13087465737432343435008d13087465737432343436008e" - "13087465737432343437008f1308746573743234343800901308746573743234343900911308746573743234353000" - "9213087465737432343531009313087465737432343532009413087465737432343533009513087465737432343534" - "0096130874657374323435350097130874657374323435360098130874657374323435370099130874657374323435" - "38009a13087465737432343539009b13087465737432343630009c13087465737432343631009d1308746573743234" - "3632009e13087465737432343633009f1308746573743234363400a01308746573743234363500a113087465737432" - "34363600a21308746573743234363700a31308746573743234363800a41308746573743234363900a5130874657374" - "3234373000a61308746573743234373100a71308746573743234373200a81308746573743234373300a91308746573" - "743234373400aa1308746573743234373500ab1308746573743234373600ac1308746573743234373700ad13087465" - "73743234373800ae1308746573743234373900af1308746573743234383000b01308746573743234383100b1130874" - "6573743234383200b21308746573743234383300b31308746573743234383400b41308746573743234383500b51308" - "746573743234383600b61308746573743234383700b71308746573743234383800b81308746573743234383900b913" - "08746573743234393000ba1308746573743234393100bb1308746573743234393200bc1308746573743234393300bd" - "1308746573743234393400be1308746573743234393500bf1308746573743234393600c01308746573743234393700" - "c11308746573743234393800c21308746573743234393900c31308746573743235303000c413087465737432353031" - "00c51308746573743235303200c61308746573743235303300c71308746573743235303400c8130874657374323530" - "3500c91308746573743235303600ca1308746573743235303700cb1308746573743235303800cc1308746573743235" - "303900cd1308746573743235313000ce1308746573743235313100cf1308746573743235313200d013087465737432" - "35313300d11308746573743235313400d21308746573743235313500d31308746573743235313600d4130874657374" - "3235313700d51308746573743235313800d61308746573743235313900d71308746573743235323000d81308746573" - "743235323100d91308746573743235323200da1308746573743235323300db1308746573743235323400dc13087465" - "73743235323500dd1308746573743235323600de1308746573743235323700df1308746573743235323800e0130874" - "6573743235323900e11308746573743235333000e21308746573743235333100e31308746573743235333200e41308" - "746573743235333300e51308746573743235333400e61308746573743235333500e71308746573743235333600e813" - "08746573743235333700e91308746573743235333800ea1308746573743235333900eb1308746573743235343000ec" - "1308746573743235343100ed1308746573743235343200ee1308746573743235343300ef1308746573743235343400" - "f01308746573743235343500f11308746573743235343600f21308746573743235343700f313087465737432353438" - "00f41308746573743235343900f51308746573743235353000f61308746573743235353100f7130874657374323535" - "3200f81308746573743235353300f91308746573743235353400fa1308746573743235353500fb1308746573743235" - "353600fc1308746573743235353700fd1308746573743235353800fe1308746573743235353900ff13087465737432" - "3536300080140874657374323536310081140874657374323536320082140874657374323536330083140874657374" - "3235363400841408746573743235363500851408746573743235363600861408746573743235363700871408746573" - "7432353638008814087465737432353639008914087465737432353730008a14087465737432353731008b14087465" - "737432353732008c14087465737432353733008d14087465737432353734008e14087465737432353735008f140874" - "6573743235373600901408746573743235373700911408746573743235373800921408746573743235373900931408" - "7465737432353830009414087465737432353831009514087465737432353832009614087465737432353833009714" - "087465737432353834009814087465737432353835009914087465737432353836009a14087465737432353837009b" - "14087465737432353838009c14087465737432353839009d14087465737432353930009e1408746573743235393100" - "9f1408746573743235393200a01408746573743235393300a11408746573743235393400a214087465737432353935" - "00a31408746573743235393600a41408746573743235393700a51408746573743235393800a6140874657374323539" - "3900a71408746573743236303000a81408746573743236303100a91408746573743236303200aa1408746573743236" - "303300ab1408746573743236303400ac1408746573743236303500ad1408746573743236303600ae14087465737432" - "36303700af1408746573743236303800b01408746573743236303900b11408746573743236313000b2140874657374" - "3236313100b31408746573743236313200b41408746573743236313300b51408746573743236313400b61408746573" - "743236313500b71408746573743236313600b81408746573743236313700b91408746573743236313800ba14087465" - "73743236313900bb1408746573743236323000bc1408746573743236323100bd1408746573743236323200be140874" - "6573743236323300bf1408746573743236323400c01408746573743236323500c11408746573743236323600c21408" - "746573743236323700c31408746573743236323800c41408746573743236323900c51408746573743236333000c614" - "08746573743236333100c71408746573743236333200c81408746573743236333300c91408746573743236333400ca" - "1408746573743236333500cb1408746573743236333600cc1408746573743236333700cd1408746573743236333800" - "ce1408746573743236333900cf1408746573743236343000d01408746573743236343100d114087465737432363432" - "00d21408746573743236343300d31408746573743236343400d41408746573743236343500d5140874657374323634" - "3600d61408746573743236343700d71408746573743236343800d81408746573743236343900d91408746573743236" - "353000da1408746573743236353100db1408746573743236353200dc1408746573743236353300dd14087465737432" - "36353400de1408746573743236353500df1408746573743236353600e01408746573743236353700e1140874657374" - "3236353800e21408746573743236353900e31408746573743236363000e41408746573743236363100e51408746573" - "743236363200e61408746573743236363300e71408746573743236363400e81408746573743236363500e914087465" - "73743236363600ea1408746573743236363700eb1408746573743236363800ec1408746573743236363900ed140874" - "6573743236373000ee1408746573743236373100ef1408746573743236373200f01408746573743236373300f11408" - "746573743236373400f21408746573743236373500f31408746573743236373600f41408746573743236373700f514" - "08746573743236373800f61408746573743236373900f71408746573743236383000f81408746573743236383100f9" - "1408746573743236383200fa1408746573743236383300fb1408746573743236383400fc1408746573743236383500" - "fd1408746573743236383600fe1408746573743236383700ff14087465737432363838008015087465737432363839" - "0081150874657374323639300082150874657374323639310083150874657374323639320084150874657374323639" - "3300851508746573743236393400861508746573743236393500871508746573743236393600881508746573743236" - "3937008915087465737432363938008a15087465737432363939008b15087465737432373030008c15087465737432" - "373031008d15087465737432373032008e15087465737432373033008f150874657374323730340090150874657374" - "3237303500911508746573743237303600921508746573743237303700931508746573743237303800941508746573" - "7432373039009515087465737432373130009615087465737432373131009715087465737432373132009815087465" - "737432373133009915087465737432373134009a15087465737432373135009b15087465737432373136009c150874" - "65737432373137009d15087465737432373138009e15087465737432373139009f1508746573743237323000a01508" - "746573743237323100a11508746573743237323200a21508746573743237323300a31508746573743237323400a415" - "08746573743237323500a51508746573743237323600a61508746573743237323700a71508746573743237323800a8" - "1508746573743237323900a91508746573743237333000aa1508746573743237333100ab1508746573743237333200" - "ac1508746573743237333300ad1508746573743237333400ae1508746573743237333500af15087465737432373336" - "00b01508746573743237333700b11508746573743237333800b21508746573743237333900b3150874657374323734" - "3000b41508746573743237343100b51508746573743237343200b61508746573743237343300b71508746573743237" - "343400b81508746573743237343500b91508746573743237343600ba1508746573743237343700bb15087465737432" - "37343800bc1508746573743237343900bd1508746573743237353000be1508746573743237353100bf150874657374" - "3237353200c01508746573743237353300c11508746573743237353400c21508746573743237353500c31508746573" - "743237353600c41508746573743237353700c51508746573743237353800c61508746573743237353900c715087465" - "73743237363000c81508746573743237363100c91508746573743237363200ca1508746573743237363300cb150874" - "6573743237363400cc1508746573743237363500cd1508746573743237363600ce1508746573743237363700cf1508" - "746573743237363800d01508746573743237363900d11508746573743237373000d21508746573743237373100d315" - "08746573743237373200d41508746573743237373300d51508746573743237373400d61508746573743237373500d7" - "1508746573743237373600d81508746573743237373700d91508746573743237373800da1508746573743237373900" - "db1508746573743237383000dc1508746573743237383100dd1508746573743237383200de15087465737432373833" - "00df1508746573743237383400e01508746573743237383500e11508746573743237383600e2150874657374323738" - "3700e31508746573743237383800e41508746573743237383900e51508746573743237393000e61508746573743237" - "393100e71508746573743237393200e81508746573743237393300e91508746573743237393400ea15087465737432" - "37393500eb1508746573743237393600ec1508746573743237393700ed1508746573743237393800ee150874657374" - "3237393900ef1508746573743238303000f01508746573743238303100f11508746573743238303200f21508746573" - "743238303300f31508746573743238303400f41508746573743238303500f51508746573743238303600f615087465" - "73743238303700f71508746573743238303800f81508746573743238303900f91508746573743238313000fa150874" - "6573743238313100fb1508746573743238313200fc1508746573743238313300fd1508746573743238313400fe1508" - "746573743238313500ff15087465737432383136008016087465737432383137008116087465737432383138008216" - "0874657374323831390083160874657374323832300084160874657374323832310085160874657374323832320086" - "1608746573743238323300871608746573743238323400881608746573743238323500891608746573743238323600" - "8a16087465737432383237008b16087465737432383238008c16087465737432383239008d16087465737432383330" - "008e16087465737432383331008f160874657374323833320090160874657374323833330091160874657374323833" - "3400921608746573743238333500931608746573743238333600941608746573743238333700951608746573743238" - "3338009616087465737432383339009716087465737432383430009816087465737432383431009916087465737432" - "383432009a16087465737432383433009b16087465737432383434009c16087465737432383435009d160874657374" - "32383436009e16087465737432383437009f1608746573743238343800a01608746573743238343900a11608746573" - "743238353000a21608746573743238353100a31608746573743238353200a41608746573743238353300a516087465" - "73743238353400a61608746573743238353500a71608746573743238353600a81608746573743238353700a9160874" - "6573743238353800aa1608746573743238353900ab1608746573743238363000ac1608746573743238363100ad1608" - "746573743238363200ae1608746573743238363300af1608746573743238363400b01608746573743238363500b116" - "08746573743238363600b21608746573743238363700b31608746573743238363800b41608746573743238363900b5" - "1608746573743238373000b61608746573743238373100b71608746573743238373200b81608746573743238373300" - "b91608746573743238373400ba1608746573743238373500bb1608746573743238373600bc16087465737432383737" - "00bd1608746573743238373800be1608746573743238373900bf1608746573743238383000c0160874657374323838" - "3100c11608746573743238383200c21608746573743238383300c31608746573743238383400c41608746573743238" - "383500c51608746573743238383600c61608746573743238383700c71608746573743238383800c816087465737432" - "38383900c91608746573743238393000ca1608746573743238393100cb1608746573743238393200cc160874657374" - "3238393300cd1608746573743238393400ce1608746573743238393500cf1608746573743238393600d01608746573" - "743238393700d11608746573743238393800d21608746573743238393900d31608746573743239303000d416087465" - "73743239303100d51608746573743239303200d61608746573743239303300d71608746573743239303400d8160874" - "6573743239303500d91608746573743239303600da1608746573743239303700db1608746573743239303800dc1608" - "746573743239303900dd1608746573743239313000de1608746573743239313100df1608746573743239313200e016" - "08746573743239313300e11608746573743239313400e21608746573743239313500e31608746573743239313600e4" - "1608746573743239313700e51608746573743239313800e61608746573743239313900e71608746573743239323000" - "e81608746573743239323100e91608746573743239323200ea1608746573743239323300eb16087465737432393234" - "00ec1608746573743239323500ed1608746573743239323600ee1608746573743239323700ef160874657374323932" - "3800f01608746573743239323900f11608746573743239333000f21608746573743239333100f31608746573743239" - "333200f41608746573743239333300f51608746573743239333400f61608746573743239333500f716087465737432" - "39333600f81608746573743239333700f91608746573743239333800fa1608746573743239333900fb160874657374" - "3239343000fc1608746573743239343100fd1608746573743239343200fe1608746573743239343300ff1608746573" - "7432393434008017087465737432393435008117087465737432393436008217087465737432393437008317087465" - "7374323934380084170874657374323934390085170874657374323935300086170874657374323935310087170874" - "65737432393532008817087465737432393533008917087465737432393534008a17087465737432393535008b1708" - "7465737432393536008c17087465737432393537008d17087465737432393538008e17087465737432393539008f17" - "0874657374323936300090170874657374323936310091170874657374323936320092170874657374323936330093" - "1708746573743239363400941708746573743239363500951708746573743239363600961708746573743239363700" - "9717087465737432393638009817087465737432393639009917087465737432393730009a17087465737432393731" - "009b17087465737432393732009c17087465737432393733009d17087465737432393734009e170874657374323937" - "35009f1708746573743239373600a01708746573743239373700a11708746573743239373800a21708746573743239" - "373900a31708746573743239383000a41708746573743239383100a51708746573743239383200a617087465737432" - "39383300a71708746573743239383400a81708746573743239383500a91708746573743239383600aa170874657374" - "3239383700ab1708746573743239383800ac1708746573743239383900ad1708746573743239393000ae1708746573" - "743239393100af1708746573743239393200b01708746573743239393300b11708746573743239393400b217087465" - "73743239393500b31708746573743239393600b41708746573743239393700b51708746573743239393800b6170874" - "6573743239393900b71708746573743330303000b81708746573743330303100b91708746573743330303200ba1708" - "746573743330303300bb1708746573743330303400bc1708746573743330303500bd1708746573743330303600be17" - "08746573743330303700bf1708746573743330303800c01708746573743330303900c11708746573743330313000c2" - "1708746573743330313100c31708746573743330313200c41708746573743330313300c51708746573743330313400" - "c61708746573743330313500c71708746573743330313600c81708746573743330313700c917087465737433303138" - "00ca1708746573743330313900cb1708746573743330323000cc1708746573743330323100cd170874657374333032" - "3200ce1708746573743330323300cf1708746573743330323400d01708746573743330323500d11708746573743330" - "323600d21708746573743330323700d31708746573743330323800d41708746573743330323900d517087465737433" - "30333000d61708746573743330333100d71708746573743330333200d81708746573743330333300d9170874657374" - "3330333400da1708746573743330333500db1708746573743330333600dc1708746573743330333700dd1708746573" - "743330333800de1708746573743330333900df1708746573743330343000e01708746573743330343100e117087465" - "73743330343200e21708746573743330343300e31708746573743330343400e41708746573743330343500e5170874" - "6573743330343600e61708746573743330343700e71708746573743330343800e81708746573743330343900e91708" - "746573743330353000ea1708746573743330353100eb1708746573743330353200ec1708746573743330353300ed17" - "08746573743330353400ee1708746573743330353500ef1708746573743330353600f01708746573743330353700f1" - "1708746573743330353800f21708746573743330353900f31708746573743330363000f41708746573743330363100" - "f51708746573743330363200f61708746573743330363300f71708746573743330363400f817087465737433303635" - "00f91708746573743330363600fa1708746573743330363700fb1708746573743330363800fc170874657374333036" - "3900fd1708746573743330373000fe1708746573743330373100ff1708746573743330373200801808746573743330" - "3733008118087465737433303734008218087465737433303735008318087465737433303736008418087465737433" - "3037370085180874657374333037380086180874657374333037390087180874657374333038300088180874657374" - "33303831008918087465737433303832008a18087465737433303833008b18087465737433303834008c1808746573" - "7433303835008d18087465737433303836008e18087465737433303837008f18087465737433303838009018087465" - "7374333038390091180874657374333039300092180874657374333039310093180874657374333039320094180874" - "6573743330393300951808746573743330393400961808746573743330393500971808746573743330393600981808" - "7465737433303937009918087465737433303938009a18087465737433303939009b18087465737433313030009c18" - "087465737433313031009d18087465737433313032009e18087465737433313033009f1808746573743331303400a0" - "1808746573743331303500a11808746573743331303600a21808746573743331303700a31808746573743331303800" - "a41808746573743331303900a51808746573743331313000a61808746573743331313100a718087465737433313132" - "00a81808746573743331313300a91808746573743331313400aa1808746573743331313500ab180874657374333131" - "3600ac1808746573743331313700ad1808746573743331313800ae1808746573743331313900af1808746573743331" - "323000b01808746573743331323100b11808746573743331323200b21808746573743331323300b318087465737433" - "31323400b41808746573743331323500b51808746573743331323600b61808746573743331323700b7180874657374" - "3331323800b81808746573743331323900b91808746573743331333000ba1808746573743331333100bb1808746573" - "743331333200bc1808746573743331333300bd1808746573743331333400be1808746573743331333500bf18087465" - "73743331333600c01808746573743331333700c11808746573743331333800c21808746573743331333900c3180874" - "6573743331343000c41808746573743331343100c51808746573743331343200c61808746573743331343300c71808" - "746573743331343400c81808746573743331343500c91808746573743331343600ca1808746573743331343700cb18" - "08746573743331343800cc1808746573743331343900cd1808746573743331353000ce1808746573743331353100cf" - "1808746573743331353200d01808746573743331353300d11808746573743331353400d21808746573743331353500" - "d31808746573743331353600d41808746573743331353700d51808746573743331353800d618087465737433313539" - "00d71808746573743331363000d81808746573743331363100d91808746573743331363200da180874657374333136" - "3300db1808746573743331363400dc1808746573743331363500dd1808746573743331363600de1808746573743331" - "363700df1808746573743331363800e01808746573743331363900e11808746573743331373000e218087465737433" - "31373100e31808746573743331373200e41808746573743331373300e51808746573743331373400e6180874657374" - "3331373500e71808746573743331373600e81808746573743331373700e91808746573743331373800ea1808746573" - "743331373900eb1808746573743331383000ec1808746573743331383100ed1808746573743331383200ee18087465" - "73743331383300ef1808746573743331383400f01808746573743331383500f11808746573743331383600f2180874" - "6573743331383700f31808746573743331383800f41808746573743331383900f51808746573743331393000f61808" - "746573743331393100f71808746573743331393200f81808746573743331393300f91808746573743331393400fa18" - "08746573743331393500fb1808746573743331393600fc1808746573743331393700fd1808746573743331393800fe" - "1808746573743331393900ff1808746573743332303000801908746573743332303100811908746573743332303200" - "8219087465737433323033008319087465737433323034008419087465737433323035008519087465737433323036" - "0086190874657374333230370087190874657374333230380088190874657374333230390089190874657374333231" - "30008a19087465737433323131008b19087465737433323132008c19087465737433323133008d1908746573743332" - "3134008e19087465737433323135008f19087465737433323136009019087465737433323137009119087465737433" - "3231380092190874657374333231390093190874657374333232300094190874657374333232310095190874657374" - "3332323200961908746573743332323300971908746573743332323400981908746573743332323500991908746573" - "7433323236009a19087465737433323237009b19087465737433323238009c19087465737433323239009d19087465" - "737433323330009e19087465737433323331009f1908746573743332333200a01908746573743332333300a1190874" - "6573743332333400a21908746573743332333500a31908746573743332333600a41908746573743332333700a51908" - "746573743332333800a61908746573743332333900a71908746573743332343000a81908746573743332343100a919" - "08746573743332343200aa1908746573743332343300ab1908746573743332343400ac1908746573743332343500ad" - "1908746573743332343600ae1908746573743332343700af1908746573743332343800b01908746573743332343900" - "b11908746573743332353000b21908746573743332353100b31908746573743332353200b419087465737433323533" - "00b51908746573743332353400b61908746573743332353500b71908746573743332353600b8190874657374333235" - "3700b91908746573743332353800ba1908746573743332353900bb1908746573743332363000bc1908746573743332" - "363100bd1908746573743332363200be1908746573743332363300bf1908746573743332363400c019087465737433" - "32363500c11908746573743332363600c21908746573743332363700c31908746573743332363800c4190874657374" - "3332363900c51908746573743332373000c61908746573743332373100c71908746573743332373200c81908746573" - "743332373300c91908746573743332373400ca1908746573743332373500cb1908746573743332373600cc19087465" - "73743332373700cd1908746573743332373800ce1908746573743332373900cf1908746573743332383000d0190874" - "6573743332383100d11908746573743332383200d21908746573743332383300d31908746573743332383400d41908" - "746573743332383500d51908746573743332383600d61908746573743332383700d71908746573743332383800d819" - "08746573743332383900d91908746573743332393000da1908746573743332393100db1908746573743332393200dc" - "1908746573743332393300dd1908746573743332393400de1908746573743332393500df1908746573743332393600" - "e01908746573743332393700e11908746573743332393800e21908746573743332393900e319087465737433333030" - "00e41908746573743333303100e51908746573743333303200e61908746573743333303300e7190874657374333330" - "3400e81908746573743333303500e91908746573743333303600ea1908746573743333303700eb1908746573743333" - "303800ec1908746573743333303900ed1908746573743333313000ee1908746573743333313100ef19087465737433" - "33313200f01908746573743333313300f11908746573743333313400f21908746573743333313500f3190874657374" - "3333313600f41908746573743333313700f51908746573743333313800f61908746573743333313900f71908746573" - "743333323000f81908746573743333323100f91908746573743333323200fa1908746573743333323300fb19087465" - "73743333323400fc1908746573743333323500fd1908746573743333323600fe1908746573743333323700ff190874" - "6573743333323800801a08746573743333323900811a08746573743333333000821a08746573743333333100831a08" - "746573743333333200841a08746573743333333300851a08746573743333333400861a08746573743333333500871a" - "08746573743333333600881a08746573743333333700891a087465737433333338008a1a087465737433333339008b" - "1a087465737433333430008c1a087465737433333431008d1a087465737433333432008e1a08746573743333343300" - "8f1a08746573743333343400901a08746573743333343500911a08746573743333343600921a087465737433333437" - "00931a08746573743333343800941a08746573743333343900951a08746573743333353000961a0874657374333335" - "3100971a08746573743333353200981a08746573743333353300991a087465737433333534009a1a08746573743333" - "3535009b1a087465737433333536009c1a087465737433333537009d1a087465737433333538009e1a087465737433" - "333539009f1a08746573743333363000a01a08746573743333363100a11a08746573743333363200a21a0874657374" - "3333363300a31a08746573743333363400a41a08746573743333363500a51a08746573743333363600a61a08746573" - "743333363700a71a08746573743333363800a81a08746573743333363900a91a08746573743333373000aa1a087465" - "73743333373100ab1a08746573743333373200ac1a08746573743333373300ad1a08746573743333373400ae1a0874" - "6573743333373500af1a08746573743333373600b01a08746573743333373700b11a08746573743333373800b21a08" - "746573743333373900b31a08746573743333383000b41a08746573743333383100b51a08746573743333383200b61a" - "08746573743333383300b71a08746573743333383400b81a08746573743333383500b91a08746573743333383600ba" - "1a08746573743333383700bb1a08746573743333383800bc1a08746573743333383900bd1a08746573743333393000" - "be1a08746573743333393100bf1a08746573743333393200c01a08746573743333393300c11a087465737433333934" - "00c21a08746573743333393500c31a08746573743333393600c41a08746573743333393700c51a0874657374333339" - "3800c61a08746573743333393900c71a08746573743334303000c81a08746573743334303100c91a08746573743334" - "303200ca1a08746573743334303300cb1a08746573743334303400cc1a08746573743334303500cd1a087465737433" - "34303600ce1a08746573743334303700cf1a08746573743334303800d01a08746573743334303900d11a0874657374" - "3334313000d21a08746573743334313100d31a08746573743334313200d41a08746573743334313300d51a08746573" - "743334313400d61a08746573743334313500d71a08746573743334313600d81a08746573743334313700d91a087465" - "73743334313800da1a08746573743334313900db1a08746573743334323000dc1a08746573743334323100dd1a0874" - "6573743334323200de1a08746573743334323300df1a08746573743334323400e01a08746573743334323500e11a08" - "746573743334323600e21a08746573743334323700e31a08746573743334323800e41a08746573743334323900e51a" - "08746573743334333000e61a08746573743334333100e71a08746573743334333200e81a08746573743334333300e9" - "1a08746573743334333400ea1a08746573743334333500eb1a08746573743334333600ec1a08746573743334333700" - "ed1a08746573743334333800ee1a08746573743334333900ef1a08746573743334343000f01a087465737433343431" - "00f11a08746573743334343200f21a08746573743334343300f31a08746573743334343400f41a0874657374333434" - "3500f51a08746573743334343600f61a08746573743334343700f71a08746573743334343800f81a08746573743334" - "343900f91a08746573743334353000fa1a08746573743334353100fb1a08746573743334353200fc1a087465737433" - "34353300fd1a08746573743334353400fe1a08746573743334353500ff1a08746573743334353600801b0874657374" - "3334353700811b08746573743334353800821b08746573743334353900831b08746573743334363000841b08746573" - "743334363100851b08746573743334363200861b08746573743334363300871b08746573743334363400881b087465" - "73743334363500891b087465737433343636008a1b087465737433343637008b1b087465737433343638008c1b0874" - "65737433343639008d1b087465737433343730008e1b087465737433343731008f1b08746573743334373200901b08" - "746573743334373300911b08746573743334373400921b08746573743334373500931b08746573743334373600941b" - "08746573743334373700951b08746573743334373800961b08746573743334373900971b0874657374333438300098" - "1b08746573743334383100991b087465737433343832009a1b087465737433343833009b1b08746573743334383400" - "9c1b087465737433343835009d1b087465737433343836009e1b087465737433343837009f1b087465737433343838" - "00a01b08746573743334383900a11b08746573743334393000a21b08746573743334393100a31b0874657374333439" - "3200a41b08746573743334393300a51b08746573743334393400a61b08746573743334393500a71b08746573743334" - "393600a81b08746573743334393700a91b08746573743334393800aa1b08746573743334393900ab1b087465737433" - "35303000ac1b08746573743335303100ad1b08746573743335303200ae1b08746573743335303300af1b0874657374" - "3335303400b01b08746573743335303500b11b08746573743335303600b21b08746573743335303700b31b08746573" - "743335303800b41b08746573743335303900b51b08746573743335313000b61b08746573743335313100b71b087465" - "73743335313200b81b08746573743335313300b91b08746573743335313400ba1b08746573743335313500bb1b0874" - "6573743335313600bc1b08746573743335313700bd1b08746573743335313800be1b08746573743335313900bf1b08" - "746573743335323000c01b08746573743335323100c11b08746573743335323200c21b08746573743335323300c31b" - "08746573743335323400c41b08746573743335323500c51b08746573743335323600c61b08746573743335323700c7" - "1b08746573743335323800c81b08746573743335323900c91b08746573743335333000ca1b08746573743335333100" - "cb1b08746573743335333200cc1b08746573743335333300cd1b08746573743335333400ce1b087465737433353335" - "00cf1b08746573743335333600d01b08746573743335333700d11b08746573743335333800d21b0874657374333533" - "3900d31b08746573743335343000d41b08746573743335343100d51b08746573743335343200d61b08746573743335" - "343300d71b08746573743335343400d81b08746573743335343500d91b08746573743335343600da1b087465737433" - "35343700db1b08746573743335343800dc1b08746573743335343900dd1b08746573743335353000de1b0874657374" - "3335353100df1b08746573743335353200e01b08746573743335353300e11b08746573743335353400e21b08746573" - "743335353500e31b08746573743335353600e41b08746573743335353700e51b08746573743335353800e61b087465" - "73743335353900e71b08746573743335363000e81b08746573743335363100e91b08746573743335363200ea1b0874" - "6573743335363300eb1b08746573743335363400ec1b08746573743335363500ed1b08746573743335363600ee1b08" - "746573743335363700ef1b08746573743335363800f01b08746573743335363900f11b08746573743335373000f21b" - "08746573743335373100f31b08746573743335373200f41b08746573743335373300f51b08746573743335373400f6" - "1b08746573743335373500f71b08746573743335373600f81b08746573743335373700f91b08746573743335373800" - "fa1b08746573743335373900fb1b08746573743335383000fc1b08746573743335383100fd1b087465737433353832" - "00fe1b08746573743335383300ff1b08746573743335383400801c08746573743335383500811c0874657374333538" - "3600821c08746573743335383700831c08746573743335383800841c08746573743335383900851c08746573743335" - "393000861c08746573743335393100871c08746573743335393200881c08746573743335393300891c087465737433" - "353934008a1c087465737433353935008b1c087465737433353936008c1c087465737433353937008d1c0874657374" - "33353938008e1c087465737433353939008f1c08746573743336303000901c08746573743336303100911c08746573" - "743336303200921c08746573743336303300931c08746573743336303400941c08746573743336303500951c087465" - "73743336303600961c08746573743336303700971c08746573743336303800981c08746573743336303900991c0874" - "65737433363130009a1c087465737433363131009b1c087465737433363132009c1c087465737433363133009d1c08" - "7465737433363134009e1c087465737433363135009f1c08746573743336313600a01c08746573743336313700a11c" - "08746573743336313800a21c08746573743336313900a31c08746573743336323000a41c08746573743336323100a5" - "1c08746573743336323200a61c08746573743336323300a71c08746573743336323400a81c08746573743336323500" - "a91c08746573743336323600aa1c08746573743336323700ab1c08746573743336323800ac1c087465737433363239" - "00ad1c08746573743336333000ae1c08746573743336333100af1c08746573743336333200b01c0874657374333633" - "3300b11c08746573743336333400b21c08746573743336333500b31c08746573743336333600b41c08746573743336" - "333700b51c08746573743336333800b61c08746573743336333900b71c08746573743336343000b81c087465737433" - "36343100b91c08746573743336343200ba1c08746573743336343300bb1c08746573743336343400bc1c0874657374" - "3336343500bd1c08746573743336343600be1c08746573743336343700bf1c08746573743336343800c01c08746573" - "743336343900c11c08746573743336353000c21c08746573743336353100c31c08746573743336353200c41c087465" - "73743336353300c51c08746573743336353400c61c08746573743336353500c71c08746573743336353600c81c0874" - "6573743336353700c91c08746573743336353800ca1c08746573743336353900cb1c08746573743336363000cc1c08" - "746573743336363100cd1c08746573743336363200ce1c08746573743336363300cf1c08746573743336363400d01c" - "08746573743336363500d11c08746573743336363600d21c08746573743336363700d31c08746573743336363800d4" - "1c08746573743336363900d51c08746573743336373000d61c08746573743336373100d71c08746573743336373200" - "d81c08746573743336373300d91c08746573743336373400da1c08746573743336373500db1c087465737433363736" - "00dc1c08746573743336373700dd1c08746573743336373800de1c08746573743336373900df1c0874657374333638" - "3000e01c08746573743336383100e11c08746573743336383200e21c08746573743336383300e31c08746573743336" - "383400e41c08746573743336383500e51c08746573743336383600e61c08746573743336383700e71c087465737433" - "36383800e81c08746573743336383900e91c08746573743336393000ea1c08746573743336393100eb1c0874657374" - "3336393200ec1c08746573743336393300ed1c08746573743336393400ee1c08746573743336393500ef1c08746573" - "743336393600f01c08746573743336393700f11c08746573743336393800f21c08746573743336393900f31c087465" - "73743337303000f41c08746573743337303100f51c08746573743337303200f61c08746573743337303300f71c0874" - "6573743337303400f81c08746573743337303500f91c08746573743337303600fa1c08746573743337303700fb1c08" - "746573743337303800fc1c08746573743337303900fd1c08746573743337313000fe1c08746573743337313100ff1c" - "08746573743337313200801d08746573743337313300811d08746573743337313400821d0874657374333731350083" - "1d08746573743337313600841d08746573743337313700851d08746573743337313800861d08746573743337313900" - "871d08746573743337323000881d08746573743337323100891d087465737433373232008a1d087465737433373233" - "008b1d087465737433373234008c1d087465737433373235008d1d087465737433373236008e1d0874657374333732" - "37008f1d08746573743337323800901d08746573743337323900911d08746573743337333000921d08746573743337" - "333100931d08746573743337333200941d08746573743337333300951d08746573743337333400961d087465737433" - "37333500971d08746573743337333600981d08746573743337333700991d087465737433373338009a1d0874657374" - "33373339009b1d087465737433373430009c1d087465737433373431009d1d087465737433373432009e1d08746573" - "7433373433009f1d08746573743337343400a01d08746573743337343500a11d08746573743337343600a21d087465" - "73743337343700a31d08746573743337343800a41d08746573743337343900a51d08746573743337353000a61d0874" - "6573743337353100a71d08746573743337353200a81d08746573743337353300a91d08746573743337353400aa1d08" - "746573743337353500ab1d08746573743337353600ac1d08746573743337353700ad1d08746573743337353800ae1d" - "08746573743337353900af1d08746573743337363000b01d08746573743337363100b11d08746573743337363200b2" - "1d08746573743337363300b31d08746573743337363400b41d08746573743337363500b51d08746573743337363600" - "b61d08746573743337363700b71d08746573743337363800b81d08746573743337363900b91d087465737433373730" - "00ba1d08746573743337373100bb1d08746573743337373200bc1d08746573743337373300bd1d0874657374333737" - "3400be1d08746573743337373500bf1d08746573743337373600c01d08746573743337373700c11d08746573743337" - "373800c21d08746573743337373900c31d08746573743337383000c41d08746573743337383100c51d087465737433" - "37383200c61d08746573743337383300c71d08746573743337383400c81d08746573743337383500c91d0874657374" - "3337383600ca1d08746573743337383700cb1d08746573743337383800cc1d08746573743337383900cd1d08746573" - "743337393000ce1d08746573743337393100cf1d08746573743337393200d01d08746573743337393300d11d087465" - "73743337393400d21d08746573743337393500d31d08746573743337393600d41d08746573743337393700d51d0874" - "6573743337393800d61d08746573743337393900d71d08746573743338303000d81d08746573743338303100d91d08" - "746573743338303200da1d08746573743338303300db1d08746573743338303400dc1d08746573743338303500dd1d" - "08746573743338303600de1d08746573743338303700df1d08746573743338303800e01d08746573743338303900e1" - "1d08746573743338313000e21d08746573743338313100e31d08746573743338313200e41d08746573743338313300" - "e51d08746573743338313400e61d08746573743338313500e71d08746573743338313600e81d087465737433383137" - "00e91d08746573743338313800ea1d08746573743338313900eb1d08746573743338323000ec1d0874657374333832" - "3100ed1d08746573743338323200ee1d08746573743338323300ef1d08746573743338323400f01d08746573743338" - "323500f11d08746573743338323600f21d08746573743338323700f31d08746573743338323800f41d087465737433" - "38323900f51d08746573743338333000f61d08746573743338333100f71d08746573743338333200f81d0874657374" - "3338333300f91d08746573743338333400fa1d08746573743338333500fb1d08746573743338333600fc1d08746573" - "743338333700fd1d08746573743338333800fe1d08746573743338333900ff1d08746573743338343000801e087465" - "73743338343100811e08746573743338343200821e08746573743338343300831e08746573743338343400841e0874" - "6573743338343500851e08746573743338343600861e08746573743338343700871e08746573743338343800881e08" - "746573743338343900891e087465737433383530008a1e087465737433383531008b1e087465737433383532008c1e" - "087465737433383533008d1e087465737433383534008e1e087465737433383535008f1e0874657374333835360090" - "1e08746573743338353700911e08746573743338353800921e08746573743338353900931e08746573743338363000" - "941e08746573743338363100951e08746573743338363200961e08746573743338363300971e087465737433383634" - "00981e08746573743338363500991e087465737433383636009a1e087465737433383637009b1e0874657374333836" - "38009c1e087465737433383639009d1e087465737433383730009e1e087465737433383731009f1e08746573743338" - "373200a01e08746573743338373300a11e08746573743338373400a21e08746573743338373500a31e087465737433" - "38373600a41e08746573743338373700a51e08746573743338373800a61e08746573743338373900a71e0874657374" - "3338383000a81e08746573743338383100a91e08746573743338383200aa1e08746573743338383300ab1e08746573" - "743338383400ac1e08746573743338383500ad1e08746573743338383600ae1e08746573743338383700af1e087465" - "73743338383800b01e08746573743338383900b11e08746573743338393000b21e08746573743338393100b31e0874" - "6573743338393200b41e08746573743338393300b51e08746573743338393400b61e08746573743338393500b71e08" - "746573743338393600b81e08746573743338393700b91e08746573743338393800ba1e08746573743338393900bb1e" - "08746573743339303000bc1e08746573743339303100bd1e08746573743339303200be1e08746573743339303300bf" - "1e08746573743339303400c01e08746573743339303500c11e08746573743339303600c21e08746573743339303700" - "c31e08746573743339303800c41e08746573743339303900c51e08746573743339313000c61e087465737433393131" - "00c71e08746573743339313200c81e08746573743339313300c91e08746573743339313400ca1e0874657374333931" - "3500cb1e08746573743339313600cc1e08746573743339313700cd1e08746573743339313800ce1e08746573743339" - "313900cf1e08746573743339323000d01e08746573743339323100d11e08746573743339323200d21e087465737433" - "39323300d31e08746573743339323400d41e08746573743339323500d51e08746573743339323600d61e0874657374" - "3339323700d71e08746573743339323800d81e08746573743339323900d91e08746573743339333000da1e08746573" - "743339333100db1e08746573743339333200dc1e08746573743339333300dd1e08746573743339333400de1e087465" - "73743339333500df1e08746573743339333600e01e08746573743339333700e11e08746573743339333800e21e0874" - "6573743339333900e31e08746573743339343000e41e08746573743339343100e51e08746573743339343200e61e08" - "746573743339343300e71e08746573743339343400e81e08746573743339343500e91e08746573743339343600ea1e" - "08746573743339343700eb1e08746573743339343800ec1e08746573743339343900ed1e08746573743339353000ee" - "1e08746573743339353100ef1e08746573743339353200f01e08746573743339353300f11e08746573743339353400" - "f21e08746573743339353500f31e08746573743339353600f41e08746573743339353700f51e087465737433393538" - "00f61e08746573743339353900f71e08746573743339363000f81e08746573743339363100f91e0874657374333936" - "3200fa1e08746573743339363300fb1e08746573743339363400fc1e08746573743339363500fd1e08746573743339" - "363600fe1e08746573743339363700ff1e08746573743339363800801f08746573743339363900811f087465737433" - "39373000821f08746573743339373100831f08746573743339373200841f08746573743339373300851f0874657374" - "3339373400861f08746573743339373500871f08746573743339373600881f08746573743339373700891f08746573" - "7433393738008a1f087465737433393739008b1f087465737433393830008c1f087465737433393831008d1f087465" - "737433393832008e1f087465737433393833008f1f08746573743339383400901f08746573743339383500911f0874" - "6573743339383600921f08746573743339383700931f08746573743339383800941f08746573743339383900951f08" - "746573743339393000961f08746573743339393100971f08746573743339393200981f08746573743339393300991f" - "087465737433393934009a1f087465737433393935009b1f087465737433393936009c1f087465737433393937009d" - "1f087465737433393938009e1f087465737433393939009f1f08746573743430303000a01f08746573743430303100" - "a11f08746573743430303200a21f08746573743430303300a31f08746573743430303400a41f087465737434303035" - "00a51f08746573743430303600a61f08746573743430303700a71f08746573743430303800a81f0874657374343030" - "3900a91f08746573743430313000aa1f08746573743430313100ab1f08746573743430313200ac1f08746573743430" - "313300ad1f08746573743430313400ae1f08746573743430313500af1f08746573743430313600b01f087465737434" - "30313700b11f08746573743430313800b21f08746573743430313900b31f08746573743430323000b41f0874657374" - "3430323100b51f08746573743430323200b61f08746573743430323300b71f08746573743430323400b81f08746573" - "743430323500b91f08746573743430323600ba1f08746573743430323700bb1f08746573743430323800bc1f087465" - "73743430323900bd1f08746573743430333000be1f08746573743430333100bf1f08746573743430333200c01f0874" - "6573743430333300c11f08746573743430333400c21f08746573743430333500c31f08746573743430333600c41f08" - "746573743430333700c51f08746573743430333800c61f08746573743430333900c71f08746573743430343000c81f" - "08746573743430343100c91f08746573743430343200ca1f08746573743430343300cb1f08746573743430343400cc" - "1f08746573743430343500cd1f08746573743430343600ce1f08746573743430343700cf1f08746573743430343800" - "d01f08746573743430343900d11f08746573743430353000d21f08746573743430353100d31f087465737434303532" - "00d41f08746573743430353300d51f08746573743430353400d61f08746573743430353500d71f0874657374343035" - "3600d81f08746573743430353700d91f08746573743430353800da1f08746573743430353900db1f08746573743430" - "363000dc1f08746573743430363100dd1f08746573743430363200de1f08746573743430363300df1f087465737434" - "30363400e01f08746573743430363500e11f08746573743430363600e21f08746573743430363700e31f0874657374" - "3430363800e41f08746573743430363900e51f08746573743430373000e61f08746573743430373100e71f08746573" - "743430373200e81f08746573743430373300e91f08746573743430373400ea1f08746573743430373500eb1f087465" - "73743430373600ec1f08746573743430373700ed1f08746573743430373800ee1f08746573743430373900ef1f0874" - "6573743430383000f01f08746573743430383100f11f08746573743430383200f21f08746573743430383300f31f08" - "746573743430383400f41f08746573743430383500f51f08746573743430383600f61f08746573743430383700f71f" - "08746573743430383800f81f08746573743430383900f91f08746573743430393000fa1f08746573743430393100fb" - "1f08746573743430393200fc1f08746573743430393300fd1f08746573743430393400fe1f08746573743430393500" - "ff1f087465737434303936008020087465737434303937008120087465737434303938008220087465737434303939" - "0083200874657374343130300084200874657374343130310085200874657374343130320086200874657374343130" - "33008720087465737434313034008820087465737434313035008920087465737434313036008a2008746573743431" - "3037008b20087465737434313038008c20087465737434313039008d20087465737434313130008e20087465737434" - "313131008f200874657374343131320090200874657374343131330091200874657374343131340092200874657374" - "3431313500932008746573743431313600942008746573743431313700952008746573743431313800962008746573" - "7434313139009720087465737434313230009820087465737434313231009920087465737434313232009a20087465" - "737434313233009b20087465737434313234009c20087465737434313235009d20087465737434313236009e200874" - "65737434313237009f2008746573743431323800a02008746573743431323900a12008746573743431333000a22008" - "746573743431333100a32008746573743431333200a42008746573743431333300a52008746573743431333400a620" - "08746573743431333500a72008746573743431333600a82008746573743431333700a92008746573743431333800aa" - "2008746573743431333900ab2008746573743431343000ac2008746573743431343100ad2008746573743431343200" - "ae2008746573743431343300af2008746573743431343400b02008746573743431343500b120087465737434313436" - "00b22008746573743431343700b32008746573743431343800b42008746573743431343900b5200874657374343135" - "3000b62008746573743431353100b72008746573743431353200b82008746573743431353300b92008746573743431" - "353400ba2008746573743431353500bb2008746573743431353600bc2008746573743431353700bd20087465737434" - "31353800be2008746573743431353900bf2008746573743431363000c02008746573743431363100c1200874657374" - "3431363200c22008746573743431363300c32008746573743431363400c42008746573743431363500c52008746573" - "743431363600c62008746573743431363700c72008746573743431363800c82008746573743431363900c920087465" - "73743431373000ca2008746573743431373100cb2008746573743431373200cc2008746573743431373300cd200874" - "6573743431373400ce2008746573743431373500cf2008746573743431373600d02008746573743431373700d12008" - "746573743431373800d22008746573743431373900d32008746573743431383000d42008746573743431383100d520" - "08746573743431383200d62008746573743431383300d72008746573743431383400d82008746573743431383500d9" - "2008746573743431383600da2008746573743431383700db2008746573743431383800dc2008746573743431383900" - "dd2008746573743431393000de2008746573743431393100df2008746573743431393200e020087465737434313933" - "00e12008746573743431393400e22008746573743431393500e32008746573743431393600e4200874657374343139" - "3700e52008746573743431393800e62008746573743431393900e72008746573743432303000e82008746573743432" - "303100e92008746573743432303200ea2008746573743432303300eb2008746573743432303400ec20087465737434" - "32303500ed2008746573743432303600ee2008746573743432303700ef2008746573743432303800f0200874657374" - "3432303900f12008746573743432313000f22008746573743432313100f32008746573743432313200f42008746573" - "743432313300f52008746573743432313400f62008746573743432313500f72008746573743432313600f820087465" - "73743432313700f92008746573743432313800fa2008746573743432313900fb2008746573743432323000fc200874" - "6573743432323100fd2008746573743432323200fe2008746573743432323300ff2008746573743432323400802108" - "7465737434323235008121087465737434323236008221087465737434323237008321087465737434323238008421" - "0874657374343232390085210874657374343233300086210874657374343233310087210874657374343233320088" - "21087465737434323333008921087465737434323334008a21087465737434323335008b2108746573743432333600" - "8c21087465737434323337008d21087465737434323338008e21087465737434323339008f21087465737434323430" - "0090210874657374343234310091210874657374343234320092210874657374343234330093210874657374343234" - "3400942108746573743432343500952108746573743432343600962108746573743432343700972108746573743432" - "3438009821087465737434323439009921087465737434323530009a21087465737434323531009b21087465737434" - "323532009c21087465737434323533009d21087465737434323534009e21087465737434323535009f210874657374" - "3432353600a02108746573743432353700a12108746573743432353800a22108746573743432353900a32108746573" - "743432363000a42108746573743432363100a52108746573743432363200a62108746573743432363300a721087465" - "73743432363400a82108746573743432363500a92108746573743432363600aa2108746573743432363700ab210874" - "6573743432363800ac2108746573743432363900ad2108746573743432373000ae2108746573743432373100af2108" - "746573743432373200b02108746573743432373300b12108746573743432373400b22108746573743432373500b321" - "08746573743432373600b42108746573743432373700b52108746573743432373800b62108746573743432373900b7" - "2108746573743432383000b82108746573743432383100b92108746573743432383200ba2108746573743432383300" - "bb2108746573743432383400bc2108746573743432383500bd2108746573743432383600be21087465737434323837" - "00bf2108746573743432383800c02108746573743432383900c12108746573743432393000c2210874657374343239" - "3100c32108746573743432393200c42108746573743432393300c52108746573743432393400c62108746573743432" - "393500c72108746573743432393600c82108746573743432393700c92108746573743432393800ca21087465737434" - "32393900cb2108746573743433303000cc2108746573743433303100cd2108746573743433303200ce210874657374" - "3433303300cf2108746573743433303400d02108746573743433303500d12108746573743433303600d22108746573" - "743433303700d32108746573743433303800d42108746573743433303900d52108746573743433313000d621087465" - "73743433313100d72108746573743433313200d82108746573743433313300d92108746573743433313400da210874" - "6573743433313500db2108746573743433313600dc2108746573743433313700dd2108746573743433313800de2108" - "746573743433313900df2108746573743433323000e02108746573743433323100e12108746573743433323200e221" - "08746573743433323300e32108746573743433323400e42108746573743433323500e52108746573743433323600e6" - "2108746573743433323700e72108746573743433323800e82108746573743433323900e92108746573743433333000" - "ea2108746573743433333100eb2108746573743433333200ec2108746573743433333300ed21087465737434333334" - "00ee2108746573743433333500ef2108746573743433333600f02108746573743433333700f1210874657374343333" - "3800f22108746573743433333900f32108746573743433343000f42108746573743433343100f52108746573743433" - "343200f62108746573743433343300f72108746573743433343400f82108746573743433343500f921087465737434" - "33343600fa2108746573743433343700fb2108746573743433343800fc2108746573743433343900fd210874657374" - "3433353000fe2108746573743433353100ff2108746573743433353200802208746573743433353300812208746573" - "7434333534008222087465737434333535008322087465737434333536008422087465737434333537008522087465" - "7374343335380086220874657374343335390087220874657374343336300088220874657374343336310089220874" - "65737434333632008a22087465737434333633008b22087465737434333634008c22087465737434333635008d2208" - "7465737434333636008e22087465737434333637008f22087465737434333638009022087465737434333639009122" - "0874657374343337300092220874657374343337310093220874657374343337320094220874657374343337330095" - "2208746573743433373400962208746573743433373500972208746573743433373600982208746573743433373700" - "9922087465737434333738009a22087465737434333739009b22087465737434333830009c22087465737434333831" - "009d22087465737434333832009e22087465737434333833009f2208746573743433383400a0220874657374343338" - "3500a12208746573743433383600a22208746573743433383700a32208746573743433383800a42208746573743433" - "383900a52208746573743433393000a62208746573743433393100a72208746573743433393200a822087465737434" - "33393300a92208746573743433393400aa2208746573743433393500ab2208746573743433393600ac220874657374" - "3433393700ad2208746573743433393800ae2208746573743433393900af2208746573743434303000b02208746573" - "743434303100b12208746573743434303200b22208746573743434303300b32208746573743434303400b422087465" - "73743434303500b52208746573743434303600b62208746573743434303700b72208746573743434303800b8220874" - "6573743434303900b92208746573743434313000ba2208746573743434313100bb2208746573743434313200bc2208" - "746573743434313300bd2208746573743434313400be2208746573743434313500bf2208746573743434313600c022" - "08746573743434313700c12208746573743434313800c22208746573743434313900c32208746573743434323000c4" - "2208746573743434323100c52208746573743434323200c62208746573743434323300c72208746573743434323400" - "c82208746573743434323500c92208746573743434323600ca2208746573743434323700cb22087465737434343238" - "00cc2208746573743434323900cd2208746573743434333000ce2208746573743434333100cf220874657374343433" - "3200d02208746573743434333300d12208746573743434333400d22208746573743434333500d32208746573743434" - "333600d42208746573743434333700d52208746573743434333800d62208746573743434333900d722087465737434" - "34343000d82208746573743434343100d92208746573743434343200da2208746573743434343300db220874657374" - "3434343400dc2208746573743434343500dd2208746573743434343600de2208746573743434343700df2208746573" - "743434343800e02208746573743434343900e12208746573743434353000e22208746573743434353100e322087465" - "73743434353200e42208746573743434353300e52208746573743434353400e62208746573743434353500e7220874" - "6573743434353600e82208746573743434353700e92208746573743434353800ea2208746573743434353900eb2208" - "746573743434363000ec2208746573743434363100ed2208746573743434363200ee2208746573743434363300ef22" - "08746573743434363400f02208746573743434363500f12208746573743434363600f22208746573743434363700f3" - "2208746573743434363800f42208746573743434363900f52208746573743434373000f62208746573743434373100" - "f72208746573743434373200f82208746573743434373300f92208746573743434373400fa22087465737434343735" - "00fb2208746573743434373600fc2208746573743434373700fd2208746573743434373800fe220874657374343437" - "3900ff2208746573743434383000802308746573743434383100812308746573743434383200822308746573743434" - "3833008323087465737434343834008423087465737434343835008523087465737434343836008623087465737434" - "343837008723087465737434343838008823087465737434343839008923087465737434343930008a230874657374" - "34343931008b23087465737434343932008c23087465737434343933008d23087465737434343934008e2308746573" - "7434343935008f23087465737434343936009023087465737434343937009123087465737434343938009223087465" - "7374343439390093230874657374343530300094230874657374343530310095230874657374343530320096230874" - "65737434353033009723087465737434353034009823087465737434353035009923087465737434353036009a2308" - "7465737434353037009b23087465737434353038009c23087465737434353039009d23087465737434353130009e23" - "087465737434353131009f2308746573743435313200a02308746573743435313300a12308746573743435313400a2" - "2308746573743435313500a32308746573743435313600a42308746573743435313700a52308746573743435313800" - "a62308746573743435313900a72308746573743435323000a82308746573743435323100a923087465737434353232" - "00aa2308746573743435323300ab2308746573743435323400ac2308746573743435323500ad230874657374343532" - "3600ae2308746573743435323700af2308746573743435323800b02308746573743435323900b12308746573743435" - "333000b22308746573743435333100b32308746573743435333200b42308746573743435333300b523087465737434" - "35333400b62308746573743435333500b72308746573743435333600b82308746573743435333700b9230874657374" - "3435333800ba2308746573743435333900bb2308746573743435343000bc2308746573743435343100bd2308746573" - "743435343200be2308746573743435343300bf2308746573743435343400c02308746573743435343500c123087465" - "73743435343600c22308746573743435343700c32308746573743435343800c42308746573743435343900c5230874" - "6573743435353000c62308746573743435353100c72308746573743435353200c82308746573743435353300c92308" - "746573743435353400ca2308746573743435353500cb2308746573743435353600cc2308746573743435353700cd23" - "08746573743435353800ce2308746573743435353900cf2308746573743435363000d02308746573743435363100d1" - "2308746573743435363200d22308746573743435363300d32308746573743435363400d42308746573743435363500" - "d52308746573743435363600d62308746573743435363700d72308746573743435363800d823087465737434353639" - "00d92308746573743435373000da2308746573743435373100db2308746573743435373200dc230874657374343537" - "3300dd2308746573743435373400de2308746573743435373500df2308746573743435373600e02308746573743435" - "373700e12308746573743435373800e22308746573743435373900e32308746573743435383000e423087465737434" - "35383100e52308746573743435383200e62308746573743435383300e72308746573743435383400e8230874657374" - "3435383500e92308746573743435383600ea2308746573743435383700eb2308746573743435383800ec2308746573" - "743435383900ed2308746573743435393000ee2308746573743435393100ef2308746573743435393200f023087465" - "73743435393300f12308746573743435393400f22308746573743435393500f32308746573743435393600f4230874" - "6573743435393700f52308746573743435393800f62308746573743435393900f72308746573743436303000f82308" - "746573743436303100f92308746573743436303200fa2308746573743436303300fb2308746573743436303400fc23" - "08746573743436303500fd2308746573743436303600fe2308746573743436303700ff230874657374343630380080" - "2408746573743436303900812408746573743436313000822408746573743436313100832408746573743436313200" - "8424087465737434363133008524087465737434363134008624087465737434363135008724087465737434363136" - "008824087465737434363137008924087465737434363138008a24087465737434363139008b240874657374343632" - "30008c24087465737434363231008d24087465737434363232008e24087465737434363233008f2408746573743436" - "3234009024087465737434363235009124087465737434363236009224087465737434363237009324087465737434" - "3632380094240874657374343632390095240874657374343633300096240874657374343633310097240874657374" - "34363332009824087465737434363333009924087465737434363334009a24087465737434363335009b2408746573" - "7434363336009c24087465737434363337009d24087465737434363338009e24087465737434363339009f24087465" - "73743436343000a02408746573743436343100a12408746573743436343200a22408746573743436343300a3240874" - "6573743436343400a42408746573743436343500a52408746573743436343600a62408746573743436343700a72408" - "746573743436343800a82408746573743436343900a92408746573743436353000aa2408746573743436353100ab24" - "08746573743436353200ac2408746573743436353300ad2408746573743436353400ae2408746573743436353500af" - "2408746573743436353600b02408746573743436353700b12408746573743436353800b22408746573743436353900" - "b32408746573743436363000b42408746573743436363100b52408746573743436363200b624087465737434363633" - "00b72408746573743436363400b82408746573743436363500b92408746573743436363600ba240874657374343636" - "3700bb2408746573743436363800bc2408746573743436363900bd2408746573743436373000be2408746573743436" - "373100bf2408746573743436373200c02408746573743436373300c12408746573743436373400c224087465737434" - "36373500c32408746573743436373600c42408746573743436373700c52408746573743436373800c6240874657374" - "3436373900c72408746573743436383000c82408746573743436383100c92408746573743436383200ca2408746573" - "743436383300cb2408746573743436383400cc2408746573743436383500cd2408746573743436383600ce24087465" - "73743436383700cf2408746573743436383800d02408746573743436383900d12408746573743436393000d2240874" - "6573743436393100d32408746573743436393200d42408746573743436393300d52408746573743436393400d62408" - "746573743436393500d72408746573743436393600d82408746573743436393700d92408746573743436393800da24" - "08746573743436393900db2408746573743437303000dc2408746573743437303100dd2408746573743437303200de" - "2408746573743437303300df2408746573743437303400e02408746573743437303500e12408746573743437303600" - "e22408746573743437303700e32408746573743437303800e42408746573743437303900e524087465737434373130" - "00e62408746573743437313100e72408746573743437313200e82408746573743437313300e9240874657374343731" - "3400ea2408746573743437313500eb2408746573743437313600ec2408746573743437313700ed2408746573743437" - "313800ee2408746573743437313900ef2408746573743437323000f02408746573743437323100f124087465737434" - "37323200f22408746573743437323300f32408746573743437323400f42408746573743437323500f5240874657374" - "3437323600f62408746573743437323700f72408746573743437323800f82408746573743437323900f92408746573" - "743437333000fa2408746573743437333100fb2408746573743437333200fc2408746573743437333300fd24087465" - "73743437333400fe2408746573743437333500ff240874657374343733360080250874657374343733370081250874" - "6573743437333800822508746573743437333900832508746573743437343000842508746573743437343100852508" - "7465737434373432008625087465737434373433008725087465737434373434008825087465737434373435008925" - "087465737434373436008a25087465737434373437008b25087465737434373438008c25087465737434373439008d" - "25087465737434373530008e25087465737434373531008f2508746573743437353200902508746573743437353300" - "9125087465737434373534009225087465737434373535009325087465737434373536009425087465737434373537" - "0095250874657374343735380096250874657374343735390097250874657374343736300098250874657374343736" - "31009925087465737434373632009a25087465737434373633009b25087465737434373634009c2508746573743437" - "3635009d25087465737434373636009e25087465737434373637009f2508746573743437363800a025087465737434" - "37363900a12508746573743437373000a22508746573743437373100a32508746573743437373200a4250874657374" - "3437373300a52508746573743437373400a62508746573743437373500a72508746573743437373600a82508746573" - "743437373700a92508746573743437373800aa2508746573743437373900ab2508746573743437383000ac25087465" - "73743437383100ad2508746573743437383200ae2508746573743437383300af2508746573743437383400b0250874" - "6573743437383500b12508746573743437383600b22508746573743437383700b32508746573743437383800b42508" - "746573743437383900b52508746573743437393000b62508746573743437393100b72508746573743437393200b825" - "08746573743437393300b92508746573743437393400ba2508746573743437393500bb2508746573743437393600bc" - "2508746573743437393700bd2508746573743437393800be2508746573743437393900bf2508746573743438303000" - "c02508746573743438303100c12508746573743438303200c22508746573743438303300c325087465737434383034" - "00c42508746573743438303500c52508746573743438303600c62508746573743438303700c7250874657374343830" - "3800c82508746573743438303900c92508746573743438313000ca2508746573743438313100cb2508746573743438" - "313200cc2508746573743438313300cd2508746573743438313400ce2508746573743438313500cf25087465737434" - "38313600d02508746573743438313700d12508746573743438313800d22508746573743438313900d3250874657374" - "3438323000d42508746573743438323100d52508746573743438323200d62508746573743438323300d72508746573" - "743438323400d82508746573743438323500d92508746573743438323600da2508746573743438323700db25087465" - "73743438323800dc2508746573743438323900dd2508746573743438333000de2508746573743438333100df250874" - "6573743438333200e02508746573743438333300e12508746573743438333400e22508746573743438333500e32508" - "746573743438333600e42508746573743438333700e52508746573743438333800e62508746573743438333900e725" - "08746573743438343000e82508746573743438343100e92508746573743438343200ea2508746573743438343300eb" - "2508746573743438343400ec2508746573743438343500ed2508746573743438343600ee2508746573743438343700" - "ef2508746573743438343800f02508746573743438343900f12508746573743438353000f225087465737434383531" - "00f32508746573743438353200f42508746573743438353300f52508746573743438353400f6250874657374343835" - "3500f72508746573743438353600f82508746573743438353700f92508746573743438353800fa2508746573743438" - "353900fb2508746573743438363000fc2508746573743438363100fd2508746573743438363200fe25087465737434" - "38363300ff250874657374343836340080260874657374343836350081260874657374343836360082260874657374" - "3438363700832608746573743438363800842608746573743438363900852608746573743438373000862608746573" - "7434383731008726087465737434383732008826087465737434383733008926087465737434383734008a26087465" - "737434383735008b26087465737434383736008c26087465737434383737008d26087465737434383738008e260874" - "65737434383739008f2608746573743438383000902608746573743438383100912608746573743438383200922608" - "7465737434383833009326087465737434383834009426087465737434383835009526087465737434383836009626" - "087465737434383837009726087465737434383838009826087465737434383839009926087465737434383930009a" - "26087465737434383931009b26087465737434383932009c26087465737434383933009d2608746573743438393400" - "9e26087465737434383935009f2608746573743438393600a02608746573743438393700a126087465737434383938" - "00a22608746573743438393900a32608746573743439303000a42608746573743439303100a5260874657374343930" - "3200a62608746573743439303300a72608746573743439303400a82608746573743439303500a92608746573743439" - "303600aa2608746573743439303700ab2608746573743439303800ac2608746573743439303900ad26087465737434" - "39313000ae2608746573743439313100af2608746573743439313200b02608746573743439313300b1260874657374" - "3439313400b22608746573743439313500b32608746573743439313600b42608746573743439313700b52608746573" - "743439313800b62608746573743439313900b72608746573743439323000b82608746573743439323100b926087465" - "73743439323200ba2608746573743439323300bb2608746573743439323400bc2608746573743439323500bd260874" - "6573743439323600be2608746573743439323700bf2608746573743439323800c02608746573743439323900c12608" - "746573743439333000c22608746573743439333100c32608746573743439333200c42608746573743439333300c526" - "08746573743439333400c62608746573743439333500c72608746573743439333600c82608746573743439333700c9" - "2608746573743439333800ca2608746573743439333900cb2608746573743439343000cc2608746573743439343100" - "cd2608746573743439343200ce2608746573743439343300cf2608746573743439343400d026087465737434393435" - "00d12608746573743439343600d22608746573743439343700d32608746573743439343800d4260874657374343934" - "3900d52608746573743439353000d62608746573743439353100d72608746573743439353200d82608746573743439" - "353300d92608746573743439353400da2608746573743439353500db2608746573743439353600dc26087465737434" - "39353700dd2608746573743439353800de2608746573743439353900df2608746573743439363000e0260874657374" - "3439363100e12608746573743439363200e22608746573743439363300e32608746573743439363400e42608746573" - "743439363500e52608746573743439363600e62608746573743439363700e72608746573743439363800e826087465" - "73743439363900e92608746573743439373000ea2608746573743439373100eb2608746573743439373200ec260874" - "6573743439373300ed2608746573743439373400ee2608746573743439373500ef2608746573743439373600f02608" - "746573743439373700f12608746573743439373800f22608746573743439373900f32608746573743439383000f426" - "08746573743439383100f52608746573743439383200f62608746573743439383300f72608746573743439383400f8" - "2608746573743439383500f92608746573743439383600fa2608746573743439383700fb2608746573743439383800" - "fc2608746573743439383900fd2608746573743439393000fe2608746573743439393100ff26087465737434393932" - "0080270874657374343939330081270874657374343939340082270874657374343939350083270874657374343939" - "360084270874657374343939370085270874657374343939380086270874657374343939390087270ac2b802882707" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020" - "016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07002000" - "20016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020" - "0020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700" - "200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b07" - "00200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b" - "0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a" - "0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b0700200020016a0b070020002001" - "6a0b"; - extern std::string const opcReservedHex = "0061736d010000000105016000017f03030200000404017000010503010001060b027f0141000b7e0142000b071401" "10616c6c5f696e737472756374696f6e7300010907010041000b01000a53020400412a0b4c02017f017e0101010101" diff --git a/src/test/app/wasm_fixtures/wat/functions_5k.wat b/src/test/app/wasm_fixtures/wat/functions_5k.wat deleted file mode 100644 index 819472726db..00000000000 --- a/src/test/app/wasm_fixtures/wat/functions_5k.wat +++ /dev/null @@ -1,45002 +0,0 @@ -(module - (func $test0000 (export "test0000") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0001 (export "test0001") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0002 (export "test0002") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0003 (export "test0003") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0004 (export "test0004") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0005 (export "test0005") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0006 (export "test0006") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0007 (export "test0007") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0008 (export "test0008") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0009 (export "test0009") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0010 (export "test0010") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0011 (export "test0011") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0012 (export "test0012") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0013 (export "test0013") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0014 (export "test0014") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0015 (export "test0015") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0016 (export "test0016") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0017 (export "test0017") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0018 (export "test0018") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0019 (export "test0019") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0020 (export "test0020") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0021 (export "test0021") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0022 (export "test0022") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0023 (export "test0023") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0024 (export "test0024") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0025 (export "test0025") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0026 (export "test0026") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0027 (export "test0027") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0028 (export "test0028") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0029 (export "test0029") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0030 (export "test0030") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0031 (export "test0031") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0032 (export "test0032") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0033 (export "test0033") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0034 (export "test0034") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0035 (export "test0035") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0036 (export "test0036") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0037 (export "test0037") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0038 (export "test0038") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0039 (export "test0039") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0040 (export "test0040") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0041 (export "test0041") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0042 (export "test0042") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0043 (export "test0043") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0044 (export "test0044") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0045 (export "test0045") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0046 (export "test0046") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0047 (export "test0047") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0048 (export "test0048") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0049 (export "test0049") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0050 (export "test0050") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0051 (export "test0051") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0052 (export "test0052") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0053 (export "test0053") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0054 (export "test0054") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0055 (export "test0055") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0056 (export "test0056") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0057 (export "test0057") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0058 (export "test0058") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0059 (export "test0059") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0060 (export "test0060") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0061 (export "test0061") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0062 (export "test0062") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0063 (export "test0063") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0064 (export "test0064") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0065 (export "test0065") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0066 (export "test0066") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0067 (export "test0067") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0068 (export "test0068") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0069 (export "test0069") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0070 (export "test0070") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0071 (export "test0071") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0072 (export "test0072") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0073 (export "test0073") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0074 (export "test0074") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0075 (export "test0075") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0076 (export "test0076") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0077 (export "test0077") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0078 (export "test0078") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0079 (export "test0079") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0080 (export "test0080") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0081 (export "test0081") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0082 (export "test0082") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0083 (export "test0083") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0084 (export "test0084") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0085 (export "test0085") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0086 (export "test0086") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0087 (export "test0087") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0088 (export "test0088") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0089 (export "test0089") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0090 (export "test0090") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0091 (export "test0091") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0092 (export "test0092") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0093 (export "test0093") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0094 (export "test0094") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0095 (export "test0095") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0096 (export "test0096") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0097 (export "test0097") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0098 (export "test0098") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0099 (export "test0099") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0100 (export "test0100") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0101 (export "test0101") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0102 (export "test0102") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0103 (export "test0103") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0104 (export "test0104") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0105 (export "test0105") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0106 (export "test0106") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0107 (export "test0107") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0108 (export "test0108") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0109 (export "test0109") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0110 (export "test0110") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0111 (export "test0111") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0112 (export "test0112") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0113 (export "test0113") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0114 (export "test0114") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0115 (export "test0115") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0116 (export "test0116") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0117 (export "test0117") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0118 (export "test0118") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0119 (export "test0119") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0120 (export "test0120") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0121 (export "test0121") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0122 (export "test0122") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0123 (export "test0123") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0124 (export "test0124") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0125 (export "test0125") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0126 (export "test0126") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0127 (export "test0127") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0128 (export "test0128") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0129 (export "test0129") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0130 (export "test0130") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0131 (export "test0131") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0132 (export "test0132") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0133 (export "test0133") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0134 (export "test0134") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0135 (export "test0135") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0136 (export "test0136") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0137 (export "test0137") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0138 (export "test0138") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0139 (export "test0139") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0140 (export "test0140") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0141 (export "test0141") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0142 (export "test0142") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0143 (export "test0143") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0144 (export "test0144") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0145 (export "test0145") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0146 (export "test0146") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0147 (export "test0147") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0148 (export "test0148") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0149 (export "test0149") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0150 (export "test0150") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0151 (export "test0151") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0152 (export "test0152") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0153 (export "test0153") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0154 (export "test0154") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0155 (export "test0155") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0156 (export "test0156") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0157 (export "test0157") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0158 (export "test0158") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0159 (export "test0159") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0160 (export "test0160") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0161 (export "test0161") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0162 (export "test0162") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0163 (export "test0163") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0164 (export "test0164") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0165 (export "test0165") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0166 (export "test0166") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0167 (export "test0167") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0168 (export "test0168") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0169 (export "test0169") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0170 (export "test0170") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0171 (export "test0171") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0172 (export "test0172") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0173 (export "test0173") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0174 (export "test0174") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0175 (export "test0175") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0176 (export "test0176") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0177 (export "test0177") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0178 (export "test0178") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0179 (export "test0179") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0180 (export "test0180") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0181 (export "test0181") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0182 (export "test0182") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0183 (export "test0183") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0184 (export "test0184") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0185 (export "test0185") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0186 (export "test0186") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0187 (export "test0187") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0188 (export "test0188") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0189 (export "test0189") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0190 (export "test0190") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0191 (export "test0191") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0192 (export "test0192") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0193 (export "test0193") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0194 (export "test0194") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0195 (export "test0195") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0196 (export "test0196") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0197 (export "test0197") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0198 (export "test0198") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0199 (export "test0199") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0200 (export "test0200") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0201 (export "test0201") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0202 (export "test0202") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0203 (export "test0203") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0204 (export "test0204") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0205 (export "test0205") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0206 (export "test0206") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0207 (export "test0207") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0208 (export "test0208") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0209 (export "test0209") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0210 (export "test0210") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0211 (export "test0211") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0212 (export "test0212") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0213 (export "test0213") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0214 (export "test0214") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0215 (export "test0215") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0216 (export "test0216") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0217 (export "test0217") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0218 (export "test0218") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0219 (export "test0219") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0220 (export "test0220") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0221 (export "test0221") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0222 (export "test0222") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0223 (export "test0223") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0224 (export "test0224") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0225 (export "test0225") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0226 (export "test0226") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0227 (export "test0227") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0228 (export "test0228") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0229 (export "test0229") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0230 (export "test0230") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0231 (export "test0231") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0232 (export "test0232") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0233 (export "test0233") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0234 (export "test0234") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0235 (export "test0235") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0236 (export "test0236") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0237 (export "test0237") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0238 (export "test0238") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0239 (export "test0239") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0240 (export "test0240") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0241 (export "test0241") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0242 (export "test0242") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0243 (export "test0243") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0244 (export "test0244") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0245 (export "test0245") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0246 (export "test0246") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0247 (export "test0247") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0248 (export "test0248") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0249 (export "test0249") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0250 (export "test0250") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0251 (export "test0251") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0252 (export "test0252") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0253 (export "test0253") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0254 (export "test0254") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0255 (export "test0255") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0256 (export "test0256") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0257 (export "test0257") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0258 (export "test0258") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0259 (export "test0259") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0260 (export "test0260") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0261 (export "test0261") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0262 (export "test0262") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0263 (export "test0263") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0264 (export "test0264") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0265 (export "test0265") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0266 (export "test0266") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0267 (export "test0267") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0268 (export "test0268") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0269 (export "test0269") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0270 (export "test0270") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0271 (export "test0271") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0272 (export "test0272") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0273 (export "test0273") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0274 (export "test0274") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0275 (export "test0275") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0276 (export "test0276") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0277 (export "test0277") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0278 (export "test0278") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0279 (export "test0279") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0280 (export "test0280") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0281 (export "test0281") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0282 (export "test0282") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0283 (export "test0283") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0284 (export "test0284") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0285 (export "test0285") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0286 (export "test0286") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0287 (export "test0287") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0288 (export "test0288") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0289 (export "test0289") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0290 (export "test0290") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0291 (export "test0291") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0292 (export "test0292") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0293 (export "test0293") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0294 (export "test0294") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0295 (export "test0295") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0296 (export "test0296") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0297 (export "test0297") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0298 (export "test0298") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0299 (export "test0299") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0300 (export "test0300") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0301 (export "test0301") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0302 (export "test0302") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0303 (export "test0303") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0304 (export "test0304") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0305 (export "test0305") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0306 (export "test0306") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0307 (export "test0307") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0308 (export "test0308") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0309 (export "test0309") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0310 (export "test0310") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0311 (export "test0311") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0312 (export "test0312") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0313 (export "test0313") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0314 (export "test0314") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0315 (export "test0315") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0316 (export "test0316") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0317 (export "test0317") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0318 (export "test0318") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0319 (export "test0319") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0320 (export "test0320") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0321 (export "test0321") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0322 (export "test0322") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0323 (export "test0323") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0324 (export "test0324") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0325 (export "test0325") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0326 (export "test0326") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0327 (export "test0327") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0328 (export "test0328") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0329 (export "test0329") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0330 (export "test0330") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0331 (export "test0331") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0332 (export "test0332") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0333 (export "test0333") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0334 (export "test0334") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0335 (export "test0335") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0336 (export "test0336") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0337 (export "test0337") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0338 (export "test0338") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0339 (export "test0339") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0340 (export "test0340") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0341 (export "test0341") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0342 (export "test0342") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0343 (export "test0343") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0344 (export "test0344") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0345 (export "test0345") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0346 (export "test0346") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0347 (export "test0347") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0348 (export "test0348") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0349 (export "test0349") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0350 (export "test0350") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0351 (export "test0351") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0352 (export "test0352") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0353 (export "test0353") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0354 (export "test0354") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0355 (export "test0355") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0356 (export "test0356") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0357 (export "test0357") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0358 (export "test0358") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0359 (export "test0359") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0360 (export "test0360") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0361 (export "test0361") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0362 (export "test0362") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0363 (export "test0363") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0364 (export "test0364") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0365 (export "test0365") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0366 (export "test0366") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0367 (export "test0367") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0368 (export "test0368") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0369 (export "test0369") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0370 (export "test0370") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0371 (export "test0371") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0372 (export "test0372") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0373 (export "test0373") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0374 (export "test0374") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0375 (export "test0375") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0376 (export "test0376") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0377 (export "test0377") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0378 (export "test0378") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0379 (export "test0379") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0380 (export "test0380") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0381 (export "test0381") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0382 (export "test0382") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0383 (export "test0383") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0384 (export "test0384") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0385 (export "test0385") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0386 (export "test0386") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0387 (export "test0387") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0388 (export "test0388") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0389 (export "test0389") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0390 (export "test0390") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0391 (export "test0391") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0392 (export "test0392") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0393 (export "test0393") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0394 (export "test0394") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0395 (export "test0395") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0396 (export "test0396") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0397 (export "test0397") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0398 (export "test0398") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0399 (export "test0399") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0400 (export "test0400") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0401 (export "test0401") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0402 (export "test0402") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0403 (export "test0403") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0404 (export "test0404") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0405 (export "test0405") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0406 (export "test0406") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0407 (export "test0407") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0408 (export "test0408") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0409 (export "test0409") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0410 (export "test0410") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0411 (export "test0411") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0412 (export "test0412") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0413 (export "test0413") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0414 (export "test0414") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0415 (export "test0415") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0416 (export "test0416") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0417 (export "test0417") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0418 (export "test0418") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0419 (export "test0419") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0420 (export "test0420") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0421 (export "test0421") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0422 (export "test0422") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0423 (export "test0423") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0424 (export "test0424") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0425 (export "test0425") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0426 (export "test0426") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0427 (export "test0427") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0428 (export "test0428") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0429 (export "test0429") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0430 (export "test0430") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0431 (export "test0431") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0432 (export "test0432") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0433 (export "test0433") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0434 (export "test0434") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0435 (export "test0435") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0436 (export "test0436") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0437 (export "test0437") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0438 (export "test0438") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0439 (export "test0439") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0440 (export "test0440") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0441 (export "test0441") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0442 (export "test0442") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0443 (export "test0443") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0444 (export "test0444") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0445 (export "test0445") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0446 (export "test0446") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0447 (export "test0447") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0448 (export "test0448") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0449 (export "test0449") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0450 (export "test0450") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0451 (export "test0451") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0452 (export "test0452") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0453 (export "test0453") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0454 (export "test0454") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0455 (export "test0455") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0456 (export "test0456") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0457 (export "test0457") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0458 (export "test0458") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0459 (export "test0459") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0460 (export "test0460") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0461 (export "test0461") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0462 (export "test0462") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0463 (export "test0463") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0464 (export "test0464") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0465 (export "test0465") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0466 (export "test0466") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0467 (export "test0467") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0468 (export "test0468") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0469 (export "test0469") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0470 (export "test0470") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0471 (export "test0471") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0472 (export "test0472") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0473 (export "test0473") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0474 (export "test0474") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0475 (export "test0475") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0476 (export "test0476") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0477 (export "test0477") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0478 (export "test0478") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0479 (export "test0479") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0480 (export "test0480") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0481 (export "test0481") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0482 (export "test0482") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0483 (export "test0483") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0484 (export "test0484") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0485 (export "test0485") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0486 (export "test0486") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0487 (export "test0487") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0488 (export "test0488") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0489 (export "test0489") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0490 (export "test0490") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0491 (export "test0491") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0492 (export "test0492") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0493 (export "test0493") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0494 (export "test0494") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0495 (export "test0495") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0496 (export "test0496") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0497 (export "test0497") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0498 (export "test0498") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0499 (export "test0499") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0500 (export "test0500") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0501 (export "test0501") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0502 (export "test0502") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0503 (export "test0503") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0504 (export "test0504") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0505 (export "test0505") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0506 (export "test0506") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0507 (export "test0507") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0508 (export "test0508") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0509 (export "test0509") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0510 (export "test0510") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0511 (export "test0511") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0512 (export "test0512") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0513 (export "test0513") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0514 (export "test0514") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0515 (export "test0515") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0516 (export "test0516") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0517 (export "test0517") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0518 (export "test0518") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0519 (export "test0519") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0520 (export "test0520") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0521 (export "test0521") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0522 (export "test0522") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0523 (export "test0523") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0524 (export "test0524") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0525 (export "test0525") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0526 (export "test0526") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0527 (export "test0527") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0528 (export "test0528") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0529 (export "test0529") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0530 (export "test0530") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0531 (export "test0531") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0532 (export "test0532") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0533 (export "test0533") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0534 (export "test0534") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0535 (export "test0535") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0536 (export "test0536") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0537 (export "test0537") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0538 (export "test0538") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0539 (export "test0539") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0540 (export "test0540") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0541 (export "test0541") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0542 (export "test0542") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0543 (export "test0543") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0544 (export "test0544") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0545 (export "test0545") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0546 (export "test0546") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0547 (export "test0547") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0548 (export "test0548") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0549 (export "test0549") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0550 (export "test0550") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0551 (export "test0551") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0552 (export "test0552") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0553 (export "test0553") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0554 (export "test0554") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0555 (export "test0555") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0556 (export "test0556") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0557 (export "test0557") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0558 (export "test0558") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0559 (export "test0559") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0560 (export "test0560") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0561 (export "test0561") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0562 (export "test0562") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0563 (export "test0563") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0564 (export "test0564") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0565 (export "test0565") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0566 (export "test0566") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0567 (export "test0567") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0568 (export "test0568") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0569 (export "test0569") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0570 (export "test0570") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0571 (export "test0571") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0572 (export "test0572") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0573 (export "test0573") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0574 (export "test0574") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0575 (export "test0575") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0576 (export "test0576") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0577 (export "test0577") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0578 (export "test0578") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0579 (export "test0579") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0580 (export "test0580") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0581 (export "test0581") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0582 (export "test0582") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0583 (export "test0583") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0584 (export "test0584") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0585 (export "test0585") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0586 (export "test0586") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0587 (export "test0587") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0588 (export "test0588") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0589 (export "test0589") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0590 (export "test0590") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0591 (export "test0591") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0592 (export "test0592") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0593 (export "test0593") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0594 (export "test0594") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0595 (export "test0595") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0596 (export "test0596") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0597 (export "test0597") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0598 (export "test0598") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0599 (export "test0599") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0600 (export "test0600") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0601 (export "test0601") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0602 (export "test0602") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0603 (export "test0603") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0604 (export "test0604") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0605 (export "test0605") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0606 (export "test0606") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0607 (export "test0607") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0608 (export "test0608") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0609 (export "test0609") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0610 (export "test0610") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0611 (export "test0611") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0612 (export "test0612") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0613 (export "test0613") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0614 (export "test0614") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0615 (export "test0615") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0616 (export "test0616") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0617 (export "test0617") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0618 (export "test0618") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0619 (export "test0619") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0620 (export "test0620") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0621 (export "test0621") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0622 (export "test0622") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0623 (export "test0623") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0624 (export "test0624") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0625 (export "test0625") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0626 (export "test0626") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0627 (export "test0627") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0628 (export "test0628") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0629 (export "test0629") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0630 (export "test0630") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0631 (export "test0631") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0632 (export "test0632") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0633 (export "test0633") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0634 (export "test0634") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0635 (export "test0635") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0636 (export "test0636") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0637 (export "test0637") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0638 (export "test0638") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0639 (export "test0639") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0640 (export "test0640") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0641 (export "test0641") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0642 (export "test0642") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0643 (export "test0643") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0644 (export "test0644") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0645 (export "test0645") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0646 (export "test0646") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0647 (export "test0647") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0648 (export "test0648") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0649 (export "test0649") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0650 (export "test0650") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0651 (export "test0651") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0652 (export "test0652") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0653 (export "test0653") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0654 (export "test0654") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0655 (export "test0655") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0656 (export "test0656") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0657 (export "test0657") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0658 (export "test0658") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0659 (export "test0659") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0660 (export "test0660") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0661 (export "test0661") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0662 (export "test0662") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0663 (export "test0663") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0664 (export "test0664") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0665 (export "test0665") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0666 (export "test0666") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0667 (export "test0667") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0668 (export "test0668") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0669 (export "test0669") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0670 (export "test0670") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0671 (export "test0671") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0672 (export "test0672") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0673 (export "test0673") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0674 (export "test0674") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0675 (export "test0675") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0676 (export "test0676") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0677 (export "test0677") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0678 (export "test0678") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0679 (export "test0679") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0680 (export "test0680") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0681 (export "test0681") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0682 (export "test0682") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0683 (export "test0683") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0684 (export "test0684") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0685 (export "test0685") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0686 (export "test0686") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0687 (export "test0687") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0688 (export "test0688") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0689 (export "test0689") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0690 (export "test0690") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0691 (export "test0691") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0692 (export "test0692") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0693 (export "test0693") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0694 (export "test0694") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0695 (export "test0695") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0696 (export "test0696") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0697 (export "test0697") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0698 (export "test0698") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0699 (export "test0699") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0700 (export "test0700") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0701 (export "test0701") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0702 (export "test0702") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0703 (export "test0703") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0704 (export "test0704") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0705 (export "test0705") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0706 (export "test0706") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0707 (export "test0707") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0708 (export "test0708") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0709 (export "test0709") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0710 (export "test0710") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0711 (export "test0711") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0712 (export "test0712") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0713 (export "test0713") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0714 (export "test0714") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0715 (export "test0715") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0716 (export "test0716") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0717 (export "test0717") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0718 (export "test0718") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0719 (export "test0719") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0720 (export "test0720") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0721 (export "test0721") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0722 (export "test0722") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0723 (export "test0723") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0724 (export "test0724") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0725 (export "test0725") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0726 (export "test0726") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0727 (export "test0727") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0728 (export "test0728") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0729 (export "test0729") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0730 (export "test0730") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0731 (export "test0731") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0732 (export "test0732") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0733 (export "test0733") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0734 (export "test0734") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0735 (export "test0735") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0736 (export "test0736") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0737 (export "test0737") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0738 (export "test0738") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0739 (export "test0739") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0740 (export "test0740") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0741 (export "test0741") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0742 (export "test0742") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0743 (export "test0743") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0744 (export "test0744") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0745 (export "test0745") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0746 (export "test0746") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0747 (export "test0747") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0748 (export "test0748") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0749 (export "test0749") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0750 (export "test0750") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0751 (export "test0751") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0752 (export "test0752") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0753 (export "test0753") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0754 (export "test0754") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0755 (export "test0755") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0756 (export "test0756") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0757 (export "test0757") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0758 (export "test0758") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0759 (export "test0759") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0760 (export "test0760") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0761 (export "test0761") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0762 (export "test0762") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0763 (export "test0763") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0764 (export "test0764") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0765 (export "test0765") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0766 (export "test0766") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0767 (export "test0767") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0768 (export "test0768") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0769 (export "test0769") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0770 (export "test0770") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0771 (export "test0771") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0772 (export "test0772") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0773 (export "test0773") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0774 (export "test0774") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0775 (export "test0775") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0776 (export "test0776") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0777 (export "test0777") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0778 (export "test0778") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0779 (export "test0779") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0780 (export "test0780") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0781 (export "test0781") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0782 (export "test0782") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0783 (export "test0783") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0784 (export "test0784") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0785 (export "test0785") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0786 (export "test0786") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0787 (export "test0787") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0788 (export "test0788") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0789 (export "test0789") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0790 (export "test0790") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0791 (export "test0791") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0792 (export "test0792") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0793 (export "test0793") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0794 (export "test0794") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0795 (export "test0795") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0796 (export "test0796") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0797 (export "test0797") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0798 (export "test0798") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0799 (export "test0799") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0800 (export "test0800") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0801 (export "test0801") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0802 (export "test0802") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0803 (export "test0803") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0804 (export "test0804") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0805 (export "test0805") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0806 (export "test0806") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0807 (export "test0807") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0808 (export "test0808") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0809 (export "test0809") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0810 (export "test0810") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0811 (export "test0811") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0812 (export "test0812") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0813 (export "test0813") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0814 (export "test0814") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0815 (export "test0815") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0816 (export "test0816") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0817 (export "test0817") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0818 (export "test0818") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0819 (export "test0819") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0820 (export "test0820") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0821 (export "test0821") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0822 (export "test0822") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0823 (export "test0823") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0824 (export "test0824") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0825 (export "test0825") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0826 (export "test0826") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0827 (export "test0827") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0828 (export "test0828") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0829 (export "test0829") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0830 (export "test0830") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0831 (export "test0831") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0832 (export "test0832") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0833 (export "test0833") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0834 (export "test0834") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0835 (export "test0835") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0836 (export "test0836") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0837 (export "test0837") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0838 (export "test0838") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0839 (export "test0839") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0840 (export "test0840") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0841 (export "test0841") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0842 (export "test0842") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0843 (export "test0843") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0844 (export "test0844") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0845 (export "test0845") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0846 (export "test0846") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0847 (export "test0847") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0848 (export "test0848") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0849 (export "test0849") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0850 (export "test0850") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0851 (export "test0851") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0852 (export "test0852") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0853 (export "test0853") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0854 (export "test0854") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0855 (export "test0855") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0856 (export "test0856") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0857 (export "test0857") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0858 (export "test0858") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0859 (export "test0859") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0860 (export "test0860") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0861 (export "test0861") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0862 (export "test0862") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0863 (export "test0863") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0864 (export "test0864") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0865 (export "test0865") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0866 (export "test0866") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0867 (export "test0867") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0868 (export "test0868") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0869 (export "test0869") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0870 (export "test0870") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0871 (export "test0871") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0872 (export "test0872") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0873 (export "test0873") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0874 (export "test0874") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0875 (export "test0875") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0876 (export "test0876") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0877 (export "test0877") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0878 (export "test0878") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0879 (export "test0879") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0880 (export "test0880") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0881 (export "test0881") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0882 (export "test0882") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0883 (export "test0883") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0884 (export "test0884") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0885 (export "test0885") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0886 (export "test0886") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0887 (export "test0887") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0888 (export "test0888") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0889 (export "test0889") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0890 (export "test0890") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0891 (export "test0891") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0892 (export "test0892") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0893 (export "test0893") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0894 (export "test0894") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0895 (export "test0895") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0896 (export "test0896") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0897 (export "test0897") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0898 (export "test0898") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0899 (export "test0899") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0900 (export "test0900") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0901 (export "test0901") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0902 (export "test0902") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0903 (export "test0903") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0904 (export "test0904") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0905 (export "test0905") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0906 (export "test0906") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0907 (export "test0907") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0908 (export "test0908") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0909 (export "test0909") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0910 (export "test0910") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0911 (export "test0911") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0912 (export "test0912") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0913 (export "test0913") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0914 (export "test0914") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0915 (export "test0915") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0916 (export "test0916") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0917 (export "test0917") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0918 (export "test0918") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0919 (export "test0919") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0920 (export "test0920") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0921 (export "test0921") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0922 (export "test0922") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0923 (export "test0923") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0924 (export "test0924") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0925 (export "test0925") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0926 (export "test0926") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0927 (export "test0927") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0928 (export "test0928") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0929 (export "test0929") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0930 (export "test0930") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0931 (export "test0931") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0932 (export "test0932") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0933 (export "test0933") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0934 (export "test0934") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0935 (export "test0935") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0936 (export "test0936") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0937 (export "test0937") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0938 (export "test0938") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0939 (export "test0939") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0940 (export "test0940") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0941 (export "test0941") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0942 (export "test0942") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0943 (export "test0943") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0944 (export "test0944") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0945 (export "test0945") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0946 (export "test0946") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0947 (export "test0947") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0948 (export "test0948") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0949 (export "test0949") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0950 (export "test0950") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0951 (export "test0951") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0952 (export "test0952") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0953 (export "test0953") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0954 (export "test0954") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0955 (export "test0955") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0956 (export "test0956") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0957 (export "test0957") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0958 (export "test0958") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0959 (export "test0959") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0960 (export "test0960") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0961 (export "test0961") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0962 (export "test0962") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0963 (export "test0963") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0964 (export "test0964") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0965 (export "test0965") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0966 (export "test0966") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0967 (export "test0967") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0968 (export "test0968") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0969 (export "test0969") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0970 (export "test0970") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0971 (export "test0971") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0972 (export "test0972") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0973 (export "test0973") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0974 (export "test0974") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0975 (export "test0975") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0976 (export "test0976") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0977 (export "test0977") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0978 (export "test0978") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0979 (export "test0979") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0980 (export "test0980") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0981 (export "test0981") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0982 (export "test0982") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0983 (export "test0983") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0984 (export "test0984") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0985 (export "test0985") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0986 (export "test0986") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0987 (export "test0987") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0988 (export "test0988") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0989 (export "test0989") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0990 (export "test0990") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0991 (export "test0991") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0992 (export "test0992") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0993 (export "test0993") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0994 (export "test0994") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0995 (export "test0995") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0996 (export "test0996") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0997 (export "test0997") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0998 (export "test0998") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test0999 (export "test0999") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1000 (export "test1000") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1001 (export "test1001") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1002 (export "test1002") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1003 (export "test1003") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1004 (export "test1004") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1005 (export "test1005") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1006 (export "test1006") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1007 (export "test1007") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1008 (export "test1008") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1009 (export "test1009") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1010 (export "test1010") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1011 (export "test1011") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1012 (export "test1012") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1013 (export "test1013") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1014 (export "test1014") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1015 (export "test1015") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1016 (export "test1016") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1017 (export "test1017") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1018 (export "test1018") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1019 (export "test1019") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1020 (export "test1020") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1021 (export "test1021") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1022 (export "test1022") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1023 (export "test1023") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1024 (export "test1024") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1025 (export "test1025") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1026 (export "test1026") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1027 (export "test1027") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1028 (export "test1028") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1029 (export "test1029") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1030 (export "test1030") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1031 (export "test1031") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1032 (export "test1032") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1033 (export "test1033") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1034 (export "test1034") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1035 (export "test1035") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1036 (export "test1036") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1037 (export "test1037") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1038 (export "test1038") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1039 (export "test1039") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1040 (export "test1040") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1041 (export "test1041") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1042 (export "test1042") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1043 (export "test1043") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1044 (export "test1044") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1045 (export "test1045") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1046 (export "test1046") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1047 (export "test1047") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1048 (export "test1048") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1049 (export "test1049") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1050 (export "test1050") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1051 (export "test1051") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1052 (export "test1052") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1053 (export "test1053") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1054 (export "test1054") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1055 (export "test1055") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1056 (export "test1056") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1057 (export "test1057") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1058 (export "test1058") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1059 (export "test1059") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1060 (export "test1060") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1061 (export "test1061") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1062 (export "test1062") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1063 (export "test1063") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1064 (export "test1064") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1065 (export "test1065") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1066 (export "test1066") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1067 (export "test1067") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1068 (export "test1068") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1069 (export "test1069") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1070 (export "test1070") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1071 (export "test1071") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1072 (export "test1072") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1073 (export "test1073") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1074 (export "test1074") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1075 (export "test1075") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1076 (export "test1076") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1077 (export "test1077") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1078 (export "test1078") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1079 (export "test1079") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1080 (export "test1080") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1081 (export "test1081") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1082 (export "test1082") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1083 (export "test1083") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1084 (export "test1084") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1085 (export "test1085") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1086 (export "test1086") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1087 (export "test1087") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1088 (export "test1088") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1089 (export "test1089") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1090 (export "test1090") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1091 (export "test1091") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1092 (export "test1092") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1093 (export "test1093") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1094 (export "test1094") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1095 (export "test1095") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1096 (export "test1096") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1097 (export "test1097") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1098 (export "test1098") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1099 (export "test1099") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1100 (export "test1100") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1101 (export "test1101") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1102 (export "test1102") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1103 (export "test1103") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1104 (export "test1104") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1105 (export "test1105") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1106 (export "test1106") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1107 (export "test1107") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1108 (export "test1108") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1109 (export "test1109") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1110 (export "test1110") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1111 (export "test1111") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1112 (export "test1112") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1113 (export "test1113") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1114 (export "test1114") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1115 (export "test1115") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1116 (export "test1116") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1117 (export "test1117") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1118 (export "test1118") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1119 (export "test1119") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1120 (export "test1120") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1121 (export "test1121") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1122 (export "test1122") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1123 (export "test1123") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1124 (export "test1124") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1125 (export "test1125") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1126 (export "test1126") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1127 (export "test1127") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1128 (export "test1128") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1129 (export "test1129") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1130 (export "test1130") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1131 (export "test1131") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1132 (export "test1132") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1133 (export "test1133") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1134 (export "test1134") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1135 (export "test1135") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1136 (export "test1136") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1137 (export "test1137") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1138 (export "test1138") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1139 (export "test1139") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1140 (export "test1140") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1141 (export "test1141") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1142 (export "test1142") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1143 (export "test1143") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1144 (export "test1144") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1145 (export "test1145") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1146 (export "test1146") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1147 (export "test1147") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1148 (export "test1148") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1149 (export "test1149") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1150 (export "test1150") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1151 (export "test1151") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1152 (export "test1152") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1153 (export "test1153") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1154 (export "test1154") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1155 (export "test1155") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1156 (export "test1156") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1157 (export "test1157") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1158 (export "test1158") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1159 (export "test1159") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1160 (export "test1160") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1161 (export "test1161") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1162 (export "test1162") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1163 (export "test1163") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1164 (export "test1164") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1165 (export "test1165") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1166 (export "test1166") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1167 (export "test1167") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1168 (export "test1168") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1169 (export "test1169") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1170 (export "test1170") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1171 (export "test1171") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1172 (export "test1172") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1173 (export "test1173") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1174 (export "test1174") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1175 (export "test1175") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1176 (export "test1176") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1177 (export "test1177") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1178 (export "test1178") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1179 (export "test1179") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1180 (export "test1180") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1181 (export "test1181") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1182 (export "test1182") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1183 (export "test1183") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1184 (export "test1184") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1185 (export "test1185") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1186 (export "test1186") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1187 (export "test1187") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1188 (export "test1188") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1189 (export "test1189") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1190 (export "test1190") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1191 (export "test1191") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1192 (export "test1192") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1193 (export "test1193") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1194 (export "test1194") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1195 (export "test1195") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1196 (export "test1196") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1197 (export "test1197") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1198 (export "test1198") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1199 (export "test1199") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1200 (export "test1200") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1201 (export "test1201") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1202 (export "test1202") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1203 (export "test1203") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1204 (export "test1204") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1205 (export "test1205") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1206 (export "test1206") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1207 (export "test1207") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1208 (export "test1208") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1209 (export "test1209") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1210 (export "test1210") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1211 (export "test1211") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1212 (export "test1212") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1213 (export "test1213") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1214 (export "test1214") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1215 (export "test1215") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1216 (export "test1216") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1217 (export "test1217") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1218 (export "test1218") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1219 (export "test1219") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1220 (export "test1220") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1221 (export "test1221") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1222 (export "test1222") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1223 (export "test1223") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1224 (export "test1224") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1225 (export "test1225") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1226 (export "test1226") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1227 (export "test1227") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1228 (export "test1228") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1229 (export "test1229") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1230 (export "test1230") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1231 (export "test1231") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1232 (export "test1232") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1233 (export "test1233") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1234 (export "test1234") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1235 (export "test1235") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1236 (export "test1236") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1237 (export "test1237") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1238 (export "test1238") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1239 (export "test1239") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1240 (export "test1240") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1241 (export "test1241") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1242 (export "test1242") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1243 (export "test1243") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1244 (export "test1244") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1245 (export "test1245") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1246 (export "test1246") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1247 (export "test1247") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1248 (export "test1248") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1249 (export "test1249") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1250 (export "test1250") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1251 (export "test1251") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1252 (export "test1252") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1253 (export "test1253") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1254 (export "test1254") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1255 (export "test1255") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1256 (export "test1256") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1257 (export "test1257") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1258 (export "test1258") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1259 (export "test1259") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1260 (export "test1260") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1261 (export "test1261") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1262 (export "test1262") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1263 (export "test1263") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1264 (export "test1264") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1265 (export "test1265") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1266 (export "test1266") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1267 (export "test1267") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1268 (export "test1268") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1269 (export "test1269") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1270 (export "test1270") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1271 (export "test1271") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1272 (export "test1272") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1273 (export "test1273") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1274 (export "test1274") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1275 (export "test1275") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1276 (export "test1276") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1277 (export "test1277") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1278 (export "test1278") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1279 (export "test1279") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1280 (export "test1280") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1281 (export "test1281") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1282 (export "test1282") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1283 (export "test1283") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1284 (export "test1284") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1285 (export "test1285") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1286 (export "test1286") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1287 (export "test1287") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1288 (export "test1288") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1289 (export "test1289") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1290 (export "test1290") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1291 (export "test1291") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1292 (export "test1292") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1293 (export "test1293") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1294 (export "test1294") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1295 (export "test1295") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1296 (export "test1296") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1297 (export "test1297") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1298 (export "test1298") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1299 (export "test1299") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1300 (export "test1300") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1301 (export "test1301") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1302 (export "test1302") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1303 (export "test1303") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1304 (export "test1304") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1305 (export "test1305") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1306 (export "test1306") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1307 (export "test1307") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1308 (export "test1308") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1309 (export "test1309") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1310 (export "test1310") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1311 (export "test1311") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1312 (export "test1312") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1313 (export "test1313") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1314 (export "test1314") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1315 (export "test1315") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1316 (export "test1316") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1317 (export "test1317") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1318 (export "test1318") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1319 (export "test1319") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1320 (export "test1320") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1321 (export "test1321") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1322 (export "test1322") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1323 (export "test1323") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1324 (export "test1324") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1325 (export "test1325") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1326 (export "test1326") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1327 (export "test1327") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1328 (export "test1328") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1329 (export "test1329") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1330 (export "test1330") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1331 (export "test1331") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1332 (export "test1332") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1333 (export "test1333") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1334 (export "test1334") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1335 (export "test1335") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1336 (export "test1336") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1337 (export "test1337") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1338 (export "test1338") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1339 (export "test1339") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1340 (export "test1340") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1341 (export "test1341") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1342 (export "test1342") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1343 (export "test1343") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1344 (export "test1344") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1345 (export "test1345") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1346 (export "test1346") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1347 (export "test1347") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1348 (export "test1348") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1349 (export "test1349") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1350 (export "test1350") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1351 (export "test1351") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1352 (export "test1352") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1353 (export "test1353") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1354 (export "test1354") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1355 (export "test1355") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1356 (export "test1356") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1357 (export "test1357") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1358 (export "test1358") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1359 (export "test1359") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1360 (export "test1360") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1361 (export "test1361") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1362 (export "test1362") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1363 (export "test1363") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1364 (export "test1364") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1365 (export "test1365") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1366 (export "test1366") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1367 (export "test1367") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1368 (export "test1368") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1369 (export "test1369") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1370 (export "test1370") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1371 (export "test1371") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1372 (export "test1372") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1373 (export "test1373") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1374 (export "test1374") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1375 (export "test1375") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1376 (export "test1376") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1377 (export "test1377") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1378 (export "test1378") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1379 (export "test1379") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1380 (export "test1380") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1381 (export "test1381") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1382 (export "test1382") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1383 (export "test1383") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1384 (export "test1384") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1385 (export "test1385") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1386 (export "test1386") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1387 (export "test1387") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1388 (export "test1388") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1389 (export "test1389") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1390 (export "test1390") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1391 (export "test1391") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1392 (export "test1392") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1393 (export "test1393") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1394 (export "test1394") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1395 (export "test1395") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1396 (export "test1396") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1397 (export "test1397") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1398 (export "test1398") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1399 (export "test1399") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1400 (export "test1400") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1401 (export "test1401") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1402 (export "test1402") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1403 (export "test1403") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1404 (export "test1404") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1405 (export "test1405") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1406 (export "test1406") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1407 (export "test1407") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1408 (export "test1408") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1409 (export "test1409") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1410 (export "test1410") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1411 (export "test1411") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1412 (export "test1412") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1413 (export "test1413") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1414 (export "test1414") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1415 (export "test1415") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1416 (export "test1416") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1417 (export "test1417") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1418 (export "test1418") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1419 (export "test1419") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1420 (export "test1420") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1421 (export "test1421") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1422 (export "test1422") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1423 (export "test1423") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1424 (export "test1424") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1425 (export "test1425") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1426 (export "test1426") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1427 (export "test1427") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1428 (export "test1428") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1429 (export "test1429") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1430 (export "test1430") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1431 (export "test1431") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1432 (export "test1432") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1433 (export "test1433") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1434 (export "test1434") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1435 (export "test1435") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1436 (export "test1436") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1437 (export "test1437") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1438 (export "test1438") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1439 (export "test1439") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1440 (export "test1440") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1441 (export "test1441") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1442 (export "test1442") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1443 (export "test1443") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1444 (export "test1444") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1445 (export "test1445") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1446 (export "test1446") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1447 (export "test1447") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1448 (export "test1448") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1449 (export "test1449") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1450 (export "test1450") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1451 (export "test1451") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1452 (export "test1452") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1453 (export "test1453") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1454 (export "test1454") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1455 (export "test1455") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1456 (export "test1456") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1457 (export "test1457") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1458 (export "test1458") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1459 (export "test1459") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1460 (export "test1460") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1461 (export "test1461") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1462 (export "test1462") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1463 (export "test1463") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1464 (export "test1464") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1465 (export "test1465") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1466 (export "test1466") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1467 (export "test1467") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1468 (export "test1468") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1469 (export "test1469") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1470 (export "test1470") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1471 (export "test1471") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1472 (export "test1472") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1473 (export "test1473") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1474 (export "test1474") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1475 (export "test1475") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1476 (export "test1476") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1477 (export "test1477") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1478 (export "test1478") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1479 (export "test1479") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1480 (export "test1480") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1481 (export "test1481") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1482 (export "test1482") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1483 (export "test1483") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1484 (export "test1484") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1485 (export "test1485") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1486 (export "test1486") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1487 (export "test1487") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1488 (export "test1488") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1489 (export "test1489") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1490 (export "test1490") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1491 (export "test1491") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1492 (export "test1492") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1493 (export "test1493") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1494 (export "test1494") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1495 (export "test1495") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1496 (export "test1496") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1497 (export "test1497") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1498 (export "test1498") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1499 (export "test1499") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1500 (export "test1500") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1501 (export "test1501") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1502 (export "test1502") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1503 (export "test1503") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1504 (export "test1504") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1505 (export "test1505") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1506 (export "test1506") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1507 (export "test1507") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1508 (export "test1508") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1509 (export "test1509") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1510 (export "test1510") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1511 (export "test1511") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1512 (export "test1512") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1513 (export "test1513") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1514 (export "test1514") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1515 (export "test1515") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1516 (export "test1516") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1517 (export "test1517") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1518 (export "test1518") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1519 (export "test1519") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1520 (export "test1520") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1521 (export "test1521") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1522 (export "test1522") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1523 (export "test1523") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1524 (export "test1524") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1525 (export "test1525") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1526 (export "test1526") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1527 (export "test1527") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1528 (export "test1528") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1529 (export "test1529") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1530 (export "test1530") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1531 (export "test1531") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1532 (export "test1532") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1533 (export "test1533") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1534 (export "test1534") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1535 (export "test1535") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1536 (export "test1536") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1537 (export "test1537") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1538 (export "test1538") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1539 (export "test1539") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1540 (export "test1540") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1541 (export "test1541") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1542 (export "test1542") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1543 (export "test1543") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1544 (export "test1544") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1545 (export "test1545") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1546 (export "test1546") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1547 (export "test1547") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1548 (export "test1548") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1549 (export "test1549") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1550 (export "test1550") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1551 (export "test1551") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1552 (export "test1552") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1553 (export "test1553") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1554 (export "test1554") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1555 (export "test1555") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1556 (export "test1556") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1557 (export "test1557") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1558 (export "test1558") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1559 (export "test1559") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1560 (export "test1560") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1561 (export "test1561") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1562 (export "test1562") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1563 (export "test1563") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1564 (export "test1564") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1565 (export "test1565") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1566 (export "test1566") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1567 (export "test1567") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1568 (export "test1568") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1569 (export "test1569") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1570 (export "test1570") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1571 (export "test1571") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1572 (export "test1572") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1573 (export "test1573") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1574 (export "test1574") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1575 (export "test1575") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1576 (export "test1576") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1577 (export "test1577") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1578 (export "test1578") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1579 (export "test1579") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1580 (export "test1580") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1581 (export "test1581") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1582 (export "test1582") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1583 (export "test1583") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1584 (export "test1584") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1585 (export "test1585") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1586 (export "test1586") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1587 (export "test1587") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1588 (export "test1588") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1589 (export "test1589") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1590 (export "test1590") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1591 (export "test1591") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1592 (export "test1592") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1593 (export "test1593") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1594 (export "test1594") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1595 (export "test1595") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1596 (export "test1596") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1597 (export "test1597") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1598 (export "test1598") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1599 (export "test1599") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1600 (export "test1600") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1601 (export "test1601") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1602 (export "test1602") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1603 (export "test1603") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1604 (export "test1604") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1605 (export "test1605") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1606 (export "test1606") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1607 (export "test1607") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1608 (export "test1608") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1609 (export "test1609") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1610 (export "test1610") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1611 (export "test1611") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1612 (export "test1612") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1613 (export "test1613") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1614 (export "test1614") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1615 (export "test1615") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1616 (export "test1616") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1617 (export "test1617") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1618 (export "test1618") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1619 (export "test1619") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1620 (export "test1620") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1621 (export "test1621") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1622 (export "test1622") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1623 (export "test1623") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1624 (export "test1624") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1625 (export "test1625") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1626 (export "test1626") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1627 (export "test1627") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1628 (export "test1628") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1629 (export "test1629") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1630 (export "test1630") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1631 (export "test1631") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1632 (export "test1632") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1633 (export "test1633") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1634 (export "test1634") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1635 (export "test1635") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1636 (export "test1636") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1637 (export "test1637") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1638 (export "test1638") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1639 (export "test1639") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1640 (export "test1640") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1641 (export "test1641") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1642 (export "test1642") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1643 (export "test1643") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1644 (export "test1644") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1645 (export "test1645") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1646 (export "test1646") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1647 (export "test1647") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1648 (export "test1648") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1649 (export "test1649") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1650 (export "test1650") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1651 (export "test1651") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1652 (export "test1652") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1653 (export "test1653") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1654 (export "test1654") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1655 (export "test1655") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1656 (export "test1656") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1657 (export "test1657") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1658 (export "test1658") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1659 (export "test1659") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1660 (export "test1660") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1661 (export "test1661") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1662 (export "test1662") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1663 (export "test1663") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1664 (export "test1664") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1665 (export "test1665") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1666 (export "test1666") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1667 (export "test1667") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1668 (export "test1668") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1669 (export "test1669") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1670 (export "test1670") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1671 (export "test1671") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1672 (export "test1672") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1673 (export "test1673") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1674 (export "test1674") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1675 (export "test1675") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1676 (export "test1676") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1677 (export "test1677") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1678 (export "test1678") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1679 (export "test1679") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1680 (export "test1680") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1681 (export "test1681") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1682 (export "test1682") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1683 (export "test1683") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1684 (export "test1684") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1685 (export "test1685") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1686 (export "test1686") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1687 (export "test1687") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1688 (export "test1688") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1689 (export "test1689") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1690 (export "test1690") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1691 (export "test1691") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1692 (export "test1692") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1693 (export "test1693") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1694 (export "test1694") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1695 (export "test1695") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1696 (export "test1696") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1697 (export "test1697") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1698 (export "test1698") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1699 (export "test1699") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1700 (export "test1700") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1701 (export "test1701") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1702 (export "test1702") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1703 (export "test1703") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1704 (export "test1704") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1705 (export "test1705") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1706 (export "test1706") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1707 (export "test1707") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1708 (export "test1708") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1709 (export "test1709") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1710 (export "test1710") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1711 (export "test1711") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1712 (export "test1712") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1713 (export "test1713") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1714 (export "test1714") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1715 (export "test1715") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1716 (export "test1716") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1717 (export "test1717") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1718 (export "test1718") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1719 (export "test1719") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1720 (export "test1720") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1721 (export "test1721") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1722 (export "test1722") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1723 (export "test1723") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1724 (export "test1724") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1725 (export "test1725") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1726 (export "test1726") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1727 (export "test1727") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1728 (export "test1728") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1729 (export "test1729") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1730 (export "test1730") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1731 (export "test1731") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1732 (export "test1732") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1733 (export "test1733") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1734 (export "test1734") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1735 (export "test1735") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1736 (export "test1736") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1737 (export "test1737") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1738 (export "test1738") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1739 (export "test1739") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1740 (export "test1740") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1741 (export "test1741") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1742 (export "test1742") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1743 (export "test1743") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1744 (export "test1744") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1745 (export "test1745") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1746 (export "test1746") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1747 (export "test1747") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1748 (export "test1748") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1749 (export "test1749") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1750 (export "test1750") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1751 (export "test1751") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1752 (export "test1752") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1753 (export "test1753") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1754 (export "test1754") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1755 (export "test1755") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1756 (export "test1756") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1757 (export "test1757") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1758 (export "test1758") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1759 (export "test1759") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1760 (export "test1760") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1761 (export "test1761") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1762 (export "test1762") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1763 (export "test1763") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1764 (export "test1764") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1765 (export "test1765") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1766 (export "test1766") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1767 (export "test1767") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1768 (export "test1768") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1769 (export "test1769") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1770 (export "test1770") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1771 (export "test1771") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1772 (export "test1772") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1773 (export "test1773") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1774 (export "test1774") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1775 (export "test1775") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1776 (export "test1776") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1777 (export "test1777") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1778 (export "test1778") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1779 (export "test1779") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1780 (export "test1780") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1781 (export "test1781") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1782 (export "test1782") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1783 (export "test1783") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1784 (export "test1784") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1785 (export "test1785") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1786 (export "test1786") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1787 (export "test1787") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1788 (export "test1788") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1789 (export "test1789") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1790 (export "test1790") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1791 (export "test1791") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1792 (export "test1792") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1793 (export "test1793") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1794 (export "test1794") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1795 (export "test1795") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1796 (export "test1796") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1797 (export "test1797") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1798 (export "test1798") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1799 (export "test1799") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1800 (export "test1800") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1801 (export "test1801") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1802 (export "test1802") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1803 (export "test1803") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1804 (export "test1804") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1805 (export "test1805") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1806 (export "test1806") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1807 (export "test1807") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1808 (export "test1808") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1809 (export "test1809") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1810 (export "test1810") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1811 (export "test1811") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1812 (export "test1812") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1813 (export "test1813") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1814 (export "test1814") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1815 (export "test1815") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1816 (export "test1816") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1817 (export "test1817") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1818 (export "test1818") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1819 (export "test1819") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1820 (export "test1820") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1821 (export "test1821") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1822 (export "test1822") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1823 (export "test1823") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1824 (export "test1824") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1825 (export "test1825") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1826 (export "test1826") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1827 (export "test1827") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1828 (export "test1828") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1829 (export "test1829") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1830 (export "test1830") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1831 (export "test1831") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1832 (export "test1832") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1833 (export "test1833") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1834 (export "test1834") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1835 (export "test1835") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1836 (export "test1836") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1837 (export "test1837") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1838 (export "test1838") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1839 (export "test1839") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1840 (export "test1840") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1841 (export "test1841") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1842 (export "test1842") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1843 (export "test1843") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1844 (export "test1844") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1845 (export "test1845") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1846 (export "test1846") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1847 (export "test1847") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1848 (export "test1848") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1849 (export "test1849") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1850 (export "test1850") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1851 (export "test1851") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1852 (export "test1852") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1853 (export "test1853") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1854 (export "test1854") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1855 (export "test1855") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1856 (export "test1856") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1857 (export "test1857") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1858 (export "test1858") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1859 (export "test1859") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1860 (export "test1860") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1861 (export "test1861") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1862 (export "test1862") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1863 (export "test1863") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1864 (export "test1864") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1865 (export "test1865") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1866 (export "test1866") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1867 (export "test1867") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1868 (export "test1868") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1869 (export "test1869") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1870 (export "test1870") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1871 (export "test1871") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1872 (export "test1872") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1873 (export "test1873") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1874 (export "test1874") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1875 (export "test1875") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1876 (export "test1876") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1877 (export "test1877") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1878 (export "test1878") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1879 (export "test1879") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1880 (export "test1880") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1881 (export "test1881") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1882 (export "test1882") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1883 (export "test1883") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1884 (export "test1884") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1885 (export "test1885") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1886 (export "test1886") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1887 (export "test1887") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1888 (export "test1888") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1889 (export "test1889") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1890 (export "test1890") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1891 (export "test1891") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1892 (export "test1892") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1893 (export "test1893") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1894 (export "test1894") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1895 (export "test1895") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1896 (export "test1896") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1897 (export "test1897") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1898 (export "test1898") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1899 (export "test1899") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1900 (export "test1900") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1901 (export "test1901") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1902 (export "test1902") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1903 (export "test1903") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1904 (export "test1904") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1905 (export "test1905") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1906 (export "test1906") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1907 (export "test1907") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1908 (export "test1908") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1909 (export "test1909") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1910 (export "test1910") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1911 (export "test1911") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1912 (export "test1912") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1913 (export "test1913") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1914 (export "test1914") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1915 (export "test1915") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1916 (export "test1916") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1917 (export "test1917") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1918 (export "test1918") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1919 (export "test1919") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1920 (export "test1920") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1921 (export "test1921") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1922 (export "test1922") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1923 (export "test1923") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1924 (export "test1924") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1925 (export "test1925") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1926 (export "test1926") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1927 (export "test1927") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1928 (export "test1928") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1929 (export "test1929") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1930 (export "test1930") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1931 (export "test1931") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1932 (export "test1932") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1933 (export "test1933") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1934 (export "test1934") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1935 (export "test1935") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1936 (export "test1936") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1937 (export "test1937") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1938 (export "test1938") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1939 (export "test1939") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1940 (export "test1940") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1941 (export "test1941") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1942 (export "test1942") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1943 (export "test1943") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1944 (export "test1944") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1945 (export "test1945") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1946 (export "test1946") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1947 (export "test1947") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1948 (export "test1948") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1949 (export "test1949") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1950 (export "test1950") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1951 (export "test1951") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1952 (export "test1952") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1953 (export "test1953") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1954 (export "test1954") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1955 (export "test1955") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1956 (export "test1956") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1957 (export "test1957") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1958 (export "test1958") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1959 (export "test1959") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1960 (export "test1960") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1961 (export "test1961") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1962 (export "test1962") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1963 (export "test1963") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1964 (export "test1964") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1965 (export "test1965") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1966 (export "test1966") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1967 (export "test1967") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1968 (export "test1968") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1969 (export "test1969") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1970 (export "test1970") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1971 (export "test1971") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1972 (export "test1972") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1973 (export "test1973") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1974 (export "test1974") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1975 (export "test1975") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1976 (export "test1976") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1977 (export "test1977") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1978 (export "test1978") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1979 (export "test1979") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1980 (export "test1980") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1981 (export "test1981") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1982 (export "test1982") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1983 (export "test1983") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1984 (export "test1984") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1985 (export "test1985") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1986 (export "test1986") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1987 (export "test1987") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1988 (export "test1988") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1989 (export "test1989") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1990 (export "test1990") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1991 (export "test1991") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1992 (export "test1992") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1993 (export "test1993") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1994 (export "test1994") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1995 (export "test1995") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1996 (export "test1996") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1997 (export "test1997") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1998 (export "test1998") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test1999 (export "test1999") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2000 (export "test2000") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2001 (export "test2001") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2002 (export "test2002") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2003 (export "test2003") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2004 (export "test2004") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2005 (export "test2005") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2006 (export "test2006") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2007 (export "test2007") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2008 (export "test2008") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2009 (export "test2009") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2010 (export "test2010") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2011 (export "test2011") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2012 (export "test2012") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2013 (export "test2013") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2014 (export "test2014") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2015 (export "test2015") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2016 (export "test2016") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2017 (export "test2017") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2018 (export "test2018") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2019 (export "test2019") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2020 (export "test2020") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2021 (export "test2021") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2022 (export "test2022") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2023 (export "test2023") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2024 (export "test2024") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2025 (export "test2025") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2026 (export "test2026") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2027 (export "test2027") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2028 (export "test2028") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2029 (export "test2029") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2030 (export "test2030") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2031 (export "test2031") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2032 (export "test2032") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2033 (export "test2033") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2034 (export "test2034") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2035 (export "test2035") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2036 (export "test2036") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2037 (export "test2037") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2038 (export "test2038") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2039 (export "test2039") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2040 (export "test2040") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2041 (export "test2041") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2042 (export "test2042") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2043 (export "test2043") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2044 (export "test2044") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2045 (export "test2045") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2046 (export "test2046") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2047 (export "test2047") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2048 (export "test2048") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2049 (export "test2049") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2050 (export "test2050") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2051 (export "test2051") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2052 (export "test2052") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2053 (export "test2053") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2054 (export "test2054") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2055 (export "test2055") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2056 (export "test2056") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2057 (export "test2057") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2058 (export "test2058") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2059 (export "test2059") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2060 (export "test2060") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2061 (export "test2061") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2062 (export "test2062") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2063 (export "test2063") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2064 (export "test2064") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2065 (export "test2065") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2066 (export "test2066") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2067 (export "test2067") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2068 (export "test2068") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2069 (export "test2069") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2070 (export "test2070") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2071 (export "test2071") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2072 (export "test2072") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2073 (export "test2073") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2074 (export "test2074") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2075 (export "test2075") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2076 (export "test2076") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2077 (export "test2077") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2078 (export "test2078") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2079 (export "test2079") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2080 (export "test2080") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2081 (export "test2081") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2082 (export "test2082") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2083 (export "test2083") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2084 (export "test2084") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2085 (export "test2085") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2086 (export "test2086") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2087 (export "test2087") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2088 (export "test2088") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2089 (export "test2089") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2090 (export "test2090") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2091 (export "test2091") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2092 (export "test2092") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2093 (export "test2093") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2094 (export "test2094") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2095 (export "test2095") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2096 (export "test2096") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2097 (export "test2097") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2098 (export "test2098") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2099 (export "test2099") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2100 (export "test2100") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2101 (export "test2101") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2102 (export "test2102") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2103 (export "test2103") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2104 (export "test2104") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2105 (export "test2105") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2106 (export "test2106") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2107 (export "test2107") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2108 (export "test2108") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2109 (export "test2109") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2110 (export "test2110") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2111 (export "test2111") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2112 (export "test2112") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2113 (export "test2113") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2114 (export "test2114") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2115 (export "test2115") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2116 (export "test2116") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2117 (export "test2117") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2118 (export "test2118") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2119 (export "test2119") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2120 (export "test2120") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2121 (export "test2121") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2122 (export "test2122") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2123 (export "test2123") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2124 (export "test2124") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2125 (export "test2125") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2126 (export "test2126") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2127 (export "test2127") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2128 (export "test2128") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2129 (export "test2129") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2130 (export "test2130") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2131 (export "test2131") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2132 (export "test2132") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2133 (export "test2133") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2134 (export "test2134") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2135 (export "test2135") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2136 (export "test2136") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2137 (export "test2137") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2138 (export "test2138") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2139 (export "test2139") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2140 (export "test2140") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2141 (export "test2141") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2142 (export "test2142") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2143 (export "test2143") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2144 (export "test2144") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2145 (export "test2145") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2146 (export "test2146") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2147 (export "test2147") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2148 (export "test2148") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2149 (export "test2149") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2150 (export "test2150") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2151 (export "test2151") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2152 (export "test2152") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2153 (export "test2153") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2154 (export "test2154") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2155 (export "test2155") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2156 (export "test2156") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2157 (export "test2157") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2158 (export "test2158") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2159 (export "test2159") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2160 (export "test2160") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2161 (export "test2161") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2162 (export "test2162") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2163 (export "test2163") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2164 (export "test2164") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2165 (export "test2165") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2166 (export "test2166") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2167 (export "test2167") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2168 (export "test2168") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2169 (export "test2169") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2170 (export "test2170") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2171 (export "test2171") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2172 (export "test2172") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2173 (export "test2173") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2174 (export "test2174") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2175 (export "test2175") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2176 (export "test2176") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2177 (export "test2177") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2178 (export "test2178") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2179 (export "test2179") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2180 (export "test2180") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2181 (export "test2181") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2182 (export "test2182") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2183 (export "test2183") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2184 (export "test2184") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2185 (export "test2185") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2186 (export "test2186") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2187 (export "test2187") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2188 (export "test2188") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2189 (export "test2189") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2190 (export "test2190") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2191 (export "test2191") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2192 (export "test2192") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2193 (export "test2193") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2194 (export "test2194") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2195 (export "test2195") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2196 (export "test2196") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2197 (export "test2197") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2198 (export "test2198") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2199 (export "test2199") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2200 (export "test2200") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2201 (export "test2201") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2202 (export "test2202") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2203 (export "test2203") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2204 (export "test2204") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2205 (export "test2205") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2206 (export "test2206") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2207 (export "test2207") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2208 (export "test2208") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2209 (export "test2209") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2210 (export "test2210") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2211 (export "test2211") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2212 (export "test2212") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2213 (export "test2213") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2214 (export "test2214") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2215 (export "test2215") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2216 (export "test2216") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2217 (export "test2217") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2218 (export "test2218") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2219 (export "test2219") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2220 (export "test2220") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2221 (export "test2221") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2222 (export "test2222") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2223 (export "test2223") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2224 (export "test2224") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2225 (export "test2225") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2226 (export "test2226") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2227 (export "test2227") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2228 (export "test2228") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2229 (export "test2229") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2230 (export "test2230") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2231 (export "test2231") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2232 (export "test2232") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2233 (export "test2233") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2234 (export "test2234") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2235 (export "test2235") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2236 (export "test2236") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2237 (export "test2237") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2238 (export "test2238") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2239 (export "test2239") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2240 (export "test2240") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2241 (export "test2241") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2242 (export "test2242") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2243 (export "test2243") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2244 (export "test2244") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2245 (export "test2245") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2246 (export "test2246") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2247 (export "test2247") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2248 (export "test2248") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2249 (export "test2249") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2250 (export "test2250") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2251 (export "test2251") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2252 (export "test2252") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2253 (export "test2253") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2254 (export "test2254") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2255 (export "test2255") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2256 (export "test2256") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2257 (export "test2257") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2258 (export "test2258") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2259 (export "test2259") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2260 (export "test2260") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2261 (export "test2261") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2262 (export "test2262") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2263 (export "test2263") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2264 (export "test2264") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2265 (export "test2265") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2266 (export "test2266") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2267 (export "test2267") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2268 (export "test2268") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2269 (export "test2269") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2270 (export "test2270") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2271 (export "test2271") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2272 (export "test2272") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2273 (export "test2273") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2274 (export "test2274") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2275 (export "test2275") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2276 (export "test2276") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2277 (export "test2277") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2278 (export "test2278") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2279 (export "test2279") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2280 (export "test2280") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2281 (export "test2281") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2282 (export "test2282") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2283 (export "test2283") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2284 (export "test2284") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2285 (export "test2285") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2286 (export "test2286") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2287 (export "test2287") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2288 (export "test2288") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2289 (export "test2289") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2290 (export "test2290") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2291 (export "test2291") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2292 (export "test2292") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2293 (export "test2293") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2294 (export "test2294") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2295 (export "test2295") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2296 (export "test2296") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2297 (export "test2297") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2298 (export "test2298") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2299 (export "test2299") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2300 (export "test2300") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2301 (export "test2301") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2302 (export "test2302") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2303 (export "test2303") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2304 (export "test2304") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2305 (export "test2305") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2306 (export "test2306") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2307 (export "test2307") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2308 (export "test2308") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2309 (export "test2309") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2310 (export "test2310") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2311 (export "test2311") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2312 (export "test2312") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2313 (export "test2313") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2314 (export "test2314") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2315 (export "test2315") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2316 (export "test2316") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2317 (export "test2317") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2318 (export "test2318") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2319 (export "test2319") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2320 (export "test2320") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2321 (export "test2321") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2322 (export "test2322") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2323 (export "test2323") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2324 (export "test2324") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2325 (export "test2325") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2326 (export "test2326") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2327 (export "test2327") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2328 (export "test2328") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2329 (export "test2329") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2330 (export "test2330") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2331 (export "test2331") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2332 (export "test2332") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2333 (export "test2333") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2334 (export "test2334") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2335 (export "test2335") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2336 (export "test2336") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2337 (export "test2337") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2338 (export "test2338") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2339 (export "test2339") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2340 (export "test2340") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2341 (export "test2341") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2342 (export "test2342") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2343 (export "test2343") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2344 (export "test2344") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2345 (export "test2345") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2346 (export "test2346") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2347 (export "test2347") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2348 (export "test2348") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2349 (export "test2349") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2350 (export "test2350") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2351 (export "test2351") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2352 (export "test2352") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2353 (export "test2353") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2354 (export "test2354") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2355 (export "test2355") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2356 (export "test2356") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2357 (export "test2357") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2358 (export "test2358") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2359 (export "test2359") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2360 (export "test2360") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2361 (export "test2361") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2362 (export "test2362") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2363 (export "test2363") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2364 (export "test2364") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2365 (export "test2365") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2366 (export "test2366") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2367 (export "test2367") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2368 (export "test2368") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2369 (export "test2369") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2370 (export "test2370") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2371 (export "test2371") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2372 (export "test2372") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2373 (export "test2373") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2374 (export "test2374") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2375 (export "test2375") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2376 (export "test2376") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2377 (export "test2377") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2378 (export "test2378") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2379 (export "test2379") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2380 (export "test2380") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2381 (export "test2381") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2382 (export "test2382") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2383 (export "test2383") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2384 (export "test2384") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2385 (export "test2385") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2386 (export "test2386") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2387 (export "test2387") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2388 (export "test2388") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2389 (export "test2389") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2390 (export "test2390") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2391 (export "test2391") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2392 (export "test2392") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2393 (export "test2393") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2394 (export "test2394") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2395 (export "test2395") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2396 (export "test2396") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2397 (export "test2397") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2398 (export "test2398") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2399 (export "test2399") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2400 (export "test2400") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2401 (export "test2401") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2402 (export "test2402") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2403 (export "test2403") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2404 (export "test2404") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2405 (export "test2405") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2406 (export "test2406") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2407 (export "test2407") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2408 (export "test2408") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2409 (export "test2409") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2410 (export "test2410") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2411 (export "test2411") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2412 (export "test2412") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2413 (export "test2413") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2414 (export "test2414") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2415 (export "test2415") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2416 (export "test2416") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2417 (export "test2417") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2418 (export "test2418") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2419 (export "test2419") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2420 (export "test2420") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2421 (export "test2421") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2422 (export "test2422") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2423 (export "test2423") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2424 (export "test2424") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2425 (export "test2425") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2426 (export "test2426") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2427 (export "test2427") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2428 (export "test2428") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2429 (export "test2429") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2430 (export "test2430") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2431 (export "test2431") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2432 (export "test2432") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2433 (export "test2433") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2434 (export "test2434") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2435 (export "test2435") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2436 (export "test2436") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2437 (export "test2437") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2438 (export "test2438") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2439 (export "test2439") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2440 (export "test2440") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2441 (export "test2441") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2442 (export "test2442") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2443 (export "test2443") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2444 (export "test2444") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2445 (export "test2445") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2446 (export "test2446") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2447 (export "test2447") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2448 (export "test2448") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2449 (export "test2449") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2450 (export "test2450") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2451 (export "test2451") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2452 (export "test2452") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2453 (export "test2453") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2454 (export "test2454") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2455 (export "test2455") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2456 (export "test2456") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2457 (export "test2457") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2458 (export "test2458") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2459 (export "test2459") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2460 (export "test2460") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2461 (export "test2461") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2462 (export "test2462") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2463 (export "test2463") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2464 (export "test2464") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2465 (export "test2465") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2466 (export "test2466") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2467 (export "test2467") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2468 (export "test2468") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2469 (export "test2469") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2470 (export "test2470") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2471 (export "test2471") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2472 (export "test2472") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2473 (export "test2473") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2474 (export "test2474") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2475 (export "test2475") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2476 (export "test2476") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2477 (export "test2477") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2478 (export "test2478") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2479 (export "test2479") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2480 (export "test2480") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2481 (export "test2481") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2482 (export "test2482") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2483 (export "test2483") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2484 (export "test2484") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2485 (export "test2485") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2486 (export "test2486") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2487 (export "test2487") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2488 (export "test2488") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2489 (export "test2489") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2490 (export "test2490") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2491 (export "test2491") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2492 (export "test2492") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2493 (export "test2493") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2494 (export "test2494") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2495 (export "test2495") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2496 (export "test2496") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2497 (export "test2497") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2498 (export "test2498") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2499 (export "test2499") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2500 (export "test2500") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2501 (export "test2501") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2502 (export "test2502") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2503 (export "test2503") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2504 (export "test2504") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2505 (export "test2505") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2506 (export "test2506") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2507 (export "test2507") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2508 (export "test2508") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2509 (export "test2509") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2510 (export "test2510") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2511 (export "test2511") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2512 (export "test2512") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2513 (export "test2513") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2514 (export "test2514") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2515 (export "test2515") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2516 (export "test2516") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2517 (export "test2517") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2518 (export "test2518") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2519 (export "test2519") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2520 (export "test2520") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2521 (export "test2521") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2522 (export "test2522") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2523 (export "test2523") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2524 (export "test2524") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2525 (export "test2525") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2526 (export "test2526") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2527 (export "test2527") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2528 (export "test2528") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2529 (export "test2529") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2530 (export "test2530") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2531 (export "test2531") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2532 (export "test2532") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2533 (export "test2533") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2534 (export "test2534") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2535 (export "test2535") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2536 (export "test2536") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2537 (export "test2537") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2538 (export "test2538") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2539 (export "test2539") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2540 (export "test2540") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2541 (export "test2541") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2542 (export "test2542") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2543 (export "test2543") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2544 (export "test2544") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2545 (export "test2545") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2546 (export "test2546") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2547 (export "test2547") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2548 (export "test2548") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2549 (export "test2549") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2550 (export "test2550") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2551 (export "test2551") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2552 (export "test2552") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2553 (export "test2553") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2554 (export "test2554") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2555 (export "test2555") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2556 (export "test2556") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2557 (export "test2557") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2558 (export "test2558") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2559 (export "test2559") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2560 (export "test2560") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2561 (export "test2561") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2562 (export "test2562") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2563 (export "test2563") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2564 (export "test2564") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2565 (export "test2565") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2566 (export "test2566") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2567 (export "test2567") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2568 (export "test2568") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2569 (export "test2569") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2570 (export "test2570") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2571 (export "test2571") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2572 (export "test2572") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2573 (export "test2573") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2574 (export "test2574") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2575 (export "test2575") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2576 (export "test2576") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2577 (export "test2577") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2578 (export "test2578") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2579 (export "test2579") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2580 (export "test2580") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2581 (export "test2581") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2582 (export "test2582") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2583 (export "test2583") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2584 (export "test2584") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2585 (export "test2585") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2586 (export "test2586") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2587 (export "test2587") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2588 (export "test2588") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2589 (export "test2589") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2590 (export "test2590") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2591 (export "test2591") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2592 (export "test2592") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2593 (export "test2593") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2594 (export "test2594") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2595 (export "test2595") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2596 (export "test2596") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2597 (export "test2597") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2598 (export "test2598") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2599 (export "test2599") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2600 (export "test2600") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2601 (export "test2601") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2602 (export "test2602") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2603 (export "test2603") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2604 (export "test2604") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2605 (export "test2605") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2606 (export "test2606") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2607 (export "test2607") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2608 (export "test2608") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2609 (export "test2609") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2610 (export "test2610") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2611 (export "test2611") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2612 (export "test2612") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2613 (export "test2613") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2614 (export "test2614") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2615 (export "test2615") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2616 (export "test2616") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2617 (export "test2617") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2618 (export "test2618") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2619 (export "test2619") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2620 (export "test2620") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2621 (export "test2621") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2622 (export "test2622") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2623 (export "test2623") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2624 (export "test2624") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2625 (export "test2625") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2626 (export "test2626") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2627 (export "test2627") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2628 (export "test2628") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2629 (export "test2629") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2630 (export "test2630") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2631 (export "test2631") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2632 (export "test2632") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2633 (export "test2633") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2634 (export "test2634") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2635 (export "test2635") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2636 (export "test2636") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2637 (export "test2637") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2638 (export "test2638") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2639 (export "test2639") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2640 (export "test2640") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2641 (export "test2641") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2642 (export "test2642") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2643 (export "test2643") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2644 (export "test2644") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2645 (export "test2645") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2646 (export "test2646") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2647 (export "test2647") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2648 (export "test2648") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2649 (export "test2649") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2650 (export "test2650") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2651 (export "test2651") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2652 (export "test2652") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2653 (export "test2653") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2654 (export "test2654") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2655 (export "test2655") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2656 (export "test2656") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2657 (export "test2657") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2658 (export "test2658") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2659 (export "test2659") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2660 (export "test2660") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2661 (export "test2661") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2662 (export "test2662") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2663 (export "test2663") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2664 (export "test2664") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2665 (export "test2665") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2666 (export "test2666") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2667 (export "test2667") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2668 (export "test2668") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2669 (export "test2669") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2670 (export "test2670") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2671 (export "test2671") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2672 (export "test2672") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2673 (export "test2673") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2674 (export "test2674") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2675 (export "test2675") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2676 (export "test2676") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2677 (export "test2677") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2678 (export "test2678") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2679 (export "test2679") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2680 (export "test2680") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2681 (export "test2681") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2682 (export "test2682") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2683 (export "test2683") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2684 (export "test2684") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2685 (export "test2685") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2686 (export "test2686") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2687 (export "test2687") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2688 (export "test2688") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2689 (export "test2689") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2690 (export "test2690") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2691 (export "test2691") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2692 (export "test2692") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2693 (export "test2693") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2694 (export "test2694") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2695 (export "test2695") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2696 (export "test2696") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2697 (export "test2697") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2698 (export "test2698") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2699 (export "test2699") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2700 (export "test2700") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2701 (export "test2701") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2702 (export "test2702") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2703 (export "test2703") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2704 (export "test2704") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2705 (export "test2705") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2706 (export "test2706") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2707 (export "test2707") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2708 (export "test2708") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2709 (export "test2709") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2710 (export "test2710") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2711 (export "test2711") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2712 (export "test2712") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2713 (export "test2713") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2714 (export "test2714") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2715 (export "test2715") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2716 (export "test2716") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2717 (export "test2717") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2718 (export "test2718") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2719 (export "test2719") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2720 (export "test2720") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2721 (export "test2721") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2722 (export "test2722") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2723 (export "test2723") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2724 (export "test2724") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2725 (export "test2725") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2726 (export "test2726") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2727 (export "test2727") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2728 (export "test2728") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2729 (export "test2729") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2730 (export "test2730") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2731 (export "test2731") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2732 (export "test2732") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2733 (export "test2733") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2734 (export "test2734") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2735 (export "test2735") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2736 (export "test2736") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2737 (export "test2737") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2738 (export "test2738") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2739 (export "test2739") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2740 (export "test2740") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2741 (export "test2741") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2742 (export "test2742") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2743 (export "test2743") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2744 (export "test2744") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2745 (export "test2745") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2746 (export "test2746") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2747 (export "test2747") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2748 (export "test2748") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2749 (export "test2749") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2750 (export "test2750") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2751 (export "test2751") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2752 (export "test2752") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2753 (export "test2753") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2754 (export "test2754") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2755 (export "test2755") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2756 (export "test2756") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2757 (export "test2757") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2758 (export "test2758") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2759 (export "test2759") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2760 (export "test2760") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2761 (export "test2761") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2762 (export "test2762") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2763 (export "test2763") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2764 (export "test2764") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2765 (export "test2765") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2766 (export "test2766") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2767 (export "test2767") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2768 (export "test2768") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2769 (export "test2769") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2770 (export "test2770") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2771 (export "test2771") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2772 (export "test2772") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2773 (export "test2773") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2774 (export "test2774") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2775 (export "test2775") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2776 (export "test2776") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2777 (export "test2777") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2778 (export "test2778") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2779 (export "test2779") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2780 (export "test2780") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2781 (export "test2781") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2782 (export "test2782") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2783 (export "test2783") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2784 (export "test2784") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2785 (export "test2785") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2786 (export "test2786") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2787 (export "test2787") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2788 (export "test2788") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2789 (export "test2789") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2790 (export "test2790") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2791 (export "test2791") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2792 (export "test2792") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2793 (export "test2793") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2794 (export "test2794") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2795 (export "test2795") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2796 (export "test2796") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2797 (export "test2797") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2798 (export "test2798") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2799 (export "test2799") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2800 (export "test2800") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2801 (export "test2801") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2802 (export "test2802") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2803 (export "test2803") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2804 (export "test2804") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2805 (export "test2805") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2806 (export "test2806") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2807 (export "test2807") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2808 (export "test2808") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2809 (export "test2809") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2810 (export "test2810") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2811 (export "test2811") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2812 (export "test2812") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2813 (export "test2813") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2814 (export "test2814") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2815 (export "test2815") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2816 (export "test2816") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2817 (export "test2817") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2818 (export "test2818") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2819 (export "test2819") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2820 (export "test2820") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2821 (export "test2821") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2822 (export "test2822") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2823 (export "test2823") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2824 (export "test2824") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2825 (export "test2825") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2826 (export "test2826") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2827 (export "test2827") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2828 (export "test2828") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2829 (export "test2829") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2830 (export "test2830") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2831 (export "test2831") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2832 (export "test2832") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2833 (export "test2833") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2834 (export "test2834") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2835 (export "test2835") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2836 (export "test2836") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2837 (export "test2837") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2838 (export "test2838") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2839 (export "test2839") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2840 (export "test2840") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2841 (export "test2841") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2842 (export "test2842") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2843 (export "test2843") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2844 (export "test2844") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2845 (export "test2845") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2846 (export "test2846") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2847 (export "test2847") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2848 (export "test2848") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2849 (export "test2849") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2850 (export "test2850") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2851 (export "test2851") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2852 (export "test2852") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2853 (export "test2853") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2854 (export "test2854") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2855 (export "test2855") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2856 (export "test2856") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2857 (export "test2857") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2858 (export "test2858") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2859 (export "test2859") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2860 (export "test2860") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2861 (export "test2861") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2862 (export "test2862") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2863 (export "test2863") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2864 (export "test2864") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2865 (export "test2865") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2866 (export "test2866") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2867 (export "test2867") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2868 (export "test2868") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2869 (export "test2869") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2870 (export "test2870") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2871 (export "test2871") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2872 (export "test2872") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2873 (export "test2873") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2874 (export "test2874") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2875 (export "test2875") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2876 (export "test2876") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2877 (export "test2877") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2878 (export "test2878") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2879 (export "test2879") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2880 (export "test2880") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2881 (export "test2881") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2882 (export "test2882") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2883 (export "test2883") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2884 (export "test2884") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2885 (export "test2885") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2886 (export "test2886") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2887 (export "test2887") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2888 (export "test2888") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2889 (export "test2889") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2890 (export "test2890") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2891 (export "test2891") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2892 (export "test2892") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2893 (export "test2893") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2894 (export "test2894") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2895 (export "test2895") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2896 (export "test2896") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2897 (export "test2897") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2898 (export "test2898") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2899 (export "test2899") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2900 (export "test2900") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2901 (export "test2901") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2902 (export "test2902") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2903 (export "test2903") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2904 (export "test2904") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2905 (export "test2905") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2906 (export "test2906") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2907 (export "test2907") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2908 (export "test2908") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2909 (export "test2909") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2910 (export "test2910") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2911 (export "test2911") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2912 (export "test2912") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2913 (export "test2913") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2914 (export "test2914") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2915 (export "test2915") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2916 (export "test2916") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2917 (export "test2917") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2918 (export "test2918") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2919 (export "test2919") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2920 (export "test2920") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2921 (export "test2921") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2922 (export "test2922") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2923 (export "test2923") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2924 (export "test2924") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2925 (export "test2925") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2926 (export "test2926") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2927 (export "test2927") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2928 (export "test2928") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2929 (export "test2929") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2930 (export "test2930") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2931 (export "test2931") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2932 (export "test2932") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2933 (export "test2933") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2934 (export "test2934") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2935 (export "test2935") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2936 (export "test2936") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2937 (export "test2937") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2938 (export "test2938") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2939 (export "test2939") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2940 (export "test2940") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2941 (export "test2941") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2942 (export "test2942") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2943 (export "test2943") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2944 (export "test2944") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2945 (export "test2945") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2946 (export "test2946") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2947 (export "test2947") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2948 (export "test2948") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2949 (export "test2949") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2950 (export "test2950") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2951 (export "test2951") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2952 (export "test2952") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2953 (export "test2953") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2954 (export "test2954") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2955 (export "test2955") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2956 (export "test2956") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2957 (export "test2957") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2958 (export "test2958") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2959 (export "test2959") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2960 (export "test2960") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2961 (export "test2961") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2962 (export "test2962") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2963 (export "test2963") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2964 (export "test2964") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2965 (export "test2965") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2966 (export "test2966") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2967 (export "test2967") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2968 (export "test2968") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2969 (export "test2969") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2970 (export "test2970") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2971 (export "test2971") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2972 (export "test2972") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2973 (export "test2973") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2974 (export "test2974") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2975 (export "test2975") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2976 (export "test2976") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2977 (export "test2977") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2978 (export "test2978") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2979 (export "test2979") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2980 (export "test2980") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2981 (export "test2981") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2982 (export "test2982") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2983 (export "test2983") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2984 (export "test2984") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2985 (export "test2985") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2986 (export "test2986") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2987 (export "test2987") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2988 (export "test2988") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2989 (export "test2989") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2990 (export "test2990") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2991 (export "test2991") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2992 (export "test2992") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2993 (export "test2993") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2994 (export "test2994") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2995 (export "test2995") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2996 (export "test2996") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2997 (export "test2997") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2998 (export "test2998") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test2999 (export "test2999") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3000 (export "test3000") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3001 (export "test3001") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3002 (export "test3002") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3003 (export "test3003") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3004 (export "test3004") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3005 (export "test3005") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3006 (export "test3006") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3007 (export "test3007") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3008 (export "test3008") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3009 (export "test3009") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3010 (export "test3010") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3011 (export "test3011") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3012 (export "test3012") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3013 (export "test3013") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3014 (export "test3014") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3015 (export "test3015") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3016 (export "test3016") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3017 (export "test3017") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3018 (export "test3018") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3019 (export "test3019") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3020 (export "test3020") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3021 (export "test3021") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3022 (export "test3022") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3023 (export "test3023") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3024 (export "test3024") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3025 (export "test3025") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3026 (export "test3026") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3027 (export "test3027") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3028 (export "test3028") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3029 (export "test3029") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3030 (export "test3030") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3031 (export "test3031") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3032 (export "test3032") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3033 (export "test3033") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3034 (export "test3034") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3035 (export "test3035") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3036 (export "test3036") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3037 (export "test3037") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3038 (export "test3038") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3039 (export "test3039") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3040 (export "test3040") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3041 (export "test3041") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3042 (export "test3042") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3043 (export "test3043") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3044 (export "test3044") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3045 (export "test3045") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3046 (export "test3046") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3047 (export "test3047") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3048 (export "test3048") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3049 (export "test3049") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3050 (export "test3050") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3051 (export "test3051") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3052 (export "test3052") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3053 (export "test3053") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3054 (export "test3054") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3055 (export "test3055") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3056 (export "test3056") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3057 (export "test3057") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3058 (export "test3058") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3059 (export "test3059") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3060 (export "test3060") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3061 (export "test3061") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3062 (export "test3062") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3063 (export "test3063") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3064 (export "test3064") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3065 (export "test3065") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3066 (export "test3066") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3067 (export "test3067") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3068 (export "test3068") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3069 (export "test3069") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3070 (export "test3070") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3071 (export "test3071") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3072 (export "test3072") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3073 (export "test3073") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3074 (export "test3074") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3075 (export "test3075") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3076 (export "test3076") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3077 (export "test3077") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3078 (export "test3078") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3079 (export "test3079") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3080 (export "test3080") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3081 (export "test3081") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3082 (export "test3082") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3083 (export "test3083") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3084 (export "test3084") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3085 (export "test3085") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3086 (export "test3086") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3087 (export "test3087") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3088 (export "test3088") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3089 (export "test3089") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3090 (export "test3090") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3091 (export "test3091") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3092 (export "test3092") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3093 (export "test3093") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3094 (export "test3094") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3095 (export "test3095") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3096 (export "test3096") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3097 (export "test3097") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3098 (export "test3098") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3099 (export "test3099") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3100 (export "test3100") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3101 (export "test3101") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3102 (export "test3102") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3103 (export "test3103") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3104 (export "test3104") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3105 (export "test3105") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3106 (export "test3106") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3107 (export "test3107") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3108 (export "test3108") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3109 (export "test3109") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3110 (export "test3110") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3111 (export "test3111") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3112 (export "test3112") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3113 (export "test3113") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3114 (export "test3114") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3115 (export "test3115") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3116 (export "test3116") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3117 (export "test3117") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3118 (export "test3118") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3119 (export "test3119") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3120 (export "test3120") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3121 (export "test3121") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3122 (export "test3122") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3123 (export "test3123") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3124 (export "test3124") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3125 (export "test3125") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3126 (export "test3126") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3127 (export "test3127") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3128 (export "test3128") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3129 (export "test3129") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3130 (export "test3130") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3131 (export "test3131") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3132 (export "test3132") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3133 (export "test3133") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3134 (export "test3134") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3135 (export "test3135") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3136 (export "test3136") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3137 (export "test3137") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3138 (export "test3138") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3139 (export "test3139") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3140 (export "test3140") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3141 (export "test3141") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3142 (export "test3142") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3143 (export "test3143") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3144 (export "test3144") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3145 (export "test3145") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3146 (export "test3146") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3147 (export "test3147") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3148 (export "test3148") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3149 (export "test3149") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3150 (export "test3150") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3151 (export "test3151") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3152 (export "test3152") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3153 (export "test3153") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3154 (export "test3154") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3155 (export "test3155") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3156 (export "test3156") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3157 (export "test3157") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3158 (export "test3158") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3159 (export "test3159") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3160 (export "test3160") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3161 (export "test3161") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3162 (export "test3162") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3163 (export "test3163") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3164 (export "test3164") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3165 (export "test3165") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3166 (export "test3166") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3167 (export "test3167") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3168 (export "test3168") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3169 (export "test3169") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3170 (export "test3170") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3171 (export "test3171") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3172 (export "test3172") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3173 (export "test3173") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3174 (export "test3174") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3175 (export "test3175") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3176 (export "test3176") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3177 (export "test3177") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3178 (export "test3178") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3179 (export "test3179") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3180 (export "test3180") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3181 (export "test3181") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3182 (export "test3182") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3183 (export "test3183") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3184 (export "test3184") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3185 (export "test3185") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3186 (export "test3186") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3187 (export "test3187") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3188 (export "test3188") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3189 (export "test3189") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3190 (export "test3190") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3191 (export "test3191") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3192 (export "test3192") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3193 (export "test3193") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3194 (export "test3194") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3195 (export "test3195") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3196 (export "test3196") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3197 (export "test3197") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3198 (export "test3198") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3199 (export "test3199") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3200 (export "test3200") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3201 (export "test3201") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3202 (export "test3202") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3203 (export "test3203") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3204 (export "test3204") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3205 (export "test3205") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3206 (export "test3206") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3207 (export "test3207") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3208 (export "test3208") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3209 (export "test3209") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3210 (export "test3210") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3211 (export "test3211") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3212 (export "test3212") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3213 (export "test3213") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3214 (export "test3214") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3215 (export "test3215") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3216 (export "test3216") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3217 (export "test3217") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3218 (export "test3218") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3219 (export "test3219") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3220 (export "test3220") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3221 (export "test3221") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3222 (export "test3222") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3223 (export "test3223") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3224 (export "test3224") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3225 (export "test3225") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3226 (export "test3226") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3227 (export "test3227") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3228 (export "test3228") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3229 (export "test3229") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3230 (export "test3230") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3231 (export "test3231") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3232 (export "test3232") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3233 (export "test3233") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3234 (export "test3234") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3235 (export "test3235") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3236 (export "test3236") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3237 (export "test3237") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3238 (export "test3238") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3239 (export "test3239") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3240 (export "test3240") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3241 (export "test3241") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3242 (export "test3242") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3243 (export "test3243") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3244 (export "test3244") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3245 (export "test3245") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3246 (export "test3246") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3247 (export "test3247") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3248 (export "test3248") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3249 (export "test3249") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3250 (export "test3250") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3251 (export "test3251") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3252 (export "test3252") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3253 (export "test3253") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3254 (export "test3254") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3255 (export "test3255") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3256 (export "test3256") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3257 (export "test3257") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3258 (export "test3258") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3259 (export "test3259") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3260 (export "test3260") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3261 (export "test3261") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3262 (export "test3262") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3263 (export "test3263") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3264 (export "test3264") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3265 (export "test3265") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3266 (export "test3266") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3267 (export "test3267") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3268 (export "test3268") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3269 (export "test3269") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3270 (export "test3270") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3271 (export "test3271") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3272 (export "test3272") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3273 (export "test3273") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3274 (export "test3274") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3275 (export "test3275") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3276 (export "test3276") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3277 (export "test3277") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3278 (export "test3278") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3279 (export "test3279") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3280 (export "test3280") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3281 (export "test3281") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3282 (export "test3282") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3283 (export "test3283") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3284 (export "test3284") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3285 (export "test3285") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3286 (export "test3286") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3287 (export "test3287") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3288 (export "test3288") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3289 (export "test3289") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3290 (export "test3290") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3291 (export "test3291") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3292 (export "test3292") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3293 (export "test3293") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3294 (export "test3294") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3295 (export "test3295") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3296 (export "test3296") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3297 (export "test3297") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3298 (export "test3298") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3299 (export "test3299") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3300 (export "test3300") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3301 (export "test3301") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3302 (export "test3302") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3303 (export "test3303") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3304 (export "test3304") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3305 (export "test3305") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3306 (export "test3306") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3307 (export "test3307") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3308 (export "test3308") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3309 (export "test3309") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3310 (export "test3310") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3311 (export "test3311") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3312 (export "test3312") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3313 (export "test3313") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3314 (export "test3314") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3315 (export "test3315") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3316 (export "test3316") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3317 (export "test3317") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3318 (export "test3318") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3319 (export "test3319") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3320 (export "test3320") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3321 (export "test3321") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3322 (export "test3322") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3323 (export "test3323") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3324 (export "test3324") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3325 (export "test3325") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3326 (export "test3326") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3327 (export "test3327") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3328 (export "test3328") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3329 (export "test3329") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3330 (export "test3330") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3331 (export "test3331") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3332 (export "test3332") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3333 (export "test3333") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3334 (export "test3334") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3335 (export "test3335") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3336 (export "test3336") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3337 (export "test3337") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3338 (export "test3338") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3339 (export "test3339") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3340 (export "test3340") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3341 (export "test3341") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3342 (export "test3342") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3343 (export "test3343") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3344 (export "test3344") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3345 (export "test3345") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3346 (export "test3346") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3347 (export "test3347") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3348 (export "test3348") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3349 (export "test3349") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3350 (export "test3350") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3351 (export "test3351") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3352 (export "test3352") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3353 (export "test3353") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3354 (export "test3354") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3355 (export "test3355") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3356 (export "test3356") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3357 (export "test3357") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3358 (export "test3358") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3359 (export "test3359") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3360 (export "test3360") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3361 (export "test3361") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3362 (export "test3362") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3363 (export "test3363") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3364 (export "test3364") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3365 (export "test3365") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3366 (export "test3366") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3367 (export "test3367") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3368 (export "test3368") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3369 (export "test3369") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3370 (export "test3370") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3371 (export "test3371") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3372 (export "test3372") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3373 (export "test3373") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3374 (export "test3374") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3375 (export "test3375") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3376 (export "test3376") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3377 (export "test3377") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3378 (export "test3378") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3379 (export "test3379") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3380 (export "test3380") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3381 (export "test3381") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3382 (export "test3382") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3383 (export "test3383") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3384 (export "test3384") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3385 (export "test3385") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3386 (export "test3386") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3387 (export "test3387") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3388 (export "test3388") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3389 (export "test3389") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3390 (export "test3390") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3391 (export "test3391") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3392 (export "test3392") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3393 (export "test3393") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3394 (export "test3394") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3395 (export "test3395") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3396 (export "test3396") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3397 (export "test3397") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3398 (export "test3398") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3399 (export "test3399") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3400 (export "test3400") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3401 (export "test3401") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3402 (export "test3402") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3403 (export "test3403") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3404 (export "test3404") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3405 (export "test3405") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3406 (export "test3406") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3407 (export "test3407") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3408 (export "test3408") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3409 (export "test3409") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3410 (export "test3410") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3411 (export "test3411") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3412 (export "test3412") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3413 (export "test3413") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3414 (export "test3414") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3415 (export "test3415") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3416 (export "test3416") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3417 (export "test3417") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3418 (export "test3418") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3419 (export "test3419") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3420 (export "test3420") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3421 (export "test3421") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3422 (export "test3422") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3423 (export "test3423") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3424 (export "test3424") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3425 (export "test3425") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3426 (export "test3426") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3427 (export "test3427") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3428 (export "test3428") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3429 (export "test3429") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3430 (export "test3430") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3431 (export "test3431") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3432 (export "test3432") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3433 (export "test3433") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3434 (export "test3434") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3435 (export "test3435") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3436 (export "test3436") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3437 (export "test3437") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3438 (export "test3438") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3439 (export "test3439") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3440 (export "test3440") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3441 (export "test3441") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3442 (export "test3442") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3443 (export "test3443") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3444 (export "test3444") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3445 (export "test3445") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3446 (export "test3446") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3447 (export "test3447") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3448 (export "test3448") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3449 (export "test3449") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3450 (export "test3450") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3451 (export "test3451") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3452 (export "test3452") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3453 (export "test3453") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3454 (export "test3454") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3455 (export "test3455") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3456 (export "test3456") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3457 (export "test3457") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3458 (export "test3458") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3459 (export "test3459") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3460 (export "test3460") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3461 (export "test3461") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3462 (export "test3462") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3463 (export "test3463") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3464 (export "test3464") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3465 (export "test3465") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3466 (export "test3466") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3467 (export "test3467") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3468 (export "test3468") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3469 (export "test3469") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3470 (export "test3470") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3471 (export "test3471") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3472 (export "test3472") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3473 (export "test3473") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3474 (export "test3474") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3475 (export "test3475") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3476 (export "test3476") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3477 (export "test3477") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3478 (export "test3478") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3479 (export "test3479") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3480 (export "test3480") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3481 (export "test3481") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3482 (export "test3482") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3483 (export "test3483") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3484 (export "test3484") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3485 (export "test3485") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3486 (export "test3486") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3487 (export "test3487") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3488 (export "test3488") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3489 (export "test3489") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3490 (export "test3490") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3491 (export "test3491") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3492 (export "test3492") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3493 (export "test3493") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3494 (export "test3494") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3495 (export "test3495") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3496 (export "test3496") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3497 (export "test3497") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3498 (export "test3498") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3499 (export "test3499") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3500 (export "test3500") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3501 (export "test3501") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3502 (export "test3502") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3503 (export "test3503") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3504 (export "test3504") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3505 (export "test3505") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3506 (export "test3506") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3507 (export "test3507") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3508 (export "test3508") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3509 (export "test3509") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3510 (export "test3510") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3511 (export "test3511") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3512 (export "test3512") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3513 (export "test3513") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3514 (export "test3514") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3515 (export "test3515") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3516 (export "test3516") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3517 (export "test3517") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3518 (export "test3518") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3519 (export "test3519") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3520 (export "test3520") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3521 (export "test3521") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3522 (export "test3522") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3523 (export "test3523") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3524 (export "test3524") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3525 (export "test3525") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3526 (export "test3526") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3527 (export "test3527") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3528 (export "test3528") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3529 (export "test3529") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3530 (export "test3530") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3531 (export "test3531") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3532 (export "test3532") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3533 (export "test3533") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3534 (export "test3534") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3535 (export "test3535") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3536 (export "test3536") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3537 (export "test3537") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3538 (export "test3538") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3539 (export "test3539") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3540 (export "test3540") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3541 (export "test3541") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3542 (export "test3542") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3543 (export "test3543") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3544 (export "test3544") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3545 (export "test3545") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3546 (export "test3546") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3547 (export "test3547") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3548 (export "test3548") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3549 (export "test3549") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3550 (export "test3550") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3551 (export "test3551") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3552 (export "test3552") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3553 (export "test3553") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3554 (export "test3554") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3555 (export "test3555") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3556 (export "test3556") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3557 (export "test3557") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3558 (export "test3558") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3559 (export "test3559") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3560 (export "test3560") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3561 (export "test3561") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3562 (export "test3562") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3563 (export "test3563") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3564 (export "test3564") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3565 (export "test3565") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3566 (export "test3566") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3567 (export "test3567") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3568 (export "test3568") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3569 (export "test3569") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3570 (export "test3570") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3571 (export "test3571") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3572 (export "test3572") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3573 (export "test3573") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3574 (export "test3574") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3575 (export "test3575") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3576 (export "test3576") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3577 (export "test3577") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3578 (export "test3578") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3579 (export "test3579") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3580 (export "test3580") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3581 (export "test3581") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3582 (export "test3582") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3583 (export "test3583") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3584 (export "test3584") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3585 (export "test3585") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3586 (export "test3586") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3587 (export "test3587") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3588 (export "test3588") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3589 (export "test3589") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3590 (export "test3590") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3591 (export "test3591") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3592 (export "test3592") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3593 (export "test3593") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3594 (export "test3594") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3595 (export "test3595") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3596 (export "test3596") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3597 (export "test3597") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3598 (export "test3598") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3599 (export "test3599") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3600 (export "test3600") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3601 (export "test3601") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3602 (export "test3602") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3603 (export "test3603") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3604 (export "test3604") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3605 (export "test3605") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3606 (export "test3606") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3607 (export "test3607") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3608 (export "test3608") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3609 (export "test3609") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3610 (export "test3610") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3611 (export "test3611") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3612 (export "test3612") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3613 (export "test3613") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3614 (export "test3614") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3615 (export "test3615") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3616 (export "test3616") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3617 (export "test3617") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3618 (export "test3618") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3619 (export "test3619") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3620 (export "test3620") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3621 (export "test3621") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3622 (export "test3622") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3623 (export "test3623") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3624 (export "test3624") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3625 (export "test3625") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3626 (export "test3626") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3627 (export "test3627") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3628 (export "test3628") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3629 (export "test3629") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3630 (export "test3630") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3631 (export "test3631") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3632 (export "test3632") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3633 (export "test3633") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3634 (export "test3634") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3635 (export "test3635") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3636 (export "test3636") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3637 (export "test3637") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3638 (export "test3638") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3639 (export "test3639") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3640 (export "test3640") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3641 (export "test3641") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3642 (export "test3642") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3643 (export "test3643") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3644 (export "test3644") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3645 (export "test3645") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3646 (export "test3646") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3647 (export "test3647") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3648 (export "test3648") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3649 (export "test3649") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3650 (export "test3650") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3651 (export "test3651") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3652 (export "test3652") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3653 (export "test3653") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3654 (export "test3654") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3655 (export "test3655") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3656 (export "test3656") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3657 (export "test3657") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3658 (export "test3658") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3659 (export "test3659") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3660 (export "test3660") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3661 (export "test3661") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3662 (export "test3662") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3663 (export "test3663") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3664 (export "test3664") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3665 (export "test3665") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3666 (export "test3666") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3667 (export "test3667") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3668 (export "test3668") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3669 (export "test3669") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3670 (export "test3670") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3671 (export "test3671") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3672 (export "test3672") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3673 (export "test3673") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3674 (export "test3674") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3675 (export "test3675") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3676 (export "test3676") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3677 (export "test3677") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3678 (export "test3678") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3679 (export "test3679") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3680 (export "test3680") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3681 (export "test3681") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3682 (export "test3682") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3683 (export "test3683") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3684 (export "test3684") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3685 (export "test3685") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3686 (export "test3686") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3687 (export "test3687") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3688 (export "test3688") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3689 (export "test3689") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3690 (export "test3690") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3691 (export "test3691") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3692 (export "test3692") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3693 (export "test3693") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3694 (export "test3694") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3695 (export "test3695") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3696 (export "test3696") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3697 (export "test3697") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3698 (export "test3698") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3699 (export "test3699") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3700 (export "test3700") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3701 (export "test3701") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3702 (export "test3702") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3703 (export "test3703") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3704 (export "test3704") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3705 (export "test3705") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3706 (export "test3706") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3707 (export "test3707") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3708 (export "test3708") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3709 (export "test3709") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3710 (export "test3710") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3711 (export "test3711") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3712 (export "test3712") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3713 (export "test3713") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3714 (export "test3714") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3715 (export "test3715") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3716 (export "test3716") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3717 (export "test3717") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3718 (export "test3718") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3719 (export "test3719") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3720 (export "test3720") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3721 (export "test3721") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3722 (export "test3722") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3723 (export "test3723") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3724 (export "test3724") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3725 (export "test3725") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3726 (export "test3726") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3727 (export "test3727") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3728 (export "test3728") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3729 (export "test3729") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3730 (export "test3730") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3731 (export "test3731") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3732 (export "test3732") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3733 (export "test3733") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3734 (export "test3734") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3735 (export "test3735") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3736 (export "test3736") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3737 (export "test3737") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3738 (export "test3738") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3739 (export "test3739") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3740 (export "test3740") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3741 (export "test3741") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3742 (export "test3742") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3743 (export "test3743") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3744 (export "test3744") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3745 (export "test3745") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3746 (export "test3746") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3747 (export "test3747") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3748 (export "test3748") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3749 (export "test3749") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3750 (export "test3750") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3751 (export "test3751") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3752 (export "test3752") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3753 (export "test3753") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3754 (export "test3754") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3755 (export "test3755") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3756 (export "test3756") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3757 (export "test3757") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3758 (export "test3758") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3759 (export "test3759") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3760 (export "test3760") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3761 (export "test3761") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3762 (export "test3762") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3763 (export "test3763") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3764 (export "test3764") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3765 (export "test3765") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3766 (export "test3766") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3767 (export "test3767") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3768 (export "test3768") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3769 (export "test3769") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3770 (export "test3770") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3771 (export "test3771") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3772 (export "test3772") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3773 (export "test3773") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3774 (export "test3774") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3775 (export "test3775") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3776 (export "test3776") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3777 (export "test3777") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3778 (export "test3778") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3779 (export "test3779") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3780 (export "test3780") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3781 (export "test3781") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3782 (export "test3782") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3783 (export "test3783") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3784 (export "test3784") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3785 (export "test3785") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3786 (export "test3786") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3787 (export "test3787") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3788 (export "test3788") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3789 (export "test3789") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3790 (export "test3790") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3791 (export "test3791") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3792 (export "test3792") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3793 (export "test3793") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3794 (export "test3794") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3795 (export "test3795") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3796 (export "test3796") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3797 (export "test3797") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3798 (export "test3798") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3799 (export "test3799") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3800 (export "test3800") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3801 (export "test3801") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3802 (export "test3802") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3803 (export "test3803") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3804 (export "test3804") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3805 (export "test3805") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3806 (export "test3806") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3807 (export "test3807") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3808 (export "test3808") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3809 (export "test3809") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3810 (export "test3810") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3811 (export "test3811") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3812 (export "test3812") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3813 (export "test3813") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3814 (export "test3814") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3815 (export "test3815") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3816 (export "test3816") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3817 (export "test3817") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3818 (export "test3818") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3819 (export "test3819") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3820 (export "test3820") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3821 (export "test3821") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3822 (export "test3822") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3823 (export "test3823") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3824 (export "test3824") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3825 (export "test3825") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3826 (export "test3826") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3827 (export "test3827") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3828 (export "test3828") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3829 (export "test3829") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3830 (export "test3830") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3831 (export "test3831") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3832 (export "test3832") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3833 (export "test3833") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3834 (export "test3834") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3835 (export "test3835") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3836 (export "test3836") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3837 (export "test3837") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3838 (export "test3838") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3839 (export "test3839") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3840 (export "test3840") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3841 (export "test3841") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3842 (export "test3842") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3843 (export "test3843") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3844 (export "test3844") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3845 (export "test3845") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3846 (export "test3846") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3847 (export "test3847") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3848 (export "test3848") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3849 (export "test3849") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3850 (export "test3850") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3851 (export "test3851") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3852 (export "test3852") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3853 (export "test3853") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3854 (export "test3854") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3855 (export "test3855") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3856 (export "test3856") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3857 (export "test3857") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3858 (export "test3858") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3859 (export "test3859") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3860 (export "test3860") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3861 (export "test3861") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3862 (export "test3862") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3863 (export "test3863") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3864 (export "test3864") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3865 (export "test3865") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3866 (export "test3866") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3867 (export "test3867") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3868 (export "test3868") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3869 (export "test3869") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3870 (export "test3870") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3871 (export "test3871") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3872 (export "test3872") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3873 (export "test3873") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3874 (export "test3874") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3875 (export "test3875") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3876 (export "test3876") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3877 (export "test3877") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3878 (export "test3878") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3879 (export "test3879") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3880 (export "test3880") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3881 (export "test3881") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3882 (export "test3882") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3883 (export "test3883") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3884 (export "test3884") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3885 (export "test3885") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3886 (export "test3886") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3887 (export "test3887") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3888 (export "test3888") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3889 (export "test3889") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3890 (export "test3890") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3891 (export "test3891") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3892 (export "test3892") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3893 (export "test3893") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3894 (export "test3894") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3895 (export "test3895") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3896 (export "test3896") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3897 (export "test3897") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3898 (export "test3898") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3899 (export "test3899") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3900 (export "test3900") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3901 (export "test3901") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3902 (export "test3902") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3903 (export "test3903") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3904 (export "test3904") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3905 (export "test3905") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3906 (export "test3906") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3907 (export "test3907") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3908 (export "test3908") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3909 (export "test3909") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3910 (export "test3910") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3911 (export "test3911") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3912 (export "test3912") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3913 (export "test3913") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3914 (export "test3914") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3915 (export "test3915") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3916 (export "test3916") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3917 (export "test3917") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3918 (export "test3918") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3919 (export "test3919") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3920 (export "test3920") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3921 (export "test3921") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3922 (export "test3922") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3923 (export "test3923") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3924 (export "test3924") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3925 (export "test3925") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3926 (export "test3926") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3927 (export "test3927") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3928 (export "test3928") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3929 (export "test3929") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3930 (export "test3930") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3931 (export "test3931") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3932 (export "test3932") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3933 (export "test3933") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3934 (export "test3934") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3935 (export "test3935") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3936 (export "test3936") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3937 (export "test3937") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3938 (export "test3938") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3939 (export "test3939") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3940 (export "test3940") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3941 (export "test3941") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3942 (export "test3942") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3943 (export "test3943") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3944 (export "test3944") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3945 (export "test3945") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3946 (export "test3946") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3947 (export "test3947") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3948 (export "test3948") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3949 (export "test3949") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3950 (export "test3950") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3951 (export "test3951") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3952 (export "test3952") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3953 (export "test3953") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3954 (export "test3954") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3955 (export "test3955") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3956 (export "test3956") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3957 (export "test3957") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3958 (export "test3958") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3959 (export "test3959") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3960 (export "test3960") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3961 (export "test3961") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3962 (export "test3962") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3963 (export "test3963") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3964 (export "test3964") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3965 (export "test3965") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3966 (export "test3966") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3967 (export "test3967") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3968 (export "test3968") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3969 (export "test3969") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3970 (export "test3970") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3971 (export "test3971") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3972 (export "test3972") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3973 (export "test3973") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3974 (export "test3974") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3975 (export "test3975") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3976 (export "test3976") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3977 (export "test3977") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3978 (export "test3978") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3979 (export "test3979") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3980 (export "test3980") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3981 (export "test3981") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3982 (export "test3982") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3983 (export "test3983") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3984 (export "test3984") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3985 (export "test3985") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3986 (export "test3986") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3987 (export "test3987") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3988 (export "test3988") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3989 (export "test3989") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3990 (export "test3990") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3991 (export "test3991") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3992 (export "test3992") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3993 (export "test3993") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3994 (export "test3994") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3995 (export "test3995") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3996 (export "test3996") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3997 (export "test3997") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3998 (export "test3998") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test3999 (export "test3999") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4000 (export "test4000") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4001 (export "test4001") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4002 (export "test4002") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4003 (export "test4003") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4004 (export "test4004") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4005 (export "test4005") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4006 (export "test4006") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4007 (export "test4007") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4008 (export "test4008") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4009 (export "test4009") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4010 (export "test4010") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4011 (export "test4011") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4012 (export "test4012") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4013 (export "test4013") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4014 (export "test4014") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4015 (export "test4015") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4016 (export "test4016") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4017 (export "test4017") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4018 (export "test4018") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4019 (export "test4019") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4020 (export "test4020") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4021 (export "test4021") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4022 (export "test4022") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4023 (export "test4023") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4024 (export "test4024") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4025 (export "test4025") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4026 (export "test4026") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4027 (export "test4027") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4028 (export "test4028") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4029 (export "test4029") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4030 (export "test4030") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4031 (export "test4031") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4032 (export "test4032") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4033 (export "test4033") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4034 (export "test4034") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4035 (export "test4035") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4036 (export "test4036") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4037 (export "test4037") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4038 (export "test4038") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4039 (export "test4039") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4040 (export "test4040") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4041 (export "test4041") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4042 (export "test4042") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4043 (export "test4043") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4044 (export "test4044") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4045 (export "test4045") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4046 (export "test4046") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4047 (export "test4047") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4048 (export "test4048") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4049 (export "test4049") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4050 (export "test4050") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4051 (export "test4051") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4052 (export "test4052") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4053 (export "test4053") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4054 (export "test4054") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4055 (export "test4055") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4056 (export "test4056") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4057 (export "test4057") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4058 (export "test4058") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4059 (export "test4059") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4060 (export "test4060") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4061 (export "test4061") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4062 (export "test4062") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4063 (export "test4063") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4064 (export "test4064") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4065 (export "test4065") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4066 (export "test4066") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4067 (export "test4067") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4068 (export "test4068") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4069 (export "test4069") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4070 (export "test4070") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4071 (export "test4071") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4072 (export "test4072") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4073 (export "test4073") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4074 (export "test4074") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4075 (export "test4075") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4076 (export "test4076") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4077 (export "test4077") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4078 (export "test4078") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4079 (export "test4079") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4080 (export "test4080") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4081 (export "test4081") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4082 (export "test4082") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4083 (export "test4083") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4084 (export "test4084") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4085 (export "test4085") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4086 (export "test4086") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4087 (export "test4087") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4088 (export "test4088") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4089 (export "test4089") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4090 (export "test4090") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4091 (export "test4091") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4092 (export "test4092") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4093 (export "test4093") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4094 (export "test4094") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4095 (export "test4095") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4096 (export "test4096") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4097 (export "test4097") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4098 (export "test4098") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4099 (export "test4099") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4100 (export "test4100") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4101 (export "test4101") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4102 (export "test4102") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4103 (export "test4103") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4104 (export "test4104") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4105 (export "test4105") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4106 (export "test4106") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4107 (export "test4107") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4108 (export "test4108") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4109 (export "test4109") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4110 (export "test4110") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4111 (export "test4111") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4112 (export "test4112") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4113 (export "test4113") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4114 (export "test4114") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4115 (export "test4115") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4116 (export "test4116") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4117 (export "test4117") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4118 (export "test4118") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4119 (export "test4119") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4120 (export "test4120") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4121 (export "test4121") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4122 (export "test4122") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4123 (export "test4123") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4124 (export "test4124") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4125 (export "test4125") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4126 (export "test4126") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4127 (export "test4127") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4128 (export "test4128") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4129 (export "test4129") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4130 (export "test4130") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4131 (export "test4131") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4132 (export "test4132") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4133 (export "test4133") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4134 (export "test4134") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4135 (export "test4135") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4136 (export "test4136") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4137 (export "test4137") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4138 (export "test4138") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4139 (export "test4139") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4140 (export "test4140") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4141 (export "test4141") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4142 (export "test4142") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4143 (export "test4143") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4144 (export "test4144") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4145 (export "test4145") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4146 (export "test4146") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4147 (export "test4147") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4148 (export "test4148") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4149 (export "test4149") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4150 (export "test4150") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4151 (export "test4151") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4152 (export "test4152") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4153 (export "test4153") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4154 (export "test4154") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4155 (export "test4155") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4156 (export "test4156") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4157 (export "test4157") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4158 (export "test4158") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4159 (export "test4159") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4160 (export "test4160") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4161 (export "test4161") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4162 (export "test4162") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4163 (export "test4163") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4164 (export "test4164") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4165 (export "test4165") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4166 (export "test4166") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4167 (export "test4167") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4168 (export "test4168") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4169 (export "test4169") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4170 (export "test4170") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4171 (export "test4171") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4172 (export "test4172") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4173 (export "test4173") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4174 (export "test4174") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4175 (export "test4175") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4176 (export "test4176") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4177 (export "test4177") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4178 (export "test4178") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4179 (export "test4179") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4180 (export "test4180") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4181 (export "test4181") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4182 (export "test4182") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4183 (export "test4183") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4184 (export "test4184") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4185 (export "test4185") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4186 (export "test4186") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4187 (export "test4187") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4188 (export "test4188") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4189 (export "test4189") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4190 (export "test4190") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4191 (export "test4191") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4192 (export "test4192") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4193 (export "test4193") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4194 (export "test4194") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4195 (export "test4195") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4196 (export "test4196") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4197 (export "test4197") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4198 (export "test4198") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4199 (export "test4199") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4200 (export "test4200") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4201 (export "test4201") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4202 (export "test4202") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4203 (export "test4203") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4204 (export "test4204") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4205 (export "test4205") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4206 (export "test4206") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4207 (export "test4207") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4208 (export "test4208") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4209 (export "test4209") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4210 (export "test4210") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4211 (export "test4211") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4212 (export "test4212") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4213 (export "test4213") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4214 (export "test4214") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4215 (export "test4215") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4216 (export "test4216") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4217 (export "test4217") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4218 (export "test4218") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4219 (export "test4219") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4220 (export "test4220") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4221 (export "test4221") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4222 (export "test4222") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4223 (export "test4223") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4224 (export "test4224") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4225 (export "test4225") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4226 (export "test4226") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4227 (export "test4227") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4228 (export "test4228") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4229 (export "test4229") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4230 (export "test4230") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4231 (export "test4231") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4232 (export "test4232") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4233 (export "test4233") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4234 (export "test4234") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4235 (export "test4235") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4236 (export "test4236") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4237 (export "test4237") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4238 (export "test4238") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4239 (export "test4239") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4240 (export "test4240") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4241 (export "test4241") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4242 (export "test4242") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4243 (export "test4243") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4244 (export "test4244") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4245 (export "test4245") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4246 (export "test4246") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4247 (export "test4247") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4248 (export "test4248") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4249 (export "test4249") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4250 (export "test4250") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4251 (export "test4251") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4252 (export "test4252") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4253 (export "test4253") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4254 (export "test4254") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4255 (export "test4255") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4256 (export "test4256") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4257 (export "test4257") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4258 (export "test4258") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4259 (export "test4259") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4260 (export "test4260") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4261 (export "test4261") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4262 (export "test4262") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4263 (export "test4263") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4264 (export "test4264") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4265 (export "test4265") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4266 (export "test4266") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4267 (export "test4267") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4268 (export "test4268") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4269 (export "test4269") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4270 (export "test4270") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4271 (export "test4271") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4272 (export "test4272") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4273 (export "test4273") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4274 (export "test4274") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4275 (export "test4275") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4276 (export "test4276") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4277 (export "test4277") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4278 (export "test4278") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4279 (export "test4279") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4280 (export "test4280") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4281 (export "test4281") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4282 (export "test4282") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4283 (export "test4283") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4284 (export "test4284") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4285 (export "test4285") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4286 (export "test4286") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4287 (export "test4287") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4288 (export "test4288") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4289 (export "test4289") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4290 (export "test4290") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4291 (export "test4291") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4292 (export "test4292") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4293 (export "test4293") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4294 (export "test4294") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4295 (export "test4295") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4296 (export "test4296") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4297 (export "test4297") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4298 (export "test4298") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4299 (export "test4299") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4300 (export "test4300") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4301 (export "test4301") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4302 (export "test4302") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4303 (export "test4303") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4304 (export "test4304") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4305 (export "test4305") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4306 (export "test4306") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4307 (export "test4307") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4308 (export "test4308") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4309 (export "test4309") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4310 (export "test4310") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4311 (export "test4311") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4312 (export "test4312") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4313 (export "test4313") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4314 (export "test4314") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4315 (export "test4315") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4316 (export "test4316") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4317 (export "test4317") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4318 (export "test4318") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4319 (export "test4319") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4320 (export "test4320") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4321 (export "test4321") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4322 (export "test4322") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4323 (export "test4323") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4324 (export "test4324") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4325 (export "test4325") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4326 (export "test4326") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4327 (export "test4327") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4328 (export "test4328") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4329 (export "test4329") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4330 (export "test4330") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4331 (export "test4331") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4332 (export "test4332") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4333 (export "test4333") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4334 (export "test4334") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4335 (export "test4335") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4336 (export "test4336") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4337 (export "test4337") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4338 (export "test4338") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4339 (export "test4339") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4340 (export "test4340") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4341 (export "test4341") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4342 (export "test4342") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4343 (export "test4343") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4344 (export "test4344") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4345 (export "test4345") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4346 (export "test4346") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4347 (export "test4347") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4348 (export "test4348") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4349 (export "test4349") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4350 (export "test4350") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4351 (export "test4351") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4352 (export "test4352") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4353 (export "test4353") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4354 (export "test4354") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4355 (export "test4355") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4356 (export "test4356") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4357 (export "test4357") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4358 (export "test4358") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4359 (export "test4359") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4360 (export "test4360") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4361 (export "test4361") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4362 (export "test4362") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4363 (export "test4363") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4364 (export "test4364") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4365 (export "test4365") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4366 (export "test4366") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4367 (export "test4367") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4368 (export "test4368") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4369 (export "test4369") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4370 (export "test4370") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4371 (export "test4371") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4372 (export "test4372") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4373 (export "test4373") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4374 (export "test4374") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4375 (export "test4375") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4376 (export "test4376") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4377 (export "test4377") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4378 (export "test4378") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4379 (export "test4379") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4380 (export "test4380") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4381 (export "test4381") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4382 (export "test4382") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4383 (export "test4383") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4384 (export "test4384") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4385 (export "test4385") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4386 (export "test4386") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4387 (export "test4387") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4388 (export "test4388") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4389 (export "test4389") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4390 (export "test4390") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4391 (export "test4391") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4392 (export "test4392") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4393 (export "test4393") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4394 (export "test4394") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4395 (export "test4395") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4396 (export "test4396") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4397 (export "test4397") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4398 (export "test4398") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4399 (export "test4399") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4400 (export "test4400") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4401 (export "test4401") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4402 (export "test4402") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4403 (export "test4403") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4404 (export "test4404") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4405 (export "test4405") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4406 (export "test4406") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4407 (export "test4407") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4408 (export "test4408") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4409 (export "test4409") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4410 (export "test4410") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4411 (export "test4411") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4412 (export "test4412") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4413 (export "test4413") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4414 (export "test4414") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4415 (export "test4415") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4416 (export "test4416") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4417 (export "test4417") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4418 (export "test4418") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4419 (export "test4419") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4420 (export "test4420") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4421 (export "test4421") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4422 (export "test4422") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4423 (export "test4423") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4424 (export "test4424") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4425 (export "test4425") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4426 (export "test4426") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4427 (export "test4427") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4428 (export "test4428") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4429 (export "test4429") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4430 (export "test4430") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4431 (export "test4431") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4432 (export "test4432") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4433 (export "test4433") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4434 (export "test4434") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4435 (export "test4435") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4436 (export "test4436") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4437 (export "test4437") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4438 (export "test4438") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4439 (export "test4439") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4440 (export "test4440") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4441 (export "test4441") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4442 (export "test4442") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4443 (export "test4443") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4444 (export "test4444") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4445 (export "test4445") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4446 (export "test4446") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4447 (export "test4447") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4448 (export "test4448") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4449 (export "test4449") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4450 (export "test4450") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4451 (export "test4451") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4452 (export "test4452") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4453 (export "test4453") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4454 (export "test4454") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4455 (export "test4455") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4456 (export "test4456") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4457 (export "test4457") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4458 (export "test4458") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4459 (export "test4459") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4460 (export "test4460") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4461 (export "test4461") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4462 (export "test4462") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4463 (export "test4463") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4464 (export "test4464") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4465 (export "test4465") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4466 (export "test4466") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4467 (export "test4467") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4468 (export "test4468") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4469 (export "test4469") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4470 (export "test4470") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4471 (export "test4471") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4472 (export "test4472") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4473 (export "test4473") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4474 (export "test4474") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4475 (export "test4475") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4476 (export "test4476") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4477 (export "test4477") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4478 (export "test4478") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4479 (export "test4479") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4480 (export "test4480") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4481 (export "test4481") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4482 (export "test4482") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4483 (export "test4483") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4484 (export "test4484") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4485 (export "test4485") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4486 (export "test4486") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4487 (export "test4487") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4488 (export "test4488") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4489 (export "test4489") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4490 (export "test4490") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4491 (export "test4491") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4492 (export "test4492") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4493 (export "test4493") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4494 (export "test4494") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4495 (export "test4495") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4496 (export "test4496") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4497 (export "test4497") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4498 (export "test4498") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4499 (export "test4499") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4500 (export "test4500") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4501 (export "test4501") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4502 (export "test4502") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4503 (export "test4503") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4504 (export "test4504") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4505 (export "test4505") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4506 (export "test4506") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4507 (export "test4507") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4508 (export "test4508") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4509 (export "test4509") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4510 (export "test4510") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4511 (export "test4511") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4512 (export "test4512") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4513 (export "test4513") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4514 (export "test4514") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4515 (export "test4515") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4516 (export "test4516") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4517 (export "test4517") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4518 (export "test4518") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4519 (export "test4519") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4520 (export "test4520") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4521 (export "test4521") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4522 (export "test4522") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4523 (export "test4523") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4524 (export "test4524") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4525 (export "test4525") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4526 (export "test4526") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4527 (export "test4527") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4528 (export "test4528") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4529 (export "test4529") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4530 (export "test4530") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4531 (export "test4531") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4532 (export "test4532") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4533 (export "test4533") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4534 (export "test4534") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4535 (export "test4535") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4536 (export "test4536") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4537 (export "test4537") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4538 (export "test4538") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4539 (export "test4539") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4540 (export "test4540") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4541 (export "test4541") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4542 (export "test4542") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4543 (export "test4543") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4544 (export "test4544") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4545 (export "test4545") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4546 (export "test4546") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4547 (export "test4547") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4548 (export "test4548") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4549 (export "test4549") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4550 (export "test4550") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4551 (export "test4551") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4552 (export "test4552") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4553 (export "test4553") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4554 (export "test4554") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4555 (export "test4555") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4556 (export "test4556") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4557 (export "test4557") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4558 (export "test4558") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4559 (export "test4559") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4560 (export "test4560") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4561 (export "test4561") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4562 (export "test4562") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4563 (export "test4563") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4564 (export "test4564") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4565 (export "test4565") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4566 (export "test4566") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4567 (export "test4567") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4568 (export "test4568") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4569 (export "test4569") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4570 (export "test4570") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4571 (export "test4571") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4572 (export "test4572") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4573 (export "test4573") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4574 (export "test4574") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4575 (export "test4575") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4576 (export "test4576") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4577 (export "test4577") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4578 (export "test4578") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4579 (export "test4579") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4580 (export "test4580") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4581 (export "test4581") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4582 (export "test4582") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4583 (export "test4583") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4584 (export "test4584") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4585 (export "test4585") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4586 (export "test4586") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4587 (export "test4587") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4588 (export "test4588") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4589 (export "test4589") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4590 (export "test4590") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4591 (export "test4591") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4592 (export "test4592") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4593 (export "test4593") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4594 (export "test4594") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4595 (export "test4595") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4596 (export "test4596") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4597 (export "test4597") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4598 (export "test4598") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4599 (export "test4599") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4600 (export "test4600") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4601 (export "test4601") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4602 (export "test4602") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4603 (export "test4603") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4604 (export "test4604") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4605 (export "test4605") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4606 (export "test4606") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4607 (export "test4607") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4608 (export "test4608") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4609 (export "test4609") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4610 (export "test4610") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4611 (export "test4611") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4612 (export "test4612") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4613 (export "test4613") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4614 (export "test4614") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4615 (export "test4615") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4616 (export "test4616") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4617 (export "test4617") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4618 (export "test4618") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4619 (export "test4619") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4620 (export "test4620") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4621 (export "test4621") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4622 (export "test4622") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4623 (export "test4623") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4624 (export "test4624") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4625 (export "test4625") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4626 (export "test4626") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4627 (export "test4627") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4628 (export "test4628") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4629 (export "test4629") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4630 (export "test4630") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4631 (export "test4631") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4632 (export "test4632") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4633 (export "test4633") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4634 (export "test4634") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4635 (export "test4635") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4636 (export "test4636") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4637 (export "test4637") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4638 (export "test4638") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4639 (export "test4639") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4640 (export "test4640") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4641 (export "test4641") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4642 (export "test4642") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4643 (export "test4643") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4644 (export "test4644") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4645 (export "test4645") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4646 (export "test4646") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4647 (export "test4647") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4648 (export "test4648") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4649 (export "test4649") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4650 (export "test4650") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4651 (export "test4651") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4652 (export "test4652") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4653 (export "test4653") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4654 (export "test4654") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4655 (export "test4655") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4656 (export "test4656") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4657 (export "test4657") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4658 (export "test4658") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4659 (export "test4659") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4660 (export "test4660") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4661 (export "test4661") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4662 (export "test4662") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4663 (export "test4663") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4664 (export "test4664") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4665 (export "test4665") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4666 (export "test4666") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4667 (export "test4667") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4668 (export "test4668") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4669 (export "test4669") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4670 (export "test4670") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4671 (export "test4671") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4672 (export "test4672") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4673 (export "test4673") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4674 (export "test4674") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4675 (export "test4675") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4676 (export "test4676") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4677 (export "test4677") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4678 (export "test4678") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4679 (export "test4679") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4680 (export "test4680") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4681 (export "test4681") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4682 (export "test4682") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4683 (export "test4683") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4684 (export "test4684") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4685 (export "test4685") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4686 (export "test4686") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4687 (export "test4687") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4688 (export "test4688") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4689 (export "test4689") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4690 (export "test4690") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4691 (export "test4691") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4692 (export "test4692") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4693 (export "test4693") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4694 (export "test4694") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4695 (export "test4695") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4696 (export "test4696") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4697 (export "test4697") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4698 (export "test4698") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4699 (export "test4699") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4700 (export "test4700") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4701 (export "test4701") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4702 (export "test4702") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4703 (export "test4703") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4704 (export "test4704") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4705 (export "test4705") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4706 (export "test4706") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4707 (export "test4707") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4708 (export "test4708") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4709 (export "test4709") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4710 (export "test4710") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4711 (export "test4711") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4712 (export "test4712") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4713 (export "test4713") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4714 (export "test4714") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4715 (export "test4715") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4716 (export "test4716") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4717 (export "test4717") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4718 (export "test4718") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4719 (export "test4719") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4720 (export "test4720") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4721 (export "test4721") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4722 (export "test4722") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4723 (export "test4723") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4724 (export "test4724") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4725 (export "test4725") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4726 (export "test4726") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4727 (export "test4727") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4728 (export "test4728") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4729 (export "test4729") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4730 (export "test4730") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4731 (export "test4731") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4732 (export "test4732") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4733 (export "test4733") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4734 (export "test4734") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4735 (export "test4735") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4736 (export "test4736") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4737 (export "test4737") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4738 (export "test4738") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4739 (export "test4739") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4740 (export "test4740") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4741 (export "test4741") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4742 (export "test4742") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4743 (export "test4743") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4744 (export "test4744") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4745 (export "test4745") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4746 (export "test4746") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4747 (export "test4747") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4748 (export "test4748") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4749 (export "test4749") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4750 (export "test4750") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4751 (export "test4751") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4752 (export "test4752") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4753 (export "test4753") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4754 (export "test4754") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4755 (export "test4755") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4756 (export "test4756") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4757 (export "test4757") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4758 (export "test4758") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4759 (export "test4759") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4760 (export "test4760") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4761 (export "test4761") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4762 (export "test4762") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4763 (export "test4763") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4764 (export "test4764") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4765 (export "test4765") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4766 (export "test4766") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4767 (export "test4767") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4768 (export "test4768") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4769 (export "test4769") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4770 (export "test4770") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4771 (export "test4771") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4772 (export "test4772") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4773 (export "test4773") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4774 (export "test4774") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4775 (export "test4775") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4776 (export "test4776") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4777 (export "test4777") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4778 (export "test4778") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4779 (export "test4779") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4780 (export "test4780") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4781 (export "test4781") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4782 (export "test4782") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4783 (export "test4783") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4784 (export "test4784") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4785 (export "test4785") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4786 (export "test4786") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4787 (export "test4787") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4788 (export "test4788") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4789 (export "test4789") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4790 (export "test4790") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4791 (export "test4791") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4792 (export "test4792") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4793 (export "test4793") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4794 (export "test4794") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4795 (export "test4795") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4796 (export "test4796") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4797 (export "test4797") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4798 (export "test4798") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4799 (export "test4799") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4800 (export "test4800") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4801 (export "test4801") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4802 (export "test4802") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4803 (export "test4803") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4804 (export "test4804") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4805 (export "test4805") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4806 (export "test4806") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4807 (export "test4807") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4808 (export "test4808") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4809 (export "test4809") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4810 (export "test4810") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4811 (export "test4811") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4812 (export "test4812") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4813 (export "test4813") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4814 (export "test4814") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4815 (export "test4815") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4816 (export "test4816") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4817 (export "test4817") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4818 (export "test4818") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4819 (export "test4819") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4820 (export "test4820") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4821 (export "test4821") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4822 (export "test4822") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4823 (export "test4823") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4824 (export "test4824") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4825 (export "test4825") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4826 (export "test4826") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4827 (export "test4827") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4828 (export "test4828") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4829 (export "test4829") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4830 (export "test4830") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4831 (export "test4831") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4832 (export "test4832") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4833 (export "test4833") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4834 (export "test4834") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4835 (export "test4835") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4836 (export "test4836") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4837 (export "test4837") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4838 (export "test4838") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4839 (export "test4839") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4840 (export "test4840") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4841 (export "test4841") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4842 (export "test4842") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4843 (export "test4843") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4844 (export "test4844") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4845 (export "test4845") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4846 (export "test4846") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4847 (export "test4847") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4848 (export "test4848") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4849 (export "test4849") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4850 (export "test4850") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4851 (export "test4851") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4852 (export "test4852") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4853 (export "test4853") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4854 (export "test4854") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4855 (export "test4855") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4856 (export "test4856") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4857 (export "test4857") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4858 (export "test4858") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4859 (export "test4859") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4860 (export "test4860") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4861 (export "test4861") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4862 (export "test4862") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4863 (export "test4863") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4864 (export "test4864") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4865 (export "test4865") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4866 (export "test4866") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4867 (export "test4867") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4868 (export "test4868") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4869 (export "test4869") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4870 (export "test4870") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4871 (export "test4871") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4872 (export "test4872") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4873 (export "test4873") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4874 (export "test4874") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4875 (export "test4875") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4876 (export "test4876") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4877 (export "test4877") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4878 (export "test4878") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4879 (export "test4879") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4880 (export "test4880") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4881 (export "test4881") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4882 (export "test4882") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4883 (export "test4883") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4884 (export "test4884") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4885 (export "test4885") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4886 (export "test4886") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4887 (export "test4887") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4888 (export "test4888") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4889 (export "test4889") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4890 (export "test4890") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4891 (export "test4891") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4892 (export "test4892") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4893 (export "test4893") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4894 (export "test4894") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4895 (export "test4895") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4896 (export "test4896") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4897 (export "test4897") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4898 (export "test4898") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4899 (export "test4899") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4900 (export "test4900") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4901 (export "test4901") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4902 (export "test4902") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4903 (export "test4903") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4904 (export "test4904") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4905 (export "test4905") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4906 (export "test4906") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4907 (export "test4907") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4908 (export "test4908") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4909 (export "test4909") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4910 (export "test4910") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4911 (export "test4911") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4912 (export "test4912") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4913 (export "test4913") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4914 (export "test4914") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4915 (export "test4915") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4916 (export "test4916") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4917 (export "test4917") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4918 (export "test4918") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4919 (export "test4919") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4920 (export "test4920") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4921 (export "test4921") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4922 (export "test4922") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4923 (export "test4923") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4924 (export "test4924") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4925 (export "test4925") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4926 (export "test4926") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4927 (export "test4927") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4928 (export "test4928") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4929 (export "test4929") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4930 (export "test4930") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4931 (export "test4931") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4932 (export "test4932") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4933 (export "test4933") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4934 (export "test4934") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4935 (export "test4935") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4936 (export "test4936") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4937 (export "test4937") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4938 (export "test4938") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4939 (export "test4939") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4940 (export "test4940") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4941 (export "test4941") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4942 (export "test4942") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4943 (export "test4943") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4944 (export "test4944") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4945 (export "test4945") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4946 (export "test4946") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4947 (export "test4947") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4948 (export "test4948") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4949 (export "test4949") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4950 (export "test4950") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4951 (export "test4951") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4952 (export "test4952") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4953 (export "test4953") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4954 (export "test4954") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4955 (export "test4955") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4956 (export "test4956") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4957 (export "test4957") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4958 (export "test4958") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4959 (export "test4959") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4960 (export "test4960") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4961 (export "test4961") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4962 (export "test4962") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4963 (export "test4963") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4964 (export "test4964") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4965 (export "test4965") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4966 (export "test4966") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4967 (export "test4967") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4968 (export "test4968") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4969 (export "test4969") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4970 (export "test4970") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4971 (export "test4971") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4972 (export "test4972") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4973 (export "test4973") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4974 (export "test4974") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4975 (export "test4975") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4976 (export "test4976") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4977 (export "test4977") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4978 (export "test4978") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4979 (export "test4979") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4980 (export "test4980") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4981 (export "test4981") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4982 (export "test4982") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4983 (export "test4983") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4984 (export "test4984") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4985 (export "test4985") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4986 (export "test4986") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4987 (export "test4987") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4988 (export "test4988") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4989 (export "test4989") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4990 (export "test4990") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4991 (export "test4991") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4992 (export "test4992") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4993 (export "test4993") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4994 (export "test4994") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4995 (export "test4995") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4996 (export "test4996") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4997 (export "test4997") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4998 (export "test4998") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) - (func $test4999 (export "test4999") - (param $p0 i32) - (param $p1 i32) - (result i32) - ;; Return sum of p0 + p1 - local.get $p0 - local.get $p1 - i32.add - ) -) diff --git a/src/test/app/wasm_fixtures/wat/functions_5k.zip b/src/test/app/wasm_fixtures/wat/functions_5k.zip new file mode 100644 index 0000000000000000000000000000000000000000..e261760545516dd244df3d31cc5a3acd4fb5685c GIT binary patch literal 29665 zcmeI5eQXnT7{@z?8!z&bi7dPav(pd)mmn`9LW2abUWj8V1h#P?bA}Oiy1@vH-Z^nG zfRp4RUNFL<6xj=7IvvH1^@IW11mwlxa0R-_0@AJR+O4nGyYttZiNVO~uKjP%wmeOq z`{maA_Q~bx=Xrk5r4xxm$7wXfhH2Kn{chG*3#Kn13pJYk+eT@|YBZYM9r>HLZ=v!F z$$496@7%Qg^6gbs^Rjp5J}_mv*_@^OrZ4QFuGIg$;Y{)~$LA)^zznao-Cs0y(&oYy z$(Lqt%N=?yds2O;OA3-wyHnTD6kEgnzY3d=n#3j7Z4=W8^Q`!plEt zWiKw@t96Z(J4tz>>~CU1oGkg#8D&2cww8~%=aJ9$=pXWus0}yyWqu>Ik*e@N>-%~) zwTY_q&-b0)?b_(7@K5bpY;Qc!SbewnTYr^*Ntgb9V~M%cL=DL7Gaolm12U!NLndlK zrp#P#q6TF4n#)YofK0M}k=;C{*HIx9T{9kYT9?{BF;P*Rr~kB82?H`k*NxRq>vG#E z6P2oOu$!}c9aTa!=NNsl-MqNhQ7QPY8BaK^%WOwYRKL!{!gwt&jL+lK+PDu}@!Vk?`(z5ZL6fKf5f0ulz9C@4`Lvs~?mVumC)sWy!@;G6S#X0UQ3Im+s>^(+ z6`v8nj{Araw60QQKOi&mctacaDY!wCr~$#y{u*@aX~MVElQ+7F^$u=sm|Y`aqj&?j zL6fKf(bLmF9rF=Mv;}27CFGnuKBtZQxD}rez`zZfL=A|AD1$C)rY$980a#EVjtWR& zr?pCCOUXKPPip5*w&LpoShbHBPg}qZnnVo&b$4E(hD_z{4&T9+4BRw_C`a7Tt zhkb;U)m(f%`r7|Edy1A9S@g~~{O^DG$Vo0-rTC7k%NtV%_^$sxiMt0by}u9l5v~6T zhh`dm>ds8S-6_EORkD81gPk_O-N5?Q);}^3K3D^|8(6>E`iF!HaDcmk^{cIaTt<|j z3~)EFewD1h17*aa2G+l{vuO!1~qJKYoZ*=5ErKQnCOnC=f>l1e9~1 z@DWqPELcz=UJAV9BRmftthGfTbfUt%F@<^0RG4?mt(i`%F~5&|pHuL7ANiiGEGoW* z8ir$H$idhcvJ?|OXJf0 zb2ZTP4J81TC4i2|27)&QES0u^1qI@$fD7f^M_ch--2_-rAZ`l$j#rkKlX?O5aF0@$ zH>WV~QwsCW-mG+c_mS^p1&_~C$ajOX$hoQ3M8(vC-5eW3_QrLQG#`+Tro z`YH!^0VP?bF!}^a0BTDBX#T(~7<~eBU(^o0@gjTxV?Lse`G9dSj~S8k5EbCI!srty z0jMkiSR(zqF!}`MzNj5~^9#zLr=ZQ{ZQNwApg{Z-s6&;x(=hr3=Dw&MdK1||u-3t4 z1u(FnKpYh~i*oMbJig-`z6&fU5HAICc>_b!UI&^3vY?N7_f0rCuXKBtDRWMe6!JYq z!Q;k0^4+)Sqei<~jAeq!jo27+Z*2Hnj18a5G2!z;d+GIL3QDpD=>TwxeDm^=r(R)) zCX8)9XvxcV=XO6=6nY_H<)+W|cD|#D^i<017{+o!B9?@)@(>>E=JvpWxJZ&lGy0KU zG9^H~EOJ97HeJR___St5*M<)VH)s+yAS5aDnVnB_bA}ME3uBcMk;3SzWcC8df*Ul6 z8W17TTZ3*l?f48YnGqmf6}fQ|n;~PRyaC*xNz{N4h0e@snY~2bu=55t_k9T862@vI zVj`mhH)s+yAnyBHjH_jAFQ3!QSlaLjUUE)=SRryxN-VfRlc)jF<*KEsC1N~dK}pX= zvd+%uxVe)dd|em=H)s+yAa?P*d9j!DbaO9(1qI@#KmiJ@BO!cY7(?7-G-E*wrHL#+ z*rc2L0^FcU{{d0Qci0#?F`Y;lGA{A)kK;s7DDMBB2|%x%1cCfs8m59BztFOgP|BC`R?_*T<;oxCt)&Y zXXebAbI$(v%;ZClUcF!J(W7tQ9$vnIANPx!)zEWt&mI-!{2u%sJ$kGNScI<#_Ic~g z<)c5tKmGJ_&a*3uKi`oTd7ymZg%86T^tnfbWh0;8YPTqRYc_HIZG86K_^trOun2(@?1tDvZF%8ohy@a_Z zVOo8dzXD{<@e;$mlthVPZY6UcGi0aBbTu00WQn2PXJ~8PZKgF|qp#ni8NTDC9bZF4(@ILQtpMX zX4%#O$_KB_1K1ajnQ?Asp7C{YXWOe%6YO;my*~A7_iEiUf8#Xp+A&~)LzvgSgE##0 z&hOkag$S^Ne_q^~G9W^ExyJe!#qApGel8jBJY4-*M2DEpMdn z*D4%~Y)cM`j`>S2H`<8~<@79DA2|8YFk!y~eV6ujeRWX(%-FuayhjaR|5m@`=!MgI zhrc@L#mt?3U!OwRubqv+plbYV7*de#x5`uIe3bH%ORS-uHDk%6WZWzvL|oLwl?3 z1`W;ptM4yv)P(i*{gR1=k-c?xgI>ve%I5W{)I00@^-tcqP~O}1wL!0D_P6emW~XN`6bbx-q%^^UELT^#?~ql#K| za!Fuo)9;xp4can7XgFP#D>R%fvmMeUr)AfF?6o#{&#aC8B>qM9&jrIzjJ6MTPxY|A zsM2R)>kFG?QO)&s|Hx=wI*8#{h(2lc*d*J4|2MDvZ+EFP#&nPE-hbA{E{Pwb{<&~? z&S<|-_y4(~#D4X|`X%YJ5mVOA{$uHswe!Awd`&*O`~OfcE*MUaemOLY z@{oJ~vo;owfBZ#jH(We9FJjBZKAsV=4JT*JS#=kmlenZIXwGBrMVd#PcUo<%Z#<@6 zTsS;?v}b76|5{PQ1cA@N`VRy?%6e~skE%JSSYEugL_2U*!T(gpgz9Sr!%vQO4$VsS z*y6pqHg-{bw<|g;UKjCF!Ds6tUM|R37cr#Z{yN#meXo!6u~}kuUl+xX56${NPv#HT zzMs5}d?R)4C)6LGL}$f{me^#ZdJI)xGf$4y#yYC6Wsh!7^Z5VsF=g!7VE@Jo|Jdg_ z`|YG9vvT%s|41oHF0!4QLlxP2*7e!nNYBx&`&EDLV&olv$y%l8`1Y@qM6{CFtR!NT z#5N`IosvjU5!ENt{p;SxO>DN#rSsi%OzUNnBA9 zWlEw_N!(NtbxNXMNi-;lW+kCl5G}J zMMS8Gbt>X36%nl>Hmisj6|qf4e5WE3RK!mzVz-J&QW5)AM5>BVs))lX;;4$qR1qgs zM3#!kQ4x76;-ZQuR1sHHM45`HR1r5-L~&K0QMz}x=`&9o0)1u2(hUv%NlRoS(rG05{<62B^wq0(nbBE$Ily%`^jz`l&mQdO{}y1u~G4%E^4nHzhIc;FB_?p zkVT?tb+&sO6|;3w`}Ful!*PGvGNt5Dk!V4kE!C))r;AF~6PSRo@)kvV;puxo>WYQ2(+u{qLrkY7oLIN8HZh!XBAVQ3#0*b^-A(6Po04` zjl)XhH;btVfi{3{SxIVmx(vLB7%P?AT&C6uq=EFatH?~A>mj_a7%P+8U#7kiXaniN zt4Nv`eh7bFjFrpXFH_M1X%IbX6?uZEK77IY z`zgJB6?vW)egywej8)6suTV(>X$ZY<6?u`TK7!8^V>NQWE7X30HiSO1ioC?r9l;lh zv08cb6)IIA4W&=7A`5x0YJ8a(tCJ^Pp_Bq`C|$IQEaru)@jx+lOP+OwIxLWWMpv&Q zukh4re2o~pEx&n%Ix5h9Mz^dYOL#gp{)HI3Be%IqWeTKg=w}1SGM?*i_}5~rUT%Mt zIw8=mp$7+$6}<4@@U3F(FS+|wDoY^!oE{ZGR`S%p;iMS5EBCuftjJ3$!OQ@RyX#~A5fNbEYkKqMkOegm%q3Q(M2>M6>d7q~{ zhL?)5R(W&@RWFc6(x(H+W}d4Czahr-@}v@~L7j7$P6i=vKN4o@)efYZL z_$y9WZ$)$|)lVp0Prn~X+VEX7@sUp0(~6{0>LsCeJ?#}pKF1Hw#NTwno>63#QZEao zQM7*`$>XataVICNkK$%2HAJY5qQe47TfQz6pX7w~RoIkK!-Uc==?#HoKfdel_*5s% zMqyt@4Hs&^q_+o>FYv>E$3Jw!o>jP)QT9UVSM@+H3dcYK}`_MF16jB*fazoL%> zk^}j=-|>Y`*gq7}Wz<_jshmC?NWRQ>rSWA>7*CN@MvWC}<#bUXDd30Gc%T!;S7en@ z&O)hzt_~!J@YOWF#tE}k+$^Ie2(=2jC6E;Hbu|8k6ZX8qrkr|5DE*p#Hi#U?cl`tZ z+6n8YurH^k2(@3+gM&yre)u2wRwt~#!o8ew7fPe)Q9Iy*j%I538h=PpdhlxUU4Hl}{CQ{WRfYRCDq1Lwp+~JIr|{LM@IlU)ox<-L zwOOc*pHHAVC_Dn=-crQcsoy7OJL@R82ga7EHJYMW3SOM9&*J^0~S z_?yny>x!&v)OSMZH?;q1@&mp)3wLtHMksDxqY{MLZ|Jbq$&Kn)KwmX5-78F$YCbC8ZQ<CIPX<7=ETN5#!b>Zni~Pq(ZlefYX;{0nF7O@+;M zDpM#W>1TsUobP%D|JoUQOJRSVIw91O^x$A}5kLG4zSSA~r^5X@l_ivZM~@07efjD$ zIO&YNt?;`}@CE#m(!~6`}TfIxLtB;Olbm$azD~8+PsueJ>rZ zb&2<`N~`%eG$H#yaAC-3^;xcv69}ga+(O_i17{UEkHC3D&Kq*xurqJC^3vftmkjSJ zRn6tlgyI9i#UZQIXSqU7Ae=IA3xTr?oK@sJ0_P1mZ^(JW&b;BGOP|-e5Z+a(HRD4Q zP9C^h5HeJKmMi20!YKo{5ID=gSw+qxaNdyfhMYI-%o{Gh^m(02ig%T==C{y2 zg)C5? z`_D;$lK>|HP6C_+I0&q;uj04D)X0-OXm32+kNB*004lR$Tt03%bM zWoYJ(BU8aNCNecLgDsOSGsq0*HLb-t8bh|M>5{DZ5_4Ckk7xdp=(8DvtaT4lBVpp1 zyFN^%#!$jkmfT|M$~8m6mUH?ZVxl%S!jexua$uLM9AaRCd3M8qU06F@v+L23qrp{mNHbyu3%0FG# zN=qTBfaE$PHzBEoHK zNKS03T^8i?^^(PITXd7fZ-d5NAer#CI#TnGvoS*^?)vGwArtL(0kZ37_~{q;X-~|M z-M5}|-(353h|gYs*n{P;2audvzT{HMzkYX4qnExnE}dTbDI`Bba$#KBu8N3Zhhm1< z-+nG92Q*#?NhKupkmz%2TO1ZTxrH`udUh!w&qFf6Ep+xV$7@b$cK0HFIt6=h8ulO? ze#(KL&caXUzVp@;@T*So6Ju_k;U~_hKDFhUrmyC?g)Tnsc+Uki{+cTwvmyBsl7o<3 zgXG2W={24_=MkY34h*ZhcU(F?b)9@f<7f9W1ICO`uQ<$uG!N06i1y^el9v&E3sHAS z>7`@Fr|q(h+*KAcB;t;MmkY-8NaAUG6iD~(VKG$`?J}|Dnb3)|`@sG;FH9&XOW(21 z&UJ16qCha~Vg11bdfL*UcFpHbK&%t|frOIx)cvt#V$){1TPWMr8s`~Ea&joN&WW)) z+f^vOvhTc!i8P!p<0#NjI*`sr7Pei4bfk>E61v<2!U}?@y%ANiYzBw4cVF?MXRo2a#Y z2RihJ{Zk#6dhLgTv0H{$jUisr&0DtS6Uk27iRbQ|*|H4-Vp}xwIdIK_)04qKuBXA` z6R3C$D$aq$V32TVy?C%$+ee7{VabDbPJyYO)J{rfI|&qK@#}?U>2uybabUtU-qH=; z-~4d-?2GC-&SgSi4dR_o@Ds=GbO*XKANa)%nYjFeZ-8>Wn*j8zsQSf+JGgw= zfX*ivi5AZCI;4et2JZmPv=L>(KcG54Jb$o^9SuKY zc2$Oda%s7~6e^cb-3Xvp8F!$Onz9yJt$`xIwcsu^RbqWKP?A1K^(B9s)=S@yLb_>o zz>gl>(X}s`)l8_5=9)62P;Dbbs`Z#9@w|XE4p9HVt^LJ4<1^O zawE!d%=lEFygoi)naCQOzmhKnT4Tu{(CNd4JrF4f~c4vt4Z09P>PQ z+tuvrICMjw@3lS5?Tmg^Z!zOHGoaHI?t8epM8+%#h#;_Ela$TztZR9UtT zR_QYuRC)Cf;M)lcZ>)!fJXq-B)RZ@rZBJz6`)3)v^jEOT09a)K4bmHvkT-zTu}Mhq-;hlQh@oASo9?M*Q9 z{ROLx{1#T339C$ld^0OS;ofbqa2_mN;@mXjJ+{3mM!s@bU+152eXfUoX3ZFlS2e5(OQL*Kzk(|i z9sn2cRhuu|(|mEJ=7LL3N?Z$Ur?YAuFX$Jkyx^#ucK6rak+74GY@!|Sb{{yz^R4U% zE$AN0%MGnNyIybz$A_Lm0C0G#9k!+xYD8Awe^Sp6~o1r$4+i1}zD zU{$LoVh++V*p5{?b`j|q?4&h128IZAtV=a+*BNeTZR^o>{+?!B7qx#@tDEwI!fQk` z;h$uyJez4-EJFGrx!}@AvO=~Osn3Ts!d6QE6H=mg_Xpph8x_VW2CFY(FVYzJtu?c! z@Pg(AHfD{6agDW;7c{hwUyR5HF%29?uK-) z>RHHQ>_Pf59hsO!*2G*yCT1TpF|(10Nn)oMS_V)D8W;GjHM5rloS^aoY|I)B;~Hxx zFX$v6zZh2}TvyaNs;1TZT%76SpKwjHZ}&0Q=dh9OOr#KOeCvTUh>da`kp=+{v^-&7 zccUq{Hn0U(fcj-^gvvE$T90sCS?gQDc%kZ`+-SOdsWXz3c<#+0Z1WAkV(<7 zCWVb{=O7I-MwPIypbngJYXippNWZKNYPrTbn3TsaMr2YHAfyF>%HEJz*}mOFk#4Y| zi5t=xHdvW~R0D-Ck;v#s+SwB}p0ze?;JDgQ1!$AIsWgy=!~+eP@6fOhXvnX-7a$Eu zLBYvfq#?heaP}jlAt*M9L`Fr^PDA#gJ05F86OOCBhICVD01c6;^g7Xsgi=OV+2?|f zAd9)5ZM#=94j{C}0HG}c2<=LM&@Qhi2NeNAyBQ#~jR3;!q{0{DVtrJ*KoooMLP@W} zsqEV_0QKb`22h_Dg!-02sBc%uXmf=e-~Um$AXDSBBB5ON5yW0!V}519*G_R-Ghcwa zT^P4;7_8CuqR{h6gqK;IKOJB!AjX{!FqYf?Ng#lPIKO$E*31`e7z>BNwu21N@_EAG zW%h<>A-Ex$;n46CxFOo*Rc%6L6?GQCxJJVwVsD774RwD)H$-g^uq7}VoCdD34mU)P zUyR5HNq`SxW_tjD@-=3USM?)tT1A}%S)F#su2EGu47Q^WdeY!!pii(z`8>2S*Vvq9=ob*GB{jg9kB8Lh#1*Nha16N^jzhI zc<|^DBqf+oS&<5atMJj`qhMTPtOC$i7QnS`%HvT~>|?EdagF_bnwnAjV2`nO?ip6Q_dzcSesbDHP&uDvWPicrjJpKtVzK^NITnO0(ck% z9x-l1;AtnAvUBa~@ zmCplo*Qg4S>aamackO;{lWFH$_aCY9N+&xDAW9G8TQ=MF8jIk<6gV~!fem)qFqdKT z6gqyPSuxj`ZfgW^`@j-mYnnHB#*`fj%#vd%ePFw}pNh_T|w{ zn0Srpw!pdpjM}2^Azn6U|9vufI1x-kIcv9Q^;u`GfMb0pcs1U4msVZ&ZF;C<)| zpcQZ;KzIu$0#>y^PaaGJ8?M53%&C*vLa1Zx^LW^oPF1l3uQA;g>KGh|H9E!(4avFC zB?lzf0zgi(Z}-FtE?KhKFntzgXq!*5eHhGbGc4~Sjj^?I_CT9(>S1HnXc*U+NnUUf zJbp2US@cz;lCb%39aC%{26N#Q zL(4E5MJ*8OwPyA}n{ZWF>w&n&Oe+%l|Hm)Jr8Q#!G7I;U?Tc%HNeN(E*`rcy&49Va zSj7=d`7vva3cCr-+6a|vtlfHq%k=S!5t$S*FexAtApn?^5|lm*5)wK|v3(fKZ8Irs zK7zFYBWM$tlw;PK6t1zqo0P{dMr2apGiHR@e#7S8f`~Q}g(kqS1D!DewTilqxUSKj zu)A)o4I4PFHdF!nkN=)D?lQyAEZFZo|M@|Ee;LzgC~O`vPD)(<)9=8=smW5!)zLLV zeV95q_+Cw2+S$C6jBFP-bA?wNJ@ltsSZcPy-wO{;yI)b~}~b}}V@5f?N8iy2L&C`ndws70pHi<|Cm{*}33EQ_+dpj1$p zl0gGa!WzWq1ckO9dfq+h{hB)J>_u2US96tL^RYh6H95G!T;V->rmWY|7(I2NWKzJV zT~sz*fotx6QJ6rBfZf;`vX2?%5s~FmDBHIC*kWi=WLe0f#3G9_99Wb!IuB%m;*kk* zL?+0`X!C$!1I#QnnUb!I4#(BrZ**g6Aa@i1+|li{3mL#2edbv`AL&8{(uDw|3nj=M zX^=aT0UHX`Dh?@+gUKCbAa?}09_=noIs^?c$JG{QbYp2CLlSw;<)Y;DOk2+pIycYi zVaRG&N&Jqi9t_)=uxnI?M!I)sASYVQgcKXYxQ(4WlD#j8!bsU=Uwf zqru#;T=$;`LFflHvzgHzM|~4&OMH{q_`^~PW)@C$0GevZWX)91M^kN#Wh`Qat2z!% zb^ANYu2`W4BV%>dN)6_Q#oo(+5JYx*rU--}(><&0PzYivHHIK=XsRKTHLE%XPIZfw zAxH!=Ruiq9Y7x?4!b%P1hJ`{9*|LOcpdga8X^j%!BoVrIksuc%LpQz*m_l&x5`*qt zSj}-mH#1|(6Rf&M*EJ5?7O1{~ z!c`*}+m+dW5C?KxZ5TTApWRd%z>qMyx=YNmgd0pot6jrwK_L^+>{eYOK42&bV0eaz zifTsRSW;?vL6fu*!hm@!=-P;&)V$8IRug=RP+1`hx-OO=7J9cfO_^a1Y3$2Z9Ys}dQSu5nmnL<^XKJA!ve*4*-NTISk$?~+G3|mI2tj5cC=}pmESlCOZ3{s-6x9@hJW=2<3PD65hXg1H0dhzH zIB$YgE9xx3VT~q)KxqQjg5Mlh`y7&PDh>7l&Tf#5=HQ_}?NZ3Z?T$2`-r5-sYYbEY zGYH`UwdxTo$MxWWC@Z~gDMMgLm`I&o;x(d$abTwEb<##=z9FW?`gGT}4B1}CVi3^E z<*%B_?|nkEbCEl81nwv$?Ls_oM{_-^&8N3^io+V+Q9N=-@IL9m;_1TZzD(J#OqjrNGh2D#DkyN{VqZ|w|+HM%3f3`{AYU1&x-9b)TqTIfZ(MA+>%mQrIN@+85HPbiA|?+pt!1c3AA(_1^kVcSfI9m*lGHZz*zYM(>WO{IanjLZ+@ zMrY5|fMhg{Z;}Pa47A5#je#m)1|hu0XlpIG<7Mk}Tqf(&O=SoTiKfKRO5{fyWZ9CL z3;<4V792Cs9)~r$Bft#YQHhoA zh~omN0)nGi>2*sPvT^M@09qRf_wv_@*lqb0br3nUgc?=kNrD^O%^Ei>7FzogoJj%G zHAm={dRD`2`D=8RQX{m+?dWfpwe}>Pzks}q4}jLdQ(zAOt$h?1hK@aow2-z1BHWIC zqkjbt>OlT5IBMewIe!5`YhnPcf!#N8;OSocZn!O<$bj*LCDaJ5JyCFDyQ%(ve^3D% zg1iet5PJ`hu30PbO@f(;6?K+UV+isj!Hw-g5N=p(4#`g-hr}M909pvZ`N*!18EB8g z8cm2b$A_9$D8~gB*n=FB?kWxBWw_&B*&EJ|o0ws`9CwWERbWWKaj!CiTg`jMV_r`g zG1#C6kPjPh=eA%jsK7kK9J93GxH!!xKmpD8qA(u%YLNv&dcqzL3-?cMHE(B3+SE?(*yCXVJOO~>&P`NDR&+cp#J+92v~DI= z_IOzKEZhIT!`c&aL=+$a4{#D;!s|Ee$pi4$3BE-Kt94C*2Z2*SkPu*+Mwg zX#W>Tx3y}jcc4c_)2*E9JxGIRS>^*#hq+U)fK^SlzFblfYqElbta~lf|dSww-gTQ|E#%p_V$&$tU3GPExi)m(ia&|&W9>E z9jYKG*yXbv-lqJ$R)<1pL`|X5gKKrD)$w|N4~-t#Ks(mIM|@rPjb#Osv%?hebu}z# zZIboihjP%l^wS#A6JzI=)J7N%SVDmapiE3Lgf%iT#SqrW#1unVA(I8B(5Ne!7`22O z7F-d)+A#W}6v=s)Jf`BW?=M^$o5q~16ep!D|5$(flEJy@i1s2AS(g}Pc|qym!W1R@ zdtAXkj)efN^SQxSV9{JnKKv;zFIVtWT+7k#bD1fG`JBRKn`;%jBl!oV_dBh3vBMR? zIS7(IUJ%$#?6p6yi$+Y$FsU|oUH&NmCs$2c{;4HBM9lDn0d9DvDFx}V^K_d*+`AuZ zcpaq2&WQ{A23Xr<{p%oiX`b!_WN*F)fZU=wF)+v{ivnOWg0ciYR$Q)uKP!GnYGvZnxWSXppKgl&u2a(#;MwlzRsLmECj|eG`1Q`+;II^wHkPJhH1aetp zNI0&x6$K4RH=S`lM;Q?9;U~K9zCCWvDb?|di3qv!^=1D<9>0o8hTFd y*`uPI--F-7^zY|&@bij*Mfi$fpSRvzKKe8K(+@qKeg>BI1h4Vn-2w3R=<#2Od%rLM literal 0 HcmV?d00001 From 4b34102e8e31e9d9144bb7b64e44056878bc61af Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Wed, 25 Mar 2026 09:10:12 -0700 Subject: [PATCH 201/212] test: Use proper length limits in codecov_tests (#6626) --- .../wasm_fixtures/codecov_tests/src/lib.rs | 7 +++-- src/test/app/wasm_fixtures/fixtures.cpp | 30 +++++++++---------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs index 67e16c5cec6..918bbb5f099 100644 --- a/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs +++ b/src/test/app/wasm_fixtures/codecov_tests/src/lib.rs @@ -7,6 +7,7 @@ use core::panic; use xrpl_std::core::current_tx::escrow_finish::{get_current_escrow_finish, EscrowFinish}; use xrpl_std::core::current_tx::traits::TransactionCommonFields; use xrpl_std::core::locator::Locator; +use xrpl_std::core::types::blob::DEFAULT_BLOB_SIZE; use xrpl_std::core::types::issue::Issue; use xrpl_std::core::types::issue::XrpIssue; use xrpl_std::core::types::keylets; @@ -15,6 +16,7 @@ use xrpl_std::host; use xrpl_std::host::error_codes; use xrpl_std::host::trace::{trace, trace_num as trace_number}; use xrpl_std::sfield; +use xrpl_std::types::XRPL_CONTRACT_DATA_SIZE; mod host_bindings_loose; include!("host_bindings_loose.rs"); @@ -340,7 +342,7 @@ pub extern "C" fn finish() -> i32 { error_codes::INVALID_PARAMS, "get_tx_nested_array_len_neg_len", ); - let long_len = 4 * 1024 + 1; + let long_len = DEFAULT_BLOB_SIZE + 1; check_result( unsafe { host_bindings_loose::get_tx_nested_array_len(locator.as_ptr() as i32, long_len as i32) @@ -705,8 +707,9 @@ pub extern "C" fn finish() -> i32 { error_codes::DATA_FIELD_TOO_LARGE, "get_ledger_obj_nested_array_len_too_big_slice", ); + let too_big_data_len = XRPL_CONTRACT_DATA_SIZE + 1; check_result( - unsafe { host::update_data(locator.as_ptr(), long_len) }, + unsafe { host::update_data(locator.as_ptr(), too_big_data_len) }, error_codes::DATA_FIELD_TOO_LARGE, "update_data_too_big_slice", ); diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 945a5a8ce22..861df4a3fff 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -470,7 +470,7 @@ extern std::string const codecovTestsWasmHex = "9583c0004108101f4100419d83c0004111103c417f41041004417141ae83c000411e103c200041003602e801200141" "7f1004417141c78ec000411e103c200041ea016a41003a0000200041003b01e801200141031004417d41e58ec00041" "24103c200041003602e8012001418094ebdc031004417341898fc0004123103c4102100f416f41cc83c000411f103c" - "417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c200241812010124174" + "417f20002802a0011012417141eb83c000411f103c2002417f10124171418a84c000411f103c200241810810124174" "41a984c0004120103c200041e094ebdc036a220620002802a0011012417341c984c000411f103c2008420037030020" "05420037030020034200370300200042003703e8012004411420064108200141201020417341ac8fc0004118103c20" "0842003703002005420037030020034200370300200042003703e8012004411420044114200141201020417141c48f" @@ -492,17 +492,17 @@ extern std::string const codecovTestsWasmHex = "09411841a7a1c00041142001410210234171418392c000410e103c200620002802a001422a1001417341d685c00041" "11103c200041003b01e8014102200141021007416f419192c000411b103c200041003b01e801410220014102100a41" "6f41ac92c000412b103c200041003b01e8014101410220014102100b416f41d792c0004123103c4102100f416f41cc" - "83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c0004127103c41b980c000418120" - "1006417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e8012002418120" - "20014102100c417441fa92c0004121103c200041003b01e801200241812020014102100d4174419b93c0004131103c" - "200041003b01e8014101200241812020014102100e417441cc93c0004129103c20024181201012417441f686c00041" - "25103c200241812010134174419b87c0004135103c410120024181201014417441d087c000412d103c200241812010" - "15417441fd87c0004119103c41e782c00041812041a482c000410b41af82c000410e1017417441bd82c0004109103c" - "41e782c000410d41a482c00041812041af82c000410e1017417441bd82c0004109103c41e782c000410d41a482c000" - "410b41af82c0004181201017417441bd82c0004109103c200041003b01e8012002418120200141021016417441f593" - "c0004121103c200041003b01e80141a7a1c00041812041a7a1c00041142001410210234174419694c0004118103c20" - "0041003b01e80120044114200441142002418120200141021024417441ae94c000411f103c200041003b01e8012009" - "41812020044114200141021025417441cd94c0004122103c41e782c000410d200620002802a0014100100041734196" + "83c000411f103c41021010416f41e785c000412f103c410141021011416f419686c0004127103c41b980c000418108" + "1006417441bd86c000411f103c41b980c00041c1001006417441dc86c000411a103c200041003b01e8012002418108" + "20014102100c417441fa92c0004121103c200041003b01e801200241810820014102100d4174419b93c0004131103c" + "200041003b01e8014101200241810820014102100e417441cc93c0004129103c20024181081012417441f686c00041" + "25103c200241810810134174419b87c0004135103c410120024181081014417441d087c000412d103c200241812010" + "15417441fd87c0004119103c41e782c00041810841a482c000410b41af82c000410e1017417441bd82c0004109103c" + "41e782c000410d41a482c00041810841af82c000410e1017417441bd82c0004109103c41e782c000410d41a482c000" + "410b41af82c0004181081017417441bd82c0004109103c200041003b01e8012002418108200141021016417441f593" + "c0004121103c200041003b01e80141a7a1c00041810841a7a1c00041142001410210234174419694c0004118103c20" + "0041003b01e80120044114200441142002418108200141021024417441ae94c000411f103c200041003b01e8012009" + "41810820044114200141021025417441cd94c0004122103c41e782c000410d200620002802a0014100100041734196" "88c000410f103c200042d487b6f4c7d4b1c0003700e00141e782c000410d200041e095ebdc036a2207410810264173" "41a588c000411c103c41e782c000410d200620002802a001101f417341c188c0004116103c20074108200041e0016a" "220641081027417341d788c0004118103c20064108200741081027417341ef88c0004118103c200041003b01e80120" @@ -551,9 +551,9 @@ extern std::string const codecovTestsWasmHex = "41021018417141e9a0c000411d103c41e782c000410d200220002802a001101e417141918ac0004123103c41e796ab" "dd03410d41f189c000412041001000417341b48ac0004110103c41e796abdd03410d200641081026417341c48ac000" "411d103c41e796abdd03410d20044114101e417341e18ac0004118103c41e796abdd03410d419583c0004108101f41" - "7341f98ac0004117103c200220002802a001200241812041001000417441908bc000410e103c200241812042011001" - "4174419e8bc0004112103c41e782c000418120200641081026417441b08bc000411b103c41e782c000418120200441" - "14101e417441cb8bc0004116103c41e782c000418120419583c0004108101f417441e18bc0004115103c41e782c000" + "7341f98ac0004117103c200220002802a001200241810841001000417441908bc000410e103c200241810842011001" + "4174419e8bc0004112103c41e782c000418108200641081026417441b08bc000411b103c41e782c000418108200441" + "14101e417441cb8bc0004116103c41e782c000418108419583c0004108101f417441e18bc0004115103c41e782c000" "410d200220002802a001101f417141f68bc0004119103c200041003b018e02200220002802a0012004411420034102" "102541714186a1c0004121103c41e782c000410d200220002802a001410210004171418f8cc0004114103c41014100" "20044114101e410041a38cc000411a103c20004190026a240041010f0b0b418080c000410b417f20032003417f4e1b" From 0deb6bcadf93e6c2b4aaac6e83c795c9678defa3 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Apr 2026 18:39:14 -0400 Subject: [PATCH 202/212] fix build --- src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp b/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp index bb7e25614a2..c8e38f68057 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplLedgerHeader.cpp @@ -41,7 +41,7 @@ WasmHostFunctionsImpl::isAmendmentEnabled(uint256 const& amendmentId) const Expected WasmHostFunctionsImpl::isAmendmentEnabled(std::string_view const& amendmentName) const { - auto const& table = ctx_.registry.getAmendmentTable(); + auto const& table = ctx_.registry.get().getAmendmentTable(); auto const amendment = table.find(std::string(amendmentName)); return ctx_.view().rules().enabled(amendment); } From c5598a42849306c87f6002eb511bde2f65a071f2 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Apr 2026 19:05:34 -0400 Subject: [PATCH 203/212] fix clang-tidy issues --- include/xrpl/tx/wasm/WasmiVM.h | 4 +- src/libxrpl/basics/Number.cpp | 2 +- src/libxrpl/tx/wasm/HostFuncImplFloat.cpp | 72 ++++---- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 38 ++--- src/libxrpl/tx/wasm/WasmiVM.cpp | 8 +- src/test/app/HostFuncImpl_test.cpp | 196 +++++++++++----------- src/test/app/Wasm_test.cpp | 17 +- src/test/basics/Number_test.cpp | 2 +- 8 files changed, 171 insertions(+), 168 deletions(-) diff --git a/include/xrpl/tx/wasm/WasmiVM.h b/include/xrpl/tx/wasm/WasmiVM.h index 61bbedfd1aa..daa139cad64 100644 --- a/include/xrpl/tx/wasm/WasmiVM.h +++ b/include/xrpl/tx/wasm/WasmiVM.h @@ -77,9 +77,9 @@ using WasmImporttypeVec = WasmVec< struct WasmiResult { WasmValVec r; - bool f; // failure flag + bool f{false}; // failure flag - WasmiResult(unsigned N = 0) : r(N), f(false) + WasmiResult(unsigned N = 0) : r(N) { } diff --git a/src/libxrpl/basics/Number.cpp b/src/libxrpl/basics/Number.cpp index 7077030ccc9..dbdb40e94fd 100644 --- a/src/libxrpl/basics/Number.cpp +++ b/src/libxrpl/basics/Number.cpp @@ -1013,7 +1013,7 @@ log10(Number const& x, int iterations) // (1 <= normalX < 10) // ln(x) = ln(normalX * 10^norm) = ln(normalX) + norm * ln(10) - int diffExp = 15 + x.exponent(); + int const diffExp = 15 + x.exponent(); Number const normalX = x / Number(1, diffExp); auto const lnX = ln(normalX, iterations) + diffExp * LN10; auto const lgX = lnX / LN10; diff --git a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp index 0b31bcd6ce1..627d3b7d3f1 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp @@ -52,7 +52,7 @@ class Number2 : public Number if (m == 0) return; - Number x(makeNumber(m, decodedExponent)); + Number const x(makeNumber(m, decodedExponent)); if (m != x.mantissa() || decodedExponent != x.exponent()) return; // not canonical *static_cast(this) = x; @@ -194,7 +194,7 @@ std::string floatToString(Slice const& data) { // set default mode as we don't expect it will be used here - detail::FloatState rm(Number::rounding_mode::to_nearest); + detail::FloatState const rm(Number::rounding_mode::to_nearest); detail::Number2 const num(data); if (!num) { @@ -213,11 +213,11 @@ floatFromIntImpl(int64_t x, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 num(x); + detail::Number2 const num(x); return num.toBytes(); } // LCOV_EXCL_START @@ -234,11 +234,11 @@ floatFromUintImpl(uint64_t x, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 num(x); + detail::Number2 const num(x); auto r = num.toBytes(); return r; } @@ -256,10 +256,10 @@ floatSetImpl(int64_t mantissa, int32_t exponent, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 num(mantissa, exponent); + detail::Number2 const num(mantissa, exponent); if (!num) return Unexpected(HostFunctionError::FLOAT_COMPUTATION_ERROR); return num.toBytes(); @@ -277,11 +277,11 @@ floatCompareImpl(Slice const& x, Slice const& y) try { // set default mode as we don't expect it will be used here - detail::FloatState rm(Number::rounding_mode::to_nearest); - detail::Number2 xx(x); + detail::FloatState const rm(Number::rounding_mode::to_nearest); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 yy(y); + detail::Number2 const yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); if (xx < yy) @@ -304,17 +304,17 @@ floatAddImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 yy(y); + detail::Number2 const yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res = xx + yy; + detail::Number2 const res = xx + yy; return res.toBytes(); } @@ -332,16 +332,16 @@ floatSubtractImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 yy(y); + detail::Number2 const yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res = xx - yy; + detail::Number2 const res = xx - yy; return res.toBytes(); } @@ -359,16 +359,16 @@ floatMultiplyImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 yy(y); + detail::Number2 const yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res = xx * yy; + detail::Number2 const res = xx * yy; return res.toBytes(); } @@ -386,16 +386,16 @@ floatDivideImpl(Slice const& x, Slice const& y, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 yy(y); + detail::Number2 const yy(y); if (!yy) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res = xx / yy; + detail::Number2 const res = xx / yy; return res.toBytes(); } @@ -414,15 +414,15 @@ floatRootImpl(Slice const& x, int32_t n, int32_t mode) if (n < 1) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res(root(xx, n)); + detail::Number2 const res(root(xx, n)); return res.toBytes(); } @@ -443,17 +443,17 @@ floatPowerImpl(Slice const& x, int32_t n, int32_t mode) if ((n < 0) || (n > wasmMaxExponent)) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); if (xx == Number() && (n == 0)) return Unexpected(HostFunctionError::INVALID_PARAMS); - detail::Number2 res(power(xx, n, 1)); + detail::Number2 const res(power(xx, n, 1)); return res.toBytes(); } @@ -471,15 +471,15 @@ floatLogImpl(Slice const& x, int32_t mode) { try { - detail::FloatState rm(mode); + detail::FloatState const rm(mode); if (!rm) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 xx(x); + detail::Number2 const xx(x); if (!xx) return Unexpected(HostFunctionError::FLOAT_INPUT_MALFORMED); - detail::Number2 res(log10(xx)); + detail::Number2 const res(log10(xx)); return res.toBytes(); } diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 6003aefd84c..88598469e0a 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -76,7 +76,7 @@ getDataUnsigned(IW const* runtime, wasm_val_vec_t const* params, int32_t& i) return Unexpected(HostFunctionError::INVALID_PARAMS); T x; - uintptr_t p = reinterpret_cast(r->data()); + uintptr_t const p = reinterpret_cast(r->data()); if (p & (alignof(T) - 1)) // unaligned { memcpy(&x, r->data(), sizeof(T)); @@ -328,7 +328,7 @@ static inline HostFunctions* getHF(void* env) { auto const* udata = reinterpret_cast(env); - HostFunctions* hf = reinterpret_cast(udata->first); + HostFunctions const* hf = reinterpret_cast(udata->first); return hf; } @@ -336,12 +336,12 @@ static inline Expected checkGas(void* env) { auto const* udata = reinterpret_cast(env); - HostFunctions* hf = reinterpret_cast(udata->first); + HostFunctions const* hf = reinterpret_cast(udata->first); auto const* runtime = reinterpret_cast(hf->getRT()); if (runtime == nullptr) { - wasm_trap_t* trap = reinterpret_cast( + wasm_trap_t const* trap = reinterpret_cast( WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE return Unexpected(trap); // LCOV_EXCL_LINE } @@ -352,14 +352,14 @@ checkGas(void* env) if (runtime->setGas(x) < 0) { - wasm_trap_t* trap = reinterpret_cast( + wasm_trap_t const* trap = reinterpret_cast( WasmEngine::instance().newTrap("can't set gas")); // LCOV_EXCL_LINE return Unexpected(trap); // LCOV_EXCL_LINE } if (gas < impFunc.gas) { - wasm_trap_t* trap = + wasm_trap_t const* trap = reinterpret_cast(WasmEngine::instance().newTrap("hf out of gas")); return Unexpected(trap); } @@ -375,7 +375,7 @@ getLedgerSqn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resul return g.error(); // LCOV_EXCL_LINE auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; + int const index = 0; return returnResult(runtime, params, results, hf->getLedgerSqn(), index); } @@ -387,7 +387,7 @@ getParentLedgerTime_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t return g.error(); // LCOV_EXCL_LINE auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; + int const index = 0; return returnResult(runtime, params, results, hf->getParentLedgerTime(), index); } @@ -399,7 +399,7 @@ getParentLedgerHash_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t return g.error(); // LCOV_EXCL_LINE auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; + int const index = 0; return returnResult(runtime, params, results, hf->getParentLedgerHash(), index); } @@ -411,7 +411,7 @@ getBaseFee_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results return g.error(); // LCOV_EXCL_LINE auto* hf = getHF(env); auto const* runtime = reinterpret_cast(hf->getRT()); - int index = 0; + int const index = 0; return returnResult(runtime, params, results, hf->getBaseFee(), index); } @@ -1818,11 +1818,11 @@ testGetDataIncrement() wasm_val_t values[4]; std::array buffer = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; - MockInstanceWrapper runtime(wmem{buffer.data(), buffer.size()}); + MockInstanceWrapper const runtime(wmem{buffer.data(), buffer.size()}); { // test int32_t - wasm_val_vec_t params = {1, &values[0]}; + wasm_val_vec_t const params = {1, &values[0]}; values[0] = WASM_I32_VAL(42); @@ -1834,7 +1834,7 @@ testGetDataIncrement() { // test int64_t - wasm_val_vec_t params = {1, &values[0]}; + wasm_val_vec_t const params = {1, &values[0]}; values[0] = WASM_I64_VAL(1234); @@ -1846,7 +1846,7 @@ testGetDataIncrement() { // test SFieldCRef - wasm_val_vec_t params = {1, &values[0]}; + wasm_val_vec_t const params = {1, &values[0]}; values[0] = WASM_I32_VAL(sfAccount.fieldCode); @@ -1858,7 +1858,7 @@ testGetDataIncrement() { // test Slice - wasm_val_vec_t params = {2, &values[0]}; + wasm_val_vec_t const params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(3); @@ -1871,7 +1871,7 @@ testGetDataIncrement() { // test string - wasm_val_vec_t params = {2, &values[0]}; + wasm_val_vec_t const params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(5); @@ -1889,7 +1889,7 @@ testGetDataIncrement() AccountID const id( calcAccountID(generateKeyPair(KeyType::secp256k1, generateSeed("alice")).first)); - wasm_val_vec_t params = {2, &values[0]}; + wasm_val_vec_t const params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(id.bytes); @@ -1905,7 +1905,7 @@ testGetDataIncrement() // test uint256 Hash h1 = sha512Half(Slice(buffer.data(), 8)); - wasm_val_vec_t params = {2, &values[0]}; + wasm_val_vec_t const params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(h1.bytes); @@ -1921,7 +1921,7 @@ testGetDataIncrement() // test Currency Currency const c = xrpCurrency(); - wasm_val_vec_t params = {2, &values[0]}; + wasm_val_vec_t const params = {2, &values[0]}; values[0] = WASM_I32_VAL(0); values[1] = WASM_I32_VAL(c.bytes); diff --git a/src/libxrpl/tx/wasm/WasmiVM.cpp b/src/libxrpl/tx/wasm/WasmiVM.cpp index 8147f84588a..622311540a8 100644 --- a/src/libxrpl/tx/wasm/WasmiVM.cpp +++ b/src/libxrpl/tx/wasm/WasmiVM.cpp @@ -376,7 +376,7 @@ ModuleWrapper::buildImports(StorePtr& s, ImportVec const& imports) const WasmValtypeVec params(makeImpParams(imp)); WasmValtypeVec results(makeImpReturn(imp)); - std::unique_ptr ftype( + std::unique_ptr const ftype( wasm_functype_new(¶ms.vec_, &results.vec_), &wasm_functype_delete); params.release(); @@ -769,7 +769,7 @@ WasmiEngine::runHlp( ImportVec const& imports) { // currently only 1 module support, possible parallel UT run - std::lock_guard lg(m_); + std::lock_guard const lg(m_); if (wasmCode.empty()) throw std::runtime_error("empty module"); @@ -866,7 +866,7 @@ WasmiEngine::checkHlp( ImportVec const& imports) { // currently only 1 module support, possible parallel UT run - std::lock_guard lg(m_); + std::lock_guard const lg(m_); // Create and instantiate the module. if (wasmCode.empty()) @@ -918,7 +918,7 @@ WasmiEngine::newTrap(std::string const& txt) if (!txt.empty()) wasm_name_new(&msg, txt.size() + 1, txt.c_str()); // include 0 - wasm_trap_t* trap = wasm_trap_new(store_.get(), &msg); + wasm_trap_t const* trap = wasm_trap_new(store_.get(), &msg); if (!txt.empty()) wasm_byte_vec_delete(&msg); diff --git a/src/test/app/HostFuncImpl_test.cpp b/src/test/app/HostFuncImpl_test.cpp index e77c3ded0ce..e46634ca447 100644 --- a/src/test/app/HostFuncImpl_test.cpp +++ b/src/test/app/HostFuncImpl_test.cpp @@ -95,7 +95,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const result = hfs.getLedgerSqn(); if (BEAST_EXPECT(result.has_value())) @@ -114,7 +114,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const result = hfs.getParentLedgerTime(); if (BEAST_EXPECT(result.has_value())) { @@ -135,7 +135,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const result = hfs.getParentLedgerHash(); if (BEAST_EXPECT(result.has_value())) @@ -153,7 +153,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const result = hfs.getBaseFee(); if (BEAST_EXPECT(result.has_value())) @@ -170,7 +170,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); // Use featureTokenEscrow for testing auto const amendmentId = featureTokenEscrow; @@ -191,7 +191,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Test with a fake amendment id (all zeros) - uint256 fakeId; + uint256 const fakeId; { auto const result = hfs.isAmendmentEnabled(fakeId); BEAST_EXPECT(result.has_value()); @@ -199,7 +199,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite } // Test with a fake amendment name - std::string fakeName = "FakeAmendment"; + std::string const fakeName = "FakeAmendment"; { auto const result = hfs.isAmendmentEnabled(fakeName); BEAST_EXPECT(result.has_value()); @@ -280,7 +280,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); { - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const account = hfs.getTxField(sfAccount); BEAST_EXPECT(account && std::ranges::equal(*account, env.master.id())); @@ -326,10 +326,10 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, iouAsset.issue()}); }); ApplyContext ac2 = createApplyContext(env, ov, stx2); - WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac2, dummyEscrow); auto const asset = hfs.getTxField(sfAsset); - std::vector expectedAsset(20, 0); + std::vector const expectedAsset(20, 0); BEAST_EXPECT(asset && *asset == expectedAsset); auto const asset2 = hfs.getTxField(sfAsset2); @@ -345,7 +345,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setFieldIssue(sfAsset2, STIssue{sfAsset2, MPTIssue{mptId}}); }); ApplyContext ac2 = createApplyContext(env, ov, stx2); - WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac2, dummyEscrow); auto const asset = hfs.getTxField(sfAsset); if (BEAST_EXPECT(asset.has_value())) @@ -367,7 +367,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite obj.setFieldU8(sfAssetScale, expectedScale); }); ApplyContext ac2 = createApplyContext(env, ov, stx2); - WasmHostFunctionsImpl hfs(ac2, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac2, dummyEscrow); auto const actualScale = hfs.getTxField(sfAssetScale); if (BEAST_EXPECT(actualScale.has_value())) @@ -397,7 +397,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto const escrowKeylet = keylet::escrow(env.master, env.seq(env.master) - 1); BEAST_EXPECT(env.le(escrowKeylet)); - WasmHostFunctionsImpl hfs(ac, escrowKeylet); + WasmHostFunctionsImpl const hfs(ac, escrowKeylet); // Should return the Account field from the escrow ledger object auto const account = hfs.getCurrentLedgerObjField(sfAccount); @@ -425,7 +425,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); - WasmHostFunctionsImpl hfs2(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs2(ac, dummyEscrow); auto const account = hfs2.getCurrentLedgerObjField(sfAccount); if (BEAST_EXPECT(!account.has_value())) { @@ -524,14 +524,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator is a sequence of int32_t codes: // [sfMemos.fieldCode, 0, sfMemoData.fieldCode] std::vector locatorVec = {sfMemos.fieldCode, 0, sfMemoData.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); if (BEAST_EXPECTS(result.has_value(), std::to_string(static_cast(result.error())))) { - std::string memoData(result.value().begin(), result.value().end()); + std::string const memoData(result.value().begin(), result.value().end()); BEAST_EXPECT(memoData == "hello"); } } @@ -539,14 +539,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite { // Locator for sfCredentialIDs[0] std::vector locatorVec = {sfCredentialIDs.fieldCode, 0}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); if (BEAST_EXPECTS(result.has_value(), std::to_string(static_cast(result.error())))) { - std::string credIdResult(result.value().begin(), result.value().end()); + std::string const credIdResult(result.value().begin(), result.value().end()); BEAST_EXPECT(strHex(credIdResult) == credIdHex); } } @@ -554,7 +554,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { // can use the nested locator for base fields too std::vector locatorVec = {sfAccount.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); @@ -570,7 +570,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite // unaligned locator std::vector locatorVec(sizeof(int32_t) + 1); memcpy(locatorVec.data() + 1, &sfAccount.fieldCode, sizeof(int32_t)); - Slice locator(reinterpret_cast(locatorVec.data() + 1), sizeof(int32_t)); + Slice const locator( + reinterpret_cast(locatorVec.data() + 1), sizeof(int32_t)); auto const account = hfs.getTxNestedField(locator); if (BEAST_EXPECTS( @@ -582,7 +583,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError) { - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getTxNestedField(locator); @@ -687,7 +688,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for malformed locator (not multiple of 4) { std::vector locatorVec = {sfMemos.fieldCode}; - Slice malformedLocator(reinterpret_cast(locatorVec.data()), 3); + Slice const malformedLocator(reinterpret_cast(locatorVec.data()), 3); auto const malformedResult = hfs.getTxNestedField(malformedLocator); BEAST_EXPECT( !malformedResult.has_value() && @@ -718,7 +719,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for base field std::vector baseLocator = {sfSignerQuorum.fieldCode}; - Slice baseLocatorSlice( + Slice const baseLocatorSlice( reinterpret_cast(baseLocator.data()), baseLocator.size() * sizeof(int32_t)); auto const signerQuorum = hfs.getCurrentLedgerObjNestedField(baseLocatorSlice); @@ -730,7 +731,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite auto expectError = [&](std::vector const& locatorVec, HostFunctionError expectedError) { - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = hfs.getCurrentLedgerObjNestedField(locator); @@ -755,7 +756,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite HostFunctionError::LOCATOR_MALFORMED); // Locator for empty locator - Slice emptyLocator(nullptr, 0); + Slice const emptyLocator(nullptr, 0); auto const emptyResult = hfs.getCurrentLedgerObjNestedField(emptyLocator); BEAST_EXPECT( !emptyResult.has_value() && @@ -763,7 +764,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for malformed locator (not multiple of 4) std::vector malformedLocatorVec = {sfMemos.fieldCode}; - Slice malformedLocator(reinterpret_cast(malformedLocatorVec.data()), 3); + Slice const malformedLocator( + reinterpret_cast(malformedLocatorVec.data()), 3); auto const malformedResult = hfs.getCurrentLedgerObjNestedField(malformedLocator); BEAST_EXPECT( !malformedResult.has_value() && @@ -771,9 +773,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); - WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + WasmHostFunctionsImpl const dummyHfs(ac, dummyEscrow); std::vector const locatorVec = {sfAccount.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const result = dummyHfs.getCurrentLedgerObjNestedField(locator); @@ -814,7 +816,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { std::vector const locatorVec = { sfSignerEntries.fieldCode, 0, sfAccount.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); @@ -963,7 +965,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; // Transaction with an array field - STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { obj.setAccountID(sfAccount, env.master.id()); STArray memos; { @@ -984,7 +986,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov, stx); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); // Should return 1 for sfMemos auto const memosLen = hfs.getTxArrayLen(sfMemos); @@ -1024,7 +1026,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const signerKeylet = keylet::signers(env.master.id()); - WasmHostFunctionsImpl hfs(ac, signerKeylet); + WasmHostFunctionsImpl const hfs(ac, signerKeylet); auto const entriesLen = hfs.getCurrentLedgerObjArrayLen(sfSignerEntries); if (BEAST_EXPECT(entriesLen.has_value())) @@ -1041,7 +1043,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); - WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + WasmHostFunctionsImpl const dummyHfs(ac, dummyEscrow); auto const len = dummyHfs.getCurrentLedgerObjArrayLen(sfMemos); if (BEAST_EXPECT(!len.has_value())) BEAST_EXPECT(len.error() == HostFunctionError::LEDGER_OBJ_NOT_FOUND); @@ -1116,7 +1118,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env{*this}; OpenView ov{*env.current()}; - STTx stx = STTx(ttESCROW_FINISH, [&](auto& obj) { + STTx const stx = STTx(ttESCROW_FINISH, [&](auto& obj) { STArray memos; STObject memoObj(sfMemo); memoObj.setFieldVL(sfMemoData, Slice("hello", 5)); @@ -1147,7 +1149,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfMemos { std::vector locatorVec = {sfMemos.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getTxNestedArrayLen(locator); @@ -1199,7 +1201,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries { std::vector locatorVec = {sfSignerEntries.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getCurrentLedgerObjNestedArrayLen(locator); @@ -1214,7 +1216,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite { auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master) + 5); - WasmHostFunctionsImpl dummyHfs(ac, dummyEscrow); + WasmHostFunctionsImpl const dummyHfs(ac, dummyEscrow); std::vector locatorVec = {sfAccount.fieldCode}; Slice const locator( reinterpret_cast(locatorVec.data()), @@ -1253,7 +1255,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite // Locator for sfSignerEntries std::vector locatorVec = {sfSignerEntries.fieldCode}; - Slice locator( + Slice const locator( reinterpret_cast(locatorVec.data()), locatorVec.size() * sizeof(int32_t)); auto const arrLen = hfs.getLedgerObjNestedArrayLen(1, locator); @@ -1293,7 +1295,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite expectError({}, HostFunctionError::LOCATOR_MALFORMED); // Error: locator malformed (not multiple of 4) - Slice malformedLocator(reinterpret_cast(locator.data()), 3); + Slice const malformedLocator(reinterpret_cast(locator.data()), 3); auto const malformed = hfs.getLedgerObjNestedArrayLen(1, malformedLocator); BEAST_EXPECT( !malformed.has_value() && malformed.error() == HostFunctionError::LOCATOR_MALFORMED); @@ -1344,7 +1346,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); // Generate a keypair and sign a message auto const kp = generateKeyPair(KeyType::secp256k1, randomSeed()); @@ -1425,7 +1427,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); std::string data = "hello world"; auto const result = hfs.computeSha512HalfHash(Slice(data.data(), data.size())); @@ -1447,7 +1449,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto compareKeylet = [](std::vector const& bytes, Keylet const& kl) { return std::ranges::equal(bytes, kl.key); @@ -1549,7 +1551,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite COMPARE_KEYLET(escrowKeylet, keylet::escrow, env.master.id(), 1); COMPARE_KEYLET_FAIL(escrowKeylet, HostFunctionError::INVALID_ACCOUNT, xrpAccount(), 1); - Currency usd = to_currency("USD"); + Currency const usd = to_currency("USD"); COMPARE_KEYLET(lineKeylet, keylet::line, env.master.id(), alice.id(), usd); COMPARE_KEYLET_FAIL( lineKeylet, HostFunctionError::INVALID_PARAMS, env.master.id(), env.master.id(), usd); @@ -1639,7 +1641,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(alice, env.seq(alice)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); // Should succeed for valid NFT { @@ -1694,7 +1696,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); // Should succeed for valid NFT id { @@ -1728,7 +1730,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const result = hfs.getNFTTaxon(nftId); if (BEAST_EXPECT(result.has_value())) @@ -1752,7 +1754,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.getNFTFlags(nftId); @@ -1785,7 +1787,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.getNFTTransferFee(nftId); @@ -1819,7 +1821,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.getNFTSerial(nftId); @@ -1845,13 +1847,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kTrace}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "test trace"; + std::string const msg = "test trace"; std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); auto const result = hfs.trace(msg, slice, false); @@ -1881,13 +1883,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kError}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "test trace"; + std::string const msg = "test trace"; std::string data = "abc"; auto const slice = Slice(data.data(), data.size()); auto const result = hfs.trace(msg, slice, false); @@ -1907,14 +1909,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kTrace}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace number"; - int64_t num = 123456789; + std::string const msg = "trace number"; + int64_t const num = 123456789; auto const result = hfs.traceNum(msg, num); if (BEAST_EXPECT(result.has_value())) { @@ -1930,14 +1932,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kError}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace number"; - int64_t num = 123456789; + std::string const msg = "trace number"; + int64_t const num = 123456789; auto const result = hfs.traceNum(msg, num); BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); @@ -1955,13 +1957,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kTrace}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace account"; + std::string const msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); if (BEAST_EXPECT(result.has_value())) { @@ -1977,12 +1979,12 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kError}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); - std::string msg = "trace account"; + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); + std::string const msg = "trace account"; auto const result = hfs.traceAccount(msg, env.master.id()); BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); @@ -2000,14 +2002,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kTrace}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace amount"; - STAmount amount = XRP(12345); + std::string const msg = "trace amount"; + STAmount const amount = XRP(12345); { auto const result = hfs.traceAmount(msg, amount); if (BEAST_EXPECT(result.has_value())) @@ -2023,7 +2025,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite Account const alice("alice"); env.fund(XRP(1000), alice); env.close(); - STAmount iouAmount = env.master["USD"](100); + STAmount const iouAmount = env.master["USD"](100); { auto const result = hfs.traceAmount(msg, iouAmount); if (BEAST_EXPECT(result.has_value())) @@ -2033,8 +2035,8 @@ struct HostFuncImpl_test : public beast::unit_test::suite // MPT amount { auto const mptId = makeMptID(42, env.master.id()); - Asset mptAsset = Asset(mptId); - STAmount mptAmount(mptAsset, 123456); + Asset const mptAsset = Asset(mptId); + STAmount const mptAmount(mptAsset, 123456); auto const result = hfs.traceAmount(msg, mptAmount); if (BEAST_EXPECT(result.has_value())) BEAST_EXPECT(*result == 0); @@ -2046,14 +2048,14 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kError}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace amount"; - STAmount amount = XRP(12345); + std::string const msg = "trace amount"; + STAmount const amount = XRP(12345); auto const result = hfs.traceAmount(msg, amount); BEAST_EXPECT(result && *result == 0); auto const messages = sink.messages().str(); @@ -2098,9 +2100,9 @@ struct HostFuncImpl_test : public beast::unit_test::suite ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace float"; + std::string const msg = "trace float"; { auto const result = hfs.traceFloat(msg, makeSlice(invalid)); @@ -2118,13 +2120,13 @@ struct HostFuncImpl_test : public beast::unit_test::suite Env env(*this); OpenView ov{*env.current()}; test::StreamSink sink{beast::severities::kError}; - beast::Journal jlog{sink}; + beast::Journal const jlog{sink}; ApplyContext ac = createApplyContext(env, ov, jlog); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); - std::string msg = "trace float"; + std::string const msg = "trace float"; auto const result = hfs.traceFloat(msg, makeSlice(invalid)); BEAST_EXPECT(result && *result == 0); @@ -2143,7 +2145,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatFromInt(std::numeric_limits::min(), -1); @@ -2183,7 +2185,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatFromUint(std::numeric_limits::min(), -1); @@ -2219,7 +2221,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatSet(1, 0, -1); @@ -2291,7 +2293,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatCompare(Slice(), Slice()); @@ -2345,7 +2347,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatAdd(Slice(), Slice(), -1); @@ -2392,7 +2394,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatSubtract(Slice(), Slice(), -1); @@ -2441,7 +2443,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatMultiply(Slice(), Slice(), -1); @@ -2494,7 +2496,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatDivide(Slice(), Slice(), -1); @@ -2551,7 +2553,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatRoot(Slice(), 2, -1); @@ -2620,7 +2622,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatPower(Slice(), 2, -1); @@ -2698,7 +2700,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); { auto const result = hfs.floatLog(Slice(), -1); @@ -2801,7 +2803,7 @@ struct HostFuncImpl_test : public beast::unit_test::suite OpenView ov{*env.current()}; ApplyContext ac = createApplyContext(env, ov); auto const dummyEscrow = keylet::escrow(env.master, env.seq(env.master)); - WasmHostFunctionsImpl hfs(ac, dummyEscrow); + WasmHostFunctionsImpl const hfs(ac, dummyEscrow); auto const y = hfs.floatSet(20, 0, 0); if (!BEAST_EXPECT(y)) diff --git a/src/test/app/Wasm_test.cpp b/src/test/app/Wasm_test.cpp index 93add98f3a4..b875eaef504 100644 --- a/src/test/app/Wasm_test.cpp +++ b/src/test/app/Wasm_test.cpp @@ -18,8 +18,8 @@ using Add_proto = int32_t(int32_t, int32_t); static wasm_trap_t* Add(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) { - int32_t Val1 = params->data[0].of.i32; - int32_t Val2 = params->data[1].of.i32; + int32_t const Val1 = params->data[0].of.i32; + int32_t const Val2 = params->data[1].of.i32; // printf("Host function \"Add\": %d + %d\n", Val1, Val2); results->data[0] = WASM_I32_VAL(Val1 + Val2); return nullptr; @@ -204,12 +204,12 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; - Env env{*this}; + Env const env{*this}; HostFunctions hfs(env.journal); { auto wasm = hexToBytes("00000000"); - std::string funcName("mock_escrow"); + std::string const funcName("mock_escrow"); auto re = runEscrowWasm(wasm, hfs, 15, funcName, {}); BEAST_EXPECT(!re); @@ -217,7 +217,7 @@ struct Wasm_test : public beast::unit_test::suite { auto wasm = hexToBytes("00112233445566778899AA"); - std::string funcName("mock_escrow"); + std::string const funcName("mock_escrow"); auto const re = preflightEscrowWasm(wasm, hfs, funcName); BEAST_EXPECT(!isTesSuccess(re)); @@ -503,7 +503,7 @@ struct Wasm_test : public beast::unit_test::suite auto const deepWasm = hexToBytes(deepRecursionHex); TestHostFunctionsSink hfs(env); - std::string funcName("finish"); + std::string const funcName("finish"); auto re = runEscrowWasm(deepWasm, hfs, 1'000'000'000, funcName, {}); BEAST_EXPECT(!re && re.error()); // std::cout << "bad case (deep recursion) result " << re.error() @@ -755,7 +755,7 @@ struct Wasm_test : public beast::unit_test::suite auto const startLoopWasm = hexToBytes(startLoopHex); TestLedgerDataProvider hfs(env); - ImportVec imports; + ImportVec const imports; auto& engine = WasmEngine::instance(); auto checkRes = engine.check(startLoopWasm, hfs, "finish", {}, imports, env.journal); @@ -971,6 +971,7 @@ struct Wasm_test : public beast::unit_test::suite // add 1k parameter (max that wasmi support) std::vector params; + params.reserve(1000); for (int i = 0; i < 1000; ++i) params.push_back({.type = WT_I32, .of = {.i32 = 2 * i}}); @@ -1012,7 +1013,7 @@ struct Wasm_test : public beast::unit_test::suite using namespace test::jtx; unsigned const RESERVED = 64; - std::uint8_t nop = 0x01; + std::uint8_t const nop = 0x01; std::array const codeMarker = { nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop, nop}; auto const opcReserved = hexToBytes(opcReservedHex); diff --git a/src/test/basics/Number_test.cpp b/src/test/basics/Number_test.cpp index 71b4b388db0..0079b540b08 100644 --- a/src/test/basics/Number_test.cpp +++ b/src/test/basics/Number_test.cpp @@ -1582,7 +1582,7 @@ class Number_test : public beast::unit_test::suite } else { - NumberRoundModeGuard mg(Number::towards_zero); + NumberRoundModeGuard const mg(Number::towards_zero); test(cLarge); } From 63bd5fc4ee182ecaab4a07703f535e4e7bcc7401 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Apr 2026 19:07:10 -0400 Subject: [PATCH 204/212] fix clang-tidy issues --- src/test/app/FeeVote_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 23f4b40018b..110ff56163e 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -393,7 +393,7 @@ class FeeVote_test : public beast::unit_test::suite // Create the next ledger to apply transaction to ledger = std::make_shared(*ledger, env.app().getTimeKeeper().closeTime()); - FeeSettingsFields fields{ + FeeSettingsFields const fields{ .baseFeeDrops = XRPAmount{10}, .reserveBaseDrops = XRPAmount{200000}, .reserveIncrementDrops = XRPAmount{50000}, @@ -425,7 +425,7 @@ class FeeVote_test : public beast::unit_test::suite // Create the next ledger to apply transaction to ledger = std::make_shared(*ledger, env.app().getTimeKeeper().closeTime()); - FeeSettingsFields fields{ + FeeSettingsFields const fields{ .baseFeeDrops = XRPAmount{10}, .reserveBaseDrops = XRPAmount{200000}, .reserveIncrementDrops = XRPAmount{50000}, From 0acfa1c4f2775ee78107a87ffa308205624d2944 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 2 Apr 2026 19:22:52 -0400 Subject: [PATCH 205/212] fix merge issues --- include/xrpl/core/ServiceRegistry.h | 1 - .../protocol_autogen/ledger_entries/Escrow.h | 70 ++++++++++++++ .../transactions/EscrowCreate.h | 96 ++++++++++++++++--- .../transactions/EscrowFinish.h | 37 +++++++ src/libxrpl/tx/Transactor.cpp | 3 +- .../tx/transactors/escrow/EscrowCreate.cpp | 17 +--- .../tx/transactors/escrow/EscrowFinish.cpp | 4 +- .../tx/transactors/escrow/EscrowHelpers.h | 11 +++ .../ledger_entries/EscrowTests.cpp | 54 +++++++++++ .../transactions/EscrowCreateTests.cpp | 72 +++++++++++--- .../transactions/EscrowFinishTests.cpp | 21 ++++ 11 files changed, 345 insertions(+), 41 deletions(-) diff --git a/include/xrpl/core/ServiceRegistry.h b/include/xrpl/core/ServiceRegistry.h index 0f033134611..1466d7ca7b3 100644 --- a/include/xrpl/core/ServiceRegistry.h +++ b/include/xrpl/core/ServiceRegistry.h @@ -3,7 +3,6 @@ #include #include #include -#include #include #include diff --git a/include/xrpl/protocol_autogen/ledger_entries/Escrow.h b/include/xrpl/protocol_autogen/ledger_entries/Escrow.h index fd15b2a7132..f64a7b702c6 100644 --- a/include/xrpl/protocol_autogen/ledger_entries/Escrow.h +++ b/include/xrpl/protocol_autogen/ledger_entries/Escrow.h @@ -174,6 +174,54 @@ class Escrow : public LedgerEntryBase return this->sle_->isFieldPresent(sfFinishAfter); } + /** + * @brief Get sfFinishFunction (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getFinishFunction() const + { + if (hasFinishFunction()) + return this->sle_->at(sfFinishFunction); + return std::nullopt; + } + + /** + * @brief Check if sfFinishFunction is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasFinishFunction() const + { + return this->sle_->isFieldPresent(sfFinishFunction); + } + + /** + * @brief Get sfData (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getData() const + { + if (hasData()) + return this->sle_->at(sfData); + return std::nullopt; + } + + /** + * @brief Check if sfData is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasData() const + { + return this->sle_->isFieldPresent(sfData); + } + /** * @brief Get sfSourceTag (soeOPTIONAL) * @return The field value, or std::nullopt if not present. @@ -451,6 +499,28 @@ class EscrowBuilder : public LedgerEntryBuilderBase return *this; } + /** + * @brief Set sfFinishFunction (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + EscrowBuilder& + setFinishFunction(std::decay_t const& value) + { + object_[sfFinishFunction] = value; + return *this; + } + + /** + * @brief Set sfData (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + EscrowBuilder& + setData(std::decay_t const& value) + { + object_[sfData] = value; + return *this; + } + /** * @brief Set sfSourceTag (soeOPTIONAL) * @return Reference to this builder for method chaining. diff --git a/include/xrpl/protocol_autogen/transactions/EscrowCreate.h b/include/xrpl/protocol_autogen/transactions/EscrowCreate.h index 32dae6cc578..315b362fea7 100644 --- a/include/xrpl/protocol_autogen/transactions/EscrowCreate.h +++ b/include/xrpl/protocol_autogen/transactions/EscrowCreate.h @@ -58,6 +58,32 @@ class EscrowCreate : public TransactionBase return this->tx_->at(sfDestination); } + /** + * @brief Get sfDestinationTag (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getDestinationTag() const + { + if (hasDestinationTag()) + { + return this->tx_->at(sfDestinationTag); + } + return std::nullopt; + } + + /** + * @brief Check if sfDestinationTag is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasDestinationTag() const + { + return this->tx_->isFieldPresent(sfDestinationTag); + } + /** * @brief Get sfAmount (soeREQUIRED) * @note This field supports MPT (Multi-Purpose Token) amounts. @@ -149,29 +175,55 @@ class EscrowCreate : public TransactionBase } /** - * @brief Get sfDestinationTag (soeOPTIONAL) + * @brief Get sfFinishFunction (soeOPTIONAL) * @return The field value, or std::nullopt if not present. */ [[nodiscard]] - protocol_autogen::Optional - getDestinationTag() const + protocol_autogen::Optional + getFinishFunction() const { - if (hasDestinationTag()) + if (hasFinishFunction()) { - return this->tx_->at(sfDestinationTag); + return this->tx_->at(sfFinishFunction); } return std::nullopt; } /** - * @brief Check if sfDestinationTag is present. + * @brief Check if sfFinishFunction is present. * @return True if the field is present, false otherwise. */ [[nodiscard]] bool - hasDestinationTag() const + hasFinishFunction() const { - return this->tx_->isFieldPresent(sfDestinationTag); + return this->tx_->isFieldPresent(sfFinishFunction); + } + + /** + * @brief Get sfData (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getData() const + { + if (hasData()) + { + return this->tx_->at(sfData); + } + return std::nullopt; + } + + /** + * @brief Check if sfData is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasData() const + { + return this->tx_->isFieldPresent(sfData); } }; @@ -230,6 +282,17 @@ class EscrowCreateBuilder : public TransactionBuilderBase return *this; } + /** + * @brief Set sfDestinationTag (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + EscrowCreateBuilder& + setDestinationTag(std::decay_t const& value) + { + object_[sfDestinationTag] = value; + return *this; + } + /** * @brief Set sfAmount (soeREQUIRED) * @note This field supports MPT (Multi-Purpose Token) amounts. @@ -276,13 +339,24 @@ class EscrowCreateBuilder : public TransactionBuilderBase } /** - * @brief Set sfDestinationTag (soeOPTIONAL) + * @brief Set sfFinishFunction (soeOPTIONAL) * @return Reference to this builder for method chaining. */ EscrowCreateBuilder& - setDestinationTag(std::decay_t const& value) + setFinishFunction(std::decay_t const& value) { - object_[sfDestinationTag] = value; + object_[sfFinishFunction] = value; + return *this; + } + + /** + * @brief Set sfData (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + EscrowCreateBuilder& + setData(std::decay_t const& value) + { + object_[sfData] = value; return *this; } diff --git a/include/xrpl/protocol_autogen/transactions/EscrowFinish.h b/include/xrpl/protocol_autogen/transactions/EscrowFinish.h index 20e9a089fbe..1fd63bd028d 100644 --- a/include/xrpl/protocol_autogen/transactions/EscrowFinish.h +++ b/include/xrpl/protocol_autogen/transactions/EscrowFinish.h @@ -146,6 +146,32 @@ class EscrowFinish : public TransactionBase { return this->tx_->isFieldPresent(sfCredentialIDs); } + + /** + * @brief Get sfComputationAllowance (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getComputationAllowance() const + { + if (hasComputationAllowance()) + { + return this->tx_->at(sfComputationAllowance); + } + return std::nullopt; + } + + /** + * @brief Check if sfComputationAllowance is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasComputationAllowance() const + { + return this->tx_->isFieldPresent(sfComputationAllowance); + } }; /** @@ -247,6 +273,17 @@ class EscrowFinishBuilder : public TransactionBuilderBase return *this; } + /** + * @brief Set sfComputationAllowance (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + EscrowFinishBuilder& + setComputationAllowance(std::decay_t const& value) + { + object_[sfComputationAllowance] = value; + return *this; + } + /** * @brief Build and return the EscrowFinish wrapper. * @param publicKey The public key for signing. diff --git a/src/libxrpl/tx/Transactor.cpp b/src/libxrpl/tx/Transactor.cpp index 8bdb25a66c4..cb65fc5ce5b 100644 --- a/src/libxrpl/tx/Transactor.cpp +++ b/src/libxrpl/tx/Transactor.cpp @@ -1254,7 +1254,8 @@ Transactor::operator()() } if (result == tecWASM_REJECTED) - modifyWasmDataFields(view(), modifiedWasmObjects, ctx_.registry.journal("View")); + modifyWasmDataFields( + view(), modifiedWasmObjects, ctx_.registry.get().getJournal("View")); applied = isTecClaim(result); } diff --git a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp index 46e31d9e6cf..f1844064497 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowCreate.cpp @@ -14,6 +14,10 @@ #include #include #include +#include +#include + +#include namespace xrpl { @@ -191,7 +195,7 @@ EscrowCreate::preflight(PreflightContext const& ctx) if (ctx.tx.isFieldPresent(sfFinishFunction)) { - auto const fees(ctx.registry.getFees()); + auto const fees(ctx.registry.get().getFees()); if (fees.extensionSizeLimit == 0 || fees.extensionComputeLimit == 0) { JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; @@ -462,17 +466,6 @@ escrowLockApplyHelper( return tesSUCCESS; } -template -static uint32_t -calculateAdditionalReserve(T const& finishFunction) -{ - if (!finishFunction) - return 1; - // First 500 bytes included in the normal reserve - // Each additional 500 bytes requires an additional reserve - return 1 + (finishFunction->size() / 500); -} - TER EscrowCreate::doApply() { diff --git a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp index 90abd033317..c2b04a08c83 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include @@ -74,7 +76,7 @@ EscrowFinish::preflight(PreflightContext const& ctx) if (auto const allowance = ctx.tx[~sfComputationAllowance]; allowance) { - auto const fees(ctx.registry.getFees()); + auto const fees(ctx.registry.get().getFees()); if (fees.extensionComputeLimit == 0) { JLOG(ctx.j.debug()) << "WASM runtime deactivated by fee voting"; diff --git a/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h b/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h index 8991fb06ccc..da6867e06ab 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h +++ b/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h @@ -227,4 +227,15 @@ escrowUnlockApplyHelper( journal); } +template +static uint32_t +calculateAdditionalReserve(T const& finishFunction) +{ + if (!finishFunction) + return 1; + // First 500 bytes included in the normal reserve + // Each additional 500 bytes requires an additional reserve + return 1 + (finishFunction->size() / 500); +} + } // namespace xrpl diff --git a/src/tests/libxrpl/protocol_autogen/ledger_entries/EscrowTests.cpp b/src/tests/libxrpl/protocol_autogen/ledger_entries/EscrowTests.cpp index 2dbb450e28c..821c156e555 100644 --- a/src/tests/libxrpl/protocol_autogen/ledger_entries/EscrowTests.cpp +++ b/src/tests/libxrpl/protocol_autogen/ledger_entries/EscrowTests.cpp @@ -27,6 +27,8 @@ TEST(EscrowTests, BuilderSettersRoundTrip) auto const conditionValue = canonical_VL(); auto const cancelAfterValue = canonical_UINT32(); auto const finishAfterValue = canonical_UINT32(); + auto const finishFunctionValue = canonical_VL(); + auto const dataValue = canonical_VL(); auto const sourceTagValue = canonical_UINT32(); auto const destinationTagValue = canonical_UINT32(); auto const ownerNodeValue = canonical_UINT64(); @@ -49,6 +51,8 @@ TEST(EscrowTests, BuilderSettersRoundTrip) builder.setCondition(conditionValue); builder.setCancelAfter(cancelAfterValue); builder.setFinishAfter(finishAfterValue); + builder.setFinishFunction(finishFunctionValue); + builder.setData(dataValue); builder.setSourceTag(sourceTagValue); builder.setDestinationTag(destinationTagValue); builder.setDestinationNode(destinationNodeValue); @@ -132,6 +136,22 @@ TEST(EscrowTests, BuilderSettersRoundTrip) EXPECT_TRUE(entry.hasFinishAfter()); } + { + auto const& expected = finishFunctionValue; + auto const actualOpt = entry.getFinishFunction(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfFinishFunction"); + EXPECT_TRUE(entry.hasFinishFunction()); + } + + { + auto const& expected = dataValue; + auto const actualOpt = entry.getData(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfData"); + EXPECT_TRUE(entry.hasData()); + } + { auto const& expected = sourceTagValue; auto const actualOpt = entry.getSourceTag(); @@ -192,6 +212,8 @@ TEST(EscrowTests, BuilderFromSleRoundTrip) auto const conditionValue = canonical_VL(); auto const cancelAfterValue = canonical_UINT32(); auto const finishAfterValue = canonical_UINT32(); + auto const finishFunctionValue = canonical_VL(); + auto const dataValue = canonical_VL(); auto const sourceTagValue = canonical_UINT32(); auto const destinationTagValue = canonical_UINT32(); auto const ownerNodeValue = canonical_UINT64(); @@ -210,6 +232,8 @@ TEST(EscrowTests, BuilderFromSleRoundTrip) sle->at(sfCondition) = conditionValue; sle->at(sfCancelAfter) = cancelAfterValue; sle->at(sfFinishAfter) = finishAfterValue; + sle->at(sfFinishFunction) = finishFunctionValue; + sle->at(sfData) = dataValue; sle->at(sfSourceTag) = sourceTagValue; sle->at(sfDestinationTag) = destinationTagValue; sle->at(sfOwnerNode) = ownerNodeValue; @@ -340,6 +364,32 @@ TEST(EscrowTests, BuilderFromSleRoundTrip) expectEqualField(expected, *fromBuilderOpt, "sfFinishAfter"); } + { + auto const& expected = finishFunctionValue; + + auto const fromSleOpt = entryFromSle.getFinishFunction(); + auto const fromBuilderOpt = entryFromBuilder.getFinishFunction(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfFinishFunction"); + expectEqualField(expected, *fromBuilderOpt, "sfFinishFunction"); + } + + { + auto const& expected = dataValue; + + auto const fromSleOpt = entryFromSle.getData(); + auto const fromBuilderOpt = entryFromBuilder.getData(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfData"); + expectEqualField(expected, *fromBuilderOpt, "sfData"); + } + { auto const& expected = sourceTagValue; @@ -477,6 +527,10 @@ TEST(EscrowTests, OptionalFieldsReturnNullopt) EXPECT_FALSE(entry.getCancelAfter().has_value()); EXPECT_FALSE(entry.hasFinishAfter()); EXPECT_FALSE(entry.getFinishAfter().has_value()); + EXPECT_FALSE(entry.hasFinishFunction()); + EXPECT_FALSE(entry.getFinishFunction().has_value()); + EXPECT_FALSE(entry.hasData()); + EXPECT_FALSE(entry.getData().has_value()); EXPECT_FALSE(entry.hasSourceTag()); EXPECT_FALSE(entry.getSourceTag().has_value()); EXPECT_FALSE(entry.hasDestinationTag()); diff --git a/src/tests/libxrpl/protocol_autogen/transactions/EscrowCreateTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/EscrowCreateTests.cpp index 1f9b3d30a99..95c6746499b 100644 --- a/src/tests/libxrpl/protocol_autogen/transactions/EscrowCreateTests.cpp +++ b/src/tests/libxrpl/protocol_autogen/transactions/EscrowCreateTests.cpp @@ -30,11 +30,13 @@ TEST(TransactionsEscrowCreateTests, BuilderSettersRoundTrip) // Transaction-specific field values auto const destinationValue = canonical_ACCOUNT(); + auto const destinationTagValue = canonical_UINT32(); auto const amountValue = canonical_AMOUNT(); auto const conditionValue = canonical_VL(); auto const cancelAfterValue = canonical_UINT32(); auto const finishAfterValue = canonical_UINT32(); - auto const destinationTagValue = canonical_UINT32(); + auto const finishFunctionValue = canonical_VL(); + auto const dataValue = canonical_VL(); EscrowCreateBuilder builder{ accountValue, @@ -45,10 +47,12 @@ TEST(TransactionsEscrowCreateTests, BuilderSettersRoundTrip) }; // Set optional fields + builder.setDestinationTag(destinationTagValue); builder.setCondition(conditionValue); builder.setCancelAfter(cancelAfterValue); builder.setFinishAfter(finishAfterValue); - builder.setDestinationTag(destinationTagValue); + builder.setFinishFunction(finishFunctionValue); + builder.setData(dataValue); auto tx = builder.build(publicKey, secretKey); @@ -78,6 +82,14 @@ TEST(TransactionsEscrowCreateTests, BuilderSettersRoundTrip) } // Verify optional fields + { + auto const& expected = destinationTagValue; + auto const actualOpt = tx.getDestinationTag(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestinationTag should be present"; + expectEqualField(expected, *actualOpt, "sfDestinationTag"); + EXPECT_TRUE(tx.hasDestinationTag()); + } + { auto const& expected = conditionValue; auto const actualOpt = tx.getCondition(); @@ -103,11 +115,19 @@ TEST(TransactionsEscrowCreateTests, BuilderSettersRoundTrip) } { - auto const& expected = destinationTagValue; - auto const actualOpt = tx.getDestinationTag(); - ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestinationTag should be present"; - expectEqualField(expected, *actualOpt, "sfDestinationTag"); - EXPECT_TRUE(tx.hasDestinationTag()); + auto const& expected = finishFunctionValue; + auto const actualOpt = tx.getFinishFunction(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFinishFunction should be present"; + expectEqualField(expected, *actualOpt, "sfFinishFunction"); + EXPECT_TRUE(tx.hasFinishFunction()); + } + + { + auto const& expected = dataValue; + auto const actualOpt = tx.getData(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfData should be present"; + expectEqualField(expected, *actualOpt, "sfData"); + EXPECT_TRUE(tx.hasData()); } } @@ -127,11 +147,13 @@ TEST(TransactionsEscrowCreateTests, BuilderFromStTxRoundTrip) // Transaction-specific field values auto const destinationValue = canonical_ACCOUNT(); + auto const destinationTagValue = canonical_UINT32(); auto const amountValue = canonical_AMOUNT(); auto const conditionValue = canonical_VL(); auto const cancelAfterValue = canonical_UINT32(); auto const finishAfterValue = canonical_UINT32(); - auto const destinationTagValue = canonical_UINT32(); + auto const finishFunctionValue = canonical_VL(); + auto const dataValue = canonical_VL(); // Build an initial transaction EscrowCreateBuilder initialBuilder{ @@ -142,10 +164,12 @@ TEST(TransactionsEscrowCreateTests, BuilderFromStTxRoundTrip) feeValue }; + initialBuilder.setDestinationTag(destinationTagValue); initialBuilder.setCondition(conditionValue); initialBuilder.setCancelAfter(cancelAfterValue); initialBuilder.setFinishAfter(finishAfterValue); - initialBuilder.setDestinationTag(destinationTagValue); + initialBuilder.setFinishFunction(finishFunctionValue); + initialBuilder.setData(dataValue); auto initialTx = initialBuilder.build(publicKey, secretKey); @@ -176,6 +200,13 @@ TEST(TransactionsEscrowCreateTests, BuilderFromStTxRoundTrip) } // Verify optional fields + { + auto const& expected = destinationTagValue; + auto const actualOpt = rebuiltTx.getDestinationTag(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestinationTag should be present"; + expectEqualField(expected, *actualOpt, "sfDestinationTag"); + } + { auto const& expected = conditionValue; auto const actualOpt = rebuiltTx.getCondition(); @@ -198,10 +229,17 @@ TEST(TransactionsEscrowCreateTests, BuilderFromStTxRoundTrip) } { - auto const& expected = destinationTagValue; - auto const actualOpt = rebuiltTx.getDestinationTag(); - ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfDestinationTag should be present"; - expectEqualField(expected, *actualOpt, "sfDestinationTag"); + auto const& expected = finishFunctionValue; + auto const actualOpt = rebuiltTx.getFinishFunction(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFinishFunction should be present"; + expectEqualField(expected, *actualOpt, "sfFinishFunction"); + } + + { + auto const& expected = dataValue; + auto const actualOpt = rebuiltTx.getData(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfData should be present"; + expectEqualField(expected, *actualOpt, "sfData"); } } @@ -263,14 +301,18 @@ TEST(TransactionsEscrowCreateTests, OptionalFieldsReturnNullopt) auto tx = builder.build(publicKey, secretKey); // Verify optional fields are not present + EXPECT_FALSE(tx.hasDestinationTag()); + EXPECT_FALSE(tx.getDestinationTag().has_value()); EXPECT_FALSE(tx.hasCondition()); EXPECT_FALSE(tx.getCondition().has_value()); EXPECT_FALSE(tx.hasCancelAfter()); EXPECT_FALSE(tx.getCancelAfter().has_value()); EXPECT_FALSE(tx.hasFinishAfter()); EXPECT_FALSE(tx.getFinishAfter().has_value()); - EXPECT_FALSE(tx.hasDestinationTag()); - EXPECT_FALSE(tx.getDestinationTag().has_value()); + EXPECT_FALSE(tx.hasFinishFunction()); + EXPECT_FALSE(tx.getFinishFunction().has_value()); + EXPECT_FALSE(tx.hasData()); + EXPECT_FALSE(tx.getData().has_value()); } } diff --git a/src/tests/libxrpl/protocol_autogen/transactions/EscrowFinishTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/EscrowFinishTests.cpp index f729d0fda38..ea2b3e19ab4 100644 --- a/src/tests/libxrpl/protocol_autogen/transactions/EscrowFinishTests.cpp +++ b/src/tests/libxrpl/protocol_autogen/transactions/EscrowFinishTests.cpp @@ -34,6 +34,7 @@ TEST(TransactionsEscrowFinishTests, BuilderSettersRoundTrip) auto const fulfillmentValue = canonical_VL(); auto const conditionValue = canonical_VL(); auto const credentialIDsValue = canonical_VECTOR256(); + auto const computationAllowanceValue = canonical_UINT32(); EscrowFinishBuilder builder{ accountValue, @@ -47,6 +48,7 @@ TEST(TransactionsEscrowFinishTests, BuilderSettersRoundTrip) builder.setFulfillment(fulfillmentValue); builder.setCondition(conditionValue); builder.setCredentialIDs(credentialIDsValue); + builder.setComputationAllowance(computationAllowanceValue); auto tx = builder.build(publicKey, secretKey); @@ -100,6 +102,14 @@ TEST(TransactionsEscrowFinishTests, BuilderSettersRoundTrip) EXPECT_TRUE(tx.hasCredentialIDs()); } + { + auto const& expected = computationAllowanceValue; + auto const actualOpt = tx.getComputationAllowance(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfComputationAllowance should be present"; + expectEqualField(expected, *actualOpt, "sfComputationAllowance"); + EXPECT_TRUE(tx.hasComputationAllowance()); + } + } // 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, @@ -121,6 +131,7 @@ TEST(TransactionsEscrowFinishTests, BuilderFromStTxRoundTrip) auto const fulfillmentValue = canonical_VL(); auto const conditionValue = canonical_VL(); auto const credentialIDsValue = canonical_VECTOR256(); + auto const computationAllowanceValue = canonical_UINT32(); // Build an initial transaction EscrowFinishBuilder initialBuilder{ @@ -134,6 +145,7 @@ TEST(TransactionsEscrowFinishTests, BuilderFromStTxRoundTrip) initialBuilder.setFulfillment(fulfillmentValue); initialBuilder.setCondition(conditionValue); initialBuilder.setCredentialIDs(credentialIDsValue); + initialBuilder.setComputationAllowance(computationAllowanceValue); auto initialTx = initialBuilder.build(publicKey, secretKey); @@ -185,6 +197,13 @@ TEST(TransactionsEscrowFinishTests, BuilderFromStTxRoundTrip) expectEqualField(expected, *actualOpt, "sfCredentialIDs"); } + { + auto const& expected = computationAllowanceValue; + auto const actualOpt = rebuiltTx.getComputationAllowance(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfComputationAllowance should be present"; + expectEqualField(expected, *actualOpt, "sfComputationAllowance"); + } + } // 3) Verify wrapper throws when constructed from wrong transaction type. @@ -250,6 +269,8 @@ TEST(TransactionsEscrowFinishTests, OptionalFieldsReturnNullopt) EXPECT_FALSE(tx.getCondition().has_value()); EXPECT_FALSE(tx.hasCredentialIDs()); EXPECT_FALSE(tx.getCredentialIDs().has_value()); + EXPECT_FALSE(tx.hasComputationAllowance()); + EXPECT_FALSE(tx.getComputationAllowance().has_value()); } } From 65322d9e781eb9899ecb8663fa1bbdf39d6efd1e Mon Sep 17 00:00:00 2001 From: Oleksandr <115580134+oleks-rip@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:33:37 -0400 Subject: [PATCH 206/212] fix Clang-tidy --- src/libxrpl/tx/wasm/HostFuncImplGetter.cpp | 20 ++++++++++---------- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 8 ++++---- src/libxrpl/tx/wasm/WasmiVM.cpp | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp index 67542ac5598..46744c17a76 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplGetter.cpp @@ -14,7 +14,7 @@ getIntBytes(STBase const* obj) { static_assert(std::is_integral::value, "Only integral types"); - auto const& num(static_cast const*>(obj)); + auto const& num(static_cast const*>(obj)); // NOLINT T const data = adjustWasmEndianess(num->value()); auto const* b = reinterpret_cast(&data); auto const* e = reinterpret_cast(&data + 1); @@ -42,13 +42,13 @@ getAnyFieldData(STBase const* obj) return Unexpected(HostFunctionError::NOT_LEAF_FIELD); case STI_ACCOUNT: { - auto const* account(dynamic_cast(obj)); + auto const* account(static_cast(obj)); // NOLINT auto const& data = account->value(); return Bytes{data.begin(), data.end()}; } case STI_ISSUE: { - auto const* issue(dynamic_cast(obj)); + auto const* issue(static_cast(obj)); // NOLINT Asset const& asset(issue->value()); // XRP and IOU will be processed by serializer if (asset.holds()) @@ -61,7 +61,7 @@ getAnyFieldData(STBase const* obj) } case STI_VL: { - auto const* vl(dynamic_cast(obj)); + auto const* vl(static_cast(obj)); // NOLINT auto const& data = vl->value(); return Bytes{data.begin(), data.end()}; } @@ -84,7 +84,7 @@ getAnyFieldData(STBase const* obj) // LCOV_EXCL_STOP case STI_UINT256: { - auto const* uint256Obj(dynamic_cast(obj)); + auto const* uint256Obj(static_cast(obj)); // NOLINT auto const& data = uint256Obj->value(); return Bytes{data.begin(), data.end()}; } @@ -165,14 +165,14 @@ locateField(STObject const& obj, Slice const& locator) if (STI_ARRAY == field->getSType()) { - auto const* arr = dynamic_cast(field); + auto const* arr = static_cast(field); // NOLINT if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, arr->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); field = &(arr->operator[](sfieldCode)); } else if (STI_OBJECT == field->getSType()) { - auto const* o = dynamic_cast(field); + auto const* o = static_cast(field); // NOLINT auto const it = knownSFields.find(sfieldCode); if (it == knownSFields.end()) @@ -183,7 +183,7 @@ locateField(STObject const& obj, Slice const& locator) } else if (STI_VECTOR256 == field->getSType()) { - auto const* v = dynamic_cast(field); + auto const* v = static_cast(field); // NOLINT if (sfieldCode < 0 || std::cmp_greater_equal(sfieldCode, v->size())) return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); return FieldValue(&(v->operator[](sfieldCode))); @@ -206,9 +206,9 @@ getArrayLen(FieldValue const& variantField) if (STBase const* const* field = std::get_if(&variantField)) { if ((*field)->getSType() == STI_VECTOR256) - return dynamic_cast(*field)->size(); + return static_cast(*field)->size(); // NOLINT if ((*field)->getSType() == STI_ARRAY) - return dynamic_cast(*field)->size(); + return static_cast(*field)->size(); // NOLINT } // uint256 is not an array so that variant should still return NO_ARRAY diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 88598469e0a..e420565727d 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -328,7 +328,7 @@ static inline HostFunctions* getHF(void* env) { auto const* udata = reinterpret_cast(env); - HostFunctions const* hf = reinterpret_cast(udata->first); + HostFunctions* hf = reinterpret_cast(udata->first); // NOLINT return hf; } @@ -341,7 +341,7 @@ checkGas(void* env) auto const* runtime = reinterpret_cast(hf->getRT()); if (runtime == nullptr) { - wasm_trap_t const* trap = reinterpret_cast( + wasm_trap_t* trap = reinterpret_cast( // NOLINT WasmEngine::instance().newTrap("hf no runtime")); // LCOV_EXCL_LINE return Unexpected(trap); // LCOV_EXCL_LINE } @@ -352,14 +352,14 @@ checkGas(void* env) if (runtime->setGas(x) < 0) { - wasm_trap_t const* trap = reinterpret_cast( + wasm_trap_t* trap = reinterpret_cast( // NOLINT WasmEngine::instance().newTrap("can't set gas")); // LCOV_EXCL_LINE return Unexpected(trap); // LCOV_EXCL_LINE } if (gas < impFunc.gas) { - wasm_trap_t const* trap = + wasm_trap_t* const trap = // NOLINT reinterpret_cast(WasmEngine::instance().newTrap("hf out of gas")); return Unexpected(trap); } diff --git a/src/libxrpl/tx/wasm/WasmiVM.cpp b/src/libxrpl/tx/wasm/WasmiVM.cpp index 622311540a8..e624d1540d2 100644 --- a/src/libxrpl/tx/wasm/WasmiVM.cpp +++ b/src/libxrpl/tx/wasm/WasmiVM.cpp @@ -918,7 +918,7 @@ WasmiEngine::newTrap(std::string const& txt) if (!txt.empty()) wasm_name_new(&msg, txt.size() + 1, txt.c_str()); // include 0 - wasm_trap_t const* trap = wasm_trap_new(store_.get(), &msg); + wasm_trap_t* trap = wasm_trap_new(store_.get(), &msg); // NOLINT if (!txt.empty()) wasm_byte_vec_delete(&msg); From 4fc1778ec809dd4447e73a07ca6e776e7f291642 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 3 Apr 2026 09:56:42 -0400 Subject: [PATCH 207/212] fix clang-tidy issues --- src/libxrpl/tx/wasm/HostFuncImplFloat.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp index 627d3b7d3f1..1faaeab8058 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplFloat.cpp @@ -143,7 +143,7 @@ class Number2 : public Number Serializer msg; msg.add64(v); - auto const data = msg.getData(); + auto data = msg.getData(); #ifdef DEBUG_OUTPUT std::cout << "m: " << std::setw(20) << mantissa() << ", e: " << std::setw(12) << exponent() From fe2e5ce649d1a235368d7e24d7898eae51db4eeb Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Fri, 3 Apr 2026 12:33:14 -0400 Subject: [PATCH 208/212] fix clang-tidy issues --- .../tx/transactors/escrow/EscrowFinish.cpp | 2 +- src/test/app/EscrowSmart_test.cpp | 19 ++++++++++--------- src/test/app/wasm_fixtures/fixtures.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp index c2b04a08c83..0154a42af3f 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp +++ b/src/libxrpl/tx/transactors/escrow/EscrowFinish.cpp @@ -384,7 +384,7 @@ EscrowFinish::doApply() JLOG(j_.trace()) << "The escrow has a finish function, running WASM code..."; // WASM execution auto const wasmStr = slep->getFieldVL(sfFinishFunction); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); WasmHostFunctionsImpl ledgerDataProvider(ctx_, k); diff --git a/src/test/app/EscrowSmart_test.cpp b/src/test/app/EscrowSmart_test.cpp index 93f60950285..c12313c0a8d 100644 --- a/src/test/app/EscrowSmart_test.cpp +++ b/src/test/app/EscrowSmart_test.cpp @@ -489,7 +489,7 @@ struct EscrowSmart_test : public beast::unit_test::suite std::uint32_t const allowance = 467; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto [createFee, finishFee] = [&]() { - Env env(*this, features); + Env const env(*this, features); auto createFee = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; auto finishFee = env.current()->fees().base + (allowance * env.current()->fees().gasPrice) / MICRO_DROPS_PER_DROP + 1; @@ -760,7 +760,8 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, alice, XRP(1000)); - XRPAmount txnFees = env.current()->fees().base * 10 + updateDataWasmHex.size() / 2 * 5; + XRPAmount const txnFees = + env.current()->fees().base * 10 + updateDataWasmHex.size() / 2 * 5; env(escrowCreate, escrow::finish_function(updateDataWasmHex), escrow::finish_time(env.now() + 2s), @@ -816,7 +817,7 @@ struct EscrowSmart_test : public beast::unit_test::suite uint64_t const allowance = 467; auto escrowCreate = escrow::create(alice, carol, XRP(1000)); auto createFee = [&]() { - Env env(*this, features); + Env const env(*this, features); auto createFee = env.current()->fees().base * 10 + ledgerSqnWasmHex.size() / 2 * 5; return createFee; }(); @@ -853,7 +854,7 @@ struct EscrowSmart_test : public beast::unit_test::suite env.close(); auto const bigAllowance = 996'433; - uint64_t partialFeeCalc = + uint64_t const partialFeeCalc = (static_cast(bigAllowance) * 1'000'000) / MICRO_DROPS_PER_DROP + 1; // to avoid an overflow auto finishFee = env.current()->fees().base + partialFeeCalc; @@ -910,7 +911,7 @@ struct EscrowSmart_test : public beast::unit_test::suite auto const seq = env.seq(alice); BEAST_EXPECT(env.ownerCount(alice) == 0); auto escrowCreate = escrow::create(alice, carol, XRP(1000)); - XRPAmount txnFees = + XRPAmount const txnFees = env.current()->fees().base * 10 + allHostFunctionsWasmHex.size() / 2 * 5; env(escrowCreate, escrow::finish_function(allHostFunctionsWasmHex), @@ -991,7 +992,7 @@ struct EscrowSmart_test : public beast::unit_test::suite BEAST_EXPECT(env.ownerCount(alice) == 2); // set up a bunch of objects to check their keylets - AMM amm(env, carol, XRP(10), carol["USD"](1000)); + AMM const amm(env, carol, XRP(10), carol["USD"](1000)); env(check::create(alice, carol, XRP(100))); env(credentials::create(alice, alice, "termsandconditions")); env(delegate::set(alice, carol, {"TrustSet"})); @@ -1004,11 +1005,11 @@ struct EscrowSmart_test : public beast::unit_test::suite env(token::createOffer(carol, tokenId, XRP(100)), token::owner(alice)); env(offer(alice, carol["GBP"](0.1), XRP(100))); env(paychan::create(alice, carol, XRP(1000), 100s, alice.pk())); - pdomain::Credentials credentials{{alice, "first credential"}}; + pdomain::Credentials const credentials{{alice, "first credential"}}; env(pdomain::setTx(alice, credentials)); env(signers(alice, 1, {{carol, 1}})); env(ticket::create(alice, 1)); - Vault vault{env}; + Vault const vault{env}; auto [tx, _keylet] = vault.create({.owner = alice, .asset = xrpIssue()}); env(tx); env.close(); @@ -1017,7 +1018,7 @@ struct EscrowSmart_test : public beast::unit_test::suite if (BEAST_EXPECTS(env.seq(alice) == 20, std::to_string(env.seq(alice)))) { auto const seq = env.seq(alice); - XRPAmount txnFees = + XRPAmount const txnFees = env.current()->fees().base * 10 + allKeyletsWasmHex.size() / 2 * 5; env(escrow::create(alice, carol, XRP(1000)), escrow::finish_function(allKeyletsWasmHex), diff --git a/src/test/app/wasm_fixtures/fixtures.cpp b/src/test/app/wasm_fixtures/fixtures.cpp index 99cc8e96448..ab86194ce78 100644 --- a/src/test/app/wasm_fixtures/fixtures.cpp +++ b/src/test/app/wasm_fixtures/fixtures.cpp @@ -88,7 +88,7 @@ generateDataBlob(uint32_t data_size) appendBytes(wasm, FUNC_TYPE0); // Memory Section: must be large enough for data_size - uint32_t pages = (data_size + 65535) / 65536; + uint32_t const pages = (data_size + 65535) / 65536; std::vector mem_p; pushLeb128(mem_p, 1); // 1 memory defined mem_p.push_back(0x00); // Flags (minimum only) From 42cbecb9e40aa71b3d9b214cffb00d3870616d1b Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Tue, 23 Dec 2025 18:34:59 -0500 Subject: [PATCH 209/212] feature Co-authored-by: Mayukha Vadari --- .github/CODEOWNERS | 2 + cspell.config.yaml | 2 + include/xrpl/ledger/OpenViewSandbox.h | 82 + include/xrpl/ledger/View.h | 25 + include/xrpl/ledger/helpers/ContractUtils.h | 102 + .../nft => ledger/helpers}/NFTokenUtils.h | 9 +- include/xrpl/protocol/Emitable.h | 78 + include/xrpl/protocol/Indexes.h | 16 + include/xrpl/protocol/LedgerFormats.h | 8 - include/xrpl/protocol/SField.h | 9 + include/xrpl/protocol/STData.h | 289 +++ include/xrpl/protocol/STDataType.h | 87 + include/xrpl/protocol/STJson.h | 193 ++ include/xrpl/protocol/STObject.h | 12 + include/xrpl/protocol/TER.h | 1 + include/xrpl/protocol/TxFlags.h | 13 + include/xrpl/protocol/detail/emitable.macro | 19 + include/xrpl/protocol/detail/features.macro | 1 + .../xrpl/protocol/detail/ledger_entries.macro | 41 + include/xrpl/protocol/detail/sfields.macro | 70 +- .../xrpl/protocol/detail/transactions.macro | 201 +- include/xrpl/protocol/jss.h | 5 + include/xrpl/protocol/st.h | 5 + .../ledger_entries/AccountRoot.h | 35 + .../ledger_entries/Contract.h | 334 +++ .../ledger_entries/ContractData.h | 239 ++ .../ledger_entries/ContractSource.h | 276 +++ .../transactions/ContractCall.h | 212 ++ .../transactions/ContractClawback.h | 168 ++ .../transactions/ContractCreate.h | 321 +++ .../transactions/ContractDelete.h | 129 ++ .../transactions/ContractModify.h | 395 ++++ .../transactions/ContractUserDelete.h | 212 ++ include/xrpl/server/InfoSub.h | 5 + include/xrpl/server/NetworkOPs.h | 3 + include/xrpl/tx/ApplyContext.h | 31 +- include/xrpl/tx/Transactor.h | 3 + include/xrpl/tx/apply.h | 20 + include/xrpl/tx/transactors/DeleteUtils.h | 42 + .../tx/transactors/contract/ContractCall.h | 29 + .../transactors/contract/ContractClawback.h | 26 + .../tx/transactors/contract/ContractCreate.h | 32 + .../tx/transactors/contract/ContractDelete.h | 34 + .../tx/transactors/contract/ContractModify.h | 29 + .../transactors/contract/ContractUserDelete.h | 26 + include/xrpl/tx/transactors/nft/NFTokenMint.h | 2 +- include/xrpl/tx/wasm/ContractContext.h | 72 + include/xrpl/tx/wasm/ContractHostFuncImpl.h | 95 + include/xrpl/tx/wasm/HostFunc.h | 118 + include/xrpl/tx/wasm/HostFuncWrapper.h | 92 + include/xrpl/tx/wasm/ParamsHelper.h | 38 + src/libxrpl/ledger/View.cpp | 265 +++ src/libxrpl/ledger/helpers/ContractUtils.cpp | 643 ++++++ .../nft => ledger/helpers}/NFTokenUtils.cpp | 54 +- src/libxrpl/protocol/Emitable.cpp | 167 ++ src/libxrpl/protocol/Indexes.cpp | 22 +- src/libxrpl/protocol/InnerObjectFormats.cpp | 29 + src/libxrpl/protocol/STData.cpp | 968 ++++++++ src/libxrpl/protocol/STDataType.cpp | 253 ++ src/libxrpl/protocol/STJson.cpp | 758 ++++++ src/libxrpl/protocol/STObject.cpp | 93 + src/libxrpl/protocol/STParsedJSON.cpp | 48 + src/libxrpl/protocol/STVar.cpp | 12 + src/libxrpl/protocol/TER.cpp | 1 + src/libxrpl/protocol/TxFormats.cpp | 2 +- src/libxrpl/server/InfoSub.cpp | 1 + src/libxrpl/tx/ApplyContext.cpp | 17 +- src/libxrpl/tx/Transactor.cpp | 122 +- src/libxrpl/tx/invariants/InvariantCheck.cpp | 3 +- src/libxrpl/tx/invariants/NFTInvariant.cpp | 3 +- src/libxrpl/tx/transactors/DeleteUtils.cpp | 382 ++++ .../tx/transactors/account/AccountDelete.cpp | 17 +- .../tx/transactors/contract/ContractCall.cpp | 329 +++ .../transactors/contract/ContractClawback.cpp | 32 + .../transactors/contract/ContractCreate.cpp | 272 +++ .../transactors/contract/ContractDelete.cpp | 149 ++ .../transactors/contract/ContractModify.cpp | 352 +++ .../contract/ContractUserDelete.cpp | 32 + .../tx/transactors/escrow/EscrowHelpers.h | 5 +- .../tx/transactors/nft/NFTokenAcceptOffer.cpp | 6 +- .../tx/transactors/nft/NFTokenBurn.cpp | 2 +- .../tx/transactors/nft/NFTokenCancelOffer.cpp | 2 +- .../tx/transactors/nft/NFTokenCreateOffer.cpp | 6 +- .../tx/transactors/nft/NFTokenModify.cpp | 2 +- .../tx/transactors/system/LedgerStateFix.cpp | 2 +- src/libxrpl/tx/wasm/ContractContext.cpp | 32 + src/libxrpl/tx/wasm/HostFuncImplNFT.cpp | 2 +- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 606 +++++ src/libxrpl/tx/wasm/WasmVM.cpp | 22 + src/test/app/ContractHostFuncImpl_test.cpp | 1379 +++++++++++ src/test/app/Contract_test.cpp | 2025 +++++++++++++++++ src/test/app/FeeVote_test.cpp | 10 + src/test/app/FixNFTokenPageLinks_test.cpp | 2 +- src/test/app/NFTokenAuth_test.cpp | 2 +- src/test/app/NFTokenBurn_test.cpp | 3 +- src/test/app/NFTokenDir_test.cpp | 2 +- src/test/app/NFToken_test.cpp | 2 +- src/test/app/TestHostFunctions.h | 2 +- .../wasm_fixtures/contract_data/Cargo.lock | 15 + .../wasm_fixtures/contract_data/Cargo.toml | 21 + .../wasm_fixtures/contract_data/src/lib.rs | 529 +++++ src/test/app/wasm_fixtures/copyFixtures.py | 14 +- .../app/wasm_fixtures/emit_txn/Cargo.toml | 21 + .../app/wasm_fixtures/emit_txn/src/lib.rs | 218 ++ src/test/app/wasm_fixtures/events/Cargo.toml | 21 + src/test/app/wasm_fixtures/events/src/lib.rs | 99 + .../app/wasm_fixtures/parameters/Cargo.lock | 15 + .../app/wasm_fixtures/parameters/Cargo.toml | 21 + .../app/wasm_fixtures/parameters/src/lib.rs | 751 ++++++ src/test/consensus/NegativeUNL_test.cpp | 1 + src/test/jtx.h | 1 + src/test/jtx/contract.h | 164 ++ src/test/jtx/impl/contract.cpp | 134 ++ src/test/protocol/Hooks_test.cpp | 180 -- src/test/protocol/STDataType_test.cpp | 641 ++++++ src/test/protocol/STData_test.cpp | 1290 +++++++++++ src/test/protocol/STJson_test.cpp | 793 +++++++ .../libxrpl/protocol_autogen/TestHelpers.h | 8 + .../ledger_entries/AccountRootTests.cpp | 27 + .../ledger_entries/ContractDataTests.cpp | 223 ++ .../ledger_entries/ContractSourceTests.cpp | 275 +++ .../ledger_entries/ContractTests.cpp | 324 +++ .../transactions/ContractCallTests.cpp | 231 ++ .../transactions/ContractClawbackTests.cpp | 195 ++ .../transactions/ContractCreateTests.cpp | 282 +++ .../transactions/ContractDeleteTests.cpp | 146 ++ .../transactions/ContractModifyTests.cpp | 324 +++ .../transactions/ContractUserDeleteTests.cpp | 231 ++ src/xrpld/app/misc/DeleteUtils.cpp | 383 ++++ src/xrpld/app/misc/DeleteUtils.h | 42 + src/xrpld/app/misc/NetworkOPs.cpp | 51 + .../app/wasm/detail/ContractHostFuncImpl.cpp | 1053 +++++++++ src/xrpld/core/Config.h | 9 +- src/xrpld/rpc/detail/Handler.cpp | 1 + src/xrpld/rpc/detail/RPCHelpers.cpp | 2 +- src/xrpld/rpc/detail/RPCLedgerHelpers.cpp | 36 + src/xrpld/rpc/detail/RPCLedgerHelpers.h | 3 + src/xrpld/rpc/handlers/ContractInfo.cpp | 162 ++ src/xrpld/rpc/handlers/Handlers.h | 2 + .../rpc/handlers/account/AccountInfo.cpp | 38 +- .../rpc/handlers/account/AccountNFTs.cpp | 2 +- src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp | 70 +- .../server_info/ServerDefinitions.cpp | 1 + .../rpc/handlers/subscribe/Subscribe.cpp | 4 + .../rpc/handlers/subscribe/Unsubscribe.cpp | 4 + 145 files changed, 22157 insertions(+), 329 deletions(-) create mode 100644 .github/CODEOWNERS create mode 100644 include/xrpl/ledger/OpenViewSandbox.h create mode 100644 include/xrpl/ledger/helpers/ContractUtils.h rename include/xrpl/{tx/transactors/nft => ledger/helpers}/NFTokenUtils.h (95%) create mode 100644 include/xrpl/protocol/Emitable.h create mode 100644 include/xrpl/protocol/STData.h create mode 100644 include/xrpl/protocol/STDataType.h create mode 100644 include/xrpl/protocol/STJson.h create mode 100644 include/xrpl/protocol/detail/emitable.macro create mode 100644 include/xrpl/protocol_autogen/ledger_entries/Contract.h create mode 100644 include/xrpl/protocol_autogen/ledger_entries/ContractData.h create mode 100644 include/xrpl/protocol_autogen/ledger_entries/ContractSource.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractCall.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractClawback.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractCreate.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractDelete.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractModify.h create mode 100644 include/xrpl/protocol_autogen/transactions/ContractUserDelete.h create mode 100644 include/xrpl/tx/transactors/DeleteUtils.h create mode 100644 include/xrpl/tx/transactors/contract/ContractCall.h create mode 100644 include/xrpl/tx/transactors/contract/ContractClawback.h create mode 100644 include/xrpl/tx/transactors/contract/ContractCreate.h create mode 100644 include/xrpl/tx/transactors/contract/ContractDelete.h create mode 100644 include/xrpl/tx/transactors/contract/ContractModify.h create mode 100644 include/xrpl/tx/transactors/contract/ContractUserDelete.h create mode 100644 include/xrpl/tx/wasm/ContractContext.h create mode 100644 include/xrpl/tx/wasm/ContractHostFuncImpl.h create mode 100644 src/libxrpl/ledger/helpers/ContractUtils.cpp rename src/libxrpl/{tx/transactors/nft => ledger/helpers}/NFTokenUtils.cpp (94%) create mode 100644 src/libxrpl/protocol/Emitable.cpp create mode 100644 src/libxrpl/protocol/STData.cpp create mode 100644 src/libxrpl/protocol/STDataType.cpp create mode 100644 src/libxrpl/protocol/STJson.cpp create mode 100644 src/libxrpl/tx/transactors/DeleteUtils.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractCall.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractClawback.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractCreate.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractDelete.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractModify.cpp create mode 100644 src/libxrpl/tx/transactors/contract/ContractUserDelete.cpp create mode 100644 src/libxrpl/tx/wasm/ContractContext.cpp create mode 100644 src/test/app/ContractHostFuncImpl_test.cpp create mode 100644 src/test/app/Contract_test.cpp create mode 100644 src/test/app/wasm_fixtures/contract_data/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/contract_data/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/contract_data/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/emit_txn/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/emit_txn/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/events/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/events/src/lib.rs create mode 100644 src/test/app/wasm_fixtures/parameters/Cargo.lock create mode 100644 src/test/app/wasm_fixtures/parameters/Cargo.toml create mode 100644 src/test/app/wasm_fixtures/parameters/src/lib.rs create mode 100644 src/test/jtx/contract.h create mode 100644 src/test/jtx/impl/contract.cpp delete mode 100644 src/test/protocol/Hooks_test.cpp create mode 100644 src/test/protocol/STDataType_test.cpp create mode 100644 src/test/protocol/STData_test.cpp create mode 100644 src/test/protocol/STJson_test.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/ledger_entries/ContractDataTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/ledger_entries/ContractSourceTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/ledger_entries/ContractTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractCallTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractClawbackTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractCreateTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractDeleteTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractModifyTests.cpp create mode 100644 src/tests/libxrpl/protocol_autogen/transactions/ContractUserDeleteTests.cpp create mode 100644 src/xrpld/app/misc/DeleteUtils.cpp create mode 100644 src/xrpld/app/misc/DeleteUtils.h create mode 100644 src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp create mode 100644 src/xrpld/rpc/handlers/ContractInfo.cpp diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..24620f8d7ca --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,2 @@ +# Allow anyone to review any change by default. +* diff --git a/cspell.config.yaml b/cspell.config.yaml index 6eef313efb2..dfe6f1be619 100644 --- a/cspell.config.yaml +++ b/cspell.config.yaml @@ -99,6 +99,7 @@ words: - distro - doxyfile - dxrpl + - emittance - endmacro - exceptioned - Falco @@ -248,6 +249,7 @@ words: - statsd - STATSDCOLLECTOR - stissue + - stjson - stnum - stobj - stobject diff --git a/include/xrpl/ledger/OpenViewSandbox.h b/include/xrpl/ledger/OpenViewSandbox.h new file mode 100644 index 00000000000..3fd4073e12b --- /dev/null +++ b/include/xrpl/ledger/OpenViewSandbox.h @@ -0,0 +1,82 @@ +#pragma once + +#include + +#include + +namespace xrpl { + +class OpenViewSandbox +{ +private: + OpenView& parent_; + std::unique_ptr sandbox_; + +public: + using key_type = ReadView::key_type; + + OpenViewSandbox(OpenView& parent) + : parent_(parent), sandbox_(std::make_unique(batch_view, parent)) + { + } + + void + rawErase(std::shared_ptr const& sle) + { + sandbox_->rawErase(sle); + } + + void + rawInsert(std::shared_ptr const& sle) + { + sandbox_->rawInsert(sle); + } + + void + rawReplace(std::shared_ptr const& sle) + { + sandbox_->rawReplace(sle); + } + + void + rawDestroyXRP(XRPAmount const& fee) + { + sandbox_->rawDestroyXRP(fee); + } + + void + rawTxInsert( + key_type const& key, + std::shared_ptr const& txn, + std::shared_ptr const& metaData) + { + sandbox_->rawTxInsert(key, txn, metaData); + } + + void + commit() + { + sandbox_->apply(parent_); + sandbox_ = std::make_unique(batch_view, parent_); + } + + void + discard() + { + sandbox_ = std::make_unique(batch_view, parent_); + } + + OpenView const& + view() const + { + return *sandbox_; + } + + OpenView& + view() + { + return *sandbox_; + } +}; + +} // namespace xrpl diff --git a/include/xrpl/ledger/View.h b/include/xrpl/ledger/View.h index 55be01d6775..d3996e29567 100644 --- a/include/xrpl/ledger/View.h +++ b/include/xrpl/ledger/View.h @@ -3,6 +3,10 @@ #include #include #include +#include +#include +#include +#include #include #include #include @@ -211,6 +215,27 @@ doWithdraw( STAmount const& amount, beast::Journal j); +enum class SendIssuerHandling { ihSENDER_NOT_ALLOWED, ihRECEIVER_NOT_ALLOWED, ihIGNORE }; +enum class SendEscrowHandling { ehIGNORE, ehCHECK }; +enum class SendAuthHandling { ahCHECK_SENDER, ahCHECK_RECEIVER, ahBOTH, ahNEITHER }; +enum class SendFreezeHandling { fhCHECK_SENDER, fhCHECK_RECEIVER, fhBOTH, fhNEITHER }; +enum class SendTransferHandling { thIGNORE, thCHECK }; +enum class SendBalanceHandling { bhIGNORE, bhCHECK }; + +TER +canTransferFT( + ReadView const& view, + AccountID const& sender, + AccountID const& receiver, + STAmount const& amount, + beast::Journal j, + SendIssuerHandling issuerHandling, + SendEscrowHandling escrowHandling, + SendAuthHandling authHandling, + SendFreezeHandling freezeHandling, + SendTransferHandling transferHandling, + SendBalanceHandling balanceHandling); + /** Deleter function prototype. Returns the status of the entry deletion * (if should not be skipped) and if the entry should be skipped. The status * is always tesSUCCESS if the entry should be skipped. diff --git a/include/xrpl/ledger/helpers/ContractUtils.h b/include/xrpl/ledger/helpers/ContractUtils.h new file mode 100644 index 00000000000..3e478ad43dc --- /dev/null +++ b/include/xrpl/ledger/helpers/ContractUtils.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace xrpl { + +class ContractDataMap : public std::map> +{ +public: + uint32_t modifiedCount = 0; +}; + +class ContractEventMap : public std::map +{ +}; + +namespace contract { + +/** The maximum number of data modifications in a single function. */ +int64_t constexpr maxDataModifications = 1000; + +/** The maximum number of bytes the data can occupy. */ +int64_t constexpr maxContractDataSize = 1024; + +/** The multiplier for contract data size calculations. */ +int64_t constexpr dataByteMultiplier = 512; + +/** The cost multiplier of creating a contract in bytes. */ +int64_t constexpr createByteMultiplier = 500ULL; + +/** The value to return when the fee calculation failed. */ +int64_t constexpr feeCalculationFailed = 0x7FFFFFFFFFFFFFFFLL; + +/** The maximum number of contract parameters that can be in a transaction. */ +std::size_t constexpr maxContractParams = 8; + +/** The maximum number of contract functions that can be in a transaction. */ +std::size_t constexpr maxContractFunctions = 8; + +int64_t +contractCreateFee(uint64_t byteCount); + +NotTEC +preflightFunctions(STTx const& tx, beast::Journal j); + +NotTEC +preflightInstanceParameters(STTx const& tx, beast::Journal j); + +bool +validateParameterMapping(STArray const& params, STArray const& values, beast::Journal j); + +NotTEC +preflightInstanceParameterValues(STTx const& tx, beast::Journal j); + +NotTEC +preflightFlagParameters(STArray const& parameters, beast::Journal j); + +bool +isValidParameterFlag(std::uint32_t flags); + +TER +preclaimFlagParameters( + ReadView const& view, + AccountID const& sourceAccount, + AccountID const& contractAccount, + STArray const& parameters, + beast::Journal j); + +TER +doApplyFlagParameters( + ApplyView& view, + STTx const& tx, + AccountID const& sourceAccount, + AccountID const& contractAccount, + STArray const& parameters, + XRPAmount const& priorBalance, + beast::Journal j); + +TER +finalizeContractData( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& contractAccount, + ContractDataMap const& dataMap, + ContractEventMap const& eventMap, + uint256 const& txnID); + +} // namespace contract +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/nft/NFTokenUtils.h b/include/xrpl/ledger/helpers/NFTokenUtils.h similarity index 95% rename from include/xrpl/tx/transactors/nft/NFTokenUtils.h rename to include/xrpl/ledger/helpers/NFTokenUtils.h index 33aab068c62..bd7ef7760ac 100644 --- a/include/xrpl/tx/transactors/nft/NFTokenUtils.h +++ b/include/xrpl/ledger/helpers/NFTokenUtils.h @@ -1,12 +1,12 @@ #pragma once #include +#include #include #include #include #include #include -#include namespace xrpl { @@ -140,6 +140,13 @@ checkTrustlineDeepFrozen( beast::Journal const j, Issue const& issue); +TER +transferNFToken( + ApplyView& view, + AccountID const& buyer, + AccountID const& seller, + uint256 const& nftokenID); + } // namespace nft } // namespace xrpl diff --git a/include/xrpl/protocol/Emitable.h b/include/xrpl/protocol/Emitable.h new file mode 100644 index 00000000000..6acce0d1020 --- /dev/null +++ b/include/xrpl/protocol/Emitable.h @@ -0,0 +1,78 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include + +namespace xrpl { +/** + * We have both transaction type emitables and granular type emitables. + * Since we will reuse the TransactionFormats to parse the Transaction + * Emitables, only the GranularEmitableType is defined here. To prevent + * conflicts with TxType, the GranularEmitableType is always set to a value + * greater than the maximum value of uint16. + */ +enum GranularEmitableType : std::uint32_t { +#pragma push_macro("EMITABLE") +#undef EMITABLE + +#define EMITABLE(type, txType, value) type = value, + +#include + +#undef EMITABLE +#pragma pop_macro("EMITABLE") +}; + +enum Emittance { emitable, notEmitable }; + +class Emitable +{ +private: + Emitable(); + + std::unordered_map emitableTx_; + + std::unordered_map granularEmitableMap_; + + std::unordered_map granularNameMap_; + + std::unordered_map granularTxTypeMap_; + +public: + static Emitable const& + getInstance(); + + Emitable(Emitable const&) = delete; + Emitable& + operator=(Emitable const&) = delete; + + std::optional + getEmitableName(std::uint32_t const value) const; + + std::optional + getGranularValue(std::string const& name) const; + + std::optional + getGranularName(GranularEmitableType const& value) const; + + std::optional + getGranularTxType(GranularEmitableType const& gpType) const; + + bool + isEmitable(std::uint32_t const& emitableValue) const; + + // for tx level emitable, emitable value is equal to tx type plus one + uint32_t + txToEmitableType(TxType const& type) const; + + // tx type value is emitable value minus one + TxType + emitableToTxType(uint32_t const& value) const; +}; + +} // namespace xrpl diff --git a/include/xrpl/protocol/Indexes.h b/include/xrpl/protocol/Indexes.h index a438a8a77bc..48114604557 100644 --- a/include/xrpl/protocol/Indexes.h +++ b/include/xrpl/protocol/Indexes.h @@ -348,6 +348,22 @@ permissionedDomain(AccountID const& account, std::uint32_t seq) noexcept; Keylet permissionedDomain(uint256 const& domainID) noexcept; + +Keylet +contractSource(uint256 const& contractHash) noexcept; + +Keylet +contract(uint256 const& contractHash, AccountID const& owner, std::uint32_t seq) noexcept; + +inline Keylet +contract(uint256 const& contractID) +{ + return {ltCONTRACT, contractID}; +} + +Keylet +contractData(AccountID const& owner, AccountID const& contractAccount) noexcept; + } // namespace keylet // Everything below is deprecated and should be removed in favor of keylets: diff --git a/include/xrpl/protocol/LedgerFormats.h b/include/xrpl/protocol/LedgerFormats.h index a43f6a71340..6b61f4d33a9 100644 --- a/include/xrpl/protocol/LedgerFormats.h +++ b/include/xrpl/protocol/LedgerFormats.h @@ -74,14 +74,6 @@ enum LedgerEntryType : std::uint16_t { */ ltNICKNAME [[deprecated("This object type is not supported and should not be used.")]] = 0x006e, - /** A legacy, deprecated type. - - \deprecated **This object type is not supported and should not be used.** - Support for this type of object was never implemented. - No objects of this type were ever created. - */ - ltCONTRACT [[deprecated("This object type is not supported and should not be used.")]] = 0x0063, - /** A legacy, deprecated type. \deprecated **This object type is not supported and should not be used.** diff --git a/include/xrpl/protocol/SField.h b/include/xrpl/protocol/SField.h index 7a864b1b58e..a0de720ff95 100644 --- a/include/xrpl/protocol/SField.h +++ b/include/xrpl/protocol/SField.h @@ -33,6 +33,9 @@ class STNumber; class STXChainBridge; class STVector256; class STCurrency; +class STData; +class STDataType; +class STJson; #pragma push_macro("XMACRO") #undef XMACRO @@ -71,6 +74,9 @@ class STCurrency; STYPE(STI_ISSUE, 24) \ STYPE(STI_XCHAIN_BRIDGE, 25) \ STYPE(STI_CURRENCY, 26) \ + STYPE(STI_DATA, 27) \ + STYPE(STI_DATATYPE, 28) \ + STYPE(STI_JSON, 29) \ \ /* high-level types */ \ /* cannot be serialized inside other types */ \ @@ -350,6 +356,9 @@ using SF_NUMBER = TypedField; using SF_VL = TypedField; using SF_VECTOR256 = TypedField; using SF_XCHAIN_BRIDGE = TypedField; +using SF_DATA = TypedField; +using SF_DATATYPE = TypedField; +using SF_JSON = TypedField; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/STData.h b/include/xrpl/protocol/STData.h new file mode 100644 index 00000000000..78e3a6657fe --- /dev/null +++ b/include/xrpl/protocol/STData.h @@ -0,0 +1,289 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace xrpl { + +class STData final : public STBase +{ +private: + using data_type = detail::STVar; + std::uint16_t inner_type_; + data_type data_; + bool default_{true}; + +public: + using value_type = STData; // Although not directly holding a single value + + STData(SField const& n); + STData(SField const& n, unsigned char); + STData(SField const& n, std::uint16_t); + STData(SField const& n, std::uint32_t); + STData(SField const& n, std::uint64_t); + STData(SField const& n, uint128 const&); + STData(SField const& n, uint160 const&); + STData(SField const& n, uint192 const&); + STData(SField const& n, uint256 const&); + STData(SField const& n, Blob const&); + STData(SField const& n, Slice const&); + STData(SField const& n, AccountID const&); + STData(SField const& n, STAmount const&); + STData(SField const& n, STIssue const&); + STData(SField const& n, STCurrency const&); + STData(SField const& n, STNumber const&); + + STData(SerialIter& sit, SField const& name); + + std::size_t + size() const; + + SerializedTypeID + getSType() const override; + + std::string + getInnerTypeString() const; + + std::string + getText() const override; + + Json::Value getJson(JsonOptions) const override; + + void + add(Serializer& s) const override; + + bool + isEquivalent(STBase const& t) const override; + + bool + isDefault() const override; + + SerializedTypeID + getInnerSType() const noexcept; + + STBase* + makeFieldPresent(); + + void + setFieldU8(unsigned char); + void + setFieldU16(std::uint16_t); + void + setFieldU32(std::uint32_t); + void + setFieldU64(std::uint64_t); + void + setFieldH128(uint128 const&); + void + setFieldH160(uint160 const&); + void + setFieldH192(uint192 const&); + void + setFieldH256(uint256 const&); + void + setFieldVL(Blob const&); + void + setFieldVL(Slice const&); + void + setAccountID(AccountID const&); + void + setFieldAmount(STAmount const&); + void + setIssue(STIssue const&); + void + setCurrency(STCurrency const&); + void + setFieldNumber(STNumber const&); + + unsigned char + getFieldU8() const; + std::uint16_t + getFieldU16() const; + std::uint32_t + getFieldU32() const; + std::uint64_t + getFieldU64() const; + uint128 + getFieldH128() const; + uint160 + getFieldH160() const; + uint192 + getFieldH192() const; + uint256 + getFieldH256() const; + Blob + getFieldVL() const; + AccountID + getAccountID() const; + STAmount const& + getFieldAmount() const; + STIssue + getFieldIssue() const; + STCurrency + getFieldCurrency() const; + STNumber + getFieldNumber() const; + +private: + STBase* + copy(std::size_t n, void* buf) const override; + STBase* + move(std::size_t n, void* buf) override; + + friend class detail::STVar; + + // Implementation for getting (most) fields that return by value. + // + // The remove_cv and remove_reference are necessitated by the STBitString + // types. Their value() returns by const ref. We return those types + // by value. + template < + typename T, + typename V = typename std::remove_cv< + typename std::remove_reference().value())>::type>::type> + V + getFieldByValue() const; + + // Implementations for getting (most) fields that return by const reference. + // + // If an absent optional field is deserialized we don't have anything + // obvious to return. So we insist on having the call provide an + // 'empty' value we return in that circumstance. + template + V const& + getFieldByConstRef(V const& empty) const; + + // Implementation for setting most fields with a setValue() method. + template + void + setFieldUsingSetValue(V value); + + // Implementation for setting fields using assignment + template + void + setFieldUsingAssignment(T const& value); +}; + +//------------------------------------------------------------------------------ +// Implementation +//------------------------------------------------------------------------------ + +inline SerializedTypeID +STData::getInnerSType() const noexcept +{ + return static_cast(inner_type_); +} + +template +V +STData::getFieldByValue() const +{ + STBase const* rf = &data_.get(); + + // if (!rf) + // throwFieldNotFound(getFName()); + + SerializedTypeID id = rf->getSType(); + + if (id == STI_NOTPRESENT) + Throw("Field not present"); + + T const* cf = dynamic_cast(rf); + + if (!cf) + Throw("Wrong field type"); + + return cf->value(); +} + +// Implementations for getting (most) fields that return by const reference. +// +// If an absent optional field is deserialized we don't have anything +// obvious to return. So we insist on having the call provide an +// 'empty' value we return in that circumstance. +template +V const& +STData::getFieldByConstRef(V const& empty) const +{ + STBase const* rf = &data_.get(); + + // if (!rf) + // throwFieldNotFound(field); + + SerializedTypeID id = rf->getSType(); + + if (id == STI_NOTPRESENT) + return empty; // optional field not present + + T const* cf = dynamic_cast(rf); + + if (!cf) + Throw("Wrong field type"); + + return *cf; +} + +// Implementation for setting most fields with a setValue() method. +template +void +STData::setFieldUsingSetValue(V value) +{ + static_assert(!std::is_lvalue_reference::value, ""); + + STBase* rf = &data_.get(); + + // if (!rf) + // throwFieldNotFound(field); + + if (rf->getSType() == STI_NOTPRESENT) + rf = makeFieldPresent(); + + T* cf = dynamic_cast(rf); + + if (!cf) + Throw("Wrong field type"); + + cf->setValue(std::move(value)); +} + +// Implementation for setting fields using assignment +template +void +STData::setFieldUsingAssignment(T const& value) +{ + STBase* rf = &data_.get(); + + // if (!rf) + // throwFieldNotFound(field); + + // if (rf->getSType() == STI_NOTPRESENT) + // rf = makeFieldPresent(field); + + T* cf = dynamic_cast(rf); + + if (!cf) + Throw("Wrong field type"); + + (*cf) = value; +} + +//------------------------------------------------------------------------------ +// +// Creation +// +//------------------------------------------------------------------------------ + +STData +dataFromJson(SField const& field, Json::Value const& value); + +} // namespace xrpl diff --git a/include/xrpl/protocol/STDataType.h b/include/xrpl/protocol/STDataType.h new file mode 100644 index 00000000000..cae5907a026 --- /dev/null +++ b/include/xrpl/protocol/STDataType.h @@ -0,0 +1,87 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace xrpl { + +class STDataType final : public STBase +{ +private: + std::uint16_t inner_type_; + bool default_{true}; + +public: + using value_type = STDataType; // Although not directly holding a single value + + STDataType(SField const& n); + STDataType(SField const& n, SerializedTypeID); + + STDataType(SerialIter& sit, SField const& name); + + SerializedTypeID + getSType() const override; + + std::string + getInnerTypeString() const; + + std::string + getText() const override; + + Json::Value getJson(JsonOptions) const override; + + void + add(Serializer& s) const override; + + bool + isEquivalent(STBase const& t) const override; + + bool + isDefault() const override; + + void setInnerSType(SerializedTypeID); + + SerializedTypeID + getInnerSType() const noexcept; + + STBase* + makeFieldPresent(); + + STBase* + copy(std::size_t n, void* buf) const override; + STBase* + move(std::size_t n, void* buf) override; + + friend class detail::STVar; +}; + +//------------------------------------------------------------------------------ +// Implementation +//------------------------------------------------------------------------------ + +inline SerializedTypeID +STDataType::getInnerSType() const noexcept +{ + return static_cast(inner_type_); +} + +//------------------------------------------------------------------------------ +// +// Creation +// +//------------------------------------------------------------------------------ + +STDataType +dataTypeFromJson(SField const& field, Json::Value const& value); + +} // namespace xrpl diff --git a/include/xrpl/protocol/STJson.h b/include/xrpl/protocol/STJson.h new file mode 100644 index 00000000000..5d7c2f7d9ed --- /dev/null +++ b/include/xrpl/protocol/STJson.h @@ -0,0 +1,193 @@ +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace xrpl { + +/** + * STJson: Serialized Type for JSON-like structures (objects or arrays). + * + * Supports two modes: + * - Object: Key-value pairs where keys are VL-encoded strings + * - Array: Ordered list of values + * + * Values are [SType marker][VL-encoded SType serialization]. + * Values can be any SType, including nested STJson. + * + * Serialization format: [type_byte][VL_length][data...] + * - type_byte: 0x00 = Object, 0x01 = Array + */ +class STJson : public STBase +{ +public: + enum class JsonType : uint8_t { Object = 0x00, Array = 0x01 }; + + using value_type = STJson; + value_type + value() const + { + return *this; + } + + using Key = std::string; + using Value = std::shared_ptr; + using Map = std::map; + using Array = std::vector; + + STJson() = default; + + explicit STJson(Map&& map); + explicit STJson(Array&& array); + explicit STJson(SField const& name); + explicit STJson(SerialIter& sit, SField const& name); + + SerializedTypeID + getSType() const override; + + // Type checking + bool + isArray() const; + + bool + isObject() const; + + JsonType + getType() const; + + // Depth checking (0 = no nesting, 1 = one level of nesting) + int + getDepth() const; + + // Parse from binary blob + static std::shared_ptr + fromBlob(void const* data, std::size_t size); + + // Parse from SerialIter + static std::shared_ptr + fromSerialIter(SerialIter& sit); + + // Serialize to binary + void + add(Serializer& s) const override; + + // JSON representation + Json::Value + getJson(JsonOptions options) const override; + + bool + isEquivalent(STBase const& t) const override; + + bool + isDefault() const override; + + // Blob representation + Blob + toBlob() const; + + // STJson size + std::size_t + size() const; + + // Object accessors (only valid when isObject() == true) + Map const& + getMap() const; + + void + setObjectField(Key const& key, Value const& value); + + std::optional + getObjectField(Key const& key) const; + + void + setNestedObjectField(Key const& key, Key const& nestedKey, Value const& value); + + std::optional + getNestedObjectField(Key const& key, Key const& nestedKey) const; + + // Array accessors (only valid when isArray() == true) + Array const& + getArray() const; + + void + pushArrayElement(Value const& value); + + std::optional + getArrayElement(size_t index) const; + + void + setArrayElement(size_t index, Value const& value); + + void + setArrayElementField(size_t index, Key const& key, Value const& value); + + std::optional + getArrayElementField(size_t index, Key const& key) const; + + size_t + arraySize() const; + + // Nested array accessors (for arrays stored in object fields) + void + setNestedArrayElement(Key const& key, size_t index, Value const& value); + + void + setNestedArrayElementField( + Key const& key, + size_t index, + Key const& nestedKey, + Value const& value); + + std::optional + getNestedArrayElement(Key const& key, size_t index) const; + + std::optional + getNestedArrayElementField(Key const& key, size_t index, Key const& nestedKey) const; + + // Factory for SType value from blob (with SType marker) + static Value + makeValueFromVLWithType(SerialIter& sit); + + void + setValue(STJson const& v); + +private: + std::variant data_{Map{}}; + bool default_{false}; + + // Helper: validate nesting depth (max 1 level) + void + validateDepth(Value const& value, int currentDepth) const; + + // Helper: parse a single key-value pair from SerialIter + static std::pair + parsePair(SerialIter& sit); + + // Helper: parse array elements from SerialIter + static Array + parseArray(SerialIter& sit, int length); + + // Helper: encode a key as VL + static void + addVLKey(Serializer& s, std::string const& str); + + // Helper: encode a value as [SType marker][VL] + static void + addVLValue(Serializer& s, std::shared_ptr const& value); + + STBase* + copy(std::size_t n, void* buf) const override; + STBase* + move(std::size_t n, void* buf) override; + + friend class detail::STVar; +}; + +} // namespace xrpl diff --git a/include/xrpl/protocol/STObject.h b/include/xrpl/protocol/STObject.h index 61a1cce05e1..4cc5634f3ff 100644 --- a/include/xrpl/protocol/STObject.h +++ b/include/xrpl/protocol/STObject.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -216,6 +217,10 @@ class STObject : public STBase, public CountedObject getFieldI32(SField const& field) const; AccountID getAccountID(SField const& field) const; + STData + getFieldData(SField const& field) const; + STDataType + getFieldDataType(SField const& field) const; Blob getFieldVL(SField const& field) const; @@ -234,6 +239,8 @@ class STObject : public STBase, public CountedObject getFieldCurrency(SField const& field) const; STNumber const& getFieldNumber(SField const& field) const; + STJson const& + getFieldJson(SField const& field) const; /** Get the value of a field. @param A TypedField built from an SField value representing the desired @@ -338,6 +345,9 @@ class STObject : public STBase, public CountedObject void set(STBase&& v); + void + addFieldFromSlice(SField const& sfield, Slice const& data); + void setFieldU8(SField const& field, unsigned char); void @@ -376,6 +386,8 @@ class STObject : public STBase, public CountedObject setFieldArray(SField const& field, STArray const& v); void setFieldObject(SField const& field, STObject const& v); + void + setFieldJson(SField const& field, STJson const& v); template void diff --git a/include/xrpl/protocol/TER.h b/include/xrpl/protocol/TER.h index bc7c0a7739d..7296ad0c8c7 100644 --- a/include/xrpl/protocol/TER.h +++ b/include/xrpl/protocol/TER.h @@ -352,6 +352,7 @@ enum TECcodes : TERUnderlyingType { // reclaimed after those networks reset. tecNO_DELEGATE_PERMISSION = 198, tecWASM_REJECTED = 199, + tecINVALID_PARAMETERS = 200, }; //------------------------------------------------------------------------------ diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index 7c2085109ff..aea17af0f71 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -212,8 +212,21 @@ inline constexpr FlagValue tfUniversalMask = ~tfUniversal; TF_FLAG(tfLoanDefault, 0x00010000) \ TF_FLAG(tfLoanImpair, 0x00020000) \ TF_FLAG(tfLoanUnimpair, 0x00040000), \ + MASK_ADJ(0)) \ + \ + TRANSACTION(Contract, \ + TF_FLAG(tfImmutable, 0x00010000) \ + TF_FLAG(tfCodeImmutable, 0x00020000) \ + TF_FLAG(tfABIImmutable, 0x00040000) \ + TF_FLAG(tfUndeletable, 0x00080000), \ MASK_ADJ(0)) +constexpr std::uint32_t tfSendAmount = 0x00010000; +constexpr std::uint32_t tfSendNFToken = 0x00020000; +constexpr std::uint32_t tfAuthorizeToken = 0x00040000; +constexpr std::uint32_t tfContractParameterMask = + ~(tfSendAmount | tfSendNFToken | tfAuthorizeToken); + // clang-format on // Create all the flag values. diff --git a/include/xrpl/protocol/detail/emitable.macro b/include/xrpl/protocol/detail/emitable.macro new file mode 100644 index 00000000000..be410bbb7c2 --- /dev/null +++ b/include/xrpl/protocol/detail/emitable.macro @@ -0,0 +1,19 @@ +#if !defined(EMITABLE) +#error "undefined macro: EMITABLE" +#endif + +/** + * EMITABLE(name, type, txType, value) + * + * This macro defines a permission: + * name: the name of the permission. + * type: the GranularPermissionType enum. + * txType: the corresponding TxType for this permission. + * value: the uint32 numeric value for the enum type. + */ + +/** This removes the contract account the ability to set or remove deposit auth. */ +EMITABLE(AccountDepositAuth, ttACCOUNT_SET, 65537) + +// ** This removes the contract account the ability to set or remove disable master key. */ +EMITABLE(AccountDisableMaster, ttACCOUNT_SET, 65538) diff --git a/include/xrpl/protocol/detail/features.macro b/include/xrpl/protocol/detail/features.macro index 6688592d076..9179ec9558a 100644 --- a/include/xrpl/protocol/detail/features.macro +++ b/include/xrpl/protocol/detail/features.macro @@ -15,6 +15,7 @@ // Add new amendments to the top of this list. // Keep it sorted in reverse chronological order. +XRPL_FEATURE(SmartContract, Supported::no, VoteBehavior::DefaultNo) XRPL_FEATURE(SmartEscrow, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (Security3_1_3, Supported::no, VoteBehavior::DefaultNo) XRPL_FIX (PermissionedDomainInvariant, Supported::yes, VoteBehavior::DefaultNo) diff --git a/include/xrpl/protocol/detail/ledger_entries.macro b/include/xrpl/protocol/detail/ledger_entries.macro index d5b082e5392..8751b64ce0c 100644 --- a/include/xrpl/protocol/detail/ledger_entries.macro +++ b/include/xrpl/protocol/detail/ledger_entries.macro @@ -150,6 +150,7 @@ LEDGER_ENTRY(ltACCOUNT_ROOT, 0x0061, AccountRoot, account, ({ {sfAMMID, soeOPTIONAL}, // pseudo-account designator {sfVaultID, soeOPTIONAL}, // pseudo-account designator {sfLoanBrokerID, soeOPTIONAL}, // pseudo-account designator + {sfContractID, soeOPTIONAL}, // pseudo-account designator })) /** A ledger object which contains a list of object identifiers. @@ -610,5 +611,45 @@ LEDGER_ENTRY(ltLOAN, 0x0089, Loan, loan, ({ {sfLoanScale, soeDEFAULT}, })) +/** A ledger object representing a contract source. + \sa keylet::contractSource + */ +LEDGER_ENTRY(ltCONTRACT_SOURCE, 0x0085, ContractSource, contract_source, ({ + {sfPreviousTxnID, soeREQUIRED}, + {sfPreviousTxnLgrSeq, soeREQUIRED}, + {sfContractHash, soeREQUIRED}, + {sfContractCode, soeREQUIRED}, + {sfFunctions, soeREQUIRED}, + {sfInstanceParameters, soeOPTIONAL}, + {sfReferenceCount, soeREQUIRED}, +})) + +/** A ledger object representing a contract. + \sa keylet::contract + */ +LEDGER_ENTRY(ltCONTRACT, 0x0086, Contract, contract, ({ + {sfPreviousTxnID, soeREQUIRED}, + {sfPreviousTxnLgrSeq, soeREQUIRED}, + {sfSequence, soeREQUIRED}, + {sfOwnerNode, soeREQUIRED}, + {sfOwner, soeREQUIRED}, + {sfContractAccount, soeREQUIRED}, + {sfContractHash, soeREQUIRED}, + {sfInstanceParameterValues, soeOPTIONAL}, + {sfURI, soeOPTIONAL}, +})) + +/** A ledger object representing a contract data. + \sa keylet::contractData + */ +LEDGER_ENTRY(ltCONTRACT_DATA, 0x0087, ContractData, contract_data, ({ + {sfPreviousTxnID, soeREQUIRED}, + {sfPreviousTxnLgrSeq, soeREQUIRED}, + {sfOwnerNode, soeREQUIRED}, + {sfOwner, soeREQUIRED}, + {sfContractAccount, soeREQUIRED}, + {sfContractJson, soeREQUIRED}, +})) + #undef EXPAND #undef LEDGER_ENTRY_DUPLICATE diff --git a/include/xrpl/protocol/detail/sfields.macro b/include/xrpl/protocol/detail/sfields.macro index 78a3fc51adf..a790b2b0dfe 100644 --- a/include/xrpl/protocol/detail/sfields.macro +++ b/include/xrpl/protocol/detail/sfields.macro @@ -22,9 +22,10 @@ TYPED_SFIELD(sfAssetScale, UINT8, 5) // 8-bit integers (uncommon) TYPED_SFIELD(sfTickSize, UINT8, 16) TYPED_SFIELD(sfUNLModifyDisabling, UINT8, 17) -TYPED_SFIELD(sfHookResult, UINT8, 18) +// 18 unused TYPED_SFIELD(sfWasLockingChainSend, UINT8, 19) TYPED_SFIELD(sfWithdrawalPolicy, UINT8, 20) +TYPED_SFIELD(sfContractResult, UINT8, 21) // 16-bit integers (common) TYPED_SFIELD(sfLedgerEntryType, UINT16, 1, SField::sMD_Never) @@ -36,10 +37,7 @@ TYPED_SFIELD(sfDiscountedFee, UINT16, 6) // 16-bit integers (uncommon) TYPED_SFIELD(sfVersion, UINT16, 16) -TYPED_SFIELD(sfHookStateChangeCount, UINT16, 17) -TYPED_SFIELD(sfHookEmitCount, UINT16, 18) -TYPED_SFIELD(sfHookExecutionIndex, UINT16, 19) -TYPED_SFIELD(sfHookApiVersion, UINT16, 20) +// 17 to 20 unused TYPED_SFIELD(sfLedgerFixType, UINT16, 21) TYPED_SFIELD(sfManagementFeeRate, UINT16, 22) // 1/10 basis points (bips) @@ -90,9 +88,7 @@ TYPED_SFIELD(sfTicketSequence, UINT32, 41) TYPED_SFIELD(sfNFTokenTaxon, UINT32, 42) TYPED_SFIELD(sfMintedNFTokens, UINT32, 43) TYPED_SFIELD(sfBurnedNFTokens, UINT32, 44) -TYPED_SFIELD(sfHookStateCount, UINT32, 45) -TYPED_SFIELD(sfEmitGeneration, UINT32, 46) -// 47 reserved for Hooks +// 45 to 47 unused TYPED_SFIELD(sfVoteWeight, UINT32, 48) TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50) TYPED_SFIELD(sfOracleDocumentID, UINT32, 51) @@ -118,6 +114,7 @@ TYPED_SFIELD(sfExtensionSizeLimit, UINT32, 70) TYPED_SFIELD(sfGasPrice, UINT32, 71) TYPED_SFIELD(sfComputationAllowance, UINT32, 72) TYPED_SFIELD(sfGasUsed, UINT32, 73) +TYPED_SFIELD(sfParameterFlag, UINT32, 74) // 64-bit integers (common) TYPED_SFIELD(sfIndexNext, UINT64, 1) @@ -135,9 +132,7 @@ TYPED_SFIELD(sfNFTokenOfferNode, UINT64, 12) TYPED_SFIELD(sfEmitBurden, UINT64, 13) // 64-bit integers (uncommon) -TYPED_SFIELD(sfHookOn, UINT64, 16) -TYPED_SFIELD(sfHookInstructionCount, UINT64, 17) -TYPED_SFIELD(sfHookReturnCode, UINT64, 18) +// 16 to 18 unused TYPED_SFIELD(sfReferenceCount, UINT64, 19) TYPED_SFIELD(sfXChainClaimID, UINT64, 20) TYPED_SFIELD(sfXChainAccountCreateCount, UINT64, 21) @@ -197,10 +192,7 @@ TYPED_SFIELD(sfPreviousPageMin, UINT256, 26) TYPED_SFIELD(sfNextPageMin, UINT256, 27) TYPED_SFIELD(sfNFTokenBuyOffer, UINT256, 28) TYPED_SFIELD(sfNFTokenSellOffer, UINT256, 29) -TYPED_SFIELD(sfHookStateKey, UINT256, 30) -TYPED_SFIELD(sfHookHash, UINT256, 31) -TYPED_SFIELD(sfHookNamespace, UINT256, 32) -TYPED_SFIELD(sfHookSetTxnID, UINT256, 33) +// 30 to 33 unused TYPED_SFIELD(sfDomainID, UINT256, 34) TYPED_SFIELD(sfVaultID, UINT256, 35, SField::sMD_PseudoAccount | SField::sMD_Default) @@ -208,6 +200,9 @@ TYPED_SFIELD(sfParentBatchID, UINT256, 36) TYPED_SFIELD(sfLoanBrokerID, UINT256, 37, SField::sMD_PseudoAccount | SField::sMD_Default) TYPED_SFIELD(sfLoanID, UINT256, 38) +TYPED_SFIELD(sfContractHash, UINT256, 39) +TYPED_SFIELD(sfContractID, UINT256, 40, + SField::sMD_PseudoAccount | SField::sMD_Default) // number (common) TYPED_SFIELD(sfNumber, NUMBER, 1) @@ -252,9 +247,7 @@ TYPED_SFIELD(sfMinimumOffer, AMOUNT, 16) TYPED_SFIELD(sfRippleEscrow, AMOUNT, 17) TYPED_SFIELD(sfDeliveredAmount, AMOUNT, 18) TYPED_SFIELD(sfNFTokenBrokerFee, AMOUNT, 19) - -// Reserve 20 & 21 for Hooks. - +// 20 to 21 unused // currency amount (fees) TYPED_SFIELD(sfBaseFeeDrops, AMOUNT, 22) TYPED_SFIELD(sfReserveBaseDrops, AMOUNT, 23) @@ -292,10 +285,7 @@ TYPED_SFIELD(sfMasterSignature, VL, 18, SField::sMD_Default, SFi TYPED_SFIELD(sfUNLModifyValidator, VL, 19) TYPED_SFIELD(sfValidatorToDisable, VL, 20) TYPED_SFIELD(sfValidatorToReEnable, VL, 21) -TYPED_SFIELD(sfHookStateData, VL, 22) -TYPED_SFIELD(sfHookReturnString, VL, 23) -TYPED_SFIELD(sfHookParameterName, VL, 24) -TYPED_SFIELD(sfHookParameterValue, VL, 25) +// 22 to 25 unused TYPED_SFIELD(sfDIDDocument, VL, 26) TYPED_SFIELD(sfData, VL, 27) TYPED_SFIELD(sfAssetClass, VL, 28) @@ -303,6 +293,8 @@ TYPED_SFIELD(sfProvider, VL, 29) TYPED_SFIELD(sfMPTokenMetadata, VL, 30) TYPED_SFIELD(sfCredentialType, VL, 31) TYPED_SFIELD(sfFinishFunction, VL, 32) +TYPED_SFIELD(sfContractCode, VL, 33) +TYPED_SFIELD(sfFunctionName, VL, 34) // account (common) TYPED_SFIELD(sfAccount, ACCOUNT, 1) @@ -319,7 +311,7 @@ TYPED_SFIELD(sfHolder, ACCOUNT, 11) TYPED_SFIELD(sfDelegate, ACCOUNT, 12) // account (uncommon) -TYPED_SFIELD(sfHookAccount, ACCOUNT, 16) +// 16 unused TYPED_SFIELD(sfOtherChainSource, ACCOUNT, 18) TYPED_SFIELD(sfOtherChainDestination, ACCOUNT, 19) TYPED_SFIELD(sfAttestationSignerAccount, ACCOUNT, 20) @@ -329,6 +321,7 @@ TYPED_SFIELD(sfIssuingChainDoor, ACCOUNT, 23) TYPED_SFIELD(sfSubject, ACCOUNT, 24) TYPED_SFIELD(sfBorrower, ACCOUNT, 25) TYPED_SFIELD(sfCounterparty, ACCOUNT, 26) +TYPED_SFIELD(sfContractAccount, ACCOUNT, 27) // vector of 256-bit TYPED_SFIELD(sfIndexes, VECTOR256, 1, SField::sMD_Never) @@ -367,7 +360,7 @@ UNTYPED_SFIELD(sfMemo, OBJECT, 10) UNTYPED_SFIELD(sfSignerEntry, OBJECT, 11) UNTYPED_SFIELD(sfNFToken, OBJECT, 12) UNTYPED_SFIELD(sfEmitDetails, OBJECT, 13) -UNTYPED_SFIELD(sfHook, OBJECT, 14) +// 14 unused UNTYPED_SFIELD(sfPermission, OBJECT, 15) // inner object (uncommon) @@ -375,11 +368,7 @@ UNTYPED_SFIELD(sfSigner, OBJECT, 16) // 17 unused UNTYPED_SFIELD(sfMajority, OBJECT, 18) UNTYPED_SFIELD(sfDisabledValidator, OBJECT, 19) -UNTYPED_SFIELD(sfEmittedTxn, OBJECT, 20) -UNTYPED_SFIELD(sfHookExecution, OBJECT, 21) -UNTYPED_SFIELD(sfHookDefinition, OBJECT, 22) -UNTYPED_SFIELD(sfHookParameter, OBJECT, 23) -UNTYPED_SFIELD(sfHookGrant, OBJECT, 24) +// 20 to 24 unused UNTYPED_SFIELD(sfVoteEntry, OBJECT, 25) UNTYPED_SFIELD(sfAuctionSlot, OBJECT, 26) UNTYPED_SFIELD(sfAuthAccount, OBJECT, 27) @@ -393,6 +382,10 @@ UNTYPED_SFIELD(sfRawTransaction, OBJECT, 34) UNTYPED_SFIELD(sfBatchSigner, OBJECT, 35) UNTYPED_SFIELD(sfBook, OBJECT, 36) UNTYPED_SFIELD(sfCounterpartySignature, OBJECT, 37, SField::sMD_Default, SField::notSigning) +UNTYPED_SFIELD(sfFunction, OBJECT, 38) +UNTYPED_SFIELD(sfInstanceParameter, OBJECT, 39) +UNTYPED_SFIELD(sfInstanceParameterValue, OBJECT, 40) +UNTYPED_SFIELD(sfParameter, OBJECT, 41) // array of objects (common) // ARRAY/1 is reserved for end of array @@ -406,16 +399,14 @@ UNTYPED_SFIELD(sfSufficient, ARRAY, 7) UNTYPED_SFIELD(sfAffectedNodes, ARRAY, 8) UNTYPED_SFIELD(sfMemos, ARRAY, 9) UNTYPED_SFIELD(sfNFTokens, ARRAY, 10) -UNTYPED_SFIELD(sfHooks, ARRAY, 11) +// 11 unused UNTYPED_SFIELD(sfVoteSlots, ARRAY, 12) UNTYPED_SFIELD(sfAdditionalBooks, ARRAY, 13) // array of objects (uncommon) UNTYPED_SFIELD(sfMajorities, ARRAY, 16) UNTYPED_SFIELD(sfDisabledValidators, ARRAY, 17) -UNTYPED_SFIELD(sfHookExecutions, ARRAY, 18) -UNTYPED_SFIELD(sfHookParameters, ARRAY, 19) -UNTYPED_SFIELD(sfHookGrants, ARRAY, 20) +// 18 to 20 unused UNTYPED_SFIELD(sfXChainClaimAttestations, ARRAY, 21) UNTYPED_SFIELD(sfXChainCreateAccountAttestations, ARRAY, 22) // 23 unused @@ -427,3 +418,16 @@ UNTYPED_SFIELD(sfAcceptedCredentials, ARRAY, 28) UNTYPED_SFIELD(sfPermissions, ARRAY, 29) UNTYPED_SFIELD(sfRawTransactions, ARRAY, 30) UNTYPED_SFIELD(sfBatchSigners, ARRAY, 31, SField::sMD_Default, SField::notSigning) +UNTYPED_SFIELD(sfFunctions, ARRAY, 32) +UNTYPED_SFIELD(sfInstanceParameters, ARRAY, 33) +UNTYPED_SFIELD(sfInstanceParameterValues, ARRAY, 34) +UNTYPED_SFIELD(sfParameters, ARRAY, 35) + +// data +TYPED_SFIELD(sfParameterValue, DATA, 1, SField::sMD_Default) + +// data type +TYPED_SFIELD(sfParameterType, DATATYPE, 1) + +// json +TYPED_SFIELD(sfContractJson, JSON, 1) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index a8ce412bb3e..8b715b05846 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -3,7 +3,7 @@ #endif /** - * TRANSACTION(tag, value, name, delegable, amendments, privileges, fields) + * TRANSACTION(tag, value, name, delegable, amendments, privileges, emitable, fields) * * To ease maintenance, you may replace any unneeded values with "..." * e.g. #define TRANSACTION(tag, value, name, ...) @@ -28,6 +28,7 @@ TRANSACTION(ttPAYMENT, 0, Payment, Delegation::delegable, uint256{}, createAcct, + Emittance::emitable, ({ {sfDestination, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, @@ -48,6 +49,7 @@ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfDestination, soeREQUIRED}, {sfDestinationTag, soeOPTIONAL}, @@ -67,6 +69,7 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfOwner, soeREQUIRED}, {sfOfferSequence, soeREQUIRED}, @@ -85,6 +88,7 @@ TRANSACTION(ttACCOUNT_SET, 3, AccountSet, Delegation::notDelegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfEmailHash, soeOPTIONAL}, {sfWalletLocator, soeOPTIONAL}, @@ -106,6 +110,7 @@ TRANSACTION(ttESCROW_CANCEL, 4, EscrowCancel, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfOwner, soeREQUIRED}, {sfOfferSequence, soeREQUIRED}, @@ -119,6 +124,7 @@ TRANSACTION(ttREGULAR_KEY_SET, 5, SetRegularKey, Delegation::notDelegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfRegularKey, soeOPTIONAL}, })) @@ -133,6 +139,7 @@ TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfTakerPays, soeREQUIRED}, {sfTakerGets, soeREQUIRED}, @@ -149,6 +156,7 @@ TRANSACTION(ttOFFER_CANCEL, 8, OfferCancel, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfOfferSequence, soeREQUIRED}, })) @@ -163,6 +171,7 @@ TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfTicketCount, soeREQUIRED}, })) @@ -179,6 +188,7 @@ TRANSACTION(ttSIGNER_LIST_SET, 12, SignerListSet, Delegation::notDelegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfSignerQuorum, soeREQUIRED}, {sfSignerEntries, soeOPTIONAL}, @@ -192,6 +202,7 @@ TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfDestination, soeREQUIRED}, {sfAmount, soeREQUIRED}, @@ -209,6 +220,7 @@ TRANSACTION(ttPAYCHAN_FUND, 14, PaymentChannelFund, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfChannel, soeREQUIRED}, {sfAmount, soeREQUIRED}, @@ -223,6 +235,7 @@ TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfChannel, soeREQUIRED}, {sfAmount, soeOPTIONAL}, @@ -240,6 +253,7 @@ TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfDestination, soeREQUIRED}, {sfSendMax, soeREQUIRED}, @@ -256,6 +270,7 @@ TRANSACTION(ttCHECK_CASH, 17, CheckCash, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfCheckID, soeREQUIRED}, {sfAmount, soeOPTIONAL}, @@ -270,6 +285,7 @@ TRANSACTION(ttCHECK_CANCEL, 18, CheckCancel, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfCheckID, soeREQUIRED}, })) @@ -282,6 +298,7 @@ TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, Delegation::delegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfAuthorize, soeOPTIONAL}, {sfUnauthorize, soeOPTIONAL}, @@ -297,6 +314,7 @@ TRANSACTION(ttTRUST_SET, 20, TrustSet, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfLimitAmount, soeOPTIONAL}, {sfQualityIn, soeOPTIONAL}, @@ -311,6 +329,7 @@ TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, Delegation::notDelegable, uint256{}, mustDeleteAcct, + Emittance::notEmitable, ({ {sfDestination, soeREQUIRED}, {sfDestinationTag, soeOPTIONAL}, @@ -327,6 +346,7 @@ TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, Delegation::delegable, uint256{}, changeNFTCounts, + Emittance::emitable, ({ {sfNFTokenTaxon, soeREQUIRED}, {sfTransferFee, soeOPTIONAL}, @@ -345,6 +365,7 @@ TRANSACTION(ttNFTOKEN_BURN, 26, NFTokenBurn, Delegation::delegable, uint256{}, changeNFTCounts, + Emittance::emitable, ({ {sfNFTokenID, soeREQUIRED}, {sfOwner, soeOPTIONAL}, @@ -358,6 +379,7 @@ TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfNFTokenID, soeREQUIRED}, {sfAmount, soeREQUIRED}, @@ -374,6 +396,7 @@ TRANSACTION(ttNFTOKEN_CANCEL_OFFER, 28, NFTokenCancelOffer, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfNFTokenOffers, soeREQUIRED}, })) @@ -386,6 +409,7 @@ TRANSACTION(ttNFTOKEN_ACCEPT_OFFER, 29, NFTokenAcceptOffer, Delegation::delegable, uint256{}, noPriv, + Emittance::emitable, ({ {sfNFTokenBuyOffer, soeOPTIONAL}, {sfNFTokenSellOffer, soeOPTIONAL}, @@ -400,6 +424,7 @@ TRANSACTION(ttCLAWBACK, 30, Clawback, Delegation::delegable, featureClawback, noPriv, + Emittance::emitable, ({ {sfAmount, soeREQUIRED, soeMPTSupported}, {sfHolder, soeOPTIONAL}, @@ -413,6 +438,7 @@ TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, Delegation::delegable, featureAMMClawback, mayDeleteAcct | overrideFreeze, + Emittance::emitable, ({ {sfHolder, soeREQUIRED}, {sfAsset, soeREQUIRED}, @@ -428,6 +454,7 @@ TRANSACTION(ttAMM_CREATE, 35, AMMCreate, Delegation::delegable, featureAMM, createPseudoAcct, + Emittance::emitable, ({ {sfAmount, soeREQUIRED}, {sfAmount2, soeREQUIRED}, @@ -442,6 +469,7 @@ TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, Delegation::delegable, featureAMM, noPriv, + Emittance::emitable, ({ {sfAsset, soeREQUIRED}, {sfAsset2, soeREQUIRED}, @@ -460,6 +488,7 @@ TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, Delegation::delegable, featureAMM, mayDeleteAcct, + Emittance::emitable, ({ {sfAsset, soeREQUIRED}, {sfAsset2, soeREQUIRED}, @@ -477,6 +506,7 @@ TRANSACTION(ttAMM_VOTE, 38, AMMVote, Delegation::delegable, featureAMM, noPriv, + Emittance::emitable, ({ {sfAsset, soeREQUIRED}, {sfAsset2, soeREQUIRED}, @@ -491,6 +521,7 @@ TRANSACTION(ttAMM_BID, 39, AMMBid, Delegation::delegable, featureAMM, noPriv, + Emittance::emitable, ({ {sfAsset, soeREQUIRED}, {sfAsset2, soeREQUIRED}, @@ -507,6 +538,7 @@ TRANSACTION(ttAMM_DELETE, 40, AMMDelete, Delegation::delegable, featureAMM, mustDeleteAcct, + Emittance::emitable, ({ {sfAsset, soeREQUIRED}, {sfAsset2, soeREQUIRED}, @@ -520,6 +552,7 @@ TRANSACTION(ttXCHAIN_CREATE_CLAIM_ID, 41, XChainCreateClaimID, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfSignatureReward, soeREQUIRED}, @@ -531,6 +564,7 @@ TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfXChainClaimID, soeREQUIRED}, @@ -543,6 +577,7 @@ TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfXChainClaimID, soeREQUIRED}, @@ -556,6 +591,7 @@ TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfDestination, soeREQUIRED}, @@ -568,6 +604,7 @@ TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, Delegation::delegable, featureXChainBridge, createAcct, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, @@ -589,6 +626,7 @@ TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, Delegation::delegable, featureXChainBridge, createAcct, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, @@ -610,6 +648,7 @@ TRANSACTION(ttXCHAIN_MODIFY_BRIDGE, 47, XChainModifyBridge, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfSignatureReward, soeOPTIONAL}, @@ -621,6 +660,7 @@ TRANSACTION(ttXCHAIN_CREATE_BRIDGE, 48, XChainCreateBridge, Delegation::delegable, featureXChainBridge, noPriv, + Emittance::emitable, ({ {sfXChainBridge, soeREQUIRED}, {sfSignatureReward, soeREQUIRED}, @@ -635,6 +675,7 @@ TRANSACTION(ttDID_SET, 49, DIDSet, Delegation::delegable, featureDID, noPriv, + Emittance::emitable, ({ {sfDIDDocument, soeOPTIONAL}, {sfURI, soeOPTIONAL}, @@ -649,6 +690,7 @@ TRANSACTION(ttDID_DELETE, 50, DIDDelete, Delegation::delegable, featureDID, noPriv, + Emittance::emitable, ({})) /** This transaction type creates an Oracle instance */ @@ -659,6 +701,7 @@ TRANSACTION(ttORACLE_SET, 51, OracleSet, Delegation::delegable, featurePriceOracle, noPriv, + Emittance::emitable, ({ {sfOracleDocumentID, soeREQUIRED}, {sfProvider, soeOPTIONAL}, @@ -676,6 +719,7 @@ TRANSACTION(ttORACLE_DELETE, 52, OracleDelete, Delegation::delegable, featurePriceOracle, noPriv, + Emittance::emitable, ({ {sfOracleDocumentID, soeREQUIRED}, })) @@ -688,6 +732,7 @@ TRANSACTION(ttLEDGER_STATE_FIX, 53, LedgerStateFix, Delegation::delegable, fixNFTokenPageLinks, noPriv, + Emittance::emitable, ({ {sfLedgerFixType, soeREQUIRED}, {sfOwner, soeOPTIONAL}, @@ -701,6 +746,7 @@ TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate, Delegation::delegable, featureMPTokensV1, createMPTIssuance, + Emittance::emitable, ({ {sfAssetScale, soeOPTIONAL}, {sfTransferFee, soeOPTIONAL}, @@ -718,6 +764,7 @@ TRANSACTION(ttMPTOKEN_ISSUANCE_DESTROY, 55, MPTokenIssuanceDestroy, Delegation::delegable, featureMPTokensV1, destroyMPTIssuance, + Emittance::emitable, ({ {sfMPTokenIssuanceID, soeREQUIRED}, })) @@ -730,6 +777,7 @@ TRANSACTION(ttMPTOKEN_ISSUANCE_SET, 56, MPTokenIssuanceSet, Delegation::delegable, featureMPTokensV1, noPriv, + Emittance::emitable, ({ {sfMPTokenIssuanceID, soeREQUIRED}, {sfHolder, soeOPTIONAL}, @@ -747,6 +795,7 @@ TRANSACTION(ttMPTOKEN_AUTHORIZE, 57, MPTokenAuthorize, Delegation::delegable, featureMPTokensV1, mustAuthorizeMPT, + Emittance::emitable, ({ {sfMPTokenIssuanceID, soeREQUIRED}, {sfHolder, soeOPTIONAL}, @@ -760,6 +809,7 @@ TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, Delegation::delegable, featureCredentials, noPriv, + Emittance::emitable, ({ {sfSubject, soeREQUIRED}, {sfCredentialType, soeREQUIRED}, @@ -775,6 +825,7 @@ TRANSACTION(ttCREDENTIAL_ACCEPT, 59, CredentialAccept, Delegation::delegable, featureCredentials, noPriv, + Emittance::emitable, ({ {sfIssuer, soeREQUIRED}, {sfCredentialType, soeREQUIRED}, @@ -788,6 +839,7 @@ TRANSACTION(ttCREDENTIAL_DELETE, 60, CredentialDelete, Delegation::delegable, featureCredentials, noPriv, + Emittance::emitable, ({ {sfSubject, soeOPTIONAL}, {sfIssuer, soeOPTIONAL}, @@ -802,6 +854,7 @@ TRANSACTION(ttNFTOKEN_MODIFY, 61, NFTokenModify, Delegation::delegable, featureDynamicNFT, noPriv, + Emittance::emitable, ({ {sfNFTokenID, soeREQUIRED}, {sfOwner, soeOPTIONAL}, @@ -816,6 +869,7 @@ TRANSACTION(ttPERMISSIONED_DOMAIN_SET, 62, PermissionedDomainSet, Delegation::delegable, featurePermissionedDomains, noPriv, + Emittance::emitable, ({ {sfDomainID, soeOPTIONAL}, {sfAcceptedCredentials, soeREQUIRED}, @@ -829,6 +883,7 @@ TRANSACTION(ttPERMISSIONED_DOMAIN_DELETE, 63, PermissionedDomainDelete, Delegation::delegable, featurePermissionedDomains, noPriv, + Emittance::emitable, ({ {sfDomainID, soeREQUIRED}, })) @@ -841,6 +896,7 @@ TRANSACTION(ttDELEGATE_SET, 64, DelegateSet, Delegation::notDelegable, featurePermissionDelegationV1_1, noPriv, + Emittance::notEmitable, ({ {sfAuthorize, soeREQUIRED}, {sfPermissions, soeREQUIRED}, @@ -854,6 +910,7 @@ TRANSACTION(ttVAULT_CREATE, 65, VaultCreate, Delegation::notDelegable, featureSingleAssetVault, createPseudoAcct | createMPTIssuance | mustModifyVault, + Emittance::emitable, ({ {sfAsset, soeREQUIRED, soeMPTSupported}, {sfAssetsMaximum, soeOPTIONAL}, @@ -872,6 +929,7 @@ TRANSACTION(ttVAULT_SET, 66, VaultSet, Delegation::notDelegable, featureSingleAssetVault, mustModifyVault, + Emittance::emitable, ({ {sfVaultID, soeREQUIRED}, {sfAssetsMaximum, soeOPTIONAL}, @@ -887,6 +945,7 @@ TRANSACTION(ttVAULT_DELETE, 67, VaultDelete, Delegation::notDelegable, featureSingleAssetVault, mustDeleteAcct | destroyMPTIssuance | mustModifyVault, + Emittance::emitable, ({ {sfVaultID, soeREQUIRED}, })) @@ -899,6 +958,7 @@ TRANSACTION(ttVAULT_DEPOSIT, 68, VaultDeposit, Delegation::notDelegable, featureSingleAssetVault, mayAuthorizeMPT | mustModifyVault, + Emittance::emitable, ({ {sfVaultID, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, @@ -912,6 +972,7 @@ TRANSACTION(ttVAULT_WITHDRAW, 69, VaultWithdraw, Delegation::notDelegable, featureSingleAssetVault, mayDeleteMPT | mayAuthorizeMPT | mustModifyVault, + Emittance::emitable, ({ {sfVaultID, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, @@ -927,6 +988,7 @@ TRANSACTION(ttVAULT_CLAWBACK, 70, VaultClawback, Delegation::notDelegable, featureSingleAssetVault, mayDeleteMPT | mustModifyVault, + Emittance::emitable, ({ {sfVaultID, soeREQUIRED}, {sfHolder, soeREQUIRED}, @@ -941,6 +1003,7 @@ TRANSACTION(ttBATCH, 71, Batch, Delegation::notDelegable, featureBatch, noPriv, + Emittance::notEmitable, ({ {sfRawTransactions, soeREQUIRED}, {sfBatchSigners, soeOPTIONAL}, @@ -955,7 +1018,9 @@ TRANSACTION(ttBATCH, 71, Batch, TRANSACTION(ttLOAN_BROKER_SET, 74, LoanBrokerSet, Delegation::notDelegable, featureLendingProtocol, - createPseudoAcct | mayAuthorizeMPT, ({ + createPseudoAcct | mayAuthorizeMPT, + Emittance::emitable, + ({ {sfVaultID, soeREQUIRED}, {sfLoanBrokerID, soeOPTIONAL}, {sfData, soeOPTIONAL}, @@ -972,7 +1037,9 @@ TRANSACTION(ttLOAN_BROKER_SET, 74, LoanBrokerSet, TRANSACTION(ttLOAN_BROKER_DELETE, 75, LoanBrokerDelete, Delegation::notDelegable, featureLendingProtocol, - mustDeleteAcct | mayAuthorizeMPT, ({ + mustDeleteAcct | mayAuthorizeMPT, + Emittance::emitable, + ({ {sfLoanBrokerID, soeREQUIRED}, })) @@ -983,7 +1050,9 @@ TRANSACTION(ttLOAN_BROKER_DELETE, 75, LoanBrokerDelete, TRANSACTION(ttLOAN_BROKER_COVER_DEPOSIT, 76, LoanBrokerCoverDeposit, Delegation::notDelegable, featureLendingProtocol, - noPriv, ({ + noPriv, + Emittance::emitable, + ({ {sfLoanBrokerID, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, })) @@ -995,7 +1064,9 @@ TRANSACTION(ttLOAN_BROKER_COVER_DEPOSIT, 76, LoanBrokerCoverDeposit, TRANSACTION(ttLOAN_BROKER_COVER_WITHDRAW, 77, LoanBrokerCoverWithdraw, Delegation::notDelegable, featureLendingProtocol, - mayAuthorizeMPT, ({ + mayAuthorizeMPT, + Emittance::emitable, + ({ {sfLoanBrokerID, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, {sfDestination, soeOPTIONAL}, @@ -1010,7 +1081,9 @@ TRANSACTION(ttLOAN_BROKER_COVER_WITHDRAW, 77, LoanBrokerCoverWithdraw, TRANSACTION(ttLOAN_BROKER_COVER_CLAWBACK, 78, LoanBrokerCoverClawback, Delegation::notDelegable, featureLendingProtocol, - noPriv, ({ + noPriv, + Emittance::emitable, + ({ {sfLoanBrokerID, soeOPTIONAL}, {sfAmount, soeOPTIONAL, soeMPTSupported}, })) @@ -1022,7 +1095,9 @@ TRANSACTION(ttLOAN_BROKER_COVER_CLAWBACK, 78, LoanBrokerCoverClawback, TRANSACTION(ttLOAN_SET, 80, LoanSet, Delegation::notDelegable, featureLendingProtocol, - mayAuthorizeMPT | mustModifyVault, ({ + mayAuthorizeMPT | mustModifyVault, + Emittance::emitable, + ({ {sfLoanBrokerID, soeREQUIRED}, {sfData, soeOPTIONAL}, {sfCounterparty, soeOPTIONAL}, @@ -1049,7 +1124,9 @@ TRANSACTION(ttLOAN_SET, 80, LoanSet, TRANSACTION(ttLOAN_DELETE, 81, LoanDelete, Delegation::notDelegable, featureLendingProtocol, - noPriv, ({ + noPriv, + Emittance::emitable, +({ {sfLoanID, soeREQUIRED}, })) @@ -1063,7 +1140,9 @@ TRANSACTION(ttLOAN_MANAGE, 82, LoanManage, // All of the LoanManage options will modify the vault, but the // transaction can succeed without options, essentially making it // a noop. - mayModifyVault, ({ + mayModifyVault, + Emittance::emitable, + ({ {sfLoanID, soeREQUIRED}, })) @@ -1074,11 +1153,110 @@ TRANSACTION(ttLOAN_MANAGE, 82, LoanManage, TRANSACTION(ttLOAN_PAY, 84, LoanPay, Delegation::notDelegable, featureLendingProtocol, - mayAuthorizeMPT | mustModifyVault, ({ + mayAuthorizeMPT | mustModifyVault, + Emittance::emitable, + ({ {sfLoanID, soeREQUIRED}, {sfAmount, soeREQUIRED, soeMPTSupported}, })) +/** This transaction type creates the smart contract. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_CREATE, 85, ContractCreate, + Delegation::delegable, + featureSmartContract, + createPseudoAcct, + Emittance::emitable, + ({ + {sfContractCode, soeOPTIONAL}, + {sfContractHash, soeOPTIONAL}, + {sfFunctions, soeOPTIONAL}, + {sfInstanceParameters, soeOPTIONAL}, + {sfInstanceParameterValues, soeOPTIONAL}, + {sfURI, soeOPTIONAL}, +})) + +/** This transaction type modifies the smart contract. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_MODIFY, 86, ContractModify, + Delegation::delegable, + featureSmartContract, + noPriv, + Emittance::emitable, + ({ + {sfContractAccount, soeOPTIONAL}, + {sfOwner, soeOPTIONAL}, + {sfContractCode, soeOPTIONAL}, + {sfContractHash, soeOPTIONAL}, + {sfFunctions, soeOPTIONAL}, + {sfInstanceParameters, soeOPTIONAL}, + {sfInstanceParameterValues, soeOPTIONAL}, + {sfURI, soeOPTIONAL}, +})) + +/** This transaction type deletes the smart contract. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_DELETE, 87, ContractDelete, + Delegation::delegable, + featureSmartContract, + mustDeleteAcct, + Emittance::emitable, + ({ + {sfContractAccount, soeREQUIRED}, +})) + +/** This transaction type claws back funds from the contract. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_CLAWBACK, 88, ContractClawback, + Delegation::delegable, + featureSmartContract, + noPriv, + Emittance::emitable, + ({ + {sfContractAccount, soeOPTIONAL}, + {sfAmount, soeREQUIRED, soeMPTSupported}, +})) + +/** This transaction type deletes user data. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_USER_DELETE, 89, ContractUserDelete, + Delegation::delegable, + featureSmartContract, + noPriv, + Emittance::notEmitable, + ({ + {sfContractAccount, soeREQUIRED}, + {sfFunctionName, soeREQUIRED}, + {sfParameters, soeOPTIONAL}, + {sfComputationAllowance, soeREQUIRED}, +})) + +/** This transaction type calls the smart contract. */ +#if TRANSACTION_INCLUDE +# include +#endif +TRANSACTION(ttCONTRACT_CALL, 90, ContractCall, + Delegation::delegable, + featureSmartContract, + noPriv, + Emittance::notEmitable, + ({ + {sfContractAccount, soeREQUIRED}, + {sfFunctionName, soeREQUIRED}, + {sfParameters, soeOPTIONAL}, + {sfComputationAllowance, soeREQUIRED}, +})) + /** This system-generated transaction type is used to update the status of the various amendments. For details, see: https://xrpl.org/amendments.html @@ -1090,6 +1268,7 @@ TRANSACTION(ttAMENDMENT, 100, EnableAmendment, Delegation::notDelegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfLedgerSequence, soeREQUIRED}, {sfAmendment, soeREQUIRED}, @@ -1102,6 +1281,7 @@ TRANSACTION(ttFEE, 101, SetFee, Delegation::notDelegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfLedgerSequence, soeOPTIONAL}, // Old version uses raw numbers @@ -1127,6 +1307,7 @@ TRANSACTION(ttUNL_MODIFY, 102, UNLModify, Delegation::notDelegable, uint256{}, noPriv, + Emittance::notEmitable, ({ {sfUNLModifyDisabling, soeREQUIRED}, {sfLedgerSequence, soeREQUIRED}, diff --git a/include/xrpl/protocol/jss.h b/include/xrpl/protocol/jss.h index 632b7df770b..09bb126e760 100644 --- a/include/xrpl/protocol/jss.h +++ b/include/xrpl/protocol/jss.h @@ -186,6 +186,7 @@ JSS(common); // out: RPC server_definitions JSS(complete); // out: NetworkOPs, InboundLedger JSS(complete_ledgers); // out: NetworkOPs, PeerImp JSS(consensus); // out: NetworkOPs, LedgerConsensus +JSS(contract_account); // out: ContractInfo JSS(converge_time); // out: NetworkOPs JSS(converge_time_s); // out: NetworkOPs JSS(cookie); // out: NetworkOPs @@ -270,6 +271,8 @@ JSS(flags); // out: AccountOffers, NetworkOPs JSS(forward); // in: AccountTx JSS(freeze); // out: AccountLines JSS(freeze_peer); // out: AccountLines +JSS(function); // in: ContractInfo +JSS(functions); // out: ContractInfo JSS(deep_freeze); // out: AccountLines JSS(deep_freeze_peer); // out: AccountLines JSS(frozen_balances); // out: GatewayBalances @@ -551,6 +554,7 @@ JSS(size); // out: get_aggregate_price JSS(snapshot); // in: Subscribe JSS(source_account); // in: PathRequest, RipplePathFind JSS(source_amount); // in: PathRequest, RipplePathFind +JSS(source_code_uri); // out: ContractInfo JSS(source_currencies); // in: PathRequest, RipplePathFind JSS(source_tag); // out: AccountChannels JSS(stand_alone); // out: NetworkOPs @@ -648,6 +652,7 @@ JSS(url); // in/out: Subscribe, Unsubscribe JSS(url_password); // in: Subscribe JSS(url_username); // in: Subscribe JSS(urlgravatar); // +JSS(user_data); // out: ContractInfo JSS(username); // in: Subscribe JSS(validated); // out: NetworkOPs, RPCHelpers, AccountTx*, Tx JSS(validator_list_expires); // out: NetworkOps, ValidatorList diff --git a/include/xrpl/protocol/st.h b/include/xrpl/protocol/st.h index 61571196f2d..c2f0b1bae6b 100644 --- a/include/xrpl/protocol/st.h +++ b/include/xrpl/protocol/st.h @@ -7,7 +7,12 @@ #include #include #include +#include +#include +#include #include +#include +#include #include #include #include diff --git a/include/xrpl/protocol_autogen/ledger_entries/AccountRoot.h b/include/xrpl/protocol_autogen/ledger_entries/AccountRoot.h index 15cf14b21ab..378cd8014bd 100644 --- a/include/xrpl/protocol_autogen/ledger_entries/AccountRoot.h +++ b/include/xrpl/protocol_autogen/ledger_entries/AccountRoot.h @@ -518,6 +518,30 @@ class AccountRoot : public LedgerEntryBase { return this->sle_->isFieldPresent(sfLoanBrokerID); } + + /** + * @brief Get sfContractID (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractID() const + { + if (hasContractID()) + return this->sle_->at(sfContractID); + return std::nullopt; + } + + /** + * @brief Check if sfContractID is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractID() const + { + return this->sle_->isFieldPresent(sfContractID); + } }; /** @@ -819,6 +843,17 @@ class AccountRootBuilder : public LedgerEntryBuilderBase return *this; } + /** + * @brief Set sfContractID (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + AccountRootBuilder& + setContractID(std::decay_t const& value) + { + object_[sfContractID] = value; + return *this; + } + /** * @brief Build and return the completed AccountRoot wrapper. * @param index The ledger entry index. diff --git a/include/xrpl/protocol_autogen/ledger_entries/Contract.h b/include/xrpl/protocol_autogen/ledger_entries/Contract.h new file mode 100644 index 00000000000..1af30ac25a6 --- /dev/null +++ b/include/xrpl/protocol_autogen/ledger_entries/Contract.h @@ -0,0 +1,334 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::ledger_entries { + +class ContractBuilder; + +/** + * @brief Ledger Entry: Contract + * + * Type: ltCONTRACT (0x0086) + * RPC Name: contract + * + * Immutable wrapper around SLE providing type-safe field access. + * Use ContractBuilder to construct new ledger entries. + */ +class Contract : public LedgerEntryBase +{ +public: + static constexpr LedgerEntryType entryType = ltCONTRACT; + + /** + * @brief Construct a Contract ledger entry wrapper from an existing SLE object. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + explicit Contract(std::shared_ptr sle) + : LedgerEntryBase(std::move(sle)) + { + // Verify ledger entry type + if (sle_->getType() != entryType) + { + throw std::runtime_error("Invalid ledger entry type for Contract"); + } + } + + // Ledger entry-specific field getters + + /** + * @brief Get sfPreviousTxnID (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT256::type::value_type + getPreviousTxnID() const + { + return this->sle_->at(sfPreviousTxnID); + } + + /** + * @brief Get sfPreviousTxnLgrSeq (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getPreviousTxnLgrSeq() const + { + return this->sle_->at(sfPreviousTxnLgrSeq); + } + + /** + * @brief Get sfSequence (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getSequence() const + { + return this->sle_->at(sfSequence); + } + + /** + * @brief Get sfOwnerNode (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT64::type::value_type + getOwnerNode() const + { + return this->sle_->at(sfOwnerNode); + } + + /** + * @brief Get sfOwner (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getOwner() const + { + return this->sle_->at(sfOwner); + } + + /** + * @brief Get sfContractAccount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getContractAccount() const + { + return this->sle_->at(sfContractAccount); + } + + /** + * @brief Get sfContractHash (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT256::type::value_type + getContractHash() const + { + return this->sle_->at(sfContractHash); + } + + /** + * @brief Get sfInstanceParameterValues (soeOPTIONAL) + * @note This is an untyped field (unknown). + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameterValues() const + { + if (this->sle_->isFieldPresent(sfInstanceParameterValues)) + return this->sle_->getFieldArray(sfInstanceParameterValues); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameterValues is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameterValues() const + { + return this->sle_->isFieldPresent(sfInstanceParameterValues); + } + + /** + * @brief Get sfURI (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getURI() const + { + if (hasURI()) + return this->sle_->at(sfURI); + return std::nullopt; + } + + /** + * @brief Check if sfURI is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasURI() const + { + return this->sle_->isFieldPresent(sfURI); + } +}; + +/** + * @brief Builder for Contract ledger entries. + * + * Provides a fluent interface for constructing ledger entries with method chaining. + * Uses Json::Value internally for flexible ledger entry construction. + * Inherits common field setters from LedgerEntryBuilderBase. + */ +class ContractBuilder : public LedgerEntryBuilderBase +{ +public: + /** + * @brief Construct a new ContractBuilder with required fields. + * @param previousTxnID The sfPreviousTxnID field value. + * @param previousTxnLgrSeq The sfPreviousTxnLgrSeq field value. + * @param sequence The sfSequence field value. + * @param ownerNode The sfOwnerNode field value. + * @param owner The sfOwner field value. + * @param contractAccount The sfContractAccount field value. + * @param contractHash The sfContractHash field value. + */ + ContractBuilder(std::decay_t const& previousTxnID,std::decay_t const& previousTxnLgrSeq,std::decay_t const& sequence,std::decay_t const& ownerNode,std::decay_t const& owner,std::decay_t const& contractAccount,std::decay_t const& contractHash) + : LedgerEntryBuilderBase(ltCONTRACT) + { + setPreviousTxnID(previousTxnID); + setPreviousTxnLgrSeq(previousTxnLgrSeq); + setSequence(sequence); + setOwnerNode(ownerNode); + setOwner(owner); + setContractAccount(contractAccount); + setContractHash(contractHash); + } + + /** + * @brief Construct a ContractBuilder from an existing SLE object. + * @param sle The existing ledger entry to copy from. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + ContractBuilder(std::shared_ptr sle) + { + if (sle->at(sfLedgerEntryType) != ltCONTRACT) + { + throw std::runtime_error("Invalid ledger entry type for Contract"); + } + object_ = *sle; + } + + /** @brief Ledger entry-specific field setters */ + + /** + * @brief Set sfPreviousTxnID (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setPreviousTxnID(std::decay_t const& value) + { + object_[sfPreviousTxnID] = value; + return *this; + } + + /** + * @brief Set sfPreviousTxnLgrSeq (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setPreviousTxnLgrSeq(std::decay_t const& value) + { + object_[sfPreviousTxnLgrSeq] = value; + return *this; + } + + /** + * @brief Set sfSequence (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setSequence(std::decay_t const& value) + { + object_[sfSequence] = value; + return *this; + } + + /** + * @brief Set sfOwnerNode (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setOwnerNode(std::decay_t const& value) + { + object_[sfOwnerNode] = value; + return *this; + } + + /** + * @brief Set sfOwner (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setOwner(std::decay_t const& value) + { + object_[sfOwner] = value; + return *this; + } + + /** + * @brief Set sfContractAccount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfContractHash (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setContractHash(std::decay_t const& value) + { + object_[sfContractHash] = value; + return *this; + } + + /** + * @brief Set sfInstanceParameterValues (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setInstanceParameterValues(STArray const& value) + { + object_.setFieldArray(sfInstanceParameterValues, value); + return *this; + } + + /** + * @brief Set sfURI (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractBuilder& + setURI(std::decay_t const& value) + { + object_[sfURI] = value; + return *this; + } + + /** + * @brief Build and return the completed Contract wrapper. + * @param index The ledger entry index. + * @return The constructed ledger entry wrapper. + */ + Contract + build(uint256 const& index) + { + return Contract{std::make_shared(std::move(object_), index)}; + } +}; + +} // namespace xrpl::ledger_entries diff --git a/include/xrpl/protocol_autogen/ledger_entries/ContractData.h b/include/xrpl/protocol_autogen/ledger_entries/ContractData.h new file mode 100644 index 00000000000..8b8b2b1f477 --- /dev/null +++ b/include/xrpl/protocol_autogen/ledger_entries/ContractData.h @@ -0,0 +1,239 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::ledger_entries { + +class ContractDataBuilder; + +/** + * @brief Ledger Entry: ContractData + * + * Type: ltCONTRACT_DATA (0x0087) + * RPC Name: contract_data + * + * Immutable wrapper around SLE providing type-safe field access. + * Use ContractDataBuilder to construct new ledger entries. + */ +class ContractData : public LedgerEntryBase +{ +public: + static constexpr LedgerEntryType entryType = ltCONTRACT_DATA; + + /** + * @brief Construct a ContractData ledger entry wrapper from an existing SLE object. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + explicit ContractData(std::shared_ptr sle) + : LedgerEntryBase(std::move(sle)) + { + // Verify ledger entry type + if (sle_->getType() != entryType) + { + throw std::runtime_error("Invalid ledger entry type for ContractData"); + } + } + + // Ledger entry-specific field getters + + /** + * @brief Get sfPreviousTxnID (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT256::type::value_type + getPreviousTxnID() const + { + return this->sle_->at(sfPreviousTxnID); + } + + /** + * @brief Get sfPreviousTxnLgrSeq (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getPreviousTxnLgrSeq() const + { + return this->sle_->at(sfPreviousTxnLgrSeq); + } + + /** + * @brief Get sfOwnerNode (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT64::type::value_type + getOwnerNode() const + { + return this->sle_->at(sfOwnerNode); + } + + /** + * @brief Get sfOwner (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getOwner() const + { + return this->sle_->at(sfOwner); + } + + /** + * @brief Get sfContractAccount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getContractAccount() const + { + return this->sle_->at(sfContractAccount); + } + + /** + * @brief Get sfContractJson (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_JSON::type::value_type + getContractJson() const + { + return this->sle_->at(sfContractJson); + } +}; + +/** + * @brief Builder for ContractData ledger entries. + * + * Provides a fluent interface for constructing ledger entries with method chaining. + * Uses Json::Value internally for flexible ledger entry construction. + * Inherits common field setters from LedgerEntryBuilderBase. + */ +class ContractDataBuilder : public LedgerEntryBuilderBase +{ +public: + /** + * @brief Construct a new ContractDataBuilder with required fields. + * @param previousTxnID The sfPreviousTxnID field value. + * @param previousTxnLgrSeq The sfPreviousTxnLgrSeq field value. + * @param ownerNode The sfOwnerNode field value. + * @param owner The sfOwner field value. + * @param contractAccount The sfContractAccount field value. + * @param contractJson The sfContractJson field value. + */ + ContractDataBuilder(std::decay_t const& previousTxnID,std::decay_t const& previousTxnLgrSeq,std::decay_t const& ownerNode,std::decay_t const& owner,std::decay_t const& contractAccount,std::decay_t const& contractJson) + : LedgerEntryBuilderBase(ltCONTRACT_DATA) + { + setPreviousTxnID(previousTxnID); + setPreviousTxnLgrSeq(previousTxnLgrSeq); + setOwnerNode(ownerNode); + setOwner(owner); + setContractAccount(contractAccount); + setContractJson(contractJson); + } + + /** + * @brief Construct a ContractDataBuilder from an existing SLE object. + * @param sle The existing ledger entry to copy from. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + ContractDataBuilder(std::shared_ptr sle) + { + if (sle->at(sfLedgerEntryType) != ltCONTRACT_DATA) + { + throw std::runtime_error("Invalid ledger entry type for ContractData"); + } + object_ = *sle; + } + + /** @brief Ledger entry-specific field setters */ + + /** + * @brief Set sfPreviousTxnID (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setPreviousTxnID(std::decay_t const& value) + { + object_[sfPreviousTxnID] = value; + return *this; + } + + /** + * @brief Set sfPreviousTxnLgrSeq (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setPreviousTxnLgrSeq(std::decay_t const& value) + { + object_[sfPreviousTxnLgrSeq] = value; + return *this; + } + + /** + * @brief Set sfOwnerNode (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setOwnerNode(std::decay_t const& value) + { + object_[sfOwnerNode] = value; + return *this; + } + + /** + * @brief Set sfOwner (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setOwner(std::decay_t const& value) + { + object_[sfOwner] = value; + return *this; + } + + /** + * @brief Set sfContractAccount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfContractJson (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDataBuilder& + setContractJson(std::decay_t const& value) + { + object_[sfContractJson] = value; + return *this; + } + + /** + * @brief Build and return the completed ContractData wrapper. + * @param index The ledger entry index. + * @return The constructed ledger entry wrapper. + */ + ContractData + build(uint256 const& index) + { + return ContractData{std::make_shared(std::move(object_), index)}; + } +}; + +} // namespace xrpl::ledger_entries diff --git a/include/xrpl/protocol_autogen/ledger_entries/ContractSource.h b/include/xrpl/protocol_autogen/ledger_entries/ContractSource.h new file mode 100644 index 00000000000..25e8ce870f4 --- /dev/null +++ b/include/xrpl/protocol_autogen/ledger_entries/ContractSource.h @@ -0,0 +1,276 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::ledger_entries { + +class ContractSourceBuilder; + +/** + * @brief Ledger Entry: ContractSource + * + * Type: ltCONTRACT_SOURCE (0x0085) + * RPC Name: contract_source + * + * Immutable wrapper around SLE providing type-safe field access. + * Use ContractSourceBuilder to construct new ledger entries. + */ +class ContractSource : public LedgerEntryBase +{ +public: + static constexpr LedgerEntryType entryType = ltCONTRACT_SOURCE; + + /** + * @brief Construct a ContractSource ledger entry wrapper from an existing SLE object. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + explicit ContractSource(std::shared_ptr sle) + : LedgerEntryBase(std::move(sle)) + { + // Verify ledger entry type + if (sle_->getType() != entryType) + { + throw std::runtime_error("Invalid ledger entry type for ContractSource"); + } + } + + // Ledger entry-specific field getters + + /** + * @brief Get sfPreviousTxnID (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT256::type::value_type + getPreviousTxnID() const + { + return this->sle_->at(sfPreviousTxnID); + } + + /** + * @brief Get sfPreviousTxnLgrSeq (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getPreviousTxnLgrSeq() const + { + return this->sle_->at(sfPreviousTxnLgrSeq); + } + + /** + * @brief Get sfContractHash (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT256::type::value_type + getContractHash() const + { + return this->sle_->at(sfContractHash); + } + + /** + * @brief Get sfContractCode (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_VL::type::value_type + getContractCode() const + { + return this->sle_->at(sfContractCode); + } + + /** + * @brief Get sfFunctions (soeREQUIRED) + * @note This is an untyped field (unknown). + * @return The field value. + */ + [[nodiscard]] + STArray const& + getFunctions() const + { + return this->sle_->getFieldArray(sfFunctions); + } + + /** + * @brief Get sfInstanceParameters (soeOPTIONAL) + * @note This is an untyped field (unknown). + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameters() const + { + if (this->sle_->isFieldPresent(sfInstanceParameters)) + return this->sle_->getFieldArray(sfInstanceParameters); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameters is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameters() const + { + return this->sle_->isFieldPresent(sfInstanceParameters); + } + + /** + * @brief Get sfReferenceCount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT64::type::value_type + getReferenceCount() const + { + return this->sle_->at(sfReferenceCount); + } +}; + +/** + * @brief Builder for ContractSource ledger entries. + * + * Provides a fluent interface for constructing ledger entries with method chaining. + * Uses Json::Value internally for flexible ledger entry construction. + * Inherits common field setters from LedgerEntryBuilderBase. + */ +class ContractSourceBuilder : public LedgerEntryBuilderBase +{ +public: + /** + * @brief Construct a new ContractSourceBuilder with required fields. + * @param previousTxnID The sfPreviousTxnID field value. + * @param previousTxnLgrSeq The sfPreviousTxnLgrSeq field value. + * @param contractHash The sfContractHash field value. + * @param contractCode The sfContractCode field value. + * @param functions The sfFunctions field value. + * @param referenceCount The sfReferenceCount field value. + */ + ContractSourceBuilder(std::decay_t const& previousTxnID,std::decay_t const& previousTxnLgrSeq,std::decay_t const& contractHash,std::decay_t const& contractCode,STArray const& functions,std::decay_t const& referenceCount) + : LedgerEntryBuilderBase(ltCONTRACT_SOURCE) + { + setPreviousTxnID(previousTxnID); + setPreviousTxnLgrSeq(previousTxnLgrSeq); + setContractHash(contractHash); + setContractCode(contractCode); + setFunctions(functions); + setReferenceCount(referenceCount); + } + + /** + * @brief Construct a ContractSourceBuilder from an existing SLE object. + * @param sle The existing ledger entry to copy from. + * @throws std::runtime_error if the ledger entry type doesn't match. + */ + ContractSourceBuilder(std::shared_ptr sle) + { + if (sle->at(sfLedgerEntryType) != ltCONTRACT_SOURCE) + { + throw std::runtime_error("Invalid ledger entry type for ContractSource"); + } + object_ = *sle; + } + + /** @brief Ledger entry-specific field setters */ + + /** + * @brief Set sfPreviousTxnID (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setPreviousTxnID(std::decay_t const& value) + { + object_[sfPreviousTxnID] = value; + return *this; + } + + /** + * @brief Set sfPreviousTxnLgrSeq (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setPreviousTxnLgrSeq(std::decay_t const& value) + { + object_[sfPreviousTxnLgrSeq] = value; + return *this; + } + + /** + * @brief Set sfContractHash (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setContractHash(std::decay_t const& value) + { + object_[sfContractHash] = value; + return *this; + } + + /** + * @brief Set sfContractCode (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setContractCode(std::decay_t const& value) + { + object_[sfContractCode] = value; + return *this; + } + + /** + * @brief Set sfFunctions (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setFunctions(STArray const& value) + { + object_.setFieldArray(sfFunctions, value); + return *this; + } + + /** + * @brief Set sfInstanceParameters (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setInstanceParameters(STArray const& value) + { + object_.setFieldArray(sfInstanceParameters, value); + return *this; + } + + /** + * @brief Set sfReferenceCount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractSourceBuilder& + setReferenceCount(std::decay_t const& value) + { + object_[sfReferenceCount] = value; + return *this; + } + + /** + * @brief Build and return the completed ContractSource wrapper. + * @param index The ledger entry index. + * @return The constructed ledger entry wrapper. + */ + ContractSource + build(uint256 const& index) + { + return ContractSource{std::make_shared(std::move(object_), index)}; + } +}; + +} // namespace xrpl::ledger_entries diff --git a/include/xrpl/protocol_autogen/transactions/ContractCall.h b/include/xrpl/protocol_autogen/transactions/ContractCall.h new file mode 100644 index 00000000000..07765c92bad --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractCall.h @@ -0,0 +1,212 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractCallBuilder; + +/** + * @brief Transaction: ContractCall + * + * Type: ttCONTRACT_CALL (90) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: noPriv + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractCallBuilder to construct new transactions. + */ +class ContractCall : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_CALL; + + /** + * @brief Construct a ContractCall transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractCall(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractCall"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractAccount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getContractAccount() const + { + return this->tx_->at(sfContractAccount); + } + + /** + * @brief Get sfFunctionName (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_VL::type::value_type + getFunctionName() const + { + return this->tx_->at(sfFunctionName); + } + /** + * @brief Get sfParameters (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getParameters() const + { + if (this->tx_->isFieldPresent(sfParameters)) + return this->tx_->getFieldArray(sfParameters); + return std::nullopt; + } + + /** + * @brief Check if sfParameters is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasParameters() const + { + return this->tx_->isFieldPresent(sfParameters); + } + + /** + * @brief Get sfComputationAllowance (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getComputationAllowance() const + { + return this->tx_->at(sfComputationAllowance); + } +}; + +/** + * @brief Builder for ContractCall transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractCallBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractCallBuilder with required fields. + * @param account The account initiating the transaction. + * @param contractAccount The sfContractAccount field value. + * @param functionName The sfFunctionName field value. + * @param computationAllowance The sfComputationAllowance field value. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractCallBuilder(SF_ACCOUNT::type::value_type account, + std::decay_t const& contractAccount, std::decay_t const& functionName, std::decay_t const& computationAllowance, std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_CALL, account, sequence, fee) + { + setContractAccount(contractAccount); + setFunctionName(functionName); + setComputationAllowance(computationAllowance); + } + + /** + * @brief Construct a ContractCallBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractCallBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_CALL) + { + throw std::runtime_error("Invalid transaction type for ContractCallBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractAccount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractCallBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfFunctionName (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractCallBuilder& + setFunctionName(std::decay_t const& value) + { + object_[sfFunctionName] = value; + return *this; + } + + /** + * @brief Set sfParameters (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCallBuilder& + setParameters(STArray const& value) + { + object_.setFieldArray(sfParameters, value); + return *this; + } + + /** + * @brief Set sfComputationAllowance (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractCallBuilder& + setComputationAllowance(std::decay_t const& value) + { + object_[sfComputationAllowance] = value; + return *this; + } + + /** + * @brief Build and return the ContractCall wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractCall + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractCall{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/protocol_autogen/transactions/ContractClawback.h b/include/xrpl/protocol_autogen/transactions/ContractClawback.h new file mode 100644 index 00000000000..1fd7736c8ce --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractClawback.h @@ -0,0 +1,168 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractClawbackBuilder; + +/** + * @brief Transaction: ContractClawback + * + * Type: ttCONTRACT_CLAWBACK (88) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: noPriv + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractClawbackBuilder to construct new transactions. + */ +class ContractClawback : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_CLAWBACK; + + /** + * @brief Construct a ContractClawback transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractClawback(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractClawback"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractAccount (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractAccount() const + { + if (hasContractAccount()) + { + return this->tx_->at(sfContractAccount); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractAccount is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractAccount() const + { + return this->tx_->isFieldPresent(sfContractAccount); + } + + /** + * @brief Get sfAmount (soeREQUIRED) + * @note This field supports MPT (Multi-Purpose Token) amounts. + * @return The field value. + */ + [[nodiscard]] + SF_AMOUNT::type::value_type + getAmount() const + { + return this->tx_->at(sfAmount); + } +}; + +/** + * @brief Builder for ContractClawback transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractClawbackBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractClawbackBuilder with required fields. + * @param account The account initiating the transaction. + * @param amount The sfAmount field value. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractClawbackBuilder(SF_ACCOUNT::type::value_type account, + std::decay_t const& amount, std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_CLAWBACK, account, sequence, fee) + { + setAmount(amount); + } + + /** + * @brief Construct a ContractClawbackBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractClawbackBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_CLAWBACK) + { + throw std::runtime_error("Invalid transaction type for ContractClawbackBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractAccount (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractClawbackBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfAmount (soeREQUIRED) + * @note This field supports MPT (Multi-Purpose Token) amounts. + * @return Reference to this builder for method chaining. + */ + ContractClawbackBuilder& + setAmount(std::decay_t const& value) + { + object_[sfAmount] = value; + return *this; + } + + /** + * @brief Build and return the ContractClawback wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractClawback + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractClawback{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/protocol_autogen/transactions/ContractCreate.h b/include/xrpl/protocol_autogen/transactions/ContractCreate.h new file mode 100644 index 00000000000..3ad7ecf4826 --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractCreate.h @@ -0,0 +1,321 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractCreateBuilder; + +/** + * @brief Transaction: ContractCreate + * + * Type: ttCONTRACT_CREATE (85) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: createPseudoAcct + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractCreateBuilder to construct new transactions. + */ +class ContractCreate : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_CREATE; + + /** + * @brief Construct a ContractCreate transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractCreate(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractCreate"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractCode (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractCode() const + { + if (hasContractCode()) + { + return this->tx_->at(sfContractCode); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractCode is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractCode() const + { + return this->tx_->isFieldPresent(sfContractCode); + } + + /** + * @brief Get sfContractHash (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractHash() const + { + if (hasContractHash()) + { + return this->tx_->at(sfContractHash); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractHash is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractHash() const + { + return this->tx_->isFieldPresent(sfContractHash); + } + /** + * @brief Get sfFunctions (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getFunctions() const + { + if (this->tx_->isFieldPresent(sfFunctions)) + return this->tx_->getFieldArray(sfFunctions); + return std::nullopt; + } + + /** + * @brief Check if sfFunctions is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasFunctions() const + { + return this->tx_->isFieldPresent(sfFunctions); + } + /** + * @brief Get sfInstanceParameters (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameters() const + { + if (this->tx_->isFieldPresent(sfInstanceParameters)) + return this->tx_->getFieldArray(sfInstanceParameters); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameters is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameters() const + { + return this->tx_->isFieldPresent(sfInstanceParameters); + } + /** + * @brief Get sfInstanceParameterValues (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameterValues() const + { + if (this->tx_->isFieldPresent(sfInstanceParameterValues)) + return this->tx_->getFieldArray(sfInstanceParameterValues); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameterValues is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameterValues() const + { + return this->tx_->isFieldPresent(sfInstanceParameterValues); + } + + /** + * @brief Get sfURI (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getURI() const + { + if (hasURI()) + { + return this->tx_->at(sfURI); + } + return std::nullopt; + } + + /** + * @brief Check if sfURI is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasURI() const + { + return this->tx_->isFieldPresent(sfURI); + } +}; + +/** + * @brief Builder for ContractCreate transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractCreateBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractCreateBuilder with required fields. + * @param account The account initiating the transaction. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractCreateBuilder(SF_ACCOUNT::type::value_type account, + std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_CREATE, account, sequence, fee) + { + } + + /** + * @brief Construct a ContractCreateBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractCreateBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_CREATE) + { + throw std::runtime_error("Invalid transaction type for ContractCreateBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractCode (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setContractCode(std::decay_t const& value) + { + object_[sfContractCode] = value; + return *this; + } + + /** + * @brief Set sfContractHash (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setContractHash(std::decay_t const& value) + { + object_[sfContractHash] = value; + return *this; + } + + /** + * @brief Set sfFunctions (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setFunctions(STArray const& value) + { + object_.setFieldArray(sfFunctions, value); + return *this; + } + + /** + * @brief Set sfInstanceParameters (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setInstanceParameters(STArray const& value) + { + object_.setFieldArray(sfInstanceParameters, value); + return *this; + } + + /** + * @brief Set sfInstanceParameterValues (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setInstanceParameterValues(STArray const& value) + { + object_.setFieldArray(sfInstanceParameterValues, value); + return *this; + } + + /** + * @brief Set sfURI (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractCreateBuilder& + setURI(std::decay_t const& value) + { + object_[sfURI] = value; + return *this; + } + + /** + * @brief Build and return the ContractCreate wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractCreate + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractCreate{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/protocol_autogen/transactions/ContractDelete.h b/include/xrpl/protocol_autogen/transactions/ContractDelete.h new file mode 100644 index 00000000000..6d84efc2d1a --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractDelete.h @@ -0,0 +1,129 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractDeleteBuilder; + +/** + * @brief Transaction: ContractDelete + * + * Type: ttCONTRACT_DELETE (87) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: mustDeleteAcct + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractDeleteBuilder to construct new transactions. + */ +class ContractDelete : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_DELETE; + + /** + * @brief Construct a ContractDelete transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractDelete(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractDelete"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractAccount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getContractAccount() const + { + return this->tx_->at(sfContractAccount); + } +}; + +/** + * @brief Builder for ContractDelete transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractDeleteBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractDeleteBuilder with required fields. + * @param account The account initiating the transaction. + * @param contractAccount The sfContractAccount field value. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractDeleteBuilder(SF_ACCOUNT::type::value_type account, + std::decay_t const& contractAccount, std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_DELETE, account, sequence, fee) + { + setContractAccount(contractAccount); + } + + /** + * @brief Construct a ContractDeleteBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractDeleteBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_DELETE) + { + throw std::runtime_error("Invalid transaction type for ContractDeleteBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractAccount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractDeleteBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Build and return the ContractDelete wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractDelete + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractDelete{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/protocol_autogen/transactions/ContractModify.h b/include/xrpl/protocol_autogen/transactions/ContractModify.h new file mode 100644 index 00000000000..20f252ac765 --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractModify.h @@ -0,0 +1,395 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractModifyBuilder; + +/** + * @brief Transaction: ContractModify + * + * Type: ttCONTRACT_MODIFY (86) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: noPriv + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractModifyBuilder to construct new transactions. + */ +class ContractModify : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_MODIFY; + + /** + * @brief Construct a ContractModify transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractModify(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractModify"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractAccount (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractAccount() const + { + if (hasContractAccount()) + { + return this->tx_->at(sfContractAccount); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractAccount is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractAccount() const + { + return this->tx_->isFieldPresent(sfContractAccount); + } + + /** + * @brief Get sfOwner (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getOwner() const + { + if (hasOwner()) + { + return this->tx_->at(sfOwner); + } + return std::nullopt; + } + + /** + * @brief Check if sfOwner is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasOwner() const + { + return this->tx_->isFieldPresent(sfOwner); + } + + /** + * @brief Get sfContractCode (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractCode() const + { + if (hasContractCode()) + { + return this->tx_->at(sfContractCode); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractCode is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractCode() const + { + return this->tx_->isFieldPresent(sfContractCode); + } + + /** + * @brief Get sfContractHash (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getContractHash() const + { + if (hasContractHash()) + { + return this->tx_->at(sfContractHash); + } + return std::nullopt; + } + + /** + * @brief Check if sfContractHash is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasContractHash() const + { + return this->tx_->isFieldPresent(sfContractHash); + } + /** + * @brief Get sfFunctions (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getFunctions() const + { + if (this->tx_->isFieldPresent(sfFunctions)) + return this->tx_->getFieldArray(sfFunctions); + return std::nullopt; + } + + /** + * @brief Check if sfFunctions is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasFunctions() const + { + return this->tx_->isFieldPresent(sfFunctions); + } + /** + * @brief Get sfInstanceParameters (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameters() const + { + if (this->tx_->isFieldPresent(sfInstanceParameters)) + return this->tx_->getFieldArray(sfInstanceParameters); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameters is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameters() const + { + return this->tx_->isFieldPresent(sfInstanceParameters); + } + /** + * @brief Get sfInstanceParameterValues (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getInstanceParameterValues() const + { + if (this->tx_->isFieldPresent(sfInstanceParameterValues)) + return this->tx_->getFieldArray(sfInstanceParameterValues); + return std::nullopt; + } + + /** + * @brief Check if sfInstanceParameterValues is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasInstanceParameterValues() const + { + return this->tx_->isFieldPresent(sfInstanceParameterValues); + } + + /** + * @brief Get sfURI (soeOPTIONAL) + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + protocol_autogen::Optional + getURI() const + { + if (hasURI()) + { + return this->tx_->at(sfURI); + } + return std::nullopt; + } + + /** + * @brief Check if sfURI is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasURI() const + { + return this->tx_->isFieldPresent(sfURI); + } +}; + +/** + * @brief Builder for ContractModify transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractModifyBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractModifyBuilder with required fields. + * @param account The account initiating the transaction. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractModifyBuilder(SF_ACCOUNT::type::value_type account, + std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_MODIFY, account, sequence, fee) + { + } + + /** + * @brief Construct a ContractModifyBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractModifyBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_MODIFY) + { + throw std::runtime_error("Invalid transaction type for ContractModifyBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractAccount (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfOwner (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setOwner(std::decay_t const& value) + { + object_[sfOwner] = value; + return *this; + } + + /** + * @brief Set sfContractCode (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setContractCode(std::decay_t const& value) + { + object_[sfContractCode] = value; + return *this; + } + + /** + * @brief Set sfContractHash (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setContractHash(std::decay_t const& value) + { + object_[sfContractHash] = value; + return *this; + } + + /** + * @brief Set sfFunctions (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setFunctions(STArray const& value) + { + object_.setFieldArray(sfFunctions, value); + return *this; + } + + /** + * @brief Set sfInstanceParameters (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setInstanceParameters(STArray const& value) + { + object_.setFieldArray(sfInstanceParameters, value); + return *this; + } + + /** + * @brief Set sfInstanceParameterValues (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setInstanceParameterValues(STArray const& value) + { + object_.setFieldArray(sfInstanceParameterValues, value); + return *this; + } + + /** + * @brief Set sfURI (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractModifyBuilder& + setURI(std::decay_t const& value) + { + object_[sfURI] = value; + return *this; + } + + /** + * @brief Build and return the ContractModify wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractModify + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractModify{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/protocol_autogen/transactions/ContractUserDelete.h b/include/xrpl/protocol_autogen/transactions/ContractUserDelete.h new file mode 100644 index 00000000000..09f41523d96 --- /dev/null +++ b/include/xrpl/protocol_autogen/transactions/ContractUserDelete.h @@ -0,0 +1,212 @@ +// This file is auto-generated. Do not edit. +#pragma once + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl::transactions { + +class ContractUserDeleteBuilder; + +/** + * @brief Transaction: ContractUserDelete + * + * Type: ttCONTRACT_USER_DELETE (89) + * Delegable: Delegation::delegable + * Amendment: featureSmartContract + * Privileges: noPriv + * + * Immutable wrapper around STTx providing type-safe field access. + * Use ContractUserDeleteBuilder to construct new transactions. + */ +class ContractUserDelete : public TransactionBase +{ +public: + static constexpr xrpl::TxType txType = ttCONTRACT_USER_DELETE; + + /** + * @brief Construct a ContractUserDelete transaction wrapper from an existing STTx object. + * @throws std::runtime_error if the transaction type doesn't match. + */ + explicit ContractUserDelete(std::shared_ptr tx) + : TransactionBase(std::move(tx)) + { + // Verify transaction type + if (tx_->getTxnType() != txType) + { + throw std::runtime_error("Invalid transaction type for ContractUserDelete"); + } + } + + // Transaction-specific field getters + + /** + * @brief Get sfContractAccount (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_ACCOUNT::type::value_type + getContractAccount() const + { + return this->tx_->at(sfContractAccount); + } + + /** + * @brief Get sfFunctionName (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_VL::type::value_type + getFunctionName() const + { + return this->tx_->at(sfFunctionName); + } + /** + * @brief Get sfParameters (soeOPTIONAL) + * @note This is an untyped field. + * @return The field value, or std::nullopt if not present. + */ + [[nodiscard]] + std::optional> + getParameters() const + { + if (this->tx_->isFieldPresent(sfParameters)) + return this->tx_->getFieldArray(sfParameters); + return std::nullopt; + } + + /** + * @brief Check if sfParameters is present. + * @return True if the field is present, false otherwise. + */ + [[nodiscard]] + bool + hasParameters() const + { + return this->tx_->isFieldPresent(sfParameters); + } + + /** + * @brief Get sfComputationAllowance (soeREQUIRED) + * @return The field value. + */ + [[nodiscard]] + SF_UINT32::type::value_type + getComputationAllowance() const + { + return this->tx_->at(sfComputationAllowance); + } +}; + +/** + * @brief Builder for ContractUserDelete transactions. + * + * Provides a fluent interface for constructing transactions with method chaining. + * Uses Json::Value internally for flexible transaction construction. + * Inherits common field setters from TransactionBuilderBase. + */ +class ContractUserDeleteBuilder : public TransactionBuilderBase +{ +public: + /** + * @brief Construct a new ContractUserDeleteBuilder with required fields. + * @param account The account initiating the transaction. + * @param contractAccount The sfContractAccount field value. + * @param functionName The sfFunctionName field value. + * @param computationAllowance The sfComputationAllowance field value. + * @param sequence Optional sequence number for the transaction. + * @param fee Optional fee for the transaction. + */ + ContractUserDeleteBuilder(SF_ACCOUNT::type::value_type account, + std::decay_t const& contractAccount, std::decay_t const& functionName, std::decay_t const& computationAllowance, std::optional sequence = std::nullopt, + std::optional fee = std::nullopt +) + : TransactionBuilderBase(ttCONTRACT_USER_DELETE, account, sequence, fee) + { + setContractAccount(contractAccount); + setFunctionName(functionName); + setComputationAllowance(computationAllowance); + } + + /** + * @brief Construct a ContractUserDeleteBuilder from an existing STTx object. + * @param tx The existing transaction to copy from. + * @throws std::runtime_error if the transaction type doesn't match. + */ + ContractUserDeleteBuilder(std::shared_ptr tx) + { + if (tx->getTxnType() != ttCONTRACT_USER_DELETE) + { + throw std::runtime_error("Invalid transaction type for ContractUserDeleteBuilder"); + } + object_ = *tx; + } + + /** @brief Transaction-specific field setters */ + + /** + * @brief Set sfContractAccount (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractUserDeleteBuilder& + setContractAccount(std::decay_t const& value) + { + object_[sfContractAccount] = value; + return *this; + } + + /** + * @brief Set sfFunctionName (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractUserDeleteBuilder& + setFunctionName(std::decay_t const& value) + { + object_[sfFunctionName] = value; + return *this; + } + + /** + * @brief Set sfParameters (soeOPTIONAL) + * @return Reference to this builder for method chaining. + */ + ContractUserDeleteBuilder& + setParameters(STArray const& value) + { + object_.setFieldArray(sfParameters, value); + return *this; + } + + /** + * @brief Set sfComputationAllowance (soeREQUIRED) + * @return Reference to this builder for method chaining. + */ + ContractUserDeleteBuilder& + setComputationAllowance(std::decay_t const& value) + { + object_[sfComputationAllowance] = value; + return *this; + } + + /** + * @brief Build and return the ContractUserDelete wrapper. + * @param publicKey The public key for signing. + * @param secretKey The secret key for signing. + * @return The constructed transaction wrapper. + */ + ContractUserDelete + build(PublicKey const& publicKey, SecretKey const& secretKey) + { + sign(publicKey, secretKey); + return ContractUserDelete{std::make_shared(std::move(object_))}; + } +}; + +} // namespace xrpl::transactions diff --git a/include/xrpl/server/InfoSub.h b/include/xrpl/server/InfoSub.h index d45f4d77406..dc0bf70bcfb 100644 --- a/include/xrpl/server/InfoSub.h +++ b/include/xrpl/server/InfoSub.h @@ -148,6 +148,11 @@ class InfoSub : public CountedObject virtual bool unsubConsensus(std::uint64_t uListener) = 0; + virtual bool + subContractEvent(ref ispListener) = 0; + virtual bool + unsubContractEvent(std::uint64_t uListener) = 0; + // VFALCO TODO Remove // This was added for one particular partner, it // "pushes" subscription data to a particular URL. diff --git a/include/xrpl/server/NetworkOPs.h b/include/xrpl/server/NetworkOPs.h index 75f1e0e1b22..21a51a28625 100644 --- a/include/xrpl/server/NetworkOPs.h +++ b/include/xrpl/server/NetworkOPs.h @@ -247,6 +247,9 @@ class NetworkOPs : public InfoSub::Source virtual void pubValidation(std::shared_ptr const& val) = 0; + virtual void + pubContractEvent(std::string const& name, STJson const& event) = 0; + virtual void stateAccounting(Json::Value& obj) = 0; }; diff --git a/include/xrpl/tx/ApplyContext.h b/include/xrpl/tx/ApplyContext.h index 61e738b38fc..a5cb97d9acc 100644 --- a/include/xrpl/tx/ApplyContext.h +++ b/include/xrpl/tx/ApplyContext.h @@ -3,10 +3,12 @@ #include #include #include +#include #include #include #include +#include namespace xrpl { @@ -43,6 +45,12 @@ class ApplyContext XRPAmount const baseFee; beast::Journal const journal; + OpenView& + openView() + { + return base_.view(); + } + ApplyView& view() { @@ -89,10 +97,27 @@ class ApplyContext wasmReturnCode_ = wasmReturnCode; } + /** Sets the gas used in the metadata */ + void + setEmittedTxns(std::queue> const emittedTxns) + { + emittedTxns_ = emittedTxns; + } + + std::queue> + getEmittedTxns() + { + return emittedTxns_; + } + /** Discard changes and start fresh. */ void discard(); + /** Finalize changes. */ + void + finalize(); + /** Apply the transaction result to the base. */ std::optional apply(TER); @@ -132,14 +157,14 @@ class ApplyContext TER checkInvariantsHelper(TER const result, XRPAmount const fee, std::index_sequence); - OpenView& base_; + OpenViewSandbox base_; ApplyFlags flags_; std::optional view_; - // The ID of the batch transaction we are executing under, if seated. - std::optional parentBatchId_; std::optional gasUsed_; std::optional wasmReturnCode_; + std::queue> emittedTxns_; + std::optional parentBatchId_; }; } // namespace xrpl diff --git a/include/xrpl/tx/Transactor.h b/include/xrpl/tx/Transactor.h index 287f785cd7c..fa54e25a1c1 100644 --- a/include/xrpl/tx/Transactor.h +++ b/include/xrpl/tx/Transactor.h @@ -297,6 +297,9 @@ class Transactor std::pair reset(XRPAmount fee); + std::pair + checkInvariants(TER result, XRPAmount fee); + TER consumeSeqProxy(SLE::pointer const& sleAccount); TER diff --git a/include/xrpl/tx/apply.h b/include/xrpl/tx/apply.h index 49b30fea02f..96b5d734711 100644 --- a/include/xrpl/tx/apply.h +++ b/include/xrpl/tx/apply.h @@ -9,6 +9,8 @@ namespace xrpl { +class Application; + class HashRouter; class ServiceRegistry; @@ -102,6 +104,24 @@ apply( ApplyFlags flags, beast::Journal journal); +ApplyResult +apply( + ServiceRegistry& registry, + OpenView& view, + uint256 const& parentBatchId, + STTx const& tx, + ApplyFlags flags, + beast::Journal j); + +ApplyResult +apply( + Application& app, + OpenView& view, + uint256 const& parentBatchId, + STTx const& tx, + ApplyFlags flags, + beast::Journal j); + /** Enum class for return value from `applyTransaction` @see applyTransaction diff --git a/include/xrpl/tx/transactors/DeleteUtils.h b/include/xrpl/tx/transactors/DeleteUtils.h new file mode 100644 index 00000000000..6bcca1fb5f8 --- /dev/null +++ b/include/xrpl/tx/transactors/DeleteUtils.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +// Define a function pointer type that can be used to delete ledger node types. +using DeleterFuncPtr = TER (*)( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j); + +DeleterFuncPtr +nonObligationDeleter(LedgerEntryType t); + +TER +deletePreclaim( + PreclaimContext const& ctx, + std::uint32_t seqDelta, + AccountID const account, + AccountID const dest, + bool isPseudoAccount = false); + +TER +deleteDoApply( + ApplyContext& applyCtx, + STAmount const& accountBalance, + AccountID const& account, + AccountID const& dest); + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractCall.h b/include/xrpl/tx/transactors/contract/ContractCall.h new file mode 100644 index 00000000000..66536494dc6 --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractCall.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractCall : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractCall(ApplyContext& ctx) : Transactor(ctx) + { + } + + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractClawback.h b/include/xrpl/tx/transactors/contract/ContractClawback.h new file mode 100644 index 00000000000..b47f603b885 --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractClawback.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractClawback : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractClawback(ApplyContext& ctx) : Transactor(ctx) + { + } + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractCreate.h b/include/xrpl/tx/transactors/contract/ContractCreate.h new file mode 100644 index 00000000000..8f69a8ab576 --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractCreate.h @@ -0,0 +1,32 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractCreate : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractCreate(ApplyContext& ctx) : Transactor(ctx) + { + } + + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + + static std::uint32_t + getFlagsMask(PreflightContext const& ctx); + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractDelete.h b/include/xrpl/tx/transactors/contract/ContractDelete.h new file mode 100644 index 00000000000..ed1d9f81e90 --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractDelete.h @@ -0,0 +1,34 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractDelete : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractDelete(ApplyContext& ctx) : Transactor(ctx) + { + } + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + // Interface used by DeleteAccount + static TER + deleteContract( + ApplyView& view, + std::shared_ptr const& sle, + AccountID const& account, + beast::Journal j); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractModify.h b/include/xrpl/tx/transactors/contract/ContractModify.h new file mode 100644 index 00000000000..025fb36355a --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractModify.h @@ -0,0 +1,29 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractModify : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractModify(ApplyContext& ctx) : Transactor(ctx) + { + } + + static XRPAmount + calculateBaseFee(ReadView const& view, STTx const& tx); + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/contract/ContractUserDelete.h b/include/xrpl/tx/transactors/contract/ContractUserDelete.h new file mode 100644 index 00000000000..c525242c570 --- /dev/null +++ b/include/xrpl/tx/transactors/contract/ContractUserDelete.h @@ -0,0 +1,26 @@ +#pragma once + +#include + +namespace xrpl { + +class ContractUserDelete : public Transactor +{ +public: + static constexpr ConsequencesFactoryType ConsequencesFactory{Normal}; + + explicit ContractUserDelete(ApplyContext& ctx) : Transactor(ctx) + { + } + + static NotTEC + preflight(PreflightContext const& ctx); + + static TER + preclaim(PreclaimContext const& ctx); + + TER + doApply() override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/transactors/nft/NFTokenMint.h b/include/xrpl/tx/transactors/nft/NFTokenMint.h index d4eeba2bf05..107d327a025 100644 --- a/include/xrpl/tx/transactors/nft/NFTokenMint.h +++ b/include/xrpl/tx/transactors/nft/NFTokenMint.h @@ -1,8 +1,8 @@ #pragma once +#include #include #include -#include namespace xrpl { diff --git a/include/xrpl/tx/wasm/ContractContext.h b/include/xrpl/tx/wasm/ContractContext.h new file mode 100644 index 00000000000..8c214057843 --- /dev/null +++ b/include/xrpl/tx/wasm/ContractContext.h @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include +#include + +#include + +namespace xrpl { + +struct ParameterValueVec +{ + STData const value; +}; + +struct FunctionParameterValueVecWithName +{ + Blob const name; + STData const value; +}; + +struct ParameterTypeVec +{ + STDataType const type; +}; + +std::vector +getParameterValueVec(STArray const& functionParameters); + +std::vector +getParameterTypeVec(STArray const& functionParameters); + +enum ExitType : uint8_t { + UNSET = 0, + WASM_ERROR = 1, + ROLLBACK = 2, + ACCEPT = 3, +}; + +struct ContractResult +{ + uint256 const contractHash; // Hash of the contract code + Keylet const contractKeylet; // Keylet for the contract instance + Keylet const contractSourceKeylet; // Keylet for the contract source + Keylet const contractAccountKeylet; // Keylet for the contract account + AccountID const contractAccount; // AccountID of the contract account + std::uint32_t nextSequence; // Next sequence number for the contract account + AccountID const otxnAccount; // AccountID for the originating transaction + uint256 const otxnId; // ID for the originating transaction + std::string exitReason{""}; + int64_t exitCode{-1}; + ContractDataMap dataMap; + ContractEventMap eventMap; + std::queue> emittedTxns{}; + std::size_t changedDataCount{0}; +}; + +struct ContractContext +{ + ApplyContext& applyCtx; + std::vector instanceParameters; + std::vector functionParameters; + std::vector built_txns; + int64_t expected_etxn_count{-1}; // expected emitted transaction count + std::map nonce_used{}; // nonces used in this execution + uint32_t generation = 0; // generation of the contract being executed + uint64_t burden = 0; // computational burden used + ContractResult result; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/wasm/ContractHostFuncImpl.h b/include/xrpl/tx/wasm/ContractHostFuncImpl.h new file mode 100644 index 00000000000..a243bde6479 --- /dev/null +++ b/include/xrpl/tx/wasm/ContractHostFuncImpl.h @@ -0,0 +1,95 @@ +#pragma once + +#include +#include +#include + +namespace xrpl { +class ContractHostFunctionsImpl : public WasmHostFunctionsImpl +{ + ContractContext& contractCtx; + uint256 const contractId = contractCtx.result.contractKeylet.key; + +public: + // Constructor for contract-specific functionality + ContractHostFunctionsImpl(ContractContext& contractContext) + : WasmHostFunctionsImpl(contractContext.applyCtx, contractContext.result.contractKeylet) + , contractCtx(contractContext) + { + } + + // Expected + // getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t + // stTypeId); + + Expected + instanceParam(std::uint32_t index, std::uint32_t stTypeId) override; + + Expected + functionParam(std::uint32_t index, std::uint32_t stTypeId) override; + + Expected + getDataObjectField(AccountID const& account, std::string_view const& key) override; + + Expected + getDataNestedObjectField( + AccountID const& account, + std::string_view const& key, + std::string_view const& nestedKey) override; + + Expected + getDataArrayElementField(AccountID const& account, size_t index, std::string_view const& key) + override; + + Expected + getDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey) override; + + Expected + setDataObjectField( + AccountID const& account, + std::string_view const& key, + STJson::Value const& value) override; + + Expected + setDataNestedObjectField( + AccountID const& account, + std::string_view const& nestedKey, + std::string_view const& key, + STJson::Value const& value) override; + + Expected + setDataArrayElementField( + AccountID const& account, + size_t index, + std::string_view const& key, + STJson::Value const& value) override; + + Expected + setDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey, + STJson::Value const& value) override; + + Expected + buildTxn(std::uint16_t const& txType) override; + + Expected + addTxnField(std::uint32_t const& index, SField const& field, Slice const& data) override; + + Expected + emitBuiltTxn(std::uint32_t const& index) override; + + Expected + emitTxn(std::shared_ptr const& stxPtr) override; + + Expected + emitEvent(std::string_view const& eventName, STJson const& eventData) override; +}; + +} // namespace xrpl diff --git a/include/xrpl/tx/wasm/HostFunc.h b/include/xrpl/tx/wasm/HostFunc.h index a3a26cfbaf6..4ed9e7b3661 100644 --- a/include/xrpl/tx/wasm/HostFunc.h +++ b/include/xrpl/tx/wasm/HostFunc.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include #include #include @@ -13,6 +15,7 @@ namespace xrpl { enum class HostFunctionError : int32_t { + SUCCESS = 0, INTERNAL = -1, FIELD_NOT_FOUND = -2, BUFFER_TOO_SMALL = -3, @@ -35,6 +38,8 @@ enum class HostFunctionError : int32_t { FLOAT_COMPUTATION_ERROR = -20, NO_RUNTIME = -21, OUT_OF_GAS = -22, + SUBMIT_TXN_FAILURE = -23, + INVALID_STATE = -24, }; inline int32_t @@ -494,6 +499,119 @@ struct HostFunctions return Unexpected(HostFunctionError::INTERNAL); } + virtual Expected + instanceParam(std::uint32_t index, std::uint32_t stTypeId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + functionParam(std::uint32_t index, std::uint32_t stTypeId) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getDataObjectField(AccountID const& account, std::string_view const& key) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getDataNestedObjectField( + AccountID const& account, + std::string_view const& key, + std::string_view const& nestedKey) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getDataArrayElementField(AccountID const& account, size_t index, std::string_view const& key) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + getDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + setDataObjectField( + AccountID const& account, + std::string_view const& keyName, + STJson::Value const& value) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + setDataNestedObjectField( + AccountID const& account, + std::string_view const& nestedKey, + std::string_view const& key, + STJson::Value const& value) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + setDataArrayElementField( + AccountID const& account, + size_t index, + std::string_view const& key, + STJson::Value const& value) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + setDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey, + STJson::Value const& value) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + buildTxn(std::uint16_t const& txType) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + addTxnField(std::uint32_t const& index, SField const& field, Slice const& data) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + emitBuiltTxn(std::uint32_t const& index) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + emitTxn(std::shared_ptr const& stxPtr) + { + return Unexpected(HostFunctionError::INTERNAL); + } + + virtual Expected + emitEvent(std::string_view const& eventName, STJson const& eventData) + { + return Unexpected(HostFunctionError::INTERNAL); + } + virtual ~HostFunctions() = default; // LCOV_EXCL_STOP }; diff --git a/include/xrpl/tx/wasm/HostFuncWrapper.h b/include/xrpl/tx/wasm/HostFuncWrapper.h index 444c3be97c3..ad849ffe7f3 100644 --- a/include/xrpl/tx/wasm/HostFuncWrapper.h +++ b/include/xrpl/tx/wasm/HostFuncWrapper.h @@ -300,4 +300,96 @@ using floatLog_proto = int32_t(uint8_t const*, int32_t, uint8_t*, int32_t, int32 wasm_trap_t* floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); +// Contract-specific host function wrappers + +using instanceParam_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +instanceParam_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using functionParam_proto = int32_t(int32_t, int32_t, uint8_t*, int32_t); +wasm_trap_t* +functionParam_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using getDataObjectField_proto = + int32_t(uint8_t*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getDataObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using getDataNestedObjectField_proto = + int32_t(uint8_t*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getDataNestedObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using setDataObjectField_proto = + int32_t(uint8_t*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +setDataObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using setDataNestedObjectField_proto = + int32_t(uint8_t*, int32_t, uint8_t const*, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +setDataNestedObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using getDataArrayElementField_proto = + int32_t(uint8_t*, int32_t, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +getDataArrayElementField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using getDataNestedArrayElementField_proto = int32_t( + uint8_t*, + int32_t, + uint8_t const*, + int32_t, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +getDataNestedArrayElementField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using setDataArrayElementField_proto = + int32_t(uint8_t*, int32_t, int32_t, uint8_t const*, int32_t, uint8_t*, int32_t); +wasm_trap_t* +setDataArrayElementField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using setDataNestedArrayElementField_proto = int32_t( + uint8_t*, + int32_t, + uint8_t const*, + int32_t, + int32_t, + uint8_t const*, + int32_t, + uint8_t*, + int32_t); +wasm_trap_t* +setDataNestedArrayElementField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results); + +using buildTxn_proto = int32_t(int32_t); +wasm_trap_t* +buildTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using addTxnField_proto = int32_t(int32_t, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +addTxnField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using emitBuiltTxn_proto = int32_t(int32_t); +wasm_trap_t* +emitBuiltTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using emitTxn_proto = int32_t(uint8_t const*, int32_t); +wasm_trap_t* +emitTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + +using emitEvent_proto = int32_t(uint8_t const*, int32_t, uint8_t const*, int32_t); +wasm_trap_t* +emitEvent_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results); + } // namespace xrpl diff --git a/include/xrpl/tx/wasm/ParamsHelper.h b/include/xrpl/tx/wasm/ParamsHelper.h index 54904112263..ca019c2d7fa 100644 --- a/include/xrpl/tx/wasm/ParamsHelper.h +++ b/include/xrpl/tx/wasm/ParamsHelper.h @@ -31,6 +31,7 @@ struct WasmResult int64_t cost; }; typedef WasmResult EscrowResult; +typedef WasmResult WasmRunResult; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -181,6 +182,43 @@ wasmParamsHlp(std::vector& v, std::int64_t p, Types&&... args) // wasmParamsHlp(v, std::forward(args)...); // } +template +inline void +wasmParamsHlp(std::vector& v, std::uint8_t const* dt, std::int32_t sz, Types&&... args) +{ + v.push_back({.type = WT_U8V, .of = {.u8v = {.d = dt, .sz = sz}}}); + wasmParamsHlp(v, std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, Bytes const& p, Types&&... args) +{ + wasmParamsHlp(v, p.data(), static_cast(p.size()), std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::string_view const& p, Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.data()), + static_cast(p.size()), + std::forward(args)...); +} + +template +inline void +wasmParamsHlp(std::vector& v, std::string const& p, Types&&... args) +{ + wasmParamsHlp( + v, + reinterpret_cast(p.c_str()), + static_cast(p.size()), + std::forward(args)...); +} + inline void wasmParamsHlp(std::vector& v) { diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 1702d4243bf..77fecd16d52 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -443,6 +443,271 @@ doWithdraw( return accountSend(view, sourceAcct, dstAcct, amount, j, WaiveTransferFee::Yes); } +static TER +canTransferIOU( + ReadView const& view, + AccountID const& sender, + AccountID const& receiver, + STAmount const& amount, + beast::Journal j, + SendIssuerHandling issuerHandling, + SendEscrowHandling escrowHandling, + SendAuthHandling authHandling, + SendFreezeHandling freezeHandling, + SendTransferHandling transferHandling, + SendBalanceHandling balanceHandling) +{ + AccountID issuer = amount.getIssuer(); + // If the issuer is the same as the sender + if (issuerHandling == SendIssuerHandling::ihSENDER_NOT_ALLOWED && issuer == sender) + return tecNO_PERMISSION; + + // If the issuer is the same as the receiver + if (issuerHandling == SendIssuerHandling::ihRECEIVER_NOT_ALLOWED && issuer == receiver) + return tecNO_PERMISSION; + + // If the lsfAllowTrustLineLocking is not enabled + auto const sleIssuer = view.read(keylet::account(issuer)); + if (!sleIssuer) + return tecNO_ISSUER; + + if (issuerHandling != SendIssuerHandling::ihSENDER_NOT_ALLOWED && + issuerHandling != SendIssuerHandling::ihRECEIVER_NOT_ALLOWED && + !sleIssuer->isFlag(lsfDefaultRipple)) + return terNO_RIPPLE; + + if (escrowHandling == SendEscrowHandling::ehCHECK && + !sleIssuer->isFlag(lsfAllowTrustLineLocking)) + return tecNO_PERMISSION; + + // If the sender does not have a trustline to the issuer + auto const sleRippleState = view.read(keylet::line(sender, issuer, amount.getCurrency())); + + if (!sleRippleState) + return tecNO_LINE; + + STAmount const balance = (*sleRippleState)[sfBalance]; + + // If balance is positive, issuer must have higher address than sender + if (balance > beast::zero && issuer < sender) + return tecNO_PERMISSION; // LCOV_EXCL_LINE + + // If balance is negative, issuer must have lower address than sender + if (balance < beast::zero && issuer > sender) + return tecNO_PERMISSION; // LCOV_EXCL_LINE + + // // If the account trustline has no-ripple set for the issuer + // if (auto const ter = requireNoRipple(ctx.view, amount.issue(), account); + // ter != tesSUCCESS) + // return ter; + + // // If the dest trustline has no-ripple set for the issuer + // if (auto const ter = requireNoRipple(ctx.view, amount.issue(), dest); + // ter != tesSUCCESS) + // return ter; + + // If the issuer has requireAuth set, check if the sender is authorized + if (authHandling == SendAuthHandling::ahCHECK_SENDER || + authHandling == SendAuthHandling::ahBOTH) + { + if (auto const ter = requireAuth(view, amount.issue(), sender); ter != tesSUCCESS) + return ter; + } + + // If the issuer has requireAuth set, check if the receiver is authorized + if (authHandling == SendAuthHandling::ahCHECK_RECEIVER || + authHandling == SendAuthHandling::ahBOTH) + { + if (auto const ter = requireAuth(view, amount.issue(), receiver); ter != tesSUCCESS) + return ter; + } + + // If the issuer has frozen the sender + if ((freezeHandling == SendFreezeHandling::fhCHECK_SENDER || + freezeHandling == SendFreezeHandling::fhBOTH) && + isFrozen(view, sender, amount.issue())) + return tecFROZEN; + + // If the issuer has frozen the receiver + if ((freezeHandling == SendFreezeHandling::fhCHECK_RECEIVER || + freezeHandling == SendFreezeHandling::fhBOTH) && + isFrozen(view, receiver, amount.issue())) + return tecFROZEN; + + if (balanceHandling == SendBalanceHandling::bhIGNORE) + return tesSUCCESS; + + STAmount const spendableAmount = accountHolds( + view, + sender, + amount.get(), + fhIGNORE_FREEZE, // already checked freeze above + ahIGNORE_AUTH, // already checked auth above + j); + + // If the balance is less than or equal to 0 + if (spendableAmount <= beast::zero) + return tecINSUFFICIENT_FUNDS; + + // If the spendable amount is less than the amount + if (spendableAmount < amount) + return tecINSUFFICIENT_FUNDS; + + // If the amount is not addable to the balance + if (!canAdd(spendableAmount, amount)) + return tecPRECISION_LOSS; + + return tesSUCCESS; +} + +static TER +canTransferMPT( + ReadView const& view, + AccountID const& sender, + AccountID const& receiver, + STAmount const& amount, + beast::Journal j, + SendIssuerHandling issuerHandling, + SendEscrowHandling escrowHandling, + SendAuthHandling authHandling, + SendFreezeHandling freezeHandling, + SendTransferHandling transferHandling, + SendBalanceHandling balanceHandling) +{ + AccountID issuer = amount.getIssuer(); + // If the issuer is the same as the sender + if (issuerHandling == SendIssuerHandling::ihSENDER_NOT_ALLOWED && issuer == sender) + return tecNO_PERMISSION; + + // If the issuer is the same as the receiver + if (issuerHandling == SendIssuerHandling::ihRECEIVER_NOT_ALLOWED && issuer == receiver) + return tecNO_PERMISSION; + + // If the mpt does not exist + auto const issuanceKey = keylet::mptIssuance(amount.get().getMptID()); + auto const sleIssuance = view.read(issuanceKey); + if (!sleIssuance) + return tecOBJECT_NOT_FOUND; + + // If the lsfMPTCanEscrow is not enabled + if (escrowHandling == SendEscrowHandling::ehCHECK && !sleIssuance->isFlag(lsfMPTCanEscrow)) + return tecNO_PERMISSION; + + // If the issuer is not the same as the issuer of the mpt + if (sleIssuance->getAccountID(sfIssuer) != issuer) + return tecNO_PERMISSION; // LCOV_EXCL_LINE + + // If the sender does not have the mpt + if (!view.exists(keylet::mptoken(issuanceKey.key, sender))) + return tecOBJECT_NOT_FOUND; + + auto const& mptIssue = amount.get(); + + // If the issuer has requireAuth set, check if the sender is authorized + if (authHandling == SendAuthHandling::ahCHECK_SENDER || + authHandling == SendAuthHandling::ahBOTH) + { + if (auto const ter = requireAuth(view, mptIssue, sender, AuthType::WeakAuth); + ter != tesSUCCESS) + return ter; + } + + // If the issuer has requireAuth set, check if the receiver is authorized + if (authHandling == SendAuthHandling::ahCHECK_RECEIVER || + authHandling == SendAuthHandling::ahBOTH) + { + if (auto const ter = requireAuth(view, mptIssue, receiver, AuthType::WeakAuth); + ter != tesSUCCESS) + return ter; + } + + // If the issuer has frozen the sender, return tecLOCKED + if ((freezeHandling == SendFreezeHandling::fhCHECK_SENDER || + freezeHandling == SendFreezeHandling::fhBOTH) && + isFrozen(view, sender, mptIssue)) + return tecLOCKED; + + // If the issuer has frozen the receiver, return tecLOCKED + if ((freezeHandling == SendFreezeHandling::fhCHECK_RECEIVER || + freezeHandling == SendFreezeHandling::fhBOTH) && + isFrozen(view, receiver, mptIssue)) + return tecLOCKED; + + // If the mpt cannot be transferred, return tecNO_AUTH + if (transferHandling == SendTransferHandling::thCHECK) + { + if (auto const ter = canTransfer(view, mptIssue, sender, receiver); ter != tesSUCCESS) + return ter; + } + + if (balanceHandling == SendBalanceHandling::bhIGNORE) + return tesSUCCESS; + + STAmount const spendableAmount = accountHolds( + view, + sender, + amount.get(), + fhIGNORE_FREEZE, // already checked freeze above + ahIGNORE_AUTH, // already checked auth above + j); + + // If the balance is less than or equal to 0, return tecINSUFFICIENT_FUNDS + if (spendableAmount <= beast::zero) + return tecINSUFFICIENT_FUNDS; + + // If the spendable amount is less than the amount, return + // tecINSUFFICIENT_FUNDS + if (spendableAmount < amount) + return tecINSUFFICIENT_FUNDS; + + return tesSUCCESS; +} + +TER +canTransferFT( + ReadView const& view, + AccountID const& sender, + AccountID const& receiver, + STAmount const& amount, + beast::Journal j, + SendIssuerHandling issuerHandling = SendIssuerHandling::ihIGNORE, + SendEscrowHandling escrowHandling = SendEscrowHandling::ehIGNORE, + SendAuthHandling authHandling = SendAuthHandling::ahBOTH, + SendFreezeHandling freezeHandling = SendFreezeHandling::fhBOTH, + SendTransferHandling transferHandling = SendTransferHandling::thIGNORE, + SendBalanceHandling balanceHandling = SendBalanceHandling::bhCHECK) +{ + return std::visit( + [&](TIss const& issue) -> TER { + if constexpr (std::is_same_v) + return canTransferIOU( + view, + sender, + receiver, + amount, + j, + issuerHandling, + escrowHandling, + authHandling, + freezeHandling, + transferHandling, + balanceHandling); + else + return canTransferMPT( + view, + sender, + receiver, + amount, + j, + issuerHandling, + escrowHandling, + authHandling, + freezeHandling, + transferHandling, + balanceHandling); + }, + amount.asset().value()); +} TER cleanupOnAccountDelete( ApplyView& view, diff --git a/src/libxrpl/ledger/helpers/ContractUtils.cpp b/src/libxrpl/ledger/helpers/ContractUtils.cpp new file mode 100644 index 00000000000..6a0b23a434a --- /dev/null +++ b/src/libxrpl/ledger/helpers/ContractUtils.cpp @@ -0,0 +1,643 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2025 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { +namespace contract { + +struct BlobHash +{ + std::size_t + operator()(Blob const& b) const noexcept + { + if (b.empty()) + return 0; + return std::hash{}( + std::string_view(reinterpret_cast(b.data()), b.size())); + } +}; + +int64_t +contractCreateFee(uint64_t byteCount) +{ + constexpr uint64_t mul = static_cast(createByteMultiplier); + if (byteCount > std::numeric_limits::max() / mul) + return feeCalculationFailed; // overflow + uint64_t uf = byteCount * mul; + if (uf > static_cast(std::numeric_limits::max())) + return feeCalculationFailed; + return static_cast(uf); +} + +NotTEC +preflightFunctions(STTx const& tx, beast::Journal j) +{ + // Functions must be present if ContractCode is present. + if (!tx.isFieldPresent(sfContractCode)) + return tesSUCCESS; + + if (!tx.isFieldPresent(sfFunctions)) + { + JLOG(j.trace()) << "ContractCreate/Modify: ContractCode present but " + "Functions missing."; + return temARRAY_EMPTY; + } + + auto const& functions = tx.getFieldArray(sfFunctions); + + if (functions.empty()) + { + JLOG(j.trace()) << "ContractCreate/Modify: Functions array empty."; + return temARRAY_EMPTY; + } + + // Functions must not exceed n entries. + if (functions.size() > contract::maxContractFunctions) + { + JLOG(j.trace()) << "ContractCreate/Modify: Functions array too large."; + return temARRAY_TOO_LARGE; + } + + std::unordered_set uniqueFunctions; + uniqueFunctions.reserve(functions.size()); + for (auto const& function : functions) + { + // Functions must be unique by name. + auto const& functionName = function.getFieldVL(sfFunctionName); + if (!uniqueFunctions.insert(functionName).second) + { + JLOG(j.trace()) << "Duplicate function name: " << strHex(functionName); + return temREDUNDANT; + } + + auto const& parameters = function.getFieldArray(sfParameters); + + // Function Parameters must not exceed n entries each. + if (parameters.size() > contract::maxContractParams) + { + JLOG(j.trace()) << "ContractCreate/Modify: Function Parameters " + "array is too large."; + return temARRAY_TOO_LARGE; + } + + std::unordered_set uniqueParameters; + uniqueParameters.reserve(parameters.size()); + + for (auto const& param : parameters) + { + // Function Parameter must have a flag. + if (!param.isFieldPresent(sfParameterFlag)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Function Parameter " + "is missing flag."; + return temMALFORMED; + } + + // Function Parameter must have a type. + if (!param.isFieldPresent(sfParameterType)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Function Parameter " + "is missing type."; + return temMALFORMED; + } + + // Function Parameter flags must be valid. + auto const flags = param.getFieldU32(sfParameterFlag); + if (flags & tfContractParameterMask) + { + JLOG(j.trace()) << "ContractCreate/Modify: Invalid parameter " + "flag in Function."; + return temINVALID_FLAG; + } + } + } + return tesSUCCESS; +} + +NotTEC +preflightInstanceParameters(STTx const& tx, beast::Journal j) +{ + if (!tx.isFieldPresent(sfInstanceParameters)) + return tesSUCCESS; + + auto const& instanceParameters = tx.getFieldArray(sfInstanceParameters); + + // InstanceParameters must not be empty. + if (instanceParameters.empty()) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameters empty array."; + return temARRAY_EMPTY; + } + + // InstanceParameters must not exceed n entries. + if (instanceParameters.size() > contract::maxContractParams) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameters array " + "is too large."; + return temARRAY_TOO_LARGE; + } + + std::unordered_set uniqueParameters; + uniqueParameters.reserve(instanceParameters.size()); + for (auto const& param : instanceParameters) + { + // Instance Parameter must have a flag. + if (!param.isFieldPresent(sfParameterFlag)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Instance Parameter is missing flag."; + return temMALFORMED; + } + + // Instance Parameter must have a type. + if (!param.isFieldPresent(sfParameterType)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Instance Parameter is missing type."; + return temMALFORMED; + } + + // Instance Parameter flags must be valid. + auto const flags = param.getFieldU32(sfParameterFlag); + if (flags & tfContractParameterMask) + { + JLOG(j.trace()) << "ContractCreate/Modify: Invalid parameter " + "flag in Instance Parameter."; + return temINVALID_FLAG; + } + } + return tesSUCCESS; +} + +bool +validateParameterMapping(STArray const& params, STArray const& values, beast::Journal j) +{ + if (params.size() != values.size()) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameterValues size " + "does not match InstanceParameters size."; + return false; + } + return true; +} + +NotTEC +preflightInstanceParameterValues(STTx const& tx, beast::Journal j) +{ + if (!tx.isFieldPresent(sfInstanceParameterValues)) + return tesSUCCESS; + + auto const& instanceParameterValues = tx.getFieldArray(sfInstanceParameterValues); + + // InstanceParameters must not be empty. + if (instanceParameterValues.empty()) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameterValues is missing."; + return temARRAY_EMPTY; + } + + // InstanceParameterValues must not exceed n entries. + if (instanceParameterValues.size() > contract::maxContractParams) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameterValues " + "array is too large."; + return temARRAY_TOO_LARGE; + } + + std::unordered_set uniqueParameters; + uniqueParameters.reserve(instanceParameterValues.size()); + for (auto const& param : instanceParameterValues) + { + // Instance Parameter must have a flag. + if (!param.isFieldPresent(sfParameterFlag)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Instance Parameter is missing flag."; + return temMALFORMED; + } + + // Instance Parameter must have a value. + if (!param.isFieldPresent(sfParameterValue)) + { + JLOG(j.trace()) << "ContractCreate/Modify: Instance Parameter is " + "missing value."; + return temMALFORMED; + } + + // Instance Parameter flags must be valid. + auto const flags = param.getFieldU32(sfParameterFlag); + if (flags & tfContractParameterMask) + { + JLOG(j.trace()) << "ContractCreate/Modify: Invalid parameter " + "flag in Instance Parameter."; + return temINVALID_FLAG; + } + } + + // Only validate the mapping if InstanceParameters are present + bool valid = true; + if (tx.isFieldPresent(sfInstanceParameters)) + valid = validateParameterMapping( + tx.getFieldArray(sfInstanceParameters), tx.getFieldArray(sfInstanceParameterValues), j); + if (!valid) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameterValues do not match " + "InstanceParameters."; + return temMALFORMED; + } + + // Validate flags in InstanceParameterValues + if (auto const res = preflightFlagParameters(instanceParameterValues, j); !isTesSuccess(res)) + { + JLOG(j.trace()) << "ContractCreate/Modify: InstanceParameterValues flag " + "validation failed: " + << transToken(res); + return res; + } + + return tesSUCCESS; +} + +bool +isValidParameterFlag(std::uint32_t flags) +{ + return (flags & tfContractParameterMask) == 0; +} + +NotTEC +preflightFlagParameters(STArray const& parameters, beast::Journal j) +{ + for (auto const& param : parameters) + { + if (!param.isFieldPresent(sfParameterFlag) || + !isValidParameterFlag(param.getFieldU32(sfParameterFlag))) + continue; // Skip invalid flags + + switch (param.getFieldU32(sfParameterFlag)) + { + case tfSendAmount: { + if (!param.isFieldPresent(sfParameterValue)) + return temMALFORMED; + auto const& value = param.getFieldData(sfParameterValue); + STAmount amount = value.getFieldAmount(); + // Preflight Transfer Amount + if (isXRP(amount)) + { + if (amount <= beast::zero) + return temBAD_AMOUNT; + } + else if (amount.holds()) + { + if (amount.native() || amount <= beast::zero) + return temBAD_AMOUNT; + + if (badCurrency() == amount.getCurrency()) + return temBAD_CURRENCY; + } + else if (amount.holds()) + { + if (amount.native() || amount.mpt() > MPTAmount{maxMPTokenAmount} || + amount <= beast::zero) + return temBAD_AMOUNT; + } + break; + } + case tfSendNFToken: { + break; + } + case tfAuthorizeToken: { + return temDISABLED; + break; + } + } + } + return tesSUCCESS; +} + +TER +preclaimFlagParameters( + ReadView const& view, + AccountID const& sourceAccount, + AccountID const& contractAccount, + STArray const& parameters, + beast::Journal j) +{ + for (auto const& param : parameters) + { + if (!param.isFieldPresent(sfParameterFlag) || + !isValidParameterFlag(param.getFieldU32(sfParameterFlag))) + continue; // Skip invalid flags + + switch (param.getFieldU32(sfParameterFlag)) + { + case tfSendAmount: { + if (!param.isFieldPresent(sfParameterValue)) + return tecINTERNAL; + + auto const& value = param.getFieldData(sfParameterValue); + STAmount amount = value.getFieldAmount(); + // Preclaim Transfer Amount + if (isXRP(amount)) + { + auto const accountSle = view.read(keylet::account(sourceAccount)); + if (!accountSle) + return tecINTERNAL; + + auto const& mSourceBalance = accountSle->getFieldAmount(sfBalance); + if (mSourceBalance < amount.xrp()) + return tecUNFUNDED; + } + else + { + if (auto ter = canTransferFT( + view, + sourceAccount, + contractAccount, + amount, + j, + SendIssuerHandling::ihIGNORE, + SendEscrowHandling::ehIGNORE, + SendAuthHandling::ahBOTH, + SendFreezeHandling::fhBOTH, + SendTransferHandling::thIGNORE, + SendBalanceHandling::bhCHECK)) + { + JLOG(j.trace()) << "preclaimFlagParameters: Cannot " + "transfer amount: " + << amount; + return ter; + } + } + break; + } + case tfSendNFToken: { + if (!param.isFieldPresent(sfParameterValue)) + return tecINTERNAL; + auto const& value = param.getFieldData(sfParameterValue); + auto const& nftokenID = value.getFieldH256(); + // Preclaim Transfer NFT Token + if (!nft::findToken(view, sourceAccount, nftokenID)) + { + JLOG(j.trace()) + << "preclaimFlagParameters: Cannot transfer NFT token: " << nftokenID; + return tecNO_ENTRY; + } + break; + } + case tfAuthorizeToken: { + break; + } + } + } + return tesSUCCESS; +} + +TER +doApplyFlagParameters( + ApplyView& view, + STTx const& tx, + AccountID const& sourceAccount, + AccountID const& contractAccount, + STArray const& parameters, + XRPAmount const& priorBalance, + beast::Journal j) +{ + for (auto const& param : parameters) + { + if (!param.isFieldPresent(sfParameterFlag) || + !isValidParameterFlag(param.getFieldU32(sfParameterFlag))) + continue; // Skip invalid flags + + switch (param.getFieldU32(sfParameterFlag)) + { + case tfSendAmount: { + if (!param.isFieldPresent(sfParameterValue)) + return tecINTERNAL; + + auto const& value = param.getFieldData(sfParameterValue); + STAmount amount = value.getFieldAmount(); + if (auto ter = accountSend( + view, sourceAccount, contractAccount, amount, j, WaiveTransferFee::No); + !isTesSuccess(ter)) + { + JLOG(j.trace()) << "doApplyFlagParameters: Failed to send amount: " << amount; + return ter; + } + break; + } + case tfSendNFToken: { + if (!param.isFieldPresent(sfParameterValue)) + return tecINTERNAL; + auto const& value = param.getFieldData(sfParameterValue); + auto const& nftokenID = value.getFieldH256(); + if (auto ter = + nft::transferNFToken(view, sourceAccount, contractAccount, nftokenID); + !isTesSuccess(ter)) + { + JLOG(j.trace()) + << "doApplyFlagParameters: Failed to send NFT token: " << nftokenID; + return ter; + } + break; + } + case tfAuthorizeToken: { + return tecINTERNAL; + // if (!param.isFieldPresent(sfParameterValue)) + // return tecINTERNAL; + // // Handle tfAuthorizeToken if needed + // auto const& value = param.getFieldData(sfParameterValue); + // STAmount limit = value.getFieldAmount(); + // Asset asset = Asset{limit.issue()}; + // if (auto ter = canAddHolding(view, asset); + // !isTesSuccess(ter)) + // { + // JLOG(j.trace()) << "doApplyFlagParameters: Cannot add " + // "holding for asset: " + // << to_string(asset); + // return ter; + // } + // // Set the issuer to the contract account for the holding + // limit.setIssuer(contractAccount); + // if (auto ter = addEmptyHolding( + // view, contractAccount, priorBalance, asset, limit, + // j); + // !isTesSuccess(ter)) + // { + // JLOG(j.trace()) << "doApplyFlagParameters: Failed to add + // " + // "holding for asset: " + // << to_string(asset); + // return ter; + // } + // break; + } + } + } + return tesSUCCESS; +} + +uint32_t +contractDataReserve(uint32_t size) +{ + // Divide by dataByteMultiplier and round up to the nearest whole number + return (size + dataByteMultiplier - 1U) / dataByteMultiplier; +} + +TER +setContractData( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + AccountID const& contractAccount, + STJson const& data) +{ + auto const j = registry.getJournal("View"); + auto const sleAccount = view.peek(keylet::account(account)); + if (!sleAccount) + return tefINTERNAL; + + // if the blob is too large don't set it + if (data.size() > maxContractDataSize) + return temARRAY_TOO_LARGE; + + auto dataKeylet = keylet::contractData(account, contractAccount); + auto dataSle = view.peek(dataKeylet); + + // DELETE + if (data.size() == 0) + { + if (!dataSle) + return tesSUCCESS; + + uint32_t oldDataReserve = contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); + + std::uint64_t const page = (*dataSle)[sfOwnerNode]; + // Remove the page from the account directory + if (!view.dirRemove(keylet::ownerDir(account), page, dataKeylet.key, false)) + return tefBAD_LEDGER; + + // remove the actual contract data sle + view.erase(dataSle); + + // reduce the owner count + adjustOwnerCount(view, sleAccount, -oldDataReserve, j); + return tesSUCCESS; + } + + std::uint32_t ownerCount{(*sleAccount)[sfOwnerCount]}; + bool createNew = !dataSle; + if (createNew) + { + // CREATE + uint32_t dataReserve = contractDataReserve(data.size()); + uint32_t newReserve = ownerCount + dataReserve; + XRPAmount const newReserveAmount{view.fees().accountReserve(newReserve)}; + if (STAmount((*sleAccount)[sfBalance]).xrp() < newReserveAmount) + return tecINSUFFICIENT_RESERVE; + + adjustOwnerCount(view, sleAccount, dataReserve, j); + // create an entry + dataSle = std::make_shared(dataKeylet); + dataSle->setFieldJson(sfContractJson, data); + dataSle->setAccountID(sfOwner, account); + dataSle->setAccountID(sfContractAccount, contractAccount); + + auto const page = + view.dirInsert(keylet::ownerDir(account), dataKeylet.key, describeOwnerDir(account)); + if (!page) + return tecDIR_FULL; + + dataSle->setFieldU64(sfOwnerNode, *page); + + // add new data to ledger + view.insert(dataSle); + } + else + { + // UPDATE + uint32_t oldDataReserve = contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); + uint32_t newDataReserve = contractDataReserve(data.size()); + if (newDataReserve != oldDataReserve) + { + // if the reserve changes, we need to adjust the owner count + uint32_t newReserve = ownerCount - oldDataReserve + newDataReserve; + XRPAmount const newReserveAmount{view.fees().accountReserve(newReserve)}; + if (STAmount((*sleAccount)[sfBalance]).xrp() < newReserveAmount) + return tecINSUFFICIENT_RESERVE; + + adjustOwnerCount(view, sleAccount, newReserve, j); + } + + // update the data + dataSle->setFieldJson(sfContractJson, data); + view.update(dataSle); + } + return tesSUCCESS; +} + +TER +finalizeContractData( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& contractAccount, + ContractDataMap const& dataMap, + ContractEventMap const& eventMap, + uint256 const& txnID) +{ + auto const& j = registry.getJournal("View"); + uint16_t changeCount = 0; + + for (auto const& [name, data] : eventMap) + registry.getOPs().pubContractEvent(name, data); + + for (auto const& accEntry : dataMap) + { + auto const& acc = accEntry.first; + auto const& cacheEntry = accEntry.second; + bool is_modified = cacheEntry.first; + auto const& jsonData = cacheEntry.second; + if (is_modified) + { + changeCount++; + if (changeCount > maxDataModifications) + { + // overflow + JLOG(j.trace()) << "ContractError[TX:" << txnID + << "]: SetContractData failed: Too many data changes"; + return tecWASM_REJECTED; + } + + TER result = setContractData(registry, view, acc, contractAccount, jsonData); + if (!isTesSuccess(result)) + { + JLOG(j.warn()) << "ContractError[TX:" << txnID + << "]: SetContractData failed: " << result << " Account: " << acc; + return result; + } + } + } + return tesSUCCESS; +} + +} // namespace contract +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/nft/NFTokenUtils.cpp b/src/libxrpl/ledger/helpers/NFTokenUtils.cpp similarity index 94% rename from src/libxrpl/tx/transactors/nft/NFTokenUtils.cpp rename to src/libxrpl/ledger/helpers/NFTokenUtils.cpp index 3368887d940..874c483c3d7 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenUtils.cpp +++ b/src/libxrpl/ledger/helpers/NFTokenUtils.cpp @@ -1,15 +1,16 @@ +#include #include #include #include #include #include +#include #include #include #include #include #include #include -#include #include #include @@ -1106,5 +1107,56 @@ checkTrustlineDeepFrozen( return tesSUCCESS; } +TER +transferNFToken( + ApplyView& view, + AccountID const& buyer, + AccountID const& seller, + uint256 const& nftokenID) +{ + auto tokenAndPage = nft::findTokenAndPage(view, seller, nftokenID); + + if (!tokenAndPage) + return tecINTERNAL; // LCOV_EXCL_LINE + + if (auto const ret = nft::removeToken(view, seller, nftokenID, std::move(tokenAndPage->page)); + !isTesSuccess(ret)) + return ret; + + auto const sleBuyer = view.read(keylet::account(buyer)); + if (!sleBuyer) + return tecINTERNAL; // LCOV_EXCL_LINE + + std::uint32_t const buyerOwnerCountBefore = sleBuyer->getFieldU32(sfOwnerCount); + + auto const insertRet = nft::insertToken(view, buyer, std::move(tokenAndPage->token)); + + // if fixNFTokenReserve is enabled, check if the buyer has sufficient + // reserve to own a new object, if their OwnerCount changed. + // + // There was an issue where the buyer accepts a sell offer, the ledger + // didn't check if the buyer has enough reserve, meaning that buyer can get + // NFTs free of reserve. + if (view.rules().enabled(fixNFTokenReserve)) + { + // To check if there is sufficient reserve, we cannot use mPriorBalance + // because NFT is sold for a price. So we must use the balance after + // the deduction of the potential offer price. A small caveat here is + // that the balance has already deducted the transaction fee, meaning + // that the reserve requirement is a few drops higher. + auto const buyerBalance = sleBuyer->getFieldAmount(sfBalance); + + auto const buyerOwnerCountAfter = sleBuyer->getFieldU32(sfOwnerCount); + if (buyerOwnerCountAfter > buyerOwnerCountBefore) + { + if (auto const reserve = view.fees().accountReserve(buyerOwnerCountAfter); + buyerBalance < reserve) + return tecINSUFFICIENT_RESERVE; + } + } + + return insertRet; +} + } // namespace nft } // namespace xrpl diff --git a/src/libxrpl/protocol/Emitable.cpp b/src/libxrpl/protocol/Emitable.cpp new file mode 100644 index 00000000000..96f00cd47bb --- /dev/null +++ b/src/libxrpl/protocol/Emitable.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include + +namespace xrpl { + +Emitable::Emitable() +{ + emitableTx_ = { +#pragma push_macro("TRANSACTION") +#undef TRANSACTION + +#define TRANSACTION(tag, value, name, delegatable, amendment, permissions, emitable, fields) \ + {value, emitable}, +#include + +#undef TRANSACTION +#pragma pop_macro("TRANSACTION") + }; + + granularEmitableMap_ = { +#pragma push_macro("EMITABLE") +#undef EMITABLE + +#define EMITABLE(type, txType, value) {#type, type}, + +#include + +#undef EMITABLE +#pragma pop_macro("EMITABLE") + }; + + granularNameMap_ = { +#pragma push_macro("EMITABLE") +#undef EMITABLE + +#define EMITABLE(type, txType, value) {type, #type}, + +#include + +#undef EMITABLE +#pragma pop_macro("EMITABLE") + }; + + granularTxTypeMap_ = { +#pragma push_macro("EMITABLE") +#undef EMITABLE + +#define EMITABLE(type, txType, value) {type, txType}, + +#include + +#undef EMITABLE +#pragma pop_macro("EMITABLE") + }; + + for ([[maybe_unused]] auto const& emitable : granularEmitableMap_) + XRPL_ASSERT( + emitable.second > UINT16_MAX, + "xrpl::Emitable::granularEmitableMap_ : granular emitable " + "value must not exceed the maximum uint16_t value."); +} + +Emitable const& +Emitable::getInstance() +{ + static Emitable const instance; + return instance; +} + +std::optional +Emitable::getEmitableName(std::uint32_t const value) const +{ + auto const emitableValue = static_cast(value); + if (auto const granular = getGranularName(emitableValue)) + return *granular; + + // not a granular emitable, check if it maps to a transaction type + auto const txType = emitableToTxType(value); + if (auto const* item = TxFormats::getInstance().findByType(txType); item != nullptr) + return item->getName(); + + return std::nullopt; +} + +std::optional +Emitable::getGranularValue(std::string const& name) const +{ + auto const it = granularEmitableMap_.find(name); + if (it != granularEmitableMap_.end()) + return static_cast(it->second); + + return std::nullopt; +} + +std::optional +Emitable::getGranularName(GranularEmitableType const& value) const +{ + auto const it = granularNameMap_.find(value); + if (it != granularNameMap_.end()) + return it->second; + + return std::nullopt; +} + +std::optional +Emitable::getGranularTxType(GranularEmitableType const& gpType) const +{ + auto const it = granularTxTypeMap_.find(gpType); + if (it != granularTxTypeMap_.end()) + return it->second; + + return std::nullopt; +} + +bool +Emitable::isEmitable(std::uint32_t const& emitableValue) const +{ + auto const granularEmitable = getGranularName(static_cast(emitableValue)); + if (granularEmitable) + // granular emitables are always allowed to be delegated + return true; + + auto const txType = emitableToTxType(emitableValue); + auto const it = emitableTx_.find(txType); + + // if (rules.enabled(fixDelegateV1_1)) + // { + // if (it == delegatableTx_.end()) + // return false; + + // auto const txFeaturesIt = txFeatureMap_.find(txType); + // XRPL_ASSERT( + // txFeaturesIt != txFeatureMap_.end(), + // "xrpl::Emitables::isDelegatable : tx exists in txFeatureMap_"); + + // // fixDelegateV1_1: Delegation is only allowed if the required + // amendment + // // for the transaction is enabled. For transactions that do not + // require + // // an amendment, delegation is always allowed. + // if (txFeaturesIt->second != uint256{} && + // !rules.enabled(txFeaturesIt->second)) + // return false; + // } + + if (it != emitableTx_.end() && it->second == Emittance::notEmitable) + return false; + + return true; +} + +uint32_t +Emitable::txToEmitableType(TxType const& type) const +{ + return static_cast(type) + 1; +} + +TxType +Emitable::emitableToTxType(uint32_t const& value) const +{ + return static_cast(value - 1); +} + +} // namespace xrpl diff --git a/src/libxrpl/protocol/Indexes.cpp b/src/libxrpl/protocol/Indexes.cpp index 61a64b2a544..620d3514823 100644 --- a/src/libxrpl/protocol/Indexes.cpp +++ b/src/libxrpl/protocol/Indexes.cpp @@ -79,10 +79,12 @@ enum class LedgerNameSpace : std::uint16_t { VAULT = 'V', LOAN_BROKER = 'l', // lower-case L LOAN = 'L', + CONTRACT_SOURCE = 'Z', + CONTRACT = 'z', + CONTRACT_DATA = 'b', // No longer used or supported. Left here to reserve the space // to avoid accidental reuse. - CONTRACT [[deprecated]] = 'c', GENERATOR [[deprecated]] = 'g', NICKNAME [[deprecated]] = 'n', }; @@ -530,6 +532,24 @@ permissionedDomain(uint256 const& domainID) noexcept return {ltPERMISSIONED_DOMAIN, domainID}; } +Keylet +contractSource(uint256 const& contractHash) noexcept +{ + return {ltCONTRACT_SOURCE, indexHash(LedgerNameSpace::CONTRACT_SOURCE, contractHash)}; +} + +Keylet +contract(uint256 const& contractHash, AccountID const& owner, std::uint32_t seq) noexcept +{ + return {ltCONTRACT, indexHash(LedgerNameSpace::CONTRACT, contractHash, owner, seq)}; +} + +Keylet +contractData(AccountID const& owner, AccountID const& contractAccount) noexcept +{ + return {ltCONTRACT_DATA, indexHash(LedgerNameSpace::CONTRACT_DATA, owner, contractAccount)}; +} + } // namespace keylet } // namespace xrpl diff --git a/src/libxrpl/protocol/InnerObjectFormats.cpp b/src/libxrpl/protocol/InnerObjectFormats.cpp index 8429c51aea3..c7c658d2472 100644 --- a/src/libxrpl/protocol/InnerObjectFormats.cpp +++ b/src/libxrpl/protocol/InnerObjectFormats.cpp @@ -159,6 +159,35 @@ InnerObjectFormats::InnerObjectFormats() {sfTxnSignature, soeOPTIONAL}, {sfSigners, soeOPTIONAL}, }); + + add(sfFunction.jsonName.c_str(), + sfFunction.getCode(), + { + {sfFunctionName, soeREQUIRED}, + {sfParameters, soeOPTIONAL}, + }); + + add(sfInstanceParameter.jsonName, + sfInstanceParameter.getCode(), + { + {sfParameterFlag, soeREQUIRED}, + {sfParameterType, soeREQUIRED}, + }); + + add(sfInstanceParameterValue.jsonName, + sfInstanceParameterValue.getCode(), + { + {sfParameterFlag, soeREQUIRED}, + {sfParameterValue, soeREQUIRED}, + }); + + add(sfParameter.jsonName, + sfParameter.getCode(), + { + {sfParameterFlag, soeOPTIONAL}, + {sfParameterType, soeOPTIONAL}, + {sfParameterValue, soeOPTIONAL}, + }); } InnerObjectFormats const& diff --git a/src/libxrpl/protocol/STData.cpp b/src/libxrpl/protocol/STData.cpp new file mode 100644 index 00000000000..24e165e3cae --- /dev/null +++ b/src/libxrpl/protocol/STData.cpp @@ -0,0 +1,968 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl { + +template +constexpr std::enable_if_t::value && std::is_signed::value, U> +to_unsigned(S value) +{ + if (value < 0 || std::numeric_limits::max() < value) + Throw("Value out of range"); + return static_cast(value); +} + +template +constexpr std::enable_if_t::value && std::is_unsigned::value, U1> +to_unsigned(U2 value) +{ + if (std::numeric_limits::max() < value) + Throw("Value out of range"); + return static_cast(value); +} + +// TODO +STData::STData(SField const& n) : STBase(n), inner_type_(STI_NOTPRESENT), data_(STBase{}) +{ +} + +STData::STData(SField const& n, unsigned char v) + : STBase(n) + , inner_type_(STI_UINT8) + , data_(detail::STVar(detail::defaultObject, sfCloseResolution)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, std::uint16_t v) + : STBase(n) + , inner_type_(STI_UINT16) + , data_(detail::STVar(detail::defaultObject, sfSignerWeight)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, std::uint32_t v) + : STBase(n), inner_type_(STI_UINT32), data_(detail::STVar(detail::defaultObject, sfNetworkID)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, std::uint64_t v) + : STBase(n), inner_type_(STI_UINT64), data_(detail::STVar(detail::defaultObject, sfIndexNext)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, uint128 const& v) + : STBase(n), inner_type_(STI_UINT128), data_(detail::STVar(detail::defaultObject, sfEmailHash)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, uint160 const& v) + : STBase(n) + , inner_type_(STI_UINT160) + , data_(detail::STVar(detail::defaultObject, sfTakerPaysCurrency)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, uint192 const& v) + : STBase(n) + , inner_type_(STI_UINT192) + , data_(detail::STVar(detail::defaultObject, sfMPTokenIssuanceID)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, uint256 const& v) + : STBase(n), inner_type_(STI_UINT256), data_(detail::STVar(detail::defaultObject, sfLedgerHash)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, Blob const& v) + : STBase(n), inner_type_(STI_VL), data_(detail::STVar(detail::defaultObject, sfURI)) +{ + setFieldUsingSetValue(Buffer(v.data(), v.size())); +} + +STData::STData(SField const& n, Slice const& v) + : STBase(n), inner_type_(STI_VL), data_(detail::STVar(detail::defaultObject, sfURI)) +{ + setFieldUsingSetValue(Buffer(v.data(), v.size())); +} + +STData::STData(SField const& n, STAmount const& v) + : STBase(n), inner_type_(STI_AMOUNT), data_(detail::STVar(detail::defaultObject, sfAmount)) +{ + setFieldUsingAssignment(v); +} + +STData::STData(SField const& n, AccountID const& v) + : STBase(n), inner_type_(STI_ACCOUNT), data_(detail::STVar(detail::defaultObject, sfAccount)) +{ + setFieldUsingSetValue(v); +} + +STData::STData(SField const& n, STIssue const& v) + : STBase(n), inner_type_(STI_ISSUE), data_(detail::STVar(detail::defaultObject, sfAsset)) +{ + setFieldUsingAssignment(v); +} + +STData::STData(SField const& n, STCurrency const& v) + : STBase(n), inner_type_(STI_CURRENCY), data_(detail::STVar(detail::defaultObject, sfBaseAsset)) +{ + setFieldUsingAssignment(v); +} + +STData::STData(SField const& n, STNumber const& v) + : STBase(n), inner_type_(STI_NUMBER), data_(detail::STVar(detail::defaultObject, sfNumber)) +{ + setFieldUsingAssignment(v); +} + +STData::STData(SerialIter& sit, SField const& name) : STBase(name), data_(STBase{}) +{ + std::uint16_t stype = SerializedTypeID(sit.get16()); + inner_type_ = stype; + SerializedTypeID s = static_cast(stype); + switch (s) + { + case STI_UINT8: { + data_ = detail::STVar(sit, sfCloseResolution); + break; + } + case STI_UINT16: { + data_ = detail::STVar(sit, sfSignerWeight); + break; + } + case STI_UINT32: { + data_ = detail::STVar(sit, sfNetworkID); + break; + } + case STI_UINT64: { + data_ = detail::STVar(sit, sfIndexNext); + break; + } + case STI_UINT128: { + data_ = detail::STVar(sit, sfEmailHash); + break; + } + case STI_UINT160: { + data_ = detail::STVar(sit, sfTakerPaysCurrency); + break; + } + case STI_UINT192: { + data_ = detail::STVar(sit, sfMPTokenIssuanceID); + break; + } + case STI_UINT256: { + data_ = detail::STVar(sit, sfLedgerHash); + break; + } + case STI_VL: { + data_ = detail::STVar(sit, sfURI); + break; + } + case STI_AMOUNT: { + data_ = detail::STVar(sit, sfAmount); + break; + } + case STI_ACCOUNT: { + data_ = detail::STVar(sit, sfAccount); + break; + } + case STI_ISSUE: { + data_ = detail::STVar(sit, sfAsset); + break; + } + case STI_CURRENCY: { + data_ = detail::STVar(sit, sfBaseAsset); + break; + } + case STI_NUMBER: { + data_ = detail::STVar(sit, sfNumber); + break; + } + default: + Throw("STData: unknown type"); + } +} + +STBase* +STData::copy(std::size_t n, void* buf) const +{ + return emplace(n, buf, *this); +} + +STBase* +STData::move(std::size_t n, void* buf) +{ + return emplace(n, buf, std::move(*this)); +} + +std::size_t +STData::size() const +{ + switch (static_cast(inner_type_)) + { + case STI_UINT8: { + return sizeof(uint8_t); + } + case STI_UINT16: { + return sizeof(uint16_t); + } + case STI_UINT32: { + return sizeof(uint32_t); + } + case STI_UINT64: { + return sizeof(uint64_t); + } + case STI_UINT128: { + return uint128::size(); + } + case STI_UINT160: { + return uint160::size(); + } + case STI_UINT192: { + return uint192::size(); + } + case STI_UINT256: { + return uint256::size(); + } + case STI_VL: { + STBlob const& st_blob = data_.get().downcast(); + return st_blob.size(); + } + case STI_AMOUNT: { + // TODO: STAmount::size() + STAmount const& st_amt = data_.get().downcast(); + return st_amt.native() ? 8 : 48; + } + case STI_ACCOUNT: { + return uint160::size(); + } + case STI_ISSUE: { + // const STIssue& st_issue = data_.get().downcast(); + return 40; // 20 bytes for currency + 20 bytes for account + } + case STI_CURRENCY: { + // const STCurrency& st_currency = + // data_.get().downcast(); + return 20; // 20 bytes for currency + } + case STI_NUMBER: { + return sizeof(double); + } + default: + Throw("STData: unknown type"); + } +} + +SerializedTypeID +STData::getSType() const +{ + return STI_DATA; +} + +void +STData::add(Serializer& s) const +{ + s.add16(inner_type_); + + switch (static_cast(inner_type_)) + { + case STI_UINT8: { + STUInt8 const& st_uint8 = data_.get().downcast(); + st_uint8.add(s); + break; + } + case STI_UINT16: { + STUInt16 const& st_uint16 = data_.get().downcast(); + st_uint16.add(s); + break; + } + case STI_UINT32: { + STUInt32 const& st_uint32 = data_.get().downcast(); + st_uint32.add(s); + break; + } + case STI_UINT64: { + STUInt64 const& st_uint64 = data_.get().downcast(); + st_uint64.add(s); + break; + } + case STI_UINT128: { + STUInt128 const& st_uint128 = data_.get().downcast(); + st_uint128.add(s); + break; + } + case STI_UINT160: { + STUInt160 const& st_uint160 = data_.get().downcast(); + st_uint160.add(s); + break; + } + case STI_UINT192: { + STUInt192 const& st_uint192 = data_.get().downcast(); + st_uint192.add(s); + break; + } + case STI_UINT256: { + STUInt256 const& st_uint256 = data_.get().downcast(); + st_uint256.add(s); + break; + } + case STI_VL: { + STBlob const& st_blob = data_.get().downcast(); + st_blob.add(s); + break; + } + case STI_AMOUNT: { + STAmount const& st_amt = data_.get().downcast(); + st_amt.add(s); + break; + } + case STI_ACCOUNT: { + STAccount const& st_acc = data_.get().downcast(); + st_acc.add(s); + break; + } + case STI_ISSUE: { + STIssue const& st_issue = data_.get().downcast(); + st_issue.add(s); + break; + } + case STI_CURRENCY: { + STCurrency const& st_currency = data_.get().downcast(); + st_currency.add(s); + break; + } + case STI_NUMBER: { + STNumber const& st_number = data_.get().downcast(); + st_number.add(s); + break; + } + default: + Throw("STData: unknown type"); + } +} + +bool +STData::isEquivalent(STBase const& t) const +{ + auto const* const tPtr = dynamic_cast(&t); + return tPtr && (default_ == tPtr->default_) && (inner_type_ == tPtr->inner_type_) && + (data_ == tPtr->data_); +} + +bool +STData::isDefault() const +{ + return default_; +} + +std::string +STData::getInnerTypeString() const +{ + std::string inner_type_str = "Unknown"; + switch (static_cast(inner_type_)) + { + case STI_UINT8: + inner_type_str = "UINT8"; + break; + case STI_UINT16: + inner_type_str = "UINT16"; + break; + case STI_UINT32: + inner_type_str = "UINT32"; + break; + case STI_UINT64: + inner_type_str = "UINT64"; + break; + case STI_UINT128: + inner_type_str = "UINT128"; + break; + case STI_UINT160: + inner_type_str = "UINT160"; + break; + case STI_UINT192: + inner_type_str = "UINT192"; + break; + case STI_UINT256: + inner_type_str = "UINT256"; + break; + case STI_VL: + inner_type_str = "VL"; + break; + case STI_AMOUNT: + inner_type_str = "AMOUNT"; + break; + case STI_ACCOUNT: + inner_type_str = "ACCOUNT"; + break; + case STI_ISSUE: + inner_type_str = "ISSUE"; + break; + case STI_CURRENCY: + inner_type_str = "CURRENCY"; + break; + case STI_NUMBER: + inner_type_str = "NUMBER"; + break; + // Add other known types as needed + default: + inner_type_str = std::to_string(inner_type_); + } + + return inner_type_str; +} + +std::string +STData::getText() const +{ + std::string inner_type_str = getInnerTypeString(); + return "STData{InnerType: " + inner_type_str + ", Data: " + data_.get().getText() + "}"; +} + +Json::Value +STData::getJson(JsonOptions options) const +{ + Json::Value ret(Json::objectValue); + ret[jss::type] = getInnerTypeString(); + ret[jss::value] = data_.get().getJson(options); + return ret; +} + +STBase* +STData::makeFieldPresent() +{ + STBase* f = &data_.get(); // getPIndex(index); + + if (f->getSType() != STI_NOTPRESENT) + return f; + + data_ = detail::STVar(detail::nonPresentObject, f->getFName()); + return &data_.get(); +} + +void +STData::setFieldU8(unsigned char v) +{ + inner_type_ = STI_UINT8; + data_ = detail::STVar(detail::defaultObject, sfCloseResolution); + setFieldUsingSetValue(v); +} + +void +STData::setFieldU16(std::uint16_t v) +{ + inner_type_ = STI_UINT16; + data_ = detail::STVar(detail::defaultObject, sfSignerWeight); + setFieldUsingSetValue(v); +} + +void +STData::setFieldU32(std::uint32_t v) +{ + inner_type_ = STI_UINT32; + data_ = detail::STVar(detail::defaultObject, sfNetworkID); + setFieldUsingSetValue(v); +} + +void +STData::setFieldU64(std::uint64_t v) +{ + inner_type_ = STI_UINT64; + data_ = detail::STVar(detail::defaultObject, sfIndexNext); + setFieldUsingSetValue(v); +} + +void +STData::setFieldH128(uint128 const& v) +{ + inner_type_ = STI_UINT128; + data_ = detail::STVar(detail::defaultObject, sfEmailHash); + setFieldUsingSetValue(v); +} + +void +STData::setFieldH160(uint160 const& v) +{ + inner_type_ = STI_UINT160; + data_ = detail::STVar(detail::defaultObject, sfTakerPaysCurrency); + setFieldUsingSetValue(v); +} + +void +STData::setFieldH192(uint192 const& v) +{ + inner_type_ = STI_UINT192; + data_ = detail::STVar(detail::defaultObject, sfMPTokenIssuanceID); + setFieldUsingSetValue(v); +} + +void +STData::setFieldH256(uint256 const& v) +{ + inner_type_ = STI_UINT256; + data_ = detail::STVar(detail::defaultObject, sfLedgerHash); + setFieldUsingSetValue(v); +} + +void +STData::setFieldVL(Blob const& v) +{ + inner_type_ = STI_VL; + data_ = detail::STVar(detail::defaultObject, sfData); + setFieldUsingSetValue(Buffer(v.data(), v.size())); +} + +void +STData::setFieldVL(Slice const& s) +{ + inner_type_ = STI_VL; + data_ = detail::STVar(detail::defaultObject, sfData); + setFieldUsingSetValue(Buffer(s.data(), s.size())); +} + +void +STData::setAccountID(AccountID const& v) +{ + inner_type_ = STI_ACCOUNT; + data_ = detail::STVar(detail::defaultObject, sfAccount); + setFieldUsingSetValue(v); +} + +void +STData::setFieldAmount(STAmount const& v) +{ + inner_type_ = STI_AMOUNT; + data_ = detail::STVar(detail::defaultObject, sfAmount); + setFieldUsingAssignment(v); +} + +void +STData::setIssue(STIssue const& v) +{ + inner_type_ = STI_ISSUE; + data_ = detail::STVar(detail::defaultObject, sfAsset); + setFieldUsingAssignment(v); +} + +void +STData::setCurrency(STCurrency const& v) +{ + inner_type_ = STI_CURRENCY; + data_ = detail::STVar(detail::defaultObject, sfBaseAsset); + setFieldUsingAssignment(v); +} + +void +STData::setFieldNumber(STNumber const& v) +{ + inner_type_ = STI_NUMBER; + data_ = detail::STVar(detail::defaultObject, sfNumber); + setFieldUsingAssignment(v); +} + +unsigned char +STData::getFieldU8() const +{ + return getFieldByValue(); +} + +std::uint16_t +STData::getFieldU16() const +{ + return getFieldByValue(); +} + +std::uint32_t +STData::getFieldU32() const +{ + return getFieldByValue(); +} + +std::uint64_t +STData::getFieldU64() const +{ + return getFieldByValue(); +} + +uint128 +STData::getFieldH128() const +{ + return getFieldByValue(); +} + +uint160 +STData::getFieldH160() const +{ + return getFieldByValue(); +} + +uint192 +STData::getFieldH192() const +{ + return getFieldByValue(); +} + +uint256 +STData::getFieldH256() const +{ + return getFieldByValue(); +} + +Blob +STData::getFieldVL() const +{ + STBlob empty; + STBlob const& b = getFieldByConstRef(empty); + return Blob(b.data(), b.data() + b.size()); +} + +AccountID +STData::getAccountID() const +{ + return getFieldByValue(); +} + +STAmount const& +STData::getFieldAmount() const +{ + static STAmount const empty{}; + return getFieldByConstRef(empty); +} + +STIssue +STData::getFieldIssue() const +{ + static STIssue const empty{}; + return getFieldByConstRef(empty); +} + +STCurrency +STData::getFieldCurrency() const +{ + static STCurrency const empty{}; + return getFieldByConstRef(empty); +} + +STNumber +STData::getFieldNumber() const +{ + static STNumber const empty{}; + return getFieldByConstRef(empty); +} + +STData +dataFromJson(SField const& field, Json::Value const& v) +{ + Json::Value type; + Json::Value value; + + if (!v.isObject()) + Throw("STData: expected object"); + + type = v[jss::type]; + value = v[jss::value]; + + if (type.isNull()) + Throw("STData: type is null"); + if (value.isNull()) + Throw("STData: value is null"); + + auto typeStr = type.asString(); + + if (typeStr == "UINT8") + { + STData data(field, static_cast(value.asUInt())); + return data; + } + else if (typeStr == "UINT16") + { + STData data(field, static_cast(value.asUInt())); + return data; + } + else if (typeStr == "UINT32") + { + try + { + if (value.isString()) + { + STData data(field, beast::lexicalCastThrow(value.asString())); + return data; + } + else if (value.isInt()) + { + STData data(field, to_unsigned(value.asInt())); + return data; + } + else if (value.isUInt()) + { + STData data(field, safe_cast(value.asUInt())); + return data; + } + else + { + Throw("bad type for UINT32"); + } + } + catch (std::exception const&) + { + Throw("invalid data for UINT32"); + } + } + else if (typeStr == "UINT64") + { + try + { + if (value.isString()) + { + auto const str = value.asString(); + + std::uint64_t val; + + bool const useBase10 = field.shouldMeta(SField::sMD_BaseTen); + + // if the field is amount, serialize as base 10 + auto [p, ec] = + std::from_chars(str.data(), str.data() + str.size(), val, useBase10 ? 10 : 16); + + if (ec != std::errc() || (p != str.data() + str.size())) + Throw("STData: invalid UINT64 data"); + + STData data(field, val); + return data; + } + else if (value.isInt()) + { + STData data(field, to_unsigned(value.asInt())); + return data; + } + else if (value.isUInt()) + { + STData data(field, safe_cast(value.asUInt())); + return data; + } + else + { + Throw("STData: bad type for UINT64"); + } + } + catch (std::exception const&) + { + Throw("STData: invalid data for UINT64"); + } + } + else if (typeStr == "UINT128") + { + if (!value.isString()) + { + Throw("STData: expected string for UINT128"); + } + + uint128 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + Throw("STData: invalid UINT128 data"); + } + + num.zero(); + } + + STData data(field, num); + return data; + } + else if (typeStr == "UINT192") + { + if (!value.isString()) + { + Throw("STData: expected string for UINT192"); + } + + uint192 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + Throw("STData: invalid UINT192 data"); + } + + num.zero(); + } + + STData data(field, num); + return data; + } + else if (typeStr == "UINT160") + { + if (!value.isString()) + { + Throw("STData: expected string for UINT160"); + } + + uint160 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + Throw("STData: invalid UINT160 data"); + } + + num.zero(); + } + + STData data(field, num); + return data; + } + else if (typeStr == "UINT256") + { + if (!value.isString()) + { + Throw("STData: expected string for UINT256"); + } + + uint256 num; + + if (auto const s = value.asString(); !num.parseHex(s)) + { + if (!s.empty()) + { + Throw("STData: invalid UINT256 data"); + } + + num.zero(); + } + STData data(field, num); + return data; + } + else if (typeStr == "VL") + { + if (!value.isString()) + { + Throw("STData: expected string for VL"); + } + + try + { + if (auto vBlob = strUnHex(value.asString())) + { + STData data(field, *vBlob); + return data; + } + else + { + Throw("invalid data"); + } + } + catch (std::exception const&) + { + Throw("STData: invalid data"); + } + } + else if (typeStr == "AMOUNT") + { + try + { + STData data(field, amountFromJson(field, value)); + return data; + } + catch (std::exception const&) + { + Throw("STData: invalid data for AMOUNT"); + } + } + else if (typeStr == "ACCOUNT") + { + if (!value.isString()) + { + Throw("STData: expected string for ACCOUNT"); + } + + std::string const strValue = value.asString(); + + try + { + if (AccountID account; account.parseHex(strValue)) + { + STData data(field, account); + return data; + } + + if (auto result = parseBase58(strValue)) + { + STData data(field, *result); + return data; + } + + Throw("STData: invalid data for ACCOUNT"); + } + catch (std::exception const&) + { + Throw("STData: invalid data for ACCOUNT"); + } + } + else if (typeStr == "ISSUE") + { + try + { + STData data(field, issueFromJson(field, value)); + return data; + } + catch (std::exception const&) + { + Throw("STData: invalid data for ISSUE"); + } + } + else if (typeStr == "CURRENCY") + { + try + { + STData data(field, currencyFromJson(field, value)); + return data; + } + catch (std::exception const&) + { + Throw("STData: invalid data for CURRENCY"); + } + } + else if (typeStr == "NUMBER") + { + if (!value.isString()) + { + Throw("STData: expected string for NUMBER"); + } + + STNumber number = numberFromJson(field, value); + STData data(field, number); + return data; + } + + // Handle unknown or unsupported type + Throw("STData: unsupported type string: " + typeStr); +} + +} // namespace xrpl diff --git a/src/libxrpl/protocol/STDataType.cpp b/src/libxrpl/protocol/STDataType.cpp new file mode 100644 index 00000000000..19f0afb91e7 --- /dev/null +++ b/src/libxrpl/protocol/STDataType.cpp @@ -0,0 +1,253 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace xrpl { + +// TODO +STDataType::STDataType(SField const& n) : STBase(n), inner_type_(STI_NOTPRESENT) +{ +} + +STDataType::STDataType(SField const& n, SerializedTypeID v) + : STBase(n), inner_type_(v), default_(false) +{ +} + +STDataType::STDataType(SerialIter& sit, SField const& name) + : STBase(name), inner_type_(STI_DATA), default_(false) +{ + std::uint16_t stype = SerializedTypeID(sit.get16()); + inner_type_ = stype; +} + +STBase* +STDataType::copy(std::size_t n, void* buf) const +{ + return emplace(n, buf, *this); +} + +STBase* +STDataType::move(std::size_t n, void* buf) +{ + return emplace(n, buf, std::move(*this)); +} + +SerializedTypeID +STDataType::getSType() const +{ + return STI_DATATYPE; +} + +void +STDataType::setInnerSType(SerializedTypeID v) +{ + inner_type_ = v; +} + +void +STDataType::add(Serializer& s) const +{ + s.add16(inner_type_); +} + +bool +STDataType::isEquivalent(STBase const& t) const +{ + auto const* const tPtr = dynamic_cast(&t); + return tPtr && (default_ == tPtr->default_) && (inner_type_ == tPtr->inner_type_); +} + +bool +STDataType::isDefault() const +{ + return default_; +} + +std::string +STDataType::getInnerTypeString() const +{ + std::string inner_type_str = "Unknown"; + // Optionally, convert inner_type_ to its string representation if mappings + // exist + switch (static_cast(inner_type_)) + { + case STI_UINT8: + inner_type_str = "UINT8"; + break; + case STI_UINT16: + inner_type_str = "UINT16"; + break; + case STI_UINT32: + inner_type_str = "UINT32"; + break; + case STI_UINT64: + inner_type_str = "UINT64"; + break; + case STI_UINT128: + inner_type_str = "UINT128"; + break; + case STI_UINT160: + inner_type_str = "UINT160"; + break; + case STI_UINT192: + inner_type_str = "UINT192"; + break; + case STI_UINT256: + inner_type_str = "UINT256"; + break; + case STI_VL: + inner_type_str = "VL"; + break; + case STI_ACCOUNT: + inner_type_str = "ACCOUNT"; + break; + case STI_AMOUNT: + inner_type_str = "AMOUNT"; + break; + case STI_ISSUE: + inner_type_str = "ISSUE"; + break; + case STI_CURRENCY: + inner_type_str = "CURRENCY"; + break; + case STI_NUMBER: + inner_type_str = "NUMBER"; + break; + // Add other known types as needed + default: + inner_type_str = std::to_string(inner_type_); + } + + return inner_type_str; +} + +std::string +STDataType::getText() const +{ + std::string inner_type_str = getInnerTypeString(); + return "STDataType{InnerType: " + inner_type_str + "}"; +} + +Json::Value +STDataType::getJson(JsonOptions) const +{ + Json::Value ret(Json::objectValue); + ret[jss::type] = getInnerTypeString(); + return ret; +} + +STDataType +dataTypeFromJson(SField const& field, Json::Value const& v) +{ + SerializedTypeID typeId = STI_NOTPRESENT; + Json::Value type; + Json::Value value; + + if (!v.isObject()) + { + Throw("STData: expected object"); + } + + type = v[jss::type]; + auto typeStr = type.asString(); + + if (typeStr == "UINT8") + { + typeId = STI_UINT8; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT16") + { + typeId = STI_UINT16; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT32") + { + typeId = STI_UINT32; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT64") + { + typeId = STI_UINT64; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT128") + { + typeId = STI_UINT128; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT160") + { + typeId = STI_UINT160; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT192") + { + typeId = STI_UINT192; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "UINT256") + { + typeId = STI_UINT256; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "VL") + { + typeId = STI_VL; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "ACCOUNT") + { + typeId = STI_ACCOUNT; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "AMOUNT") + { + typeId = STI_AMOUNT; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "ISSUE") + { + typeId = STI_ISSUE; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "CURRENCY") + { + typeId = STI_CURRENCY; + STDataType data(field, typeId); + return data; + } + else if (typeStr == "NUMBER") + { + typeId = STI_NUMBER; + STDataType data(field, typeId); + return data; + } + + // Handle unknown or unsupported type + Throw("STData: unsupported type string: " + typeStr); +} + +} // namespace xrpl diff --git a/src/libxrpl/protocol/STJson.cpp b/src/libxrpl/protocol/STJson.cpp new file mode 100644 index 00000000000..37f214ea961 --- /dev/null +++ b/src/libxrpl/protocol/STJson.cpp @@ -0,0 +1,758 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace xrpl { + +STJson::STJson(SField const& name) : STBase{name}, data_{Map{}} +{ +} + +STJson::STJson(SerialIter& sit, SField const& name) : STBase{name} +{ + if (sit.empty()) + { + data_ = Map{}; + return; + } + + int length = sit.getVLDataLength(); + if (length < 0) + Throw("Invalid STJson length"); + + if (length == 0) + { + data_ = Map{}; + return; + } + + // Read type byte + auto typeByte = sit.get8(); + JsonType type = static_cast(typeByte); + length--; // Account for type byte + + int initialBytesLeft = sit.getBytesLeft(); + + if (type == JsonType::Array) + { + Array array; + while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) + { + auto valueVL = sit.getVL(); + if (!valueVL.empty()) + { + SerialIter valueSit(valueVL.data(), valueVL.size()); + auto value = makeValueFromVLWithType(valueSit); + array.push_back(std::move(value)); + } + else + { + array.push_back(nullptr); + } + } + data_ = std::move(array); + } + else // JsonType::Object + { + Map map; + while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) + { + auto [key, value] = parsePair(sit); + map.emplace(std::move(key), std::move(value)); + } + data_ = std::move(map); + } + + int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + if (consumedBytes != length) + Throw("STJson length mismatch"); +} + +STJson::STJson(Map&& map) : data_(std::move(map)) +{ +} + +STJson::STJson(Array&& array) : data_(std::move(array)) +{ +} + +SerializedTypeID +STJson::getSType() const +{ + return STI_JSON; +} + +bool +STJson::isArray() const +{ + return std::holds_alternative(data_); +} + +bool +STJson::isObject() const +{ + return std::holds_alternative(data_); +} + +STJson::JsonType +STJson::getType() const +{ + return isArray() ? JsonType::Array : JsonType::Object; +} + +int +STJson::getDepth() const +{ + if (isArray()) + { + auto const& array = std::get(data_); + for (auto const& value : array) + { + if (value) + { + auto nested = std::dynamic_pointer_cast(value); + if (nested) + return 1 + nested->getDepth(); + } + } + return 0; + } + else // isObject() + { + auto const& map = std::get(data_); + for (auto const& [key, value] : map) + { + if (value) + { + auto nested = std::dynamic_pointer_cast(value); + if (nested) + return 1 + nested->getDepth(); + } + } + return 0; + } +} + +void +STJson::validateDepth(Value const& value, int currentDepth) const +{ + if (!value) + return; + + auto nested = std::dynamic_pointer_cast(value); + if (!nested) + return; + + int valueDepth = nested->getDepth(); + if (currentDepth + valueDepth > 1) + Throw("STJson nesting depth exceeds maximum of 1"); +} + +void +STJson::setObjectField(Key const& key, Value const& value) +{ + if (!isObject()) + Throw("STJson::setObjectField called on non-object"); + validateDepth(value, 0); + std::get(data_)[key] = value; +} + +std::shared_ptr +STJson::fromBlob(void const* data, std::size_t size) +{ + SerialIter sit(static_cast(data), size); + return fromSerialIter(sit); +} + +std::shared_ptr +STJson::fromSerialIter(SerialIter& sit) +{ + if (sit.empty()) + return nullptr; + + int length = sit.getVLDataLength(); + if (length < 0) + Throw("Invalid STJson length"); + + if (length == 0) + return std::make_shared(Map{}); + + // Read type byte + auto typeByte = sit.get8(); + JsonType type = static_cast(typeByte); + length--; // Account for type byte + + int initialBytesLeft = sit.getBytesLeft(); + + if (type == JsonType::Array) + { + Array array; + while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) + { + auto valueVL = sit.getVL(); + if (!valueVL.empty()) + { + SerialIter valueSit(valueVL.data(), valueVL.size()); + auto value = makeValueFromVLWithType(valueSit); + array.push_back(std::move(value)); + } + else + { + array.push_back(nullptr); + } + } + + int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + if (consumedBytes != length) + Throw("STJson length mismatch"); + + return std::make_shared(std::move(array)); + } + else // JsonType::Object + { + Map map; + while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) + { + auto [key, value] = parsePair(sit); + map.emplace(std::move(key), std::move(value)); + } + + int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + if (consumedBytes != length) + Throw("STJson length mismatch"); + + return std::make_shared(std::move(map)); + } +} + +std::pair +STJson::parsePair(SerialIter& sit) +{ + auto keyBlob = sit.getVL(); + std::string key(reinterpret_cast(keyBlob.data()), keyBlob.size()); + auto valueVL = sit.getVL(); + if (valueVL.empty()) + return {std::move(key), nullptr}; + + SerialIter valueSit(valueVL.data(), valueVL.size()); + auto value = makeValueFromVLWithType(valueSit); + + return {std::move(key), std::move(value)}; +} + +STJson::Array +STJson::parseArray(SerialIter& sit, int length) +{ + Array array; + int initialBytesLeft = sit.getBytesLeft(); + + while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) + { + auto valueVL = sit.getVL(); + if (!valueVL.empty()) + { + SerialIter valueSit(valueVL.data(), valueVL.size()); + auto value = makeValueFromVLWithType(valueSit); + array.push_back(std::move(value)); + } + else + { + array.push_back(nullptr); + } + } + + return array; +} + +STJson::Value +STJson::makeValueFromVLWithType(SerialIter& sit) +{ + if (sit.getBytesLeft() == 0) + return nullptr; + + // Read SType marker (1 byte) + auto typeCode = sit.get8(); + SerializedTypeID stype = static_cast(typeCode); + + // Dispatch to correct SType + switch (stype) + { + case STI_UINT8: + return std::make_shared(sfCloseResolution, sit.get8()); + case STI_UINT16: + return std::make_shared(sfSignerWeight, sit.get16()); + case STI_UINT32: + return std::make_shared(sfNetworkID, sit.get32()); + case STI_UINT64: + return std::make_shared(sfIndexNext, sit.get64()); + case STI_UINT128: + return std::make_shared(sfEmailHash, sit.get128()); + case STI_UINT160: + return std::make_shared(sfTakerPaysCurrency, sit.get160()); + case STI_UINT192: + return std::make_shared(sfMPTokenIssuanceID, sit.get192()); + case STI_UINT256: + return std::make_shared(sfLedgerHash, sit.get256()); + case STI_VL: { + auto blob = sit.getVL(); + return std::make_shared(sfData, blob.data(), blob.size()); + } + case STI_ACCOUNT: + return std::make_shared(sit, sfAccount); + case STI_AMOUNT: + return std::make_shared(sit, sfAmount); + // case STI_NUMBER: + // return std::make_shared(sit, sfNumber); + case STI_ISSUE: + return std::make_shared(sit, sfAsset); + case STI_CURRENCY: + return std::make_shared(sit, sfBaseAsset); + case STI_JSON: + return std::make_shared(sit, sfContractJson); + case STI_OBJECT: + case STI_ARRAY: + case STI_PATHSET: + case STI_VECTOR256: + default: + // Unknown type, treat as blob + { + auto blob = sit.getSlice(sit.getBytesLeft()); + return std::make_shared(sfData, blob.data(), blob.size()); + } + } +} + +std::optional +STJson::getObjectField(Key const& key) const +{ + if (!isObject()) + return std::nullopt; + + auto const& map = std::get(data_); + auto it = map.find(key); + if (it == map.end() || !it->second) + return std::nullopt; + return it->second; +} + +void +STJson::setNestedObjectField(Key const& key, Key const& nestedKey, Value const& value) +{ + if (!isObject()) + Throw("STJson::setNestedObjectField called on non-object"); + + validateDepth(value, 1); // We're at depth 1 (nested) + + auto& map = std::get(data_); + auto it = map.find(key); + std::shared_ptr nested; + if (it == map.end() || !it->second) + { + // Create new nested STJson + nested = std::make_shared(); + map[key] = nested; + } + else + { + nested = std::dynamic_pointer_cast(it->second); + if (!nested) + { + // Overwrite with new STJson if not an STJson + nested = std::make_shared(); + map[key] = nested; + } + } + nested->setObjectField(nestedKey, value); +} + +std::optional +STJson::getNestedObjectField(Key const& key, Key const& nestedKey) const +{ + if (!isObject()) + return std::nullopt; + + auto const& map = std::get(data_); + auto it = map.find(key); + if (it == map.end() || !it->second) + return std::nullopt; + auto nested = std::dynamic_pointer_cast(it->second); + if (!nested) + return std::nullopt; + return nested->getObjectField(nestedKey); +} + +STJson::Map const& +STJson::getMap() const +{ + if (!isObject()) + Throw("STJson::getMap called on non-object"); + return std::get(data_); +} + +STJson::Array const& +STJson::getArray() const +{ + if (!isArray()) + Throw("STJson::getArray called on non-array"); + return std::get(data_); +} + +void +STJson::pushArrayElement(Value const& value) +{ + if (!isArray()) + Throw("STJson::pushArrayElement called on non-array"); + validateDepth(value, 0); + std::get(data_).push_back(value); +} + +std::optional +STJson::getArrayElement(size_t index) const +{ + if (!isArray()) + return std::nullopt; + + auto const& array = std::get(data_); + if (index >= array.size()) + return std::nullopt; + + return array[index]; +} + +void +STJson::setArrayElement(size_t index, Value const& value) +{ + if (!isArray()) + Throw("STJson::setArrayElement called on non-array"); + validateDepth(value, 0); + + auto& array = std::get(data_); + // Auto-resize with nulls if needed + if (index >= array.size()) + array.resize(index + 1, nullptr); + + array[index] = value; +} + +void +STJson::setArrayElementField(size_t index, Key const& key, Value const& value) +{ + if (!isArray()) + Throw("STJson::setArrayElementField called on non-array"); + + validateDepth(value, 1); // We're at depth 1 (inside array element) + + auto& array = std::get(data_); + // Auto-resize with nulls if needed + if (index >= array.size()) + array.resize(index + 1, nullptr); + + // Get or create STJson object at index + std::shared_ptr element; + if (!array[index]) + { + element = std::make_shared(Map{}); + array[index] = element; + } + else + { + element = std::dynamic_pointer_cast(array[index]); + if (!element) + { + // Replace with new STJson if not an STJson + element = std::make_shared(Map{}); + array[index] = element; + } + } + + element->setObjectField(key, value); +} + +std::optional +STJson::getArrayElementField(size_t index, Key const& key) const +{ + if (!isArray()) + return std::nullopt; + + auto const& array = std::get(data_); + if (index >= array.size()) + return std::nullopt; + + auto element = std::dynamic_pointer_cast(array[index]); + if (!element) + return std::nullopt; + + return element->getObjectField(key); +} + +size_t +STJson::arraySize() const +{ + if (!isArray()) + return 0; + return std::get(data_).size(); +} + +void +STJson::setNestedArrayElement(Key const& key, size_t index, Value const& value) +{ + if (!isObject()) + Throw("STJson::setNestedArrayElement called on non-object"); + + validateDepth(value, 1); // We're at depth 1 (nested array) + + auto& map = std::get(data_); + auto it = map.find(key); + std::shared_ptr arrayJson; + + if (it == map.end() || !it->second) + { + // Create new nested STJson array + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + else + { + arrayJson = std::dynamic_pointer_cast(it->second); + if (!arrayJson) + { + // Replace with new STJson array if not an STJson + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + else if (!arrayJson->isArray()) + { + // Replace with array if not an array + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + } + + arrayJson->setArrayElement(index, value); +} + +void +STJson::setNestedArrayElementField( + Key const& key, + size_t index, + Key const& nestedKey, + Value const& value) +{ + if (!isObject()) + Throw("STJson::setNestedArrayElementField called on non-object"); + + validateDepth(value, 1); // We're at depth 1 (nested array element field - + // still counts as depth 1) + + auto& map = std::get(data_); + auto it = map.find(key); + std::shared_ptr arrayJson; + + if (it == map.end() || !it->second) + { + // Create new nested STJson array + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + else + { + arrayJson = std::dynamic_pointer_cast(it->second); + if (!arrayJson) + { + // Replace with new STJson array if not an STJson + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + else if (!arrayJson->isArray()) + { + // Replace with array if not an array + arrayJson = std::make_shared(Array{}); + map[key] = arrayJson; + } + } + + arrayJson->setArrayElementField(index, nestedKey, value); +} + +std::optional +STJson::getNestedArrayElement(Key const& key, size_t index) const +{ + if (!isObject()) + return std::nullopt; + + auto const& map = std::get(data_); + auto it = map.find(key); + if (it == map.end() || !it->second) + return std::nullopt; + + auto arrayJson = std::dynamic_pointer_cast(it->second); + if (!arrayJson || !arrayJson->isArray()) + return std::nullopt; + + return arrayJson->getArrayElement(index); +} + +std::optional +STJson::getNestedArrayElementField(Key const& key, size_t index, Key const& nestedKey) const +{ + if (!isObject()) + return std::nullopt; + + auto const& map = std::get(data_); + auto it = map.find(key); + if (it == map.end() || !it->second) + return std::nullopt; + + auto arrayJson = std::dynamic_pointer_cast(it->second); + if (!arrayJson || !arrayJson->isArray()) + return std::nullopt; + + return arrayJson->getArrayElementField(index, nestedKey); +} + +void +STJson::addVLKey(Serializer& s, std::string const& str) +{ + s.addVL(str.data(), str.size()); +} + +void +STJson::addVLValue(Serializer& s, std::shared_ptr const& value) +{ + if (!value) + { + s.addVL(nullptr, 0); + return; + } + Serializer tmp; + tmp.add8(static_cast(value->getSType())); + value->add(tmp); + s.addVL(tmp.peekData().data(), tmp.peekData().size()); +} + +void +STJson::add(Serializer& s) const +{ + Serializer inner; + + // Add type byte + inner.add8(static_cast(getType())); + + if (isArray()) + { + auto const& array = std::get(data_); + for (auto const& value : array) + { + addVLValue(inner, value); + } + } + else // isObject() + { + auto const& map = std::get(data_); + for (auto const& [key, value] : map) + { + addVLKey(inner, key); + addVLValue(inner, value); + } + } + + s.addVL(inner.peekData().data(), inner.peekData().size()); +} + +Json::Value +STJson::getJson(JsonOptions options) const +{ + if (isArray()) + { + Json::Value arr(Json::arrayValue); + auto const& array = std::get(data_); + for (auto const& value : array) + { + if (value) + arr.append(value->getJson(options)); + else + arr.append(Json::nullValue); + } + return arr; + } + else // isObject() + { + Json::Value obj(Json::objectValue); + auto const& map = std::get(data_); + for (auto const& [key, value] : map) + { + if (value) + obj[key] = value->getJson(options); + else + obj[key] = Json::nullValue; + } + return obj; + } +} + +bool +STJson::isEquivalent(STBase const& t) const +{ + auto const* const tPtr = dynamic_cast(&t); + return tPtr && (data_ == tPtr->data_); +} + +bool +STJson::isDefault() const +{ + return default_; +} + +Blob +STJson::toBlob() const +{ + Serializer s; + add(s); + return s.peekData(); +} + +std::size_t +STJson::size() const +{ + Serializer s; + add(s); + return s.size(); +} + +void +STJson::setValue(STJson const& v) +{ + data_ = v.data_; +} + +STBase* +STJson::copy(std::size_t n, void* buf) const +{ + return emplace(n, buf, *this); +} + +STBase* +STJson::move(std::size_t n, void* buf) +{ + return emplace(n, buf, std::move(*this)); +} + +} // namespace xrpl diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index f758760337b..239d8e70806 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -19,8 +19,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -637,6 +640,20 @@ STObject::getAccountID(SField const& field) const return getFieldByValue(field); } +STData +STObject::getFieldData(SField const& field) const +{ + static STData const empty{field}; + return getFieldByConstRef(field, empty); +} + +STDataType +STObject::getFieldDataType(SField const& field) const +{ + static STDataType const empty{field}; + return getFieldByConstRef(field, empty); +} + Blob STObject::getFieldVL(SField const& field) const { @@ -697,6 +714,13 @@ STObject::getFieldNumber(SField const& field) const return getFieldByConstRef(field, empty); } +STJson const& +STObject::getFieldJson(SField const& field) const +{ + static STJson const empty{field}; + return getFieldByConstRef(field, empty); +} + void STObject::set(std::unique_ptr v) { @@ -719,6 +743,69 @@ STObject::set(STBase&& v) } } +void +STObject::addFieldFromSlice(SField const& sfield, Slice const& data) +{ + SerialIter sit(data.data(), data.size()); + std::unique_ptr element; + + switch (sfield.fieldType) + { + case STI_AMOUNT: + element = std::make_unique(sit, sfield); + break; + case STI_ACCOUNT: + element = std::make_unique(sit, sfield); + break; + case STI_UINT8: + element = std::make_unique(sit, sfield); + break; + case STI_UINT16: + element = std::make_unique(sit, sfield); + break; + case STI_UINT32: + element = std::make_unique(sit, sfield); + break; + case STI_UINT64: + element = std::make_unique(sit, sfield); + break; + case STI_UINT128: + element = std::make_unique(sit, sfield); + break; + case STI_UINT160: + element = std::make_unique(sit, sfield); + break; + case STI_UINT256: + element = std::make_unique(sit, sfield); + break; + case STI_VECTOR256: + element = std::make_unique(sit, sfield); + break; + case STI_VL: + element = std::make_unique(sit, sfield); + break; + case STI_CURRENCY: + element = std::make_unique(sit, sfield); + break; + case STI_ISSUE: + element = std::make_unique(sit, sfield); + break; + case STI_PATHSET: + element = std::make_unique(sit, sfield); + break; + case STI_ARRAY: + element = std::make_unique(sit, sfield); + break; + case STI_OBJECT: + element = std::make_unique(sit, sfield, 0); + break; + default: + throw std::runtime_error("Unsupported SField type"); + } + + this->set(std::move(element)); +} + void STObject::setFieldU8(SField const& field, unsigned char v) { @@ -827,6 +914,12 @@ STObject::setFieldObject(SField const& field, STObject const& v) setFieldUsingAssignment(field, v); } +void +STObject::setFieldJson(SField const& field, STJson const& v) +{ + setFieldUsingAssignment(field, v); +} + Json::Value STObject::getJson(JsonOptions options) const { diff --git a/src/libxrpl/protocol/STParsedJSON.cpp b/src/libxrpl/protocol/STParsedJSON.cpp index c928f493751..3d189079390 100644 --- a/src/libxrpl/protocol/STParsedJSON.cpp +++ b/src/libxrpl/protocol/STParsedJSON.cpp @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include #include #include @@ -903,6 +905,52 @@ parseLeaf( } break; + case STI_DATA: { + try + { + ret = detail::make_stvar(dataFromJson(field, value)); + } + catch (std::exception const&) + { + std::cout << "STI_DATA failed for field: " << fieldName + << " in object: " << json_name << "\n"; + error = invalid_data(json_name, fieldName); + return ret; + } + + break; + } + case STI_DATATYPE: { + try + { + ret = detail::make_stvar(dataTypeFromJson(field, value)); + } + catch (std::exception const&) + { + std::cout << "STI_DATATYPE failed for field: " << fieldName + << " in object: " << json_name << "\n"; + error = invalid_data(json_name, fieldName); + return ret; + } + break; + } + + case STI_JSON: + Throw("STI_JSON is not supported"); + // try + // { + // ret = detail::make_stvar( + // dataTypeFromJson(field, value)); + // } + // catch (std::exception const&) + // { + // std::cout << "STI_DATATYPE failed for field: " << fieldName + // << " in object: " << json_name << "\n"; + // error = invalid_data(json_name, fieldName); + // return ret; + // } + break; + default: error = bad_type(json_name, fieldName); return ret; diff --git a/src/libxrpl/protocol/STVar.cpp b/src/libxrpl/protocol/STVar.cpp index 8b76d8a3227..4987685adbe 100644 --- a/src/libxrpl/protocol/STVar.cpp +++ b/src/libxrpl/protocol/STVar.cpp @@ -8,8 +8,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -222,6 +225,15 @@ STVar::constructST(SerializedTypeID id, int depth, Args&&... args) case STI_CURRENCY: construct(std::forward(args)...); return; + case STI_DATA: + construct(std::forward(args)...); + return; + case STI_DATATYPE: + construct(std::forward(args)...); + return; + case STI_JSON: + construct(std::forward(args)...); + return; default: Throw("Unknown object type"); } diff --git a/src/libxrpl/protocol/TER.cpp b/src/libxrpl/protocol/TER.cpp index 09c8acd4e37..abbd5b6b6cb 100644 --- a/src/libxrpl/protocol/TER.cpp +++ b/src/libxrpl/protocol/TER.cpp @@ -107,6 +107,7 @@ transResults() MAKE_ERROR(tecPSEUDO_ACCOUNT, "This operation is not allowed against a pseudo-account."), MAKE_ERROR(tecPRECISION_LOSS, "The amounts used by the transaction cannot interact."), MAKE_ERROR(tecWASM_REJECTED, "The custom WASM code that was run rejected your transaction."), + MAKE_ERROR(tecINVALID_PARAMETERS, "Contract parameters do not match the expected ABI."), MAKE_ERROR(tefALREADY, "The exact transaction was already in this ledger."), MAKE_ERROR(tefBAD_ADD_AUTH, "Not authorized to add account."), diff --git a/src/libxrpl/protocol/TxFormats.cpp b/src/libxrpl/protocol/TxFormats.cpp index 4492ae271b7..4fcfae97627 100644 --- a/src/libxrpl/protocol/TxFormats.cpp +++ b/src/libxrpl/protocol/TxFormats.cpp @@ -40,7 +40,7 @@ TxFormats::TxFormats() #undef TRANSACTION #define UNWRAP(...) __VA_ARGS__ -#define TRANSACTION(tag, value, name, delegable, amendment, privileges, fields) \ +#define TRANSACTION(tag, value, name, delegatable, amendment, privileges, emitable, fields) \ add(jss::name, tag, UNWRAP fields, getCommonFields()); #include diff --git a/src/libxrpl/server/InfoSub.cpp b/src/libxrpl/server/InfoSub.cpp index ea70dc3a83c..4709ea99285 100644 --- a/src/libxrpl/server/InfoSub.cpp +++ b/src/libxrpl/server/InfoSub.cpp @@ -32,6 +32,7 @@ InfoSub::~InfoSub() m_source.unsubValidations(mSeq); m_source.unsubPeerStatus(mSeq); m_source.unsubConsensus(mSeq); + m_source.unsubContractEvent(mSeq); // Use the internal unsubscribe so that it won't call // back to us and modify its own parameter diff --git a/src/libxrpl/tx/ApplyContext.cpp b/src/libxrpl/tx/ApplyContext.cpp index cd379dd960e..8fcdd734861 100644 --- a/src/libxrpl/tx/ApplyContext.cpp +++ b/src/libxrpl/tx/ApplyContext.cpp @@ -28,13 +28,21 @@ ApplyContext::ApplyContext( XRPL_ASSERT( parentBatchId.has_value() == ((flags_ & tapBATCH) == tapBATCH), "Parent Batch ID should be set if batch apply flag is set"); - view_.emplace(&base_, flags_); + view_.emplace(&base_.view(), flags_); } void ApplyContext::discard() { - view_.emplace(&base_, flags_); + base_.discard(); + view_.emplace(&base_.view(), flags_); +} + +void +ApplyContext::finalize() +{ + base_.commit(); + view_.emplace(&base_.view(), flags_); } std::optional @@ -45,7 +53,8 @@ ApplyContext::apply(TER ter) view_->setWasmReturnCode(*wasmReturnCode_); } view_->setGasUsed(gasUsed_); - return view_->apply(base_, tx, ter, parentBatchId_, (flags_ & tapDRY_RUN) != 0u, journal); + return view_->apply( + base_.view(), tx, ter, parentBatchId_, (flags_ & tapDRY_RUN) != 0u, journal); } std::size_t @@ -62,7 +71,7 @@ ApplyContext::visit( std::shared_ptr const&, std::shared_ptr const&)> const& func) { - view_->visit(base_, func); + view_->visit(base_.view(), func); } TER diff --git a/src/libxrpl/tx/Transactor.cpp b/src/libxrpl/tx/Transactor.cpp index cb65fc5ce5b..bb11bc825f5 100644 --- a/src/libxrpl/tx/Transactor.cpp +++ b/src/libxrpl/tx/Transactor.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -17,7 +18,6 @@ #include #include #include -#include namespace xrpl { @@ -582,6 +582,32 @@ Transactor::ticketDelete( return tesSUCCESS; } +std::pair +Transactor::checkInvariants(TER result, XRPAmount fee) +{ + // Check invariants: if `tecINVARIANT_FAILED` is not returned, we can + // proceed to apply the tx + result = ctx_.checkInvariants(result, fee); + + if (result == tecINVARIANT_FAILED) + { + // if invariants checking failed again, reset the context and + // attempt to only claim a fee. + auto const resetResult = reset(fee); + if (!isTesSuccess(resetResult.first)) + result = resetResult.first; + + fee = resetResult.second; + + // Check invariants again to ensure the fee claiming doesn't + // violate invariants. + if (isTesSuccess(result) || isTecClaim(result)) + result = ctx_.checkInvariants(result, fee); + } + + return {result, fee}; +} + // check stuff before you bother to lock the ledger void Transactor::preCompute() @@ -647,7 +673,8 @@ Transactor::checkSign( } auto const pkSigner = sigObject.getFieldVL(sfSigningPubKey); - // Ignore signature check on batch inner transactions + // Ignore signature check on batch inner transactions (e.g., emitted + // transactions from contracts) if (parentBatchId && view.rules().enabled(featureBatch)) { // Defensive Check: These values are also checked in Batch::preflight @@ -1046,8 +1073,10 @@ Transactor::reset(XRPAmount fee) auto const balance = payerSle->getFieldAmount(sfBalance).xrp(); // balance should have already been checked in checkFee / preFlight. + // For batch/inner transactions (fee == 0), the balance can + // legitimately be zero (e.g. contract pseudo-accounts). XRPL_ASSERT( - balance != beast::zero && (!view().open() || balance >= fee), + (fee == beast::zero || balance != beast::zero) && (!view().open() || balance >= fee), "xrpl::Transactor::reset : valid balance"); // We retry/reject the transaction if the account balance is zero or @@ -1262,26 +1291,9 @@ Transactor::operator()() if (applied) { - // Check invariants: if `tecINVARIANT_FAILED` is not returned, we can - // proceed to apply the tx - result = ctx_.checkInvariants(result, fee); - - if (result == tecINVARIANT_FAILED) - { - // if invariants checking failed again, reset the context and - // attempt to only claim a fee. - auto const resetResult = reset(fee); - if (!isTesSuccess(resetResult.first)) - result = resetResult.first; - - fee = resetResult.second; - - // Check invariants again to ensure the fee claiming doesn't - // violate invariants. - if (isTesSuccess(result) || isTecClaim(result)) - result = ctx_.checkInvariants(result, fee); - } - + auto const invariantsResult = checkInvariants(result, fee); + result = invariantsResult.first; + fee = invariantsResult.second; // We ran through the invariant checker, which can, in some cases, // return a tef error code. Don't apply the transaction in that case. if (!isTecClaim(result) && !isTesSuccess(result)) @@ -1316,6 +1328,70 @@ Transactor::operator()() applied = false; } + if (metadata && ctx_.getEmittedTxns().size() > 0) + { + OpenView emittedTxnsView(batch_view, ctx_.openView()); + auto const parentBatchId = ctx_.tx.getTransactionID(); + + auto applyOneTransaction = [this, &parentBatchId, &emittedTxnsView](STTx const& tx) { + OpenView perTxBatchView(batch_view, emittedTxnsView); + + auto const ret = xrpl::apply( + ctx_.registry, perTxBatchView, parentBatchId, tx, tapBATCH, ctx_.journal); + XRPL_ASSERT( + ret.applied == (isTesSuccess(ret.ter) || isTecClaim(ret.ter)), + "Inner transaction should not be applied"); + + JLOG(ctx_.journal.debug()) + << "BatchTrace[" << parentBatchId << "]: " << tx.getTransactionID() << " " + << (ret.applied ? "applied" : "failure") << ": " << transToken(ret.ter); + + // If the transaction should be applied push its changes to the + // whole-batch view. + if (ret.applied && (isTesSuccess(ret.ter) || isTecClaim(ret.ter))) + perTxBatchView.apply(emittedTxnsView); + + return ret; + }; + + bool emitResult = true; + auto emittedTxns = ctx_.getEmittedTxns(); + while (!emittedTxns.empty()) + { + auto txn = emittedTxns.front(); + emittedTxns.pop(); + auto const result = applyOneTransaction(*txn); + XRPL_ASSERT( + result.applied == (isTesSuccess(result.ter) || isTecClaim(result.ter)), + "Outer Batch failure, inner transaction should not be applied"); + + if (!isTesSuccess(result.ter)) + emitResult = false; + } + + if (emitResult) + emittedTxnsView.apply(ctx_.openView()); + else + { + // reset context + result = tecWASM_REJECTED; + auto const resetResult = reset(fee); + if (!isTesSuccess(resetResult.first)) + result = resetResult.first; + fee = resetResult.second; + + // InvariantCheck + auto const invariantsResult = checkInvariants(result, fee); + result = invariantsResult.first; + fee = invariantsResult.second; + + // apply + metadata = ctx_.apply(result); + } + } + + ctx_.finalize(); + JLOG(j_.trace()) << (applied ? "applied " : "not applied ") << transToken(result); return {result, applied, metadata}; diff --git a/src/libxrpl/tx/invariants/InvariantCheck.cpp b/src/libxrpl/tx/invariants/InvariantCheck.cpp index bf0f65f000c..cf2a737c2bb 100644 --- a/src/libxrpl/tx/invariants/InvariantCheck.cpp +++ b/src/libxrpl/tx/invariants/InvariantCheck.cpp @@ -859,7 +859,8 @@ ValidPseudoAccounts::visitEntry( errors_.emplace_back(error.str()); } } - if (before && before->at(sfSequence) != after->at(sfSequence)) + if (before && before->at(sfSequence) != after->at(sfSequence) && + !after->isFieldPresent(sfContractID)) { errors_.emplace_back("pseudo-account sequence changed"); } diff --git a/src/libxrpl/tx/invariants/NFTInvariant.cpp b/src/libxrpl/tx/invariants/NFTInvariant.cpp index cf00dc92900..0e09dbb1b8b 100644 --- a/src/libxrpl/tx/invariants/NFTInvariant.cpp +++ b/src/libxrpl/tx/invariants/NFTInvariant.cpp @@ -2,11 +2,12 @@ // #include #include +#include #include +#include #include #include #include -#include namespace xrpl { diff --git a/src/libxrpl/tx/transactors/DeleteUtils.cpp b/src/libxrpl/tx/transactors/DeleteUtils.cpp new file mode 100644 index 00000000000..78dacd13442 --- /dev/null +++ b/src/libxrpl/tx/transactors/DeleteUtils.cpp @@ -0,0 +1,382 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace xrpl { + +// Local function definitions that provides signature compatibility. +TER +offerDelete( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return offerDelete(view, sleDel, j); +} + +TER +removeSignersFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return SignerListSet::removeFromLedger(registry, view, account, j); +} + +TER +removeTicketFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const&, + beast::Journal j) +{ + return Transactor::ticketDelete(view, account, delIndex, j); +} + +TER +removeDepositPreauthFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const&, + uint256 const& delIndex, + std::shared_ptr const&, + beast::Journal j) +{ + return DepositPreauth::removeFromLedger(view, delIndex, j); +} + +TER +removeNFTokenOfferFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal) +{ + if (!nft::deleteTokenOffer(view, sleDel)) + return tefBAD_LEDGER; + + return tesSUCCESS; +} + +TER +removeDIDFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return DIDDelete::deleteSLE(view, sleDel, account, j); +} + +TER +removeOracleFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const& account, + uint256 const&, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return OracleDelete::deleteOracle(view, sleDel, account, j); +} + +TER +removeCredentialFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const&, + uint256 const&, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return credentials::deleteSLE(view, sleDel, j); +} + +TER +removeDelegateFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return DelegateSet::deleteDelegate(view, sleDel, account, j); +} + +TER +removeContractFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return ContractDelete::deleteContract(view, sleDel, account, j); +} + +// Return nullptr if the LedgerEntryType represents an obligation that can't +// be deleted. Otherwise return the pointer to the function that can delete +// the non-obligation +DeleterFuncPtr +nonObligationDeleter(LedgerEntryType t) +{ + switch (t) + { + case ltOFFER: + return offerDelete; + case ltSIGNER_LIST: + return removeSignersFromLedger; + case ltTICKET: + return removeTicketFromLedger; + case ltDEPOSIT_PREAUTH: + return removeDepositPreauthFromLedger; + case ltNFTOKEN_OFFER: + return removeNFTokenOfferFromLedger; + case ltDID: + return removeDIDFromLedger; + case ltORACLE: + return removeOracleFromLedger; + case ltCREDENTIAL: + return removeCredentialFromLedger; + case ltDELEGATE: + return removeDelegateFromLedger; + case ltCONTRACT: + return removeContractFromLedger; + default: + return nullptr; + } +} + +TER +deletePreclaim( + PreclaimContext const& ctx, + std::uint32_t seqDelta, + AccountID const account, + AccountID const dest, + bool isPseudoAccount) +{ + auto destSle = ctx.view.read(keylet::account(dest)); + + if (!destSle) + return tecNO_DST; + + if ((*destSle)[sfFlags] & lsfRequireDestTag && !ctx.tx[~sfDestinationTag]) + return tecDST_TAG_NEEDED; + + // If credentials are provided - check them anyway + if (auto const err = credentials::valid(ctx.tx, ctx.view, account, ctx.j); !isTesSuccess(err)) + return err; + + // if credentials then postpone auth check to doApply, to check for expired + // credentials + if (!ctx.tx.isFieldPresent(sfCredentialIDs)) + { + // Check whether the destination account requires deposit authorization. + if (destSle->getFlags() & lsfDepositAuth) + { + if (!ctx.view.exists(keylet::depositPreauth(dest, account)) && !isPseudoAccount) + return tecNO_PERMISSION; + } + } + + auto srcSle = ctx.view.read(keylet::account(account)); + XRPL_ASSERT(srcSle, "xrpl::DeleteAccount::preclaim : non-null account"); + if (!srcSle) + return terNO_ACCOUNT; + + { + // If an issuer has any issued NFTs resident in the ledger then it + // cannot be deleted. + if ((*srcSle)[~sfMintedNFTokens] != (*srcSle)[~sfBurnedNFTokens]) + return tecHAS_OBLIGATIONS; + + // If the account owns any NFTs it cannot be deleted. + Keylet const first = keylet::nftpage_min(account); + Keylet const last = keylet::nftpage_max(account); + + auto const cp = ctx.view.read( + Keylet(ltNFTOKEN_PAGE, ctx.view.succ(first.key, last.key.next()).value_or(last.key))); + if (cp) + return tecHAS_OBLIGATIONS; + } + + // We don't allow an account to be deleted if its sequence number + // is within 256 of the current ledger. This prevents replay of old + // transactions if this account is resurrected after it is deleted. + // + // We look at the account's Sequence rather than the transaction's + // Sequence in preparation for Tickets. + if ((*srcSle)[sfSequence] + seqDelta > ctx.view.seq()) + return tecTOO_SOON; + + // When fixNFTokenRemint is enabled, we don't allow an account to be + // deleted if is within 256 of the + // current ledger. This is to prevent having duplicate NFTokenIDs after + // account re-creation. + // + // Without this restriction, duplicate NFTokenIDs can be reproduced when + // authorized minting is involved. Because when the minter mints a NFToken, + // the issuer's sequence does not change. So when the issuer re-creates + // their account and mints a NFToken, it is possible that the + // NFTokenSequence of this NFToken is the same as the one that the + // authorized minter minted in a previous ledger. + if ((*srcSle)[~sfFirstNFTokenSequence].value_or(0) + (*srcSle)[~sfMintedNFTokens].value_or(0) + + seqDelta > + ctx.view.seq()) + return tecTOO_SOON; + + // Verify that the account does not own any objects that would prevent + // the account from being deleted. + Keylet const ownerDirKeylet{keylet::ownerDir(account)}; + if (dirIsEmpty(ctx.view, ownerDirKeylet)) + return tesSUCCESS; + + std::shared_ptr sleDirNode{}; + unsigned int uDirEntry{0}; + uint256 dirEntry{beast::zero}; + + // Account has no directory at all. This _should_ have been caught + // by the dirIsEmpty() check earlier, but it's okay to catch it here. + if (!cdirFirst(ctx.view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry)) + return tesSUCCESS; + + std::int32_t deletableDirEntryCount{0}; + do + { + // Make sure any directory node types that we find are the kind + // we can delete. + auto sleItem = ctx.view.read(keylet::child(dirEntry)); + if (!sleItem) + { + // Directory node has an invalid index. Bail out. + JLOG(ctx.j.fatal()) << "DeleteAccount: directory node in ledger " << ctx.view.seq() + << " has index to object that is missing: " << to_string(dirEntry); + return tefBAD_LEDGER; + } + + LedgerEntryType const nodeType{safe_cast((*sleItem)[sfLedgerEntryType])}; + + if (!nonObligationDeleter(nodeType)) + return tecHAS_OBLIGATIONS; + + // We found a deletable directory entry. Count it. If we find too + // many deletable directory entries then bail out. + if (++deletableDirEntryCount > maxDeletableDirEntries) + return tefTOO_BIG; + + } while (cdirNext(ctx.view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry)); + + return tesSUCCESS; +} + +TER +deleteDoApply( + ApplyContext& applyCtx, + STAmount const& accountBalance, + AccountID const& account, + AccountID const& dest) +{ + auto& view = applyCtx.view(); + STTx const tx = applyCtx.tx; + beast::Journal j = applyCtx.journal; + + auto srcSle = view.peek(keylet::account(account)); + XRPL_ASSERT(srcSle, "xrpl::deleteDoApply : non-null source account"); + + if (!srcSle) + return tefBAD_LEDGER; + + auto destSle = view.peek(keylet::account(dest)); + XRPL_ASSERT(destSle, "xrpl::deleteDoApply : non-null destination account"); + + if (!destSle) + return tefBAD_LEDGER; + + if (tx.isFieldPresent(sfCredentialIDs)) + { + if (auto err = verifyDepositPreauth(tx, view, account, dest, destSle, j); + !isTesSuccess(err)) + return err; + } + + Keylet const ownerDirKeylet{keylet::ownerDir(account)}; + auto const ter = cleanupOnAccountDelete( + view, + ownerDirKeylet, + [&](LedgerEntryType nodeType, + uint256 const& dirEntry, + std::shared_ptr& sleItem) -> std::pair { + if (auto deleter = nonObligationDeleter(nodeType)) + { + TER const result{deleter(applyCtx.registry, view, account, dirEntry, sleItem, j)}; + + return {result, SkipEntry::No}; + } + + UNREACHABLE( + "xrpl::deleteDoApply : undeletable item not found " + "in preclaim"); + JLOG(j.error()) << "DeleteAccount undeletable item not " + "found in preclaim."; + return {tecHAS_OBLIGATIONS, SkipEntry::No}; + }, + j); + if (ter != tesSUCCESS) + return ter; + + // Transfer any XRP remaining after the fee is paid to the destination: + (*destSle)[sfBalance] = (*destSle)[sfBalance] + accountBalance; + (*srcSle)[sfBalance] = (*srcSle)[sfBalance] - accountBalance; + applyCtx.deliver(accountBalance); + + // DA: Pseudo accounts can have 0 balance, so we skip this assert. + // FIX FIX FIX: DA FIX + // XRPL_ASSERT( + // (*srcSle)[sfBalance] == XRPAmount(0), + // "xrpl::deleteDoApply : source balance is zero"); + + // If there's still an owner directory associated with the source account + // delete it. + if (view.exists(ownerDirKeylet) && !view.emptyDirDelete(ownerDirKeylet)) + { + JLOG(j.error()) << "DeleteAccount cannot delete root dir node of " << toBase58(account); + return tecHAS_OBLIGATIONS; + } + + // Re-arm the password change fee if we can and need to. + if (accountBalance > XRPAmount(0) && (*destSle).isFlag(lsfPasswordSpent)) + (*destSle).clearFlag(lsfPasswordSpent); + + view.update(destSle); + view.erase(srcSle); + + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/account/AccountDelete.cpp b/src/libxrpl/tx/transactors/account/AccountDelete.cpp index 8c2f23b7549..080c6d0934e 100644 --- a/src/libxrpl/tx/transactors/account/AccountDelete.cpp +++ b/src/libxrpl/tx/transactors/account/AccountDelete.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -11,9 +12,9 @@ #include #include #include +#include #include #include -#include #include #include @@ -169,6 +170,18 @@ removeDelegateFromLedger( return DelegateSet::deleteDelegate(view, sleDel, account, j); } +TER +removeContractFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const& account, + uint256 const& /*delIndex*/, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return ContractDelete::deleteContract(view, sleDel, account, j); +} + // Return nullptr if the LedgerEntryType represents an obligation that can't // be deleted. Otherwise return the pointer to the function that can delete // the non-obligation @@ -195,6 +208,8 @@ nonObligationDeleter(LedgerEntryType t) return removeCredentialFromLedger; case ltDELEGATE: return removeDelegateFromLedger; + case ltCONTRACT: + return removeContractFromLedger; default: return nullptr; } diff --git a/src/libxrpl/tx/transactors/contract/ContractCall.cpp b/src/libxrpl/tx/transactors/contract/ContractCall.cpp new file mode 100644 index 00000000000..fd1e415d14d --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractCall.cpp @@ -0,0 +1,329 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +XRPAmount +ContractCall::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount extraFee{0}; + if (auto const allowance = tx[~sfComputationAllowance]; allowance) + { + extraFee += (*allowance) * view.fees().gasPrice / MICRO_DROPS_PER_DROP; + } + return Transactor::calculateBaseFee(view, tx) + extraFee; +} + +NotTEC +ContractCall::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + if (flags & tfUniversalMask) + { + JLOG(ctx.j.trace()) << "ContractCreate: tfUniversalMask is not allowed."; + return temINVALID_FLAG; + } + + return tesSUCCESS; +} + +TER +ContractCall::preclaim(PreclaimContext const& ctx) +{ + AccountID const account = ctx.tx[sfAccount]; + auto const accountSle = ctx.view.read(keylet::account(account)); + if (!accountSle) + { + JLOG(ctx.j.trace()) << "ContractCall: Account does not exist."; + return tecNO_TARGET; + } + + // The ContractAccount doesn't exist or isn't a smart contract + // pseudo-account. + AccountID const contractAccount = ctx.tx[sfContractAccount]; + auto const caSle = ctx.view.read(keylet::account(contractAccount)); + if (!caSle) + { + JLOG(ctx.j.trace()) << "ContractCall: Contract Account does not exist."; + return tecNO_TARGET; + } + + // The function doesn't exist on the provided contract. + uint256 const contractID = caSle->getFieldH256(sfContractID); + auto const contractSle = ctx.view.read(keylet::contract(contractID)); + if (!contractSle) + { + JLOG(ctx.j.trace()) << "ContractCall: Contract does not exist."; + return tecNO_TARGET; + } + + if (!contractSle->at(sfContractHash)) + { + JLOG(ctx.j.trace()) << "ContractCall: Contract does not have a hash."; + return tecNO_TARGET; + } + + auto const contractSourceSle = + ctx.view.read(keylet::contractSource(contractSle->at(sfContractHash))); + if (!contractSourceSle) + { + JLOG(ctx.j.trace()) << "ContractCall: ContractSource does not exist."; + return tecNO_TARGET; + } + + if (!contractSourceSle->isFieldPresent(sfFunctions)) + { + JLOG(ctx.j.trace()) << "ContractCall: Contract does not have any functions defined."; + return temMALFORMED; + } + + auto const& functions = contractSourceSle->getFieldArray(sfFunctions); + auto const functionName = ctx.tx.getFieldVL(sfFunctionName); + std::string functionNameHexStr(functionName.begin(), functionName.end()); + auto it = std::find_if( + functions.begin(), functions.end(), [&functionNameHexStr](STObject const& func) { + auto const funcName = func.getFieldVL(sfFunctionName); + std::string functionNameDefHexStr(funcName.begin(), funcName.end()); + return functionNameDefHexStr == functionNameHexStr; + }); + + if (it == functions.end()) + { + JLOG(ctx.j.trace()) << "ContractCall: FunctionName: " << functionNameHexStr + << " does not exist in contract abi."; + return temMALFORMED; + } + + if (ctx.tx.isFieldPresent(sfParameters)) + { + STArray const& params = ctx.tx.getFieldArray(sfParameters); + if (auto ter = + contract::preclaimFlagParameters(ctx.view, account, contractAccount, params, ctx.j); + !isTesSuccess(ter)) + { + JLOG(ctx.j.trace()) << "ContractCreate: Failed to preclaim flag parameters."; + return ter; + } + } + + // The parameters don't match the function's ABI. + return tesSUCCESS; +} + +TER +ContractCall::doApply() +{ + AccountID const contractAccount = ctx_.tx[sfContractAccount]; + + auto const caSle = ctx_.view().read(keylet::account(contractAccount)); + if (!caSle) + { + JLOG(j_.trace()) << "ContractCall: ContractAccount does not exist."; + return tefINTERNAL; + } + + auto const accountSle = ctx_.view().read(keylet::account(account_)); + if (!accountSle) + { + JLOG(j_.trace()) << "ContractCall: Account does not exist."; + return tefINTERNAL; + } + + uint256 const contractID = caSle->getFieldH256(sfContractID); + Keylet const k = keylet::contract(contractID); + auto const contractSle = ctx_.view().read(k); + if (!contractSle) + { + JLOG(j_.trace()) << "ContractCall: Contract does not exist."; + return tefINTERNAL; + } + + uint256 const contractHash = contractSle->at(sfContractHash); + auto const contractSourceSle = + ctx_.view().read(keylet::contractSource(contractSle->at(sfContractHash))); + if (!contractSourceSle) + { + JLOG(j_.trace()) << "ContractCall: ContractSource does not exist."; + return tefINTERNAL; + } + + // // Handle the flags for the contract call. + if (ctx_.tx.isFieldPresent(sfParameters)) + { + STArray const& params = ctx_.tx.getFieldArray(sfParameters); + if (auto ter = contract::doApplyFlagParameters( + ctx_.view(), + ctx_.tx, + account_, + contractAccount, + params, + preFeeBalance_, + ctx_.journal); + !isTesSuccess(ter)) + { + JLOG(ctx_.journal.trace()) << "ContractCall: Failed to handle flag parameters."; + return ter; + } + } + + // WASM execution + auto const wasmStr = contractSourceSle->getFieldVL(sfContractCode); + std::vector wasm(wasmStr.begin(), wasmStr.end()); + auto const functionName = ctx_.tx.getFieldVL(sfFunctionName); + std::string funcName(functionName.begin(), functionName.end()); + + auto const contractFunctions = contractSle->isFieldPresent(sfFunctions) + ? contractSle->getFieldArray(sfFunctions) + : contractSourceSle->getFieldArray(sfFunctions); + std::optional function; + for (auto const& contractFunction : contractFunctions) + { + if (contractFunction.getFieldVL(sfFunctionName) == functionName) + function = contractFunction; + } + if (!function) + { + JLOG(j_.trace()) << "ContractCall: FunctionName does not exist in contract."; + return tefINTERNAL; + } + + // ContractCall Parameters + std::vector functionParameters; + if (ctx_.tx.isFieldPresent(sfParameters)) + { + STArray const& funcParams = ctx_.tx.getFieldArray(sfParameters); + functionParameters = getParameterValueVec(funcParams); + } + + // ContractSource/Contract Default Parameters + std::vector instanceParameters; + if (contractSle->isFieldPresent(sfInstanceParameterValues)) + { + STArray const& instParams = contractSle->getFieldArray(sfInstanceParameterValues); + instanceParameters = getParameterValueVec(instParams); + } + + // The parameters don't match the function's ABI. + std::vector typeVec; + if (function->isFieldPresent(sfParameters)) + { + STArray const& funcParamsDef = function->getFieldArray(sfParameters); + typeVec = xrpl::getParameterTypeVec(funcParamsDef); + if (functionParameters.size() != typeVec.size()) + return tecINVALID_PARAMETERS; + } + + for (std::size_t i = 0; i < functionParameters.size(); i++) + { + if (functionParameters[i].value.getInnerSType() != typeVec[i].type.getInnerSType()) + return tecINVALID_PARAMETERS; + } + + xrpl::ContractDataMap dataMap; + xrpl::ContractEventMap eventMap; + ContractContext contractCtx = { + .applyCtx = ctx_, + .instanceParameters = instanceParameters, + .functionParameters = functionParameters, + .built_txns = {}, + .expected_etxn_count = 1, + .generation = 0, + .burden = 0, + .result = + { + .contractHash = contractHash, + .contractKeylet = k, + .contractSourceKeylet = k, + .contractAccountKeylet = k, + .contractAccount = contractAccount, + .nextSequence = caSle->getFieldU32(sfSequence), + .otxnAccount = account_, + .otxnId = ctx_.tx.getTransactionID(), + .exitReason = "", + .exitCode = -1, + .dataMap = dataMap, + .eventMap = eventMap, + .changedDataCount = 0, + }, + }; + + ContractHostFunctionsImpl ledgerDataProvider(contractCtx); + + if (!ctx_.tx.isFieldPresent(sfComputationAllowance)) + { + JLOG(j_.trace()) << "ContractCall: Computation allowance is not set."; + return tefINTERNAL; + } + + std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + auto re = runEscrowWasm(wasm, ledgerDataProvider, allowance, funcName, {}); + + // Wasm Result + if (re.has_value()) + { + // TODO: better error handling for this conversion + // if (allowance > re.value().cost) + // { + // allowance -= static_cast(re.value().cost); + // // auto const returnAllowance = [&]() { + // // ctx_.view().update( + // // keylet::account(contractAccount), + // // [allowance](SLE& sle) { + // // sle.setFieldU32( + // // sfBalance, + // // sle.getFieldU32(sfBalance) + allowance); + // // }); + // // }; + // // returnAllowance(); + // } + + ctx_.setGasUsed(static_cast(re.value().cost)); + auto ret = re.value().result; + if (ret < 0) + { + JLOG(j_.trace()) << "WASM Execution Failed: " << contractCtx.result.exitReason; + ctx_.setWasmReturnCode(ret); + // ctx_.setWasmReturnStr(contractCtx.result.exitReason); + return tecWASM_REJECTED; + } + + if (auto res = contract::finalizeContractData( + ctx_.registry, + ctx_.view(), + contractAccount, + contractCtx.result.dataMap, + contractCtx.result.eventMap, + ctx_.tx.getTransactionID()); + !isTesSuccess(res)) + { + JLOG(j_.trace()) << "Contract data finalization failed: " << transHuman(res); + return res; + } + + ctx_.setWasmReturnCode(ret); + // ctx_.setWasmReturnStr(contractCtx.result.exitReason); + ctx_.setEmittedTxns(contractCtx.result.emittedTxns); + return tesSUCCESS; + } + else + { + JLOG(j_.trace()) << "WASM Failure: " + transHuman(re.error()); + auto const errorCode = TERtoInt(re.error()); + ctx_.setWasmReturnCode(errorCode); + // ctx_.setWasmReturnStr(contractCtx.result.exitReason); + return re.error(); + } + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/contract/ContractClawback.cpp b/src/libxrpl/tx/transactors/contract/ContractClawback.cpp new file mode 100644 index 00000000000..1712d07c8cf --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractClawback.cpp @@ -0,0 +1,32 @@ +#include +#include +#include + +namespace xrpl { + +NotTEC +ContractClawback::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + if (flags & tfUniversalMask) + { + JLOG(ctx.j.trace()) << "ContractClawback: tfUniversalMask is not allowed."; + return temINVALID_FLAG; + } + + return tesSUCCESS; +} + +TER +ContractClawback::preclaim(PreclaimContext const& ctx) +{ + return tesSUCCESS; +} + +TER +ContractClawback::doApply() +{ + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/contract/ContractCreate.cpp b/src/libxrpl/tx/transactors/contract/ContractCreate.cpp new file mode 100644 index 00000000000..2b91baf403f --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractCreate.cpp @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +XRPAmount +ContractCreate::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount const maxAmount{std::numeric_limits::max()}; + XRPAmount createFee{0}; + + if (tx.isFieldPresent(sfCreateCode)) + createFee = XRPAmount{contract::contractCreateFee(tx.getFieldVL(sfCreateCode).size())}; + + if (createFee > maxAmount - view.fees().increment) + { + JLOG(debugLog().trace()) << "ContractCreate: Create fee overflow detected."; + return XRPAmount{INITIAL_XRP}; + } + + createFee += view.fees().increment; + + auto baseFee = Transactor::calculateBaseFee(view, tx); + if (baseFee > maxAmount - createFee) + { + JLOG(debugLog().trace()) << "ContractCreate: Total fee overflow detected."; + return XRPAmount{INITIAL_XRP}; + } + + return createFee + baseFee; +} + +std::uint32_t +ContractCreate::getFlagsMask(PreflightContext const& ctx) +{ + return tfContractMask; +} + +NotTEC +ContractCreate::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + + if ((flags & (tfCodeImmutable | tfABIImmutable | tfImmutable)) > tfImmutable) + { + JLOG(ctx.j.trace()) << "ContractCreate: Cannot set more than one immutability flag."; + return temINVALID_FLAG; + } + + if (!ctx.tx.isFieldPresent(sfContractCode) && !ctx.tx.isFieldPresent(sfContractHash)) + { + JLOG(ctx.j.trace()) << "ContractCreate: Neither ContractCode nor ContractHash present"; + return temMALFORMED; + } + + if (ctx.tx.isFieldPresent(sfContractCode) && ctx.tx.isFieldPresent(sfContractHash)) + { + JLOG(ctx.j.trace()) << "ContractCreate: Both ContractCode and ContractHash present"; + return temMALFORMED; + } + + if (auto const res = contract::preflightFunctions(ctx.tx, ctx.j); !isTesSuccess(res)) + { + JLOG(ctx.j.trace()) << "ContractCreate: Functions validation failed: " << transToken(res); + return res; + } + + if (auto const res = contract::preflightInstanceParameters(ctx.tx, ctx.j); !isTesSuccess(res)) + { + JLOG(ctx.j.trace()) << "ContractCreate: InstanceParameters validation failed: " + << transToken(res); + return res; + } + + if (auto const res = contract::preflightInstanceParameterValues(ctx.tx, ctx.j); + !isTesSuccess(res)) + { + JLOG(ctx.j.trace()) << "ContractCreate: InstanceParameterValues validation failed: " + << transToken(res); + return res; + } + + return tesSUCCESS; +} + +TER +ContractCreate::preclaim(PreclaimContext const& ctx) +{ + // ContractHash is provided but there is no existing corresponding + // ContractSource ledger object + bool isInstall = ctx.tx.isFieldPresent(sfContractHash); + auto contractHash = ctx.tx.at(~sfContractHash); + if (isInstall && !ctx.view.exists(keylet::contractSource(*contractHash))) + { + JLOG(ctx.j.trace()) << "ContractCreate: ContractHash provided but no " + "corresponding ContractSource exists"; + return temMALFORMED; + } + + // The ContractCode provided is invalid. + if (ctx.tx.isFieldPresent(sfContractCode)) + { + xrpl::Blob wasmBytes = ctx.tx.getFieldVL(sfContractCode); + if (wasmBytes.empty()) + { + JLOG(ctx.j.trace()) << "ContractCreate: ContractCode provided is empty."; + return temMALFORMED; + } + + contractHash = xrpl::sha512Half_s(xrpl::Slice(wasmBytes.data(), wasmBytes.size())); + if (ctx.view.exists(keylet::contractSource(*contractHash))) + isInstall = true; + + // Iterate through the functions and validate them? + // HostFunctions mock; + // auto const re = preflightEscrowWasm(wasmBytes, "finish", {}, &mock, + // ctx.j); if (!isTesSuccess(re)) + // { + // JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; + // return re; + // } + } + + // The ABI provided in Functions doesn't match the code. + + // InstanceParameters don't match what's in the existing ContractSource + // ledger object. + if (isInstall && ctx.tx.isFieldPresent(sfInstanceParameterValues)) + { + auto const sle = ctx.view.read(keylet::contractSource(*contractHash)); + if (!sle) + return tefINTERNAL; // LCOV_EXCL_LINE + + // Already validated in preflight, but we can check here too. + auto const& instanceParams = sle->getFieldArray(sfInstanceParameters); + auto const& instanceParamValues = ctx.tx.getFieldArray(sfInstanceParameterValues); + if (auto const isValid = + contract::validateParameterMapping(instanceParams, instanceParamValues, ctx.j); + !isValid) + { + JLOG(ctx.j.trace()) << "ContractCreate: InstanceParameters do not match what's in " + "the existing ContractSource ledger object."; + return temMALFORMED; + } + } + + return tesSUCCESS; +} + +TER +ContractCreate::doApply() +{ + auto const accountSle = ctx_.view().peek(keylet::account(account_)); + if (!accountSle) + { + JLOG(j_.trace()) << "ContractCreate: Account not found."; + return tefINTERNAL; // LCOV_EXCL_LINE + } + + std::shared_ptr sourceSle; + bool isInstall = ctx_.tx.isFieldPresent(sfContractHash); + auto contractHash = ctx_.tx[~sfContractHash]; + xrpl::Blob wasmBytes; + if (ctx_.tx.isFieldPresent(sfContractCode)) + { + wasmBytes = ctx_.tx.getFieldVL(sfContractCode); + contractHash = xrpl::sha512Half_s(xrpl::Slice(wasmBytes.data(), wasmBytes.size())); + if (ctx_.view().exists(keylet::contractSource(*contractHash))) + isInstall = true; + } + + if (isInstall) + { + sourceSle = ctx_.view().peek(keylet::contractSource(*contractHash)); + if (!sourceSle) + return tefINTERNAL; // LCOV_EXCL_LINE + + sourceSle->at(sfReferenceCount) = sourceSle->getFieldU64(sfReferenceCount) + 1; + ctx_.view().update(sourceSle); + } + else + { + sourceSle = std::make_shared(keylet::contractSource(*contractHash)); + sourceSle->at(sfContractHash) = *contractHash; + sourceSle->at(sfContractCode) = makeSlice(wasmBytes); + sourceSle->setFieldArray(sfFunctions, ctx_.tx.getFieldArray(sfFunctions)); + if (ctx_.tx.isFieldPresent(sfInstanceParameters)) + sourceSle->setFieldArray( + sfInstanceParameters, ctx_.tx.getFieldArray(sfInstanceParameters)); + sourceSle->at(sfReferenceCount) = 1; + + ctx_.view().insert(sourceSle); + } + + std::uint32_t const seq = ctx_.tx.getSeqValue(); + auto const contractKeylet = keylet::contract(*contractHash, account_, seq); + auto contractSle = std::make_shared(contractKeylet); + + auto maybePseudo = createPseudoAccount(view(), contractSle->key(), sfContractID); + if (!maybePseudo) + return maybePseudo.error(); // LCOV_EXCL_LINE + + auto& pseudoSle = *maybePseudo; + auto pseudoAccount = pseudoSle->at(sfAccount); + + contractSle->at(sfContractAccount) = pseudoAccount; + contractSle->at(sfOwner) = account_; + contractSle->at(sfFlags) = ctx_.tx.getFlags(); + contractSle->at(sfSequence) = seq; + contractSle->at(sfContractHash) = *contractHash; + if (ctx_.tx.isFieldPresent(sfInstanceParameterValues)) + contractSle->setFieldArray( + sfInstanceParameterValues, ctx_.tx.getFieldArray(sfInstanceParameterValues)); + + if (ctx_.tx.isFieldPresent(sfURI)) + contractSle->setFieldVL(sfURI, ctx_.tx.getFieldVL(sfURI)); + + ctx_.view().insert(contractSle); + + // Handle the instance parameters for the contract creation. + if (ctx_.tx.isFieldPresent(sfInstanceParameterValues)) + { + STArray const& params = ctx_.tx.getFieldArray(sfInstanceParameterValues); + + // Note: We have to do preclaim and apply here because we will only have + // the pseudo account after the contract is created. + if (auto ter = + contract::preclaimFlagParameters(ctx_.view(), account_, pseudoAccount, params, j_); + !isTesSuccess(ter)) + { + JLOG(j_.trace()) << "ContractCreate: Failed to preclaim flag parameters."; + return ter; + } + + if (auto ter = contract::doApplyFlagParameters( + ctx_.view(), ctx_.tx, account_, pseudoAccount, params, preFeeBalance_, j_); + !isTesSuccess(ter)) + { + JLOG(j_.trace()) << "ContractCreate: Failed to apply flag parameters."; + return ter; + } + } + + // Add Contract to ContractAccount Dir + // TODO: use dirLink + { + auto const page = view().dirInsert( + keylet::ownerDir(pseudoAccount), contractKeylet, describeOwnerDir(pseudoAccount)); + + if (!page) + return tecDIR_FULL; + + contractSle->setFieldU64(sfOwnerNode, *page); + adjustOwnerCount(ctx_.view(), pseudoSle, 1, j_); + } + + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/contract/ContractDelete.cpp b/src/libxrpl/tx/transactors/contract/ContractDelete.cpp new file mode 100644 index 00000000000..6b91cd7ca58 --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractDelete.cpp @@ -0,0 +1,149 @@ +#include +#include +#include +#include +#include + +namespace xrpl { + +NotTEC +ContractDelete::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + if (flags & tfUniversalMask) + { + JLOG(ctx.j.trace()) << "ContractDelete: only tfUniversalMask is allowed."; + return temINVALID_FLAG; + } + + return tesSUCCESS; +} + +TER +ContractDelete::preclaim(PreclaimContext const& ctx) +{ + AccountID const account = ctx.tx.getAccountID(sfAccount); + AccountID const contractAccount = + ctx.tx.isFieldPresent(sfContractAccount) ? ctx.tx.getAccountID(sfContractAccount) : account; + + auto const caSle = ctx.view.read(keylet::account(contractAccount)); + if (!caSle) + { + JLOG(ctx.j.trace()) << "ContractDelete: Account does not exist."; + return terNO_ACCOUNT; + } + + if (!caSle->isFieldPresent(sfContractID)) + { + JLOG(ctx.j.trace()) << "ContractDelete: Account is not a smart " + "contract pseudo-account."; + return tecNO_PERMISSION; + } + + uint256 const contractID = caSle->getFieldH256(sfContractID); + auto const contractSle = ctx.view.read(keylet::contract(contractID)); + if (!contractSle) + { + JLOG(ctx.j.trace()) << "ContractDelete: Contract does not exist."; + return tecNO_TARGET; + } + + if (contractSle->getAccountID(sfOwner) != account) + { + JLOG(ctx.j.trace()) << "ContractDelete: Cannot delete a contract that " + "does not belong to the account."; + return tecNO_PERMISSION; + } + + std::uint32_t flags = contractSle->getFlags(); + + // Check if the contract is undeletable. + if (flags & tfUndeletable) + { + JLOG(ctx.j.trace()) << "ContractDelete: Contract is undeletable."; + return tecNO_PERMISSION; + } + + AccountID const owner = contractSle->getAccountID(sfOwner); + if (auto const res = deletePreclaim(ctx, 0, account, owner, true); !isTesSuccess(res)) + return res; + return tesSUCCESS; +} + +TER +ContractDelete::deleteContract( + ApplyView& view, + std::shared_ptr const& sle, + AccountID const& account, + beast::Journal j) +{ + if (!sle) + return tecINTERNAL; // LCOV_EXCL_LINE + + if (!view.dirRemove(keylet::ownerDir(account), (*sle)[sfOwnerNode], sle->key(), false)) + { + // LCOV_EXCL_START + JLOG(j.trace()) << "Unable to delete Delegate from owner."; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP + } + + auto const sleOwner = view.peek(keylet::account(account)); + if (!sleOwner) + return tecINTERNAL; // LCOV_EXCL_LINE + + adjustOwnerCount(view, sleOwner, -1, j); + view.erase(sle); + return tesSUCCESS; +} + +TER +ContractDelete::doApply() +{ + AccountID const account = ctx_.tx.getAccountID(sfAccount); + AccountID const contractAccount = ctx_.tx.isFieldPresent(sfContractAccount) + ? ctx_.tx.getAccountID(sfContractAccount) + : account; + + auto const caSle = ctx_.view().read(keylet::account(contractAccount)); + if (!caSle) + { + JLOG(j_.trace()) << "ContractModify: Account does not exist."; + return tefBAD_LEDGER; + } + + uint256 const contractID = caSle->getFieldH256(sfContractID); + auto const contractSle = ctx_.view().read(keylet::contract(contractID)); + if (!contractSle) + { + JLOG(j_.trace()) << "ContractDelete: Contract does not exist."; + return tecNO_TARGET; + } + + // Lower the reference count of the ContractSource or remove the source from + // the ledger. + uint256 const contractHash = contractSle->getFieldH256(sfContractHash); + auto oldSourceSle = ctx_.view().peek(keylet::contractSource(contractHash)); + if (oldSourceSle->getFieldU64(sfReferenceCount) == 1) + { + // NOTE: We dont adjust the owner count because ContractSource is an + // unowned object. + ctx_.view().erase(oldSourceSle); + } + else + { + oldSourceSle->setFieldU64( + sfReferenceCount, oldSourceSle->getFieldU64(sfReferenceCount) - 1); + ctx_.view().update(oldSourceSle); + } + + AccountID const owner = contractSle->getAccountID(sfOwner); + STAmount const contractBalance = (*caSle)[sfBalance]; + if (auto const res = deleteDoApply(ctx_, contractBalance, contractAccount, owner); + !isTesSuccess(res)) + return res; + + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/contract/ContractModify.cpp b/src/libxrpl/tx/transactors/contract/ContractModify.cpp new file mode 100644 index 00000000000..e84e121cb45 --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractModify.cpp @@ -0,0 +1,352 @@ +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +XRPAmount +ContractModify::calculateBaseFee(ReadView const& view, STTx const& tx) +{ + XRPAmount const maxAmount{std::numeric_limits::max()}; + XRPAmount createFee{0}; + + if (tx.isFieldPresent(sfCreateCode)) + createFee = XRPAmount{contract::contractCreateFee(tx.getFieldVL(sfCreateCode).size())}; + + if (createFee > maxAmount - view.fees().increment) + { + JLOG(debugLog().trace()) << "ContractModify: Create fee overflow detected."; + return XRPAmount{INITIAL_XRP}; + } + + auto baseFee = Transactor::calculateBaseFee(view, tx); + if (baseFee > maxAmount - createFee) + { + JLOG(debugLog().trace()) << "ContractModify: Total fee overflow detected."; + return XRPAmount{INITIAL_XRP}; + } + + return createFee + baseFee; +} + +NotTEC +ContractModify::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + if (flags & tfUniversalMask) + { + JLOG(ctx.j.trace()) << "ContractModify: only tfUniversalMask is allowed."; + return temINVALID_FLAG; + } + + // Either ContractCode or ContractHash must be present. + if (ctx.tx.isFieldPresent(sfContractCode) && ctx.tx.isFieldPresent(sfContractHash)) + { + JLOG(ctx.j.trace()) << "ContractModify: Both ContractCode and ContractHash present"; + return temMALFORMED; + } + + // Validate Functions & Function Parameters. + if (auto const res = contract::preflightFunctions(ctx.tx, ctx.j); !isTesSuccess(res)) + return res; + + // Validate Instance Parameters. + if (auto const res = contract::preflightInstanceParameters(ctx.tx, ctx.j); !isTesSuccess(res)) + return res; + + // Validate Instance Parameter Values. + if (auto const res = contract::preflightInstanceParameterValues(ctx.tx, ctx.j); + !isTesSuccess(res)) + return res; + + if (ctx.tx.isFieldPresent(sfOwner)) + { + if (ctx.tx.getAccountID(sfOwner) == ctx.tx.getAccountID(sfAccount)) + return temMALFORMED; + + if (ctx.tx.getAccountID(sfOwner) == ctx.tx.getAccountID(sfContractAccount)) + return temMALFORMED; + } + + return tesSUCCESS; +} + +TER +ContractModify::preclaim(PreclaimContext const& ctx) +{ + AccountID const account = ctx.tx.getAccountID(sfAccount); + AccountID const contractAccount = + ctx.tx.isFieldPresent(sfContractAccount) ? ctx.tx.getAccountID(sfContractAccount) : account; + + auto const contractAccountSle = ctx.view.read(keylet::account(contractAccount)); + if (!contractAccountSle) + { + JLOG(ctx.j.trace()) << "ContractModify: Contract Account does not exist."; + return tecNO_TARGET; + } + + uint256 const contractID = contractAccountSle->getFieldH256(sfContractID); + auto const contractSle = ctx.view.read(keylet::contract(contractID)); + if (!contractSle) + { + JLOG(ctx.j.trace()) << "ContractModify: Contract does not exist."; + return tecNO_TARGET; + } + + if (ctx.tx.isFieldPresent(sfContractAccount) && contractSle->getAccountID(sfOwner) != account) + { + JLOG(ctx.j.trace()) << "ContractModify: Cannot modify a contract that " + "does not belong to the account."; + return tecNO_PERMISSION; + } + + std::uint32_t flags = contractSle->getFlags(); + + // Check if the contract is immutable. + if (flags & tfImmutable) + { + JLOG(ctx.j.trace()) << "ContractModify: Contract is immutable."; + return tecNO_PERMISSION; + } + + // Check if the contract code is immutable. + if (flags & tfCodeImmutable && ctx.tx.isFieldPresent(sfContractCode)) + { + JLOG(ctx.j.trace()) << "ContractModify: ContractCode is immutable."; + return tecNO_PERMISSION; + } + + // Check if the contract ABI is immutable. + if (flags & tfABIImmutable) + { + if (!ctx.tx.isFieldPresent(sfContractCode)) + { + JLOG(ctx.j.trace()) << "ContractModify: ContractCode must be " + "present when modifying ABI."; + return tecNO_PERMISSION; + } + + if (!ctx.tx.isFieldPresent(sfFunctions)) + { + JLOG(ctx.j.trace()) << "ContractModify: Functions must be present " + "when modifying ABI."; + return tecNO_PERMISSION; + } + + JLOG(ctx.j.trace()) << "ContractModify: ABI is immutable."; + return tecNO_PERMISSION; + } + + // Can only include 1 of the 3 flags: tfCodeImmutable, tfABIImmutable, + // tfImmutable. + if ((flags & (tfCodeImmutable | tfABIImmutable | tfImmutable)) > tfImmutable) + { + JLOG(ctx.j.trace()) << "ContractModify: Cannot set more than one immutability flag."; + return temINVALID_FLAG; + } + + bool isInstall = ctx.tx.isFieldPresent(sfContractHash); + auto contractHash = ctx.tx.at(~sfContractHash); + if (ctx.tx.isFieldPresent(sfContractCode)) + { + xrpl::Blob wasmBytes = ctx.tx.getFieldVL(sfContractCode); + if (wasmBytes.empty()) + { + JLOG(ctx.j.trace()) << "ContractModify: ContractCode provided is empty."; + return temMALFORMED; + } + + contractHash = xrpl::sha512Half_s(xrpl::Slice(wasmBytes.data(), wasmBytes.size())); + if (ctx.view.exists(keylet::contractSource(*contractHash))) + isInstall = true; + + // Iterate through the functions and validate them? + // HostFunctions mock; + // auto const re = preflightEscrowWasm(wasmBytes, "finish", {}, &mock, + // ctx.j); if (!isTesSuccess(re)) + // { + // JLOG(ctx.j.debug()) << "EscrowCreate.FinishFunction bad WASM"; + // return re; + // } + } + + // The ABI provided in Functions doesn't match the code. + + if (isInstall) + { + auto const sle = ctx.view.read(keylet::contractSource(*contractHash)); + if (!sle) + { + JLOG(ctx.j.trace()) << "ContractModify: ContractSource ledger object not found for " + "the provided ContractHash."; + return tefINTERNAL; // LCOV_EXCL_LINE + } + + if (sle->isFieldPresent(sfInstanceParameters) && + !ctx.tx.isFieldPresent(sfInstanceParameterValues)) + { + JLOG(ctx.j.trace()) << "ContractModify: ContractHash is present, but " + "InstanceParameterValues is missing."; + return temMALFORMED; + } + + auto const& instanceParams = sle->getFieldArray(sfInstanceParameters); + auto const& instanceParamValues = ctx.tx.getFieldArray(sfInstanceParameterValues); + if (auto const isValid = + contract::validateParameterMapping(instanceParams, instanceParamValues, ctx.j); + !isValid) + { + JLOG(ctx.j.trace()) << "ContractModify: InstanceParameters do not match what's in " + "the existing ContractSource ledger object."; + return temMALFORMED; + } + } + + if (ctx.tx.isFieldPresent(sfOwner)) + { + auto const ownerSle = ctx.view.read(keylet::account(ctx.tx.getAccountID(sfOwner))); + if (!ownerSle) + { + JLOG(ctx.j.trace()) << "ContractModify: New owner account does not exist."; + return tecNO_TARGET; + } + } + + return tesSUCCESS; +} + +TER +ContractModify::doApply() +{ + AccountID const account = ctx_.tx.getAccountID(sfAccount); + AccountID const contractAccount = ctx_.tx.isFieldPresent(sfContractAccount) + ? ctx_.tx.getAccountID(sfContractAccount) + : account; + + auto const contractAccountSle = ctx_.view().read(keylet::account(contractAccount)); + if (!contractAccountSle) + { + JLOG(ctx_.journal.trace()) << "ContractModify: Account does not exist."; + return tefINTERNAL; + } + + uint256 const contractID = contractAccountSle->getFieldH256(sfContractID); + auto const contractSle = ctx_.view().peek(keylet::contract(contractID)); + if (!contractSle) + { + JLOG(ctx_.journal.trace()) << "ContractModify: Contract does not exist."; + return tefINTERNAL; + } + + auto currentSourceSle = + ctx_.view().peek(keylet::contractSource(contractSle->getFieldH256(sfContractHash))); + if (!currentSourceSle) + { + JLOG(ctx_.journal.trace()) << "ContractModify: ContractSource does not exist."; + return tefINTERNAL; + } + + if (ctx_.tx.isFieldPresent(sfContractCode)) + { + JLOG(ctx_.journal.trace()) << "ContractModify: Modifying ContractCode/ContractHash."; + xrpl::Blob wasmBytes = ctx_.tx.getFieldVL(sfContractCode); + auto const contractHash = + xrpl::sha512Half_s(xrpl::Slice(wasmBytes.data(), wasmBytes.size())); + auto const sourceKeylet = keylet::contractSource(contractHash); + auto sourceSle = ctx_.view().peek(sourceKeylet); + if (!sourceSle) + { + JLOG(ctx_.journal.trace()) << "ContractModify: Creating new ContractSource."; + // create the new ContractSource + sourceSle = std::make_shared(sourceKeylet); + sourceSle->at(sfContractHash) = contractHash; + sourceSle->at(sfContractCode) = makeSlice(wasmBytes); + sourceSle->setFieldArray(sfFunctions, ctx_.tx.getFieldArray(sfFunctions)); + if (ctx_.tx.isFieldPresent(sfInstanceParameters)) + sourceSle->setFieldArray( + sfInstanceParameters, ctx_.tx.getFieldArray(sfInstanceParameters)); + sourceSle->at(sfReferenceCount) = 1; + ctx_.view().insert(sourceSle); + } + + // update the Contract + contractSle->setFieldH256(sfContractHash, contractHash); + if (ctx_.tx.isFieldPresent(sfInstanceParameterValues)) + contractSle->setFieldArray( + sfInstanceParameterValues, ctx_.tx.getFieldArray(sfInstanceParameterValues)); + + ctx_.view().update(contractSle); + + // update the existing ContractSource + if (currentSourceSle->getFieldU64(sfReferenceCount) == 1) + { + // remove the old ContractSource if no more references + ctx_.view().erase(currentSourceSle); + } + else + { + // decrement the reference count + currentSourceSle->setFieldU64( + sfReferenceCount, currentSourceSle->getFieldU64(sfReferenceCount) - 1); + ctx_.view().update(currentSourceSle); + } + } + else if (ctx_.tx.isFieldPresent(sfContractHash)) + { + auto sourceSle = + ctx_.view().peek(keylet::contractSource(ctx_.tx.getFieldH256(sfContractHash))); + if (!sourceSle) + { + JLOG(ctx_.journal.trace()) << "ContractModify: ContractSource does not exist."; + return tefINTERNAL; + } + + // set new contract hash + contractSle->setFieldH256(sfContractHash, ctx_.tx.getFieldH256(sfContractHash)); + + // set new instance parameter values if present + if (ctx_.tx.isFieldPresent(sfInstanceParameterValues)) + contractSle->setFieldArray( + sfInstanceParameterValues, ctx_.tx.getFieldArray(sfInstanceParameterValues)); + + ctx_.view().update(contractSle); + + sourceSle->setFieldU64(sfReferenceCount, sourceSle->getFieldU64(sfReferenceCount) + 1); + ctx_.view().update(sourceSle); + + // update the existing ContractSource + if (currentSourceSle->getFieldU64(sfReferenceCount) == 1) + { + // remove the old ContractSource if no more references + ctx_.view().erase(currentSourceSle); + } + else + { + // decrement the reference count + currentSourceSle->setFieldU64( + sfReferenceCount, currentSourceSle->getFieldU64(sfReferenceCount) - 1); + ctx_.view().update(currentSourceSle); + } + } + else if (ctx_.tx.isFieldPresent(sfInstanceParameterValues)) + { + // only updating instance parameter values + contractSle->setFieldArray( + sfInstanceParameterValues, ctx_.tx.getFieldArray(sfInstanceParameterValues)); + + ctx_.view().update(contractSle); + } + + if (ctx_.tx.isFieldPresent(sfOwner)) + { + contractSle->setAccountID(sfOwner, ctx_.tx.getAccountID(sfOwner)); + ctx_.view().update(contractSle); + } + + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/contract/ContractUserDelete.cpp b/src/libxrpl/tx/transactors/contract/ContractUserDelete.cpp new file mode 100644 index 00000000000..22181c02d61 --- /dev/null +++ b/src/libxrpl/tx/transactors/contract/ContractUserDelete.cpp @@ -0,0 +1,32 @@ +#include +#include +#include + +namespace xrpl { + +NotTEC +ContractUserDelete::preflight(PreflightContext const& ctx) +{ + auto const flags = ctx.tx.getFlags(); + if (flags & tfUniversalMask) + { + JLOG(ctx.j.trace()) << "ContractUserDelete: tfUniversalMask is not allowed."; + return temINVALID_FLAG; + } + + return tesSUCCESS; +} + +TER +ContractUserDelete::preclaim(PreclaimContext const& ctx) +{ + return tesSUCCESS; +} + +TER +ContractUserDelete::doApply() +{ + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h b/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h index da6867e06ab..df4b7c651ed 100644 --- a/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h +++ b/src/libxrpl/tx/transactors/escrow/EscrowHelpers.h @@ -227,8 +227,11 @@ escrowUnlockApplyHelper( journal); } +// calculateAdditionalReserve computes the owner count impact of an Escrow. +// An escrow without a FinishFunction costs 1 reserve. With a FinishFunction, +// each additional 500 bytes beyond the first 500 adds another reserve slot. template -static uint32_t +inline uint32_t calculateAdditionalReserve(T const& finishFunction) { if (!finishFunction) diff --git a/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp index e061dbe7ec2..6e6ae925e01 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenAcceptOffer.cpp @@ -1,10 +1,10 @@ #include +#include #include #include #include #include #include -#include namespace xrpl { @@ -415,7 +415,7 @@ NFTokenAcceptOffer::acceptOffer(std::shared_ptr const& offer) } // Now transfer the NFT: - return transferNFToken(buyer, seller, nftokenID); + return nft::transferNFToken(ctx_.view(), buyer, seller, nftokenID); } TER @@ -538,7 +538,7 @@ NFTokenAcceptOffer::doApply() } // Now transfer the NFT: - return transferNFToken(buyer, seller, nftokenID); + return nft::transferNFToken(ctx_.view(), buyer, seller, nftokenID); } if (bo) diff --git a/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp b/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp index 5a31e35470c..9f425380d87 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenBurn.cpp @@ -1,8 +1,8 @@ +#include #include #include #include #include -#include namespace xrpl { diff --git a/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp index df0561e0762..2d6c59df4a3 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenCancelOffer.cpp @@ -1,8 +1,8 @@ #include +#include #include #include #include -#include #include diff --git a/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp b/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp index f5fdc895504..adc92fa11fe 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenCreateOffer.cpp @@ -1,8 +1,8 @@ #include +#include #include #include #include -#include namespace xrpl { @@ -38,6 +38,10 @@ NFTokenCreateOffer::preflight(PreflightContext const& ctx) TER NFTokenCreateOffer::preclaim(PreclaimContext const& ctx) { + auto const sle = ctx.view.read(keylet::account(ctx.tx[sfAccount])); + auto const balance = sle ? (*sle)[sfBalance] : XRPAmount{0}; + JLOG(ctx.j.error()) << "NFTokenCreateOffer::preclaim.Balance: " << balance; + if (hasExpired(ctx.view, ctx.tx[~sfExpiration])) return tecEXPIRED; diff --git a/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp b/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp index 8ccd4e95526..250f9c64d1a 100644 --- a/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp +++ b/src/libxrpl/tx/transactors/nft/NFTokenModify.cpp @@ -1,7 +1,7 @@ +#include #include #include #include -#include namespace xrpl { diff --git a/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp b/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp index 0ce0720ba06..73e2e854e0f 100644 --- a/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp +++ b/src/libxrpl/tx/transactors/system/LedgerStateFix.cpp @@ -1,8 +1,8 @@ #include +#include #include #include #include -#include #include namespace xrpl { diff --git a/src/libxrpl/tx/wasm/ContractContext.cpp b/src/libxrpl/tx/wasm/ContractContext.cpp new file mode 100644 index 00000000000..46dc773298a --- /dev/null +++ b/src/libxrpl/tx/wasm/ContractContext.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +namespace xrpl { + +std::vector +getParameterValueVec(STArray const& functionParameters) +{ + std::vector param_map; + for (auto const& param : functionParameters) + { + auto const& value = param.getFieldData(sfParameterValue); + param_map.emplace_back(value); + } + return param_map; +} + +std::vector +getParameterTypeVec(STArray const& functionParameters) +{ + std::vector param_map; + for (auto const& param : functionParameters) + { + auto const& type = param.getFieldDataType(sfParameterType); + param_map.emplace_back(type); + } + return param_map; +} + +} // namespace xrpl diff --git a/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp index ac002d723f3..5a0dfa01936 100644 --- a/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp +++ b/src/libxrpl/tx/wasm/HostFuncImplNFT.cpp @@ -1,6 +1,6 @@ +#include #include #include -#include #include namespace xrpl { diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index e420565727d..95ebe23f392 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -2,7 +2,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -1792,6 +1794,610 @@ floatLog_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) return returnResult(runtime, params, results, hf->floatLog(*x, *rounding), i); } +// Contract-specific host function wrappers + +wasm_trap_t* +instanceParam_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const iindex = getDataInt32(rt, params, index); + if (!iindex) + { + return hfResult(results, iindex.error()); + } + + auto const stTypeId = getDataInt32(rt, params, index); + if (!stTypeId) + { + return hfResult(results, stTypeId.error()); + } + + return returnResult(rt, params, results, hf->instanceParam(*iindex, *stTypeId), index); +} + +wasm_trap_t* +functionParam_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const iindex = getDataInt32(rt, params, index); + if (!iindex) + { + return hfResult(results, iindex.error()); + } + + auto const stTypeId = getDataInt32(rt, params, index); + if (!stTypeId) + { + return hfResult(results, stTypeId.error()); + } + + return returnResult(rt, params, results, hf->functionParam(*iindex, *stTypeId), index); +} + +wasm_trap_t* +getDataObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + if (params->data[5].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + return returnResult(rt, params, results, hf->getDataObjectField(*acc, *key), index); +} + +wasm_trap_t* +getDataNestedObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + if (params->data[5].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const nested = getDataString(rt, params, index); + if (!nested) + { + return hfResult(results, nested.error()); + } + + if (params->data[7].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + return returnResult( + rt, params, results, hf->getDataNestedObjectField(*acc, *key, *nested), index); +} + +wasm_trap_t* +getDataArrayElementField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + auto const elemIndex = getDataInt32(rt, params, index); + if (!elemIndex) + { + return hfResult(results, elemIndex.error()); + } + + if (params->data[6].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + return returnResult( + rt, params, results, hf->getDataArrayElementField(*acc, *elemIndex, *key), index); +} + +wasm_trap_t* +getDataNestedArrayElementField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + auto const elemIndex = getDataInt32(rt, params, index); + if (!elemIndex) + { + return hfResult(results, elemIndex.error()); + } + + if (params->data[6].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const nested = getDataString(rt, params, index); + if (!nested) + { + return hfResult(results, nested.error()); + } + + if (params->data[8].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + return returnResult( + rt, + params, + results, + hf->getDataNestedArrayElementField(*acc, *key, *elemIndex, *nested), + index); +} + +wasm_trap_t* +setDataObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + if (params->data[5].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + SerialIter valueSit(data->data(), data->size()); + STJson::Value const value = STJson::makeValueFromVLWithType(valueSit); + return returnResult(rt, params, results, hf->setDataObjectField(*acc, *key, value), index); +} + +wasm_trap_t* +setDataNestedObjectField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const nested = getDataString(rt, params, index); + if (!nested) + { + return hfResult(results, nested.error()); + } + + if (params->data[5].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + if (params->data[7].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + SerialIter valueSit(data->data(), data->size()); + STJson::Value const value = STJson::makeValueFromVLWithType(valueSit); + return returnResult( + rt, params, results, hf->setDataNestedObjectField(*acc, *nested, *key, value), index); +} + +wasm_trap_t* +setDataArrayElementField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + auto const elemIndex = getDataInt32(rt, params, index); + if (!elemIndex) + { + return hfResult(results, elemIndex.error()); + } + + if (params->data[6].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + SerialIter valueSit(data->data(), data->size()); + STJson::Value const value = STJson::makeValueFromVLWithType(valueSit); + return returnResult( + rt, params, results, hf->setDataArrayElementField(*acc, *elemIndex, *key, value), index); +} + +wasm_trap_t* +setDataNestedArrayElementField_wrap( + void* env, + wasm_val_vec_t const* params, + wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const acc = getDataAccountID(rt, params, index); + if (!acc) + { + return hfResult(results, acc.error()); + } + + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const key = getDataString(rt, params, index); + if (!key) + { + return hfResult(results, key.error()); + } + + auto const elemIndex = getDataInt32(rt, params, index); + if (!elemIndex) + { + return hfResult(results, elemIndex.error()); + } + + if (params->data[6].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const nested = getDataString(rt, params, index); + if (!nested) + { + return hfResult(results, nested.error()); + } + + if (params->data[8].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + SerialIter valueSit(data->data(), data->size()); + STJson::Value const value = STJson::makeValueFromVLWithType(valueSit); + return returnResult( + rt, + params, + results, + hf->setDataNestedArrayElementField(*acc, *key, *elemIndex, *nested, value), + index); +} + +wasm_trap_t* +buildTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const txnType = getDataInt32(rt, params, index); + if (!txnType) + { + return hfResult(results, txnType.error()); + } + + return returnResult(rt, params, results, hf->buildTxn(*txnType), index); +} + +wasm_trap_t* +addTxnField_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[3].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const txnIndex = getDataInt32(rt, params, index); + if (!txnIndex) + { + return hfResult(results, txnIndex.error()); + } + + auto const fname = getDataSField(rt, params, index); + if (!fname) + { + return hfResult(results, fname.error()); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + return returnResult(rt, params, results, hf->addTxnField(*txnIndex, *fname, *data), index); +} + +wasm_trap_t* +emitBuiltTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const txnIndex = getDataInt32(rt, params, index); + if (!txnIndex) + { + return hfResult(results, txnIndex.error()); + } + + return returnResult(rt, params, results, hf->emitBuiltTxn(*txnIndex), index); +} + +wasm_trap_t* +emitTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const slice = getDataSlice(rt, params, index); + if (!slice) + { + return hfResult(results, slice.error()); + } + + std::shared_ptr stpTrans; + try + { + stpTrans = std::make_shared(SerialIter{*slice}); + } + catch (std::exception& e) + { + std::cout << "Error creating STTx: " << e.what() << std::endl; + return hfResult(results, HostFunctionError::INTERNAL); + } + + return returnResult(rt, params, results, hf->emitTxn(stpTrans), index); +} + +wasm_trap_t* +emitEvent_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) +{ + auto* hf = getHF(env); + auto const* rt = reinterpret_cast(hf->getRT()); + int index = 0; + if (params->data[1].of.i32 > maxWasmDataLength) + { + return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); + } + + auto const name = getDataString(rt, params, index); + if (!name) + { + return hfResult(results, name.error()); + } + + auto const data = getDataSlice(rt, params, index); + if (!data) + { + return hfResult(results, data.error()); + } + + std::shared_ptr parsed; + try + { + parsed = STJson::fromBlob(data->data(), data->size()); + } + catch (std::exception const&) + { + return hfResult(results, HostFunctionError::INVALID_PARAMS); + } + + if (!parsed) + return hfResult(results, HostFunctionError::INVALID_PARAMS); + + return returnResult(rt, params, results, hf->emitEvent(*name, *parsed), index); +} + // LCOV_EXCL_START namespace test { diff --git a/src/libxrpl/tx/wasm/WasmVM.cpp b/src/libxrpl/tx/wasm/WasmVM.cpp index c8a1e270487..e0f5aeb063d 100644 --- a/src/libxrpl/tx/wasm/WasmVM.cpp +++ b/src/libxrpl/tx/wasm/WasmVM.cpp @@ -96,6 +96,28 @@ createWasmImport(HostFunctions& hfs) setCommonHostFunctions(&hfs, i); WASM_IMPORT_FUNC2(i, updateData, "update_data", &hfs, 1000); + // clang-format off + // Contract-specific host functions + WASM_IMPORT_FUNC2(i, instanceParam, "instance_param", &hfs, 100); + WASM_IMPORT_FUNC2(i, functionParam, "function_param", &hfs, 100); + + WASM_IMPORT_FUNC2(i, getDataObjectField, "get_data_object_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, getDataNestedObjectField, "get_data_nested_object_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, getDataArrayElementField, "get_data_array_element_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, getDataNestedArrayElementField, "get_data_nested_array_element_field", &hfs, 500); + + WASM_IMPORT_FUNC2(i, setDataObjectField, "set_data_object_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, setDataNestedObjectField, "set_data_nested_object_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, setDataArrayElementField, "set_data_array_element_field", &hfs, 500); + WASM_IMPORT_FUNC2(i, setDataNestedArrayElementField, "set_data_nested_array_element_field", &hfs, 500); + + WASM_IMPORT_FUNC2(i, buildTxn, "build_txn", &hfs, 200); + WASM_IMPORT_FUNC2(i, addTxnField, "add_txn_field", &hfs, 200); + WASM_IMPORT_FUNC2(i, emitBuiltTxn, "emit_built_txn", &hfs, 500); + WASM_IMPORT_FUNC2(i, emitTxn, "emit_txn", &hfs, 500); + WASM_IMPORT_FUNC2(i, emitEvent, "emit_event", &hfs, 500); + // clang-format on + return i; } diff --git a/src/test/app/ContractHostFuncImpl_test.cpp b/src/test/app/ContractHostFuncImpl_test.cpp new file mode 100644 index 00000000000..928070a34ff --- /dev/null +++ b/src/test/app/ContractHostFuncImpl_test.cpp @@ -0,0 +1,1379 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { +namespace test { + +static ApplyContext +createApplyContext( + test::jtx::Env& env, + OpenView& ov, + STTx const& tx = STTx(ttCONTRACT_CALL, [](STObject&) {})) +{ + ApplyContext ac{ + env.app(), ov, tx, tesSUCCESS, env.current()->fees().base, tapNONE, env.journal}; + return ac; +} + +struct ContractHostFuncImpl_test : public beast::unit_test::suite +{ + ContractContext + createContractContext( + ApplyContext& ac, + jtx::Account const& contract, + jtx::Account const& otxn, + uint256 const& contractHash = uint256{1}) + { + using namespace jtx; + xrpl::ContractDataMap dataMap; + xrpl::ContractEventMap eventMap; + std::vector instanceParameters; + std::vector functionParameters; + + uint256 const& txId = uint256{2}; + + auto const nextSequence = + ac.view().read(keylet::account(contract.id()))->getFieldU32(sfSequence); + + auto const k = keylet::contract(contractHash, otxn, 0); + return ContractContext{ + .applyCtx = ac, + .instanceParameters = instanceParameters, + .functionParameters = functionParameters, + .built_txns = {}, + .expected_etxn_count = 0, + .generation = 0, + .burden = 0, + .result = + { + .contractHash = contractHash, + .contractKeylet = k, + .contractSourceKeylet = k, + .contractAccountKeylet = k, + .contractAccount = contract.id(), + .nextSequence = nextSequence, + .otxnAccount = otxn.id(), + .otxnId = txId, + .exitCode = -1, + .dataMap = dataMap, + .eventMap = eventMap, + .changedDataCount = 0, + }, + }; + } + + // Helper function to create STJson::Value from different types + STJson::Value + createJsonValue(SerializedTypeID type, std::function addData) + { + Serializer s; + s.add8(static_cast(type)); + addData(s); + + SerialIter sit(s.peekData().data(), s.peekData().size()); + return STJson::makeValueFromVLWithType(sit); + } + + void + testInstanceParam() + { + testcase("instanceParam"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + // Add test instance parameters for all supported types + + // UINT8 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint8_t{0xFF})}); + + // UINT16 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint16_t{0xFFFF})}); + + // UINT32 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint32_t{0xFFFFFFFF})}); + + // UINT64 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint64_t{0x8000000000000000})}); + + // UINT128 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint128{1})}); + + // UINT160 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint160{1})}); + + // UINT192 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint192{1})}); + + // UINT256 + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, uint256{1})}); + + // VL (Variable Length) + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, Blob{0x01, 0x02, 0x03, 0x04, 0x05})}); + + // ACCOUNT + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, alice.id())}); + + // AMOUNT (XRP) + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, STAmount{100000})}); + + // AMOUNT (IOU) + contractCtx.instanceParameters.push_back( + ParameterValueVec{ + STData(sfParameterValue, STAmount{Issue{Currency{1}, AccountID{2}}, 1000})}); + + // AMOUNT (MPT) + MPTIssue const mpt{MPTIssue{makeMptID(1, AccountID(0x4985601))}}; + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, STAmount{mpt, 1000})}); + + // NUMBER + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, numberFromJson(sfNumber, "42.5"))}); + + // ISSUE + // STIssue{sfAsset2, MPTIssue{mptId} + auto const iouAsset = env.master["USD"]; + contractCtx.instanceParameters.push_back( + ParameterValueVec{STData(sfParameterValue, STIssue{sfAsset, iouAsset.issue()})}); + + // CURRENCY + contractCtx.instanceParameters.push_back( + ParameterValueVec{ + STData(sfParameterValue, STCurrency{sfBaseAsset, iouAsset.issue().currency})}); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test UINT8 + { + auto result = cfs.instanceParam(0, STI_UINT8); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 1); + BEAST_EXPECT(bytes[0] == 0xFF); + } + } + + // Test UINT16 + { + auto result = cfs.instanceParam(1, STI_UINT16); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 2); + BEAST_EXPECT(bytes[0] == 0xFF); + BEAST_EXPECT(bytes[1] == 0xFF); + } + } + + // Test UINT32 + { + auto result = cfs.instanceParam(2, STI_UINT32); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 4); + BEAST_EXPECT(bytes[0] == 0xFF); + BEAST_EXPECT(bytes[1] == 0xFF); + BEAST_EXPECT(bytes[2] == 0xFF); + BEAST_EXPECT(bytes[3] == 0xFF); + } + } + + // Test UINT64 + { + auto result = cfs.instanceParam(3, STI_UINT64); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 8); + BEAST_EXPECT(bytes[0] == 0x00); + BEAST_EXPECT(bytes[7] == 0x80); + } + } + + // Test UINT128 + { + auto result = cfs.instanceParam(4, STI_UINT128); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == sizeof(uint128)); + BEAST_EXPECT(bytes[15] == 0x01); + } + } + + // Test UINT160 + { + auto result = cfs.instanceParam(5, STI_UINT160); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == sizeof(uint160)); + BEAST_EXPECT(bytes[19] == 0x01); + } + } + + // Test UINT192 + { + auto result = cfs.instanceParam(6, STI_UINT192); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == sizeof(uint192)); + BEAST_EXPECT(bytes[23] == 0x01); + } + } + + // Test UINT256 + { + auto result = cfs.instanceParam(7, STI_UINT256); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == sizeof(uint256)); + BEAST_EXPECT(bytes[31] == 0x01); + } + } + + // Test VL + { + auto result = cfs.instanceParam(8, STI_VL); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 5); + BEAST_EXPECT(bytes[0] == 0x01); + BEAST_EXPECT(bytes[4] == 0x05); + } + } + + // Test ACCOUNT + { + auto result = cfs.instanceParam(9, STI_ACCOUNT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 20); + } + } + + // Test AMOUNT (XRP) + { + auto result = cfs.instanceParam(10, STI_AMOUNT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 8); // Native amount + } + } + + // Test AMOUNT (IOU) + { + auto result = cfs.instanceParam(11, STI_AMOUNT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 48); // IOU amount + } + } + + // Test AMOUNT (MPT) + { + auto result = cfs.instanceParam(12, STI_AMOUNT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 33); // MPT amount + } + } + + // Test NUMBER + { + auto result = cfs.instanceParam(13, STI_NUMBER); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 12); + } + } + + // Test ISSUE + { + auto result = cfs.instanceParam(14, STI_ISSUE); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 40); + } + } + + // Test CURRENCY + { + auto result = cfs.instanceParam(15, STI_CURRENCY); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto& bytes = result.value(); + BEAST_EXPECT(bytes.size() == 20); + } + } + + // Test index out of bounds + { + auto result = cfs.instanceParam(16, STI_UINT32); + BEAST_EXPECT(!result.has_value()); + if (!result.has_value()) + BEAST_EXPECT(result.error() == HostFunctionError::INDEX_OUT_OF_BOUNDS); + } + + // Test type mismatch + { + auto result = cfs.instanceParam(0, STI_UINT64); // Index 0 is UINT8 + BEAST_EXPECT(!result.has_value()); + if (!result.has_value()) + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + + // Test unsupported types + { + auto result = cfs.instanceParam(2, STI_PATHSET); + BEAST_EXPECT(!result.has_value()); + if (!result.has_value()) + BEAST_EXPECT(result.error() == HostFunctionError::INVALID_PARAMS); + } + } + + void + testFunctionParam() + { + testcase("functionParam"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + // Add test function parameters (same as instance parameters for + // testing) [Similar parameter setup as instanceParam test...] + + ContractHostFunctionsImpl cfs(contractCtx); + + // [Similar tests as instanceParam but using functionParam method...] + } + + void + testContractDataFromKey() + { + testcase("contractDataFromKey"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const bob("bob"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, bob, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test setDataObjectField - string value + { + // Create a properly formatted STJson::Value for a VL (string) + auto value = createJsonValue(STI_VL, [](Serializer& s) { + s.addVL(Blob{0x61, 0x62, 0x63}); // "abc" + }); + + auto setResult = cfs.setDataObjectField(alice.id(), "name", value); + BEAST_EXPECT(!setResult.has_value()); + if (!setResult.has_value()) + BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + + // Verify data was cached and can be retrieved + auto getResult = cfs.getDataObjectField(alice.id(), "name"); + BEAST_EXPECT(getResult.has_value()); + if (getResult.has_value()) + { + auto& bytes = getResult.value(); + BEAST_EXPECT(bytes.size() > 0); + } + } + + // Test setDataObjectField - numeric value (UINT32) + { + auto value = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(30); }); + + auto setResult = cfs.setDataObjectField(alice.id(), "age", value); + BEAST_EXPECT(!setResult.has_value()); + if (!setResult.has_value()) + BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + + auto getResult = cfs.getDataObjectField(alice.id(), "age"); + BEAST_EXPECT(getResult.has_value()); + } + + // Test setDataObjectField - UINT8 value (for boolean-like) + { + auto value = createJsonValue(STI_UINT8, [](Serializer& s) { + s.add8(1); // true + }); + + auto setResult = cfs.setDataObjectField(alice.id(), "verified", value); + BEAST_EXPECT(!setResult.has_value()); + if (!setResult.has_value()) + BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + + auto getResult = cfs.getDataObjectField(alice.id(), "verified"); + BEAST_EXPECT(getResult.has_value()); + } + + // Test getting non-existent key + { + auto getResult = cfs.getDataObjectField(alice.id(), "nonexistent"); + BEAST_EXPECT(!getResult.has_value()); + if (!getResult.has_value()) + BEAST_EXPECT(getResult.error() == HostFunctionError::INVALID_FIELD); + } + + // Test updating existing key + { + auto value1 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(100); }); + auto setResult1 = cfs.setDataObjectField(bob.id(), "balance", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(200); }); + auto setResult2 = cfs.setDataObjectField(bob.id(), "balance", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto getResult = cfs.getDataObjectField(bob.id(), "balance"); + BEAST_EXPECT(getResult.has_value()); + } + + // Test multiple keys for same account + { + auto value1 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'v', 'a', 'l', 'u', 'e', '1'}; + s.addVL(data); + }); + auto setResult1 = cfs.setDataObjectField(alice.id(), "field1", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'v', 'a', 'l', 'u', 'e', '2'}; + s.addVL(data); + }); + auto setResult2 = cfs.setDataObjectField(alice.id(), "field2", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto value3 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(123); }); + auto setResult3 = cfs.setDataObjectField(alice.id(), "field3", value3); + BEAST_EXPECT(!setResult3.has_value()); + + // Verify all keys exist + auto getResult1 = cfs.getDataObjectField(alice.id(), "field1"); + BEAST_EXPECT(getResult1.has_value()); + + auto getResult2 = cfs.getDataObjectField(alice.id(), "field2"); + BEAST_EXPECT(getResult2.has_value()); + + auto getResult3 = cfs.getDataObjectField(alice.id(), "field3"); + BEAST_EXPECT(getResult3.has_value()); + } + } + + void + testNestedContractDataFromKey() + { + testcase("nestedContractDataFromKey"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const bob("bob"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, bob, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test setDataNestedObjectField + { + auto value = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'A', 'l', 'i', 'c', 'e'}; + s.addVL(data); + }); + + auto setResult = + cfs.setDataNestedObjectField(alice.id(), "profile", "firstName", value); + BEAST_EXPECT(!setResult.has_value()); + if (!setResult.has_value()) + BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + + // Add more nested fields + auto value2 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'S', 'm', 'i', 't', 'h'}; + s.addVL(data); + }); + auto setResult2 = + cfs.setDataNestedObjectField(alice.id(), "profile", "lastName", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto value3 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(25); }); + auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "profile", "age", value3); + BEAST_EXPECT(!setResult3.has_value()); + + // Retrieve nested fields + auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "profile", "firstName"); + BEAST_EXPECT(getResult1.has_value()); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "profile", "lastName"); + BEAST_EXPECT(getResult2.has_value()); + + auto getResult3 = cfs.getDataNestedObjectField(alice.id(), "profile", "age"); + BEAST_EXPECT(getResult3.has_value()); + } + + // Test nested objects with different parent keys + { + auto value1 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'d', 'a', 'r', 'k'}; + s.addVL(data); + }); + auto setResult1 = cfs.setDataNestedObjectField(alice.id(), "settings", "theme", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_UINT8, [](Serializer& s) { + s.add8(1); // true + }); + auto setResult2 = + cfs.setDataNestedObjectField(alice.id(), "settings", "notifications", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto value3 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'e', 'n'}; + s.addVL(data); + }); + auto setResult3 = + cfs.setDataNestedObjectField(alice.id(), "preferences", "language", value3); + BEAST_EXPECT(!setResult3.has_value()); + + // Verify nested data retrieval + auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "settings", "theme"); + BEAST_EXPECT(getResult1.has_value()); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "settings", "notifications"); + BEAST_EXPECT(getResult2.has_value()); + + auto getResult3 = cfs.getDataNestedObjectField(alice.id(), "preferences", "language"); + BEAST_EXPECT(getResult3.has_value()); + } + + // Test getting non-existent nested key + { + auto getResult = cfs.getDataNestedObjectField(alice.id(), "nonexistent", "key"); + BEAST_EXPECT(!getResult.has_value()); + if (!getResult.has_value()) + BEAST_EXPECT(getResult.error() == HostFunctionError::INVALID_FIELD); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "profile", "nonexistent"); + BEAST_EXPECT(!getResult2.has_value()); + if (!getResult2.has_value()) + BEAST_EXPECT(getResult2.error() == HostFunctionError::INVALID_FIELD); + } + + // Test updating existing nested key + { + auto value1 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(100); }); + auto setResult1 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(150); }); + auto setResult2 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto getResult = cfs.getDataNestedObjectField(bob.id(), "stats", "score"); + BEAST_EXPECT(getResult.has_value()); + } + } + + void + testNestedContractDataFromArrayKey() + { + testcase("nestedContractDataFromArrayKey"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const bob("bob"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, bob, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test setDataNestedObjectField + { + auto value = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'A', 'l', 'i', 'c', 'e'}; + s.addVL(data); + }); + + auto setResult = + cfs.setDataNestedObjectField(alice.id(), "profile", "firstName", value); + BEAST_EXPECT(!setResult.has_value()); + if (!setResult.has_value()) + BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + + // Add more nested fields + auto value2 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'S', 'm', 'i', 't', 'h'}; + s.addVL(data); + }); + auto setResult2 = + cfs.setDataNestedObjectField(alice.id(), "profile", "lastName", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto value3 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(25); }); + auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "profile", "age", value3); + BEAST_EXPECT(!setResult3.has_value()); + + // Retrieve nested fields + auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "profile", "firstName"); + BEAST_EXPECT(getResult1.has_value()); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "profile", "lastName"); + BEAST_EXPECT(getResult2.has_value()); + + auto getResult3 = cfs.getDataNestedObjectField(alice.id(), "profile", "age"); + BEAST_EXPECT(getResult3.has_value()); + } + + // Test nested objects with different parent keys + { + auto value1 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'d', 'a', 'r', 'k'}; + s.addVL(data); + }); + auto setResult1 = cfs.setDataNestedObjectField(alice.id(), "settings", "theme", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_UINT8, [](Serializer& s) { + s.add8(1); // true + }); + auto setResult2 = + cfs.setDataNestedObjectField(alice.id(), "settings", "notifications", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto value3 = createJsonValue(STI_VL, [](Serializer& s) { + Blob data = {'e', 'n'}; + s.addVL(data); + }); + auto setResult3 = + cfs.setDataNestedObjectField(alice.id(), "preferences", "language", value3); + BEAST_EXPECT(!setResult3.has_value()); + + // Verify nested data retrieval + auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "settings", "theme"); + BEAST_EXPECT(getResult1.has_value()); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "settings", "notifications"); + BEAST_EXPECT(getResult2.has_value()); + + auto getResult3 = cfs.getDataNestedObjectField(alice.id(), "preferences", "language"); + BEAST_EXPECT(getResult3.has_value()); + } + + // Test getting non-existent nested key + { + auto getResult = cfs.getDataNestedObjectField(alice.id(), "nonexistent", "key"); + BEAST_EXPECT(!getResult.has_value()); + if (!getResult.has_value()) + BEAST_EXPECT(getResult.error() == HostFunctionError::INVALID_FIELD); + + auto getResult2 = cfs.getDataNestedObjectField(alice.id(), "profile", "nonexistent"); + BEAST_EXPECT(!getResult2.has_value()); + if (!getResult2.has_value()) + BEAST_EXPECT(getResult2.error() == HostFunctionError::INVALID_FIELD); + } + + // Test updating existing nested key + { + auto value1 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(100); }); + auto setResult1 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value1); + BEAST_EXPECT(!setResult1.has_value()); + + auto value2 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(150); }); + auto setResult2 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value2); + BEAST_EXPECT(!setResult2.has_value()); + + auto getResult = cfs.getDataNestedObjectField(bob.id(), "stats", "score"); + BEAST_EXPECT(getResult.has_value()); + } + } + + void + testBuildTxn() + { + testcase("buildTxn"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test building a Payment transaction + { + auto result = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto txIndex = result.value(); + BEAST_EXPECT(txIndex == 0); + BEAST_EXPECT(contractCtx.built_txns.size() == 1); + + // Verify the transaction has required fields + auto& txn = contractCtx.built_txns[0]; + BEAST_EXPECT(txn.isFieldPresent(sfTransactionType)); + BEAST_EXPECT(txn.getFieldU16(sfTransactionType) == ttPAYMENT); + BEAST_EXPECT(txn.isFieldPresent(sfAccount)); + BEAST_EXPECT(txn.getAccountID(sfAccount) == contract.id()); + BEAST_EXPECT(txn.isFieldPresent(sfSequence)); + BEAST_EXPECT(txn.getFieldU32(sfSequence) == 1); + BEAST_EXPECT(txn.isFieldPresent(sfFee)); + BEAST_EXPECT(txn.getFieldAmount(sfFee) == XRP(0)); + BEAST_EXPECT(txn.isFieldPresent(sfFlags)); + BEAST_EXPECT(txn.getFieldU32(sfFlags) == 536870912); + + // Verify sequence incremented + BEAST_EXPECT(contractCtx.result.nextSequence == 2); + } + } + + // Test building an AccountSet transaction + { + auto result = cfs.buildTxn(ttACCOUNT_SET); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto txIndex = result.value(); + BEAST_EXPECT(txIndex == 1); + BEAST_EXPECT(contractCtx.built_txns.size() == 2); + + auto& txn = contractCtx.built_txns[1]; + BEAST_EXPECT(txn.getFieldU16(sfTransactionType) == ttACCOUNT_SET); + BEAST_EXPECT(txn.getFieldU32(sfSequence) == 2); + BEAST_EXPECT(contractCtx.result.nextSequence == 3); + } + } + + // Test building a TrustSet transaction + { + auto result = cfs.buildTxn(ttTRUST_SET); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + auto txIndex = result.value(); + BEAST_EXPECT(txIndex == 2); + BEAST_EXPECT(contractCtx.built_txns.size() == 3); + + auto& txn = contractCtx.built_txns[2]; + BEAST_EXPECT(txn.getFieldU16(sfTransactionType) == ttTRUST_SET); + } + } + + // Test building multiple transactions in sequence + { + auto initialSize = contractCtx.built_txns.size(); + auto initialSeq = contractCtx.result.nextSequence; + + for (int i = 0; i < 5; ++i) + { + auto result = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == initialSize + i); + } + } + + BEAST_EXPECT(contractCtx.built_txns.size() == initialSize + 5); + BEAST_EXPECT(contractCtx.result.nextSequence == initialSeq + 5); + } + } + + void + testAddTxnField() + { + testcase("addTxnField"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const bob("bob"); + Account const contract("contract"); + Account const otxn("otxn"); + env.fund(XRP(10000), alice, bob, contract, otxn); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, otxn); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Build a Payment transaction to add fields to + auto buildResult = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(buildResult.has_value()); + if (!buildResult.has_value()) + return; + + uint32_t txIndex = buildResult.value(); + + // Test adding Destination (AccountID) with 0x14 prefix + { + AccountID data = bob.id(); + // Prepend the required type byte 0x14 before the 20-byte AccountID + Blob buf; + buf.reserve(1 + data.size()); + buf.push_back(0x14); + buf.insert(buf.end(), data.begin(), data.end()); + auto const s = Slice{buf.data(), buf.size()}; + auto result = cfs.addTxnField(txIndex, sfDestination, s); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[txIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfDestination)); + BEAST_EXPECT(txn.getAccountID(sfDestination) == bob.id()); + } + } + + // Test adding Amount (STAmount - XRP) + { + STAmount amount{XRP(1000)}; + Serializer s; + amount.add(s); + auto result = cfs.addTxnField(txIndex, sfAmount, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[txIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfAmount)); + BEAST_EXPECT(txn.getFieldAmount(sfAmount) == amount); + } + } + + // Test adding SendMax (STAmount - IOU) + { + auto const USD = alice["USD"]; + STAmount sendMax{USD.issue(), 500}; + Serializer s; + sendMax.add(s); + auto result = cfs.addTxnField(txIndex, sfSendMax, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[txIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfSendMax)); + BEAST_EXPECT(txn.getFieldAmount(sfSendMax) == sendMax); + } + } + + // Test adding DestinationTag (UInt32) + { + uint32_t tag = 12345; + Serializer s; + s.add32(tag); + auto result = cfs.addTxnField(txIndex, sfDestinationTag, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[txIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfDestinationTag)); + BEAST_EXPECT(txn.getFieldU32(sfDestinationTag) == tag); + } + } + + // Build a TrustSet transaction for testing additional fields + auto trustBuildResult = cfs.buildTxn(ttTRUST_SET); + BEAST_EXPECT(trustBuildResult.has_value()); + if (trustBuildResult.has_value()) + { + uint32_t trustIndex = trustBuildResult.value(); + + // Test adding LimitAmount (STAmount for TrustSet) + { + auto const EUR = alice["EUR"]; + STAmount limit{EUR.issue(), 10000}; + Serializer s; + limit.add(s); + auto result = cfs.addTxnField(trustIndex, sfLimitAmount, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[trustIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfLimitAmount)); + BEAST_EXPECT(txn.getFieldAmount(sfLimitAmount) == limit); + } + } + + // Test adding QualityIn (UInt32) + { + uint32_t quality = 1000000; + Serializer s; + s.add32(quality); + auto result = cfs.addTxnField(trustIndex, sfQualityIn, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[trustIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfQualityIn)); + BEAST_EXPECT(txn.getFieldU32(sfQualityIn) == quality); + } + } + } + + // Build an AccountSet transaction for testing more fields + auto accSetResult = cfs.buildTxn(ttACCOUNT_SET); + BEAST_EXPECT(accSetResult.has_value()); + if (accSetResult.has_value()) + { + uint32_t accSetIndex = accSetResult.value(); + + // Test adding Domain (Blob/VL) + { + Blob domain = {'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm'}; + Serializer s; + s.addVL(domain); + auto result = cfs.addTxnField(accSetIndex, sfDomain, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[accSetIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfDomain)); + BEAST_EXPECT(txn.getFieldVL(sfDomain) == domain); + } + } + + // Test adding TransferRate (UInt32) + { + uint32_t fee = 500; + Serializer s; + s.add32(fee); + auto result = cfs.addTxnField(accSetIndex, sfTransferRate, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[accSetIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfTransferRate)); + BEAST_EXPECT(txn.getFieldU32(sfTransferRate) == fee); + } + } + + // Test adding SetFlag (UInt32) + { + uint32_t flag = 8; // asfRequireAuth + Serializer s; + s.add32(flag); + auto result = cfs.addTxnField(accSetIndex, sfSetFlag, s.slice()); + BEAST_EXPECT(result.has_value()); + if (result.has_value()) + { + BEAST_EXPECT(result.value() == 0); + auto& txn = contractCtx.built_txns[accSetIndex]; + BEAST_EXPECT(txn.isFieldPresent(sfSetFlag)); + BEAST_EXPECT(txn.getFieldU32(sfSetFlag) == flag); + } + } + } + + // Test error cases + + // Test adding field to non-existent transaction + { + Serializer s; + s.add32(123); + auto result = cfs.addTxnField(9999, sfDestinationTag, s.slice()); + BEAST_EXPECT(!result.has_value()); + // The implementation will likely throw or return an error + // when accessing out-of-bounds index + } + + // // Test adding invalid field for transaction type + // // Note: The current implementation checks against ttCONTRACT_CALL + // // format which might need adjustment for proper field validation + // { + // auto paymentResult = cfs.buildTxn(ttPAYMENT); + // if (paymentResult.has_value()) + // { + // uint32_t payIndex = paymentResult.value(); + + // // Try to add a field that doesn't belong to Payment + // // This test might need adjustment based on actual field + // // validation + // Serializer s; + // s.add32(100); + // // Using an obscure field that likely isn't in Payment format + // auto result = cfs.addTxnField(payIndex, sfTickSize, + // s.slice()); + // // The result depends on implementation's field validation + // BEAST_EXPECT(result.has_value()); + // } + // } + } + + void + testEmitBuiltTxn() + { + testcase("emitBuiltTxn"); + using namespace test::jtx; + + Env env{*this}; + Account const alice("alice"); + Account const bob("bob"); + Account const carol("carol"); + Account const contract("contract"); + env.fund(XRP(10000), alice, bob, carol, contract); + env.close(); + + OpenView ov{*env.current()}; + ApplyContext ac = createApplyContext(env, ov); + + auto contractCtx = createContractContext(ac, contract, alice); + + ContractHostFunctionsImpl cfs(contractCtx); + + // Test emitting a valid Payment transaction + { + // Build a Payment transaction + auto buildResult = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(buildResult.has_value()); + if (!buildResult.has_value()) + return; + + uint32_t txIndex = buildResult.value(); + + // Add required fields for Payment + AccountID destAccount = bob.id(); + Blob destBuf; + destBuf.reserve(1 + destAccount.size()); + destBuf.push_back(0x14); // Type prefix for AccountID + destBuf.insert(destBuf.end(), destAccount.begin(), destAccount.end()); + auto destResult = + cfs.addTxnField(txIndex, sfDestination, Slice{destBuf.data(), destBuf.size()}); + BEAST_EXPECT(destResult.has_value()); + + // Add Amount field + STAmount amount{XRP(100)}; + Serializer amtSerializer; + amount.add(amtSerializer); + auto amtResult = cfs.addTxnField(txIndex, sfAmount, amtSerializer.slice()); + BEAST_EXPECT(amtResult.has_value()); + + // Emit the transaction + auto emitResult = cfs.emitBuiltTxn(txIndex); + BEAST_EXPECT(emitResult.has_value()); + if (emitResult.has_value()) + { + // Check that the transaction was added to emitted transactions + BEAST_EXPECT(contractCtx.result.emittedTxns.size() == 1); + + // The result should be a TER code converted to int + int32_t terCode = emitResult.value(); + // We expect a success code + BEAST_EXPECT(terCode == 0); + } + } + + // // Test emitting multiple transactions + // { + // // Build first transaction - Payment + // auto build1 = cfs.buildTxn(ttPAYMENT); + // BEAST_EXPECT(build1.has_value()); + // if (build1.has_value()) + // { + // uint32_t tx1 = build1.value(); + + // // Add fields for first payment + // AccountID dest1 = alice.id(); + // Blob dest1Buf; + // dest1Buf.reserve(1 + dest1.size()); + // dest1Buf.push_back(0x14); + // dest1Buf.insert(dest1Buf.end(), dest1.begin(), dest1.end()); + // auto const result = cfs.addTxnField( + // tx1, + // sfDestination, + // Slice{dest1Buf.data(), dest1Buf.size()}); + // BEAST_EXPECT(result.has_value()); + + // STAmount amt1{XRP(50)}; + // Serializer amt1Ser; + // amt1.add(amt1Ser); + // cfs.addTxnField(tx1, sfAmount, amt1Ser.slice()); + // } + + // // Build second transaction - Another Payment + // auto build2 = cfs.buildTxn(ttPAYMENT); + // BEAST_EXPECT(build2.has_value()); + // if (build2.has_value()) + // { + // uint32_t tx2 = build2.value(); + + // // Add fields for second payment + // AccountID dest2 = carol.id(); + // Blob dest2Buf; + // dest2Buf.reserve(1 + dest2.size()); + // dest2Buf.push_back(0x14); + // dest2Buf.insert(dest2Buf.end(), dest2.begin(), dest2.end()); + // auto const result = cfs.addTxnField( + // tx2, + // sfDestination, + // Slice{dest2Buf.data(), dest2Buf.size()}); + // BEAST_EXPECT(result.has_value()); + + // STAmount amt2{XRP(75)}; + // Serializer amt2Ser; + // amt2.add(amt2Ser); + // cfs.addTxnField(tx2, sfAmount, amt2Ser.slice()); + // } + + // // Emit both transactions + // if (build1.has_value()) + // { + // auto emit1 = cfs.emitBuiltTxn(build1.value()); + // BEAST_EXPECT(emit1.has_value()); + // } + + // if (build2.has_value()) + // { + // auto emit2 = cfs.emitBuiltTxn(build2.value()); + // BEAST_EXPECT(emit2.has_value()); + // } + + // // Check that both were added to emitted transactions + // // (Note: actual count depends on previous test state) + // BEAST_EXPECT(contractCtx.result.emittedTxns.size() >= 2); + // } + + // // Test emitting transaction with invalid index + // { + // auto emitResult = cfs.emitBuiltTxn(9999); + // BEAST_EXPECT(!emitResult.has_value()); + // if (!emitResult.has_value()) + // { + // BEAST_EXPECT( + // emitResult.error() == + // HostFunctionError::INDEX_OUT_OF_BOUNDS); + // } + // } + + // // Test emitting AccountSet transaction + // { + // auto buildResult = cfs.buildTxn(ttACCOUNT_SET); + // BEAST_EXPECT(buildResult.has_value()); + // if (buildResult.has_value()) + // { + // uint32_t txIndex = buildResult.value(); + + // // Add optional fields for AccountSet + // uint32_t setFlag = 8; // asfRequireAuth + // Serializer flagSer; + // flagSer.add32(setFlag); + // auto flagResult = + // cfs.addTxnField(txIndex, sfSetFlag, flagSer.slice()); + // BEAST_EXPECT(flagResult.has_value()); + + // // Emit the transaction + // auto emitResult = cfs.emitBuiltTxn(txIndex); + // BEAST_EXPECT(emitResult.has_value()); + // } + // } + + // // Test emitting TrustSet transaction + // { + // auto buildResult = cfs.buildTxn(ttTRUST_SET); + // BEAST_EXPECT(buildResult.has_value()); + // if (buildResult.has_value()) + // { + // uint32_t txIndex = buildResult.value(); + + // // Add LimitAmount field (required for TrustSet) + // auto const USD = alice["USD"]; + // STAmount limit{USD.issue(), 1000}; + // Serializer limitSer; + // limit.add(limitSer); + // auto limitResult = + // cfs.addTxnField(txIndex, sfLimitAmount, + // limitSer.slice()); + // BEAST_EXPECT(limitResult.has_value()); + + // // Emit the transaction + // auto emitResult = cfs.emitBuiltTxn(txIndex); + // BEAST_EXPECT(emitResult.has_value()); + // } + // } + + // // Test emitting transaction without required fields + // { + // // Build a Payment but don't add required fields + // auto buildResult = cfs.buildTxn(ttPAYMENT); + // BEAST_EXPECT(buildResult.has_value()); + // if (buildResult.has_value()) + // { + // uint32_t txIndex = buildResult.value(); + + // // Try to emit without Destination and Amount + // auto emitResult = cfs.emitBuiltTxn(txIndex); + // BEAST_EXPECT(emitResult.has_value()); + // if (emitResult.has_value()) + // { + // // Should get an error code indicating missing fields + // int32_t terCode = emitResult.value(); + // // The transaction should fail validation + // BEAST_EXPECT(terCode != + // static_cast(tesSUCCESS)); + // } + // } + // } + + // // Test sequence of build and emit operations + // { + // auto initialEmittedCount = contractCtx.result.emittedTxns.size(); + + // // Build several transactions + // std::vector indices; + // for (int i = 0; i < 3; ++i) + // { + // auto buildResult = cfs.buildTxn(ttACCOUNT_SET); + // BEAST_EXPECT(buildResult.has_value()); + // if (buildResult.has_value()) + // { + // indices.push_back(buildResult.value()); + // } + // } + + // // Emit them in reverse order + // for (auto it = indices.rbegin(); it != indices.rend(); ++it) + // { + // auto emitResult = cfs.emitBuiltTxn(*it); + // BEAST_EXPECT(emitResult.has_value()); + // } + + // // Check that all were emitted + // BEAST_EXPECT( + // contractCtx.result.emittedTxns.size() == + // initialEmittedCount + indices.size()); + // } + } + + void + run() override + { + using namespace test::jtx; + // testInstanceParam(); + // testFunctionParam(); + // testContractDataFromKey(); + // testNestedContractDataFromKey(); + testNestedContractDataFromArrayKey(); + // testBuildTxn(); + // testAddTxnField(); + // testEmitBuiltTxn(); + } +}; + +BEAST_DEFINE_TESTSUITE(ContractHostFuncImpl, app, xrpl); + +} // namespace test +} // namespace xrpl diff --git a/src/test/app/Contract_test.cpp b/src/test/app/Contract_test.cpp new file mode 100644 index 00000000000..ca3cb599741 --- /dev/null +++ b/src/test/app/Contract_test.cpp @@ -0,0 +1,2025 @@ +#include +#include +#include + +#include +#include +#include + +namespace xrpl { +namespace test { + +class Contract_test : public beast::unit_test::suite +{ + struct TestLedgerData + { + int index; + std::string txType; + std::string result; + }; + + Json::Value + getLastLedger(jtx::Env& env) + { + Json::Value params; + params[jss::ledger_index] = env.closed()->seq(); + params[jss::transactions] = true; + params[jss::expand] = true; + return env.rpc("json", "ledger", to_string(params)); + } + + Json::Value + getTxByIndex(Json::Value const& jrr, int const index) + { + for (auto const& txn : jrr[jss::result][jss::ledger][jss::transactions]) + { + if (txn[jss::metaData][sfTransactionIndex.jsonName] == index) + return txn; + } + return {}; + } + + void + validateClosedLedger(jtx::Env& env, std::vector const& ledgerResults) + { + auto const jrr = getLastLedger(env); + auto const transactions = jrr[jss::result][jss::ledger][jss::transactions]; + BEAST_EXPECT(transactions.size() == ledgerResults.size()); + for (TestLedgerData const& ledgerResult : ledgerResults) + { + auto const txn = getTxByIndex(jrr, ledgerResult.index); + BEAST_EXPECT(txn.isMember(jss::metaData)); + Json::Value const meta = txn[jss::metaData]; + BEAST_EXPECT(txn[sfTransactionType.jsonName] == ledgerResult.txType); + BEAST_EXPECT(meta[sfTransactionResult.jsonName] == ledgerResult.result); + } + } + + static std::pair> + contractSourceKeyAndSle(ReadView const& view, uint256 const& contractHash) + { + auto const k = keylet::contractSource(contractHash); + return {k.key, view.read(k)}; + } + + static std::pair> + contractKeyAndSle( + ReadView const& view, + uint256 const& contractHash, + AccountID const& owner, + std::uint32_t const& seq) + { + auto const k = keylet::contract(contractHash, owner, seq); + return {k.key, view.read(k)}; + } + + Json::Value + getContractCreateTx(Json::Value const& jrr) + { + for (auto const& txn : jrr[jss::result][jss::ledger][jss::transactions]) + { + if (txn[jss::TransactionType] == jss::ContractCreate) + return txn; + } + return {}; + } + + uint256 + getContractHash(Blob const& wasmBytes) + { + return xrpl::sha512Half_s(xrpl::Slice(wasmBytes.data(), wasmBytes.size())); + } + + void + validateFunctions(std::shared_ptr const& sle, Json::Value const& functions) + { + auto const stored = sle->getFieldArray(sfFunctions); + BEAST_EXPECT(stored.size() == functions.size()); + for (std::size_t i = 0; i < stored.size(); ++i) + { + auto const sIPV = stored[i].getJson(JsonOptions::none); + auto const& eIPV = functions[i]["Function"]; + + // Compare function name. + BEAST_EXPECT(sIPV.isMember("FunctionName")); + BEAST_EXPECT(eIPV.isMember("FunctionName")); + BEAST_EXPECT(sIPV["FunctionName"].asString() == eIPV["FunctionName"].asString()); + + // Compare parameters if present. + if (eIPV.isMember("Parameters")) + { + BEAST_EXPECT(sIPV.isMember("Parameters")); + BEAST_EXPECT(sIPV["Parameters"].isArray()); + BEAST_EXPECT(eIPV["Parameters"].isArray()); + BEAST_EXPECT(sIPV["Parameters"].size() == eIPV["Parameters"].size()); + + for (std::size_t j = 0; j < sIPV["Parameters"].size(); ++j) + { + auto const& sParam = sIPV["Parameters"][j]; + auto const& eParam = eIPV["Parameters"][j]["Parameter"]; + + // Compare ParameterFlag if present. + if (sParam.isMember("ParameterFlag")) + { + BEAST_EXPECT(eParam.isMember("ParameterFlag")); + BEAST_EXPECT( + sParam["ParameterFlag"].asUInt() == eParam["ParameterFlag"].asUInt()); + } + + // Compare ParameterName if present. + if (sParam.isMember("ParameterName")) + { + BEAST_EXPECT(eParam.isMember("ParameterName")); + BEAST_EXPECT( + sParam["ParameterName"].asString() == + eParam["ParameterName"].asString()); + } + + // Compare ParameterType if present. + if (sParam.isMember("ParameterType")) + { + BEAST_EXPECT(eParam.isMember("ParameterType")); + BEAST_EXPECT( + sParam["ParameterType"]["type"].asString() == + eParam["ParameterType"]["type"].asString()); + } + } + } + } + } + + void + validateInstanceParams( + std::shared_ptr const& sle, + Json::Value const& instanceParamValues) + { + // Convert stored SLE array to JSON and compare against expected JSON. + auto const stored = sle->getFieldArray(sfInstanceParameterValues); + BEAST_EXPECT(stored.size() == instanceParamValues.size()); + + for (std::size_t i = 0; i < stored.size(); ++i) + { + // Convert the STObject entry to JSON for easy comparison. + auto const sIPV = stored[i].getJson(JsonOptions::none); + auto const& eIPV = instanceParamValues[i]["InstanceParameterValue"]; + + // Compare flag if present. + BEAST_EXPECT(sIPV.isMember("ParameterFlag")); + BEAST_EXPECT(eIPV.isMember("ParameterFlag")); + BEAST_EXPECT(sIPV["ParameterFlag"].asUInt() == eIPV["ParameterFlag"].asUInt()); + + // Compare ParameterValue contents (name/type/value) when present. + BEAST_EXPECT(sIPV.isMember("ParameterValue")); + BEAST_EXPECT(eIPV.isMember("ParameterValue")); + auto const& sPV = sIPV["ParameterValue"]; + auto const& ePV = eIPV["ParameterValue"]; + + if (ePV.isMember("name")) + BEAST_EXPECT( + sPV.isMember("name") && sPV["name"].asString() == ePV["name"].asString()); + + if (ePV.isMember("type")) + BEAST_EXPECT( + sPV.isMember("type") && sPV["type"].asString() == ePV["type"].asString()); + + if (ePV.isMember("value")) + { + // value can be number, string, or object; compare generically + BEAST_EXPECT(sPV.isMember("value")); + BEAST_EXPECT(sPV["value"] == ePV["value"]); + } + } + } + + void + validateInstanceParamValues( + std::shared_ptr const& sle, + Json::Value const& instanceParamValues) + { + // Convert stored SLE array to JSON and compare against expected JSON. + auto const stored = sle->getFieldArray(sfInstanceParameterValues); + BEAST_EXPECT(stored.size() == instanceParamValues.size()); + + for (std::size_t i = 0; i < stored.size(); ++i) + { + // Convert the STObject entry to JSON for easy comparison. + auto const sIPV = stored[i].getJson(JsonOptions::none); + auto const& eIPV = instanceParamValues[i]["InstanceParameterValue"]; + + // Compare flag if present. + BEAST_EXPECT(sIPV.isMember("ParameterFlag")); + BEAST_EXPECT(eIPV.isMember("ParameterFlag")); + BEAST_EXPECT(sIPV["ParameterFlag"].asUInt() == eIPV["ParameterFlag"].asUInt()); + + // Compare ParameterValue contents (name/type/value) when present. + BEAST_EXPECT(sIPV.isMember("ParameterValue")); + BEAST_EXPECT(eIPV.isMember("ParameterValue")); + auto const& sPV = sIPV["ParameterValue"]; + auto const& ePV = eIPV["ParameterValue"]; + + if (ePV.isMember("type")) + BEAST_EXPECT( + sPV.isMember("type") && sPV["type"].asString() == ePV["type"].asString()); + + if (ePV.isMember("value")) + { + // value can be number, string, or object; compare generically + BEAST_EXPECT(sPV.isMember("value")); + BEAST_EXPECT(sPV["value"] == ePV["value"]); + } + } + } + + void + validateContract( + jtx::Env& env, + Keylet const& k, + AccountID const& contractAccount, + AccountID const& owner, + std::uint32_t const& flags, + std::uint32_t const& seq, + uint256 const& contractHash, + std::optional const& instanceParamValues = std::nullopt, + std::optional const& uri = std::nullopt) + { + auto const sle = env.current()->read(k); + if (!sle) + { + fail(); + return; + } + BEAST_EXPECT(sle); + BEAST_EXPECT(sle->getAccountID(sfContractAccount) == contractAccount); + BEAST_EXPECT(sle->getAccountID(sfOwner) == owner); + BEAST_EXPECT(sle->getFieldU32(sfFlags) == flags); + BEAST_EXPECT(sle->getFieldU32(sfSequence) == seq); + BEAST_EXPECT(sle->getFieldH256(sfContractHash) == contractHash); + // if (instanceParamValues) + // validateInstanceParamValues(sle, *instanceParamValues); + // if (uri) + // { + // std::cout << "URI: " << *uri << std::endl; + // BEAST_EXPECT(sle->getFieldVL(sfURI) == strUnHex(*uri)); + // } + } + + void + validateContractSource( + jtx::Env& env, + Blob const& wasmBytes, + uint256 const& contractHash, + std::uint64_t const& referenceCount, + Json::Value const& functions, + std::optional const& instanceParams = std::nullopt) + { + auto const [id, sle] = contractSourceKeyAndSle(*env.current(), contractHash); + BEAST_EXPECT(sle); + BEAST_EXPECT(sle->getFieldVL(sfContractCode) == wasmBytes); + BEAST_EXPECT(sle->getFieldH256(sfContractHash) == contractHash); + BEAST_EXPECT(sle->getFieldU64(sfReferenceCount) == referenceCount); + validateFunctions(sle, functions); + } + + template + std::tuple + setContract(jtx::Env& env, TER const& result, Args&&... args) + { + auto jt = env.jt(std::forward(args)...); + env(jt, jtx::ter(result)); + env.close(); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + + // if (jt.jv.isMember(sfContractHash.jsonName)) + // { + // auto const accountID = + // parseBase58(jt.jv[sfContractAccount].asString()); + // jtx::Account const contractAccount{ + // "Contract pseudo-account", + // *accountID}; + // return std::make_pair(contractAccount, + // uint256(jt.jv[sfContractHash])); + // } + + auto const wasmBytes = strUnHex(jt.jv[sfContractCode.jsonName].asString()); + // std::cout << "WASM Size: " << wasmBytes->size() << std::endl; + uint256 const contractHash = + xrpl::sha512Half_s(xrpl::Slice(wasmBytes->data(), wasmBytes->size())); + auto const accountID = parseBase58(jt.jv[sfAccount].asString()); + auto const [contractKey, sle] = contractKeyAndSle( + *env.current(), contractHash, *accountID, jt.jv[sfSequence.jsonName].asUInt()); + jtx::Account const contractAccount{ + "Contract pseudo-account", sle->getAccountID(sfContractAccount)}; + return std::make_tuple(contractAccount, contractHash, jt.jv); + } + + std::string const BaseContractWasm = + "0061736D01000000010E0260057F7F7F7F7F017F6000017F02120108686F73745F" + "6C696205747261636500000302010105030100110619037F01418080C0000B7F00" + "419E80C0000B7F0041A080C0000B072C04066D656D6F7279020004626173650001" + "0A5F5F646174615F656E6403010B5F5F686561705F6261736503020A6C016A0101" + "7F23808080800041206B2200248080808000200041186A410028009080C0800036" + "0200200041106A410029008880C080003703002000410029008080C08000370308" + "419480C08000410A200041086A411441011080808080001A200041206A24808080" + "800041000B0B270100418080C0000B1EAE123A8556F3CF91154711376AFB0F894F" + "832B3D20204163636F756E743A"; + + std::string const Base2ContractWasm = + "0061736D01000000010E0260057F7F7F7F7F017F6000017F02120108686F73745F6C69" + "6205747261636500000302010105030100110619037F01418080C0000B7F0041A380C0" + "000B7F0041B080C0000B072C04066D656D6F72790200046261736500010A5F5F646174" + "615F656E6403010B5F5F686561705F6261736503020A1B011900418080C08000412341" + "00410041001080808080001A41000B0B2C0100418080C0000B23242424242420535441" + "5254494E47204241534520455845435554494F4E202424242424"; + + void + testCreatePreflight(FeatureBitset features) + { + testcase("create preflight"); + + using namespace jtx; + + // temDISABLED: Feature not enabled + { + test::jtx::Env env{*this, features - featureSmartContract}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), ter(temDISABLED)); + } + + // temINVALID_FLAG: tfContractMask is not allowed. + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + txflags(tfBurnable), + ter(temINVALID_FLAG)); + } + + // temMALFORMED: Neither ContractCode nor ContractHash present + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + // Missing both ContractCode and ContractHash + + env(jv, ter(temMALFORMED)); + } + + // temMALFORMED: Both ContractCode and ContractHash present + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfContractHash.jsonName] = + "D955DAC2E77519F05AD151A5D3C99FC8125FB39D58FF9F106F1ACA4491902C" + "25"; + + env(jv, ter(temMALFORMED)); + } + + // temARRAY_EMPTY: ContractCode present but Functions missing + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + // Missing Functions array + + env(jv, ter(temARRAY_EMPTY)); + } + + // temARRAY_EMPTY: ContractCode present but Functions missing + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfFunctions.jsonName] = Json::arrayValue; // Empty array + + env(jv, ter(temARRAY_EMPTY)); + } + + // temARRAY_TOO_LARGE: Functions array too large + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function("func1", {}), + contract::add_function("func2", {}), + contract::add_function("func3", {}), + contract::add_function("func4", {}), + contract::add_function("func5", {}), + contract::add_function("func6", {}), + contract::add_function("func7", {}), + contract::add_function("func8", {}), + contract::add_function("func9", {}), + contract::add_function("func10", {}), + contract::add_function("func11", {}), + contract::add_function("func12", {}), + contract::add_function("func13", {}), + ter(temARRAY_TOO_LARGE)); + } + + // temREDUNDANT: Duplicate function name + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function("test", {}), + contract::add_function("test", {}), // Duplicate + ter(temREDUNDANT)); + } + + // temARRAY_TOO_LARGE: Function Parameters array too large + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function( + "test", + { + {0, "param1", "UINT8"}, {0, "param2", "UINT8"}, + {0, "param3", "UINT8"}, {0, "param4", "UINT8"}, + {0, "param5", "UINT8"}, {0, "param6", "UINT8"}, + {0, "param7", "UINT8"}, {0, "param8", "UINT8"}, + {0, "param9", "UINT8"}, {0, "param10", "UINT8"}, + {0, "param11", "UINT8"}, {0, "param12", "UINT8"}, + {0, "param13", "UINT8"}, {0, "param14", "UINT8"}, + {0, "param15", "UINT8"}, {0, "param16", "UINT8"}, + {0, "param17", "UINT8"}, {0, "param18", "UINT8"}, + {0, "param19", "UINT8"}, {0, "param20", "UINT8"}, + {0, "param21", "UINT8"}, {0, "param22", "UINT8"}, + {0, "param23", "UINT8"}, {0, "param24", "UINT8"}, + {0, "param25", "UINT8"}, {0, "param26", "UINT8"}, + {0, "param27", "UINT8"}, {0, "param28", "UINT8"}, + {0, "param29", "UINT8"}, {0, "param30", "UINT8"}, + {0, "param31", "UINT8"}, {0, "param32", "UINT8"}, + {0, "param33", "UINT8"}, // 33rd parameter + }), + ter(temARRAY_TOO_LARGE)); + } + + // temMALFORMED: Function Parameter is missing flag + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfFunctions.jsonName] = Json::arrayValue; + + Json::Value func; + func[sfFunction.jsonName][sfFunctionName.jsonName] = strHex(std::string("test")); + func[sfFunction.jsonName][sfParameters.jsonName] = Json::arrayValue; + + Json::Value param; + param[sfParameter.jsonName][sfParameterType.jsonName]["type"] = "UINT8"; + func[sfFunction.jsonName][sfParameters.jsonName].append(param); + + jv[sfFunctions.jsonName].append(func); + env(jv, ter(temMALFORMED)); + } + + // temMALFORMED: Function Parameter is missing type + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfFunctions.jsonName] = Json::arrayValue; + + Json::Value func; + func[sfFunction.jsonName][sfFunctionName.jsonName] = strHex(std::string("test")); + func[sfFunction.jsonName][sfParameters.jsonName] = Json::arrayValue; + + Json::Value param; + param[sfParameter.jsonName][sfParameterFlag.jsonName] = 0; + // Missing sfParameterType + func[sfFunction.jsonName][sfParameters.jsonName].append(param); + + jv[sfFunctions.jsonName].append(func); + env(jv, ter(temMALFORMED)); + } + + // temINVALID_FLAG: Invalid parameter flag in Function. + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function("test", {{0xFF000000, "param", "UINT8"}}), // Invalid flag + ter(temINVALID_FLAG)); + } + + // temARRAY_EMPTY: InstanceParameters empty array + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfFunctions.jsonName] = Json::arrayValue; + Json::Value func; + func[sfFunction.jsonName][sfFunctionName.jsonName] = strHex(std::string("test")); + jv[sfFunctions.jsonName].append(func); + jv[sfInstanceParameters.jsonName] = Json::arrayValue; // Empty array + + env(jv, ter(temARRAY_EMPTY)); + } + + // temARRAY_TOO_LARGE: InstanceParameters array is too large + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function("test", {}), + contract::add_instance_param(0, "param1", "UINT8", 1), + contract::add_instance_param(0, "param2", "UINT8", 2), + contract::add_instance_param(0, "param3", "UINT8", 3), + contract::add_instance_param(0, "param4", "UINT8", 4), + contract::add_instance_param(0, "param5", "UINT8", 5), + contract::add_instance_param(0, "param6", "UINT8", 6), + contract::add_instance_param(0, "param7", "UINT8", 7), + contract::add_instance_param(0, "param8", "UINT8", 8), + contract::add_instance_param(0, "param9", "UINT8", 9), + contract::add_instance_param(0, "param10", "UINT8", 10), + contract::add_instance_param(0, "param11", "UINT8", 11), + contract::add_instance_param(0, "param12", "UINT8", 12), + contract::add_instance_param(0, "param13", "UINT8", 13), + contract::add_instance_param(0, "param14", "UINT8", 14), + contract::add_instance_param(0, "param15", "UINT8", 15), + contract::add_instance_param(0, "param16", "UINT8", 16), + contract::add_instance_param(0, "param17", "UINT8", 17), + contract::add_instance_param(0, "param18", "UINT8", 18), + contract::add_instance_param(0, "param19", "UINT8", 19), + contract::add_instance_param(0, "param20", "UINT8", 20), + contract::add_instance_param(0, "param21", "UINT8", 21), + contract::add_instance_param(0, "param22", "UINT8", 22), + contract::add_instance_param(0, "param23", "UINT8", 23), + contract::add_instance_param(0, "param24", "UINT8", 24), + contract::add_instance_param(0, "param25", "UINT8", 25), + contract::add_instance_param(0, "param26", "UINT8", 26), + contract::add_instance_param(0, "param27", "UINT8", 27), + contract::add_instance_param(0, "param28", "UINT8", 28), + contract::add_instance_param(0, "param29", "UINT8", 29), + contract::add_instance_param(0, "param30", "UINT8", 30), + contract::add_instance_param(0, "param31", "UINT8", 31), + contract::add_instance_param(0, "param32", "UINT8", 32), + contract::add_instance_param(0, "param33", "UINT8", 33), + ter(temARRAY_TOO_LARGE)); + } + + // temARRAY_EMPTY: InstanceParameterValues is missing + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = alice.human(); + jv[jss::Fee] = to_string(XRP(10).value()); + jv[sfContractCode.jsonName] = BaseContractWasm; + jv[sfFunctions.jsonName] = Json::arrayValue; + Json::Value func; + func[sfFunction.jsonName][sfFunctionName.jsonName] = strHex(std::string("test")); + jv[sfFunctions.jsonName].append(func); + jv[sfInstanceParameterValues.jsonName] = Json::arrayValue; // Empty array + + env(jv, ter(temARRAY_EMPTY)); + } + + // // Test 18: InstanceParameterValues array is too large. + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // Json::Value jv; + // jv[jss::TransactionType] = jss::ContractCreate; + // jv[jss::Account] = alice.human(); + // jv[jss::Fee] = to_string(XRP(10).value()); + // jv[sfContractCode.jsonName] = BaseContractWasm; + // jv[sfFunctions.jsonName] = Json::arrayValue; + // Json::Value func; + // func[sfFunction.jsonName][sfFunctionName.jsonName] = "test"; + // func[sfFunction.jsonName][sfParameters.jsonName] = + // Json::arrayValue; jv[sfFunctions.jsonName].append(func); + // jv[sfInstanceParameterValues.jsonName] = Json::arrayValue; + + // // Add more than maxContractParams + // for (int i = 0; i < 257; ++i) + // { + // Json::Value param; + // param[sfInstanceParameterValue.jsonName] + // [sfParameterFlag.jsonName] = 0; + // param[sfInstanceParameterValue.jsonName] + // [sfParameterValue.jsonName]["type"] = "UINT8"; + // param[sfInstanceParameterValue.jsonName] + // [sfParameterValue.jsonName]["value"] = i; + // jv[sfInstanceParameterValues.jsonName].append(param); + // } + + // env(jv, ter(temARRAY_TOO_LARGE)); + // } + + // // Test 19: InstanceParameterValue missing flag + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // Json::Value jv; + // jv[jss::TransactionType] = jss::ContractCreate; + // jv[jss::Account] = alice.human(); + // jv[jss::Fee] = to_string(XRP(10).value()); + // jv[sfContractCode.jsonName] = BaseContractWasm; + // jv[sfFunctions.jsonName] = Json::arrayValue; + // Json::Value func; + // func[sfFunction.jsonName][sfFunctionName.jsonName] = "test"; + // func[sfFunction.jsonName][sfParameters.jsonName] = + // Json::arrayValue; jv[sfFunctions.jsonName].append(func); + // jv[sfInstanceParameterValues.jsonName] = Json::arrayValue; + + // Json::Value param; + // // Missing sfParameterFlag + // param[sfInstanceParameterValue.jsonName][sfParameterValue.jsonName] + // ["type"] = "UINT8"; + // param[sfInstanceParameterValue.jsonName][sfParameterValue.jsonName] + // ["value"] = 1; + // jv[sfInstanceParameterValues.jsonName].append(param); + + // env(jv, ter(temMALFORMED)); + // } + + // // Test 20: InstanceParameterValue missing value + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // Json::Value jv; + // jv[jss::TransactionType] = jss::ContractCreate; + // jv[jss::Account] = alice.human(); + // jv[jss::Fee] = to_string(XRP(10).value()); + // jv[sfContractCode.jsonName] = BaseContractWasm; + // jv[sfFunctions.jsonName] = Json::arrayValue; + // Json::Value func; + // func[sfFunction.jsonName][sfFunctionName.jsonName] = "test"; + // func[sfFunction.jsonName][sfParameters.jsonName] = + // Json::arrayValue; jv[sfFunctions.jsonName].append(func); + // jv[sfInstanceParameterValues.jsonName] = Json::arrayValue; + + // Json::Value param; + // param[sfInstanceParameterValue.jsonName][sfParameterFlag.jsonName] + // = + // 0; + // // Missing sfParameterValue + // jv[sfInstanceParameterValues.jsonName].append(param); + + // env(jv, ter(temMALFORMED)); + // } + + // // Test 21: InstanceParameterValue invalid flag + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // env(contract::create(alice, BaseContractWasm), + // contract::add_function("test", {}), + // contract::add_instance_param( + // 0xFF000000, "param", "UINT8", 1), // Invalid flag + // ter(temINVALID_FLAG)); + // } + + // // Test 22: Success - ContractCode with Functions + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // env(contract::create(alice, BaseContractWasm), + // contract::add_function("base", {}), + // fee(XRP(200)), + // ter(tesSUCCESS)); + // } + + // // Test 23: Success - ContractCode with Functions and parameters + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // env(contract::create(alice, BaseContractWasm), + // contract::add_function( + // "base", {{0, "param1", "UINT8"}, {0, "param2", + // "UINT32"}}), + // fee(XRP(200)), + // ter(tesSUCCESS)); + // } + + // // Test 24: Success - with InstanceParameters and + // // InstanceParameterValues + // { + // test::jtx::Env env{*this, features}; + + // auto const alice = Account{"alice"}; + // env.fund(XRP(10'000), alice); + // env.close(); + + // env(contract::create(alice, BaseContractWasm), + // contract::add_instance_param(0, "uint8", "UINT8", 1), + // contract::add_instance_param(0, "uint32", "UINT32", 100), + // contract::add_function("base", {}), + // fee(XRP(200)), + // ter(tesSUCCESS)); + // } + } + + void + testCreatePreclaim(FeatureBitset features) + { + testcase("create preclaim"); + + using namespace jtx; + + // temMALFORMED: ContractHash provided but no corresponding + // ContractSource exists + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create( + alice, + uint256{"D955DAC2E77519F05AD151A5D3C99FC8125FB39D58FF9F106F" + "1ACA4491902C25"}), + fee(XRP(200)), + ter(temMALFORMED)); + } + + // temMALFORMED: ContractCode provided is empty + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, ""), // Empty code + contract::add_function("test", {}), + fee(XRP(200)), + ter(temMALFORMED)); + } + + // tesSUCCESS: ContractCode provided, ContractSource doesn't exist yet + // (first create) + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, BaseContractWasm), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + + // TODO: Validate + } + + // tesSUCCESS: ContractCode provided, ContractSource already exists + // (install) + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // First create + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + env.close(); + + // Second create with same code (install) + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 2), // Different value + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + + // TODO: Validate + } + + // tesSUCCESS: ContractHash provided with valid ContractSource + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // First create to establish ContractSource + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + env.close(); + + // Get the hash of the contract + auto const wasmBytes = strUnHex(BaseContractWasm); + uint256 const contractHash = getContractHash(*wasmBytes); + + // Install using ContractHash + env(contract::create(alice, contractHash), + contract::add_instance_param(0, "uint8", "UINT8", 2), + fee(XRP(200)), + ter(tesSUCCESS)); + + // TODO: Validate + } + + // temMALFORMED: Install with InstanceParameterValues that don't + // match + // ContractSource + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // First create with specific InstanceParameters + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_instance_param(0, "uint32", "UINT32", 100), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + env.close(); + + // Get the hash + auto const wasmBytes = strUnHex(BaseContractWasm); + uint256 const contractHash = getContractHash(*wasmBytes); + + // Try to install with mismatched InstanceParameterValues + // Only providing one parameter when ContractSource expects two + env(contract::create(alice, contractHash), + contract::add_instance_param(0, "uint8", "UINT8", 2), + fee(XRP(200)), + ter(temMALFORMED)); + } + + // temMALFORMED: ContractHash provided but ContractSource doesn't + // exist + // (should fail in preclaim) + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // Use Base2ContractWasm hash which hasn't been created yet + auto const wasmBytes = strUnHex(Base2ContractWasm); + uint256 const contractHash = getContractHash(*wasmBytes); + + env(contract::create(alice, contractHash), fee(XRP(200)), ter(temMALFORMED)); + } + + // tesSUCCESS: ContractCode with InstanceParameters for first + // creation + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::create(alice, Base2ContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 255), + contract::add_instance_param(tfSendAmount, "amount", "AMOUNT", XRP(100)), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + } + + // tesSUCCESS: Multiple installs of same contract + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + // Alice creates first instance + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + env.close(); + + // Bob installs same contract + env(contract::create(bob, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 2), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + env.close(); + + // Alice installs another instance + env(contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 3), + contract::add_function("base", {}), + fee(XRP(200)), + ter(tesSUCCESS)); + } + } + + void + testCreateDoApply(FeatureBitset features) + { + testcase("create doApply"); + + using namespace jtx; + + //---------------------------------------------------------------------- + // doApply.ContractCode.tesSUCCESS + + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // auto const seq = env.current()->seq(); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + token::uri("https://example.com/contract"), + fee(XRP(200))); + + // validate contract + // validateContract( + // env, + // contractAccount.id(), + // alice.id(), + // 0, + // seq, + // contractHash, + // jv[sfInstanceParameterValues], + // to_string(jv[sfURI])); + + // validate contract source + // validateContractSource( + // env, *wasmBytes, contractHash, 1, jv[sfFunctions]); + } + + //---------------------------------------------------------------------- + // doApply.ContractHash.tesSUCCESS + + { + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // auto const wasmBytes = strUnHex(BaseContractWasm); + // uint256 const contractHash = getContractHash(*wasmBytes); + + // Create Contract. + { + // auto const seq = env.current()->seq(); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + // validate contract + // validateContract( + // env, + // contractAccount.id(), + // alice.id(), + // 0, + // seq, + // contractHash, + // jv[sfInstanceParameterValues]); + + // validate contract source + // validateContractSource( + // env, *wasmBytes, contractHash, 1, jv[sfFunctions]); + } + + // Install Contract. + { + // auto const seq = env.current()->seq(); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + // validate contract + // validateContract( + // env, + // contractAccount.id(), + // alice.id(), + // 0, + // seq, + // contractHash, + // jv[sfInstanceParameterValues]); + + // validate contract source + // validateContractSource( + // env, *wasmBytes, contractHash, 2, jv[sfFunctions]); + } + } + } + + void + testModifyDoApply(FeatureBitset features) + { + testcase("modify doApply"); + + using namespace jtx; + + //---------------------------------------------------------------------- + // doApply.ContractCode.tesSUCCESS + + { + test::jtx::Env env{*this, features}; + + jtx::Account const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // Create initial contract + auto const seq = env.seq(alice); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + // Modify contract + auto jt = env.jt( + contract::modify(alice, contractAccount, Base2ContractWasm), + contract::add_instance_param(0, "uint16", "UINT16", 1), + contract::add_function("base", {{0, "uint16", "UINT16"}}), + fee(XRP(200))); + env(jt, ter(tesSUCCESS)); + env.close(); + + // old contract source is deleted + auto const [sourceKey, sourceSle] = + contractSourceKeyAndSle(*env.current(), contractHash); + BEAST_EXPECT(!sourceSle); + + // new contract source exists + auto const wasmBytes = strUnHex(Base2ContractWasm); + uint256 const newContractHash = + xrpl::sha512Half_s(xrpl::Slice(wasmBytes->data(), wasmBytes->size())); + auto const [contractKey, contractSle] = + contractSourceKeyAndSle(*env.current(), newContractHash); + BEAST_EXPECT(contractSle); + + // validate modified contract + auto const k = keylet::contract(contractHash, alice, seq); + validateContract( + env, + k, + contractAccount.id(), + alice.id(), + 0, + seq, + newContractHash, + jt.jv[sfInstanceParameterValues]); + } + + //---------------------------------------------------------------------- + // doApply.ContractHash.tesSUCCESS + + { + test::jtx::Env env{*this, features}; + + jtx::Account const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + // Create initial contract + // auto const seq = env.seq(alice); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + auto const [contractAccount2, contractHash2, jv2] = setContract( + env, + tesSUCCESS, + contract::create(alice, Base2ContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + // Modify contract + auto jt = env.jt( + contract::modify(alice, contractAccount, contractHash2), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + env(jt, ter(tesSUCCESS)); + env.close(); + + // old contract source is deleted + auto const [oldSourceKey, oldSourceSle] = + contractSourceKeyAndSle(*env.current(), contractHash); + BEAST_EXPECT(!oldSourceSle); + + // new contract source exists + auto const [sourceKey, sourceSle] = + contractSourceKeyAndSle(*env.current(), contractHash2); + BEAST_EXPECT(sourceSle); + BEAST_EXPECT(sourceSle->getFieldU64(sfReferenceCount) == 2); + + // // validate modified contract + // auto const k = keylet::contract(contractHash, seq); + // validateContract( + // env, + // k, + // contractAccount.id(), + // alice.id(), + // 0, + // seq, + // newContractHash, + // jt.jv[sfInstanceParameterValues]); + } + + //---------------------------------------------------------------------- + // doApply.ContractOwner.tesSUCCESS + + { + test::jtx::Env env{*this, features}; + + jtx::Account const alice = Account{"alice"}; + jtx::Account const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + // Create initial contract + auto const seq = env.seq(alice); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + // Modify contract + auto jt = env.jt(contract::modify(alice, contractAccount, bob), fee(XRP(200))); + env(jt, ter(tesSUCCESS)); + env.close(); + + // validate modified contract + auto const k = keylet::contract(contractHash, alice, seq); + validateContract( + env, + k, + contractAccount.id(), + bob.id(), + 0, + seq, + contractHash, + jv[sfInstanceParameterValues]); + } + } + + void + testDeleteDoApply(FeatureBitset features) + { + testcase("delete doApply"); + + using namespace jtx; + + //------------------------------------------------------------------------- + // doApply.tesSUCCESS - Single Reference + { + test::jtx::Env env{*this, features}; + + jtx::Account const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + auto const seq = env.current()->seq(); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + env(contract::del(alice, contractAccount), ter(tesSUCCESS)); + env.close(); + + // Pseudo Account is deleted + auto const pseudoAccountKey = keylet::account(contractAccount); + BEAST_EXPECT(!env.le(pseudoAccountKey)); + + // Contract instance is deleted + auto const wasmBytes = strUnHex(BaseContractWasm); + auto const contractKey = keylet::contract(contractHash, alice, seq); + BEAST_EXPECT(!env.le(contractKey)); + + // ContractSource is deleted - because it had a single reference + auto const contractSourceKey = keylet::contractSource(contractHash); + BEAST_EXPECT(!env.le(contractSourceKey)); + } + + // doApply.tesSUCCESS - Multiple Reference + { + test::jtx::Env env{*this, features}; + + jtx::Account const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + auto const seq = env.current()->seq(); + auto const [contractAccount, contractHash, jv] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + auto const seq2 = env.current()->seq(); + auto const [contractAccount2, contractHash2, jv2] = setContract( + env, + tesSUCCESS, + contract::create(alice, BaseContractWasm), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function("base", {{0, "uint8", "UINT8"}}), + fee(XRP(200))); + + env(contract::del(alice, contractAccount), ter(tesSUCCESS)); + env.close(); + + // Pseudo Account is deleted + auto const pseudoAccountKey = keylet::account(contractAccount); + BEAST_EXPECT(!env.le(pseudoAccountKey)); + + // Contract instance is deleted + auto const wasmBytes = strUnHex(BaseContractWasm); + auto const contractKey = keylet::contract(contractHash, alice, seq); + BEAST_EXPECT(!env.le(contractKey)); + + // Ensure ContractSource still exists + auto const contractSourceKey = keylet::contractSource(contractHash); + BEAST_EXPECT(env.le(contractSourceKey)); + BEAST_EXPECT(env.le(contractSourceKey)->getFieldU64(sfReferenceCount) == 1); + + // Pseudo Account of second instance still exists + auto const pseudoAccountKey2 = keylet::account(contractAccount2); + BEAST_EXPECT(env.le(pseudoAccountKey2)); + + // Ensure second contract instance still exists + auto const contractKey2 = keylet::contract(contractHash2, alice, seq2); + BEAST_EXPECT(env.le(contractKey2)); + } + } + + void + testUserDeletePreflight(FeatureBitset features) + { + testcase("user delete preflight"); + + using namespace jtx; + + // temDISABLED: Feature not enabled + { + test::jtx::Env env{*this, features - featureSmartContract}; + + auto const alice = Account{"alice"}; + env.fund(XRP(10'000), alice); + env.close(); + + env(contract::userDelete(alice, BaseContractWasm), ter(temDISABLED)); + } + } + + std::string + loadContractWasmStr(std::string const& contract_name = "") + { + std::string const& dir = "e2e-tests"; + std::string name = "/Users/darkmatter/projects/ledger-works/xrpl-wasm-std/" + dir + "/" + + contract_name + "/target/wasm32v1-none/release/" + contract_name + ".wasm"; + if (!boost::filesystem::exists(name)) + { + std::cout << "File does not exist: " << name << "\n"; + return ""; + } + + std::ifstream file(name, std::ios::binary); + + if (!file) + { + std::cout << "Failed to open file: " << name << "\n"; + return ""; + } + + // Read the file into a vector + std::vector buffer( + (std::istreambuf_iterator(file)), std::istreambuf_iterator()); + + // Check if the buffer is empty + if (buffer.empty()) + { + std::cout << "File is empty or could not be read properly.\n"; + return ""; + } + + return strHex(buffer); + } + + void + testContractDataSimple(FeatureBitset features) + { + testcase("contract data simple"); + + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, contractDataWasmHex), + contract::add_instance_param(tfSendAmount, "value", "AMOUNT", XRP(2000)), + contract::add_function("object_simple_create", {}), + contract::add_function("object_simple_update", {}), + fee(XRP(2000))); + + env(contract::call(alice, contractAccount, "object_simple_create"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + + env(contract::call(alice, contractAccount, "object_simple_update"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + } + + void + testContractDataNested(FeatureBitset features) + { + testcase("contract data nested"); + + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, contractDataWasmHex), + contract::add_instance_param(tfSendAmount, "value", "AMOUNT", XRP(2000)), + contract::add_function("object_nested_create", {}), + contract::add_function("object_nested_update", {}), + fee(XRP(2000))); + + env(contract::call(alice, contractAccount, "object_nested_create"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + + env(contract::call(alice, contractAccount, "object_nested_update"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + } + + void + testContractDataArray(FeatureBitset features) + { + testcase("contract data array"); + + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, contractDataWasmHex), + contract::add_instance_param(tfSendAmount, "value", "AMOUNT", XRP(2000)), + contract::add_function("object_with_arrays_create", {}), + contract::add_function("object_with_arrays_update", {}), + fee(XRP(2000))); + + env(contract::call(alice, contractAccount, "object_with_arrays_create"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + + env(contract::call(alice, contractAccount, "object_with_arrays_update"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + } + + void + testContractDataNestedArray(FeatureBitset features) + { + testcase("contract data nested array"); + + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, contractDataWasmHex), + contract::add_instance_param(tfSendAmount, "value", "AMOUNT", XRP(2000)), + contract::add_function("object_with_nested_arrays_create", {}), + contract::add_function("object_with_nested_arrays_update", {}), + fee(XRP(2000))); + + env(contract::call(alice, contractAccount, "object_with_nested_arrays_create"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + + env(contract::call(alice, contractAccount, "object_with_nested_arrays_update"), + escrow::comp_allowance(1'000'000), + ter(tesSUCCESS)); + env.close(); + } + + void + testInstanceParameters(FeatureBitset features) + { + testcase("instance parameters"); + + using namespace jtx; + + Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + auto const gw = Account{"gw"}; + auto const USD = gw["USD"]; + env.fund(XRP(10'000), alice, bob); + env.close(); + + // Test Instance Parameter (1 of 2) + // uint8, uint16, uint32, uint64, uint128, uint160, uint192, uint256 + { + std::string wasmHex = loadContractWasmStr("instance_params_uint"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, wasmHex), + contract::add_instance_param(0, "uint8", "UINT8", 255), + contract::add_instance_param(0, "uint16", "UINT16", 65535), + contract::add_instance_param( + 0, "uint32", "UINT32", static_cast(4294967295)), + contract::add_instance_param(0, "uint64", "UINT64", "FFFFFFFFFFFFFFFF"), + contract::add_instance_param( + 0, "uint128", "UINT128", "00000000000000000000000000000001"), + contract::add_instance_param( + 0, "uint160", "UINT160", "0000000000000000000000000000000000000001"), + contract::add_instance_param( + 0, "uint192", "UINT192", "000000000000000000000000000000000000000000000001"), + contract::add_instance_param( + 0, + "uint256", + "UINT256", + "D955DAC2E77519F05AD151A5D3C99FC8125FB39D58FF9F106F1ACA4491" + "902C" + "25"), + contract::add_function("instance_params_uint", {}), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", + // to_string(params)); std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "instance_params_uint"), + escrow::comp_allowance(1000000), + ter(tesSUCCESS)); + env.close(); + } + + { + // Test Instance Parameter (2 of 2) + // vl, account, amount (XRP), amount (IOU), number, currency, issue + std::string wasmHex = loadContractWasmStr("instance_params_other"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, wasmHex), + contract::add_instance_param(0, "vl", "VL", "DEADBEEF"), + contract::add_instance_param(0, "account", "ACCOUNT", alice.human()), + contract::add_instance_param( + 0, "amountXRP", "AMOUNT", XRP(1).value().getJson(JsonOptions::none)), + contract::add_instance_param( + 0, "amountIOU", "AMOUNT", USD(1.2).value().getJson(JsonOptions::none)), + contract::add_instance_param(0, "number", "NUMBER", "1.2"), + contract::add_function("instance_params_other", {}), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", + // to_string(params)); std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "instance_params_other"), + escrow::comp_allowance(1000000), + ter(tesSUCCESS)); + env.close(); + } + } + + void + testFunctionParameters(FeatureBitset features) + { + testcase("function parameters"); + + using namespace jtx; + + Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + auto const gw = Account{"gw"}; + auto const USD = gw["USD"]; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string wasmHex = loadContractWasmStr("function_params"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, wasmHex), + contract::add_instance_param(tfSendAmount, "amount", "AMOUNT", XRP(2000)), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function( + "function_params_uint", + { + {0, "uint8", "UINT8"}, + {0, "uint16", "UINT16"}, + {0, "uint32", "UINT32"}, + {0, "uint64", "UINT64"}, + {0, "uint128", "UINT128"}, + {0, "uint160", "UINT160"}, + {0, "uint192", "UINT192"}, + {0, "uint256", "UINT256"}, + }), + contract::add_function( + "function_params_other", + { + {0, "vl", "VL"}, + {0, "account", "ACCOUNT"}, + {0, "amountXRP", "AMOUNT"}, + {0, "amountIOU", "AMOUNT"}, + {0, "number", "NUMBER"}, + // {0, "issue", "ISSUE"}, + // {0, "currency", "CURRENCY"} + }), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "function_params_uint"), + escrow::comp_allowance(1000000), + contract::add_param(0, "uint8", "UINT8", 255), + contract::add_param(0, "uint16", "UINT16", 65535), + contract::add_param(0, "uint32", "UINT32", static_cast(4294967295)), + contract::add_param(0, "uint64", "UINT64", "FFFFFFFFFFFFFFFF"), + contract::add_param(0, "uint128", "UINT128", "00000000000000000000000000000001"), + contract::add_param( + 0, "uint160", "UINT160", "0000000000000000000000000000000000000001"), + contract::add_param( + 0, "uint192", "UINT192", "000000000000000000000000000000000000000000000001"), + contract::add_param( + 0, + "uint256", + "UINT256", + "D955DAC2E77519F05AD151A5D3C99FC8125FB39D58FF9F106F1ACA4491902C" + "25"), + ter(tesSUCCESS)); + + env(contract::call(alice, contractAccount, "function_params_other"), + escrow::comp_allowance(1000000), + contract::add_param(0, "vl", "VL", "DEADBEEF"), + contract::add_param(0, "account", "ACCOUNT", alice.human()), + contract::add_param( + 0, "amountXRP", "AMOUNT", XRP(1).value().getJson(JsonOptions::none)), + contract::add_param( + 0, "amountIOU", "AMOUNT", USD(1.2).value().getJson(JsonOptions::none)), + contract::add_param(0, "number", "NUMBER", "1.2"), + // contract::add_param(0, "issue", "ISSUE", + // to_json(USD(1).value().issue())), contract::add_param(0, + // "currency", "CURRENCY", "USD"), + ter(tesSUCCESS)); + env.close(); + } + + void + testEmit(FeatureBitset features) + { + testcase("emit"); + + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string emitTxWasmHex = loadContractWasmStr("emit_txn"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, emitTxWasmHex), + contract::add_instance_param(tfSendAmount, "value", "AMOUNT", XRP(2000)), + contract::add_function("emit", {}), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "emit"), + escrow::comp_allowance(1000000), + ter(tesSUCCESS)); + env.close(); + } + + void + testEvents(FeatureBitset features) + { + testcase("events"); + + using namespace std::chrono_literals; + using namespace jtx; + + test::jtx::Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + auto const gw = Account{"gw"}; + auto const USD = gw["USD"]; + env.fund(XRP(10'000), alice, bob); + env.close(); + + auto wsc = makeWSClient(env.app().config()); + Json::Value stream; + + { + // RPC subscribe to contract events stream + stream[jss::streams] = Json::arrayValue; + stream[jss::streams].append("contract_events"); + auto jv = wsc->invoke("subscribe", stream); + if (wsc->version() == 2) + { + BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] == "2.0"); + BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] == "2.0"); + BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5); + } + BEAST_EXPECT(jv[jss::result][jss::status] == "success"); + } + + std::string eventsWasmHex = loadContractWasmStr("events"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, eventsWasmHex), + contract::add_instance_param(tfSendAmount, "amount", "AMOUNT", XRP(2000)), + contract::add_function("events", {}), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "events"), + escrow::comp_allowance(1000000), + ter(tesSUCCESS)); + env.close(); + + { + // Get contract info + Json::Value params; + params[jss::contract_account] = contractAccount.human(); + params[jss::account] = alice.human(); + auto const jrr = env.rpc("json", "contract_info", to_string(params)); + std::cout << jrr << std::endl; + } + + // Check stream update + BEAST_EXPECT(wsc->findMsg(5s, [&](auto const& jv) { + auto const data = jv[jss::data]; + // std::cout << "Event: " << data << std::endl; + BEAST_EXPECT(data["amount"] == "192"); + BEAST_EXPECT(data["currency"] == "USD"); + BEAST_EXPECT(data["destination"] == "r99mpXDsCPybsGs9XzGJmuxa8gWLTn8aCz"); + BEAST_EXPECT(data["uint128"] == "00000000000000000000000000000000"); + BEAST_EXPECT(data["uint16"] == 16); + BEAST_EXPECT(data["uint160"] == "0000000000000000000000000000000000000000"); + BEAST_EXPECT(data["uint192"] == "000000000000000000000000000000000000000000000000"); + BEAST_EXPECT( + data["uint256"] == + "00000000000000000000000000000000000000000000000000000000000000" + "00"); + BEAST_EXPECT(data["uint32"] == 32); + BEAST_EXPECT(data["uint64"] == "40"); + BEAST_EXPECT(data["uint8"] == 8); + BEAST_EXPECT(data["vl"] == "48656C6C6F2C20576F726C6421"); + return jv[jss::type] == "contractEvent" && jv[jss::name] == "event1"; + })); + + // RPC unsubscribe + auto jv = wsc->invoke("unsubscribe", stream); + if (wsc->version() == 2) + { + BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] == "2.0"); + BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] == "2.0"); + BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5); + } + BEAST_EXPECT(jv[jss::status] == "success"); + } + + void + testEasyMode(FeatureBitset features) + { + testcase("easy mode"); + + using namespace jtx; + + Env env{*this, features}; + + auto const alice = Account{"alice"}; + auto const bob = Account{"bob"}; + auto const gw = Account{"gw"}; + auto const USD = gw["USD"]; + env.fund(XRP(10'000), alice, bob); + env.close(); + + std::string wasmHex = loadContractWasmStr("easymode"); + auto const [contractAccount, contractHash, _] = setContract( + env, + tesSUCCESS, + contract::create(alice, wasmHex), + contract::add_instance_param(tfSendAmount, "amount", "AMOUNT", XRP(2000)), + contract::add_instance_param(0, "uint8", "UINT8", 1), + contract::add_function( + "easymode", + { + {0, "account", "ACCOUNT"}, + {0, "amount", "AMOUNT"}, + }), + fee(XRP(200))); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + + env(contract::call(alice, contractAccount, "easymode"), + escrow::comp_allowance(1000000), + contract::add_param(0, "account", "ACCOUNT", bob.human()), + contract::add_param(0, "amount", "AMOUNT", XRP(1)), + ter(tesSUCCESS)); + env.close(); + + // { + // Json::Value params; + // params[jss::ledger_index] = env.current()->seq() - 1; + // params[jss::transactions] = true; + // params[jss::expand] = true; + // auto const jrr = env.rpc("json", "ledger", to_string(params)); + // std::cout << jrr << std::endl; + // } + } + + void + testWithFeats(FeatureBitset features) + { + testCreatePreflight(features); + testCreatePreclaim(features); + testCreateDoApply(features); + // testModifyPreflight(features); + // testModifyPreclaim(features); + testModifyDoApply(features); + // testDeletePreflight(features); + // testDeletePreclaim(features); + testDeleteDoApply(features); + // testUserDeletePreflight(features); + // testUserDeletePreclaim(features); + // testUserDeleteDoApply(features); + testContractDataSimple(features); + testContractDataNested(features); + testContractDataArray(features); + testContractDataNestedArray(features); + testInstanceParameters(features); + testFunctionParameters(features); + testEmit(features); + // testEvents(features); + } + +public: + void + run() override + { + using namespace test::jtx; + auto const sa = testable_amendments(); + testWithFeats(sa); + } +}; + +BEAST_DEFINE_TESTSUITE(Contract, app, xrpl); + +} // namespace test +} // namespace xrpl diff --git a/src/test/app/FeeVote_test.cpp b/src/test/app/FeeVote_test.cpp index 110ff56163e..e4c82fb25e9 100644 --- a/src/test/app/FeeVote_test.cpp +++ b/src/test/app/FeeVote_test.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -72,6 +73,15 @@ createFeeTx( sfExtensionSizeLimit, fields.extensionSizeLimit ? *fields.extensionSizeLimit : 0); obj.setFieldU32(sfGasPrice, fields.gasPrice ? *fields.gasPrice : 0); } + if (rules.enabled(featureSmartEscrow) || forceAllFields) + { + obj.setFieldU32( + sfExtensionComputeLimit, + fields.extensionComputeLimit ? *fields.extensionComputeLimit : 0); + obj.setFieldU32( + sfExtensionSizeLimit, fields.extensionSizeLimit ? *fields.extensionSizeLimit : 0); + obj.setFieldU32(sfGasPrice, fields.gasPrice ? *fields.gasPrice : 0); + } }; return STTx(ttFEE, fill); } diff --git a/src/test/app/FixNFTokenPageLinks_test.cpp b/src/test/app/FixNFTokenPageLinks_test.cpp index 25366534cd9..c474bb40146 100644 --- a/src/test/app/FixNFTokenPageLinks_test.cpp +++ b/src/test/app/FixNFTokenPageLinks_test.cpp @@ -1,9 +1,9 @@ #include +#include #include #include #include -#include namespace xrpl { diff --git a/src/test/app/NFTokenAuth_test.cpp b/src/test/app/NFTokenAuth_test.cpp index 0e3fb243050..37928335886 100644 --- a/src/test/app/NFTokenAuth_test.cpp +++ b/src/test/app/NFTokenAuth_test.cpp @@ -1,6 +1,6 @@ #include -#include +#include namespace xrpl { diff --git a/src/test/app/NFTokenBurn_test.cpp b/src/test/app/NFTokenBurn_test.cpp index cd0df42c034..7fdaec7286d 100644 --- a/src/test/app/NFTokenBurn_test.cpp +++ b/src/test/app/NFTokenBurn_test.cpp @@ -1,8 +1,9 @@ #include +#include #include #include -#include +#include #include diff --git a/src/test/app/NFTokenDir_test.cpp b/src/test/app/NFTokenDir_test.cpp index 78765cb6c0c..9e4ee9d6b83 100644 --- a/src/test/app/NFTokenDir_test.cpp +++ b/src/test/app/NFTokenDir_test.cpp @@ -1,9 +1,9 @@ #include +#include #include #include #include -#include #include diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index 0d391147a83..f8dcfc0d0b9 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -1,9 +1,9 @@ #include #include +#include #include #include -#include #include diff --git a/src/test/app/TestHostFunctions.h b/src/test/app/TestHostFunctions.h index 0e74cd62834..748f11baccb 100644 --- a/src/test/app/TestHostFunctions.h +++ b/src/test/app/TestHostFunctions.h @@ -3,8 +3,8 @@ #include #include +#include #include -#include #include #include diff --git a/src/test/app/wasm_fixtures/contract_data/Cargo.lock b/src/test/app/wasm_fixtures/contract_data/Cargo.lock new file mode 100644 index 00000000000..5b87de721f9 --- /dev/null +++ b/src/test/app/wasm_fixtures/contract_data/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "contract_data" +version = "0.0.1" +dependencies = [ + "xrpl-wasm-std", +] + +[[package]] +name = "xrpl-wasm-std" +version = "0.5.1-devnet5" +source = "git+https://github.com/Transia-RnD/craft.git?branch=dangell%2Fsmart-contracts#3c8191ae9832ea25f7d8f3e5eeb33b65181d31b5" diff --git a/src/test/app/wasm_fixtures/contract_data/Cargo.toml b/src/test/app/wasm_fixtures/contract_data/Cargo.toml new file mode 100644 index 00000000000..5638081ca00 --- /dev/null +++ b/src/test/app/wasm_fixtures/contract_data/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "contract_data" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-wasm-std = { git = "https://github.com/Transia-RnD/craft.git", branch = "dangell/smart-contracts", package = "xrpl-wasm-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/contract_data/src/lib.rs b/src/test/app/wasm_fixtures/contract_data/src/lib.rs new file mode 100644 index 00000000000..965c50c06c0 --- /dev/null +++ b/src/test/app/wasm_fixtures/contract_data/src/lib.rs @@ -0,0 +1,529 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_wasm_std::core::data::codec::{ + get_array_element, get_data, get_nested_array_element, get_nested_data, set_array_element, + set_data, set_nested_array_element, set_nested_data, +}; +use xrpl_wasm_std::core::types::account_id::AccountID; +use xrpl_wasm_std::host::trace::{trace, trace_num}; + +// Different accounts for different test patterns +const ACCOUNT: [u8; 20] = [ + 0xAE, 0x12, 0x3A, 0x85, 0x56, 0xF3, 0xCF, 0x91, 0x15, 0x47, 0x11, 0x37, 0x6A, 0xFB, 0x0F, 0x89, + 0x4F, 0x83, 0x2B, 0x3D, +]; + +// ============================================================================ +// TEST 1: Simple Object - Only top-level key-value pairs +// Creates: { "value_u8": 42, "value_u16": 1234, "count": 3, ... } +// ============================================================================ + +#[unsafe(no_mangle)] +pub extern "C" fn object_simple_create() -> i32 { + let _ = trace("=== TEST 1: Simple Object Create ==="); + let account = AccountID(ACCOUNT); + + // Test u8 + let _ = trace("Testing u8..."); + if let Err(e) = set_data::(&account, "value_u8", 42) { + return e; + } + if let Some(val) = get_data::(&account, "value_u8") { + let _ = trace_num("Read back u8:", val.into()); + } else { + let _ = trace("Failed to read back u8"); + return -1; + } + + // Test u16 + let _ = trace("Testing u16..."); + if let Err(e) = set_data::(&account, "value_u16", 1234) { + return e; + } + if let Some(val) = get_data::(&account, "value_u16") { + let _ = trace_num("Read back u16:", val.into()); + } else { + let _ = trace("Failed to read back u16"); + return -1; + } + + // Test u32 + let _ = trace("Testing u32..."); + if let Err(e) = set_data::(&account, "count", 3) { + return e; + } + if let Err(e) = set_data::(&account, "total", 12) { + return e; + } + if let Some(count_val) = get_data::(&account, "count") { + let _ = trace_num("Read back count:", count_val.into()); + } else { + let _ = trace("Failed to read back count"); + return -1; + } + + // Test u64 + let _ = trace("Testing u64..."); + if let Err(e) = set_data::(&account, "value_u64", 9876543210) { + return e; + } + if let Some(val) = get_data::(&account, "value_u64") { + let _ = trace_num("Read back u64:", val as i64); + } else { + let _ = trace("Failed to read back u64"); + return -1; + } + + // Test AccountID + let _ = trace("Testing AccountID..."); + const DESTINATION: [u8; 20] = [ + 0x05, 0x96, 0x91, 0x5C, 0xFD, 0xEE, 0xE3, 0xA6, 0x95, 0xB3, 0xEF, 0xD6, 0xBD, 0xA9, 0xAC, + 0x78, 0x8A, 0x36, 0x8B, 0x7B, + ]; + let destination = AccountID(DESTINATION); + if let Err(e) = set_data(&account, "destination", destination) { + return e; + } + if let Some(_dest) = get_data::(&account, "destination") { + let _ = trace("Read back AccountID successfully"); + } else { + let _ = trace("Failed to read back AccountID"); + return -1; + } + + // Test reading non-existent key + let _ = trace("Testing non-existent key..."); + if let Some(_) = get_data::(&account, "nonexistent") { + let _ = trace("ERROR: Should not have found nonexistent key"); + return -1; + } else { + let _ = trace("Correctly returned None for nonexistent key"); + } + + let _ = trace("Simple object create tests passed!"); + 0 +} + +#[unsafe(no_mangle)] +pub extern "C" fn object_simple_update() -> i32 { + let _ = trace("=== TEST 1: Simple Object Update ==="); + let account = AccountID(ACCOUNT); + + // Update u8 + let _ = trace("Updating u8 to 99..."); + if let Err(e) = set_data::(&account, "value_u8", 99) { + return e; + } + if let Some(val) = get_data::(&account, "value_u8") { + let _ = trace_num("Read back updated u8:", val.into()); + } else { + let _ = trace("Failed to read back u8"); + return -1; + } + + // Update u32 + let _ = trace("Updating count to 4..."); + if let Err(e) = set_data::(&account, "count", 4) { + return e; + } + if let Some(count_val) = get_data::(&account, "count") { + let _ = trace_num("Read back updated count:", count_val.into()); + } else { + let _ = trace("Failed to read back count"); + return -1; + } + + // Add new field + let _ = trace("Adding new field 'status'..."); + if let Err(e) = set_data::(&account, "status", 100) { + return e; + } + if let Some(val) = get_data::(&account, "status") { + let _ = trace_num("Read back new status:", val.into()); + } else { + let _ = trace("Failed to read back status"); + return -1; + } + + let _ = trace("Simple object update tests passed!"); + 0 +} + +// ============================================================================ +// TEST 2: Nested Object - Objects containing objects (depth 1) +// Creates: { "stats": {"score": 9999, "level": 5}, "key": {"subkey": 12} } +// ============================================================================ + +#[unsafe(no_mangle)] +pub extern "C" fn object_nested_create() -> i32 { + let _ = trace("=== TEST 2: Nested Object Create ==="); + let account = AccountID(ACCOUNT); + + // Test nested u8 + let _ = trace("Testing nested u8..."); + if let Err(e) = set_nested_data::(&account, "key", "subkey", 12) { + return e; + } + if let Some(nested_val) = get_nested_data::(&account, "key", "subkey") { + let _ = trace_num("Read back nested value:", nested_val.into()); + } else { + let _ = trace("Failed to read back nested value"); + return -1; + } + + // Test nested u32 + let _ = trace("Testing nested u32..."); + if let Err(e) = set_nested_data::(&account, "stats", "score", 9999) { + return e; + } + if let Some(val) = get_nested_data::(&account, "stats", "score") { + let _ = trace_num("Read back nested u32:", val.into()); + } else { + let _ = trace("Failed to read back nested u32"); + return -1; + } + + // Test multiple fields in same nested object + let _ = trace("Adding multiple fields to nested object..."); + if let Err(e) = set_nested_data::(&account, "stats", "level", 5) { + return e; + } + if let Err(e) = set_nested_data::(&account, "stats", "coins", 1000) { + return e; + } + if let Some(val) = get_nested_data::(&account, "stats", "level") { + let _ = trace_num("Read back stats.level:", val.into()); + } else { + let _ = trace("Failed to read back stats.level"); + return -1; + } + + // Test nested u64 + let _ = trace("Testing nested u64..."); + if let Err(e) = set_nested_data::(&account, "data", "timestamp", 1234567890) { + return e; + } + if let Some(val) = get_nested_data::(&account, "data", "timestamp") { + let _ = trace_num("Read back nested u64:", val as i64); + } else { + let _ = trace("Failed to read back nested u64"); + return -1; + } + + let _ = trace("Nested object create tests passed!"); + 0 +} + +#[unsafe(no_mangle)] +pub extern "C" fn object_nested_update() -> i32 { + let _ = trace("=== TEST 2: Nested Object Update ==="); + let account = AccountID(ACCOUNT); + + // Update nested value + let _ = trace("Updating nested score to 12345..."); + if let Err(e) = set_nested_data::(&account, "stats", "score", 12345) { + return e; + } + if let Some(val) = get_nested_data::(&account, "stats", "score") { + let _ = trace_num("Read back updated nested score:", val.into()); + } else { + let _ = trace("Failed to read back nested score"); + return -1; + } + + // Update another nested field + let _ = trace("Updating nested level to 10..."); + if let Err(e) = set_nested_data::(&account, "stats", "level", 10) { + return e; + } + if let Some(val) = get_nested_data::(&account, "stats", "level") { + let _ = trace_num("Read back updated level:", val.into()); + } else { + let _ = trace("Failed to read back level"); + return -1; + } + + // Add new nested field + let _ = trace("Adding new nested field..."); + if let Err(e) = set_nested_data::(&account, "config", "timeout", 30) { + return e; + } + if let Some(val) = get_nested_data::(&account, "config", "timeout") { + let _ = trace_num("Read back new config.timeout:", val.into()); + } else { + let _ = trace("Failed to read back config.timeout"); + return -1; + } + + let _ = trace("Nested object update tests passed!"); + 0 +} + +// ============================================================================ +// TEST 3: Object with Arrays - Objects containing arrays of simple values +// Creates: { "items": [10, 20, 30], "values": [100, 200] } +// Note: This uses set_array_element which creates an object with array fields +// ============================================================================ + +#[unsafe(no_mangle)] +pub extern "C" fn object_with_arrays_create() -> i32 { + let _ = trace("=== TEST 3: Object with Arrays Create ==="); + let account = AccountID(ACCOUNT); + + // Test u8 array + let _ = trace("Testing u8 array..."); + if let Err(e) = set_array_element::(&account, "array_u8", 0, 10) { + return e; + } + if let Err(e) = set_array_element::(&account, "array_u8", 1, 20) { + return e; + } + if let Err(e) = set_array_element::(&account, "array_u8", 2, 30) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u8", 0) { + let _ = trace_num("Read array_u8[0]:", val.into()); + } else { + let _ = trace("Failed to read array_u8[0]"); + return -1; + } + if let Some(val) = get_array_element::(&account, "array_u8", 1) { + let _ = trace_num("Read array_u8[1]:", val.into()); + } else { + let _ = trace("Failed to read array_u8[1]"); + return -1; + } + + // Test u16 array + let _ = trace("Testing u16 array..."); + if let Err(e) = set_array_element::(&account, "array_u16", 0, 100) { + return e; + } + if let Err(e) = set_array_element::(&account, "array_u16", 1, 200) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u16", 0) { + let _ = trace_num("Read array_u16[0]:", val.into()); + } else { + let _ = trace("Failed to read array_u16[0]"); + return -1; + } + + // Test u32 array + let _ = trace("Testing u32 array..."); + if let Err(e) = set_array_element::(&account, "array_u32", 0, 1000) { + return e; + } + if let Err(e) = set_array_element::(&account, "array_u32", 1, 2000) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u32", 0) { + let _ = trace_num("Read array_u32[0]:", val.into()); + } else { + let _ = trace("Failed to read array_u32[0]"); + return -1; + } + + // Test u64 array + let _ = trace("Testing u64 array..."); + if let Err(e) = set_array_element::(&account, "array_u64", 0, 10000) { + return e; + } + if let Err(e) = set_array_element::(&account, "array_u64", 1, 20000) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u64", 0) { + let _ = trace_num("Read array_u64[0]:", val as i64); + } else { + let _ = trace("Failed to read array_u64[0]"); + return -1; + } + + let _ = trace("Object with arrays create tests passed!"); + 0 +} + +#[unsafe(no_mangle)] +pub extern "C" fn object_with_arrays_update() -> i32 { + let _ = trace("=== TEST 3: Object with Arrays Update ==="); + let account = AccountID(ACCOUNT); + + // Update array element + let _ = trace("Updating array_u32[0] to 7777..."); + if let Err(e) = set_array_element::(&account, "array_u32", 0, 7777) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u32", 0) { + let _ = trace_num("Read back updated array_u32[0]:", val.into()); + } else { + let _ = trace("Failed to read back array_u32[0]"); + return -1; + } + + // Add new array element + let _ = trace("Adding new array element array_u16[2]..."); + if let Err(e) = set_array_element::(&account, "array_u16", 2, 300) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u16", 2) { + let _ = trace_num("Read back new array_u16[2]:", val.into()); + } else { + let _ = trace("Failed to read back array_u16[2]"); + return -1; + } + + // Add element with gap (should auto-fill with nulls) + let _ = trace("Adding array_u8[5] (skipping indices 3-4)..."); + if let Err(e) = set_array_element::(&account, "array_u8", 5, 50) { + return e; + } + if let Some(val) = get_array_element::(&account, "array_u8", 5) { + let _ = trace_num("Read back array_u8[5]:", val.into()); + } else { + let _ = trace("Failed to read back array_u8[5]"); + return -1; + } + + let _ = trace("Object with arrays update tests passed!"); + 0 +} + +// ============================================================================ +// TEST 4: Object with Nested Arrays - Objects containing arrays of objects +// Creates: { "nested_array": [{"field1": 55, "field2": 66}, {"field1": 77}] } +// This is the most complex structure allowed (depth 1) +// DA: I wouldn't use this. If you are doing this, consider redesigning your data model +// ============================================================================ + +#[unsafe(no_mangle)] +pub extern "C" fn object_with_nested_arrays_create() -> i32 { + let _ = trace("=== TEST 4: Object with Nested Arrays Create ==="); + let account = AccountID(ACCOUNT); + + // Test nested u8 array with multiple fields + let _ = trace("Testing nested u8 array..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array", 0, "field1", 55) { + return e; + } + if let Err(e) = set_nested_array_element::(&account, "nested_array", 0, "field2", 66) { + return e; + } + if let Err(e) = set_nested_array_element::(&account, "nested_array", 1, "field1", 77) { + return e; + } + + if let Some(val) = get_nested_array_element::(&account, "nested_array", 0, "field1") { + let _ = trace_num("Read nested_array[0].field1:", val.into()); + } else { + let _ = trace("Failed to read nested_array[0].field1"); + return -1; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array", 0, "field2") { + let _ = trace_num("Read nested_array[0].field2:", val.into()); + } else { + let _ = trace("Failed to read nested_array[0].field2"); + return -1; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array", 1, "field1") { + let _ = trace_num("Read nested_array[1].field1:", val.into()); + } else { + let _ = trace("Failed to read nested_array[1].field1"); + return -1; + } + + // Test nested u32 array + let _ = trace("Testing nested u32 array..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array_u32", 0, "value", 5555) + { + return e; + } + if let Err(e) = set_nested_array_element::(&account, "nested_array_u32", 1, "value", 6666) + { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array_u32", 0, "value") { + let _ = trace_num("Read nested_array_u32[0].value:", val.into()); + } else { + let _ = trace("Failed to read nested_array_u32[0].value"); + return -1; + } + + // Test nested u64 array + let _ = trace("Testing nested u64 array..."); + if let Err(e) = set_nested_array_element::(&account, "items", 0, "id", 99999) { + return e; + } + if let Err(e) = set_nested_array_element::(&account, "items", 0, "price", 123456) { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "items", 0, "id") { + let _ = trace_num("Read items[0].id:", val as i64); + } else { + let _ = trace("Failed to read items[0].id"); + return -1; + } + + let _ = trace("Object with nested arrays create tests passed!"); + 0 +} + +#[unsafe(no_mangle)] +pub extern "C" fn object_with_nested_arrays_update() -> i32 { + let _ = trace("=== TEST 4: Object with Nested Arrays Update ==="); + let account = AccountID(ACCOUNT); + + // Update nested array element + let _ = trace("Updating nested_array[0].field1 to 88..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array", 0, "field1", 88) { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array", 0, "field1") { + let _ = trace_num("Read back updated nested_array[0].field1:", val.into()); + } else { + let _ = trace("Failed to read back nested_array[0].field1"); + return -1; + } + + // Add new field to existing array element + let _ = trace("Adding field3 to nested_array[0]..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array", 0, "field3", 111) { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array", 0, "field3") { + let _ = trace_num("Read back nested_array[0].field3:", val.into()); + } else { + let _ = trace("Failed to read back nested_array[0].field3"); + return -1; + } + + // Add new array element + let _ = trace("Adding nested_array[2]..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array", 2, "field1", 99) { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array", 2, "field1") { + let _ = trace_num("Read back nested_array[2].field1:", val.into()); + } else { + let _ = trace("Failed to read back nested_array[2].field1"); + return -1; + } + + // Update u32 nested array + let _ = trace("Updating nested_array_u32[1].value to 8888..."); + if let Err(e) = set_nested_array_element::(&account, "nested_array_u32", 1, "value", 8888) + { + return e; + } + if let Some(val) = get_nested_array_element::(&account, "nested_array_u32", 1, "value") { + let _ = trace_num("Read back updated nested_array_u32[1].value:", val.into()); + } else { + let _ = trace("Failed to read back nested_array_u32[1].value"); + return -1; + } + + let _ = trace("Object with nested arrays update tests passed!"); + 0 +} diff --git a/src/test/app/wasm_fixtures/copyFixtures.py b/src/test/app/wasm_fixtures/copyFixtures.py index 3d9faddbed5..e5c666c05bf 100644 --- a/src/test/app/wasm_fixtures/copyFixtures.py +++ b/src/test/app/wasm_fixtures/copyFixtures.py @@ -55,7 +55,12 @@ def process_rust(project_name): ")" ) try: - subprocess.run(build_cmd, shell=True, check=True) + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") print(f"WASM file for {project_name} has been built and optimized.") except subprocess.CalledProcessError as e: print(f"exec error: {e}") @@ -87,7 +92,12 @@ def process_c(project_name): f"&& wasm-opt {wasm_path} {OPT} -o {wasm_path}" ) try: - subprocess.run(build_cmd, shell=True, check=True) + result = subprocess.run( + build_cmd, shell=True, check=True, capture_output=True, text=True + ) + print(f"stdout: {result.stdout}") + if result.stderr: + print(f"stderr: {result.stderr}") print( f"WASM file for {project_name} has been built with WASI support using clang." ) diff --git a/src/test/app/wasm_fixtures/emit_txn/Cargo.toml b/src/test/app/wasm_fixtures/emit_txn/Cargo.toml new file mode 100644 index 00000000000..6ae66a59140 --- /dev/null +++ b/src/test/app/wasm_fixtures/emit_txn/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "emit_txn" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-wasm-std = { git = "https://github.com/Transia-RnD/craft.git", branch = "dangell/smart-contracts", package = "xrpl-wasm-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/emit_txn/src/lib.rs b/src/test/app/wasm_fixtures/emit_txn/src/lib.rs new file mode 100644 index 00000000000..a50df3e7834 --- /dev/null +++ b/src/test/app/wasm_fixtures/emit_txn/src/lib.rs @@ -0,0 +1,218 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_wasm_std::core::current_tx::contract_call::{ContractCall, get_current_contract_call}; +use xrpl_wasm_std::core::current_tx::traits::TransactionCommonFields; +use xrpl_wasm_std::core::submit::inner_objects::build_memo; +use xrpl_wasm_std::core::transaction_types::TT_PAYMENT; +use xrpl_wasm_std::core::types::account_id::AccountID; +use xrpl_wasm_std::host::{add_txn_field, build_txn, emit_built_txn}; +use xrpl_wasm_std::sfield; + +// ============================================================================ +// Constants +// ============================================================================ + +/// Custom error code for transaction failures +const CUSTOM_ERROR_CODE: i32 = -18; + +/// XRPL encoding markers +mod markers { + pub const ARRAY_END: u8 = 0xF1; + pub const OBJECT_END: u8 = 0xE1; +} + +/// Buffer sizes +mod buffer_sizes { + pub const MEMO_BUFFER: usize = 256; + pub const MEMOS_ARRAY: usize = 1024; + pub const DESTINATION: usize = 21; +} + +// ============================================================================ +// Helper Functions +// ============================================================================ + +/// Builds a complete memos array from individual memo buffers +/// +/// # Arguments +/// * `buffer` - Output buffer for the complete memos array +/// * `memo_buffers` - Slice of memo data and their lengths +/// +/// # Returns +/// Total length of the memos array including the end marker +fn build_memos_array( + buffer: &mut [u8; buffer_sizes::MEMOS_ARRAY], + memo_buffers: &[(&[u8], usize)] +) -> usize { + let mut position = 0; + + // Copy each memo into the array + for (memo_data, memo_length) in memo_buffers { + buffer[position..position + memo_length].copy_from_slice(&memo_data[..*memo_length]); + position += memo_length; + } + + // Terminate the array + buffer[position] = markers::ARRAY_END; + position + 1 +} + +/// Adds the amount field to the transaction +/// +/// # Arguments +/// * `txn_index` - Transaction builder index +/// * `amount_drops` - Amount in drops (192 in this example) +/// +/// # Returns +/// Result code from add_txn_field +unsafe fn add_amount_field(txn_index: i32) -> i32 { + // 192 drops encoded as XRPL Amount + const AMOUNT_BYTES: [u8; 8] = [ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 + ]; + + add_txn_field( + txn_index, + sfield::Amount, + AMOUNT_BYTES.as_ptr(), + AMOUNT_BYTES.len() + ) +} + +/// Adds the destination field to the transaction +/// +/// # Arguments +/// * `txn_index` - Transaction builder index +/// * `destination` - Destination account ID +/// +/// # Returns +/// Result code from add_txn_field +unsafe fn add_destination_field(txn_index: i32, destination: &AccountID) -> i32 { + let mut dest_buffer = [0u8; buffer_sizes::DESTINATION]; + dest_buffer[0] = 0x14; // Length prefix for 20-byte account + dest_buffer[1..21].copy_from_slice(&destination.0); + + add_txn_field( + txn_index, + sfield::Destination, + dest_buffer.as_ptr(), + dest_buffer.len() + ) +} + +/// Adds the memos field to the transaction +/// +/// # Arguments +/// * `txn_index` - Transaction builder index +/// +/// # Returns +/// Result code from add_txn_field +unsafe fn add_memos_field(txn_index: i32) -> i32 { + use core::mem::MaybeUninit; + + // Uninitialized backing buffer (no zeroing => no memory.fill) + let mut memos_uninit: MaybeUninit<[u8; buffer_sizes::MEMOS_ARRAY]> = MaybeUninit::uninit(); + let base = memos_uninit.as_mut_ptr() as *mut u8; + + // Helper: get a 256-byte window at current position + #[inline(always)] + unsafe fn at<'a>(base: *mut u8, pos: usize) -> &'a mut [u8; buffer_sizes::MEMO_BUFFER] { + &mut *(base.add(pos) as *mut [u8; buffer_sizes::MEMO_BUFFER]) + } + + let mut pos = 0usize; + + // Write each Memo directly into the big buffer + let len1 = build_memo( + at(base, pos), + Some(b"invoice"), + Some(b"INV-2024-001"), + Some(b"text/plain") + ); + pos += len1; + + let len2 = build_memo( + at(base, pos), + Some(b"note"), + Some(b"Payment for consulting services"), + Some(b"text/plain") + ); + pos += len2; + + let len3 = build_memo( + at(base, pos), + None, + Some(b"Additional reference: Project Alpha"), + None + ); + pos += len3; + + // Terminate the array + *base.add(pos) = markers::ARRAY_END; + pos += 1; + + add_txn_field( + txn_index, + sfield::Memos, + base, + pos + ) +} + +// ============================================================================ +// Main Entry Point +// ============================================================================ + +/// Main hook function that builds and emits a payment transaction with memos +/// +/// This function: +/// 1. Retrieves the current contract call context +/// 2. Builds a payment transaction +/// 3. Adds amount, destination, and memos fields +/// 4. Emits the completed transaction +/// +/// # Returns +/// - 0 on success +/// - Negative error code on failure +#[unsafe(no_mangle)] +pub extern "C" fn emit() -> i32 { + // Get contract context + let contract_call: ContractCall = get_current_contract_call(); + let account = contract_call.get_account().unwrap(); + + // Initialize payment transaction + let txn_index = 0; + let build_result = unsafe { build_txn(TT_PAYMENT) }; + if build_result < 0 { + return CUSTOM_ERROR_CODE; + } + + // Build transaction fields + unsafe { + // Add amount field + if add_amount_field(txn_index) < 0 { + return CUSTOM_ERROR_CODE; + } + + // Add destination field + if add_destination_field(txn_index, &account) < 0 { + return CUSTOM_ERROR_CODE; + } + + // Add memos field + if add_memos_field(txn_index) < 0 { + return CUSTOM_ERROR_CODE; + } + + // Emit the completed transaction + let emission_result = emit_built_txn(txn_index); + if emission_result < 0 { + return emission_result; + } + } + + 0 // Success +} diff --git a/src/test/app/wasm_fixtures/events/Cargo.toml b/src/test/app/wasm_fixtures/events/Cargo.toml new file mode 100644 index 00000000000..ce249ac9b04 --- /dev/null +++ b/src/test/app/wasm_fixtures/events/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "events" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-wasm-std = { git = "https://github.com/Transia-RnD/craft.git", branch = "dangell/smart-contracts", package = "xrpl-wasm-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/events/src/lib.rs b/src/test/app/wasm_fixtures/events/src/lib.rs new file mode 100644 index 00000000000..7cc8d0537c6 --- /dev/null +++ b/src/test/app/wasm_fixtures/events/src/lib.rs @@ -0,0 +1,99 @@ +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_wasm_std::core::types::account_id::AccountID; +use xrpl_wasm_std::core::event::codec_v2::{ + EventBuffer, event_add_u8, event_add_u16, event_add_u32, event_add_u64, + event_add_u128, event_add_u160, event_add_u192, event_add_u256, event_add_amount, event_add_account, + event_add_currency, event_add_str +}; + +#[unsafe(no_mangle)] +pub extern "C" fn events() -> i32 { + let mut buf = EventBuffer::new(); + + // STI_AMOUNT + const AMOUNT: [u8; 8] = [ + 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 + ]; + if event_add_amount(&mut buf, "amount", &AMOUNT).is_err() { + return -1; + } + + // STI_CURRENCY + const CURRENCY: [u8; 20] = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x55, 0x53, 0x44, 0x00, + 0x00, 0x00, 0x00, 0x00 + ]; + if event_add_currency(&mut buf, "currency", &CURRENCY).is_err() { + return -1; + } + + // STI_ACCOUNT + const ACCOUNT: [u8; 20] = [ + 0x59, 0x69, 0x15, 0xCF, 0xDE, 0xEE, 0x3A, 0x69, + 0x5B, 0x3E, 0xFD, 0x6B, 0xDA, 0x9A, 0xC7, 0x88, + 0xA3, 0x68, 0xB7, 0xB + ]; + let account = AccountID(ACCOUNT); + if event_add_account(&mut buf, "destination", &account.0).is_err() { + return -1; + } + + // STI_UINT128 + if event_add_u128(&mut buf, "uint128", &[0u8; 16]).is_err() { + return -1; + } + + // STI_UINT16 + if event_add_u16(&mut buf, "uint16", 16).is_err() { + return -1; + } + + // STI_UINT160 + if event_add_u160(&mut buf, "uint160", &[0u8; 20]).is_err() { + return -1; + } + + // STI_UINT192 + if event_add_u192(&mut buf, "uint192", &[0u8; 24]).is_err() { + return -1; + } + + // STI_UINT256 + if event_add_u256(&mut buf, "uint256", &[0u8; 32]).is_err() { + return -1; + } + + // STI_UINT32 + if event_add_u32(&mut buf, "uint32", 32).is_err() { + return -1; + } + + // STI_UINT64 + if event_add_u64(&mut buf, "uint64", 64).is_err() { + return -1; + } + + // STI_UINT8 + if event_add_u8(&mut buf, "uint8", 8).is_err() { + return -1; + } + + // STI_VL + if event_add_str(&mut buf, "vl", "Hello, World!").is_err() { + return -1; + } + + // STI_ISSUE (XRP) + // STI_ISSUE (IOU) + // STI_ISSUE (MPT) + + if buf.emit("event1").is_err() { + return -1; + } + 0 +} diff --git a/src/test/app/wasm_fixtures/parameters/Cargo.lock b/src/test/app/wasm_fixtures/parameters/Cargo.lock new file mode 100644 index 00000000000..c42d205b52d --- /dev/null +++ b/src/test/app/wasm_fixtures/parameters/Cargo.lock @@ -0,0 +1,15 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "parameters" +version = "0.0.1" +dependencies = [ + "xrpl-wasm-std", +] + +[[package]] +name = "xrpl-wasm-std" +version = "0.5.1-devnet5" +source = "git+https://github.com/Transia-RnD/craft.git?branch=dangell%2Fsmart-contracts#3c8191ae9832ea25f7d8f3e5eeb33b65181d31b5" diff --git a/src/test/app/wasm_fixtures/parameters/Cargo.toml b/src/test/app/wasm_fixtures/parameters/Cargo.toml new file mode 100644 index 00000000000..ab2406a30f4 --- /dev/null +++ b/src/test/app/wasm_fixtures/parameters/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "parameters" +version = "0.0.1" +edition = "2024" + +# This empty workspace definition keeps this project independent of the parent workspace +[workspace] + +[lib] +crate-type = ["cdylib"] + +[profile.release] +lto = true +opt-level = 's' +panic = "abort" + +[dependencies] +xrpl-wasm-std = { git = "https://github.com/Transia-RnD/craft.git", branch = "dangell/smart-contracts", package = "xrpl-wasm-std" } + +[profile.dev] +panic = "abort" diff --git a/src/test/app/wasm_fixtures/parameters/src/lib.rs b/src/test/app/wasm_fixtures/parameters/src/lib.rs new file mode 100644 index 00000000000..e03abbf4c9a --- /dev/null +++ b/src/test/app/wasm_fixtures/parameters/src/lib.rs @@ -0,0 +1,751 @@ +#![allow(unused_imports)] +#![cfg_attr(target_arch = "wasm32", no_std)] + +#[cfg(not(target_arch = "wasm32"))] +extern crate std; + +use xrpl_wasm_std::core::params::function::get_function_param; +use xrpl_wasm_std::core::params::instance::get_instance_param; +use xrpl_wasm_std::core::type_codes::{ + STI_ACCOUNT, STI_AMOUNT, STI_ARRAY, STI_CURRENCY, STI_NUMBER, STI_OBJECT, STI_UINT128, + STI_UINT16, STI_UINT160, STI_UINT192, STI_UINT256, STI_UINT32, STI_UINT64, STI_UINT8, STI_VL, +}; +use xrpl_wasm_std::core::types::account_id::AccountID; +use xrpl_wasm_std::core::types::amount::opaque_float::OpaqueFloat; +use xrpl_wasm_std::core::types::amount::opaque_float::{FLOAT_NEGATIVE_ONE, FLOAT_ONE}; +use xrpl_wasm_std::core::types::amount::token_amount::TokenAmount; +use xrpl_wasm_std::core::types::hash_256::Hash256; +use xrpl_wasm_std::core::types::number::Number; +use xrpl_wasm_std::core::types::uint_160::UInt160; +use xrpl_wasm_std::core::types::uint_192::UInt192; +use xrpl_wasm_std::host::trace::{trace, trace_data, trace_float, trace_num, DataRepr}; +use xrpl_wasm_std::host::{float_add, float_set, FLOAT_ROUNDING_MODES_TO_NEAREST}; +use xrpl_wasm_std::host::{function_param, instance_param}; + +#[unsafe(no_mangle)] +pub extern "C" fn function_params() -> i32 { + // UINT8 + let value = match get_function_param::(0) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT8 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT8 Value:", value as i64); + // as hex + let _ = trace_data("UINT8 Hex:", &[value], DataRepr::AsHex); + + // TODO: replace with require + if value != 255 { + let _ = trace("UINT8 Parameter Error: Invalid Value"); + return -1; + } + + // UINT16 + let value = match get_function_param::(1) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT16 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT16 Value:", value as i64); + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT16 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if value != 65535 { + let _ = trace("UINT16 Parameter Error: Invalid Value"); + return -1; + } + + // UINT32 + let value = match get_function_param::(2) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT32 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT32 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if value != 4294967295 { + let _ = trace("UINT32 Parameter Error: Invalid Value"); + return -1; + } + + // UINT64 + let value = match get_function_param::(3) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT64 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT64 Value:", value as i64); + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT64 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if buf != [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] { + let _ = trace("UINT64 Parameter Error: Invalid Value"); + return -1; + } + + // UINT128 + let value = match get_function_param::(4) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT128 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT128 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if buf + != [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, + ] + { + let _ = trace("UINT128 Parameter Error: Invalid Value"); + return -1; + } + + // UINT160 + let value = match get_function_param::(5) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT160 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT160 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected190: [u8; 20] = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, + ]; + if *buf != expected190 { + let _ = trace("UINT160 Parameter Error: Invalid Value"); + return -1; + } + + // UINT192 + let value = match get_function_param::(6) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT192 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT192 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected192: [u8; 24] = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + ]; + if *buf != expected192 { + let _ = trace("UINT192 Parameter Error: Invalid Value"); + return -1; + } + + // UINT256 + let value = match get_function_param::(7) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT256 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT256 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected256: [u8; 32] = [ + 0xD9, 0x55, 0xDA, 0xC2, 0xE7, 0x75, 0x19, 0xF0, 0x5A, 0xD1, 0x51, 0xA5, 0xD3, 0xC9, 0x9F, + 0xC8, 0x12, 0x5F, 0xB3, 0x9D, 0x58, 0xFF, 0x9F, 0x10, 0x6F, 0x1A, 0xCA, 0x44, 0x91, 0x90, + 0x2C, 0x25, + ]; + if *buf != expected256 { + let _ = trace("UINT256 Parameter Error: Invalid Value"); + return -1; + } + + // // VL + // let mut buf = [0x00; 4]; + // let output_len = unsafe { function_param(8, STI_VL.into(), buf.as_mut_ptr(), buf.len()) }; + // let _ = trace_num("VL Value Len:", output_len as i64); + // // as hex + // let _ = trace_data("VL Hex:", &buf[0..4], DataRepr::AsHex); + + // ACCOUNT + let account_id = match get_function_param::(9) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("ACCOUNT Parameter Error Code:", err as i64); + return -1; + } + }; + // trace the value + let _ = trace_data("ACCOUNT Value:", &account_id.0, DataRepr::AsHex); + + // TODO: replace with require + let expectedAccount: [u8; 20] = [ + 0xAE, 0x12, 0x3A, 0x85, 0x56, 0xF3, 0xCF, 0x91, 0x15, 0x47, 0x11, 0x37, 0x6A, 0xFB, 0x0F, + 0x89, 0x4F, 0x83, 0x2B, 0x3D, + ]; + if account_id.0 != expectedAccount { + let _ = trace("ACCOUNT Parameter Error: Invalid Value"); + return -1; + } + + // AMOUNT XRP + let xrp_token = match get_function_param::(10) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("AMOUNT XRP Parameter Error Code:", err as i64); + return -1; + } + }; + match xrp_token { + TokenAmount::XRP { num_drops } => { + let _ = trace_num("AMOUNT Value (XRP):", num_drops); + } + _ => { + let _ = trace_num("AMOUNT Value (XRP):", -1); + } + } + let buf = match xrp_token { + TokenAmount::XRP { num_drops } => num_drops.to_le_bytes(), + _ => [0u8; 8], + }; + let _ = trace_data("AMOUNT Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if let TokenAmount::XRP { num_drops } = xrp_token { + if num_drops != 1000000 { + let _ = trace("AMOUNT.XRP Parameter Error: Invalid Value"); + return -1; + } + } else { + let _ = trace("AMOUNT.XRP Parameter Error: Invalid Type"); + return -1; + } + + // AMOUNT IOU + let iou_token = match get_function_param::(11) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("AMOUNT IOU Parameter Error Code:", err as i64); + return -1; + } + }; + let (iou_amount, iou_issuer, iou_currency) = match &iou_token { + TokenAmount::IOU { + amount, + issuer, + currency_code, + } => { + // trace amount hex + let _ = trace_data("AMOUNT Value (IOU):", &amount.0, DataRepr::AsHex); + let _ = trace_float("AMOUNT Value (IOU) - Original:", &amount.0); + let _ = trace_data("IOU Issuer:", &issuer.0, DataRepr::AsHex); + let _ = trace_data("IOU Currency:", ¤cy_code.0, DataRepr::AsHex); + + // Add FLOAT_ONE to the IOU amount + let mut new_amount: [u8; 8] = [0u8; 8]; + let result = unsafe { + float_add( + amount.0.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + new_amount.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + if result == 8 { + // trace hex of the new amount + let _ = trace_data( + "AMOUNT Value (IOU) - After adding 1:", + &new_amount, + DataRepr::AsHex, + ); + let _ = trace_float("AMOUNT Value (IOU) - After adding 1:", &new_amount); + + // Create a new TokenAmount with the updated amount + let updated_token = TokenAmount::IOU { + amount: new_amount.into(), + issuer: *issuer, + currency_code: *currency_code, + }; + + // You now have the updated token amount in `updated_token` + // and the raw float bytes in `new_amount` + } else { + let _ = trace_num( + "Error adding FLOAT_ONE to IOU amount, result:", + result as i64, + ); + } + + (Some(*amount), Some(*issuer), Some(*currency_code)) + } + _ => { + let _ = trace_data("AMOUNT Value (IOU):", &[0u8; 8], DataRepr::AsHex); + (None, None, None) + } + }; + // trace new iou_amount as hex + if let Some(amount) = iou_amount { + let _ = trace_data("IOU Amount:", &amount.0, DataRepr::AsHex); + } else { + let _ = trace_data("IOU Amount:", &[0u8; 8], DataRepr::AsHex); + } + + // TODO: replace with require + if iou_amount.is_none() { + let _ = trace("AMOUNT.IOU Parameter Error: Invalid Type"); + return -1; + } + + // let mut buf = [0x00; 12]; + // let output_len = unsafe { function_param(12, STI_NUMBER.into(), buf.as_mut_ptr(), buf.len()) }; + // let _ = trace_num("NUMBER Value Len:", output_len as i64); + + // NUMBER + let number = match get_function_param::(12) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("NUMBER Parameter Error Code:", err as i64); + return -1; + } + }; + // trace the value + let buf = number.as_bytes(); + let _ = trace_data("NUMBER Value:", &buf, DataRepr::AsHex); + + // TODO: replace with require + let expectedNumber: [u8; 12] = [ + 0x00, 0x04, 0x43, 0x64, 0xC5, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF1, + ]; + if buf != expectedNumber { + let _ = trace("NUMBER Parameter Error: Invalid Value"); + return -1; + } + + // // Parse Number to get mantissa and exponent + // let stnum = Number::from(&buf).unwrap(); + let _ = trace_num("NUMBER Mantissa:", number.mantissa); + let _ = trace_num("NUMBER Exponent:", number.exponent as i64); + + let mut opaque_float_buf = [0x00; 8]; + let result = unsafe { + float_set( + number.exponent, + number.mantissa, + opaque_float_buf.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + let opaque = OpaqueFloat::from(opaque_float_buf); + let _ = trace_float("NUMBER as OpaqueFloat:", &opaque.0); + let _ = trace_data( + "NUMBER OpaqueFloat Hex:", + &opaque_float_buf, + DataRepr::AsHex, + ); + + // AMOUNT (MPT) + // ISSUE (XRP) + // ISSUE (IOU) + // ISSUE (MPT) + // CURRENCY + + return 0; // Return success code +} + +#[unsafe(no_mangle)] +pub extern "C" fn instance_params() -> i32 { + // UINT8 + let value = match get_instance_param::(1) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT8 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT8 Value:", value as i64); + // as hex + let _ = trace_data("UINT8 Hex:", &[value], DataRepr::AsHex); + + // TODO: replace with require + if value != 255 { + let _ = trace("UINT8 Parameter Error: Invalid Value"); + return -1; + } + + // UINT16 + let value = match get_instance_param::(2) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT16 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT16 Value:", value as i64); + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT16 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if value != 65535 { + let _ = trace("UINT16 Parameter Error: Invalid Value"); + return -1; + } + + // UINT32 + let value = match get_instance_param::(3) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT32 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT32 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if value != 4294967295 { + let _ = trace("UINT32 Parameter Error: Invalid Value"); + return -1; + } + + // UINT64 + let value = match get_instance_param::(4) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT64 Parameter Error Code:", err as i64); + return -1; + } + }; + let _ = trace_num("UINT64 Value:", value as i64); + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT64 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if buf != [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF] { + let _ = trace("UINT64 Parameter Error: Invalid Value"); + return -1; + } + + // UINT128 + let value = match get_instance_param::(5) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT128 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.to_le_bytes(); + let _ = trace_data("UINT128 Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if buf + != [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, + ] + { + let _ = trace("UINT128 Parameter Error: Invalid Value"); + return -1; + } + + // UINT160 + let value = match get_instance_param::(6) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT160 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT160 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected190: [u8; 20] = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, + ]; + if *buf != expected190 { + let _ = trace("UINT160 Parameter Error: Invalid Value"); + return -1; + } + + // UINT192 + let value = match get_instance_param::(7) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT192 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT192 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected192: [u8; 24] = [ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + ]; + if *buf != expected192 { + let _ = trace("UINT192 Parameter Error: Invalid Value"); + return -1; + } + + // UINT256 + let value = match get_instance_param::(8) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("UINT256 Parameter Error Code:", err as i64); + return -1; + } + }; + // as hex + let buf = value.as_bytes(); + let _ = trace_data("UINT256 Hex:", buf, DataRepr::AsHex); + + // TODO: replace with require + let expected256: [u8; 32] = [ + 0xD9, 0x55, 0xDA, 0xC2, 0xE7, 0x75, 0x19, 0xF0, 0x5A, 0xD1, 0x51, 0xA5, 0xD3, 0xC9, 0x9F, + 0xC8, 0x12, 0x5F, 0xB3, 0x9D, 0x58, 0xFF, 0x9F, 0x10, 0x6F, 0x1A, 0xCA, 0x44, 0x91, 0x90, + 0x2C, 0x25, + ]; + if *buf != expected256 { + let _ = trace("UINT256 Parameter Error: Invalid Value"); + return -1; + } + + // // VL + // let mut buf = [0x00; 4]; + // let output_len = unsafe { instance_param(8, STI_VL.into(), buf.as_mut_ptr(), buf.len()) }; + // let _ = trace_num("VL Value Len:", output_len as i64); + // // as hex + // let _ = trace_data("VL Hex:", &buf[0..4], DataRepr::AsHex); + + // ACCOUNT + let account_id = match get_instance_param::(10) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("ACCOUNT Parameter Error Code:", err as i64); + return -1; + } + }; + // trace the value + let _ = trace_data("ACCOUNT Value:", &account_id.0, DataRepr::AsHex); + + // TODO: replace with require + let expectedAccount: [u8; 20] = [ + 0xAE, 0x12, 0x3A, 0x85, 0x56, 0xF3, 0xCF, 0x91, 0x15, 0x47, 0x11, 0x37, 0x6A, 0xFB, 0x0F, + 0x89, 0x4F, 0x83, 0x2B, 0x3D, + ]; + if account_id.0 != expectedAccount { + let _ = trace("ACCOUNT Parameter Error: Invalid Value"); + return -1; + } + + // AMOUNT XRP + let xrp_token = match get_instance_param::(11) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("AMOUNT XRP Parameter Error Code:", err as i64); + return -1; + } + }; + match xrp_token { + TokenAmount::XRP { num_drops } => { + let _ = trace_num("AMOUNT Value (XRP):", num_drops); + } + _ => { + let _ = trace_num("AMOUNT Value (XRP):", -1); + } + } + let buf = match xrp_token { + TokenAmount::XRP { num_drops } => num_drops.to_le_bytes(), + _ => [0u8; 8], + }; + let _ = trace_data("AMOUNT Hex:", &buf, DataRepr::AsHex); + + // TODO: replace with require + if let TokenAmount::XRP { num_drops } = xrp_token { + if num_drops != 1000000 { + let _ = trace("AMOUNT.XRP Parameter Error: Invalid Value"); + return -1; + } + } else { + let _ = trace("AMOUNT.XRP Parameter Error: Invalid Type"); + return -1; + } + + // AMOUNT IOU + let iou_token = match get_instance_param::(12) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("AMOUNT IOU Parameter Error Code:", err as i64); + return -1; + } + }; + let (iou_amount, iou_issuer, iou_currency) = match &iou_token { + TokenAmount::IOU { + amount, + issuer, + currency_code, + } => { + // trace amount hex + let _ = trace_data("AMOUNT Value (IOU):", &amount.0, DataRepr::AsHex); + let _ = trace_float("AMOUNT Value (IOU) - Original:", &amount.0); + let _ = trace_data("IOU Issuer:", &issuer.0, DataRepr::AsHex); + let _ = trace_data("IOU Currency:", ¤cy_code.0, DataRepr::AsHex); + + // Add FLOAT_ONE to the IOU amount + let mut new_amount: [u8; 8] = [0u8; 8]; + let result = unsafe { + float_add( + amount.0.as_ptr(), + 8, + FLOAT_ONE.as_ptr(), + 8, + new_amount.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + if result == 8 { + // trace hex of the new amount + let _ = trace_data( + "AMOUNT Value (IOU) - After adding 1:", + &new_amount, + DataRepr::AsHex, + ); + let _ = trace_float("AMOUNT Value (IOU) - After adding 1:", &new_amount); + + // Create a new TokenAmount with the updated amount + let updated_token = TokenAmount::IOU { + amount: new_amount.into(), + issuer: *issuer, + currency_code: *currency_code, + }; + + // You now have the updated token amount in `updated_token` + // and the raw float bytes in `new_amount` + } else { + let _ = trace_num( + "Error adding FLOAT_ONE to IOU amount, result:", + result as i64, + ); + } + + (Some(*amount), Some(*issuer), Some(*currency_code)) + } + _ => { + let _ = trace_data("AMOUNT Value (IOU):", &[0u8; 8], DataRepr::AsHex); + (None, None, None) + } + }; + // trace new iou_amount as hex + if let Some(amount) = iou_amount { + let _ = trace_data("IOU Amount:", &amount.0, DataRepr::AsHex); + } else { + let _ = trace_data("IOU Amount:", &[0u8; 8], DataRepr::AsHex); + } + + // TODO: replace with require + if iou_amount.is_none() { + let _ = trace("AMOUNT.IOU Parameter Error: Invalid Type"); + return -1; + } + + // let mut buf = [0x00; 12]; + // let output_len = unsafe { instance_param(12, STI_NUMBER.into(), buf.as_mut_ptr(), buf.len()) }; + // let _ = trace_num("NUMBER Value Len:", output_len as i64); + + // NUMBER + let number = match get_instance_param::(13) { + Ok(a) => a, + Err(err) => { + let _ = trace_num("NUMBER Parameter Error Code:", err as i64); + return -1; + } + }; + // trace the value + let buf = number.as_bytes(); + let _ = trace_data("NUMBER Value:", &buf, DataRepr::AsHex); + + // TODO: replace with require + let expectedNumber: [u8; 12] = [ + 0x00, 0x04, 0x43, 0x64, 0xC5, 0xBB, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF1, + ]; + if buf != expectedNumber { + let _ = trace("NUMBER Parameter Error: Invalid Value"); + return -1; + } + + // // Parse Number to get mantissa and exponent + // let stnum = Number::from(&buf).unwrap(); + let _ = trace_num("NUMBER Mantissa:", number.mantissa); + let _ = trace_num("NUMBER Exponent:", number.exponent as i64); + + let mut opaque_float_buf = [0x00; 8]; + let result = unsafe { + float_set( + number.exponent, + number.mantissa, + opaque_float_buf.as_mut_ptr(), + 8, + FLOAT_ROUNDING_MODES_TO_NEAREST, + ) + }; + + let opaque = OpaqueFloat::from(opaque_float_buf); + let _ = trace_float("NUMBER as OpaqueFloat:", &opaque.0); + let _ = trace_data( + "NUMBER OpaqueFloat Hex:", + &opaque_float_buf, + DataRepr::AsHex, + ); + + // AMOUNT (MPT) + // ISSUE (XRP) + // ISSUE (IOU) + // ISSUE (MPT) + // CURRENCY + + return 0; // Return success code +} diff --git a/src/test/consensus/NegativeUNL_test.cpp b/src/test/consensus/NegativeUNL_test.cpp index 0f977047558..4b88bca6343 100644 --- a/src/test/consensus/NegativeUNL_test.cpp +++ b/src/test/consensus/NegativeUNL_test.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include diff --git a/src/test/jtx.h b/src/test/jtx.h index d4b88b0b9ef..fa5a0a466c0 100644 --- a/src/test/jtx.h +++ b/src/test/jtx.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/src/test/jtx/contract.h b/src/test/jtx/contract.h new file mode 100644 index 00000000000..2cebb3c82d1 --- /dev/null +++ b/src/test/jtx/contract.h @@ -0,0 +1,164 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include + +#include "test/jtx/SignerUtils.h" + +#include +#include +#include + +namespace xrpl { +namespace test { +namespace jtx { + +/** Contract operations */ +namespace contract { + +Json::Value +create(jtx::Account const& account, std::string const& contractCode); + +Json::Value +create(jtx::Account const& account, uint256 const& contractHash); + +Json::Value +modify( + jtx::Account const& account, + jtx::Account const& contractAccount, + std::string const& contractCode); + +Json::Value +modify( + jtx::Account const& account, + jtx::Account const& contractAccount, + uint256 const& contractHash); + +Json::Value +modify(jtx::Account const& account, jtx::Account const& contractAccount, jtx::Account const& owner); + +Json::Value +del(jtx::Account const& account, jtx::Account const& contractAccount); + +Json::Value +call( + jtx::Account const& account, + jtx::Account const& contractAccount, + std::string const& functionName); + +Json::Value +userDelete(jtx::Account const& account, jtx::Account const& contractAccount); + +/** Add Function on a JTx. */ +class add_function +{ +private: + std::string const name_; + std::vector> call_params_; + +public: + explicit add_function( + std::string const& name, + std::vector> call_params) + : name_{name}, call_params_{std::move(call_params)} + { + } + + void + operator()(Env&, JTx& jtx) const; +}; + +/** Add Instance Parameter on a JTx. */ +template +class add_instance_param +{ +private: + std::uint32_t flags_; + std::string name_; + std::string type_; + T value_; + +public: + explicit add_instance_param( + std::uint32_t flags, + std::string const& name, + std::string const& type, + T value) + : flags_{flags}, name_{name}, type_{type}, value_{value} + { + } + + void + operator()(Env&, JTx& jtx) const + { + if (jtx.jv.isMember(sfContractCode.fieldName)) + { + // Add instance Parameters + if (!jtx.jv.isMember(sfInstanceParameters.fieldName)) + { + jtx.jv[sfInstanceParameters.fieldName] = Json::Value(Json::arrayValue); + } + Json::Value param = Json::Value(Json::objectValue); + param[sfInstanceParameter.fieldName][sfParameterFlag.fieldName] = flags_; + param[sfInstanceParameter.fieldName][sfParameterType.fieldName][jss::type] = type_; + jtx.jv[sfInstanceParameters.fieldName].append(param); + } + + // Add instance Parameter Values + if (!jtx.jv.isMember(sfInstanceParameterValues.fieldName)) + { + jtx.jv[sfInstanceParameterValues.fieldName] = Json::Value(Json::arrayValue); + } + Json::Value param = Json::Value(Json::objectValue); + param[sfInstanceParameterValue.fieldName][sfParameterFlag.fieldName] = flags_; + param[sfInstanceParameterValue.fieldName][sfParameterValue.fieldName][jss::type] = type_; + param[sfInstanceParameterValue.fieldName][sfParameterValue.fieldName][jss::value] = value_; + jtx.jv[sfInstanceParameterValues.fieldName].append(param); + } +}; + +/** Add Parameter Value on a JTx. */ +template +class add_param +{ +private: + std::uint32_t flags_; + std::string name_; + std::string type_; + T value_; + +public: + explicit add_param( + std::uint32_t flags, + std::string const& name, + std::string const& type, + T value) + : flags_(flags), name_(name), type_(type), value_(value) + { + } + + void + operator()(Env&, JTx& jtx) const + { + Json::Value param = Json::Value(Json::objectValue); + param[sfParameter] = Json::Value(Json::objectValue); + param[sfParameter][sfParameterFlag] = flags_; + param[sfParameter][sfParameterValue] = Json::Value(Json::objectValue); + param[sfParameter][sfParameterValue][jss::type] = type_; + param[sfParameter][sfParameterValue][jss::value] = value_; + jtx.jv[sfParameters].append(param); + } +}; + +} // namespace contract + +} // namespace jtx + +} // namespace test +} // namespace xrpl diff --git a/src/test/jtx/impl/contract.cpp b/src/test/jtx/impl/contract.cpp new file mode 100644 index 00000000000..f57b3921b4c --- /dev/null +++ b/src/test/jtx/impl/contract.cpp @@ -0,0 +1,134 @@ +#include +#include + +#include +#include + +namespace xrpl { +namespace test { +namespace jtx { + +namespace contract { + +Json::Value +create(jtx::Account const& account, std::string const& contractCode) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = account.human(); + jv[sfContractCode] = contractCode; + return jv; +} + +Json::Value +create(jtx::Account const& account, uint256 const& contractHash) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCreate; + jv[jss::Account] = account.human(); + jv[sfContractHash] = to_string(contractHash); + return jv; +} + +Json::Value +modify( + jtx::Account const& account, + jtx::Account const& contractAccount, + std::string const& contractCode) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractModify; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + jv[sfContractCode] = contractCode; + return jv; +} + +Json::Value +modify( + jtx::Account const& account, + jtx::Account const& contractAccount, + uint256 const& contractHash) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractModify; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + jv[sfContractHash] = to_string(contractHash); + return jv; +} + +Json::Value +modify(jtx::Account const& account, jtx::Account const& contractAccount, jtx::Account const& owner) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractModify; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + jv[sfOwner] = owner.human(); + return jv; +} + +Json::Value +del(jtx::Account const& account, jtx::Account const& contractAccount) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractDelete; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + return jv; +} + +Json::Value +call( + jtx::Account const& account, + jtx::Account const& contractAccount, + std::string const& functionName) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractCall; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + jv[sfFunctionName] = strHex(functionName); + jv[sfParameters] = Json::Value(Json::arrayValue); + return jv; +} + +Json::Value +userDelete(jtx::Account const& account, jtx::Account const& contractAccount) +{ + Json::Value jv; + jv[jss::TransactionType] = jss::ContractUserDelete; + jv[jss::Account] = account.human(); + jv[sfContractAccount] = contractAccount.human(); + return jv; +} + +Json::Value +addCallParam(std::uint32_t const& flags, std::string const& name, std::string const& typeName) +{ + Json::Value param = Json::Value(Json::objectValue); + param[sfParameter][sfParameterFlag] = flags; + param[sfParameter][sfParameterType][jss::type] = typeName; + return param; +}; + +void +add_function::operator()(Env&, JTx& jt) const +{ + auto const index = jt.jv[sfFunctions].size(); + Json::Value& function = jt.jv[sfFunctions][index]; + + function = Json::Value{}; + function[sfFunction][sfFunctionName] = strHex(name_); + for (auto const& [p_flags, p_name, p_type] : call_params_) + { + function[sfFunction][sfParameters].append(addCallParam(p_flags, p_name, p_type)); + } +} + +} // namespace contract + +} // namespace jtx +} // namespace test +} // namespace xrpl diff --git a/src/test/protocol/Hooks_test.cpp b/src/test/protocol/Hooks_test.cpp deleted file mode 100644 index 53f20a2b5ea..00000000000 --- a/src/test/protocol/Hooks_test.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include - -#include - -#include -#include - -namespace xrpl { - -class Hooks_test : public beast::unit_test::suite -{ - /** - * This unit test was requested here: - * https://github.com/ripple/rippled/pull/4089#issuecomment-1050274539 - * These are tests that exercise facilities that are reserved for when Hooks - * is merged in the future. - **/ - - void - testHookFields() - { - testcase("Test Hooks fields"); - - using namespace test::jtx; - - std::vector> const fields_to_test = { - sfHookResult, - sfHookStateChangeCount, - sfHookEmitCount, - sfHookExecutionIndex, - sfHookApiVersion, - sfHookStateCount, - sfEmitGeneration, - sfHookOn, - sfHookInstructionCount, - sfEmitBurden, - sfHookReturnCode, - sfReferenceCount, - sfEmitParentTxnID, - sfEmitNonce, - sfEmitHookHash, - sfHookStateKey, - sfHookHash, - sfHookNamespace, - sfHookSetTxnID, - sfHookStateData, - sfHookReturnString, - sfHookParameterName, - sfHookParameterValue, - sfEmitCallback, - sfHookAccount, - sfEmittedTxn, - sfHook, - sfHookDefinition, - sfHookParameter, - sfHookGrant, - sfEmitDetails, - sfHookExecutions, - sfHookExecution, - sfHookParameters, - sfHooks, - sfHookGrants}; - - for (auto const& rf : fields_to_test) - { - SField const& f = rf.get(); - - STObject dummy{sfGeneric}; - - BEAST_EXPECT(!dummy.isFieldPresent(f)); - - switch (f.fieldType) - { - case STI_UINT8: { - dummy.setFieldU8(f, 0); - BEAST_EXPECT(dummy.getFieldU8(f) == 0); - - dummy.setFieldU8(f, 255); - BEAST_EXPECT(dummy.getFieldU8(f) == 255); - - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_UINT16: { - dummy.setFieldU16(f, 0); - BEAST_EXPECT(dummy.getFieldU16(f) == 0); - - dummy.setFieldU16(f, 0xFFFFU); - BEAST_EXPECT(dummy.getFieldU16(f) == 0xFFFFU); - - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_UINT32: { - dummy.setFieldU32(f, 0); - BEAST_EXPECT(dummy.getFieldU32(f) == 0); - - dummy.setFieldU32(f, 0xFFFFFFFFU); - BEAST_EXPECT(dummy.getFieldU32(f) == 0xFFFFFFFFU); - - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_UINT64: { - dummy.setFieldU64(f, 0); - BEAST_EXPECT(dummy.getFieldU64(f) == 0); - - dummy.setFieldU64(f, 0xFFFFFFFFFFFFFFFFU); - BEAST_EXPECT(dummy.getFieldU64(f) == 0xFFFFFFFFFFFFFFFFU); - - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_UINT256: { - uint256 const u = uint256::fromVoid( - "DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBE" - "EFDEADBEEF"); - dummy.setFieldH256(f, u); - BEAST_EXPECT(dummy.getFieldH256(f) == u); - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_VL: { - std::vector const v{1, 2, 3}; - dummy.setFieldVL(f, v); - BEAST_EXPECT(dummy.getFieldVL(f) == v); - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_ACCOUNT: { - // NOLINTNEXTLINE(bugprone-unchecked-optional-access) - AccountID const id = - *parseBase58("rwfSjJNK2YQuN64bSWn7T2eY9FJAyAPYJT"); - dummy.setAccountID(f, id); - BEAST_EXPECT(dummy.getAccountID(f) == id); - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_OBJECT: { - dummy.emplace_back(STObject{f}); - BEAST_EXPECT(dummy.getField(f).getFName() == f); - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - case STI_ARRAY: { - STArray dummy2{f, 2}; - dummy2.push_back(STObject{sfGeneric}); - dummy2.push_back(STObject{sfGeneric}); - dummy.setFieldArray(f, dummy2); - BEAST_EXPECT(dummy.getFieldArray(f) == dummy2); - BEAST_EXPECT(dummy.isFieldPresent(f)); - break; - } - - default: - BEAST_EXPECT(false); - } - } - } - -public: - void - run() override - { - using namespace test::jtx; - testHookFields(); - } -}; - -BEAST_DEFINE_TESTSUITE(Hooks, protocol, xrpl); - -} // namespace xrpl diff --git a/src/test/protocol/STDataType_test.cpp b/src/test/protocol/STDataType_test.cpp new file mode 100644 index 00000000000..f5828a4c821 --- /dev/null +++ b/src/test/protocol/STDataType_test.cpp @@ -0,0 +1,641 @@ +#include +#include +#include +#include +#include + +namespace xrpl { +struct STDataType_test : public beast::unit_test::suite +{ + void + testConstructors() + { + testcase("constructors"); + + auto const& sf = sfParameterType; + + // Test default constructor + { + STDataType dt1(sf); + BEAST_EXPECT(dt1.getInnerSType() == STI_NOTPRESENT); + BEAST_EXPECT(dt1.getSType() == STI_DATATYPE); + BEAST_EXPECT(dt1.getFName() == sf); + } + + // Test constructor with SerializedTypeID + { + STDataType dt2(sf, STI_UINT32); + BEAST_EXPECT(dt2.getInnerSType() == STI_UINT32); + BEAST_EXPECT(!dt2.isDefault()); + } + + // Test deserialization constructor + { + Serializer s; + s.add16(STI_UINT64); + SerialIter sit(s.slice()); + STDataType dt3(sit, sf); + BEAST_EXPECT(dt3.getInnerSType() == STI_UINT64); + } + } + + void + testCopyMove() + { + testcase("copy and move"); + + auto const& sf = sfParameterType; + + // Test copy + { + STDataType original(sf, STI_UINT32); + + // Use aligned storage for placement new + alignas(STDataType) char buffer[sizeof(STDataType)]; + STBase* copied = original.copy(sizeof(buffer), buffer); + + BEAST_EXPECT(copied != nullptr); + auto* dt_copy = dynamic_cast(copied); + BEAST_EXPECT(dt_copy != nullptr); + BEAST_EXPECT(dt_copy->getInnerSType() == STI_UINT32); + BEAST_EXPECT(dt_copy->getFName() == sf); + + // Clean up + dt_copy->~STDataType(); + } + + // Test move + { + STDataType original(sf, STI_UINT64); + + alignas(STDataType) char buffer[sizeof(STDataType)]; + STBase* moved = original.move(sizeof(buffer), buffer); + + BEAST_EXPECT(moved != nullptr); + auto* dt_moved = dynamic_cast(moved); + BEAST_EXPECT(dt_moved != nullptr); + BEAST_EXPECT(dt_moved->getInnerSType() == STI_UINT64); + BEAST_EXPECT(dt_moved->getFName() == sf); + + // Clean up + dt_moved->~STDataType(); + } + } + + void + testSerialization() + { + testcase("serialization"); + + auto const& sf = sfParameterType; + + // Test all type serializations + struct TypeTest + { + SerializedTypeID type; + std::string expectedHex; + }; + + TypeTest tests[] = { + {STI_UINT16, "0001"}, + {STI_UINT32, "0002"}, + {STI_UINT64, "0003"}, + {STI_UINT128, "0004"}, + {STI_UINT256, "0005"}, + {STI_AMOUNT, "0006"}, + {STI_VL, "0007"}, + {STI_ACCOUNT, "0008"}, + {STI_UINT8, "0010"}, + {STI_UINT160, "0011"}, + {STI_PATHSET, "0012"}, + {STI_VECTOR256, "0013"}, + {STI_OBJECT, "000E"}, + {STI_ARRAY, "000F"}, + {STI_ISSUE, "0018"}, + {STI_XCHAIN_BRIDGE, "0019"}, + {STI_CURRENCY, "001A"}, + {STI_UINT192, "0015"}, + {STI_NUMBER, "0009"}}; + + for (auto const& test : tests) + { + Serializer s; + STDataType dt(sf); + dt.setInnerSType(test.type); + BEAST_EXPECT(dt.getInnerSType() == test.type); + dt.add(s); + BEAST_EXPECT(strHex(s) == test.expectedHex); + } + } + + void + testEquivalence() + { + testcase("equivalence"); + + auto const& sf1 = sfParameterType; + + // Test equivalent objects + { + STDataType dt1(sf1, STI_UINT32); + STDataType dt2(sf1, STI_UINT32); + BEAST_EXPECT(dt1.isEquivalent(dt2)); + } + + // Test non-equivalent objects (different inner types) + { + STDataType dt1(sf1, STI_UINT32); + STDataType dt2(sf1, STI_UINT64); + BEAST_EXPECT(!dt1.isEquivalent(dt2)); + } + + // Test non-equivalent objects (different default states) + { + STDataType dt1(sf1); + STDataType dt2(sf1, STI_NOTPRESENT); + // dt1 has default_ = true (implicit from first constructor) + // dt2 has default_ = false (set in second constructor) + BEAST_EXPECT(!dt1.isEquivalent(dt2)); + } + + // Test with non-STDataType object + { + STDataType dt1(sf1, STI_UINT32); + // Create a dummy STBase-derived object for comparison + // Since we can't easily create other STBase types here, + // we'll test that isEquivalent returns false for nullptr cast + struct DummySTBase : public STBase + { + DummySTBase() : STBase(sfInvalid) + { + } + SerializedTypeID + getSType() const override + { + return STI_NOTPRESENT; + } + void + add(Serializer&) const override + { + } + bool + isEquivalent(STBase const&) const override + { + return false; + } + bool + isDefault() const override + { + return true; + } + STBase* + copy(std::size_t, void*) const override + { + return nullptr; + } + STBase* + move(std::size_t, void*) override + { + return nullptr; + } + }; + DummySTBase dummy; + BEAST_EXPECT(!dt1.isEquivalent(dummy)); + } + } + + void + testDefault() + { + testcase("isDefault"); + + auto const& sf = sfParameterType; + + // Test default state + { + STDataType dt1(sf); + // First constructor doesn't set default_ explicitly, + // so it should be true (member initialization) + BEAST_EXPECT(dt1.isDefault()); + } + + { + STDataType dt2(sf, STI_UINT32); + BEAST_EXPECT(!dt2.isDefault()); + } + } + + void + testGetText() + { + testcase("getText"); + + auto const& sf = sfParameterType; + + // Test known types + { + STDataType dt(sf, STI_UINT8); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT8}"); + } + + { + STDataType dt(sf, STI_UINT16); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT16}"); + } + + { + STDataType dt(sf, STI_UINT32); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT32}"); + } + + { + STDataType dt(sf, STI_UINT64); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT64}"); + } + + { + STDataType dt(sf, STI_UINT128); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT128}"); + } + + { + STDataType dt(sf, STI_UINT160); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT160}"); + } + + { + STDataType dt(sf, STI_UINT192); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT192}"); + } + + { + STDataType dt(sf, STI_UINT256); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT256}"); + } + + { + STDataType dt(sf, STI_VL); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: VL}"); + } + + { + STDataType dt(sf, STI_ACCOUNT); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: ACCOUNT}"); + } + + { + STDataType dt(sf, STI_AMOUNT); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: AMOUNT}"); + } + + { + STDataType dt(sf, STI_ISSUE); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: ISSUE}"); + } + + { + STDataType dt(sf, STI_CURRENCY); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: CURRENCY}"); + } + + { + STDataType dt(sf, STI_NUMBER); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: NUMBER}"); + } + + // Test unknown type (should return numeric string) + { + STDataType dt(sf, static_cast(999)); + BEAST_EXPECT(dt.getText() == "STDataType{InnerType: 999}"); + } + } + + void + testGetJson() + { + testcase("getJson"); + + auto const& sf = sfParameterType; + + // Test JSON output for various types + { + STDataType dt(sf, STI_UINT32); + Json::Value json = dt.getJson(JsonOptions::none); + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(json[jss::type].asString() == "UINT32"); + } + + { + STDataType dt(sf, STI_AMOUNT); + Json::Value json = dt.getJson(JsonOptions::none); + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(json[jss::type].asString() == "AMOUNT"); + } + + { + STDataType dt(sf, STI_ACCOUNT); + Json::Value json = dt.getJson(JsonOptions::none); + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(json[jss::type].asString() == "ACCOUNT"); + } + + // Test unknown type + { + STDataType dt(sf, static_cast(999)); + Json::Value json = dt.getJson(JsonOptions::none); + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(json[jss::type].asString() == "999"); + } + } + + void + testDataTypeFromJson() + { + testcase("dataTypeFromJson"); + + auto const& sf = sfParameterType; + + // Test all valid type strings + { + Json::Value v; + v[jss::type] = "UINT8"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT8); + } + + { + Json::Value v; + v[jss::type] = "UINT16"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT16); + } + + { + Json::Value v; + v[jss::type] = "UINT32"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT32); + } + + { + Json::Value v; + v[jss::type] = "UINT64"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT64); + } + + { + Json::Value v; + v[jss::type] = "UINT128"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT128); + } + + { + Json::Value v; + v[jss::type] = "UINT160"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT160); + } + + { + Json::Value v; + v[jss::type] = "UINT192"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT192); + } + + { + Json::Value v; + v[jss::type] = "UINT256"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_UINT256); + } + + { + Json::Value v; + v[jss::type] = "VL"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_VL); + } + + { + Json::Value v; + v[jss::type] = "ACCOUNT"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_ACCOUNT); + } + + { + Json::Value v; + v[jss::type] = "AMOUNT"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_AMOUNT); + } + + { + Json::Value v; + v[jss::type] = "ISSUE"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_ISSUE); + } + + { + Json::Value v; + v[jss::type] = "CURRENCY"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_CURRENCY); + } + + { + Json::Value v; + v[jss::type] = "NUMBER"; + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(dt.getInnerSType() == STI_NUMBER); + } + + // Test error cases + + // Non-object JSON should throw + { + Json::Value v = "not an object"; + try + { + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(false); // Should not reach here + } + catch (std::runtime_error const& e) + { + BEAST_EXPECT(std::string(e.what()) == "STData: expected object"); + } + } + + // Unknown type string should throw + { + Json::Value v; + v[jss::type] = "UNKNOWN_TYPE"; + try + { + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(false); // Should not reach here + } + catch (std::runtime_error const& e) + { + BEAST_EXPECT( + std::string(e.what()) == "STData: unsupported type string: UNKNOWN_TYPE"); + } + } + + // Empty type string should throw + { + Json::Value v; + v[jss::type] = ""; + try + { + STDataType dt = dataTypeFromJson(sf, v); + BEAST_EXPECT(false); // Should not reach here + } + catch (std::runtime_error const& e) + { + BEAST_EXPECT(std::string(e.what()) == "STData: unsupported type string: "); + } + } + } + + void + testRoundTrip() + { + testcase("round trip serialization"); + + auto const& sf = sfParameterType; + + // Test serialization and deserialization round trip + for (auto typeId : + {STI_UINT8, + STI_UINT16, + STI_UINT32, + STI_UINT64, + STI_UINT128, + STI_UINT160, + STI_UINT192, + STI_UINT256, + STI_VL, + STI_ACCOUNT, + STI_AMOUNT, + STI_ISSUE, + STI_CURRENCY, + STI_NUMBER}) + { + // Create original + STDataType original(sf, typeId); + + // Serialize + Serializer s; + original.add(s); + + // Deserialize + SerialIter sit(s.slice()); + STDataType deserialized(sit, sf); + + // Compare + BEAST_EXPECT(deserialized.getInnerSType() == typeId); + BEAST_EXPECT(original.isEquivalent(deserialized)); + } + } + + void + testJsonRoundTrip() + { + testcase("JSON round trip"); + + auto const& sf = sfParameterType; + + std::vector typeStrings = { + "UINT8", + "UINT16", + "UINT32", + "UINT64", + "UINT128", + "UINT160", + "UINT192", + "UINT256", + "VL", + "ACCOUNT", + "AMOUNT", + "ISSUE", + "CURRENCY", + "NUMBER"}; + + for (auto const& typeStr : typeStrings) + { + // Create from JSON + Json::Value input; + input[jss::type] = typeStr; + STDataType dt = dataTypeFromJson(sf, input); + + // Convert back to JSON + Json::Value output = dt.getJson(JsonOptions::none); + + // Verify + BEAST_EXPECT(output[jss::type].asString() == typeStr); + } + } + + void + testGetInnerTypeString() + { + testcase("getInnerTypeString"); + + auto const& sf = sfParameterType; + + struct TypeStringTest + { + SerializedTypeID type; + std::string expected; + }; + + TypeStringTest tests[] = { + {STI_UINT8, "UINT8"}, + {STI_UINT16, "UINT16"}, + {STI_UINT32, "UINT32"}, + {STI_UINT64, "UINT64"}, + {STI_UINT128, "UINT128"}, + {STI_UINT160, "UINT160"}, + {STI_UINT192, "UINT192"}, + {STI_UINT256, "UINT256"}, + {STI_VL, "VL"}, + {STI_ACCOUNT, "ACCOUNT"}, + {STI_AMOUNT, "AMOUNT"}, + {STI_ISSUE, "ISSUE"}, + {STI_CURRENCY, "CURRENCY"}, + {STI_NUMBER, "NUMBER"}, + {static_cast(999), "999"} // Unknown type + }; + + for (auto const& test : tests) + { + STDataType dt(sf, test.type); + BEAST_EXPECT(dt.getInnerTypeString() == test.expected); + } + } + + void + run() override + { + testConstructors(); + testCopyMove(); + testSerialization(); + testEquivalence(); + testDefault(); + testGetText(); + testGetJson(); + testDataTypeFromJson(); + testRoundTrip(); + testJsonRoundTrip(); + testGetInnerTypeString(); + } +}; + +BEAST_DEFINE_TESTSUITE(STDataType, protocol, xrpl); + +} // namespace xrpl diff --git a/src/test/protocol/STData_test.cpp b/src/test/protocol/STData_test.cpp new file mode 100644 index 00000000000..afc929983d2 --- /dev/null +++ b/src/test/protocol/STData_test.cpp @@ -0,0 +1,1290 @@ +#include +#include +#include +#include +#include + +namespace xrpl { + +struct STData_test : public beast::unit_test::suite +{ + void + testConstructors() + { + testcase("Constructors"); + + auto const& sf = sfParameterValue; + + // Default constructor + { + STData data(sf); + BEAST_EXPECT(data.getSType() == STI_DATA); + BEAST_EXPECT(data.isDefault()); + } + + // Type-specific constructors + { + // UINT8 + STData data_u8(sf, static_cast(8)); + BEAST_EXPECT(data_u8.getFieldU8() == 8); + BEAST_EXPECT(data_u8.getInnerTypeString() == "UINT8"); + BEAST_EXPECT(data_u8.isDefault()); + + // UINT16 + STData data_u16(sf, static_cast(16)); + BEAST_EXPECT(data_u16.getFieldU16() == 16); + BEAST_EXPECT(data_u16.getInnerTypeString() == "UINT16"); + + // UINT32 + STData data_u32(sf, static_cast(32)); + BEAST_EXPECT(data_u32.getFieldU32() == 32); + BEAST_EXPECT(data_u32.getInnerTypeString() == "UINT32"); + + // UINT64 + STData data_u64(sf, static_cast(64)); + BEAST_EXPECT(data_u64.getFieldU64() == 64); + BEAST_EXPECT(data_u64.getInnerTypeString() == "UINT64"); + + // UINT128 + uint128 val128 = uint128(1); + STData data_u128(sf, val128); + BEAST_EXPECT(data_u128.getFieldH128() == val128); + BEAST_EXPECT(data_u128.getInnerTypeString() == "UINT128"); + + // UINT160 + uint160 val160 = uint160(1); + STData data_u160(sf, val160); + BEAST_EXPECT(data_u160.getFieldH160() == val160); + BEAST_EXPECT(data_u160.getInnerTypeString() == "UINT160"); + + // UINT192 + uint192 val192 = uint192(1); + STData data_u192(sf, val192); + BEAST_EXPECT(data_u192.getFieldH192() == val192); + BEAST_EXPECT(data_u192.getInnerTypeString() == "UINT192"); + + // UINT256 + uint256 val256 = uint256(1); + STData data_u256(sf, val256); + BEAST_EXPECT(data_u256.getFieldH256() == val256); + BEAST_EXPECT(data_u256.getInnerTypeString() == "UINT256"); + + // Blob + Blob blob = strUnHex("DEADBEEFCAFEBABE").value(); + STData data_blob(sf, blob); + BEAST_EXPECT(data_blob.getFieldVL() == blob); + BEAST_EXPECT(data_blob.getInnerTypeString() == "VL"); + + // Slice + std::string test_str = "Hello World"; + Slice slice(test_str.data(), test_str.size()); + STData data_slice(sf, slice); + Blob expected_blob(test_str.begin(), test_str.end()); + BEAST_EXPECT(data_slice.getFieldVL() == expected_blob); + + // AccountID + AccountID account(0x123456789ABCDEF0); + STData data_account(sf, account); + BEAST_EXPECT(data_account.getAccountID() == account); + BEAST_EXPECT(data_account.getInnerTypeString() == "ACCOUNT"); + + // STAmount (Native) + STAmount amount_native(1000); + STData data_amount_native(sf, amount_native); + BEAST_EXPECT(data_amount_native.getFieldAmount() == amount_native); + BEAST_EXPECT(data_amount_native.getInnerTypeString() == "AMOUNT"); + + // STAmount (IOU) + IOUAmount iou_amount(5000); + Issue const usd( + Currency(0x5553440000000000), + parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value()); + STAmount amount_iou(iou_amount, usd); + STData data_amount_iou(sf, amount_iou); + BEAST_EXPECT(data_amount_iou.getFieldAmount() == amount_iou); + } + } + + void + testSerializationDeserialization() + { + testcase("Serialization/Deserialization"); + + auto const& sf = sfParameterValue; + + // Test each type's serialization and deserialization round-trip + { + // UINT8 + std::uint8_t original_u8 = 8; + STData data_u8(sf, original_u8); + + Serializer s; + data_u8.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u8(sit, sf); + + BEAST_EXPECT(deserialized_u8.getFieldU8() == original_u8); + BEAST_EXPECT(deserialized_u8.getInnerTypeString() == "UINT8"); + } + + { + // UINT16 + std::uint16_t original_u16 = 16; + STData data_u16(sf, original_u16); + + Serializer s; + data_u16.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u16(sit, sf); + + BEAST_EXPECT(deserialized_u16.getFieldU16() == original_u16); + BEAST_EXPECT(deserialized_u16.getInnerTypeString() == "UINT16"); + } + + { + // UINT32 + std::uint32_t original_u32 = 32; + STData data_u32(sf, original_u32); + + Serializer s; + data_u32.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u32(sit, sf); + + BEAST_EXPECT(deserialized_u32.getFieldU32() == original_u32); + BEAST_EXPECT(deserialized_u32.getInnerTypeString() == "UINT32"); + } + + { + // UINT64 + std::uint64_t original_u64 = 64; + STData data_u64(sf, original_u64); + + Serializer s; + data_u64.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u64(sit, sf); + + BEAST_EXPECT(deserialized_u64.getFieldU64() == original_u64); + BEAST_EXPECT(deserialized_u64.getInnerTypeString() == "UINT64"); + } + + { + // UINT128 + uint128 original_u128 = uint128(1); + STData data_u128(sf, original_u128); + + Serializer s; + data_u128.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u128(sit, sf); + + BEAST_EXPECT(deserialized_u128.getFieldH128() == original_u128); + BEAST_EXPECT(deserialized_u128.getInnerTypeString() == "UINT128"); + } + + { + // UINT160 + uint160 original_u160 = uint160(1); + STData data_u160(sf, original_u160); + + Serializer s; + data_u160.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u160(sit, sf); + + BEAST_EXPECT(deserialized_u160.getFieldH160() == original_u160); + BEAST_EXPECT(deserialized_u160.getInnerTypeString() == "UINT160"); + } + + { + // UINT192 + uint192 original_u192 = uint192(1); + STData data_u192(sf, original_u192); + + Serializer s; + data_u192.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u192(sit, sf); + + BEAST_EXPECT(deserialized_u192.getFieldH192() == original_u192); + BEAST_EXPECT(deserialized_u192.getInnerTypeString() == "UINT192"); + } + + { + // UINT256 + uint256 original_u256 = uint256(1); + STData data_u256(sf, original_u256); + + Serializer s; + data_u256.add(s); + + SerialIter sit(s.slice()); + STData deserialized_u256(sit, sf); + + BEAST_EXPECT(deserialized_u256.getFieldH256() == original_u256); + BEAST_EXPECT(deserialized_u256.getInnerTypeString() == "UINT256"); + } + + { + // VL (Variable Length) + Blob original_blob = strUnHex("DEADBEEFCAFEBABE1234567890ABCDEF").value(); + STData data_vl(sf, original_blob); + + Serializer s; + data_vl.add(s); + + SerialIter sit(s.slice()); + STData deserialized_vl(sit, sf); + + BEAST_EXPECT(deserialized_vl.getFieldVL() == original_blob); + BEAST_EXPECT(deserialized_vl.getInnerTypeString() == "VL"); + } + + { + // ACCOUNT + AccountID original_account(0xFEDCBA9876543210); + STData data_account(sf, original_account); + + Serializer s; + data_account.add(s); + + SerialIter sit(s.slice()); + STData deserialized_account(sit, sf); + + BEAST_EXPECT(deserialized_account.getAccountID() == original_account); + BEAST_EXPECT(deserialized_account.getInnerTypeString() == "ACCOUNT"); + } + + { + // AMOUNT (Native) + STAmount original_amount(99999); + STData data_amount(sf, original_amount); + + Serializer s; + data_amount.add(s); + + SerialIter sit(s.slice()); + STData deserialized_amount(sit, sf); + + BEAST_EXPECT(deserialized_amount.getFieldAmount() == original_amount); + BEAST_EXPECT(deserialized_amount.getInnerTypeString() == "AMOUNT"); + } + + { + // CURRENCY + } + + { + // ISSUE + } + + { + // NUMBER + } + } + + void + testSettersAndGetters() + { + testcase("Setters and Getters"); + + auto const& sf = sfParameterValue; + STData data(sf); + + // Test all setter/getter combinations + { + // UINT8 + unsigned char val_u8 = 8; + data.setFieldU8(val_u8); + BEAST_EXPECT(data.getFieldU8() == val_u8); + BEAST_EXPECT(data.getInnerTypeString() == "UINT8"); + } + + { + // UINT16 + std::uint16_t val_u16 = 16; + data.setFieldU16(val_u16); + BEAST_EXPECT(data.getFieldU16() == val_u16); + BEAST_EXPECT(data.getInnerTypeString() == "UINT16"); + } + + { + // UINT32 + std::uint32_t val_u32 = 32; + data.setFieldU32(val_u32); + BEAST_EXPECT(data.getFieldU32() == val_u32); + BEAST_EXPECT(data.getInnerTypeString() == "UINT32"); + } + + { + // UINT64 + std::uint64_t val_u64 = 64; + data.setFieldU64(val_u64); + BEAST_EXPECT(data.getFieldU64() == val_u64); + BEAST_EXPECT(data.getInnerTypeString() == "UINT64"); + } + + { + // UINT128 + uint128 val_u128 = uint128(1); + data.setFieldH128(val_u128); + BEAST_EXPECT(data.getFieldH128() == val_u128); + BEAST_EXPECT(data.getInnerTypeString() == "UINT128"); + } + + { + // UINT160 + uint160 val_u160 = uint160(1); + data.setFieldH160(val_u160); + BEAST_EXPECT(data.getFieldH160() == val_u160); + BEAST_EXPECT(data.getInnerTypeString() == "UINT160"); + } + + { + // UINT192 + uint192 val_u192 = uint192(1); + data.setFieldH192(val_u192); + BEAST_EXPECT(data.getFieldH192() == val_u192); + BEAST_EXPECT(data.getInnerTypeString() == "UINT192"); + } + + { + // UINT256 + uint256 val_u256 = uint256(1); + data.setFieldH256(val_u256); + BEAST_EXPECT(data.getFieldH256() == val_u256); + BEAST_EXPECT(data.getInnerTypeString() == "UINT256"); + } + + { + // VL (Variable Length) - Blob + Blob val_blob = strUnHex("0102030405060708090A0B0C0D0E0F10").value(); + data.setFieldVL(val_blob); + BEAST_EXPECT(data.getFieldVL() == val_blob); + BEAST_EXPECT(data.getInnerTypeString() == "VL"); + } + + { + // VL (Variable Length) - Slice + std::string test_str = "Test String for Slice"; + Slice val_slice(test_str.data(), test_str.size()); + data.setFieldVL(val_slice); + Blob expected_blob(test_str.begin(), test_str.end()); + BEAST_EXPECT(data.getFieldVL() == expected_blob); + BEAST_EXPECT(data.getInnerTypeString() == "VL"); + } + + { + // ACCOUNT + AccountID val_account(0x123456789ABCDEF0); + data.setAccountID(val_account); + BEAST_EXPECT(data.getAccountID() == val_account); + BEAST_EXPECT(data.getInnerTypeString() == "ACCOUNT"); + } + + { + // AMOUNT + STAmount val_amount(777777); + data.setFieldAmount(val_amount); + BEAST_EXPECT(data.getFieldAmount() == val_amount); + BEAST_EXPECT(data.getInnerTypeString() == "AMOUNT"); + } + + { + // CURRENCY + } + + { + // ISSUE + } + + { + // NUMBER + } + } + + void + testJsonConversion() + { + testcase("JSON Conversion"); + + auto const& sf = sfParameterValue; + + // Test JSON serialization for each type + { + // UINT8 + STData data_u8(sf, static_cast(8)); + Json::Value json_u8 = data_u8.getJson(JsonOptions::none); + BEAST_EXPECT(json_u8[jss::type].asString() == "UINT8"); + BEAST_EXPECT(json_u8[jss::value].asUInt() == 8); + } + + { + // UINT16 + STData data_u16(sf, static_cast(16)); + Json::Value json_u16 = data_u16.getJson(JsonOptions::none); + BEAST_EXPECT(json_u16[jss::type].asString() == "UINT16"); + BEAST_EXPECT(json_u16[jss::value].asUInt() == 16); + } + + { + // UINT32 + STData data_u32(sf, static_cast(32)); + Json::Value json_u32 = data_u32.getJson(JsonOptions::none); + BEAST_EXPECT(json_u32[jss::type].asString() == "UINT32"); + BEAST_EXPECT(json_u32[jss::value].asUInt() == 32); + } + + { + // UINT64 + STData data_u64(sf, static_cast(64)); + Json::Value json_u64 = data_u64.getJson(JsonOptions::none); + BEAST_EXPECT(json_u64[jss::type].asString() == "UINT64"); + BEAST_EXPECT(json_u64[jss::value].asString() == "40"); + } + + { + // UINT128 + uint128 val_u128 = uint128(1); + STData data_u128(sf, val_u128); + Json::Value json_u128 = data_u128.getJson(JsonOptions::none); + BEAST_EXPECT(json_u128[jss::type].asString() == "UINT128"); + BEAST_EXPECT(json_u128[jss::value].asString() == "00000000000000000000000000000001"); + } + + { + // UINT160 + uint160 val_u160 = uint160(1); + STData data_u160(sf, val_u160); + Json::Value json_u160 = data_u160.getJson(JsonOptions::none); + BEAST_EXPECT(json_u160[jss::type].asString() == "UINT160"); + BEAST_EXPECT( + json_u160[jss::value].asString() == "0000000000000000000000000000000000000001"); + } + + { + // UINT192 + uint192 val_u192 = uint192(1); + STData data_u192(sf, val_u192); + Json::Value json_u192 = data_u192.getJson(JsonOptions::none); + BEAST_EXPECT(json_u192[jss::type].asString() == "UINT192"); + BEAST_EXPECT( + json_u192[jss::value].asString() == + "000000000000000000000000000000000000000000000001"); + } + + { + // UINT256 + uint256 val_u256 = uint256(1); + STData data_u256(sf, val_u256); + Json::Value json_u256 = data_u256.getJson(JsonOptions::none); + BEAST_EXPECT(json_u256[jss::type].asString() == "UINT256"); + BEAST_EXPECT( + json_u256[jss::value].asString() == + "00000000000000000000000000000000000000000000000000000000000000" + "01"); + } + + { + // VL + Blob blob = strUnHex("DEADBEEF").value(); + STData data_vl(sf, blob); + Json::Value json_vl = data_vl.getJson(JsonOptions::none); + BEAST_EXPECT(json_vl[jss::type].asString() == "VL"); + BEAST_EXPECT(json_vl[jss::value].asString() == "DEADBEEF"); + } + + { + // ACCOUNT + AccountID account(0x123456789ABCDEF0); + STData data_account(sf, account); + Json::Value json_account = data_account.getJson(JsonOptions::none); + BEAST_EXPECT(json_account[jss::type].asString() == "ACCOUNT"); + BEAST_EXPECT(json_account[jss::value].asString() == "rrrrrrrrrrrrrLveWzSkxhcH3hGw6"); + } + + { + // AMOUNT + STAmount amount(1000); + STData data_amount(sf, amount); + Json::Value json_amount = data_amount.getJson(JsonOptions::none); + BEAST_EXPECT(json_amount[jss::type].asString() == "AMOUNT"); + BEAST_EXPECT(json_amount[jss::value].asString() == "1000"); + } + + { + // CURRENCY + } + + { + // ISSUE + } + + { + // NUMBER + } + } + + void + testDataFromJson() + { + testcase("Data From JSON"); + + auto const& sf = sfParameterValue; + + // Test JSON deserialization for each type + { + // UINT8 + Json::Value json_u8(Json::objectValue); + json_u8[jss::type] = "UINT8"; + json_u8[jss::value] = 8; + + STData data_u8 = dataFromJson(sf, json_u8); + BEAST_EXPECT(data_u8.getFieldU8() == 8); + BEAST_EXPECT(data_u8.getInnerTypeString() == "UINT8"); + } + + { + // UINT16 + Json::Value json_u16(Json::objectValue); + json_u16[jss::type] = "UINT16"; + json_u16[jss::value] = 16; + + STData data_u16 = dataFromJson(sf, json_u16); + BEAST_EXPECT(data_u16.getFieldU16() == 16); + BEAST_EXPECT(data_u16.getInnerTypeString() == "UINT16"); + } + + { + // UINT32 + Json::Value json_u32(Json::objectValue); + json_u32[jss::type] = "UINT32"; + json_u32[jss::value] = 32; + + STData data_u32 = dataFromJson(sf, json_u32); + BEAST_EXPECT(data_u32.getFieldU32() == 32); + BEAST_EXPECT(data_u32.getInnerTypeString() == "UINT32"); + } + + { + // UINT64 + Json::Value json_u64(Json::objectValue); + json_u64[jss::type] = "UINT64"; + json_u64[jss::value] = 64; + STData data_u64 = dataFromJson(sf, json_u64); + BEAST_EXPECT(data_u64.getFieldU64() == 64); + BEAST_EXPECT(data_u64.getInnerTypeString() == "UINT64"); + } + + { + // UINT128 + Json::Value json_u128(Json::objectValue); + json_u128[jss::type] = "UINT128"; + json_u128[jss::value] = "00000000000000000000000000000001"; + STData data_u128 = dataFromJson(sf, json_u128); + uint128 expected; + bool ok = expected.parseHex("00000000000000000000000000000001"); + BEAST_EXPECT(ok); + BEAST_EXPECT(data_u128.getFieldH128() == expected); + BEAST_EXPECT(data_u128.getInnerTypeString() == "UINT128"); + } + + { + // UINT160 + Json::Value json_u160(Json::objectValue); + json_u160[jss::type] = "UINT160"; + json_u160[jss::value] = "0000000000000000000000000000000000000001"; + STData data_u160 = dataFromJson(sf, json_u160); + uint160 expected; + bool ok = expected.parseHex("0000000000000000000000000000000000000001"); + BEAST_EXPECT(ok); + BEAST_EXPECT(data_u160.getFieldH160() == expected); + BEAST_EXPECT(data_u160.getInnerTypeString() == "UINT160"); + } + + { + // UINT192 + Json::Value json_u192(Json::objectValue); + json_u192[jss::type] = "UINT192"; + json_u192[jss::value] = "000000000000000000000000000000000000000000000001"; + STData data_u192 = dataFromJson(sf, json_u192); + uint192 expected; + bool ok = expected.parseHex("000000000000000000000000000000000000000000000001"); + BEAST_EXPECT(ok); + BEAST_EXPECT(data_u192.getFieldH192() == expected); + BEAST_EXPECT(data_u192.getInnerTypeString() == "UINT192"); + } + + { + // UINT256 + Json::Value json_u256(Json::objectValue); + json_u256[jss::type] = "UINT256"; + json_u256[jss::value] = + "00000000000000000000000000000000000000000000000000000000000000" + "01"; + STData data_u256 = dataFromJson(sf, json_u256); + uint256 expected; + bool ok = expected.parseHex( + "00000000000000000000000000000000000000000000000000000000000000" + "01"); + BEAST_EXPECT(ok); + BEAST_EXPECT(data_u256.getFieldH256() == expected); + BEAST_EXPECT(data_u256.getInnerTypeString() == "UINT256"); + } + + { + // VL + Json::Value json_vl(Json::objectValue); + json_vl[jss::type] = "VL"; + json_vl[jss::value] = "DEADBEEFCAFEBABE"; + + STData data_vl = dataFromJson(sf, json_vl); + Blob expected_blob = strUnHex("DEADBEEFCAFEBABE").value(); + BEAST_EXPECT(data_vl.getFieldVL() == expected_blob); + BEAST_EXPECT(data_vl.getInnerTypeString() == "VL"); + } + + { + // ACCOUNT + Json::Value json_account(Json::objectValue); + json_account[jss::type] = "ACCOUNT"; + json_account[jss::value] = "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn"; + + STData data_account = dataFromJson(sf, json_account); + AccountID expected_account = + parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value(); + BEAST_EXPECT(data_account.getAccountID() == expected_account); + BEAST_EXPECT(data_account.getInnerTypeString() == "ACCOUNT"); + } + + { + // AMOUNT + Json::Value json_amount(Json::objectValue); + json_amount[jss::type] = "AMOUNT"; + json_amount[jss::value] = "1000"; + + STData data_amount = dataFromJson(sf, json_amount); + STAmount expected_amount(1000); + BEAST_EXPECT(data_amount.getFieldAmount() == expected_amount); + BEAST_EXPECT(data_amount.getInnerTypeString() == "AMOUNT"); + } + + { + // CURRENCY + } + + { + // ISSUE + } + + { + // NUMBER + } + } + + // void + // testErrorCases() + // { + // testcase("Error Cases"); + + // auto const& sf = sfParameterValue; + + // // Test JSON parsing errors + // { + // // Missing type + // Json::Value json_no_type(Json::objectValue); + // json_no_type[jss::value] = 123; + + // try { + // STData data = dataFromJson(sf, json_no_type); + // fail("Expected exception for missing type"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + + // { + // // Missing value + // Json::Value json_no_value(Json::objectValue); + // json_no_value[jss::type] = "UINT8"; + + // try { + // STData data = dataFromJson(sf, json_no_value); + // fail("Expected exception for missing value"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + + // { + // // Invalid type string + // Json::Value json_invalid_type(Json::objectValue); + // json_invalid_type[jss::type] = "INVALID_TYPE"; + // json_invalid_type[jss::value] = 123; + + // try { + // STData data = dataFromJson(sf, json_invalid_type); + // fail("Expected exception for invalid type"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + + // { + // // Invalid UINT256 hex + // Json::Value json_invalid_hex(Json::objectValue); + // json_invalid_hex[jss::type] = "UINT256"; + // json_invalid_hex[jss::value] = "INVALID_HEX_STRING"; + + // try { + // STData data = dataFromJson(sf, json_invalid_hex); + // fail("Expected exception for invalid hex"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + + // { + // // Invalid VL hex + // Json::Value json_invalid_vl(Json::objectValue); + // json_invalid_vl[jss::type] = "VL"; + // json_invalid_vl[jss::value] = "INVALID_HEX"; + + // try { + // STData data = dataFromJson(sf, json_invalid_vl); + // fail("Expected exception for invalid VL data"); + // } catch (std::invalid_argument const& e) { + // pass(); + // } + // } + + // { + // // Invalid account + // Json::Value json_invalid_account(Json::objectValue); + // json_invalid_account[jss::type] = "ACCOUNT"; + // json_invalid_account[jss::value] = "INVALID_ACCOUNT_STRING"; + + // try { + // STData data = dataFromJson(sf, json_invalid_account); + // fail("Expected exception for invalid account"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + + // { + // // Non-object JSON + // Json::Value json_not_object = "not an object"; + + // try { + // STData data = dataFromJson(sf, json_not_object); + // fail("Expected exception for non-object JSON"); + // } catch (std::runtime_error const& e) { + // pass(); + // } + // } + // } + + // void + // testEquivalence() + // { + // testcase("Equivalence"); + + // auto const& sf = sfParameterValue; + + // // Test equivalence for same types and values + // { + // STData data1(sf, static_cast(42)); + // STData data2(sf, static_cast(42)); + // BEAST_EXPECT(data1.isEquivalent(data2)); + // } + + // // Test non-equivalence for different values + // { + // STData data1(sf, static_cast(42)); + // STData data2(sf, static_cast(43)); + // BEAST_EXPECT(!data1.isEquivalent(data2)); + // } + + // // Test non-equivalence for different types + // { + // STData data1(sf, static_cast(42)); + // STData data2(sf, static_cast(42)); + // BEAST_EXPECT(!data1.isEquivalent(data2)); + // } + + // // Test equivalence with complex types + // { + // uint256 val; + // val.parseHex("123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0"); + // STData data1(sf, val); + // STData data2(sf, val); + // BEAST_EXPECT(data1.isEquivalent(data2)); + // } + // } + + // void + // testSize() + // { + // testcase("Size Calculation"); + + // auto const& sf = sfParameterValue; + + // // Test size calculation for each type + // { + // STData data_u8(sf, static_cast(42)); + // BEAST_EXPECT(data_u8.size() == sizeof(uint8_t)); + // } + + // { + // STData data_u16(sf, static_cast(1234)); + // BEAST_EXPECT(data_u16.size() == sizeof(uint16_t)); + // } + + // { + // STData data_u32(sf, static_cast(123456)); + // BEAST_EXPECT(data_u32.size() == sizeof(uint32_t)); + // } + + // { + // STData data_u64(sf, static_cast(123456789)); + // BEAST_EXPECT(data_u64.size() == sizeof(uint64_t)); + // } + + // { + // uint128 val_u128(0x12345678, 0x9ABCDEF0); + // STData data_u128(sf, val_u128); + // BEAST_EXPECT(data_u128.size() == uint128::size()); + // } + + // { + // uint256 val_u256; + // val_u256.parseHex("123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0"); + // STData data_u256(sf, val_u256); + // BEAST_EXPECT(data_u256.size() == uint256::size()); + // } + + // { + // Blob blob = strUnHex("DEADBEEFCAFEBABE").value(); + // STData data_vl(sf, blob); + // BEAST_EXPECT(data_vl.size() == blob.size()); + // } + + // { + // AccountID account(0x123456789ABCDEF0); + // STData data_account(sf, account); + // BEAST_EXPECT(data_account.size() == uint160::size()); + // } + + // { + // // Native amount + // STAmount amount_native(1000); + // STData data_amount_native(sf, amount_native); + // BEAST_EXPECT(data_amount_native.size() == 8); // Native amounts + // are 8 bytes + // } + + // { + // // IOU amount + // IOUAmount iou_amount(5000); + // Issue const usd( + // Currency(0x5553440000000000), + // parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value()); + // STAmount amount_iou(iou_amount, usd); + // STData data_amount_iou(sf, amount_iou); + // BEAST_EXPECT(data_amount_iou.size() == 48); // IOU amounts are 48 + // bytes + // } + // } + + // void + // testTextRepresentation() + // { + // testcase("Text Representation"); + + // auto const& sf = sfParameterValue; + + // // Test getText() for various types + // { + // STData data_u8(sf, static_cast(42)); + // std::string text = data_u8.getText(); + // BEAST_EXPECT(text.find("STData") != std::string::npos); + // BEAST_EXPECT(text.find("UINT8") != std::string::npos); + // } + + // { + // uint256 val; + // val.parseHex("123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0"); + // STData data_u256(sf, val); + // std::string text = data_u256.getText(); + // BEAST_EXPECT(text.find("STData") != std::string::npos); + // BEAST_EXPECT(text.find("UINT256") != std::string::npos); + // } + + // { + // Blob blob = strUnHex("DEADBEEF").value(); + // STData data_vl(sf, blob); + // std::string text = data_vl.getText(); + // BEAST_EXPECT(text.find("STData") != std::string::npos); + // BEAST_EXPECT(text.find("VL") != std::string::npos); + // } + // } + + // void + // testCopyAndMove() + // { + // testcase("Copy and Move Operations"); + + // auto const& sf = sfParameterValue; + + // // Test copy functionality + // { + // uint256 val; + // val.parseHex("123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0"); + // STData original(sf, val); + + // // Test copy + // char buffer[1024]; + // STBase* copied = original.copy(sizeof(buffer), buffer); + // BEAST_EXPECT(copied != nullptr); + + // STData* copied_data = dynamic_cast(copied); + // BEAST_EXPECT(copied_data != nullptr); + // BEAST_EXPECT(copied_data->getFieldH256() == val); + // BEAST_EXPECT(copied_data->getInnerTypeString() == "UINT256"); + // } + + // // Test move functionality + // { + // Blob blob = strUnHex("DEADBEEFCAFEBABE").value(); + // STData original(sf, blob); + + // char buffer[1024]; + // STBase* moved = original.move(sizeof(buffer), buffer); + // BEAST_EXPECT(moved != nullptr); + + // STData* moved_data = dynamic_cast(moved); + // BEAST_EXPECT(moved_data != nullptr); + // BEAST_EXPECT(moved_data->getFieldVL() == blob); + // BEAST_EXPECT(moved_data->getInnerTypeString() == "VL"); + // } + // } + + // void + // testBoundaryValues() + // { + // testcase("Boundary Values"); + + // auto const& sf = sfParameterValue; + + // // Test minimum and maximum values for each numeric type + // { + // // UINT8 boundaries + // STData data_u8_min(sf, static_cast(0)); + // BEAST_EXPECT(data_u8_min.getFieldU8() == 0); + + // STData data_u8_max(sf, static_cast(255)); + // BEAST_EXPECT(data_u8_max.getFieldU8() == 255); + // } + + // { + // // UINT16 boundaries + // STData data_u16_min(sf, static_cast(0)); + // BEAST_EXPECT(data_u16_min.getFieldU16() == 0); + + // STData data_u16_max(sf, static_cast(65535)); + // BEAST_EXPECT(data_u16_max.getFieldU16() == 65535); + // } + + // { + // // UINT32 boundaries + // STData data_u32_min(sf, static_cast(0)); + // BEAST_EXPECT(data_u32_min.getFieldU32() == 0); + + // STData data_u32_max(sf, static_cast(0xFFFFFFFF)); + // BEAST_EXPECT(data_u32_max.getFieldU32() == 0xFFFFFFFF); + // } + + // { + // // UINT64 boundaries + // STData data_u64_min(sf, static_cast(0)); + // BEAST_EXPECT(data_u64_min.getFieldU64() == 0); + + // STData data_u64_max(sf, + // static_cast(0xFFFFFFFFFFFFFFFF)); + // BEAST_EXPECT(data_u64_max.getFieldU64() == 0xFFFFFFFFFFFFFFFF); + // } + + // { + // // Empty blob + // Blob empty_blob; + // STData data_empty_vl(sf, empty_blob); + // BEAST_EXPECT(data_empty_vl.getFieldVL() == empty_blob); + // BEAST_EXPECT(data_empty_vl.size() == 0); + // } + + // { + // // Large blob (test with reasonably sized data) + // Blob large_blob(1000, 0xAB); // 1000 bytes of 0xAB + // STData data_large_vl(sf, large_blob); + // BEAST_EXPECT(data_large_vl.getFieldVL() == large_blob); + // BEAST_EXPECT(data_large_vl.size() == 1000); + // } + // } + + // void + // testSpecialSerializationCases() + // { + // testcase("Special Serialization Cases"); + + // auto const& sf = sfParameterValue; + + // // Test serialization format compliance + // { + // // Verify type prefix is included in serialization + // STData data_u8(sf, static_cast(0x42)); + // Serializer s; + // data_u8.add(s); + + // // Should start with type identifier (STI_UINT8 = 0x0010) + // auto slice = s.slice(); + // BEAST_EXPECT(slice.size() >= 2); + // std::uint16_t type_id = (static_cast(slice[0]) << + // 8) | slice[1]; BEAST_EXPECT(type_id == STI_UINT8); + // } + + // { + // // Test VL serialization includes length + // Blob test_blob = strUnHex("DEADBEEF").value(); + // STData data_vl(sf, test_blob); + // Serializer s; + // data_vl.add(s); + + // auto slice = s.slice(); + // BEAST_EXPECT(slice.size() >= 2); + // std::uint16_t type_id = (static_cast(slice[0]) << + // 8) | slice[1]; BEAST_EXPECT(type_id == STI_VL); + // } + // } + + // void + // testTypeConsistency() + // { + // testcase("Type Consistency"); + + // auto const& sf = sfParameterValue; + + // // Verify that changing types properly updates internal state + // { + // STData data(sf); + + // // Start with UINT8 + // data.setFieldU8(42); + // BEAST_EXPECT(data.getInnerTypeString() == "UINT8"); + // BEAST_EXPECT(data.getFieldU8() == 42); + + // // Change to UINT16 + // data.setFieldU16(1234); + // BEAST_EXPECT(data.getInnerTypeString() == "UINT16"); + // BEAST_EXPECT(data.getFieldU16() == 1234); + + // // Change to VL + // Blob blob = strUnHex("DEADBEEF").value(); + // data.setFieldVL(blob); + // BEAST_EXPECT(data.getInnerTypeString() == "VL"); + // BEAST_EXPECT(data.getFieldVL() == blob); + + // // Change to UINT256 + // uint256 val; + // val.parseHex("123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0"); + // data.setFieldH256(val); + // BEAST_EXPECT(data.getInnerTypeString() == "UINT256"); + // BEAST_EXPECT(data.getFieldH256() == val); + // } + // } + + // void + // testComplexAmountTypes() + // { + // testcase("Complex Amount Types"); + + // auto const& sf = sfParameterValue; + + // // Test various STAmount configurations + // { + // // Zero native amount + // STAmount zero_native(0); + // STData data_zero(sf, zero_native); + // BEAST_EXPECT(data_zero.getFieldAmount() == zero_native); + // BEAST_EXPECT(data_zero.size() == 8); // Native amounts are 8 + // bytes + // } + + // { + // // Maximum native amount + // STAmount max_native(100000000000000000ULL); // Max XRP in drops + // STData data_max(sf, max_native); + // BEAST_EXPECT(data_max.getFieldAmount() == max_native); + // } + + // { + // // IOU with zero value + // IOUAmount zero_iou(0); + // Issue const eur( + // Currency(0x4555520000000000), + // parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value()); + // STAmount zero_iou_amount(zero_iou, eur); + // STData data_zero_iou(sf, zero_iou_amount); + // BEAST_EXPECT(data_zero_iou.getFieldAmount() == zero_iou_amount); + // BEAST_EXPECT(data_zero_iou.size() == 48); // IOU amounts are 48 + // bytes + // } + // } + + // void + // testJsonRoundTrip() + // { + // testcase("JSON Round Trip"); + + // auto const& sf = sfParameterValue; + + // // Test complete round trip: STData -> JSON -> STData + // { + // // UINT8 + // STData original_u8(sf, static_cast(123)); + // Json::Value json_u8 = original_u8.getJson(JsonOptions::none); + // STData restored_u8 = dataFromJson(sf, json_u8); + // BEAST_EXPECT(original_u8.isEquivalent(restored_u8)); + // } + + // { + // // UINT256 + // uint256 val; + // val.parseHex("FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210FEDCBA9876543210"); + // STData original_u256(sf, val); + // Json::Value json_u256 = original_u256.getJson(JsonOptions::none); + // STData restored_u256 = dataFromJson(sf, json_u256); + // BEAST_EXPECT(original_u256.isEquivalent(restored_u256)); + // } + + // { + // // VL + // Blob blob = strUnHex("0123456789ABCDEF").value(); + // STData original_vl(sf, blob); + // Json::Value json_vl = original_vl.getJson(JsonOptions::none); + // STData restored_vl = dataFromJson(sf, json_vl); + // BEAST_EXPECT(original_vl.isEquivalent(restored_vl)); + // } + + // { + // // ACCOUNT + // AccountID account_id = + // parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value(); + // STData original_account(sf, account_id); + // Json::Value json_account = + // original_account.getJson(JsonOptions::none); STData + // restored_account = dataFromJson(sf, json_account); + // BEAST_EXPECT(original_account.isEquivalent(restored_account)); + // } + // } + + // void + // testSerializationRoundTrip() + // { + // testcase("Serialization Round Trip"); + + // auto const& sf = sfParameterValue; + + // // Test complete serialization round trip for all types + // std::vector test_data; + + // // Populate test data with various types + // test_data.emplace_back(sf, static_cast(0xFF)); + // test_data.emplace_back(sf, static_cast(0xFFFF)); + // test_data.emplace_back(sf, static_cast(0xFFFFFFFF)); + // test_data.emplace_back(sf, + // static_cast(0xFFFFFFFFFFFFFFFF)); + + // uint128 val128(0xFFFFFFFF, 0xFFFFFFFF); + // test_data.emplace_back(sf, val128); + + // uint256 val256; + // val256.parseHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); + // test_data.emplace_back(sf, val256); + + // Blob blob = strUnHex("DEADBEEFCAFEBABE1234567890ABCDEF").value(); + // test_data.emplace_back(sf, blob); + + // AccountID account(0xFFFFFFFFFFFFFFFF); + // test_data.emplace_back(sf, account); + + // STAmount amount(999999); + // test_data.emplace_back(sf, amount); + + // // Test round trip for each + // for (auto const& original : test_data) + // { + // Serializer s; + // original.add(s); + + // SerialIter sit(s.slice()); + // STData deserialized(sit, sf); + + // BEAST_EXPECT(original.isEquivalent(deserialized)); + // BEAST_EXPECT(original.getInnerTypeString() == + // deserialized.getInnerTypeString()); + // } + // } + + // void + // testMakeFieldPresent() + // { + // testcase("Make Field Present"); + + // auto const& sf = sfParameterValue; + + // // Test makeFieldPresent functionality + // { + // STData data(sf); + // STBase* field = data.makeFieldPresent(); + // BEAST_EXPECT(field != nullptr); + + // // Field should now be present (not STI_NOTPRESENT) + // BEAST_EXPECT(field->getSType() != STI_NOTPRESENT); + // } + // } + + void + run() override + { + testConstructors(); + testSerializationDeserialization(); + testSettersAndGetters(); + testJsonConversion(); + testDataFromJson(); + // testErrorCases(); + // testEquivalence(); + // testSize(); + // testTextRepresentation(); + // testCopyAndMove(); + // testBoundaryValues(); + // testSpecialSerializationCases(); + // testTypeConsistency(); + // testComplexAmountTypes(); + // testJsonRoundTrip(); + // testSerializationRoundTrip(); + // testMakeFieldPresent(); + } +}; + +BEAST_DEFINE_TESTSUITE(STData, protocol, xrpl); + +} // namespace xrpl diff --git a/src/test/protocol/STJson_test.cpp b/src/test/protocol/STJson_test.cpp new file mode 100644 index 00000000000..8fd19feb8bf --- /dev/null +++ b/src/test/protocol/STJson_test.cpp @@ -0,0 +1,793 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace xrpl { + +struct STJson_test : public beast::unit_test::suite +{ + void + testDefaultConstructor() + { + testcase("Default constructor"); + STJson json; + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(!json.isArray()); + BEAST_EXPECT(json.getMap().empty()); + } + + void + testSetAndGet() + { + testcase("setObjectField() and getObjectField()"); + STJson json; + auto value = std::make_shared(sfLedgerIndex, 12345); + json.setObjectField("foo", value); + + auto retrieved = json.getObjectField("foo"); + BEAST_EXPECT(retrieved.has_value()); + BEAST_EXPECT((*retrieved)->getSType() == STI_UINT32); + BEAST_EXPECT(std::dynamic_pointer_cast(*retrieved)->value() == 12345); + + // Test non-existent key + auto missing = json.getObjectField("bar"); + BEAST_EXPECT(!missing.has_value()); + } + + void + testMoveConstructor() + { + testcase("Move constructor (Object)"); + STJson::Map map; + map["bar"] = std::make_shared(sfTransactionType, 42); + STJson json(std::move(map)); + BEAST_EXPECT(json.isObject()); + BEAST_EXPECT(json.getMap().size() == 1); + BEAST_EXPECT(std::dynamic_pointer_cast(json.getMap().at("bar"))->value() == 42); + } + + void + testArrayConstruction() + { + testcase("Array constructor"); + STJson::Array arr; + arr.push_back(std::make_shared(sfNetworkID, 100)); + arr.push_back(std::make_shared(sfNetworkID, 200)); + + STJson json(std::move(arr)); + BEAST_EXPECT(json.isArray()); + BEAST_EXPECT(!json.isObject()); + BEAST_EXPECT(json.arraySize() == 2); + + auto elem0 = json.getArrayElement(0); + BEAST_EXPECT(elem0.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem0)->value() == 100); + } + + void + testTypeChecking() + { + testcase("Type checking methods"); + STJson objJson; + BEAST_EXPECT(objJson.isObject()); + BEAST_EXPECT(!objJson.isArray()); + BEAST_EXPECT(objJson.getType() == STJson::JsonType::Object); + + STJson arrJson(STJson::Array{}); + BEAST_EXPECT(arrJson.isArray()); + BEAST_EXPECT(!arrJson.isObject()); + BEAST_EXPECT(arrJson.getType() == STJson::JsonType::Array); + } + + void + testArrayOperations() + { + testcase("Array operations"); + STJson json(STJson::Array{}); + + // Test push + json.pushArrayElement(std::make_shared(sfCloseResolution, 10)); + json.pushArrayElement(std::make_shared(sfCloseResolution, 20)); + json.pushArrayElement(std::make_shared(sfCloseResolution, 30)); + + BEAST_EXPECT(json.arraySize() == 3); + + // Test get + auto elem1 = json.getArrayElement(1); + BEAST_EXPECT(elem1.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem1)->value() == 20); + + // Test set (replace) + json.setArrayElement(1, std::make_shared(sfCloseResolution, 25)); + auto elem1Updated = json.getArrayElement(1); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem1Updated)->value() == 25); + + // Test out of bounds + auto missing = json.getArrayElement(10); + BEAST_EXPECT(!missing.has_value()); + } + + void + testArrayAutoResize() + { + testcase("Array auto-resize"); + STJson json(STJson::Array{}); + + // Set element at index 5 (should auto-resize with nulls) + json.setArrayElement(5, std::make_shared(sfNetworkID, 999)); + + BEAST_EXPECT(json.arraySize() == 6); + + // Check nulls were added + for (size_t i = 0; i < 5; ++i) + { + auto elem = json.getArrayElement(i); + BEAST_EXPECT(elem.has_value()); + BEAST_EXPECT(*elem == nullptr); + } + + // Check value at index 5 + auto elem5 = json.getArrayElement(5); + BEAST_EXPECT(elem5.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem5)->value() == 999); + } + + void + testArrayElementFields() + { + testcase("Array element field operations"); + STJson json(STJson::Array{}); + + // Set field in array element (auto-creates object) + json.setArrayElementField(0, "name", std::make_shared(sfNetworkID, 42)); + json.setArrayElementField(0, "value", std::make_shared(sfNetworkID, 100)); + + // Get fields + auto name = json.getArrayElementField(0, "name"); + BEAST_EXPECT(name.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*name)->value() == 42); + + auto value = json.getArrayElementField(0, "value"); + BEAST_EXPECT(value.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*value)->value() == 100); + + // Set field at higher index (auto-resize) + json.setArrayElementField(3, "test", std::make_shared(sfCloseResolution, 99)); + BEAST_EXPECT(json.arraySize() == 4); + + auto test = json.getArrayElementField(3, "test"); + BEAST_EXPECT(test.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*test)->value() == 99); + } + + void + testNestedObjectField() + { + testcase("Nested object field operations"); + STJson json; + + json.setNestedObjectField("user", "id", std::make_shared(sfNetworkID, 123)); + json.setNestedObjectField("user", "name", std::make_shared(sfNetworkID, 456)); + + auto id = json.getNestedObjectField("user", "id"); + BEAST_EXPECT(id.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*id)->value() == 123); + + auto name = json.getNestedObjectField("user", "name"); + BEAST_EXPECT(name.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*name)->value() == 456); + + // Test non-existent nested key + auto missing = json.getNestedObjectField("user", "age"); + BEAST_EXPECT(!missing.has_value()); + } + + void + testNestedArrayOperations() + { + testcase("Nested array operations"); + STJson json; + + // Set entire elements in nested array + json.setNestedArrayElement("items", 0, std::make_shared(sfNetworkID, 10)); + json.setNestedArrayElement("items", 1, std::make_shared(sfNetworkID, 20)); + json.setNestedArrayElement("items", 2, std::make_shared(sfNetworkID, 30)); + + // Get elements + auto item0 = json.getNestedArrayElement("items", 0); + BEAST_EXPECT(item0.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*item0)->value() == 10); + + auto item2 = json.getNestedArrayElement("items", 2); + BEAST_EXPECT(item2.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*item2)->value() == 30); + + // Auto-resize test + json.setNestedArrayElement("items", 5, std::make_shared(sfNetworkID, 60)); + auto item5 = json.getNestedArrayElement("items", 5); + BEAST_EXPECT(item5.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*item5)->value() == 60); + } + + void + testNestedArrayElementFields() + { + testcase("Nested array element field operations"); + STJson json; + + // Set fields in nested array elements + json.setNestedArrayElementField( + "users", 0, "id", std::make_shared(sfNetworkID, 100)); + json.setNestedArrayElementField( + "users", 0, "name", std::make_shared(sfNetworkID, 200)); + json.setNestedArrayElementField( + "users", 1, "id", std::make_shared(sfNetworkID, 101)); + json.setNestedArrayElementField( + "users", 1, "name", std::make_shared(sfNetworkID, 201)); + + // Get fields + auto user0id = json.getNestedArrayElementField("users", 0, "id"); + BEAST_EXPECT(user0id.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*user0id)->value() == 100); + + auto user1name = json.getNestedArrayElementField("users", 1, "name"); + BEAST_EXPECT(user1name.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*user1name)->value() == 201); + + // Test missing field + auto missing = json.getNestedArrayElementField("users", 0, "age"); + BEAST_EXPECT(!missing.has_value()); + } + + void + testDepthValidation() + { + testcase("Depth validation (max 1 level)"); + + // Valid: Object with nested object (depth 1) + { + STJson json; + auto nested = std::make_shared(); + nested->setObjectField("x", std::make_shared(sfNetworkID, 42)); + + try + { + json.setObjectField("nested", nested); + pass(); + } + catch (...) + { + fail("Should allow depth 1 nesting"); + } + } + + // Invalid: Object with nested object containing nested object (depth 2) + { + STJson json; + auto nested1 = std::make_shared(); + auto nested2 = std::make_shared(); + nested2->setObjectField("x", std::make_shared(sfNetworkID, 42)); + nested1->setObjectField("nested", nested2); + + try + { + json.setObjectField("nested", nested1); + fail("Should reject depth 2 nesting"); + } + catch (std::runtime_error const& e) + { + pass(); + } + } + + // Valid: Array with object elements (depth 1) + { + STJson json(STJson::Array{}); + auto elem = std::make_shared(); + elem->setObjectField("x", std::make_shared(sfNetworkID, 42)); + + try + { + json.pushArrayElement(elem); + pass(); + } + catch (...) + { + fail("Should allow depth 1 in array"); + } + } + + // Invalid: Array with nested arrays (depth 2) + { + STJson json(STJson::Array{}); + auto innerArray = std::make_shared(STJson::Array{}); + innerArray->pushArrayElement(std::make_shared(sfNetworkID, 42)); + + try + { + json.pushArrayElement(innerArray); + fail("Should reject array of arrays"); + } + catch (std::runtime_error const& e) + { + pass(); + } + } + + // Valid: Object with nested array (depth 1) + { + STJson json; + auto arr = std::make_shared(STJson::Array{}); + arr->pushArrayElement(std::make_shared(sfNetworkID, 42)); + + try + { + json.setObjectField("arr", arr); + pass(); + } + catch (...) + { + fail("Should allow object with array"); + } + } + + // Test depth validation in setNestedObjectField + { + STJson json; + auto nested = std::make_shared(); + nested->setObjectField("x", std::make_shared(sfNetworkID, 42)); + + try + { + json.setNestedObjectField("outer", "inner", nested); + fail("Should reject depth 2 via setNestedObjectField"); + } + catch (std::runtime_error const& e) + { + pass(); + } + } + } + + void + testAddAndFromBlob() + { + testcase("add() and fromBlob() for objects"); + STJson json; + json.setObjectField("a", std::make_shared(sfCloseResolution, 7)); + json.setObjectField("b", std::make_shared(sfNetworkID, 123456)); + + Serializer s; + json.add(s); + + auto blob = s.peekData(); + auto parsed = STJson::fromBlob(blob.data(), blob.size()); + BEAST_EXPECT(parsed->isObject()); + BEAST_EXPECT(parsed->getMap().size() == 2); + + auto a = parsed->getObjectField("a"); + BEAST_EXPECT(a.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*a)->value() == 7); + + auto b = parsed->getObjectField("b"); + BEAST_EXPECT(b.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*b)->value() == 123456); + } + + void + testArraySerialization() + { + testcase("Array serialization and deserialization"); + STJson json(STJson::Array{}); + json.pushArrayElement(std::make_shared(sfCloseResolution, 10)); + json.pushArrayElement(std::make_shared(sfNetworkID, 20)); + json.pushArrayElement(std::make_shared(sfIndexNext, 30)); + + Serializer s; + json.add(s); + + auto blob = s.peekData(); + auto parsed = STJson::fromBlob(blob.data(), blob.size()); + + BEAST_EXPECT(parsed->isArray()); + BEAST_EXPECT(parsed->arraySize() == 3); + + auto elem0 = parsed->getArrayElement(0); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem0)->value() == 10); + + auto elem1 = parsed->getArrayElement(1); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem1)->value() == 20); + + auto elem2 = parsed->getArrayElement(2); + BEAST_EXPECT(std::dynamic_pointer_cast(*elem2)->value() == 30); + } + + void + testFromSerialIter() + { + testcase("fromSerialIter()"); + STJson json; + json.setObjectField("x", std::make_shared(sfCloseResolution, 99)); + Serializer s; + json.add(s); + + SerialIter sit(s.peekData().data(), s.peekData().size()); + auto parsed = STJson::fromSerialIter(sit); + BEAST_EXPECT(parsed->isObject()); + BEAST_EXPECT(parsed->getMap().size() == 1); + + auto x = parsed->getObjectField("x"); + BEAST_EXPECT(x.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*x)->value() == 99); + } + + void + testFromSField() + { + testcase("Constructor from SField"); + STJson json; + json.setObjectField("x", std::make_shared(sfCloseResolution, 99)); + Serializer s; + json.add(s); + + SerialIter sit(s.peekData().data(), s.peekData().size()); + auto parsed = STJson{sit, sfContractCode}; + BEAST_EXPECT(parsed.isObject()); + BEAST_EXPECT(parsed.getMap().size() == 1); + + auto x = parsed.getObjectField("x"); + BEAST_EXPECT(x.has_value()); + BEAST_EXPECT(std::dynamic_pointer_cast(*x)->value() == 99); + } + + void + testGetJson() + { + testcase("getJson() for objects"); + STJson json; + json.setObjectField("foo", std::make_shared(sfTransactionType, 65535)); + json.setObjectField("bar", nullptr); // test null value + + Json::Value jv = json.getJson(JsonOptions::none); + BEAST_EXPECT(jv.isObject()); + BEAST_EXPECT(jv["foo"].asUInt() == 65535); + BEAST_EXPECT(jv["bar"].isNull()); + } + + void + testGetJsonArray() + { + testcase("getJson() for arrays"); + STJson json(STJson::Array{}); + json.pushArrayElement(std::make_shared(sfNetworkID, 100)); + json.pushArrayElement(std::make_shared(sfNetworkID, 200)); + json.pushArrayElement(nullptr); // null element + + Json::Value jv = json.getJson(JsonOptions::none); + BEAST_EXPECT(jv.isArray()); + BEAST_EXPECT(jv.size() == 3); + BEAST_EXPECT(jv[Json::UInt(0)].asUInt() == 100); + BEAST_EXPECT(jv[Json::UInt(1)].asUInt() == 200); + BEAST_EXPECT(jv[Json::UInt(2)].isNull()); + } + + void + testMakeValueFromVLWithType() + { + testcase("makeValueFromVLWithType()"); + Serializer s; + s.add8(STI_UINT32); + s.add32(0xDEADBEEF); + SerialIter sit(s.peekData().data(), s.peekData().size()); + auto value = STJson::makeValueFromVLWithType(sit); + BEAST_EXPECT(value->getSType() == STI_UINT32); + BEAST_EXPECT(std::dynamic_pointer_cast(value)->value() == 0xDEADBEEF); + } + + void + testMixedStructures() + { + testcase("Mixed structures (objects with arrays)"); + STJson json; + + // Add simple fields + json.setObjectField("id", std::make_shared(sfNetworkID, 1)); + + // Add nested object + json.setNestedObjectField( + "metadata", "version", std::make_shared(sfNetworkID, 2)); + + // Add nested array with objects + json.setNestedArrayElementField( + "users", 0, "name", std::make_shared(sfNetworkID, 100)); + json.setNestedArrayElementField( + "users", 0, "age", std::make_shared(sfNetworkID, 25)); + json.setNestedArrayElementField( + "users", 1, "name", std::make_shared(sfNetworkID, 101)); + + // Serialize and deserialize + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + + // Verify structure + BEAST_EXPECT(parsed->isObject()); + + auto id = parsed->getObjectField("id"); + BEAST_EXPECT(std::dynamic_pointer_cast(*id)->value() == 1); + + auto version = parsed->getNestedObjectField("metadata", "version"); + BEAST_EXPECT(std::dynamic_pointer_cast(*version)->value() == 2); + + auto user0name = parsed->getNestedArrayElementField("users", 0, "name"); + BEAST_EXPECT(std::dynamic_pointer_cast(*user0name)->value() == 100); + + auto user1name = parsed->getNestedArrayElementField("users", 1, "name"); + BEAST_EXPECT(std::dynamic_pointer_cast(*user1name)->value() == 101); + } + + void + testSTTypes() + { + testcase("All STypes roundtrip"); + + // STI_UINT8 + { + STJson json; + json.setObjectField("u8", std::make_shared(sfCloseResolution, 200)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u8 = parsed->getObjectField("u8"); + BEAST_EXPECT(std::dynamic_pointer_cast(*u8)->value() == 200); + } + + // STI_UINT16 + { + STJson json; + json.setObjectField("u16", std::make_shared(sfSignerWeight, 4242)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u16 = parsed->getObjectField("u16"); + BEAST_EXPECT(std::dynamic_pointer_cast(*u16)->value() == 4242); + } + + // STI_UINT32 + { + STJson json; + json.setObjectField("u32", std::make_shared(sfNetworkID, 0xABCDEF01)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u32 = parsed->getObjectField("u32"); + BEAST_EXPECT(std::dynamic_pointer_cast(*u32)->value() == 0xABCDEF01); + } + + // STI_UINT64 + { + STJson json; + json.setObjectField( + "u64", std::make_shared(sfIndexNext, 0x123456789ABCDEF0ull)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u64 = parsed->getObjectField("u64"); + BEAST_EXPECT( + std::dynamic_pointer_cast(*u64)->value() == 0x123456789ABCDEF0ull); + } + + // STI_UINT160 + { + STJson json; + uint160 val; + val.data()[0] = 0x01; + val.data()[19] = 0xFF; + json.setObjectField("u160", std::make_shared(sfTakerPaysCurrency, val)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u160 = parsed->getObjectField("u160"); + BEAST_EXPECT(std::dynamic_pointer_cast(*u160)->value() == val); + } + + // STI_UINT256 + { + STJson json; + uint256 val; + val.data()[0] = 0xAA; + val.data()[31] = 0xBB; + json.setObjectField("u256", std::make_shared(sfLedgerHash, val)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto u256 = parsed->getObjectField("u256"); + BEAST_EXPECT(std::dynamic_pointer_cast(*u256)->value() == val); + } + + // STI_AMOUNT + { + STJson json; + // XRP amount + STAmount xrp(sfAmount, static_cast(123456789u)); + json.setObjectField("amount", std::make_shared(xrp)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto amount = parsed->getObjectField("amount"); + auto parsedAmt = std::dynamic_pointer_cast(*amount); + BEAST_EXPECT(parsedAmt->mantissa() == 123456789u); + BEAST_EXPECT(parsedAmt->issue() == xrp.issue()); + } + + // STI_VL (STBlob) + { + STJson json; + std::vector blobData = {0xDE, 0xAD, 0xBE, 0xEF}; + json.setObjectField( + "blob", std::make_shared(sfPublicKey, blobData.data(), blobData.size())); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto blob = parsed->getObjectField("blob"); + auto parsedBlob = std::dynamic_pointer_cast(*blob); + BEAST_EXPECT(parsedBlob->size() == blobData.size()); + BEAST_EXPECT(std::memcmp(parsedBlob->data(), blobData.data(), blobData.size()) == 0); + } + + // STI_ACCOUNT + { + STJson json; + // Use a known AccountID (20 bytes) + AccountID acct = AccountID{}; + json.setObjectField("acct", std::make_shared(sfAccount, acct)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto account = parsed->getObjectField("acct"); + auto parsedAcct = std::dynamic_pointer_cast(*account); + BEAST_EXPECT(parsedAcct->value() == acct); + } + + // STI_CURRENCY (STCurrency) + { + STJson json; + Currency cur; + cur.data()[0] = 0xAA; + cur.data()[19] = 0xBB; + json.setObjectField("currency", std::make_shared(sfGeneric, cur)); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto currency = parsed->getObjectField("currency"); + auto parsedCur = std::dynamic_pointer_cast(*currency); + BEAST_EXPECT(parsedCur->value() == cur); + } + + // STI_JSON (STJson) Nested JSON + { + STJson innerJson; + // XRP amount + STAmount xrp(sfAmount, static_cast(123456789u)); + innerJson.setObjectField("amount", std::make_shared(xrp)); + + STJson json; + json.setObjectField("nested", std::make_shared(innerJson)); + Serializer s; + json.add(s); + + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + auto nested = parsed->getObjectField("nested"); + auto parsedNested = std::dynamic_pointer_cast(*nested); + auto amount = parsedNested->getObjectField("amount"); + BEAST_EXPECT(std::dynamic_pointer_cast(*amount)->mantissa() == 123456789u); + } + } + + void + testEdgeCases() + { + testcase("Edge cases"); + + // Empty object + { + STJson json; + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + BEAST_EXPECT(parsed->isObject()); + BEAST_EXPECT(parsed->getMap().empty()); + } + + // Empty array + { + STJson json(STJson::Array{}); + Serializer s; + json.add(s); + auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); + BEAST_EXPECT(parsed->isArray()); + BEAST_EXPECT(parsed->arraySize() == 0); + } + + // Array with null elements + { + STJson json(STJson::Array{}); + json.pushArrayElement(nullptr); + json.pushArrayElement(std::make_shared(sfNetworkID, 42)); + json.pushArrayElement(nullptr); + + BEAST_EXPECT(json.arraySize() == 3); + + auto elem0 = json.getArrayElement(0); + BEAST_EXPECT(elem0.has_value()); + BEAST_EXPECT(*elem0 == nullptr); + + auto elem1 = json.getArrayElement(1); + BEAST_EXPECT(elem1.has_value()); + BEAST_EXPECT(*elem1 != nullptr); + } + + // Object with null value + { + STJson json; + json.setObjectField("null_field", nullptr); + + auto val = json.getObjectField("null_field"); + BEAST_EXPECT(val.has_value()); + BEAST_EXPECT(*val == nullptr); + } + } + + void + run() override + { + testDefaultConstructor(); + testSetAndGet(); + testMoveConstructor(); + testArrayConstruction(); + testTypeChecking(); + testArrayOperations(); + testArrayAutoResize(); + testArrayElementFields(); + testNestedObjectField(); + testNestedArrayOperations(); + testNestedArrayElementFields(); + testDepthValidation(); + testAddAndFromBlob(); + testArraySerialization(); + testFromSerialIter(); + testFromSField(); + testGetJson(); + testGetJsonArray(); + testMakeValueFromVLWithType(); + testMixedStructures(); + testSTTypes(); + testEdgeCases(); + } +}; + +BEAST_DEFINE_TESTSUITE(STJson, protocol, xrpl); + +} // namespace xrpl diff --git a/src/tests/libxrpl/protocol_autogen/TestHelpers.h b/src/tests/libxrpl/protocol_autogen/TestHelpers.h index cf2d7ffe6a1..5bcf06cadc5 100644 --- a/src/tests/libxrpl/protocol_autogen/TestHelpers.h +++ b/src/tests/libxrpl/protocol_autogen/TestHelpers.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -148,6 +149,13 @@ canonical_XCHAIN_BRIDGE() return XChainBridgeValue{xrpAccount(), xrpIssue(), xrpAccount(), xrpIssue()}; } +using JsonValue = std::decay_t; +inline JsonValue +canonical_JSON() +{ + return JsonValue{}; +} + // Untyped field canonical values inline STArray diff --git a/src/tests/libxrpl/protocol_autogen/ledger_entries/AccountRootTests.cpp b/src/tests/libxrpl/protocol_autogen/ledger_entries/AccountRootTests.cpp index e967b614b70..3191f29da41 100644 --- a/src/tests/libxrpl/protocol_autogen/ledger_entries/AccountRootTests.cpp +++ b/src/tests/libxrpl/protocol_autogen/ledger_entries/AccountRootTests.cpp @@ -43,6 +43,7 @@ TEST(AccountRootTests, BuilderSettersRoundTrip) auto const aMMIDValue = canonical_UINT256(); auto const vaultIDValue = canonical_UINT256(); auto const loanBrokerIDValue = canonical_UINT256(); + auto const contractIDValue = canonical_UINT256(); AccountRootBuilder builder{ accountValue, @@ -70,6 +71,7 @@ TEST(AccountRootTests, BuilderSettersRoundTrip) builder.setAMMID(aMMIDValue); builder.setVaultID(vaultIDValue); builder.setLoanBrokerID(loanBrokerIDValue); + builder.setContractID(contractIDValue); builder.setLedgerIndex(index); builder.setFlags(0x1u); @@ -252,6 +254,14 @@ TEST(AccountRootTests, BuilderSettersRoundTrip) EXPECT_TRUE(entry.hasLoanBrokerID()); } + { + auto const& expected = contractIDValue; + auto const actualOpt = entry.getContractID(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfContractID"); + EXPECT_TRUE(entry.hasContractID()); + } + EXPECT_TRUE(entry.hasLedgerIndex()); auto const ledgerIndex = entry.getLedgerIndex(); ASSERT_TRUE(ledgerIndex.has_value()); @@ -288,6 +298,7 @@ TEST(AccountRootTests, BuilderFromSleRoundTrip) auto const aMMIDValue = canonical_UINT256(); auto const vaultIDValue = canonical_UINT256(); auto const loanBrokerIDValue = canonical_UINT256(); + auto const contractIDValue = canonical_UINT256(); auto sle = std::make_shared(AccountRoot::entryType, index); @@ -314,6 +325,7 @@ TEST(AccountRootTests, BuilderFromSleRoundTrip) sle->at(sfAMMID) = aMMIDValue; sle->at(sfVaultID) = vaultIDValue; sle->at(sfLoanBrokerID) = loanBrokerIDValue; + sle->at(sfContractID) = contractIDValue; AccountRootBuilder builderFromSle{sle}; EXPECT_TRUE(builderFromSle.validate()); @@ -605,6 +617,19 @@ TEST(AccountRootTests, BuilderFromSleRoundTrip) expectEqualField(expected, *fromBuilderOpt, "sfLoanBrokerID"); } + { + auto const& expected = contractIDValue; + + auto const fromSleOpt = entryFromSle.getContractID(); + auto const fromBuilderOpt = entryFromBuilder.getContractID(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfContractID"); + expectEqualField(expected, *fromBuilderOpt, "sfContractID"); + } + EXPECT_EQ(entryFromSle.getKey(), index); EXPECT_EQ(entryFromBuilder.getKey(), index); } @@ -703,5 +728,7 @@ TEST(AccountRootTests, OptionalFieldsReturnNullopt) EXPECT_FALSE(entry.getVaultID().has_value()); EXPECT_FALSE(entry.hasLoanBrokerID()); EXPECT_FALSE(entry.getLoanBrokerID().has_value()); + EXPECT_FALSE(entry.hasContractID()); + EXPECT_FALSE(entry.getContractID().has_value()); } } diff --git a/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractDataTests.cpp b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractDataTests.cpp new file mode 100644 index 00000000000..eda0003568a --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractDataTests.cpp @@ -0,0 +1,223 @@ +// Auto-generated unit tests for ledger entry ContractData + + +#include + +#include + +#include +#include +#include + +#include + +namespace xrpl::ledger_entries { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed for both the +// builder's STObject and the wrapper's SLE. +TEST(ContractDataTests, BuilderSettersRoundTrip) +{ + uint256 const index{1u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const ownerNodeValue = canonical_UINT64(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractAccountValue = canonical_ACCOUNT(); + auto const contractJsonValue = canonical_JSON(); + + ContractDataBuilder builder{ + previousTxnIDValue, + previousTxnLgrSeqValue, + ownerNodeValue, + ownerValue, + contractAccountValue, + contractJsonValue + }; + + + builder.setLedgerIndex(index); + builder.setFlags(0x1u); + + EXPECT_TRUE(builder.validate()); + + auto const entry = builder.build(index); + + EXPECT_TRUE(entry.validate()); + + { + auto const& expected = previousTxnIDValue; + auto const actual = entry.getPreviousTxnID(); + expectEqualField(expected, actual, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + auto const actual = entry.getPreviousTxnLgrSeq(); + expectEqualField(expected, actual, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = ownerNodeValue; + auto const actual = entry.getOwnerNode(); + expectEqualField(expected, actual, "sfOwnerNode"); + } + + { + auto const& expected = ownerValue; + auto const actual = entry.getOwner(); + expectEqualField(expected, actual, "sfOwner"); + } + + { + auto const& expected = contractAccountValue; + auto const actual = entry.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = contractJsonValue; + auto const actual = entry.getContractJson(); + expectEqualField(expected, actual, "sfContractJson"); + } + + EXPECT_TRUE(entry.hasLedgerIndex()); + auto const ledgerIndex = entry.getLedgerIndex(); + ASSERT_TRUE(ledgerIndex.has_value()); + EXPECT_EQ(*ledgerIndex, index); + EXPECT_EQ(entry.getKey(), index); +} + +// 2 & 4) Start from an SLE, set fields directly on it, construct a builder +// from that SLE, build a new wrapper, and verify all fields (and validate()). +TEST(ContractDataTests, BuilderFromSleRoundTrip) +{ + uint256 const index{2u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const ownerNodeValue = canonical_UINT64(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractAccountValue = canonical_ACCOUNT(); + auto const contractJsonValue = canonical_JSON(); + + auto sle = std::make_shared(ContractData::entryType, index); + + sle->at(sfPreviousTxnID) = previousTxnIDValue; + sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue; + sle->at(sfOwnerNode) = ownerNodeValue; + sle->at(sfOwner) = ownerValue; + sle->at(sfContractAccount) = contractAccountValue; + sle->at(sfContractJson) = contractJsonValue; + + ContractDataBuilder builderFromSle{sle}; + EXPECT_TRUE(builderFromSle.validate()); + + auto const entryFromBuilder = builderFromSle.build(index); + + ContractData entryFromSle{sle}; + EXPECT_TRUE(entryFromBuilder.validate()); + EXPECT_TRUE(entryFromSle.validate()); + + { + auto const& expected = previousTxnIDValue; + + auto const fromSle = entryFromSle.getPreviousTxnID(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnID(); + + expectEqualField(expected, fromSle, "sfPreviousTxnID"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + + auto const fromSle = entryFromSle.getPreviousTxnLgrSeq(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq(); + + expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = ownerNodeValue; + + auto const fromSle = entryFromSle.getOwnerNode(); + auto const fromBuilder = entryFromBuilder.getOwnerNode(); + + expectEqualField(expected, fromSle, "sfOwnerNode"); + expectEqualField(expected, fromBuilder, "sfOwnerNode"); + } + + { + auto const& expected = ownerValue; + + auto const fromSle = entryFromSle.getOwner(); + auto const fromBuilder = entryFromBuilder.getOwner(); + + expectEqualField(expected, fromSle, "sfOwner"); + expectEqualField(expected, fromBuilder, "sfOwner"); + } + + { + auto const& expected = contractAccountValue; + + auto const fromSle = entryFromSle.getContractAccount(); + auto const fromBuilder = entryFromBuilder.getContractAccount(); + + expectEqualField(expected, fromSle, "sfContractAccount"); + expectEqualField(expected, fromBuilder, "sfContractAccount"); + } + + { + auto const& expected = contractJsonValue; + + auto const fromSle = entryFromSle.getContractJson(); + auto const fromBuilder = entryFromBuilder.getContractJson(); + + expectEqualField(expected, fromSle, "sfContractJson"); + expectEqualField(expected, fromBuilder, "sfContractJson"); + } + + EXPECT_EQ(entryFromSle.getKey(), index); + EXPECT_EQ(entryFromBuilder.getKey(), index); +} + +// 3) Verify wrapper throws when constructed from wrong ledger entry type. +TEST(ContractDataTests, WrapperThrowsOnWrongEntryType) +{ + uint256 const index{3u}; + + // Build a valid ledger entry of a different type + // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq + // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(ContractData{wrongEntry.getSle()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong ledger entry type. +TEST(ContractDataTests, BuilderThrowsOnWrongEntryType) +{ + uint256 const index{4u}; + + // Build a valid ledger entry of a different type + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(ContractDataBuilder{wrongEntry.getSle()}, std::runtime_error); +} + +} diff --git a/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractSourceTests.cpp b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractSourceTests.cpp new file mode 100644 index 00000000000..52e83a7fa54 --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractSourceTests.cpp @@ -0,0 +1,275 @@ +// Auto-generated unit tests for ledger entry ContractSource + + +#include + +#include + +#include +#include +#include + +#include + +namespace xrpl::ledger_entries { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed for both the +// builder's STObject and the wrapper's SLE. +TEST(ContractSourceTests, BuilderSettersRoundTrip) +{ + uint256 const index{1u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const contractHashValue = canonical_UINT256(); + auto const contractCodeValue = canonical_VL(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const referenceCountValue = canonical_UINT64(); + + ContractSourceBuilder builder{ + previousTxnIDValue, + previousTxnLgrSeqValue, + contractHashValue, + contractCodeValue, + functionsValue, + referenceCountValue + }; + + builder.setInstanceParameters(instanceParametersValue); + + builder.setLedgerIndex(index); + builder.setFlags(0x1u); + + EXPECT_TRUE(builder.validate()); + + auto const entry = builder.build(index); + + EXPECT_TRUE(entry.validate()); + + { + auto const& expected = previousTxnIDValue; + auto const actual = entry.getPreviousTxnID(); + expectEqualField(expected, actual, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + auto const actual = entry.getPreviousTxnLgrSeq(); + expectEqualField(expected, actual, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = contractHashValue; + auto const actual = entry.getContractHash(); + expectEqualField(expected, actual, "sfContractHash"); + } + + { + auto const& expected = contractCodeValue; + auto const actual = entry.getContractCode(); + expectEqualField(expected, actual, "sfContractCode"); + } + + { + auto const& expected = functionsValue; + auto const actual = entry.getFunctions(); + expectEqualField(expected, actual, "sfFunctions"); + } + + { + auto const& expected = referenceCountValue; + auto const actual = entry.getReferenceCount(); + expectEqualField(expected, actual, "sfReferenceCount"); + } + + { + auto const& expected = instanceParametersValue; + auto const actualOpt = entry.getInstanceParameters(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfInstanceParameters"); + EXPECT_TRUE(entry.hasInstanceParameters()); + } + + EXPECT_TRUE(entry.hasLedgerIndex()); + auto const ledgerIndex = entry.getLedgerIndex(); + ASSERT_TRUE(ledgerIndex.has_value()); + EXPECT_EQ(*ledgerIndex, index); + EXPECT_EQ(entry.getKey(), index); +} + +// 2 & 4) Start from an SLE, set fields directly on it, construct a builder +// from that SLE, build a new wrapper, and verify all fields (and validate()). +TEST(ContractSourceTests, BuilderFromSleRoundTrip) +{ + uint256 const index{2u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const contractHashValue = canonical_UINT256(); + auto const contractCodeValue = canonical_VL(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const referenceCountValue = canonical_UINT64(); + + auto sle = std::make_shared(ContractSource::entryType, index); + + sle->at(sfPreviousTxnID) = previousTxnIDValue; + sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue; + sle->at(sfContractHash) = contractHashValue; + sle->at(sfContractCode) = contractCodeValue; + sle->setFieldArray(sfFunctions, functionsValue); + sle->setFieldArray(sfInstanceParameters, instanceParametersValue); + sle->at(sfReferenceCount) = referenceCountValue; + + ContractSourceBuilder builderFromSle{sle}; + EXPECT_TRUE(builderFromSle.validate()); + + auto const entryFromBuilder = builderFromSle.build(index); + + ContractSource entryFromSle{sle}; + EXPECT_TRUE(entryFromBuilder.validate()); + EXPECT_TRUE(entryFromSle.validate()); + + { + auto const& expected = previousTxnIDValue; + + auto const fromSle = entryFromSle.getPreviousTxnID(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnID(); + + expectEqualField(expected, fromSle, "sfPreviousTxnID"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + + auto const fromSle = entryFromSle.getPreviousTxnLgrSeq(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq(); + + expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = contractHashValue; + + auto const fromSle = entryFromSle.getContractHash(); + auto const fromBuilder = entryFromBuilder.getContractHash(); + + expectEqualField(expected, fromSle, "sfContractHash"); + expectEqualField(expected, fromBuilder, "sfContractHash"); + } + + { + auto const& expected = contractCodeValue; + + auto const fromSle = entryFromSle.getContractCode(); + auto const fromBuilder = entryFromBuilder.getContractCode(); + + expectEqualField(expected, fromSle, "sfContractCode"); + expectEqualField(expected, fromBuilder, "sfContractCode"); + } + + { + auto const& expected = functionsValue; + + auto const fromSle = entryFromSle.getFunctions(); + auto const fromBuilder = entryFromBuilder.getFunctions(); + + expectEqualField(expected, fromSle, "sfFunctions"); + expectEqualField(expected, fromBuilder, "sfFunctions"); + } + + { + auto const& expected = referenceCountValue; + + auto const fromSle = entryFromSle.getReferenceCount(); + auto const fromBuilder = entryFromBuilder.getReferenceCount(); + + expectEqualField(expected, fromSle, "sfReferenceCount"); + expectEqualField(expected, fromBuilder, "sfReferenceCount"); + } + + { + auto const& expected = instanceParametersValue; + + auto const fromSleOpt = entryFromSle.getInstanceParameters(); + auto const fromBuilderOpt = entryFromBuilder.getInstanceParameters(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfInstanceParameters"); + expectEqualField(expected, *fromBuilderOpt, "sfInstanceParameters"); + } + + EXPECT_EQ(entryFromSle.getKey(), index); + EXPECT_EQ(entryFromBuilder.getKey(), index); +} + +// 3) Verify wrapper throws when constructed from wrong ledger entry type. +TEST(ContractSourceTests, WrapperThrowsOnWrongEntryType) +{ + uint256 const index{3u}; + + // Build a valid ledger entry of a different type + // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq + // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(ContractSource{wrongEntry.getSle()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong ledger entry type. +TEST(ContractSourceTests, BuilderThrowsOnWrongEntryType) +{ + uint256 const index{4u}; + + // Build a valid ledger entry of a different type + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(ContractSourceBuilder{wrongEntry.getSle()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(ContractSourceTests, OptionalFieldsReturnNullopt) +{ + uint256 const index{3u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const contractHashValue = canonical_UINT256(); + auto const contractCodeValue = canonical_VL(); + auto const functionsValue = canonical_ARRAY(); + auto const referenceCountValue = canonical_UINT64(); + + ContractSourceBuilder builder{ + previousTxnIDValue, + previousTxnLgrSeqValue, + contractHashValue, + contractCodeValue, + functionsValue, + referenceCountValue + }; + + auto const entry = builder.build(index); + + // Verify optional fields are not present + EXPECT_FALSE(entry.hasInstanceParameters()); + EXPECT_FALSE(entry.getInstanceParameters().has_value()); +} +} diff --git a/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractTests.cpp b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractTests.cpp new file mode 100644 index 00000000000..a25cb558253 --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/ledger_entries/ContractTests.cpp @@ -0,0 +1,324 @@ +// Auto-generated unit tests for ledger entry Contract + + +#include + +#include + +#include +#include +#include + +#include + +namespace xrpl::ledger_entries { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed for both the +// builder's STObject and the wrapper's SLE. +TEST(ContractTests, BuilderSettersRoundTrip) +{ + uint256 const index{1u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const sequenceValue = canonical_UINT32(); + auto const ownerNodeValue = canonical_UINT64(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractAccountValue = canonical_ACCOUNT(); + auto const contractHashValue = canonical_UINT256(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + ContractBuilder builder{ + previousTxnIDValue, + previousTxnLgrSeqValue, + sequenceValue, + ownerNodeValue, + ownerValue, + contractAccountValue, + contractHashValue + }; + + builder.setInstanceParameterValues(instanceParameterValuesValue); + builder.setURI(uRIValue); + + builder.setLedgerIndex(index); + builder.setFlags(0x1u); + + EXPECT_TRUE(builder.validate()); + + auto const entry = builder.build(index); + + EXPECT_TRUE(entry.validate()); + + { + auto const& expected = previousTxnIDValue; + auto const actual = entry.getPreviousTxnID(); + expectEqualField(expected, actual, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + auto const actual = entry.getPreviousTxnLgrSeq(); + expectEqualField(expected, actual, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = sequenceValue; + auto const actual = entry.getSequence(); + expectEqualField(expected, actual, "sfSequence"); + } + + { + auto const& expected = ownerNodeValue; + auto const actual = entry.getOwnerNode(); + expectEqualField(expected, actual, "sfOwnerNode"); + } + + { + auto const& expected = ownerValue; + auto const actual = entry.getOwner(); + expectEqualField(expected, actual, "sfOwner"); + } + + { + auto const& expected = contractAccountValue; + auto const actual = entry.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = contractHashValue; + auto const actual = entry.getContractHash(); + expectEqualField(expected, actual, "sfContractHash"); + } + + { + auto const& expected = instanceParameterValuesValue; + auto const actualOpt = entry.getInstanceParameterValues(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfInstanceParameterValues"); + EXPECT_TRUE(entry.hasInstanceParameterValues()); + } + + { + auto const& expected = uRIValue; + auto const actualOpt = entry.getURI(); + ASSERT_TRUE(actualOpt.has_value()); + expectEqualField(expected, *actualOpt, "sfURI"); + EXPECT_TRUE(entry.hasURI()); + } + + EXPECT_TRUE(entry.hasLedgerIndex()); + auto const ledgerIndex = entry.getLedgerIndex(); + ASSERT_TRUE(ledgerIndex.has_value()); + EXPECT_EQ(*ledgerIndex, index); + EXPECT_EQ(entry.getKey(), index); +} + +// 2 & 4) Start from an SLE, set fields directly on it, construct a builder +// from that SLE, build a new wrapper, and verify all fields (and validate()). +TEST(ContractTests, BuilderFromSleRoundTrip) +{ + uint256 const index{2u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const sequenceValue = canonical_UINT32(); + auto const ownerNodeValue = canonical_UINT64(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractAccountValue = canonical_ACCOUNT(); + auto const contractHashValue = canonical_UINT256(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + auto sle = std::make_shared(Contract::entryType, index); + + sle->at(sfPreviousTxnID) = previousTxnIDValue; + sle->at(sfPreviousTxnLgrSeq) = previousTxnLgrSeqValue; + sle->at(sfSequence) = sequenceValue; + sle->at(sfOwnerNode) = ownerNodeValue; + sle->at(sfOwner) = ownerValue; + sle->at(sfContractAccount) = contractAccountValue; + sle->at(sfContractHash) = contractHashValue; + sle->setFieldArray(sfInstanceParameterValues, instanceParameterValuesValue); + sle->at(sfURI) = uRIValue; + + ContractBuilder builderFromSle{sle}; + EXPECT_TRUE(builderFromSle.validate()); + + auto const entryFromBuilder = builderFromSle.build(index); + + Contract entryFromSle{sle}; + EXPECT_TRUE(entryFromBuilder.validate()); + EXPECT_TRUE(entryFromSle.validate()); + + { + auto const& expected = previousTxnIDValue; + + auto const fromSle = entryFromSle.getPreviousTxnID(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnID(); + + expectEqualField(expected, fromSle, "sfPreviousTxnID"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnID"); + } + + { + auto const& expected = previousTxnLgrSeqValue; + + auto const fromSle = entryFromSle.getPreviousTxnLgrSeq(); + auto const fromBuilder = entryFromBuilder.getPreviousTxnLgrSeq(); + + expectEqualField(expected, fromSle, "sfPreviousTxnLgrSeq"); + expectEqualField(expected, fromBuilder, "sfPreviousTxnLgrSeq"); + } + + { + auto const& expected = sequenceValue; + + auto const fromSle = entryFromSle.getSequence(); + auto const fromBuilder = entryFromBuilder.getSequence(); + + expectEqualField(expected, fromSle, "sfSequence"); + expectEqualField(expected, fromBuilder, "sfSequence"); + } + + { + auto const& expected = ownerNodeValue; + + auto const fromSle = entryFromSle.getOwnerNode(); + auto const fromBuilder = entryFromBuilder.getOwnerNode(); + + expectEqualField(expected, fromSle, "sfOwnerNode"); + expectEqualField(expected, fromBuilder, "sfOwnerNode"); + } + + { + auto const& expected = ownerValue; + + auto const fromSle = entryFromSle.getOwner(); + auto const fromBuilder = entryFromBuilder.getOwner(); + + expectEqualField(expected, fromSle, "sfOwner"); + expectEqualField(expected, fromBuilder, "sfOwner"); + } + + { + auto const& expected = contractAccountValue; + + auto const fromSle = entryFromSle.getContractAccount(); + auto const fromBuilder = entryFromBuilder.getContractAccount(); + + expectEqualField(expected, fromSle, "sfContractAccount"); + expectEqualField(expected, fromBuilder, "sfContractAccount"); + } + + { + auto const& expected = contractHashValue; + + auto const fromSle = entryFromSle.getContractHash(); + auto const fromBuilder = entryFromBuilder.getContractHash(); + + expectEqualField(expected, fromSle, "sfContractHash"); + expectEqualField(expected, fromBuilder, "sfContractHash"); + } + + { + auto const& expected = instanceParameterValuesValue; + + auto const fromSleOpt = entryFromSle.getInstanceParameterValues(); + auto const fromBuilderOpt = entryFromBuilder.getInstanceParameterValues(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfInstanceParameterValues"); + expectEqualField(expected, *fromBuilderOpt, "sfInstanceParameterValues"); + } + + { + auto const& expected = uRIValue; + + auto const fromSleOpt = entryFromSle.getURI(); + auto const fromBuilderOpt = entryFromBuilder.getURI(); + + ASSERT_TRUE(fromSleOpt.has_value()); + ASSERT_TRUE(fromBuilderOpt.has_value()); + + expectEqualField(expected, *fromSleOpt, "sfURI"); + expectEqualField(expected, *fromBuilderOpt, "sfURI"); + } + + EXPECT_EQ(entryFromSle.getKey(), index); + EXPECT_EQ(entryFromBuilder.getKey(), index); +} + +// 3) Verify wrapper throws when constructed from wrong ledger entry type. +TEST(ContractTests, WrapperThrowsOnWrongEntryType) +{ + uint256 const index{3u}; + + // Build a valid ledger entry of a different type + // Ticket requires: Account, OwnerNode, TicketSequence, PreviousTxnID, PreviousTxnLgrSeq + // Check requires: Account, Destination, SendMax, Sequence, OwnerNode, DestinationNode, PreviousTxnID, PreviousTxnLgrSeq + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(Contract{wrongEntry.getSle()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong ledger entry type. +TEST(ContractTests, BuilderThrowsOnWrongEntryType) +{ + uint256 const index{4u}; + + // Build a valid ledger entry of a different type + TicketBuilder wrongBuilder{ + canonical_ACCOUNT(), + canonical_UINT64(), + canonical_UINT32(), + canonical_UINT256(), + canonical_UINT32()}; + auto wrongEntry = wrongBuilder.build(index); + + EXPECT_THROW(ContractBuilder{wrongEntry.getSle()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(ContractTests, OptionalFieldsReturnNullopt) +{ + uint256 const index{3u}; + + auto const previousTxnIDValue = canonical_UINT256(); + auto const previousTxnLgrSeqValue = canonical_UINT32(); + auto const sequenceValue = canonical_UINT32(); + auto const ownerNodeValue = canonical_UINT64(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractAccountValue = canonical_ACCOUNT(); + auto const contractHashValue = canonical_UINT256(); + + ContractBuilder builder{ + previousTxnIDValue, + previousTxnLgrSeqValue, + sequenceValue, + ownerNodeValue, + ownerValue, + contractAccountValue, + contractHashValue + }; + + auto const entry = builder.build(index); + + // Verify optional fields are not present + EXPECT_FALSE(entry.hasInstanceParameterValues()); + EXPECT_FALSE(entry.getInstanceParameterValues().has_value()); + EXPECT_FALSE(entry.hasURI()); + EXPECT_FALSE(entry.getURI().has_value()); +} +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractCallTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractCallTests.cpp new file mode 100644 index 00000000000..f467bc5ebaf --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractCallTests.cpp @@ -0,0 +1,231 @@ +// Auto-generated unit tests for transaction ContractCall + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractCallTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCall")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const parametersValue = canonical_ARRAY(); + auto const computationAllowanceValue = canonical_UINT32(); + + ContractCallBuilder builder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + // Set optional fields + builder.setParameters(parametersValue); + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = tx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = functionNameValue; + auto const actual = tx.getFunctionName(); + expectEqualField(expected, actual, "sfFunctionName"); + } + + { + auto const& expected = computationAllowanceValue; + auto const actual = tx.getComputationAllowance(); + expectEqualField(expected, actual, "sfComputationAllowance"); + } + + // Verify optional fields + { + auto const& expected = parametersValue; + auto const actualOpt = tx.getParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfParameters should be present"; + expectEqualField(expected, *actualOpt, "sfParameters"); + EXPECT_TRUE(tx.hasParameters()); + } + +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractCallTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCallFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const parametersValue = canonical_ARRAY(); + auto const computationAllowanceValue = canonical_UINT32(); + + // Build an initial transaction + ContractCallBuilder initialBuilder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + initialBuilder.setParameters(parametersValue); + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractCallBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = rebuiltTx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = functionNameValue; + auto const actual = rebuiltTx.getFunctionName(); + expectEqualField(expected, actual, "sfFunctionName"); + } + + { + auto const& expected = computationAllowanceValue; + auto const actual = rebuiltTx.getComputationAllowance(); + expectEqualField(expected, actual, "sfComputationAllowance"); + } + + // Verify optional fields + { + auto const& expected = parametersValue; + auto const actualOpt = rebuiltTx.getParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfParameters should be present"; + expectEqualField(expected, *actualOpt, "sfParameters"); + } + +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractCallTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractCall{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractCallTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractCallBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(TransactionsContractCallTests, OptionalFieldsReturnNullopt) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCallNullopt")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 3; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific required field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const computationAllowanceValue = canonical_UINT32(); + + ContractCallBuilder builder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + // Do NOT set optional fields + + auto tx = builder.build(publicKey, secretKey); + + // Verify optional fields are not present + EXPECT_FALSE(tx.hasParameters()); + EXPECT_FALSE(tx.getParameters().has_value()); +} + +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractClawbackTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractClawbackTests.cpp new file mode 100644 index 00000000000..0200657391f --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractClawbackTests.cpp @@ -0,0 +1,195 @@ +// Auto-generated unit tests for transaction ContractClawback + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractClawbackTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractClawback")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const amountValue = canonical_AMOUNT(); + + ContractClawbackBuilder builder{ + accountValue, + amountValue, + sequenceValue, + feeValue + }; + + // Set optional fields + builder.setContractAccount(contractAccountValue); + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = amountValue; + auto const actual = tx.getAmount(); + expectEqualField(expected, actual, "sfAmount"); + } + + // Verify optional fields + { + auto const& expected = contractAccountValue; + auto const actualOpt = tx.getContractAccount(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractAccount should be present"; + expectEqualField(expected, *actualOpt, "sfContractAccount"); + EXPECT_TRUE(tx.hasContractAccount()); + } + +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractClawbackTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractClawbackFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const amountValue = canonical_AMOUNT(); + + // Build an initial transaction + ContractClawbackBuilder initialBuilder{ + accountValue, + amountValue, + sequenceValue, + feeValue + }; + + initialBuilder.setContractAccount(contractAccountValue); + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractClawbackBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = amountValue; + auto const actual = rebuiltTx.getAmount(); + expectEqualField(expected, actual, "sfAmount"); + } + + // Verify optional fields + { + auto const& expected = contractAccountValue; + auto const actualOpt = rebuiltTx.getContractAccount(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractAccount should be present"; + expectEqualField(expected, *actualOpt, "sfContractAccount"); + } + +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractClawbackTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractClawback{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractClawbackTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractClawbackBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(TransactionsContractClawbackTests, OptionalFieldsReturnNullopt) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractClawbackNullopt")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 3; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific required field values + auto const amountValue = canonical_AMOUNT(); + + ContractClawbackBuilder builder{ + accountValue, + amountValue, + sequenceValue, + feeValue + }; + + // Do NOT set optional fields + + auto tx = builder.build(publicKey, secretKey); + + // Verify optional fields are not present + EXPECT_FALSE(tx.hasContractAccount()); + EXPECT_FALSE(tx.getContractAccount().has_value()); +} + +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractCreateTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractCreateTests.cpp new file mode 100644 index 00000000000..29dd15c6b7f --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractCreateTests.cpp @@ -0,0 +1,282 @@ +// Auto-generated unit tests for transaction ContractCreate + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractCreateTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCreate")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractCodeValue = canonical_VL(); + auto const contractHashValue = canonical_UINT256(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + ContractCreateBuilder builder{ + accountValue, + sequenceValue, + feeValue + }; + + // Set optional fields + builder.setContractCode(contractCodeValue); + builder.setContractHash(contractHashValue); + builder.setFunctions(functionsValue); + builder.setInstanceParameters(instanceParametersValue); + builder.setInstanceParameterValues(instanceParameterValuesValue); + builder.setURI(uRIValue); + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + // Verify optional fields + { + auto const& expected = contractCodeValue; + auto const actualOpt = tx.getContractCode(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractCode should be present"; + expectEqualField(expected, *actualOpt, "sfContractCode"); + EXPECT_TRUE(tx.hasContractCode()); + } + + { + auto const& expected = contractHashValue; + auto const actualOpt = tx.getContractHash(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractHash should be present"; + expectEqualField(expected, *actualOpt, "sfContractHash"); + EXPECT_TRUE(tx.hasContractHash()); + } + + { + auto const& expected = functionsValue; + auto const actualOpt = tx.getFunctions(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFunctions should be present"; + expectEqualField(expected, *actualOpt, "sfFunctions"); + EXPECT_TRUE(tx.hasFunctions()); + } + + { + auto const& expected = instanceParametersValue; + auto const actualOpt = tx.getInstanceParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameters should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameters"); + EXPECT_TRUE(tx.hasInstanceParameters()); + } + + { + auto const& expected = instanceParameterValuesValue; + auto const actualOpt = tx.getInstanceParameterValues(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameterValues should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameterValues"); + EXPECT_TRUE(tx.hasInstanceParameterValues()); + } + + { + auto const& expected = uRIValue; + auto const actualOpt = tx.getURI(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfURI should be present"; + expectEqualField(expected, *actualOpt, "sfURI"); + EXPECT_TRUE(tx.hasURI()); + } + +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractCreateTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCreateFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractCodeValue = canonical_VL(); + auto const contractHashValue = canonical_UINT256(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + // Build an initial transaction + ContractCreateBuilder initialBuilder{ + accountValue, + sequenceValue, + feeValue + }; + + initialBuilder.setContractCode(contractCodeValue); + initialBuilder.setContractHash(contractHashValue); + initialBuilder.setFunctions(functionsValue); + initialBuilder.setInstanceParameters(instanceParametersValue); + initialBuilder.setInstanceParameterValues(instanceParameterValuesValue); + initialBuilder.setURI(uRIValue); + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractCreateBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + // Verify optional fields + { + auto const& expected = contractCodeValue; + auto const actualOpt = rebuiltTx.getContractCode(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractCode should be present"; + expectEqualField(expected, *actualOpt, "sfContractCode"); + } + + { + auto const& expected = contractHashValue; + auto const actualOpt = rebuiltTx.getContractHash(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractHash should be present"; + expectEqualField(expected, *actualOpt, "sfContractHash"); + } + + { + auto const& expected = functionsValue; + auto const actualOpt = rebuiltTx.getFunctions(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFunctions should be present"; + expectEqualField(expected, *actualOpt, "sfFunctions"); + } + + { + auto const& expected = instanceParametersValue; + auto const actualOpt = rebuiltTx.getInstanceParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameters should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameters"); + } + + { + auto const& expected = instanceParameterValuesValue; + auto const actualOpt = rebuiltTx.getInstanceParameterValues(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameterValues should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameterValues"); + } + + { + auto const& expected = uRIValue; + auto const actualOpt = rebuiltTx.getURI(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfURI should be present"; + expectEqualField(expected, *actualOpt, "sfURI"); + } + +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractCreateTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractCreate{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractCreateTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractCreateBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(TransactionsContractCreateTests, OptionalFieldsReturnNullopt) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractCreateNullopt")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 3; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific required field values + + ContractCreateBuilder builder{ + accountValue, + sequenceValue, + feeValue + }; + + // Do NOT set optional fields + + auto tx = builder.build(publicKey, secretKey); + + // Verify optional fields are not present + EXPECT_FALSE(tx.hasContractCode()); + EXPECT_FALSE(tx.getContractCode().has_value()); + EXPECT_FALSE(tx.hasContractHash()); + EXPECT_FALSE(tx.getContractHash().has_value()); + EXPECT_FALSE(tx.hasFunctions()); + EXPECT_FALSE(tx.getFunctions().has_value()); + EXPECT_FALSE(tx.hasInstanceParameters()); + EXPECT_FALSE(tx.getInstanceParameters().has_value()); + EXPECT_FALSE(tx.hasInstanceParameterValues()); + EXPECT_FALSE(tx.getInstanceParameterValues().has_value()); + EXPECT_FALSE(tx.hasURI()); + EXPECT_FALSE(tx.getURI().has_value()); +} + +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractDeleteTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractDeleteTests.cpp new file mode 100644 index 00000000000..6140cf0ec82 --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractDeleteTests.cpp @@ -0,0 +1,146 @@ +// Auto-generated unit tests for transaction ContractDelete + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractDeleteTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractDelete")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + + ContractDeleteBuilder builder{ + accountValue, + contractAccountValue, + sequenceValue, + feeValue + }; + + // Set optional fields + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = tx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + // Verify optional fields +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractDeleteTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractDeleteFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + + // Build an initial transaction + ContractDeleteBuilder initialBuilder{ + accountValue, + contractAccountValue, + sequenceValue, + feeValue + }; + + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractDeleteBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = rebuiltTx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + // Verify optional fields +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractDeleteTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractDelete{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractDeleteTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractDeleteBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + + +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractModifyTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractModifyTests.cpp new file mode 100644 index 00000000000..f527363e7e1 --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractModifyTests.cpp @@ -0,0 +1,324 @@ +// Auto-generated unit tests for transaction ContractModify + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractModifyTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractModify")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractCodeValue = canonical_VL(); + auto const contractHashValue = canonical_UINT256(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + ContractModifyBuilder builder{ + accountValue, + sequenceValue, + feeValue + }; + + // Set optional fields + builder.setContractAccount(contractAccountValue); + builder.setOwner(ownerValue); + builder.setContractCode(contractCodeValue); + builder.setContractHash(contractHashValue); + builder.setFunctions(functionsValue); + builder.setInstanceParameters(instanceParametersValue); + builder.setInstanceParameterValues(instanceParameterValuesValue); + builder.setURI(uRIValue); + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + // Verify optional fields + { + auto const& expected = contractAccountValue; + auto const actualOpt = tx.getContractAccount(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractAccount should be present"; + expectEqualField(expected, *actualOpt, "sfContractAccount"); + EXPECT_TRUE(tx.hasContractAccount()); + } + + { + auto const& expected = ownerValue; + auto const actualOpt = tx.getOwner(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfOwner should be present"; + expectEqualField(expected, *actualOpt, "sfOwner"); + EXPECT_TRUE(tx.hasOwner()); + } + + { + auto const& expected = contractCodeValue; + auto const actualOpt = tx.getContractCode(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractCode should be present"; + expectEqualField(expected, *actualOpt, "sfContractCode"); + EXPECT_TRUE(tx.hasContractCode()); + } + + { + auto const& expected = contractHashValue; + auto const actualOpt = tx.getContractHash(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractHash should be present"; + expectEqualField(expected, *actualOpt, "sfContractHash"); + EXPECT_TRUE(tx.hasContractHash()); + } + + { + auto const& expected = functionsValue; + auto const actualOpt = tx.getFunctions(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFunctions should be present"; + expectEqualField(expected, *actualOpt, "sfFunctions"); + EXPECT_TRUE(tx.hasFunctions()); + } + + { + auto const& expected = instanceParametersValue; + auto const actualOpt = tx.getInstanceParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameters should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameters"); + EXPECT_TRUE(tx.hasInstanceParameters()); + } + + { + auto const& expected = instanceParameterValuesValue; + auto const actualOpt = tx.getInstanceParameterValues(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameterValues should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameterValues"); + EXPECT_TRUE(tx.hasInstanceParameterValues()); + } + + { + auto const& expected = uRIValue; + auto const actualOpt = tx.getURI(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfURI should be present"; + expectEqualField(expected, *actualOpt, "sfURI"); + EXPECT_TRUE(tx.hasURI()); + } + +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractModifyTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractModifyFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const ownerValue = canonical_ACCOUNT(); + auto const contractCodeValue = canonical_VL(); + auto const contractHashValue = canonical_UINT256(); + auto const functionsValue = canonical_ARRAY(); + auto const instanceParametersValue = canonical_ARRAY(); + auto const instanceParameterValuesValue = canonical_ARRAY(); + auto const uRIValue = canonical_VL(); + + // Build an initial transaction + ContractModifyBuilder initialBuilder{ + accountValue, + sequenceValue, + feeValue + }; + + initialBuilder.setContractAccount(contractAccountValue); + initialBuilder.setOwner(ownerValue); + initialBuilder.setContractCode(contractCodeValue); + initialBuilder.setContractHash(contractHashValue); + initialBuilder.setFunctions(functionsValue); + initialBuilder.setInstanceParameters(instanceParametersValue); + initialBuilder.setInstanceParameterValues(instanceParameterValuesValue); + initialBuilder.setURI(uRIValue); + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractModifyBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + // Verify optional fields + { + auto const& expected = contractAccountValue; + auto const actualOpt = rebuiltTx.getContractAccount(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractAccount should be present"; + expectEqualField(expected, *actualOpt, "sfContractAccount"); + } + + { + auto const& expected = ownerValue; + auto const actualOpt = rebuiltTx.getOwner(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfOwner should be present"; + expectEqualField(expected, *actualOpt, "sfOwner"); + } + + { + auto const& expected = contractCodeValue; + auto const actualOpt = rebuiltTx.getContractCode(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractCode should be present"; + expectEqualField(expected, *actualOpt, "sfContractCode"); + } + + { + auto const& expected = contractHashValue; + auto const actualOpt = rebuiltTx.getContractHash(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfContractHash should be present"; + expectEqualField(expected, *actualOpt, "sfContractHash"); + } + + { + auto const& expected = functionsValue; + auto const actualOpt = rebuiltTx.getFunctions(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfFunctions should be present"; + expectEqualField(expected, *actualOpt, "sfFunctions"); + } + + { + auto const& expected = instanceParametersValue; + auto const actualOpt = rebuiltTx.getInstanceParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameters should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameters"); + } + + { + auto const& expected = instanceParameterValuesValue; + auto const actualOpt = rebuiltTx.getInstanceParameterValues(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfInstanceParameterValues should be present"; + expectEqualField(expected, *actualOpt, "sfInstanceParameterValues"); + } + + { + auto const& expected = uRIValue; + auto const actualOpt = rebuiltTx.getURI(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfURI should be present"; + expectEqualField(expected, *actualOpt, "sfURI"); + } + +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractModifyTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractModify{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractModifyTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractModifyBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(TransactionsContractModifyTests, OptionalFieldsReturnNullopt) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractModifyNullopt")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 3; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific required field values + + ContractModifyBuilder builder{ + accountValue, + sequenceValue, + feeValue + }; + + // Do NOT set optional fields + + auto tx = builder.build(publicKey, secretKey); + + // Verify optional fields are not present + EXPECT_FALSE(tx.hasContractAccount()); + EXPECT_FALSE(tx.getContractAccount().has_value()); + EXPECT_FALSE(tx.hasOwner()); + EXPECT_FALSE(tx.getOwner().has_value()); + EXPECT_FALSE(tx.hasContractCode()); + EXPECT_FALSE(tx.getContractCode().has_value()); + EXPECT_FALSE(tx.hasContractHash()); + EXPECT_FALSE(tx.getContractHash().has_value()); + EXPECT_FALSE(tx.hasFunctions()); + EXPECT_FALSE(tx.getFunctions().has_value()); + EXPECT_FALSE(tx.hasInstanceParameters()); + EXPECT_FALSE(tx.getInstanceParameters().has_value()); + EXPECT_FALSE(tx.hasInstanceParameterValues()); + EXPECT_FALSE(tx.getInstanceParameterValues().has_value()); + EXPECT_FALSE(tx.hasURI()); + EXPECT_FALSE(tx.getURI().has_value()); +} + +} diff --git a/src/tests/libxrpl/protocol_autogen/transactions/ContractUserDeleteTests.cpp b/src/tests/libxrpl/protocol_autogen/transactions/ContractUserDeleteTests.cpp new file mode 100644 index 00000000000..896f0157a2a --- /dev/null +++ b/src/tests/libxrpl/protocol_autogen/transactions/ContractUserDeleteTests.cpp @@ -0,0 +1,231 @@ +// Auto-generated unit tests for transaction ContractUserDelete + + +#include + +#include + +#include +#include +#include +#include +#include + +#include + +namespace xrpl::transactions { + +// 1 & 4) Set fields via builder setters, build, then read them back via +// wrapper getters. After build(), validate() should succeed. +TEST(TransactionsContractUserDeleteTests, BuilderSettersRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractUserDelete")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 1; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const parametersValue = canonical_ARRAY(); + auto const computationAllowanceValue = canonical_UINT32(); + + ContractUserDeleteBuilder builder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + // Set optional fields + builder.setParameters(parametersValue); + + auto tx = builder.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(tx.validate(reason)) << reason; + + // Verify signing was applied + EXPECT_FALSE(tx.getSigningPubKey().empty()); + EXPECT_TRUE(tx.hasTxnSignature()); + + // Verify common fields + EXPECT_EQ(tx.getAccount(), accountValue); + EXPECT_EQ(tx.getSequence(), sequenceValue); + EXPECT_EQ(tx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = tx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = functionNameValue; + auto const actual = tx.getFunctionName(); + expectEqualField(expected, actual, "sfFunctionName"); + } + + { + auto const& expected = computationAllowanceValue; + auto const actual = tx.getComputationAllowance(); + expectEqualField(expected, actual, "sfComputationAllowance"); + } + + // Verify optional fields + { + auto const& expected = parametersValue; + auto const actualOpt = tx.getParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfParameters should be present"; + expectEqualField(expected, *actualOpt, "sfParameters"); + EXPECT_TRUE(tx.hasParameters()); + } + +} + +// 2 & 4) Start from an STTx, construct a builder from it, build a new wrapper, +// and verify all fields match. +TEST(TransactionsContractUserDeleteTests, BuilderFromStTxRoundTrip) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractUserDeleteFromTx")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 2; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const parametersValue = canonical_ARRAY(); + auto const computationAllowanceValue = canonical_UINT32(); + + // Build an initial transaction + ContractUserDeleteBuilder initialBuilder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + initialBuilder.setParameters(parametersValue); + + auto initialTx = initialBuilder.build(publicKey, secretKey); + + // Create builder from existing STTx + ContractUserDeleteBuilder builderFromTx{initialTx.getSTTx()}; + + auto rebuiltTx = builderFromTx.build(publicKey, secretKey); + + std::string reason; + EXPECT_TRUE(rebuiltTx.validate(reason)) << reason; + + // Verify common fields + EXPECT_EQ(rebuiltTx.getAccount(), accountValue); + EXPECT_EQ(rebuiltTx.getSequence(), sequenceValue); + EXPECT_EQ(rebuiltTx.getFee(), feeValue); + + // Verify required fields + { + auto const& expected = contractAccountValue; + auto const actual = rebuiltTx.getContractAccount(); + expectEqualField(expected, actual, "sfContractAccount"); + } + + { + auto const& expected = functionNameValue; + auto const actual = rebuiltTx.getFunctionName(); + expectEqualField(expected, actual, "sfFunctionName"); + } + + { + auto const& expected = computationAllowanceValue; + auto const actual = rebuiltTx.getComputationAllowance(); + expectEqualField(expected, actual, "sfComputationAllowance"); + } + + // Verify optional fields + { + auto const& expected = parametersValue; + auto const actualOpt = rebuiltTx.getParameters(); + ASSERT_TRUE(actualOpt.has_value()) << "Optional field sfParameters should be present"; + expectEqualField(expected, *actualOpt, "sfParameters"); + } + +} + +// 3) Verify wrapper throws when constructed from wrong transaction type. +TEST(TransactionsContractUserDeleteTests, WrapperThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongType")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractUserDelete{wrongTx.getSTTx()}, std::runtime_error); +} + +// 4) Verify builder throws when constructed from wrong transaction type. +TEST(TransactionsContractUserDeleteTests, BuilderThrowsOnWrongTxType) +{ + // Build a valid transaction of a different type + auto const [pk, sk] = + generateKeyPair(KeyType::secp256k1, generateSeed("testWrongTypeBuilder")); + auto const account = calcAccountID(pk); + + AccountSetBuilder wrongBuilder{account, 1, canonical_AMOUNT()}; + auto wrongTx = wrongBuilder.build(pk, sk); + + EXPECT_THROW(ContractUserDeleteBuilder{wrongTx.getSTTx()}, std::runtime_error); +} + +// 5) Build with only required fields and verify optional fields return nullopt. +TEST(TransactionsContractUserDeleteTests, OptionalFieldsReturnNullopt) +{ + // Generate a deterministic keypair for signing + auto const [publicKey, secretKey] = + generateKeyPair(KeyType::secp256k1, generateSeed("testContractUserDeleteNullopt")); + + // Common transaction fields + auto const accountValue = calcAccountID(publicKey); + std::uint32_t const sequenceValue = 3; + auto const feeValue = canonical_AMOUNT(); + + // Transaction-specific required field values + auto const contractAccountValue = canonical_ACCOUNT(); + auto const functionNameValue = canonical_VL(); + auto const computationAllowanceValue = canonical_UINT32(); + + ContractUserDeleteBuilder builder{ + accountValue, + contractAccountValue, + functionNameValue, + computationAllowanceValue, + sequenceValue, + feeValue + }; + + // Do NOT set optional fields + + auto tx = builder.build(publicKey, secretKey); + + // Verify optional fields are not present + EXPECT_FALSE(tx.hasParameters()); + EXPECT_FALSE(tx.getParameters().has_value()); +} + +} diff --git a/src/xrpld/app/misc/DeleteUtils.cpp b/src/xrpld/app/misc/DeleteUtils.cpp new file mode 100644 index 00000000000..503a5b72f1c --- /dev/null +++ b/src/xrpld/app/misc/DeleteUtils.cpp @@ -0,0 +1,383 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +namespace xrpl { + +// Local function definitions that provides signature compatibility. +TER +offerDelete( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return offerDelete(view, sleDel, j); +} + +TER +removeSignersFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return SignerListSet::removeFromLedger(registry, view, account, j); +} + +TER +removeTicketFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const&, + beast::Journal j) +{ + return Transactor::ticketDelete(view, account, delIndex, j); +} + +TER +removeDepositPreauthFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const&, + uint256 const& delIndex, + std::shared_ptr const&, + beast::Journal j) +{ + return DepositPreauth::removeFromLedger(view, delIndex, j); +} + +TER +removeNFTokenOfferFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal) +{ + if (!nft::deleteTokenOffer(view, sleDel)) + return tefBAD_LEDGER; + + return tesSUCCESS; +} + +TER +removeDIDFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return DIDDelete::deleteSLE(view, sleDel, account, j); +} + +TER +removeOracleFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const& account, + uint256 const&, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return OracleDelete::deleteOracle(view, sleDel, account, j); +} + +TER +removeCredentialFromLedger( + ServiceRegistry&, + ApplyView& view, + AccountID const&, + uint256 const&, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return credentials::deleteSLE(view, sleDel, j); +} + +TER +removeDelegateFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return DelegateSet::deleteDelegate(view, sleDel, account, j); +} + +TER +removeContractFromLedger( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j) +{ + return ContractDelete::deleteContract(view, sleDel, account, j); +} + +// Return nullptr if the LedgerEntryType represents an obligation that can't +// be deleted. Otherwise return the pointer to the function that can delete +// the non-obligation +DeleterFuncPtr +nonObligationDeleter(LedgerEntryType t) +{ + switch (t) + { + case ltOFFER: + return offerDelete; + case ltSIGNER_LIST: + return removeSignersFromLedger; + case ltTICKET: + return removeTicketFromLedger; + case ltDEPOSIT_PREAUTH: + return removeDepositPreauthFromLedger; + case ltNFTOKEN_OFFER: + return removeNFTokenOfferFromLedger; + case ltDID: + return removeDIDFromLedger; + case ltORACLE: + return removeOracleFromLedger; + case ltCREDENTIAL: + return removeCredentialFromLedger; + case ltDELEGATE: + return removeDelegateFromLedger; + case ltCONTRACT: + return removeContractFromLedger; + default: + return nullptr; + } +} + +TER +deletePreclaim( + PreclaimContext const& ctx, + std::uint32_t seqDelta, + AccountID const account, + AccountID const dest, + bool isPseudoAccount) +{ + auto destSle = ctx.view.read(keylet::account(dest)); + + if (!destSle) + return tecNO_DST; + + if ((*destSle)[sfFlags] & lsfRequireDestTag && !ctx.tx[~sfDestinationTag]) + return tecDST_TAG_NEEDED; + + // If credentials are provided - check them anyway + if (auto const err = credentials::valid(ctx.tx, ctx.view, account, ctx.j); !isTesSuccess(err)) + return err; + + // if credentials then postpone auth check to doApply, to check for expired + // credentials + if (!ctx.tx.isFieldPresent(sfCredentialIDs)) + { + // Check whether the destination account requires deposit authorization. + if (destSle->getFlags() & lsfDepositAuth) + { + if (!ctx.view.exists(keylet::depositPreauth(dest, account)) && !isPseudoAccount) + return tecNO_PERMISSION; + } + } + + auto srcSle = ctx.view.read(keylet::account(account)); + XRPL_ASSERT(srcSle, "xrpl::DeleteAccount::preclaim : non-null account"); + if (!srcSle) + return terNO_ACCOUNT; + + { + // If an issuer has any issued NFTs resident in the ledger then it + // cannot be deleted. + if ((*srcSle)[~sfMintedNFTokens] != (*srcSle)[~sfBurnedNFTokens]) + return tecHAS_OBLIGATIONS; + + // If the account owns any NFTs it cannot be deleted. + Keylet const first = keylet::nftpage_min(account); + Keylet const last = keylet::nftpage_max(account); + + auto const cp = ctx.view.read( + Keylet(ltNFTOKEN_PAGE, ctx.view.succ(first.key, last.key.next()).value_or(last.key))); + if (cp) + return tecHAS_OBLIGATIONS; + } + + // We don't allow an account to be deleted if its sequence number + // is within 256 of the current ledger. This prevents replay of old + // transactions if this account is resurrected after it is deleted. + // + // We look at the account's Sequence rather than the transaction's + // Sequence in preparation for Tickets. + if ((*srcSle)[sfSequence] + seqDelta > ctx.view.seq()) + return tecTOO_SOON; + + // When fixNFTokenRemint is enabled, we don't allow an account to be + // deleted if is within 256 of the + // current ledger. This is to prevent having duplicate NFTokenIDs after + // account re-creation. + // + // Without this restriction, duplicate NFTokenIDs can be reproduced when + // authorized minting is involved. Because when the minter mints a NFToken, + // the issuer's sequence does not change. So when the issuer re-creates + // their account and mints a NFToken, it is possible that the + // NFTokenSequence of this NFToken is the same as the one that the + // authorized minter minted in a previous ledger. + if ((*srcSle)[~sfFirstNFTokenSequence].value_or(0) + (*srcSle)[~sfMintedNFTokens].value_or(0) + + seqDelta > + ctx.view.seq()) + return tecTOO_SOON; + + // Verify that the account does not own any objects that would prevent + // the account from being deleted. + Keylet const ownerDirKeylet{keylet::ownerDir(account)}; + if (dirIsEmpty(ctx.view, ownerDirKeylet)) + return tesSUCCESS; + + std::shared_ptr sleDirNode{}; + unsigned int uDirEntry{0}; + uint256 dirEntry{beast::zero}; + + // Account has no directory at all. This _should_ have been caught + // by the dirIsEmpty() check earlier, but it's okay to catch it here. + if (!cdirFirst(ctx.view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry)) + return tesSUCCESS; + + std::int32_t deletableDirEntryCount{0}; + do + { + // Make sure any directory node types that we find are the kind + // we can delete. + auto sleItem = ctx.view.read(keylet::child(dirEntry)); + if (!sleItem) + { + // Directory node has an invalid index. Bail out. + JLOG(ctx.j.fatal()) << "DeleteAccount: directory node in ledger " << ctx.view.seq() + << " has index to object that is missing: " << to_string(dirEntry); + return tefBAD_LEDGER; + } + + LedgerEntryType const nodeType{safe_cast((*sleItem)[sfLedgerEntryType])}; + + if (!nonObligationDeleter(nodeType)) + return tecHAS_OBLIGATIONS; + + // We found a deletable directory entry. Count it. If we find too + // many deletable directory entries then bail out. + if (++deletableDirEntryCount > maxDeletableDirEntries) + return tefTOO_BIG; + + } while (cdirNext(ctx.view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry)); + + return tesSUCCESS; +} + +TER +deleteDoApply( + ApplyContext& applyCtx, + STAmount const& accountBalance, + AccountID const& account, + AccountID const& dest) +{ + auto& view = applyCtx.view(); + STTx const tx = applyCtx.tx; + beast::Journal j = applyCtx.journal; + + auto srcSle = view.peek(keylet::account(account)); + XRPL_ASSERT(srcSle, "xrpl::DeleteAccount::doApply : non-null source account"); + + if (!srcSle) + return tefBAD_LEDGER; + + auto destSle = view.peek(keylet::account(dest)); + XRPL_ASSERT(destSle, "xrpl::DeleteAccount::doApply : non-null destination account"); + + if (!destSle) + return tefBAD_LEDGER; + + if (tx.isFieldPresent(sfCredentialIDs)) + { + if (auto err = verifyDepositPreauth(tx, view, account, dest, destSle, j); + !isTesSuccess(err)) + return err; + } + + Keylet const ownerDirKeylet{keylet::ownerDir(account)}; + auto const ter = cleanupOnAccountDelete( + view, + ownerDirKeylet, + [&](LedgerEntryType nodeType, + uint256 const& dirEntry, + std::shared_ptr& sleItem) -> std::pair { + if (auto deleter = nonObligationDeleter(nodeType)) + { + TER const result{deleter(applyCtx.registry, view, account, dirEntry, sleItem, j)}; + + return {result, SkipEntry::No}; + } + + UNREACHABLE( + "xrpl::DeleteAccount::doApply : undeletable item not found " + "in preclaim"); + JLOG(j.error()) << "DeleteAccount undeletable item not " + "found in preclaim."; + return {tecHAS_OBLIGATIONS, SkipEntry::No}; + }, + j); + if (ter != tesSUCCESS) + return ter; + + // Transfer any XRP remaining after the fee is paid to the destination: + (*destSle)[sfBalance] = (*destSle)[sfBalance] + accountBalance; + (*srcSle)[sfBalance] = (*srcSle)[sfBalance] - accountBalance; + applyCtx.deliver(accountBalance); + + // DA: Pseudo accounts can have 0 balance, so we skip this assert. + // FIX FIX FIX: DA FIX + // XRPL_ASSERT( + // (*srcSle)[sfBalance] == XRPAmount(0), + // "xrpl::DeleteAccount::doApply : source balance is zero"); + + // If there's still an owner directory associated with the source account + // delete it. + if (view.exists(ownerDirKeylet) && !view.emptyDirDelete(ownerDirKeylet)) + { + JLOG(j.error()) << "DeleteAccount cannot delete root dir node of " << toBase58(account); + return tecHAS_OBLIGATIONS; + } + + // Re-arm the password change fee if we can and need to. + if (accountBalance > XRPAmount(0) && (*destSle).isFlag(lsfPasswordSpent)) + (*destSle).clearFlag(lsfPasswordSpent); + + view.update(destSle); + view.erase(srcSle); + + return tesSUCCESS; +} + +} // namespace xrpl diff --git a/src/xrpld/app/misc/DeleteUtils.h b/src/xrpld/app/misc/DeleteUtils.h new file mode 100644 index 00000000000..6bcca1fb5f8 --- /dev/null +++ b/src/xrpld/app/misc/DeleteUtils.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +// Define a function pointer type that can be used to delete ledger node types. +using DeleterFuncPtr = TER (*)( + ServiceRegistry& registry, + ApplyView& view, + AccountID const& account, + uint256 const& delIndex, + std::shared_ptr const& sleDel, + beast::Journal j); + +DeleterFuncPtr +nonObligationDeleter(LedgerEntryType t); + +TER +deletePreclaim( + PreclaimContext const& ctx, + std::uint32_t seqDelta, + AccountID const account, + AccountID const dest, + bool isPseudoAccount = false); + +TER +deleteDoApply( + ApplyContext& applyCtx, + STAmount const& accountBalance, + AccountID const& account, + AccountID const& dest); + +} // namespace xrpl diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index 84ddb6b5f16..a2c13bcd7b9 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -537,6 +537,12 @@ class NetworkOPsImp final : public NetworkOPs subConsensus(InfoSub::ref ispListener) override; bool unsubConsensus(std::uint64_t uListener) override; + bool + subContractEvent(InfoSub::ref ispListener) override; + bool + unsubContractEvent(std::uint64_t uListener) override; + void + pubContractEvent(std::string const& name, STJson const& event) override; InfoSub::pointer findRpcSub(std::string const& strUrl) override; @@ -735,6 +741,7 @@ class NetworkOPsImp final : public NetworkOPs sPeerStatus, // Peer status changes. sConsensusPhase, // Consensus phase sBookChanges, // Per-ledger order book changes + sContractEvents, // Contract events sLastEntry // Any new entry must be ADDED ABOVE this one }; @@ -2268,6 +2275,34 @@ NetworkOPsImp::pubConsensus(ConsensusPhase phase) } } +void +NetworkOPsImp::pubContractEvent(std::string const& name, STJson const& event) +{ + std::lock_guard sl(mSubLock); + + auto& streamMap = mStreamMaps[sContractEvents]; + if (!streamMap.empty()) + { + Json::Value jvObj(Json::objectValue); + jvObj[jss::type] = "contractEvent"; + jvObj[jss::name] = name; + jvObj[jss::data] = event.getJson(JsonOptions::none); + + for (auto i = streamMap.begin(); i != streamMap.end();) + { + if (auto p = i->second.lock()) + { + p->send(jvObj, true); + ++i; + } + else + { + i = streamMap.erase(i); + } + } + } +} + void NetworkOPsImp::pubValidation(std::shared_ptr const& val) { @@ -4230,6 +4265,22 @@ NetworkOPsImp::unsubConsensus(std::uint64_t uSeq) return mStreamMaps[sConsensusPhase].erase(uSeq) != 0u; } +// <-- bool: true=added, false=already there +bool +NetworkOPsImp::subContractEvent(InfoSub::ref isrListener) +{ + std::lock_guard sl(mSubLock); + return mStreamMaps[sContractEvents].emplace(isrListener->getSeq(), isrListener).second; +} + +// <-- bool: true=erased, false=was not there +bool +NetworkOPsImp::unsubContractEvent(std::uint64_t uSeq) +{ + std::lock_guard sl(mSubLock); + return mStreamMaps[sContractEvents].erase(uSeq); +} + InfoSub::pointer NetworkOPsImp::findRpcSub(std::string const& strUrl) { diff --git a/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp b/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp new file mode 100644 index 00000000000..2c7c43dbe89 --- /dev/null +++ b/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp @@ -0,0 +1,1053 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +Expected +getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) +{ + switch (stTypeId) + { + case STI_UINT8: { + if (funcParam.getInnerSType() != STI_UINT8) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint8_t data = funcParam.getFieldU8(); + return Bytes{data}; + } + case STI_UINT16: { + if (funcParam.getInnerSType() != STI_UINT16) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint16_t data = funcParam.getFieldU16(); + return Bytes{ + static_cast(data & 0xFF), + static_cast((data >> 8) & 0xFF)}; + } + case STI_UINT32: { + if (funcParam.getInnerSType() != STI_UINT32) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint32_t data = funcParam.getFieldU32(); + return Bytes{ + static_cast(data & 0xFF), + static_cast((data >> 8) & 0xFF), + static_cast((data >> 16) & 0xFF), + static_cast((data >> 24) & 0xFF)}; + } + case STI_UINT64: { + if (funcParam.getInnerSType() != STI_UINT64) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint64_t data = funcParam.getFieldU64(); + return Bytes{ + static_cast(data & 0xFF), + static_cast((data >> 8) & 0xFF), + static_cast((data >> 16) & 0xFF), + static_cast((data >> 24) & 0xFF), + static_cast((data >> 32) & 0xFF), + static_cast((data >> 40) & 0xFF), + static_cast((data >> 48) & 0xFF), + static_cast((data >> 56) & 0xFF)}; + } + case STI_UINT128: { + if (funcParam.getInnerSType() != STI_UINT128) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint128 data = funcParam.getFieldH128(); + return Bytes{ + reinterpret_cast(&data), + reinterpret_cast(&data) + sizeof(uint128)}; + } + case STI_UINT160: { + if (funcParam.getInnerSType() != STI_UINT160) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint160 data = funcParam.getFieldH160(); + return Bytes{data.begin(), data.end()}; + } + case STI_UINT192: { + if (funcParam.getInnerSType() != STI_UINT192) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint192 data = funcParam.getFieldH192(); + return Bytes{data.begin(), data.end()}; + } + case STI_UINT256: { + if (funcParam.getInnerSType() != STI_UINT256) + return Unexpected(HostFunctionError::INVALID_PARAMS); + uint256 data = funcParam.getFieldH256(); + return Bytes{data.begin(), data.end()}; + } + case STI_VL: { + if (funcParam.getInnerSType() != STI_VL) + return Unexpected(HostFunctionError::INVALID_PARAMS); + auto data = funcParam.getFieldVL(); + return Bytes{data.begin(), data.end()}; + } + case STI_ACCOUNT: { + if (funcParam.getInnerSType() != STI_ACCOUNT) + return Unexpected(HostFunctionError::INVALID_PARAMS); + AccountID data = funcParam.getAccountID(); + return Bytes{data.data(), data.data() + data.size()}; + } + case STI_AMOUNT: { + if (funcParam.getInnerSType() != STI_AMOUNT) + return Unexpected(HostFunctionError::INVALID_PARAMS); + STAmount data = funcParam.getFieldAmount(); + Serializer s; + data.add(s); + auto const& serialized = s.getData(); + return Bytes{serialized.begin(), serialized.end()}; + } + case STI_NUMBER: { + if (funcParam.getInnerSType() != STI_NUMBER) + return Unexpected(HostFunctionError::INVALID_PARAMS); + STNumber data = funcParam.getFieldNumber(); + Serializer s; + data.add(s); + auto const& serialized = s.getData(); + return Bytes{serialized.begin(), serialized.end()}; + } + case STI_ISSUE: { + if (funcParam.getInnerSType() != STI_ISSUE) + return Unexpected(HostFunctionError::INVALID_PARAMS); + STIssue data = funcParam.getFieldIssue(); + Serializer s; + data.add(s); + auto const& serialized = s.getData(); + return Bytes{serialized.begin(), serialized.end()}; + } + case STI_CURRENCY: { + if (funcParam.getInnerSType() != STI_CURRENCY) + return Unexpected(HostFunctionError::INVALID_PARAMS); + STCurrency data = funcParam.getFieldCurrency(); + Serializer s; + data.add(s); + auto const& serialized = s.getData(); + return Bytes{serialized.begin(), serialized.end()}; + } + case STI_PATHSET: + case STI_VECTOR256: + case STI_XCHAIN_BRIDGE: + case STI_DATA: + case STI_DATATYPE: + case STI_JSON: + default: + return Unexpected(HostFunctionError::INVALID_PARAMS); + } + return Unexpected(HostFunctionError::INVALID_PARAMS); +} + +Expected +ContractHostFunctionsImpl::instanceParam(std::uint32_t index, std::uint32_t stTypeId) +{ + auto j = getJournal(); + auto const& instanceParams = contractCtx.instanceParameters; + + if (instanceParams.size() <= index) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "instanceParam: Index out of bounds"; + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + } + + xrpl::STData const& instParam = instanceParams[index].value; + return getFieldBytesFromSTData(instParam, stTypeId); +} + +Expected +ContractHostFunctionsImpl::functionParam(std::uint32_t index, std::uint32_t stTypeId) +{ + auto j = getJournal(); + auto const& funcParams = contractCtx.functionParameters; + + if (funcParams.size() <= index) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "functionParam: Index out of bounds"; + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + } + + xrpl::STData const& funcParam = funcParams[index].value; + return getFieldBytesFromSTData(funcParam, stTypeId); +} + +inline std::optional const>> +getDataCache(ContractContext& contractCtx, xrpl::AccountID const& account) +{ + auto& dataMap = contractCtx.result.dataMap; + if (dataMap.find(account) == dataMap.end()) + return std::nullopt; + + auto const& ret = dataMap[account]; + return std::cref(ret); +} + +inline std::pair +getDataOrCache(ContractContext& contractCtx, AccountID const& account) +{ + auto cacheEntryLookup = getDataCache(contractCtx, account); + if (!cacheEntryLookup) + { + AccountID const& contractAccount = contractCtx.result.contractAccount; + auto const dataKeylet = keylet::contractData(account, contractAccount); + auto& view = contractCtx.applyCtx.view(); + auto const dataSle = view.read(dataKeylet); + if (dataSle) + { + // Return the STJson from the SLE + STJson data = dataSle->getFieldJson(sfContractJson); + return {data.isObject(), data}; + } + + // Return New STJson if not found + STJson data; + return {true, data}; + } + + // Return the cached STJson + auto const& cacheEntry = cacheEntryLookup->get(); + return {cacheEntry.second.isObject(), cacheEntry.second}; +} + +inline HostFunctionError +setDataCache( + ContractContext& contractCtx, + AccountID const& account, + STJson const& data, + beast::Journal const& j, + bool modified = true) +{ + auto& dataMap = contractCtx.result.dataMap; + auto& view = contractCtx.applyCtx.view(); + auto const contractId = contractCtx.result.contractKeylet.key; + + auto const sleAccount = view.read(keylet::account(account)); + if (!sleAccount) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " << "setDataCache: Account not found"; + return HostFunctionError::INVALID_ACCOUNT; + } + + uint32_t maxDataModifications = 1000u; + + if (modified && dataMap.modifiedCount >= maxDataModifications) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataCache: Exceeded max data modifications"; + return HostFunctionError::INTERNAL; + } + + if (dataMap.find(account) == dataMap.end()) + { + auto const& fees = contractCtx.applyCtx.view().fees(); + STAmount bal = sleAccount->getFieldAmount(sfBalance); + + int64_t availableForReserves = + bal.xrp().drops() - fees.accountReserve(sleAccount->getFieldU32(sfOwnerCount)).drops(); + int64_t increment = fees.increment.drops(); + if (increment <= 0) + increment = 1; + + availableForReserves /= increment; + + if (availableForReserves < 1 && modified) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "setDataCache: Insufficient reserve"; + return HostFunctionError::INTERNAL; + } + + dataMap.modifiedCount++; + dataMap[account] = {modified, data}; + + // for (auto const& [acct, entry] : dataMap) + // { + // JLOG(j.trace()) + // << "Account: " << to_string(acct) + // << ", Modified: " << entry.first << ", Data: " + // << entry.second.getJson(JsonOptions::none).toStyledString(); + // } + + return HostFunctionError::SUCCESS; + } + + // auto& availableForReserves = std::get<0>(dataMap[account]); + // bool const canReserveNew = availableForReserves > 0; + if (modified) + { + // if (!canReserveNew) + // return HostFunctionError::INSUFFICIENT_RESERVE; + + // availableForReserves--; + dataMap.modifiedCount++; + } + + dataMap[account] = {modified, data}; + // for (auto const& [acct, entry] : dataMap) + // { + // JLOG(j.trace()) + // << "Account: " << to_string(acct) << ", Modified: " << + // entry.first + // << ", Data: " + // << entry.second.getJson(JsonOptions::none).toStyledString(); + // } + return HostFunctionError::SUCCESS; +} + +Expected +ContractHostFunctionsImpl::getDataObjectField(AccountID const& account, std::string_view const& key) +{ + auto j = getJournal(); + auto& view = contractCtx.applyCtx.view(); + AccountID const& contractAccount = contractCtx.result.contractAccount; + try + { + auto const sleAccount = view.read(keylet::account(account)); + if (!sleAccount) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataObjectField: Account not found"; + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + } + + // first check if the requested state was previously cached this session + auto cacheEntryLookup = getDataCache(contractCtx, account); + if (cacheEntryLookup) + { + auto const& cacheEntry = cacheEntryLookup->get(); + STJson const data = cacheEntry.second; + auto const keyValue = data.getObjectField(std::string(key)); + if (!keyValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataObjectField: Invalid field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + keyValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + + auto const dataKeylet = keylet::contractData(account, contractAccount); + auto const dataSle = view.read(dataKeylet); + if (!dataSle) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataObjectField: Data SLE not found"; + return Unexpected(HostFunctionError::INTERNAL); + } + + STJson const data = dataSle->getFieldJson(sfContractJson); + // it exists add it to cache and return it + if (setDataCache(contractCtx, account, data, j, false) != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataObjectField: Failed to set data cache"; + return Unexpected(HostFunctionError::INTERNAL); + } + + auto const keyValue = data.getObjectField(std::string(key)); + if (!keyValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataObjectField: Invalid field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + keyValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataObjectField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::getDataNestedObjectField( + AccountID const& account, + std::string_view const& key, + std::string_view const& nestedKey) +{ + auto j = getJournal(); + auto& view = contractCtx.applyCtx.view(); + AccountID const& contractAccount = contractCtx.result.contractAccount; + try + { + auto const sleAccount = view.read(keylet::account(account)); + if (!sleAccount) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedObjectField: Account not found"; + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + } + + // first check if the requested state was previously cached this session + auto cacheEntryLookup = getDataCache(contractCtx, account); + if (cacheEntryLookup) + { + auto const& cacheEntry = cacheEntryLookup->get(); + STJson const data = cacheEntry.second; + auto const keyValue = + data.getNestedObjectField(std::string(key), std::string(nestedKey)); + if (!keyValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataNestedObjectField: Invalid field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + keyValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + + auto const dataKeylet = keylet::contractData(account, contractAccount); + auto const dataSle = view.read(dataKeylet); + if (!dataSle) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedObjectField: Data SLE not found"; + return Unexpected(HostFunctionError::INTERNAL); + } + + STJson const data = dataSle->getFieldJson(sfContractJson); + // it exists add it to cache and return it + if (setDataCache(contractCtx, account, data, j, false) != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedObjectField: Failed to set data cache"; + return Unexpected(HostFunctionError::INTERNAL); + } + + auto const keyValue = data.getNestedObjectField(std::string(key), std::string(nestedKey)); + if (!keyValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: " << "getDataNestedObjectField: Invalid field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + keyValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedObjectField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::setDataObjectField( + AccountID const& account, + std::string_view const& key, + STJson::Value const& value) +{ + auto j = getJournal(); + try + { + auto [isObject, data] = getDataOrCache(contractCtx, account); + if (!isObject) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataObjectField: Invalid state: not an object"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + data.setObjectField(std::string(key), value); + if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + ret != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataObjectField: Failed to set object field"; + return Unexpected(ret); + } + + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataObjectField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::setDataNestedObjectField( + AccountID const& account, + std::string_view const& key, + std::string_view const& nestedKey, + STJson::Value const& value) +{ + auto j = getJournal(); + try + { + auto [isObject, data] = getDataOrCache(contractCtx, account); + if (!isObject) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedObjectField: Invalid state: not an object"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + data.setNestedObjectField(std::string(key), std::string(nestedKey), value); + if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + ret != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedObjectField: Failed to set nested " + "object field"; + return Unexpected(ret); + } + + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedObjectField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::getDataArrayElementField( + AccountID const& account, + size_t index, + std::string_view const& key) +{ + auto j = getJournal(); + auto& view = contractCtx.applyCtx.view(); + AccountID const& contractAccount = contractCtx.result.contractAccount; + try + { + auto const sleAccount = view.read(keylet::account(account)); + if (!sleAccount) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Account not found"; + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + } + + // first check if the requested state was previously cached this session + auto cacheEntryLookup = getDataCache(contractCtx, account); + if (cacheEntryLookup) + { + auto const& cacheEntry = cacheEntryLookup->get(); + STJson const data = cacheEntry.second; + + if (!data.isArray()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Invalid state: not an array"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + auto const fieldValue = data.getArrayElementField(index, std::string(key)); + if (!fieldValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Failed to get array " + "element field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + fieldValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + + auto const dataKeylet = keylet::contractData(account, contractAccount); + auto const dataSle = view.read(dataKeylet); + if (!dataSle) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Failed to read contract data"; + return Unexpected(HostFunctionError::INTERNAL); + } + + STJson const data = dataSle->getFieldJson(sfContractJson); + + if (!data.isArray()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Invalid state: not an array"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + // it exists add it to cache and return it + if (setDataCache(contractCtx, account, data, j, false) != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataArrayElementField: Failed to set array " + "element field"; + return Unexpected(HostFunctionError::INTERNAL); + } + + auto const fieldValue = data.getArrayElementField(index, std::string(key)); + if (!fieldValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Failed to get array " + "element field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + fieldValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataArrayElementField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::getDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey) +{ + auto j = getJournal(); + auto& view = contractCtx.applyCtx.view(); + AccountID const& contractAccount = contractCtx.result.contractAccount; + try + { + auto const sleAccount = view.read(keylet::account(account)); + if (!sleAccount) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Account not found"; + return Unexpected(HostFunctionError::INVALID_ACCOUNT); + } + + // if (account != contractCtx.result.otxnAccount) + // { + // JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + // << "getDataNestedArrayElementField: Unauthorized + // access to account data"; + // return Unexpected(HostFunctionError::INVALID_ACCOUNT); + // } + + // first check if the requested state was previously cached this session + auto cacheEntryLookup = getDataCache(contractCtx, account); + if (cacheEntryLookup) + { + auto const& cacheEntry = cacheEntryLookup->get(); + STJson const data = cacheEntry.second; + + if (!data.isObject()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Invalid state: " + "not an object"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + auto const fieldValue = + data.getNestedArrayElementField(std::string(key), index, std::string(nestedKey)); + if (!fieldValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Failed to get " + "nested array element field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + fieldValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + + auto const dataKeylet = keylet::contractData(account, contractAccount); + auto const dataSle = view.read(dataKeylet); + if (!dataSle) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Failed to read " + "contract data"; + return Unexpected(HostFunctionError::INTERNAL); + } + + STJson const data = dataSle->getFieldJson(sfContractJson); + + if (!data.isObject()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Invalid state: " + "not an object"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + // it exists add it to cache and return it + if (setDataCache(contractCtx, account, data, j, false) != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedArrayElementField: Failed to set " + "nested array element field"; + return Unexpected(HostFunctionError::INTERNAL); + } + + auto const fieldValue = + data.getNestedArrayElementField(std::string(key), index, std::string(nestedKey)); + if (!fieldValue) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Failed to get " + "nested array element field"; + return Unexpected(HostFunctionError::INVALID_FIELD); + } + + Serializer s; + fieldValue.value()->add(s); + return Bytes{s.peekData().data(), s.peekData().data() + s.peekData().size()}; + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "getDataNestedArrayElementField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::setDataArrayElementField( + AccountID const& account, + size_t index, + std::string_view const& key, + STJson::Value const& value) +{ + auto j = getJournal(); + auto [isObject, data] = getDataOrCache(contractCtx, account); + + try + { + // For array operations, we expect isObject to be false (indicating it's + // an array) But getDataOrCache returns isObject=true for new data, so + // we need to check the actual type + if (isObject && data.getMap().size() > 0) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataArrayElementField: Invalid state: not an array"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + // If it's a new empty object, convert it to an array + if (isObject && data.getMap().empty()) + { + data = STJson(STJson::Array{}); + } + + if (!data.isArray()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataArrayElementField: Invalid state: not an array"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + data.setArrayElementField(index, std::string(key), value); + if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + ret != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataArrayElementField: Failed to set array " + "element field"; + return Unexpected(ret); + } + + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataArrayElementField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::setDataNestedArrayElementField( + AccountID const& account, + std::string_view const& key, + size_t index, + std::string_view const& nestedKey, + STJson::Value const& value) +{ + auto j = getJournal(); + try + { + auto [isObject, data] = getDataOrCache(contractCtx, account); + if (!isObject) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedArrayElementField: Invalid state: " + "not an object"; + return Unexpected(HostFunctionError::INVALID_STATE); + } + + data.setNestedArrayElementField(std::string(key), index, std::string(nestedKey), value); + if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + ret != HostFunctionError::SUCCESS) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedArrayElementField: Failed to set " + "nested array element field"; + return Unexpected(ret); + } + + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "setDataNestedArrayElementField: Exception: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::buildTxn(std::uint16_t const& txType) +{ + auto j = getJournal(); + auto& app = contractCtx.applyCtx.registry; + + if (!Emitable::getInstance().isEmitable(txType)) + { + JLOG(j.trace()) << "Transaction type: " << txType << " is not emitable."; + return Unexpected(HostFunctionError::SUBMIT_TXN_FAILURE); + } + + try + { + auto jv = Json::Value(Json::objectValue); + auto item = TxFormats::getInstance().findByType(safe_cast(txType)); + jv[sfTransactionType] = item->getName(); + jv[sfFee] = "0"; + jv[sfFlags] = 1073741824; + jv[sfSequence] = contractCtx.result.nextSequence; + jv[sfAccount] = to_string(contractCtx.result.contractAccount); + jv[sfSigningPubKey] = ""; + if (auto const networkID = app.get().getNetworkIDService().getNetworkID(); networkID != 0) + jv[sfNetworkID] = networkID; + + STParsedJSONObject parsed("txn", jv); + contractCtx.built_txns.push_back(*parsed.object); + contractCtx.result.nextSequence += 1; + return contractCtx.built_txns.size() - 1; + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: Exception in buildTxn: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::addTxnField( + std::uint32_t const& index, + SField const& field, + Slice const& data) +{ + auto j = getJournal(); + try + { + if (index >= contractCtx.built_txns.size()) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "addTxnField: index out of bounds: " << index; + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + } + + // Get the transaction STObject + auto& obj = contractCtx.built_txns[index]; + + // Ensure the transaction has a TransactionType field + if (!obj.isFieldPresent(sfTransactionType)) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "addTxnField: TransactionType field not present " + "in transaction."; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + // Extract the numeric tx type from the STObject and convert to TxType + auto txTypeVal = obj.getFieldU16(sfTransactionType); + auto txFormat = TxFormats::getInstance().findByType(safe_cast(txTypeVal)); + if (!txFormat) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " + << "addTxnField: Invalid TransactionType: " << txTypeVal; + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + // Check if the provided field is allowed for this transaction type + bool found = false; + for (auto const& e : txFormat->getSOTemplate()) + { + if (e.sField().getName() == field.getName()) + { + found = true; + break; + } + } + if (!found) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " << "addTxnField: Field " + << field.getName() << " not allowed in transaction type " + << txFormat->getName(); + return Unexpected(HostFunctionError::FIELD_NOT_FOUND); + } + + obj.addFieldFromSlice(field, data); + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " << "addTxnField: TXN: " + << obj.getJson(JsonOptions::none).toStyledString(); + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId + << "]: Exception in addTxnField: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::emitBuiltTxn(std::uint32_t const& index) +{ + auto j = getJournal(); + auto& app = contractCtx.applyCtx.registry; + auto& parentTx = contractCtx.applyCtx.tx; + auto const parentBatchId = parentTx.getTransactionID(); + try + { + if (index >= contractCtx.built_txns.size()) + { + JLOG(j.trace()) << "WasmTrace[" << parentBatchId + << "]: " << "emitBuiltTxn: index out of bounds: " << index; + return Unexpected(HostFunctionError::INDEX_OUT_OF_BOUNDS); + } + + // Ensure tfInnerBatchTxn is always set, even if the contract + // overwrote sfFlags via addTxnField. + contractCtx.built_txns[index].setFlag(tfInnerBatchTxn); + auto stxPtr = std::make_shared(std::move(contractCtx.built_txns[index])); + + std::string reason; + auto tpTrans = std::make_shared(stxPtr, reason, app.get().getApp()); + if (tpTrans->getStatus() != NEW) + { + JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " + << "emitBuiltTxn: Failed to decode transaction: " << reason; + return Unexpected(HostFunctionError::SUBMIT_TXN_FAILURE); + } + + OpenView wholeBatchView(batch_view, contractCtx.applyCtx.openView()); + auto applyOneTransaction = + [&app, &j, &parentBatchId, &wholeBatchView](std::shared_ptr const& tx) { + auto const pfResult = + preflight(app, wholeBatchView.rules(), parentBatchId, *tx, tapBATCH, j); + auto const ret = preclaim(pfResult, app, wholeBatchView); + JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << tx->getTransactionID() + << " " << transToken(ret.ter); + return ret; + }; + + auto const stx = tpTrans->getSTransaction(); + auto const result = applyOneTransaction(stx); + if (isTesSuccess(result.ter)) + contractCtx.result.emittedTxns.push(stx); + return TERtoInt(result.ter); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << parentBatchId + << "]: Exception in emitBuiltTxn: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::emitTxn(std::shared_ptr const& stxPtr) +{ + auto& app = contractCtx.applyCtx.registry; + auto& parentTx = contractCtx.applyCtx.tx; + auto j = getJournal(); + + try + { + // Ensure tfInnerBatchTxn is always set on emitted transactions. + // Since STTx is const, create a mutable copy if the flag is missing. + std::shared_ptr txPtr = stxPtr; + if (!stxPtr->isFlag(tfInnerBatchTxn)) + { + STObject obj(static_cast(*stxPtr)); + obj.setFlag(tfInnerBatchTxn); + txPtr = std::make_shared(std::move(obj)); + } + + std::string reason; + auto tpTrans = std::make_shared(txPtr, reason, app.get().getApp()); + if (tpTrans->getStatus() != NEW) + return Unexpected(HostFunctionError::SUBMIT_TXN_FAILURE); + + OpenView wholeBatchView(batch_view, contractCtx.applyCtx.openView()); + auto const parentBatchId = parentTx.getTransactionID(); + auto applyOneTransaction = + [&app, &j, &parentBatchId, &wholeBatchView](std::shared_ptr const& tx) { + auto const pfResult = + preflight(app, wholeBatchView.rules(), parentBatchId, *tx, tapBATCH, j); + auto const ret = preclaim(pfResult, app, wholeBatchView); + JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << tx->getTransactionID() + << " " << transToken(ret.ter); + return ret; + }; + + auto const stx = tpTrans->getSTransaction(); + auto const result = applyOneTransaction(stx); + if (isTesSuccess(result.ter)) + contractCtx.result.emittedTxns.push(stx); + return TERtoInt(result.ter); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << parentTx.getTransactionID() + << "]: Exception in emitTxn: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +Expected +ContractHostFunctionsImpl::emitEvent(std::string_view const& eventName, STJson const& eventData) +{ + auto j = getJournal(); + + try + { + // TODO: Validation + auto& eventMap = contractCtx.result.eventMap; + eventMap[std::string(eventName)] = eventData; + return static_cast(HostFunctionError::SUCCESS); + } + catch (std::exception const& e) + { + JLOG(j.trace()) << "WasmTrace[" << contractId << "]: Exception in emitEvent: " << e.what(); + return Unexpected(HostFunctionError::INTERNAL); + } +} + +} // namespace xrpl diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 89f4dc7743f..1b3a5fff03d 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -72,7 +72,14 @@ struct FeeSetup Fees toFees() const { - return Fees{reference_fee, account_reserve, owner_reserve}; + Fees f; + f.base = reference_fee; + f.reserve = account_reserve; + f.increment = owner_reserve; + f.extensionComputeLimit = extension_compute_limit; + f.extensionSizeLimit = extension_size_limit; + f.gasPrice = gas_price; + return f; } }; diff --git a/src/xrpld/rpc/detail/Handler.cpp b/src/xrpld/rpc/detail/Handler.cpp index 05fc1cb0b46..983d9d7327d 100644 --- a/src/xrpld/rpc/detail/Handler.cpp +++ b/src/xrpld/rpc/detail/Handler.cpp @@ -85,6 +85,7 @@ Handler const handlerArray[]{ {"channel_verify", byRef(&doChannelVerify), Role::USER, NO_CONDITION}, {"connect", byRef(&doConnect), Role::ADMIN, NO_CONDITION}, {"consensus_info", byRef(&doConsensusInfo), Role::ADMIN, NO_CONDITION}, + {"contract_info", byRef(&doContractInfo), Role::USER, NO_CONDITION}, {"deposit_authorized", byRef(&doDepositAuthorized), Role::USER, NO_CONDITION}, {"feature", byRef(&doFeature), Role::USER, NO_CONDITION}, {"fee", byRef(&doFee), Role::USER, NEEDS_CURRENT_LEDGER}, diff --git a/src/xrpld/rpc/detail/RPCHelpers.cpp b/src/xrpld/rpc/detail/RPCHelpers.cpp index b4a0685bd62..9e3b444dcd6 100644 --- a/src/xrpld/rpc/detail/RPCHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCHelpers.cpp @@ -5,12 +5,12 @@ #include #include +#include #include #include #include #include #include -#include #include #include diff --git a/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp b/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp index 955533c7764..0e78b2d7261 100644 --- a/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp +++ b/src/xrpld/rpc/detail/RPCLedgerHelpers.cpp @@ -475,5 +475,41 @@ getOrAcquireLedger(RPC::JsonContext const& context) RPC::make_error(rpcNOT_READY, "findCreate failed to return an inbound ledger")); } +/** + * @brief Injects JSON describing a ledger entry. + * + * @param jv The JSON value to populate. + * @param sle The ledger entry to describe. + * + * @details + * Populates the provided JSON value with the description of the specified + * ledger entry. If the entry is an account root and contains an email hash, + * adds a 'urlgravatar' field with the corresponding Gravatar URL. + * If the entry is not an account root, sets the 'Invalid' field to true. + */ +void +injectSLE(Json::Value& jv, SLE const& sle) +{ + jv = sle.getJson(JsonOptions::none); + if (sle.getType() == ltACCOUNT_ROOT) + { + if (sle.isFieldPresent(sfEmailHash)) + { + auto const& hash = sle.getFieldH128(sfEmailHash); + Blob const b(hash.begin(), hash.end()); + std::string md5 = strHex(makeSlice(b)); + boost::to_lower(md5); + // VFALCO TODO Give a name and move this constant + // to a more visible location. Also + // shouldn't this be https? + jv[jss::urlgravatar] = str(boost::format("http://www.gravatar.com/avatar/%s") % md5); + } + } + else + { + jv[jss::Invalid] = true; + } +} + } // namespace RPC } // namespace xrpl diff --git a/src/xrpld/rpc/detail/RPCLedgerHelpers.h b/src/xrpld/rpc/detail/RPCLedgerHelpers.h index 6a04ab41d6b..ec4ac2cdfaf 100644 --- a/src/xrpld/rpc/detail/RPCLedgerHelpers.h +++ b/src/xrpld/rpc/detail/RPCLedgerHelpers.h @@ -170,6 +170,9 @@ ledgerFromSpecifier( Expected, Json::Value> getOrAcquireLedger(RPC::JsonContext const& context); +void +injectSLE(Json::Value& jv, SLE const& sle); + } // namespace RPC } // namespace xrpl diff --git a/src/xrpld/rpc/handlers/ContractInfo.cpp b/src/xrpld/rpc/handlers/ContractInfo.cpp new file mode 100644 index 00000000000..b07fa60d997 --- /dev/null +++ b/src/xrpld/rpc/handlers/ContractInfo.cpp @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace xrpl { + +// { +// contract_account: , +// function : // optional +// user_account : +// ledger_index : +// } + +Json::Value +doContractInfo(RPC::JsonContext& context) +{ + auto& params = context.params; + + std::string contractAccount; + if (params.isMember(jss::contract_account)) + { + if (!params[jss::contract_account].isString()) + return RPC::invalid_field_error(jss::contract_account); + contractAccount = params[jss::contract_account].asString(); + } + else + return RPC::missing_field_error(jss::contract_account); + + std::string functionName; + if (params.isMember(jss::function)) + { + if (!params[jss::function].isString()) + return RPC::invalid_field_error(jss::function); + functionName = params[jss::function].asString(); + } + + std::string account; + if (params.isMember(jss::account)) + { + if (!params[jss::account].isString()) + return RPC::invalid_field_error(jss::account); + account = params[jss::account].asString(); + } + + std::shared_ptr ledger; + auto result = RPC::lookupLedger(ledger, context); + + if (!ledger) + return result; + + // contract account + auto caid = parseBase58(contractAccount); + if (!caid) + { + RPC::inject_error(rpcACT_MALFORMED, result); + return result; + } + auto const caID{std::move(caid.value())}; + auto const caSle = ledger->read(keylet::account(caID)); + if (!caSle) + { + result[jss::contract_account] = toBase58(caID); + RPC::inject_error(rpcACT_NOT_FOUND, result); + } + + uint256 const contractID = caSle->getFieldH256(sfContractID); + auto const contractSle = ledger->read(keylet::contract(contractID)); + if (!contractSle) + { + result[jss::contract_account] = toBase58(caID); + RPC::inject_error(rpcOBJECT_NOT_FOUND, result); + } + + // contract source + if (!contractSle->at(sfContractHash)) + { + result[jss::contract_account] = toBase58(caID); + RPC::inject_error(rpcUNKNOWN, result); + } + + auto const sourceSle = ledger->read(keylet::contractSource(contractSle->at(sfContractHash))); + if (!sourceSle) + { + result[jss::contract_account] = toBase58(caID); + RPC::inject_error(rpcOBJECT_NOT_FOUND, result); + } + + result[jss::contract_account] = toBase58(caID); + result[jss::code] = strHex(sourceSle->at(sfContractCode)); + result[jss::hash] = to_string(sourceSle->at(sfContractHash)); + + // lambda to format the functions response: + // name: + // params: [: , : , : ] + auto formatFunctions = [](Json::Value& jv, std::shared_ptr const& slePtr) { + if (slePtr && slePtr->isFieldPresent(sfFunctions)) + { + auto const& functions = slePtr->getFieldArray(sfFunctions); + for (auto const& function : functions) + { + Json::Value jvFunction(Json::objectValue); + jvFunction[jss::name] = strHex(function.getFieldVL(sfFunctionName)); + Json::Value jvParams(Json::arrayValue); + for (auto const& param : function.getFieldArray(sfParameters)) + { + Json::Value jvParam(Json::objectValue); + jvParam[jss::flags] = param.getFieldU32(sfParameterFlag); + jvParam[jss::type] = + param.getFieldDataType(sfParameterType).getInnerTypeString(); + jvParams.append(jvParam); + } + jvFunction[jss::params] = std::move(jvParams); + jv.append(std::move(jvFunction)); + } + } + }; + if (sourceSle->isFieldPresent(sfFunctions)) + formatFunctions(result[jss::functions], sourceSle); + if (contractSle->isFieldPresent(sfURI)) + result[jss::source_code_uri] = strHex(contractSle->at(sfURI)); + + Json::Value jvAccepted(Json::objectValue); + RPC::injectSLE(jvAccepted, *caSle); + result[jss::account_data] = jvAccepted; + + auto const dataSle = ledger->read(keylet::contractData(caID, caID)); + if (dataSle) + result[jss::contract_data] = + dataSle->getFieldJson(sfContractJson).getJson(JsonOptions::none); + + if (!account.empty()) + { + auto id = parseBase58(account); + if (!id) + { + RPC::inject_error(rpcACT_MALFORMED, result); + return result; + } + auto const accountID = id.value(); + if (ledger->exists(keylet::account(accountID))) + { + if (auto dataSle = ledger->read(keylet::contractData(accountID, caID))) + result[jss::user_data] = + dataSle->getFieldJson(sfContractJson).getJson(JsonOptions::none); + } + } + + return result; +} + +} // namespace xrpl diff --git a/src/xrpld/rpc/handlers/Handlers.h b/src/xrpld/rpc/handlers/Handlers.h index 23328cf52ad..a28e95239c7 100644 --- a/src/xrpld/rpc/handlers/Handlers.h +++ b/src/xrpld/rpc/handlers/Handlers.h @@ -39,6 +39,8 @@ doConnect(RPC::JsonContext&); Json::Value doConsensusInfo(RPC::JsonContext&); Json::Value +doContractInfo(RPC::JsonContext&); +Json::Value doDepositAuthorized(RPC::JsonContext&); Json::Value doFeature(RPC::JsonContext&); diff --git a/src/xrpld/rpc/handlers/account/AccountInfo.cpp b/src/xrpld/rpc/handlers/account/AccountInfo.cpp index becaea8a512..72b3e8874e8 100644 --- a/src/xrpld/rpc/handlers/account/AccountInfo.cpp +++ b/src/xrpld/rpc/handlers/account/AccountInfo.cpp @@ -16,42 +16,6 @@ namespace xrpl { -/** - * @brief Injects JSON describing a ledger entry. - * - * @param jv The JSON value to populate. - * @param sle The ledger entry to describe. - * - * @details - * Populates the provided JSON value with the description of the specified - * ledger entry. If the entry is an account root and contains an email hash, - * adds a 'urlgravatar' field with the corresponding Gravatar URL. - * If the entry is not an account root, sets the 'Invalid' field to true. - */ -void -injectSLE(Json::Value& jv, SLE const& sle) -{ - jv = sle.getJson(JsonOptions::none); - if (sle.getType() == ltACCOUNT_ROOT) - { - if (sle.isFieldPresent(sfEmailHash)) - { - auto const& hash = sle.getFieldH128(sfEmailHash); - Blob const b(hash.begin(), hash.end()); - std::string md5 = strHex(makeSlice(b)); - boost::to_lower(md5); - // VFALCO TODO Give a name and move this constant - // to a more visible location. Also - // shouldn't this be https? - jv[jss::urlgravatar] = str(boost::format("http://www.gravatar.com/avatar/%s") % md5); - } - } - else - { - jv[jss::Invalid] = true; - } -} - // { // account: , // ledger_hash : @@ -142,7 +106,7 @@ doAccountInfo(RPC::JsonContext& context) } Json::Value jvAccepted(Json::objectValue); - injectSLE(jvAccepted, *sleAccepted); + RPC::injectSLE(jvAccepted, *sleAccepted); result[jss::account_data] = jvAccepted; Json::Value acctFlags{Json::objectValue}; diff --git a/src/xrpld/rpc/handlers/account/AccountNFTs.cpp b/src/xrpld/rpc/handlers/account/AccountNFTs.cpp index b879968e4e7..424a3143d94 100644 --- a/src/xrpld/rpc/handlers/account/AccountNFTs.cpp +++ b/src/xrpld/rpc/handlers/account/AccountNFTs.cpp @@ -4,13 +4,13 @@ #include #include +#include #include #include #include #include #include #include -#include namespace xrpl { diff --git a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp index 377983718ea..e9b77c0c313 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp @@ -802,6 +802,72 @@ parseXChainOwnedCreateAccountClaimID( return keylet.key; } +static Expected +parseContractSource( + Json::Value const& params, + Json::StaticString const fieldName, + [[maybe_unused]] unsigned const apiVersion) +{ + if (!params.isObject()) + { + return parseObjectID(params, fieldName); + } + + auto const id = LedgerEntryHelpers::requiredAccountID(params, jss::owner, "malformedOwner"); + if (!id) + return Unexpected(id.error()); + + auto const seq = LedgerEntryHelpers::requiredUInt32(params, jss::seq, "malformedRequest"); + if (!seq) + return Unexpected(seq.error()); + + return keylet::vault(*id, *seq).key; +} + +static Expected +parseContract( + Json::Value const& params, + Json::StaticString const fieldName, + [[maybe_unused]] unsigned const apiVersion) +{ + if (!params.isObject()) + { + return parseObjectID(params, fieldName); + } + + auto const id = LedgerEntryHelpers::requiredAccountID(params, jss::owner, "malformedOwner"); + if (!id) + return Unexpected(id.error()); + + auto const seq = LedgerEntryHelpers::requiredUInt32(params, jss::seq, "malformedRequest"); + if (!seq) + return Unexpected(seq.error()); + + return keylet::vault(*id, *seq).key; +} + +static Expected +parseContractData( + Json::Value const& params, + Json::StaticString const fieldName, + [[maybe_unused]] unsigned const apiVersion) +{ + if (!params.isObject()) + { + return parseObjectID(params, fieldName); + } + + auto const id = LedgerEntryHelpers::requiredAccountID(params, jss::owner, "malformedOwner"); + if (!id) + return Unexpected(id.error()); + + auto const seq = LedgerEntryHelpers::requiredUInt32(params, jss::seq, "malformedRequest"); + if (!seq) + return Unexpected(seq.error()); + + return keylet::vault(*id, *seq).key; +} + struct LedgerEntry { Json::StaticString fieldName; @@ -817,7 +883,7 @@ struct LedgerEntry Json::Value doLedgerEntry(RPC::JsonContext& context) { - static auto ledgerEntryParsers = std::to_array({ + static LedgerEntry ledgerEntryParsers[] = { #pragma push_macro("LEDGER_ENTRY") #undef LEDGER_ENTRY @@ -831,7 +897,7 @@ doLedgerEntry(RPC::JsonContext& context) // aliases {jss::account_root, parseAccountRoot, ltACCOUNT_ROOT}, {jss::ripple_state, parseRippleState, ltRIPPLE_STATE}, - }); + }; auto const hasMoreThanOneMember = [&]() { int count = 0; diff --git a/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp b/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp index f99f427ca84..7d34a6ddd30 100644 --- a/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp +++ b/src/xrpld/rpc/handlers/server_info/ServerDefinitions.cpp @@ -79,6 +79,7 @@ ServerDefinitions::translate(std::string const& inp) {"PATHSET", "PathSet"}, {"VL", "Blob"}, {"XCHAIN_BRIDGE", "XChainBridge"}, + {"DATATYPE", "DataType"}, }; if (auto const& it = replacements.find(inp); it != replacements.end()) diff --git a/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp b/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp index af3e998a584..d96fb461bd3 100644 --- a/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp +++ b/src/xrpld/rpc/handlers/subscribe/Subscribe.cpp @@ -147,6 +147,10 @@ doSubscribe(RPC::JsonContext& context) { context.netOps.subConsensus(ispSub); } + else if (streamName == "contract_events") + { + context.netOps.subContractEvent(ispSub); + } else { return rpcError(rpcSTREAM_MALFORMED); diff --git a/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp b/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp index d3e36cc6123..3745b3aa371 100644 --- a/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp +++ b/src/xrpld/rpc/handlers/subscribe/Unsubscribe.cpp @@ -84,6 +84,10 @@ doUnsubscribe(RPC::JsonContext& context) { context.netOps.unsubConsensus(ispSub->getSeq()); } + else if (streamName == "contract_events") + { + context.netOps.unsubContractEvent(ispSub->getSeq()); + } else { return rpcError(rpcSTREAM_MALFORMED); From 5351d4f089653172d2ce87796d533aa739bbf046 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Sat, 11 Apr 2026 18:21:56 -0400 Subject: [PATCH 210/212] Fix STJson and multiple emitted transactions (#6724) --- .../scripts/levelization/results/ordering.txt | 2 + include/xrpl/ledger/helpers/ContractUtils.h | 2 +- include/xrpl/protocol/STData.h | 4 +- include/xrpl/tx/paths/detail/StrandFlow.h | 2 +- include/xrpl/tx/wasm/ContractContext.h | 21 +- src/libxrpl/ledger/View.cpp | 4 +- src/libxrpl/ledger/helpers/ContractUtils.cpp | 47 ++-- src/libxrpl/ledger/helpers/NFTokenUtils.cpp | 2 +- src/libxrpl/protocol/Emitable.cpp | 2 +- src/libxrpl/protocol/STData.cpp | 14 +- src/libxrpl/protocol/STDataType.cpp | 6 +- src/libxrpl/protocol/STJson.cpp | 33 +-- src/libxrpl/protocol/STObject.cpp | 3 + .../tx/transactors/contract/ContractCall.cpp | 15 +- .../transactors/contract/ContractDelete.cpp | 2 +- .../transactors/contract/ContractModify.cpp | 2 +- src/libxrpl/tx/wasm/HostFuncWrapper.cpp | 8 - src/test/app/ContractHostFuncImpl_test.cpp | 219 +++++++++--------- src/test/app/Contract_test.cpp | 30 +-- src/test/app/Delegate_test.cpp | 10 +- src/test/protocol/STDataType_test.cpp | 116 +++++----- src/test/protocol/STData_test.cpp | 214 ++++++++--------- src/test/protocol/STJson_test.cpp | 32 +-- src/test/rpc/Subscribe_test.cpp | 6 + src/xrpld/app/misc/NetworkOPs.cpp | 6 +- .../app/wasm/detail/ContractHostFuncImpl.cpp | 96 ++++---- src/xrpld/core/Config.h | 12 +- src/xrpld/rpc/handlers/ContractInfo.cpp | 2 +- src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp | 2 +- 29 files changed, 470 insertions(+), 444 deletions(-) diff --git a/.github/scripts/levelization/results/ordering.txt b/.github/scripts/levelization/results/ordering.txt index 38e77dedf87..2d0cbbf2446 100644 --- a/.github/scripts/levelization/results/ordering.txt +++ b/.github/scripts/levelization/results/ordering.txt @@ -10,6 +10,7 @@ libxrpl.ledger > xrpl.basics libxrpl.ledger > xrpl.json libxrpl.ledger > xrpl.ledger libxrpl.ledger > xrpl.protocol +libxrpl.ledger > xrpl.server libxrpl.net > xrpl.basics libxrpl.net > xrpl.net libxrpl.nodestore > xrpl.basics @@ -188,6 +189,7 @@ xrpl.core > xrpl.json xrpl.core > xrpl.protocol xrpl.json > xrpl.basics xrpl.ledger > xrpl.basics +xrpl.ledger > xrpl.core xrpl.ledger > xrpl.protocol xrpl.ledger > xrpl.server xrpl.ledger > xrpl.shamap diff --git a/include/xrpl/ledger/helpers/ContractUtils.h b/include/xrpl/ledger/helpers/ContractUtils.h index 3e478ad43dc..831276b623a 100644 --- a/include/xrpl/ledger/helpers/ContractUtils.h +++ b/include/xrpl/ledger/helpers/ContractUtils.h @@ -48,7 +48,7 @@ int64_t constexpr feeCalculationFailed = 0x7FFFFFFFFFFFFFFFLL; std::size_t constexpr maxContractParams = 8; /** The maximum number of contract functions that can be in a transaction. */ -std::size_t constexpr maxContractFunctions = 8; +std::size_t constexpr maxContractFunctions = 32; int64_t contractCreateFee(uint64_t byteCount); diff --git a/include/xrpl/protocol/STData.h b/include/xrpl/protocol/STData.h index 78e3a6657fe..d347ac86da7 100644 --- a/include/xrpl/protocol/STData.h +++ b/include/xrpl/protocol/STData.h @@ -193,7 +193,7 @@ STData::getFieldByValue() const // if (!rf) // throwFieldNotFound(getFName()); - SerializedTypeID id = rf->getSType(); + SerializedTypeID const id = rf->getSType(); if (id == STI_NOTPRESENT) Throw("Field not present"); @@ -220,7 +220,7 @@ STData::getFieldByConstRef(V const& empty) const // if (!rf) // throwFieldNotFound(field); - SerializedTypeID id = rf->getSType(); + SerializedTypeID const id = rf->getSType(); if (id == STI_NOTPRESENT) return empty; // optional field not present diff --git a/include/xrpl/tx/paths/detail/StrandFlow.h b/include/xrpl/tx/paths/detail/StrandFlow.h index fba631c6950..8db46cb1650 100644 --- a/include/xrpl/tx/paths/detail/StrandFlow.h +++ b/include/xrpl/tx/paths/detail/StrandFlow.h @@ -246,7 +246,7 @@ flow( EitherAmount stepIn(*strand[0]->cachedIn()); for (auto i = 0; i < s; ++i) { - bool valid; + bool valid = false; std::tie(valid, stepIn) = strand[i]->validFwd(checkSB, checkAfView, stepIn); if (!valid) { diff --git a/include/xrpl/tx/wasm/ContractContext.h b/include/xrpl/tx/wasm/ContractContext.h index 8c214057843..94845c646f4 100644 --- a/include/xrpl/tx/wasm/ContractContext.h +++ b/include/xrpl/tx/wasm/ContractContext.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include #include @@ -67,6 +67,25 @@ struct ContractContext uint32_t generation = 0; // generation of the contract being executed uint64_t burden = 0; // computational burden used ContractResult result; + + /// Persistent view used to track cumulative state from emitted + /// transactions so that successive emits within the same WASM + /// execution see the correct sequence numbers, balances, etc. + std::optional emitView; + + /// Return the emit view, lazily creating it on first use. + /// The view is layered on top of the transactor's ApplyViewImpl + /// (applyCtx.view()) so that reads automatically fall through to + /// the transactor's pending state (e.g. the tfSendAmount balance + /// transfer, consumed sequence number, paid fee) without needing + /// to manually copy SLE changes. + OpenView& + getEmitView() + { + if (!emitView) + emitView.emplace(static_cast(&applyCtx.view())); + return *emitView; + } }; } // namespace xrpl diff --git a/src/libxrpl/ledger/View.cpp b/src/libxrpl/ledger/View.cpp index 77fecd16d52..da3173e7048 100644 --- a/src/libxrpl/ledger/View.cpp +++ b/src/libxrpl/ledger/View.cpp @@ -457,7 +457,7 @@ canTransferIOU( SendTransferHandling transferHandling, SendBalanceHandling balanceHandling) { - AccountID issuer = amount.getIssuer(); + AccountID const issuer = amount.getIssuer(); // If the issuer is the same as the sender if (issuerHandling == SendIssuerHandling::ihSENDER_NOT_ALLOWED && issuer == sender) return tecNO_PERMISSION; @@ -574,7 +574,7 @@ canTransferMPT( SendTransferHandling transferHandling, SendBalanceHandling balanceHandling) { - AccountID issuer = amount.getIssuer(); + AccountID const issuer = amount.getIssuer(); // If the issuer is the same as the sender if (issuerHandling == SendIssuerHandling::ihSENDER_NOT_ALLOWED && issuer == sender) return tecNO_PERMISSION; diff --git a/src/libxrpl/ledger/helpers/ContractUtils.cpp b/src/libxrpl/ledger/helpers/ContractUtils.cpp index 6a0b23a434a..db2fa8607d7 100644 --- a/src/libxrpl/ledger/helpers/ContractUtils.cpp +++ b/src/libxrpl/ledger/helpers/ContractUtils.cpp @@ -1,22 +1,3 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2025 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - #include #include #include @@ -46,7 +27,7 @@ contractCreateFee(uint64_t byteCount) constexpr uint64_t mul = static_cast(createByteMultiplier); if (byteCount > std::numeric_limits::max() / mul) return feeCalculationFailed; // overflow - uint64_t uf = byteCount * mul; + uint64_t const uf = byteCount * mul; if (uf > static_cast(std::numeric_limits::max())) return feeCalculationFailed; return static_cast(uf); @@ -299,7 +280,7 @@ preflightFlagParameters(STArray const& parameters, beast::Journal j) if (!param.isFieldPresent(sfParameterValue)) return temMALFORMED; auto const& value = param.getFieldData(sfParameterValue); - STAmount amount = value.getFieldAmount(); + STAmount const amount = value.getFieldAmount(); // Preflight Transfer Amount if (isXRP(amount)) { @@ -355,7 +336,7 @@ preclaimFlagParameters( return tecINTERNAL; auto const& value = param.getFieldData(sfParameterValue); - STAmount amount = value.getFieldAmount(); + STAmount const amount = value.getFieldAmount(); // Preclaim Transfer Amount if (isXRP(amount)) { @@ -435,7 +416,7 @@ doApplyFlagParameters( return tecINTERNAL; auto const& value = param.getFieldData(sfParameterValue); - STAmount amount = value.getFieldAmount(); + STAmount const amount = value.getFieldAmount(); if (auto ter = accountSend( view, sourceAccount, contractAccount, amount, j, WaiveTransferFee::No); !isTesSuccess(ter)) @@ -529,7 +510,8 @@ setContractData( if (!dataSle) return tesSUCCESS; - uint32_t oldDataReserve = contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); + uint32_t const oldDataReserve = + contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); std::uint64_t const page = (*dataSle)[sfOwnerNode]; // Remove the page from the account directory @@ -544,13 +526,13 @@ setContractData( return tesSUCCESS; } - std::uint32_t ownerCount{(*sleAccount)[sfOwnerCount]}; - bool createNew = !dataSle; + std::uint32_t const ownerCount{(*sleAccount)[sfOwnerCount]}; + bool const createNew = !dataSle; if (createNew) { // CREATE - uint32_t dataReserve = contractDataReserve(data.size()); - uint32_t newReserve = ownerCount + dataReserve; + uint32_t const dataReserve = contractDataReserve(data.size()); + uint32_t const newReserve = ownerCount + dataReserve; XRPAmount const newReserveAmount{view.fees().accountReserve(newReserve)}; if (STAmount((*sleAccount)[sfBalance]).xrp() < newReserveAmount) return tecINSUFFICIENT_RESERVE; @@ -575,12 +557,13 @@ setContractData( else { // UPDATE - uint32_t oldDataReserve = contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); - uint32_t newDataReserve = contractDataReserve(data.size()); + uint32_t const oldDataReserve = + contractDataReserve(dataSle->getFieldJson(sfContractJson).size()); + uint32_t const newDataReserve = contractDataReserve(data.size()); if (newDataReserve != oldDataReserve) { // if the reserve changes, we need to adjust the owner count - uint32_t newReserve = ownerCount - oldDataReserve + newDataReserve; + uint32_t const newReserve = ownerCount - oldDataReserve + newDataReserve; XRPAmount const newReserveAmount{view.fees().accountReserve(newReserve)}; if (STAmount((*sleAccount)[sfBalance]).xrp() < newReserveAmount) return tecINSUFFICIENT_RESERVE; @@ -614,7 +597,7 @@ finalizeContractData( { auto const& acc = accEntry.first; auto const& cacheEntry = accEntry.second; - bool is_modified = cacheEntry.first; + bool const is_modified = cacheEntry.first; auto const& jsonData = cacheEntry.second; if (is_modified) { diff --git a/src/libxrpl/ledger/helpers/NFTokenUtils.cpp b/src/libxrpl/ledger/helpers/NFTokenUtils.cpp index 874c483c3d7..d0e4bab6013 100644 --- a/src/libxrpl/ledger/helpers/NFTokenUtils.cpp +++ b/src/libxrpl/ledger/helpers/NFTokenUtils.cpp @@ -1119,7 +1119,7 @@ transferNFToken( if (!tokenAndPage) return tecINTERNAL; // LCOV_EXCL_LINE - if (auto const ret = nft::removeToken(view, seller, nftokenID, std::move(tokenAndPage->page)); + if (auto const ret = nft::removeToken(view, seller, nftokenID, tokenAndPage->page); !isTesSuccess(ret)) return ret; diff --git a/src/libxrpl/protocol/Emitable.cpp b/src/libxrpl/protocol/Emitable.cpp index 96f00cd47bb..06bf6feb7f4 100644 --- a/src/libxrpl/protocol/Emitable.cpp +++ b/src/libxrpl/protocol/Emitable.cpp @@ -75,7 +75,7 @@ Emitable::getEmitableName(std::uint32_t const value) const { auto const emitableValue = static_cast(value); if (auto const granular = getGranularName(emitableValue)) - return *granular; + return granular; // not a granular emitable, check if it maps to a transaction type auto const txType = emitableToTxType(value); diff --git a/src/libxrpl/protocol/STData.cpp b/src/libxrpl/protocol/STData.cpp index 24e165e3cae..e091626ac4d 100644 --- a/src/libxrpl/protocol/STData.cpp +++ b/src/libxrpl/protocol/STData.cpp @@ -140,9 +140,9 @@ STData::STData(SField const& n, STNumber const& v) STData::STData(SerialIter& sit, SField const& name) : STBase(name), data_(STBase{}) { - std::uint16_t stype = SerializedTypeID(sit.get16()); + std::uint16_t const stype = SerializedTypeID(sit.get16()); inner_type_ = stype; - SerializedTypeID s = static_cast(stype); + SerializedTypeID const s = static_cast(stype); switch (s) { case STI_UINT8: { @@ -437,7 +437,7 @@ STData::getInnerTypeString() const std::string STData::getText() const { - std::string inner_type_str = getInnerTypeString(); + std::string const inner_type_str = getInnerTypeString(); return "STData{InnerType: " + inner_type_str + ", Data: " + data_.get().getText() + "}"; } @@ -453,7 +453,7 @@ STData::getJson(JsonOptions options) const STBase* STData::makeFieldPresent() { - STBase* f = &data_.get(); // getPIndex(index); + STBase const* f = &data_.get(); // getPIndex(index); if (f->getSType() != STI_NOTPRESENT) return f; @@ -633,7 +633,7 @@ STData::getFieldH256() const Blob STData::getFieldVL() const { - STBlob empty; + STBlob const empty; STBlob const& b = getFieldByConstRef(empty); return Blob(b.data(), b.data() + b.size()); } @@ -738,7 +738,7 @@ dataFromJson(SField const& field, Json::Value const& v) { auto const str = value.asString(); - std::uint64_t val; + std::uint64_t val = 0; bool const useBase10 = field.shouldMeta(SField::sMD_BaseTen); @@ -956,7 +956,7 @@ dataFromJson(SField const& field, Json::Value const& v) Throw("STData: expected string for NUMBER"); } - STNumber number = numberFromJson(field, value); + STNumber const number = numberFromJson(field, value); STData data(field, number); return data; } diff --git a/src/libxrpl/protocol/STDataType.cpp b/src/libxrpl/protocol/STDataType.cpp index 19f0afb91e7..9da51aa99aa 100644 --- a/src/libxrpl/protocol/STDataType.cpp +++ b/src/libxrpl/protocol/STDataType.cpp @@ -26,7 +26,7 @@ STDataType::STDataType(SField const& n, SerializedTypeID v) STDataType::STDataType(SerialIter& sit, SField const& name) : STBase(name), inner_type_(STI_DATA), default_(false) { - std::uint16_t stype = SerializedTypeID(sit.get16()); + std::uint16_t const stype = SerializedTypeID(sit.get16()); inner_type_ = stype; } @@ -134,7 +134,7 @@ STDataType::getInnerTypeString() const std::string STDataType::getText() const { - std::string inner_type_str = getInnerTypeString(); + std::string const inner_type_str = getInnerTypeString(); return "STDataType{InnerType: " + inner_type_str + "}"; } @@ -151,7 +151,7 @@ dataTypeFromJson(SField const& field, Json::Value const& v) { SerializedTypeID typeId = STI_NOTPRESENT; Json::Value type; - Json::Value value; + Json::Value const value; if (!v.isObject()) { diff --git a/src/libxrpl/protocol/STJson.cpp b/src/libxrpl/protocol/STJson.cpp index 37f214ea961..0069892aa3a 100644 --- a/src/libxrpl/protocol/STJson.cpp +++ b/src/libxrpl/protocol/STJson.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -46,10 +47,10 @@ STJson::STJson(SerialIter& sit, SField const& name) : STBase{name} // Read type byte auto typeByte = sit.get8(); - JsonType type = static_cast(typeByte); + JsonType const type = static_cast(typeByte); length--; // Account for type byte - int initialBytesLeft = sit.getBytesLeft(); + int const initialBytesLeft = sit.getBytesLeft(); if (type == JsonType::Array) { @@ -81,7 +82,7 @@ STJson::STJson(SerialIter& sit, SField const& name) : STBase{name} data_ = std::move(map); } - int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + int const consumedBytes = initialBytesLeft - sit.getBytesLeft(); if (consumedBytes != length) Throw("STJson length mismatch"); } @@ -161,9 +162,14 @@ STJson::validateDepth(Value const& value, int currentDepth) const if (!nested) return; - int valueDepth = nested->getDepth(); - if (currentDepth + valueDepth > 1) + // Adding an STJson value increases depth by 1 + int const totalDepth = currentDepth + 1 + nested->getDepth(); + if (totalDepth > 1) Throw("STJson nesting depth exceeds maximum of 1"); + + // Arrays cannot contain arrays + if (isArray() && nested->isArray()) + Throw("STJson arrays cannot contain arrays"); } void @@ -197,10 +203,10 @@ STJson::fromSerialIter(SerialIter& sit) // Read type byte auto typeByte = sit.get8(); - JsonType type = static_cast(typeByte); + JsonType const type = static_cast(typeByte); length--; // Account for type byte - int initialBytesLeft = sit.getBytesLeft(); + int const initialBytesLeft = sit.getBytesLeft(); if (type == JsonType::Array) { @@ -220,7 +226,7 @@ STJson::fromSerialIter(SerialIter& sit) } } - int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + int const consumedBytes = initialBytesLeft - sit.getBytesLeft(); if (consumedBytes != length) Throw("STJson length mismatch"); @@ -235,7 +241,7 @@ STJson::fromSerialIter(SerialIter& sit) map.emplace(std::move(key), std::move(value)); } - int consumedBytes = initialBytesLeft - sit.getBytesLeft(); + int const consumedBytes = initialBytesLeft - sit.getBytesLeft(); if (consumedBytes != length) Throw("STJson length mismatch"); @@ -262,7 +268,7 @@ STJson::Array STJson::parseArray(SerialIter& sit, int length) { Array array; - int initialBytesLeft = sit.getBytesLeft(); + int const initialBytesLeft = sit.getBytesLeft(); while (sit.getBytesLeft() > 0 && (initialBytesLeft - sit.getBytesLeft()) < length) { @@ -290,7 +296,7 @@ STJson::makeValueFromVLWithType(SerialIter& sit) // Read SType marker (1 byte) auto typeCode = sit.get8(); - SerializedTypeID stype = static_cast(typeCode); + SerializedTypeID const stype = static_cast(typeCode); // Dispatch to correct SType switch (stype) @@ -699,10 +705,11 @@ STJson::getJson(JsonOptions options) const auto const& map = std::get(data_); for (auto const& [key, value] : map) { + auto const hexKey = strHex(key); if (value) - obj[key] = value->getJson(options); + obj[hexKey] = value->getJson(options); else - obj[key] = Json::nullValue; + obj[hexKey] = Json::nullValue; } return obj; } diff --git a/src/libxrpl/protocol/STObject.cpp b/src/libxrpl/protocol/STObject.cpp index 239d8e70806..87c47328538 100644 --- a/src/libxrpl/protocol/STObject.cpp +++ b/src/libxrpl/protocol/STObject.cpp @@ -775,6 +775,9 @@ STObject::addFieldFromSlice(SField const& sfield, Slice const& data) case STI_UINT160: element = std::make_unique(sit, sfield); break; + case STI_UINT192: + element = std::make_unique(sit, sfield); + break; case STI_UINT256: element = std::make_unique(sit, sfield); break; diff --git a/src/libxrpl/tx/transactors/contract/ContractCall.cpp b/src/libxrpl/tx/transactors/contract/ContractCall.cpp index fd1e415d14d..110d4b8dd8b 100644 --- a/src/libxrpl/tx/transactors/contract/ContractCall.cpp +++ b/src/libxrpl/tx/transactors/contract/ContractCall.cpp @@ -93,7 +93,7 @@ ContractCall::preclaim(PreclaimContext const& ctx) auto it = std::find_if( functions.begin(), functions.end(), [&functionNameHexStr](STObject const& func) { auto const funcName = func.getFieldVL(sfFunctionName); - std::string functionNameDefHexStr(funcName.begin(), funcName.end()); + std::string const functionNameDefHexStr(funcName.begin(), funcName.end()); return functionNameDefHexStr == functionNameHexStr; }); @@ -178,9 +178,9 @@ ContractCall::doApply() // WASM execution auto const wasmStr = contractSourceSle->getFieldVL(sfContractCode); - std::vector wasm(wasmStr.begin(), wasmStr.end()); + std::vector const wasm(wasmStr.begin(), wasmStr.end()); auto const functionName = ctx_.tx.getFieldVL(sfFunctionName); - std::string funcName(functionName.begin(), functionName.end()); + std::string const funcName(functionName.begin(), functionName.end()); auto const contractFunctions = contractSle->isFieldPresent(sfFunctions) ? contractSle->getFieldArray(sfFunctions) @@ -229,8 +229,8 @@ ContractCall::doApply() return tecINVALID_PARAMETERS; } - xrpl::ContractDataMap dataMap; - xrpl::ContractEventMap eventMap; + xrpl::ContractDataMap const dataMap; + xrpl::ContractEventMap const eventMap; ContractContext contractCtx = { .applyCtx = ctx_, .instanceParameters = instanceParameters, @@ -255,6 +255,7 @@ ContractCall::doApply() .eventMap = eventMap, .changedDataCount = 0, }, + .emitView = std::nullopt, }; ContractHostFunctionsImpl ledgerDataProvider(contractCtx); @@ -265,7 +266,7 @@ ContractCall::doApply() return tefINTERNAL; } - std::uint32_t allowance = ctx_.tx[sfComputationAllowance]; + std::uint32_t const allowance = ctx_.tx[sfComputationAllowance]; auto re = runEscrowWasm(wasm, ledgerDataProvider, allowance, funcName, {}); // Wasm Result @@ -291,7 +292,7 @@ ContractCall::doApply() auto ret = re.value().result; if (ret < 0) { - JLOG(j_.trace()) << "WASM Execution Failed: " << contractCtx.result.exitReason; + JLOG(j_.trace()) << "WASM Execution Failed: " << ret; ctx_.setWasmReturnCode(ret); // ctx_.setWasmReturnStr(contractCtx.result.exitReason); return tecWASM_REJECTED; diff --git a/src/libxrpl/tx/transactors/contract/ContractDelete.cpp b/src/libxrpl/tx/transactors/contract/ContractDelete.cpp index 6b91cd7ca58..781b558dc1c 100644 --- a/src/libxrpl/tx/transactors/contract/ContractDelete.cpp +++ b/src/libxrpl/tx/transactors/contract/ContractDelete.cpp @@ -55,7 +55,7 @@ ContractDelete::preclaim(PreclaimContext const& ctx) return tecNO_PERMISSION; } - std::uint32_t flags = contractSle->getFlags(); + std::uint32_t const flags = contractSle->getFlags(); // Check if the contract is undeletable. if (flags & tfUndeletable) diff --git a/src/libxrpl/tx/transactors/contract/ContractModify.cpp b/src/libxrpl/tx/transactors/contract/ContractModify.cpp index e84e121cb45..24069e9ffcc 100644 --- a/src/libxrpl/tx/transactors/contract/ContractModify.cpp +++ b/src/libxrpl/tx/transactors/contract/ContractModify.cpp @@ -103,7 +103,7 @@ ContractModify::preclaim(PreclaimContext const& ctx) return tecNO_PERMISSION; } - std::uint32_t flags = contractSle->getFlags(); + std::uint32_t const flags = contractSle->getFlags(); // Check if the contract is immutable. if (flags & tfImmutable) diff --git a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp index 95ebe23f392..e342d1a62a4 100644 --- a/src/libxrpl/tx/wasm/HostFuncWrapper.cpp +++ b/src/libxrpl/tx/wasm/HostFuncWrapper.cpp @@ -2262,10 +2262,6 @@ buildTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* results) auto* hf = getHF(env); auto const* rt = reinterpret_cast(hf->getRT()); int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); - } auto const txnType = getDataInt32(rt, params, index); if (!txnType) @@ -2314,10 +2310,6 @@ emitBuiltTxn_wrap(void* env, wasm_val_vec_t const* params, wasm_val_vec_t* resul auto* hf = getHF(env); auto const* rt = reinterpret_cast(hf->getRT()); int index = 0; - if (params->data[1].of.i32 > maxWasmDataLength) - { - return hfResult(results, HostFunctionError::DATA_FIELD_TOO_LARGE); - } auto const txnIndex = getDataInt32(rt, params, index); if (!txnIndex) diff --git a/src/test/app/ContractHostFuncImpl_test.cpp b/src/test/app/ContractHostFuncImpl_test.cpp index 928070a34ff..0c5975fd759 100644 --- a/src/test/app/ContractHostFuncImpl_test.cpp +++ b/src/test/app/ContractHostFuncImpl_test.cpp @@ -35,10 +35,10 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite uint256 const& contractHash = uint256{1}) { using namespace jtx; - xrpl::ContractDataMap dataMap; - xrpl::ContractEventMap eventMap; - std::vector instanceParameters; - std::vector functionParameters; + xrpl::ContractDataMap const dataMap; + xrpl::ContractEventMap const eventMap; + std::vector const instanceParameters; + std::vector const functionParameters; uint256 const& txId = uint256{2}; @@ -69,6 +69,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite .eventMap = eventMap, .changedDataCount = 0, }, + .emitView = std::nullopt, }; } @@ -412,7 +413,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Add test function parameters (same as instance parameters for // testing) [Similar parameter setup as instanceParam test...] - ContractHostFunctionsImpl cfs(contractCtx); + ContractHostFunctionsImpl const cfs(contractCtx); // [Similar tests as instanceParam but using functionParam method...] } @@ -513,14 +514,14 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test multiple keys for same account { auto value1 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'v', 'a', 'l', 'u', 'e', '1'}; + Blob const data = {'v', 'a', 'l', 'u', 'e', '1'}; s.addVL(data); }); auto setResult1 = cfs.setDataObjectField(alice.id(), "field1", value1); BEAST_EXPECT(!setResult1.has_value()); auto value2 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'v', 'a', 'l', 'u', 'e', '2'}; + Blob const data = {'v', 'a', 'l', 'u', 'e', '2'}; s.addVL(data); }); auto setResult2 = cfs.setDataObjectField(alice.id(), "field2", value2); @@ -566,28 +567,26 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test setDataNestedObjectField { auto value = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'A', 'l', 'i', 'c', 'e'}; + Blob const data = {'A', 'l', 'i', 'c', 'e'}; s.addVL(data); }); auto setResult = cfs.setDataNestedObjectField(alice.id(), "profile", "firstName", value); - BEAST_EXPECT(!setResult.has_value()); - if (!setResult.has_value()) - BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + BEAST_EXPECT(setResult.has_value()); // Add more nested fields auto value2 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'S', 'm', 'i', 't', 'h'}; + Blob const data = {'S', 'm', 'i', 't', 'h'}; s.addVL(data); }); auto setResult2 = cfs.setDataNestedObjectField(alice.id(), "profile", "lastName", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto value3 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(25); }); auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "profile", "age", value3); - BEAST_EXPECT(!setResult3.has_value()); + BEAST_EXPECT(setResult3.has_value()); // Retrieve nested fields auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "profile", "firstName"); @@ -603,26 +602,26 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test nested objects with different parent keys { auto value1 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'d', 'a', 'r', 'k'}; + Blob const data = {'d', 'a', 'r', 'k'}; s.addVL(data); }); auto setResult1 = cfs.setDataNestedObjectField(alice.id(), "settings", "theme", value1); - BEAST_EXPECT(!setResult1.has_value()); + BEAST_EXPECT(setResult1.has_value()); auto value2 = createJsonValue(STI_UINT8, [](Serializer& s) { s.add8(1); // true }); auto setResult2 = cfs.setDataNestedObjectField(alice.id(), "settings", "notifications", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto value3 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'e', 'n'}; + Blob const data = {'e', 'n'}; s.addVL(data); }); auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "preferences", "language", value3); - BEAST_EXPECT(!setResult3.has_value()); + BEAST_EXPECT(setResult3.has_value()); // Verify nested data retrieval auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "settings", "theme"); @@ -652,11 +651,11 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite { auto value1 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(100); }); auto setResult1 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value1); - BEAST_EXPECT(!setResult1.has_value()); + BEAST_EXPECT(setResult1.has_value()); auto value2 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(150); }); auto setResult2 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto getResult = cfs.getDataNestedObjectField(bob.id(), "stats", "score"); BEAST_EXPECT(getResult.has_value()); @@ -687,28 +686,26 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test setDataNestedObjectField { auto value = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'A', 'l', 'i', 'c', 'e'}; + Blob const data = {'A', 'l', 'i', 'c', 'e'}; s.addVL(data); }); auto setResult = cfs.setDataNestedObjectField(alice.id(), "profile", "firstName", value); - BEAST_EXPECT(!setResult.has_value()); - if (!setResult.has_value()) - BEAST_EXPECT(setResult.error() == HostFunctionError::INTERNAL); + BEAST_EXPECT(setResult.has_value()); // Add more nested fields auto value2 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'S', 'm', 'i', 't', 'h'}; + Blob const data = {'S', 'm', 'i', 't', 'h'}; s.addVL(data); }); auto setResult2 = cfs.setDataNestedObjectField(alice.id(), "profile", "lastName", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto value3 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(25); }); auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "profile", "age", value3); - BEAST_EXPECT(!setResult3.has_value()); + BEAST_EXPECT(setResult3.has_value()); // Retrieve nested fields auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "profile", "firstName"); @@ -724,26 +721,26 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test nested objects with different parent keys { auto value1 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'d', 'a', 'r', 'k'}; + Blob const data = {'d', 'a', 'r', 'k'}; s.addVL(data); }); auto setResult1 = cfs.setDataNestedObjectField(alice.id(), "settings", "theme", value1); - BEAST_EXPECT(!setResult1.has_value()); + BEAST_EXPECT(setResult1.has_value()); auto value2 = createJsonValue(STI_UINT8, [](Serializer& s) { s.add8(1); // true }); auto setResult2 = cfs.setDataNestedObjectField(alice.id(), "settings", "notifications", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto value3 = createJsonValue(STI_VL, [](Serializer& s) { - Blob data = {'e', 'n'}; + Blob const data = {'e', 'n'}; s.addVL(data); }); auto setResult3 = cfs.setDataNestedObjectField(alice.id(), "preferences", "language", value3); - BEAST_EXPECT(!setResult3.has_value()); + BEAST_EXPECT(setResult3.has_value()); // Verify nested data retrieval auto getResult1 = cfs.getDataNestedObjectField(alice.id(), "settings", "theme"); @@ -773,11 +770,11 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite { auto value1 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(100); }); auto setResult1 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value1); - BEAST_EXPECT(!setResult1.has_value()); + BEAST_EXPECT(setResult1.has_value()); auto value2 = createJsonValue(STI_UINT32, [](Serializer& s) { s.add32(150); }); auto setResult2 = cfs.setDataNestedObjectField(bob.id(), "stats", "score", value2); - BEAST_EXPECT(!setResult2.has_value()); + BEAST_EXPECT(setResult2.has_value()); auto getResult = cfs.getDataNestedObjectField(bob.id(), "stats", "score"); BEAST_EXPECT(getResult.has_value()); @@ -911,7 +908,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite if (!buildResult.has_value()) return; - uint32_t txIndex = buildResult.value(); + uint32_t const txIndex = buildResult.value(); // Test adding Destination (AccountID) with 0x14 prefix { @@ -935,7 +932,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding Amount (STAmount - XRP) { - STAmount amount{XRP(1000)}; + STAmount const amount{XRP(1000)}; Serializer s; amount.add(s); auto result = cfs.addTxnField(txIndex, sfAmount, s.slice()); @@ -952,7 +949,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding SendMax (STAmount - IOU) { auto const USD = alice["USD"]; - STAmount sendMax{USD.issue(), 500}; + STAmount const sendMax{USD.issue(), 500}; Serializer s; sendMax.add(s); auto result = cfs.addTxnField(txIndex, sfSendMax, s.slice()); @@ -968,7 +965,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding DestinationTag (UInt32) { - uint32_t tag = 12345; + uint32_t const tag = 12345; Serializer s; s.add32(tag); auto result = cfs.addTxnField(txIndex, sfDestinationTag, s.slice()); @@ -987,12 +984,12 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(trustBuildResult.has_value()); if (trustBuildResult.has_value()) { - uint32_t trustIndex = trustBuildResult.value(); + uint32_t const trustIndex = trustBuildResult.value(); // Test adding LimitAmount (STAmount for TrustSet) { auto const EUR = alice["EUR"]; - STAmount limit{EUR.issue(), 10000}; + STAmount const limit{EUR.issue(), 10000}; Serializer s; limit.add(s); auto result = cfs.addTxnField(trustIndex, sfLimitAmount, s.slice()); @@ -1008,7 +1005,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding QualityIn (UInt32) { - uint32_t quality = 1000000; + uint32_t const quality = 1000000; Serializer s; s.add32(quality); auto result = cfs.addTxnField(trustIndex, sfQualityIn, s.slice()); @@ -1028,11 +1025,11 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(accSetResult.has_value()); if (accSetResult.has_value()) { - uint32_t accSetIndex = accSetResult.value(); + uint32_t const accSetIndex = accSetResult.value(); // Test adding Domain (Blob/VL) { - Blob domain = {'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm'}; + Blob const domain = {'e', 'x', 'a', 'm', 'p', 'l', 'e', '.', 'c', 'o', 'm'}; Serializer s; s.addVL(domain); auto result = cfs.addTxnField(accSetIndex, sfDomain, s.slice()); @@ -1048,7 +1045,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding TransferRate (UInt32) { - uint32_t fee = 500; + uint32_t const fee = 500; Serializer s; s.add32(fee); auto result = cfs.addTxnField(accSetIndex, sfTransferRate, s.slice()); @@ -1064,7 +1061,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite // Test adding SetFlag (UInt32) { - uint32_t flag = 8; // asfRequireAuth + uint32_t const flag = 8; // asfRequireAuth Serializer s; s.add32(flag); auto result = cfs.addTxnField(accSetIndex, sfSetFlag, s.slice()); @@ -1143,7 +1140,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite if (!buildResult.has_value()) return; - uint32_t txIndex = buildResult.value(); + uint32_t const txIndex = buildResult.value(); // Add required fields for Payment AccountID destAccount = bob.id(); @@ -1156,7 +1153,7 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(destResult.has_value()); // Add Amount field - STAmount amount{XRP(100)}; + STAmount const amount{XRP(100)}; Serializer amtSerializer; amount.add(amtSerializer); auto amtResult = cfs.addTxnField(txIndex, sfAmount, amtSerializer.slice()); @@ -1171,81 +1168,79 @@ struct ContractHostFuncImpl_test : public beast::unit_test::suite BEAST_EXPECT(contractCtx.result.emittedTxns.size() == 1); // The result should be a TER code converted to int - int32_t terCode = emitResult.value(); + int32_t const terCode = emitResult.value(); // We expect a success code BEAST_EXPECT(terCode == 0); } } - // // Test emitting multiple transactions - // { - // // Build first transaction - Payment - // auto build1 = cfs.buildTxn(ttPAYMENT); - // BEAST_EXPECT(build1.has_value()); - // if (build1.has_value()) - // { - // uint32_t tx1 = build1.value(); - - // // Add fields for first payment - // AccountID dest1 = alice.id(); - // Blob dest1Buf; - // dest1Buf.reserve(1 + dest1.size()); - // dest1Buf.push_back(0x14); - // dest1Buf.insert(dest1Buf.end(), dest1.begin(), dest1.end()); - // auto const result = cfs.addTxnField( - // tx1, - // sfDestination, - // Slice{dest1Buf.data(), dest1Buf.size()}); - // BEAST_EXPECT(result.has_value()); + // Test emitting multiple transactions + { + // Build first transaction - Payment + auto build1 = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(build1.has_value()); + if (build1.has_value()) + { + uint32_t const tx1 = build1.value(); + + // Add fields for first payment + AccountID dest1 = alice.id(); + Blob dest1Buf; + dest1Buf.reserve(1 + dest1.size()); + dest1Buf.push_back(0x14); + dest1Buf.insert(dest1Buf.end(), dest1.begin(), dest1.end()); + auto const result = + cfs.addTxnField(tx1, sfDestination, Slice{dest1Buf.data(), dest1Buf.size()}); + BEAST_EXPECT(result.has_value()); - // STAmount amt1{XRP(50)}; - // Serializer amt1Ser; - // amt1.add(amt1Ser); - // cfs.addTxnField(tx1, sfAmount, amt1Ser.slice()); - // } + STAmount const amt1{XRP(50)}; + Serializer amt1Ser; + amt1.add(amt1Ser); + [[maybe_unused]] auto const amt1Result = + cfs.addTxnField(tx1, sfAmount, amt1Ser.slice()); + } - // // Build second transaction - Another Payment - // auto build2 = cfs.buildTxn(ttPAYMENT); - // BEAST_EXPECT(build2.has_value()); - // if (build2.has_value()) - // { - // uint32_t tx2 = build2.value(); - - // // Add fields for second payment - // AccountID dest2 = carol.id(); - // Blob dest2Buf; - // dest2Buf.reserve(1 + dest2.size()); - // dest2Buf.push_back(0x14); - // dest2Buf.insert(dest2Buf.end(), dest2.begin(), dest2.end()); - // auto const result = cfs.addTxnField( - // tx2, - // sfDestination, - // Slice{dest2Buf.data(), dest2Buf.size()}); - // BEAST_EXPECT(result.has_value()); + // Build second transaction - Another Payment + auto build2 = cfs.buildTxn(ttPAYMENT); + BEAST_EXPECT(build2.has_value()); + if (build2.has_value()) + { + uint32_t const tx2 = build2.value(); + + // Add fields for second payment + AccountID dest2 = carol.id(); + Blob dest2Buf; + dest2Buf.reserve(1 + dest2.size()); + dest2Buf.push_back(0x14); + dest2Buf.insert(dest2Buf.end(), dest2.begin(), dest2.end()); + auto const result = + cfs.addTxnField(tx2, sfDestination, Slice{dest2Buf.data(), dest2Buf.size()}); + BEAST_EXPECT(result.has_value()); - // STAmount amt2{XRP(75)}; - // Serializer amt2Ser; - // amt2.add(amt2Ser); - // cfs.addTxnField(tx2, sfAmount, amt2Ser.slice()); - // } + STAmount const amt2{XRP(75)}; + Serializer amt2Ser; + amt2.add(amt2Ser); + [[maybe_unused]] auto const amt2Result = + cfs.addTxnField(tx2, sfAmount, amt2Ser.slice()); + } - // // Emit both transactions - // if (build1.has_value()) - // { - // auto emit1 = cfs.emitBuiltTxn(build1.value()); - // BEAST_EXPECT(emit1.has_value()); - // } + // Emit both transactions + if (build1.has_value()) + { + auto emit1 = cfs.emitBuiltTxn(build1.value()); + BEAST_EXPECT(emit1.has_value()); + } - // if (build2.has_value()) - // { - // auto emit2 = cfs.emitBuiltTxn(build2.value()); - // BEAST_EXPECT(emit2.has_value()); - // } + if (build2.has_value()) + { + auto emit2 = cfs.emitBuiltTxn(build2.value()); + BEAST_EXPECT(emit2.has_value()); + } - // // Check that both were added to emitted transactions - // // (Note: actual count depends on previous test state) - // BEAST_EXPECT(contractCtx.result.emittedTxns.size() >= 2); - // } + // Check that both were added to emitted transactions + // (Note: actual count depends on previous test state) + BEAST_EXPECT(contractCtx.result.emittedTxns.size() >= 2); + } // // Test emitting transaction with invalid index // { diff --git a/src/test/app/Contract_test.cpp b/src/test/app/Contract_test.cpp index ca3cb599741..589e72d1f1a 100644 --- a/src/test/app/Contract_test.cpp +++ b/src/test/app/Contract_test.cpp @@ -310,11 +310,15 @@ class Contract_test : public beast::unit_test::suite auto const wasmBytes = strUnHex(jt.jv[sfContractCode.jsonName].asString()); // std::cout << "WASM Size: " << wasmBytes->size() << std::endl; + if (!wasmBytes || wasmBytes->empty()) + return std::make_tuple(jtx::Account{"invalid"}, uint256{}, jt.jv); uint256 const contractHash = xrpl::sha512Half_s(xrpl::Slice(wasmBytes->data(), wasmBytes->size())); auto const accountID = parseBase58(jt.jv[sfAccount].asString()); auto const [contractKey, sle] = contractKeyAndSle( *env.current(), contractHash, *accountID, jt.jv[sfSequence.jsonName].asUInt()); + if (!sle) + return std::make_tuple(jtx::Account{"invalid"}, contractHash, jt.jv); jtx::Account const contractAccount{ "Contract pseudo-account", sle->getAccountID(sfContractAccount)}; return std::make_tuple(contractAccount, contractHash, jt.jv); @@ -1434,8 +1438,8 @@ class Contract_test : public beast::unit_test::suite loadContractWasmStr(std::string const& contract_name = "") { std::string const& dir = "e2e-tests"; - std::string name = "/Users/darkmatter/projects/ledger-works/xrpl-wasm-std/" + dir + "/" + - contract_name + "/target/wasm32v1-none/release/" + contract_name + ".wasm"; + std::string const name = "/Users/darkmatter/projects/ledger-works/xrpl-wasm-std/" + dir + + "/" + contract_name + "/target/wasm32v1-none/release/" + contract_name + ".wasm"; if (!boost::filesystem::exists(name)) { std::cout << "File does not exist: " << name << "\n"; @@ -1451,7 +1455,7 @@ class Contract_test : public beast::unit_test::suite } // Read the file into a vector - std::vector buffer( + std::vector const buffer( (std::istreambuf_iterator(file)), std::istreambuf_iterator()); // Check if the buffer is empty @@ -1478,7 +1482,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + std::string const contractDataWasmHex = loadContractWasmStr("contract_data"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1513,7 +1517,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + std::string const contractDataWasmHex = loadContractWasmStr("contract_data"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1548,7 +1552,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + std::string const contractDataWasmHex = loadContractWasmStr("contract_data"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1583,7 +1587,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string contractDataWasmHex = loadContractWasmStr("contract_data"); + std::string const contractDataWasmHex = loadContractWasmStr("contract_data"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1623,7 +1627,7 @@ class Contract_test : public beast::unit_test::suite // Test Instance Parameter (1 of 2) // uint8, uint16, uint32, uint64, uint128, uint160, uint192, uint256 { - std::string wasmHex = loadContractWasmStr("instance_params_uint"); + std::string const wasmHex = loadContractWasmStr("instance_params_uint"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1667,7 +1671,7 @@ class Contract_test : public beast::unit_test::suite { // Test Instance Parameter (2 of 2) // vl, account, amount (XRP), amount (IOU), number, currency, issue - std::string wasmHex = loadContractWasmStr("instance_params_other"); + std::string const wasmHex = loadContractWasmStr("instance_params_other"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1714,7 +1718,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string wasmHex = loadContractWasmStr("function_params"); + std::string const wasmHex = loadContractWasmStr("function_params"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1804,7 +1808,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string emitTxWasmHex = loadContractWasmStr("emit_txn"); + std::string const emitTxWasmHex = loadContractWasmStr("emit_txn"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1862,7 +1866,7 @@ class Contract_test : public beast::unit_test::suite BEAST_EXPECT(jv[jss::result][jss::status] == "success"); } - std::string eventsWasmHex = loadContractWasmStr("events"); + std::string const eventsWasmHex = loadContractWasmStr("events"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, @@ -1943,7 +1947,7 @@ class Contract_test : public beast::unit_test::suite env.fund(XRP(10'000), alice, bob); env.close(); - std::string wasmHex = loadContractWasmStr("easymode"); + std::string const wasmHex = loadContractWasmStr("easymode"); auto const [contractAccount, contractHash, _] = setContract( env, tesSUCCESS, diff --git a/src/test/app/Delegate_test.cpp b/src/test/app/Delegate_test.cpp index 6c5698a227c..2afc0c6d573 100644 --- a/src/test/app/Delegate_test.cpp +++ b/src/test/app/Delegate_test.cpp @@ -1816,10 +1816,10 @@ class Delegate_test : public beast::unit_test::suite #pragma push_macro("TRANSACTION") #undef TRANSACTION -#define TRANSACTION(tag, value, name, delegable, ...) \ - if (delegable == xrpl::delegable) \ - { \ - delegableCount++; \ +#define TRANSACTION(tag, value, name, delegationStatus, ...) \ + if (delegationStatus == Delegation::delegable) \ + { \ + delegableCount++; \ } #include @@ -1845,7 +1845,7 @@ class Delegate_test : public beast::unit_test::suite // DO NOT modify expectedDelegableCount unless all scenarios, including // edge cases, have been fully tested and verified. // ==================================================================== - std::size_t const expectedDelegableCount = 75; + std::size_t const expectedDelegableCount = 57; BEAST_EXPECTS( delegableCount == expectedDelegableCount, diff --git a/src/test/protocol/STDataType_test.cpp b/src/test/protocol/STDataType_test.cpp index f5828a4c821..a74e8c53b4c 100644 --- a/src/test/protocol/STDataType_test.cpp +++ b/src/test/protocol/STDataType_test.cpp @@ -16,7 +16,7 @@ struct STDataType_test : public beast::unit_test::suite // Test default constructor { - STDataType dt1(sf); + STDataType const dt1(sf); BEAST_EXPECT(dt1.getInnerSType() == STI_NOTPRESENT); BEAST_EXPECT(dt1.getSType() == STI_DATATYPE); BEAST_EXPECT(dt1.getFName() == sf); @@ -24,7 +24,7 @@ struct STDataType_test : public beast::unit_test::suite // Test constructor with SerializedTypeID { - STDataType dt2(sf, STI_UINT32); + STDataType const dt2(sf, STI_UINT32); BEAST_EXPECT(dt2.getInnerSType() == STI_UINT32); BEAST_EXPECT(!dt2.isDefault()); } @@ -34,7 +34,7 @@ struct STDataType_test : public beast::unit_test::suite Serializer s; s.add16(STI_UINT64); SerialIter sit(s.slice()); - STDataType dt3(sit, sf); + STDataType const dt3(sit, sf); BEAST_EXPECT(dt3.getInnerSType() == STI_UINT64); } } @@ -48,7 +48,7 @@ struct STDataType_test : public beast::unit_test::suite // Test copy { - STDataType original(sf, STI_UINT32); + STDataType const original(sf, STI_UINT32); // Use aligned storage for placement new alignas(STDataType) char buffer[sizeof(STDataType)]; @@ -96,7 +96,7 @@ struct STDataType_test : public beast::unit_test::suite std::string expectedHex; }; - TypeTest tests[] = { + TypeTest const tests[] = { {STI_UINT16, "0001"}, {STI_UINT32, "0002"}, {STI_UINT64, "0003"}, @@ -137,22 +137,22 @@ struct STDataType_test : public beast::unit_test::suite // Test equivalent objects { - STDataType dt1(sf1, STI_UINT32); - STDataType dt2(sf1, STI_UINT32); + STDataType const dt1(sf1, STI_UINT32); + STDataType const dt2(sf1, STI_UINT32); BEAST_EXPECT(dt1.isEquivalent(dt2)); } // Test non-equivalent objects (different inner types) { - STDataType dt1(sf1, STI_UINT32); - STDataType dt2(sf1, STI_UINT64); + STDataType const dt1(sf1, STI_UINT32); + STDataType const dt2(sf1, STI_UINT64); BEAST_EXPECT(!dt1.isEquivalent(dt2)); } // Test non-equivalent objects (different default states) { - STDataType dt1(sf1); - STDataType dt2(sf1, STI_NOTPRESENT); + STDataType const dt1(sf1); + STDataType const dt2(sf1, STI_NOTPRESENT); // dt1 has default_ = true (implicit from first constructor) // dt2 has default_ = false (set in second constructor) BEAST_EXPECT(!dt1.isEquivalent(dt2)); @@ -160,7 +160,7 @@ struct STDataType_test : public beast::unit_test::suite // Test with non-STDataType object { - STDataType dt1(sf1, STI_UINT32); + STDataType const dt1(sf1, STI_UINT32); // Create a dummy STBase-derived object for comparison // Since we can't easily create other STBase types here, // we'll test that isEquivalent returns false for nullptr cast @@ -199,7 +199,7 @@ struct STDataType_test : public beast::unit_test::suite return nullptr; } }; - DummySTBase dummy; + DummySTBase const dummy; BEAST_EXPECT(!dt1.isEquivalent(dummy)); } } @@ -213,14 +213,14 @@ struct STDataType_test : public beast::unit_test::suite // Test default state { - STDataType dt1(sf); + STDataType const dt1(sf); // First constructor doesn't set default_ explicitly, // so it should be true (member initialization) BEAST_EXPECT(dt1.isDefault()); } { - STDataType dt2(sf, STI_UINT32); + STDataType const dt2(sf, STI_UINT32); BEAST_EXPECT(!dt2.isDefault()); } } @@ -234,78 +234,78 @@ struct STDataType_test : public beast::unit_test::suite // Test known types { - STDataType dt(sf, STI_UINT8); + STDataType const dt(sf, STI_UINT8); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT8}"); } { - STDataType dt(sf, STI_UINT16); + STDataType const dt(sf, STI_UINT16); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT16}"); } { - STDataType dt(sf, STI_UINT32); + STDataType const dt(sf, STI_UINT32); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT32}"); } { - STDataType dt(sf, STI_UINT64); + STDataType const dt(sf, STI_UINT64); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT64}"); } { - STDataType dt(sf, STI_UINT128); + STDataType const dt(sf, STI_UINT128); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT128}"); } { - STDataType dt(sf, STI_UINT160); + STDataType const dt(sf, STI_UINT160); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT160}"); } { - STDataType dt(sf, STI_UINT192); + STDataType const dt(sf, STI_UINT192); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT192}"); } { - STDataType dt(sf, STI_UINT256); + STDataType const dt(sf, STI_UINT256); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: UINT256}"); } { - STDataType dt(sf, STI_VL); + STDataType const dt(sf, STI_VL); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: VL}"); } { - STDataType dt(sf, STI_ACCOUNT); + STDataType const dt(sf, STI_ACCOUNT); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: ACCOUNT}"); } { - STDataType dt(sf, STI_AMOUNT); + STDataType const dt(sf, STI_AMOUNT); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: AMOUNT}"); } { - STDataType dt(sf, STI_ISSUE); + STDataType const dt(sf, STI_ISSUE); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: ISSUE}"); } { - STDataType dt(sf, STI_CURRENCY); + STDataType const dt(sf, STI_CURRENCY); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: CURRENCY}"); } { - STDataType dt(sf, STI_NUMBER); + STDataType const dt(sf, STI_NUMBER); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: NUMBER}"); } // Test unknown type (should return numeric string) { - STDataType dt(sf, static_cast(999)); + STDataType const dt(sf, static_cast(999)); BEAST_EXPECT(dt.getText() == "STDataType{InnerType: 999}"); } } @@ -319,21 +319,21 @@ struct STDataType_test : public beast::unit_test::suite // Test JSON output for various types { - STDataType dt(sf, STI_UINT32); + STDataType const dt(sf, STI_UINT32); Json::Value json = dt.getJson(JsonOptions::none); BEAST_EXPECT(json.isObject()); BEAST_EXPECT(json[jss::type].asString() == "UINT32"); } { - STDataType dt(sf, STI_AMOUNT); + STDataType const dt(sf, STI_AMOUNT); Json::Value json = dt.getJson(JsonOptions::none); BEAST_EXPECT(json.isObject()); BEAST_EXPECT(json[jss::type].asString() == "AMOUNT"); } { - STDataType dt(sf, STI_ACCOUNT); + STDataType const dt(sf, STI_ACCOUNT); Json::Value json = dt.getJson(JsonOptions::none); BEAST_EXPECT(json.isObject()); BEAST_EXPECT(json[jss::type].asString() == "ACCOUNT"); @@ -341,7 +341,7 @@ struct STDataType_test : public beast::unit_test::suite // Test unknown type { - STDataType dt(sf, static_cast(999)); + STDataType const dt(sf, static_cast(999)); Json::Value json = dt.getJson(JsonOptions::none); BEAST_EXPECT(json.isObject()); BEAST_EXPECT(json[jss::type].asString() == "999"); @@ -359,98 +359,98 @@ struct STDataType_test : public beast::unit_test::suite { Json::Value v; v[jss::type] = "UINT8"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT8); } { Json::Value v; v[jss::type] = "UINT16"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT16); } { Json::Value v; v[jss::type] = "UINT32"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT32); } { Json::Value v; v[jss::type] = "UINT64"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT64); } { Json::Value v; v[jss::type] = "UINT128"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT128); } { Json::Value v; v[jss::type] = "UINT160"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT160); } { Json::Value v; v[jss::type] = "UINT192"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT192); } { Json::Value v; v[jss::type] = "UINT256"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_UINT256); } { Json::Value v; v[jss::type] = "VL"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_VL); } { Json::Value v; v[jss::type] = "ACCOUNT"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_ACCOUNT); } { Json::Value v; v[jss::type] = "AMOUNT"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_AMOUNT); } { Json::Value v; v[jss::type] = "ISSUE"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_ISSUE); } { Json::Value v; v[jss::type] = "CURRENCY"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_CURRENCY); } { Json::Value v; v[jss::type] = "NUMBER"; - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(dt.getInnerSType() == STI_NUMBER); } @@ -458,10 +458,10 @@ struct STDataType_test : public beast::unit_test::suite // Non-object JSON should throw { - Json::Value v = "not an object"; + Json::Value const v = "not an object"; try { - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(false); // Should not reach here } catch (std::runtime_error const& e) @@ -476,7 +476,7 @@ struct STDataType_test : public beast::unit_test::suite v[jss::type] = "UNKNOWN_TYPE"; try { - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(false); // Should not reach here } catch (std::runtime_error const& e) @@ -492,7 +492,7 @@ struct STDataType_test : public beast::unit_test::suite v[jss::type] = ""; try { - STDataType dt = dataTypeFromJson(sf, v); + STDataType const dt = dataTypeFromJson(sf, v); BEAST_EXPECT(false); // Should not reach here } catch (std::runtime_error const& e) @@ -527,7 +527,7 @@ struct STDataType_test : public beast::unit_test::suite STI_NUMBER}) { // Create original - STDataType original(sf, typeId); + STDataType const original(sf, typeId); // Serialize Serializer s; @@ -535,7 +535,7 @@ struct STDataType_test : public beast::unit_test::suite // Deserialize SerialIter sit(s.slice()); - STDataType deserialized(sit, sf); + STDataType const deserialized(sit, sf); // Compare BEAST_EXPECT(deserialized.getInnerSType() == typeId); @@ -550,7 +550,7 @@ struct STDataType_test : public beast::unit_test::suite auto const& sf = sfParameterType; - std::vector typeStrings = { + std::vector const typeStrings = { "UINT8", "UINT16", "UINT32", @@ -571,7 +571,7 @@ struct STDataType_test : public beast::unit_test::suite // Create from JSON Json::Value input; input[jss::type] = typeStr; - STDataType dt = dataTypeFromJson(sf, input); + STDataType const dt = dataTypeFromJson(sf, input); // Convert back to JSON Json::Value output = dt.getJson(JsonOptions::none); @@ -594,7 +594,7 @@ struct STDataType_test : public beast::unit_test::suite std::string expected; }; - TypeStringTest tests[] = { + TypeStringTest const tests[] = { {STI_UINT8, "UINT8"}, {STI_UINT16, "UINT16"}, {STI_UINT32, "UINT32"}, @@ -614,7 +614,7 @@ struct STDataType_test : public beast::unit_test::suite for (auto const& test : tests) { - STDataType dt(sf, test.type); + STDataType const dt(sf, test.type); BEAST_EXPECT(dt.getInnerTypeString() == test.expected); } } diff --git a/src/test/protocol/STData_test.cpp b/src/test/protocol/STData_test.cpp index afc929983d2..c1451fa6f1e 100644 --- a/src/test/protocol/STData_test.cpp +++ b/src/test/protocol/STData_test.cpp @@ -17,7 +17,7 @@ struct STData_test : public beast::unit_test::suite // Default constructor { - STData data(sf); + STData const data(sf); BEAST_EXPECT(data.getSType() == STI_DATA); BEAST_EXPECT(data.isDefault()); } @@ -25,82 +25,82 @@ struct STData_test : public beast::unit_test::suite // Type-specific constructors { // UINT8 - STData data_u8(sf, static_cast(8)); + STData const data_u8(sf, static_cast(8)); BEAST_EXPECT(data_u8.getFieldU8() == 8); BEAST_EXPECT(data_u8.getInnerTypeString() == "UINT8"); BEAST_EXPECT(data_u8.isDefault()); // UINT16 - STData data_u16(sf, static_cast(16)); + STData const data_u16(sf, static_cast(16)); BEAST_EXPECT(data_u16.getFieldU16() == 16); BEAST_EXPECT(data_u16.getInnerTypeString() == "UINT16"); // UINT32 - STData data_u32(sf, static_cast(32)); + STData const data_u32(sf, static_cast(32)); BEAST_EXPECT(data_u32.getFieldU32() == 32); BEAST_EXPECT(data_u32.getInnerTypeString() == "UINT32"); // UINT64 - STData data_u64(sf, static_cast(64)); + STData const data_u64(sf, static_cast(64)); BEAST_EXPECT(data_u64.getFieldU64() == 64); BEAST_EXPECT(data_u64.getInnerTypeString() == "UINT64"); // UINT128 - uint128 val128 = uint128(1); - STData data_u128(sf, val128); + uint128 const val128 = uint128(1); + STData const data_u128(sf, val128); BEAST_EXPECT(data_u128.getFieldH128() == val128); BEAST_EXPECT(data_u128.getInnerTypeString() == "UINT128"); // UINT160 - uint160 val160 = uint160(1); - STData data_u160(sf, val160); + uint160 const val160 = uint160(1); + STData const data_u160(sf, val160); BEAST_EXPECT(data_u160.getFieldH160() == val160); BEAST_EXPECT(data_u160.getInnerTypeString() == "UINT160"); // UINT192 - uint192 val192 = uint192(1); - STData data_u192(sf, val192); + uint192 const val192 = uint192(1); + STData const data_u192(sf, val192); BEAST_EXPECT(data_u192.getFieldH192() == val192); BEAST_EXPECT(data_u192.getInnerTypeString() == "UINT192"); // UINT256 - uint256 val256 = uint256(1); - STData data_u256(sf, val256); + uint256 const val256 = uint256(1); + STData const data_u256(sf, val256); BEAST_EXPECT(data_u256.getFieldH256() == val256); BEAST_EXPECT(data_u256.getInnerTypeString() == "UINT256"); // Blob - Blob blob = strUnHex("DEADBEEFCAFEBABE").value(); - STData data_blob(sf, blob); + Blob const blob = strUnHex("DEADBEEFCAFEBABE").value(); + STData const data_blob(sf, blob); BEAST_EXPECT(data_blob.getFieldVL() == blob); BEAST_EXPECT(data_blob.getInnerTypeString() == "VL"); // Slice std::string test_str = "Hello World"; - Slice slice(test_str.data(), test_str.size()); - STData data_slice(sf, slice); - Blob expected_blob(test_str.begin(), test_str.end()); + Slice const slice(test_str.data(), test_str.size()); + STData const data_slice(sf, slice); + Blob const expected_blob(test_str.begin(), test_str.end()); BEAST_EXPECT(data_slice.getFieldVL() == expected_blob); // AccountID - AccountID account(0x123456789ABCDEF0); - STData data_account(sf, account); + AccountID const account(0x123456789ABCDEF0); + STData const data_account(sf, account); BEAST_EXPECT(data_account.getAccountID() == account); BEAST_EXPECT(data_account.getInnerTypeString() == "ACCOUNT"); // STAmount (Native) - STAmount amount_native(1000); - STData data_amount_native(sf, amount_native); + STAmount const amount_native(1000); + STData const data_amount_native(sf, amount_native); BEAST_EXPECT(data_amount_native.getFieldAmount() == amount_native); BEAST_EXPECT(data_amount_native.getInnerTypeString() == "AMOUNT"); // STAmount (IOU) - IOUAmount iou_amount(5000); + IOUAmount const iou_amount(5000); Issue const usd( Currency(0x5553440000000000), parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value()); - STAmount amount_iou(iou_amount, usd); - STData data_amount_iou(sf, amount_iou); + STAmount const amount_iou(iou_amount, usd); + STData const data_amount_iou(sf, amount_iou); BEAST_EXPECT(data_amount_iou.getFieldAmount() == amount_iou); } } @@ -115,14 +115,14 @@ struct STData_test : public beast::unit_test::suite // Test each type's serialization and deserialization round-trip { // UINT8 - std::uint8_t original_u8 = 8; - STData data_u8(sf, original_u8); + std::uint8_t const original_u8 = 8; + STData const data_u8(sf, original_u8); Serializer s; data_u8.add(s); SerialIter sit(s.slice()); - STData deserialized_u8(sit, sf); + STData const deserialized_u8(sit, sf); BEAST_EXPECT(deserialized_u8.getFieldU8() == original_u8); BEAST_EXPECT(deserialized_u8.getInnerTypeString() == "UINT8"); @@ -130,14 +130,14 @@ struct STData_test : public beast::unit_test::suite { // UINT16 - std::uint16_t original_u16 = 16; - STData data_u16(sf, original_u16); + std::uint16_t const original_u16 = 16; + STData const data_u16(sf, original_u16); Serializer s; data_u16.add(s); SerialIter sit(s.slice()); - STData deserialized_u16(sit, sf); + STData const deserialized_u16(sit, sf); BEAST_EXPECT(deserialized_u16.getFieldU16() == original_u16); BEAST_EXPECT(deserialized_u16.getInnerTypeString() == "UINT16"); @@ -145,14 +145,14 @@ struct STData_test : public beast::unit_test::suite { // UINT32 - std::uint32_t original_u32 = 32; - STData data_u32(sf, original_u32); + std::uint32_t const original_u32 = 32; + STData const data_u32(sf, original_u32); Serializer s; data_u32.add(s); SerialIter sit(s.slice()); - STData deserialized_u32(sit, sf); + STData const deserialized_u32(sit, sf); BEAST_EXPECT(deserialized_u32.getFieldU32() == original_u32); BEAST_EXPECT(deserialized_u32.getInnerTypeString() == "UINT32"); @@ -160,14 +160,14 @@ struct STData_test : public beast::unit_test::suite { // UINT64 - std::uint64_t original_u64 = 64; - STData data_u64(sf, original_u64); + std::uint64_t const original_u64 = 64; + STData const data_u64(sf, original_u64); Serializer s; data_u64.add(s); SerialIter sit(s.slice()); - STData deserialized_u64(sit, sf); + STData const deserialized_u64(sit, sf); BEAST_EXPECT(deserialized_u64.getFieldU64() == original_u64); BEAST_EXPECT(deserialized_u64.getInnerTypeString() == "UINT64"); @@ -175,14 +175,14 @@ struct STData_test : public beast::unit_test::suite { // UINT128 - uint128 original_u128 = uint128(1); - STData data_u128(sf, original_u128); + uint128 const original_u128 = uint128(1); + STData const data_u128(sf, original_u128); Serializer s; data_u128.add(s); SerialIter sit(s.slice()); - STData deserialized_u128(sit, sf); + STData const deserialized_u128(sit, sf); BEAST_EXPECT(deserialized_u128.getFieldH128() == original_u128); BEAST_EXPECT(deserialized_u128.getInnerTypeString() == "UINT128"); @@ -190,14 +190,14 @@ struct STData_test : public beast::unit_test::suite { // UINT160 - uint160 original_u160 = uint160(1); - STData data_u160(sf, original_u160); + uint160 const original_u160 = uint160(1); + STData const data_u160(sf, original_u160); Serializer s; data_u160.add(s); SerialIter sit(s.slice()); - STData deserialized_u160(sit, sf); + STData const deserialized_u160(sit, sf); BEAST_EXPECT(deserialized_u160.getFieldH160() == original_u160); BEAST_EXPECT(deserialized_u160.getInnerTypeString() == "UINT160"); @@ -205,14 +205,14 @@ struct STData_test : public beast::unit_test::suite { // UINT192 - uint192 original_u192 = uint192(1); - STData data_u192(sf, original_u192); + uint192 const original_u192 = uint192(1); + STData const data_u192(sf, original_u192); Serializer s; data_u192.add(s); SerialIter sit(s.slice()); - STData deserialized_u192(sit, sf); + STData const deserialized_u192(sit, sf); BEAST_EXPECT(deserialized_u192.getFieldH192() == original_u192); BEAST_EXPECT(deserialized_u192.getInnerTypeString() == "UINT192"); @@ -220,14 +220,14 @@ struct STData_test : public beast::unit_test::suite { // UINT256 - uint256 original_u256 = uint256(1); - STData data_u256(sf, original_u256); + uint256 const original_u256 = uint256(1); + STData const data_u256(sf, original_u256); Serializer s; data_u256.add(s); SerialIter sit(s.slice()); - STData deserialized_u256(sit, sf); + STData const deserialized_u256(sit, sf); BEAST_EXPECT(deserialized_u256.getFieldH256() == original_u256); BEAST_EXPECT(deserialized_u256.getInnerTypeString() == "UINT256"); @@ -235,14 +235,14 @@ struct STData_test : public beast::unit_test::suite { // VL (Variable Length) - Blob original_blob = strUnHex("DEADBEEFCAFEBABE1234567890ABCDEF").value(); - STData data_vl(sf, original_blob); + Blob const original_blob = strUnHex("DEADBEEFCAFEBABE1234567890ABCDEF").value(); + STData const data_vl(sf, original_blob); Serializer s; data_vl.add(s); SerialIter sit(s.slice()); - STData deserialized_vl(sit, sf); + STData const deserialized_vl(sit, sf); BEAST_EXPECT(deserialized_vl.getFieldVL() == original_blob); BEAST_EXPECT(deserialized_vl.getInnerTypeString() == "VL"); @@ -250,14 +250,14 @@ struct STData_test : public beast::unit_test::suite { // ACCOUNT - AccountID original_account(0xFEDCBA9876543210); - STData data_account(sf, original_account); + AccountID const original_account(0xFEDCBA9876543210); + STData const data_account(sf, original_account); Serializer s; data_account.add(s); SerialIter sit(s.slice()); - STData deserialized_account(sit, sf); + STData const deserialized_account(sit, sf); BEAST_EXPECT(deserialized_account.getAccountID() == original_account); BEAST_EXPECT(deserialized_account.getInnerTypeString() == "ACCOUNT"); @@ -265,14 +265,14 @@ struct STData_test : public beast::unit_test::suite { // AMOUNT (Native) - STAmount original_amount(99999); - STData data_amount(sf, original_amount); + STAmount const original_amount(99999); + STData const data_amount(sf, original_amount); Serializer s; data_amount.add(s); SerialIter sit(s.slice()); - STData deserialized_amount(sit, sf); + STData const deserialized_amount(sit, sf); BEAST_EXPECT(deserialized_amount.getFieldAmount() == original_amount); BEAST_EXPECT(deserialized_amount.getInnerTypeString() == "AMOUNT"); @@ -302,7 +302,7 @@ struct STData_test : public beast::unit_test::suite // Test all setter/getter combinations { // UINT8 - unsigned char val_u8 = 8; + unsigned char const val_u8 = 8; data.setFieldU8(val_u8); BEAST_EXPECT(data.getFieldU8() == val_u8); BEAST_EXPECT(data.getInnerTypeString() == "UINT8"); @@ -310,7 +310,7 @@ struct STData_test : public beast::unit_test::suite { // UINT16 - std::uint16_t val_u16 = 16; + std::uint16_t const val_u16 = 16; data.setFieldU16(val_u16); BEAST_EXPECT(data.getFieldU16() == val_u16); BEAST_EXPECT(data.getInnerTypeString() == "UINT16"); @@ -318,7 +318,7 @@ struct STData_test : public beast::unit_test::suite { // UINT32 - std::uint32_t val_u32 = 32; + std::uint32_t const val_u32 = 32; data.setFieldU32(val_u32); BEAST_EXPECT(data.getFieldU32() == val_u32); BEAST_EXPECT(data.getInnerTypeString() == "UINT32"); @@ -326,7 +326,7 @@ struct STData_test : public beast::unit_test::suite { // UINT64 - std::uint64_t val_u64 = 64; + std::uint64_t const val_u64 = 64; data.setFieldU64(val_u64); BEAST_EXPECT(data.getFieldU64() == val_u64); BEAST_EXPECT(data.getInnerTypeString() == "UINT64"); @@ -334,7 +334,7 @@ struct STData_test : public beast::unit_test::suite { // UINT128 - uint128 val_u128 = uint128(1); + uint128 const val_u128 = uint128(1); data.setFieldH128(val_u128); BEAST_EXPECT(data.getFieldH128() == val_u128); BEAST_EXPECT(data.getInnerTypeString() == "UINT128"); @@ -342,7 +342,7 @@ struct STData_test : public beast::unit_test::suite { // UINT160 - uint160 val_u160 = uint160(1); + uint160 const val_u160 = uint160(1); data.setFieldH160(val_u160); BEAST_EXPECT(data.getFieldH160() == val_u160); BEAST_EXPECT(data.getInnerTypeString() == "UINT160"); @@ -350,7 +350,7 @@ struct STData_test : public beast::unit_test::suite { // UINT192 - uint192 val_u192 = uint192(1); + uint192 const val_u192 = uint192(1); data.setFieldH192(val_u192); BEAST_EXPECT(data.getFieldH192() == val_u192); BEAST_EXPECT(data.getInnerTypeString() == "UINT192"); @@ -358,7 +358,7 @@ struct STData_test : public beast::unit_test::suite { // UINT256 - uint256 val_u256 = uint256(1); + uint256 const val_u256 = uint256(1); data.setFieldH256(val_u256); BEAST_EXPECT(data.getFieldH256() == val_u256); BEAST_EXPECT(data.getInnerTypeString() == "UINT256"); @@ -366,7 +366,7 @@ struct STData_test : public beast::unit_test::suite { // VL (Variable Length) - Blob - Blob val_blob = strUnHex("0102030405060708090A0B0C0D0E0F10").value(); + Blob const val_blob = strUnHex("0102030405060708090A0B0C0D0E0F10").value(); data.setFieldVL(val_blob); BEAST_EXPECT(data.getFieldVL() == val_blob); BEAST_EXPECT(data.getInnerTypeString() == "VL"); @@ -375,16 +375,16 @@ struct STData_test : public beast::unit_test::suite { // VL (Variable Length) - Slice std::string test_str = "Test String for Slice"; - Slice val_slice(test_str.data(), test_str.size()); + Slice const val_slice(test_str.data(), test_str.size()); data.setFieldVL(val_slice); - Blob expected_blob(test_str.begin(), test_str.end()); + Blob const expected_blob(test_str.begin(), test_str.end()); BEAST_EXPECT(data.getFieldVL() == expected_blob); BEAST_EXPECT(data.getInnerTypeString() == "VL"); } { // ACCOUNT - AccountID val_account(0x123456789ABCDEF0); + AccountID const val_account(0x123456789ABCDEF0); data.setAccountID(val_account); BEAST_EXPECT(data.getAccountID() == val_account); BEAST_EXPECT(data.getInnerTypeString() == "ACCOUNT"); @@ -392,7 +392,7 @@ struct STData_test : public beast::unit_test::suite { // AMOUNT - STAmount val_amount(777777); + STAmount const val_amount(777777); data.setFieldAmount(val_amount); BEAST_EXPECT(data.getFieldAmount() == val_amount); BEAST_EXPECT(data.getInnerTypeString() == "AMOUNT"); @@ -421,7 +421,7 @@ struct STData_test : public beast::unit_test::suite // Test JSON serialization for each type { // UINT8 - STData data_u8(sf, static_cast(8)); + STData const data_u8(sf, static_cast(8)); Json::Value json_u8 = data_u8.getJson(JsonOptions::none); BEAST_EXPECT(json_u8[jss::type].asString() == "UINT8"); BEAST_EXPECT(json_u8[jss::value].asUInt() == 8); @@ -429,7 +429,7 @@ struct STData_test : public beast::unit_test::suite { // UINT16 - STData data_u16(sf, static_cast(16)); + STData const data_u16(sf, static_cast(16)); Json::Value json_u16 = data_u16.getJson(JsonOptions::none); BEAST_EXPECT(json_u16[jss::type].asString() == "UINT16"); BEAST_EXPECT(json_u16[jss::value].asUInt() == 16); @@ -437,7 +437,7 @@ struct STData_test : public beast::unit_test::suite { // UINT32 - STData data_u32(sf, static_cast(32)); + STData const data_u32(sf, static_cast(32)); Json::Value json_u32 = data_u32.getJson(JsonOptions::none); BEAST_EXPECT(json_u32[jss::type].asString() == "UINT32"); BEAST_EXPECT(json_u32[jss::value].asUInt() == 32); @@ -445,7 +445,7 @@ struct STData_test : public beast::unit_test::suite { // UINT64 - STData data_u64(sf, static_cast(64)); + STData const data_u64(sf, static_cast(64)); Json::Value json_u64 = data_u64.getJson(JsonOptions::none); BEAST_EXPECT(json_u64[jss::type].asString() == "UINT64"); BEAST_EXPECT(json_u64[jss::value].asString() == "40"); @@ -453,8 +453,8 @@ struct STData_test : public beast::unit_test::suite { // UINT128 - uint128 val_u128 = uint128(1); - STData data_u128(sf, val_u128); + uint128 const val_u128 = uint128(1); + STData const data_u128(sf, val_u128); Json::Value json_u128 = data_u128.getJson(JsonOptions::none); BEAST_EXPECT(json_u128[jss::type].asString() == "UINT128"); BEAST_EXPECT(json_u128[jss::value].asString() == "00000000000000000000000000000001"); @@ -462,8 +462,8 @@ struct STData_test : public beast::unit_test::suite { // UINT160 - uint160 val_u160 = uint160(1); - STData data_u160(sf, val_u160); + uint160 const val_u160 = uint160(1); + STData const data_u160(sf, val_u160); Json::Value json_u160 = data_u160.getJson(JsonOptions::none); BEAST_EXPECT(json_u160[jss::type].asString() == "UINT160"); BEAST_EXPECT( @@ -472,8 +472,8 @@ struct STData_test : public beast::unit_test::suite { // UINT192 - uint192 val_u192 = uint192(1); - STData data_u192(sf, val_u192); + uint192 const val_u192 = uint192(1); + STData const data_u192(sf, val_u192); Json::Value json_u192 = data_u192.getJson(JsonOptions::none); BEAST_EXPECT(json_u192[jss::type].asString() == "UINT192"); BEAST_EXPECT( @@ -483,8 +483,8 @@ struct STData_test : public beast::unit_test::suite { // UINT256 - uint256 val_u256 = uint256(1); - STData data_u256(sf, val_u256); + uint256 const val_u256 = uint256(1); + STData const data_u256(sf, val_u256); Json::Value json_u256 = data_u256.getJson(JsonOptions::none); BEAST_EXPECT(json_u256[jss::type].asString() == "UINT256"); BEAST_EXPECT( @@ -495,8 +495,8 @@ struct STData_test : public beast::unit_test::suite { // VL - Blob blob = strUnHex("DEADBEEF").value(); - STData data_vl(sf, blob); + Blob const blob = strUnHex("DEADBEEF").value(); + STData const data_vl(sf, blob); Json::Value json_vl = data_vl.getJson(JsonOptions::none); BEAST_EXPECT(json_vl[jss::type].asString() == "VL"); BEAST_EXPECT(json_vl[jss::value].asString() == "DEADBEEF"); @@ -504,8 +504,8 @@ struct STData_test : public beast::unit_test::suite { // ACCOUNT - AccountID account(0x123456789ABCDEF0); - STData data_account(sf, account); + AccountID const account(0x123456789ABCDEF0); + STData const data_account(sf, account); Json::Value json_account = data_account.getJson(JsonOptions::none); BEAST_EXPECT(json_account[jss::type].asString() == "ACCOUNT"); BEAST_EXPECT(json_account[jss::value].asString() == "rrrrrrrrrrrrrLveWzSkxhcH3hGw6"); @@ -513,8 +513,8 @@ struct STData_test : public beast::unit_test::suite { // AMOUNT - STAmount amount(1000); - STData data_amount(sf, amount); + STAmount const amount(1000); + STData const data_amount(sf, amount); Json::Value json_amount = data_amount.getJson(JsonOptions::none); BEAST_EXPECT(json_amount[jss::type].asString() == "AMOUNT"); BEAST_EXPECT(json_amount[jss::value].asString() == "1000"); @@ -547,7 +547,7 @@ struct STData_test : public beast::unit_test::suite json_u8[jss::type] = "UINT8"; json_u8[jss::value] = 8; - STData data_u8 = dataFromJson(sf, json_u8); + STData const data_u8 = dataFromJson(sf, json_u8); BEAST_EXPECT(data_u8.getFieldU8() == 8); BEAST_EXPECT(data_u8.getInnerTypeString() == "UINT8"); } @@ -558,7 +558,7 @@ struct STData_test : public beast::unit_test::suite json_u16[jss::type] = "UINT16"; json_u16[jss::value] = 16; - STData data_u16 = dataFromJson(sf, json_u16); + STData const data_u16 = dataFromJson(sf, json_u16); BEAST_EXPECT(data_u16.getFieldU16() == 16); BEAST_EXPECT(data_u16.getInnerTypeString() == "UINT16"); } @@ -569,7 +569,7 @@ struct STData_test : public beast::unit_test::suite json_u32[jss::type] = "UINT32"; json_u32[jss::value] = 32; - STData data_u32 = dataFromJson(sf, json_u32); + STData const data_u32 = dataFromJson(sf, json_u32); BEAST_EXPECT(data_u32.getFieldU32() == 32); BEAST_EXPECT(data_u32.getInnerTypeString() == "UINT32"); } @@ -579,7 +579,7 @@ struct STData_test : public beast::unit_test::suite Json::Value json_u64(Json::objectValue); json_u64[jss::type] = "UINT64"; json_u64[jss::value] = 64; - STData data_u64 = dataFromJson(sf, json_u64); + STData const data_u64 = dataFromJson(sf, json_u64); BEAST_EXPECT(data_u64.getFieldU64() == 64); BEAST_EXPECT(data_u64.getInnerTypeString() == "UINT64"); } @@ -589,9 +589,9 @@ struct STData_test : public beast::unit_test::suite Json::Value json_u128(Json::objectValue); json_u128[jss::type] = "UINT128"; json_u128[jss::value] = "00000000000000000000000000000001"; - STData data_u128 = dataFromJson(sf, json_u128); + STData const data_u128 = dataFromJson(sf, json_u128); uint128 expected; - bool ok = expected.parseHex("00000000000000000000000000000001"); + bool const ok = expected.parseHex("00000000000000000000000000000001"); BEAST_EXPECT(ok); BEAST_EXPECT(data_u128.getFieldH128() == expected); BEAST_EXPECT(data_u128.getInnerTypeString() == "UINT128"); @@ -602,9 +602,9 @@ struct STData_test : public beast::unit_test::suite Json::Value json_u160(Json::objectValue); json_u160[jss::type] = "UINT160"; json_u160[jss::value] = "0000000000000000000000000000000000000001"; - STData data_u160 = dataFromJson(sf, json_u160); + STData const data_u160 = dataFromJson(sf, json_u160); uint160 expected; - bool ok = expected.parseHex("0000000000000000000000000000000000000001"); + bool const ok = expected.parseHex("0000000000000000000000000000000000000001"); BEAST_EXPECT(ok); BEAST_EXPECT(data_u160.getFieldH160() == expected); BEAST_EXPECT(data_u160.getInnerTypeString() == "UINT160"); @@ -615,9 +615,9 @@ struct STData_test : public beast::unit_test::suite Json::Value json_u192(Json::objectValue); json_u192[jss::type] = "UINT192"; json_u192[jss::value] = "000000000000000000000000000000000000000000000001"; - STData data_u192 = dataFromJson(sf, json_u192); + STData const data_u192 = dataFromJson(sf, json_u192); uint192 expected; - bool ok = expected.parseHex("000000000000000000000000000000000000000000000001"); + bool const ok = expected.parseHex("000000000000000000000000000000000000000000000001"); BEAST_EXPECT(ok); BEAST_EXPECT(data_u192.getFieldH192() == expected); BEAST_EXPECT(data_u192.getInnerTypeString() == "UINT192"); @@ -630,9 +630,9 @@ struct STData_test : public beast::unit_test::suite json_u256[jss::value] = "00000000000000000000000000000000000000000000000000000000000000" "01"; - STData data_u256 = dataFromJson(sf, json_u256); + STData const data_u256 = dataFromJson(sf, json_u256); uint256 expected; - bool ok = expected.parseHex( + bool const ok = expected.parseHex( "00000000000000000000000000000000000000000000000000000000000000" "01"); BEAST_EXPECT(ok); @@ -646,8 +646,8 @@ struct STData_test : public beast::unit_test::suite json_vl[jss::type] = "VL"; json_vl[jss::value] = "DEADBEEFCAFEBABE"; - STData data_vl = dataFromJson(sf, json_vl); - Blob expected_blob = strUnHex("DEADBEEFCAFEBABE").value(); + STData const data_vl = dataFromJson(sf, json_vl); + Blob const expected_blob = strUnHex("DEADBEEFCAFEBABE").value(); BEAST_EXPECT(data_vl.getFieldVL() == expected_blob); BEAST_EXPECT(data_vl.getInnerTypeString() == "VL"); } @@ -658,8 +658,8 @@ struct STData_test : public beast::unit_test::suite json_account[jss::type] = "ACCOUNT"; json_account[jss::value] = "rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn"; - STData data_account = dataFromJson(sf, json_account); - AccountID expected_account = + STData const data_account = dataFromJson(sf, json_account); + AccountID const expected_account = parseBase58("rG1QQv2nh2gr7RCZ1P8YYcBUKCCN633jCn").value(); BEAST_EXPECT(data_account.getAccountID() == expected_account); BEAST_EXPECT(data_account.getInnerTypeString() == "ACCOUNT"); @@ -671,8 +671,8 @@ struct STData_test : public beast::unit_test::suite json_amount[jss::type] = "AMOUNT"; json_amount[jss::value] = "1000"; - STData data_amount = dataFromJson(sf, json_amount); - STAmount expected_amount(1000); + STData const data_amount = dataFromJson(sf, json_amount); + STAmount const expected_amount(1000); BEAST_EXPECT(data_amount.getFieldAmount() == expected_amount); BEAST_EXPECT(data_amount.getInnerTypeString() == "AMOUNT"); } diff --git a/src/test/protocol/STJson_test.cpp b/src/test/protocol/STJson_test.cpp index 8fd19feb8bf..f90c5b4e81e 100644 --- a/src/test/protocol/STJson_test.cpp +++ b/src/test/protocol/STJson_test.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -32,7 +33,7 @@ struct STJson_test : public beast::unit_test::suite testDefaultConstructor() { testcase("Default constructor"); - STJson json; + STJson const json; BEAST_EXPECT(json.isObject()); BEAST_EXPECT(!json.isArray()); BEAST_EXPECT(json.getMap().empty()); @@ -62,7 +63,7 @@ struct STJson_test : public beast::unit_test::suite testcase("Move constructor (Object)"); STJson::Map map; map["bar"] = std::make_shared(sfTransactionType, 42); - STJson json(std::move(map)); + STJson const json(std::move(map)); BEAST_EXPECT(json.isObject()); BEAST_EXPECT(json.getMap().size() == 1); BEAST_EXPECT(std::dynamic_pointer_cast(json.getMap().at("bar"))->value() == 42); @@ -76,7 +77,7 @@ struct STJson_test : public beast::unit_test::suite arr.push_back(std::make_shared(sfNetworkID, 100)); arr.push_back(std::make_shared(sfNetworkID, 200)); - STJson json(std::move(arr)); + STJson const json(std::move(arr)); BEAST_EXPECT(json.isArray()); BEAST_EXPECT(!json.isObject()); BEAST_EXPECT(json.arraySize() == 2); @@ -90,12 +91,12 @@ struct STJson_test : public beast::unit_test::suite testTypeChecking() { testcase("Type checking methods"); - STJson objJson; + STJson const objJson; BEAST_EXPECT(objJson.isObject()); BEAST_EXPECT(!objJson.isArray()); BEAST_EXPECT(objJson.getType() == STJson::JsonType::Object); - STJson arrJson(STJson::Array{}); + STJson const arrJson(STJson::Array{}); BEAST_EXPECT(arrJson.isArray()); BEAST_EXPECT(!arrJson.isObject()); BEAST_EXPECT(arrJson.getType() == STJson::JsonType::Array); @@ -469,11 +470,13 @@ struct STJson_test : public beast::unit_test::suite STJson json; json.setObjectField("foo", std::make_shared(sfTransactionType, 65535)); json.setObjectField("bar", nullptr); // test null value + json.setNestedObjectField("meta", "version", std::make_shared(sfNetworkID, 2)); Json::Value jv = json.getJson(JsonOptions::none); BEAST_EXPECT(jv.isObject()); - BEAST_EXPECT(jv["foo"].asUInt() == 65535); - BEAST_EXPECT(jv["bar"].isNull()); + BEAST_EXPECT(jv[strHex(std::string{"foo"})].asUInt() == 65535); + BEAST_EXPECT(jv[strHex(std::string{"bar"})].isNull()); + BEAST_EXPECT(jv[strHex(std::string{"meta"})][strHex(std::string{"version"})].asUInt() == 2); } void @@ -631,7 +634,7 @@ struct STJson_test : public beast::unit_test::suite { STJson json; // XRP amount - STAmount xrp(sfAmount, static_cast(123456789u)); + STAmount const xrp(sfAmount, static_cast(123456789u)); json.setObjectField("amount", std::make_shared(xrp)); Serializer s; json.add(s); @@ -661,7 +664,7 @@ struct STJson_test : public beast::unit_test::suite { STJson json; // Use a known AccountID (20 bytes) - AccountID acct = AccountID{}; + AccountID const acct = AccountID{}; json.setObjectField("acct", std::make_shared(sfAccount, acct)); Serializer s; json.add(s); @@ -690,7 +693,7 @@ struct STJson_test : public beast::unit_test::suite { STJson innerJson; // XRP amount - STAmount xrp(sfAmount, static_cast(123456789u)); + STAmount const xrp(sfAmount, static_cast(123456789u)); innerJson.setObjectField("amount", std::make_shared(xrp)); STJson json; @@ -713,7 +716,7 @@ struct STJson_test : public beast::unit_test::suite // Empty object { - STJson json; + STJson const json; Serializer s; json.add(s); auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); @@ -723,7 +726,7 @@ struct STJson_test : public beast::unit_test::suite // Empty array { - STJson json(STJson::Array{}); + STJson const json(STJson::Array{}); Serializer s; json.add(s); auto parsed = STJson::fromBlob(s.peekData().data(), s.peekData().size()); @@ -749,14 +752,13 @@ struct STJson_test : public beast::unit_test::suite BEAST_EXPECT(*elem1 != nullptr); } - // Object with null value + // Object with null value - getObjectField treats null as absent { STJson json; json.setObjectField("null_field", nullptr); auto val = json.getObjectField("null_field"); - BEAST_EXPECT(val.has_value()); - BEAST_EXPECT(*val == nullptr); + BEAST_EXPECT(!val.has_value()); } } diff --git a/src/test/rpc/Subscribe_test.cpp b/src/test/rpc/Subscribe_test.cpp index 33876b9dbb9..be412b36cd8 100644 --- a/src/test/rpc/Subscribe_test.cpp +++ b/src/test/rpc/Subscribe_test.cpp @@ -484,6 +484,9 @@ class Subscribe_test : public beast::unit_test::suite if (jv.isMember(jss::extension_size) != isFlagLedger) return false; + + if (jv.isMember(jss::gas_price) != isFlagLedger) + return false; } else { @@ -492,6 +495,9 @@ class Subscribe_test : public beast::unit_test::suite if (jv.isMember(jss::extension_size)) return false; + + if (jv.isMember(jss::gas_price)) + return false; } return true; }; diff --git a/src/xrpld/app/misc/NetworkOPs.cpp b/src/xrpld/app/misc/NetworkOPs.cpp index a2c13bcd7b9..4006901c5c1 100644 --- a/src/xrpld/app/misc/NetworkOPs.cpp +++ b/src/xrpld/app/misc/NetworkOPs.cpp @@ -2278,7 +2278,7 @@ NetworkOPsImp::pubConsensus(ConsensusPhase phase) void NetworkOPsImp::pubContractEvent(std::string const& name, STJson const& event) { - std::lock_guard sl(mSubLock); + std::lock_guard const sl(mSubLock); auto& streamMap = mStreamMaps[sContractEvents]; if (!streamMap.empty()) @@ -4269,7 +4269,7 @@ NetworkOPsImp::unsubConsensus(std::uint64_t uSeq) bool NetworkOPsImp::subContractEvent(InfoSub::ref isrListener) { - std::lock_guard sl(mSubLock); + std::lock_guard const sl(mSubLock); return mStreamMaps[sContractEvents].emplace(isrListener->getSeq(), isrListener).second; } @@ -4277,7 +4277,7 @@ NetworkOPsImp::subContractEvent(InfoSub::ref isrListener) bool NetworkOPsImp::unsubContractEvent(std::uint64_t uSeq) { - std::lock_guard sl(mSubLock); + std::lock_guard const sl(mSubLock); return mStreamMaps[sContractEvents].erase(uSeq); } diff --git a/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp b/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp index 2c7c43dbe89..cdca7cc5eaf 100644 --- a/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp +++ b/src/xrpld/app/wasm/detail/ContractHostFuncImpl.cpp @@ -19,13 +19,13 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_UINT8: { if (funcParam.getInnerSType() != STI_UINT8) return Unexpected(HostFunctionError::INVALID_PARAMS); - uint8_t data = funcParam.getFieldU8(); + uint8_t const data = funcParam.getFieldU8(); return Bytes{data}; } case STI_UINT16: { if (funcParam.getInnerSType() != STI_UINT16) return Unexpected(HostFunctionError::INVALID_PARAMS); - uint16_t data = funcParam.getFieldU16(); + uint16_t const data = funcParam.getFieldU16(); return Bytes{ static_cast(data & 0xFF), static_cast((data >> 8) & 0xFF)}; @@ -33,7 +33,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_UINT32: { if (funcParam.getInnerSType() != STI_UINT32) return Unexpected(HostFunctionError::INVALID_PARAMS); - uint32_t data = funcParam.getFieldU32(); + uint32_t const data = funcParam.getFieldU32(); return Bytes{ static_cast(data & 0xFF), static_cast((data >> 8) & 0xFF), @@ -43,7 +43,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_UINT64: { if (funcParam.getInnerSType() != STI_UINT64) return Unexpected(HostFunctionError::INVALID_PARAMS); - uint64_t data = funcParam.getFieldU64(); + uint64_t const data = funcParam.getFieldU64(); return Bytes{ static_cast(data & 0xFF), static_cast((data >> 8) & 0xFF), @@ -95,7 +95,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_AMOUNT: { if (funcParam.getInnerSType() != STI_AMOUNT) return Unexpected(HostFunctionError::INVALID_PARAMS); - STAmount data = funcParam.getFieldAmount(); + STAmount const data = funcParam.getFieldAmount(); Serializer s; data.add(s); auto const& serialized = s.getData(); @@ -104,7 +104,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_NUMBER: { if (funcParam.getInnerSType() != STI_NUMBER) return Unexpected(HostFunctionError::INVALID_PARAMS); - STNumber data = funcParam.getFieldNumber(); + STNumber const data = funcParam.getFieldNumber(); Serializer s; data.add(s); auto const& serialized = s.getData(); @@ -113,7 +113,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_ISSUE: { if (funcParam.getInnerSType() != STI_ISSUE) return Unexpected(HostFunctionError::INVALID_PARAMS); - STIssue data = funcParam.getFieldIssue(); + STIssue const data = funcParam.getFieldIssue(); Serializer s; data.add(s); auto const& serialized = s.getData(); @@ -122,7 +122,7 @@ getFieldBytesFromSTData(xrpl::STData const& funcParam, std::uint32_t stTypeId) case STI_CURRENCY: { if (funcParam.getInnerSType() != STI_CURRENCY) return Unexpected(HostFunctionError::INVALID_PARAMS); - STCurrency data = funcParam.getFieldCurrency(); + STCurrency const data = funcParam.getFieldCurrency(); Serializer s; data.add(s); auto const& serialized = s.getData(); @@ -198,12 +198,12 @@ getDataOrCache(ContractContext& contractCtx, AccountID const& account) if (dataSle) { // Return the STJson from the SLE - STJson data = dataSle->getFieldJson(sfContractJson); + STJson const data = dataSle->getFieldJson(sfContractJson); return {data.isObject(), data}; } // Return New STJson if not found - STJson data; + STJson const data; return {true, data}; } @@ -231,7 +231,7 @@ setDataCache( return HostFunctionError::INVALID_ACCOUNT; } - uint32_t maxDataModifications = 1000u; + uint32_t const maxDataModifications = 1000u; if (modified && dataMap.modifiedCount >= maxDataModifications) { @@ -243,7 +243,7 @@ setDataCache( if (dataMap.find(account) == dataMap.end()) { auto const& fees = contractCtx.applyCtx.view().fees(); - STAmount bal = sleAccount->getFieldAmount(sfBalance); + STAmount const bal = sleAccount->getFieldAmount(sfBalance); int64_t availableForReserves = bal.xrp().drops() - fees.accountReserve(sleAccount->getFieldU32(sfOwnerCount)).drops(); @@ -465,7 +465,7 @@ ContractHostFunctionsImpl::setDataObjectField( } data.setObjectField(std::string(key), value); - if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + if (HostFunctionError const ret = setDataCache(contractCtx, account, data, j, true); ret != HostFunctionError::SUCCESS) { JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " @@ -502,7 +502,7 @@ ContractHostFunctionsImpl::setDataNestedObjectField( } data.setNestedObjectField(std::string(key), std::string(nestedKey), value); - if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + if (HostFunctionError const ret = setDataCache(contractCtx, account, data, j, true); ret != HostFunctionError::SUCCESS) { JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " @@ -761,7 +761,7 @@ ContractHostFunctionsImpl::setDataArrayElementField( } data.setArrayElementField(index, std::string(key), value); - if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + if (HostFunctionError const ret = setDataCache(contractCtx, account, data, j, true); ret != HostFunctionError::SUCCESS) { JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " @@ -801,7 +801,7 @@ ContractHostFunctionsImpl::setDataNestedArrayElementField( } data.setNestedArrayElementField(std::string(key), index, std::string(nestedKey), value); - if (HostFunctionError ret = setDataCache(contractCtx, account, data, j, true); + if (HostFunctionError const ret = setDataCache(contractCtx, account, data, j, true); ret != HostFunctionError::SUCCESS) { JLOG(j.trace()) << "WasmTrace[" << contractId << "]: " @@ -956,22 +956,28 @@ ContractHostFunctionsImpl::emitBuiltTxn(std::uint32_t const& index) return Unexpected(HostFunctionError::SUBMIT_TXN_FAILURE); } - OpenView wholeBatchView(batch_view, contractCtx.applyCtx.openView()); - auto applyOneTransaction = - [&app, &j, &parentBatchId, &wholeBatchView](std::shared_ptr const& tx) { - auto const pfResult = - preflight(app, wholeBatchView.rules(), parentBatchId, *tx, tapBATCH, j); - auto const ret = preclaim(pfResult, app, wholeBatchView); - JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << tx->getTransactionID() - << " " << transToken(ret.ter); - return ret; - }; - + // Use a persistent emit view that is seeded with the + // transactor's pending state changes (balances, consumed + // sequence, etc.) so that each emitted transaction validates + // against the full current state. A full apply() is used + // (matching the Batch inner-transaction pattern) so that + // sequence numbers, balances, owner counts, and all other + // ledger state are properly updated between successive emits. + auto& emitView = contractCtx.getEmitView(); auto const stx = tpTrans->getSTransaction(); - auto const result = applyOneTransaction(stx); - if (isTesSuccess(result.ter)) + + OpenView perTxView(batch_view, emitView); + auto const ret = apply(app, perTxView, parentBatchId, *stx, tapBATCH, j); + + JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << stx->getTransactionID() << " " + << transToken(ret.ter); + + if (ret.applied && (isTesSuccess(ret.ter) || isTecClaim(ret.ter))) + { + perTxView.apply(emitView); contractCtx.result.emittedTxns.push(stx); - return TERtoInt(result.ter); + } + return TERtoInt(ret.ter); } catch (std::exception const& e) { @@ -1005,23 +1011,25 @@ ContractHostFunctionsImpl::emitTxn(std::shared_ptr const& stxPtr) if (tpTrans->getStatus() != NEW) return Unexpected(HostFunctionError::SUBMIT_TXN_FAILURE); - OpenView wholeBatchView(batch_view, contractCtx.applyCtx.openView()); + // Use a persistent emit view seeded with the transactor's + // pending state, and do a full apply() for each emission + // (see emitBuiltTxn for detailed rationale). + auto& emitView = contractCtx.getEmitView(); auto const parentBatchId = parentTx.getTransactionID(); - auto applyOneTransaction = - [&app, &j, &parentBatchId, &wholeBatchView](std::shared_ptr const& tx) { - auto const pfResult = - preflight(app, wholeBatchView.rules(), parentBatchId, *tx, tapBATCH, j); - auto const ret = preclaim(pfResult, app, wholeBatchView); - JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << tx->getTransactionID() - << " " << transToken(ret.ter); - return ret; - }; - auto const stx = tpTrans->getSTransaction(); - auto const result = applyOneTransaction(stx); - if (isTesSuccess(result.ter)) + + OpenView perTxView(batch_view, emitView); + auto const ret = apply(app, perTxView, parentBatchId, *stx, tapBATCH, j); + + JLOG(j.trace()) << "WasmTrace[" << parentBatchId << "]: " << stx->getTransactionID() << " " + << transToken(ret.ter); + + if (ret.applied && (isTesSuccess(ret.ter) || isTecClaim(ret.ter))) + { + perTxView.apply(emitView); contractCtx.result.emittedTxns.push(stx); - return TERtoInt(result.ter); + } + return TERtoInt(ret.ter); } catch (std::exception const& e) { diff --git a/src/xrpld/core/Config.h b/src/xrpld/core/Config.h index 1b3a5fff03d..ba5357693e0 100644 --- a/src/xrpld/core/Config.h +++ b/src/xrpld/core/Config.h @@ -68,7 +68,11 @@ struct FeeSetup /* (Remember to update the example cfg files when changing any of these * values.) */ - /** Convert to a Fees object for use with Ledger construction. */ + /** Convert to a Fees object for use with Ledger construction. + Extension fees (extensionComputeLimit, extensionSizeLimit, gasPrice) + are intentionally NOT set here. They start at 0 and are activated + through fee voting on the first flag ledger, or via the genesis + ledger SLE when featureSmartEscrow is in the initial amendments. */ Fees toFees() const { @@ -76,9 +80,9 @@ struct FeeSetup f.base = reference_fee; f.reserve = account_reserve; f.increment = owner_reserve; - f.extensionComputeLimit = extension_compute_limit; - f.extensionSizeLimit = extension_size_limit; - f.gasPrice = gas_price; + f.extensionComputeLimit = 0; + f.extensionSizeLimit = 0; + f.gasPrice = 0; return f; } }; diff --git a/src/xrpld/rpc/handlers/ContractInfo.cpp b/src/xrpld/rpc/handlers/ContractInfo.cpp index b07fa60d997..9cb3f4efb04 100644 --- a/src/xrpld/rpc/handlers/ContractInfo.cpp +++ b/src/xrpld/rpc/handlers/ContractInfo.cpp @@ -66,7 +66,7 @@ doContractInfo(RPC::JsonContext& context) RPC::inject_error(rpcACT_MALFORMED, result); return result; } - auto const caID{std::move(caid.value())}; + auto const caID{caid.value()}; auto const caSle = ledger->read(keylet::account(caID)); if (!caSle) { diff --git a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp index e9b77c0c313..85b0fb27109 100644 --- a/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp +++ b/src/xrpld/rpc/handlers/ledger/LedgerEntry.cpp @@ -883,7 +883,7 @@ struct LedgerEntry Json::Value doLedgerEntry(RPC::JsonContext& context) { - static LedgerEntry ledgerEntryParsers[] = { + static LedgerEntry const ledgerEntryParsers[] = { #pragma push_macro("LEDGER_ENTRY") #undef LEDGER_ENTRY From e6eb6ccf6c35b532287444ded98aec9ec152d8f4 Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Sun, 12 Apr 2026 00:38:52 +0200 Subject: [PATCH 211/212] fix merge error --- src/libxrpl/protocol/STData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libxrpl/protocol/STData.cpp b/src/libxrpl/protocol/STData.cpp index e091626ac4d..1d5360ec1a6 100644 --- a/src/libxrpl/protocol/STData.cpp +++ b/src/libxrpl/protocol/STData.cpp @@ -453,7 +453,7 @@ STData::getJson(JsonOptions options) const STBase* STData::makeFieldPresent() { - STBase const* f = &data_.get(); // getPIndex(index); + STBase* f = &data_.get(); // getPIndex(index); if (f->getSType() != STI_NOTPRESENT) return f; From d4114487396157534fbc8dbc0ebffe0b9fec2586 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Thu, 23 Apr 2026 17:32:52 -0400 Subject: [PATCH 212/212] remove unused fields --- include/xrpl/protocol/detail/transactions.macro | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/xrpl/protocol/detail/transactions.macro b/include/xrpl/protocol/detail/transactions.macro index 8b715b05846..e31a3aeda95 100644 --- a/include/xrpl/protocol/detail/transactions.macro +++ b/include/xrpl/protocol/detail/transactions.macro @@ -1236,8 +1236,6 @@ TRANSACTION(ttCONTRACT_USER_DELETE, 89, ContractUserDelete, Emittance::notEmitable, ({ {sfContractAccount, soeREQUIRED}, - {sfFunctionName, soeREQUIRED}, - {sfParameters, soeOPTIONAL}, {sfComputationAllowance, soeREQUIRED}, }))